aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/pubkey/xmss/xmss_parameters.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/pubkey/xmss/xmss_parameters.cpp')
-rw-r--r--src/lib/pubkey/xmss/xmss_parameters.cpp179
1 files changed, 179 insertions, 0 deletions
diff --git a/src/lib/pubkey/xmss/xmss_parameters.cpp b/src/lib/pubkey/xmss/xmss_parameters.cpp
new file mode 100644
index 000000000..5a106320b
--- /dev/null
+++ b/src/lib/pubkey/xmss/xmss_parameters.cpp
@@ -0,0 +1,179 @@
+/**
+ * XMSS Parameters
+ * Descibes a signature method for XMSS, as defined in:
+ * [1] XMSS: Extended Hash-Based Signatures,
+ * draft-itrf-cfrg-xmss-hash-based-signatures-06
+ * Release: July 2016.
+ * https://datatracker.ietf.org/doc/
+ * draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1
+ *
+ * (C) 2016 Matthias Gierlings
+ *
+ * Botan is released under the Simplified BSD License (see license.txt)
+ **/
+
+#include <botan/xmss_parameters.h>
+
+namespace Botan {
+
+const std::map<std::string, XMSS_Parameters::xmss_algorithm_t>
+ XMSS_Parameters::m_oid_name_lut =
+ {
+ { "XMSS_SHA2-256_W16_H10", XMSS_SHA2_256_W16_H10 },
+ { "XMSS_SHA2-256_W16_H16", XMSS_SHA2_256_W16_H16 },
+ { "XMSS_SHA2-256_W16_H20", XMSS_SHA2_256_W16_H20 },
+ { "XMSS_SHA2-512_W16_H10", XMSS_SHA2_512_W16_H10 },
+ { "XMSS_SHA2-512_W16_H16", XMSS_SHA2_512_W16_H16 },
+ { "XMSS_SHA2-512_W16_H20", XMSS_SHA2_512_W16_H20 }
+// { "XMSS_SHAKE128_W16_H10", xmss_algorithm_t::XMSS_SHAKE128_W16_H10 },
+// { "XMSS_SHAKE128_W16_H16", xmss_algorithm_t::XMSS_SHAKE128_W16_H16 },
+// { "XMSS_SHAKE128_W16_H20", xmss_algorithm_t::XMSS_SHAKE128_W16_H20 },
+// { "XMSS_SHAKE256_W16_H10", xmss_algorithm_t::XMSS_SHAKE256_W16_H10 },
+// { "XMSS_SHAKE256_W16_H16", xmss_algorithm_t::XMSS_SHAKE256_W16_H16 },
+// { "XMSS_SHAKE256_W16_H20", xmss_algorithm_t::XMSS_SHAKE256_W16_H20 }
+ };
+
+XMSS_Parameters::XMSS_Parameters(const std::string& algo_name)
+ : XMSS_Parameters(m_oid_name_lut.at(algo_name))
+ {}
+
+XMSS_Parameters::XMSS_Parameters(xmss_algorithm_t oid)
+ : m_oid(oid)
+ {
+ switch(oid)
+ {
+ case XMSS_SHA2_256_W16_H10:
+ m_element_size = 32;
+ m_w = 16;
+ m_len = 67;
+ m_tree_height = 10;
+ m_name = "XMSS_SHA2-256_W16_H10";
+ m_hash_name = "SHA-256";
+ m_strength = 256;
+ m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_256_W16;
+ break;
+ case XMSS_SHA2_256_W16_H16:
+ m_element_size = 32;
+ m_w = 16;
+ m_len = 67;
+ m_tree_height = 16;
+ m_name = "XMSS_SHA2-256_W16_H16";
+ m_hash_name = "SHA-256";
+ m_strength = 256;
+ m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_256_W16;
+ break;
+ case XMSS_SHA2_256_W16_H20:
+ m_element_size = 32;
+ m_w = 16;
+ m_len = 67;
+ m_tree_height = 20;
+ m_name = "XMSS_SHA2-256_W16_H20";
+ m_hash_name = "SHA-256";
+ m_strength = 256;
+ m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_256_W16;
+ break;
+ case XMSS_SHA2_512_W16_H10:
+ m_element_size = 64;
+ m_w = 16;
+ m_len = 131;
+ m_tree_height = 10;
+ m_name = "XMSS_SHA2-512_W16_H10";
+ m_hash_name = "SHA-512";
+ m_strength = 512;
+ m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_512_W16;
+ break;
+ case XMSS_SHA2_512_W16_H16:
+ m_element_size = 64;
+ m_w = 16;
+ m_len = 131;
+ m_tree_height = 16;
+ m_name = "XMSS_SHA2-512_W16_H16";
+ m_hash_name = "SHA-512";
+ m_strength = 512;
+ m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_512_W16;
+ break;
+ case XMSS_SHA2_512_W16_H20:
+ m_element_size = 64;
+ m_w = 16;
+ m_len = 131;
+ m_tree_height = 20;
+ m_name = "XMSS_SHA2-512_W16_H20";
+ m_hash_name = "SHA-512";
+ m_strength = 512;
+ m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_512_W16;
+ break;
+// FIXME: Uncomment once SHAKE128/256 implementation is available in Botan.
+// case XMSS_SHAKE128_W16_H10:
+// m_element_size = 32;
+// m_w = 16;
+// m_len = 67;
+// m_tree_height = 10;
+// m_name = "XMSS_SHAKE128_W16_H10";
+// m_hash_name = "";
+// m_strength = 256;
+// m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE128_W16;
+// BOTAN_ASSERT(false, "XMSS_SHAKE128_W16_H10 not implemented.");
+// break;
+// case XMSS_SHAKE128_W16_H16:
+// m_element_size = 32;
+// m_w = 16;
+// m_len = 67;
+// m_tree_height = 16;
+// m_name = "XMSS_SHAKE128_W16_H16";
+// m_hash_name = "";
+// m_strength = 256;
+// m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE128_W16;
+// BOTAN_ASSERT(false, "XMSS_SHAKE128_W16_H16 not implemented.");
+// break;
+// case XMSS_SHAKE128_W16_H20:
+// m_element_size = 32;
+// m_w = 16;
+// m_len = 67;
+// m_tree_height = 20;
+// m_name = "XMSS_SHAKE128_W16_H20";
+// m_hash_name = "";
+// m_strength = 256;
+// m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE128_W16;
+// BOTAN_ASSERT(false, "XMSS_SHAKE128_W16_H20 not implemented.");
+// break;
+// case XMSS_SHAKE256_W16_H10:
+// m_element_size = 64;
+// m_w = 16;
+// m_len = 131;
+// m_tree_height = 10;
+// m_name = "XMSS_SHAKE256_W16_H10";
+// m_hash_name = "";
+// m_strength = 512;
+// m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE256_W16;
+// BOTAN_ASSERT(false, "XMSS_SHAKE256_W16_H10 not implemented.");
+// break;
+// case XMSS_SHAKE256_W16_H16:
+// m_element_size = 64;
+// m_w = 16;
+// m_len = 131;
+// m_tree_height = 16;
+// m_name = "XMSS_SHAKE256_W16_H16";
+// m_hash_name = "";
+// m_strength = 512;
+// m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE256_W16;
+// BOTAN_ASSERT(false, "XMSS_SHAKE256_W16_H16 not implemented.");
+// break;
+// case XMSS_SHAKE256_W16_H20:
+// m_element_size = 64;
+// m_w = 16;
+// m_len = 131;
+// m_tree_height = 20;
+// m_name = "XMSS_SHAKE256_W16_H20";
+// m_hash_name = "";
+// m_strength = 512;
+// m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE256_W16;
+// BOTAN_ASSERT(false, "XMSS_SHAKE256_W16_H20 not implemented.");
+// break;
+ default:
+ throw Unsupported_Argument(
+ "Algorithm id does not match any XMSS algorithm id.");
+ break;
+ }
+ }
+
+}