Switch more cases to EVP crypto layer

This commit is contained in:
Love Hornquist Astrand
2009-08-10 17:51:17 +02:00
parent 21e8270aa2
commit 18a4b69b48

View File

@@ -555,15 +555,6 @@ DES3_random_to_key(krb5_context context,
* ARCFOUR
*/
static void
ARCFOUR_schedule(krb5_context context,
struct key_type *kt,
struct key_data *kd)
{
RC4_set_key (kd->schedule->data,
kd->key->keyvalue.length, kd->key->keyvalue.data);
}
static krb5_error_code
ARCFOUR_string_to_key(krb5_context context,
krb5_enctype enctype,
@@ -884,10 +875,13 @@ static struct key_type keytype_arcfour = {
"arcfour",
128,
16,
sizeof(RC4_KEY),
sizeof(struct evp_schedule),
NULL,
ARCFOUR_schedule,
arcfour_salt
evp_schedule,
arcfour_salt,
NULL,
evp_cleanup,
EVP_rc4
};
krb5_error_code KRB5_LIB_FUNCTION
@@ -2149,12 +2143,12 @@ ARCFOUR_subencrypt(krb5_context context,
unsigned usage,
void *ivec)
{
EVP_CIPHER_CTX ctx;
struct checksum_type *c = _find_checksum (CKSUMTYPE_RSA_MD5);
Checksum k1_c, k2_c, k3_c, cksum;
struct key_data ke;
krb5_keyblock kb;
unsigned char t[4];
RC4_KEY rc4_key;
unsigned char *cdata = data;
unsigned char k1_c_data[16], k2_c_data[16], k3_c_data[16];
krb5_error_code ret;
@@ -2196,8 +2190,12 @@ ARCFOUR_subencrypt(krb5_context context,
if (ret)
krb5_abortx(context, "hmac failed");
RC4_set_key (&rc4_key, k3_c.checksum.length, k3_c.checksum.data);
RC4 (&rc4_key, len - 16, cdata + 16, cdata + 16);
EVP_CIPHER_CTX_init(&ctx);
EVP_CipherInit_ex(&ctx, EVP_rc4(), NULL, k3_c.checksum.data, NULL, 1);
EVP_Cipher(&ctx, cdata + 16, cdata + 16, len - 16);
EVP_CIPHER_CTX_cleanup(&ctx);
memset (k1_c_data, 0, sizeof(k1_c_data));
memset (k2_c_data, 0, sizeof(k2_c_data));
memset (k3_c_data, 0, sizeof(k3_c_data));
@@ -2212,12 +2210,12 @@ ARCFOUR_subdecrypt(krb5_context context,
unsigned usage,
void *ivec)
{
EVP_CIPHER_CTX ctx;
struct checksum_type *c = _find_checksum (CKSUMTYPE_RSA_MD5);
Checksum k1_c, k2_c, k3_c, cksum;
struct key_data ke;
krb5_keyblock kb;
unsigned char t[4];
RC4_KEY rc4_key;
unsigned char *cdata = data;
unsigned char k1_c_data[16], k2_c_data[16], k3_c_data[16];
unsigned char cksum_data[16];
@@ -2250,8 +2248,10 @@ ARCFOUR_subdecrypt(krb5_context context,
if (ret)
krb5_abortx(context, "hmac failed");
RC4_set_key (&rc4_key, k3_c.checksum.length, k3_c.checksum.data);
RC4 (&rc4_key, len - 16, cdata + 16, cdata + 16);
EVP_CIPHER_CTX_init(&ctx);
EVP_CipherInit_ex(&ctx, EVP_rc4(), NULL, k3_c.checksum.data, NULL, 0);
EVP_Cipher(&ctx, cdata + 16, cdata + 16, len - 16);
EVP_CIPHER_CTX_cleanup(&ctx);
ke.key = &kb;
kb.keyvalue = k2_c.checksum;
@@ -4444,6 +4444,7 @@ _krb5_pk_octetstring2key(krb5_context context,
void *keydata;
unsigned char counter;
unsigned char shaoutput[SHA_DIGEST_LENGTH];
EVP_MD_CTX *m;
if(et == NULL) {
krb5_set_error_message(context, KRB5_PROG_ETYPE_NOSUPP,
@@ -4459,19 +4460,27 @@ _krb5_pk_octetstring2key(krb5_context context,
return ENOMEM;
}
m = EVP_MD_CTX_create();
if (m == NULL) {
free(keydata);
krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", ""));
return ENOMEM;
}
counter = 0;
offset = 0;
do {
SHA_CTX m;
SHA1_Init(&m);
SHA1_Update(&m, &counter, 1);
SHA1_Update(&m, dhdata, dhsize);
EVP_DigestInit_ex(m, EVP_sha1(), NULL);
EVP_DigestUpdate(m, &counter, 1);
EVP_DigestUpdate(m, dhdata, dhsize);
if (c_n)
SHA1_Update(&m, c_n->data, c_n->length);
EVP_DigestUpdate(m, c_n->data, c_n->length);
if (k_n)
SHA1_Update(&m, k_n->data, k_n->length);
SHA1_Final(shaoutput, &m);
EVP_DigestUpdate(m, k_n->data, k_n->length);
EVP_DigestFinal_ex(m, shaoutput, NULL);
memcpy((unsigned char *)keydata + offset,
shaoutput,
@@ -4482,6 +4491,8 @@ _krb5_pk_octetstring2key(krb5_context context,
} while(offset < keylen);
memset(shaoutput, 0, sizeof(shaoutput));
EVP_MD_CTX_destroy(m);
ret = krb5_random_to_key(context, type, keydata, keylen, key);
memset(keydata, 0, sizeof(keylen));
free(keydata);