varnish-cache/lib/libvarnish/vsha256.c
0
/*-
1
 * Copyright 2005 Colin Percival
2
 * All rights reserved.
3
 *
4
 * SPDX-License-Identifier: BSD-2-Clause
5
 *
6
 * Redistribution and use in source and binary forms, with or without
7
 * modification, are permitted provided that the following conditions
8
 * are met:
9
 * 1. Redistributions of source code must retain the above copyright
10
 *    notice, this list of conditions and the following disclaimer.
11
 * 2. Redistributions in binary form must reproduce the above copyright
12
 *    notice, this list of conditions and the following disclaimer in the
13
 *    documentation and/or other materials provided with the distribution.
14
 *
15
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25
 * SUCH DAMAGE.
26
 *
27
 * From:
28
 * $FreeBSD: sys/crypto/sha2/sha256c.c 300966 2016-05-29 17:26:40Z cperciva $
29
 */
30
31
#include "config.h"
32
33
#ifndef __DARWIN_BYTE_ORDER
34
#  include <endian.h>
35
#  ifdef _BYTE_ORDER
36
#    define VBYTE_ORDER _BYTE_ORDER
37
#  else
38
#    define VBYTE_ORDER __BYTE_ORDER
39
#  endif
40
#  ifdef _BIG_ENDIAN
41
#    define VBIG_ENDIAN _BIG_ENDIAN
42
#  else
43
#    define VBIG_ENDIAN __BIG_ENDIAN
44
#  endif
45
#else
46
#  define VBYTE_ORDER   __DARWIN_BYTE_ORDER
47
#  define VBIG_ENDIAN   __DARWIN_BIG_ENDIAN
48
#endif
49
50
#ifndef VBYTE_ORDER
51
# error VBYTE_ORDER not defined
52
#endif
53
#ifndef VBIG_ENDIAN
54
# error VBIG_ENDIAN not defined
55
#endif
56
57
58
#include <sys/types.h>
59
#include <stdint.h>
60
#include <string.h>
61
62
#include "vdef.h"
63
64
#include "vas.h"
65
#include "vend.h"
66
#include "vsha256.h"
67
68
#if VBYTE_ORDER == VBIG_ENDIAN
69
70
/* Copy a vector of big-endian uint32_t into a vector of bytes */
71
#define be32enc_vect(dst, src, len)     \
72
        memcpy((void *)dst, (const void *)src, (size_t)len)
73
74
/* Copy a vector of bytes into a vector of big-endian uint32_t */
75
#define be32dec_vect(dst, src, len)     \
76
        memcpy((void *)dst, (const void *)src, (size_t)len)
77
78
#else /* BYTE_ORDER != BIG_ENDIAN or in doubt... */
79
80
/*
81
 * Encode a length len/4 vector of (uint32_t) into a length len vector of
82
 * (unsigned char) in big-endian form.  Assumes len is a multiple of 4.
83
 */
84
static void
85 525086
be32enc_vect(unsigned char *dst, const uint32_t *src, size_t len)
86
{
87
        size_t i;
88
89 4725520
        for (i = 0; i < len / 4; i++)
90 4200434
                vbe32enc(dst + i * 4, src[i]);
91 525086
}
92
93
/*
94
 * Decode a big-endian length len vector of (unsigned char) into a length
95
 * len/4 vector of (uint32_t).  Assumes len is a multiple of 4.
96
 */
97
static void
98 1001356
be32dec_vect(uint32_t *dst, const unsigned char *src, size_t len)
99
{
100
        size_t i;
101
102 17022537
        for (i = 0; i < len / 4; i++)
103 16021181
                dst[i] = vbe32dec(src + i * 4);
104 1001356
}
105
106
#endif /* BYTE_ORDER != BIG_ENDIAN */
107
108
/* SHA256 round constants. */
109
static const uint32_t K[64] = {
110
        0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
111
        0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
112
        0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
113
        0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
114
        0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
115
        0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
116
        0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
117
        0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
118
        0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
119
        0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
120
        0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
121
        0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
122
        0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
123
        0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
124
        0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
125
        0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
126
};
127
128
/* Elementary functions used by SHA256 */
129
#define Ch(x, y, z)     ((x & (y ^ z)) ^ z)
130
#define Maj(x, y, z)    ((x & (y | z)) | (y & z))
131
#define SHR(x, n)       (x >> n)
132
#define ROTR(x, n)      ((x >> n) | (x << (32 - n)))
133
#define S0(x)           (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
134
#define S1(x)           (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
135
#define s0(x)           (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))
136
#define s1(x)           (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))
137
138
/* SHA256 round function */
139
#define RND(a, b, c, d, e, f, g, h, k)                          \
140
        do {                                                    \
141
                h += S1(e) + Ch(e, f, g) + (k);                 \
142
                d += h;                                         \
143
                h += S0(a) + Maj(a, b, c);                      \
144
        } while (0)
