Add HMAC-SHA256
This commit is contained in:
parent
36fa4a78ac
commit
a8f5087e53
@ -205,11 +205,13 @@ crypto_libbitcoin_crypto_a_SOURCES = \
|
|||||||
crypto/sha1.cpp \
|
crypto/sha1.cpp \
|
||||||
crypto/sha256.cpp \
|
crypto/sha256.cpp \
|
||||||
crypto/sha512.cpp \
|
crypto/sha512.cpp \
|
||||||
|
crypto/hmac_sha256.cpp \
|
||||||
crypto/hmac_sha512.cpp \
|
crypto/hmac_sha512.cpp \
|
||||||
crypto/ripemd160.cpp \
|
crypto/ripemd160.cpp \
|
||||||
crypto/common.h \
|
crypto/common.h \
|
||||||
crypto/sha256.h \
|
crypto/sha256.h \
|
||||||
crypto/sha512.h \
|
crypto/sha512.h \
|
||||||
|
crypto/hmac_sha256.h \
|
||||||
crypto/hmac_sha512.h \
|
crypto/hmac_sha512.h \
|
||||||
crypto/sha1.h \
|
crypto/sha1.h \
|
||||||
crypto/ripemd160.h
|
crypto/ripemd160.h
|
||||||
|
34
src/crypto/hmac_sha256.cpp
Normal file
34
src/crypto/hmac_sha256.cpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
// Copyright (c) 2014 The Bitcoin developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#include "crypto/hmac_sha256.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
CHMAC_SHA256::CHMAC_SHA256(const unsigned char* key, size_t keylen)
|
||||||
|
{
|
||||||
|
unsigned char rkey[64];
|
||||||
|
if (keylen <= 64) {
|
||||||
|
memcpy(rkey, key, keylen);
|
||||||
|
memset(rkey + keylen, 0, 64 - keylen);
|
||||||
|
} else {
|
||||||
|
CSHA256().Write(key, keylen).Finalize(rkey);
|
||||||
|
memset(rkey + 32, 0, 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int n = 0; n < 64; n++)
|
||||||
|
rkey[n] ^= 0x5c;
|
||||||
|
outer.Write(rkey, 64);
|
||||||
|
|
||||||
|
for (int n = 0; n < 64; n++)
|
||||||
|
rkey[n] ^= 0x5c ^ 0x36;
|
||||||
|
inner.Write(rkey, 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHMAC_SHA256::Finalize(unsigned char hash[OUTPUT_SIZE])
|
||||||
|
{
|
||||||
|
unsigned char temp[32];
|
||||||
|
inner.Finalize(temp);
|
||||||
|
outer.Write(temp, 32).Finalize(hash);
|
||||||
|
}
|
32
src/crypto/hmac_sha256.h
Normal file
32
src/crypto/hmac_sha256.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Copyright (c) 2014 The Bitcoin developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#ifndef BITCOIN_HMAC_SHA256_H
|
||||||
|
#define BITCOIN_HMAC_SHA256_H
|
||||||
|
|
||||||
|
#include "crypto/sha256.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/** A hasher class for HMAC-SHA-512. */
|
||||||
|
class CHMAC_SHA256
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
CSHA256 outer;
|
||||||
|
CSHA256 inner;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static const size_t OUTPUT_SIZE = 32;
|
||||||
|
|
||||||
|
CHMAC_SHA256(const unsigned char* key, size_t keylen);
|
||||||
|
CHMAC_SHA256& Write(const unsigned char* data, size_t len)
|
||||||
|
{
|
||||||
|
inner.Write(data, len);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
void Finalize(unsigned char hash[OUTPUT_SIZE]);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // BITCOIN_SHA256_H
|
@ -6,6 +6,7 @@
|
|||||||
#include "crypto/sha1.h"
|
#include "crypto/sha1.h"
|
||||||
#include "crypto/sha256.h"
|
#include "crypto/sha256.h"
|
||||||
#include "crypto/sha512.h"
|
#include "crypto/sha512.h"
|
||||||
|
#include "crypto/hmac_sha256.h"
|
||||||
#include "crypto/hmac_sha512.h"
|
#include "crypto/hmac_sha512.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
#include "utilstrencodings.h"
|
#include "utilstrencodings.h"
|
||||||
@ -50,6 +51,11 @@ void TestSHA256(const std::string &in, const std::string &hexout) { TestVector(C
|
|||||||
void TestSHA512(const std::string &in, const std::string &hexout) { TestVector(CSHA512(), in, ParseHex(hexout));}
|
void TestSHA512(const std::string &in, const std::string &hexout) { TestVector(CSHA512(), in, ParseHex(hexout));}
|
||||||
void TestRIPEMD160(const std::string &in, const std::string &hexout) { TestVector(CRIPEMD160(), in, ParseHex(hexout));}
|
void TestRIPEMD160(const std::string &in, const std::string &hexout) { TestVector(CRIPEMD160(), in, ParseHex(hexout));}
|
||||||
|
|
||||||
|
void TestHMACSHA256(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
|
||||||
|
std::vector<unsigned char> key = ParseHex(hexkey);
|
||||||
|
TestVector(CHMAC_SHA256(&key[0], key.size()), ParseHex(hexin), ParseHex(hexout));
|
||||||
|
}
|
||||||
|
|
||||||
void TestHMACSHA512(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
|
void TestHMACSHA512(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
|
||||||
std::vector<unsigned char> key = ParseHex(hexkey);
|
std::vector<unsigned char> key = ParseHex(hexkey);
|
||||||
TestVector(CHMAC_SHA512(&key[0], key.size()), ParseHex(hexin), ParseHex(hexout));
|
TestVector(CHMAC_SHA512(&key[0], key.size()), ParseHex(hexin), ParseHex(hexout));
|
||||||
@ -160,6 +166,43 @@ BOOST_AUTO_TEST_CASE(sha512_testvectors) {
|
|||||||
"37de8c3ef5459d76a52cedc02dc499a3c9ed9dedbfb3281afd9653b8a112fafc");
|
"37de8c3ef5459d76a52cedc02dc499a3c9ed9dedbfb3281afd9653b8a112fafc");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(hmac_sha256_testvectors) {
|
||||||
|
// test cases 1, 2, 3, 4, 6 and 7 of RFC 4231
|
||||||
|
TestHMACSHA256("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
|
||||||
|
"4869205468657265",
|
||||||
|
"b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7");
|
||||||
|
TestHMACSHA256("4a656665",
|
||||||
|
"7768617420646f2079612077616e7420666f72206e6f7468696e673f",
|
||||||
|
"5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843");
|
||||||
|
TestHMACSHA256("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||||
|
"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
|
||||||
|
"dddddddddddddddddddddddddddddddddddd",
|
||||||
|
"773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe");
|
||||||
|
TestHMACSHA256("0102030405060708090a0b0c0d0e0f10111213141516171819",
|
||||||
|
"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
|
||||||
|
"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
|
||||||
|
"82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b");
|
||||||
|
TestHMACSHA256("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||||
|
"aaaaaa",
|
||||||
|
"54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a"
|
||||||
|
"65204b6579202d2048617368204b6579204669727374",
|
||||||
|
"60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54");
|
||||||
|
TestHMACSHA256("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||||
|
"aaaaaa",
|
||||||
|
"5468697320697320612074657374207573696e672061206c6172676572207468"
|
||||||
|
"616e20626c6f636b2d73697a65206b657920616e642061206c61726765722074"
|
||||||
|
"68616e20626c6f636b2d73697a6520646174612e20546865206b6579206e6565"
|
||||||
|
"647320746f20626520686173686564206265666f7265206265696e6720757365"
|
||||||
|
"642062792074686520484d414320616c676f726974686d2e",
|
||||||
|
"9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2");
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(hmac_sha512_testvectors) {
|
BOOST_AUTO_TEST_CASE(hmac_sha512_testvectors) {
|
||||||
// test cases 1, 2, 3, 4, 6 and 7 of RFC 4231
|
// test cases 1, 2, 3, 4, 6 and 7 of RFC 4231
|
||||||
TestHMACSHA512("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
|
TestHMACSHA512("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
|
||||||
|
Loading…
Reference in New Issue
Block a user