/************************************************* * SSL3-MAC Source File * * (C) 1999-2004 Jack Lloyd * *************************************************/ #include #include namespace Botan { /************************************************* * Update a SSL3-MAC Calculation * *************************************************/ void SSL3_MAC::add_data(const byte input[], u32bit length) { hash->update(input, length); } /************************************************* * Finalize a SSL3-MAC Calculation * *************************************************/ void SSL3_MAC::final_result(byte mac[]) { hash->final(mac); hash->update(o_key); hash->update(mac, OUTPUT_LENGTH); hash->final(mac); hash->update(i_key); } /************************************************* * SSL3-MAC Key Schedule * *************************************************/ void SSL3_MAC::key(const byte key[], u32bit length) { hash->clear(); std::fill(i_key.begin(), i_key.end(), 0x36); std::fill(o_key.begin(), o_key.end(), 0x5C); i_key.copy(key, length); o_key.copy(key, length); hash->update(i_key); } /************************************************* * Clear memory of sensitive data * *************************************************/ void SSL3_MAC::clear() throw() { hash->clear(); i_key.clear(); o_key.clear(); } /************************************************* * Return the name of this type * *************************************************/ std::string SSL3_MAC::name() const { return "SSL3-MAC(" + hash->name() + ")"; } /************************************************* * Return a clone of this object * *************************************************/ MessageAuthenticationCode* SSL3_MAC::clone() const { return new SSL3_MAC(hash->name()); } /************************************************* * SSL3-MAC Constructor * *************************************************/ SSL3_MAC::SSL3_MAC(const std::string& hash_name) : MessageAuthenticationCode(output_length_of(hash_name), output_length_of(hash_name)), hash(get_hash(hash_name)) { if(hash->name() != "MD5" && hash->name() != "SHA-160") throw Invalid_Argument("SSL3-MAC cannot be used with " + hash->name()); const u32bit INNER_HASH_LENGTH = (hash->name() == "MD5") ? 64 : 60; i_key.create(INNER_HASH_LENGTH); o_key.create(INNER_HASH_LENGTH); } }