X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilccrypt%2Frc6.c;h=2ca7c83cecdecd7a70d24552d894c5eb4e7cceb8;hp=e2cc97cc5b4fb794d362d4755316ace3d45fedc3;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hpb=62f89b2886bbe9df82d9b2fdabfe707509d9e0fc diff --git a/lib/silccrypt/rc6.c b/lib/silccrypt/rc6.c index e2cc97cc..2ca7c83c 100644 --- a/lib/silccrypt/rc6.c +++ b/lib/silccrypt/rc6.c @@ -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;