\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
}\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
}\r
\r
return l_key;\r
-};\r
+}\r
\r
/* encrypt a block of text */\r
\r
\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
\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