aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/kdf/prf_tls
diff options
context:
space:
mode:
authorlloyd <[email protected]>2015-02-18 04:21:21 +0000
committerlloyd <[email protected]>2015-02-18 04:21:21 +0000
commit88285f51ba4fd5bc1a1cc06b0760b3926046f29b (patch)
tree7443b2b266b8445433b9c63704b7a09e216282f2 /src/lib/kdf/prf_tls
parentaced9e88d970546c6324e768ce11b0a483bd3bd0 (diff)
Modify interfaces of KDF and PBKDF to write output to an array, with
higher level functions on interface handling returning a vector.
Diffstat (limited to 'src/lib/kdf/prf_tls')
-rw-r--r--src/lib/kdf/prf_tls/prf_tls.cpp78
-rw-r--r--src/lib/kdf/prf_tls/prf_tls.h24
2 files changed, 42 insertions, 60 deletions
diff --git a/src/lib/kdf/prf_tls/prf_tls.cpp b/src/lib/kdf/prf_tls/prf_tls.cpp
index f1061fd10..9161dc71e 100644
--- a/src/lib/kdf/prf_tls/prf_tls.cpp
+++ b/src/lib/kdf/prf_tls/prf_tls.cpp
@@ -23,15 +23,21 @@ TLS_12_PRF* TLS_12_PRF::make(const Spec& spec)
BOTAN_REGISTER_NAMED_T(KDF, "TLS-12-PRF", TLS_12_PRF, TLS_12_PRF::make);
BOTAN_REGISTER_KDF_NOARGS(TLS_PRF, "TLS-PRF");
+TLS_PRF::TLS_PRF()
+ {
+ m_hmac_md5.reset(make_a<MessageAuthenticationCode>("HMAC(MD5)"));
+ m_hmac_sha1.reset(make_a<MessageAuthenticationCode>("HMAC(SHA-1)"));
+ }
+
namespace {
/*
* TLS PRF P_hash function
*/
-void P_hash(secure_vector<byte>& output,
+void P_hash(byte out[], size_t out_len,
MessageAuthenticationCode& mac,
const byte secret[], size_t secret_len,
- const byte seed[], size_t seed_len)
+ const byte salt[], size_t salt_len)
{
try
{
@@ -44,73 +50,47 @@ void P_hash(secure_vector<byte>& output,
" bytes is too long for the PRF");
}
- secure_vector<byte> A(seed, seed + seed_len);
+ secure_vector<byte> A(salt, salt + salt_len);
+ secure_vector<byte> h;
size_t offset = 0;
- while(offset != output.size())
+ while(offset != out_len)
{
- const size_t this_block_len =
- std::min<size_t>(mac.output_length(), output.size() - offset);
-
A = mac.process(A);
mac.update(A);
- mac.update(seed, seed_len);
- secure_vector<byte> block = mac.final();
+ mac.update(salt, salt_len);
+ mac.final(h);
- xor_buf(&output[offset], &block[0], this_block_len);
- offset += this_block_len;
+ const size_t writing = std::min(h.size(), out_len - offset);
+ xor_buf(&out[offset], &h[0], writing);
+ offset += writing;
}
}
}
-/*
-* TLS PRF Constructor and Destructor
-*/
-TLS_PRF::TLS_PRF()
- {
- hmac_md5.reset(make_a<MessageAuthenticationCode>("HMAC(MD5)"));
- hmac_sha1.reset(make_a<MessageAuthenticationCode>("HMAC(SHA-1)"));
- }
-
-/*
-* TLS PRF
-*/
-secure_vector<byte> TLS_PRF::derive(size_t key_len,
- const byte secret[], size_t secret_len,
- const byte seed[], size_t seed_len) const
+size_t TLS_PRF::kdf(byte key[], size_t key_len,
+ const byte secret[], size_t secret_len,
+ const byte salt[], size_t salt_len) const
{
- secure_vector<byte> output(key_len);
-
- size_t S1_len = (secret_len + 1) / 2,
- S2_len = (secret_len + 1) / 2;
+ const size_t S1_len = (secret_len + 1) / 2,
+ S2_len = (secret_len + 1) / 2;
const byte* S1 = secret;
const byte* S2 = secret + (secret_len - S2_len);
- P_hash(output, *hmac_md5, S1, S1_len, seed, seed_len);
- P_hash(output, *hmac_sha1, S2, S2_len, seed, seed_len);
-
- return output;
+ P_hash(key, key_len, *m_hmac_md5, S1, S1_len, salt, salt_len);
+ P_hash(key, key_len, *m_hmac_sha1, S2, S2_len, salt, salt_len);
+ return key_len;
}
-/*
-* TLS v1.2 PRF Constructor and Destructor
-*/
-TLS_12_PRF::TLS_12_PRF(MessageAuthenticationCode* mac) : m_mac(mac)
+size_t TLS_12_PRF::kdf(byte key[], size_t key_len,
+ const byte secret[], size_t secret_len,
+ const byte salt[], size_t salt_len) const
{
- }
-
-secure_vector<byte> TLS_12_PRF::derive(size_t key_len,
- const byte secret[], size_t secret_len,
- const byte seed[], size_t seed_len) const
- {
- secure_vector<byte> output(key_len);
-
- P_hash(output, *m_mac, secret, secret_len, seed, seed_len);
-
- return output;
+ P_hash(key, key_len, *m_mac, secret, secret_len, salt, salt_len);
+ return key_len;
}
}
diff --git a/src/lib/kdf/prf_tls/prf_tls.h b/src/lib/kdf/prf_tls/prf_tls.h
index c3adc6caf..e2289a6e8 100644
--- a/src/lib/kdf/prf_tls/prf_tls.h
+++ b/src/lib/kdf/prf_tls/prf_tls.h
@@ -19,17 +19,18 @@ namespace Botan {
class BOTAN_DLL TLS_PRF : public KDF
{
public:
- secure_vector<byte> derive(size_t key_len,
- const byte secret[], size_t secret_len,
- const byte seed[], size_t seed_len) const;
-
std::string name() const { return "TLS-PRF"; }
+
KDF* clone() const { return new TLS_PRF; }
+ size_t kdf(byte key[], size_t key_len,
+ const byte secret[], size_t secret_len,
+ const byte salt[], size_t salt_len) const override;
+
TLS_PRF();
private:
- std::unique_ptr<MessageAuthenticationCode> hmac_md5;
- std::unique_ptr<MessageAuthenticationCode> hmac_sha1;
+ std::unique_ptr<MessageAuthenticationCode> m_hmac_md5;
+ std::unique_ptr<MessageAuthenticationCode> m_hmac_sha1;
};
/**
@@ -38,14 +39,15 @@ class BOTAN_DLL TLS_PRF : public KDF
class BOTAN_DLL TLS_12_PRF : public KDF
{
public:
- secure_vector<byte> derive(size_t key_len,
- const byte secret[], size_t secret_len,
- const byte seed[], size_t seed_len) const;
-
std::string name() const { return "TLS-12-PRF(" + m_mac->name() + ")"; }
+
KDF* clone() const { return new TLS_12_PRF(m_mac->clone()); }
- TLS_12_PRF(MessageAuthenticationCode* mac);
+ size_t kdf(byte key[], size_t key_len,
+ const byte secret[], size_t secret_len,
+ const byte salt[], size_t salt_len) const override;
+
+ TLS_12_PRF(MessageAuthenticationCode* mac) : m_mac(mac) {}
static TLS_12_PRF* make(const Spec& spec);
private: