File indexing completed on 2025-05-11 08:24:18
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #include <sys/cdefs.h>
0029 __FBSDID("$FreeBSD$");
0030
0031 #include <sys/endian.h>
0032 #include <sys/types.h>
0033
0034 #include <string.h>
0035
0036 #include "sha512.h"
0037 #include "sha512t.h"
0038 #include "sha384.h"
0039
0040 #if BYTE_ORDER == BIG_ENDIAN
0041
0042
0043 #define be64enc_vect(dst, src, len) \
0044 memcpy((void *)dst, (const void *)src, (size_t)len)
0045
0046
0047 #define be64dec_vect(dst, src, len) \
0048 memcpy((void *)dst, (const void *)src, (size_t)len)
0049
0050 #else
0051
0052
0053
0054
0055
0056
0057 static inline void
0058 be64enc_vect(unsigned char *dst, const uint64_t *src, size_t len)
0059 {
0060 size_t i;
0061
0062 for (i = 0; i < len / 8; i++)
0063 be64enc(dst + i * 8, src[i]);
0064 if (len % 8 == 4)
0065 be32enc(dst + i * 8, src[i] >> 32);
0066 }
0067
0068
0069
0070
0071
0072 static inline void
0073 be64dec_vect(uint64_t *dst, const unsigned char *src, size_t len)
0074 {
0075 size_t i;
0076
0077 for (i = 0; i < len / 8; i++)
0078 dst[i] = be64dec(src + i * 8);
0079 }
0080
0081 #endif
0082
0083
0084 static const uint64_t K[80] = {
0085 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
0086 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
0087 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
0088 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
0089 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
0090 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
0091 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
0092 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
0093 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
0094 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
0095 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
0096 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
0097 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
0098 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
0099 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
0100 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
0101 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
0102 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
0103 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
0104 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
0105 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
0106 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
0107 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
0108 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
0109 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
0110 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
0111 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
0112 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
0113 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
0114 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
0115 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
0116 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
0117 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
0118 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
0119 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
0120 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
0121 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
0122 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
0123 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
0124 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
0125 };
0126
0127
0128 #define Ch(x, y, z) ((x & (y ^ z)) ^ z)
0129 #define Maj(x, y, z) ((x & (y | z)) | (y & z))
0130 #define SHR(x, n) (x >> n)
0131 #define ROTR(x, n) ((x >> n) | (x << (64 - n)))
0132 #define S0(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
0133 #define S1(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
0134 #define s0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
0135 #define s1(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6))
0136
0137
0138 #define RND(a, b, c, d, e, f, g, h, k) \
0139 h += S1(e) + Ch(e, f, g) + k; \
0140 d += h; \
0141 h += S0(a) + Maj(a, b, c);
0142
0143
0144 #define RNDr(S, W, i, ii) \
0145 RND(S[(80 - i) % 8], S[(81 - i) % 8], \
0146 S[(82 - i) % 8], S[(83 - i) % 8], \
0147 S[(84 - i) % 8], S[(85 - i) % 8], \
0148 S[(86 - i) % 8], S[(87 - i) % 8], \
0149 W[i + ii] + K[i + ii])
0150
0151
0152 #define MSCH(W, ii, i) \
0153 W[i + ii + 16] = s1(W[i + ii + 14]) + W[i + ii + 9] + s0(W[i + ii + 1]) + W[i + ii]
0154
0155
0156
0157
0158
0159 static void
0160 SHA512_Transform(uint64_t * state, const unsigned char block[SHA512_BLOCK_LENGTH])
0161 {
0162 uint64_t W[80];
0163 uint64_t S[8];
0164 int i;
0165
0166
0167 be64dec_vect(W, block, SHA512_BLOCK_LENGTH);
0168
0169
0170 memcpy(S, state, SHA512_DIGEST_LENGTH);
0171
0172
0173 for (i = 0; i < 80; i += 16) {
0174 RNDr(S, W, 0, i);
0175 RNDr(S, W, 1, i);
0176 RNDr(S, W, 2, i);
0177 RNDr(S, W, 3, i);
0178 RNDr(S, W, 4, i);
0179 RNDr(S, W, 5, i);
0180 RNDr(S, W, 6, i);
0181 RNDr(S, W, 7, i);
0182 RNDr(S, W, 8, i);
0183 RNDr(S, W, 9, i);
0184 RNDr(S, W, 10, i);
0185 RNDr(S, W, 11, i);
0186 RNDr(S, W, 12, i);
0187 RNDr(S, W, 13, i);
0188 RNDr(S, W, 14, i);
0189 RNDr(S, W, 15, i);
0190
0191 if (i == 64)
0192 break;
0193 MSCH(W, 0, i);
0194 MSCH(W, 1, i);
0195 MSCH(W, 2, i);
0196 MSCH(W, 3, i);
0197 MSCH(W, 4, i);
0198 MSCH(W, 5, i);
0199 MSCH(W, 6, i);
0200 MSCH(W, 7, i);
0201 MSCH(W, 8, i);
0202 MSCH(W, 9, i);
0203 MSCH(W, 10, i);
0204 MSCH(W, 11, i);
0205 MSCH(W, 12, i);
0206 MSCH(W, 13, i);
0207 MSCH(W, 14, i);
0208 MSCH(W, 15, i);
0209 }
0210
0211
0212 for (i = 0; i < 8; i++)
0213 state[i] += S[i];
0214 }
0215
0216 static const unsigned char PAD[SHA512_BLOCK_LENGTH] = {
0217 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0218 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0219 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0220 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0221 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0222 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0223 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0224 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0225 };
0226
0227
0228 static void
0229 SHA512_Pad(SHA512_CTX * ctx)
0230 {
0231 size_t r;
0232
0233
0234 r = (ctx->count[1] >> 3) & 0x7f;
0235
0236
0237 if (r < 112) {
0238
0239 memcpy(&ctx->buf[r], PAD, 112 - r);
0240 } else {
0241
0242 memcpy(&ctx->buf[r], PAD, 128 - r);
0243 SHA512_Transform(ctx->state, ctx->buf);
0244
0245
0246 memset(&ctx->buf[0], 0, 112);
0247 }
0248
0249
0250 be64enc_vect(&ctx->buf[112], ctx->count, 16);
0251
0252
0253 SHA512_Transform(ctx->state, ctx->buf);
0254 }
0255
0256
0257 void
0258 SHA512_Init(SHA512_CTX * ctx)
0259 {
0260
0261
0262 ctx->count[0] = ctx->count[1] = 0;
0263
0264
0265 ctx->state[0] = 0x6a09e667f3bcc908ULL;
0266 ctx->state[1] = 0xbb67ae8584caa73bULL;
0267 ctx->state[2] = 0x3c6ef372fe94f82bULL;
0268 ctx->state[3] = 0xa54ff53a5f1d36f1ULL;
0269 ctx->state[4] = 0x510e527fade682d1ULL;
0270 ctx->state[5] = 0x9b05688c2b3e6c1fULL;
0271 ctx->state[6] = 0x1f83d9abfb41bd6bULL;
0272 ctx->state[7] = 0x5be0cd19137e2179ULL;
0273 }
0274
0275
0276 void
0277 SHA512_Update(SHA512_CTX * ctx, const void *in, size_t len)
0278 {
0279 uint64_t bitlen[2];
0280 uint64_t r;
0281 const unsigned char *src = in;
0282
0283
0284 r = (ctx->count[1] >> 3) & 0x7f;
0285
0286
0287 bitlen[1] = ((uint64_t)len) << 3;
0288 bitlen[0] = ((uint64_t)len) >> 61;
0289
0290
0291 if ((ctx->count[1] += bitlen[1]) < bitlen[1])
0292 ctx->count[0]++;
0293 ctx->count[0] += bitlen[0];
0294
0295
0296 if (len < SHA512_BLOCK_LENGTH - r) {
0297 memcpy(&ctx->buf[r], src, len);
0298 return;
0299 }
0300
0301
0302 memcpy(&ctx->buf[r], src, SHA512_BLOCK_LENGTH - r);
0303 SHA512_Transform(ctx->state, ctx->buf);
0304 src += SHA512_BLOCK_LENGTH - r;
0305 len -= SHA512_BLOCK_LENGTH - r;
0306
0307
0308 while (len >= SHA512_BLOCK_LENGTH) {
0309 SHA512_Transform(ctx->state, src);
0310 src += SHA512_BLOCK_LENGTH;
0311 len -= SHA512_BLOCK_LENGTH;
0312 }
0313
0314
0315 memcpy(ctx->buf, src, len);
0316 }
0317
0318
0319
0320
0321
0322 void
0323 SHA512_Final(unsigned char digest[static SHA512_DIGEST_LENGTH], SHA512_CTX *ctx)
0324 {
0325
0326
0327 SHA512_Pad(ctx);
0328
0329
0330 be64enc_vect(digest, ctx->state, SHA512_DIGEST_LENGTH);
0331
0332
0333 explicit_bzero(ctx, sizeof(*ctx));
0334 }
0335
0336
0337
0338
0339
0340 void
0341 SHA512_224_Init(SHA512_CTX * ctx)
0342 {
0343
0344
0345 ctx->count[0] = ctx->count[1] = 0;
0346
0347
0348 ctx->state[0] = 0x8c3d37c819544da2ULL;
0349 ctx->state[1] = 0x73e1996689dcd4d6ULL;
0350 ctx->state[2] = 0x1dfab7ae32ff9c82ULL;
0351 ctx->state[3] = 0x679dd514582f9fcfULL;
0352 ctx->state[4] = 0x0f6d2b697bd44da8ULL;
0353 ctx->state[5] = 0x77e36f7304c48942ULL;
0354 ctx->state[6] = 0x3f9d85a86a1d36c8ULL;
0355 ctx->state[7] = 0x1112e6ad91d692a1ULL;
0356 }
0357
0358 void
0359 SHA512_224_Update(SHA512_CTX * ctx, const void *in, size_t len)
0360 {
0361
0362 SHA512_Update(ctx, in, len);
0363 }
0364
0365 void
0366 SHA512_224_Final(unsigned char digest[static SHA512_224_DIGEST_LENGTH], SHA512_CTX * ctx)
0367 {
0368
0369
0370 SHA512_Pad(ctx);
0371
0372
0373 be64enc_vect(digest, ctx->state, SHA512_224_DIGEST_LENGTH);
0374
0375
0376 explicit_bzero(ctx, sizeof(*ctx));
0377 }
0378
0379 void
0380 SHA512_256_Init(SHA512_CTX * ctx)
0381 {
0382
0383
0384 ctx->count[0] = ctx->count[1] = 0;
0385
0386
0387 ctx->state[0] = 0x22312194fc2bf72cULL;
0388 ctx->state[1] = 0x9f555fa3c84c64c2ULL;
0389 ctx->state[2] = 0x2393b86b6f53b151ULL;
0390 ctx->state[3] = 0x963877195940eabdULL;
0391 ctx->state[4] = 0x96283ee2a88effe3ULL;
0392 ctx->state[5] = 0xbe5e1e2553863992ULL;
0393 ctx->state[6] = 0x2b0199fc2c85b8aaULL;
0394 ctx->state[7] = 0x0eb72ddc81c52ca2ULL;
0395 }
0396
0397 void
0398 SHA512_256_Update(SHA512_CTX * ctx, const void *in, size_t len)
0399 {
0400
0401 SHA512_Update(ctx, in, len);
0402 }
0403
0404 void
0405 SHA512_256_Final(unsigned char digest[static SHA512_256_DIGEST_LENGTH], SHA512_CTX * ctx)
0406 {
0407
0408
0409 SHA512_Pad(ctx);
0410
0411
0412 be64enc_vect(digest, ctx->state, SHA512_256_DIGEST_LENGTH);
0413
0414
0415 explicit_bzero(ctx, sizeof(*ctx));
0416 }
0417
0418
0419
0420
0421
0422
0423
0424 void
0425 SHA384_Init(SHA384_CTX * ctx)
0426 {
0427
0428
0429 ctx->count[0] = ctx->count[1] = 0;
0430
0431
0432 ctx->state[0] = 0xcbbb9d5dc1059ed8ULL;
0433 ctx->state[1] = 0x629a292a367cd507ULL;
0434 ctx->state[2] = 0x9159015a3070dd17ULL;
0435 ctx->state[3] = 0x152fecd8f70e5939ULL;
0436 ctx->state[4] = 0x67332667ffc00b31ULL;
0437 ctx->state[5] = 0x8eb44a8768581511ULL;
0438 ctx->state[6] = 0xdb0c2e0d64f98fa7ULL;
0439 ctx->state[7] = 0x47b5481dbefa4fa4ULL;
0440 }
0441
0442
0443 void
0444 SHA384_Update(SHA384_CTX * ctx, const void *in, size_t len)
0445 {
0446
0447 SHA512_Update((SHA512_CTX *)ctx, in, len);
0448 }
0449
0450
0451
0452
0453
0454 void
0455 SHA384_Final(unsigned char digest[static SHA384_DIGEST_LENGTH], SHA384_CTX *ctx)
0456 {
0457
0458
0459 SHA512_Pad((SHA512_CTX *)ctx);
0460
0461
0462 be64enc_vect(digest, ctx->state, SHA384_DIGEST_LENGTH);
0463
0464
0465 explicit_bzero(ctx, sizeof(*ctx));
0466 }