Merge pull request #454 from pjd/fixes
Fix salted checksums after key regeneration.
This commit is contained in:
commit
ed2328e149
@ -136,8 +136,10 @@ struct rdp_rdp
|
|||||||
struct rdp_mppc* mppc;
|
struct rdp_mppc* mppc;
|
||||||
struct crypto_rc4_struct* rc4_decrypt_key;
|
struct crypto_rc4_struct* rc4_decrypt_key;
|
||||||
int decrypt_use_count;
|
int decrypt_use_count;
|
||||||
|
int decrypt_checksum_use_count;
|
||||||
struct crypto_rc4_struct* rc4_encrypt_key;
|
struct crypto_rc4_struct* rc4_encrypt_key;
|
||||||
int encrypt_use_count;
|
int encrypt_use_count;
|
||||||
|
int encrypt_checksum_use_count;
|
||||||
struct crypto_des3_struct* fips_encrypt;
|
struct crypto_des3_struct* fips_encrypt;
|
||||||
struct crypto_des3_struct* fips_decrypt;
|
struct crypto_des3_struct* fips_decrypt;
|
||||||
struct crypto_hmac_struct* fips_hmac;
|
struct crypto_hmac_struct* fips_hmac;
|
||||||
|
@ -262,14 +262,17 @@ void security_salted_mac_signature(rdpRdp *rdp, uint8* data, uint32 length, bool
|
|||||||
|
|
||||||
security_uint32_le(length_le, length); /* length must be little-endian */
|
security_uint32_le(length_le, length); /* length must be little-endian */
|
||||||
if (encryption)
|
if (encryption)
|
||||||
security_uint32_le(use_count_le, rdp->encrypt_use_count);
|
{
|
||||||
|
security_uint32_le(use_count_le, rdp->encrypt_checksum_use_count);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* We calculate checksum on plain text, so we must have already
|
* We calculate checksum on plain text, so we must have already
|
||||||
* decrypt it, which means decrypt_use_count is off by one.
|
* decrypt it, which means decrypt_checksum_use_count is
|
||||||
|
* off by one.
|
||||||
*/
|
*/
|
||||||
security_uint32_le(use_count_le, rdp->decrypt_use_count - 1);
|
security_uint32_le(use_count_le, rdp->decrypt_checksum_use_count - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SHA1_Digest = SHA1(MACKeyN + pad1 + length + data) */
|
/* SHA1_Digest = SHA1(MACKeyN + pad1 + length + data) */
|
||||||
@ -461,7 +464,8 @@ boolean security_encrypt(uint8* data, int length, rdpRdp* rdp)
|
|||||||
rdp->encrypt_use_count = 0;
|
rdp->encrypt_use_count = 0;
|
||||||
}
|
}
|
||||||
crypto_rc4(rdp->rc4_encrypt_key, length, data, data);
|
crypto_rc4(rdp->rc4_encrypt_key, length, data, data);
|
||||||
rdp->encrypt_use_count += 1;
|
rdp->encrypt_use_count++;
|
||||||
|
rdp->encrypt_checksum_use_count++;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -476,6 +480,7 @@ boolean security_decrypt(uint8* data, int length, rdpRdp* rdp)
|
|||||||
}
|
}
|
||||||
crypto_rc4(rdp->rc4_decrypt_key, length, data, data);
|
crypto_rc4(rdp->rc4_decrypt_key, length, data, data);
|
||||||
rdp->decrypt_use_count += 1;
|
rdp->decrypt_use_count += 1;
|
||||||
|
rdp->decrypt_checksum_use_count++;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user