openssl engine demo(2)

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值