diff --git a/CryptX.xs b/CryptX.xs index 1d2c726..4180c5a 100644 --- a/CryptX.xs +++ b/CryptX.xs @@ -581,7 +581,6 @@ mp_int mpi; if (in == NULL || strlen(in) == 0) XSRETURN_UNDEF; - if (mp_init(&mpi) != CRYPT_OK) XSRETURN_UNDEF; if (mp_read_radix(&mpi, in, radix) == CRYPT_OK) { @@ -624,14 +623,21 @@ } mp_clear(&tmp); - RETVAL = NEWSV(0, digits + 1); - SvPOK_only(RETVAL); - out_data = SvPVX(RETVAL); - mp_toradix(&mpi, out_data, radix); - SvCUR_set(RETVAL, digits); + if (digits == 0) { + RETVAL = newSVpvn("", 0); + mp_clear(&mpi); + } + else { + RETVAL = NEWSV(0, digits + 2); /* +2 for sign and NUL byte */ + SvPOK_only(RETVAL); + out_data = SvPVX(RETVAL); + mp_toradix(&mpi, out_data, radix); + SvCUR_set(RETVAL, strlen(out_data)); + mp_clear(&mpi); + } + } + else { mp_clear(&mpi); - } - else { XSRETURN_UNDEF; } } diff --git a/inc/CryptX_PRNG.xs.inc b/inc/CryptX_PRNG.xs.inc index d57b0f8..192f1f6 100644 --- a/inc/CryptX_PRNG.xs.inc +++ b/inc/CryptX_PRNG.xs.inc @@ -68,7 +68,7 @@ { STRLEN in_len=0; unsigned char *in_buffer=NULL; - unsigned char entropy_buf[32]; + unsigned char entropy_buf[40]; int rv; if (SvOK(entropy)) { in_buffer = (unsigned char *) SvPVbyte(entropy, in_len); @@ -76,8 +76,8 @@ if (rv != CRYPT_OK) croak("FATAL: PRNG_add_entropy failed: %s", error_to_string(rv)); } else { - if (rng_get_bytes(entropy_buf, 32, NULL) != 32) croak("FATAL: rng_get_bytes failed"); - rv = self->desc->add_entropy(entropy_buf, 32, &self->state); + if (rng_get_bytes(entropy_buf, 40, NULL) != 40) croak("FATAL: rng_get_bytes failed"); + rv = self->desc->add_entropy(entropy_buf, 40, &self->state); if (rv != CRYPT_OK) croak("FATAL: PRNG_add_entropy failed: %s", error_to_string(rv)); } rv = self->desc->ready(&self->state); @@ -90,11 +90,11 @@ { int rv_len; unsigned char *rdata; - unsigned char entropy_buf[32]; + unsigned char entropy_buf[40]; if (self->last_pid != curpid) { - rng_get_bytes(entropy_buf, 32, NULL); - self->desc->add_entropy(entropy_buf, 32, &self->state); + if (rng_get_bytes(entropy_buf, 40, NULL) != 40) croak("FATAL: rng_get_bytes failed"); + self->desc->add_entropy(entropy_buf, 40, &self->state); self->desc->ready(&self->state); self->last_pid = curpid; } @@ -118,11 +118,11 @@ { int i; unsigned char rdata[4]; - unsigned char entropy_buf[32]; + unsigned char entropy_buf[40]; if (self->last_pid != curpid) { - rng_get_bytes(entropy_buf, 32, NULL); - self->desc->add_entropy(entropy_buf, 32, &self->state); + if (rng_get_bytes(entropy_buf, 40, NULL) != 40) croak("FATAL: rng_get_bytes failed"); + self->desc->add_entropy(entropy_buf, 40, &self->state); self->desc->ready(&self->state); self->last_pid = curpid; } @@ -141,12 +141,12 @@ int i; unsigned long a, b; /* 32bit is enough */ unsigned char rdata[7]; /* for double we need 53 bits */ - unsigned char entropy_buf[32]; + unsigned char entropy_buf[40]; NV limit; if (self->last_pid != curpid) { - rng_get_bytes(entropy_buf, 32, NULL); - self->desc->add_entropy(entropy_buf, 32, &self->state); + if (rng_get_bytes(entropy_buf, 40, NULL) != 40) croak("FATAL: rng_get_bytes failed"); + self->desc->add_entropy(entropy_buf, 40, &self->state); self->desc->ready(&self->state); self->last_pid = curpid; }