#include <openssl/dsa.h>
#include "crypto/evp.h"
+typedef enum {
+ PEM_INFO_NONE,
+ PEM_INFO_X509,
+ PEM_INFO_X509_AUX,
+ PEM_INFO_X509_CRL,
+ PEM_INFO_PKEY
+} pem_info_type;
+
#ifndef OPENSSL_NO_STDIO
STACK_OF(X509_INFO)
*PEM_X509_INFO_read_ex(FILE *fp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb,
int ok = 0;
STACK_OF(X509_INFO) *ret = NULL;
unsigned int i, raw, ptype;
- d2i_of_void *d2i = 0;
+ pem_info_type itype = PEM_INFO_NONE;
if (sk == NULL) {
if ((ret = sk_X509_INFO_new_null()) == NULL) {
for (;;) {
raw = 0;
ptype = 0;
+ itype = PEM_INFO_NONE;
ERR_set_mark();
i = PEM_read_bio(bp, &name, &header, &data, &len);
if (i == 0) {
goto start;
}
if ((strcmp(name, PEM_STRING_X509_TRUSTED) == 0))
- d2i = (D2I_OF(void))d2i_X509_AUX;
+ itype = PEM_INFO_X509_AUX;
else
- d2i = (D2I_OF(void))d2i_X509;
+ itype = PEM_INFO_X509;
xi->x509 = X509_new_ex(libctx, propq);
if (xi->x509 == NULL)
goto err;
pp = &(xi->x509);
} else if (strcmp(name, PEM_STRING_X509_CRL) == 0) {
- d2i = (D2I_OF(void))d2i_X509_CRL;
+ itype = PEM_INFO_X509_CRL;
if (xi->crl != NULL) {
if (!sk_X509_INFO_push(ret, xi))
goto err;
xi->enc_data = NULL;
xi->enc_len = 0;
- d2i = (D2I_OF(void))d2i_AutoPrivateKey;
+ itype = PEM_INFO_PKEY;
xi->x_pkey = X509_PKEY_new();
if (xi->x_pkey == NULL)
goto err;
|| strcmp(name, PEM_STRING_PKCS8) == 0)
raw = 1;
} else { /* unknown */
- d2i = NULL;
+ itype = PEM_INFO_NONE;
pp = NULL;
}
- if (d2i != NULL) {
+ if (itype != PEM_INFO_NONE) {
if (!raw) {
EVP_CIPHER_INFO cipher;
goto err;
p = data;
if (ptype) {
- if (d2i_PrivateKey_ex(ptype, pp, &p, len,
+ if (d2i_PrivateKey_ex(ptype, (EVP_PKEY **)pp, &p, len,
libctx, propq)
== NULL) {
ERR_raise(ERR_LIB_PEM, ERR_R_ASN1_LIB);
goto err;
}
- } else if (d2i(pp, &p, len) == NULL) {
- ERR_raise(ERR_LIB_PEM, ERR_R_ASN1_LIB);
- goto err;
+ } else {
+ void *decoded = NULL;
+
+ switch (itype) {
+ case PEM_INFO_X509:
+ decoded = d2i_X509((X509 **)pp, &p, len);
+ break;
+ case PEM_INFO_X509_AUX:
+ decoded = d2i_X509_AUX((X509 **)pp, &p, len);
+ break;
+ case PEM_INFO_X509_CRL:
+ decoded = d2i_X509_CRL((X509_CRL **)pp, &p, len);
+ break;
+ case PEM_INFO_PKEY:
+ decoded = d2i_AutoPrivateKey_ex((EVP_PKEY **)pp, &p,
+ len, libctx, propq);
+ break;
+ case PEM_INFO_NONE:
+ break;
+ }
+ if (decoded == NULL) {
+ ERR_raise(ERR_LIB_PEM, ERR_R_ASN1_LIB);
+ goto err;
+ }
}
} else { /* encrypted key data */
if (!PEM_get_EVP_CIPHER_INFO(header, &xi->enc_cipher))