昨天晚上排查一晚上,最开始怀疑key密钥base64解密错误,我就用py解密了一边,直接把解密后的16进制数据拷进去替换计算结果,最后的结果和没替换之前是一样的,base64加密和解密应该没问题。最后的怀疑对象是hmac_sha1函数,我也从网上找了好几个版本的开源文件,替换进去,结果还是错的,我从这下载的库文件肯定是对,我不知道具体是哪一方面我没有处理,导致经过hmac_sha1计算后的结果不正确。我C语言功底比较差,没有特意系统的去学过,最后实在找不到问题了
char OTA_Authorization(char *ver, char *res, char *name,unsigned int et, char *access_key, char *authorization_buf, unsigned short authorization_buf_len)
{
size_t olen = 0;
char sign_buf[60]; //保存签名的Base64编码结果 和 URL编码结果
char hmac_sha1_buf[40]; //保存签名
char access_key_base64[33] = {0xE6,0x68,0x42,0x3B,0x39,
0x9F,0x3E,0x50,0x20,0xFA,
0x09,0xE2,0xA8,0x41,0xC6,
0xCD,0xD7,0xD3,0x7E,0xC1,
0x6D,0x37,0x71,0x7C,0xE5,
0x69,0xA8,0x2E,0x04,0xAA,
0xCC,0x24}; //保存access_key的Base64编码结合,这是py解密后的数据
char string_for_signature[60]; //保存string_for_signature,这个是加密的key
char restemp[50]; //保存string_for_signature,这个是加密的key
//----------------------------------------------------将access_key进行Base64**----------------------------------------------------
int df;
//memset(access_key_base64, 0, sizeof(access_key_base64));
//base64_decode(access_key, strlen(access_key),access_key_base64,&df );
access_key_base64[32] = '\0';
printf(access_key_base64);
printf("\n");
//----------------------------------------------------计算string_for_signature-----------------------------------------------------
memset(string_for_signature, 0, sizeof(string_for_signature));
snprintf(restemp, sizeof(restemp),"products/%s/devices/%s", res, name);//这是按照官网的格式加的,
snprintf(string_for_signature, sizeof(string_for_signature), "%d\n%s\n%s\n%s", et, METHOD,restemp, ver);
printf(string_for_signature);
printf("\n");
//前面没问题,前面这一部分打印出来看了结果是正确的
//----------------------------------------------------加密-------------------------------------------------------------------------
memset(hmac_sha1_buf, 0, sizeof(hmac_sha1_buf));
hmac_sha1((unsigned char *)access_key_base64, strlen(access_key_base64),
(unsigned char *)string_for_signature, strlen(string_for_signature),
(unsigned char *)hmac_sha1_buf);
//----------------------------------------------------将加密结果进行Base64编码------------------------------------------------------
olen = 0;
memset(sign_buf, 0, sizeof(sign_buf));
base64_encode(hmac_sha1_buf, strlen(hmac_sha1_buf),sign_buf, &df);
//后面没问题,只有中间sign_buf计算结果不对
//----------------------------------------------------将Base64编码结果进行URL编码---------------------------------------------------
OTA_UrlEncode(sign_buf);
OTA_UrlEncode(restemp);//这是按照官网的格式加的,
//----------------------------------------------------计算Token--------------------------------------------------------------------
snprintf(authorization_buf, authorization_buf_len, "version=%s&res=%s&et=%d&method=%s&sign=%s", ver, restemp, et, METHOD, sign_buf);
return 0;
}