48f548c7b6c1a1e064f3f15be17d3e0fc682cd20
[openssl.git] / crypto / evp / evp_utils.c
1 /*
2  * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (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
8  */
9
10 /* Internal EVP utility functions */
11
12 #include <openssl/core.h>
13 #include <openssl/evp.h>
14 #include <openssl/err.h>
15 #include <openssl/asn1.h>        /* evp_locl.h needs it */
16 #include <openssl/safestack.h>   /* evp_locl.h needs it */
17 #include "internal/evp_int.h"    /* evp_locl.h needs it */
18 #include "evp_locl.h"
19
20 int evp_do_ciph_getparams(const void *vciph, void *ignored,
21                           OSSL_PARAM params[])
22 {
23     const EVP_CIPHER *ciph = vciph;
24
25     if (ciph->prov == NULL)
26         return -2;
27     if (ciph->get_params == NULL)
28         return -1;
29     return ciph->get_params(params);
30 }
31
32 int evp_do_ciph_ctx_getparams(const void *vciph, void *provctx,
33                               OSSL_PARAM params[])
34 {
35     const EVP_CIPHER *ciph = vciph;
36
37     if (ciph->prov == NULL)
38         return -2;
39     if (ciph->ctx_get_params == NULL)
40         return -1;
41     return ciph->ctx_get_params(provctx, params);
42 }
43
44 int evp_do_ciph_ctx_setparams(const void *vciph, void *provctx,
45                               OSSL_PARAM params[])
46 {
47     const EVP_CIPHER *ciph = vciph;
48
49     if (ciph->prov == NULL)
50         return -2;
51     if (ciph->ctx_set_params == NULL)
52         return -1;
53     return ciph->ctx_set_params(provctx, params);
54 }
55
56 int evp_do_param(const void *method, void *ptr, size_t sz, const char *key,
57                  int datatype,
58                  int (*cb)(const void *method, void *ctx, OSSL_PARAM params[]),
59                  void *cb_ctx)
60 {
61     OSSL_PARAM params[2] = {
62         OSSL_PARAM_END,
63         OSSL_PARAM_END
64     };
65     int ret;
66
67     params[0].key = key;
68     params[0].data_type = datatype;
69     params[0].data = ptr;
70     params[0].data_size = sz;
71
72     ret = cb(method, cb_ctx, params);
73     if (ret == -1) {
74         EVPerr(0, EVP_R_CTRL_NOT_IMPLEMENTED);
75         ret = 0;
76     }
77     return ret;
78 }