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.
Main namespace in ViennaCL. Holds all the basic types such as vector, matrix, etc. and defines operations upon them.
result_of::size_type< T >::type start(T const &obj)