bignum: Add ssh_make_unpadded_bignum_string.

Signed-off-by: Simon Josefsson <simon@josefsson.org>
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
Reviewed-by: Sahana Prasad <sahana@redhat.com>
This commit is contained in:
Jakub Jelen
2025-01-03 15:58:02 +01:00
parent c6be50cc97
commit 799557384d
2 changed files with 20 additions and 9 deletions

View File

@@ -31,6 +31,7 @@ extern "C" {
bignum ssh_make_string_bn(ssh_string string); bignum ssh_make_string_bn(ssh_string string);
ssh_string ssh_make_bignum_string(bignum num); ssh_string ssh_make_bignum_string(bignum num);
ssh_string ssh_make_padded_bignum_string(bignum num, size_t pad_len);
void ssh_print_bignum(const char *which, const_bignum num); void ssh_print_bignum(const char *which, const_bignum num);
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -27,21 +27,21 @@
#include "libssh/bignum.h" #include "libssh/bignum.h"
#include "libssh/string.h" #include "libssh/string.h"
ssh_string ssh_make_bignum_string(bignum num) static ssh_string make_bignum_string(bignum num, size_t pad_to_len)
{ {
ssh_string ptr = NULL; ssh_string ptr = NULL;
size_t pad = 0; size_t pad = 0;
size_t len = bignum_num_bytes(num); size_t len = bignum_num_bytes(num);
size_t bits = bignum_num_bits(num); size_t bits = bignum_num_bits(num);
if (len == 0) { if (pad_to_len == 0) {
return NULL;
}
/* If the first bit is set we have a negative number */ /* If the first bit is set we have a negative number */
if (!(bits % 8) && bignum_is_bit_set(num, bits - 1)) { if (!(bits % 8) && bignum_is_bit_set(num, bits - 1)) {
pad++; pad++;
} }
} else {
pad = pad_to_len - bignum_num_bytes(num);
}
#ifdef DEBUG_CRYPTO #ifdef DEBUG_CRYPTO
SSH_LOG(SSH_LOG_TRACE, "%zu bits, %zu bytes, %zu padding", bits, len, pad); SSH_LOG(SSH_LOG_TRACE, "%zu bits, %zu bytes, %zu padding", bits, len, pad);
@@ -54,7 +54,7 @@ ssh_string ssh_make_bignum_string(bignum num)
/* We have a negative number so we need a leading zero */ /* We have a negative number so we need a leading zero */
if (pad) { if (pad) {
ptr->data[0] = 0; memset(ptr->data, 0, pad);
} }
bignum_bn2bin(num, len, ptr->data + pad); bignum_bn2bin(num, len, ptr->data + pad);
@@ -62,6 +62,16 @@ ssh_string ssh_make_bignum_string(bignum num)
return ptr; return ptr;
} }
ssh_string ssh_make_bignum_string(bignum num)
{
return make_bignum_string(num, 0);
}
ssh_string ssh_make_padded_bignum_string(bignum num, size_t pad_len)
{
return make_bignum_string(num, pad_len);
}
bignum ssh_make_string_bn(ssh_string string) bignum ssh_make_string_bn(ssh_string string)
{ {
bignum bn = NULL; bignum bn = NULL;