bool SMBNTLMv2encrypt_hash(TALLOC_CTX *mem_ctx, const char *user, const char *domain, const uint8_t nt_hash[16], const DATA_BLOB *server_chal, const DATA_BLOB *names_blob, DATA_BLOB *lm_response, DATA_BLOB *nt_response, DATA_BLOB *lm_session_key, DATA_BLOB *user_session_key) { uint8_t ntlm_v2_hash[16]; /* We don't use the NT# directly. Instead we use it mashed up with the username and domain. This prevents username swapping during the auth exchange */ if (!ntv2_owf_gen(nt_hash, user, domain, ntlm_v2_hash)) { return false; } if (nt_response) { *nt_response = NTLMv2_generate_response(mem_ctx, ntlm_v2_hash, server_chal, names_blob); if (user_session_key) { *user_session_key = data_blob_talloc(mem_ctx, NULL, 16); /* The NTLMv2 calculations also provide a session key, for signing etc later */ /* use only the first 16 bytes of nt_response for session key */ SMBsesskeygen_ntv2(ntlm_v2_hash, nt_response->data, user_session_key->data); } } /* LMv2 */ if (lm_response) { *lm_response = LMv2_generate_response(mem_ctx, ntlm_v2_hash, server_chal); if (lm_session_key) { *lm_session_key = data_blob_talloc(mem_ctx, NULL, 16); /* The NTLMv2 calculations also provide a session key, for signing etc later */ /* use only the first 16 bytes of lm_response for session key */ SMBsesskeygen_ntv2(ntlm_v2_hash, lm_response->data, lm_session_key->data); } } return true; }
BOOL SMBNTLMv2encrypt(const char *user, const char *domain, const char *password, const DATA_BLOB *server_chal, const DATA_BLOB *names_blob, DATA_BLOB *lm_response, DATA_BLOB *nt_response, DATA_BLOB *user_session_key) { uchar nt_hash[16]; uchar ntlm_v2_hash[16]; E_md4hash(password, nt_hash); /* We don't use the NT# directly. Instead we use it mashed up with the username and domain. This prevents username swapping during the auth exchange */ if (!ntv2_owf_gen(nt_hash, user, domain, True, ntlm_v2_hash)) { return False; } if (nt_response) { *nt_response = NTLMv2_generate_response(ntlm_v2_hash, server_chal, names_blob); if (user_session_key) { *user_session_key = data_blob(NULL, 16); /* The NTLMv2 calculations also provide a session key, for signing etc later */ /* use only the first 16 bytes of nt_response for session key */ SMBsesskeygen_ntv2(ntlm_v2_hash, nt_response->data, user_session_key->data); } } /* LMv2 */ if (lm_response) { *lm_response = LMv2_generate_response(ntlm_v2_hash, server_chal); } return True; }