client / server random fix

This commit is contained in:
Jay Sorg
2011-09-13 18:52:10 -07:00
parent 2ac4a5fa96
commit 2e2875966f
4 changed files with 32 additions and 8 deletions

View File

@@ -125,7 +125,7 @@ static boolean rdp_establish_keys(rdpRdp* rdp)
/* encrypt client random */
memset(crypt_client_random, 0, sizeof(crypt_client_random));
memset(client_random, 0x5e, 32);
//crypto_nonce(client_random, 32);
crypto_nonce(client_random, 32);
printf("client random\n");
freerdp_hexdump(client_random, 32);
key_len = rdp->settings->server_cert->cert_info.modulus.length;
@@ -166,6 +166,12 @@ static boolean rdp_establish_keys(rdpRdp* rdp)
rdp->rc4_decrypt_key = crypto_rc4_init(rdp->settings->decrypt_key, rdp->settings->rc4_key_len);
rdp->rc4_encrypt_key = crypto_rc4_init(rdp->settings->encrypt_key, rdp->settings->rc4_key_len);
printf("key_len %d\n", rdp->settings->rc4_key_len);
printf("decrypt_key\n");
freerdp_hexdump(rdp->settings->decrypt_key, rdp->settings->rc4_key_len);
printf("encrypt_key\n");
freerdp_hexdump(rdp->settings->encrypt_key, rdp->settings->rc4_key_len);
rdp->do_crypt = True;
return True;

View File

@@ -40,7 +40,7 @@
#endif
#define EXPONENT_MAX_SIZE 4
#define MODULUS_MAX_SIZE 64
#define MODULUS_MAX_SIZE 256
#include <freerdp/freerdp.h>
#include <freerdp/utils/blob.h>

View File

@@ -798,6 +798,7 @@ boolean gcc_read_server_security_data(STREAM* s, rdpSettings *settings)
freerdp_blob_alloc(&settings->server_random, serverRandomLen);
memcpy(settings->server_random.data, s->p, serverRandomLen);
stream_seek(s, serverRandomLen);
freerdp_hexdump(settings->server_random.data, settings->server_random.length);
}
else
{

View File

@@ -85,10 +85,10 @@ static void security_master_hash(char* input, int length, uint8* master_secret,
void security_session_key_blob(uint8* master_secret, uint8* client_random, uint8* server_random, uint8* output)
{
/* MasterHash = MasterHash('X') + MasterHash('YY') + MasterHash('ZZZ') */
security_master_hash("X", 1, master_secret, client_random, server_random, &output[0]);
security_master_hash("YY", 2, master_secret, client_random, server_random, &output[16]);
security_master_hash("ZZZ", 3, master_secret, client_random, server_random, &output[32]);
/* MasterHash = MasterHash('A') + MasterHash('BB') + MasterHash('CCC') */
security_master_hash("A", 1, master_secret, client_random, server_random, &output[0]);
security_master_hash("BB", 2, master_secret, client_random, server_random, &output[16]);
security_master_hash("CCC", 3, master_secret, client_random, server_random, &output[32]);
}
void security_mac_salt_key(uint8* session_key_blob, uint8* client_random, uint8* server_random, uint8* output)
@@ -177,6 +177,20 @@ void security_mac_signature(uint8* mac_key, int mac_key_length, uint8* data, uin
memcpy(output, md5_digest, 8);
}
static void security_A(uint8* master_secret, uint8* client_random, uint8* server_random, uint8* output)
{
security_premaster_hash("A", 1, master_secret, client_random, server_random, &output[0]);
security_premaster_hash("BB", 2, master_secret, client_random, server_random, &output[16]);
security_premaster_hash("CCC", 3, master_secret, client_random, server_random, &output[32]);
}
static void security_X(uint8* master_secret, uint8* client_random, uint8* server_random, uint8* output)
{
security_premaster_hash("X", 1, master_secret, client_random, server_random, &output[0]);
security_premaster_hash("YY", 2, master_secret, client_random, server_random, &output[16]);
security_premaster_hash("ZZZ", 3, master_secret, client_random, server_random, &output[32]);
}
boolean security_establish_keys(uint8* client_random, rdpSettings* settings)
{
uint8 pre_master_secret[48];
@@ -189,11 +203,14 @@ boolean security_establish_keys(uint8* client_random, rdpSettings* settings)
server_random = settings->server_random.data;
freerdp_hexdump(client_random, 32);
freerdp_hexdump(server_random, 32);
memcpy(pre_master_secret, client_random, 24);
memcpy(pre_master_secret + 24, server_random, 24);
security_master_secret(pre_master_secret, client_random, server_random, master_secret);
security_session_key_blob(master_secret, client_random, server_random, session_key_blob);
security_A(pre_master_secret, client_random, server_random, master_secret);
security_X(master_secret, client_random, server_random, session_key_blob);
memcpy(settings->sign_key, session_key_blob, 16);