void nettle_mpz_init_set_str_256_s(mpz_t x, size_t length, const uint8_t *s) { mpz_init(x); nettle_mpz_set_str_256_s(x, length, s); }
int parse_bignum(struct simple_buffer *buffer, mpz_t result, uint32_t limit) { uint32_t length; const uint8_t *digits; if (!parse_string(buffer, &length, &digits)) return 0; /* NOTE: If the reciever expects an integer less than 256^limit, * there may still be limit + 1 digits, as a leading zero is * sometimes required to resolve signedness. */ if (limit && (length > (limit + 1))) return 0; nettle_mpz_set_str_256_s(result, length, digits); return 1; }
static int wrap_nettle_mpi_scan(bigint_t r, const void *buffer, size_t nbytes, gnutls_bigint_format_t format) { if (format == GNUTLS_MPI_FORMAT_USG) { nettle_mpz_set_str_256_u(TOMPZ(r), nbytes, buffer); } else if (format == GNUTLS_MPI_FORMAT_STD) { nettle_mpz_set_str_256_s(TOMPZ(r), nbytes, buffer); #if ENABLE_GOST } else if (format == GNUTLS_MPI_FORMAT_ULE) { nettle_mpz_set_str_256_u_le(TOMPZ(r), nbytes, buffer); #endif } else { gnutls_assert(); goto fail; } return 0; fail: return GNUTLS_E_MPI_SCAN_FAILED; }
int nettle_mpz_set_sexp(mpz_t x, unsigned limit, struct sexp_iterator *i) { if (i->type == SEXP_ATOM && i->atom_length && !i->display) { /* Allow some extra here, for leading sign octets. */ if (limit && (8 * i->atom_length > (16 + limit))) return 0; nettle_mpz_set_str_256_s(x, i->atom_length, i->atom); /* FIXME: How to interpret a limit for negative numbers? */ if (limit && mpz_sizeinbase(x, 2) > limit) return 0; return sexp_iterator_next(i); } else return 0; }
int asn1_der_get_bignum(struct asn1_der_iterator *i, mpz_t x, unsigned max_bits) { if (i->length > 1 && ((i->data[0] == 0 && i->data[1] < 0x80) || (i->data[0] == 0xff && i->data[1] >= 0x80))) /* Non-minimal number of digits */ return 0; /* Allow some extra here, for leading sign octets. */ if (max_bits && (8 * i->length > (16 + max_bits))) return 0; nettle_mpz_set_str_256_s(x, i->length, i->data); /* FIXME: How to interpret a max_bits for negative numbers? */ if (max_bits && mpz_sizeinbase(x, 2) > max_bits) return 0; return 1; }