Botan
1.11.15
|
00001 /* 00002 * SHA-{384,512} 00003 * (C) 1999-2011,2015 Jack Lloyd 00004 * 00005 * Botan is released under the Simplified BSD License (see license.txt) 00006 */ 00007 00008 #include <botan/internal/hash_utils.h> 00009 #include <botan/sha2_64.h> 00010 00011 namespace Botan { 00012 00013 BOTAN_REGISTER_HASH_NAMED_NOARGS(SHA_384, "SHA-384"); 00014 BOTAN_REGISTER_HASH_NAMED_NOARGS(SHA_512, "SHA-512"); 00015 BOTAN_REGISTER_HASH_NAMED_NOARGS(SHA_512_256, "SHA-512-256"); 00016 00017 namespace { 00018 00019 namespace SHA2_64 { 00020 00021 /* 00022 * SHA-{384,512} Rho Function 00023 */ 00024 inline u64bit rho(u64bit X, u32bit rot1, u32bit rot2, u32bit rot3) 00025 { 00026 return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ 00027 rotate_right(X, rot3)); 00028 } 00029 00030 /* 00031 * SHA-{384,512} Sigma Function 00032 */ 00033 inline u64bit sigma(u64bit X, u32bit rot1, u32bit rot2, u32bit shift) 00034 { 00035 return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ (X >> shift)); 00036 } 00037 00038 /* 00039 * SHA-512 F1 Function 00040 * 00041 * Use a macro as many compilers won't inline a function this big, 00042 * even though it is much faster if inlined. 00043 */ 00044 #define SHA2_64_F(A, B, C, D, E, F, G, H, M1, M2, M3, M4, magic) \ 00045 do { \ 00046 H += magic + rho(E, 14, 18, 41) + ((E & F) ^ (~E & G)) + M1; \ 00047 D += H; \ 00048 H += rho(A, 28, 34, 39) + ((A & B) | ((A | B) & C)); \ 00049 M1 += sigma(M2, 19, 61, 6) + M3 + sigma(M4, 1, 8, 7); \ 00050 } while(0); 00051 00052 /* 00053 * SHA-{384,512} Compression Function 00054 */ 00055 void compress(secure_vector<u64bit>& digest, 00056 const byte input[], size_t blocks) 00057 { 00058 u64bit A = digest[0], B = digest[1], C = digest[2], 00059 D = digest[3], E = digest[4], F = digest[5], 00060 G = digest[6], H = digest[7]; 00061 00062 for(size_t i = 0; i != blocks; ++i) 00063 { 00064 u64bit W00 = load_be<u64bit>(input, 0); 00065 u64bit W01 = load_be<u64bit>(input, 1); 00066 u64bit W02 = load_be<u64bit>(input, 2); 00067 u64bit W03 = load_be<u64bit>(input, 3); 00068 u64bit W04 = load_be<u64bit>(input, 4); 00069 u64bit W05 = load_be<u64bit>(input, 5); 00070 u64bit W06 = load_be<u64bit>(input, 6); 00071 u64bit W07 = load_be<u64bit>(input, 7); 00072 u64bit W08 = load_be<u64bit>(input, 8); 00073 u64bit W09 = load_be<u64bit>(input, 9); 00074 u64bit W10 = load_be<u64bit>(input, 10); 00075 u64bit W11 = load_be<u64bit>(input, 11); 00076 u64bit W12 = load_be<u64bit>(input, 12); 00077 u64bit W13 = load_be<u64bit>(input, 13); 00078 u64bit W14 = load_be<u64bit>(input, 14); 00079 u64bit W15 = load_be<u64bit>(input, 15); 00080 00081 SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x428A2F98D728AE22); 00082 SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x7137449123EF65CD); 00083 SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0xB5C0FBCFEC4D3B2F); 00084 SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0xE9B5DBA58189DBBC); 00085 SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x3956C25BF348B538); 00086 SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x59F111F1B605D019); 00087 SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x923F82A4AF194F9B); 00088 SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0xAB1C5ED5DA6D8118); 00089 SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xD807AA98A3030242); 00090 SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x12835B0145706FBE); 00091 SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x243185BE4EE4B28C); 00092 SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x550C7DC3D5FFB4E2); 00093 SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x72BE5D74F27B896F); 00094 SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0x80DEB1FE3B1696B1); 00095 SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x9BDC06A725C71235); 00096 SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC19BF174CF692694); 00097 SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0xE49B69C19EF14AD2); 00098 SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0xEFBE4786384F25E3); 00099 SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x0FC19DC68B8CD5B5); 00100 SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x240CA1CC77AC9C65); 00101 SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x2DE92C6F592B0275); 00102 SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4A7484AA6EA6E483); 00103 SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5CB0A9DCBD41FBD4); 00104 SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x76F988DA831153B5); 00105 SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x983E5152EE66DFAB); 00106 SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA831C66D2DB43210); 00107 SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xB00327C898FB213F); 00108 SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xBF597FC7BEEF0EE4); 00109 SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xC6E00BF33DA88FC2); 00110 SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD5A79147930AA725); 00111 SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x06CA6351E003826F); 00112 SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x142929670A0E6E70); 00113 SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x27B70A8546D22FFC); 00114 SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x2E1B21385C26C926); 00115 SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x4D2C6DFC5AC42AED); 00116 SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x53380D139D95B3DF); 00117 SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x650A73548BAF63DE); 00118 SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x766A0ABB3C77B2A8); 00119 SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x81C2C92E47EDAEE6); 00120 SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x92722C851482353B); 00121 SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xA2BFE8A14CF10364); 00122 SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA81A664BBC423001); 00123 SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xC24B8B70D0F89791); 00124 SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xC76C51A30654BE30); 00125 SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xD192E819D6EF5218); 00126 SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD69906245565A910); 00127 SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xF40E35855771202A); 00128 SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x106AA07032BBD1B8); 00129 SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x19A4C116B8D2D0C8); 00130 SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x1E376C085141AB53); 00131 SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x2748774CDF8EEB99); 00132 SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x34B0BCB5E19B48A8); 00133 SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x391C0CB3C5C95A63); 00134 SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4ED8AA4AE3418ACB); 00135 SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5B9CCA4F7763E373); 00136 SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x682E6FF3D6B2B8A3); 00137 SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x748F82EE5DEFB2FC); 00138 SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x78A5636F43172F60); 00139 SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x84C87814A1F0AB72); 00140 SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x8CC702081A6439EC); 00141 SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x90BEFFFA23631E28); 00142 SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xA4506CEBDE82BDE9); 00143 SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xBEF9A3F7B2C67915); 00144 SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC67178F2E372532B); 00145 SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0xCA273ECEEA26619C); 00146 SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0xD186B8C721C0C207); 00147 SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0xEADA7DD6CDE0EB1E); 00148 SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0xF57D4F7FEE6ED178); 00149 SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x06F067AA72176FBA); 00150 SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x0A637DC5A2C898A6); 00151 SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x113F9804BEF90DAE); 00152 SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x1B710B35131C471B); 00153 SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x28DB77F523047D84); 00154 SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x32CAAB7B40C72493); 00155 SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x3C9EBE0A15C9BEBC); 00156 SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x431D67C49C100D4C); 00157 SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x4CC5D4BECB3E42B6); 00158 SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0x597F299CFC657E2A); 00159 SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x5FCB6FAB3AD6FAEC); 00160 SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x6C44198C4A475817); 00161 00162 A = (digest[0] += A); 00163 B = (digest[1] += B); 00164 C = (digest[2] += C); 00165 D = (digest[3] += D); 00166 E = (digest[4] += E); 00167 F = (digest[5] += F); 00168 G = (digest[6] += G); 00169 H = (digest[7] += H); 00170 00171 input += 128; 00172 } 00173 } 00174 00175 } 00176 00177 } 00178 00179 void SHA_512_256::compress_n(const byte input[], size_t blocks) 00180 { 00181 SHA2_64::compress(m_digest, input, blocks); 00182 } 00183 00184 void SHA_384::compress_n(const byte input[], size_t blocks) 00185 { 00186 SHA2_64::compress(m_digest, input, blocks); 00187 } 00188 00189 void SHA_512::compress_n(const byte input[], size_t blocks) 00190 { 00191 SHA2_64::compress(m_digest, input, blocks); 00192 } 00193 00194 void SHA_512_256::copy_out(byte output[]) 00195 { 00196 copy_out_vec_be(output, output_length(), m_digest); 00197 } 00198 00199 void SHA_384::copy_out(byte output[]) 00200 { 00201 copy_out_vec_be(output, output_length(), m_digest); 00202 } 00203 00204 void SHA_512::copy_out(byte output[]) 00205 { 00206 copy_out_vec_be(output, output_length(), m_digest); 00207 } 00208 00209 void SHA_512_256::clear() 00210 { 00211 MDx_HashFunction::clear(); 00212 m_digest[0] = 0x22312194FC2BF72C; 00213 m_digest[1] = 0x9F555FA3C84C64C2; 00214 m_digest[2] = 0x2393B86B6F53B151; 00215 m_digest[3] = 0x963877195940EABD; 00216 m_digest[4] = 0x96283EE2A88EFFE3; 00217 m_digest[5] = 0xBE5E1E2553863992; 00218 m_digest[6] = 0x2B0199FC2C85B8AA; 00219 m_digest[7] = 0x0EB72DDC81C52CA2; 00220 } 00221 00222 void SHA_384::clear() 00223 { 00224 MDx_HashFunction::clear(); 00225 m_digest[0] = 0xCBBB9D5DC1059ED8; 00226 m_digest[1] = 0x629A292A367CD507; 00227 m_digest[2] = 0x9159015A3070DD17; 00228 m_digest[3] = 0x152FECD8F70E5939; 00229 m_digest[4] = 0x67332667FFC00B31; 00230 m_digest[5] = 0x8EB44A8768581511; 00231 m_digest[6] = 0xDB0C2E0D64F98FA7; 00232 m_digest[7] = 0x47B5481DBEFA4FA4; 00233 } 00234 00235 void SHA_512::clear() 00236 { 00237 MDx_HashFunction::clear(); 00238 m_digest[0] = 0x6A09E667F3BCC908; 00239 m_digest[1] = 0xBB67AE8584CAA73B; 00240 m_digest[2] = 0x3C6EF372FE94F82B; 00241 m_digest[3] = 0xA54FF53A5F1D36F1; 00242 m_digest[4] = 0x510E527FADE682D1; 00243 m_digest[5] = 0x9B05688C2B3E6C1F; 00244 m_digest[6] = 0x1F83D9ABFB41BD6B; 00245 m_digest[7] = 0x5BE0CD19137E2179; 00246 } 00247 00248 }