Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 /*************************** sha384-512.c ***************************/
XinZhangMS 0:f7f1f0d76dd6 5 /********************* See RFC 4634 for details *********************/
XinZhangMS 0:f7f1f0d76dd6 6 /*
XinZhangMS 0:f7f1f0d76dd6 7 * Description:
XinZhangMS 0:f7f1f0d76dd6 8 * This file implements the Secure Hash Signature Standard
XinZhangMS 0:f7f1f0d76dd6 9 * algorithms as defined in the National Institute of Standards
XinZhangMS 0:f7f1f0d76dd6 10 * and Technology Federal Information Processing Standards
XinZhangMS 0:f7f1f0d76dd6 11 * Publication (FIPS PUB) 180-1 published on April 17, 1995, 180-2
XinZhangMS 0:f7f1f0d76dd6 12 * published on August 1, 2002, and the FIPS PUB 180-2 Change
XinZhangMS 0:f7f1f0d76dd6 13 * Notice published on February 28, 2004.
XinZhangMS 0:f7f1f0d76dd6 14 *
XinZhangMS 0:f7f1f0d76dd6 15 * A combined document showing all algorithms is available at
XinZhangMS 0:f7f1f0d76dd6 16 * http://csrc.nist.gov/publications/fips/
XinZhangMS 0:f7f1f0d76dd6 17 * fips180-2/fips180-2withchangenotice.pdf
XinZhangMS 0:f7f1f0d76dd6 18 *
XinZhangMS 0:f7f1f0d76dd6 19 * The SHA-384 and SHA-512 algorithms produce 384-bit and 512-bit
XinZhangMS 0:f7f1f0d76dd6 20 * message digests for a given data stream. It should take about
XinZhangMS 0:f7f1f0d76dd6 21 * 2**n steps to find a message with the same digest as a given
XinZhangMS 0:f7f1f0d76dd6 22 * message and 2**(n/2) to find any two messages with the same
XinZhangMS 0:f7f1f0d76dd6 23 * digest, when n is the digest size in bits. Therefore, this
XinZhangMS 0:f7f1f0d76dd6 24 * algorithm can serve as a means of providing a
XinZhangMS 0:f7f1f0d76dd6 25 * "fingerprint" for a message.
XinZhangMS 0:f7f1f0d76dd6 26 *
XinZhangMS 0:f7f1f0d76dd6 27 * Portability Issues:
XinZhangMS 0:f7f1f0d76dd6 28 * SHA-384 and SHA-512 are defined in terms of 64-bit "words",
XinZhangMS 0:f7f1f0d76dd6 29 * but if USE_32BIT_ONLY is #defined, this code is implemented in
XinZhangMS 0:f7f1f0d76dd6 30 * terms of 32-bit "words". This code uses <stdint.h> (included
XinZhangMS 0:f7f1f0d76dd6 31 * via "sha.h") to define the 64, 32 and 8 bit unsigned integer
XinZhangMS 0:f7f1f0d76dd6 32 * types. If your C compiler does not support 64 bit unsigned
XinZhangMS 0:f7f1f0d76dd6 33 * integers, and you do not #define USE_32BIT_ONLY, this code is
XinZhangMS 0:f7f1f0d76dd6 34 * not appropriate.
XinZhangMS 0:f7f1f0d76dd6 35 *
XinZhangMS 0:f7f1f0d76dd6 36 * Caveats:
XinZhangMS 0:f7f1f0d76dd6 37 * SHA-384 and SHA-512 are designed to work with messages less
XinZhangMS 0:f7f1f0d76dd6 38 * than 2^128 bits long. This implementation uses
XinZhangMS 0:f7f1f0d76dd6 39 * SHA384/512Input() to hash the bits that are a multiple of the
XinZhangMS 0:f7f1f0d76dd6 40 * size of an 8-bit character, and then uses SHA384/256FinalBits()
XinZhangMS 0:f7f1f0d76dd6 41 * to hash the final few bits of the input.
XinZhangMS 0:f7f1f0d76dd6 42 *
XinZhangMS 0:f7f1f0d76dd6 43 */
XinZhangMS 0:f7f1f0d76dd6 44
XinZhangMS 0:f7f1f0d76dd6 45 #include <stdlib.h>
XinZhangMS 0:f7f1f0d76dd6 46 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 47
XinZhangMS 0:f7f1f0d76dd6 48 #include "azure_c_shared_utility/sha.h"
XinZhangMS 0:f7f1f0d76dd6 49 #include "azure_c_shared_utility/sha-private.h"
XinZhangMS 0:f7f1f0d76dd6 50
XinZhangMS 0:f7f1f0d76dd6 51 #ifdef USE_32BIT_ONLY
XinZhangMS 0:f7f1f0d76dd6 52 #error IoTHubClient does not support USE_32BIT_ONLY flag
XinZhangMS 0:f7f1f0d76dd6 53 /*
XinZhangMS 0:f7f1f0d76dd6 54 * Define 64-bit arithmetic in terms of 32-bit arithmetic.
XinZhangMS 0:f7f1f0d76dd6 55 * Each 64-bit number is represented in a 2-word array.
XinZhangMS 0:f7f1f0d76dd6 56 * All macros are defined such that the result is the last parameter.
XinZhangMS 0:f7f1f0d76dd6 57 */
XinZhangMS 0:f7f1f0d76dd6 58
XinZhangMS 0:f7f1f0d76dd6 59 /*
XinZhangMS 0:f7f1f0d76dd6 60 * Define shift, rotate left and rotate right functions
XinZhangMS 0:f7f1f0d76dd6 61 */
XinZhangMS 0:f7f1f0d76dd6 62 #define SHA512_SHR(bits, word, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 63 /* (((uint64_t)((word))) >> (bits)) */ \
XinZhangMS 0:f7f1f0d76dd6 64 (ret)[0] = (((bits) < 32) && ((bits) >= 0)) ? \
XinZhangMS 0:f7f1f0d76dd6 65 ((word)[0] >> (bits)) : 0, \
XinZhangMS 0:f7f1f0d76dd6 66 (ret)[1] = ((bits) > 32) ? ((word)[0] >> ((bits) - 32)) : \
XinZhangMS 0:f7f1f0d76dd6 67 ((bits) == 32) ? (word)[0] : \
XinZhangMS 0:f7f1f0d76dd6 68 ((bits) >= 0) ? \
XinZhangMS 0:f7f1f0d76dd6 69 (((word)[0] << (32 - (bits))) | \
XinZhangMS 0:f7f1f0d76dd6 70 ((word)[1] >> (bits))) : 0 )
XinZhangMS 0:f7f1f0d76dd6 71
XinZhangMS 0:f7f1f0d76dd6 72 #define SHA512_SHL(bits, word, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 73 /* (((uint64_t)(word)) << (bits)) */ \
XinZhangMS 0:f7f1f0d76dd6 74 (ret)[0] = ((bits) > 32) ? ((word)[1] << ((bits) - 32)) : \
XinZhangMS 0:f7f1f0d76dd6 75 ((bits) == 32) ? (word)[1] : \
XinZhangMS 0:f7f1f0d76dd6 76 ((bits) >= 0) ? \
XinZhangMS 0:f7f1f0d76dd6 77 (((word)[0] << (bits)) | \
XinZhangMS 0:f7f1f0d76dd6 78 ((word)[1] >> (32 - (bits)))) : \
XinZhangMS 0:f7f1f0d76dd6 79 0, \
XinZhangMS 0:f7f1f0d76dd6 80 (ret)[1] = (((bits) < 32) && ((bits) >= 0)) ? \
XinZhangMS 0:f7f1f0d76dd6 81 ((word)[1] << (bits)) : 0)
XinZhangMS 0:f7f1f0d76dd6 82
XinZhangMS 0:f7f1f0d76dd6 83 /*
XinZhangMS 0:f7f1f0d76dd6 84 * Define 64-bit OR
XinZhangMS 0:f7f1f0d76dd6 85 */
XinZhangMS 0:f7f1f0d76dd6 86 #define SHA512_OR(word1, word2, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 87 (ret)[0] = (word1)[0] | (word2)[0], \
XinZhangMS 0:f7f1f0d76dd6 88 (ret)[1] = (word1)[1] | (word2)[1] )
XinZhangMS 0:f7f1f0d76dd6 89
XinZhangMS 0:f7f1f0d76dd6 90 /*
XinZhangMS 0:f7f1f0d76dd6 91 * Define 64-bit XOR
XinZhangMS 0:f7f1f0d76dd6 92 */
XinZhangMS 0:f7f1f0d76dd6 93 #define SHA512_XOR(word1, word2, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 94 (ret)[0] = (word1)[0] ^ (word2)[0], \
XinZhangMS 0:f7f1f0d76dd6 95 (ret)[1] = (word1)[1] ^ (word2)[1] )
XinZhangMS 0:f7f1f0d76dd6 96
XinZhangMS 0:f7f1f0d76dd6 97 /*
XinZhangMS 0:f7f1f0d76dd6 98 * Define 64-bit AND
XinZhangMS 0:f7f1f0d76dd6 99 */
XinZhangMS 0:f7f1f0d76dd6 100 #define SHA512_AND(word1, word2, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 101 (ret)[0] = (word1)[0] & (word2)[0], \
XinZhangMS 0:f7f1f0d76dd6 102 (ret)[1] = (word1)[1] & (word2)[1] )
XinZhangMS 0:f7f1f0d76dd6 103
XinZhangMS 0:f7f1f0d76dd6 104 /*
XinZhangMS 0:f7f1f0d76dd6 105 * Define 64-bit TILDA
XinZhangMS 0:f7f1f0d76dd6 106 */
XinZhangMS 0:f7f1f0d76dd6 107 #define SHA512_TILDA(word, ret) \
XinZhangMS 0:f7f1f0d76dd6 108 ( (ret)[0] = ~(word)[0], (ret)[1] = ~(word)[1] )
XinZhangMS 0:f7f1f0d76dd6 109
XinZhangMS 0:f7f1f0d76dd6 110 /*
XinZhangMS 0:f7f1f0d76dd6 111 * Define 64-bit ADD
XinZhangMS 0:f7f1f0d76dd6 112 */
XinZhangMS 0:f7f1f0d76dd6 113 #define SHA512_ADD(word1, word2, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 114 (ret)[1] = (word1)[1], (ret)[1] += (word2)[1], \
XinZhangMS 0:f7f1f0d76dd6 115 (ret)[0] = (word1)[0] + (word2)[0] + ((ret)[1] < (word1)[1]) )
XinZhangMS 0:f7f1f0d76dd6 116
XinZhangMS 0:f7f1f0d76dd6 117 /*
XinZhangMS 0:f7f1f0d76dd6 118 * Add the 4word value in word2 to word1.
XinZhangMS 0:f7f1f0d76dd6 119 */
XinZhangMS 0:f7f1f0d76dd6 120 static uint32_t ADDTO4_temp, ADDTO4_temp2;
XinZhangMS 0:f7f1f0d76dd6 121 #define SHA512_ADDTO4(word1, word2) ( \
XinZhangMS 0:f7f1f0d76dd6 122 ADDTO4_temp = (word1)[3], \
XinZhangMS 0:f7f1f0d76dd6 123 (word1)[3] += (word2)[3], \
XinZhangMS 0:f7f1f0d76dd6 124 ADDTO4_temp2 = (word1)[2], \
XinZhangMS 0:f7f1f0d76dd6 125 (word1)[2] += (word2)[2] + ((word1)[3] < ADDTO4_temp), \
XinZhangMS 0:f7f1f0d76dd6 126 ADDTO4_temp = (word1)[1], \
XinZhangMS 0:f7f1f0d76dd6 127 (word1)[1] += (word2)[1] + ((word1)[2] < ADDTO4_temp2), \
XinZhangMS 0:f7f1f0d76dd6 128 (word1)[0] += (word2)[0] + ((word1)[1] < ADDTO4_temp))
XinZhangMS 0:f7f1f0d76dd6 129
XinZhangMS 0:f7f1f0d76dd6 130 /*
XinZhangMS 0:f7f1f0d76dd6 131 * Add the 2word value in word2 to word1.
XinZhangMS 0:f7f1f0d76dd6 132 */
XinZhangMS 0:f7f1f0d76dd6 133 static uint32_t ADDTO2_temp;
XinZhangMS 0:f7f1f0d76dd6 134 #define SHA512_ADDTO2(word1, word2) ( \
XinZhangMS 0:f7f1f0d76dd6 135 ADDTO2_temp = (word1)[1], \
XinZhangMS 0:f7f1f0d76dd6 136 (word1)[1] += (word2)[1], \
XinZhangMS 0:f7f1f0d76dd6 137 (word1)[0] += (word2)[0] + ((word1)[1] < ADDTO2_temp) )
XinZhangMS 0:f7f1f0d76dd6 138
XinZhangMS 0:f7f1f0d76dd6 139 /*
XinZhangMS 0:f7f1f0d76dd6 140 * SHA rotate ((word >> bits) | (word << (64-bits)))
XinZhangMS 0:f7f1f0d76dd6 141 */
XinZhangMS 0:f7f1f0d76dd6 142 static uint32_t ROTR_temp1[2], ROTR_temp2[2];
XinZhangMS 0:f7f1f0d76dd6 143 #define SHA512_ROTR(bits, word, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 144 SHA512_SHR((bits), (word), ROTR_temp1), \
XinZhangMS 0:f7f1f0d76dd6 145 SHA512_SHL(64-(bits), (word), ROTR_temp2), \
XinZhangMS 0:f7f1f0d76dd6 146 SHA512_OR(ROTR_temp1, ROTR_temp2, (ret)) )
XinZhangMS 0:f7f1f0d76dd6 147
XinZhangMS 0:f7f1f0d76dd6 148 /*
XinZhangMS 0:f7f1f0d76dd6 149 * Define the SHA SIGMA and sigma macros
XinZhangMS 0:f7f1f0d76dd6 150 * SHA512_ROTR(28,word) ^ SHA512_ROTR(34,word) ^ SHA512_ROTR(39,word)
XinZhangMS 0:f7f1f0d76dd6 151 */
XinZhangMS 0:f7f1f0d76dd6 152 static uint32_t SIGMA0_temp1[2], SIGMA0_temp2[2],
XinZhangMS 0:f7f1f0d76dd6 153 SIGMA0_temp3[2], SIGMA0_temp4[2];
XinZhangMS 0:f7f1f0d76dd6 154 #define SHA512_SIGMA0(word, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 155 SHA512_ROTR(28, (word), SIGMA0_temp1), \
XinZhangMS 0:f7f1f0d76dd6 156 SHA512_ROTR(34, (word), SIGMA0_temp2), \
XinZhangMS 0:f7f1f0d76dd6 157 SHA512_ROTR(39, (word), SIGMA0_temp3), \
XinZhangMS 0:f7f1f0d76dd6 158 SHA512_XOR(SIGMA0_temp2, SIGMA0_temp3, SIGMA0_temp4), \
XinZhangMS 0:f7f1f0d76dd6 159 SHA512_XOR(SIGMA0_temp1, SIGMA0_temp4, (ret)) )
XinZhangMS 0:f7f1f0d76dd6 160
XinZhangMS 0:f7f1f0d76dd6 161 /*
XinZhangMS 0:f7f1f0d76dd6 162 * SHA512_ROTR(14,word) ^ SHA512_ROTR(18,word) ^ SHA512_ROTR(41,word)
XinZhangMS 0:f7f1f0d76dd6 163 */
XinZhangMS 0:f7f1f0d76dd6 164 static uint32_t SIGMA1_temp1[2], SIGMA1_temp2[2],
XinZhangMS 0:f7f1f0d76dd6 165 SIGMA1_temp3[2], SIGMA1_temp4[2];
XinZhangMS 0:f7f1f0d76dd6 166 #define SHA512_SIGMA1(word, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 167 SHA512_ROTR(14, (word), SIGMA1_temp1), \
XinZhangMS 0:f7f1f0d76dd6 168 SHA512_ROTR(18, (word), SIGMA1_temp2), \
XinZhangMS 0:f7f1f0d76dd6 169 SHA512_ROTR(41, (word), SIGMA1_temp3), \
XinZhangMS 0:f7f1f0d76dd6 170 SHA512_XOR(SIGMA1_temp2, SIGMA1_temp3, SIGMA1_temp4), \
XinZhangMS 0:f7f1f0d76dd6 171 SHA512_XOR(SIGMA1_temp1, SIGMA1_temp4, (ret)) )
XinZhangMS 0:f7f1f0d76dd6 172
XinZhangMS 0:f7f1f0d76dd6 173 /*
XinZhangMS 0:f7f1f0d76dd6 174 * (SHA512_ROTR( 1,word) ^ SHA512_ROTR( 8,word) ^ SHA512_SHR( 7,word))
XinZhangMS 0:f7f1f0d76dd6 175 */
XinZhangMS 0:f7f1f0d76dd6 176 static uint32_t sigma0_temp1[2], sigma0_temp2[2],
XinZhangMS 0:f7f1f0d76dd6 177 sigma0_temp3[2], sigma0_temp4[2];
XinZhangMS 0:f7f1f0d76dd6 178 #define SHA512_sigma0(word, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 179 SHA512_ROTR( 1, (word), sigma0_temp1), \
XinZhangMS 0:f7f1f0d76dd6 180 SHA512_ROTR( 8, (word), sigma0_temp2), \
XinZhangMS 0:f7f1f0d76dd6 181 SHA512_SHR( 7, (word), sigma0_temp3), \
XinZhangMS 0:f7f1f0d76dd6 182 SHA512_XOR(sigma0_temp2, sigma0_temp3, sigma0_temp4), \
XinZhangMS 0:f7f1f0d76dd6 183 SHA512_XOR(sigma0_temp1, sigma0_temp4, (ret)) )
XinZhangMS 0:f7f1f0d76dd6 184
XinZhangMS 0:f7f1f0d76dd6 185 /*
XinZhangMS 0:f7f1f0d76dd6 186 * (SHA512_ROTR(19,word) ^ SHA512_ROTR(61,word) ^ SHA512_SHR( 6,word))
XinZhangMS 0:f7f1f0d76dd6 187 */
XinZhangMS 0:f7f1f0d76dd6 188 static uint32_t sigma1_temp1[2], sigma1_temp2[2],
XinZhangMS 0:f7f1f0d76dd6 189 sigma1_temp3[2], sigma1_temp4[2];
XinZhangMS 0:f7f1f0d76dd6 190 #define SHA512_sigma1(word, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 191 SHA512_ROTR(19, (word), sigma1_temp1), \
XinZhangMS 0:f7f1f0d76dd6 192 SHA512_ROTR(61, (word), sigma1_temp2), \
XinZhangMS 0:f7f1f0d76dd6 193 SHA512_SHR( 6, (word), sigma1_temp3), \
XinZhangMS 0:f7f1f0d76dd6 194 SHA512_XOR(sigma1_temp2, sigma1_temp3, sigma1_temp4), \
XinZhangMS 0:f7f1f0d76dd6 195 SHA512_XOR(sigma1_temp1, sigma1_temp4, (ret)) )
XinZhangMS 0:f7f1f0d76dd6 196
XinZhangMS 0:f7f1f0d76dd6 197 #undef SHA_Ch
XinZhangMS 0:f7f1f0d76dd6 198 #undef SHA_Maj
XinZhangMS 0:f7f1f0d76dd6 199
XinZhangMS 0:f7f1f0d76dd6 200 #ifndef USE_MODIFIED_MACROS
XinZhangMS 0:f7f1f0d76dd6 201 /*
XinZhangMS 0:f7f1f0d76dd6 202 * These definitions are the ones used in FIPS-180-2, section 4.1.3
XinZhangMS 0:f7f1f0d76dd6 203 * Ch(x,y,z) ((x & y) ^ (~x & z))
XinZhangMS 0:f7f1f0d76dd6 204 */
XinZhangMS 0:f7f1f0d76dd6 205 static uint32_t Ch_temp1[2], Ch_temp2[2], Ch_temp3[2];
XinZhangMS 0:f7f1f0d76dd6 206 #define SHA_Ch(x, y, z, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 207 SHA512_AND(x, y, Ch_temp1), \
XinZhangMS 0:f7f1f0d76dd6 208 SHA512_TILDA(x, Ch_temp2), \
XinZhangMS 0:f7f1f0d76dd6 209 SHA512_AND(Ch_temp2, z, Ch_temp3), \
XinZhangMS 0:f7f1f0d76dd6 210 SHA512_XOR(Ch_temp1, Ch_temp3, (ret)) )
XinZhangMS 0:f7f1f0d76dd6 211 /*
XinZhangMS 0:f7f1f0d76dd6 212 * Maj(x,y,z) (((x)&(y)) ^ ((x)&(z)) ^ ((y)&(z)))
XinZhangMS 0:f7f1f0d76dd6 213 */
XinZhangMS 0:f7f1f0d76dd6 214 static uint32_t Maj_temp1[2], Maj_temp2[2],
XinZhangMS 0:f7f1f0d76dd6 215 Maj_temp3[2], Maj_temp4[2];
XinZhangMS 0:f7f1f0d76dd6 216 #define SHA_Maj(x, y, z, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 217 SHA512_AND(x, y, Maj_temp1), \
XinZhangMS 0:f7f1f0d76dd6 218 SHA512_AND(x, z, Maj_temp2), \
XinZhangMS 0:f7f1f0d76dd6 219 SHA512_AND(y, z, Maj_temp3), \
XinZhangMS 0:f7f1f0d76dd6 220 SHA512_XOR(Maj_temp2, Maj_temp3, Maj_temp4), \
XinZhangMS 0:f7f1f0d76dd6 221 SHA512_XOR(Maj_temp1, Maj_temp4, (ret)) )
XinZhangMS 0:f7f1f0d76dd6 222
XinZhangMS 0:f7f1f0d76dd6 223 #else /* !USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 224 /*
XinZhangMS 0:f7f1f0d76dd6 225 * These definitions are potentially faster equivalents for the ones
XinZhangMS 0:f7f1f0d76dd6 226 * used in FIPS-180-2, section 4.1.3.
XinZhangMS 0:f7f1f0d76dd6 227 * ((x & y) ^ (~x & z)) becomes
XinZhangMS 0:f7f1f0d76dd6 228 * ((x & (y ^ z)) ^ z)
XinZhangMS 0:f7f1f0d76dd6 229 */
XinZhangMS 0:f7f1f0d76dd6 230 #define SHA_Ch(x, y, z, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 231 (ret)[0] = (((x)[0] & ((y)[0] ^ (z)[0])) ^ (z)[0]), \
XinZhangMS 0:f7f1f0d76dd6 232 (ret)[1] = (((x)[1] & ((y)[1] ^ (z)[1])) ^ (z)[1]) )
XinZhangMS 0:f7f1f0d76dd6 233
XinZhangMS 0:f7f1f0d76dd6 234 /*
XinZhangMS 0:f7f1f0d76dd6 235 * ((x & y) ^ (x & z) ^ (y & z)) becomes
XinZhangMS 0:f7f1f0d76dd6 236 * ((x & (y | z)) | (y & z))
XinZhangMS 0:f7f1f0d76dd6 237 */
XinZhangMS 0:f7f1f0d76dd6 238 #define SHA_Maj(x, y, z, ret) ( \
XinZhangMS 0:f7f1f0d76dd6 239 ret[0] = (((x)[0] & ((y)[0] | (z)[0])) | ((y)[0] & (z)[0])), \
XinZhangMS 0:f7f1f0d76dd6 240 ret[1] = (((x)[1] & ((y)[1] | (z)[1])) | ((y)[1] & (z)[1])) )
XinZhangMS 0:f7f1f0d76dd6 241 #endif /* USE_MODIFIED_MACROS */
XinZhangMS 0:f7f1f0d76dd6 242
XinZhangMS 0:f7f1f0d76dd6 243 /*
XinZhangMS 0:f7f1f0d76dd6 244 * add "length" to the length
XinZhangMS 0:f7f1f0d76dd6 245 */
XinZhangMS 0:f7f1f0d76dd6 246 static uint32_t addTemp[4] = { 0, 0, 0, 0 };
XinZhangMS 0:f7f1f0d76dd6 247 #define SHA384_512AddLength(context, length) ( \
XinZhangMS 0:f7f1f0d76dd6 248 addTemp[3] = (length), SHA512_ADDTO4((context)->Length, addTemp), \
XinZhangMS 0:f7f1f0d76dd6 249 (context)->Corrupted = (((context)->Length[3] == 0) && \
XinZhangMS 0:f7f1f0d76dd6 250 ((context)->Length[2] == 0) && ((context)->Length[1] == 0) && \
XinZhangMS 0:f7f1f0d76dd6 251 ((context)->Length[0] < 8)) ? 1 : 0 )
XinZhangMS 0:f7f1f0d76dd6 252
XinZhangMS 0:f7f1f0d76dd6 253 /* Local Function Prototypes */
XinZhangMS 0:f7f1f0d76dd6 254 static void SHA384_512Finalize(SHA512Context *context,
XinZhangMS 0:f7f1f0d76dd6 255 uint8_t Pad_Byte);
XinZhangMS 0:f7f1f0d76dd6 256 static void SHA384_512PadMessage(SHA512Context *context,
XinZhangMS 0:f7f1f0d76dd6 257 uint8_t Pad_Byte);
XinZhangMS 0:f7f1f0d76dd6 258 static void SHA384_512ProcessMessageBlock(SHA512Context *context);
XinZhangMS 0:f7f1f0d76dd6 259 static int SHA384_512Reset(SHA512Context *context, uint32_t H0[]);
XinZhangMS 0:f7f1f0d76dd6 260 static int SHA384_512ResultN(SHA512Context *context,
XinZhangMS 0:f7f1f0d76dd6 261 uint8_t Message_Digest[], int HashSize);
XinZhangMS 0:f7f1f0d76dd6 262
XinZhangMS 0:f7f1f0d76dd6 263 /* Initial Hash Values: FIPS-180-2 sections 5.3.3 and 5.3.4 */
XinZhangMS 0:f7f1f0d76dd6 264 static uint32_t SHA384_H0[SHA512HashSize / 4] = {
XinZhangMS 0:f7f1f0d76dd6 265 0xCBBB9D5D, 0xC1059ED8, 0x629A292A, 0x367CD507, 0x9159015A,
XinZhangMS 0:f7f1f0d76dd6 266 0x3070DD17, 0x152FECD8, 0xF70E5939, 0x67332667, 0xFFC00B31,
XinZhangMS 0:f7f1f0d76dd6 267 0x8EB44A87, 0x68581511, 0xDB0C2E0D, 0x64F98FA7, 0x47B5481D,
XinZhangMS 0:f7f1f0d76dd6 268 0xBEFA4FA4
XinZhangMS 0:f7f1f0d76dd6 269 };
XinZhangMS 0:f7f1f0d76dd6 270
XinZhangMS 0:f7f1f0d76dd6 271 static uint32_t SHA512_H0[SHA512HashSize / 4] = {
XinZhangMS 0:f7f1f0d76dd6 272 0x6A09E667, 0xF3BCC908, 0xBB67AE85, 0x84CAA73B, 0x3C6EF372,
XinZhangMS 0:f7f1f0d76dd6 273 0xFE94F82B, 0xA54FF53A, 0x5F1D36F1, 0x510E527F, 0xADE682D1,
XinZhangMS 0:f7f1f0d76dd6 274 0x9B05688C, 0x2B3E6C1F, 0x1F83D9AB, 0xFB41BD6B, 0x5BE0CD19,
XinZhangMS 0:f7f1f0d76dd6 275 0x137E2179
XinZhangMS 0:f7f1f0d76dd6 276 };
XinZhangMS 0:f7f1f0d76dd6 277
XinZhangMS 0:f7f1f0d76dd6 278 #else /* !USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 279
XinZhangMS 0:f7f1f0d76dd6 280 /* Define the SHA shift, rotate left and rotate right macro */
XinZhangMS 0:f7f1f0d76dd6 281 #define SHA512_SHR(bits,word) (((uint64_t)(word)) >> (bits))
XinZhangMS 0:f7f1f0d76dd6 282 #define SHA512_ROTR(bits,word) ((((uint64_t)(word)) >> (bits)) | \
XinZhangMS 0:f7f1f0d76dd6 283 (((uint64_t)(word)) << (64-(bits))))
XinZhangMS 0:f7f1f0d76dd6 284
XinZhangMS 0:f7f1f0d76dd6 285 /* Define the SHA SIGMA and sigma macros */
XinZhangMS 0:f7f1f0d76dd6 286 #define SHA512_SIGMA0(word) \
XinZhangMS 0:f7f1f0d76dd6 287 (SHA512_ROTR(28,word) ^ SHA512_ROTR(34,word) ^ SHA512_ROTR(39,word))
XinZhangMS 0:f7f1f0d76dd6 288 #define SHA512_SIGMA1(word) \
XinZhangMS 0:f7f1f0d76dd6 289 (SHA512_ROTR(14,word) ^ SHA512_ROTR(18,word) ^ SHA512_ROTR(41,word))
XinZhangMS 0:f7f1f0d76dd6 290 #define SHA512_sigma0(word) \
XinZhangMS 0:f7f1f0d76dd6 291 (SHA512_ROTR( 1,word) ^ SHA512_ROTR( 8,word) ^ SHA512_SHR( 7,word))
XinZhangMS 0:f7f1f0d76dd6 292 #define SHA512_sigma1(word) \
XinZhangMS 0:f7f1f0d76dd6 293 (SHA512_ROTR(19,word) ^ SHA512_ROTR(61,word) ^ SHA512_SHR( 6,word))
XinZhangMS 0:f7f1f0d76dd6 294
XinZhangMS 0:f7f1f0d76dd6 295 /*
XinZhangMS 0:f7f1f0d76dd6 296 * add "length" to the length
XinZhangMS 0:f7f1f0d76dd6 297 */
XinZhangMS 0:f7f1f0d76dd6 298 #define SHA384_512AddLength(context, length) \
XinZhangMS 0:f7f1f0d76dd6 299 (addTemp = context->Length_Low, context->Corrupted = \
XinZhangMS 0:f7f1f0d76dd6 300 ((context->Length_Low += length) < addTemp) && \
XinZhangMS 0:f7f1f0d76dd6 301 (++context->Length_High == 0) ? 1 : 0)
XinZhangMS 0:f7f1f0d76dd6 302
XinZhangMS 0:f7f1f0d76dd6 303 /* Local Function Prototypes */
XinZhangMS 0:f7f1f0d76dd6 304 static void SHA384_512Finalize(SHA512Context *context,
XinZhangMS 0:f7f1f0d76dd6 305 uint8_t Pad_Byte);
XinZhangMS 0:f7f1f0d76dd6 306 static void SHA384_512PadMessage(SHA512Context *context,
XinZhangMS 0:f7f1f0d76dd6 307 uint8_t Pad_Byte);
XinZhangMS 0:f7f1f0d76dd6 308 static void SHA384_512ProcessMessageBlock(SHA512Context *context);
XinZhangMS 0:f7f1f0d76dd6 309 static int SHA384_512Reset(SHA512Context *context, uint64_t H0[]);
XinZhangMS 0:f7f1f0d76dd6 310 static int SHA384_512ResultN(SHA512Context *context,
XinZhangMS 0:f7f1f0d76dd6 311 uint8_t Message_Digest[], int HashSize);
XinZhangMS 0:f7f1f0d76dd6 312
XinZhangMS 0:f7f1f0d76dd6 313 /* Initial Hash Values: FIPS-180-2 sections 5.3.3 and 5.3.4 */
XinZhangMS 0:f7f1f0d76dd6 314 static uint64_t SHA384_H0[] = {
XinZhangMS 0:f7f1f0d76dd6 315 0xCBBB9D5DC1059ED8ull, 0x629A292A367CD507ull, 0x9159015A3070DD17ull,
XinZhangMS 0:f7f1f0d76dd6 316 0x152FECD8F70E5939ull, 0x67332667FFC00B31ull, 0x8EB44A8768581511ull,
XinZhangMS 0:f7f1f0d76dd6 317 0xDB0C2E0D64F98FA7ull, 0x47B5481DBEFA4FA4ull
XinZhangMS 0:f7f1f0d76dd6 318 };
XinZhangMS 0:f7f1f0d76dd6 319 static uint64_t SHA512_H0[] = {
XinZhangMS 0:f7f1f0d76dd6 320 0x6A09E667F3BCC908ull, 0xBB67AE8584CAA73Bull, 0x3C6EF372FE94F82Bull,
XinZhangMS 0:f7f1f0d76dd6 321 0xA54FF53A5F1D36F1ull, 0x510E527FADE682D1ull, 0x9B05688C2B3E6C1Full,
XinZhangMS 0:f7f1f0d76dd6 322 0x1F83D9ABFB41BD6Bull, 0x5BE0CD19137E2179ull
XinZhangMS 0:f7f1f0d76dd6 323 };
XinZhangMS 0:f7f1f0d76dd6 324
XinZhangMS 0:f7f1f0d76dd6 325 #endif /* USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 326
XinZhangMS 0:f7f1f0d76dd6 327 /*
XinZhangMS 0:f7f1f0d76dd6 328 * SHA384Reset
XinZhangMS 0:f7f1f0d76dd6 329 *
XinZhangMS 0:f7f1f0d76dd6 330 * Description:
XinZhangMS 0:f7f1f0d76dd6 331 * This function will initialize the SHA384Context in preparation
XinZhangMS 0:f7f1f0d76dd6 332 * for computing a new SHA384 message digest.
XinZhangMS 0:f7f1f0d76dd6 333 *
XinZhangMS 0:f7f1f0d76dd6 334 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 335 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 336 * The context to reset.
XinZhangMS 0:f7f1f0d76dd6 337 *
XinZhangMS 0:f7f1f0d76dd6 338 * Returns:
XinZhangMS 0:f7f1f0d76dd6 339 * sha Error Code.
XinZhangMS 0:f7f1f0d76dd6 340 *
XinZhangMS 0:f7f1f0d76dd6 341 */
XinZhangMS 0:f7f1f0d76dd6 342 int SHA384Reset(SHA384Context *context)
XinZhangMS 0:f7f1f0d76dd6 343 {
XinZhangMS 0:f7f1f0d76dd6 344 return SHA384_512Reset(context, SHA384_H0);
XinZhangMS 0:f7f1f0d76dd6 345 }
XinZhangMS 0:f7f1f0d76dd6 346
XinZhangMS 0:f7f1f0d76dd6 347 /*
XinZhangMS 0:f7f1f0d76dd6 348 * SHA384Input
XinZhangMS 0:f7f1f0d76dd6 349 *
XinZhangMS 0:f7f1f0d76dd6 350 * Description:
XinZhangMS 0:f7f1f0d76dd6 351 * This function accepts an array of octets as the next portion
XinZhangMS 0:f7f1f0d76dd6 352 * of the message.
XinZhangMS 0:f7f1f0d76dd6 353 *
XinZhangMS 0:f7f1f0d76dd6 354 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 355 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 356 * The SHA context to update
XinZhangMS 0:f7f1f0d76dd6 357 * message_array: [in]
XinZhangMS 0:f7f1f0d76dd6 358 * An array of characters representing the next portion of
XinZhangMS 0:f7f1f0d76dd6 359 * the message.
XinZhangMS 0:f7f1f0d76dd6 360 * length: [in]
XinZhangMS 0:f7f1f0d76dd6 361 * The length of the message in message_array
XinZhangMS 0:f7f1f0d76dd6 362 *
XinZhangMS 0:f7f1f0d76dd6 363 * Returns:
XinZhangMS 0:f7f1f0d76dd6 364 * sha Error Code.
XinZhangMS 0:f7f1f0d76dd6 365 *
XinZhangMS 0:f7f1f0d76dd6 366 */
XinZhangMS 0:f7f1f0d76dd6 367 int SHA384Input(SHA384Context *context,
XinZhangMS 0:f7f1f0d76dd6 368 const uint8_t *message_array, unsigned int length)
XinZhangMS 0:f7f1f0d76dd6 369 {
XinZhangMS 0:f7f1f0d76dd6 370 return SHA512Input(context, message_array, length);
XinZhangMS 0:f7f1f0d76dd6 371 }
XinZhangMS 0:f7f1f0d76dd6 372
XinZhangMS 0:f7f1f0d76dd6 373 /*
XinZhangMS 0:f7f1f0d76dd6 374 * SHA384FinalBits
XinZhangMS 0:f7f1f0d76dd6 375 *
XinZhangMS 0:f7f1f0d76dd6 376 * Description:
XinZhangMS 0:f7f1f0d76dd6 377 * This function will add in any final bits of the message.
XinZhangMS 0:f7f1f0d76dd6 378 *
XinZhangMS 0:f7f1f0d76dd6 379 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 380 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 381 * The SHA context to update
XinZhangMS 0:f7f1f0d76dd6 382 * message_bits: [in]
XinZhangMS 0:f7f1f0d76dd6 383 * The final bits of the message, in the upper portion of the
XinZhangMS 0:f7f1f0d76dd6 384 * byte. (Use 0b###00000 instead of 0b00000### to input the
XinZhangMS 0:f7f1f0d76dd6 385 * three bits ###.)
XinZhangMS 0:f7f1f0d76dd6 386 * length: [in]
XinZhangMS 0:f7f1f0d76dd6 387 * The number of bits in message_bits, between 1 and 7.
XinZhangMS 0:f7f1f0d76dd6 388 *
XinZhangMS 0:f7f1f0d76dd6 389 * Returns:
XinZhangMS 0:f7f1f0d76dd6 390 * sha Error Code.
XinZhangMS 0:f7f1f0d76dd6 391 *
XinZhangMS 0:f7f1f0d76dd6 392 */
XinZhangMS 0:f7f1f0d76dd6 393 int SHA384FinalBits(SHA384Context *context,
XinZhangMS 0:f7f1f0d76dd6 394 const uint8_t message_bits, unsigned int length)
XinZhangMS 0:f7f1f0d76dd6 395 {
XinZhangMS 0:f7f1f0d76dd6 396 return SHA512FinalBits(context, message_bits, length);
XinZhangMS 0:f7f1f0d76dd6 397 }
XinZhangMS 0:f7f1f0d76dd6 398
XinZhangMS 0:f7f1f0d76dd6 399 /*
XinZhangMS 0:f7f1f0d76dd6 400 * SHA384Result
XinZhangMS 0:f7f1f0d76dd6 401 *
XinZhangMS 0:f7f1f0d76dd6 402 * Description:
XinZhangMS 0:f7f1f0d76dd6 403 * This function will return the 384-bit message
XinZhangMS 0:f7f1f0d76dd6 404 * digest into the Message_Digest array provided by the caller.
XinZhangMS 0:f7f1f0d76dd6 405 * NOTE: The first octet of hash is stored in the 0th element,
XinZhangMS 0:f7f1f0d76dd6 406 * the last octet of hash in the 48th element.
XinZhangMS 0:f7f1f0d76dd6 407 *
XinZhangMS 0:f7f1f0d76dd6 408 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 409 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 410 * The context to use to calculate the SHA hash.
XinZhangMS 0:f7f1f0d76dd6 411 * Message_Digest: [out]
XinZhangMS 0:f7f1f0d76dd6 412 * Where the digest is returned.
XinZhangMS 0:f7f1f0d76dd6 413 *
XinZhangMS 0:f7f1f0d76dd6 414 * Returns:
XinZhangMS 0:f7f1f0d76dd6 415 * sha Error Code.
XinZhangMS 0:f7f1f0d76dd6 416 *
XinZhangMS 0:f7f1f0d76dd6 417 */
XinZhangMS 0:f7f1f0d76dd6 418 int SHA384Result(SHA384Context *context,
XinZhangMS 0:f7f1f0d76dd6 419 uint8_t Message_Digest[SHA384HashSize])
XinZhangMS 0:f7f1f0d76dd6 420 {
XinZhangMS 0:f7f1f0d76dd6 421 return SHA384_512ResultN(context, Message_Digest, SHA384HashSize);
XinZhangMS 0:f7f1f0d76dd6 422 }
XinZhangMS 0:f7f1f0d76dd6 423
XinZhangMS 0:f7f1f0d76dd6 424 /*
XinZhangMS 0:f7f1f0d76dd6 425 * SHA512Reset
XinZhangMS 0:f7f1f0d76dd6 426 *
XinZhangMS 0:f7f1f0d76dd6 427 * Description:
XinZhangMS 0:f7f1f0d76dd6 428 * This function will initialize the SHA512Context in preparation
XinZhangMS 0:f7f1f0d76dd6 429 * for computing a new SHA512 message digest.
XinZhangMS 0:f7f1f0d76dd6 430 *
XinZhangMS 0:f7f1f0d76dd6 431 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 432 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 433 * The context to reset.
XinZhangMS 0:f7f1f0d76dd6 434 *
XinZhangMS 0:f7f1f0d76dd6 435 * Returns:
XinZhangMS 0:f7f1f0d76dd6 436 * sha Error Code.
XinZhangMS 0:f7f1f0d76dd6 437 *
XinZhangMS 0:f7f1f0d76dd6 438 */
XinZhangMS 0:f7f1f0d76dd6 439 int SHA512Reset(SHA512Context *context)
XinZhangMS 0:f7f1f0d76dd6 440 {
XinZhangMS 0:f7f1f0d76dd6 441 return SHA384_512Reset(context, SHA512_H0);
XinZhangMS 0:f7f1f0d76dd6 442 }
XinZhangMS 0:f7f1f0d76dd6 443
XinZhangMS 0:f7f1f0d76dd6 444 /*
XinZhangMS 0:f7f1f0d76dd6 445 * SHA512Input
XinZhangMS 0:f7f1f0d76dd6 446 *
XinZhangMS 0:f7f1f0d76dd6 447 * Description:
XinZhangMS 0:f7f1f0d76dd6 448 * This function accepts an array of octets as the next portion
XinZhangMS 0:f7f1f0d76dd6 449 * of the message.
XinZhangMS 0:f7f1f0d76dd6 450 *
XinZhangMS 0:f7f1f0d76dd6 451 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 452 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 453 * The SHA context to update
XinZhangMS 0:f7f1f0d76dd6 454 * message_array: [in]
XinZhangMS 0:f7f1f0d76dd6 455 * An array of characters representing the next portion of
XinZhangMS 0:f7f1f0d76dd6 456 * the message.
XinZhangMS 0:f7f1f0d76dd6 457 * length: [in]
XinZhangMS 0:f7f1f0d76dd6 458 * The length of the message in message_array
XinZhangMS 0:f7f1f0d76dd6 459 *
XinZhangMS 0:f7f1f0d76dd6 460 * Returns:
XinZhangMS 0:f7f1f0d76dd6 461 * sha Error Code.
XinZhangMS 0:f7f1f0d76dd6 462 *
XinZhangMS 0:f7f1f0d76dd6 463 */
XinZhangMS 0:f7f1f0d76dd6 464 int SHA512Input(SHA512Context *context,
XinZhangMS 0:f7f1f0d76dd6 465 const uint8_t *message_array,
XinZhangMS 0:f7f1f0d76dd6 466 unsigned int length)
XinZhangMS 0:f7f1f0d76dd6 467 {
XinZhangMS 0:f7f1f0d76dd6 468 uint64_t addTemp;
XinZhangMS 0:f7f1f0d76dd6 469 if (!length)
XinZhangMS 0:f7f1f0d76dd6 470 return shaSuccess;
XinZhangMS 0:f7f1f0d76dd6 471
XinZhangMS 0:f7f1f0d76dd6 472 if (!context || !message_array)
XinZhangMS 0:f7f1f0d76dd6 473 return shaNull;
XinZhangMS 0:f7f1f0d76dd6 474
XinZhangMS 0:f7f1f0d76dd6 475 if (context->Computed) {
XinZhangMS 0:f7f1f0d76dd6 476 context->Corrupted = shaStateError;
XinZhangMS 0:f7f1f0d76dd6 477 return shaStateError;
XinZhangMS 0:f7f1f0d76dd6 478 }
XinZhangMS 0:f7f1f0d76dd6 479
XinZhangMS 0:f7f1f0d76dd6 480 if (context->Corrupted)
XinZhangMS 0:f7f1f0d76dd6 481 return context->Corrupted;
XinZhangMS 0:f7f1f0d76dd6 482
XinZhangMS 0:f7f1f0d76dd6 483 while (length-- && !context->Corrupted) {
XinZhangMS 0:f7f1f0d76dd6 484 context->Message_Block[context->Message_Block_Index++] =
XinZhangMS 0:f7f1f0d76dd6 485 (*message_array & 0xFF);
XinZhangMS 0:f7f1f0d76dd6 486
XinZhangMS 0:f7f1f0d76dd6 487 if (!SHA384_512AddLength(context, 8) &&
XinZhangMS 0:f7f1f0d76dd6 488 (context->Message_Block_Index == SHA512_Message_Block_Size))
XinZhangMS 0:f7f1f0d76dd6 489 SHA384_512ProcessMessageBlock(context);
XinZhangMS 0:f7f1f0d76dd6 490
XinZhangMS 0:f7f1f0d76dd6 491 message_array++;
XinZhangMS 0:f7f1f0d76dd6 492 }
XinZhangMS 0:f7f1f0d76dd6 493
XinZhangMS 0:f7f1f0d76dd6 494 return shaSuccess;
XinZhangMS 0:f7f1f0d76dd6 495 }
XinZhangMS 0:f7f1f0d76dd6 496
XinZhangMS 0:f7f1f0d76dd6 497 /*
XinZhangMS 0:f7f1f0d76dd6 498 * SHA512FinalBits
XinZhangMS 0:f7f1f0d76dd6 499 *
XinZhangMS 0:f7f1f0d76dd6 500 * Description:
XinZhangMS 0:f7f1f0d76dd6 501 * This function will add in any final bits of the message.
XinZhangMS 0:f7f1f0d76dd6 502 *
XinZhangMS 0:f7f1f0d76dd6 503 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 504 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 505 * The SHA context to update
XinZhangMS 0:f7f1f0d76dd6 506 * message_bits: [in]
XinZhangMS 0:f7f1f0d76dd6 507 * The final bits of the message, in the upper portion of the
XinZhangMS 0:f7f1f0d76dd6 508 * byte. (Use 0b###00000 instead of 0b00000### to input the
XinZhangMS 0:f7f1f0d76dd6 509 * three bits ###.)
XinZhangMS 0:f7f1f0d76dd6 510 * length: [in]
XinZhangMS 0:f7f1f0d76dd6 511 * The number of bits in message_bits, between 1 and 7.
XinZhangMS 0:f7f1f0d76dd6 512 *
XinZhangMS 0:f7f1f0d76dd6 513 * Returns:
XinZhangMS 0:f7f1f0d76dd6 514 * sha Error Code.
XinZhangMS 0:f7f1f0d76dd6 515 *
XinZhangMS 0:f7f1f0d76dd6 516 */
XinZhangMS 0:f7f1f0d76dd6 517 int SHA512FinalBits(SHA512Context *context,
XinZhangMS 0:f7f1f0d76dd6 518 const uint8_t message_bits, unsigned int length)
XinZhangMS 0:f7f1f0d76dd6 519 {
XinZhangMS 0:f7f1f0d76dd6 520 uint64_t addTemp;
XinZhangMS 0:f7f1f0d76dd6 521 uint8_t masks[8] = {
XinZhangMS 0:f7f1f0d76dd6 522 /* 0 0b00000000 */ 0x00, /* 1 0b10000000 */ 0x80,
XinZhangMS 0:f7f1f0d76dd6 523 /* 2 0b11000000 */ 0xC0, /* 3 0b11100000 */ 0xE0,
XinZhangMS 0:f7f1f0d76dd6 524 /* 4 0b11110000 */ 0xF0, /* 5 0b11111000 */ 0xF8,
XinZhangMS 0:f7f1f0d76dd6 525 /* 6 0b11111100 */ 0xFC, /* 7 0b11111110 */ 0xFE
XinZhangMS 0:f7f1f0d76dd6 526 };
XinZhangMS 0:f7f1f0d76dd6 527 uint8_t markbit[8] = {
XinZhangMS 0:f7f1f0d76dd6 528 /* 0 0b10000000 */ 0x80, /* 1 0b01000000 */ 0x40,
XinZhangMS 0:f7f1f0d76dd6 529 /* 2 0b00100000 */ 0x20, /* 3 0b00010000 */ 0x10,
XinZhangMS 0:f7f1f0d76dd6 530 /* 4 0b00001000 */ 0x08, /* 5 0b00000100 */ 0x04,
XinZhangMS 0:f7f1f0d76dd6 531 /* 6 0b00000010 */ 0x02, /* 7 0b00000001 */ 0x01
XinZhangMS 0:f7f1f0d76dd6 532 };
XinZhangMS 0:f7f1f0d76dd6 533
XinZhangMS 0:f7f1f0d76dd6 534 if (!length)
XinZhangMS 0:f7f1f0d76dd6 535 return shaSuccess;
XinZhangMS 0:f7f1f0d76dd6 536
XinZhangMS 0:f7f1f0d76dd6 537 if (!context)
XinZhangMS 0:f7f1f0d76dd6 538 return shaNull;
XinZhangMS 0:f7f1f0d76dd6 539
XinZhangMS 0:f7f1f0d76dd6 540 if ((context->Computed) || (length >= 8) || (length == 0)) {
XinZhangMS 0:f7f1f0d76dd6 541 context->Corrupted = shaStateError;
XinZhangMS 0:f7f1f0d76dd6 542 return shaStateError;
XinZhangMS 0:f7f1f0d76dd6 543 }
XinZhangMS 0:f7f1f0d76dd6 544
XinZhangMS 0:f7f1f0d76dd6 545 if (context->Corrupted)
XinZhangMS 0:f7f1f0d76dd6 546 return context->Corrupted;
XinZhangMS 0:f7f1f0d76dd6 547
XinZhangMS 0:f7f1f0d76dd6 548 SHA384_512AddLength(context, length);
XinZhangMS 0:f7f1f0d76dd6 549 SHA384_512Finalize(context, (uint8_t)
XinZhangMS 0:f7f1f0d76dd6 550 ((message_bits & masks[length]) | markbit[length]));
XinZhangMS 0:f7f1f0d76dd6 551
XinZhangMS 0:f7f1f0d76dd6 552 return shaSuccess;
XinZhangMS 0:f7f1f0d76dd6 553 }
XinZhangMS 0:f7f1f0d76dd6 554
XinZhangMS 0:f7f1f0d76dd6 555 /*
XinZhangMS 0:f7f1f0d76dd6 556 * SHA384_512Finalize
XinZhangMS 0:f7f1f0d76dd6 557 *
XinZhangMS 0:f7f1f0d76dd6 558 * Description:
XinZhangMS 0:f7f1f0d76dd6 559 * This helper function finishes off the digest calculations.
XinZhangMS 0:f7f1f0d76dd6 560 *
XinZhangMS 0:f7f1f0d76dd6 561 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 562 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 563 * The SHA context to update
XinZhangMS 0:f7f1f0d76dd6 564 * Pad_Byte: [in]
XinZhangMS 0:f7f1f0d76dd6 565 * The last byte to add to the digest before the 0-padding
XinZhangMS 0:f7f1f0d76dd6 566 * and length. This will contain the last bits of the message
XinZhangMS 0:f7f1f0d76dd6 567 * followed by another single bit. If the message was an
XinZhangMS 0:f7f1f0d76dd6 568 * exact multiple of 8-bits long, Pad_Byte will be 0x80.
XinZhangMS 0:f7f1f0d76dd6 569 *
XinZhangMS 0:f7f1f0d76dd6 570 * Returns:
XinZhangMS 0:f7f1f0d76dd6 571 * sha Error Code.
XinZhangMS 0:f7f1f0d76dd6 572 *
XinZhangMS 0:f7f1f0d76dd6 573 */
XinZhangMS 0:f7f1f0d76dd6 574 static void SHA384_512Finalize(SHA512Context *context,
XinZhangMS 0:f7f1f0d76dd6 575 uint8_t Pad_Byte)
XinZhangMS 0:f7f1f0d76dd6 576 {
XinZhangMS 0:f7f1f0d76dd6 577 int_least16_t i;
XinZhangMS 0:f7f1f0d76dd6 578 SHA384_512PadMessage(context, Pad_Byte);
XinZhangMS 0:f7f1f0d76dd6 579 /* message may be sensitive, clear it out */
XinZhangMS 0:f7f1f0d76dd6 580 for (i = 0; i < SHA512_Message_Block_Size; ++i)
XinZhangMS 0:f7f1f0d76dd6 581 context->Message_Block[i] = 0;
XinZhangMS 0:f7f1f0d76dd6 582 #ifdef USE_32BIT_ONLY /* and clear length */
XinZhangMS 0:f7f1f0d76dd6 583 context->Length[0] = context->Length[1] = 0;
XinZhangMS 0:f7f1f0d76dd6 584 context->Length[2] = context->Length[3] = 0;
XinZhangMS 0:f7f1f0d76dd6 585 #else /* !USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 586 context->Length_Low = 0;
XinZhangMS 0:f7f1f0d76dd6 587 context->Length_High = 0;
XinZhangMS 0:f7f1f0d76dd6 588 #endif /* USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 589 context->Computed = 1;
XinZhangMS 0:f7f1f0d76dd6 590 }
XinZhangMS 0:f7f1f0d76dd6 591
XinZhangMS 0:f7f1f0d76dd6 592 /*
XinZhangMS 0:f7f1f0d76dd6 593 * SHA512Result
XinZhangMS 0:f7f1f0d76dd6 594 *
XinZhangMS 0:f7f1f0d76dd6 595 * Description:
XinZhangMS 0:f7f1f0d76dd6 596 * This function will return the 512-bit message
XinZhangMS 0:f7f1f0d76dd6 597 * digest into the Message_Digest array provided by the caller.
XinZhangMS 0:f7f1f0d76dd6 598 * NOTE: The first octet of hash is stored in the 0th element,
XinZhangMS 0:f7f1f0d76dd6 599 * the last octet of hash in the 64th element.
XinZhangMS 0:f7f1f0d76dd6 600 *
XinZhangMS 0:f7f1f0d76dd6 601 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 602 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 603 * The context to use to calculate the SHA hash.
XinZhangMS 0:f7f1f0d76dd6 604 * Message_Digest: [out]
XinZhangMS 0:f7f1f0d76dd6 605 * Where the digest is returned.
XinZhangMS 0:f7f1f0d76dd6 606 *
XinZhangMS 0:f7f1f0d76dd6 607 * Returns:
XinZhangMS 0:f7f1f0d76dd6 608 * sha Error Code.
XinZhangMS 0:f7f1f0d76dd6 609 *
XinZhangMS 0:f7f1f0d76dd6 610 */
XinZhangMS 0:f7f1f0d76dd6 611 int SHA512Result(SHA512Context *context,
XinZhangMS 0:f7f1f0d76dd6 612 uint8_t Message_Digest[SHA512HashSize])
XinZhangMS 0:f7f1f0d76dd6 613 {
XinZhangMS 0:f7f1f0d76dd6 614 return SHA384_512ResultN(context, Message_Digest, SHA512HashSize);
XinZhangMS 0:f7f1f0d76dd6 615 }
XinZhangMS 0:f7f1f0d76dd6 616
XinZhangMS 0:f7f1f0d76dd6 617 /*
XinZhangMS 0:f7f1f0d76dd6 618 * SHA384_512PadMessage
XinZhangMS 0:f7f1f0d76dd6 619 *
XinZhangMS 0:f7f1f0d76dd6 620 * Description:
XinZhangMS 0:f7f1f0d76dd6 621 * According to the standard, the message must be padded to an
XinZhangMS 0:f7f1f0d76dd6 622 * even 1024 bits. The first padding bit must be a '1'. The
XinZhangMS 0:f7f1f0d76dd6 623 * last 128 bits represent the length of the original message.
XinZhangMS 0:f7f1f0d76dd6 624 * All bits in between should be 0. This helper function will
XinZhangMS 0:f7f1f0d76dd6 625 * pad the message according to those rules by filling the
XinZhangMS 0:f7f1f0d76dd6 626 * Message_Block array accordingly. When it returns, it can be
XinZhangMS 0:f7f1f0d76dd6 627 * assumed that the message digest has been computed.
XinZhangMS 0:f7f1f0d76dd6 628 *
XinZhangMS 0:f7f1f0d76dd6 629 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 630 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 631 * The context to pad
XinZhangMS 0:f7f1f0d76dd6 632 * Pad_Byte: [in]
XinZhangMS 0:f7f1f0d76dd6 633 * The last byte to add to the digest before the 0-padding
XinZhangMS 0:f7f1f0d76dd6 634 * and length. This will contain the last bits of the message
XinZhangMS 0:f7f1f0d76dd6 635 * followed by another single bit. If the message was an
XinZhangMS 0:f7f1f0d76dd6 636 * exact multiple of 8-bits long, Pad_Byte will be 0x80.
XinZhangMS 0:f7f1f0d76dd6 637 *
XinZhangMS 0:f7f1f0d76dd6 638 * Returns:
XinZhangMS 0:f7f1f0d76dd6 639 * Nothing.
XinZhangMS 0:f7f1f0d76dd6 640 *
XinZhangMS 0:f7f1f0d76dd6 641 */
XinZhangMS 0:f7f1f0d76dd6 642 static void SHA384_512PadMessage(SHA512Context *context,
XinZhangMS 0:f7f1f0d76dd6 643 uint8_t Pad_Byte)
XinZhangMS 0:f7f1f0d76dd6 644 {
XinZhangMS 0:f7f1f0d76dd6 645 /*
XinZhangMS 0:f7f1f0d76dd6 646 * Check to see if the current message block is too small to hold
XinZhangMS 0:f7f1f0d76dd6 647 * the initial padding bits and length. If so, we will pad the
XinZhangMS 0:f7f1f0d76dd6 648 * block, process it, and then continue padding into a second
XinZhangMS 0:f7f1f0d76dd6 649 * block.
XinZhangMS 0:f7f1f0d76dd6 650 */
XinZhangMS 0:f7f1f0d76dd6 651 if (context->Message_Block_Index >= (SHA512_Message_Block_Size - 16)) {
XinZhangMS 0:f7f1f0d76dd6 652 context->Message_Block[context->Message_Block_Index++] = Pad_Byte;
XinZhangMS 0:f7f1f0d76dd6 653 while (context->Message_Block_Index < SHA512_Message_Block_Size)
XinZhangMS 0:f7f1f0d76dd6 654 context->Message_Block[context->Message_Block_Index++] = 0;
XinZhangMS 0:f7f1f0d76dd6 655
XinZhangMS 0:f7f1f0d76dd6 656 SHA384_512ProcessMessageBlock(context);
XinZhangMS 0:f7f1f0d76dd6 657 }
XinZhangMS 0:f7f1f0d76dd6 658 else
XinZhangMS 0:f7f1f0d76dd6 659 context->Message_Block[context->Message_Block_Index++] = Pad_Byte;
XinZhangMS 0:f7f1f0d76dd6 660
XinZhangMS 0:f7f1f0d76dd6 661 while (context->Message_Block_Index < (SHA512_Message_Block_Size - 16))
XinZhangMS 0:f7f1f0d76dd6 662 context->Message_Block[context->Message_Block_Index++] = 0;
XinZhangMS 0:f7f1f0d76dd6 663
XinZhangMS 0:f7f1f0d76dd6 664 /*
XinZhangMS 0:f7f1f0d76dd6 665 * Store the message length as the last 16 octets
XinZhangMS 0:f7f1f0d76dd6 666 */
XinZhangMS 0:f7f1f0d76dd6 667 #ifdef USE_32BIT_ONLY
XinZhangMS 0:f7f1f0d76dd6 668 context->Message_Block[112] = (uint8_t)(context->Length[0] >> 24);
XinZhangMS 0:f7f1f0d76dd6 669 context->Message_Block[113] = (uint8_t)(context->Length[0] >> 16);
XinZhangMS 0:f7f1f0d76dd6 670 context->Message_Block[114] = (uint8_t)(context->Length[0] >> 8);
XinZhangMS 0:f7f1f0d76dd6 671 context->Message_Block[115] = (uint8_t)(context->Length[0]);
XinZhangMS 0:f7f1f0d76dd6 672 context->Message_Block[116] = (uint8_t)(context->Length[1] >> 24);
XinZhangMS 0:f7f1f0d76dd6 673 context->Message_Block[117] = (uint8_t)(context->Length[1] >> 16);
XinZhangMS 0:f7f1f0d76dd6 674 context->Message_Block[118] = (uint8_t)(context->Length[1] >> 8);
XinZhangMS 0:f7f1f0d76dd6 675 context->Message_Block[119] = (uint8_t)(context->Length[1]);
XinZhangMS 0:f7f1f0d76dd6 676
XinZhangMS 0:f7f1f0d76dd6 677 context->Message_Block[120] = (uint8_t)(context->Length[2] >> 24);
XinZhangMS 0:f7f1f0d76dd6 678 context->Message_Block[121] = (uint8_t)(context->Length[2] >> 16);
XinZhangMS 0:f7f1f0d76dd6 679 context->Message_Block[122] = (uint8_t)(context->Length[2] >> 8);
XinZhangMS 0:f7f1f0d76dd6 680 context->Message_Block[123] = (uint8_t)(context->Length[2]);
XinZhangMS 0:f7f1f0d76dd6 681 context->Message_Block[124] = (uint8_t)(context->Length[3] >> 24);
XinZhangMS 0:f7f1f0d76dd6 682 context->Message_Block[125] = (uint8_t)(context->Length[3] >> 16);
XinZhangMS 0:f7f1f0d76dd6 683 context->Message_Block[126] = (uint8_t)(context->Length[3] >> 8);
XinZhangMS 0:f7f1f0d76dd6 684 context->Message_Block[127] = (uint8_t)(context->Length[3]);
XinZhangMS 0:f7f1f0d76dd6 685 #else /* !USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 686 context->Message_Block[112] = (uint8_t)(context->Length_High >> 56);
XinZhangMS 0:f7f1f0d76dd6 687 context->Message_Block[113] = (uint8_t)(context->Length_High >> 48);
XinZhangMS 0:f7f1f0d76dd6 688 context->Message_Block[114] = (uint8_t)(context->Length_High >> 40);
XinZhangMS 0:f7f1f0d76dd6 689 context->Message_Block[115] = (uint8_t)(context->Length_High >> 32);
XinZhangMS 0:f7f1f0d76dd6 690 context->Message_Block[116] = (uint8_t)(context->Length_High >> 24);
XinZhangMS 0:f7f1f0d76dd6 691 context->Message_Block[117] = (uint8_t)(context->Length_High >> 16);
XinZhangMS 0:f7f1f0d76dd6 692 context->Message_Block[118] = (uint8_t)(context->Length_High >> 8);
XinZhangMS 0:f7f1f0d76dd6 693 context->Message_Block[119] = (uint8_t)(context->Length_High);
XinZhangMS 0:f7f1f0d76dd6 694
XinZhangMS 0:f7f1f0d76dd6 695 context->Message_Block[120] = (uint8_t)(context->Length_Low >> 56);
XinZhangMS 0:f7f1f0d76dd6 696 context->Message_Block[121] = (uint8_t)(context->Length_Low >> 48);
XinZhangMS 0:f7f1f0d76dd6 697 context->Message_Block[122] = (uint8_t)(context->Length_Low >> 40);
XinZhangMS 0:f7f1f0d76dd6 698 context->Message_Block[123] = (uint8_t)(context->Length_Low >> 32);
XinZhangMS 0:f7f1f0d76dd6 699 context->Message_Block[124] = (uint8_t)(context->Length_Low >> 24);
XinZhangMS 0:f7f1f0d76dd6 700 context->Message_Block[125] = (uint8_t)(context->Length_Low >> 16);
XinZhangMS 0:f7f1f0d76dd6 701 context->Message_Block[126] = (uint8_t)(context->Length_Low >> 8);
XinZhangMS 0:f7f1f0d76dd6 702 context->Message_Block[127] = (uint8_t)(context->Length_Low);
XinZhangMS 0:f7f1f0d76dd6 703 #endif /* USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 704
XinZhangMS 0:f7f1f0d76dd6 705 SHA384_512ProcessMessageBlock(context);
XinZhangMS 0:f7f1f0d76dd6 706 }
XinZhangMS 0:f7f1f0d76dd6 707
XinZhangMS 0:f7f1f0d76dd6 708 /*
XinZhangMS 0:f7f1f0d76dd6 709 * SHA384_512ProcessMessageBlock
XinZhangMS 0:f7f1f0d76dd6 710 *
XinZhangMS 0:f7f1f0d76dd6 711 * Description:
XinZhangMS 0:f7f1f0d76dd6 712 * This helper function will process the next 1024 bits of the
XinZhangMS 0:f7f1f0d76dd6 713 * message stored in the Message_Block array.
XinZhangMS 0:f7f1f0d76dd6 714 *
XinZhangMS 0:f7f1f0d76dd6 715 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 716 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 717 * The SHA context to update
XinZhangMS 0:f7f1f0d76dd6 718 *
XinZhangMS 0:f7f1f0d76dd6 719 * Returns:
XinZhangMS 0:f7f1f0d76dd6 720 * Nothing.
XinZhangMS 0:f7f1f0d76dd6 721 *
XinZhangMS 0:f7f1f0d76dd6 722 * Comments:
XinZhangMS 0:f7f1f0d76dd6 723 * Many of the variable names in this code, especially the
XinZhangMS 0:f7f1f0d76dd6 724 * single character names, were used because those were the
XinZhangMS 0:f7f1f0d76dd6 725 * names used in the publication.
XinZhangMS 0:f7f1f0d76dd6 726 *
XinZhangMS 0:f7f1f0d76dd6 727 *
XinZhangMS 0:f7f1f0d76dd6 728 */
XinZhangMS 0:f7f1f0d76dd6 729 static void SHA384_512ProcessMessageBlock(SHA512Context *context)
XinZhangMS 0:f7f1f0d76dd6 730 {
XinZhangMS 0:f7f1f0d76dd6 731 /* Constants defined in FIPS-180-2, section 4.2.3 */
XinZhangMS 0:f7f1f0d76dd6 732 #ifdef USE_32BIT_ONLY
XinZhangMS 0:f7f1f0d76dd6 733 static const uint32_t K[80 * 2] = {
XinZhangMS 0:f7f1f0d76dd6 734 0x428A2F98, 0xD728AE22, 0x71374491, 0x23EF65CD, 0xB5C0FBCF,
XinZhangMS 0:f7f1f0d76dd6 735 0xEC4D3B2F, 0xE9B5DBA5, 0x8189DBBC, 0x3956C25B, 0xF348B538,
XinZhangMS 0:f7f1f0d76dd6 736 0x59F111F1, 0xB605D019, 0x923F82A4, 0xAF194F9B, 0xAB1C5ED5,
XinZhangMS 0:f7f1f0d76dd6 737 0xDA6D8118, 0xD807AA98, 0xA3030242, 0x12835B01, 0x45706FBE,
XinZhangMS 0:f7f1f0d76dd6 738 0x243185BE, 0x4EE4B28C, 0x550C7DC3, 0xD5FFB4E2, 0x72BE5D74,
XinZhangMS 0:f7f1f0d76dd6 739 0xF27B896F, 0x80DEB1FE, 0x3B1696B1, 0x9BDC06A7, 0x25C71235,
XinZhangMS 0:f7f1f0d76dd6 740 0xC19BF174, 0xCF692694, 0xE49B69C1, 0x9EF14AD2, 0xEFBE4786,
XinZhangMS 0:f7f1f0d76dd6 741 0x384F25E3, 0x0FC19DC6, 0x8B8CD5B5, 0x240CA1CC, 0x77AC9C65,
XinZhangMS 0:f7f1f0d76dd6 742 0x2DE92C6F, 0x592B0275, 0x4A7484AA, 0x6EA6E483, 0x5CB0A9DC,
XinZhangMS 0:f7f1f0d76dd6 743 0xBD41FBD4, 0x76F988DA, 0x831153B5, 0x983E5152, 0xEE66DFAB,
XinZhangMS 0:f7f1f0d76dd6 744 0xA831C66D, 0x2DB43210, 0xB00327C8, 0x98FB213F, 0xBF597FC7,
XinZhangMS 0:f7f1f0d76dd6 745 0xBEEF0EE4, 0xC6E00BF3, 0x3DA88FC2, 0xD5A79147, 0x930AA725,
XinZhangMS 0:f7f1f0d76dd6 746 0x06CA6351, 0xE003826F, 0x14292967, 0x0A0E6E70, 0x27B70A85,
XinZhangMS 0:f7f1f0d76dd6 747 0x46D22FFC, 0x2E1B2138, 0x5C26C926, 0x4D2C6DFC, 0x5AC42AED,
XinZhangMS 0:f7f1f0d76dd6 748 0x53380D13, 0x9D95B3DF, 0x650A7354, 0x8BAF63DE, 0x766A0ABB,
XinZhangMS 0:f7f1f0d76dd6 749 0x3C77B2A8, 0x81C2C92E, 0x47EDAEE6, 0x92722C85, 0x1482353B,
XinZhangMS 0:f7f1f0d76dd6 750 0xA2BFE8A1, 0x4CF10364, 0xA81A664B, 0xBC423001, 0xC24B8B70,
XinZhangMS 0:f7f1f0d76dd6 751 0xD0F89791, 0xC76C51A3, 0x0654BE30, 0xD192E819, 0xD6EF5218,
XinZhangMS 0:f7f1f0d76dd6 752 0xD6990624, 0x5565A910, 0xF40E3585, 0x5771202A, 0x106AA070,
XinZhangMS 0:f7f1f0d76dd6 753 0x32BBD1B8, 0x19A4C116, 0xB8D2D0C8, 0x1E376C08, 0x5141AB53,
XinZhangMS 0:f7f1f0d76dd6 754 0x2748774C, 0xDF8EEB99, 0x34B0BCB5, 0xE19B48A8, 0x391C0CB3,
XinZhangMS 0:f7f1f0d76dd6 755 0xC5C95A63, 0x4ED8AA4A, 0xE3418ACB, 0x5B9CCA4F, 0x7763E373,
XinZhangMS 0:f7f1f0d76dd6 756 0x682E6FF3, 0xD6B2B8A3, 0x748F82EE, 0x5DEFB2FC, 0x78A5636F,
XinZhangMS 0:f7f1f0d76dd6 757 0x43172F60, 0x84C87814, 0xA1F0AB72, 0x8CC70208, 0x1A6439EC,
XinZhangMS 0:f7f1f0d76dd6 758 0x90BEFFFA, 0x23631E28, 0xA4506CEB, 0xDE82BDE9, 0xBEF9A3F7,
XinZhangMS 0:f7f1f0d76dd6 759 0xB2C67915, 0xC67178F2, 0xE372532B, 0xCA273ECE, 0xEA26619C,
XinZhangMS 0:f7f1f0d76dd6 760 0xD186B8C7, 0x21C0C207, 0xEADA7DD6, 0xCDE0EB1E, 0xF57D4F7F,
XinZhangMS 0:f7f1f0d76dd6 761 0xEE6ED178, 0x06F067AA, 0x72176FBA, 0x0A637DC5, 0xA2C898A6,
XinZhangMS 0:f7f1f0d76dd6 762 0x113F9804, 0xBEF90DAE, 0x1B710B35, 0x131C471B, 0x28DB77F5,
XinZhangMS 0:f7f1f0d76dd6 763 0x23047D84, 0x32CAAB7B, 0x40C72493, 0x3C9EBE0A, 0x15C9BEBC,
XinZhangMS 0:f7f1f0d76dd6 764 0x431D67C4, 0x9C100D4C, 0x4CC5D4BE, 0xCB3E42B6, 0x597F299C,
XinZhangMS 0:f7f1f0d76dd6 765 0xFC657E2A, 0x5FCB6FAB, 0x3AD6FAEC, 0x6C44198C, 0x4A475817
XinZhangMS 0:f7f1f0d76dd6 766 };
XinZhangMS 0:f7f1f0d76dd6 767 int t, t2, t8; /* Loop counter */
XinZhangMS 0:f7f1f0d76dd6 768 uint32_t temp1[2], temp2[2], /* Temporary word values */
XinZhangMS 0:f7f1f0d76dd6 769 temp3[2], temp4[2], temp5[2];
XinZhangMS 0:f7f1f0d76dd6 770 uint32_t W[2 * 80]; /* Word sequence */
XinZhangMS 0:f7f1f0d76dd6 771 uint32_t A[2], B[2], C[2], D[2], /* Word buffers */
XinZhangMS 0:f7f1f0d76dd6 772 E[2], F[2], G[2], H[2];
XinZhangMS 0:f7f1f0d76dd6 773
XinZhangMS 0:f7f1f0d76dd6 774 /* Initialize the first 16 words in the array W */
XinZhangMS 0:f7f1f0d76dd6 775 for (t = t2 = t8 = 0; t < 16; t++, t8 += 8) {
XinZhangMS 0:f7f1f0d76dd6 776 W[t2++] = ((((uint32_t)context->Message_Block[t8])) << 24) |
XinZhangMS 0:f7f1f0d76dd6 777 ((((uint32_t)context->Message_Block[t8 + 1])) << 16) |
XinZhangMS 0:f7f1f0d76dd6 778 ((((uint32_t)context->Message_Block[t8 + 2])) << 8) |
XinZhangMS 0:f7f1f0d76dd6 779 ((((uint32_t)context->Message_Block[t8 + 3])));
XinZhangMS 0:f7f1f0d76dd6 780 W[t2++] = ((((uint32_t)context->Message_Block[t8 + 4])) << 24) |
XinZhangMS 0:f7f1f0d76dd6 781 ((((uint32_t)context->Message_Block[t8 + 5])) << 16) |
XinZhangMS 0:f7f1f0d76dd6 782 ((((uint32_t)context->Message_Block[t8 + 6])) << 8) |
XinZhangMS 0:f7f1f0d76dd6 783 ((((uint32_t)context->Message_Block[t8 + 7])));
XinZhangMS 0:f7f1f0d76dd6 784 }
XinZhangMS 0:f7f1f0d76dd6 785
XinZhangMS 0:f7f1f0d76dd6 786 for (t = 16; t < 80; t++, t2 += 2) {
XinZhangMS 0:f7f1f0d76dd6 787 /* W[t] = SHA512_sigma1(W[t-2]) + W[t-7] +
XinZhangMS 0:f7f1f0d76dd6 788 SHA512_sigma0(W[t-15]) + W[t-16]; */
XinZhangMS 0:f7f1f0d76dd6 789 uint32_t *Wt2 = &W[t2 - 2 * 2];
XinZhangMS 0:f7f1f0d76dd6 790 uint32_t *Wt7 = &W[t2 - 7 * 2];
XinZhangMS 0:f7f1f0d76dd6 791 uint32_t *Wt15 = &W[t2 - 15 * 2];
XinZhangMS 0:f7f1f0d76dd6 792 uint32_t *Wt16 = &W[t2 - 16 * 2];
XinZhangMS 0:f7f1f0d76dd6 793 SHA512_sigma1(Wt2, temp1);
XinZhangMS 0:f7f1f0d76dd6 794 SHA512_ADD(temp1, Wt7, temp2);
XinZhangMS 0:f7f1f0d76dd6 795 SHA512_sigma0(Wt15, temp1);
XinZhangMS 0:f7f1f0d76dd6 796 SHA512_ADD(temp1, Wt16, temp3);
XinZhangMS 0:f7f1f0d76dd6 797 SHA512_ADD(temp2, temp3, &W[t2]);
XinZhangMS 0:f7f1f0d76dd6 798 }
XinZhangMS 0:f7f1f0d76dd6 799
XinZhangMS 0:f7f1f0d76dd6 800 A[0] = context->Intermediate_Hash[0];
XinZhangMS 0:f7f1f0d76dd6 801 A[1] = context->Intermediate_Hash[1];
XinZhangMS 0:f7f1f0d76dd6 802 B[0] = context->Intermediate_Hash[2];
XinZhangMS 0:f7f1f0d76dd6 803 B[1] = context->Intermediate_Hash[3];
XinZhangMS 0:f7f1f0d76dd6 804 C[0] = context->Intermediate_Hash[4];
XinZhangMS 0:f7f1f0d76dd6 805 C[1] = context->Intermediate_Hash[5];
XinZhangMS 0:f7f1f0d76dd6 806 D[0] = context->Intermediate_Hash[6];
XinZhangMS 0:f7f1f0d76dd6 807 D[1] = context->Intermediate_Hash[7];
XinZhangMS 0:f7f1f0d76dd6 808 E[0] = context->Intermediate_Hash[8];
XinZhangMS 0:f7f1f0d76dd6 809 E[1] = context->Intermediate_Hash[9];
XinZhangMS 0:f7f1f0d76dd6 810 F[0] = context->Intermediate_Hash[10];
XinZhangMS 0:f7f1f0d76dd6 811 F[1] = context->Intermediate_Hash[11];
XinZhangMS 0:f7f1f0d76dd6 812 G[0] = context->Intermediate_Hash[12];
XinZhangMS 0:f7f1f0d76dd6 813 G[1] = context->Intermediate_Hash[13];
XinZhangMS 0:f7f1f0d76dd6 814 H[0] = context->Intermediate_Hash[14];
XinZhangMS 0:f7f1f0d76dd6 815 H[1] = context->Intermediate_Hash[15];
XinZhangMS 0:f7f1f0d76dd6 816
XinZhangMS 0:f7f1f0d76dd6 817 for (t = t2 = 0; t < 80; t++, t2 += 2) {
XinZhangMS 0:f7f1f0d76dd6 818 /*
XinZhangMS 0:f7f1f0d76dd6 819 * temp1 = H + SHA512_SIGMA1(E) + SHA_Ch(E,F,G) + K[t] + W[t];
XinZhangMS 0:f7f1f0d76dd6 820 */
XinZhangMS 0:f7f1f0d76dd6 821 SHA512_SIGMA1(E, temp1);
XinZhangMS 0:f7f1f0d76dd6 822 SHA512_ADD(H, temp1, temp2);
XinZhangMS 0:f7f1f0d76dd6 823 SHA_Ch(E, F, G, temp3);
XinZhangMS 0:f7f1f0d76dd6 824 SHA512_ADD(temp2, temp3, temp4);
XinZhangMS 0:f7f1f0d76dd6 825 SHA512_ADD(&K[t2], &W[t2], temp5);
XinZhangMS 0:f7f1f0d76dd6 826 SHA512_ADD(temp4, temp5, temp1);
XinZhangMS 0:f7f1f0d76dd6 827 /*
XinZhangMS 0:f7f1f0d76dd6 828 * temp2 = SHA512_SIGMA0(A) + SHA_Maj(A,B,C);
XinZhangMS 0:f7f1f0d76dd6 829 */
XinZhangMS 0:f7f1f0d76dd6 830 SHA512_SIGMA0(A, temp3);
XinZhangMS 0:f7f1f0d76dd6 831 SHA_Maj(A, B, C, temp4);
XinZhangMS 0:f7f1f0d76dd6 832 SHA512_ADD(temp3, temp4, temp2);
XinZhangMS 0:f7f1f0d76dd6 833 H[0] = G[0]; H[1] = G[1];
XinZhangMS 0:f7f1f0d76dd6 834 G[0] = F[0]; G[1] = F[1];
XinZhangMS 0:f7f1f0d76dd6 835 F[0] = E[0]; F[1] = E[1];
XinZhangMS 0:f7f1f0d76dd6 836 SHA512_ADD(D, temp1, E);
XinZhangMS 0:f7f1f0d76dd6 837 D[0] = C[0]; D[1] = C[1];
XinZhangMS 0:f7f1f0d76dd6 838 C[0] = B[0]; C[1] = B[1];
XinZhangMS 0:f7f1f0d76dd6 839 B[0] = A[0]; B[1] = A[1];
XinZhangMS 0:f7f1f0d76dd6 840 SHA512_ADD(temp1, temp2, A);
XinZhangMS 0:f7f1f0d76dd6 841 }
XinZhangMS 0:f7f1f0d76dd6 842
XinZhangMS 0:f7f1f0d76dd6 843 SHA512_ADDTO2(&context->Intermediate_Hash[0], A);
XinZhangMS 0:f7f1f0d76dd6 844 SHA512_ADDTO2(&context->Intermediate_Hash[2], B);
XinZhangMS 0:f7f1f0d76dd6 845 SHA512_ADDTO2(&context->Intermediate_Hash[4], C);
XinZhangMS 0:f7f1f0d76dd6 846 SHA512_ADDTO2(&context->Intermediate_Hash[6], D);
XinZhangMS 0:f7f1f0d76dd6 847 SHA512_ADDTO2(&context->Intermediate_Hash[8], E);
XinZhangMS 0:f7f1f0d76dd6 848 SHA512_ADDTO2(&context->Intermediate_Hash[10], F);
XinZhangMS 0:f7f1f0d76dd6 849 SHA512_ADDTO2(&context->Intermediate_Hash[12], G);
XinZhangMS 0:f7f1f0d76dd6 850 SHA512_ADDTO2(&context->Intermediate_Hash[14], H);
XinZhangMS 0:f7f1f0d76dd6 851
XinZhangMS 0:f7f1f0d76dd6 852 #else /* !USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 853 static const uint64_t K[80] = {
XinZhangMS 0:f7f1f0d76dd6 854 0x428A2F98D728AE22ull, 0x7137449123EF65CDull, 0xB5C0FBCFEC4D3B2Full,
XinZhangMS 0:f7f1f0d76dd6 855 0xE9B5DBA58189DBBCull, 0x3956C25BF348B538ull, 0x59F111F1B605D019ull,
XinZhangMS 0:f7f1f0d76dd6 856 0x923F82A4AF194F9Bull, 0xAB1C5ED5DA6D8118ull, 0xD807AA98A3030242ull,
XinZhangMS 0:f7f1f0d76dd6 857 0x12835B0145706FBEull, 0x243185BE4EE4B28Cull, 0x550C7DC3D5FFB4E2ull,
XinZhangMS 0:f7f1f0d76dd6 858 0x72BE5D74F27B896Full, 0x80DEB1FE3B1696B1ull, 0x9BDC06A725C71235ull,
XinZhangMS 0:f7f1f0d76dd6 859 0xC19BF174CF692694ull, 0xE49B69C19EF14AD2ull, 0xEFBE4786384F25E3ull,
XinZhangMS 0:f7f1f0d76dd6 860 0x0FC19DC68B8CD5B5ull, 0x240CA1CC77AC9C65ull, 0x2DE92C6F592B0275ull,
XinZhangMS 0:f7f1f0d76dd6 861 0x4A7484AA6EA6E483ull, 0x5CB0A9DCBD41FBD4ull, 0x76F988DA831153B5ull,
XinZhangMS 0:f7f1f0d76dd6 862 0x983E5152EE66DFABull, 0xA831C66D2DB43210ull, 0xB00327C898FB213Full,
XinZhangMS 0:f7f1f0d76dd6 863 0xBF597FC7BEEF0EE4ull, 0xC6E00BF33DA88FC2ull, 0xD5A79147930AA725ull,
XinZhangMS 0:f7f1f0d76dd6 864 0x06CA6351E003826Full, 0x142929670A0E6E70ull, 0x27B70A8546D22FFCull,
XinZhangMS 0:f7f1f0d76dd6 865 0x2E1B21385C26C926ull, 0x4D2C6DFC5AC42AEDull, 0x53380D139D95B3DFull,
XinZhangMS 0:f7f1f0d76dd6 866 0x650A73548BAF63DEull, 0x766A0ABB3C77B2A8ull, 0x81C2C92E47EDAEE6ull,
XinZhangMS 0:f7f1f0d76dd6 867 0x92722C851482353Bull, 0xA2BFE8A14CF10364ull, 0xA81A664BBC423001ull,
XinZhangMS 0:f7f1f0d76dd6 868 0xC24B8B70D0F89791ull, 0xC76C51A30654BE30ull, 0xD192E819D6EF5218ull,
XinZhangMS 0:f7f1f0d76dd6 869 0xD69906245565A910ull, 0xF40E35855771202Aull, 0x106AA07032BBD1B8ull,
XinZhangMS 0:f7f1f0d76dd6 870 0x19A4C116B8D2D0C8ull, 0x1E376C085141AB53ull, 0x2748774CDF8EEB99ull,
XinZhangMS 0:f7f1f0d76dd6 871 0x34B0BCB5E19B48A8ull, 0x391C0CB3C5C95A63ull, 0x4ED8AA4AE3418ACBull,
XinZhangMS 0:f7f1f0d76dd6 872 0x5B9CCA4F7763E373ull, 0x682E6FF3D6B2B8A3ull, 0x748F82EE5DEFB2FCull,
XinZhangMS 0:f7f1f0d76dd6 873 0x78A5636F43172F60ull, 0x84C87814A1F0AB72ull, 0x8CC702081A6439ECull,
XinZhangMS 0:f7f1f0d76dd6 874 0x90BEFFFA23631E28ull, 0xA4506CEBDE82BDE9ull, 0xBEF9A3F7B2C67915ull,
XinZhangMS 0:f7f1f0d76dd6 875 0xC67178F2E372532Bull, 0xCA273ECEEA26619Cull, 0xD186B8C721C0C207ull,
XinZhangMS 0:f7f1f0d76dd6 876 0xEADA7DD6CDE0EB1Eull, 0xF57D4F7FEE6ED178ull, 0x06F067AA72176FBAull,
XinZhangMS 0:f7f1f0d76dd6 877 0x0A637DC5A2C898A6ull, 0x113F9804BEF90DAEull, 0x1B710B35131C471Bull,
XinZhangMS 0:f7f1f0d76dd6 878 0x28DB77F523047D84ull, 0x32CAAB7B40C72493ull, 0x3C9EBE0A15C9BEBCull,
XinZhangMS 0:f7f1f0d76dd6 879 0x431D67C49C100D4Cull, 0x4CC5D4BECB3E42B6ull, 0x597F299CFC657E2Aull,
XinZhangMS 0:f7f1f0d76dd6 880 0x5FCB6FAB3AD6FAECull, 0x6C44198C4A475817ull
XinZhangMS 0:f7f1f0d76dd6 881 };
XinZhangMS 0:f7f1f0d76dd6 882 int t, t8; /* Loop counter */
XinZhangMS 0:f7f1f0d76dd6 883 uint64_t temp1, temp2; /* Temporary word value */
XinZhangMS 0:f7f1f0d76dd6 884 uint64_t W[80]; /* Word sequence */
XinZhangMS 0:f7f1f0d76dd6 885 uint64_t A, B, C, D, E, F, G, H; /* Word buffers */
XinZhangMS 0:f7f1f0d76dd6 886
XinZhangMS 0:f7f1f0d76dd6 887 /*
XinZhangMS 0:f7f1f0d76dd6 888 * Initialize the first 16 words in the array W
XinZhangMS 0:f7f1f0d76dd6 889 */
XinZhangMS 0:f7f1f0d76dd6 890 for (t = t8 = 0; t < 16; t++, t8 += 8)
XinZhangMS 0:f7f1f0d76dd6 891 W[t] = ((uint64_t)(context->Message_Block[t8]) << 56) |
XinZhangMS 0:f7f1f0d76dd6 892 ((uint64_t)(context->Message_Block[t8 + 1]) << 48) |
XinZhangMS 0:f7f1f0d76dd6 893 ((uint64_t)(context->Message_Block[t8 + 2]) << 40) |
XinZhangMS 0:f7f1f0d76dd6 894 ((uint64_t)(context->Message_Block[t8 + 3]) << 32) |
XinZhangMS 0:f7f1f0d76dd6 895 ((uint64_t)(context->Message_Block[t8 + 4]) << 24) |
XinZhangMS 0:f7f1f0d76dd6 896 ((uint64_t)(context->Message_Block[t8 + 5]) << 16) |
XinZhangMS 0:f7f1f0d76dd6 897 ((uint64_t)(context->Message_Block[t8 + 6]) << 8) |
XinZhangMS 0:f7f1f0d76dd6 898 ((uint64_t)(context->Message_Block[t8 + 7]));
XinZhangMS 0:f7f1f0d76dd6 899
XinZhangMS 0:f7f1f0d76dd6 900 for (t = 16; t < 80; t++)
XinZhangMS 0:f7f1f0d76dd6 901 W[t] = SHA512_sigma1(W[t - 2]) + W[t - 7] +
XinZhangMS 0:f7f1f0d76dd6 902 SHA512_sigma0(W[t - 15]) + W[t - 16];
XinZhangMS 0:f7f1f0d76dd6 903
XinZhangMS 0:f7f1f0d76dd6 904 A = context->Intermediate_Hash[0];
XinZhangMS 0:f7f1f0d76dd6 905 B = context->Intermediate_Hash[1];
XinZhangMS 0:f7f1f0d76dd6 906 C = context->Intermediate_Hash[2];
XinZhangMS 0:f7f1f0d76dd6 907 D = context->Intermediate_Hash[3];
XinZhangMS 0:f7f1f0d76dd6 908 E = context->Intermediate_Hash[4];
XinZhangMS 0:f7f1f0d76dd6 909 F = context->Intermediate_Hash[5];
XinZhangMS 0:f7f1f0d76dd6 910 G = context->Intermediate_Hash[6];
XinZhangMS 0:f7f1f0d76dd6 911 H = context->Intermediate_Hash[7];
XinZhangMS 0:f7f1f0d76dd6 912
XinZhangMS 0:f7f1f0d76dd6 913 for (t = 0; t < 80; t++) {
XinZhangMS 0:f7f1f0d76dd6 914 temp1 = H + SHA512_SIGMA1(E) + SHA_Ch(E, F, G) + K[t] + W[t];
XinZhangMS 0:f7f1f0d76dd6 915 temp2 = SHA512_SIGMA0(A) + SHA_Maj(A, B, C);
XinZhangMS 0:f7f1f0d76dd6 916 H = G;
XinZhangMS 0:f7f1f0d76dd6 917 G = F;
XinZhangMS 0:f7f1f0d76dd6 918 F = E;
XinZhangMS 0:f7f1f0d76dd6 919 E = D + temp1;
XinZhangMS 0:f7f1f0d76dd6 920 D = C;
XinZhangMS 0:f7f1f0d76dd6 921 C = B;
XinZhangMS 0:f7f1f0d76dd6 922 B = A;
XinZhangMS 0:f7f1f0d76dd6 923 A = temp1 + temp2;
XinZhangMS 0:f7f1f0d76dd6 924 }
XinZhangMS 0:f7f1f0d76dd6 925
XinZhangMS 0:f7f1f0d76dd6 926 context->Intermediate_Hash[0] += A;
XinZhangMS 0:f7f1f0d76dd6 927 context->Intermediate_Hash[1] += B;
XinZhangMS 0:f7f1f0d76dd6 928 context->Intermediate_Hash[2] += C;
XinZhangMS 0:f7f1f0d76dd6 929 context->Intermediate_Hash[3] += D;
XinZhangMS 0:f7f1f0d76dd6 930 context->Intermediate_Hash[4] += E;
XinZhangMS 0:f7f1f0d76dd6 931 context->Intermediate_Hash[5] += F;
XinZhangMS 0:f7f1f0d76dd6 932 context->Intermediate_Hash[6] += G;
XinZhangMS 0:f7f1f0d76dd6 933 context->Intermediate_Hash[7] += H;
XinZhangMS 0:f7f1f0d76dd6 934 #endif /* USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 935
XinZhangMS 0:f7f1f0d76dd6 936 context->Message_Block_Index = 0;
XinZhangMS 0:f7f1f0d76dd6 937 }
XinZhangMS 0:f7f1f0d76dd6 938
XinZhangMS 0:f7f1f0d76dd6 939 /*
XinZhangMS 0:f7f1f0d76dd6 940 * SHA384_512Reset
XinZhangMS 0:f7f1f0d76dd6 941 *
XinZhangMS 0:f7f1f0d76dd6 942 * Description:
XinZhangMS 0:f7f1f0d76dd6 943 * This helper function will initialize the SHA512Context in
XinZhangMS 0:f7f1f0d76dd6 944 * preparation for computing a new SHA384 or SHA512 message
XinZhangMS 0:f7f1f0d76dd6 945 * digest.
XinZhangMS 0:f7f1f0d76dd6 946 *
XinZhangMS 0:f7f1f0d76dd6 947 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 948 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 949 * The context to reset.
XinZhangMS 0:f7f1f0d76dd6 950 * H0
XinZhangMS 0:f7f1f0d76dd6 951 * The initial hash value to use.
XinZhangMS 0:f7f1f0d76dd6 952 *
XinZhangMS 0:f7f1f0d76dd6 953 * Returns:
XinZhangMS 0:f7f1f0d76dd6 954 * sha Error Code.
XinZhangMS 0:f7f1f0d76dd6 955 *
XinZhangMS 0:f7f1f0d76dd6 956 */
XinZhangMS 0:f7f1f0d76dd6 957 #ifdef USE_32BIT_ONLY
XinZhangMS 0:f7f1f0d76dd6 958 static int SHA384_512Reset(SHA512Context *context, uint32_t H0[])
XinZhangMS 0:f7f1f0d76dd6 959 #else /* !USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 960 static int SHA384_512Reset(SHA512Context *context, uint64_t H0[])
XinZhangMS 0:f7f1f0d76dd6 961 #endif /* USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 962 {
XinZhangMS 0:f7f1f0d76dd6 963 int i;
XinZhangMS 0:f7f1f0d76dd6 964 if (!context)
XinZhangMS 0:f7f1f0d76dd6 965 return shaNull;
XinZhangMS 0:f7f1f0d76dd6 966
XinZhangMS 0:f7f1f0d76dd6 967 context->Message_Block_Index = 0;
XinZhangMS 0:f7f1f0d76dd6 968
XinZhangMS 0:f7f1f0d76dd6 969 #ifdef USE_32BIT_ONLY
XinZhangMS 0:f7f1f0d76dd6 970 context->Length[0] = context->Length[1] = 0;
XinZhangMS 0:f7f1f0d76dd6 971 context->Length[2] = context->Length[3] = 0;
XinZhangMS 0:f7f1f0d76dd6 972
XinZhangMS 0:f7f1f0d76dd6 973 for (i = 0; i < SHA512HashSize / 4; i++)
XinZhangMS 0:f7f1f0d76dd6 974 context->Intermediate_Hash[i] = H0[i];
XinZhangMS 0:f7f1f0d76dd6 975 #else /* !USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 976 context->Length_High = context->Length_Low = 0;
XinZhangMS 0:f7f1f0d76dd6 977
XinZhangMS 0:f7f1f0d76dd6 978 for (i = 0; i < SHA512HashSize / 8; i++)
XinZhangMS 0:f7f1f0d76dd6 979 context->Intermediate_Hash[i] = H0[i];
XinZhangMS 0:f7f1f0d76dd6 980 #endif /* USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 981
XinZhangMS 0:f7f1f0d76dd6 982 context->Computed = 0;
XinZhangMS 0:f7f1f0d76dd6 983 context->Corrupted = 0;
XinZhangMS 0:f7f1f0d76dd6 984
XinZhangMS 0:f7f1f0d76dd6 985 return shaSuccess;
XinZhangMS 0:f7f1f0d76dd6 986 }
XinZhangMS 0:f7f1f0d76dd6 987
XinZhangMS 0:f7f1f0d76dd6 988 /*
XinZhangMS 0:f7f1f0d76dd6 989 * SHA384_512ResultN
XinZhangMS 0:f7f1f0d76dd6 990 *
XinZhangMS 0:f7f1f0d76dd6 991 * Description:
XinZhangMS 0:f7f1f0d76dd6 992 * This helper function will return the 384-bit or 512-bit message
XinZhangMS 0:f7f1f0d76dd6 993 * digest into the Message_Digest array provided by the caller.
XinZhangMS 0:f7f1f0d76dd6 994 * NOTE: The first octet of hash is stored in the 0th element,
XinZhangMS 0:f7f1f0d76dd6 995 * the last octet of hash in the 48th/64th element.
XinZhangMS 0:f7f1f0d76dd6 996 *
XinZhangMS 0:f7f1f0d76dd6 997 * Parameters:
XinZhangMS 0:f7f1f0d76dd6 998 * context: [in/out]
XinZhangMS 0:f7f1f0d76dd6 999 * The context to use to calculate the SHA hash.
XinZhangMS 0:f7f1f0d76dd6 1000 * Message_Digest: [out]
XinZhangMS 0:f7f1f0d76dd6 1001 * Where the digest is returned.
XinZhangMS 0:f7f1f0d76dd6 1002 * HashSize: [in]
XinZhangMS 0:f7f1f0d76dd6 1003 * The size of the hash, either 48 or 64.
XinZhangMS 0:f7f1f0d76dd6 1004 *
XinZhangMS 0:f7f1f0d76dd6 1005 * Returns:
XinZhangMS 0:f7f1f0d76dd6 1006 * sha Error Code.
XinZhangMS 0:f7f1f0d76dd6 1007 *
XinZhangMS 0:f7f1f0d76dd6 1008 */
XinZhangMS 0:f7f1f0d76dd6 1009 static int SHA384_512ResultN(SHA512Context *context,
XinZhangMS 0:f7f1f0d76dd6 1010 uint8_t Message_Digest[], int HashSize)
XinZhangMS 0:f7f1f0d76dd6 1011 {
XinZhangMS 0:f7f1f0d76dd6 1012 int i;
XinZhangMS 0:f7f1f0d76dd6 1013
XinZhangMS 0:f7f1f0d76dd6 1014 #ifdef USE_32BIT_ONLY
XinZhangMS 0:f7f1f0d76dd6 1015 int i2;
XinZhangMS 0:f7f1f0d76dd6 1016 #endif /* USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 1017
XinZhangMS 0:f7f1f0d76dd6 1018 if (!context || !Message_Digest)
XinZhangMS 0:f7f1f0d76dd6 1019 return shaNull;
XinZhangMS 0:f7f1f0d76dd6 1020
XinZhangMS 0:f7f1f0d76dd6 1021 if (context->Corrupted)
XinZhangMS 0:f7f1f0d76dd6 1022 return context->Corrupted;
XinZhangMS 0:f7f1f0d76dd6 1023
XinZhangMS 0:f7f1f0d76dd6 1024 if (!context->Computed)
XinZhangMS 0:f7f1f0d76dd6 1025 SHA384_512Finalize(context, 0x80);
XinZhangMS 0:f7f1f0d76dd6 1026
XinZhangMS 0:f7f1f0d76dd6 1027 #ifdef USE_32BIT_ONLY
XinZhangMS 0:f7f1f0d76dd6 1028 for (i = i2 = 0; i < HashSize;) {
XinZhangMS 0:f7f1f0d76dd6 1029 Message_Digest[i++] = (uint8_t)(context->Intermediate_Hash[i2] >> 24);
XinZhangMS 0:f7f1f0d76dd6 1030 Message_Digest[i++] = (uint8_t)(context->Intermediate_Hash[i2] >> 16);
XinZhangMS 0:f7f1f0d76dd6 1031 Message_Digest[i++] = (uint8_t)(context->Intermediate_Hash[i2] >> 8);
XinZhangMS 0:f7f1f0d76dd6 1032 Message_Digest[i++] = (uint8_t)(context->Intermediate_Hash[i2++]);
XinZhangMS 0:f7f1f0d76dd6 1033 Message_Digest[i++] = (uint8_t)(context->Intermediate_Hash[i2] >> 24);
XinZhangMS 0:f7f1f0d76dd6 1034 Message_Digest[i++] = (uint8_t)(context->Intermediate_Hash[i2] >> 16);
XinZhangMS 0:f7f1f0d76dd6 1035 Message_Digest[i++] = (uint8_t)(context->Intermediate_Hash[i2] >> 8);
XinZhangMS 0:f7f1f0d76dd6 1036 Message_Digest[i++] = (uint8_t)(context->Intermediate_Hash[i2++]);
XinZhangMS 0:f7f1f0d76dd6 1037 }
XinZhangMS 0:f7f1f0d76dd6 1038 #else /* !USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 1039 for (i = 0; i < HashSize; ++i)
XinZhangMS 0:f7f1f0d76dd6 1040 Message_Digest[i] = (uint8_t)
XinZhangMS 0:f7f1f0d76dd6 1041 (context->Intermediate_Hash[i >> 3] >> 8 * (7 - (i % 8)));
XinZhangMS 0:f7f1f0d76dd6 1042 #endif /* USE_32BIT_ONLY */
XinZhangMS 0:f7f1f0d76dd6 1043
XinZhangMS 0:f7f1f0d76dd6 1044 return shaSuccess;
XinZhangMS 0:f7f1f0d76dd6 1045 }
XinZhangMS 0:f7f1f0d76dd6 1046