Crypt-Sodium-XS

 view release on metacpan or  search on metacpan

inc/base64.xs  view on Meta::CPAN

MODULE = Crypt::Sodium::XS PACKAGE = Crypt::Sodium::XS::Base64

void _define_constants()
  PREINIT:
  HV *stash = gv_stashpv("Crypt::Sodium::XS::Base64", 0);

  PPCODE:
  newCONSTSUB(stash, "BASE64_VARIANT_ORIGINAL",
              newSVuv(sodium_base64_VARIANT_ORIGINAL));
  newCONSTSUB(stash, "BASE64_VARIANT_ORIGINAL_NO_PADDING",
              newSVuv(sodium_base64_VARIANT_ORIGINAL_NO_PADDING));
  newCONSTSUB(stash, "BASE64_VARIANT_URLSAFE",
              newSVuv(sodium_base64_VARIANT_URLSAFE));
  newCONSTSUB(stash, "BASE64_VARIANT_URLSAFE_NO_PADDING",
              newSVuv(sodium_base64_VARIANT_URLSAFE_NO_PADDING));
  XSRETURN_YES;

SV * sodium_bin2base64(SV * bytes, int variant = sodium_base64_VARIANT_URLSAFE_NO_PADDING)

  PREINIT:
  char *bytes_buf;
  char *out_buf;
  STRLEN bytes_len;
  STRLEN out_len;

  CODE:
  switch (variant) {
    case sodium_base64_VARIANT_ORIGINAL: /* fallthrough */
    case sodium_base64_VARIANT_ORIGINAL_NO_PADDING: /* fallthrough */
    case sodium_base64_VARIANT_URLSAFE: /* fallthrough */
    case sodium_base64_VARIANT_URLSAFE_NO_PADDING:
      break;
    default:
      croak("Invalid base64 variant");
  }

  bytes_buf = SvPVbyte(bytes, bytes_len);
  out_len = sodium_base64_encoded_len(bytes_len, variant);
  Newx(out_buf, out_len, char);
  if (out_buf == NULL)
    croak("Failed to allocate memory");
  /* sodium_bin2base64 adds null */
  sodium_bin2base64(out_buf, out_len, (unsigned char *)bytes_buf, bytes_len, variant);
  RETVAL = newSV(0);
  sv_usepvn_flags(RETVAL, out_buf, out_len - 1, SV_HAS_TRAILING_NUL);

  OUTPUT:
  RETVAL

SV * sodium_base642bin(SV * bytes, int variant = sodium_base64_VARIANT_URLSAFE_NO_PADDING)

  PREINIT:
  char *bytes_buf;
  char *out_buf;
  STRLEN bytes_len;
  STRLEN out_len;

  CODE:
  switch (variant) {
    case sodium_base64_VARIANT_ORIGINAL: /* fallthrough */
    case sodium_base64_VARIANT_ORIGINAL_NO_PADDING: /* fallthrough */
    case sodium_base64_VARIANT_URLSAFE: /* fallthrough */
    case sodium_base64_VARIANT_URLSAFE_NO_PADDING:
      break;
    default:
      croak("Invalid base64 variant");
  }



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