GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libcrypto/ec/ecp_nist.c Lines: 0 43 0.0 %
Date: 2017-11-07 Branches: 0 36 0.0 %

Line Branch Exec Source
1
/* $OpenBSD: ecp_nist.c,v 1.10 2017/01/29 17:49:23 beck Exp $ */
2
/*
3
 * Written by Nils Larsch for the OpenSSL project.
4
 */
5
/* ====================================================================
6
 * Copyright (c) 1998-2003 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 of this software developed by SUN MICROSYSTEMS, INC.,
61
 * and contributed to the OpenSSL project.
62
 */
63
64
#include <limits.h>
65
66
#include <openssl/err.h>
67
#include <openssl/obj_mac.h>
68
#include "ec_lcl.h"
69
70
const EC_METHOD *
71
EC_GFp_nist_method(void)
72
{
73
	static const EC_METHOD ret = {
74
		.flags = EC_FLAGS_DEFAULT_OCT,
75
		.field_type = NID_X9_62_prime_field,
76
		.group_init = ec_GFp_simple_group_init,
77
		.group_finish = ec_GFp_simple_group_finish,
78
		.group_clear_finish = ec_GFp_simple_group_clear_finish,
79
		.group_copy = ec_GFp_nist_group_copy,
80
		.group_set_curve = ec_GFp_nist_group_set_curve,
81
		.group_get_curve = ec_GFp_simple_group_get_curve,
82
		.group_get_degree = ec_GFp_simple_group_get_degree,
83
		.group_check_discriminant =
84
		ec_GFp_simple_group_check_discriminant,
85
		.point_init = ec_GFp_simple_point_init,
86
		.point_finish = ec_GFp_simple_point_finish,
87
		.point_clear_finish = ec_GFp_simple_point_clear_finish,
88
		.point_copy = ec_GFp_simple_point_copy,
89
		.point_set_to_infinity = ec_GFp_simple_point_set_to_infinity,
90
		.point_set_Jprojective_coordinates_GFp =
91
		ec_GFp_simple_set_Jprojective_coordinates_GFp,
92
		.point_get_Jprojective_coordinates_GFp =
93
		ec_GFp_simple_get_Jprojective_coordinates_GFp,
94
		.point_set_affine_coordinates =
95
		ec_GFp_simple_point_set_affine_coordinates,
96
		.point_get_affine_coordinates =
97
		ec_GFp_simple_point_get_affine_coordinates,
98
		.add = ec_GFp_simple_add,
99
		.dbl = ec_GFp_simple_dbl,
100
		.invert = ec_GFp_simple_invert,
101
		.is_at_infinity = ec_GFp_simple_is_at_infinity,
102
		.is_on_curve = ec_GFp_simple_is_on_curve,
103
		.point_cmp = ec_GFp_simple_cmp,
104
		.make_affine = ec_GFp_simple_make_affine,
105
		.points_make_affine = ec_GFp_simple_points_make_affine,
106
		.field_mul = ec_GFp_nist_field_mul,
107
		.field_sqr = ec_GFp_nist_field_sqr
108
	};
109
110
	return &ret;
111
}
112
113
int
114
ec_GFp_nist_group_copy(EC_GROUP * dest, const EC_GROUP * src)
115
{
116
	dest->field_mod_func = src->field_mod_func;
117
118
	return ec_GFp_simple_group_copy(dest, src);
119
}
120
121
int
122
ec_GFp_nist_group_set_curve(EC_GROUP *group, const BIGNUM *p,
123
    const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
124
{
125
	int ret = 0;
126
	BN_CTX *new_ctx = NULL;
127
	BIGNUM *tmp_bn;
128
129
	if (ctx == NULL)
130
		if ((ctx = new_ctx = BN_CTX_new()) == NULL)
131
			return 0;
132
133
	BN_CTX_start(ctx);
134
	if ((tmp_bn = BN_CTX_get(ctx)) == NULL)
135
		goto err;
136
137
	if (BN_ucmp(BN_get0_nist_prime_192(), p) == 0)
138
		group->field_mod_func = BN_nist_mod_192;
139
	else if (BN_ucmp(BN_get0_nist_prime_224(), p) == 0)
140
		group->field_mod_func = BN_nist_mod_224;
141
	else if (BN_ucmp(BN_get0_nist_prime_256(), p) == 0)
142
		group->field_mod_func = BN_nist_mod_256;
143
	else if (BN_ucmp(BN_get0_nist_prime_384(), p) == 0)
144
		group->field_mod_func = BN_nist_mod_384;
145
	else if (BN_ucmp(BN_get0_nist_prime_521(), p) == 0)
146
		group->field_mod_func = BN_nist_mod_521;
147
	else {
148
		ECerror(EC_R_NOT_A_NIST_PRIME);
149
		goto err;
150
	}
151
152
	ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx);
153
154
err:
155
	BN_CTX_end(ctx);
156
	BN_CTX_free(new_ctx);
157
	return ret;
158
}
159
160
161
int
162
ec_GFp_nist_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
163
    const BIGNUM *b, BN_CTX *ctx)
164
{
165
	int ret = 0;
166
	BN_CTX *ctx_new = NULL;
167
168
	if (!group || !r || !a || !b) {
169
		ECerror(ERR_R_PASSED_NULL_PARAMETER);
170
		goto err;
171
	}
172
	if (!ctx)
173
		if ((ctx_new = ctx = BN_CTX_new()) == NULL)
174
			goto err;
175
176
	if (!BN_mul(r, a, b, ctx))
177
		goto err;
178
	if (!group->field_mod_func(r, r, &group->field, ctx))
179
		goto err;
180
181
	ret = 1;
182
err:
183
	BN_CTX_free(ctx_new);
184
	return ret;
185
}
186
187
188
int
189
ec_GFp_nist_field_sqr(const EC_GROUP * group, BIGNUM * r, const BIGNUM * a,
190
    BN_CTX * ctx)
191
{
192
	int ret = 0;
193
	BN_CTX *ctx_new = NULL;
194
195
	if (!group || !r || !a) {
196
		ECerror(EC_R_PASSED_NULL_PARAMETER);
197
		goto err;
198
	}
199
	if (!ctx)
200
		if ((ctx_new = ctx = BN_CTX_new()) == NULL)
201
			goto err;
202
203
	if (!BN_sqr(r, a, ctx))
204
		goto err;
205
	if (!group->field_mod_func(r, r, &group->field, ctx))
206
		goto err;
207
208
	ret = 1;
209
err:
210
	BN_CTX_free(ctx_new);
211
	return ret;
212
}