145
146
/* Adjusted round function for rotating state */
147
#define RNDr(S, W, i, ii)                       \
148
        RND(S[(64 - i) % 8], S[(65 - i) % 8],   \
149
            S[(66 - i) % 8], S[(67 - i) % 8],   \
150
            S[(68 - i) % 8], S[(69 - i) % 8],   \
151
            S[(70 - i) % 8], S[(71 - i) % 8],   \
152
            W[i + ii] + K[i + ii])
153
154
/* Message schedule computation */
155
#define MSCH(W, ii, i)                                          \
156
        do {                                                    \
157
                W[i + ii + 16] =                                \
158
                    s1(W[i + ii + 14]) + W[i + ii + 9] +        \
159
                    s0(W[i + ii + 1]) + W[i + ii];              \
160
        } while (0)
161
162
/*
163
 * SHA256 block compression function.  The 256-bit state is transformed via
164
 * the 512-bit input block to produce a new state.
165
 */
166
static void
167 1001371
VSHA256_Transform(uint32_t * state, const unsigned char block[64])
168
{
169
        uint32_t W[64];
170
        uint32_t S[8];
171
        int i;
172
173
        /* 1. Prepare the first part of the message schedule W. */
174 1001371
        be32dec_vect(W, block, 64);
175
176
        /* 2. Initialize working variables. */
177 1001371
        memcpy(S, state, 32);
178
179
        /* 3. Mix. */
180 4005379
        for (i = 0; i < 64; i += 16) {
181 4005376
                RNDr(S, W, 0, i);
182 4005376
                RNDr(S, W, 1, i);
183 4005376
                RNDr(S, W, 2, i);
184 4005376
                RNDr(S, W, 3, i);
185 4005376
                RNDr(S, W, 4, i);
186 4005376
                RNDr(S, W, 5, i);
187 4005376
                RNDr(S, W, 6, i);
188 4005376
                RNDr(S, W, 7, i);
189 4005376
                RNDr(S, W, 8, i);
190 4005376
                RNDr(S, W, 9, i);
191 4005376
                RNDr(S, W, 10, i);
192 4005376
                RNDr(S, W, 11, i);
193 4005376
                RNDr(S, W, 12, i);
194 4005376
                RNDr(S, W, 13, i);
195 4005376
                RNDr(S, W, 14, i);
196 4005376
                RNDr(S, W, 15, i);
197
198 4005376
                if (i == 48)
199 1001368
                        break;
200 3004008
                MSCH(W, 0, i);
201 3004008
                MSCH(W, 1, i);
202 3004008
                MSCH(W, 2, i);
203 3004008
                MSCH(W, 3, i);
204 3004008
                MSCH(W, 4, i);
205 3004008
                MSCH(W, 5, i);
206 3004008
                MSCH(W, 6, i);
207 3004008
                MSCH(W, 7, i);
208 3004008
                MSCH(W, 8, i);
209 3004008
                MSCH(W, 9, i);
210 3004008
                MSCH(W, 10, i);
211 3004008
                MSCH(W, 11, i);
212 3004008
                MSCH(W, 12, i);
213 3004008
                MSCH(W, 13, i);
214 3004008
                MSCH(W, 14, i);
215 3004008
                MSCH(W, 15, i);
216 3004008
        }
217
218
        /* 4. Mix local working variables into global state */
219 9012046
        for (i = 0; i < 8; i++)
220 8010675
                state[i] += S[i];
221 1001365
}
222
223
static const unsigned char PAD[64] = {
224
        0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
225
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
226
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
227
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
228
};
229
230
/* Add padding and terminating bit-count. */
231
static void
232 525088
VSHA256_Pad(VSHA256_CTX * ctx)
233
{
234
        size_t r;
235
236
        /* Figure out how many bytes we have buffered. */
237 525088
        r = (ctx->count >> 3) & 0x3f;
238
239
        /* Pad to 56 mod 64, transforming if we finish a block en route. */
240 525088
        if (r < 56) {
241
                /* Pad to 56 mod 64. */
242 481608
                memcpy(&ctx->buf[r], PAD, 56 - r);
243 481608
        } else {
244
                /* Finish the current block and mix. */
245 43480
                memcpy(&ctx->buf[r], PAD, 64 - r);
246 43480
                VSHA256_Transform(ctx->state, ctx->buf);
247
248
                /* The start of the final block is all zeroes. */
249 43480
                memset(&ctx->buf[0], 0, 56);
250
        }
251
252
        /* Add the terminating bit-count. */
253 525088
        vbe64enc(&ctx->buf[56], ctx->count);
254
255
        /* Mix in the final block. */
256 525088
        VSHA256_Transform(ctx->state, ctx->buf);
257 525088
}
258
259
/* SHA-256 initialization.  Begins a SHA-256 operation. */
260
void
261 508418
VSHA256_Init(VSHA256_CTX * ctx)
262
{
263
264
        /* Zero bits processed so far */
265 508418
        ctx->count = 0;
266
267
        /* Magic initialization constants */
268 508418
        ctx->state[0] = 0x6A09E667;
269 508418
        ctx->state[1] = 0xBB67AE85;
270 508418
        ctx->state[2] = 0x3C6EF372;
271 508418
        ctx->state[3] = 0xA54FF53A;
272 508418
        ctx->state[4] = 0x510E527F;
273 508418
        ctx->state[5] = 0x9B05688C;
274 508418
        ctx->state[6] = 0x1F83D9AB;
275 508418
        ctx->state[7] = 0x5BE0CD19;
276 508418
}
277
278
/* Add bytes into the hash */
279
void
280 21355982
VSHA256_Update(VSHA256_CTX * ctx, const void *in, size_t len)
281
{
282
        uint64_t bitlen;
283
        uint32_t r;
284 21355982
        const unsigned char *src = in;
285
286
        /* Number of bytes left in the buffer from previous updates */
287 21355982
        r = (ctx->count >> 3) & 0x3f;
288
289
        /* Convert the length into a number of bits */
290 21355982
        bitlen = len << 3;
291
292
        /* Update number of bits */
293 21355982
        ctx->count += bitlen;
294
295
        /* Handle the case where we don't need to perform any transforms */
296 21355982
        if (len < 64 - r) {
297 20940118
                memcpy(&ctx->buf[r], src, len);
298 20940118
                return;
299
        }
300
301
        /* Finish the current block */
302 415864
        memcpy(&ctx->buf[r], src, 64 - r);
303 415864
        VSHA256_Transform(ctx->state, ctx->buf);
304 415864
        src += 64 - r;
305 415864
        len -= 64 - r;
306
307
        /* Perform complete blocks */
308 432784
        while (len >= 64) {
309 16920
                VSHA256_Transform(ctx->state, src);
310 16920
                src += 64;
311 16920
                len -= 64;
312
        }
313
314
        /* Copy left over data into buffer */
315 415864
        memcpy(ctx->buf, src, len);
316 21355982
}
317
318
/*
319
 * SHA-256 finalization.  Pads the input data, exports the hash value,
320
 * and clears the context state.
321
 */
