+static const struct {
+ size_t ec;
+ int nid;
+} EC_NID_PAIRS[] = {
+ {YACA_KEY_LENGTH_EC_PRIME192V1, NID_X9_62_prime192v1},
+ {YACA_KEY_LENGTH_EC_PRIME256V1, NID_X9_62_prime256v1},
+ {YACA_KEY_LENGTH_EC_SECP256K1, NID_secp256k1},
+ {YACA_KEY_LENGTH_EC_SECP384R1, NID_secp384r1},
+ {YACA_KEY_LENGTH_EC_SECP521R1, NID_secp521r1}
+};
+
+static const size_t EC_NID_PAIRS_SIZE = sizeof(EC_NID_PAIRS) / sizeof(EC_NID_PAIRS[0]);
+
+static const struct {
+ int evp_id;
+ yaca_key_type_e priv;
+ yaca_key_type_e pub;
+ yaca_key_type_e params;
+} KEY_TYPES_PARAMS[] = {
+ {EVP_PKEY_RSA, YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_TYPE_RSA_PUB, -1},
+ {EVP_PKEY_DSA, YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_TYPE_DSA_PUB, YACA_KEY_TYPE_DSA_PARAMS},
+ {EVP_PKEY_DH, YACA_KEY_TYPE_DH_PRIV, YACA_KEY_TYPE_DH_PUB, YACA_KEY_TYPE_DH_PARAMS},
+ {EVP_PKEY_EC, YACA_KEY_TYPE_EC_PRIV, YACA_KEY_TYPE_EC_PUB, YACA_KEY_TYPE_EC_PARAMS}
+};
+
+static const size_t KEY_TYPES_PARAMS_SIZE = sizeof(KEY_TYPES_PARAMS) / sizeof(KEY_TYPES_PARAMS[0]);
+
+#define CONVERT_TYPES_TEMPLATE(data, src_type, src, dst_type, dst) \
+ static int convert_##src##_to_##dst (src_type src, dst_type *dst) \
+ { \
+ assert(dst != NULL); \
+ size_t i; \
+ for (i = 0; i < data##_SIZE; ++i) \
+ if (data[i].src == src) { \
+ if (data[i].dst != (dst_type)-1) { \
+ *dst = data[i].dst; \
+ return YACA_ERROR_NONE; \
+ } \
+ } \
+ return YACA_ERROR_INVALID_PARAMETER; \
+ }
+
+CONVERT_TYPES_TEMPLATE(EC_NID_PAIRS, int, nid, size_t, ec)
+CONVERT_TYPES_TEMPLATE(EC_NID_PAIRS, size_t, ec, int, nid)
+
+CONVERT_TYPES_TEMPLATE(KEY_TYPES_PARAMS, yaca_key_type_e, params, int, evp_id)
+CONVERT_TYPES_TEMPLATE(KEY_TYPES_PARAMS, yaca_key_type_e, priv, int, evp_id)
+CONVERT_TYPES_TEMPLATE(KEY_TYPES_PARAMS, yaca_key_type_e, params, yaca_key_type_e, priv)
+