45 const uint8_t* key,
size_t key_size,
46 const uint8_t* data,
size_t data_size) {
48 std::array<uint8_t, 32> key_hash{};
49 const uint8_t* actual_key = key;
50 size_t actual_key_size = key_size;
52 if (key_size > SHA256_BLOCK_SIZE) {
54 actual_key = key_hash.data();
55 actual_key_size = SHA256_HASH_SIZE;
58 uint8_t k_pad[SHA256_BLOCK_SIZE] = {};
59 std::memcpy(k_pad, actual_key, actual_key_size);
62 uint8_t inner_buf[SHA256_BLOCK_SIZE];
63 for (
size_t i = 0; i < SHA256_BLOCK_SIZE; ++i) {
64 inner_buf[i] = k_pad[i] ^ 0x36;
67 std::vector<uint8_t> inner_msg;
68 inner_msg.reserve(SHA256_BLOCK_SIZE + data_size);
69 inner_msg.insert(inner_msg.end(), inner_buf, inner_buf + SHA256_BLOCK_SIZE);
70 inner_msg.insert(inner_msg.end(), data, data + data_size);
74 uint8_t outer_buf[SHA256_BLOCK_SIZE];
75 for (
size_t i = 0; i < SHA256_BLOCK_SIZE; ++i) {
76 outer_buf[i] = k_pad[i] ^ 0x5c;
79 std::vector<uint8_t> outer_msg;
80 outer_msg.reserve(SHA256_BLOCK_SIZE + SHA256_HASH_SIZE);
81 outer_msg.insert(outer_msg.end(), outer_buf, outer_buf + SHA256_BLOCK_SIZE);
82 outer_msg.insert(outer_msg.end(), inner_hash.begin(), inner_hash.end());
86 volatile uint8_t* vp = k_pad;
87 for (
size_t i = 0; i < SHA256_BLOCK_SIZE; ++i) vp[i] = 0;
89 for (
size_t i = 0; i < SHA256_BLOCK_SIZE; ++i) vp[i] = 0;
91 for (
size_t i = 0; i < SHA256_BLOCK_SIZE; ++i) vp[i] = 0;