SSL探索03

本文探索Openssl的Engine机制.Openssl硬件引擎(Engine)能够使用户比较容易地将自己的硬件加入到openssl中去,替换其提供的软件算法.

ENGINE 是 OPENSSL 预留的用以加载第三方加密库引擎,主要包括了动态库加载的代码和加密函数指针管理的一系列接口.如果要使用 Engine(假设你已经加载上
该 Engine 了 ) , 那 么 首 先 要 加 载 该Engine(比如 ENGINE_load_XXXX),然后选择要使用的算法或者使用支持的所有加密算法。这样你的应用程序在调用加解密算法时,它就会指向你加载的动态库里的加解密算法,而不是原先的
OPENSSL的 库里的加解密算法.

使用Engine的基本流程:

①//Engine_load_xxxx();

初始化Engine对象,对engine的属性及方法进行设置(自己实现的算法),将engine加载到系统中,

②//e =Engine_by_id("ID_ali");

获取engine

③选择使用哪些算法

ENGINE_set_default(ENGINE *e, int Flag)

其中 Flag 的说明如下:

ENGINE_METHOD_ALL 使用所有存在的算法(默认)

ENGINE_METHOD_RSA 仅使用 RSA 算法

ENGINE_METHOD_DSA 仅使用 DSA 算法

ENGINE_METHOD_DH 仅使用 DH 算法

ENGINE_METHOD_RAND 仅使用随机数算法

ENGINE_METHOD_CIPHERS 仅使用对称加解密算法

ENGINE_METHOD_DIGESTS 仅使用摘要算法

④//以对称加密为例,将engine传入方法即可.

EVP_EncryptInit_ex(ctx,ciper,e,key,iv);

这样便使用engine中的算法替换掉了SSL的自带算法.

说明:

a.ENGINE_load_hwcipher();这个方法进行Engine的初始化.

void ENGINE_load_hwcipher() {
	ENGINE *e_hw = engine_hwcipher();
	if (!e_hw)
		return;
	ENGINE_add(e_hw);
	ENGINE_free(e_hw);
	ERR_clear_error();
}

其中又调用engine_hwcipher()

static ENGINE *engine_hwcipher(void) {
	ENGINE *ret = ENGINE_new();
	if (!ret)
		return NULL;
	if (!bind_helper(ret)) {
		ENGINE_free(ret);
		return NULL;
	}
	return ret;
}

engine_hwcipher()中调用bind_helper(ENGINE *e);来看看bind_helper(ENGINE *e)的实现

static int bind_helper(ENGINE *e) {
	int ret;

	ret = ENGINE_set_id(e, engine_hw_id);
	if (ret != 1) {
		printf("ENGINE_set_id failed\n");
		return 0;
	}
	ret = ENGINE_set_name(e, engine_hw_name);
	if (ret != 1) {
		printf("ENGINE_set_name failed\n");
		return 0;
	}
	ret = ENGINE_set_RSA(e, &hw_rsa);
	if (ret != 1) {
		printf("ENGINE_set_RSA failed\n");
		return 0;
	}
	ret = ENGINE_set_RAND(e, &hw_rand);
	if (ret != 1) {
		printf("ENGINE_set_RAND failed\n");
		return 0;
	}
	ret = ENGINE_set_destroy_function(e, hw_destroy);
	if (ret != 1) {
		printf("ENGINE_set_destroy_function failed\n");
		return 0;
	}
	ret = ENGINE_set_init_function(e, hw_init);
	if (ret != 1) {
		printf("ENGINE_set_init_function failed\n");
		return 0;
	}
	ret = ENGINE_set_finish_function(e, hw_finish);
	if (ret != 1) {
		printf("ENGINE_set_finish_function failed\n");
		return 0;
	}
	ret = ENGINE_set_ctrl_function(e, hw_ctrl);
	if (ret != 1) {
		printf("ENGINE_set_ctrl_function failed\n");
		return 0;
	}
	ret = ENGINE_set_load_privkey_function(e, hw_load_privkey);
	if (ret != 1) {
		printf("ENGINE_set_load_privkey_function failed\n");
		return 0;
	}
	ret = ENGINE_set_load_pubkey_function(e, hw_load_pubkey);
	if (ret != 1) {
		printf("ENGINE_set_load_pubkey_function failed\n");
		return 0;
	}
	ret = ENGINE_set_cmd_defns(e, hw_cmd_defns);
	if (ret != 1) {
		printf("ENGINE_set_cmd_defns failed\n");
		return 0;
	}
	ret = ENGINE_set_ciphers(e, hw_ciphers);
	if (ret != 1) {
		printf("ENGINE_set_ciphers failed\n");
		return 0;
	}
	ret = ENGINE_set_digests(e, hw_md);
	if (ret != 1) {
		printf("ENGINE_set_digests failed\n");
		return 0;
	}
	return 1;
}

