1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2006-2022 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci/* We need to use some engine deprecated APIs */ 11e1051a39Sopenharmony_ci#define OPENSSL_SUPPRESS_DEPRECATED 12e1051a39Sopenharmony_ci 13e1051a39Sopenharmony_ci#include "internal/cryptlib.h" 14e1051a39Sopenharmony_ci#include <stdio.h> 15e1051a39Sopenharmony_ci#include <openssl/asn1t.h> 16e1051a39Sopenharmony_ci#include <openssl/x509.h> 17e1051a39Sopenharmony_ci#include <openssl/engine.h> 18e1051a39Sopenharmony_ci#include "crypto/asn1.h" 19e1051a39Sopenharmony_ci#include "crypto/evp.h" 20e1051a39Sopenharmony_ci 21e1051a39Sopenharmony_ci#include "standard_methods.h" 22e1051a39Sopenharmony_ci 23e1051a39Sopenharmony_citypedef int sk_cmp_fn_type(const char *const *a, const char *const *b); 24e1051a39Sopenharmony_cistatic STACK_OF(EVP_PKEY_ASN1_METHOD) *app_methods = NULL; 25e1051a39Sopenharmony_ci 26e1051a39Sopenharmony_ciDECLARE_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_ASN1_METHOD *, 27e1051a39Sopenharmony_ci const EVP_PKEY_ASN1_METHOD *, ameth); 28e1051a39Sopenharmony_ci 29e1051a39Sopenharmony_cistatic int ameth_cmp(const EVP_PKEY_ASN1_METHOD *const *a, 30e1051a39Sopenharmony_ci const EVP_PKEY_ASN1_METHOD *const *b) 31e1051a39Sopenharmony_ci{ 32e1051a39Sopenharmony_ci return ((*a)->pkey_id - (*b)->pkey_id); 33e1051a39Sopenharmony_ci} 34e1051a39Sopenharmony_ci 35e1051a39Sopenharmony_ciIMPLEMENT_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_ASN1_METHOD *, 36e1051a39Sopenharmony_ci const EVP_PKEY_ASN1_METHOD *, ameth); 37e1051a39Sopenharmony_ci 38e1051a39Sopenharmony_ciint EVP_PKEY_asn1_get_count(void) 39e1051a39Sopenharmony_ci{ 40e1051a39Sopenharmony_ci int num = OSSL_NELEM(standard_methods); 41e1051a39Sopenharmony_ci if (app_methods) 42e1051a39Sopenharmony_ci num += sk_EVP_PKEY_ASN1_METHOD_num(app_methods); 43e1051a39Sopenharmony_ci return num; 44e1051a39Sopenharmony_ci} 45e1051a39Sopenharmony_ci 46e1051a39Sopenharmony_ciconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx) 47e1051a39Sopenharmony_ci{ 48e1051a39Sopenharmony_ci int num = OSSL_NELEM(standard_methods); 49e1051a39Sopenharmony_ci if (idx < 0) 50e1051a39Sopenharmony_ci return NULL; 51e1051a39Sopenharmony_ci if (idx < num) 52e1051a39Sopenharmony_ci return standard_methods[idx]; 53e1051a39Sopenharmony_ci idx -= num; 54e1051a39Sopenharmony_ci return sk_EVP_PKEY_ASN1_METHOD_value(app_methods, idx); 55e1051a39Sopenharmony_ci} 56e1051a39Sopenharmony_ci 57e1051a39Sopenharmony_cistatic const EVP_PKEY_ASN1_METHOD *pkey_asn1_find(int type) 58e1051a39Sopenharmony_ci{ 59e1051a39Sopenharmony_ci EVP_PKEY_ASN1_METHOD tmp; 60e1051a39Sopenharmony_ci const EVP_PKEY_ASN1_METHOD *t = &tmp, **ret; 61e1051a39Sopenharmony_ci 62e1051a39Sopenharmony_ci tmp.pkey_id = type; 63e1051a39Sopenharmony_ci if (app_methods) { 64e1051a39Sopenharmony_ci int idx; 65e1051a39Sopenharmony_ci idx = sk_EVP_PKEY_ASN1_METHOD_find(app_methods, &tmp); 66e1051a39Sopenharmony_ci if (idx >= 0) 67e1051a39Sopenharmony_ci return sk_EVP_PKEY_ASN1_METHOD_value(app_methods, idx); 68e1051a39Sopenharmony_ci } 69e1051a39Sopenharmony_ci ret = OBJ_bsearch_ameth(&t, standard_methods, OSSL_NELEM(standard_methods)); 70e1051a39Sopenharmony_ci if (ret == NULL || *ret == NULL) 71e1051a39Sopenharmony_ci return NULL; 72e1051a39Sopenharmony_ci return *ret; 73e1051a39Sopenharmony_ci} 74e1051a39Sopenharmony_ci 75e1051a39Sopenharmony_ci/* 76e1051a39Sopenharmony_ci * Find an implementation of an ASN1 algorithm. If 'pe' is not NULL also 77e1051a39Sopenharmony_ci * search through engines and set *pe to a functional reference to the engine 78e1051a39Sopenharmony_ci * implementing 'type' or NULL if no engine implements it. 79e1051a39Sopenharmony_ci */ 80e1051a39Sopenharmony_ci 81e1051a39Sopenharmony_ciconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type) 82e1051a39Sopenharmony_ci{ 83e1051a39Sopenharmony_ci const EVP_PKEY_ASN1_METHOD *t; 84e1051a39Sopenharmony_ci 85e1051a39Sopenharmony_ci for (;;) { 86e1051a39Sopenharmony_ci t = pkey_asn1_find(type); 87e1051a39Sopenharmony_ci if (!t || !(t->pkey_flags & ASN1_PKEY_ALIAS)) 88e1051a39Sopenharmony_ci break; 89e1051a39Sopenharmony_ci type = t->pkey_base_id; 90e1051a39Sopenharmony_ci } 91e1051a39Sopenharmony_ci if (pe) { 92e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_ENGINE 93e1051a39Sopenharmony_ci ENGINE *e; 94e1051a39Sopenharmony_ci /* type will contain the final unaliased type */ 95e1051a39Sopenharmony_ci e = ENGINE_get_pkey_asn1_meth_engine(type); 96e1051a39Sopenharmony_ci if (e) { 97e1051a39Sopenharmony_ci *pe = e; 98e1051a39Sopenharmony_ci return ENGINE_get_pkey_asn1_meth(e, type); 99e1051a39Sopenharmony_ci } 100e1051a39Sopenharmony_ci#endif 101e1051a39Sopenharmony_ci *pe = NULL; 102e1051a39Sopenharmony_ci } 103e1051a39Sopenharmony_ci return t; 104e1051a39Sopenharmony_ci} 105e1051a39Sopenharmony_ci 106e1051a39Sopenharmony_ciconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(ENGINE **pe, 107e1051a39Sopenharmony_ci const char *str, int len) 108e1051a39Sopenharmony_ci{ 109e1051a39Sopenharmony_ci int i; 110e1051a39Sopenharmony_ci const EVP_PKEY_ASN1_METHOD *ameth = NULL; 111e1051a39Sopenharmony_ci 112e1051a39Sopenharmony_ci if (len == -1) 113e1051a39Sopenharmony_ci len = strlen(str); 114e1051a39Sopenharmony_ci if (pe) { 115e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_ENGINE 116e1051a39Sopenharmony_ci ENGINE *e; 117e1051a39Sopenharmony_ci ameth = ENGINE_pkey_asn1_find_str(&e, str, len); 118e1051a39Sopenharmony_ci if (ameth) { 119e1051a39Sopenharmony_ci /* 120e1051a39Sopenharmony_ci * Convert structural into functional reference 121e1051a39Sopenharmony_ci */ 122e1051a39Sopenharmony_ci if (!ENGINE_init(e)) 123e1051a39Sopenharmony_ci ameth = NULL; 124e1051a39Sopenharmony_ci ENGINE_free(e); 125e1051a39Sopenharmony_ci *pe = e; 126e1051a39Sopenharmony_ci return ameth; 127e1051a39Sopenharmony_ci } 128e1051a39Sopenharmony_ci#endif 129e1051a39Sopenharmony_ci *pe = NULL; 130e1051a39Sopenharmony_ci } 131e1051a39Sopenharmony_ci for (i = EVP_PKEY_asn1_get_count(); i-- > 0; ) { 132e1051a39Sopenharmony_ci ameth = EVP_PKEY_asn1_get0(i); 133e1051a39Sopenharmony_ci if (ameth->pkey_flags & ASN1_PKEY_ALIAS) 134e1051a39Sopenharmony_ci continue; 135e1051a39Sopenharmony_ci if ((int)strlen(ameth->pem_str) == len 136e1051a39Sopenharmony_ci && OPENSSL_strncasecmp(ameth->pem_str, str, len) == 0) 137e1051a39Sopenharmony_ci return ameth; 138e1051a39Sopenharmony_ci } 139e1051a39Sopenharmony_ci return NULL; 140e1051a39Sopenharmony_ci} 141e1051a39Sopenharmony_ci 142e1051a39Sopenharmony_ciint EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth) 143e1051a39Sopenharmony_ci{ 144e1051a39Sopenharmony_ci EVP_PKEY_ASN1_METHOD tmp = { 0, }; 145e1051a39Sopenharmony_ci 146e1051a39Sopenharmony_ci /* 147e1051a39Sopenharmony_ci * One of the following must be true: 148e1051a39Sopenharmony_ci * 149e1051a39Sopenharmony_ci * pem_str == NULL AND ASN1_PKEY_ALIAS is set 150e1051a39Sopenharmony_ci * pem_str != NULL AND ASN1_PKEY_ALIAS is clear 151e1051a39Sopenharmony_ci * 152e1051a39Sopenharmony_ci * Anything else is an error and may lead to a corrupt ASN1 method table 153e1051a39Sopenharmony_ci */ 154e1051a39Sopenharmony_ci if (!((ameth->pem_str == NULL 155e1051a39Sopenharmony_ci && (ameth->pkey_flags & ASN1_PKEY_ALIAS) != 0) 156e1051a39Sopenharmony_ci || (ameth->pem_str != NULL 157e1051a39Sopenharmony_ci && (ameth->pkey_flags & ASN1_PKEY_ALIAS) == 0))) { 158e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_INVALID_ARGUMENT); 159e1051a39Sopenharmony_ci return 0; 160e1051a39Sopenharmony_ci } 161e1051a39Sopenharmony_ci 162e1051a39Sopenharmony_ci if (app_methods == NULL) { 163e1051a39Sopenharmony_ci app_methods = sk_EVP_PKEY_ASN1_METHOD_new(ameth_cmp); 164e1051a39Sopenharmony_ci if (app_methods == NULL) 165e1051a39Sopenharmony_ci return 0; 166e1051a39Sopenharmony_ci } 167e1051a39Sopenharmony_ci 168e1051a39Sopenharmony_ci tmp.pkey_id = ameth->pkey_id; 169e1051a39Sopenharmony_ci if (sk_EVP_PKEY_ASN1_METHOD_find(app_methods, &tmp) >= 0) { 170e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_EVP, 171e1051a39Sopenharmony_ci EVP_R_PKEY_APPLICATION_ASN1_METHOD_ALREADY_REGISTERED); 172e1051a39Sopenharmony_ci return 0; 173e1051a39Sopenharmony_ci } 174e1051a39Sopenharmony_ci 175e1051a39Sopenharmony_ci if (!sk_EVP_PKEY_ASN1_METHOD_push(app_methods, ameth)) 176e1051a39Sopenharmony_ci return 0; 177e1051a39Sopenharmony_ci sk_EVP_PKEY_ASN1_METHOD_sort(app_methods); 178e1051a39Sopenharmony_ci return 1; 179e1051a39Sopenharmony_ci} 180e1051a39Sopenharmony_ci 181e1051a39Sopenharmony_ciint EVP_PKEY_asn1_add_alias(int to, int from) 182e1051a39Sopenharmony_ci{ 183e1051a39Sopenharmony_ci EVP_PKEY_ASN1_METHOD *ameth; 184e1051a39Sopenharmony_ci ameth = EVP_PKEY_asn1_new(from, ASN1_PKEY_ALIAS, NULL, NULL); 185e1051a39Sopenharmony_ci if (ameth == NULL) 186e1051a39Sopenharmony_ci return 0; 187e1051a39Sopenharmony_ci ameth->pkey_base_id = to; 188e1051a39Sopenharmony_ci if (!EVP_PKEY_asn1_add0(ameth)) { 189e1051a39Sopenharmony_ci EVP_PKEY_asn1_free(ameth); 190e1051a39Sopenharmony_ci return 0; 191e1051a39Sopenharmony_ci } 192e1051a39Sopenharmony_ci return 1; 193e1051a39Sopenharmony_ci} 194e1051a39Sopenharmony_ci 195e1051a39Sopenharmony_ciint EVP_PKEY_asn1_get0_info(int *ppkey_id, int *ppkey_base_id, 196e1051a39Sopenharmony_ci int *ppkey_flags, const char **pinfo, 197e1051a39Sopenharmony_ci const char **ppem_str, 198e1051a39Sopenharmony_ci const EVP_PKEY_ASN1_METHOD *ameth) 199e1051a39Sopenharmony_ci{ 200e1051a39Sopenharmony_ci if (!ameth) 201e1051a39Sopenharmony_ci return 0; 202e1051a39Sopenharmony_ci if (ppkey_id) 203e1051a39Sopenharmony_ci *ppkey_id = ameth->pkey_id; 204e1051a39Sopenharmony_ci if (ppkey_base_id) 205e1051a39Sopenharmony_ci *ppkey_base_id = ameth->pkey_base_id; 206e1051a39Sopenharmony_ci if (ppkey_flags) 207e1051a39Sopenharmony_ci *ppkey_flags = ameth->pkey_flags; 208e1051a39Sopenharmony_ci if (pinfo) 209e1051a39Sopenharmony_ci *pinfo = ameth->info; 210e1051a39Sopenharmony_ci if (ppem_str) 211e1051a39Sopenharmony_ci *ppem_str = ameth->pem_str; 212e1051a39Sopenharmony_ci return 1; 213e1051a39Sopenharmony_ci} 214e1051a39Sopenharmony_ci 215e1051a39Sopenharmony_ciconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_get0_asn1(const EVP_PKEY *pkey) 216e1051a39Sopenharmony_ci{ 217e1051a39Sopenharmony_ci return pkey->ameth; 218e1051a39Sopenharmony_ci} 219e1051a39Sopenharmony_ci 220e1051a39Sopenharmony_ciEVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_new(int id, int flags, 221e1051a39Sopenharmony_ci const char *pem_str, const char *info) 222e1051a39Sopenharmony_ci{ 223e1051a39Sopenharmony_ci EVP_PKEY_ASN1_METHOD *ameth = OPENSSL_zalloc(sizeof(*ameth)); 224e1051a39Sopenharmony_ci 225e1051a39Sopenharmony_ci if (ameth == NULL) { 226e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_ASN1, ERR_R_MALLOC_FAILURE); 227e1051a39Sopenharmony_ci return NULL; 228e1051a39Sopenharmony_ci } 229e1051a39Sopenharmony_ci 230e1051a39Sopenharmony_ci ameth->pkey_id = id; 231e1051a39Sopenharmony_ci ameth->pkey_base_id = id; 232e1051a39Sopenharmony_ci ameth->pkey_flags = flags | ASN1_PKEY_DYNAMIC; 233e1051a39Sopenharmony_ci 234e1051a39Sopenharmony_ci if (info) { 235e1051a39Sopenharmony_ci ameth->info = OPENSSL_strdup(info); 236e1051a39Sopenharmony_ci if (ameth->info == NULL) 237e1051a39Sopenharmony_ci goto err; 238e1051a39Sopenharmony_ci } 239e1051a39Sopenharmony_ci 240e1051a39Sopenharmony_ci if (pem_str) { 241e1051a39Sopenharmony_ci ameth->pem_str = OPENSSL_strdup(pem_str); 242e1051a39Sopenharmony_ci if (ameth->pem_str == NULL) 243e1051a39Sopenharmony_ci goto err; 244e1051a39Sopenharmony_ci } 245e1051a39Sopenharmony_ci 246e1051a39Sopenharmony_ci return ameth; 247e1051a39Sopenharmony_ci 248e1051a39Sopenharmony_ci err: 249e1051a39Sopenharmony_ci EVP_PKEY_asn1_free(ameth); 250e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_ASN1, ERR_R_MALLOC_FAILURE); 251e1051a39Sopenharmony_ci return NULL; 252e1051a39Sopenharmony_ci} 253e1051a39Sopenharmony_ci 254e1051a39Sopenharmony_civoid EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, 255e1051a39Sopenharmony_ci const EVP_PKEY_ASN1_METHOD *src) 256e1051a39Sopenharmony_ci{ 257e1051a39Sopenharmony_ci int pkey_id = dst->pkey_id; 258e1051a39Sopenharmony_ci int pkey_base_id = dst->pkey_base_id; 259e1051a39Sopenharmony_ci unsigned long pkey_flags = dst->pkey_flags; 260e1051a39Sopenharmony_ci char *pem_str = dst->pem_str; 261e1051a39Sopenharmony_ci char *info = dst->info; 262e1051a39Sopenharmony_ci 263e1051a39Sopenharmony_ci *dst = *src; 264e1051a39Sopenharmony_ci 265e1051a39Sopenharmony_ci /* We only copy the function pointers so restore the other values */ 266e1051a39Sopenharmony_ci dst->pkey_id = pkey_id; 267e1051a39Sopenharmony_ci dst->pkey_base_id = pkey_base_id; 268e1051a39Sopenharmony_ci dst->pkey_flags = pkey_flags; 269e1051a39Sopenharmony_ci dst->pem_str = pem_str; 270e1051a39Sopenharmony_ci dst->info = info; 271e1051a39Sopenharmony_ci} 272e1051a39Sopenharmony_ci 273e1051a39Sopenharmony_civoid EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD *ameth) 274e1051a39Sopenharmony_ci{ 275e1051a39Sopenharmony_ci if (ameth && (ameth->pkey_flags & ASN1_PKEY_DYNAMIC)) { 276e1051a39Sopenharmony_ci OPENSSL_free(ameth->pem_str); 277e1051a39Sopenharmony_ci OPENSSL_free(ameth->info); 278e1051a39Sopenharmony_ci OPENSSL_free(ameth); 279e1051a39Sopenharmony_ci } 280e1051a39Sopenharmony_ci} 281e1051a39Sopenharmony_ci 282e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_public(EVP_PKEY_ASN1_METHOD *ameth, 283e1051a39Sopenharmony_ci int (*pub_decode) (EVP_PKEY *pk, 284e1051a39Sopenharmony_ci const X509_PUBKEY *pub), 285e1051a39Sopenharmony_ci int (*pub_encode) (X509_PUBKEY *pub, 286e1051a39Sopenharmony_ci const EVP_PKEY *pk), 287e1051a39Sopenharmony_ci int (*pub_cmp) (const EVP_PKEY *a, 288e1051a39Sopenharmony_ci const EVP_PKEY *b), 289e1051a39Sopenharmony_ci int (*pub_print) (BIO *out, 290e1051a39Sopenharmony_ci const EVP_PKEY *pkey, 291e1051a39Sopenharmony_ci int indent, ASN1_PCTX *pctx), 292e1051a39Sopenharmony_ci int (*pkey_size) (const EVP_PKEY *pk), 293e1051a39Sopenharmony_ci int (*pkey_bits) (const EVP_PKEY *pk)) 294e1051a39Sopenharmony_ci{ 295e1051a39Sopenharmony_ci ameth->pub_decode = pub_decode; 296e1051a39Sopenharmony_ci ameth->pub_encode = pub_encode; 297e1051a39Sopenharmony_ci ameth->pub_cmp = pub_cmp; 298e1051a39Sopenharmony_ci ameth->pub_print = pub_print; 299e1051a39Sopenharmony_ci ameth->pkey_size = pkey_size; 300e1051a39Sopenharmony_ci ameth->pkey_bits = pkey_bits; 301e1051a39Sopenharmony_ci} 302e1051a39Sopenharmony_ci 303e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth, 304e1051a39Sopenharmony_ci int (*priv_decode) (EVP_PKEY *pk, 305e1051a39Sopenharmony_ci const PKCS8_PRIV_KEY_INFO 306e1051a39Sopenharmony_ci *p8inf), 307e1051a39Sopenharmony_ci int (*priv_encode) (PKCS8_PRIV_KEY_INFO *p8, 308e1051a39Sopenharmony_ci const EVP_PKEY *pk), 309e1051a39Sopenharmony_ci int (*priv_print) (BIO *out, 310e1051a39Sopenharmony_ci const EVP_PKEY *pkey, 311e1051a39Sopenharmony_ci int indent, 312e1051a39Sopenharmony_ci ASN1_PCTX *pctx)) 313e1051a39Sopenharmony_ci{ 314e1051a39Sopenharmony_ci ameth->priv_decode = priv_decode; 315e1051a39Sopenharmony_ci ameth->priv_encode = priv_encode; 316e1051a39Sopenharmony_ci ameth->priv_print = priv_print; 317e1051a39Sopenharmony_ci} 318e1051a39Sopenharmony_ci 319e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth, 320e1051a39Sopenharmony_ci int (*param_decode) (EVP_PKEY *pkey, 321e1051a39Sopenharmony_ci const unsigned char **pder, 322e1051a39Sopenharmony_ci int derlen), 323e1051a39Sopenharmony_ci int (*param_encode) (const EVP_PKEY *pkey, 324e1051a39Sopenharmony_ci unsigned char **pder), 325e1051a39Sopenharmony_ci int (*param_missing) (const EVP_PKEY *pk), 326e1051a39Sopenharmony_ci int (*param_copy) (EVP_PKEY *to, 327e1051a39Sopenharmony_ci const EVP_PKEY *from), 328e1051a39Sopenharmony_ci int (*param_cmp) (const EVP_PKEY *a, 329e1051a39Sopenharmony_ci const EVP_PKEY *b), 330e1051a39Sopenharmony_ci int (*param_print) (BIO *out, 331e1051a39Sopenharmony_ci const EVP_PKEY *pkey, 332e1051a39Sopenharmony_ci int indent, ASN1_PCTX *pctx)) 333e1051a39Sopenharmony_ci{ 334e1051a39Sopenharmony_ci ameth->param_decode = param_decode; 335e1051a39Sopenharmony_ci ameth->param_encode = param_encode; 336e1051a39Sopenharmony_ci ameth->param_missing = param_missing; 337e1051a39Sopenharmony_ci ameth->param_copy = param_copy; 338e1051a39Sopenharmony_ci ameth->param_cmp = param_cmp; 339e1051a39Sopenharmony_ci ameth->param_print = param_print; 340e1051a39Sopenharmony_ci} 341e1051a39Sopenharmony_ci 342e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth, 343e1051a39Sopenharmony_ci void (*pkey_free) (EVP_PKEY *pkey)) 344e1051a39Sopenharmony_ci{ 345e1051a39Sopenharmony_ci ameth->pkey_free = pkey_free; 346e1051a39Sopenharmony_ci} 347e1051a39Sopenharmony_ci 348e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth, 349e1051a39Sopenharmony_ci int (*pkey_ctrl) (EVP_PKEY *pkey, int op, 350e1051a39Sopenharmony_ci long arg1, void *arg2)) 351e1051a39Sopenharmony_ci{ 352e1051a39Sopenharmony_ci ameth->pkey_ctrl = pkey_ctrl; 353e1051a39Sopenharmony_ci} 354e1051a39Sopenharmony_ci 355e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_security_bits(EVP_PKEY_ASN1_METHOD *ameth, 356e1051a39Sopenharmony_ci int (*pkey_security_bits) (const EVP_PKEY 357e1051a39Sopenharmony_ci *pk)) 358e1051a39Sopenharmony_ci{ 359e1051a39Sopenharmony_ci ameth->pkey_security_bits = pkey_security_bits; 360e1051a39Sopenharmony_ci} 361e1051a39Sopenharmony_ci 362e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_item(EVP_PKEY_ASN1_METHOD *ameth, 363e1051a39Sopenharmony_ci int (*item_verify) (EVP_MD_CTX *ctx, 364e1051a39Sopenharmony_ci const ASN1_ITEM *it, 365e1051a39Sopenharmony_ci const void *data, 366e1051a39Sopenharmony_ci const X509_ALGOR *a, 367e1051a39Sopenharmony_ci const ASN1_BIT_STRING *sig, 368e1051a39Sopenharmony_ci EVP_PKEY *pkey), 369e1051a39Sopenharmony_ci int (*item_sign) (EVP_MD_CTX *ctx, 370e1051a39Sopenharmony_ci const ASN1_ITEM *it, 371e1051a39Sopenharmony_ci const void *data, 372e1051a39Sopenharmony_ci X509_ALGOR *alg1, 373e1051a39Sopenharmony_ci X509_ALGOR *alg2, 374e1051a39Sopenharmony_ci ASN1_BIT_STRING *sig)) 375e1051a39Sopenharmony_ci{ 376e1051a39Sopenharmony_ci ameth->item_sign = item_sign; 377e1051a39Sopenharmony_ci ameth->item_verify = item_verify; 378e1051a39Sopenharmony_ci} 379e1051a39Sopenharmony_ci 380e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_siginf(EVP_PKEY_ASN1_METHOD *ameth, 381e1051a39Sopenharmony_ci int (*siginf_set) (X509_SIG_INFO *siginf, 382e1051a39Sopenharmony_ci const X509_ALGOR *alg, 383e1051a39Sopenharmony_ci const ASN1_STRING *sig)) 384e1051a39Sopenharmony_ci{ 385e1051a39Sopenharmony_ci ameth->siginf_set = siginf_set; 386e1051a39Sopenharmony_ci} 387e1051a39Sopenharmony_ci 388e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_check(EVP_PKEY_ASN1_METHOD *ameth, 389e1051a39Sopenharmony_ci int (*pkey_check) (const EVP_PKEY *pk)) 390e1051a39Sopenharmony_ci{ 391e1051a39Sopenharmony_ci ameth->pkey_check = pkey_check; 392e1051a39Sopenharmony_ci} 393e1051a39Sopenharmony_ci 394e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_public_check(EVP_PKEY_ASN1_METHOD *ameth, 395e1051a39Sopenharmony_ci int (*pkey_pub_check) (const EVP_PKEY *pk)) 396e1051a39Sopenharmony_ci{ 397e1051a39Sopenharmony_ci ameth->pkey_public_check = pkey_pub_check; 398e1051a39Sopenharmony_ci} 399e1051a39Sopenharmony_ci 400e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_param_check(EVP_PKEY_ASN1_METHOD *ameth, 401e1051a39Sopenharmony_ci int (*pkey_param_check) (const EVP_PKEY *pk)) 402e1051a39Sopenharmony_ci{ 403e1051a39Sopenharmony_ci ameth->pkey_param_check = pkey_param_check; 404e1051a39Sopenharmony_ci} 405e1051a39Sopenharmony_ci 406e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_set_priv_key(EVP_PKEY_ASN1_METHOD *ameth, 407e1051a39Sopenharmony_ci int (*set_priv_key) (EVP_PKEY *pk, 408e1051a39Sopenharmony_ci const unsigned char 409e1051a39Sopenharmony_ci *priv, 410e1051a39Sopenharmony_ci size_t len)) 411e1051a39Sopenharmony_ci{ 412e1051a39Sopenharmony_ci ameth->set_priv_key = set_priv_key; 413e1051a39Sopenharmony_ci} 414e1051a39Sopenharmony_ci 415e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_set_pub_key(EVP_PKEY_ASN1_METHOD *ameth, 416e1051a39Sopenharmony_ci int (*set_pub_key) (EVP_PKEY *pk, 417e1051a39Sopenharmony_ci const unsigned char *pub, 418e1051a39Sopenharmony_ci size_t len)) 419e1051a39Sopenharmony_ci{ 420e1051a39Sopenharmony_ci ameth->set_pub_key = set_pub_key; 421e1051a39Sopenharmony_ci} 422e1051a39Sopenharmony_ci 423e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_get_priv_key(EVP_PKEY_ASN1_METHOD *ameth, 424e1051a39Sopenharmony_ci int (*get_priv_key) (const EVP_PKEY *pk, 425e1051a39Sopenharmony_ci unsigned char *priv, 426e1051a39Sopenharmony_ci size_t *len)) 427e1051a39Sopenharmony_ci{ 428e1051a39Sopenharmony_ci ameth->get_priv_key = get_priv_key; 429e1051a39Sopenharmony_ci} 430e1051a39Sopenharmony_ci 431e1051a39Sopenharmony_civoid EVP_PKEY_asn1_set_get_pub_key(EVP_PKEY_ASN1_METHOD *ameth, 432e1051a39Sopenharmony_ci int (*get_pub_key) (const EVP_PKEY *pk, 433e1051a39Sopenharmony_ci unsigned char *pub, 434e1051a39Sopenharmony_ci size_t *len)) 435e1051a39Sopenharmony_ci{ 436e1051a39Sopenharmony_ci ameth->get_pub_key = get_pub_key; 437e1051a39Sopenharmony_ci} 438