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