Introduction
Introduction Statistics Contact Development Disclaimer Help
sha512.c - sbase - suckless unix tools
git clone git://git.suckless.org/sbase
Log
Files
Refs
README
LICENSE
---
sha512.c (5041B)
---
1 /* public domain sha256 implementation based on fips180-3 */
2
3 #include <ctype.h>
4 #include <stdint.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9 #include "../sha512.h"
10
11 static uint64_t ror(uint64_t n, int k) { return (n >> k) | (n << (64-k))…
12 #define Ch(x,y,z) (z ^ (x & (y ^ z)))
13 #define Maj(x,y,z) ((x & y) | (z & (x | y)))
14 #define S0(x) (ror(x,28) ^ ror(x,34) ^ ror(x,39))
15 #define S1(x) (ror(x,14) ^ ror(x,18) ^ ror(x,41))
16 #define R0(x) (ror(x,1) ^ ror(x,8) ^ (x>>7))
17 #define R1(x) (ror(x,19) ^ ror(x,61) ^ (x>>6))
18
19 static const uint64_t K[80] = {
20 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 0xe…
21 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 0x923f82a4af194f9bULL, 0xa…
22 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x5…
23 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, 0xc…
24 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 0x0fc19dc68b8cd5b5ULL, 0x2…
25 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x7…
26 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, 0xb…
27 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 0x06ca6351e003826fULL, 0x1…
28 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x5…
29 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, 0x9…
30 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 0xc24b8b70d0f89791ULL, 0xc…
31 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x1…
32 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, 0x3…
33 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 0x5b9cca4f7763e373ULL, 0x6…
34 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8…
35 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, 0xc…
36 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 0xeada7dd6cde0eb1eULL, 0xf…
37 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1…
38 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 0x4…
39 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6…
40 };
41
42 static void
43 processblock(struct sha512 *s, const uint8_t *buf)
44 {
45 uint64_t W[80], t1, t2, a, b, c, d, e, f, g, h;
46 int i;
47
48 for (i = 0; i < 16; i++) {
49 W[i] = (uint64_t)buf[8*i]<<56;
50 W[i] |= (uint64_t)buf[8*i+1]<<48;
51 W[i] |= (uint64_t)buf[8*i+2]<<40;
52 W[i] |= (uint64_t)buf[8*i+3]<<32;
53 W[i] |= (uint64_t)buf[8*i+4]<<24;
54 W[i] |= (uint64_t)buf[8*i+5]<<16;
55 W[i] |= (uint64_t)buf[8*i+6]<<8;
56 W[i] |= buf[8*i+7];
57 }
58 for (; i < 80; i++)
59 W[i] = R1(W[i-2]) + W[i-7] + R0(W[i-15]) + W[i-16];
60 a = s->h[0];
61 b = s->h[1];
62 c = s->h[2];
63 d = s->h[3];
64 e = s->h[4];
65 f = s->h[5];
66 g = s->h[6];
67 h = s->h[7];
68 for (i = 0; i < 80; i++) {
69 t1 = h + S1(e) + Ch(e,f,g) + K[i] + W[i];
70 t2 = S0(a) + Maj(a,b,c);
71 h = g;
72 g = f;
73 f = e;
74 e = d + t1;
75 d = c;
76 c = b;
77 b = a;
78 a = t1 + t2;
79 }
80 s->h[0] += a;
81 s->h[1] += b;
82 s->h[2] += c;
83 s->h[3] += d;
84 s->h[4] += e;
85 s->h[5] += f;
86 s->h[6] += g;
87 s->h[7] += h;
88 }
89
90 static void
91 pad(struct sha512 *s)
92 {
93 unsigned r = s->len % 128;
94
95 s->buf[r++] = 0x80;
96 if (r > 112) {
97 memset(s->buf + r, 0, 128 - r);
98 r = 0;
99 processblock(s, s->buf);
100 }
101 memset(s->buf + r, 0, 120 - r);
102 s->len *= 8;
103 s->buf[120] = s->len >> 56;
104 s->buf[121] = s->len >> 48;
105 s->buf[122] = s->len >> 40;
106 s->buf[123] = s->len >> 32;
107 s->buf[124] = s->len >> 24;
108 s->buf[125] = s->len >> 16;
109 s->buf[126] = s->len >> 8;
110 s->buf[127] = s->len;
111 processblock(s, s->buf);
112 }
113
114 void
115 sha512_init(void *ctx)
116 {
117 struct sha512 *s = ctx;
118 s->len = 0;
119 s->h[0] = 0x6a09e667f3bcc908ULL;
120 s->h[1] = 0xbb67ae8584caa73bULL;
121 s->h[2] = 0x3c6ef372fe94f82bULL;
122 s->h[3] = 0xa54ff53a5f1d36f1ULL;
123 s->h[4] = 0x510e527fade682d1ULL;
124 s->h[5] = 0x9b05688c2b3e6c1fULL;
125 s->h[6] = 0x1f83d9abfb41bd6bULL;
126 s->h[7] = 0x5be0cd19137e2179ULL;
127 }
128
129 void
130 sha512_sum_n(void *ctx, uint8_t *md, int n)
131 {
132 struct sha512 *s = ctx;
133 int i;
134
135 pad(s);
136 for (i = 0; i < n; i++) {
137 md[8*i] = s->h[i] >> 56;
138 md[8*i+1] = s->h[i] >> 48;
139 md[8*i+2] = s->h[i] >> 40;
140 md[8*i+3] = s->h[i] >> 32;
141 md[8*i+4] = s->h[i] >> 24;
142 md[8*i+5] = s->h[i] >> 16;
143 md[8*i+6] = s->h[i] >> 8;
144 md[8*i+7] = s->h[i];
145 }
146 }
147
148 void
149 sha512_sum(void *ctx, uint8_t md[SHA512_DIGEST_LENGTH])
150 {
151 sha512_sum_n(ctx, md, 8);
152 }
153
154 void
155 sha512_update(void *ctx, const void *m, unsigned long len)
156 {
157 struct sha512 *s = ctx;
158 const uint8_t *p = m;
159 unsigned r = s->len % 128;
160
161 s->len += len;
162 if (r) {
163 if (len < 128 - r) {
164 memcpy(s->buf + r, p, len);
165 return;
166 }
167 memcpy(s->buf + r, p, 128 - r);
168 len -= 128 - r;
169 p += 128 - r;
170 processblock(s, s->buf);
171 }
172 for (; len >= 128; len -= 128, p += 128)
173 processblock(s, p);
174 memcpy(s->buf, p, len);
175 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.