From 78df69d051d11983310eb2ad49d81a02d7812e1e Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Mon, 13 Jul 2026 16:10:42 +1000 Subject: [PATCH] FrodoKEM: ASN.1 keys, X.509 certicates Added support for encoding and decoding keys in ASN.1. Added support for X.509 certificates and CSRs. Generated certificates and CSRs. Not fo FrodoKEM-640 as is not in the specs. --- .wolfssl_known_macro_extras | 1 + certs/frodokem/README.txt | 42 + certs/frodokem/frodokem-ca-ecc-cert.der | Bin 0 -> 535 bytes certs/frodokem/frodokem-ca-ecc-cert.pem | 14 + certs/frodokem/frodokem-ca-ecc-key.der | Bin 0 -> 121 bytes certs/frodokem/frodokem-ca-ecc-key.pem | 5 + certs/frodokem/frodokem1344-cert.der | Bin 0 -> 21997 bytes certs/frodokem/frodokem1344-cert.pem | 461 +++++++++ certs/frodokem/frodokem1344-key.der | Bin 0 -> 43115 bytes certs/frodokem/frodokem1344-key.pem | 901 ++++++++++++++++++ certs/frodokem/frodokem1344-req.der | Bin 0 -> 21749 bytes certs/frodokem/frodokem1344-req.pem | 456 +++++++++ certs/frodokem/frodokem1344_pub-spki.der | Bin 0 -> 21541 bytes certs/frodokem/frodokem976-cert.der | Bin 0 -> 16107 bytes certs/frodokem/frodokem976-cert.pem | 338 +++++++ certs/frodokem/frodokem976-key.der | Bin 0 -> 31323 bytes certs/frodokem/frodokem976-key.pem | 655 +++++++++++++ certs/frodokem/frodokem976-req.der | Bin 0 -> 15859 bytes certs/frodokem/frodokem976-req.pem | 333 +++++++ certs/frodokem/frodokem976_pub-spki.der | Bin 0 -> 15653 bytes certs/frodokem/gen_frodokem.c | 241 +++++ certs/frodokem/include.am | 31 + certs/include.am | 1 + certs/renewcerts.sh | 15 + doc/dox_comments/header_files/wc_frodokem.h | 15 +- scripts/asn1_oid_sum.pl | 20 + tests/api/test_frodokem.c | 475 ++++++++- tests/api/test_frodokem.h | 12 +- wolfcrypt/src/asn.c | 353 ++++++- wolfcrypt/src/asn_orig.c | 15 +- wolfcrypt/src/cryptocb.c | 11 +- wolfcrypt/src/port/arm/armv8-frodokem-asm.S | 4 +- wolfcrypt/src/port/arm/armv8-frodokem-asm.asm | 2 +- wolfcrypt/src/port/arm/armv8-frodokem-asm_c.c | 4 +- wolfcrypt/src/wc_frodokem.c | 393 +++++++- wolfcrypt/test/test.c | 133 ++- wolfssl/wolfcrypt/asn.h | 6 +- wolfssl/wolfcrypt/asn_public.h | 3 +- wolfssl/wolfcrypt/cryptocb.h | 9 +- wolfssl/wolfcrypt/memory.h | 6 +- wolfssl/wolfcrypt/oid_sum.h | 36 +- wolfssl/wolfcrypt/settings.h | 2 + wolfssl/wolfcrypt/types.h | 7 +- wolfssl/wolfcrypt/wc_frodokem.h | 24 + 44 files changed, 4958 insertions(+), 66 deletions(-) create mode 100644 certs/frodokem/README.txt create mode 100644 certs/frodokem/frodokem-ca-ecc-cert.der create mode 100644 certs/frodokem/frodokem-ca-ecc-cert.pem create mode 100644 certs/frodokem/frodokem-ca-ecc-key.der create mode 100644 certs/frodokem/frodokem-ca-ecc-key.pem create mode 100644 certs/frodokem/frodokem1344-cert.der create mode 100644 certs/frodokem/frodokem1344-cert.pem create mode 100644 certs/frodokem/frodokem1344-key.der create mode 100644 certs/frodokem/frodokem1344-key.pem create mode 100644 certs/frodokem/frodokem1344-req.der create mode 100644 certs/frodokem/frodokem1344-req.pem create mode 100644 certs/frodokem/frodokem1344_pub-spki.der create mode 100644 certs/frodokem/frodokem976-cert.der create mode 100644 certs/frodokem/frodokem976-cert.pem create mode 100644 certs/frodokem/frodokem976-key.der create mode 100644 certs/frodokem/frodokem976-key.pem create mode 100644 certs/frodokem/frodokem976-req.der create mode 100644 certs/frodokem/frodokem976-req.pem create mode 100644 certs/frodokem/frodokem976_pub-spki.der create mode 100644 certs/frodokem/gen_frodokem.c create mode 100644 certs/frodokem/include.am diff --git a/.wolfssl_known_macro_extras b/.wolfssl_known_macro_extras index f682cdfcd1..4cf3e47732 100644 --- a/.wolfssl_known_macro_extras +++ b/.wolfssl_known_macro_extras @@ -840,6 +840,7 @@ WOLFSSL_EXTRA WOLFSSL_FORCE_OCSP_NONCE_CHECK WOLFSSL_FRDM_K64 WOLFSSL_FRDM_K64_JENKINS +WOLFSSL_FRODOKEM_NO_ASN1 WOLFSSL_FUNC_TIME WOLFSSL_FUNC_TIME_LOG WOLFSSL_GEN_CERT diff --git a/certs/frodokem/README.txt b/certs/frodokem/README.txt new file mode 100644 index 0000000000..a2ea67d0f1 --- /dev/null +++ b/certs/frodokem/README.txt @@ -0,0 +1,42 @@ +FrodoKEM test key material for wolfSSL tests. + +IMPORTANT - these files are NOT generated by OpenSSL. + +FrodoKEM is a Key Encapsulation Mechanism (KEM). Neither OpenSSL nor the +liboqs oqs-provider expose it as a certificate / key-encoding algorithm with +the ISO/IEC 18033-2 key OIDs (arc 1.0.18033.2.2.7.x) that wolfSSL uses - their +FrodoKEM support is KEM-only, for TLS key exchange, and is not going to be +present as a signature/certificate algorithm. So, unlike the ML-DSA material +in certs/mldsa/ (produced with OpenSSL 3.5+), these fixtures are generated by +wolfSSL itself using wc_MakeCert_ex() / wc_MakeCertReq_ex(). + +A KEM public key cannot sign, so the certificate and the request are signed by +an ECC (P-256) issuer key; the FrodoKEM key is only ever the subject public +key. + +Files (material is provided for parameter sets N in {976, 1344}; the 640 set +has no standardised OID and cannot be encoded): + gen_frodokem.c Generator (the "regeneration" tool; see below). + frodokem-ca-ecc-key.der ECC P-256 issuer (CA) private key (DER / PEM). + frodokem-ca-ecc-key.pem + frodokem-ca-ecc-cert.der Self-signed ECC issuer (CA) certificate. + frodokem-ca-ecc-cert.pem + frodokem-key.der FrodoKEM- (SHAKE) private key, PKCS#8. + frodokem-key.pem + frodokem_pub-spki.der FrodoKEM- public key, SubjectPublicKeyInfo. + frodokem-cert.der FrodoKEM- leaf certificate signed by the ECC + frodokem-cert.pem CA (subject key is FrodoKEM, signature is ECDSA). + frodokem-req.der FrodoKEM- certificate request (PKCS#10), + frodokem-req.pem signed by the ECC key. + +Regenerating: + wolfSSL must be built with (at least): + --enable-experimental --enable-frodokem --enable-certgen --enable-certreq + --enable-certext --enable-keygen --enable-ecc + CPPFLAGS="-DHAVE_PKCS8 -DWOLFSSL_DER_TO_PEM" + then: + cc gen_frodokem.c -lwolfssl -o gen_frodokem + (cd certs/frodokem && ./gen_frodokem) + + The keys are generated fresh each run, so the output bytes differ every time; + the committed copies are a stable snapshot for the test suite. diff --git a/certs/frodokem/frodokem-ca-ecc-cert.der b/certs/frodokem/frodokem-ca-ecc-cert.der new file mode 100644 index 0000000000000000000000000000000000000000..631de706f2c8d440fb9e138062ce56f91ddf1c6d GIT binary patch literal 535 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 literal 0 HcmV?d00001 diff --git a/certs/frodokem/frodokem1344-key.pem b/certs/frodokem/frodokem1344-key.pem new file mode 100644 index 0000000000..abf71111ec --- /dev/null +++ b/certs/frodokem/frodokem1344-key.pem @@ -0,0 +1,901 @@ +-----BEGIN PRIVATE KEY----- +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 ++sMIaPVO7XuUuQYkkj1r2DX1pGMWTS8B05HAmef3X+82hD2NLxM2xJH9nJ864IRc +1Msn6hBG0o1lSr62ChQ53l2wRRBdUYX54zU6cxSaX0r3uIjzh+iWQpU3ksrzrtfN +/z9GNYIwR4GbCMHqmWPYUZ0hHJ4NIPpm5SdDDxQX1yPFWKij2pUogToRYMznlOxX +voSK0pwdh0c+r5TJ3bJzzsyhYIw7nYWMfR7mf4OFA2e5vSAHNzrk/YXZ1mP9i/jX +VciF1s4DjvhDywo7lrLMjz7WVOXz5li5VAEb8goXghiY1yiZF99cC9e6Dm5AktCT +A3NXf/Um2iL3W0Egt0krjMq0fcNRk/a2BdEXHlBuDTx2j1s+Ulv5BpY/fUvFvC+0 +2peJr3AmqQeluPmbYG6/X+SQecVcuriZLv11T+DPCpOhtocGMzKt20Ibz0XHk4SO +TdXfvfKW1jw2+1WruEDjrVa+EsM/OrgQ+bfp6jP6KuGyA28c4YDaIog07//Sr4qi +Rwf2j5ULNlwlyV6elAdxU2KI0rhFp1lRa6ioTELn+sSAf0ls82MaQrpCWe4JL/A3 +zclCkuwKPoL25SwXMdxg4GOPR06YYPuvlMIMBuJ5fBtOyM0xN7Fs89kkTYlk+9Et +Pbu+j3XTdY40ygcgqNqjq9miLP29FKV2R7zhRLvWQYB8TOu1/Y487XrmD4janpSn +hfdkEB/h4eFkQA72e6CxxHwKn4bW6gGOg7+xsiV3fEqCd4Dj3kkfBNhI2ROZQAGD +Rd+wUSyh6aw/KwgYyNv5tsXU5MBpEn8+X3E+/////wEAAAD///////8AAAIAAQD/ +//7/AAACAAIA///7////AQABAP//AAABAP////8BAAEA//8CAAAA//8AAP////8C +AP/////+//////8BAAEAAQAAAAAAAwAAAAAAAQABAP3//v8BAAEA/////////v/+ +/wAAAQAAAAEA/////wAA/v8BAAEAAAD//wAAAAD+////AAABAAQAAAAAAP///f// +/wMAAQABAP//AQAAAAMA//8CAP////8AAAEAAAD///7/AAAAAAIAAQAAAAIA/v8C +AP3//v///////f8AAAAA/v8CAAEA//8BAAAAAwACAP7/AQD//////v8AAP7//v8A +AAAAAAABAP7////+/wEAAgABAAAA//8AAAIAAgABAP///P/+/wEA//8CAP//AAAA +AP////////7//f8AAAEA/v/+/wAA////////AAAAAAAAAgAAAAEAAgAAAP3/AAAA +AAAA/////wEAAgACAP//AwD+//////8BAAEAAQACAAMAAAABAAAA//8BAAAAAwAA +AP////////7//f///wIAAAAAAAAAAAAAAAEA//8AAAEA///+/////P////7//f// +/wAA/v///wIAAQAAAAAAAQAAAP//AQACAP7/AQD+/wIABAD///////8BAAIA//8A +AAEA//8AAP////8AAP//AQADAAAAAwAAAAAAAAAAAPz///8AAP7/AQD//wUAAAD/ +/wEA/v/+////AAACAAEAAQD/////AAD+/wIAAgACAP//AQABAP7/AQAAAAAA//// +/wAAAAABAP//AQADAAAAAAAAAP7//v///wAA////////AgD+//3/AAABAPz///// +////AQACAAEA//8AAAIA/////wIAAAAAAP7///8DAP//AgD/////AAAAAAEAAQAA +AP//AQABAAIA/////wEA/v8BAAAA//8BAAMAAQABAP//AAD/////AQAAAP3/AAAC +AAEAAAD//wAA/v///wEAAAABAP7////9//7//f///wAA//8BAAIA/////////v8B +AAEAAgD///7/AAABAAEAAAAAAP7//f8AAAEAAAAAAAEAAAAAAAMAAAACAAIA//// +/wMAAQABAAEA/v8DAAEAAAAAAP//AgD//wEA//8CAAIAAAABAAIA/v8CAAIA/v8A +AP7///8AAAIAAgD//wIAAQAAAAAAAAD//wAAAQD+////AQABAP////8BAAMAAAD/ +/wAA/f8DAAEA/v8BAP//AQD/////////////AgD//wAAAAAAAAEAAQACAAAAAwAB +AAEA//8AAAAAAAD/////AQD/////AAD//wEAAgAAAAAAAAD+/wEAAQABAP7//v// +/wIAAQD//wIAAAAAAAIA//8BAP///v8AAAAAAQABAP7/AAABAAAA//8BAAEA/f// +////AQAAAAIAAgD//wAAAAD+/wAAAAD//wAAAQACAAIAAQD+/wIA//8CAAAA/v8B +AAEAAQD//wEAAAABAAEA//8BAP//AAAAAAAAAAAAAP////8AAP7/AgD//wAAAAAB +AP3/////////AQAAAP//AQAAAAIA/v8BAAIAAQD//wEAAgD//wAA/v8AAAIAAAAA +AP7/AQD//wIAAgD+/wEAAQD//wEA//8AAP//AQD//wIAAQD//wAAAAABAAAAAwAC +AAIAAQABAAIAAAABAP//AQD//wEA/v/+/wEA/v/+/wMAAAABAP7///8BAP//AwAA +AP7/AQAAAAEAAgAAAAAA//8BAP//AAADAAAAAQD+/////v8CAAEA/////////v8C +AAIAAgABAP////8AAAAAAQACAAAA/v8AAAIAAAD+/wAAAgD//wAAAgD+///////+ +/wAAAgD+/wEAAQAAAAEAAAD/////AQD//wIA//8AAAAAAgABAAEAAQADAP//AQD/ +/wAAAQACAAEA////////AQABAAEAAQABAAAAAAAAAP7///8BAP7////+/wIA//8B +AP7/AAAAAP7/AQABAP//AQABAAEA/v/+//7/AgD//////v8AAAIA///9//7////+ +/wAA/v8BAAEAAgABAAAA//8DAAAA/v////7/AgAAAAIA/v8DAP7/AAABAAAA//8A +AAAA/v////7/AAABAAEA/f/+//3/AAAAAP////8AAAAAAQD//wEA//8DAAEAAAAA +AAAA//8AAAIAAgD//wEAAQACAAMA/v8AAAAAAgACAP///v///wIA//8DAP//AAAA +AAIAAAD//wEA/P8BAP//AQD9/wAA//8AAAIAAQABAAEA//8CAAEAAwD//wAAAAD/ +/wIAAwAAAP7/AAD+/wEAAQACAAIAAQABAAAAAAAAAP////8AAAAAAgACAAEAAgD/ +/wMA//8CAP//AQAAAP///v///wIAAAD9/wAA/v8AAAEAAQACAP7//v8BAAIA//8A +AAMAAAABAP//AAAAAAIAAAAAAP////8BAP///v////7/AAD+/wEAAgAAAAIA///+ +//3///8AAAAA//8BAP//AQD+/wEAAAD9//7//v8AAAAAAAAAAAAAAAABAP////// +/wAA/////wMAAQACAAEA//8BAAEAAAABAAAA///+/wEA//8AAP7/AAD+/wEA//8B +AAEAAAD//wEAAQABAAIA/v/8/wEAAgD+////AAD//wIAAAD//wEAAQAAAAAAAQAA +AAAAAAABAAEAAgD+///////+//7/AQACAP//AgACAP7//f8AAAEA/////wIAAQAC +AAAAAAACAP///v//////AAABAP//AQD///7/AAD9//7/AAD//wEAAQAAAP//AAAB +AAAAAAD+/wAAAgADAAAAAQD+/wAAAQD//wIAAgABAP3/AQD//wEAAAAAAP///f// +/wIAAQD/////AAD+//3/AAAAAP7///8AAAAA/f8CAAAA/v8BAP//AQD9////AwD/ +////AAAAAAAAAQD/////AAD///7//v8CAAAAAQD//wEAAAACAAAA///+/wEAAwAA +AAEAAQAAAAAAAAD+//////8BAAAAAgABAP//AQD///////8BAP///v8BAP////8C +AAMA/v8BAAEA//8BAAMAAAAAAAAAAAACAAEA/v8AAAEAAgD/////AQACAP//AQAC +AP7/AAAAAAAA/////wAA/v8BAP7//v8AAAIA/f///wIAAgAAAP//AQAAAAAAAQAA +AP///v8AAAEA/v8AAAAA//8BAAAAAQABAP////////3/AAACAP7//v8AAAAAAwAD +AAIAAQD//wAA/////wMA/v/+//7/AAADAAAAAQD///7///8BAP//AQABAAMAAQAA +AAEAAQABAAAA/f///wIA//8AAAAAAAABAAMAAQABAP7///8AAP//AAACAAAAAQD+ +//7//v8AAAEA///+/wEAAwAAAAEAAQACAP3/AQAAAAEA/v8CAP7//v///wMA/v// +/wAA//8AAAIAAAACAAAAAgAAAP3///8BAAEAAAD//wEA//8AAP7//f8BAAIAAQAA +AP////8BAP7/AAABAAEAAAADAP//AQD+/wAA//8AAP//AAABAAEAAQD///3/AQAA +AAIAAQAAAAEA//8BAP7/AAD/////////////AgD9/wEAAgACAAAAAAABAAAA/v/+ +////AAAAAAEAAAD//wIAAAAAAP//AQAAAAIA///9//7///8BAAEAAQD//wIAAAAB +AP//AQAAAP//AAABAAAAAwABAAEAAQD//wEA/v8AAAEAAQABAAAAAAD+/wAA//8E +AP7///8BAAIAAQD//wAAAAAAAAEA/v8AAAMAAAACAAAAAwADAP7/AAACAAAAAAD9 +//3///8BAAEAAQD8/wAA/v//////AAAAAAEAAQAAAP7//v/+/wAAAgABAP///v8E +AAEA//8BAAAAAAABAAIA/v///wMA//////////8BAAIAAQAAAP///v8CAP7///// +/wAAAAABAAIA/v/9/wEAAgD9/wEA///9////AQAAAAAA//8AAP////8BAAEAAQD/ +////AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAAEAAQAAAAIA/P8AAAEA//8A +AAAAAAAAAAEA/////wEAAAAAAAAAAgABAP//AAABAP//AgAAAAAAAAAAAAQAAQAA +AP///f8AAP//AAD/////AQD///////////7/AAAAAP///v///wEA//8CAAIAAgAC +AAIAAAD//wAAAAD//wAAAQD+/wAAAQABAP//AQACAP/////+////AAACAP7//f// +/wAA//8AAAAAAQD/////AQABAAAAAQABAP//AAAAAAIAAQAAAAMAAQABAP7//v8C +AAEA//8BAP7/AQAAAAAABAAAAP//AAD+////AQACAAMA////////AQABAAAAAAAA +AAAA/f///wAA/////wAAAAD//wAAAgD///////8AAAEA/v8DAP//AAACAAAAAAD+ +/wAA//8AAAIAAgD+/wQAAAAAAAAA/v8AAAEAAwD//wEAAAAAAAIA/v8AAAAAAgAC +AP//AgD//wAAAAAAAP//AgD+/wAA//8AAAAAAgABAAIAAAD+/wEAAAD//wMAAQD/ +/wIAAAD+/wAAAAABAAAAAgABAP3/AAD//wIAAQABAAEA///+/wAAAwAAAP////8A +AAEA/v8CAP//AAACAAIA//8BAAAAAgAAAAAAAgACAAAAAQAAAAAAAQABAAAAAAAB +AP7//v8AAP//AQABAP7/AgAAAAAAAgAAAAEAAAD+////AAD///////8BAP7/AQD+ +////AQD/////AQD//wAAAQAAAAAAAgAAAP7/AAAAAAEAAQAAAAEAAQACAAAA//8A +AP//AAACAP//AAABAAIAAAD//wEAAQACAAAA/v8BAAAABAD///7/AwABAP3/AAAA +AP7//v8BAAIAAAABAP/////+////AAD///7/AAD///3/AQD//wIAAAABAAEAAQD9 +/wMAAQADAAAAAAAAAP//AAABAAEA//8DAAAA/v8BAP/////+/wEAAQACAAAAAwAA +AP///v8BAAIAAAD//wAA/v////3////8/wAAAAD//wEA//8AAP3//v8BAAAAAQAB +AAAAAAD+/wIA/v///wEA/f8CAAEAAQAAAAAAAAABAP//AgAAAAAA/////wAAAgAB +AP//AAD//wAAAAD//wEA//8BAP7///8CAAAAAAD///////////7/AQAAAAAA///+ +/wAAAAAAAP//AAD//wEAAAABAP//AQAAAPz/AAACAAAA/v8AAP//AAD//wAAAgAA +AP/////8////AAABAP3/AQAAAAAA//8CAAAAAQD//wIAAgAAAP//AwAAAP//AQD/ +/wIA//8AAP//AQD+/wAA/v8BAAIAAgD//wEAAgABAAEAAQAAAAAAAQABAAEAAQAA +AAMA//8CAAEAAgAAAP///v///wEAAgD//wAA///+//7///8AAAAA/v8AAAEAAQAA +AAIAAAABAAAAAgAAAAEAAAD+/////////////v8CAP//AQD+/wEAAAD//wEAAAAB +AAEABAD+/wIAAAAAAAEA//8BAAEAAAABAP//AAACAAEA//8BAP7/AwD//wAAAAD+ +/wAA/v8AAP//BAAFAAEA/f///wAAAAABAP//AAACAP/////+/wEAAgD//wEAAQAB +AAEAAQAAAAAA/f8CAAEAAgAAAAAAAQABAAAA/f8CAAAAAAD//wAA//8DAP//AQAB +AAAAAAABAAEA/v8AAP3///8BAAEA/v///wEAAQD//wAAAAACAAEAAwAAAP7///8D +AAAABAD//wEAAQAAAAAAAQABAAEAAQADAP3/AAAAAAAA/v8AAP//AgACAAAA//8A +AAIAAQD+/wAAAAD9/wAAAAAAAP////8AAAAAAAACAAQAAAABAAIAAQACAAEA///9 +/wEAAwABAP//AgD///////8BAP7/AAADAP7//v8AAAMAAAAAAAEA//8AAAAAAQD+ +/wIA/v8BAAEA///////////+/wAA//8CAP7/AAADAAIAAQABAP3/AAACAAAAAAD+ +//z/AAD/////AgD/////AQADAAEAAAD/////AAACAAEA/v8BAAAAAgABAP7/AQAB +AP////8CAP//AQABAP7/AAAAAAIA/v/+/wAA/v8BAAAAAAD+/wEA//8AAAAA/v8A +AAIAAAAAAAAAAgACAAEA/v8BAP3///8BAP3/AQAAAAEAAQABAAEAAwD+/wMAAgAB +AAAAAAACAP7/AAD//wEAAAD//wIAAAD+/wEAAAABAAAAAQD+/wAAAAACAAEAAQD/ +/wEA//8AAP//AAAAAAEAAAAAAAAAAAABAP3//f8CAAAA//8AAAEA/v8AAAEAAAAA +AAAAAQAAAAEAAAAAAP//AAAAAAMAAgAAAAMAAgAAAAIA//8AAP///////wAAAAD+ +//7/AAD//wAAAQABAAAAAgACAP7///8AAAEAAAD9/wEAAAD+/wIA//8DAAAA/v// +//7/AAABAAAAAAAAAAAAAAACAP3/AgAAAP///v///wAAAQABAP//AAAAAP7/AQD+ +////AQD+//////8CAP//AQAAAAAAAQABAAEAAwD/////////////AQABAP7/AQAC +AP//AQAAAAAAAQD//wMA//8DAAAAAAABAAIAAQD//wAA//8AAAIA//8AAP//AwAA +AAAA///9/wAA/////wEA//8BAAEA///+/wMAAQABAAIAAwD//wAAAQADAP3/AQD/ +/wAAAQABAAEA/////wIAAQAAAAIA/v8CAAIAAAD//wEAAgD//wEA////////AAAC +AP7/AQABAAEAAQAAAAIAAAACAAAAAAAAAAAAAgD//wIA//8AAP//AAD//wAAAAAB +AAEA/v8BAAAAAQABAP7///8BAP7//v///wAAAQABAP//AgD+/wEAAQACAAEAAAAB +AP7/AQADAAIAAAAAAAQAAAAAAP///v/+/wAA/v8CAAAAAQD//wAA/v8AAAEA//8B +AP//AAAAAAIAAAAAAAEAAAD//wMAAwACAP3/AgAAAAIAAAD//wEAAgD//wAA///+ +////AAD+/wEAAQAAAAIAAQADAAIA/////wAAAAAAAAAA///+/wAAAQD/////AwAA +AAEA/v/+/wEA/v8AAAEA/v8BAAEAAQAAAP//////////AQACAAAAAAAAAAEAAQAC +AAEAAAABAP//AAADAAEAAAABAAAAAAABAP7///8AAAIAAgAAAP//AAABAP//AwAA +AAEAAAAAAAEAAAABAP////8BAP//AAACAAAAAAABAP///////wAAAAD+//7/AQAA +AAIA//8AAAAA/v8AAAEAAQADAP7/AQAAAP//AAABAAAAAwD9//7//////wIAAwAA +AP7/AQACAP3/AgD//wEA/f8BAAAAAAAAAAAAAwD//wEABAABAAAA//8AAAIAAAAB +AAEAAQAAAAIAAAD9/wIAAAD///7/AAAAAAIAAQACAAEAAgABAP//AQABAP//AAAB +AAEAAwAAAP//AwAAAAAAAQD//wEA///+/wEA//8CAAEAAAABAAAAAgABAAIAAQD+ +/wEA//8AAAQA//8BAP3/AAD9/wEAAAABAAAA/v8CAAEAAgABAP//AQABAP//AgD/ +/wIAAAAAAAAA//8DAAEAAAABAAEAAQD///7//v8AAP/////+/wAABQD9////AQD9 +/wEAAQAAAAAA/f/+/wAAAQADAAAAAQAAAAAAAAD///7/AgABAAEA//8DAAAAAQAB +AP7/AQACAAEA/v8BAAIAAQD+/wEA/f8CAAAAAQABAP3//v8DAAEAAwD+/wMAAAAA +AAEAAAD+/////f//////AAD//wIAAAD+/wAA/v8CAAAAAQAAAAAAAgABAAEAAAD+ +////AQABAP7////+//7/AgAAAAAAAAD9/wEAAgACAAEAAwAAAAAAAQAAAP7/AAAB +AP//AAD7/wIAAwADAP//AAABAAAAAQAAAAAAAQACAP////8AAAAAAQABAAEAAgD8 +/wIAAgAAAAEAAwABAAEA///+//7//f8DAP//AAABAAEAAAABAAEAAwABAAAAAAAA +AAEA//8BAP7//v8AAP//AAAAAAEA/v///wAAAgD//wIAAAD//wAAAQADAAEAAQAA +AP//AgABAAAAAAACAAIA//8EAP7////8//7/AAD//wAA//////////8BAP///v8B +AP//AAACAAEAAQAAAAEAAAAAAAAA/v8AAAEA//8BAAEAAwAAAAEAAQD+/wEA/v8B +AP///f/9/wIAAwAFAP////8AAP//AQAAAAMAAwD/////AQAAAAIAAQACAP3/AgD+ +/wEAAQD/////AAD//wEA///+//////8BAP///v//////AQACAP///v8AAAAAAwAB +AP7/AAD+/wQA//8CAAAAAQABAP//AAABAP/////+/wAA/v8CAP/////+/wAA/v8A +AP//AgAAAAAA//8BAAAAAAAAAP7/AgAAAAAAAAD8/wIAAQD//wIA//8BAAQAAAAC +AAEAAgADAAIA/v//////AAAAAP7/AQABAAEA//8BAP//AAABAP//AQAAAAIA/v8A +AP3/AQD//wEAAgABAAMAAQABAAAAAAABAP//AAABAP//AgD+/wEABAABAP//AAD/ +/wAAAAABAP7///8BAAAAAAD//wEAAwABAP7/AQACAP3///8AAAEAAgAAAAAA/v8B +AAAAAAABAAAAAwACAAEAAQAAAP//AgABAAIAAQACAP//AAD+/wEAAAAAAAEAAQD+ +/wIAAQABAP//AQD+//7/AgAAAP3/AgD//wIA/v8AAP//AAAAAAAAAQAAAAIA/f8B +AP//AQAAAP////8BAP//AgACAAAA//8AAP7/AAADAP//AAD//wEA/v///wAAAAAA +AAEA/v8BAP3/AQABAAAAAgAAAAEAAAD+/wAAAAACAAAAAQAAAAIA//8AAP//AQD/ +/wAABAABAP//AAADAAEAAwACAAAAAgACAAAA/v///wEAAAABAAAAAQABAP//AQD9 +/wAAAgACAAAA/f8AAAAAAAABAAEAAgAAAAEAAAAAAP7//////wAA/f/+/wAA/v8A +AAAAAgD9/wAA///+/wAAAAAAAP3/AQAAAAEAAQAAAAAAAQD///7/AAAAAAIA/v// +/wAAAAAAAAIA/v8BAAAAAQAAAP//AQAAAAAAAQD9/wEAAQABAAAAAgACAAMA/v/+ +/wEAAQD//wAAAAD+/wAAAAD/////AAADAP7/AgAAAP3/AAAAAAAAAQD//wEAAAAD +AAAAAgACAAIAAQAAAP//AAABAP///f8DAAIA//8BAP//AQAFAAEAAgAAAP//AAAB +AAEAAwAAAAAAAAD//wAAAAAAAP//AQD//wAAAAADAAEA/v8AAP//AQABAAAA//8B +AAEAAQAAAAAA/v8DAAAAAQD+/wAAAAD+/wIAAAABAAEA//8AAAAA//8AAAAAAAD+ +////BAABAAMA/P8CAAAAAAACAAEAAAABAAAA///9/wEAAAD8/wIAAwAAAAEA/v8C +AAAA/////wAA/v8AAAAAAwD9/wEAAgACAAIAAQD//wIA/v/+//7///8BAAEA/v8A +AP///f/9////AgD//wAAAAD+/wIAAAD9/wEAAAAAAAAAAgD//wAA/v8BAAAAAwAA +AAQA//8BAAIAAgD+/////v8BAAUA/v///wEAAAABAP7/AQABAP///v///wEA//8A +AP3/AAACAAAAAAD/////AwABAP7/AAABAAEAAQABAP//BAAAAAAAAgABAAEABQD/ +/wEAAAD//wAAAAD+/wAA/////wAAAAD//wIAAQABAAAAAgAAAP//AAAAAAEA//// +//z/AQACAP7/AgD//wEA//8AAAAAAAABAP///v///wIAAAAAAAEAAQAAAAAAAQD/ +//7/AAAAAAAAAQABAAIA//8CAAIAAQAAAP///v8AAP////8DAAAAAgD9/////v8B +AP7/AQAAAAEAAAAAAP///v//////AQACAAAAAAACAP////8BAAAA/v8CAAEAAQAB +AAAA///+////AQABAAEAAQD//wAA/v8AAAAA/v///wEAAQD//wAAAgD+//////// +//////8BAP///////wEAAgABAP//AQAAAAIAAgD//wEA/f/+/wIAAgAAAPz/AgAB +AAAAAAAAAAAA/v8BAP//AAABAAAA/f8BAAAA//8BAP///v8AAAEAAgAAAAEAAAAB +AP//AwACAAEA/f8CAP//AgACAAEAAAAAAAAA//8BAAAAAAD+/wAA//////7/AAD/ +/wEA/v8BAAAA//8BAAAAAgD+/wAAAQAAAAAA//8BAP//AQD///////8AAAEA/f// +//7/AQAAAAAA/v///wMA/v8CAAAA+///////AgD//wAAAAAAAAEAAwABAP7/AAAB +AAEAAAABAAIA//8CAP//AQAAAAAAAAD//wEAAQD//////f/+/wEA///9////AAD/ +/wEA////////AgAAAAEAAgABAAAAAQACAP//AQAAAP//AwD///7/AQAAAAAAAwAB +AP7///8AAP7/AQD+/wAAAAD//wAA//8AAAEAAQD//wAAAQAAAAEAAQD//wEAAAAC +AAEA/f/+/wIAAgABAP7/AAABAAAA///8/wAAAQD//wEAAAD+/wIA//8AAP///v8D +AAEAAAD//wAAAAACAAAA//8BAP//AQABAAEA///+//7/AwD+////AQABAAAAAQD+ +/wIAAAAAAAEAAAAAAAEA//8BAAIA//8AAAEAAQAAAAEA///+////AQABAAEAAwD/ +//7//////wAAAAABAP//AQACAP////8CAAAA////////AQD//wAAAAD///7///// +/wAAAQAAAAEA/////wEAAAD+/wIA/P8CAAMAAQABAAEAAAD//wEA//8CAP///v8B +AAIA/////wIAAAD+/wAAAAABAAEA/v///wAAAQAAAAEA///+/wAAAAADAAEAAwAB +AAEAAAD//wAA//8BAP7//////wAAAQAAAAAAAAACAAAAAQAAAP//AAD+//////// +/wEAAQAAAP//AAABAP7///8DAP//AAABAAIA//8AAP//AgABAAEAAAAAAAEAAAAC +AP//AAACAAAAAQD+/wMA/v8AAAAA//8BAAIA////////AQACAAIA//8AAAEA/v8C +AAAAAQABAAAAAAACAP//AAAAAAAAAAD//wEA/////wAA/v/+/wAAAAAAAAAAAQAA +AAEAAQAAAAEAAgAAAP//AwD+//7/AAAAAP3/AAAAAAAAAgAAAAAAAQACAP///v8A +AAAA/f8BAP7//////wAAAAAAAAEAAAACAAIAAAAAAAEA/v8BAAAA/v8AAAIAAQD9 +////AAABAP3////9/wEAAAABAAEAAAD+////AQAAAAEAAAD+/wIAAAABAAEAAQD9 +//7///8CAAMA//8BAAAA/f///wAA/P8AAP//AwACAAEA/f8BAP//AwABAP7//v8C +AP7/AAD//wAA//8AAAAAAQAAAAEAAAABAAAA//8CAP//AAD+/wIA///9////AwD/ +/wIAAAABAAAAAAAAAAAAAgABAAIA/v8CAAEAAQD//wEAAgD+/wAAAgD///3/AQAA +AP7//f/+/wEAAQACAAEA/v8CAAMAAQABAAAAAAAAAP//AAAAAPz/////////AQD/ +/wMAAgABAAMA/v8AAP//AQABAP3/AQD9/wEAAgACAAAA//8DAAAAAgABAAEA//// +/wAAAAAAAP3/AQD+/wEA/v8AAAAAAAAAAP///v8BAAIA//8AAAEAAwAAAAEAAAAC +AAIA//8AAAAAAAABAP//AgAAAAEA//8AAP///v///wAAAAABAAAAAQD//wIA//// +/wAA/v///wEAAAADAAEAAAD+/////f8AAAAA//8AAP//AQABAAEAAgABAAAAAAD/ +/wEA/////wAAAgACAAIAAAD/////AAAAAP///v8CAAEA//8BAAIAAAAAAAEAAgAB +AP////8AAAIAAAD+/wIAAAD+/wAA///+/wAA//////////8EAAIAAAAAAP3////+ +/wAA/v////7/AQD+/wAAAQABAAIAAQAAAAEA//8BAAAAAAD+/wEA//8AAP////8A +AAIAAAAAAAAAAQD///////8AAAAA//8BAP////8BAP7///8BAAMAAAABAAIAAAAA +AP7/AAD//wAAAwAAAAEAAwABAAEA//8AAAAA/v8AAAIA//8BAAIA///+/////P/+ +/wAAAAD9////AAADAP/////+/////P8BAP7/AAD//wEA/v8AAP//AgAAAAEAAAAB +AAEAAAAAAP///v///wIAAQACAP////8BAAAAAQACAP////8AAP//AQACAAAAAAD+ +/wEAAgABAP7/AAABAP///v8CAP7///8BAP///v8AAAAA//8BAP//AAABAP/////+ +/wEAAwAAAAAA//8BAAAAAAD///7/AAD//////v8AAP7/AAD//wIAAQAAAAAAAQD/ +/wAAAQAAAP//AAABAP7//v/8/wEAAwD//wEA//8CAP//AAAAAAAAAQACAP//AAAB +AAMAAAD//wAA/v8AAAAA/f8AAP///v8CAP3/AQABAP//AQAAAP//AAD+/wAA///+ +//z////+/wIAAAABAAEA///+/wAA//8CAAAAAQACAP7/AAD//wIAAQAAAP//AAAB +AAEA//8AAAEA///+/wIA/////wAAAgD//wIABAD/////AQABAAEAAgD+/wAAAgD/ +/wAAAAAAAAEAAQAAAAEAAQD//wAA//8AAP7/AAACAAAA/v8CAAAA//8AAAEAAgAA +AP7///8AAP3/AgD//wIAAAACAP//AQD+/wEAAAD+/wAAAgABAAAA/v8AAAEAAAD+ +////AwAAAP//AQD//wEAAgAAAP//AQAAAAAA///9/wEAAAD+/wAAAAD//wAAAgAA +AAIAAgD9////AAACAAAAAQD/////AQD+//3/AAD//wEAAwD+/wAAAAD9/wIA//// +/wAAAAAAAP//AQABAP////8AAAEAAAAAAAAAAAABAP//AAABAP//AAD///////// +/wEAAAD+////AgD9/wIA/f8BAAEA//8AAP//AAABAAAAAQAAAP7//f8DAP7///8A +AAAA/v8AAAAA/////wEAAAD//wAAAQAAAAAAAgD/////AQD+/wEAAAABAP//AAD/ +/wAAAAAAAP///v/+/wAAAgD/////AAACAP7/AAAAAAAAAQACAAEAAgD9/wIAAAAA +AP7//f8AAAEAAQABAAIAAAD/////AQD//wEAAwAAAP////8DAAEA/v/9/wAA//8A +AAEAAQAAAAEAAgAAAP//AQD///z/AQD9/wEA/////wAAAQABAAEA//8BAAEA/v8A +AAAAAAD//wMA/v8AAP7/AQD9/wAA//8CAAAAAAABAAAAAwD//wMA/v8BAP//AgD9 +//7///8CAAAAAQABAAAA/v///wEA//8AAAEA//8DAP//////////AAACAAEAAgAC +AP//AQAEAP7/AQAAAP//AAAAAP//AQACAP//AgD+/////v8AAAIA//8AAAEA//8B +AP//AAD//wAA//8AAP//AQD//wAAAAACAAAAAAD+//7///8AAP7//f8AAAAA/f8A +AP///f8AAAMA/v/+////AwACAAEAAQACAP7/AwD//wAAAgAAAAEA/////wEAAQAC +AP3/AAD//wAA//8BAAAAAAAAAP///v8AAAEA//8CAAEAAAABAP//AQD//wEA/v8A +AAAAAQABAP7///8BAAEAAAD//wAA/v///wAA/f/9/wAA///9/wEAAgAAAP//AgAC +AAAAAAD+/wEA//////7/AgD///7/AAABAAIA//8BAAEAAAAAAAEAAAAAAAIA//8A +AAEA//8AAP//AAABAP//AQABAP///v8BAP//AQD//wAAAQD//wIAAAAAAP//AQD+ +/wEAAAAAAAAA/v8AAAEA//8CAP//AQD+//3/AgAAAAMAAAAAAAEAAAABAAAAAgAB +AAAAAQABAAIAAQD+/wEAAwD+/wAAAQABAP///////wEA/v/+/wAAAgD///3/AAAC +AP////8AAP//AwD/////AQABAAAA/v///wIA/v8BAAEA//8CAAIAAgD/////AAAB +AP//AgACAP//AAAAAAEAAgABAP7/AAD//wAAAQACAAAAAQABAP7/AAAAAAEA//8B +AAAAAQABAAIAAAAAAP7/AgAAAAEAAgABAAAAAQACAAEAAAACAAAABAD//wIA//8A +AP//AAABAAEAAAACAAAAAgAAAAAAAAABAP7/AgD+//7/AwAAAP////8AAAAAAQAB +AAAAAgABAAIAAAAAAAAAAQABAAEAAQD+/wAAAAD+/wAAAAACAAAA//8CAAAAAAAB +AAIAAAABAAMAAQD//wAA/v8AAAAAAAAAAP//AQAAAAAA///+/wAAAAAAAP3/AgD/ +/wEA//8CAAAAAAD+/wEAAQAAAAEA/v///wAA//8CAAAAAgD//wUAAgAAAP7/AAD+ +/wAA//8BAP7/AQABAAIAAQABAP/////+/wAAAQAAAAAAAwAAAAEA//8BAP////// +/wAA/v8BAAAAAAAAAP///f/9/wMAAQD+/wAAAgAAAP//AgAAAAEAAQADAP//AAD/ +////AAACAAAA///+/wEA/////wIAAAD/////AAD//wIAAQAAAP///f8AAP3/AAAA +AAEAAAAAAP////8AAAEA/f///wMAAQABAP///v8DAP7///8BAAEAAgADAAAA/v8C +AAEA//8AAAIAAAAAAAAAAAACAAIAAAAAAAAA/v8FAP7///8BAP//AAACAAEAAAD+ +//7/AAD///7/AQADAP///////wIAAgAAAP3/AAACAAAAAgAAAP7/AQD+/wAA/v8C +AAAAAAAAAP/////+//7/AAABAAIAAAD+//7/AQAAAAAA//8AAAEAAQAAAP////// +////AQD+////AQD//////v8DAAIA//////////////7/AAACAAAA/v8BAAAAAQAC +AAAA/////wMA//8AAP//AgAAAAEA//8DAAEAAgD+/wAA///+/wIAAAAAAAEAAAD/ +////AQAAAAEAAQAAAP//AgD//wAAAQABAAAA/v8BAAAAAgABAAAA//8BAP///v8B +AP7/AQABAAAA/v///wEAAAD//wIA/////wEA//8AAAMAAQACAAEAAAD+////AQAA +AP7/AAD+///////+/wAAAgABAAEAAgD///3/AQACAP//AgD//wUA/f8DAP7//v8A +AAMAAQD//wEAAAACAAAAAAD//wEA//8AAP//AQD//wAA//8AAAEAAAABAP////8B +AP//AAD///////8CAAIA//8BAAIAAQABAP/////9/wMAAgACAP7//v8BAAAA//// +/wEAAAABAAEAAAD+/wAA//8AAAAAAQACAAEAAAABAAEAAAD+/wMAAgD+/wAAAQD/ +/wEA//8AAP///v8BAP7//f8CAP7//f///wAAAAD+/wMAAwD8//////8BAAIAAAD/ +/wAAAAD//wAA/f///wAAAAD+/wIAAAABAAIAAAAAAAIA/v///wAAAQACAP7/AAD/ +//7/AQABAP//AAABAAIAAQACAAEAAgD//wQAAQAAAAIAAAABAAIAAQABAAEA///+ +/wEAAQD/////AAAAAAMA//8CAP//AAD//wAAAAAAAP////8BAAAAAwACAP7////+ +//7/AQAAAAIA/f8BAP3//////wMAAgAAAAAA///+//7///8BAP7/AQABAP7///8A +AAEA/v///wAA//8BAP///////wEA/v///wEAAAD//wAAAgABAAAA//8BAAEAAgAB +AAIAAAABAAAAAAABAAAAAQAAAAAAAAABAP//AQAAAP7/AAD+/wEA/v//////AAD/ +////AAADAAIAAgACAAAAAQD9//////8BAAIAAQAAAP7/AwACAP//AQD9///////+ +//7/AgAAAAAAAQABAAEAAQAAAAMAAAABAAIA///8/wEAAQAAAP//AQD+/wEAAgAA +AAIAAAACAP////8AAAIA/f/+/wAAAAABAP7/AQD+/wIA/v8AAP/////+//7//P8C +AAEA//8AAP7//////wAAAAABAAIA//8DAAEA/v////3//v/+/wMA//8AAAAAAgAC +AAMAAAD//wMA///9/wAAAQD///7/AAD//wEA//8BAAAA//8AAP//AQAAAAIAAgD/ +//////////7///8BAAAAAQABAAEA/v8BAAIAAQACAAEAAAABAAMA////////AQAD +AP//////////AAABAAEAAQD///7///8AAAIAAAD+/wAAAQD//wEAAwABAP7/AQAA +AAAA//8BAAQAAAABAAEAAgAAAP//AQD///7/AgAAAAAA/v///wEAAAD8/wIA/v8B +AAAAAAD+/wAAAgADAAAAAwABAAAAAAABAP////8BAAAAAQAAAP//AQABAAEAAAAB +AAEA/v/+/////f8CAP//AAAAAP////////7/AwD//wEAAgABAAAA//8CAAIA//8B +AP3////+/wEA/v8CAAEA//8AAAAAAAD///////8CAAAA/v8AAP//AAD///////// +/wEAAQAAAAAAAAD////////9/wEAAAD//wEAAAD8/wMAAgAAAAMA/v//////AQD9 +/wIAAAAAAAEAAAD+////AAD//wEAAQD9////AAABAP7//v8AAAEAAQD///////8C +AAIA/v8CAAAA//8AAAEA//8AAAIAAAABAP7/AQAAAAAAAAACAAAAAQABAP3/AwAA +AP///v///wAAAQAAAP//AAABAAIA//8CAAIAAQAAAAEAAQACAP7//v8AAAAAAAD+ +//7/AAAAAAAAAAABAP//AgABAP///v8BAP3///8AAAIA/f8CAP3//////wAAAAAC +AAEA/v/+////AgACAP//AQD///7/AAAAAAIAAAABAAAA/////wEAAQAAAAAAAAD/ +/wIA//8AAAEAAAD/////AAAAAAAAAQABAAIA//8BAAAAAgACAAAAAAAAAP///v8B +AAAAAQABAP7///8BAP7/AAACAP///////wAA/v///////f///wEA/v8BAAAAAAAB +AP7/AQD///z//f8AAP//AQAAAP//AAD+////AwACAP//AAABAAEA/////wAAAAAB +AAAA//8CAAEAAAAAAAAAAQD+/wEA/////wEAAQD+/wAA///+/wAAAAD///7/AQD/ +//3/AAABAP7/AQD+/////v////7/AQD+/wAAAwD//wAAAAACAAMA/v/+/wAA//8B +AAEA//8CAAAAAwAAAAAAAQD//wAA//8BAP///v////////8AAAAA/////wMAAgAA +AP///v///wIA/v/+////AQABAAEAAgACAP7/AwADAAAA//8AAP//AAAAAP7///8B +AAEA//8AAAEAAAD///7///8BAAAAAgD//wAA/f8AAAEA//8BAP/////+/////v8A +AAAAAAD//wIA//8BAAEA//8BAAEAAgD/////AAACAP//AAD/////AAAAAP//AAD/ +//////8AAAUAAgABAAEAAgACAAAA/f/+/wEAAAAAAAEAAAAAAP////8BAP7///8C +AP7///8CAP///v/+////AAD//wEA/f8AAP////8AAP//AAD+////AAABAP///P8B +AAAAAAD//wEAAAADAAAAAQD///7//v8BAAAA//8BAAIAAQAAAP//AAD8/wAAAAD+ +////AgAAAP///v8AAP////8CAAMAAQD+/wIAAQACAP7/AAAAAAEA//8BAP//AQD/ +//7/AQABAAAA///+/wEA///+////AQABAAEA//////7/AQAAAAEA/v8BAAAAAgAA +AP///v8AAAAAAQD//wEA/v8AAP////8BAAAAAAACAP7///8BAAAAAAAAAP///f// +/wAAAgAAAP3/AQD//wIA/////wEA///+/////v8EAAAA//8AAP////8AAAIAAQD+ +/wAA/f8BAP///v///wAAAQD+/wMAAQD+/wAA/v8CAAIAAAACAP///v8AAP///f/+ +/wAA//8AAAQAAgAAAAEA/v///////v///wEAAAABAP//AQAAAP//AAD+/wIA//8C +AAAAAQACAAEAAAD9/wEAAAAAAAAAAAACAP3///////z/AAAAAP7/AQD//wEAAAAA +AAEA/v///wAAAgD///7//v8BAP//AQAAAAIAAgD+/wAAAAABAAAA/v8AAAIA//8C +AP//AAABAAEA//8CAAIAAQAAAP//AgD//wAA//8CAAEAAAD/////AAD//wAAAAD/ +////AgABAP////8DAAAA/v/9//7/////////BAABAAIA/v8AAP7/AAABAP7/AQAB +AP//AAABAAAAAQACAAEAAAAAAAIAAAD///z///8CAAAAAAABAAIA//8AAAEA//// +/wAAAAD//wAA/v8AAAEAAAD+/wAA/////wAAAAAAAAIAAAABAAAAAAD+/wAA//8C +AAIAAQAAAAAA/v8BAP///v8AAP//AAABAP//AQAAAAAAAgD///7/AAD//wAAAgAB +AP7//v/9/////v8BAAEAAAABAP//AAD//wAAAAD//wEA/v///wEA//8AAAEA/v8B +AAAAAAACAAIAAAD9////AAABAP///v8CAAEA/v///wAAAQD+/wIAAQD//wAAAAAD +AAAA/v8CAP///////wAA//8AAAIA/v/+/wAA//8AAAAAAAAAAAAA/f/+/wAAAQAC +AAAA/v/+/wEAAAACAP7/AQD//wAAAQAAAAAA//8AAAAA/v////7///8AAAIA/f8A +AAEAAgADAP//AAD9/wEAAQD+/wAAAQADAAEAAAABAAIAAQAAAAAAAAD///7/AQAB +AAEA/v8CAAAAAAD9/wEAAAABAP7/AgABAAMAAgAAAP7/AAAAAP//AAD//wIA//8B +AP//AQD+/wAAAgD+/wMAAAD///3//////////v8AAAMAAAACAP//AQD//wAA//8A +AP7/AAACAAAAAQABAAEA///+//7/AAAAAAAAAQD//wAA/////wEAAQACAAMAAAD/ +/wEA/v8AAP///////wEAAQD//wAAAAAAAAIAAAAAAAAA//8AAAMAAgD+////AQAA +AP7/AQD9/////P8BAP//AAABAP7/AgABAAAA/v/+/wEAAAAAAP//AwAAAAAA//8A +AP7/AQD//wMAAAAAAAIA/f/+/wIAAQD//wEAAQABAP3////+/wEAAAADAP7///8A +AP7/AgAAAP///v8AAAEAAAD+//////8BAAQAAQD+/wAAAAAAAP7//f////////// +/wEAAAAAAAAA/////wEAAwABAP///v8AAAIAAAAAAP////8BAP//AAACAP7/AAAA +AAAAAAACAP3/AgAAAP//AAD/////AQD+/wAA/v8BAP//AAD//wAAAgD+//////8A +AP3/AQABAAAAAQAAAAAAAAAAAAAA//8CAAIAAgABAAAAAQABAAAA//8AAAAA//8B +AAEA////////AQABAAAAAwAAAP//AAD9/wEAAQABAAAAAwABAAEAAQAAAAEA//8A +AAAAAgAAAAAAAQADAP//AQACAAEAAAACAAIA/v8AAAEAAAD//wEAAQD+/wIAAAAA +AP3///8CAP7/AAAAAP7/AAACAAAA//8AAP//AAD/////AwD///3//P8AAP///f8B +AP//AQADAAAA/////wEAAAD///7/AQD9////AAD/////AQAAAP//AgD///3///8B +AAAA//8BAAIAAwACAP////8AAP3/AAAFAP///v8BAAAAAAD+/wMAAgABAP//AAD/ +/wAA/f/+//////8CAAEA//8AAP///v8CAAAAAAAAAP////8CAP7/AwD/////AQAC +AP//AwD+/wAAAQAAAAEA/f8BAAEA//8BAAAAAAD//wAAAQAAAP7//v/9/wEAAAAA +AAEA/v8AAAEAAAD//wIAAQAAAP//AQAAAAAABAABAP/////+/wIA/f8CAAAAAAD9 +/wAAAAABAP7/AgACAAEA///+/wAAAQD//wAAAQACAP////8AAAAAAQABAAEA//8A +AAIAAAD/////AQAAAAIAAgAAAP//AAABAP//AAABAAEAAgD/////AAACAP//AQAA +AP/////+////AQAAAAAAAAABAAEAAQAAAAAA/f///wEA/f8BAAIAAAABAAIA//// +/wAA/v8BAP///v/+///////+/wEAAQACAAEA//8BAP//AQADAP//AAD//wAAAAD9 +//7///8BAAAA//8AAAIA/////wEAAQD///7/AQAAAP7/AAD//wAAAAABAAAA//8A +AP7/AAD+/wEAAwACAAEAAAD/////AQAAAAEAAQAAAP//AwADAAEA//8AAAIAAgD+ +/wAA/v/8/wAA//8BAAIA/v8CAAMA//8CAP7/AQAAAP7//f8BAP7//v8AAAMAAQAB +AAEAAQADAP//AQAAAAIAAQD9/wAA/////wAAAwABAP3/AQAAAAEA/////wIAAQAB +AP///////wEAAQABAAIAAAD+/wIAAAACAP//AAD//wIAAAADAAAAAQAAAAAAAQD/ +/wAA/////wEAAAABAAAA/f8AAAIA/v8AAAEA//8BAAAAAgABAP//AAAEAP//AAAC +AP7/AQABAAAAAQAAAAEAAAABAAEAAAD//wAAAAABAAEAAQAAAAMAAQD//wAA/f8A +AAAAAAD+/wEA//8AAAAAAgABAAEAAAD//wIA//8AAAIAAAAAAAAAAQD+/wAAAQD/ +/wMAAAAEAP///f////////8AAP//AAD+/wEAAQD//wEAAgAAAAIAAAABAAEAAAD/ +/wEA/v8AAP/////+/wEA/v8DAP7///8BAP7/AAAAAAAAAAD+/wAAAAABAAMA//8B +AAAAAgABAAAAAAD///7/AQAAAP//AgABAAEAAAAAAAAAAQABAAIA///9/wEA//// +////AQACAAEAAAD//wMA/v///wEAAQD///7///8AAAEA/v8CAAAA////////AAAB +AP//AQABAAIA///+//z//v/+//3/AQAAAAEABAAAAAAA//8BAAEAAgD8/wAAAAD/ +/wMAAAAAAAAAAgABAAEA/v///wAA//8BAAAAAQACAAEA/f///wEA/f8AAAMA//// +/wAA//8AAAAAAQAAAAEA///+//////8AAAAA/P8CAAIA//8AAP7///8AAP7//v8B +AP3//v///wEAAQAAAAEAAAD//wIAAAABAAEAAQD+/wEAAQADAP//AAD9//////8B +AP//AAD9/wAA//8AAP7/AgD//wIA/////wAAAAD+/wAAAQACAP///////wAA//8A +AAAAAAAAAP7//v8BAAAA///+//7//v///wAAAgABAAAAAAAAAP//AAD+/wAA///9 +////AQAAAAAABAABAAAAAAD9////AAD//wEAAAAAAP7//f8AAAEAAgD//wAAAgAC +AP//AQAAAP7///8AAAAAAgAAAAEA///9////AAACAP7/AAAAAAIAAAABAAAAAQAB +AP///f///wEAAAABAAAAAQD//wAAAAAAAAAA/////wEAAAADAAAAAAD///////8B +AAEAAAD//////////wIAAQD+/wEA//8AAAAA//8CAAMAAQABAAAAAgAAAAAA/v/+ +/wAAAQACAAAAAQABAAMA//////3///8AAP//AAAAAAEAAAAAAAAA/v///wAAAwAA +AAEA//8AAP///////wEAAAD//wAAAAD//wAAAQACAP//AQABAAEA/f/+/wIAAAAB +AP3/AQD/////AQAAAP7/AgAAAAIAAQACAAAA/v///wIAAQAAAP7////+/wEAAQD/ +/wEA//8AAP//AAACAP//AAAAAAAAAgACAP7/AwABAAEAAQD///7/AAACAAAA/v/9 +//z/AQD/////AwAAAAIAAQABAP////8EAAEA/////wIAAgAAAAMAAQD//wEAAQAA +AP///////wEA//8BAP7//v8AAP//AQABAP//AAABAAAAAQAAAAAAAQABAP7/AQAB +AAAAAQABAAAA////////AAABAAAA//8AAAEAAAAAAAEAAAADAAAAAgAAAAAAAwD/ +/wIA///+//7/AAACAAQAAAABAAEAAQD///7/AAABAAAAAAD+//3/AQAAAAAA//// +////AQD/////AQD//wEAAQAAAP7//f8AAAAA///+/wAAAQAAAP//AgABAAIAAQD/ +/wAAAwD///7/AAABAAEAAAD+/wEA/v8CAAEAAQAAAAEAAAAAAAAAAAAAAAIAAQD/ +////AAD//wAAAgABAAEAAgACAAAA/v/+//7/AAD//wAAAgAAAP////8BAAAA//8B +AP///v///wAA//8BAAAAAgD+/wEA/v/+//7/AQD/////AQD///3//v8AAP//AQAB +AAIAAQAAAP//AQAAAAMAAAD+/wAAAQABAP7///////3/AgAAAP//AAAAAAEAAQD/ +/wAAAgD/////AAAEAAAAAAAAAAAAAAD///z/AgABAAAAAgD///7/AwAAAAAAAQAA +AAAAAwD9////AwD//wAAAQACAAAAAgD/////AQAAAAAA//8CAP7//v///wEA/f// +/wAAAgD//wAAAQD//wEAAAAAAP//AQAAAAAAAgD+/wAA//8BAAEAAQABAAQAAQAB +AAEAAQD+/wAAAAAAAAAAAAD//wMA//8BAAEAAQD//wAAAAD//wEA//8AAAAA/v/9 +/////v8AAP3//v///wEA/v/+/wIAAQD/////AAD//wIAAAD///3//v8CAAEA///9 +/wAAAgABAP//AAAAAP///////wAAAgAAAAAAAAD/////AAACAAEAAAADAP//AQAA +AP7/AQAAAAEAAAADAAAAAQD///v///8BAP//AgACAAAAAQABAP//AgABAAIAAQD+ +/wAAAAAAAAAA///9/wEA/P8BAAAA//8AAP////8BAPr/AQAAAAAAAAACAP3///// +/wEA//8CAAIA/////wEA//8BAAAA/////wEAAAD//wEA/v8AAAEAAQD//wMAAgAC +AAIAAQAAAAEAAQD+/wEA//8CAAEAAQD9/wEA//8AAP7///8BAAEA/v8AAP////// +////AAAAAP////8CAP//AgD//wEA/////wAA/v////7/AgAAAAEAAgD7/wAA/v8C +AAEA/f8CAP3//////wAAAAABAAMAAAD//wEAAAD9/wEA///////////+/wAA//// +/wAAAQAAAAIA/v8CAAAA//8AAAEAAQD+////AAD//wEA//8CAAIAAgAAAP///f8B +AP///v///wMA/v8BAP////8BAAEAAAD//wAA/v8BAAMAAgAAAAAA///+/wEA/f// +/wEAAAAAAP//AAD9/wAAAgD///3/AgADAAEAAgAAAAIAAgADAAEAAAAAAAAA//8B +AAAA/v8CAP///v8AAP//AQACAP//AQAAAP//AQD//wEAAAABAAAAAAD+//3/AgAB +AAEAAAABAAAAAgAAAAAA/v8AAP3/AQAAAP//AAD+/wAAAAAAAP7/AQD//wEAAQAB +AAAAAQD//////////wAAAAAAAP7///8CAP3/AQABAAIAAQD//wEAAAABAP//AAD+ +////AQD+/wEA//8BAP//AQABAAAAAQAAAP//AAD//////v8AAP///////wMAAgAA +AAAA/v/9/wAAAQACAAAAAAABAAEA/v8BAP7/AgD//wEAAQAAAP////8BAP7///8A +AAAAAgABAAIAAQD+/wAAAAD//wAAAQAAAAEAAQADAAAAAQD+////AwD+/wAAAwAB +AP7////+////AQADAAAAAQD//wAA/v////z/AAAAAAEAAQACAAEAAQAAAAAAAAD/ +/wIAAwD+/wAA//////////8AAP7/AQAAAP//AQD//wIAAAD//wIAAQAAAAIA//8B +AAEAAQABAP7/AAD//wAAAAACAAAAAAD+////AgD//wEA/f///wAA/v8BAAIAAAAA +AAEA/v8CAP7/AAAAAAIAAQD//wAAAQABAAAAAAD+/wAA/P8AAAAA//8AAAEAAAAD +AAAA//8AAP//AAAAAAIAAQD//wMA/f8BAAEAAAD//wAAAAAAAAAAAAD+/wMA//// +////AAABAAAAAAACAP//AAACAAAA//8BAAEAAQAAAP3/AAABAP//AAD/////AAD+ +/wAAAQD+////AAADAAEA/f8AAP//BAABAAEA/v//////AQAAAAEA/v8AAAEAAwAA +AAIA/f8BAAEAAQABAAAA//8AAAAAAAABAAAAAwAAAAAAAQD9//3/AAD+////AAAB +AAIAAQD+////AAABAAIA/v8CAAQA//8CAAEAAAD+/wEAAQACAAAAAQD/////AQAA +AAEAAAABAAEAAAACAAIAAAAAAAIAAQD/////AwD//wMA////////AAABAAIAAQAA +AAEA/v8BAP7/AAAAAAAAAAABAAEAAAD//wAA//////7/AQD//wAA/P/+//3///// +/wMA//8BAP//AAD+/wEAAAD+////AAACAP///v8AAAIAAQACAAEA/v///wAAAwAC +AP///v8AAAAAAQAAAAAAAAABAAIAAAABAAAAAQAAAP7///8BAP7//////wAAAQAD +AAEAAQACAAAA//8CAAAAAAD+/wEAAAAAAAEAAAAEAAAAAAABAAAA//8CAAAAAwD/ +/wIAAAD+////AQD9/////////wAA//8AAAEAAAACAP//AQD//wAAAAD+////AgD/ +/wEA///+/wAA//8AAP7/AQD//wEAAgABAAIAAQD//wAA/v8AAP7////+////AAAD +AAAA//8BAAAAAgAAAP//AwABAAIAAAABAP//AAAAAP7/AgD//wAA/v8BAAAA/v8B +AP////8BAP//AgACAAEAAAD9/wAABAAAAAEA/v////3/AAABAP//AgD//wEABAAC +AP3////+/wAAAQD//wAA///9/wEA/v/+/wEAAAAAAP///////wEAAAD/////AAD/ +/wEA////////AQD+////AgAAAAIAAQAAAAEAAAACAAAA//8AAP3//v8AAAAAAAD+ +//7/AgD//wIAAwABAAEAAQD+/wEAAAAAAP7////8/////v///wAAAAABAP///f8B +AP//AQADAAAAAQACAAIAAAABAP7/AAD//////v8AAAAAAAAAAAAAAQABAAEAAQAA +AAIAAgABAP//AQAAAP///f8BAAEAAAAAAAEAAAAAAAAA////////AgACAAAA//8C +AP//AAABAP//////////AAACAP7////+//7///8AAAEAAAD+//7/AAD/////AAD+ +/wEA/v8AAAMA/////wAAAQABAAEAAgAAAAAA/////wEAAAAAAP//AQACAAEA//8B +AAIAAQD//wAAAAAAAAEAAAD+/////f8AAAEAAAABAAEA/v/+/wEAAAABAP3/AgAB +AP7/AgD//wEA//8BAP///v///wAA//////3/AQD+////AAAAAAIAAQACAAAAAAAA +AP7/AQAAAP//AgD//wAAAQAAAAIA/f/+/wEA/////wAAAgADAAEAAQD//////f// +////AgABAAAA//8BAP///v8BAAEAAAABAAMAAAD+//7/AgACAAAAAgAAAP////8C +AP7/AAABAAEA//8AAP//AQAAAAAA/f8BAAAAAwD+////AgD//wAA//8CAAAAAQD/ +//3/AgABAP3/AgD/////AgABAP///////wAA///+/wAA/f8BAAIA//8EAAEAAQAA +AAEAAAD+/wAA//8AAAEAAAADAAIAAwD//wAA//8CAAEAAwD+////AAAEAP////8A +AP7/AgAAAP//AAD//////////wEAAgABAP///v///wIAAQAAAAMAAAD//wAAAgD+ +/wEAAQD//wMAAAAAAAAAAgD+//7/AAAAAP7//v///wAA//8DAP////8AAAAAAQD+ +//7/AAAAAAIAAQAAAAAAAAD//wAAAgD//wIAAQABAAAAAAADAAAAAAD+////AQAA +AAEAAAABAP///v8CAP7/AQD/////AQD+/wEAAAD//wEAAgABAAAA/v8AAAAAAQAB +AAIAAAD//wAAAgD//wEAAAD///7////9/wEAAAD//wAAAAADAAEAAAD+/wIAAQAB +AAIA///+/wAAAgAAAP////8DAP////8DAAAAAgAAAAMAAQD+/wAA//////7/AQAC +AP////8AAAAAAAACAP//AAADAAEA/v8AAAEA/////wMA/f8BAAAA/f///wEAAQAC +AAAA///+/wEA/f8AAP///v8BAAIA//8AAAAAAQABAAAA/v8CAP7///8AAAEAAAD/ +/wIAAQAAAP/////9/wEA//8EAAAAAAADAAMAAAD///////8AAAEAAgD//wAAAAAA +AAAAAQAAAAEAAQACAP//AQAAAP/////+/////v8AAP7/AQD//wEAAAABAP7/AQAD +AP//AAACAAAAAQAAAAAAAQACAAEA//8AAP////8BAP////8CAP//AgD//wEAAgAC +APz/AQAAAAEAAQAAAAEAAAABAP////8AAP7/AAAAAP7/AgD//wMAAQABAAEAAAAC +AAIAAgABAAAAAAAAAP7///8BAAEA//8CAAQA//8AAAEAAAABAP7/AgD/////AQAA +AAAAAAD//wIA/f8AAAAA//8AAAEA///9/wEAAAAAAAAAAgABAAEAAAABAP7/AwAA +AAAAAQABAP/////+/wIAAAAAAP//AgD+/wIA//8BAAAAAQADAP7///8AAPz/AAD/ +/wAAAQD//wQAAAACAAAA/v8AAAEA//////3/AQABAAAAAAD+/wAA/v8AAAAA/v8C +AP////8BAAAA/v8BAP//AAD+////AgAAAP//AQAAAAAAAAABAAEAAgAAAAEAAAD/ +/wEAAQD+////AQAAAAAAAQACAP7///8BAP////8AAP3/AgD+/wAA//8AAP7/AAAB +AP//AAD//wAAAQAAAP//AgAAAAEAAQACAP////8DAP////8BAP7///8BAP7///8B +AAAA//8BAAAAAAAAAP////8CAP/////+/wQAAQAAAAEAAAD//wEAAQAAAP////8A +AP//AgACAP////8CAP7/AAACAP///v/+/wEAAAD+/wEA//8AAAAAAQD///////8B +AP//AgAAAAAAAAABAAEAAQAAAAQA/v8CAAAAAgABAAAA/////wEAAAAAAAIAAAAB +AAEA/P////////8BAAAA/////wEA/v8DAAEAAAABAP7/AgAAAP3///8BAP//AAAA +AAAAAgAAAP7///8AAAAAAAAAAAEAAAD//wEA//8AAAIA/f8FAAEAAQACAAAA///9 +/wMAAAAAAAAA/f8EAAAAAQABAAAAAAD/////AQAAAAEAAAADAP//AQAAAP7/AgAA +AAAA///9/wAA///9//7//////wAA/////wEAAAACAAIAAAAAAP//AQD+////AAAB +AP//AQAAAAEAAAD9/wEA///9//z///////7//f8AAAAAAQD9/wIAAQAAAP//AAD+ +/wEAAQD+////AQD9/wEAAAAAAAEA/f///wAAAQD//wAA/v8BAP7/AAD//wEAAAAA +AAAA/v8AAAEAAAAAAAIA/v8BAAEA//8AAAAAAgACAAAAAAAAAAAAAAABAAAAAAD/ +/wIAAQACAAEAAQABAP7//f8BAAAAAAACAP//AAD//wEAAQD//wEA/////wMAAAD/ +/wAAAAABAAAAAAAAAAAAAQABAAEAAQABAAMAAgAAAP///////wEAAAD//wEAAQAC +AAEA//8CAP//AQD//wAA/v8BAAMA/////wMA//8AAP7/AAD//wAA/v8AAAEA//8A +AAEAAgAAAP////8DAAEAAgAAAAAAAgD/////BAAAAP7/AAAAAAMAAAD+/wAAAQAC +AAEA//////7/AQAAAAEA//8AAAAAAQD+/wMAAgACAP///v8AAAAA/v8BAP//AgAB +AP////8AAAAAAwD9/wAA/v8AAP//AAACAP7///8BAAMAAAD//wEA//8AAP7/AQD+ +////AAAAAAEA//8AAP//AAABAAAA///+/wAAAQAAAAIA/f8AAP////////////8B +AAIAAwABAAAAAgAAAAIAAQAAAP7/AAABAP7//v8CAP3///8BAP///v8BAAAAAQD/ +/wAA//8AAP//AwAAAAEAAAABAP//AAAAAAAAAgD//wEAAQABAP////8BAP///v// +////AAAAAAIAAQABAAEA/f8AAAIAAAD//wAA//8BAAEAAAACAAAA///+/wEAAAAC +AP//AAAEAAMA//8BAAEAAAAAAP///////wIAndKFMXeYpEb6aSBcY9flFF/SVign +jfondFBbdh5e2qk= +-----END PRIVATE KEY----- diff --git a/certs/frodokem/frodokem1344-req.der b/certs/frodokem/frodokem1344-req.der new file mode 100644 index 0000000000000000000000000000000000000000..ca13fc039656aef9402d6ee2a290a3aa92edaa83 GIT binary patch literal 21749 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ℑ8NRk%U}>fd8Vnn(z$hQbJLDhb&0jVNjdu-=0%5N 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 Zh{?nv?sk5i5qWg@0bqaiIg{Ya{Xa9uHCX@v literal 0 HcmV?d00001 diff --git a/certs/frodokem/frodokem976-cert.pem b/certs/frodokem/frodokem976-cert.pem new file mode 100644 index 0000000000..1cf46cd608 --- /dev/null +++ b/certs/frodokem/frodokem976-cert.pem @@ -0,0 +1,338 @@ +-----BEGIN CERTIFICATE----- +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 +qBGaP5mHYhcyNEd36e2ZiuTj+ro3933oSD6e +-----END CERTIFICATE----- diff --git a/certs/frodokem/frodokem976-key.der b/certs/frodokem/frodokem976-key.der new file mode 100644 index 0000000000000000000000000000000000000000..1a55b3c812c0dfb1f51d8f24e0e781c1b5630f6a GIT binary patch literal 31323 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�X(& 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 ByQ%;H literal 0 HcmV?d00001 diff --git a/certs/frodokem/frodokem976-key.pem b/certs/frodokem/frodokem976-key.pem new file mode 100644 index 0000000000..9bc2ad369d --- /dev/null +++ b/certs/frodokem/frodokem976-key.pem @@ -0,0 +1,655 @@ +-----BEGIN PRIVATE KEY----- +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 +L9RSkcOqVzzILzH1XD/hnoYE5oMi/Sb57s9pQNyjRbPIHeGyWQXQuDRDyPr05LYL +xV3Hu34UFBDZEeX9HTJAv9nLImrypi+b5t1WwSdQ+6HzfLi9XbZ4utASDQNqXPLY +G770M4j4DPrkSNU6fMHu+bVx27Tjw175yWzsPde/7b2EynbTohLizKjC1Tskg9x7 +KewV6WzPDu4exTBX9RPZDr0HqiHpouBdQEjoXbt91Z7hcBX+/wMAAQABAAQAAAAC +AAAAAwAAAP////8CAAIAAAACAAEAAQABAP//AAD9//z/AwAAAP////8DAP//BQD/ +/////v/+/wQAAgAAAP7////+/wIA/f8AAAQAAQAAAP//AQADAAIABAD9/wAA/P/+ +/wIAAgABAAAABAD//wIA///9/wAAAwACAAAAAAAAAAIA//8BAAAAAQABAAEA//8B +AAEAAgACAAEA/f/9/wIA+P/9/wIAAgD9/wMAAQABAAAA/v8CAP//+//8/wAAAAAC +AAUABgD//wAAAAAAAAAA/f8EAP///v////7/AQABAP3/AwAAAP3/+v8BAAMA///8 +/wMAAAAEAP7/AAABAAEAAQACAAAA//8CAAAA/P8FAAQAAAAAAP7///8DAAEAAgAC +AAUAAgACAAMAAAACAP3/AAD///v//P/+/wUA+//+/wIAAQD/////AgABAP///v/+ +//7//////////v////////8AAAEAAAAEAAAAAgD9/wQAAQADAAMA//8DAP//AAAD +AAAA//8AAPz/BgAAAP3////9/wAABAABAAAA//8AAP3//v/8/wEA/v8FAP7/AgAG +AP7/AQADAAIAAQD//wQAAQADAAEABAD//wAA/v8AAAEAAAD///7/AQD+//7/AQAC +AAAA/v8CAAIABAAAAP//AQACAAEABAABAP3/AwD+/wEAAwADAP//AQAAAAUA/f8E +AAEA//8AAAAAAQABAAEAAAD7/wIA/v8BAAIAAQD///z/BQD///7/AgD+//7//v// +/wEA/f/8/wEA/v8BAP//BAD+//7/AQACAP//AQD///v//P///wEA/P8BAAAAAgD/ +////AQACAAQAAAAAAAEAAgD//wAA/v8AAPr/AQACAP//AQADAAEAAgABAP7/BAAC +AAMA//8BAAEA+v/+////AQABAAAAAgD//wIA/v8BAAIA/v8BAAIA/f/8//v//v8C +AAQA+/8AAAEA///9////AwD//wEAAgD///3/AAD9/wEAAwACAAMAAQD///7/AgD/ +/wMA/f8CAP///f/8/wIAAAACAP7//f8CAP///v8AAAEABAD9//7//v///wMAAAD+ +//7/AAD+//r///8AAAEA/v8BAAEA//8AAAQAAAAAAAAA/f/+/wUAAQD///7/AwD+ +/wIAAQD+/wQA///7//3/AAACAAAA/f8DAAEAAQAAAAEA/f8BAP3/AAD//wIAAgAD +AAAAAAACAP//AQAEAP//AAACAP//AAAAAP7/AwD//wMAAQABAAEA/v8EAP//AwD+ +////AAD8/wAAAAD//wIA/f/9//v///////3//P///wMA/v///wEA/f//////+/8D +AAAAAAD9/wAAAQAAAP7/AAAAAAQA/f8BAP7///////7//v8DAAEAAQD+/wEA//8A +APz//f///wQAAQD7/wIA//8DAP7//v8AAPz/AwAAAAEAAAAAAAIA//8DAP3/BQAE +AP//AwAEAP7///8CAAEAAQADAAEA///+//7/AQD+////AgD+/wEA+//9/wAAAgAB +AP7/BAACAAAAAgD9/////P/+//3//f8BAAIAAQD8/wIA/v8AAP7/AgD//wAAAwAA +AP/////+/wMAAQD8/wEA//8BAPr/AAD+//////8FAP3/AwD///////8FAAEAAgD/ +////BQD+/////f8CAAAAAwD7////AAACAAMA///+/wQAAAD//wAAAAAAAP//AAAD +AP//AQD+/wYAAwAAAP//AgD+/wUA//8CAAEAAgAAAAEA/v///wIAAQD9/wEA//8A +AP//AwABAPb/AgD//wMAAQD8/wIA///+/wMAAQD//wEAAgABAP//AAABAAAAAwD9 +//7//v/+////AAACAAEAAQABAP3/AAADAAEAAwD+/wAAAQD+/wYA/f8CAAIABQD9 +//z//v////3/AQABAAUA///5/wMA/v///wAA//8AAAIAAgD//wAA/f/+/wIAAQD/ +/wAAAAACAAMA//8CAP///f/9/wUA//8BAAEAAwAAAP//AgABAAAAAAD6/wAAAQAC +AP//AAD+/wEAAQD+/wIA/v///wEAAgD/////AgAEAP7/AQADAP3/AQD///7//v// +//3/AAD+/wIAAQD//////v////7//f8CAP//BgAEAAAAAAD9//3/AQABAP//AQD+ +///////+/wIA/P8EAAAABQAAAAEAAQAEAAAA//////7////+/wEA//8BAP///v/+ +/wMA///9/wEAAwAAAAAABgD7//7///8CAP//AAAEAAAA/v8BAAEA/v8BAPv/AgD9 +//v/AQABAAAAAAD9/wUAAgAAAPz//f8AAAAA+//+//v//////wAA/v8CAAEA//8A +APz//f/+//3/AQD9/wAA/v8AAAIA/f8BAAEA/f8BAAMA/////wIA//8EAP///v8A +AAQAAAD//wAAAQD9////AAD//wEAAQAEAAEA//8AAP7/BQADAP//AQD+/wAAAgD+ +/wQAAAADAAAAAAABAAEAAgAAAP3//f////7/AAABAPz//v8AAP7/AQD+/wEAAAAD +AAIAAAACAP//AAABAAMAAQAGAAEA//8AAAMAAgD+/wAA/v8FAAEA+/8CAAAA//8D +AAEAAQAAAP///v/9/wIA/v/9/wAAAgD//wAA+v/+////AwAAAAAA+f/+////AQD8 +/wAA///+//v/AAD///7///8CAAMA/v///wAAAAD7//z//v/+//7///8CAAEABgAB +AP7///8AAP///P/9/wAAAgD+/wIAAAD//wEABAD8/wEA/f/9/////f////z/BAAC +AAEA//8CAAIA//8BAAEA///+/wAAAQAAAP//AgD+////BgD///7/AQD///7/AQD7 +/wIAAAD//wMA+//9//7/AAAFAAEAAwABAAAAAQAEAAMA/f/+/wAA/f///wIA//// +/////v8DAPz/AgAAAAQA/f/+/wAA//8BAAAAAgAEAAMAAAAEAP///f8DAAEAAAD/ +//7/AgD9/////v8BAP3/AgADAAIA//8CAP///v8BAAEAAgAFAAIABQACAAEA//8A +AAAAAAACAAIA/v////r////9/wAAAAAAAP///v/9/wAAAwD///v//v8BAP//AgD/ +/wEA///8//3/AAD//wAAAQAAAAAAAAACAPz/AQACAAUA/v///wAAAQD8/wAAAgAB +AAIAAAD//wAA/v/+/wUAAgABAAEA/v8BAP///P8AAAEAAAAFAP//+////wYAAQAD +AAAA/v8EAAAA//8BAP///f8CAAIAAQABAAMAAAAEAAIA//8EAP3/+//9/wEAAQAB +AP3/AQAFAP3/AwABAAIAAAABAAEAAQABAP//AQACAAEAAAD+/wEAAgD9/wIAAQAA +AP7//v8BAAEAAgD7//7//v/+////AAD+/wIA/P///wMA//8CAP7/AAAAAAAAAAAD +AAMAAAD8//7//v/+/wIAAAABAP7/AAADAAAAAAACAP////8AAP3/AAABAAIAAQAB +AAMA///9/wAAAAD//wIA/////wEA//8AAAMA/v8AAAEAAAD8/wIA/v////3/AAAA +AAEAAAABAP7/AQAAAAQA/P////7/+v/9/wIAAAD//wEA/v/7/wQA/f///wMA/f/+ +////AgD8//7/AgACAAMAAAD9//3//v8BAAAABQD7/wEA/v8CAAAA//8AAP///v8B +AP7/AQAEAAIA///+//3/AQD+/wEAAQD8/wIAAAAFAAEA/v/9//7/AAABAP7/+v/9 +/wQAAgADAAEAAwD+/wAA/f8EAP3/AwD9////AAADAAAAAQD//wYAAgABAAIABQD/ +//3/AgAAAPz//f8DAAIA///+//7//v8DAAQA/v///wUAAAD//wEA/f8FAP3/AQD+ +/////f8CAP7//v8CAP//AQADAP3//P8AAAQA/v8AAP3/AgADAAAAAQD5/wAA//8A +AP7/AgD9/wUAAAD//wAAAgD9//7/AAABAAEA/v8AAAAA/v8BAPz/AwAAAP7/BAD/ +////AQAAAAEAAAD9//z/BwACAP3//////wAAAQAAAPv/AwABAP7//v/7/wAA+v/+ +//3/+/8DAAEAAgACAP7//v/+/wAA/v8CAAAAAgD+/wEABQABAAEAAAD+//7/AAD/ +/wEA/f///wQABAACAPv/AgD9/wQA//8BAAMAAAD//wEA/v8AAPz/AQD9/wMAAAAE +AP7/AwD+/wAA/f8BAAAAAQD+/wIAAQD/////AAACAAIAAQACAP////8BAAEAAAD/ +/wEA/f8CAAAABAD7//3/AgADAAAAAAD//wAAAgABAP7///8BAP3/AQACAAIA/v/+ +/wIAAAD/////AgACAAEA/v8CAP7/BQD/////AQACAAYA//8GAP//BQD//////f/9 +/wEA/f///wQAAQAAAAIA/v8CAPz////7/wAA/v8EAAAA///8////AgD+/wEAAAD9 +//7/AgAAAP3/AAABAP7/AwABAP7///8BAP3/AQADAAAAAwABAAIAAAADAP7/AAD/ +/wAAAAABAAQA////////AQD//wAA/v8CAAEAAwABAP3/AAAAAP7/AgD8//3//f8A +AP7//v8FAAIAAAACAAMA+//7/wAAAAACAP3/AgD9/wUABAD///7///8GAAIA/P8B +AAAABAABAP//AQD+/wEAAAD//wIABwABAAEABAABAAIA+/8BAAEA/v8BAP3/BAD+ +/wAAAQD+/wAAAQAAAP//AQABAAAA/v///wEAAwAAAAEAAQD+/wIAAgADAP//AQD/ +/wEAAAADAAEA/v8CAAAA/f8BAAEAAAAAAAMA/v8CAP////////z///8EAAEAAAAC +AAAAAAD+//3/AAD+////AgD///z/AQABAP//AAD//////v/9//z//v8AAP3/AAAA +AAAAAwD7/wQAAAD//////v8CAAAA/v/7/wAAAQABAP7/AAABAP//AAABAAIA/f// +////AAABAP3//v/+/wAAAgD+//z//v///wMA/v8CAAMAAAD//wEA+/////3/AAD+ +//7/AwABAAAAAQAAAP/////9//3/AAD+/wEA/v/+/wAA/v8EAAAA/f8BAP//+/8D +AAAAAgD+////AwACAP7/AQACAAIAAAD+/wMA/v/8/wAAAAD//wEA///+/wMA/f/+ +////AgACAP3//P8AAP//AwD//wMAAAADAAEAAQADAP///v////3/AgABAAAA//8A +AP7////9//3///8CAAEA/v8CAAAA/v8AAAEAAwAAAAAAAQD//wAA//8BAAAA///9 +//7/AQAAAP///v///wMAAAD+/wIAAgABAAEAAAACAP//AgD9/wAA/v8DAAEAAwAA +AAMAAwACAPv//v/+/wEA/v////7/AgAGAAAA/v/8/wEA/f/9/wIAAQD+/wAABAAB +AP3/AwADAAAAAgAEAAAAAQABAAEAAwD//wAAAQACAAAA/f8AAP3//f///wAA///8 +/wAA/v////z/AgADAAAABAD+////AQD/////AQAAAAIAAQAAAAAA//8AAP7/AgAA +AAEA//8DAAIA///+/wIAAAAAAP3/////////AQD///z/AgD+/wIAAAACAAAAAgD+ +/wIAAgD//wAAAwD9//v///8EAP7//P///////v///wMAAQAAAAMAAAD///7/AAAB +AAIABQAAAP7/AAAEAAEAAAD9//z/AQAAAAIAAQD///3/BAAAAAIA/v////7/BAAA +AAIAAgD9/wAA/v8AAAIAAwACAP7/AQABAP//AwABAP7//f/+//3/AAABAP//AwD+ +/wEA/v8AAAAA/f8BAAIA/f/9//7/AQD8/wEAAwABAAIAAwABAAIAAQD9//7/AgD9 +//7////+/wEA//8CAAAAAQD+/wEAAAABAAIA/f///wAA/v/////////9////AQAG +AAAABAACAAUAAQD//wEAAAD7//7///8EAP//AgD+/wAAAQAEAP7///8BAP3//f8A +AP///v8DAAUAAQABAAEA///+/wEAAgD9//7//v/+/wAAAQACAAIA/v8BAAEAAQAA +AAAAAgD///z/AAD//////v8BAAMAAgD+/wEA/v8CAAAAAAD+//7/AQADAAMA/P8F +AAIA/v8EAP3/AAAAAP//AgAAAAAA///9/wAA/////wQA//8AAP///f8BAP7///8F +AP//AAD///3/AAD///7///8AAP3////+//////8FAAEA/f////7/AwADAP////8B +AAAA/P8BAAAABAD9/wIA/f8CAAIA/P/+/wAAAQAAAP///f8AAPz/AgAAAAEAAgAE +AAQAAAD+/wcA/v8DAP3///8DAPz/AQD9/wAAAAD+/wMABAD+//z///8AAP///f8C +AAIA/v///wQAAQABAAAAAQD//wAAAgADAAEA/f8BAP3/AwADAAAA//8CAP3///8A +APv/AAD//////P/+/wIAAQAEAAAAAAD//wIAAQAAAP///v///wMABAABAAIAAwD+ +////AQACAP7/AQAFAAIA/f///wEA/v/+/wUA/P8BAAQAAQD+/wMA+////wIAAgAC +AAIAAQABAP7/AQD//////v8AAAMAAgAAAP///f8BAAMA/v8AAAAABAD///v/AAD+ +/////P8CAAMA+v8DAP//BAD//wAAAwADAP3/AgD+/wEA+P/+/////f8HAAAA/v8B +AAAA//8AAP3/AQABAAEA/v8AAAUAAQD//wEAAQABAP3//v///wEAAAD//wMAAgD9 +//7/+/8AAAEA/v8BAP//BAD//wYA/v/+//z//f8EAP7///8AAAEA//8BAAEAAAD+ +/wAA/P8AAAQA+v8CAAAA/v8AAP7/AQAAAAAA+v/9/wEAAQD5////BAAEAAMAAgD/ +/wIA//8BAP///f/+//7/BQD9/wAAAQAEAP///v8FAAUAAgAAAP7/AQAAAAAA/v8C +AP7/AQD9//7/AAD+/wAAAwD//wIAAwADAAAAAQAEAAAAAgABAAAAAAD6////BAAC +AAEAAAD9//z////9/wEAAAAAAAEAAAD///////8CAAEAAgAAAAAA/f/+////AAAD +AAIAAQABAAAAAAD//wIABAD+/wAA/////wEA/f8AAAMABAABAP7/AgD///7////9 +/////v8BAAEA/f8CAAMAAgD9//3/AgD+//3///8AAAEA/v8CAP//AAACAP7/AgAC +AAAAAgD+//3/AQABAP////8FAAAA///9//z/AQD+/wEA/P8AAAQAAAABAAEAAAAB +AP//AQAAAP///P8BAAAA/v8CAP//AgACAP//AwABAP7//f8BAAEAAAD9/wMA/v// +/wAAAAAAAAMAAgACAAAAAQD///3/AQD+/wAAAgADAAIAAAD//wIAAwD+/wAAAwAD +AAIA/P/+/wIAAwD//wIAAQAAAAAAAAAAAAAA/f/+//z//f8DAP//AwD///z//v/9 +//7///8BAAEAAgAAAP///f8DAAAAAAABAAIAAwABAAIA/v/+//7/+/8HAAQAAwAC +AP//AAD+/wQAAAD+/wEA/v8AAAQAAwD+/wIA/v/7/wAA//8DAP3/AAD9/wEAAwD/ +//z//////wEAAwD9///////+/wIA///9/wAAAQD///z/AgACAAEAAAAAAAEA///+ +/wAAAgACAP3/AgD//wIA///+/wQA/P8BAAEAAAAFAAEA/v/+////AwD//wAAAgD+ +/wIA/v/+//3/AQADAP7/AQADAAEABQD8//3//v/+//z/AwD9//3/AwD8//7/AAAD +AP7/+/8EAAIAAQAAAP3//v8AAAAA///+/wEAAQABAP//AAD+/wEA///9/wAAAQAA +AAEA/v8FAAIAAwD+////AwAAAAIA/f/9/wIAAAD7/wEA//8AAAIA/v8DAAMAAgAC +AP//AAD9///////+/wAA///9/wAA//8BAAEA/P8AAAEAAQD9/wIA/v/6/wEAAAAE +AP7///8BAAIAAwABAP////////7/AAD//wEAAwAAAP3//f8BAAAAAQABAAIAAAAB +AAAA/v8BAAAAAAD+////AgACAAEAAgD+//r/AAACAAYAAgABAAIAAgD9//3//v8C +AAAA/v/+/wIABAACAAIA//8BAAIAAAD+/wUABgD8/wIAAAABAAQAAgAAAAIAAQD7 +/wIAAAADAP////8DAAAA//8BAP7/AgAAAAMA/v8BAP7////+/wIA/f/+//7////7 +/wMA/f/8//z/AAD////////+//3///8BAAIAAgABAP3//v8DAAAAAAABAAMA/v// +/wMA///+//3/AAABAAEAAAD//wAA//8AAAEAAAD8//7/AgABAAMAAgD///z//P8F +AAAAAQD9/wMAAgD//wEAAQD8//7//v8AAAMA/v8BAP///P/9////9v8DAAEAAQAE +AAAAAAACAAMAAAABAAEAAAADAAMAAgABAP//AAABAAAAAQD///7//P8AAAIAAQAA +AP7//////wMAAAABAAEA//8BAP7///8CAP//AAADAPz//f8DAPz/AwD9/wAAAgAB +AAAA//8CAAEA/f8CAAAABAACAP//AAAFAAIA/v/+//7/AQD+//3/AQD+/////v// +/wIAAwAEAPz/AAD//wMA/f/+/wIAAAD9/wAA//8AAAAABAAEAAIA///+/wEAAgD+ +//3///8AAAEAAAABAAEABAADAPv///8AAP////8AAP3/AQD//wMABAD9/wEAAgD+ +//7/BAD//////P8CAPz///8AAAEA/P/9//////8BAP3///8DAP///v8CAP////8E +AP3/AAD+//v//////wQA/v/9//z/AgAEAAEAAgAAAAEA///9////AQD//////v8A +AP//AwAAAAEA///+/wMAAQD/////AAACAP7/AAD+/wAAAQADAP///v8DAAIABQAB +AAMABAAAAP//AQAAAAIAAgD9/wEA/f8AAAAA/v8AAAEA/v/8//7//v///wUA/f8A +AP7////9/wAAAQAGAP3/AAAEAAEA/f///wIAAgAAAAEAAwD//wUAAwABAPz/AgAD +AP3/BQD+//7//v/9/wAAAgABAAQA/f8CAAIAAwD//wAAAwD///3//P8AAAQAAgAA +AAEABAABAAAA/P///wAA//8BAAMA/f//////AAD///3/AQD+/wEA//8CAAEA/f8C +APz/AAABAAEABAABAAEA//8FAAEAAwAEAP7/AwABAAEA//8DAP7/AgD//wAABAD+ +////AgADAAIA//8BAAEAAAABAAEA//8BAP7/AAACAAMAAgADAP//BgD9/wEA//// +////BQACAAAAAAACAAEAAAABAAMAAAD//wQA///8/wAA/f8AAP///v8CAP7/AAAA +AP//AQD///r/AQD9/wAA///4/wAAAAAAAAIAAAADAAIAAQD//wEAAQD5/wEA/f8C +AAAAAwD+//3//f8AAAMAAwD+/wAAAgACAAEAAgD+/wIA/P///wMAAgABAAEA/f8B +AAQA/////////v///wEA/v/9/wAAAwABAP7/AQAAAP7//v8BAP3/AAD///7/AwD/ +/wUA/P///wEA/f8CAAEA/v8AAP7/AAAAAAMA//8DAP3//f/+//7/AQACAAIA/v8E +AP///v/+/wEAAQD+/wEAAwABAP//AQD//wMAAgAAAAQA//8EAAAAAQD9/wAAAAAA +AAIAAQABAAEA//8CAAIA+/8EAAEABgAAAAEA/P8CAP////8EAP7/AwAAAAEA+v8A +AAEA/f////7/AgACAAAA/v8DAP7/+//+//r//v8BAAIA//8AAPz/AgAAAP3///8E +APz//f8CAP7/AgADAAQAAAABAAQAAQADAAEA/P8EAPz/AgAAAAIABgABAP3/BAAD +AP7/AQAAAP3//P/6/wAAAAD7//3/AQD9/wAAAQD8/wEAAQAAAP7/AgD+/wIAAQD9 +/wMABAABAP///P/9/wQABAD8/wEA/f/+/wYA+f8BAP3/AQACAPz/AAD9/wAAAQAB +AAAAAwABAAMA/v/+/wAABAD8////AgAEAP7/AgD6////AAAAAP//AAABAPz/AgD8 +////BQAEAAIAAAD+//3/AQD///z//P8CAP//AAD9/wMAAAD//wMA/v8CAP3/AAAA +APv//////wEAAQABAAEAAwACAAMA//8EAP//AQD//wAAAwACAP7//////wIAAAAC +AAUA/v8AAP3/AQAAAAMAAAAAAP3/AQAEAAYAAQD9/wIA//8AAAMA/f///wEAAgAA +AAEA/v8CAP3/AwD//wMABAD//wAAAgAAAAIAAAABAP3/AAABAP//AAD//wIA/v8A +AAMAAwADAAAAAQACAP//AAD+////AwACAAEAAAD9//7/AQABAAAAAgD+//7//P8C +AAAAAwADAAAAAgD///7/AQD//wMAAAAAAP//AQADAAAA/v8AAAEAAAACAAIA/P8C +AP7//f8AAAAA//8EAP3//f///wAAAQAAAP7//f/+/wIAAgD9///////+/wAAAgAB +APz///8BAP7/AAABAAIABAAAAP//AQD/////AQABAP///f/+////AQAAAAAAAQAC +AAAAAgD9/wQA/v8BAP7/BQADAAMA/v/+//v/BwACAAIA//////v/AAD9/wQAAAAG +AP//+//+/wEAAwD9/wEA/v8BAP//AwAAAAAA//8DAAAAAgABAP//AQAEAAEAAAAA +AAEA/v8AAAEAAQACAAAAAgACAAAAAAD9/wMAAwACAAAAAQADAAAAAAABAAAA/P// +///////+//3//v8BAP//AwAAAP//BQACAAIAAAABAP3//f8BAP//AwD+//7//P/6 +//3/AgD+/wEAAQAAAP3/AwAAAP7/AQD8////AQD9//7/AAAAAPz/AgD7//7///8E +AP3/AAD8//z/AgAAAAIA///8//7/AQD9/wQAAAD+/wEAAQD9/wQA/v8CAAEAAQD/ +//7/AAD//wAA/f8DAAEAAAADAAAAAgACAP3/AgD9////AAD9/wAA/v8CAAAAAQD/ +/////f8CAPv//f8AAAEA/P8BAAEAAAAAAAQAAQADAP7/AAACAAEAAwACAAIABgAB +AAEA/v8AAAAA/P/+//3/AgADAAMAAwACAP//BgAAAP7/AQACAP3//f///wEA/P// +//3/BAD+/wAABAABAAMAAgADAP7/AQABAAEA+/8CAP7/AQD9/wEABAD8////AgD/ +//3/AwADAP////8AAAMA//8CAAIAAAABAAUA//8BAAAAAAD9////AAD9//3///8A +AAEA/v8AAP///P8BAAQA//8CAAAAAAD+/wEAAQAEAAAA/v8BAP///f8CAAMA+v8B +AAAA///+////AgACAAQAAAABAP3/AQAAAAQA//8CAAEAAgABAAQA/v8AAP7//v8D +AP//AAACAAEAAgD6/wEA///+////+/8BAAEAAAABAP3/AwD9/wAA//8CAAAA//// +//7/AQADAAEABAD9////AAD+/wIAAQD8/wIAAgD8//z/AAD8/////v8AAP7/AAAB +AAUAAgD8/wMA/P/5/wAAAAAFAAEAAAAAAAQAAQACAP7/AQACAAQA/v8BAAQA//8B +AP7/AgAAAP3////+//7/AAABAPv//v8AAPz/+/8BAAAA///+////BQD+/wAAAAD/ +/wEAAwABAP//AAD///z/+v8BAP//AQD//wMA/f8AAAEAAwACAPv/AQAAAAQA/f/8 +/wIA/v8AAAAA/P8CAP7/AwAAAP////8EAAMA/v///wEA/f8DAAIAAAAAAP7//v/+ +/wIAAAD9/wEAAQABAAEA/v8FAP7//v/8/wUAAQACAP7/AAACAAEAAgAAAAEAAQD5 +/////v///wMA//8AAP3/AQAAAP7//v8CAP//AQAFAAAA///8/wAAAgAAAP7/AAD8 +/wEAAAD///7//v8AAAEA/v8CAP3/AgD//wIAAQD+//7/AAD9/////v/9/wQAAgAD +AAAA//8CAPr/AAD///7/AQABAAAAAgABAAMAAgD5/wQA///9/wEA//8AAAcA/f8D +APv/AAD//wEA+/8CAAEA/P/+/wAAAQD//wIAAQACAAMA/v8CAP////8AAP7////8 +/wEAAAD//wAAAQD+/wQA+/8BAAEABQD7//7/BAAAAAEAAQACAAAAAAABAAAAAQD/ +////AAAEAAAA/f/+/wAAAQAAAAEAAgAEAAAABQD///v/AAABAAIA/v/7//z/AQAC +AP7///8BAAAA//8CAAIA//8BAPv/AQD///3/AAACAAAA/v8CAAAA/v8FAP//AAAA +AAAAAAABAP7//v8EAAAA/P///wAAAQD+//7/AQD+/wIA/f8DAAIAAQD+//3/AAAE +AP///P8BAAAA//8AAP//AAD//wIAAQD+/wAAAwAAAAIAAwAAAAEA//8CAAIAAQAH +AAAAAwD9/wEAAAACAP7/AwAAAAMA/f8AAP7/AwD+/wEA+//+//z//P8AAP///f8A +AAEAAAD9//z/AQACAP//AgD///7/AAACAAEAAAAAAAMABAD/////AQAAAAMAAAAA +AAEABAABAAMA///+/wEA/P/9/wIAAgACAAEABQAAAP//AAAEAP////8DAAAAAAAA +AAIAAAABAAEAAgAFAPz/BQADAP7//v///wIAAQACAAAAAwD+/wIAAgD+//7/AAD6 +//3////8/wAA/f8BAPz/AQACAAEA/////wAAAAD8////+/8CAAIA//8EAAMAAQD9 +/wEA//8BAPz////+////AQADAAAA/P8AAPz//f/+/////v///wAAAAAAAAIAAAAB +AAEA//8BAAIABQABAAAAAAACAP3/AgAAAAIA/f/+/wQAAAD+/wIAAgABAP3/AQAA +AAIAAQAAAAMA+/8CAP//AQD//wAAAQAGAAEAAgD+/wAAAAABAAIAAgABAP//AwAA +AAEAAgD+/wAA+//9/wAA//8EAP7/AQD///3/AwACAAUAAAADAAIA//8DAP///f/+ +/wEA//8CAP//AQACAAEA/v8CAPv//P8EAAEA/v/+//v/AQADAAYA///+////AQD9 +//7/AwABAP//AwAEAAAAAAD8/wIA+P8DAAIAAAAEAP//AQADAAAA//8CAPv/AgAB +AAAAAQAAAAEA/v8AAAQAAAAAAAMABQAAAAQABQAAAP7///8CAP//AQABAAAA/v8F +AP/////9//3/BAABAP//BAABAAEAAQACAP7///8AAAAAAgAAAP3/+/8EAAEA//8B +AP3/AQACAAEA/v8DAP//AAABAAAAAgD//wAA/v/8//7//v8BAP3///8BAAYA//8A +AAEAAQAEAAAA/v/9//7//v//////AQD+//3//f8BAP3//v8CAP//AgD+////AgAE +AAAA/v///wAA//8AAAEA/P8BAAAA/////wAABAABAAAAAAD//wIA/v/+/wQA//8B +AAEAAAAAAAAA/v8BAPz/AwADAP7/AAAAAAAAAAAAAAMA/P8AAPv/AAADAAUA/P8A +AAMA/v8BAP3/AgABAAEABAACAP//AwD//wMA/P8BAAQA/v/+/wMA/v8EAP//AAD9 +////AgD9//7//v8CAP///v8CAAEA/v8AAAUAAgD7//z/BAD9//v/AQD7/wQA//8A +AAAAAQAAAAUA/v/+////AwACAPz//P/+/wIA/v8BAAEAAAAAAP7//v8CAPz/AwD9 +/wEAAQAFAP//+P8AAAEA/P///wIAAwD9/wEAAAD8////+v8AAAEAAAACAP////8D +AP7/AwD//wAAAAADAAEABAD/////AQAFAAMAAQD+/wEA/v////v/AQAAAAIAAgD/ +/wAA/f8CAP7/AQABAP7/AQD+/wEAAgD8/wMA/v8DAP7/AAABAAEA//8AAAAAAQAB +AP//AgAEAAAA/v/+/wEA//8CAAIABAACAAAAAgD///////8BAP//BAAAAAEA/v8B +AP3////+//////8AAAEAAgD9//7//f8CAPz/AQD+/wIAAQAAAAMAAgAAAP3//f/+ +////AgADAAIAAAD+//3/AAACAP///v/+/wAA+/8CAP//AAD9/wAA+/8BAAAAAgD/ +/wIAAQADAAEAAQD9////BAAAAAUAAQD//wQAAAAAAAMAAQACAAEA///+//3/BAAF +AP7/AAACAP7////7/wIAAQADAAUAAAABAP3/AwD+/wIA//8AAAUA///+//z///8F +AAQA/P/9/wAAAQD9//z//P8CAAEABAAAAAAA/v8EAP///v8AAPz/AAD//wIAAQAC +AAQA/v/+/wMA//////3//P8BAP7//P8CAAAAAwD+/wEAAQACAAEA/v8DAAIAAQAE +AP7////+/wEAAQACAPz//v8CAP/////7/wIA//8CAP///P//////AwD+/wQABgAA +APv/AgAAAAQA/f8CAAEAAAD//wEAAAD/////AAACAAAA/P///wIA/v//////AQD+ +//7//f8AAAIA/v8AAAIA/v8BAP//AAAAAP//AQACAP//AAD9//7/AAACAAIA/P8C +AAQAAgACAAEAAgD9/wMA//8AAP///f///wMA/v/8/wEA/f8CAAUAAAADAAMAAgD+ +//7/AQAAAAAA/f8EAAIA/f8AAP7/AQAAAAMABAAAAAYA//8AAP7/BAD//wIA/f8A +AAEAAQACAP///v////7//v/8//v//v/9/wMAAgACAAEAAQD8/wEAAgACAAAAAwD9 +/wAAAQAAAP3////////////+////AAACAPz/AAABAAEAAAABAAIABAADAP////8D +AAAAAgD8/wEAAQABAP3/AQD9//7/AQAAAAEABQD+/wUAAQAEAAQAAgABAAUA/v8A +AAEABgAAAP7/+v8BAP3//v/+/wIAAgAAAP///P8CAP///////wUA/f///wQA/P8E +AAIA/v8BAAMA///9//7/AAAAAP3/AgD//wAAAAAEAAAA//8AAP7/AQAAAAAAAAAC +AAAAAgAAAAAA/f8AAP3/AAACAP7/AAABAAQA+//+//3/+/8EAP7/AgABAP3/AgD+ +/wEAAAAAAAEA/////wAAAQABAP//AQADAP//AAADAP//AQAAAPv/AQD9/wIAAgAE +AAIAAAAAAP7//v///wcAAQABAAEAAwAAAAUAAQABAAMA/P8BAP7/AwD//wAAAAAA +AP3/AwACAAEA/f/9//3/AwABAAAAAwAAAAEAAgAEAP7///8CAPv///8AAAMAAAD8 +//3/BAADAAAABAD8/wIAAAAEAPz//v8BAAAAAAABAAEA///+/wIA/f8DAP3/AQD/ +//7/AAACAAMAAAADAP7/AwAAAP//+//9//3/AAD7/wEAAgABAP/////9/wAA/P8D +AP//AQD8/wIABQAFAP7/AQABAAAAAQAGAP//AQD9/wEAAwAEAP///f8AAAEA//8B +AP////8AAAEA///+//3/AwD9//z/AQD8/wEAAQADAP//AQADAAEAAQD9//7///8C +AP7/BQABAAIA/v8GAAAAAAD//wMAAQD//wAA//8BAAAA/v/+//7/AgD9//v/AAAD +AAEAAgABAAEA//8AAAIAAQD///3///8BAP///v8AAP7/BQADAAEA//8CAAAA///6 +/wEAAwACAAIAAgD//////f8AAAEAAQD9/wQA/f8DAAIAAAD//wMAAAABAP//AwAD +AAIAAgACAAIA+/8AAP//AQD+/wAA/f/7/wIABQACAP7/BwD//wIA/v8FAAAA/f8B +AP//AQD//wMAAAD8/wAA/P8AAAIAAQAAAP7//v8AAAEA/f///wIAAwD//wEA/P8D +AAIAAgAEAAMABAD///z/AwACAAEA/v8AAAMAAAAAAAAAAwABAAMAAwABAP//AwAF +AP//AgD+//////8BAP7////6/wMA//8EAAIA/////wQA/v/9/wAAAQD//wMAAQAC +AP7/AgD//wEAAQD9//z//v8CAAEAAAD//wYA/f8EAAQAAAACAAAA/f8CAAAA/f8A +AAEA///8/wEAAAADAP3/BAADAP7/AAAAAP7/AQAAAP////8CAAIA//8CAAAA/v/9 +//3//v8AAP3//v8BAAAA//8BAAEAAAAAAP3/AAABAAMA/v8AAPz/AAD9/////P8F +AAEAAAACAAAABQACAAEAAQACAAIAAQD+/wIA/v///wIAAwD8/wMAAAD//wAAAQD9 +/wMAAAAFAAIABAABAP//BAABAAYA///+//z/AAAAAAIAAgD9/wAABQAAAAAAAgD8 +/wIA//8CAAIAAQD//wEA//8CAAAAAQD9/wAA//8FAAQAAQD8//z////7/wIAAQD+ +////AgADAAAAAgD9//3///8AAP///f//////AwD//wIAAAACAAIA/f/9/wAA//8A +AAAABAAFAAUAAQD+/wIABAD9//3/AAAAAAAAAQACAP/////8/wEAAgABAP///f8C +AAAAAAABAP//AAABAAMA///9/wMA/v/9/wAAAAADAAMAAgABAAEAAgADAAAAAQAB +AP//AQABAAEAAgAEAAEAAAABAAcA/f8AAP3////9/wIAAgABAAIAAgAAAAMAAQAA +AP3//f////3/AAABAP7////+/wAAAAABAAMAAAAAAAEA/v8FAAMAAAD///7/AgAD +AAIA/f/+/wIAAQACAAMA/v8AAPv///8CAP7/AQD8//7/AQD//wEA///8/////f8B +APz/AQAAAP//AQACAAEA/////wAA/f8DAP3///8AAAcA/v8BAAIAAQADAAEA/v/+ +//7/AQAEAAMAAQACAPv/BQAEAAEAAQD+/wAAAAD9//7/AAABAP7//////wIAAQAA +AP///f/8//3//v/9/wAA/P8AAAAAAAD9////AQABAAQAAQACAAAA/f8CAP//AgAA +AP3/AgACAP3///8CAAAABQABAAEA///9/wEAAAD+/wEAAAADAP//AAD8/wAA///+ +/wAAAQAEAAAA/f8BAAEAAgABAAAA///8/wQA/v8DAP3/AgD///////8EAAIAAwAA +AP//AgD//wEA/P8BAAAAAAD+/wEA/v/9//3//////wIAAAD//wMAAQADAP7///8A +AP////8AAAEA//8CAAAAAgAAAPz/BgD//wEA/f8CAP/////+/wMA/////wEAAQAB +AP7/AAAGAAAA+f8AAP////8DAPz/AwD+/////f/9/wEAAAABAP3////+/wEA/v8A +AAMA//8BAPv/AAACAAAA/////wEA///9/wEAAQD/////AgABAAIA/P/+/wIABAD+ +//v//v8DAAAA//8CAP3/AQAEAAAA/v/+/wAA/f///wUABAAAAPz/AQABAP7/AQAA +AP//AwADAAAAAAD+//////8CAP///f/+/wIAAgAAAP3//v/+/wEAAQAFAP///v/+ +/wEA///9/wIAAAADAP//AAADAP///v////3//f/8////BAAAAAEAAAAAAAIA/v8B +AAQAAAAAAP7//P8AAP3/BAD9/wIAAAAAAP/////+/wAA//8BAAMAAgD+/wAAAAAB +AAAAAAD+//3/AgAAAAEABAD5/wAAAAACAAEAAgD//wUAAAABAP//AQACAAEA//8D +AP7/AgAAAP//AQABAAAA//8FAAAA/v8AAP7/AAABAPz//f/+/wAAAgABAAEAAgD+ +/wAAAgAEAAAAAQACAP//AQD9//3/AgABAAIA/v/8//7//v///wEA/v///wIAAQAA +AAIABAD//wAABQD///3/AAAEAAIAAwADAP////8DAAAAAAABAP//AQD//wEA//8A +AAAAAAADAP3/AQD//wMA/v/8////AgAAAP7/AgABAAMAAgACAAAAAAD+////AAD/ +////AwD9/wIAAQD//wMA/v///////v8FAAEA/v8CAAMAAAAFAP//AAADAAIAAgD9 +/wAABAAAAPz/AQAAAP//AQACAPv/BQD9/wEA/v/8//3/AQAAAAEA///8//3//P// +//z/AgADAP///f/+/wMAAAADAP//AAD///7/AAABAAQAAQD8/wIAAAAAAAIA//// +//3/AwACAAIAAQD/////AQD9/wEABgAEAAEA/v///wEAAgABAAIA/f8DAAUA//8A +AP3/AAADAAAAAAABAAEAAAADAAEAAgD+////AQD8/wMAAQD9//7/AgD//wAA//8D +AAAABAD9/////v8AAP7/BAACAAAAAgAAAP3///8AAAEA/////////v/7//3/AAD/ +/wAA/////wMAAQD+/wMAAAAAAAAA/v8AAP//AwAAAAAAAAD//wEAAQD//wEA/P8C +AAAAAQD//wAA/f/+/wIABQAAAAAAAAAAAP3///8BAP7//f8AAAMA//////z//v/9 +//7/AgACAAIA/v8BAAAABAD8//3//f8AAP///////wAA//8AAAQAAgD9/wIAAQD9 +////AgD9/wEAAwD8/wIAAgABAAEAAgADAAIAAgD+/wMA//8BAPr///8BAAAA/P8A +APz//P8BAAMA/f8AAP3/AwAAAPv/AQAFAAEAAQAAAAAABAD+////AAD+//3//v/9 +/wIAAQAAAP7/AAAFAP//////////BAD//wEA///9/wEA/f8CAAAA//8DAP//AgAB +AP7/AAAAAAIAAwAFAAIA/v8DAAMA/v8GAAMAAQAFAPz//v/+//3/AgACAAAA//8C +AP3/AgAAAAAAAwD+/wQAAQAAAP//AAACAAAA///+/////P8AAAEAAwABAAIAAgD/ +/wEAAQD9/wAA+f8AAAAA///8/wAA/f///wUABAACAAIAAAAFAP//AQAGAP7/AAD9 +//3//v////7/AAD//wEA/v/6/wAA/P/+/////v8CAAIAAAAFAAEA//8CAAAA/v/7 +/wEA//8AAP//AgD///7//v///wEAAAD//wQAAgD9/wMA/v8AAAIAAgD+/wAA/f8C +AP7/AgAFAAIA/v8BAAIAAgACAAMAAQD6/wEAAwD6//7/AgD//wEAAQADAP3/AQAA +AAEAAwD6/wAA/f8BAAMA+v8FAAEA/v/+///////8//7/AAAAAP7/AAD+/wEAAAD8 +//7/AwAAAPz//v/+/wIAAAACAAQAAAD+//3/AgAAAAEAAgAAAP//AwD+/wQA//8D +AAIABQD7/////f8CAP3/AQAAAPz/AQAAAP7/BAACAAAA/////wAA/v8CAAIAAQAB +AP////8DAPz/AwD8////AgAAAAIA/f8BAAEAAwD//wEAAgAEAAEA/v8AAAMA///+ +/wAAAgD+/wAA/v8AAAQAAAD//////v8AAAAAAgD+/wQAAAABAP3///8BAPv//v8B +AAIAAAAAAP//AAD//wIAAwD//wAA/f8CAAEA/v8BAAMAAgD7/wEABAAEAAMAAAAA +AP7/AQD7/wQAAAD9/wQABQD+/wIA/f/9/wMA/v/+////AAD+/wAAAgADAP///v8A +AAQA/P8BAP3/AAACAAAAAwD/////AAD//wMAAQABAP//AQD9/wIAAAD/////AgD/ +/wQAAAD//wIAAQAEAAIA/////wMA//8AAAMA//8BAAAABQD+/wMAAQD+/////v// +////AAAEAPz/AgACAP7/AAADAAAA//8CAP7//v////3/AAAAAAUAAwABAAAAAwD+ +/wIA//////7/AQABAAEAAAAAAAEA//8CAAAAAAAAAP3/AQD+/wIAAwD8/////f8B +AAIAAQD///3/AwADAAMA///+/wAA/f8FAAMAAAABAAEA///8/////v8CAP///f/+ +//7//f8AAAAAAAADAP7/AQD//wAAAAD//wMAAQAAAP7///8BAAMAAQACAPz/AQD8 +//7/AAD//////f8BAAAA/f/7/wAA//8AAP//AQABAAAA/v/9/wAA//8CAP7/AwD9 +/wAAAQAAAAAA/////wAA//8AAP///P8FAAUAAgADAAEAAAABAP///f8CAAEAAwAA +APr/AgD///7/BAD9/wEAAgACAP7/BQABAP7/AAD+/wAAAgABAAIA/f/+/wIA//// +/wEAAAD//wEA/P/8//7/AwAAAAIABAAAAAIA//8BAAEAAAD+/////f///wAAAgAB +AAIAAAD//wEAAgD+/wIAAAABAAAAAAD//wAABQAAAP////8CAAIA/v8CAPv/BwAB +AP7//v/+//7/AQABAP3/BQADAAAAAAD//wAAAQACAAMA/v/+/wMAAgAAAAIABAD+ +/wQA/f8CAAMA/v/9////BgAAAP//AAD8/wAAAAAEAAEAAQD8/wEABAABAAMA//8B +AAQAAwACAP7/BQAAAAIAAgAEAAAAAAD+/wIAAQD///v//f/+/////v8CAAIA+/8F +AAIAAwD+/wIAAAADAAAA/f8AAAMA///8//3/AQADAAMAAAD9/wAA/v8AAAIAAAAB +AAAAAAABAAEA///8/////f8BAP//BAAAAAEA/P8AAAAA//8EAP//AAD//wUA/v8A +AP//AgABAP7///8FAP//AAAAAAAAAAAAAAIA/v8AAP3/AAD///7///8DAPr//f/9 +/wYAAQAAAAIAAQAAAAEAAQADAAEA/f8EAP//AQACAP3/AAABAAIAAAD+/wAA//// +//n/BQAAAP3/AwAAAAEA//8CAAAA/v///wAAAQAAAAEAAgACAAEAAQAAAAAAAgAF +AAEAAQAAAAMA/v8CAAIAAwD7/////f/9//3//////wEAAAD8////AgD///7/AAD+ +/wEA6bPwKnb1eCTx5vT1Y+jbN3pRjuL3/79j +-----END PRIVATE KEY----- diff --git a/certs/frodokem/frodokem976-req.der b/certs/frodokem/frodokem976-req.der new file mode 100644 index 0000000000000000000000000000000000000000..6319eaba8a7685d4758bfbf255605ba0d6f9714a GIT binary patch literal 15859 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 LUAukNp5bs6RRFu# literal 0 HcmV?d00001 diff --git a/certs/frodokem/gen_frodokem.c b/certs/frodokem/gen_frodokem.c new file mode 100644 index 0000000000..0ef8bc94f0 --- /dev/null +++ b/certs/frodokem/gen_frodokem.c @@ -0,0 +1,241 @@ +/* gen_frodokem.c + * + * Copyright (C) 2006-2026 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generator for the FrodoKEM test key material in this directory. + * + * FrodoKEM is a KEM, and neither OpenSSL nor the liboqs oqs-provider expose it + * as a certificate/key-encoding algorithm with the ISO/IEC 18033-2 OIDs that + * wolfSSL uses (their FrodoKEM integration is KEM-only, for TLS key exchange). + * These fixtures therefore cannot be produced with OpenSSL the way the ML-DSA + * material is; they are generated by wolfSSL itself using wc_MakeCert_ex() and + * friends. A KEM public key cannot sign, so the certificate and request are + * signed by an ECC (P-256) issuer key. + * + * Material is produced for the 976 and 1344 (SHAKE) parameter sets; 640 has no + * standardised OID and cannot be encoded. + * + * Build against an installed wolfSSL configured with (at least): + * --enable-experimental --enable-frodokem --enable-certgen --enable-certreq + * --enable-certext --enable-keygen --enable-ecc (and HAVE_PKCS8, + * WOLFSSL_DER_TO_PEM) + * + * cc gen_frodokem.c -lwolfssl -o gen_frodokem && (cd certs/frodokem && + * ./gen_frodokem) + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#if !defined(WOLFSSL_HAVE_FRODOKEM) || defined(WOLFSSL_FRODOKEM_NO_ASN1) || \ + !defined(WOLFSSL_CERT_GEN) || !defined(WOLFSSL_CERT_REQ) || \ + !defined(WOLFSSL_CERT_EXT) || !defined(HAVE_ECC) || \ + !defined(WOLFSSL_DER_TO_PEM) +int main(void) +{ + fprintf(stderr, "wolfSSL not built with the features needed to generate " + "the FrodoKEM certificates (see the header comment).\n"); + return 1; +} +#else + +static byte der[45000]; +static byte pem[64000]; +static byte caDer[4000]; + +static int writeFile(const char* name, const byte* data, int len) +{ + FILE* f; + if (len <= 0) { + fprintf(stderr, " %s: nothing to write (%d)\n", name, len); + return -1; + } + f = fopen(name, "wb"); + if (f == NULL) { + fprintf(stderr, " cannot open %s\n", name); + return -1; + } + (void)fwrite(data, 1, (size_t)len, f); + fclose(f); + printf(" wrote %s (%d bytes)\n", name, len); + return 0; +} + +/* Convert DER to PEM and write it, guarding against a bad DER length. */ +static void writePem(const byte* d, int derLen, int pemType, const char* name) +{ + int plen; + if (derLen <= 0) { + fprintf(stderr, " %s: bad DER length (%d)\n", name, derLen); + return; + } + plen = wc_DerToPem(d, (word32)derLen, pem, sizeof(pem), pemType); + writeFile(name, pem, plen); +} + +/* Only set the string fields; wc_InitCert() already zeroed the struct and set + * the per-field ASN encoding types, which must be preserved. */ +static void setName(CertName* n, const char* cn) +{ + XSTRNCPY(n->country, "US", CTC_NAME_SIZE); + n->countryEnc = CTC_PRINTABLE; + XSTRNCPY(n->state, "Montana", CTC_NAME_SIZE); + n->stateEnc = CTC_UTF8; + XSTRNCPY(n->locality, "Bozeman", CTC_NAME_SIZE); + n->localityEnc = CTC_UTF8; + XSTRNCPY(n->org, "wolfSSL", CTC_NAME_SIZE); + n->orgEnc = CTC_UTF8; + XSTRNCPY(n->unit, "Test", CTC_NAME_SIZE); + n->unitEnc = CTC_UTF8; + XSTRNCPY(n->commonName, cn, CTC_NAME_SIZE); + n->commonNameEnc = CTC_UTF8; +} + +/* Generate the key, public SPKI, ECC-signed leaf certificate and ECC-signed + * certificate request for one FrodoKEM parameter set. */ +static int genVariant(WC_RNG* rng, ecc_key* ca, int caLen, int type, + const char* prefix, const char* cn) +{ + FrodoKemKey fk; + Cert cert; + char fn[128]; + int len, body; + + if (wc_FrodoKemKey_Init(&fk, type, NULL, INVALID_DEVID) != 0) { + fprintf(stderr, "FrodoKEM key init failed for %s\n", prefix); + return -1; + } + if (wc_FrodoKemKey_MakeKey(&fk, rng) != 0) { + fprintf(stderr, "FrodoKEM key generation failed for %s\n", prefix); + wc_FrodoKemKey_Free(&fk); + return -1; + } + + /* Private key (PKCS#8) and public key (SubjectPublicKeyInfo). */ + len = wc_FrodoKemKey_PrivateKeyToDer(&fk, der, sizeof(der)); + XSNPRINTF(fn, sizeof(fn), "%s-key.der", prefix); + writeFile(fn, der, len); + XSNPRINTF(fn, sizeof(fn), "%s-key.pem", prefix); + writePem(der, len, PKCS8_PRIVATEKEY_TYPE, fn); + len = wc_FrodoKemKey_PublicKeyToDer(&fk, der, sizeof(der), 1); + XSNPRINTF(fn, sizeof(fn), "%s_pub-spki.der", prefix); + writeFile(fn, der, len); + + /* Leaf certificate signed by the ECC CA. */ + wc_InitCert(&cert); + setName(&cert.subject, cn); + setName(&cert.issuer, "FrodoKEM Test ECC CA"); + cert.sigType = CTC_SHA256wECDSA; + cert.selfSigned = 0; /* issuer is the ECC CA, not the subject */ + cert.daysValid = 36500; /* long-lived test fixture */ + (void)wc_SetSubjectKeyIdFromPublicKey_ex(&cert, FRODOKEM_TYPE, &fk); + (void)wc_SetAuthKeyIdFromCert(&cert, caDer, caLen); + body = wc_MakeCert_ex(&cert, der, sizeof(der), FRODOKEM_TYPE, &fk, rng); + if (body > 0) { + len = wc_SignCert(body, CTC_SHA256wECDSA, der, sizeof(der), NULL, ca, + rng); + XSNPRINTF(fn, sizeof(fn), "%s-cert.der", prefix); + writeFile(fn, der, len); + XSNPRINTF(fn, sizeof(fn), "%s-cert.pem", prefix); + writePem(der, len, CERT_TYPE, fn); + } + + /* Certificate request signed by the ECC key (a KEM cannot self-sign). */ + wc_InitCert(&cert); + setName(&cert.subject, cn); + cert.sigType = CTC_SHA256wECDSA; + cert.version = 0; /* PKCS#10 (RFC 2986) requires version 0 */ + body = wc_MakeCertReq_ex(&cert, der, sizeof(der), FRODOKEM_TYPE, &fk); + if (body > 0) { + len = wc_SignCert(body, CTC_SHA256wECDSA, der, sizeof(der), NULL, ca, + rng); + XSNPRINTF(fn, sizeof(fn), "%s-req.der", prefix); + writeFile(fn, der, len); + XSNPRINTF(fn, sizeof(fn), "%s-req.pem", prefix); + writePem(der, len, CERTREQ_TYPE, fn); + } + + wc_FrodoKemKey_Free(&fk); + return 0; +} + +int main(void) +{ + WC_RNG rng; + ecc_key ca; + Cert cert; + int ret = 0; + int len; + int body; + int caLen = 0; + + if (wc_InitRng(&rng) != 0) { + fprintf(stderr, "RNG init failed\n"); + return 1; + } + + /* ---- Issuer: self-signed ECC P-256 CA ---- */ + if (wc_ecc_init(&ca) != 0) { + fprintf(stderr, "ECC CA init failed\n"); + ret = 1; goto out_rng; + } + if (wc_ecc_make_key(&rng, 32, &ca) != 0) { + fprintf(stderr, "ECC CA key generation failed\n"); + wc_ecc_free(&ca); + ret = 1; goto out_rng; + } + wc_InitCert(&cert); + setName(&cert.subject, "FrodoKEM Test ECC CA"); + cert.sigType = CTC_SHA256wECDSA; + cert.isCA = 1; + cert.selfSigned = 1; + cert.daysValid = 36500; /* long-lived test fixture */ + (void)wc_SetSubjectKeyIdFromPublicKey_ex(&cert, ECC_TYPE, &ca); + body = wc_MakeCert_ex(&cert, caDer, sizeof(caDer), ECC_TYPE, &ca, &rng); + if (body > 0) { + len = wc_SignCert(body, CTC_SHA256wECDSA, caDer, sizeof(caDer), NULL, + &ca, &rng); + caLen = len; + writeFile("frodokem-ca-ecc-cert.der", caDer, len); + writePem(caDer, len, CERT_TYPE, "frodokem-ca-ecc-cert.pem"); + } + len = wc_EccKeyToDer(&ca, der, sizeof(der)); + writeFile("frodokem-ca-ecc-key.der", der, len); + writePem(der, len, ECC_PRIVATEKEY_TYPE, "frodokem-ca-ecc-key.pem"); + + /* ---- FrodoKEM parameter sets with a standardised OID ---- */ + (void)genVariant(&rng, &ca, caLen, WC_FRODOKEM_976_SHAKE, "frodokem976", + "FrodoKEM-976"); + (void)genVariant(&rng, &ca, caLen, WC_FRODOKEM_1344_SHAKE, "frodokem1344", + "FrodoKEM-1344"); + + wc_ecc_free(&ca); +out_rng: + wc_FreeRng(&rng); + return ret; +} + +#endif diff --git a/certs/frodokem/include.am b/certs/frodokem/include.am new file mode 100644 index 0000000000..6c0e1794cd --- /dev/null +++ b/certs/frodokem/include.am @@ -0,0 +1,31 @@ +# vim:ft=automake +# All paths should be given relative to the root +# + +# These are experimental FrodoKEM test fixtures. Distribute them only when +# FrodoKEM is enabled: keeping them out of the default (FrodoKEM-off) tarball +# keeps the single-line $(DISTFILES) that "make dist" passes to the shell under +# the kernel's per-argument limit (MAX_ARG_STRLEN) in out-of-tree builds. +if BUILD_WC_FRODOKEM +EXTRA_DIST += \ + certs/frodokem/README.txt \ + certs/frodokem/gen_frodokem.c \ + certs/frodokem/frodokem-ca-ecc-key.der \ + certs/frodokem/frodokem-ca-ecc-key.pem \ + certs/frodokem/frodokem-ca-ecc-cert.der \ + certs/frodokem/frodokem-ca-ecc-cert.pem \ + certs/frodokem/frodokem976-key.der \ + certs/frodokem/frodokem976-key.pem \ + certs/frodokem/frodokem976_pub-spki.der \ + certs/frodokem/frodokem976-cert.der \ + certs/frodokem/frodokem976-cert.pem \ + certs/frodokem/frodokem976-req.der \ + certs/frodokem/frodokem976-req.pem \ + certs/frodokem/frodokem1344-key.der \ + certs/frodokem/frodokem1344-key.pem \ + certs/frodokem/frodokem1344_pub-spki.der \ + certs/frodokem/frodokem1344-cert.der \ + certs/frodokem/frodokem1344-cert.pem \ + certs/frodokem/frodokem1344-req.der \ + certs/frodokem/frodokem1344-req.pem +endif diff --git a/certs/include.am b/certs/include.am index 97d8bfe75a..0b033848b4 100644 --- a/certs/include.am +++ b/certs/include.am @@ -181,3 +181,4 @@ include certs/lms/include.am include certs/rpk/include.am include certs/acert/include.am include certs/mldsa/include.am +include certs/frodokem/include.am diff --git a/certs/renewcerts.sh b/certs/renewcerts.sh index e0dc5bd010..1a96869565 100755 --- a/certs/renewcerts.sh +++ b/certs/renewcerts.sh @@ -1293,6 +1293,21 @@ EOF echo "---------------------------------------------------------------------" fi + ############################################################ + #### FrodoKEM certificates (generated by wolfSSL) ### + ############################################################ + # FrodoKEM is a KEM, not a signature algorithm, and neither OpenSSL nor the + # liboqs oqs-provider expose it with the ISO/IEC 18033-2 certificate/key + # OIDs that wolfSSL uses - their FrodoKEM support is KEM-only, for TLS key + # exchange, and the liboqs certificate integration is not going to be + # present. So the FrodoKEM test key material cannot be produced here with + # OpenSSL the way the ML-DSA material above is; it is generated by wolfSSL + # itself and shipped pre-built under certs/frodokem/. See + # certs/frodokem/README.txt and certs/frodokem/gen_frodokem.c to regenerate. + echo "Skipping FrodoKEM cert generation (OpenSSL cannot create FrodoKEM" + echo "certificates; they are generated by wolfSSL - see certs/frodokem/)" + echo "---------------------------------------------------------------------" + #cleanup the file system now that we're done echo "Performing final steps, cleaning up the file system..." echo "" diff --git a/doc/dox_comments/header_files/wc_frodokem.h b/doc/dox_comments/header_files/wc_frodokem.h index 6fa6a9c980..b33955f1ac 100644 --- a/doc/dox_comments/header_files/wc_frodokem.h +++ b/doc/dox_comments/header_files/wc_frodokem.h @@ -167,8 +167,9 @@ int wc_FrodoKemKey_MakeKey(FrodoKemKey* key, WC_RNG* rng); WC_FRODOKEM_640_MAKEKEY_RAND_SZ for FrodoKEM-640). \return 0 on success. - \return BAD_FUNC_ARG if key or rand is NULL, or len is not the - length required for the key's parameter set. + \return BAD_FUNC_ARG if key or rand is NULL. + \return BUFFER_E if len is not the length required for the key's + parameter set. \param [in,out] key An initialized FrodoKemKey to hold the generated key pair. @@ -272,8 +273,9 @@ int wc_FrodoKemKey_Encapsulate(FrodoKemKey* key, unsigned char* ct, WC_FRODOKEM_640_ENC_RAND_SZ for FrodoKEM-640). \return 0 on success. - \return BAD_FUNC_ARG if key, ct, ss or rand is NULL, or len is not - the length required for the key's parameter set. + \return BAD_FUNC_ARG if key, ct, ss or rand is NULL. + \return BUFFER_E if len is not the length required for the key's + parameter set. \return BAD_STATE_E if key does not hold a public key. \param [in] key A FrodoKemKey holding a public key. @@ -302,8 +304,9 @@ int wc_FrodoKemKey_EncapsulateWithRandom(FrodoKemKey* key, \return 0 on success (a shared secret is always produced for a correctly sized ciphertext). - \return BAD_FUNC_ARG if key, ss or ct is NULL, or len is not the - ciphertext size for the key's parameter set. + \return BAD_FUNC_ARG if key, ss or ct is NULL. + \return BUFFER_E if len is not the ciphertext size for the key's + parameter set. \return BAD_STATE_E if key does not hold a private key. \return MEMORY_E on allocation failure. diff --git a/scripts/asn1_oid_sum.pl b/scripts/asn1_oid_sum.pl index 04f79235db..6b4cdac4b2 100755 --- a/scripts/asn1_oid_sum.pl +++ b/scripts/asn1_oid_sum.pl @@ -336,6 +336,18 @@ my @slhdsa_shake_256f = (2, 16, 840, 1, 101, 3, 4, 3, 31); my @hss_lms = ( 1, 2, 840, 113549, 1, 9, 16, 3, 17 ); my @xmss = ( 1, 3, 6, 1, 5, 5, 7, 6, 34 ); my @xmssmt = ( 1, 3, 6, 1, 5, 5, 7, 6, 35 ); +# FrodoKEM / eFrodoKEM key OIDs (ISO/IEC 18033-2, arc 1.0.18033.2.2.7.x). +# The old-scheme byte sums (434..441) collide with the SLH-DSA key OIDs, so an +# add_sum offset gives them distinct old-scheme values (100434..100441); the new +# XOR-hash scheme has no collision. Only 976/1344 are standardised (no 640). +my @frodokem_976_shake = ( 1, 0, 18033, 2, 2, 7, 1 ); +my @frodokem_1344_shake = ( 1, 0, 18033, 2, 2, 7, 2 ); +my @efrodokem_976_shake = ( 1, 0, 18033, 2, 2, 7, 3 ); +my @efrodokem_1344_shake = ( 1, 0, 18033, 2, 2, 7, 4 ); +my @frodokem_976_aes = ( 1, 0, 18033, 2, 2, 7, 5 ); +my @frodokem_1344_aes = ( 1, 0, 18033, 2, 2, 7, 6 ); +my @efrodokem_976_aes = ( 1, 0, 18033, 2, 2, 7, 7 ); +my @efrodokem_1344_aes = ( 1, 0, 18033, 2, 2, 7, 8 ); my @keys = ( { name => "ANON", oid => \@anon }, @@ -373,6 +385,14 @@ my @keys = ( { name => "HSS_LMS", oid => \@hss_lms }, { name => "XMSS", oid => \@xmss }, { name => "XMSSMT", oid => \@xmssmt }, + { name => "FRODOKEM_976_SHAKE", oid => \@frodokem_976_shake, add_sum => 100000 }, + { name => "FRODOKEM_1344_SHAKE", oid => \@frodokem_1344_shake, add_sum => 100000 }, + { name => "EFRODOKEM_976_SHAKE", oid => \@efrodokem_976_shake, add_sum => 100000 }, + { name => "EFRODOKEM_1344_SHAKE", oid => \@efrodokem_1344_shake, add_sum => 100000 }, + { name => "FRODOKEM_976_AES", oid => \@frodokem_976_aes, add_sum => 100000 }, + { name => "FRODOKEM_1344_AES", oid => \@frodokem_1344_aes, add_sum => 100000 }, + { name => "EFRODOKEM_976_AES", oid => \@efrodokem_976_aes, add_sum => 100000 }, + { name => "EFRODOKEM_1344_AES", oid => \@efrodokem_1344_aes, add_sum => 100000 }, ); print_sum_enum("Key", "k", \@keys); diff --git a/tests/api/test_frodokem.c b/tests/api/test_frodokem.c index 75df0058db..62cab1429a 100644 --- a/tests/api/test_frodokem.c +++ b/tests/api/test_frodokem.c @@ -32,6 +32,11 @@ #include #include #include + #if defined(WOLFSSL_CERT_GEN) && defined(HAVE_ECC) + #include + #include + #include + #endif #endif #include #include @@ -735,10 +740,11 @@ static const FrodoKemKat frodokem_kats[] = { FKAT_640_AES FKAT_976_AES FKAT_1344_AES FKAT_E640_SHAKE FKAT_E976_SHAKE FKAT_E1344_SHAKE FKAT_E640_AES FKAT_E976_AES FKAT_E1344_AES + { 0 } /* sentinel so the array is never empty */ }; #define FRODOKEM_KAT_CNT \ - ((int)(sizeof(frodokem_kats) / sizeof(frodokem_kats[0]))) + ((int)(sizeof(frodokem_kats) / sizeof(frodokem_kats[0])) - 1) #endif /* !NO_SHA256 && !WOLFSSL_FRODOKEM_NO_MAKE_KEY */ #endif /* WOLFSSL_HAVE_FRODOKEM */ @@ -830,6 +836,9 @@ int test_wc_frodokem_encapsulate_kats(void) } XFREE(ct, NULL, DYNAMIC_TYPE_TMP_BUFFER); + /* key is freed at the bottom of each loop iteration; on the 0-iteration + * allocation-failure path it was never initialised, so only the backing + * memory is released here. */ XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return EXPECT_RESULT(); @@ -876,6 +885,9 @@ int test_wc_frodokem_decapsulate_kats(void) } XFREE(ct, NULL, DYNAMIC_TYPE_TMP_BUFFER); + /* key is freed at the bottom of each loop iteration; on the 0-iteration + * allocation-failure path it was never initialised, so only the backing + * memory is released here. */ XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return EXPECT_RESULT(); @@ -927,6 +939,9 @@ int test_wc_frodokem_roundtrip(void) DoExpectIntEQ(wc_FreeRng(&rng), 0); } XFREE(ct, NULL, DYNAMIC_TYPE_TMP_BUFFER); + /* key is freed at the bottom of each loop iteration; on the 0-iteration + * allocation-failure path it was never initialised, so only the backing + * memory is released here. */ XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return EXPECT_RESULT(); @@ -1014,6 +1029,9 @@ int test_wc_frodokem_encode_decode(void) XFREE(ct, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(skBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(pkBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); + /* The three keys are freed at the bottom of each loop iteration; on the + * 0-iteration allocation-failure path they were never initialised, so only + * the backing memory is released here. */ XFREE(privKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(pubKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); @@ -1101,6 +1119,9 @@ int test_wc_frodokem_decap_implicit_reject(void) DoExpectIntEQ(wc_FreeRng(&rng), 0); } XFREE(ct, NULL, DYNAMIC_TYPE_TMP_BUFFER); + /* key is freed at the bottom of each loop iteration; on the 0-iteration + * allocation-failure path it was never initialised, so only the backing + * memory is released here. */ XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return EXPECT_RESULT(); @@ -1302,11 +1323,13 @@ int test_wc_frodokem_bad_args(void) #endif ExpectIntEQ(wc_FrodoKemKey_EncapsulateWithRandom(NULL, small, small, small, 0), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); - /* NULL ct / ss are rejected independently of key state. */ + /* NULL ct / ss / rand are rejected independently of key state. */ ExpectIntEQ(wc_FrodoKemKey_EncapsulateWithRandom(key, NULL, small, small, 0), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); ExpectIntEQ(wc_FrodoKemKey_EncapsulateWithRandom(key, small, NULL, small, 0), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + ExpectIntEQ(wc_FrodoKemKey_EncapsulateWithRandom(key, small, small, + NULL, 0), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); #ifndef WC_NO_RNG /* Encapsulate rejects a NULL rng in isolation (ct and ss valid). */ ExpectIntEQ(wc_FrodoKemKey_Encapsulate(key, small, small, NULL), @@ -1420,6 +1443,9 @@ int test_wc_frodokem_op_len_checks(void) DoExpectIntEQ(wc_FreeRng(&rng), 0); } XFREE(ct, NULL, DYNAMIC_TYPE_TMP_BUFFER); + /* key is freed at the bottom of each loop iteration; on the 0-iteration + * allocation-failure path it was never initialised, so only the backing + * memory is released here. */ XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return EXPECT_RESULT(); @@ -1496,3 +1522,448 @@ int test_wc_frodokem_not_compiled_in(void) #endif return EXPECT_RESULT(); } + +/* ASN.1 round trip: encode the public key as a SubjectPublicKeyInfo and the + * private key as a PKCS#8 OneAsymmetricKey, decode each back into a fresh key + * object (auto-detecting the type from the OID) and confirm the decoded keys + * still produce matching shared secrets. The 640 parameter sets have no + * standardised OID, so their encoding must be rejected. */ +int test_wc_frodokem_asn1(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) && \ + defined(WC_ENABLE_ASYM_KEY_EXPORT) && \ + defined(WC_ENABLE_ASYM_KEY_IMPORT) && !defined(WC_NO_RNG) && \ + !defined(WOLFSSL_FRODOKEM_NO_MAKE_KEY) && \ + !defined(WOLFSSL_FRODOKEM_NO_ENCAPSULATE) && \ + !defined(WOLFSSL_FRODOKEM_NO_DECAPSULATE) + int i; + FrodoKemKey* key = NULL; + FrodoKemKey* key2 = NULL; + WC_RNG rng; + byte* der = NULL; + byte* ct = NULL; + byte ss[FRODOKEM_MAX_LENSEC]; + byte ssDec[FRODOKEM_MAX_LENSEC]; + int derLen = 0; + word32 idx = 0; + word32 ctLen = 0; + word32 ssLen = 0; + int rngInit = 0; + + XMEMSET(&rng, 0, sizeof(rng)); + key = (FrodoKemKey*)XMALLOC(sizeof(*key), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + key2 = (FrodoKemKey*)XMALLOC(sizeof(*key2), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key2); + der = (byte*)XMALLOC(FRODOKEM_MAX_PRV_KEY_DER_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(der); + ct = (byte*)XMALLOC(FRODOKEM_MAX_CIPHER_TEXT_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(ct); + ExpectIntEQ(wc_InitRng(&rng), 0); + if (EXPECT_SUCCESS()) { + rngInit = 1; + } + + for (i = 0; (i < FRODOKEM_TYPE_CNT) && EXPECT_SUCCESS(); i++) { + int type = frodokem_types[i]; + + ExpectIntEQ(wc_FrodoKemKey_Init(key, type, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_FrodoKemKey_MakeKey(key, &rng), 0); + ExpectIntEQ(wc_FrodoKemKey_CipherTextSize(key, &ctLen), 0); + ExpectIntEQ(wc_FrodoKemKey_SharedSecretSize(key, &ssLen), 0); + + if ((type & FRODOKEM_BASE_MASK) == WC_FRODOKEM_640) { + /* 640 has no standardised OID: encoding must be rejected. */ + ExpectIntEQ(wc_FrodoKemKey_PublicKeyToDer(key, der, + FRODOKEM_MAX_PUB_KEY_DER_SIZE, 1), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + ExpectIntEQ(wc_FrodoKemKey_PrivateKeyToDer(key, der, + FRODOKEM_MAX_PRV_KEY_DER_SIZE), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + wc_FrodoKemKey_Free(key); + continue; + } + + /* Public key: SubjectPublicKeyInfo round trip (auto-detect type). */ + ExpectIntGT((derLen = wc_FrodoKemKey_PublicKeyToDer(key, der, + FRODOKEM_MAX_PUB_KEY_DER_SIZE, 1)), 0); + XMEMSET(key2, 0, sizeof(*key2)); + key2->devId = INVALID_DEVID; + idx = 0; + ExpectIntEQ(wc_FrodoKemKey_PublicKeyDecode(key2, der, (word32)derLen, + &idx), 0); + ExpectIntEQ(key2->type, type); + /* Encapsulate to the decoded public key; original decapsulates. */ + ExpectIntEQ(wc_FrodoKemKey_Encapsulate(key2, ct, ss, &rng), 0); + ExpectIntEQ(wc_FrodoKemKey_Decapsulate(key, ssDec, ct, ctLen), 0); + ExpectIntEQ(XMEMCMP(ss, ssDec, ssLen), 0); + wc_FrodoKemKey_Free(key2); + + /* Private key: PKCS#8 round trip; decoded key can decapsulate. */ + ExpectIntGT((derLen = wc_FrodoKemKey_PrivateKeyToDer(key, der, + FRODOKEM_MAX_PRV_KEY_DER_SIZE)), 0); + XMEMSET(key2, 0, sizeof(*key2)); + key2->devId = INVALID_DEVID; + idx = 0; + ExpectIntEQ(wc_FrodoKemKey_PrivateKeyDecode(key2, der, (word32)derLen, + &idx), 0); + ExpectIntEQ(key2->type, type); + ExpectIntEQ(wc_FrodoKemKey_Encapsulate(key, ct, ss, &rng), 0); + ExpectIntEQ(wc_FrodoKemKey_Decapsulate(key2, ssDec, ct, ctLen), 0); + ExpectIntEQ(XMEMCMP(ss, ssDec, ssLen), 0); + wc_FrodoKemKey_Free(key2); + + /* Strict validation: decoding this key's DER into a key that was + * initialized as a DIFFERENT variant must be rejected. */ + { + int j; + int other = -1; + + for (j = 0; j < FRODOKEM_TYPE_CNT; j++) { + if ((frodokem_types[j] != type) && + ((frodokem_types[j] & FRODOKEM_BASE_MASK) != + WC_FRODOKEM_640)) { + other = frodokem_types[j]; + break; + } + } + if (other != -1) { + ExpectIntGT((derLen = wc_FrodoKemKey_PublicKeyToDer(key, der, + FRODOKEM_MAX_PUB_KEY_DER_SIZE, 1)), 0); + ExpectIntEQ(wc_FrodoKemKey_Init(key2, other, NULL, + INVALID_DEVID), 0); + idx = 0; + ExpectIntNE(wc_FrodoKemKey_PublicKeyDecode(key2, der, + (word32)derLen, &idx), 0); + wc_FrodoKemKey_Free(key2); + } + } + + /* A truncated/corrupted DER must be rejected, not over-read. */ + ExpectIntGT((derLen = wc_FrodoKemKey_PublicKeyToDer(key, der, + FRODOKEM_MAX_PUB_KEY_DER_SIZE, 1)), 0); + XMEMSET(key2, 0, sizeof(*key2)); + key2->devId = INVALID_DEVID; + idx = 0; + ExpectIntNE(wc_FrodoKemKey_PublicKeyDecode(key2, der, + (word32)derLen / 2, &idx), 0); + wc_FrodoKemKey_Free(key2); + + wc_FrodoKemKey_Free(key); + } + + /* NULL-argument checks. */ + idx = 0; + ExpectIntEQ(wc_FrodoKemKey_PublicKeyToDer(NULL, der, 16, 1), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + ExpectIntEQ(wc_FrodoKemKey_PrivateKeyToDer(NULL, der, 16), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + ExpectIntEQ(wc_FrodoKemKey_PublicKeyDecode(NULL, der, 16, &idx), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + ExpectIntEQ(wc_FrodoKemKey_PrivateKeyDecode(NULL, der, 16, &idx), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + + if (rngInit) { + DoExpectIntEQ(wc_FreeRng(&rng), 0); + } + XFREE(ct, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key2, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +/* Key-file I/O: a FrodoKEM key flows through the generic PUBLIC KEY / PKCS#8 + * PRIVATE KEY PEM containers (DER->PEM->DER round trip), and wc_GetKeyOID + * recognizes a FrodoKEM private-key DER. */ +int test_wc_frodokem_key_pem(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) && \ + defined(WC_ENABLE_ASYM_KEY_EXPORT) && \ + defined(WC_ENABLE_ASYM_KEY_IMPORT) && \ + defined(WOLFSSL_DER_TO_PEM) && defined(WOLFSSL_PEM_TO_DER) && \ + (defined(WOLFSSL_CERT_EXT) || defined(WOLFSSL_PUB_PEM_TO_DER)) && \ + !defined(WC_NO_RNG) && !defined(WOLFSSL_FRODOKEM_NO_MAKE_KEY) + int i; + FrodoKemKey* key = NULL; + FrodoKemKey* key2 = NULL; + WC_RNG rng; + byte* der = NULL; + byte* der2 = NULL; + byte* pem = NULL; + int rngInit = 0; + int derLen; + int der2Len; + int pemLen; + word32 idx; + const word32 dersz = FRODOKEM_MAX_PRV_KEY_DER_SIZE; + const word32 pemsz = FRODOKEM_MAX_PRV_KEY_DER_SIZE * 2; + + XMEMSET(&rng, 0, sizeof(rng)); + key = (FrodoKemKey*)XMALLOC(sizeof(*key), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + key2 = (FrodoKemKey*)XMALLOC(sizeof(*key2), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key2); + der = (byte*)XMALLOC(dersz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(der); + der2 = (byte*)XMALLOC(dersz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(der2); + pem = (byte*)XMALLOC(pemsz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(pem); + ExpectIntEQ(wc_InitRng(&rng), 0); + if (EXPECT_SUCCESS()) { + rngInit = 1; + } + + for (i = 0; (i < FRODOKEM_TYPE_CNT) && EXPECT_SUCCESS(); i++) { + int type = frodokem_types[i]; + + if ((type & FRODOKEM_BASE_MASK) == WC_FRODOKEM_640) { + continue; + } + + ExpectIntEQ(wc_FrodoKemKey_Init(key, type, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_FrodoKemKey_MakeKey(key, &rng), 0); + + /* Public key: DER -> PEM (PUBLIC KEY) -> DER -> decode. */ + ExpectIntGT((derLen = wc_FrodoKemKey_PublicKeyToDer(key, der, dersz, + 1)), 0); + ExpectIntGT((pemLen = wc_DerToPem(der, (word32)derLen, pem, pemsz, + PUBLICKEY_TYPE)), 0); + ExpectIntGT((der2Len = wc_PubKeyPemToDer(pem, pemLen, der2, dersz)), 0); + ExpectIntEQ(der2Len, derLen); + ExpectIntEQ(XMEMCMP(der, der2, (size_t)derLen), 0); + XMEMSET(key2, 0, sizeof(*key2)); + key2->devId = INVALID_DEVID; + idx = 0; + ExpectIntEQ(wc_FrodoKemKey_PublicKeyDecode(key2, der2, + (word32)der2Len, &idx), 0); + ExpectIntEQ(key2->type, type); + wc_FrodoKemKey_Free(key2); + + /* Private key: PKCS#8 PEM round trip. */ + ExpectIntGT((derLen = wc_FrodoKemKey_PrivateKeyToDer(key, der, + dersz)), 0); + ExpectIntGT((pemLen = wc_DerToPem(der, (word32)derLen, pem, pemsz, + PKCS8_PRIVATEKEY_TYPE)), 0); + ExpectIntGT((der2Len = wc_KeyPemToDer(pem, pemLen, der2, dersz, + "")), 0); + XMEMSET(key2, 0, sizeof(*key2)); + key2->devId = INVALID_DEVID; + idx = 0; + ExpectIntEQ(wc_FrodoKemKey_PrivateKeyDecode(key2, der2, + (word32)der2Len, &idx), 0); + ExpectIntEQ(key2->type, type); + wc_FrodoKemKey_Free(key2); + + wc_FrodoKemKey_Free(key); + } + + if (rngInit) { + DoExpectIntEQ(wc_FreeRng(&rng), 0); + } + XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(der2, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key2, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +/* X.509: build a certificate carrying a FrodoKEM subject public key (signed by + * an ECC issuer key, since a KEM cannot self-sign), then parse it back and + * confirm the FrodoKEM subject key is recognized. */ +int test_wc_frodokem_x509(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) && \ + defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_ASN_TEMPLATE) && \ + defined(HAVE_ECC) && \ + defined(WOLFSSL_WC_FRODOKEM_976) && defined(WOLFSSL_FRODOKEM_SHAKE) && \ + !defined(NO_SHA256) && !defined(WC_NO_RNG) && \ + !defined(WOLFSSL_FRODOKEM_NO_MAKE_KEY) + FrodoKemKey* key = NULL; + ecc_key* caKey = NULL; + WC_RNG rng; + Cert* cert = NULL; + DecodedCert* dc = NULL; + byte* der = NULL; + int rngInit = 0; + int bodySz = 0; + int derSz = 0; + const word32 dersz = FRODOKEM_MAX_PUB_KEY_DER_SIZE + 4096; + + XMEMSET(&rng, 0, sizeof(rng)); + key = (FrodoKemKey*)XMALLOC(sizeof(*key), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + caKey = (ecc_key*)XMALLOC(sizeof(*caKey), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(caKey); + cert = (Cert*)XMALLOC(sizeof(*cert), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(cert); + dc = (DecodedCert*)XMALLOC(sizeof(*dc), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(dc); + der = (byte*)XMALLOC(dersz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(der); + ExpectIntEQ(wc_InitRng(&rng), 0); + if (EXPECT_SUCCESS()) { + rngInit = 1; + } + + /* Subject FrodoKEM key pair and issuer ECC signing key. */ + ExpectIntEQ(wc_FrodoKemKey_Init(key, WC_FRODOKEM_976_SHAKE, NULL, + INVALID_DEVID), 0); + ExpectIntEQ(wc_FrodoKemKey_MakeKey(key, &rng), 0); + ExpectIntEQ(wc_ecc_init(caKey), 0); + ExpectIntEQ(wc_ecc_make_key(&rng, 32, caKey), 0); + + /* Build the certificate body carrying the FrodoKEM public key. */ + ExpectIntEQ(wc_InitCert(cert), 0); + if (EXPECT_SUCCESS()) { + XMEMCPY(cert->subject.country, "US", 3); + XMEMCPY(cert->subject.commonName, "FrodoKEM Test", 14); + cert->sigType = CTC_SHA256wECDSA; + cert->selfSigned = 1; + } + /* Subject Key Identifier derived from the FrodoKEM public key. */ +#ifdef WOLFSSL_CERT_EXT + ExpectIntEQ(wc_SetSubjectKeyIdFromPublicKey_ex(cert, FRODOKEM_TYPE, key), + 0); +#endif + ExpectIntGT((bodySz = wc_MakeCert_ex(cert, der, dersz, FRODOKEM_TYPE, + key, &rng)), 0); + /* Sign with the ECC issuer key (a KEM cannot produce signatures). */ + ExpectIntGT((derSz = wc_SignCert(bodySz, CTC_SHA256wECDSA, der, dersz, + NULL, caKey, &rng)), 0); + + /* Parse the certificate and confirm the FrodoKEM subject key. */ + if (EXPECT_SUCCESS()) { + wc_InitDecodedCert(dc, der, (word32)derSz, NULL); + ExpectIntEQ(wc_ParseCert(dc, CERT_TYPE, NO_VERIFY, NULL), 0); + ExpectIntEQ((int)dc->keyOID, FRODOKEM_976_SHAKEk); + ExpectIntGT(dc->pubKeySize, 0); + wc_FreeDecodedCert(dc); + } + + /* Certificate request (PKCS#10) carrying the FrodoKEM public key. A KEM + * cannot self-sign, so the request is signed with the ECC key. */ +#ifdef WOLFSSL_CERT_REQ + ExpectIntEQ(wc_InitCert(cert), 0); + if (EXPECT_SUCCESS()) { + XMEMCPY(cert->subject.country, "US", 3); + XMEMCPY(cert->subject.commonName, "FrodoKEM CSR", 13); + cert->sigType = CTC_SHA256wECDSA; + cert->version = 0; /* PKCS#10 (RFC 2986) requires version 0 */ + } + ExpectIntGT((bodySz = wc_MakeCertReq_ex(cert, der, dersz, FRODOKEM_TYPE, + key)), 0); + ExpectIntGT((derSz = wc_SignCert(bodySz, CTC_SHA256wECDSA, der, dersz, + NULL, caKey, &rng)), 0); + if (EXPECT_SUCCESS()) { + wc_InitDecodedCert(dc, der, (word32)derSz, NULL); + ExpectIntEQ(wc_ParseCert(dc, CERTREQ_TYPE, NO_VERIFY, NULL), 0); + ExpectIntEQ((int)dc->keyOID, FRODOKEM_976_SHAKEk); + wc_FreeDecodedCert(dc); + } +#endif + + if (rngInit) { + DoExpectIntEQ(wc_FreeRng(&rng), 0); + } + wc_ecc_free(caKey); + wc_FrodoKemKey_Free(key); + XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(dc, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(cert, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(caKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +/* Parse the committed FrodoKEM certificate and CSR fixtures from + * certs/frodokem/ and confirm the FrodoKEM subject key is recognized. */ +int test_wc_frodokem_cert_file(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) && \ + defined(WOLFSSL_CERT_GEN) && defined(HAVE_ECC) && \ + defined(WOLFSSL_WC_FRODOKEM_976) && defined(WOLFSSL_WC_FRODOKEM_1344) && \ + defined(WOLFSSL_FRODOKEM_SHAKE) && !defined(NO_FILESYSTEM) + static const struct { + const char* file; + int type; + int keySum; + } fixtures[] = { + { "./certs/frodokem/frodokem976-cert.der", CERT_TYPE, + FRODOKEM_976_SHAKEk }, + { "./certs/frodokem/frodokem976-req.der", CERTREQ_TYPE, + FRODOKEM_976_SHAKEk }, + { "./certs/frodokem/frodokem1344-cert.der", CERT_TYPE, + FRODOKEM_1344_SHAKEk }, + { "./certs/frodokem/frodokem1344-req.der", CERTREQ_TYPE, + FRODOKEM_1344_SHAKEk } + }; + byte* buf = NULL; + DecodedCert* dc = NULL; + XFILE f; + size_t n; + int i; + + buf = (byte*)XMALLOC(24000, NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(buf); + dc = (DecodedCert*)XMALLOC(sizeof(*dc), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(dc); + + for (i = 0; (i < (int)(sizeof(fixtures) / sizeof(fixtures[0]))) && + EXPECT_SUCCESS(); i++) { + n = 0; + if ((f = XFOPEN(fixtures[i].file, "rb")) != XBADFILE) { + n = XFREAD(buf, 1, 24000, f); + XFCLOSE(f); + } + ExpectIntGT((int)n, 0); + if (EXPECT_SUCCESS()) { + wc_InitDecodedCert(dc, buf, (word32)n, NULL); + ExpectIntEQ(wc_ParseCert(dc, fixtures[i].type, NO_VERIFY, NULL), 0); + ExpectIntEQ((int)dc->keyOID, fixtures[i].keySum); + wc_FreeDecodedCert(dc); + } + } + + XFREE(dc, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +/* Verify the committed FrodoKEM leaf certificates chain to the committed ECC + * issuer certificate (exercises the full parse + signature-verify path). */ +int test_wc_frodokem_cert_verify(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) && \ + defined(WOLFSSL_CERT_GEN) && defined(HAVE_ECC) && \ + defined(WOLFSSL_WC_FRODOKEM_976) && defined(WOLFSSL_WC_FRODOKEM_1344) && \ + defined(WOLFSSL_FRODOKEM_SHAKE) && !defined(NO_FILESYSTEM) && \ + !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) + WOLFSSL_CERT_MANAGER* cm = NULL; + + ExpectNotNull(cm = wolfSSL_CertManagerNew()); + ExpectIntEQ(wolfSSL_CertManagerLoadCA(cm, + "./certs/frodokem/frodokem-ca-ecc-cert.pem", NULL), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CertManagerVerify(cm, + "./certs/frodokem/frodokem976-cert.pem", WOLFSSL_FILETYPE_PEM), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CertManagerVerify(cm, + "./certs/frodokem/frodokem1344-cert.pem", WOLFSSL_FILETYPE_PEM), + WOLFSSL_SUCCESS); + wolfSSL_CertManagerFree(cm); +#endif + return EXPECT_RESULT(); +} diff --git a/tests/api/test_frodokem.h b/tests/api/test_frodokem.h index ffbdb66ccc..48cbca3990 100644 --- a/tests/api/test_frodokem.h +++ b/tests/api/test_frodokem.h @@ -36,6 +36,11 @@ int test_wc_frodokem_bad_args(void); int test_wc_frodokem_op_len_checks(void); int test_wc_frodokem_new_delete(void); int test_wc_frodokem_not_compiled_in(void); +int test_wc_frodokem_asn1(void); +int test_wc_frodokem_key_pem(void); +int test_wc_frodokem_x509(void); +int test_wc_frodokem_cert_file(void); +int test_wc_frodokem_cert_verify(void); #define TEST_FRODOKEM_DECLS \ TEST_DECL_GROUP("frodokem", test_wc_frodokem_make_key_kats), \ @@ -49,6 +54,11 @@ int test_wc_frodokem_not_compiled_in(void); TEST_DECL_GROUP("frodokem", test_wc_frodokem_bad_args), \ TEST_DECL_GROUP("frodokem", test_wc_frodokem_op_len_checks), \ TEST_DECL_GROUP("frodokem", test_wc_frodokem_new_delete), \ - TEST_DECL_GROUP("frodokem", test_wc_frodokem_not_compiled_in) + TEST_DECL_GROUP("frodokem", test_wc_frodokem_not_compiled_in), \ + TEST_DECL_GROUP("frodokem", test_wc_frodokem_asn1), \ + TEST_DECL_GROUP("frodokem", test_wc_frodokem_key_pem), \ + TEST_DECL_GROUP("frodokem", test_wc_frodokem_x509), \ + TEST_DECL_GROUP("frodokem", test_wc_frodokem_cert_file), \ + TEST_DECL_GROUP("frodokem", test_wc_frodokem_cert_verify) #endif /* WOLFCRYPT_TEST_FRODOKEM_H */ diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 8b870e3ce0..1c95ff5166 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -295,6 +295,9 @@ ASN Options: #if defined(WOLFSSL_HAVE_SLHDSA) #include #endif +#if defined(WOLFSSL_HAVE_FRODOKEM) + #include +#endif #ifdef WOLFSSL_QNX_CAAM #include @@ -4546,9 +4549,19 @@ static int EncodeName(EncodedName* name, const char* nameStr, byte nameTag, byte #endif #ifdef WOLFSSL_CERT_GEN static int SetValidity(byte* output, int daysValid); -static int MakeAnyCert(Cert* cert, byte* derBuffer, word32 derSz, RsaKey* rsaKey, ecc_key* eccKey, WC_RNG* rng, DsaKey* dsaKey, ed25519_key* ed25519Key, ed448_key* ed448Key, falcon_key* falconKey, wc_MlDsaKey* mldsaKey, SlhDsaKey* slhDsaKey, LmsKey* lmsKey, XmssKey* xmssKey); +static int MakeAnyCert(Cert* cert, byte* derBuffer, word32 derSz, + RsaKey* rsaKey, ecc_key* eccKey, WC_RNG* rng, + DsaKey* dsaKey, ed25519_key* ed25519Key, + ed448_key* ed448Key, falcon_key* falconKey, + wc_MlDsaKey* mldsaKey, SlhDsaKey* slhDsaKey, + LmsKey* lmsKey, XmssKey* xmssKey, void* frodoKey); #ifdef WOLFSSL_CERT_REQ -static int MakeCertReq(Cert* cert, byte* derBuffer, word32 derSz, RsaKey* rsaKey, DsaKey* dsaKey, ecc_key* eccKey, ed25519_key* ed25519Key, ed448_key* ed448Key, falcon_key* falconKey, wc_MlDsaKey* mldsaKey, SlhDsaKey* slhDsaKey, LmsKey* lmsKey, XmssKey* xmssKey); +static int MakeCertReq(Cert* cert, byte* derBuffer, word32 derSz, + RsaKey* rsaKey, DsaKey* dsaKey, ecc_key* eccKey, + ed25519_key* ed25519Key, ed448_key* ed448Key, + falcon_key* falconKey, wc_MlDsaKey* mldsaKey, + SlhDsaKey* slhDsaKey, LmsKey* lmsKey, XmssKey* xmssKey, + void* frodoKey); #endif #endif #endif @@ -4853,6 +4866,34 @@ static int ParseCRL_Extensions(DecodedCRL* dcrl, const byte* buf, word32* inOutI static const byte keyMlDsa_87Oid[] = {96, 134, 72, 1, 101, 3, 4, 3, 19}; #endif /* WOLFSSL_HAVE_MLDSA */ +#ifdef WOLFSSL_HAVE_FRODOKEM + /* FrodoKEM / eFrodoKEM key OIDs (ISO/IEC 18033-2, arc 1.0.18033.2.2.7.x). + * Only the 976 and 1344 parameter sets are standardised (no 640). */ + /* frodokem976-shake: 1.0.18033.2.2.7.1 */ + static const byte keyFrodoKem_976ShakeOid[] = + {40, 129, 140, 113, 2, 2, 7, 1}; + /* frodokem1344-shake: 1.0.18033.2.2.7.2 */ + static const byte keyFrodoKem_1344ShakeOid[] = + {40, 129, 140, 113, 2, 2, 7, 2}; + /* efrodokem976-shake: 1.0.18033.2.2.7.3 */ + static const byte keyeFrodoKem_976ShakeOid[] = + {40, 129, 140, 113, 2, 2, 7, 3}; + /* efrodokem1344-shake: 1.0.18033.2.2.7.4 */ + static const byte keyeFrodoKem_1344ShakeOid[] = + {40, 129, 140, 113, 2, 2, 7, 4}; + /* frodokem976-aes: 1.0.18033.2.2.7.5 */ + static const byte keyFrodoKem_976AesOid[] = + {40, 129, 140, 113, 2, 2, 7, 5}; + /* frodokem1344-aes: 1.0.18033.2.2.7.6 */ + static const byte keyFrodoKem_1344AesOid[] = + {40, 129, 140, 113, 2, 2, 7, 6}; + /* efrodokem976-aes: 1.0.18033.2.2.7.7 */ + static const byte keyeFrodoKem_976AesOid[] = + {40, 129, 140, 113, 2, 2, 7, 7}; + /* efrodokem1344-aes: 1.0.18033.2.2.7.8 */ + static const byte keyeFrodoKem_1344AesOid[] = + {40, 129, 140, 113, 2, 2, 7, 8}; +#endif /* WOLFSSL_HAVE_FRODOKEM */ #ifdef WOLFSSL_HAVE_SLHDSA /* SLH-DSA-SHA2-128s: 2.16.840.1.101.3.4.3.20 */ static const byte keySlhDsa_Sha2_128sOid[] = {96, 134, 72, 1, 101, 3, 4, 3, 20}; @@ -6189,6 +6230,40 @@ const byte* OidFromId(word32 id, word32 type, word32* oidSz) *oidSz = sizeof(keySlhDsa_Shake_256fOid); break; #endif /* WOLFSSL_HAVE_SLHDSA */ + #ifdef WOLFSSL_HAVE_FRODOKEM + case FRODOKEM_976_SHAKEk: + oid = keyFrodoKem_976ShakeOid; + *oidSz = sizeof(keyFrodoKem_976ShakeOid); + break; + case FRODOKEM_1344_SHAKEk: + oid = keyFrodoKem_1344ShakeOid; + *oidSz = sizeof(keyFrodoKem_1344ShakeOid); + break; + case EFRODOKEM_976_SHAKEk: + oid = keyeFrodoKem_976ShakeOid; + *oidSz = sizeof(keyeFrodoKem_976ShakeOid); + break; + case EFRODOKEM_1344_SHAKEk: + oid = keyeFrodoKem_1344ShakeOid; + *oidSz = sizeof(keyeFrodoKem_1344ShakeOid); + break; + case FRODOKEM_976_AESk: + oid = keyFrodoKem_976AesOid; + *oidSz = sizeof(keyFrodoKem_976AesOid); + break; + case FRODOKEM_1344_AESk: + oid = keyFrodoKem_1344AesOid; + *oidSz = sizeof(keyFrodoKem_1344AesOid); + break; + case EFRODOKEM_976_AESk: + oid = keyeFrodoKem_976AesOid; + *oidSz = sizeof(keyeFrodoKem_976AesOid); + break; + case EFRODOKEM_1344_AESk: + oid = keyeFrodoKem_1344AesOid; + *oidSz = sizeof(keyeFrodoKem_1344AesOid); + break; + #endif /* WOLFSSL_HAVE_FRODOKEM */ #ifdef WOLFSSL_HAVE_LMS case HSS_LMSk: oid = keyHssLmsOid; @@ -7693,6 +7768,37 @@ static word32 fpkiCertPolOid(const byte* oid, word32 oidSz, word32 oidSum) { return 0; } #endif +#ifdef WOLFSSL_HAVE_FRODOKEM +/* The FrodoKEM key OIDs (1.0.18033.2.2.7.x) old-scheme byte sums (434..441) + * collide with the SLH-DSA key OIDs. All FrodoKEM OIDs share the same length + * and 7-byte prefix and differ only in the final arc, so match the prefix and + * map the final arc to the distinct FrodoKEM sum (100434..100441). Returns 0 + * when the OID is not FrodoKEM (leaving the byte sum unchanged). + * @param [in] oid Buffer holding OID content octets. + * @param [in] oidSz Length of OID data in buffer. + */ +static word32 frodoKemKeyOidSum(const byte* oid, word32 oidSz) +{ + word32 sum = 0; + + if ((oidSz == (word32)sizeof(keyFrodoKem_976ShakeOid)) && + (XMEMCMP(oid, keyFrodoKem_976ShakeOid, oidSz - 1) == 0)) { + switch (oid[oidSz - 1]) { + case 1: sum = FRODOKEM_976_SHAKEk; break; + case 2: sum = FRODOKEM_1344_SHAKEk; break; + case 3: sum = EFRODOKEM_976_SHAKEk; break; + case 4: sum = EFRODOKEM_1344_SHAKEk; break; + case 5: sum = FRODOKEM_976_AESk; break; + case 6: sum = FRODOKEM_1344_AESk; break; + case 7: sum = EFRODOKEM_976_AESk; break; + case 8: sum = EFRODOKEM_1344_AESk; break; + default: break; + } + } + + return sum; +} +#endif /* WOLFSSL_HAVE_FRODOKEM */ #endif /* WOLFSSL_OLD_OID_SUM */ word32 wc_oid_sum(const byte* input, int length) @@ -7780,6 +7886,16 @@ static int GetOID(const byte* input, word32* inOutIdx, word32* oid, *oid = found_collision; } #endif /* WOLFSSL_FPKI */ +#ifdef WOLFSSL_HAVE_FRODOKEM + /* Remap a FrodoKEM key OID off the SLH-DSA byte-sum collision to its + * distinct sum so the two do not alias in the old-scheme lookup. */ + if (oidType == oidKeyType) { + word32 fkSum = frodoKemKeyOidSum(actualOid, actualOidSz); + if (fkSum != 0) { + *oid = fkSum; + } + } +#endif /* WOLFSSL_HAVE_FRODOKEM */ #endif /* Return the index after the OID data. */ @@ -9159,6 +9275,22 @@ int ToTraditionalInline_ex2(const byte* input, word32* inOutIdx, word32 sz, ret = ASN_PARSE_E; } break; + #endif + #if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) + case FRODOKEM_976_SHAKEk: + case FRODOKEM_1344_SHAKEk: + case EFRODOKEM_976_SHAKEk: + case EFRODOKEM_1344_SHAKEk: + case FRODOKEM_976_AESk: + case FRODOKEM_1344_AESk: + case EFRODOKEM_976_AESk: + case EFRODOKEM_1344_AESk: + /* Neither NULL item nor OBJECT_ID item allowed. */ + if ((dataASN[PKCS8KEYASN_IDX_PKEY_ALGO_NULL].tag != 0) || + (dataASN[PKCS8KEYASN_IDX_PKEY_ALGO_OID_CURVE].tag != 0)) { + ret = ASN_PARSE_E; + } + break; #endif /* Other OIDs (DSAk), no parameter validation. */ default: @@ -9730,6 +9862,52 @@ int wc_CheckPrivateKey(const byte* privKey, word32 privKeySz, } else #endif /* WOLFSSL_HAVE_SLHDSA && !WOLFSSL_SLHDSA_VERIFY_ONLY */ +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) + if ((ks == FRODOKEM_976_SHAKEk) || (ks == FRODOKEM_1344_SHAKEk) || + (ks == EFRODOKEM_976_SHAKEk) || (ks == EFRODOKEM_1344_SHAKEk) || + (ks == FRODOKEM_976_AESk) || (ks == FRODOKEM_1344_AESk) || + (ks == EFRODOKEM_976_AESk) || (ks == EFRODOKEM_1344_AESk)) { + /* FrodoKemKey is large (tens of KB); always heap-allocate it to avoid + * a big stack frame, as wc_GetKeyOID() does. */ + FrodoKemKey* key_pair = (FrodoKemKey*)XMALLOC(sizeof(FrodoKemKey), + heap, DYNAMIC_TYPE_TMP_BUFFER); + word32 keyIdx = 0; + word32 pubSz = 0; + byte* pub = NULL; + + if (key_pair == NULL) { + return MEMORY_E; + } + XMEMSET(key_pair, 0, sizeof(FrodoKemKey)); + key_pair->devId = INVALID_DEVID; + + /* Auto-detect the variant from the private key's OID, derive its + * public key and match it against the certificate's public key. */ + ret = wc_FrodoKemKey_PrivateKeyDecode(key_pair, privKey, privKeySz, + &keyIdx); + if (ret == 0) { + ret = wc_FrodoKemKey_PublicKeySize(key_pair, &pubSz); + } + if (ret == 0) { + pub = (byte*)XMALLOC(pubSz, heap, DYNAMIC_TYPE_TMP_BUFFER); + if (pub == NULL) { + ret = MEMORY_E; + } + } + if (ret == 0) { + ret = wc_FrodoKemKey_EncodePublicKey(key_pair, pub, pubSz); + } + if (ret == 0) { + WOLFSSL_MSG("Checking FrodoKEM key pair"); + ret = ((pubKeySz == pubSz) && + (XMEMCMP(pub, pubKey, pubSz) == 0)) ? 1 : 0; + } + XFREE(pub, heap, DYNAMIC_TYPE_TMP_BUFFER); + wc_FrodoKemKey_Free(key_pair); + XFREE(key_pair, heap, DYNAMIC_TYPE_TMP_BUFFER); + } + else +#endif /* WOLFSSL_HAVE_FRODOKEM && !WOLFSSL_FRODOKEM_NO_ASN1 */ { ret = 0; } @@ -9985,6 +10163,47 @@ static int CheckAlgoV2(int oid, int* id, int* blockSz) #if defined(HAVE_PKCS8) || defined(HAVE_PKCS12) +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) +/* Map a decoded FrodoKEM key type to its key-OID sum (Key_Sum). Mirrors the + * mapping in wc_frodokem.c; 640 has no standardised OID and returns 0. */ +static int frodoKemKeyTypeToSum(int type) +{ + int sum = 0; + + switch (type & (FRODOKEM_BASE_MASK | FRODOKEM_AES | FRODOKEM_EPHEMERAL)) { + case WC_FRODOKEM_976: + sum = FRODOKEM_976_SHAKEk; + break; + case WC_FRODOKEM_976 | FRODOKEM_EPHEMERAL: + sum = EFRODOKEM_976_SHAKEk; + break; + case WC_FRODOKEM_976 | FRODOKEM_AES: + sum = FRODOKEM_976_AESk; + break; + case WC_FRODOKEM_976 | FRODOKEM_AES | FRODOKEM_EPHEMERAL: + sum = EFRODOKEM_976_AESk; + break; + case WC_FRODOKEM_1344: + sum = FRODOKEM_1344_SHAKEk; + break; + case WC_FRODOKEM_1344 | FRODOKEM_EPHEMERAL: + sum = EFRODOKEM_1344_SHAKEk; + break; + case WC_FRODOKEM_1344 | FRODOKEM_AES: + sum = FRODOKEM_1344_AESk; + break; + case WC_FRODOKEM_1344 | FRODOKEM_AES | FRODOKEM_EPHEMERAL: + sum = EFRODOKEM_1344_AESk; + break; + default: + sum = 0; + break; + } + + return sum; +} +#endif /* WOLFSSL_HAVE_FRODOKEM && !WOLFSSL_FRODOKEM_NO_ASN1 */ + int wc_GetKeyOID(byte* key, word32 keySz, const byte** curveOID, word32* oidSz, int* algoID, void* heap) { @@ -10280,6 +10499,28 @@ int wc_GetKeyOID(byte* key, word32 keySz, const byte** curveOID, word32* oidSz, XFREE(slhDsa, heap, DYNAMIC_TYPE_TMP_BUFFER); } #endif /* WOLFSSL_HAVE_SLHDSA && !WOLFSSL_SLHDSA_VERIFY_ONLY */ +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) + if (*algoID == 0) { + FrodoKemKey *frodo = (FrodoKemKey *)XMALLOC(sizeof(*frodo), heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (frodo == NULL) + return MEMORY_E; + + /* A zeroed object makes wc_FrodoKemKey_PrivateKeyDecode auto-detect the + * variant from the OID and initialize the key. */ + XMEMSET(frodo, 0, sizeof(*frodo)); + frodo->devId = INVALID_DEVID; + tmpIdx = 0; + if (wc_FrodoKemKey_PrivateKeyDecode(frodo, key, keySz, &tmpIdx) == 0) { + *algoID = frodoKemKeyTypeToSum(frodo->type); + } + else { + WOLFSSL_MSG("Not FrodoKEM DER key"); + } + wc_FrodoKemKey_Free(frodo); + XFREE(frodo, heap, DYNAMIC_TYPE_TMP_BUFFER); + } +#endif /* WOLFSSL_HAVE_FRODOKEM && !WOLFSSL_FRODOKEM_NO_ASN1 */ /* if flag is not set then this is not a key that we understand. */ if (*algoID == 0) { @@ -12759,7 +13000,8 @@ void wc_FreeDecodedCert(DecodedCert* cert) #if defined(HAVE_ED25519) || defined(HAVE_ED448) || defined(HAVE_FALCON) || \ defined(WOLFSSL_HAVE_MLDSA) || defined(WOLFSSL_HAVE_SLHDSA) || \ - defined(WOLFSSL_HAVE_LMS) || defined(WOLFSSL_HAVE_XMSS) + defined(WOLFSSL_HAVE_LMS) || defined(WOLFSSL_HAVE_XMSS) || \ + (defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1)) /* Store the key data under the BIT_STRING in dynamically allocated data. * * @param [in, out] cert Certificate object. @@ -13766,6 +14008,19 @@ static int GetCertKey(DecodedCert* cert, const byte* source, word32* inOutIdx, ret = StoreKey(cert, source, &srcIdx, maxIdx); break; #endif /* WOLFSSL_HAVE_MLDSA */ + #if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) + case FRODOKEM_976_SHAKEk: + case FRODOKEM_1344_SHAKEk: + case EFRODOKEM_976_SHAKEk: + case EFRODOKEM_1344_SHAKEk: + case FRODOKEM_976_AESk: + case FRODOKEM_1344_AESk: + case EFRODOKEM_976_AESk: + case EFRODOKEM_1344_AESk: + cert->pkCurveOID = cert->keyOID; + ret = StoreKey(cert, source, &srcIdx, maxIdx); + break; + #endif /* WOLFSSL_HAVE_FRODOKEM && !WOLFSSL_FRODOKEM_NO_ASN1 */ #ifdef WOLFSSL_HAVE_SLHDSA case SLH_DSA_SHAKE_128Fk: case SLH_DSA_SHAKE_192Fk: @@ -28145,7 +28400,8 @@ static int EncodePublicKey(int keyType, byte* output, int outLen, ed25519_key* ed25519Key, ed448_key* ed448Key, DsaKey* dsaKey, falcon_key* falconKey, wc_MlDsaKey* mldsaKey, SlhDsaKey* slhDsaKey, - LmsKey* lmsKey, XmssKey* xmssKey) + LmsKey* lmsKey, XmssKey* xmssKey, + void* frodoKey) { int ret = 0; @@ -28160,6 +28416,7 @@ static int EncodePublicKey(int keyType, byte* output, int outLen, (void)slhDsaKey; (void)lmsKey; (void)xmssKey; + (void)frodoKey; switch (keyType) { #ifndef NO_RSA @@ -28221,6 +28478,15 @@ static int EncodePublicKey(int keyType, byte* output, int outLen, } break; #endif /* WOLFSSL_HAVE_MLDSA */ + #if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) + case FRODOKEM_KEY: + ret = wc_FrodoKemKey_PublicKeyToDer((FrodoKemKey*)frodoKey, output, + (word32)outLen, 1); + if (ret <= 0) { + ret = PUBLIC_KEY_E; + } + break; + #endif /* WOLFSSL_HAVE_FRODOKEM && !WOLFSSL_FRODOKEM_NO_ASN1 */ #if defined(WOLFSSL_HAVE_SLHDSA) case SLH_DSA_SHAKE_128F_KEY: case SLH_DSA_SHAKE_192F_KEY: @@ -29603,7 +29869,7 @@ static int MakeAnyCert(Cert* cert, byte* derBuffer, word32 derSz, DsaKey* dsaKey, ed25519_key* ed25519Key, ed448_key* ed448Key, falcon_key* falconKey, wc_MlDsaKey* mldsaKey, SlhDsaKey* slhDsaKey, - LmsKey* lmsKey, XmssKey* xmssKey) + LmsKey* lmsKey, XmssKey* xmssKey, void* frodoKey) { /* TODO: issRaw and sbjRaw should be NUL terminated. */ DECL_ASNSETDATA(dataASN, x509CertASN_Length); @@ -29699,6 +29965,11 @@ static int MakeAnyCert(Cert* cert, byte* derBuffer, word32 derSz, cert->keyType = xmssKey->is_xmssmt ? XMSSMT_KEY : XMSS_KEY; } #endif /* WOLFSSL_HAVE_XMSS && !WOLFSSL_XMSS_VERIFY_ONLY */ +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) + else if (frodoKey != NULL) { + cert->keyType = FRODOKEM_KEY; + } +#endif /* WOLFSSL_HAVE_FRODOKEM && !WOLFSSL_FRODOKEM_NO_ASN1 */ else { ret = BAD_FUNC_ARG; } @@ -29747,7 +30018,7 @@ static int MakeAnyCert(Cert* cert, byte* derBuffer, word32 derSz, /* Calculate public key encoding size. */ ret = EncodePublicKey(cert->keyType, NULL, 0, rsaKey, eccKey, ed25519Key, ed448Key, dsaKey, falconKey, - mldsaKey, slhDsaKey, lmsKey, xmssKey); + mldsaKey, slhDsaKey, lmsKey, xmssKey, frodoKey); publicKeySz = (word32)ret; } if (ret >= 0) { @@ -29934,7 +30205,8 @@ static int MakeAnyCert(Cert* cert, byte* derBuffer, word32 derSz, (int)dataASN[X509CERTASN_IDX_TBS_SPUBKEYINFO_SEQ] .data.buffer.length, rsaKey, eccKey, ed25519Key, ed448Key, dsaKey, - falconKey, mldsaKey, slhDsaKey, lmsKey, xmssKey); + falconKey, mldsaKey, slhDsaKey, lmsKey, xmssKey, + frodoKey); } if ((ret >= 0) && (!dataASN[X509CERTASN_IDX_TBS_EXT_SEQ].noOut)) { /* Encode extensions into buffer. */ @@ -29981,6 +30253,7 @@ int wc_MakeCert_ex(Cert* cert, byte* derBuffer, word32 derSz, int keyType, SlhDsaKey* slhDsaKey = NULL; LmsKey* lmsKey = NULL; XmssKey* xmssKey = NULL; + void* frodoKey = NULL; if (keyType == RSA_TYPE) rsaKey = (RsaKey*)key; @@ -30032,10 +30305,14 @@ int wc_MakeCert_ex(Cert* cert, byte* derBuffer, word32 derSz, int keyType, return BAD_FUNC_ARG; } #endif +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) + else if (keyType == FRODOKEM_TYPE) + frodoKey = key; +#endif return MakeAnyCert(cert, derBuffer, derSz, rsaKey, eccKey, rng, dsaKey, ed25519Key, ed448Key, falconKey, mldsaKey, - slhDsaKey, lmsKey, xmssKey); + slhDsaKey, lmsKey, xmssKey, frodoKey); } /* Make an x509 Certificate v3 RSA or ECC from cert input, write to buffer */ @@ -30044,7 +30321,7 @@ int wc_MakeCert(Cert* cert, byte* derBuffer, word32 derSz, RsaKey* rsaKey, ecc_key* eccKey, WC_RNG* rng) { return MakeAnyCert(cert, derBuffer, derSz, rsaKey, eccKey, rng, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL); + NULL, NULL, NULL, NULL, NULL, NULL, NULL); } @@ -30112,7 +30389,8 @@ static int MakeCertReq(Cert* cert, byte* derBuffer, word32 derSz, RsaKey* rsaKey, DsaKey* dsaKey, ecc_key* eccKey, ed25519_key* ed25519Key, ed448_key* ed448Key, falcon_key* falconKey, wc_MlDsaKey* mldsaKey, - SlhDsaKey* slhDsaKey, LmsKey* lmsKey, XmssKey* xmssKey) + SlhDsaKey* slhDsaKey, LmsKey* lmsKey, XmssKey* xmssKey, + void* frodoKey) { DECL_ASNSETDATA(dataASN, certReqBodyASN_Length); word32 publicKeySz = 0; @@ -30207,6 +30485,11 @@ static int MakeCertReq(Cert* cert, byte* derBuffer, word32 derSz, cert->keyType = xmssKey->is_xmssmt ? XMSSMT_KEY : XMSS_KEY; } #endif /* WOLFSSL_HAVE_XMSS && !WOLFSSL_XMSS_VERIFY_ONLY */ +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) + else if (frodoKey != NULL) { + cert->keyType = FRODOKEM_KEY; + } +#endif /* WOLFSSL_HAVE_FRODOKEM && !WOLFSSL_FRODOKEM_NO_ASN1 */ else { ret = BAD_FUNC_ARG; } @@ -30229,7 +30512,7 @@ static int MakeCertReq(Cert* cert, byte* derBuffer, word32 derSz, /* Determine encode public key size. */ ret = EncodePublicKey(cert->keyType, NULL, 0, rsaKey, eccKey, ed25519Key, ed448Key, dsaKey, falconKey, - mldsaKey, slhDsaKey, lmsKey, xmssKey); + mldsaKey, slhDsaKey, lmsKey, xmssKey, frodoKey); publicKeySz = (word32)ret; } if (ret >= 0) { @@ -30349,7 +30632,7 @@ static int MakeCertReq(Cert* cert, byte* derBuffer, word32 derSz, dataASN[CERTREQBODYASN_IDX_SPUBKEYINFO_SEQ].data.buffer.data, (int)dataASN[CERTREQBODYASN_IDX_SPUBKEYINFO_SEQ].data.buffer.length, rsaKey, eccKey, ed25519Key, ed448Key, dsaKey, falconKey, - mldsaKey, slhDsaKey, lmsKey, xmssKey); + mldsaKey, slhDsaKey, lmsKey, xmssKey, frodoKey); } if ((ret >= 0 && derBuffer != NULL) && (!dataASN[CERTREQBODYASN_IDX_EXT_BODY].noOut)) { @@ -30385,6 +30668,7 @@ int wc_MakeCertReq_ex(Cert* cert, byte* derBuffer, word32 derSz, int keyType, SlhDsaKey* slhDsaKey = NULL; LmsKey* lmsKey = NULL; XmssKey* xmssKey = NULL; + void* frodoKey = NULL; if (keyType == RSA_TYPE) rsaKey = (RsaKey*)key; @@ -30436,10 +30720,14 @@ int wc_MakeCertReq_ex(Cert* cert, byte* derBuffer, word32 derSz, int keyType, return BAD_FUNC_ARG; } #endif +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) + else if (keyType == FRODOKEM_TYPE) + frodoKey = key; +#endif return MakeCertReq(cert, derBuffer, derSz, rsaKey, dsaKey, eccKey, ed25519Key, ed448Key, falconKey, mldsaKey, - slhDsaKey, lmsKey, xmssKey); + slhDsaKey, lmsKey, xmssKey, frodoKey); } WOLFSSL_ABI @@ -30447,7 +30735,7 @@ int wc_MakeCertReq(Cert* cert, byte* derBuffer, word32 derSz, RsaKey* rsaKey, ecc_key* eccKey) { return MakeCertReq(cert, derBuffer, derSz, rsaKey, NULL, eccKey, NULL, - NULL, NULL, NULL, NULL, NULL, NULL); + NULL, NULL, NULL, NULL, NULL, NULL, NULL); } #endif /* WOLFSSL_CERT_REQ */ @@ -31127,20 +31415,27 @@ static int SetKeyIdFromPublicKey(Cert *cert, RsaKey *rsakey, ecc_key *eckey, ed25519_key* ed25519Key, ed448_key* ed448Key, falcon_key* falconKey, wc_MlDsaKey* mldsaKey, - SlhDsaKey *slhDsaKey, int kid_type) + SlhDsaKey *slhDsaKey, void* frodoKey, + int kid_type) { byte *buf; int bufferSz, ret; + word32 bufSz = MAX_PUBLIC_KEY_SZ; if (cert == NULL || (rsakey == NULL && eckey == NULL && ed25519Key == NULL && ed448Key == NULL && falconKey == NULL && mldsaKey == NULL && - slhDsaKey == NULL) || + slhDsaKey == NULL && frodoKey == NULL) || (kid_type != SKID_TYPE && kid_type != AKID_TYPE)) return BAD_FUNC_ARG; - buf = (byte *)XMALLOC(MAX_PUBLIC_KEY_SZ, cert->heap, - DYNAMIC_TYPE_TMP_BUFFER); +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) + /* FrodoKEM public keys are far larger than MAX_PUBLIC_KEY_SZ. */ + if (frodoKey != NULL) { + bufSz = FRODOKEM_MAX_PUB_KEY_DER_SIZE; + } +#endif + buf = (byte *)XMALLOC(bufSz, cert->heap, DYNAMIC_TYPE_TMP_BUFFER); if (buf == NULL) return MEMORY_E; @@ -31186,6 +31481,12 @@ static int SetKeyIdFromPublicKey(Cert *cert, RsaKey *rsakey, ecc_key *eckey, MAX_PUBLIC_KEY_SZ, 0); } #endif +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) + if (frodoKey != NULL) { + bufferSz = wc_FrodoKemKey_PublicKeyToDer((FrodoKemKey*)frodoKey, buf, + bufSz, 0); + } +#endif if (bufferSz <= 0) { XFREE(buf, cert->heap, DYNAMIC_TYPE_TMP_BUFFER); @@ -31225,6 +31526,7 @@ int wc_SetSubjectKeyIdFromPublicKey_ex(Cert *cert, int keyType, void* key) falcon_key* falconKey = NULL; wc_MlDsaKey* mldsaKey = NULL; SlhDsaKey* slhDsaKey = NULL; + void* frodoKey = NULL; if (keyType == RSA_TYPE) rsaKey = (RsaKey*)key; @@ -31256,9 +31558,13 @@ int wc_SetSubjectKeyIdFromPublicKey_ex(Cert *cert, int keyType, void* key) else if (IsSlhDsaKeyType(keyType)) slhDsaKey = (SlhDsaKey*)key; #endif +#if defined(WOLFSSL_HAVE_FRODOKEM) && !defined(WOLFSSL_FRODOKEM_NO_ASN1) + else if (keyType == FRODOKEM_TYPE) + frodoKey = key; +#endif return SetKeyIdFromPublicKey(cert, rsaKey, eccKey, ed25519Key, ed448Key, - falconKey, mldsaKey, slhDsaKey, + falconKey, mldsaKey, slhDsaKey, frodoKey, SKID_TYPE); } @@ -31266,7 +31572,7 @@ int wc_SetSubjectKeyIdFromPublicKey_ex(Cert *cert, int keyType, void* key) int wc_SetSubjectKeyIdFromPublicKey(Cert *cert, RsaKey *rsakey, ecc_key *eckey) { return SetKeyIdFromPublicKey(cert, rsakey, eckey, NULL, NULL, NULL, NULL, - NULL, SKID_TYPE); + NULL, NULL, SKID_TYPE); } int wc_SetAuthKeyIdFromPublicKey_ex(Cert *cert, int keyType, void* key) @@ -31311,7 +31617,7 @@ int wc_SetAuthKeyIdFromPublicKey_ex(Cert *cert, int keyType, void* key) #endif return SetKeyIdFromPublicKey(cert, rsaKey, eccKey, ed25519Key, ed448Key, - falconKey, mldsaKey, slhDsaKey, + falconKey, mldsaKey, slhDsaKey, NULL, AKID_TYPE); } @@ -31319,7 +31625,7 @@ int wc_SetAuthKeyIdFromPublicKey_ex(Cert *cert, int keyType, void* key) int wc_SetAuthKeyIdFromPublicKey(Cert *cert, RsaKey *rsakey, ecc_key *eckey) { return SetKeyIdFromPublicKey(cert, rsakey, eckey, NULL, NULL, NULL, NULL, - NULL, AKID_TYPE); + NULL, NULL, AKID_TYPE); } @@ -33325,7 +33631,8 @@ enum { || (defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_IMPORT)) \ || (defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)) \ || (defined(HAVE_CURVE448) && defined(HAVE_CURVE448_KEY_IMPORT)) \ - || defined(HAVE_FALCON) || defined(WOLFSSL_HAVE_MLDSA) || defined(WOLFSSL_HAVE_SLHDSA)) + || defined(HAVE_FALCON) || defined(WOLFSSL_HAVE_MLDSA) \ + || defined(WOLFSSL_HAVE_SLHDSA) || defined(WOLFSSL_HAVE_FRODOKEM)) int DecodeAsymKey_Assign(const byte* input, word32* inOutIdx, word32 inSz, diff --git a/wolfcrypt/src/asn_orig.c b/wolfcrypt/src/asn_orig.c index ccab650425..6eab2b6041 100644 --- a/wolfcrypt/src/asn_orig.c +++ b/wolfcrypt/src/asn_orig.c @@ -6594,7 +6594,7 @@ static int MakeAnyCert(Cert* cert, byte* derBuffer, word32 derSz, DsaKey* dsaKey, ed25519_key* ed25519Key, ed448_key* ed448Key, falcon_key* falconKey, wc_MlDsaKey* mldsaKey, SlhDsaKey* slhDsaKey, - LmsKey* lmsKey, XmssKey* xmssKey) + LmsKey* lmsKey, XmssKey* xmssKey, void* frodoKey) { int ret; WC_DECLARE_VAR(der, DerCert, 1, 0); @@ -6609,6 +6609,11 @@ static int MakeAnyCert(Cert* cert, byte* derBuffer, word32 derSz, "WOLFSSL_ASN_TEMPLATE"); return ALGO_ID_E; } + if (frodoKey != NULL) { + WOLFSSL_MSG("FrodoKEM certificate generation requires " + "WOLFSSL_ASN_TEMPLATE"); + return ALGO_ID_E; + } if (derBuffer == NULL) return BAD_FUNC_ARG; @@ -7238,7 +7243,8 @@ static int MakeCertReq(Cert* cert, byte* derBuffer, word32 derSz, RsaKey* rsaKey, DsaKey* dsaKey, ecc_key* eccKey, ed25519_key* ed25519Key, ed448_key* ed448Key, falcon_key* falconKey, wc_MlDsaKey* mldsaKey, - SlhDsaKey* slhDsaKey, LmsKey* lmsKey, XmssKey* xmssKey) + SlhDsaKey* slhDsaKey, LmsKey* lmsKey, XmssKey* xmssKey, + void* frodoKey) { int ret; WC_DECLARE_VAR(der, DerCert, 1, 0); @@ -7250,6 +7256,11 @@ static int MakeCertReq(Cert* cert, byte* derBuffer, word32 derSz, "WOLFSSL_ASN_TEMPLATE"); return ALGO_ID_E; } + if (frodoKey != NULL) { + WOLFSSL_MSG("FrodoKEM certificate request generation requires " + "WOLFSSL_ASN_TEMPLATE"); + return ALGO_ID_E; + } if (eccKey) cert->keyType = ECC_KEY; diff --git a/wolfcrypt/src/cryptocb.c b/wolfcrypt/src/cryptocb.c index c3067b97b8..8eaef59c4f 100644 --- a/wolfcrypt/src/cryptocb.c +++ b/wolfcrypt/src/cryptocb.c @@ -1317,7 +1317,7 @@ int wc_CryptoCb_PqcStatefulSigSigsLeft(int type, void* key, word32* sigsLeft) } #endif /* WOLFSSL_HAVE_LMS || WOLFSSL_HAVE_XMSS */ -#if defined(WOLFSSL_HAVE_MLKEM) +#if defined(WOLFSSL_HAVE_MLKEM) || defined(WOLFSSL_HAVE_FRODOKEM) int wc_CryptoCb_PqcKemGetDevId(int type, void* key) { int devId = INVALID_DEVID; @@ -1326,9 +1326,16 @@ int wc_CryptoCb_PqcKemGetDevId(int type, void* key) return devId; /* get devId */ +#ifdef WOLFSSL_HAVE_MLKEM if (type == WC_PQC_KEM_TYPE_MLKEM) { devId = ((MlKemKey*) key)->devId; } +#endif +#ifdef WOLFSSL_HAVE_FRODOKEM + if (type == WC_PQC_KEM_TYPE_FRODOKEM) { + devId = ((FrodoKemKey*) key)->devId; + } +#endif return devId; } @@ -1436,7 +1443,7 @@ int wc_CryptoCb_PqcDecapsulate(const byte* ciphertext, word32 ciphertextLen, return wc_CryptoCb_TranslateErrorCode(ret); } -#endif /* WOLFSSL_HAVE_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM || WOLFSSL_HAVE_FRODOKEM */ #if defined(HAVE_FALCON) || defined(WOLFSSL_HAVE_MLDSA) || \ defined(WOLFSSL_HAVE_SLHDSA) diff --git a/wolfcrypt/src/port/arm/armv8-frodokem-asm.S b/wolfcrypt/src/port/arm/armv8-frodokem-asm.S index 6f0fd9bb6a..7c68e080a2 100644 --- a/wolfcrypt/src/port/arm/armv8-frodokem-asm.S +++ b/wolfcrypt/src/port/arm/armv8-frodokem-asm.S @@ -294,7 +294,6 @@ L_frodokem_sha3_x2_neon_begin: .size frodokem_sha3_x2_neon,.-frodokem_sha3_x2_neon #endif /* __APPLE__ */ #ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 - .arch_extension sha3 #ifndef __APPLE__ .text .globl frodokem_sha3_x2_crypto @@ -319,6 +318,9 @@ _frodokem_sha3_x2_crypto: #else adrp x1, L_sha3_aarch64_r@PAGE add x1, x1, L_sha3_aarch64_r@PAGEOFF +#endif /* __APPLE__ */ +#ifdef __APPLE__ +.arch_extension sha3 #endif /* __APPLE__ */ ld4 {v0.d, v1.d, v2.d, v3.d}[0], [x0], #32 ld4 {v4.d, v5.d, v6.d, v7.d}[0], [x0], #32 diff --git a/wolfcrypt/src/port/arm/armv8-frodokem-asm.asm b/wolfcrypt/src/port/arm/armv8-frodokem-asm.asm index 8dbf29e94e..0f32cbfd03 100644 --- a/wolfcrypt/src/port/arm/armv8-frodokem-asm.asm +++ b/wolfcrypt/src/port/arm/armv8-frodokem-asm.asm @@ -262,7 +262,6 @@ L_frodokem_sha3_x2_neon_begin ret ENDP IF :DEF:WOLFSSL_ARMASM_CRYPTO_SHA3 -; .arch_extension sha3 AREA |.text|, CODE, READONLY ALIGN 4 EXPORT frodokem_sha3_x2_crypto @@ -275,6 +274,7 @@ frodokem_sha3_x2_crypto PROC stp D14, D15, [x29, #64] adrp x1, L_sha3_aarch64_r add x1, x1, L_sha3_aarch64_r +; .arch_extension sha3 ld4 {V0.D, V1.D, V2.D, V3.D}[0], [x0], #32 ld4 {V4.D, V5.D, V6.D, V7.D}[0], [x0], #32 ld4 {V8.D, V9.D, V10.D, V11.D}[0], [x0], #32 diff --git a/wolfcrypt/src/port/arm/armv8-frodokem-asm_c.c b/wolfcrypt/src/port/arm/armv8-frodokem-asm_c.c index 7074cd9f8d..e27e6900a5 100644 --- a/wolfcrypt/src/port/arm/armv8-frodokem-asm_c.c +++ b/wolfcrypt/src/port/arm/armv8-frodokem-asm_c.c @@ -265,11 +265,13 @@ void frodokem_sha3_x2_neon(word64* state) } #ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 - " .arch_extension sha3\n\t" void frodokem_sha3_x2_crypto(word64* state) { const word64* r = L_sha3_aarch64_r; __asm__ __volatile__ ( +#ifdef __APPLE__ + ".arch_extension sha3\n\t" +#endif /* __APPLE__ */ "ld4 {v0.d, v1.d, v2.d, v3.d}[0], [%x[state]], #32\n\t" "ld4 {v4.d, v5.d, v6.d, v7.d}[0], [%x[state]], #32\n\t" "ld4 {v8.d, v9.d, v10.d, v11.d}[0], [%x[state]], #32\n\t" diff --git a/wolfcrypt/src/wc_frodokem.c b/wolfcrypt/src/wc_frodokem.c index 2725d70c1e..e6e81528e6 100644 --- a/wolfcrypt/src/wc_frodokem.c +++ b/wolfcrypt/src/wc_frodokem.c @@ -40,6 +40,12 @@ #include #include #include +#ifdef WOLF_CRYPTO_CB + #include +#endif +#ifndef WOLFSSL_FRODOKEM_NO_ASN1 + #include +#endif #ifdef NO_INLINE #include @@ -55,6 +61,11 @@ /* Domain separator prepended to seedSE when generating encapsulation noise. */ #define FRODOKEM_DOMAIN_ENCAPS 0x96 +/* The public key seedA || b is hashed as a single contiguous pkSize-byte block + * starting at key->seedA, so b must immediately follow seedA in the struct. */ +wc_static_assert(WC_OFFSETOF(FrodoKemKey, b) == + WC_OFFSETOF(FrodoKemKey, seedA) + FRODOKEM_SEEDA_SZ); + /******************************************************************************/ /* Parameter sets. */ /******************************************************************************/ @@ -560,7 +571,12 @@ int wc_FrodoKemKey_PublicKeySize(const FrodoKemKey* key, word32* len) static void frodokem_wipe_shake(FrodoKemKey* key) { if (key != NULL) { - (void)wc_InitShake128(&key->shake, NULL, INVALID_DEVID); + /* Re-initialising resets the Keccak state, erasing any residual secret + * (k') left in it. If that fails, clear the state directly so no secret + * material is left behind. */ + if (wc_InitShake128(&key->shake, NULL, INVALID_DEVID) != 0) { + ForceZero(&key->shake, sizeof(key->shake)); + } } } @@ -698,6 +714,7 @@ int wc_FrodoKemKey_MakeKey(FrodoKemKey* key, WC_RNG* rng) #ifndef WC_NO_RNG const FrodoKemParams* p = NULL; int randLen = 0; + int cbHandled = 0; #ifdef WOLFSSL_SMALL_STACK byte* rand = NULL; #else @@ -717,9 +734,21 @@ int wc_FrodoKemKey_MakeKey(FrodoKemKey* key, WC_RNG* rng) if (ret == 0) { randLen = p->lenSec + p->lenSE + FRODOKEM_SEEDA_SZ; } +#ifdef WOLF_CRYPTO_CB + /* Offload to a registered crypto callback when a device is set; fall + * through to the software path when the callback is unavailable. */ + if ((ret == 0) && (key->devId != INVALID_DEVID)) { + ret = wc_CryptoCb_MakePqcKemKey(rng, WC_PQC_KEM_TYPE_FRODOKEM, + key->type, key); + cbHandled = (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)); + if (!cbHandled) { + ret = 0; + } + } +#endif #ifdef WOLFSSL_SMALL_STACK /* Keep the random data off the stack. */ - if (ret == 0) { + if ((ret == 0) && !cbHandled) { rand = (byte*)XMALLOC((size_t)randLen, key->heap, DYNAMIC_TYPE_TMP_BUFFER); if (rand == NULL) { @@ -727,10 +756,10 @@ int wc_FrodoKemKey_MakeKey(FrodoKemKey* key, WC_RNG* rng) } } #endif - if (ret == 0) { + if ((ret == 0) && !cbHandled) { ret = wc_RNG_GenerateBlock(rng, rand, (word32)randLen); } - if (ret == 0) { + if ((ret == 0) && !cbHandled) { ret = wc_FrodoKemKey_MakeKeyWithRandom(key, rand, randLen); } @@ -937,6 +966,7 @@ int wc_FrodoKemKey_Encapsulate(FrodoKemKey* key, unsigned char* ct, #ifndef WC_NO_RNG const FrodoKemParams* p = NULL; int randLen = 0; + int cbHandled = 0; #ifdef WOLFSSL_SMALL_STACK byte* rand = NULL; #else @@ -956,9 +986,21 @@ int wc_FrodoKemKey_Encapsulate(FrodoKemKey* key, unsigned char* ct, if (ret == 0) { randLen = p->lenSec + p->lenSalt; } +#ifdef WOLF_CRYPTO_CB + /* Offload to a registered crypto callback when a device is set; fall + * through to the software path when the callback is unavailable. */ + if ((ret == 0) && (key->devId != INVALID_DEVID)) { + ret = wc_CryptoCb_PqcEncapsulate(ct, (word32)p->ctSize, ss, + (word32)p->lenSec, rng, WC_PQC_KEM_TYPE_FRODOKEM, key); + cbHandled = (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)); + if (!cbHandled) { + ret = 0; + } + } +#endif #ifdef WOLFSSL_SMALL_STACK /* Keep the random data off the stack. */ - if (ret == 0) { + if ((ret == 0) && !cbHandled) { rand = (byte*)XMALLOC((size_t)randLen, key->heap, DYNAMIC_TYPE_TMP_BUFFER); if (rand == NULL) { @@ -966,10 +1008,10 @@ int wc_FrodoKemKey_Encapsulate(FrodoKemKey* key, unsigned char* ct, } } #endif - if (ret == 0) { + if ((ret == 0) && !cbHandled) { ret = wc_RNG_GenerateBlock(rng, rand, (word32)randLen); } - if (ret == 0) { + if ((ret == 0) && !cbHandled) { ret = wc_FrodoKemKey_EncapsulateWithRandom(key, ct, ss, rand, randLen); } @@ -1055,6 +1097,7 @@ int wc_FrodoKemKey_Decapsulate(FrodoKemKey* key, unsigned char* ss, word32 isEq; byte mask; size_t matSz = 0; + int cbHandled = 0; if ((key == NULL) || (ss == NULL) || (ct == NULL)) { ret = BAD_FUNC_ARG; @@ -1072,7 +1115,19 @@ int wc_FrodoKemKey_Decapsulate(FrodoKemKey* key, unsigned char* ss, } } - if (ret == 0) { +#ifdef WOLF_CRYPTO_CB + /* Offload to a registered crypto callback when a device is set; fall + * through to the software path when the callback is unavailable. */ + if ((ret == 0) && (key->devId != INVALID_DEVID)) { + ret = wc_CryptoCb_PqcDecapsulate(ct, len, ss, (word32)p->lenSec, + WC_PQC_KEM_TYPE_FRODOKEM, key); + cbHandled = (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)); + if (!cbHandled) { + ret = 0; + } + } +#endif + if ((ret == 0) && !cbHandled) { n = p->n; heap = key->heap; c1 = ct; @@ -1107,7 +1162,7 @@ int wc_FrodoKemKey_Decapsulate(FrodoKemKey* key, unsigned char* ss, } } - if (ret == 0) { + if ((ret == 0) && !cbHandled) { /* B' = Unpack(c1, nbar, n) and C = Unpack(c2, nbar, nbar). */ frodokem_unpack(bpIn, c1, FRODOKEM_NBAR * n, p->d); frodokem_unpack(cIn, c2, nn, p->d); @@ -1127,18 +1182,18 @@ int wc_FrodoKemKey_Decapsulate(FrodoKemKey* key, unsigned char* ss, ret = frodokem_gen_seedse_k(p, &key->shake, key->pkh, uSalt, seedSEk + 1); } - if (ret == 0) { + if ((ret == 0) && !cbHandled) { /* Generate and sample S' | E' | E'' from SHAKE(domain || seedSE'). The * three are contiguous from sp, so they form a single noise region. The * row scratch is free here, so use it as the SHAKE block scratch. */ ret = frodokem_gen_noise(p, &key->shake, seedSEk, (byte*)row, sp, 2 * FRODOKEM_NBAR * n + FRODOKEM_NBAR_SQ, NULL, 0); } - if (ret == 0) { + if ((ret == 0) && !cbHandled) { /* B'' = S' * A + E', accumulated in place over E' in work. */ ret = frodokem_mul_add_sa_plus_e(key, work, sp, row); } - if (ret == 0) { + if ((ret == 0) && !cbHandled) { /* Compare B' (bpIn) against B'' (work) before reusing work. */ for (i = 0; i < FRODOKEM_NBAR * n; i++) { diff |= (word16)(bpIn[i] ^ work[i]); @@ -1162,7 +1217,7 @@ int wc_FrodoKemKey_Decapsulate(FrodoKemKey* key, unsigned char* ss, /* kHat = k' if ciphertext valid, else s (implicit rejection). Selected * in place over k' (kPrime) in seedSEk. */ for (i = 0; i < p->lenSec; i++) { - kPrime[i] = (byte)((kPrime[i] & mask) | (key->s[i] & (byte)~mask)); + kPrime[i] = ctMaskSel(mask, kPrime[i], key->s[i]); } /* ss = SHAKE(c1 || c2 || salt || kHat, lensec). c1 || c2 || salt is @@ -1436,4 +1491,316 @@ int wc_FrodoKemKey_DecodePrivateKey(FrodoKemKey* key, const unsigned char* in, return ret; } +/******************************************************************************/ +/* ASN.1 (SubjectPublicKeyInfo / PKCS#8) key encoding and decoding. */ +/******************************************************************************/ + +#ifndef WOLFSSL_FRODOKEM_NO_ASN1 +#if defined(WC_ENABLE_ASYM_KEY_EXPORT) || defined(WC_ENABLE_ASYM_KEY_IMPORT) + +/* Map a FrodoKEM key type to its ISO/IEC 18033-2 key-OID sum. Only the 976 and + * 1344 parameter sets have standardised OIDs, so a 640 (or unknown) type has no + * ASN.1 encoding. + * + * @param [in] type FrodoKEM key type (base | modifier bits). + * @param [out] oidSum OID sum (FRODOKEM_*k / EFRODOKEM_*k). + * @return 0 on success. + * @return BAD_FUNC_ARG when the type has no standardised OID. + */ +static int frodokem_type_to_oid_sum(int type, int* oidSum) +{ + int ret = 0; + + switch (type & (FRODOKEM_BASE_MASK | FRODOKEM_AES | FRODOKEM_EPHEMERAL)) { + case WC_FRODOKEM_976: + *oidSum = FRODOKEM_976_SHAKEk; + break; + case WC_FRODOKEM_976 | FRODOKEM_EPHEMERAL: + *oidSum = EFRODOKEM_976_SHAKEk; + break; + case WC_FRODOKEM_976 | FRODOKEM_AES: + *oidSum = FRODOKEM_976_AESk; + break; + case WC_FRODOKEM_976 | FRODOKEM_AES | FRODOKEM_EPHEMERAL: + *oidSum = EFRODOKEM_976_AESk; + break; + case WC_FRODOKEM_1344: + *oidSum = FRODOKEM_1344_SHAKEk; + break; + case WC_FRODOKEM_1344 | FRODOKEM_EPHEMERAL: + *oidSum = EFRODOKEM_1344_SHAKEk; + break; + case WC_FRODOKEM_1344 | FRODOKEM_AES: + *oidSum = FRODOKEM_1344_AESk; + break; + case WC_FRODOKEM_1344 | FRODOKEM_AES | FRODOKEM_EPHEMERAL: + *oidSum = EFRODOKEM_1344_AESk; + break; + default: + /* 640 (and any unknown type) has no standardised OID. */ + ret = BAD_FUNC_ARG; + break; + } + + return ret; +} + +#ifdef WC_ENABLE_ASYM_KEY_IMPORT +/* Map a decoded key-OID sum to a FrodoKEM key type. + * + * @param [in] oidSum OID sum from the decoded AlgorithmIdentifier. + * @param [out] type FrodoKEM key type. + * @return 0 on success. + * @return ASN_PARSE_E when the OID is not a FrodoKEM key OID. + */ +static int frodokem_oid_sum_to_type(int oidSum, int* type) +{ + int ret = 0; + + switch (oidSum) { + case FRODOKEM_976_SHAKEk: + *type = WC_FRODOKEM_976; + break; + case EFRODOKEM_976_SHAKEk: + *type = WC_FRODOKEM_976 | FRODOKEM_EPHEMERAL; + break; + case FRODOKEM_976_AESk: + *type = WC_FRODOKEM_976 | FRODOKEM_AES; + break; + case EFRODOKEM_976_AESk: + *type = WC_FRODOKEM_976 | FRODOKEM_AES | FRODOKEM_EPHEMERAL; + break; + case FRODOKEM_1344_SHAKEk: + *type = WC_FRODOKEM_1344; + break; + case EFRODOKEM_1344_SHAKEk: + *type = WC_FRODOKEM_1344 | FRODOKEM_EPHEMERAL; + break; + case FRODOKEM_1344_AESk: + *type = WC_FRODOKEM_1344 | FRODOKEM_AES; + break; + case EFRODOKEM_1344_AESk: + *type = WC_FRODOKEM_1344 | FRODOKEM_AES | FRODOKEM_EPHEMERAL; + break; + default: + ret = ASN_PARSE_E; + break; + } + + return ret; +} +#endif /* WC_ENABLE_ASYM_KEY_IMPORT */ + +#endif /* WC_ENABLE_ASYM_KEY_EXPORT || WC_ENABLE_ASYM_KEY_IMPORT */ + +#ifdef WC_ENABLE_ASYM_KEY_EXPORT +/* Encode the FrodoKEM public key as a DER SubjectPublicKeyInfo. + * + * @param [in] key FrodoKEM key object with public key set. + * @param [out] output Buffer for the DER, or NULL to get the length. + * @param [in] len Size of output buffer in bytes. + * @param [in] withAlg Include the SubjectPublicKeyInfo wrapper (1) or emit + * only the raw public key bytes (0). + * @return Length of the encoding in bytes on success. + * @return BAD_FUNC_ARG when key is NULL or the type has no OID. + * @return MEMORY_E when dynamic memory allocation fails. + */ +int wc_FrodoKemKey_PublicKeyToDer(FrodoKemKey* key, byte* output, word32 len, + int withAlg) +{ + int ret = 0; + int oidSum = 0; + word32 pkSize = 0; + byte* rawPk = NULL; + + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + if (ret == 0) { + ret = frodokem_type_to_oid_sum(key->type, &oidSum); + } + if (ret == 0) { + ret = wc_FrodoKemKey_PublicKeySize(key, &pkSize); + } + if (ret == 0) { + rawPk = (byte*)XMALLOC((size_t)pkSize, key->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (rawPk == NULL) { + ret = MEMORY_E; + } + } + if (ret == 0) { + ret = wc_FrodoKemKey_EncodePublicKey(key, rawPk, pkSize); + } + if (ret == 0) { + ret = SetAsymKeyDerPublic(rawPk, pkSize, output, len, oidSum, withAlg); + } + + if (rawPk != NULL) { + XFREE(rawPk, key->heap, DYNAMIC_TYPE_TMP_BUFFER); + } + + return ret; +} + +/* Encode the FrodoKEM private key as a DER PKCS#8 OneAsymmetricKey. + * + * FrodoKEM's private key already embeds the public key, so no separate public + * key is appended (PKCS#8 version 1). + * + * @param [in] key FrodoKEM key object with private key set. + * @param [out] output Buffer for the DER, or NULL to get the length. + * @param [in] len Size of output buffer in bytes. + * @return Length of the encoding in bytes on success. + * @return BAD_FUNC_ARG when key is NULL or the type has no OID. + * @return MEMORY_E when dynamic memory allocation fails. + */ +int wc_FrodoKemKey_PrivateKeyToDer(FrodoKemKey* key, byte* output, word32 len) +{ + int ret = 0; + int oidSum = 0; + word32 skSize = 0; + byte* rawSk = NULL; + + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + if (ret == 0) { + ret = frodokem_type_to_oid_sum(key->type, &oidSum); + } + if (ret == 0) { + ret = wc_FrodoKemKey_PrivateKeySize(key, &skSize); + } + if (ret == 0) { + rawSk = (byte*)XMALLOC((size_t)skSize, key->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (rawSk == NULL) { + ret = MEMORY_E; + } + } + if (ret == 0) { + ret = wc_FrodoKemKey_EncodePrivateKey(key, rawSk, skSize); + } + if (ret == 0) { + ret = SetAsymKeyDer(rawSk, skSize, NULL, 0, output, len, oidSum); + } + + if (rawSk != NULL) { + /* rawSk held the private key (secret s and S^T). */ + ForceZero(rawSk, skSize); + XFREE(rawSk, key->heap, DYNAMIC_TYPE_TMP_BUFFER); + } + + return ret; +} +#endif /* WC_ENABLE_ASYM_KEY_EXPORT */ + +#ifdef WC_ENABLE_ASYM_KEY_IMPORT +/* Decode a DER SubjectPublicKeyInfo into a FrodoKEM public key. + * + * When the key object already has a type set, the DER OID must match it; + * otherwise the type is taken from the OID and the object is initialized. For + * that auto-detect case the caller must zero the object first, and the new key + * inherits its key->heap and key->devId (so a zeroed object yields devId 0 - + * set key->devId to INVALID_DEVID first if software is required). + * + * @param [in, out] key FrodoKEM key object. + * @param [in] input DER buffer. + * @param [in] inSz Size of DER buffer in bytes. + * @param [in, out] inOutIdx On in, index into buffer; on out, index after. + * @return 0 on success. + * @return BAD_FUNC_ARG when a pointer is NULL. + * @return ASN_PARSE_E when the DER or OID is invalid. + */ +int wc_FrodoKemKey_PublicKeyDecode(FrodoKemKey* key, const byte* input, + word32 inSz, word32* inOutIdx) +{ + int ret = 0; + int keyType = ANONk; + const byte* pubKey = NULL; + word32 pubKeyLen = 0; + + if ((key == NULL) || (input == NULL) || (inOutIdx == NULL)) { + ret = BAD_FUNC_ARG; + } + /* If already initialized, require the DER OID to match the key type. */ + if ((ret == 0) && (key->params != NULL)) { + ret = frodokem_type_to_oid_sum(key->type, &keyType); + } + if (ret == 0) { + ret = DecodeAsymKeyPublic_Assign(input, inOutIdx, inSz, &pubKey, + &pubKeyLen, &keyType); + } + /* Not initialized: set up the object from the decoded OID. */ + if ((ret == 0) && (key->params == NULL)) { + void* heap = key->heap; + int devId = key->devId; + int type = 0; + ret = frodokem_oid_sum_to_type(keyType, &type); + if (ret == 0) { + ret = wc_FrodoKemKey_Init(key, type, heap, devId); + } + } + if (ret == 0) { + ret = wc_FrodoKemKey_DecodePublicKey(key, pubKey, pubKeyLen); + } + + return ret; +} + +/* Decode a DER PKCS#8 OneAsymmetricKey into a FrodoKEM private key. + * + * Type auto-detection and the key->heap / key->devId inheritance behave as + * described for wc_FrodoKemKey_PublicKeyDecode. + * + * @param [in, out] key FrodoKEM key object. + * @param [in] input DER buffer. + * @param [in] inSz Size of DER buffer in bytes. + * @param [in, out] inOutIdx On in, index into buffer; on out, index after. + * @return 0 on success. + * @return BAD_FUNC_ARG when a pointer is NULL. + * @return ASN_PARSE_E when the DER or OID is invalid. + */ +int wc_FrodoKemKey_PrivateKeyDecode(FrodoKemKey* key, const byte* input, + word32 inSz, word32* inOutIdx) +{ + int ret = 0; + int keyType = ANONk; + const byte* privKey = NULL; + word32 privKeyLen = 0; + const byte* pubKey = NULL; + word32 pubKeyLen = 0; + + if ((key == NULL) || (input == NULL) || (inOutIdx == NULL)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (key->params != NULL)) { + ret = frodokem_type_to_oid_sum(key->type, &keyType); + } + if (ret == 0) { + /* A KEM has no seed in the blob and, as FrodoKEM's private key already + * embeds the public key, no trailing public key either (so pubKeyLen + * comes back 0). The pubKey out-params must still be non-NULL. */ + ret = DecodeAsymKey_Assign(input, inOutIdx, inSz, NULL, NULL, &privKey, + &privKeyLen, &pubKey, &pubKeyLen, &keyType); + } + if ((ret == 0) && (key->params == NULL)) { + void* heap = key->heap; + int devId = key->devId; + int type = 0; + ret = frodokem_oid_sum_to_type(keyType, &type); + if (ret == 0) { + ret = wc_FrodoKemKey_Init(key, type, heap, devId); + } + } + if (ret == 0) { + ret = wc_FrodoKemKey_DecodePrivateKey(key, privKey, privKeyLen); + } + + return ret; +} +#endif /* WC_ENABLE_ASYM_KEY_IMPORT */ + +#endif /* !WOLFSSL_FRODOKEM_NO_ASN1 */ + #endif /* WOLFSSL_HAVE_FRODOKEM */ diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index eb0c48bd39..b35f33c92a 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -1480,6 +1480,9 @@ static WC_MAYBE_UNUSED Aes* test_AesGcmNew(void* heap, int declaredDevId, #ifdef WOLFSSL_STATIC_MEMORY #if defined(WOLFSSL_STATIC_MEMORY_TEST_SZ) static byte gTestMemory[WOLFSSL_STATIC_MEMORY_TEST_SZ]; + #elif defined(WOLFSSL_HAVE_FRODOKEM) + /* FrodoKEM keys (~44 KB) and decaps matrices (~86 KB) are large. */ + static byte gTestMemory[1024*1024]; #elif defined(WOLFSSL_HAVE_MLDSA) #if defined(WOLFSSL_MLDSA_VERIFY_SMALL_MEM) && \ defined(WOLFSSL_MLDSA_SIGN_SMALL_MEM) && \ @@ -53586,6 +53589,11 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t frodokem_test(void) #if !defined(WC_NO_RNG) && !defined(WOLFSSL_FRODOKEM_NO_MAKE_KEY) && \ !defined(WOLFSSL_FRODOKEM_NO_ENCAPSULATE) && \ !defined(WOLFSSL_FRODOKEM_NO_DECAPSULATE) + /* ASN.1 key encode/decode is exercised when it has not been disabled. */ +#if !defined(WOLFSSL_FRODOKEM_NO_ASN1) && \ + defined(WC_ENABLE_ASYM_KEY_EXPORT) && defined(WC_ENABLE_ASYM_KEY_IMPORT) + #define FRODOKEM_TEST_ASN1 +#endif static const int types[] = { #ifdef WOLFSSL_FRODOKEM_SHAKE #ifdef WOLFSSL_WC_FRODOKEM_640 @@ -53649,6 +53657,10 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t frodokem_test(void) word32 skLen = 0; word32 ctLen = 0; word32 ssLen = 0; +#ifdef FRODOKEM_TEST_ASN1 + FrodoKemKey* key2 = NULL; + byte* der = NULL; +#endif key = (FrodoKemKey*)XMALLOC(sizeof(*key), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -53662,6 +53674,20 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t frodokem_test(void) ret = WC_TEST_RET_ENC_NC; goto out; } +#ifdef FRODOKEM_TEST_ASN1 + key2 = (FrodoKemKey*)XMALLOC(sizeof(*key2), HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + /* Zeroize now so key2 is Free-safe on every error path. */ + if (key2 != NULL) { + XMEMSET(key2, 0, sizeof(*key2)); + } + der = (byte*)XMALLOC(FRODOKEM_MAX_PRV_KEY_DER_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + if ((key2 == NULL) || (der == NULL)) { + ret = WC_TEST_RET_ENC_NC; + goto out; + } +#endif ret = wc_InitRng_ex(&rng, HEAP_HINT, devId); if (ret != 0) { @@ -53705,9 +53731,71 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t frodokem_test(void) ret = WC_TEST_RET_ENC_NC; break; } - wc_FrodoKemKey_Free(key); +#ifdef FRODOKEM_TEST_ASN1 + /* ASN.1 round trip. The 640 parameter sets have no standardised OID, + * so their encoding is expected to be rejected. */ + if ((types[i] & FRODOKEM_BASE_MASK) != WC_FRODOKEM_640) { + word32 idx = 0; + int derLen; + + /* Public key: SubjectPublicKeyInfo. Encapsulate to the decoded + * public key; the original private key must decapsulate it. */ + derLen = wc_FrodoKemKey_PublicKeyToDer(key, der, + FRODOKEM_MAX_PUB_KEY_DER_SIZE, 1); + if (derLen < 0) { ret = WC_TEST_RET_ENC_EC(derLen); break; } + ret = wc_FrodoKemKey_Init(key2, types[i], HEAP_HINT, devId); + if (ret != 0) { ret = WC_TEST_RET_ENC_EC(ret); break; } + ret = wc_FrodoKemKey_PublicKeyDecode(key2, der, (word32)derLen, + &idx); + if (ret != 0) { ret = WC_TEST_RET_ENC_EC(ret); break; } + ret = wc_FrodoKemKey_Encapsulate(key2, ct, ss, &rng); + if (ret != 0) { ret = WC_TEST_RET_ENC_EC(ret); break; } + ret = wc_FrodoKemKey_Decapsulate(key, ss2, ct, ctLen); + if (ret != 0) { ret = WC_TEST_RET_ENC_EC(ret); break; } + if (XMEMCMP(ss, ss2, ssLen) != 0) { + ret = WC_TEST_RET_ENC_NC; break; + } + wc_FrodoKemKey_Free(key2); + + /* Private key: PKCS#8. The decoded private key must decapsulate a + * ciphertext produced for the original public key. */ + idx = 0; + derLen = wc_FrodoKemKey_PrivateKeyToDer(key, der, + FRODOKEM_MAX_PRV_KEY_DER_SIZE); + if (derLen < 0) { ret = WC_TEST_RET_ENC_EC(derLen); break; } + ret = wc_FrodoKemKey_Init(key2, types[i], HEAP_HINT, devId); + if (ret != 0) { ret = WC_TEST_RET_ENC_EC(ret); break; } + ret = wc_FrodoKemKey_PrivateKeyDecode(key2, der, (word32)derLen, + &idx); + if (ret != 0) { ret = WC_TEST_RET_ENC_EC(ret); break; } + ret = wc_FrodoKemKey_Encapsulate(key, ct, ss, &rng); + if (ret != 0) { ret = WC_TEST_RET_ENC_EC(ret); break; } + ret = wc_FrodoKemKey_Decapsulate(key2, ss2, ct, ctLen); + if (ret != 0) { ret = WC_TEST_RET_ENC_EC(ret); break; } + if (XMEMCMP(ss, ss2, ssLen) != 0) { + ret = WC_TEST_RET_ENC_NC; break; + } + wc_FrodoKemKey_Free(key2); + } + else { + /* 640 has no standardised OID: encoding must be rejected. */ + if (wc_FrodoKemKey_PublicKeyToDer(key, der, + FRODOKEM_MAX_PUB_KEY_DER_SIZE, 1) != + WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { + ret = WC_TEST_RET_ENC_NC; break; + } + if (wc_FrodoKemKey_PrivateKeyToDer(key, der, + FRODOKEM_MAX_PRV_KEY_DER_SIZE) != + WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { + ret = WC_TEST_RET_ENC_NC; break; + } + } +#endif /* FRODOKEM_TEST_ASN1 */ } + /* key is freed once at out:, which covers both the normal loop-exit and + * the error-break paths. wc_FrodoKemKey_Init zeroizes the object on + * re-entry, so no per-iteration free is needed. */ out: if (key != NULL) wc_FrodoKemKey_Free(key); @@ -53717,6 +53805,13 @@ out: XFREE(pk, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); XFREE(ct, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#ifdef FRODOKEM_TEST_ASN1 + if (key2 != NULL) + wc_FrodoKemKey_Free(key2); + XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key2, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + #undef FRODOKEM_TEST_ASN1 +#endif #endif /* !WC_NO_RNG */ return ret; } @@ -76622,6 +76717,42 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx) } } #endif /* WOLFSSL_HAVE_MLKEM */ + #ifdef WOLFSSL_HAVE_FRODOKEM + if (info->pk.type == WC_PK_TYPE_PQC_KEM_KEYGEN) { + if ((info->pk.pqc_kem_kg.type == WC_PQC_KEM_TYPE_FRODOKEM) && + (info->pk.pqc_kem_kg.key != NULL)) { + FrodoKemKey* key = (FrodoKemKey*)info->pk.pqc_kem_kg.key; + /* set devId to invalid, so software is used */ + key->devId = INVALID_DEVID; + ret = wc_FrodoKemKey_MakeKey(key, info->pk.pqc_kem_kg.rng); + key->devId = devIdArg; + } + } + else if (info->pk.type == WC_PK_TYPE_PQC_KEM_ENCAPS) { + if ((info->pk.pqc_encaps.type == WC_PQC_KEM_TYPE_FRODOKEM) && + (info->pk.pqc_encaps.key != NULL)) { + FrodoKemKey* key = (FrodoKemKey*)info->pk.pqc_encaps.key; + key->devId = INVALID_DEVID; + ret = wc_FrodoKemKey_Encapsulate(key, + info->pk.pqc_encaps.ciphertext, + info->pk.pqc_encaps.sharedSecret, + info->pk.pqc_encaps.rng); + key->devId = devIdArg; + } + } + else if (info->pk.type == WC_PK_TYPE_PQC_KEM_DECAPS) { + if ((info->pk.pqc_decaps.type == WC_PQC_KEM_TYPE_FRODOKEM) && + (info->pk.pqc_decaps.key != NULL)) { + FrodoKemKey* key = (FrodoKemKey*)info->pk.pqc_decaps.key; + key->devId = INVALID_DEVID; + ret = wc_FrodoKemKey_Decapsulate(key, + info->pk.pqc_decaps.sharedSecret, + info->pk.pqc_decaps.ciphertext, + info->pk.pqc_decaps.ciphertextLen); + key->devId = devIdArg; + } + } + #endif /* WOLFSSL_HAVE_FRODOKEM */ } else if (info->algo_type == WC_ALGO_TYPE_CIPHER) { #if !defined(NO_AES) || !defined(NO_DES3) diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h index 009c258742..bd380e69ba 100644 --- a/wolfssl/wolfcrypt/asn.h +++ b/wolfssl/wolfcrypt/asn.h @@ -2883,7 +2883,8 @@ enum cert_enums { SLH_DSA_SHAKE_256F_KEY = 35, LMS_KEY = 36, XMSS_KEY = 37, - XMSSMT_KEY = 38 + XMSSMT_KEY = 38, + FRODOKEM_KEY = 39 }; #ifndef WOLFSSL_NO_DILITHIUM_LEGACY_NAMES @@ -3347,7 +3348,8 @@ WOLFSSL_LOCAL int wolfssl_local_MatchDnsNameConstraint(const char* name, || (defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_IMPORT)) \ || (defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)) \ || (defined(HAVE_CURVE448) && defined(HAVE_CURVE448_KEY_IMPORT)) \ - || defined(HAVE_FALCON) || defined(WOLFSSL_HAVE_MLDSA) || defined(WOLFSSL_HAVE_SLHDSA)) + || defined(HAVE_FALCON) || defined(WOLFSSL_HAVE_MLDSA) \ + || defined(WOLFSSL_HAVE_SLHDSA) || defined(WOLFSSL_HAVE_FRODOKEM)) WOLFSSL_LOCAL int DecodeAsymKey_Assign(const byte* input, word32* inOutIdx, word32 inSz, const byte** seed, word32* seedLen, const byte** privKey, word32* privKeyLen, const byte** pubKey, word32* pubKeyLen, diff --git a/wolfssl/wolfcrypt/asn_public.h b/wolfssl/wolfcrypt/asn_public.h index d557ac94cd..51f073947f 100644 --- a/wolfssl/wolfcrypt/asn_public.h +++ b/wolfssl/wolfcrypt/asn_public.h @@ -183,7 +183,8 @@ enum CertType { TRUSTED_CERT_TYPE, LMS_TYPE, XMSS_TYPE, - XMSSMT_TYPE + XMSSMT_TYPE, + FRODOKEM_TYPE }; #ifndef WOLFSSL_NO_DILITHIUM_LEGACY_NAMES diff --git a/wolfssl/wolfcrypt/cryptocb.h b/wolfssl/wolfcrypt/cryptocb.h index 3de89680e6..b1dc22c845 100644 --- a/wolfssl/wolfcrypt/cryptocb.h +++ b/wolfssl/wolfcrypt/cryptocb.h @@ -80,6 +80,9 @@ #ifdef WOLFSSL_HAVE_MLKEM #include #endif +#ifdef WOLFSSL_HAVE_FRODOKEM + #include +#endif #if defined(WOLFSSL_HAVE_MLDSA) #include #endif @@ -309,7 +312,7 @@ typedef struct wc_CryptoInfo { byte contextLen; } ed25519verify; #endif - #if defined(WOLFSSL_HAVE_MLKEM) + #if defined(WOLFSSL_HAVE_MLKEM) || defined(WOLFSSL_HAVE_FRODOKEM) struct { WC_RNG* rng; int size; @@ -830,7 +833,7 @@ WOLFSSL_LOCAL int wc_CryptoCb_PqcStatefulSigSigsLeft(int type, void* key, word32* sigsLeft); #endif /* WOLFSSL_HAVE_LMS || WOLFSSL_HAVE_XMSS */ -#if defined(WOLFSSL_HAVE_MLKEM) +#if defined(WOLFSSL_HAVE_MLKEM) || defined(WOLFSSL_HAVE_FRODOKEM) WOLFSSL_LOCAL int wc_CryptoCb_PqcKemGetDevId(int type, void* key); WOLFSSL_LOCAL int wc_CryptoCb_MakePqcKemKey(WC_RNG* rng, int type, @@ -843,7 +846,7 @@ WOLFSSL_LOCAL int wc_CryptoCb_PqcEncapsulate(byte* ciphertext, WOLFSSL_LOCAL int wc_CryptoCb_PqcDecapsulate(const byte* ciphertext, word32 ciphertextLen, byte* sharedSecret, word32 sharedSecretLen, int type, void* key); -#endif /* WOLFSSL_HAVE_MLKEM */ +#endif /* WOLFSSL_HAVE_MLKEM || WOLFSSL_HAVE_FRODOKEM */ #if defined(HAVE_FALCON) || defined(WOLFSSL_HAVE_MLDSA) || \ defined(WOLFSSL_HAVE_SLHDSA) diff --git a/wolfssl/wolfcrypt/memory.h b/wolfssl/wolfcrypt/memory.h index 155b8aa4ea..257745385b 100644 --- a/wolfssl/wolfcrypt/memory.h +++ b/wolfssl/wolfcrypt/memory.h @@ -133,7 +133,7 @@ WOLFSSL_API int wolfSSL_GetAllocators(wolfSSL_Malloc_cb* mf, #ifndef LARGEST_MEM_BUCKET #ifndef SESSION_CERTS - #ifdef WOLFSSL_HAVE_MLDSA + #if defined(WOLFSSL_HAVE_MLDSA) || defined(WOLFSSL_HAVE_FRODOKEM) #define LARGEST_MEM_BUCKET 131072 #else #define LARGEST_MEM_BUCKET 16128 @@ -155,7 +155,7 @@ WOLFSSL_API int wolfSSL_GetAllocators(wolfSSL_Malloc_cb* mf, #ifndef WOLFMEM_BUCKETS #ifndef SESSION_CERTS - #ifdef WOLFSSL_HAVE_MLDSA + #if defined(WOLFSSL_HAVE_MLDSA) || defined(WOLFSSL_HAVE_FRODOKEM) /* default size of chunks of memory to separate into */ #define WOLFMEM_BUCKETS 64,128,256,512,1024,8192,32768,\ 65536,LARGEST_MEM_BUCKET @@ -188,7 +188,7 @@ WOLFSSL_API int wolfSSL_GetAllocators(wolfSSL_Malloc_cb* mf, #endif #ifndef WOLFMEM_DIST - #ifdef WOLFSSL_HAVE_MLDSA + #if defined(WOLFSSL_HAVE_MLDSA) || defined(WOLFSSL_HAVE_FRODOKEM) #define WOLFMEM_DIST 30,10,8,15,8,10,8,5,1 #elif defined(WOLFSSL_HAVE_MLKEM) #define WOLFMEM_DIST 49,10,6,14,5,6,14,1,1 diff --git a/wolfssl/wolfcrypt/oid_sum.h b/wolfssl/wolfcrypt/oid_sum.h index c24dd97d17..1a650deed3 100644 --- a/wolfssl/wolfcrypt/oid_sum.h +++ b/wolfssl/wolfcrypt/oid_sum.h @@ -225,7 +225,23 @@ enum Key_Sum { /* 0x2b,0x06,0x01,0x05,0x05,0x07,0x06,0x22 */ XMSSk = 107, /* 1.3.6.1.5.5.7.6.34 */ /* 0x2b,0x06,0x01,0x05,0x05,0x07,0x06,0x23 */ - XMSSMTk = 108 /* 1.3.6.1.5.5.7.6.35 */ + XMSSMTk = 108, /* 1.3.6.1.5.5.7.6.35 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x01 */ + FRODOKEM_976_SHAKEk = 100434, /* 1.0.18033.2.2.7.1 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x02 */ + FRODOKEM_1344_SHAKEk = 100435, /* 1.0.18033.2.2.7.2 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x03 */ + EFRODOKEM_976_SHAKEk = 100436, /* 1.0.18033.2.2.7.3 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x04 */ + EFRODOKEM_1344_SHAKEk = 100437, /* 1.0.18033.2.2.7.4 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x05 */ + FRODOKEM_976_AESk = 100438, /* 1.0.18033.2.2.7.5 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x06 */ + FRODOKEM_1344_AESk = 100439, /* 1.0.18033.2.2.7.6 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x07 */ + EFRODOKEM_976_AESk = 100440, /* 1.0.18033.2.2.7.7 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x08 */ + EFRODOKEM_1344_AESk = 100441 /* 1.0.18033.2.2.7.8 */ #else /* 0x00 */ ANONk = 0x7fffffff, /* 0.0 */ @@ -296,7 +312,23 @@ enum Key_Sum { /* 0x2b,0x06,0x01,0x05,0x05,0x07,0x06,0x22 */ XMSSk = 0x2707012e, /* 1.3.6.1.5.5.7.6.34 */ /* 0x2b,0x06,0x01,0x05,0x05,0x07,0x06,0x23 */ - XMSSMTk = 0x2607012e /* 1.3.6.1.5.5.7.6.35 */ + XMSSMTk = 0x2607012e, /* 1.3.6.1.5.5.7.6.35 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x01 */ + FRODOKEM_976_SHAKEk = 0x708b832a, /* 1.0.18033.2.2.7.1 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x02 */ + FRODOKEM_1344_SHAKEk = 0x738b832a, /* 1.0.18033.2.2.7.2 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x03 */ + EFRODOKEM_976_SHAKEk = 0x728b832a, /* 1.0.18033.2.2.7.3 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x04 */ + EFRODOKEM_1344_SHAKEk = 0x758b832a, /* 1.0.18033.2.2.7.4 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x05 */ + FRODOKEM_976_AESk = 0x748b832a, /* 1.0.18033.2.2.7.5 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x06 */ + FRODOKEM_1344_AESk = 0x778b832a, /* 1.0.18033.2.2.7.6 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x07 */ + EFRODOKEM_976_AESk = 0x768b832a, /* 1.0.18033.2.2.7.7 */ + /* 0x28,0x81,0x8c,0x71,0x02,0x02,0x07,0x08 */ + EFRODOKEM_1344_AESk = 0x798b832a /* 1.0.18033.2.2.7.8 */ #endif }; diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index a24bdf0085..53f5869dcb 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -3702,6 +3702,7 @@ (defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT)) || \ (defined(HAVE_CURVE448) && defined(HAVE_CURVE448_KEY_EXPORT)) || \ defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) || \ + defined(WOLFSSL_HAVE_FRODOKEM) || \ defined(WOLFSSL_HAVE_SLHDSA) || defined(HAVE_LIBOQS) || \ (defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY)) || \ (defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY))) @@ -3714,6 +3715,7 @@ (defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)) || \ (defined(HAVE_CURVE448) && defined(HAVE_CURVE448_KEY_IMPORT)) || \ defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) || \ + defined(WOLFSSL_HAVE_FRODOKEM) || \ defined(WOLFSSL_HAVE_SLHDSA) || defined(HAVE_LIBOQS) || \ (defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY)) || \ (defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY))) diff --git a/wolfssl/wolfcrypt/types.h b/wolfssl/wolfcrypt/types.h index aad0ad68b4..df6e5d8879 100644 --- a/wolfssl/wolfcrypt/types.h +++ b/wolfssl/wolfcrypt/types.h @@ -1588,7 +1588,7 @@ enum wc_PkType { WC_PK_TYPE_CURVE25519_KEYGEN = 16, WC_PK_TYPE_RSA_GET_SIZE = 17, #define _WC_PK_TYPE_MAX WC_PK_TYPE_RSA_GET_SIZE -#if defined(WOLFSSL_HAVE_MLKEM) +#if defined(WOLFSSL_HAVE_MLKEM) || defined(WOLFSSL_HAVE_FRODOKEM) WC_PK_TYPE_PQC_KEM_KEYGEN = 18, WC_PK_TYPE_PQC_KEM_ENCAPS = 19, WC_PK_TYPE_PQC_KEM_DECAPS = 20, @@ -1626,7 +1626,7 @@ enum wc_PkType { WC_PK_TYPE_MAX = _WC_PK_TYPE_MAX }; -#if defined(WOLFSSL_HAVE_MLKEM) +#if defined(WOLFSSL_HAVE_MLKEM) || defined(WOLFSSL_HAVE_FRODOKEM) /* Post quantum KEM algorithms */ enum wc_PqcKemType { WC_PQC_KEM_TYPE_NONE = 0, @@ -1634,6 +1634,9 @@ enum wc_PkType { WC_PQC_KEM_TYPE_MLKEM = 1, #undef _WC_PQC_KEM_TYPE_MAX #define _WC_PQC_KEM_TYPE_MAX WC_PQC_KEM_TYPE_MLKEM + WC_PQC_KEM_TYPE_FRODOKEM = 2, + #undef _WC_PQC_KEM_TYPE_MAX + #define _WC_PQC_KEM_TYPE_MAX WC_PQC_KEM_TYPE_FRODOKEM WC_PQC_KEM_TYPE_MAX = _WC_PQC_KEM_TYPE_MAX }; diff --git a/wolfssl/wolfcrypt/wc_frodokem.h b/wolfssl/wolfcrypt/wc_frodokem.h index 264eb5dd2b..f1ec219877 100644 --- a/wolfssl/wolfcrypt/wc_frodokem.h +++ b/wolfssl/wolfcrypt/wc_frodokem.h @@ -190,6 +190,16 @@ /* Number of coefficients in the secret matrix S^T (nbar * n). */ #define FRODOKEM_MAX_S_CNT (FRODOKEM_NBAR * FRODOKEM_MAX_N) +/* DER (SubjectPublicKeyInfo / PKCS#8) encoding overhead over the raw key. */ +#define FRODOKEM_ASN1_PUB_OVERHEAD 32 +#define FRODOKEM_ASN1_PRV_OVERHEAD 40 +/* Maximum DER-encoded key sizes over the enabled parameter sets. Callers may + * also pass a NULL output to the *ToDer functions to get the exact length. */ +#define FRODOKEM_MAX_PUB_KEY_DER_SIZE \ + (FRODOKEM_MAX_PUBLIC_KEY_SIZE + FRODOKEM_ASN1_PUB_OVERHEAD) +#define FRODOKEM_MAX_PRV_KEY_DER_SIZE \ + (FRODOKEM_MAX_PRIVATE_KEY_SIZE + FRODOKEM_ASN1_PRV_OVERHEAD) + enum { /* Base parameter sets. On their own these select the standard (salted) @@ -317,6 +327,20 @@ WOLFSSL_API int wc_FrodoKemKey_EncodePrivateKey(FrodoKemKey* key, WOLFSSL_API int wc_FrodoKemKey_EncodePublicKey(FrodoKemKey* key, unsigned char* out, word32 len); +#ifndef WOLFSSL_FRODOKEM_NO_ASN1 +#ifdef WC_ENABLE_ASYM_KEY_EXPORT +WOLFSSL_API int wc_FrodoKemKey_PublicKeyToDer(FrodoKemKey* key, byte* output, + word32 len, int withAlg); +WOLFSSL_API int wc_FrodoKemKey_PrivateKeyToDer(FrodoKemKey* key, byte* output, + word32 len); +#endif /* WC_ENABLE_ASYM_KEY_EXPORT */ +#ifdef WC_ENABLE_ASYM_KEY_IMPORT +WOLFSSL_API int wc_FrodoKemKey_PublicKeyDecode(FrodoKemKey* key, + const byte* input, word32 inSz, word32* inOutIdx); +WOLFSSL_API int wc_FrodoKemKey_PrivateKeyDecode(FrodoKemKey* key, + const byte* input, word32 inSz, word32* inOutIdx); +#endif /* WC_ENABLE_ASYM_KEY_IMPORT */ +#endif /* !WOLFSSL_FRODOKEM_NO_ASN1 */ #ifdef __cplusplus