From 10483c353c0eaddd0189be3387823e5649717c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Tue, 19 Dec 2006 15:33:17 +0000 Subject: [PATCH] (heim_ntlm_build_ntlm1_master): return session master key. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@19442 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/ntlm/ntlm.c | 53 +++++++++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/lib/ntlm/ntlm.c b/lib/ntlm/ntlm.c index f690dd91c..4e13889da 100644 --- a/lib/ntlm/ntlm.c +++ b/lib/ntlm/ntlm.c @@ -768,38 +768,53 @@ heim_ntlm_calculate_ntlm1(void *key, size_t len, int heim_ntlm_build_ntlm1_master(void *key, size_t len, + struct ntlm_buf *session, struct ntlm_buf *master) { - unsigned char sessionkey[MD4_DIGEST_LENGTH]; - unsigned char masterkey[MD4_DIGEST_LENGTH]; - MD4_CTX ctx; RC4_KEY rc4; if (len != MD4_DIGEST_LENGTH) return EINVAL; + session->length = MD4_DIGEST_LENGTH; + session->data = malloc(session->length); + if (session->data == NULL) + goto out; + master->length = MD4_DIGEST_LENGTH; master->data = malloc(master->length); - if (master->data == NULL) - return ENOMEM; - - MD4_Init(&ctx); - MD4_Update(&ctx, key, len); - MD4_Final(sessionkey, &ctx); - - RC4_set_key(&rc4, sizeof(sessionkey), sessionkey); - - if (RAND_bytes(masterkey, sizeof(masterkey)) != 1) { - free(master->data); - master->data = NULL; - master->length = 0; - return EINVAL; + if (master->data == NULL) { + free(session->data); + goto out; } - - RC4(&rc4, master->length, masterkey, master->data); + + { + unsigned char sessionkey[MD4_DIGEST_LENGTH]; + MD4_CTX ctx; + + MD4_Init(&ctx); + MD4_Update(&ctx, key, len); + MD4_Final(sessionkey, &ctx); + + RC4_set_key(&rc4, sizeof(sessionkey), sessionkey); + } + + if (RAND_bytes(session->data, session->length) != 1) { + free(master->data); + free(session->data); + goto out; + } + + RC4(&rc4, master->length, session->data, master->data); memset(&rc4, 0, sizeof(rc4)); return 0; +out: + master->data = NULL; + master->length = 0; + session->data = NULL; + session->length = 0; + return EINVAL; }