2012-01-07 105 views
3

我怎样才能在Arduino上HMAC一个字节数组?我发现SHA1 HMAC的this library,但它似乎只用于字符串。SHA1 HMAC一个字节数组与Arduino

我已经将它传递给以空字节结尾的字节数组中的字节。这确实给了我正确的结果。但对于包含零的字节数组并不适用!

uint8_t hmacKey1[]={ 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x21, 0xde, 0xad, 0xbe, 0xef }; 
uint8_t time[]={ 0xb2, 0x00 }; 

Sha1.initHmac(hmacKey1, 10); 
Sha1.print((char*)time); 

要么我需要找到另一个另一个库(crypto-arduino-library看起来很有希望,但不包括我在做什么任何的例子),或劈了Cathedrow库做什么我之后。

有没有人知道另一种方式?

+0

我IRC基类“Print”提供了这样的方法。否则只是使用循环和'打印::写' – leppie 2012-01-07 08:17:50

+0

@leppie是的,循环做了我的技巧thx – russau 2012-01-07 08:56:02

+0

很高兴我可以帮助:)未经编码的Arduino年龄。 – leppie 2012-01-07 09:18:22

回答

3

加入我自己的方法似乎做的伎俩:

void Sha1Class::writebytes(const uint8_t* data, int length) { 
for (int i=0; i<length; i++) 
{ 
    write(data[i]); 
} 
} 
1

如果你不想改变sha1.cpp你可以循环,并打印每个单字节,关键是要使用Sha1.print((char) basestring[i]);,像这样:

#include <avr/pgmspace.h> 
#include <sha1.h> 

char key[] = "testKey"; 
uint8_t basestring[] = { 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67 }; // testing 

void printHash(uint8_t* hash) { 
    for (int i=0; i<20; i++) { 
    Serial.print("abcdef"[hash[i]>>4]); 
    Serial.print("abcdef"[hash[i]&0xf]); 
    } 
    Serial.println(); 
} 

void setup() { 
    Serial.begin(115200); 

    Serial.print("Input:    "); 
    for (int i=0; i<sizeof(basestring); i++) { 
    Serial.print((char) basestring[i]); 
    } 
    Serial.println(); 

    Serial.print("Key:    "); 
    Serial.println(key); 

    Serial.print("Hmac-sha1 (hex): "); 
    Sha1.initHmac((uint8_t*)key, strlen(key)); 

    for (int i=0; i<sizeof(basestring); i++) { 
    Sha1.print((char) basestring[i]); 
    } 

    uint8_t *hash; 
    hash = Sha1.resultHmac(); 
    printHash(hash); 

} 

void loop() { } 

输出

Input:    testing 
Key:    testKey 
Hmac-sha1 (hex): 60d41271d43b875b791e2d54c34bf3f018a29763