openssl中添加新算法操作说明文档格式.docx
- 文档编号:18266643
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:17
- 大小:2.07MB
openssl中添加新算法操作说明文档格式.docx
《openssl中添加新算法操作说明文档格式.docx》由会员分享,可在线阅读,更多相关《openssl中添加新算法操作说明文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
定义SM3_CTX,这个结构其实就是对应evp封装中EVP_MD_CTX的md_data:
typedefstructSM3state_st
{
unsignedlonglongtotal_length;
unsignedcharmessage_buffer[64];
size_tmessage_buffer_position;
size_tV_i[8];
size_tV_i_1[8];
size_tT_j[64];
}SM3_CTX;
声明函数,包括init、update、final,这几个函数会在封装的时候被内部调用,当然在dll中导出了也可以外部调用:
intSM3_Init(SM3_CTX*c);
intSM3_Update(SM3_CTX*c,constvoid*data,size_tlen);
intSM3_Final(unsignedchar*md,SM3_CTX*c);
unsignedchar*SM3(unsignedchar*d,size_tn,unsignedchar*md);
新建文件sm3_locl.h
这个头文件中包含一些要用到的宏定义。
主要定义了本算法实现中需要用到的内部函数,不能被导出到dll中供外部调用。
宏定义:
#ifndefROTATE
#defineROTATE(a,n)(((a)<
<
(n))|(((a)&
0xffffffff)>
>
(32-(n))))
#endif
#defineEE(b,c,d)((b&
c)|((~b)&
d))
#defineFF(b,c,d)((((c)^(d))&
(b))^(d))
#defineGG(b,c,d)(((b)&
(c))|((b)&
(d))|((c)&
(d)))
#defineHH(b,c,d)((b)^(c)^(d))
#defineHH1(a)(a^(ROTATE(a,9))^(ROTATE(a,17)))
#defineHH2(a)(a^(ROTATE(a,15))^(ROTATE(a,23)))
内部函数:
voidinit_T_j(size_t*T_j);
voidinit_V_i(size_t*V_i);
voidCF(size_t*T_j,size_t*V_i,unsignedchar*B_i,size_t*V_i_1);
新建文件sm3_dgst.c
实现sm3.h和sm3_locl中声明的函数,除了函数SM3(将在sm3_one.c中实现)。
新建文件sm3_one.c
实现sm3.h中声明的函数SM3。
5、
新建文件sm3.c
实现对文件的摘要,如用在openssl作为命令行工具,文件名和摘要算法名作为选项参数实现使用算法对文件进行摘要。
6、
新建文件sm3test.c
算法的test文件。
7、
新建文件】Makefile
编译的Makefile文件。
里面描述在编译的时候以上的几个文件的角色、编译过程、依赖关系等。
3.3.EVP封装相关代码
涉及到的文件4个:
1、手动修改evp.h
evp在openssl里面的主要做的是封装的事情,因此首先在evp.h头文件中添加新算法sm3:
#ifndefOPENSSL_NO_SM3
constEVP_MD*EVP_sm3(void);
说明:
EVP_sm3()函数将返回返回一个sm3的EVP_MD的结构,这个结构以及EVP_sm3()函数都在m_sm3.c中定义。
2、新建文件m_sm3.c
这是放在EVP目录中关于新算法的一个重要文件,定义
sm3
的EVP_MD结构,EVP_MD结构原型在evp.h中:
sm3的EVP_MD结构:
staticconstEVP_MDsm3_md=
NID_sm3,//这个需要定义了OID之后生成,这个步骤在第四章。
NID_sm3WithRSAEncryption,//这个地方sm3WithRSA只做示例
SM3_DIGEST_LENGTH,//SM3的摘要长度,在sm3.h中定义
0,//flag
init,//结构中的init函数,指向自己声明在sm3.h中的SM3_Init
update,//同上
final,//同上
NULL,
EVP_PKEY_RSA_method,//同上,只做示例
SM3_CBLOCK,//在sm3.h中声明
sizeof(EVP_MD*)+sizeof(SM3_CTX),
};
3、手动修改c_alld.c
openssl的算法封装之后使用时需要加载算法,实现SM3的添加:
#ifndefOPENSSL_NO_SM3
EVP_add_digest(EVP_sm3());
4、手动修改Makefile
将编译时候的LIBSRC、LIBOBJ中加入SM3新算法,并且添加sm3各种头文件的依赖关系。
3.4.OID生成
涉及到的文件7个:
手动修改objects.txt
添加sm3的OID,特别说明:
此处仅作示例,sm3的实际OID是:
rsadsi212:
SM3:
sm3
添加sm3WithRSAEncryption,这个是对应PKCS1的,只是为了让sm3的EVP_MD结构有值填充,实际添加sm3的本意不用于RSA,这里仅作示例。
pkcs115:
RSA-SM3:
sm3WithRSAEncryption
执行命令自动更新obj_mac.h和obj_mac.num
打开cmd,切换到目录下源码的\crypto\objects\所在的目录下,
执行命令:
perlobjects.plobjects.txtobj_mac.numobj_mac.h
obj_mac.h和obj_mac.num这两个文件都会因为objects.txt的修改而更新。
增加的内容如:
手动修改objects.h
将obj_mac.h中新增的内容同步到objects.h中。
(其实这一步不做也没有影响,因为之后不用这个文件来生成obj_dat.h。
objects.h的内容没有obj_mac.h的内容全面,千万不能用objects.h来obj_dat.h,一定要用obj_mac.h来生成才是正确的。
切记,血的教训!
)
执行命令自动更新obj_dat.h
perlobj_dat.plobj_mac.hobj_dat.h
将会自动更新obj_dat.h这个文件,新增的内容如下:
注意看图上最后两排
Line4672:
921,/*OBJ_sm312840113549212*/
Line4843:
920,/*OBJ_sm3WithRSAEncryption128401135491115*/
最后带的一串数字本来是算法的OID,因为上面第2步的objects.txt中是乱填的,所以这个不是真实的OID。
仅作示例。
手动修改
obj_xref.txt
添加:
sm3WithRSAEncryptionsm3rsaEncryption
执行命令自动更新
obj_xref.h
perlobjxref.plobj_xref.txtobj_xref.h
obj_xref.h更新后的添加的内容如:
3.5.make相关设置
涉及到的文件\util\下面5个:
手动修改mkfiles.pl
"
crypto/sm3"
添加上包含sm3的算法源码的目录,这个目录中包含sm3的Makefile文件。
之后就会按照Makefile进行编译。
手动修改mkdef.pl
添加内容如图:
加上新算法的头文件等,可以在dll中导出算法函数。
执行命令自动更新libeay.num
perlutil/mkdef.plcryptoupdate
Libeay.num更新后增加的内容如:
手动修改mk1mf.pl
添加内容如:
手动修改sp-diff.pl
涉及到的文件\crypto\下面2个:
8、
手动修改crypto-
9、
手动修改install-
10、
涉及到的文件根目录\下面5个:
11、
手动修改
Makefile、Makefile.bak、Makefile.org、、INSTALL.VMS
到这里,源码需要添加和修改的就结束了,下面将介绍编译和测试。
3.6.编译
在cmd下,首先设置VC环境,执行VC目录下的vcvars32.BAT文件,如:
cmd下进入openssl源码所在的目录,依次执行命令【编32位,如果64位可能缺ml64.exe】:
1)执行命令:
perlConfigureVC-WIN32no-asm
2)
执行命令:
ms\do_ms
3)执行命令:
nmake-fms\ntdll.mak:
这个是动态库:
如果编译成功,最后的输出都在out32dll目录下:
包括可执行文件、两个dll和两个lib文件【nmake-fms\nt.mak
这是静态库的编译命令,输出在out32目录下】。
编译成功如图:
4)
nmake-fms\ntdll.maktest
5)执行命令:
nmake-fms\ntdll.makinstall
七、测试
API编程测试,在vs建工程,将openssl目录下生成的out32dll文件夹下的libeay32.dll和libeay32.lib到工程。
设置工程的附加库和附加包含目录:
右键工程->
属性->
C/C++->
常规->
附加包含目录
链接器->
附加库目录
sm3test.c源码如:
sm3test.c
#include<
stdio.h>
openssl/evp.h>
openssl/sm3.h>
#pragmacomment(lib,"
libeay32.lib"
staticsize_thash[8]={0};
voidout_hex(size_t*list1)
{
size_ti=0;
for(i=0;
i<
8;
i++)
printf("
%08x"
list1[i]);
}
\r\n"
);
}
main(intargc,char*argv[])
EVP_MD_CTXmdctx;
constEVP_MD*md;
charmess1[]="
abc"
;
charmess2[]="
unsignedcharmd_value[EVP_MAX_MD_SIZE];
intmd_len,i;
//使EVP_Digest系列函数支持所有有效的信息摘要算法
OpenSSL_add_all_digests();
argv[1]="
sm3"
if(!
argv[1]){
Usage:
mdtestdigestname\n"
exit
(1);
//根据输入的信息摘要函数的名字得到相应的EVP_MD算法结构
md=EVP_get_digestbyname(argv[1]);
//md=EVP_sm3();
md){
Unknownmessagedigest%s\n"
argv[1]);
//初始化信息摘要结构mdctx,这在调用EVP_DigestInit_ex函数的时候是必须的。
EVP_MD_CTX_init(&
mdctx);
//使用md的算法结构设置mdctx结构,impl为NULL,即使用缺省实现的算法(openssl本身提供的信息摘要算法)
EVP_DigestInit_ex(&
mdctx,md,NULL);
//开始真正进行信息摘要运算,可以多次调用该函数,处理更多的数据,这里只调用了两次
EVP_DigestUpdate(&
mdctx,mess1,strlen(mess1));
//EVP_DigestUpdate(&
mdctx,mess2,strlen(mess2));
//完成信息摘要计算过程,将完成的摘要信息存储在md_value里面,长度信息存储在md_len里面
EVP_DigestFinal_ex(&
mdctx,md_value,&
md_len);
//使用该函数释放mdctx占用的资源,如果使用_ex系列函数,这是必须调用的。
EVP_MD_CTX_cleanup(&
Digestis:
"
for(i=0;
md_len;
i++)printf("
%02x"
md_value[i]);
\n"
//SM3("
3,hash);
//out_hex(hash);
system("
pause"
intmain1(intargc,char*argv[])
SM3_CTX*c=(SM3_CTX*)malloc(sizeof(SM3_CTX));
SM3_Init(c);
//SM3_Final_dword(hash,c);
SM3_Update(c,"
3);
SM3_Final(hash,c);
out_hex(hash);
//66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"
64);
/*for(i=0;
i<
16;
i++){
abcd"
4);
}*/
SM3_Final(hash,c);
//debe9ff92275b8a138604889c18e5a4d6fdb70e5387e5765293dcba39c0c5732
//SM3("
//out_hex(hash);
return0;
sm3test.c运行使用sm3算法对“abc”进行摘要后的结果如图:
和国密标准的附录示例一致:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- openssl 添加 算法 操作 说明