Added test vectors for hash and HMACs in crypto library. Fixed
authorPekka Riikonen <priikone@silcnet.org>
Sun, 1 Dec 2002 13:45:33 +0000 (13:45 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 1 Dec 2002 13:45:33 +0000 (13:45 +0000)
argument decoding in MD5.
Changed the client library to use SHA1 in channel private key and
private message key generation instead of MD5, since SHA1 is
mandatory hash function.

12 files changed:
configure.in.pre
lib/silcclient/client_channel.c
lib/silcclient/client_prvmsg.c
lib/silccrypt/md5.c
lib/silccrypt/md5_internal.h
lib/silccrypt/tests/Makefile.am [new file with mode: 0644]
lib/silccrypt/tests/inst_aes [deleted file]
lib/silccrypt/tests/inst_twofish [deleted file]
lib/silccrypt/tests/test_hmacmd5.c [new file with mode: 0644]
lib/silccrypt/tests/test_hmacsha1.c [new file with mode: 0644]
lib/silccrypt/tests/test_md5.c [new file with mode: 0644]
lib/silccrypt/tests/test_sha1.c [new file with mode: 0644]

index fa02374ca7ca090bcd9bc5588bf765377efb1ea7..ba140777583075fd1abb9f8062c676fb82bf1993 100644 (file)
@@ -1033,6 +1033,7 @@ lib/Makefile
 lib/contrib/Makefile
 lib/silccore/Makefile
 lib/silccrypt/Makefile
+lib/silccrypt/tests/Makefile
 lib/silcmath/Makefile
 lib/silcmath/mpi/Makefile.defines
 lib/silcmath/mpi/Makefile.defines_int
index 67cde554841011c0c3919261e60777c4189fa0ad..e4daea8f20b27fc771c1b9d036a427f8cf51bd6e 100644 (file)
@@ -511,7 +511,7 @@ bool silc_client_add_channel_private_key(SilcClient client,
   /* Produce the key material */
   keymat = silc_calloc(1, sizeof(*keymat));
   if (silc_ske_process_key_material_data(key, key_len, 16, 256, 16, 
-                                        client->md5hash, keymat) 
+                                        client->sha1hash, keymat) 
       != SILC_SKE_STATUS_OK)
     return FALSE;
 
index aff49a2362f63d4d0318b5f72026dd2917e46a58..fee91ebf74597bbd0462dc1b33e657cce8f0d5e5 100644 (file)
@@ -382,7 +382,7 @@ bool silc_client_add_private_message_key(SilcClient client,
   /* Produce the key material as the protocol defines */
   keymat = silc_calloc(1, sizeof(*keymat));
   if (silc_ske_process_key_material_data(key, key_len, 16, 256, 16, 
-                                        client->md5hash, keymat) 
+                                        client->sha1hash, keymat) 
       != SILC_SKE_STATUS_OK)
     return FALSE;
 
index 910939be1b091cc6f72fb28e1ee720007e0c8aa5..b896df5b0530ce72301558335a1645b16e2eef5f 100644 (file)
@@ -51,28 +51,6 @@ SILC_HASH_API_CONTEXT_LEN(md5)
   return sizeof(struct MD5Context);
 }
 
