Support for stream ciphers added

This commit is contained in:
Simon Rozman 2016-08-15 19:04:56 +02:00
parent c8cfe4da42
commit 67fe27f6fd

View File

@ -836,6 +836,7 @@ void eap::method_tls::derive_keys()
m_key_server = create_key(m_state.m_alg_encrypt, key_exp1, _key_block, m_state.m_size_enc_key);
_key_block += m_state.m_size_enc_key;
if (m_state.m_size_enc_iv) {
// client_write_IV
if (!CryptSetKeyParam(m_key_client, KP_IV, _key_block, 0))
throw win_runtime_error(__FUNCTION__ " Error setting client_write_IV.");
@ -846,6 +847,7 @@ void eap::method_tls::derive_keys()
throw win_runtime_error(__FUNCTION__ " Error setting server_write_IV.");
_key_block += m_state.m_size_enc_iv;
}
}
void eap::method_tls::derive_msk()
@ -1239,10 +1241,13 @@ void eap::method_tls::encrypt_message(_In_ const message_header *hdr, _Inout_ sa
size_t size_data_enc =
size_data + // TLS message
hmac.size() + // HMAC hash
1; // Padding length
hmac.size(); // HMAC hash
if (m_state.m_size_enc_block) {
// Block cypher
// Calculate padding.
size_data_enc += 1; // Padding length
unsigned char size_padding = (unsigned char)((m_state.m_size_enc_block - size_data_enc) % m_state.m_size_enc_block);
size_data_enc += size_padding;
@ -1250,6 +1255,13 @@ void eap::method_tls::encrypt_message(_In_ const message_header *hdr, _Inout_ sa
data.reserve(size_data_enc);
data.insert(data.end(), hmac.begin(), hmac.end());
data.insert(data.end(), size_padding + 1, size_padding);
} else {
// Stream cipher
// Append HMAC hash.
data.reserve(size_data_enc);
data.insert(data.end(), hmac.begin(), hmac.end());
}
// Encrypt.
assert(size_data_enc < 0xffffffff);
@ -1270,12 +1282,16 @@ void eap::method_tls::decrypt_message(_In_ const message_header *hdr, _Inout_ sa
size_t size = data.size();
if (size) {
size_t size_data = size;
if (m_state.m_size_enc_block) {
// Check padding.
unsigned char padding = data.back();
size_t size_data = size - 1 - padding;
size_data -= padding + 1;
for (size_t i = size_data, i_end = size - 1; i < i_end; i++)
if (data[i] != padding)
throw invalid_argument(__FUNCTION__ " Incorrect message padding.");
}
size_data -= m_state.m_size_mac_hash;