diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/bn/bn_convert.c | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/src/lib/libcrypto/bn/bn_convert.c b/src/lib/libcrypto/bn/bn_convert.c index d509a86c08..d38747e017 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.21 2024/04/17 21:55:43 tb Exp $ */ | 1 | /* $OpenBSD: bn_convert.c,v 1.22 2024/06/22 16:33:00 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 | * |
@@ -690,32 +690,43 @@ BN_hex2bn(BIGNUM **bnp, const char *s) | |||
690 | LCRYPTO_ALIAS(BN_hex2bn); | 690 | LCRYPTO_ALIAS(BN_hex2bn); |
691 | 691 | ||
692 | int | 692 | int |
693 | BN_bn2mpi(const BIGNUM *a, unsigned char *d) | 693 | BN_bn2mpi(const BIGNUM *bn, unsigned char *d) |
694 | { | 694 | { |
695 | int bits; | 695 | uint8_t *out_bin; |
696 | int num = 0; | 696 | size_t out_len, out_bin_len; |
697 | int ext = 0; | 697 | int bits, bytes; |
698 | long l; | 698 | int extend; |
699 | 699 | CBB cbb, cbb_bin; | |
700 | bits = BN_num_bits(a); | 700 | |
701 | num = (bits + 7) / 8; | 701 | bits = BN_num_bits(bn); |
702 | if (bits > 0) { | 702 | bytes = (bits + 7) / 8; |
703 | ext = ((bits & 0x07) == 0); | 703 | extend = (bits != 0) && (bits % 8 == 0); |
704 | } | 704 | out_bin_len = extend + bytes; |
705 | out_len = 4 + out_bin_len; | ||
706 | |||
705 | if (d == NULL) | 707 | if (d == NULL) |
706 | return (num + 4 + ext); | 708 | return out_len; |
707 | 709 | ||
708 | l = num + ext; | 710 | if (!CBB_init_fixed(&cbb, d, out_len)) |
709 | d[0] = (unsigned char)(l >> 24) & 0xff; | 711 | goto err; |
710 | d[1] = (unsigned char)(l >> 16) & 0xff; | 712 | if (!CBB_add_u32_length_prefixed(&cbb, &cbb_bin)) |
711 | d[2] = (unsigned char)(l >> 8) & 0xff; | 713 | goto err; |
712 | d[3] = (unsigned char)(l) & 0xff; | 714 | if (!CBB_add_space(&cbb_bin, &out_bin, out_bin_len)) |
713 | if (ext) | 715 | goto err; |
714 | d[4] = 0; | 716 | if (BN_bn2binpad(bn, out_bin, out_bin_len) != out_bin_len) |
715 | num = BN_bn2bin(a, &(d[4 + ext])); | 717 | goto err; |
716 | if (a->neg) | 718 | if (!CBB_finish(&cbb, NULL, NULL)) |
719 | goto err; | ||
720 | |||
721 | if (bn->neg) | ||
717 | d[4] |= 0x80; | 722 | d[4] |= 0x80; |
718 | return (num + 4 + ext); | 723 | |
724 | return out_len; | ||
725 | |||
726 | err: | ||
727 | CBB_cleanup(&cbb); | ||
728 | |||
729 | return -1; | ||
719 | } | 730 | } |
720 | LCRYPTO_ALIAS(BN_bn2mpi); | 731 | LCRYPTO_ALIAS(BN_bn2mpi); |
721 | 732 | ||