1238384Sjkim/* pmeth_lib.c */ 2280297Sjkim/* 3280297Sjkim * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project 4280297Sjkim * 2006. 5238384Sjkim */ 6238384Sjkim/* ==================================================================== 7238384Sjkim * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 8238384Sjkim * 9238384Sjkim * Redistribution and use in source and binary forms, with or without 10238384Sjkim * modification, are permitted provided that the following conditions 11238384Sjkim * are met: 12238384Sjkim * 13238384Sjkim * 1. Redistributions of source code must retain the above copyright 14280297Sjkim * notice, this list of conditions and the following disclaimer. 15238384Sjkim * 16238384Sjkim * 2. Redistributions in binary form must reproduce the above copyright 17238384Sjkim * notice, this list of conditions and the following disclaimer in 18238384Sjkim * the documentation and/or other materials provided with the 19238384Sjkim * distribution. 20238384Sjkim * 21238384Sjkim * 3. All advertising materials mentioning features or use of this 22238384Sjkim * software must display the following acknowledgment: 23238384Sjkim * "This product includes software developed by the OpenSSL Project 24238384Sjkim * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 25238384Sjkim * 26238384Sjkim * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 27238384Sjkim * endorse or promote products derived from this software without 28238384Sjkim * prior written permission. For written permission, please contact 29238384Sjkim * licensing@OpenSSL.org. 30238384Sjkim * 31238384Sjkim * 5. Products derived from this software may not be called "OpenSSL" 32238384Sjkim * nor may "OpenSSL" appear in their names without prior written 33238384Sjkim * permission of the OpenSSL Project. 34238384Sjkim * 35238384Sjkim * 6. Redistributions of any form whatsoever must retain the following 36238384Sjkim * acknowledgment: 37238384Sjkim * "This product includes software developed by the OpenSSL Project 38238384Sjkim * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 39238384Sjkim * 40238384Sjkim * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 41238384Sjkim * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42238384Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 43238384Sjkim * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 44238384Sjkim * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45238384Sjkim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46238384Sjkim * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 47238384Sjkim * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48238384Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 49238384Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 50238384Sjkim * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 51238384Sjkim * OF THE POSSIBILITY OF SUCH DAMAGE. 52238384Sjkim * ==================================================================== 53238384Sjkim * 54238384Sjkim * This product includes cryptographic software written by Eric Young 55238384Sjkim * (eay@cryptsoft.com). This product includes software written by Tim 56238384Sjkim * Hudson (tjh@cryptsoft.com). 57238384Sjkim * 58238384Sjkim */ 59238384Sjkim 60238384Sjkim#include <stdio.h> 61238384Sjkim#include <stdlib.h> 62238384Sjkim#include "cryptlib.h" 63238384Sjkim#include <openssl/objects.h> 64238384Sjkim#include <openssl/evp.h> 65238384Sjkim#ifndef OPENSSL_NO_ENGINE 66280297Sjkim# include <openssl/engine.h> 67238384Sjkim#endif 68238384Sjkim#include "asn1_locl.h" 69238384Sjkim#include "evp_locl.h" 70238384Sjkim 71280297Sjkimtypedef int sk_cmp_fn_type(const char *const *a, const char *const *b); 72238384Sjkim 73238384SjkimDECLARE_STACK_OF(EVP_PKEY_METHOD) 74238384SjkimSTACK_OF(EVP_PKEY_METHOD) *app_pkey_methods = NULL; 75238384Sjkim 76238384Sjkimextern const EVP_PKEY_METHOD rsa_pkey_meth, dh_pkey_meth, dsa_pkey_meth; 77238384Sjkimextern const EVP_PKEY_METHOD ec_pkey_meth, hmac_pkey_meth, cmac_pkey_meth; 78290207Sjkimextern const EVP_PKEY_METHOD dhx_pkey_meth; 79238384Sjkim 80280297Sjkimstatic const EVP_PKEY_METHOD *standard_methods[] = { 81238384Sjkim#ifndef OPENSSL_NO_RSA 82280297Sjkim &rsa_pkey_meth, 83238384Sjkim#endif 84238384Sjkim#ifndef OPENSSL_NO_DH 85280297Sjkim &dh_pkey_meth, 86238384Sjkim#endif 87238384Sjkim#ifndef OPENSSL_NO_DSA 88280297Sjkim &dsa_pkey_meth, 89238384Sjkim#endif 90238384Sjkim#ifndef OPENSSL_NO_EC 91280297Sjkim &ec_pkey_meth, 92238384Sjkim#endif 93280297Sjkim &hmac_pkey_meth, 94306198Sjkim#ifndef OPENSSL_NO_CMAC 95290207Sjkim &cmac_pkey_meth, 96306198Sjkim#endif 97290207Sjkim#ifndef OPENSSL_NO_DH 98290207Sjkim &dhx_pkey_meth 99290207Sjkim#endif 100280297Sjkim}; 101238384Sjkim 102238384SjkimDECLARE_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_METHOD *, const EVP_PKEY_METHOD *, 103280297Sjkim pmeth); 104238384Sjkim 105280297Sjkimstatic int pmeth_cmp(const EVP_PKEY_METHOD *const *a, 106280297Sjkim const EVP_PKEY_METHOD *const *b) 107280297Sjkim{ 108280297Sjkim return ((*a)->pkey_id - (*b)->pkey_id); 109280297Sjkim} 110238384Sjkim 111238384SjkimIMPLEMENT_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_METHOD *, const EVP_PKEY_METHOD *, 112280297Sjkim pmeth); 113238384Sjkim 114238384Sjkimconst EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type) 115280297Sjkim{ 116280297Sjkim EVP_PKEY_METHOD tmp; 117280297Sjkim const EVP_PKEY_METHOD *t = &tmp, **ret; 118280297Sjkim tmp.pkey_id = type; 119280297Sjkim if (app_pkey_methods) { 120280297Sjkim int idx; 121280297Sjkim idx = sk_EVP_PKEY_METHOD_find(app_pkey_methods, &tmp); 122280297Sjkim if (idx >= 0) 123280297Sjkim return sk_EVP_PKEY_METHOD_value(app_pkey_methods, idx); 124280297Sjkim } 125280297Sjkim ret = OBJ_bsearch_pmeth(&t, standard_methods, 126280297Sjkim sizeof(standard_methods) / 127280297Sjkim sizeof(EVP_PKEY_METHOD *)); 128280297Sjkim if (!ret || !*ret) 129280297Sjkim return NULL; 130280297Sjkim return *ret; 131280297Sjkim} 132238384Sjkim 133238384Sjkimstatic EVP_PKEY_CTX *int_ctx_new(EVP_PKEY *pkey, ENGINE *e, int id) 134280297Sjkim{ 135280297Sjkim EVP_PKEY_CTX *ret; 136280297Sjkim const EVP_PKEY_METHOD *pmeth; 137280297Sjkim if (id == -1) { 138280297Sjkim if (!pkey || !pkey->ameth) 139280297Sjkim return NULL; 140280297Sjkim id = pkey->ameth->pkey_id; 141280297Sjkim } 142238384Sjkim#ifndef OPENSSL_NO_ENGINE 143280297Sjkim if (pkey && pkey->engine) 144280297Sjkim e = pkey->engine; 145280297Sjkim /* Try to find an ENGINE which implements this method */ 146280297Sjkim if (e) { 147280297Sjkim if (!ENGINE_init(e)) { 148280297Sjkim EVPerr(EVP_F_INT_CTX_NEW, ERR_R_ENGINE_LIB); 149280297Sjkim return NULL; 150280297Sjkim } 151280297Sjkim } else 152280297Sjkim e = ENGINE_get_pkey_meth_engine(id); 153238384Sjkim 154280297Sjkim /* 155280297Sjkim * If an ENGINE handled this method look it up. Othewise use internal 156280297Sjkim * tables. 157280297Sjkim */ 158238384Sjkim 159280297Sjkim if (e) 160280297Sjkim pmeth = ENGINE_get_pkey_meth(e, id); 161280297Sjkim else 162238384Sjkim#endif 163280297Sjkim pmeth = EVP_PKEY_meth_find(id); 164238384Sjkim 165280297Sjkim if (pmeth == NULL) { 166280297Sjkim EVPerr(EVP_F_INT_CTX_NEW, EVP_R_UNSUPPORTED_ALGORITHM); 167280297Sjkim return NULL; 168280297Sjkim } 169238384Sjkim 170280297Sjkim ret = OPENSSL_malloc(sizeof(EVP_PKEY_CTX)); 171280297Sjkim if (!ret) { 172238384Sjkim#ifndef OPENSSL_NO_ENGINE 173280297Sjkim if (e) 174280297Sjkim ENGINE_finish(e); 175238384Sjkim#endif 176280297Sjkim EVPerr(EVP_F_INT_CTX_NEW, ERR_R_MALLOC_FAILURE); 177280297Sjkim return NULL; 178280297Sjkim } 179280297Sjkim ret->engine = e; 180280297Sjkim ret->pmeth = pmeth; 181280297Sjkim ret->operation = EVP_PKEY_OP_UNDEFINED; 182280297Sjkim ret->pkey = pkey; 183280297Sjkim ret->peerkey = NULL; 184280297Sjkim ret->pkey_gencb = 0; 185280297Sjkim if (pkey) 186280297Sjkim CRYPTO_add(&pkey->references, 1, CRYPTO_LOCK_EVP_PKEY); 187280297Sjkim ret->data = NULL; 188238384Sjkim 189280297Sjkim if (pmeth->init) { 190280297Sjkim if (pmeth->init(ret) <= 0) { 191280297Sjkim EVP_PKEY_CTX_free(ret); 192280297Sjkim return NULL; 193280297Sjkim } 194280297Sjkim } 195238384Sjkim 196280297Sjkim return ret; 197280297Sjkim} 198238384Sjkim 199280297SjkimEVP_PKEY_METHOD *EVP_PKEY_meth_new(int id, int flags) 200280297Sjkim{ 201280297Sjkim EVP_PKEY_METHOD *pmeth; 202314125Sdelphij 203280297Sjkim pmeth = OPENSSL_malloc(sizeof(EVP_PKEY_METHOD)); 204280297Sjkim if (!pmeth) 205280297Sjkim return NULL; 206238384Sjkim 207280297Sjkim memset(pmeth, 0, sizeof(EVP_PKEY_METHOD)); 208238384Sjkim 209280297Sjkim pmeth->pkey_id = id; 210280297Sjkim pmeth->flags = flags | EVP_PKEY_FLAG_DYNAMIC; 211280297Sjkim return pmeth; 212280297Sjkim} 213238384Sjkim 214238384Sjkimvoid EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, 215280297Sjkim const EVP_PKEY_METHOD *meth) 216280297Sjkim{ 217280297Sjkim if (ppkey_id) 218280297Sjkim *ppkey_id = meth->pkey_id; 219280297Sjkim if (pflags) 220280297Sjkim *pflags = meth->flags; 221280297Sjkim} 222238384Sjkim 223238384Sjkimvoid EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src) 224280297Sjkim{ 225238384Sjkim 226280297Sjkim dst->init = src->init; 227280297Sjkim dst->copy = src->copy; 228280297Sjkim dst->cleanup = src->cleanup; 229238384Sjkim 230280297Sjkim dst->paramgen_init = src->paramgen_init; 231280297Sjkim dst->paramgen = src->paramgen; 232238384Sjkim 233280297Sjkim dst->keygen_init = src->keygen_init; 234280297Sjkim dst->keygen = src->keygen; 235238384Sjkim 236280297Sjkim dst->sign_init = src->sign_init; 237280297Sjkim dst->sign = src->sign; 238238384Sjkim 239280297Sjkim dst->verify_init = src->verify_init; 240280297Sjkim dst->verify = src->verify; 241238384Sjkim 242280297Sjkim dst->verify_recover_init = src->verify_recover_init; 243280297Sjkim dst->verify_recover = src->verify_recover; 244238384Sjkim 245280297Sjkim dst->signctx_init = src->signctx_init; 246280297Sjkim dst->signctx = src->signctx; 247238384Sjkim 248280297Sjkim dst->verifyctx_init = src->verifyctx_init; 249280297Sjkim dst->verifyctx = src->verifyctx; 250238384Sjkim 251280297Sjkim dst->encrypt_init = src->encrypt_init; 252280297Sjkim dst->encrypt = src->encrypt; 253238384Sjkim 254280297Sjkim dst->decrypt_init = src->decrypt_init; 255280297Sjkim dst->decrypt = src->decrypt; 256238384Sjkim 257280297Sjkim dst->derive_init = src->derive_init; 258280297Sjkim dst->derive = src->derive; 259238384Sjkim 260280297Sjkim dst->ctrl = src->ctrl; 261280297Sjkim dst->ctrl_str = src->ctrl_str; 262280297Sjkim} 263238384Sjkim 264238384Sjkimvoid EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth) 265280297Sjkim{ 266280297Sjkim if (pmeth && (pmeth->flags & EVP_PKEY_FLAG_DYNAMIC)) 267280297Sjkim OPENSSL_free(pmeth); 268280297Sjkim} 269238384Sjkim 270238384SjkimEVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e) 271280297Sjkim{ 272280297Sjkim return int_ctx_new(pkey, e, -1); 273280297Sjkim} 274238384Sjkim 275238384SjkimEVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e) 276280297Sjkim{ 277280297Sjkim return int_ctx_new(NULL, e, id); 278280297Sjkim} 279238384Sjkim 280238384SjkimEVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *pctx) 281280297Sjkim{ 282280297Sjkim EVP_PKEY_CTX *rctx; 283280297Sjkim if (!pctx->pmeth || !pctx->pmeth->copy) 284280297Sjkim return NULL; 285238384Sjkim#ifndef OPENSSL_NO_ENGINE 286280297Sjkim /* Make sure it's safe to copy a pkey context using an ENGINE */ 287280297Sjkim if (pctx->engine && !ENGINE_init(pctx->engine)) { 288280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_DUP, ERR_R_ENGINE_LIB); 289280297Sjkim return 0; 290280297Sjkim } 291238384Sjkim#endif 292280297Sjkim rctx = OPENSSL_malloc(sizeof(EVP_PKEY_CTX)); 293280297Sjkim if (!rctx) 294280297Sjkim return NULL; 295238384Sjkim 296280297Sjkim rctx->pmeth = pctx->pmeth; 297238384Sjkim#ifndef OPENSSL_NO_ENGINE 298280297Sjkim rctx->engine = pctx->engine; 299238384Sjkim#endif 300238384Sjkim 301280297Sjkim if (pctx->pkey) 302280297Sjkim CRYPTO_add(&pctx->pkey->references, 1, CRYPTO_LOCK_EVP_PKEY); 303238384Sjkim 304280297Sjkim rctx->pkey = pctx->pkey; 305238384Sjkim 306280297Sjkim if (pctx->peerkey) 307280297Sjkim CRYPTO_add(&pctx->peerkey->references, 1, CRYPTO_LOCK_EVP_PKEY); 308238384Sjkim 309280297Sjkim rctx->peerkey = pctx->peerkey; 310238384Sjkim 311280297Sjkim rctx->data = NULL; 312280297Sjkim rctx->app_data = NULL; 313280297Sjkim rctx->operation = pctx->operation; 314238384Sjkim 315280297Sjkim if (pctx->pmeth->copy(rctx, pctx) > 0) 316280297Sjkim return rctx; 317238384Sjkim 318280297Sjkim EVP_PKEY_CTX_free(rctx); 319280297Sjkim return NULL; 320238384Sjkim 321280297Sjkim} 322238384Sjkim 323238384Sjkimint EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth) 324280297Sjkim{ 325280297Sjkim if (app_pkey_methods == NULL) { 326280297Sjkim app_pkey_methods = sk_EVP_PKEY_METHOD_new(pmeth_cmp); 327280297Sjkim if (!app_pkey_methods) 328280297Sjkim return 0; 329280297Sjkim } 330280297Sjkim if (!sk_EVP_PKEY_METHOD_push(app_pkey_methods, pmeth)) 331280297Sjkim return 0; 332280297Sjkim sk_EVP_PKEY_METHOD_sort(app_pkey_methods); 333280297Sjkim return 1; 334280297Sjkim} 335238384Sjkim 336238384Sjkimvoid EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx) 337280297Sjkim{ 338280297Sjkim if (ctx == NULL) 339280297Sjkim return; 340280297Sjkim if (ctx->pmeth && ctx->pmeth->cleanup) 341280297Sjkim ctx->pmeth->cleanup(ctx); 342280297Sjkim if (ctx->pkey) 343280297Sjkim EVP_PKEY_free(ctx->pkey); 344280297Sjkim if (ctx->peerkey) 345280297Sjkim EVP_PKEY_free(ctx->peerkey); 346238384Sjkim#ifndef OPENSSL_NO_ENGINE 347280297Sjkim if (ctx->engine) 348280297Sjkim /* 349280297Sjkim * The EVP_PKEY_CTX we used belongs to an ENGINE, release the 350280297Sjkim * functional reference we held for this reason. 351280297Sjkim */ 352280297Sjkim ENGINE_finish(ctx->engine); 353238384Sjkim#endif 354280297Sjkim OPENSSL_free(ctx); 355280297Sjkim} 356238384Sjkim 357238384Sjkimint EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, 358280297Sjkim int cmd, int p1, void *p2) 359280297Sjkim{ 360280297Sjkim int ret; 361280297Sjkim if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl) { 362280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED); 363280297Sjkim return -2; 364280297Sjkim } 365280297Sjkim if ((keytype != -1) && (ctx->pmeth->pkey_id != keytype)) 366280297Sjkim return -1; 367238384Sjkim 368280297Sjkim if (ctx->operation == EVP_PKEY_OP_UNDEFINED) { 369280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_NO_OPERATION_SET); 370280297Sjkim return -1; 371280297Sjkim } 372238384Sjkim 373280297Sjkim if ((optype != -1) && !(ctx->operation & optype)) { 374280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_INVALID_OPERATION); 375280297Sjkim return -1; 376280297Sjkim } 377238384Sjkim 378280297Sjkim ret = ctx->pmeth->ctrl(ctx, cmd, p1, p2); 379238384Sjkim 380280297Sjkim if (ret == -2) 381280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED); 382238384Sjkim 383280297Sjkim return ret; 384238384Sjkim 385280297Sjkim} 386238384Sjkim 387238384Sjkimint EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, 388280297Sjkim const char *name, const char *value) 389280297Sjkim{ 390280297Sjkim if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl_str) { 391280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR, EVP_R_COMMAND_NOT_SUPPORTED); 392280297Sjkim return -2; 393280297Sjkim } 394280297Sjkim if (!strcmp(name, "digest")) { 395280297Sjkim const EVP_MD *md; 396280297Sjkim if (!value || !(md = EVP_get_digestbyname(value))) { 397280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR, EVP_R_INVALID_DIGEST); 398280297Sjkim return 0; 399280297Sjkim } 400280297Sjkim return EVP_PKEY_CTX_set_signature_md(ctx, md); 401280297Sjkim } 402280297Sjkim return ctx->pmeth->ctrl_str(ctx, name, value); 403280297Sjkim} 404238384Sjkim 405238384Sjkimint EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx) 406280297Sjkim{ 407280297Sjkim return ctx->operation; 408280297Sjkim} 409238384Sjkim 410238384Sjkimvoid EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen) 411280297Sjkim{ 412280297Sjkim ctx->keygen_info = dat; 413280297Sjkim ctx->keygen_info_count = datlen; 414280297Sjkim} 415238384Sjkim 416238384Sjkimvoid EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data) 417280297Sjkim{ 418280297Sjkim ctx->data = data; 419280297Sjkim} 420238384Sjkim 421238384Sjkimvoid *EVP_PKEY_CTX_get_data(EVP_PKEY_CTX *ctx) 422280297Sjkim{ 423280297Sjkim return ctx->data; 424280297Sjkim} 425238384Sjkim 426238384SjkimEVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx) 427280297Sjkim{ 428280297Sjkim return ctx->pkey; 429280297Sjkim} 430238384Sjkim 431238384SjkimEVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx) 432280297Sjkim{ 433280297Sjkim return ctx->peerkey; 434280297Sjkim} 435280297Sjkim 436238384Sjkimvoid EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data) 437280297Sjkim{ 438280297Sjkim ctx->app_data = data; 439280297Sjkim} 440238384Sjkim 441238384Sjkimvoid *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx) 442280297Sjkim{ 443280297Sjkim return ctx->app_data; 444280297Sjkim} 445238384Sjkim 446238384Sjkimvoid EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth, 447280297Sjkim int (*init) (EVP_PKEY_CTX *ctx)) 448280297Sjkim{ 449280297Sjkim pmeth->init = init; 450280297Sjkim} 451238384Sjkim 452238384Sjkimvoid EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth, 453280297Sjkim int (*copy) (EVP_PKEY_CTX *dst, 454280297Sjkim EVP_PKEY_CTX *src)) 455280297Sjkim{ 456280297Sjkim pmeth->copy = copy; 457280297Sjkim} 458238384Sjkim 459238384Sjkimvoid EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth, 460280297Sjkim void (*cleanup) (EVP_PKEY_CTX *ctx)) 461280297Sjkim{ 462280297Sjkim pmeth->cleanup = cleanup; 463280297Sjkim} 464238384Sjkim 465238384Sjkimvoid EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth, 466280297Sjkim int (*paramgen_init) (EVP_PKEY_CTX *ctx), 467280297Sjkim int (*paramgen) (EVP_PKEY_CTX *ctx, 468280297Sjkim EVP_PKEY *pkey)) 469280297Sjkim{ 470280297Sjkim pmeth->paramgen_init = paramgen_init; 471280297Sjkim pmeth->paramgen = paramgen; 472280297Sjkim} 473238384Sjkim 474238384Sjkimvoid EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth, 475280297Sjkim int (*keygen_init) (EVP_PKEY_CTX *ctx), 476280297Sjkim int (*keygen) (EVP_PKEY_CTX *ctx, 477280297Sjkim EVP_PKEY *pkey)) 478280297Sjkim{ 479280297Sjkim pmeth->keygen_init = keygen_init; 480280297Sjkim pmeth->keygen = keygen; 481280297Sjkim} 482238384Sjkim 483238384Sjkimvoid EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth, 484280297Sjkim int (*sign_init) (EVP_PKEY_CTX *ctx), 485280297Sjkim int (*sign) (EVP_PKEY_CTX *ctx, 486280297Sjkim unsigned char *sig, size_t *siglen, 487280297Sjkim const unsigned char *tbs, 488280297Sjkim size_t tbslen)) 489280297Sjkim{ 490280297Sjkim pmeth->sign_init = sign_init; 491280297Sjkim pmeth->sign = sign; 492280297Sjkim} 493238384Sjkim 494238384Sjkimvoid EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth, 495280297Sjkim int (*verify_init) (EVP_PKEY_CTX *ctx), 496280297Sjkim int (*verify) (EVP_PKEY_CTX *ctx, 497280297Sjkim const unsigned char *sig, 498280297Sjkim size_t siglen, 499280297Sjkim const unsigned char *tbs, 500280297Sjkim size_t tbslen)) 501280297Sjkim{ 502280297Sjkim pmeth->verify_init = verify_init; 503280297Sjkim pmeth->verify = verify; 504280297Sjkim} 505238384Sjkim 506238384Sjkimvoid EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth, 507280297Sjkim int (*verify_recover_init) (EVP_PKEY_CTX 508280297Sjkim *ctx), 509280297Sjkim int (*verify_recover) (EVP_PKEY_CTX 510280297Sjkim *ctx, 511280297Sjkim unsigned char 512280297Sjkim *sig, 513280297Sjkim size_t *siglen, 514280297Sjkim const unsigned 515280297Sjkim char *tbs, 516280297Sjkim size_t tbslen)) 517280297Sjkim{ 518280297Sjkim pmeth->verify_recover_init = verify_recover_init; 519280297Sjkim pmeth->verify_recover = verify_recover; 520280297Sjkim} 521238384Sjkim 522238384Sjkimvoid EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth, 523280297Sjkim int (*signctx_init) (EVP_PKEY_CTX *ctx, 524280297Sjkim EVP_MD_CTX *mctx), 525280297Sjkim int (*signctx) (EVP_PKEY_CTX *ctx, 526280297Sjkim unsigned char *sig, 527280297Sjkim size_t *siglen, 528280297Sjkim EVP_MD_CTX *mctx)) 529280297Sjkim{ 530280297Sjkim pmeth->signctx_init = signctx_init; 531280297Sjkim pmeth->signctx = signctx; 532280297Sjkim} 533238384Sjkim 534238384Sjkimvoid EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth, 535280297Sjkim int (*verifyctx_init) (EVP_PKEY_CTX *ctx, 536280297Sjkim EVP_MD_CTX *mctx), 537280297Sjkim int (*verifyctx) (EVP_PKEY_CTX *ctx, 538280297Sjkim const unsigned char *sig, 539280297Sjkim int siglen, 540280297Sjkim EVP_MD_CTX *mctx)) 541280297Sjkim{ 542280297Sjkim pmeth->verifyctx_init = verifyctx_init; 543280297Sjkim pmeth->verifyctx = verifyctx; 544280297Sjkim} 545238384Sjkim 546238384Sjkimvoid EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth, 547280297Sjkim int (*encrypt_init) (EVP_PKEY_CTX *ctx), 548280297Sjkim int (*encryptfn) (EVP_PKEY_CTX *ctx, 549280297Sjkim unsigned char *out, 550280297Sjkim size_t *outlen, 551280297Sjkim const unsigned char *in, 552280297Sjkim size_t inlen)) 553280297Sjkim{ 554280297Sjkim pmeth->encrypt_init = encrypt_init; 555280297Sjkim pmeth->encrypt = encryptfn; 556280297Sjkim} 557238384Sjkim 558238384Sjkimvoid EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth, 559280297Sjkim int (*decrypt_init) (EVP_PKEY_CTX *ctx), 560280297Sjkim int (*decrypt) (EVP_PKEY_CTX *ctx, 561280297Sjkim unsigned char *out, 562280297Sjkim size_t *outlen, 563280297Sjkim const unsigned char *in, 564280297Sjkim size_t inlen)) 565280297Sjkim{ 566280297Sjkim pmeth->decrypt_init = decrypt_init; 567280297Sjkim pmeth->decrypt = decrypt; 568280297Sjkim} 569238384Sjkim 570238384Sjkimvoid EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth, 571280297Sjkim int (*derive_init) (EVP_PKEY_CTX *ctx), 572280297Sjkim int (*derive) (EVP_PKEY_CTX *ctx, 573280297Sjkim unsigned char *key, 574280297Sjkim size_t *keylen)) 575280297Sjkim{ 576280297Sjkim pmeth->derive_init = derive_init; 577280297Sjkim pmeth->derive = derive; 578280297Sjkim} 579238384Sjkim 580238384Sjkimvoid EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth, 581280297Sjkim int (*ctrl) (EVP_PKEY_CTX *ctx, int type, int p1, 582280297Sjkim void *p2), 583280297Sjkim int (*ctrl_str) (EVP_PKEY_CTX *ctx, 584280297Sjkim const char *type, 585280297Sjkim const char *value)) 586280297Sjkim{ 587280297Sjkim pmeth->ctrl = ctrl; 588280297Sjkim pmeth->ctrl_str = ctrl_str; 589280297Sjkim} 590