Diff for /parser3/src/classes/math.C between versions 1.49 and 1.51

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))));
 }  }
   

Removed from v.1.49  
changed lines
  Added in v.1.51


E-mail: