chiark / gitweb /
sha512.[ch]: Remove a bunch of unused code.
[secnet.git] / sha512.c
1 /* sha512.c - Functions to compute SHA512 and SHA384 message digest of files or
2    memory blocks according to the NIST specification FIPS-180-2.
3
4    Copyright (C) 2005, 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
5
6    This program is free software: you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation, either version 3 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18
19 /* Written by David Madore, considerably copypasting from
20    Scott G. Miller's sha1.c
21 */
22
23 #include <config.h>
24
25 #include "sha512.h"
26
27 #include <stddef.h>
28 #include <stdlib.h>
29 #include <string.h>
30
31 #if USE_UNLOCKED_IO
32 # include "unlocked-io.h"
33 #endif
34
35 #ifdef WORDS_BIGENDIAN
36 # define SWAP(n) (n)
37 #else
38 # define SWAP(n) \
39     u64or (u64or (u64or (u64shl (n, 56),                                \
40                          u64shl (u64and (n, u64lo (0x0000ff00)), 40)),  \
41                   u64or (u64shl (u64and (n, u64lo (0x00ff0000)), 24),   \
42                          u64shl (u64and (n, u64lo (0xff000000)),  8))), \
43            u64or (u64or (u64and (u64shr (n,  8), u64lo (0xff000000)),   \
44                          u64and (u64shr (n, 24), u64lo (0x00ff0000))),  \
45                   u64or (u64and (u64shr (n, 40), u64lo (0x0000ff00)),   \
46                          u64shr (n, 56))))
47 #endif
48
49 #define BLOCKSIZE 32768
50 #if BLOCKSIZE % 128 != 0
51 # error "invalid BLOCKSIZE"
52 #endif
53
54 /* This array contains the bytes used to pad the buffer to the next
55    128-byte boundary.  */
56 static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ...  */ };
57
58
59 /*
60   Takes a pointer to a 512 bit block of data (eight 64 bit ints) and
61   intializes it to the start constants of the SHA512 algorithm.  This
62   must be called before using hash in the call to sha512_hash
63 */
64 void
65 sha512_init_ctx (struct sha512_ctx *ctx)
66 {
67   ctx->state[0] = u64hilo (0x6a09e667, 0xf3bcc908);
68   ctx->state[1] = u64hilo (0xbb67ae85, 0x84caa73b);
69   ctx->state[2] = u64hilo (0x3c6ef372, 0xfe94f82b);
70   ctx->state[3] = u64hilo (0xa54ff53a, 0x5f1d36f1);
71   ctx->state[4] = u64hilo (0x510e527f, 0xade682d1);
72   ctx->state[5] = u64hilo (0x9b05688c, 0x2b3e6c1f);
73   ctx->state[6] = u64hilo (0x1f83d9ab, 0xfb41bd6b);
74   ctx->state[7] = u64hilo (0x5be0cd19, 0x137e2179);
75
76   ctx->total[0] = ctx->total[1] = u64lo (0);
77   ctx->buflen = 0;
78 }
79
80 void
81 sha384_init_ctx (struct sha512_ctx *ctx)
82 {
83   ctx->state[0] = u64hilo (0xcbbb9d5d, 0xc1059ed8);
84   ctx->state[1] = u64hilo (0x629a292a, 0x367cd507);
85   ctx->state[2] = u64hilo (0x9159015a, 0x3070dd17);
86   ctx->state[3] = u64hilo (0x152fecd8, 0xf70e5939);
87   ctx->state[4] = u64hilo (0x67332667, 0xffc00b31);
88   ctx->state[5] = u64hilo (0x8eb44a87, 0x68581511);
89   ctx->state[6] = u64hilo (0xdb0c2e0d, 0x64f98fa7);
90   ctx->state[7] = u64hilo (0x47b5481d, 0xbefa4fa4);
91
92   ctx->total[0] = ctx->total[1] = u64lo (0);
93   ctx->buflen = 0;
94 }
95
96 /* Copy the value from V into the memory location pointed to by *CP,
97    If your architecture allows unaligned access, this is equivalent to
98    * (__typeof__ (v) *) cp = v  */
99 static inline void
100 set_uint64 (char *cp, u64 v)
101 {
102   memcpy (cp, &v, sizeof v);
103 }
104
105 /* Put result from CTX in first 64 bytes following RESBUF.
106    The result must be in little endian byte order.  */
107 void *
108 sha512_read_ctx (const struct sha512_ctx *ctx, void *resbuf)
109 {
110   int i;
111   char *r = resbuf;
112
113   for (i = 0; i < 8; i++)
114     set_uint64 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
115
116   return resbuf;
117 }
118
119 void *
120 sha384_read_ctx (const struct sha512_ctx *ctx, void *resbuf)
121 {
122   int i;
123   char *r = resbuf;
124
125   for (i = 0; i < 6; i++)
126     set_uint64 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
127
128   return resbuf;
129 }
130
131 /* Process the remaining bytes in the internal buffer and the usual
132    prolog according to the standard and write the result to RESBUF.  */
133 static void
134 sha512_conclude_ctx (struct sha512_ctx *ctx)
135 {
136   /* Take yet unprocessed bytes into account.  */
137   size_t bytes = ctx->buflen;
138   size_t size = (bytes < 112) ? 128 / 8 : 128 * 2 / 8;
139
140   /* Now count remaining bytes.  */
141   ctx->total[0] = u64plus (ctx->total[0], u64lo (bytes));
142   if (u64lt (ctx->total[0], u64lo (bytes)))
143     ctx->total[1] = u64plus (ctx->total[1], u64lo (1));
144
145   /* Put the 128-bit file length in *bits* at the end of the buffer.
146      Use set_uint64 rather than a simple assignment, to avoid risk of
147      unaligned access.  */
148   set_uint64 ((char *) &ctx->buffer[size - 2],
149               SWAP (u64or (u64shl (ctx->total[1], 3),
150                            u64shr (ctx->total[0], 61))));
151   set_uint64 ((char *) &ctx->buffer[size - 1],
152               SWAP (u64shl (ctx->total[0], 3)));
153
154   memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 8 - bytes);
155
156   /* Process last bytes.  */
157   sha512_process_block (ctx->buffer, size * 8, ctx);
158 }
159
160 void *
161 sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
162 {
163   sha512_conclude_ctx (ctx);
164   return sha512_read_ctx (ctx, resbuf);
165 }
166
167 void *
168 sha384_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
169 {
170   sha512_conclude_ctx (ctx);
171   return sha384_read_ctx (ctx, resbuf);
172 }
173
174 void
175 sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx)
176 {
177   /* When we already have some bits in our internal buffer concatenate
178      both inputs first.  */
179   if (ctx->buflen != 0)
180     {
181       size_t left_over = ctx->buflen;
182       size_t add = 256 - left_over > len ? len : 256 - left_over;
183
184       memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
185       ctx->buflen += add;
186
187       if (ctx->buflen > 128)
188         {
189           sha512_process_block (ctx->buffer, ctx->buflen & ~127, ctx);
190
191           ctx->buflen &= 127;
192           /* The regions in the following copy operation cannot overlap.  */
193           memcpy (ctx->buffer,
194                   &((char *) ctx->buffer)[(left_over + add) & ~127],
195                   ctx->buflen);
196         }
197
198       buffer = (const char *) buffer + add;
199       len -= add;
200     }
201
202   /* Process available complete blocks.  */
203   if (len >= 128)
204     {
205 #if !_STRING_ARCH_unaligned
206 # define alignof(type) offsetof (struct { char c; type x; }, x)
207 # define UNALIGNED_P(p) (((size_t) p) % alignof (u64) != 0)
208       if (UNALIGNED_P (buffer))
209         while (len > 128)
210           {
211             sha512_process_block (memcpy (ctx->buffer, buffer, 128), 128, ctx);
212             buffer = (const char *) buffer + 128;
213             len -= 128;
214           }
215       else
216 #endif
217         {
218           sha512_process_block (buffer, len & ~127, ctx);
219           buffer = (const char *) buffer + (len & ~127);
220           len &= 127;
221         }
222     }
223
224   /* Move remaining bytes in internal buffer.  */
225   if (len > 0)
226     {
227       size_t left_over = ctx->buflen;
228
229       memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
230       left_over += len;
231       if (left_over >= 128)
232         {
233           sha512_process_block (ctx->buffer, 128, ctx);
234           left_over -= 128;
235           memcpy (ctx->buffer, &ctx->buffer[16], left_over);
236         }
237       ctx->buflen = left_over;
238     }
239 }
240
241 /* --- Code below is the primary difference between sha1.c and sha512.c --- */
242
243 /* SHA512 round constants */
244 #define K(I) sha512_round_constants[I]
245 static u64 const sha512_round_constants[80] = {
246   u64init (0x428a2f98, 0xd728ae22), u64init (0x71374491, 0x23ef65cd),
247   u64init (0xb5c0fbcf, 0xec4d3b2f), u64init (0xe9b5dba5, 0x8189dbbc),
248   u64init (0x3956c25b, 0xf348b538), u64init (0x59f111f1, 0xb605d019),
249   u64init (0x923f82a4, 0xaf194f9b), u64init (0xab1c5ed5, 0xda6d8118),
250   u64init (0xd807aa98, 0xa3030242), u64init (0x12835b01, 0x45706fbe),
251   u64init (0x243185be, 0x4ee4b28c), u64init (0x550c7dc3, 0xd5ffb4e2),
252   u64init (0x72be5d74, 0xf27b896f), u64init (0x80deb1fe, 0x3b1696b1),
253   u64init (0x9bdc06a7, 0x25c71235), u64init (0xc19bf174, 0xcf692694),
254   u64init (0xe49b69c1, 0x9ef14ad2), u64init (0xefbe4786, 0x384f25e3),
255   u64init (0x0fc19dc6, 0x8b8cd5b5), u64init (0x240ca1cc, 0x77ac9c65),
256   u64init (0x2de92c6f, 0x592b0275), u64init (0x4a7484aa, 0x6ea6e483),
257   u64init (0x5cb0a9dc, 0xbd41fbd4), u64init (0x76f988da, 0x831153b5),
258   u64init (0x983e5152, 0xee66dfab), u64init (0xa831c66d, 0x2db43210),
259   u64init (0xb00327c8, 0x98fb213f), u64init (0xbf597fc7, 0xbeef0ee4),
260   u64init (0xc6e00bf3, 0x3da88fc2), u64init (0xd5a79147, 0x930aa725),
261   u64init (0x06ca6351, 0xe003826f), u64init (0x14292967, 0x0a0e6e70),
262   u64init (0x27b70a85, 0x46d22ffc), u64init (0x2e1b2138, 0x5c26c926),
263   u64init (0x4d2c6dfc, 0x5ac42aed), u64init (0x53380d13, 0x9d95b3df),
264   u64init (0x650a7354, 0x8baf63de), u64init (0x766a0abb, 0x3c77b2a8),
265   u64init (0x81c2c92e, 0x47edaee6), u64init (0x92722c85, 0x1482353b),
266   u64init (0xa2bfe8a1, 0x4cf10364), u64init (0xa81a664b, 0xbc423001),
267   u64init (0xc24b8b70, 0xd0f89791), u64init (0xc76c51a3, 0x0654be30),
268   u64init (0xd192e819, 0xd6ef5218), u64init (0xd6990624, 0x5565a910),
269   u64init (0xf40e3585, 0x5771202a), u64init (0x106aa070, 0x32bbd1b8),
270   u64init (0x19a4c116, 0xb8d2d0c8), u64init (0x1e376c08, 0x5141ab53),
271   u64init (0x2748774c, 0xdf8eeb99), u64init (0x34b0bcb5, 0xe19b48a8),
272   u64init (0x391c0cb3, 0xc5c95a63), u64init (0x4ed8aa4a, 0xe3418acb),
273   u64init (0x5b9cca4f, 0x7763e373), u64init (0x682e6ff3, 0xd6b2b8a3),
274   u64init (0x748f82ee, 0x5defb2fc), u64init (0x78a5636f, 0x43172f60),
275   u64init (0x84c87814, 0xa1f0ab72), u64init (0x8cc70208, 0x1a6439ec),
276   u64init (0x90befffa, 0x23631e28), u64init (0xa4506ceb, 0xde82bde9),
277   u64init (0xbef9a3f7, 0xb2c67915), u64init (0xc67178f2, 0xe372532b),
278   u64init (0xca273ece, 0xea26619c), u64init (0xd186b8c7, 0x21c0c207),
279   u64init (0xeada7dd6, 0xcde0eb1e), u64init (0xf57d4f7f, 0xee6ed178),
280   u64init (0x06f067aa, 0x72176fba), u64init (0x0a637dc5, 0xa2c898a6),
281   u64init (0x113f9804, 0xbef90dae), u64init (0x1b710b35, 0x131c471b),
282   u64init (0x28db77f5, 0x23047d84), u64init (0x32caab7b, 0x40c72493),
283   u64init (0x3c9ebe0a, 0x15c9bebc), u64init (0x431d67c4, 0x9c100d4c),
284   u64init (0x4cc5d4be, 0xcb3e42b6), u64init (0x597f299c, 0xfc657e2a),
285   u64init (0x5fcb6fab, 0x3ad6faec), u64init (0x6c44198c, 0x4a475817),
286 };
287
288 /* Round functions.  */
289 #define F2(A, B, C) u64or (u64and (A, B), u64and (C, u64or (A, B)))
290 #define F1(E, F, G) u64xor (G, u64and (E, u64xor (F, G)))
291
292 /* Process LEN bytes of BUFFER, accumulating context into CTX.
293    It is assumed that LEN % 128 == 0.
294    Most of this code comes from GnuPG's cipher/sha1.c.  */
295
296 void
297 sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx)
298 {
299   u64 const *words = buffer;
300   u64 const *endp = words + len / sizeof (u64);
301   u64 x[16];
302   u64 a = ctx->state[0];
303   u64 b = ctx->state[1];
304   u64 c = ctx->state[2];
305   u64 d = ctx->state[3];
306   u64 e = ctx->state[4];
307   u64 f = ctx->state[5];
308   u64 g = ctx->state[6];
309   u64 h = ctx->state[7];
310
311   /* First increment the byte count.  FIPS PUB 180-2 specifies the possible
312      length of the file up to 2^128 bits.  Here we only compute the
313      number of bytes.  Do a double word increment.  */
314   ctx->total[0] = u64plus (ctx->total[0], u64lo (len));
315   if (u64lt (ctx->total[0], u64lo (len)))
316     ctx->total[1] = u64plus (ctx->total[1], u64lo (1));
317
318 #define S0(x) u64xor (u64rol(x, 63), u64xor (u64rol (x, 56), u64shr (x, 7)))
319 #define S1(x) u64xor (u64rol (x, 45), u64xor (u64rol (x, 3), u64shr (x, 6)))
320 #define SS0(x) u64xor (u64rol (x, 36), u64xor (u64rol (x, 30), u64rol (x, 25)))
321 #define SS1(x) u64xor (u64rol(x, 50), u64xor (u64rol (x, 46), u64rol (x, 23)))
322
323 #define M(I) (x[(I) & 15]                                                 \
324               = u64plus (x[(I) & 15],                                     \
325                          u64plus (S1 (x[((I) - 2) & 15]),                 \
326                                   u64plus (x[((I) - 7) & 15],             \
327                                            S0 (x[((I) - 15) & 15])))))
328
329 #define R(A, B, C, D, E, F, G, H, K, M)                                   \
330   do                                                                      \
331     {                                                                     \
332       u64 t0 = u64plus (SS0 (A), F2 (A, B, C));                           \
333       u64 t1 =                                                            \
334         u64plus (H, u64plus (SS1 (E),                                     \
335                              u64plus (F1 (E, F, G), u64plus (K, M))));    \
336       D = u64plus (D, t1);                                                \
337       H = u64plus (t0, t1);                                               \
338     }                                                                     \
339   while (0)
340
341   while (words < endp)
342     {
343       int t;
344       /* FIXME: see sha1.c for a better implementation.  */
345       for (t = 0; t < 16; t++)
346         {
347           x[t] = SWAP (*words);
348           words++;
349         }
350
351       R( a, b, c, d, e, f, g, h, K( 0), x[ 0] );
352       R( h, a, b, c, d, e, f, g, K( 1), x[ 1] );
353       R( g, h, a, b, c, d, e, f, K( 2), x[ 2] );
354       R( f, g, h, a, b, c, d, e, K( 3), x[ 3] );
355       R( e, f, g, h, a, b, c, d, K( 4), x[ 4] );
356       R( d, e, f, g, h, a, b, c, K( 5), x[ 5] );
357       R( c, d, e, f, g, h, a, b, K( 6), x[ 6] );
358       R( b, c, d, e, f, g, h, a, K( 7), x[ 7] );
359       R( a, b, c, d, e, f, g, h, K( 8), x[ 8] );
360       R( h, a, b, c, d, e, f, g, K( 9), x[ 9] );
361       R( g, h, a, b, c, d, e, f, K(10), x[10] );
362       R( f, g, h, a, b, c, d, e, K(11), x[11] );
363       R( e, f, g, h, a, b, c, d, K(12), x[12] );
364       R( d, e, f, g, h, a, b, c, K(13), x[13] );
365       R( c, d, e, f, g, h, a, b, K(14), x[14] );
366       R( b, c, d, e, f, g, h, a, K(15), x[15] );
367       R( a, b, c, d, e, f, g, h, K(16), M(16) );
368       R( h, a, b, c, d, e, f, g, K(17), M(17) );
369       R( g, h, a, b, c, d, e, f, K(18), M(18) );
370       R( f, g, h, a, b, c, d, e, K(19), M(19) );
371       R( e, f, g, h, a, b, c, d, K(20), M(20) );
372       R( d, e, f, g, h, a, b, c, K(21), M(21) );
373       R( c, d, e, f, g, h, a, b, K(22), M(22) );
374       R( b, c, d, e, f, g, h, a, K(23), M(23) );
375       R( a, b, c, d, e, f, g, h, K(24), M(24) );
376       R( h, a, b, c, d, e, f, g, K(25), M(25) );
377       R( g, h, a, b, c, d, e, f, K(26), M(26) );
378       R( f, g, h, a, b, c, d, e, K(27), M(27) );
379       R( e, f, g, h, a, b, c, d, K(28), M(28) );
380       R( d, e, f, g, h, a, b, c, K(29), M(29) );
381       R( c, d, e, f, g, h, a, b, K(30), M(30) );
382       R( b, c, d, e, f, g, h, a, K(31), M(31) );
383       R( a, b, c, d, e, f, g, h, K(32), M(32) );
384       R( h, a, b, c, d, e, f, g, K(33), M(33) );
385       R( g, h, a, b, c, d, e, f, K(34), M(34) );
386       R( f, g, h, a, b, c, d, e, K(35), M(35) );
387       R( e, f, g, h, a, b, c, d, K(36), M(36) );
388       R( d, e, f, g, h, a, b, c, K(37), M(37) );
389       R( c, d, e, f, g, h, a, b, K(38), M(38) );
390       R( b, c, d, e, f, g, h, a, K(39), M(39) );
391       R( a, b, c, d, e, f, g, h, K(40), M(40) );
392       R( h, a, b, c, d, e, f, g, K(41), M(41) );
393       R( g, h, a, b, c, d, e, f, K(42), M(42) );
394       R( f, g, h, a, b, c, d, e, K(43), M(43) );
395       R( e, f, g, h, a, b, c, d, K(44), M(44) );
396       R( d, e, f, g, h, a, b, c, K(45), M(45) );
397       R( c, d, e, f, g, h, a, b, K(46), M(46) );
398       R( b, c, d, e, f, g, h, a, K(47), M(47) );
399       R( a, b, c, d, e, f, g, h, K(48), M(48) );
400       R( h, a, b, c, d, e, f, g, K(49), M(49) );
401       R( g, h, a, b, c, d, e, f, K(50), M(50) );
402       R( f, g, h, a, b, c, d, e, K(51), M(51) );
403       R( e, f, g, h, a, b, c, d, K(52), M(52) );
404       R( d, e, f, g, h, a, b, c, K(53), M(53) );
405       R( c, d, e, f, g, h, a, b, K(54), M(54) );
406       R( b, c, d, e, f, g, h, a, K(55), M(55) );
407       R( a, b, c, d, e, f, g, h, K(56), M(56) );
408       R( h, a, b, c, d, e, f, g, K(57), M(57) );
409       R( g, h, a, b, c, d, e, f, K(58), M(58) );
410       R( f, g, h, a, b, c, d, e, K(59), M(59) );
411       R( e, f, g, h, a, b, c, d, K(60), M(60) );
412       R( d, e, f, g, h, a, b, c, K(61), M(61) );
413       R( c, d, e, f, g, h, a, b, K(62), M(62) );
414       R( b, c, d, e, f, g, h, a, K(63), M(63) );
415       R( a, b, c, d, e, f, g, h, K(64), M(64) );
416       R( h, a, b, c, d, e, f, g, K(65), M(65) );
417       R( g, h, a, b, c, d, e, f, K(66), M(66) );
418       R( f, g, h, a, b, c, d, e, K(67), M(67) );
419       R( e, f, g, h, a, b, c, d, K(68), M(68) );
420       R( d, e, f, g, h, a, b, c, K(69), M(69) );
421       R( c, d, e, f, g, h, a, b, K(70), M(70) );
422       R( b, c, d, e, f, g, h, a, K(71), M(71) );
423       R( a, b, c, d, e, f, g, h, K(72), M(72) );
424       R( h, a, b, c, d, e, f, g, K(73), M(73) );
425       R( g, h, a, b, c, d, e, f, K(74), M(74) );
426       R( f, g, h, a, b, c, d, e, K(75), M(75) );
427       R( e, f, g, h, a, b, c, d, K(76), M(76) );
428       R( d, e, f, g, h, a, b, c, K(77), M(77) );
429       R( c, d, e, f, g, h, a, b, K(78), M(78) );
430       R( b, c, d, e, f, g, h, a, K(79), M(79) );
431
432       a = ctx->state[0] = u64plus (ctx->state[0], a);
433       b = ctx->state[1] = u64plus (ctx->state[1], b);
434       c = ctx->state[2] = u64plus (ctx->state[2], c);
435       d = ctx->state[3] = u64plus (ctx->state[3], d);
436       e = ctx->state[4] = u64plus (ctx->state[4], e);
437       f = ctx->state[5] = u64plus (ctx->state[5], f);
438       g = ctx->state[6] = u64plus (ctx->state[6], g);
439       h = ctx->state[7] = u64plus (ctx->state[7], h);
440     }
441 }