mirror of
https://github.com/openssl/openssl.git
synced 2024-12-21 06:09:35 +08:00
0195cdd28f
Since EncryptedPrivateKeyInfo is a recognised structure, it's reasonable to think that someone might want to specify it. To be noted is that if someone specifies the structure PrivateKeyInfo but has also passed a passphrase callback, the result will still become a EncryptedPrivateKeyInfo structure. Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/16466)
272 lines
12 KiB
SQL
272 lines
12 KiB
SQL
/*
|
|
* Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
|
|
*
|
|
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
|
* this file except in compliance with the License. You can obtain a copy
|
|
* in the file LICENSE in the source distribution or at
|
|
* https://www.openssl.org/source/license.html
|
|
*/
|
|
|
|
#ifndef ENCODER_PROVIDER
|
|
# error Macro ENCODER_PROVIDER undefined
|
|
#endif
|
|
|
|
#define ENCODER_STRUCTURE_type_specific_keypair "type-specific"
|
|
#define ENCODER_STRUCTURE_type_specific_params "type-specific"
|
|
#define ENCODER_STRUCTURE_type_specific "type-specific"
|
|
#define ENCODER_STRUCTURE_type_specific_no_pub "type-specific"
|
|
#define ENCODER_STRUCTURE_EncryptedPrivateKeyInfo "EncryptedPrivateKeyInfo"
|
|
#define ENCODER_STRUCTURE_PrivateKeyInfo "PrivateKeyInfo"
|
|
#define ENCODER_STRUCTURE_SubjectPublicKeyInfo "SubjectPublicKeyInfo"
|
|
#define ENCODER_STRUCTURE_DH "dh"
|
|
#define ENCODER_STRUCTURE_DHX "dhx"
|
|
#define ENCODER_STRUCTURE_DSA "dsa"
|
|
#define ENCODER_STRUCTURE_EC "ec"
|
|
#define ENCODER_STRUCTURE_RSA "rsa"
|
|
#define ENCODER_STRUCTURE_PKCS1 "pkcs1"
|
|
#define ENCODER_STRUCTURE_PKCS3 "pkcs3"
|
|
#define ENCODER_STRUCTURE_X9_42 "X9.42"
|
|
#define ENCODER_STRUCTURE_X9_62 "X9.62"
|
|
|
|
/* Arguments are prefixed with '_' to avoid build breaks on certain platforms */
|
|
#define ENCODER_TEXT(_name, _sym, _fips) \
|
|
{ _name, \
|
|
"provider=" ENCODER_PROVIDER ",fips=" #_fips ",output=text", \
|
|
(ossl_##_sym##_to_text_encoder_functions) }
|
|
#define ENCODER(_name, _sym, _fips, _output) \
|
|
{ _name, \
|
|
"provider=" ENCODER_PROVIDER ",fips=" #_fips ",output=" #_output, \
|
|
(ossl_##_sym##_to_##_output##_encoder_functions) }
|
|
#define ENCODER_w_structure(_name, _sym, _fips, _output, _structure) \
|
|
{ _name, \
|
|
"provider=" ENCODER_PROVIDER ",fips=" #_fips ",output=" #_output \
|
|
",structure=" ENCODER_STRUCTURE_##_structure, \
|
|
(ossl_##_sym##_to_##_structure##_##_output##_encoder_functions) }
|
|
|
|
/*
|
|
* Entries for human text "encoders"
|
|
*/
|
|
ENCODER_TEXT("RSA", rsa, yes),
|
|
ENCODER_TEXT("RSA-PSS", rsapss, yes),
|
|
#ifndef OPENSSL_NO_DH
|
|
ENCODER_TEXT("DH", dh, yes),
|
|
ENCODER_TEXT("DHX", dhx, yes),
|
|
#endif
|
|
#ifndef OPENSSL_NO_DSA
|
|
ENCODER_TEXT("DSA", dsa, yes),
|
|
#endif
|
|
#ifndef OPENSSL_NO_EC
|
|
ENCODER_TEXT("EC", ec, yes),
|
|
ENCODER_TEXT("ED25519", ed25519, yes),
|
|
ENCODER_TEXT("ED448", ed448, yes),
|
|
ENCODER_TEXT("X25519", x25519, yes),
|
|
ENCODER_TEXT("X448", x448, yes),
|
|
# ifndef OPENSSL_NO_SM2
|
|
ENCODER_TEXT("SM2", sm2, no),
|
|
# endif
|
|
#endif
|
|
|
|
/*
|
|
* Entries for key type specific output formats. The structure name on these
|
|
* is the same as the key type name. This allows us to say something like:
|
|
*
|
|
* To replace i2d_{TYPE}PrivateKey(), i2d_{TYPE}PublicKey() and
|
|
* i2d_{TYPE}Params(), use OSSL_ENCODER functions with an OSSL_ENCODER_CTX
|
|
* created like this:
|
|
*
|
|
* OSSL_ENCODER_CTX *ctx =
|
|
* OSSL_ENCODER_CTX_new_for_pkey(pkey, selection, "DER", "type-specific",
|
|
* NULL, NULL);
|
|
*
|
|
* To replace PEM_write_bio_{TYPE}PrivateKey(), PEM_write_bio_{TYPE}PublicKey()
|
|
* and PEM_write_bio_{TYPE}Params(), use OSSL_ENCODER functions with an
|
|
* OSSL_ENCODER_CTX created like this:
|
|
*
|
|
* OSSL_ENCODER_CTX *ctx =
|
|
* OSSL_ENCODER_CTX_new_for_pkey(pkey, selection, "PEM", "type-specific",
|
|
* NULL, NULL);
|
|
*
|
|
* We only implement those for which there are current i2d_ and PEM_write_bio
|
|
* implementations.
|
|
*/
|
|
|
|
/* The RSA encoders only support private key and public key output */
|
|
ENCODER_w_structure("RSA", rsa, yes, der, type_specific_keypair),
|
|
ENCODER_w_structure("RSA", rsa, yes, pem, type_specific_keypair),
|
|
#ifndef OPENSSL_NO_DH
|
|
/* DH and X9.42 DH only support key parameters output. */
|
|
ENCODER_w_structure("DH", dh, yes, der, type_specific_params),
|
|
ENCODER_w_structure("DH", dh, yes, pem, type_specific_params),
|
|
ENCODER_w_structure("DHX", dhx, yes, der, type_specific_params),
|
|
ENCODER_w_structure("DHX", dhx, yes, pem, type_specific_params),
|
|
#endif
|
|
#ifndef OPENSSL_NO_DSA
|
|
ENCODER_w_structure("DSA", dsa, yes, der, type_specific),
|
|
ENCODER_w_structure("DSA", dsa, yes, pem, type_specific),
|
|
#endif
|
|
#ifndef OPENSSL_NO_EC
|
|
/* EC only supports keypair and parameters DER and PEM output. */
|
|
ENCODER_w_structure("EC", ec, yes, der, type_specific_no_pub),
|
|
ENCODER_w_structure("EC", ec, yes, pem, type_specific_no_pub),
|
|
/* EC supports blob output for the public key */
|
|
ENCODER("EC", ec, yes, blob),
|
|
# ifndef OPENSSL_NO_SM2
|
|
ENCODER_w_structure("SM2", sm2, no, der, type_specific_no_pub),
|
|
ENCODER_w_structure("SM2", sm2, no, pem, type_specific_no_pub),
|
|
ENCODER("SM2", sm2, no, blob),
|
|
# endif
|
|
#endif
|
|
|
|
/*
|
|
* Entries for the output formats MSBLOB and PVK
|
|
*/
|
|
ENCODER("RSA", rsa, yes, msblob),
|
|
ENCODER("RSA", rsa, yes, pvk),
|
|
#ifndef OPENSSL_NO_DSA
|
|
ENCODER("DSA", dsa, yes, msblob),
|
|
ENCODER("DSA", dsa, yes, pvk),
|
|
#endif
|
|
|
|
/*
|
|
* Entries for encrypted PKCS#8 (EncryptedPrivateKeyInfo), unencrypted PKCS#8
|
|
* (PrivateKeyInfo) and SubjectPublicKeyInfo. The "der" ones are added
|
|
* convenience for any user that wants to use OSSL_ENCODER directly.
|
|
* The "pem" ones also support PEM_write_bio_PrivateKey() and
|
|
* PEM_write_bio_PUBKEY().
|
|
*/
|
|
ENCODER_w_structure("RSA", rsa, yes, der, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("RSA", rsa, yes, pem, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("RSA", rsa, yes, der, PrivateKeyInfo),
|
|
ENCODER_w_structure("RSA", rsa, yes, pem, PrivateKeyInfo),
|
|
ENCODER_w_structure("RSA", rsa, yes, der, SubjectPublicKeyInfo),
|
|
ENCODER_w_structure("RSA", rsa, yes, pem, SubjectPublicKeyInfo),
|
|
|
|
ENCODER_w_structure("RSA-PSS", rsapss, yes, der, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("RSA-PSS", rsapss, yes, pem, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("RSA-PSS", rsapss, yes, der, PrivateKeyInfo),
|
|
ENCODER_w_structure("RSA-PSS", rsapss, yes, pem, PrivateKeyInfo),
|
|
ENCODER_w_structure("RSA-PSS", rsapss, yes, der, SubjectPublicKeyInfo),
|
|
ENCODER_w_structure("RSA-PSS", rsapss, yes, pem, SubjectPublicKeyInfo),
|
|
|
|
#ifndef OPENSSL_NO_DH
|
|
ENCODER_w_structure("DH", dh, yes, der, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("DH", dh, yes, pem, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("DH", dh, yes, der, PrivateKeyInfo),
|
|
ENCODER_w_structure("DH", dh, yes, pem, PrivateKeyInfo),
|
|
ENCODER_w_structure("DH", dh, yes, der, SubjectPublicKeyInfo),
|
|
ENCODER_w_structure("DH", dh, yes, pem, SubjectPublicKeyInfo),
|
|
|
|
ENCODER_w_structure("DHX", dhx, yes, der, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("DHX", dhx, yes, pem, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("DHX", dhx, yes, der, PrivateKeyInfo),
|
|
ENCODER_w_structure("DHX", dhx, yes, pem, PrivateKeyInfo),
|
|
ENCODER_w_structure("DHX", dhx, yes, der, SubjectPublicKeyInfo),
|
|
ENCODER_w_structure("DHX", dhx, yes, pem, SubjectPublicKeyInfo),
|
|
#endif
|
|
|
|
#ifndef OPENSSL_NO_DSA
|
|
ENCODER_w_structure("DSA", dsa, yes, der, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("DSA", dsa, yes, pem, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("DSA", dsa, yes, der, PrivateKeyInfo),
|
|
ENCODER_w_structure("DSA", dsa, yes, pem, PrivateKeyInfo),
|
|
ENCODER_w_structure("DSA", dsa, yes, der, SubjectPublicKeyInfo),
|
|
ENCODER_w_structure("DSA", dsa, yes, pem, SubjectPublicKeyInfo),
|
|
#endif
|
|
|
|
#ifndef OPENSSL_NO_EC
|
|
ENCODER_w_structure("EC", ec, yes, der, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("EC", ec, yes, pem, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("EC", ec, yes, der, PrivateKeyInfo),
|
|
ENCODER_w_structure("EC", ec, yes, pem, PrivateKeyInfo),
|
|
ENCODER_w_structure("EC", ec, yes, der, SubjectPublicKeyInfo),
|
|
ENCODER_w_structure("EC", ec, yes, pem, SubjectPublicKeyInfo),
|
|
|
|
ENCODER_w_structure("X25519", x25519, yes, der, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("X25519", x25519, yes, pem, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("X25519", x25519, yes, der, PrivateKeyInfo),
|
|
ENCODER_w_structure("X25519", x25519, yes, pem, PrivateKeyInfo),
|
|
ENCODER_w_structure("X25519", x25519, yes, der, SubjectPublicKeyInfo),
|
|
ENCODER_w_structure("X25519", x25519, yes, pem, SubjectPublicKeyInfo),
|
|
|
|
ENCODER_w_structure("X448", x448, yes, der, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("X448", x448, yes, pem, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("X448", x448, yes, der, PrivateKeyInfo),
|
|
ENCODER_w_structure("X448", x448, yes, pem, PrivateKeyInfo),
|
|
ENCODER_w_structure("X448", x448, yes, der, SubjectPublicKeyInfo),
|
|
ENCODER_w_structure("X448", x448, yes, pem, SubjectPublicKeyInfo),
|
|
|
|
ENCODER_w_structure("ED25519", ed25519, yes, der, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("ED25519", ed25519, yes, pem, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("ED25519", ed25519, yes, der, PrivateKeyInfo),
|
|
ENCODER_w_structure("ED25519", ed25519, yes, pem, PrivateKeyInfo),
|
|
ENCODER_w_structure("ED25519", ed25519, yes, der, SubjectPublicKeyInfo),
|
|
ENCODER_w_structure("ED25519", ed25519, yes, pem, SubjectPublicKeyInfo),
|
|
|
|
ENCODER_w_structure("ED448", ed448, yes, der, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("ED448", ed448, yes, pem, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("ED448", ed448, yes, der, PrivateKeyInfo),
|
|
ENCODER_w_structure("ED448", ed448, yes, pem, PrivateKeyInfo),
|
|
ENCODER_w_structure("ED448", ed448, yes, der, SubjectPublicKeyInfo),
|
|
ENCODER_w_structure("ED448", ed448, yes, pem, SubjectPublicKeyInfo),
|
|
|
|
# ifndef OPENSSL_NO_SM2
|
|
ENCODER_w_structure("SM2", sm2, no, der, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("SM2", sm2, no, pem, EncryptedPrivateKeyInfo),
|
|
ENCODER_w_structure("SM2", sm2, no, der, PrivateKeyInfo),
|
|
ENCODER_w_structure("SM2", sm2, no, pem, PrivateKeyInfo),
|
|
ENCODER_w_structure("SM2", sm2, no, der, SubjectPublicKeyInfo),
|
|
ENCODER_w_structure("SM2", sm2, no, pem, SubjectPublicKeyInfo),
|
|
# endif
|
|
#endif
|
|
|
|
/*
|
|
* Entries for key type specific output formats. These are exactly the
|
|
* same as the type specific above, except that they use the key type
|
|
* name as structure name instead of "type-specific", in the call on
|
|
* OSSL_ENCODER_CTX_new_for_pkey().
|
|
*/
|
|
|
|
/* The RSA encoders only support private key and public key output */
|
|
ENCODER_w_structure("RSA", rsa, yes, der, RSA),
|
|
ENCODER_w_structure("RSA", rsa, yes, pem, RSA),
|
|
#ifndef OPENSSL_NO_DH
|
|
/* DH and X9.42 DH only support key parameters output. */
|
|
ENCODER_w_structure("DH", dh, yes, der, DH),
|
|
ENCODER_w_structure("DH", dh, yes, pem, DH),
|
|
ENCODER_w_structure("DHX", dhx, yes, der, DHX),
|
|
ENCODER_w_structure("DHX", dhx, yes, pem, DHX),
|
|
#endif
|
|
#ifndef OPENSSL_NO_DSA
|
|
ENCODER_w_structure("DSA", dsa, yes, der, DSA),
|
|
ENCODER_w_structure("DSA", dsa, yes, pem, DSA),
|
|
#endif
|
|
#ifndef OPENSSL_NO_EC
|
|
ENCODER_w_structure("EC", ec, yes, der, EC),
|
|
ENCODER_w_structure("EC", ec, yes, pem, EC),
|
|
#endif
|
|
|
|
/*
|
|
* Additional entries with structure names being the standard name.
|
|
* This is entirely for the convenience of the user that wants to use
|
|
* OSSL_ENCODER directly with names they may fancy. These do not impact
|
|
* on libcrypto functionality in any way.
|
|
*/
|
|
/* PKCS#1 is a well known for plain RSA keys, so we add that too */
|
|
ENCODER_w_structure("RSA", rsa, yes, der, PKCS1),
|
|
ENCODER_w_structure("RSA", rsa, yes, pem, PKCS1),
|
|
ENCODER_w_structure("RSA-PSS", rsapss, yes, der, PKCS1),
|
|
ENCODER_w_structure("RSA-PSS", rsapss, yes, pem, PKCS1),
|
|
#ifndef OPENSSL_NO_DH
|
|
/* PKCS#3 defines the format for DH parameters */
|
|
ENCODER_w_structure("DH", dh, yes, der, PKCS3),
|
|
ENCODER_w_structure("DH", dh, yes, pem, PKCS3),
|
|
/* X9.42 defines the format for DHX parameters */
|
|
ENCODER_w_structure("DHX", dhx, yes, der, X9_42),
|
|
ENCODER_w_structure("DHX", dhx, yes, pem, X9_42),
|
|
#endif
|
|
#ifndef OPENSSL_NO_EC
|
|
/* RFC 5915 defines the format for EC keys and parameters */
|
|
ENCODER_w_structure("EC", ec, yes, der, X9_62),
|
|
ENCODER_w_structure("EC", ec, yes, pem, X9_62),
|
|
#endif
|