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.
This commit is contained in:
Sean Parkinson
2026-07-13 16:10:42 +10:00
parent 607d7cfdb3
commit 78df69d051
44 changed files with 4958 additions and 66 deletions
+1
View File
@@ -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
+42
View File
@@ -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<N>-key.der FrodoKEM-<N> (SHAKE) private key, PKCS#8.
frodokem<N>-key.pem
frodokem<N>_pub-spki.der FrodoKEM-<N> public key, SubjectPublicKeyInfo.
frodokem<N>-cert.der FrodoKEM-<N> leaf certificate signed by the ECC
frodokem<N>-cert.pem CA (subject key is FrodoKEM, signature is ECDSA).
frodokem<N>-req.der FrodoKEM-<N> certificate request (PKCS#10),
frodokem<N>-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.
Binary file not shown.
+14
View File
@@ -0,0 +1,14 @@
-----BEGIN CERTIFICATE-----
MIICEzCCAbmgAwIBAgIQLsJMxJ0pvxI9bYcdLnYYWTAKBggqhkjOPQQDAjBxMQsw
CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEQ
MA4GA1UECgwHd29sZlNTTDENMAsGA1UECwwEVGVzdDEdMBsGA1UEAwwURnJvZG9L
RU0gVGVzdCBFQ0MgQ0EwIhgPMjAyNjA3MTIwNDE3MzhaGA8yMTI2MDYxOTA0MTcz
OFowcTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv
emVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxDTALBgNVBAsMBFRlc3QxHTAbBgNVBAMM
FEZyb2RvS0VNIFRlc3QgRUNDIENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
lmrJv8E5Z9nxzcyFWnRcQDwQVK0yZW10dS1i2xWRHquf4YNX4C/TXwUVqCGaSgaT
UxwbCF3QtR5y43n6rKNYmqMvMC0wDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQU41ak
BnP4505sNDHigUVlOFv0K9gwCgYIKoZIzj0EAwIDSAAwRQIhAPRzykW9LJ8iATDl
jIE5crF2/5YCg+RYMB2XG2VrVoeLAiBAVo3KhhWGCZgSlQ1JmlGSmFnLM7UaiXzE
TeZ8oyaqXA==
-----END CERTIFICATE-----
Binary file not shown.
+5
View File
@@ -0,0 +1,5 @@
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEICBWOGxeT5BVTVs82QLQ71ahUMDedN3inIZhqsR+U89ToAoGCCqGSM49
AwEHoUQDQgAElmrJv8E5Z9nxzcyFWnRcQDwQVK0yZW10dS1i2xWRHquf4YNX4C/T
XwUVqCGaSgaTUxwbCF3QtR5y43n6rKNYmg==
-----END EC PRIVATE KEY-----
Binary file not shown.
+461
View File
@@ -0,0 +1,461 @@
-----BEGIN CERTIFICATE-----
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
Ptb5Y875X6sGe3/VOA==
-----END CERTIFICATE-----
Binary file not shown.
+901
View File
@@ -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-----
Binary file not shown.
+456
View File
@@ -0,0 +1,456 @@
-----BEGIN CERTIFICATE REQUEST-----
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
Y9B6B3E=
-----END CERTIFICATE REQUEST-----
Binary file not shown.
Binary file not shown.
+338
View File
@@ -0,0 +1,338 @@
-----BEGIN CERTIFICATE-----
MII+5zCCPo6gAwIBAgIQURoYBxm/Ti3pJ8siUBvWqzAKBggqhkjOPQQDAjBxMQsw
CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEQ
MA4GA1UECgwHd29sZlNTTDENMAsGA1UECwwEVGVzdDEdMBsGA1UEAwwURnJvZG9L
RU0gVGVzdCBFQ0MgQ0EwIhgPMjAyNjA3MTIwNDE3MzhaGA8yMTI2MDYxOTA0MTcz
OFowaTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv
emVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxDTALBgNVBAsMBFRlc3QxFTATBgNVBAMM
DEZyb2RvS0VNLTk3NjCCPSEwCgYIKIGMcQICBwEDgj0RAJZF0jtQn0vU7wDrK/7h
586R20kj3G3ANWGuklaYqJUmVFNTJAU/L+Sg36zcq/mr6KxjTBmWsfzQ2VLrFEVe
sqm5IcfKsgWSMJpLDePjpowS9//nSwPwn84Cw95SI1iKfi6z0MNYdpIMcVSTaJaS
gpiUUbfUtn+zD3laHYkYp5D/FfW76faCl0YJLJOOhORodK309O6SKfI4W92ISrL6
SoyIuuOrR74m2KzCSJ+x/u6lV9KAKDMIZCiYq3Lqq7oN4z0hnd1k/XzfOWtedFQX
CODFzjHdbPAVjIBd5uyv6EcRtRg6tmogHaDG0TpuGNh6daEecdDpHZHozB+HgfOO
W/H+LwS0XU9nAlyczQcrVM7b8yEpQAtB8mJ81dXuVJ08AqKn8g6wTijIGxd9orpP
A4wNZu2RkXR7epTrhl2OiG8C/kmKjQTTBslBYLfAb3pd/2L56x380e1DNXQyLHBf
vFLkdOQWjfWfPBeEIXQOi+H/AQojFn1xS++m5U7puT/kQyN2AzN4yXLKSBSjRer5
XmLe3ICPGNWNgshdacBvimjh/pJICSVekzQeow1NgvgUQIKLUPswrrR6c4EXxuNJ
D+gnKEvFa/+6m4VDJlGgbzQqg7VkPjR2zvdP+2SgP2L/fIQ8nsCQO+EinoFb0UtH
juHgdV6/xQE6T1Z+Sy502vZgyVe8/oCwzAnQbA11xKeI/iVp20rOb8+YlfsDS6Kz
hnkuE4bcgavDIxVr3cmBOOqCgk8kgwjQpPBaVNZ7UdksX2Iv6zYUt3WOy67FdtxA
8e2ufQ7+gq3c48OurbjB0cZH/agTfEOUrwoaf0Pkg6uHNrcHysiMm0zcKLoaKbH/
SdMORrZcJqx+7Z9quirymPMuzNE+TE4t2ktnaq0lOCbCKJV1/KBGYDGkR6Lg3YEK
ek/dp7JCrKnpKHVKDswrWNriYWl04OIBtUUUEOjVFDVkFtxJ2VtGbtpBk0Qad4vO
/TRG1xXQvKLOl3ne6AlkGrIvQGGgxRUtbyiW7c9k5he6/8oVea0XLtngYZankDs3
c9k1aqs21m9E3xSANBsjMf/mtp6tmdpMuRpEmWPN8wY7Y8/guZz78yGKiIJtWSgm
UfGjmozGVnt5SJLDyJg4SrP4XvHfWZ22nO+oiXN+5xLJYBoVQWUvY5fIUVSY4vxz
xf6R6NWcxkkDXx4GheWQvqwB3Ld7F0wlT/nY0G7ONks4MSZXeG+MpJF74RDc+/hh
JX30yLQGOu2k2okaSy71/Ytuivmu6SnKnLfHB5zrg5uXZDE5GrzXwOKqyy6ID94E
BATPGyojgWgObU1kOkZQRU15NSmuGSdB1qBYD3WjD8Y6fHNoku1g2wfsmSJDMnrR
Ry+uj8eTOD8p2ambeXmDP0oh1DC+j8Djx1MgMBPbk3D1TrLXu+7ZT6pkGC3Jyolx
/imLylIIVZKybzqDIE54hNyd2EnOl6AgCm2VpPFGEx5MQzcagmV+V1bJvdHoyrny
7X9LuU9XkmPT1GXRzg/7cQMDjxY33JsLFMnyjOkvh6r96pPq46ncf6RN7dLYULmX
7AMXpuukEvTsV8layfpA1cYhMEjM9Yx8dkPkYQYRh/5uZQnMQwVuZWc5PhBX+KjR
d6ZC1NTLHwYliD9uZbEh4AVGETMK0t5yxzrVD7iTBB/fTIb7r87I8SD7d8ZBlsyl
85HL82JjnS91AusL+9/q8lGdPxiR8rpoOqNWZ/azVsN82/mrI8gPrX16Ki/scvgY
JEZpK/ab2mnEjRZKR/lRpeDVC/yNINjyfSu4l6vbOGTf8wffaTzACdIzE7jh0d+D
wInJWZa7OOgqZ1SYoi/B1zkQPjWvlIlFpGquQSLG++7jgUZNUhY2JNh9+G3V5FHC
WjDHiu3IiVEwz7h76i+b5B2uY+bI/1BLt3Uqy6Fe7YzK8+amDhn6SfVgPwXsxUjs
tW9CdTHCcga0XWvf+wnBhDpV7Eg8kiWTeQwWGBVLHRwZwjR2kdIpWyqFcW/plPP+
nM4aI+n6W8nFVjEXpHZ113fZCNNhdb/GNl/1BhjQipzUHRO/LCGO8nhDvg0ZZqvW
yBNCcu55WYWGiLE8DdjdOoWrEjRCU6cZ1Xauaz0GmZdAZZ4L85SND4AP0/3tcAQp
lGXEiCRmSqpqw5/vbNu1ZeDdfzcUcNEvIaBfCXxQvr56W2m5SeLLIKIULREYJSOq
GUznEIJAsAQektGrFmCj/t6FE3dVkrNw/N0r0BsqS4lsoBAsRmbSuykcPNMGrdWr
ae8Yd0+Gx6wNqYJcPLtzzr04cpI3VVyUcJwXI1y701BS67rdL4dHwRjdCj1E4KL/
MdOxn7kvMslGaBftw2ibwCGSUmXtNSc0VDs51XadFaGwprNoWShzu0KGhHQFzItN
l8JjQ+kfpYvCUobjtCUDH+4G1EfZGoNrUkDMhR3VW4kJPEy6cEZa9yAwCA7sEWv7
pxB3dkpIVUvsL/N2H6Vm2phB75xt/AKi04LJIK1JEcxeWZoUlne4yue983wtD684
/+t1uCKxqNA74gw6W6MZKS3c3Mm6MyRu3MieqAwQcoP69mkIQ2IeKmw8RpuoAfTg
5H341bxoz4OlMJ3wtPO1gv0UKNGHCQfmPqt6VH4I5WKR9hO6Az3pmTfsUgtHiR4B
Z2aYq5gas5XvLWEZS98/ZWr+oNSrmySqFD5sbXTDO4in5BaUhvcQ/xmTRT4WOQj3
c9ojuVg/8IGCr0BzR/velYyUkHvDBIicFwrwoA3CQEXlY0jfjdMWpa78Vave5cyy
OxI2XfPhVy1RTEApm9/xYuV2gnE9RF61ja/Igwzzud/Ks0MzPt1cc7SJL++uD2HZ
ps+4KVq9/pV0GNxyNu6/ykjv6p7hbzLCuwosnySXJcii2SgwEaexWMZJTxeQ4W6E
W+OBIN+ThJNLrbC/UVnqIgVHPddOWBib5lh0r3SCWSJcfsHeNL6Eh/x6QtAhmIUW
wavxy7zJEhukCH0iZsZTa+pqesXX1NX8pCw70+QWHDttxD3YMu//cmVc46v3ulWb
QL7Mcy+UTvBsDa+g95BjtmZIR/BZcL4/1bJVM9Ppdobo9waztj9Orzim5ENhEZWq
YR/aV0TqPCXmrpPDvd1BjaRXpCestZ2GorttTioaTwL2B4eMsNw1HiTTetNqwlK9
ZQ+fdg7BTMRCXNuirkC6uinB/nImRNNMLoe6FMAJajlmyxPDGq1zVYCJ2C5AmPIh
CKg0w0C+++X6hilMKliD1R3VNIl/l4S24RA9MM1azz+69bxC1g+Xjzs72Oe6CDi/
DZe+x00oIfa4rNE1QJwVSheeyrAUaIBcH8hGyLeL1aYPGjiNE9A6kpsRpEE0970Y
nq4GfWAMPkihBPUwfNqvnMbfu8kfYH9ahMyYwQ7P3GhWH+Hwg6nhbDCgsbP3MGEH
3cl5V45hnzlJcaAGx4Ok86YJUdNRpkIiu4niSeOHCMs/p2+9mG6S9FjecIiKm3f3
hf/1HVf9xORXTIHG9qLD080NN5rkWs/BFON0v0Jvrq8zsxBthkIy/zt10v/rDWIa
SOAUxvWzojmQWVYFCJevSSGQ78F4bcYwUn69Y+l1zH5oSWfaX3UbQBOLegRKQ9Z1
MdsHzMgrY1LjAOb7Y66BqzgwNPhzPETV0eMaDAEcpACm4qvXp5Iu2kTz9T0bEG5y
Flii6ODkFccRoKrk/37zVlzDSOf8ywXRYdkOzQapo46nYSa6sLXNJ0EPesLmicT+
GbQjmGXS3BWlEdFykV1zmabA7JZUaSpbKwbNACVrxZsGdng71pk+RSOhpOr4BLGw
tmsYoDXpyIZKK7UMWmfzarzfUhXQzJ8ynN2semGjRdn3jGxXmaeLL9cHhpzSc/24
Rzg1fcNs5dhmhLz6IV9MzhERzWEgGY85lmJfX+dr9Ls8KtDe73ohPaFv6FtHagWa
W6RkZNT1Nu/N8DU79ZFedwYptYLt1LRFcwZA6D0xJ+wQLAsFCtzyyuE4gVUWIN5b
RDiYGZ6Roa0J8vFWCYU/m9otpDgfJHCgljtyak1Woc8rNJTAijxkm/0hXYVk4u5D
K0fynG1IU/W9oaJXPG7eprlG4YVZB4eHld3unSzGkPJWestJ8yXHF8vm/K+YrY3u
3tg0e6atzAJV6j0ma/wtwjuPh56u7lGyqEuwTFuoZc8mdscRIRNoQ9vy5c/M7pMW
YenR01STpOZJcACMwyS48YKqxRRZC19qq4esovan7axTfdwmvfq1AggJBFyflBjj
5eLFz6OLgSOng/UVWsfnX2cAc/mEVsQW2O/Fl0MmCmHeCfA+obvKV1M6XmBdFNZF
zJKh1W6VB8b8jmIMr9YAh1Qke+7bNb6rk12kYZZ7v5L6QmrejdMcvNnw72ViYEzi
hZiw1ll7khFN1RD+TMAyG8ecDdJiT4GbMgGumc+stuMPXE+Ndm5DfEtBmJ5nL40r
KTJLAJX2VO+Xk1NtHydo1bVky2+xFCgFPkRRZ69H+v2T6BN0dXGd3U4Fd7lnQCow
qhFhYxGxiNLGT1KCefxZ4kSmVKoFOOWkDQngkYXWECHUU98Aufly8tF7GFosUpz6
TR/hte/HLLo8ZQ3FJAqls7JG58r71QLF+BL5UNWBM9W7XaXrAn1i34lRapESxra1
r++lz+ohe0FsxhpLq4ojm5Crf9rz2XbNR1ntEANla4q3E5UlVf3gIlpNbWu7Lsi+
kBKJAwv3wkYQNHsOW0lGw7T3ZbjKfFdqp8+EIUhMK5KiqDXzH6qS8JvqaCKyGtYY
SCHEx6BhiQqH6jgeHsYyRpk0pp2B3zIGS7wmsbcDGCFclrxqdSFkIMUdjO09h5hW
LE9snUQyK9P0j6n+tsinfIjNkzPpBbcmEU/4JP6v4w7dogV4KpSrNyjcUvADV5De
Dv5Gn6Bvwk5UKhdgUypHVfvNHLNwcaSt01Wv7FlbIVpWNn08Ve6zz5OH0y/mLUM8
b5az9o7+1IieIBicEPkMhBrnriVbl4i7/dju4w4mcfoM16JIRc03NgzgE1ZX+1Ae
Q2Ud8EsomyZKCUyi5qGmL/mgwxpltr2VdxOJPqmmNt7cf/V6lXmS9ev3BRyN9Gvy
Ety3v4syowpqfoFqB54pur6uyRThrbQPL4JuzPXY0oImkILS1ksFhk+LkfLXSeqh
NOR9mmR1pqQm2GwQrrykZLpEpPGwlBFCdWIeA7EhxQLccIblXt3g75/3/Ri50OhG
zbX2OdUm48DeCVzKbLdPNNCBuwpoX/GbmuadmjQR8pUSSuUFR6ef/PMvcp5tVetH
8dW+E15dGvZHxp11H+72IreWV2I19JcInthTUA+fhaCBEUun2yYC12P+qTB9ZueQ
Kefcnn0/2FmO6GZeIjk0QMK9ekbQ2iHoGvAxEeuaZZK+CvuBVCKEV4UDJU2aVeiI
3gVO2NwwJei2+5skThzmUMPrsjn8orOB/roFFar51YxJAdqD2n6RxjvG63G9VcSK
6ZAX+/zrsiIYTaFaCE9u8FIO8WXeBvERRTq49hbmxzUc1626VuACSCPj+vh8fPnm
9ukSyVBHZJGjDIzg+w1AqYTYmS0JD8bev0cUfLVMUBi5My/Isu8b417gXzNBLbEm
ZYk0hlxvOlZoH3JR8S5HHlTn3mxae9j24iBYiEn45jMqvm3bwgxN3mJR651Ei0jx
+4nF/YILMffCU6m5dudGV+T709SaHerIjsw2p1RyRqU2r5LrJRAp/pj3zXWjNKs8
aTzf8XUdtwJiNXzkpG1s1y2uhPwNB1s7uHPgkOAXi8y4B6E27b6vKYp/8a2DZcsp
lEFPJmje6gNFJCWNpmhXaXo2YOh5EGCQ8aov1bFdBiG2JDLZtqpWy+qPWQiJqrRo
OAUbpIQRY+mSGnSIhj7tPxZTnPc8etQMqaJo6ErOZqIB4QsfreEV0wX4iIYSyTXu
eYaW/9mJ543Lc+xoFT/lfU6/xDq9TJE4kO+zvVRmcVTIw9hadL657XBKoZIZiLwy
Gfq1Ojxh/aN8/J4kV3Uzuiq/MmjVrxyvzxI+oBFwPq+l2o4Qkb/ugwSmDB+GCqHg
a/eLAm2No/RQefxRJ4BDabsbyE7ZXvc4Zd0mQ67wXaWY73slhAVAzYxIaWMi7aw8
vDqP7+0ikj6UQPlgFaRX+rtyuy9JZL2sh8yUMep9aFkdI7F+5hUioN2MbJ9OVmhs
3LY5Y6xdCRWqW8QZso028dqhV3xb9g5FBDuGfiSw8S4ZhXxp91h8FNjuxG4gxECN
sY7G9B4wgBeP/ps8Y9H+H1cd6vbJEutvg26KceZOSTDCAKZGxy6MXJF5jFbBM2va
iE1eL4M1VX+r43MzVGI/30trrMeAP4X3lkC0DWIBR/G8R23s07cYPt6H5fTmRO0I
7kOB6gNAlVaJyxef3G3ALgVcYFXyQBa1Bq2c+U/D5cxvLPiIVu4JuudPCGaZVOtF
cw9pFRdke1uFSSk7RBADoe3R3ZLQwvrL/OvUpdzghtBeHVZQJc6vyOhaZ1rX32mu
QFglYYmCWMPGY9IAicoFPk/GTTfzH751JTxRUfcwJc7qgiMd2pWnWJOBdl9aujxr
F8LgrEpWNoYSsP6OqET2tt5aPugUBHG9NIs5ZXLqiLPWdxn56TIOB2f98SQbenUG
FDoGRm1uhffkyR5rN711x+66t/8I5bSOp4sC0g+DhGwQ8x8aFVIwS8uBGDfUpBz2
tgznWhk2GKwLe44tarFF11lj6FQF4Wza4Jkyi8wkYaWGyRycL6nEQXIdleDieylV
N47mJKT7GOMwoBtVvUrXRkJio5B1Ru+L4/6VtcGoYUft9PMLMNkWDhoZt0iH33Gx
ca+vcPDW5cGSWASJ9GqBqkici88Qm/SzwpkPCJf/RWcY2PLNbsyw/jIlPQi1OO/i
NvdBQIGPSynBWGP5BuKMoXKnvkWPbeTl+UyvdfX53zv3y9qa2fy2M7rQiJlp6o7R
28jT3K7Any1U7ZGSmPh8iikyAZ0kM453g30gG+asEPt6TowXW9V7FubXP6p+89OL
ddOXI3phJ7th94wNHnDbkpgOjWvm3Vy3unLeu9Pdc3HUs1Naer9/No8salaZNSVx
qbqQFNGl1dFrnZAGts9q1A/4tlXsnWyrDwLQ7TBrGGp3GZi/hoTaag0e7NAVqemg
9yPQdj5ic45YMcUmWZB1Aaf1hLbAZpwkljTevPjkteZvLLBG2raAh0sJOXwAEMzo
DyLEV0YJcpaE6igRzSVFKqRNA7uCezQ89pbQ5iplv0TOLkS32gExaNE72wJ855Zd
qqOJNMqwT9HCOafvJjsO4z3Qnr8tp9XJLcdW3kwq/UFMEphaycYMdPEJw96WIbXy
ikH2v2EsoibhWPJ2dJ6RduFak/iwC5QQA+cli6PlkbzitTilnGwj4l9ph9d2mj9J
ln4AvT/iGibniDTuN9ZxRB8trgO083SuU+csewLzzwXs72kTlunni69vnCz79DKu
cFIZeKBJGrgDqISuF/VVOsyhQ59E/pP3GOX3jdKNmyDw9sdDvDq2TjzOALwBxA1Z
qV2ui4KluLbPVdgjENjxJ11qLKjJVZAd9ocNUqJz9ucnGtEeLa776q6YBe8pec20
XaGLqZzAFV9i2z5K3EdqzRhdG7HHwFYZAOqSHb3TxFXAcMnA7uEvEkC1UjAJsg4d
P2VtPTcylv02bPJKntR/EikiqqMiMbYHOTPUwBzXkMZhokgNqYiGL+ApB14kMDG2
gbTPz6xQtXEryIxY9+Ahax9+BJRbNCO8/VLpGeYUhxn4YTKQ1s1BYMHxoDWZSaJI
K9qUtMUbLkECjfz/oO1CaiiUwoRF+rNMid6u5RhpZJ2c+zRpXLFE95QNYasF0Opj
kmWMoxlyYwVTgdcKje+fIM/nkH7MORfY0eCNFLvAspQ08GwWZ+TzictQ0bcnx8QR
I6ML2mIA1cvLSm6Ai/pOxVy34t4h0PGyAE6ZJDNlev9Ld9jedSJ1M0NfNpVBZSVJ
pSoVdDdBGY7kV5e6pkYezFnWAA77YY4W0baJhlSSDsDOFb/orR2BDNavesH5nuT3
ImkTLhnpFrVKyyJCTEvsC10OlhKyCpByLUl5831Feet7IqzkSJMJi1YlYEk8t5mH
+iQ+4+5ZesLZG2Mrw6LwEDBKRrtysHiMHjCjWKF6ecrP/GCcJ4Q9LtFKxgI46EnH
9O0Ihweed+CGvBZZjBo6iv2uxHu+txQCpCFmNc5HjLWZRP7INRhgS6uJ4MShrIqF
fK1nM0pNodUYD6rvp78cHGA83ET35Z5vUI1ccFNXpazFZU4kJY/9UYKgn4azAnBk
ViUiXlQFPcc2sdN/brqvpsD5MyJ/36XDTqCy19aCV/h/3WrOA4aESSsnVrSKjVGJ
RUVUlxqSCGIFq/C7C5x9mZxhJv57IkxLaaQ6TXp8T43mXwzvFPEzSjo/pgcNKon8
v7Ozk/2hCADkQrwe61U9iak1AaKl+n7T+rZy8cbHSIynlca76QCc22aleY97Kqgz
7VsKo70bzBhCk+l2luDl2aJxsBNEKVmyPmh4X9ODpXTmj7toTWltE/H0biYhNtx1
ztmajxJ1qMLHlO6KffGGMRsBbr+r6s7HWuyqbEPW0jGttWSNIx+FJLuitUr7Oo4P
E5IjXTYKPAyf3dLSO6P0FXxoKTD5A5fMqIhMYTt6sph//y9cMhvpHkF/JLXM0f3W
elANgV5DOYAddwS36HsjIA5KPTa2NcuN8kbcufwdm6lKHZIT+aWd+lJzsEtI4uMP
JbfEd1fXMaShQ4VCmDhjXhbTjtBYeoX7dpisos+PmLIB0nTLWpC3N5D1NEdVuK2o
S2d9EuuNXT44n9IXqzCZxmxc2wnD1srHKjLwbSCfgl9ynbmjscyFKXcHfB5rMAEz
eGH2SfeFeCb70Egsl2/elDpTla9HAiyg5zN+OoXvBc8YglqJLyLF322xHI8EbFo8
tubqHj5R+bTwyr4sI3vgGOzXHVgVZ8myWyoqEkXM6v+knUupbbMMzY3uPfXxMSEy
DZexDgJhClROZkbwlY4zKXotla66ANIRYaIdkYaTQyZnJr9n/Prni39U6He7djhN
x7PWWoYtBfmST5bjHrzmWh4vrl+fgCojVlcfKk19gQNR1hpe0dmB0h5Io2jI8PpH
PfGdrvg6QD6caaTZRa/HobqIOnhGD9pSNDcxAvn0hvMJeQqsUP97CBvrJqETCr/Y
y3ptZhG5bXRdvYFZAtn3ULq1r+9fGXpZ2kCK4sf0z3CTQC4JAqc00LA5O4wTz5h6
1ov1PAEG0s1QtLfCuoP4x3h0rFuUZUjEtTvlnDb+VpOwIAsNryFsSb01YfrEfxhj
M4LI6gxqqmgu8tcdM7tR9uI5hmsyG0XV/KFEP+nHVzNvH9srkITZF/1LjLAm7uYG
d/vGoUCdS1Kj9yEhdSGKdlaLGr3nErOYmxBBDBDRno7zH9Amm2ogZoxWh1iTZtmx
QWZlRHbzYkZ6DYSt6RHI5W0LbZlib7u45tDmRy0qf7sfr8t7x9nR4jMT/nOgrvdd
bEI4zT2r2kt4S/mhSIzYQlx5F36uytfmTcW3HyrWQ/IeuLG1iI2cre9iaiPoKBCi
BMDTDLQyWDRl6D3W7afTcdqp17fCQlBP01trskl1N2zAwDatNt46yDxD6JzeulgY
uMaGRDHQvnS4wDKSclYV2bpTmgQZeK98EORrmQIv963KMw8sfN8vI9QAAJFNUsYR
h/SZTzDwB+i51DK4WzPJIf0r98Qlh6Xx0NroTMfoQnMqiPE5MT+KbKbcl1zq0Em1
PugvHYwdxhONdamhlC5z5R7i8FlYFrJflLuIEGqvabfrfSF6/7z0Ag35Dlk3RDNH
iGDV5CBNAEK9V9dylSsvAPB33wGODI503gIINKNHzRutuAqCLsrLdowccl0mj8el
+DeHdnZ4+VO1Jsjb8xHRBtZOc8z22wdyPosiadzh5fXxipqnP0g+MNQViW79setx
lYh6OllnW07unwVIDyRAbkJM/ukc7pLR0dwgLnODjqYpDTZ4649PF+BFmpASnALE
iHKTUGorvj+Gi6xUJb9Th9ebGNIS7uPNnvOb8wNqF5LiIq9TxFFEW++I5sO6yi3M
wrmAhS5PaqDNJShcRER+kvY0wGZEDkxkfPb2mCKmj2nMfeS3abnFcXWitATUhdEO
//MvqBsYc4IfxMQrSwoFQtIJ1GGtKckd1XzOV0LzeiGTT9rUaBWhkZIjHY7oLhIs
XME4StDzaIWt/Jnpz9uSJcLz/fkEfx+xOEMFiJeTg23rffSxiTUwa0LyhIQBB/Iw
ukv1SbmNj/Sc+ezovtNdSJoseOhUiY2wCxXuzJOQIDPj/HVa4xkKfJZ0FUwX8LOP
iqRO7fbU7GrYjnPnfB3A2NGSfL7+MzsuqyHLcA9yyUBaSUiRMwQu4po20KyUKkkp
RMIwJ0pbbUHBqfaZrCUqXY+KMayWFztIFDiCezrTnH0HDrKZuCuGxNovVftFksMJ
ItqLcSoL8hQlnB+J8YaxXEbMevaGj+MG74rXADvU5ra+2B+9uMba4SiY/fL8HZVs
CpU0KwWhiWe1uoh06bnQX7cBUVcBz65bqjJSCjjcNE5+BzsLF7i8UPWRGpGqxGDm
A60afB0QYLCwUfygjTkTG0x6FlEf/XWKlrAYtld8C7pGqAY3JPLBGJV/GNN6urN1
iBtx7qEP5bJ8KsLLJSPmU4BaTVOqShROW7cJ8hmFRmNS8mdc8Ly7j7HoEc6PAIVs
HBqxhWgXha0iMMg6nm9QvjSp81rYBGrs6hOtNpXr+5785PLCnvMiqW/vmGFFXFbb
Vg4RZTeKnf4q6GiS7GKtoQwkqSAX2JlbsiQMnnZVZdywkmfSOOgylSsjpkalYY5f
3XihQXDJFNsjRimqoceZ4zQoQQg55WzXeNxxyW+L86MSfR8YOrqQ3Y9GEoF6Udsm
LYbh3fnYN2HuDbJgsG/hWhbhYMuDymCH7BPRJKovF34VUj0H0Ln49AHIb0aUGBE7
/vL4e6Y8FsnGzNfs97kJ7LS2sD8ZYEYjP3K5wMrgmZMNtvLpsc1MuLbr3ybH8D9C
xTbL7bM3W7gXg4KxvYjHJwin0wPqgU9Gs73/KmM6SmMItydYoRMDQG2NRbDC8wBy
jOrUzFjpuyExNhwWeSghG5RZWa6f3U45KQuLIu4vSKeRfvJSZpCHt0m8eCziHRZ+
irMgFTzKjxVtbda6GVKsWmQX+9M31ZRuD/yrvuPdWCPSMzOSz2x3wZMZY4fmT5Na
/LBdWgvwHqoUNsTuQ1UMdCHq7550hBWeJLR1N1s+2o1b3U5kaflKuzj32LA3/Dg2
7qGJfkU8SaJd58MpQCAt78nGZ7OQFdF0if0EugXoUxPTdDj9Qw7Gm1+Pq7ksATen
6E+Bt3MVFXBmot7I6rR+hxKsdXmHC71QJd09qd/8J2ykkm/Jfurv2kgKRGbJ6x2a
ZWbVKnNTURNWOo2mz66G+VGrtGc1d5K4GBO8BYbOxr3pDLoST70CM4yNpkt24zle
WOlFxcNgHPv7fuMWgE4SOf4P9lKD3/rkNqII8hTllBkVBax4acWEwQfNF6v+RmhC
yeaoWUFBSxO2oyCpOfiPof6oPRO8luEG2GZyvqQbUtptyARz4be5cHtyCDTPRWL5
WgOm7xSzZyc0rSzUd5/iQXnJejeS3D4lpbmcxEC3bMG9nrldMlex/KAbcYl7x/3T
VFtPRMmrtU76WEZPA06Shf5EVmoQP3vy5fHZJlmCwXnNZNwYXnwV6wNWSZnboMX6
QsyuDZaFc87bGP4sJCU7DBd/xOKJ0vONN6zU8mjsMkTM4IAyl2erLYgOVjI5qTWT
YeKYonateqAtuyTgkswPtpc1aoNICZ9oUiwVzd9N12j1kL8sFEB6KY3DKDDtqaJd
hzjafgk00QqO/AH9Uiu7x2+XsQQ13Gyo0fOU3PJwZyDWwnum8Lqm5YIgldlzGTTg
Kv6OkHzk1Fozhdl2UrLRex8BdwOz0hWq6ssc9c7kQjTMRroY9A2xV/+Ga8VaYNrV
PxoOA63pBftv/w+sYldtruPmrNOE3kn/b0Ea5O5AmvXSBAxFtiucc1x0fzfmlVf9
ugUVe3f+hkC4hV48Mkw20c3vmgLNbx2Tbygif9taiuV0181Ny+RzfHJrfDCiGN8h
I1VHjvZ15M4aVq0gs/AV09PELbDxsK9eAm9BtqgaEPfV/KRS+pIJohJWwGkDGZBS
2Pg+jNE1zVZ/9IjPBt/9HS+7B/vNpCmvvzcLAwBWwB4c0YMwRVna427t+OrSTwFn
cFKmj6jIu/L+42KpvSwgTVDQitJ6eZFKTRJNtdM9svfCQtagtPIde7ShxGKVGlRL
hR/i+SB1kA9PZfYv9XkZN5MBsNm2uYu9hSE23o7YEN9G6dZzYsMX7W7gfMq/CuJr
97z4OAT23z8CSaMoiytUnXzZL8mrN/s9f/O5fyNt7jzID42+o8Xd8JRh96ei/kVO
KcPNhEAvunWhO5zFc6siydMX93GYf0NeMxaTZ06Cu1+1NrGUlnDxzcAkrLkgsznS
dWL+YsDBS7xREWr1eEPTI+WlLW5RvMiI4/qeZV19ic1NXjsERyt5xYSCEANbARja
RKTKmiLCOtsyTxi1gENG5kxIEn1CQ3Stas7GYQhw0ztMVdim+QZtlH7XA/WBEVes
jkQnuLztJMpXOZhnTVpD0VLQVFvNk7wmCCXGgtuNKMCOR1sIwu9onS5+szA6G7z7
mNDaEY+bHzwJ27SkzetyjcMjGsmD6KhLMTGyj6HUtaOuwVJtJWWIkiN2oXjpjgk+
wu7YPFLDd40rh275Mc13EfwylvbLm/8d6vpYXr22/ed/FjJeim8G0IealaEbly/B
1XcjyZ6qS9N0TtDh+DtAxRSfUNPLi3pasvH0b6DnQZMA8UqFbwUt7TigFAl2BxpL
k02iBTaLdBq/R6QJ+aDFVktQDjoKpIESUkURPi5Cy1bvA4D3BHEHtZYio+G/A6Bo
IZxaTh6l04WS6T2k362f6x4UjKYmlVtWbAwOum2Mqu01jvqxGpiIUfbbrM+HP3h9
bITEJPF16+4TzItXiuUyyy+v7hbF9yBk1QVGa2fbDsuFKfp1uga/kvQxPMLvB6KS
da2Gx55xrUKukv7awyL0W4StPlH3ogdgryf7KbbX9bCKMQ/2fhdz+xBksKBqgo+b
XIF+A/yzhXYPVK5zmsC0wav/VUhCc3wOBDFImWrzKZ1BasnoHAXSC2jkMxIAfIyc
/pxBrQYfOUckbWCMIkKbLwG1Ei2zdrL8uI723wErExgTcq6gGhi8Tk8zaBX2ubiZ
mprF4ItvFQzmqNyKD9RJwecXuxr3IM/RAsuR7ZDwpZZMjiC59cUeysG9fdAbKHS9
kfbKKmbjkqb0kMKhBEAb/akMXUG8nyzUFE3fYNYimHyr27IN7bwd+CulpVhwUV31
JimOFn2u1cYfvC+Z5svv3S8Hnuye+EqCOrTyJ+xLc5J/SBQoWqMBi9S8nay+V9k9
KIvbD9rl8rDIS2YAUpaQD+iErqoSe5d5uvto9CpjGTnyuGifk78+Zn7fN1yG3eK1
y8HSbVPtm7jox3tNRdamBLyE8zxkf8+hsZw9FrGt8d96iTPs6J0M3k8ZWj8B2Azu
OtMMgn0CMhriuIHWoMqRmRC5GSMCXYRnDe3oTbTvjA0uQaN0lHs4DeihGAbrDLqb
8f9oRBZIiVd8g0ndh/Iwg14bsxy3FJQYv9S6w8DagyYa9+Vo2mdTM08/4csGMEQl
s/CuI2pv6gS9okXsP7LEFY2XFfB8lcY0hc3weghjsk/X2FUzZmPnpq6riAlTkhi4
FN0EzJjMKep6XmFD8BeLsRnb5jZOEBCqc/SYsrTiV8gUeWBF8dZjJYez+Q0p1FXS
3njUVhjzuHWUWPNnNoEgkIVAVr/0YzYvgcpqgCox6dOGYUDuizOXKgvFaGRlyYsA
Nxnpex08F1X1vsVP2LlpxNnN23zX9wpvjqFEZ6TzkY31IWAP16z1eGgL6bzf1UHj
HNuk34pkFDm1cW83mDJ6BzbVzOHZNQAJ+BI1LcOLXKJ7K5UMsqIa6j4uiZYM/+CI
9zKXFa6nUm7Y277HpiisDX0OvqblY0xl9pv78MQta0/TmPFEam2GGbg+tfLGjFtn
vZwVkdaQ7UTP/TW+YUF3M/5sfsXFUhykgVGjKAogd1Z6dlM/9vySNB5Ola+JKlw/
9Oy0ZgLw05f+cpQyo0GtFBi2gQA7NXiGQVfyQixWFJ/LCTuuiEIOBn9u8hBrNo8u
Gpg9Pm3Xgm/TPsaEsBEhyiZUO9Xm+op5tN8jKJA/WMZSLxqDoN1rm6iCjD/pNLVE
oA8pWps9JNAlL6qH/GHcflImnld2rcDuuzvnvXfomZsXTN1dKgzPBsbHGNCm4zBF
O1upTzn9D+ik/x45VuWH2l4kpTtGITgV7ZRwoWyBK1eR3lPdILFvJAsRKo1wlpQo
EfKTHLO64i6SV6CoREN5YRx7O4tjQ7LcxG6iktJ8uM01aPIA4jAfVGm2VWJcHUeO
Qk/wqkrFdcjzUW5epCzO0fm8TTCuauA6jpVRbV+xh5f22L7ZO8z5bG/mEXcXlUXO
77Kvp5U0nkG6MahHdwjUxNCrub6CrdA/VuQs5qTYk0Ez3Ul4v+PV07LwLDMek8aG
pQav717uFDrb9FrO5wprWnZZ41nSbnn7CfoMg9ITPl6V/TFDrsuxHN3pnIVvnd0M
KTy1r3DCBOe+IzWm+phuH7xgIels4hf90TBzVbDtivC/gi5pLsNtEHeE4DLKV1oB
Ia/fNauLSEh7ukdOG4i+jv0TF6Hnq2TEfEVNVK7330tRG+TU9ixYB4HjRI7KGOy1
4posNtSosHRRfVNzR5CRPPvhTHYSPOJKkP/gDWzy2wImoTuFJpAD3iKyy3wHFZuO
sYSu+vJa3OZfLHWPVBrh108rpIk621fX88u7gjQwF/bBlOHeGd3g6ZuhXxK2OSs+
nuBI6CuWtI9eggfKLOv2ORQuASXcR7mQCtzqM01KKbEN62QVBPzh5nFs2D3kjPYi
zDuo/4dE8WA81pbsuIW2JRTHSGGoJJZNQJf4ROM0XMxbBh9ulERLcD3GYZIapqBm
QZzBTYu0JwYvol3rS/ZX1ncr1dqQEWrzgLPrA0uh6pk+O5GyCbrL7YU4CkpOwk/v
wHkmgFYCn0X0TxBsMFzlHhkSmKIknuZov20Mj84Y2XRys8UsWO1kLNr7Yr38mPYC
8ABjyVxFiV9A6gJQt+zlgDiDKnP4Ux+tDHkfD5VFDKVOoIQ+CFMXfgPy4VtZQkIr
rzuT0/52y+b8xZtEU7poQnxpgio7D4yF+Yr1RXkHzwOwSvLjOdR5Gt356WB2dv/R
51WBxua9VGZAgcmdAON8V3J2mzF0nWhuTVyu1vkWTWq0fRVbwvT/LkuA9qgPNP2B
I0NVNUYcgn15GjJlzXGxO2l0CKwzrqEOV1tz5DST9nuMCEKEEqeE+nayE4ZUJsLf
+wF6hWZqQxqalKsbMR87DJREQ5reRKY8syQupGn+OjMtxTJ4nNC4NbDpPFaq1Td5
pwtajX4Xz0v9YjMxjZCRP4DnaaWN++sFR4s3ncWwri3pK8fKMC4bgzsofKxyN1E1
xHHozDTfckGphSsqBzFlTsogs55UeHY3LTl2alxor/REbwhCnMVhHXnu0O+hNV1C
sqvzLlBo9Z31OkuKYm3kW4jvEfLdZ5EvcsaHHRWYJTh7U4yfbxB9qoeReskPa1f8
X2PqVpJZevjrRO2HPc+cfNI1XneWlud371Qhm2VPgeEd3r7ZF6lYBvR3unFoPER3
xJ6Yid6Ezdk46LIm5nyih7JcGH6nRMoJogdGK+u0JzX3T6DV/5ZK2c66zlJ0tr2z
wljo64C4ieXb7qV+vME70mCTL7E5rGiUia0oyurn1+2lYo07tCXgLJ9/tK8+e04a
cjQCw82A48Aa2zPgvH8Not7ZBMqWVq5J+iPGdivH03b03ldkrM166GDxJy9hXQxU
p5nT+4XMgdQYDC5VXpuyr2dJihbSyPw6P837goAKdgqnjekgQJjfjjZ6VSyMmb/+
K41onpAAv5KtHwH+RWEWlrLVb9xGOCveWe2bDEijFIY0CzaonPdt3j+kbntB6snq
yVTaz84+l5kbfHdIpBnXnIlJwHnXG215F01RsIRrrvgA/tSsRaASPS59iAuVkUgj
YZlrDVDLR1bHgrrMaL/sb2fVwIwV/3eFwW1w9D1+Gpszr8WKTm8MI0fq5eE+/w6b
ALDtc+HoWKGC/avMt57fqcmgiG9F/1Ym1ySPaDj1kAJVCGQRliZAI3RItVtn5kuW
S5agjOn4B2NLlKazmrkXYUTrcBzVZ9U2i0RYHayvg+6S71ZnnH82Pd1LIxTEDmj4
3lTskve6ys2dGpgDk8aFA8cqUiMgl4VrF/jdR3vkSjarr1uGspNgCTEyA9BM55h6
NgxKaVguGoSufS6ciejD5ukvi227LzQkqGk7chBNumytkqvj8Wmnfa87NH/Kl4Wo
0PYdGP0ZlB9E69WV2Y6yfFaR8L54OkmG8/v7tJlOmG5qHRcQWDWMPD0ebM2P8vxp
T+B0t83GzlXFCctBY/0JNooCbo1IrXGkNrPH6lp/F4VV7S3Ggifl3//9X32F4/SJ
NH5s2Q7hYIgJgQfDrUoYEFT2aq3CVYQCAnAnL9ZWnUcIlbPNIWuv+dOyBKV6fsGp
DupM8jrPaM/LgxPvvsP6ncM6VAY+DzYhQYqdQD20eNvdrQ6VvICRnNMGeJy7ZEYb
GuSYm24d7xbbS1FAOPoBEuc5qyb+hXSXqEWWNj/ndNmdpaeJCYg74EDmqElW/J43
lXS1v59buR+whebrbPhfcjgydBRS4D9R6eS9KJRf91w8/WapoxZAkyHqhnThYVF2
8AYssoplMO6Gj5Oq5fgd2lRwPILv5Ct30SoUmQjNzreoKgPh3jLY+H3WuWVCoCK/
ksUnkwkXCQ35Zexgf12tRVeGaNZuCKMvI3Ct7XrV7x/JkdwfCQmR+lhQST5BP1iN
hOrLxFGtOrBIBx2jsv8JIctZjnm2VoqKnENU+TFZ7qYSu1vqAmCuA/hOrLDaRpm8
7Js65YzVs9PR8Lry/54VS/8pfK/Ripr9wGaJ/xnzqYIhZAa7wMStVRIVhBLJPmbB
76nb76zFMFUD/ZNGCal4mrbHDvMDpSlDhZfc1rDo7pMFO1u/tKq9iLZKdpQicVZI
ebZr/roukQG+p9o6h+gmTMKMo6UQ5xOTe3xOjosGQxpWurH0rjv4rFla6AdcO7S6
QcgxAGwAZ7rJm7X2UA2pcpkmgNn2FdGVx5Vz1KMUkvUbMv0GgE9WrWiog3b5473U
b6efJKeIOZ5+xs3rH/jnd2FuwA87tGNRN5AxkDWdjLl5t6rGYC8WxWqccmov0iJd
yuxnS1ZE0ZukzDr2qpnfzD/mXqqa1Lo/C/AzR/4UvvmxNAcn+Hu2yMmjiuoigDkR
GJAQG0iw5hS8KTe4qq7DAUvJPki6azL9Lh0jivCNEDFcRZiz/mwABNd/nBromcHA
di0BB2voZ5Y1+rK9uj9N5Ysb8db6vA34g8TVcczrVJsn9Hhvm9fvA66v/ST83YPI
MyMvKw7/ENTVZ9F1CUfuQ87lMsDI0ShuFwZ35f3ecS57B23DmhVVXyIE0RNc24aE
3p/SulYR0UZYh0ZT8mC6OiCN8EqTL0GicuW1oiXdILs3qkHeoXTRmUqqUWSyB+hq
hhAmPieQN1+gjPA8NhI4jhVwt9yKAdDamZXwCyp7I6HwJRwcVTK3MKXfttSZDE4b
eTG/Ag17TBzs+/3hDjWsSJM2rEO6efcFJQuEaG62GuJO58n3kzwXrTQx7Ck6EalD
uVnMyKKURRgK38TCCd8ComS91b66wDR3Ofmc51UoOcYAHYB1B5QjQU4hykwO7d+a
SXfg+agjcGuEZqeGuHEhkgG/oG9uC0wTB6l+8QWTFXCr90R2jmQL6dHt2e3n80Pk
z1/Wc3K99VBAGSRu6zK6tw5GNbbomxxnXVm6KtlpMGcYVUFA2Yzh3Zj+wHPtf/fw
PQLl/3/HRJyyVzybUfUCeZHgYNXtd/Qx/Ryyb63pJreCzKJFj1UowkwqOrTpdJzL
Sdw6g5HBx4GkA4bGN+QjfLDI0ggI4LSePsnsEhqZW0/WK8VKpZqayV10RbgqOu8j
wSJ+YjEA+d2Ty7kbQUNdD+t91tyulQ/WW3mrDxd8NZkjf7C5NaYtmh5xYKQbLRsf
qoJ2vcJIe3FTuCXhMBkuipDsrSGA9HNua1BdtUPZezBKYwf6EGAdGXrsFWOh2JGk
vB9VhXtqtqOWxahD5SNJD5gltrgH4FGKSAWI0NcgnMKOpoLsiRGjp7ze/XnsngkP
tfnSA6mGdYqE8WzcuQvLOu3doA1HmHms8HOH7VNOOyBLrWofFKjRXCVhiw71LsgT
BpQrV1O3OzgwPERjAf/cp6rtEsw8ttuYFJyGqr4iwWJH7SDVD/0Hn6vOGpAKcKPN
m2UGCw4KcasWnrgAgox11NPPcKI+iWbESCOdicdnGuMSjNtoMgWY4hh9W3c4Qn9g
uKbrwO4uRXkyrwEMF/38PplW3f5X/MjSBgF1pNMHQzx2R4Q1p+QHQVhRRn9YAZeX
qPXLTspJ6pX9J3RCSJ1s8i++iONWDjlSMkQNN10a7myHvW1+M+I39Aal9uMAj2E/
yJs04l/jgI44qt9o6h5mvYBD3GKseI+nsdxldHCA3o2yHWeEnlDfxK1b+D3RzsgB
C7puOMH0n9md1Xf/7gHWA1M04gTrEv6Y20wErr/Eaq3ME0TIVTSzDsrpflb/fhXH
357r8UAB7GA3nYw6gYbUEbSN1lGi6pOVvabebq1G53ByKtmDqt+pYXP0PXA/Bsih
oWO3wE+/caULBkd48eXkOj1CZAb/0Exhwev7MCfb042pF/WX+v2Ef7pczK2FMPB0
R4Ry5JfWjxYF52KIX+TU+7tvE8aAiSCqKApW6oZTUJnlm/+65UXdnmyHb/5PECts
vXmA8RgmE5udcke5uyQMRtK5Ujeai+k9z8R7yiU4tVQ8UUPigu9cR1j1B/5nzJt6
3LEfcwzXeZlRGh+yDjsbugvTQYUIOtmuMxpNRYDGRAUKy/2nt5BVbWEfPuZlJwDF
vAWfgigvrz/mtU9NSlzvPhGPcOE5q8huE15smufoLBomqP2j5yLNAP/zoHxS688I
ZVJey1L+pCW4JHQA7QsOFqAxpUIZwCPFO+tyWA9YtWatCtxf1npqk7aLjh0RVmGs
yZQ9kunyLOfe6mFnlVxFnQ9G51V4Nje+nS+/B4o74LRquVYH7L3NowC6jfiOko1r
L3rkcAzQkg0yTf4F2di9iJ/1Et4GV6z5AWudyW9AJk2T2MOlkbneqpMzYDnJuBVV
dSIi4bxFDA56tu+iaCWVs13Az82c4fCRVS+7UzFqmM3QQ8iNw+LkWlSuuGVrGFgd
OeS02KSnDlV1oyWAfZ73M43EpRTf2wWc7Acol7tzyA45wD9liEgu7d0RLdiTnT7C
SNHcWLK1gNZxoTudLNcJ3uGSqv3yIsQekkzwokg4QmQWrbSpUyhGlFG4TgL+4RE1
qzjPpUzVKVQGRbKhDlOB0NQJ775ncE+GNt3bE0I/4RRV5xc5ZM7PU11TKspi7A9F
g5wCavG7m/d0AZCsqjMAyy7mR275UZwsBLRsJP1bQbQP3ksBepz46p2euzbWPEpn
8xd5QuBRwsw7pRVkuBk0YG2VRHlUdlyWTvxBQzG973+9TRh+fg3SbRPAWrNNzMZ7
KxOZ/SYalmAnchOn8kfJIMTV9UNMq923RqEClQ4bxHhbA/CBhrRVKnJx9kngfXPt
OdlhgjdzapwuSG/ggGRYLsVKJV2QGRqNvrkEVAaRQeIPn+whY4xePGBND6QGrnmt
5aqc1nBCJleSNinZjgn6ZtvvVBi77W4WrNvzDTLNFBkYmkgCkKN92EPnB6i8np6U
uRltIcBZ72CJY+0aOnACbKGyKo03x7d2YkPo1xgUw3XksSjfs6yOEOa5hEdh9AYA
HjVPrlo7m0f2/aX8wYEzDk6pPdYh+WvLgvRK+1wYDIfvNSj2Lmj3pt6wUV/omiKq
Ls8yskQvFDpIQPichBZ+mPow7CHqkGKRo78Srls3rdmArfK+/1JyjqQ0C8sZnQDH
ho8dVpTIuzWBmVb/+7fUHAZwUulBmThJ/3QxGaov9Q2z0O+f5/ARFIJaxZyxCAAl
WxuKXiQ9eZASJQPAlb++v48RTrYj3qO/io9LKeIK7K7/1lSd1vLyEplYyi7Cnziy
CgcjTRtvu0N0HjzvVY1AO26r6dUufHPrm4mdNiFLi4nCWuR1zDfO/7+k+aKY47LR
Lx0tSKChpoxVX1A37X8ygb0eoAtmrHnzA2ZDu4Og4bEyMRd495ATHhnvgHwDz1U2
LrZX1lm4Wfrt7XgRIhgZIOMlzYuBdW7ixA4Riuwvcd1/AM4ayB9wbEBITp+xK7Na
6Amq0+DrZlboOXztGkdy1+eQ8sr0ra1h/ui0k1+rTEytHqrDGfJvdrDnWrf5yAqO
ULjBuLk+RArTia4PXulfmNPdOedr3guT0ugzUvY8j88Fok0Pqr4KGF1S9R+8rTnB
b00l7HaYg042vd/pseLAeMiyi6muZvVIk+k5haWI/i/UUpHDqlc8yC8x9Vw/4Z6G
BOaDIv0m+e7PaUDco0WzyB3hslkF0Lg0Q8j69OS2C8Vdx7t+FBQQ2RHl/R0yQL/Z
yyJq8qYvm+bdVsEnUPuh83y4vV22eLrQEg0Dalzy2Bu+9DOI+Az65EjVOnzB7vm1
cdu048Ne+cls7D3Xv+29hMp206IS4syowtU7JIPceynsFelszw7uHsUwV/UT2Q69
B6oh6aLgXUBI6F27fdWe4XAVo0IwQDAdBgNVHQ4EFgQUQFXVk2/1LlMGUGFltpkI
HxpyqjEwHwYDVR0jBBgwFoAU41akBnP4505sNDHigUVlOFv0K9gwCgYIKoZIzj0E
AwIDRwAwRAIgIfDHuvZ4QGk0TQeZYFYwmyrHLvy3L2CYupR0afMe6fICIGGGYjml
qBGaP5mHYhcyNEd36e2ZiuTj+ro3933oSD6e
-----END CERTIFICATE-----
Binary file not shown.
+655
View File
@@ -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-----
Binary file not shown.
+333
View File
@@ -0,0 +1,333 @@
-----BEGIN CERTIFICATE REQUEST-----
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
vXQQFCEzut6ur1mhG9ZPitTmaw==
-----END CERTIFICATE REQUEST-----
Binary file not shown.
+241
View File
@@ -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 <wolfssl/options.h>
#include <wolfssl/wolfcrypt/settings.h>
#include <wolfssl/wolfcrypt/wc_frodokem.h>
#include <wolfssl/wolfcrypt/asn_public.h>
#include <wolfssl/wolfcrypt/ecc.h>
#include <wolfssl/wolfcrypt/random.h>
#include <stdio.h>
#include <string.h>
#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
+31
View File
@@ -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
+1
View File
@@ -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
+15
View File
@@ -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 ""
+9 -6
View File
@@ -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.
+20
View File
@@ -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);
+473 -2
View File
@@ -32,6 +32,11 @@
#include <wolfssl/wolfcrypt/wc_frodokem.h>
#include <wolfssl/wolfcrypt/hash.h>
#include <wolfssl/wolfcrypt/sha256.h>
#if defined(WOLFSSL_CERT_GEN) && defined(HAVE_ECC)
#include <wolfssl/wolfcrypt/asn_public.h>
#include <wolfssl/wolfcrypt/asn.h>
#include <wolfssl/wolfcrypt/ecc.h>
#endif
#endif
#include <wolfssl/wolfcrypt/types.h>
#include <tests/api/api.h>
@@ -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();
}
+11 -1
View File
@@ -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 */
+330 -23
View File
@@ -295,6 +295,9 @@ ASN Options:
#if defined(WOLFSSL_HAVE_SLHDSA)
#include <wolfssl/wolfcrypt/wc_slhdsa.h>
#endif
#if defined(WOLFSSL_HAVE_FRODOKEM)
#include <wolfssl/wolfcrypt/wc_frodokem.h>
#endif
#ifdef WOLFSSL_QNX_CAAM
#include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
@@ -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,
+13 -2
View File
@@ -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;
+9 -2
View File
@@ -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)
+3 -1
View File
@@ -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
@@ -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
@@ -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"
+380 -13
View File
@@ -40,6 +40,12 @@
#include <wolfssl/wolfcrypt/wc_frodokem_mat.h>
#include <wolfssl/wolfcrypt/hash.h>
#include <wolfssl/wolfcrypt/memory.h>
#ifdef WOLF_CRYPTO_CB
#include <wolfssl/wolfcrypt/cryptocb.h>
#endif
#ifndef WOLFSSL_FRODOKEM_NO_ASN1
#include <wolfssl/wolfcrypt/asn.h>
#endif
#ifdef NO_INLINE
#include <wolfssl/wolfcrypt/misc.h>
@@ -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 */
+132 -1
View File
@@ -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)
+4 -2
View File
@@ -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,
+2 -1
View File
@@ -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
+6 -3
View File
@@ -80,6 +80,9 @@
#ifdef WOLFSSL_HAVE_MLKEM
#include <wolfssl/wolfcrypt/wc_mlkem.h>
#endif
#ifdef WOLFSSL_HAVE_FRODOKEM
#include <wolfssl/wolfcrypt/wc_frodokem.h>
#endif
#if defined(WOLFSSL_HAVE_MLDSA)
#include <wolfssl/wolfcrypt/wc_mldsa.h>
#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)
+3 -3
View File
@@ -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
+34 -2
View File
@@ -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
};
+2
View File
@@ -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)))
+5 -2
View File
@@ -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
};
+24
View File
@@ -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