diff options
| author | Stanislav Sedov <stas@FreeBSD.org> | 2011-10-05 07:23:29 +0000 | 
|---|---|---|
| committer | Stanislav Sedov <stas@FreeBSD.org> | 2011-10-05 07:23:29 +0000 | 
| commit | 7c450da7b446c557e05f34a100b597800967d987 (patch) | |
| tree | 57a48e7e9b592f2d5b713e80a4455820625c2b7b /lib/krb5/crypto-aes.c | |
| parent | b4e3a10e9339a8400197298021d6ca9b8e3aa039 (diff) | |
Diffstat (limited to 'lib/krb5/crypto-aes.c')
| -rw-r--r-- | lib/krb5/crypto-aes.c | 170 | 
1 files changed, 170 insertions, 0 deletions
| diff --git a/lib/krb5/crypto-aes.c b/lib/krb5/crypto-aes.c new file mode 100644 index 000000000000..b97854206ced --- /dev/null +++ b/lib/krb5/crypto-aes.c @@ -0,0 +1,170 @@ +/* + * Copyright (c) 1997 - 2008 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "krb5_locl.h" + +/* + * AES + */ + +static struct _krb5_key_type keytype_aes128 = { +    ENCTYPE_AES128_CTS_HMAC_SHA1_96, +    "aes-128", +    128, +    16, +    sizeof(struct _krb5_evp_schedule), +    NULL, +    _krb5_evp_schedule, +    _krb5_AES_salt, +    NULL, +    _krb5_evp_cleanup, +    EVP_aes_128_cbc +}; + +static struct _krb5_key_type keytype_aes256 = { +    ENCTYPE_AES256_CTS_HMAC_SHA1_96, +    "aes-256", +    256, +    32, +    sizeof(struct _krb5_evp_schedule), +    NULL, +    _krb5_evp_schedule, +    _krb5_AES_salt, +    NULL, +    _krb5_evp_cleanup, +    EVP_aes_256_cbc +}; + +struct _krb5_checksum_type _krb5_checksum_hmac_sha1_aes128 = { +    CKSUMTYPE_HMAC_SHA1_96_AES_128, +    "hmac-sha1-96-aes128", +    64, +    12, +    F_KEYED | F_CPROOF | F_DERIVED, +    _krb5_SP_HMAC_SHA1_checksum, +    NULL +}; + +struct _krb5_checksum_type _krb5_checksum_hmac_sha1_aes256 = { +    CKSUMTYPE_HMAC_SHA1_96_AES_256, +    "hmac-sha1-96-aes256", +    64, +    12, +    F_KEYED | F_CPROOF | F_DERIVED, +    _krb5_SP_HMAC_SHA1_checksum, +    NULL +}; + +static krb5_error_code +AES_PRF(krb5_context context, +	krb5_crypto crypto, +	const krb5_data *in, +	krb5_data *out) +{ +    struct _krb5_checksum_type *ct = crypto->et->checksum; +    krb5_error_code ret; +    Checksum result; +    krb5_keyblock *derived; + +    result.cksumtype = ct->type; +    ret = krb5_data_alloc(&result.checksum, ct->checksumsize); +    if (ret) { +	krb5_set_error_message(context, ret, N_("malloc: out memory", "")); +	return ret; +    } + +    ret = (*ct->checksum)(context, NULL, in->data, in->length, 0, &result); +    if (ret) { +	krb5_data_free(&result.checksum); +	return ret; +    } + +    if (result.checksum.length < crypto->et->blocksize) +	krb5_abortx(context, "internal prf error"); + +    derived = NULL; +    ret = krb5_derive_key(context, crypto->key.key, +			  crypto->et->type, "prf", 3, &derived); +    if (ret) +	krb5_abortx(context, "krb5_derive_key"); + +    ret = krb5_data_alloc(out, crypto->et->blocksize); +    if (ret) +	krb5_abortx(context, "malloc failed"); + +    { +	const EVP_CIPHER *c = (*crypto->et->keytype->evp)(); +	EVP_CIPHER_CTX ctx; + +	EVP_CIPHER_CTX_init(&ctx); /* ivec all zero */ +	EVP_CipherInit_ex(&ctx, c, NULL, derived->keyvalue.data, NULL, 1); +	EVP_Cipher(&ctx, out->data, result.checksum.data, +		   crypto->et->blocksize); +	EVP_CIPHER_CTX_cleanup(&ctx); +    } + +    krb5_data_free(&result.checksum); +    krb5_free_keyblock(context, derived); + +    return ret; +} + +struct _krb5_encryption_type _krb5_enctype_aes128_cts_hmac_sha1 = { +    ETYPE_AES128_CTS_HMAC_SHA1_96, +    "aes128-cts-hmac-sha1-96", +    16, +    1, +    16, +    &keytype_aes128, +    &_krb5_checksum_sha1, +    &_krb5_checksum_hmac_sha1_aes128, +    F_DERIVED, +    _krb5_evp_encrypt_cts, +    16, +    AES_PRF +}; + +struct _krb5_encryption_type _krb5_enctype_aes256_cts_hmac_sha1 = { +    ETYPE_AES256_CTS_HMAC_SHA1_96, +    "aes256-cts-hmac-sha1-96", +    16, +    1, +    16, +    &keytype_aes256, +    &_krb5_checksum_sha1, +    &_krb5_checksum_hmac_sha1_aes256, +    F_DERIVED, +    _krb5_evp_encrypt_cts, +    16, +    AES_PRF +}; | 