-#ifndef HIGHFIRST
-#define byteReverse(buf, len)  /* Nothing */
-#else
-void byteReverse(unsigned char *buf, SilcUInt32s);
-
-#ifndef ASM_MD5
-/*
- * Note: this code is harmless on little-endian machines.
- */
-void byteReverse(unsigned char *buf, SilcUInt32s)
-{
-       SilcUInt32 t;
-       do {
-               t = (SilcUInt32)((unsigned)buf[3]<<8 | buf[2]) << 16 |
-                           ((unsigned)buf[1]<<8 | buf[0]);
-               *(SilcUInt32 *)buf = t;
-               buf += 4;
-       } while (--longs);
-}
-#endif
-#endif
-
 /*
  * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
  * initialization constants.
@@ -80,13 +58,13 @@ void byteReverse(unsigned char *buf, SilcUInt32s)
 void
 MD5Init(struct MD5Context *ctx)
 {
-       ctx->buf[0] = 0x67452301;
-       ctx->buf[1] = 0xefcdab89;
-       ctx->buf[2] = 0x98badcfe;
-       ctx->buf[3] = 0x10325476;
-
-       ctx->bits[0] = 0;
-       ctx->bits[1] = 0;
+  ctx->buf[0] = 0x67452301;
+  ctx->buf[1] = 0xefcdab89;
+  ctx->buf[2] = 0x98badcfe;
+  ctx->buf[3] = 0x10325476;
+  
+  ctx->bits[0] = 0;
+  ctx->bits[1] = 0;
 }
 
 /*
@@ -96,47 +74,42 @@ MD5Init(struct MD5Context *ctx)
 void
 MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)
 {
-       SilcUInt32 t;
-
-       /* Update bitcount */
-
-       t = ctx->bits[0];
-       if ((ctx->bits[0] = t + ((SilcUInt32)len << 3)) < t)
-               ctx->bits[1]++; /* Carry from low to high */
-       ctx->bits[1] += len >> 29;
-
-       t = (t >> 3) & 0x3f;    /* Bytes already in shsInfo->data */
-
-       /* Handle any leading odd-sized chunks */
-
-       if ( t ) {
-               unsigned char *p = (unsigned char *)ctx->in + t;
-
-               t = 64-t;
-               if (len < t) {
-                       memcpy(p, buf, len);
-                       return;
-               }
-               memcpy(p, buf, t);
-               byteReverse(ctx->in, 16);
-               MD5Transform(ctx->buf, ctx->in);
-               buf += t;
-               len -= t;
-       }
-
-       /* Process data in 64-byte chunks */
-
-       while (len >= 64) {
-               memcpy(ctx->in, buf, 64);
-               byteReverse(ctx->in, 16);
-               MD5Transform(ctx->buf, ctx->in);
-               buf += 64;
-               len -= 64;
-       }
-
-       /* Handle any remaining bytes of data. */
-
-       memcpy(ctx->in, buf, len);
+  SilcUInt32 t;
+
+  /* Update bitcount */
+
+  t = ctx->bits[0];
+  if ((ctx->bits[0] = (t + ((SilcUInt32)len << 3)) & 0xffffffffL) < t)
+    ctx->bits[1]++;    /* Carry from low to high */
+  ctx->bits[1] += (SilcUInt32)len >> 29;
+
+  t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
+
+  /* Handle any leading odd-sized chunks */
+  if ( t ) {
+    unsigned char *p = (unsigned char *)ctx->in + t;
+
+    t = 64-t;
+    if (len < t) {
+      memcpy(p, buf, len);
+      return;
+    }
+    memcpy(p, buf, t);
+    MD5Transform(ctx->buf, ctx->in);
+    buf += t;
+    len -= t;
+  }
+
+  /* Process data in 64-byte chunks */
+  while (len >= 64) {
+    memcpy(ctx->in, buf, 64);
+    MD5Transform(ctx->buf, ctx->in);
+    buf += 64;
+    len -= 64;
+  }
+
+  /* Handle any remaining bytes of data. */
+  memcpy(ctx->in, buf, len);
 }
 
 /*
@@ -146,43 +119,42 @@ MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)
 void
 MD5Final(unsigned char digest[16], struct MD5Context *ctx)
 {
-       unsigned count;
-       unsigned char *p;
-
-       /* Compute number of bytes mod 64 */
-       count = (ctx->bits[0] >> 3) & 0x3F;
-
-       /* Set the first char of padding to 0x80.  This is safe since there is
-          always at least one byte free */
-       p = ctx->in + count;
-       *p++ = 0x80;
-
-       /* Bytes of padding needed to make 64 bytes */
-       count = 64 - 1 - count;
-
-       /* Pad out to 56 mod 64 */
-       if (count < 8) {
-               /* Two lots of padding:  Pad the first block to 64 bytes */
-               memset(p, 0, count);
-               byteReverse(ctx->in, 16);
-               MD5Transform(ctx->buf, ctx->in);
-
-               /* Now fill the next block with 56 bytes */
-               memset(ctx->in, 0, 56);
-       } else {
-               /* Pad block to 56 bytes */
-               memset(p, 0, count-8);
-       }
-       byteReverse(ctx->in, 14);
-
-       /* Append length in bits and transform */
-       ((SilcUInt32 *)ctx->in)[ 14 ] = ctx->bits[0];
-       ((SilcUInt32 *)ctx->in)[ 15 ] = ctx->bits[1];
-
-       MD5Transform(ctx->buf, ctx->in);
-       byteReverse((unsigned char *)ctx->buf, 4);
-       memcpy(digest, ctx->buf, 16);
-       memset(ctx, 0, sizeof(ctx));    /* In case it's sensitive */
+  unsigned count;
+  unsigned char *p;
+
+  /* Compute number of bytes mod 64 */
+  count = (ctx->bits[0] >> 3) & 0x3F;
+
+  /* Set the first char of padding to 0x80.  This is safe since there is
+     always at least one byte free */
+  p = ctx->in + count;
+  *p++ = 0x80;
+
+  /* Bytes of padding needed to make 64 bytes */
+  count = 64 - 1 - count;
+
+  /* Pad out to 56 mod 64 */
+  if (count < 8) {
+    /* Two lots of padding:  Pad the first block to 64 bytes */
+    memset(p, 0, count);
+    MD5Transform(ctx->buf, ctx->in);
+
+    /* Now fill the next block with 56 bytes */
+    memset(ctx->in, 0, 56);
+  } else {
+    /* Pad block to 56 bytes */
+    memset(p, 0, count-8);
+  }
+
+  /* Append length in bits and transform */
+  SILC_PUT32_LSB(ctx->bits[0], ctx->in + 56);
+  SILC_PUT32_LSB(ctx->bits[1], ctx->in + 60);
+  MD5Transform(ctx->buf, ctx->in);
+  SILC_PUT32_LSB(ctx->buf[0], digest);
+  SILC_PUT32_LSB(ctx->buf[1], digest + 4);
+  SILC_PUT32_LSB(ctx->buf[2], digest + 8);
+  SILC_PUT32_LSB(ctx->buf[3], digest + 12);
+  memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */
 }
 
 #ifndef ASM_MD5
@@ -197,7 +169,8 @@ MD5Final(unsigned char digest[16], struct MD5Context *ctx)
 
 /* This is the central step in the MD5 algorithm. */
 #define MD5STEP(f, w, x, y, z, data, s) \
