1=pod 2 3=begin comment 4 5Any deprecated keypair/params d2i or i2d functions are collected on this page. 6 7=end comment 8 9=head1 NAME 10 11d2i_DSAPrivateKey, 12d2i_DSAPrivateKey_bio, 13d2i_DSAPrivateKey_fp, 14d2i_DSAPublicKey, 15d2i_DSA_PUBKEY, 16d2i_DSA_PUBKEY_bio, 17d2i_DSA_PUBKEY_fp, 18d2i_DSAparams, 19d2i_RSAPrivateKey, 20d2i_RSAPrivateKey_bio, 21d2i_RSAPrivateKey_fp, 22d2i_RSAPublicKey, 23d2i_RSAPublicKey_bio, 24d2i_RSAPublicKey_fp, 25d2i_RSA_PUBKEY, 26d2i_RSA_PUBKEY_bio, 27d2i_RSA_PUBKEY_fp, 28d2i_DHparams, 29d2i_DHparams_bio, 30d2i_DHparams_fp, 31d2i_ECParameters, 32d2i_ECPrivateKey, 33d2i_ECPrivateKey_bio, 34d2i_ECPrivateKey_fp, 35d2i_EC_PUBKEY, 36d2i_EC_PUBKEY_bio, 37d2i_EC_PUBKEY_fp, 38i2d_RSAPrivateKey, 39i2d_RSAPrivateKey_bio, 40i2d_RSAPrivateKey_fp, 41i2d_RSAPublicKey, 42i2d_RSAPublicKey_bio, 43i2d_RSAPublicKey_fp, 44i2d_RSA_PUBKEY, 45i2d_RSA_PUBKEY_bio, 46i2d_RSA_PUBKEY_fp, 47i2d_DHparams, 48i2d_DHparams_bio, 49i2d_DHparams_fp, 50i2d_DSAPrivateKey, 51i2d_DSAPrivateKey_bio, 52i2d_DSAPrivateKey_fp, 53i2d_DSAPublicKey, 54i2d_DSA_PUBKEY, 55i2d_DSA_PUBKEY_bio, 56i2d_DSA_PUBKEY_fp, 57i2d_DSAparams, 58i2d_ECParameters, 59i2d_ECPrivateKey, 60i2d_ECPrivateKey_bio, 61i2d_ECPrivateKey_fp, 62i2d_EC_PUBKEY, 63i2d_EC_PUBKEY_bio, 64i2d_EC_PUBKEY_fp 65- DEPRECATED 66 67=head1 SYNOPSIS 68 69=for openssl generic 70 71The following functions have been deprecated since OpenSSL 3.0, and can be 72hidden entirely by defining B<OPENSSL_API_COMPAT> with a suitable version value, 73see L<openssl_user_macros(7)>: 74 75 TYPE *d2i_TYPEPrivateKey(TYPE **a, const unsigned char **ppin, long length); 76 TYPE *d2i_TYPEPrivateKey_bio(BIO *bp, TYPE **a); 77 TYPE *d2i_TYPEPrivateKey_fp(FILE *fp, TYPE **a); 78 TYPE *d2i_TYPEPublicKey(TYPE **a, const unsigned char **ppin, long length); 79 TYPE *d2i_TYPEPublicKey_bio(BIO *bp, TYPE **a); 80 TYPE *d2i_TYPEPublicKey_fp(FILE *fp, TYPE **a); 81 TYPE *d2i_TYPEparams(TYPE **a, const unsigned char **ppin, long length); 82 TYPE *d2i_TYPEparams_bio(BIO *bp, TYPE **a); 83 TYPE *d2i_TYPEparams_fp(FILE *fp, TYPE **a); 84 TYPE *d2i_TYPE_PUBKEY(TYPE **a, const unsigned char **ppin, long length); 85 TYPE *d2i_TYPE_PUBKEY_bio(BIO *bp, TYPE **a); 86 TYPE *d2i_TYPE_PUBKEY_fp(FILE *fp, TYPE **a); 87 88 int i2d_TYPEPrivateKey(const TYPE *a, unsigned char **ppout); 89 int i2d_TYPEPrivateKey(TYPE *a, unsigned char **ppout); 90 int i2d_TYPEPrivateKey_fp(FILE *fp, const TYPE *a); 91 int i2d_TYPEPrivateKey_fp(FILE *fp, TYPE *a); 92 int i2d_TYPEPrivateKey_bio(BIO *bp, const TYPE *a); 93 int i2d_TYPEPrivateKey_bio(BIO *bp, TYPE *a); 94 int i2d_TYPEPublicKey(const TYPE *a, unsigned char **ppout); 95 int i2d_TYPEPublicKey(TYPE *a, unsigned char **ppout); 96 int i2d_TYPEPublicKey_fp(FILE *fp, const TYPE *a); 97 int i2d_TYPEPublicKey_fp(FILE *fp, TYPE *a); 98 int i2d_TYPEPublicKey_bio(BIO *bp, const TYPE *a); 99 int i2d_TYPEPublicKey_bio(BIO *bp, TYPE *a); 100 int i2d_TYPEparams(const TYPE *a, unsigned char **ppout); 101 int i2d_TYPEparams(TYPE *a, unsigned char **ppout); 102 int i2d_TYPEparams_fp(FILE *fp, const TYPE *a); 103 int i2d_TYPEparams_fp(FILE *fp, TYPE *a); 104 int i2d_TYPEparams_bio(BIO *bp, const TYPE *a); 105 int i2d_TYPEparams_bio(BIO *bp, TYPE *a); 106 int i2d_TYPE_PUBKEY(const TYPE *a, unsigned char **ppout); 107 int i2d_TYPE_PUBKEY(TYPE *a, unsigned char **ppout); 108 int i2d_TYPE_PUBKEY_fp(FILE *fp, const TYPE *a); 109 int i2d_TYPE_PUBKEY_fp(FILE *fp, TYPE *a); 110 int i2d_TYPE_PUBKEY_bio(BIO *bp, const TYPE *a); 111 int i2d_TYPE_PUBKEY_bio(BIO *bp, TYPE *a); 112 113=head1 DESCRIPTION 114 115All functions described here are deprecated. Please use L<OSSL_DECODER(3)> 116instead of the B<d2i> functions and L<OSSL_ENCODER(3)> instead of the B<i2d> 117functions. See L</Migration> below. 118 119In the description here, B<I<TYPE>> is used a placeholder for any of the 120OpenSSL datatypes, such as B<RSA>. 121The function parameters I<ppin> and I<ppout> are generally either both named 122I<pp> in the headers, or I<in> and I<out>. 123 124All the functions here behave the way that's described in L<d2i_X509(3)>. 125 126Please note that not all functions in the synopsis are available for all key 127types. For example, there are no d2i_RSAparams() or i2d_RSAparams(), 128because the PKCS#1 B<RSA> structure doesn't include any key parameters. 129 130B<d2i_I<TYPE>PrivateKey>() and derivates thereof decode DER encoded 131B<I<TYPE>> private key data organized in a type specific structure. 132 133B<d2i_I<TYPE>PublicKey>() and derivates thereof decode DER encoded 134B<I<TYPE>> public key data organized in a type specific structure. 135 136B<d2i_I<TYPE>params>() and derivates thereof decode DER encoded B<I<TYPE>> 137key parameters organized in a type specific structure. 138 139B<d2i_I<TYPE>_PUBKEY>() and derivates thereof decode DER encoded B<I<TYPE>> 140public key data organized in a B<SubjectPublicKeyInfo> structure. 141 142B<i2d_I<TYPE>PrivateKey>() and derivates thereof encode the private key 143B<I<TYPE>> data into a type specific DER encoded structure. 144 145B<i2d_I<TYPE>PublicKey>() and derivates thereof encode the public key 146B<I<TYPE>> data into a type specific DER encoded structure. 147 148B<i2d_I<TYPE>params>() and derivates thereof encode the B<I<TYPE>> key 149parameters data into a type specific DER encoded structure. 150 151B<i2d_I<TYPE>_PUBKEY>() and derivates thereof encode the public key 152B<I<TYPE>> data into a DER encoded B<SubjectPublicKeyInfo> structure. 153 154For example, d2i_RSAPrivateKey() and d2i_RSAPublicKey() expects the 155structure defined by PKCS#1. 156Similarly, i2d_RSAPrivateKey() and i2d_RSAPublicKey() produce DER encoded 157string organized according to PKCS#1. 158 159=head2 Migration 160 161Migration from the diverse B<I<TYPE>>s requires using corresponding new 162OpenSSL types. For all B<I<TYPE>>s described here, the corresponding new 163type is B<EVP_PKEY>. The rest of this section assumes that this has been 164done, exactly how to do that is described elsewhere. 165 166There are two migration paths: 167 168=over 4 169 170=item * 171 172Replace 173b<d2i_I<TYPE>PrivateKey()> with L<d2i_PrivateKey(3)>, 174b<d2i_I<TYPE>PublicKey()> with L<d2i_PublicKey(3)>, 175b<d2i_I<TYPE>params()> with L<d2i_KeyParams(3)>, 176b<d2i_I<TYPE>_PUBKEY()> with L<d2i_PUBKEY(3)>, 177b<i2d_I<TYPE>PrivateKey()> with L<i2d_PrivateKey(3)>, 178b<i2d_I<TYPE>PublicKey()> with L<i2d_PublicKey(3)>, 179b<i2d_I<TYPE>params()> with L<i2d_KeyParams(3)>, 180b<i2d_I<TYPE>_PUBKEY()> with L<i2d_PUBKEY(3)>. 181A caveat is that L<i2d_PrivateKey(3)> may output a DER encoded PKCS#8 182outermost structure instead of the type specific structure, and that 183L<d2i_PrivateKey(3)> recognises and unpacks a PKCS#8 structures. 184 185=item * 186 187Use L<OSSL_DECODER(3)> and L<OSSL_ENCODER(3)>. How to migrate is described 188below. All those descriptions assume that the key to be encoded is in the 189variable I<pkey>. 190 191=back 192 193=head3 Migrating B<i2d> functions to B<OSSL_ENCODER> 194 195The exact L<OSSL_ENCODER(3)> output is driven by arguments rather than by 196function names. The sample code to get DER encoded output in a type 197specific structure is uniform, the only things that vary are the selection 198of what part of the B<EVP_PKEY> should be output, and the structure. The 199B<i2d> functions names can therefore be translated into two variables, 200I<selection> and I<structure> as follows: 201 202=over 4 203 204=item B<i2d_I<TYPE>PrivateKey>() translates into: 205 206 int selection = EVP_PKEY_KEYPAIR; 207 const char *structure = "type-specific"; 208 209=item B<i2d_I<TYPE>PublicKey>() translates into: 210 211 int selection = EVP_PKEY_PUBLIC_KEY; 212 const char *structure = "type-specific"; 213 214=item B<i2d_I<TYPE>params>() translates into: 215 216 int selection = EVP_PKEY_PARAMETERS; 217 const char *structure = "type-specific"; 218 219=item B<i2d_I<TYPE>_PUBKEY>() translates into: 220 221 int selection = EVP_PKEY_PUBLIC_KEY; 222 const char *structure = "SubjectPublicKeyInfo"; 223 224=back 225 226The following sample code does the rest of the work: 227 228 unsigned char *p = buffer; /* |buffer| is supplied by the caller */ 229 size_t len = buffer_size; /* assumed be the size of |buffer| */ 230 OSSL_ENCODER_CTX *ctx = 231 OSSL_ENCODER_CTX_new_for_pkey(pkey, selection, "DER", structure, 232 NULL, NULL); 233 if (ctx == NULL) { 234 /* fatal error handling */ 235 } 236 if (OSSL_ENCODER_CTX_get_num_encoders(ctx) == 0) { 237 OSSL_ENCODER_CTX_free(ctx); 238 /* non-fatal error handling */ 239 } 240 if (!OSSL_ENCODER_to_data(ctx, &p, &len)) { 241 OSSL_ENCODER_CTX_free(ctx); 242 /* error handling */ 243 } 244 OSSL_ENCODER_CTX_free(ctx); 245 246=for comment TODO: a similar section on OSSL_DECODER is to be added 247 248=head1 NOTES 249 250The letters B<i> and B<d> in B<i2d_I<TYPE>>() stand for 251"internal" (that is, an internal C structure) and "DER" respectively. 252So B<i2d_I<TYPE>>() converts from internal to DER. 253 254The functions can also understand B<BER> forms. 255 256The actual TYPE structure passed to B<i2d_I<TYPE>>() must be a valid 257populated B<I<TYPE>> structure -- it B<cannot> simply be fed with an 258empty structure such as that returned by TYPE_new(). 259 260The encoded data is in binary form and may contain embedded zeros. 261Therefore, any FILE pointers or BIOs should be opened in binary mode. 262Functions such as strlen() will B<not> return the correct length 263of the encoded structure. 264 265The ways that I<*ppin> and I<*ppout> are incremented after the operation 266can trap the unwary. See the B<WARNINGS> section in L<d2i_X509(3)> for some 267common errors. 268The reason for this-auto increment behaviour is to reflect a typical 269usage of ASN1 functions: after one structure is encoded or decoded 270another will be processed after it. 271 272The following points about the data types might be useful: 273 274=over 4 275 276=item B<DSA_PUBKEY> 277 278Represents a DSA public key using a B<SubjectPublicKeyInfo> structure. 279 280=item B<DSAPublicKey>, B<DSAPrivateKey> 281 282Use a non-standard OpenSSL format and should be avoided; use B<DSA_PUBKEY>, 283L<PEM_write_PrivateKey(3)>, or similar instead. 284 285=back 286 287=head1 RETURN VALUES 288 289B<d2i_I<TYPE>>(), B<d2i_I<TYPE>_bio>() and B<d2i_I<TYPE>_fp>() return a valid 290B<I<TYPE>> structure or NULL if an error occurs. If the "reuse" capability has 291been used with a valid structure being passed in via I<a>, then the object is 292freed in the event of error and I<*a> is set to NULL. 293 294B<i2d_I<TYPE>>() returns the number of bytes successfully encoded or a negative 295value if an error occurs. 296 297B<i2d_I<TYPE>_bio>() and B<i2d_I<TYPE>_fp>() return 1 for success and 0 if an 298error occurs. 299 300=head1 SEE ALSO 301 302L<OSSL_ENCODER(3)>, L<OSSL_DECODER(3)>, 303L<d2i_PrivateKey(3)>, L<d2i_PublicKey(3)>, L<d2i_KeyParams(3)>, 304L<d2i_PUBKEY(3)>, 305L<i2d_PrivateKey(3)>, L<i2d_PublicKey(3)>, L<i2d_KeyParams(3)>, 306L<i2d_PUBKEY(3)> 307 308=head1 COPYRIGHT 309 310Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved. 311 312Licensed under the Apache License 2.0 (the "License"). You may not use 313this file except in compliance with the License. You can obtain a copy 314in the file LICENSE in the source distribution or at 315L<https://www.openssl.org/source/license.html>. 316 317=cut 318