11#define ROL(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
14#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
15#define blk0(i) (block->l[i])
18 (block->l[i] = (ROL(block->l[i], 24) & 0xFF00FF00) | (ROL(block->l[i], 8) & 0x00FF00FF))
22 (block->l[i & 15] = ROL(block->l[(i + 13) & 15] ^ block->l[(i + 8) & 15] ^ \
23 block->l[(i + 2) & 15] ^ block->l[i & 15], \
27#define R0(v, w, x, y, z, i) \
28 z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + ROL(v, 5); \
30#define R1(v, w, x, y, z, i) \
31 z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + ROL(v, 5); \
33#define R2(v, w, x, y, z, i) \
34 z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + ROL(v, 5); \
36#define R3(v, w, x, y, z, i) \
37 z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + ROL(v, 5); \
39#define R4(v, w, x, y, z, i) \
40 z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + ROL(v, 5); \
165static void SHA1Init(SHA1_CTX *
context) {
166 context->state[0] = 0x67452301;
167 context->state[1] = 0xEFCDAB89;
168 context->state[2] = 0x98BADCFE;
169 context->state[3] = 0x10325476;
170 context->state[4] = 0xC3D2E1F0;
184 context->count[1] += (len >> 29);
186 if ((
j + len) > 63) {
191#pragma GCC diagnostic push
192#pragma GCC diagnostic ignored "-Wstringop-overread"
194 for (;
i + 63 < len;
i += 64) {
195 SHA1Transform(
context->state, &data[
i]);
197#pragma GCC diagnostic pop
213 for (
i = 0;
i < 8;
i++) {
215 (
unsigned char)((
context->count[(
i >= 4 ? 0 : 1)] >> ((3 - (
i & 3)) * 8)) & 255);
219 while ((
context->count[0] & 504) != 448) {
224 for (
i = 0;
i < 20;
i++) {
238 SHA1Update(&ctx, data, (
uint32_t)len);
239 SHA1Final(
hash, &ctx);
244static const char encoding_table[] = {
245 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
246 'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
'a',
'b',
'c',
'd',
'e',
'f',
247 'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
248 'w',
'x',
'y',
'z',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'+',
'/'};
249static const int mod_table[] = {0, 2, 1};
Memory allocation wrappers backed by libttak.
void * cwist_alloc(size_t size)
Allocate zeroed memory tracked by libttak.
char * base64_encode(const uint8_t *data, size_t input_length, size_t *output_length)
Base64-encode binary data for WebSocket handshake header generation.
#define R1(v, w, x, y, z, i)
void sha1(const uint8_t *data, size_t len, uint8_t *hash)
Compute a SHA-1 digest for the provided input bytes.
#define R2(v, w, x, y, z, i)
#define R0(v, w, x, y, z, i)
#define R3(v, w, x, y, z, i)
#define R4(v, w, x, y, z, i)
Internal cryptographic helpers used during the WebSocket handshake.