updates.
[silc.git] / lib / silccrypt / cast.c
index 1f066dfffaabf9c7cb33933e550df4506046af28..565159ccda1c25651f7d07ab15b84c0b4787e1e7 100644 (file)
@@ -60,7 +60,98 @@ Mean:          674 cycles =    38.0 mbits/sec
 \r
 #include "silcincludes.h"\r
 #include "cast.h"\r
+\r
+#define io_swap\r
     \r
+/* \r
+ * SILC Crypto API for Cast-256\r
+ */\r
+\r
+/* Sets the key for the cipher. */\r
+\r
+SILC_CIPHER_API_SET_KEY(cast)\r
+{\r
+  uint32 k[8];\r
+\r
+  SILC_GET_WORD_KEY(key, k, keylen);\r
+  cast_set_key((CastContext *)context, k, keylen);\r
+\r
+  return TRUE;\r
+}\r
+\r
+/* Sets the string as a new key for the cipher. The string is first\r
+   hashed and then used as a new key. */\r
+\r
+SILC_CIPHER_API_SET_KEY_WITH_STRING(cast)\r
+{\r
+  /*  unsigned char key[md5_hash_len];\r
+  SilcMarsContext *ctx = (SilcMarsContext *)context;\r
+\r
+  make_md5_hash(string, &key);\r
+  memcpy(&ctx->key, mars_set_key(&key, keylen), keylen);\r
+  memset(&key, 'F', sizeoof(key));\r
+  */\r
+\r
+  return 1;\r
+}\r
+\r
+/* Returns the size of the cipher context. */\r
+\r
+SILC_CIPHER_API_CONTEXT_LEN(cast)\r
+{\r
+  return sizeof(CastContext);\r
+}\r
+\r
+/* Encrypts with the cipher in CBC mode. Source and destination buffers\r
+   maybe one and same. */\r
+\r
+SILC_CIPHER_API_ENCRYPT_CBC(cast)\r
+{\r
+  uint32 tiv[4];\r
+  int i;\r
+\r
+  SILC_CBC_GET_IV(tiv, iv);\r
+\r
+  SILC_CBC_ENC_PRE(tiv, src);\r
+  cast_encrypt((CastContext *)context, tiv, tiv);\r
+  SILC_CBC_ENC_POST(tiv, dst, src);\r
+\r
+  for (i = 16; i < len; i += 16) {\r
+    SILC_CBC_ENC_PRE(tiv, src);\r
+    cast_encrypt((CastContext *)context, tiv, tiv);\r
+    SILC_CBC_ENC_POST(tiv, dst, src);\r
+  }\r
+\r
+  SILC_CBC_PUT_IV(tiv, iv);\r
+\r
+  return TRUE;\r
+}\r
+\r
+/* Decrypts with the cipher in CBC mode. Source and destination buffers\r
+   maybe one and same. */\r
+\r
+SILC_CIPHER_API_DECRYPT_CBC(cast)\r
+{\r
+  uint32 tmp[4], tmp2[4], tiv[4];\r
+  int i;\r
+\r
+  SILC_CBC_GET_IV(tiv, iv);\r
+\r
+  SILC_CBC_DEC_PRE(tmp, src);\r
+  cast_decrypt((CastContext *)context, tmp, tmp2);\r
+  SILC_CBC_DEC_POST(tmp2, dst, src, tmp, tiv);\r
+\r
+  for (i = 16; i < len; i += 16) {\r
+    SILC_CBC_DEC_PRE(tmp, src);\r
+    cast_decrypt((CastContext *)context, tmp, tmp2); \r
+    SILC_CBC_DEC_POST(tmp2, dst, src, tmp, tiv);\r
+  }\r
+  \r
+  SILC_CBC_PUT_IV(tiv, iv);\r
+  \r
+  return TRUE;\r
+}\r
+\r
 u4byte s_box[4][256] = \r
 { {\r
     0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9C004dd3, \r
@@ -244,50 +335,50 @@ u4byte s_box[4][256] =
   }\r
 };\r
 \r
-#define f1(y,x,kr,km)           \\r
-    t  = rotl(km + x, kr);      \\r
-    u  = s_box[0][byte(t,3)];   \\r
-    u ^= s_box[1][byte(t,2)];   \\r
-    u -= s_box[2][byte(t,1)];   \\r
-    u += s_box[3][byte(t,0)];   \\r
+#define f1(y,x,kr,km)                          \\r
+    t  = rotl(km + x, kr);                     \\r
+    u  = s_box[0][byte(t,3)];                  \\r
+    u ^= s_box[1][byte(t,2)];                  \\r
+    u -= s_box[2][byte(t,1)];                  \\r
+    u += s_box[3][byte(t,0)];                  \\r
     y ^= u\r
 \r
