/tmp/bitcoin/src/crypto/hmac_sha256.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_sha256.h> |
6 | | |
7 | | #include <crypto/sha256.h> |
8 | | #include <support/cleanse.h> |
9 | | |
10 | | #include <cstring> |
11 | | |
12 | | CHMAC_SHA256::CHMAC_SHA256(const unsigned char* key, size_t keylen) |
13 | 182k | { |
14 | 182k | unsigned char rkey[64]; |
15 | 182k | if (keylen <= 64) { |
16 | 182k | memcpy(rkey, key, keylen); |
17 | 182k | memset(rkey + keylen, 0, 64 - keylen); |
18 | 182k | } else { |
19 | 4 | CSHA256().Write(key, keylen).Finalize(rkey); |
20 | 4 | memset(rkey + 32, 0, 32); |
21 | 4 | } |
22 | | |
23 | 11.8M | for (int n = 0; n < 64; n++) |
24 | 11.6M | rkey[n] ^= 0x5c; |
25 | 182k | outer.Write(rkey, 64); |
26 | | |
27 | 11.8M | for (int n = 0; n < 64; n++) |
28 | 11.6M | rkey[n] ^= 0x5c ^ 0x36; |
29 | 182k | inner.Write(rkey, 64); |
30 | | |
31 | 182k | memory_cleanse(rkey, sizeof(rkey)); |
32 | 182k | } |
33 | | |
34 | | void CHMAC_SHA256::Finalize(unsigned char hash[OUTPUT_SIZE]) |
35 | 185k | { |
36 | 185k | unsigned char temp[32]; |
37 | 185k | inner.Finalize(temp); |
38 | 185k | outer.Write(temp, 32).Finalize(hash); |
39 | 185k | memory_cleanse(temp, sizeof(temp)); |
40 | 185k | } |