1/* 2 * Copyright (c) 2007 Kungliga Tekniska Högskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of the Institute nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#include "config.h" 35 36#ifdef KRB5 37#include <krb5-types.h> 38#endif 39 40#include <string.h> 41 42#include "camellia-ntt.h" 43#include "camellia.h" 44 45#include <roken.h> 46 47int 48CAMELLIA_set_key(const unsigned char *userkey, 49 const int bits, CAMELLIA_KEY *key) 50{ 51 key->bits = bits; 52 Camellia_Ekeygen(bits, userkey, key->key); 53 return 1; 54} 55 56void 57CAMELLIA_encrypt(const unsigned char *in, unsigned char *out, 58 const CAMELLIA_KEY *key) 59{ 60 Camellia_EncryptBlock(key->bits, in, key->key, out); 61 62} 63 64void 65CAMELLIA_decrypt(const unsigned char *in, unsigned char *out, 66 const CAMELLIA_KEY *key) 67{ 68 Camellia_DecryptBlock(key->bits, in, key->key, out); 69} 70 71void 72CAMELLIA_cbc_encrypt(const unsigned char *in, unsigned char *out, 73 unsigned long size, const CAMELLIA_KEY *key, 74 unsigned char *iv, int mode_encrypt) 75{ 76 unsigned char tmp[CAMELLIA_BLOCK_SIZE]; 77 int i; 78 79 if (mode_encrypt) { 80 while (size >= CAMELLIA_BLOCK_SIZE) { 81 for (i = 0; i < CAMELLIA_BLOCK_SIZE; i++) 82 tmp[i] = in[i] ^ iv[i]; 83 CAMELLIA_encrypt(tmp, out, key); 84 memcpy(iv, out, CAMELLIA_BLOCK_SIZE); 85 size -= CAMELLIA_BLOCK_SIZE; 86 in += CAMELLIA_BLOCK_SIZE; 87 out += CAMELLIA_BLOCK_SIZE; 88 } 89 if (size) { 90 for (i = 0; i < size; i++) 91 tmp[i] = in[i] ^ iv[i]; 92 for (i = size; i < CAMELLIA_BLOCK_SIZE; i++) 93 tmp[i] = iv[i]; 94 CAMELLIA_encrypt(tmp, out, key); 95 memcpy(iv, out, CAMELLIA_BLOCK_SIZE); 96 } 97 } else { 98 while (size >= CAMELLIA_BLOCK_SIZE) { 99 memcpy(tmp, in, CAMELLIA_BLOCK_SIZE); 100 CAMELLIA_decrypt(tmp, out, key); 101 for (i = 0; i < CAMELLIA_BLOCK_SIZE; i++) 102 out[i] ^= iv[i]; 103 memcpy(iv, tmp, CAMELLIA_BLOCK_SIZE); 104 size -= CAMELLIA_BLOCK_SIZE; 105 in += CAMELLIA_BLOCK_SIZE; 106 out += CAMELLIA_BLOCK_SIZE; 107 } 108 if (size) { 109 memcpy(tmp, in, CAMELLIA_BLOCK_SIZE); 110 CAMELLIA_decrypt(tmp, out, key); 111 for (i = 0; i < size; i++) 112 out[i] ^= iv[i]; 113 memcpy(iv, tmp, CAMELLIA_BLOCK_SIZE); 114 } 115 } 116} 117