GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libcrypto/ec/eck_prn.c Lines: 83 167 49.7 %
Date: 2017-11-07 Branches: 73 160 45.6 %

Line Branch Exec Source
1
/* $OpenBSD: eck_prn.c,v 1.12 2017/01/29 17:49:23 beck Exp $ */
2
/*
3
 * Written by Nils Larsch for the OpenSSL project.
4
 */
5
/* ====================================================================
6
 * Copyright (c) 1998-2005 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
 *    openssl-core@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
 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
60
 * Portions originally developed by SUN MICROSYSTEMS, INC., and
61
 * contributed to the OpenSSL project.
62
 */
63
64
#include <stdio.h>
65
#include <string.h>
66
67
#include <openssl/opensslconf.h>
68
69
#include <openssl/bn.h>
70
#include <openssl/ec.h>
71
#include <openssl/err.h>
72
#include <openssl/evp.h>
73
74
int
75
ECPKParameters_print_fp(FILE * fp, const EC_GROUP * x, int off)
76
{
77
	BIO *b;
78
	int ret;
79
80
	if ((b = BIO_new(BIO_s_file())) == NULL) {
81
		ECerror(ERR_R_BUF_LIB);
82
		return (0);
83
	}
84
	BIO_set_fp(b, fp, BIO_NOCLOSE);
85
	ret = ECPKParameters_print(b, x, off);
86
	BIO_free(b);
87
	return (ret);
88
}
89
90
int
91
EC_KEY_print_fp(FILE * fp, const EC_KEY * x, int off)
92
{
93
	BIO *b;
94
	int ret;
95
96
	if ((b = BIO_new(BIO_s_file())) == NULL) {
97
		ECerror(ERR_R_BIO_LIB);
98
		return (0);
99
	}
100
	BIO_set_fp(b, fp, BIO_NOCLOSE);
101
	ret = EC_KEY_print(b, x, off);
102
	BIO_free(b);
103
	return (ret);
104
}
105
106
int
107
ECParameters_print_fp(FILE * fp, const EC_KEY * x)
108
{
109
	BIO *b;
110
	int ret;
111
112
	if ((b = BIO_new(BIO_s_file())) == NULL) {
113
		ECerror(ERR_R_BIO_LIB);
114
		return (0);
115
	}
116
	BIO_set_fp(b, fp, BIO_NOCLOSE);
117
	ret = ECParameters_print(b, x);
118
	BIO_free(b);
119
	return (ret);
120
}
121
122
int
123
EC_KEY_print(BIO * bp, const EC_KEY * x, int off)
124
{
125
	EVP_PKEY *pk;
126
	int ret;
127
360
	pk = EVP_PKEY_new();
128

360
	if (!pk || !EVP_PKEY_set1_EC_KEY(pk, (EC_KEY *) x))
129
		return 0;
130
180
	ret = EVP_PKEY_print_private(bp, pk, off, NULL);
131
180
	EVP_PKEY_free(pk);
132
180
	return ret;
133
180
}
134
135
int
136
ECParameters_print(BIO * bp, const EC_KEY * x)
137
{
138
	EVP_PKEY *pk;
139
	int ret;
140
	pk = EVP_PKEY_new();
141
	if (!pk || !EVP_PKEY_set1_EC_KEY(pk, (EC_KEY *) x))
142
		return 0;
143
	ret = EVP_PKEY_print_params(bp, pk, 4, NULL);
144
	EVP_PKEY_free(pk);
145
	return ret;
146
}
147
148
static int
149
print_bin(BIO * fp, const char *str, const unsigned char *num,
150
    size_t len, int off);
