GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libcrypto/evp/pmeth_gn.c Lines: 51 81 63.0 %
Date: 2017-11-07 Branches: 28 60 46.7 %

Line Branch Exec Source
1
/* $OpenBSD: pmeth_gn.c,v 1.6 2017/01/29 17:49:23 beck Exp $ */
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
62
#include <openssl/bn.h>
63
#include <openssl/err.h>
64
#include <openssl/evp.h>
65
#include <openssl/objects.h>
66
67
#include "evp_locl.h"
68
69
int
70
EVP_PKEY_paramgen_init(EVP_PKEY_CTX *ctx)
71
{
72
	int ret;
73
74

24
	if (!ctx || !ctx->pmeth || !ctx->pmeth->paramgen) {
75
		EVPerror(EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
76
		return -2;
77
	}
78
6
	ctx->operation = EVP_PKEY_OP_PARAMGEN;
79
6
	if (!ctx->pmeth->paramgen_init)
80
6
		return 1;
81
	ret = ctx->pmeth->paramgen_init(ctx);
82
	if (ret <= 0)
83
		ctx->operation = EVP_PKEY_OP_UNDEFINED;
84
	return ret;
85
6
}
86
87
int
88
EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey)
89
{
90
	int ret;
91
92

24
	if (!ctx || !ctx->pmeth || !ctx->pmeth->paramgen) {
93
		EVPerror(EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
94
		return -2;
95
	}
96
97
6
	if (ctx->operation != EVP_PKEY_OP_PARAMGEN) {
98
		EVPerror(EVP_R_OPERATON_NOT_INITIALIZED);
99
		return -1;
100
	}
101
102
6
	if (!ppkey)
103
		return -1;
104
105
6
	if (!*ppkey)
106
6
		*ppkey = EVP_PKEY_new();
107
108
6
	ret = ctx->pmeth->paramgen(ctx, *ppkey);
109
6
	if (ret <= 0) {
110
		EVP_PKEY_free(*ppkey);
111
		*ppkey = NULL;
112
	}
113
6
	return ret;
114
6
}
115
116
int
117
EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx)
118
{
119
	int ret;
120
121

149636
	if (!ctx || !ctx->pmeth || !ctx->pmeth->keygen) {
122
		EVPerror(EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
123
		return -2;
124
	}
125
37409
	ctx->operation = EVP_PKEY_OP_KEYGEN;
126
37409
	if (!ctx->pmeth->keygen_init)
127
37409
		return 1;
128
	ret = ctx->pmeth->keygen_init(ctx);
129
	if (ret <= 0)
130
		ctx->operation = EVP_PKEY_OP_UNDEFINED;
131
	return ret;
132
37409
}
133
134
int
135
EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey)
136
{
137
	int ret;
138
139

149636
	if (!ctx || !ctx->pmeth || !ctx->pmeth->keygen) {
140
		EVPerror(EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
141
		return -2;
142
	}
143
37409
	if (ctx->operation != EVP_PKEY_OP_KEYGEN) {
144
		EVPerror(EVP_R_OPERATON_NOT_INITIALIZED);
145
		return -1;
146
	}
147
148
37409
	if (!ppkey)
149
		return -1;
150
151
37409
	if (!*ppkey)
152
37409
		*ppkey = EVP_PKEY_new();
153
154
37409
	ret = ctx->pmeth->keygen(ctx, *ppkey);
155
37409
	if (ret <= 0) {
156
		EVP_PKEY_free(*ppkey);
157
		*ppkey = NULL;
158
	}
159
37409
	return ret;
160
37409
}
161
162
void
163
EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb)
164
{
165
96
	ctx->pkey_gencb = cb;
166
48
}
167
168
EVP_PKEY_gen_cb *
169
EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX *ctx)
170
{
171
	return ctx->pkey_gencb;
172
}
173
174
/* "translation callback" to call EVP_PKEY_CTX callbacks using BN_GENCB
175
 * style callbacks.
176
 */
177
178
static int
179
trans_cb(int a, int b, BN_GENCB *gcb)
180
{
181
24820
	EVP_PKEY_CTX *ctx = gcb->arg;
182
12410
	ctx->keygen_info[0] = a;
183
12410
	ctx->keygen_info[1] = b;
184
12410
	return ctx->pkey_gencb(ctx);
185
}
186
187
void
188
evp_pkey_set_cb_translate(BN_GENCB *cb, EVP_PKEY_CTX *ctx)
189
{
190
76
	BN_GENCB_set(cb, trans_cb, ctx)
191
38
}
192
193
int
194
EVP_PKEY_CTX_get_keygen_info(EVP_PKEY_CTX *ctx, int idx)
195
{
196
24820
	if (idx == -1)
197
		return ctx->keygen_info_count;
198

24820
	if (idx < 0 || idx > ctx->keygen_info_count)
199
		return 0;
200
12410
	return ctx->keygen_info[idx];
201
12410
}
202
203
EVP_PKEY *
204
EVP_PKEY_new_mac_key(int type, ENGINE *e, const unsigned char *key, int keylen)
205
{
206
	EVP_PKEY_CTX *mac_ctx = NULL;
207
74682
	EVP_PKEY *mac_key = NULL;
208
209
37341
	mac_ctx = EVP_PKEY_CTX_new_id(type, e);
210
37341
	if (!mac_ctx)
211
		return NULL;
212
37341
	if (EVP_PKEY_keygen_init(mac_ctx) <= 0)
213
		goto merr;
214
74682
	if (EVP_PKEY_CTX_ctrl(mac_ctx, -1, EVP_PKEY_OP_KEYGEN,
215
37341
	    EVP_PKEY_CTRL_SET_MAC_KEY, keylen, (void *)key) <= 0)
216
		goto merr;
217
37341
	if (EVP_PKEY_keygen(mac_ctx, &mac_key) <= 0)
218
37341
		goto merr;
219
220
merr:
221
37341
	EVP_PKEY_CTX_free(mac_ctx);
222
37341
	return mac_key;
223
37341
}