summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ec/ec_print.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/ec/ec_print.c119
1 files changed, 51 insertions, 68 deletions
diff --git a/src/lib/libcrypto/ec/ec_print.c b/src/lib/libcrypto/ec/ec_print.c
index 1655332c3c..84a78903b3 100644
--- a/src/lib/libcrypto/ec/ec_print.c
+++ b/src/lib/libcrypto/ec/ec_print.c
@@ -7,7 +7,7 @@
7 * are met: 7 * are met:
8 * 8 *
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
11 * 11 *
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in 13 * notice, this list of conditions and the following disclaimer in
@@ -56,29 +56,25 @@
56#include <openssl/crypto.h> 56#include <openssl/crypto.h>
57#include "ec_lcl.h" 57#include "ec_lcl.h"
58 58
59BIGNUM *EC_POINT_point2bn(const EC_GROUP *group, 59BIGNUM *
60 const EC_POINT *point, 60EC_POINT_point2bn(const EC_GROUP * group, const EC_POINT * point,
61 point_conversion_form_t form, 61 point_conversion_form_t form, BIGNUM * ret, BN_CTX * ctx)
62 BIGNUM *ret, 62{
63 BN_CTX *ctx) 63 size_t buf_len = 0;
64 {
65 size_t buf_len=0;
66 unsigned char *buf; 64 unsigned char *buf;
67 65
68 buf_len = EC_POINT_point2oct(group, point, form, 66 buf_len = EC_POINT_point2oct(group, point, form,
69 NULL, 0, ctx); 67 NULL, 0, ctx);
70 if (buf_len == 0) 68 if (buf_len == 0)
71 return NULL; 69 return NULL;
72 70
73 if ((buf = malloc(buf_len)) == NULL) 71 if ((buf = malloc(buf_len)) == NULL)
74 return NULL; 72 return NULL;
75 73
76 if (!EC_POINT_point2oct(group, point, form, buf, buf_len, ctx)) 74 if (!EC_POINT_point2oct(group, point, form, buf, buf_len, ctx)) {
77 {
78 free(buf); 75 free(buf);
79 return NULL; 76 return NULL;
80 } 77 }
81
82 ret = BN_bin2bn(buf, buf_len, ret); 78 ret = BN_bin2bn(buf, buf_len, ret);
83 79
84 free(buf); 80 free(buf);
@@ -86,103 +82,90 @@ BIGNUM *EC_POINT_point2bn(const EC_GROUP *group,
86 return ret; 82 return ret;
87} 83}
88 84
89EC_POINT *EC_POINT_bn2point(const EC_GROUP *group, 85EC_POINT *
90 const BIGNUM *bn, 86EC_POINT_bn2point(const EC_GROUP * group,
91 EC_POINT *point, 87 const BIGNUM * bn, EC_POINT * point, BN_CTX * ctx)
92 BN_CTX *ctx) 88{
93 { 89 size_t buf_len = 0;
94 size_t buf_len=0;
95 unsigned char *buf; 90 unsigned char *buf;
96 EC_POINT *ret; 91 EC_POINT *ret;
97 92
98 if ((buf_len = BN_num_bytes(bn)) == 0) return NULL; 93 if ((buf_len = BN_num_bytes(bn)) == 0)
94 return NULL;
99 buf = malloc(buf_len); 95 buf = malloc(buf_len);
100 if (buf == NULL) 96 if (buf == NULL)
101 return NULL; 97 return NULL;
102 98
103 if (!BN_bn2bin(bn, buf)) 99 if (!BN_bn2bin(bn, buf)) {
104 {
105 free(buf); 100 free(buf);
106 return NULL; 101 return NULL;
107 } 102 }
108 103 if (point == NULL) {
109 if (point == NULL) 104 if ((ret = EC_POINT_new(group)) == NULL) {
110 {
111 if ((ret = EC_POINT_new(group)) == NULL)
112 {
113 free(buf); 105 free(buf);
114 return NULL; 106 return NULL;
115 }
116 } 107 }
117 else 108 } else
118 ret = point; 109 ret = point;
119 110
120 if (!EC_POINT_oct2point(group, ret, buf, buf_len, ctx)) 111 if (!EC_POINT_oct2point(group, ret, buf, buf_len, ctx)) {
121 {
122 if (point == NULL) 112 if (point == NULL)
123 EC_POINT_clear_free(ret); 113 EC_POINT_clear_free(ret);
124 free(buf); 114 free(buf);
125 return NULL; 115 return NULL;
126 } 116 }
127
128 free(buf); 117 free(buf);
129 return ret; 118 return ret;
130 } 119}
131 120
132static const char *HEX_DIGITS = "0123456789ABCDEF"; 121static const char *HEX_DIGITS = "0123456789ABCDEF";
133 122
134/* the return value must be freed (using free()) */ 123/* the return value must be freed (using free()) */
135char *EC_POINT_point2hex(const EC_GROUP *group, 124char *
136 const EC_POINT *point, 125EC_POINT_point2hex(const EC_GROUP * group, const EC_POINT * point,
137 point_conversion_form_t form, 126 point_conversion_form_t form, BN_CTX * ctx)
138 BN_CTX *ctx) 127{
139 { 128 char *ret, *p;
140 char *ret, *p; 129 size_t buf_len = 0, i;
141 size_t buf_len=0,i;
142 unsigned char *buf, *pbuf; 130 unsigned char *buf, *pbuf;
143 131
144 buf_len = EC_POINT_point2oct(group, point, form, 132 buf_len = EC_POINT_point2oct(group, point, form,
145 NULL, 0, ctx); 133 NULL, 0, ctx);
146 if (buf_len == 0) 134 if (buf_len == 0)
147 return NULL; 135 return NULL;
148 136
149 if ((buf = malloc(buf_len)) == NULL) 137 if ((buf = malloc(buf_len)) == NULL)
150 return NULL; 138 return NULL;
151 139
152 if (!EC_POINT_point2oct(group, point, form, buf, buf_len, ctx)) 140 if (!EC_POINT_point2oct(group, point, form, buf, buf_len, ctx)) {
153 {
154 free(buf); 141 free(buf);
155 return NULL; 142 return NULL;
156 } 143 }
157 144 ret = (char *) malloc(buf_len * 2 + 2);
158 ret = (char *)malloc(buf_len*2+2); 145 if (ret == NULL) {
159 if (ret == NULL)
160 {
161 free(buf); 146 free(buf);
162 return NULL; 147 return NULL;
163 } 148 }
164 p = ret; 149 p = ret;
165 pbuf = buf; 150 pbuf = buf;
166 for (i=buf_len; i > 0; i--) 151 for (i = buf_len; i > 0; i--) {
167 { 152 int v = (int) *(pbuf++);
168 int v = (int) *(pbuf++); 153 *(p++) = HEX_DIGITS[v >> 4];
169 *(p++)=HEX_DIGITS[v>>4]; 154 *(p++) = HEX_DIGITS[v & 0x0F];
170 *(p++)=HEX_DIGITS[v&0x0F]; 155 }
171 } 156 *p = '\0';
172 *p='\0';
173 157
174 free(buf); 158 free(buf);
175 159
176 return ret; 160 return ret;
177 } 161}
178 162
179EC_POINT *EC_POINT_hex2point(const EC_GROUP *group, 163EC_POINT *
180 const char *buf, 164EC_POINT_hex2point(const EC_GROUP * group, const char *buf,
181 EC_POINT *point, 165 EC_POINT * point, BN_CTX * ctx)
182 BN_CTX *ctx) 166{
183 { 167 EC_POINT *ret = NULL;
184 EC_POINT *ret=NULL; 168 BIGNUM *tmp_bn = NULL;
185 BIGNUM *tmp_bn=NULL;
186 169
187 if (!BN_hex2bn(&tmp_bn, buf)) 170 if (!BN_hex2bn(&tmp_bn, buf))
188 return NULL; 171 return NULL;
@@ -192,4 +175,4 @@ EC_POINT *EC_POINT_hex2point(const EC_GROUP *group,
192 BN_clear_free(tmp_bn); 175 BN_clear_free(tmp_bn);
193 176
194 return ret; 177 return ret;
195 } 178}