diff options
| author | jsing <> | 2023-05-09 05:15:55 +0000 |
|---|---|---|
| committer | jsing <> | 2023-05-09 05:15:55 +0000 |
| commit | eb5c4831ebe1fd7e22ce96c554a2521c81a1ea95 (patch) | |
| tree | e69f633337f2b27a9aa779f59fe96171150b6ca8 /src | |
| parent | f82e79aa8805e5defba66b3e8dc6c86a6f1c5ae8 (diff) | |
| download | openbsd-eb5c4831ebe1fd7e22ce96c554a2521c81a1ea95.tar.gz openbsd-eb5c4831ebe1fd7e22ce96c554a2521c81a1ea95.tar.bz2 openbsd-eb5c4831ebe1fd7e22ce96c554a2521c81a1ea95.zip | |
Rewrite BN_bn2hex() using CBB/CBS.
ok tb@
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/bn/bn_convert.c | 60 |
1 files changed, 35 insertions, 25 deletions
diff --git a/src/lib/libcrypto/bn/bn_convert.c b/src/lib/libcrypto/bn/bn_convert.c index 673db093d8..65834ffd1e 100644 --- a/src/lib/libcrypto/bn/bn_convert.c +++ b/src/lib/libcrypto/bn/bn_convert.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: bn_convert.c,v 1.7 2023/05/09 05:12:49 jsing Exp $ */ | 1 | /* $OpenBSD: bn_convert.c,v 1.8 2023/05/09 05:15:55 jsing Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -418,39 +418,49 @@ err: | |||
| 418 | return (0); | 418 | return (0); |
| 419 | } | 419 | } |
| 420 | 420 | ||
| 421 | /* Must 'free' the returned data */ | ||
| 422 | char * | 421 | char * |
| 423 | BN_bn2hex(const BIGNUM *a) | 422 | BN_bn2hex(const BIGNUM *bn) |
| 424 | { | 423 | { |
| 425 | int i, j, v, z = 0; | 424 | int started = 0; |
| 426 | char *buf; | 425 | uint8_t *s = NULL; |
| 427 | char *p; | 426 | size_t s_len; |
| 427 | BN_ULONG v, w; | ||
| 428 | int i, j; | ||
| 429 | CBB cbb; | ||
| 428 | 430 | ||
| 429 | buf = malloc(BN_is_negative(a) + a->top * BN_BYTES * 2 + 2); | 431 | if (!CBB_init(&cbb, 0)) |
| 430 | if (buf == NULL) { | ||
| 431 | BNerror(ERR_R_MALLOC_FAILURE); | ||
| 432 | goto err; | 432 | goto err; |
| 433 | |||
| 434 | if (BN_is_negative(bn)) { | ||
| 435 | if (!CBB_add_u8(&cbb, '-')) | ||
| 436 | goto err; | ||
| 433 | } | 437 | } |
| 434 | p = buf; | 438 | if (BN_is_zero(bn)) { |
| 435 | if (BN_is_negative(a)) | 439 | if (!CBB_add_u8(&cbb, '0')) |
| 436 | *p++ = '-'; | 440 | goto err; |
| 437 | if (BN_is_zero(a)) | 441 | } |
| 438 | *p++ = '0'; | 442 | for (i = bn->top - 1; i >= 0; i--) { |
| 439 | for (i = a->top - 1; i >=0; i--) { | 443 | w = bn->d[i]; |
| 440 | for (j = BN_BITS2 - 8; j >= 0; j -= 8) { | 444 | for (j = BN_BITS2 - 8; j >= 0; j -= 8) { |
| 441 | /* strip leading zeros */ | 445 | v = (w >> j) & 0xff; |
| 442 | v = ((int)(a->d[i] >> (long)j)) & 0xff; | 446 | if (!started && v == 0) |
| 443 | if (z || (v != 0)) { | 447 | continue; |
| 444 | *p++ = hex_digits[v >> 4]; | 448 | if (!CBB_add_u8(&cbb, hex_digits[v >> 4])) |
| 445 | *p++ = hex_digits[v & 0x0f]; | 449 | goto err; |
| 446 | z = 1; | 450 | if (!CBB_add_u8(&cbb, hex_digits[v & 0xf])) |
| 447 | } | 451 | goto err; |
| 452 | started = 1; | ||
| 448 | } | 453 | } |
| 449 | } | 454 | } |
| 450 | *p = '\0'; | 455 | if (!CBB_add_u8(&cbb, '\0')) |
| 456 | goto err; | ||
| 457 | if (!CBB_finish(&cbb, &s, &s_len)) | ||
| 458 | goto err; | ||
| 451 | 459 | ||
| 452 | err: | 460 | err: |
| 453 | return (buf); | 461 | CBB_cleanup(&cbb); |
| 462 | |||
| 463 | return s; | ||
| 454 | } | 464 | } |
| 455 | 465 | ||
| 456 | int | 466 | int |
