由于我刚刚使用IETF RFC 4634的功能创建了这个原始测试,我不确定我是否已经正确使用它们用于HMAC-SHA-384-192,所以我'我将在这里开始使用该代码:
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "sha.h"
int main(int argc, char *argv[]) {
HMACContext hmac;
const unsigned char *keyarr = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
int err = hmacReset(&hmac, SHA384, keyarr, 48);
if (err != shaSuccess) {
printf("err 1\n");
exit(1);
}
const uint8_t testarray[65] = {'I',' ','a','m',' ','n','o','t',' ','a',' ','c','r','o','o','k','!'};
const unsigned char *prfkey = "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789";
memcpy((void *)testarray + 17, (void *)prfkey, 48);
const int testlen = 65;
err = hmacInput(&hmac, testarray, testlen);
if (err != shaSuccess) {
printf("err 2\n");
exit(1);
}
uint8_t Message_Digest[USHAMaxHashSize];
err = hmacResult(&hmac, Message_Digest);
if (err != shaSuccess) {
printf("err 3\n");
exit(1);
}
int i;
for(i = 0; i < 24; i++) printf(" %02X", Message_Digest[i]);
putchar('\n');
}
如果我到目前为止做的一切都正确(除了选择好的密钥),我通常会有一个24字节(即192位)的摘要,但如果我在追加它之前对摘要进行数字签名,我的经验是签名块不是可预测的长度。我确信我能想出任何方法来确定消息部分的结尾,但我不想让它成为一个黑客。这样做的可接受方式是什么? (签名将使用ECDSA。)
我还应该提一下,这将是一个在ESP内部使用UDP的多播消息,因为这会对消息经济性产生限制。 (这也是问题的主要原因 - 保持二进制。另一种是附加的做法,而不是在它前面添加一个字节数。)