53 #define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\
54 if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;}
56 #define PCT_LITTLE_ENDIAN 1
57 #define PCT_BIG_ENDIAN 0
65 #define SHA_BLOCKSIZE 64
66 #define SHA_DIGESTSIZE 20
81 static void longReverse(SHA_INT32 *buffer,
int byteCount,
int Endianness)
88 byteCount /=
sizeof(*buffer);
91 value = ( ( value & 0xFF00FF00L ) >> 8 ) | \
92 ( ( value & 0x00FF00FFL ) << 8 );
93 *buffer++ = ( value << 16 ) | ( value >> 16 );
138 #define f1(x,y,z) (z ^ (x & (y ^ z)))
139 #define f2(x,y,z) (x ^ y ^ z)
141 #define f3(x,y,z) ((x & y) | (z & (x | y)))
142 #define f4(x,y,z) (x ^ y ^ z)
146 #define CONST1 0x5a827999L
147 #define CONST2 0x6ed9eba1L
148 #define CONST3 0x8f1bbcdcL
149 #define CONST4 0xca62c1d6L
153 #define R32(x,n) ((x << n) | (x >> (32 - n)))
158 T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; \
159 E = D; D = C; C = R32(B,30); B = A; A = T
164 T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; B = R32(B,30)
167 E = R32(T,5) + f##n(A,B,C) + D + *WP++ + CONST##n; A = R32(A,30)
170 D = R32(E,5) + f##n(T,A,B) + C + *WP++ + CONST##n; T = R32(T,30)
173 C = R32(D,5) + f##n(E,T,A) + B + *WP++ + CONST##n; E = R32(E,30)
176 B = R32(C,5) + f##n(D,E,T) + A + *WP++ + CONST##n; D = R32(D,30)
179 A = R32(B,5) + f##n(C,D,E) + T + *WP++ + CONST##n; C = R32(C,30)
187 SHA_INT32 T, A, B, C, D,
E, W[80], *WP;
189 memcpy(W, sha_info->
data,
sizeof(sha_info->
data));
192 for (i = 16; i < 80; ++i) {
193 W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];
229 for (i = 0; i < 20; ++i) {
FG(1); }
230 for (i = 20; i < 40; ++i) {
FG(2); }
231 for (i = 40; i < 60; ++i) {
FG(3); }
232 for (i = 60; i < 80; ++i) {
FG(4); }
249 sha_info->
digest[0] = 0x67452301L;
250 sha_info->
digest[1] = 0xefcdab89L;
251 sha_info->
digest[2] = 0x98badcfeL;
252 sha_info->
digest[3] = 0x10325476L;
253 sha_info->
digest[4] = 0xc3d2e1f0L;
267 if (clo < sha_info->count_lo) {
272 if (sha_info->
local) {
277 memcpy(((SHA_BYTE *) sha_info->
data) + sha_info->
local, buffer, i);
280 sha_info->
local += i;
294 memcpy(sha_info->
data, buffer, count);
295 sha_info->
local = count;
302 reinterpret_cast< const SHA_BYTE* >( value.c_str() ),
303 value.size() *
sizeof( wchar_t ) );
312 SHA_INT32 lo_bit_count, hi_bit_count;
316 count = (int) ((lo_bit_count >> 3) & 0x3f);
317 ((SHA_BYTE *) sha_info->
data)[count++] = 0x80;
319 memset(((SHA_BYTE *) sha_info->
data) + count, 0,
325 memset(((SHA_BYTE *) sha_info->
data) + count, 0,
331 sha_info->
data[56] = (hi_bit_count >> 24) & 0xff;
332 sha_info->
data[57] = (hi_bit_count >> 16) & 0xff;
333 sha_info->
data[58] = (hi_bit_count >> 8) & 0xff;
334 sha_info->
data[59] = (hi_bit_count >> 0) & 0xff;
335 sha_info->
data[60] = (lo_bit_count >> 24) & 0xff;
336 sha_info->
data[61] = (lo_bit_count >> 16) & 0xff;
337 sha_info->
data[62] = (lo_bit_count >> 8) & 0xff;
338 sha_info->
data[63] = (lo_bit_count >> 0) & 0xff;
340 digest[ 0] = (
unsigned char) ((sha_info->
digest[0] >> 24) & 0xff);
341 digest[ 1] = (
unsigned char) ((sha_info->
digest[0] >> 16) & 0xff);
342 digest[ 2] = (
unsigned char) ((sha_info->
digest[0] >> 8) & 0xff);
343 digest[ 3] = (
unsigned char) ((sha_info->
digest[0] ) & 0xff);
344 digest[ 4] = (
unsigned char) ((sha_info->
digest[1] >> 24) & 0xff);
345 digest[ 5] = (
unsigned char) ((sha_info->
digest[1] >> 16) & 0xff);
346 digest[ 6] = (
unsigned char) ((sha_info->
digest[1] >> 8) & 0xff);
347 digest[ 7] = (
unsigned char) ((sha_info->
digest[1] ) & 0xff);
348 digest[ 8] = (
unsigned char) ((sha_info->
digest[2] >> 24) & 0xff);
349 digest[ 9] = (
unsigned char) ((sha_info->
digest[2] >> 16) & 0xff);
350 digest[10] = (
unsigned char) ((sha_info->
digest[2] >> 8) & 0xff);
351 digest[11] = (
unsigned char) ((sha_info->
digest[2] ) & 0xff);
352 digest[12] = (
unsigned char) ((sha_info->
digest[3] >> 24) & 0xff);
353 digest[13] = (
unsigned char) ((sha_info->
digest[3] >> 16) & 0xff);
354 digest[14] = (
unsigned char) ((sha_info->
digest[3] >> 8) & 0xff);
355 digest[15] = (
unsigned char) ((sha_info->
digest[3] ) & 0xff);
356 digest[16] = (
unsigned char) ((sha_info->
digest[4] >> 24) & 0xff);
357 digest[17] = (
unsigned char) ((sha_info->
digest[4] >> 16) & 0xff);
358 digest[18] = (
unsigned char) ((sha_info->
digest[4] >> 8) & 0xff);
359 digest[19] = (
unsigned char) ((sha_info->
digest[4] ) & 0xff);
380 sha_final((
unsigned char*)&digest[0], &temp);
396 retval.resize(len * 2);
397 hex_digest = &retval[0];
399 for(i=j=0; i<len; i++) {
401 c = (data[i] >> 4) & 0xf;
402 c = (c>9) ? c+
'a'-10 : c +
'0';
405 c = (c>9) ? c+
'a'-10 : c +
'0';
426 retval.resize(
sizeof(digest) * 2);
427 hex_digest = &retval[0];
430 for(i=j=0; i<(int)
sizeof(digest); i++) {
432 c = (digest[i] >> 4) & 0xf;
433 c = (c>9) ? c+
'a'-10 : c +
'0';
435 c = (digest[i] & 0xf);
436 c = (c>9) ? c+
'a'-10 : c +
'0';
443 #endif//_SHA_MODULE_H
static void sha_update(SHAobject *sha_info, const std::wstring &value)
static void sha_final(unsigned char digest[20], SHAobject *sha_info)
static void sha_digest(SHAobject *self, uint8 *digest)
static void sha_digest(SHAobject *self, std::string &digest)
SHA_BYTE data[SHA_BLOCKSIZE]
static void SHAcopy(SHAobject *src, SHAobject *dest)
static std::string SHA_hexdigest(SHAobject *self)
static void sha_transform(SHAobject *sha_info)
static std::string Hexify(const char *data, size_t len)
#define TestEndianness(variable)
Sha1 module for username + password hashes.
static void longReverse(SHA_INT32 *buffer, int byteCount, int Endianness)
static void sha_update(SHAobject *sha_info, const SHA_BYTE *buffer, int count)
static void sha_init(SHAobject *sha_info)