diff --git a/CMakeLists.txt b/CMakeLists.txt index e47ff86365..ef9dc7572d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,10 +82,7 @@ tristate_feature_auto(ENABLE_RIPEMD160 "Enable RIPEMD-160 hash support.") option(ENABLE_CRYPTO_REFRESH "Enable crypto-refresh support (v6)") option(ENABLE_PQC "Enable PQC support") -# Note: The following two flags are only temporary and will be removed once POC is in a stable state -if (DEFINED ENABLE_PQC_MLKEM_IPD) - add_definitions(-DENABLE_PQC_MLKEM_IPD) -endif() +# Note: The following flag is only temporary and will be removed once POC is in a stable state if (DEFINED ENABLE_PQC_DBG_LOG) add_definitions(-DENABLE_PQC_DBG_LOG) endif() diff --git a/include/repgp/repgp_def.h b/include/repgp/repgp_def.h index 1d5859e0cd..f18ddbd940 100644 --- a/include/repgp/repgp_def.h +++ b/include/repgp/repgp_def.h @@ -103,11 +103,6 @@ #define PGP_MARKER_CONTENTS "PGP" #define PGP_MARKER_LEN 3 -/* V6 Signature Salt */ -#if defined(ENABLE_CRYPTO_REFRESH) -#define PGP_MAX_SALT_SIZE_V6_SIG 32 -#endif - /** Old Packet Format Lengths. * Defines the meanings of the 2 bits for length type in the * old packet format. @@ -209,38 +204,39 @@ typedef enum : uint8_t { PGP_PKA_EDDSA = 22, /* EdDSA from draft-ietf-openpgp-rfc4880bis */ #if defined(ENABLE_CRYPTO_REFRESH) - PGP_PKA_X25519 = 25, /* v6 / Crypto Refresh */ - PGP_PKA_ED25519 = 27, /* v6 / Crypto Refresh */ + PGP_PKA_X25519 = 25, + PGP_PKA_X448 = 26, + PGP_PKA_ED25519 = 27, + PGP_PKA_ED448 = 28, #endif PGP_PKA_SM2 = 99, /* SM2 encryption/signature schemes */ #if defined(ENABLE_PQC) /* PQC-ECC composite */ - PGP_PKA_KYBER768_X25519 = 105, - // PGP_PKA_KYBER1024_X448 = 106, + PGP_PKA_KYBER768_X25519 = 35, + PGP_PKA_KYBER1024_X448 = 36, PGP_PKA_KYBER768_P256 = 111, PGP_PKA_KYBER1024_P384 = 112, PGP_PKA_KYBER768_BP256 = 113, PGP_PKA_KYBER1024_BP384 = 114, - PGP_PKA_DILITHIUM3_ED25519 = 107, - // PGP_PKA_DILITHIUM5_ED448 = 108, - PGP_PKA_DILITHIUM3_P256 = 115, + PGP_PKA_DILITHIUM3_ED25519 = 30, + PGP_PKA_DILITHIUM5_ED448 = 31, + PGP_PKA_DILITHIUM3_P256 = 132, PGP_PKA_DILITHIUM5_P384 = 116, PGP_PKA_DILITHIUM3_BP256 = 117, PGP_PKA_DILITHIUM5_BP384 = 118, - PGP_PKA_SPHINCSPLUS_SHA2 = 109, - PGP_PKA_SPHINCSPLUS_SHAKE = 119, + PGP_PKA_SPHINCSPLUS_SHAKE_128s = 32, + PGP_PKA_SPHINCSPLUS_SHAKE_128f = 33, + PGP_PKA_SPHINCSPLUS_SHAKE_256s = 34, PGP_PKA_PRIVATE00 = 100, /* Private/Experimental Algorithm */ PGP_PKA_PRIVATE01 = 101, /* Private/Experimental Algorithm */ PGP_PKA_PRIVATE02 = 102, /* Private/Experimental Algorithm */ PGP_PKA_PRIVATE03 = 103, /* Private/Experimental Algorithm */ PGP_PKA_PRIVATE04 = 104, /* Private/Experimental Algorithm */ - PGP_PKA_PRIVATE06 = 106, /* Private/Experimental Algorithm */ - PGP_PKA_PRIVATE08 = 108, /* Private/Experimental Algorithm */ PGP_PKA_PRIVATE10 = 110 /* Private/Experimental Algorithm */ #else PGP_PKA_PRIVATE00 = 100, /* Private/Experimental Algorithm */ @@ -277,7 +273,10 @@ typedef enum { PGP_CURVE_P256K1, PGP_CURVE_SM2_P_256, - +#if defined(ENABLE_CRYPTO_REFRESH) + PGP_CURVE_ED448, + PGP_CURVE_448, +#endif // Keep always last one PGP_CURVE_MAX } pgp_curve_t; @@ -489,6 +488,12 @@ typedef enum { #endif } pgp_pkesk_version_t; typedef enum { PGP_SE_IP_DATA_V1 = 1, PGP_SE_IP_DATA_V2 = 2 } pgp_seipd_version_t; +typedef enum { + PGP_OPS_V3 = 3, +#if defined(ENABLE_CRYPTO_REFRESH) + PGP_OPS_V6 = 6 +#endif +} pgp_ops_version_t; /** Version. * OpenPGP has two different protocol versions: version 3 and version 4. diff --git a/include/rnp/rnp.h b/include/rnp/rnp.h index 0a4f42942f..421ae5236a 100644 --- a/include/rnp/rnp.h +++ b/include/rnp/rnp.h @@ -1224,24 +1224,6 @@ RNP_API rnp_result_t rnp_op_generate_set_pref_keyserver(rnp_op_generate_t op, RNP_API rnp_result_t rnp_op_generate_set_v6_key(rnp_op_generate_t op); #endif -#if defined(RNP_EXPERIMENTAL_PQC) -/** Set the SPHINCS+ parameter set - * NOTE: This is an experimental feature and this function can be replaced (or removed) at any - * time. - * - * @param op pointer to opaque key generation context. - * @param param string, representing the SHPINCS+ parameter set. - * Possible Values: - * 128s, 128f, 192s, 192f, 256s, 256f - * All parameter sets refer to the simple variant and the hash function is given - * by the algorithm id. - * - * @return RNP_SUCCESS or error code if failed. - */ -RNP_API rnp_result_t rnp_op_generate_set_sphincsplus_param(rnp_op_generate_t op, - const char * param); -#endif - /** Execute the prepared key or subkey generation operation. * Note: if you set protection algorithm, then you need to specify ffi password provider to * be able to request password for key encryption. @@ -2446,19 +2428,6 @@ RNP_API rnp_result_t rnp_key_get_default_key(rnp_key_handle_t primary_key, */ RNP_API rnp_result_t rnp_key_get_alg(rnp_key_handle_t key, char **alg); -#if defined(RNP_EXPERIMENTAL_PQC) -/** Get a SPHINCS+ key's parameter string - * - * @param key key handle - * @param alg string with parameter name will be stored here. You must free it using the - * rnp_buffer_destroy() function. - * @return RNP_SUCCESS or error code if failed. - * NOTE: This is an experimental feature and this function can be replaced (or removed) at any - * time. - */ -RNP_API rnp_result_t rnp_key_sphincsplus_get_param(rnp_key_handle_t handle, char **param); -#endif - /** Get number of bits in the key. For EC-based keys it will return size of the curve. * * @param key key handle @@ -4114,9 +4083,11 @@ RNP_API const char *rnp_backend_version(); #define RNP_ALGNAME_ECDH "ECDH" #define RNP_ALGNAME_ECDSA "ECDSA" #define RNP_ALGNAME_EDDSA "EDDSA" -#if defined(RNP_EXPERIMENTAL_CRYPTO_REFRESH) || defined(RNP_EXPERIMENTAL_PQC) +#if defined(RNP_EXPERIMENTAL_CRYPTO_REFRESH) #define RNP_ALGNAME_ED25519 "ED25519" #define RNP_ALGNAME_X25519 "X25519" +#define RNP_ALGNAME_ED448 "ED448" +#define RNP_ALGNAME_X448 "X448" #endif #if defined(RNP_EXPERIMENTAL_PQC) #define RNP_ALGNAME_KYBER768_X25519 "ML-KEM-768+X25519" @@ -4131,8 +4102,9 @@ RNP_API const char *rnp_backend_version(); #define RNP_ALGNAME_DILITHIUM5_P384 "ML-DSA-87+ECDSA-P384" #define RNP_ALGNAME_DILITHIUM3_BP256 "ML-DSA-65+ECDSA-BP256" #define RNP_ALGNAME_DILITHIUM5_BP384 "ML-DSA-87+ECDSA-BP384" -#define RNP_ALGNAME_SPHINCSPLUS_SHA2 "SLH-DSA-SHA2" -#define RNP_ALGNAME_SPHINCSPLUS_SHAKE "SLH-DSA-SHAKE" +#define RNP_ALGNAME_SPHINCSPLUS_SHAKE_128f "SLH-DSA-SHAKE-128f" +#define RNP_ALGNAME_SPHINCSPLUS_SHAKE_128s "SLH-DSA-SHAKE-128s" +#define RNP_ALGNAME_SPHINCSPLUS_SHAKE_256s "SLH-DSA-SHAKE-256s" #endif #define RNP_ALGNAME_IDEA "IDEA" #define RNP_ALGNAME_TRIPLEDES "TRIPLEDES" diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 55b67060f2..69dabfe95e 100755 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -31,14 +31,19 @@ find_package(ZLIB REQUIRED) # required packages find_package(JSON-C 0.11 REQUIRED) -if (CRYPTO_BACKEND_BOTAN3) - find_package(Botan 3.0.0 REQUIRED) -elseif (CRYPTO_BACKEND_BOTAN) +if(ENABLE_CRYPTO_REFRESH) + find_package(Botan 3.6.0 REQUIRED) + set(CRYPTO_BACKEND_BOTAN3 1) +else() + if (CRYPTO_BACKEND_BOTAN3) + find_package(Botan 3.0.0 REQUIRED) + elseif (CRYPTO_BACKEND_BOTAN) # botan-config.cmake from Botan distribution doesn't support version 2.x, # so use -DCRYPTO_BACKEND=botan3 to configure find_package(Botan 2.14.0 REQUIRED) - if(Botan_VERSION VERSION_GREATER_EQUAL 3.0.0) - set(CRYPTO_BACKEND_BOTAN3 1) + if(Botan_VERSION VERSION_GREATER_EQUAL 3.0.0) + set(CRYPTO_BACKEND_BOTAN3 1) + endif() endif() endif() if (CRYPTO_BACKEND_BOTAN) @@ -60,7 +65,7 @@ if(CRYPTO_BACKEND_BOTAN3) set(CMAKE_CXX_STANDARD 20) endif() -if(ENABLE_PQC) +if(ENABLE_CRYPTO_REFRESH) if (NOT CRYPTO_BACKEND_BOTAN3) message(FATAL_ERROR "ENABLE_PQC requires Botan 3 as crypto backend") endif() @@ -70,6 +75,10 @@ endif() if(ENABLE_CRYPTO_REFRESH AND (NOT ENABLE_AEAD)) message(FATAL_ERROR "ENABLE_CRYPTO_REFRESH requires ENABLE_AEAD, but it's either Off or Auto and got turned off") endif() +# check that ENABLE_CRYPTO_REFRESH is enabled for ENABLE_PQC +if(ENABLE_PQC AND (NOT ENABLE_CRYPTO_REFRESH)) + message(FATAL_ERROR "ENABLE_PQC requires ENABLE_CRYPTO_REFRESH") +endif() # generate a config.h include(CheckIncludeFileCXX) @@ -211,8 +220,8 @@ if(CRYPTO_BACKEND_BOTAN) resolve_feature_state(ENABLE_AEAD "AEAD_EAX;AEAD_OCB") resolve_feature_state(ENABLE_TWOFISH "TWOFISH") resolve_feature_state(ENABLE_IDEA "IDEA") - resolve_feature_state(ENABLE_CRYPTO_REFRESH "HKDF") - resolve_feature_state(ENABLE_PQC "KMAC;DILITHIUM;KYBER;SPHINCS_PLUS_WITH_SHA2;SPHINCS_PLUS_WITH_SHAKE") + resolve_feature_state(ENABLE_CRYPTO_REFRESH "HKDF;ED448;X448") + resolve_feature_state(ENABLE_PQC "DILITHIUM;KYBER;SPHINCS_PLUS_WITH_SHA2;SPHINCS_PLUS_WITH_SHAKE") resolve_feature_state(ENABLE_BLOWFISH "BLOWFISH") resolve_feature_state(ENABLE_CAST5 "CAST_128") resolve_feature_state(ENABLE_RIPEMD160 "RIPEMD_160") @@ -348,14 +357,11 @@ elseif(CRYPTO_BACKEND_BOTAN) if(ENABLE_SM2) list(APPEND CRYPTO_SOURCES crypto/sm2.cpp) endif() - if(ENABLE_PQC OR ENABLE_CRYPTO_REFRESH) - list(APPEND CRYPTO_SOURCES - crypto/exdsa_ecdhkem.cpp - crypto/ed25519.cpp - crypto/x25519.cpp - ) if(ENABLE_CRYPTO_REFRESH) list(APPEND CRYPTO_SOURCES + crypto/exdsa_ecdhkem.cpp + crypto/ed25519_ed448.cpp + crypto/x25519_x448.cpp crypto/hkdf.cpp crypto/hkdf_botan.cpp ) @@ -369,11 +375,9 @@ elseif(CRYPTO_BACKEND_BOTAN) crypto/kyber.cpp crypto/kyber_ecdh_composite.cpp crypto/dilithium_exdsa_composite.cpp - crypto/kmac.cpp - crypto/kmac_botan.cpp + crypto/kem_combiner.cpp ) endif() - endif() else() message(FATAL_ERROR "Unknown crypto backend: ${CRYPTO_BACKEND}.") endif() diff --git a/src/lib/crypto/common.h b/src/lib/crypto/common.h index 9c5a4f4c1f..d81beea4f9 100644 --- a/src/lib/crypto/common.h +++ b/src/lib/crypto/common.h @@ -45,8 +45,8 @@ #include "sphincsplus.h" #endif #if defined(ENABLE_CRYPTO_REFRESH) -#include "x25519.h" -#include "ed25519.h" +#include "x25519_x448.h" +#include "ed25519_ed448.h" #endif /* symmetric crypto */ #include "symmetric.h" diff --git a/src/lib/crypto/dilithium.cpp b/src/lib/crypto/dilithium.cpp index bd7f112bd4..ba7f700851 100644 --- a/src/lib/crypto/dilithium.cpp +++ b/src/lib/crypto/dilithium.cpp @@ -25,6 +25,8 @@ */ #include "dilithium.h" +#include "logging.h" +#include "types.h" #include namespace { @@ -32,9 +34,9 @@ namespace { Botan::DilithiumMode rnp_dilithium_param_to_botan_dimension(dilithium_parameter_e mode) { - Botan::DilithiumMode result = Botan::DilithiumMode::Dilithium8x7; + Botan::DilithiumMode result = Botan::DilithiumMode::ML_DSA_8x7; if (mode == dilithium_parameter_e::dilithium_L3) { - result = Botan::DilithiumMode::Dilithium6x5; + result = Botan::DilithiumMode::ML_DSA_6x5; } return result; } @@ -117,21 +119,3 @@ pgp_dilithium_private_key_t::is_valid(rnp::RNG *rng) const auto key = botan_key(); return key.check_key(*(rng->obj()), false); } - -bool -dilithium_hash_allowed(pgp_hash_alg_t hash_alg) -{ - switch (hash_alg) { - case PGP_HASH_SHA3_256: - case PGP_HASH_SHA3_512: - return true; - default: - return false; - } -} - -pgp_hash_alg_t -dilithium_default_hash_alg() -{ - return PGP_HASH_SHA3_256; -} \ No newline at end of file diff --git a/src/lib/crypto/dilithium.h b/src/lib/crypto/dilithium.h index 18035ce0c1..bce2787c8e 100644 --- a/src/lib/crypto/dilithium.h +++ b/src/lib/crypto/dilithium.h @@ -109,8 +109,4 @@ class pgp_dilithium_public_key_t { std::pair dilithium_generate_keypair( rnp::RNG *rng, dilithium_parameter_e dilithium_param); -bool dilithium_hash_allowed(pgp_hash_alg_t hash_alg); - -pgp_hash_alg_t dilithium_default_hash_alg(); - #endif diff --git a/src/lib/crypto/dilithium_common.cpp b/src/lib/crypto/dilithium_common.cpp index d28c7b678f..ff28bd4c85 100644 --- a/src/lib/crypto/dilithium_common.cpp +++ b/src/lib/crypto/dilithium_common.cpp @@ -58,17 +58,10 @@ pgp_dilithium_private_key_t::pgp_dilithium_private_key_t( } size_t -dilithium_privkey_size(dilithium_parameter_e parameter) +dilithium_privkey_size() { - switch (parameter) { - case dilithium_L3: - return 4000; - case dilithium_L5: - return 4864; - default: - RNP_LOG("invalid parameter given"); - throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); - } + /* seed format */ + return 32; } size_t @@ -90,9 +83,9 @@ dilithium_signature_size(dilithium_parameter_e parameter) { switch (parameter) { case dilithium_L3: - return 3293; + return 3309; case dilithium_L5: - return 4595; + return 4627; default: RNP_LOG("invalid parameter given"); throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); diff --git a/src/lib/crypto/dilithium_common.h b/src/lib/crypto/dilithium_common.h index 40b9a961eb..e7e8378e10 100644 --- a/src/lib/crypto/dilithium_common.h +++ b/src/lib/crypto/dilithium_common.h @@ -29,7 +29,7 @@ #include "dilithium.h" -size_t dilithium_privkey_size(dilithium_parameter_e parameter); +size_t dilithium_privkey_size(); size_t dilithium_pubkey_size(dilithium_parameter_e parameter); size_t dilithium_signature_size(dilithium_parameter_e parameter); diff --git a/src/lib/crypto/dilithium_exdsa_composite.cpp b/src/lib/crypto/dilithium_exdsa_composite.cpp index 8de71c0067..47e646b542 100644 --- a/src/lib/crypto/dilithium_exdsa_composite.cpp +++ b/src/lib/crypto/dilithium_exdsa_composite.cpp @@ -74,9 +74,8 @@ pgp_dilithium_exdsa_composite_key_t::exdsa_curve_privkey_size(pgp_curve_t curve) switch (curve) { case PGP_CURVE_ED25519: return 32; - /* TODO */ - // case PGP_CURVE_ED448: - // return 56; + case PGP_CURVE_ED448: + return 57; case PGP_CURVE_NIST_P_256: return 32; case PGP_CURVE_NIST_P_384: @@ -97,9 +96,8 @@ pgp_dilithium_exdsa_composite_key_t::exdsa_curve_pubkey_size(pgp_curve_t curve) switch (curve) { case PGP_CURVE_ED25519: return 32; - /* TODO */ - // case PGP_CURVE_ED448: - // return 56; + case PGP_CURVE_ED448: + return 57; case PGP_CURVE_NIST_P_256: return 65; case PGP_CURVE_NIST_P_384: @@ -120,9 +118,8 @@ pgp_dilithium_exdsa_composite_key_t::exdsa_curve_signature_size(pgp_curve_t curv switch (curve) { case PGP_CURVE_ED25519: return 64; - /* TODO */ - // case PGP_CURVE_ED448: - // return 114; + case PGP_CURVE_ED448: + return 114; case PGP_CURVE_NIST_P_256: return 64; case PGP_CURVE_NIST_P_384: @@ -150,6 +147,8 @@ pgp_dilithium_exdsa_composite_key_t::pk_alg_to_dilithium_id(pgp_pubkey_alg_t pk_ case PGP_PKA_DILITHIUM5_BP384: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: return dilithium_L5; default: RNP_LOG("invalid PK alg given"); @@ -171,8 +170,8 @@ pgp_dilithium_exdsa_composite_key_t::pk_alg_to_curve_id(pgp_pubkey_alg_t pk_alg) return PGP_CURVE_BP384; case PGP_PKA_DILITHIUM5_P384: return PGP_CURVE_NIST_P_384; - /*case PGP_PKA_DILITHIUM5_ED448: - throw rnp::rnp_exception(RNP_ERROR_NOT_IMPLEMENTED);*/ + case PGP_PKA_DILITHIUM5_ED448: + return PGP_CURVE_ED448; default: RNP_LOG("invalid PK alg given"); throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); @@ -257,8 +256,7 @@ pgp_dilithium_exdsa_composite_private_key_t::pgp_dilithium_exdsa_composite_priva : pk_alg_(pk_alg) { if (exdsa_curve_privkey_size(pk_alg_to_curve_id(pk_alg)) != exdsa_key_encoded.size() || - dilithium_privkey_size(pk_alg_to_dilithium_id(pk_alg)) != - dilithium_key_encoded.size()) { + dilithium_privkey_size() != dilithium_key_encoded.size()) { RNP_LOG("exdsa or mldsa key length mismatch"); throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); } @@ -273,9 +271,8 @@ pgp_dilithium_exdsa_composite_private_key_t::pgp_dilithium_exdsa_composite_priva size_t pgp_dilithium_exdsa_composite_private_key_t::encoded_size(pgp_pubkey_alg_t pk_alg) { - dilithium_parameter_e dilithium_param = pk_alg_to_dilithium_id(pk_alg); - pgp_curve_t curve = pk_alg_to_curve_id(pk_alg); - return exdsa_curve_privkey_size(curve) + dilithium_privkey_size(dilithium_param); + pgp_curve_t curve = pk_alg_to_curve_id(pk_alg); + return exdsa_curve_privkey_size(curve) + dilithium_privkey_size(); } void diff --git a/src/lib/crypto/ec.cpp b/src/lib/crypto/ec.cpp index 77f90ebf6f..d6e5c6891a 100644 --- a/src/lib/crypto/ec.cpp +++ b/src/lib/crypto/ec.cpp @@ -32,9 +32,9 @@ #include "utils.h" #include "mem.h" #include "botan_utils.hpp" -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) -#include "x25519.h" -#include "ed25519.h" +#if defined(ENABLE_CRYPTO_REFRESH) +#include "x25519_x448.h" +#include "ed25519_ed448.h" #include "botan_utils.hpp" #include "botan/bigint.h" #include "botan/ecdh.h" @@ -160,7 +160,7 @@ Key::generate(rnp::RNG &rng, const pgp_pubkey_alg_t alg_id, const pgp_curve_t cu } // namespace ec } // namespace pgp -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) static bool is_generic_prime_curve(pgp_curve_t curve) { @@ -188,8 +188,7 @@ static rnp_result_t ec_generate_generic_native(rnp::RNG * rng, std::vector &privkey, std::vector &pubkey, - pgp_curve_t curve, - pgp_pubkey_alg_t alg) + pgp_curve_t curve) { if (!is_generic_prime_curve(curve)) { RNP_LOG("expected generic prime curve"); @@ -199,21 +198,15 @@ ec_generate_generic_native(rnp::RNG * rng, auto ec_desc = pgp::ec::Curve::get(curve); const size_t curve_order = ec_desc->bytes(); - Botan::ECDH_PrivateKey privkey_botan(*(rng->obj()), Botan::EC_Group(ec_desc->botan_name)); - Botan::BigInt pub_x = privkey_botan.public_point().get_affine_x(); - Botan::BigInt pub_y = privkey_botan.public_point().get_affine_y(); - Botan::BigInt x = privkey_botan.private_value(); + Botan::ECDH_PrivateKey privkey_botan(*(rng->obj()), + Botan::EC_Group::from_name(ec_desc->botan_name)); // pubkey: 0x04 || X || Y - pubkey = Botan::unlock(Botan::BigInt::encode_fixed_length_int_pair( - pub_x, pub_y, curve_order)); // zero-pads to the given size + pubkey = Botan::unlock(privkey_botan.public_point().xy_bytes()); pubkey.insert(pubkey.begin(), 0x04); privkey = std::vector(curve_order); - x.binary_encode(privkey.data(), privkey.size()); // zero-pads to the given size - - assert(pubkey.size() == 2 * curve_order + 1); - assert(privkey.size() == curve_order); + privkey_botan.private_value().serialize_to(privkey); // zero-pads to the given size return RNP_SUCCESS; } @@ -222,22 +215,20 @@ rnp_result_t ec_generate_native(rnp::RNG * rng, std::vector &privkey, std::vector &pubkey, - pgp_curve_t curve, - pgp_pubkey_alg_t alg) + pgp_curve_t curve) { - if (curve == PGP_CURVE_25519) { + switch (curve) { + case PGP_CURVE_25519: return generate_x25519_native(rng, privkey, pubkey); - } else if (curve == PGP_CURVE_ED25519) { + case PGP_CURVE_ED25519: return generate_ed25519_native(rng, privkey, pubkey); - } else if (is_generic_prime_curve(curve)) { - if (alg != PGP_PKA_ECDH && alg != PGP_PKA_ECDSA) { - RNP_LOG("alg and curve mismatch"); - return RNP_ERROR_BAD_PARAMETERS; - } - return ec_generate_generic_native(rng, privkey, pubkey, curve, alg); - } else { - RNP_LOG("invalid curve"); - return RNP_ERROR_BAD_PARAMETERS; + case PGP_CURVE_448: + return generate_x448_native(rng, privkey, pubkey); + case PGP_CURVE_ED448: + return generate_ed448_native(rng, privkey, pubkey); + default: + break; } + return ec_generate_generic_native(rng, privkey, pubkey, curve); } #endif diff --git a/src/lib/crypto/ec.h b/src/lib/crypto/ec.h index c30c31339c..7a272b02d9 100644 --- a/src/lib/crypto/ec.h +++ b/src/lib/crypto/ec.h @@ -179,7 +179,7 @@ bool x25519_tweak_bits(pgp::ec::Key &key); */ bool x25519_bits_tweaked(const pgp::ec::Key &key); -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) typedef struct pgp_ed25519_key_t { std::vector pub; // \ native encoding std::vector priv; // / @@ -201,6 +201,9 @@ typedef struct pgp_ed25519_signature_t { std::vector sig; // native encoding } pgp_ed25519_signature_t; +typedef pgp_ed25519_key_t pgp_ed448_key_t; +typedef pgp_ed25519_signature_t pgp_ed448_signature_t; + typedef struct pgp_x25519_key_t { std::vector pub; // \ native encoding std::vector priv; // / @@ -218,11 +221,15 @@ typedef struct pgp_x25519_key_t { } } pgp_x25519_key_t; +typedef pgp_x25519_key_t pgp_x448_key_t; + typedef struct pgp_x25519_encrypted_t { std::vector eph_key; std::vector enc_sess_key; } pgp_x25519_encrypted_t; +typedef pgp_x25519_encrypted_t pgp_x448_encrypted_t; + /* * @brief Generates EC keys in "native" or SEC1-encoded uncompressed format * @@ -230,15 +237,13 @@ typedef struct pgp_x25519_encrypted_t { * @param privkey private key to be generated * @param pubkey public key to be generated * @param curve chosen curve - * @param alg algorithm id * * @returns RNP_ERROR_BAD_PARAMETERS if the curve or alg parameter is invalid. */ rnp_result_t ec_generate_native(rnp::RNG * rng, std::vector &privkey, std::vector &pubkey, - pgp_curve_t curve, - pgp_pubkey_alg_t alg); + pgp_curve_t curve); #endif #endif diff --git a/src/lib/crypto/ec_curves.cpp b/src/lib/crypto/ec_curves.cpp index 379a6f9389..7cd9f5f319 100644 --- a/src/lib/crypto/ec_curves.cpp +++ b/src/lib/crypto/ec_curves.cpp @@ -255,6 +255,43 @@ static const Curve ec_curves[] = { "0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7", "0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0", }, +#if defined(ENABLE_CRYPTO_REFRESH) + {PGP_CURVE_ED448, + 255, + {0x2B, 0x65, 0x71}, + "Ed448", + "Ed448", + true, + "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + "FFFFFFFFFFFFFFFFFFFFFFFF", + "0x01", + "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + "FFFFFFFFFFFFFFFFFFFF6756", + "0x3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CCA23E9C44EDB49AED63690216CC272" + "8DC58F552378C292AB5844F3", + "0x4F1970C66BED0DED221D15A622BF36DA9E146570470F1767EA6DE324A3D3A46412AE1AF72AB66511433B80E1" + "8B00938E2626A82BC70CC05E", + "0x693F46716EB6BC248876203756C9C7624BEA73736CA3984087789C1E05A0C2D73AD3FF1CE67C39C4FDBD132C" + "4ED7C8AD9808795BF230FA14", + "0x08"}, + {PGP_CURVE_448, + 448, + {0x2B, 0x65, 0x6F}, + "curve25519", + "Curve25519", + true, + "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + "FFFFFFFFFFFFFFFFFFFFFFFF", + "0x98A9", + "0x01", + "0x3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CCA23E9C44EDB49AED63690216CC272" + "8DC58F552378C292AB5844F3", + "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000005", + "0x7D235D1295F5B1F66C98AB6E58326FCECBAE5D34F55545D060F75DC28DF3F6EDB8027E2346430D211312C4B1" + "50677AF76FD7223D457B5B1A", + "0x04"}, +#endif }; pgp_curve_t diff --git a/src/lib/crypto/ecdh.cpp b/src/lib/crypto/ecdh.cpp index 64988e73bb..dba753d1c8 100644 --- a/src/lib/crypto/ecdh.cpp +++ b/src/lib/crypto/ecdh.cpp @@ -314,48 +314,3 @@ decrypt_pkcs5(rnp::secure_bytes &out, const Encrypted &in, const ec::Key &key) } // namespace ecdh } // namespace pgp - -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) -rnp_result_t -ecdh_kem_gen_keypair_native(rnp::RNG * rng, - std::vector &privkey, - std::vector &pubkey, - pgp_curve_t curve) -{ - return ec_generate_native(rng, privkey, pubkey, curve, PGP_PKA_ECDH); -} - -rnp_result_t -exdsa_gen_keypair_native(rnp::RNG * rng, - std::vector &privkey, - std::vector &pubkey, - pgp_curve_t curve) -{ - pgp_pubkey_alg_t alg; - switch (curve) { - case PGP_CURVE_ED25519: - alg = PGP_PKA_EDDSA; - break; - case PGP_CURVE_NIST_P_256: - FALLTHROUGH_STATEMENT; - case PGP_CURVE_NIST_P_384: - FALLTHROUGH_STATEMENT; - case PGP_CURVE_NIST_P_521: - FALLTHROUGH_STATEMENT; - case PGP_CURVE_BP256: - FALLTHROUGH_STATEMENT; - case PGP_CURVE_BP384: - FALLTHROUGH_STATEMENT; - case PGP_CURVE_BP512: - FALLTHROUGH_STATEMENT; - case PGP_CURVE_P256K1: - alg = PGP_PKA_ECDSA; - break; - default: - RNP_LOG("invalid curve for ECDSA/EDDSA"); - return RNP_ERROR_BAD_PARAMETERS; - } - return ec_generate_native(rng, privkey, pubkey, curve, alg); -} - -#endif diff --git a/src/lib/crypto/ecdh.h b/src/lib/crypto/ecdh.h index 032b8059f9..85409831a1 100644 --- a/src/lib/crypto/ecdh.h +++ b/src/lib/crypto/ecdh.h @@ -106,41 +106,4 @@ rnp_result_t decrypt_pkcs5(rnp::secure_bytes &out, const Encrypted &in, const ec } // namespace ecdh } // namespace pgp -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) -/* Generate an ECDH key pair in "native" format, i.e., - * no changes to the format specified in the respective standard - * are applied (uncompressed SEC1 and RFC 7748). - * - * @param rng initialized rnp::RNG object - * @param privkey [out] the generated private key - * @param pubkey [out] the generated public key - * @param curve the curve for which a key pair is generated - * - * @return RNP_SUCCESS on success and output parameters are populated - * @return RNP_ERROR_BAD_PARAMETERS unexpected input provided - */ -rnp_result_t ecdh_kem_gen_keypair_native(rnp::RNG * rng, - std::vector &privkey, - std::vector &pubkey, - pgp_curve_t curve); - -/* Generate an ECDSA or EdDSA key pair in "native" format, i.e., - * no changes to the format specified in the respective standard - * are applied (uncompressed SEC1 and RFC 7748). - * - * @param rng initialized rnp::RNG object - * @param privkey [out] the generated private key - * @param pubkey [out] the generated public key - * @param curve the curve for which a key pair is generated - * - * @return RNP_SUCCESS on success and output parameters are populated - * @return RNP_ERROR_BAD_PARAMETERS unexpected input provided - */ -rnp_result_t exdsa_gen_keypair_native(rnp::RNG * rng, - std::vector &privkey, - std::vector &pubkey, - pgp_curve_t curve); - -#endif - #endif // ECDH_H_ diff --git a/src/lib/crypto/ed25519.cpp b/src/lib/crypto/ed25519_ed448.cpp similarity index 62% rename from src/lib/crypto/ed25519.cpp rename to src/lib/crypto/ed25519_ed448.cpp index 240d84819c..1e8b121eff 100644 --- a/src/lib/crypto/ed25519.cpp +++ b/src/lib/crypto/ed25519_ed448.cpp @@ -24,12 +24,13 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "ed25519.h" +#include "ed25519_ed448.h" #include "logging.h" #include "utils.h" #include #include +#include #include rnp_result_t @@ -93,3 +94,63 @@ ed25519_validate_key_native(rnp::RNG *rng, const pgp_ed25519_key_t *key, bool se return RNP_SUCCESS; } + +rnp_result_t +generate_ed448_native(rnp::RNG * rng, + std::vector &privkey, + std::vector &pubkey) +{ + Botan::Ed448_PrivateKey private_key(*(rng->obj())); + const size_t key_len = 57; + auto priv = Botan::unlock(private_key.raw_private_key_bits()); + assert(priv.size() == key_len); + auto pub = private_key.public_key_bits(); + assert(pub.size() == key_len); + privkey = std::vector(priv.begin(), priv.begin() + key_len); + pubkey = std::vector(pub.begin(), pub.begin() + key_len); + return RNP_SUCCESS; +} + +rnp_result_t +ed448_sign_native(rnp::RNG * rng, + std::vector & sig_out, + const std::vector &key, + const uint8_t * hash, + size_t hash_len) +{ + Botan::Ed448_PrivateKey priv_key(Botan::secure_vector(key.begin(), key.end())); + auto signer = Botan::PK_Signer(priv_key, *(rng->obj()), "Pure"); + sig_out = signer.sign_message(hash, hash_len, *(rng->obj())); + return RNP_SUCCESS; +} + +rnp_result_t +ed448_verify_native(const std::vector &sig, + const std::vector &key, + const uint8_t * hash, + size_t hash_len) +{ + Botan::Ed448_PublicKey pub_key(key); + auto verifier = Botan::PK_Verifier(pub_key, "Pure"); + if (verifier.verify_message(hash, hash_len, sig.data(), sig.size())) { + return RNP_SUCCESS; + } + return RNP_ERROR_VERIFICATION_FAILED; +} + +rnp_result_t +ed448_validate_key_native(rnp::RNG *rng, const pgp_ed448_key_t *key, bool secret) +{ + Botan::Ed448_PublicKey pub_key(key->pub); + if (!pub_key.check_key(*(rng->obj()), false)) { + return RNP_ERROR_BAD_PARAMETERS; + } + if (secret) { + Botan::Ed448_PrivateKey priv_key( + Botan::secure_vector(key->priv.begin(), key->priv.end())); + if (!priv_key.check_key(*(rng->obj()), false)) { + return RNP_ERROR_SIGNING_FAILED; + } + } + return RNP_SUCCESS; +} \ No newline at end of file diff --git a/src/lib/crypto/ed25519.h b/src/lib/crypto/ed25519_ed448.h similarity index 73% rename from src/lib/crypto/ed25519.h rename to src/lib/crypto/ed25519_ed448.h index 5ab109d07a..ada0de2c9d 100644 --- a/src/lib/crypto/ed25519.h +++ b/src/lib/crypto/ed25519_ed448.h @@ -34,7 +34,7 @@ #include "crypto/rng.h" #include "crypto/ec.h" -/* implements ED25519 with native format (V6 and PQC) */ +/* implements Ed25519 and Ed448 with native format (V6 and PQC) */ rnp_result_t generate_ed25519_native(rnp::RNG * rng, std::vector &privkey, @@ -55,4 +55,17 @@ rnp_result_t ed25519_validate_key_native(rnp::RNG * rng, const pgp_ed25519_key_t *key, bool secret); +rnp_result_t generate_ed448_native(rnp::RNG * rng, + std::vector &privkey, + std::vector &pubkey); +rnp_result_t ed448_sign_native(rnp::RNG * rng, + std::vector & sig_out, + const std::vector &key, + const uint8_t * hash, + size_t hash_len); +rnp_result_t ed448_verify_native(const std::vector &sig, + const std::vector &key, + const uint8_t * hash, + size_t hash_len); +rnp_result_t ed448_validate_key_native(rnp::RNG *rng, const pgp_ed448_key_t *key, bool secret); #endif diff --git a/src/lib/crypto/exdsa_ecdhkem.cpp b/src/lib/crypto/exdsa_ecdhkem.cpp index a4895f91e8..59496c89f5 100644 --- a/src/lib/crypto/exdsa_ecdhkem.cpp +++ b/src/lib/crypto/exdsa_ecdhkem.cpp @@ -26,7 +26,7 @@ #include "exdsa_ecdhkem.h" #include "ecdh.h" -#include "ed25519.h" +#include "ed25519_ed448.h" #include "ecdsa.h" #include "ec.h" #include "types.h" @@ -71,7 +71,7 @@ ecdh_kem_private_key_t::botan_key_ecdh(rnp::RNG *rng) const assert(curve_ >= PGP_CURVE_NIST_P_256 && curve_ <= PGP_CURVE_P256K1); auto ec_desc = pgp::ec::Curve::get(curve_); return Botan::ECDH_PrivateKey( - *(rng->obj()), Botan::EC_Group(ec_desc->botan_name), Botan::BigInt(key_)); + *(rng->obj()), Botan::EC_Group::from_name(ec_desc->botan_name), Botan::BigInt(key_)); } Botan::ECDH_PublicKey @@ -80,37 +80,55 @@ ecdh_kem_public_key_t::botan_key_ecdh(rnp::RNG *rng) const assert(curve_ >= PGP_CURVE_NIST_P_256 && curve_ <= PGP_CURVE_P256K1); auto ec_desc = pgp::ec::Curve::get(curve_); - Botan::EC_Group group(ec_desc->botan_name); - const size_t curve_order = ec_desc->bytes(); - Botan::BigInt x(key_.data() + 1, curve_order); - Botan::BigInt y(key_.data() + 1 + curve_order, curve_order); - return Botan::ECDH_PublicKey(group, group.point(x, y)); + Botan::EC_Group group = Botan::EC_Group::from_name(ec_desc->botan_name); + return Botan::ECDH_PublicKey(group, Botan::EC_AffinePoint(group, key_).to_legacy_point()); } -Botan::Curve25519_PrivateKey +Botan::X25519_PrivateKey ecdh_kem_private_key_t::botan_key_x25519() const { assert(curve_ == PGP_CURVE_25519); - return Botan::Curve25519_PrivateKey(key_); + return Botan::X25519_PrivateKey(key_); } -Botan::Curve25519_PublicKey +Botan::X25519_PublicKey ecdh_kem_public_key_t::botan_key_x25519() const { assert(curve_ == PGP_CURVE_25519); - return Botan::Curve25519_PublicKey(key_); + return Botan::X25519_PublicKey(key_); } std::vector ecdh_kem_private_key_t::get_pubkey_encoded(rnp::RNG *rng) const { - if (curve_ == PGP_CURVE_25519) { + switch (curve_) { + case PGP_CURVE_25519: { Botan::X25519_PrivateKey botan_key = botan_key_x25519(); return botan_key.public_value(); - } else { + } + case PGP_CURVE_448: { + Botan::X448_PrivateKey botan_key = botan_key_x448(); + return botan_key.public_value(); + } + default: { Botan::ECDH_PrivateKey botan_key = botan_key_ecdh(rng); return botan_key.public_value(); } + } +} + +Botan::X448_PrivateKey +ecdh_kem_private_key_t::botan_key_x448() const +{ + assert(curve_ == PGP_CURVE_448); + return Botan::X448_PrivateKey(key_); +} + +Botan::X448_PublicKey +ecdh_kem_public_key_t::botan_key_x448() const +{ + assert(curve_ == PGP_CURVE_448); + return Botan::X448_PublicKey(key_); } rnp_result_t @@ -118,23 +136,35 @@ ecdh_kem_public_key_t::encapsulate(rnp::RNG * rng, std::vector &ciphertext, std::vector &symmetric_key) const { - if (curve_ == PGP_CURVE_25519) { - Botan::Curve25519_PrivateKey eph_prv_key(*(rng->obj())); + switch (curve_) { + case PGP_CURVE_25519: { + Botan::X25519_PrivateKey eph_prv_key(*(rng->obj())); + ciphertext = eph_prv_key.public_value(); + Botan::PK_Key_Agreement key_agreement(eph_prv_key, *(rng->obj()), "Raw"); + symmetric_key = Botan::unlock(key_agreement.derive_key(0, key_).bits_of()); + break; + } + case PGP_CURVE_448: { + Botan::X448_PrivateKey eph_prv_key(*(rng->obj())); ciphertext = eph_prv_key.public_value(); Botan::PK_Key_Agreement key_agreement(eph_prv_key, *(rng->obj()), "Raw"); symmetric_key = Botan::unlock(key_agreement.derive_key(0, key_).bits_of()); - } else { + break; + } + default: { auto curve_desc = pgp::ec::Curve::get(curve_); if (!curve_desc) { RNP_LOG("unknown curve"); return RNP_ERROR_NOT_SUPPORTED; } - Botan::EC_Group domain(curve_desc->botan_name); + Botan::EC_Group domain = Botan::EC_Group::from_name(curve_desc->botan_name); Botan::ECDH_PrivateKey eph_prv_key(*(rng->obj()), domain); Botan::PK_Key_Agreement key_agreement(eph_prv_key, *(rng->obj()), "Raw"); ciphertext = eph_prv_key.public_value(); symmetric_key = Botan::unlock(key_agreement.derive_key(0, key_).bits_of()); + break; + } } return RNP_SUCCESS; } @@ -144,14 +174,25 @@ ecdh_kem_private_key_t::decapsulate(rnp::RNG * rng, const std::vector &ciphertext, std::vector & plaintext) { - if (curve_ == PGP_CURVE_25519) { - Botan::Curve25519_PrivateKey priv_key = botan_key_x25519(); - Botan::PK_Key_Agreement key_agreement(priv_key, *(rng->obj()), "Raw"); + switch (curve_) { + case PGP_CURVE_25519: { + Botan::X25519_PrivateKey priv_key = botan_key_x25519(); + Botan::PK_Key_Agreement key_agreement(priv_key, *(rng->obj()), "Raw"); plaintext = Botan::unlock(key_agreement.derive_key(0, ciphertext).bits_of()); - } else { + break; + } + case PGP_CURVE_448: { + Botan::X448_PrivateKey priv_key = botan_key_x448(); + Botan::PK_Key_Agreement key_agreement(priv_key, *(rng->obj()), "Raw"); + plaintext = Botan::unlock(key_agreement.derive_key(0, ciphertext).bits_of()); + break; + } + default: { Botan::ECDH_PrivateKey priv_key = botan_key_ecdh(rng); Botan::PK_Key_Agreement key_agreement(priv_key, *(rng->obj()), "Raw"); plaintext = Botan::unlock(key_agreement.derive_key(0, ciphertext).bits_of()); + break; + } } return RNP_SUCCESS; } @@ -160,7 +201,7 @@ rnp_result_t ec_key_t::generate_ecdh_kem_key_pair(rnp::RNG *rng, ecdh_kem_key_t *out, pgp_curve_t curve) { std::vector pub, priv; - rnp_result_t result = ecdh_kem_gen_keypair_native(rng, priv, pub, curve); + rnp_result_t result = ec_generate_native(rng, priv, pub, curve); if (result != RNP_SUCCESS) { RNP_LOG("error when generating EC key pair"); return result; @@ -196,7 +237,7 @@ rnp_result_t ec_key_t::generate_exdsa_key_pair(rnp::RNG *rng, exdsa_key_t *out, pgp_curve_t curve) { std::vector pub, priv; - rnp_result_t result = exdsa_gen_keypair_native(rng, priv, pub, curve); + rnp_result_t result = ec_generate_native(rng, priv, pub, curve); if (result != RNP_SUCCESS) { RNP_LOG("error when generating EC key pair"); return result; @@ -213,7 +254,7 @@ exdsa_private_key_t::botan_key(rnp::RNG *rng) const { auto ec_desc = pgp::ec::Curve::get(curve_); Botan::ECDSA_PrivateKey priv_key( - *(rng->obj()), Botan::EC_Group(ec_desc->botan_name), Botan::BigInt(key_)); + *(rng->obj()), Botan::EC_Group::from_name(ec_desc->botan_name), Botan::BigInt(key_)); return priv_key; } @@ -222,14 +263,11 @@ exdsa_public_key_t::botan_key() const { // format: 04 | X | Y auto ec_desc = pgp::ec::Curve::get(curve_); - Botan::EC_Group group(ec_desc->botan_name); - const size_t curve_order = ec_desc->bytes(); - Botan::BigInt x(key_.data() + 1, curve_order); - Botan::BigInt y(key_.data() + 1 + curve_order, curve_order); - return Botan::ECDSA_PublicKey(group, group.point(x, y)); + Botan::EC_Group group = Botan::EC_Group::from_name(ec_desc->botan_name); + return Botan::ECDSA_PublicKey(group, Botan::EC_AffinePoint(group, key_).to_legacy_point()); } -/* NOTE hash_alg unused for ed25519/x25519 curves */ +/* NOTE hash_alg unused for Ed/X curves */ rnp_result_t exdsa_private_key_t::sign(rnp::RNG * rng, std::vector &sig_out, @@ -237,15 +275,21 @@ exdsa_private_key_t::sign(rnp::RNG * rng, size_t hash_len, pgp_hash_alg_t hash_alg) const { - if (curve_ == PGP_CURVE_ED25519) { + switch (curve_) { + case PGP_CURVE_ED25519: { return ed25519_sign_native(rng, sig_out, Botan::unlock(key_), hash, hash_len); - } else { + } + case PGP_CURVE_ED448: { + return ed448_sign_native(rng, sig_out, Botan::unlock(key_), hash, hash_len); + } + default: { Botan::ECDSA_PrivateKey priv_key = botan_key(rng); auto signer = Botan::PK_Signer(priv_key, *(rng->obj()), pgp::ecdsa::padding_str_for(hash_alg)); sig_out = signer.sign_message(hash, hash_len, *(rng->obj())); + return RNP_SUCCESS; + } } - return RNP_SUCCESS; } rnp_result_t @@ -254,62 +298,96 @@ exdsa_public_key_t::verify(const std::vector &sig, size_t hash_len, pgp_hash_alg_t hash_alg) const { - if (curve_ == PGP_CURVE_ED25519) { + switch (curve_) { + case PGP_CURVE_ED25519: { return ed25519_verify_native(sig, key_, hash, hash_len); - } else { + } + case PGP_CURVE_ED448: { + return ed448_verify_native(sig, key_, hash, hash_len); + } + default: { Botan::ECDSA_PublicKey pub_key = botan_key(); auto verifier = Botan::PK_Verifier(pub_key, pgp::ecdsa::padding_str_for(hash_alg)); if (verifier.verify_message(hash, hash_len, sig.data(), sig.size())) { return RNP_SUCCESS; } } + } return RNP_ERROR_VERIFICATION_FAILED; } bool exdsa_public_key_t::is_valid(rnp::RNG *rng) const { - if (curve_ == PGP_CURVE_ED25519) { + switch (curve_) { + case PGP_CURVE_ED25519: { Botan::Ed25519_PublicKey pub_key(key_); return pub_key.check_key(*(rng->obj()), false); - } else { + } + case PGP_CURVE_ED448: { + Botan::Ed448_PublicKey pub_key(key_); + return pub_key.check_key(*(rng->obj()), false); + } + default: { Botan::ECDSA_PublicKey pub_key = botan_key(); return pub_key.check_key(*(rng->obj()), false); } + } } bool exdsa_private_key_t::is_valid(rnp::RNG *rng) const { - if (curve_ == PGP_CURVE_ED25519) { + switch (curve_) { + case PGP_CURVE_ED25519: { Botan::Ed25519_PrivateKey priv_key(key_); return priv_key.check_key(*(rng->obj()), false); - } else { + } + case PGP_CURVE_ED448: { + Botan::Ed448_PrivateKey priv_key(key_); + return priv_key.check_key(*(rng->obj()), false); + } + default: { auto priv_key = botan_key(rng); return priv_key.check_key(*(rng->obj()), false); } + } } bool ecdh_kem_public_key_t::is_valid(rnp::RNG *rng) const { - if (curve_ == PGP_CURVE_25519) { + switch (curve_) { + case PGP_CURVE_25519: { auto pub_key = botan_key_x25519(); return pub_key.check_key(*(rng->obj()), false); - } else { + } + case PGP_CURVE_448: { + auto pub_key = botan_key_x448(); + return pub_key.check_key(*(rng->obj()), false); + } + default: { auto pub_key = botan_key_ecdh(rng); return pub_key.check_key(*(rng->obj()), false); } + } } bool ecdh_kem_private_key_t::is_valid(rnp::RNG *rng) const { - if (curve_ == PGP_CURVE_25519) { + switch (curve_) { + case PGP_CURVE_25519: { auto priv_key = botan_key_x25519(); return priv_key.check_key(*(rng->obj()), false); - } else { + } + case PGP_CURVE_448: { + auto priv_key = botan_key_x448(); + return priv_key.check_key(*(rng->obj()), false); + } + default: { auto priv_key = botan_key_ecdh(rng); return priv_key.check_key(*(rng->obj()), false); } + } } diff --git a/src/lib/crypto/exdsa_ecdhkem.h b/src/lib/crypto/exdsa_ecdhkem.h index 6fe2ab0283..e5f3862148 100644 --- a/src/lib/crypto/exdsa_ecdhkem.h +++ b/src/lib/crypto/exdsa_ecdhkem.h @@ -38,7 +38,9 @@ #include #include #include -#include +#include +#include +#include struct ecdh_kem_key_t; /* forward declaration */ struct exdsa_key_t; /* forward declaration */ @@ -91,8 +93,9 @@ class ecdh_kem_public_key_t : public ec_key_t { std::vector &symmetric_key) const; private: - Botan::ECDH_PublicKey botan_key_ecdh(rnp::RNG *rng) const; - Botan::Curve25519_PublicKey botan_key_x25519() const; + Botan::ECDH_PublicKey botan_key_ecdh(rnp::RNG *rng) const; + Botan::X25519_PublicKey botan_key_x25519() const; + Botan::X448_PublicKey botan_key_x448() const; std::vector key_; }; @@ -118,8 +121,9 @@ class ecdh_kem_private_key_t : public ec_key_t { std::vector & plaintext); private: - Botan::ECDH_PrivateKey botan_key_ecdh(rnp::RNG *rng) const; - Botan::Curve25519_PrivateKey botan_key_x25519() const; + Botan::ECDH_PrivateKey botan_key_ecdh(rnp::RNG *rng) const; + Botan::X25519_PrivateKey botan_key_x25519() const; + Botan::X448_PrivateKey botan_key_x448() const; Botan::secure_vector key_; }; diff --git a/src/lib/crypto/hash.hpp b/src/lib/crypto/hash.hpp index 8267da24d9..8cee8eb350 100644 --- a/src/lib/crypto/hash.hpp +++ b/src/lib/crypto/hash.hpp @@ -91,11 +91,20 @@ class CRC24 { class HashList { public: - std::vector> hashes; + void add(const void *buf, size_t len); + std::vector hash_algs() const; + /* v3-v5 sigs */ void add_alg(pgp_hash_alg_t alg); const Hash *get(pgp_hash_alg_t alg) const; - void add(const void *buf, size_t len); + +#if defined(ENABLE_CRYPTO_REFRESH) + /* v6 sigs with salt */ + void add_alg(pgp_hash_alg_t alg, std::vector salt); + const Hash *get(pgp_hash_alg_t alg, std::vector salt) const; +#endif + + std::vector, std::vector>> hashes; }; } // namespace rnp diff --git a/src/lib/crypto/hash_common.cpp b/src/lib/crypto/hash_common.cpp index f26e330259..7f1ef91ae5 100644 --- a/src/lib/crypto/hash_common.cpp +++ b/src/lib/crypto/hash_common.cpp @@ -37,6 +37,8 @@ #include "hash_ossl.hpp" #include "hash_crc24.hpp" #endif +#include +#include static const struct hash_alg_map_t { pgp_hash_alg_t type; @@ -190,7 +192,7 @@ void HashList::add_alg(pgp_hash_alg_t alg) { if (!get(alg)) { - hashes.emplace_back(rnp::Hash::create(alg)); + hashes.emplace_back(std::make_pair(rnp::Hash::create(alg), std::vector())); } } @@ -198,8 +200,8 @@ const Hash * HashList::get(pgp_hash_alg_t alg) const { for (auto &hash : hashes) { - if (hash->alg() == alg) { - return hash.get(); + if (hash.first->alg() == alg && hash.second.empty()) { + return hash.first.get(); } } return nullptr; @@ -209,8 +211,43 @@ void HashList::add(const void *buf, size_t len) { for (auto &hash : hashes) { - hash->add(buf, len); + hash.first->add(buf, len); } } +std::vector +HashList::hash_algs() const +{ + std::set algs; + for (auto &hash : hashes) { + algs.insert(hash.first->alg()); + } + + std::vector result; + std::copy(algs.begin(), algs.end(), std::back_inserter(result)); + return result; +} + +#if defined(ENABLE_CRYPTO_REFRESH) +void +HashList::add_alg(pgp_hash_alg_t alg, std::vector salt) +{ + if (!get(alg, salt)) { + hashes.emplace_back(std::make_pair(rnp::Hash::create(alg), salt)); + hashes.back().first->add(salt); // consume salt as first input + } +} + +const Hash * +HashList::get(pgp_hash_alg_t alg, std::vector salt) const +{ + for (auto &hash : hashes) { + if (hash.first->alg() == alg && hash.second == salt) { + return hash.first.get(); + } + } + return NULL; +} +#endif + } // namespace rnp diff --git a/src/lib/crypto/kmac_botan.cpp b/src/lib/crypto/kem_combiner.cpp similarity index 52% rename from src/lib/crypto/kmac_botan.cpp rename to src/lib/crypto/kem_combiner.cpp index ddee778e25..f3f1832d56 100644 --- a/src/lib/crypto/kmac_botan.cpp +++ b/src/lib/crypto/kem_combiner.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, [MTG AG](https://www.mtg.de). + * Copyright (c) 2024, [MTG AG](https://www.mtg.de). * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -23,61 +23,47 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -#include "kmac_botan.hpp" -#include "hash_botan.hpp" -#include "botan/mac.h" - +#include "config.h" +#include "kem_combiner.hpp" #if defined(ENABLE_PQC_DBG_LOG) #include "crypto/mem.h" #endif - namespace rnp { -KMAC256_Botan::KMAC256_Botan() : KMAC256() -{ -} - -std::unique_ptr -KMAC256_Botan::create() -{ - return std::unique_ptr(new KMAC256_Botan()); -} - -void -KMAC256_Botan::compute(const std::vector &ecc_key_share, - const std::vector &ecc_ciphertext, - const std::vector &kyber_key_share, - const std::vector &kyber_ciphertext, - const pgp_pubkey_alg_t alg_id, - std::vector & out) +std::vector +PqcKemCombiner::compute(const std::vector &mlkem_key_share, + const std::vector &ecc_key_share, + const std::vector &ecc_ciphertext, + const std::vector &ecc_pub_key, + const pgp_pubkey_alg_t alg_id) { - auto kmac = Botan::MessageAuthenticationCode::create_or_throw("KMAC-256(256)"); - - /* the mapping between the KEM Combiner and the MAC interface is: - * key <> domSeparation - * nonce <> customizationString - * message <> encData - */ - + std::vector out; #if defined(ENABLE_PQC_DBG_LOG) - RNP_LOG_U8VEC("KMAC256 domSeparation: %s", domSeparation()); - RNP_LOG_U8VEC("KMAC256 customizationString: %s", customizationString()); + RNP_LOG_NO_POS_INFO("Key Combiner Input: "); + RNP_LOG_U8VEC(" - mlkemKeyShare: %s", mlkem_key_share); + RNP_LOG_U8VEC(" - eccKeyShare: %s", ecc_key_share); + RNP_LOG_U8VEC(" - eccCipherText: %s", ecc_ciphertext); + RNP_LOG_U8VEC(" - eccPublicKey: %s", ecc_pub_key); + RNP_LOG_NO_POS_INFO(" - algID: %d", (uint8_t) alg_id); + RNP_LOG_NO_POS_INFO("Key Combiner Constants: "); + RNP_LOG_U8VEC(" - DomSep %s", domSeparation()); #endif - kmac->set_key(domSeparation()); - kmac->start(customizationString()); // set nonce - kmac->update( - encData(ecc_key_share, ecc_ciphertext, kyber_key_share, kyber_ciphertext, alg_id)); - out = kmac->final_stdvec(); + pgp_hash_alg_t hash_alg = PGP_HASH_SHA3_256; + auto hash = rnp::Hash::create(hash_alg); + hash->add(mlkem_key_share); + hash->add(ecc_key_share); + hash->add(ecc_ciphertext); + hash->add(ecc_pub_key); + hash->add(&alg_id, 1); + hash->add(domSeparation()); + out.resize(rnp::Hash::size(hash_alg)); + hash->finish(out.data()); #if defined(ENABLE_PQC_DBG_LOG) - RNP_LOG_U8VEC("KMAC256 Output: %s", out); + RNP_LOG_U8VEC("PQC KEM Combiner SHA-3 Output: %s", out); #endif -} -KMAC256_Botan::~KMAC256_Botan() -{ + return out; } - } // namespace rnp diff --git a/src/lib/crypto/kmac_botan.hpp b/src/lib/crypto/kem_combiner.hpp similarity index 50% rename from src/lib/crypto/kmac_botan.hpp rename to src/lib/crypto/kem_combiner.hpp index fb1711a805..752f43230a 100644 --- a/src/lib/crypto/kmac_botan.hpp +++ b/src/lib/crypto/kem_combiner.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, [MTG AG](https://www.mtg.de). + * Copyright (c) 2024, [MTG AG](https://www.mtg.de). * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -24,29 +24,41 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef CRYPTO_KMAC_BOTAN_HPP_ -#define CRYPTO_KMAC_BOTAN_HPP_ +#ifndef CRYPTO_KEM_COMBINER_H_ +#define CRYPTO_KEM_COMBINER_H_ -#include "kmac.hpp" +#include +#include "types.h" +#include "config.h" namespace rnp { +class PqcKemCombiner { + /* KDF for PQC key combiner according to + * https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-pqc */ -class KMAC256_Botan : public KMAC256 { private: - public: - KMAC256_Botan(); - KMAC256_Botan(const KMAC256_Botan &src); - - virtual ~KMAC256_Botan(); + /* The value domSep is a constant set to the UTF-8 encoding of the + string "OpenPGPCompositeKDFv1", i.e. + domSep := 4F 70 65 6E 50 47 50 43 6F 6D 70 6F 73 69 74 65 4B 44 46 76 31 + len(domSep) = 0x15 - static std::unique_ptr create(); + We also concatenate len(domSep) here + */ + static std::vector + domSeparation() + { + return std::vector({0x4F, 0x70, 0x65, 0x6E, 0x50, 0x47, 0x50, 0x43, + 0x6F, 0x6D, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x65, + 0x4B, 0x44, 0x46, 0x76, 0x31, 0x15}); + } - void compute(const std::vector &ecc_key_share, - const std::vector &ecc_ciphertext, - const std::vector &kyber_key_share, - const std::vector &kyber_ciphertext, - const pgp_pubkey_alg_t alg_id, - std::vector & out) override; + public: + /* PQC KEM Combiner interface for OpenPGP PQC composite algorithms */ + static std::vector compute(const std::vector &mlkem_key_share, + const std::vector &ecc_key_share, + const std::vector &ecc_ciphertext, + const std::vector &ecc_pub_key, + const pgp_pubkey_alg_t alg_id); }; } // namespace rnp diff --git a/src/lib/crypto/kmac.cpp b/src/lib/crypto/kmac.cpp deleted file mode 100644 index 207e5981a5..0000000000 --- a/src/lib/crypto/kmac.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2023, [MTG AG](https://www.mtg.de). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "kmac.hpp" - -#if defined(ENABLE_PQC_DBG_LOG) -#include "crypto/mem.h" -#endif - -#if defined(CRYPTO_BACKEND_BOTAN) -#include "kmac_botan.hpp" -#endif -#if defined(CRYPTO_BACKEND_OPENSSL) -#error KMAC256 not implemented for OpenSSL Backend -#endif - -namespace rnp { -std::unique_ptr -KMAC256::create() -{ -#if defined(CRYPTO_BACKEND_OPENSSL) -#error KMAC256 not implemented for OpenSSL - // return Hash_OpenSSL::create(); -#elif defined(CRYPTO_BACKEND_BOTAN) - return KMAC256_Botan::create(); -#else -#error "Crypto backend not specified" -#endif -} - -std::vector -KMAC256::domSeparation() const -{ - return domSeparation_; -} - -std::vector -KMAC256::customizationString() const -{ - return customizationString_; -} - -std::vector -KMAC256::counter() const -{ - return counter_; -} - -/* - // Input: - // algID - the algorithm ID encoded as octet - - fixedInfo = algID -*/ -std::vector -KMAC256::fixedInfo(pgp_pubkey_alg_t alg_id) -{ - std::vector result; - result.push_back(static_cast(alg_id)); - return result; -} - -std::vector -KMAC256::encData(const std::vector &ecc_key_share, - const std::vector &ecc_ciphertext, - const std::vector &kyber_key_share, - const std::vector &kyber_ciphertext, - pgp_pubkey_alg_t alg_id) -{ - std::vector enc_data; - std::vector counter_vec = counter(); - std::vector fixedInfo_vec = fixedInfo(alg_id); - - /* draft-wussler-openpgp-pqc-02: - - eccKemData = eccKeyShare || eccCipherText - kyberKemData = kyberKeyShare || kyberCipherText - encData = counter || eccKemData || kyberKemData || fixedInfo - */ -#if defined(ENABLE_PQC_DBG_LOG) - RNP_LOG_NO_POS_INFO("KMAC256 encData: "); - RNP_LOG_U8VEC(" - counter: %s", counter_vec); - RNP_LOG_U8VEC(" - eccKeyShare: %s", ecc_key_share); - RNP_LOG_U8VEC(" - eccCipherText: %s", ecc_ciphertext); - RNP_LOG_U8VEC(" - kyberKeyShare: %s", kyber_key_share); - RNP_LOG_U8VEC(" - kyberCipherText: %s", kyber_ciphertext); - RNP_LOG_U8VEC(" - fixedInfo: %s", fixedInfo_vec); -#endif - - enc_data.insert(enc_data.end(), counter_vec.begin(), counter_vec.end()); - enc_data.insert(enc_data.end(), ecc_key_share.begin(), ecc_key_share.end()); - enc_data.insert(enc_data.end(), ecc_ciphertext.begin(), ecc_ciphertext.end()); - enc_data.insert(enc_data.end(), kyber_key_share.begin(), kyber_key_share.end()); - enc_data.insert(enc_data.end(), kyber_ciphertext.begin(), kyber_ciphertext.end()); - enc_data.insert(enc_data.end(), fixedInfo_vec.begin(), fixedInfo_vec.end()); - - return enc_data; -} - -KMAC256::~KMAC256() -{ -} - -} // namespace rnp diff --git a/src/lib/crypto/kmac.hpp b/src/lib/crypto/kmac.hpp deleted file mode 100644 index e948696f5b..0000000000 --- a/src/lib/crypto/kmac.hpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2023, [MTG AG](https://www.mtg.de). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef CRYPTO_KMAC_H_ -#define CRYPTO_KMAC_H_ - -#include -#include "types.h" -#include "config.h" -#include "key.hpp" - -namespace rnp { -class KMAC256 { - /* KDF for PQC key combiner according to - * https://datatracker.ietf.org/doc/html/draft-wussler-openpgp-pqc-02 */ - - protected: - /* The value of domSeparation is the UTF-8 encoding of the string - "OpenPGPCompositeKeyDerivationFunction" and MUST be the following octet sequence: - - domSeparation := 4F 70 65 6E 50 47 50 43 6F 6D 70 6F 73 69 74 65 - 4B 65 79 44 65 72 69 76 61 74 69 6F 6E 46 75 6E - 63 74 69 6F 6E - - */ - const std::vector domSeparation_ = std::vector( - {0x4F, 0x70, 0x65, 0x6E, 0x50, 0x47, 0x50, 0x43, 0x6F, 0x6D, 0x70, 0x6F, 0x73, - 0x69, 0x74, 0x65, 0x4B, 0x65, 0x79, 0x44, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x69, 0x6F, 0x6E, 0x46, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E}); - - /* customizationString := 4B 44 46 */ - const std::vector customizationString_ = std::vector({0x4B, 0x44, 0x46}); - - /* counter - a 4 byte counter set to the value 1 */ - const std::vector counter_ = std::vector({0x00, 0x00, 0x00, 0x01}); - - std::vector domSeparation() const; - std::vector customizationString() const; - std::vector counter() const; - std::vector fixedInfo(pgp_pubkey_alg_t alg_id); - std::vector encData(const std::vector &ecc_key_share, - const std::vector &ecc_ciphertext, - const std::vector &kyber_key_share, - const std::vector &kyber_ciphertext, - pgp_pubkey_alg_t alg_id); - - KMAC256(){}; - - public: - static std::unique_ptr create(); - - /* KMAC interface for OpenPGP PQC composite algorithms */ - virtual void compute(const std::vector &ecc_key_share, - const std::vector &ecc_key_ciphertext, - const std::vector &kyber_key_share, - const std::vector &kyber_ciphertext, - const pgp_pubkey_alg_t alg_id, - std::vector & out) = 0; - - virtual ~KMAC256(); -}; - -} // namespace rnp - -#endif diff --git a/src/lib/crypto/kyber.cpp b/src/lib/crypto/kyber.cpp index eaf78e2c64..a68420b8f1 100644 --- a/src/lib/crypto/kyber.cpp +++ b/src/lib/crypto/kyber.cpp @@ -33,27 +33,17 @@ namespace { Botan::KyberMode rnp_kyber_param_to_botan_kyber_mode(kyber_parameter_e mode) { -#if defined(BOTAN_HAS_ML_KEM_INITIAL_PUBLIC_DRAFT) && defined(ENABLE_PQC_MLKEM_IPD) - Botan::KyberMode result = Botan::KyberMode::ML_KEM_1024_ipd; + Botan::KyberMode result = Botan::KyberMode::ML_KEM_1024; if (mode == kyber_768) { - result = Botan::KyberMode::ML_KEM_768_ipd; + result = Botan::KyberMode::ML_KEM_768; } -#else - Botan::KyberMode result = Botan::KyberMode::Kyber1024; - if (mode == kyber_768) { - result = Botan::KyberMode::Kyber768; - } -#endif return result; } uint32_t -key_share_size_from_kyber_param(kyber_parameter_e param) +kyber_key_share_size() { - if (param == kyber_768) { - return 24; - } - return 32; // kyber_1024 + return 32; } } // namespace @@ -63,6 +53,7 @@ kyber_generate_keypair(rnp::RNG *rng, kyber_parameter_e kyber_param) Botan::Kyber_PrivateKey kyber_priv(*rng->obj(), rnp_kyber_param_to_botan_kyber_mode(kyber_param)); + /* returns the two 32-byte values d and z of ML-KEM.KeyGen() */ Botan::secure_vector encoded_private_key = kyber_priv.private_key_bits(); std::unique_ptr kyber_pub = kyber_priv.public_key(); @@ -98,10 +89,7 @@ pgp_kyber_public_key_t::encapsulate(rnp::RNG *rng) const Botan::secure_vector encap_key; // this has to go over the wire Botan::secure_vector data_encryption_key; // this is the key used for // encryption of the payload data - kem_enc.encrypt(encap_key, - data_encryption_key, - *rng->obj(), - key_share_size_from_kyber_param(kyber_mode_)); + kem_enc.encrypt(encap_key, data_encryption_key, *rng->obj(), kyber_key_share_size()); kyber_encap_result_t result; result.ciphertext.insert( result.ciphertext.end(), encap_key.data(), encap_key.data() + encap_key.size()); @@ -119,8 +107,8 @@ pgp_kyber_private_key_t::decapsulate(rnp::RNG * rng, assert(is_initialized_); auto decoded_kyber_priv = botan_key(); Botan::PK_KEM_Decryptor kem_dec(decoded_kyber_priv, *rng->obj(), "Raw", "base"); - Botan::secure_vector dec_shared_key = kem_dec.decrypt( - ciphertext, ciphertext_len, key_share_size_from_kyber_param(kyber_mode_)); + Botan::secure_vector dec_shared_key = + kem_dec.decrypt(ciphertext, ciphertext_len, kyber_key_share_size()); return std::vector(dec_shared_key.data(), dec_shared_key.data() + dec_shared_key.size()); } diff --git a/src/lib/crypto/kyber_common.cpp b/src/lib/crypto/kyber_common.cpp index 0d70a157da..7ea6900b58 100644 --- a/src/lib/crypto/kyber_common.cpp +++ b/src/lib/crypto/kyber_common.cpp @@ -29,17 +29,10 @@ #include "logging.h" size_t -kyber_privkey_size(kyber_parameter_e parameter) +kyber_privkey_size() { - switch (parameter) { - case kyber_768: - return 2400; - case kyber_1024: - return 3168; - default: - RNP_LOG("invalid parameter given"); - throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); - } + /* seed format */ + return 64; } size_t @@ -56,20 +49,6 @@ kyber_pubkey_size(kyber_parameter_e parameter) } } -size_t -kyber_keyshare_size(kyber_parameter_e parameter) -{ - switch (parameter) { - case kyber_768: - return 24; - case kyber_1024: - return 32; - default: - RNP_LOG("invalid parameter given"); - throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); - } -} - size_t kyber_ciphertext_size(kyber_parameter_e parameter) { diff --git a/src/lib/crypto/kyber_common.h b/src/lib/crypto/kyber_common.h index 4b7978ef11..05ad08218f 100644 --- a/src/lib/crypto/kyber_common.h +++ b/src/lib/crypto/kyber_common.h @@ -29,9 +29,8 @@ #include "kyber.h" -size_t kyber_privkey_size(kyber_parameter_e parameter); +size_t kyber_privkey_size(); size_t kyber_pubkey_size(kyber_parameter_e parameter); -size_t kyber_keyshare_size(kyber_parameter_e parameter); size_t kyber_ciphertext_size(kyber_parameter_e parameter); #endif diff --git a/src/lib/crypto/kyber_ecdh_composite.cpp b/src/lib/crypto/kyber_ecdh_composite.cpp index 647f862252..82a2e2c289 100644 --- a/src/lib/crypto/kyber_ecdh_composite.cpp +++ b/src/lib/crypto/kyber_ecdh_composite.cpp @@ -28,7 +28,7 @@ #include "logging.h" #include "types.h" #include "ecdh_utils.h" -#include "kmac.hpp" +#include "kem_combiner.hpp" #include #include #include @@ -79,9 +79,8 @@ pgp_kyber_ecdh_composite_key_t::ecdh_curve_privkey_size(pgp_curve_t curve) switch (curve) { case PGP_CURVE_25519: return 32; - /* TODO */ - // case PGP_CURVE_X448: - // return 56; + case PGP_CURVE_448: + return 56; case PGP_CURVE_NIST_P_256: return 32; case PGP_CURVE_NIST_P_384: @@ -102,9 +101,8 @@ pgp_kyber_ecdh_composite_key_t::ecdh_curve_pubkey_size(pgp_curve_t curve) switch (curve) { case PGP_CURVE_25519: return 32; - /* TODO */ - // case PGP_CURVE_X448: - // return 56; + case PGP_CURVE_448: + return 56; case PGP_CURVE_NIST_P_256: return 65; case PGP_CURVE_NIST_P_384: @@ -125,9 +123,8 @@ pgp_kyber_ecdh_composite_key_t::ecdh_curve_ephemeral_size(pgp_curve_t curve) switch (curve) { case PGP_CURVE_25519: return 32; - /* TODO */ - // case PGP_CURVE_X448: - // return 56; + case PGP_CURVE_448: + return 56; case PGP_CURVE_NIST_P_256: return 65; case PGP_CURVE_NIST_P_384: @@ -148,9 +145,8 @@ pgp_kyber_ecdh_composite_key_t::ecdh_curve_keyshare_size(pgp_curve_t curve) switch (curve) { case PGP_CURVE_25519: return 32; - /* TODO */ - // case PGP_CURVE_X448: - // return 56; + case PGP_CURVE_448: + return 56; case PGP_CURVE_NIST_P_256: return 32; case PGP_CURVE_NIST_P_384: @@ -175,6 +171,8 @@ pgp_kyber_ecdh_composite_key_t::pk_alg_to_kyber_id(pgp_pubkey_alg_t pk_alg) FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_BP256: return kyber_768; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_BP384: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -199,8 +197,8 @@ pgp_kyber_ecdh_composite_key_t::pk_alg_to_curve_id(pgp_pubkey_alg_t pk_alg) return PGP_CURVE_BP384; case PGP_PKA_KYBER1024_P384: return PGP_CURVE_NIST_P_384; - /*case PGP_PKA_KYBER1024_X448: - return ... NOT_IMPLEMENTED*/ + case PGP_PKA_KYBER1024_X448: + return PGP_CURVE_448; default: RNP_LOG("invalid PK alg given"); throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); @@ -228,7 +226,7 @@ pgp_kyber_ecdh_composite_private_key_t::pgp_kyber_ecdh_composite_private_key_t( : pk_alg_(pk_alg) { if (ecdh_curve_privkey_size(pk_alg_to_curve_id(pk_alg)) != ecdh_key_encoded.size() || - kyber_privkey_size(pk_alg_to_kyber_id(pk_alg)) != kyber_key_encoded.size()) { + kyber_privkey_size() != kyber_key_encoded.size()) { RNP_LOG("ecdh or kyber key length mismatch"); throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); } @@ -270,9 +268,8 @@ pgp_kyber_ecdh_composite_private_key_t::pgp_kyber_ecdh_composite_private_key_t( size_t pgp_kyber_ecdh_composite_private_key_t::encoded_size(pgp_pubkey_alg_t pk_alg) { - kyber_parameter_e kyber_param = pk_alg_to_kyber_id(pk_alg); - pgp_curve_t curve = pk_alg_to_curve_id(pk_alg); - return ecdh_curve_privkey_size(curve) + kyber_privkey_size(kyber_param); + pgp_curve_t curve = pk_alg_to_curve_id(pk_alg); + return ecdh_curve_privkey_size(curve) + kyber_privkey_size(); } void @@ -295,56 +292,17 @@ pgp_kyber_ecdh_composite_private_key_t::parse_component_keys(std::vector -hashed_ecc_keyshare(const std::vector &key_share, - const std::vector &ciphertext, - const std::vector &ecc_pubkey, - pgp_pubkey_alg_t alg_id) -{ - /* SHA3-256(X || eccCipherText) or SHA3-512(X || eccCipherText) depending on algorithm */ - - std::vector digest; - pgp_hash_alg_t hash_alg; - - switch (alg_id) { - case PGP_PKA_KYBER768_X25519: - case PGP_PKA_KYBER768_BP256: - case PGP_PKA_KYBER768_P256: - hash_alg = PGP_HASH_SHA3_256; - break; - // case PGP_PKA_KYBER1024_X448: - case PGP_PKA_KYBER1024_P384: - case PGP_PKA_KYBER1024_BP384: - hash_alg = PGP_HASH_SHA3_512; - break; - default: - RNP_LOG("key combiner does not support this algorithm"); - throw rnp::rnp_exception(RNP_ERROR_BAD_STATE); - } - - auto hash = rnp::Hash::create(hash_alg); - hash->add(key_share); - hash->add(ciphertext); - hash->add(ecc_pubkey); - - digest.resize(rnp::Hash::size(hash_alg)); - hash->finish(digest.data()); - - return digest; -} -} // namespace - rnp_result_t -pgp_kyber_ecdh_composite_private_key_t::decrypt(rnp::RNG * rng, - uint8_t * out, - size_t * out_len, - const pgp_kyber_ecdh_encrypted_t *enc) const +pgp_kyber_ecdh_composite_private_key_t::decrypt( + rnp::RNG * rng, + uint8_t * out, + size_t * out_len, + const pgp_kyber_ecdh_encrypted_t * enc, + const pgp_kyber_ecdh_composite_public_key_t &ecdh_kyber_pub_key) const { initialized_or_throw(); rnp_result_t res; std::vector ecdh_keyshare; - std::vector hashed_ecdh_keyshare; std::vector kyber_keyshare; if (((enc->wrapped_sesskey.size() % 8) != 0) || (enc->wrapped_sesskey.size() < 16)) { @@ -363,8 +321,6 @@ pgp_kyber_ecdh_composite_private_key_t::decrypt(rnp::RNG * RNP_LOG("error when decrypting kyber-ecdh encrypted session key"); return res; } - hashed_ecdh_keyshare = hashed_ecc_keyshare( - ecdh_keyshare, ecdh_encapsulated_keyshare, ecdh_key_->get_pubkey_encoded(rng), pk_alg_); // Compute (kyberKeyShare) := kyberKem.decap(kyberCipherText, kyberPrivateKey) std::vector kyber_encapsulated_keyshare = std::vector( @@ -377,16 +333,13 @@ pgp_kyber_ecdh_composite_private_key_t::decrypt(rnp::RNG * return res; } - // Compute KEK := multiKeyCombine(eccKeyShare, kyberKeyShare, fixedInfo) as defined in - // Section 4.2.2 - std::vector kek_vec; - auto kmac = rnp::KMAC256::create(); - kmac->compute(hashed_ecdh_keyshare, - ecdh_encapsulated_keyshare, - kyber_keyshare, - kyber_encapsulated_keyshare, - pk_alg(), - kek_vec); + // Compute KEK + std::vector kek_vec = + rnp::PqcKemCombiner::compute(kyber_keyshare, + ecdh_keyshare, + ecdh_encapsulated_keyshare, + ecdh_kyber_pub_key.get_ecdh_encoded(), + pk_alg()); Botan::SymmetricKey kek(kek_vec); // Compute sessionKey := AESKeyUnwrap(KEK, C) with AES-256 as per [RFC3394], aborting if @@ -501,8 +454,7 @@ pgp_kyber_ecdh_composite_public_key_t::encrypt(rnp::RNG * rng, rnp_result_t res; std::vector ecdh_ciphertext; - std::vector ecdh_symmetric_key; - std::vector ecdh_hashed_symmetric_key; + std::vector ecdh_keyshare; if ((session_key_len % 8) != 0) { RNP_LOG("AES key wrap requires a multiple of 8 octets as input key"); @@ -510,28 +462,22 @@ pgp_kyber_ecdh_composite_public_key_t::encrypt(rnp::RNG * rng, } // Compute (eccCipherText, eccKeyShare) := eccKem.encap(eccPublicKey) - res = ecdh_key_.encapsulate(rng, ecdh_ciphertext, ecdh_symmetric_key); + res = ecdh_key_.encapsulate(rng, ecdh_ciphertext, ecdh_keyshare); if (res) { RNP_LOG("error when encapsulating with ECDH"); return res; } - ecdh_hashed_symmetric_key = hashed_ecc_keyshare( - ecdh_symmetric_key, ecdh_ciphertext, ecdh_key_.get_encoded(), pk_alg_); // Compute (kyberCipherText, kyberKeyShare) := kyberKem.encap(kyberPublicKey) kyber_encap_result_t kyber_encap = kyber_key_.encapsulate(rng); - // Compute KEK := multiKeyCombine(eccKeyShare, kyberKeyShare, fixedInfo) as defined in - // Section 4.2.2 - std::vector kek_vec; - auto kmac = rnp::KMAC256::create(); - kmac->compute(ecdh_hashed_symmetric_key, - ecdh_ciphertext, - kyber_encap.symmetric_key, - kyber_encap.ciphertext, - pk_alg(), - kek_vec); - Botan::SymmetricKey kek(kek_vec); + // Compute KEK + std::vector kek_vec = rnp::PqcKemCombiner::compute(kyber_encap.symmetric_key, + ecdh_keyshare, + ecdh_ciphertext, + ecdh_key_.get_encoded(), + pk_alg()); + Botan::SymmetricKey kek(kek_vec); // Compute C := AESKeyWrap(KEK, sessionKey) with AES-256 as per [RFC3394] that includes a // 64 bit integrity check @@ -563,6 +509,22 @@ pgp_kyber_ecdh_composite_public_key_t::get_encoded() const return result; }; +std::vector +pgp_kyber_ecdh_composite_public_key_t::get_kyber_encoded() const +{ + initialized_or_throw(); + + return kyber_key_.get_encoded(); +}; + +std::vector +pgp_kyber_ecdh_composite_public_key_t::get_ecdh_encoded() const +{ + initialized_or_throw(); + + return ecdh_key_.get_encoded(); +}; + bool pgp_kyber_ecdh_composite_public_key_t::is_valid(rnp::RNG *rng) const { diff --git a/src/lib/crypto/kyber_ecdh_composite.h b/src/lib/crypto/kyber_ecdh_composite.h index a798dd13a3..b7063c80eb 100644 --- a/src/lib/crypto/kyber_ecdh_composite.h +++ b/src/lib/crypto/kyber_ecdh_composite.h @@ -38,7 +38,8 @@ #include "crypto/exdsa_ecdhkem.h" #include -struct pgp_kyber_ecdh_key_t; /* forward declaration */ +struct pgp_kyber_ecdh_key_t; /* forward declaration */ +struct pgp_kyber_ecdh_composite_public_key_t; /* forward declaration */ class pgp_kyber_ecdh_composite_key_t { public: @@ -96,10 +97,12 @@ class pgp_kyber_ecdh_composite_private_key_t : public pgp_kyber_ecdh_composite_k const pgp_kyber_ecdh_composite_private_key_t &other); pgp_kyber_ecdh_composite_private_key_t() = default; - rnp_result_t decrypt(rnp::RNG * rng, - uint8_t * out, - size_t * out_len, - const pgp_kyber_ecdh_encrypted_t *enc) const; + rnp_result_t decrypt( + rnp::RNG * rng, + uint8_t * out, + size_t * out_len, + const pgp_kyber_ecdh_encrypted_t * enc, + const pgp_kyber_ecdh_composite_public_key_t &ecdh_kyber_pub_key) const; bool is_valid(rnp::RNG *rng) const; std::vector get_encoded() const; @@ -152,6 +155,8 @@ class pgp_kyber_ecdh_composite_public_key_t : public pgp_kyber_ecdh_composite_ke bool is_valid(rnp::RNG *rng) const; std::vector get_encoded() const; + std::vector get_kyber_encoded() const; + std::vector get_ecdh_encoded() const; pgp_pubkey_alg_t pk_alg() const diff --git a/src/lib/crypto/rng.cpp b/src/lib/crypto/rng.cpp index 50e74ec215..63a16e003f 100644 --- a/src/lib/crypto/rng.cpp +++ b/src/lib/crypto/rng.cpp @@ -35,7 +35,7 @@ RNG::RNG(Type type) if (botan_rng_init(&botan_rng, type == Type::DRBG ? "user" : NULL)) { throw rnp::rnp_exception(RNP_ERROR_RNG); } -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) if (type == Type::DRBG) { botan_rng_obj.reset(new Botan::AutoSeeded_RNG); } else { @@ -64,7 +64,7 @@ RNG::handle() return botan_rng; } -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) Botan::RandomNumberGenerator * RNG::obj() const { diff --git a/src/lib/crypto/rng.h b/src/lib/crypto/rng.h index d60dea9e69..00da52c8e7 100644 --- a/src/lib/crypto/rng.h +++ b/src/lib/crypto/rng.h @@ -35,7 +35,7 @@ #ifdef CRYPTO_BACKEND_BOTAN typedef struct botan_rng_struct *botan_rng_t; -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) #include #include #endif @@ -46,7 +46,7 @@ class RNG { private: #ifdef CRYPTO_BACKEND_BOTAN struct botan_rng_struct *botan_rng; -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) std::unique_ptr botan_rng_obj; #endif #endif @@ -80,7 +80,7 @@ class RNG { */ struct botan_rng_struct *handle(); -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) /** * @brief Returns the Botan RNG C++ object * Note: It is planned to move away from the FFI handle. diff --git a/src/lib/crypto/signatures.cpp b/src/lib/crypto/signatures.cpp index 6352c7ecfc..aff296ec7b 100644 --- a/src/lib/crypto/signatures.cpp +++ b/src/lib/crypto/signatures.cpp @@ -171,18 +171,15 @@ signature_validate(const pgp::pkt::Signature & sig, res.add_error(RNP_ERROR_SIG_WEAK_HASH); } -#if defined(ENABLE_PQC) - /* check that hash matches key requirements */ + /* check that hash matches minimum requirements */ if (!key.sig_hash_allowed(hash.alg())) { - RNP_LOG("Signature invalid since hash algorithm requirements are not met for the " - "given key."); + RNP_LOG("The signature's digest size is below the minimum digest size required for " + "that key."); res.add_error(RNP_ERROR_SIG_HASH_ALG_MISMATCH); } -#endif /* Finalize hash */ auto hval = signature_hash_finish(sig, hash, hdr); - /* compare lbits */ if (memcmp(hval.data(), sig.lbits.data(), 2)) { RNP_LOG("wrong lbits"); diff --git a/src/lib/crypto/sphincsplus.cpp b/src/lib/crypto/sphincsplus.cpp index 7b2ef80af6..b266c08012 100644 --- a/src/lib/crypto/sphincsplus.cpp +++ b/src/lib/crypto/sphincsplus.cpp @@ -30,121 +30,49 @@ #include "types.h" namespace { -Botan::Sphincs_Parameter_Set -rnp_sphincsplus_params_to_botan_param(sphincsplus_parameter_t param) -{ - switch (param) { - case sphincsplus_simple_128s: - return Botan::Sphincs_Parameter_Set::Sphincs128Small; - case sphincsplus_simple_128f: - return Botan::Sphincs_Parameter_Set::Sphincs128Fast; - case sphincsplus_simple_192s: - return Botan::Sphincs_Parameter_Set::Sphincs192Small; - case sphincsplus_simple_192f: - return Botan::Sphincs_Parameter_Set::Sphincs192Fast; - case sphincsplus_simple_256s: - return Botan::Sphincs_Parameter_Set::Sphincs256Small; - case sphincsplus_simple_256f: - return Botan::Sphincs_Parameter_Set::Sphincs256Fast; - default: - RNP_LOG("invalid parameter given"); - throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); - } -} -Botan::Sphincs_Hash_Type -rnp_sphincsplus_hash_func_to_botan_hash_func(sphincsplus_hash_func_t hash_func) -{ - switch (hash_func) { - case sphincsplus_sha256: - return Botan::Sphincs_Hash_Type::Sha256; - case sphinscplus_shake256: - return Botan::Sphincs_Hash_Type::Shake256; - default: - RNP_LOG("invalid parameter given"); - throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); - } -} - -sphincsplus_hash_func_t -rnp_sphincsplus_alg_to_hashfunc(pgp_pubkey_alg_t alg) +Botan::SLH_DSA_Parameter_Set +rnp_sphincsplus_alg_to_botan_param(pgp_pubkey_alg_t alg) { switch (alg) { - case PGP_PKA_SPHINCSPLUS_SHA2: - return sphincsplus_sha256; - case PGP_PKA_SPHINCSPLUS_SHAKE: - return sphinscplus_shake256; - default: - RNP_LOG("invalid SLH-DSA alg id"); - throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); - } -} - -pgp_pubkey_alg_t -rnp_sphincsplus_hashfunc_to_alg(sphincsplus_hash_func_t hashfunc) -{ - switch (hashfunc) { - case sphincsplus_sha256: - return PGP_PKA_SPHINCSPLUS_SHA2; - case sphinscplus_shake256: - return PGP_PKA_SPHINCSPLUS_SHAKE; + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + return Botan::SLH_DSA_Parameter_Set::SLHDSA128Fast; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: + return Botan::SLH_DSA_Parameter_Set::SLHDSA128Small; + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: + return Botan::SLH_DSA_Parameter_Set::SLHDSA256Small; default: - RNP_LOG("invalid SLH-DSA hashfunc"); + RNP_LOG("invalid algorithm ID given"); throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); } } } // namespace -pgp_sphincsplus_public_key_t::pgp_sphincsplus_public_key_t(const uint8_t *key_encoded, - size_t key_encoded_len, - sphincsplus_parameter_t param, - sphincsplus_hash_func_t hash_func) - : key_encoded_(key_encoded, key_encoded + key_encoded_len), - pk_alg_(rnp_sphincsplus_hashfunc_to_alg(hash_func)), sphincsplus_param_(param), - sphincsplus_hash_func_(hash_func), is_initialized_(true) -{ -} - -pgp_sphincsplus_public_key_t::pgp_sphincsplus_public_key_t( - std::vector const &key_encoded, - sphincsplus_parameter_t param, - sphincsplus_hash_func_t hash_func) - : key_encoded_(key_encoded), pk_alg_(rnp_sphincsplus_hashfunc_to_alg(hash_func)), - sphincsplus_param_(param), sphincsplus_hash_func_(hash_func), is_initialized_(true) +pgp_sphincsplus_public_key_t::pgp_sphincsplus_public_key_t(const uint8_t * key_encoded, + size_t key_encoded_len, + pgp_pubkey_alg_t alg) + : key_encoded_(key_encoded, key_encoded + key_encoded_len), pk_alg_(alg), + is_initialized_(true) { } pgp_sphincsplus_public_key_t::pgp_sphincsplus_public_key_t( - std::vector const &key_encoded, sphincsplus_parameter_t param, pgp_pubkey_alg_t alg) - : key_encoded_(key_encoded), pk_alg_(alg), sphincsplus_param_(param), - sphincsplus_hash_func_(rnp_sphincsplus_alg_to_hashfunc(alg)), is_initialized_(true) + std::vector const &key_encoded, pgp_pubkey_alg_t alg) + : key_encoded_(key_encoded), pk_alg_(alg), is_initialized_(true) { } -pgp_sphincsplus_private_key_t::pgp_sphincsplus_private_key_t(const uint8_t *key_encoded, - size_t key_encoded_len, - sphincsplus_parameter_t param, - sphincsplus_hash_func_t hash_func) - : key_encoded_(key_encoded, key_encoded + key_encoded_len), - pk_alg_(rnp_sphincsplus_hashfunc_to_alg(hash_func)), sphincsplus_param_(param), - sphincsplus_hash_func_(hash_func), is_initialized_(true) +pgp_sphincsplus_private_key_t::pgp_sphincsplus_private_key_t(const uint8_t * key_encoded, + size_t key_encoded_len, + pgp_pubkey_alg_t alg) + : key_encoded_(key_encoded, key_encoded + key_encoded_len), pk_alg_(alg), + is_initialized_(true) { } pgp_sphincsplus_private_key_t::pgp_sphincsplus_private_key_t( - std::vector const &key_encoded, - sphincsplus_parameter_t param, - sphincsplus_hash_func_t hash_func) + std::vector const &key_encoded, pgp_pubkey_alg_t alg) : key_encoded_(Botan::secure_vector(key_encoded.begin(), key_encoded.end())), - pk_alg_(rnp_sphincsplus_hashfunc_to_alg(hash_func)), sphincsplus_param_(param), - sphincsplus_hash_func_(hash_func), is_initialized_(true) -{ -} - -pgp_sphincsplus_private_key_t::pgp_sphincsplus_private_key_t( - std::vector const &key_encoded, sphincsplus_parameter_t param, pgp_pubkey_alg_t alg) - : key_encoded_(Botan::secure_vector(key_encoded.begin(), key_encoded.end())), - pk_alg_(alg), sphincsplus_param_(param), - sphincsplus_hash_func_(rnp_sphincsplus_alg_to_hashfunc(alg)), is_initialized_(true) + pk_alg_(alg), is_initialized_(true) { } @@ -159,29 +87,26 @@ pgp_sphincsplus_private_key_t::sign(rnp::RNG * rng, auto signer = Botan::PK_Signer(priv_key, *rng->obj(), ""); sig->sig = signer.sign_message(msg, msg_len, *rng->obj()); - sig->param = param(); return RNP_SUCCESS; } -Botan::SphincsPlus_PublicKey +Botan::SLH_DSA_PublicKey pgp_sphincsplus_public_key_t::botan_key() const { - return Botan::SphincsPlus_PublicKey( - key_encoded_, - rnp_sphincsplus_params_to_botan_param(this->sphincsplus_param_), - rnp_sphincsplus_hash_func_to_botan_hash_func(this->sphincsplus_hash_func_)); + return Botan::SLH_DSA_PublicKey(key_encoded_, + rnp_sphincsplus_alg_to_botan_param(this->pk_alg_), + Botan::SLH_DSA_Hash_Type::Shake256); } -Botan::SphincsPlus_PrivateKey +Botan::SLH_DSA_PrivateKey pgp_sphincsplus_private_key_t::botan_key() const { Botan::secure_vector priv_sv(key_encoded_.data(), key_encoded_.data() + key_encoded_.size()); - return Botan::SphincsPlus_PrivateKey( - priv_sv, - rnp_sphincsplus_params_to_botan_param(this->sphincsplus_param_), - rnp_sphincsplus_hash_func_to_botan_hash_func(this->sphincsplus_hash_func_)); + return Botan::SLH_DSA_PrivateKey(priv_sv, + rnp_sphincsplus_alg_to_botan_param(this->pk_alg_), + Botan::SLH_DSA_Hash_Type::Shake256); } rnp_result_t @@ -200,46 +125,29 @@ pgp_sphincsplus_public_key_t::verify(const pgp_sphincsplus_signature_t *sig, } std::pair -sphincsplus_generate_keypair(rnp::RNG * rng, - sphincsplus_parameter_t sphincsplus_param, - sphincsplus_hash_func_t sphincsplus_hash_func) +sphincsplus_generate_keypair(rnp::RNG *rng, pgp_pubkey_alg_t alg) { - Botan::SphincsPlus_PrivateKey priv_key( - *rng->obj(), - rnp_sphincsplus_params_to_botan_param(sphincsplus_param), - rnp_sphincsplus_hash_func_to_botan_hash_func(sphincsplus_hash_func)); + Botan::SLH_DSA_PrivateKey priv_key(*rng->obj(), + rnp_sphincsplus_alg_to_botan_param(alg), + Botan::SLH_DSA_Hash_Type::Shake256); std::unique_ptr pub_key = priv_key.public_key(); Botan::secure_vector priv_bits = priv_key.private_key_bits(); return std::make_pair( - pgp_sphincsplus_public_key_t( - pub_key->public_key_bits(), sphincsplus_param, sphincsplus_hash_func), - pgp_sphincsplus_private_key_t( - priv_bits.data(), priv_bits.size(), sphincsplus_param, sphincsplus_hash_func)); + pgp_sphincsplus_public_key_t(pub_key->public_key_bits(), alg), + pgp_sphincsplus_private_key_t(priv_bits.data(), priv_bits.size(), alg)); } rnp_result_t -pgp_sphincsplus_generate(rnp::RNG * rng, - pgp_sphincsplus_key_t * material, - sphincsplus_parameter_t param, - pgp_pubkey_alg_t alg) +pgp_sphincsplus_generate(rnp::RNG *rng, pgp_sphincsplus_key_t *material, pgp_pubkey_alg_t alg) { - auto keypair = - sphincsplus_generate_keypair(rng, param, rnp_sphincsplus_alg_to_hashfunc(alg)); + auto keypair = sphincsplus_generate_keypair(rng, alg); material->pub = keypair.first; material->priv = keypair.second; return RNP_SUCCESS; } -bool -pgp_sphincsplus_public_key_t::validate_signature_hash_requirements( - pgp_hash_alg_t hash_alg) const -{ - /* check if key is allowed with the hash algorithm */ - return sphincsplus_hash_allowed(pk_alg_, sphincsplus_param_, hash_alg); -} - bool pgp_sphincsplus_public_key_t::is_valid(rnp::RNG *rng) const { @@ -279,147 +187,39 @@ sphincsplus_validate_key(rnp::RNG *rng, const pgp_sphincsplus_key_t *key, bool s } size_t -sphincsplus_privkey_size(sphincsplus_parameter_t param) +sphincsplus_privkey_size(pgp_pubkey_alg_t alg) { - return 2 * sphincsplus_pubkey_size(param); + return 2 * sphincsplus_pubkey_size(alg); } size_t -sphincsplus_pubkey_size(sphincsplus_parameter_t param) +sphincsplus_pubkey_size(pgp_pubkey_alg_t alg) { - switch (param) { - case sphincsplus_simple_128s: + switch (alg) { + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: return 32; - case sphincsplus_simple_128f: + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: return 32; - case sphincsplus_simple_192s: - return 48; - case sphincsplus_simple_192f: - return 48; - case sphincsplus_simple_256s: - return 64; - case sphincsplus_simple_256f: + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: return 64; default: - RNP_LOG("invalid SLH-DSA parameter identifier"); + RNP_LOG("invalid SLH-DSA algorithm identifier"); return 0; } } size_t -sphincsplus_signature_size(sphincsplus_parameter_t param) +sphincsplus_signature_size(pgp_pubkey_alg_t alg) { - switch (param) { - case sphincsplus_simple_128s: - return 7856; - case sphincsplus_simple_128f: + switch (alg) { + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: return 17088; - case sphincsplus_simple_192s: - return 16224; - case sphincsplus_simple_192f: - return 35664; - case sphincsplus_simple_256s: + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: + return 7856; + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: return 29792; - case sphincsplus_simple_256f: - return 49856; default: - RNP_LOG("invalid SLH-DSA parameter identifier"); + RNP_LOG("invalid SLH-DSA algorithm identifier"); return 0; } } - -bool -sphincsplus_hash_allowed(pgp_pubkey_alg_t pk_alg, - sphincsplus_parameter_t sphincsplus_param, - pgp_hash_alg_t hash_alg) -{ - /* draft-wussler-openpgp-pqc-02 Table 14*/ - switch (pk_alg) { - case PGP_PKA_SPHINCSPLUS_SHA2: - switch (sphincsplus_param) { - case sphincsplus_simple_128s: - FALLTHROUGH_STATEMENT; - case sphincsplus_simple_128f: - if (hash_alg != PGP_HASH_SHA256) { - return false; - } - break; - case sphincsplus_simple_192s: - FALLTHROUGH_STATEMENT; - case sphincsplus_simple_192f: - FALLTHROUGH_STATEMENT; - case sphincsplus_simple_256s: - FALLTHROUGH_STATEMENT; - case sphincsplus_simple_256f: - if (hash_alg != PGP_HASH_SHA512) { - return false; - } - break; - } - break; - case PGP_PKA_SPHINCSPLUS_SHAKE: - switch (sphincsplus_param) { - case sphincsplus_simple_128s: - FALLTHROUGH_STATEMENT; - case sphincsplus_simple_128f: - if (hash_alg != PGP_HASH_SHA3_256) { - return false; - } - break; - case sphincsplus_simple_192s: - FALLTHROUGH_STATEMENT; - case sphincsplus_simple_192f: - FALLTHROUGH_STATEMENT; - case sphincsplus_simple_256s: - FALLTHROUGH_STATEMENT; - case sphincsplus_simple_256f: - if (hash_alg != PGP_HASH_SHA3_512) { - return false; - } - break; - } - break; - default: - break; - } - return true; -} - -pgp_hash_alg_t -sphincsplus_default_hash_alg(pgp_pubkey_alg_t pk_alg, - sphincsplus_parameter_t sphincsplus_param) -{ - switch (sphincsplus_param) { - case sphincsplus_simple_128s: - FALLTHROUGH_STATEMENT; - case sphincsplus_simple_128f: - switch (pk_alg) { - case PGP_PKA_SPHINCSPLUS_SHA2: - return PGP_HASH_SHA256; - case PGP_PKA_SPHINCSPLUS_SHAKE: - return PGP_HASH_SHA3_256; - default: - RNP_LOG("invalid parameter given"); - throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); - } - case sphincsplus_simple_192s: - FALLTHROUGH_STATEMENT; - case sphincsplus_simple_192f: - FALLTHROUGH_STATEMENT; - case sphincsplus_simple_256s: - FALLTHROUGH_STATEMENT; - case sphincsplus_simple_256f: - switch (pk_alg) { - case PGP_PKA_SPHINCSPLUS_SHA2: - return PGP_HASH_SHA512; - case PGP_PKA_SPHINCSPLUS_SHAKE: - return PGP_HASH_SHA3_512; - default: - RNP_LOG("invalid parameter given"); - throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); - } - default: - RNP_LOG("invalid parameter given"); - throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); - } -} diff --git a/src/lib/crypto/sphincsplus.h b/src/lib/crypto/sphincsplus.h index 95300f09a4..20b60e8040 100644 --- a/src/lib/crypto/sphincsplus.h +++ b/src/lib/crypto/sphincsplus.h @@ -32,61 +32,33 @@ #include #include #include "crypto/rng.h" -#include +#include #include struct pgp_sphincsplus_key_t; struct pgp_sphincsplus_signature_t; -typedef enum { sphincsplus_sha256, sphinscplus_shake256 } sphincsplus_hash_func_t; -typedef enum : uint8_t { - sphincsplus_simple_128s = 1, - sphincsplus_simple_128f = 2, - sphincsplus_simple_192s = 3, - sphincsplus_simple_192f = 4, - sphincsplus_simple_256s = 5, - sphincsplus_simple_256f = 6 -} sphincsplus_parameter_t; - typedef struct pgp_sphincsplus_signature_t { - std::vector sig; - sphincsplus_parameter_t param; + std::vector sig; } pgp_sphincsplus_signature_t; class pgp_sphincsplus_private_key_t { public: - pgp_sphincsplus_private_key_t(const uint8_t * key_encoded, - size_t key_encoded_len, - sphincsplus_parameter_t sphincs_param, - sphincsplus_hash_func_t sphincs_hash_func); - pgp_sphincsplus_private_key_t(std::vector const &key_encoded, - sphincsplus_parameter_t sphincs_param, - sphincsplus_hash_func_t sphincs_hash_func); + pgp_sphincsplus_private_key_t(const uint8_t * key_encoded, + size_t key_encoded_len, + pgp_pubkey_alg_t alg); pgp_sphincsplus_private_key_t(std::vector const &key_encoded, - sphincsplus_parameter_t param, pgp_pubkey_alg_t alg); pgp_sphincsplus_private_key_t() = default; bool is_valid(rnp::RNG *rng) const; - sphincsplus_parameter_t - param() const - { - return sphincsplus_param_; - } - pgp_pubkey_alg_t alg() const { return pk_alg_; } - sphincsplus_hash_func_t - hash_func() const - { - return sphincsplus_hash_func_; - } - rnp_result_t sign(rnp::RNG * rng, pgp_sphincsplus_signature_t *sig, const uint8_t * msg, @@ -105,35 +77,26 @@ class pgp_sphincsplus_private_key_t { }; private: - Botan::SphincsPlus_PrivateKey botan_key() const; + Botan::SLH_DSA_PrivateKey botan_key() const; Botan::secure_vector key_encoded_; pgp_pubkey_alg_t pk_alg_; - sphincsplus_parameter_t sphincsplus_param_; - sphincsplus_hash_func_t sphincsplus_hash_func_; bool is_initialized_ = false; }; class pgp_sphincsplus_public_key_t { public: - pgp_sphincsplus_public_key_t(const uint8_t * key_encoded, - size_t key_encoded_len, - sphincsplus_parameter_t sphincs_param, - sphincsplus_hash_func_t sphincs_hash_func); + pgp_sphincsplus_public_key_t(const uint8_t * key_encoded, + size_t key_encoded_len, + pgp_pubkey_alg_t alg); pgp_sphincsplus_public_key_t(std::vector const &key_encoded, - sphincsplus_parameter_t sphincs_param, - sphincsplus_hash_func_t sphincs_hash_func); - pgp_sphincsplus_public_key_t(std::vector const &key_encoded, - sphincsplus_parameter_t param, pgp_pubkey_alg_t alg); pgp_sphincsplus_public_key_t() = default; bool operator==(const pgp_sphincsplus_public_key_t &rhs) const { - return (sphincsplus_param_ == rhs.sphincsplus_param_) && - (sphincsplus_hash_func_ == rhs.sphincsplus_hash_func_) && - (key_encoded_ == rhs.key_encoded_); + return (pk_alg_ == rhs.pk_alg_) && (key_encoded_ == rhs.key_encoded_); } rnp_result_t verify(const pgp_sphincsplus_signature_t *sig, @@ -142,14 +105,6 @@ class pgp_sphincsplus_public_key_t { bool is_valid(rnp::RNG *rng) const; - bool validate_signature_hash_requirements(pgp_hash_alg_t hash_alg) const; - - sphincsplus_parameter_t - param() const - { - return sphincsplus_param_; - } - pgp_pubkey_alg_t alg() const { @@ -163,24 +118,19 @@ class pgp_sphincsplus_public_key_t { }; private: - Botan::SphincsPlus_PublicKey botan_key() const; + Botan::SLH_DSA_PublicKey botan_key() const; - std::vector key_encoded_; - pgp_pubkey_alg_t pk_alg_; - sphincsplus_parameter_t sphincsplus_param_; - sphincsplus_hash_func_t sphincsplus_hash_func_; - bool is_initialized_ = false; + std::vector key_encoded_; + pgp_pubkey_alg_t pk_alg_; + bool is_initialized_ = false; }; std::pair -sphincsplus_generate_keypair(rnp::RNG * rng, - sphincsplus_parameter_t sphincs_param, - sphincsplus_hash_func_t sphincs_hash_func); +sphincsplus_generate_keypair(rnp::RNG *rng, pgp_pubkey_alg_t alg); -rnp_result_t pgp_sphincsplus_generate(rnp::RNG * rng, - pgp_sphincsplus_key_t * material, - sphincsplus_parameter_t param, - pgp_pubkey_alg_t alg); +rnp_result_t pgp_sphincsplus_generate(rnp::RNG * rng, + pgp_sphincsplus_key_t *material, + pgp_pubkey_alg_t alg); rnp_result_t sphincsplus_validate_key(rnp::RNG * rng, const pgp_sphincsplus_key_t *key, @@ -191,15 +141,8 @@ typedef struct pgp_sphincsplus_key_t { pgp_sphincsplus_private_key_t priv; } pgp_sphincsplus_key_t; -size_t sphincsplus_privkey_size(sphincsplus_parameter_t param); -size_t sphincsplus_pubkey_size(sphincsplus_parameter_t param); -size_t sphincsplus_signature_size(sphincsplus_parameter_t param); - -bool sphincsplus_hash_allowed(pgp_pubkey_alg_t pk_alg, - sphincsplus_parameter_t sphincsplus_param, - pgp_hash_alg_t hash_alg); - -pgp_hash_alg_t sphincsplus_default_hash_alg(pgp_pubkey_alg_t pk_alg, - sphincsplus_parameter_t sphincsplus_param); +size_t sphincsplus_privkey_size(pgp_pubkey_alg_t alg); +size_t sphincsplus_pubkey_size(pgp_pubkey_alg_t alg); +size_t sphincsplus_signature_size(pgp_pubkey_alg_t alg); #endif \ No newline at end of file diff --git a/src/lib/crypto/x25519.cpp b/src/lib/crypto/x25519_x448.cpp similarity index 54% rename from src/lib/crypto/x25519.cpp rename to src/lib/crypto/x25519_x448.cpp index 1441260846..eb0ade3171 100644 --- a/src/lib/crypto/x25519.cpp +++ b/src/lib/crypto/x25519_x448.cpp @@ -24,24 +24,26 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "x25519.h" -#include -#if defined(ENABLE_CRYPTO_REFRESH) +#include "x25519_x448.h" +#include +#include #include "exdsa_ecdhkem.h" #include "hkdf.hpp" #include "utils.h" #include "botan/rfc3394.h" +static const std::vector hkdf_x25519_info_str = { + 'O', 'p', 'e', 'n', 'P', 'G', 'P', ' ', 'X', '2', '5', '5', '1', '9'}; +static const std::vector hkdf_x448_info_str = { + 'O', 'p', 'e', 'n', 'P', 'G', 'P', ' ', 'X', '4', '4', '8'}; + static void -x25519_hkdf(std::vector & derived_key, - const std::vector &ephemeral_pubkey_material, - const std::vector &recipient_pubkey_material, - const std::vector &shared_key) +x_hkdf(std::vector & derived_key, + const std::vector &ephemeral_pubkey_material, + const std::vector &recipient_pubkey_material, + const std::vector &shared_key, + const std::vector &info_str) { - /* The shared secret is passed to HKDF (see {{RFC5869}}) using SHA256, and the - * UTF-8-encoded string "OpenPGP X25519" as the info parameter. */ - static const std::vector info = { - 'O', 'p', 'e', 'n', 'P', 'G', 'P', ' ', 'X', '2', '5', '5', '1', '9'}; auto kdf = rnp::Hkdf::create(PGP_HASH_SHA256); derived_key.resize(pgp_key_size(PGP_SA_AES_128)); // 128-bit AES key wrap @@ -58,8 +60,8 @@ x25519_hkdf(std::vector & derived_key, 0, // no salt kdf_input.data(), kdf_input.size(), - info.data(), - info.size(), + info_str.data(), + info_str.size(), derived_key.data(), derived_key.size()); } @@ -88,7 +90,7 @@ x25519_native_encrypt(rnp::RNG * rng, return ret; } - x25519_hkdf(derived_key, encrypted->eph_key, pubkey, shared_key); + x_hkdf(derived_key, encrypted->eph_key, pubkey, shared_key, hkdf_x25519_info_str); Botan::SymmetricKey kek(derived_key); try { @@ -132,7 +134,7 @@ x25519_native_decrypt(rnp::RNG * rng, return ret; } - x25519_hkdf(derived_key, encrypted->eph_key, keypair.pub, shared_key); + x_hkdf(derived_key, encrypted->eph_key, keypair.pub, shared_key, hkdf_x25519_info_str); Botan::SymmetricKey kek(derived_key); auto tmp_out = @@ -155,11 +157,11 @@ x25519_validate_key_native(rnp::RNG *rng, const pgp_x25519_key_t *key, bool secr bool valid_pub; bool valid_priv; - Botan::Curve25519_PublicKey pub_key(key->priv); + Botan::X25519_PublicKey pub_key(key->priv); valid_pub = pub_key.check_key(*(rng->obj()), false); if (secret) { - Botan::Curve25519_PrivateKey priv_key( + Botan::X25519_PrivateKey priv_key( Botan::secure_vector(key->priv.begin(), key->priv.end())); valid_priv = priv_key.check_key(*(rng->obj()), false); } else { @@ -170,16 +172,131 @@ x25519_validate_key_native(rnp::RNG *rng, const pgp_x25519_key_t *key, bool secr return (valid_pub && valid_priv) ? RNP_SUCCESS : RNP_ERROR_BAD_PARAMETERS; } -#endif - rnp_result_t generate_x25519_native(rnp::RNG * rng, std::vector &privkey, std::vector &pubkey) { - Botan::Curve25519_PrivateKey priv_key(*(rng->obj())); + Botan::X25519_PrivateKey priv_key(*(rng->obj())); + pubkey = priv_key.public_value(); + privkey = Botan::unlock(priv_key.raw_private_key_bits()); + + return RNP_SUCCESS; +} + +rnp_result_t +generate_x448_native(rnp::RNG * rng, + std::vector &privkey, + std::vector &pubkey) +{ + Botan::X448_PrivateKey priv_key(*(rng->obj())); pubkey = priv_key.public_value(); privkey = Botan::unlock(priv_key.raw_private_key_bits()); + return RNP_SUCCESS; +} + +rnp_result_t +x448_native_encrypt(rnp::RNG * rng, + const std::vector &pubkey, + const uint8_t * in, + size_t in_len, + pgp_x448_encrypted_t * encrypted) +{ + rnp_result_t ret; + std::vector shared_key; + std::vector derived_key; + + if (!in_len || (in_len % 8) != 0) { + RNP_LOG("incorrect size of in, AES key wrap requires a multiple of 8 bytes"); + return RNP_ERROR_BAD_FORMAT; + } + + /* encapsulation */ + ecdh_kem_public_key_t ecdhkem_pubkey(pubkey, PGP_CURVE_448); + ret = ecdhkem_pubkey.encapsulate(rng, encrypted->eph_key, shared_key); + if (ret != RNP_SUCCESS) { + RNP_LOG("encapsulation failed"); + return ret; + } + + x_hkdf(derived_key, encrypted->eph_key, pubkey, shared_key, hkdf_x448_info_str); + + Botan::SymmetricKey kek(derived_key); + try { + encrypted->enc_sess_key = Botan::unlock( + Botan::rfc3394_keywrap(Botan::secure_vector(in, in + in_len), kek)); + } catch (const std::exception &e) { + RNP_LOG("Keywrap failed: %s", e.what()); + return RNP_ERROR_ENCRYPT_FAILED; + } return RNP_SUCCESS; } + +rnp_result_t +x448_native_decrypt(rnp::RNG * rng, + const pgp_x448_key_t & keypair, + const pgp_x448_encrypted_t *encrypted, + uint8_t * decbuf, + size_t * decbuf_len) +{ + rnp_result_t ret; + std::vector shared_key; + std::vector derived_key; + + static const size_t x448_pubkey_size = 32; + if (encrypted->eph_key.size() != x448_pubkey_size) { + RNP_LOG("Wrong ephemeral public key size"); + return RNP_ERROR_BAD_FORMAT; + } + if (!encrypted->enc_sess_key.size()) { + // TODO: could do a check for possible sizes + RNP_LOG("No encrypted session key provided"); + return RNP_ERROR_BAD_FORMAT; + } + + /* decapsulate */ + ecdh_kem_private_key_t ecdhkem_privkey(keypair.priv, PGP_CURVE_448); + ret = ecdhkem_privkey.decapsulate(rng, encrypted->eph_key, shared_key); + if (ret != RNP_SUCCESS) { + RNP_LOG("decapsulation failed"); + return ret; + } + + x_hkdf(derived_key, encrypted->eph_key, keypair.pub, shared_key, hkdf_x448_info_str); + + Botan::SymmetricKey kek(derived_key); + auto tmp_out = + Botan::rfc3394_keyunwrap(Botan::secure_vector(encrypted->enc_sess_key.begin(), + encrypted->enc_sess_key.end()), + kek); + if (*decbuf_len < tmp_out.size()) { + RNP_LOG("buffer for decryption result too small"); + return RNP_ERROR_DECRYPT_FAILED; + } + *decbuf_len = tmp_out.size(); + memcpy(decbuf, tmp_out.data(), tmp_out.size()); + + return RNP_SUCCESS; +} + +rnp_result_t +x448_validate_key_native(rnp::RNG *rng, const pgp_x448_key_t *key, bool secret) +{ + bool valid_pub; + bool valid_priv; + + Botan::X448_PublicKey pub_key(key->priv); + valid_pub = pub_key.check_key(*(rng->obj()), false); + + if (secret) { + Botan::X448_PrivateKey priv_key( + Botan::secure_vector(key->priv.begin(), key->priv.end())); + valid_priv = priv_key.check_key(*(rng->obj()), false); + } else { + valid_priv = true; + } + + // check key returns true for successful check + return (valid_pub && valid_priv) ? RNP_SUCCESS : RNP_ERROR_BAD_PARAMETERS; +} \ No newline at end of file diff --git a/src/lib/crypto/x25519.h b/src/lib/crypto/x25519_x448.h similarity index 73% rename from src/lib/crypto/x25519.h rename to src/lib/crypto/x25519_x448.h index 36fcd5d173..e5e92a1525 100644 --- a/src/lib/crypto/x25519.h +++ b/src/lib/crypto/x25519_x448.h @@ -38,7 +38,6 @@ rnp_result_t generate_x25519_native(rnp::RNG * rng, std::vector &privkey, std::vector &pubkey); -#if defined(ENABLE_CRYPTO_REFRESH) rnp_result_t x25519_native_encrypt(rnp::RNG * rng, const std::vector &pubkey, const uint8_t * in, @@ -55,5 +54,21 @@ rnp_result_t x25519_validate_key_native(rnp::RNG * rng, const pgp_x25519_key_t *key, bool secret); -#endif +rnp_result_t generate_x448_native(rnp::RNG * rng, + std::vector &privkey, + std::vector &pubkey); + +rnp_result_t x448_native_encrypt(rnp::RNG * rng, + const std::vector &pubkey, + const uint8_t * in, + size_t in_len, + pgp_x448_encrypted_t * encrypted); + +rnp_result_t x448_native_decrypt(rnp::RNG * rng, + const pgp_x448_key_t & keypair, + const pgp_x448_encrypted_t *encrypted, + uint8_t * decbuf, + size_t * decbuf_len); + +rnp_result_t x448_validate_key_native(rnp::RNG *rng, const pgp_x448_key_t *key, bool secret); #endif diff --git a/src/lib/enc_material.cpp b/src/lib/enc_material.cpp index 3e8250afe9..2a434fb34f 100644 --- a/src/lib/enc_material.cpp +++ b/src/lib/enc_material.cpp @@ -51,7 +51,8 @@ EncMaterial::create(pgp_pubkey_alg_t alg) #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_KYBER1024_X448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -151,7 +152,7 @@ X25519EncMaterial::parse(pgp_packet_body_t &pkt) noexcept uint8_t bt = 0; if (!pkt.get(bt)) { RNP_LOG("failed to get salg"); - return RNP_ERROR_BAD_FORMAT; + return false; } sess_len--; salg = (pgp_symm_alg_t) bt; @@ -175,6 +176,51 @@ X25519EncMaterial::write(pgp_packet_body_t &pkt) const } pkt.add(enc.enc_sess_key); } + +bool +X448EncMaterial::parse(pgp_packet_body_t &pkt) noexcept +{ + auto ec_desc = ec::Curve::get(PGP_CURVE_448); + enc.eph_key.resize(BITS_TO_BYTES(ec_desc->bitlen)); + if (!pkt.get(enc.eph_key.data(), enc.eph_key.size())) { + RNP_LOG("failed to parse X448 PKESK (eph. pubkey)"); + return false; + } + uint8_t sess_len; + if (!pkt.get(sess_len)) { + RNP_LOG("failed to parse X448 PKESK (enc sesskey length)"); + return false; + } + /* get plaintext salg if PKESKv3 */ + if (version == PGP_PKSK_V3) { + uint8_t bt = 0; + if (!pkt.get(bt)) { + RNP_LOG("failed to get salg"); + return false; + } + sess_len--; + salg = (pgp_symm_alg_t) bt; + } + enc.enc_sess_key.resize(sess_len); + if (!pkt.get(enc.enc_sess_key.data(), sess_len)) { + RNP_LOG("failed to parse X448 PKESK (enc sesskey)"); + return false; + } + return true; +} + +void +X448EncMaterial::write(pgp_packet_body_t &pkt) const +{ + uint8_t inc = ((version == PGP_PKSK_V3) ? 1 : 0); + pkt.add(enc.eph_key); + pkt.add_byte(static_cast(enc.enc_sess_key.size() + inc)); + if (version == PGP_PKSK_V3) { + pkt.add_byte(salg); /* added as plaintext */ + } + pkt.add(enc.enc_sess_key); +} + #endif #if defined(ENABLE_PQC) @@ -202,7 +248,7 @@ MlkemEcdhEncMaterial::parse(pgp_packet_body_t &pkt) noexcept uint8_t balg = 0; if (!pkt.get(balg)) { RNP_LOG("failed to get salg"); - return RNP_ERROR_BAD_FORMAT; + return false; } salg = (pgp_symm_alg_t) balg; wrapped_key_len--; diff --git a/src/lib/enc_material.hpp b/src/lib/enc_material.hpp index 7caab1eca4..320daa9668 100644 --- a/src/lib/enc_material.hpp +++ b/src/lib/enc_material.hpp @@ -88,6 +88,14 @@ class X25519EncMaterial : public EncMaterial { bool parse(pgp_packet_body_t &pkt) noexcept override; void write(pgp_packet_body_t &pkt) const override; }; + +class X448EncMaterial : public EncMaterial { + public: + pgp_x448_encrypted_t enc; + + bool parse(pgp_packet_body_t &pkt) noexcept override; + void write(pgp_packet_body_t &pkt) const override; +}; #endif #if defined(ENABLE_PQC) diff --git a/src/lib/fingerprint.cpp b/src/lib/fingerprint.cpp index 6563cfde73..ca3b861202 100644 --- a/src/lib/fingerprint.cpp +++ b/src/lib/fingerprint.cpp @@ -107,7 +107,11 @@ bool Fingerprint::size_valid(size_t size) noexcept { return (size == PGP_FINGERPRINT_V4_SIZE) || (size == PGP_FINGERPRINT_V3_SIZE) || - (size == PGP_FINGERPRINT_V5_SIZE); + (size == PGP_FINGERPRINT_V5_SIZE) +#if defined(ENABLE_CRYPTO_REFRESH) + || (size == PGP_FINGERPRINT_V6_SIZE) +#endif + ; } const KeyID & diff --git a/src/lib/generate-key.cpp b/src/lib/generate-key.cpp new file mode 100644 index 0000000000..6710af6ac5 --- /dev/null +++ b/src/lib/generate-key.cpp @@ -0,0 +1,581 @@ +/* + * Copyright (c) 2017, [Ribose Inc](https://www.ribose.com). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include +#include + +#include +#include +#include +#include "crypto.h" +#include "defaults.h" +#include "utils.h" + +static const uint8_t DEFAULT_SYMMETRIC_ALGS[] = { + PGP_SA_AES_256, PGP_SA_AES_192, PGP_SA_AES_128}; +static const uint8_t DEFAULT_HASH_ALGS[] = { + PGP_HASH_SHA256, PGP_HASH_SHA384, PGP_HASH_SHA512, PGP_HASH_SHA224}; +static const uint8_t DEFAULT_COMPRESS_ALGS[] = { + PGP_C_ZLIB, PGP_C_BZIP2, PGP_C_ZIP, PGP_C_NONE}; +#if defined(ENABLE_CRYPTO_REFRESH) +static const uint8_t DEFAULT_AEAD_ALGS[] = {PGP_AEAD_OCB}; +#endif + +static bool +load_generated_g10_key(pgp_key_t * dst, + pgp_key_pkt_t * newkey, + pgp_key_t * primary_key, + pgp_key_t * pubkey, + rnp::SecurityContext &ctx) +{ + // this should generally be zeroed + assert(dst->type() == 0); + // if a primary is provided, make sure it's actually a primary key + assert(!primary_key || primary_key->is_primary()); + // if a pubkey is provided, make sure it's actually a public key + assert(!pubkey || pubkey->is_public()); + // G10 always needs pubkey here + assert(pubkey); + + // this would be better on the stack but the key store does not allow it + std::unique_ptr key_store(new (std::nothrow) rnp::KeyStore(ctx)); + if (!key_store) { + return false; + } + /* Write g10 seckey */ + rnp::MemoryDest memdst(NULL, 0); + if (!g10_write_seckey(&memdst.dst(), newkey, NULL, ctx)) { + RNP_LOG("failed to write generated seckey"); + return false; + } + + std::vector key_ptrs; /* holds primary and pubkey, when used */ + // if this is a subkey, add the primary in first + if (primary_key) { + key_ptrs.push_back(primary_key); + } + // G10 needs the pubkey for copying some attributes (key version, creation time, etc) + key_ptrs.push_back(pubkey); + + rnp::MemorySource memsrc(memdst.memory(), memdst.writeb(), false); + rnp::KeyProvider prov(rnp_key_provider_key_ptr_list, &key_ptrs); + if (!key_store.get()->load_g10(memsrc.src(), &prov)) { + return false; + } + if (key_store.get()->key_count() != 1) { + return false; + } + // if a primary key is provided, it should match the sub with regards to type + assert(!primary_key || (primary_key->is_secret() == key_store->keys.front().is_secret())); + *dst = pgp_key_t(key_store->keys.front()); + return true; +} + +static uint8_t +pk_alg_default_flags(pgp_pubkey_alg_t alg) +{ + // just use the full capabilities as the ultimate fallback + return pgp_pk_alg_capabilities(alg); +} + +static void +adjust_hash_alg(rnp_keygen_crypto_params_t &crypto) +{ + if (!crypto.hash_alg) { + crypto.hash_alg = (pgp_hash_alg_t) DEFAULT_HASH_ALGS[0]; + } + + if ((crypto.key_alg != PGP_PKA_DSA) && (crypto.key_alg != PGP_PKA_ECDSA)) { + return; + } + + pgp_hash_alg_t min_hash = (crypto.key_alg == PGP_PKA_ECDSA) ? + ecdsa_get_min_hash(crypto.ecc.curve) : + dsa_get_min_hash(crypto.dsa.q_bitlen); + + if (rnp::Hash::size(crypto.hash_alg) < rnp::Hash::size(min_hash)) { + crypto.hash_alg = min_hash; + } +} + +static void +keygen_merge_crypto_defaults(rnp_keygen_crypto_params_t &crypto) +{ + // default to RSA + if (!crypto.key_alg) { + crypto.key_alg = PGP_PKA_RSA; + } + + switch (crypto.key_alg) { + case PGP_PKA_RSA: + if (!crypto.rsa.modulus_bit_len) { + crypto.rsa.modulus_bit_len = DEFAULT_RSA_NUMBITS; + } + break; + + case PGP_PKA_SM2: + if (!crypto.hash_alg) { + crypto.hash_alg = PGP_HASH_SM3; + } + if (!crypto.ecc.curve) { + crypto.ecc.curve = PGP_CURVE_SM2_P_256; + } + break; + + case PGP_PKA_ECDH: + case PGP_PKA_ECDSA: { + if (!crypto.hash_alg) { + crypto.hash_alg = (pgp_hash_alg_t) DEFAULT_HASH_ALGS[0]; + } + break; + } + + case PGP_PKA_EDDSA: + if (!crypto.ecc.curve) { + crypto.ecc.curve = PGP_CURVE_ED25519; + } + break; + + case PGP_PKA_DSA: { + if (!crypto.dsa.p_bitlen) { + crypto.dsa.p_bitlen = DSA_DEFAULT_P_BITLEN; + } + if (!crypto.dsa.q_bitlen) { + crypto.dsa.q_bitlen = dsa_choose_qsize_by_psize(crypto.dsa.p_bitlen); + } + break; + } + default: + break; + } + + adjust_hash_alg(crypto); +} + +static bool +validate_keygen_primary(const rnp_keygen_primary_desc_t &desc) +{ + /* Confirm that the specified pk alg can certify. + * gpg requires this, though the RFC only says that a V4 primary + * key SHOULD be a key capable of certification. + */ + if (!(pgp_pk_alg_capabilities(desc.crypto.key_alg) & PGP_KF_CERTIFY)) { + RNP_LOG("primary key alg (%d) must be able to sign", desc.crypto.key_alg); + return false; + } + + // check key flags + if (!desc.cert.key_flags) { + // these are probably not *technically* required + RNP_LOG("key flags are required"); + return false; + } else if (desc.cert.key_flags & ~pgp_pk_alg_capabilities(desc.crypto.key_alg)) { + // check the flags against the alg capabilities + RNP_LOG("usage not permitted for pk algorithm"); + return false; + } + // require a userid + if (!desc.cert.userid[0]) { + RNP_LOG("userid is required for primary key"); + return false; + } + return true; +} + +static uint32_t +get_numbits(const rnp_keygen_crypto_params_t *crypto) +{ + switch (crypto->key_alg) { + case PGP_PKA_RSA: + case PGP_PKA_RSA_ENCRYPT_ONLY: + case PGP_PKA_RSA_SIGN_ONLY: + return crypto->rsa.modulus_bit_len; + case PGP_PKA_ECDSA: + case PGP_PKA_ECDH: + case PGP_PKA_EDDSA: + case PGP_PKA_SM2: { + if (auto curve = ec::Curve::get(crypto->ecc.curve)) { + return curve->bitlen; + } else { + return 0; + } + } +#if defined(ENABLE_CRYPTO_REFRESH) + case PGP_PKA_ED25519: + return 255; + case PGP_PKA_X25519: + return 255; + case PGP_PKA_ED448: + return 57 * 8; // TODO: sensible? + case PGP_PKA_X448: + return 56 * 8; // TODO: sensible? +#endif + case PGP_PKA_DSA: + return crypto->dsa.p_bitlen; + case PGP_PKA_ELGAMAL: + case PGP_PKA_ELGAMAL_ENCRYPT_OR_SIGN: + return crypto->elgamal.key_bitlen; +#if defined(ENABLE_PQC) + case PGP_PKA_KYBER768_X25519: + FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER768_P256: + FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_P384: + FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER768_BP256: + FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_BP384: + return pgp_kyber_ecdh_composite_public_key_t::encoded_size(crypto->key_alg) * 8; + case PGP_PKA_DILITHIUM3_ED25519: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM3_P256: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_P384: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM3_BP256: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_BP384: + return pgp_dilithium_exdsa_composite_public_key_t::encoded_size(crypto->key_alg) * 8; + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: + return sphincsplus_pubkey_size(crypto->key_alg) * 8; +#endif + default: + return 0; + } +} + +static void +set_default_user_prefs(pgp_user_prefs_t &prefs) +{ + if (prefs.symm_algs.empty()) { + prefs.set_symm_algs( + std::vector(DEFAULT_SYMMETRIC_ALGS, + DEFAULT_SYMMETRIC_ALGS + ARRAY_SIZE(DEFAULT_SYMMETRIC_ALGS))); + } + if (prefs.hash_algs.empty()) { + prefs.set_hash_algs(std::vector( + DEFAULT_HASH_ALGS, DEFAULT_HASH_ALGS + ARRAY_SIZE(DEFAULT_HASH_ALGS))); + } + if (prefs.z_algs.empty()) { + prefs.set_z_algs(std::vector( + DEFAULT_COMPRESS_ALGS, DEFAULT_COMPRESS_ALGS + ARRAY_SIZE(DEFAULT_COMPRESS_ALGS))); + } +#if defined(ENABLE_CRYPTO_REFRESH) + if (prefs.aead_prefs.empty()) { + std::vector algs; + for (auto aead_alg : DEFAULT_AEAD_ALGS) { + for (auto sym_alg : prefs.symm_algs) { + algs.push_back(sym_alg); + algs.push_back(aead_alg); + } + } + prefs.set_aead_prefs(algs); + } +#endif +} + +static void +keygen_primary_merge_defaults(rnp_keygen_primary_desc_t &desc) +{ + keygen_merge_crypto_defaults(desc.crypto); + set_default_user_prefs(desc.cert.prefs); + + if (!desc.cert.key_flags) { + // set some default key flags if none are provided + desc.cert.key_flags = pk_alg_default_flags(desc.crypto.key_alg); + } + if (desc.cert.userid.empty()) { + char uid[MAX_ID_LENGTH] = {0}; + snprintf(uid, + sizeof(uid), + "%s %d-bit key <%s@localhost>", + id_str_pair::lookup(pubkey_alg_map, desc.crypto.key_alg), + get_numbits(&desc.crypto), + getenv_logname()); + desc.cert.userid = uid; + } + +#if defined(ENABLE_PQC) + switch (desc.crypto.key_alg) { + case PGP_PKA_DILITHIUM3_ED25519: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM3_P256: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM3_BP256: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_P384: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_Ed448: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_BP384: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: + /* set the correct key version for PQC primary keys */ + desc.pgp_version = PGP_V6; + /* also indicate SHA3 support since it's required for PQC anyway */ + desc.cert.prefs.add_hash_alg(PGP_HASH_SHA3_256); + desc.cert.prefs.add_hash_alg(PGP_HASH_SHA3_512); + default: + break; + } +#endif +} + +bool +pgp_generate_primary_key(rnp_keygen_primary_desc_t &desc, + bool merge_defaults, + pgp_key_t & primary_sec, + pgp_key_t & primary_pub, + pgp_key_store_format_t secformat) +{ + // validate args + if (primary_sec.type() || primary_pub.type()) { + RNP_LOG("invalid parameters (should be zeroed)"); + return false; + } + + try { + // merge some defaults in, if requested + if (merge_defaults) { + keygen_primary_merge_defaults(desc); + } + // now validate the keygen fields + if (!validate_keygen_primary(desc)) { + return false; + } + + // generate the raw key and fill tag/secret fields + pgp_key_pkt_t secpkt; + if (!pgp_generate_seckey(desc.crypto, secpkt, true, desc.pgp_version)) { + return false; + } + + pgp_key_t sec(secpkt); + pgp_key_t pub(secpkt, true); +#if defined(ENABLE_CRYPTO_REFRESH) + // for v6 packets, a direct-key sig is mandatory. + if (sec.version() == PGP_V6) { + sec.add_direct_sig(desc.cert, desc.crypto.hash_alg, *desc.crypto.ctx, &pub); + } +#endif + sec.add_uid_cert(desc.cert, desc.crypto.hash_alg, *desc.crypto.ctx, &pub); + + switch (secformat) { + case PGP_KEY_STORE_GPG: + case PGP_KEY_STORE_KBX: + primary_sec = std::move(sec); + primary_pub = std::move(pub); + break; + case PGP_KEY_STORE_G10: + primary_pub = std::move(pub); + if (!load_generated_g10_key( + &primary_sec, &secpkt, NULL, &primary_pub, *desc.crypto.ctx)) { + RNP_LOG("failed to load generated key"); + return false; + } + break; + default: + RNP_LOG("invalid format"); + return false; + } + } catch (const std::exception &e) { + RNP_LOG("Failure: %s", e.what()); + return false; + } + + /* mark it as valid */ + primary_pub.mark_valid(); + primary_sec.mark_valid(); + /* refresh key's data */ + return primary_pub.refresh_data(*desc.crypto.ctx) && + primary_sec.refresh_data(*desc.crypto.ctx); +} + +static bool +validate_keygen_subkey(rnp_keygen_subkey_desc_t &desc) +{ + if (!desc.binding.key_flags) { + RNP_LOG("key flags are required"); + return false; + } else if (desc.binding.key_flags & ~pgp_pk_alg_capabilities(desc.crypto.key_alg)) { + // check the flags against the alg capabilities + RNP_LOG("usage not permitted for pk algorithm"); + return false; + } +#if defined(ENABLE_PQC) + switch (desc.crypto.key_alg) { + case PGP_PKA_KYBER768_X25519: + FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER768_P256: + FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_P384: + FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER768_BP256: + FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_BP384: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM3_ED25519: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM3_P256: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_P384: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM3_BP256: + FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_BP384: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: + if (desc.pgp_version != PGP_V6) { + RNP_LOG("PQC subkey requires this to be a v6 certificate"); + return false; + } + default: + break; + } +#endif + return true; +} + +static void +keygen_subkey_merge_defaults(rnp_keygen_subkey_desc_t &desc) +{ + keygen_merge_crypto_defaults(desc.crypto); + if (!desc.binding.key_flags) { + // set some default key flags if none are provided + desc.binding.key_flags = pk_alg_default_flags(desc.crypto.key_alg); + } +} + +bool +pgp_generate_subkey(rnp_keygen_subkey_desc_t & desc, + bool merge_defaults, + pgp_key_t & primary_sec, + pgp_key_t & primary_pub, + pgp_key_t & subkey_sec, + pgp_key_t & subkey_pub, + const pgp_password_provider_t &password_provider, + pgp_key_store_format_t secformat) +{ + // validate args + if (!primary_sec.is_primary() || !primary_pub.is_primary() || !primary_sec.is_secret() || + !primary_pub.is_public()) { + RNP_LOG("invalid parameters"); + return false; + } + if (subkey_sec.type() || subkey_pub.type()) { + RNP_LOG("invalid parameters (should be zeroed)"); + return false; + } + + // merge some defaults in, if requested + if (merge_defaults) { + keygen_subkey_merge_defaults(desc); +#if defined(ENABLE_CRYPTO_REFRESH) + // by default make subkey version match primary key version + desc.pgp_version = primary_sec.version(); +#endif + } + + // now validate the keygen fields + if (!validate_keygen_subkey(desc)) { + return false; + } + +#if defined(ENABLE_CRYPTO_REFRESH) + // assure that key versions match between subkeys + if (desc.pgp_version != primary_sec.version()) { + RNP_LOG("primary and subkey versions do not match"); + return false; + } +#endif + + try { + /* decrypt the primary seckey if needed (for signatures) */ + rnp::KeyLocker primlock(primary_sec); + if (primary_sec.encrypted() && + !primary_sec.unlock(password_provider, PGP_OP_ADD_SUBKEY)) { + RNP_LOG("Failed to unlock primary key."); + return false; + } + /* generate the raw subkey */ + pgp_key_pkt_t secpkt; + if (!pgp_generate_seckey(desc.crypto, secpkt, false, desc.pgp_version)) { + return false; + } + pgp_key_pkt_t pubpkt = pgp_key_pkt_t(secpkt, true); + pgp_key_t sec(secpkt, primary_sec); + pgp_key_t pub(pubpkt, primary_pub); + /* add binding */ + primary_sec.add_sub_binding( + sec, pub, desc.binding, desc.crypto.hash_alg, *desc.crypto.ctx); + /* copy to the result */ + subkey_pub = std::move(pub); + switch (secformat) { + case PGP_KEY_STORE_GPG: + case PGP_KEY_STORE_KBX: + subkey_sec = std::move(sec); + break; + case PGP_KEY_STORE_G10: + if (!load_generated_g10_key( + &subkey_sec, &secpkt, &primary_sec, &subkey_pub, *desc.crypto.ctx)) { + RNP_LOG("failed to load generated key"); + return false; + } + break; + default: + RNP_LOG("invalid format"); + return false; + } + + subkey_pub.mark_valid(); + subkey_sec.mark_valid(); + return subkey_pub.refresh_data(&primary_pub, *desc.crypto.ctx) && + subkey_sec.refresh_data(&primary_sec, *desc.crypto.ctx); + } catch (const std::exception &e) { + RNP_LOG("Subkey generation failed: %s", e.what()); + return false; + } +} diff --git a/src/lib/key.cpp b/src/lib/key.cpp index 5162d78bf3..0eb3af9ffc 100644 --- a/src/lib/key.cpp +++ b/src/lib/key.cpp @@ -395,11 +395,11 @@ find_suitable_key( if (pref_pqc_sub && op == PGP_OP_ENCRYPT) { /* prefer PQC encryption over non-PQC encryption. Assume non-PQC key is only there * for backwards compatibility. */ - if (subkey && subkey->is_pqc_alg() && !cur->is_pqc_alg()) { + if (subkey && subkey->is_pqc() && !cur->is_pqc()) { /* do not override already found PQC key with non-PQC key */ continue; } - if (subkey && cur->is_pqc_alg() && !subkey->is_pqc_alg()) { + if (subkey && cur->is_pqc() && !subkey->is_pqc()) { /* override non-PQC key with PQC key */ subkey = cur; continue; @@ -930,11 +930,13 @@ Key::has_secret() const noexcept #if defined(ENABLE_PQC) bool -Key::is_pqc_alg() const +Key::is_pqc_alg(pgp_pubkey_alg_t alg) { - switch (alg()) { + switch (alg) { case PGP_PKA_KYBER768_X25519: FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -945,6 +947,8 @@ Key::is_pqc_alg() const FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -953,14 +957,22 @@ Key::is_pqc_alg() const FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_BP384: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: return true; default: return false; } } + +bool +Key::is_pqc() const noexcept +{ + return Key::is_pqc_alg(alg()); +} #endif bool @@ -2104,9 +2116,12 @@ Key::sign_init(RNG & rng, sig.set_keyid(keyid()); } #if defined(ENABLE_CRYPTO_REFRESH) - if (version == PGP_V6) { - sig.salt.resize(Hash::size(sig.halg) / 2); - rng.get(sig.salt.data(), sig.salt.size()); + if (version == PGP_V6 && sig.salt.empty()) { + /* salt is either set (OPS, etc) or empty (key sigs) and needs to be set here */ + size_t salt_size; + assert(pgp::pkt::Signature::v6_salt_size(sig.halg, &salt_size)); + sig.salt.resize(salt_size); + rng.get(sig.salt.data(), salt_size); } #endif } @@ -2577,8 +2592,10 @@ pgp_pk_alg_capabilities(pgp_pubkey_alg_t alg) #if defined(ENABLE_CRYPTO_REFRESH) case PGP_PKA_ED25519: + case PGP_PKA_ED448: return pgp_key_flags_t(PGP_KF_SIGN | PGP_KF_CERTIFY | PGP_KF_AUTH); case PGP_PKA_X25519: + case PGP_PKA_X448: return PGP_KF_ENCRYPT; #endif @@ -2592,7 +2609,8 @@ pgp_pk_alg_capabilities(pgp_pubkey_alg_t alg) #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_KYBER1024_X448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -2604,7 +2622,8 @@ pgp_pk_alg_capabilities(pgp_pubkey_alg_t alg) case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; - // TODO: Add case PGP_PKA_DILITHIUM5_ED448: FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -2613,9 +2632,11 @@ pgp_pk_alg_capabilities(pgp_pubkey_alg_t alg) FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_BP384: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: return pgp_key_flags_t(PGP_KF_SIGN | PGP_KF_CERTIFY | PGP_KF_AUTH); #endif diff --git a/src/lib/key.hpp b/src/lib/key.hpp index 1a623c1122..99faa2dee7 100644 --- a/src/lib/key.hpp +++ b/src/lib/key.hpp @@ -142,7 +142,8 @@ class Key { bool can_encrypt() const noexcept; bool has_secret() const noexcept; #if defined(ENABLE_PQC) - bool is_pqc_alg() const; + bool is_pqc() const noexcept; + static bool is_pqc_alg(pgp_pubkey_alg_t alg); #endif /** * @brief Check whether key is usable for the specified operation. diff --git a/src/lib/key_material.cpp b/src/lib/key_material.cpp index 6a592d0285..47d394f80a 100644 --- a/src/lib/key_material.cpp +++ b/src/lib/key_material.cpp @@ -148,6 +148,10 @@ KeyParams::create(pgp_pubkey_alg_t alg) return std::unique_ptr(new ECCKeyParams(PGP_CURVE_ED25519)); case PGP_PKA_X25519: return std::unique_ptr(new ECCKeyParams(PGP_CURVE_25519)); + case PGP_PKA_ED448: + return std::unique_ptr(new ECCKeyParams(PGP_CURVE_ED448)); + case PGP_PKA_X448: + return std::unique_ptr(new ECCKeyParams(PGP_CURVE_448)); #endif case PGP_PKA_DSA: return std::unique_ptr(new DSAKeyParams()); @@ -157,7 +161,8 @@ KeyParams::create(pgp_pubkey_alg_t alg) #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_KYBER1024_X448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -168,7 +173,8 @@ KeyParams::create(pgp_pubkey_alg_t alg) return std::unique_ptr(new MlkemEcdhKeyParams(alg)); case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_DILITHIUM5_ED448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -177,10 +183,12 @@ KeyParams::create(pgp_pubkey_alg_t alg) FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_BP384: return std::unique_ptr(new DilithiumEccKeyParams(alg)); - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: - return std::unique_ptr(new SlhdsaKeyParams()); + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: + return std::unique_ptr(new SlhdsaKeyParams(alg)); #endif default: throw rnp::rnp_exception(RNP_ERROR_BAD_PARAMETERS); @@ -230,7 +238,7 @@ DilithiumEccKeyParams::bits() const noexcept size_t SlhdsaKeyParams::bits() const noexcept { - return sphincsplus_pubkey_size(param_) * 8; + return sphincsplus_pubkey_size(alg_) * 8; } #endif @@ -395,13 +403,18 @@ KeyMaterial::create(pgp_pubkey_alg_t alg) return std::unique_ptr(new Ed25519KeyMaterial()); case PGP_PKA_X25519: return std::unique_ptr(new X25519KeyMaterial()); + case PGP_PKA_ED448: + return std::unique_ptr(new Ed448KeyMaterial()); + case PGP_PKA_X448: + return std::unique_ptr(new X448KeyMaterial()); #endif case PGP_PKA_SM2: return std::unique_ptr(new SM2KeyMaterial()); #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_KYBER1024_X448 + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -412,7 +425,8 @@ KeyMaterial::create(pgp_pubkey_alg_t alg) return std::unique_ptr(new MlkemEcdhKeyMaterial(alg)); case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_DILITHIUM5_ED448 + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -421,9 +435,11 @@ KeyMaterial::create(pgp_pubkey_alg_t alg) FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_BP384: return std::unique_ptr(new DilithiumEccKeyMaterial(alg)); - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: return std::unique_ptr(new SlhdsaKeyMaterial(alg)); #endif default: @@ -1500,6 +1516,21 @@ Ed25519KeyMaterial::sign(rnp::SecurityContext & ctx, &ctx.rng, ed25519->sig.sig, key_.priv, hash.data(), hash.size()); } +pgp_hash_alg_t +Ed25519KeyMaterial::adjust_hash(pgp_hash_alg_t hash) const +{ + if (!sig_hash_allowed(hash)) { + return PGP_HASH_SHA256; + } + return hash; +} + +bool +Ed25519KeyMaterial::sig_hash_allowed(pgp_hash_alg_t hash) const +{ + return rnp::Hash::size(hash) >= 32; +} + size_t Ed25519KeyMaterial::bits() const noexcept { @@ -1653,6 +1684,275 @@ X25519KeyMaterial::priv() const noexcept { return key_.priv; } + +std::unique_ptr +Ed448KeyMaterial::clone() +{ + return std::unique_ptr(new Ed448KeyMaterial(*this)); +} + +void +Ed448KeyMaterial::grip_update(rnp::Hash &hash) const +{ + // TODO: if GnuPG would ever support v6, check whether this works correctly. + hash.add(pub()); +} + +bool +Ed448KeyMaterial::validate_material(rnp::SecurityContext &ctx, bool reset) +{ + return !ed448_validate_key_native(&ctx.rng, &key_, secret_); +} + +void +Ed448KeyMaterial::clear_secret() noexcept +{ + key_.clear_secret(); + KeyMaterial::clear_secret(); +} + +bool +Ed448KeyMaterial::parse(pgp_packet_body_t &pkt) noexcept +{ + secret_ = false; + auto ec_desc = ec::Curve::get(PGP_CURVE_ED448); + std::vector buf(BITS_TO_BYTES(ec_desc->bitlen)); + if (!pkt.get(buf.data(), buf.size())) { + RNP_LOG("failed to parse Ed448 public key data"); + return false; + } + key_.pub = buf; + return true; +} + +bool +Ed448KeyMaterial::parse_secret(pgp_packet_body_t &pkt) noexcept +{ + auto ec_desc = ec::Curve::get(PGP_CURVE_ED448); + std::vector buf(BITS_TO_BYTES(ec_desc->bitlen)); + if (!pkt.get(buf.data(), buf.size())) { + RNP_LOG("failed to parse Ed448 secret key data"); + return false; + } + key_.priv = buf; + secret_ = true; + return true; +} + +void +Ed448KeyMaterial::write(pgp_packet_body_t &pkt) const +{ + pkt.add(key_.pub); +} + +void +Ed448KeyMaterial::write_secret(pgp_packet_body_t &pkt) const +{ + pkt.add(key_.priv); +} + +bool +Ed448KeyMaterial::generate(rnp::SecurityContext &ctx, const KeyParams ¶ms) +{ + if (generate_ed448_native(&ctx.rng, key_.priv, key_.pub)) { + RNP_LOG("failed to generate ED448 key"); + return false; + } + return finish_generate(); +} + +rnp_result_t +Ed448KeyMaterial::verify(const rnp::SecurityContext &ctx, + const SigMaterial & sig, + const rnp::secure_bytes & hash) const +{ + auto ed448 = dynamic_cast(&sig); + if (!ed448) { + return RNP_ERROR_BAD_PARAMETERS; + } + return ed448_verify_native(ed448->sig.sig, key_.pub, hash.data(), hash.size()); +} + +rnp_result_t +Ed448KeyMaterial::sign(rnp::SecurityContext & ctx, + SigMaterial & sig, + const rnp::secure_bytes &hash) const +{ + auto ed448 = dynamic_cast(&sig); + if (!ed448) { + return RNP_ERROR_BAD_PARAMETERS; + } + return ed448_sign_native(&ctx.rng, ed448->sig.sig, key_.priv, hash.data(), hash.size()); +} + +pgp_hash_alg_t +Ed448KeyMaterial::adjust_hash(pgp_hash_alg_t hash) const +{ + if (!sig_hash_allowed(hash)) { + return PGP_HASH_SHA256; + } + return hash; +} + +bool +Ed448KeyMaterial::sig_hash_allowed(pgp_hash_alg_t hash) const +{ + return rnp::Hash::size(hash) >= 64; +} + +size_t +Ed448KeyMaterial::bits() const noexcept +{ + return 57 * 8; +} + +pgp_curve_t +Ed448KeyMaterial::curve() const noexcept +{ + return PGP_CURVE_ED448; +} + +const std::vector & +Ed448KeyMaterial::pub() const noexcept +{ + return key_.pub; +} + +const std::vector & +Ed448KeyMaterial::priv() const noexcept +{ + return key_.priv; +} + +std::unique_ptr +X448KeyMaterial::clone() +{ + return std::unique_ptr(new X448KeyMaterial(*this)); +} + +void +X448KeyMaterial::grip_update(rnp::Hash &hash) const +{ + // TODO: if GnuPG would ever support v6, check whether this works correctly. + hash.add(pub()); +} + +bool +X448KeyMaterial::validate_material(rnp::SecurityContext &ctx, bool reset) +{ + return !x448_validate_key_native(&ctx.rng, &key_, secret_); +} + +void +X448KeyMaterial::clear_secret() noexcept +{ + key_.clear_secret(); + KeyMaterial::clear_secret(); +} + +bool +X448KeyMaterial::parse(pgp_packet_body_t &pkt) noexcept +{ + secret_ = false; + auto ec_desc = ec::Curve::get(PGP_CURVE_448); + std::vector buf(BITS_TO_BYTES(ec_desc->bitlen)); + if (!pkt.get(buf.data(), buf.size())) { + RNP_LOG("failed to parse X448 public key data"); + return false; + } + key_.pub = buf; + return true; +} + +bool +X448KeyMaterial::parse_secret(pgp_packet_body_t &pkt) noexcept +{ + auto ec_desc = ec::Curve::get(PGP_CURVE_448); + std::vector buf(BITS_TO_BYTES(ec_desc->bitlen)); + if (!pkt.get(buf.data(), buf.size())) { + RNP_LOG("failed to parse X448 secret key data"); + return false; + } + key_.priv = buf; + secret_ = true; + return true; +} + +void +X448KeyMaterial::write(pgp_packet_body_t &pkt) const +{ + pkt.add(key_.pub); +} + +void +X448KeyMaterial::write_secret(pgp_packet_body_t &pkt) const +{ + pkt.add(key_.priv); +} + +bool +X448KeyMaterial::generate(rnp::SecurityContext &ctx, const KeyParams ¶ms) +{ + if (generate_x448_native(&ctx.rng, key_.priv, key_.pub)) { + RNP_LOG("failed to generate X448 key"); + return false; + } + return finish_generate(); +} + +rnp_result_t +X448KeyMaterial::encrypt(rnp::SecurityContext & ctx, + EncMaterial & out, + const rnp::secure_bytes &data) const +{ + auto x448 = dynamic_cast(&out); + if (!x448) { + return RNP_ERROR_BAD_PARAMETERS; + } + return x25519_native_encrypt(&ctx.rng, key_.pub, data.data(), data.size(), &x448->enc); +} + +rnp_result_t +X448KeyMaterial::decrypt(rnp::SecurityContext &ctx, + rnp::secure_bytes & out, + const EncMaterial & in) const +{ + auto x448 = dynamic_cast(&in); + if (!x448) { + return RNP_ERROR_BAD_PARAMETERS; + } + out.resize(PGP_MPINT_SIZE); + size_t out_size = out.size(); + auto ret = x448_native_decrypt(&ctx.rng, key_, &x448->enc, out.data(), &out_size); + if (!ret) { + out.resize(out_size); + } + return ret; +} + +size_t +X448KeyMaterial::bits() const noexcept +{ + return 56 * 8; +} + +pgp_curve_t +X448KeyMaterial::curve() const noexcept +{ + return PGP_CURVE_448; +} + +const std::vector & +X448KeyMaterial::pub() const noexcept +{ + return key_.pub; +} + +const std::vector & +X448KeyMaterial::priv() const noexcept +{ + return key_.priv; +} #endif #if defined(ENABLE_PQC) @@ -1752,7 +2052,7 @@ MlkemEcdhKeyMaterial::decrypt(rnp::SecurityContext &ctx, } out.resize(PGP_MPINT_SIZE); size_t out_size = out.size(); - auto ret = key_.priv.decrypt(&ctx.rng, out.data(), &out_size, &mlkem->enc); + auto ret = key_.priv.decrypt(&ctx.rng, out.data(), &out_size, &mlkem->enc, pub()); if (!ret) { out.resize(out_size); } @@ -1878,7 +2178,16 @@ DilithiumEccKeyMaterial::sign(rnp::SecurityContext & ctx, pgp_hash_alg_t DilithiumEccKeyMaterial::adjust_hash(pgp_hash_alg_t hash) const { - return dilithium_default_hash_alg(); + if (!sig_hash_allowed(hash)) { + return PGP_HASH_SHA256; + } + return hash; +} + +bool +DilithiumEccKeyMaterial::sig_hash_allowed(pgp_hash_alg_t hash) const +{ + return rnp::Hash::size(hash) >= 32; } size_t @@ -1928,15 +2237,9 @@ bool SlhdsaKeyMaterial::parse(pgp_packet_body_t &pkt) noexcept { secret_ = false; - uint8_t bt = 0; - if (!pkt.get(bt)) { - RNP_LOG("failed to parse SLH-DSA public key data"); - return false; - } - sphincsplus_parameter_t param = (sphincsplus_parameter_t) bt; - auto size = sphincsplus_pubkey_size(param); + auto size = sphincsplus_pubkey_size(alg()); if (!size) { - RNP_LOG("invalid SLH-DSA param"); + RNP_LOG("invalid algorithm"); return false; } std::vector buf(size); @@ -1944,25 +2247,19 @@ SlhdsaKeyMaterial::parse(pgp_packet_body_t &pkt) noexcept RNP_LOG("failed to parse SLH-DSA public key data"); return false; } - key_.pub = pgp_sphincsplus_public_key_t(buf, param, alg()); + key_.pub = pgp_sphincsplus_public_key_t(buf, alg()); return true; } bool SlhdsaKeyMaterial::parse_secret(pgp_packet_body_t &pkt) noexcept { - uint8_t bt = 0; - if (!pkt.get(bt)) { - RNP_LOG("failed to parse SLH-DSA secret key data"); - return false; - } - sphincsplus_parameter_t param = (sphincsplus_parameter_t) bt; - std::vector buf(sphincsplus_privkey_size(param)); + std::vector buf(sphincsplus_privkey_size(alg())); if (!pkt.get(buf.data(), buf.size())) { RNP_LOG("failed to parse SLH-DSA secret key data"); return false; } - key_.priv = pgp_sphincsplus_private_key_t(buf, param, alg()); + key_.priv = pgp_sphincsplus_private_key_t(buf, alg()); secret_ = true; return true; } @@ -1970,22 +2267,19 @@ SlhdsaKeyMaterial::parse_secret(pgp_packet_body_t &pkt) noexcept void SlhdsaKeyMaterial::write(pgp_packet_body_t &pkt) const { - pkt.add_byte((uint8_t) key_.pub.param()); pkt.add(key_.pub.get_encoded()); } void SlhdsaKeyMaterial::write_secret(pgp_packet_body_t &pkt) const { - pkt.add_byte((uint8_t) key_.priv.param()); pkt.add(key_.priv.get_encoded()); } bool SlhdsaKeyMaterial::generate(rnp::SecurityContext &ctx, const KeyParams ¶ms) { - auto &slhdsa = dynamic_cast(params); - if (pgp_sphincsplus_generate(&ctx.rng, &key_, slhdsa.param(), alg_)) { + if (pgp_sphincsplus_generate(&ctx.rng, &key_, alg_)) { RNP_LOG("failed to generate SLH-DSA key for PK alg %d", alg_); return false; } @@ -2019,13 +2313,16 @@ SlhdsaKeyMaterial::sign(rnp::SecurityContext & ctx, pgp_hash_alg_t SlhdsaKeyMaterial::adjust_hash(pgp_hash_alg_t hash) const { - return sphincsplus_default_hash_alg(alg_, key_.pub.param()); + if (!sig_hash_allowed(hash)) { + return PGP_HASH_SHA256; + } + return hash; } bool SlhdsaKeyMaterial::sig_hash_allowed(pgp_hash_alg_t hash) const { - return key_.pub.validate_signature_hash_requirements(hash); + return rnp::Hash::size(hash) >= 32; } size_t diff --git a/src/lib/key_material.hpp b/src/lib/key_material.hpp index a7c74495ca..7728397e22 100644 --- a/src/lib/key_material.hpp +++ b/src/lib/key_material.hpp @@ -157,23 +157,10 @@ class DilithiumEccKeyParams : public KeyParams { class SlhdsaKeyParams : public KeyParams { private: - sphincsplus_parameter_t param_; + pgp_pubkey_alg_t alg_; public: - SlhdsaKeyParams() : param_(sphincsplus_simple_128f){}; - - sphincsplus_parameter_t - param() const noexcept - { - return param_; - } - - void - set_param(sphincsplus_parameter_t value) noexcept - { - param_ = value; - } - + SlhdsaKeyParams(pgp_pubkey_alg_t alg) : alg_(alg){}; size_t bits() const noexcept override; }; #endif @@ -479,18 +466,50 @@ class Ed25519KeyMaterial : public KeyMaterial { Ed25519KeyMaterial() : KeyMaterial(PGP_PKA_ED25519), key_{} {}; std::unique_ptr clone() override; + void clear_secret() noexcept override; + bool parse(pgp_packet_body_t &pkt) noexcept override; + bool parse_secret(pgp_packet_body_t &pkt) noexcept override; + void write(pgp_packet_body_t &pkt) const override; + void write_secret(pgp_packet_body_t &pkt) const override; + bool generate(rnp::SecurityContext &ctx, const KeyParams ¶ms) override; + rnp_result_t verify(const rnp::SecurityContext &ctx, + const SigMaterial & sig, + const rnp::secure_bytes & hash) const override; + rnp_result_t sign(rnp::SecurityContext & ctx, + SigMaterial & sig, + const rnp::secure_bytes &hash) const override; + pgp_hash_alg_t adjust_hash(pgp_hash_alg_t hash) const override; + bool sig_hash_allowed(pgp_hash_alg_t hash) const override; + size_t bits() const noexcept override; + pgp_curve_t curve() const noexcept override; + + const std::vector &pub() const noexcept; + const std::vector &priv() const noexcept; +}; + +class X25519KeyMaterial : public KeyMaterial { + pgp_x25519_key_t key_; + + protected: + void grip_update(rnp::Hash &hash) const override; + bool validate_material(rnp::SecurityContext &ctx, bool reset) override; + + public: + X25519KeyMaterial() : KeyMaterial(PGP_PKA_X25519), key_{} {}; + std::unique_ptr clone() override; + void clear_secret() noexcept override; bool parse(pgp_packet_body_t &pkt) noexcept override; bool parse_secret(pgp_packet_body_t &pkt) noexcept override; void write(pgp_packet_body_t &pkt) const override; void write_secret(pgp_packet_body_t &pkt) const override; bool generate(rnp::SecurityContext &ctx, const KeyParams ¶ms) override; - rnp_result_t verify(const rnp::SecurityContext &ctx, - const SigMaterial & sig, - const rnp::secure_bytes & hash) const override; - rnp_result_t sign(rnp::SecurityContext & ctx, - SigMaterial & sig, - const rnp::secure_bytes &hash) const override; + rnp_result_t encrypt(rnp::SecurityContext & ctx, + EncMaterial & out, + const rnp::secure_bytes &data) const override; + rnp_result_t decrypt(rnp::SecurityContext &ctx, + rnp::secure_bytes & out, + const EncMaterial & in) const override; size_t bits() const noexcept override; pgp_curve_t curve() const noexcept override; @@ -498,15 +517,48 @@ class Ed25519KeyMaterial : public KeyMaterial { const std::vector &priv() const noexcept; }; -class X25519KeyMaterial : public KeyMaterial { - pgp_x25519_key_t key_; +class Ed448KeyMaterial : public KeyMaterial { + pgp_ed448_key_t key_; protected: void grip_update(rnp::Hash &hash) const override; bool validate_material(rnp::SecurityContext &ctx, bool reset) override; public: - X25519KeyMaterial() : KeyMaterial(PGP_PKA_X25519), key_{} {}; + Ed448KeyMaterial() : KeyMaterial(PGP_PKA_ED448), key_{} {}; + std::unique_ptr clone() override; + + void clear_secret() noexcept override; + bool parse(pgp_packet_body_t &pkt) noexcept override; + bool parse_secret(pgp_packet_body_t &pkt) noexcept override; + void write(pgp_packet_body_t &pkt) const override; + void write_secret(pgp_packet_body_t &pkt) const override; + bool generate(rnp::SecurityContext &ctx, const KeyParams ¶ms) override; + rnp_result_t verify(const rnp::SecurityContext &ctx, + const SigMaterial & sig, + const rnp::secure_bytes & hash) const override; + rnp_result_t sign(rnp::SecurityContext & ctx, + SigMaterial & sig, + const rnp::secure_bytes &hash) const override; + pgp_hash_alg_t adjust_hash(pgp_hash_alg_t hash) const override; + bool sig_hash_allowed(pgp_hash_alg_t hash) const override; + + size_t bits() const noexcept override; + pgp_curve_t curve() const noexcept override; + + const std::vector &pub() const noexcept; + const std::vector &priv() const noexcept; +}; + +class X448KeyMaterial : public KeyMaterial { + pgp_x448_key_t key_; + + protected: + void grip_update(rnp::Hash &hash) const override; + bool validate_material(rnp::SecurityContext &ctx, bool reset) override; + + public: + X448KeyMaterial() : KeyMaterial(PGP_PKA_X448), key_{} {}; std::unique_ptr clone() override; void clear_secret() noexcept override; @@ -585,6 +637,7 @@ class DilithiumEccKeyMaterial : public KeyMaterial { SigMaterial & sig, const rnp::secure_bytes &hash) const override; pgp_hash_alg_t adjust_hash(pgp_hash_alg_t hash) const override; + bool sig_hash_allowed(pgp_hash_alg_t hash) const override; size_t bits() const noexcept override; const pgp_dilithium_exdsa_composite_public_key_t & pub() const noexcept; diff --git a/src/lib/keygen.cpp b/src/lib/keygen.cpp index 0671372013..418829539c 100644 --- a/src/lib/keygen.cpp +++ b/src/lib/keygen.cpp @@ -42,6 +42,7 @@ KeygenParams::check_defaults() noexcept if (hash_ == PGP_HASH_UNKNOWN) { hash_ = alg_ == PGP_PKA_SM2 ? PGP_HASH_SM3 : DEFAULT_PGP_HASH_ALG; } + pgp_hash_alg_t min_hash = key_params_->min_hash(); if (Hash::size(hash_) < Hash::size(min_hash)) { hash_ = min_hash; @@ -52,37 +53,6 @@ KeygenParams::check_defaults() noexcept bool KeygenParams::validate() const noexcept { -#if defined(ENABLE_PQC) - switch (alg()) { - case PGP_PKA_SPHINCSPLUS_SHA2: - FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: { - auto &slhdsa = dynamic_cast(key_params()); - if (!sphincsplus_hash_allowed(alg(), slhdsa.param(), hash())) { - RNP_LOG("invalid hash algorithm for the slhdsa key"); - return false; - } - break; - } - case PGP_PKA_DILITHIUM3_ED25519: - FALLTHROUGH_STATEMENT; - // TODO: Add case PGP_PKA_DILITHIUM5_ED448: FALLTHROUGH_STATEMENT; - case PGP_PKA_DILITHIUM3_P256: - FALLTHROUGH_STATEMENT; - case PGP_PKA_DILITHIUM5_P384: - FALLTHROUGH_STATEMENT; - case PGP_PKA_DILITHIUM3_BP256: - FALLTHROUGH_STATEMENT; - case PGP_PKA_DILITHIUM5_BP384: - if (!dilithium_hash_allowed(hash())) { - RNP_LOG("invalid hash algorithm for the dilithium key"); - return false; - } - break; - default: - break; - } -#endif return true; } @@ -132,36 +102,38 @@ KeygenParams::validate(const BindingParams &binding) const noexcept return validate(); } -static const id_str_pair pubkey_alg_map[] = {{PGP_PKA_RSA, "RSA (Encrypt or Sign)"}, - {PGP_PKA_RSA_ENCRYPT_ONLY, "RSA Encrypt-Only"}, - {PGP_PKA_RSA_SIGN_ONLY, "RSA Sign-Only"}, - {PGP_PKA_ELGAMAL, "Elgamal (Encrypt-Only)"}, - {PGP_PKA_DSA, "DSA"}, - {PGP_PKA_ECDH, "ECDH"}, - {PGP_PKA_ECDSA, "ECDSA"}, - {PGP_PKA_EDDSA, "EdDSA"}, - {PGP_PKA_SM2, "SM2"}, +static const id_str_pair pubkey_alg_map[] = { + {PGP_PKA_RSA, "RSA (Encrypt or Sign)"}, + {PGP_PKA_RSA_ENCRYPT_ONLY, "RSA Encrypt-Only"}, + {PGP_PKA_RSA_SIGN_ONLY, "RSA Sign-Only"}, + {PGP_PKA_ELGAMAL, "Elgamal (Encrypt-Only)"}, + {PGP_PKA_DSA, "DSA"}, + {PGP_PKA_ECDH, "ECDH"}, + {PGP_PKA_ECDSA, "ECDSA"}, + {PGP_PKA_EDDSA, "EdDSA"}, + {PGP_PKA_SM2, "SM2"}, #if defined(ENABLE_CRYPTO_REFRESH) - {PGP_PKA_ED25519, "ED25519"}, - {PGP_PKA_X25519, "X25519"}, + {PGP_PKA_ED25519, "ED25519"}, + {PGP_PKA_X25519, "X25519"}, #endif #if defined(ENABLE_PQC) - {PGP_PKA_KYBER768_X25519, "ML-KEM-768_X25519"}, - //{PGP_PKA_KYBER1024_X448, "Kyber-X448"}, - {PGP_PKA_KYBER768_P256, "ML-KEM-768_P256"}, - {PGP_PKA_KYBER1024_P384, "ML-KEM-1024_P384"}, - {PGP_PKA_KYBER768_BP256, "ML-KEM-768_BP256"}, - {PGP_PKA_KYBER1024_BP384, "ML-KEM-1024_BP384"}, - {PGP_PKA_DILITHIUM3_ED25519, "ML-DSA-65_ED25519"}, - //{PGP_PKA_DILITHIUM5_ED448, "Dilithium-ED448"}, - {PGP_PKA_DILITHIUM3_P256, "ML-DSA-65_P256"}, - {PGP_PKA_DILITHIUM5_P384, "ML-DSA-87_P384"}, - {PGP_PKA_DILITHIUM3_BP256, "ML-DSA-65_BP256"}, - {PGP_PKA_DILITHIUM5_BP384, "ML-DSA-87_BP384"}, - {PGP_PKA_SPHINCSPLUS_SHA2, "SLH-DSA-SHA2"}, - {PGP_PKA_SPHINCSPLUS_SHAKE, "SLH-DSA-SHAKE"}, + {PGP_PKA_KYBER768_X25519, "ML-KEM-768_X25519"}, + //{PGP_PKA_KYBER1024_X448, "Kyber-X448"}, + {PGP_PKA_KYBER768_P256, "ML-KEM-768_P256"}, + {PGP_PKA_KYBER1024_P384, "ML-KEM-1024_P384"}, + {PGP_PKA_KYBER768_BP256, "ML-KEM-768_BP256"}, + {PGP_PKA_KYBER1024_BP384, "ML-KEM-1024_BP384"}, + {PGP_PKA_DILITHIUM3_ED25519, "ML-DSA-65_ED25519"}, + //{PGP_PKA_DILITHIUM5_ED448, "Dilithium-ED448"}, + {PGP_PKA_DILITHIUM3_P256, "ML-DSA-65_P256"}, + {PGP_PKA_DILITHIUM5_P384, "ML-DSA-87_P384"}, + {PGP_PKA_DILITHIUM3_BP256, "ML-DSA-65_BP256"}, + {PGP_PKA_DILITHIUM5_BP384, "ML-DSA-87_BP384"}, + {PGP_PKA_SPHINCSPLUS_SHAKE_128f, "SLH-DSA-SHAKE-128f"}, + {PGP_PKA_SPHINCSPLUS_SHAKE_128s, "SLH-DSA-SHAKE-128s"}, + {PGP_PKA_SPHINCSPLUS_SHAKE_256s, "SLH-DSA-SHAKE-256s"}, #endif - {0, NULL}}; + {0, NULL}}; bool KeygenParams::generate(pgp_key_pkt_t &seckey, bool primary) diff --git a/src/lib/rnp.cpp b/src/lib/rnp.cpp index 6a8d6223ce..b40dd8d4ce 100644 --- a/src/lib/rnp.cpp +++ b/src/lib/rnp.cpp @@ -161,22 +161,25 @@ static const id_str_pair pubkey_alg_map[] = { #if defined(ENABLE_CRYPTO_REFRESH) {PGP_PKA_ED25519, RNP_ALGNAME_ED25519}, {PGP_PKA_X25519, RNP_ALGNAME_X25519}, + {PGP_PKA_ED448, RNP_ALGNAME_ED448}, + {PGP_PKA_X448, RNP_ALGNAME_X448}, #endif #if defined(ENABLE_PQC) {PGP_PKA_KYBER768_X25519, RNP_ALGNAME_KYBER768_X25519}, - //{PGP_PKA_KYBER1024_X448, RNP_ALGNAME_KYBER1024_X448}, + {PGP_PKA_KYBER1024_X448, RNP_ALGNAME_KYBER1024_X448}, {PGP_PKA_KYBER768_P256, RNP_ALGNAME_KYBER768_P256}, {PGP_PKA_KYBER1024_P384, RNP_ALGNAME_KYBER1024_P384}, {PGP_PKA_KYBER768_BP256, RNP_ALGNAME_KYBER768_BP256}, {PGP_PKA_KYBER1024_BP384, RNP_ALGNAME_KYBER1024_BP384}, {PGP_PKA_DILITHIUM3_ED25519, RNP_ALGNAME_DILITHIUM3_ED25519}, - //{PGP_PKA_DILITHIUM5_ED448, RNP_ALGNAME_DILITHIUM5_ED448}, + {PGP_PKA_DILITHIUM5_ED448, RNP_ALGNAME_DILITHIUM5_ED448}, {PGP_PKA_DILITHIUM3_P256, RNP_ALGNAME_DILITHIUM3_P256}, {PGP_PKA_DILITHIUM5_P384, RNP_ALGNAME_DILITHIUM5_P384}, {PGP_PKA_DILITHIUM3_BP256, RNP_ALGNAME_DILITHIUM3_BP256}, {PGP_PKA_DILITHIUM5_BP384, RNP_ALGNAME_DILITHIUM5_BP384}, - {PGP_PKA_SPHINCSPLUS_SHA2, RNP_ALGNAME_SPHINCSPLUS_SHA2}, - {PGP_PKA_SPHINCSPLUS_SHAKE, RNP_ALGNAME_SPHINCSPLUS_SHAKE}, + {PGP_PKA_SPHINCSPLUS_SHAKE_128f, RNP_ALGNAME_SPHINCSPLUS_SHAKE_128f}, + {PGP_PKA_SPHINCSPLUS_SHAKE_128s, RNP_ALGNAME_SPHINCSPLUS_SHAKE_128s}, + {PGP_PKA_SPHINCSPLUS_SHAKE_256s, RNP_ALGNAME_SPHINCSPLUS_SHAKE_256s}, #endif {0, NULL}}; @@ -220,16 +223,6 @@ static const id_str_pair hash_alg_map[] = {{PGP_HASH_MD5, RNP_ALGNAME_MD5}, {PGP_HASH_SM3, RNP_ALGNAME_SM3}, {0, NULL}}; -#if defined(ENABLE_PQC) -static const id_str_pair sphincsplus_params_map[] = {{sphincsplus_simple_128s, "128s"}, - {sphincsplus_simple_128f, "128f"}, - {sphincsplus_simple_192s, "192s"}, - {sphincsplus_simple_192f, "192f"}, - {sphincsplus_simple_256s, "256s"}, - {sphincsplus_simple_256f, "256f"}, - {0, NULL}}; -#endif - static const id_str_pair s2k_type_map[] = { {PGP_S2KS_SIMPLE, "Simple"}, {PGP_S2KS_SALTED, "Salted"}, @@ -344,23 +337,26 @@ pub_alg_supported(int alg) #endif #if defined(ENABLE_CRYPTO_REFRESH) case PGP_PKA_X25519: + case PGP_PKA_X448: case PGP_PKA_ED25519: + case PGP_PKA_ED448: #endif #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: - // case PGP_PKA_KYBER1024_X448: + case PGP_PKA_KYBER1024_X448: case PGP_PKA_KYBER768_P256: case PGP_PKA_KYBER1024_P384: case PGP_PKA_KYBER768_BP256: case PGP_PKA_KYBER1024_BP384: case PGP_PKA_DILITHIUM3_ED25519: - // case PGP_PKA_DILITHIUM5_ED448: + case PGP_PKA_DILITHIUM5_ED448: case PGP_PKA_DILITHIUM3_P256: case PGP_PKA_DILITHIUM5_P384: case PGP_PKA_DILITHIUM3_BP256: case PGP_PKA_DILITHIUM5_BP384: - case PGP_PKA_SPHINCSPLUS_SHA2: - case PGP_PKA_SPHINCSPLUS_SHAKE: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: #endif return true; default: @@ -5043,14 +5039,17 @@ rnp_op_generate_st::default_key_flags(pgp_pubkey_alg_t alg, bool subkey) return PGP_KF_ENCRYPT; #if defined(ENABLE_CRYPTO_REFRESH) case PGP_PKA_ED25519: + case PGP_PKA_ED448: return subkey ? PGP_KF_SIGN : pgp_key_flags_t(PGP_KF_SIGN | PGP_KF_CERTIFY); case PGP_PKA_X25519: + case PGP_PKA_X448: return PGP_KF_ENCRYPT; #endif #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_KYBER1024_X448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -5061,7 +5060,8 @@ rnp_op_generate_st::default_key_flags(pgp_pubkey_alg_t alg, bool subkey) return PGP_KF_ENCRYPT; case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_DILITHIUM5_ED448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -5070,9 +5070,11 @@ rnp_op_generate_st::default_key_flags(pgp_pubkey_alg_t alg, bool subkey) FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_BP384: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: return subkey ? PGP_KF_SIGN : pgp_key_flags_t(PGP_KF_SIGN | PGP_KF_CERTIFY); #endif default: @@ -5465,43 +5467,6 @@ try { FFI_GUARD #endif -#if defined(RNP_EXPERIMENTAL_PQC) -rnp_result_t -rnp_op_generate_set_sphincsplus_param(rnp_op_generate_t op, const char *param_cstr) -try { - if (!op || !param_cstr) { - return RNP_ERROR_NULL_POINTER; - } - auto slhdsa = dynamic_cast(&op->keygen.key_params()); - if (!slhdsa) { - return RNP_ERROR_BAD_PARAMETERS; - } - - sphincsplus_parameter_t param; - std::string param_str = param_cstr; - - if (param_str == "128s") { - param = sphincsplus_simple_128s; - } else if (param_str == "128f") { - param = sphincsplus_simple_128f; - } else if (param_str == "192s") { - param = sphincsplus_simple_192s; - } else if (param_str == "192f") { - param = sphincsplus_simple_192f; - } else if (param_str == "256s") { - param = sphincsplus_simple_256s; - } else if (param_str == "256f") { - param = sphincsplus_simple_256f; - } else { - return RNP_ERROR_BAD_PARAMETERS; - } - - slhdsa->set_param(param); - return RNP_SUCCESS; -} -FFI_GUARD -#endif - rnp_result_t rnp_op_generate_execute(rnp_op_generate_t op) try { @@ -7246,27 +7211,6 @@ try { } FFI_GUARD -#if defined(RNP_EXPERIMENTAL_PQC) -rnp_result_t -rnp_key_sphincsplus_get_param(rnp_key_handle_t handle, char **param) -try { - if (!handle || !param) { - return RNP_ERROR_NULL_POINTER; - } - auto *key = get_key_prefer_public(handle); - if (key->alg() != PGP_PKA_SPHINCSPLUS_SHA2 && key->alg() != PGP_PKA_SPHINCSPLUS_SHAKE) { - return RNP_ERROR_BAD_PARAMETERS; - } - - auto material = dynamic_cast(key->material()); - if (!material) { - return RNP_ERROR_BAD_STATE; - } - return get_map_value(sphincsplus_params_map, material->pub().param(), param); -} -FFI_GUARD -#endif - rnp_result_t rnp_key_get_bits(rnp_key_handle_t handle, uint32_t *bits) try { @@ -8140,12 +8084,15 @@ add_json_mpis(json_object *jso, rnp::Key *key, bool secret = false) #if defined(ENABLE_CRYPTO_REFRESH) case PGP_PKA_ED25519: case PGP_PKA_X25519: + case PGP_PKA_ED448: + case PGP_PKA_X448: return RNP_SUCCESS; /* TODO */ #endif #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_KYBER1024_X448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -8156,7 +8103,8 @@ add_json_mpis(json_object *jso, rnp::Key *key, bool secret = false) return RNP_SUCCESS; /* TODO */ case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_DILITHIUM5_ED448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -8165,9 +8113,11 @@ add_json_mpis(json_object *jso, rnp::Key *key, bool secret = false) FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_BP384: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: return RNP_SUCCESS; /* TODO */ #endif default: @@ -8208,12 +8158,15 @@ add_json_sig_mpis(json_object *jso, const pgp::pkt::Signature *sig) #if defined(ENABLE_CRYPTO_REFRESH) case PGP_PKA_ED25519: case PGP_PKA_X25519: + case PGP_PKA_ED448: + case PGP_PKA_X448: return RNP_SUCCESS; /* TODO */ #endif #if defined(ENABLE_PQC) case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_DILITHIUM5_ED448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -8222,9 +8175,11 @@ add_json_sig_mpis(json_object *jso, const pgp::pkt::Signature *sig) FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_BP384: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: return RNP_SUCCESS; /* TODO */ #endif default: @@ -8438,12 +8393,15 @@ key_to_json(json_object *jso, rnp_key_handle_t handle, uint32_t flags) #if defined(ENABLE_CRYPTO_REFRESH) case PGP_PKA_ED25519: case PGP_PKA_X25519: + case PGP_PKA_ED448: + case PGP_PKA_X448: return RNP_SUCCESS; /* TODO */ #endif #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_KYBER1024_X448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -8454,7 +8412,8 @@ key_to_json(json_object *jso, rnp_key_handle_t handle, uint32_t flags) return RNP_SUCCESS; /* TODO */ case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_DILITHIUM5_ED448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -8463,9 +8422,11 @@ key_to_json(json_object *jso, rnp_key_handle_t handle, uint32_t flags) FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_BP384: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: return RNP_SUCCESS; /* TODO */ #endif default: diff --git a/src/lib/sec_profile.cpp b/src/lib/sec_profile.cpp index a238440af8..3077574387 100644 --- a/src/lib/sec_profile.cpp +++ b/src/lib/sec_profile.cpp @@ -203,6 +203,11 @@ SecurityContext::SecurityContext() : time_(0), prov_state_(NULL), rng(RNG::Type: profile.add_rule({FeatureType::Cipher, PGP_SA_IDEA, SecurityLevel::Insecure, 1727730000}); profile.add_rule( {FeatureType::Cipher, PGP_SA_BLOWFISH, SecurityLevel::Insecure, 1727730000}); +#if defined(ENABLE_CRYPTO_REFRESH) + /* Mark RIPEMD insecure since 2024-01-19 by default */ + profile.add_rule( + {FeatureType::Hash, PGP_HASH_RIPEMD, SecurityLevel::Insecure, 1705629600}); +#endif } SecurityContext::~SecurityContext() diff --git a/src/lib/sig_material.cpp b/src/lib/sig_material.cpp index 408ce0e606..8f2a9b1dd2 100644 --- a/src/lib/sig_material.cpp +++ b/src/lib/sig_material.cpp @@ -51,11 +51,15 @@ SigMaterial::create(pgp_pubkey_alg_t palg, pgp_hash_alg_t halg) case PGP_PKA_ED25519: { return std::unique_ptr(new Ed25519SigMaterial(halg)); } + case PGP_PKA_ED448: { + return std::unique_ptr(new Ed448SigMaterial(halg)); + } #endif #if defined(ENABLE_PQC) case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_DILITHIUM5_ED448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -64,10 +68,12 @@ SigMaterial::create(pgp_pubkey_alg_t palg, pgp_hash_alg_t halg) FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_BP384: return std::unique_ptr(new DilithiumSigMaterial(palg, halg)); - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: - return std::unique_ptr(new SlhdsaSigMaterial(halg)); + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: + return std::unique_ptr(new SlhdsaSigMaterial(palg, halg)); #endif default: RNP_LOG("Unknown pk algorithm : %d", (int) palg); @@ -144,6 +150,23 @@ Ed25519SigMaterial::write(pgp_packet_body_t &pkt) const { pkt.add(sig.sig); } + +bool +Ed448SigMaterial::parse(pgp_packet_body_t &pkt) noexcept +{ + auto ec_desc = pgp::ec::Curve::get(PGP_CURVE_448); + if (!pkt.get(sig.sig, 2 * ec_desc->bytes())) { + RNP_LOG("failed to parse ED448 signature data"); + return false; + } + return true; +} + +void +Ed448SigMaterial::write(pgp_packet_body_t &pkt) const +{ + pkt.add(sig.sig); +} #endif #if defined(ENABLE_PQC) @@ -166,17 +189,11 @@ DilithiumSigMaterial::write(pgp_packet_body_t &pkt) const bool SlhdsaSigMaterial::parse(pgp_packet_body_t &pkt) noexcept { - uint8_t param = 0; - if (!pkt.get(param)) { - RNP_LOG("failed to parse SLH-DSA signature data"); - return false; - } - auto sig_size = sphincsplus_signature_size((sphincsplus_parameter_t) param); + auto sig_size = sphincsplus_signature_size(palg); if (!sig_size) { - RNP_LOG("invalid SLH-DSA param value"); + RNP_LOG("invalid SLH-DSA algorithm value"); return false; } - sig.param = (sphincsplus_parameter_t) param; if (!pkt.get(sig.sig, sig_size)) { RNP_LOG("failed to parse SLH-DSA signature data"); return false; @@ -187,7 +204,6 @@ SlhdsaSigMaterial::parse(pgp_packet_body_t &pkt) noexcept void SlhdsaSigMaterial::write(pgp_packet_body_t &pkt) const { - pkt.add_byte((uint8_t) sig.param); pkt.add(sig.sig); } #endif diff --git a/src/lib/sig_material.hpp b/src/lib/sig_material.hpp index 74347277a3..aadf99652e 100644 --- a/src/lib/sig_material.hpp +++ b/src/lib/sig_material.hpp @@ -91,6 +91,15 @@ class Ed25519SigMaterial : public SigMaterial { bool parse(pgp_packet_body_t &pkt) noexcept override; void write(pgp_packet_body_t &pkt) const override; }; + +class Ed448SigMaterial : public SigMaterial { + public: + pgp_ed448_signature_t sig; + Ed448SigMaterial(pgp_hash_alg_t ahalg) : SigMaterial(ahalg){}; + + bool parse(pgp_packet_body_t &pkt) noexcept override; + void write(pgp_packet_body_t &pkt) const override; +}; #endif #if defined(ENABLE_PQC) @@ -109,7 +118,9 @@ class DilithiumSigMaterial : public SigMaterial { class SlhdsaSigMaterial : public SigMaterial { public: pgp_sphincsplus_signature_t sig; - SlhdsaSigMaterial(pgp_hash_alg_t ahalg) : SigMaterial(ahalg){}; + pgp_pubkey_alg_t palg; + SlhdsaSigMaterial(pgp_pubkey_alg_t apalg, pgp_hash_alg_t ahalg) + : SigMaterial(ahalg), palg(apalg){}; bool parse(pgp_packet_body_t &pkt) noexcept override; void write(pgp_packet_body_t &pkt) const override; diff --git a/src/librepgp/stream-common.cpp b/src/librepgp/stream-common.cpp index 3eee41fd2a..88fe0ac445 100644 --- a/src/librepgp/stream-common.cpp +++ b/src/librepgp/stream-common.cpp @@ -1223,10 +1223,11 @@ have_pkesk_checksum(pgp_pubkey_alg_t alg) #if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) #if defined(ENABLE_CRYPTO_REFRESH) case PGP_PKA_X25519: + case PGP_PKA_X448: #endif #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: - // case PGP_PKA_KYBER1024_X448: + case PGP_PKA_KYBER1024_X448: case PGP_PKA_KYBER768_P256: case PGP_PKA_KYBER1024_P384: case PGP_PKA_KYBER768_BP256: diff --git a/src/librepgp/stream-ctx.cpp b/src/librepgp/stream-ctx.cpp index f78999a302..9a48c233a7 100644 --- a/src/librepgp/stream-ctx.cpp +++ b/src/librepgp/stream-ctx.cpp @@ -68,15 +68,54 @@ rnp_ctx_t::add_encryption_password(const std::string &password, return RNP_SUCCESS; } +/* TODO: refactor. Checking for subpackets should be done in a central place */ #if defined(ENABLE_CRYPTO_REFRESH) +#define PGP_UID_PRIMARY ((uint32_t) -2) +#define PGP_UID_ANY ((uint32_t) -3) + bool -rnp_ctx_t::pkeskv6_capable() +rnp_ctx_t::pkeskv6_capable(rnp::KeyProvider *key_provider) { + /* either the features flag is set, or the key version is >= v6 */ for (auto *key : recipients) { - if (key->version() < PGP_V6) { + if (key->version() >= PGP_V6) { + continue; + } + + rnp::Key *primary = NULL; + if (key->is_primary()) { + primary = key; + } else { + if (key->has_primary_fp()) { + rnp::KeyFingerprintSearch fpsrch(key->primary_fp()); + primary = key_provider->request_key(fpsrch); + } + } + + if (!primary) { + // can't find primary return false; } + + /* get latest self sig */ + /* if we have direct-key signature, then it has higher priority */ + rnp::Signature *dirsig = primary->latest_selfsig(rnp::UserID::None); + if (dirsig) { + return dirsig->sig.key_has_features(PGP_KEY_FEATURE_SEIPDV2); + } + /* if we have primary uid and it is more restrictive, then use it as well */ + rnp::Signature *prisig = primary->latest_selfsig(PGP_UID_PRIMARY); + if (prisig) { + return prisig->sig.key_has_features(PGP_KEY_FEATURE_SEIPDV2); + } + /* if we don't have direct-key sig and primary uid, use the latest self-cert */ + rnp::Signature *latest = primary->latest_selfsig(PGP_UID_ANY); + if (latest) { + return latest->sig.key_has_features(PGP_KEY_FEATURE_SEIPDV2); + } + /* no applicable sig found */ + return false; } return true; } -#endif +#endif \ No newline at end of file diff --git a/src/librepgp/stream-ctx.h b/src/librepgp/stream-ctx.h index 7887fac4c0..0f4915b017 100644 --- a/src/librepgp/stream-ctx.h +++ b/src/librepgp/stream-ctx.h @@ -142,7 +142,7 @@ typedef struct rnp_ctx_t { size_t iterations = 0); #if defined(ENABLE_CRYPTO_REFRESH) - bool pkeskv6_capable(); + bool pkeskv6_capable(rnp::KeyProvider *key_provider); #endif } rnp_ctx_t; diff --git a/src/librepgp/stream-dump.cpp b/src/librepgp/stream-dump.cpp index ba71f3aa9c..2e22b93813 100644 --- a/src/librepgp/stream-dump.cpp +++ b/src/librepgp/stream-dump.cpp @@ -150,22 +150,25 @@ static const id_str_pair pubkey_alg_map[] = { #if defined(ENABLE_CRYPTO_REFRESH) {PGP_PKA_ED25519, "Ed25519"}, {PGP_PKA_X25519, "X25519"}, + {PGP_PKA_ED448, "Ed448"}, + {PGP_PKA_X448, "X448"}, #endif #if defined(ENABLE_PQC) {PGP_PKA_KYBER768_X25519, "ML-KEM-768 + X25519"}, - //{PGP_PKA_KYBER1024_X448, "Kyber1024 + X448"}, + {PGP_PKA_KYBER1024_X448, "ML-KEM-1024 + X448"}, {PGP_PKA_KYBER768_P256, "ML-KEM-768 + NIST P-256"}, {PGP_PKA_KYBER1024_P384, "ML-KEM-1024 + NIST P-384"}, {PGP_PKA_KYBER768_BP256, "ML-KEM-768 + Brainpool256"}, {PGP_PKA_KYBER1024_BP384, "ML-KEM-1024 + Brainpool384"}, {PGP_PKA_DILITHIUM3_ED25519, "ML-DSA-65 + ED25519"}, - //{PGP_PKA_DILITHIUM5_ED448, "Dilithium + X448"}, + {PGP_PKA_DILITHIUM5_ED448, "ML-DSA-87 + X448"}, {PGP_PKA_DILITHIUM3_P256, "ML-DSA-65 + NIST P-256"}, {PGP_PKA_DILITHIUM5_P384, "ML-DSA-87 + NIST P-384"}, {PGP_PKA_DILITHIUM3_BP256, "ML-DSA-65 + Brainpool256"}, {PGP_PKA_DILITHIUM5_BP384, "ML-DSA-87 + Brainpool384"}, - {PGP_PKA_SPHINCSPLUS_SHA2, "SLH-DSA-SHA2"}, - {PGP_PKA_SPHINCSPLUS_SHAKE, "SLH-DSA-SHAKE"}, + {PGP_PKA_SPHINCSPLUS_SHAKE_128f, "SLH-DSA-SHAKE-128f"}, + {PGP_PKA_SPHINCSPLUS_SHAKE_128s, "SLH-DSA-SHAKE-128s"}, + {PGP_PKA_SPHINCSPLUS_SHAKE_256s, "SLH-DSA-SHAKE-256s"}, #endif {0x00, NULL}, }; @@ -332,7 +335,7 @@ dst_print_mpi(pgp_dest_t &dst, const char *name, const pgp::mpi &mpi, bool dumpb } } -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) static void dst_print_vec(pgp_dest_t & dst, const char * name, @@ -906,11 +909,17 @@ DumpContextDst::dump_signature_pkt(const pkt::Signature &sig) dst_print_vec(dst, "ed25519 sig", ed.sig.sig, dump_mpi); break; } + case PGP_PKA_ED448: { + auto &ed = dynamic_cast(*material); + dst_print_vec(dst, "ed448 sig", ed.sig.sig, dump_mpi); + break; + } #endif #if defined(ENABLE_PQC) case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_DILITHIUM5_ED448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -922,9 +931,11 @@ DumpContextDst::dump_signature_pkt(const pkt::Signature &sig) dst_print_vec(dst, "mldsa-ecdsa/eddsa sig", dilithium.sig.sig, dump_mpi); break; } - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: { + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: { auto &slhdsa = dynamic_cast(*material); dst_print_vec(dst, "slhdsa sig", slhdsa.sig.sig, dump_mpi); break; @@ -1015,11 +1026,22 @@ DumpContextDst::dump_key_material(const KeyMaterial *material) dst_print_vec(dst, "x25519", x25519.pub(), dump_mpi); return; } + case PGP_PKA_ED448: { + auto &ed448 = dynamic_cast(*material); + dst_print_vec(dst, "ed448", ed448.pub(), dump_mpi); + return; + } + case PGP_PKA_X448: { + auto &x448 = dynamic_cast(*material); + dst_print_vec(dst, "x448", x448.pub(), dump_mpi); + return; + } #endif #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_KYBER1024_X448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -1033,7 +1055,8 @@ DumpContextDst::dump_key_material(const KeyMaterial *material) } case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_DILITHIUM5_ED448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -1046,9 +1069,11 @@ DumpContextDst::dump_key_material(const KeyMaterial *material) dst, "mldsa-ecdsa/eddsa encodced pubkey", dilithium.pub().get_encoded(), dump_mpi); return; } - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: { + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: { auto &sphincs = dynamic_cast(*material); dst_print_vec(dst, "slhdsa encoded pubkey", sphincs.pub().get_encoded(), dump_mpi); return; @@ -1249,11 +1274,18 @@ DumpContextDst::dump_pk_session_key() dst_print_vec(dst, "x25519 encrypted session key", x25519.enc_sess_key, dump_mpi); break; } + case PGP_PKA_X448: { + auto &x448 = dynamic_cast(*material).enc; + dst_print_vec(dst, "x448 ephemeral public key", x448.eph_key, dump_mpi); + dst_print_vec(dst, "x448 encrypted session key", x448.enc_sess_key, dump_mpi); + break; + } #endif #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_KYBER1024_X448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -1362,7 +1394,19 @@ DumpContextDst::dump_one_pass() dst_print_sig_type(dst, NULL, onepass.type); dst_print_halg(dst, NULL, onepass.halg); dst_print_palg(dst, NULL, onepass.palg); - dst_print_keyid(dst, "signing key id", onepass.keyid); +#if defined(ENABLE_CRYPTO_REFRESH) + if (onepass.version == PGP_OPS_V6) { + dst_print_vec(dst, "salt", onepass.salt, false); + } +#endif + if (onepass.version == PGP_OPS_V3) { + dst_print_keyid(dst, "signing key id", onepass.keyid); + } +#if defined(ENABLE_CRYPTO_REFRESH) + if (onepass.version == PGP_OPS_V6) { + dst_print_fp(dst, NULL, onepass.fp); + } +#endif dst_printf(dst, "nested: %d\n", (int) onepass.nested); indent_dest_decrease(dst); @@ -2000,13 +2044,15 @@ DumpContextJson::dump_signature_pkt(const pkt::Signature &sig, json_object *pkt) /* LCOV_EXCL_END */ #if defined(ENABLE_CRYPTO_REFRESH) case PGP_PKA_ED25519: + case PGP_PKA_ED448: /* TODO */ break; #endif #if defined(ENABLE_PQC) case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_DILITHIUM5_ED448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -2016,9 +2062,11 @@ DumpContextJson::dump_signature_pkt(const pkt::Signature &sig, json_object *pkt) case PGP_PKA_DILITHIUM5_BP384: /* TODO */ break; - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: /* TODO */ break; #endif @@ -2106,13 +2154,16 @@ DumpContextJson::dump_key_material(const KeyMaterial *material, json_object *jso #if defined(ENABLE_CRYPTO_REFRESH) case PGP_PKA_ED25519: case PGP_PKA_X25519: + case PGP_PKA_ED448: + case PGP_PKA_X448: /* TODO */ return true; #endif #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_KYBER1024_X448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -2124,7 +2175,8 @@ DumpContextJson::dump_key_material(const KeyMaterial *material, json_object *jso return true; case PGP_PKA_DILITHIUM3_ED25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_DILITHIUM5_ED448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_DILITHIUM5_ED448: + FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM3_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_DILITHIUM5_P384: @@ -2134,9 +2186,11 @@ DumpContextJson::dump_key_material(const KeyMaterial *material, json_object *jso case PGP_PKA_DILITHIUM5_BP384: /* TODO */ return true; - case PGP_PKA_SPHINCSPLUS_SHA2: + case PGP_PKA_SPHINCSPLUS_SHAKE_128f: + FALLTHROUGH_STATEMENT; + case PGP_PKA_SPHINCSPLUS_SHAKE_128s: FALLTHROUGH_STATEMENT; - case PGP_PKA_SPHINCSPLUS_SHAKE: + case PGP_PKA_SPHINCSPLUS_SHAKE_256s: /* TODO */ return true; #endif @@ -2312,13 +2366,16 @@ DumpContextJson::dump_pk_session_key(json_object *pkt) #if defined(ENABLE_CRYPTO_REFRESH) case PGP_PKA_ED25519: case PGP_PKA_X25519: + case PGP_PKA_ED448: + case PGP_PKA_X448: /* TODO */ break; #endif #if defined(ENABLE_PQC) case PGP_PKA_KYBER768_X25519: FALLTHROUGH_STATEMENT; - // TODO: Add case for PGP_PKA_KYBER1024_X448 with FALLTHROUGH_STATEMENT; + case PGP_PKA_KYBER1024_X448: + FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER768_P256: FALLTHROUGH_STATEMENT; case PGP_PKA_KYBER1024_P384: @@ -2409,9 +2466,20 @@ DumpContextJson::dump_one_pass(json_object *pkt) if (!obj_add_intstr_json(pkt, "public key algorithm", onepass.palg, pubkey_alg_map)) { return RNP_ERROR_OUT_OF_MEMORY; // LCOV_EXCL_LINE } - if (!json_add(pkt, "signer", onepass.keyid)) { +#if defined(ENABLE_CRYPTO_REFRESH) + if (onepass.version == PGP_OPS_V6 && + !json_add(pkt, "salt", (const char *) onepass.salt.data(), onepass.salt.size())) { + return RNP_ERROR_OUT_OF_MEMORY; // LCOV_EXCL_LINE + } +#endif + if (onepass.version == PGP_OPS_V3 && !json_add(pkt, "signer", onepass.keyid)) { return RNP_ERROR_OUT_OF_MEMORY; // LCOV_EXCL_LINE } +#if defined(ENABLE_CRYPTO_REFRESH) + if (onepass.version == PGP_OPS_V6 && !json_add(pkt, "signer", onepass.fp)) { + return RNP_ERROR_OUT_OF_MEMORY; // LCOV_EXCL_LINE + } +#endif if (!json_add(pkt, "nested", (bool) onepass.nested)) { return RNP_ERROR_OUT_OF_MEMORY; // LCOV_EXCL_LINE } diff --git a/src/librepgp/stream-key.cpp b/src/librepgp/stream-key.cpp index 7a79c4cc8f..037f4b48aa 100644 --- a/src/librepgp/stream-key.cpp +++ b/src/librepgp/stream-key.cpp @@ -891,7 +891,7 @@ pgp_key_pkt_t::parse(pgp_source_t &src) return RNP_ERROR_BAD_FORMAT; } -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) std::vector tmpbuf; #endif @@ -972,6 +972,14 @@ pgp_key_pkt_t::parse(pgp_source_t &src) default:; } +#if defined(ENABLE_PQC) + /* PQC only for v6 keys aside from MLKEM768+X25519 */ + if (rnp::Key::is_pqc_alg(alg) && version < PGP_V6 && alg != PGP_PKA_KYBER768_X25519) { + RNP_LOG("Invalid algorithm for key version"); + return RNP_ERROR_BAD_FORMAT; + } +#endif + /* algorithm specific fields */ if (!material->parse(pkt)) { return RNP_ERROR_BAD_FORMAT; diff --git a/src/librepgp/stream-packet.cpp b/src/librepgp/stream-packet.cpp index ef059efd5c..f78f9d7586 100644 --- a/src/librepgp/stream-packet.cpp +++ b/src/librepgp/stream-packet.cpp @@ -1231,7 +1231,20 @@ pgp_one_pass_sig_t::write(pgp_dest_t &dst) const pktbody.add_byte(type); pktbody.add_byte(halg); pktbody.add_byte(palg); - pktbody.add(keyid); +#if defined(ENABLE_CRYPTO_REFRESH) + if (version == PGP_OPS_V6) { + pktbody.add_byte(salt.size()); + pktbody.add(salt); + } +#endif + if (version == PGP_OPS_V3) { + pktbody.add(keyid); + } +#if defined(ENABLE_CRYPTO_REFRESH) + if (version == PGP_OPS_V6) { + pktbody.add(fp.vec()); + } +#endif pktbody.add_byte(nested); pktbody.write(dst); } @@ -1246,27 +1259,106 @@ pgp_one_pass_sig_t::parse(pgp_source_t &src) return res; } - uint8_t buf[13] = {0}; - if ((pkt.size() != 13) || !pkt.get(buf, 13)) { + /* version */ + if ((pkt.size() < 1) || !pkt.get(version)) { return RNP_ERROR_BAD_FORMAT; } - /* version */ - if (buf[0] != 3) { + switch ((pgp_ops_version_t) version) { + case PGP_OPS_V3: + return parse_v3(pkt); +#if defined(ENABLE_CRYPTO_REFRESH) + case PGP_OPS_V6: + return parse_v6(pkt); +#endif + default: RNP_LOG("wrong packet version"); return RNP_ERROR_BAD_FORMAT; } - version = buf[0]; +} + +#if defined(ENABLE_CRYPTO_REFRESH) +rnp_result_t +pgp_one_pass_sig_t::parse_v6(pgp_packet_body_t &pkt) +{ + uint8_t buf[4]; + uint8_t salt_size; + + /* packet can't be smaller for v6 */ + const size_t min_size = 54; + if ((pkt.size() < min_size)) { + return RNP_ERROR_BAD_FORMAT; + } + /* version */ + version = PGP_OPS_V6; + if (!pkt.get(buf, 4)) { + return RNP_ERROR_BAD_FORMAT; + } + /* signature type */ + type = (pgp_sig_type_t) buf[0]; + /* hash algorithm */ + halg = (pgp_hash_alg_t) buf[1]; + /* pk algorithm */ + palg = (pgp_pubkey_alg_t) buf[2]; + + /* salt */ + salt_size = buf[3]; + size_t expect_salt_size; + if (!pgp::pkt::Signature::v6_salt_size(halg, &expect_salt_size)) { + RNP_LOG("invalid halg"); + return RNP_ERROR_BAD_FORMAT; + } + if (salt_size != expect_salt_size) { + RNP_LOG("invalid salt size"); + return RNP_ERROR_BAD_FORMAT; + } + salt.resize(salt_size); + if (!pkt.get(salt.data(), salt.size())) { + RNP_LOG("failed to get salt"); + return RNP_ERROR_BAD_FORMAT; + } + + /* fingerprint */ + std::vector fp_vec; + fp_vec.resize(PGP_FINGERPRINT_V6_SIZE); + if (!pkt.get(fp_vec.data(), fp_vec.size())) { + RNP_LOG("failed to get fingerprint"); + return RNP_ERROR_BAD_FORMAT; + } + fp = pgp::Fingerprint(fp_vec.data(), fp_vec.size()); + + /* nested flag */ + if (!pkt.get(buf, 1)) { + RNP_LOG("failed to get nested flag"); + return RNP_ERROR_BAD_FORMAT; + } + nested = buf[0]; + + if (pkt.left()) { + RNP_LOG("trailing bytes in V6 OPS packet."); + return RNP_ERROR_BAD_FORMAT; + } + return RNP_SUCCESS; +} +#endif + +rnp_result_t +pgp_one_pass_sig_t::parse_v3(pgp_packet_body_t &pkt) +{ + uint8_t buf[12] = {0}; + if ((pkt.size() != 13) || !pkt.get(buf, 12)) { + return RNP_ERROR_BAD_FORMAT; + } /* signature type */ - type = (pgp_sig_type_t) buf[1]; + type = (pgp_sig_type_t) buf[0]; /* hash algorithm */ - halg = (pgp_hash_alg_t) buf[2]; + halg = (pgp_hash_alg_t) buf[1]; /* pk algorithm */ - palg = (pgp_pubkey_alg_t) buf[3]; + palg = (pgp_pubkey_alg_t) buf[2]; /* key id */ static_assert(std::tuple_size::value == PGP_KEY_ID_SIZE, "pgp_one_pass_sig_t.keyid size mismatch"); - memcpy(keyid.data(), &buf[4], PGP_KEY_ID_SIZE); + memcpy(keyid.data(), &buf[3], PGP_KEY_ID_SIZE); /* nested flag */ - nested = buf[12]; + nested = buf[11]; return RNP_SUCCESS; } diff --git a/src/librepgp/stream-packet.h b/src/librepgp/stream-packet.h index 6a176ff7c2..acd88c3a89 100644 --- a/src/librepgp/stream-packet.h +++ b/src/librepgp/stream-packet.h @@ -221,10 +221,18 @@ typedef struct pgp_one_pass_sig_t { pgp_hash_alg_t halg{}; pgp_pubkey_alg_t palg{}; pgp::KeyID keyid{}; - unsigned nested{}; +#if defined(ENABLE_CRYPTO_REFRESH) + pgp::Fingerprint fp{}; + std::vector salt{}; +#endif + unsigned nested{}; void write(pgp_dest_t &dst) const; rnp_result_t parse(pgp_source_t &src); + + private: + rnp_result_t parse_v3(pgp_packet_body_t &pkt); + rnp_result_t parse_v6(pgp_packet_body_t &pkt); } pgp_one_pass_sig_t; /** Struct to hold userid or userattr packet. We don't parse userattr now, just storing the diff --git a/src/librepgp/stream-parse.cpp b/src/librepgp/stream-parse.cpp index 48f6757d65..a54397287a 100644 --- a/src/librepgp/stream-parse.cpp +++ b/src/librepgp/stream-parse.cpp @@ -857,10 +857,33 @@ add_hash_for_sig(pgp_source_signed_param_t *param, pgp_sig_type_t stype, pgp_has param->hashes.add_alg(halg); } +#if defined(ENABLE_CRYPTO_REFRESH) +static void +add_hash_for_sig_v6(pgp_source_signed_param_t *param, + pgp_sig_type_t stype, + pgp_hash_alg_t halg, + std::vector salt) +{ + /* Cleartext always uses param->hashes instead of param->txt_hashes */ + if (!param->cleartext && (stype == PGP_SIG_TEXT)) { + param->txt_hashes.add_alg(halg, salt); + } + param->hashes.add_alg(halg, salt); +} +#endif + static const rnp::Hash * get_hash_for_sig(pgp_source_signed_param_t ¶m, rnp::SignatureInfo &sinfo) { /* Cleartext always uses param->hashes instead of param->txt_hashes */ +#if defined(ENABLE_CRYPTO_REFRESH) + if (sinfo.sig->version == PGP_V6) { + if (!param.cleartext && (sinfo.sig->type() == PGP_SIG_TEXT)) { + return param.txt_hashes.get(sinfo.sig->halg, sinfo.sig->salt); + } + return param.hashes.get(sinfo.sig->halg, sinfo.sig->salt); + } +#endif if (!param.cleartext && (sinfo.sig->type() == PGP_SIG_TEXT)) { return param.txt_hashes.get(sinfo.sig->halg); } @@ -1177,6 +1200,13 @@ signed_src_finish(pgp_source_t *src) if (!sinfo.sig) { continue; } +#if defined(ENABLE_CRYPTO_REFRESH) + if (sinfo.sig->version == PGP_V6 && param->cleartext) { + RNP_LOG("Skipping signature: Cleartext signature verification currently does not " + "support v6 signatures"); + continue; + } +#endif try { signed_validate_signature(*param, sinfo); } catch (const std::exception &e) { @@ -1593,7 +1623,7 @@ encrypted_try_key(pgp_source_encrypted_param_t *param, } #endif -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) /* If AES is forced then salg must be stored plaintext in material */ sesskey.salg = encmaterial->salg; /* check that AES is used when mandated by the standard */ @@ -2521,7 +2551,14 @@ init_signed_src(pgp_parse_handler_t *handler, pgp_source_t *src, pgp_source_t *r /* adding hash context */ try { - add_hash_for_sig(param, onepass.type, onepass.halg); +#if defined(ENABLE_CRYPTO_REFRESH) + if (onepass.version == PGP_OPS_V6) { + add_hash_for_sig_v6(param, onepass.type, onepass.halg, onepass.salt); + } else +#endif + { + add_hash_for_sig(param, onepass.type, onepass.halg); + } } catch (const std::exception &e) { RNP_LOG("Failed to create hash %d for onepass %d : %s.", (int) onepass.halg, @@ -2543,7 +2580,14 @@ init_signed_src(pgp_parse_handler_t *handler, pgp_source_t *src, pgp_source_t *r /* adding hash context */ if (sig) { try { - add_hash_for_sig(param, sig->type(), sig->halg); +#if defined(ENABLE_CRYPTO_REFRESH) + if (sig->version == PGP_V6) { + add_hash_for_sig_v6(param, sig->type(), sig->halg, sig->salt); + } else +#endif + { + add_hash_for_sig(param, sig->type(), sig->halg); + } } catch (const std::exception &e) { RNP_LOG("Failed to create hash %d for sig %d : %s.", (int) sig->halg, diff --git a/src/librepgp/stream-sig.cpp b/src/librepgp/stream-sig.cpp index cba39f7ff6..fa5b836315 100644 --- a/src/librepgp/stream-sig.cpp +++ b/src/librepgp/stream-sig.cpp @@ -734,8 +734,35 @@ Signature::matches_onepass(const pgp_one_pass_sig_t &onepass) const if (!has_keyid()) { return false; } - return (halg == onepass.halg) && (palg == onepass.palg) && (type_ == onepass.type) && - (onepass.keyid == keyid()); + /* check sig and OPS packet version binding (V3) */ + if (onepass.version == PGP_OPS_V3) { + if (version != PGP_V3 && version != PGP_V4 && version != PGP_V5) { + return false; + } + } + /* check keyid (V3) */ + if (onepass.version == PGP_OPS_V3 && (onepass.keyid != keyid())) { + return false; + } +#if defined(ENABLE_CRYPTO_REFRESH) + /* checks for V6 */ + if (onepass.version == PGP_OPS_V6) { + /* check version binding) */ + if (onepass.version == PGP_OPS_V6 && version != PGP_V6) { + return false; + } + /* check fp */ + if (onepass.fp != keyfp()) { + return false; + } + /* check salt */ + if (onepass.salt != salt) { + return false; + } + } +#endif + /* check the remaining common attributes */ + return (halg == onepass.halg) && (palg == onepass.palg) && (type_ == onepass.type); } bool @@ -1003,11 +1030,17 @@ Signature::parse(pgp_packet_body_t &pkt) RNP_LOG("not enough data for v6 salt size octet"); return RNP_ERROR_BAD_FORMAT; } - if (salt_size != rnp::Hash::size(halg) / 2) { + size_t expect_salt_size; + if (!pgp::pkt::Signature::v6_salt_size(halg, &expect_salt_size)) { + RNP_LOG("invalid halg"); + return RNP_ERROR_BAD_FORMAT; + } + if (salt_size != expect_salt_size) { RNP_LOG("invalid salt size"); return RNP_ERROR_BAD_FORMAT; } - if (!pkt.get(salt, salt_size)) { + salt.resize(salt_size); + if (!pkt.get(salt.data(), salt_size)) { RNP_LOG("not enough data for v6 signature salt"); return RNP_ERROR_BAD_FORMAT; } @@ -1126,5 +1159,36 @@ Signature::fill_hashed_data() hashed_data.assign(hbody.data(), hbody.data() + hbody.size()); } +#if defined(ENABLE_CRYPTO_REFRESH) +bool +Signature::v6_salt_size(pgp_hash_alg_t halg, size_t *salt_size) +{ + switch (halg) { + case PGP_HASH_SHA256: + *salt_size = 16; + break; + case PGP_HASH_SHA224: + *salt_size = 16; + break; + case PGP_HASH_SHA384: + *salt_size = 24; + break; + case PGP_HASH_SHA512: + *salt_size = 32; + break; + case PGP_HASH_SHA3_256: + *salt_size = 16; + break; + case PGP_HASH_SHA3_512: + *salt_size = 32; + break; + default: + RNP_LOG("no V6 salt size for algorithm"); + return false; + } + return true; +} +#endif + } // namespace pkt } // namespace pgp diff --git a/src/librepgp/stream-sig.h b/src/librepgp/stream-sig.h index 3b5d9f3aef..ff1a77a249 100644 --- a/src/librepgp/stream-sig.h +++ b/src/librepgp/stream-sig.h @@ -71,6 +71,9 @@ class Signature { #if defined(ENABLE_CRYPTO_REFRESH) /* v6 - only fields */ std::vector salt; + + /* maps halg to V6 salt size. Returns false if no mapping exists. */ + static bool v6_salt_size(pgp_hash_alg_t halg, size_t *salt_size); #endif Signature() diff --git a/src/librepgp/stream-write.cpp b/src/librepgp/stream-write.cpp index db44575786..4d3b37feef 100644 --- a/src/librepgp/stream-write.cpp +++ b/src/librepgp/stream-write.cpp @@ -141,6 +141,9 @@ typedef struct pgp_dest_signer_info_t { pgp_hash_alg_t halg; int64_t sigcreate; uint64_t sigexpire; +#if defined(ENABLE_CRYPTO_REFRESH) + std::vector salt; +#endif } pgp_dest_signer_info_t; typedef struct pgp_dest_signed_param_t { @@ -588,7 +591,7 @@ encrypted_add_recipient(rnp_ctx_t & ctx, return RNP_ERROR_NO_SUITABLE_KEY; } -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) /* Crypto Refresh: For X25519/X448 PKESKv3, AES is mandated */ /* PQC: AES is mandated for PKESKv3 */ if (!check_enforce_aes_v3_pkesk(userkey->alg(), param->ctx.ealg, pkesk_version)) { @@ -614,7 +617,7 @@ encrypted_add_recipient(rnp_ctx_t & ctx, /* Encrypt the session key */ rnp::secure_bytes enckey; -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) if ((pkey.version == PGP_PKSK_V3) && do_encrypt_pkesk_v3_alg_id(pkey.alg)) { /* for pre-crypto-refresh algorithms, algorithm ID is part of the session key */ enckey.push_back(pkey.salg); @@ -1020,7 +1023,8 @@ init_encrypted_dst(rnp_ctx_t &ctx, pgp_dest_t &dst, pgp_dest_t &writedst) #if defined(ENABLE_CRYPTO_REFRESH) /* in the case of PKESK (pkeycount > 0) and all keys are PKESKv6/SEIPDv2 capable, upgrade * to AEADv2 */ - if (ctx.enable_pkesk_v6 && ctx.pkeskv6_capable() && !ctx.recipients.empty()) { + if (ctx.enable_pkesk_v6 && ctx.pkeskv6_capable(&ctx.key_provider) && + !ctx.recipients.empty()) { param->auth_type = rnp::AuthType::AEADv2; } #endif @@ -1251,7 +1255,16 @@ signed_fill_signature(pgp_dest_signed_param_t ¶m, sig.set_expiration(signer.sigexpire); sig.fill_hashed_data(); - auto listh = param.hashes.get(sig.halg); + const rnp::Hash *listh = NULL; +#if defined(ENABLE_CRYPTO_REFRESH) + if (sig.version == PGP_V6) { + listh = param.hashes.get(sig.halg, sig.salt); + } else +#endif + { + listh = param.hashes.get(sig.halg); + } + if (!listh) { /* LCOV_EXCL_START */ RNP_LOG("failed to obtain hash"); @@ -1279,6 +1292,12 @@ signed_write_signature(pgp_dest_signed_param_t *param, { try { pgp::pkt::Signature sig; +#if defined(ENABLE_CRYPTO_REFRESH) + if (signer->key->version() == PGP_V6) { + // set salt + sig.salt = signer->salt; + } +#endif if (signer->onepass.version) { signer->key->sign_init(param->ctx->sec_ctx.rng, sig, @@ -1399,7 +1418,10 @@ signed_dst_set_literal_hdr(pgp_dest_t &src, const pgp_literal_hdr_t &hdr) } static rnp_result_t -signed_add_signer(pgp_dest_signed_param_t ¶m, rnp_signer_info_t &signer, bool last) +signed_add_signer(pgp_dest_signed_param_t ¶m, + rnp_signer_info_t & signer, + rnp::RNG & rng, + bool last) { pgp_dest_signer_info_t sinfo = {}; @@ -1422,7 +1444,21 @@ signed_add_signer(pgp_dest_signed_param_t ¶m, rnp_signer_info_t &signer, boo /* Add hash to the list */ sinfo.halg = signer.key->material()->adjust_hash(signer.halg); try { - param.hashes.add_alg(sinfo.halg); +#if defined(ENABLE_CRYPTO_REFRESH) + if (sinfo.key->version() == PGP_V6) { + size_t salt_size; + if (!pgp::pkt::Signature::v6_salt_size(sinfo.halg, &salt_size)) { + RNP_LOG("can't get signature salt size"); + return RNP_ERROR_BAD_STATE; + } + sinfo.salt.resize(salt_size); + rng.get(sinfo.salt.data(), salt_size); + param.hashes.add_alg(sinfo.halg, sinfo.salt); + } else +#endif + { + param.hashes.add_alg(sinfo.halg); + } } catch (const std::exception &e) { /* LCOV_EXCL_START */ RNP_LOG("%s", e.what()); @@ -1451,6 +1487,15 @@ signed_add_signer(pgp_dest_signed_param_t ¶m, rnp_signer_info_t &signer, boo sinfo.onepass.palg = sinfo.key->alg(); sinfo.onepass.keyid = sinfo.key->keyid(); sinfo.onepass.nested = false; +#if defined(ENABLE_CRYPTO_REFRESH) + if (sinfo.key->version() == PGP_V6) { + // set version and fingerprint for v6 + // salt already set above + sinfo.onepass.version = (uint8_t) PGP_OPS_V6; + sinfo.onepass.salt = sinfo.salt; + sinfo.onepass.fp = sinfo.key->fp(); + } +#endif try { param.siginfos.push_back(sinfo); } catch (const std::exception &e) { @@ -1512,7 +1557,8 @@ init_signed_dst(rnp_ctx_t &ctx, pgp_dest_t &dst, pgp_dest_t &writedst) /* Getting signer's infos, writing one-pass signatures if needed */ for (auto &sg : ctx.signers) { - ret = signed_add_signer(*param, sg, &sg == &ctx.signers.back()); + ret = + signed_add_signer(*param, sg, param->ctx->sec_ctx.rng, &sg == &ctx.signers.back()); if (ret) { RNP_LOG("failed to add one-pass signature for signer"); goto finish; @@ -1531,10 +1577,11 @@ init_signed_dst(rnp_ctx_t &ctx, pgp_dest_t &dst, pgp_dest_t &writedst) dst_write(param->writedst, ST_CRLF, strlen(ST_CRLF)); dst_write(param->writedst, ST_HEADER_HASH, strlen(ST_HEADER_HASH)); - for (const auto &hash : param->hashes.hashes) { - auto hname = rnp::Hash::name(hash->alg()); + auto halg_list = param->hashes.hash_algs(); + for (pgp_hash_alg_t halg : halg_list) { + auto hname = rnp::Hash::name(halg); dst_write(param->writedst, hname, strlen(hname)); - if (&hash != ¶m->hashes.hashes.back()) { + if (halg != halg_list.back()) { dst_write(param->writedst, ST_COMMA, 1); } } diff --git a/src/rnp/fficli.cpp b/src/rnp/fficli.cpp index 01e61b194a..14ad2607fa 100644 --- a/src/rnp/fficli.cpp +++ b/src/rnp/fficli.cpp @@ -1422,15 +1422,6 @@ cli_rnp_print_key_info(FILE *fp, rnp_ffi_t ffi, rnp_key_handle_t key, bool psecr char *alg = NULL; (void) rnp_key_get_alg(key, &alg); fprintf(fp, "%s", cli_rnp_normalize_key_alg(alg)); -#if defined(ENABLE_PQC) - // in case of a SPHINCS+ key, also print the parameter set - char * param; - rnp_result_t res = rnp_key_sphincsplus_get_param(key, ¶m); - if (res == RNP_SUCCESS) { - fprintf(fp, "-%s", param); - rnp_buffer_destroy(param); - } -#endif fprintf(fp, " "); /* key id */ char *keyid = NULL; @@ -1634,14 +1625,6 @@ cli_rnp_generate_key(cli_rnp_t *rnp, const char *username) rnp_op_generate_set_v6_key(genkey); } #endif -#if defined(ENABLE_PQC) - if (cfg.has(CFG_KG_PRIMARY_SPHINCSPLUS_PARAM) && - rnp_op_generate_set_sphincsplus_param( - genkey, cfg.get_cstr(CFG_KG_PRIMARY_SPHINCSPLUS_PARAM))) { - ERR_MSG("Failed to set sphincsplus parameter."); - goto done; - } -#endif fprintf(rnp->userio_out, "Generating a new key...\n"); if (rnp_op_generate_execute(genkey) || rnp_op_generate_get_key(genkey, &primary)) { @@ -1688,14 +1671,6 @@ cli_rnp_generate_key(cli_rnp_t *rnp, const char *username) if (cfg.get_bool(CFG_KG_V6_KEY)) { rnp_op_generate_set_v6_key(genkey); } -#endif -#if defined(ENABLE_PQC) - if (cfg.has(CFG_KG_SUBKEY_SPHINCSPLUS_PARAM) && - rnp_op_generate_set_sphincsplus_param(genkey, - cfg.get_cstr(CFG_KG_SUBKEY_SPHINCSPLUS_PARAM))) { - ERR_MSG("Failed to set sphincsplus parameter."); - goto done; - } #endif if (rnp_op_generate_execute(genkey) || rnp_op_generate_get_key(genkey, &subkey)) { ERR_MSG("Subkey generation failed."); @@ -1739,12 +1714,6 @@ cli_rnp_generate_key(cli_rnp_t *rnp, const char *username) rnp_op_generate_set_v6_key(genkey); } #endif - if (cfg.has(CFG_KG_SUBKEY_2_SPHINCSPLUS_PARAM) && - rnp_op_generate_set_sphincsplus_param( - genkey, cfg.get_cstr(CFG_KG_SUBKEY_2_SPHINCSPLUS_PARAM))) { - ERR_MSG("Failed to set sphincsplus parameter."); - goto done; - } if (rnp_op_generate_execute(genkey) || rnp_op_generate_get_key(genkey, &subkey2)) { ERR_MSG("Subkey generation failed."); goto done; diff --git a/src/rnp/rnpcfg.h b/src/rnp/rnpcfg.h index c182429e53..550596ad15 100644 --- a/src/rnp/rnpcfg.h +++ b/src/rnp/rnpcfg.h @@ -132,14 +132,6 @@ #define CFG_KG_V6_KEY \ "kg-v6-key" /* represents a boolean property: non-empty string means 'true' */ #endif -#if defined(ENABLE_PQC) -#define CFG_KG_PRIMARY_SPHINCSPLUS_PARAM \ - "kg-primary-sphincsplus-param" /* 128f, 128s, 192f, 192s, 256f, 256s */ -#define CFG_KG_SUBKEY_SPHINCSPLUS_PARAM \ - "kg-subkey-sphincsplus-param" /* 128f, 128s, 192f, 192s, 256f, 256s */ -#define CFG_KG_SUBKEY_2_SPHINCSPLUS_PARAM \ - "kg-subkey-2-sphincsplus-param" /* 128f, 128s, 192f, 192s, 256f, 256s */ -#endif /* rnp CLI config : contains all the system-dependent and specified by the user configuration * options */ diff --git a/src/rnpkeys/rnpkeys.cpp b/src/rnpkeys/rnpkeys.cpp index 6263bd68af..d1c053ff5e 100644 --- a/src/rnpkeys/rnpkeys.cpp +++ b/src/rnpkeys/rnpkeys.cpp @@ -538,6 +538,9 @@ setoption(rnp_cfg &cfg, optdefs_t *cmd, int val, const char *arg) case OPT_EXPIRATION: cfg.set_str(CFG_KG_PRIMARY_EXPIRATION, arg); cfg.set_str(CFG_KG_SUBKEY_EXPIRATION, arg); +#if defined(ENABLE_PQC) + cfg.set_str(CFG_KG_SUBKEY_2_EXPIRATION, arg); +#endif return true; case OPT_S2K_MSEC: { int msec = 0; diff --git a/src/rnpkeys/tui.cpp b/src/rnpkeys/tui.cpp index 4d5201a6c0..8939ec45dc 100644 --- a/src/rnpkeys/tui.cpp +++ b/src/rnpkeys/tui.cpp @@ -151,46 +151,6 @@ ask_curve_name(FILE *input_fp) return result; } -#if defined(ENABLE_PQC) -static std::string -ask_sphincsplus_param_name(FILE *input_fp) -{ - std::vector params = {"128f", "128s", "192f", "192s", "256f", "256s"}; - std::vector add_info = {"ML-KEM-768 + X25519", - "ML-KEM-768 + X25519", - "ML-KEM-1024 + ECDH-NIST-P-384", - "ML-KEM-1024 + ECDH-NIST-P-384", - "ML-KEM-1024 + ECDH-NIST-P-384", - "ML-KEM-1024 + ECDH-NIST-P-384"}; - - const size_t pcount = params.size(); - if (!pcount) { - return NULL; - } - bool ok = false; - std::string result = ""; - int attempts = 0; - do { - if (!check_attempts(attempts)) { - return NULL; - } - printf("Please select which SLH-DSA parameter set you want. In parenthesis, the " - "correspondingly chosen encryption subkey is shown:\n"); - for (size_t i = 0; i < pcount; i++) { - printf("\t(%zu) %s (%s)\n", i + 1, params[i].c_str(), add_info[i].c_str()); - } - printf("(default %s)> ", params[0].c_str()); - long val = 0; - ok = rnp_secure_get_long_from_fd(input_fp, val) && (val > 0) && (val <= (long) pcount); - if (ok) { - result = params[val - 1]; - } - } while (!ok); - - return result; -} -#endif - static long ask_rsa_bitlen(FILE *input_fp) { @@ -288,15 +248,17 @@ rnpkeys_ask_generate_params(rnp_cfg &cfg, FILE *input_fp) "\t(23) ED25519 + X25519 (v6 key) \n" #endif #if defined(ENABLE_PQC) - "\t(24) Ed25519Legacy + Curve25519Legacy + (ML-KEM-768 + X25519)\n" + "\t(24) Ed25519 + X25519 + (ML-KEM-768 + X25519)\n" #if defined(ENABLE_CRYPTO_REFRESH) // PQC primary keys only for v6 "\t(25) (ML-DSA-65 + Ed25519) + (ML-KEM-768 + X25519)\n" + "\t(26) (ML-DSA-87 + Ed448) + (ML-KEM-1024 + X448)\n" "\t(27) (ML-DSA-65 + ECDSA-NIST-P-256) + (ML-KEM-768 + ECDH-NIST-P-256)\n" "\t(28) (ML-DSA-87 + ECDSA-NIST-P-384) + (ML-KEM-1024 + ECDH-NIST-P-384)\n" "\t(29) (ML-DSA-65 + ECDSA-brainpoolP256r1) + (ML-KEM-768 + ECDH-brainpoolP256r1)\n" "\t(30) (ML-DSA-87 + ECDSA-brainpoolP384r1) + (ML-KEM-1024 + ECDH-brainpoolP384r1)\n" - "\t(31) SLH-DSA-SHA2 + MLKEM-ECDH Composite\n" - "\t(32) SLH-DSA-SHAKE + MLKEM-ECDH Composite\n" + "\t(31) SLH-DSA-SHAKE-128f + (ML-KEM-768 + X25519)\n" + "\t(32) SLH-DSA-SHAKE-128s + (ML-KEM-768 + X25519)\n" + "\t(33) SLH-DSA-SHAKE-256s + (ML-KEM-1024 + ECDH-NIST-P-384)\n" #endif #endif "\t(99) SM2\n" @@ -372,10 +334,10 @@ rnpkeys_ask_generate_params(rnp_cfg &cfg, FILE *input_fp) #endif #if defined(ENABLE_PQC) case 24: - cfg.set_str(CFG_KG_PRIMARY_ALG, RNP_ALGNAME_EDDSA); - cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_ECDH); - cfg.set_str(CFG_KG_SUBKEY_CURVE, "Curve25519"); + cfg.set_str(CFG_KG_PRIMARY_ALG, RNP_ALGNAME_ED25519); + cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_X25519); cfg.set_str(CFG_KG_SUBKEY_2_ALG, RNP_ALGNAME_KYBER768_X25519); + cfg.set_str(CFG_KG_V6_KEY, "true"); break; #if defined(ENABLE_CRYPTO_REFRESH) // PQC primary keys only for v6 case 25: @@ -384,6 +346,12 @@ rnpkeys_ask_generate_params(rnp_cfg &cfg, FILE *input_fp) cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_KYBER768_X25519); cfg.set_str(CFG_KG_V6_KEY, "true"); break; + case 26: + cfg.set_str(CFG_KG_PRIMARY_ALG, RNP_ALGNAME_DILITHIUM5_ED448); + cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA3_512); + cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_KYBER1024_X448); + cfg.set_str(CFG_KG_V6_KEY, "true"); + break; case 27: cfg.set_str(CFG_KG_PRIMARY_ALG, RNP_ALGNAME_DILITHIUM3_P256); cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA3_256); @@ -392,7 +360,7 @@ rnpkeys_ask_generate_params(rnp_cfg &cfg, FILE *input_fp) break; case 28: cfg.set_str(CFG_KG_PRIMARY_ALG, RNP_ALGNAME_DILITHIUM5_P384); - cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA3_256); + cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA3_512); cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_KYBER1024_P384); cfg.set_str(CFG_KG_V6_KEY, "true"); break; @@ -404,41 +372,28 @@ rnpkeys_ask_generate_params(rnp_cfg &cfg, FILE *input_fp) break; case 30: cfg.set_str(CFG_KG_PRIMARY_ALG, RNP_ALGNAME_DILITHIUM5_BP384); - cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA3_256); + cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA3_512); cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_KYBER1024_BP384); cfg.set_str(CFG_KG_V6_KEY, "true"); break; case 31: { - std::string param = ask_sphincsplus_param_name(input_fp); - if (param == "") { - return false; - } - if (param == "128f" || param == "128s") { - cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_KYBER768_X25519); - cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA256); - } else { - cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_KYBER1024_P384); - cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA512); - } - cfg.set_str(CFG_KG_PRIMARY_ALG, RNP_ALGNAME_SPHINCSPLUS_SHA2); - cfg.set_str(CFG_KG_PRIMARY_SPHINCSPLUS_PARAM, param); + cfg.set_str(CFG_KG_PRIMARY_ALG, RNP_ALGNAME_SPHINCSPLUS_SHAKE_128f); + cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_KYBER768_X25519); + cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA3_256); cfg.set_str(CFG_KG_V6_KEY, "true"); break; } case 32: { - std::string param = ask_sphincsplus_param_name(input_fp); - if (param == "") { - return false; - } - if (param == "128f" || param == "128s") { - cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_KYBER768_X25519); - cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA3_256); - } else { - cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_KYBER1024_P384); - cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA3_512); - } - cfg.set_str(CFG_KG_PRIMARY_ALG, RNP_ALGNAME_SPHINCSPLUS_SHAKE); - cfg.set_str(CFG_KG_PRIMARY_SPHINCSPLUS_PARAM, param); + cfg.set_str(CFG_KG_PRIMARY_ALG, RNP_ALGNAME_SPHINCSPLUS_SHAKE_128s); + cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_KYBER768_X25519); + cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA3_256); + cfg.set_str(CFG_KG_V6_KEY, "true"); + break; + } + case 33: { + cfg.set_str(CFG_KG_PRIMARY_ALG, RNP_ALGNAME_SPHINCSPLUS_SHAKE_256s); + cfg.set_str(CFG_KG_SUBKEY_ALG, RNP_ALGNAME_KYBER1024_P384); + cfg.set_str(CFG_KG_HASH, RNP_ALGNAME_SHA3_512); cfg.set_str(CFG_KG_V6_KEY, "true"); break; } diff --git a/src/tests/cipher.cpp b/src/tests/cipher.cpp index 0ee70da82f..1583267e4f 100644 --- a/src/tests/cipher.cpp +++ b/src/tests/cipher.cpp @@ -628,7 +628,7 @@ TEST_F(rnp_tests, test_dsa_verify_negative) TEST_F(rnp_tests, kyber_ecdh_roundtrip) { pgp_pubkey_alg_t algs[] = {PGP_PKA_KYBER768_X25519, - /* PGP_PKA_KYBER1024_X448, */ // X448 not yet implemented + PGP_PKA_KYBER1024_X448, PGP_PKA_KYBER1024_P384, PGP_PKA_KYBER768_BP256, PGP_PKA_KYBER1024_BP384}; @@ -662,7 +662,8 @@ TEST_F(rnp_tests, dilithium_exdsa_signverify_success) const pgp_hash_alg_t hash_alg = PGP_HASH_SHA512; pgp_pubkey_alg_t algs[] = {PGP_PKA_DILITHIUM3_ED25519, - /* PGP_PKA_DILITHIUM5_ED448,*/ PGP_PKA_DILITHIUM3_P256, + PGP_PKA_DILITHIUM5_ED448, + PGP_PKA_DILITHIUM3_P256, PGP_PKA_DILITHIUM5_P384, PGP_PKA_DILITHIUM3_BP256, PGP_PKA_DILITHIUM5_BP384}; @@ -696,41 +697,33 @@ TEST_F(rnp_tests, dilithium_exdsa_signverify_success) TEST_F(rnp_tests, sphincsplus_signverify_success) { - uint8_t message[64]; - pgp_pubkey_alg_t algs[] = {PGP_PKA_SPHINCSPLUS_SHA2, PGP_PKA_SPHINCSPLUS_SHAKE}; - sphincsplus_parameter_t params[] = {sphincsplus_simple_128s, - sphincsplus_simple_128f, - sphincsplus_simple_192s, - sphincsplus_simple_192f, - sphincsplus_simple_256s, - sphincsplus_simple_256f}; + uint8_t message[64]; + pgp_pubkey_alg_t algs[] = {PGP_PKA_SPHINCSPLUS_SHAKE_128f, + PGP_PKA_SPHINCSPLUS_SHAKE_128s, + PGP_PKA_SPHINCSPLUS_SHAKE_256s}; for (size_t i = 0; i < ARRAY_SIZE(algs); i++) { - for (size_t j = 0; j < ARRAY_SIZE(params); j++) { - // Generate test data. Mainly to make valgrind not to complain about uninitialized - // data - global_ctx.rng.get(message, sizeof(message)); - - rnp::KeygenParams keygen(algs[i], global_ctx); - auto &slhdsa = dynamic_cast(keygen.key_params()); - slhdsa.set_param(params[j]); - - pgp_key_pkt_t seckey1; - pgp_key_pkt_t seckey2; - - assert_true(keygen.generate(seckey1, true)); - assert_true(keygen.generate(seckey2, true)); - - auto & key1 = *seckey1.material; - auto & key2 = *seckey2.material; - rnp::secure_bytes hash(message, message + sizeof(message)); - pgp::SlhdsaSigMaterial sig(keygen.hash()); - assert_rnp_success(key1.sign(global_ctx, sig, hash)); - assert_rnp_success(key1.verify(global_ctx, sig, hash)); - - // Fails because of different key used - assert_rnp_failure(key2.verify(global_ctx, sig, hash)); - } + // Generate test data. Mainly to make valgrind not to complain about uninitialized + // data + global_ctx.rng.get(message, sizeof(message)); + + rnp::KeygenParams keygen(algs[i], global_ctx); + + pgp_key_pkt_t seckey1; + pgp_key_pkt_t seckey2; + + assert_true(keygen.generate(seckey1, true)); + assert_true(keygen.generate(seckey2, true)); + + auto & key1 = *seckey1.material; + auto & key2 = *seckey2.material; + rnp::secure_bytes hash(message, message + sizeof(message)); + pgp::SlhdsaSigMaterial sig(algs[i], keygen.hash()); + assert_rnp_success(key1.sign(global_ctx, sig, hash)); + assert_rnp_success(key1.verify(global_ctx, sig, hash)); + + // Fails because of different key used + assert_rnp_failure(key2.verify(global_ctx, sig, hash)); } } #endif diff --git a/src/tests/cli_tests.py b/src/tests/cli_tests.py index 9ffdef5855..33e6229f7f 100755 --- a/src/tests/cli_tests.py +++ b/src/tests/cli_tests.py @@ -883,7 +883,7 @@ def gpg_check_features(): print('GPG_BRAINPOOL: ' + str(GPG_BRAINPOOL)) def rnp_check_features(): - global RNP_TWOFISH, RNP_BRAINPOOL, RNP_AEAD, RNP_AEAD_EAX, RNP_AEAD_OCB, RNP_AEAD_OCB_AES, RNP_IDEA, RNP_BLOWFISH, RNP_CAST5, RNP_RIPEMD160, RNP_PQC, RNP_SM2 + global RNP_TWOFISH, RNP_BRAINPOOL, RNP_AEAD, RNP_AEAD_EAX, RNP_AEAD_OCB, RNP_AEAD_OCB_AES, RNP_IDEA, RNP_BLOWFISH, RNP_CAST5, RNP_RIPEMD160, RNP_PQC, RNP_SM2, RNP_CRYPTO_REFRESH global RNP_BOTAN_OCB_AV global RNP_BACKEND ret, out, _ = run_proc(RNP, ['--version']) @@ -922,6 +922,8 @@ def rnp_check_features(): # Determine PQC support in general. If present, assume that all PQC schemes are supported. pqc_strs = ['ML-KEM', 'ML-DSA'] RNP_PQC = any([re.match('(?s)^.*Public key:.*' + scheme + '.*', out) is not None for scheme in pqc_strs]) + crypto_refresh_strs = ['ED25519', 'ED448', 'X25519', 'X448'] + RNP_CRYPTO_REFRESH = any([re.match('(?s)^.*Public key:.*' + scheme + '.*', out) is not None for scheme in crypto_refresh_strs]) print('RNP_TWOFISH: ' + str(RNP_TWOFISH)) print('RNP_BLOWFISH: ' + str(RNP_BLOWFISH)) print('RNP_IDEA: ' + str(RNP_IDEA)) @@ -3144,6 +3146,9 @@ def test_alg_aliases(self): self.assertRegex(out,r'(?s)^.*Symmetric-key encrypted session key packet.*symmetric algorithm: 2 \(TripleDES\).*$') remove_files(enc) if RNP_RIPEMD160: + if RNP_CRYPTO_REFRESH: + # For RFC9580 RIPEMD160 is disallowed. + return # Use ripemd-160 hash instead of RIPEMD160 ret, _, err = run_proc(RNP, ['-c', src, '--hash', 'ripemd-160', '--password', 'password']) self.assertEqual(ret, 0) @@ -4700,21 +4705,21 @@ def test_encryption_and_signing_pqc(self): return RNPDIR_PQC = RNPDIR + 'PQC' os.mkdir(RNPDIR_PQC, 0o700) - algo_ui_exp_strs = [ "(24) Ed25519Legacy + Curve25519Legacy + (ML-KEM-768 + X25519)", + algo_ui_exp_strs = [ "(24) Ed25519 + X25519 + (ML-KEM-768 + X25519)", "(25) (ML-DSA-65 + Ed25519) + (ML-KEM-768 + X25519)", + "(26) (ML-DSA-87 + Ed448) + (ML-KEM-1024 + X448)", "(27) (ML-DSA-65 + ECDSA-NIST-P-256) + (ML-KEM-768 + ECDH-NIST-P-256)", "(28) (ML-DSA-87 + ECDSA-NIST-P-384) + (ML-KEM-1024 + ECDH-NIST-P-384)", "(29) (ML-DSA-65 + ECDSA-brainpoolP256r1) + (ML-KEM-768 + ECDH-brainpoolP256r1)", "(30) (ML-DSA-87 + ECDSA-brainpoolP384r1) + (ML-KEM-1024 + ECDH-brainpoolP384r1)", - "(31) SLH-DSA-SHA2 + MLKEM-ECDH Composite", - "(32) SLH-DSA-SHAKE + MLKEM-ECDH Composite", + "(31) SLH-DSA-SHAKE-128f + (ML-KEM-768 + X25519)", + "(32) SLH-DSA-SHAKE-128s + (ML-KEM-768 + X25519)", + "(33) SLH-DSA-SHAKE-256s + (ML-KEM-1024 + ECDH-NIST-P-384)", ] - USERIDS = ['enc-sign25@rnp', 'enc-sign27@rnp', 'enc-sign28@rnp', 'enc-sign29@rnp', 'enc-sign30@rnp','enc-sign32a@rnp','enc-sign32b@rnp','enc-sign32c@rnp','enc-sign24-v4-key@rnp'] + USERIDS = ['enc-sign25@rnp', 'enc-sign26@rnp', 'enc-sign27@rnp', 'enc-sign28@rnp', 'enc-sign29@rnp', 'enc-sign30@rnp','enc-sign32a@rnp','enc-sign32b@rnp','enc-sign32c@rnp','enc-sign24-v4-key@rnp'] - # '24' in the below array creates a v4 primary signature key with a v4 pqc subkey without a Features Subpacket. This way we test PQC encryption to a v4 subkey. RNP prefers the PQC subkey in case of a certificate having a PQC and a - # non-PQC subkey. - ALGO = [25, 27, 28, 29, 30, 32, 32, 32, 24, ] - ALGO_PARAM = [None, None, None, None, None, 1, 2, 6, None, ] + ALGO = [25, 26, 27, 28, 29, 30, 31, 32, 33, 24, ] + ALGO_PARAM = [None, None, None, None, None, None, None, None, None, None ] aead_list = [] passwds = [ ] for x in range(len(ALGO)): passwds.append('testpw' if x % 1 == 0 else '') diff --git a/src/tests/data/test_v6_valid_data/transferable_pubkey_v6.asc b/src/tests/data/RFC9580/A.3.transferable-pubkey-v6.asc similarity index 100% rename from src/tests/data/test_v6_valid_data/transferable_pubkey_v6.asc rename to src/tests/data/RFC9580/A.3.transferable-pubkey-v6.asc diff --git a/src/tests/data/test_v6_valid_data/transferable_seckey_v6.asc b/src/tests/data/RFC9580/A.4.transferable-seckey-v6.asc similarity index 100% rename from src/tests/data/test_v6_valid_data/transferable_seckey_v6.asc rename to src/tests/data/RFC9580/A.4.transferable-seckey-v6.asc diff --git a/src/tests/data/RFC9580/A.6.-sample-cleartext-signed-message.asc b/src/tests/data/RFC9580/A.6.-sample-cleartext-signed-message.asc new file mode 100644 index 0000000000..958bc382d3 --- /dev/null +++ b/src/tests/data/RFC9580/A.6.-sample-cleartext-signed-message.asc @@ -0,0 +1,15 @@ +-----BEGIN PGP SIGNED MESSAGE----- + +What we need from the grocery store: + +- - tofu +- - vegetables +- - noodles + +-----BEGIN PGP SIGNATURE----- + +wpgGARsKAAAAKQWCY5ijYyIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6 +2azJAAAAAGk2IHZJX1AhiJD39eLuPBgiUU9wUA9VHYblySHkBONKU/usJ9BvuAqo +/FvLFuGWMbKAdA+epq7V4HOtAPlBWmU8QOd6aud+aSunHQaaEJ+iTFjP2OMW0KBr +NK2ay45cX1IVAQ== +-----END PGP SIGNATURE----- diff --git a/src/tests/data/RFC9580/A.7.-sample-inline-signed-message.asc b/src/tests/data/RFC9580/A.7.-sample-inline-signed-message.asc new file mode 100644 index 0000000000..627a98a704 --- /dev/null +++ b/src/tests/data/RFC9580/A.7.-sample-inline-signed-message.asc @@ -0,0 +1,10 @@ +-----BEGIN PGP MESSAGE----- + +xEYGAQobIHZJX1AhiJD39eLuPBgiUU9wUA9VHYblySHkBONKU/usyxhsTwYJppfk +1S36bHIrDB8eJ8GKVnCPZSXsJ7rZrMkBy0p1AAAAAABXaGF0IHdlIG5lZWQgZnJv +bSB0aGUgZ3JvY2VyeSBzdG9yZToKCi0gdG9mdQotIHZlZ2V0YWJsZXMKLSBub29k +bGVzCsKYBgEbCgAAACkFgmOYo2MiIQbLGGxPBgmml+TVLfpscisMHx4nwYpWcI9l +JewnutmsyQAAAABpNiB2SV9QIYiQ9/Xi7jwYIlFPcFAPVR2G5ckh5ATjSlP7rCfQ +b7gKqPxbyxbhljGygHQPnqau1eBzrQD5QVplPEDnemrnfmkrpx0GmhCfokxYz9jj +FtCgazStmsuOXF9SFQE= +-----END PGP MESSAGE----- diff --git a/src/tests/data/test_v6_valid_data/v6pkesk.asc b/src/tests/data/RFC9580/A.8.5-v6pkesk-v2seipd similarity index 100% rename from src/tests/data/test_v6_valid_data/v6pkesk.asc rename to src/tests/data/RFC9580/A.8.5-v6pkesk-v2seipd diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-mlkem.pub.asc b/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-mlkem.pub.asc deleted file mode 100644 index 5b1c3551fb..0000000000 --- a/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-mlkem.pub.asc +++ /dev/null @@ -1,41 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -=dPFW ------END PGP PUBLIC KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-mlkem.sec.asc b/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-mlkem.sec.asc deleted file mode 100644 index ba7a502109..0000000000 --- a/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-mlkem.sec.asc +++ /dev/null @@ -1,94 +0,0 @@ ------BEGIN PGP PRIVATE KEY BLOCK----- - -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 -0O22blDNAr/tDA== -=q5En ------END PGP PRIVATE KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-sample-message-v1.asc b/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-sample-message-v1.asc new file mode 100644 index 0000000000..74fdbd1462 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-sample-message-v1.asc @@ -0,0 +1,34 @@ +-----BEGIN PGP MESSAGE----- + +wcPUA6T5X5he1hpRI8oKxrVQiCkB27ePKVHeA4pTYMKZA6u1l8syrP2+sEULDgvB +GmH6+0mTw07VEh6J1i1+3ymnnTqLhkv3YqdBtiC81+PL05YPCymPZaWf0ajq+4sM +dnBfLJ3BPrsJw03sVHIBh+L3qolG0CliIzGKxIPz9F5RBSvDdSIwCNg9hnfZjpMu +kcmceYISpWjJR+LeAieyYOTZ+Qhx71jYQ2svfpwW+XAw03uMpZkvqkOJmYr8uUca +i8x2j4G6EUXuu9NswSPPirCqU6OZVdpoHUZusFyRZz89V10fQr9hrnJOGw0VtPGz +SMEulSosvnvnK2BQ2ccJVNn0s/mk+fttQLpBBsKCH0UK8norIXt5ahxdj9sSwBTf +q6cPlHz1o9OnFSuewFkapA4PuLxhf4YY8ZTsC9LUZLiMf8MrMza7gbtnEbBzW3bx +y6QD6I+PneJl/8M5a7ECrlFuR2p3Kyt6MTiY+6sxJ1GOVhpNS24iO/LRxAUe8DRi +tFC46oEQFByp98SIWt3JoJKHcjQzLKTjRWfYhZDiUnBkoM6nYaAZdItcFsBDG3IV +1UstcmfcCugJyWi8V8XHVKdhWe3bWc1WrhieDCVpfSBD2NnRMGG+g90WtHcwhntf +n/mwyR/GLG+gRc16I5hPm84lS34+/txx745yDXdTx/szZAqQw0VW47CwF17A3wdw +cX1UDnUnf7/llFKqg8Zn/GXGIEreo5q/83Ib7dehm50APhtaKnQzoPbPPu21lw+8 +/3gisYxQbmrphEpU2KWWWrG5g8P3JG/D9wlHwDhhXPCdNFB7wthQbaDQ1WnN3WlV +BEtWMOqLTIovjrxHbn5judqLYQQgZPbMguzj5JXrQM7wVu4o0edv967oI6ZRBg4y +BtwlXWF3cgMvvAFfH8fXGXAtJw5Gz4/gxzan1q1JcOm6Akgp55J37LlPeXIKHiyX +W/J8qEbk0XgSSa5VduPfnP7AzrLWtyT5B9lqPszmR7euLXvb+tCuNa/G/ldceJO8 +6MKJVXYuYnk2qpuNWV1NPlCUH583LH2xgJ1YNk6U7ID4opcBMJuVM+MTA7cmLObE +Fdoa2TvJu5rpyrnqedHPNgE98P95kZJ/UtaIqJL+zzGkD5rip70DJPuQ6CkVwX1o +pTx2EKwi3c8H5QZtZUkLYeh8x/1LidZeLBdMLut1Lc7BmD0j0wU0PrwaSLsWAYmW +L16/cY9xPwIqmC8nST8rH94QoBl5eFkm3HrDYjJZrNybk0RKP5oLKG8QoUO2kXyW +9TfKNplK0YCfGTgKcTK6luDSM2cCdwlPdspwCRLPX7L7LZYaK8nEfAFD6Al8ZC45 +meBQgY4SuDlucygbFAHitrXLv4ukBDNRFxe+2dVzig5ryHZj97H5vp89aYH1W3gh +GS/k57744ziY/ACTz8cRxVKgM1oTYjDsNKvmM2J6ij7vRxuMBvM/kO7g+0jD2hPV +eWyIS1VKeT1LG7sRBd+GVQ9jHKpP/7YonXYUrOkpCdG/5YOX6Doo3VlVTRi00QmC +t8716eEJLd7ivorFYFELY5eOEUcjmNLSwEgBr2kPm1Mkn8RS8mCNT188nXgTzZk7 +jZ1rurNkkqQM53xMaLmQImS+N20GPoa2RdHW+R/veP7LugLO7gozMi/zz9+kcd0Y +wPahWnYsZ4uHg/zbgFMIH/iwQ04nv58gOLJfJafGarwotFvBIfl4Nd607lmVJTc0 +OjVhhisWL5WDIC82+DDu0yDLH/huzY4W7/ks3Hn/UpEwzq+A1/bY3MbQomew5hTI +99z/IeulfiT8/0POofN3lvMvTzeGuMMsBiMFp2nbCEHrwWCN9uaE3eAbj3E0OtAM +AIIfxypiV+bYm0IA58t7Ur3kMG1KZmcKG4DF5zrL1u5ArX/T7258Z7shYff7WtNU +Wfo= +-----END PGP MESSAGE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-sample-message-v2.asc b/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-sample-message-v2.asc new file mode 100644 index 0000000000..12051f988d --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-sample-message-v2.asc @@ -0,0 +1,34 @@ +-----BEGIN PGP MESSAGE----- + +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 +-----END PGP MESSAGE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-sample-pk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-sample-pk.asc new file mode 100644 index 0000000000..326910cca8 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-sample-pk.asc @@ -0,0 +1,38 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xiYEZ3SFgBuhDibMGc69QTyzKYr3R7MMaQOZuU0Bwg82JVcL+NGHs80uUFFDIHVz +ZXIgKFRlc3QgS2V5KSA8cHFjLXRlc3Qta2V5QGV4YW1wbGUuY29tPsLAAAQTGwgA +dgWCZ3SFgAMLCQcJkHEC/+07nPEtNRQAAAAAABwAEHNhbHRAbm90YXRpb25zLm9w +ZW5wZ3Bqcy5vcmflJVsqmBkKP2CYLg2xa6JXAhUIAhYAAhkBApsDAh4JFiEENC5d +st40UhXLLJRPcQL/7Tuc8S0FJwkCBwIAAIr/NRxHkYYrDZWvofM1fr0PR2wm+f7p +IKQRudu8c4NlCwmkybPw7zRpf3AvhIVkPAZNfnSkq/X8BQZsW935MUxGBM7EBgRn +dIWAI7CH6qAx691VA++rI/ST/tOI8x3gIU156DxdzewrNvNVAfgMKOgwh5CPBrjM +6DxOATrLmLtUclmS+8WUxrU6rmvIkhy0aKi6aXS+7tDOSFGn2GmnFEZpxgEVYCuh +b5Y6TFV996wJ98swFdkkzJZ/MMYUSdkKJdErPpuC9ocre+IdGtOQ/TPCMpdifsPB +ueI5nGkcZjaAZTp3rDNOdqO05cHGY8CidqaNVMPEjaqKgClAZ7ucAPOzHyevfYoA +qINpk/A3tVu1QOVeJoVpJNyGhlBvmGoa6MdysdVYHnoN3fYK4zWQBwjCRLfMBSph +/gmvBjZYwwBDhkKw7Bc2c9C4Oxsf/elrr9oDZLSwoDx0vmR59yeqV3uZJaVgPKBY +vbi5I9iR8nqhu8dSrytzEBW+EYyWwSBORipHUNMSwPiOr8K+cAZuJYtu16bPNTcL +8Eph5VNG7zgpeAcHXKe4KkNLeiV9KrNfI1vA7uZdPBYE2AU96hxMI/QXsyqlQlKn +1xu20fg6DfgkeJMWcVmvxIV5r6ocSRpZT9hvkEBUktmZ+khV3+fDmjLMCNYxD7uE +Y2xCuvfHfCYhbil1ALB9THxnReWl8Oa1BeMGCAQPclI7LpA+XYRnT0cXg+IXQkom +YykxBXQ50mcDE4ksfABRNOMNo0fDigojfoPE7Qc2KtdEwAEbNvQ9LYRQLjK/XZGB +WxQF3SBYAmJfcNUacIOkMKViZfpVE3OvkIl06vqkY0KuMyB79ygX98vDzPVbFoSE +gqq27UV5akMpUQERMUoNHqgPKSJtZ9FnaVqUQzZjREbEQ8vJLAaYxLJC7jp9v7Ml +Kxs/CCoqSIFsfylEbFEAznZFqGtoG6F5X+wrA/qFXpnCt2Fj6GtBtllR5Swg6za/ +2JfOntdtD3gw5myigcWPcUsBf7GbuSt/5hmAcFJmXXxrctZznsbK9GoGGUpBIwZE +QlmCWKovgbMApVsa+tZKWMS+miuR8gjL6BgGvAWyMqeGVylxZ+tSqFvFLVM1HFXG +e3Jw+isEAwoL7fM5JZm62henwmcdfIEoCiehKgwXPMTPdYyLauawKJyOjsmdaQBh +zadLnDMA9oeSDVXKRuUr23G4KfIODYW9mAukmxrKzGIO6+er6uFfjwFk6JYyW0WW +WIPOkgzJzdge77RiGexM3qxEzqrORSF8hDRpLuTAf3bMGvtKg2WSXeEryAMeEGQT +A9G7VyBWDlWVRrCg35dmqkK8/XRc1hgVnbpFRCtX7qVXqjS0kRq7pxFLbjNPnbl4 +K/kfaKZPepQCHcomqwYIJcJ6BPfCq1m4N1UKMaZForIjhEGZZ8eofOFlM6Ag5rYj +TksBsjkdAXpDccAMt2gN24F9YVAZOKR9TpRCuzNsPRIlV7ttymtHQaxiT6CIHAXG +wEMgt+AnqbS8R3yyStY2JLfCZRDNvRFKbYRyuZpuAAmzIuoUmimNs4Q6djRgFwRk +1vA2Q3R4ViGbX3YIwvXBMcCdWPkOYzpIUgKHXoYFxRJpCSfHYiyBK/Ee2qBPwUSB +oLJfz/UzqEs4gLpLkdNtm/VaWsRZgMOVSsEdafixkjuTTZPKRzQxzvGdb6trnAel +1CWT+Pij2ntlbD97M1zrfbPkPDLCqgQYGwgAYAWCZ3SFgAmQcQL/7Tuc8S01FAAA +AAAAHAAQc2FsdEBub3RhdGlvbnMub3BlbnBncGpzLm9yZ4FVp+bTKsczX/GgKZeN ++FACmwwWIQQ0Ll2y3jRSFcsslE9xAv/tO5zxLQAA5/0MJ1LCdnvMDjNQkS+1H2H7 +WttYQKbEq2/yj2hWWuL9Wc9m6v8PtmFguVBWPYT01a4jEvb3tKFJ3C0qEyXzApsJ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-sample-sk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-sample-sk.asc new file mode 100644 index 0000000000..28a98b0282 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v4-eddsa-sample-sk.asc @@ -0,0 +1,41 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v4-seipdv1.asc b/src/tests/data/draft-ietf-openpgp-pqc/v4-seipdv1.asc deleted file mode 100644 index 434b61328f..0000000000 --- a/src/tests/data/draft-ietf-openpgp-pqc/v4-seipdv1.asc +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN PGP MESSAGE----- - -wcPUA+RAz7r/1vNXafOEf/qo/UCjgP5MHXsUdzusv+Xtwa/q5/gtvWSKENMEm/ef -mwvHzlOW3jyHPr3wNkiRGNmZdEgHlRUxOF67AKfUqX1/H+RawlXrnu2O/7xDfn09 -1DOeYQYsG+VQe5eDfPOh6EAqvhglNG29enkwukjQuWJ0U2+SywRlh0J49oG0lZZi -tEonE6BX+dKo7JFAAW27I4+I15zamWCm7C2qXtcjlMq+68U6isstfJYBgCFoJLRV -9ME/JlwVQ/3OA4eagh1Ysw/s0Kbl8dWc/U+pUVINfLFnZbr8UnRx5QVjo47HzV9y -IPQcl1ETnrQqg4jH5cUB0wVB/OGSHEH1l1q7OwO4TBx9seRKza3wzHgXQyQn4jJn -WxG4Uf0rWwa/dbXpoGdxye7Di0HhFJBp4aPaPEm9RwmeD06HPGyurgQS2heW+ICR -X9q6HjxKmbIToWau7sEUZQh1isRD923zmZO1Cceiefwvv8RDErBaYRRfhoDHnwlf -haUkGDH55GC/mFgMUst7XjYLTpjTtM32bHHVoYyx3edk3V4C32dRP4geZRlq8MKb -3eNvTyZHPBXVeVjB2XVenMkju2qQvjAvr7xkJk5QvqRGZ3qy5JKPHjupPKMKR6Wv -90WtP9OPf6geE4K8g8dc4yqhqEf84IpWfwyUjglPwc8G7QURyc14INSgnVKQ8nzJ -26Y0YSuBG599cwnBXIv7TLOsrmpcR+3O/OiqztEXwBSFalWqC6SScWr51+K4RHpi -0Dg3GYOdeu9V12ofWhh5eoXiQxiThsDc0cYD2LwwITb/sXJW6jisvTSQSszuDJsg -w4LJGVIgk94GwBeYCa4w+YbFD/6bC+nd9hze5iWyAt4jx2XuYWHvI95wUvRal4Y6 -LcYKShZslef/9sZlrJ3O+oM8Tc+xjr7w860cw9bHBaRA3oZfDwVLRbJ63bh6dzLS -8Vj4UL0NiK9AlokOTlYTatKj2tkLaD6snZ5QaS916NniwvBiSozyCWKFPvKbIA5t -Fy7bWMk70wd7FJ5rOYsRvWOodcxxfYHLyOYCRikP5sOgelHJfIcqZZM/iMyKrUl5 -QXTe5SUMFKuAAWkv1nFgJqaBGkkYUN+aL6um4ogKJKxBArhUXtz5jp1zLQe6w7Pf -XtJ3rtnLMNIGbaJjN6jlSqB1lF88ljU6yL8lsfNfGuq6eLsNz1QD9sFoZyNKGVF8 -uGcX8KH07hyNCOPbn4jMZqnLfcEwT971KNeW0NNNLaVIjiYtYrEInYpnGP1fW0G7 -4ic4/CGZ0Jsti39rTPdz76n14EV5+HGGNtO92nXr7HhRvlvehZO+pPN2pPvAOQgp -378jEDnhdcFIUnWjaSN4HLjxN9X3tWosa9stVatcOB5n01+QAqdstgbARXiYhzZI -QOy5bk7GzM/xaD+4iMlsMgmhdvI3EuMrvzRHx95YvU+tc8UBhVtMpcxgp5tiPtw7 -wEFyPWYqTA6c+YGTZFzHNhqJ+DqLTlKP6+uYet4pCY6YLcu4z0JMG60Q4/MnuF2u -7pjPG7aRNGwr2/JFeaumSFbs5SrDPwDSOQGz9bQ6fbfGNm9Iw/Gq4EYrNx0raEVt -E1FD8+nRXcS1PribkWlu/qNd0yM+tXMXlryR6wAV3R4p9Q== -=h3Km ------END PGP MESSAGE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v4-seipdv2.asc b/src/tests/data/draft-ietf-openpgp-pqc/v4-seipdv2.asc deleted file mode 100644 index 2c54fd06a0..0000000000 --- a/src/tests/data/draft-ietf-openpgp-pqc/v4-seipdv2.asc +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN PGP MESSAGE----- - -wcPhBhUEvWfZg4iBPoi/NJDz5EDPuv/W81dp/h3ny6MDFKIjw8Jva/pK0mlJJMbX -RtJ2+idWKUL4/Evq2JBL2pky3VeCkhJIAnKdMXBvuucpNC4xVhCREpPquOsQcJE1 -IyR5kdk0uOw/7T5i7i9zb3N8Mn4jObYNxem0PbD44xYfF4BcNZqWPhLSwdFp+uti -FDVcsAtaruQQnwcb0tE9KUxMHsH2QxuG6Xnm+a1v3fds/rp/DqrR1vTcwbeUBej9 -AcrWhRI+KrE80WtMqqB0nvj74Jsx7xrYKyDqi7C50PG1LwTfFmO1kuIOGwEVh3AL -f9vesNee8+QWqJHMuSaqTsndts7Pq2EQ1fzdsrhYvseFEuiITj6OHnvmERjhkVRt -M36v3cA8GmcKI2YLa+fNvyagjgkoUycjNopK94/KQk8DY4JnKEbMHJ1BvUQ6mXkZ -ZeQXEt9gBHMZvTPE4ZPKSR14tki9YbjCvGcklEx1BEhONMo+03C07H/AHMtk5Ia1 -BFDF3dRkOhyXLfJCNKhJL4Sq7Z07CqKYCCzEq6WgKQUlWmiJzEtZKmh61LX3FaVU -A8+iK56QBvYyFUv/T9mGIBvF6qM+1l9BUSDim81EEN3FVKuo5QJ+tEbuKOrDWMTQ -klx3iEmGFeW8/N0gxTMpDKQRqDbkhdwFoM1c1L61NeCfDvTiWWVQQg00Z/n38gGC -S4MC8szKWPPlmtPYsXbyITMLpErgbIfr3IPfwRkm1RWVPQ/T7dm0Iz8ufeVTAqv+ -4+WgeILpQbFf/PmKHlZJnyj+munVaLaV9ed8g/0ncfZ0Vn9sMzGXifAjJ7vT8t/2 -ojSqc1AQuhoNguI3xFUCaUEzmWzOl3ONZhgDr4WTJdvfW/8IHn2y0Kkn5buqLAO5 -LOvrksFgkuy3N21OzgI+H5SeCqOGt5NKgyMAUGKEa5a6ApG/DSecXJ38yr4hTG6k -IGxfd9dlezcdByrohFsRHC93XUSlTnxTqdYmuhK8x4me6QblJFEJhoDTr3lrKTQE -gXC5ncdTLKLLINnZgFRc0oFABKGATf/708nt/vkuhyNroCY2NxGKoem3M8P5radp -vKJ7qRi+ePBmxwPhb5mWVf7G5y509GgVhKUFUWCzvyoyp1HLtekARKrxBAElXo4D -RINA468O/Sx9rWDFFkaShsXqQEhe06C3IhoG6vqagdB82LYcisCWEAKd/hZE99Ub -EWawnQor/jrHhGNQId1nZEwpEE2/cndU3Np0mhoGF/kkjyGah8wxjFRZhX2b+w3M -jmyFyOFGog6SDK1dK6+Vdki3fJFvBCx/uLmuLiNQo2MYeG3B4W30jNDlkxZ2DA14 -1zPXL8S3t54ZCtqiqDO63SNW18o2SB9AJpmSYYF34LO29VJnWIK5/94tIsfwHbAg -P/JdfRmSXkUYDTwJcYR1SOp8IIWwhmybnYctHS/n1q+WnzMj0jJIe4SI9ifoJg6n -+ntRfsqR1B3fcTAKN0XK6pnNy+pJ1BCVDOYDz5RGsAa61wJdVK/mXEg7VyjMlf0t -EnPzSfwfotMPoZs9n+MuK/BO0AX8DqzY8SluBALG6Eu5OV+A0lQCCQIMeNuKCuzH -CoYERR8ds1jE9m+xLEGK7i1+zr5FSdzGowHh4xMo95Zk5JUubl5rYvcYbHgVVKKE -9mwM7/4Q5mXZ2xvsBftkujgamZM2UN9UYSA= ------END PGP MESSAGE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-mlkem.pub.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-mlkem.pub.asc deleted file mode 100644 index 623953e31f..0000000000 --- a/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-mlkem.pub.asc +++ /dev/null @@ -1,41 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 ------END PGP PUBLIC KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-mlkem.sec.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-mlkem.sec.asc deleted file mode 100644 index 92a249311b..0000000000 --- a/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-mlkem.sec.asc +++ /dev/null @@ -1,93 +0,0 @@ ------BEGIN PGP PRIVATE KEY BLOCK----- - -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 -/d8lkIgM ------END PGP PRIVATE KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-sample-message.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-sample-message.asc new file mode 100644 index 0000000000..0e9b8ed377 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-sample-message.asc @@ -0,0 +1,35 @@ +-----BEGIN PGP MESSAGE----- + +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 +ngqFrEkdOzaOHiIZarV74y3G3wZyzXobjp+dpA== +-----END PGP MESSAGE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-sample-pk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-sample-pk.asc new file mode 100644 index 0000000000..ee48676937 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-sample-pk.asc @@ -0,0 +1,40 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-sample-sk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-sample-sk.asc new file mode 100644 index 0000000000..3910bae59a --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-eddsa-sample-sk.asc @@ -0,0 +1,43 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +xUsGZ3SFgBsAAAAg3LSTXMTIYPje/3KOQ480cxsp1t0/1w2687B8uqUTCvwArfra +hBTuKijHaDe4/1ZcaYn7Z67De15iWPC/vGa3J4DCngYfGwgAAAA/BYJndIWAAwsJ +BwIVCAIWAAKbAwIeCSKhBseJ4X2dvcp7PIM6PAY/6wNT+ArZEf4nho+wZF34A+lH +BScJAgcCAAAAADQ7EIBsYsSttPe/Uf3gEmjU8NG0Ej59FY8N8de0aowAompVXg4Q +T9j1IsjmU28Ex/k1PTewAx5OoeQpQbJ4jjH+R/OZ730kkv+c+1mea5dpJdINzS5Q +UUMgdXNlciAoVGVzdCBLZXkpIDxwcWMtdGVzdC1rZXlAZXhhbXBsZS5jb20+wosG +ExsIAAAALAWCZ3SFgAIZASKhBseJ4X2dvcp7PIM6PAY/6wNT+ArZEf4nho+wZF34 +A+lHAAAAAD4xEPlvPfA18bTluf3pkoZII9dcKltRjMIkbZqDg5el9xpB50br+7lg +CeQ4FOlsdrb9u7+twdm46fd6pR74naBnq6puYgsQnlLpTfnWqX6BB7sHx8RrBmd0 +hYAjAAAEwCIVC0MM9yTsGbi+Vd+byq3jJwhXETaUBKV1yAI0Q7BfXkJC3YN0sGUL +B1LIvZBSlFEx/9op4ncn+0J9IKeKzuu449mu2UdNA/XK+5wl+sGGdTVNrJq3s7R/ +BktVNWBMG0t+eYBtItQaxwYucsOntcO344uH1BA+ZHIALxsHN6KrZPCeqfF9ppTB +8UAlvVR0JATPtyyuxFw6MUex06GlYzirMXafH8jK5KqZJbjBKWwPo7bIsBBbLpqk +9yQxb7YYJ6VQMGkitrRwWNwQxTGDTee8/FyUMIYklGMewmG65RkKrBMKICsBX7lD +1cQ7fisEp7Y+WoOVqass6FuOWKJLIhyrg+A93oUsNBhGz/iEgJehP2g8AQPNMnO+ +IicgIwQdV+YJRreWKvQosYMHxtopQRWKRXmmrGKPFYeozvoo6qR+JImvIDgy0gV/ +eEun8iVoQbxuBXPIQXJOicOFPiWjXisG/0G3rOyRE9o0ivlxZPku2qKayfFtMwxb +NWg54ieV/uRfrjRRHOnL0SaxigY8N0FIwaTB4uMeyqphG+Ri7nSgnLVxaES9/tzN +iKlgsuAuC5k7E+XPAonGy9Ikm+oHJ9hg0XKNzvyNR/uwWhB2WFmFDRB3ldVE3/wh +LLe7yPmptIFWZ3J2LaaFqTyUhoNW6spRkUWeNMgo3MxRS3QgmBGXqou6/7RT2tdV +rWIY8WJO5SmMnZcrJ6oX3qKYgFiJJgCTuUegr/cNNJNLE/shyedkdxfG6jaQSzrL +xOWg0fBHtrd1snWWryCofwi7ray3HjNnKjNddfiChjWkLpu5H2dYM/CzdnmmOlk9 +71vJgeZ6SrivUlwLTHDIkVqVr5F+iPXHU+Wd6hcUxrIH4eUXTJFIUYiamSqb35cg +AAzOBBS/DKwD46pOURchwRNRUbu47qiJE4AT6Ia0dTFkCSRezaJXBNe9+oisPDct +QTx/VZaktkvK4hc+DLwuMiQuQMoev0CgzLlr7XpxvCaEGYOiFTJydFtlhepmheZ3 +k0puE5lY8AOJBEd1PKPEDzwqD0wOBxaMTEQGiPqH39ENs4q08BcOXjANqwtjxVot +JIurlBcxgsZ16RZOyiaRcCs358AMrExMScNfU+HBIONqxRkzCPOqn3sCMzQO+dwJ +uxNUoEYDcUAtYos8+1BdaHvGaeNMY3EuxQWeAJQEN4dpYfe29qlcYOwcHRtYosmL +c7OaHMQ7wnCzdJeyiHobAIgVZGZvAyW6w9cTlQd2pTdsDgSmO8or69gYPKxsmLei +b3JoytejtBhnaexyfeCFhksHzJlu48l65fDFE3h5Pmqj8vRGfFik2qbIzrU11ala +/IiJD7RnwTQCYuO++yKBa7rC1qXCXBFZixBwwTavHeEAPNnMmWxDfna2frNnFKRo +dDaTM7o76Gs7rgTIeLAzQfZih1yAJpSwjEcVDZdIRaRTrkK/4PJzVHGb4wwkOwfL +oPEBCMuAYTxfqJVEgdBi6pUsPaEOQzkUeIeOVgoFnMhP3+N22fMWkCBc/LYOThtP +XFWtHkq5jmmj+aiuyGOaadccBKWTvxloBly25QADfbYI2oImtVu1JDjFCf6PQ74U +WSEf9EvmTgsMQq/TPICLDUyoTkteLTQAwE2+uDYPxbo85xlZ2/yGneciXS8MvfqB +z8ZOI/y0C3xRsn7ZFZ2nEAaP9RUboQSSkc/gerixe47HC7X+MP6h7UAy49+ndvRO +6AHx2zZzPiDlZ0NgX3p6Aem45zjfMT7+wosGGBsIAAAALAWCZ3SFgAKbDCKhBseJ +4X2dvcp7PIM6PAY/6wNT+ArZEf4nho+wZF34A+lHAAAAAMitELFBvWMJM18SWIqP +kabwnOQbeR9GdZt2dJZF0YO8qGRmLO+T7GIaYj9TlzHonA3y01AAlYdfvolBM2gL +pujFf59V4t3iZxgQfgvs0+vrcSsE +-----END PGP PRIVATE KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-message.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-message.asc new file mode 100644 index 0000000000..385195bf2d --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-message.asc @@ -0,0 +1,104 @@ +-----BEGIN PGP MESSAGE----- + +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 +ak/MpQwGKTcC2WrrqWhgq/WTs+8NCk5Vfa2P +-----END PGP MESSAGE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-pk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-pk.asc new file mode 100644 index 0000000000..74440a8c98 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-pk.asc @@ -0,0 +1,288 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +AAAAAAAAAAAABA8TGSIp +-----END PGP PUBLIC KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-signature.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-signature.asc new file mode 100644 index 0000000000..5edb9ff88a --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-signature.asc @@ -0,0 +1,75 @@ +-----BEGIN PGP SIGNATURE----- + +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 +-----END PGP SIGNATURE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-sk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-sk.asc new file mode 100644 index 0000000000..c0935a36ff --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-sk.asc @@ -0,0 +1,291 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-message.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-message.asc new file mode 100644 index 0000000000..04e00ccf27 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-message.asc @@ -0,0 +1,144 @@ +-----BEGIN PGP MESSAGE----- + +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 +r9dO/yldgvycbQA= +-----END PGP MESSAGE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-pk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-pk.asc new file mode 100644 index 0000000000..24576286c4 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-pk.asc @@ -0,0 +1,397 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +BQwVHCIoMDU= +-----END PGP PUBLIC KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-signature.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-signature.asc new file mode 100644 index 0000000000..683a5a9abb --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-signature.asc @@ -0,0 +1,104 @@ +-----BEGIN PGP SIGNATURE----- + +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 +-----END PGP SIGNATURE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-sk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-sk.asc new file mode 100644 index 0000000000..0d8bb117b9 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-sk.asc @@ -0,0 +1,401 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAUMFRwiKDA1 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-seipdv2.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-seipdv2.asc deleted file mode 100644 index 5c802b2a9d..0000000000 --- a/src/tests/data/draft-ietf-openpgp-pqc/v6-seipdv2.asc +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN PGP MESSAGE----- - -wcPtBiEGJj40tpk451PcZ8qO43ZSeVE14OFuSIhxA8EdcwffQO1pU4rRGXPhivmf -yaE7whd94FIPayIJxbUXuq6Ei6VifzlPu9BoxvQYZa/u+exaOVT2MLxbCAceHYMw -zSuUa0BoiugafZWAnVrn4ji+mI+298c93Ij83yUjkzvBsKyJuhesTevSpJAnjiMt -m9Mmwzc8Y9tB4N/Am8jR3p8UYLH+2aH9FyT6VdqsETYiPFcz5jZqkag7bAB88KUg -heJAHU/FgHXtz013tnPyQPtuVHeJrP8jcd3IENJh9CfSg9rkhAoW72GiSGYPm+Im -I7faHJ8LMCx4Sbur9rWsZM5Gl+sG2MyjM3SrykAfL8W6s5o3LVw+06h5XnmsLUFE -8nZf99LBm/5aUzkdmq1G8hgLY+dVhTAm1DZxbNz5nDbtCsuIbJ2knS2yqxlQV8qx -5eikfWlW29TfREHJf4von2xR668vYwOibA5sTa3utBpNk2YNalZ61p9MxPW54PvO -+EIRYVTlwhSbETanOBms+yDq0NLooO+OQerT3WA1VzeT7j5rzaQM0ULAK6x/KqKt -ARZmAIufbPktMfX26tczv5sKb5rx1MJexNUhnxvn/xGDkAvbf8HrU3BpxbqPPX6/ -MWGpggb08U8YQU8qLCMzfPaFajTfyyhOKnoh5MBLNVDzbWyqKLzLGQTXl13WSvxQ -ib2U0YoGZtVmshmiVijCu4x1aX4A02sYKrzeYP2WpAl1sEynKz1tkWZQKS3Jt+RP -Y702QtUrRWWul23cBsqy0uKcQ+Zk/rCh5qyQ9mZtx8EmathdnHpi0qZLAH4wEYTA -HScy59zUR5CoYnJNBDNyRyEuh/B/pkTGEisLb+i1F9M0WhrgfgYSldEzUCZ7KJUD -Bt/d50OM+M8kmkYYBmiyWBfNqMMckJHhjFAp8kd0V0FP7lVwPGywK2hGKQBF+ylh -9O3qq1knDkjyCLNIoi7kJkl5KEOq1qLfwRnqfTbivGnhMdWh658WX7Q5QCUZf6vT -+aH2SXA+HNd4VAQguWbnmRNmjW33PTdte25T36qHQ6jlCdyG4VZU8f1yuqzhbHPx -FwAaChb/B6l5SIxK8zupbT3K5NDsSrD0wBV52P377GGVF1z1wI/+0ftNTxu/mgx5 -aDjNyxUpupVsqWnws7a/6ixMUqyYAI8TlVWj2vBXgIg9gvt+yp/X7iMD3V4v3z/P -c8o2nH1c9uB6bXJx4HrtenjkDA4uQ89NH35yBII5OviL4NWTmMArWSN5scBOYOMJ -KxGDvFCkgcGjE5x6srj0gzntFg3TcYQiC4+onS485xTQlud53Z7Vc4JnSn7F2j9P -AJX5s+yUgT+ob7SYvYigbp30Oe5fg0NVZzH1fJ3eTJheClb+87vjrZS4X1tVU0MG -LNCdjF20Jff31fZu16mxin+hUZVyfVRlSycfVJU7qXzZftTpr3rsNZiLlY7z7BRe -1lXSx7uZFCfhyu96hyIPxMuaBIX7OHkduinurQ58Vj92fAe/8f5jviRVqtKwZ9Ao -lZfjSn8k/CgDxzFu2gWpbhWJ4GKvoXgmWDESk4o07UGqDbhm0YO5MDM0uoAmsGae -0lQCCQIMTzhupJq1yZ3vljrXBYF37QuWDi/MAvL54hMis5UXrTAh0+FobZAXCoO0 -epU7H8CIs4ZCelIyD1W+K/kv3/E3Z65WQzDOYOhXSCAOqcpjiPc= ------END PGP MESSAGE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128f-sample-pk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128f-sample-pk.asc new file mode 100644 index 0000000000..3555af1b3f --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128f-sample-pk.asc @@ -0,0 +1,1104 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xioGZ3SFgCEAAAAgAPgBfTTJHhEe64x46DUvUxoGXyqY0s4RfDfCrZUgKdXC/wAA +Qx8GHyEMAAAAQAWCZ3SFgAMLCQcDFQwIAhYAApsDAh4JIqEG1U4DBwIRafe4i+sr +duOq0OEUvhqPmC1026nKUdA1N/QFJwkCBwIAAAAAIhoQT02KjrI5Qj2LSnmBJD6K +/p+oMy5L18Fcp4HMtlVUw4JJoneh8poKx6U0PmarYa9+iqbUIAbs9IUJ+olEJxKc +vWllwjQEu5LT8WtQvfHyy8j2xC4qjVc1QgW96Qfnkq0uGlf/79dxtc7dlh9l8Qhu +wzqyYcHWAOnBH2CYaWP56w15Nsfp2FDzklRnRKI9PXcdaKfhT6tr2yV1q0kXIeLk +oW73YgGvwEDVq9G9m52mWT0QAb1ftAhRnM2ytLxTZz5ZaqxT6v84b3oU09N8HWPj +hGxSOh15nyuRlIBwfiCbrogZ8HLcznhxpo/VIZKbYENL9F/GnPFMLTg1oKZxyLoW +kBoZw7Q445KCgJr23nVoLH6vyFtYOAzhwwVJPKOQtqlwMCgci90a+4wCawJW2bTO +o2z2fLxPNrvbChND2GREoXd2IzPgYiMUfwDYUePnFbGM3VVYvfD/BJ9GH4HkmzKg +z5WMi8XZp8IEaOYlLrpa+fVE8ow2b1QDKFIjV175Sk1PaSS9MnyxXimn08QTrEFl +VhH0wr6LYg2HV0f3vIEON0haocmTORr2ky14rEn3T7RJeWRQTZBIhduf69a2LB96 +OSVEOSSeRYXJNCw8lFT3MtDmkd210ibl6+X57R9INfWkPg+1oHvW7R7nNbrC7ZO+ +eQDZPUvCdIhuEHc72i4rLGlz9EguCi0jQX1ae2wYX0VPL7FlbvIUgLAl+0/izhdA +G0IeNucMLan3Gxi8n3n2LiMyB1xDEqyq4chZrm+sF/EeMagfoBnw3XRsf4nUZQLA +XcBn3Ld2VuHpd0lt84+OjoRYK5eqSgWRb20FyEAOTvd578eCs1W4oJCZRG7TUW8V ++r27xRZxvleA1pDFMcjuWhkaqxZBhXO27MBx4wlALj2LsQA8Q8ldsJFHvMRacbtd +I/ax+Rt5gr+Z7GbnctxJBnCLSXUwewNgJVsIJnJe0mPg7G6K/8+oMc/0UNiIedFy +C8TYg0t1zxEwgrqa0PbtabkX5x0+VLTSSKZhEr4qmYMahlV4804yGf/yg2H7Zvko +6kpq6wx4ohbCzGb5uP8z9tqrqhPqqHAhJI2oS+da58h+YUhFMNU7U11y7ZHPY0Nc +twdwa2wjOIGWBaQ/mOGGUjRdtDHEKUae5Jp6/o2O+da2ctxJkzifv9StThvM2aSj +IKDBgeYJppFSG4FEux1CTQP5b3cug+vTKr5js6pMVMzrtntegG38ISAsOFNGLY9A +bma4ENm6j9+8vfPaFGazy1CToagS803vQZjVDqeBZQPtIwCV4wCZp2LRLnoCi2fv +oMTf5IMmPkMvqRnyVgp6VUg8bjxR0XBiQtQY5KM1nY4obKFDplqgBVVOe/Cghgap +TqUifOLISbOQgDwcW72LEZoCtiKC3aLRrHCUk/0U9T7rnoYYrrgkWwOlTPAXfg4b +Eoe+AXfivd0p8ILqGt54QaWaJ9Jgaldu9MFw1wDQfVR7TtypvbfDiiwSasPn5pce +q46XusBM/rCniX4yg0JsIp97qzmz9VcwA8G3Bd2K5VOxlOWtSRaGbh+gxMhBtJqn +nwK6MGhzcpqCKKy32E99llhj+3aXPiiKIzKUB6V2tWitT7CKdJGug+JnF+fz6pXS +fjDivbtYDGefilkMpNfXER5ZDOzOSzxSTsVi/kZ8ViAngYQHJeQ2VebDCOfSTdt7 +02n8wP5nzH4FE+HuprfR18sIQrB8v51OvRwNCf1NP4MgIIyLvgxb+OPnKA52e9WL +Bk2w9Za7kum8wLyDbZLCrUh6HuwDpJC8XfrOS2Nm2YAQIllaCYtHZItqn+rS3P5P +3mzxjoxdedPgcm39OIFgwZSOxNZN2YACmP6y8tjDuLEpC6F5IK5bcu3cdjIKrEfe +QBYDPzVQ+jSs6rkFeOWM9WANG8skfCormD4a/BiJngApMsx4BjCyueBySttxp0SH +F8hAA5Md6YyZ9afrj+CafCdaQECSThfbTDmAt5SMkUB3TkeOTbMgKfIylM3cKXXU +c7bft4J7aXQ3YtVVntOlwofZYEIOinEE59qX9kwu7smvU3Tt9gADvckrDPdZq+sZ +NqUR930o2cEv1ho5u+PZ////d93IR66QydC1XF1GtsEZNonhjNKxGzdJFbYCfbqu +zR0qh0ZPq41aGz89kk6CBq1Gs6WQdp5abovbzUZQiBFgiIIduXdm4KBwlGZAsVJr +OpjLkq0QDb/5SVksqElVcmGzxqakOaJQtPuFM2ssQ4c5IRuK6n1L0giIago8sons +vzdnFuyi/RXAE6dNICcqBZ1PUUhGhDawfz+WXQFG6r1TzhbUUEF4F94ksmezDIbg +zqNqV2l8NSkErgvGWvBZBcmRgz9vktEFhxn1meO505yAsfE+qgtqYzyC0otcy/Oo +Rc1bVx7+vke9lbcHONUbYBFZMsVeQam9ZBWEMzlUsF7DKpdKHgsVmFVVmgrBmMJ5 +T55p6EOi6k3Vlpf2OYcsD9/CHjkT+cJNso4k86+ldkK6/e+oRAqlfD/Iekxurdbe +E8H2FIo+dqHGSLsYW2gdg8YuN9bL3UC07aAGiIf1MpEEh1CxtfIK4fpdQnlogdRY +5XNAnt3tfkvwndSf8IUKSi8fMfYryR4VLL73ib7UCDZtNAdKRjijc1gt9QwM9PEL +XOcgpa5PBU8KuCnPyU5y9fQ6AVBcNtzOTPfDlMD4MflXtQsyl1bpu8tt6v7rOeNE +bwHbThEP2R/ckDogpMa4pm3p+4EevX+EBm9UdJbpzaj4igcNxjddaqRvKQzivL/i +EIdmEfinv87adtTc4ERh2omcWITavfUQ39Ca+ioNP3Agjyr9DP5jjGld8ahJxpOX +dBAfVW0Wtd96C5JQSgWtREoKW5balF79I8KoNcdfhVd4Pq2TnkGWEpN+7AVRVg2c +N/UOoUVNZtQFwl3fIQTJ70wBdz4h0MkEpHebtnNQONqbAxoL8Cc6jj8thWtgjDEI +pLW+VpIzJN104wm1AVwOVxgx3SqZrC2Ar7RoiZ4ZgheILijMp6Oq4AMveS1DOrRX +1iQZXt5EolFU9b3PlVQNwMOz0Z4jZOs5PXTz8bZ2JUdY3nIugivzsRprP5EcEU9+ +MXRYbu7JjZkvIvGJNXyx7pna8u0tdTDYG0ng+ttP9Rsdh0Sj+bklQw7fKO85cvGB +axs7DgiWFcjZKnFF8THzL2+vBmVNcJI6gG3mcsz7QgcFsOHjDzYStr3ygZn73qv4 +82GM204Fk17NMtaUkiuNZoh9mZOtjwEhcO9dBybA9864lb/bUY6+fETYrD5z+Rqn +2+LHF0RKY3zkHcAl9uoX+AXRur3ctn2VG1baePrt0at5Fk5+Ph06XMM6Ew42ugpL +0ZAzTWLB3g6PULf94lssAzSW/CygyeR/Liaar/x8S2Wp2N5R1Li2rtvHBpPFkch0 +/Q0NDfWZo29sVdEvO2l731V1ihE23VDps1miiO6YRIVd1h3OIjMx5qS61z3iHM4/ +mZD5Rx+NbbasiTXg9sq6M4qHkkQxWnuGdcL9eFftsoNLmWYrytW9jjdk/USUmvli +niBqkjOf86C1/t3SkozSEuanxlfBs3OHrunG9dUKeEyXjaC28XRRmbwRwSa6CZDu +sLoQCFFidgUU8/cT4mNOK4jZWWwEXP1WMpjxIVp2rP89g/Z61rO3fD2mirNOatu3 +bdxsiQK0/sCD+/OSL34n7+vHar3ncaCtd1+LNCCJBveYfXQ+JLNRhUX5z33xWVPT +PFKiHyXOJw7QBFl//SpBLWKKPmOCW6MBYIXvOy6s/lmKTadSFZBYq4kXSYlI3CH+ +mroZzxR6cuma8w0u6PG74nvmruttpkv4w1RNcSOOpaxvm8KS2ExB0sX+ypHMaluW +xPUGz3TkBY42F1V/RjwXCrEpQYLQv3jJ1XkoC2qfaU8LCCVJCjo0Fr5HZYsJ6BRJ +hOex3kdg20BlMD+iLabku51JWiYXMsOfynOXYrCjqhjLxtLuqnrYLcSKDN9+QyGF +dpzVA1AApfLcZ7jP4jbmbPEKjH0/Mo38AGcqMqqxBwBQsqVf8bmJlqRF39aY137O +IFcX+IB6QYP29ESnxqALEH6UsOqUWfqGGZcvQR6vdflnzW21vPKA7ZSiLBR1eb61 +mDqmlBC/ven8O/CJuBnhYABuaBccS2IGuQ402V75At3imZzVv3LCF1djDX1qsI1f +J7LyMvn3cBKzkZXdRfbREHxS/49lebsjmE7xGdVnP2LGCSdrnvb5L7c4uRzBeq7g +DMTRwq1vnXt9aZEqhnfADBI9Af2JZmwHPTnRrhD7ByrUPgbC8y1xi7+PLPpVh6Mm +bf8hW9iFGqo1uQYN3h8Fsn7gEghW6EJod2D6R3FdJJE9k1fSxAEyP4UqfxpTVbS6 +g5tSR8WBhuKYeX6rg7jhP9Q4vNxStwPmOpb+Jaihrkkz+/AMnQJmFfa2s2gNLRfx +/YbJcbSumbwWb9KhHkyV/qh2O+Qp7N90kLpUwEg/OZuEwfPlrC+RoXaal2HSI2yJ +99kxqNcIIVsu33S6WE4z9gGuS1CgY5spDMexDlIa0cpADDFsuS1dIb5OFQHMDTR/ +NnyAdu20fobh5pUzNGQGHKaxZTLIYzd0Ouv1mdTyqbH5+Sg7jwwHwDAUq4tX3pWC +kC63S3NMyTNU9YRJa655pU3MsOrHgm3Dby8adsci7E9LOeobdF/XPLH0TSPYkAWj +0EJB4HfdZjZVyJfwceQOPn25bHgf8tdXY+8JSdD04TBZObSsbCn+cWdIvJQVqZuh +SrV2zA8DnXkPGoxsw1z0tXidoa15tWxxDPMJiQUThUsxgqdZD+ZS7IoNOI9HOE2d +qZL3Lt7eYkt6/GaVLppBkmDd30pP87U58ur3JHGiCFohsAcA1NStq937fZaaNFSa +j03Qp1Kg+nQmEzjVVP0fIifkgbxq6QpjZND+JuY+m4vMpq4s5FkMZRlvQ2O5WOC9 +3Tx8BaMzq+rl7Qv0ZhfPWl3OsRi+nmMAeUY9WmFr0J/MjkuxukfdI6REtOlAjRr4 +58LMxkbU4DxaRlSpEC+h9HAluDVDz/hw2hqjgOeVuq2/D6IAdbdRiyUvLvZSSuyQ +Q3st1lzoX7vab+c+YYIRzmT1zowE0cj8G7dImbdSvgA8+/Z1sIYb6coAt+MZTLrj +1sz+O2l3jrdKINGY4omX2u1oIW1nRICJQR6YfavzKfl/tdYKGOSkk3AUoEgrPdfP +o2/UpGu3+EkAsdAlubbBf9Zcmp3IdGD5Vz5JDAqZ5QNsUgdjS8oFkj81y0jRPtUG +6Z5T3hQyspbxR9hMb+d7lFf9qgDJ0vMFDPFe4zLey+kkMn9VPz3Lnb/D9W6nUTe6 +YaLx2rsnd15WJkqk/VKOWVComaqGo2uCCxw7Bh2XG/yrobx2Au7RQW0vIzPInicj +0nvMtFPVBAtDkxDBsMJc8rJB8zsisD7DgTvdBs+H9BRE6rGlH0Qr5WkI5aoaqP4I +9iKp5ujyEavx++PJRRu4GBo4M2THDtvD0WhUnqKjZqAeML49RubHDSNwvT2L9FJI +028xeGcdpcGV7ppLfwtnL0LkLkVBX1jW0zCmcEGUbWYMVms8D6slyLjqiEaWoNgo +khfBy61e2ZElviqzkX5yRZatNNp4pWe08wyjxIK1wq8fThQApdL1CIrK/xlGBPos +DSEZYr5pAEdYGzKJvZJRubk5iwCrBnWgJLL40mZqfELr8NVO+N/OoNR4wO8POwO3 +GZsjUoVp7XkaQY12QbblFOTyxSA2tA1H4R9BCL1oY12D6G5+NkyxfO7n35jsavIv +i58IY/QQW3LiqbbHCkg9pug2eTUTPEJ662OtmGn3Z/R5miTfLe0Y0oyPY164xMev +S02euqHPYrwHd+hwNUFGv81xDjTKxfo4jBsEoy20qR3bokrZTSRYjiz1J9VGoNkk +3rcp1LjZLpGKZcj9RYKad2wuqhekZh/slztHTTwrVlkqNM8hzBAPLVJATP7AiHwS +P6SumUIF9hsrVsqU+JATCepJki1fwbTUlGdPzlchZbcSWQLwOU/eHwLS1mPrpg5M +fWb0rFysYC8GxYDpm1wfNaVNZik6HTg6mWNHJ1a/fbBhyw3XRRybbcUDsZXUJZHX +uALtsMsKibg/ae2yfF5DTz8sUA63RmJ2selRub6JyNlu2y2t3MORadKDVzdoBsJZ +U8bp9bHpQIZVLxUhEjSlPP/RK0VLDtmbPtKAhgR5sTKPNO2J++NhV6QFpLjpWGZw +jZuWRA/2b16/Dmf8r+CTv1dD9UUdY2GskRTaXEIJaZNT1vEFEPUlyAUb0dFTHnwk +Ynk0ZhLyBV5jFdSG6E36vfKV2VxkfVRY5Zyx0Ee+Z/z614K9cJ6clP5Mc862QAlV +h506uO0OLAxHlNQBEetkHeUS9Hjsgt1XTLLRoPNvBy1ynXxtKwWEAajtQ8spIgxX +ZnsM6DhwccFQg6Ly8nHi04iPZEChh0iCaKaxyc8GYW6c11neKqqSzdgq4cLdaU0V +HTm3a5MIhN7lUrDuA0aq3ygop6NOJQkJ8oZo1Qx7PLiEXCGO1gQ3LOWxnT8IYSIV +RjOb6In9qmu/M8pJdhWn0zYwzw9U8D6+ZYVySwDTqg+iZUJHul2GbbmFn1nzGjyY +OKOiqYrcyc4x5aM0FTiAu5NnF9K/Yen1/nn1x8jfo87yhCgw3LqizU+b6F4fAcJQ +8Zp47xiWlPWeU72NH/ECRTiibfPvZkv4V3Vk8N0GVRuiGEy8xCrpR2idR3KoZXwK +lvPEgFNJbw8yiIRCyuxVPKPXKXm+Po02i+dXfb1sm2+VbWAbKXCQeB4wjRlcK1m/ +lzeFCvR6pZuyATvutMkJm2d39dcf9UBV2//arvG6e7muFciCX2kcBV8hvtJi+8uw +9obcPLRic02sQRD6Z5c7jiw1TwtH3YCMPlcpiDZpNNp6xv2fUL6pfQA2dZLzkN8W +evXR0p7SDbhn5MMO+alOrhljyqh5GtZuzDskaVyEQsIWmcE+wuPQGKVeHCHg1KMh +j4mmCXSUb5IJbrZ55pPiIBOZk/VGqEs560ZCDsvSzG8mm7vOPYtIX/KhTBtPtvZp +15O1Bjjz1X6SA6IF1IGeudvh3bY30W6uTaXMa8PHw3zjXIDvMsLgU0QvSAmF0ggw +An5A7NvAyD9DFPk59mn1qdBEuB1aO6bdzMkbITevaTDqeLXj8f9g0piG+1BCgtse +jwZFus2eLI9DyKyOQzKaQZ8PP7Fy1b3wU0VgE0hcEHilp7byaLtXv2suDlvhPEVr +1Jd8nIAB2ZTxCrMS1O1yJWb5MkPHjk4+sCY3/xxekl+KAoNNpxRXku3jhod3lfsl +jhGzDfFBS871BZVBpsTEGxJkde+qutsmm5KNzg/RbhZ1vKFbExlP/tIb71tK/S1t +zT/MAPuumpSasMc8BNHAwzS0mNxONd/ZmDq2XF6Rsjze/iTe5C/jgRC88h69OL9X +utDznH2EpXVXK8rIQP7Vy9jNIzz7zCd9IbLMWoyPQl/KWtThFjShHxzdGecuO23G +LVgUMjzlu9zlh0YhqapwUOgfhs0h47KtLTbn9pLoJZsuL2ZIt/JrIftH9z8n5Tz8 +LF/G/6xxtkVL7ZUaXcTt9ZFsfkjGaCqbAcfD7l9CN3w+J3ioK9ceek82YlW8/lwz +lEOlk++mzCNdPoonsXFV02NI7z4bBW89ka3lAkJYKMX1vchC3Tzx+wTyrHjMsAxa +iNmVjQOSvjwZitDx2mrm1O+EqzMhcIUuSGy5cBwi+SAJ2BI7f4VTjTU+oBjAnGqe +s3JTT7RtctapDIE9lptGq0NkD/ZtDYJHPY6fz8TlvcojsJFLM7UVVPie16V6z0he +KF2t/Nsp2csxdy5LV3wOHJul4k+oKdUJOiKALf3IV4ftXPwN7vOnsOck6jmhszTR +qI4jUbvPGVi0cgb0+sIoVpq5prPu4xEUqHyCmrYBrSFEOtxzeIw3qfnaHrnNw0in +wACovnwx3Vv/3MPhZVawJC9iJ/CDl3FHqwiGEKmbB0imECRjUJqwn3F+nK04tA3I +J+k3IBG5Ngf1FkoP1DCLsX3LGL57GfjdZmRo+KePgiVWEQxtYB90hFxF0oxxT5cT +hHC3l8ysM79tkpBZxuvgixTuiCEOfvBxDO+Ul6CNcLJzlbtsnLU2gbBDuOx0iBOl +Ys/CizF+v7ozJbiiKa+Ff0slslz4sVnVRq2tzGV4q6a6KhY+wZg3IkG4tcrnJ46Z +reJPxuEVD4ZND8WEoXcHYyayTqegDD045MEVTpmgxQASoucDngGCIlH8Op3I+N+P +wBsb22X3W6GIZrG1IvgmVQuYMLJ1jrAspWugn4rSL+g23UZmVj6fvx8hh5q/BEbm +k/ORo6vnPkS2rzWvPXWBMGkXOkkUC51apIMdpMUAB7czlX/PNqO/35z+B+7b+ty9 +pRRvIz82psmPB9zRDaJOIgQIJ/u3AklhR+b9tosB8ZwwNf7O6k4nsa7MSZ1eJDJq +Yl0/SjViyiwztNhZKvcfOGoDwTZRdgpElrgk5dzxtwL5tA6nVBlKXlgaxMpeioxJ +KCyQWWPRkdtYo/4piHXcXPpBv8+HuaG/fAX9rZK9vFgWYy5Iw6vvKDWYJ2fXSFp5 +ZW49NsdI1jQZutHGBg71zoWOs0/zSnS3Mg5CjbLpVmMSyeX7bX6X+HoQ6ofnROO1 +j0jaNmvnbfR5lvD9VvDnzreE5LfIc7VTq6SBmDb/OHosaX6v9j50c8KgdjB+e+hX +nx5EOrE4RETAQmE4F3WsLe85O9yehuZcYFldrbd+9qKUTbFxzmpSRDRwuZHMVSd5 +1CpjEwNqYtZ0b6qN1MifK/gv6/9q1N9OzkycLh8bdHvADTC2Qr3s0oMOc5PQui5E +DuN9sA9Ku724+E1HuiJK3JNZV1qwdZ9RgYBSq68+grLKewhqHbb1gx9WLwJTpf9j +6yT/EVC9bNFLGfoE3tKqDrY9YYUtN/V35BluHXQJX+LjJICMWYuxODcvITk/UQ7A +KrRc1yE9vG3+u3vIw2U4zzNI7g7aVq8ARfU/EfRSOpx5JaEx5Qd4I1Mk3raIXhv1 +THS2XOHM5kTuVu4zfhZy1EbTygXu62McfLeOC67aW9ex+PvhyXTrVNnUO3lSzftq +0UrNwSQUo53jVV3dsfm5LkF1vvNSB7cLoyz3JNX/NblVsp6WDlzm7KjanaSTr6Is +CmpFygOAkdM+VBjWtwyaD9S0NHqm0V/DyZUz4jHKPIV0YwEpi0n6MVyLkzUicRWK +V290VQZ3X03Zyz2JQdWPY4Npujb6OzUO1BVhcLHO6fyKfF9hIDsv6bVQ4+SyDUH7 +EihH4f1Bjv7o5UCpjUdVOhFtV4OXmP9hvpuTxQwe8dEIM1V2NlQGwta8B7qfAKfQ +2pCsdISvAGzJT9mgaQ5BBlm4o02IC4EdD69jAJCVxUX4f4inCiMXFiQVHaf9oYST +U+T+ztx3WzXE2eF+r/fZVw0j4EjC9bgabsa12ORE06OKQzHEHgaAxJB7QUNlsIy6 +oTc1/0AdTlKctjdStAwIHrIrq1VC0Uer6xX5fWP2NP08j6s5aZSUOnXM7oO+reCa +cedLaalwt+YhzntTGCaYxzV0wk2nzW+yvEXLA4IksbSzVpa8jTEefAtnZL6SEtjM +VTuc9D4HXGtn5H6V7H1dTFRp/PkQlieSD4rkS2WFy5prx2DAGWBMJ7wB56o7wXKI +w0aurQEuY0rNoSGmZzx0HRjjkbEK9u9n+UsHV+aXt94lZ3UF41lclnkYYihMZ1C+ +UTVSzhTyPaj5jdA9QYEtTvMA4nM1/TxaVngmrLt4/9GG8GNtECN7VOozfTQ4uqJj +/23kaUl3w3M9QxecudjABI6FmC7CR/osRcJqyszXkhHWVjCp73eeZk3L3rJQwtHV +UbIDznfiI/eRkkCSpJJ81isRXmPsHlL4jmAtBxDFHu5xzIW/BpUtmDCAIT1S8b/7 +yw4pRqffGOajHidqZlPldp6vyQOJR1UV3RgglgUpl9HXKQNuFdScSuUvOkY8tU/2 +e0C7n+PlkpY18+kdlxb4CB+l92MDvutXHuKcOex6G8+n9MUnj/3sKWNM4leRn5QJ +czhAPU3h9MBGAJxlsFNAztucx5YceacHoFI63yH0ND9BbK3vzVH4pvxZgv4H49x5 +QxepHCjKbQUoMFp/n+pzb/AJhH5PRsgvuV2NSYho42PNIb3wxwtVAoLphhY1ufbU +HwrgQpKU0wJdhS8yxnrulNtBhnI5zQDMzFIeKxbu5kj2Y0IlsKoJA5ECFgIKYuxy +YVyFsuTNxkr7f0cDBtNAClcc+wUyA9EeNzyk8i6ctN5A9PmJSOhP7xqCJ6MmdcMU +hnC9fs1Bu0MSJgjS3LaN+m4Oz3x3MkRExOHMqSjo8Af3+sF0Cj0z5+vEW2TjlU0z +haefrxCT0RVMQc41izyXwqtoWu5eJbEar7gqJaFY9hPlvmhIAz8Vp2nAD2aYNjY7 +tN8VRr91AY8HyBZvmmE1AtjeuGy4dud9cL8eKIvgMhT2iPQL3Ki2tyQmgfd3ue36 +vyyq0D5gj9aBgD7rWyctxRjbrU4AjovjiY/xzsGQfqtt0ow4IPzF7n+HQ3ROb8uE +SkvNRdRcaWUqVa3HoJNgGLdPJiRjV9Q5/pwEm0r33bP7f9hbNotYjIUPopGGsQ/w +nuAFpqZBDgSed6XWb3bH8O/tOiX95DUW61ZfgTSb4YgAQlgrHz5fcCfckVrdUgHZ +4Kj5n4pu1FFS0Wh8oli9R9DUOxwVULxCLZkneq9dgevuHBhAJL6TX9u4krocxkW5 ++6rjVtGFp5vOaGxmuhdSkqGGJ8pJqssQCgouLTxyiId2KFU7usk4NaaqXMKjkkbD +LGQKp/e2vYWUowPWgsxYFVpXdtV3evkWri3mehRmiRWjiKmWyjCqfD2l83mT1LA7 +ECIbIdRGKoWsS/x83HTetzwbSSmQUIIkvAuSDhSUFuXoSYjes7XYE9nsdeLfW8Je ++kGLtM9wA6vJz6KIg8ku2j6FSdVOH3S9TrUHVuj6DJ1ZJAZIOcqtd1r2V/S5txuc +cl5Ij9R4Y5H8b+n9vWCtBQJ65Xt7lx8ItnAHp58+a9Gv+mXQ2wA2a2eT2hc7t74O +o5Oc3o2tIYjzt7jQcvNOljI8c1Uex0ifG0kdvp2L0qU99zWn0WpVIqvwrsDwVvHa +JFgUQdskn6OYfws3WdACURdc7mHjsdVsoB9X9RqaHCRUwcHQfm5mXtq3SBLBoVCC +AcokgkLdRC2Taiousdmd1buqBm2XMuck6dXzt4vo4PwfPzUoJfWBK7GUpx+WFYL9 +wK7OLdl86xevhftRm245I2XSNVWvjuZ71Vbnzp6cV8CubB3l0PZfiyK8xMNTBQ8y +6k4gJl1xWDJv9Yf+CQvGvDcFCc/zJUybYBC9kl/rMMSsTv51McBu3u82R2lkNIgr +ql1I6watQQsHELNwUmHDzrJJpNWzR7TGpBHst7kUgdiuNWM2uKVoDAD2mPFKms8D +5/cHRz2qBKh4iDuZNJrC6rRPfBYH3ptcgW4yzjmpqG2uoVJ9huAiihnMrSuYKcII +qgd9lwuGP/9sIFAhzbMKr3IrGTN+vJkkraiuNnv/BkmZHo+60k79wkQnfqtQj0iJ +dMC0AyXSaeDkwGrs9/MHszgjK4HcauJkiAKMg83Z6wD1wb1PaIecP8uqkK6TBstZ +EjstNsyW3DbwlJUmqc/vNmd8wLrY/taNtWiM0/fR2BKrwWvgLF+4ARZgV4xBpyDl +dRbnCL0XArAsLbnPZbKg1pR+1JEl7vA97gRG3+OueOEsVlCNbp3elV3Pg+DMmlj7 +KLKT0blIn6qS4z/D9324Kr9785KOQSZNGrJojMYQGLHxGLGeNLhkJ0lMl9+ZEYhD +PTMLteYpq4ZE0TY78HYeiBYVqDusnG0udGSYODuXCbkdK/WGrzjuW2m0208Qp8yG +C8TKpTTO46SM8QRKVuycX4XZ508GMzEPkKR7d5qbScTFa0Fjf2cYDPnsOm6diyzV +yHE8OIbfJGdktLcx8vmq3uwPZWpg8HwMxAgtzPUOV1XRHnWLnhF7fuoNf46iY5TP +BNU5NLqn9uF7jw/O/2MSpdmLcB3f7KRruRGsj4AcsaAMve3IaV2BGT6uXyY+RnQC +167lvpfeFYywil8fZREXFbL52fS37hvI6Oau9wDQN8kAKqF/NV2QhrkWKcfGQKR+ +eyLIUmEytDF9PnZLA04JYwSByar36JiSAZfN2pKd2MPLIhs4JcXyzIc0v9Bw8SFH +msOvtuiT2hIpK0F9Tikn+A6XMBK7M9zOotXF6+eMqUJ4VPuytlrglpkv21MLet2O +Dd+RpNIsNlLYbdwc0Ky5t2Vwkeljw4rh0fwAN8+47yxVxKhgQuoKlli8VUYNru+F +EMQUa5v94g6muhEG35+9iyuHocI2tbXaEDPSZ52Y+TMI/QpMBaZiQy/c/GT1xlgl +ToqbQmaiaoZ/CThsNMi+z9kKv2VOBwnDS3pAfDQL+tDRG2vIP+rb5xiIEdkB0aTD +CQSZEkDG40Zk6VnRKV+KWc3ry/Rt4CejPjhJfJP5MSTtZ+OBCfY9DBb/0FHXnfNX +vcWJ8DBQXlTwAUtzAUr1XJYlG2ziIqugS/zpoU98TiM3YUTAVT/Y5kGSNsBV0t6m +RBQA3gs/yslwSkHxARy2fJNOT5TaGJhBnWG9semSwt16LGoNaBFTg5hQALoe8nrD +tKQodjoYVU8S+PkcAQ2VgPo1Yp/iHNcaOtDDqzpvOLNWUz+FbiB+YfyflrKXij41 +rFhuSgR4LpLWlyZHhm1MstKdbuVggurkmo8NN/jwatX7oOUhpH4KjGzrv/1CZA4M +ajzqiL8anc2qZPGQ60Fx5uF3jDWoFEJZyIUohXX/ITWwRCTkJBSRDetrddyZ3atR +fG6jbeHPOgtWJxEM1laS2YiCiskW5/t9JtM+8Dd2OIQG9bbNA9iB6t9Vax/iEImK +kcQDkRbi26+ICLNZSk5p37JYjh7BhrSxZMx5Qw90gMvnsnxUTCDHRwLF+ApkQIjG +LLS7UEG6/vVI6dglvXUHAsvhjU2AP+T6Wm4nfmXepS8KlEVCCZO7IaYS1FtBhbfS +M94eI+RU5FdYJ72f5SyReH6Qpg35qk4IfTzEL+kUgBdj1jc8KpFgYCR8vCikvlAi +uUWbbJ7ri6xjUVsdCEeLw06KdHoeX3obFZ6rUegho7oTYymJWz/vyHewvADOXqnY +TPvO8/MevLjbmLWPbgZPbQkTJY9q5aitc3ztppLgakI4PiYmnJ+5oDLk+bxrZbu7 +XFJNBNZz1k3p/BXSRymZxysKim70mOSyYgOA+Ur+8VY8HutuTOzmv/1oppu7ZjiZ +Y/RuiRJ6juziXZYL1sbeGrCjxAQG+jlTx4wIaE9swB6g6FTchEWsM39GHjc9e8sR +APZPLyNTM4nM2jwLvdiO01sjWzNLI29CpjJh7IhqN9AQo9bFhc/ur44bqjDBU3IB +ZglX+tSnHRrBBbUwP6PM7F/+qjU20hAbAb0VxhZx4HMpUcMeMvB3l6SqPGPRhAvw +l2fdg3ykE1Q7Ml8bYWJh5xSFooGGqq5nXlzEQr4RezWRex0l+ZRaQ3FtY2qifoOt +6DO9kNAwmKSc+LiV3/DKMjgp7oB2zyyOEIIwoNv7MudSMTOnukeYgWfNqXS6nNf8 +sV3vrBqIdLVSui085MFrqMc1HqFIeffJb0SKikun5H78BAt3JLa4qlZF/Pdp7LVu +c9BhDvVv7IixZQGcUyrxnfYUY09/ATCM9jG/r2SWZX8cs0uMYmCDdahc2XzGz18s +M2OVSFI3CHmwMyB6ihp6eKJQmd1hL9IjDC2RTvgE1qAMCip02rf7W5JwGM3uDn8U +bSV6tkS9S0g34I8b1crgFwaF4pc7YFbDn0UtjAoX5kXoUzqSIA7EB7utLRJ3lOqm +kiymg4qCysQVUHr+dFmHAXpoMjW1VrrDTiZTF1d4nJCTZXK7N7tro1P9JxAS8Po8 +F+EOq329B4+Hoyu7UQZLTjPSh4+HBVANJmnFuro5nsNADO9aL4FRuGFFaZwdD0Q5 +Kufqoj+KHRox+1NhjurNuUo5u/ZdIxz9iDBKEfLig1vERPLQoyJbw4ysAvgy8fiw +IN9SKxxg8lU4v1KrGueHb/+w/3vNdrh5WDs10XbhRceR4zxiGJ1iB7yhxF9VAfvb +EvxFkIo4LU+EvhXB+l7rEwdbXXixh6Kh6429Jv9c3TZAssX4Mikt/azF2krOSe81 +qU5RyBtfqYe5svUTzo3iyx2DGz8FfXMOQzco1bvsKmRLxqvrH/UZuHtsKqyMUpjH +1jlEiDsfkayrljZXTGQfyHUoB7FXOrMtT8DAn6jGuUP7gbkf1UEl+HMYd4qbqlRh +rLYdA3DMjh8OwPztz3EL5AaITU3tJ0XzWsDdTtWUGdSKQKBiLVRBKz/9Qg7f1s+K +lvDvfYqyMZKVQ9MTt3UIs1ZhSQYd8IvSney3OU5hP3F7uWVn9Q1oQCKwviLVInsR +/iOISnKOSJy+HbO0041amGcr2gyrmoyIGtE+TNYWKUuGL+69oMHpvk+NojOFxiAJ +IUuESCnW24cKxKc+g1LOZ8xrPbxMRxHdqB5NIIexIN7DHyQwv9LIc1u9ovP4PIt7 +6sn+CuA6g77uxYIX4SQsl9+jN/Iipq6/wTpUznDV4Db6wM8JNQwEYU6R8vIQ5l9J +mRbMr63JYraYPgUDG7MKnqINYowg+vXIalljvKeA26JDM8T6UeS6Z6guzSN5D+Lf +cI+T8kZj5wsHzunhre+3SyhgzPD3MT9ovONEK6m4k35LaLE1RXXiD3U5K6KxOZeT +pC8pxF+UlZEwtQ+NY7klZnjklI+oG6SD1GlbGCEMWPAge5xg9XE6f2/c22nfkyoW +otUi9wvPomcgHITbeAU58DHijpXq+pSnLc4dEqCqmtRfoBZ1l2BwIRvBXysBXWJW +1UEnMwJzRuXe3qhZDQfsV1L/D4AAiVp1kyKpxk35fiLtAXRHLLe4HEhrmjfsh80F +Hof4K9bTFbG6Ph2/F1kdWmSy7DLyBazRzfbyIben8RjSltc+0cm/XFa0cYs/HyGw +AsHaW3ip9DS4h4ftl14VgQXGsoyw8ZdvtIQr/dzyn57bp3NOsPLHaUQpgxNi22Dd +5ZMzJtzkDKz5Nu9CuUV4eR2txrZ+d0kkA847ntuR9qwcUMt5KCfeM4jCgBn7TukA +tugi1kAcgGnmrsnHJkVBNBLfQjuYNpUlEkw85pBDkfakEd8PU5jlBl9qf/TMsJTU +zsf/oUfYLxP7b+GmNVV/sEv36GRoPQkDWxNUXc5pczVodm17lmMTsXrxwwW/I/gu +pyYdUBJ/AYeVYACN6AU6fiXzoMrE+xyTqzokobP7+ZwHISfPaD/TbpYB9TAnmxwL +3LcnSz9tbidWa2xmIEJmS1kIJIbW0v4YJQrlKkVf38vaV9XQ5USYPHWmRMMTay7G +z08VRUbZUiOlrBEni4T5KiOKelNNc/yIDcqNMoYuOKETjrme2j7mPVt+ZgE83LiE +LOWrLLpV6QvwJ0DqpVq3KYNMkdTIiX7xXoorQ/bDzYm3vXEHjY585tOoe9zSrVik +ZamEmMnLocfpHN/BSY1KKNtTvuoSxn2Tz0TtVYEKHbm004MmosgzljzqJqnX3lm5 +GFcKdbl1YIGzWrHqYfxlS07ExzNrIBqRmmFc8EpawNlIyLGEeNDfFwE6BzbK2Rmv +c2NlTfcU0nAY/2iZRM/M++Tchw43qB0mwLm5nIzSR4OSeTktW0d1hwuPW/+qXh+x +zfiLtCWnDl0nRSU4roE1rKeqLi2Iu1S2L7XA5Y7J4Nnure26liHy13sDLjfRUT36 +33PKkB2kODUFvX3hSrEDH3OGscQT6IIaWxw1QDh+FZPDWogx+avyRYYuLTrs7S7t +NM60XHcVq+T9kjGsq/vhV+n19238UdtiqCV/hUjPI0W/Qnu8alYGuttQNaAcTia7 +aA7rCFG3BKM/Xea7rh7P+rjj5tHKa+b39Jyyb90rD7HMdqVSTrCP3DKSXaRc1VsF +IY03EPX9heTH9zgpsnWR/2z6owgKo4pFpoi6vJzCpKD0z3gRBMh9nns18qjh4no9 +viKphMsBJ2epfccdXNru5vRXePFyHuuc2PjYw5JAYiCdKCd7rfqsKlwsn7UMKWqS +vIOl88/T50LfLvgt+knZdQPoVPY4fbI+OhdM3hRYIiP6CeDuWjLBGossNtDx5pwV +8bQh5T8Gxjdg0Jn3ZHrCADa4IljjsKZirWgByfa4I56c9gOcmGife2CvUhRx8FgY +n78cnrVnXv6SHiRxDm7YMfA9X210BjUrZ9Pjw3tJhsAqWrnsOYCVjEomL7n/I+0M +lQSnMmhZoBomAgwtSDNMy9EigV4y9BgAWaywzSceCehC+M4tAYNCcxrQ07Wr0Zad +OJfJ6REw6JUCr70MK7lGcE+qc1Kc4t2MKvh4XyUYcwzUwdassCQd5HSkmqoyk2Dc +KWtJE4PHWYeFR8YZRPpY9IsHcioSrKHmVNJ0nfrQqWZ4JbjToWyNawGI5btltkeN +K3nyEI+p3D/0r0U7VIDy+eGEuDEMMgkZkS5tArgazUMJKYDumlTo8hd5VcJKgpaU +/kdr3YfOKYIH45v9KaiIkZEQyg++c+W2+Xfs55Iuc4cVLaxOmrSmxN2azEg116/W +BXdaVGHMfVe3yBxFmUorBoI4UNKpQrEIfj8yjX4hfZ9pdXEs6LKwrSEAA3NvC4Mh +OwEw0jxWQCEqPl1HVIsObwAV1iXGTlQB8NsQaii/5fQdSY/dHuGOIY6hZXW5gmK2 +igvZFveUy810+PTd06LbcpHT9uf5/vx3NB+FwheMrXc/zlhEeU5rc0AZf4xXVpUn +FQQ7+7j42DvqnHHFSfwplNWJHwzU80UVmpBCcbIlEPc8aJUFHwEbnWMQt95hXqO1 +9Rs+wRpH71SgpZKv8UTS9nvgEEaWxmFoXaZNOs1mfZv/kSbGPSVv0MmeEZ75Otwm +lgeBzWmyCV8Xsrbw2UIzBRmcpj6QfUZSnxeP2wtm72JBesCO4Kwr0/wKJLQnnhYU +yyu7ZsuSOvC6zdol5hwQZfB8yTqq68/M7P7nlrSwgGk+FBqq5LILt3lAvViV47cw +CDLfITKwSGl0I62QvZQVV7QsXWH618B4qpLg5zpfNy3cpfKVV4jBt0CXhWL2R4Yy +/ZXRfa/nd4W7lyv5ZTe/vRAw14lpwAj3xOckFostNzgfd4LTdsmnmbVT7yI/IB48 +SoNwBkG2dL/htVUveV7Xc3PMLjs7hp8CNLJYfmq2KI/YcCXMTy+v0ZHtqQ37S8Y5 +iA9i64oxO5pU9mFuF32mFEkjerJSU3hFtZDbHHkZws0CQAMCM7nqM658xt+DYT7F +Q0nC43VWI1Sx94jsssUc4VBWso74l1uUFwozAQ1u3MkVgtP17hbYNQqerZZQ/NUY +M6SONH1/w3DK5xxYz4LOAccTI1fbR7yUehv/+PIyIVpcpF2kOWV20BHZ3JgUmVX5 +9FmD7+gytsAY+dfl1J69vXn0fGs0tuO7VIO9+Hm6VA4zGLiITrYp8cx0jyultn4f +RmbbQJ+AIFTVMhs2pDgfhPY6lnXUbtwljX2chDBQjOChCZcxHwsohBDCbS0dsohK +wZjxJcuGSAeXZnFup6CiVh/+faAeFWn8PVjwh0ATaqjM5J/tRmfTjAxXhIZC7B8G +6qIPD9l0gTtHX3T7NZ6orQE6eqpAX5dWpN/jv6WPZm93VxzE9h2kDvoaXWnGdDhJ +5Z3rLQtF/41IH2oejauYRWExWC8Bi3QvOYuY69yV9vqki5vUlzloHhDCpRUSKNRo +A48vpzitr0tXqMLrO5QlAHgVAwk9sXL1MJu84cME1JUtVEIVDWHhkIb07AHIBdg3 +B4l2IBadSSKJgOw8FoDFNXj2rGzAq9Ad9n4Z/+IJ4H/vAbSpV7iRG4jYMOIakqr2 +dM65xxx7BVQ8mT+9eF+1QPE9zQcKlNpWPmCiBJ2HDIbldkgrhfuqetY7LEq5CW2T +8iX50RorkAlYrWoBq++/UQolBkIx4uatxTRiJbx7L74iv1UrTv6KUJ4/TeUVbXss +fko4q4Z9+4lCELXzeEIk0LIUmNYKUBSDKFXLABzaPlpLB0PwLz2wRE6/GWgZE+Rt +M0TnXd+AO1TQSTamRUP8FvWlxlb4wp/ho3WoZlyKaEkYt7k17rjR1la3vLuRyxts +pOdHpmQtuz1eJfyZ5YOH2IPKY8SNz35oB4dMAORpi5ZFWSO3IwKYk5Z1c2s2Lu3e +x3f6hz+hB8Rxmtcg0QqrE63YlVz9iGY+wtEypJ8PXoNwvIbCWbk9Xu6BwnH+O+In +j0pPQRuIlOnjvOTFBOhzcCL+qlMvoFb/svMrnAuBDie7WnIKf2kcBYakzyVfabnD +3X8MHfwbG0T/+pyemA/g2qiw7+1E8kNHgIWsq9un8tr/oXFBItxyo0SpUdIYO5N9 +V7B0QrG5fQQbwm83NOe4Bsgdr3lbDhIHG9vF08bnaBzlBg5FVMZTdvccQlKfhuaQ +KyiWPRYkVYBfqVC4kjBW3VqnqxyYulxVfnv7Xw2XQbYowTCaPW/ECcNYKg2hCteq +pfx6cvryken+bWXFjCIU/Fpfr1SSujFTTFxYPhHPfs8srkAK/uQmLAKUxkQa1Lpx +u0DWV3ewtlRAT2pqSSW4PNebnaVHDXG9oRAW2cMkG6AMdaXoudxkaz4gIrTTLBtL +df4zSW/7mJrqagrFWLKr811KH//EFqUR4F6qqPpQOzrKyjpCknQLfQUe3D0DMo+G +Gi7OIaLgzsqrAilPSIYuZfLRaky6CYGW1xdiN2yz/kNyizS4fHcdy/4YRKmulPiy +YykEVDYsCxxIgOsuCjrM0frP92LqIQc6K4sB/XiOhhTMNgX5fhUlUToC5P8vF3is +6gLioUpSBOULZAR+FgPGHz+hvla/fA/bJL+/1Ajc2AFHaJzur/7hrmtRpc3BLoxz +6MrXqcRYrfXjO/p/Mbt4jeIbI4UvMwsPEP8jJoJiolVwdMpIfrCFK56dW0og2yqR +j6KkFyr5GZI/0siIPxNm606ZYXMWO/7Q13nYWKgHFDV8mBPGgHncMosaHXYbaT+U +KjqaAJO4FyBVUaqBRPA+50Cf0ghiHi+lHfODNdzDTMTvAEA8kqoHTRf8v3Wz/EL7 +Vt1du1FdhxTbN/SWBsC2cg8Ez7c1mQSdoQZSSMrAIGrgHhNKbeVfedvqHorh9VvE +AduuOt0TREr8YypdJyiEppKyKfpZnl6CPrh82bZP0XMLRMqsznDU5x6XEkFGvbRX +FV4uq3jVHutGizzc7vnvnINQheiQxNWaa2svtOY7lRzVSGLZ16171EfjM1p0HBKW +z1H91X9yoDsTY9MvZuURx4U8w0NDamJxFHwN0iHRkOcYOHP4e2O1nqkR6m815oOR +TKDzi8nQiVuHMUe2AQrtMBJAkxgqJdVfrOjR1DovYJKTPK0I2jj8ZcHR62+Zbg5I +w5QRcWFWMjQfBpyX1VrAjwobrSDrg/NsDT406C3PuGi7t4V1ECKG5ZOjqTdSOxg5 +TRESHup91mF+uAEn50IlCRwT8aGpXqf5doRdQgwRS60SwGdbupVMnJ+vKD7g27pL +UGM2ZnJQjFBTSM6YQCF9rkRUgk/a8cahGdyTfwtej+Yu53DP/7udT62+PKEi5Dlv +7fF5Cym7gbZTEv8V/VYtegUr9RWosN4ZslhUms9mXozP6WWxJRMvUqtFGrwrkEIN +eTI6gsFQyuAtbRUrp65q6jUnIrvGAM06yobgkfCdji860+B4QwXG0R7WBSEpogSu +jjWGZpm4uebMyleoQ4v43sKtl8unPExuhMkXt8Jg22Q5bI66fGGWKEm/GE13gxMN +8oy1l8HDQTdsyzdLPYAHL5x3QP+LuxMyFde/lQhSFSUHwkzcllpcQQmVOEAkLxen +COWoKlaZgoiwrTbvPSsqvzO7Mx/I62W+augb9XuIdIsQaAaW1tzQYM8kZGbMQ0Oj +j/Vsx3aj4ykcFEFK7xbSvihU8AfxgcMEQtEawPRL//qQl5owouf8RmBwzJxAEPBH +BUc/8iUEZFvIc3aKHO1AJu0v1nsxE8Ckkkg9rQGqIu5td1uo2sQz6QIAT8HBC4Y0 +Ojx4tTV4fw8ZpZJQOliUxyG1etNSeoZ2PMaNycL/hO14dgV1icPZjfX+8JBuLb12 +jtI7djxzBk4OjsaRwFDv3O9aBkSs4DLykJ6IuZWAfUVjaY5UOZw+qxiLioh2zKZ5 +/ZuJ8k5tn3D0HqfSOB8s7AAMubPA6+Gi8Uc2kG/1WtigL2bjiM0Xu9QDwl4f7xNF +mSC8hmsYRxdUK4iP4vvNki0+Dnshhly6DAzmXgoo6IpDMwqToXN6O+Wne/MueFIl +LsuQLp/vVmxo6sfwjfJG/kRa8y1WF28FsAPd8FavUE4HdgTMsH0k6wdnS3OwAoX6 +HbDj7hbGFcTm6c3anhcC5tr6vibKbaH5lkG+6N3YOb7lg5Fe6ON8KXpqHKDvJehW +vW7WvOP4AAnGOY2srjEHNa9LaCenEVaEQEju4742BKERsG596A0EmaQ58Hrj0IcT +ZshdcB+1Tk1l7AAvS+WVtDVGqB7e3gjtv43/smvj5OWW6k+zJ/6jrWjPycprLRZX +v1556lYQfm01YyQgvFtknPPIIocPsq8ZOQt5Ilf+5U5opTp8mYATtn+/3IMasZ6Z +G9JevcD9FZJJKltTTZhMwUXKnq05Wjp4Ohhc3HjSfyCh1aYmKZhdZAU1muxIUrIb +2ylM3uvwlwhAaFQ4Dk/+5CXAdyHJpcsiUvkG/aCxUvlhRYm8VUdma5Ro8/oKdars +UXoZ+Bb+9K+JcHfflh5xukbq44pc2sCJiyH3LVol51sm+bwwTe2U6P2RJYql5umo +15rnby0zuF50ZGA5yFp6+ARGuBlHj7XKO7X/A6qmcahp+/Uyp/VugQHanHrqaNJV +txipBQ+skMf1E4Mxjo25k6K4tTGRM3IgA81JowSG5amv4rCR98uGTDrpxy1fYFjj +aY1jLd6mh/5w+QSmK8FsWFmt+oYq3KNg5IyTDBKQJGH2gOtxREv9qAPbw80uN3SR +F67ZFFAKleJ9jMNvsUBT9oRIbeNMOpHJFkVdLDOCj3m4PIp1Cl2LerTVRbp/h/93 +vXsOaUF9ZIV+EWidzSk9JKSXiv8wzEOaYHqzJrEFU3ZyfLSnBGnYNweo97PhFcrU +q70IZmJ3Q/mFPjcVbHE1EU5G2gRQnoHBpY2AvXNCLWPfCHwbLgsd1xfz2onBjZ/j +BDux20eX0WzJWdbF0/MfZwFxQvtzLA9Li1RM9jyBE/akHyh3xa/S1+WV6kkDB4LR +MMfqOnC17qdHhx9obqZmWj+ppYhe931YdvqX+kJxji2vPonP/z/2P23x29TNXDMV +l5aywNIKsZn5ioK8p8SLDDC7s6PyxMfhx+PeoRZs7Y1pzB/bnv18YaVHZR5WOfgZ +13+lrU7eHRqxgQMv3JwkxKmotyk64IhZfTXHWAcXA4C2cXk5DhbUJkA7pQ6+RTCu +vq8o3Bdewzm8W+fQkrt+Xko/Y3lV6b9gq+Jjmi3biXuQQfAptI25rpHQmyUvbbEh +su1C6iC3ekMg8DKbTmR5FOLvJIEAYUX/BVl8HnZPE7GWyh6UQh0YXLGcvCklm1Ku +oAXn1NWu0CcUVQfG008cNhkr0HWDLMWQsyOOQZqthSANwSuHP/btzYuF5ONpfe/C +ScxTw+L5dU+NoNMQE+ClaWgdaA8AEgc22UHWzdQbO88Qlaq5c/33kWvaIuiDe+Dg +BFjBLmzzJhZEtv5JjQM0C2jOAfKij8tC/Tp5h72dXaVA4cbhh5fpcl7LZz09uToY +lyzALerv5nlpg+MA7Fe7Rx1dcJ+6LR54nKi760eiFgchpSjAg3GnyAvblF98SBwd +urmPTiHJnCmMkQOwsBbbXsoLLdq9qhhs50wxgGutHg9ptJc+uzS1pCKsEVoXGb1H +34h0Hvvj871l1vOUfHYPg5x3j+IEA+EJsKoQc9vQtL8IDcZ3VIBP89T6Z2WtOfjV +yc6T94Gv3q6Cguy+qW7Jl5iOb/jOCWzZ+RTKq19v29+oa5qNNFESC1EThDp/23P0 +dYFsCbPlmaTINhUM7lHEf131SZWDB/YMNYuL+YltCubbbu+VkAEgYBWt0m/1ZV+s +ywgbAfBIdWgqdNn88E5G+qfCFhZdtfWUkD1IXf3cWNEpxjHp2EKR3/qrJWh/vV08 +thI+p8LvfsyIhuGuTrD61YshxvIeabnEQwBYIWW6CYI8Rx0cXHVhpJjfreqcFqxF +BGqeT5X6PPvuUgjBn/qN2UE9gr2Cx0Bgwb/Z5Yuc0bG+2IGjxw7vJd9eLG49lGHW +KY/TFZCWK6sBghoxdGoMh6BMFU4qV0KSYY/hm76EeRRWRyRUN1D6KxDzQqSxuOdU +nU1RDFfRUQB5GfiL0NoY0s46A4hU5a49edznrV97HpUMLSjrSbStuqjWQ77U3Tpq +/sReXDeOKnmDtPwnG//ZolCXvqNf+RlSUnj1tJiQssFfa/VT75Mf2UWDIF8IflF/ +5AXzl97qCaVUYao7pV1q81l/lvvp9uKq1j9I9H7hdnMe9QQCU522n2DTYIz+iqex +HOjeKkMFxjyl4h8yooQJkp5v+4xaOoQFpb7p6lKJ3Whd0t1+S0ZKLhhiJlEIzWu/ +uh00ZvhOeYAPGw5mSnGYKOpaZOkpqLoeGkSCocAEQZHY+x8gCl72FJQV55HFPa++ +uKgAtCmQjk7PMnW4E7ykfxmrNoYDCPwz4/RsLUUZk0wkhndCanTCEm77HpNXXUEO +WM0uUFFDIHVzZXIgKFRlc3QgS2V5KSA8cHFjLXRlc3Qta2V5QGV4YW1wbGUuY29t +PsL/AABDCwYTIQwAAAAsBYJndIWAAhkBIqEG1U4DBwIRafe4i+srduOq0OEUvhqP +mC1026nKUdA1N/QAAAAAsoAQ33yPFb2jg/vVZfhE3F4bUjd+ycOrhWbXHVaw3WEK +V1xxaUfYasf9F92eaQQN/UwAm8XKZCgfy6TpyCdBfhbU2zNgKXJEVkLbswBDUi8G +R6GEK1QSqk/RdUFzO0+zTj2VIGQMqqkT7jEaOUv+cZym3JXUNUsUgtGqCMLEHaAp +Fj8LoZ4sgN6dKsuzAhDny6onrk3n3JWktk/BYt8TekRT3YF3P4AfXpLxskDXhl8Z +DwA3y+LBNWaN/ADwdufinYqVHNkH8umLa2nwQnNkMTOVooTC5IPXjYQ/KmGm3nNM +BCcOjObwgWGWh0mBFhfXJxYpbYGJb+DTeC0zTq/9f8LXUHGgkSWmgCHKtUlAb65j +jUf0cB/gq3BFhuAt1RPDyfBNmnou8rlBK3qrrHFV5hpzmM5n/onCPVRqRmkoyjdR +cMaiAt41CpemjG46XMzc8FnrEpWZ0k60a+u11OgGjVparwpsgQv1TAaueroomKco +gGYWG8ETskJ5YNgc/SbP4TZXfKE/VaPGtug9mZ5ixVXIvgKolx0fAX6ipXGWFZUr +n5vdtr7EucMiJv/SooUcgnYQlfkYcvSPsakntYPImdBu9LIs8Tiw5aKvCcmnR4nZ +uZQtH8UTx37+z/ilXf3dcBbQKus+Xj0ABt+D1x+WSC5emQ5srMl8uTbRTQ393l6C +Emxn54duBUjCXVeDLKTltI+kIbU79FPB5mvVFQMIgx/1upnM6mEtJAIrS+QZbqtW +JPR7lrJ6j9nk4yzXwakoWZodd1XOCMPfTty+89ZV4/QuehfYqY/JvrA8HbqnJuUw +9tGsaOlikQX7rqsIGSR2ASbPgvDcAP1Z/GNwdKhWfvXYAMp+CW4NXDOrCgnJc67V +kzWjZK1nel69uLM1goO3i63XtMabieTuosj8Mhtcnm1+q8v8uTdQs+nws1ra8gTa +nkQzSIFWFtgF5cJXDcWF5B6kHSj9WbLzA3ESYXO01NSKRVAlg7TjZgAcUAzYsQDb +LWG++Vs9FNB2IUQDL8fiVJuyvVAanHrVbkQYVsvzrqVGp6uyni9PzKVy4eHsFX+J +Szh3F9WEvhbjYYfV0utlG/DZ3eeWlcjYz/pJ7g6dc2RFXwsobgRhHAzx7XylxxYn +hL18sCc4zdI2xKciXKZ6XWBnIllBHERvKxA1rthY9H0WcP/7ha+U46AM464BKErK +0fLOEpydO7+0haNv1FjJltMbAK6ANBjjO0O4On+BkfHzr5NAY3n9SvI3qTg1I1Dc +ecgg/epzy51MOY4l3fK0uo79zzx5wCwo1W5TGZBsqFfBQym9bkZH0ajXQ8LfFAaP +DOGLF4lj6BlHymjKQ9qNgleyhiQy9SsO0cqJi1P1k+DKENSdgVQEc4ld8aJQFRk+ +C6qUxQHJvF1sXam+cLukb50aMz1JQkcI6ycCKxu81f07/KBZPmhR7O1kMx0ImmLy +N9V+DigJcHwEHevnQ+4s+ZO6MiYDganjX2PdAPl3T9W/NYy4jGr3/BTUJI1cNEcB +PGYceg+QaYsI6MxFsZkXa0BNdMqMEkMfoRUfB2JxFhY9gxqpbx6+Y+tD4yzwiLSW +UDFfHAkjrA9o1b7rClKmYbl3rUXMxrRQ2RaYQeqXMZHX2Kt/UIlI+iJxkL1/k0bD +uXp6ny0kkqjRrxYtVEabz95Vtn3vrKxnV/KsMyO8aEYnOS5qplbbI65n2C3RMIlk +/j6AVkHPtN7QzkGasKXVjkh7ytIJXqKx+xglucz6dlyCwWCFB2Hd7yrK4/AOL1LZ +BoVfgumbJmAXuTArS2woi0cw8usCmT3pbOAzpAgrtGA3h9J+bqUR23XbHbC0Vp4Y +/zMUo7RgtNTzTjfYxjjo/3HQfkXuopZyQH20Cj1Atyg9qwJ/lVDTC0AHpqkMN1Rx +F4bklzuF6E/oCAXLgsvDwvlU5tf3n1Nf4rUUs1TDa+cwDV1QEd3bDOCUpC9sxf/H +oTksCZZ3dFE4gcDUBISTWps+8kOzqLjSKxB4sjTXtelZpIpXL+H7Vs7SphYbF+l+ +XuPmMtcGI0GJa9v48IdbrKQDJ93WMGnMEzRIryG6cgATOjFm/WXSb3g/8bAat0Cm +Yt0SJh+Hh00nCvex/cEO7ECGy4SQnIDDcvIa7M0V11WeaElTaa1akwmk65HxN55p +MtcjMdPq5AbUElvQfqQ0FY2Ac01LzuVHdHuekC7ahyjbk1V9FKQr4fTujIdDJWYK +WFflULd8pNhPzfoM/Q2wSUCKcRYeU89H75nJdbCyQwIWgHYiR539fPSlxm+lc9kR +1vcbp7MfaTBgyfqbbMd8i0areuS+ZV07PDQ6hAIEfFeAHGr+eCvEnyarmOJGHqzh +DOdv82aGH2AOdN6uWhvyYR/YgPQ7VlUxLjDGX3229wZe+BlSRyvXSZFE9PacK4Yo +wFh7/OTBt66e3lnhQLQyzeVAMXY0nomQZnzpD4LMNykBhYrttehbNFQcNr39xYUG +nWu/pm9hGAehiM6qL37EchHbXrFLUmaXF1dLoOiBUm3B4SeohPg9xhwtXBgPff8x +nXNjuyxfIeeGPlDKasXsGm6PNFOxsSQ4mAUlQAHb7WViLJPGJ5iK9hPfWfIBH50n +tSILmAgFR8E6Iw/UqicpCj++clUTqlLDA/c4SLIK4VkfJIdDqSaOFu7NAn3A/Us0 +2v5OzblTGKAZhxperSpwRepZ6FmNX4qXYNMitpiZNC4f10oZ3jpRFkrzB2Hzv8DO +ztSt3iNGJsbUY7I9E/V5qSNCSQYKsVPJ/Z7AT6Vhl/MDzil8kwH4G5y7p7PFSXN6 +vAWv1VUP9TZLg5x91cvGBNvtq5ItzzlEGWjTg8MjwkuSzCWil0duIjj5bhzqbwfU +85bMyXD6oBDn7BATVpBAY0eIU99HvpLLMgjsj2zRVD+IWKEHu27icbrfYqBpdyS3 +1t7rPo6GqC0aSjutuxwKXKJYXOuuKE0fOQ9R8bUJ6vsPFDAAZ6HwDHxeYNzhLlog +rU5NCKv9B3W0JKcsUGJ5BKJxqwwv9pheOVchXL/c/se/9M1ldDxEDc8mZPxzbXFa +PIawr/7Z/sibIj51+iasPvObpilwBQ50irdSiY2T52mxBh7hBI15mxS9W94VbHqS +DNJdC27k2BMtW+FMLVSGB2aKGf7n+K3EOcuzOEZuxhJntlg00kofYnSWVNlEZZjz +qPRgWYJ+QkyRO0Nvwqd3QZcYHgLPyKjXnhj38DPfkCd65TRH4hqQ6iZU+XHNlkyE +ei+3y6jPpa+37hqeTJfDDwTbV3VoUfeCEjZh5bWcFjY1I85o/2INbG7ghEcJq+/A +y2zZF68omqZfB/hLrO8aV7WKWqIC5dzvYvwu6XJkvqNnrjge1DcwkIDeOro/huEt +ZAeEgz2yQqL41r4x8GZQfQs2n3NOJbjFt/U9nEwd/FE39jqyy6d0tfdZDQxAJrJv +/VHua4r6OSVrx3ZZ0ZhB0g3O/qZwb1KCloUYXadhX7hieYxGKjmJzTA/gqraOZKj +oHI8BYM/hl+YsTvvTrZlEb4/BzABvuQT18xav8APqOicUrIk9n6Szal1xzoOk845 +FF8WYiX9FEjoJHEzUMz13RtpoFd+bQ6fuMtFm1PHdOcJRQ4QEZKjVPDXybIbm4sp +GnGmH3yvd46EtptR2FM5b23wGP6fTKcjE75P75hIEarKEvMHEwiy4FhKTF7Wz+CC +XYVEQLevOgAhCbCjr30cOl7Wo01Ytda36j/No2TfghTH702SvxWNVW16Yl5S9PFK +RvJZccPvlluJSZT+ABcSjSLvowJQKALo9wKC7fzOa4AWjrjOGxHQPeZVJTYgEtaH +GNBtKnW2yFblg337PS0V9LBltyFlpu+ZqvbNRFtoFmvqeit39fnDvEvkDlqC8C8X +VTb5aiE+eTW1E5TVLNYWqQsIHppJaWDvEhW/W0bgGiUeVI98uWunUn1oWeWnmjJZ +wSHpTbMTGZ3lEAP/m1RrZ19+yvgkwem2FWPoYZKxDkFRZQJ2hIY0yBKLOGP0Tjrf +oaJhDcr8JMlbor7blRC3h8xEUvLK86gU4jNd1zQINbe+c94RZwyHSmUiBerfM2+X +T0exSNQbnGI6EJWw2TQSf+A4PV3BRsN0ZoJf2Mu37xCO4+2fNBFxgSXy2DWZzQ7f +IR/8p1tEDeP/DyfKZUy/USp76FSUQavbwvbhpbS7itS5Xo1dj8R3PoGSpoRvFrYa +dU48hewn+jqMptwOsukshx6gSeQeeg7ulEWs9I1FJS8FlOqMZCo4gIYOqDBXc66h +PuHSvCp0fGQJ/Ah3HilbjAY7V2+py9UsLGGru0FS1fe3allITosIDOerI0aMjxoY +HBvlehc0FsXv2FHMbCUOHypaj1f1kfTrce9j6YNY61+qU8fUrrOcrLomqH9L+v6o +QOQcrB22MLd/W62Ni0r403P0bhxPjzNG5l9USxDlTqtkeMtGwTxjJYpUtfoRT9tL +uqbfn2f5MSBiOFbB7+rnjHHcd7qapEC7AvYMmK6OYpsln23ASKCOmqArIp/93AkJ +n23mMbUKz0p89CJKDAC4kn6WDE6wS84gJkeuNX4xASuHmb8f3wVnt5yFeFZPqf/z +7WsxMrbXaWj7w0VZllLBRCswjkdYN8PrZPfpo5dn+i3hGo2B4mZDesWV0vGg3m35 +PHlonCRfGNWWAU+1D52G8h8uHGFJtL4LmbODIKyWrgkp1JNZ+Eg2La3XegHaa+MW +rAdEkrbdT7EFR1hbHblkLKx8CPk7vuySrHbzjDhfmTWTn6OpOgGiW2+4dzs+TbXE +wXghqx0DWcyJ++R75S2lP2rzzKGjO6nS2SHUVGByBgjKQG3gZ0U6p4YNmXn5yO9k +GAj/B9BV++U+vfMqkpNQDL+Z9vWF8aXnQ9F1U7UgLwXI5dz8wn8qXLXEOr9PJ6Ed +roffWvwuoJ4fSdSNVbgFQLzUQSfDCwAGz8pql9SpEirCEwpWireTdrPwarHp6ZyW +lBf8Ugr9OIO1MYEN6YxJj1Wgxn6p9p99o61ETKmeI3zDv9gf7jnDlDTEiFN1FiFq +WT6G5K5thakmTB5Enw55pdug3DH4wRNXfoTqlY1OrwjEkNs/3E6+jTLR3jwpftZY +JIrwCD0a//0vByAe/4DKyIw6U+GqfkAZR1IkxgaSxhsHDnoTSo4ry6zFKS+sphnb +djRiiMZdW+LO3snRqjAf4S5JwO79sL+hp0dQ84+XihHlSSsYUW3oqp/inxP/OmIb +Y9EGNMMEhPeoQFuz3MrJQkUvme7lrtUUxUBh1jX0J3HhMw571VcOUGCw+KN1ZDMY +qtq/WZhaUJS6buJODxGHZre5DWh1GYATJJG92o6MkesLdZD2kgX9/sNZQGEtqJDV +H++YFIdpnt/Yi7pMW7S7r3j72r1XI1yMh2ibNjcFT8d26UfGPt4rnKrOH4m417Pm +mG4XbIO856HyTGuCEKLVjResLUMgCr0wVANO5Ek7OW9wxHWEwn4UZrJHeQ61cbfv +CvrziM8+zB2uF3Z4UN8b64u3WmGfNBFPPNZ1V29/PicU/IiS9exr5JF6al33v1vU +0vIZbH7XggJVOBug1lkj2shGfEIR2A2s2EJEr6L7VYCHHzAvVsI36EXaKwPoMJG3 +D0A/zDCuhOZJg/NJyH3TBKWLNJXC0mhPce2daMhqaX6qATCbzE7pik1O/0oCSxnV +TggeciyRSb8Z+ho6oyrraFxajiNGH/Sq7GHnmVWtGq8kAcNf9s2j94dYqFYOsBMs +K70MjMauqo72L5+/dVyZljFxxrs21Db+aoCf9qC8s9AJWsCVM6101OwFCoCmeea5 +738QgLBYQxMQq3TzF+0vPAljDA6tcMCGnQhYKi4XRpzciqczMTQnhGIRmMlhORon +CGTQXB+NDrK5+uSjhFqE30a8yjtCA0zRGfb74Xix7yR9fu2blClhFQUpSdkGT3rt +sj8fz0uamj/n/f3QqHdf3anEfLvZ+79DRKNCs6QWV71VTU+pCJKBeaL6/M2VunaP +5GxEV7VolqF2f88v/+GsaVg50hdGoui4JoKSjbr9d/iPPtd9Ek+DAt7AKoK032xH +tvRHPSPIOqbWWBJBtMjBQN1bd1J2NjqsBixNP9S4AGOKrJB7OIWf8Eg+SI15wQC+ +V4uy2ay0w2L+dhYzcAlFQDd/IC0+8Iviv6kklkVilJQjPERZUQBz4FHvcnd4yLOG +9ehnIG40iLfBJeR9ajjPql/IuogG9ilQv1hrOqk8lJ1KNifqNz+uDfXyFvxrwplH +AxSSH4lXGyauLd8qPWU0xeI0+naYxazKsZuIhRIkAm+UwW0Zq1JWyggzQyhQSbe1 +3GAKhIS34p79jWp57L0nJ7/5aUNnM8A3PGsCNHfBUiql7ZYGPXK+BjRaVPKbDn8a +7u4QzAYHpiXg/VU+rCM9vComB0AuB/xpBhnTyI/AJ0YZ6k4YLQUzDwpSJmG4vNbM +cZe0DMTQaXzAvDNjj2FYRWidbMQdghod9U3fRhImDjErriELgjfVBFNid65eelaG +awe2ueAVaW4GWRoE27sI2+QP5XLg8Ekh/EVjhmlAGOWAxeImxchgqbN5t3YuyZ4u +kSs2sHde4YZ1ATDFPkFHwOaYYwgZB5wN4WAwnLhHBYDm/Sh5Y+OMODdx6zvBmVCg +W2zUipToi3kvR6MnJTQm3RKluhqj9uBgoT4aW3i3MfLGcyS1gUf2zYnNZE4i9fmA +xyIs47lR2kdlaiX1rScx2XLCEhK2g5xn66JHo7BTQE8mHkKmCb7a28L6jY8lJ2mf +xsYU6T7TASCkfLnXz6k4Cf6G1/CJ1QieY1o7grfKdhEwX4GgeaEqFELPigsDrHIN +VDogPs8V3uLRDNrZlGQuRgnlenkOBXO5c32HDP6ALBUWhB2fWLAGVZqWBStrnALg +skZb5Vg2dE320a+Xmlsz6dAryBjj8LZ5ZoSwr0q079DT0wc8O2icxV6p0yIlgXtk +7od6DepfyEOm+ItBYu5NjDyTgTirhGh07BQuY+z5DdSGU/MzKqpAUBTs8OaU7+pi +O1N4Rqc7L3SsXpHHcTkDEJO8vJMdze79o8pQuO51JeJ3aYs0K6X6vqK+Y/6X9c21 +KigmdB46pl1H35dSbBA4FaJR2WHnVA2HAFINRgT3E3iz6++SZi6sf5gXHxv8odMI +GaW1Bmq2dI1hpVMrNoYd4Pt7VQXe2t5Gm81B518ZfVg61t4Lxb8QngWFsXyWv9zv +YC6zNblGoGvU+3eCs+oGTwkWceyVix0ieEtUOZRNQUNe7ETDMZDihRC7+rMxdtmq +7bU9ZeEEQGKqKqbhJ7RdQxJgZXuBZnj0wcQapFshaR+jT1x1NJ8zgQAvtoX4zOGt +hwBWdQpyYG8EFqZIqfGBdkRIJ27CA98IbjziNpmMfaLvGHRuOEvl1ULRN/uN3FYQ +bvpMaC/i69hUmY0YBbPDi4mKa3UC7fStVdo+1abTus5JE2XjfyUKpRfra6BGnbqa +aAAdraIfuaEgs5kh+5taVsWlp03Q/D0haviQD4OMqS+lO4Lf46qc/xEzBIzziEAs +d8W/by/eMtn6ht291M4repO2ea+MdhBnN/B2loS+0xojYQH01G776XKrMtMqMqU7 +4ixY6j2CbGKp0o7pFY56sKEuk+CYu8SXAWoqrnp4hvXk5EkSuFEVOus7s0SaAVh1 +pYOQPjYGlEj2fjPecZ4oGw0z41JlxQtMX6zLLWGw625dcBS0zPi1cH1vyNFTW6C/ +nnDo/fwIgBzw+6M9Wkjde0/zILbLd1qOoCqZM8H1NGiuZLq93ch8Fr9RqsuBOpBH +7Y2THFtQ/fcUPESivpFMn2Mtr6CQg/DyWTxUCB9vY4OEQp0hA5wFm/QEK0g8xew7 +wP5GjxiJPL07maG5vRCN5Tm1ez9khCvBEMgg+LK6WvsZA1Bg2HQnyF0ScnCHonAS +YprYV0PM3JskIf6A/rNSNuPoSsTDwQwm0ayh4RNMZktujSfOM2waQqI5CfYErbot +s2jRkb34mm/EVT7H3xYQkE7+hwfljakfYxnfUMXfZ2srG4jiwHGmd5DY60Dv7HPg +BIRZMs6+6vbAD8aUrZmOM0WJWokAryPtiVEslGKEoKN6qGGmuk2OOgUCckI54N9p +MQyaYFSF0Pu9vtpoVqZLZBgoA+j+I1QcPOLmWHyfxXMvGWf2kord0a0nTT7aka87 +QiBm3H3OB+LiB+wWaNXD+vZa96nBdAnYdTyYy+ScE/5BtWUWThN03ATwPFZM6dIy +etJZ7jl4zBR2fxM3kBoV0IjGYvNoJQLaX9nHNBssHfbsOxACP8C04VAzGAf1OHWF +r5Arcu25FI/EVFRNJR/s4fLsnQxaaKsiSgICrWZyeHGLo1KdXDVwQgnjc83Z5BGy +n1tGIYSE/IaIT1o2n7ICjtiZu3Pg4fjyOSiDsZ0exZgLT8gZVyIhAyyRR8c3LjS1 +tjqGOP0hpiAV8MMkLwy2XJKl8T/gyYSpiT8a/vFlhGDPGC7H91TGkB35Pab3jAuR +805aqiCGo9f2jGvzo9nyunqZUsqLMKCa1QgXRW+VyZm1MkmwohqYrAa5frZWhVHc +LFiToHMky3ul2wWQA3l1jVDC5iWQEEJ9LsoWmk9mkDnDZ4Jgjz6lLM81D8DTZ2zl +VVcQPLJj8BRcF3NtxQZR0poR1KXTwDHJX03k/0VWV0Tcm3AapcKOjTsGvnQYOY1k +0DquUVYBgXDDYWD35CYliEJerw9r2AXqhm6bVRt7bIXoTDYrZt8HdvgemL4o7gEu +9VIEytR26fIC7kHl5jLUFxBZsn5YVXk0ev9sGhf4WPrE7+Lix5CkaQjJ+1RaDfP+ +oGecwthhbVz05RdqzhrZTfJDvIkCDBlC+AiAmZJ+KJGyMrUSeortrvxa9TrOP5Gy +9bHQvAIHk99/DveNO1Y+WLOn23f5SKgXckzWQi2mjgx9jGPVTM5AmRbg3LO8H7ro +vI7ZAU4SmVAoOyw0aoYaUjtzCnXRJJWynJN/W23ba9iFqH833ZIqOtlpE45vHCKd +v/63e7HwbfFj1VGyeULf0sUtTmx0yTrWjdLZWxdKpGCtmNrDkWHxSyGEJdn8NrVF +Aw44nF8Y7pYNJJ1hdFX+wmLi9udQySyA5lMivs6OeaooEqOiVZyWnj7xbPAY4/IX +izqkKx0hoNfZDJ+Wf38tMbVSF10KEoCPRzBL8c4hRLR7K2lVTb+h6XPEDhHk+1b3 +DFhYzPeWdQDNlAy+aWy0lDfSzG02pYp+pTDuEkIFacRmzDNKKPC8mjGBfE/iDFK7 +lBYcNEPnj1hDbHllMmb1GYEARG1VXQfU/Kcva06kcLCQyLfA3BdshtTFMrp64bBD +6W33CaPTSrvAODWmz70ykocwfW8EjvY6utwjZXIWdm9MiJ6DGs1QaDxzJs0jyr8H +hAoNwXyB71n6PQd1QG+pcrX7L83GEBG7brdwjuAHVDj5XxIu89/3u6u2e/dJry35 +3M3atcyY/QBgwcfhmKPWiv1ezcA/uMNPSoTP1s2NMdvLK+evYfGzB0WM3XKu908G +Re2ndFyjHQQFlyHvjMl3LhwI4geCKPYOOPCVxty0+5WD2zSLx3C1vCQWm0fGxzYx +e5SndnjbpJn79gAXjnDQPTKP61oUy14dPSB7ngq6lfqPVt8PdYnne1Avwul4KzTi +uXplZRQCL9FoOoGkyGu26+J3eajYB9cpTO6ytlWDUKazpChXbN8u7B1cl5LvOcWn +MQgZiV/9lZDBh0sElkLfGreGtg5njExMbYclLM/fiHzci4lYwHNNqwZUHt8FV94V +XPDWstlE1dJH8xTHo+BJUM0L7k3gTYD0r2l+YtLjttUSER3lKGs86z0q6YQkT5zC +LWoic0a/tT5jt8QZYG/+XFMXoa2yzZEB2jvc4miZHJfq7g0nSUmkYlBzekfXo9lO +fr+HNnHzxlt1urqnyMwgNtaKudf1oMPmdhxDi5RhkNVTwmULUdWVkKfklGdmPAC/ +5/JFLpTPPRM3lqqt6AiXR2ttDsKfjy8flyOAbG95n9yzHD3Uqeg+jLfSAGLVfrRT +GHSwEj3Vhd/YpE/+U9O7YOQVqRtHNr2U8Qc3Px2E1agBI1q0urDIjl8eihTBLTLq +AzlX7Y3mtjXG3qqMMoiaaQLHSvzryiOpsHoq81dwwukcK3SecQ+dpNrIzDVVZ5qQ +Ce20fgORvrNIty26w8VdL7zeFAFvzsfquVl0dRb1xwdf0A5S4+VQzDoAij4NQ659 +t+6UwezIsPmRjhIvTzHClzISdvIPyQdP/DjdGsbvovWn7yF7LV+8wzcRJ18GRE0i +irD6VCfemJXZIJb0a64HFhQieErnkaEJDEEPUx/6oqF+4Cu0eD8XwJr97+GuJxRp +bKZocadSMD98kUnMhb3cx44N6+GjVHNBTFbokVnccikfTSolKUkjItaAz4K4BXpk +avXgskXxq5HOE/JZmWN483/6OhRCetisumQ19LPkG158YhW0BVkCjwJn7c7nEJYN +MofDDc7j2BkJfhlyrQQx58UGDTzRHDmU1A0UUZb8hBncObAZMRBixSyNV2szBp2x +EVe5cnbzEDIYJzJuGsH/cqzfQE/w3LLZh29BAFZnhTGygP5aduzo5FxU6iFntGfy +QMkrKI8+vIBmf5EcAUil6G5RF60DxEWbUu3C6VqbIY21tb0PBLxiIGxiF0W3zYfg +n5C4RhEjGf3TouAnmGJ+kmvxBW+q2qSVxaChv+NNshirq0ccn47LMsi3oHoRvsxN +dQl4hTSqysmf819KNjGXDlNYl0WkgT7Bl9sGXuQ+oUo5g8HPq/XDLsQNHFnn5x7e +fnb7Fl5AlBfS/sRSshnI6x5nMaSFDLsUg3Wd0S6EF+ofqKCNoFywpcs9LLMY294R +wFlzurICxpRALcErII0hycoVjNMesp4iE+EGOzF1Tgfh0E6efpaFUIz1pXnO5qQl +W9NPkC1j41G9XkolRKKce2KZe7TmJqiaO1VNMBFDJEyQyT+KNKuMUJSIr2o3rMfP +uVqTO6S57wi5ag55XkZC3xZ4/VrAEJz84vPd4AVjaxA0CYHurKJyoMeelNVXkex2 +lZ3gK7c+Kh7btncVWZVq5evEXBl9lLqPS168aaHALUWIRDrKEBx+PEJwWdKtUZ9Z +ECrkL7joF/A3eup4zpOOAGh1cynQm2kRGoIohQT03iCgx1mF3LAEff8epz1m4+gY +zWm+XQ+iu3mugBrrdW7GZ/ShMLJ/ch+2hUZ79zr8i5QoKqEHo07iSJBa1RTbbUBW +iJ/gCy8S353KEfAyGZ72Wz+qSP1i0PS0IrlV6vYkVMmHim7A628o7TT6CH+P+mFN +nf4ELzrXYhozcGxKlWNnZCHti2K/VHGKIqLVKGULSC8fqfo4OszcyLXXbJXqQHdo +qmmR7xD9tEXNKcQsCEd1tyYi/M37A1wdroqaM7nHTKXr40j93/nb+CoATdnfl8kS +3JvWnCzZlJIiwgwtBvy8Qgfio5ljhakQG3j2N30dHLs9FSVcH2aJk3mxjR/KTeW9 +q1PN4cqULHJOIu5TKdaBYtW3QuZD8xDSHvcDUFFT5ZfKLfz9iIlU7ToKUBB1B6D9 +hftVgtHqTqxWtS1JuC4FDupQQR3yHNZtWA4arNRTDVX2tA1iH7+r8JRWkZ3QKJVH +2OMYPX9yPa9yxNsm2Ikb/Gt+95siIkLjYPIXWkG4UNirQsP6+yZm1L0Uf8mEgYlO +IHFK99XGZSiCuYezAF5C8hd/8pZ9rmlE/SyE7N/h0yTJZhMzav6VHAqbr1bIsV9e +a9HQfkoCpozdTBfK0QyLeP/QeuB1jDeDkID9C7KAiCzT9FHBaICc5qnonGJuwpQe +5XERJDQIoEG+0IuMH+BCGnNy2X5ttrs/jD0oTv9EJj0bPMFjaSRTf7YOgjE9WEAW +kFmsXaHCBfSVvfzsE47HtE4uOAfIL2r4ap8SWAQx+EwHwc9FmoMztYkhiF7FnjQ/ +2hAGcsJPmN6P8/jiZ6rSVfpRpvHKXS31X9tN2JPK+3t58hiT0tWSPazhfuQSuyq9 +7Ps9qg1S/Mxe/SdOiyQ3xg9/YJR306ai7N2uBm0EhkEQaQgL76Hl/rEoTQu+DDnt +Ax2pBWbJfWSo6rkMXjeVZXv6eIkfTyIEWr1WfnOgEGgNfZqzqSIR+hZY1nBrIwMl +LaafPUrsNSHXOmf0AAbH516kf/XHqmd4K067RlK2N1NwrPLCriuercPO+OsNhlgz +hoLBLMPLrdLm4LLKJvAYCBl+Fc+Z/fX+4PZfD4dfMkrbGzEznUUfSUhIPKbMONP6 +zsVhz043BFyAiGIoIoSN77kF7hRaTUU/W4dJLF6ESEZmkOGx6kgWg926HUkrOU4D +Qecud1lVyw/C6e9YfXG58lLVz7TPblDWxPeo2yR8r7Tz1aXysKQgIloYnpN9YGx7 +I5VHFkNkkytVsXA9M2lRu84mmQzxySeplLnRyxPZd8upcF6zbFCyxdj4tu1MwnsO +n5FrXqjvvq890q3NFPWGn8CTvfkUoiOosf6qtdUFxTOU7+TOZNzcdPB/R0g3SsK9 +ufLYbgMCaeQSLlhEe28zTQmZ6MkXKX8dAvw12LOE+Lr252lL9C5kc9l1MCijTgQH +ylmuP+FHY+8axPCUnuC1oe5Zl/cdb0NQz80VIsgza+0qXrMNaHcYWolqn8NRDedj +g4qBjcsr04sNCBCqTokqz3i2DOxXtIlhbeWrp4RPMLPNLSoZIw/vmu329Xoe4JCv +2PG4Vp6+oOJ+sTNnU2Ie7nxGHKzB/ju0j76eBqCN/uwyiO0ji6X98IPvyc8dsTt7 +WIkSvBtg67hDZSVxWC1H4ZGqv4AkNsfHByNzjaa8Din0M1PyaaFyFyOTKdtx5v4n +ylnbKWKpt8W4gPWMW/FeEDQXdwjuYmRNN0IAQv2X12w9BQDobDp/34kJIisolXTN +sy9sL9NHsxAqYgbu6CjpXNzOuoKk7izctwHxBUJeQAz0KqnxlB2MjXkDFu/n6WQy +sGOWp7eOns+y2u424TROMwEI9MEcIW6Vf2D6gUHHaLYeQ6uwlY+Ol6ro+1Luouaq +HaHVJAmGaw38B27q8sJr+xu06b6jVXfjy9Et2nj2yRxeFGCFOkaWfzVyVVAQxbXB +ddPJ3P9VJJP6wQ4FfIgnbWJ6g1s9h3V67KYQ6yFQx0bV2AmEcjcZrYxdEQaFNHLk +Eedckm+SbPG8mSnAjD+3slysosZnxLuxVZOIggqC1JRcyaKJllMLE+PT346NRWA3 +/Ih44/Cuiz18zszG4xUdU/D2AuqhCvjNgK2/g93/RFWvPhxsG21EPeOD7ue6XKDu +1W/PdLTYuUDZRECbzB0bThAzeRvH+KpnMzEsANqJz7tuzmVmdrv/ufxcYKM+j9+/ +spX4oVS6Ie4FT+MIFBdtyafjC6+EjmM+5qA5TPvXi0Z7s0hLB7VuF4QKxsWuAAfG +21i3XUGMK/3pdqcrperWNom/kTqpW355M5lJ3C9crgXL3ahOJoV5c02J6MszWfDX +Tkx4TWPkyibaSCK0crVfH21eolHOVxsAjiR9SQL0gvkER5oQ9wo2jH7AAGH+4wOC +GVoNAdFZ22DxarDck2BCWhcJAOHlahsmnsjnpDV4bMvySxzRooIGgphxKp/0jicS +GyWQ0mYpAUDvwJDVeaqBzwWIAnfjB3gs/ifd9YdJa+xvItV8cjMrXu4mRvapNPWI +htsoER804GdfshGBhmUvyXaRIkiDNw6eF9elEhWcRpaUBKXgVsWnGMtzRDMQ1dXy +pRA+3fETy+GJmSLRySNqlQWZcxf/539+Ycda3mXpLKCX3/Ntu8UW+DicXlm5pvmx +vKK7tnlAHWGxxgq4cylBNJAoCqxwDO7UPVelVuAHO/64NQRYLZusie/bE8UnHFot +utBgfjkgIZShgjp+RXWBv9sPGr48fEdL/hURoJ0efiTTyoWdsFJire3J3+UYE8Lq +EazkdJ7K+7MJlC+B+4be+/Ur1/vBJwX7jWrgnSJiPOtlXbHyLCLOEVguuvQ5kYyI +oEiJM5s/OQHx92g9YtITzfbmWt6vj79yAH6SY60zXrO2sYI4hsNG0sX/JMOiVUqp +46Qtt31oTMUQtm60Ft6KIANjrdJOHrhFRKRPMzCZK6FZnakfhJpZc973S86NXPKs +n/vAvOstYBP1xTj6KZmV09XdPz8OU0V+UuHzS1uqJ/uoTXo62DrtxLd3SjGOoVL8 +X7r+/SHCbfQgNsXaGOaBxhm5b9ybc6GiV/TfzMUaktJt5bkW9SFfPVUHs/CBWJG5 +4ANnIz48H+lD6QDf4fueHPNx8fQDTmbj6dyDU0yiziS+F9cA5SJWJygi/T8brNV9 +kQVFfhviyyGq4Otl9UGDEvi+G+3atM6XiaqLf09CPq4UP7mSF+JaD+ipXoCbl0v1 +FC/hm2kPoTeqVbOUmD1/GXFTvUxyjL/2Mblr8zYpalzChO8F2qP34U+w9qHyYJYP +1QMqrHw/QiFKNHARvASzndacvIIoixyAIviOQY9pLdAXPSnG9EkcFchHX9brrjk4 +Md6G2ByvVpZDLq1a4dUM/VTsSFuP/EHHe3Uwi3OVfe5GaaGr03AWfg+ESp1Y/XPS +ub3hM0+b0qv8hIM7SRN9sVPrhpBaooUFE3V1dKb2WLHQU+/Qep8AA6c0pR8C5g+2 +cUmlFXP8hgPjCx1a1LutrLuz56pX+cbx+/d5CpJPbHicegdCK/oDfb1pItBfF/d+ +nMuI8tSxL694iLcaePmCVY6OMrxTxALqMq+4SxKvHfWG/H0NInn0aVzwEwfPWV1b +n6111ONaotS/aVjRBNjx/1RFXXmhvPnpcOFPpDafwOrJ79qLsPlsOVfF6cRpj3lA +ILhpcCR2jBDZ1QY/5oGWqU0QDZU2AcQGENbpLNT9kZ9Zi+vvcsjx1mCU5CPZmyHw +fxpgF+07CbREx5Zwi3JytOg6zR/NCPDJw2kX2mQUNfDWF0TWC+ktXSksADVaLT81 +AFDmoSlziTsV3/XEFwO8vRuN1MkleLU6BWB62XjMwsildenDSJsdLzA5aS7r3Hjv +gNLGl+/V4vAmPI6lNVVXwpywveKMeGdxvmvka281cfNyL1ahiXBEjC5zdwFcFdZB +JxWgnJywXnAw4SevnnRBh1u7mSVChiVwv79PMs+n9fo7pK/rJL5byXEOmds0fQWT +cv43sSrsW2KH/74+ZmuEM6R4J7CS6d1PeKmvGLjLT0NDssyaR98oQ/Duw/F6BJiG +TFeP8Iq/SG9P/8RSLQBpgUZZKi7LyRXX8UNiB7stYw3n2L36U+ux3vxQHimvGsa3 +O3tuUCZz6BZzHkuNBTf3pfqRjrfjMOndYlKFWA62sj8eVz82jf9EEwn3Q1z9ebPc +EieKo3hcNi5PuXR02lxlI6pMbV5hhoWxhoNlRV1YyZj4XkDl8WiowbEC8DDvfPGk +zlsfaKlTZDTSsGerMogQPtELW9fqRkUoEfPmlnBY34sZDQl8ySEp1M7VWBPWSKN+ +DOiTdcMIobAaY7gQyQ4npZBXMy0qwmG14Pyc7Tzbdte46AZkGTuxIC4XZ1jGxP6+ +O4gVLwUCRAxC18SIXPXgtWHQdFQMyftAZyljm4F/Qftd9CcCAIMCDD05iRcN6iKF +YQde2A7YRpjBBzFvxQNVqB0suuOxBFxSQdesnSf5sRJjWnUoWvUc0YghLXcXYWKi +13r/i3gLlFxlesH5aBFWi83qNiFeBcqW5GTozpeAsLCPGHEyTPXZyemVFT7S+Zll +eOepZ+vYuTR3/5NEJt8hj9DRY3y0x/xPdMGUEEKHjTYRcjveFURrYvEQMnLPH3hX +zSyN7lZT9KfCxL94GtJLYyvYvR9cQvSWTMWEhfOwYJABN+i9IskMIx4wCA4EvCVr +h1v+XrFpEeY51q44SQByG4E2clWru5En99lpz5V/vrMMKglBnd1xp1SzBaTWvZ59 +HeEQRxH23T5q4YrBelJZq9Ty1U9XEf+HXzBgNrUBswIC1H9NE6G2iccC++cQ1ltK +Ccgop2cSKfnfqunSsBOYBmtCU8yNQkKgFhe7cJ6rnmnbsg8hrN4A3TtUAaDkVR5p +YOPprrxu09fcOtUI044KBUeIRVZCUSm1LvsN5FgiXbF3qfjs2/GKue0rkvADyDrl +Y7ECnKrEvEv9Z088WRg44fdv0J1FIRs51Vmqw6SOWmC4jmw8dTnAS0oJ6MG/i2m5 +VfitMUDw9P7+5WBwO0PcKCtkOeaLD3ku5O+OBOh2WN9+GLikPel0VnTvCI2rnExa +Db7k5AHJjpGf/ZncscjTeYg6wRXtkveUxoHzXGqqqa+8Xu+EZ1wFnyYs9SlMUGCL +MkOiXS9ABYq33KBPsQgGV50jNIgRapDCwqEHG1o6/cO/eTti8eaZmO7z87iSq6ja +09cSvdNs1/vpP/DCtwS/gevnyEXciay25fGn8HZjifsAnBYoJ5ed357jRvkofx3M +Hx+s7zHi5ok0+TfUBJDTIfTHm+EA8NbeNqiA0EwI5hoVqjoxHR8tMND35n/BEHDT +Ax9jaeakj/7GNtcilTMlJcLeeYAyzHTVcsHxrd30zHZzkxDqGhuH+t2nhRDMJqkW +wRJu+6XWDmS6Co+hBgXQx0S+y4jNHil9kpwBxwRgloqSTsWWzyiB4HIrqTs2NNk0 +JRcHdQ+KSUdN7vSUUVG3BWaRBPyKdTKOuHHSHKa9Q5OFKG+VrpSz9mX1PXCwIV3E +9YTEOn7gnXASU4RMNhGCTqs2HTYAZKc9Ro4B50TXtc7AX1lG68qvO4Jj0rMleWa4 +LHC5jKe/2L1+usDhNAekqgD7MdS77fig7FSgmOx/90DjOysNiSqMFN/XBRMBzn/d +XMLk5cHQqlQsZUDqLMKZ8L2ZyDILk1GXDwg/rtHzTWust+0lxfo3OzRswxMU85W5 +f6VNYlPswPASZyVCKkbNSK/OgIAbNahkw21UrhSefWZrWxk3EoyBlSf0/Bpaproo +9qx0CwdirsYqkgjX8CFvOamGfKNTqjDLfvFHFAm98shfN3ngUoUghdF6zp47jTh2 +Mt8xlwYgu111DLTHIyUMcwM/+xjGKTVvxnapxpLBmv3FpBUB+sMpDUBa3f/Ji3RG +PWrLo40P7XTdL55QFINFgyWjJsaYuFvstJOqyCEaLweUMqImwvQgjwDBIwk80DTK +kxdCl0JKET5aZtZosqiYxy17iNQPHrIZHY76JD/BV4TymBkBsCxMFSZQbjp6L+zD +QgyUzN8lD4xEGS2WnfOMoYlJhKygoX52iaL77Kn76fCMXF68zCZoXrkTZ7UUz1hr +sK6UGWrg2nRgMFwSkUzqVJTOYgnz6Jh+0j6DasvFOu5hFDldlyiOIcNfbDTb2GWw +QftlpYD4w7QOu/H3WM07LUX9TrQJ2cMJ3kJiJMhfqZm+1ygUbYPSmWhnDGZO2wv7 +BaHKkqi/llN7ISN5b1+famIkM+cKDE9g14rus+M2i15ajo598RE30S2DO2LhmX9n +m3DXFineb95xX6Cx/c3KItxcWsGRKKS+8xBQsaBGBOCPhjflEYBZCKj68QD/tM2j +0ViOqMV0pN0wDTtzh7+3Dl8kLNimFareDSE2PvEdY65ilZk8KsJLqyfjLm8QStJw +rX0PZ2F/xtu0gJ31s099Nq7naFWT3jprNdBJ1ns/iw5sd6XQ/A671zrwNWyM0xxq +S7RePEhhBgYDikd/DCmoy/XqS3ZrQkipn5qvhW1Re5tzNdgK/GB0wL7kA+zbFKNq +3n1PfPd+91JM7feG+o5pYkP14rutj0T6v6jJxthQ5bzkz6Uv0LSlYJDeifsR12jL +O4d9p38WHkW+pLoLJpZ+VNG11aIhSRu8BP6EYEQR6Fur4mv7fZkHv2UxEyVC07EM +Zm5+AHyFA1GlM3oR8dTpHxmU6T6p5vWROEHX/7VNPZ1QSscA4WyZAUwlUkxNu7rP +4WhqM0yAriS63PZ4kWIi6wz/IMZ8jGdye4oiHkpeMxIicQl9ETwqTIvs9QxKm3jX +s0OArdCekmxnLDiUexLu/w4DHips9PEaS/v0ol9IStHHmTkGIAzGr3kW2tkIqSbS +2LZ10i4iSqQiXQZVbNzAHbmoUnp/ltCqeCkWKoYt/CDV/7B1RbBRBTksD9UaqcCj +DSiC+8omzPPGicym8EWZdP6jOoKjlgWpl9uJUjU0dciCS80mFMKENx/kM8cCkpx0 ++Ju43tFxrVysCzy8pM+TMuAadeEeEMZhGaA4vQhRbJE+a9BtxeKXJiEtR/HKCVeC +m3OLDvYCfF89+PLYzPz8ceRXESm0k6R9yCWhLVOXBK8tbI4NneSPGxO4Fxk7QfGP +VnaonteYRiMNht2roGE3hEyeJB2LYr8DmT9KHQTXK2T2/MjSQMFonzl0EOJ485Jt +P6kP/wbm8BdMPsyzZEBk2a2LIetAXpXupoQMAm9XSIPlaqLwvmjP+58vmd1hTYtm +zLals8Oo6IqdAdkell/Sz4Wnkysl25Sg990ofy84nk/1hjmgoZaYq4eFVMxI/Uhs +MG8c/QqTvkT6qLfc4f6upKWYsAYqn+hSzM0FxlQvB4wbC385nm1Tpn4riHoMVIzg +svD86o2FXptQdY8VxtC+Yqb+rFHBzwZf9jkuvJpnUBpjhgOvP7dPi2k5XdWsbyb4 +aMA8ZG/cqel1x8IGdbVlXoc33g7khQOdNNhkLxLVyZUuqnaYAOnhfpPBIHlpOzIP +LJYqOk/75UE7mM2xZ3gCyZqIesZAKJzs0q8VRmH+jgSGAWbyEma11BbCD/22Pd7V +fzHCAlrn8ZI1XQquh9F0K64QID153oM1cuDBWdetRDyLFAp9Gn+v1/l5sBHkXKEn +8pgD+MxO6D9M/vyj5Z8oG7ksSEN5lLj7EvuN6bAc2fNu4h/IhP6qw89Qk0aVfg3T +cP6q/vB89pH4U+kIPHAjnMtziV7AfE+TP4Fk78hq528U9nsnbH7Yf7qPA2AOy56I +Ed2HzM4zcCyTNqLyoQUD9XHVyHzufDk6AysdvgTkUbOdBpVFK2KJCOMGOn6acR8m +Sm/U9kuTMohRUBySPRA/zplTYKttf/HS61qw/Fox1PE6jKC1XQR0o/wxK5BZd8pV +FKp/nPNzg83C2kPI+9Pv6RjqesPT8WouvT9bvhC0RSJvrbNbU4vIhtyq/jjQ8wsh +IFC/PZdPybIq3adEUliZXvFjlYeXKeECRAs8A3ffDFC9bgPMLngrF1A2mP5XXbiq +xzkBtuyZUkavZJ5LbLC/q2EAfS6wRqp/J6wPXo1OcJHvP9QVFqqZfnxIDJBiPGEV +ZM+AG8pBSYW2JyGRKdOjzD4nbXd7ZwnCMb9B9BoOUOt9SXP2FWK/8NX42IHpY4dD +kQQGMinldHgR51E3XMdwHJoMqAoCcZdSGFH6lxhHF/8ul8Qf6dFEcqeBLqgKs8wV +a9IQw4fxCZTKFyHRltRL/ryVHnDm11jOF/4hrOBLgtPrXd8Ge1XaFSpGF3IM5ZDU +tpMw2eyz/uix5f/C/xzoJLnVRrweyRpLC5vSSVoa7P4rlFZz7qA9a8Lunxr2VZ8m +Dh+bk4o9leHZJQ54BUu8jubHlIse4UB/CSP9Hl1jfl0bt8irrriohaKyt6hoYJ6y +RpiYG1roPJfiaC9uje16gaM5yC3TA716GnGhcEG9kUDGK2bijc8puWmlMmqenODD +JfCiZqAN5x7oIBeoOZAgAURYPmm9t+xWaS211lZU0JdCjCMqv4/6UXU5Sgiap7Vb +ZaUUCHXHfLtZ9aYu8pMN356y7CHi60fvr8YrbnrXPxqp4VFYUlYDuGXvG/LfQyUr +fh+gCLqfFuiYkSdT4dyk1Vk1L0oxOwDdcOnDHY5gbExTxh2Dh2Ia9PF97VeRmys3 +6D2jVLU8dKkGURw0VaFn2j1OiCfVAAsIALozmqS9dBTjlLn3jGaVGLOG5la9jp9s +wB2UGJ+3LoaQfeidNI3WHJ2Z/xK+8gBFPnXmNd8XhGA/nx8vVJzk1evQi51ALVio +PsInF5Lx0GNmhq+VTNkf9jtUGpHK1hhsIVMAuYSDat/trJ5tVUgxjS0bZovQbhHk +brsOdvH6z8jXsvfnHxc+dPp/MHtdMV84U5yiBwOGWWoz57pGs3haQ0xAlIJLsIyX +3Y7j2W2ur9NXWKy/bRjwMlWZ7hvo2c7LYHFHYZJCcQYqaQP47VB0ebtUgEUcYf1U +7fece/8Rmd2ewtTNyBh+roFvEdlZ+nSpGhJ6c3D7MdfK/PM6YasEeRdvT90neBN1 +7V/pSeO0EYzn88A9ioAn32ol2BMFkU+A8btc9DDuknVE5KsMwdQLnRKuqjHyiy/p +AWyVtl6h7bN5cLkdQw78HHOV3H44rL9+WVtDd8gXXGT/iYZx0dYy62EKE2LtvHTk +EJhyxzYaN9jMujzWGGnqtxVvMqHYslPTrqSPTqgCBoFU6cn9tiFAr/2amUkZU1gN +u5Qo9H+NGrbATI2R57gcQ5/Awmb/cH0qJRFJ/iSKXxf4zQFym1FAWXXeZUuOOLft +4veoOF1VnpTKwI3kwhyHrgKoKXPbdCXPt1nOMlg/BuHLVpTh1vVsgFs/+zPljjJK +fUPdn6jgDPJCZpcplKPhdmmMix3fAxyz2nT3OSmblGvm1daTOsvc51QIOfK8rULd +T8fxgP0Ys1u25zmuXvR2NqxvTHqBfFR1Nv1WQKgXqKitipZXlagQmvpwc4eynSxh +2TktMUFLqXkT4PrHoKRz/59BR+SjxUMZwusy4Ljutfg3mUrupzg1TRNyJZTJSwCM +IVYB3n2GEalbumyFj59qAOxXGj5W447JyQadJ0HqQtMhWHPpWwMdjEXrPzKUyiWV +7O9ZWAcTMCJhO/vIUhmTp0+o2PuUl/EWbmBJvT1gextQruCQbrczCErRp4PkZqA0 +QK2zEAh6w7w8gcgGpcl4JkLmA9904MD6+WV+wjEzVKjqjwsoFYeds5ZctpwXrZfe +otdiYJxRDxC98QDmEAbK1/rpFCISvKEQ7rtiRrlg4gBQR29/bHuMxlrcplC3uRKH +eqCFbuQpDg8pa7vVupvagvgrnXUjPj4nZ+Vz+hnxHkOjBj6VNqX9R83lZWfXZKWt +UGb+FtYPL6xmk6C2fSOGB8Kh3KsoXS+LBlXkVVGMe/QUvOjIeh6/7L0SVs3CyeS4 +etQrOxRU+uMBPeUMGaKHfU+9OZnaxl3of1BShx/PcvTxcUX/BBcXDeY7/56GvNqn +8oss6ERx/BzG5/6p6sP+WNmKVNlkBiG5kN9ha9fnHFAOwbPqm3XSfh1d9o1Lpghk +RRYISrogqxYadNcXZn7l9dpxpoPYmJvrmTQRtoBLmWEBFARpDS0sF+ssct/4Ears +Z7zyOoCGvNZMEYRJqIWiRp5La+vnP1rXepEKcqw12O+RAcYCq/f3jqM8O/gHKUIO +uIp0wef+wMmDzEotTWsCRHh2Ij93gOsHPVx3iOphiTZpQBxQnUvwVdSwvyrBQzOO +BdD/0Foa5hYOohF6ZfFhpWQ0gUyl0mspdxIKcX6CmN6J/HOLUCEjZDf88/ppb75e +sgT9cA131pVXlUZojOAxsP0U2kpQ5pM5TtgjBlhWEQIRYU4n0L361B/T2MwUKeGC +4Lz979/wNvvcZmm4LFE1q/hKWjcZRLZdp/+D6XwiRqUgX9oECNVEiACXCiKhg+q8 +zyjXNIJppOtKXZYeibuBFDXTURWLv6x7uawtWctKSbP4kVti8WgEZAJIRPmWtLOq +TGS1TFJJvIbgqem1CDw03+7KiOuyfoiE6fqSHr1H9KfZCzJwdluvpsDe7i62RG8s +1mRxAP4VhqZxb+I+mVyRbYpRP2r8M41X8lfOlR5Vj4/7qUUNekdfYx7te7zqMtxf +7feJU+d/TDPrstHnFE+7r6rEg8wyJDfNZd/VkYC5ynvsMN0WdSN2wD869lwpe8eV +1zRDiuHr0IkjUoP4p4prCHhCCK3xson+hD4hUeD95VnmVvWYxAFKfqssiBcwCOXN +eAyEl7cYh5ciJLg/q+CwtjV2ZnolTYXjoBWSaBfthuWCiwfcQKuPcJFMgdSkbX8Z +0dkrWEhIZtrjitw8imwtAC6qsOgBHJdCvAkjWnPeX2eBBRUdG6rdJJq0imRcI9ec +S+tkT2wt6es1TU4R1QB0lz6Ly57RltKt/Dy2P6JonChzRaK145RiogeP/QI4jxBy +kOnBVe+9/sJRSeGaJBiydYG8z1pGkVTYJyFOCtVThURu2zaZOMrqDLQMcyilS8/2 +RWnD59LMKVUdm/0+PhER9625JbGG2+uuMXlJeH5QGklbMISVUJgK7X3d2P6yVHzt +beRTpXEUjLGZmtE1HXwpqIavxkHRb+06M+tR6e5F7vYTBKh6nq6OsqxUKP1MgPNs +l/R4ah3Da4+JAOm4WYis5ICOwQ+Cf04E2JHEHydEyMXamVvU6+uUGsXNuh8R8QS+ +H/yM8AKZEH9FnilssQEJkcyYApvuaC9At/x64A3Qzb9TmutvyZoZ6n7iayrfRGna +XTJg5gKu3Iteq48tSNDWZ52onKiZokFwlxUAv3CbsxNAKAUeXZex8H1ZDA2KtxJZ +gY2Tlr7aDBk10YCXB1ad38E8AIzvQbVGpEBPjHPqmzsBVCuw268AOOkq2e/wVKpq +c82Mn3BWtFSXcQHlgWGscyXysF1WjMP7DjL6CcX+27R1nboz3Z10uH17xk1hWIjD +wQdwNtjjQkXwslIhxDCL8yh5KS61G7GfGgS7fWO8rUnUbI1z5pqSPzwyi2u+jmTU +6q0MSSGJym+7bCe243Y36ytMOV1U+Z9VcmSPqBOsiRkqnLdjRH7slE95ppFzuevd +mQCO3Lw2CT7vRYnPk4dO8zVEhndCanTCEm77HpNXXUEOWM7ECgZndIWAIwAABMD7 +45Xe4kotuwvZFObUHYZzbzL+0F/LDuQODGjulAJpGDvryzYazDh8gjwoZiwUGdr5 +XyRaQI0CwZKFG7EIad4BgyrCjL53UCkTtRZzN75ZlVvVOLrmiMbZjcCXb9IalVrE +wJlWHVWFCe6ie/nLiHIWPSd8lmUQGDUrXZD8oh/2d6SbtfCHPsgsAmX3dVvIJMi6 +DN+wtgXHyRIGF3vLC1WIL6AyOqfcocVZjzUmc11cNJ2Fr4yTmPz6g1biGHSUjeSy +wi9HCRyDs2HEz9OMEjoFMVpWWbWcLpYktJqqWGt8fc1EHZ+EI675rLB0icV0M8cg +QaiQTlZKUMOFY8kIZCp1oLZnB5fIGFwDBnkFHUh1Hqnno3zTrONUFBkmpIcid4AU +MJ4CpcPwcrS8XKITWmhKmTNEJJS2rlwSt9FQDFFFfIxMP6aFwTiHEgl2ARlZOVwz +NhzAYoCBkFWZuXmybo+6nhEGriWhDiMHiu+nOVrxBAVVfX63cAR8xeqRMqEBVOei +I7yAmyiRyGVwY6MjRSgwIebaMrplbBVWZeRqKBYZGmaQup4IOpZotp9bLnXGcZCg +M1sLSHIAkNwJc/IBUYLjX3VGRcXxGh7loL/Lq46nUHfbu+4idMuYgkY1VNHTmvh1 +O1dxZahDIoAzXjMVOQArlTU2B6tYZ5pxURHMS05zj5IiuC/QoTOpIZs4KbsTTLBx +OkqGN8wqGiRjlo8pC0VDegRwkmBBTomxklTkgCDGYHdKYB1Qo1JpY6Q3wWkRrDZQ +xO4QkX0msOAXzdOaxFCLtpl6hkm7j7sMyLUJJMh3UMayAZWVWIsgwI0cW8u5mECW +XivKdDTpHM+5OlAmB9m3g+MbrSlLIUjcJA9CL2sYebQ5DjOybUxys1FBTaPZOwHk +yz0sD4L7WLjCfRZxc1yCCjHhduJGX5v6ktHQjb+5TIwjMoVaA6gmCDymFa3YPeqw +usHkr5rLts0wdlQGOgnzSfVqvApcWzmUlzcAQhrqIm7sUwtZFWThFPZwfX0qyvfI +W6O8xxt2WzGmi4ocJsSUyYp4JYAnHNacqhU6zbwFLA1yxbeYBtULuVVGff/3FTxE +SZ42aGKrOoCFibTounqjsDG2ekyxxo3UUrVzvH9kRJxsxoioiqKhaYkzZxeRRpjE +gXG6YQiYp4h7CM01OhkwFMrBstmZFUGYcFJotXhDC8DBlmqKKDuopaBsRae7PT8K +cnGUSrlpFdBEjy33jUO2yLXGjDYLLpqniyn0PeHAOkYLrVMKTXRqzCTTvRClUNsB +gX6EZXMbfZOgzY61vbOCLeUbLBA8Dld2p5CEVfFZuW5VDcjrgzRrHtCGDoDxQ0Ug +exZRPSJYKH35TKM1t1GQIQQzdhBQLxY6n71WZBjgHqAzM59BGRvTQx9iuUQKxMdk +iOixtPznlFEgZVN0SYPszebINoGZTWPJznVTvQ/5Cbo5q56bGKZnsSFbVRC6dbcM +e/6rwlNZECp8YjuaKWxMCHRWXvT0QNmbCSQLQkVAzfOlX+mmOu5rkauCHPmDlxAx +sjTsS/nFyHEnlirEfNGiPrJCeFFEujxmmLsHQ/3nsnSZ6w5jDcqZL2mCXSEL8Ujp +gGfuaPS1PnUCjayyKVgYwv8AAEMLBhghDAAAACwFgmd0hYACmwwioQbVTgMHAhFp +97iL6yt246rQ4RS+Go+YLXTbqcpR0DU39AAAAABRmRAgBFbtMNRvhei0t54JwzEq +CBw0GG10uXHRjRawQRQ2KybdQEL4m/f8y/IHW/XE+mHDV6/NEQ4Bu8NEwyenjht3 +2IsXHG5DUx96xUGdU2ihmgLEGfKZNfLvirU6t1pIC0Pj9TofA9M4yikfqG7U1nRl +o715mOJQ9szMl1gvJOxCX9hVWyqMMq6SBy1ZI+zwCxgFLospnuq2AjaWM08ysqMb +tmlxaKraV7kCPHgIBOres7LJYD72BpaeSK5wfCwliCf11ZmIYAL+tV4PIkVzSP0w +OBqBjErscvBjkuIAiNInV5yBDAhggNl/srqWPBAnFv17JRBTmGQGSbMrEzlGFE05 +/ia6cNBROfbafaZ/XnI9WDjFNjTVxMOWgsY9ygZUtPiceQDaIhgVk8q486axSLmU +Y6vgUwN1a4T6ZCDIdMi6gKFvgcq0jS0b8XTZZ6SdrZywhi0AL/MYOUjxr24IOfHK +hDSr8cmcaLUKYhTk1PvCJfhzRMrOugMZl4u7srtFBqvWM7KWAVIDqZzPsIXNwlpu +fpfTku9Xh1bFd0PJCp+N0ZGQjTSYzWHpuLeWQD8MN9WjkUEAKxbEtGzQSpkaxZ8D +C+vLcZoeD8a8r5Gk3GtBT74J0wEreAbrMIBBIEU0KSbPhVn3iX16GUDwpr8gR2MC +bMAx5lxWTUIbo69znw2+tUy3SADMGsm9DIZdQg3azltA2XFWv8Gl/Q3wZxZjdKf4 +Vul98b5D1EFbhmezIcP5Z1xUQqaPWqXGVJYSj2GljCOSj/SrcqcetRJKCT7f7CCC +5J46Ww80OFlkP8RoBnIYyS+98uaTZp+w9j3N2Lf6NFFnvFUBSjf2829EnNzE4xPr +so2i8vkqJ3H72zzsWGM16h54NWzqD0BgfXBastdpgZ3Pon6hjmGbKB46kxO63Wzo +/TfmeFzZgzD26BfmPF+THE++Yn2cpBORmRApuF4+x/i2CnHg5zcZ6VG1qj20gGd2 +vIAwAxxYnRnN+61ElG50NNM4A0MjuP7tkI7QTMLvMIu6l4804UYqsbec+NXm6Kc9 +7AtW4SOnGd/V0HuUvRBb8EgD1+KuxyVEWsI1VUO1avKZk44CB+wGoxGrtDqLxVhp +LIq+1gm7rSoS2O4mJngnKhUD2bCfCkZGRIoZta701NfwRYf3veiU7CKChz3pwBg/ +0bswv/7uzEqNr+zWdKRVBhlQ1OsYwSKWaKbKtKihxmDd1mk7/2eFv0p8Yr9A3AXu +pPAuWPm914hz4M2mfp7fnDQekxOQIOYwgaLk/jOP2b7wW+VzQoRvBfrbsC7uWap1 +64jhzwMoCWwY9QfEomcn8EeAb/DB6wcOPpQspfZDEDZEojrYcQPoOJMyiGbe7kDs +aefWRVUuRWbd49XnsG6zEJTsAYkDAh4feO+y4/xch1e5gnC0H63KNgfcKvGW4SU6 +aR4+FvWqjZ/r4x65gspqCEGHBQPx95g48kFwHEzpWEfs5TI5HVvxllRS/5IoL1qK +7EqAwwPyJ0ED4thcIp+cnuL77dITj0yz8xwncW8yPiKYyIug9Gqsz8LF3VTUBAYK +BVAzr9z/LpdaR01FR8S3QN7Bwi1SzjKNwHWXItiuHhzC6tWzlr6MBLAAun7EiDV1 +aSrjUx7FyPZ91Jjh1lRqkvPtJBg416DFLGCA76wCh1qNjFq2BcTDxwJfe68gYV+m +QBvoWHv9eOL4D1qV1WNqdes0X1PpwHQuzpFoO90ywhht3fKT1loqz/HirxMhz/pz +XxysMbOdqQEaC+XjK2YA4cJlckN8i2pRcei3N5/Dl6YCf5cJ6LC1oBT032RkU4g1 +CaX0DpMMb+fkjbgQ7w/t22JpVybpp+xT2U/HGPJR26pcyYY1xX6tT7kgf0vXAu4A +8reLE9nWUMlgjckPIFC66zU9ydV0TiTDpDHub5n/Uv7ImCUWZb80pFSr76WvmcGF +t0G+x+A0VmWIpRhdeVyagDnB5bob2hfmAB5fXlmAuhtSEG7SHw3+4e12dkUDV6Ck +jW1bfUUkE+qEMOWF4jibNDzygXK7+cKOpjuZK9ZY0WM/+oS7GXONvIKj6kkENDxU +fdGpoDerT+YfDC5fFQT/l3/pKPqF3okYd+cwLJXhMSKfokWZoXd7UBpSBIl9/9nX +fLPRn3IS3TxdFi6jJFmnr+lGWPS31nqs/c6G54rc8eZ0KDH6/xprHyllazMSSzZN +N2eAJdSycZr35ADNJthc4nH2ZCVxpb6wAf4CprG9usyF+a2H6hIPTtNlBt6aNDBi +GRddr4F83EpKCwbw20KAeG8FECU6zFTNDO87skW7/S9UpBfcGPhj6t97TEWS8KkR +YSLLdjb7Umbqq7axNCtQTTcTaPXwym1XJHf79ZlHpiSnDwMr4LWR2cG2RzR29mCW +cw3euHUmwXzXxDqXRcHUJ3sjVJv8tgbE7eHU1fySAlK/TuF61r814IsqxE0hcFxT +PRIAI8hTbni8nzgDUiQTM8abW9u/3JMKiyWB9VZ7oRUUJAkqGroxahmidHZ5429e +s+TW4Tui44o38xIctdXTzsz7jOQdGbGYQ8ec6DR5pjQgaor5xVWwB+AgylEljx8t +B0fDKTt1ygMl6pQB7IDX5YNNHXxgLfN60YDuifBVOAheZMghEIJfj7B0/+gAKs2V +iJ3EpiGkpzlY6sOeyScIUPOF4A80wBwXCuCQSxMAEIjBJ+/NO6y6RpS+W2A06573 +HeIgdm+clwNTDca7HJlL0MC3bPcA88z0J4IF0GM8ZQPFDkPNVUEFquogWwyLQPLo +84Q/0oZtDaEMdLDXa94fxe6HvVID9qTYUT3ANinmDriFmIi0NoEAZ1ZhMMDaUf1w +2WftLJOV96b6c3ukn9OhNjLwP+RT1yQ9evtxBfod7YZebR2IvkMmj67ja+BMOhI2 +v4aLxA98J/kdPOnUrszQsE7YcdbA+Ddi2jdOni3iOOKB8Cqswtq8vYYysJvXl0ZD +u1Q4OEWIQiZef4S8RjIhMF0LDoT7ieee/JJh+R1FRgq2qmyMfKB1ZAffFbhJqo3P +Zam4mvwL5LqtyC6CJVWZG6VJSBNey2hkpVFKHwxwkwb9tUvy96P+mE+BG12f+0T8 +1pzfuWtM39v0mdZ3WvT5yJAylK1Nh41NAKxU4rJ+EwZ/v65ks/8Pv740HwquDrfD +RJ6j+pNb4rHFDkh5qrhxV2BUQlMLzif0bXLZ5CwwyLjZDHb6MAFD50dYWI9mwJN1 +ahRekTaOgUDYiUVJ/41dhGVIUPnpaDzarJw7LdMLXL3BycYnPk0mxmutTwF15nSX +svXRlsKnGREOgEo/fOQhf+68D2B8LnJIdIxpB78ESvkp8iq1wJRDM/W5rtjlSWJL +q3m82/KkpRTpQmjn7jvM44zc9Igz7X8dq72VijKMypVzwf6oIoH83K3LWyXk4CuA +0vsk5gCmcUnNCzv671SiADHRiePyDRnIE8J5/ngkTm8V+4oHQ4tRMGNbNf4ROzpH +PL81sEdEqHuJXBfSEIui4gkXMYN5sVMNnVyILhN30Y80bmFguyXjU+3l5E7HvxMV +M4rZTdiFMptPocaeptdcPIN+nbjX4uwtl+hBF7cmqZfqN8a6tdNG2woHrUnD1N4D +DBbJtRHnORXuoTxReT8uRHiXNr6/bMW0qoDsGWNAan78JIRkIBE15LMUjtDfDjIK +XU9+pomV0TnN1TBiFpAV+xfLvDLfPc0kUVsNzORUDRHSUltS/u9SboAq9ykasbFb +oelfbFBcA8QNvuKBMRY8jktBZy9C9wIip2A8iXhzfieYT4fQYhIJdFtf04kzsLY/ +8LrR3ho0SSepDYVRJEcwH7Wvmiu/nsjBRsvP96p9cvRby/hkNbhBI5Co4s08rUvD +P8t5Xz+ZgQy+22MCVFWoczPzbJxWf/7ZvN7e9vbTbXP3pHT8Oz6P72Lt2Pem27fd +LxZJRJIuoJ0MAUD2n6raAO4rXY+sM8bugwbSrdQ4oe74forU2XeUbCT2TRccqlTc +6cq8yEZA3frZnTcHuYEnvEH0oYmTTiAeF0537tW4E/W8NdUYoDi2uWxwnf06gvl1 +uuMlLuDANh1N0aSFbwW3CZjlYYtAvV+TjpK7uxAIobgRdVqcj3gmknrl1lQlTVgf +d7jo47g3UB0iN++0F0HXiOP8IMB75yQf7Pb193PrZwoNS7b6uyGa/Inpxb3Qjj/d +WiUpmkiqgSjwvEAdKmkAJFaaSMj6EY50/m0PsfC0PbbYWih8T2sxti0+u0gm+JaG +tlhfM+j91HpFNOjvZs2hVs+cp5tTPcks/Bdb8rx8CGKFG1SlNqoh2lS+VHIqdVZ9 +nM7/3092NmZZl/4h2usktY1YKzQVb+uN9KhjGuvmrfkLZwg/iCRapfzntptdnCUa +4EvpT5NqPOgZLcOOWxf/TmI+G+iAlFtKlpSaGDJChZT59kfzyZ8h39VDdFOodHAo +b4ol4Dw9LPpfWjwj84sfwCVsyIqqKXRogMXiS87lrQ7psuC/MWd2ri1wYNUC0tcw +V5NPHIenWxXEkTKcQTAdkHmaSEYVSu2NYLz74YyVAowYn7nmLcNGSWtMuczV6nUy +GNBm2GewXz2SMyrzmVVkWrKZy5uwU44QfwnYOKrkayYl8oKTx0L2JclPPmFbCNpV +OTIGVKlShEueF8D6NdKehQNUAoxorDAN4wD+Pbz7aiRwcN7ViB9g48ie6f96xZjB +O1TBZEAA9KMZlX73j+OFKZFlZPar3/vz4K+V5GiuKv8eKI+t9YAq1LprJbNriyNn +VSUACNobdTC+JAPfwB/3mNyIXl09lveYLHZoUPsYTMtVq42t+KCC62R/tqcUdr6H +sINxqUmgVgd3LzRDI9wZOMYTh7UOpReh0TW0X7Am5R1t129V+NcptdsRv3CNN5df +CGoL3A69XYRvJuQlb0KTg98kbKECL2kQx2nfDAMcYaqBI6y7J5thby0F30puxzxn +M0hk+nndsUJoCf3NFh5Wb04c+DKdliWh99vlmHY48HCMTVhAuKhgYtAmobmS9FpW +d3ylr8a+ixreqwea2y4jG1XUanT+jBw6sthdtZvMol/X1E5qrmYCkwhG3PbedeX2 +qZY0SyvUbpBpUqLXtYzyFX4B86nbUlgKYSFqy5CWm0NI558KeeDHP69IHqNqp9Ky +/pniiVVXJqtNhN9QF/mnl3cJ3Ch+094dYu/9br6RpEdzQkKfQt8aL9lWvS53n8mW +5J7y83P6+58iQPmt/VH8+2MsxAIKtsm7yU9iy8GHCPce0iYyM6JULosh5CpKxx6f +axp4nAmxkpAMymsaakW/iIqXlcBm5FDih5U26Rw1IbP6eYLF4QMBg27GgGbZZHht +MszsjZDPN1oIM2fCbNf3RfNblbEPy9pUzOrRFA+DcMqNCOF3vB7AgHZDinaMLeyB +bFeC2+2JUn98xe7qZzeYhM3xIFDMODEVU3UEyxXaPeAgegmUfVLaMT4nCotZoixZ +zBaX1GSssH40Uj9nqPxgHJ9ZD4wDl0/gQBmmds8GuNlyUfvMB9EXcSRlPwXRAQ70 +kVROkYPXGoGqCOx90RAQKFBApXOb5NVTRPbEEMD7hZ/pks8E7ulfedshO+nBTD3A +cPgYF3Vl1Wj7f087x7/IE3V0PTbSlmkoqsxwwufHDfaM7GQ+iiD0zKGYeBqWYmdt +k/huzMV5w2jz6aYTC+kYiDxClToDige13DQBRuZHPbxuXoHqaqpJwDIarKmd/fc+ +Rqo3LFxdT6SNnauO8kn1RWdf0xEcJ5wot/86fPzt3Ai28Cuxiyx6bn+dytM0OpUt +VSDeYKICBozWgDvt1+qmlEl0/q421CLiAJH3WEjZJsOvqPFQpyu9ASqF2xC/eLRf +EMVWFpXzWY5Z+A/tkQTPviRkc0YUXt72rLuBD/Bn3H4xL+yAzg2ghKUzTRhXoCJW ++14YSnBFf7cniFRvq45QH9UuDM7GyFwheoJrn9sGrMqnUrq8JjxBui0YIoJOo3/A +iCjS8ms1jih455MwnGS+fH/pgh6e3dmr3aSAUdRUbqRv+mbRcMUxBeb7zaaWyYpM +ZmW6AyCarGBqerzSlwyouQ7rpJjjtGQyHKLQWzxChNVmbSa/aT9zviNFfaH9hK4L +01z5wiefF+c6LrDWkgzCbeyUVLpzYk2/jYKyEiRldNP4NYEbNFQGM+BeZs2QMPzF +9Sw8YCsqOwe963wFPnitKFfk/zoK2hNSSA1f0SVFZsy9NI25a5/IimGI56/ZG30C ++ZNaRmKY6A43wIkLMTeRVknsPoMhkoVh+SqmSbUQhnN7wHvoOZNsg1tlO2heli6/ +b43ggd6OJD3zCwTizKc3yXLfwPa4G0x2v97l0sEpprscXpG2EXETuHe+APV44yfF +Yjff0PCUYdaDgfV2AR4zE873Vc9QAS/IMDeUiKrEWDyFnQLTdkbSQSmhACmPNTkX +2Hna6gQcWWkluC+jZGA+NoTZlZGpg3P7jfZHydPTGpN1xQCGzo5Z/5qV0jnF8InQ +4pfIcE15KI5o1bTOkY6pi+8SZIJV/Ptm5cKx7fpUDecYzJ9pNLcuBEdIoZOHFZby +YoOBd8TSY56DTl540j5lW8yCiqfCLzAExp0xUfPwUBjeJtXwEWJueT6uV3tNN280 +dp7kTF8y/DbHqD9/F3Xn2uzFVTj6nLY3hU+ACADV7sVQx8h8x1V/5ac6u57pk2Ln +64mG652Vh5btDFaFYPyre/NmE9FCtOM5WCwWaPQrl+/v3+6QFis3EG34eF0iruEd +EJpdsZUcBT8LaJIC4uXHougtXj5m1HySARVpcnIMt+IJ3i6gNSj/qGTafYAE7KD0 +1XjG4y2SKkm+ui8rFsU1k+qLS/NDoD+BLuxJqWL8YFnJVDe9XJYOrNLeNwe0Dkq0 +5S943DKksObF8x7+pIUHiDFMHmiTNJbnaB5Z9LAvf73Uv7oKxrKRg0YWCI/FYWKp +EomPwlg0vCKMlwQ9lMKgpHGSrCH1YZoG2ty8cdA2/CwlgkmtILTYDsco9ddOSc0J +O5kMrU26I0mOGlCBrbgM8yYTHk55Zxk3yo3iLs/8fP9DuiMjp6w1BH0dMjXvPeGP +R1+0sKpiVM2n5WdkV08MukG5acRzHjDGunRwfURWa7iE3im3bvkmZlZwpwFe+ZZm +8gN5k9bEWpXhu4AlyZhpXWITmR7fDEfY26R9a6eTx7QygWZAJhAkzmDU45xaZ/E8 +5u1m9vr5tUDaT7+rApLB+ymjH7gdFsVcxAx/nwYQ3GS3ch60NygcmodpX+ZjxC0n +XfJAeHCMCPyNczz73v5x4rfiwxFGyYccXVzsVNGe5aLJ99gtfizwkMmTKNHv3E71 +sz6YhAjmL+HGKGuGi5SFgk/wLyBSnXt512uqLDIaz7+V4nnROU/nnOJT8icBGvu+ +18no/TU+s+DOMZcdqmyUJSCh1eXUggBPEdhrsBcMYNWTqNG5secBqBtD4M2YzXWy +y9Hdve3BFU/dIWe5I8NOWXz8M6ZTh8YA6Cjnkf9DScsQDx8eppP+sDy9APOlJ0U9 +WHCDGg/C6VCSrKl9vXIVGYUWKz7QYGaKbLVOKSZI1c1v7djWwkfAOhMBvekxmRzE +c59WImyfP0xBTHspRekFbFfpjpnWIWyXjljt1BwJYBTbKXPPaBjS/uUANpvhnR+p +2l3WMF1oumI2URIJk/0BSOkUoZCUl+eeVnU1N6wNU+Etr+R8jjcqSUBEeXgvOx6M +tUwEYvq3bZkWC/j8pqE/VSTtkMWyQc9Obfv4P5CLXfii75pHj5uZHeX+8dPNiIpB +UzsB94QsCYo+9Vh550lr4NwLrtojhJ60ORSbK4HjJ5rcDq01UmMx7Q2Ux+zxkJGi +CTUi0YPe4pBouSec90JC7MLHhI/NiGguooicheiYwFXWvu/x669s4Nq77/zjyVob +jsllCDJFZldLON7sULM+CazHMbc9Pojc3LwfigYH9pO4cJ7akL3HXDrNyBLH8gLs ++HX+LtVZJyBzekCu/HOt5G7g3W8RdIsfnRfk9j0nri/Q6z6kNJQ7TNzR5EwEVBFf +YXMNTHpVmzFQ21FPcVhSw/uhPnxUSrqT/xkcQPhwfErJJNI2ufCqQgMAYK1Ee1t8 +AQSvoZLvBam/I/gHU8jzmhUDs00ozZ5f64PKaPdbAy1Vpna252ehqorSojJyBLNa +v75/vr6ksYcnPYGwDlr2g0iGWgzd6CdQp2xSe8MIMTd1qz15+3iihCL0MAAf48/l +HglPR8N1IgINTO1mBzzVODDHzmNBuIXunDgOqCh8WE0SGVNQJoKB/WGnTRDpuMXm +Ye9Z3wnc+fG8dgKlJtKMrJ+yGBmVnx1VeeovGRd8JC9wHgPOVwnRvgK/QWwgQoYR +Sl+DZlLfPz6cojZ/LJXgL1ZIhEDyKDQ9bOTP1PVXHNzVPIHRYtpFIBKCakBAtSiD +Nx7z+348y/mXrb0xQTEV38+GVa1sfcLctByJExhtUPr57moyAjHxaV2y+TooZyWl +9l6OzKQ/c0EuFH6x14ur6W8YGZpoVTMTY/m9uZCQdSkXVFVMvRvHpplwN9JPXfmP +QVxEKIkfQN+keozDcfZMZJio3XrD/wvu83zLSlTTKTcMMIjr9yCjmdi1EABI2BKx +4Grbb26DBOgqQ02NRm+tRcJQQc2kzSW6RZAclkD8zidWQG8WcJqCG5KCJeYaKmp6 +bh4qflQOiMyD1sne7N4pJg4uwOofPxlJuHlKeRd1OoMnT/gxggpop9SdG2s7YIPv +d0LPDa/parusadiy0YHiBu22xZ+hHdP45H9rj6MVyiW4od0TPmOYp5BO3egdA5SC +lKTSbZqclvA4MqW9pFB45Wn98zo5u6xPj3XgQOPKcqdmoamLTx7Wu8S59MWq+5Mk +/2Af90uuFUVsQCb0khw0tpU9Q05X2ohJkV4z2scYN6JY0TPwJtdi1Y7BXkn8Q73J +N/5sc6QVNDWexTfqotdsVtMn9RDLd7FFVpfe4yqtC6wg/+IvU2gokL0RSgbtxdfT +UN/DgMvw7LSxCujYNZjpUXO7KwYDVihdAkgKzGPXegsHP78mpALB0jGFW8plf6Hf +5hDXWpIH3vXJHd3KSzqDlrTYvePvtZLa+jLrV8twlxFZ8gov7Jljdcee/Vmp183k +wHlZjWr3rinIHjDLXZjCcfHcKVyA6dNG7a6kvuaqyKruzIn/+0Bji6WBy8i9wY6R +LCDZzTGv8bx6AQb4e4YImNT72+GClOaDjGoVj78kofmMZO5aWYkDHPm/dXNQhjLW +vpUC7M5+mHSA+4W9lWlzfxCamx34Z6OqlPnlDLow4ule8wpMpGHUHqHRyNpKn9bu +0hVBbLo7kuxF0n71KHMADe7H6o1qjO7rTLh5zhUadsziYKpJz7ZYdjVXKBt+QnRF +NCXuUrBT1E9EJb4L5xBBAQmdQNKPUXFEDuD3t0MfbQ3try7/5VA9AlpXI/VV7UCV +NuQlXfeitFXwSwgPcFSk5dvKDytQx93SorATF/n24ZqDArzQZCn+Cw6UvJWI+K4a +w9n5zTTbM+y2HjtEND//0Gh/2AwCWf9KLgayit0K2BWuPkTs85UqwYetJuxw2IEv +8nKZmqZ387+fHz3n8JCKiKT0Kx8IPv1mtffICoiPOZADw8L2x7zVl50YocHUtKJZ +cGzNh7K2hMR1MEnwqv2apQUTT3o7RHousI5uR+nmyECcpql299PpEz4Wri7d4CfE +kewjBSNEsXnUzuJAFVCaeoTC4GNDTnNldIw2Xax1gh3t4SsBKEChWs2kfhCqV/q5 +8yxu29q1vMm37SMV//HCV1O2/uSi+MIOTm7z61aGeDRR2/wvPzbUELI+32tDMaD8 +7l7SzAJbq4JhfKWOtRk/rsoVW7UzciBE5REgs7uSPLcEH7vP/kiOTWE0U7eU7oBX +ySzI73R5LzxZTPGMFFyca5YTcjgEX1V+pfjO1j4AgRMBfnOmeHZ5+9B6b156Jkqo +B4UyqWek2jJ0+V4xLduDdEYBJ2IpQlKpWrYTxX40t0BNqJqFFDTQo1sawqxV9fEy +/gFQm5I6vGDwkRZ1gosrZXMPfspSCeIbYQkYdldc91M6ZUGxaRBvS6SB2BFyezB8 +z4tkmSMS5wdzKg5sv02JUvzCIlQDpUbpTJdxWrmnWWitINYsa8mrVS5xdBX1jOEU +RewH6+2C4cxV7r3xGsEj2Fc0y5KArg4Gh8RSxqENmgor2scRhJDn7oXlI+EZL7lS +5SQLcy7JvmBvJf61bYH/u7DTPD3bN/AH8bf02aHK4UXCWCvnK/ie9ZyavhDQPvmQ +j8YC2di6eg0Frdn7+2r24RVg18xk6gG6nIOYn5kqZc3mJJzezqwfc2slk6MDFQcV +rz+KSyanG28FKX+oWzdMnTrY+IGSa1bkHCJGu/EIsOz1JFgMqEKT+04KyJ0+KcV3 +hZ1Yg/Uyi4GJWJ4C+kH15A4SOQKuM9Nt43b9rRcPRjG6v++6b1pgBkAZa/KYitxg +CSgwZlQjfss2+hx8S0di1EnKvRr20VLoq9Nr0KH6YVmjtrS/WP/uU5zwratFikMF +fu+UoC+gHRtv+iV94znmaz61PAGf/y2GzjWT+4d7PBTboI/SossprB9Whm5y9Emo +qBbdCD1OiWqN9NnaJIaE6cCOZQFvSVntZRy15J6O1G+66KIi5/EcnLymiA8oOQa7 +/NjqzbZlnbAPpXW2VF65YVgA1bQqMxR4EqpTUXOAc7dE/K71cQL4NVt8JnMNWeOF +5twf8N+n1v0YXiHUpY9sVcJa4qeluYE/MKQ9/25ioFFN0+KEzGTwqUrPbc6qORE9 +QCBKXF7BqsH67eIOOMqpNDKRshUEKOxGjUiNsvTafZJG5PUss94UXxhq7sEE2emX +4l2LyNK27XwALOMCEp+D1/tAbVJOGNcu6KCVLxzOgu38yCs0MxD3cDE15u4/UkbT +DBtVGkcExVyyHHvY7OMjVs3PjAdY8sGb2QWpSMkRmThY68NFx1+IO4DAGpJyL6BN +UmdYyBrcPnOiaX1F9tYMlxAh9rTdovWwktRCOGF+oFpPBNCo6yDBHrwdS+eI7pG6 +oY/NQZfXOC6G/cc5FzWBJjR2Cem3UQ5jWI+ATv2nbJjYXjFENFDaGO6cbxogFjt+ +lUIGFokXyaVL5UxaRix2vtjZ82RlLV8h8Gci08HAlGimMEcTxX2cLljUOwSBnOU2 +Ovv1GkXgvLVhjMxuiYJ+Ww0zAhUH/uQOM+S004E73maSpzn9qImxRAhfBoQUHbiE +wPOMk28RTmzez+KWRD6AqwWONePQ0Cc3Klo212CPFl+m/07Omx3GjYgPOyq/duNS +AaW1eHkwjnde/BpNe5d0lV7iKOmjauZqtN3Hbm0wo3M3l9dNUYj1EGvypJ0mgpy4 +L+yqPUuKvpNgjNlwz98Hv7/cu/v8XKWnfYwWfGBH/Pj96+6l+ZnDeLxv8vpYmCkc +A7y4TxR8hd5wqZntA9v0MNGnXCJugdP9Lh/QV5KjGl3eYwpahmQgNTSDkCAlePtS +3Gw2uAzOOTbdfNBrBajxeGPjA11tDLIm1ejNAIlh4RN0EVojc56yFd/1S3PoKPox +Kbh3nfFaWHKXDcromYcTgEyM7TBXPIvTLbUobu/3u7mtLxeeyeUEEPeWrmpX3RSL +9VJ6k6xBz3KWiocWO57i/OJzNbtlh20pp/OJcLRyjGNRZ5uTdSqw4Bca4s6ZOyBL +av5bDODjvXUArRStM3c4xlPpGU3Rr92n/y5xIQBO5Y5hso73+3IYDnwaNWygH+g1 +bjP9zqxTbAIf2X95opoDC703IQcDQoZtjw1Dk7MGUwn7gT9Bdn7RqNH+D4tRAFXc +wxOrCJE+nSoLPv85WJ6/pr2nyXsX1cau8oWdjCzwscfEZftduQbpWiu3QiPFBSX0 +T1+Z8Fc5Czztg+bpFPjJHwPkTyYw4AfEipxU22D6z9bW9hZPRTdkE7px1BDsdo9x +HkS+I5qxOuCo58EDGzDWRiovSIzZ3P2upIfbQKSf15r1P/OFb1i96ImnPAjo2oLw +E2PMgKrlEt3/F8K5x5h4Y8zMf2g/U7E0Ok3RnR3qcPPgNfZwMD/9OgQba/Qj/94B +T+P1UN1eD54p5a1u8lcHoF0/OHmx/Zi38YG1Dv6CtjiA03Ihs4PqkhgaRffk+WSz +8H5FAykAwAhdu+wXUervzxkh0dzHVlGnKyMDQZKk1DKnF36zKOm2gqugrtKaEjvK +XzXj3YUP1v5QXlPPSt1r2/wtvawLwyT0flbo7FZqxsPpDpc1hKSe6hnJn2Q0pLpI +dzo64YEgZiElAUQOvRGKIXW5Jff0VOQj/agrIJS5WHOEQOohQ9iTiiIzrZtBTb64 +Emzl0K2gybqQX8Ekd7T8ZLHT23YOqB9r+0f5LzJnJdNUxGqbGxHcq5emQT8s7Wi4 +YoRnnRUgnb66fhNMSmmt12UVdhv1UzrkIWI/v0Bb+QYxrLWTqonfQLvAPfDasji9 +jU+g6jZ9eMi0BSeKIoEGr43qIJ7Ql9kIZ9s792rRCVRwYSXLoYIvL1J0Lf5VqY1Y +J8cAGaCLEgQnFjPjwooPYfzrrhCQwCYtAw936AnhSVbPtAUiVhwUj7ElSrjAidOn +/Dw2IKjNY0b906ye1hCZkH8fraAerHkudu9MGQ0278/vCQVVKlBi4wbPUzMbGSyX +nFFJpy+lhCZEUhC7JHzgtadA9BdaOpEEpqUx4EXBDYPeb1vYnKgUW9w0hXJunVO/ +poxog+0rsuTRZ7nGtbcd6Qr4H79LIBvrWzEKNrXA0Se6ltooJa2/tLc1MVOaQn6k +GSTdeoP7Nk2dQyfQn2+MHSy6h6iOtyVrL9bE4KP5QWywN/gb5c4tFu7BcuKRbkBj +UHyPwTfYhC0gnPOs/o6seTkDsoT9n+v1UnStGGS4X9817lAkaTckrLrbsbj5eDST +dTdJy19Sv4k7tR/Kc94KR0O2k0M1B0OSS6CLLKxdY5VHAN+JHMZ3wqYVATSiZRH8 +eIt8udSoGA9K5eJ/hTkZj9L77DrxF4m5+Jt5BUQf0SPQAADnEUjURXsQDrHJLzmg +nyVJnEP8kCIBhg9aDZSbubpxrYIdRpxuigegZm2sljY4sXWRr0nQ3+CmXNBIw1BK +KPkd+MieLCGbKXJMrgFMz4GNYiUs9YsNFxd2ad9ceMV+RQNCcsrFdFspd0F2Ribk +9tBXTdnd//ZO6MMGox6XAQwrooiVG9vmaeVM8fuWkVTVGAeN/zfIoXHeTT3sWJ2z +Ma6fZSPvxuTa4O3yIZSKFBsmbdCyFdvzCEUBBzYuQIbnPgoRC+AS98q/Zab2xR0P +L5VKz3E75KWNmDvb3ePyTfrD2oiCM9KMr2lxHj73Ed45Jwb97f5jQyjnRbfsuQ4/ +xbN5vF0BKZhFnAXO4j75vrM7MY1t4e0wDZwEyARM6m/0yJdqRp3Ub3v20CI0rW7x +ojvIHgEPOEpcXYxiiClBPRVMF8m7uaxjwpMqQ5eNzs4muyCkybqeRuh3gTlVrDJt +3gY5DWrV2OaLLIvkHwJsEGVFo5zB4LSqLoEfMknuPObi9fjOCwxIkLcdc72esJpM +M+rZHJxOUh5EjZJn/BHfa2w7GUOZhG1iu9kcx6xyozpnnapUe4R+zOWzARM3IRmF +7lSiMSTRuxVt9OE+wZiBJ0IdErKSUPR/amzke1MZc15uRqF3e1RLe3yqEW1eJpot +7i5/Mh3zS11l6XGbc9E46/4pJfShJs+jJcnaxv/z+GDvyl5+3QOP/JhWnewxBqG6 +zi0D83csMrV9OZ/bDkCBErzkeaUltkbsz/DuyceKaH59V0s/qc1DPLgiv0Vh/Kcc +2clQuI7GXhw97mqiynfZmz5ydiEO2FIx4rJuoUX09RW0EBQAAxJDVobASY/K5/CB +JQfhLc6zpWVUgZM1yNRIBPxln2u/SOvCSDZBmO76dmlySqvhYMZ2sj1sGRlNdqL3 +lWEzkFrR9Tjeb7jP25n9gtSFP7YY4Jiwk2w/OdugAxzXCe7rImypxD7PVARLSL7M +aVGe+tRiGrencGU/Z5MdUpvybussWLsgdOdtkV4r+j+hUQgXORhVAhN7m8iOzWz7 +WEEbi3acn+zcSJxxNFpG83Hs4c5zrL/v7jWJwn5aZ1+R5REkToQ+I9GoD7ji+l6l +WepFc73UJrMiqBoQFPSRMxnT63L24j9Z7zWWkJIsY1EW9rAj+aPvfU0wRPm6rOrM +VlspS7sCJY42GBNgYW1AGOLwyE365pBDRUYzTetavEJviAVsyp07c+lM2u2BLe4s +MHWpNABWbiLN0VQa10y1Og+Muqh2mG2/2UeVRx8dIaghlcieMlJ4zTvfT/E0bIxE +Jqlxv8txflSQQqNb1OZyRz8Tpr9L/d6wTV9FbW6Mq7BskGr63fQZzxuhpuxItqHY +DvKV3U4QMBZ+XmVESVCfBR7A1BSNBuMSwkNZ33fv/E5Cs1vLe/UWOJCUYa/0ZSR8 +5gKL38IdFZyLmu6w0D1q4Ao5sw6d7E41I8xMFupCkoJc6ermihvs9ovUbBtzUo3u +WU28Lg64I66h4C0WvCGJefrO+x1++YtUEeUUob0oHtzMkeTbEqESvAqctHk2v639 +tKfkNBaEQ5wVFZUN+M/0wSj871nXKbwoz3k/RynVIKAG5ZKnhRUR1/WbuBI+cdH+ +GgBGWeBaWJvrroVnv9iSav8uXFd/IUizk03ECUO7GPijy3lcWPeuWjd9vQXS0Aqr +L69v7MCLHtC2EoMlEpjTibnYRxjFCl9VXbmop+3fNWl4KiGsaeX+tYnE38vD930J +x8MAjojdhIEvcpzQ/JR8kbwwmBYZtgtrPjg9HYrOcTmqhvdbwARh78hScCWzJBsn +bU99/SnAOTzMyVghene09d/CRzE+qoKVHElWJ5co57HlEBxTD/X1EbU27sEiBVFQ +zW1d/UYyVX+Y7kSdz6plHFeO4sC+2/o+k8X0+Phj7hcJk21exC3RHgPUBubCeSzU +r5lYoOmYoSqmEQn1ZgqY4YSHToyNmVBwE1GQpbe/nsTE70BL8iPduT3ybzcfvmM6 +gCmA4NqoRhmGkxX9+IX2HQiq9Vd0lqv4o5PINqlzzpwciGPbyOc8K18eMYyTTr76 +gc9Of67ebZwRKDhUuY1N/Gos4iRdxFBk4bzYvPmaSBwA5MBuJPBEyIG/ZjarjTk1 +Ppah7IC1GCUVsy4EXea2Ows5rsOmBfVOq3BnZOqF+W5yZCNLfiLpiMwFZFvtW93T +mr7d4/vTsTAh2eqOaHZ9wkglVXxePiDQLDkkgIYkMhKyvH3uvWdv5L1AENbO/I7o +H7twLcEKxtzcCOU/ZDlVmNPI6vx2f8pc8m5Wshld5eL8bX3EDuuIhELO6Z1G2Cvr +ntSlYu6DCCyT8+N9iWdgTiEfpKcH0wI3k5crh2wXUf2r/R5CjJZvEWm0b5DySzC2 +cBfrx3uFSb2a336nq5SJiH2xOk791I9zHjmlUEPmmTfMWwReZsoE/L88rmNcePKN +iyrLI0Z8ZIkw0kudMbKqCOedM47hSiNY4ERGJrnCEQV74gSo2PXiZ9fKg9FSAvz8 +U9BQtH/fyPxVRXJR8CrrEYthcY77y4/lDbF+QwN047HhSPQH0myAYJsNwH3CpJts +IRT2ttccY+oyPah7A0BrY6CYYWd/TZ9ZWJII07exztzhPO7Gtfs1ss0n5sxYIiwk +SNI/V5Y51hYdh8JaV+r3yWThJOJw5errpCFwVuOghEif/8TaCPfiONXtB3mBgeVW +os/XUKwL7UaX8Ua/NObLP0ZYEjV8cYDHNUcZL6zGp7S8wQFbhprxu1PPNHEilKYj +yQcwEjG7JAsR8EUud6hpojTHPQqH+d51WVCT9nZ/M5h0Y11o51Yp89FZ4Z1owZqM +vYbqFCA+B2b1ljQARDdL5Vnvt/nVE+to8AT4bsYuH6w5PXXdg9am78S9MFJFmzi6 +strCiqy0uTNBBZJSuI6w9tFnB2p4hZwZBMRfMCO+DPobJI9qujeHVAVa78G5rEOd +OVie9ravVQJ+NwsQW2g4QAmqL0YUaleJLUKZ8f3w39LihznGwXL5HiZGvnICGwgk +7/KxuTGyAaWzLejn8BG/i7v3Pd1Hop3ySKukPKUdpExnYTOOVLhzqUSD25rYp8Rn +ih5Qhg1l3y3CptaUlTUdHT+7j1P0ApVOoGH1FUON+/IrL/BpeHs69LubaIoa4sff +UNvNPFDVR7lJFg7GjKEiQsoinwZrUpY5DMM4CEf7pyoV7NIDtYOZ3cZ1+bGxVeUb +GIh2qpw0fTdYUr9lOuHtdzvnM/6rDeQ286vCtMf3uvd/xNgxsfvmGhagBh1GQcNm +aMS5yJHAN7kPu2oqx3fSaMJnJ+fuaetKn183Fl40otPMwFfN2Z+pJh6R1/2wOMV3 +VqjPnYM0LcloEe7HjlPPFgxjI6tHntJLmkmsb4GCnqtjwi94tdFFzeMGhHvJjTmU +KYI27kcfXJVmiQk8LtaxS3CXO4dxIA90TrQcoXM0EOfUHh1SdWUGIDky4gjDbSN7 +j1PblW/ISkiw9CetTFsQDnkB8gcQPTjbhIJ6X1mDvOw7qGfMi2METabMZFHI2smf +muzui9sQ/hZhvOfUs+vF+v5V4nzBKC9b9JNP3Fz354CMLU+Fz7IcXa/4mqlGVrqu +95gqRF/TjSo3zsd26UPhttmv6hiFtmHtkXY+4rcwcmDfnMhBqGaAh8d4sAtbn/12 +FvuWVCR6w+rOfLZi4hnqiTKVRSZuglyyQ7gz4WwwrbG9HtMM3szmRyU47IqxX0Mi +FAhK3e8MIskJC3OEg+fU2k7GJTWQjixQ+qEfg8jrpHKZIRfsGPJlJjCqW1Sp72UP +kJne6/OYa4YYqNCRoA1HNHy4GzGQRHG7X5G0RH9U73y8nGJHTe56r4nyAaLUmKB5 +px6RLp+b072DHpama8d2mAuPg+vK7cuPipVE86FqyaeHwo587cAFBNWiOmcePVZy +qBi/bnaHBQPQ/vGQRTVIHATH7nymA3pceXUItuyTTjueR8boLtUBwvgeRlDxu8fF +pnw7pfgyEhXadwTV09IPu2ahbHncSrn4ylWwslrNA/fjR8uSMvkzjtZhqijOGiQX +adq6khV8gAfSN/25Uk6I4LtpqSdI0mMGGXQMTWBm/Z9swhd2wSFdniMNjnGNnMLj +8tw/TJgFKW/onL/bf291jO/FOk9PCf1Ug8JLofctaUXRzZex81kOdF7G96mh1gru +ae/uYb7YSvfvpDJwWDRpN+qI6EhyPslf4VyOXbf/sCg8b2WNDUrVoUaIAID5YiSc +MO1cTJuYbkHnul97tSb1K3hKjAhar8p7/27kTWIAl/k1cD/FVjkBKQQmvlJAymvC +IxqD8jtk9ycFmzal7vgB2e/gAU+wg//2SDINU4E9dvcayQOKQSwBHSIbpfB55aFV +5SliOm51KSE0BwwwNw4YbQld1MFRneouMeqqoZU7QsGT2YerzpgTo7JEWZHYvJ2r +9qOFBxov+GBu3Uu8lBPqhpSF+qn9jCrV1sY6kp0es1qK4pOmRW0B0zsJyuHQkLtS +jvoG+Iavwoi2hJjzS/oLDe38BWlUOhmfgXSOboRZhbzWWSQyeyvyWNikmeTaxl8a +lOCsqJYdr93foI/J4OX6NSm3pcHQmbCPJ2hv/B7V8gWcZ9Ccscvxw/rPpsrUZ0UH +83VH2qXH0dadf4kKyu2j0U4T6bZ7GQGPDbAYo7+lKo9Bg/82grh7Zyc3D1fY6fxM +YPCUs1/JmtiEtDGiSJj684OZ8O+nDyxdaTz0x6XMwmtyl0spHW8M2NZDVpXl6K5q +uBWFC4brMM4X2JfWq0vP5WdubP+HtKoeUPLSq+a2DdmQYV5pT4eBCsWIcMRKO9xe +0XLubl62HnLVoW1ZYhQpOTAaVZ9U7/XDTQuXG/2lFungHn2dsngbOG6+PFHELX0R +tF4G7GNE8OTFHWyk0o0IfzBBg0HZknzzohLQnTwDXQLP9W2lBueBrBfdyEQpHlk5 +3fGe9/QA70j7bydl4vuSLR0TuikX4cxnL8XNKryv0/2QyU4oqcsT7VVbKgrc5HI7 +tB+nCD8LQjMFqqE2vy1PuuqdCto5XL8QNr/7a02aGFJGSB/RFJPROgsg90F04sIA +ZZaeTerctVfm9F+ydVGONZ4fbtneAUB8XhonJNV8iZ4M+awhl8VC6gveQODQT3So +EFMx3YWXgpzdsW1WeS8ByH45NIxPOsQi+mBb02lGa2jm7G0HxTxcS5tD2lM4jf4Y +Qw+XNcM4D9UbSiNRLcQ0NqSOEafASPIfhjTxa6GZSxvvuWqf3TI49BeRWox0wrp2 +lDLAHJoAFxDBlLWVaGw8IHPLCvs6Wm1Tic8Rb3pl+ltABZ2N96ncaSu5OjmZPym8 +SGP69TT0y6blXcvFr/ibBJU2VeuwN5jxOObnFtIIyVREjnxZhDEAjdasFcj8CfO1 +2iGGLXHfPrRfFsY8R45nRl40X0bV6reKPcDaQvaofMyC+5M8v7oajSZW1p5kwYnx +nlUrilOCIZBjv7RzqiKNHoUOegyZOVp0GNVdwcAlIP8irQlhH2gbGrUVXhHKJOZD +FdG0tcmfuVkwWNZa5EHzBDCaJNqdrk74QuvTrQBlAvk4L2FP/+FHJF+kubF+ndAg +s0itNu1OUi+pEIx2PGisDGZI61jIasM+F1kGTOyPxc11Vn+osy9t22rxB2aMecrZ +R/FEWMvZ1cvJ6Odp/nw0QrbuI3RZCrn6zB0g9Ab7MYbGVfmwah1+x3lKBG6uwbqx +vLOlzdfyBg9+FTZ4nBrYVEJtqJMVuf3ATERfdlCLFhLh7GvjvFcG1wEq0T8bQjrO +V7q2AHRAerJ+zBhKJOty6Vk/JDpvVPyLJf3je3VqwS6QeuP3Cn+81/y4o4dJ7Ph7 +szdPe1wx6wzE6wOLIe4U40yVjwBCOiw+Tcyh7HhVFxnIKVmNLg90NYfRkS1M3mVj +A83rn5rVHJFZHksPLKtO6kmHQ/4jf5X6HpXgv5yS5suaadjEI02Hr8zXSnEMkOAu +mJiTUE5uoC0RVE15m1pdNhg+3D8PCTrlYtyAqkVW2oxMmvfxUg6QkFithqbLLZAC +qaxUk76N1KSZwnae7lHuHngl6aNMA3kgpi09uy1+3ef7N/JXNyRUOwAO116JyC+I +YgVIHkAOtf/IgG4WczSs/nkBVxu4+v6EmPVurOfpZx7dTFpggLJ3nF7R6bldKq3x +5y0SMWyYeZaU7kAte4Yziq48/XbzEZvYdgU9fR6Ppy+ZggVsarwvF6jNOukrZkkV +11z9XoZZq8VoRQHYgFMfpaXZinMF6WCdu353RxkBus9vI4asn7C+hzEEbTlAr19W +yd1acr6v8/jHkZpAXjczaeeu8wPDrf0KetvBTDfezFPMRSPVOXVe1+wRczbTveHA +gGztoWUoCXVyrJEqNHlQB2inuIpnNLgEi5Nyv9mRlz3uldFElLmzHzl+uUuo8g6T +w/5JGEC8Z5wNMIc8Eo5/k3NOpkElGn8pwfWQWvnGHxfyVDiZ2cwnvvZdwMVoOCxW +T2JZhstMJwzElqcUIG/dV9ozDrvLcRj72Pt3b3H4RqhqrcXtc9NS8znDTNFFepjl +4qEJEAKw9gdKM9Q1vEHyK6qcgFCzqhHMrawdTxYG/zVnNLJHodO/Fh18neKjkaAD +se+0Nh/e3CCu3LE0Z0PVtOSVvXuCxND8kYppJPpMsWWwUFrANbQDzCqfxXrc+w/r +GrIQSz55cvTdBO8NywoomU2dWPOaXaB7moEcDCy0qxB9+zGFIy43/02thtRZ6hGb +xfyQWRK9VHleOnUO5K+B0ULJBVi92Txgn8jD2zefP7Tu+tW8qYvg0JU3LVbHe7r9 +01Z9MLIrJtgsOY9Ui3FVNHvidzSMpRM007G0JanDDNMGSZt/BCSIFdqnO0oROooB +dOlrSQEkxHxmi4QBv7SGyc/+9amqYoSRGCuxNApyv06KOCn4/gYnGDq1xnGxPhXJ +RJMiWBWx6MQ8p0YXzemK95QMQX1EyHYOkNkwOYI/lIhPaAqcc6i186VA0x7rVC2Z +AoKRQ2BrGbn92449gPH9dUEmrO/5oRfWyeQ5xhJmOwEJDyAiuMukZSCyw86kY6sy +yi1Ow4lJYKz6OCRdbc5J3OfZ5qp5Na6ICnss4WDrG6/MuB/cwDw3NAkPE7pC1Lgm +9zprntRqYy/RLdO7xyAwLm+t5NkXZR6yiYtrCqwudPBXVDadVtkuaamdY7w5rK8r +/2DaJ+s+wNPBP/kC+rQAaVvOVfPL7y+RX64iJiYIwHg7iFs8T6766QqJgASCrx7B +UOf5PN8Pg/MSKZO01xw0S5+FqQ5eJFP5p9E4lcVHuSBzWdpIW64QUK40odwtIzbQ +fUdH4YpuRvHHrsvnzazOq3sRZtSefhrnmfx5rc02jlK/bBDrxoJNygm/Pq1JClxN +lTZS/RxRSOw0eA1vk7Dw1niw6FUDeLTJNttlELn1Fa7Yp4QkzwMARcIO8yFRHoBH +swlBSDL/TpE4mCsh2C2kMfLBiwnQSfviJAtVk5SOKVo3+ujiL4L04cS9PDtF5Obm +TKOau0CF9zD/Bepr1eSDF4Duyj47vo8y0N8GIfl1jCVi6QUlMf/wrKND/M2bWemn +3MrmiAAkyx9f2bUZcXjL8NBxYJXT2sK0YQAyUdyhjxycpkwRZVFCRY/PiY2zRI9m +UucEVktJE/nD9E730NN0bARay5MzZMacazM5/gGJvwS6yiSyUH1AXDwFLSKkGVCm +U6WFn14pUNVMIxK0jMlzDLiXvR9rm4W3rYEAdeHMr+IOH0QJbtfrVLsZ5JRR9MtV +hkEjFn06BGNzyf61QvZvmFjZBcl6zUtqphY872Q4BajxFOOsIgSt9cqbhfQvtrNy +a399d1KgTiVPeheceEYq8WgHAYrrsTew/ZNzeM10/rtY1kJmBe2IhTMcR1bNKOqc +ARWcO+zADCF+7MhgdzSAdJ167FAYY3J4yvoGrqEyde1/LQoT8lYhXiqXtUY9N5jy ++EiBoYCMsfl1imF/dGRyYPtuIAJD/rp1R2VJyLxgtqSam4xitQ4oZBVupmmYLKUz +q9fCsZ00Nb62zTpXsxXS7fu91Sfc4b9YyATUJQgrtAac2Kxnga7FEFN/coNwaE3+ +Xa9RJS8XAypwoWbget7huWeJM3RsIV5GUdHW0rBh08Fh5RaCfucYIr9YU20eM/Cp +wIiR6PU7r64RRxeIT36n8NU1rhQvWwYoe2bpuznxvYyIt1rXRC728bUdjc/rk09G +kqoYuvC0jg7YBm+Cno3BvqYoRpoMM23eNmACr5KU41oou0iQ4GUahwbTLc/ECnz0 +MtIc/6Yydd8wbOKiF3plseSjkcbkt9BgT5cHw84vXqzH3m2+OPCmpbzvO8yucVM7 +Y8NDQPM7j7RgFoKTz6ww+ZxhbPOqPgpfZBDTutfUAlFAZmORTdszEd0jVWPSvBP/ +86WPoaO17Jt++gXKnKspgsQXBTuO0OYaC7KYUNQbA4Zr0IBEVXUJRPBIXP6guxcz +eqrhclnoqbHehBfl3MdYC7kFIXvyyuO2DOeU86NUG1xBOGZydouPANid6BTyuaE4 +CGvwMQ7Bz64/1vzVhiutOG2wcQy35ZnRazW657eMc3M7z9gE1ES736xYnltqO2ac +meI4SGYdbXyFdvAm/+e9AjFsqN4V9kSIexAZztGNclOD0gy4YGclaCfefK9L+XTu +8pXt45zkJ9UQlWWSxVa4c9cdp+nLtPadB/xVP0k0USg0cJTfFZ6oUKeb2ForP1o1 +AHhc8gTOyku4LRJ8qSJjB//WLBSne5m7qquJDOsndy98bcbQunr1lbzqQEKck8Q7 +hXTT3TrZjQjiziSTt2TQ3jM/Eh6bzzG/lyodrKvbZdqy5Knu6fdEuILaKTKW4sg2 +ptihOLeOkJFtrdpS8PKN2vhg+sbhI9uzpwc0XT1QRzFTPZi+1EvTrksFCLrstMzk ++2uGpixux42LIM0veQo9N3dJWdAA7CIC5SqbFIUpdZiHBYUfs6fbU/BdMo0jr9wE +vO+76fOT2LRb1ghCDAU0pItOEn9bJ6bJkjgR/bMPW9tojB1Jp5uorUfiD8dt0FQT +A3VHN305Dk+MKHLHPN9v7ycSpKkG3gZbDI/A+HHUTZNHrTxM1BHDFar3OfRUj0ja +gWXdDFHO4q8RMNbf4Q+hHpkEYzM9imKZDu2bDn43OtNbhDMocPYbsE8c4flB4h80 +uMoZSGbZYTTz0TSPSpGt28LHDxtL+wdpWBL4CQi2LltsmIk9YdiawiYgqrk8bNou +TPpCwP3/CeobOKnE0YWKNRajB7GzM5YFcszY8w0M6eiUeHCXKXldilgpRDLgZlfg +jQNwb/BQyK0HpQqEsvzQbQPokZStsVdU7VLu5Gf4VbcwRxWaxCLvjQYnArWdufGu +QlXsJI3EjuRNmvOcilL8t0OLvMtFr3z5mwFTECwkP2kwY85aQ5zt5jxjEUNYnqeJ +wfLy5iav3YYsqXNy61VLWM4Yq7c0bFuFjTmi+LIdx474Wf1+cdKF9h4OndX9XhP8 +mvvi4cUhC+kHYkyAGa4uBj3m/TibVBQW0q8TMqKDU3dcORVcS7JlykXeg8Eayls2 +wwZSZfuQrKvdZ7ryZ8DgSaacDUbqcskMcbF63DUIw7gIPGpRkRuUqGXKi/CA2fwL +WXdGrLtgMc/F6QNs+r2oiGewhZlKHms7hMkwPoEuHBLKCzJvDi/TxGUBROE486Ww +yhTm36NM3YAnysSqOR0b86lE/V3byHETIb8NRe/7fuK1bu5M20Sp2FCnn+b1SNiJ +In+iXahZ2PurUj62toNQAOMnB+fi6GCkoROG7TctcYbgYed4BSOqtT6as1tfAWyg +-----END PGP PUBLIC KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128f-sample-signature.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128f-sample-signature.asc new file mode 100644 index 0000000000..343792be80 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128f-sample-signature.asc @@ -0,0 +1,361 @@ +-----BEGIN PGP SIGNATURE----- + +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 +-----END PGP SIGNATURE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128f-sample-sk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128f-sample-sk.asc new file mode 100644 index 0000000000..d77007dc5f --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128f-sample-sk.asc @@ -0,0 +1,1108 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +ibe9cQeNjnzm06h73NKtWKRlqYSYycuhx+kc38FJjUoo21O+6hLGfZPPRO1VgQod +ubTTgyaiyDOWPOomqdfeWbkYVwp1uXVggbNaseph/GVLTsTHM2sgGpGaYVzwSlrA +2UjIsYR40N8XAToHNsrZGa9zY2VN9xTScBj/aJlEz8z75NyHDjeoHSbAubmcjNJH +g5J5OS1bR3WHC49b/6peH7HN+Iu0JacOXSdFJTiugTWsp6ouLYi7VLYvtcDljsng +2e6t7bqWIfLXewMuN9FRPfrfc8qQHaQ4NQW9feFKsQMfc4axxBPoghpbHDVAOH4V +k8NaiDH5q/JFhi4tOuztLu00zrRcdxWr5P2SMayr++FX6fX3bfxR22KoJX+FSM8j +Rb9Ce7xqVga621A1oBxOJrtoDusIUbcEoz9d5ruuHs/6uOPm0cpr5vf0nLJv3SsP +scx2pVJOsI/cMpJdpFzVWwUhjTcQ9f2F5Mf3OCmydZH/bPqjCAqjikWmiLq8nMKk +oPTPeBEEyH2eezXyqOHiej2+IqmEywEnZ6l9xx1c2u7m9Fd48XIe65zY+NjDkkBi +IJ0oJ3ut+qwqXCyftQwpapK8g6Xzz9PnQt8u+C36Sdl1A+hU9jh9sj46F0zeFFgi +I/oJ4O5aMsEaiyw20PHmnBXxtCHlPwbGN2DQmfdkesIANrgiWOOwpmKtaAHJ9rgj +npz2A5yYaJ97YK9SFHHwWBifvxyetWde/pIeJHEObtgx8D1fbXQGNStn0+PDe0mG +wCpauew5gJWMSiYvuf8j7QyVBKcyaFmgGiYCDC1IM0zL0SKBXjL0GABZrLDNJx4J +6EL4zi0Bg0JzGtDTtavRlp04l8npETDolQKvvQwruUZwT6pzUpzi3Ywq+HhfJRhz +DNTB1qywJB3kdKSaqjKTYNwpa0kTg8dZh4VHxhlE+lj0iwdyKhKsoeZU0nSd+tCp +ZngluNOhbI1rAYjlu2W2R40refIQj6ncP/SvRTtUgPL54YS4MQwyCRmRLm0CuBrN +QwkpgO6aVOjyF3lVwkqClpT+R2vdh84pggfjm/0pqIiRkRDKD75z5bb5d+znki5z +hxUtrE6atKbE3ZrMSDXXr9YFd1pUYcx9V7fIHEWZSisGgjhQ0qlCsQh+PzKNfiF9 +n2l1cSzosrCtIQADc28LgyE7ATDSPFZAISo+XUdUiw5vABXWJcZOVAHw2xBqKL/l +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 +cYbgYed4BSOqtT6as1tfAWyg +-----END PGP PRIVATE KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-message.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-message.asc new file mode 100644 index 0000000000..c8a43027a9 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-message.asc @@ -0,0 +1,197 @@ +-----BEGIN PGP MESSAGE----- + +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 +-----END PGP MESSAGE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-pk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-pk.asc new file mode 100644 index 0000000000..33a3bdcc0c --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-pk.asc @@ -0,0 +1,527 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-signature.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-signature.asc new file mode 100644 index 0000000000..189dfb8b2c --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-signature.asc @@ -0,0 +1,169 @@ +-----BEGIN PGP SIGNATURE----- + +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 +qys5KeAY2ZFOKBA= +-----END PGP SIGNATURE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-sk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-sk.asc new file mode 100644 index 0000000000..403a3f10b8 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-sk.asc @@ -0,0 +1,531 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +OSngGNmRTigQ +-----END PGP PRIVATE KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-256s-sample-pk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-256s-sample-pk.asc new file mode 100644 index 0000000000..e306f57be9 --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-256s-sample-pk.asc @@ -0,0 +1,1909 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +TontEOLGO7U+ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-256s-sample-signature.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-256s-sample-signature.asc new file mode 100644 index 0000000000..0396a5998c --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-256s-sample-signature.asc @@ -0,0 +1,626 @@ +-----BEGIN PGP SIGNATURE----- + +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 +-----END PGP SIGNATURE----- diff --git a/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-256s-sample-sk.asc b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-256s-sample-sk.asc new file mode 100644 index 0000000000..e26e34ac4b --- /dev/null +++ b/src/tests/data/draft-ietf-openpgp-pqc/v6-slhdsa-256s-sample-sk.asc @@ -0,0 +1,1914 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +6g86ciwawUGiW7BOie0Q4sY7tT4= +-----END PGP PRIVATE KEY BLOCK----- diff --git a/src/tests/exdsa_ecdhkem.cpp b/src/tests/exdsa_ecdhkem.cpp index 83b770e45c..0e6356984f 100644 --- a/src/tests/exdsa_ecdhkem.cpp +++ b/src/tests/exdsa_ecdhkem.cpp @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if defined(ENABLE_CRYPTO_REFRESH) || defined(ENABLE_PQC) +#if defined(ENABLE_CRYPTO_REFRESH) #include "rnp_tests.h" #include "crypto/exdsa_ecdhkem.h" diff --git a/src/tests/ffi-enc.cpp b/src/tests/ffi-enc.cpp index 2e34c93d11..ae262774b2 100644 --- a/src/tests/ffi-enc.cpp +++ b/src/tests/ffi-enc.cpp @@ -1003,6 +1003,70 @@ TEST_F(rnp_tests, test_ffi_decrypt_pk_unlocked) } #if defined(ENABLE_CRYPTO_REFRESH) +#if defined(ENABLE_PQC) +/* generate keys and make sure they are usable */ +TEST_F(rnp_tests, test_ffi_pqc_gen_enc_sign) +{ + std::vector> primary_sub = { + {"ML-DSA-65+ED25519", "ML-KEM-768+X25519"}, + {"ML-DSA-65+ECDSA-P256", "ML-KEM-768+ECDH-P256"}, + {"ML-DSA-87+ED448", "ML-KEM-1024+X448"}, + {"ML-DSA-87+ECDSA-P384", "ML-KEM-1024+ECDH-P384"}, + {"ML-DSA-65+ECDSA-BP256", "ML-KEM-768+ECDH-BP256"}, + {"ML-DSA-87+ECDSA-BP384", "ML-KEM-1024+ECDH-BP384"}, + {"SLH-DSA-SHAKE-128f", "ML-KEM-768+X25519"}, + {"SLH-DSA-SHAKE-128s", "ML-KEM-768+X25519"}, + {"SLH-DSA-SHAKE-256s", "ML-KEM-1024+X448"}}; + for (auto pk_algs : primary_sub) { + rnp_ffi_t ffi = NULL; + rnp_key_handle_t key = NULL; + rnp_input_t input = NULL; + rnp_output_t output = NULL; + rnp_op_encrypt_t op = NULL; + const char * plaintext = "data1"; + assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); + assert_rnp_success(rnp_generate_key_ex(ffi, + pk_algs.first.c_str(), + pk_algs.second.c_str(), + 0, + 0, + NULL, + NULL, + "Test UID", + NULL, + &key)); + // encrypt+sign + str_to_file("plaintext", plaintext); + assert_rnp_success(rnp_input_from_path(&input, "plaintext")); + assert_non_null(input); + assert_rnp_success(rnp_output_to_path(&output, "encrypted")); + assert_non_null(output); + assert_rnp_success(rnp_op_encrypt_create(&op, ffi, input, output)); + assert_rnp_success(rnp_op_encrypt_add_recipient(op, key)); + assert_rnp_success(rnp_op_encrypt_set_cipher(op, "AES256")); + assert_rnp_success(rnp_op_encrypt_add_signature(op, key, NULL)); + assert_rnp_success(rnp_op_encrypt_execute(op)); + assert_true(rnp_file_exists("encrypted")); + assert_rnp_success(rnp_input_destroy(input)); + input = NULL; + assert_rnp_success(rnp_output_destroy(output)); + output = NULL; + /* decrypt */ + assert_rnp_success(rnp_input_from_path(&input, "encrypted")); + assert_non_null(input); + assert_rnp_success(rnp_output_to_path(&output, "decrypted")); + assert_non_null(output); + assert_rnp_success(rnp_decrypt(ffi, input, output)); + // cleanup + assert_rnp_success(rnp_op_encrypt_destroy(op)); + assert_rnp_success(rnp_input_destroy(input)); + assert_rnp_success(rnp_output_destroy(output)); + assert_rnp_success(rnp_key_handle_destroy(key)); + assert_rnp_success(rnp_ffi_destroy(ffi)); + } +} +#endif + TEST_F(rnp_tests, test_ffi_decrypt_v6_pkesk_test_vector) { rnp_ffi_t ffi = NULL; @@ -1010,9 +1074,9 @@ TEST_F(rnp_tests, test_ffi_decrypt_v6_pkesk_test_vector) rnp_output_t output = NULL; assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); - assert_true(import_all_keys(ffi, "data/test_v6_valid_data/transferable_seckey_v6.asc")); + assert_true(import_all_keys(ffi, "data/RFC9580/A.4.transferable-seckey-v6.asc")); - assert_rnp_success(rnp_input_from_path(&input, "data/test_v6_valid_data/v6pkesk.asc")); + assert_rnp_success(rnp_input_from_path(&input, "data/RFC9580/A.8.5-v6pkesk-v2seipd")); assert_non_null(input); assert_rnp_success(rnp_output_to_null(&output)); assert_rnp_success(rnp_decrypt(ffi, input, output)); @@ -1023,68 +1087,103 @@ TEST_F(rnp_tests, test_ffi_decrypt_v6_pkesk_test_vector) rnp_ffi_destroy(ffi); } -#if defined(ENABLE_PQC) -// NOTE: this tests ML-KEM-ipd test vectors -// The final implementation of the PQC draft implementation will use the final NIST standard. -TEST_F(rnp_tests, test_ffi_decrypt_pqc_pkesk_test_vector) +TEST_F(rnp_tests, test_ffi_verify_v2_seipd_test_vector) { - bool expect_success = true; -#if !(defined(BOTAN_HAS_ML_KEM_INITIAL_PUBLIC_DRAFT) && defined(ENABLE_PQC_MLKEM_IPD)) - // we can only verify the test vectors with ML-KEM-ipd - expect_success = false; -#endif - - rnp_ffi_t ffi = NULL; - rnp_input_t input = NULL; - rnp_output_t output = NULL; + rnp_ffi_t ffi = NULL; + rnp_input_t input = NULL; + rnp_output_t output = NULL; + rnp_op_verify_t verify = NULL; assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); - assert_true(import_all_keys(ffi, "data/draft-ietf-openpgp-pqc/v6-eddsa-mlkem.sec.asc")); - assert_true(import_all_keys(ffi, "data/draft-ietf-openpgp-pqc/v4-eddsa-mlkem.sec.asc")); + assert_true(import_all_keys(ffi, "data/RFC9580/A.4.transferable-seckey-v6.asc")); - assert_rnp_success(rnp_output_to_path(&output, "decrypted")); assert_rnp_success( - rnp_input_from_path(&input, "data/draft-ietf-openpgp-pqc/v6-seipdv2.asc")); + rnp_input_from_path(&input, "data/RFC9580/A.7.-sample-inline-signed-message.asc")); assert_non_null(input); - if (expect_success) { - assert_rnp_success(rnp_decrypt(ffi, input, output)); - assert_string_equal(file_to_str("decrypted").c_str(), "Testing\n"); - } else { - assert_rnp_failure(rnp_decrypt(ffi, input, output)); - } + assert_rnp_success(rnp_output_to_path(&output, "decrypted")); + assert_rnp_success(rnp_op_verify_create(&verify, ffi, input, output)); + assert_rnp_success(rnp_op_verify_execute(verify)); + + /* dash-escaped */ + assert_string_equal( + file_to_str("decrypted").c_str(), + "What we need from the grocery store:\n\n- tofu\n- vegetables\n- noodles\n"); assert_int_equal(unlink("decrypted"), 0); + + // cleanup rnp_input_destroy(input); rnp_output_destroy(output); + rnp_op_verify_destroy(verify); + rnp_ffi_destroy(ffi); +} + +/* RNP currently skips v6 signatures on cleartext signatures. +This test expects the failure. Eventually, if v6 signatures are supported, the test should be +adapted */ +TEST_F(rnp_tests, test_ffi_verify_v2_seipd_cleartext_test_vector) +{ + rnp_ffi_t ffi = NULL; + rnp_input_t input = NULL; + rnp_output_t output = NULL; + rnp_op_verify_t verify = NULL; + + assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); + assert_true(import_all_keys(ffi, "data/RFC9580/A.4.transferable-seckey-v6.asc")); - assert_rnp_success(rnp_output_to_path(&output, "decrypted")); assert_rnp_success( - rnp_input_from_path(&input, "data/draft-ietf-openpgp-pqc/v4-seipdv1.asc")); + rnp_input_from_path(&input, "data/RFC9580/A.6.-sample-cleartext-signed-message.asc")); assert_non_null(input); - if (expect_success) { - assert_rnp_success(rnp_decrypt(ffi, input, output)); - assert_string_equal(file_to_str("decrypted").c_str(), "Testing\n"); - } else { - assert_rnp_failure(rnp_decrypt(ffi, input, output)); - } - assert_int_equal(unlink("decrypted"), 0); + assert_rnp_success(rnp_output_to_path(&output, "decrypted")); + assert_rnp_success(rnp_op_verify_create(&verify, ffi, input, output)); + assert_int_equal(RNP_ERROR_SIGNATURE_INVALID, rnp_op_verify_execute(verify)); + + // /* dash-escaped */ + // assert_string_equal( + // file_to_str("decrypted").c_str(), + // "What we need from the grocery store:\n\n- tofu\n- vegetables\n- noodles\n"); + // assert_int_equal(unlink("decrypted"), 0); + + // cleanup rnp_input_destroy(input); rnp_output_destroy(output); + rnp_op_verify_destroy(verify); + rnp_ffi_destroy(ffi); +} - assert_rnp_success(rnp_output_to_path(&output, "decrypted")); - assert_rnp_success( - rnp_input_from_path(&input, "data/draft-ietf-openpgp-pqc/v4-seipdv1.asc")); - assert_non_null(input); - if (expect_success) { +#if defined(ENABLE_PQC) +TEST_F(rnp_tests, test_ffi_decrypt_pqc_pkesk_test_vector) +{ + std::vector> key_msg_pairs = { + {"data/draft-ietf-openpgp-pqc/v6-eddsa-sample-sk.asc", + "data/draft-ietf-openpgp-pqc/v6-eddsa-sample-message.asc"}, + {"data/draft-ietf-openpgp-pqc/v4-eddsa-sample-sk.asc", + "data/draft-ietf-openpgp-pqc/v4-eddsa-sample-message-v1.asc"}, + {"data/draft-ietf-openpgp-pqc/v4-eddsa-sample-sk.asc", + "data/draft-ietf-openpgp-pqc/v4-eddsa-sample-message-v2.asc"}, + {"data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-sk.asc", + "data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-message.asc"}, + {"data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-sk.asc", + "data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-message.asc"}, + {"data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-sk.asc", + "data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-message.asc"}}; + + for (auto key_msg_pair : key_msg_pairs) { + rnp_ffi_t ffi = NULL; + rnp_input_t input = NULL; + rnp_output_t output = NULL; + assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); + + assert_true(import_all_keys(ffi, key_msg_pair.first.c_str())); + + assert_rnp_success(rnp_output_to_path(&output, "decrypted")); + assert_rnp_success(rnp_input_from_path(&input, key_msg_pair.second.c_str())); + assert_non_null(input); assert_rnp_success(rnp_decrypt(ffi, input, output)); assert_string_equal(file_to_str("decrypted").c_str(), "Testing\n"); - } else { - assert_rnp_failure(rnp_decrypt(ffi, input, output)); + assert_int_equal(unlink("decrypted"), 0); + rnp_input_destroy(input); + rnp_output_destroy(output); } - assert_int_equal(unlink("decrypted"), 0); - rnp_input_destroy(input); - rnp_output_destroy(output); - - rnp_ffi_destroy(ffi); } TEST_F(rnp_tests, test_ffi_pqc_default_enc_subkey) @@ -1164,15 +1263,32 @@ TEST_F(rnp_tests, test_ffi_encrypt_pk_with_v6_key) // setup FFI assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); - assert_true(import_all_keys(ffi, "data/test_v6_valid_data/transferable_seckey_v6.asc")); + assert_true(import_all_keys(ffi, "data/RFC9580/A.4.transferable-seckey-v6.asc")); + // No other cipher can be used here: the only 128-bit block ciphers in OpenPGP aside from + // AES are Camellia and TwoFish. std::vector ciphers = {"AES128", "AES192", "AES256"}; +#ifdef ENABLE_TWOFISH + ciphers.push_back("TwoFish"); +#endif +#if (defined BOTAN_HAS_CAMELLIA || !defined CRYPTO_BACKEND_BOTAN3) + // ENABLE_CAMELLIA does not exist, yet BOTAN might not support this algorithm. + std::vector camellia({"Camellia128", "Camellia192", "Camellia256"}); + ciphers.insert(ciphers.end(), camellia.begin(), camellia.end()); +#endif std::vector aead_modes = {"None", "EAX", "OCB"}; std::vector enable_pkeskv6_modes = {true, false}; for (auto enable_pkeskv6 : enable_pkeskv6_modes) for (auto aead : aead_modes) for (auto cipher : ciphers) { + bool expect_success = true; + if (!enable_pkeskv6 && (cipher == "TwoFish" || cipher.find("Camellia") == 0)) { + // This combination is not supported, since the algorithm ID is fixed to + // AES for v3 PKESK for the public key algorithm featured by the key used + // here. + expect_success = false; + } // write out some data FILE *fp = fopen("plaintext", "wb"); assert_non_null(fp); @@ -1210,7 +1326,12 @@ TEST_F(rnp_tests, test_ffi_encrypt_pk_with_v6_key) assert_rnp_success(rnp_op_encrypt_set_cipher(op, cipher.c_str())); // execute the operation - assert_rnp_success(rnp_op_encrypt_execute(op)); + if (expect_success) { + assert_rnp_success(rnp_op_encrypt_execute(op)); + } else { + assert_rnp_failure(rnp_op_encrypt_execute(op)); + continue; + } // make sure the output file was created assert_true(rnp_file_exists("encrypted")); @@ -1223,8 +1344,6 @@ TEST_F(rnp_tests, test_ffi_encrypt_pk_with_v6_key) assert_rnp_success(rnp_op_encrypt_destroy(op)); op = NULL; - /* decrypt */ - // decrypt assert_rnp_success(rnp_input_from_path(&input, "encrypted")); assert_non_null(input); diff --git a/src/tests/ffi-key-sig.cpp b/src/tests/ffi-key-sig.cpp index 91fba9823b..ac4787068e 100644 --- a/src/tests/ffi-key-sig.cpp +++ b/src/tests/ffi-key-sig.cpp @@ -2623,3 +2623,43 @@ TEST_F(rnp_tests, test_ffi_key_self_certification_features) rnp_ffi_destroy(ffi); } + +#if defined(ENABLE_PQC) +TEST_F(rnp_tests, test_ffi_verify_detached_pqc_test_vector) +{ + std::string msg = "Testing\n"; + std::vector> key_sig_pairs = { + {"data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-pk.asc", + "data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-signature.asc"}, + {"data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-pk.asc", + "data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-signature.asc"}, + {"data/draft-ietf-openpgp-pqc/v6-slhdsa-128f-sample-pk.asc", + "data/draft-ietf-openpgp-pqc/v6-slhdsa-128f-sample-signature.asc"}, + {"data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-pk.asc", + "data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-signature.asc"}, + {"data/draft-ietf-openpgp-pqc/v6-slhdsa-256s-sample-pk.asc", + "data/draft-ietf-openpgp-pqc/v6-slhdsa-256s-sample-signature.asc"}}; + + for (auto key_sig_pair : key_sig_pairs) { + rnp_ffi_t ffi = NULL; + rnp_input_t input = NULL; + rnp_input_t signature = NULL; + rnp_op_verify_t verify = NULL; + + assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); + assert_true(import_all_keys(ffi, key_sig_pair.first)); + assert_rnp_success( + rnp_input_from_memory(&input, (uint8_t *) msg.c_str(), msg.length(), false)); + assert_non_null(input); + assert_rnp_success(rnp_input_from_path(&signature, key_sig_pair.second.c_str())); + assert_non_null(signature); + + assert_rnp_success(rnp_op_verify_detached_create(&verify, ffi, input, signature)); + assert_rnp_success(rnp_op_verify_execute(verify)); + assert_rnp_success(rnp_op_verify_destroy(verify)); + assert_rnp_success(rnp_input_destroy(input)); + assert_rnp_success(rnp_input_destroy(signature)); + assert_rnp_success(rnp_ffi_destroy(ffi)); + } +} +#endif diff --git a/src/tests/ffi-key.cpp b/src/tests/ffi-key.cpp index 9010999cdc..4d36daf324 100644 --- a/src/tests/ffi-key.cpp +++ b/src/tests/ffi-key.cpp @@ -3222,7 +3222,7 @@ TEST_F(rnp_tests, test_ffi_v6_cert_import) assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); assert_rnp_success( - rnp_input_from_path(&input, "data/test_v6_valid_data/transferable_pubkey_v6.asc")); + rnp_input_from_path(&input, "data/RFC9580/A.3.transferable-pubkey-v6.asc")); assert_rnp_success( rnp_import_keys(ffi, input, @@ -3260,45 +3260,55 @@ TEST_F(rnp_tests, test_ffi_v6_cert_import) } #if defined(ENABLE_PQC) -// NOTE: this tests ML-KEM-ipd test vectors -// The final implementation of the PQC draft implementation will use the final NIST standard. TEST_F(rnp_tests, test_ffi_pqc_certs) { - rnp_ffi_t ffi = NULL; - rnp_input_t input = NULL; - size_t keycount = 255; - - /* Public Key */ - assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); - assert_rnp_success( - rnp_input_from_path(&input, "data/draft-ietf-openpgp-pqc/v6-eddsa-mlkem.pub.asc")); - assert_rnp_success( - rnp_import_keys(ffi, - input, - RNP_LOAD_SAVE_PUBLIC_KEYS | RNP_LOAD_SAVE_SINGLE | RNP_LOAD_SAVE_BASE64, - NULL)); - rnp_input_destroy(input); - assert_rnp_success(rnp_get_public_key_count(ffi, &keycount)); - assert_int_equal(keycount, 2); - assert_rnp_success(rnp_get_secret_key_count(ffi, &keycount)); - assert_int_equal(keycount, 0); - rnp_ffi_destroy(ffi); + std::vector> pub_sec_keys = { + {"data/draft-ietf-openpgp-pqc/v4-eddsa-sample-pk.asc", + "data/draft-ietf-openpgp-pqc/v4-eddsa-sample-sk.asc"}, + {"data/draft-ietf-openpgp-pqc/v6-eddsa-sample-pk.asc", + "data/draft-ietf-openpgp-pqc/v6-eddsa-sample-sk.asc"}, + {"data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-pk.asc", + "data/draft-ietf-openpgp-pqc/v6-mldsa-65-sample-sk.asc"}, + {"data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-pk.asc", + "data/draft-ietf-openpgp-pqc/v6-mldsa-87-sample-sk.asc"}, + {"data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-pk.asc", + "data/draft-ietf-openpgp-pqc/v6-slhdsa-128s-sample-sk.asc"}, + }; - /* Private Key */ - assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); - assert_rnp_success( - rnp_input_from_path(&input, "data/draft-ietf-openpgp-pqc/v6-eddsa-mlkem.sec.asc")); - assert_rnp_success( - rnp_import_keys(ffi, - input, - RNP_LOAD_SAVE_SECRET_KEYS | RNP_LOAD_SAVE_SINGLE | RNP_LOAD_SAVE_BASE64, - NULL)); - rnp_input_destroy(input); - assert_rnp_success(rnp_get_secret_key_count(ffi, &keycount)); - assert_int_equal(keycount, 2); - rnp_ffi_destroy(ffi); + for (auto pub_sec_key : pub_sec_keys) { + int expected_keys = 2; + /* Public */ + rnp_ffi_t ffi = NULL; + rnp_input_t input = NULL; + size_t keycount = 255; + assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); + assert_rnp_success(rnp_input_from_path(&input, pub_sec_key.first.c_str())); + assert_rnp_success(rnp_import_keys(ffi, + input, + RNP_LOAD_SAVE_PUBLIC_KEYS | RNP_LOAD_SAVE_SINGLE | + RNP_LOAD_SAVE_BASE64, + NULL)); + rnp_input_destroy(input); + assert_rnp_success(rnp_get_public_key_count(ffi, &keycount)); + assert_int_equal(keycount, expected_keys); + assert_rnp_success(rnp_get_secret_key_count(ffi, &keycount)); + assert_int_equal(keycount, 0); + rnp_ffi_destroy(ffi); + + /* Private */ + assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); + assert_rnp_success(rnp_input_from_path(&input, pub_sec_key.second.c_str())); + assert_rnp_success(rnp_import_keys(ffi, + input, + RNP_LOAD_SAVE_SECRET_KEYS | RNP_LOAD_SAVE_SINGLE | + RNP_LOAD_SAVE_BASE64, + NULL)); + rnp_input_destroy(input); + assert_rnp_success(rnp_get_secret_key_count(ffi, &keycount)); + assert_int_equal(keycount, expected_keys); + rnp_ffi_destroy(ffi); + } } - #endif TEST_F(rnp_tests, test_ffi_v6_seckey_import) @@ -3309,7 +3319,7 @@ TEST_F(rnp_tests, test_ffi_v6_seckey_import) assert_rnp_success(rnp_ffi_create(&ffi, "GPG", "GPG")); assert_rnp_success( - rnp_input_from_path(&input, "data/test_v6_valid_data/transferable_seckey_v6.asc")); + rnp_input_from_path(&input, "data/RFC9580/A.4.transferable-seckey-v6.asc")); assert_rnp_success( rnp_import_keys(ffi, input, @@ -4707,9 +4717,11 @@ TEST_F(rnp_tests, test_v5_keys) assert_true(check_has_key(ffi, "817f60336bb9d133", true)); assert_true(check_has_key(ffi, "08b67c2205cfd75b", true)); +#ifndef ENABLE_CRYPTO_REFRESH // we implement Ed448 and this does not fail then. /* v5 ecc 448 key : not supported yet */ assert_false(import_pub_keys(ffi, "data/test_stream_key_load/v5-ecc-448-pub.asc")); assert_false(import_sec_keys(ffi, "data/test_stream_key_load/v5-ecc-448-sec.asc")); +#endif /* v5 ecc p256 key */ assert_true(import_pub_keys(ffi, "data/test_stream_key_load/v5-ecc-p256-pub.asc")); diff --git a/src/tests/ffi.cpp b/src/tests/ffi.cpp index 9d5aad9745..2d32013d59 100644 --- a/src/tests/ffi.cpp +++ b/src/tests/ffi.cpp @@ -3106,10 +3106,10 @@ TEST_F(rnp_tests, test_ffi_supported_features) size_t pqc_opt = 0; size_t crypto_refresh_opt = 0; #if defined(ENABLE_CRYPTO_REFRESH) - crypto_refresh_opt = 2; // X25519 + ED25519 + crypto_refresh_opt = 4; // Ed25519/X25519/Ed448/X448 #endif #if defined(ENABLE_PQC) - pqc_opt = 12; // kyber+ecc and dilithium+ecc and sphincs+ variants + pqc_opt = 6 + 6 + 3; // kyber+ecc + dilithium+ecc + sphincs+ variants #endif assert_true(check_features( RNP_FEATURE_PK_ALG, features, 6 + has_sm2 + pqc_opt + crypto_refresh_opt)); @@ -3212,7 +3212,12 @@ TEST_F(rnp_tests, test_ffi_supported_features) /* elliptic curve */ assert_rnp_success(rnp_supported_features(RNP_FEATURE_CURVE, &features)); assert_non_null(features); - assert_true(check_features(RNP_FEATURE_CURVE, features, 6 + has_sm2 + 3 * has_brainpool)); + size_t opt_has_ed448_x448 = 0; +#if defined(ENABLE_CRYPTO_REFRESH) + opt_has_ed448_x448 = 2; +#endif + assert_true(check_features( + RNP_FEATURE_CURVE, features, 6 + has_sm2 + 3 * has_brainpool + opt_has_ed448_x448)); rnp_buffer_destroy(features); assert_rnp_success(rnp_supports_feature(RNP_FEATURE_CURVE, "NIST P-256", &supported)); assert_true(supported); @@ -5989,7 +5994,12 @@ TEST_F(rnp_tests, test_ffi_security_profile) removed = 0; assert_rnp_failure(rnp_remove_security_rule(ffi, NULL, NULL, 0, 0x17, 0, &removed)); assert_rnp_success(rnp_remove_security_rule(ffi, NULL, NULL, 0, 0, 0, &removed)); - assert_int_equal(removed, 3 /*HASH*/ + 4 /*SYMM*/); + + size_t add_removed_hash = 0; +#if defined(ENABLE_CRYPTO_REFRESH) + add_removed_hash = 1; // RIPEMD +#endif + assert_int_equal(removed, 3 /*HASH*/ + add_removed_hash + 4 /*SYMM*/); rnp_ffi_destroy(ffi); rnp_ffi_create(&ffi, "GPG", "GPG"); /* Remove all rules for hash */ @@ -6000,7 +6010,7 @@ TEST_F(rnp_tests, test_ffi_security_profile) removed = 0; assert_rnp_success( rnp_remove_security_rule(ffi, RNP_FEATURE_HASH_ALG, NULL, 0, 0, 0, &removed)); - assert_int_equal(removed, 3); + assert_int_equal(removed, 3 + add_removed_hash); rnp_ffi_destroy(ffi); rnp_ffi_create(&ffi, "GPG", "GPG"); /* Remove all rules for specific hash */ diff --git a/src/tests/pqc.cpp b/src/tests/pqc.cpp index 0b779d4970..dfee4b2d87 100644 --- a/src/tests/pqc.cpp +++ b/src/tests/pqc.cpp @@ -68,35 +68,28 @@ TEST_F(rnp_tests, test_dilithium_key_function) TEST_F(rnp_tests, test_sphincsplus_key_function) { - sphincsplus_parameter_t params[] = {sphincsplus_simple_128s, - sphincsplus_simple_128f, - sphincsplus_simple_192s, - sphincsplus_simple_192f, - sphincsplus_simple_256s, - sphincsplus_simple_256f}; - sphincsplus_hash_func_t hash_funcs[] = {sphincsplus_sha256, sphinscplus_shake256}; - - for (sphincsplus_parameter_t param : params) { - for (sphincsplus_hash_func_t hash_func : hash_funcs) { - auto public_and_private_key = - sphincsplus_generate_keypair(&global_ctx.rng, param, hash_func); - - std::array msg{'H', 'e', 'l', 'l', 'o'}; - - pgp_sphincsplus_signature_t sig; - assert_rnp_success(public_and_private_key.second.sign( - &global_ctx.rng, &sig, msg.data(), msg.size())); - - assert_rnp_success( - public_and_private_key.first.verify(&sig, msg.data(), msg.size())); - } + pgp_pubkey_alg_t algs[] = {PGP_PKA_SPHINCSPLUS_SHAKE_128f, + PGP_PKA_SPHINCSPLUS_SHAKE_128s, + PGP_PKA_SPHINCSPLUS_SHAKE_256s}; + + for (pgp_pubkey_alg_t alg : algs) { + auto public_and_private_key = sphincsplus_generate_keypair(&global_ctx.rng, alg); + + std::array msg{'H', 'e', 'l', 'l', 'o'}; + + pgp_sphincsplus_signature_t sig; + assert_rnp_success( + public_and_private_key.second.sign(&global_ctx.rng, &sig, msg.data(), msg.size())); + + assert_rnp_success(public_and_private_key.first.verify(&sig, msg.data(), msg.size())); } } TEST_F(rnp_tests, test_dilithium_exdsa_direct) { pgp_pubkey_alg_t algs[] = {PGP_PKA_DILITHIUM3_ED25519, - /* PGP_PKA_DILITHIUM5_ED448,*/ PGP_PKA_DILITHIUM3_P256, + PGP_PKA_DILITHIUM5_ED448, + PGP_PKA_DILITHIUM3_P256, PGP_PKA_DILITHIUM5_P384, PGP_PKA_DILITHIUM3_BP256, PGP_PKA_DILITHIUM5_BP384};