/** * TLS Handshake Hash * (C) 2004-2006 Jack Lloyd * * Released under the terms of the Botan license */ #include #include #include #include namespace Botan { /** * Return a TLS Handshake Hash */ SecureVector HandshakeHash::final() { MD5 md5; SHA_160 sha1; md5.update(data); sha1.update(data); return SecureVector(md5.final(), sha1.final()); } /** * Return a SSLv3 Handshake Hash */ SecureVector HandshakeHash::final_ssl3(const MemoryRegion& 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 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(md5.final(), sha1.final()); } }