Crypt-Sodium-XS

 view release on metacpan or  search on metacpan

inc/util.xs  view on Meta::CPAN

      croak("Failed to allocate memory");
    memcpy(realloc_buf, y_buf, y_len);
    y_buf = realloc_buf;
    y_len = x_len;
  }

  RETVAL = newSV(0);
  Newxz(out_buf, x_len + 1, unsigned char);
  if (out_buf == NULL) {
    if (realloc_buf)
      Safefree(realloc_buf);
    croak("Could not allocate memory");
  }
  memcpy(out_buf, x_buf, x_len);

  sodium_sub(out_buf, y_buf, x_len);
  if (realloc_buf)
    Safefree(realloc_buf);

  sv_usepvn_flags(RETVAL, (char *)out_buf, x_len, SV_HAS_TRAILING_NUL);

  OUTPUT:
  RETVAL

SV * sodium_unpad(SV * buf, STRLEN blocksize);

  PREINIT:
  unsigned char *buf_buf, *unpadded_buf;
  STRLEN buf_len, unpadded_len;

  CODE:
  if (blocksize <= 0)
    croak("sodium_unpad: Invalid blocksize <= 0");

  buf_buf = (unsigned char *)SvPVbyte(buf, buf_len);
  if (buf_len < blocksize)
    croak("sodium_unpad: Buffer is shorter than blocksize");

  if (sodium_unpad(&unpadded_len, buf_buf, buf_len, blocksize) != 0)
    croak("sodium_unpad: Invalid padded buffer");

  Newx(unpadded_buf, unpadded_len + 1, unsigned char);
  if (unpadded_buf == NULL)
    croak("sodium_pad: Failed to allocate memory");
  unpadded_buf[unpadded_len] = '\0';
  memcpy(unpadded_buf, buf_buf, unpadded_len);

  RETVAL=newSV(0);
  sv_usepvn_flags(RETVAL, (char *)unpadded_buf, unpadded_len, SV_HAS_TRAILING_NUL);

  OUTPUT:
  RETVAL

void sodium_memzero(...)

  PREINIT:
  unsigned char *arg_buf;
  STRLEN arg_len;
  int i;

  PPCODE:
  if (!items)
    croak("Missing arguments");

  for (i = 0; i < items; i++) {
    arg_buf = (unsigned char *)SvPVbyte_force(ST(i), arg_len);
    sodium_memzero(arg_buf, arg_len);
  }

  XSRETURN_EMPTY;



( run in 0.739 second using v1.01-cache-2.11-cpan-71847e10f99 )