Skip to content

Commit e16a7ba

Browse files
committed
Re-factor s_import_pkcs8()
Signed-off-by: Steffen Jaeckel <s@jaeckel.eu>
1 parent 25b26c6 commit e16a7ba

File tree

1 file changed

+36
-39
lines changed

1 file changed

+36
-39
lines changed

src/misc/pem/pem_pkcs.c

Lines changed: 36 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -41,55 +41,50 @@ static int s_decrypt_pem(unsigned char *asn1_cert, unsigned long *asn1_len, cons
4141
return err;
4242
}
4343

44-
static int s_import_pkcs8(unsigned char *asn1_cert, unsigned long asn1_len, ltc_pka_key *k, const password_ctx *pw_ctx)
45-
{
46-
int err;
47-
enum ltc_oid_id pka;
48-
ltc_asn1_list *alg_id, *priv_key;
49-
ltc_asn1_list *p8_asn1 = NULL;
50-
if ((err = pkcs8_decode_flexi(asn1_cert, asn1_len, pw_ctx, &p8_asn1)) != CRYPT_OK) {
51-
goto cleanup;
52-
}
53-
if ((err = pkcs8_get_children(p8_asn1, &pka, &alg_id, &priv_key)) != CRYPT_OK) {
54-
goto cleanup;
55-
}
56-
switch (pka) {
44+
typedef int (*pkcs8_import_fn)(ltc_asn1_list *, ltc_asn1_list *, void*);
45+
46+
static const struct {
47+
enum ltc_pka_id id;
48+
pkcs8_import_fn fn;
49+
} s_import_pkcs8_map[LTC_OID_NUM] = {
5750
#ifdef LTC_MDH
58-
case LTC_OID_DH:
59-
err = dh_import_pkcs8_asn1(alg_id, priv_key, &k->u.dh);
60-
k->id = LTC_PKA_DH;
61-
break;
51+
[LTC_OID_DH] = { LTC_PKA_DH, (pkcs8_import_fn)dh_import_pkcs8_asn1 },
6252
#endif
6353
#ifdef LTC_MDSA
64-
case LTC_OID_DSA:
65-
err = dsa_import_pkcs8_asn1(alg_id, priv_key, &k->u.dsa);
66-
k->id = LTC_PKA_DSA;
67-
break;
54+
[LTC_OID_DSA] = { LTC_PKA_DSA, (pkcs8_import_fn)dsa_import_pkcs8_asn1 },
6855
#endif
6956
#ifdef LTC_MRSA
70-
case LTC_OID_RSA:
71-
err = rsa_import_pkcs8_asn1(alg_id, priv_key, &k->u.rsa);
72-
k->id = LTC_PKA_RSA;
73-
break;
57+
[LTC_OID_RSA] = { LTC_PKA_RSA, (pkcs8_import_fn)rsa_import_pkcs8_asn1 },
7458
#endif
7559
#ifdef LTC_MECC
76-
case LTC_OID_EC:
77-
err = ecc_import_pkcs8_asn1(alg_id, priv_key, &k->u.ecc);
78-
k->id = LTC_PKA_EC;
79-
break;
60+
[LTC_OID_EC] = { LTC_PKA_EC, (pkcs8_import_fn)ecc_import_pkcs8_asn1 },
8061
#endif
8162
#ifdef LTC_CURVE25519
82-
case LTC_OID_X25519:
83-
err = x25519_import_pkcs8_asn1(alg_id, priv_key, &k->u.x25519);
84-
k->id = LTC_PKA_X25519;
85-
break;
86-
case LTC_OID_ED25519:
87-
err = ed25519_import_pkcs8_asn1(alg_id, priv_key, &k->u.ed25519);
88-
k->id = LTC_PKA_ED25519;
89-
break;
63+
[LTC_OID_X25519] = { LTC_PKA_X25519, (pkcs8_import_fn)x25519_import_pkcs8_asn1 },
64+
[LTC_OID_ED25519] = { LTC_PKA_ED25519, (pkcs8_import_fn)ed25519_import_pkcs8_asn1 },
9065
#endif
91-
default:
92-
err = CRYPT_PK_INVALID_TYPE;
66+
};
67+
68+
static int s_import_pkcs8(unsigned char *asn1_cert, unsigned long asn1_len, ltc_pka_key *k, const password_ctx *pw_ctx)
69+
{
70+
int err;
71+
enum ltc_oid_id oid_id;
72+
ltc_asn1_list *alg_id, *priv_key;
73+
ltc_asn1_list *p8_asn1 = NULL;
74+
if ((err = pkcs8_decode_flexi(asn1_cert, asn1_len, pw_ctx, &p8_asn1)) != CRYPT_OK) {
75+
goto cleanup;
76+
}
77+
if ((err = pkcs8_get_children(p8_asn1, &oid_id, &alg_id, &priv_key)) != CRYPT_OK) {
78+
goto cleanup;
79+
}
80+
if (oid_id < 0
81+
|| oid_id > LTC_ARRAY_SIZE(s_import_pkcs8_map)
82+
|| s_import_pkcs8_map[oid_id].fn == NULL) {
83+
err = CRYPT_PK_INVALID_TYPE;
84+
goto cleanup;
85+
}
86+
if ((err = s_import_pkcs8_map[oid_id].fn(alg_id, priv_key, &k->u)) == CRYPT_OK) {
87+
k->id = s_import_pkcs8_map[oid_id].id;
9388
}
9489

9590
cleanup:
@@ -111,6 +106,8 @@ static int s_extract_pka(unsigned char *asn1_cert, unsigned long asn1_len, enum
111106
return err;
112107
}
113108

109+
typedef int (*import_fn)(const unsigned char *, unsigned long, void*);
110+
114111
static const import_fn s_import_openssl_fns[LTC_PKA_NUM] = {
115112
#ifdef LTC_MRSA
116113
[LTC_PKA_RSA] = (import_fn)rsa_import,

0 commit comments

Comments
 (0)