aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Lloyd <[email protected]>2016-11-25 17:07:12 -0500
committerJack Lloyd <[email protected]>2016-11-25 17:07:12 -0500
commit4a849b7ebb329630ef03d5b3961d57c5f76cfa0b (patch)
tree88fb27dc826dfe9fdd3b40a5b23dc4b32539aa18
parente8568ba5a45c7383709b27e2fa0443b938bf6ea9 (diff)
Correct XMSS crash when a hash was disabled
Require SHA-256 in XMSS since that is mandatory for the index registry.
-rw-r--r--src/lib/pubkey/xmss/info.txt1
-rw-r--r--src/lib/pubkey/xmss/xmss_hash.cpp18
-rw-r--r--src/lib/pubkey/xmss/xmss_hash.h11
-rw-r--r--src/lib/pubkey/xmss/xmss_parameters.cpp2
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
</requires>
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 <botan/xmss_hash.h>
+#include <botan/exceptn.h>
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<HashFunction> m_hash;
std::unique_ptr<HashFunction> m_msg_hash;
size_t m_output_length;
//32 byte id prefixes prepended to the hash input.
std::vector<byte> 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)