16#include "mbedtls/sha1.h"
28 (void)mbedtls_sha1(data, len, digest);
35static inline uint32_t rot32(uint32_t x,
int n)
37 return (x << n) | (x >> (32 - n));
41static void sha1_block(uint32_t h[5],
const uint8_t block[64])
46 for (
int i = 0; i < 16; i++)
50 for (
int i = 16; i < 80; i++)
52 w[i] = rot32(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1);
62 for (
int i = 0; i < 80; i++)
68 f = (b & c) | (~b & d);
78 f = (b & c) | (b & d) | (c & d);
88 uint32_t tmp = rot32(a, 5) + f + e + k + w[i];
105 uint32_t h[5] = {0x67452301u, 0xEFCDAB89u, 0x98BADCFEu, 0x10325476u, 0xC3D2E1F0u};
108 size_t blocks = len / 64;
109 for (
size_t i = 0; i < blocks; i++)
111 sha1_block(h, data + i * 64);
115 uint8_t pad[128] = {};
116 size_t tail = len - blocks * 64;
117 memcpy(pad, data + blocks * 64, tail);
121 uint64_t bit_len = (uint64_t)len * 8;
122 uint8_t *bl = (tail < 56) ? pad + 56 : pad + 120;
123 for (
int i = 7; i >= 0; i--, bit_len >>= 8)
125 bl[i] = (uint8_t)bit_len;
131 sha1_block(h, pad + 64);
134 for (
int i = 0; i < 5; i++)
Per-translation-unit optimization override for hot, pure-integer crypto.
Fixed-width integer serializers into a raw uint8_t* buffer - one source of truth.
uint32_t pc_rd32be(const uint8_t *p)
Read a big-endian u32 at p.
size_t pc_wr32be(uint8_t *p, uint32_t v)
Write v big-endian at p.
PC_CRYPTO_HOT void pc_sha1(const uint8_t *data, size_t len, uint8_t digest[PC_SHA1_DIGEST_LEN])
Compute a SHA-1 digest over an arbitrary byte buffer.
SHA-1 (FIPS 180-4) - one-shot digest.
#define PC_SHA1_DIGEST_LEN
SHA-1 digest length in bytes.