diff --git a/doc/api_ref/kdf.rst b/doc/api_ref/kdf.rst index 4c0b4d9c89b..fd5df1c5d73 100644 --- a/doc/api_ref/kdf.rst +++ b/doc/api_ref/kdf.rst @@ -158,7 +158,7 @@ e.g. ``X9.42-PRF(KeyWrap.TripleDES)``, ``X9.42-PRF(1.2.840.113549.1.9.16.3.7)`` SP800-56A ~~~~~~~~~~ -KDF from NIST SP 800-56A. +KDF from NIST SP 800-56Ar2 or One-Step KDF of SP 800-56Cr2. Available if ``BOTAN_HAS_SP800_56A`` is defined. @@ -166,11 +166,12 @@ Algorithm specification names: - ``SP800-56A()``, e.g. ``SP800-56A(SHA-256)`` - ``SP800-56A(HMAC())``, e.g. ``SP800-56A(HMAC(SHA-256))`` +- ``SP800-56A(KMAC-128)`` or ``SP800-56A(KMAC-256)`` SP800-56C ~~~~~~~~~~ -KDF from NIST SP 800-56C. +Two-Step KDF from NIST SP 800-56Cr2. Available if ``BOTAN_HAS_SP800_56C`` is defined. diff --git a/src/lib/kdf/kdf.cpp b/src/lib/kdf/kdf.cpp index 189098786c5..297f34218e8 100644 --- a/src/lib/kdf/kdf.cpp +++ b/src/lib/kdf/kdf.cpp @@ -42,11 +42,11 @@ #endif #if defined(BOTAN_HAS_SP800_56A) - #include + #include #endif #if defined(BOTAN_HAS_SP800_56C) - #include + #include #endif namespace Botan { @@ -160,10 +160,16 @@ std::unique_ptr KDF::create(std::string_view algo_spec, std::string_view pr #if defined(BOTAN_HAS_SP800_56A) if(req.algo_name() == "SP800-56A" && req.arg_count() == 1) { if(auto hash = HashFunction::create(req.arg(0))) { - return std::make_unique(std::move(hash)); + return std::make_unique(std::move(hash)); + } + if(req.arg(0) == "KMAC-128") { + return std::make_unique(); + } + if(req.arg(0) == "KMAC-256") { + return std::make_unique(); } if(auto mac = MessageAuthenticationCode::create(req.arg(0))) { - return std::make_unique(std::move(mac)); + return std::make_unique(std::move(mac)); } } #endif @@ -173,11 +179,11 @@ std::unique_ptr KDF::create(std::string_view algo_spec, std::string_view pr std::unique_ptr exp(kdf_create_mac_or_hash(req.arg(0))); if(exp) { if(auto mac = MessageAuthenticationCode::create(req.arg(0))) { - return std::make_unique(std::move(mac), std::move(exp)); + return std::make_unique(std::move(mac), std::move(exp)); } if(auto mac = MessageAuthenticationCode::create(fmt("HMAC({})", req.arg(0)))) { - return std::make_unique(std::move(mac), std::move(exp)); + return std::make_unique(std::move(mac), std::move(exp)); } } } diff --git a/src/lib/kdf/sp800_56a/info.txt b/src/lib/kdf/sp800_56a/info.txt index 4c1a514e41d..39016c88a1d 100644 --- a/src/lib/kdf/sp800_56a/info.txt +++ b/src/lib/kdf/sp800_56a/info.txt @@ -8,4 +8,5 @@ name -> "NIST SP800-56A" hmac +kmac diff --git a/src/lib/kdf/sp800_56a/sp800_56a.cpp b/src/lib/kdf/sp800_56a/sp800_56a.cpp deleted file mode 100644 index 834201d96bb..00000000000 --- a/src/lib/kdf/sp800_56a/sp800_56a.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* -* KDF defined in NIST SP 800-56a (Approved Alternative 1) -* -* (C) 2017 Ribose Inc. Written by Krzysztof Kwiatkowski. -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include - -#include -#include - -namespace Botan { - -namespace { - -template -void SP800_56A_kdf(AuxiliaryFunction_t& auxfunc, - uint8_t key[], - size_t key_len, - const uint8_t secret[], - size_t secret_len, - const uint8_t label[], - size_t label_len) { - const uint64_t kRepsUpperBound = (1ULL << 32); - - const size_t digest_len = auxfunc.output_length(); - - const size_t reps = key_len / digest_len + ((key_len % digest_len) ? 1 : 0); - - if(reps >= kRepsUpperBound) { - // See SP-800-56A, point 5.8.1 - throw Invalid_Argument("SP800-56A KDF requested output too large"); - } - - uint32_t counter = 1; - secure_vector result; - for(size_t i = 0; i < reps; i++) { - auxfunc.update_be(counter++); - auxfunc.update(secret, secret_len); - auxfunc.update(label, label_len); - auxfunc.final(result); - - const size_t offset = digest_len * i; - const size_t len = std::min(result.size(), key_len - offset); - copy_mem(&key[offset], result.data(), len); - } -} - -} // namespace - -void SP800_56A_Hash::kdf(uint8_t key[], - size_t key_len, - const uint8_t secret[], - size_t secret_len, - const uint8_t salt[], - size_t salt_len, - const uint8_t label[], - size_t label_len) const { - BOTAN_UNUSED(salt); - - if(salt_len > 0) { - throw Invalid_Argument("SP800_56A_Hash does not support a non-empty salt"); - } - - SP800_56A_kdf(*m_hash, key, key_len, secret, secret_len, label, label_len); -} - -std::string SP800_56A_Hash::name() const { - return fmt("SP800-56A({})", m_hash->name()); -} - -std::unique_ptr SP800_56A_Hash::new_object() const { - return std::make_unique(m_hash->new_object()); -} - -SP800_56A_HMAC::SP800_56A_HMAC(std::unique_ptr mac) : m_mac(std::move(mac)) { - // TODO: we need a MessageAuthenticationCode::is_hmac - if(!m_mac->name().starts_with("HMAC(")) { - throw Algorithm_Not_Found("Only HMAC can be used with KDF SP800-56A"); - } -} - -void SP800_56A_HMAC::kdf(uint8_t key[], - size_t key_len, - const uint8_t secret[], - size_t secret_len, - const uint8_t salt[], - size_t salt_len, - const uint8_t label[], - size_t label_len) const { - /* - * SP 800-56A specifies if the salt is empty then a block of zeros - * equal to the hash's underlying block size are used. However this - * is equivalent to setting a zero-length key, so the same call - * works for either case. - */ - m_mac->set_key(salt, salt_len); - - SP800_56A_kdf(*m_mac, key, key_len, secret, secret_len, label, label_len); -} - -std::string SP800_56A_HMAC::name() const { - return fmt("SP800-56A({})", m_mac->name()); -} - -std::unique_ptr SP800_56A_HMAC::new_object() const { - return std::make_unique(m_mac->new_object()); -} - -} // namespace Botan diff --git a/src/lib/kdf/sp800_56a/sp800_56a.h b/src/lib/kdf/sp800_56a/sp800_56a.h deleted file mode 100644 index 4000ea84f5a..00000000000 --- a/src/lib/kdf/sp800_56a/sp800_56a.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -* KDF defined in NIST SP 800-56a revision 2 (Single-step key-derivation function) -* -* (C) 2017 Ribose Inc. Written by Krzysztof Kwiatkowski. -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_SP800_56A_H_ -#define BOTAN_SP800_56A_H_ - -#include -#include -#include - -namespace Botan { - -/** - * NIST SP 800-56A KDF using hash function - * @warning This KDF ignores the provided salt value - */ -class SP800_56A_Hash final : public KDF { - public: - std::string name() const override; - - std::unique_ptr new_object() const override; - - /** - * Derive a key using the SP800-56A KDF. - * - * The implementation hard codes the context value for the - * expansion step to the empty string. - * - * @param key derived keying material K_M - * @param key_len the desired output length in bytes - * @param secret shared secret Z - * @param secret_len size of Z in bytes - * @param salt ignored - * @param salt_len ignored - * @param label label for the expansion step - * @param label_len size of label in bytes - * - * @throws Invalid_Argument key_len > 2^32 - */ - void kdf(uint8_t key[], - size_t key_len, - const uint8_t secret[], - size_t secret_len, - const uint8_t salt[], - size_t salt_len, - const uint8_t label[], - size_t label_len) const override; - - /** - * @param hash the hash function to use as the auxiliary function - */ - explicit SP800_56A_Hash(std::unique_ptr hash) : m_hash(std::move(hash)) {} - - private: - std::unique_ptr m_hash; -}; - -/** - * NIST SP 800-56A KDF using HMAC - */ -class SP800_56A_HMAC final : public KDF { - public: - std::string name() const override; - - std::unique_ptr new_object() const override; - - /** - * Derive a key using the SP800-56A KDF. - * - * The implementation hard codes the context value for the - * expansion step to the empty string. - * - * @param key derived keying material K_M - * @param key_len the desired output length in bytes - * @param secret shared secret Z - * @param secret_len size of Z in bytes - * @param salt ignored - * @param salt_len ignored - * @param label label for the expansion step - * @param label_len size of label in bytes - * - * @throws Invalid_Argument key_len > 2^32 or MAC is not a HMAC - */ - void kdf(uint8_t key[], - size_t key_len, - const uint8_t secret[], - size_t secret_len, - const uint8_t salt[], - size_t salt_len, - const uint8_t label[], - size_t label_len) const override; - - /** - * @param mac the HMAC to use as the auxiliary function - */ - explicit SP800_56A_HMAC(std::unique_ptr mac); - - private: - std::unique_ptr m_mac; -}; - -} // namespace Botan - -#endif diff --git a/src/lib/kdf/sp800_56a/sp800_56c_one_step.cpp b/src/lib/kdf/sp800_56a/sp800_56c_one_step.cpp new file mode 100644 index 00000000000..087f9baaa45 --- /dev/null +++ b/src/lib/kdf/sp800_56a/sp800_56c_one_step.cpp @@ -0,0 +1,189 @@ +/* +* KDF defined in NIST SP 800-56a revision 2 (Single-step key-derivation function) +* or in NIST SP 800-56C revision 2 (Section 4 - One-Step KDM) +* +* (C) 2017 Ribose Inc. Written by Krzysztof Kwiatkowski. +* (C) 2024 Fabian Albert - Rohde & Schwarz Cybersecurity +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include + +#include +#include +#include +#include + +#include + +namespace Botan { + +namespace { +template +concept hash_or_mac_type = std::is_same_v || std::is_same_v; + +/** + * @brief One-Step Key Derivation as defined in SP800-56Cr2 Section 4 + */ +template +void kdm_internal(std::span output_buffer, + std::span z, + std::span fixed_info, + HashOrMacType& hash_or_mac, + const std::function& init_h_callback) { + size_t l = output_buffer.size() * 8; + // 1. If L > 0, then set reps = ceil(L / H_outputBits); otherwise, + // output an error indicator and exit this process without + // performing the remaining actions (i.e., omit steps 2 through 8). + BOTAN_ARG_CHECK(l > 0, "Zero KDM output length"); + size_t reps = ceil_division(l, hash_or_mac.output_length() * 8); + + // 2. If reps > (2^32 āˆ’ 1), then output an error indicator and exit this + // process without performing the remaining actions + // (i.e., omit steps 3 through 8). + BOTAN_ARG_CHECK(reps <= 0xFFFFFFFF, "Too large KDM output length"); + + // 3. Initialize a big-endian 4-byte unsigned integer counter as + // 0x00000000, corresponding to a 32-bit binary representation of + // the number zero. + uint32_t counter = 0; + + // 4. If counter || Z || FixedInfo is more than max_H_inputBits bits + // long, then output an error indicator and exit this process + // without performing any of the remaining actions (i.e., omit + // steps 5 through 8). => SHA3 and KMAC are unlimited + + // 5. Initialize Result(0) as an empty bit string + // (i.e., the null string). + secure_vector result; + + // 6. For i = 1 to reps, do the following: + for(size_t i = 1; i <= reps; i++) { + // 6.1. Increment counter by 1. + counter++; + // Reset the hash/MAC object. For MAC, also set the key (salt) and IV. + hash_or_mac.clear(); + init_h_callback(hash_or_mac); + + // 6.2 Compute K(i) = H(counter || Z || FixedInfo). + hash_or_mac.update_be(counter); + hash_or_mac.update(z); + hash_or_mac.update(fixed_info); + auto k_i = hash_or_mac.final(); + + // 6.3. Set Result(i) = Result(iāˆ’1) || K(i). + result.insert(result.end(), k_i.begin(), k_i.end()); + } + + // 7. Set DerivedKeyingMaterial equal to the leftmost L bits of Result(reps). + copy_mem(output_buffer, std::span(result).subspan(0, output_buffer.size())); +} + +} // namespace + +void SP800_56C_One_Step_Hash::kdf(uint8_t key[], + size_t key_len, + const uint8_t secret[], + size_t secret_len, + const uint8_t salt[], + size_t salt_len, + const uint8_t label[], + size_t label_len) const { + BOTAN_UNUSED(salt); + BOTAN_ARG_CHECK(salt_len == 0, "SP800_56A_Hash does not support a non-empty salt"); + + kdm_internal( + {key, key_len}, {secret, secret_len}, {label, label_len}, *m_hash, [](HashFunction&) { /* NOP */ }); +} + +std::string SP800_56C_One_Step_Hash::name() const { + return fmt("SP800-56A({})", m_hash->name()); +} + +std::unique_ptr SP800_56C_One_Step_Hash::new_object() const { + return std::make_unique(m_hash->new_object()); +} + +SP800_56C_One_Step_HMAC::SP800_56C_One_Step_HMAC(std::unique_ptr mac) : + m_mac(std::move(mac)) { + // TODO: we need a MessageAuthenticationCode::is_hmac + if(!m_mac->name().starts_with("HMAC(")) { + throw Algorithm_Not_Found("Only HMAC can be used with SP800_56A_HMAC"); + } +} + +void SP800_56C_One_Step_HMAC::kdf(uint8_t key[], + size_t key_len, + const uint8_t secret[], + size_t secret_len, + const uint8_t salt[], + size_t salt_len, + const uint8_t label[], + size_t label_len) const { + kdm_internal( + {key, key_len}, {secret, secret_len}, {label, label_len}, *m_mac, [&](MessageAuthenticationCode& kdf_mac) { + // 4.1 Option 2 and 3 - An implementation dependent byte string, salt, + // whose (non-null) value may be optionally provided in + // OtherInput, serves as the HMAC# key .. + + // SP 800-56Cr2 specifies if the salt is empty then a block of zeros + // equal to the hash's underlying block size are used. However for HMAC + // this is equivalent to setting a zero-length key, so the same call + // works for either case. + kdf_mac.set_key(std::span{salt, salt_len}); + }); +} + +std::string SP800_56C_One_Step_HMAC::name() const { + return fmt("SP800-56A({})", m_mac->name()); +} + +std::unique_ptr SP800_56C_One_Step_HMAC::new_object() const { + return std::make_unique(m_mac->new_object()); +} + +// Option 3 - KMAC +void SP800_56A_One_Step_KMAC_Abstract::kdf(uint8_t key[], + size_t key_len, + const uint8_t secret[], + size_t secret_len, + const uint8_t salt[], + size_t salt_len, + const uint8_t label[], + size_t label_len) const { + auto mac = create_kmac_instance(key_len); + kdm_internal( + {key, key_len}, {secret, secret_len}, {label, label_len}, *mac, [&](MessageAuthenticationCode& kdf_mac) { + // 4.1 Option 2 and 3 - An implementation dependent byte string, salt, + // whose (non-null) value may be optionally provided in + // OtherInput, serves as the KMAC# key ... + if(salt_len == 0) { + // 4.1 Implementation-Dependent Parameters 3 + // If H(x) = KMAC128[or 256](salt, x, H_outputBits, "KDF"), + // then ā€“ in the absence of an agreed-upon alternative ā€“ + // the default_salt shall be an all - zero string of + // 164 bytes [or 132 bytes] + kdf_mac.set_key(std::vector(default_salt_length(), 0)); + } else { + kdf_mac.set_key(std::span{salt, salt_len}); + } + + // 4.1 Option 3 - The "customization string" S shall be the byte string + // 01001011 || 01000100 || 01000110, which represents the sequence + // of characters 'K', 'D', and 'F' in 8-bit ASCII. + kdf_mac.start(std::array{'K', 'D', 'F'}); + }); +} + +std::unique_ptr SP800_56C_One_Step_KMAC128::create_kmac_instance( + size_t output_byte_len) const { + return std::make_unique(output_byte_len * 8); +} + +std::unique_ptr SP800_56C_One_Step_KMAC256::create_kmac_instance( + size_t output_byte_len) const { + return std::make_unique(output_byte_len * 8); +} + +} // namespace Botan diff --git a/src/lib/kdf/sp800_56a/sp800_56c_one_step.h b/src/lib/kdf/sp800_56a/sp800_56c_one_step.h new file mode 100644 index 00000000000..5924966c975 --- /dev/null +++ b/src/lib/kdf/sp800_56a/sp800_56c_one_step.h @@ -0,0 +1,171 @@ +/* +* KDF defined in NIST SP 800-56a revision 2 (Single-step key-derivation function) +* or in NIST SP 800-56C revision 2 (Section 4 - One-Step KDM) +* +* (C) 2017 Ribose Inc. Written by Krzysztof Kwiatkowski. +* (C) 2024 Fabian Albert - Rohde & Schwarz Cybersecurity +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#ifndef BOTAN_SP800_56A_H_ +#define BOTAN_SP800_56A_H_ + +#include +#include +#include + +namespace Botan { + +/** + * NIST SP 800-56Cr2 One-Step KDF using hash function + * @warning The salt for this KDF must be empty. + */ +class SP800_56C_One_Step_Hash final : public KDF { + public: + std::string name() const override; + + std::unique_ptr new_object() const override; + + /** + * Derive a key using the SP800-56Cr2 One-Step KDF. + * + * @param key DerivedKeyingMaterial output buffer + * @param key_len the desired output length in bytes + * @param secret shared secret Z + * @param secret_len size of Z in bytes + * @param salt the salt. Ignored. + * @param salt_len size of salt in bytes. Must be 0. + * @param label FixedInfo + * @param label_len size of label in bytes + * + * @throws Invalid_Argument if key_len > (2^32 - 1) * Hash output bits. + * Or thrown if salt is non-empty + */ + void kdf(uint8_t key[], + size_t key_len, + const uint8_t secret[], + size_t secret_len, + const uint8_t salt[], + size_t salt_len, + const uint8_t label[], + size_t label_len) const override; + + /** + * @param hash the hash function to use as the auxiliary function + */ + explicit SP800_56C_One_Step_Hash(std::unique_ptr hash) : m_hash(std::move(hash)) {} + + private: + std::unique_ptr m_hash; +}; + +/** + * NIST SP800-56Cr2 One-Step KDF using HMAC + */ +class SP800_56C_One_Step_HMAC final : public KDF { + public: + std::string name() const override; + + std::unique_ptr new_object() const override; + + /** + * Derive a key using the SP800-56Cr2 One-Step KDF. + * + * @param key DerivedKeyingMaterial output buffer + * @param key_len the desired output length in bytes + * @param secret shared secret Z + * @param secret_len size of Z in bytes + * @param salt the salt. If empty the default_salt is used. + * @param salt_len size of salt in bytes + * @param label FixedInfo + * @param label_len size of label in bytes + * + * @throws Invalid_Argument if key_len > (2^32 - 1) * HMAC output bits + */ + void kdf(uint8_t key[], + size_t key_len, + const uint8_t secret[], + size_t secret_len, + const uint8_t salt[], + size_t salt_len, + const uint8_t label[], + size_t label_len) const override; + + /** + * @param mac the HMAC to use as the auxiliary function + */ + explicit SP800_56C_One_Step_HMAC(std::unique_ptr mac); + + private: + std::unique_ptr m_mac; +}; + +/** + * NIST SP800-56Cr2 One-Step KDF using KMAC (Abstract class) + */ +class SP800_56A_One_Step_KMAC_Abstract : public KDF { + public: + /** + * Derive a key using the SP800-56Cr2 One-Step KDF. + * + * @param key DerivedKeyingMaterial output buffer + * @param key_len the desired output length in bytes + * @param secret shared secret Z + * @param secret_len size of Z in bytes + * @param salt the salt. If empty the default_salt is used. + * @param salt_len size of salt in bytes + * @param label FixedInfo + * @param label_len size of label in bytes + * + * @throws Invalid_Argument if key_len > (2^32 - 1) * KMAC output bits + */ + void kdf(uint8_t key[], + size_t key_len, + const uint8_t secret[], + size_t secret_len, + const uint8_t salt[], + size_t salt_len, + const uint8_t label[], + size_t label_len) const override; + + protected: + virtual std::unique_ptr create_kmac_instance(size_t output_byte_len) const = 0; + + /// See SP800-56C Section 4.1 - Implementation-Dependent Parameters 3. + virtual size_t default_salt_length() const = 0; +}; + +/** + * NIST SP800-56Cr2 One-Step KDF using KMAC-128 + */ +class SP800_56C_One_Step_KMAC128 final : public SP800_56A_One_Step_KMAC_Abstract { + public: + std::string name() const override { return "SP800-56A(KMAC-128)"; } + + std::unique_ptr new_object() const override { return std::make_unique(); } + + private: + std::unique_ptr create_kmac_instance(size_t output_byte_len) const override; + + size_t default_salt_length() const override { return 164; } +}; + +/** + * NIST SP800-56Cr2 One-Step KDF using KMAC-256 + */ +class SP800_56C_One_Step_KMAC256 final : public SP800_56A_One_Step_KMAC_Abstract { + public: + std::string name() const override { return "SP800-56A(KMAC-256)"; } + + std::unique_ptr new_object() const override { return std::make_unique(); } + + private: + std::unique_ptr create_kmac_instance(size_t output_byte_len) const override; + + size_t default_salt_length() const override { return 132; } +}; + +} // namespace Botan + +#endif diff --git a/src/lib/kdf/sp800_56c/sp800_56c.cpp b/src/lib/kdf/sp800_56c/sp800_56c.cpp deleted file mode 100644 index 85676c09311..00000000000 --- a/src/lib/kdf/sp800_56c/sp800_56c.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* -* KDF defined in NIST SP 800-56c -* (C) 2016 Kai Michaelis -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include - -#include - -namespace Botan { - -std::string SP800_56C::name() const { - return fmt("SP800-56C({})", m_prf->name()); -} - -std::unique_ptr SP800_56C::new_object() const { - return std::make_unique(m_prf->new_object(), m_exp->new_object()); -} - -void SP800_56C::kdf(uint8_t key[], - size_t key_len, - const uint8_t secret[], - size_t secret_len, - const uint8_t salt[], - size_t salt_len, - const uint8_t label[], - size_t label_len) const { - // Randomness Extraction - secure_vector k_dk; - - m_prf->set_key(salt, salt_len); - m_prf->update(secret, secret_len); - m_prf->final(k_dk); - - // Key Expansion - m_exp->kdf(key, key_len, k_dk.data(), k_dk.size(), nullptr, 0, label, label_len); -} - -} // namespace Botan diff --git a/src/lib/kdf/sp800_56c/sp800_56c_two_step.cpp b/src/lib/kdf/sp800_56c/sp800_56c_two_step.cpp new file mode 100644 index 00000000000..1a1bf4008dc --- /dev/null +++ b/src/lib/kdf/sp800_56c/sp800_56c_two_step.cpp @@ -0,0 +1,41 @@ +/* +* Two-Step KDF defined in NIST SP 800-56Cr2 (Section 5) +* (C) 2016 Kai Michaelis +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include + +#include + +namespace Botan { + +std::string SP800_56C_Two_Step::name() const { + return fmt("SP800-56C({})", m_prf->name()); +} + +std::unique_ptr SP800_56C_Two_Step::new_object() const { + return std::make_unique(m_prf->new_object(), m_exp->new_object()); +} + +void SP800_56C_Two_Step::kdf(uint8_t key[], + size_t key_len, + const uint8_t secret[], + size_t secret_len, + const uint8_t salt[], + size_t salt_len, + const uint8_t label[], + size_t label_len) const { + // Randomness Extraction + secure_vector k_dk; + + m_prf->set_key(salt, salt_len); + m_prf->update(secret, secret_len); + m_prf->final(k_dk); + + // Key Expansion + m_exp->kdf(key, key_len, k_dk.data(), k_dk.size(), nullptr, 0, label, label_len); +} + +} // namespace Botan diff --git a/src/lib/kdf/sp800_56c/sp800_56c.h b/src/lib/kdf/sp800_56c/sp800_56c_two_step.h similarity index 83% rename from src/lib/kdf/sp800_56c/sp800_56c.h rename to src/lib/kdf/sp800_56c/sp800_56c_two_step.h index c62d6c2af2d..99da9238def 100644 --- a/src/lib/kdf/sp800_56c/sp800_56c.h +++ b/src/lib/kdf/sp800_56c/sp800_56c_two_step.h @@ -1,5 +1,5 @@ /* -* KDF defined in NIST SP 800-56c +* Two-Step KDF defined in NIST SP 800-56Cr2 (Section 5) * (C) 2016 Kai Michaelis * * Botan is released under the Simplified BSD License (see license.txt) @@ -14,16 +14,16 @@ namespace Botan { /** - * NIST SP 800-56C KDF + * NIST SP 800-56C Two-Step KDF (Section 5) */ -class SP800_56C final : public KDF { +class SP800_56C_Two_Step final : public KDF { public: std::string name() const override; std::unique_ptr new_object() const override; /** - * Derive a key using the SP800-56C KDF. + * Derive a key using the SP800-56C Two-Step KDF. * * The implementation hard codes the context value for the * expansion step to the empty string. @@ -50,7 +50,7 @@ class SP800_56C final : public KDF { * @param mac MAC algorithm used for randomness extraction * @param exp KDF used for key expansion */ - SP800_56C(std::unique_ptr mac, std::unique_ptr exp) : + SP800_56C_Two_Step(std::unique_ptr mac, std::unique_ptr exp) : m_prf(std::move(mac)), m_exp(std::move(exp)) {} private: diff --git a/src/tests/data/kdf/sp800_56a.vec b/src/tests/data/kdf/sp800_56a.vec index 618cbd1e33b..979a68b7e2f 100644 --- a/src/tests/data/kdf/sp800_56a.vec +++ b/src/tests/data/kdf/sp800_56a.vec @@ -1,6 +1,9 @@ # Test vectors for KDF SP800-56A Revision 2, single-step key derivation function (5.8.1) # Generated using Bouncy Castle (KDF with hash) and cryptography.io (KDF with HMAC) +# Additional AVCP test cases are used from https://github.com/usnistgov/ACVP-Server/blob/8b2204159c1b31a3202ff415cc7a9e1058c35fc5/gen-val/json-files/KDA-OneStep-Sp800-56Cr2/internalProjection.json +# The test cases from the VAL tests are used. From each group the first (passing) test case is taken. + [SP800-56A(SHA-1)] Salt = Secret = 51373E8B6FDEC284DB569204CA13D2CAA23BD1D85DCAB02A @@ -2411,3 +2414,258 @@ Salt = Secret = 00A09DE3E7E8A6C552969A4A7E7BA0FC854425D62EA325FBC9DBF3FA1C198E794936CA4C2543408F Label = 76F3043FA2E9D17455E6390A405B97580297C77E0F9E50E65D917B3E3097824A Output = 00E92369E7D32619EE6987AB5BC606A727D32595B4BE4662BB4AF5D6E917DAAE + +# -- ACVP Test Cases --- + +[SP800-56A(KMAC-128)] +# Group 56 - Test 276 +Salt = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = EE238D725D6C7FE595FA09BD8EDE9F314366D85AF19F694E2829EE5FA04515164DB87D32414B38463B07F4AE565E1B9350CFA1D42A57CB6C55CFBD95B3BBEC89A9601CA972EF01E43A02B2BD0BBF1EE5BEA11A8CCEBE766A62F022432F7248EDC4FF6D7544DA356B5C6F92A1C12E5C7812ED08FCA8B18916D56083A75A5D54CDA374EB683731D2C79DC33D58D54CCAE6977DA08440EC62B068A5A617A1D22E9AC868ED8C14F4F5B37148E80B61F1BC7C78247A89F81C369101FF5C2DE5440F86CE9F4992C8420B120799A1767E63B0C5D38B5CB059FD3911FAB5CF1F06FC4C13BF676E11B69008D4D5D487312E3047D01F632A3258CFED3DB00022D017E0E68E +Label = CAD0A7C534CF28FDBDB47F473BE9121D6DE01554440736F1A5F12F5BBE140912BC419E12A96BA8AD3FFB2F566D8BA3CFF8B6981CC47709D193D641E1FD1091F6D74AB24836225B4AEB8C48A15EABC23FF45D1640BFC1E66F8AD53404B6933A879C8D022FCB972D0EF658DDABE694A6C7DBF87537982E84D97A7EE0643151A3C8382F3504739D376995AE6F449A61ED6A396556595C73B7D29275CD0301C2BD669C780DD4FEDF2D3251D1AA4F01164F4881E127EEB83F41460334E4A0CF893B40FD705AE9A96E4C60540F999DB9BA0777169D8C3D03BBD7F662B7434B408241EB6F630A088D65E50E1E2AAA8F36A3FD477F25231074ABA40879E84F8F7D6B8BFE9ECF40B601879C39AE01E8A7C350DFB146C0B6CC81E0BAB01A0C902A9F931007B2CFC8D0978D18ECFE126006AFC8E99B00000400 +Output = B8ED5E956C815E058285F356A377DF12C6F7BC1BDA74C9375DE20F1549754C2E3347691D8D5A45EFC024AEE93570C2CD4E5095262DB25D66566A7CA101ABAEA92DF5059FE87BA7DA7AED4C35B7A942E6378315921698041A0D23BD71D10AB04ED8EB760BD73B410C5019A48C6AE23808E4B4BD0D6E03574A9715CFC8C35EC7B2 + +# Group 56 - Test 276 (default_salt) +Salt = +Secret = EE238D725D6C7FE595FA09BD8EDE9F314366D85AF19F694E2829EE5FA04515164DB87D32414B38463B07F4AE565E1B9350CFA1D42A57CB6C55CFBD95B3BBEC89A9601CA972EF01E43A02B2BD0BBF1EE5BEA11A8CCEBE766A62F022432F7248EDC4FF6D7544DA356B5C6F92A1C12E5C7812ED08FCA8B18916D56083A75A5D54CDA374EB683731D2C79DC33D58D54CCAE6977DA08440EC62B068A5A617A1D22E9AC868ED8C14F4F5B37148E80B61F1BC7C78247A89F81C369101FF5C2DE5440F86CE9F4992C8420B120799A1767E63B0C5D38B5CB059FD3911FAB5CF1F06FC4C13BF676E11B69008D4D5D487312E3047D01F632A3258CFED3DB00022D017E0E68E +Label = CAD0A7C534CF28FDBDB47F473BE9121D6DE01554440736F1A5F12F5BBE140912BC419E12A96BA8AD3FFB2F566D8BA3CFF8B6981CC47709D193D641E1FD1091F6D74AB24836225B4AEB8C48A15EABC23FF45D1640BFC1E66F8AD53404B6933A879C8D022FCB972D0EF658DDABE694A6C7DBF87537982E84D97A7EE0643151A3C8382F3504739D376995AE6F449A61ED6A396556595C73B7D29275CD0301C2BD669C780DD4FEDF2D3251D1AA4F01164F4881E127EEB83F41460334E4A0CF893B40FD705AE9A96E4C60540F999DB9BA0777169D8C3D03BBD7F662B7434B408241EB6F630A088D65E50E1E2AAA8F36A3FD477F25231074ABA40879E84F8F7D6B8BFE9ECF40B601879C39AE01E8A7C350DFB146C0B6CC81E0BAB01A0C902A9F931007B2CFC8D0978D18ECFE126006AFC8E99B00000400 +Output = B8ED5E956C815E058285F356A377DF12C6F7BC1BDA74C9375DE20F1549754C2E3347691D8D5A45EFC024AEE93570C2CD4E5095262DB25D66566A7CA101ABAEA92DF5059FE87BA7DA7AED4C35B7A942E6378315921698041A0D23BD71D10AB04ED8EB760BD73B410C5019A48C6AE23808E4B4BD0D6E03574A9715CFC8C35EC7B2 + +# Group 57 - Test 281 +Salt = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = 8DED0C516EBF58E3BCF345D0B23BD81F7E42FF0C6228887143F8ECE3 +Label = DE5A05A71AA364646E0F9484114A99798404E770F1313CC58672E5881F331B581494EDB4653AF523CCF10A9A9A65F1892D8AFA9E126249F0298C4E91EBEA0DD0D2676461BDC01D3A54FC4B02A23639A8316CF236FE520F4DB4037526149B2EB812DDD656CC4A3B5900000400 +Output = 024637B3D8AF0793BC96C4D459F69DABC912EA9C089B3C202DAF9CA1F4A71075C3B26E7684590A38E97884D32840ACDDD3005684ABCEC6848969FFABEA6201005F17851BB7D9C7B0BCA4FB6BA5DEC93D71FEB30A43EA50A50C3A0E6E856E7F9775CEAEA7BBA533AB98E086A4163B4D3A69416BA957767711790D412931C291C8 + +# Group 59 - Test 291 +Salt = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = A21F3A38D7A80ED03020CF6C5C7C7B5A05A01A9ABDF7644105C797F61A1759D49B9561E94590ADA07923388C0EDF4211E1 +Label = 3D90EB7CA2CE04097FC8854988F468AC85DF664128CDD97B79EB227892A70738C60B8C8A02D89059A2D8FFBDB24FADCA232E6AEEF70292E10390388D0E729284544406CDEFEFE84AE739052E39E56DEA8ADFF841039B58E1DCB2FDFF124DE1ECE403684F52014942935C55520EEA67BE49F897179E3DA6DBD59CAFCB10E18802133B8755798D60FCB5D0B9859791B72024CC00000400 +Output = 5BD976E64565B3E01594A1FB9C84D19E0567D4450AE53DEC5C2D20FC56888A84469B8B9FA7ACB057825E1199B726393F766FF74F6CBD93BCF810B5C6C74581E9F79416914D2BD568AD573AFA53FA97A7A701517921E88A979846ECCB357A98BA1F17A40D7E0F12B95EBF1B0D8908A330CE20FBB82B41E9282E9E07D69B58ECD9 + +# Group 60 - Test 296 +Salt = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = 6E95F88F6726840F58C1670D58F66CC56EA0AD1F9C2D4D606FD097FF8E020904C1144D99574B3F0A12247448234C0CFC4107E89E2A2001BC2F50DAA730 +Label = 9734CD098B5965F3AECD563FD8409DEA5CF28846FAC2DC3C654279E695265FED839FC603465694D532D987435AFBD3F4C8FB3C4D8AAB31176866B1C7C9928712C6A4301C90294B870B87C0AEBEB768E068717A7EA9479CB4BB572D92DD4BBDFD147CA64E012FA0A7E8F79780F700000400 +Output = 0EA4FDC86D133D80009064FC8485FF2FBFEC4C107DE012EF930EBE52845FBD216D3C18A499657B3151206CA5B25D8F2A2CFDC68762DFB8B9A798CFD7BE10E331B3820CFEB093E8255A1BA49A95FBF251F502B86144D4C32F89800A626EE376A21788513045D1564E4314BC1E21A921A2D7CD085EC682A0D2069FF80A7B169B1B + +# Group 61 - Test 302 +Salt = 7356FE840C258EA20981060A937BB1E0AB704F82E6AB3821507E6A12EE83C2324EBC657C8F490349B3DEAAA97DC55A764EEB97B94523F4D9D28DCE0F6E4180B42A83CFEDF200CC422994A6DB850BAF1E8ED8546F38ECB51EAA577C5C8C2CDE59B930B42CE4E84FA35BCFA6FB429F314FEA5A3C4C9B3AE4DFAFB4D641A32712CF8FE87AB75B9979CA25EFA91CCC65D2809920849EFC6D4134E70FC55DB2759204EC726014 +Secret = BC8249C78E38A969C8B7B199B6E58F0F898A4FE5792C5EAA0A10AA94B86E75E397793DADAE37E222CB7244844B7A402C4428EACBAE9E93F930F7FF705B75DB0C3CFD13F612D438 +Label = 20CB706EF938BADC6FCCEF741188B735D3E5F91825A16F2F82B0707B55CB071977B72A4C0B26DFF62B21D33BF43E00A1224E079AA84A3F2CAC11C521D5989909566464A9183665C46FAF9110298763DF9E0D3584DE5F6FDB61438271EA4FA6BD31FDC2571E9FAEBCD50747D0FCDA511A7D389DEBD4080B794F28123437EF88275EB9CD01260E8EB489436A7548FA794B7B3B5A30739EED9B510EB338F36A0AEFE350D761A2248368856232919CD2880260069E41DE6C77351B7026A9771400000400 +Output = D38FB5C340557509190C4B6EDAE21243F15F7BFE9EFD55433363E1444D0721BF71C94C9189142306672EA3C334E9EE0685205547DBDD030E33EB67B91030EFE47737A318A88ABA37BD02B004FB8FF852DB58E33822F1280E1F0DC7812158CB436E8B00BDBCCDC083C9017FF229132452B0E21C455E54FD15FB960B030F05F13D + +# Group 63 - Test 311 +Salt = E77151A2BEEB6BC5C191C19EA4519AFFCDB5ECC26E6C27F84650BEC9A29207BF8DC2B4DCA8EDA13D84EE6620F3122B60292EF4A98B92019C4DFA905F28EFB328B1B4B1D0B1C32DC25F7755700975F2D7AFE7B955BAB8743E9266A0D6AF00B4D95E6F95E5E9DB47E283AF62FFD19403EED13F60DDC91297479A9BABF9A6B171C17726050C64C4160FC4826752000FDA3E60468820C22C00647CF9AA00EB0C64EB01620FAC +Secret = 0E0187FD20BF38B59708DC371C55B30635B4D82F05507441552849CF01AF912CCD1620832FA883D29AA845C899C6D2C9AF3B736B1321BC2F85B6A6A392D25EDCD075FEEF1E6341A81FEB51C27FF9F8FBCCDBA25F8C62A2CB053E +Label = D3633559602209C9761441449C96050AF96AA2F5535771AA80E039C4DAE654A6855BBE40D0EDD3E9ADD0DD89DEC3885A1DB2FD415BCEB6C2C73775D3CACE86F6FC5B03F5088E43B4E19C19A2F74AEEAD5197BEAC43315F8951C6CE13A2B485C672D4D3CC70D9F1DB5F4172BA580789964B17884F95F9CBD02873B6A0404AEB3482B6377DCDF0264C340300000400 +Output = 0470B2A0146B20B828816D0FAB2DFC8A7450FE02225D7DB513B6510B0D00DB4A37EC3D2A1D0841781AAF8B31B78787961991964E9A8A70A0B317A27F0821F5492CFF5767A31880BDC2061BDEF800B080846F9661ECD71B687603E7ED917A7A4E9F1685A02C8CAD5F076D2904EA9488B318920D62579CCB812DFB0A4BE0F15FAB + +# Group 64 - Test 317 +Salt = 18B20983B8129EAEF7F170DD21E48EA7202E2CC200A216D6C55683C848FC8CC7C529A436B7C26A116BEFE7A92A583DB6EB08F3A3082BA3BCE8C0462324099EDE9A9A355E9A7AAF14D234EEA45FFE970B79A7D2E6DB2662FA873EB066D63C46599447A7C164B65DBDEECECA6A262BFB98271C606A623226415C9A15F8379DE29C9F15CF5A97BF28D91134180168BE949C37E804B9D9E56E63A13E818D906EF207CF3228BB +Secret = 2A99049A57E807BFA710A23BE5A8EE44925392E73322BFF71740667A +Label = C732802CD5394FD196C780DD27A5672A4A3AB06CE72817EB5B868A63CD429D7026F27CE97E72580BF9E17D2DF5BFB25E00000400 +Output = A4A5076F8F957577D61E60548EF96C14B6CC6DBEF1DA0A78C5B4B55A55D0A55738B4187815C562C5664D45C049838F06F86084E40B067F593D9DB73E490D2D2DF80655AA340600726DCC3D0F5CF02905D65A10F338C700B90D4CC71F1F39C1825DD156259E34F1050BDB268D8BD068003E502458198B1E24F1BD7F4FF6BDD59F + +# Group 65 - Test 321 +Salt = 01759CAAD35E0F2FBB2F5630B982F28CFD6979A6873475C8DF093A007A71066E9FCD916BDD7C1E39CE21F13B8C924186FAA4CF5185ACF293E07A27F298DE50AD6AE2C2FA08EC30CDBBFE527AC8564206FBD2DECA1F705162C89A570E4AD938209BBA91CE993C58D96FEEC2D70EBB2D388871CBD0FFEC67FBB15B3661C5A0BC7DD56135F68ECB77C7A2DEB7866C03BEFFFB1DAE06570D82D1B01F991003FBB726752EDACD +Secret = 7008DEA773FE9C10F2FC4B2A1D9EE895FE69917C8136F8629F1E629A6232002B3435DBF04BB6D7186F140F78517FB5C02799BDC5C4B3384CF92A5E4B160C24 +Label = BA2956377723DE81BD171B4B6C3A5C7D86F292D87FEEE0975D8D368AC4987E028782BF90FBAE5744C88DF313138F6AE8ECF98FE44AC0B874EA34FF29EF0677A97D1A7C5D4A86415A5E74A5F8FE7EC5F083F7AA64FD523F04DF0A173C08B5B8CA7929E43F8A9491F05A08A3EC53D4259C4CEA854EE282513B8F6905AA09D53A589F895E65029E6A1E9A905DF6B3E3DD1AE44D697F829E10DF480C3B10243936B4593851D1AA3EEAB56A07EDF2629A00000400 +Output = 21162586192320810AD43D520FF361FE43494A321EB9CF27D5065B1F17BFEDBBC33A0683108AAA6457044BA7708E493F1065E87DF02CA82A7D709F2A3FE1FC6BC047B0A4F047BC043EC1FF337BE4CC3D136BE46114914A7C03A215F109809F629BFA8B5CA235A2686DEE37523B472476AC7CCB3BEA503AE504D26B785B6DACC7 + +[SP800-56A(SHA-224)] +# Group 66 - Test 326 +Salt = +Secret = 8EEA34F09903CB883C38EFDFC60C8C35A70AF4D780EF02889993DA7C +Label = 835B3DB927E31A6F67254B3BFBE356C346236367C135AECABBD7CB186A376F23B931FB51B5698FA0BC685C601853A8F9D7B0FB1F05C9481D0DE2327DD0F9646E26068107017358BCA824D47600000400 +Output = 765A10D4EA33C22391CE5312120ACF0D4F97E4870ED8077B725ED11EBB6CED82B45040A3813FC7687626EBF46A12F25C784EB0D9E77F34E2C2733546BD5142096A11DC929DE60B846C73CCC76376DBD56CE754AFBBA5E9CD6D22DF5E9B8503E5B149BCA9EAEE9D8CC10B38EA2AD8F3D902A948B24163739B777D49711405CD12 + +# Group 67 - Test 331 +Salt = +Secret = 44C97E0F65AE26389678E5B62DBB0869BAC3EE41D33662035CF66F5FC23E81F4CAC8D3516D530E1A6F511BF0DB1631C98BB21F70A6A3C8171BEC6373C8958AB268C0CC5F84941CD93394E49B4E7DEFC06938F54CF1E9B5962858E5892C41AF54EC6A6ECBD69B0181FF10595B39F070007690B477EA761DD68CA2FB85151BE98DF01E8CBE7E66501EAFDFC30EC0423823DEFAA516CF9F727929EC3126B9B160C31F1A9D72144EFB1BA683165CF046C3BEC8B53676DF09A78E91A10D7A81F7A1C63CB455830001D91571841F762D031B3666B31D5B779D78759D9E74ED636CA0C6FA44600B7D2971E611AE13577E452C058F70E622BD9C0B9DC0D3AD71E8EAC384DC9EBC5A09AAA74DD5DBF8833A38484A0F5CD827F17C65B69E6AB5247747C209314D8FC6903C626797D79F2353AA0776F824B9AAF3F5D26B654C966C113F2574FE4B2D41AE406FC907CB1CC3E8CA0335D6C7649CBCC1555F8F3E07FF056A32B49B87ED56DFDD3D5CC0756B485461A96C4C9BD644F3C0FCECA20D1EEC9C303E73147124913750D0AC0B575CB8ADF76CAE2AA33044DD4725 +Label = C01925A6B08949B31D2E1940C10FD3102C2D7DE58DD8B93B592BEFE0EEB1D8FF98844D91C13989A7090F149B1848049900000400 +Output = F8C172DBB82363FF3A0AFAD6A8D07AB73E1E7162ED02DFC875A3BFAB39CF07230D45D27DEC2F38753E6BD1E979010BBBD760DF7A2A821F5705C1005B73742135622B5262B57DB1659E563CD66FDFC4B4F383A4747568689DBE90BBF9AE822EA29F97C24CB80ABC56364E2220DBA836EED2599FA04D3B76CF8FF5AB297ADFB4F6 + +# Group 68 - Test 336 +Salt = +Secret = F63BB57F7B2F7BB5406D06093C8CCE09475BD03B61299DAEE5498015CC1CB91737F5F22F5123C8F11F777DED856F09EE +Label = 8DB77B14181934E86A06A344209B2CBD20E415534FD789BF6E78EB5E5A00E23E62F965CE519916DC4B102EB8666147DC00000400 +Output = 58D5546BB875A4E669E1C244CD955A08101EA46B3E67E65E50A451D1060CC7C170A973CE0D744C25C887EBEA49100115C5D638D6B35AF12FB61AD27452DDEF69CA747B71F7F592D1FA4086DC61C3D2775F8FB0552C0EF9ABE05228E77DC02D0593F120985E53055E25AE48BD9D030B32619DECF846C8EB5BC2D2C4944867191E + +[SP800-56A(HMAC(SHA-224))] +# Group 71 - Test 351 +Salt = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = AFCC8BF1BE48A39CD6E9581CD5DF3EB5C7F2274259589C4EE6BA493C9DF272BBF6B23E49 +Label = D6E4EEB1EF44B834778C4488C9A5E0E889ADEB609728A58A3E8C08ED75817F66D0C3F5FB0198001B8963D9DC5F0A211CEAF8B6C764B08E3DF408D2EC1EA68A4FC16AD4C2BEF6B176522F764AA0B2ADD97CA6C2F200000400 +Output = 2AA4A2BBBBB6467B66C3BFEF60AADFBBF74EEB5B1F626AEC92AD29F3253DFBED1624F828A74744A5C215B60CA21BCF99A08F425B7856439ADC222A92FBA8551A93B15F888E72E93E37156CA88FC2B9BAB0A1026E25BD892ACB85B5161440E23DD05E16DFE05DC6C536C93060AEBE99785AE85575C78DFE4B2A45C33EF9CF5149 + +# Group 72 - Test 356 +Salt = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = 9BFA19A545562DA91C2E58F58B60B5583E1658D54C0C260E889C626BD6D4DE263BCAF058948D7C1A64A744AA8BA3800C708E563E8E046A8B53AE33C171925061D9E4990B6D25E69555E7D9B79879BCBB5ED3FD2736B70AD5D55D7E7B22D1023E5EDD24485FDEE06DB58CF699D940E9D129559373D1AF3EFE2CF8E94D939C214C80B3F8814BE610F147CED674B637CEBFAA1117441E83F2575E6F2F6FD0273C8B01ACD0A70094E2419AB1F6C3069D6E5C68B974CF2823F8515BF8162D28AAA33D91DC12249337791FE0406817D44D4F749D581A7365CD6814D163DF79B3C38102C8CB1056120BB4832DDA9D9137CAB53A72C9F1AAAD6C09A233243047BAA7F97ED1A0E18987C23E8E02C8E06E709B3801AB9920AD4153A2AA559818509AB74B0E480D2C70CB60D4937732FD50165E3A4B75CAFE06B5428CFE10ADEA5B55B6C10018F7CCAAE7ADCCAAA0D6F0CD51B3573FF36D075BB7640515B8141E970B746967004F036E9D2EB97C26B66BBA5844122E44F5D0BE1DC1501C656AD8A12AF2610B904811 +Label = 64E19C35C42C241D08806A8090B54889C28F5A38847C1BE4A904B7816068C8A0AD58A69761D6CAB0E472719E0F13B9CD936DA889C330A21CA2E4ECF0A9E10955635C114DC2054B95F4551233C88DF0ABB0BCBF49A428EABFA5699CAC6BBF05F7A53A2C00BE6A8953B64CB1AEEF47863F9158AFAFD9AE90905CCFB74C5801E2A503027A4ECD8103606B98F734B8468E5DB5F5AE4D6409F92089F981C1CAF5EBAE816AF47EA43C353FA614B9D2CF1989DD91824144B0630FF8801F8B02C1A974256BC74E42241FDFF7395FB174027A4014FC426B3F1A5675CFAC189D84336F9E5789BC4C0F2E8620FCC15B9A2633BC111DA3BE726001FDE1B7D67CC8441CA053D485E4301397E4D36EA26D3DFB0E4C4C755DB9248644233CB9D0E4F301F5C36AFE57A9727F316FD7C844B6833EB7B19CCA7EBE07869FAA7EF76462836FAC172426ABF4ADAA17CA336540C331C21BA01C5354A0191AEA15F304548A4A65D4188C75789FDED404F06B97D8F29C92AFD282AEC75787398D9DC68AC9B19B82610B57DC56E0949E4EE4AADCDAA7B7B0A0BCB6EF0DAC702CF5E2560C3D2DB8AFCD453E8FA23C4FED6B92E291ABEA0CBEC012DD404FC48E00000400 +Output = FC50F70FF9AEFD4BBEBC09FE39E7D362C3CFD42A89F83111166A7288D66B5CB11E7486AB03248F86A02D802884BE27882A51F458D6946430C0AEBAFA539A33DBD5CEAB71B515E3C3927B83E000B820AD873C70A3778D064AC076C50CA37B5D9A1986036ED56B9A50C1C4EFEE8D1FCF1D5F4BFD8D7DEB85C6483297AE6E06E260 + +# Group 73 - Test 362 +Salt = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = 35406CDA1260DA3902F458305B747189CA4E7E936A2066A917BAB618 +Label = 93DD6EA6FE348CB6A94356EFC71A928C7133AF7225440D02BBE989497DF67AA8142358B988FF81D08719C1EB263C3CA7553D59DA7A4DCDD917442078306E03A8ADCF1DFB4B610AEFA68A90CEF2CE2AF0DA9D6697CE4AAC39A9805EBC21F736E91AED86FF07D05A6500000400 +Output = FCB8B19802B57A99A895B8BCEB756BE2D7D95F5AA009BB86D8FE565D5E6AC082F0741155C50C7F70E37705DFF807E5DF24BAF4D35BAE712FBDC17D79925BC37B442A4B18979298997204C2BD1A8E1C4E72C5E3A3CF5318554BDCE5D683401EF7D197BEEDA1C7F637205512CD43FC9870DAC2877DABE66A9ACF49FED0A9CDBBFD + +# Group 75 - Test 371 +Salt = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = 0D14C78177E0FAA52F4E8810D9C8D0AE5A90D582E40A07E15FBD5204D6B7C0300EA50D018EF1D4D2E75AEB7B5E0B4DF94CC281AC01B8271B1555724BB3E1001ACAE71B26C11C70DC3DD73B0C251D37D20905E6D6D28A172ACCCF1E +Label = FFCD11A92266119895DD56FE33995337FC6475E1747CAB8FA647ECCAECD0AA81F31ADE46720A308871A7FECC4530E09600000400 +Output = 0F8B4A8BAF445B1933819A126D39A02F1ED4BACDFDEF73817524A9863BC0F4094D2EFB44691B8F36D78E03701065DCD72A768F2058240D7A1520B29011260911506C65152A6DC8F4904C9EC5D4DD9D63C905E9CB54835BF39882B60197C7608F4C6BDA08A52710B1AC4CDB50065B05821BA6A30854AA8DC60D30BF28D90CFFED + +# Group 76 - Test 376 +Salt = B7DEA92ED320AFFBBCE78A41D00B9F6F84E2A9E339646A01668F9D90A2DDE5408386340575785D0A99A8B41A9A98021E366042D2EF3A8FEBE41FA7302A48A370 +Secret = 80091A6C6053E437FD6CAE2503675A8799E9B7AC6DC66609E0C725E7CF496BB26FE4A1043241C3A78758E7D40E0F0E701E7EB3C7013AD8210D4DAD24FA6C90E440BC3511D878064DB1B8E645E773578DEB20535F2EAC6EA4F6797C398E75606E9ECF47659DFA9171DEE1736FDFCF9A8A873C995BDA2EB38721D20C69EAE52E2528C51582FEDEC9857B2D8EE2338F7702E3671EBD9B8834B3524643677F0D9F6CC3A7FF56D27EF1A5F934E40EE206CE643A8B778952F2CD281CE700F084C3B95F3C70E802F4B18E5AF070B068B1509B5336C72B386DDCDDACA9F40760D8E216A99D955F7D59042C65C4E4652F9F771D2347D9D29A6C56F59CEE41062116523E56A04FDFCE74E32C0961978F6278CBEEB0151EB21738B6F87C64D360860E8EFD5347DDFB8D283342FAF00B5165D3596F4EC715AF14A586349CDC0701B6DD1D14B3FD63BCE71AB6C6C532589D6C53D48466893DA32241FAB704C51643EEF875538E77A43A58BFF98C6B38F00F5D8AF9B21FF6FA2B30AC8C5737BB7CE1A721FEB641B5286605F47A60B56E50AF99327381A6BD64ECAFB709 +Label = 0124DAD22AD6D0C7B5991DC9504E200DF0DBEB206D042F474B37AF695B4FCBF35CEE7466D202974CFF0349E13AA9ABA700000400 +Output = FD5B8C05E2E54762B694B400CA4636E1BFC1A23D8C156F3E8CABAC1EF40E774985A5571B832D81F62BB3007F6E9B1E0122537E90A69CC16BCEA727560A2AFF90DAF80EFDE17139E723485F77AFF0BB98F2C86D89733090E0EB81A1E1C39D4DB1D4C92ED06CF6F42D2CED2C5E02B582B1A79EC2CDBACE2C8CFE6846CC9C5B2B3F + +# Group 77 - Test 381 +Salt = B1DF56F5B2E9E4BC0BD9A05EFCF90BEA9A4ADB6C94CC52C9701BA4D886B77EF4A8C189EEB438DCBF7DA7FE16D832D976F18A4026EFDC133ACD0A2D8FA861640A +Secret = F3CAABA5544AC48FE2C99D92E3101332C30EC1BED1190389A7FA3452 +Label = EF7890D670FD75DB70CA49A7071FD49D9C3D27F2E711A2E138411A73737B68BB8CF001D8D117509B4656162639DE02A6E98D21FC8C571F05D3A9D916F976E62449B52021D18EC2AE8667F0E200000400 +Output = BAC72CD2E673EBC880828C03FFC2F9724CFBE3C6CD37DC1B5A5F11F94CF3DDD97A02FA9CC67FFAEA193F2D5836C206B86CFCDCAB1B4A5AD2C10EE1412BF53FC5BDCCCDD841D0E6023606B9FFF996741669AD9F26EC48D38BD4E1E73215B8BF2F852C4263DF4F4863D6137AACC9A32210474A11AB8DCFB757BB430725B2B1570B + +# Group 78 - Test 386 +Salt = 8044263F08E967266037ED95BA151AC5E48B8326B8C74207C0952CE42756060947B3BFE244877EF4FC860374EAD714BC603A117DFBE47D40276AC787DD63AD64 +Secret = 915724050A7E3B859DB329149188ED46FDE1808C437C01F6CE1CB1F9A9C87EA2F270D6CE3C31E3167E8F7C12BB77F19DCA +Label = ABD86CCED27BFFF6097E0A36076A718795F24CFF10C4A8D5EBD1D77CA79D1678F3DFC3B912B252DC24379943772ED208E948399DA2646CBC9C1C6F8139E376CAEBA9D1C91132BE242ACB78DEDE4DE0F533EB8C28147222B0C386B2C8B27C81146728CDB9CA836BF23E506C354FE8B96F9CC7C5B30FC57792B4A7203F36CBB7893B718CF9E309BC2F5CBF3E31A831A3F6094900000400 +Output = 08D05BD3333B9EB46DDAB94C8DEECA4F63905F2FEC469AD06C14A5FB6CFEF2AFAC197DAAD7DCDDB4633EC4B81313A09F72DE739A40A67C32E5D860349225CDA07B17F091F062AF5334599AC28D32A727CCCE192D9D55326879C69F1F724B44B3E023AD2EA479D5C42B6C4D42B175A595D60A54C370640DC484B6A03934CE31FA + +# Group 79 - Test 391 +Salt = ECC88BD1BFE6D47ED8C5FA8179520AE14BBE191B0C6097879427892DEF717E293AD8B87AE89EADB23316B5A3D87F36AA94D2C50A0EAE21A443736F6C9808958D +Secret = 7CEBD9EC76774398569CFC15FE8622F334CD085ABB657147E03C5628A57D0F72BBD3B6BBEA8658847ED04DBC7483BAA8956B31A2FEF73233A6C373CEFBC268A3587099B82EB85E65700752EE99180A540B51EB0E2067E3548CE57448 +Label = 69D300B0FC9FB311C928C92D05DAFB037B2415E74A2CA37D526DC5B4938B3C5F866DF3C6DEE40D277276A5D53098F652957EE5618F3355DC90C42DD4006D6234506E19C79BFD19CA708E10C3C9C02B75F3196887D39C348B59DAE3C48AB820A73355FCE3C9D250FE06B8FEC3BFAFB77389B78C201496894C52E29AEBFB1F836E52CF728034B52D803A7D1E5C00000400 +Output = 0E1F5DF93269E7C8875D830819BBF7096E5627264B76C7B221AB8BEC1B8E772841A75F0C65020365F922531488C20DEE838DBBE1D3984ABDFC9CFBEF23A277DDFA6198AF30CF03A058EA2A26154F09BEEFC4FFCA13363D6ACEA1B84D5EDBE4CCF917011B6514554DB60D9F3F5D427166E0FAE30A6462723B34775A2AD403A41D + +[SP800-56A(SHA-512)] +# Group 82 - Test 407 +Salt = +Secret = B101B69CB561D2E5D29E67674B8B1E8D58E5B1E143928DC11EED867001527B5780657509B72E1702D7E216F90227A03633FF0C69D9AAF5270A6ECACD64A9C7E8986A8EEBC2518C654F8B8B38BA972FE9BBEA1AC93B13C20F51385B4493678E621AD09132105B204DC9477D9BB9466065B25D34F20BE2B9299C9E47 +Label = E39F56ACCD26447E1AFDE246F0DC26AB51F69F836C4108B2B0C2FEB9EE81298F8B0A8237259E1C7FDCF0191AE9EA2AD500000400 +Output = EAF5C5BC4A7771B0361F62D418A0F8D0415C66B60702C95C3A6B6F6C2302AFD3654CA7D7C2BC409E41296A9F4F235D2315C70DA131A0B7ADCD40B4FA20064D4FF2E8AB47DD8B0D9A4B7BCBFE0FC49E697F8262E4BECC4F71E1281E5F3863AD13F30FEDF006E30E37D45BFBCDB730A63883728EE15DF63884EB2B6B00081146DA + +# Group 83 - Test 412 +Salt = +Secret = 9AB3AE9941D27371DEFF2E2D063435D8FA8ED5C8DCDDEC9F656CAD08831102C7D0C74ECD924F177A61A7E342986950831E39F5CE1CCBE5E88141E9594CD419C242C69756B75411EF5CF294C2C56DE04FC5FADD9DD4448D671D0521A43F746CF569 +Label = A9AF78B9157DFBD6C912AA3303EDA2E5A499CA0656F804E3D515B5E3CC55FB1E38F0CC2ADB9411330298A3C01997BA5555D819D8CD6158ABFF010CAF484CC639557159DEBFC5A45C05F3090E9B158B2CF169659F7E66F8C27360C31CFC8871ADBA6A5A5863799EBA77973EC624CC0BC21E0837B9F980A3B0C9BC585D801BF444B92DDAA7D8A93529225E202216C27FCCBE00000400 +Output = 219BCE917DD2CDD07EF9B28D5047441AC534E8219BA6FACDA17489951F0A4734040A99A7087AEFEA272FAFC4C5B34E58107DD08A95E477A640CB6F08D09912AC8E546A4E260568321A9C8ECECACC759A64CFF52519FB41A019F3A006C6320770E33E04D1AFCFD14B80805361A27C22B2BDF7CA3F747DFACAED81A7025DA3D56D + +# Group 84 - Test 416 +Salt = +Secret = 1F8775E1BEFA9ADD5095AB8DC3E17728666979FA0C0594A4043012856BFDD1C1BCF8BEC96676F04BD815F82A3F1A6909458CCD428BD393DD51DB58AE4572F248C0EAA72CEBBCB433AC05CDA0E3E5805CDF57F85E4591AB6424A9861AAA9C50A6B5DC10BF7748613DEB13D43738B887D7F6024B9619A824D1A91F744CFA9F47803C06586ABD765F2BED11076A62558499F580BAF11D8DAD0E46CE36D6734F4EF27D378DBC527D57B1F46923C6B76B9FE0F6E89B4892C4B7C9C3AAE81528539410D7BED502367A8191C84CB6D55670B92EE45E2A076025B15239C337D30E20FDAA3F7A36709A833F21F0FB6E4316F18DFA7EF63625FED38B0E2F6F86759B718D3790CDC7E46B37251A8429DBEB34E1C2BF +Label = 38D2459C588E77065EA2A8BF9EC34ACBD1DE08F2969A1638F7BF20D071C9179B66C93B301C6612623F8D6AAE9CB4CFFD403A79362EB9B625F254FE0184B00074DD2A5759E895D2DAF6225238BD730D6FC56FDFA562D65FBE2223C5EE41098592C52822A924956C1FDFDC0C8D77D948B8433F0B0942C69D00D37CEE55B5B2B702AFC911062B50AFD178216BFFD6323A11787BA1F80C355BD72E4EF9D466E5414BDCE2BFB2EBC133E437173E9E9DCB4ECD50553AF6FE93E56F7CFDC85F34E7E8B6BF09CB25FF8B66B3729F8BF2A4D7D4F7AD2EBB4F9C0154A708BF3D5275A684C309E37671C3FCFB0BA4D6F8533BED2FB94F3D05B8AAF29A367B8F21FB960B896AF2C6E0D4912334B3E766423637D03629BBD45DFE10768AEAB70795F8AFE271E60C2F237217EB8EAD3C162F35DC513D1061C0F498819881B871C4EB2FA4EDF835139A250137F4F2BB5B2CCCA44D43F568824BA70977C05528653AA1B82AFC033BD93FA02F53B49F6090A803A0B6EAEABC9DBE04C340C8E9B3C978B6D65582635ECD838E38009227860EE7D161741EA11C11F63B8E5BD0BF6877A0C17B3BAE48610977BF5806FCB3D84D5F94FF3061548AF3F2859DE46DD68CDC9534B46A75E6A3E701C2C8A9950E969420FC315D9BFDAC552CF022523063CB4068ED159348F84990F29B2D0DA9B7E314D7CD483916F5C9AAC7FC62BF7795832FD0726079236E626835485265A874518FAF99E7B3929CB3C9663801AA607FD84401D582FB4693AEBF81DAD5C9BE30E3C9A7C33E50DA8405526EA60CD12DE3420A1211968B3DF952EDE9C23797EE2170730A2E8DA38AEB5500000400 +Output = 7980F8AE72E1F269EA918B383D60E90FFE1C19EEE98914748C47948346046C3432F217CCE2CF1B21CE541FFDAC486B03E1258BBFB261E8C351EA1D772FB8944405977C89723A6F69C11A704AE476CD32E2F9D1AD7A51C74757694E8CD958DC6F71681E2ADCEF0367764CC35125A2567F7378A5C4AB8A37156AE58341B335369A + +# Group 85 - Test 422 +Salt = +Secret = D355449432FD6676EC29719E7064C00C9CF1AE9C5714101839706225 +Label = 7B63E969ECEF758B7AD04BCD3E6918011FA21103F006626B1A68B4387E676D8FBAD3A53E65BF0476BFF84E7F11CB6D3400000400 +Output = 5C3A5CC8D0B756F99259FC71D88C660465CDE5DBB729C8CA5BEC864993131D2D7E216D11B9D27D888D457B3BA4377C81FDA95F2380136C9F1091CC876FA113C53463E0AD02B86C505A318D6C38504E0A060AD70E9D9A883F5B2BCEDAC0AC48696696EA182C6F4E9E36326773E226C736D38DEC125B891A50D8AEDC008FA5C7B2 + +[SP800-56A(HMAC(SHA-512))] +# Group 87 - Test 431 +Salt = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = FFD84FF5AC5D2662B979D61D3BDB644C839FB329C1D2E306AF0B39C1FC084D33E17B7C299C0BB632EC3D +Label = 8D4C8211D42BDBFE9AF3BA5EBB7C01EC7EC27CBA687B62C8F1190192A5877C3F0BB6B95EDC9B9A4FD45CC43FA1C44F8700000400 +Output = 2F5F9BC18CD76AB10DE6F625FF98F47928FFDE11CEF71910278426FCA26E7F42AD72644DFFE466CA4250C3F14DD92A32165F7331F71C052695821DC6A3896F51DCE83D207D2F4BAC2DECFF45233B5C5B7417B5B74736D461914A2A4E1E237AC8CE060E6AC402E99FC9556502091C1FFDB22D3D9F9E339C3511E01E009FD7A7B0 + +# Group 88 - Test 436 +Salt = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = 1E61023E00A7E8F993CC2752533DD42C0F045DAF883AE14B737B8F9D6D5D2CBCF1C74854B83891AF75C4094AE3BFEFC7F7D38916C4C19A66B5BB7792575DBE9C170B124204CB00981B217023A19706EB0DE7FA2BFA44C803094D20B9D1ACD1E6E7AAE2EAABFDAEF2FF835A8CC4A4B3D575493F2843A647F9F6BD40B3BD001C76AE35C7556D7B354D0F3ED1413DBEC14900DDB9EE237F1BAF005066E04ABE30D1C5984B86EEB4B32F3762A85F5548495C9E8A71EED1E20EF9BBB60921AA6CAFB89D2789871B5FD472CC8BD03279D7660971114DF976CEF94F2067E5C3267FBA07942237BB51BB6EEB84E7 +Label = BCCA312F60A1792FA1657444DAD4E3DB52C53CCF68984B73375A662CEA07D0D3E7A964712BDEA2A15EA9DA6877E7EDD8FA447C70F85A02856937D6C1A13D6A6E3E65633E98E155B1AB64520C7805E1BCF2CD27673616634AE7FC5281904D05B1B5536D58A3E0A522ABB3875CA5EA81BCB8670EA7EE20C1ABBE061E3E03016532C0F8F6FAC2992301741687F8C22151063A5682F57FC6A9AC4D30F1C7E21A3833AB497EF7F0BC123A5C8E6D98CC0FDCB0CE01583B34107B3EEFE7B6D5D48090E2AE54079ED21F079392B706FB0598930405C64772FCE687B3E85016F84FA5F2628A73306014E17615735522BCC3648F06DF057AC6E21A55DFB41B8048347BE8B474CA5F949F730A7F8C29343A6BF70AF39CAAE5312CEAFCC8D8FD00000400 +Output = CA8C5568D866C5797CBADDBAC1995A5CC59EDA1F361372B527E761ECC85C043389014FF4DF2906343AB7D577B9AE72C06224B0556D157D7E4AB11D159111ED180597931D9D49607230D7EB345D597414C6A945E96A154E116CE8DDA7CA0DF7166CA34650EB14F464C845F7A2739CB8E32B899E070F7BE676CF8F980BE1D68123 + +# Group 89 - Test 441 +Salt = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = 247689A2726AC1D49B994EC18976937E5F98E9F044D0A38296C39EA9 +Label = 6F385CD8698E5C2E7BBF1559A20643746FB2C173D0B76077ABFA4F991F8EA5D9966011CA992EC5795B4A6BAC2DF8F35034E79A9DC389A804E69AFD60B5FC5B04FCD43DDB8C42F5FA0F1227C800000400 +Output = DCC508B8FEB684C48A4672D68E2F1FAA8C3647B36E45A23FBCC1902F90A8EB6D89DC40BE67BB24F45C7D155570CBE8FD201074FEB9F0F23BEF9976CF5DB533632F9F7B99A1C17674176F1F8E1C0CBE11374DFAD411E32A77E09A1EC60D6BDD5BAD950F89A601F049AE345B36DF254BFCF2E78CA31F28899BE4A9CBE35ED7851F + +# Group 91 - Test 451 +Salt = 10A3B65465374651E1A9BCCD5AB16E039FBAAE2E572EBE2FC58D760A32EA0A09976A8E1DA3A0604983E56758DC1B45D369A061AF503E219EC059F5C580CA37480298E89F84D8A40069FE6D79CD7E89BB52F6D469320CA1800A13F547A1C948F15E34D765D698CA3E0A94BCF2BF2BB2B5A1968FC8BB967DDAFDBE384F16AF9425 +Secret = BE96EA918CFBB670AA89B1FA7F9D6575B15A4FEAEB9B4C4CCA9CB05F758B5AEC7696747170DD14042EED8B7E1EED3C142D382E58CFD95632075A6FA0FFE55E3608D0E8BCB193AEE0B21EC341CD54A63A3CB044D3C262BC5E5325041EBEC623F12F59D2C42879C5720CF1BB8B37A9580C782E6723D78D8FDB9410367705BAD26DAAFAEB25611F68A3D31C61523E516E899D0AD99034CDEC1A7F34E3901D998E6D43F9DDA632F51752BF9BF0C3A80F0F78A153109428156787A11E1B7871273FC4E009614DC910DDAE9F01A69B558D389AAC55B85D5E6E76A446A7B6 +Label = F02CA47F342B51E2BF9000B0E69F3F42B54401F031D222A063CEC3A3FDE263BFF8F4B7FC31BC7C08D28475230FE7AF997390CB5D906CD40618583D4A6F8212A0995E14CD897405761082F8EAB5F60B7ADEEEC481881CB50DC2407036338C8BCB6E2B191A618D883812537945799647898F71D7FA4D81CBB379765B11AC17CA8AC87281FC809AEBB6E9110354CF2F841E521D4EFE16533DEF289AB54D43714915A74974FDB499A6DD6FED4E8B71F34D2EC49F83F62C72D33D6F369627785AA3379D74481C5D48BDD5137A70E990AD25BEC12DA8E7A9E78AEF65D245726EBA58DFD7DF3997B20E5C6C862CDDB661390FB5A805E1D03A7B16D60BFA2BABB2F28C16AEDDB23C937F416EE7825700000400 +Output = 59724A00707A50665E36A675BC382A9E19ABFCDE2909E05C7290BB8D7B71C79607144B7E5F58FF03440B16373FC5CFBF3DD48B7CE8CADD131D9395FF62064F36C87FE307B18CEEE9D69C656E81DC4E3500949795DBC7C9256B80CD5EA448FA4C94786DB1ABF547C71317C2621301C4F9E7BA7636C9CB1498C86D44C831F7FD23 + +# Group 93 - Test 461 +Salt = 289CEF2C9CFB0209F5D5799202F9C61A485FE672D51FD197B7701C76F3615E5AC2CBE0344999AB6CE4EFC83B51CD939113D580804180D008D038C54767E7F9BD11CA5F968ADAEFC8DF28F2A627A2D07CB7845DEC1F702522616A0E39628A95D796F0DE22494B1571C19FF067A23273DF7227D2FCBE8FAEEFEDA9E19F4BB168CF +Secret = 74E96C89E130C8E76D2F514B85711AA969B91623749CE21E21E7BD05 +Label = 9095D99A8242A489801C7BCE5F12CC427CDF842937293EFFB5CFF635A88AD321270D86BC4AB334108B4F5328F8B297068C3D412EBFDA507590EF4B6BB506E9B083ABE3FA211D21B3E96244F800000400 +Output = 0EA11B0D117FF0767C8FC7856A723E5244877DA82A996EA96AE46CFD7CA5E26451D09193A1CDD41BD2AA818032F275CA5D482F80EE988A53DF1CFCEC3B096EEC0E6B2A858160F7FB8ED55CE4E9B8F8F47441E27E6E9AD632806E1CB7963CD427A335D3311FD945F1FF0C2A25B94D4E6F3E1E40072A24CB0CAFC348CF0FBFBBB5 + +# Group 94 - Test 466 +Salt = 1709FE54B1C2E80A2FA69D3159863350ED00DE77852304A7A4B51F2E5915F293FC5BE361D7541510B3F2BE34BEBD34001F6DABF2ED2964FA6AD5A8C6D29CFDEDDB5BEE8E8753BD99F2CCA0E91D6F7D4D7BF1CA5602CDEFEBEA6AB494EE08DC54DCDCA33B0AB0F2EAC3AEBFDC144E651F6A96CEAFF0D9C97F97F93F7A3D8047B2 +Secret = 423B5600844A7D0BFBA950045D454EE64BF5CA025C2D876614313C6D9A3016187FE1F11496FF5A2C08 +Label = A9B438838EE7E44AA1BB2FCB4C86E4296205BADB76ED9C90AC9D94768718D9A54B1013ADF1EF8E346CC87A83ACC5B0B4145EDEF6AFDC03EF2BDD88E3BAAD05411A4F5E219576A64C1FE8775120336367CC98B151D56EB228B700000400 +Output = 374A3D15161EF6E00AB062DA9ED12F736A7E80E179C3068EFAB55DC4433904C5C622878976D08C41E90CD966CD5B80BF7000C3FA9646B331EFF196168BD1A98FF60CB176B43049DC5201A3FD6F0980DAFDFE91037D4CF845B53D7C44E8FCD1786E50C35C73BCA49D4192AD30E1F72EF42EB1F1C0692FD9657FDE568900D7C7D5 + +# Group 95 - Test 471 +Salt = F61F34BBB30308A60E95B7BCD055E7CFACABA11D97A502BC8AD1EC8494827E5F9D3C449F514DBB44C2F36859EC327CAC7E1D00F31975943BBE85086F48CB9A76EFA3EF4D0266ECAD9FBB922BE0C142924034502EF96E028D8947053EFA5A00551F491B2EC5BDE1CE4CF9611C031D82C4C403C94820B9C00AD2B50BE33539A700 +Secret = 35C8E13B99BE70AA27ABD54E53A779D6B47A8718A22AAA20CC4559C83C70D8BB601B1475A6D98CD77D9B088B12F6EC0768B11AA460634B4A3E87142595EE462F37E7453FAEE288CF1EE87CED74E9A8E16BEFB782A00FA2A55BC3572FA8AABFF9897D74BAD757 +Label = D79649638506960A7D70E8BA79D442954F65F9DEE0F12AA6AE9F75AACBA5032FE23E91AC9A5891492CE511C86DFBCF2500000400 +Output = CDCD87F5C0C366D79A52F8C0E7A4C63E567B564B14C4FD442C9F57D90A458AE03A8046BDB1CAA46076A1EAF689359C1E746F05F2D5F5C5EEEB426E72349167DC57B6E24BC0D6CFB9A6CD7361F5438FCE0A5DF844906548A31A6360E944373DBCF0B288922965F4CA9D3FA5B3A76F14E062D0CC35D4A80CF32428E422A3F8A265 + +[SP800-56A(SHA-3(512))] +# Group 97 - Test 481 +Salt = +Secret = DA40F67550C21A259BF8407EDC7810D052B09590B416C79AD931F672 +Label = DEA60A6F6F5F2B62FB7ED0621C8BFDAECD8BD6E6E747543DCBCD41901DC6C2EBF82A9FAD438FC292CECEC93C86A364E13458B80A112FF083B3512B2B88850C97D26827EFCB4A30F48F4EB51100000400 +Output = 0C782E1A4A7F6AC5E928FF44313745A3BEC77D07E41C3A44E283E46B64E617F4F1F12ECB0FD50D13037486E0DFF46870B3837201BCFD3F2691DEA7A23D0F4C63C2CAA5BC4CBF1913744E005FA57980273A1871305A89609092C895DA6BA6D06F07319686C42B12353EF9075BF6E7D7B7EFCAD4EA634644BDCBB83A3BBFF69722 + +# Group 99 - Test 491 +Salt = +Secret = 2EBF14B02DA941353CD7B17200C438119134466A69D534465161D3FB02743A99EE6123BDC4B8657941F2D35C55AB52FA1E703A13197C4D527DD969932383280F33071E53BE5782CB4760E7B727B11FBAF4F67E2A846EA10CB4E2154784ADD929A9FA0D756646F09D9ABF82BB8901349220ED40FCACD10A41 +Label = 7D8499AFF51C8BC91B71B95B4340A73433D688FE280F5AF026236EC5D8808EEC7D11B78005FC20C30D1EF041311A7F7A0DA385491A8294C253AF3C0DCB522D26086FA1E7FBC45E53A0AB013DE52CC9F0D739D01637B34F1EF9B345634FC16F0F5CD56DFA0B57B3DDBABCFD69A18D7599128CCF3B6189FC766AAD3EAFA218109D15A3CB5BC5DC7DA67431A03329B9CC3762E77B605F84B327CE56917EA822D81AB4C96D7EE910AADF00000400 +Output = 9E471725BA6A1227FF680FC0AD0964DC05DBFE658F5EB9C1309C5C7475B4E79F468092EF968520234874D3AEE129181E3B388017B293EFA52EA65BCB2D90258853B909B23A997FD4DE3DD568407D44017A486B971DE83C1DD847EA972448BE495BB04F22F09ADB0F413CA6568B7A501EA5B4E5ED89803D7F9033B70D7416A9D1 + +[SP800-56A(HMAC(SHA-3(512)))] +# Group 101 - Test 501 +Salt = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = 5D1A8D1C9C0EFB15683DC9E4EA33A9B69BA81392E63423BA57604BAA +Label = C91DF1914CB8A8229A658A4D5E871C1239CCA1E7EF2D2EDD573A01430BAF0254082C3AC43CAEB3B5B3C868CD7478E4C900000400 +Output = 09FF0325F1D9DC711CA852A3930308010D81A58B09EFA5698DF4F4ED69F609554A07642B827A071769B26DA22F62759946F0901C0835DD0BF142562CF88D8DED60EBFE3D209B412BA1A2BF39174F213954FF0A38F440AFD23329CA7E33EF91EEDF1397DB21223BB23DADE9C9A4EB306F5832F8B2D03C3D8572CC36E3133BDFC5 + +# Group 103 - Test 511 +Salt = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = EC591DDFA75ED25F8021198114F59F353F56941745113D0E1CDAB569F3A1739F939CF60779F40262BE9B699EDF95F42D0EFEBC30D0357DE36197D3AAC090FBEABFF9160922AE34FB86654CC2F59EA5F08475FAEE8B3398AAA619B5AEEF89C70B5D5F3D858679A308ED476369DF23FD1645C334889B5949FD7E9C83C6B72243EACE2CE5F2B5EBB3B9FD9547D430174729E06DD0327496374351F2703A32A19E341C9481274CDD8315F6A81ED29C9AEFEFD7B56756575F7E505332CF3900AA611C68E46F20071EDF47C32792F3E68A +Label = 76202B71E494BD07198BB488452C2447CEA6565761D1791A78A50B1ABD31A1E0E3F03C325697942052851287016743B400000400 +Output = B83ACBF00945C424D93C28A8E696714D1A1A8C4688C6C7ED85E8A7F747302F1460780E25E7726E264CE58E1AC77EF923D97B0EE53870B2A8DF19367894ED5915915B3D79A6B560AA326EF2DAA357C39B2604F4D7A71159E379D80EC6E8B05F9311795B61AE9414F5C7E1B10C01999D23F31AEDD16B4475DC9FAEB488F2FCBC1B + +# Group 104 - Test 517 +Salt = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = B5BF1B7B67B74A819DD574B92393F0AA6814E8ECD3846E4BAFD4BBC4F61490E4F1A204FE35310C385F7FE1009B97827332E045138BCF64B9BE +Label = 51AD74EFA9017FD60F50A506238BAE274F73AB5D924FE8AEB76DEA3183A7DDC1AE30336C047A7476BA6F387F710D8AC900000400 +Output = 301763BDB48360EFC6D8D21BDFBB6E9CA212027A829F2FA36B7DA0529E90963F2FE9D54E94017EA0C0ADEFD880DF7B948B7B36D9455D6A81743DB3300249D4011C4E676698C9C966616D0177E7E43677546EC696E6ECBF2E1E44D3ABB9AC728AEF561FDF6D0A6F942F266ABAD47356EDDE0039E6F5B7500433EDB044F01D7FA5 + +# Group 105 - Test 521 +Salt = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Secret = 82B273643BC3A9BEAB86C90DFBFA208053CDC9562FE452102D5EAB0B04CD0E2B645927B8A65E65287B2120B338FF80DD81E414BE205C87A96A19C2A0EC24E0CB39010D7CD7A165678BEAB3B68DBD29EFFE972FE599482C72D6FF5A0BC5F0132ED7AE7062EF7F75B0C9AD06 +Label = 4DCE5DA9C4248891FF52B87AA964FCFC5F24F23C6028D2223276DF47AFF5F82DA09DC823E86246228861565D2D98250A1457AB1E9E20FCABE9ABE6597C17824B08BECD393A9A7FC6361F71C3D2864AF02BC95A28D8BEDB93651631D97E9508E7F73FBD320C864F6F8083DD79B362C11B8464EE84FE798BC5F0DABF8A09FF4A1499242693A1CF54194D59A26484CC6E25A03BD9C8A9A10C1ED35E0100000400 +Output = 60F8919647A0B4856FBAC2F0B639FF5C66E999F93530EE897D87871CF0E100FD7D8FCBD3703EAD70213500C09E99B5D79F3E25506F16B32313EE446D6E38BF0CE7BC1E6CC78D3C82E24E63C5DBBEB2068199C647DD8482FF05C09F75B9FA461F96DC2516536E26F605CADE98070835AD8B1CB0528165B5ABB5AB35A18AAFF15A + +# Group 106 - Test 527 +Salt = 50F9C0E592B3F8187717C035AB0B68AF59597BDE6A72FAD7934B1E9AF6A872BC7963F2F19246274847C2F76859226545DA87401313125443EB522BBAFB3FDA6F7F1958105043369A +Secret = FB8E519EFF1A7BAEC27C530AC5435AE83BE46FF7C61A4A3D30E8D77FA4C4B0FD765760124725F1E45B7E1CB0E21F8D3AC4FD0A603742E65CA198C4F1FED72DDE2D3629527E1EE54645A73AAC77EBD6F5D9D656D1A3DD33A0A9DE312C6C378B952B939CB91466101ACEAE3E6BE2903BD2C53028896C5872CAEF3EB88F39B4F484121C3CB2BE9C250260C32A15A723DE626D6BE161BB9EB268465A553A6971DDF9C4E68FC1F3A83DA791E4281FC1B8244578220017ADB86AA2DE305BFC43B7E788E2ECCECC6857846E828E1926409098A15699F1 +Label = 6D8EF1BFB5E529BF0519DAD117F2D5D17563B80166A5EEA462455846B03ACC8EEFAC7A7EA5B82C154F15A2E3273EC39537934EE4BED437F00AA5854130FA4D5AA5EAEA9A5E240AD25069524FDB97CD8AAE970512E65DE4D947D8A2AF8B7C7FA2647E7AF5C9722D3CA63541A2AE7FC8AC5510BDAF9DB2D820DFB30D8B61B108920B00CEA344239B6C47A2C5BF7DC38D54630360930E8BA23321BE1864DF74DF6BF4BF653BD42CB0B6A4CB3A3FE5FADEF718ECFF401CFC51713CA2D0F5D9403881E2AAB95CBBA54163447D905FFCDFD6F1B3F1A517F5C116AD1B20E0158FF533342B371EBBEC92E9BD03F50133AA6C921CB85FEA846BAB7D17EB8C27056D670AC48CB7FA00000400 +Output = 02845B9C7767ED4FC99EDB1863992F205C4E9D3B118A49CE883F0B12AAE66F962FDA7D4DEB66C0047C3B8F56D854611496E4DF130D0D126BE62AD7288E0B6FE75E1C5EF012ACDC116300ADAB727CC755F9D642F79C1A17BFEAD926845B1F5C04862847DE5F24A70B8B135DBA3178E532BA4148D32C995870E5A5C91F3454CA48 + +# Group 108 - Test 536 +Salt = 133D07FA6CFD7C71777353B796E6AC2BDF116DE6D53CF50339564C4B496B1C00DDD0208E30F5AD78B7B4417CE55ACD39100BD7999850E233CB38EF19763425B9EF39116420BC36B7 +Secret = 4EA1D4CDED9BACDD87E60B1DA4454B35308E70EB887341D4A5F519B2BBBF985F6543CABC4E77941F8DB3925AEF7EFCC1EA27EA4E5DF95A195D224482BB39901940FB9CA106355D1BDDCDE5E28D9EF6EA77D4EB4CD8D95B02E4D0F1AB9271ED72951FF9E6697495D573C328B8FB3FEA4FCED7F4A8AC263939E205159B0BD1DE0586E12177EDC5C26B7C977212 +Label = AA0536B86FC13C2870C27F6F250C39EFAFA12B1E191BD907A8386B2BB6FE93169F00D7077D05DE37B253489F857018467CB1FC2EC589B7830D6C565C1761378339D148FD8FBBDBA9DBEDB881C586799CD70A65E53A335F938FC366757C102E58763DBF9E0AD6B1E1973761241C464674E1D36D46BAADC0F86F52D4419C72E03D12D5C70CFA5B6F44501F92FB2BCEE6630402E85D4E402D3D49B9F9791B02002A328DF303AA4B77C930BB86E7EB0AB268CCEF439C9D13CA05D872577100000400 +Output = FC49BA9E3AA963E0B10EE3DBE3141B6B235870EA706F7D24E37C25B2B3A2A2C943FE48552F1715C36FDC13D451BC4BF240C40FA352D62C6FCB28E208BBF270EA6DB2803A4C4A6860B58377878DF3347ECB8DC8CBADF23956BC1AD91D12354D52F0BD250241A803ACD4BEFAC684518C85EABC45C93E6318A89A01261A27825CDA + +# Group 109 - Test 541 +Salt = DB5526039F980F30628B921991E457FCE0C279610A290A860D7B31DF7B7A469291F6DA0AD9A6CFFEB7500002F94E056BB96F449681F59CB560FFA96F96C781628E8B68964F116C24 +Secret = CF4A17BBFF7764F6B2DCC60C845545D7F872418A3AD9F4CA50EF63A6 +Label = 59FB56A6DE6A86B6EAC8A6FCDDD41DFAD806AA7E0815728AFD644EB46009DB99A9B295EFEB41E4A2493D9314BAEA8B9200000400 +Output = F1909AA97DBA9AA087B68A6050F26391106FF570B8A3585001AE9B4FFE8EB469094F0CEA8083D74F7F17C8EC48AF9331EB953807ABC5718E7D6ECC0701D714945CEF4B75EA4B84E15456F34665C0F107AEBCD8EAD72F85FC997503F2D91387534F5D7E9671DA54877BAA1053545B9DD690802617CA87D621AC518CAC61771FA9 + +# Group 110 - Test 546 +Salt = B394AA41E93A1F2D1040D38F0DBD450E60C0DC8E87B2B15C6318B02A46A55BE8659012AE5FE5A63EFD874EFF1C71B65C60AAED0CBBDB17C5430A278F781CB45E40F000C419A5B84D +Secret = 592ED9C1049601DCE56065784D77FCA1F258662B9E5BEB1F28025412435AA76DD65756FF9B300EEB6E342A4AB296BDA0045E2A59BB03D8B02D75F213816F110FAA180F0A1700FF1DB1222F760B19951A15D68255695185E5616EFF9B4DC00D9DAB356347B1D27687 +Label = CC976A9F78F4678AA72847FB049BD965844296CF5E926DBB4BF11AD0B14E2C81BC4666FDBD11667547075E09DF03FA3DD85516E6AE4EA315CEA053D59A12D54510E5240DE28C92FB24127BFFC6336B693DA67ACB485F8604D49E2AD3C73BD130A4879167E2B0AB53215F45345277B3F8731A106B437ACDA14C06BD8DDFB35A6A46CE777A2BDF844D12BE451501D20B922B0A8622A618FF1C00000400 +Output = C81A26846312F43E003C04D8982659D3CED20D44588AA2EB5A2F69D15FE62EFE72CE606B31EB0883AF1D3A3B2153E784A770BCE9724CF7B246379C9CF9856926BDAC47976769E643DC2EE0A7D1364DBFDA6F2E78A9CCEE1DC14E701AA1A5ECD8EE443DA5A050BB100FFD1906D30F376B0398B982AC84714672EA822CDF69B779