1238384Sjkim/* pmeth_lib.c */ 2238384Sjkim/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3238384Sjkim * project 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 13238384Sjkim * 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 <stdlib.h> 61238384Sjkim#include "cryptlib.h" 62238384Sjkim#include <openssl/objects.h> 63238384Sjkim#include <openssl/evp.h> 64238384Sjkim#ifndef OPENSSL_NO_ENGINE 65238384Sjkim#include <openssl/engine.h> 66238384Sjkim#endif 67238384Sjkim#include "asn1_locl.h" 68238384Sjkim#include "evp_locl.h" 69238384Sjkim 70238384Sjkimtypedef int sk_cmp_fn_type(const char * const *a, const char * const *b); 71238384Sjkim 72238384SjkimDECLARE_STACK_OF(EVP_PKEY_METHOD) 73238384SjkimSTACK_OF(EVP_PKEY_METHOD) *app_pkey_methods = NULL; 74238384Sjkim 75238384Sjkimextern const EVP_PKEY_METHOD rsa_pkey_meth, dh_pkey_meth, dsa_pkey_meth; 76238384Sjkimextern const EVP_PKEY_METHOD ec_pkey_meth, hmac_pkey_meth, cmac_pkey_meth; 77238384Sjkim 78238384Sjkimstatic const EVP_PKEY_METHOD *standard_methods[] = 79238384Sjkim { 80238384Sjkim#ifndef OPENSSL_NO_RSA 81238384Sjkim &rsa_pkey_meth, 82238384Sjkim#endif 83238384Sjkim#ifndef OPENSSL_NO_DH 84238384Sjkim &dh_pkey_meth, 85238384Sjkim#endif 86238384Sjkim#ifndef OPENSSL_NO_DSA 87238384Sjkim &dsa_pkey_meth, 88238384Sjkim#endif 89238384Sjkim#ifndef OPENSSL_NO_EC 90238384Sjkim &ec_pkey_meth, 91238384Sjkim#endif 92238384Sjkim &hmac_pkey_meth, 93238384Sjkim &cmac_pkey_meth 94238384Sjkim }; 95238384Sjkim 96238384SjkimDECLARE_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_METHOD *, const EVP_PKEY_METHOD *, 97238384Sjkim pmeth); 98238384Sjkim 99238384Sjkimstatic int pmeth_cmp(const EVP_PKEY_METHOD * const *a, 100238384Sjkim const EVP_PKEY_METHOD * const *b) 101238384Sjkim { 102238384Sjkim return ((*a)->pkey_id - (*b)->pkey_id); 103238384Sjkim } 104238384Sjkim 105238384SjkimIMPLEMENT_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_METHOD *, const EVP_PKEY_METHOD *, 106238384Sjkim pmeth); 107238384Sjkim 108238384Sjkimconst EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type) 109238384Sjkim { 110238384Sjkim EVP_PKEY_METHOD tmp; 111238384Sjkim const EVP_PKEY_METHOD *t = &tmp, **ret; 112238384Sjkim tmp.pkey_id = type; 113238384Sjkim if (app_pkey_methods) 114238384Sjkim { 115238384Sjkim int idx; 116238384Sjkim idx = sk_EVP_PKEY_METHOD_find(app_pkey_methods, &tmp); 117238384Sjkim if (idx >= 0) 118238384Sjkim return sk_EVP_PKEY_METHOD_value(app_pkey_methods, idx); 119238384Sjkim } 120238384Sjkim ret = OBJ_bsearch_pmeth(&t, standard_methods, 121238384Sjkim sizeof(standard_methods)/sizeof(EVP_PKEY_METHOD *)); 122238384Sjkim if (!ret || !*ret) 123238384Sjkim return NULL; 124238384Sjkim return *ret; 125238384Sjkim } 126238384Sjkim 127238384Sjkimstatic EVP_PKEY_CTX *int_ctx_new(EVP_PKEY *pkey, ENGINE *e, int id) 128238384Sjkim { 129238384Sjkim EVP_PKEY_CTX *ret; 130238384Sjkim const EVP_PKEY_METHOD *pmeth; 131238384Sjkim if (id == -1) 132238384Sjkim { 133238384Sjkim if (!pkey || !pkey->ameth) 134238384Sjkim return NULL; 135238384Sjkim id = pkey->ameth->pkey_id; 136238384Sjkim } 137238384Sjkim#ifndef OPENSSL_NO_ENGINE 138238384Sjkim if (pkey && pkey->engine) 139238384Sjkim e = pkey->engine; 140238384Sjkim /* Try to find an ENGINE which implements this method */ 141238384Sjkim if (e) 142238384Sjkim { 143238384Sjkim if (!ENGINE_init(e)) 144238384Sjkim { 145238384Sjkim EVPerr(EVP_F_INT_CTX_NEW,ERR_R_ENGINE_LIB); 146238384Sjkim return NULL; 147238384Sjkim } 148238384Sjkim } 149238384Sjkim else 150238384Sjkim e = ENGINE_get_pkey_meth_engine(id); 151238384Sjkim 152238384Sjkim /* If an ENGINE handled this method look it up. Othewise 153238384Sjkim * use internal tables. 154238384Sjkim */ 155238384Sjkim 156238384Sjkim if (e) 157238384Sjkim pmeth = ENGINE_get_pkey_meth(e, id); 158238384Sjkim else 159238384Sjkim#endif 160238384Sjkim pmeth = EVP_PKEY_meth_find(id); 161238384Sjkim 162238384Sjkim if (pmeth == NULL) 163238384Sjkim { 164238384Sjkim EVPerr(EVP_F_INT_CTX_NEW,EVP_R_UNSUPPORTED_ALGORITHM); 165238384Sjkim return NULL; 166238384Sjkim } 167238384Sjkim 168238384Sjkim ret = OPENSSL_malloc(sizeof(EVP_PKEY_CTX)); 169238384Sjkim if (!ret) 170238384Sjkim { 171238384Sjkim#ifndef OPENSSL_NO_ENGINE 172238384Sjkim if (e) 173238384Sjkim ENGINE_finish(e); 174238384Sjkim#endif 175238384Sjkim EVPerr(EVP_F_INT_CTX_NEW,ERR_R_MALLOC_FAILURE); 176238384Sjkim return NULL; 177238384Sjkim } 178238384Sjkim ret->engine = e; 179238384Sjkim ret->pmeth = pmeth; 180238384Sjkim ret->operation = EVP_PKEY_OP_UNDEFINED; 181238384Sjkim ret->pkey = pkey; 182238384Sjkim ret->peerkey = NULL; 183238384Sjkim ret->pkey_gencb = 0; 184238384Sjkim if (pkey) 185238384Sjkim CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY); 186238384Sjkim ret->data = NULL; 187238384Sjkim 188238384Sjkim if (pmeth->init) 189238384Sjkim { 190238384Sjkim if (pmeth->init(ret) <= 0) 191238384Sjkim { 192238384Sjkim EVP_PKEY_CTX_free(ret); 193238384Sjkim return NULL; 194238384Sjkim } 195238384Sjkim } 196238384Sjkim 197238384Sjkim return ret; 198238384Sjkim } 199238384Sjkim 200238384SjkimEVP_PKEY_METHOD* EVP_PKEY_meth_new(int id, int flags) 201238384Sjkim { 202238384Sjkim EVP_PKEY_METHOD *pmeth; 203238384Sjkim pmeth = OPENSSL_malloc(sizeof(EVP_PKEY_METHOD)); 204238384Sjkim if (!pmeth) 205238384Sjkim return NULL; 206238384Sjkim 207238384Sjkim memset(pmeth, 0, sizeof(EVP_PKEY_METHOD)); 208238384Sjkim 209238384Sjkim pmeth->pkey_id = id; 210238384Sjkim pmeth->flags = flags | EVP_PKEY_FLAG_DYNAMIC; 211238384Sjkim 212238384Sjkim pmeth->init = 0; 213238384Sjkim pmeth->copy = 0; 214238384Sjkim pmeth->cleanup = 0; 215238384Sjkim pmeth->paramgen_init = 0; 216238384Sjkim pmeth->paramgen = 0; 217238384Sjkim pmeth->keygen_init = 0; 218238384Sjkim pmeth->keygen = 0; 219238384Sjkim pmeth->sign_init = 0; 220238384Sjkim pmeth->sign = 0; 221238384Sjkim pmeth->verify_init = 0; 222238384Sjkim pmeth->verify = 0; 223238384Sjkim pmeth->verify_recover_init = 0; 224238384Sjkim pmeth->verify_recover = 0; 225238384Sjkim pmeth->signctx_init = 0; 226238384Sjkim pmeth->signctx = 0; 227238384Sjkim pmeth->verifyctx_init = 0; 228238384Sjkim pmeth->verifyctx = 0; 229238384Sjkim pmeth->encrypt_init = 0; 230238384Sjkim pmeth->encrypt = 0; 231238384Sjkim pmeth->decrypt_init = 0; 232238384Sjkim pmeth->decrypt = 0; 233238384Sjkim pmeth->derive_init = 0; 234238384Sjkim pmeth->derive = 0; 235238384Sjkim pmeth->ctrl = 0; 236238384Sjkim pmeth->ctrl_str = 0; 237238384Sjkim 238238384Sjkim return pmeth; 239238384Sjkim } 240238384Sjkim 241238384Sjkimvoid EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, 242238384Sjkim const EVP_PKEY_METHOD *meth) 243238384Sjkim { 244238384Sjkim if (ppkey_id) 245238384Sjkim *ppkey_id = meth->pkey_id; 246238384Sjkim if (pflags) 247238384Sjkim *pflags = meth->flags; 248238384Sjkim } 249238384Sjkim 250238384Sjkimvoid EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src) 251238384Sjkim { 252238384Sjkim 253238384Sjkim dst->init = src->init; 254238384Sjkim dst->copy = src->copy; 255238384Sjkim dst->cleanup = src->cleanup; 256238384Sjkim 257238384Sjkim dst->paramgen_init = src->paramgen_init; 258238384Sjkim dst->paramgen = src->paramgen; 259238384Sjkim 260238384Sjkim dst->keygen_init = src->keygen_init; 261238384Sjkim dst->keygen = src->keygen; 262238384Sjkim 263238384Sjkim dst->sign_init = src->sign_init; 264238384Sjkim dst->sign = src->sign; 265238384Sjkim 266238384Sjkim dst->verify_init = src->verify_init; 267238384Sjkim dst->verify = src->verify; 268238384Sjkim 269238384Sjkim dst->verify_recover_init = src->verify_recover_init; 270238384Sjkim dst->verify_recover = src->verify_recover; 271238384Sjkim 272238384Sjkim dst->signctx_init = src->signctx_init; 273238384Sjkim dst->signctx = src->signctx; 274238384Sjkim 275238384Sjkim dst->verifyctx_init = src->verifyctx_init; 276238384Sjkim dst->verifyctx = src->verifyctx; 277238384Sjkim 278238384Sjkim dst->encrypt_init = src->encrypt_init; 279238384Sjkim dst->encrypt = src->encrypt; 280238384Sjkim 281238384Sjkim dst->decrypt_init = src->decrypt_init; 282238384Sjkim dst->decrypt = src->decrypt; 283238384Sjkim 284238384Sjkim dst->derive_init = src->derive_init; 285238384Sjkim dst->derive = src->derive; 286238384Sjkim 287238384Sjkim dst->ctrl = src->ctrl; 288238384Sjkim dst->ctrl_str = src->ctrl_str; 289238384Sjkim } 290238384Sjkim 291238384Sjkimvoid EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth) 292238384Sjkim { 293238384Sjkim if (pmeth && (pmeth->flags & EVP_PKEY_FLAG_DYNAMIC)) 294238384Sjkim OPENSSL_free(pmeth); 295238384Sjkim } 296238384Sjkim 297238384SjkimEVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e) 298238384Sjkim { 299238384Sjkim return int_ctx_new(pkey, e, -1); 300238384Sjkim } 301238384Sjkim 302238384SjkimEVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e) 303238384Sjkim { 304238384Sjkim return int_ctx_new(NULL, e, id); 305238384Sjkim } 306238384Sjkim 307238384SjkimEVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *pctx) 308238384Sjkim { 309238384Sjkim EVP_PKEY_CTX *rctx; 310238384Sjkim if (!pctx->pmeth || !pctx->pmeth->copy) 311238384Sjkim return NULL; 312238384Sjkim#ifndef OPENSSL_NO_ENGINE 313238384Sjkim /* Make sure it's safe to copy a pkey context using an ENGINE */ 314238384Sjkim if (pctx->engine && !ENGINE_init(pctx->engine)) 315238384Sjkim { 316238384Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_DUP,ERR_R_ENGINE_LIB); 317238384Sjkim return 0; 318238384Sjkim } 319238384Sjkim#endif 320238384Sjkim rctx = OPENSSL_malloc(sizeof(EVP_PKEY_CTX)); 321238384Sjkim if (!rctx) 322238384Sjkim return NULL; 323238384Sjkim 324238384Sjkim rctx->pmeth = pctx->pmeth; 325238384Sjkim#ifndef OPENSSL_NO_ENGINE 326238384Sjkim rctx->engine = pctx->engine; 327238384Sjkim#endif 328238384Sjkim 329238384Sjkim if (pctx->pkey) 330238384Sjkim CRYPTO_add(&pctx->pkey->references,1,CRYPTO_LOCK_EVP_PKEY); 331238384Sjkim 332238384Sjkim rctx->pkey = pctx->pkey; 333238384Sjkim 334238384Sjkim if (pctx->peerkey) 335238384Sjkim CRYPTO_add(&pctx->peerkey->references,1,CRYPTO_LOCK_EVP_PKEY); 336238384Sjkim 337238384Sjkim rctx->peerkey = pctx->peerkey; 338238384Sjkim 339238384Sjkim rctx->data = NULL; 340238384Sjkim rctx->app_data = NULL; 341238384Sjkim rctx->operation = pctx->operation; 342238384Sjkim 343238384Sjkim if (pctx->pmeth->copy(rctx, pctx) > 0) 344238384Sjkim return rctx; 345238384Sjkim 346238384Sjkim EVP_PKEY_CTX_free(rctx); 347238384Sjkim return NULL; 348238384Sjkim 349238384Sjkim } 350238384Sjkim 351238384Sjkimint EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth) 352238384Sjkim { 353238384Sjkim if (app_pkey_methods == NULL) 354238384Sjkim { 355238384Sjkim app_pkey_methods = sk_EVP_PKEY_METHOD_new(pmeth_cmp); 356238384Sjkim if (!app_pkey_methods) 357238384Sjkim return 0; 358238384Sjkim } 359238384Sjkim if (!sk_EVP_PKEY_METHOD_push(app_pkey_methods, pmeth)) 360238384Sjkim return 0; 361238384Sjkim sk_EVP_PKEY_METHOD_sort(app_pkey_methods); 362238384Sjkim return 1; 363238384Sjkim } 364238384Sjkim 365238384Sjkimvoid EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx) 366238384Sjkim { 367238384Sjkim if (ctx == NULL) 368238384Sjkim return; 369238384Sjkim if (ctx->pmeth && ctx->pmeth->cleanup) 370238384Sjkim ctx->pmeth->cleanup(ctx); 371238384Sjkim if (ctx->pkey) 372238384Sjkim EVP_PKEY_free(ctx->pkey); 373238384Sjkim if (ctx->peerkey) 374238384Sjkim EVP_PKEY_free(ctx->peerkey); 375238384Sjkim#ifndef OPENSSL_NO_ENGINE 376238384Sjkim if(ctx->engine) 377238384Sjkim /* The EVP_PKEY_CTX we used belongs to an ENGINE, release the 378238384Sjkim * functional reference we held for this reason. */ 379238384Sjkim ENGINE_finish(ctx->engine); 380238384Sjkim#endif 381238384Sjkim OPENSSL_free(ctx); 382238384Sjkim } 383238384Sjkim 384238384Sjkimint EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, 385238384Sjkim int cmd, int p1, void *p2) 386238384Sjkim { 387238384Sjkim int ret; 388238384Sjkim if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl) 389238384Sjkim { 390238384Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED); 391238384Sjkim return -2; 392238384Sjkim } 393238384Sjkim if ((keytype != -1) && (ctx->pmeth->pkey_id != keytype)) 394238384Sjkim return -1; 395238384Sjkim 396238384Sjkim if (ctx->operation == EVP_PKEY_OP_UNDEFINED) 397238384Sjkim { 398238384Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_NO_OPERATION_SET); 399238384Sjkim return -1; 400238384Sjkim } 401238384Sjkim 402238384Sjkim if ((optype != -1) && !(ctx->operation & optype)) 403238384Sjkim { 404238384Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_INVALID_OPERATION); 405238384Sjkim return -1; 406238384Sjkim } 407238384Sjkim 408238384Sjkim ret = ctx->pmeth->ctrl(ctx, cmd, p1, p2); 409238384Sjkim 410238384Sjkim if (ret == -2) 411238384Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED); 412238384Sjkim 413238384Sjkim return ret; 414238384Sjkim 415238384Sjkim } 416238384Sjkim 417238384Sjkimint EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, 418238384Sjkim const char *name, const char *value) 419238384Sjkim { 420238384Sjkim if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl_str) 421238384Sjkim { 422238384Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR, 423238384Sjkim EVP_R_COMMAND_NOT_SUPPORTED); 424238384Sjkim return -2; 425238384Sjkim } 426238384Sjkim if (!strcmp(name, "digest")) 427238384Sjkim { 428238384Sjkim const EVP_MD *md; 429238384Sjkim if (!value || !(md = EVP_get_digestbyname(value))) 430238384Sjkim { 431238384Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR, 432238384Sjkim EVP_R_INVALID_DIGEST); 433238384Sjkim return 0; 434238384Sjkim } 435238384Sjkim return EVP_PKEY_CTX_set_signature_md(ctx, md); 436238384Sjkim } 437238384Sjkim return ctx->pmeth->ctrl_str(ctx, name, value); 438238384Sjkim } 439238384Sjkim 440238384Sjkimint EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx) 441238384Sjkim { 442238384Sjkim return ctx->operation; 443238384Sjkim } 444238384Sjkim 445238384Sjkimvoid EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen) 446238384Sjkim { 447238384Sjkim ctx->keygen_info = dat; 448238384Sjkim ctx->keygen_info_count = datlen; 449238384Sjkim } 450238384Sjkim 451238384Sjkimvoid EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data) 452238384Sjkim { 453238384Sjkim ctx->data = data; 454238384Sjkim } 455238384Sjkim 456238384Sjkimvoid *EVP_PKEY_CTX_get_data(EVP_PKEY_CTX *ctx) 457238384Sjkim { 458238384Sjkim return ctx->data; 459238384Sjkim } 460238384Sjkim 461238384SjkimEVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx) 462238384Sjkim { 463238384Sjkim return ctx->pkey; 464238384Sjkim } 465238384Sjkim 466238384SjkimEVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx) 467238384Sjkim { 468238384Sjkim return ctx->peerkey; 469238384Sjkim } 470238384Sjkim 471238384Sjkimvoid EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data) 472238384Sjkim { 473238384Sjkim ctx->app_data = data; 474238384Sjkim } 475238384Sjkim 476238384Sjkimvoid *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx) 477238384Sjkim { 478238384Sjkim return ctx->app_data; 479238384Sjkim } 480238384Sjkim 481238384Sjkimvoid EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth, 482238384Sjkim int (*init)(EVP_PKEY_CTX *ctx)) 483238384Sjkim { 484238384Sjkim pmeth->init = init; 485238384Sjkim } 486238384Sjkim 487238384Sjkimvoid EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth, 488238384Sjkim int (*copy)(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)) 489238384Sjkim { 490238384Sjkim pmeth->copy = copy; 491238384Sjkim } 492238384Sjkim 493238384Sjkimvoid EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth, 494238384Sjkim void (*cleanup)(EVP_PKEY_CTX *ctx)) 495238384Sjkim { 496238384Sjkim pmeth->cleanup = cleanup; 497238384Sjkim } 498238384Sjkim 499238384Sjkimvoid EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth, 500238384Sjkim int (*paramgen_init)(EVP_PKEY_CTX *ctx), 501238384Sjkim int (*paramgen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)) 502238384Sjkim { 503238384Sjkim pmeth->paramgen_init = paramgen_init; 504238384Sjkim pmeth->paramgen = paramgen; 505238384Sjkim } 506238384Sjkim 507238384Sjkimvoid EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth, 508238384Sjkim int (*keygen_init)(EVP_PKEY_CTX *ctx), 509238384Sjkim int (*keygen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)) 510238384Sjkim { 511238384Sjkim pmeth->keygen_init = keygen_init; 512238384Sjkim pmeth->keygen = keygen; 513238384Sjkim } 514238384Sjkim 515238384Sjkimvoid EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth, 516238384Sjkim int (*sign_init)(EVP_PKEY_CTX *ctx), 517238384Sjkim int (*sign)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, 518238384Sjkim const unsigned char *tbs, size_t tbslen)) 519238384Sjkim { 520238384Sjkim pmeth->sign_init = sign_init; 521238384Sjkim pmeth->sign = sign; 522238384Sjkim } 523238384Sjkim 524238384Sjkimvoid EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth, 525238384Sjkim int (*verify_init)(EVP_PKEY_CTX *ctx), 526238384Sjkim int (*verify)(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen, 527238384Sjkim const unsigned char *tbs, size_t tbslen)) 528238384Sjkim { 529238384Sjkim pmeth->verify_init = verify_init; 530238384Sjkim pmeth->verify = verify; 531238384Sjkim } 532238384Sjkim 533238384Sjkimvoid EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth, 534238384Sjkim int (*verify_recover_init)(EVP_PKEY_CTX *ctx), 535238384Sjkim int (*verify_recover)(EVP_PKEY_CTX *ctx, 536238384Sjkim unsigned char *sig, size_t *siglen, 537238384Sjkim const unsigned char *tbs, size_t tbslen)) 538238384Sjkim { 539238384Sjkim pmeth->verify_recover_init = verify_recover_init; 540238384Sjkim pmeth->verify_recover = verify_recover; 541238384Sjkim } 542238384Sjkim 543238384Sjkimvoid EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth, 544238384Sjkim int (*signctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx), 545238384Sjkim int (*signctx)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, 546238384Sjkim EVP_MD_CTX *mctx)) 547238384Sjkim { 548238384Sjkim pmeth->signctx_init = signctx_init; 549238384Sjkim pmeth->signctx = signctx; 550238384Sjkim } 551238384Sjkim 552238384Sjkimvoid EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth, 553238384Sjkim int (*verifyctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx), 554238384Sjkim int (*verifyctx)(EVP_PKEY_CTX *ctx, const unsigned char *sig,int siglen, 555238384Sjkim EVP_MD_CTX *mctx)) 556238384Sjkim { 557238384Sjkim pmeth->verifyctx_init = verifyctx_init; 558238384Sjkim pmeth->verifyctx = verifyctx; 559238384Sjkim } 560238384Sjkim 561238384Sjkimvoid EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth, 562238384Sjkim int (*encrypt_init)(EVP_PKEY_CTX *ctx), 563238384Sjkim int (*encryptfn)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, 564238384Sjkim const unsigned char *in, size_t inlen)) 565238384Sjkim { 566238384Sjkim pmeth->encrypt_init = encrypt_init; 567238384Sjkim pmeth->encrypt = encryptfn; 568238384Sjkim } 569238384Sjkim 570238384Sjkimvoid EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth, 571238384Sjkim int (*decrypt_init)(EVP_PKEY_CTX *ctx), 572238384Sjkim int (*decrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, 573238384Sjkim const unsigned char *in, size_t inlen)) 574238384Sjkim { 575238384Sjkim pmeth->decrypt_init = decrypt_init; 576238384Sjkim pmeth->decrypt = decrypt; 577238384Sjkim } 578238384Sjkim 579238384Sjkimvoid EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth, 580238384Sjkim int (*derive_init)(EVP_PKEY_CTX *ctx), 581238384Sjkim int (*derive)(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)) 582238384Sjkim { 583238384Sjkim pmeth->derive_init = derive_init; 584238384Sjkim pmeth->derive = derive; 585238384Sjkim } 586238384Sjkim 587238384Sjkimvoid EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth, 588238384Sjkim int (*ctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2), 589238384Sjkim int (*ctrl_str)(EVP_PKEY_CTX *ctx, const char *type, const char *value)) 590238384Sjkim { 591238384Sjkim pmeth->ctrl = ctrl; 592238384Sjkim pmeth->ctrl_str = ctrl_str; 593238384Sjkim } 594