1/* 2 * Copyright (c) 2006 - 2008 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#define HC_DEPRECATED 37 38#include <sys/types.h> 39#include <stdio.h> 40#include <stdlib.h> 41#include <string.h> 42#include <assert.h> 43 44#include <evp.h> 45 46#include <krb5-types.h> 47 48#include <aes.h> 49 50/* 51 * 52 */ 53 54static int 55aes_init(EVP_CIPHER_CTX *ctx, 56 const unsigned char * key, 57 const unsigned char * iv, 58 int encp) 59{ 60 AES_KEY *k = ctx->cipher_data; 61 if (ctx->encrypt) 62 AES_set_encrypt_key(key, ctx->cipher->key_len * 8, k); 63 else 64 AES_set_decrypt_key(key, ctx->cipher->key_len * 8, k); 65 return 1; 66} 67 68static int 69aes_do_cipher(EVP_CIPHER_CTX *ctx, 70 unsigned char *out, 71 const unsigned char *in, 72 unsigned int size) 73{ 74 AES_KEY *k = ctx->cipher_data; 75 AES_cbc_encrypt(in, out, size, k, ctx->iv, ctx->encrypt); 76 return 1; 77} 78 79static int 80aes_cleanup(EVP_CIPHER_CTX *ctx) 81{ 82 memset(ctx->cipher_data, 0, sizeof(AES_KEY)); 83 return 1; 84} 85 86/** 87 * The AES-128 cipher type (hcrypto) 88 * 89 * @return the AES-128 EVP_CIPHER pointer. 90 * 91 * @ingroup hcrypto_evp 92 */ 93 94const EVP_CIPHER * 95EVP_hcrypto_aes_128_cbc(void) 96{ 97 static const EVP_CIPHER aes_128_cbc = { 98 0, 99 16, 100 16, 101 16, 102 EVP_CIPH_CBC_MODE, 103 aes_init, 104 aes_do_cipher, 105 aes_cleanup, 106 sizeof(AES_KEY), 107 NULL, 108 NULL, 109 NULL, 110 NULL 111 }; 112 113 return &aes_128_cbc; 114} 115 116/** 117 * The AES-192 cipher type (hcrypto) 118 * 119 * @return the AES-192 EVP_CIPHER pointer. 120 * 121 * @ingroup hcrypto_evp 122 */ 123 124const EVP_CIPHER * 125EVP_hcrypto_aes_192_cbc(void) 126{ 127 static const EVP_CIPHER aes_192_cbc = { 128 0, 129 16, 130 24, 131 16, 132 EVP_CIPH_CBC_MODE, 133 aes_init, 134 aes_do_cipher, 135 aes_cleanup, 136 sizeof(AES_KEY), 137 NULL, 138 NULL, 139 NULL, 140 NULL 141 }; 142 return &aes_192_cbc; 143} 144 145/** 146 * The AES-256 cipher type (hcrypto) 147 * 148 * @return the AES-256 EVP_CIPHER pointer. 149 * 150 * @ingroup hcrypto_evp 151 */ 152 153const EVP_CIPHER * 154EVP_hcrypto_aes_256_cbc(void) 155{ 156 static const EVP_CIPHER aes_256_cbc = { 157 0, 158 16, 159 32, 160 16, 161 EVP_CIPH_CBC_MODE, 162 aes_init, 163 aes_do_cipher, 164 aes_cleanup, 165 sizeof(AES_KEY), 166 NULL, 167 NULL, 168 NULL, 169 NULL 170 }; 171 return &aes_256_cbc; 172} 173