bind_helper(ENGINE *e)方法中对engine结构体中的属性及方法进行设置,自己实现各种加解密算法.

b.至此,engine的初始化工作完成,然后 e = ENGINE_by_id("ID_hw");获取自己需要的engine.

c.选择要使用的算法.ENGINE_set_default(ENGINE *e, int Flag)

c.将engine传入加解密调用函数即可. EVP_EncryptInit_ex(&ciph_ctx, cipher, e, key, iv);

这样便实现了使用自定义算法替换openssl中默认算法.详细的代码可参考OpenSSL 源代码中的 Demos/Engines

时间: 2024-08-26 20:55:12

SSL探索03的相关文章

SSL探索02

这篇文章探索TLS -ticket 的重用机制. 完整的SSL握手过程为: Client Server ClientHello (empty SessionTicket extension)--------> ServerHello (empty SessionTicket extension) Certificate* ServerKeyExchange* CertificateRequest* <-------- ServerHelloDone Certificate* ClientKey

SSL探03

本文探讨了Openssl的Engine机械.Openssl硬件引擎(Engine)可以使用户比較easy地将自己的硬件增加到openssl中去,替换其提供的软件算法. ENGINE 是 OPENSSL 预留的用以载入第三方加密库引擎,主要包含了动态库载入的代码和加密函数指针管理的一系列接口.如果要使用 Engine(如果你已经载入上 该 Engine 了 ) , 那 么 首 先 要 加 载 该Engine(比方 ENGINE_load_XXXX),然后选择要使用的算法或者使用支持的全部加密算法.

SSL探索01

1. OPENSSL简介 OpenSSL项目是一个协作开发一个健壮的,商业级的,全功能的,并且开放源代码工具包,它实现了安全套接字层(SSL v2/v3)和传输层安全(TLS v1)协议以及全强大的通用加密库. 2.使用SSL进行安全IO 使用SSL进行安全IO与原本的socketIO通信区别不大,只是增加了SSL部分内容. 下面说明SSL IO的基本过程: 客户端流程 ① // SSL初始化 ②//socket,connect, ③//ssl,建立SSL连接,SSL_connect(ssl)

再续服务器被肉鸡的经历-- struts2漏洞

[[email protected] ~]# cat myout.file  YAM - Yet Another Miner by yvg1900 yam M7v-linux64-core2/yvg1900 ********************************************************************************************************** * Supported coins: PTS MMC MAX GRS DMD 

服务器性能调优

转:http://blog.csdn.net/wj_j2ee/article/details/7987483 一 绪论 Linux性能监控之绪论篇性能调优的目的是找到系统的瓶颈,并且调节系统来设法消除这些瓶颈.我们在监控性能的时候重点在于监视一下子系统:1.CPU2.Memory3.IO4.Network 但这些系统都是彼此依赖,不能单独只看其中一个.当一个系统负载过重时往往会引起其它子系统的问题,比如说:->大量的读入内存的IO请求(page-in IO)会用完内存队列;->大量的网络流量会

Linux性能监控之Memory篇

首先说说虚拟内存和物理内存: 虚拟内存就是采用硬盘来对物理内存进行扩展,将暂时不用的内存页写到硬盘上而腾出更多的物理内存让有需要的进程来用.当这些内存页需要用的时候在从硬盘读回内存.这一切对于用户来说是透明的.通常在Linux系统说,虚拟内存就是swap分区.在X86系统上虚拟内存被分为大小为4K的页. 每一个进程启动时都会向系统申请虚拟内存(VSZ),内核同意或者拒就请求.当程序真正用到内存时,系统就它映射到物理内存.RSS表示程序所占的物理内存的大小.用ps命令我们可以看到进程占用的VSZ和

Linux centos6.5 下编译安装mysql

安装环境 系统:centos6.5_86X64 Mysql: mysql-5.6.16.tar.gz 注意:mysql-5.6.16安装和5.5.5.1不同,编译不再使用./configure来进行,而是使用cmake来编译. 1.新建存放数据的目录 [[email protected] beauty]# mkdir -p /data/mydata 2.新建用户 [[email protected] beauty]# groupadd -r mysql     #新建mysql组 [[email

进程间通信第一课--管道

一个进程连接数据流到另一个进程--管道--pipe 进程管道 1 #include <stdio.h> 2 FILE * popen(const char * command, const char * open_mode) 3 int pclose(FILE * stream_to_close); popen函数允许一个程序将另一个程序作为新进程来启动并可以传递数据给它或者通过它接收数据command是要运行的程序名和相应的参数open_mode必须是r或者是wr的情况是:被调用程序的输出可

安装Jenkins服务

1.下载Jenkins 下载地址:https://jenkins.io/download/ 选择rpm包 2.启动服务 [[email protected] ~]# rpm -ivh jenkins-2.138.3-1.1.noarch.rpm [[email protected] ~]# systemctl enable jenkinsjenkins.service is not a native service, redirecting to /sbin/chkconfig.Executin