ssh_string make_bignum_string(bignum num) { ssh_string ptr = NULL; int pad = 0; unsigned int len = bignum_num_bytes(num); unsigned int bits = bignum_num_bits(num); /* Remember if the fist bit is set, it is considered as a * negative number. So 0's must be appended */ if (!(bits % 8) && bignum_is_bit_set(num, bits - 1)) { pad++; } #ifdef DEBUG_CRYPTO fprintf(stderr, "%d bits, %d bytes, %d padding\n", bits, len, pad); #endif /* DEBUG_CRYPTO */ /* TODO: fix that crap !! */ ptr = malloc(4 + len + pad); if (ptr == NULL) { return NULL; } ptr->size = htonl(len + pad); if (pad) { ptr->string[0] = 0; } #ifdef HAVE_LIBGCRYPT bignum_bn2bin(num, len, ptr->string + pad); #elif HAVE_LIBCRYPTO bignum_bn2bin(num, ptr->string + pad); #endif return ptr; }
ssh_string ssh_make_bignum_string(bignum num) { ssh_string ptr = NULL; int pad = 0; unsigned int len = bignum_num_bytes(num); unsigned int bits = bignum_num_bits(num); if (len == 0) { return NULL; } /* If the first bit is set we have a negative number */ if (!(bits % 8) && bignum_is_bit_set(num, bits - 1)) { pad++; } #ifdef DEBUG_CRYPTO fprintf(stderr, "%d bits, %d bytes, %d padding\n", bits, len, pad); #endif /* DEBUG_CRYPTO */ ptr = ssh_string_new(len + pad); if (ptr == NULL) { return NULL; } /* We have a negative number so we need a leading zero */ if (pad) { ptr->data[0] = 0; } bignum_bn2bin(num, len, ptr->data + pad); return ptr; }