1*e7be843bSPierre Pronchery=pod 2*e7be843bSPierre Pronchery 3*e7be843bSPierre Pronchery=head1 NAME 4*e7be843bSPierre Pronchery 5*e7be843bSPierre ProncheryEVP_PKEY-ML-KEM, 6*e7be843bSPierre ProncheryEVP_KEYMGMT-ML-KEM, 7*e7be843bSPierre ProncheryEVP_PKEY-ML-KEM-512, 8*e7be843bSPierre ProncheryEVP_PKEY-ML-KEM-768, 9*e7be843bSPierre ProncheryEVP_PKEY-ML-KEM-1024, 10*e7be843bSPierre ProncheryEVP_KEYMGMT-ML-KEM-512, 11*e7be843bSPierre ProncheryEVP_KEYMGMT-ML-KEM-768, 12*e7be843bSPierre ProncheryEVP_KEYMGMT-ML-KEM-1024 13*e7be843bSPierre Pronchery- ML-KEM keytype and algorithm support 14*e7be843bSPierre Pronchery 15*e7be843bSPierre Pronchery=head1 DESCRIPTION 16*e7be843bSPierre Pronchery 17*e7be843bSPierre ProncheryThe B<ML-KEM-512>, B<ML-KEM-768>, and B<ML-KEM-1024> keytypes are implemented 18*e7be843bSPierre Proncheryin OpenSSL's default and FIPS providers. 19*e7be843bSPierre Pronchery 20*e7be843bSPierre Pronchery=head2 Keygen Parameters 21*e7be843bSPierre Pronchery 22*e7be843bSPierre ProncheryNo mandatory parameters are required for generating a key pair. 23*e7be843bSPierre ProncheryTo set explicit parameters, use EVP_PKEY_CTX_set_params() after calling 24*e7be843bSPierre ProncheryEVP_PKEY_keygen_init(). 25*e7be843bSPierre Pronchery 26*e7be843bSPierre Pronchery=over 4 27*e7be843bSPierre Pronchery 28*e7be843bSPierre Pronchery=item "seed" (B<OSSL_PKEY_PARAM_ML_KEM_SEED>) <octet string> 29*e7be843bSPierre Pronchery 30*e7be843bSPierre ProncheryInternally, ML-KEM generates keys using a 64-byte random value (seed), which is 31*e7be843bSPierre Proncherythe concatenation of the 32-byte I<d> and I<z> parameters described in FIPS 203. 32*e7be843bSPierre ProncheryThis optional parameter can be used to set a pre-determined seed prior to 33*e7be843bSPierre Proncherykeypair generation. 34*e7be843bSPierre Pronchery 35*e7be843bSPierre ProncheryGenerated keys default to retaining the seed used. 36*e7be843bSPierre ProncheryThe seed is also by default retained when keys are loaded from B<PKCS#8> files 37*e7be843bSPierre Proncheryin the seed format. 38*e7be843bSPierre ProncheryWhen available, the seed parameter is also used during key export and import, 39*e7be843bSPierre Proncherywith keys (by default) regenerated from the seed even when also provided on import. 40*e7be843bSPierre ProncherySee L</Provider configuration parameters> below for related controls. 41*e7be843bSPierre Pronchery 42*e7be843bSPierre ProncheryWhen the seed is retained, it is also available as a B<gettable> parameter, 43*e7be843bSPierre Proncheryand private key output to B<PKCS#8> files will by default include the seed. 44*e7be843bSPierre ProncheryWhen the seed was not initially known, or was not retained, B<PKCS#8> private 45*e7be843bSPierre Proncherykey files will contain only the private key in FIPS 203 C<dk> format. 46*e7be843bSPierre Pronchery 47*e7be843bSPierre Pronchery=item "properties" (B<OSSL_PKEY_PARAM_PROPERTIES>) <UTF8 string> 48*e7be843bSPierre Pronchery 49*e7be843bSPierre ProncherySets properties to be used when fetching algorithm implementations used for 50*e7be843bSPierre ProncheryML-KEM hashing operations. 51*e7be843bSPierre Pronchery 52*e7be843bSPierre ProncheryUse L<EVP_PKEY_CTX_set_params(3)> after calling L<EVP_PKEY_keygen_init(3)>. 53*e7be843bSPierre Pronchery 54*e7be843bSPierre Pronchery=back 55*e7be843bSPierre Pronchery 56*e7be843bSPierre Pronchery=head2 Common parameters 57*e7be843bSPierre Pronchery 58*e7be843bSPierre ProncheryIn addition to the common parameters that all keytypes should support (see 59*e7be843bSPierre ProncheryL<provider-keymgmt(7)/Common Information Parameters>), B<ML-KEM> keys 60*e7be843bSPierre Proncherykeys support the parameters listed below. 61*e7be843bSPierre ProncheryThese are gettable using 62*e7be843bSPierre ProncheryL<EVP_PKEY_get_octet_string_param(3)> or L<EVP_PKEY_get_params(3)>. 63*e7be843bSPierre ProncheryThey can be initialised via L<EVP_PKEY_fromdata(3)>, and are returned by 64*e7be843bSPierre ProncheryL<EVP_PKEY_todata(3)> given a suitable I<selection>. 65*e7be843bSPierre ProncheryOnce a public or private key is configured, it can no longer be modified, 66*e7be843bSPierre Proncherynor can another key component be added. 67*e7be843bSPierre Pronchery 68*e7be843bSPierre Pronchery=over 4 69*e7be843bSPierre Pronchery 70*e7be843bSPierre Pronchery=item "pub" (B<OSSL_PKEY_PARAM_PUB_KEY>) <octet string> 71*e7be843bSPierre Pronchery 72*e7be843bSPierre ProncheryThe public key value. 73*e7be843bSPierre Pronchery 74*e7be843bSPierre ProncheryThis parameter is used when importing or exporting the public key value with 75*e7be843bSPierre Proncherythe EVP_PKEY_fromdata() and EVP_PKEY_todata() functions. 76*e7be843bSPierre ProncheryThe key length and content is that of the FIPS 203 (Algorithm 16: 77*e7be843bSPierre ProncheryB<ML-KEM.KeyGen_internal>) B<ek> public key for the given ML-KEM variant. 78*e7be843bSPierre ProncheryInitial import aside, this parameter is otherwise only gettable. 79*e7be843bSPierre Pronchery 80*e7be843bSPierre Pronchery=item "priv" (B<OSSL_PKEY_PARAM_PRIV_KEY>) <octet string> 81*e7be843bSPierre Pronchery 82*e7be843bSPierre ProncheryThe private key value. 83*e7be843bSPierre Pronchery 84*e7be843bSPierre ProncheryThis parameter is used when importing or exporting the private key value with 85*e7be843bSPierre Proncherythe EVP_PKEY_fromdata() and EVP_PKEY_todata() functions. 86*e7be843bSPierre ProncheryThe key length and content is that of the FIPS 203 (Algorithm 16: 87*e7be843bSPierre ProncheryB<ML-KEM.KeyGen_internal>) B<dk> private key for the given ML-KEM variant. 88*e7be843bSPierre ProncheryInitial import aside, this parameter is otherwise only gettable. 89*e7be843bSPierre Pronchery 90*e7be843bSPierre Pronchery=item "encoded-pub-key" (B<OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY>) <octet string> 91*e7be843bSPierre Pronchery 92*e7be843bSPierre ProncheryUsed for getting and setting the encoding of a public key. 93*e7be843bSPierre ProncheryThe key format is that of B<ek> in FIPS 203, Algorithm 16: 94*e7be843bSPierre ProncheryB<ML-KEM.KeyGen_internal>. 95*e7be843bSPierre ProncheryUpdates of the public and private key components are only allowed on keys that 96*e7be843bSPierre Proncheryare empty. 97*e7be843bSPierre ProncheryOnce a public or private key component is set, no further changes are allowed. 98*e7be843bSPierre ProncheryThis parameter is gettable and settable (once only). 99*e7be843bSPierre Pronchery 100*e7be843bSPierre Pronchery=back 101*e7be843bSPierre Pronchery 102*e7be843bSPierre Pronchery=head2 Provider configuration parameters 103*e7be843bSPierre Pronchery 104*e7be843bSPierre ProncherySee the description of the B<-provparam> option in L<openssl(1)> to learn 105*e7be843bSPierre Proncheryhow to set provider configuration parameters in the command line tools. 106*e7be843bSPierre ProncherySee L<OSSL_PROVIDER_add_conf_parameter(3)> to learn how to set provider 107*e7be843bSPierre Proncheryconfiguration options programmatically. 108*e7be843bSPierre Pronchery 109*e7be843bSPierre Pronchery=over 4 110*e7be843bSPierre Pronchery 111*e7be843bSPierre Pronchery=item C<ml-kem.import_pct_type> (B<OSSL_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE>) <UTF8 string> 112*e7be843bSPierre Pronchery 113*e7be843bSPierre ProncheryWhen an B<ML-KEM> key is imported as an explict FIPS 203 B<dk> decapsulation 114*e7be843bSPierre Proncherykey, rather than a seed, a pairwise consistency test (PCT) is optionally 115*e7be843bSPierre Proncheryperformed. 116*e7be843bSPierre ProncheryBy default, or when this parameter is set explicitly to C<random>, the PCT 117*e7be843bSPierre Proncheryis performed with a random entropy value for the encapsulation step. 118*e7be843bSPierre ProncherySetting the parameter to C<fixed>, still runs the test, but the encapsulation 119*e7be843bSPierre Proncheryentropy is a fixed 32 byte value. 120*e7be843bSPierre ProncherySpecifying any other value of the parameter, e.g. C<none>, skips the test. 121*e7be843bSPierre Pronchery 122*e7be843bSPierre Pronchery=item C<ml-kem.retain_seed> (B<OSSL_PKEY_PARAM_ML_KEM_RETAIN_SEED>) <UTF8 string> 123*e7be843bSPierre Pronchery 124*e7be843bSPierre ProncheryWhen set to a string representing a false boolean value (see 125*e7be843bSPierre ProncheryL<OSSL_PROVIDER_conf_get_bool(3)>), the seed will not be retained after key 126*e7be843bSPierre Proncherygeneration or key import from a seed value. 127*e7be843bSPierre ProncheryIf the resulting key is then written to a PKCS#8 object, it will contain 128*e7be843bSPierre Proncheryonly the FIPS 203 C<dk> key. 129*e7be843bSPierre Pronchery 130*e7be843bSPierre Pronchery=item C<ml-kem.prefer_seed> (B<OSSL_PKEY_PARAM_ML_KEM_PREFER_SEED>) <UTF8 string> 131*e7be843bSPierre Pronchery 132*e7be843bSPierre ProncheryWhen decoding PKCS#8 objects that contain both a seed and the FIPS 203 C<dk> 133*e7be843bSPierre Proncheryprivate key, the seed is by default used to regenerate the key, and the 134*e7be843bSPierre Proncherycompanion key is ignored. 135*e7be843bSPierre ProncheryWhen this configuration parameter is set to a string representing a false 136*e7be843bSPierre Proncheryboolean value (see L<OSSL_PROVIDER_conf_get_bool(3)>), the seed is ignored 137*e7be843bSPierre Pronchery(neither used to regenerate the key, nor retained), and the companion key is 138*e7be843bSPierre Proncheryused instead. 139*e7be843bSPierre Pronchery 140*e7be843bSPierre Pronchery=item C<ml-kem.input_formats> (B<OSSL_PKEY_PARAM_ML_KEM_INPUT_FORMATS>) <UTF8 string> 141*e7be843bSPierre Pronchery 142*e7be843bSPierre ProncheryList of enabled private key input formats when parsing PKCS#8 objects. 143*e7be843bSPierre ProncheryList elements are separated by commas and/or spaces or tabs. 144*e7be843bSPierre ProncheryThe list of enabled formats can be specified in the configuration file, as seen 145*e7be843bSPierre Proncheryin the L</EXAMPLES> section below, or the via the B<-provparam> command-line 146*e7be843bSPierre Proncheryoption (see also L<OSSL_PROVIDER_add_conf_parameter(3)>). 147*e7be843bSPierre Pronchery 148*e7be843bSPierre ProncheryValues specified on the command-line override any configuration file settings. 149*e7be843bSPierre ProncheryBy default all the supported formats are enabled. 150*e7be843bSPierre ProncheryThe supported formats are: 151*e7be843bSPierre Pronchery 152*e7be843bSPierre Pronchery=over 4 153*e7be843bSPierre Pronchery 154*e7be843bSPierre Pronchery=item C<seed-priv>: 155*e7be843bSPierre Pronchery 156*e7be843bSPierre ProncheryThis format represents B<PKCS#8> objects in which both the FIPS 203 64-byte 157*e7be843bSPierre ProncheryB<(d, z)> seed and the decapsulation key B<dk> are present in the private key 158*e7be843bSPierre Proncheryas part of the DER encoding of the ASN.1 sequence: 159*e7be843bSPierre Pronchery 160*e7be843bSPierre Pronchery ML-KEM-PrivateKey ::= CHOICE { 161*e7be843bSPierre Pronchery seed [0] IMPLICIT OCTET STRING (SIZE (64)), 162*e7be843bSPierre Pronchery expandedKey OCTET STRING (SIZE (1632 | 2400 | 3168)), 163*e7be843bSPierre Pronchery both SEQUENCE { 164*e7be843bSPierre Pronchery seed OCTET STRING (SIZE (64)), 165*e7be843bSPierre Pronchery expandedKey OCTET STRING (SIZE (1632 | 2400 | 3168)) } } 166*e7be843bSPierre Pronchery 167*e7be843bSPierre ProncheryIf the C<seed-priv> format is not included in the list, this format will not be 168*e7be843bSPierre Proncheryrecognised on input. 169*e7be843bSPierre Pronchery 170*e7be843bSPierre Pronchery=item C<seed-only>: 171*e7be843bSPierre Pronchery 172*e7be843bSPierre ProncheryThis format represents B<PKCS#8> objects in which only the 64-byte B<(d, z)> 173*e7be843bSPierre Proncheryseed is present in the above sequence. 174*e7be843bSPierre ProncheryIf the C<seed-only> format is not included in the list, this format will not be 175*e7be843bSPierre Proncheryrecognised on input. 176*e7be843bSPierre Pronchery 177*e7be843bSPierre Pronchery=item C<priv-only>: 178*e7be843bSPierre Pronchery 179*e7be843bSPierre ProncheryThis format represents B<PKCS#8> objects in which only the FIPS 203 180*e7be843bSPierre Proncherydecapsulation key B<dk> is present in the above sequence. 181*e7be843bSPierre ProncheryIf the C<priv-only> format is not included in the list, this format will not be 182*e7be843bSPierre Proncheryrecognised on input. 183*e7be843bSPierre Pronchery 184*e7be843bSPierre Pronchery=item C<oqskeypair>: 185*e7be843bSPierre Pronchery 186*e7be843bSPierre ProncheryThis format represents B<PKCS#8> objects in which the private key is a DER 187*e7be843bSPierre Proncheryencoding of an octet string containing the concatenaton of the FIPS 203 188*e7be843bSPierre Proncherydecapsulation key B<dk> and the encapsulation key B<ek>. 189*e7be843bSPierre ProncheryThis encoding is used in some builds of the C<oqsprovider>. 190*e7be843bSPierre ProncheryIf the C<oqskeypair> format is not included in the list, this format will not be 191*e7be843bSPierre Proncheryrecognised on input. 192*e7be843bSPierre Pronchery 193*e7be843bSPierre Pronchery=item C<bare-seed>: 194*e7be843bSPierre Pronchery 195*e7be843bSPierre ProncheryThis format represents B<PKCS#8> objects in which the private key contains 196*e7be843bSPierre Proncherythe 64-byte FIPS 204 seed B<(d, z)> without any ASN.1 encapsulation. 197*e7be843bSPierre ProncheryIf the C<bare-seed> format is not included in the list, this format will not be 198*e7be843bSPierre Proncheryrecognised on input. 199*e7be843bSPierre Pronchery 200*e7be843bSPierre Pronchery=item C<bare-priv>: 201*e7be843bSPierre Pronchery 202*e7be843bSPierre ProncheryThis format represents B<PKCS#8> objects in which the private key contains 203*e7be843bSPierre Proncherythe FIPS 204 decapsulation key B<dk> without any ASN.1 encapsulation. 204*e7be843bSPierre ProncheryIf the C<bare-priv> format is not included in the list, this format will not be 205*e7be843bSPierre Proncheryrecognised on input. 206*e7be843bSPierre Pronchery 207*e7be843bSPierre Pronchery=back 208*e7be843bSPierre Pronchery 209*e7be843bSPierre Pronchery=item C<ml-kem.output_formats> (B<OSSL_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS>) <UTF8 string> 210*e7be843bSPierre Pronchery 211*e7be843bSPierre ProncheryOrdered list of enabled private key output formats when writing B<PKCS#8> files. 212*e7be843bSPierre ProncheryList elements are separated by commas, spaces or tabs. 213*e7be843bSPierre ProncheryThe list of enabled formats can be specified in the configuration file, as seen 214*e7be843bSPierre Proncheryin the L</EXAMPLES> section below, or the via the B<-provparam> command-line 215*e7be843bSPierre Proncheryoption. 216*e7be843bSPierre Pronchery 217*e7be843bSPierre ProncheryThis supports the same set of formats as described under C<ml-kem.input_formats> 218*e7be843bSPierre Proncheryabove. 219*e7be843bSPierre ProncheryThe order in which elements are listed is important, the selected format will be 220*e7be843bSPierre Proncherythe first one that is possible to output. 221*e7be843bSPierre ProncheryIf the key seed is known, the first listed format will be selected. 222*e7be843bSPierre ProncheryIf the key seed is not known, the first format that omits the seed will be selected. 223*e7be843bSPierre ProncheryThe default order is equivalent to C<seed-priv> first and C<priv-only> second, with 224*e7be843bSPierre Proncheryboth seed and key output when the seed is available, and just the 225*e7be843bSPierre Proncherykey otherwise. 226*e7be843bSPierre ProncheryIf C<seed-only> is listed first, then the seed will be output without the key 227*e7be843bSPierre Proncherywhen available, otherwise the output will have just the key. 228*e7be843bSPierre ProncheryIf C<priv-only> is listed first, then just the key is output regardless of 229*e7be843bSPierre Proncherywhether the seed is present. 230*e7be843bSPierre ProncheryThe legacy C<oqskeypair>, C<bare-seed> and C<bare-priv> formats can also be 231*e7be843bSPierre Proncheryoutput, by listing those first. 232*e7be843bSPierre Pronchery 233*e7be843bSPierre Pronchery=back 234*e7be843bSPierre Pronchery 235*e7be843bSPierre Pronchery=head1 CONFORMING TO 236*e7be843bSPierre Pronchery 237*e7be843bSPierre Pronchery=over 4 238*e7be843bSPierre Pronchery 239*e7be843bSPierre Pronchery=item FIPS 203 240*e7be843bSPierre Pronchery 241*e7be843bSPierre Pronchery=back 242*e7be843bSPierre Pronchery 243*e7be843bSPierre Pronchery=head1 EXAMPLES 244*e7be843bSPierre Pronchery 245*e7be843bSPierre ProncheryAn B<EVP_PKEY> context can be obtained by calling: 246*e7be843bSPierre Pronchery 247*e7be843bSPierre Pronchery EVP_PKEY_CTX *pctx = 248*e7be843bSPierre Pronchery EVP_PKEY_CTX_new_from_name(NULL, "ML-KEM-768", NULL); 249*e7be843bSPierre Pronchery 250*e7be843bSPierre ProncheryAn B<ML-KEM-768> key can be generated like this: 251*e7be843bSPierre Pronchery 252*e7be843bSPierre Pronchery pkey = EVP_PKEY_Q_keygen(NULL, NULL, "ML-KEM-768"); 253*e7be843bSPierre Pronchery 254*e7be843bSPierre ProncheryAn B<ML-KEM> private key in seed format can be converted to a key in the FIPS 255*e7be843bSPierre Pronchery203 B<dk> format by running: 256*e7be843bSPierre Pronchery 257*e7be843bSPierre Pronchery $ openssl pkey -provparam ml-kem.retain_seed=no \ 258*e7be843bSPierre Pronchery -in seed-only.pem -out priv-only.pem 259*e7be843bSPierre Pronchery 260*e7be843bSPierre ProncheryTo generate an, e.g., B<ML-KEM-768> key, in FIPS 203 B<dk> format, you can run: 261*e7be843bSPierre Pronchery 262*e7be843bSPierre Pronchery $ openssl genpkey -provparam ml-kem.retain_seed=no \ 263*e7be843bSPierre Pronchery -algorithm ml-kem-768 -out priv-only.pem 264*e7be843bSPierre Pronchery 265*e7be843bSPierre ProncheryIf you have a B<PKCS#8> file with both a seed and a key, and prefer to import the 266*e7be843bSPierre Proncherycompanion key rather than the seed, you can run: 267*e7be843bSPierre Pronchery 268*e7be843bSPierre Pronchery $ openssl pkey -provparam ml-kem.prefer_seed=no \ 269*e7be843bSPierre Pronchery -in seed-priv.pem -out priv-only.pem 270*e7be843bSPierre Pronchery 271*e7be843bSPierre ProncheryIn the B<openssl.cnf> file, this looks like: 272*e7be843bSPierre Pronchery 273*e7be843bSPierre Pronchery openssl_conf = openssl_init 274*e7be843bSPierre Pronchery 275*e7be843bSPierre Pronchery [openssl_init] 276*e7be843bSPierre Pronchery providers = providers_sect 277*e7be843bSPierre Pronchery 278*e7be843bSPierre Pronchery # Can be referenced in one or more provider sections 279*e7be843bSPierre Pronchery [ml_kem_sect] 280*e7be843bSPierre Pronchery prefer_seed = yes 281*e7be843bSPierre Pronchery retain_seed = yes 282*e7be843bSPierre Pronchery # OQS legacy formats disabled 283*e7be843bSPierre Pronchery input_formats = seed-priv, seed-only, priv-only 284*e7be843bSPierre Pronchery # Output either the seed alone, or else the key alone 285*e7be843bSPierre Pronchery output_formats = seed-only, priv-only 286*e7be843bSPierre Pronchery 287*e7be843bSPierre Pronchery [providers_sect] 288*e7be843bSPierre Pronchery default = default_sect 289*e7be843bSPierre Pronchery # Or perhaps just: base = default_sect 290*e7be843bSPierre Pronchery base = base_sect 291*e7be843bSPierre Pronchery 292*e7be843bSPierre Pronchery [default_sect] 293*e7be843bSPierre Pronchery ml-kem = ml_kem_sect 294*e7be843bSPierre Pronchery 295*e7be843bSPierre Pronchery [base_sect] 296*e7be843bSPierre Pronchery ml-kem = ml_kem_sect 297*e7be843bSPierre Pronchery 298*e7be843bSPierre Pronchery=head1 SEE ALSO 299*e7be843bSPierre Pronchery 300*e7be843bSPierre ProncheryL<openssl(1)>, 301*e7be843bSPierre ProncheryL<openssl-pkey(1)>, 302*e7be843bSPierre ProncheryL<openssl-genpkey(1)>, 303*e7be843bSPierre ProncheryL<EVP_KEYMGMT(3)>, 304*e7be843bSPierre ProncheryL<EVP_PKEY(3)>, 305*e7be843bSPierre ProncheryL<EVP_PKEY_get_raw_private_key(3)>, 306*e7be843bSPierre ProncheryL<EVP_PKEY_get_raw_public_key(3)>, 307*e7be843bSPierre ProncheryL<EVP_PKEY_get1_encoded_public_key(3)>, 308*e7be843bSPierre ProncheryL<OSSL_PROVIDER_add_conf_parameter(3)>, 309*e7be843bSPierre ProncheryL<provider-keymgmt(7)>, 310*e7be843bSPierre ProncheryL<EVP_KEM-ML-KEM(7)> 311*e7be843bSPierre Pronchery 312*e7be843bSPierre Pronchery=head1 HISTORY 313*e7be843bSPierre Pronchery 314*e7be843bSPierre ProncheryThis functionality was added in OpenSSL 3.5. 315*e7be843bSPierre Pronchery 316*e7be843bSPierre Pronchery=head1 COPYRIGHT 317*e7be843bSPierre Pronchery 318*e7be843bSPierre ProncheryCopyright 2024-2025 The OpenSSL Project Authors. All Rights Reserved. 319*e7be843bSPierre Pronchery 320*e7be843bSPierre ProncheryLicensed under the Apache License 2.0 (the "License"). You may not use 321*e7be843bSPierre Proncherythis file except in compliance with the License. You can obtain a copy 322*e7be843bSPierre Proncheryin the file LICENSE in the source distribution or at 323*e7be843bSPierre ProncheryL<https://www.openssl.org/source/license.html>. 324*e7be843bSPierre Pronchery 325*e7be843bSPierre Pronchery=cut 326