151
152
int
153
ECPKParameters_print(BIO * bp, const EC_GROUP * x, int off)
154
{
155
	unsigned char *buffer = NULL;
156
	size_t buf_len = 0, i;
157
	int ret = 0, reason = ERR_R_BIO_LIB;
158
	BN_CTX *ctx = NULL;
159
	const EC_POINT *point = NULL;
160
	BIGNUM *p = NULL, *a = NULL, *b = NULL, *gen = NULL, *order = NULL,
161
	*cofactor = NULL;
162
	const unsigned char *seed;
163
	size_t seed_len = 0;
164
	const char *nname;
165
166
	static const char *gen_compressed = "Generator (compressed):";
167
	static const char *gen_uncompressed = "Generator (uncompressed):";
168
	static const char *gen_hybrid = "Generator (hybrid):";
169
170
368
	if (!x) {
171
		reason = ERR_R_PASSED_NULL_PARAMETER;
172
		goto err;
173
	}
174
184
	ctx = BN_CTX_new();
175
184
	if (ctx == NULL) {
176
		reason = ERR_R_MALLOC_FAILURE;
177
		goto err;
178
	}
179
184
	if (EC_GROUP_get_asn1_flag(x)) {
180
		/* the curve parameter are given by an asn1 OID */
181
		int nid;
182
183
		if (!BIO_indent(bp, off, 128))
184
			goto err;
185
186
		nid = EC_GROUP_get_curve_name(x);
187
		if (nid == 0)
188
			goto err;
189
190
		if (BIO_printf(bp, "ASN1 OID: %s", OBJ_nid2sn(nid)) <= 0)
191
			goto err;
192
		if (BIO_printf(bp, "\n") <= 0)
193
			goto err;
194
195
		nname = EC_curve_nid2nist(nid);
196
		if (nname) {
197
			if (!BIO_indent(bp, off, 128))
198
				goto err;
199
			if (BIO_printf(bp, "NIST CURVE: %s\n", nname) <= 0)
200
				goto err;
201
		}
202
	} else {
203
		/* explicit parameters */
204
		int is_char_two = 0;
205
		point_conversion_form_t form;
206
184
		int tmp_nid = EC_METHOD_get_field_type(EC_GROUP_method_of(x));
207
208
184
		if (tmp_nid == NID_X9_62_characteristic_two_field)
209
84
			is_char_two = 1;
210
211

552
		if ((p = BN_new()) == NULL || (a = BN_new()) == NULL ||
212

368
		    (b = BN_new()) == NULL || (order = BN_new()) == NULL ||
213
184
		    (cofactor = BN_new()) == NULL) {
214
			reason = ERR_R_MALLOC_FAILURE;
215
			goto err;
216
		}
217
#ifndef OPENSSL_NO_EC2M
218
184
		if (is_char_two) {
219
84
			if (!EC_GROUP_get_curve_GF2m(x, p, a, b, ctx)) {
220
				reason = ERR_R_EC_LIB;
221
				goto err;
222
			}
223
		} else		/* prime field */
224
#endif
225
		{
226
100
			if (!EC_GROUP_get_curve_GFp(x, p, a, b, ctx)) {
227
				reason = ERR_R_EC_LIB;
228
				goto err;
229
			}
230
		}
231
232
184
		if ((point = EC_GROUP_get0_generator(x)) == NULL) {
233
			reason = ERR_R_EC_LIB;
234
			goto err;
235
		}
236

368
		if (!EC_GROUP_get_order(x, order, NULL) ||
237
184
		    !EC_GROUP_get_cofactor(x, cofactor, NULL)) {
238
			reason = ERR_R_EC_LIB;
239
			goto err;
240
		}
241
184
		form = EC_GROUP_get_point_conversion_form(x);
242
243
368
		if ((gen = EC_POINT_point2bn(x, point,
244
184
			    form, NULL, ctx)) == NULL) {
245
			reason = ERR_R_EC_LIB;
246
			goto err;
247
		}
248
184
		buf_len = (size_t) BN_num_bytes(p);
249
184
		if (buf_len < (i = (size_t) BN_num_bytes(a)))
250
			buf_len = i;
251
184
		if (buf_len < (i = (size_t) BN_num_bytes(b)))
252
			buf_len = i;
253
184
		if (buf_len < (i = (size_t) BN_num_bytes(gen)))
254
174
			buf_len = i;
255
184
		if (buf_len < (i = (size_t) BN_num_bytes(order)))
256
			buf_len = i;
257
184
		if (buf_len < (i = (size_t) BN_num_bytes(cofactor)))
258
			buf_len = i;
259
260
184
		if ((seed = EC_GROUP_get0_seed(x)) != NULL)
261
86
			seed_len = EC_GROUP_get_seed_len(x);
262
263
184
		buf_len += 10;
264
184
		if ((buffer = malloc(buf_len)) == NULL) {
265
			reason = ERR_R_MALLOC_FAILURE;
266
			goto err;
267
		}
268
184
		if (!BIO_indent(bp, off, 128))
269
			goto err;
270
271
		/* print the 'short name' of the field type */
272
368
		if (BIO_printf(bp, "Field Type: %s\n", OBJ_nid2sn(tmp_nid))
273
184
		    <= 0)
274
			goto err;
275
276
184
		if (is_char_two) {
277
			/* print the 'short name' of the base type OID */
278
84
			int basis_type = EC_GROUP_get_basis_type(x);
279
84
			if (basis_type == 0)
280
				goto err;
281
282
84
			if (!BIO_indent(bp, off, 128))
283
				goto err;
284
285
168
			if (BIO_printf(bp, "Basis Type: %s\n",
286
168
				OBJ_nid2sn(basis_type)) <= 0)
287
				goto err;
288
289
			/* print the polynomial */
290

168
			if ((p != NULL) && !ASN1_bn_print(bp, "Polynomial:", p, buffer,
291
				off))
292
				goto err;
293
84
		} else {
294

200
			if ((p != NULL) && !ASN1_bn_print(bp, "Prime:", p, buffer, off))
295
				goto err;
296
		}
297

368
		if ((a != NULL) && !ASN1_bn_print(bp, "A:   ", a, buffer, off))
298
			goto err;
299

368
		if ((b != NULL) && !ASN1_bn_print(bp, "B:   ", b, buffer, off))
300
			goto err;
301
184
		if (form == POINT_CONVERSION_COMPRESSED) {
302

360
			if ((gen != NULL) && !ASN1_bn_print(bp, gen_compressed, gen,
303
				buffer, off))
304
				goto err;
305
4
		} else if (form == POINT_CONVERSION_UNCOMPRESSED) {
306

8
			if ((gen != NULL) && !ASN1_bn_print(bp, gen_uncompressed, gen,
307
				buffer, off))
308
				goto err;
309
		} else {	/* form == POINT_CONVERSION_HYBRID */
310
			if ((gen != NULL) && !ASN1_bn_print(bp, gen_hybrid, gen,
311
				buffer, off))
312
				goto err;
313
		}
314

368
		if ((order != NULL) && !ASN1_bn_print(bp, "Order: ", order,
315
			buffer, off))
316
			goto err;
317

368
		if ((cofactor != NULL) && !ASN1_bn_print(bp, "Cofactor: ", cofactor,
318
			buffer, off))
319
			goto err;
320

270
		if (seed && !print_bin(bp, "Seed:", seed, seed_len, off))
321
			goto err;
322
184
	}
323
184
	ret = 1;
324
err:
325
184
	if (!ret)
326
		ECerror(reason);
327
184
	BN_free(p);
328
184
	BN_free(a);
329
184
	BN_free(b);
330
184
	BN_free(gen);
331
184
	BN_free(order);
332
184
	BN_free(cofactor);
333
184
	BN_CTX_free(ctx);
334
184
	free(buffer);
335
184
	return (ret);
336
184
}
337
338
static int
339
print_bin(BIO * fp, const char *name, const unsigned char *buf,
340
    size_t len, int off)
341
{
342
	size_t i;
343
172
	char str[128];
344
345
86
	if (buf == NULL)
346
		return 1;
347
86
	if (off) {
348
		if (off > 128)
349
			off = 128;
350
		memset(str, ' ', off);
351
		if (BIO_write(fp, str, off) <= 0)
352
			return 0;
353
	}
354
86
	if (BIO_printf(fp, "%s", name) <= 0)
355
		return 0;
356
357
3612
	for (i = 0; i < len; i++) {
358
1720
		if ((i % 15) == 0) {
359
172
			str[0] = '\n';
360
172
			memset(&(str[1]), ' ', off + 4);
361
172
			if (BIO_write(fp, str, off + 1 + 4) <= 0)
362
				return 0;
363
		}
364
1720
		if (BIO_printf(fp, "%02x%s", buf[i], ((i + 1) == len) ? "" : ":") <= 0)
365
			return 0;
366
	}
367
86
	if (BIO_write(fp, "\n", 1) <= 0)
368
		return 0;
369
370
86
	return 1;
371
86
}