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