Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/hash_impl.h
Show First 20 Lines • Show All 127 Lines • ▼ Show 20 Lines | static void secp256k1_sha256_transform(uint32_t* s, const uint32_t* chunk) { | ||||
s[7] += h; | s[7] += h; | ||||
} | } | ||||
static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t len) { | static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t len) { | ||||
size_t bufsize = hash->bytes & 0x3F; | size_t bufsize = hash->bytes & 0x3F; | ||||
hash->bytes += len; | hash->bytes += len; | ||||
while (bufsize + len >= 64) { | while (bufsize + len >= 64) { | ||||
/* Fill the buffer, and process it. */ | /* Fill the buffer, and process it. */ | ||||
memcpy(((unsigned char*)hash->buf) + bufsize, data, 64 - bufsize); | size_t chunk_len = 64 - bufsize; | ||||
data += 64 - bufsize; | memcpy(((unsigned char*)hash->buf) + bufsize, data, chunk_len); | ||||
len -= 64 - bufsize; | data += chunk_len; | ||||
len -= chunk_len; | |||||
secp256k1_sha256_transform(hash->s, hash->buf); | secp256k1_sha256_transform(hash->s, hash->buf); | ||||
bufsize = 0; | bufsize = 0; | ||||
} | } | ||||
if (len) { | if (len) { | ||||
/* Fill the buffer with what remains. */ | /* Fill the buffer with what remains. */ | ||||
memcpy(((unsigned char*)hash->buf) + bufsize, data, len); | memcpy(((unsigned char*)hash->buf) + bufsize, data, len); | ||||
} | } | ||||
} | } | ||||
Show All 10 Lines | static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32) { | ||||
for (i = 0; i < 8; i++) { | for (i = 0; i < 8; i++) { | ||||
out[i] = BE32(hash->s[i]); | out[i] = BE32(hash->s[i]); | ||||
hash->s[i] = 0; | hash->s[i] = 0; | ||||
} | } | ||||
memcpy(out32, (const unsigned char*)out, 32); | memcpy(out32, (const unsigned char*)out, 32); | ||||
} | } | ||||
static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t keylen) { | static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t keylen) { | ||||
int n; | size_t n; | ||||
unsigned char rkey[64]; | unsigned char rkey[64]; | ||||
if (keylen <= 64) { | if (keylen <= sizeof(rkey)) { | ||||
memcpy(rkey, key, keylen); | memcpy(rkey, key, keylen); | ||||
memset(rkey + keylen, 0, 64 - keylen); | memset(rkey + keylen, 0, sizeof(rkey) - keylen); | ||||
} else { | } else { | ||||
secp256k1_sha256 sha256; | secp256k1_sha256 sha256; | ||||
secp256k1_sha256_initialize(&sha256); | secp256k1_sha256_initialize(&sha256); | ||||
secp256k1_sha256_write(&sha256, key, keylen); | secp256k1_sha256_write(&sha256, key, keylen); | ||||
secp256k1_sha256_finalize(&sha256, rkey); | secp256k1_sha256_finalize(&sha256, rkey); | ||||
memset(rkey + 32, 0, 32); | memset(rkey + 32, 0, 32); | ||||
} | } | ||||
secp256k1_sha256_initialize(&hash->outer); | secp256k1_sha256_initialize(&hash->outer); | ||||
for (n = 0; n < 64; n++) { | for (n = 0; n < sizeof(rkey); n++) { | ||||
rkey[n] ^= 0x5c; | rkey[n] ^= 0x5c; | ||||
} | } | ||||
secp256k1_sha256_write(&hash->outer, rkey, 64); | secp256k1_sha256_write(&hash->outer, rkey, sizeof(rkey)); | ||||
secp256k1_sha256_initialize(&hash->inner); | secp256k1_sha256_initialize(&hash->inner); | ||||
for (n = 0; n < 64; n++) { | for (n = 0; n < sizeof(rkey); n++) { | ||||
rkey[n] ^= 0x5c ^ 0x36; | rkey[n] ^= 0x5c ^ 0x36; | ||||
} | } | ||||
secp256k1_sha256_write(&hash->inner, rkey, 64); | secp256k1_sha256_write(&hash->inner, rkey, sizeof(rkey)); | ||||
memset(rkey, 0, 64); | memset(rkey, 0, sizeof(rkey)); | ||||
} | } | ||||
static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size) { | static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size) { | ||||
secp256k1_sha256_write(&hash->inner, data, size); | secp256k1_sha256_write(&hash->inner, data, size); | ||||
} | } | ||||
static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32) { | static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32) { | ||||
unsigned char temp[32]; | unsigned char temp[32]; | ||||
▲ Show 20 Lines • Show All 84 Lines • Show Last 20 Lines |