aboutsummaryrefslogtreecommitdiffstats
path: root/src/tls/tls_session_key.cpp
diff options
context:
space:
mode:
authorlloyd <[email protected]>2012-03-16 17:32:40 +0000
committerlloyd <[email protected]>2012-03-16 17:32:40 +0000
commit1fce3fe2274cf3368e1f29827ed0f41cebba3726 (patch)
tree7a83f1d6d8fcf08dc8120aafba718dd11c1e52b7 /src/tls/tls_session_key.cpp
parent4c6327c95bd01de54487b3159b77a5152ed39564 (diff)
parent7371f7c59ae722769fbc0dc810583a0cd0e38877 (diff)
propagate from branch 'net.randombit.botan.tls-state-machine' (head c24b5d6b012131b177d38bddb8b06d73f81f70c4)
to branch 'net.randombit.botan.tls-session-ticket' (head 9977d4c118e1ac26425cef676ebf26cd5b2a470e)
Diffstat (limited to 'src/tls/tls_session_key.cpp')
-rw-r--r--src/tls/tls_session_key.cpp53
1 files changed, 20 insertions, 33 deletions
diff --git a/src/tls/tls_session_key.cpp b/src/tls/tls_session_key.cpp
index f0ddc4493..edd0617bc 100644
--- a/src/tls/tls_session_key.cpp
+++ b/src/tls/tls_session_key.cpp
@@ -6,43 +6,28 @@
*/
#include <botan/internal/tls_session_key.h>
+#include <botan/internal/tls_handshake_state.h>
+#include <botan/internal/tls_messages.h>
#include <botan/lookup.h>
#include <memory>
namespace Botan {
-namespace {
-
-std::string lookup_prf_name(Version_Code version)
- {
- if(version == SSL_V3)
- return "SSL3-PRF";
- else if(version == TLS_V10 || version == TLS_V11)
- return "TLS-PRF";
- else
- throw Invalid_Argument("SessionKeys: Unknown version code");
- }
-
-}
+namespace TLS {
/**
-* SessionKeys Constructor
+* Session_Keys Constructor
*/
-SessionKeys::SessionKeys(const TLS_Cipher_Suite& suite,
- Version_Code version,
- const MemoryRegion<byte>& pre_master_secret,
- const MemoryRegion<byte>& client_random,
- const MemoryRegion<byte>& server_random,
- bool resuming)
+Session_Keys::Session_Keys(Handshake_State* state,
+ const MemoryRegion<byte>& pre_master_secret,
+ bool resuming)
{
- const std::string prf_name = lookup_prf_name(version);
-
- const size_t mac_keylen = output_length_of(suite.mac_algo());
- const size_t cipher_keylen = suite.cipher_keylen();
+ const size_t mac_keylen = output_length_of(state->suite.mac_algo());
+ const size_t cipher_keylen = state->suite.cipher_keylen();
size_t cipher_ivlen = 0;
- if(have_block_cipher(suite.cipher_algo()))
- cipher_ivlen = block_size_of(suite.cipher_algo());
+ if(have_block_cipher(state->suite.cipher_algo()))
+ cipher_ivlen = block_size_of(state->suite.cipher_algo());
const size_t prf_gen = 2 * (mac_keylen + cipher_keylen + cipher_ivlen);
@@ -52,7 +37,7 @@ SessionKeys::SessionKeys(const TLS_Cipher_Suite& suite,
const byte KEY_GEN_MAGIC[] = {
0x6B, 0x65, 0x79, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6E, 0x73, 0x69, 0x6F, 0x6E };
- std::auto_ptr<KDF> prf(get_kdf(prf_name));
+ std::auto_ptr<KDF> prf(state->protocol_specific_prf());
if(resuming)
{
@@ -62,20 +47,20 @@ SessionKeys::SessionKeys(const TLS_Cipher_Suite& suite,
{
SecureVector<byte> salt;
- if(version != SSL_V3)
+ if(state->version() != Protocol_Version::SSL_V3)
salt += std::make_pair(MASTER_SECRET_MAGIC, sizeof(MASTER_SECRET_MAGIC));
- salt += client_random;
- salt += server_random;
+ salt += state->client_hello->random();
+ salt += state->server_hello->random();
master_sec = prf->derive_key(48, pre_master_secret, salt);
}
SecureVector<byte> salt;
- if(version != SSL_V3)
+ if(state->version() != Protocol_Version::SSL_V3)
salt += std::make_pair(KEY_GEN_MAGIC, sizeof(KEY_GEN_MAGIC));
- salt += server_random;
- salt += client_random;
+ salt += state->server_hello->random();
+ salt += state->client_hello->random();
SymmetricKey keyblock = prf->derive_key(prf_gen, master_sec, salt);
@@ -100,3 +85,5 @@ SessionKeys::SessionKeys(const TLS_Cipher_Suite& suite,
}
}
+
+}