Branch data Line data Source code
1 : : /* pmeth_gn.c */
2 : : /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 : : * project 2006.
4 : : */
5 : : /* ====================================================================
6 : : * Copyright (c) 2006 The OpenSSL Project. All rights reserved.
7 : : *
8 : : * Redistribution and use in source and binary forms, with or without
9 : : * modification, are permitted provided that the following conditions
10 : : * are met:
11 : : *
12 : : * 1. Redistributions of source code must retain the above copyright
13 : : * notice, this list of conditions and the following disclaimer.
14 : : *
15 : : * 2. Redistributions in binary form must reproduce the above copyright
16 : : * notice, this list of conditions and the following disclaimer in
17 : : * the documentation and/or other materials provided with the
18 : : * distribution.
19 : : *
20 : : * 3. All advertising materials mentioning features or use of this
21 : : * software must display the following acknowledgment:
22 : : * "This product includes software developed by the OpenSSL Project
23 : : * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24 : : *
25 : : * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 : : * endorse or promote products derived from this software without
27 : : * prior written permission. For written permission, please contact
28 : : * licensing@OpenSSL.org.
29 : : *
30 : : * 5. Products derived from this software may not be called "OpenSSL"
31 : : * nor may "OpenSSL" appear in their names without prior written
32 : : * permission of the OpenSSL Project.
33 : : *
34 : : * 6. Redistributions of any form whatsoever must retain the following
35 : : * acknowledgment:
36 : : * "This product includes software developed by the OpenSSL Project
37 : : * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38 : : *
39 : : * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 : : * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 : : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 : : * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 : : * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 : : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 : : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 : : * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 : : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 : : * OF THE POSSIBILITY OF SUCH DAMAGE.
51 : : * ====================================================================
52 : : *
53 : : * This product includes cryptographic software written by Eric Young
54 : : * (eay@cryptsoft.com). This product includes software written by Tim
55 : : * Hudson (tjh@cryptsoft.com).
56 : : *
57 : : */
58 : :
59 : : #include <stdio.h>
60 : : #include <stdlib.h>
61 : : #include "cryptlib.h"
62 : : #include <openssl/objects.h>
63 : : #include <openssl/evp.h>
64 : : #include <openssl/bn.h>
65 : : #include "evp_locl.h"
66 : :
67 : 0 : int EVP_PKEY_paramgen_init(EVP_PKEY_CTX *ctx)
68 : : {
69 : : int ret;
70 [ # # ][ # # ]: 0 : if (!ctx || !ctx->pmeth || !ctx->pmeth->paramgen)
[ # # ]
71 : : {
72 : 0 : EVPerr(EVP_F_EVP_PKEY_PARAMGEN_INIT,
73 : : EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
74 : 0 : return -2;
75 : : }
76 : 0 : ctx->operation = EVP_PKEY_OP_PARAMGEN;
77 [ # # ]: 0 : if (!ctx->pmeth->paramgen_init)
78 : : return 1;
79 : 0 : ret = ctx->pmeth->paramgen_init(ctx);
80 [ # # ]: 0 : if (ret <= 0)
81 : 0 : ctx->operation = EVP_PKEY_OP_UNDEFINED;
82 : 0 : return ret;
83 : : }
84 : :
85 : 0 : int EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey)
86 : : {
87 : : int ret;
88 [ # # ][ # # ]: 0 : if (!ctx || !ctx->pmeth || !ctx->pmeth->paramgen)
[ # # ]
89 : : {
90 : 0 : EVPerr(EVP_F_EVP_PKEY_PARAMGEN,
91 : : EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
92 : 0 : return -2;
93 : : }
94 : :
95 [ # # ]: 0 : if (ctx->operation != EVP_PKEY_OP_PARAMGEN)
96 : : {
97 : 0 : EVPerr(EVP_F_EVP_PKEY_PARAMGEN, EVP_R_OPERATON_NOT_INITIALIZED);
98 : 0 : return -1;
99 : : }
100 : :
101 [ # # ]: 0 : if (!ppkey)
102 : : return -1;
103 : :
104 [ # # ]: 0 : if (!*ppkey)
105 : 0 : *ppkey = EVP_PKEY_new();
106 : :
107 : 0 : ret = ctx->pmeth->paramgen(ctx, *ppkey);
108 [ # # ]: 0 : if (ret <= 0)
109 : : {
110 : 0 : EVP_PKEY_free(*ppkey);
111 : 0 : *ppkey = NULL;
112 : : }
113 : 0 : return ret;
114 : : }
115 : :
116 : 16989 : int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx)
117 : : {
118 : : int ret;
119 [ + - ][ + - ]: 16989 : if (!ctx || !ctx->pmeth || !ctx->pmeth->keygen)
[ - + ]
120 : : {
121 : 0 : EVPerr(EVP_F_EVP_PKEY_KEYGEN_INIT,
122 : : EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
123 : 0 : return -2;
124 : : }
125 : 16989 : ctx->operation = EVP_PKEY_OP_KEYGEN;
126 [ - + ]: 16989 : if (!ctx->pmeth->keygen_init)
127 : : return 1;
128 : 0 : ret = ctx->pmeth->keygen_init(ctx);
129 [ # # ]: 0 : if (ret <= 0)
130 : 0 : ctx->operation = EVP_PKEY_OP_UNDEFINED;
131 : 0 : return ret;
132 : : }
133 : :
134 : 16989 : int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey)
135 : : {
136 : : int ret;
137 : :
138 [ + - ][ + - ]: 16989 : if (!ctx || !ctx->pmeth || !ctx->pmeth->keygen)
[ - + ]
139 : : {
140 : 0 : EVPerr(EVP_F_EVP_PKEY_KEYGEN,
141 : : EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
142 : 0 : return -2;
143 : : }
144 [ - + ]: 16989 : if (ctx->operation != EVP_PKEY_OP_KEYGEN)
145 : : {
146 : 0 : EVPerr(EVP_F_EVP_PKEY_KEYGEN, EVP_R_OPERATON_NOT_INITIALIZED);
147 : 0 : return -1;
148 : : }
149 : :
150 [ + - ]: 16989 : if (!ppkey)
151 : : return -1;
152 : :
153 [ + - ]: 16989 : if (!*ppkey)
154 : 16989 : *ppkey = EVP_PKEY_new();
155 : :
156 : 16989 : ret = ctx->pmeth->keygen(ctx, *ppkey);
157 [ - + ]: 16989 : if (ret <= 0)
158 : : {
159 : 0 : EVP_PKEY_free(*ppkey);
160 : 0 : *ppkey = NULL;
161 : : }
162 : 16989 : return ret;
163 : : }
164 : :
165 : 10 : void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb)
166 : : {
167 : 10 : ctx->pkey_gencb = cb;
168 : 10 : }
169 : :
170 : 0 : EVP_PKEY_gen_cb *EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX *ctx)
171 : : {
172 : 0 : return ctx->pkey_gencb;
173 : : }
174 : :
175 : : /* "translation callback" to call EVP_PKEY_CTX callbacks using BN_GENCB
176 : : * style callbacks.
177 : : */
178 : :
179 : 560 : static int trans_cb(int a, int b, BN_GENCB *gcb)
180 : : {
181 : 560 : EVP_PKEY_CTX *ctx = gcb->arg;
182 : 560 : ctx->keygen_info[0] = a;
183 : 560 : ctx->keygen_info[1] = b;
184 : 560 : return ctx->pkey_gencb(ctx);
185 : : }
186 : :
187 : 10 : void evp_pkey_set_cb_translate(BN_GENCB *cb, EVP_PKEY_CTX *ctx)
188 : : {
189 : 10 : BN_GENCB_set(cb, trans_cb, ctx)
190 : 10 : }
191 : :
192 : 560 : int EVP_PKEY_CTX_get_keygen_info(EVP_PKEY_CTX *ctx, int idx)
193 : : {
194 [ - + ]: 560 : if (idx == -1)
195 : 0 : return ctx->keygen_info_count;
196 [ + - ][ + - ]: 560 : if (idx < 0 || idx > ctx->keygen_info_count)
197 : : return 0;
198 : 560 : return ctx->keygen_info[idx];
199 : : }
200 : :
201 : 16975 : EVP_PKEY *EVP_PKEY_new_mac_key(int type, ENGINE *e,
202 : : const unsigned char *key, int keylen)
203 : : {
204 : 16975 : EVP_PKEY_CTX *mac_ctx = NULL;
205 : 16975 : EVP_PKEY *mac_key = NULL;
206 : 16975 : mac_ctx = EVP_PKEY_CTX_new_id(type, e);
207 [ + - ]: 16975 : if (!mac_ctx)
208 : : return NULL;
209 [ + - ]: 16975 : if (EVP_PKEY_keygen_init(mac_ctx) <= 0)
210 : : goto merr;
211 [ + - ]: 16975 : if (EVP_PKEY_CTX_ctrl(mac_ctx, -1, EVP_PKEY_OP_KEYGEN,
212 : : EVP_PKEY_CTRL_SET_MAC_KEY,
213 : : keylen, (void *)key) <= 0)
214 : : goto merr;
215 : 16975 : if (EVP_PKEY_keygen(mac_ctx, &mac_key) <= 0)
216 : : goto merr;
217 : : merr:
218 [ + - ]: 16975 : if (mac_ctx)
219 : 16975 : EVP_PKEY_CTX_free(mac_ctx);
220 : 16975 : return mac_key;
221 : : }
|