aboutsummaryrefslogtreecommitdiffstats
path: root/src/ssl/handshake_hash.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ssl/handshake_hash.cpp')
-rw-r--r--src/ssl/handshake_hash.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/ssl/handshake_hash.cpp b/src/ssl/handshake_hash.cpp
new file mode 100644
index 000000000..d94fa0178
--- /dev/null
+++ b/src/ssl/handshake_hash.cpp
@@ -0,0 +1,60 @@
+/**
+* TLS Handshake Hash
+* (C) 2004-2006 Jack Lloyd
+*
+* Released under the terms of the Botan license
+*/
+
+#include <botan/handshake_hash.h>
+#include <botan/md5.h>
+#include <botan/sha160.h>
+#include <memory>
+
+namespace Botan {
+
+/**
+* Return a TLS Handshake Hash
+*/
+SecureVector<byte> HandshakeHash::final()
+ {
+ MD5 md5;
+ SHA_160 sha1;
+
+ md5.update(data);
+ sha1.update(data);
+
+ return SecureVector<byte>(md5.final(), sha1.final());
+ }
+
+/**
+* Return a SSLv3 Handshake Hash
+*/
+SecureVector<byte> HandshakeHash::final_ssl3(const MemoryRegion<byte>& secret)
+ {
+ const byte PAD_INNER = 0x36, PAD_OUTER = 0x5C;
+
+ MD5 md5;
+ SHA_160 sha1;
+
+ md5.update(data);
+ sha1.update(data);
+
+ md5.update(secret);
+ sha1.update(secret);
+
+ for(u32bit j = 0; j != 48; j++) md5.update(PAD_INNER);
+ for(u32bit j = 0; j != 40; j++) sha1.update(PAD_INNER);
+
+ SecureVector<byte> inner_md5 = md5.final(), inner_sha1 = sha1.final();
+
+ md5.update(secret);
+ sha1.update(secret);
+ for(u32bit j = 0; j != 48; j++) md5.update(PAD_OUTER);
+ for(u32bit j = 0; j != 40; j++) sha1.update(PAD_OUTER);
+ md5.update(inner_md5);
+ sha1.update(inner_sha1);
+
+ return SecureVector<byte>(md5.final(), sha1.final());
+ }
+
+}