[BACK]Return to sha1.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / ox_ntl / crypt / sha1

Diff for /OpenXM/src/ox_ntl/crypt/sha1/sha1.c between version 1.3 and 1.4

version 1.3, 2004/05/16 15:02:39 version 1.4, 2004/06/20 10:59:01
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/ox_ntl/crypt/sha1/sha1.c,v 1.2 2004/03/25 13:34:19 iwane Exp $ */  /* $OpenXM: OpenXM/src/ox_ntl/crypt/sha1/sha1.c,v 1.3 2004/05/16 15:02:39 iwane Exp $ */
 /* RFC 3174 - SHA-1 (US Secure Hash Algorithm 1 (SHA1))*/  /* RFC 3174 - SHA-1 (US Secure Hash Algorithm 1 (SHA1))*/
   
 #include <stdio.h>  #include <stdio.h>
   
 #include "sha1.h"  #include "sha1.h"
   
   #include <unistd.h>
   #include <errno.h>
   #include <sys/stat.h>
   
 /* Global Constant */  /* Global Constant */
 static const unsigned int K[4] = {0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6};  static const uint32_t K[4] = {0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6};
 static const unsigned int H[5] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0};  static const uint32_t H[5] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0};
   
 #define BLOCK (512 / 8)  #define BLOCK (512 / 8)
   
   
 static inline unsigned int lshift32(unsigned int x, int n)  static inline uint32_t lshift32(uint32_t x, int n)
 {  {
         return ((x << n) | (x >> (32 - n)));          return ((x << n) | (x >> (32 - n)));
 };  };
