static BOOL test_crypto_hash_md5(void) { BYTE hash[WINPR_MD5_DIGEST_LENGTH]; WINPR_MD5_CTX ctx; if (!winpr_MD5_Init(&ctx)) return FALSE; if (!winpr_MD5_Update(&ctx, (BYTE*) TEST_MD5_DATA, strlen(TEST_MD5_DATA))) return FALSE; if (!winpr_MD5_Final(&ctx, hash, sizeof(hash))) return FALSE; if (memcmp(hash, TEST_MD5_HASH, WINPR_MD5_DIGEST_LENGTH) != 0) { char* actual; char* expected; actual = winpr_BinToHexString(hash, WINPR_MD5_DIGEST_LENGTH, FALSE); expected = winpr_BinToHexString(TEST_MD5_HASH, WINPR_MD5_DIGEST_LENGTH, FALSE); fprintf(stderr, "unexpected MD5 hash: Actual: %s Expected: %s\n", actual, expected); free(actual); free(expected); return FALSE; } return TRUE; }
void winpr_MD5(const BYTE* input, size_t ilen, BYTE* output) { WINPR_MD5_CTX ctx; winpr_MD5_Init(&ctx); winpr_MD5_Update(&ctx, input, ilen); winpr_MD5_Final(&ctx, output); }
int ntlm_generate_sealing_key(BYTE* exported_session_key, PSecBuffer seal_magic, BYTE* sealing_key) { BYTE* p; WINPR_MD5_CTX md5; SecBuffer buffer; if (!sspi_SecBufferAlloc(&buffer, WINPR_MD5_DIGEST_LENGTH + seal_magic->cbBuffer)) return -1; p = (BYTE*) buffer.pvBuffer; /* Concatenate ExportedSessionKey with seal magic */ CopyMemory(p, exported_session_key, WINPR_MD5_DIGEST_LENGTH); CopyMemory(&p[WINPR_MD5_DIGEST_LENGTH], seal_magic->pvBuffer, seal_magic->cbBuffer); winpr_MD5_Init(&md5); winpr_MD5_Update(&md5, buffer.pvBuffer, buffer.cbBuffer); winpr_MD5_Final(&md5, sealing_key, WINPR_MD5_DIGEST_LENGTH); sspi_SecBufferFree(&buffer); return 1; }
int ntlm_generate_signing_key(BYTE* exported_session_key, PSecBuffer sign_magic, BYTE* signing_key) { int length; BYTE* value; WINPR_MD5_CTX md5; length = WINPR_MD5_DIGEST_LENGTH + sign_magic->cbBuffer; value = (BYTE*) malloc(length); if (!value) return -1; /* Concatenate ExportedSessionKey with sign magic */ CopyMemory(value, exported_session_key, WINPR_MD5_DIGEST_LENGTH); CopyMemory(&value[WINPR_MD5_DIGEST_LENGTH], sign_magic->pvBuffer, sign_magic->cbBuffer); winpr_MD5_Init(&md5); winpr_MD5_Update(&md5, value, length); winpr_MD5_Final(&md5, signing_key, WINPR_MD5_DIGEST_LENGTH); free(value); return 1; }