Introduction
Introduction Statistics Contact Development Disclaimer Help
sha256.c - sbase - suckless unix tools
git clone git://git.suckless.org/sbase
Log
Files
Refs
README
LICENSE
---
sha256.c (3600B)
---
1 /* public domain sha256 implementation based on fips180-3 */
2 #include <ctype.h>
3 #include <stdint.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7
8 #include "../sha256.h"
9
10 static uint32_t ror(uint32_t n, int k) { return (n >> k) | (n << (32-k))…
11 #define Ch(x,y,z) (z ^ (x & (y ^ z)))
12 #define Maj(x,y,z) ((x & y) | (z & (x | y)))
13 #define S0(x) (ror(x,2) ^ ror(x,13) ^ ror(x,22))
14 #define S1(x) (ror(x,6) ^ ror(x,11) ^ ror(x,25))
15 #define R0(x) (ror(x,7) ^ ror(x,18) ^ (x>>3))
16 #define R1(x) (ror(x,17) ^ ror(x,19) ^ (x>>10))
17
18 static const uint32_t K[64] = {
19 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, …
20 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, …
21 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, …
22 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, …
23 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, …
24 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, …
25 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, …
26 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, …
27 };
28
29 static void
30 processblock(struct sha256 *s, const uint8_t *buf)
31 {
32 uint32_t W[64], t1, t2, a, b, c, d, e, f, g, h;
33 int i;
34
35 for (i = 0; i < 16; i++) {
36 W[i] = (uint32_t)buf[4*i]<<24;
37 W[i] |= (uint32_t)buf[4*i+1]<<16;
38 W[i] |= (uint32_t)buf[4*i+2]<<8;
39 W[i] |= buf[4*i+3];
40 }
41 for (; i < 64; i++)
42 W[i] = R1(W[i-2]) + W[i-7] + R0(W[i-15]) + W[i-16];
43 a = s->h[0];
44 b = s->h[1];
45 c = s->h[2];
46 d = s->h[3];
47 e = s->h[4];
48 f = s->h[5];
49 g = s->h[6];
50 h = s->h[7];
51 for (i = 0; i < 64; i++) {
52 t1 = h + S1(e) + Ch(e,f,g) + K[i] + W[i];
53 t2 = S0(a) + Maj(a,b,c);
54 h = g;
55 g = f;
56 f = e;
57 e = d + t1;
58 d = c;
59 c = b;
60 b = a;
61 a = t1 + t2;
62 }
63 s->h[0] += a;
64 s->h[1] += b;
65 s->h[2] += c;
66 s->h[3] += d;
67 s->h[4] += e;
68 s->h[5] += f;
69 s->h[6] += g;
70 s->h[7] += h;
71 }
72
73 static void
74 pad(struct sha256 *s)
75 {
76 unsigned r = s->len % 64;
77
78 s->buf[r++] = 0x80;
79 if (r > 56) {
80 memset(s->buf + r, 0, 64 - r);
81 r = 0;
82 processblock(s, s->buf);
83 }
84 memset(s->buf + r, 0, 56 - r);
85 s->len *= 8;
86 s->buf[56] = s->len >> 56;
87 s->buf[57] = s->len >> 48;
88 s->buf[58] = s->len >> 40;
89 s->buf[59] = s->len >> 32;
90 s->buf[60] = s->len >> 24;
91 s->buf[61] = s->len >> 16;
92 s->buf[62] = s->len >> 8;
93 s->buf[63] = s->len;
94 processblock(s, s->buf);
95 }
96
97 void
98 sha256_init(void *ctx)
99 {
100 struct sha256 *s = ctx;
101 s->len = 0;
102 s->h[0] = 0x6a09e667;
103 s->h[1] = 0xbb67ae85;
104 s->h[2] = 0x3c6ef372;
105 s->h[3] = 0xa54ff53a;
106 s->h[4] = 0x510e527f;
107 s->h[5] = 0x9b05688c;
108 s->h[6] = 0x1f83d9ab;
109 s->h[7] = 0x5be0cd19;
110 }
111
112 void
113 sha256_sum_n(void *ctx, uint8_t *md, int n)
114 {
115 struct sha256 *s = ctx;
116 int i;
117
118 pad(s);
119 for (i = 0; i < n; i++) {
120 md[4*i] = s->h[i] >> 24;
121 md[4*i+1] = s->h[i] >> 16;
122 md[4*i+2] = s->h[i] >> 8;
123 md[4*i+3] = s->h[i];
124 }
125 }
126
127 void
128 sha256_sum(void *ctx, uint8_t md[SHA256_DIGEST_LENGTH])
129 {
130 sha256_sum_n(ctx, md, 8);
131 }
132
133 void
134 sha256_update(void *ctx, const void *m, unsigned long len)
135 {
136 struct sha256 *s = ctx;
137 const uint8_t *p = m;
138 unsigned r = s->len % 64;
139
140 s->len += len;
141 if (r) {
142 if (len < 64 - r) {
143 memcpy(s->buf + r, p, len);
144 return;
145 }
146 memcpy(s->buf + r, p, 64 - r);
147 len -= 64 - r;
148 p += 64 - r;
149 processblock(s, s->buf);
150 }
151 for (; len >= 64; len -= 64, p += 64)
152 processblock(s, p);
153 memcpy(s->buf, p, len);
154 }
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.