]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/evp/pmeth_lib.c
remove test/.rnd on make clean
[thirdparty/openssl.git] / crypto / evp / pmeth_lib.c
CommitLineData
0f113f3e 1/*
62867571 2 * Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved.
0b6f3c66 3 *
62867571
RS
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
0b6f3c66
DSH
8 */
9
10#include <stdio.h>
11#include <stdlib.h>
b39fc560 12#include "internal/cryptlib.h"
3c27208f 13#include <openssl/engine.h>
33bed28b 14#include <openssl/evp.h>
99119000 15#include <openssl/x509v3.h>
5fe736e5 16#include "internal/asn1_int.h"
27af42f9 17#include "internal/evp_int.h"
99119000 18#include "internal/numbers.h"
0b6f3c66 19
0f113f3e 20typedef int sk_cmp_fn_type(const char *const *a, const char *const *b);
5ce278a7 21
df2ee0e2 22static STACK_OF(EVP_PKEY_METHOD) *app_pkey_methods = NULL;
0b6f3c66 23
0f113f3e 24static const EVP_PKEY_METHOD *standard_methods[] = {
d4f0339c 25#ifndef OPENSSL_NO_RSA
0f113f3e 26 &rsa_pkey_meth,
d4f0339c
DSH
27#endif
28#ifndef OPENSSL_NO_DH
0f113f3e 29 &dh_pkey_meth,
d4f0339c
DSH
30#endif
31#ifndef OPENSSL_NO_DSA
0f113f3e 32 &dsa_pkey_meth,
d4f0339c 33#endif
ef236ec3 34#ifndef OPENSSL_NO_EC
0f113f3e 35 &ec_pkey_meth,
ef236ec3 36#endif
0f113f3e 37 &hmac_pkey_meth,
b4a3aeeb 38#ifndef OPENSSL_NO_CMAC
0f113f3e 39 &cmac_pkey_meth,
b4a3aeeb 40#endif
6577e008
DSH
41#ifndef OPENSSL_NO_RSA
42 &rsa_pss_pkey_meth,
43#endif
afb14cda 44#ifndef OPENSSL_NO_DH
1eff3485 45 &dhx_pkey_meth,
afb14cda 46#endif
aacfb134 47 &tls1_prf_pkey_meth,
262bd85f
DSH
48#ifndef OPENSSL_NO_EC
49 &ecx25519_pkey_meth,
50#endif
52ad5b60
TS
51 &hkdf_pkey_meth,
52#ifndef OPENSSL_NO_POLY1305
53 &poly1305_pkey_meth,
54#endif
0f113f3e 55};
0b6f3c66 56
606f6c47 57DECLARE_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_METHOD *, const EVP_PKEY_METHOD *,
0f113f3e 58 pmeth);
babb3798 59
0f113f3e
MC
60static int pmeth_cmp(const EVP_PKEY_METHOD *const *a,
61 const EVP_PKEY_METHOD *const *b)
62{
63 return ((*a)->pkey_id - (*b)->pkey_id);
64}
0b6f3c66 65
606f6c47 66IMPLEMENT_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_METHOD *, const EVP_PKEY_METHOD *,
0f113f3e 67 pmeth);
babb3798 68
c9777d26 69const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type)
0f113f3e
MC
70{
71 EVP_PKEY_METHOD tmp;
72 const EVP_PKEY_METHOD *t = &tmp, **ret;
73 tmp.pkey_id = type;
74 if (app_pkey_methods) {
75 int idx;
76 idx = sk_EVP_PKEY_METHOD_find(app_pkey_methods, &tmp);
77 if (idx >= 0)
78 return sk_EVP_PKEY_METHOD_value(app_pkey_methods, idx);
79 }
80 ret = OBJ_bsearch_pmeth(&t, standard_methods,
81 sizeof(standard_methods) /
82 sizeof(EVP_PKEY_METHOD *));
83 if (!ret || !*ret)
84 return NULL;
85 return *ret;
86}
0b6f3c66 87
f5cda4cb 88static EVP_PKEY_CTX *int_ctx_new(EVP_PKEY *pkey, ENGINE *e, int id)
0f113f3e
MC
89{
90 EVP_PKEY_CTX *ret;
91 const EVP_PKEY_METHOD *pmeth;
92 if (id == -1) {
93 if (!pkey || !pkey->ameth)
94 return NULL;
95 id = pkey->ameth->pkey_id;
96 }
a63bf2c5 97#ifndef OPENSSL_NO_ENGINE
0f113f3e
MC
98 if (pkey && pkey->engine)
99 e = pkey->engine;
100 /* Try to find an ENGINE which implements this method */
101 if (e) {
102 if (!ENGINE_init(e)) {
103 EVPerr(EVP_F_INT_CTX_NEW, ERR_R_ENGINE_LIB);
104 return NULL;
105 }
106 } else
107 e = ENGINE_get_pkey_meth_engine(id);
108
109 /*
0d4fb843 110 * If an ENGINE handled this method look it up. Otherwise use internal
0f113f3e
MC
111 * tables.
112 */
113
114 if (e)
115 pmeth = ENGINE_get_pkey_meth(e, id);
116 else
a63bf2c5 117#endif
0f113f3e 118 pmeth = EVP_PKEY_meth_find(id);
c9777d26 119
0f113f3e
MC
120 if (pmeth == NULL) {
121 EVPerr(EVP_F_INT_CTX_NEW, EVP_R_UNSUPPORTED_ALGORITHM);
122 return NULL;
123 }
c9777d26 124
64b25758 125 ret = OPENSSL_zalloc(sizeof(*ret));
90945fa3 126 if (ret == NULL) {
a63bf2c5 127#ifndef OPENSSL_NO_ENGINE
7c96dbcd 128 ENGINE_finish(e);
a63bf2c5 129#endif
0f113f3e
MC
130 EVPerr(EVP_F_INT_CTX_NEW, ERR_R_MALLOC_FAILURE);
131 return NULL;
132 }
133 ret->engine = e;
134 ret->pmeth = pmeth;
135 ret->operation = EVP_PKEY_OP_UNDEFINED;
136 ret->pkey = pkey;
0f113f3e 137 if (pkey)
03273d61 138 EVP_PKEY_up_ref(pkey);
0f113f3e
MC
139
140 if (pmeth->init) {
141 if (pmeth->init(ret) <= 0) {
142 EVP_PKEY_CTX_free(ret);
143 return NULL;
144 }
145 }
146
147 return ret;
148}
149
150EVP_PKEY_METHOD *EVP_PKEY_meth_new(int id, int flags)
151{
152 EVP_PKEY_METHOD *pmeth;
b4faea50 153
b51bce94 154 pmeth = OPENSSL_zalloc(sizeof(*pmeth));
90945fa3 155 if (pmeth == NULL)
0f113f3e
MC
156 return NULL;
157
0f113f3e
MC
158 pmeth->pkey_id = id;
159 pmeth->flags = flags | EVP_PKEY_FLAG_DYNAMIC;
0f113f3e
MC
160 return pmeth;
161}
ba30bad5 162
f830c68f 163void EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags,
0f113f3e
MC
164 const EVP_PKEY_METHOD *meth)
165{
166 if (ppkey_id)
167 *ppkey_id = meth->pkey_id;
168 if (pflags)
169 *pflags = meth->flags;
170}
f830c68f
DSH
171
172void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src)
0f113f3e 173{
f830c68f 174
0f113f3e
MC
175 dst->init = src->init;
176 dst->copy = src->copy;
177 dst->cleanup = src->cleanup;
f830c68f 178
0f113f3e
MC
179 dst->paramgen_init = src->paramgen_init;
180 dst->paramgen = src->paramgen;
f830c68f 181
0f113f3e
MC
182 dst->keygen_init = src->keygen_init;
183 dst->keygen = src->keygen;
f830c68f 184
0f113f3e
MC
185 dst->sign_init = src->sign_init;
186 dst->sign = src->sign;
f830c68f 187
0f113f3e
MC
188 dst->verify_init = src->verify_init;
189 dst->verify = src->verify;
f830c68f 190
0f113f3e
MC
191 dst->verify_recover_init = src->verify_recover_init;
192 dst->verify_recover = src->verify_recover;
f830c68f 193
0f113f3e
MC
194 dst->signctx_init = src->signctx_init;
195 dst->signctx = src->signctx;
f830c68f 196
0f113f3e
MC
197 dst->verifyctx_init = src->verifyctx_init;
198 dst->verifyctx = src->verifyctx;
f830c68f 199
0f113f3e
MC
200 dst->encrypt_init = src->encrypt_init;
201 dst->encrypt = src->encrypt;
f830c68f 202
0f113f3e
MC
203 dst->decrypt_init = src->decrypt_init;
204 dst->decrypt = src->decrypt;
f830c68f 205
0f113f3e
MC
206 dst->derive_init = src->derive_init;
207 dst->derive = src->derive;
f830c68f 208
0f113f3e
MC
209 dst->ctrl = src->ctrl;
210 dst->ctrl_str = src->ctrl_str;
211}
f830c68f 212
ba30bad5 213void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth)
0f113f3e
MC
214{
215 if (pmeth && (pmeth->flags & EVP_PKEY_FLAG_DYNAMIC))
216 OPENSSL_free(pmeth);
217}
ba30bad5 218
f5cda4cb 219EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e)
0f113f3e
MC
220{
221 return int_ctx_new(pkey, e, -1);
222}
f5cda4cb
DSH
223
224EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e)
0f113f3e
MC
225{
226 return int_ctx_new(NULL, e, id);
227}
f5cda4cb 228
8bdcef40 229EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *pctx)
0f113f3e
MC
230{
231 EVP_PKEY_CTX *rctx;
232 if (!pctx->pmeth || !pctx->pmeth->copy)
233 return NULL;
c9777d26 234#ifndef OPENSSL_NO_ENGINE
0f113f3e
MC
235 /* Make sure it's safe to copy a pkey context using an ENGINE */
236 if (pctx->engine && !ENGINE_init(pctx->engine)) {
237 EVPerr(EVP_F_EVP_PKEY_CTX_DUP, ERR_R_ENGINE_LIB);
238 return 0;
239 }
c9777d26 240#endif
b4faea50 241 rctx = OPENSSL_malloc(sizeof(*rctx));
90945fa3 242 if (rctx == NULL)
0f113f3e 243 return NULL;
8bdcef40 244
0f113f3e 245 rctx->pmeth = pctx->pmeth;
c9777d26 246#ifndef OPENSSL_NO_ENGINE
0f113f3e 247 rctx->engine = pctx->engine;
c9777d26 248#endif
8bdcef40 249
0f113f3e 250 if (pctx->pkey)
03273d61 251 EVP_PKEY_up_ref(pctx->pkey);
944f8580 252
0f113f3e 253 rctx->pkey = pctx->pkey;
8bdcef40 254
0f113f3e 255 if (pctx->peerkey)
03273d61 256 EVP_PKEY_up_ref(pctx->peerkey);
944f8580 257
0f113f3e 258 rctx->peerkey = pctx->peerkey;
8bdcef40 259
0f113f3e
MC
260 rctx->data = NULL;
261 rctx->app_data = NULL;
262 rctx->operation = pctx->operation;
8bdcef40 263
0f113f3e
MC
264 if (pctx->pmeth->copy(rctx, pctx) > 0)
265 return rctx;
8bdcef40 266
0f113f3e
MC
267 EVP_PKEY_CTX_free(rctx);
268 return NULL;
8bdcef40 269
0f113f3e 270}
8bdcef40 271
ba30bad5 272int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth)
0f113f3e
MC
273{
274 if (app_pkey_methods == NULL) {
275 app_pkey_methods = sk_EVP_PKEY_METHOD_new(pmeth_cmp);
90945fa3 276 if (app_pkey_methods == NULL)
0f113f3e
MC
277 return 0;
278 }
279 if (!sk_EVP_PKEY_METHOD_push(app_pkey_methods, pmeth))
280 return 0;
281 sk_EVP_PKEY_METHOD_sort(app_pkey_methods);
282 return 1;
283}
ba30bad5 284
5da98aa6 285void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx)
0f113f3e
MC
286{
287 if (ctx == NULL)
288 return;
289 if (ctx->pmeth && ctx->pmeth->cleanup)
290 ctx->pmeth->cleanup(ctx);
c5ba2d99
RS
291 EVP_PKEY_free(ctx->pkey);
292 EVP_PKEY_free(ctx->peerkey);
c9777d26 293#ifndef OPENSSL_NO_ENGINE
7c96dbcd 294 ENGINE_finish(ctx->engine);
c9777d26 295#endif
0f113f3e
MC
296 OPENSSL_free(ctx);
297}
5da98aa6 298
0b6f3c66 299int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype,
0f113f3e
MC
300 int cmd, int p1, void *p2)
301{
302 int ret;
303 if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl) {
304 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED);
305 return -2;
306 }
307 if ((keytype != -1) && (ctx->pmeth->pkey_id != keytype))
308 return -1;
309
310 if (ctx->operation == EVP_PKEY_OP_UNDEFINED) {
311 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_NO_OPERATION_SET);
312 return -1;
313 }
314
315 if ((optype != -1) && !(ctx->operation & optype)) {
316 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_INVALID_OPERATION);
317 return -1;
318 }
319
320 ret = ctx->pmeth->ctrl(ctx, cmd, p1, p2);
321
322 if (ret == -2)
323 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED);
324
325 return ret;
326
327}
0b6f3c66 328
4a3dc3c0 329int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx,
0f113f3e
MC
330 const char *name, const char *value)
331{
332 if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl_str) {
333 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR, EVP_R_COMMAND_NOT_SUPPORTED);
334 return -2;
335 }
410877ba
DSH
336 if (strcmp(name, "digest") == 0)
337 return EVP_PKEY_CTX_md(ctx, EVP_PKEY_OP_TYPE_SIG, EVP_PKEY_CTRL_MD,
338 value);
0f113f3e
MC
339 return ctx->pmeth->ctrl_str(ctx, name, value);
340}
f5cda4cb 341
99119000
DSH
342/* Utility functions to send a string of hex string to a ctrl */
343
344int EVP_PKEY_CTX_str2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *str)
345{
346 size_t len;
347
348 len = strlen(str);
349 if (len > INT_MAX)
350 return -1;
351 return ctx->pmeth->ctrl(ctx, cmd, len, (void *)str);
352}
353
354int EVP_PKEY_CTX_hex2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *hex)
355{
356 unsigned char *bin;
357 long binlen;
358 int rv = -1;
359
14f051a0 360 bin = OPENSSL_hexstr2buf(hex, &binlen);
99119000
DSH
361 if (bin == NULL)
362 return 0;
363 if (binlen <= INT_MAX)
364 rv = ctx->pmeth->ctrl(ctx, cmd, binlen, bin);
365 OPENSSL_free(bin);
366 return rv;
367}
52ad523c 368
410877ba
DSH
369/* Pass a message digest to a ctrl */
370int EVP_PKEY_CTX_md(EVP_PKEY_CTX *ctx, int optype, int cmd, const char *md)
371{
372 const EVP_MD *m;
c82bafc5 373
410877ba
DSH
374 if (md == NULL || (m = EVP_get_digestbyname(md)) == NULL) {
375 EVPerr(EVP_F_EVP_PKEY_CTX_MD, EVP_R_INVALID_DIGEST);
376 return 0;
377 }
378 return EVP_PKEY_CTX_ctrl(ctx, -1, optype, cmd, 0, (void *)m);
379}
99119000 380
b28dea4e 381int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx)
0f113f3e
MC
382{
383 return ctx->operation;
384}
b28dea4e
DSH
385
386void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen)
0f113f3e
MC
387{
388 ctx->keygen_info = dat;
389 ctx->keygen_info_count = datlen;
390}
b28dea4e 391
f5cda4cb 392void EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data)
0f113f3e
MC
393{
394 ctx->data = data;
395}
f5cda4cb
DSH
396
397void *EVP_PKEY_CTX_get_data(EVP_PKEY_CTX *ctx)
0f113f3e
MC
398{
399 return ctx->data;
400}
f5cda4cb 401
81cebb8b 402EVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx)
0f113f3e
MC
403{
404 return ctx->pkey;
405}
81cebb8b 406
0e1dba93 407EVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx)
0f113f3e
MC
408{
409 return ctx->peerkey;
410}
411
f5cda4cb 412void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data)
0f113f3e
MC
413{
414 ctx->app_data = data;
415}
f5cda4cb
DSH
416
417void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx)
0f113f3e
MC
418{
419 return ctx->app_data;
420}
ba30bad5
DSH
421
422void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
423 int (*init) (EVP_PKEY_CTX *ctx))
424{
425 pmeth->init = init;
426}
8bdcef40
DSH
427
428void EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
429 int (*copy) (EVP_PKEY_CTX *dst,
430 EVP_PKEY_CTX *src))
431{
432 pmeth->copy = copy;
433}
ba30bad5
DSH
434
435void EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
436 void (*cleanup) (EVP_PKEY_CTX *ctx))
437{
438 pmeth->cleanup = cleanup;
439}
ba30bad5
DSH
440
441void EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
442 int (*paramgen_init) (EVP_PKEY_CTX *ctx),
443 int (*paramgen) (EVP_PKEY_CTX *ctx,
444 EVP_PKEY *pkey))
445{
446 pmeth->paramgen_init = paramgen_init;
447 pmeth->paramgen = paramgen;
448}
ba30bad5
DSH
449
450void EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
451 int (*keygen_init) (EVP_PKEY_CTX *ctx),
452 int (*keygen) (EVP_PKEY_CTX *ctx,
453 EVP_PKEY *pkey))
454{
455 pmeth->keygen_init = keygen_init;
456 pmeth->keygen = keygen;
457}
ba30bad5
DSH
458
459void EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
460 int (*sign_init) (EVP_PKEY_CTX *ctx),
461 int (*sign) (EVP_PKEY_CTX *ctx,
462 unsigned char *sig, size_t *siglen,
463 const unsigned char *tbs,
464 size_t tbslen))
465{
466 pmeth->sign_init = sign_init;
467 pmeth->sign = sign;
468}
ba30bad5
DSH
469
470void EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
471 int (*verify_init) (EVP_PKEY_CTX *ctx),
472 int (*verify) (EVP_PKEY_CTX *ctx,
473 const unsigned char *sig,
474 size_t siglen,
475 const unsigned char *tbs,
476 size_t tbslen))
477{
478 pmeth->verify_init = verify_init;
479 pmeth->verify = verify;
480}
ba30bad5
DSH
481
482void EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
483 int (*verify_recover_init) (EVP_PKEY_CTX
484 *ctx),
485 int (*verify_recover) (EVP_PKEY_CTX
486 *ctx,
487 unsigned char
488 *sig,
489 size_t *siglen,
490 const unsigned
491 char *tbs,
492 size_t tbslen))
493{
494 pmeth->verify_recover_init = verify_recover_init;
495 pmeth->verify_recover = verify_recover;
496}
ba30bad5
DSH
497
498void EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
499 int (*signctx_init) (EVP_PKEY_CTX *ctx,
500 EVP_MD_CTX *mctx),
501 int (*signctx) (EVP_PKEY_CTX *ctx,
502 unsigned char *sig,
503 size_t *siglen,
504 EVP_MD_CTX *mctx))
505{
506 pmeth->signctx_init = signctx_init;
507 pmeth->signctx = signctx;
508}
ba30bad5
DSH
509
510void EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
511 int (*verifyctx_init) (EVP_PKEY_CTX *ctx,
512 EVP_MD_CTX *mctx),
513 int (*verifyctx) (EVP_PKEY_CTX *ctx,
514 const unsigned char *sig,
515 int siglen,
516 EVP_MD_CTX *mctx))
517{
518 pmeth->verifyctx_init = verifyctx_init;
519 pmeth->verifyctx = verifyctx;
520}
ba30bad5
DSH
521
522void EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
523 int (*encrypt_init) (EVP_PKEY_CTX *ctx),
524 int (*encryptfn) (EVP_PKEY_CTX *ctx,
525 unsigned char *out,
526 size_t *outlen,
527 const unsigned char *in,
528 size_t inlen))
529{
530 pmeth->encrypt_init = encrypt_init;
531 pmeth->encrypt = encryptfn;
532}
ba30bad5
DSH
533
534void EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
535 int (*decrypt_init) (EVP_PKEY_CTX *ctx),
536 int (*decrypt) (EVP_PKEY_CTX *ctx,
537 unsigned char *out,
538 size_t *outlen,
539 const unsigned char *in,
540 size_t inlen))
541{
542 pmeth->decrypt_init = decrypt_init;
543 pmeth->decrypt = decrypt;
544}
ba30bad5
DSH
545
546void EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
547 int (*derive_init) (EVP_PKEY_CTX *ctx),
548 int (*derive) (EVP_PKEY_CTX *ctx,
549 unsigned char *key,
550 size_t *keylen))
551{
552 pmeth->derive_init = derive_init;
553 pmeth->derive = derive;
554}
ba30bad5
DSH
555
556void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth,
0f113f3e
MC
557 int (*ctrl) (EVP_PKEY_CTX *ctx, int type, int p1,
558 void *p2),
559 int (*ctrl_str) (EVP_PKEY_CTX *ctx,
560 const char *type,
561 const char *value))
562{
563 pmeth->ctrl = ctrl;
564 pmeth->ctrl_str = ctrl_str;
565}
e7451ed1
DSH
566
567void EVP_PKEY_meth_get_init(EVP_PKEY_METHOD *pmeth,
568 int (**pinit) (EVP_PKEY_CTX *ctx))
569{
570 *pinit = pmeth->init;
571}
572
573void EVP_PKEY_meth_get_copy(EVP_PKEY_METHOD *pmeth,
574 int (**pcopy) (EVP_PKEY_CTX *dst,
575 EVP_PKEY_CTX *src))
576{
577 *pcopy = pmeth->copy;
578}
579
580void EVP_PKEY_meth_get_cleanup(EVP_PKEY_METHOD *pmeth,
581 void (**pcleanup) (EVP_PKEY_CTX *ctx))
582{
583 *pcleanup = pmeth->cleanup;
584}
585
586void EVP_PKEY_meth_get_paramgen(EVP_PKEY_METHOD *pmeth,
587 int (**pparamgen_init) (EVP_PKEY_CTX *ctx),
588 int (**pparamgen) (EVP_PKEY_CTX *ctx,
589 EVP_PKEY *pkey))
590{
591 if (pparamgen_init)
592 *pparamgen_init = pmeth->paramgen_init;
593 if (pparamgen)
594 *pparamgen = pmeth->paramgen;
595}
596
597void EVP_PKEY_meth_get_keygen(EVP_PKEY_METHOD *pmeth,
598 int (**pkeygen_init) (EVP_PKEY_CTX *ctx),
599 int (**pkeygen) (EVP_PKEY_CTX *ctx,
600 EVP_PKEY *pkey))
601{
602 if (pkeygen_init)
603 *pkeygen_init = pmeth->keygen_init;
604 if (pkeygen)
605 *pkeygen = pmeth->keygen;
606}
607
608void EVP_PKEY_meth_get_sign(EVP_PKEY_METHOD *pmeth,
609 int (**psign_init) (EVP_PKEY_CTX *ctx),
610 int (**psign) (EVP_PKEY_CTX *ctx,
611 unsigned char *sig, size_t *siglen,
612 const unsigned char *tbs,
613 size_t tbslen))
614{
615 if (psign_init)
616 *psign_init = pmeth->sign_init;
617 if (psign)
618 *psign = pmeth->sign;
619}
620
621void EVP_PKEY_meth_get_verify(EVP_PKEY_METHOD *pmeth,
622 int (**pverify_init) (EVP_PKEY_CTX *ctx),
623 int (**pverify) (EVP_PKEY_CTX *ctx,
624 const unsigned char *sig,
625 size_t siglen,
626 const unsigned char *tbs,
627 size_t tbslen))
628{
629 if (pverify_init)
630 *pverify_init = pmeth->verify_init;
631 if (pverify)
632 *pverify = pmeth->verify;
633}
634
635void EVP_PKEY_meth_get_verify_recover(EVP_PKEY_METHOD *pmeth,
636 int (**pverify_recover_init) (EVP_PKEY_CTX
637 *ctx),
638 int (**pverify_recover) (EVP_PKEY_CTX
639 *ctx,
640 unsigned char
641 *sig,
642 size_t *siglen,
643 const unsigned
644 char *tbs,
645 size_t tbslen))
646{
647 if (pverify_recover_init)
648 *pverify_recover_init = pmeth->verify_recover_init;
649 if (pverify_recover)
650 *pverify_recover = pmeth->verify_recover;
651}
652
653void EVP_PKEY_meth_get_signctx(EVP_PKEY_METHOD *pmeth,
654 int (**psignctx_init) (EVP_PKEY_CTX *ctx,
655 EVP_MD_CTX *mctx),
656 int (**psignctx) (EVP_PKEY_CTX *ctx,
657 unsigned char *sig,
658 size_t *siglen,
659 EVP_MD_CTX *mctx))
660{
661 if (psignctx_init)
662 *psignctx_init = pmeth->signctx_init;
663 if (psignctx)
664 *psignctx = pmeth->signctx;
665}
666
667void EVP_PKEY_meth_get_verifyctx(EVP_PKEY_METHOD *pmeth,
668 int (**pverifyctx_init) (EVP_PKEY_CTX *ctx,
669 EVP_MD_CTX *mctx),
670 int (**pverifyctx) (EVP_PKEY_CTX *ctx,
671 const unsigned char *sig,
672 int siglen,
673 EVP_MD_CTX *mctx))
674{
675 if (pverifyctx_init)
676 *pverifyctx_init = pmeth->verifyctx_init;
677 if (pverifyctx)
678 *pverifyctx = pmeth->verifyctx;
679}
680
681void EVP_PKEY_meth_get_encrypt(EVP_PKEY_METHOD *pmeth,
682 int (**pencrypt_init) (EVP_PKEY_CTX *ctx),
683 int (**pencryptfn) (EVP_PKEY_CTX *ctx,
684 unsigned char *out,
685 size_t *outlen,
686 const unsigned char *in,
687 size_t inlen))
688{
689 if (pencrypt_init)
690 *pencrypt_init = pmeth->encrypt_init;
691 if (pencryptfn)
692 *pencryptfn = pmeth->encrypt;
693}
694
695void EVP_PKEY_meth_get_decrypt(EVP_PKEY_METHOD *pmeth,
696 int (**pdecrypt_init) (EVP_PKEY_CTX *ctx),
697 int (**pdecrypt) (EVP_PKEY_CTX *ctx,
698 unsigned char *out,
699 size_t *outlen,
700 const unsigned char *in,
701 size_t inlen))
702{
703 if (pdecrypt_init)
704 *pdecrypt_init = pmeth->decrypt_init;
705 if (pdecrypt)
706 *pdecrypt = pmeth->decrypt;
707}
708
709void EVP_PKEY_meth_get_derive(EVP_PKEY_METHOD *pmeth,
710 int (**pderive_init) (EVP_PKEY_CTX *ctx),
711 int (**pderive) (EVP_PKEY_CTX *ctx,
712 unsigned char *key,
713 size_t *keylen))
714{
715 if (pderive_init)
716 *pderive_init = pmeth->derive_init;
717 if (pderive)
718 *pderive = pmeth->derive;
719}
720
721void EVP_PKEY_meth_get_ctrl(EVP_PKEY_METHOD *pmeth,
722 int (**pctrl) (EVP_PKEY_CTX *ctx, int type, int p1,
723 void *p2),
724 int (**pctrl_str) (EVP_PKEY_CTX *ctx,
725 const char *type,
726 const char *value))
727{
728 if (pctrl)
729 *pctrl = pmeth->ctrl;
730 if (pctrl_str)
731 *pctrl_str = pmeth->ctrl_str;
732}