Drop md5/md4/rc4 reference and use EVP_ interface

This commit is contained in:
Love Hornquist Astrand
2009-08-11 11:30:04 +02:00
parent 33fcc11b3f
commit 55c9d66d80

View File

@@ -910,7 +910,7 @@ int
heim_ntlm_nt_key(const char *password, struct ntlm_buf *key) heim_ntlm_nt_key(const char *password, struct ntlm_buf *key)
{ {
struct ntlm_buf buf; struct ntlm_buf buf;
MD4_CTX ctx; EVP_MD_CTX *m;
int ret; int ret;
key->data = malloc(MD5_DIGEST_LENGTH); key->data = malloc(MD5_DIGEST_LENGTH);
@@ -923,9 +923,19 @@ heim_ntlm_nt_key(const char *password, struct ntlm_buf *key)
heim_ntlm_free_buf(key); heim_ntlm_free_buf(key);
return ret; return ret;
} }
MD4_Init(&ctx);
MD4_Update(&ctx, buf.data, buf.length); m = EVP_MD_CTX_create();
MD4_Final(key->data, &ctx); if (m == NULL) {
heim_ntlm_free_buf(key);
heim_ntlm_free_buf(&buf);
return ENOMEM;
}
EVP_DigestInit_ex(m, EVP_md4(), NULL);
EVP_DigestUpdate(m, buf.data, buf.length);
EVP_DigestFinal_ex(m, key->data, NULL);
EVP_MD_CTX_destroy(m);
heim_ntlm_free_buf(&buf); heim_ntlm_free_buf(&buf);
return 0; return 0;
} }
@@ -988,7 +998,7 @@ heim_ntlm_build_ntlm1_master(void *key, size_t len,
struct ntlm_buf *session, struct ntlm_buf *session,
struct ntlm_buf *master) struct ntlm_buf *master)
{ {
RC4_KEY rc4; EVP_CIPHER_CTX c;
memset(master, 0, sizeof(*master)); memset(master, 0, sizeof(*master));
memset(session, 0, sizeof(*session)); memset(session, 0, sizeof(*session));
@@ -1010,25 +1020,42 @@ heim_ntlm_build_ntlm1_master(void *key, size_t len,
return EINVAL; return EINVAL;
} }
EVP_CIPHER_CTX_init(&c);
{ {
unsigned char sessionkey[MD4_DIGEST_LENGTH]; unsigned char sessionkey[MD4_DIGEST_LENGTH];
MD4_CTX ctx; EVP_MD_CTX *m;
MD4_Init(&ctx); m = EVP_MD_CTX_create();
MD4_Update(&ctx, key, len); if (m == NULL) {
MD4_Final(sessionkey, &ctx); EVP_CIPHER_CTX_cleanup(&c);
heim_ntlm_free_buf(master);
heim_ntlm_free_buf(session);
return ENOMEM;
}
RC4_set_key(&rc4, sizeof(sessionkey), sessionkey); EVP_DigestInit_ex(m, EVP_md4(), NULL);
EVP_DigestUpdate(m, key, len);
EVP_DigestFinal_ex(m, sessionkey, NULL);
EVP_MD_CTX_destroy(m);
if (EVP_CipherInit_ex(&c, EVP_rc4(), NULL, sessionkey, NULL, 1) != 1) {
EVP_CIPHER_CTX_cleanup(&c);
heim_ntlm_free_buf(master);
heim_ntlm_free_buf(session);
return EINVAL;
}
} }
if (RAND_bytes(session->data, session->length) != 1) { if (RAND_bytes(session->data, session->length) != 1) {
EVP_CIPHER_CTX_cleanup(&c);
heim_ntlm_free_buf(master); heim_ntlm_free_buf(master);
heim_ntlm_free_buf(session); heim_ntlm_free_buf(session);
return EINVAL; return EINVAL;
} }
RC4(&rc4, master->length, session->data, master->data); EVP_Cipher(&c, master->data, session->data, master->length);
memset(&rc4, 0, sizeof(rc4)); EVP_CIPHER_CTX_cleanup(&c);
return 0; return 0;
} }
@@ -1349,15 +1376,22 @@ heim_ntlm_calculate_ntlm2_sess(const unsigned char clnt_nonce[8],
{ {
unsigned char ntlm2_sess_hash[MD5_DIGEST_LENGTH]; unsigned char ntlm2_sess_hash[MD5_DIGEST_LENGTH];
unsigned char res[21], *resp; unsigned char res[21], *resp;
MD5_CTX md5; EVP_MD_CTX *m;
m = EVP_MD_CTX_create();
if (m == NULL)
return ENOMEM;
lm->data = malloc(24); lm->data = malloc(24);
if (lm->data == NULL) if (lm->data == NULL) {
EVP_MD_CTX_destroy(m);
return ENOMEM; return ENOMEM;
}
lm->length = 24; lm->length = 24;
ntlm->data = malloc(24); ntlm->data = malloc(24);
if (ntlm->data == NULL) { if (ntlm->data == NULL) {
EVP_MD_CTX_destroy(m);
free(lm->data); free(lm->data);
lm->data = NULL; lm->data = NULL;
return ENOMEM; return ENOMEM;
@@ -1368,10 +1402,11 @@ heim_ntlm_calculate_ntlm2_sess(const unsigned char clnt_nonce[8],
memset(lm->data, 0, 24); memset(lm->data, 0, 24);
memcpy(lm->data, clnt_nonce, 8); memcpy(lm->data, clnt_nonce, 8);
MD5_Init(&md5); EVP_DigestInit_ex(m, EVP_md5(), NULL);
MD5_Update(&md5, svr_chal, 8); /* session nonce part 1 */ EVP_DigestUpdate(m, svr_chal, 8); /* session nonce part 1 */
MD5_Update(&md5, clnt_nonce, 8); /* session nonce part 2 */ EVP_DigestUpdate(m, clnt_nonce, 8); /* session nonce part 2 */
MD5_Final(ntlm2_sess_hash, &md5); /* will only use first 8 bytes */ EVP_DigestFinal_ex(m, ntlm2_sess_hash, NULL); /* will only use first 8 bytes */
EVP_MD_CTX_destroy(m);
memset(res, 0, sizeof(res)); memset(res, 0, sizeof(res));
memcpy(res, ntlm_hash, 16); memcpy(res, ntlm_hash, 16);