OpenSSL Engine編寫方法

2021-10-08 05:57:00 字數 3762 閱讀 3040

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 檢...