Integer type name change.
[silc.git] / lib / silccrypt / rc6.c
index e2cc97cc5b4fb794d362d4755316ace3d45fedc3..2ca7c83cecdecd7a70d24552d894c5eb4e7cceb8 100644 (file)
@@ -37,6 +37,7 @@ Mean:          249 cycles =   103.0 mbits/sec
 */
 
 #include "silcincludes.h"
+#include "rc6_internal.h"
 #include "rc6.h"
 
 /* 
@@ -47,8 +48,12 @@ Mean:          249 cycles =   103.0 mbits/sec
 
 SILC_CIPHER_API_SET_KEY(rc6)
 {
-  rc6_set_key((RC6Context *)context, (unsigned int *)key, keylen);
-  return 1;
+  SilcUInt32 k[8];
+
+  SILC_GET_WORD_KEY(key, k, keylen);
+  rc6_set_key((RC6Context *)context, k, keylen);
+
+  return TRUE;
 }
 
 /* Sets the string as a new key for the cipher. The string is first
@@ -56,7 +61,7 @@ SILC_CIPHER_API_SET_KEY(rc6)
 
 SILC_CIPHER_API_SET_KEY_WITH_STRING(rc6)
 {
-  return 1;
+  return FALSE;
 }
 
 /* Encrypts with the cipher in CBC mode. Source and destination buffers
@@ -64,36 +69,22 @@ SILC_CIPHER_API_SET_KEY_WITH_STRING(rc6)
 
 SILC_CIPHER_API_ENCRYPT_CBC(rc6)
 {
-  unsigned int *in, *out, *tiv;
-  unsigned int tmp[4];
+  SilcUInt32 tiv[4];
   int i;
 
-  in = (unsigned int *)src;
-  out = (unsigned int *)dst;
-  tiv = (unsigned int *)iv;
+  SILC_CBC_GET_IV(tiv, iv);
 
-  tmp[0] = in[0] ^ tiv[0];
-  tmp[1] = in[1] ^ tiv[1];
-  tmp[2] = in[2] ^ tiv[2];
-  tmp[3] = in[3] ^ tiv[3];
-  rc6_encrypt((RC6Context *)context, tmp, out);
-  in += 4;
-  out += 4;
+  SILC_CBC_ENC_PRE(tiv, src);
+  rc6_encrypt((RC6Context *)context, tiv, tiv);
+  SILC_CBC_ENC_POST(tiv, dst, src);
 
   for (i = 16; i < len; i += 16) {
-    tmp[0] = in[0] ^ out[0 - 4];
-    tmp[1] = in[1] ^ out[1 - 4];
-    tmp[2] = in[2] ^ out[2 - 4];
-    tmp[3] = in[3] ^ out[3 - 4];
-    rc6_encrypt((RC6Context *)context, tmp, out);
-    in += 4;
-    out += 4;
+    SILC_CBC_ENC_PRE(tiv, src);
+    rc6_encrypt((RC6Context *)context, tiv, tiv);
+    SILC_CBC_ENC_POST(tiv, dst, src);
   }
 
-  tiv[0] = out[0 - 4];
-  tiv[1] = out[1 - 4];
-  tiv[2] = out[2 - 4];
-  tiv[3] = out[3 - 4];
+  SILC_CBC_PUT_IV(tiv, iv);
 
   return TRUE;
 }
@@ -103,48 +94,22 @@ SILC_CIPHER_API_ENCRYPT_CBC(rc6)
 
 SILC_CIPHER_API_DECRYPT_CBC(rc6)
 {
-  unsigned int *in, *out, *tiv;
-  unsigned int tmp[4], tmp2[4];
+  SilcUInt32 tmp[4], tmp2[4], tiv[4];
   int i;
 
-  in = (unsigned int *)src;
-  out = (unsigned int *)dst;
-  tiv = (unsigned int *)iv;
-
-  tmp[0] = in[0];
-  tmp[1] = in[1];
-  tmp[2] = in[2];
-  tmp[3] = in[3];
-  rc6_decrypt((RC6Context *)context, in, out);
-  out[0] ^= tiv[0];
-  out[1] ^= tiv[1];
-  out[2] ^= tiv[2];
-  out[3] ^= tiv[3];
-  in += 4;
-  out += 4;
+  SILC_CBC_GET_IV(tiv, iv);
+
+  SILC_CBC_DEC_PRE(tmp, src);
+  rc6_decrypt((RC6Context *)context, tmp, tmp2);
+  SILC_CBC_DEC_POST(tmp2, dst, src, tmp, tiv);
 
   for (i = 16; i < len; i += 16) {
-    tmp2[0] = tmp[0];
-    tmp2[1] = tmp[1];
-    tmp2[2] = tmp[2];
-    tmp2[3] = tmp[3];
-    tmp[0] = in[0];
-    tmp[1] = in[1];
-    tmp[2] = in[2];
-    tmp[3] = in[3];
-    rc6_decrypt((RC6Context *)context, in, out);
-    out[0] ^= tmp2[0];
-    out[1] ^= tmp2[1];
-    out[2] ^= tmp2[2];
-    out[3] ^= tmp2[3];
-    in += 4;
-    out += 4;
+    SILC_CBC_DEC_PRE(tmp, src);
+    rc6_decrypt((RC6Context *)context, tmp, tmp2);
+    SILC_CBC_DEC_POST(tmp2, dst, src, tmp, tiv);
   }
-
-  tiv[0] = tmp[0];
-  tiv[1] = tmp[1];
-  tiv[2] = tmp[2];
-  tiv[3] = tmp[3];
+  
+  SILC_CBC_PUT_IV(tiv, iv);
 
   return TRUE;
 }
@@ -187,7 +152,7 @@ u4byte *rc6_set_key(RC6Context *ctx,
 
         l[k] = in_key[k];
 
-    t = (key_len / 32) - 1; // t = (key_len / 32);
+    t = (key_len / 32) - 1; /* t = (key_len / 32); */
 
     a = b = i = j = 0;
 
@@ -195,8 +160,8 @@ u4byte *rc6_set_key(RC6Context *ctx,
     {   a = rotl(l_key[i] + a + b, 3); b += a;
         b = rotl(l[j] + b, b);
         l_key[i] = a; l[j] = b;
-        i = (i == 43 ? 0 : i + 1); // i = (i + 1) % 44;  
-        j = (j == t ? 0 : j + 1);  // j = (j + 1) % t;
+        i = (i == 43 ? 0 : i + 1); /* i = (i + 1) % 44; */
+        j = (j == t ? 0 : j + 1);  /* j = (j + 1) % t; */
     }
 
     return l_key;