【发布时间】:2016-02-19 11:36:00
【问题描述】:
我想使用 OpenSSL 计算 CMAC。我找到了this question,这对我有帮助。
但是我遇到了以下代码的问题:
#include <openssl/cmac.h>
void dispHex(const unsigned char *buffer, unsigned int size) {
int i=0;
for (i=0; i<size-1; i++) {
printf("%02X ", buffer[i]);
}
printf("%02x\n", buffer[i]);
}
int main() {
size_t out_len;
unsigned char res[16];
unsigned char mac_key[16] = { 0x00, 0x01 ,0x02 ,0x03, 0x04, 0x05, 0x06, 0x07,
0x00, 0x01 ,0x02 ,0x03, 0x04, 0x05, 0x06, 0x07};
unsigned char msg[16] = { 0x00, 0x01 ,0x02 ,0x03, 0x04, 0x05, 0x06, 0x07,
0x00, 0x01 ,0x02 ,0x03, 0x04, 0x05, 0x06, 0x07};
CMAC_CTX *cmac = CMAC_CTX_new();
CMAC_Init(cmac, mac_key, 16, EVP_aes_128_cbc(), NULL);
CMAC_Update(cmac, msg, sizeof(msg));
CMAC_Final(cmac, res, &out_len);
dispHex(res, sizeof(res));
return 0;
}
我用gcc -o test_cmac test_cmac_openssl.c -L C:/OpenSSL-Win32 -llibeay32 -I C:/OpenSSL-Win32/include 编译它,它生成test_cmac.exe 没有问题。
但是当我运行它 (./test_cmac.exe) 时,什么也没有发生。它只是打印一个空行并停止:
xxx@DESKTOP /cygdrive/e/
$ ./test_cmac.exe
xx@DESKTOP /cygdrive/e/
即使我在 CMAC 计算之前添加 printf("...");,它也是一样的。
奇怪的是下面的程序:
#include <openssl/hmac.h>
void dispHex(const unsigned char *buffer, unsigned int size) {
int i=0;
for (i=0; i<size-1; i++) {
printf("%02X ", buffer[i]);
}
printf("%02X\n", buffer[i]);
}
int main() {
size_t out_len;
unsigned char res[32];
unsigned char mac_key[16] = { 0x00, 0x01 ,0x02 ,0x03, 0x04, 0x05, 0x06, 0x07,
0x00, 0x01 ,0x02 ,0x03, 0x04, 0x05, 0x06, 0x07};
unsigned char msg[16] = { 0x00, 0x01 ,0x02 ,0x03, 0x04, 0x05, 0x06, 0x07,
0x00, 0x01 ,0x02 ,0x03, 0x04, 0x05, 0x06, 0x07};
HMAC_CTX hmac;
HMAC_CTX_init(&hmac);
HMAC_Init_ex(&hmac, mac_key, 16, EVP_sha256(), NULL);
HMAC_Update(&hmac, msg, sizeof(msg));
HMAC_Final(&hmac, res, &out_len);
dispHex(res, sizeof(res));
return 0;
}
运行正常:在gcc -o test_hmac test_hmac_openssl.c -L C:/OpenSSL-Win32 -llibeay32 -I C:/OpenSSL-Win32/include 和./test_hmac.exe 之后我得到:
xxx@DESKTOP /cygdrive/e/
$ ./test_hmac.exe
...9A 21 F8 2D 60 84 6C 09 08 98 A5 1F 23 8C C8 8F C4 A9 0C C4 49 45 DA 10 B9 39 C0 93 C3 10 60 BE
xxx@DESKTOP /cygdrive/e/
所以我有点困惑……为什么它适用于 HMAC 原语而不适用于 CMAC 原语?有人遇到过这种问题吗?
我正在使用 OpenSSL 32 位版本:openssl version 返回 OpenSSL 1.0.2e 3 Dec 2015。
我还检查了C:\OpenSSL-Win32\ 是否在 PATH 环境变量中声明。
【问题讨论】:
-
您也在混合/匹配编译器。 Shining Light 的Win32 OpenSSL 使用Microsoft 的编译器,而您使用的是GCC。你不应该那样做。我很惊讶 HMAC 为您工作。
-
第一个程序如何“编译没有问题”?它调用了
printf(),这需要stdio.h头文件并且该文件不是#include'd。
标签: c debugging openssl cryptography cygwin