/tmp/bitcoin/src/crypto/hmac_sha512.cpp
Line | Count | Source |
1 | | // Copyright (c) 2014-present The Bitcoin Core developers |
2 | | // Distributed under the MIT software license, see the accompanying |
3 | | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
4 | | |
5 | | #include <crypto/hmac_sha512.h> |
6 | | |
7 | | #include <crypto/sha512.h> |
8 | | |
9 | | #include <cstring> |
10 | | |
11 | | CHMAC_SHA512::CHMAC_SHA512(const unsigned char* key, size_t keylen) |
12 | 769k | { |
13 | 769k | unsigned char rkey[128]; |
14 | 769k | if (keylen <= 128) { |
15 | 769k | memcpy(rkey, key, keylen); |
16 | 769k | memset(rkey + keylen, 0, 128 - keylen); |
17 | 769k | } else { |
18 | 3 | CSHA512().Write(key, keylen).Finalize(rkey); |
19 | 3 | memset(rkey + 64, 0, 64); |
20 | 3 | } |
21 | | |
22 | 99.2M | for (int n = 0; n < 128; n++) |
23 | 98.5M | rkey[n] ^= 0x5c; |
24 | 769k | outer.Write(rkey, 128); |
25 | | |
26 | 99.2M | for (int n = 0; n < 128; n++) |
27 | 98.5M | rkey[n] ^= 0x5c ^ 0x36; |
28 | 769k | inner.Write(rkey, 128); |
29 | 769k | } |
30 | | |
31 | | void CHMAC_SHA512::Finalize(unsigned char hash[OUTPUT_SIZE]) |
32 | 772k | { |
33 | 772k | unsigned char temp[64]; |
34 | 772k | inner.Finalize(temp); |
35 | 772k | outer.Write(temp, 64).Finalize(hash); |
36 | 772k | } |