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; }
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; }
/** @brief generates a random integer between 0 and max * @returns 1 in case of success, 0 otherwise */ int ssh_gcry_rand_range(bignum dest, bignum max) { size_t bits; bignum rnd; int rc; bits = bignum_num_bits(max) + 64; rnd = bignum_new(); if (rnd == NULL) { return 0; } rc = bignum_rand(rnd, bits); if (rc != 1) { return rc; } gcry_mpi_mod(dest, rnd, max); bignum_safe_free(rnd); return 1; }