1296341Sdelphij/* 2296341Sdelphij * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project 3296341Sdelphij * 2006. 4238384Sjkim */ 5238384Sjkim/* ==================================================================== 6238384Sjkim * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 7238384Sjkim * 8238384Sjkim * Redistribution and use in source and binary forms, with or without 9238384Sjkim * modification, are permitted provided that the following conditions 10238384Sjkim * are met: 11238384Sjkim * 12238384Sjkim * 1. Redistributions of source code must retain the above copyright 13296341Sdelphij * notice, this list of conditions and the following disclaimer. 14238384Sjkim * 15238384Sjkim * 2. Redistributions in binary form must reproduce the above copyright 16238384Sjkim * notice, this list of conditions and the following disclaimer in 17238384Sjkim * the documentation and/or other materials provided with the 18238384Sjkim * distribution. 19238384Sjkim * 20238384Sjkim * 3. All advertising materials mentioning features or use of this 21238384Sjkim * software must display the following acknowledgment: 22238384Sjkim * "This product includes software developed by the OpenSSL Project 23238384Sjkim * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24238384Sjkim * 25238384Sjkim * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26238384Sjkim * endorse or promote products derived from this software without 27238384Sjkim * prior written permission. For written permission, please contact 28238384Sjkim * licensing@OpenSSL.org. 29238384Sjkim * 30238384Sjkim * 5. Products derived from this software may not be called "OpenSSL" 31238384Sjkim * nor may "OpenSSL" appear in their names without prior written 32238384Sjkim * permission of the OpenSSL Project. 33238384Sjkim * 34238384Sjkim * 6. Redistributions of any form whatsoever must retain the following 35238384Sjkim * acknowledgment: 36238384Sjkim * "This product includes software developed by the OpenSSL Project 37238384Sjkim * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38238384Sjkim * 39238384Sjkim * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40238384Sjkim * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41238384Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42238384Sjkim * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43238384Sjkim * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44238384Sjkim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45238384Sjkim * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46238384Sjkim * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47238384Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48238384Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49238384Sjkim * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50238384Sjkim * OF THE POSSIBILITY OF SUCH DAMAGE. 51238384Sjkim * ==================================================================== 52238384Sjkim * 53238384Sjkim * This product includes cryptographic software written by Eric Young 54238384Sjkim * (eay@cryptsoft.com). This product includes software written by Tim 55238384Sjkim * Hudson (tjh@cryptsoft.com). 56238384Sjkim * 57238384Sjkim */ 58238384Sjkim 59238384Sjkim#include <stdio.h> 60238384Sjkim#include "cryptlib.h" 61238384Sjkim#include <openssl/asn1t.h> 62238384Sjkim#include <openssl/x509.h> 63238384Sjkim#ifndef OPENSSL_NO_ENGINE 64296341Sdelphij# include <openssl/engine.h> 65238384Sjkim#endif 66238384Sjkim#include "asn1_locl.h" 67238384Sjkim 68238384Sjkimextern const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[]; 69238384Sjkimextern const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[]; 70238384Sjkimextern const EVP_PKEY_ASN1_METHOD dh_asn1_meth; 71238384Sjkimextern const EVP_PKEY_ASN1_METHOD eckey_asn1_meth; 72238384Sjkimextern const EVP_PKEY_ASN1_METHOD hmac_asn1_meth; 73238384Sjkimextern const EVP_PKEY_ASN1_METHOD cmac_asn1_meth; 74238384Sjkim 75238384Sjkim/* Keep this sorted in type order !! */ 76296341Sdelphijstatic const EVP_PKEY_ASN1_METHOD *standard_methods[] = { 77238384Sjkim#ifndef OPENSSL_NO_RSA 78296341Sdelphij &rsa_asn1_meths[0], 79296341Sdelphij &rsa_asn1_meths[1], 80238384Sjkim#endif 81238384Sjkim#ifndef OPENSSL_NO_DH 82296341Sdelphij &dh_asn1_meth, 83238384Sjkim#endif 84238384Sjkim#ifndef OPENSSL_NO_DSA 85296341Sdelphij &dsa_asn1_meths[0], 86296341Sdelphij &dsa_asn1_meths[1], 87296341Sdelphij &dsa_asn1_meths[2], 88296341Sdelphij &dsa_asn1_meths[3], 89296341Sdelphij &dsa_asn1_meths[4], 90238384Sjkim#endif 91238384Sjkim#ifndef OPENSSL_NO_EC 92296341Sdelphij &eckey_asn1_meth, 93238384Sjkim#endif 94296341Sdelphij &hmac_asn1_meth, 95296341Sdelphij &cmac_asn1_meth 96296341Sdelphij}; 97238384Sjkim 98296341Sdelphijtypedef int sk_cmp_fn_type(const char *const *a, const char *const *b); 99238384SjkimDECLARE_STACK_OF(EVP_PKEY_ASN1_METHOD) 100238384Sjkimstatic STACK_OF(EVP_PKEY_ASN1_METHOD) *app_methods = NULL; 101238384Sjkim 102238384Sjkim#ifdef TEST 103238384Sjkimvoid main() 104296341Sdelphij{ 105296341Sdelphij int i; 106296341Sdelphij for (i = 0; 107296341Sdelphij i < sizeof(standard_methods) / sizeof(EVP_PKEY_ASN1_METHOD *); i++) 108296341Sdelphij fprintf(stderr, "Number %d id=%d (%s)\n", i, 109296341Sdelphij standard_methods[i]->pkey_id, 110296341Sdelphij OBJ_nid2sn(standard_methods[i]->pkey_id)); 111296341Sdelphij} 112238384Sjkim#endif 113238384Sjkim 114238384SjkimDECLARE_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_ASN1_METHOD *, 115296341Sdelphij const EVP_PKEY_ASN1_METHOD *, ameth); 116238384Sjkim 117296341Sdelphijstatic int ameth_cmp(const EVP_PKEY_ASN1_METHOD *const *a, 118296341Sdelphij const EVP_PKEY_ASN1_METHOD *const *b) 119296341Sdelphij{ 120296341Sdelphij return ((*a)->pkey_id - (*b)->pkey_id); 121296341Sdelphij} 122238384Sjkim 123238384SjkimIMPLEMENT_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_ASN1_METHOD *, 124296341Sdelphij const EVP_PKEY_ASN1_METHOD *, ameth); 125238384Sjkim 126238384Sjkimint EVP_PKEY_asn1_get_count(void) 127296341Sdelphij{ 128296341Sdelphij int num = sizeof(standard_methods) / sizeof(EVP_PKEY_ASN1_METHOD *); 129296341Sdelphij if (app_methods) 130296341Sdelphij num += sk_EVP_PKEY_ASN1_METHOD_num(app_methods); 131296341Sdelphij return num; 132296341Sdelphij} 133238384Sjkim 134238384Sjkimconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx) 135296341Sdelphij{ 136296341Sdelphij int num = sizeof(standard_methods) / sizeof(EVP_PKEY_ASN1_METHOD *); 137296341Sdelphij if (idx < 0) 138296341Sdelphij return NULL; 139296341Sdelphij if (idx < num) 140296341Sdelphij return standard_methods[idx]; 141296341Sdelphij idx -= num; 142296341Sdelphij return sk_EVP_PKEY_ASN1_METHOD_value(app_methods, idx); 143296341Sdelphij} 144238384Sjkim 145238384Sjkimstatic const EVP_PKEY_ASN1_METHOD *pkey_asn1_find(int type) 146296341Sdelphij{ 147296341Sdelphij EVP_PKEY_ASN1_METHOD tmp; 148296341Sdelphij const EVP_PKEY_ASN1_METHOD *t = &tmp, **ret; 149296341Sdelphij tmp.pkey_id = type; 150296341Sdelphij if (app_methods) { 151296341Sdelphij int idx; 152296341Sdelphij idx = sk_EVP_PKEY_ASN1_METHOD_find(app_methods, &tmp); 153296341Sdelphij if (idx >= 0) 154296341Sdelphij return sk_EVP_PKEY_ASN1_METHOD_value(app_methods, idx); 155296341Sdelphij } 156296341Sdelphij ret = OBJ_bsearch_ameth(&t, standard_methods, sizeof(standard_methods) 157296341Sdelphij / sizeof(EVP_PKEY_ASN1_METHOD *)); 158296341Sdelphij if (!ret || !*ret) 159296341Sdelphij return NULL; 160296341Sdelphij return *ret; 161296341Sdelphij} 162238384Sjkim 163296341Sdelphij/* 164296341Sdelphij * Find an implementation of an ASN1 algorithm. If 'pe' is not NULL also 165296341Sdelphij * search through engines and set *pe to a functional reference to the engine 166296341Sdelphij * implementing 'type' or NULL if no engine implements it. 167238384Sjkim */ 168238384Sjkim 169238384Sjkimconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type) 170296341Sdelphij{ 171296341Sdelphij const EVP_PKEY_ASN1_METHOD *t; 172238384Sjkim 173296341Sdelphij for (;;) { 174296341Sdelphij t = pkey_asn1_find(type); 175296341Sdelphij if (!t || !(t->pkey_flags & ASN1_PKEY_ALIAS)) 176296341Sdelphij break; 177296341Sdelphij type = t->pkey_base_id; 178296341Sdelphij } 179296341Sdelphij if (pe) { 180238384Sjkim#ifndef OPENSSL_NO_ENGINE 181296341Sdelphij ENGINE *e; 182296341Sdelphij /* type will contain the final unaliased type */ 183296341Sdelphij e = ENGINE_get_pkey_asn1_meth_engine(type); 184296341Sdelphij if (e) { 185296341Sdelphij *pe = e; 186296341Sdelphij return ENGINE_get_pkey_asn1_meth(e, type); 187296341Sdelphij } 188238384Sjkim#endif 189296341Sdelphij *pe = NULL; 190296341Sdelphij } 191296341Sdelphij return t; 192296341Sdelphij} 193238384Sjkim 194238384Sjkimconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(ENGINE **pe, 195296341Sdelphij const char *str, int len) 196296341Sdelphij{ 197296341Sdelphij int i; 198296341Sdelphij const EVP_PKEY_ASN1_METHOD *ameth; 199296341Sdelphij if (len == -1) 200296341Sdelphij len = strlen(str); 201296341Sdelphij if (pe) { 202238384Sjkim#ifndef OPENSSL_NO_ENGINE 203296341Sdelphij ENGINE *e; 204296341Sdelphij ameth = ENGINE_pkey_asn1_find_str(&e, str, len); 205296341Sdelphij if (ameth) { 206296341Sdelphij /* 207296341Sdelphij * Convert structural into functional reference 208296341Sdelphij */ 209296341Sdelphij if (!ENGINE_init(e)) 210296341Sdelphij ameth = NULL; 211296341Sdelphij ENGINE_free(e); 212296341Sdelphij *pe = e; 213296341Sdelphij return ameth; 214296341Sdelphij } 215238384Sjkim#endif 216296341Sdelphij *pe = NULL; 217296341Sdelphij } 218296341Sdelphij for (i = 0; i < EVP_PKEY_asn1_get_count(); i++) { 219296341Sdelphij ameth = EVP_PKEY_asn1_get0(i); 220296341Sdelphij if (ameth->pkey_flags & ASN1_PKEY_ALIAS) 221296341Sdelphij continue; 222296341Sdelphij if (((int)strlen(ameth->pem_str) == len) && 223296341Sdelphij !strncasecmp(ameth->pem_str, str, len)) 224296341Sdelphij return ameth; 225296341Sdelphij } 226296341Sdelphij return NULL; 227296341Sdelphij} 228238384Sjkim 229238384Sjkimint EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth) 230296341Sdelphij{ 231296341Sdelphij if (app_methods == NULL) { 232296341Sdelphij app_methods = sk_EVP_PKEY_ASN1_METHOD_new(ameth_cmp); 233296341Sdelphij if (!app_methods) 234296341Sdelphij return 0; 235296341Sdelphij } 236296341Sdelphij if (!sk_EVP_PKEY_ASN1_METHOD_push(app_methods, ameth)) 237296341Sdelphij return 0; 238296341Sdelphij sk_EVP_PKEY_ASN1_METHOD_sort(app_methods); 239296341Sdelphij return 1; 240296341Sdelphij} 241238384Sjkim 242238384Sjkimint EVP_PKEY_asn1_add_alias(int to, int from) 243296341Sdelphij{ 244296341Sdelphij EVP_PKEY_ASN1_METHOD *ameth; 245296341Sdelphij ameth = EVP_PKEY_asn1_new(from, ASN1_PKEY_ALIAS, NULL, NULL); 246296341Sdelphij if (!ameth) 247296341Sdelphij return 0; 248296341Sdelphij ameth->pkey_base_id = to; 249296341Sdelphij if (!EVP_PKEY_asn1_add0(ameth)) { 250296341Sdelphij EVP_PKEY_asn1_free(ameth); 251296341Sdelphij return 0; 252296341Sdelphij } 253296341Sdelphij return 1; 254296341Sdelphij} 255238384Sjkim 256296341Sdelphijint EVP_PKEY_asn1_get0_info(int *ppkey_id, int *ppkey_base_id, 257296341Sdelphij int *ppkey_flags, const char **pinfo, 258296341Sdelphij const char **ppem_str, 259296341Sdelphij const EVP_PKEY_ASN1_METHOD *ameth) 260296341Sdelphij{ 261296341Sdelphij if (!ameth) 262296341Sdelphij return 0; 263296341Sdelphij if (ppkey_id) 264296341Sdelphij *ppkey_id = ameth->pkey_id; 265296341Sdelphij if (ppkey_base_id) 266296341Sdelphij *ppkey_base_id = ameth->pkey_base_id; 267296341Sdelphij if (ppkey_flags) 268296341Sdelphij *ppkey_flags = ameth->pkey_flags; 269296341Sdelphij if (pinfo) 270296341Sdelphij *pinfo = ameth->info; 271296341Sdelphij if (ppem_str) 272296341Sdelphij *ppem_str = ameth->pem_str; 273296341Sdelphij return 1; 274296341Sdelphij} 275238384Sjkim 276296341Sdelphijconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_get0_asn1(EVP_PKEY *pkey) 277296341Sdelphij{ 278296341Sdelphij return pkey->ameth; 279296341Sdelphij} 280238384Sjkim 281296341SdelphijEVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_new(int id, int flags, 282296341Sdelphij const char *pem_str, const char *info) 283296341Sdelphij{ 284296341Sdelphij EVP_PKEY_ASN1_METHOD *ameth; 285296341Sdelphij ameth = OPENSSL_malloc(sizeof(EVP_PKEY_ASN1_METHOD)); 286296341Sdelphij if (!ameth) 287296341Sdelphij return NULL; 288238384Sjkim 289296341Sdelphij memset(ameth, 0, sizeof(EVP_PKEY_ASN1_METHOD)); 290238384Sjkim 291296341Sdelphij ameth->pkey_id = id; 292296341Sdelphij ameth->pkey_base_id = id; 293296341Sdelphij ameth->pkey_flags = flags | ASN1_PKEY_DYNAMIC; 294238384Sjkim 295296341Sdelphij if (info) { 296296341Sdelphij ameth->info = BUF_strdup(info); 297296341Sdelphij if (!ameth->info) 298296341Sdelphij goto err; 299296341Sdelphij } else 300296341Sdelphij ameth->info = NULL; 301238384Sjkim 302296341Sdelphij if (pem_str) { 303296341Sdelphij ameth->pem_str = BUF_strdup(pem_str); 304296341Sdelphij if (!ameth->pem_str) 305296341Sdelphij goto err; 306296341Sdelphij } else 307296341Sdelphij ameth->pem_str = NULL; 308238384Sjkim 309296341Sdelphij ameth->pub_decode = 0; 310296341Sdelphij ameth->pub_encode = 0; 311296341Sdelphij ameth->pub_cmp = 0; 312296341Sdelphij ameth->pub_print = 0; 313238384Sjkim 314296341Sdelphij ameth->priv_decode = 0; 315296341Sdelphij ameth->priv_encode = 0; 316296341Sdelphij ameth->priv_print = 0; 317238384Sjkim 318296341Sdelphij ameth->old_priv_encode = 0; 319296341Sdelphij ameth->old_priv_decode = 0; 320238384Sjkim 321296341Sdelphij ameth->item_verify = 0; 322296341Sdelphij ameth->item_sign = 0; 323238384Sjkim 324296341Sdelphij ameth->pkey_size = 0; 325296341Sdelphij ameth->pkey_bits = 0; 326238384Sjkim 327296341Sdelphij ameth->param_decode = 0; 328296341Sdelphij ameth->param_encode = 0; 329296341Sdelphij ameth->param_missing = 0; 330296341Sdelphij ameth->param_copy = 0; 331296341Sdelphij ameth->param_cmp = 0; 332296341Sdelphij ameth->param_print = 0; 333238384Sjkim 334296341Sdelphij ameth->pkey_free = 0; 335296341Sdelphij ameth->pkey_ctrl = 0; 336238384Sjkim 337296341Sdelphij return ameth; 338238384Sjkim 339296341Sdelphij err: 340238384Sjkim 341296341Sdelphij EVP_PKEY_asn1_free(ameth); 342296341Sdelphij return NULL; 343238384Sjkim 344296341Sdelphij} 345238384Sjkim 346296341Sdelphijvoid EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, 347296341Sdelphij const EVP_PKEY_ASN1_METHOD *src) 348296341Sdelphij{ 349238384Sjkim 350296341Sdelphij dst->pub_decode = src->pub_decode; 351296341Sdelphij dst->pub_encode = src->pub_encode; 352296341Sdelphij dst->pub_cmp = src->pub_cmp; 353296341Sdelphij dst->pub_print = src->pub_print; 354238384Sjkim 355296341Sdelphij dst->priv_decode = src->priv_decode; 356296341Sdelphij dst->priv_encode = src->priv_encode; 357296341Sdelphij dst->priv_print = src->priv_print; 358238384Sjkim 359296341Sdelphij dst->old_priv_encode = src->old_priv_encode; 360296341Sdelphij dst->old_priv_decode = src->old_priv_decode; 361238384Sjkim 362296341Sdelphij dst->pkey_size = src->pkey_size; 363296341Sdelphij dst->pkey_bits = src->pkey_bits; 364238384Sjkim 365296341Sdelphij dst->param_decode = src->param_decode; 366296341Sdelphij dst->param_encode = src->param_encode; 367296341Sdelphij dst->param_missing = src->param_missing; 368296341Sdelphij dst->param_copy = src->param_copy; 369296341Sdelphij dst->param_cmp = src->param_cmp; 370296341Sdelphij dst->param_print = src->param_print; 371238384Sjkim 372296341Sdelphij dst->pkey_free = src->pkey_free; 373296341Sdelphij dst->pkey_ctrl = src->pkey_ctrl; 374238384Sjkim 375296341Sdelphij dst->item_sign = src->item_sign; 376296341Sdelphij dst->item_verify = src->item_verify; 377238384Sjkim 378296341Sdelphij} 379238384Sjkim 380238384Sjkimvoid EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD *ameth) 381296341Sdelphij{ 382296341Sdelphij if (ameth && (ameth->pkey_flags & ASN1_PKEY_DYNAMIC)) { 383296341Sdelphij if (ameth->pem_str) 384296341Sdelphij OPENSSL_free(ameth->pem_str); 385296341Sdelphij if (ameth->info) 386296341Sdelphij OPENSSL_free(ameth->info); 387296341Sdelphij OPENSSL_free(ameth); 388296341Sdelphij } 389296341Sdelphij} 390238384Sjkim 391238384Sjkimvoid EVP_PKEY_asn1_set_public(EVP_PKEY_ASN1_METHOD *ameth, 392296341Sdelphij int (*pub_decode) (EVP_PKEY *pk, 393296341Sdelphij X509_PUBKEY *pub), 394296341Sdelphij int (*pub_encode) (X509_PUBKEY *pub, 395296341Sdelphij const EVP_PKEY *pk), 396296341Sdelphij int (*pub_cmp) (const EVP_PKEY *a, 397296341Sdelphij const EVP_PKEY *b), 398296341Sdelphij int (*pub_print) (BIO *out, 399296341Sdelphij const EVP_PKEY *pkey, 400296341Sdelphij int indent, ASN1_PCTX *pctx), 401296341Sdelphij int (*pkey_size) (const EVP_PKEY *pk), 402296341Sdelphij int (*pkey_bits) (const EVP_PKEY *pk)) 403296341Sdelphij{ 404296341Sdelphij ameth->pub_decode = pub_decode; 405296341Sdelphij ameth->pub_encode = pub_encode; 406296341Sdelphij ameth->pub_cmp = pub_cmp; 407296341Sdelphij ameth->pub_print = pub_print; 408296341Sdelphij ameth->pkey_size = pkey_size; 409296341Sdelphij ameth->pkey_bits = pkey_bits; 410296341Sdelphij} 411238384Sjkim 412238384Sjkimvoid EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth, 413296341Sdelphij int (*priv_decode) (EVP_PKEY *pk, 414296341Sdelphij PKCS8_PRIV_KEY_INFO 415296341Sdelphij *p8inf), 416296341Sdelphij int (*priv_encode) (PKCS8_PRIV_KEY_INFO *p8, 417296341Sdelphij const EVP_PKEY *pk), 418296341Sdelphij int (*priv_print) (BIO *out, 419296341Sdelphij const EVP_PKEY *pkey, 420296341Sdelphij int indent, 421296341Sdelphij ASN1_PCTX *pctx)) 422296341Sdelphij{ 423296341Sdelphij ameth->priv_decode = priv_decode; 424296341Sdelphij ameth->priv_encode = priv_encode; 425296341Sdelphij ameth->priv_print = priv_print; 426296341Sdelphij} 427238384Sjkim 428238384Sjkimvoid EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth, 429296341Sdelphij int (*param_decode) (EVP_PKEY *pkey, 430296341Sdelphij const unsigned char **pder, 431296341Sdelphij int derlen), 432296341Sdelphij int (*param_encode) (const EVP_PKEY *pkey, 433296341Sdelphij unsigned char **pder), 434296341Sdelphij int (*param_missing) (const EVP_PKEY *pk), 435296341Sdelphij int (*param_copy) (EVP_PKEY *to, 436296341Sdelphij const EVP_PKEY *from), 437296341Sdelphij int (*param_cmp) (const EVP_PKEY *a, 438296341Sdelphij const EVP_PKEY *b), 439296341Sdelphij int (*param_print) (BIO *out, 440296341Sdelphij const EVP_PKEY *pkey, 441296341Sdelphij int indent, ASN1_PCTX *pctx)) 442296341Sdelphij{ 443296341Sdelphij ameth->param_decode = param_decode; 444296341Sdelphij ameth->param_encode = param_encode; 445296341Sdelphij ameth->param_missing = param_missing; 446296341Sdelphij ameth->param_copy = param_copy; 447296341Sdelphij ameth->param_cmp = param_cmp; 448296341Sdelphij ameth->param_print = param_print; 449296341Sdelphij} 450238384Sjkim 451238384Sjkimvoid EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth, 452296341Sdelphij void (*pkey_free) (EVP_PKEY *pkey)) 453296341Sdelphij{ 454296341Sdelphij ameth->pkey_free = pkey_free; 455296341Sdelphij} 456238384Sjkim 457238384Sjkimvoid EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth, 458296341Sdelphij int (*pkey_ctrl) (EVP_PKEY *pkey, int op, 459296341Sdelphij long arg1, void *arg2)) 460296341Sdelphij{ 461296341Sdelphij ameth->pkey_ctrl = pkey_ctrl; 462296341Sdelphij} 463