diff options
Diffstat (limited to 'src/lib/libcrypto/ec')
| -rw-r--r-- | src/lib/libcrypto/ec/ec_print.c | 44 | 
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 | } | 
| 118 | LCRYPTO_ALIAS(EC_POINT_bn2point); | 118 | LCRYPTO_ALIAS(EC_POINT_bn2point); | 
| 119 | 119 | ||
| 120 | static const char *HEX_DIGITS = "0123456789ABCDEF"; | ||
| 121 | |||
| 122 | /* the return value must be freed (using free()) */ | ||
| 123 | char * | 120 | char * | 
| 124 | EC_POINT_point2hex(const EC_GROUP *group, const EC_POINT *point, | 121 | EC_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 | } | 
| 161 | LCRYPTO_ALIAS(EC_POINT_point2hex); | 137 | LCRYPTO_ALIAS(EC_POINT_point2hex); | 
| 162 | 138 | ||
