5 Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
7 Copyright (C) 1997 - 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.1.1.1 2000/06/27 11:36:54 priikone
24 * Importet from internal CVS/Added Log headers.
32 #include "blowfish_internal.h"
35 * SILC Crypto API for Blowfish
38 /* Sets the key for the cipher. */
40 SILC_CIPHER_API_SET_KEY(blowfish)
42 blowfish_set_key((BlowfishContext *)context,
43 (unsigned char *)key, keylen);
47 /* Sets the string as a new key for the cipher. The string is first
48 hashed and then used as a new key. */
50 SILC_CIPHER_API_SET_KEY_WITH_STRING(blowfish)
53 unsigned char key[16];
55 silc_hash_alloc("md5", &hash);
56 hash->make_hash(hash, string, stringlen, key);
58 blowfish_set_key((BlowfishContext *)context, key, sizeof(key));
61 memset(&key, 'F', sizeof(key));
66 /* Returns the size of the cipher context. */
68 SILC_CIPHER_API_CONTEXT_LEN(blowfish)
70 return sizeof(BlowfishContext);
73 /* Encrypts with the cipher in CBC mode. */
75 SILC_CIPHER_API_ENCRYPT_CBC(blowfish)
77 unsigned int *in, *out, *tiv;
81 in = (unsigned int *)src;
82 out = (unsigned int *)dst;
83 tiv = (unsigned int *)iv;
85 tmp[0] = in[0] ^ tiv[0];
86 tmp[1] = in[1] ^ tiv[1];
87 tmp[2] = in[2] ^ tiv[2];
88 tmp[3] = in[3] ^ tiv[3];
89 blowfish_encrypt((BlowfishContext *)context, tmp, out, 16);
93 for (i = 16; i < len; i += 16) {
94 tmp[0] = in[0] ^ out[0 - 4];
95 tmp[1] = in[1] ^ out[1 - 4];
96 tmp[2] = in[2] ^ out[2 - 4];
97 tmp[3] = in[3] ^ out[3 - 4];
98 blowfish_encrypt((BlowfishContext *)context, tmp, out, 16);
106 /* Decrypts with the cipher in CBC mode. */
108 SILC_CIPHER_API_DECRYPT_CBC(blowfish)
110 unsigned int *in, *out, *tiv;
113 in = (unsigned int *)src;
114 out = (unsigned int *)dst;
115 tiv = (unsigned int *)iv;
117 blowfish_decrypt((BlowfishContext *)context, in, out, 16);
125 for (i = 16; i < len; i += 16) {
126 blowfish_decrypt((BlowfishContext *)context, in, out, 16);