1b077aed3SPierre Pronchery=pod 2b077aed3SPierre Pronchery 3b077aed3SPierre Pronchery=begin comment 4b077aed3SPierre Pronchery 5b077aed3SPierre ProncheryAny deprecated keypair/params d2i or i2d functions are collected on this page. 6b077aed3SPierre Pronchery 7b077aed3SPierre Pronchery=end comment 8b077aed3SPierre Pronchery 9b077aed3SPierre Pronchery=head1 NAME 10b077aed3SPierre Pronchery 11b077aed3SPierre Proncheryd2i_DSAPrivateKey, 12b077aed3SPierre Proncheryd2i_DSAPrivateKey_bio, 13b077aed3SPierre Proncheryd2i_DSAPrivateKey_fp, 14b077aed3SPierre Proncheryd2i_DSAPublicKey, 15b077aed3SPierre Proncheryd2i_DSA_PUBKEY, 16b077aed3SPierre Proncheryd2i_DSA_PUBKEY_bio, 17b077aed3SPierre Proncheryd2i_DSA_PUBKEY_fp, 18b077aed3SPierre Proncheryd2i_DSAparams, 19b077aed3SPierre Proncheryd2i_RSAPrivateKey, 20b077aed3SPierre Proncheryd2i_RSAPrivateKey_bio, 21b077aed3SPierre Proncheryd2i_RSAPrivateKey_fp, 22b077aed3SPierre Proncheryd2i_RSAPublicKey, 23b077aed3SPierre Proncheryd2i_RSAPublicKey_bio, 24b077aed3SPierre Proncheryd2i_RSAPublicKey_fp, 25b077aed3SPierre Proncheryd2i_RSA_PUBKEY, 26b077aed3SPierre Proncheryd2i_RSA_PUBKEY_bio, 27b077aed3SPierre Proncheryd2i_RSA_PUBKEY_fp, 28b077aed3SPierre Proncheryd2i_DHparams, 29b077aed3SPierre Proncheryd2i_DHparams_bio, 30b077aed3SPierre Proncheryd2i_DHparams_fp, 31b077aed3SPierre Proncheryd2i_ECParameters, 32b077aed3SPierre Proncheryd2i_ECPrivateKey, 33b077aed3SPierre Proncheryd2i_ECPrivateKey_bio, 34b077aed3SPierre Proncheryd2i_ECPrivateKey_fp, 35b077aed3SPierre Proncheryd2i_EC_PUBKEY, 36b077aed3SPierre Proncheryd2i_EC_PUBKEY_bio, 37b077aed3SPierre Proncheryd2i_EC_PUBKEY_fp, 38b077aed3SPierre Proncheryi2d_RSAPrivateKey, 39b077aed3SPierre Proncheryi2d_RSAPrivateKey_bio, 40b077aed3SPierre Proncheryi2d_RSAPrivateKey_fp, 41b077aed3SPierre Proncheryi2d_RSAPublicKey, 42b077aed3SPierre Proncheryi2d_RSAPublicKey_bio, 43b077aed3SPierre Proncheryi2d_RSAPublicKey_fp, 44b077aed3SPierre Proncheryi2d_RSA_PUBKEY, 45b077aed3SPierre Proncheryi2d_RSA_PUBKEY_bio, 46b077aed3SPierre Proncheryi2d_RSA_PUBKEY_fp, 47b077aed3SPierre Proncheryi2d_DHparams, 48b077aed3SPierre Proncheryi2d_DHparams_bio, 49b077aed3SPierre Proncheryi2d_DHparams_fp, 50b077aed3SPierre Proncheryi2d_DSAPrivateKey, 51b077aed3SPierre Proncheryi2d_DSAPrivateKey_bio, 52b077aed3SPierre Proncheryi2d_DSAPrivateKey_fp, 53b077aed3SPierre Proncheryi2d_DSAPublicKey, 54b077aed3SPierre Proncheryi2d_DSA_PUBKEY, 55b077aed3SPierre Proncheryi2d_DSA_PUBKEY_bio, 56b077aed3SPierre Proncheryi2d_DSA_PUBKEY_fp, 57b077aed3SPierre Proncheryi2d_DSAparams, 58b077aed3SPierre Proncheryi2d_ECParameters, 59b077aed3SPierre Proncheryi2d_ECPrivateKey, 60b077aed3SPierre Proncheryi2d_ECPrivateKey_bio, 61b077aed3SPierre Proncheryi2d_ECPrivateKey_fp, 62b077aed3SPierre Proncheryi2d_EC_PUBKEY, 63b077aed3SPierre Proncheryi2d_EC_PUBKEY_bio, 64b077aed3SPierre Proncheryi2d_EC_PUBKEY_fp 65b077aed3SPierre Pronchery- DEPRECATED 66b077aed3SPierre Pronchery 67b077aed3SPierre Pronchery=head1 SYNOPSIS 68b077aed3SPierre Pronchery 69b077aed3SPierre Pronchery=for openssl generic 70b077aed3SPierre Pronchery 71b077aed3SPierre ProncheryThe following functions have been deprecated since OpenSSL 3.0, and can be 72b077aed3SPierre Proncheryhidden entirely by defining B<OPENSSL_API_COMPAT> with a suitable version value, 73b077aed3SPierre Proncherysee L<openssl_user_macros(7)>: 74b077aed3SPierre Pronchery 75b077aed3SPierre Pronchery TYPE *d2i_TYPEPrivateKey(TYPE **a, const unsigned char **ppin, long length); 76b077aed3SPierre Pronchery TYPE *d2i_TYPEPrivateKey_bio(BIO *bp, TYPE **a); 77b077aed3SPierre Pronchery TYPE *d2i_TYPEPrivateKey_fp(FILE *fp, TYPE **a); 78b077aed3SPierre Pronchery TYPE *d2i_TYPEPublicKey(TYPE **a, const unsigned char **ppin, long length); 79b077aed3SPierre Pronchery TYPE *d2i_TYPEPublicKey_bio(BIO *bp, TYPE **a); 80b077aed3SPierre Pronchery TYPE *d2i_TYPEPublicKey_fp(FILE *fp, TYPE **a); 81b077aed3SPierre Pronchery TYPE *d2i_TYPEparams(TYPE **a, const unsigned char **ppin, long length); 82b077aed3SPierre Pronchery TYPE *d2i_TYPEparams_bio(BIO *bp, TYPE **a); 83b077aed3SPierre Pronchery TYPE *d2i_TYPEparams_fp(FILE *fp, TYPE **a); 84b077aed3SPierre Pronchery TYPE *d2i_TYPE_PUBKEY(TYPE **a, const unsigned char **ppin, long length); 85b077aed3SPierre Pronchery TYPE *d2i_TYPE_PUBKEY_bio(BIO *bp, TYPE **a); 86b077aed3SPierre Pronchery TYPE *d2i_TYPE_PUBKEY_fp(FILE *fp, TYPE **a); 87b077aed3SPierre Pronchery 88b077aed3SPierre Pronchery int i2d_TYPEPrivateKey(const TYPE *a, unsigned char **ppout); 89b077aed3SPierre Pronchery int i2d_TYPEPrivateKey(TYPE *a, unsigned char **ppout); 90b077aed3SPierre Pronchery int i2d_TYPEPrivateKey_fp(FILE *fp, const TYPE *a); 91b077aed3SPierre Pronchery int i2d_TYPEPrivateKey_fp(FILE *fp, TYPE *a); 92b077aed3SPierre Pronchery int i2d_TYPEPrivateKey_bio(BIO *bp, const TYPE *a); 93b077aed3SPierre Pronchery int i2d_TYPEPrivateKey_bio(BIO *bp, TYPE *a); 94b077aed3SPierre Pronchery int i2d_TYPEPublicKey(const TYPE *a, unsigned char **ppout); 95b077aed3SPierre Pronchery int i2d_TYPEPublicKey(TYPE *a, unsigned char **ppout); 96b077aed3SPierre Pronchery int i2d_TYPEPublicKey_fp(FILE *fp, const TYPE *a); 97b077aed3SPierre Pronchery int i2d_TYPEPublicKey_fp(FILE *fp, TYPE *a); 98b077aed3SPierre Pronchery int i2d_TYPEPublicKey_bio(BIO *bp, const TYPE *a); 99b077aed3SPierre Pronchery int i2d_TYPEPublicKey_bio(BIO *bp, TYPE *a); 100b077aed3SPierre Pronchery int i2d_TYPEparams(const TYPE *a, unsigned char **ppout); 101b077aed3SPierre Pronchery int i2d_TYPEparams(TYPE *a, unsigned char **ppout); 102b077aed3SPierre Pronchery int i2d_TYPEparams_fp(FILE *fp, const TYPE *a); 103b077aed3SPierre Pronchery int i2d_TYPEparams_fp(FILE *fp, TYPE *a); 104b077aed3SPierre Pronchery int i2d_TYPEparams_bio(BIO *bp, const TYPE *a); 105b077aed3SPierre Pronchery int i2d_TYPEparams_bio(BIO *bp, TYPE *a); 106b077aed3SPierre Pronchery int i2d_TYPE_PUBKEY(const TYPE *a, unsigned char **ppout); 107b077aed3SPierre Pronchery int i2d_TYPE_PUBKEY(TYPE *a, unsigned char **ppout); 108b077aed3SPierre Pronchery int i2d_TYPE_PUBKEY_fp(FILE *fp, const TYPE *a); 109b077aed3SPierre Pronchery int i2d_TYPE_PUBKEY_fp(FILE *fp, TYPE *a); 110b077aed3SPierre Pronchery int i2d_TYPE_PUBKEY_bio(BIO *bp, const TYPE *a); 111b077aed3SPierre Pronchery int i2d_TYPE_PUBKEY_bio(BIO *bp, TYPE *a); 112b077aed3SPierre Pronchery 113b077aed3SPierre Pronchery=head1 DESCRIPTION 114b077aed3SPierre Pronchery 115b077aed3SPierre ProncheryAll functions described here are deprecated. Please use L<OSSL_DECODER(3)> 116b077aed3SPierre Proncheryinstead of the B<d2i> functions and L<OSSL_ENCODER(3)> instead of the B<i2d> 117b077aed3SPierre Proncheryfunctions. See L</Migration> below. 118b077aed3SPierre Pronchery 119b077aed3SPierre ProncheryIn the description here, B<I<TYPE>> is used a placeholder for any of the 120b077aed3SPierre ProncheryOpenSSL datatypes, such as B<RSA>. 121b077aed3SPierre ProncheryThe function parameters I<ppin> and I<ppout> are generally either both named 122b077aed3SPierre ProncheryI<pp> in the headers, or I<in> and I<out>. 123b077aed3SPierre Pronchery 124b077aed3SPierre ProncheryAll the functions here behave the way that's described in L<d2i_X509(3)>. 125b077aed3SPierre Pronchery 126b077aed3SPierre ProncheryPlease note that not all functions in the synopsis are available for all key 127b077aed3SPierre Proncherytypes. For example, there are no d2i_RSAparams() or i2d_RSAparams(), 128b077aed3SPierre Proncherybecause the PKCS#1 B<RSA> structure doesn't include any key parameters. 129b077aed3SPierre Pronchery 130b077aed3SPierre ProncheryB<d2i_I<TYPE>PrivateKey>() and derivates thereof decode DER encoded 131b077aed3SPierre ProncheryB<I<TYPE>> private key data organized in a type specific structure. 132b077aed3SPierre Pronchery 133b077aed3SPierre ProncheryB<d2i_I<TYPE>PublicKey>() and derivates thereof decode DER encoded 134b077aed3SPierre ProncheryB<I<TYPE>> public key data organized in a type specific structure. 135b077aed3SPierre Pronchery 136b077aed3SPierre ProncheryB<d2i_I<TYPE>params>() and derivates thereof decode DER encoded B<I<TYPE>> 137b077aed3SPierre Proncherykey parameters organized in a type specific structure. 138b077aed3SPierre Pronchery 139b077aed3SPierre ProncheryB<d2i_I<TYPE>_PUBKEY>() and derivates thereof decode DER encoded B<I<TYPE>> 140b077aed3SPierre Proncherypublic key data organized in a B<SubjectPublicKeyInfo> structure. 141b077aed3SPierre Pronchery 142b077aed3SPierre ProncheryB<i2d_I<TYPE>PrivateKey>() and derivates thereof encode the private key 143b077aed3SPierre ProncheryB<I<TYPE>> data into a type specific DER encoded structure. 144b077aed3SPierre Pronchery 145b077aed3SPierre ProncheryB<i2d_I<TYPE>PublicKey>() and derivates thereof encode the public key 146b077aed3SPierre ProncheryB<I<TYPE>> data into a type specific DER encoded structure. 147b077aed3SPierre Pronchery 148b077aed3SPierre ProncheryB<i2d_I<TYPE>params>() and derivates thereof encode the B<I<TYPE>> key 149b077aed3SPierre Proncheryparameters data into a type specific DER encoded structure. 150b077aed3SPierre Pronchery 151b077aed3SPierre ProncheryB<i2d_I<TYPE>_PUBKEY>() and derivates thereof encode the public key 152b077aed3SPierre ProncheryB<I<TYPE>> data into a DER encoded B<SubjectPublicKeyInfo> structure. 153b077aed3SPierre Pronchery 154b077aed3SPierre ProncheryFor example, d2i_RSAPrivateKey() and d2i_RSAPublicKey() expects the 155b077aed3SPierre Proncherystructure defined by PKCS#1. 156b077aed3SPierre ProncherySimilarly, i2d_RSAPrivateKey() and i2d_RSAPublicKey() produce DER encoded 157b077aed3SPierre Proncherystring organized according to PKCS#1. 158b077aed3SPierre Pronchery 159b077aed3SPierre Pronchery=head2 Migration 160b077aed3SPierre Pronchery 161b077aed3SPierre ProncheryMigration from the diverse B<I<TYPE>>s requires using corresponding new 162b077aed3SPierre ProncheryOpenSSL types. For all B<I<TYPE>>s described here, the corresponding new 163b077aed3SPierre Proncherytype is B<EVP_PKEY>. The rest of this section assumes that this has been 164b077aed3SPierre Proncherydone, exactly how to do that is described elsewhere. 165b077aed3SPierre Pronchery 166b077aed3SPierre ProncheryThere are two migration paths: 167b077aed3SPierre Pronchery 168b077aed3SPierre Pronchery=over 4 169b077aed3SPierre Pronchery 170b077aed3SPierre Pronchery=item * 171b077aed3SPierre Pronchery 172b077aed3SPierre ProncheryReplace 173b077aed3SPierre Proncheryb<d2i_I<TYPE>PrivateKey()> with L<d2i_PrivateKey(3)>, 174b077aed3SPierre Proncheryb<d2i_I<TYPE>PublicKey()> with L<d2i_PublicKey(3)>, 175b077aed3SPierre Proncheryb<d2i_I<TYPE>params()> with L<d2i_KeyParams(3)>, 176b077aed3SPierre Proncheryb<d2i_I<TYPE>_PUBKEY()> with L<d2i_PUBKEY(3)>, 177b077aed3SPierre Proncheryb<i2d_I<TYPE>PrivateKey()> with L<i2d_PrivateKey(3)>, 178b077aed3SPierre Proncheryb<i2d_I<TYPE>PublicKey()> with L<i2d_PublicKey(3)>, 179b077aed3SPierre Proncheryb<i2d_I<TYPE>params()> with L<i2d_KeyParams(3)>, 180b077aed3SPierre Proncheryb<i2d_I<TYPE>_PUBKEY()> with L<i2d_PUBKEY(3)>. 181b077aed3SPierre ProncheryA caveat is that L<i2d_PrivateKey(3)> may output a DER encoded PKCS#8 182b077aed3SPierre Proncheryoutermost structure instead of the type specific structure, and that 183b077aed3SPierre ProncheryL<d2i_PrivateKey(3)> recognises and unpacks a PKCS#8 structures. 184b077aed3SPierre Pronchery 185b077aed3SPierre Pronchery=item * 186b077aed3SPierre Pronchery 187b077aed3SPierre ProncheryUse L<OSSL_DECODER(3)> and L<OSSL_ENCODER(3)>. How to migrate is described 188b077aed3SPierre Proncherybelow. All those descriptions assume that the key to be encoded is in the 189b077aed3SPierre Proncheryvariable I<pkey>. 190b077aed3SPierre Pronchery 191b077aed3SPierre Pronchery=back 192b077aed3SPierre Pronchery 193b077aed3SPierre Pronchery=head3 Migrating B<i2d> functions to B<OSSL_ENCODER> 194b077aed3SPierre Pronchery 195b077aed3SPierre ProncheryThe exact L<OSSL_ENCODER(3)> output is driven by arguments rather than by 196b077aed3SPierre Proncheryfunction names. The sample code to get DER encoded output in a type 197b077aed3SPierre Proncheryspecific structure is uniform, the only things that vary are the selection 198b077aed3SPierre Proncheryof what part of the B<EVP_PKEY> should be output, and the structure. The 199b077aed3SPierre ProncheryB<i2d> functions names can therefore be translated into two variables, 200b077aed3SPierre ProncheryI<selection> and I<structure> as follows: 201b077aed3SPierre Pronchery 202b077aed3SPierre Pronchery=over 4 203b077aed3SPierre Pronchery 204b077aed3SPierre Pronchery=item B<i2d_I<TYPE>PrivateKey>() translates into: 205b077aed3SPierre Pronchery 206*6f1af0d7SPierre Pronchery int selection = EVP_PKEY_KEYPAIR; 207b077aed3SPierre Pronchery const char *structure = "type-specific"; 208b077aed3SPierre Pronchery 209b077aed3SPierre Pronchery=item B<i2d_I<TYPE>PublicKey>() translates into: 210b077aed3SPierre Pronchery 211b077aed3SPierre Pronchery int selection = EVP_PKEY_PUBLIC_KEY; 212b077aed3SPierre Pronchery const char *structure = "type-specific"; 213b077aed3SPierre Pronchery 214b077aed3SPierre Pronchery=item B<i2d_I<TYPE>params>() translates into: 215b077aed3SPierre Pronchery 216b077aed3SPierre Pronchery int selection = EVP_PKEY_PARAMETERS; 217b077aed3SPierre Pronchery const char *structure = "type-specific"; 218b077aed3SPierre Pronchery 219b077aed3SPierre Pronchery=item B<i2d_I<TYPE>_PUBKEY>() translates into: 220b077aed3SPierre Pronchery 221b077aed3SPierre Pronchery int selection = EVP_PKEY_PUBLIC_KEY; 222b077aed3SPierre Pronchery const char *structure = "SubjectPublicKeyInfo"; 223b077aed3SPierre Pronchery 224b077aed3SPierre Pronchery=back 225b077aed3SPierre Pronchery 226b077aed3SPierre ProncheryThe following sample code does the rest of the work: 227b077aed3SPierre Pronchery 228b077aed3SPierre Pronchery unsigned char *p = buffer; /* |buffer| is supplied by the caller */ 229b077aed3SPierre Pronchery size_t len = buffer_size; /* assumed be the size of |buffer| */ 230b077aed3SPierre Pronchery OSSL_ENCODER_CTX *ctx = 231b077aed3SPierre Pronchery OSSL_ENCODER_CTX_new_for_pkey(pkey, selection, "DER", structure, 232b077aed3SPierre Pronchery NULL, NULL); 233b077aed3SPierre Pronchery if (ctx == NULL) { 234b077aed3SPierre Pronchery /* fatal error handling */ 235b077aed3SPierre Pronchery } 236b077aed3SPierre Pronchery if (OSSL_ENCODER_CTX_get_num_encoders(ctx) == 0) { 237b077aed3SPierre Pronchery OSSL_ENCODER_CTX_free(ctx); 238b077aed3SPierre Pronchery /* non-fatal error handling */ 239b077aed3SPierre Pronchery } 240b077aed3SPierre Pronchery if (!OSSL_ENCODER_to_data(ctx, &p, &len)) { 241b077aed3SPierre Pronchery OSSL_ENCODER_CTX_free(ctx); 242b077aed3SPierre Pronchery /* error handling */ 243b077aed3SPierre Pronchery } 244b077aed3SPierre Pronchery OSSL_ENCODER_CTX_free(ctx); 245b077aed3SPierre Pronchery 246b077aed3SPierre Pronchery=for comment TODO: a similar section on OSSL_DECODER is to be added 247b077aed3SPierre Pronchery 248b077aed3SPierre Pronchery=head1 NOTES 249b077aed3SPierre Pronchery 250b077aed3SPierre ProncheryThe letters B<i> and B<d> in B<i2d_I<TYPE>>() stand for 251b077aed3SPierre Pronchery"internal" (that is, an internal C structure) and "DER" respectively. 252b077aed3SPierre ProncherySo B<i2d_I<TYPE>>() converts from internal to DER. 253b077aed3SPierre Pronchery 254b077aed3SPierre ProncheryThe functions can also understand B<BER> forms. 255b077aed3SPierre Pronchery 256b077aed3SPierre ProncheryThe actual TYPE structure passed to B<i2d_I<TYPE>>() must be a valid 257b077aed3SPierre Proncherypopulated B<I<TYPE>> structure -- it B<cannot> simply be fed with an 258b077aed3SPierre Proncheryempty structure such as that returned by TYPE_new(). 259b077aed3SPierre Pronchery 260b077aed3SPierre ProncheryThe encoded data is in binary form and may contain embedded zeros. 261b077aed3SPierre ProncheryTherefore, any FILE pointers or BIOs should be opened in binary mode. 262b077aed3SPierre ProncheryFunctions such as strlen() will B<not> return the correct length 263b077aed3SPierre Proncheryof the encoded structure. 264b077aed3SPierre Pronchery 265b077aed3SPierre ProncheryThe ways that I<*ppin> and I<*ppout> are incremented after the operation 266b077aed3SPierre Proncherycan trap the unwary. See the B<WARNINGS> section in L<d2i_X509(3)> for some 267b077aed3SPierre Proncherycommon errors. 268b077aed3SPierre ProncheryThe reason for this-auto increment behaviour is to reflect a typical 269b077aed3SPierre Proncheryusage of ASN1 functions: after one structure is encoded or decoded 270b077aed3SPierre Proncheryanother will be processed after it. 271b077aed3SPierre Pronchery 272b077aed3SPierre ProncheryThe following points about the data types might be useful: 273b077aed3SPierre Pronchery 274b077aed3SPierre Pronchery=over 4 275b077aed3SPierre Pronchery 276b077aed3SPierre Pronchery=item B<DSA_PUBKEY> 277b077aed3SPierre Pronchery 278b077aed3SPierre ProncheryRepresents a DSA public key using a B<SubjectPublicKeyInfo> structure. 279b077aed3SPierre Pronchery 280b077aed3SPierre Pronchery=item B<DSAPublicKey>, B<DSAPrivateKey> 281b077aed3SPierre Pronchery 282b077aed3SPierre ProncheryUse a non-standard OpenSSL format and should be avoided; use B<DSA_PUBKEY>, 283b077aed3SPierre ProncheryL<PEM_write_PrivateKey(3)>, or similar instead. 284b077aed3SPierre Pronchery 285b077aed3SPierre Pronchery=back 286b077aed3SPierre Pronchery 287b077aed3SPierre Pronchery=head1 RETURN VALUES 288b077aed3SPierre Pronchery 289b077aed3SPierre ProncheryB<d2i_I<TYPE>>(), B<d2i_I<TYPE>_bio>() and B<d2i_I<TYPE>_fp>() return a valid 290b077aed3SPierre ProncheryB<I<TYPE>> structure or NULL if an error occurs. If the "reuse" capability has 291b077aed3SPierre Proncherybeen used with a valid structure being passed in via I<a>, then the object is 292b077aed3SPierre Proncheryfreed in the event of error and I<*a> is set to NULL. 293b077aed3SPierre Pronchery 294b077aed3SPierre ProncheryB<i2d_I<TYPE>>() returns the number of bytes successfully encoded or a negative 295b077aed3SPierre Proncheryvalue if an error occurs. 296b077aed3SPierre Pronchery 297b077aed3SPierre ProncheryB<i2d_I<TYPE>_bio>() and B<i2d_I<TYPE>_fp>() return 1 for success and 0 if an 298b077aed3SPierre Proncheryerror occurs. 299b077aed3SPierre Pronchery 300b077aed3SPierre Pronchery=head1 SEE ALSO 301b077aed3SPierre Pronchery 302b077aed3SPierre ProncheryL<OSSL_ENCODER(3)>, L<OSSL_DECODER(3)>, 303b077aed3SPierre ProncheryL<d2i_PrivateKey(3)>, L<d2i_PublicKey(3)>, L<d2i_KeyParams(3)>, 304b077aed3SPierre ProncheryL<d2i_PUBKEY(3)>, 305b077aed3SPierre ProncheryL<i2d_PrivateKey(3)>, L<i2d_PublicKey(3)>, L<i2d_KeyParams(3)>, 306b077aed3SPierre ProncheryL<i2d_PUBKEY(3)> 307b077aed3SPierre Pronchery 308b077aed3SPierre Pronchery=head1 COPYRIGHT 309b077aed3SPierre Pronchery 310*6f1af0d7SPierre ProncheryCopyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved. 311b077aed3SPierre Pronchery 312b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License"). You may not use 313b077aed3SPierre Proncherythis file except in compliance with the License. You can obtain a copy 314b077aed3SPierre Proncheryin the file LICENSE in the source distribution or at 315b077aed3SPierre ProncheryL<https://www.openssl.org/source/license.html>. 316b077aed3SPierre Pronchery 317b077aed3SPierre Pronchery=cut 318