aboutsummaryrefslogtreecommitdiffstats
path: root/src/kdf/tlsv1/prf_tls.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kdf/tlsv1/prf_tls.cpp')
-rw-r--r--src/kdf/tlsv1/prf_tls.cpp40
1 files changed, 28 insertions, 12 deletions
diff --git a/src/kdf/tlsv1/prf_tls.cpp b/src/kdf/tlsv1/prf_tls.cpp
index e035ac85e..8f7063f9f 100644
--- a/src/kdf/tlsv1/prf_tls.cpp
+++ b/src/kdf/tlsv1/prf_tls.cpp
@@ -4,13 +4,29 @@
*************************************************/
#include <botan/prf_tls.h>
-#include <botan/lookup.h>
#include <botan/xor_buf.h>
#include <botan/hmac.h>
+#include <botan/md5.h>
+#include <botan/sha160.h>
namespace Botan {
/*************************************************
+* TLS PRF Constructor and Destructor *
+*************************************************/
+TLS_PRF::TLS_PRF()
+ {
+ hmac_md5 = new HMAC(new MD5);
+ hmac_sha1 = new HMAC(new SHA_160);
+ }
+
+TLS_PRF::~TLS_PRF()
+ {
+ delete hmac_md5;
+ delete hmac_sha1;
+ }
+
+/*************************************************
* TLS PRF *
*************************************************/
SecureVector<byte> TLS_PRF::derive(u32bit key_len,
@@ -23,8 +39,8 @@ SecureVector<byte> TLS_PRF::derive(u32bit key_len,
const byte* S2 = secret + (secret_len - S2_len);
SecureVector<byte> key1, key2;
- key1 = P_hash("MD5", key_len, S1, S1_len, seed, seed_len);
- key2 = P_hash("SHA-1", key_len, S2, S2_len, seed, seed_len);
+ key1 = P_hash(hmac_md5, key_len, S1, S1_len, seed, seed_len);
+ key2 = P_hash(hmac_sha1, key_len, S2, S2_len, seed, seed_len);
xor_buf(key1.begin(), key2.begin(), key2.size());
@@ -34,25 +50,25 @@ SecureVector<byte> TLS_PRF::derive(u32bit key_len,
/*************************************************
* TLS PRF P_hash function *
*************************************************/
-SecureVector<byte> TLS_PRF::P_hash(const std::string& hash, u32bit len,
+SecureVector<byte> TLS_PRF::P_hash(MessageAuthenticationCode* mac,
+ u32bit len,
const byte secret[], u32bit secret_len,
- const byte seed[], u32bit seed_len) const
+ const byte seed[], u32bit seed_len)
{
SecureVector<byte> out;
- HMAC hmac(hash);
- hmac.set_key(secret, secret_len);
+ mac->set_key(secret, secret_len);
SecureVector<byte> A(seed, seed_len);
while(len)
{
- const u32bit this_block_len = std::min(hmac.OUTPUT_LENGTH, len);
+ const u32bit this_block_len = std::min(mac->OUTPUT_LENGTH, len);
- A = hmac.process(A);
+ A = mac->process(A);
- hmac.update(A);
- hmac.update(seed, seed_len);
- SecureVector<byte> block = hmac.final();
+ mac->update(A);
+ mac->update(seed, seed_len);
+ SecureVector<byte> block = mac->final();
out.append(block, this_block_len);
len -= this_block_len;