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