Line 23  static inline unsigned int lshift32(unsigned int x, in
Line 27  static inline unsigned int lshift32(unsigned int x, in
  * sizeof(buf) >= 512 * ((len * 8 + 1) / 64)   * sizeof(buf) >= 512 * ((len * 8 + 1) / 64)
  * len * 8 < 2^64 ==> len < 2^61   * len * 8 < 2^64 ==> len < 2^61
  */   */
 static unsigned int  static uint32_t
 padding(unsigned char *buf, const unsigned char *msg, int length)  padding(unsigned char *buf, const unsigned char *msg, size_t length)
 {  {
         int n;          int n;
         int i;          int i;
         int len = length % BLOCK;          size_t len = length % BLOCK;
   
         if (len == 0)  
                 len = BLOCK;  
   
         memcpy(buf, msg, len);          memcpy(buf, msg, len);
   
         buf[len++] = 0x80;          buf[len++] = 0x80;
Line 61  padding(unsigned char *buf, const unsigned char *msg, 
Line 62  padding(unsigned char *buf, const unsigned char *msg, 
   
   
   
 static unsigned int  static uint32_t
 f(unsigned int t, unsigned int b, unsigned int c, unsigned int d)  f(uint32_t t, uint32_t b, uint32_t c, uint32_t d)
 {  {
         if (t < 20) {          if (t < 20) {
                 return ((b & c) | ((~b) & d));                  return ((b & c) | ((~b) & d));
Line 84  f(unsigned int t, unsigned int b, unsigned int c, unsi
Line 85  f(unsigned int t, unsigned int b, unsigned int c, unsi
  * padding.   * padding.
  */   */
 void  void
 sha1_md(unsigned int *h, const unsigned char *msg)  sha1_md(uint32_t *h, const unsigned char *msg)
 {  {
         int t;          int t;
         unsigned int a, b, c, d, e, temp;  
         int i;          int i;
         unsigned int w[80];  
   
           uint32_t a, b, c, d, e, temp;
           uint32_t w[80];
   
         /* ... */          /* ... */
         for (t = 0; t < 16; t++) {          for (t = 0; t < 16; t++) {
                 w[t] = 0;                  w[t] = 0;
Line 126  sha1_md(unsigned int *h, const unsigned char *msg)
Line 128  sha1_md(unsigned int *h, const unsigned char *msg)
 }  }
   
 int  int
 sha1_h(unsigned char *Ph, const unsigned char *msg, int len, const unsigned int *hp)  sha1_h(unsigned char *Ph, const unsigned char *msg, size_t len, const uint32_t *hp)
 {  {
         int i, j, cnt, l = len;          int i, j, cnt;
           size_t l = len;
         unsigned char buf[1024];          unsigned char buf[1024];
         unsigned int h[sizeof(H) / sizeof(H[0])];          uint32_t h[sizeof(H) / sizeof(H[0])];
   
         if (hp == NULL)          if (hp == NULL)
                 memcpy(h, H, sizeof(H));                  memcpy(h, H, sizeof(H));
         else          else
                 memcpy(h, hp, sizeof(h));                  memcpy(h, hp, sizeof(h));
   
         while (l > BLOCK) {          while (l >= BLOCK) {
                 sha1_md(h, msg);                  sha1_md(h, msg);
                 msg += BLOCK;                  msg += BLOCK;
                 l -= BLOCK;                  l -= BLOCK;
Line 160  sha1_h(unsigned char *Ph, const unsigned char *msg, in
Line 163  sha1_h(unsigned char *Ph, const unsigned char *msg, in
   
   
 int  int
 sha1(unsigned char *Ph, const unsigned char *msg, int len)  sha1(unsigned char *Ph, const unsigned char *msg, size_t len)
 {  {
         return (sha1_h(Ph, msg, len, NULL));          return (sha1_h(Ph, msg, len, NULL));
 }  }
   
   
 #ifdef SHA_DEBUG  
 /* debug */  
 #include <stdio.h>  
   
 int  int
 main()  fsha1_h(unsigned char *Ph, int fd, const uint32_t *hp)
 {  {
         char *a;          int i, j, cnt, ret;
         int m, i;          size_t l;
         unsigned char h[32 * 5];          off_t len;
         char b[10000000];          unsigned char buf[1024], *msg, msgbuf[1024];
           uint32_t h[sizeof(H) / sizeof(H[0])];
           int pad = 0;
           struct stat stbuf;
   
         for (i = 0; i < 1000000; i++)          if (hp == NULL)
                 b[i] = 'a';                  memcpy(h, H, sizeof(H));
         b[i] = '\0';          else
                   memcpy(h, hp, sizeof(h));
   
         a = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";          ret = fstat(fd, &stbuf);
         a = b;          len = stbuf.st_size;
         a = "abc";          if (len == 0)
                   goto _PADDING;
   
         m = sha1(h, a, strlen(a));          for (;;) {
                   l = read(fd, msgbuf, sizeof(msgbuf));
                   if (l < 0) {
                           return (errno);
                   }
                   if (l == 0)
                           break;
   
         for (i = 0; i < 160 / 8; i++) {                  len -= l;
                 printf("%02x", h[i] & 0xff);                  msg = msgbuf;
                 if (i % 4 == 3)  
                         printf(" ");                  while (l >= BLOCK) {
                           sha1_md(h, msg);
                           msg += BLOCK;
                           l -= BLOCK;
                   }
   
                   if (len == 0) {
   _PADDING:
                           cnt = padding(buf, msg, stbuf.st_size);
                           for (i = 0; i < cnt; i++) {
                                   sha1_md(h, buf + BLOCK * i);
                           }
                   }
         }          }
         printf("\n");  
   
   
           memset(Ph, 0x00, sizeof(H));
           for (i = 0; i < sizeof(H) / sizeof(H[0]); i++) {
                   for (j = 0; j < 32; j++) {
                           Ph[4 * i + j / 8] |= ((h[i] >> (31 - j)) & 1) << (7 - j % 8);
                   }
           }
   
         return (0);          return (0);
 }  }
   
 #endif  
   
   int
   fsha1(unsigned char *Ph, int fd)
   {
           return (fsha1_h(Ph, fd, NULL));
   }
   

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>