diff --git a/src/lib/pubkey/dilithium/dilithium_common/dilithium.cpp b/src/lib/pubkey/dilithium/dilithium_common/dilithium.cpp index 6cfdb0f09cd..587ae2ff3c9 100644 --- a/src/lib/pubkey/dilithium/dilithium_common/dilithium.cpp +++ b/src/lib/pubkey/dilithium/dilithium_common/dilithium.cpp @@ -34,45 +34,6 @@ namespace Botan { namespace { -/** - * Helper class to ease unmarshalling of concatenated fixed-length values - */ -class BufferSlicer final - { - public: - BufferSlicer(std::span buffer) : m_remaining(buffer) - {} - - template - auto take_as(const size_t count) - { - const auto result = take(count); - return ContainerT(result.begin(), result.end()); - } - - auto take_vector(const size_t count) { return take_as>(count); } - auto take_secure_vector(const size_t count) { return take_as>(count); } - - std::span take(const size_t count) - { - BOTAN_STATE_CHECK(remaining() >= count); - auto result = m_remaining.first(count); - m_remaining = m_remaining.subspan(count); - return result; - } - - void copy_into(std::span sink) - { - const auto data = take(sink.size()); - std::copy(data.begin(), data.end(), sink.begin()); - } - - size_t remaining() const { return m_remaining.size(); } - - private: - std::span m_remaining; - }; - std::pair calculate_t0_and_t1(const DilithiumModeConstants& mode, const std::vector& rho, diff --git a/src/lib/pubkey/kyber/kyber_common/kyber.cpp b/src/lib/pubkey/kyber/kyber_common/kyber.cpp index 7165d454976..357e3e55fa5 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber.cpp +++ b/src/lib/pubkey/kyber/kyber_common/kyber.cpp @@ -403,16 +403,15 @@ class Polynomial : Polynomial::cbd3(mode.PRF(seed, nonce, outlen)); } - template - static Polynomial from_bytes(const std::vector& a, const size_t offset = 0) + static Polynomial from_bytes(std::span a) { Polynomial r; for(size_t i = 0; i < r.m_coeffs.size() / 2; ++i) { r.m_coeffs[2 * i] = - ((a[3 * i + 0 + offset] >> 0) | (static_cast(a[3 * i + 1 + offset]) << 8)) & 0xFFF; + ((a[3 * i + 0] >> 0) | (static_cast(a[3 * i + 1]) << 8)) & 0xFFF; r.m_coeffs[2 * i + 1] = - ((a[3 * i + 1 + offset] >> 4) | (static_cast(a[3 * i + 2 + offset]) << 4)) & 0xFFF; + ((a[3 * i + 1] >> 4) | (static_cast(a[3 * i + 2]) << 4)) & 0xFFF; } return r; } @@ -679,14 +678,16 @@ class PolynomialVector { } - template - static PolynomialVector from_bytes(const std::vector& a, const KyberConstants& mode) + static PolynomialVector from_bytes(std::span a, const KyberConstants& mode) { BOTAN_ASSERT(a.size() == mode.polynomial_vector_byte_length(), "wrong byte length for frombytes"); PolynomialVector r(mode.k()); for(size_t i = 0; i < mode.k(); ++i) - { r.m_vec[i] = Polynomial::from_bytes(a, i * KyberConstants::kSerializedPolynomialByteLength); } + { + r.m_vec[i] = Polynomial::from_bytes(a.subspan(0, KyberConstants::kSerializedPolynomialByteLength)); + a = a.subspan(KyberConstants::kSerializedPolynomialByteLength); + } return r; } @@ -803,7 +804,7 @@ class PolynomialMatrix public: PolynomialMatrix() = delete; - static PolynomialMatrix generate(const std::vector& seed, const bool transposed, + static PolynomialMatrix generate(std::span seed, const bool transposed, const KyberConstants& mode) { BOTAN_ASSERT(seed.size() == KyberConstants::kSymBytes, "unexpected seed size"); @@ -1110,7 +1111,7 @@ class Kyber_PublicKeyInternal { public: Kyber_PublicKeyInternal(KyberConstants mode, - const std::vector& polynomials, + std::span polynomials, std::vector seed) : m_mode(std::move(mode)), m_polynomials(PolynomialVector::from_bytes(polynomials, m_mode)), @@ -1400,77 +1401,41 @@ size_t Kyber_PublicKey::estimated_strength() const return m_public->mode().estimated_strength(); } -void Kyber_PublicKey::initialize_from_encoding(const std::vector& pub_key, - KyberMode m, - KyberKeyEncoding encoding) +std::shared_ptr +Kyber_PublicKey::initialize_from_encoding(std::span pub_key, KyberMode m) { KyberConstants mode(m); - std::vector poly_vec, seed; - - switch(encoding) + if(pub_key.size() != mode.public_key_byte_length()) { - case KyberKeyEncoding::Full: - BER_Decoder(pub_key) - .start_sequence() - .decode(poly_vec, ASN1_Type::OctetString) - .decode(seed, ASN1_Type::OctetString) - .end_cons(); - break; - case KyberKeyEncoding::Raw: - if(pub_key.size() != mode.public_key_byte_length()) - { - throw Invalid_Argument("kyber public key does not have the correct byte count"); - } - poly_vec = std::vector(pub_key.begin(), pub_key.end() - KyberConstants::kSeedLength); - seed = std::vector(pub_key.end() - KyberConstants::kSeedLength, pub_key.end()); - break; + throw Invalid_Argument("kyber public key does not have the correct byte count"); } - if(poly_vec.size() != mode.polynomial_vector_byte_length()) - { - throw Invalid_Argument("kyber public key t-param does not have the correct byte count"); - } + BufferSlicer s(pub_key); - if(seed.size() != KyberConstants::kSeedLength) - { - throw Invalid_Argument("kyber public key rho-param does not have the correct byte count"); - } + auto poly_vec = s.take(mode.polynomial_vector_byte_length()); + auto seed = s.take_vector(KyberConstants::kSeedLength); + BOTAN_ASSERT_NOMSG(s.empty()); - m_public = std::make_shared(std::move(mode), std::move(poly_vec), std::move(seed)); + return std::make_shared(std::move(mode), poly_vec, std::move(seed)); } Kyber_PublicKey::Kyber_PublicKey(const AlgorithmIdentifier& alg_id, - const std::vector& key_bits) : - Kyber_PublicKey(key_bits, - KyberMode(alg_id.oid()), - KyberKeyEncoding::Full) + std::span key_bits) + : Kyber_PublicKey(key_bits, KyberMode(alg_id.oid())) {} -Kyber_PublicKey::Kyber_PublicKey(const std::vector& pub_key, - KyberMode m, - KyberKeyEncoding encoding) - : Kyber_PublicKey() - { - initialize_from_encoding(pub_key, m, encoding); - } +Kyber_PublicKey::Kyber_PublicKey(std::span pub_key, KyberMode m) + : m_public(initialize_from_encoding(pub_key, m)) + {} Kyber_PublicKey::Kyber_PublicKey(const Kyber_PublicKey& other) - : m_public(std::make_shared(*other.m_public)), m_key_encoding(other.m_key_encoding) - { - } + : m_public(std::make_shared(*other.m_public)) + {} std::vector Kyber_PublicKey::public_key_bits() const { - switch(m_key_encoding) - { - case KyberKeyEncoding::Full: - return public_key_bits_der(); - case KyberKeyEncoding::Raw: - return public_key_bits_raw(); - } - - unreachable(); + return public_key_bits_raw(); } const std::vector& Kyber_PublicKey::public_key_bits_raw() const @@ -1483,19 +1448,6 @@ const std::vector& Kyber_PublicKey::H_public_key_bits_raw() const return m_public->H_public_key_bits_raw(); } -std::vector Kyber_PublicKey::public_key_bits_der() const - { - std::vector output; - DER_Encoder der(output); - - der.start_sequence() - .encode(m_public->polynomials().to_bytes>(), ASN1_Type::OctetString) - .encode(m_public->seed(), ASN1_Type::OctetString) - .end_cons(); - - return output; - } - size_t Kyber_PublicKey::key_length() const { return m_public->mode().public_key_byte_length(); @@ -1514,8 +1466,11 @@ Kyber_PrivateKey::Kyber_PrivateKey(RandomNumberGenerator& rng, KyberMode m) auto seed = G->process(rng.random_vec(KyberConstants::kSymBytes)); const auto middle = G->output_length() / 2; - std::vector seed1(seed.begin(), seed.begin() + middle); - secure_vector seed2(seed.begin() + middle, seed.end()); + + BufferSlicer s(seed); + auto seed1 = s.take_vector(middle); + auto seed2 = s.take(middle); + BOTAN_ASSERT_NOMSG(s.empty()); auto a = PolynomialMatrix::generate(seed1, false, mode); auto skpv = PolynomialVector::getnoise_eta1(seed2, 0, mode); @@ -1535,130 +1490,46 @@ Kyber_PrivateKey::Kyber_PrivateKey(RandomNumberGenerator& rng, KyberMode m) } Kyber_PrivateKey::Kyber_PrivateKey(const AlgorithmIdentifier& alg_id, - const secure_vector& key_bits) : - Kyber_PrivateKey(key_bits, - KyberMode(alg_id.oid()), - KyberKeyEncoding::Full) - {} + std::span key_bits) : + Kyber_PrivateKey(key_bits, KyberMode(alg_id.oid())) {} -Kyber_PrivateKey::Kyber_PrivateKey(const secure_vector& sk, - KyberMode m, - KyberKeyEncoding encoding) +Kyber_PrivateKey::Kyber_PrivateKey(std::span sk, KyberMode m) { KyberConstants mode(m); - if(encoding == KyberKeyEncoding::Full) + if(mode.private_key_byte_length() != sk.size()) { - secure_vector z, skpv; - BER_Object pub_key; - - std::vector pkpv, seed; - - auto dec = BER_Decoder(sk) - .start_sequence() - .decode_and_check(0, "kyber private key does have a version other than 0") - .decode(z, ASN1_Type::OctetString) - .decode(skpv, ASN1_Type::OctetString); - - try - { - dec.start_sequence().decode(pkpv, ASN1_Type::OctetString).decode(seed, ASN1_Type::OctetString).end_cons(); - } - catch(const BER_Decoding_Error&) - { - throw Invalid_Argument("reading private key without an embedded public key is not supported"); - } - - // skipping the public key hash - dec.discard_remaining().end_cons(); - - if(skpv.size() != mode.polynomial_vector_byte_length()) - { - throw Invalid_Argument("kyber private key sample-param does not have the correct byte count"); - } - - if(z.size() != KyberConstants::kZLength) - { - throw Invalid_Argument("kyber private key z-param does not have the correct byte count"); - } - - m_public = std::make_shared(m, std::move(pkpv), std::move(seed)); - m_private = std::make_shared(std::move(mode), - PolynomialVector::from_bytes(skpv, mode), std::move(z)); + throw Invalid_Argument("kyber private key does not have the correct byte count"); } - else if(encoding == KyberKeyEncoding::Raw) - { - if(mode.private_key_byte_length() != sk.size()) - { - throw Invalid_Argument("kyber private key does not have the correct byte count"); - } - const auto off_pub_key = mode.polynomial_vector_byte_length(); - const auto pub_key_len = mode.public_key_byte_length(); + BufferSlicer s(sk); - auto skpv = secure_vector(sk.begin(), sk.begin() + off_pub_key); - auto pub_key = std::vector(sk.begin() + off_pub_key, sk.begin() + off_pub_key + pub_key_len); - // skipping the public key hash - auto z = secure_vector(sk.end() - KyberConstants::kZLength, sk.end()); + auto skpv = PolynomialVector::from_bytes(s.take(mode.polynomial_vector_byte_length()), mode); + auto pub_key = s.take(mode.public_key_byte_length()); + s.skip(KyberConstants::kPublicKeyHashLength); + auto z = s.take_secure_vector(KyberConstants::kZLength); - initialize_from_encoding(pub_key, m, encoding); - m_private = std::make_shared(std::move(mode), - PolynomialVector::from_bytes(skpv, mode), std::move(z)); - } + BOTAN_ASSERT_NOMSG(s.empty()); + + m_public = initialize_from_encoding(pub_key, m); + m_private = std::make_shared(std::move(mode), std::move(skpv), std::move(z)); BOTAN_ASSERT(m_private && m_public, "reading private key encoding"); } std::unique_ptr Kyber_PrivateKey::public_key() const { - auto public_key = std::make_unique(*this); - public_key->set_binary_encoding(binary_encoding()); - return public_key; + return std::make_unique(*this); } secure_vector Kyber_PrivateKey::private_key_bits() const { - switch(m_key_encoding) - { - case KyberKeyEncoding::Full: - return private_key_bits_der(); - case KyberKeyEncoding::Raw: - return private_key_bits_raw(); - } - - unreachable(); - } - -secure_vector Kyber_PrivateKey::private_key_bits_raw() const - { - const auto pub_key = public_key_bits_raw(); - const auto pub_key_sv = secure_vector(pub_key.begin(), pub_key.end()); - const auto pub_key_hash = H_public_key_bits_raw(); - return concat(m_private->polynomials().to_bytes>(), - pub_key_sv, pub_key_hash, + public_key_bits_raw(), + H_public_key_bits_raw(), m_private->z()); } -secure_vector Kyber_PrivateKey::private_key_bits_der() const - { - secure_vector output; - DER_Encoder der(output); - - const auto pub_key = public_key_bits_der(); - const auto pub_key_hash = m_private->mode().H()->process(pub_key); - - der.start_sequence() - .encode(size_t(0), ASN1_Type::Integer, ASN1_Class::Universal) - .encode(m_private->z(), ASN1_Type::OctetString) - .encode(m_private->polynomials().to_bytes>(), ASN1_Type::OctetString) - .raw_bytes(pub_key) - .encode(pub_key_hash, ASN1_Type::OctetString) - .end_cons(); - - return output; - } - std::unique_ptr Kyber_PublicKey::create_kem_encryption_op( const std::string& params, diff --git a/src/lib/pubkey/kyber/kyber_common/kyber.h b/src/lib/pubkey/kyber/kyber_common/kyber.h index 1b5bebcd506..68339b54cbf 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber.h +++ b/src/lib/pubkey/kyber/kyber_common/kyber.h @@ -19,6 +19,8 @@ #include #include +#include + #if !defined(BOTAN_HAS_KYBER_90S) && !defined(BOTAN_HAS_KYBER) static_assert(false, "botan module 'kyber_common' is useful only when enabling modules 'kyber', 'kyber_90s' or both"); #endif @@ -56,24 +58,16 @@ class BOTAN_PUBLIC_API(3, 0) KyberMode Mode m_mode; }; -enum class KyberKeyEncoding - { - Raw, // as implemented in the reference implementation - Full // as described in draft-uni-qsckeys-00 Section 4.3 (private key), 4.5 (public key) - }; - class Kyber_PublicKeyInternal; class Kyber_PrivateKeyInternal; class BOTAN_PUBLIC_API(3, 0) Kyber_PublicKey : public virtual Public_Key { public: - Kyber_PublicKey(const std::vector& pub_key, - KyberMode mode, - KyberKeyEncoding encoding); + Kyber_PublicKey(std::span pub_key, KyberMode mode); Kyber_PublicKey(const AlgorithmIdentifier& alg_id, - const std::vector& key_bits); + std::span key_bits); Kyber_PublicKey(const Kyber_PublicKey& other); @@ -106,32 +100,19 @@ class BOTAN_PUBLIC_API(3, 0) Kyber_PublicKey : public virtual Public_Key KyberMode mode() const; - void set_binary_encoding(KyberKeyEncoding encoding) - { - m_key_encoding = encoding; - } - KyberKeyEncoding binary_encoding() const - { - return m_key_encoding; - } - protected: Kyber_PublicKey() {} - void initialize_from_encoding(const std::vector& pub_key, - KyberMode m, - KyberKeyEncoding encoding); + static std::shared_ptr initialize_from_encoding(std::span pub_key, KyberMode m); const std::vector& public_key_bits_raw() const; const std::vector& H_public_key_bits_raw() const; - std::vector public_key_bits_der() const; protected: friend class Kyber_KEM_Encryptor; friend class Kyber_KEM_Decryptor; std::shared_ptr m_public; - KyberKeyEncoding m_key_encoding = KyberKeyEncoding::Full; }; class BOTAN_PUBLIC_API(3, 0) Kyber_PrivateKey final : public virtual Kyber_PublicKey, public virtual Private_Key @@ -139,12 +120,10 @@ class BOTAN_PUBLIC_API(3, 0) Kyber_PrivateKey final : public virtual Kyber_Publi public: Kyber_PrivateKey(RandomNumberGenerator& rng, KyberMode mode); - Kyber_PrivateKey(const secure_vector& sk, - KyberMode mode, - KyberKeyEncoding encoding); + Kyber_PrivateKey(std::span sk, KyberMode mode); Kyber_PrivateKey(const AlgorithmIdentifier& alg_id, - const secure_vector& key_bits); + std::span key_bits); std::unique_ptr public_key() const override; @@ -154,10 +133,6 @@ class BOTAN_PUBLIC_API(3, 0) Kyber_PrivateKey final : public virtual Kyber_Publi const std::string& params, const std::string& provider) const override; - private: - secure_vector private_key_bits_raw() const; - secure_vector private_key_bits_der() const; - private: friend class Kyber_KEM_Decryptor; diff --git a/src/lib/utils/stl_util.h b/src/lib/utils/stl_util.h index 85fc63a96ed..466353510ac 100644 --- a/src/lib/utils/stl_util.h +++ b/src/lib/utils/stl_util.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -122,6 +123,48 @@ void map_remove_if(Pred pred, T& assoc) } } +/** + * Helper class to ease unmarshalling of concatenated fixed-length values + */ +class BufferSlicer final + { + public: + BufferSlicer(std::span buffer) : m_remaining(buffer) + {} + + template + auto take_as(const size_t count) + { + const auto result = take(count); + return ContainerT(result.begin(), result.end()); + } + + auto take_vector(const size_t count) { return take_as>(count); } + auto take_secure_vector(const size_t count) { return take_as>(count); } + + std::span take(const size_t count) + { + BOTAN_STATE_CHECK(remaining() >= count); + auto result = m_remaining.first(count); + m_remaining = m_remaining.subspan(count); + return result; + } + + void copy_into(std::span sink) + { + const auto data = take(sink.size()); + std::copy(data.begin(), data.end(), sink.begin()); + } + + void skip(const size_t count) { take(count); } + + size_t remaining() const { return m_remaining.size(); } + bool empty() const { return m_remaining.empty(); } + + private: + std::span m_remaining; + }; + /** * Concatenate an arbitrary number of buffers. * @return the concatenation of \p buffers as the container type of the first buffer diff --git a/src/tests/data/pubkey/kyber_encodings.vec b/src/tests/data/pubkey/kyber_encodings.vec index 99b64562a20..ba4098f71d9 100644 --- a/src/tests/data/pubkey/kyber_encodings.vec +++ b/src/tests/data/pubkey/kyber_encodings.vec @@ -1,89 +1,34 @@ [Kyber-512-r3] -PrivateRaw = 7FD61F4EA46B27139BA9C68D5ED56459347880393C88B65EA93C61E7EB5576678AB90118C000B79B12868102759D98A6A87A6A54FC2FE867A440288BFD7C99898CBD77EB51B7F101A24A437C64236C2A8E92FA07BDD07237B3C5FFDC77B7A08924039D73FC130B6B378EF820AC0CBBCB660CB3F3315EA3994E4865AA5946C8E70EC024792C4307F5C7179F3BBA4A997AAD531815183B50E4ACA7D7BEB70739614814EEB71A6D44810761927AF427B29866A9366F4F8CA4BB5B760965C573550061814B0A13C8CAD0734A5237A64C52D7536FBCD42A173C0038C744A404B76A59A8EF0825236275CC17CBFFB47CB8FB0B590C05E08A727FDC030CFB7BD0676D616BB7EB4AA321A460DA1442FEE22837BC8193955C9B31253A1B49741228E4B54875ACCC5A40C5A5A55BB3201CDA5584DFD2A7B2C42556034CE765B6F065161232A6F83B3D7D249E47138E69A3BBAE8A8375897AF960C507A7A931C98A0040692989C9C2F3398D7B15DEC989CB75250F48245BEB5571F33475665F513C043C989D3B55604F254B6BF14E48F4CEEF9115C5BC44B6397AC776CF83F3A7EEBB89FC7045DF81B0CBEB391632AE9B576F109C8BA7919694A8A1F874157E292803E594B0169ACFC5AAACA850F9DBA861450A879B62F6520AB0481596CA6A79BBBFB8457FB3B2B27BF6C28EB1BB64549F423374E23295CF59ACFE6444274B224A0792D93BC1A33C069987C18605292369287D303BA730723F6126D0CC9A62A907E4B2340F6910A6C9C07D3671E29B4254DA47AEE4A82ACB03EC2816152C3AAD77836970826BE818E92C2A17366C5EEA37E0223C954B8ED8C9B61C3B0F2AF7ADBA403A6E61CF1764316FC6CBE33C5A2227BD6ABA55C6EB2313C49B50957838662DE9153DC0BC1F8B5154F2E71E39F2B9EB3C7FABB752D63B14FC55B5643BC4EE110E6ED686686656A2A184A9521C61F309963A54B7F8013E1C72BEA02866C0771808AF852AB8F0F04DE2182785B2BD75A9364F93C8032C26A0E107F437C9E4F013796128514B430311C4EEB4B98D0911EF121EA67A3BAA93C93D0CA12CEA197F877EFA3478E52CC940EC939B216BB5C77F5BAA8B2672950C72B722D19DF9671C264061A4D424E21A450B8CAC882508AFD23565E86664C4CD56094C1F72542E1C25424B0DCD4842DF48C8F79893D73148DCB99FB6490FF1218822D6017FD17FC8D6CC5514A5B3B3A1A169CCE766A7C74B24B4E8468A5527BC205919569E8619B87197BE1C5C34DBDC3756112875858FE986BA6E3A7A7F64CF37215E15AC522BDBAAB1D73A8738B90AF35A6F83C8839765AEA1322FF923237271E7E1BD9A56092A9591E8B54245A046E6E8268EA8306C0488F616BC65985ABE804F695A9EBB385DA97789F8D381DBE2156E70B09B1201F80143E55265B4868A7B67A924D0C6D932B3DFD18B58D3A6A5002D41080B03A9796CB3734B3627F4044929151ADC0C8348137B2F549FDD70B622C72F3AE772B77B638B6379162A64B0110FB0532162068919C351276618623A7B96867C3479CE6B3101658BAC7F05938F462C2F88918823A8444019DFE0381FA70A7C11BD85A394A1D11FCB6B8D7DD94E012881E6AC768A7486BC668665A83BFBF261B0C280D7878747EC340D0C57A35810D1FC768D128796EAB1F4C72BD7341ECCF030508392E8095985E3A63BA4CDACB96A15E506F22C5031D8CB6C4C2B227C6EA8EC76244BCC7F425FB5F28E1F9702C0F3AFE7A946A94BAD108375D512C43B52607ECC91889408A1156EC61593FF8156780C5EA2B462B733A72256424442CABA87CC1D101983095E0142420D295F2C064AC96738B021BBC75291194C10A978CB20FC15A1C4A91E1B2462149B473540FE677645D5C8F473C2862633461B4BDFB561C0D5256A239F49483A926C2B6CBAA08A4381FA1AC4E26688ECE103E23C3D85B19D8600CEE57C301D3C2C13731673F599F3338CB7B644DE19A32297C0CE553FDDD737266630BB3416CF6C1477163B520276D6B63DB789A0284A65838696869CAEE20A6B828A476384C6C1AA6C48D9B4ABF816912C425AEB5B90093B253C936D3359E86041C9637B92E76261181F4DB98E4DC9415E5075815773FD07B2CA36C5821123D40A55CC57C8FB648C18642CF2A19F25D9678AE0001A1981BF9979FE2826ECF1A53B8C07A9346FED6BCF664CFD63FA8DB1327FCAF87FA71AF1DB9610CEFD2B1A98801683EAC6811BC87601CD7E89FD1FDB314D84196D48DFD61543AB8ACEA2F5C4F93B4B62D47BB45F26E1A1F85BAA2EFAD7DE6FB40B4629 -PublicRaw = E52CC940EC939B216BB5C77F5BAA8B2672950C72B722D19DF9671C264061A4D424E21A450B8CAC882508AFD23565E86664C4CD56094C1F72542E1C25424B0DCD4842DF48C8F79893D73148DCB99FB6490FF1218822D6017FD17FC8D6CC5514A5B3B3A1A169CCE766A7C74B24B4E8468A5527BC205919569E8619B87197BE1C5C34DBDC3756112875858FE986BA6E3A7A7F64CF37215E15AC522BDBAAB1D73A8738B90AF35A6F83C8839765AEA1322FF923237271E7E1BD9A56092A9591E8B54245A046E6E8268EA8306C0488F616BC65985ABE804F695A9EBB385DA97789F8D381DBE2156E70B09B1201F80143E55265B4868A7B67A924D0C6D932B3DFD18B58D3A6A5002D41080B03A9796CB3734B3627F4044929151ADC0C8348137B2F549FDD70B622C72F3AE772B77B638B6379162A64B0110FB0532162068919C351276618623A7B96867C3479CE6B3101658BAC7F05938F462C2F88918823A8444019DFE0381FA70A7C11BD85A394A1D11FCB6B8D7DD94E012881E6AC768A7486BC668665A83BFBF261B0C280D7878747EC340D0C57A35810D1FC768D128796EAB1F4C72BD7341ECCF030508392E8095985E3A63BA4CDACB96A15E506F22C5031D8CB6C4C2B227C6EA8EC76244BCC7F425FB5F28E1F9702C0F3AFE7A946A94BAD108375D512C43B52607ECC91889408A1156EC61593FF8156780C5EA2B462B733A72256424442CABA87CC1D101983095E0142420D295F2C064AC96738B021BBC75291194C10A978CB20FC15A1C4A91E1B2462149B473540FE677645D5C8F473C2862633461B4BDFB561C0D5256A239F49483A926C2B6CBAA08A4381FA1AC4E26688ECE103E23C3D85B19D8600CEE57C301D3C2C13731673F599F3338CB7B644DE19A32297C0CE553FDDD737266630BB3416CF6C1477163B520276D6B63DB789A0284A65838696869CAEE20A6B828A476384C6C1AA6C48D9B4ABF816912C425AEB5B90093B253C936D3359E86041C9637B92E76261181F4DB98E4DC9415E5075815773FD07B2CA36C5821123D40A55CC57C8FB648C18642CF2A19F25D9678AE0001A1981BF9979FE2826ECF1A53B8C07A9346FED6BCF664CFD63FA8DB1327FCAF87FA71A -PrivateFull = 308206750201000420D61543AB8ACEA2F5C4F93B4B62D47BB45F26E1A1F85BAA2EFAD7DE6FB40B4629048203007FD61F4EA46B27139BA9C68D5ED56459347880393C88B65EA93C61E7EB5576678AB90118C000B79B12868102759D98A6A87A6A54FC2FE867A440288BFD7C99898CBD77EB51B7F101A24A437C64236C2A8E92FA07BDD07237B3C5FFDC77B7A08924039D73FC130B6B378EF820AC0CBBCB660CB3F3315EA3994E4865AA5946C8E70EC024792C4307F5C7179F3BBA4A997AAD531815183B50E4ACA7D7BEB70739614814EEB71A6D44810761927AF427B29866A9366F4F8CA4BB5B760965C573550061814B0A13C8CAD0734A5237A64C52D7536FBCD42A173C0038C744A404B76A59A8EF0825236275CC17CBFFB47CB8FB0B590C05E08A727FDC030CFB7BD0676D616BB7EB4AA321A460DA1442FEE22837BC8193955C9B31253A1B49741228E4B54875ACCC5A40C5A5A55BB3201CDA5584DFD2A7B2C42556034CE765B6F065161232A6F83B3D7D249E47138E69A3BBAE8A8375897AF960C507A7A931C98A0040692989C9C2F3398D7B15DEC989CB75250F48245BEB5571F33475665F513C043C989D3B55604F254B6BF14E48F4CEEF9115C5BC44B6397AC776CF83F3A7EEBB89FC7045DF81B0CBEB391632AE9B576F109C8BA7919694A8A1F874157E292803E594B0169ACFC5AAACA850F9DBA861450A879B62F6520AB0481596CA6A79BBBFB8457FB3B2B27BF6C28EB1BB64549F423374E23295CF59ACFE6444274B224A0792D93BC1A33C069987C18605292369287D303BA730723F6126D0CC9A62A907E4B2340F6910A6C9C07D3671E29B4254DA47AEE4A82ACB03EC2816152C3AAD77836970826BE818E92C2A17366C5EEA37E0223C954B8ED8C9B61C3B0F2AF7ADBA403A6E61CF1764316FC6CBE33C5A2227BD6ABA55C6EB2313C49B50957838662DE9153DC0BC1F8B5154F2E71E39F2B9EB3C7FABB752D63B14FC55B5643BC4EE110E6ED686686656A2A184A9521C61F309963A54B7F8013E1C72BEA02866C0771808AF852AB8F0F04DE2182785B2BD75A9364F93C8032C26A0E107F437C9E4F013796128514B430311C4EEB4B98D0911EF121EA67A3BAA93C93D0CA12CEA197F877EFA34783082032604820300E52CC940EC939B216BB5C77F5BAA8B2672950C72B722D19DF9671C264061A4D424E21A450B8CAC882508AFD23565E86664C4CD56094C1F72542E1C25424B0DCD4842DF48C8F79893D73148DCB99FB6490FF1218822D6017FD17FC8D6CC5514A5B3B3A1A169CCE766A7C74B24B4E8468A5527BC205919569E8619B87197BE1C5C34DBDC3756112875858FE986BA6E3A7A7F64CF37215E15AC522BDBAAB1D73A8738B90AF35A6F83C8839765AEA1322FF923237271E7E1BD9A56092A9591E8B54245A046E6E8268EA8306C0488F616BC65985ABE804F695A9EBB385DA97789F8D381DBE2156E70B09B1201F80143E55265B4868A7B67A924D0C6D932B3DFD18B58D3A6A5002D41080B03A9796CB3734B3627F4044929151ADC0C8348137B2F549FDD70B622C72F3AE772B77B638B6379162A64B0110FB0532162068919C351276618623A7B96867C3479CE6B3101658BAC7F05938F462C2F88918823A8444019DFE0381FA70A7C11BD85A394A1D11FCB6B8D7DD94E012881E6AC768A7486BC668665A83BFBF261B0C280D7878747EC340D0C57A35810D1FC768D128796EAB1F4C72BD7341ECCF030508392E8095985E3A63BA4CDACB96A15E506F22C5031D8CB6C4C2B227C6EA8EC76244BCC7F425FB5F28E1F9702C0F3AFE7A946A94BAD108375D512C43B52607ECC91889408A1156EC61593FF8156780C5EA2B462B733A72256424442CABA87CC1D101983095E0142420D295F2C064AC96738B021BBC75291194C10A978CB20FC15A1C4A91E1B2462149B473540FE677645D5C8F473C2862633461B4BDFB561C0D5256A239F49483A926C2B6CBAA08A4381FA1AC4E26688ECE103E23C3D85B19D8600CEE57C301D3C2C13731673F599F3338CB7B644DE19A32297C0CE553FDDD737266630BB3416CF6C1477163B520276D6B63DB789A0284A65838696869CAEE20A6B828A476384C6C1AA6C48D9B4ABF816912C425AEB5B90093B253C936D3359E86041C9637B92E76261181F4DB98E4DC9415E5075815773FD07B2CA36C5821123D40A55CC57C8FB648C18642CF2A19F25D9678AE0001A19810420BF9979FE2826ECF1A53B8C07A9346FED6BCF664CFD63FA8DB1327FCAF87FA71A04205CF3528796D5661539F4A33760909F33BDCB3099791AED8E828C8978D992A765 -PublicFull = 3082032604820300E52CC940EC939B216BB5C77F5BAA8B2672950C72B722D19DF9671C264061A4D424E21A450B8CAC882508AFD23565E86664C4CD56094C1F72542E1C25424B0DCD4842DF48C8F79893D73148DCB99FB6490FF1218822D6017FD17FC8D6CC5514A5B3B3A1A169CCE766A7C74B24B4E8468A5527BC205919569E8619B87197BE1C5C34DBDC3756112875858FE986BA6E3A7A7F64CF37215E15AC522BDBAAB1D73A8738B90AF35A6F83C8839765AEA1322FF923237271E7E1BD9A56092A9591E8B54245A046E6E8268EA8306C0488F616BC65985ABE804F695A9EBB385DA97789F8D381DBE2156E70B09B1201F80143E55265B4868A7B67A924D0C6D932B3DFD18B58D3A6A5002D41080B03A9796CB3734B3627F4044929151ADC0C8348137B2F549FDD70B622C72F3AE772B77B638B6379162A64B0110FB0532162068919C351276618623A7B96867C3479CE6B3101658BAC7F05938F462C2F88918823A8444019DFE0381FA70A7C11BD85A394A1D11FCB6B8D7DD94E012881E6AC768A7486BC668665A83BFBF261B0C280D7878747EC340D0C57A35810D1FC768D128796EAB1F4C72BD7341ECCF030508392E8095985E3A63BA4CDACB96A15E506F22C5031D8CB6C4C2B227C6EA8EC76244BCC7F425FB5F28E1F9702C0F3AFE7A946A94BAD108375D512C43B52607ECC91889408A1156EC61593FF8156780C5EA2B462B733A72256424442CABA87CC1D101983095E0142420D295F2C064AC96738B021BBC75291194C10A978CB20FC15A1C4A91E1B2462149B473540FE677645D5C8F473C2862633461B4BDFB561C0D5256A239F49483A926C2B6CBAA08A4381FA1AC4E26688ECE103E23C3D85B19D8600CEE57C301D3C2C13731673F599F3338CB7B644DE19A32297C0CE553FDDD737266630BB3416CF6C1477163B520276D6B63DB789A0284A65838696869CAEE20A6B828A476384C6C1AA6C48D9B4ABF816912C425AEB5B90093B253C936D3359E86041C9637B92E76261181F4DB98E4DC9415E5075815773FD07B2CA36C5821123D40A55CC57C8FB648C18642CF2A19F25D9678AE0001A19810420BF9979FE2826ECF1A53B8C07A9346FED6BCF664CFD63FA8DB1327FCAF87FA71A - -Error = reading private key without an embedded public key is not supported -PrivateRaw = -PublicRaw = -PrivateFull = 3082034B0201000420D61543AB8ACEA2F5C4F93B4B62D47BB45F26E1A1F85BAA2EFAD7DE6FB40B4629048203007FD61F4EA46B27139BA9C68D5ED56459347880393C88B65EA93C61E7EB5576678AB90118C000B79B12868102759D98A6A87A6A54FC2FE867A440288BFD7C99898CBD77EB51B7F101A24A437C64236C2A8E92FA07BDD07237B3C5FFDC77B7A08924039D73FC130B6B378EF820AC0CBBCB660CB3F3315EA3994E4865AA5946C8E70EC024792C4307F5C7179F3BBA4A997AAD531815183B50E4ACA7D7BEB70739614814EEB71A6D44810761927AF427B29866A9366F4F8CA4BB5B760965C573550061814B0A13C8CAD0734A5237A64C52D7536FBCD42A173C0038C744A404B76A59A8EF0825236275CC17CBFFB47CB8FB0B590C05E08A727FDC030CFB7BD0676D616BB7EB4AA321A460DA1442FEE22837BC8193955C9B31253A1B49741228E4B54875ACCC5A40C5A5A55BB3201CDA5584DFD2A7B2C42556034CE765B6F065161232A6F83B3D7D249E47138E69A3BBAE8A8375897AF960C507A7A931C98A0040692989C9C2F3398D7B15DEC989CB75250F48245BEB5571F33475665F513C043C989D3B55604F254B6BF14E48F4CEEF9115C5BC44B6397AC776CF83F3A7EEBB89FC7045DF81B0CBEB391632AE9B576F109C8BA7919694A8A1F874157E292803E594B0169ACFC5AAACA850F9DBA861450A879B62F6520AB0481596CA6A79BBBFB8457FB3B2B27BF6C28EB1BB64549F423374E23295CF59ACFE6444274B224A0792D93BC1A33C069987C18605292369287D303BA730723F6126D0CC9A62A907E4B2340F6910A6C9C07D3671E29B4254DA47AEE4A82ACB03EC2816152C3AAD77836970826BE818E92C2A17366C5EEA37E0223C954B8ED8C9B61C3B0F2AF7ADBA403A6E61CF1764316FC6CBE33C5A2227BD6ABA55C6EB2313C49B50957838662DE9153DC0BC1F8B5154F2E71E39F2B9EB3C7FABB752D63B14FC55B5643BC4EE110E6ED686686656A2A184A9521C61F309963A54B7F8013E1C72BEA02866C0771808AF852AB8F0F04DE2182785B2BD75A9364F93C8032C26A0E107F437C9E4F013796128514B430311C4EEB4B98D0911EF121EA67A3BAA93C93D0CA12CEA197F877EFA347804205CF3528796D5661539F4A33760909F33BDCB3099791AED8E828C8978D992A765 -PublicFull = - -Error = kyber private key does have a version other than 0 -PrivateRaw = -PublicRaw = -PrivateFull = 3082034B0201042420D61543AB8ACEA2F5C4F93B4B62D47BB45F26E1A1F85BAA2EFAD7DE6FB40B4629048203007FD61F4EA46B27139BA9C68D5ED56459347880393C88B65EA93C61E7EB5576678AB90118C000B79B12868102759D98A6A87A6A54FC2FE867A440288BFD7C99898CBD77EB51B7F101A24A437C64236C2A8E92FA07BDD07237B3C5FFDC77B7A08924039D73FC130B6B378EF820AC0CBBCB660CB3F3315EA3994E4865AA5946C8E70EC024792C4307F5C7179F3BBA4A997AAD531815183B50E4ACA7D7BEB70739614814EEB71A6D44810761927AF427B29866A9366F4F8CA4BB5B760965C573550061814B0A13C8CAD0734A5237A64C52D7536FBCD42A173C0038C744A404B76A59A8EF0825236275CC17CBFFB47CB8FB0B590C05E08A727FDC030CFB7BD0676D616BB7EB4AA321A460DA1442FEE22837BC8193955C9B31253A1B49741228E4B54875ACCC5A40C5A5A55BB3201CDA5584DFD2A7B2C42556034CE765B6F065161232A6F83B3D7D249E47138E69A3BBAE8A8375897AF960C507A7A931C98A0040692989C9C2F3398D7B15DEC989CB75250F48245BEB5571F33475665F513C043C989D3B55604F254B6BF14E48F4CEEF9115C5BC44B6397AC776CF83F3A7EEBB89FC7045DF81B0CBEB391632AE9B576F109C8BA7919694A8A1F874157E292803E594B0169ACFC5AAACA850F9DBA861450A879B62F6520AB0481596CA6A79BBBFB8457FB3B2B27BF6C28EB1BB64549F423374E23295CF59ACFE6444274B224A0792D93BC1A33C069987C18605292369287D303BA730723F6126D0CC9A62A907E4B2340F6910A6C9C07D3671E29B4254DA47AEE4A82ACB03EC2816152C3AAD77836970826BE818E92C2A17366C5EEA37E0223C954B8ED8C9B61C3B0F2AF7ADBA403A6E61CF1764316FC6CBE33C5A2227BD6ABA55C6EB2313C49B50957838662DE9153DC0BC1F8B5154F2E71E39F2B9EB3C7FABB752D63B14FC55B5643BC4EE110E6ED686686656A2A184A9521C61F309963A54B7F8013E1C72BEA02866C0771808AF852AB8F0F04DE2182785B2BD75A9364F93C8032C26A0E107F437C9E4F013796128514B430311C4EEB4B98D0911EF121EA67A3BAA93C93D0CA12CEA197F877EFA347804205CF3528796D5661539F4A33760909F33BDCB3099791AED8E828C8978D992A765 -PublicFull = - -Error = kyber private key sample-param does not have the correct byte count -PrivateRaw = -PublicRaw = -PrivateFull = 308206770201000420D61543AB8ACEA2F5C4F93B4B62D47BB45F26E1A1F85BAA2EFAD7DE6FB40B4629048203027FD61F4EA46B27139BA9C68D5ED56459347880393C88B65EA93C61E7EB5576678AB90118C000B79B12868102759D98A6A87A6A54FC2FE867A440288BFD7C99898CBD77EB51B7F101A24A437C64236C2A8E92FA07BDD07237B3C5FFDC77B7A08924039D73FC130B6B378EF820AC0CBBCB660CB3F3315EA3994E4865AA5946C8E70EC024792C4307F5C7179F3BBA4A997AAD531815183B50E4ACA7D7BEB70739614814EEB71A6D44810761927AF427B29866A9366F4F8CA4BB5B760965C573550061814B0A13C8CAD0734A5237A64C52D7536FBCD42A173C0038C744A404B76A59A8EF0825236275CC17CBFFB47CB8FB0B590C05E08A727FDC030CFB7BD0676D616BB7EB4AA321A460DA1442FEE22837BC8193955C9B31253A1B49741228E4B54875ACCC5A40C5A5A55BB3201CDA5584DFD2A7B2C42556034CE765B6F065161232A6F83B3D7D249E47138E69A3BBAE8A8375897AF960C507A7A931C98A0040692989C9C2F3398D7B15DEC989CB75250F48245BEB5571F33475665F513C043C989D3B55604F254B6BF14E48F4CEEF9115C5BC44B6397AC776CF83F3A7EEBB89FC7045DF81B0CBEB391632AE9B576F109C8BA7919694A8A1F874157E292803E594B0169ACFC5AAACA850F9DBA861450A879B62F6520AB0481596CA6A79BBBFB8457FB3B2B27BF6C28EB1BB64549F423374E23295CF59ACFE6444274B224A0792D93BC1A33C069987C18605292369287D303BA730723F6126D0CC9A62A907E4B2340F6910A6C9C07D3671E29B4254DA47AEE4A82ACB03EC2816152C3AAD77836970826BE818E92C2A17366C5EEA37E0223C954B8ED8C9B61C3B0F2AF7ADBA403A6E61CF1764316FC6CBE33C5A2227BD6ABA55C6EB2313C49B50957838662DE9153DC0BC1F8B5154F2E71E39F2B9EB3C7FABB752D63B14FC55B5643BC4EE110E6ED686686656A2A184A9521C61F309963A54B7F8013E1C72BEA02866C0771808AF852AB8F0F04DE2182785B2BD75A9364F93C8032C26A0E107F437C9E4F013796128514B430311C4EEB4B98D0911EF121EA67A3BAA93C93D0CA12CEA197F877EFA347813373082032604820300E52CC940EC939B216BB5C77F5BAA8B2672950C72B722D19DF9671C264061A4D424E21A450B8CAC882508AFD23565E86664C4CD56094C1F72542E1C25424B0DCD4842DF48C8F79893D73148DCB99FB6490FF1218822D6017FD17FC8D6CC5514A5B3B3A1A169CCE766A7C74B24B4E8468A5527BC205919569E8619B87197BE1C5C34DBDC3756112875858FE986BA6E3A7A7F64CF37215E15AC522BDBAAB1D73A8738B90AF35A6F83C8839765AEA1322FF923237271E7E1BD9A56092A9591E8B54245A046E6E8268EA8306C0488F616BC65985ABE804F695A9EBB385DA97789F8D381DBE2156E70B09B1201F80143E55265B4868A7B67A924D0C6D932B3DFD18B58D3A6A5002D41080B03A9796CB3734B3627F4044929151ADC0C8348137B2F549FDD70B622C72F3AE772B77B638B6379162A64B0110FB0532162068919C351276618623A7B96867C3479CE6B3101658BAC7F05938F462C2F88918823A8444019DFE0381FA70A7C11BD85A394A1D11FCB6B8D7DD94E012881E6AC768A7486BC668665A83BFBF261B0C280D7878747EC340D0C57A35810D1FC768D128796EAB1F4C72BD7341ECCF030508392E8095985E3A63BA4CDACB96A15E506F22C5031D8CB6C4C2B227C6EA8EC76244BCC7F425FB5F28E1F9702C0F3AFE7A946A94BAD108375D512C43B52607ECC91889408A1156EC61593FF8156780C5EA2B462B733A72256424442CABA87CC1D101983095E0142420D295F2C064AC96738B021BBC75291194C10A978CB20FC15A1C4A91E1B2462149B473540FE677645D5C8F473C2862633461B4BDFB561C0D5256A239F49483A926C2B6CBAA08A4381FA1AC4E26688ECE103E23C3D85B19D8600CEE57C301D3C2C13731673F599F3338CB7B644DE19A32297C0CE553FDDD737266630BB3416CF6C1477163B520276D6B63DB789A0284A65838696869CAEE20A6B828A476384C6C1AA6C48D9B4ABF816912C425AEB5B90093B253C936D3359E86041C9637B92E76261181F4DB98E4DC9415E5075815773FD07B2CA36C5821123D40A55CC57C8FB648C18642CF2A19F25D9678AE0001A19810420BF9979FE2826ECF1A53B8C07A9346FED6BCF664CFD63FA8DB1327FCAF87FA71A04205CF3528796D5661539F4A33760909F33BDCB3099791AED8E828C8978D992A765 -PublicFull = - -Error = kyber private key z-param does not have the correct byte count -PrivateRaw = -PublicRaw = -PrivateFull = 30820674020100041F1543AB8ACEA2F5C4F93B4B62D47BB45F26E1A1F85BAA2EFAD7DE6FB40B4629048203007FD61F4EA46B27139BA9C68D5ED56459347880393C88B65EA93C61E7EB5576678AB90118C000B79B12868102759D98A6A87A6A54FC2FE867A440288BFD7C99898CBD77EB51B7F101A24A437C64236C2A8E92FA07BDD07237B3C5FFDC77B7A08924039D73FC130B6B378EF820AC0CBBCB660CB3F3315EA3994E4865AA5946C8E70EC024792C4307F5C7179F3BBA4A997AAD531815183B50E4ACA7D7BEB70739614814EEB71A6D44810761927AF427B29866A9366F4F8CA4BB5B760965C573550061814B0A13C8CAD0734A5237A64C52D7536FBCD42A173C0038C744A404B76A59A8EF0825236275CC17CBFFB47CB8FB0B590C05E08A727FDC030CFB7BD0676D616BB7EB4AA321A460DA1442FEE22837BC8193955C9B31253A1B49741228E4B54875ACCC5A40C5A5A55BB3201CDA5584DFD2A7B2C42556034CE765B6F065161232A6F83B3D7D249E47138E69A3BBAE8A8375897AF960C507A7A931C98A0040692989C9C2F3398D7B15DEC989CB75250F48245BEB5571F33475665F513C043C989D3B55604F254B6BF14E48F4CEEF9115C5BC44B6397AC776CF83F3A7EEBB89FC7045DF81B0CBEB391632AE9B576F109C8BA7919694A8A1F874157E292803E594B0169ACFC5AAACA850F9DBA861450A879B62F6520AB0481596CA6A79BBBFB8457FB3B2B27BF6C28EB1BB64549F423374E23295CF59ACFE6444274B224A0792D93BC1A33C069987C18605292369287D303BA730723F6126D0CC9A62A907E4B2340F6910A6C9C07D3671E29B4254DA47AEE4A82ACB03EC2816152C3AAD77836970826BE818E92C2A17366C5EEA37E0223C954B8ED8C9B61C3B0F2AF7ADBA403A6E61CF1764316FC6CBE33C5A2227BD6ABA55C6EB2313C49B50957838662DE9153DC0BC1F8B5154F2E71E39F2B9EB3C7FABB752D63B14FC55B5643BC4EE110E6ED686686656A2A184A9521C61F309963A54B7F8013E1C72BEA02866C0771808AF852AB8F0F04DE2182785B2BD75A9364F93C8032C26A0E107F437C9E4F013796128514B430311C4EEB4B98D0911EF121EA67A3BAA93C93D0CA12CEA197F877EFA34783082032604820300E52CC940EC939B216BB5C77F5BAA8B2672950C72B722D19DF9671C264061A4D424E21A450B8CAC882508AFD23565E86664C4CD56094C1F72542E1C25424B0DCD4842DF48C8F79893D73148DCB99FB6490FF1218822D6017FD17FC8D6CC5514A5B3B3A1A169CCE766A7C74B24B4E8468A5527BC205919569E8619B87197BE1C5C34DBDC3756112875858FE986BA6E3A7A7F64CF37215E15AC522BDBAAB1D73A8738B90AF35A6F83C8839765AEA1322FF923237271E7E1BD9A56092A9591E8B54245A046E6E8268EA8306C0488F616BC65985ABE804F695A9EBB385DA97789F8D381DBE2156E70B09B1201F80143E55265B4868A7B67A924D0C6D932B3DFD18B58D3A6A5002D41080B03A9796CB3734B3627F4044929151ADC0C8348137B2F549FDD70B622C72F3AE772B77B638B6379162A64B0110FB0532162068919C351276618623A7B96867C3479CE6B3101658BAC7F05938F462C2F88918823A8444019DFE0381FA70A7C11BD85A394A1D11FCB6B8D7DD94E012881E6AC768A7486BC668665A83BFBF261B0C280D7878747EC340D0C57A35810D1FC768D128796EAB1F4C72BD7341ECCF030508392E8095985E3A63BA4CDACB96A15E506F22C5031D8CB6C4C2B227C6EA8EC76244BCC7F425FB5F28E1F9702C0F3AFE7A946A94BAD108375D512C43B52607ECC91889408A1156EC61593FF8156780C5EA2B462B733A72256424442CABA87CC1D101983095E0142420D295F2C064AC96738B021BBC75291194C10A978CB20FC15A1C4A91E1B2462149B473540FE677645D5C8F473C2862633461B4BDFB561C0D5256A239F49483A926C2B6CBAA08A4381FA1AC4E26688ECE103E23C3D85B19D8600CEE57C301D3C2C13731673F599F3338CB7B644DE19A32297C0CE553FDDD737266630BB3416CF6C1477163B520276D6B63DB789A0284A65838696869CAEE20A6B828A476384C6C1AA6C48D9B4ABF816912C425AEB5B90093B253C936D3359E86041C9637B92E76261181F4DB98E4DC9415E5075815773FD07B2CA36C5821123D40A55CC57C8FB648C18642CF2A19F25D9678AE0001A19810420BF9979FE2826ECF1A53B8C07A9346FED6BCF664CFD63FA8DB1327FCAF87FA71A04205CF3528796D5661539F4A33760909F33BDCB3099791AED8E828C8978D992A765 -PublicFull = - Error = kyber private key does not have the correct byte count PrivateRaw = BAADF00D -PublicRaw = -PrivateFull = -PublicFull = +PublicRaw = Error = kyber public key does not have the correct byte count -PrivateRaw = +PrivateRaw = PublicRaw = BAADF00DE52CC940EC939B216BB5C77F5BAA8B2672950C72B722D19DF9671C264061A4D424E21A450B8CAC882508AFD23565E86664C4CD56094C1F72542E1C25424B0DCD4842DF48C8F79893D73148DCB99FB6490FF1218822D6017FD17FC8D6CC5514A5B3B3A1A169CCE766A7C74B24B4E8468A5527BC205919569E8619B87197BE1C5C34DBDC3756112875858FE986BA6E3A7A7F64CF37215E15AC522BDBAAB1D73A8738B90AF35A6F83C8839765AEA1322FF923237271E7E1BD9A56092A9591E8B54245A046E6E8268EA8306C0488F616BC65985ABE804F695A9EBB385DA97789F8D381DBE2156E70B09B1201F80143E55265B4868A7B67A924D0C6D932B3DFD18B58D3A6A5002D41080B03A9796CB3734B3627F4044929151ADC0C8348137B2F549FDD70B622C72F3AE772B77B638B6379162A64B0110FB0532162068919C351276618623A7B96867C3479CE6B3101658BAC7F05938F462C2F88918823A8444019DFE0381FA70A7C11BD85A394A1D11FCB6B8D7DD94E012881E6AC768A7486BC668665A83BFBF261B0C280D7878747EC340D0C57A35810D1FC768D128796EAB1F4C72BD7341ECCF030508392E8095985E3A63BA4CDACB96A15E506F22C5031D8CB6C4C2B227C6EA8EC76244BCC7F425FB5F28E1F9702C0F3AFE7A946A94BAD108375D512C43B52607ECC91889408A1156EC61593FF8156780C5EA2B462B733A72256424442CABA87CC1D101983095E0142420D295F2C064AC96738B021BBC75291194C10A978CB20FC15A1C4A91E1B2462149B473540FE677645D5C8F473C2862633461B4BDFB561C0D5256A239F49483A926C2B6CBAA08A4381FA1AC4E26688ECE103E23C3D85B19D8600CEE57C301D3C2C13731673F599F3338CB7B644DE19A32297C0CE553FDDD737266630BB3416CF6C1477163B520276D6B63DB789A0284A65838696869CAEE20A6B828A476384C6C1AA6C48D9B4ABF816912C425AEB5B90093B253C936D3359E86041C9637B92E76261181F4DB98E4DC9415E5075815773FD07B2CA36C5821123D40A55CC57C8FB648C18642CF2A19F25D9678AE0001A1981BF9979FE2826ECF1A53B8C07A9346FED6BCF664CFD63FA8DB1327FCAF87FA71A -PrivateFull = -PublicFull = - -Error = kyber public key t-param does not have the correct byte count -PrivateRaw = -PublicRaw = -PrivateFull = -PublicFull = 3082032A04820304BAADBEEFE52CC940EC939B216BB5C77F5BAA8B2672950C72B722D19DF9671C264061A4D424E21A450B8CAC882508AFD23565E86664C4CD56094C1F72542E1C25424B0DCD4842DF48C8F79893D73148DCB99FB6490FF1218822D6017FD17FC8D6CC5514A5B3B3A1A169CCE766A7C74B24B4E8468A5527BC205919569E8619B87197BE1C5C34DBDC3756112875858FE986BA6E3A7A7F64CF37215E15AC522BDBAAB1D73A8738B90AF35A6F83C8839765AEA1322FF923237271E7E1BD9A56092A9591E8B54245A046E6E8268EA8306C0488F616BC65985ABE804F695A9EBB385DA97789F8D381DBE2156E70B09B1201F80143E55265B4868A7B67A924D0C6D932B3DFD18B58D3A6A5002D41080B03A9796CB3734B3627F4044929151ADC0C8348137B2F549FDD70B622C72F3AE772B77B638B6379162A64B0110FB0532162068919C351276618623A7B96867C3479CE6B3101658BAC7F05938F462C2F88918823A8444019DFE0381FA70A7C11BD85A394A1D11FCB6B8D7DD94E012881E6AC768A7486BC668665A83BFBF261B0C280D7878747EC340D0C57A35810D1FC768D128796EAB1F4C72BD7341ECCF030508392E8095985E3A63BA4CDACB96A15E506F22C5031D8CB6C4C2B227C6EA8EC76244BCC7F425FB5F28E1F9702C0F3AFE7A946A94BAD108375D512C43B52607ECC91889408A1156EC61593FF8156780C5EA2B462B733A72256424442CABA87CC1D101983095E0142420D295F2C064AC96738B021BBC75291194C10A978CB20FC15A1C4A91E1B2462149B473540FE677645D5C8F473C2862633461B4BDFB561C0D5256A239F49483A926C2B6CBAA08A4381FA1AC4E26688ECE103E23C3D85B19D8600CEE57C301D3C2C13731673F599F3338CB7B644DE19A32297C0CE553FDDD737266630BB3416CF6C1477163B520276D6B63DB789A0284A65838696869CAEE20A6B828A476384C6C1AA6C48D9B4ABF816912C425AEB5B90093B253C936D3359E86041C9637B92E76261181F4DB98E4DC9415E5075815773FD07B2CA36C5821123D40A55CC57C8FB648C18642CF2A19F25D9678AE0001A19810420BF9979FE2826ECF1A53B8C07A9346FED6BCF664CFD63FA8DB1327FCAF87FA71A - -Error = kyber public key rho-param does not have the correct byte count -PrivateRaw = -PublicRaw = -PrivateFull = -PublicFull = 3082032504820300E52CC940EC939B216BB5C77F5BAA8B2672950C72B722D19DF9671C264061A4D424E21A450B8CAC882508AFD23565E86664C4CD56094C1F72542E1C25424B0DCD4842DF48C8F79893D73148DCB99FB6490FF1218822D6017FD17FC8D6CC5514A5B3B3A1A169CCE766A7C74B24B4E8468A5527BC205919569E8619B87197BE1C5C34DBDC3756112875858FE986BA6E3A7A7F64CF37215E15AC522BDBAAB1D73A8738B90AF35A6F83C8839765AEA1322FF923237271E7E1BD9A56092A9591E8B54245A046E6E8268EA8306C0488F616BC65985ABE804F695A9EBB385DA97789F8D381DBE2156E70B09B1201F80143E55265B4868A7B67A924D0C6D932B3DFD18B58D3A6A5002D41080B03A9796CB3734B3627F4044929151ADC0C8348137B2F549FDD70B622C72F3AE772B77B638B6379162A64B0110FB0532162068919C351276618623A7B96867C3479CE6B3101658BAC7F05938F462C2F88918823A8444019DFE0381FA70A7C11BD85A394A1D11FCB6B8D7DD94E012881E6AC768A7486BC668665A83BFBF261B0C280D7878747EC340D0C57A35810D1FC768D128796EAB1F4C72BD7341ECCF030508392E8095985E3A63BA4CDACB96A15E506F22C5031D8CB6C4C2B227C6EA8EC76244BCC7F425FB5F28E1F9702C0F3AFE7A946A94BAD108375D512C43B52607ECC91889408A1156EC61593FF8156780C5EA2B462B733A72256424442CABA87CC1D101983095E0142420D295F2C064AC96738B021BBC75291194C10A978CB20FC15A1C4A91E1B2462149B473540FE677645D5C8F473C2862633461B4BDFB561C0D5256A239F49483A926C2B6CBAA08A4381FA1AC4E26688ECE103E23C3D85B19D8600CEE57C301D3C2C13731673F599F3338CB7B644DE19A32297C0CE553FDDD737266630BB3416CF6C1477163B520276D6B63DB789A0284A65838696869CAEE20A6B828A476384C6C1AA6C48D9B4ABF816912C425AEB5B90093B253C936D3359E86041C9637B92E76261181F4DB98E4DC9415E5075815773FD07B2CA36C5821123D40A55CC57C8FB648C18642CF2A19F25D9678AE0001A1981041FBF79FE2826ECF1A53B8C07A9346FED6BCF664CFD63FA8DB1327FCAF87FA71A [Kyber-512-90s-r3] PrivateRaw = C6C9B2CA96CE5B715A6262CAA2989B72EB6730B54BC89B65BC021FAAC7AB88E5833B9A7454C94E49CC55EBE30C6B7702EBAB0A40728E1F108E8FF14AF217556E85551810C2716B4248B9B10EA7BD5D05CF12425CA648A653B26B1D645595D95323F153CB1ACAB9D29ED955817592C017C4465DB30066FB68AE3429E5453FB0199C6E9967608939057632674B3DA8BB587174BAF362433C4B9B75BA304F995AA6238BDE7398BD460619E00F61CB4A2040BF09C5120F51BA7808AE171B1C9C733F4025B872904F45AA8AFDA6B1B8B86407A1C619065634F78296D6915156C44735634CB2AB498574282754E020473F02201219327A4B748CAC50617A01D101C34FB20EE04BA70BE541794440F0E815778444A310295B39164C7633A8448408D16B47E68E80096DED5373840B830E84CBE1F25100788E53E3CD35AA365674A334DA913EA7A6EDE3C002987ED94A6D5AEB8B3272B3EB8097B6F723C7541782F90F3126BF8ABAC201F51D009B258C877CDA9304FD73242050693E380380D3898749CC7FAABAE09477319228B6D9606D876469D622B15A6A4845CDAF1A6603F25AADF5A271C225C4213FD9422743705B33FBC2FA9BB55B585A8F858DE578BC44C4B3AA919660045733E222D5409E5C4B789A109F458961AEF8AC798342C2E854E2701013729921574E340B9AEE44BF9A2971FCD80B6AF994F7385FB505359346417963AF61986076ABC54ED6B4130C5042EB04EB6C885E2C4888A63A52BA49B9C6BFA41A91CE650EF234A4ABB8B1122A15E167ADF4A78115881B6C2B26C9CC32E2A5552DB35AF280A0919A09047562CD33AC8332B74E6B962E3643B14019C7479CA1A29BC420038DF52FB6A2A7DF10C7798ACD4AC315423361C8334D38B0099D4A5136AB32D599A0CD5983C4864567509E9672C3BF6BAC914B0ED5D04AFCB1A8DA16776E0391E4F5655E7147F955C5078C798FD362C93A6C7E9914454A591CD93972107C61057A9AE417B776A1BF6683505A2D85D53A6AE0BC4740278B69BD0A608CB0484B04122FB3D46F6C06A3CC5523EC054030C9A8A585A5DE82CA41B39082052D970BCFE55389AA956BB9E2C62AC5CE80FA64A15B4DE4FB71DA7100E04B85596849F3E0326570227B48589E45B387E612C36C8BABF09EFA22A021184BB6197B011842DCE1C9682492836B2E96C059C92C15BD8825A8C0265B795234F8756E505C1EAA29E482BFE4FC0CE945B75E84817E5310245CB57A3A51E2F91CCCDC850CF59027497D124BB36449B28C62BB90181F01372B0379C03B994343C7476B3146C87C6E25B677F30CA7BDE3369F1177B8A90BB2561B1C637D7E9CAB2C8BC4E0717669871B4451313DA55879F07FD01637ED052A82A5C7B3D1427611CC5D9B17827B4F3A28610ECA998903B4CBB2187C849E7D862867391812A94139DB76328C4EECB6AD0590C31FB627E1A3C319DA5D3DE44FEF088027108A6F9762D1B6075C0C3835A83A44F230E7B0ACD77241AD0CBFE4822BF189C868161A6B330DCE8C1A39A3042D81BA5AB86603205747995E6C6AAAF33149ABF8B2061137A773074F6846277C6A67C6789814AD32B088CD688924948528648238050EC9C8955EC7897125CA5F708112735687017F51788FDB9C68526AB14E76C25C490E7794315BF686596CAB483624754C834A7AAA4268BB98131A739A617907456D139805830945C8BDD0104ECB41A96AF92B86C04B72D963E47AA9168A0BD72210672AA7D15642B1220541643C2CFC0636A6AD344022C01CA6B3B787B659A06DC50F85B59C5806AF9833876EDB66C558A3EA71585DB88F62E520CFF0C3FC8208B390CBA833BCCEB5B72576CAD3F564DEFB9B5C7589CC7A4B5F5B0E857A3E90E7B87797379E47A27774172A0AAE0417CDECA89E3114837F1C3B4B614AD9E774802B4E4226C6C7A56F603C931878422600CE5EE3A44C2015287AB3665544C470AEE0AC2A31F8345B459BFA2B7900257B0A1B0DF9086352660956A54598251A347860518B8E507CCA39ABB73215A9C347499CA94C2DC24B0FD66EB9AC5DAC214B46B65694D114B3893EBA6663EE3A6AE1846B7A2398569BB4B06A1EF34584AF9CC3F4E415FAA9096B4B96B0915BF2D5808AB71CD65C890226C4BEE74DD97A91B1B6363849870DA23EF08A1CFD487C194D66FF16C96F3B02FB97D3D087B1FD1D6E91878E8380318F7B4843FBFC07C4BC1D13EDCC88E413D23BD8E73176A0B05B6D2381822474393D22585AF90351770587A6FCDEA8254D8EEC0CEF8668E30B3D24525B36AB3C75063B8A03D4 PublicRaw = 970BCFE55389AA956BB9E2C62AC5CE80FA64A15B4DE4FB71DA7100E04B85596849F3E0326570227B48589E45B387E612C36C8BABF09EFA22A021184BB6197B011842DCE1C9682492836B2E96C059C92C15BD8825A8C0265B795234F8756E505C1EAA29E482BFE4FC0CE945B75E84817E5310245CB57A3A51E2F91CCCDC850CF59027497D124BB36449B28C62BB90181F01372B0379C03B994343C7476B3146C87C6E25B677F30CA7BDE3369F1177B8A90BB2561B1C637D7E9CAB2C8BC4E0717669871B4451313DA55879F07FD01637ED052A82A5C7B3D1427611CC5D9B17827B4F3A28610ECA998903B4CBB2187C849E7D862867391812A94139DB76328C4EECB6AD0590C31FB627E1A3C319DA5D3DE44FEF088027108A6F9762D1B6075C0C3835A83A44F230E7B0ACD77241AD0CBFE4822BF189C868161A6B330DCE8C1A39A3042D81BA5AB86603205747995E6C6AAAF33149ABF8B2061137A773074F6846277C6A67C6789814AD32B088CD688924948528648238050EC9C8955EC7897125CA5F708112735687017F51788FDB9C68526AB14E76C25C490E7794315BF686596CAB483624754C834A7AAA4268BB98131A739A617907456D139805830945C8BDD0104ECB41A96AF92B86C04B72D963E47AA9168A0BD72210672AA7D15642B1220541643C2CFC0636A6AD344022C01CA6B3B787B659A06DC50F85B59C5806AF9833876EDB66C558A3EA71585DB88F62E520CFF0C3FC8208B390CBA833BCCEB5B72576CAD3F564DEFB9B5C7589CC7A4B5F5B0E857A3E90E7B87797379E47A27774172A0AAE0417CDECA89E3114837F1C3B4B614AD9E774802B4E4226C6C7A56F603C931878422600CE5EE3A44C2015287AB3665544C470AEE0AC2A31F8345B459BFA2B7900257B0A1B0DF9086352660956A54598251A347860518B8E507CCA39ABB73215A9C347499CA94C2DC24B0FD66EB9AC5DAC214B46B65694D114B3893EBA6663EE3A6AE1846B7A2398569BB4B06A1EF34584AF9CC3F4E415FAA9096B4B96B0915BF2D5808AB71CD65C890226C4BEE74DD97A91B1B6363849870DA23EF08A1CFD487C194D66FF16C96F3B02FB97D3D087B1FD1D6E91878E8380318F7B4843FB -PrivateFull = 3082067502010004200351770587A6FCDEA8254D8EEC0CEF8668E30B3D24525B36AB3C75063B8A03D404820300C6C9B2CA96CE5B715A6262CAA2989B72EB6730B54BC89B65BC021FAAC7AB88E5833B9A7454C94E49CC55EBE30C6B7702EBAB0A40728E1F108E8FF14AF217556E85551810C2716B4248B9B10EA7BD5D05CF12425CA648A653B26B1D645595D95323F153CB1ACAB9D29ED955817592C017C4465DB30066FB68AE3429E5453FB0199C6E9967608939057632674B3DA8BB587174BAF362433C4B9B75BA304F995AA6238BDE7398BD460619E00F61CB4A2040BF09C5120F51BA7808AE171B1C9C733F4025B872904F45AA8AFDA6B1B8B86407A1C619065634F78296D6915156C44735634CB2AB498574282754E020473F02201219327A4B748CAC50617A01D101C34FB20EE04BA70BE541794440F0E815778444A310295B39164C7633A8448408D16B47E68E80096DED5373840B830E84CBE1F25100788E53E3CD35AA365674A334DA913EA7A6EDE3C002987ED94A6D5AEB8B3272B3EB8097B6F723C7541782F90F3126BF8ABAC201F51D009B258C877CDA9304FD73242050693E380380D3898749CC7FAABAE09477319228B6D9606D876469D622B15A6A4845CDAF1A6603F25AADF5A271C225C4213FD9422743705B33FBC2FA9BB55B585A8F858DE578BC44C4B3AA919660045733E222D5409E5C4B789A109F458961AEF8AC798342C2E854E2701013729921574E340B9AEE44BF9A2971FCD80B6AF994F7385FB505359346417963AF61986076ABC54ED6B4130C5042EB04EB6C885E2C4888A63A52BA49B9C6BFA41A91CE650EF234A4ABB8B1122A15E167ADF4A78115881B6C2B26C9CC32E2A5552DB35AF280A0919A09047562CD33AC8332B74E6B962E3643B14019C7479CA1A29BC420038DF52FB6A2A7DF10C7798ACD4AC315423361C8334D38B0099D4A5136AB32D599A0CD5983C4864567509E9672C3BF6BAC914B0ED5D04AFCB1A8DA16776E0391E4F5655E7147F955C5078C798FD362C93A6C7E9914454A591CD93972107C61057A9AE417B776A1BF6683505A2D85D53A6AE0BC4740278B69BD0A608CB0484B04122FB3D46F6C06A3CC5523EC054030C9A8A585A5DE82CA41B39082052D3082032604820300970BCFE55389AA956BB9E2C62AC5CE80FA64A15B4DE4FB71DA7100E04B85596849F3E0326570227B48589E45B387E612C36C8BABF09EFA22A021184BB6197B011842DCE1C9682492836B2E96C059C92C15BD8825A8C0265B795234F8756E505C1EAA29E482BFE4FC0CE945B75E84817E5310245CB57A3A51E2F91CCCDC850CF59027497D124BB36449B28C62BB90181F01372B0379C03B994343C7476B3146C87C6E25B677F30CA7BDE3369F1177B8A90BB2561B1C637D7E9CAB2C8BC4E0717669871B4451313DA55879F07FD01637ED052A82A5C7B3D1427611CC5D9B17827B4F3A28610ECA998903B4CBB2187C849E7D862867391812A94139DB76328C4EECB6AD0590C31FB627E1A3C319DA5D3DE44FEF088027108A6F9762D1B6075C0C3835A83A44F230E7B0ACD77241AD0CBFE4822BF189C868161A6B330DCE8C1A39A3042D81BA5AB86603205747995E6C6AAAF33149ABF8B2061137A773074F6846277C6A67C6789814AD32B088CD688924948528648238050EC9C8955EC7897125CA5F708112735687017F51788FDB9C68526AB14E76C25C490E7794315BF686596CAB483624754C834A7AAA4268BB98131A739A617907456D139805830945C8BDD0104ECB41A96AF92B86C04B72D963E47AA9168A0BD72210672AA7D15642B1220541643C2CFC0636A6AD344022C01CA6B3B787B659A06DC50F85B59C5806AF9833876EDB66C558A3EA71585DB88F62E520CFF0C3FC8208B390CBA833BCCEB5B72576CAD3F564DEFB9B5C7589CC7A4B5F5B0E857A3E90E7B87797379E47A27774172A0AAE0417CDECA89E3114837F1C3B4B614AD9E774802B4E4226C6C7A56F603C931878422600CE5EE3A44C2015287AB3665544C470AEE0AC2A31F8345B459BFA2B7900257B0A1B0DF9086352660956A54598251A347860518B8E507CCA39ABB73215A9C347499CA94C2DC24B0FD66EB9AC5DAC214B46B65694D114B3893EBA6663EE3A6AE1846B7A2398569BB4B06A1EF34584AF9CC3F4E415FAA9096B4B96B0915BF2D5808AB71CD65C890226C4BEE74DD97A91B1B6363849870DA23EF08A1C0420FD487C194D66FF16C96F3B02FB97D3D087B1FD1D6E91878E8380318F7B4843FB0420A50D4D72DFEFE86120E1E93DB82CDD7B74D7ECD9B923872845CEADADB6A62721 -PublicFull = 3082032604820300970BCFE55389AA956BB9E2C62AC5CE80FA64A15B4DE4FB71DA7100E04B85596849F3E0326570227B48589E45B387E612C36C8BABF09EFA22A021184BB6197B011842DCE1C9682492836B2E96C059C92C15BD8825A8C0265B795234F8756E505C1EAA29E482BFE4FC0CE945B75E84817E5310245CB57A3A51E2F91CCCDC850CF59027497D124BB36449B28C62BB90181F01372B0379C03B994343C7476B3146C87C6E25B677F30CA7BDE3369F1177B8A90BB2561B1C637D7E9CAB2C8BC4E0717669871B4451313DA55879F07FD01637ED052A82A5C7B3D1427611CC5D9B17827B4F3A28610ECA998903B4CBB2187C849E7D862867391812A94139DB76328C4EECB6AD0590C31FB627E1A3C319DA5D3DE44FEF088027108A6F9762D1B6075C0C3835A83A44F230E7B0ACD77241AD0CBFE4822BF189C868161A6B330DCE8C1A39A3042D81BA5AB86603205747995E6C6AAAF33149ABF8B2061137A773074F6846277C6A67C6789814AD32B088CD688924948528648238050EC9C8955EC7897125CA5F708112735687017F51788FDB9C68526AB14E76C25C490E7794315BF686596CAB483624754C834A7AAA4268BB98131A739A617907456D139805830945C8BDD0104ECB41A96AF92B86C04B72D963E47AA9168A0BD72210672AA7D15642B1220541643C2CFC0636A6AD344022C01CA6B3B787B659A06DC50F85B59C5806AF9833876EDB66C558A3EA71585DB88F62E520CFF0C3FC8208B390CBA833BCCEB5B72576CAD3F564DEFB9B5C7589CC7A4B5F5B0E857A3E90E7B87797379E47A27774172A0AAE0417CDECA89E3114837F1C3B4B614AD9E774802B4E4226C6C7A56F603C931878422600CE5EE3A44C2015287AB3665544C470AEE0AC2A31F8345B459BFA2B7900257B0A1B0DF9086352660956A54598251A347860518B8E507CCA39ABB73215A9C347499CA94C2DC24B0FD66EB9AC5DAC214B46B65694D114B3893EBA6663EE3A6AE1846B7A2398569BB4B06A1EF34584AF9CC3F4E415FAA9096B4B96B0915BF2D5808AB71CD65C890226C4BEE74DD97A91B1B6363849870DA23EF08A1C0420FD487C194D66FF16C96F3B02FB97D3D087B1FD1D6E91878E8380318F7B4843FB [Kyber-768-r3] PrivateRaw = 1EC88C5AB350673513A438B369148EFFB65369A9B28BE37EA687ADE99A5AA36C273457CFB65CC2AE0C1C7D19A11EE4AE1FE963F1B881C2243B37C1064E43108A25C619676624341BBB26857A6C115E06B792F48242C0760EFCC82F313785D59E0586CE61730517B62045D0B1B8DBA143DA7BEFF36CE67B55D8E449248A36CD54C38AB61F5F9054195B14715C8BD4B9CF9EB084E9460846BC6BB0889A75B1506A060A012327367857897CA1F665690354BE17D5C2EFB273ABE64D7D58A574A879F674AEB5E0B9C3564423170F6EA7BB8B63456CB950C8109F15C3679BB47045902E7AF0B5C3E91D45234DF101CB2597174B25730EBC0C08F23639E5046516556A3C1E570173536A8E5001556C79AF9346B9383267AE422AE565A75BE32B58864743E01333888EF62A47579235FC266472576CB6C27F562B571E76906C49C873062FF7686F40B9B011D983F5D5B2B1D70EC2D331C265A261E9682FC114439C82C4F90D74690D465302AFB201020A88D5026C2083788B070943C051402C1D7F3C7FB86263971BB4859A1800D6056CF357F6D04256D8BC056A53CA2862B0521C481C426815A2FA7004D85335E4440C5E8A30B4F9011A98187A34C0AD748E38D39697D797FC5CBE0432A65DC5223B08633DF826F2CCC597E94B38D37EA73B48A98B585A11ADA0D95416229AFF0285B655606B131ACB43738934AF6BCAB4FE17B77627B0A44A09C14124E3966593C18D7288C36C7B8173CABB21434D4173126CD39A52D471AD928A770BB74E8A3F6F5393190569F04235D9C4957FC317216154940688B1548B9C027E9A2C02A0F83B9AF1C59EA67BC51898FB46C76F21855FD770C682CE0595504BD7AF2383203CF2BB7FB016DCD90ED8EC77B874220A30AFD52953B1DA5F21D1BAFA629E7BF4657F483703168EC266A682B60D9291A8F6B2A5547396D7DB3AF17725B6122D9411B6F55884341C38E0F2430E9CC1E2EAAAFDE0A235B756B447CF2FA98E72976908BBB9B7A03ED1DBA131A37F3358443FE01FCC640A157580FB6389A763433926ABEC8319E93C496DE01EDFC41C01A6C3A725795ED6AEE7948A1D112D78FC14BB349890D3490F374BC460099A278190156F678109E29493D91010958355B9621B69A3A0E3D19F44188FA4B959A49A45E8F26B2131831DCB9093884486C00BB4809591B73304EC68E6295D89C4CD757B2E9F4A86351180A09165C227341C686673341D5686B67906190C708C33F559413A1AC9270BDBB7BCF6224797EC32BC958F41D7A538F86CE189AD12C67027712819BB150474B8BEE2CB63B5213B8B79D398952CA6B32CD394FC2B232F6AAD4F67A21D830654410DCF758360604645B56D5E687DBC29B8253C59F77541F8166FFB9734DE98041A21684DE018A3D5AF9E8B22408A811DF76865016A476633962ABEF5C56848AA91658BB3382A481A41B392D1366E553CDAD23E25B497F807519A56415DDCBE0602C3A518B0FCA47F512103C6762BB7F8B94687A1DA65510A7698A7DC25F80857561165770B014D63516281C6A1D12EF1947E4745A8968182746A95FADAAFB06035BD54809B0250D00A05F2C2A78F952FE3AC707EDB32648590D152AC9289C866C909FDE64874435C5E331C1F46947AC34AC1C6702278BAEF0A0BABE84FD37C16F950AF675A876CC065FC4A3A25E487F00B6C89A8402959ABAEC7402267AA049C44AEB72307060FECC5796B580DCC70159979BDF5A1927E590CF9EC5880D27623F13AC0A10E293CB52C5A70C7205239CAC2C962C4660AC96FC95506D15D7288BF14F06582B277355AA1C8CAA1C26985E6A4BDE025BA27B26EF019C1D321379173524FA6BE174B260EF27122A09183FA9E19560EBB276422C4093B4941908A1FAFD3933D0CA60A0AB4604CC58B03A348274417C3247B23C6143A0E0A46584389B3940AAEBEB4AF34636D8636AFDE6C9B5906AC35BA1D83433AF8900CF23279622018BE1A2E24B998ABB2943CE8B9455401C9CB656D78536005AA34B127D5F92FD5C6C94487B71C5C4008F19C845C82BD34A92EEC1CD6656BD02274569A3BA524A3EAD667CD4A7138C973A74528FE976A4ACA0789BC81418021E1551BF7A2B09C88A9EC927F81A28E803099C4966122FAA893A95C406238F9794AA064B20F70CA957262A369C0C09B13CB3B6E93628B1BA600A4D62DAF387C722086B9622E9367B1A64A50ADD9AB50D35B2AC0341B610BE5C0C5D2D3B771E353E4D32FC9A189C098A66337A489754333ACA39D714DB8595603073A571B8784B8C891165D06F00BB7F103D05BBA948A1F9C859FDDB48A66D19240627D6E74A29E1A3AD9A7476D312C3947A9A9632193FB42B20C42C7D8C162495CFE1529DF2983ED124A8211202E6B094476220896CC06F0A88EE17AF954724AC010D3B49473F9074AFC8F69C92976C6B5A8345B28997F98A1785F526FCFE582F6D1995CA739BCC9CF2A1594571277FD6A2DC5258CB5569BB4B0185D0AD05A09B923E9CDBA08B55AFB7F40C227757BB8AB9C406AC1498B4116C081099CE26225D70659B5BE716914E571588E7063ED650294C4BAAC93C9D8D828AAEB715B3C951EC96D797A81D4F906FFF72A16313BEFE981B77843C8596642004E88F966E241705E55A2C79A059BD020055727BFC746E8B3A9E5852D8F2139F846845E264564246231831392F328E5B50ED37238EBF4719978697666492B064135346B280A395110A349132E687112AFB874D49624E045416EC0BFF9B219FB3B8E6A13064CB397DF781E9EE78C6F326078476D5DDA8602F632B7D966841A3EF3389C214B5DEDFB7F9133A5321A5539AA5BB35C3DF7C979439A4D7C337243E862E581122F949FC0E772615079A5CC22D6E036994453023631397A2EE0C56534326774A34612DBAD0619B85DC4A7FF409BD1FC2D8D272BAABC3D94938CE1997D549084F97B800B22322ED9C7A400AAB038CC9A97924434A774FBC27689A604A7B562731BE9E600E8494768CC592BC14555692233806300286BAB7A763699ABA0E8443A726C314261FF021AEEBA6B29B1C244ECA4DCF35C847047ECC179E4F8676536825BF0A5CAE54EF28589256A66465B0FD550AA4F0A0508C81B6FB33604B8AA42131DFBD4900B4771523B94D872B836765623EA9125ACA06EF48F92A390A35181E23A592F6B5CA26325CA52BDF98287079B896C6C3995E61FD1064B2A36ACF1191E399C353CB91396EAAFC505C8817316AEA40A3F313F034A18DFA46506A7D8E51748C82152C28CC7612944C3017F44E1FDDD8D5AFAF0D4474A09619F44589935DE99088BDDB7C001CB879983E04E3B2115B618D6B3213AFFD4ACF2E576A148D96DD98AFE780E05798B9BAD13FB4AEB090F140D9E6E5E PublicRaw = FDE64874435C5E331C1F46947AC34AC1C6702278BAEF0A0BABE84FD37C16F950AF675A876CC065FC4A3A25E487F00B6C89A8402959ABAEC7402267AA049C44AEB72307060FECC5796B580DCC70159979BDF5A1927E590CF9EC5880D27623F13AC0A10E293CB52C5A70C7205239CAC2C962C4660AC96FC95506D15D7288BF14F06582B277355AA1C8CAA1C26985E6A4BDE025BA27B26EF019C1D321379173524FA6BE174B260EF27122A09183FA9E19560EBB276422C4093B4941908A1FAFD3933D0CA60A0AB4604CC58B03A348274417C3247B23C6143A0E0A46584389B3940AAEBEB4AF34636D8636AFDE6C9B5906AC35BA1D83433AF8900CF23279622018BE1A2E24B998ABB2943CE8B9455401C9CB656D78536005AA34B127D5F92FD5C6C94487B71C5C4008F19C845C82BD34A92EEC1CD6656BD02274569A3BA524A3EAD667CD4A7138C973A74528FE976A4ACA0789BC81418021E1551BF7A2B09C88A9EC927F81A28E803099C4966122FAA893A95C406238F9794AA064B20F70CA957262A369C0C09B13CB3B6E93628B1BA600A4D62DAF387C722086B9622E9367B1A64A50ADD9AB50D35B2AC0341B610BE5C0C5D2D3B771E353E4D32FC9A189C098A66337A489754333ACA39D714DB8595603073A571B8784B8C891165D06F00BB7F103D05BBA948A1F9C859FDDB48A66D19240627D6E74A29E1A3AD9A7476D312C3947A9A9632193FB42B20C42C7D8C162495CFE1529DF2983ED124A8211202E6B094476220896CC06F0A88EE17AF954724AC010D3B49473F9074AFC8F69C92976C6B5A8345B28997F98A1785F526FCFE582F6D1995CA739BCC9CF2A1594571277FD6A2DC5258CB5569BB4B0185D0AD05A09B923E9CDBA08B55AFB7F40C227757BB8AB9C406AC1498B4116C081099CE26225D70659B5BE716914E571588E7063ED650294C4BAAC93C9D8D828AAEB715B3C951EC96D797A81D4F906FFF72A16313BEFE981B77843C8596642004E88F966E241705E55A2C79A059BD020055727BFC746E8B3A9E5852D8F2139F846845E264564246231831392F328E5B50ED37238EBF4719978697666492B064135346B280A395110A349132E687112AFB874D49624E045416EC0BFF9B219FB3B8E6A13064CB397DF781E9EE78C6F326078476D5DDA8602F632B7D966841A3EF3389C214B5DEDFB7F9133A5321A5539AA5BB35C3DF7C979439A4D7C337243E862E581122F949FC0E772615079A5CC22D6E036994453023631397A2EE0C56534326774A34612DBAD0619B85DC4A7FF409BD1FC2D8D272BAABC3D94938CE1997D549084F97B800B22322ED9C7A400AAB038CC9A97924434A774FBC27689A604A7B562731BE9E600E8494768CC592BC14555692233806300286BAB7A763699ABA0E8443A726C314261FF021AEEBA6B29B1C244ECA4DCF35C847047ECC179E4F8676536825BF0A5CAE54EF28589256A66465B0FD550AA4F0A0508C81B6FB33604B8AA42131DFBD4900B4771523B94D872B836765623EA9125ACA06EF48F92A390A35181E23A592F6B5CA26325CA52BDF98287079B896C6C3995E61FD1064B2A36ACF1191E399C353CB91396EAAFC505C8817316AEA40A3F313F034A18DFA46506A7D8E51748C82152C28CC7612944C3017F44E1FDDD8D5AFAF0 -PrivateFull = 3082097502010004203AFFD4ACF2E576A148D96DD98AFE780E05798B9BAD13FB4AEB090F140D9E6E5E048204801EC88C5AB350673513A438B369148EFFB65369A9B28BE37EA687ADE99A5AA36C273457CFB65CC2AE0C1C7D19A11EE4AE1FE963F1B881C2243B37C1064E43108A25C619676624341BBB26857A6C115E06B792F48242C0760EFCC82F313785D59E0586CE61730517B62045D0B1B8DBA143DA7BEFF36CE67B55D8E449248A36CD54C38AB61F5F9054195B14715C8BD4B9CF9EB084E9460846BC6BB0889A75B1506A060A012327367857897CA1F665690354BE17D5C2EFB273ABE64D7D58A574A879F674AEB5E0B9C3564423170F6EA7BB8B63456CB950C8109F15C3679BB47045902E7AF0B5C3E91D45234DF101CB2597174B25730EBC0C08F23639E5046516556A3C1E570173536A8E5001556C79AF9346B9383267AE422AE565A75BE32B58864743E01333888EF62A47579235FC266472576CB6C27F562B571E76906C49C873062FF7686F40B9B011D983F5D5B2B1D70EC2D331C265A261E9682FC114439C82C4F90D74690D465302AFB201020A88D5026C2083788B070943C051402C1D7F3C7FB86263971BB4859A1800D6056CF357F6D04256D8BC056A53CA2862B0521C481C426815A2FA7004D85335E4440C5E8A30B4F9011A98187A34C0AD748E38D39697D797FC5CBE0432A65DC5223B08633DF826F2CCC597E94B38D37EA73B48A98B585A11ADA0D95416229AFF0285B655606B131ACB43738934AF6BCAB4FE17B77627B0A44A09C14124E3966593C18D7288C36C7B8173CABB21434D4173126CD39A52D471AD928A770BB74E8A3F6F5393190569F04235D9C4957FC317216154940688B1548B9C027E9A2C02A0F83B9AF1C59EA67BC51898FB46C76F21855FD770C682CE0595504BD7AF2383203CF2BB7FB016DCD90ED8EC77B874220A30AFD52953B1DA5F21D1BAFA629E7BF4657F483703168EC266A682B60D9291A8F6B2A5547396D7DB3AF17725B6122D9411B6F55884341C38E0F2430E9CC1E2EAAAFDE0A235B756B447CF2FA98E72976908BBB9B7A03ED1DBA131A37F3358443FE01FCC640A157580FB6389A763433926ABEC8319E93C496DE01EDFC41C01A6C3A725795ED6AEE7948A1D112D78FC14BB349890D3490F374BC460099A278190156F678109E29493D91010958355B9621B69A3A0E3D19F44188FA4B959A49A45E8F26B2131831DCB9093884486C00BB4809591B73304EC68E6295D89C4CD757B2E9F4A86351180A09165C227341C686673341D5686B67906190C708C33F559413A1AC9270BDBB7BCF6224797EC32BC958F41D7A538F86CE189AD12C67027712819BB150474B8BEE2CB63B5213B8B79D398952CA6B32CD394FC2B232F6AAD4F67A21D830654410DCF758360604645B56D5E687DBC29B8253C59F77541F8166FFB9734DE98041A21684DE018A3D5AF9E8B22408A811DF76865016A476633962ABEF5C56848AA91658BB3382A481A41B392D1366E553CDAD23E25B497F807519A56415DDCBE0602C3A518B0FCA47F512103C6762BB7F8B94687A1DA65510A7698A7DC25F80857561165770B014D63516281C6A1D12EF1947E4745A8968182746A95FADAAFB06035BD54809B0250D00A05F2C2A78F952FE3AC707EDB32648590D152AC9289C866C909308204A604820480FDE64874435C5E331C1F46947AC34AC1C6702278BAEF0A0BABE84FD37C16F950AF675A876CC065FC4A3A25E487F00B6C89A8402959ABAEC7402267AA049C44AEB72307060FECC5796B580DCC70159979BDF5A1927E590CF9EC5880D27623F13AC0A10E293CB52C5A70C7205239CAC2C962C4660AC96FC95506D15D7288BF14F06582B277355AA1C8CAA1C26985E6A4BDE025BA27B26EF019C1D321379173524FA6BE174B260EF27122A09183FA9E19560EBB276422C4093B4941908A1FAFD3933D0CA60A0AB4604CC58B03A348274417C3247B23C6143A0E0A46584389B3940AAEBEB4AF34636D8636AFDE6C9B5906AC35BA1D83433AF8900CF23279622018BE1A2E24B998ABB2943CE8B9455401C9CB656D78536005AA34B127D5F92FD5C6C94487B71C5C4008F19C845C82BD34A92EEC1CD6656BD02274569A3BA524A3EAD667CD4A7138C973A74528FE976A4ACA0789BC81418021E1551BF7A2B09C88A9EC927F81A28E803099C4966122FAA893A95C406238F9794AA064B20F70CA957262A369C0C09B13CB3B6E93628B1BA600A4D62DAF387C722086B9622E9367B1A64A50ADD9AB50D35B2AC0341B610BE5C0C5D2D3B771E353E4D32FC9A189C098A66337A489754333ACA39D714DB8595603073A571B8784B8C891165D06F00BB7F103D05BBA948A1F9C859FDDB48A66D19240627D6E74A29E1A3AD9A7476D312C3947A9A9632193FB42B20C42C7D8C162495CFE1529DF2983ED124A8211202E6B094476220896CC06F0A88EE17AF954724AC010D3B49473F9074AFC8F69C92976C6B5A8345B28997F98A1785F526FCFE582F6D1995CA739BCC9CF2A1594571277FD6A2DC5258CB5569BB4B0185D0AD05A09B923E9CDBA08B55AFB7F40C227757BB8AB9C406AC1498B4116C081099CE26225D70659B5BE716914E571588E7063ED650294C4BAAC93C9D8D828AAEB715B3C951EC96D797A81D4F906FFF72A16313BEFE981B77843C8596642004E88F966E241705E55A2C79A059BD020055727BFC746E8B3A9E5852D8F2139F846845E264564246231831392F328E5B50ED37238EBF4719978697666492B064135346B280A395110A349132E687112AFB874D49624E045416EC0BFF9B219FB3B8E6A13064CB397DF781E9EE78C6F326078476D5DDA8602F632B7D966841A3EF3389C214B5DEDFB7F9133A5321A5539AA5BB35C3DF7C979439A4D7C337243E862E581122F949FC0E772615079A5CC22D6E036994453023631397A2EE0C56534326774A34612DBAD0619B85DC4A7FF409BD1FC2D8D272BAABC3D94938CE1997D549084F97B800B22322ED9C7A400AAB038CC9A97924434A774FBC27689A604A7B562731BE9E600E8494768CC592BC14555692233806300286BAB7A763699ABA0E8443A726C314261FF021AEEBA6B29B1C244ECA4DCF35C847047ECC179E4F8676536825BF0A5CAE54EF28589256A66465B0FD550AA4F0A0508C81B6FB33604B8AA42131DFBD4900B4771523B94D872B836765623EA9125ACA06EF48F92A390A35181E23A592F6B5CA26325CA52BDF98287079B896C6C3995E61FD1064B2A36ACF1191E399C353CB91396EAAFC505C8817316AEA40A3F313F0420034A18DFA46506A7D8E51748C82152C28CC7612944C3017F44E1FDDD8D5AFAF0042038E5A6B459CFF00169874DD923C91F75630973300ED3FC78FDB813AE57FF58CE -PublicFull = 308204A604820480FDE64874435C5E331C1F46947AC34AC1C6702278BAEF0A0BABE84FD37C16F950AF675A876CC065FC4A3A25E487F00B6C89A8402959ABAEC7402267AA049C44AEB72307060FECC5796B580DCC70159979BDF5A1927E590CF9EC5880D27623F13AC0A10E293CB52C5A70C7205239CAC2C962C4660AC96FC95506D15D7288BF14F06582B277355AA1C8CAA1C26985E6A4BDE025BA27B26EF019C1D321379173524FA6BE174B260EF27122A09183FA9E19560EBB276422C4093B4941908A1FAFD3933D0CA60A0AB4604CC58B03A348274417C3247B23C6143A0E0A46584389B3940AAEBEB4AF34636D8636AFDE6C9B5906AC35BA1D83433AF8900CF23279622018BE1A2E24B998ABB2943CE8B9455401C9CB656D78536005AA34B127D5F92FD5C6C94487B71C5C4008F19C845C82BD34A92EEC1CD6656BD02274569A3BA524A3EAD667CD4A7138C973A74528FE976A4ACA0789BC81418021E1551BF7A2B09C88A9EC927F81A28E803099C4966122FAA893A95C406238F9794AA064B20F70CA957262A369C0C09B13CB3B6E93628B1BA600A4D62DAF387C722086B9622E9367B1A64A50ADD9AB50D35B2AC0341B610BE5C0C5D2D3B771E353E4D32FC9A189C098A66337A489754333ACA39D714DB8595603073A571B8784B8C891165D06F00BB7F103D05BBA948A1F9C859FDDB48A66D19240627D6E74A29E1A3AD9A7476D312C3947A9A9632193FB42B20C42C7D8C162495CFE1529DF2983ED124A8211202E6B094476220896CC06F0A88EE17AF954724AC010D3B49473F9074AFC8F69C92976C6B5A8345B28997F98A1785F526FCFE582F6D1995CA739BCC9CF2A1594571277FD6A2DC5258CB5569BB4B0185D0AD05A09B923E9CDBA08B55AFB7F40C227757BB8AB9C406AC1498B4116C081099CE26225D70659B5BE716914E571588E7063ED650294C4BAAC93C9D8D828AAEB715B3C951EC96D797A81D4F906FFF72A16313BEFE981B77843C8596642004E88F966E241705E55A2C79A059BD020055727BFC746E8B3A9E5852D8F2139F846845E264564246231831392F328E5B50ED37238EBF4719978697666492B064135346B280A395110A349132E687112AFB874D49624E045416EC0BFF9B219FB3B8E6A13064CB397DF781E9EE78C6F326078476D5DDA8602F632B7D966841A3EF3389C214B5DEDFB7F9133A5321A5539AA5BB35C3DF7C979439A4D7C337243E862E581122F949FC0E772615079A5CC22D6E036994453023631397A2EE0C56534326774A34612DBAD0619B85DC4A7FF409BD1FC2D8D272BAABC3D94938CE1997D549084F97B800B22322ED9C7A400AAB038CC9A97924434A774FBC27689A604A7B562731BE9E600E8494768CC592BC14555692233806300286BAB7A763699ABA0E8443A726C314261FF021AEEBA6B29B1C244ECA4DCF35C847047ECC179E4F8676536825BF0A5CAE54EF28589256A66465B0FD550AA4F0A0508C81B6FB33604B8AA42131DFBD4900B4771523B94D872B836765623EA9125ACA06EF48F92A390A35181E23A592F6B5CA26325CA52BDF98287079B896C6C3995E61FD1064B2A36ACF1191E399C353CB91396EAAFC505C8817316AEA40A3F313F0420034A18DFA46506A7D8E51748C82152C28CC7612944C3017F44E1FDDD8D5AFAF0 [Kyber-768-90s-r3] PrivateRaw = D71C2F94B4246BD8BA508012629918BCF4CE75DBB5237B285014477272AB1999144DA384326717E8F5683C4CBE90D88D9907C5C3DC8E951531B466B7B8D73D0DEBB0E36479F6A5479C1082A9C9089BA69CAE56ABFDD8BEF4CC756CDC0FFD8264D58B4955CB92DD9C30162779513A6273B7311E0888A263B7C1BC1CB25A4BD1C28E2BB51CAB46705BEAAB5CA5CCDFE34B4E8370E8E040A780C7DA71C06CA3840CB7449E17A684297301991C57EC3F9C57103EFA88FD27079A167504E59641C293F06A1E63DB74E0496893E20E61665EB5FAA0E9B82053C35D022C3F6F94760AB137EE7402A684CB02D6C4AFB337A9F719D639C097DBB9E3047B8AF0C2E87A605D48B0539571060B246D9685D1D41E5A18C3212A54361BA86206B7F7DC6E2745B632B799FE39511DD0CFB0ECA3069A39FB9CBBEA5801CCB40489005820A175BB062FF217C99571AE1F3A4A6843669EAA14E7E0873401A200EB3EE317547436CC8ACB0FD1AC636FC57AA1D7BD92F700E27B06FD6389EA8BA93F3C0C568A9A0AC3CB0AC0942EA395C63A85F6161F8F028E68B7823D322D5D727C1944B6706AA5CBF297E5984E90B991EE99C44FE836C01582892A9D8B219418F19619E022DD559FB91808DCBC697CD764C2681625EA3D3EDAADE1C4ADE101144B3C43ABD18FA3B9A814F71A22528BBEB0B5F2F3BFC13181604932C8551BD3998366F9552BA5A0F665021073BBFE522C0242612249B56FF6B60A3718EA481982395FF67A876C028D27004F3BDA3DB1F65427A78E88587B07A49BFD847B1AA64323B79E8138233AC05D5FDA78D8FBC08320A1937924EB5AB7B7B440F508241B9A66CF89A156282E51773BCB202A253C6803091EAEA189CBDA36D0A9113A2C928E2366EFE84F8A6B1689E24C6FC33093E84E8C5C598BD3A184B62DD2D196332928F182CA67E1BCBEFBADC547B9AFEB947E524ADCEB2C16CA03D096A970E0A47363449888795EA6A91A29242D76A21A850B3227145CB92298ECC48E144E48E66A5DC25CA4ABAFDFF57B9539B8D0F20D845254CE86613E10B0EF05C1CA5A3DD0C83D9B71789E2C84AF06B83F776A10B565C781B9338350EAA92793EA75BC4B0690C81B769A34123386A9044012258F734ABF4F265DF8809EBF1410EE07A4169733C4906CFD822D7FB82E2BB46402EB403655950C832072D055261C111F703FC57BCAEEF95EB741519E644C99065AE24C7739E2066B29074A79894C5C91DBE54BB0E09EEC2665CBC5C61BD63E764154CEFB66518B92905314EA2249BFE1869AA5285EF004A10B90BE88002A96AD1CD8B05F875BFC22AF91CA94C8DB0ED0619E32326A96E4A12AD43D4D38A0DB09689BC2C4A8689A7BDA6A5112751D14382C0A3DDFC68CB0256F30E216EC018FC387C66C655D84E59F8EE237B181AF7753BFD4A0908E978901B5419C46A7C07BB70A557F01C082634247D0770FD1EB63ACC05286A483C0F183131613AADBBCBE87923CD832D6053456520566A93640644B7EF50428C4041255929DC40348E2CE2758A08E53685F155EFA9B8EF3D3CB6A6A312C234886703FA2A993C8364F1735331CCBA718AB7FA157A88EA56F717129667AB65AC0B3241184FB52CE3CE06119A9870E0088331B2D49516087842FBB9355C388349DC18793BC367B736916B72A2E89B3CA0CC66C36921648740C2012CD381C6BA8A75D53749DF56B5F51A21E13806BCC8AE90B987692990625998B2589AE3C8FD1E90D24C09FECB9786E642172535C8CD45FDB2B1224CC6D9A7CB191257C3DA18511B04018F32C8893127FC3AF6B9929744445A96120D6477975B5BC26E95603B97609B6C57B042BC6C366BAD72A4D5B686DFA6EC6FC8A69AC0C4D377EDCBA6D69B0AA27913049352AE465CFD6206EBCD0A74545624A3A7BB30600962233971254EF1618AC82484BACB1D2E49D94B7B14138BB44ACB3EE957CED9C178743928505144F142A9D222BDEF61377F734D7743A7F47794F82B1636A8C459927600CBC9D7AB4B86C793A99753C9B0E8ADBBE904A651782CCBF58006426CCE2F7A475FC5D4A369B7DF80B8CBA8F91158ECA231EA23952C07722B9F07334174E8B902BF97116D9D132D78ABB0F929E4CB6710574BC1598987BE17D13E3B36F9A4228DA65F4BB84C2656ACF413E906557DBD47C3AB7ADFCC08E85900B6CACA8E82761D277733B00133031182A209449CCBCCA6BC638546F91D33C6C1CC29E063975B444AF05177DAC1D78348722430DD4B9718E2CA1E4EA73914197C63A66A01B9AC6C1966145030978C539E8CE8CEA153609417CE795B351847C489D43E9C34D06940666BA0DB50B0A40438A912186B0BBD365BA19353FC7D62ECBA2C833799E48C53909290AD2486BAC573D299473DAF82194DBC802D8680E6B5B19B07154FB6A127003D80B2C5B5048DEB3B04AE0C8CA2AC9AFC658363493E60305521029F1C7826E4C9216660F7D04971E02398BE8084329868600B80900C7F1A292759A437D655CED79C56339203046C39686630B511AC39C94484511A8B6BEBFF52DDA86BF138C8132AB4267819C31A099AEC0ADB7B421715767716180CDF23E80A08ABFC66EBB69172BD5BBD6E257FD60979175C15B87C5B8B3445F178136238147498E92E11FECA36C14408841C505CC7C7AE24306A572703CEBCFBA7465ED2564143C4CAEC67EF42674447C2DEDB30C32318E21314BA63A1B3B8C713AC413B8E48A3F83B5E5BC6CB2A5CD3AF9A3CEB32D5D6CAE4341B864B7AF8A0935B3154F6EEA21A2C99AFF307116663715B8C5E3CAA5B9418F334B64AD43A76165C93715345840813F56A5F685B9AFE9CEA22A44DFD97BF2C88120B279A75276FB934031B5A502431C20C755D3C20982B163F8BC4440B12BC209C8435020273706C245499924A532140A6DF0109DC06DE59C25A970556D08830775BD588C9FCA22212E5A213E3A4F3B63A45F21AAEAB531B521986163698A868ADA6070DC8802742733CA48BE9B6CBE67340F406A02FD3B3C698CB4B526B4E6B9BACDEC1B35B124D1953B55513DEFF777A964496F67422B5C78E8C52B69571C0088CE226A5B8ADC615D3314A366A57655A07088716F2ACCDF281FFCB04699738D0563A6D3F44B1AC2A288761C43A17E566CB35E38CA97D51FDAFA54206B232D6302E35925337414E5CC024BF06EFC36128DC438AF179138234BD9F9ACB0CC2AE0A58255B73E8A3C77890292FE5A41EA84A5221B7172E539083B73FEF82CF24C6CE2E68C7C281D737E2A59C904A49062DD24E2E2071266E36F006398FF85CAE688F0634155B2BE50BECAE79AED812E6A12C7646A3235BD641B9A741B3C7F065E6E16E9B8B2A75235CF8578B8DB9203E9B6F2F18D7093A81D1FAFA7178CCF PublicRaw = 19A9870E0088331B2D49516087842FBB9355C388349DC18793BC367B736916B72A2E89B3CA0CC66C36921648740C2012CD381C6BA8A75D53749DF56B5F51A21E13806BCC8AE90B987692990625998B2589AE3C8FD1E90D24C09FECB9786E642172535C8CD45FDB2B1224CC6D9A7CB191257C3DA18511B04018F32C8893127FC3AF6B9929744445A96120D6477975B5BC26E95603B97609B6C57B042BC6C366BAD72A4D5B686DFA6EC6FC8A69AC0C4D377EDCBA6D69B0AA27913049352AE465CFD6206EBCD0A74545624A3A7BB30600962233971254EF1618AC82484BACB1D2E49D94B7B14138BB44ACB3EE957CED9C178743928505144F142A9D222BDEF61377F734D7743A7F47794F82B1636A8C459927600CBC9D7AB4B86C793A99753C9B0E8ADBBE904A651782CCBF58006426CCE2F7A475FC5D4A369B7DF80B8CBA8F91158ECA231EA23952C07722B9F07334174E8B902BF97116D9D132D78ABB0F929E4CB6710574BC1598987BE17D13E3B36F9A4228DA65F4BB84C2656ACF413E906557DBD47C3AB7ADFCC08E85900B6CACA8E82761D277733B00133031182A209449CCBCCA6BC638546F91D33C6C1CC29E063975B444AF05177DAC1D78348722430DD4B9718E2CA1E4EA73914197C63A66A01B9AC6C1966145030978C539E8CE8CEA153609417CE795B351847C489D43E9C34D06940666BA0DB50B0A40438A912186B0BBD365BA19353FC7D62ECBA2C833799E48C53909290AD2486BAC573D299473DAF82194DBC802D8680E6B5B19B07154FB6A127003D80B2C5B5048DEB3B04AE0C8CA2AC9AFC658363493E60305521029F1C7826E4C9216660F7D04971E02398BE8084329868600B80900C7F1A292759A437D655CED79C56339203046C39686630B511AC39C94484511A8B6BEBFF52DDA86BF138C8132AB4267819C31A099AEC0ADB7B421715767716180CDF23E80A08ABFC66EBB69172BD5BBD6E257FD60979175C15B87C5B8B3445F178136238147498E92E11FECA36C14408841C505CC7C7AE24306A572703CEBCFBA7465ED2564143C4CAEC67EF42674447C2DEDB30C32318E21314BA63A1B3B8C713AC413B8E48A3F83B5E5BC6CB2A5CD3AF9A3CEB32D5D6CAE4341B864B7AF8A0935B3154F6EEA21A2C99AFF307116663715B8C5E3CAA5B9418F334B64AD43A76165C93715345840813F56A5F685B9AFE9CEA22A44DFD97BF2C88120B279A75276FB934031B5A502431C20C755D3C20982B163F8BC4440B12BC209C8435020273706C245499924A532140A6DF0109DC06DE59C25A970556D08830775BD588C9FCA22212E5A213E3A4F3B63A45F21AAEAB531B521986163698A868ADA6070DC8802742733CA48BE9B6CBE67340F406A02FD3B3C698CB4B526B4E6B9BACDEC1B35B124D1953B55513DEFF777A964496F67422B5C78E8C52B69571C0088CE226A5B8ADC615D3314A366A57655A07088716F2ACCDF281FFCB04699738D0563A6D3F44B1AC2A288761C43A17E566CB35E38CA97D51FDAFA54206B232D6302E35925337414E5CC024BF06EFC36128DC438AF179138234BD9F9ACB0CC2AE0A58255B73E8A3C77890292FE5A41EA84A5221B7172E539083B73FEF82CF24C6CE2E68C7C281D737E2A59C904A49062DD24E2E2071266E36F006398FF85 -PrivateFull = 308209750201000420065E6E16E9B8B2A75235CF8578B8DB9203E9B6F2F18D7093A81D1FAFA7178CCF04820480D71C2F94B4246BD8BA508012629918BCF4CE75DBB5237B285014477272AB1999144DA384326717E8F5683C4CBE90D88D9907C5C3DC8E951531B466B7B8D73D0DEBB0E36479F6A5479C1082A9C9089BA69CAE56ABFDD8BEF4CC756CDC0FFD8264D58B4955CB92DD9C30162779513A6273B7311E0888A263B7C1BC1CB25A4BD1C28E2BB51CAB46705BEAAB5CA5CCDFE34B4E8370E8E040A780C7DA71C06CA3840CB7449E17A684297301991C57EC3F9C57103EFA88FD27079A167504E59641C293F06A1E63DB74E0496893E20E61665EB5FAA0E9B82053C35D022C3F6F94760AB137EE7402A684CB02D6C4AFB337A9F719D639C097DBB9E3047B8AF0C2E87A605D48B0539571060B246D9685D1D41E5A18C3212A54361BA86206B7F7DC6E2745B632B799FE39511DD0CFB0ECA3069A39FB9CBBEA5801CCB40489005820A175BB062FF217C99571AE1F3A4A6843669EAA14E7E0873401A200EB3EE317547436CC8ACB0FD1AC636FC57AA1D7BD92F700E27B06FD6389EA8BA93F3C0C568A9A0AC3CB0AC0942EA395C63A85F6161F8F028E68B7823D322D5D727C1944B6706AA5CBF297E5984E90B991EE99C44FE836C01582892A9D8B219418F19619E022DD559FB91808DCBC697CD764C2681625EA3D3EDAADE1C4ADE101144B3C43ABD18FA3B9A814F71A22528BBEB0B5F2F3BFC13181604932C8551BD3998366F9552BA5A0F665021073BBFE522C0242612249B56FF6B60A3718EA481982395FF67A876C028D27004F3BDA3DB1F65427A78E88587B07A49BFD847B1AA64323B79E8138233AC05D5FDA78D8FBC08320A1937924EB5AB7B7B440F508241B9A66CF89A156282E51773BCB202A253C6803091EAEA189CBDA36D0A9113A2C928E2366EFE84F8A6B1689E24C6FC33093E84E8C5C598BD3A184B62DD2D196332928F182CA67E1BCBEFBADC547B9AFEB947E524ADCEB2C16CA03D096A970E0A47363449888795EA6A91A29242D76A21A850B3227145CB92298ECC48E144E48E66A5DC25CA4ABAFDFF57B9539B8D0F20D845254CE86613E10B0EF05C1CA5A3DD0C83D9B71789E2C84AF06B83F776A10B565C781B9338350EAA92793EA75BC4B0690C81B769A34123386A9044012258F734ABF4F265DF8809EBF1410EE07A4169733C4906CFD822D7FB82E2BB46402EB403655950C832072D055261C111F703FC57BCAEEF95EB741519E644C99065AE24C7739E2066B29074A79894C5C91DBE54BB0E09EEC2665CBC5C61BD63E764154CEFB66518B92905314EA2249BFE1869AA5285EF004A10B90BE88002A96AD1CD8B05F875BFC22AF91CA94C8DB0ED0619E32326A96E4A12AD43D4D38A0DB09689BC2C4A8689A7BDA6A5112751D14382C0A3DDFC68CB0256F30E216EC018FC387C66C655D84E59F8EE237B181AF7753BFD4A0908E978901B5419C46A7C07BB70A557F01C082634247D0770FD1EB63ACC05286A483C0F183131613AADBBCBE87923CD832D6053456520566A93640644B7EF50428C4041255929DC40348E2CE2758A08E53685F155EFA9B8EF3D3CB6A6A312C234886703FA2A993C8364F1735331CCBA718AB7FA157A88EA56F717129667AB65AC0B3241184FB52CE3CE061308204A60482048019A9870E0088331B2D49516087842FBB9355C388349DC18793BC367B736916B72A2E89B3CA0CC66C36921648740C2012CD381C6BA8A75D53749DF56B5F51A21E13806BCC8AE90B987692990625998B2589AE3C8FD1E90D24C09FECB9786E642172535C8CD45FDB2B1224CC6D9A7CB191257C3DA18511B04018F32C8893127FC3AF6B9929744445A96120D6477975B5BC26E95603B97609B6C57B042BC6C366BAD72A4D5B686DFA6EC6FC8A69AC0C4D377EDCBA6D69B0AA27913049352AE465CFD6206EBCD0A74545624A3A7BB30600962233971254EF1618AC82484BACB1D2E49D94B7B14138BB44ACB3EE957CED9C178743928505144F142A9D222BDEF61377F734D7743A7F47794F82B1636A8C459927600CBC9D7AB4B86C793A99753C9B0E8ADBBE904A651782CCBF58006426CCE2F7A475FC5D4A369B7DF80B8CBA8F91158ECA231EA23952C07722B9F07334174E8B902BF97116D9D132D78ABB0F929E4CB6710574BC1598987BE17D13E3B36F9A4228DA65F4BB84C2656ACF413E906557DBD47C3AB7ADFCC08E85900B6CACA8E82761D277733B00133031182A209449CCBCCA6BC638546F91D33C6C1CC29E063975B444AF05177DAC1D78348722430DD4B9718E2CA1E4EA73914197C63A66A01B9AC6C1966145030978C539E8CE8CEA153609417CE795B351847C489D43E9C34D06940666BA0DB50B0A40438A912186B0BBD365BA19353FC7D62ECBA2C833799E48C53909290AD2486BAC573D299473DAF82194DBC802D8680E6B5B19B07154FB6A127003D80B2C5B5048DEB3B04AE0C8CA2AC9AFC658363493E60305521029F1C7826E4C9216660F7D04971E02398BE8084329868600B80900C7F1A292759A437D655CED79C56339203046C39686630B511AC39C94484511A8B6BEBFF52DDA86BF138C8132AB4267819C31A099AEC0ADB7B421715767716180CDF23E80A08ABFC66EBB69172BD5BBD6E257FD60979175C15B87C5B8B3445F178136238147498E92E11FECA36C14408841C505CC7C7AE24306A572703CEBCFBA7465ED2564143C4CAEC67EF42674447C2DEDB30C32318E21314BA63A1B3B8C713AC413B8E48A3F83B5E5BC6CB2A5CD3AF9A3CEB32D5D6CAE4341B864B7AF8A0935B3154F6EEA21A2C99AFF307116663715B8C5E3CAA5B9418F334B64AD43A76165C93715345840813F56A5F685B9AFE9CEA22A44DFD97BF2C88120B279A75276FB934031B5A502431C20C755D3C20982B163F8BC4440B12BC209C8435020273706C245499924A532140A6DF0109DC06DE59C25A970556D08830775BD588C9FCA22212E5A213E3A4F3B63A45F21AAEAB531B521986163698A868ADA6070DC8802742733CA48BE9B6CBE67340F406A02FD3B3C698CB4B526B4E6B9BACDEC1B35B124D1953B55513DEFF777A964496F67422B5C78E8C52B69571C0088CE226A5B8ADC615D3314A366A57655A07088716F2ACCDF281FFCB04699738D0563A6D3F44B1AC2A288761C43A17E566CB35E38CA97D51FDAFA54206B232D6302E35925337414E5CC024BF06EFC36128DC438AF179138234BD9F9ACB0CC2AE0A58255B73E8A3C77890292FE5A41EA84A5221B7172E539083B73FEF82C0420F24C6CE2E68C7C281D737E2A59C904A49062DD24E2E2071266E36F006398FF8504205BCF6D8DF3BBB557999402A50F4507A249BF59AE352CE695797580C2141FFDB5 -PublicFull = 308204A60482048019A9870E0088331B2D49516087842FBB9355C388349DC18793BC367B736916B72A2E89B3CA0CC66C36921648740C2012CD381C6BA8A75D53749DF56B5F51A21E13806BCC8AE90B987692990625998B2589AE3C8FD1E90D24C09FECB9786E642172535C8CD45FDB2B1224CC6D9A7CB191257C3DA18511B04018F32C8893127FC3AF6B9929744445A96120D6477975B5BC26E95603B97609B6C57B042BC6C366BAD72A4D5B686DFA6EC6FC8A69AC0C4D377EDCBA6D69B0AA27913049352AE465CFD6206EBCD0A74545624A3A7BB30600962233971254EF1618AC82484BACB1D2E49D94B7B14138BB44ACB3EE957CED9C178743928505144F142A9D222BDEF61377F734D7743A7F47794F82B1636A8C459927600CBC9D7AB4B86C793A99753C9B0E8ADBBE904A651782CCBF58006426CCE2F7A475FC5D4A369B7DF80B8CBA8F91158ECA231EA23952C07722B9F07334174E8B902BF97116D9D132D78ABB0F929E4CB6710574BC1598987BE17D13E3B36F9A4228DA65F4BB84C2656ACF413E906557DBD47C3AB7ADFCC08E85900B6CACA8E82761D277733B00133031182A209449CCBCCA6BC638546F91D33C6C1CC29E063975B444AF05177DAC1D78348722430DD4B9718E2CA1E4EA73914197C63A66A01B9AC6C1966145030978C539E8CE8CEA153609417CE795B351847C489D43E9C34D06940666BA0DB50B0A40438A912186B0BBD365BA19353FC7D62ECBA2C833799E48C53909290AD2486BAC573D299473DAF82194DBC802D8680E6B5B19B07154FB6A127003D80B2C5B5048DEB3B04AE0C8CA2AC9AFC658363493E60305521029F1C7826E4C9216660F7D04971E02398BE8084329868600B80900C7F1A292759A437D655CED79C56339203046C39686630B511AC39C94484511A8B6BEBFF52DDA86BF138C8132AB4267819C31A099AEC0ADB7B421715767716180CDF23E80A08ABFC66EBB69172BD5BBD6E257FD60979175C15B87C5B8B3445F178136238147498E92E11FECA36C14408841C505CC7C7AE24306A572703CEBCFBA7465ED2564143C4CAEC67EF42674447C2DEDB30C32318E21314BA63A1B3B8C713AC413B8E48A3F83B5E5BC6CB2A5CD3AF9A3CEB32D5D6CAE4341B864B7AF8A0935B3154F6EEA21A2C99AFF307116663715B8C5E3CAA5B9418F334B64AD43A76165C93715345840813F56A5F685B9AFE9CEA22A44DFD97BF2C88120B279A75276FB934031B5A502431C20C755D3C20982B163F8BC4440B12BC209C8435020273706C245499924A532140A6DF0109DC06DE59C25A970556D08830775BD588C9FCA22212E5A213E3A4F3B63A45F21AAEAB531B521986163698A868ADA6070DC8802742733CA48BE9B6CBE67340F406A02FD3B3C698CB4B526B4E6B9BACDEC1B35B124D1953B55513DEFF777A964496F67422B5C78E8C52B69571C0088CE226A5B8ADC615D3314A366A57655A07088716F2ACCDF281FFCB04699738D0563A6D3F44B1AC2A288761C43A17E566CB35E38CA97D51FDAFA54206B232D6302E35925337414E5CC024BF06EFC36128DC438AF179138234BD9F9ACB0CC2AE0A58255B73E8A3C77890292FE5A41EA84A5221B7172E539083B73FEF82C0420F24C6CE2E68C7C281D737E2A59C904A49062DD24E2E2071266E36F006398FF85 [Kyber-1024-r3] PrivateRaw = 759543547640811281DD3B9312058786B467FD7B16F2B1B5189452E12A89BF13221D9870CC652FA60766E2B73405CC237EA53996D227D32C6E5B2C42EC207D2728CA6BA41799B408F8CBAA7326797DA126F597458E2A59F6AAAD8678C9AEC480DA1459F1932497DB1EB88A2F515012DDA7A7D6C05EBB43B6486C2DB18042F9A95E92D33E78EA28C1905BDCA988278844C98B98BDD6A029C3655C4C5B6AB3200DF249B11BA22049AC937BBA3A853F0737ADBA01CF71EAADDA46474DEC3286433B9E377F64550A46460D821C5F47EB06CED7206B8A55C9EA8DE2A4C995361BBCF1462770339A41C972B88FC833AFCF7B7C1253B67F4B0B24767230300AD894236176BA8234936FB6AB7FD157D2E99D7A706B7ABA95B9C574635609EF5C09C11B40A9295A2E891411D095F8F2B05393C6659365F206CBE25A76F097393913A1BC008CDDE4BB4D54845587236456CF43AA9319D534FFD820734ABD7F0277D325431730804D883136E0026A009E358188C9A4C941862BADD3BDC0772C26A49803132E83A23B7588868537A2B53848E1198A43E112A3243CC30512B76A92FDF3153126596F3353AD17358A419D343C6D0632AB25AB8A8DD68814A1A4CE0485A7292A4521CD88F1A4FE24C5C466BFF0B65726FC221CE307B4852AF0974BEBBB4D79A00E297BCC12B4C393EAB332AAA2B343C17FB643E2D539C7BCBCA53C74BB1B1133D604B2A9B2553661FBD2A6674C81EA6587813C621BDB5297585FF70700015B7B92107702A3BD6E8241E386360B25AA73A85CB87BA3C75B19D8077C8E8B6689DC64C2D90A5B4A1511D501DE3ACE64067E04A7CF78BBAFEF312BE91496F43CCFEFC12671B78D9BB021567486EF607F1E3B97FE799BC759A684F2531606B93D6B0B8904CE97B8B36EA0239210A148503CAF20591E0034D10B285CC6CAD3AC4CB264AAA8D7524D7B64FB33298D845C9D012056A33349A8C37F7B4B6E7A3B24B98886EB228B446417A5280657B875164596989343417D5C27C09C189AA9871D89032B60F3CF26414C793B80DD0B223AABC573024E16ABA0612300BC3B0CDAC699638A7AA9DC71AD0AA3D0A30A0070B514081083D0B3E269AE6EB46A3FD576FBE016399A3E8CC44256145A8BC635EA0709AD377429900BBF0185BBD3689D63C7542AACFD2592BF9467B374A23E89754B2A1B3869B78F1181922091F1E1BDF8C43CDB7304BDF116FA7935117155A3B18534E088A9530C4342014B4CA75CA453B6B814DA70C0B8A10C7E9C2FEDF9A7CECC0F87D434E443C8F2D82AA4387C9AAB29227A493D090B468392A435A7531989AAF71E1391AACC3458D3212E4A60078FC11D0F21B41559B615D554EB2508175B22BFE22397FB5536C99BD874B9D19BA051845312D13047FC4964997050C0780172819E69A42118047A409F1F1B20CE17BDE517715818B717308F0F44C61C59A607CC90233759E7397AD9B02FD65B2F7B56BB2A584F8BD16ABB6105252A0A86C33B80702E5DC5B94E69A45F76ADA2AB3C794598B7190EB945BA2631AAC9F1655866760182C06AE4787D86300AF29015663D568C141B195F4BB89DE5B056C3EA32A52CBDA201B6BBDCB345A425372578F4A7726C9559D37A4F0611B5198CBC3185292408140DD69B1707C60C091285CA0C20D4A1DFF2291ACA58EDE122E3FC94F095CD9A4BAF0797991273B4EB7102A7D22EF3CC2693A8911355A6F14885FFB94CF2B432D9542BD0502D59D6C40AD454E785108881A666EC4E1F813DB6710CF7D0445623758DC8A9F71322AE31CE37D448CB9563B71ACACD72CF6F62581F5173A0FB8337D62383E24378F8538869B341946D5BA6275EF319638CA00F296C2A5611156C1A027814457010F887893C322EF1B2A6CFE7575D3A6976D6A6AD41805D674218B46314B93570016817A157630B9F8BA255137CA5B5A12D9BBBA935D8811FA2415F27126437B664B5A03AC41C5B319D5168B7791B9296EA3A8C61C14FFA95D896CFA965A2E5008683717FFE855BE68BA216C39AAFC2ACFD791F0E140ACDF27F53791CBE02A11055C9FC898A421C64AB6C4090E7A2D9EA380C84716510CA25411F1FB744B95069018702D2A9A646B8C8BC2B48DB112922C15E7563C0AEE7B15E7A7263077A39E5678727029A1C7E468C1753BB44EDD2A10C9CBC17244B6489890F2754398AB447B78E658CB568A46BE4B18A1272A5AAEBA9E3D766ED9C82C496AF5FB63B4CC61ECF7C767D22035EB5A47FC27C8D4B9F75C17D98C2B33ABC1E89944A008D08B7FA34FC6B918FCA24F2E14750A45FA2556C19A0A7FE96C3237101DDB192777358255A7D6956574CA94CBCE26204B1637EE89B54AAC35C404CB9809681DA5283E5A87E7345155121F097BE8274CA88972C69F6ACDF4186F44A8074263DA3E695ED788D86A6AAFBC75CF58777BB124D643748A662880E40B0FD138D11CA591336C8297610F8F2C191F15BD5AA1655CA15D561A2345591C0BA54E2627BB95557D3922BBD84A16B749AF8F8A36C4B61F5F39A6EE37AC3469F2D34194083B218478C6F9498BCBA2F51C23F0B2B9A4560AB4365B6AC07992D81CD25012909101E2781BBC194517FC3637C8B98C1D840FA57455262828C653F9F170111816276E61E34013853979631BCB3675019450624191CC997FC4081135CEE6210646BBEF43C250852869B421383E5B916038204696E86F90E9D9AB94566CD497911C8D2AD23712B251965165C1656B2BAA18C1A0AE5B513912441F804E33207DFAA3F31B4A766E579CC21B803F003FCE4280DE282490424D60A02AA0B64A0C99E2BBB4770F93F68D46B40D7A0BC1B833D2212F727CD618B0E488966B2FC4C115A4D2955301ACC2A2F996C8D01C0C35A7A4008BF605618A41B8C8AD51327D0AA6B1AAB261B0610AB859DC020A5B9CE4A111E6099AF2BE4643DFABD4BA4B393327914784B3CD0600BBBBF90C004936289CE693DB66B874F8157BC5569AFD992009B922F53ACE41C7B9A3C982F1CB5DB3677F230B934213273F92D17E51AA6485377360686C10EB2B2311B8A2B9803903461287E10276BF0131975513DEB7BE5677746DA990315060E45087663914C0961DC2A5F27DB03F8514BBA4BB1295C7BFC4C9D70960DCF838361484C6BC272E63C3C53A1A21FB87204487432258616B61372111ECA454A1E6C7421330F3941C5DD5801B9F8BA10EAC77D07A0B4C0C2EAA1CA3FD11F55F6A12C10AD65DB83AF75CC0A62609400444E8CA0CEA19561397E35F47044D34E30EB7649A63D36FB0EB330C450B0CF2CBA31D0D130E3812C50A94846189922E7516D830C8466A5018C4C338A42FC95449E9BBCF7DB81BA055C7D7696CAA728B23A782D690DEAD836A4A98BA41B63EF2550EEE92FEF6CC905E317E87A3F8E3CBA5D992C11F6067985187CA4127703311587B2FE973E873CAB5B958100C746E1C63D0CF48A65256749877B32C3A065D872DFC04569558575441A594A11C30951257A4FE35662D995BF58C194272550AEC4B6EE3924D52617000287CAF01C61DA85DF437D7C668F6E686717DA9AB765BCFD50B89C21579D9895CF5A8A7BD61AE64C6A5B051DB937534C3B9E9179992A0262204B15DA233E16574C26C25D9E943B389563C9F5CD310B7A621833037690BA474F978451262C678A602ED4192ED09C9BAA3A547377B6B2CC5115322796340B254CBBDB5B9A70E3C695071A0614357CE593DC0542FC52669E4B5FFB7C48116164DCE144A4C59090E3C52249B99419A2F43517D499C790D1957E299035D62022C7929E9960BC50B205E491D3E237CB700DB81795316035F7BC7BC2D578922CBEC1C26D82A5CFA2F732D229746A61698FD45CEC849BB5DB2EB7F8CE292647871B930CA93F5FD74EA1FB7A9C81319A275DCBF1C15012785DF0ACAAF918B6A9193FC9A156D24AABA46855038549772CF8BB70BA860645A51429461D65065D99893408FBCBF436068A8C25FBB222A9B26C8328424E0B31753A4045E61F4E4198C63A74FAD3B25A924E89D493CFD388B2A187DFE18B44A09068B32A4AE027E54C7FDBBA4865B457F6C9646BBBB0C1C8616A559ADB699D1C689333603627E2CDDB916F237987FDD18338D9BB869869BA59B93875785676A6DA7ACFB6717B1640A2CF596F79C2A00FAAAECC431BFD8BB0CE0330C3B74557C6BAA4A92FF9C39B6067A7594297A295BBE034720812ABE193BBEA86B93DF45E8A277C06202789B5B6830329BFB93FB2C2C59649400A5877866B91F10394FC250CD4986831963D234712D2EC10AF65711EB48B893A4DE9DB0A6AF25A1571372E46248B39CFE08A21ABF6542EE5C127CD6E0D011A79B2164E72211BDEBD1A4751BA9512DE96C80851F1FF0C24D950EBB1EDEB86650816CA2F72F65D9E69127E190C5E5DEEB7F562502B14E669BDC6F5AF5ABA874F56577257A7E9F44BDD5B2E32DF7A4BAF9E37CF581BF086C5622E PublicRaw = EDD2A10C9CBC17244B6489890F2754398AB447B78E658CB568A46BE4B18A1272A5AAEBA9E3D766ED9C82C496AF5FB63B4CC61ECF7C767D22035EB5A47FC27C8D4B9F75C17D98C2B33ABC1E89944A008D08B7FA34FC6B918FCA24F2E14750A45FA2556C19A0A7FE96C3237101DDB192777358255A7D6956574CA94CBCE26204B1637EE89B54AAC35C404CB9809681DA5283E5A87E7345155121F097BE8274CA88972C69F6ACDF4186F44A8074263DA3E695ED788D86A6AAFBC75CF58777BB124D643748A662880E40B0FD138D11CA591336C8297610F8F2C191F15BD5AA1655CA15D561A2345591C0BA54E2627BB95557D3922BBD84A16B749AF8F8A36C4B61F5F39A6EE37AC3469F2D34194083B218478C6F9498BCBA2F51C23F0B2B9A4560AB4365B6AC07992D81CD25012909101E2781BBC194517FC3637C8B98C1D840FA57455262828C653F9F170111816276E61E34013853979631BCB3675019450624191CC997FC4081135CEE6210646BBEF43C250852869B421383E5B916038204696E86F90E9D9AB94566CD497911C8D2AD23712B251965165C1656B2BAA18C1A0AE5B513912441F804E33207DFAA3F31B4A766E579CC21B803F003FCE4280DE282490424D60A02AA0B64A0C99E2BBB4770F93F68D46B40D7A0BC1B833D2212F727CD618B0E488966B2FC4C115A4D2955301ACC2A2F996C8D01C0C35A7A4008BF605618A41B8C8AD51327D0AA6B1AAB261B0610AB859DC020A5B9CE4A111E6099AF2BE4643DFABD4BA4B393327914784B3CD0600BBBBF90C004936289CE693DB66B874F8157BC5569AFD992009B922F53ACE41C7B9A3C982F1CB5DB3677F230B934213273F92D17E51AA6485377360686C10EB2B2311B8A2B9803903461287E10276BF0131975513DEB7BE5677746DA990315060E45087663914C0961DC2A5F27DB03F8514BBA4BB1295C7BFC4C9D70960DCF838361484C6BC272E63C3C53A1A21FB87204487432258616B61372111ECA454A1E6C7421330F3941C5DD5801B9F8BA10EAC77D07A0B4C0C2EAA1CA3FD11F55F6A12C10AD65DB83AF75CC0A62609400444E8CA0CEA19561397E35F47044D34E30EB7649A63D36FB0EB330C450B0CF2CBA31D0D130E3812C50A94846189922E7516D830C8466A5018C4C338A42FC95449E9BBCF7DB81BA055C7D7696CAA728B23A782D690DEAD836A4A98BA41B63EF2550EEE92FEF6CC905E317E87A3F8E3CBA5D992C11F6067985187CA4127703311587B2FE973E873CAB5B958100C746E1C63D0CF48A65256749877B32C3A065D872DFC04569558575441A594A11C30951257A4FE35662D995BF58C194272550AEC4B6EE3924D52617000287CAF01C61DA85DF437D7C668F6E686717DA9AB765BCFD50B89C21579D9895CF5A8A7BD61AE64C6A5B051DB937534C3B9E9179992A0262204B15DA233E16574C26C25D9E943B389563C9F5CD310B7A621833037690BA474F978451262C678A602ED4192ED09C9BAA3A547377B6B2CC5115322796340B254CBBDB5B9A70E3C695071A0614357CE593DC0542FC52669E4B5FFB7C48116164DCE144A4C59090E3C52249B99419A2F43517D499C790D1957E299035D62022C7929E9960BC50B205E491D3E237CB700DB81795316035F7BC7BC2D578922CBEC1C26D82A5CFA2F732D229746A61698FD45CEC849BB5DB2EB7F8CE292647871B930CA93F5FD74EA1FB7A9C81319A275DCBF1C15012785DF0ACAAF918B6A9193FC9A156D24AABA46855038549772CF8BB70BA860645A51429461D65065D99893408FBCBF436068A8C25FBB222A9B26C8328424E0B31753A4045E61F4E4198C63A74FAD3B25A924E89D493CFD388B2A187DFE18B44A09068B32A4AE027E54C7FDBBA4865B457F6C9646BBBB0C1C8616A559ADB699D1C689333603627E2CDDB916F237987FDD18338D9BB869869BA59B93875785676A6DA7ACFB6717B1640A2CF596F79C2A00FAAAECC431BFD8BB0CE0330C3B74557C6BAA4A92FF9C39B6067A7594297A295BBE034720812ABE193BBEA86B93DF45E8A277C06202789B5B6830329BFB93FB2C2C59649400A5877866B91F10394FC250CD4986831963D234712D2EC10AF65711EB48B893A4DE9DB0A6AF25A1571372E46248B39CFE08A21ABF6542EE5C127CD6E0D011A79B2164E72211BDEBD1A4751BA9512DE96C80851F1FF0C24D950 -PrivateFull = 30820C750201000420F5AF5ABA874F56577257A7E9F44BDD5B2E32DF7A4BAF9E37CF581BF086C5622E04820600759543547640811281DD3B9312058786B467FD7B16F2B1B5189452E12A89BF13221D9870CC652FA60766E2B73405CC237EA53996D227D32C6E5B2C42EC207D2728CA6BA41799B408F8CBAA7326797DA126F597458E2A59F6AAAD8678C9AEC480DA1459F1932497DB1EB88A2F515012DDA7A7D6C05EBB43B6486C2DB18042F9A95E92D33E78EA28C1905BDCA988278844C98B98BDD6A029C3655C4C5B6AB3200DF249B11BA22049AC937BBA3A853F0737ADBA01CF71EAADDA46474DEC3286433B9E377F64550A46460D821C5F47EB06CED7206B8A55C9EA8DE2A4C995361BBCF1462770339A41C972B88FC833AFCF7B7C1253B67F4B0B24767230300AD894236176BA8234936FB6AB7FD157D2E99D7A706B7ABA95B9C574635609EF5C09C11B40A9295A2E891411D095F8F2B05393C6659365F206CBE25A76F097393913A1BC008CDDE4BB4D54845587236456CF43AA9319D534FFD820734ABD7F0277D325431730804D883136E0026A009E358188C9A4C941862BADD3BDC0772C26A49803132E83A23B7588868537A2B53848E1198A43E112A3243CC30512B76A92FDF3153126596F3353AD17358A419D343C6D0632AB25AB8A8DD68814A1A4CE0485A7292A4521CD88F1A4FE24C5C466BFF0B65726FC221CE307B4852AF0974BEBBB4D79A00E297BCC12B4C393EAB332AAA2B343C17FB643E2D539C7BCBCA53C74BB1B1133D604B2A9B2553661FBD2A6674C81EA6587813C621BDB5297585FF70700015B7B92107702A3BD6E8241E386360B25AA73A85CB87BA3C75B19D8077C8E8B6689DC64C2D90A5B4A1511D501DE3ACE64067E04A7CF78BBAFEF312BE91496F43CCFEFC12671B78D9BB021567486EF607F1E3B97FE799BC759A684F2531606B93D6B0B8904CE97B8B36EA0239210A148503CAF20591E0034D10B285CC6CAD3AC4CB264AAA8D7524D7B64FB33298D845C9D012056A33349A8C37F7B4B6E7A3B24B98886EB228B446417A5280657B875164596989343417D5C27C09C189AA9871D89032B60F3CF26414C793B80DD0B223AABC573024E16ABA0612300BC3B0CDAC699638A7AA9DC71AD0AA3D0A30A0070B514081083D0B3E269AE6EB46A3FD576FBE016399A3E8CC44256145A8BC635EA0709AD377429900BBF0185BBD3689D63C7542AACFD2592BF9467B374A23E89754B2A1B3869B78F1181922091F1E1BDF8C43CDB7304BDF116FA7935117155A3B18534E088A9530C4342014B4CA75CA453B6B814DA70C0B8A10C7E9C2FEDF9A7CECC0F87D434E443C8F2D82AA4387C9AAB29227A493D090B468392A435A7531989AAF71E1391AACC3458D3212E4A60078FC11D0F21B41559B615D554EB2508175B22BFE22397FB5536C99BD874B9D19BA051845312D13047FC4964997050C0780172819E69A42118047A409F1F1B20CE17BDE517715818B717308F0F44C61C59A607CC90233759E7397AD9B02FD65B2F7B56BB2A584F8BD16ABB6105252A0A86C33B80702E5DC5B94E69A45F76ADA2AB3C794598B7190EB945BA2631AAC9F1655866760182C06AE4787D86300AF29015663D568C141B195F4BB89DE5B056C3EA32A52CBDA201B6BBDCB345A425372578F4A7726C9559D37A4F0611B5198CBC3185292408140DD69B1707C60C091285CA0C20D4A1DFF2291ACA58EDE122E3FC94F095CD9A4BAF0797991273B4EB7102A7D22EF3CC2693A8911355A6F14885FFB94CF2B432D9542BD0502D59D6C40AD454E785108881A666EC4E1F813DB6710CF7D0445623758DC8A9F71322AE31CE37D448CB9563B71ACACD72CF6F62581F5173A0FB8337D62383E24378F8538869B341946D5BA6275EF319638CA00F296C2A5611156C1A027814457010F887893C322EF1B2A6CFE7575D3A6976D6A6AD41805D674218B46314B93570016817A157630B9F8BA255137CA5B5A12D9BBBA935D8811FA2415F27126437B664B5A03AC41C5B319D5168B7791B9296EA3A8C61C14FFA95D896CFA965A2E5008683717FFE855BE68BA216C39AAFC2ACFD791F0E140ACDF27F53791CBE02A11055C9FC898A421C64AB6C4090E7A2D9EA380C84716510CA25411F1FB744B95069018702D2A9A646B8C8BC2B48DB112922C15E7563C0AEE7B15E7A7263077A39E5678727029A1C7E468C1753BB443082062604820600EDD2A10C9CBC17244B6489890F2754398AB447B78E658CB568A46BE4B18A1272A5AAEBA9E3D766ED9C82C496AF5FB63B4CC61ECF7C767D22035EB5A47FC27C8D4B9F75C17D98C2B33ABC1E89944A008D08B7FA34FC6B918FCA24F2E14750A45FA2556C19A0A7FE96C3237101DDB192777358255A7D6956574CA94CBCE26204B1637EE89B54AAC35C404CB9809681DA5283E5A87E7345155121F097BE8274CA88972C69F6ACDF4186F44A8074263DA3E695ED788D86A6AAFBC75CF58777BB124D643748A662880E40B0FD138D11CA591336C8297610F8F2C191F15BD5AA1655CA15D561A2345591C0BA54E2627BB95557D3922BBD84A16B749AF8F8A36C4B61F5F39A6EE37AC3469F2D34194083B218478C6F9498BCBA2F51C23F0B2B9A4560AB4365B6AC07992D81CD25012909101E2781BBC194517FC3637C8B98C1D840FA57455262828C653F9F170111816276E61E34013853979631BCB3675019450624191CC997FC4081135CEE6210646BBEF43C250852869B421383E5B916038204696E86F90E9D9AB94566CD497911C8D2AD23712B251965165C1656B2BAA18C1A0AE5B513912441F804E33207DFAA3F31B4A766E579CC21B803F003FCE4280DE282490424D60A02AA0B64A0C99E2BBB4770F93F68D46B40D7A0BC1B833D2212F727CD618B0E488966B2FC4C115A4D2955301ACC2A2F996C8D01C0C35A7A4008BF605618A41B8C8AD51327D0AA6B1AAB261B0610AB859DC020A5B9CE4A111E6099AF2BE4643DFABD4BA4B393327914784B3CD0600BBBBF90C004936289CE693DB66B874F8157BC5569AFD992009B922F53ACE41C7B9A3C982F1CB5DB3677F230B934213273F92D17E51AA6485377360686C10EB2B2311B8A2B9803903461287E10276BF0131975513DEB7BE5677746DA990315060E45087663914C0961DC2A5F27DB03F8514BBA4BB1295C7BFC4C9D70960DCF838361484C6BC272E63C3C53A1A21FB87204487432258616B61372111ECA454A1E6C7421330F3941C5DD5801B9F8BA10EAC77D07A0B4C0C2EAA1CA3FD11F55F6A12C10AD65DB83AF75CC0A62609400444E8CA0CEA19561397E35F47044D34E30EB7649A63D36FB0EB330C450B0CF2CBA31D0D130E3812C50A94846189922E7516D830C8466A5018C4C338A42FC95449E9BBCF7DB81BA055C7D7696CAA728B23A782D690DEAD836A4A98BA41B63EF2550EEE92FEF6CC905E317E87A3F8E3CBA5D992C11F6067985187CA4127703311587B2FE973E873CAB5B958100C746E1C63D0CF48A65256749877B32C3A065D872DFC04569558575441A594A11C30951257A4FE35662D995BF58C194272550AEC4B6EE3924D52617000287CAF01C61DA85DF437D7C668F6E686717DA9AB765BCFD50B89C21579D9895CF5A8A7BD61AE64C6A5B051DB937534C3B9E9179992A0262204B15DA233E16574C26C25D9E943B389563C9F5CD310B7A621833037690BA474F978451262C678A602ED4192ED09C9BAA3A547377B6B2CC5115322796340B254CBBDB5B9A70E3C695071A0614357CE593DC0542FC52669E4B5FFB7C48116164DCE144A4C59090E3C52249B99419A2F43517D499C790D1957E299035D62022C7929E9960BC50B205E491D3E237CB700DB81795316035F7BC7BC2D578922CBEC1C26D82A5CFA2F732D229746A61698FD45CEC849BB5DB2EB7F8CE292647871B930CA93F5FD74EA1FB7A9C81319A275DCBF1C15012785DF0ACAAF918B6A9193FC9A156D24AABA46855038549772CF8BB70BA860645A51429461D65065D99893408FBCBF436068A8C25FBB222A9B26C8328424E0B31753A4045E61F4E4198C63A74FAD3B25A924E89D493CFD388B2A187DFE18B44A09068B32A4AE027E54C7FDBBA4865B457F6C9646BBBB0C1C8616A559ADB699D1C689333603627E2CDDB916F237987FDD18338D9BB869869BA59B93875785676A6DA7ACFB6717B1640A2CF596F79C2A00FAAAECC431BFD8BB0CE0330C3B74557C6BAA4A92FF9C39B6067A7594297A295BBE034720812ABE193BBEA86B93DF45E8A277C06202789B5B6830329BFB93FB2C2C59649400A5877866B91F10394FC250CD4986831963D234712D2EC10AF65711EB48B893A4DE9DB0A6AF25A1571372E46248B39CFE08A21ABF6542EE5C1042027CD6E0D011A79B2164E72211BDEBD1A4751BA9512DE96C80851F1FF0C24D9500420A17E19E70C20FC5C6AC20EF4C81AEA2F0066C4E69C1B7F05B0E7A24F775786D4 -PublicFull = 3082062604820600EDD2A10C9CBC17244B6489890F2754398AB447B78E658CB568A46BE4B18A1272A5AAEBA9E3D766ED9C82C496AF5FB63B4CC61ECF7C767D22035EB5A47FC27C8D4B9F75C17D98C2B33ABC1E89944A008D08B7FA34FC6B918FCA24F2E14750A45FA2556C19A0A7FE96C3237101DDB192777358255A7D6956574CA94CBCE26204B1637EE89B54AAC35C404CB9809681DA5283E5A87E7345155121F097BE8274CA88972C69F6ACDF4186F44A8074263DA3E695ED788D86A6AAFBC75CF58777BB124D643748A662880E40B0FD138D11CA591336C8297610F8F2C191F15BD5AA1655CA15D561A2345591C0BA54E2627BB95557D3922BBD84A16B749AF8F8A36C4B61F5F39A6EE37AC3469F2D34194083B218478C6F9498BCBA2F51C23F0B2B9A4560AB4365B6AC07992D81CD25012909101E2781BBC194517FC3637C8B98C1D840FA57455262828C653F9F170111816276E61E34013853979631BCB3675019450624191CC997FC4081135CEE6210646BBEF43C250852869B421383E5B916038204696E86F90E9D9AB94566CD497911C8D2AD23712B251965165C1656B2BAA18C1A0AE5B513912441F804E33207DFAA3F31B4A766E579CC21B803F003FCE4280DE282490424D60A02AA0B64A0C99E2BBB4770F93F68D46B40D7A0BC1B833D2212F727CD618B0E488966B2FC4C115A4D2955301ACC2A2F996C8D01C0C35A7A4008BF605618A41B8C8AD51327D0AA6B1AAB261B0610AB859DC020A5B9CE4A111E6099AF2BE4643DFABD4BA4B393327914784B3CD0600BBBBF90C004936289CE693DB66B874F8157BC5569AFD992009B922F53ACE41C7B9A3C982F1CB5DB3677F230B934213273F92D17E51AA6485377360686C10EB2B2311B8A2B9803903461287E10276BF0131975513DEB7BE5677746DA990315060E45087663914C0961DC2A5F27DB03F8514BBA4BB1295C7BFC4C9D70960DCF838361484C6BC272E63C3C53A1A21FB87204487432258616B61372111ECA454A1E6C7421330F3941C5DD5801B9F8BA10EAC77D07A0B4C0C2EAA1CA3FD11F55F6A12C10AD65DB83AF75CC0A62609400444E8CA0CEA19561397E35F47044D34E30EB7649A63D36FB0EB330C450B0CF2CBA31D0D130E3812C50A94846189922E7516D830C8466A5018C4C338A42FC95449E9BBCF7DB81BA055C7D7696CAA728B23A782D690DEAD836A4A98BA41B63EF2550EEE92FEF6CC905E317E87A3F8E3CBA5D992C11F6067985187CA4127703311587B2FE973E873CAB5B958100C746E1C63D0CF48A65256749877B32C3A065D872DFC04569558575441A594A11C30951257A4FE35662D995BF58C194272550AEC4B6EE3924D52617000287CAF01C61DA85DF437D7C668F6E686717DA9AB765BCFD50B89C21579D9895CF5A8A7BD61AE64C6A5B051DB937534C3B9E9179992A0262204B15DA233E16574C26C25D9E943B389563C9F5CD310B7A621833037690BA474F978451262C678A602ED4192ED09C9BAA3A547377B6B2CC5115322796340B254CBBDB5B9A70E3C695071A0614357CE593DC0542FC52669E4B5FFB7C48116164DCE144A4C59090E3C52249B99419A2F43517D499C790D1957E299035D62022C7929E9960BC50B205E491D3E237CB700DB81795316035F7BC7BC2D578922CBEC1C26D82A5CFA2F732D229746A61698FD45CEC849BB5DB2EB7F8CE292647871B930CA93F5FD74EA1FB7A9C81319A275DCBF1C15012785DF0ACAAF918B6A9193FC9A156D24AABA46855038549772CF8BB70BA860645A51429461D65065D99893408FBCBF436068A8C25FBB222A9B26C8328424E0B31753A4045E61F4E4198C63A74FAD3B25A924E89D493CFD388B2A187DFE18B44A09068B32A4AE027E54C7FDBBA4865B457F6C9646BBBB0C1C8616A559ADB699D1C689333603627E2CDDB916F237987FDD18338D9BB869869BA59B93875785676A6DA7ACFB6717B1640A2CF596F79C2A00FAAAECC431BFD8BB0CE0330C3B74557C6BAA4A92FF9C39B6067A7594297A295BBE034720812ABE193BBEA86B93DF45E8A277C06202789B5B6830329BFB93FB2C2C59649400A5877866B91F10394FC250CD4986831963D234712D2EC10AF65711EB48B893A4DE9DB0A6AF25A1571372E46248B39CFE08A21ABF6542EE5C1042027CD6E0D011A79B2164E72211BDEBD1A4751BA9512DE96C80851F1FF0C24D950 [Kyber-1024-90s-r3] PrivateRaw = 6FE2A3D8A077B749509C39764AD1ACA6116CCE49B81B533DE0C55EA720293CA481876072180A1B88DA7CD0134C6C6C09703941F6199C1D624FC7B29491D885CC688941F88E6425C40C0C9F86054AA2700EE496861DD8B988296F05B93CFF612252307603EB676F94178D08907C3A8D9A0A7F1A17C6C50A08B9A2216168C692C70B39E35750C100987271DE78BE806ACD057278C5D96AF9437E72EA1503C94A6D623F912B1078602B53F405AE4741B2BB12F7F5BA6AC25B706496BD5053772272105636AAB1A12C796CBC22949EAAC832E6946EC7AAB85884CC75406D26330230564CC8B05E177D78AC8E3D9A8BC6F52D7719063B4B2B1613B8C45417AFD29CBD30130003C5BE5393110A5E47C1424C93C67AF6405E966B6D00138DF30F62F0C4AF7C58898B2DEBF5BC3AC452FE800141919CCAAC315ADCB083AB4FE3046344D4891A833C0A30A0F678A4E18CCE13275C409A2B951254528084C5637BA247C7D421C8E2DC93290C40420A6DFE84549C99B09266582EAB3819E3C7448833DC301D54E36F43ECA75AE4563979B4DA638E6D2402E6C1134F4C9920328299FAAA2E81C42C9515A1BC838DB5784FCB0822218F476724F9872F0CAA277992028B206EE6F799A1C7318CC780F1209B5FD442A8790011620C74E3C1E972338A804EDCB74D76A65961DC242F342BADB3A2C096005A4383FAD66472D9690730A091D614CFD72C0B442D2FD977B04041B583CF1B05C8D169523BA5C82C1CC4CEB11AD3A138F284A73B120DD8999AE3CB3980B7708011C0F6468FA4F1C36540B625BA38169154351440D4997974C3B54AE4CA023B9D96A71AD98738F6997B103BA14DEA410B7A51C815573439999187BC6E769500508ED294249BC75C3239565465CD54E563C39A8CE536991F5B875C8596DBDB28D1C8779EC98383DA662A955D3B3714C5500636E154EC42BDDA6986D8509C5BB389329017C7D16EC859B2D12242F15483F76CA36B23631F68C2BA481FD594AC1EA1C16819667280A2FCC74B9B5174FE6946B04A19B9DA6382307D9F7A1B92F42C52E341733ABBE549831F221EBA163600716E545BA74FA5B9EA4167649733C3BB33EFC2BBFB49BB47C630BFC1C7A78A394A03594A31B1F9826BCD205B0988A1CE77237D62C9079160585766AFD15FDA4B48177C3A55613E94F34B3CA4C4D12047D73543F9CA27B26C3B79F8B89BDA9ABC032F8176791B629FED254CA9644F304C0DC9619ECF6240A2EC3583867BEB3053749143DEEA00CB850E51EB314D310EFB6B625D65AE458A65AC84A622268416AC475347CD03A6CA9E7978BFCACAEC627700B7C3A01B4A8FA5B4A3D60960A521C8709F95F5B48D6C76CCC1729BA63D9346BAB120A93E617A97B21983D4B7D67C1C7FA8065C32048B2B84560684BF88109A8C511A67CE71E975DB1C6C6A24CCFA10722A330A7F6A4327E3642D5756FDC84901B184AFA9635684CAF6F30BE2D68FF6A82FE389CD718851F8554273902298540C944ACF9A505E0FE594A5312B6BD674433A1094707A2B82495209353158A58AC14EC09C879D468DA0447D085C2A69909758F966D6E139F9CC7F501B5D4FC9BB8BC51071E2215B4CBD1DA40B0BAA1F1217202AEC1C1C2997EEE2963739CEE81825B898A37D95457500471E66C7ABF60232B5BC8CDCC3FDE08CA83C2899C810FEB53242F00E9CD9C5824CBC6CEA11817B1225EC63077177298CB41A81087626BCBCB51759E9637CDB63254ACB5A5352A74B9F885056F1632C6A288E07E090F4F5088AB59D76029FC90B3F4207C26A83137D95BADE21B59E95539F9C716EF15BF58A0719783F8FD210C574B06088348C22BF5E420DA7FC58CE8C60B50BBA137ACFE5D36C613ACD78D1A035A995722720318511421C8E4FAC8E6B045F58DC25B5400C44B088DE44447332522425CB5B5AC15B7A52CC43916A7C846997A2AFE1B2CE365516852699AA9D2C30966DE1908405336FC89CB89B74A10496650322F59B1AEDB38A37DB6A1EE63759D2ADAF3613EE19CB8BE871DEC32838654B1E889EB32815597580BB1073AAD86D830C1A4C9530BBE6579DEC1F1F99AC16E131A406D051F13170CA7A115A625889937EE380FC8322CD087B1A501F22E2047A9355449C29693A13918797F61CB868310CA3D983F2C447BF7A1D2069577EE906B2E26297E51D961BA654F00849969D5AE46B132A74A62AC9B2781ED5C98CECB5C79C579E2BE30058740D00D99D676A5F0DD0959D340DB48A1AE477C154916AE6C6CDC00787D547C87E9A998F86BBCD3970379A68FE837DB0788240C5338577B5ED6BAF8F390C82362CD6EA592C23BD08A1603B2A0C7B5380DAC98DA2E4AC714B45E9E0516A953785A678D8C285985B69DDE8CDB954247C83005ACA15B4889AF8FBCD0F9A9B2FD9416BB57D758A9644F763588A200FEC509C89695DC707669B677531703465643C7BBBE02C44C5404799349DD1C28C0B92078C26235DC97A82842EEC96164836A1EF988B08B770360B0976715983AA0AF5973DED597412E96A174C1935993008582660B49732548C52A1A1F835CF0AD028354BA507A1A5D9FCBDE3712390FB2AD0A5A058630602B776B98654DE1C49B35CBAD905610A27B097FBC10397BF353C44D3504B89796F035B85947AA1C825373714CAF685AB87036F16D4ABDA7154DE49C89339CE3CBA2D03F1281C9624D5461DE13C1D924CAA00D9C0ABAB7D3506447D786EE87208F6B66A83E0C03C819EC776CB3DD0A71E7B0ECE9B139D53C6F2845217A8C5B9B829DA903A1725BE53641DDD1346BF37B8BA6B77417C2D7ABB87C91A9548858144F5AE796B438F583EC9B21AB20CA0BF139C3C687947835D0DC67E43102E31329A98ACC86FF8B803A2979CF6C78EC07FBCAC7219C75C32B175F7DB39918523C9905BCA546DD98246ADD820041409E0F41B4AD89EFA453760519ED80B32DA514C9A670BBA478BEF3C1233F6994E234AE11B895B511BBDAB149C5BA883D19118CA00F6ABB415F6771D58C95F387FB1ECB57DF751E8D7B7A87B9EB4241E5E09C625065C793BAD6CA78782E9A1A5043F5111150809379AC9477D59949CB9728D33B4E2673E2B9C3016D882BA4829ECC376596229DC87848CE390CC5634473A38D9C5B4B1294B012640F5E705AAB3018651575479A67B1840359B1676B18404C76CA34C2922359DFAC44BE5F2CB16A9B21F455EC527A68AF89F682C741BFBCCA3C98770B8249EBCB3A0A951E3019B693BC6E3158359C91F2210140A4C88EECC1420C885FDA0541ECA18A68CB1AC07C107986796052C06B96F1A6230DDDB2B6284C196E1A882A19D7DA082B7B2869ED48777027164F47F70F9902D83720265BAFDC38F6E55179A5C0147E51666375922F67B85492B05C1301E372C95CB369FC8266BDA3EDDC9BD74D14898B0205A2B62595484044A9CDDC14DC243B90AEA34865ACE0492A79D4418ADEA51C4F88681E4ACE051958C5362983B3C5C15C14A1C2503E4A82BE904AE959801218204D548013894EBA14E9F5B17AB038C76EA5EAAE21DAE8A8B83CCC486437F13F732A6824C4999C67688B58745685B621A42F110D424CE180AA47CAB2A47D8095206044BE15059883DC20445EA715D4A841ADCD96A4D170DDEE179669C1C1BF6296F8C5A8BD31F07D8C0D07C12E6A37101E74199D1A63124A66481437A864FB2C4AB4DFC2443BA17040290AA57CE5A145081B79AD47B98B3950855AA05D9A4939DE05F7BB62EFDBBBD64863AB8C5C8E5809235C72921AB78EC7A424CDA45502CC816C13105C5CEEEE8B99639C1224AC2D00A17EC56CC9D20580D47B3E1B74DFD0CB149F64092132725993815D6110A6541EF440DDB382815B2B65EFC31CC587EEE31630A461971755E005D3DB4A4CBA50B0A7FB13B051A5F5D06258B22C8807423AF4C026C359B15B0C9AB7B6001F98D71EC916FE3B40D2B3C6E39C813730329A19AB6A18F18831B5E008E17BB12F1DA8A506BA2141793DCCB67FD198301742B6EC9A69C0C98749A3DFE09405A2947C9C2162B17208BC68CD364BDC4588C14E014D3813104528F43F1441CA1874FC30DB500A9B87C2FBC8C691F884F5C61BE15F7C7E1C75A54337A2A378F00D722F1079F804175720C10184242993A91063331B30106CA328B427878C50B56F2B28A76BB2E9B154907781252F4C5DB492331D18D766769577027486B8436BC58E52B637BA4927ED2423E30741E9131452C0BF7CA1C15F25B2C816959F4077BE778893C5B1580BAD1B83424C52E2CB60252114721D68AAEAC5F43A1BCCC96B03A96C412725D792C008E31A4CD829FCB740E3897BAD5418C89878F9A86D3190BBDF90D8C4FDE02DE4D03E8BCD798D330515F929B1FDAE89C8E0C5610AD0FCCA308CB76EC125BAF5FCC2CAC285695CBFE17BF0AD04ED64FCD9330AC11E9DB061854602A5B3AC541B154535C6A1969695E4A9978EE2575F384 PublicRaw = BF7A1D2069577EE906B2E26297E51D961BA654F00849969D5AE46B132A74A62AC9B2781ED5C98CECB5C79C579E2BE30058740D00D99D676A5F0DD0959D340DB48A1AE477C154916AE6C6CDC00787D547C87E9A998F86BBCD3970379A68FE837DB0788240C5338577B5ED6BAF8F390C82362CD6EA592C23BD08A1603B2A0C7B5380DAC98DA2E4AC714B45E9E0516A953785A678D8C285985B69DDE8CDB954247C83005ACA15B4889AF8FBCD0F9A9B2FD9416BB57D758A9644F763588A200FEC509C89695DC707669B677531703465643C7BBBE02C44C5404799349DD1C28C0B92078C26235DC97A82842EEC96164836A1EF988B08B770360B0976715983AA0AF5973DED597412E96A174C1935993008582660B49732548C52A1A1F835CF0AD028354BA507A1A5D9FCBDE3712390FB2AD0A5A058630602B776B98654DE1C49B35CBAD905610A27B097FBC10397BF353C44D3504B89796F035B85947AA1C825373714CAF685AB87036F16D4ABDA7154DE49C89339CE3CBA2D03F1281C9624D5461DE13C1D924CAA00D9C0ABAB7D3506447D786EE87208F6B66A83E0C03C819EC776CB3DD0A71E7B0ECE9B139D53C6F2845217A8C5B9B829DA903A1725BE53641DDD1346BF37B8BA6B77417C2D7ABB87C91A9548858144F5AE796B438F583EC9B21AB20CA0BF139C3C687947835D0DC67E43102E31329A98ACC86FF8B803A2979CF6C78EC07FBCAC7219C75C32B175F7DB39918523C9905BCA546DD98246ADD820041409E0F41B4AD89EFA453760519ED80B32DA514C9A670BBA478BEF3C1233F6994E234AE11B895B511BBDAB149C5BA883D19118CA00F6ABB415F6771D58C95F387FB1ECB57DF751E8D7B7A87B9EB4241E5E09C625065C793BAD6CA78782E9A1A5043F5111150809379AC9477D59949CB9728D33B4E2673E2B9C3016D882BA4829ECC376596229DC87848CE390CC5634473A38D9C5B4B1294B012640F5E705AAB3018651575479A67B1840359B1676B18404C76CA34C2922359DFAC44BE5F2CB16A9B21F455EC527A68AF89F682C741BFBCCA3C98770B8249EBCB3A0A951E3019B693BC6E3158359C91F2210140A4C88EECC1420C885FDA0541ECA18A68CB1AC07C107986796052C06B96F1A6230DDDB2B6284C196E1A882A19D7DA082B7B2869ED48777027164F47F70F9902D83720265BAFDC38F6E55179A5C0147E51666375922F67B85492B05C1301E372C95CB369FC8266BDA3EDDC9BD74D14898B0205A2B62595484044A9CDDC14DC243B90AEA34865ACE0492A79D4418ADEA51C4F88681E4ACE051958C5362983B3C5C15C14A1C2503E4A82BE904AE959801218204D548013894EBA14E9F5B17AB038C76EA5EAAE21DAE8A8B83CCC486437F13F732A6824C4999C67688B58745685B621A42F110D424CE180AA47CAB2A47D8095206044BE15059883DC20445EA715D4A841ADCD96A4D170DDEE179669C1C1BF6296F8C5A8BD31F07D8C0D07C12E6A37101E74199D1A63124A66481437A864FB2C4AB4DFC2443BA17040290AA57CE5A145081B79AD47B98B3950855AA05D9A4939DE05F7BB62EFDBBBD64863AB8C5C8E5809235C72921AB78EC7A424CDA45502CC816C13105C5CEEEE8B99639C1224AC2D00A17EC56CC9D20580D47B3E1B74DFD0CB149F64092132725993815D6110A6541EF440DDB382815B2B65EFC31CC587EEE31630A461971755E005D3DB4A4CBA50B0A7FB13B051A5F5D06258B22C8807423AF4C026C359B15B0C9AB7B6001F98D71EC916FE3B40D2B3C6E39C813730329A19AB6A18F18831B5E008E17BB12F1DA8A506BA2141793DCCB67FD198301742B6EC9A69C0C98749A3DFE09405A2947C9C2162B17208BC68CD364BDC4588C14E014D3813104528F43F1441CA1874FC30DB500A9B87C2FBC8C691F884F5C61BE15F7C7E1C75A54337A2A378F00D722F1079F804175720C10184242993A91063331B30106CA328B427878C50B56F2B28A76BB2E9B154907781252F4C5DB492331D18D766769577027486B8436BC58E52B637BA4927ED2423E30741E9131452C0BF7CA1C15F25B2C816959F4077BE778893C5B1580BAD1B83424C52E2CB60252114721D68AAEAC5F43A1BCCC96B03A96C412725D792C008E31A4CD829FCB740E3897BAD5418C89878F9A86D3190BBDF90D8C4FDE02DE4D03E8BCD798D330515F929B1FDAE89C -PrivateFull = 30820C7502010004209330AC11E9DB061854602A5B3AC541B154535C6A1969695E4A9978EE2575F384048206006FE2A3D8A077B749509C39764AD1ACA6116CCE49B81B533DE0C55EA720293CA481876072180A1B88DA7CD0134C6C6C09703941F6199C1D624FC7B29491D885CC688941F88E6425C40C0C9F86054AA2700EE496861DD8B988296F05B93CFF612252307603EB676F94178D08907C3A8D9A0A7F1A17C6C50A08B9A2216168C692C70B39E35750C100987271DE78BE806ACD057278C5D96AF9437E72EA1503C94A6D623F912B1078602B53F405AE4741B2BB12F7F5BA6AC25B706496BD5053772272105636AAB1A12C796CBC22949EAAC832E6946EC7AAB85884CC75406D26330230564CC8B05E177D78AC8E3D9A8BC6F52D7719063B4B2B1613B8C45417AFD29CBD30130003C5BE5393110A5E47C1424C93C67AF6405E966B6D00138DF30F62F0C4AF7C58898B2DEBF5BC3AC452FE800141919CCAAC315ADCB083AB4FE3046344D4891A833C0A30A0F678A4E18CCE13275C409A2B951254528084C5637BA247C7D421C8E2DC93290C40420A6DFE84549C99B09266582EAB3819E3C7448833DC301D54E36F43ECA75AE4563979B4DA638E6D2402E6C1134F4C9920328299FAAA2E81C42C9515A1BC838DB5784FCB0822218F476724F9872F0CAA277992028B206EE6F799A1C7318CC780F1209B5FD442A8790011620C74E3C1E972338A804EDCB74D76A65961DC242F342BADB3A2C096005A4383FAD66472D9690730A091D614CFD72C0B442D2FD977B04041B583CF1B05C8D169523BA5C82C1CC4CEB11AD3A138F284A73B120DD8999AE3CB3980B7708011C0F6468FA4F1C36540B625BA38169154351440D4997974C3B54AE4CA023B9D96A71AD98738F6997B103BA14DEA410B7A51C815573439999187BC6E769500508ED294249BC75C3239565465CD54E563C39A8CE536991F5B875C8596DBDB28D1C8779EC98383DA662A955D3B3714C5500636E154EC42BDDA6986D8509C5BB389329017C7D16EC859B2D12242F15483F76CA36B23631F68C2BA481FD594AC1EA1C16819667280A2FCC74B9B5174FE6946B04A19B9DA6382307D9F7A1B92F42C52E341733ABBE549831F221EBA163600716E545BA74FA5B9EA4167649733C3BB33EFC2BBFB49BB47C630BFC1C7A78A394A03594A31B1F9826BCD205B0988A1CE77237D62C9079160585766AFD15FDA4B48177C3A55613E94F34B3CA4C4D12047D73543F9CA27B26C3B79F8B89BDA9ABC032F8176791B629FED254CA9644F304C0DC9619ECF6240A2EC3583867BEB3053749143DEEA00CB850E51EB314D310EFB6B625D65AE458A65AC84A622268416AC475347CD03A6CA9E7978BFCACAEC627700B7C3A01B4A8FA5B4A3D60960A521C8709F95F5B48D6C76CCC1729BA63D9346BAB120A93E617A97B21983D4B7D67C1C7FA8065C32048B2B84560684BF88109A8C511A67CE71E975DB1C6C6A24CCFA10722A330A7F6A4327E3642D5756FDC84901B184AFA9635684CAF6F30BE2D68FF6A82FE389CD718851F8554273902298540C944ACF9A505E0FE594A5312B6BD674433A1094707A2B82495209353158A58AC14EC09C879D468DA0447D085C2A69909758F966D6E139F9CC7F501B5D4FC9BB8BC51071E2215B4CBD1DA40B0BAA1F1217202AEC1C1C2997EEE2963739CEE81825B898A37D95457500471E66C7ABF60232B5BC8CDCC3FDE08CA83C2899C810FEB53242F00E9CD9C5824CBC6CEA11817B1225EC63077177298CB41A81087626BCBCB51759E9637CDB63254ACB5A5352A74B9F885056F1632C6A288E07E090F4F5088AB59D76029FC90B3F4207C26A83137D95BADE21B59E95539F9C716EF15BF58A0719783F8FD210C574B06088348C22BF5E420DA7FC58CE8C60B50BBA137ACFE5D36C613ACD78D1A035A995722720318511421C8E4FAC8E6B045F58DC25B5400C44B088DE44447332522425CB5B5AC15B7A52CC43916A7C846997A2AFE1B2CE365516852699AA9D2C30966DE1908405336FC89CB89B74A10496650322F59B1AEDB38A37DB6A1EE63759D2ADAF3613EE19CB8BE871DEC32838654B1E889EB32815597580BB1073AAD86D830C1A4C9530BBE6579DEC1F1F99AC16E131A406D051F13170CA7A115A625889937EE380FC8322CD087B1A501F22E2047A9355449C29693A13918797F61CB868310CA3D983F2C4473082062604820600BF7A1D2069577EE906B2E26297E51D961BA654F00849969D5AE46B132A74A62AC9B2781ED5C98CECB5C79C579E2BE30058740D00D99D676A5F0DD0959D340DB48A1AE477C154916AE6C6CDC00787D547C87E9A998F86BBCD3970379A68FE837DB0788240C5338577B5ED6BAF8F390C82362CD6EA592C23BD08A1603B2A0C7B5380DAC98DA2E4AC714B45E9E0516A953785A678D8C285985B69DDE8CDB954247C83005ACA15B4889AF8FBCD0F9A9B2FD9416BB57D758A9644F763588A200FEC509C89695DC707669B677531703465643C7BBBE02C44C5404799349DD1C28C0B92078C26235DC97A82842EEC96164836A1EF988B08B770360B0976715983AA0AF5973DED597412E96A174C1935993008582660B49732548C52A1A1F835CF0AD028354BA507A1A5D9FCBDE3712390FB2AD0A5A058630602B776B98654DE1C49B35CBAD905610A27B097FBC10397BF353C44D3504B89796F035B85947AA1C825373714CAF685AB87036F16D4ABDA7154DE49C89339CE3CBA2D03F1281C9624D5461DE13C1D924CAA00D9C0ABAB7D3506447D786EE87208F6B66A83E0C03C819EC776CB3DD0A71E7B0ECE9B139D53C6F2845217A8C5B9B829DA903A1725BE53641DDD1346BF37B8BA6B77417C2D7ABB87C91A9548858144F5AE796B438F583EC9B21AB20CA0BF139C3C687947835D0DC67E43102E31329A98ACC86FF8B803A2979CF6C78EC07FBCAC7219C75C32B175F7DB39918523C9905BCA546DD98246ADD820041409E0F41B4AD89EFA453760519ED80B32DA514C9A670BBA478BEF3C1233F6994E234AE11B895B511BBDAB149C5BA883D19118CA00F6ABB415F6771D58C95F387FB1ECB57DF751E8D7B7A87B9EB4241E5E09C625065C793BAD6CA78782E9A1A5043F5111150809379AC9477D59949CB9728D33B4E2673E2B9C3016D882BA4829ECC376596229DC87848CE390CC5634473A38D9C5B4B1294B012640F5E705AAB3018651575479A67B1840359B1676B18404C76CA34C2922359DFAC44BE5F2CB16A9B21F455EC527A68AF89F682C741BFBCCA3C98770B8249EBCB3A0A951E3019B693BC6E3158359C91F2210140A4C88EECC1420C885FDA0541ECA18A68CB1AC07C107986796052C06B96F1A6230DDDB2B6284C196E1A882A19D7DA082B7B2869ED48777027164F47F70F9902D83720265BAFDC38F6E55179A5C0147E51666375922F67B85492B05C1301E372C95CB369FC8266BDA3EDDC9BD74D14898B0205A2B62595484044A9CDDC14DC243B90AEA34865ACE0492A79D4418ADEA51C4F88681E4ACE051958C5362983B3C5C15C14A1C2503E4A82BE904AE959801218204D548013894EBA14E9F5B17AB038C76EA5EAAE21DAE8A8B83CCC486437F13F732A6824C4999C67688B58745685B621A42F110D424CE180AA47CAB2A47D8095206044BE15059883DC20445EA715D4A841ADCD96A4D170DDEE179669C1C1BF6296F8C5A8BD31F07D8C0D07C12E6A37101E74199D1A63124A66481437A864FB2C4AB4DFC2443BA17040290AA57CE5A145081B79AD47B98B3950855AA05D9A4939DE05F7BB62EFDBBBD64863AB8C5C8E5809235C72921AB78EC7A424CDA45502CC816C13105C5CEEEE8B99639C1224AC2D00A17EC56CC9D20580D47B3E1B74DFD0CB149F64092132725993815D6110A6541EF440DDB382815B2B65EFC31CC587EEE31630A461971755E005D3DB4A4CBA50B0A7FB13B051A5F5D06258B22C8807423AF4C026C359B15B0C9AB7B6001F98D71EC916FE3B40D2B3C6E39C813730329A19AB6A18F18831B5E008E17BB12F1DA8A506BA2141793DCCB67FD198301742B6EC9A69C0C98749A3DFE09405A2947C9C2162B17208BC68CD364BDC4588C14E014D3813104528F43F1441CA1874FC30DB500A9B87C2FBC8C691F884F5C61BE15F7C7E1C75A54337A2A378F00D722F1079F804175720C10184242993A91063331B30106CA328B427878C50B56F2B28A76BB2E9B154907781252F4C5DB492331D18D766769577027486B8436BC58E52B637BA4927ED2423E30741E9131452C0BF7CA1C15F25B2C816959F4077BE778893C5B1580BAD1B83424C52E2CB60252114721D68AAEAC5F43A1BCCC96B03A96C412725D792C008E31A4CD829FCB740E3897BAD5418C042089878F9A86D3190BBDF90D8C4FDE02DE4D03E8BCD798D330515F929B1FDAE89C0420F2CF05C1010A42945E3EE65DA3A5A0F27E08B7A1A930C5F242A18CD68627BDFB -PublicFull = 3082062604820600BF7A1D2069577EE906B2E26297E51D961BA654F00849969D5AE46B132A74A62AC9B2781ED5C98CECB5C79C579E2BE30058740D00D99D676A5F0DD0959D340DB48A1AE477C154916AE6C6CDC00787D547C87E9A998F86BBCD3970379A68FE837DB0788240C5338577B5ED6BAF8F390C82362CD6EA592C23BD08A1603B2A0C7B5380DAC98DA2E4AC714B45E9E0516A953785A678D8C285985B69DDE8CDB954247C83005ACA15B4889AF8FBCD0F9A9B2FD9416BB57D758A9644F763588A200FEC509C89695DC707669B677531703465643C7BBBE02C44C5404799349DD1C28C0B92078C26235DC97A82842EEC96164836A1EF988B08B770360B0976715983AA0AF5973DED597412E96A174C1935993008582660B49732548C52A1A1F835CF0AD028354BA507A1A5D9FCBDE3712390FB2AD0A5A058630602B776B98654DE1C49B35CBAD905610A27B097FBC10397BF353C44D3504B89796F035B85947AA1C825373714CAF685AB87036F16D4ABDA7154DE49C89339CE3CBA2D03F1281C9624D5461DE13C1D924CAA00D9C0ABAB7D3506447D786EE87208F6B66A83E0C03C819EC776CB3DD0A71E7B0ECE9B139D53C6F2845217A8C5B9B829DA903A1725BE53641DDD1346BF37B8BA6B77417C2D7ABB87C91A9548858144F5AE796B438F583EC9B21AB20CA0BF139C3C687947835D0DC67E43102E31329A98ACC86FF8B803A2979CF6C78EC07FBCAC7219C75C32B175F7DB39918523C9905BCA546DD98246ADD820041409E0F41B4AD89EFA453760519ED80B32DA514C9A670BBA478BEF3C1233F6994E234AE11B895B511BBDAB149C5BA883D19118CA00F6ABB415F6771D58C95F387FB1ECB57DF751E8D7B7A87B9EB4241E5E09C625065C793BAD6CA78782E9A1A5043F5111150809379AC9477D59949CB9728D33B4E2673E2B9C3016D882BA4829ECC376596229DC87848CE390CC5634473A38D9C5B4B1294B012640F5E705AAB3018651575479A67B1840359B1676B18404C76CA34C2922359DFAC44BE5F2CB16A9B21F455EC527A68AF89F682C741BFBCCA3C98770B8249EBCB3A0A951E3019B693BC6E3158359C91F2210140A4C88EECC1420C885FDA0541ECA18A68CB1AC07C107986796052C06B96F1A6230DDDB2B6284C196E1A882A19D7DA082B7B2869ED48777027164F47F70F9902D83720265BAFDC38F6E55179A5C0147E51666375922F67B85492B05C1301E372C95CB369FC8266BDA3EDDC9BD74D14898B0205A2B62595484044A9CDDC14DC243B90AEA34865ACE0492A79D4418ADEA51C4F88681E4ACE051958C5362983B3C5C15C14A1C2503E4A82BE904AE959801218204D548013894EBA14E9F5B17AB038C76EA5EAAE21DAE8A8B83CCC486437F13F732A6824C4999C67688B58745685B621A42F110D424CE180AA47CAB2A47D8095206044BE15059883DC20445EA715D4A841ADCD96A4D170DDEE179669C1C1BF6296F8C5A8BD31F07D8C0D07C12E6A37101E74199D1A63124A66481437A864FB2C4AB4DFC2443BA17040290AA57CE5A145081B79AD47B98B3950855AA05D9A4939DE05F7BB62EFDBBBD64863AB8C5C8E5809235C72921AB78EC7A424CDA45502CC816C13105C5CEEEE8B99639C1224AC2D00A17EC56CC9D20580D47B3E1B74DFD0CB149F64092132725993815D6110A6541EF440DDB382815B2B65EFC31CC587EEE31630A461971755E005D3DB4A4CBA50B0A7FB13B051A5F5D06258B22C8807423AF4C026C359B15B0C9AB7B6001F98D71EC916FE3B40D2B3C6E39C813730329A19AB6A18F18831B5E008E17BB12F1DA8A506BA2141793DCCB67FD198301742B6EC9A69C0C98749A3DFE09405A2947C9C2162B17208BC68CD364BDC4588C14E014D3813104528F43F1441CA1874FC30DB500A9B87C2FBC8C691F884F5C61BE15F7C7E1C75A54337A2A378F00D722F1079F804175720C10184242993A91063331B30106CA328B427878C50B56F2B28A76BB2E9B154907781252F4C5DB492331D18D766769577027486B8436BC58E52B637BA4927ED2423E30741E9131452C0BF7CA1C15F25B2C816959F4077BE778893C5B1580BAD1B83424C52E2CB60252114721D68AAEAC5F43A1BCCC96B03A96C412725D792C008E31A4CD829FCB740E3897BAD5418C042089878F9A86D3190BBDF90D8C4FDE02DE4D03E8BCD798D330515F929B1FDAE89C diff --git a/src/tests/test_kyber.cpp b/src/tests/test_kyber.cpp index 2e4e911721e..69673942768 100644 --- a/src/tests/test_kyber.cpp +++ b/src/tests/test_kyber.cpp @@ -32,70 +32,6 @@ namespace Botan_Tests { class KYBER_Tests final : public Test { public: - // Regression test for GH #2993: https://github.com/randombit/botan/issues/2993 - // - // The resulting shared secrets did not match when the encapsulating public- - // key used a different encoding (Kyber_PublicKey::set_binary_encoding()) - // from the private key decapsulating the ciphertext. - // - // The public key encoding used in Kyber's internal Fujisaki-Okamoto - // transform depended on that setting. I.e. if the encoding settings for - // encapsulation and decapsulation did not match, the resulting shared - // secret did not match either. - static void regression_gh2993(Test::Result &result, Botan::KyberMode mode) - { - auto sk = std::make_unique(Test::rng(), mode); - - sk->set_binary_encoding(Botan::KyberKeyEncoding::Raw); - auto sk_codec_raw = std::make_unique(sk->private_key_bits(), mode, Botan::KyberKeyEncoding::Raw); - auto pk_raw = sk->public_key(); - auto pk_codec_raw = std::make_unique(pk_raw->public_key_bits(), mode, Botan::KyberKeyEncoding::Raw); - - sk->set_binary_encoding(Botan::KyberKeyEncoding::Full); - auto sk_codec_full = std::make_unique(sk->private_key_bits(), mode, Botan::KyberKeyEncoding::Full); - auto pk_full = sk->public_key(); - auto pk_codec_full = std::make_unique(pk_full->public_key_bits(), mode, Botan::KyberKeyEncoding::Full); - - auto roundtrip = [&] (const auto& pkey, const auto& skey, const std::string& context, const std::string& kdf) - { - auto e = Botan::PK_KEM_Encryptor(*pkey, kdf, "base"); - Botan::secure_vector ct, shared_key; - e.encrypt(ct, shared_key, 64, Test::rng()); - - auto d = Botan::PK_KEM_Decryptor(*skey, Test::rng(), kdf, "base"); - const auto shared_key2 = d.decrypt(ct.data(), ct.size(), 64); - - result.confirm("shared secrets are equal, when " + context + ", using " + kdf, shared_key == shared_key2); - }; - - #if defined(BOTAN_HAS_HKDF) && defined(BOTAN_HAS_SHA2_32) - sk->set_binary_encoding(Botan::KyberKeyEncoding::Raw); - roundtrip(pk_raw, sk, "both keys are in-memory", "HKDF(SHA-256)"); - roundtrip(pk_codec_raw, sk, "pubkey is encoded/decoded as 'raw'", "HKDF(SHA-256)"); - roundtrip(pk_raw, sk_codec_raw, "privkey is encoded/decoded as 'raw'", "HKDF(SHA-256)"); - roundtrip(pk_codec_raw, sk_codec_raw, "both keys are encoded/decoded as 'raw'", "HKDF(SHA-256)"); - - sk->set_binary_encoding(Botan::KyberKeyEncoding::Full); - roundtrip(pk_full, sk, "both keys are in-memory", "HKDF(SHA-256)"); - roundtrip(pk_codec_full, sk, "pubkey is encoded/decoded as 'full'", "HKDF(SHA-256)"); - roundtrip(pk_full, sk_codec_full, "privkey is encoded/decoded as 'full'", "HKDF(SHA-256)"); - roundtrip(pk_codec_full, sk_codec_full, "both keys are encoded/decoded as 'full'", "HKDF(SHA-256)"); - #endif - - sk->set_binary_encoding(Botan::KyberKeyEncoding::Raw); - roundtrip(pk_raw, sk, "both keys are in-memory", "Raw"); - roundtrip(pk_codec_raw, sk, "pubkey is encoded/decoded as 'raw'", "Raw"); - roundtrip(pk_raw, sk_codec_raw, "privkey is encoded/decoded as 'raw'", "Raw"); - roundtrip(pk_codec_raw, sk_codec_raw, "both keys are encoded/decoded as 'raw'", "Raw"); - - sk->set_binary_encoding(Botan::KyberKeyEncoding::Full); - roundtrip(pk_full, sk, "both keys are in-memory", "Raw"); - roundtrip(pk_codec_full, sk, "pubkey is encoded/decoded as 'full'", "Raw"); - roundtrip(pk_full, sk_codec_full, "privkey is encoded/decoded as 'full'", "Raw"); - roundtrip(pk_codec_full, sk_codec_full, "both keys are encoded/decoded as 'full'", "Raw"); - - } - static Test::Result run_kyber_test(const char* test_name, Botan::KyberMode mode, size_t strength) { Test::Result result(test_name); @@ -114,13 +50,13 @@ class KYBER_Tests final : public Test const auto pub_key_bits = pub_key->public_key_bits(); // Bob (reading from serialized public key) - Botan::Kyber_PublicKey alice_pub_key(pub_key_bits, mode, Botan::KyberKeyEncoding::Full); + Botan::Kyber_PublicKey alice_pub_key(pub_key_bits, mode); auto enc = Botan::PK_KEM_Encryptor(alice_pub_key, "Raw", "base"); Botan::secure_vector cipher_text, key_bob; enc.encrypt(cipher_text, key_bob, 0 /* no KDF */, Test::rng()); // Alice (reading from serialized private key) - Botan::Kyber_PrivateKey alice_priv_key(priv_key_bits, mode, Botan::KyberKeyEncoding::Full); + Botan::Kyber_PrivateKey alice_priv_key(priv_key_bits, mode); auto dec = Botan::PK_KEM_Decryptor(alice_priv_key, Test::rng(), "Raw", "base"); const auto key_alice = dec.decrypt(cipher_text, 0 /* no KDF */, empty_salt); result.test_eq("shared secrets are equal", key_alice, key_bob); @@ -148,11 +84,6 @@ class KYBER_Tests final : public Test const auto key_alice_try2 = dec.decrypt(cipher_text, 0 /* no KDF */, empty_salt); result.test_eq("shared secrets are equal", key_alice_try2, key_bob); - // - // regression tests - // - regression_gh2993(result, mode); - return result; } @@ -196,7 +127,6 @@ Test::Result check_kyber_kat(const char* test_name, const VarMap& vars, Botan::K // Alice Botan::Kyber_PrivateKey priv_key(ctr_drbg, mode); - priv_key.set_binary_encoding(Botan::KyberKeyEncoding::Raw); const auto pub_key = priv_key.public_key(); result.test_eq("Public Key Output", priv_key.public_key_bits(), pk_in); result.test_eq("Secret Key Output", priv_key.private_key_bits(), sk_in); @@ -257,7 +187,7 @@ class Kyber_Encoding_Test : public Text_Based_Test { public: Kyber_Encoding_Test() - : Text_Based_Test("pubkey/kyber_encodings.vec", "PrivateRaw,PrivateFull,PublicRaw,PublicFull", "Error") + : Text_Based_Test("pubkey/kyber_encodings.vec", "PrivateRaw,PublicRaw", "Error") { } @@ -303,10 +233,8 @@ class Kyber_Encoding_Test : public Text_Based_Test const auto mode = name_to_mode(algo_name); - const auto sk_full = Botan::hex_decode_locked(vars.get_req_str("PrivateFull")); const auto pk_raw = Botan::hex_decode(vars.get_req_str("PublicRaw")); const auto sk_raw = Botan::hex_decode_locked(vars.get_req_str("PrivateRaw")); - const auto pk_full = Botan::hex_decode(vars.get_req_str("PublicFull")); const auto error = vars.get_opt_str("Error", ""); if(!error.empty()) @@ -315,46 +243,23 @@ class Kyber_Encoding_Test : public Text_Based_Test result.test_throws("failing decoding", error, [&] { - if(!sk_full.empty()) - Botan::Kyber_PrivateKey(sk_full, mode, Botan::KyberKeyEncoding::Full); if(!sk_raw.empty()) - Botan::Kyber_PrivateKey(sk_raw, mode, Botan::KyberKeyEncoding::Raw); + Botan::Kyber_PrivateKey(sk_raw, mode); if(!pk_raw.empty()) - Botan::Kyber_PublicKey(pk_raw, mode, Botan::KyberKeyEncoding::Raw); - if(!pk_full.empty()) - Botan::Kyber_PublicKey(pk_full, mode, Botan::KyberKeyEncoding::Full); + Botan::Kyber_PublicKey(pk_raw, mode); }); return result; } - - const auto pk_matches = [&](const auto &pk, const std::string &from_encoding) + else { - pk->set_binary_encoding(Botan::KyberKeyEncoding::Raw); - result.test_eq(from_encoding + " matches raw public key", pk->public_key_bits(), pk_raw); - pk->set_binary_encoding(Botan::KyberKeyEncoding::Full); - result.test_eq(from_encoding + " matches full public key", pk->public_key_bits(), pk_full); - }; + const auto skr = std::make_unique(sk_raw, mode); + const auto pkr = std::make_unique(pk_raw, mode); - const auto sk_matches = [&](const auto &sk, const std::string &from_encoding) - { - pk_matches(sk, from_encoding); - - sk->set_binary_encoding(Botan::KyberKeyEncoding::Raw); - result.test_eq(from_encoding + " matches raw private key", sk->private_key_bits(), sk_raw); - sk->set_binary_encoding(Botan::KyberKeyEncoding::Full); - result.test_eq(from_encoding + " matches full private key", sk->private_key_bits(), sk_full); - }; - - const auto skr = std::make_unique(sk_raw, mode, Botan::KyberKeyEncoding::Raw); - sk_matches(skr, "raw"); - const auto pkr = std::make_unique(pk_raw, mode, Botan::KyberKeyEncoding::Raw); - pk_matches(pkr, "raw"); - - const auto skf = std::make_unique(sk_full, mode, Botan::KyberKeyEncoding::Full); - sk_matches(skf, "full"); - const auto pkf = std::make_unique(pk_full, mode, Botan::KyberKeyEncoding::Full); - pk_matches(pkf, "full"); + result.test_eq("sk's encoding of pk", skr->public_key_bits(), pk_raw); + result.test_eq("sk's encoding of sk", skr->private_key_bits(), sk_raw); + result.test_eq("pk's encoding of pk", skr->public_key_bits(), pk_raw); + } return result; }