openssl引擎分為兩類:
openssl定義好的主介面
implement_dynamic_bind_fn
(bind_func)
implement_dynamic_check_fn
()
只需自定義bind
函式即可,而bind
函式的定義如下所示:
static int
bind
(engine *e)
可以發現其中最為重要的是cipher_func
函式,其定義如下所示:
static
intcipher_func
(engine *e,
const evp_cipher *
*cipher,
const
int*
*nids,
int nid)
其中,evp_cipher
的定義如下圖所示,do_cipher
函式是演算法過程的真正實現過程。
測試方法:
openssl enc -aes-128-ecb -nopad -in plain -out cipher -e -k 0123456789abcdeffedcba9876543210 -engine `
pwd`
/sm4.so
以sm3為例進行說明,主要是實現以下函式介面。
static
intsm3_init
(evp_md_ctx *ctx)
;static
intsm3_update
(evp_md_ctx *ctx,
const
void
*data,size_t len)
;static
intsm3_final
(evp_md_ctx *ctx,
unsigned
char
*md)
;static
const evp_md digest_sm3 =
;static
intdigests
(engine *e,
const evp_md *
*digest,
const
int*
*nids,
int nid)
switch
(nid)
}static
const
char
*engine_id =
"sm3"
;static
const
char
*engine_name =
"sm3 engine"
;static
intbind
(engine *e,
const
char
*id)if(
!engine_set_name
(e,engine_name))if
(!engine_set_digests
(e,digests)
)return1;
}implement_dynamic_bind_fn
(bind)
implement_dynamic_check_fn
()
呼叫方法
openssl dgst -sha256 -engine `
pwd`
/sm3.so msg
static rsa_method sm2_method =
;static
intsm2_destroy_func
(engine *e)
;static
intsm2_init_func
(engine *e)
;static
intsm2_finish_func
(engine *e)
;static
intsm2_ctrl_func
(engine *e,
int cmd,
long i,
void
*p,void
(*f)
(void))
;static evp_pkey *
sm2_load_privkey
(engine *e,
const
char
*key_id, ui_method *ui_method,
void
*callback_data)
;static evp_pkey *
sm2_load_pubkey
(engine *e,
const
char
*key_id,ui_method *ui_method,
void
*callback_data)
;static
const
char
*engine_sm2_id=
"sm2"
;static
const
char
*engine_sm2_name=
"sm2 engine"
;static
intbind_fn
(engine *e,
const
char
*id)if(
!engine_set_name
(e,engine_sm2_name))if
(!engine_set_rsa
(e,&sm2_method)
)/*if(!engine_set_rand(e,sm2_rand))*/if(
!engine_set_destroy_function
(e,sm2_destroy_func))if
(!engine_set_init_function
(e,sm2_init_func))if
(!engine_set_finish_function
(e,sm2_finish_func))if
(!engine_set_ctrl_function
(e,sm2_ctrl_func)
)/*if(!engine_set_load_privkey_function(e,sm2_load_privkey))*/
/* if(!engine_set_load_pubkey_function(e,sm2_load_pubkey))*/if(
!engine_set_cmd_defns
(e,sm2_cmd_defns)
)return1;
}implement_dynamic_bind_fn
(bind_fn)
implement_dynamic_check_fn
()
測試方法
openssl rsautl -decrypt -in encrypt -inkey site1.key -out plain -engine `
pwd`
/sm2.so
php 編寫mysql php mysql 編寫
表單資料插入 表單資料插入 if get act insert error reporting 0 禁止錯誤輸出 mysql query set names utf 8 con mysql connect localhost 3306 root 1234 建立資料庫連 mysql select db...
python怎樣編寫 PYTHON怎樣編寫自動化
1級2018 09 18 回答 就直接寫指令碼,給你舉給例子 編寫工具 1.設計目標 首先說一下我要工具的功能 遍歷某個目錄下包括其下子目錄中所有指定的字尾檔案,然後為這些檔案的頭部插入指定的字串。2.使用場景 設計這樣的工具起因是我最近在將之前 csdn 中的部落格搬運到自己的 hexo 部落格空...
python編寫庫存管理 python編寫商品管理
1 實現乙個商品管理的程式。輸出1,新增商品 2 刪除商品 3 檢視商品 新增商品 商品的名稱 商品如果已經存在的話,提示商品商品已經存在 商品的 x 數量只能為大於0的整數 商品的數量 數量只能為大於0的整數 2 刪除商品 輸入商品名稱 iphone 如果輸入的商品名稱不存在,要提示不存在 3 檢...