8 #include <botan/sha160.h>
9 #include <botan/cpuid.h>
20 inline void F1(uint32_t A, uint32_t& B, uint32_t C, uint32_t D, uint32_t& E, uint32_t msg)
22 E += (D ^ (B & (C ^ D))) + msg + 0x5A827999 +
rotate_left(A, 5);
29 inline void F2(uint32_t A, uint32_t& B, uint32_t C, uint32_t D, uint32_t& E, uint32_t msg)
31 E += (B ^ C ^ D) + msg + 0x6ED9EBA1 +
rotate_left(A, 5);
38 inline void F3(uint32_t A, uint32_t& B, uint32_t C, uint32_t D, uint32_t& E, uint32_t msg)
40 E += ((B & C) | ((B | C) & D)) + msg + 0x8F1BBCDC +
rotate_left(A, 5);
47 inline void F4(uint32_t A, uint32_t& B, uint32_t C, uint32_t D, uint32_t& E, uint32_t msg)
49 E += (B ^ C ^ D) + msg + 0xCA62C1D6 +
rotate_left(A, 5);
60 void SHA_160::compress_n(
const uint8_t input[],
size_t blocks)
62 using namespace SHA1_F;
64 #if defined(BOTAN_HAS_SHA1_SSE2)
67 return sse2_compress_n(m_digest, input, blocks);
72 uint32_t A = m_digest[0], B = m_digest[1], C = m_digest[2],
73 D = m_digest[3], E = m_digest[4];
77 for(
size_t i = 0; i != blocks; ++i)
81 for(
size_t j = 16; j != 80; j += 8)
83 m_W[j ] =
rotate_left((m_W[j-3] ^ m_W[j-8] ^ m_W[j-14] ^ m_W[j-16]), 1);
84 m_W[j+1] =
rotate_left((m_W[j-2] ^ m_W[j-7] ^ m_W[j-13] ^ m_W[j-15]), 1);
85 m_W[j+2] =
rotate_left((m_W[j-1] ^ m_W[j-6] ^ m_W[j-12] ^ m_W[j-14]), 1);
86 m_W[j+3] =
rotate_left((m_W[j ] ^ m_W[j-5] ^ m_W[j-11] ^ m_W[j-13]), 1);
87 m_W[j+4] =
rotate_left((m_W[j+1] ^ m_W[j-4] ^ m_W[j-10] ^ m_W[j-12]), 1);
88 m_W[j+5] =
rotate_left((m_W[j+2] ^ m_W[j-3] ^ m_W[j- 9] ^ m_W[j-11]), 1);
89 m_W[j+6] =
rotate_left((m_W[j+3] ^ m_W[j-2] ^ m_W[j- 8] ^ m_W[j-10]), 1);
90 m_W[j+7] =
rotate_left((m_W[j+4] ^ m_W[j-1] ^ m_W[j- 7] ^ m_W[j- 9]), 1);
93 F1(A, B, C, D, E, m_W[ 0]); F1(E, A, B, C, D, m_W[ 1]);
94 F1(D, E, A, B, C, m_W[ 2]); F1(C, D, E, A, B, m_W[ 3]);
95 F1(B, C, D, E, A, m_W[ 4]); F1(A, B, C, D, E, m_W[ 5]);
96 F1(E, A, B, C, D, m_W[ 6]); F1(D, E, A, B, C, m_W[ 7]);
97 F1(C, D, E, A, B, m_W[ 8]); F1(B, C, D, E, A, m_W[ 9]);
98 F1(A, B, C, D, E, m_W[10]); F1(E, A, B, C, D, m_W[11]);
99 F1(D, E, A, B, C, m_W[12]); F1(C, D, E, A, B, m_W[13]);
100 F1(B, C, D, E, A, m_W[14]); F1(A, B, C, D, E, m_W[15]);
101 F1(E, A, B, C, D, m_W[16]); F1(D, E, A, B, C, m_W[17]);
102 F1(C, D, E, A, B, m_W[18]); F1(B, C, D, E, A, m_W[19]);
104 F2(A, B, C, D, E, m_W[20]); F2(E, A, B, C, D, m_W[21]);
105 F2(D, E, A, B, C, m_W[22]); F2(C, D, E, A, B, m_W[23]);
106 F2(B, C, D, E, A, m_W[24]); F2(A, B, C, D, E, m_W[25]);
107 F2(E, A, B, C, D, m_W[26]); F2(D, E, A, B, C, m_W[27]);
108 F2(C, D, E, A, B, m_W[28]); F2(B, C, D, E, A, m_W[29]);
109 F2(A, B, C, D, E, m_W[30]); F2(E, A, B, C, D, m_W[31]);
110 F2(D, E, A, B, C, m_W[32]); F2(C, D, E, A, B, m_W[33]);
111 F2(B, C, D, E, A, m_W[34]); F2(A, B, C, D, E, m_W[35]);
112 F2(E, A, B, C, D, m_W[36]); F2(D, E, A, B, C, m_W[37]);
113 F2(C, D, E, A, B, m_W[38]); F2(B, C, D, E, A, m_W[39]);
115 F3(A, B, C, D, E, m_W[40]); F3(E, A, B, C, D, m_W[41]);
116 F3(D, E, A, B, C, m_W[42]); F3(C, D, E, A, B, m_W[43]);
117 F3(B, C, D, E, A, m_W[44]); F3(A, B, C, D, E, m_W[45]);
118 F3(E, A, B, C, D, m_W[46]); F3(D, E, A, B, C, m_W[47]);
119 F3(C, D, E, A, B, m_W[48]); F3(B, C, D, E, A, m_W[49]);
120 F3(A, B, C, D, E, m_W[50]); F3(E, A, B, C, D, m_W[51]);
121 F3(D, E, A, B, C, m_W[52]); F3(C, D, E, A, B, m_W[53]);
122 F3(B, C, D, E, A, m_W[54]); F3(A, B, C, D, E, m_W[55]);
123 F3(E, A, B, C, D, m_W[56]); F3(D, E, A, B, C, m_W[57]);
124 F3(C, D, E, A, B, m_W[58]); F3(B, C, D, E, A, m_W[59]);
126 F4(A, B, C, D, E, m_W[60]); F4(E, A, B, C, D, m_W[61]);
127 F4(D, E, A, B, C, m_W[62]); F4(C, D, E, A, B, m_W[63]);
128 F4(B, C, D, E, A, m_W[64]); F4(A, B, C, D, E, m_W[65]);
129 F4(E, A, B, C, D, m_W[66]); F4(D, E, A, B, C, m_W[67]);
130 F4(C, D, E, A, B, m_W[68]); F4(B, C, D, E, A, m_W[69]);
131 F4(A, B, C, D, E, m_W[70]); F4(E, A, B, C, D, m_W[71]);
132 F4(D, E, A, B, C, m_W[72]); F4(C, D, E, A, B, m_W[73]);
133 F4(B, C, D, E, A, m_W[74]); F4(A, B, C, D, E, m_W[75]);
134 F4(E, A, B, C, D, m_W[76]); F4(D, E, A, B, C, m_W[77]);
135 F4(C, D, E, A, B, m_W[78]); F4(B, C, D, E, A, m_W[79]);
137 A = (m_digest[0] += A);
138 B = (m_digest[1] += B);
139 C = (m_digest[2] += C);
140 D = (m_digest[3] += D);
141 E = (m_digest[4] += E);
150 void SHA_160::copy_out(uint8_t output[])
162 m_digest[0] = 0x67452301;
163 m_digest[1] = 0xEFCDAB89;
164 m_digest[2] = 0x98BADCFE;
165 m_digest[3] = 0x10325476;
166 m_digest[4] = 0xC3D2E1F0;
void copy_out_vec_be(uint8_t out[], size_t out_bytes, const std::vector< T, Alloc > &in)
size_t output_length() const override
T rotate_left(T input, size_t rot)
size_t hash_block_size() const override
T load_be(const uint8_t in[], size_t off)
void zeroise(std::vector< T, Alloc > &vec)