@@ -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
9590cleanup :
@@ -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+
114111static 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