Line data Source code
1 : /* crypto/ec/ec_lib.c */
2 : /*
3 : * Originally written by Bodo Moeller 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 : * Binary polynomial ECC support in OpenSSL originally developed by
61 : * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
62 : */
63 :
64 : #include <string.h>
65 :
66 : #include <openssl/err.h>
67 : #include <openssl/opensslv.h>
68 :
69 : #include "ec_lcl.h"
70 :
71 0 : int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group,
72 : EC_POINT *point, const BIGNUM *x,
73 : int y_bit, BN_CTX *ctx)
74 : {
75 0 : if (group->meth->point_set_compressed_coordinates == 0
76 0 : && !(group->meth->flags & EC_FLAGS_DEFAULT_OCT)) {
77 0 : ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP,
78 : ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
79 0 : return 0;
80 : }
81 0 : if (group->meth != point->meth) {
82 0 : ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP,
83 : EC_R_INCOMPATIBLE_OBJECTS);
84 0 : return 0;
85 : }
86 0 : if (group->meth->flags & EC_FLAGS_DEFAULT_OCT) {
87 0 : if (group->meth->field_type == NID_X9_62_prime_field)
88 0 : return ec_GFp_simple_set_compressed_coordinates(group, point, x,
89 : y_bit, ctx);
90 : else
91 : #ifdef OPENSSL_NO_EC2M
92 : {
93 : ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP,
94 : EC_R_GF2M_NOT_SUPPORTED);
95 : return 0;
96 : }
97 : #else
98 0 : return ec_GF2m_simple_set_compressed_coordinates(group, point, x,
99 : y_bit, ctx);
100 : #endif
101 : }
102 0 : return group->meth->point_set_compressed_coordinates(group, point, x,
103 : y_bit, ctx);
104 : }
105 :
106 : #ifndef OPENSSL_NO_EC2M
107 0 : int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group,
108 : EC_POINT *point, const BIGNUM *x,
109 : int y_bit, BN_CTX *ctx)
110 : {
111 0 : if (group->meth->point_set_compressed_coordinates == 0
112 0 : && !(group->meth->flags & EC_FLAGS_DEFAULT_OCT)) {
113 0 : ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M,
114 : ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
115 0 : return 0;
116 : }
117 0 : if (group->meth != point->meth) {
118 0 : ECerr(EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M,
119 : EC_R_INCOMPATIBLE_OBJECTS);
120 0 : return 0;
121 : }
122 0 : if (group->meth->flags & EC_FLAGS_DEFAULT_OCT) {
123 0 : if (group->meth->field_type == NID_X9_62_prime_field)
124 0 : return ec_GFp_simple_set_compressed_coordinates(group, point, x,
125 : y_bit, ctx);
126 : else
127 0 : return ec_GF2m_simple_set_compressed_coordinates(group, point, x,
128 : y_bit, ctx);
129 : }
130 0 : return group->meth->point_set_compressed_coordinates(group, point, x,
131 : y_bit, ctx);
132 : }
133 : #endif
134 :
135 1486 : size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point,
136 : point_conversion_form_t form, unsigned char *buf,
137 : size_t len, BN_CTX *ctx)
138 : {
139 1486 : if (group->meth->point2oct == 0
140 1486 : && !(group->meth->flags & EC_FLAGS_DEFAULT_OCT)) {
141 0 : ECerr(EC_F_EC_POINT_POINT2OCT, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
142 0 : return 0;
143 : }
144 1486 : if (group->meth != point->meth) {
145 0 : ECerr(EC_F_EC_POINT_POINT2OCT, EC_R_INCOMPATIBLE_OBJECTS);
146 0 : return 0;
147 : }
148 1486 : if (group->meth->flags & EC_FLAGS_DEFAULT_OCT) {
149 1486 : if (group->meth->field_type == NID_X9_62_prime_field)
150 1486 : return ec_GFp_simple_point2oct(group, point, form, buf, len, ctx);
151 : else
152 : #ifdef OPENSSL_NO_EC2M
153 : {
154 : ECerr(EC_F_EC_POINT_POINT2OCT, EC_R_GF2M_NOT_SUPPORTED);
155 : return 0;
156 : }
157 : #else
158 0 : return ec_GF2m_simple_point2oct(group, point,
159 : form, buf, len, ctx);
160 : #endif
161 : }
162 :
163 0 : return group->meth->point2oct(group, point, form, buf, len, ctx);
164 : }
165 :
166 737 : int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point,
167 : const unsigned char *buf, size_t len, BN_CTX *ctx)
168 : {
169 737 : if (group->meth->oct2point == 0
170 737 : && !(group->meth->flags & EC_FLAGS_DEFAULT_OCT)) {
171 0 : ECerr(EC_F_EC_POINT_OCT2POINT, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
172 0 : return 0;
173 : }
174 737 : if (group->meth != point->meth) {
175 0 : ECerr(EC_F_EC_POINT_OCT2POINT, EC_R_INCOMPATIBLE_OBJECTS);
176 0 : return 0;
177 : }
178 737 : if (group->meth->flags & EC_FLAGS_DEFAULT_OCT) {
179 737 : if (group->meth->field_type == NID_X9_62_prime_field)
180 737 : return ec_GFp_simple_oct2point(group, point, buf, len, ctx);
181 : else
182 : #ifdef OPENSSL_NO_EC2M
183 : {
184 : ECerr(EC_F_EC_POINT_OCT2POINT, EC_R_GF2M_NOT_SUPPORTED);
185 : return 0;
186 : }
187 : #else
188 0 : return ec_GF2m_simple_oct2point(group, point, buf, len, ctx);
189 : #endif
190 : }
191 0 : return group->meth->oct2point(group, point, buf, len, ctx);
192 : }
|