|
|
| version 1.49, 2007/07/06 15:06:28 | version 1.51, 2007/08/20 10:37:21 |
|---|---|
| Line 283 static void _crypt(Request& r, MethodPar | Line 283 static void _crypt(Request& r, MethodPar |
| } | } |
| static void _md5(Request& r, MethodParams& params) { | static void _md5(Request& r, MethodParams& params) { |
| const char *string=params.as_string(0, "parameter must be string").cstr(); | const char *string=params.as_string(0, PARAMETER_MUST_BE_STRING).cstr(); |
| PA_MD5_CTX context; | PA_MD5_CTX context; |
| unsigned char digest[16]; | unsigned char digest[16]; |
| Line 297 static void _md5(Request& r, MethodParam | Line 297 static void _md5(Request& r, MethodParam |
| //SHA-1: | //SHA-1: |
| struct SHA1Context | struct SHA1Context { |
| { | |
| unsigned Message_Digest[5], Length_Low, Length_High; | unsigned Message_Digest[5], Length_Low, Length_High; |
| unsigned char Message_Block[64]; | unsigned int Message_Block[64]; |
| int Message_Block_Index, Computed, Corrupted; | int Message_Block_Index, Computed, Corrupted; |
| }; | }; |
| #define SHA1CircularShift(bits,word) ((((word) << (bits)) & 0xFFFFFFFF)|((word) >> (32-(bits)))) | #define SHA1CircularShift(bits,word) ((((word) << (bits)) & 0xFFFFFFFF)|((word) >> (32-(bits)))) |
| void SHA1ProcessMessageBlock(SHA1Context *); | void SHA1ProcessMessageBlock(SHA1Context *); |
| void SHA1PadMessage(SHA1Context *); | void SHA1PadMessage(SHA1Context *); |
| void SHA1Reset(SHA1Context *context) | void SHA1Reset(SHA1Context *context) { |
| { | |
| context->Length_Low = context->Length_High = context->Message_Block_Index = 0; | context->Length_Low = context->Length_High = context->Message_Block_Index = 0; |
| context->Message_Digest[0] = 0x67452301; | context->Message_Digest[0] = 0x67452301; |
| context->Message_Digest[1] = 0xEFCDAB89; | context->Message_Digest[1] = 0xEFCDAB89; |
| Line 316 void SHA1Reset(SHA1Context *context) | Line 314 void SHA1Reset(SHA1Context *context) |
| context->Message_Digest[3] = 0x10325476; | context->Message_Digest[3] = 0x10325476; |
| context->Message_Digest[4] = 0xC3D2E1F0; | context->Message_Digest[4] = 0xC3D2E1F0; |
| context->Computed = context->Corrupted = 0; | context->Computed = context->Corrupted = 0; |
| } | } |
| int SHA1Result(SHA1Context *context) | int SHA1Result(SHA1Context *context) { |
| { | |
| if (context->Corrupted) | if (context->Corrupted) |
| return 0; | return 0; |
| if (!context->Computed) | if (!context->Computed) { |
| { | |
| SHA1PadMessage(context); | SHA1PadMessage(context); |
| context->Computed = 1; | context->Computed = 1; |
| } | } |
| return 1; | return 1; |
| } | } |
| void SHA1Input (SHA1Context *context, const unsigned char *message_array, unsigned length) | void SHA1Input (SHA1Context *context, const unsigned char *message_array, unsigned length) { |
| { | |
| if (!length) | if (!length) |
| return; | return; |
| if (context->Computed || context->Corrupted) | if (context->Computed || context->Corrupted) { |
| { | |
| context->Corrupted = 1; | context->Corrupted = 1; |
| return; | return; |
| } | } |
| while(length-- && !context->Corrupted) | while(length-- && !context->Corrupted) { |
| { | |
| context->Message_Block[context->Message_Block_Index++] = (*message_array & 0xFF); | context->Message_Block[context->Message_Block_Index++] = (*message_array & 0xFF); |
| context->Length_Low += 8; | context->Length_Low += 8; |
| context->Length_Low &= 0xFFFFFFFF; | context->Length_Low &= 0xFFFFFFFF; |
| Line 351 void SHA1Input (SHA1Context *context, co | Line 344 void SHA1Input (SHA1Context *context, co |
| SHA1ProcessMessageBlock(context); | SHA1ProcessMessageBlock(context); |
| message_array++; | message_array++; |
| } | } |
| } | } |
| void SHA1ProcessMessageBlock(SHA1Context *context) | void SHA1ProcessMessageBlock(SHA1Context *context) { |
| { | |
| const unsigned K[] = {0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6 }; | const unsigned K[] = {0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6 }; |
| int t; | int t; |
| unsigned temp, W[80], buf[5]; | unsigned temp, W[80], buf[5]; |
| unsigned &A=buf[0], &B=buf[1], &C=buf[2], &D=buf[3], &E=buf[4]; | unsigned &A=buf[0], &B=buf[1], &C=buf[2], &D=buf[3], &E=buf[4]; |
| for(t = 0; t < 16; t++) | for(t = 0; t < 16; t++) |
| W[t] = (((unsigned) context->Message_Block[t * 4]) << 24) | (((unsigned) context->Message_Block[t * 4 + 1]) << 16) | (((unsigned) context->Message_Block[t * 4 + 2]) << 8) | ((unsigned) context->Message_Block[t * 4 + 3]); | W[t] = (((unsigned) context->Message_Block[t * 4]) << 24) | (((unsigned) context->Message_Block[t * 4 + 1]) << 16) | (((unsigned) context->Message_Block[t * 4 + 2]) << 8) | ((unsigned) context->Message_Block[t * 4 + 3]); |
| for(t = 16; t < 80; t++) | for(t = 16; t < 80; t++) |
| W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); | W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); |
| memcpy (buf, context->Message_Digest, sizeof(buf)); | memcpy (buf, context->Message_Digest, sizeof(buf)); |
| for(t = 0; t < 20; t++) | for(t = 0; t < 20; t++) { |
| { | |
| temp = (SHA1CircularShift(5,A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0]) & 0xFFFFFFFF; | temp = (SHA1CircularShift(5,A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0]) & 0xFFFFFFFF; |
| E = D; D = C; | E = D; D = C; |
| C = SHA1CircularShift(30,B); | C = SHA1CircularShift(30,B); |
| B = A; A = temp; | B = A; A = temp; |
| } | } |
| for(t = 20; t < 40; t++) | for(t = 20; t < 40; t++) { |
| { | |
| temp = (SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1]) & 0xFFFFFFFF; | temp = (SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1]) & 0xFFFFFFFF; |
| E = D; D = C; | E = D; D = C; |
| C = SHA1CircularShift(30,B); | C = SHA1CircularShift(30,B); |
| B = A; A = temp; | B = A; A = temp; |
| } | } |
| for(t = 40; t < 60; t++) | for(t = 40; t < 60; t++) { |
| { | |
| temp = (SHA1CircularShift(5,A) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2]) & 0xFFFFFFFF; | temp = (SHA1CircularShift(5,A) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2]) & 0xFFFFFFFF; |
| E = D; D = C; | E = D; D = C; |
| C = SHA1CircularShift(30,B); | C = SHA1CircularShift(30,B); |
| B = A; A = temp; | B = A; A = temp; |
| } | } |
| for(t = 60; t < 80; t++) | for(t = 60; t < 80; t++) { |
| { | |
| temp = (SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3]) & 0xFFFFFFFF; | temp = (SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3]) & 0xFFFFFFFF; |
| E = D; D = C; | E = D; D = C; |
| C = SHA1CircularShift(30,B); | C = SHA1CircularShift(30,B); |
| Line 399 void SHA1ProcessMessageBlock(SHA1Context | Line 389 void SHA1ProcessMessageBlock(SHA1Context |
| for (t = 0; t < 5; t++) | for (t = 0; t < 5; t++) |
| context->Message_Digest[t] = (context->Message_Digest[t] + buf[t]) & 0xFFFFFFFF; | context->Message_Digest[t] = (context->Message_Digest[t] + buf[t]) & 0xFFFFFFFF; |
| context->Message_Block_Index = 0; | context->Message_Block_Index = 0; |
| } | } |
| void SHA1PadMessage(SHA1Context *context) | void SHA1PadMessage(SHA1Context *context) { |
| { | |
| context->Message_Block[context->Message_Block_Index++] = 0x80; | context->Message_Block[context->Message_Block_Index++] = 0x80; |
| if (context->Message_Block_Index > 56) //was 55, one shift | if (context->Message_Block_Index > 56) { |
| { | //was 55, one shift |
| while(context->Message_Block_Index < 64) | while(context->Message_Block_Index < 64) |
| context->Message_Block[context->Message_Block_Index++] = 0; | context->Message_Block[context->Message_Block_Index++] = 0; |
| SHA1ProcessMessageBlock(context); | SHA1ProcessMessageBlock(context); |
| while(context->Message_Block_Index < 56) | while(context->Message_Block_Index < 56) |
| context->Message_Block[context->Message_Block_Index++] = 0; | context->Message_Block[context->Message_Block_Index++] = 0; |
| } | } else |
| else | |
| while(context->Message_Block_Index < 56) | while(context->Message_Block_Index < 56) |
| context->Message_Block[context->Message_Block_Index++] = 0; | context->Message_Block[context->Message_Block_Index++] = 0; |
| context->Message_Block[56] = (context->Length_High >> 24) & 0xFF; | context->Message_Block[56] = (context->Length_High >> 24) & 0xFF; |
| Line 425 void SHA1PadMessage(SHA1Context *context | Line 414 void SHA1PadMessage(SHA1Context *context |
| context->Message_Block[62] = (context->Length_Low >> 8) & 0xFF; | context->Message_Block[62] = (context->Length_Low >> 8) & 0xFF; |
| context->Message_Block[63] = (context->Length_Low) & 0xFF; | context->Message_Block[63] = (context->Length_Low) & 0xFF; |
| SHA1ProcessMessageBlock(context); | SHA1ProcessMessageBlock(context); |
| } | } |
| static void _sha1(Request& r, MethodParams& params) | static void _sha1(Request& r, MethodParams& params) { |
| { | const char *string = params.as_string(0, PARAMETER_MUST_BE_STRING).cstr(); |
| const char *string = params.as_string(0, "parameter must be string").cstr(); | |
| SHA1Context c; | SHA1Context c; |
| SHA1Reset (&c); | SHA1Reset (&c); |
| SHA1Input (&c, (const unsigned char*)string, strlen(string)); | SHA1Input (&c, (const unsigned char*)string, strlen(string)); |
| if (!SHA1Result (&c)) | if (!SHA1Result (&c)) |
| throw Exception ("parser.runtime", 0, "Cannot compute SHA1"); | throw Exception (PARSER_RUNTIME, 0, "Can not compute SHA1"); |
| char digest[128]; | char digest[128]; |
| sprintf(digest, "%08x%08x%08x%08x%08x", c.Message_Digest[0], c.Message_Digest[1], c.Message_Digest[2], c.Message_Digest[3], c.Message_Digest[4]); | sprintf(digest, "%08x%08x%08x%08x%08x", c.Message_Digest[0], c.Message_Digest[1], c.Message_Digest[2], c.Message_Digest[3], c.Message_Digest[4]); |
| Line 499 static void _uid64(Request& r, MethodPar | Line 487 static void _uid64(Request& r, MethodPar |
| } | } |
| static void _crc32(Request& r, MethodParams& params) { | static void _crc32(Request& r, MethodParams& params) { |
| const char *string=params.as_string(0, "parameter must be string").cstr(); | const char *string=params.as_string(0, PARAMETER_MUST_BE_STRING).cstr(); |
| r.write_no_lang(*new VInt(pa_crc32(string, strlen(string)))); | r.write_no_lang(*new VInt(pa_crc32(string, strlen(string)))); |
| } | } |