openssl engine demo (2)
废话不多说直接上代码
1、这是通过静态加载的方式调用引擎
2、首先定义引擎id和name
3、然后定义引擎的方法通过bind_helper绑定函数绑定方法
4、实现引擎加载函数load
示例c代码
#include <openssl/engine.h>
#include <stdio.h>
#include <string.h>
//创建引擎id 和 name
static const char *engine_id = "test";
static const char *engine_name = "engine test buy lcs";
/* 动态加载用这个宏 编译成库 调用ENGINE_load_dynamic();
手动加载必须实现加载函数ENGINE_load_my*/
// IMPLEMENT_DYNAMIC_CHECK_FN();
// IMPLEMENT_DYNAMIC_BIND_FN(bind_helper);
static int myengine_init(ENGINE *e) {
printf("test Engine Initializatzion!\n");
return 1;
}
static int myengine_finish(ENGINE *e)
{
printf("test engine finish\n");
return 1;
}
static int myengine_destory(ENGINE *e)
{
printf("test engine destory\n");
return 1;
}
int bind_helper(ENGINE * e, const char *id)
{
/*给引擎添加方法*/
if (!ENGINE_set_id(e, engine_id) ||
!ENGINE_set_name(e, engine_name) ||
!ENGINE_set_init_function(e,myengine_init) ||
!ENGINE_set_finish_function(e,myengine_finish) ||
!ENGINE_set_destroy_function(e,myengine_destory)
)
return 0;
printf("ERR_load_rsa success\n");
return 1;
}
static ENGINE *engine_my(void)
{
ENGINE *ret = ENGINE_new();
if(!ret)
return NULL;
if(!bind_helper(ret, engine_id))
{
ENGINE_free(ret);
return NULL;
}
return ret;
}
void ENGINE_load_my(void)
{
ENGINE *rsa_st = engine_my();
if(!rsa_st)
return;
ENGINE_add(rsa_st);
ENGINE_free(rsa_st);
ERR_clear_error();
}
int main(int argc, const char* argv[] ) {
//初始化openssl 算法库
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
//手动添加引擎
ENGINE_load_my();
ENGINE *test_engine = ENGINE_by_id("test");
if( test_engine == NULL )
{
printf("Could not Load test Engine!\n");
exit(1);
}
printf("Oezgan Engine successfully loaded\n");
int init_res = ENGINE_init(test_engine); //调用引擎方法 init
printf("Engine name: %s init result : %d \n",ENGINE_get_name(test_engine), init_res);
init_res = ENGINE_finish(test_engine); //调用引擎方法 finish
/*引擎的销毁方法调用是free 而不是ENGINE_destroy*/
init_res = ENGINE_free(test_engine); //调用引擎方法
return 0;
}
编译
gcc test1.c -lcrypto -lssl -ldl -g -o engINE
执行结果
ERR_load_rsa success
test Engine successfully loaded
test Engine Initializatzion!
Engine name: engine test buy lcs init result : 1
test engine finish
test engine destory