SSL探03
本文探讨了Openssl的Engine机械.Openssl硬件引擎(Engine)可以使用户比較easy地将自己的硬件增加到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
版权声明:本文博主原创文章。博客,未经同意不得转载。
SSL探03的更多相关文章
- POP3_使用SSL链接邮箱并获取邮件
Gmail目前已经启用了POP3和SMTP服务,与其他邮箱不同的是Gmail提供的POP3和SMTP是使用安全套接字层SSL的,因此常规的JavaMail程序是无法收发邮件的,下面是使用JavaMai ...
- Linux性能监控之Memory篇
首先说说虚拟内存和物理内存: 虚拟内存就是采用硬盘来对物理内存进行扩展,将暂时不用的内存页写到硬盘上而腾出更多的物理内存让有需要的进程来用.当这些内存页需要用的时候在从硬盘读回内存.这一切对于用户来说 ...
- Memcached 分布式缓存系统部署与调试
Memcache 分布式缓存系统部署与调试 工作机制:通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的;目前主要用来缓存数据库的数据;存放在内存的数据通过LRU算法 ...
- 安装Jenkins服务
1.下载Jenkins 下载地址:https://jenkins.io/download/ 选择rpm包 2.启动服务 [root@node1 ~]# rpm -ivh jenkins-2.138.3 ...
- Kubernetes 企业级集群部署方式
一.Kubernetes介绍与特性 1.1.kubernetes是什么 官方网站:http://www.kubernetes.io • Kubernetes是Google在2014年开源的一个容器集群 ...
- Django使用Redis进行缓存详细最全流程
背景和意义服务器数据非经常更新.若每次都从硬盘读取一次,浪费服务器资源.拖慢响应速度.而且数据更新频率较高,服务器负担比较大.若保存到数据库,还需要额外建立一张对应的表存储数据.在Django中建立表 ...
- start-stop-daemon: matching on world-writable pidfile /var/run/redis/redis-server.pid is insecurefailed
Microsoft Store上 看到最新的Ubuntu 20.04 LTS 已经适配到WSL上了, 于是卸载了老版本 18.04 LTS,安装上了最新版本的. 第一次启动会比较慢,需耐心等待 Ins ...
- 【CAS单点登录视频教程】 第03集 -- 配置 tomcat的 ssl
目录 ----------------------------------------- [CAS单点登录视频教程] 第06集[完] -- Cas认证 学习 票据认证FormsAuthenticati ...
- Wed Nov 01 13:03:16 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended.
报错:Wed Nov 01 13:03:16 CST 2017 WARN: Establishing SSL connection without server's identity verifica ...
随机推荐
- 单服务器防护linux iptables脚本
#!/bin/bashiptables -Fiptables -P INPUT DROPiptables -P OUTPUT ACCEPTiptables -P FORWARD DROP/sbin/i ...
- SQL server 2000安装时“以前的某个程序安装已在安装计算机上创建挂起”
客户使用的固定资产盘点软件使用的数据库是MSSQL 2000,在安装完成打上SP3的时候提示“以前的某个程序安装已在安装计算机上创建挂起的文件操作.运行安装程序之前必须重新启动计算机“,从客户的软件提 ...
- svnkit添加节点
package com.repositoryclient.svnoptions; import org.tmatesoft.svn.core.SVNException; import org.tmat ...
- hdu5046(重复覆盖+二分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:要在n个城市里建造不超过k个机场覆盖所有城市,问机场城市之间最大距离最小为多少. 分析:二 ...
- hdu1542(线段树——矩形面积并)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 分析:离散化+扫描线+线段树 #pragma comment(linker,"/STA ...
- [Leetcode]-ReverseLinkedList
题目:单链表取反 #include <stdlib.h> #include <stdio.h> typedef struct node *list; typedef struc ...
- hdu 2051 Bitset (java)
问题: 之前做过类似题,但这次仍然不能解决相关问题. 字符串倒过来输:StringBuffer str=new StringBuffer(s); s=str.reverse().toString() ...
- 参数化测试--sheet表的应用
自动化测试对录制和编辑好的测试步骤进行回放,这种是线性的自动化测试方式,其缺点是明显的,就是其测试覆盖面比较低.测试回放的只是录制时做出的界面操作,以及输入的测试数据,或者是脚本编辑时指定的界面操作和 ...
- Android涉及到的设计模式(转)
1.适配器模式:ListView或GridView的Adapter 简介:不同的数据提供者使用一个适配器来向一个相同的客户提供服务. 2.建造者模式:AlertDialog.Builder 简介:可以 ...
- Effective C++ Item 33 避免遮掩继承过来的名称
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie ? 不懂 c++为什么derived classes 内的名称要遮掩 base classe ...