openssl使用错误"error: storage size of 'ctx' isn't known"

扶醉桌前 提交于 2020-01-10 07:06:22

前言

SSL是Secure Sockets Layer(安全套接层协议)的缩写,openssl是一套开源的库,以便使用者进行安全通信,避免窃听,识别身份。
其中,ssl的HMAC是计算MAC的一种方法,有密钥参与计算,不采用HASH算法,对数据做hash计算,并用密钥加密,计算出MAC数值。

测试

源码请看传送门:https://github.com/openssl/openssl
把openssl编译成动态库libssl.so后以便工程引用。
部分代码片段如下:

HMAC_CTX ctx;
H_Mac mac;

mac.accessKey = ACCESS_KEY;
mac.secretKey = SECRET_KEY;

HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, mac.secretKey, strlen(mac.secretKey), EVP_sha1(), NULL);
HMAC_Update(&ctx, path, strlen(path));
HMAC_Update(&ctx, "\n", 1);

if (addlen > 0) {
	HMAC_Update(&ctx, addition, addlen);
} 

HMAC_Final(&ctx, digest, &dgtlen);
HMAC_CTX_cleanup(&ctx);

编译:
在这里插入图片描述
编译后出现错误:“error: storage size of ‘ctx’ isn’t known”,“implicit declaration of function ‘HMAC_CTX_init’”,看字面意思是类型不完整的不识别的意思。打开openssl/hmac.h,明明是有H_MAC类型的定义,所以用source Insight进行源码通篇搜索,发现使用时HMAC_CTX *ctx;,且没有HMAC_CTX_init函数了。到此很明显了,openssl函数由于版本不同的问题,已经修改了函数定义。
修改代码如下:

HMAC_CTX *ctx;

mac.accessKey = QINIU_ACCESS_KEY;
mac.secretKey = QINIU_SECRET_KEY;

/* Append HMAC to data */
ctx = HMAC_CTX_new();

HMAC_Init_ex(ctx, mac.secretKey, strlen(mac.secretKey), EVP_sha1(), NULL);
HMAC_Update(ctx, path, strlen(path));
HMAC_Update(ctx, "\n", 1);
HMAC_Update(ctx, addition, addlen);

HMAC_Final(ctx, digest, &dgtlen);
HMAC_CTX_free(ctx);

预料之中,编译成功,可以愉快的使用了。其中,替换如下:
HMAC_CTX ctx -> HMAC_CTX *ctx,
HMAC_CTX_init(&ctx) -> HMAC_CTX_new(),
HMAC_CTX_cleanup(&ctx) -> HMAC_CTX_free(ctx)

OK, openssl简单介绍到此结束,喜欢的朋友可以点个赞~

作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!