27 #if defined(MBEDTLS_SHA512_C)
33 #if defined(_MSC_VER) || defined(__WATCOMC__)
34 #define UL64(x) x##ui64
36 #define UL64(x) x##ULL
43 #define SHA512_VALIDATE_RET(cond) \
44 MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_SHA512_BAD_INPUT_DATA)
45 #define SHA512_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE(cond)
47 #if !defined(MBEDTLS_SHA512_ALT)
49 #if defined(MBEDTLS_SHA512_SMALLER)
55 #define sha512_put_uint64_be MBEDTLS_PUT_UINT64_BE
89 #if !defined(MBEDTLS_SHA512_NO_SHA384)
100 ctx->state[0] =
UL64(0x6A09E667F3BCC908);
101 ctx->state[1] =
UL64(0xBB67AE8584CAA73B);
102 ctx->state[2] =
UL64(0x3C6EF372FE94F82B);
103 ctx->state[3] =
UL64(0xA54FF53A5F1D36F1);
104 ctx->state[4] =
UL64(0x510E527FADE682D1);
105 ctx->state[5] =
UL64(0x9B05688C2B3E6C1F);
106 ctx->state[6] =
UL64(0x1F83D9ABFB41BD6B);
107 ctx->state[7] =
UL64(0x5BE0CD19137E2179);
109 #if defined(MBEDTLS_SHA512_NO_SHA384)
113 ctx->state[0] =
UL64(0xCBBB9D5DC1059ED8);
114 ctx->state[1] =
UL64(0x629A292A367CD507);
115 ctx->state[2] =
UL64(0x9159015A3070DD17);
116 ctx->state[3] =
UL64(0x152FECD8F70E5939);
117 ctx->state[4] =
UL64(0x67332667FFC00B31);
118 ctx->state[5] =
UL64(0x8EB44A8768581511);
119 ctx->state[6] =
UL64(0xDB0C2E0D64F98FA7);
120 ctx->state[7] =
UL64(0x47B5481DBEFA4FA4);
124 #if !defined(MBEDTLS_SHA512_NO_SHA384)
131 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
139 #if !defined(MBEDTLS_SHA512_PROCESS_ALT)
146 UL64(0x428A2F98D728AE22),
UL64(0x7137449123EF65CD),
147 UL64(0xB5C0FBCFEC4D3B2F),
UL64(0xE9B5DBA58189DBBC),
148 UL64(0x3956C25BF348B538),
UL64(0x59F111F1B605D019),
149 UL64(0x923F82A4AF194F9B),
UL64(0xAB1C5ED5DA6D8118),
150 UL64(0xD807AA98A3030242),
UL64(0x12835B0145706FBE),
151 UL64(0x243185BE4EE4B28C),
UL64(0x550C7DC3D5FFB4E2),
152 UL64(0x72BE5D74F27B896F),
UL64(0x80DEB1FE3B1696B1),
153 UL64(0x9BDC06A725C71235),
UL64(0xC19BF174CF692694),
154 UL64(0xE49B69C19EF14AD2),
UL64(0xEFBE4786384F25E3),
155 UL64(0x0FC19DC68B8CD5B5),
UL64(0x240CA1CC77AC9C65),
156 UL64(0x2DE92C6F592B0275),
UL64(0x4A7484AA6EA6E483),
157 UL64(0x5CB0A9DCBD41FBD4),
UL64(0x76F988DA831153B5),
158 UL64(0x983E5152EE66DFAB),
UL64(0xA831C66D2DB43210),
159 UL64(0xB00327C898FB213F),
UL64(0xBF597FC7BEEF0EE4),
160 UL64(0xC6E00BF33DA88FC2),
UL64(0xD5A79147930AA725),
161 UL64(0x06CA6351E003826F),
UL64(0x142929670A0E6E70),
162 UL64(0x27B70A8546D22FFC),
UL64(0x2E1B21385C26C926),
163 UL64(0x4D2C6DFC5AC42AED),
UL64(0x53380D139D95B3DF),
164 UL64(0x650A73548BAF63DE),
UL64(0x766A0ABB3C77B2A8),
165 UL64(0x81C2C92E47EDAEE6),
UL64(0x92722C851482353B),
166 UL64(0xA2BFE8A14CF10364),
UL64(0xA81A664BBC423001),
167 UL64(0xC24B8B70D0F89791),
UL64(0xC76C51A30654BE30),
168 UL64(0xD192E819D6EF5218),
UL64(0xD69906245565A910),
169 UL64(0xF40E35855771202A),
UL64(0x106AA07032BBD1B8),
170 UL64(0x19A4C116B8D2D0C8),
UL64(0x1E376C085141AB53),
171 UL64(0x2748774CDF8EEB99),
UL64(0x34B0BCB5E19B48A8),
172 UL64(0x391C0CB3C5C95A63),
UL64(0x4ED8AA4AE3418ACB),
173 UL64(0x5B9CCA4F7763E373),
UL64(0x682E6FF3D6B2B8A3),
174 UL64(0x748F82EE5DEFB2FC),
UL64(0x78A5636F43172F60),
175 UL64(0x84C87814A1F0AB72),
UL64(0x8CC702081A6439EC),
176 UL64(0x90BEFFFA23631E28),
UL64(0xA4506CEBDE82BDE9),
177 UL64(0xBEF9A3F7B2C67915),
UL64(0xC67178F2E372532B),
178 UL64(0xCA273ECEEA26619C),
UL64(0xD186B8C721C0C207),
179 UL64(0xEADA7DD6CDE0EB1E),
UL64(0xF57D4F7FEE6ED178),
180 UL64(0x06F067AA72176FBA),
UL64(0x0A637DC5A2C898A6),
181 UL64(0x113F9804BEF90DAE),
UL64(0x1B710B35131C471B),
182 UL64(0x28DB77F523047D84),
UL64(0x32CAAB7B40C72493),
183 UL64(0x3C9EBE0A15C9BEBC),
UL64(0x431D67C49C100D4C),
184 UL64(0x4CC5D4BECB3E42B6),
UL64(0x597F299CFC657E2A),
185 UL64(0x5FCB6FAB3AD6FAEC),
UL64(0x6C44198C4A475817)
189 const unsigned char data[128])
200 #define SHR(x, n) ((x) >> (n))
201 #define ROTR(x, n) (SHR((x), (n)) | ((x) << (64 - (n))))
203 #define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
204 #define S1(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6))
206 #define S2(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
207 #define S3(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
209 #define F0(x, y, z) (((x) & (y)) | ((z) & ((x) | (y))))
210 #define F1(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
212 #define P(a, b, c, d, e, f, g, h, x, K) \
215 local.temp1 = (h) + S3(e) + F1((e), (f), (g)) + (K) + (x); \
216 local.temp2 = S2(a) + F0((a), (b), (c)); \
217 (d) += local.temp1; (h) = local.temp1 + local.temp2; \
220 for (
i = 0;
i < 8;
i++) {
224 #if defined(MBEDTLS_SHA512_SMALLER)
225 for (
i = 0;
i < 80;
i++) {
243 for (
i = 0;
i < 16;
i++) {
247 for (;
i < 80;
i++) {
273 for (
i = 0;
i < 8;
i++) {
283 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
285 const unsigned char data[128])
296 const unsigned char *
input,
310 left = (
unsigned int) (
ctx->total[0] & 0x7F);
319 if (left && ilen >= fill) {
320 memcpy((
void *) (
ctx->buffer + left),
input, fill);
331 while (ilen >= 128) {
341 memcpy((
void *) (
ctx->buffer + left),
input, ilen);
347 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
349 const unsigned char *
input,
372 used =
ctx->total[0] & 0x7F;
374 ctx->buffer[used++] = 0x80;
378 memset(
ctx->buffer + used, 0, 112 - used);
381 memset(
ctx->buffer + used, 0, 128 - used);
387 memset(
ctx->buffer, 0, 112);
393 high = (
ctx->total[0] >> 61)
394 | (
ctx->total[1] << 3);
395 low = (
ctx->total[0] << 3);
415 #if !defined(MBEDTLS_SHA512_NO_SHA384)
416 truncated =
ctx->is384;
426 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
447 #if !defined(MBEDTLS_SHA512_NO_SHA384)
475 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
485 #if defined(MBEDTLS_SELF_TEST)
490 static const unsigned char sha512_test_buf[3][113] =
494 "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
499 static const size_t sha512_test_buflen[3] =
504 static const unsigned char sha512_test_sum[][64] =
506 #if !defined(MBEDTLS_SHA512_NO_SHA384)
510 { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,
511 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,
512 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,
513 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,
514 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,
515 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 },
516 { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,
517 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,
518 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,
519 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,
520 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,
521 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 },
522 { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB,
523 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C,
524 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52,
525 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B,
526 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB,
527 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 },
533 { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,
534 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,
535 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,
536 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,
537 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,
538 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,
539 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,
540 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F },
541 { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,
542 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,
543 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,
544 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,
545 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,
546 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,
547 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,
548 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 },
549 { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64,
550 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63,
551 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28,
552 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB,
553 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A,
554 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B,
555 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E,
556 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B }
559 #define ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0]))
564 int mbedtls_sha512_self_test(
int verbose)
566 int i, j, k, buflen, ret = 0;
568 unsigned char sha512sum[64];
584 #if !defined(MBEDTLS_SHA512_NO_SHA384)
599 memset(
buf,
'a', buflen = 1000);
601 for (j = 0; j < 1000; j++) {
609 sha512_test_buflen[j]);
619 if (memcmp(sha512sum, sha512_test_sum[
i], 64 - k * 16) != 0) {
#define MBEDTLS_PUT_UINT64_BE(n, data, offset)
Put in memory a 64 bits unsigned integer in big-endian order.
#define MBEDTLS_GET_UINT64_BE(data, offset)
Get the unsigned 64 bits integer corresponding to eight bytes in big-endian order (MSB first).
unsigned int
A callback function used to compare two keys in a database.
static SQLCHAR output[256]
#define ARRAY_LENGTH(array)
#define sha512_put_uint64_be
#define P(a, b, c, d, e, f, g, h, x, K)
#define SHA512_VALIDATE(cond)
static const uint64_t K[80]
#define SHA512_VALIDATE_RET(cond)
This file contains SHA-384 and SHA-512 definitions and functions.
int mbedtls_sha512_ret(const unsigned char *input, size_t ilen, unsigned char output[64], int is384)
This function calculates the SHA-512 or SHA-384 checksum of a buffer.
void mbedtls_sha512_starts(mbedtls_sha512_context *ctx, int is384)
This function starts a SHA-384 or SHA-512 checksum calculation.
int mbedtls_internal_sha512_process(mbedtls_sha512_context *ctx, const unsigned char data[128])
This function processes a single data block within the ongoing SHA-512 computation.
void mbedtls_sha512_process(mbedtls_sha512_context *ctx, const unsigned char data[128])
This function processes a single data block within the ongoing SHA-512 computation.
void mbedtls_sha512_clone(mbedtls_sha512_context *dst, const mbedtls_sha512_context *src)
This function clones the state of a SHA-512 context.
void mbedtls_sha512_update(mbedtls_sha512_context *ctx, const unsigned char *input, size_t ilen)
This function feeds an input buffer into an ongoing SHA-512 checksum calculation.
void mbedtls_sha512_free(mbedtls_sha512_context *ctx)
This function clears a SHA-512 context.
#define MBEDTLS_ERR_SHA512_BAD_INPUT_DATA
SHA-512 input data was malformed.
void mbedtls_sha512(const unsigned char *input, size_t ilen, unsigned char output[64], int is384)
This function calculates the SHA-512 or SHA-384 checksum of a buffer.
int mbedtls_sha512_starts_ret(mbedtls_sha512_context *ctx, int is384)
This function starts a SHA-384 or SHA-512 checksum calculation.
void mbedtls_sha512_finish(mbedtls_sha512_context *ctx, unsigned char output[64])
This function finishes the SHA-512 operation, and writes the result to the output buffer.
int mbedtls_sha512_update_ret(mbedtls_sha512_context *ctx, const unsigned char *input, size_t ilen)
This function feeds an input buffer into an ongoing SHA-512 checksum calculation.
int mbedtls_sha512_finish_ret(mbedtls_sha512_context *ctx, unsigned char output[64])
This function finishes the SHA-512 operation, and writes the result to the output buffer.
void mbedtls_sha512_init(mbedtls_sha512_context *ctx)
This function initializes a SHA-512 context.
Error to string translation.
#define MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED
This is a bug in the library.
unsigned __int64 uint64_t
The SHA-512 context structure.