5 Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
7 Copyright (C) 1999 - 2000 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
23 * Revision 1.2 2001/04/03 19:54:10 priikone
24 * updates. New data types.
26 * Revision 1.1.1.1 2000/06/27 11:36:54 priikone
27 * Importet from internal CVS/Added Log headers.
35 #include "cast_internal.h"
38 * SILC Crypto API for Cast
41 /* Sets the key for the cipher. */
43 inline int silc_cast_init(void *context,
44 const unsigned char *key,
47 cast_set_key((CastContext *)context, (uint32 *)key, keylen);
51 /* Sets the string as a new key for the cipher. The string is first
52 hashed and then used as a new key. */
54 inline int silc_cast_set_string_as_key(void *context,
55 const unsigned char *string,
59 unsigned char key[16];
61 silc_hash_alloc("md5", &hash);
62 hash->make_hash(hash, string, stringlen, key);
64 cast_set_key((CastContext *)context, (const u4byte *)key, sizeof(key));
67 memset(&key, 'F', sizeof(key));
72 /* Returns the size of the cipher context. */
74 inline uint32 silc_cast_context_len()
76 return sizeof(CastContext);
79 /* Encrypts with the cipher in CBC mode. */
81 inline int silc_cast_encrypt_cbc(void *context,
82 const unsigned char *src,
87 uint32 *in, *out, *tiv;
95 tmp[0] = in[0] ^ tiv[0];
96 tmp[1] = in[1] ^ tiv[1];
97 tmp[2] = in[2] ^ tiv[2];
98 tmp[3] = in[3] ^ tiv[3];
99 cast_encrypt((CastContext *)context, tmp, out);
103 for (i = 16; i < len; i += 16) {
104 tmp[0] = in[0] ^ out[0 - 4];
105 tmp[1] = in[1] ^ out[1 - 4];
106 tmp[2] = in[2] ^ out[2 - 4];
107 tmp[3] = in[3] ^ out[3 - 4];
108 cast_encrypt((CastContext *)context, tmp, out);
116 /* Decrypts with the cipher in CBC mode. */
118 inline int silc_cast_decrypt_cbc(void *context,
119 const unsigned char *src,
124 uint32 *in, *out, *tiv;
131 cast_decrypt((CastContext *)context, in, out);
139 for (i = 16; i < len; i += 16) {
140 cast_decrypt((CastContext *)context, in, out);