diff options
Diffstat (limited to 'botan/src/hash/sha2')
-rw-r--r-- | botan/src/hash/sha2/info.txt | 16 | ||||
-rw-r--r-- | botan/src/hash/sha2/sha2_32.cpp | 193 | ||||
-rw-r--r-- | botan/src/hash/sha2/sha2_32.h | 59 | ||||
-rw-r--r-- | botan/src/hash/sha2/sha2_64.cpp | 208 | ||||
-rw-r--r-- | botan/src/hash/sha2/sha2_64.h | 60 |
5 files changed, 536 insertions, 0 deletions
diff --git a/botan/src/hash/sha2/info.txt b/botan/src/hash/sha2/info.txt new file mode 100644 index 0000000..9b92ff3 --- /dev/null +++ b/botan/src/hash/sha2/info.txt @@ -0,0 +1,16 @@ +realname "SHA-2 (224, 256, 384, 512)" + +define SHA2 + +load_on auto + +<add> +sha2_32.cpp +sha2_32.h +sha2_64.cpp +sha2_64.h +</add> + +<requires> +mdx_hash +</requires> diff --git a/botan/src/hash/sha2/sha2_32.cpp b/botan/src/hash/sha2/sha2_32.cpp new file mode 100644 index 0000000..9da2ec2 --- /dev/null +++ b/botan/src/hash/sha2/sha2_32.cpp @@ -0,0 +1,193 @@ +/* +* SHA-{224,256} +* (C) 1999-2008 Jack Lloyd +* 2007 FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#include <botan/sha2_32.h> +#include <botan/loadstor.h> +#include <botan/rotate.h> + +namespace Botan { + +namespace { + +/* +* SHA-256 Rho Function +*/ +inline u32bit rho(u32bit X, u32bit rot1, u32bit rot2, u32bit rot3) + { + return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ + rotate_right(X, rot3)); + } + +/* +* SHA-256 Sigma Function +*/ +inline u32bit sigma(u32bit X, u32bit rot1, u32bit rot2, u32bit shift) + { + return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ (X >> shift)); + } + +/* +* SHA-256 F1 Function +*/ +inline void F1(u32bit A, u32bit B, u32bit C, u32bit& D, + u32bit E, u32bit F, u32bit G, u32bit& H, + u32bit msg, u32bit magic) + { + magic += rho(E, 6, 11, 25) + ((E & F) ^ (~E & G)) + msg; + D += magic + H; + H += magic + rho(A, 2, 13, 22) + ((A & B) ^ (A & C) ^ (B & C)); + } + +} + +/* +* SHA-256 Compression Function +*/ +void SHA_224_256_BASE::compress_n(const byte input[], u32bit blocks) + { + u32bit A = digest[0], B = digest[1], C = digest[2], + D = digest[3], E = digest[4], F = digest[5], + G = digest[6], H = digest[7]; + + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0; j != 16; ++j) + W[j] = load_be<u32bit>(input, j); + input += HASH_BLOCK_SIZE; + + for(u32bit j = 16; j != 64; ++j) + W[j] = sigma(W[j- 2], 17, 19, 10) + W[j- 7] + + sigma(W[j-15], 7, 18, 3) + W[j-16]; + + F1(A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98); + F1(H, A, B, C, D, E, F, G, W[ 1], 0x71374491); + F1(G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF); + F1(F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5); + F1(E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B); + F1(D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1); + F1(C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4); + F1(B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5); + F1(A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98); + F1(H, A, B, C, D, E, F, G, W[ 9], 0x12835B01); + F1(G, H, A, B, C, D, E, F, W[10], 0x243185BE); + F1(F, G, H, A, B, C, D, E, W[11], 0x550C7DC3); + F1(E, F, G, H, A, B, C, D, W[12], 0x72BE5D74); + F1(D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE); + F1(C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7); + F1(B, C, D, E, F, G, H, A, W[15], 0xC19BF174); + F1(A, B, C, D, E, F, G, H, W[16], 0xE49B69C1); + F1(H, A, B, C, D, E, F, G, W[17], 0xEFBE4786); + F1(G, H, A, B, C, D, E, F, W[18], 0x0FC19DC6); + F1(F, G, H, A, B, C, D, E, W[19], 0x240CA1CC); + F1(E, F, G, H, A, B, C, D, W[20], 0x2DE92C6F); + F1(D, E, F, G, H, A, B, C, W[21], 0x4A7484AA); + F1(C, D, E, F, G, H, A, B, W[22], 0x5CB0A9DC); + F1(B, C, D, E, F, G, H, A, W[23], 0x76F988DA); + F1(A, B, C, D, E, F, G, H, W[24], 0x983E5152); + F1(H, A, B, C, D, E, F, G, W[25], 0xA831C66D); + F1(G, H, A, B, C, D, E, F, W[26], 0xB00327C8); + F1(F, G, H, A, B, C, D, E, W[27], 0xBF597FC7); + F1(E, F, G, H, A, B, C, D, W[28], 0xC6E00BF3); + F1(D, E, F, G, H, A, B, C, W[29], 0xD5A79147); + F1(C, D, E, F, G, H, A, B, W[30], 0x06CA6351); + F1(B, C, D, E, F, G, H, A, W[31], 0x14292967); + F1(A, B, C, D, E, F, G, H, W[32], 0x27B70A85); + F1(H, A, B, C, D, E, F, G, W[33], 0x2E1B2138); + F1(G, H, A, B, C, D, E, F, W[34], 0x4D2C6DFC); + F1(F, G, H, A, B, C, D, E, W[35], 0x53380D13); + F1(E, F, G, H, A, B, C, D, W[36], 0x650A7354); + F1(D, E, F, G, H, A, B, C, W[37], 0x766A0ABB); + F1(C, D, E, F, G, H, A, B, W[38], 0x81C2C92E); + F1(B, C, D, E, F, G, H, A, W[39], 0x92722C85); + F1(A, B, C, D, E, F, G, H, W[40], 0xA2BFE8A1); + F1(H, A, B, C, D, E, F, G, W[41], 0xA81A664B); + F1(G, H, A, B, C, D, E, F, W[42], 0xC24B8B70); + F1(F, G, H, A, B, C, D, E, W[43], 0xC76C51A3); + F1(E, F, G, H, A, B, C, D, W[44], 0xD192E819); + F1(D, E, F, G, H, A, B, C, W[45], 0xD6990624); + F1(C, D, E, F, G, H, A, B, W[46], 0xF40E3585); + F1(B, C, D, E, F, G, H, A, W[47], 0x106AA070); + F1(A, B, C, D, E, F, G, H, W[48], 0x19A4C116); + F1(H, A, B, C, D, E, F, G, W[49], 0x1E376C08); + F1(G, H, A, B, C, D, E, F, W[50], 0x2748774C); + F1(F, G, H, A, B, C, D, E, W[51], 0x34B0BCB5); + F1(E, F, G, H, A, B, C, D, W[52], 0x391C0CB3); + F1(D, E, F, G, H, A, B, C, W[53], 0x4ED8AA4A); + F1(C, D, E, F, G, H, A, B, W[54], 0x5B9CCA4F); + F1(B, C, D, E, F, G, H, A, W[55], 0x682E6FF3); + F1(A, B, C, D, E, F, G, H, W[56], 0x748F82EE); + F1(H, A, B, C, D, E, F, G, W[57], 0x78A5636F); + F1(G, H, A, B, C, D, E, F, W[58], 0x84C87814); + F1(F, G, H, A, B, C, D, E, W[59], 0x8CC70208); + F1(E, F, G, H, A, B, C, D, W[60], 0x90BEFFFA); + F1(D, E, F, G, H, A, B, C, W[61], 0xA4506CEB); + F1(C, D, E, F, G, H, A, B, W[62], 0xBEF9A3F7); + F1(B, C, D, E, F, G, H, A, W[63], 0xC67178F2); + + A = (digest[0] += A); + B = (digest[1] += B); + C = (digest[2] += C); + D = (digest[3] += D); + E = (digest[4] += E); + F = (digest[5] += F); + G = (digest[6] += G); + H = (digest[7] += H); + } + } + +/* +* Copy out the digest +*/ +void SHA_224_256_BASE::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; j += 4) + store_be(digest[j/4], output + j); + } + +/* +* Clear memory of sensitive data +*/ +void SHA_224_256_BASE::clear() throw() + { + MDx_HashFunction::clear(); + W.clear(); + } + +/* +* Clear memory of sensitive data +*/ +void SHA_224::clear() throw() + { + SHA_224_256_BASE::clear(); + digest[0] = 0xc1059ed8; + digest[1] = 0x367cd507; + digest[2] = 0x3070dd17; + digest[3] = 0xf70e5939; + digest[4] = 0xffc00b31; + digest[5] = 0x68581511; + digest[6] = 0x64f98fa7; + digest[7] = 0xbefa4fa4; + } + +/* +* Clear memory of sensitive data +*/ +void SHA_256::clear() throw() + { + SHA_224_256_BASE::clear(); + digest[0] = 0x6A09E667; + digest[1] = 0xBB67AE85; + digest[2] = 0x3C6EF372; + digest[3] = 0xA54FF53A; + digest[4] = 0x510E527F; + digest[5] = 0x9B05688C; + digest[6] = 0x1F83D9AB; + digest[7] = 0x5BE0CD19; + } + +} diff --git a/botan/src/hash/sha2/sha2_32.h b/botan/src/hash/sha2/sha2_32.h new file mode 100644 index 0000000..05083d1 --- /dev/null +++ b/botan/src/hash/sha2/sha2_32.h @@ -0,0 +1,59 @@ +/* +* SHA-{224,256} +* (C) 1999-2008 Jack Lloyd +* 2007 FlexSecure GmbH +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SHA_256_H__ +#define BOTAN_SHA_256_H__ + +#include <botan/mdx_hash.h> + +namespace Botan { + +/* +* SHA-{224,256} Base +*/ +class BOTAN_DLL SHA_224_256_BASE : public MDx_HashFunction + { + protected: + void clear() throw(); + SHA_224_256_BASE(u32bit out) : + MDx_HashFunction(out, 64, true, true) { clear(); } + + SecureBuffer<u32bit, 64> W; + SecureBuffer<u32bit, 8> digest; + private: + void compress_n(const byte[], u32bit blocks); + void copy_out(byte[]); + }; + +/* +* SHA-224 +*/ +class BOTAN_DLL SHA_224 : public SHA_224_256_BASE + { + public: + void clear() throw(); + std::string name() const { return "SHA-224"; } + HashFunction* clone() const { return new SHA_224; } + SHA_224() : SHA_224_256_BASE(28) { clear(); } + }; + +/* +* SHA-256 +*/ +class BOTAN_DLL SHA_256 : public SHA_224_256_BASE + { + public: + void clear() throw(); + std::string name() const { return "SHA-256"; } + HashFunction* clone() const { return new SHA_256; } + SHA_256() : SHA_224_256_BASE(32) { clear (); } + }; + +} + +#endif diff --git a/botan/src/hash/sha2/sha2_64.cpp b/botan/src/hash/sha2/sha2_64.cpp new file mode 100644 index 0000000..c2a8749 --- /dev/null +++ b/botan/src/hash/sha2/sha2_64.cpp @@ -0,0 +1,208 @@ +/* +* SHA-{384,512} +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include <botan/sha2_64.h> +#include <botan/loadstor.h> +#include <botan/rotate.h> + +namespace Botan { + +namespace { + +/* +* SHA-{384,512} Rho Function +*/ +inline u64bit rho(u64bit X, u32bit rot1, u32bit rot2, u32bit rot3) + { + return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ + rotate_right(X, rot3)); + } + +/* +* SHA-{384,512} F1 Function +*/ +inline void F1(u64bit A, u64bit B, u64bit C, u64bit& D, + u64bit E, u64bit F, u64bit G, u64bit& H, + u64bit msg, u64bit magic) + { + magic += rho(E, 14, 18, 41) + ((E & F) ^ (~E & G)) + msg; + D += magic + H; + H += magic + rho(A, 28, 34, 39) + ((A & B) ^ (A & C) ^ (B & C)); + } + +/* +* SHA-{384,512} Sigma Function +*/ +inline u64bit sigma(u64bit X, u32bit rot1, u32bit rot2, u32bit shift) + { + return (rotate_right(X, rot1) ^ rotate_right(X, rot2) ^ (X >> shift)); + } + +} + +/* +* SHA-{384,512} Compression Function +*/ +void SHA_384_512_BASE::compress_n(const byte input[], u32bit blocks) + { + u64bit A = digest[0], B = digest[1], C = digest[2], + D = digest[3], E = digest[4], F = digest[5], + G = digest[6], H = digest[7]; + + for(u32bit i = 0; i != blocks; ++i) + { + for(u32bit j = 0; j != 16; ++j) + W[j] = load_be<u64bit>(input, j); + input += HASH_BLOCK_SIZE; + + for(u32bit j = 16; j != 80; ++j) + W[j] = sigma(W[j- 2], 19, 61, 6) + W[j- 7] + + sigma(W[j-15], 1, 8, 7) + W[j-16]; + + F1(A, B, C, D, E, F, G, H, W[ 0], (u64bit) 0x428A2F98D728AE22ULL); + F1(H, A, B, C, D, E, F, G, W[ 1], (u64bit) 0x7137449123EF65CDULL); + F1(G, H, A, B, C, D, E, F, W[ 2], (u64bit) 0xB5C0FBCFEC4D3B2FULL); + F1(F, G, H, A, B, C, D, E, W[ 3], (u64bit) 0xE9B5DBA58189DBBCULL); + F1(E, F, G, H, A, B, C, D, W[ 4], (u64bit) 0x3956C25BF348B538ULL); + F1(D, E, F, G, H, A, B, C, W[ 5], (u64bit) 0x59F111F1B605D019ULL); + F1(C, D, E, F, G, H, A, B, W[ 6], (u64bit) 0x923F82A4AF194F9BULL); + F1(B, C, D, E, F, G, H, A, W[ 7], (u64bit) 0xAB1C5ED5DA6D8118ULL); + F1(A, B, C, D, E, F, G, H, W[ 8], (u64bit) 0xD807AA98A3030242ULL); + F1(H, A, B, C, D, E, F, G, W[ 9], (u64bit) 0x12835B0145706FBEULL); + F1(G, H, A, B, C, D, E, F, W[10], (u64bit) 0x243185BE4EE4B28CULL); + F1(F, G, H, A, B, C, D, E, W[11], (u64bit) 0x550C7DC3D5FFB4E2ULL); + F1(E, F, G, H, A, B, C, D, W[12], (u64bit) 0x72BE5D74F27B896FULL); + F1(D, E, F, G, H, A, B, C, W[13], (u64bit) 0x80DEB1FE3B1696B1ULL); + F1(C, D, E, F, G, H, A, B, W[14], (u64bit) 0x9BDC06A725C71235ULL); + F1(B, C, D, E, F, G, H, A, W[15], (u64bit) 0xC19BF174CF692694ULL); + F1(A, B, C, D, E, F, G, H, W[16], (u64bit) 0xE49B69C19EF14AD2ULL); + F1(H, A, B, C, D, E, F, G, W[17], (u64bit) 0xEFBE4786384F25E3ULL); + F1(G, H, A, B, C, D, E, F, W[18], (u64bit) 0x0FC19DC68B8CD5B5ULL); + F1(F, G, H, A, B, C, D, E, W[19], (u64bit) 0x240CA1CC77AC9C65ULL); + F1(E, F, G, H, A, B, C, D, W[20], (u64bit) 0x2DE92C6F592B0275ULL); + F1(D, E, F, G, H, A, B, C, W[21], (u64bit) 0x4A7484AA6EA6E483ULL); + F1(C, D, E, F, G, H, A, B, W[22], (u64bit) 0x5CB0A9DCBD41FBD4ULL); + F1(B, C, D, E, F, G, H, A, W[23], (u64bit) 0x76F988DA831153B5ULL); + F1(A, B, C, D, E, F, G, H, W[24], (u64bit) 0x983E5152EE66DFABULL); + F1(H, A, B, C, D, E, F, G, W[25], (u64bit) 0xA831C66D2DB43210ULL); + F1(G, H, A, B, C, D, E, F, W[26], (u64bit) 0xB00327C898FB213FULL); + F1(F, G, H, A, B, C, D, E, W[27], (u64bit) 0xBF597FC7BEEF0EE4ULL); + F1(E, F, G, H, A, B, C, D, W[28], (u64bit) 0xC6E00BF33DA88FC2ULL); + F1(D, E, F, G, H, A, B, C, W[29], (u64bit) 0xD5A79147930AA725ULL); + F1(C, D, E, F, G, H, A, B, W[30], (u64bit) 0x06CA6351E003826FULL); + F1(B, C, D, E, F, G, H, A, W[31], (u64bit) 0x142929670A0E6E70ULL); + F1(A, B, C, D, E, F, G, H, W[32], (u64bit) 0x27B70A8546D22FFCULL); + F1(H, A, B, C, D, E, F, G, W[33], (u64bit) 0x2E1B21385C26C926ULL); + F1(G, H, A, B, C, D, E, F, W[34], (u64bit) 0x4D2C6DFC5AC42AEDULL); + F1(F, G, H, A, B, C, D, E, W[35], (u64bit) 0x53380D139D95B3DFULL); + F1(E, F, G, H, A, B, C, D, W[36], (u64bit) 0x650A73548BAF63DEULL); + F1(D, E, F, G, H, A, B, C, W[37], (u64bit) 0x766A0ABB3C77B2A8ULL); + F1(C, D, E, F, G, H, A, B, W[38], (u64bit) 0x81C2C92E47EDAEE6ULL); + F1(B, C, D, E, F, G, H, A, W[39], (u64bit) 0x92722C851482353BULL); + F1(A, B, C, D, E, F, G, H, W[40], (u64bit) 0xA2BFE8A14CF10364ULL); + F1(H, A, B, C, D, E, F, G, W[41], (u64bit) 0xA81A664BBC423001ULL); + F1(G, H, A, B, C, D, E, F, W[42], (u64bit) 0xC24B8B70D0F89791ULL); + F1(F, G, H, A, B, C, D, E, W[43], (u64bit) 0xC76C51A30654BE30ULL); + F1(E, F, G, H, A, B, C, D, W[44], (u64bit) 0xD192E819D6EF5218ULL); + F1(D, E, F, G, H, A, B, C, W[45], (u64bit) 0xD69906245565A910ULL); + F1(C, D, E, F, G, H, A, B, W[46], (u64bit) 0xF40E35855771202AULL); + F1(B, C, D, E, F, G, H, A, W[47], (u64bit) 0x106AA07032BBD1B8ULL); + F1(A, B, C, D, E, F, G, H, W[48], (u64bit) 0x19A4C116B8D2D0C8ULL); + F1(H, A, B, C, D, E, F, G, W[49], (u64bit) 0x1E376C085141AB53ULL); + F1(G, H, A, B, C, D, E, F, W[50], (u64bit) 0x2748774CDF8EEB99ULL); + F1(F, G, H, A, B, C, D, E, W[51], (u64bit) 0x34B0BCB5E19B48A8ULL); + F1(E, F, G, H, A, B, C, D, W[52], (u64bit) 0x391C0CB3C5C95A63ULL); + F1(D, E, F, G, H, A, B, C, W[53], (u64bit) 0x4ED8AA4AE3418ACBULL); + F1(C, D, E, F, G, H, A, B, W[54], (u64bit) 0x5B9CCA4F7763E373ULL); + F1(B, C, D, E, F, G, H, A, W[55], (u64bit) 0x682E6FF3D6B2B8A3ULL); + F1(A, B, C, D, E, F, G, H, W[56], (u64bit) 0x748F82EE5DEFB2FCULL); + F1(H, A, B, C, D, E, F, G, W[57], (u64bit) 0x78A5636F43172F60ULL); + F1(G, H, A, B, C, D, E, F, W[58], (u64bit) 0x84C87814A1F0AB72ULL); + F1(F, G, H, A, B, C, D, E, W[59], (u64bit) 0x8CC702081A6439ECULL); + F1(E, F, G, H, A, B, C, D, W[60], (u64bit) 0x90BEFFFA23631E28ULL); + F1(D, E, F, G, H, A, B, C, W[61], (u64bit) 0xA4506CEBDE82BDE9ULL); + F1(C, D, E, F, G, H, A, B, W[62], (u64bit) 0xBEF9A3F7B2C67915ULL); + F1(B, C, D, E, F, G, H, A, W[63], (u64bit) 0xC67178F2E372532BULL); + F1(A, B, C, D, E, F, G, H, W[64], (u64bit) 0xCA273ECEEA26619CULL); + F1(H, A, B, C, D, E, F, G, W[65], (u64bit) 0xD186B8C721C0C207ULL); + F1(G, H, A, B, C, D, E, F, W[66], (u64bit) 0xEADA7DD6CDE0EB1EULL); + F1(F, G, H, A, B, C, D, E, W[67], (u64bit) 0xF57D4F7FEE6ED178ULL); + F1(E, F, G, H, A, B, C, D, W[68], (u64bit) 0x06F067AA72176FBAULL); + F1(D, E, F, G, H, A, B, C, W[69], (u64bit) 0x0A637DC5A2C898A6ULL); + F1(C, D, E, F, G, H, A, B, W[70], (u64bit) 0x113F9804BEF90DAEULL); + F1(B, C, D, E, F, G, H, A, W[71], (u64bit) 0x1B710B35131C471BULL); + F1(A, B, C, D, E, F, G, H, W[72], (u64bit) 0x28DB77F523047D84ULL); + F1(H, A, B, C, D, E, F, G, W[73], (u64bit) 0x32CAAB7B40C72493ULL); + F1(G, H, A, B, C, D, E, F, W[74], (u64bit) 0x3C9EBE0A15C9BEBCULL); + F1(F, G, H, A, B, C, D, E, W[75], (u64bit) 0x431D67C49C100D4CULL); + F1(E, F, G, H, A, B, C, D, W[76], (u64bit) 0x4CC5D4BECB3E42B6ULL); + F1(D, E, F, G, H, A, B, C, W[77], (u64bit) 0x597F299CFC657E2AULL); + F1(C, D, E, F, G, H, A, B, W[78], (u64bit) 0x5FCB6FAB3AD6FAECULL); + F1(B, C, D, E, F, G, H, A, W[79], (u64bit) 0x6C44198C4A475817ULL); + + A = (digest[0] += A); + B = (digest[1] += B); + C = (digest[2] += C); + D = (digest[3] += D); + E = (digest[4] += E); + F = (digest[5] += F); + G = (digest[6] += G); + H = (digest[7] += H); + } + } + +/* +* Copy out the digest +*/ +void SHA_384_512_BASE::copy_out(byte output[]) + { + for(u32bit j = 0; j != OUTPUT_LENGTH; j += 8) + store_be(digest[j/8], output + j); + } + +/* +* Clear memory of sensitive data +*/ +void SHA_384_512_BASE::clear() throw() + { + MDx_HashFunction::clear(); + W.clear(); + } + +/* +* Clear memory of sensitive data +*/ +void SHA_384::clear() throw() + { + SHA_384_512_BASE::clear(); + digest[0] = (u64bit) 0xCBBB9D5DC1059ED8ULL; + digest[1] = (u64bit) 0x629A292A367CD507ULL; + digest[2] = (u64bit) 0x9159015A3070DD17ULL; + digest[3] = (u64bit) 0x152FECD8F70E5939ULL; + digest[4] = (u64bit) 0x67332667FFC00B31ULL; + digest[5] = (u64bit) 0x8EB44A8768581511ULL; + digest[6] = (u64bit) 0xDB0C2E0D64F98FA7ULL; + digest[7] = (u64bit) 0x47B5481DBEFA4FA4ULL; + } + +/* +* Clear memory of sensitive data +*/ +void SHA_512::clear() throw() + { + SHA_384_512_BASE::clear(); + digest[0] = (u64bit) 0x6A09E667F3BCC908ULL; + digest[1] = (u64bit) 0xBB67AE8584CAA73BULL; + digest[2] = (u64bit) 0x3C6EF372FE94F82BULL; + digest[3] = (u64bit) 0xA54FF53A5F1D36F1ULL; + digest[4] = (u64bit) 0x510E527FADE682D1ULL; + digest[5] = (u64bit) 0x9B05688C2B3E6C1FULL; + digest[6] = (u64bit) 0x1F83D9ABFB41BD6BULL; + digest[7] = (u64bit) 0x5BE0CD19137E2179ULL; + } + +} diff --git a/botan/src/hash/sha2/sha2_64.h b/botan/src/hash/sha2/sha2_64.h new file mode 100644 index 0000000..dcc6dc8 --- /dev/null +++ b/botan/src/hash/sha2/sha2_64.h @@ -0,0 +1,60 @@ +/* +* SHA-{384,512} +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_SHA_64BIT_H__ +#define BOTAN_SHA_64BIT_H__ + +#include <botan/mdx_hash.h> + +namespace Botan { + +/* +* SHA-{384,512} Base +*/ +class BOTAN_DLL SHA_384_512_BASE : public MDx_HashFunction + { + protected: + void clear() throw(); + + SHA_384_512_BASE(u32bit out) : + MDx_HashFunction(out, 128, true, true, 16) {} + + SecureBuffer<u64bit, 8> digest; + private: + void compress_n(const byte[], u32bit blocks); + void copy_out(byte[]); + + SecureBuffer<u64bit, 80> W; + }; + +/* +* SHA-384 +*/ +class BOTAN_DLL SHA_384 : public SHA_384_512_BASE + { + public: + void clear() throw(); + std::string name() const { return "SHA-384"; } + HashFunction* clone() const { return new SHA_384; } + SHA_384() : SHA_384_512_BASE(48) { clear(); } + }; + +/* +* SHA-512 +*/ +class BOTAN_DLL SHA_512 : public SHA_384_512_BASE + { + public: + void clear() throw(); + std::string name() const { return "SHA-512"; } + HashFunction* clone() const { return new SHA_512; } + SHA_512() : SHA_384_512_BASE(64) { clear(); } + }; + +} + +#endif |