summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libcrypto/ec/ec_print.c44
1 files changed, 10 insertions, 34 deletions
diff --git a/src/lib/libcrypto/ec/ec_print.c b/src/lib/libcrypto/ec/ec_print.c
index d8261a94f5..698d2be484 100644
--- a/src/lib/libcrypto/ec/ec_print.c
+++ b/src/lib/libcrypto/ec/ec_print.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_print.c,v 1.16 2024/10/30 17:36:22 tb Exp $ */ 1/* $OpenBSD: ec_print.c,v 1.17 2024/10/30 17:49:27 tb Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. 3 * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.
4 * 4 *
@@ -117,46 +117,22 @@ EC_POINT_bn2point(const EC_GROUP *group,
117} 117}
118LCRYPTO_ALIAS(EC_POINT_bn2point); 118LCRYPTO_ALIAS(EC_POINT_bn2point);
119 119
120static const char *HEX_DIGITS = "0123456789ABCDEF";
121
122/* the return value must be freed (using free()) */
123char * 120char *
124EC_POINT_point2hex(const EC_GROUP *group, const EC_POINT *point, 121EC_POINT_point2hex(const EC_GROUP *group, const EC_POINT *point,
125 point_conversion_form_t form, BN_CTX *ctx) 122 point_conversion_form_t form, BN_CTX *ctx)
126{ 123{
127 char *ret, *p; 124 BIGNUM *bn;
128 size_t buf_len = 0, i; 125 char *hex = NULL;
129 unsigned char *buf, *pbuf;
130
131 buf_len = EC_POINT_point2oct(group, point, form,
132 NULL, 0, ctx);
133 if (buf_len == 0 || buf_len + 1 == 0)
134 return NULL;
135
136 if ((buf = malloc(buf_len)) == NULL)
137 return NULL;
138 126
139 if (!EC_POINT_point2oct(group, point, form, buf, buf_len, ctx)) { 127 if ((bn = EC_POINT_point2bn(group, point, form, NULL, ctx)) == NULL)
140 free(buf); 128 goto err;
141 return NULL; 129 if ((hex = BN_bn2hex(bn)) == NULL)
142 } 130 goto err;
143 ret = reallocarray(NULL, buf_len + 1, 2);
144 if (ret == NULL) {
145 free(buf);
146 return NULL;
147 }
148 p = ret;
149 pbuf = buf;
150 for (i = buf_len; i > 0; i--) {
151 int v = (int) *(pbuf++);
152 *(p++) = HEX_DIGITS[v >> 4];
153 *(p++) = HEX_DIGITS[v & 0x0F];
154 }
155 *p = '\0';
156 131
157 free(buf); 132 err:
133 BN_free(bn);
158 134
159 return ret; 135 return hex;
160} 136}
161LCRYPTO_ALIAS(EC_POINT_point2hex); 137LCRYPTO_ALIAS(EC_POINT_point2hex);
162 138