322
void
323 525088
VSHA256_Final(unsigned char digest[static VSHA256_DIGEST_LENGTH],
324
    VSHA256_CTX *ctx)
325
{
326
327
        /* Add padding */
328 525088
        VSHA256_Pad(ctx);
329
330
        /* Write the hash */
331 525088
        be32enc_vect(digest, ctx->state, VSHA256_DIGEST_LENGTH);
332
333
        /* Clear the context state */
334 525088
        memset((void *)ctx, 0, sizeof(*ctx));
335 525088
}
336
337
/*
338
 * A few test-vectors, just in case
339
 */
340
341
static const struct sha256test {
342
        const char              *input;
343
        const unsigned char     output[32];
344
} sha256test[] = {
345
    { "",
346
        {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4,
347
         0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b,
348
         0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55} },
349
    { "message digest",
350
        {0xf7, 0x84, 0x6f, 0x55, 0xcf, 0x23, 0xe1, 0x4e, 0xeb, 0xea, 0xb5,
351
         0xb4, 0xe1, 0x55, 0x0c, 0xad, 0x5b, 0x50, 0x9e, 0x33, 0x48, 0xfb,
352
         0xc4, 0xef, 0xa3, 0xa1, 0x41, 0x3d, 0x39, 0x3c, 0xb6, 0x50} },
353
    { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
354
        {0xdb, 0x4b, 0xfc, 0xbd, 0x4d, 0xa0, 0xcd, 0x85, 0xa6, 0x0c, 0x3c,
355
         0x37, 0xd3, 0xfb, 0xd8, 0x80, 0x5c, 0x77, 0xf1, 0x5f, 0xc6, 0xb1,
356
         0xfd, 0xfe, 0x61, 0x4e, 0xe0, 0xa7, 0xc8, 0xfd, 0xb4, 0xc0} },
357
    { NULL }
358
};
359
360
361
void
362 40800
VSHA256_Test(void)
363
{
364
        struct VSHA256Context c;
365
        const struct sha256test *p;
366
        unsigned char o[32];
367
368 163200
        for (p = sha256test; p->input != NULL; p++) {
369 122400
                VSHA256_Init(&c);
370 122400
                VSHA256_Update(&c, p->input, strlen(p->input));
371 122400
                VSHA256_Final(o, &c);
372 122400
                AZ(memcmp(o, p->output, 32));
373 122400
        }
374 40800
}