Line data Source code
1 : /* crypto/ec/ec_print.c */
2 : /* ====================================================================
3 : * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.
4 : *
5 : * Redistribution and use in source and binary forms, with or without
6 : * modification, are permitted provided that the following conditions
7 : * are met:
8 : *
9 : * 1. Redistributions of source code must retain the above copyright
10 : * notice, this list of conditions and the following disclaimer.
11 : *
12 : * 2. Redistributions in binary form must reproduce the above copyright
13 : * notice, this list of conditions and the following disclaimer in
14 : * the documentation and/or other materials provided with the
15 : * distribution.
16 : *
17 : * 3. All advertising materials mentioning features or use of this
18 : * software must display the following acknowledgment:
19 : * "This product includes software developed by the OpenSSL Project
20 : * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21 : *
22 : * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23 : * endorse or promote products derived from this software without
24 : * prior written permission. For written permission, please contact
25 : * openssl-core@openssl.org.
26 : *
27 : * 5. Products derived from this software may not be called "OpenSSL"
28 : * nor may "OpenSSL" appear in their names without prior written
29 : * permission of the OpenSSL Project.
30 : *
31 : * 6. Redistributions of any form whatsoever must retain the following
32 : * acknowledgment:
33 : * "This product includes software developed by the OpenSSL Project
34 : * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35 : *
36 : * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37 : * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39 : * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
40 : * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42 : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43 : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45 : * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46 : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47 : * OF THE POSSIBILITY OF SUCH DAMAGE.
48 : * ====================================================================
49 : *
50 : * This product includes cryptographic software written by Eric Young
51 : * (eay@cryptsoft.com). This product includes software written by Tim
52 : * Hudson (tjh@cryptsoft.com).
53 : *
54 : */
55 :
56 : #include <openssl/crypto.h>
57 : #include "ec_lcl.h"
58 :
59 0 : BIGNUM *EC_POINT_point2bn(const EC_GROUP *group,
60 : const EC_POINT *point,
61 : point_conversion_form_t form,
62 : BIGNUM *ret, BN_CTX *ctx)
63 : {
64 : size_t buf_len = 0;
65 : unsigned char *buf;
66 :
67 0 : buf_len = EC_POINT_point2oct(group, point, form, NULL, 0, ctx);
68 0 : if (buf_len == 0)
69 : return NULL;
70 :
71 0 : if ((buf = OPENSSL_malloc(buf_len)) == NULL)
72 : return NULL;
73 :
74 0 : if (!EC_POINT_point2oct(group, point, form, buf, buf_len, ctx)) {
75 0 : OPENSSL_free(buf);
76 0 : return NULL;
77 : }
78 :
79 0 : ret = BN_bin2bn(buf, buf_len, ret);
80 :
81 0 : OPENSSL_free(buf);
82 :
83 0 : return ret;
84 : }
85 :
86 0 : EC_POINT *EC_POINT_bn2point(const EC_GROUP *group,
87 : const BIGNUM *bn, EC_POINT *point, BN_CTX *ctx)
88 : {
89 : size_t buf_len = 0;
90 : unsigned char *buf;
91 : EC_POINT *ret;
92 :
93 0 : if ((buf_len = BN_num_bytes(bn)) == 0)
94 : return NULL;
95 0 : buf = OPENSSL_malloc(buf_len);
96 0 : if (buf == NULL)
97 : return NULL;
98 :
99 0 : if (!BN_bn2bin(bn, buf)) {
100 0 : OPENSSL_free(buf);
101 0 : return NULL;
102 : }
103 :
104 0 : if (point == NULL) {
105 0 : if ((ret = EC_POINT_new(group)) == NULL) {
106 0 : OPENSSL_free(buf);
107 0 : return NULL;
108 : }
109 : } else
110 : ret = point;
111 :
112 0 : if (!EC_POINT_oct2point(group, ret, buf, buf_len, ctx)) {
113 0 : if (point == NULL)
114 0 : EC_POINT_clear_free(ret);
115 0 : OPENSSL_free(buf);
116 0 : return NULL;
117 : }
118 :
119 0 : OPENSSL_free(buf);
120 0 : return ret;
121 : }
122 :
123 : static const char *HEX_DIGITS = "0123456789ABCDEF";
124 :
125 : /* the return value must be freed (using OPENSSL_free()) */
126 0 : char *EC_POINT_point2hex(const EC_GROUP *group,
127 : const EC_POINT *point,
128 : point_conversion_form_t form, BN_CTX *ctx)
129 : {
130 : char *ret, *p;
131 : size_t buf_len = 0, i;
132 : unsigned char *buf, *pbuf;
133 :
134 0 : buf_len = EC_POINT_point2oct(group, point, form, NULL, 0, ctx);
135 0 : if (buf_len == 0)
136 : return NULL;
137 :
138 0 : if ((buf = OPENSSL_malloc(buf_len)) == NULL)
139 : return NULL;
140 :
141 0 : if (!EC_POINT_point2oct(group, point, form, buf, buf_len, ctx)) {
142 0 : OPENSSL_free(buf);
143 0 : return NULL;
144 : }
145 :
146 0 : ret = (char *)OPENSSL_malloc(buf_len * 2 + 2);
147 0 : if (ret == NULL) {
148 0 : OPENSSL_free(buf);
149 0 : return NULL;
150 : }
151 : p = ret;
152 : pbuf = buf;
153 0 : for (i = buf_len; i > 0; i--) {
154 0 : int v = (int)*(pbuf++);
155 0 : *(p++) = HEX_DIGITS[v >> 4];
156 0 : *(p++) = HEX_DIGITS[v & 0x0F];
157 : }
158 0 : *p = '\0';
159 :
160 0 : OPENSSL_free(buf);
161 :
162 0 : return ret;
163 : }
164 :
165 0 : EC_POINT *EC_POINT_hex2point(const EC_GROUP *group,
166 : const char *buf, EC_POINT *point, BN_CTX *ctx)
167 : {
168 : EC_POINT *ret = NULL;
169 0 : BIGNUM *tmp_bn = NULL;
170 :
171 0 : if (!BN_hex2bn(&tmp_bn, buf))
172 : return NULL;
173 :
174 0 : ret = EC_POINT_bn2point(group, tmp_bn, point, ctx);
175 :
176 0 : BN_clear_free(tmp_bn);
177 :
178 0 : return ret;
179 : }
|