-       ( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
+       ( w += f(x, y, z) + data,  w = (w<<s | w>>(32-s)) & 0xffffffff, \
+        w += x )
 
 /*
  * The core of the MD5 algorithm, this alters an existing MD5 hash to
@@ -207,88 +180,88 @@ MD5Final(unsigned char digest[16], struct MD5Context *ctx)
 void
 MD5Transform(SilcUInt32 buf[4], const unsigned char kbuf[64])
 {
-       register SilcUInt32 a, b, c, d, i;
-       SilcUInt32 in[16];
-
-       for (i = 0; i < 16; i++)
-           SILC_GET32_MSB(in[i], kbuf + 4 * i);
-
-       a = buf[0];
-       b = buf[1];
-       c = buf[2];
-       d = buf[3];
-
-       MD5STEP(F1, a, b, c, d, in[ 0]+0xd76aa478,  7);
-       MD5STEP(F1, d, a, b, c, in[ 1]+0xe8c7b756, 12);
-       MD5STEP(F1, c, d, a, b, in[ 2]+0x242070db, 17);
-       MD5STEP(F1, b, c, d, a, in[ 3]+0xc1bdceee, 22);
-       MD5STEP(F1, a, b, c, d, in[ 4]+0xf57c0faf,  7);
-       MD5STEP(F1, d, a, b, c, in[ 5]+0x4787c62a, 12);
-       MD5STEP(F1, c, d, a, b, in[ 6]+0xa8304613, 17);
-       MD5STEP(F1, b, c, d, a, in[ 7]+0xfd469501, 22);
-       MD5STEP(F1, a, b, c, d, in[ 8]+0x698098d8,  7);
-       MD5STEP(F1, d, a, b, c, in[ 9]+0x8b44f7af, 12);
-       MD5STEP(F1, c, d, a, b, in[10]+0xffff5bb1, 17);
-       MD5STEP(F1, b, c, d, a, in[11]+0x895cd7be, 22);
-       MD5STEP(F1, a, b, c, d, in[12]+0x6b901122,  7);
-       MD5STEP(F1, d, a, b, c, in[13]+0xfd987193, 12);
-       MD5STEP(F1, c, d, a, b, in[14]+0xa679438e, 17);
-       MD5STEP(F1, b, c, d, a, in[15]+0x49b40821, 22);
-
-       MD5STEP(F2, a, b, c, d, in[ 1]+0xf61e2562,  5);
-       MD5STEP(F2, d, a, b, c, in[ 6]+0xc040b340,  9);
-       MD5STEP(F2, c, d, a, b, in[11]+0x265e5a51, 14);
-       MD5STEP(F2, b, c, d, a, in[ 0]+0xe9b6c7aa, 20);
-       MD5STEP(F2, a, b, c, d, in[ 5]+0xd62f105d,  5);
-       MD5STEP(F2, d, a, b, c, in[10]+0x02441453,  9);
-       MD5STEP(F2, c, d, a, b, in[15]+0xd8a1e681, 14);
-       MD5STEP(F2, b, c, d, a, in[ 4]+0xe7d3fbc8, 20);
-       MD5STEP(F2, a, b, c, d, in[ 9]+0x21e1cde6,  5);
-       MD5STEP(F2, d, a, b, c, in[14]+0xc33707d6,  9);
-       MD5STEP(F2, c, d, a, b, in[ 3]+0xf4d50d87, 14);
-       MD5STEP(F2, b, c, d, a, in[ 8]+0x455a14ed, 20);
-       MD5STEP(F2, a, b, c, d, in[13]+0xa9e3e905,  5);
-       MD5STEP(F2, d, a, b, c, in[ 2]+0xfcefa3f8,  9);
-       MD5STEP(F2, c, d, a, b, in[ 7]+0x676f02d9, 14);
-       MD5STEP(F2, b, c, d, a, in[12]+0x8d2a4c8a, 20);
-
-       MD5STEP(F3, a, b, c, d, in[ 5]+0xfffa3942,  4);
-       MD5STEP(F3, d, a, b, c, in[ 8]+0x8771f681, 11);
-       MD5STEP(F3, c, d, a, b, in[11]+0x6d9d6122, 16);
-       MD5STEP(F3, b, c, d, a, in[14]+0xfde5380c, 23);
-       MD5STEP(F3, a, b, c, d, in[ 1]+0xa4beea44,  4);
-       MD5STEP(F3, d, a, b, c, in[ 4]+0x4bdecfa9, 11);
-       MD5STEP(F3, c, d, a, b, in[ 7]+0xf6bb4b60, 16);
-       MD5STEP(F3, b, c, d, a, in[10]+0xbebfbc70, 23);
-       MD5STEP(F3, a, b, c, d, in[13]+0x289b7ec6,  4);
-       MD5STEP(F3, d, a, b, c, in[ 0]+0xeaa127fa, 11);
-       MD5STEP(F3, c, d, a, b, in[ 3]+0xd4ef3085, 16);
-       MD5STEP(F3, b, c, d, a, in[ 6]+0x04881d05, 23);
-       MD5STEP(F3, a, b, c, d, in[ 9]+0xd9d4d039,  4);
-       MD5STEP(F3, d, a, b, c, in[12]+0xe6db99e5, 11);
-       MD5STEP(F3, c, d, a, b, in[15]+0x1fa27cf8, 16);
-       MD5STEP(F3, b, c, d, a, in[ 2]+0xc4ac5665, 23);
-
-       MD5STEP(F4, a, b, c, d, in[ 0]+0xf4292244,  6);
-       MD5STEP(F4, d, a, b, c, in[ 7]+0x432aff97, 10);
-       MD5STEP(F4, c, d, a, b, in[14]+0xab9423a7, 15);
-       MD5STEP(F4, b, c, d, a, in[ 5]+0xfc93a039, 21);
-       MD5STEP(F4, a, b, c, d, in[12]+0x655b59c3,  6);
-       MD5STEP(F4, d, a, b, c, in[ 3]+0x8f0ccc92, 10);
-       MD5STEP(F4, c, d, a, b, in[10]+0xffeff47d, 15);
-       MD5STEP(F4, b, c, d, a, in[ 1]+0x85845dd1, 21);
-       MD5STEP(F4, a, b, c, d, in[ 8]+0x6fa87e4f,  6);
-       MD5STEP(F4, d, a, b, c, in[15]+0xfe2ce6e0, 10);
-       MD5STEP(F4, c, d, a, b, in[ 6]+0xa3014314, 15);
-       MD5STEP(F4, b, c, d, a, in[13]+0x4e0811a1, 21);
-       MD5STEP(F4, a, b, c, d, in[ 4]+0xf7537e82,  6);
-       MD5STEP(F4, d, a, b, c, in[11]+0xbd3af235, 10);
-       MD5STEP(F4, c, d, a, b, in[ 2]+0x2ad7d2bb, 15);
-       MD5STEP(F4, b, c, d, a, in[ 9]+0xeb86d391, 21);
-
-       buf[0] += a;
-       buf[1] += b;
-       buf[2] += c;
-       buf[3] += d;
+  register SilcUInt32 a, b, c, d, i;
+  SilcUInt32 in[16];
+
+  for (i = 0; i < 16; i++)
+    SILC_GET32_LSB(in[i], kbuf + 4 * i);
+
+  a = buf[0];
+  b = buf[1];
+  c = buf[2];
+  d = buf[3];
+
+  MD5STEP(F1, a, b, c, d, in[ 0]+0xd76aa478,  7);
+  MD5STEP(F1, d, a, b, c, in[ 1]+0xe8c7b756, 12);
+  MD5STEP(F1, c, d, a, b, in[ 2]+0x242070db, 17);
+  MD5STEP(F1, b, c, d, a, in[ 3]+0xc1bdceee, 22);
+  MD5STEP(F1, a, b, c, d, in[ 4]+0xf57c0faf,  7);
+  MD5STEP(F1, d, a, b, c, in[ 5]+0x4787c62a, 12);
+  MD5STEP(F1, c, d, a, b, in[ 6]+0xa8304613, 17);
+  MD5STEP(F1, b, c, d, a, in[ 7]+0xfd469501, 22);
+  MD5STEP(F1, a, b, c, d, in[ 8]+0x698098d8,  7);
+  MD5STEP(F1, d, a, b, c, in[ 9]+0x8b44f7af, 12);
+  MD5STEP(F1, c, d, a, b, in[10]+0xffff5bb1, 17);
+  MD5STEP(F1, b, c, d, a, in[11]+0x895cd7be, 22);
+  MD5STEP(F1, a, b, c, d, in[12]+0x6b901122,  7);
+  MD5STEP(F1, d, a, b, c, in[13]+0xfd987193, 12);
+  MD5STEP(F1, c, d, a, b, in[14]+0xa679438e, 17);
+  MD5STEP(F1, b, c, d, a, in[15]+0x49b40821, 22);
+  
+  MD5STEP(F2, a, b, c, d, in[ 1]+0xf61e2562,  5);
+  MD5STEP(F2, d, a, b, c, in[ 6]+0xc040b340,  9);
+  MD5STEP(F2, c, d, a, b, in[11]+0x265e5a51, 14);
+  MD5STEP(F2, b, c, d, a, in[ 0]+0xe9b6c7aa, 20);
+  MD5STEP(F2, a, b, c, d, in[ 5]+0xd62f105d,  5);
+  MD5STEP(F2, d, a, b, c, in[10]+0x02441453,  9);
+  MD5STEP(F2, c, d, a, b, in[15]+0xd8a1e681, 14);
+  MD5STEP(F2, b, c, d, a, in[ 4]+0xe7d3fbc8, 20);
+  MD5STEP(F2, a, b, c, d, in[ 9]+0x21e1cde6,  5);
+  MD5STEP(F2, d, a, b, c, in[14]+0xc33707d6,  9);
+  MD5STEP(F2, c, d, a, b, in[ 3]+0xf4d50d87, 14);
+  MD5STEP(F2, b, c, d, a, in[ 8]+0x455a14ed, 20);
+  MD5STEP(F2, a, b, c, d, in[13]+0xa9e3e905,  5);
+  MD5STEP(F2, d, a, b, c, in[ 2]+0xfcefa3f8,  9);
+  MD5STEP(F2, c, d, a, b, in[ 7]+0x676f02d9, 14);
+  MD5STEP(F2, b, c, d, a, in[12]+0x8d2a4c8a, 20);
+  
+  MD5STEP(F3, a, b, c, d, in[ 5]+0xfffa3942,  4);
+  MD5STEP(F3, d, a, b, c, in[ 8]+0x8771f681, 11);
+  MD5STEP(F3, c, d, a, b, in[11]+0x6d9d6122, 16);
+  MD5STEP(F3, b, c, d, a, in[14]+0xfde5380c, 23);
+  MD5STEP(F3, a, b, c, d, in[ 1]+0xa4beea44,  4);
+  MD5STEP(F3, d, a, b, c, in[ 4]+0x4bdecfa9, 11);
+  MD5STEP(F3, c, d, a, b, in[ 7]+0xf6bb4b60, 16);
+  MD5STEP(F3, b, c, d, a, in[10]+0xbebfbc70, 23);
+  MD5STEP(F3, a, b, c, d, in[13]+0x289b7ec6,  4);
+  MD5STEP(F3, d, a, b, c, in[ 0]+0xeaa127fa, 11);
+  MD5STEP(F3, c, d, a, b, in[ 3]+0xd4ef3085, 16);
+  MD5STEP(F3, b, c, d, a, in[ 6]+0x04881d05, 23);
+  MD5STEP(F3, a, b, c, d, in[ 9]+0xd9d4d039,  4);
+  MD5STEP(F3, d, a, b, c, in[12]+0xe6db99e5, 11);
+  MD5STEP(F3, c, d, a, b, in[15]+0x1fa27cf8, 16);
+  MD5STEP(F3, b, c, d, a, in[ 2]+0xc4ac5665, 23);
+  
+  MD5STEP(F4, a, b, c, d, in[ 0]+0xf4292244,  6);
+  MD5STEP(F4, d, a, b, c, in[ 7]+0x432aff97, 10);
+  MD5STEP(F4, c, d, a, b, in[14]+0xab9423a7, 15);
+  MD5STEP(F4, b, c, d, a, in[ 5]+0xfc93a039, 21);
+  MD5STEP(F4, a, b, c, d, in[12]+0x655b59c3,  6);
+  MD5STEP(F4, d, a, b, c, in[ 3]+0x8f0ccc92, 10);
+  MD5STEP(F4, c, d, a, b, in[10]+0xffeff47d, 15);
+  MD5STEP(F4, b, c, d, a, in[ 1]+0x85845dd1, 21);
+  MD5STEP(F4, a, b, c, d, in[ 8]+0x6fa87e4f,  6);
+  MD5STEP(F4, d, a, b, c, in[15]+0xfe2ce6e0, 10);
+  MD5STEP(F4, c, d, a, b, in[ 6]+0xa3014314, 15);
+  MD5STEP(F4, b, c, d, a, in[13]+0x4e0811a1, 21);
+  MD5STEP(F4, a, b, c, d, in[ 4]+0xf7537e82,  6);
+  MD5STEP(F4, d, a, b, c, in[11]+0xbd3af235, 10);
+  MD5STEP(F4, c, d, a, b, in[ 2]+0x2ad7d2bb, 15);
+  MD5STEP(F4, b, c, d, a, in[ 9]+0xeb86d391, 21);
+  
+  buf[0] += a;
+  buf[1] += b;
+  buf[2] += c;
+  buf[3] += d;
 }
 #endif
index 71f1603c1c3ce9f7bb1fc1793d98c718db970183..35835b82451431817aa2dc89cf4731c236b474b9 100644 (file)
@@ -4,9 +4,9 @@
 #define MD5_INTERNAL_H
 
 struct MD5Context {
-       SilcUInt32 buf[4];
-       SilcUInt32 bits[2];
-       unsigned char in[64];
+  SilcUInt32 buf[4];
+  SilcUInt32 bits[2];
+  unsigned char in[64];
 };
 
 void MD5Init(struct MD5Context *context);
diff --git a/lib/silccrypt/tests/Makefile.am b/lib/silccrypt/tests/Makefile.am
new file mode 100644 (file)
index 0000000..e2aa131
--- /dev/null
@@ -0,0 +1,38 @@
+#
+#  Makefile.am
+#
+#  Author: Pekka Riikonen <priikone@silcnet.org>
+#
+#  Copyright (C) 2002 Pekka Riikonen
+#
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; version 2 of the License.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+
+AUTOMAKE_OPTIONS = 1.0 no-dependencies foreign
+
+bin_PROGRAMS =         test_sha1       \
+               test_md5        \
+               test_hmacsha1   \
+               test_hmacmd5    \
+               test_aes        \
+               test_twofish
+
+test_sha1_SOURCES = test_sha1.c
+test_md5_SOURCES = test_md5.c
+test_hmacsha1_SOURCES = test_hmacsha1.c
+test_hmacmd5_SOURCES = test_hmacmd5.c
+
+test_aes_SOURCES = test_aes.c
+test_twofish_SOURCES = test_aes.c
+
+LIBS = $(SILC_COMMON_LIBS)
+LDADD = -L.. -L../.. -lsilc
+
+include $(top_srcdir)/Makefile.defines.in
diff --git a/lib/silccrypt/tests/inst_aes b/lib/silccrypt/tests/inst_aes
deleted file mode 100644 (file)
index e68d762..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-gcc -I.. \
--I../../../includes -I../../silccore -I../../trq -I../../silcske \
--I../.. -I../../silccore -I../../silcmath -I../../silcutil \
--I../../silcmath/mpi -I../../silcske -I../../silcsim \
--I../../silcsftp -Wall -finline-functions \
--o test_aes test_aes.c -L../.. -lsilc
-
diff --git a/lib/silccrypt/tests/inst_twofish b/lib/silccrypt/tests/inst_twofish
deleted file mode 100644 (file)
index 5e03534..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-gcc -I.. \
--I../../../includes -I../../silccore -I../../trq -I../../silcske \
--I../.. -I../../silccore -I../../silcmath -I../../silcutil \
--I../../silcmath/gmp -I../../silcske -I../../silcsim \
--Wall -finline-functions \
--o test_twofish test_twofish.c -L../.. -lsilc
-
diff --git a/lib/silccrypt/tests/test_hmacmd5.c b/lib/silccrypt/tests/test_hmacmd5.c
new file mode 100644 (file)
index 0000000..94f7795
--- /dev/null
@@ -0,0 +1,124 @@
+#include "silcincludes.h"
+
+/* Test vectors from RFC 2202 */
+
+/* First test vector */
+const unsigned char key1[] = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
+int key1_len = 16;
+const unsigned char data1[] = "Hi There";
+const unsigned char data1_digest[] = "\x92\x94\x72\x7a\x36\x38\xbb\x1c\x13\xf4\x8e\xf8\x15\x8b\xfc\x9d";
+
+/* Second test vector */
+const unsigned char key2[] = "Jefe";
+int key2_len = 4;
+const unsigned char data2[] = "what do ya want for nothing?";
+const unsigned char data2_digest[] = "\x75\x0c\x78\x3e\x6a\xb0\xb5\x03\xea\xa8\x6e\x31\x0a\x5d\xb7\x38";
+
+/* Third test vector, data 0xdd repeated 50 times */
+const unsigned char key3[] = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa";
+int key3_len = 16;
+unsigned char data3[50];
+const unsigned char data3_digest[] = "\x56\xbe\x34\x52\x1d\x14\x4c\x88\xdb\xb8\xc7\x33\xf0\xe8\xb3\xf6";
+
+/* Fourth test vector, key 0xaa 80 times */
+unsigned char key4[80];
+int key4_len = 80;
+const unsigned char data4[] = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data";
+const unsigned char data4_digest[] = "\x6f\x63\x0f\xad\x67\xcd\xa0\xee\x1f\xb1\xf5\x62\xdb\x3a\xa5\x3e";
+
+int main(int argc, char **argv)
+{
+  bool success = FALSE;
+  unsigned char digest[16];
+  SilcUInt32 len;
+  SilcHmac hmac;
+  
+  if (argc > 1 && !strcmp(argv[1], "-d")) {
+    silc_debug = 1;
+    silc_debug_hexdump = 1;
+    silc_log_set_debug_string("*crypt*,*hash*,*md5*,*hmac*");
+  }
+
+  SILC_LOG_DEBUG(("Registering builtin hash functions"));
+  silc_hash_register_default();
+  silc_hmac_register_default();
+
+  SILC_LOG_DEBUG(("Allocating md5 HMAC"));
+  if (!silc_hmac_alloc("hmac-md5", NULL, &hmac)) {
+    SILC_LOG_DEBUG(("Allocating md5 HMAC failed"));
+    goto err;
+  }
+
+  /* First test vector */
+  SILC_LOG_DEBUG(("First test vector"));
+  silc_hmac_init_with_key(hmac, key1, key1_len);
+  silc_hmac_update(hmac, data1, strlen(data1));
+  silc_hmac_final(hmac, digest, &len);
+  SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key1, key1_len);
+  SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data1, strlen(data1));
+  SILC_LOG_HEXDUMP(("Digest"), digest, len);
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data1_digest, len);
+  if (memcmp(digest, data1_digest, len)) {
+    SILC_LOG_DEBUG(("HMAC failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("HMAC is successful"));
+  
+  /* Second test vector */
+  SILC_LOG_DEBUG(("Second test vector"));
+  silc_hmac_init_with_key(hmac, key2, key2_len);
+  silc_hmac_update(hmac, data2, strlen(data2));
+  silc_hmac_final(hmac, digest, &len);
+  SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key2, key2_len);
+  SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data2, strlen(data2));
+  SILC_LOG_HEXDUMP(("Digest"), digest, len);
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data2_digest, len);
+  if (memcmp(digest, data2_digest, len)) {
+    SILC_LOG_DEBUG(("HMAC failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("HMAC is successful"));
+  
+  /* Third test vector */
+  SILC_LOG_DEBUG(("Third test vector"));
+  silc_hmac_init_with_key(hmac, key3, key3_len);
+  memset(data3, '\xdd', sizeof(data3));
+  silc_hmac_update(hmac, data3, sizeof(data3));
+  silc_hmac_final(hmac, digest, &len);
+  SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key3, key3_len);
+  SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data3, sizeof(data3));
+  SILC_LOG_HEXDUMP(("Digest"), digest, len);
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data3_digest, len);
+  if (memcmp(digest, data3_digest, len)) {
+    SILC_LOG_DEBUG(("HMAC failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("HMAC is successful"));
+  
+  /* Fourth test vector */
+  SILC_LOG_DEBUG(("Fourth test vector"));
+  memset(key4, '\xaa', key4_len);
+  silc_hmac_init_with_key(hmac, key4, key4_len);
+  silc_hmac_update(hmac, data4, strlen(data4));
+  silc_hmac_final(hmac, digest, &len);
+  SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key4, key4_len);
+  SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data4, sizeof(data4));
+  SILC_LOG_HEXDUMP(("Digest"), digest, len);
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data4_digest, len);
+  if (memcmp(digest, data4_digest, len)) {
+    SILC_LOG_DEBUG(("HMAC failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("HMAC is successful"));
+  
+  success = TRUE;
+  
+ err:
+  SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
+  fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
+
+  silc_hmac_free(hmac);
+  silc_hash_unregister_all();
+  silc_hmac_unregister_all();
+  return success;
+}
diff --git a/lib/silccrypt/tests/test_hmacsha1.c b/lib/silccrypt/tests/test_hmacsha1.c
new file mode 100644 (file)
index 0000000..a5a67b6
--- /dev/null
@@ -0,0 +1,124 @@
+#include "silcincludes.h"
+
+/* Test vectors from RFC 2202 */
+
+/* First test vector */
+const unsigned char key1[] = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
+int key1_len = 20;
+const unsigned char data1[] = "Hi There";
+const unsigned char data1_digest[] = "\xb6\x17\x31\x86\x55\x05\x72\x64\xe2\x8b\xc0\xb6\xfb\x37\x8c\x8e\xf1\x46\xbe\x00";
+
+/* Second test vector */
+const unsigned char key2[] = "Jefe";
+int key2_len = 4;
+const unsigned char data2[] = "what do ya want for nothing?";
+const unsigned char data2_digest[] = "\xef\xfc\xdf\x6a\xe5\xeb\x2f\xa2\xd2\x74\x16\xd5\xf1\x84\xdf\x9c\x25\x9a\x7c\x79";
+
+/* Third test vector, data 0xdd repeated 50 times */
+const unsigned char key3[] = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa";
+int key3_len = 20;
+unsigned char data3[50];
+const unsigned char data3_digest[] = "\x12\x5d\x73\x42\xb9\xac\x11\xcd\x91\xa3\x9a\xf4\x8a\xa1\x7b\x4f\x63\xf1\x75\xd3";
+
+/* Fourth test vector, key 0xaa 80 times */
+unsigned char key4[80];
+int key4_len = 80;
+const unsigned char data4[] = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data";
+const unsigned char data4_digest[] = "\xe8\xe9\x9d\x0f\x45\x23\x7d\x78\x6d\x6b\xba\xa7\x96\x5c\x78\x08\xbb\xff\x1a\x91";
+
+int main(int argc, char **argv)
+{
+  bool success = FALSE;
+  unsigned char digest[20];
+  SilcUInt32 len;
+  SilcHmac hmac;
+  
+  if (argc > 1 && !strcmp(argv[1], "-d")) {
+    silc_debug = 1;
+    silc_debug_hexdump = 1;
+    silc_log_set_debug_string("*crypt*,*hash*,*sha1*,*hmac*");
+  }
+
+  SILC_LOG_DEBUG(("Registering builtin hash functions"));
+  silc_hash_register_default();
+  silc_hmac_register_default();
+
+  SILC_LOG_DEBUG(("Allocating sha1 HMAC"));
+  if (!silc_hmac_alloc("hmac-sha1", NULL, &hmac)) {
+    SILC_LOG_DEBUG(("Allocating sha1 HMAC failed"));
+    goto err;
+  }
+
+  /* First test vector */
+  SILC_LOG_DEBUG(("First test vector"));
+  silc_hmac_init_with_key(hmac, key1, key1_len);
+  silc_hmac_update(hmac, data1, strlen(data1));
+  silc_hmac_final(hmac, digest, &len);
+  SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key1, key1_len);
+  SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data1, strlen(data1));
+  SILC_LOG_HEXDUMP(("Digest"), digest, len);
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data1_digest, len);
+  if (memcmp(digest, data1_digest, len)) {
+    SILC_LOG_DEBUG(("HMAC failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("HMAC is successful"));
+  
+  /* Second test vector */
+  SILC_LOG_DEBUG(("Second test vector"));
+  silc_hmac_init_with_key(hmac, key2, key2_len);
+  silc_hmac_update(hmac, data2, strlen(data2));
+  silc_hmac_final(hmac, digest, &len);
+  SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key2, key2_len);
+  SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data2, strlen(data2));
+  SILC_LOG_HEXDUMP(("Digest"), digest, len);
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data2_digest, len);
+  if (memcmp(digest, data2_digest, len)) {
+    SILC_LOG_DEBUG(("HMAC failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("HMAC is successful"));
+  
+  /* Third test vector */
+  SILC_LOG_DEBUG(("Third test vector"));
+  silc_hmac_init_with_key(hmac, key3, key3_len);
+  memset(data3, '\xdd', sizeof(data3));
+  silc_hmac_update(hmac, data3, sizeof(data3));
+  silc_hmac_final(hmac, digest, &len);
+  SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key3, key3_len);
+  SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data3, sizeof(data3));
+  SILC_LOG_HEXDUMP(("Digest"), digest, len);
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data3_digest, len);
+  if (memcmp(digest, data3_digest, len)) {
+    SILC_LOG_DEBUG(("HMAC failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("HMAC is successful"));
+  
+  /* Fourth test vector */
+  SILC_LOG_DEBUG(("Fourth test vector"));
+  memset(key4, '\xaa', key4_len);
+  silc_hmac_init_with_key(hmac, key4, key4_len);
+  silc_hmac_update(hmac, data4, strlen(data4));
+  silc_hmac_final(hmac, digest, &len);
+  SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key4, key4_len);
+  SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data4, sizeof(data4));
+  SILC_LOG_HEXDUMP(("Digest"), digest, len);
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data4_digest, len);
+  if (memcmp(digest, data4_digest, len)) {
+    SILC_LOG_DEBUG(("HMAC failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("HMAC is successful"));
+  
+  success = TRUE;
+  
+ err:
+  SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
+  fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
+
+  silc_hmac_free(hmac);
+  silc_hash_unregister_all();
+  silc_hmac_unregister_all();
+  return success;
+}
diff --git a/lib/silccrypt/tests/test_md5.c b/lib/silccrypt/tests/test_md5.c
new file mode 100644 (file)
index 0000000..5f9ac5c
--- /dev/null
@@ -0,0 +1,92 @@
+#include "silcincludes.h"
+
+/* Test vectors from RFC 1321 */
+
+/* First test vector */
+const unsigned char data1[] = "a";
+const unsigned char data1_digest[] = "\x0c\xc1\x75\xb9\xc0\xf1\xb6\xa8\x31\xc3\x99\xe2\x69\x77\x26\x61";
+
+/* Second test vector. */
+const unsigned char data2[] = "message digest";
+const unsigned char data2_digest[] = "\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d\x52\x5a\x2f\x31\xaa\xf1\x61\xd0";
+
+/* Third test vector. */
+const unsigned char data3[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+const unsigned char data3_digest[] = "\xd1\x74\xab\x98\xd2\x77\xd9\xf5\xa5\x61\x1c\x2c\x9f\x41\x9d\x9f";
+
+int main(int argc, char **argv)
+{
+  bool success = FALSE;
+  unsigned char digest[16];
+  SilcHash md5;
+  
+  if (argc > 1 && !strcmp(argv[1], "-d")) {
+    silc_debug = 1;
+    silc_debug_hexdump = 1;
+    silc_log_set_debug_string("*crypt*,*hash*,*md5*");
+  }
+
+  SILC_LOG_DEBUG(("Registering builtin hash functions"));
+  silc_hash_register_default();
+
+  SILC_LOG_DEBUG(("Allocating md5 hash function"));
+  if (!silc_hash_alloc("md5", &md5)) {
+    SILC_LOG_DEBUG(("Allocating md5 hash function failed"));
+    goto err;
+  }
+
+  /* First test vector */
+  SILC_LOG_DEBUG(("First test vector"));
+  silc_hash_init(md5);
+  silc_hash_update(md5, data1, strlen(data1));
+  silc_hash_final(md5, digest);
+  SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data1, strlen(data1));
+  SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data1_digest,
+                  sizeof(digest));
+  if (memcmp(digest, data1_digest, sizeof(digest))) {
+    SILC_LOG_DEBUG(("Hash failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("Hash is successful"));
+  
+  /* Second test vector */
+  SILC_LOG_DEBUG(("Second test vector"));
+  silc_hash_init(md5);
+  silc_hash_update(md5, data2, strlen(data2));
+  silc_hash_final(md5, digest);
+  SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data2, strlen(data2));
+  SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data2_digest,
+                  sizeof(digest));
+  if (memcmp(digest, data2_digest, sizeof(digest))) {
+    SILC_LOG_DEBUG(("Hash failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("Hash is successful"));
+
+  /* Third test vector */
+  SILC_LOG_DEBUG(("Third test vector"));
+  silc_hash_init(md5);
+  silc_hash_update(md5, data3, strlen(data3));
+  silc_hash_final(md5, digest);
+  SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data3, strlen(data3));
+  SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data3_digest,
+                  sizeof(digest));
+  if (memcmp(digest, data3_digest, sizeof(digest))) {
+    SILC_LOG_DEBUG(("Hash failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("Hash is successful"));
+
+  success = TRUE;
+  
+ err:
+  SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
+  fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
+
+  silc_hash_free(md5);
+  silc_hash_unregister_all();
+  return success;
+}
diff --git a/lib/silccrypt/tests/test_sha1.c b/lib/silccrypt/tests/test_sha1.c
new file mode 100644 (file)
index 0000000..93efb3d
--- /dev/null
@@ -0,0 +1,76 @@
+#include "silcincludes.h"
+
+/* Test vectors from NIST secure hashing definition for SHA-1 */
+
+/* First test vector */
+const unsigned char data1[] = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
+const unsigned char data1_digest[] = "\x84\x98\x3e\x44\x1c\x3b\xd2\x6e\xba\xae\x4a\xa1\xf9\x51\x29\xe5\xe5\x46\x70\xf1";
+
+/* Second test vector. This will be allocated with 1000000 'a' characters
+   and hashed */
+char *data2 = NULL;
+const unsigned char data2_digest[] = "\x34\xaa\x97\x3c\xd4\xc4\xda\xa4\xf6\x1e\xeb\x2b\xdb\xad\x27\x31\x65\x34\x01\x6f";
+
+int main(int argc, char **argv)
+{
+  bool success = FALSE;
+  unsigned char digest[20];
+  SilcHash sha1;
+  
+  if (argc > 1 && !strcmp(argv[1], "-d")) {
+    silc_debug = 1;
+    silc_debug_hexdump = 1;
+    silc_log_set_debug_string("*crypt*,*hash*,*sha1*");
+  }
+
+  SILC_LOG_DEBUG(("Registering builtin hash functions"));
+  silc_hash_register_default();
+
+  SILC_LOG_DEBUG(("Allocating sha1 hash function"));
+  if (!silc_hash_alloc("sha1", &sha1)) {
+    SILC_LOG_DEBUG(("Allocating sha1 hash function failed"));
+    goto err;
+  }
+
+  /* First test vector */
+  SILC_LOG_DEBUG(("First test vector"));
+  silc_hash_init(sha1);
+  silc_hash_update(sha1, data1, strlen(data1));
+  silc_hash_final(sha1, digest);
+  SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data1, strlen(data1));
+  SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data1_digest,
+                  sizeof(digest));
+  if (memcmp(digest, data1_digest, sizeof(digest))) {
+    SILC_LOG_DEBUG(("Hash failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("Hash is successful"));
+  
+  /* First test vector */
+  SILC_LOG_DEBUG(("Second test vector"));
+  data2 = silc_malloc(1000000);
+  memset(data2, 'a', 1000000);
+  silc_hash_init(sha1);
+  silc_hash_update(sha1, data2, 1000000);
+  silc_hash_final(sha1, digest);
+  SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
+  SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data2_digest,
+                  sizeof(digest));
+  if (memcmp(digest, data2_digest, sizeof(digest))) {
+    SILC_LOG_DEBUG(("Hash failed"));
+    goto err;
+  }
+  SILC_LOG_DEBUG(("Hash is successful"));
+
+  success = TRUE;
+  
+ err:
+  SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
+  fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
+
+  silc_free(data2);
+  silc_hash_free(sha1);
+  silc_hash_unregister_all();
+  return success;
+}