22 #ifndef VIENNACL_TOOLS_SHA1_HPP_
23 #define VIENNACL_TOOLS_SHA1_HPP_
44 return (value << count) ^ (value >> (32-count));
50 memcpy(m_digest, s.m_digest, 5 *
sizeof(uint32_t));
51 memcpy(m_block, s.m_block, 64);
52 m_blockByteIndex = s.m_blockByteIndex;
53 m_byteCount = s.m_byteCount;
57 m_digest[0] = 0x67452301;
58 m_digest[1] = 0xEFCDAB89;
59 m_digest[2] = 0x98BADCFE;
60 m_digest[3] = 0x10325476;
61 m_digest[4] = 0xC3D2E1F0;
67 this->m_block[this->m_blockByteIndex++] = octet;
69 if (m_blockByteIndex == 64) {
70 this->m_blockByteIndex = 0;
76 const uint8_t* begin =
static_cast<const uint8_t*
>(
start);
77 const uint8_t*
finish =
static_cast<const uint8_t*
>(end);
78 while (begin != finish) {
85 const uint8_t* block =
static_cast<const uint8_t*
>(data);
92 if (this->m_blockByteIndex > 56) {
93 while (m_blockByteIndex != 0) {
96 while (m_blockByteIndex < 56) {
100 while (m_blockByteIndex < 56) {
108 processByte( static_cast<unsigned char>((bitCount>>24) & 0xFF));
109 processByte( static_cast<unsigned char>((bitCount>>16) & 0xFF));
110 processByte( static_cast<unsigned char>((bitCount>>8 ) & 0xFF));
111 processByte( static_cast<unsigned char>((bitCount) & 0xFF));
113 memcpy(digest, m_digest, 5 *
sizeof(uint32_t));
120 digest[di++] =
static_cast<uint8_t
>((d32[0] >> 24) & 0xFF);
121 digest[di++] =
static_cast<uint8_t
>((d32[0] >> 16) & 0xFF);
122 digest[di++] =
static_cast<uint8_t
>((d32[0] >> 8) & 0xFF);
123 digest[di++] =
static_cast<uint8_t
>((d32[0]) & 0xFF);
125 digest[di++] =
static_cast<uint8_t
>((d32[1] >> 24) & 0xFF);
126 digest[di++] =
static_cast<uint8_t
>((d32[1] >> 16) & 0xFF);
127 digest[di++] =
static_cast<uint8_t
>((d32[1] >> 8) & 0xFF);
128 digest[di++] =
static_cast<uint8_t
>((d32[1]) & 0xFF);
130 digest[di++] =
static_cast<uint8_t
>((d32[2] >> 24) & 0xFF);
131 digest[di++] =
static_cast<uint8_t
>((d32[2] >> 16) & 0xFF);
132 digest[di++] =
static_cast<uint8_t
>((d32[2] >> 8) & 0xFF);
133 digest[di++] =
static_cast<uint8_t
>((d32[2]) & 0xFF);
135 digest[di++] =
static_cast<uint8_t
>((d32[3] >> 24) & 0xFF);
136 digest[di++] =
static_cast<uint8_t
>((d32[3] >> 16) & 0xFF);
137 digest[di++] =
static_cast<uint8_t
>((d32[3] >> 8) & 0xFF);
138 digest[di++] =
static_cast<uint8_t
>((d32[3]) & 0xFF);
140 digest[di++] =
static_cast<uint8_t
>((d32[4] >> 24) & 0xFF);
141 digest[di++] =
static_cast<uint8_t
>((d32[4] >> 16) & 0xFF);
142 digest[di++] =
static_cast<uint8_t
>((d32[4] >> 8) & 0xFF);
143 digest[di++] =
static_cast<uint8_t
>((d32[4]) & 0xFF);
151 w[i] =
static_cast<uint32_t
>(m_block[i*4 + 0] << 24);
152 w[i] |=
static_cast<uint32_t
>(m_block[i*4 + 1] << 16);
153 w[i] |=
static_cast<uint32_t
>(m_block[i*4 + 2] << 8);
154 w[i] |=
static_cast<uint32_t
>(m_block[i*4 + 3]);
157 w[i] =
LeftRotate((w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]), 1);
160 uint32_t a = m_digest[0];
161 uint32_t b = m_digest[1];
162 uint32_t c = m_digest[2];
163 uint32_t d = m_digest[3];
164 uint32_t e = m_digest[4];
171 f = (b & c) | (~b & d);
177 f = (b & c) | (b & d) | (c & d);
183 uint32_t temp =
LeftRotate(a, 5) + f + e + k + w[i];
206 inline std::string
sha1(std::string
const & src)
214 std::ostringstream oss;
215 for (
int i = 0; i < 5; ++i)
216 oss << std::hex << std::setfill(
'0') << std::setw(8) << hash[i];
void finish()
Synchronizes the execution. finish() will only return after all compute kernels (CUDA, OpenCL) have completed.
result_of::size_type< T >::type start(T const &obj)