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