CVS: rdesktop licence.c,1.29,1.30 secure.c,1.43,1.44

Matt Chapman <[email protected]>
Newsgroups gmane.network.rdesktop.cvs
Message-ID <[email protected]>
Update of /cvsroot/rdesktop/rdesktop
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29067

Modified Files:
	licence.c secure.c 
Log Message:
Document differences between RDP encryption and SSLv3, and bring some
of the terminology in line with the SSLv3 specification.


Index: licence.c
===================================================================
RCS file: /cvsroot/rdesktop/rdesktop/licence.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -C2 -d -r1.29 -r1.30
*** licence.c	28 Jul 2003 21:41:12 -0000	1.29
--- licence.c	16 May 2004 11:18:20 -0000	1.30
***************
*** 37,54 ****
  /* Generate a session key and RC4 keys, given client and server randoms */
  static void
! licence_generate_keys(uint8 * client_key, uint8 * server_key, uint8 * client_rsa)
  {
! 	uint8 session_key[48];
! 	uint8 temp_hash[48];
  
! 	/* Generate session key - two rounds of sec_hash_48 */
! 	sec_hash_48(temp_hash, client_rsa, client_key, server_key, 65);
! 	sec_hash_48(session_key, temp_hash, server_key, client_key, 65);
  
! 	/* Store first 16 bytes of session key, for generating signatures */
! 	memcpy(g_licence_sign_key, session_key, 16);
  
! 	/* Generate RC4 key */
! 	sec_hash_16(g_licence_key, &session_key[16], client_key, server_key);
  }
  
--- 37,54 ----
  /* Generate a session key and RC4 keys, given client and server randoms */
  static void
! licence_generate_keys(uint8 * client_random, uint8 * server_random, uint8 * pre_master_secret)
  {
! 	uint8 master_secret[48];
! 	uint8 key_block[48];
  
! 	/* Generate master secret and then key material */
! 	sec_hash_48(master_secret, pre_master_secret, client_random, server_random, 'A');
! 	sec_hash_48(key_block,     master_secret,     server_random, client_random, 'A');
  
! 	/* Store first 16 bytes of session key as MAC secret */
! 	memcpy(g_licence_sign_key, key_block, 16);
  
! 	/* Generate RC4 key from next 16 bytes */
! 	sec_hash_16(g_licence_key, &key_block[16], client_random, server_random);
  }
  

Index: secure.c
===================================================================
RCS file: /cvsroot/rdesktop/rdesktop/secure.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -C2 -d -r1.43 -r1.44
*** secure.c	26 Apr 2004 13:48:39 -0000	1.43
--- secure.c	16 May 2004 11:18:20 -0000	1.44
***************
*** 62,67 ****
  
  /*
!  * General purpose 48-byte transformation, using two 32-byte salts (generally,
!  * a client and server salt) and a global salt value used for padding.
   * Both SHA1 and MD5 algorithms are used.
   */
--- 62,76 ----
  
  /*
!  * I believe this is based on SSLv3 with the following differences:
!  *  MAC algorithm (5.2.3.1) uses only 32-bit length in place of seq_num/type/length fields
!  *  MAC algorithm uses SHA1 and MD5 for the two hash functions instead of one or other
!  *  key_block algorithm (6.2.2) uses 'X', 'YY', 'ZZZ' instead of 'A', 'BB', 'CCC'
!  *  key_block partitioning is different (16 bytes each: MAC secret, decrypt key, encrypt key)
!  *  encryption/decryption keys updated every 4096 packets
!  * See http://wp.netscape.com/eng/ssl3/draft302.txt
!  */
! 
! /*
!  * 48-byte transformation used to generate master secret (6.1) and key material (6.2.2).
   * Both SHA1 and MD5 algorithms are used.
   */
***************
*** 94,99 ****
  
  /*
!  * Weaker 16-byte transformation, also using two 32-byte salts, but
!  * only using a single round of MD5.
   */
  void
--- 103,107 ----
  
  /*
!  * 16-byte transformation used to generate export keys (6.2.2).
   */
  void
***************
*** 118,143 ****
  }
  
! /* Generate a session key and RC4 keys, given client and server randoms */
  static void
! sec_generate_keys(uint8 * client_key, uint8 * server_key, int rc4_key_size)
  {
! 	uint8 session_key[48];
! 	uint8 temp_hash[48];
! 	uint8 input[48];
  
! 	/* Construct input data to hash */
! 	memcpy(input, client_key, 24);
! 	memcpy(input + 24, server_key, 24);
  
! 	/* Generate session key - two rounds of sec_hash_48 */
! 	sec_hash_48(temp_hash, input, client_key, server_key, 65);
! 	sec_hash_48(session_key, temp_hash, client_key, server_key, 88);
  
! 	/* Store first 16 bytes of session key, for generating signatures */
! 	memcpy(sec_sign_key, session_key, 16);
  
! 	/* Generate RC4 keys */
! 	sec_hash_16(sec_decrypt_key, &session_key[16], client_key, server_key);
! 	sec_hash_16(sec_encrypt_key, &session_key[32], client_key, server_key);
  
  	if (rc4_key_size == 1)
--- 126,151 ----
  }
  
! /* Generate encryption keys given client and server randoms */
  static void
! sec_generate_keys(uint8 * client_random, uint8 * server_random, int rc4_key_size)
  {
! 	uint8 pre_master_secret[48];
! 	uint8 master_secret[48];
! 	uint8 key_block[48];
  
! 	/* Construct pre-master secret */
! 	memcpy(pre_master_secret,      client_random, 24);
! 	memcpy(pre_master_secret + 24, server_random, 24);
  
! 	/* Generate master secret and then key material */
! 	sec_hash_48(master_secret, pre_master_secret, client_random, server_random, 'A');
! 	sec_hash_48(key_block,     master_secret,     client_random, server_random, 'X');
  
! 	/* First 16 bytes of key material is MAC secret */
! 	memcpy(sec_sign_key, key_block, 16);
  
! 	/* Generate export keys from next two blocks of 16 bytes */
! 	sec_hash_16(sec_decrypt_key, &key_block[16], client_random, server_random);
! 	sec_hash_16(sec_encrypt_key, &key_block[32], client_random, server_random);
  
  	if (rc4_key_size == 1)
***************
*** 188,192 ****
  }
  
! /* Generate a signature hash, using a combination of SHA1 and MD5 */
  void
  sec_sign(uint8 * signature, int siglen, uint8 * session_key, int keylen, uint8 * data, int datalen)
--- 196,200 ----
  }
  
! /* Generate a MAC hash (5.2.3.1), using a combination of SHA1 and MD5 */
  void
  sec_sign(uint8 * signature, int siglen, uint8 * session_key, int keylen, uint8 * data, int datalen)
***************
*** 216,220 ****
  }
  
! /* Update an encryption key - similar to the signing process */
  static void
  sec_update(uint8 * key, uint8 * update_key)
--- 224,228 ----
  }
  
! /* Update an encryption key */
  static void
  sec_update(uint8 * key, uint8 * update_key)



-------------------------------------------------------
This SF.Net email is sponsored by: SourceForge.net Broadband
Sign-up now for SourceForge Broadband and get the fastest
6.0/768 connection for only $19.95/mo for the first 3 months!
http://ads.osdn.com/?ad_id=2562&alloc_id=6184&op=click
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.