]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - sys/crypto/sha2/sha512c.c
MFC r292782: Replace sys/crypto/sha2/sha2.c with lib/libmd/sha512c.c
[FreeBSD/stable/10.git] / sys / crypto / sha2 / sha512c.c
1 /*-
2  * Copyright 2005 Colin Percival
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
29
30 #include <sys/endian.h>
31 #include <sys/types.h>
32
33 #ifdef _KERNEL
34 #include <sys/systm.h>
35 #else
36 #include <string.h>
37 #endif
38
39 #include "sha512.h"
40 #include "sha384.h"
41
42 #if BYTE_ORDER == BIG_ENDIAN
43
44 /* Copy a vector of big-endian uint64_t into a vector of bytes */
45 #define be64enc_vect(dst, src, len)     \
46         memcpy((void *)dst, (const void *)src, (size_t)len)
47
48 /* Copy a vector of bytes into a vector of big-endian uint64_t */
49 #define be64dec_vect(dst, src, len)     \
50         memcpy((void *)dst, (const void *)src, (size_t)len)
51
52 #else /* BYTE_ORDER != BIG_ENDIAN */
53
54 /*
55  * Encode a length len/4 vector of (uint64_t) into a length len vector of
56  * (unsigned char) in big-endian form.  Assumes len is a multiple of 8.
57  */
58 static void
59 be64enc_vect(unsigned char *dst, const uint64_t *src, size_t len)
60 {
61         size_t i;
62
63         for (i = 0; i < len / 8; i++)
64                 be64enc(dst + i * 8, src[i]);
65 }
66
67 /*
68  * Decode a big-endian length len vector of (unsigned char) into a length
69  * len/4 vector of (uint64_t).  Assumes len is a multiple of 8.
70  */
71 static void
72 be64dec_vect(uint64_t *dst, const unsigned char *src, size_t len)
73 {
74         size_t i;
75
76         for (i = 0; i < len / 8; i++)
77                 dst[i] = be64dec(src + i * 8);
78 }
79
80 #endif /* BYTE_ORDER != BIG_ENDIAN */
81
82 /* Elementary functions used by SHA512 */
83 #define Ch(x, y, z)     ((x & (y ^ z)) ^ z)
84 #define Maj(x, y, z)    ((x & (y | z)) | (y & z))
85 #define SHR(x, n)       (x >> n)
86 #define ROTR(x, n)      ((x >> n) | (x << (64 - n)))
87 #define S0(x)           (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
88 #define S1(x)           (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
89 #define s0(x)           (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
90 #define s1(x)           (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6))
91
92 /* SHA512 round function */
93 #define RND(a, b, c, d, e, f, g, h, k)                  \
94         t0 = h + S1(e) + Ch(e, f, g) + k;               \
95         t1 = S0(a) + Maj(a, b, c);                      \
96         d += t0;                                        \
97         h  = t0 + t1;
98
99 /* Adjusted round function for rotating state */
100 #define RNDr(S, W, i, k)                        \
101         RND(S[(80 - i) % 8], S[(81 - i) % 8],   \
102             S[(82 - i) % 8], S[(83 - i) % 8],   \
103             S[(84 - i) % 8], S[(85 - i) % 8],   \
104             S[(86 - i) % 8], S[(87 - i) % 8],   \
105             W[i] + k)
106
107 /*
108  * SHA512 block compression function.  The 512-bit state is transformed via
109  * the 512-bit input block to produce a new state.
110  */
111 static void
112 SHA512_Transform(uint64_t * state, const unsigned char block[SHA512_BLOCK_LENGTH])
113 {
114         uint64_t W[80];
115         uint64_t S[8];
116         uint64_t t0, t1;
117         int i;
118
119         /* 1. Prepare message schedule W. */
120         be64dec_vect(W, block, SHA512_BLOCK_LENGTH);
121         for (i = 16; i < 80; i++)
122                 W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
123
124         /* 2. Initialize working variables. */
125         memcpy(S, state, SHA512_DIGEST_LENGTH);
126
127         /* 3. Mix. */
128         RNDr(S, W, 0, 0x428a2f98d728ae22ULL);
129         RNDr(S, W, 1, 0x7137449123ef65cdULL);
130         RNDr(S, W, 2, 0xb5c0fbcfec4d3b2fULL);
131         RNDr(S, W, 3, 0xe9b5dba58189dbbcULL);
132         RNDr(S, W, 4, 0x3956c25bf348b538ULL);
133         RNDr(S, W, 5, 0x59f111f1b605d019ULL);
134         RNDr(S, W, 6, 0x923f82a4af194f9bULL);
135         RNDr(S, W, 7, 0xab1c5ed5da6d8118ULL);
136         RNDr(S, W, 8, 0xd807aa98a3030242ULL);
137         RNDr(S, W, 9, 0x12835b0145706fbeULL);
138         RNDr(S, W, 10, 0x243185be4ee4b28cULL);
139         RNDr(S, W, 11, 0x550c7dc3d5ffb4e2ULL);
140         RNDr(S, W, 12, 0x72be5d74f27b896fULL);
141         RNDr(S, W, 13, 0x80deb1fe3b1696b1ULL);
142         RNDr(S, W, 14, 0x9bdc06a725c71235ULL);
143         RNDr(S, W, 15, 0xc19bf174cf692694ULL);
144         RNDr(S, W, 16, 0xe49b69c19ef14ad2ULL);
145         RNDr(S, W, 17, 0xefbe4786384f25e3ULL);
146         RNDr(S, W, 18, 0x0fc19dc68b8cd5b5ULL);
147         RNDr(S, W, 19, 0x240ca1cc77ac9c65ULL);
148         RNDr(S, W, 20, 0x2de92c6f592b0275ULL);
149         RNDr(S, W, 21, 0x4a7484aa6ea6e483ULL);
150         RNDr(S, W, 22, 0x5cb0a9dcbd41fbd4ULL);
151         RNDr(S, W, 23, 0x76f988da831153b5ULL);
152         RNDr(S, W, 24, 0x983e5152ee66dfabULL);
153         RNDr(S, W, 25, 0xa831c66d2db43210ULL);
154         RNDr(S, W, 26, 0xb00327c898fb213fULL);
155         RNDr(S, W, 27, 0xbf597fc7beef0ee4ULL);
156         RNDr(S, W, 28, 0xc6e00bf33da88fc2ULL);
157         RNDr(S, W, 29, 0xd5a79147930aa725ULL);
158         RNDr(S, W, 30, 0x06ca6351e003826fULL);
159         RNDr(S, W, 31, 0x142929670a0e6e70ULL);
160         RNDr(S, W, 32, 0x27b70a8546d22ffcULL);
161         RNDr(S, W, 33, 0x2e1b21385c26c926ULL);
162         RNDr(S, W, 34, 0x4d2c6dfc5ac42aedULL);
163         RNDr(S, W, 35, 0x53380d139d95b3dfULL);
164         RNDr(S, W, 36, 0x650a73548baf63deULL);
165         RNDr(S, W, 37, 0x766a0abb3c77b2a8ULL);
166         RNDr(S, W, 38, 0x81c2c92e47edaee6ULL);
167         RNDr(S, W, 39, 0x92722c851482353bULL);
168         RNDr(S, W, 40, 0xa2bfe8a14cf10364ULL);
169         RNDr(S, W, 41, 0xa81a664bbc423001ULL);
170         RNDr(S, W, 42, 0xc24b8b70d0f89791ULL);
171         RNDr(S, W, 43, 0xc76c51a30654be30ULL);
172         RNDr(S, W, 44, 0xd192e819d6ef5218ULL);
173         RNDr(S, W, 45, 0xd69906245565a910ULL);
174         RNDr(S, W, 46, 0xf40e35855771202aULL);
175         RNDr(S, W, 47, 0x106aa07032bbd1b8ULL);
176         RNDr(S, W, 48, 0x19a4c116b8d2d0c8ULL);
177         RNDr(S, W, 49, 0x1e376c085141ab53ULL);
178         RNDr(S, W, 50, 0x2748774cdf8eeb99ULL);
179         RNDr(S, W, 51, 0x34b0bcb5e19b48a8ULL);
180         RNDr(S, W, 52, 0x391c0cb3c5c95a63ULL);
181         RNDr(S, W, 53, 0x4ed8aa4ae3418acbULL);
182         RNDr(S, W, 54, 0x5b9cca4f7763e373ULL);
183         RNDr(S, W, 55, 0x682e6ff3d6b2b8a3ULL);
184         RNDr(S, W, 56, 0x748f82ee5defb2fcULL);
185         RNDr(S, W, 57, 0x78a5636f43172f60ULL);
186         RNDr(S, W, 58, 0x84c87814a1f0ab72ULL);
187         RNDr(S, W, 59, 0x8cc702081a6439ecULL);
188         RNDr(S, W, 60, 0x90befffa23631e28ULL);
189         RNDr(S, W, 61, 0xa4506cebde82bde9ULL);
190         RNDr(S, W, 62, 0xbef9a3f7b2c67915ULL);
191         RNDr(S, W, 63, 0xc67178f2e372532bULL);
192         RNDr(S, W, 64, 0xca273eceea26619cULL);
193         RNDr(S, W, 65, 0xd186b8c721c0c207ULL);
194         RNDr(S, W, 66, 0xeada7dd6cde0eb1eULL);
195         RNDr(S, W, 67, 0xf57d4f7fee6ed178ULL);
196         RNDr(S, W, 68, 0x06f067aa72176fbaULL);
197         RNDr(S, W, 69, 0x0a637dc5a2c898a6ULL);
198         RNDr(S, W, 70, 0x113f9804bef90daeULL);
199         RNDr(S, W, 71, 0x1b710b35131c471bULL);
200         RNDr(S, W, 72, 0x28db77f523047d84ULL);
201         RNDr(S, W, 73, 0x32caab7b40c72493ULL);
202         RNDr(S, W, 74, 0x3c9ebe0a15c9bebcULL);
203         RNDr(S, W, 75, 0x431d67c49c100d4cULL);
204         RNDr(S, W, 76, 0x4cc5d4becb3e42b6ULL);
205         RNDr(S, W, 77, 0x597f299cfc657e2aULL);
206         RNDr(S, W, 78, 0x5fcb6fab3ad6faecULL);
207         RNDr(S, W, 79, 0x6c44198c4a475817ULL);
208
209         /* 4. Mix local working variables into global state */
210         for (i = 0; i < 8; i++)
211                 state[i] += S[i];
212 }
213
214 static unsigned char PAD[SHA512_BLOCK_LENGTH] = {
215         0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
216         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
217         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
218         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
219         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
220         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
221         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
222         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
223 };
224
225 /* Add padding and terminating bit-count. */
226 static void
227 SHA512_Pad(SHA512_CTX * ctx)
228 {
229         unsigned char len[16];
230         uint64_t r, plen;
231
232         /*
233          * Convert length to a vector of bytes -- we do this now rather
234          * than later because the length will change after we pad.
235          */
236         be64enc_vect(len, ctx->count, 16);
237
238         /* Add 1--128 bytes so that the resulting length is 112 mod 128 */
239         r = (ctx->count[1] >> 3) & 0x7f;
240         plen = (r < 112) ? (112 - r) : (240 - r);
241         SHA512_Update(ctx, PAD, (size_t)plen);
242
243         /* Add the terminating bit-count */
244         SHA512_Update(ctx, len, 16);
245 }
246
247 /* SHA-512 initialization.  Begins a SHA-512 operation. */
248 void
249 SHA512_Init(SHA512_CTX * ctx)
250 {
251
252         /* Zero bits processed so far */
253         ctx->count[0] = ctx->count[1] = 0;
254
255         /* Magic initialization constants */
256         ctx->state[0] = 0x6a09e667f3bcc908ULL;
257         ctx->state[1] = 0xbb67ae8584caa73bULL;
258         ctx->state[2] = 0x3c6ef372fe94f82bULL;
259         ctx->state[3] = 0xa54ff53a5f1d36f1ULL;
260         ctx->state[4] = 0x510e527fade682d1ULL;
261         ctx->state[5] = 0x9b05688c2b3e6c1fULL;
262         ctx->state[6] = 0x1f83d9abfb41bd6bULL;
263         ctx->state[7] = 0x5be0cd19137e2179ULL;
264 }
265
266 /* Add bytes into the hash */
267 void
268 SHA512_Update(SHA512_CTX * ctx, const void *in, size_t len)
269 {
270         uint64_t bitlen[2];
271         uint64_t r;
272         const unsigned char *src = in;
273
274         /* Number of bytes left in the buffer from previous updates */
275         r = (ctx->count[1] >> 3) & 0x7f;
276
277         /* Convert the length into a number of bits */
278         bitlen[1] = ((uint64_t)len) << 3;
279         bitlen[0] = ((uint64_t)len) >> 61;
280
281         /* Update number of bits */
282         if ((ctx->count[1] += bitlen[1]) < bitlen[1])
283                 ctx->count[0]++;
284         ctx->count[0] += bitlen[0];
285
286         /* Handle the case where we don't need to perform any transforms */
287         if (len < SHA512_BLOCK_LENGTH - r) {
288                 memcpy(&ctx->buf[r], src, len);
289                 return;
290         }
291
292         /* Finish the current block */
293         memcpy(&ctx->buf[r], src, SHA512_BLOCK_LENGTH - r);
294         SHA512_Transform(ctx->state, ctx->buf);
295         src += SHA512_BLOCK_LENGTH - r;
296         len -= SHA512_BLOCK_LENGTH - r;
297
298         /* Perform complete blocks */
299         while (len >= SHA512_BLOCK_LENGTH) {
300                 SHA512_Transform(ctx->state, src);
301                 src += SHA512_BLOCK_LENGTH;
302                 len -= SHA512_BLOCK_LENGTH;
303         }
304
305         /* Copy left over data into buffer */
306         memcpy(ctx->buf, src, len);
307 }
308
309 /*
310  * SHA-512 finalization.  Pads the input data, exports the hash value,
311  * and clears the context state.
312  */
313 void
314 SHA512_Final(unsigned char digest[SHA512_DIGEST_LENGTH], SHA512_CTX * ctx)
315 {
316
317         /* Add padding */
318         SHA512_Pad(ctx);
319
320         /* Write the hash */
321         be64enc_vect(digest, ctx->state, SHA512_DIGEST_LENGTH);
322
323         /* Clear the context state */
324         memset((void *)ctx, 0, sizeof(*ctx));
325 }
326
327 /*** SHA-384: *********************************************************/
328 /*
329  * the SHA384 and SHA512 transforms are identical, so SHA384 is skipped
330  */
331
332 /* SHA-384 initialization.  Begins a SHA-384 operation. */
333 void
334 SHA384_Init(SHA384_CTX * ctx)
335 {
336
337         /* Zero bits processed so far */
338         ctx->count[0] = ctx->count[1] = 0;
339
340         /* Magic initialization constants */
341         ctx->state[0] = 0xcbbb9d5dc1059ed8ULL;
342         ctx->state[1] = 0x629a292a367cd507ULL;
343         ctx->state[2] = 0x9159015a3070dd17ULL;
344         ctx->state[3] = 0x152fecd8f70e5939ULL;
345         ctx->state[4] = 0x67332667ffc00b31ULL;
346         ctx->state[5] = 0x8eb44a8768581511ULL;
347         ctx->state[6] = 0xdb0c2e0d64f98fa7ULL;
348         ctx->state[7] = 0x47b5481dbefa4fa4ULL;
349 }
350
351 /* Add bytes into the SHA-384 hash */
352 void
353 SHA384_Update(SHA384_CTX * ctx, const void *in, size_t len)
354 {
355
356         SHA512_Update((SHA512_CTX *)ctx, in, len);
357 }
358
359 /*
360  * SHA-384 finalization.  Pads the input data, exports the hash value,
361  * and clears the context state.
362  */
363 void
364 SHA384_Final(unsigned char digest[SHA384_DIGEST_LENGTH], SHA384_CTX * ctx)
365 {
366
367         /* Add padding */
368         SHA512_Pad((SHA512_CTX *)ctx);
369
370         /* Write the hash */
371         be64enc_vect(digest, ctx->state, SHA384_DIGEST_LENGTH);
372
373         /* Clear the context state */
374         memset((void *)ctx, 0, sizeof(*ctx));
375 }
376
377 #ifdef WEAK_REFS
378 /* When building libmd, provide weak references. Note: this is not
379    activated in the context of compiling these sources for internal
380    use in libcrypt.
381  */
382 #undef SHA512_Init
383 __weak_reference(_libmd_SHA512_Init, SHA512_Init);
384 #undef SHA512_Update
385 __weak_reference(_libmd_SHA512_Update, SHA512_Update);
386 #undef SHA512_Final
387 __weak_reference(_libmd_SHA512_Final, SHA512_Final);
388 #undef SHA512_Transform
389 __weak_reference(_libmd_SHA512_Transform, SHA512_Transform);
390
391 #undef SHA384_Init
392 __weak_reference(_libmd_SHA384_Init, SHA384_Init);
393 #undef SHA384_Update
394 __weak_reference(_libmd_SHA384_Update, SHA384_Update);
395 #undef SHA384_Final
396 __weak_reference(_libmd_SHA384_Final, SHA384_Final);
397 #endif