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, 94306195Sjkim#ifndef OPENSSL_NO_CMAC 95290207Sjkim &cmac_pkey_meth, 96306195Sjkim#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) { 191325335Sjkim ret->pmeth = NULL; 192280297Sjkim EVP_PKEY_CTX_free(ret); 193280297Sjkim return NULL; 194280297Sjkim } 195280297Sjkim } 196238384Sjkim 197280297Sjkim return ret; 198280297Sjkim} 199238384Sjkim 200280297SjkimEVP_PKEY_METHOD *EVP_PKEY_meth_new(int id, int flags) 201280297Sjkim{ 202280297Sjkim EVP_PKEY_METHOD *pmeth; 203312826Sjkim 204280297Sjkim pmeth = OPENSSL_malloc(sizeof(EVP_PKEY_METHOD)); 205280297Sjkim if (!pmeth) 206280297Sjkim return NULL; 207238384Sjkim 208280297Sjkim memset(pmeth, 0, sizeof(EVP_PKEY_METHOD)); 209238384Sjkim 210280297Sjkim pmeth->pkey_id = id; 211280297Sjkim pmeth->flags = flags | EVP_PKEY_FLAG_DYNAMIC; 212280297Sjkim return pmeth; 213280297Sjkim} 214238384Sjkim 215238384Sjkimvoid EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, 216280297Sjkim const EVP_PKEY_METHOD *meth) 217280297Sjkim{ 218280297Sjkim if (ppkey_id) 219280297Sjkim *ppkey_id = meth->pkey_id; 220280297Sjkim if (pflags) 221280297Sjkim *pflags = meth->flags; 222280297Sjkim} 223238384Sjkim 224238384Sjkimvoid EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src) 225280297Sjkim{ 226238384Sjkim 227280297Sjkim dst->init = src->init; 228280297Sjkim dst->copy = src->copy; 229280297Sjkim dst->cleanup = src->cleanup; 230238384Sjkim 231280297Sjkim dst->paramgen_init = src->paramgen_init; 232280297Sjkim dst->paramgen = src->paramgen; 233238384Sjkim 234280297Sjkim dst->keygen_init = src->keygen_init; 235280297Sjkim dst->keygen = src->keygen; 236238384Sjkim 237280297Sjkim dst->sign_init = src->sign_init; 238280297Sjkim dst->sign = src->sign; 239238384Sjkim 240280297Sjkim dst->verify_init = src->verify_init; 241280297Sjkim dst->verify = src->verify; 242238384Sjkim 243280297Sjkim dst->verify_recover_init = src->verify_recover_init; 244280297Sjkim dst->verify_recover = src->verify_recover; 245238384Sjkim 246280297Sjkim dst->signctx_init = src->signctx_init; 247280297Sjkim dst->signctx = src->signctx; 248238384Sjkim 249280297Sjkim dst->verifyctx_init = src->verifyctx_init; 250280297Sjkim dst->verifyctx = src->verifyctx; 251238384Sjkim 252280297Sjkim dst->encrypt_init = src->encrypt_init; 253280297Sjkim dst->encrypt = src->encrypt; 254238384Sjkim 255280297Sjkim dst->decrypt_init = src->decrypt_init; 256280297Sjkim dst->decrypt = src->decrypt; 257238384Sjkim 258280297Sjkim dst->derive_init = src->derive_init; 259280297Sjkim dst->derive = src->derive; 260238384Sjkim 261280297Sjkim dst->ctrl = src->ctrl; 262280297Sjkim dst->ctrl_str = src->ctrl_str; 263280297Sjkim} 264238384Sjkim 265238384Sjkimvoid EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth) 266280297Sjkim{ 267280297Sjkim if (pmeth && (pmeth->flags & EVP_PKEY_FLAG_DYNAMIC)) 268280297Sjkim OPENSSL_free(pmeth); 269280297Sjkim} 270238384Sjkim 271238384SjkimEVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e) 272280297Sjkim{ 273280297Sjkim return int_ctx_new(pkey, e, -1); 274280297Sjkim} 275238384Sjkim 276238384SjkimEVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e) 277280297Sjkim{ 278280297Sjkim return int_ctx_new(NULL, e, id); 279280297Sjkim} 280238384Sjkim 281238384SjkimEVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *pctx) 282280297Sjkim{ 283280297Sjkim EVP_PKEY_CTX *rctx; 284280297Sjkim if (!pctx->pmeth || !pctx->pmeth->copy) 285280297Sjkim return NULL; 286238384Sjkim#ifndef OPENSSL_NO_ENGINE 287280297Sjkim /* Make sure it's safe to copy a pkey context using an ENGINE */ 288280297Sjkim if (pctx->engine && !ENGINE_init(pctx->engine)) { 289280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_DUP, ERR_R_ENGINE_LIB); 290280297Sjkim return 0; 291280297Sjkim } 292238384Sjkim#endif 293280297Sjkim rctx = OPENSSL_malloc(sizeof(EVP_PKEY_CTX)); 294280297Sjkim if (!rctx) 295280297Sjkim return NULL; 296238384Sjkim 297280297Sjkim rctx->pmeth = pctx->pmeth; 298238384Sjkim#ifndef OPENSSL_NO_ENGINE 299280297Sjkim rctx->engine = pctx->engine; 300238384Sjkim#endif 301238384Sjkim 302280297Sjkim if (pctx->pkey) 303280297Sjkim CRYPTO_add(&pctx->pkey->references, 1, CRYPTO_LOCK_EVP_PKEY); 304238384Sjkim 305280297Sjkim rctx->pkey = pctx->pkey; 306238384Sjkim 307280297Sjkim if (pctx->peerkey) 308280297Sjkim CRYPTO_add(&pctx->peerkey->references, 1, CRYPTO_LOCK_EVP_PKEY); 309238384Sjkim 310280297Sjkim rctx->peerkey = pctx->peerkey; 311238384Sjkim 312280297Sjkim rctx->data = NULL; 313280297Sjkim rctx->app_data = NULL; 314280297Sjkim rctx->operation = pctx->operation; 315238384Sjkim 316280297Sjkim if (pctx->pmeth->copy(rctx, pctx) > 0) 317280297Sjkim return rctx; 318238384Sjkim 319325335Sjkim rctx->pmeth = NULL; 320280297Sjkim EVP_PKEY_CTX_free(rctx); 321280297Sjkim return NULL; 322238384Sjkim 323280297Sjkim} 324238384Sjkim 325238384Sjkimint EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth) 326280297Sjkim{ 327280297Sjkim if (app_pkey_methods == NULL) { 328280297Sjkim app_pkey_methods = sk_EVP_PKEY_METHOD_new(pmeth_cmp); 329280297Sjkim if (!app_pkey_methods) 330280297Sjkim return 0; 331280297Sjkim } 332280297Sjkim if (!sk_EVP_PKEY_METHOD_push(app_pkey_methods, pmeth)) 333280297Sjkim return 0; 334280297Sjkim sk_EVP_PKEY_METHOD_sort(app_pkey_methods); 335280297Sjkim return 1; 336280297Sjkim} 337238384Sjkim 338238384Sjkimvoid EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx) 339280297Sjkim{ 340280297Sjkim if (ctx == NULL) 341280297Sjkim return; 342280297Sjkim if (ctx->pmeth && ctx->pmeth->cleanup) 343280297Sjkim ctx->pmeth->cleanup(ctx); 344280297Sjkim if (ctx->pkey) 345280297Sjkim EVP_PKEY_free(ctx->pkey); 346280297Sjkim if (ctx->peerkey) 347280297Sjkim EVP_PKEY_free(ctx->peerkey); 348238384Sjkim#ifndef OPENSSL_NO_ENGINE 349280297Sjkim if (ctx->engine) 350280297Sjkim /* 351280297Sjkim * The EVP_PKEY_CTX we used belongs to an ENGINE, release the 352280297Sjkim * functional reference we held for this reason. 353280297Sjkim */ 354280297Sjkim ENGINE_finish(ctx->engine); 355238384Sjkim#endif 356280297Sjkim OPENSSL_free(ctx); 357280297Sjkim} 358238384Sjkim 359238384Sjkimint EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, 360280297Sjkim int cmd, int p1, void *p2) 361280297Sjkim{ 362280297Sjkim int ret; 363280297Sjkim if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl) { 364280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED); 365280297Sjkim return -2; 366280297Sjkim } 367280297Sjkim if ((keytype != -1) && (ctx->pmeth->pkey_id != keytype)) 368280297Sjkim return -1; 369238384Sjkim 370280297Sjkim if (ctx->operation == EVP_PKEY_OP_UNDEFINED) { 371280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_NO_OPERATION_SET); 372280297Sjkim return -1; 373280297Sjkim } 374238384Sjkim 375280297Sjkim if ((optype != -1) && !(ctx->operation & optype)) { 376280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_INVALID_OPERATION); 377280297Sjkim return -1; 378280297Sjkim } 379238384Sjkim 380280297Sjkim ret = ctx->pmeth->ctrl(ctx, cmd, p1, p2); 381238384Sjkim 382280297Sjkim if (ret == -2) 383280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED); 384238384Sjkim 385280297Sjkim return ret; 386238384Sjkim 387280297Sjkim} 388238384Sjkim 389238384Sjkimint EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, 390280297Sjkim const char *name, const char *value) 391280297Sjkim{ 392280297Sjkim if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl_str) { 393280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR, EVP_R_COMMAND_NOT_SUPPORTED); 394280297Sjkim return -2; 395280297Sjkim } 396280297Sjkim if (!strcmp(name, "digest")) { 397280297Sjkim const EVP_MD *md; 398280297Sjkim if (!value || !(md = EVP_get_digestbyname(value))) { 399280297Sjkim EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR, EVP_R_INVALID_DIGEST); 400280297Sjkim return 0; 401280297Sjkim } 402280297Sjkim return EVP_PKEY_CTX_set_signature_md(ctx, md); 403280297Sjkim } 404280297Sjkim return ctx->pmeth->ctrl_str(ctx, name, value); 405280297Sjkim} 406238384Sjkim 407238384Sjkimint EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx) 408280297Sjkim{ 409280297Sjkim return ctx->operation; 410280297Sjkim} 411238384Sjkim 412238384Sjkimvoid EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen) 413280297Sjkim{ 414280297Sjkim ctx->keygen_info = dat; 415280297Sjkim ctx->keygen_info_count = datlen; 416280297Sjkim} 417238384Sjkim 418238384Sjkimvoid EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data) 419280297Sjkim{ 420280297Sjkim ctx->data = data; 421280297Sjkim} 422238384Sjkim 423238384Sjkimvoid *EVP_PKEY_CTX_get_data(EVP_PKEY_CTX *ctx) 424280297Sjkim{ 425280297Sjkim return ctx->data; 426280297Sjkim} 427238384Sjkim 428238384SjkimEVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx) 429280297Sjkim{ 430280297Sjkim return ctx->pkey; 431280297Sjkim} 432238384Sjkim 433238384SjkimEVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx) 434280297Sjkim{ 435280297Sjkim return ctx->peerkey; 436280297Sjkim} 437280297Sjkim 438238384Sjkimvoid EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data) 439280297Sjkim{ 440280297Sjkim ctx->app_data = data; 441280297Sjkim} 442238384Sjkim 443238384Sjkimvoid *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx) 444280297Sjkim{ 445280297Sjkim return ctx->app_data; 446280297Sjkim} 447238384Sjkim 448238384Sjkimvoid EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth, 449280297Sjkim int (*init) (EVP_PKEY_CTX *ctx)) 450280297Sjkim{ 451280297Sjkim pmeth->init = init; 452280297Sjkim} 453238384Sjkim 454238384Sjkimvoid EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth, 455280297Sjkim int (*copy) (EVP_PKEY_CTX *dst, 456280297Sjkim EVP_PKEY_CTX *src)) 457280297Sjkim{ 458280297Sjkim pmeth->copy = copy; 459280297Sjkim} 460238384Sjkim 461238384Sjkimvoid EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth, 462280297Sjkim void (*cleanup) (EVP_PKEY_CTX *ctx)) 463280297Sjkim{ 464280297Sjkim pmeth->cleanup = cleanup; 465280297Sjkim} 466238384Sjkim 467238384Sjkimvoid EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth, 468280297Sjkim int (*paramgen_init) (EVP_PKEY_CTX *ctx), 469280297Sjkim int (*paramgen) (EVP_PKEY_CTX *ctx, 470280297Sjkim EVP_PKEY *pkey)) 471280297Sjkim{ 472280297Sjkim pmeth->paramgen_init = paramgen_init; 473280297Sjkim pmeth->paramgen = paramgen; 474280297Sjkim} 475238384Sjkim 476238384Sjkimvoid EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth, 477280297Sjkim int (*keygen_init) (EVP_PKEY_CTX *ctx), 478280297Sjkim int (*keygen) (EVP_PKEY_CTX *ctx, 479280297Sjkim EVP_PKEY *pkey)) 480280297Sjkim{ 481280297Sjkim pmeth->keygen_init = keygen_init; 482280297Sjkim pmeth->keygen = keygen; 483280297Sjkim} 484238384Sjkim 485238384Sjkimvoid EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth, 486280297Sjkim int (*sign_init) (EVP_PKEY_CTX *ctx), 487280297Sjkim int (*sign) (EVP_PKEY_CTX *ctx, 488280297Sjkim unsigned char *sig, size_t *siglen, 489280297Sjkim const unsigned char *tbs, 490280297Sjkim size_t tbslen)) 491280297Sjkim{ 492280297Sjkim pmeth->sign_init = sign_init; 493280297Sjkim pmeth->sign = sign; 494280297Sjkim} 495238384Sjkim 496238384Sjkimvoid EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth, 497280297Sjkim int (*verify_init) (EVP_PKEY_CTX *ctx), 498280297Sjkim int (*verify) (EVP_PKEY_CTX *ctx, 499280297Sjkim const unsigned char *sig, 500280297Sjkim size_t siglen, 501280297Sjkim const unsigned char *tbs, 502280297Sjkim size_t tbslen)) 503280297Sjkim{ 504280297Sjkim pmeth->verify_init = verify_init; 505280297Sjkim pmeth->verify = verify; 506280297Sjkim} 507238384Sjkim 508238384Sjkimvoid EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth, 509280297Sjkim int (*verify_recover_init) (EVP_PKEY_CTX 510280297Sjkim *ctx), 511280297Sjkim int (*verify_recover) (EVP_PKEY_CTX 512280297Sjkim *ctx, 513280297Sjkim unsigned char 514280297Sjkim *sig, 515280297Sjkim size_t *siglen, 516280297Sjkim const unsigned 517280297Sjkim char *tbs, 518280297Sjkim size_t tbslen)) 519280297Sjkim{ 520280297Sjkim pmeth->verify_recover_init = verify_recover_init; 521280297Sjkim pmeth->verify_recover = verify_recover; 522280297Sjkim} 523238384Sjkim 524238384Sjkimvoid EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth, 525280297Sjkim int (*signctx_init) (EVP_PKEY_CTX *ctx, 526280297Sjkim EVP_MD_CTX *mctx), 527280297Sjkim int (*signctx) (EVP_PKEY_CTX *ctx, 528280297Sjkim unsigned char *sig, 529280297Sjkim size_t *siglen, 530280297Sjkim EVP_MD_CTX *mctx)) 531280297Sjkim{ 532280297Sjkim pmeth->signctx_init = signctx_init; 533280297Sjkim pmeth->signctx = signctx; 534280297Sjkim} 535238384Sjkim 536238384Sjkimvoid EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth, 537280297Sjkim int (*verifyctx_init) (EVP_PKEY_CTX *ctx, 538280297Sjkim EVP_MD_CTX *mctx), 539280297Sjkim int (*verifyctx) (EVP_PKEY_CTX *ctx, 540280297Sjkim const unsigned char *sig, 541280297Sjkim int siglen, 542280297Sjkim EVP_MD_CTX *mctx)) 543280297Sjkim{ 544280297Sjkim pmeth->verifyctx_init = verifyctx_init; 545280297Sjkim pmeth->verifyctx = verifyctx; 546280297Sjkim} 547238384Sjkim 548238384Sjkimvoid EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth, 549280297Sjkim int (*encrypt_init) (EVP_PKEY_CTX *ctx), 550280297Sjkim int (*encryptfn) (EVP_PKEY_CTX *ctx, 551280297Sjkim unsigned char *out, 552280297Sjkim size_t *outlen, 553280297Sjkim const unsigned char *in, 554280297Sjkim size_t inlen)) 555280297Sjkim{ 556280297Sjkim pmeth->encrypt_init = encrypt_init; 557280297Sjkim pmeth->encrypt = encryptfn; 558280297Sjkim} 559238384Sjkim 560238384Sjkimvoid EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth, 561280297Sjkim int (*decrypt_init) (EVP_PKEY_CTX *ctx), 562280297Sjkim int (*decrypt) (EVP_PKEY_CTX *ctx, 563280297Sjkim unsigned char *out, 564280297Sjkim size_t *outlen, 565280297Sjkim const unsigned char *in, 566280297Sjkim size_t inlen)) 567280297Sjkim{ 568280297Sjkim pmeth->decrypt_init = decrypt_init; 569280297Sjkim pmeth->decrypt = decrypt; 570280297Sjkim} 571238384Sjkim 572238384Sjkimvoid EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth, 573280297Sjkim int (*derive_init) (EVP_PKEY_CTX *ctx), 574280297Sjkim int (*derive) (EVP_PKEY_CTX *ctx, 575280297Sjkim unsigned char *key, 576280297Sjkim size_t *keylen)) 577280297Sjkim{ 578280297Sjkim pmeth->derive_init = derive_init; 579280297Sjkim pmeth->derive = derive; 580280297Sjkim} 581238384Sjkim 582238384Sjkimvoid EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth, 583280297Sjkim int (*ctrl) (EVP_PKEY_CTX *ctx, int type, int p1, 584280297Sjkim void *p2), 585280297Sjkim int (*ctrl_str) (EVP_PKEY_CTX *ctx, 586280297Sjkim const char *type, 587280297Sjkim const char *value)) 588280297Sjkim{ 589280297Sjkim pmeth->ctrl = ctrl; 590280297Sjkim pmeth->ctrl_str = ctrl_str; 591280297Sjkim} 592325337Sjkim 593325337Sjkimvoid EVP_PKEY_meth_get_init(EVP_PKEY_METHOD *pmeth, 594325337Sjkim int (**pinit) (EVP_PKEY_CTX *ctx)) 595325337Sjkim{ 596325337Sjkim *pinit = pmeth->init; 597325337Sjkim} 598325337Sjkim 599325337Sjkimvoid EVP_PKEY_meth_get_copy(EVP_PKEY_METHOD *pmeth, 600325337Sjkim int (**pcopy) (EVP_PKEY_CTX *dst, 601325337Sjkim EVP_PKEY_CTX *src)) 602325337Sjkim{ 603325337Sjkim *pcopy = pmeth->copy; 604325337Sjkim} 605325337Sjkim 606325337Sjkimvoid EVP_PKEY_meth_get_cleanup(EVP_PKEY_METHOD *pmeth, 607325337Sjkim void (**pcleanup) (EVP_PKEY_CTX *ctx)) 608325337Sjkim{ 609325337Sjkim *pcleanup = pmeth->cleanup; 610325337Sjkim} 611325337Sjkim 612325337Sjkimvoid EVP_PKEY_meth_get_paramgen(EVP_PKEY_METHOD *pmeth, 613325337Sjkim int (**pparamgen_init) (EVP_PKEY_CTX *ctx), 614325337Sjkim int (**pparamgen) (EVP_PKEY_CTX *ctx, 615325337Sjkim EVP_PKEY *pkey)) 616325337Sjkim{ 617325337Sjkim if (pparamgen_init) 618325337Sjkim *pparamgen_init = pmeth->paramgen_init; 619325337Sjkim if (pparamgen) 620325337Sjkim *pparamgen = pmeth->paramgen; 621325337Sjkim} 622325337Sjkim 623325337Sjkimvoid EVP_PKEY_meth_get_keygen(EVP_PKEY_METHOD *pmeth, 624325337Sjkim int (**pkeygen_init) (EVP_PKEY_CTX *ctx), 625325337Sjkim int (**pkeygen) (EVP_PKEY_CTX *ctx, 626325337Sjkim EVP_PKEY *pkey)) 627325337Sjkim{ 628325337Sjkim if (pkeygen_init) 629325337Sjkim *pkeygen_init = pmeth->keygen_init; 630325337Sjkim if (pkeygen) 631325337Sjkim *pkeygen = pmeth->keygen; 632325337Sjkim} 633325337Sjkim 634325337Sjkimvoid EVP_PKEY_meth_get_sign(EVP_PKEY_METHOD *pmeth, 635325337Sjkim int (**psign_init) (EVP_PKEY_CTX *ctx), 636325337Sjkim int (**psign) (EVP_PKEY_CTX *ctx, 637325337Sjkim unsigned char *sig, size_t *siglen, 638325337Sjkim const unsigned char *tbs, 639325337Sjkim size_t tbslen)) 640325337Sjkim{ 641325337Sjkim if (psign_init) 642325337Sjkim *psign_init = pmeth->sign_init; 643325337Sjkim if (psign) 644325337Sjkim *psign = pmeth->sign; 645325337Sjkim} 646325337Sjkim 647325337Sjkimvoid EVP_PKEY_meth_get_verify(EVP_PKEY_METHOD *pmeth, 648325337Sjkim int (**pverify_init) (EVP_PKEY_CTX *ctx), 649325337Sjkim int (**pverify) (EVP_PKEY_CTX *ctx, 650325337Sjkim const unsigned char *sig, 651325337Sjkim size_t siglen, 652325337Sjkim const unsigned char *tbs, 653325337Sjkim size_t tbslen)) 654325337Sjkim{ 655325337Sjkim if (pverify_init) 656325337Sjkim *pverify_init = pmeth->verify_init; 657325337Sjkim if (pverify) 658325337Sjkim *pverify = pmeth->verify; 659325337Sjkim} 660325337Sjkim 661325337Sjkimvoid EVP_PKEY_meth_get_verify_recover(EVP_PKEY_METHOD *pmeth, 662325337Sjkim int (**pverify_recover_init) (EVP_PKEY_CTX 663325337Sjkim *ctx), 664325337Sjkim int (**pverify_recover) (EVP_PKEY_CTX 665325337Sjkim *ctx, 666325337Sjkim unsigned char 667325337Sjkim *sig, 668325337Sjkim size_t *siglen, 669325337Sjkim const unsigned 670325337Sjkim char *tbs, 671325337Sjkim size_t tbslen)) 672325337Sjkim{ 673325337Sjkim if (pverify_recover_init) 674325337Sjkim *pverify_recover_init = pmeth->verify_recover_init; 675325337Sjkim if (pverify_recover) 676325337Sjkim *pverify_recover = pmeth->verify_recover; 677325337Sjkim} 678325337Sjkim 679325337Sjkimvoid EVP_PKEY_meth_get_signctx(EVP_PKEY_METHOD *pmeth, 680325337Sjkim int (**psignctx_init) (EVP_PKEY_CTX *ctx, 681325337Sjkim EVP_MD_CTX *mctx), 682325337Sjkim int (**psignctx) (EVP_PKEY_CTX *ctx, 683325337Sjkim unsigned char *sig, 684325337Sjkim size_t *siglen, 685325337Sjkim EVP_MD_CTX *mctx)) 686325337Sjkim{ 687325337Sjkim if (psignctx_init) 688325337Sjkim *psignctx_init = pmeth->signctx_init; 689325337Sjkim if (psignctx) 690325337Sjkim *psignctx = pmeth->signctx; 691325337Sjkim} 692325337Sjkim 693325337Sjkimvoid EVP_PKEY_meth_get_verifyctx(EVP_PKEY_METHOD *pmeth, 694325337Sjkim int (**pverifyctx_init) (EVP_PKEY_CTX *ctx, 695325337Sjkim EVP_MD_CTX *mctx), 696325337Sjkim int (**pverifyctx) (EVP_PKEY_CTX *ctx, 697325337Sjkim const unsigned char *sig, 698325337Sjkim int siglen, 699325337Sjkim EVP_MD_CTX *mctx)) 700325337Sjkim{ 701325337Sjkim if (pverifyctx_init) 702325337Sjkim *pverifyctx_init = pmeth->verifyctx_init; 703325337Sjkim if (pverifyctx) 704325337Sjkim *pverifyctx = pmeth->verifyctx; 705325337Sjkim} 706325337Sjkim 707325337Sjkimvoid EVP_PKEY_meth_get_encrypt(EVP_PKEY_METHOD *pmeth, 708325337Sjkim int (**pencrypt_init) (EVP_PKEY_CTX *ctx), 709325337Sjkim int (**pencryptfn) (EVP_PKEY_CTX *ctx, 710325337Sjkim unsigned char *out, 711325337Sjkim size_t *outlen, 712325337Sjkim const unsigned char *in, 713325337Sjkim size_t inlen)) 714325337Sjkim{ 715325337Sjkim if (pencrypt_init) 716325337Sjkim *pencrypt_init = pmeth->encrypt_init; 717325337Sjkim if (pencryptfn) 718325337Sjkim *pencryptfn = pmeth->encrypt; 719325337Sjkim} 720325337Sjkim 721325337Sjkimvoid EVP_PKEY_meth_get_decrypt(EVP_PKEY_METHOD *pmeth, 722325337Sjkim int (**pdecrypt_init) (EVP_PKEY_CTX *ctx), 723325337Sjkim int (**pdecrypt) (EVP_PKEY_CTX *ctx, 724325337Sjkim unsigned char *out, 725325337Sjkim size_t *outlen, 726325337Sjkim const unsigned char *in, 727325337Sjkim size_t inlen)) 728325337Sjkim{ 729325337Sjkim if (pdecrypt_init) 730325337Sjkim *pdecrypt_init = pmeth->decrypt_init; 731325337Sjkim if (pdecrypt) 732325337Sjkim *pdecrypt = pmeth->decrypt; 733325337Sjkim} 734325337Sjkim 735325337Sjkimvoid EVP_PKEY_meth_get_derive(EVP_PKEY_METHOD *pmeth, 736325337Sjkim int (**pderive_init) (EVP_PKEY_CTX *ctx), 737325337Sjkim int (**pderive) (EVP_PKEY_CTX *ctx, 738325337Sjkim unsigned char *key, 739325337Sjkim size_t *keylen)) 740325337Sjkim{ 741325337Sjkim if (pderive_init) 742325337Sjkim *pderive_init = pmeth->derive_init; 743325337Sjkim if (pderive) 744325337Sjkim *pderive = pmeth->derive; 745325337Sjkim} 746325337Sjkim 747325337Sjkimvoid EVP_PKEY_meth_get_ctrl(EVP_PKEY_METHOD *pmeth, 748325337Sjkim int (**pctrl) (EVP_PKEY_CTX *ctx, int type, int p1, 749325337Sjkim void *p2), 750325337Sjkim int (**pctrl_str) (EVP_PKEY_CTX *ctx, 751325337Sjkim const char *type, 752325337Sjkim const char *value)) 753325337Sjkim{ 754325337Sjkim if (pctrl) 755325337Sjkim *pctrl = pmeth->ctrl; 756325337Sjkim if (pctrl_str) 757325337Sjkim *pctrl_str = pmeth->ctrl_str; 758325337Sjkim} 759