OpenSSL引擎分为两类:
- 动态引擎,Version => 0.9.7
- 静态引擎,0.9.7 <= Version < 1.1.0
以下介绍以动态Engine为例。
1. AES引擎
Openssl定义好的主接口
IMPLEMENT_DYNAMIC_BIND_FN(bind_func)
IMPLEMENT_DYNAMIC_CHECK_FN()
只需自定义bind
函数即可,而bind
函数的定义如下所示:
Static int bind(ENGINE *e){
available(); //自定义函数,用于一些硬件实现时检查硬件是否支持,可选
ENGINE_set_id(e,id);//设置ENGINE的唯一性ID
ENGINE_set_name(e,name); //设置ENGINE可识别名字
ENGINE_set_init_function(e,init_func); //加解密算法的初始化工作,内容可为空
ENGINE_set_cipher(e,cipher_func); //加解密算法的真实实现
}
可以发现其中最为重要的是cipher_func
函数,其定义如下所示:
static int cipher_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
2. SHA引擎
以SM3为例进行说明,主要是实现以下函数接口。
static int sm3_init(EVP_MD_CTX *ctx);
static int sm3_update(EVP_MD_CTX *ctx,const void *data,size_t len);
static int sm3_final(EVP_MD_CTX *ctx,unsigned char *md);
static const EVP_MD digest_sm3 ={
NID_sha256,
0,
32,
0,
sm3_init,
sm3_update,
sm3_final,
NULL,