Return to blowfish_crypter.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libstrongswan / plugins / blowfish |
1.1 misho 1: /* 2: * Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3: * 4: * This package is an SSL implementation written 5: * by Eric Young (eay@cryptsoft.com). 6: * The implementation was written so as to conform with Netscapes SSL. 7: * 8: * This library is free for commercial and non-commercial use as long as 9: * the following conditions are adhered to. The following conditions 10: * apply to all code found in this distribution, be it the RC4, RSA, 11: * lhash, DES, etc., code; not just the SSL code. The SSL documentation 12: * included with this distribution is covered by the same copyright terms 13: * except that the holder is Tim Hudson (tjh@cryptsoft.com). 14: * 15: * Copyright remains Eric Young's, and as such any Copyright notices in 16: * the code are not to be removed. 17: * If this package is used in a product, Eric Young should be given attribution 18: * as the author of the parts of the library used. 19: * This can be in the form of a textual message at program startup or 20: * in documentation (online or textual) provided with the package. 21: * 22: * Redistribution and use in source and binary forms, with or without 23: * modification, are permitted provided that the following conditions 24: * are met: 25: * 1. Redistributions of source code must retain the copyright 26: * notice, this list of conditions and the following disclaimer. 27: * 2. Redistributions in binary form must reproduce the above copyright 28: * notice, this list of conditions and the following disclaimer in the 29: * documentation and/or other materials provided with the distribution. 30: * 3. All advertising materials mentioning features or use of this software 31: * must display the following acknowledgement: 32: * "This product includes cryptographic software written by 33: * Eric Young (eay@cryptsoft.com)" 34: * The word 'cryptographic' can be left out if the routines from the library 35: * being used are not cryptographic related :-). 36: * 4. If you include any Windows specific code (or a derivative thereof) from 37: * the apps directory (application code) you must include an acknowledgement: 38: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 39: * 40: * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 41: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 44: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 45: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 46: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 48: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50: * SUCH DAMAGE. 51: * 52: * The licence and distribution terms for any publicly available version or 53: * derivative of this code cannot be changed. i.e. this code cannot simply be 54: * copied and put under another distribution licence 55: * [including the GNU Public Licence.] 56: */ 57: 58: #include "blowfish.h" 59: 60: /* Blowfish as implemented from 'Blowfish: Springer-Verlag paper' 61: * (From LECTURE NOTES IN COMPUTER SCIENCE 809, FAST SOFTWARE ENCRYPTION, 62: * CAMBRIDGE SECURITY WORKSHOP, CAMBRIDGE, U.K., DECEMBER 9-11, 1993) 63: */ 64: 65: #include "blowfish_crypter.h" 66: 67: typedef struct private_blowfish_crypter_t private_blowfish_crypter_t; 68: 69: /** 70: * Class implementing the Blowfish symmetric encryption algorithm. 71: */ 72: struct private_blowfish_crypter_t { 73: 74: /** 75: * Public part of this class. 76: */ 77: blowfish_crypter_t public; 78: 79: /** 80: * Blowfish key schedule 81: */ 82: BF_KEY schedule; 83: 84: /** 85: * Key size of this Blowfish cipher object. 86: */ 87: uint32_t key_size; 88: }; 89: 90: METHOD(crypter_t, decrypt, bool, 91: private_blowfish_crypter_t *this, chunk_t data, chunk_t iv, 92: chunk_t *decrypted) 93: { 94: uint8_t *in, *out; 95: 96: if (decrypted) 97: { 98: *decrypted = chunk_alloc(data.len); 99: out = decrypted->ptr; 100: } 101: else 102: { 103: out = data.ptr; 104: } 105: in = data.ptr; 106: iv = chunk_clone(iv); 107: 108: BF_cbc_encrypt(in, out, data.len, &this->schedule, iv.ptr, 0); 109: 110: free(iv.ptr); 111: 112: return TRUE; 113: } 114: 115: METHOD(crypter_t, encrypt, bool, 116: private_blowfish_crypter_t *this, chunk_t data, chunk_t iv, 117: chunk_t *encrypted) 118: { 119: uint8_t *in, *out; 120: 121: if (encrypted) 122: { 123: *encrypted = chunk_alloc(data.len); 124: out = encrypted->ptr; 125: } 126: else 127: { 128: out = data.ptr; 129: } 130: in = data.ptr; 131: iv = chunk_clone(iv); 132: 133: BF_cbc_encrypt(in, out, data.len, &this->schedule, iv.ptr, 1); 134: 135: free(iv.ptr); 136: 137: return TRUE; 138: } 139: 140: METHOD(crypter_t, get_block_size, size_t, 141: private_blowfish_crypter_t *this) 142: { 143: return BLOWFISH_BLOCK_SIZE; 144: } 145: 146: METHOD(crypter_t, get_iv_size, size_t, 147: private_blowfish_crypter_t *this) 148: { 149: return BLOWFISH_BLOCK_SIZE; 150: } 151: 152: METHOD(crypter_t, get_key_size, size_t, 153: private_blowfish_crypter_t *this) 154: { 155: return this->key_size; 156: } 157: 158: METHOD(crypter_t, set_key, bool, 159: private_blowfish_crypter_t *this, chunk_t key) 160: { 161: BF_set_key(&this->schedule, key.len , key.ptr); 162: return TRUE; 163: } 164: 165: METHOD(crypter_t, destroy, void, 166: private_blowfish_crypter_t *this) 167: { 168: memwipe(this, sizeof(*this)); 169: free(this); 170: } 171: 172: /* 173: * Described in header 174: */ 175: blowfish_crypter_t *blowfish_crypter_create(encryption_algorithm_t algo, 176: size_t key_size) 177: { 178: private_blowfish_crypter_t *this; 179: 180: if (algo != ENCR_BLOWFISH) 181: { 182: return NULL; 183: } 184: 185: INIT(this, 186: .public = { 187: .crypter = { 188: .encrypt = _encrypt, 189: .decrypt = _decrypt, 190: .get_block_size = _get_block_size, 191: .get_iv_size = _get_iv_size, 192: .get_key_size = _get_key_size, 193: .set_key = _set_key, 194: .destroy = _destroy, 195: }, 196: }, 197: .key_size = key_size ?: 16, 198: ); 199: 200: return &this->public; 201: }