21#include "mbedtls/sha1.h"
26 (void)mbedtls_sha1(data, len, digest);
38static inline uint32_t rot32(uint32_t x,
int n)
40 return (x << n) | (x >> (32 - n));
43static inline uint32_t load_be32(
const uint8_t *p)
45 return ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) | ((uint32_t)p[2] << 8) | (uint32_t)p[3];
48static inline void store_be32(uint8_t *p, uint32_t v)
50 p[0] = (uint8_t)(v >> 24);
51 p[1] = (uint8_t)(v >> 16);
52 p[2] = (uint8_t)(v >> 8);
60static void sha1_block(uint32_t h[5],
const uint8_t block[64])
63 for (
int i = 0; i < 16; i++)
64 w[i] = load_be32(block + i * 4);
65 for (
int i = 16; i < 80; i++)
66 w[i] = rot32(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1);
68 uint32_t a = h[0], b = h[1], c = h[2], d = h[3], e = h[4];
70 for (
int i = 0; i < 80; i++)
75 f = (b & c) | (~b & d);
85 f = (b & c) | (b & d) | (c & d);
94 uint32_t tmp = rot32(a, 5) + f + e + k + w[i];
115 uint32_t h[5] = {0x67452301u, 0xEFCDAB89u, 0x98BADCFEu, 0x10325476u, 0xC3D2E1F0u};
118 size_t blocks = len / 64;
119 for (
size_t i = 0; i < blocks; i++)
120 sha1_block(h, data + i * 64);
123 uint8_t pad[128] = {};
124 size_t tail = len - blocks * 64;
125 memcpy(pad, data + blocks * 64, tail);
129 uint64_t bit_len = (uint64_t)len * 8;
130 uint8_t *bl = (tail < 56) ? pad + 56 : pad + 120;
131 for (
int i = 7; i >= 0; i--, bit_len >>= 8)
132 bl[i] = (uint8_t)bit_len;
136 sha1_block(h, pad + 64);
138 for (
int i = 0; i < 5; i++)
139 store_be32(digest + i * 4, h[i]);
void sha1(const uint8_t *data, size_t len, uint8_t digest[SHA1_DIGEST_LEN])
Compute a SHA-1 digest over an arbitrary byte buffer.
Software SHA-1 implementation — no platform dependencies.
#define SHA1_DIGEST_LEN
SHA-1 digest length in bytes.