-#define f2(y,x,kr,km)           \\r
-    t  = rotl(km ^ x, kr);      \\r
-    u  = s_box[0][byte(t,3)];   \\r
-    u -= s_box[1][byte(t,2)];   \\r
-    u += s_box[2][byte(t,1)];   \\r
-    u ^= s_box[3][byte(t,0)];   \\r
+#define f2(y,x,kr,km)                          \\r
+    t  = rotl(km ^ x, kr);                     \\r
+    u  = s_box[0][byte(t,3)];                  \\r
+    u -= s_box[1][byte(t,2)];                  \\r
+    u += s_box[2][byte(t,1)];                  \\r
+    u ^= s_box[3][byte(t,0)];                  \\r
     y ^= u\r
 \r
-#define f3(y,x,kr,km)           \\r
-    t  = rotl(km - x, kr);      \\r
-    u  = s_box[0][byte(t,3)];   \\r
-    u += s_box[1][byte(t,2)];   \\r
-    u ^= s_box[2][byte(t,1)];   \\r
-    u -= s_box[3][byte(t,0)];   \\r
+#define f3(y,x,kr,km)                          \\r
+    t  = rotl(km - x, kr);                     \\r
+    u  = s_box[0][byte(t,3)];                  \\r
+    u += s_box[1][byte(t,2)];                  \\r
+    u ^= s_box[2][byte(t,1)];                  \\r
+    u -= s_box[3][byte(t,0)];                  \\r
     y ^= u\r
 \r
-#define f_rnd(x,n)                              \\r
-    f1(x[2],x[3],l_key[n],    l_key[n + 4]);    \\r
-    f2(x[1],x[2],l_key[n + 1],l_key[n + 5]);    \\r
-    f3(x[0],x[1],l_key[n + 2],l_key[n + 6]);    \\r
+#define f_rnd(x,n)                             \\r
+    f1(x[2],x[3],l_key[n],    l_key[n + 4]);   \\r
+    f2(x[1],x[2],l_key[n + 1],l_key[n + 5]);   \\r
+    f3(x[0],x[1],l_key[n + 2],l_key[n + 6]);   \\r
     f1(x[3],x[0],l_key[n + 3],l_key[n + 7])\r
 \r
-#define i_rnd(x, n)                             \\r
-    f1(x[3],x[0],l_key[n + 3],l_key[n + 7]);    \\r
-    f3(x[0],x[1],l_key[n + 2],l_key[n + 6]);    \\r
-    f2(x[1],x[2],l_key[n + 1],l_key[n + 5]);    \\r
+#define i_rnd(x, n)                            \\r
+    f1(x[3],x[0],l_key[n + 3],l_key[n + 7]);   \\r
+    f3(x[0],x[1],l_key[n + 2],l_key[n + 6]);   \\r
+    f2(x[1],x[2],l_key[n + 1],l_key[n + 5]);   \\r
     f1(x[2],x[3],l_key[n],    l_key[n + 4])\r
 \r
-#define k_rnd(k,tr,tm)          \\r
-    f1(k[6],k[7],tr[0],tm[0]);  \\r
-    f2(k[5],k[6],tr[1],tm[1]);  \\r
-    f3(k[4],k[5],tr[2],tm[2]);  \\r
-    f1(k[3],k[4],tr[3],tm[3]);  \\r
-    f2(k[2],k[3],tr[4],tm[4]);  \\r
-    f3(k[1],k[2],tr[5],tm[5]);  \\r
-    f1(k[0],k[1],tr[6],tm[6]);  \\r
+#define k_rnd(k,tr,tm)                         \\r
+    f1(k[6],k[7],tr[0],tm[0]);                 \\r
+    f2(k[5],k[6],tr[1],tm[1]);                 \\r
+    f3(k[4],k[5],tr[2],tm[2]);                 \\r
+    f1(k[3],k[4],tr[3],tm[3]);                 \\r
+    f2(k[2],k[3],tr[4],tm[4]);                 \\r
+    f3(k[1],k[2],tr[5],tm[5]);                 \\r
+    f1(k[0],k[1],tr[6],tm[6]);                 \\r
     f2(k[7],k[0],tr[7],tm[7])\r
 \r
 /* initialise the key schedule from the user supplied key   */\r
@@ -333,7 +424,7 @@ u4byte *cast_set_key(CastContext *ctx,
     }\r
 \r
     return l_key;\r
-};\r
+}\r
 \r
 /* encrypt a block of text  */\r
 \r
@@ -355,7 +446,7 @@ void cast_encrypt(CastContext *ctx,
 \r
     out_blk[0] = io_swap(blk[0]); out_blk[1] = io_swap(blk[1]);\r
     out_blk[2] = io_swap(blk[2]); out_blk[3] = io_swap(blk[3]);\r
-};\r
+}\r
 \r
 /* decrypt a block of text  */\r
 \r
@@ -377,5 +468,4 @@ void cast_decrypt(CastContext *ctx,
 \r
     out_blk[0] = io_swap(blk[0]); out_blk[1] = io_swap(blk[1]);\r
     out_blk[2] = io_swap(blk[2]); out_blk[3] = io_swap(blk[3]);\r
-};\r
-\r
+}\r