TAY
Fork of Crypto_light by
hash/HMAC.cpp@10:bc9c23aa3870, 2013-09-24 (annotated)
- Committer:
- feb11
- Date:
- Tue Sep 24 07:19:04 2013 +0000
- Revision:
- 10:bc9c23aa3870
- Child:
- 11:96d87a5394ee
implemented HMAC
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
feb11 | 10:bc9c23aa3870 | 1 | #include "HMAC.h" |
feb11 | 10:bc9c23aa3870 | 2 | #include <string.h> |
feb11 | 10:bc9c23aa3870 | 3 | |
feb11 | 10:bc9c23aa3870 | 4 | HMAC::HMAC(HashAlgorithm *hashAlgo, uint8_t *k, uint32_t kl): |
feb11 | 10:bc9c23aa3870 | 5 | algo(hashAlgo), |
feb11 | 10:bc9c23aa3870 | 6 | keyLength(kl) |
feb11 | 10:bc9c23aa3870 | 7 | { |
feb11 | 10:bc9c23aa3870 | 8 | memcpy(key, k, keyLength); |
feb11 | 10:bc9c23aa3870 | 9 | uint8_t buffer[64]; |
feb11 | 10:bc9c23aa3870 | 10 | memcpy(buffer, key, keyLength); |
feb11 | 10:bc9c23aa3870 | 11 | memset(&buffer[keyLength], 0, 64-keyLength); |
feb11 | 10:bc9c23aa3870 | 12 | |
feb11 | 10:bc9c23aa3870 | 13 | for(int i = 0; i < 64; ++i) |
feb11 | 10:bc9c23aa3870 | 14 | buffer[i] ^= 0x36; |
feb11 | 10:bc9c23aa3870 | 15 | |
feb11 | 10:bc9c23aa3870 | 16 | algo->update(buffer, 64); |
feb11 | 10:bc9c23aa3870 | 17 | } |
feb11 | 10:bc9c23aa3870 | 18 | |
feb11 | 10:bc9c23aa3870 | 19 | HMAC::~HMAC() |
feb11 | 10:bc9c23aa3870 | 20 | { |
feb11 | 10:bc9c23aa3870 | 21 | delete algo; |
feb11 | 10:bc9c23aa3870 | 22 | } |
feb11 | 10:bc9c23aa3870 | 23 | |
feb11 | 10:bc9c23aa3870 | 24 | void HMAC::update(uint8_t *data, uint32_t length) |
feb11 | 10:bc9c23aa3870 | 25 | { |
feb11 | 10:bc9c23aa3870 | 26 | algo->update(data, length); |
feb11 | 10:bc9c23aa3870 | 27 | } |
feb11 | 10:bc9c23aa3870 | 28 | |
feb11 | 10:bc9c23aa3870 | 29 | void HMAC::finalize(uint8_t *hash) |
feb11 | 10:bc9c23aa3870 | 30 | { |
feb11 | 10:bc9c23aa3870 | 31 | uint8_t buffer[64], buffer2[64]; |
feb11 | 10:bc9c23aa3870 | 32 | algo->finalize(buffer); |
feb11 | 10:bc9c23aa3870 | 33 | |
feb11 | 10:bc9c23aa3870 | 34 | memcpy(buffer2, key, keyLength); |
feb11 | 10:bc9c23aa3870 | 35 | memset(&buffer2[keyLength], 0, keyLength); |
feb11 | 10:bc9c23aa3870 | 36 | for(int i = 0; i < 64; ++i) |
feb11 | 10:bc9c23aa3870 | 37 | buffer2[i] ^= 0x5C; |
feb11 | 10:bc9c23aa3870 | 38 | |
feb11 | 10:bc9c23aa3870 | 39 | algo->update(buffer2, 64); |
feb11 | 10:bc9c23aa3870 | 40 | algo->update(buffer, algo->outputSize()); |
feb11 | 10:bc9c23aa3870 | 41 | algo->finalize(hash); |
feb11 | 10:bc9c23aa3870 | 42 | } |
feb11 | 10:bc9c23aa3870 | 43 |