From 4a849b7ebb329630ef03d5b3961d57c5f76cfa0b Mon Sep 17 00:00:00 2001 From: Jack Lloyd Date: Fri, 25 Nov 2016 17:07:12 -0500 Subject: Correct XMSS crash when a hash was disabled Require SHA-256 in XMSS since that is mandatory for the index registry. --- src/lib/pubkey/xmss/info.txt | 1 + src/lib/pubkey/xmss/xmss_hash.cpp | 18 ++++++++++++------ src/lib/pubkey/xmss/xmss_hash.h | 11 ++++++----- src/lib/pubkey/xmss/xmss_parameters.cpp | 2 +- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/lib/pubkey/xmss/info.txt b/src/lib/pubkey/xmss/info.txt index bab541625..862ff68f9 100644 --- a/src/lib/pubkey/xmss/info.txt +++ b/src/lib/pubkey/xmss/info.txt @@ -42,4 +42,5 @@ xmss_verification_operation.h asn1 rng hash +sha2_32 diff --git a/src/lib/pubkey/xmss/xmss_hash.cpp b/src/lib/pubkey/xmss/xmss_hash.cpp index d6ae2bb3b..3731f7751 100644 --- a/src/lib/pubkey/xmss/xmss_hash.cpp +++ b/src/lib/pubkey/xmss/xmss_hash.cpp @@ -8,6 +8,7 @@ **/ #include +#include namespace Botan { @@ -16,14 +17,19 @@ XMSS_Hash::XMSS_Hash(const XMSS_Hash& hash) { } -XMSS_Hash::XMSS_Hash(const std::string& h_func_name) - : m_hash(HashFunction::create(h_func_name)), - m_msg_hash(HashFunction::create(h_func_name)), - m_output_length(m_hash->output_length()), - m_zero_padding(m_output_length - 1, 0x00), - m_hash_func_name(h_func_name) +XMSS_Hash::XMSS_Hash(const std::string& h_func_name) : + m_hash_func_name(h_func_name), + m_hash(HashFunction::create(h_func_name)) { + if(!m_hash) + throw Lookup_Error("XMSS cannot use hash " + h_func_name + + " because it is unavailable"); + + m_output_length = m_hash->output_length(); BOTAN_ASSERT(m_output_length > 0, "Hash output length of zero is invalid."); + + m_zero_padding.resize(m_output_length - 1); + m_msg_hash.reset(m_hash->clone()); } void diff --git a/src/lib/pubkey/xmss/xmss_hash.h b/src/lib/pubkey/xmss/xmss_hash.h index cf42f8d91..2cca26658 100644 --- a/src/lib/pubkey/xmss/xmss_hash.h +++ b/src/lib/pubkey/xmss/xmss_hash.h @@ -147,17 +147,18 @@ class XMSS_Hash size_t output_length() const { return m_output_length; }; private: + static const byte m_id_f = 0x00; + static const byte m_id_h = 0x01; + static const byte m_id_hmsg = 0x02; + static const byte m_id_prf = 0x03; + + const std::string m_hash_func_name; std::unique_ptr m_hash; std::unique_ptr m_msg_hash; size_t m_output_length; //32 byte id prefixes prepended to the hash input. std::vector m_zero_padding; - static const byte m_id_f = 0x00; - static const byte m_id_h = 0x01; - static const byte m_id_hmsg = 0x02; - static const byte m_id_prf = 0x03; - const std::string m_hash_func_name; }; } diff --git a/src/lib/pubkey/xmss/xmss_parameters.cpp b/src/lib/pubkey/xmss/xmss_parameters.cpp index c55b25a27..cc4d923dd 100644 --- a/src/lib/pubkey/xmss/xmss_parameters.cpp +++ b/src/lib/pubkey/xmss/xmss_parameters.cpp @@ -43,7 +43,7 @@ XMSS_Parameters::xmss_algorithm_t XMSS_Parameters::xmss_id_from_string(const std return XMSS_SHAKE256_W16_H16; if(param_set == "XMSS_SHAKE256_W16_H20") return XMSS_SHAKE256_W16_H20; - throw Invalid_Argument("Unknown XMSS algorithm param '" + param_set + "'"); + throw Lookup_Error("Unknown XMSS algorithm param '" + param_set + "'"); } XMSS_Parameters::XMSS_Parameters(const std::string& param_set) -- cgit v1.2.3