Crypt-Sodium-XS

 view release on metacpan or  search on metacpan

inc/onetimeauth.xs  view on Meta::CPAN

MODULE = Crypt::Sodium::XS PACKAGE = Crypt::Sodium::XS::onetimeauth

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

  PPCODE:
  newCONSTSUB(stash, "onetimeauth_BYTES", newSVuv(crypto_onetimeauth_BYTES));
  newCONSTSUB(stash, "onetimeauth_poly1305_BYTES",
              newSVuv(crypto_onetimeauth_poly1305_BYTES));
  newCONSTSUB(stash, "onetimeauth_KEYBYTES",
              newSVuv(crypto_onetimeauth_KEYBYTES));
  newCONSTSUB(stash, "onetimeauth_poly1305_KEYBYTES",
              newSVuv(crypto_onetimeauth_poly1305_KEYBYTES));
  newCONSTSUB(stash, "onetimeauth_PRIMITIVE",
              newSVpvs(crypto_onetimeauth_PRIMITIVE));

SV *onetimeauth(SV *msg, SV *key)

  ALIAS:
  onetimeauth_poly1305 = 1

  PREINIT:
  protmem *msg_pm = NULL, *key_pm = NULL;
  unsigned char *msg_buf, *key_buf, *out_buf;
  STRLEN key_len, msg_len;
  int (*func)(unsigned char *, const unsigned char *,
              unsigned long long, const unsigned char *);

  CODE:
  switch(ix) {
    case 1:
      func = crypto_onetimeauth_poly1305;
      break;
    default:
      func = crypto_onetimeauth;
  }

  if (sv_derived_from(msg, MEMVAULT_CLASS)) {
    msg_pm = protmem_get(aTHX_ msg, MEMVAULT_CLASS);
    msg_buf = msg_pm->pm_ptr;
    msg_len = msg_pm->size;
  }
  else
    msg_buf = (unsigned char *)SvPVbyte(msg, msg_len);

  if (sv_derived_from(key, MEMVAULT_CLASS)) {
    key_pm = protmem_get(aTHX_ key, MEMVAULT_CLASS);
    key_buf = key_pm->pm_ptr;
    key_len = key_pm->size;
  }
  else
    key_buf = (unsigned char *)SvPVbyte(key, key_len);
  if (key_len != crypto_onetimeauth_KEYBYTES)
    croak("onetimeauth: Invalid key length %lu", key_len);

  Newx(out_buf, crypto_onetimeauth_BYTES + 1, unsigned char);
  if (out_buf == NULL)
    croak("onetimeauth: Failed to allocate memory");
  out_buf[crypto_onetimeauth_BYTES] = '\0';

  if (msg_pm && protmem_grant(aTHX_ msg_pm, PROTMEM_FLAG_MPROTECT_RO) != 0) {
    Safefree(out_buf);
    croak("onetimeauth: Failed to grant msg protmem RO");
  }

  if (key_pm && protmem_grant(aTHX_ key_pm, PROTMEM_FLAG_MPROTECT_RO) != 0) {

inc/onetimeauth.xs  view on Meta::CPAN


  CODE:
  switch(ix) {
    case 1:
      Newx(out_buf, crypto_onetimeauth_poly1305_BYTES + 1, unsigned char);
      if (out_buf == NULL)
        croak("final: Failed to allocate memory");
      out_buf[crypto_onetimeauth_poly1305_BYTES] = '\0';

      state_pm = protmem_get(aTHX_ self, "Crypt::Sodium::XS::onetimeauth::poly1305_multi");
      break;
    default:
      Newx(out_buf, crypto_onetimeauth_BYTES + 1, unsigned char);
      if (out_buf == NULL)
        croak("final: Failed to allocate memory");
      out_buf[crypto_onetimeauth_BYTES] = '\0';

      state_pm = protmem_get(aTHX_ self, "Crypt::Sodium::XS::onetimeauth::multi");
  }
  if (protmem_grant(aTHX_ state_pm, PROTMEM_FLAG_MPROTECT_RW) != 0) {
    Safefree(out_buf);
    croak("final: Failed to grant state protmem RW");
  }

  switch(ix) {
    case 1:
      crypto_onetimeauth_poly1305_final(state_pm->pm_ptr, out_buf);
      break;
    default:
      crypto_onetimeauth_final(state_pm->pm_ptr, out_buf);
  }

  if (protmem_release(aTHX_ state_pm, PROTMEM_FLAG_MPROTECT_RW) != 0) {
    Safefree(out_buf);
    croak("final: Failed to release state protmem RW");
  }

  RETVAL = newSV(0);
  switch(ix) {
    case 1:
      sv_usepvn_flags(RETVAL, (char *)out_buf, crypto_onetimeauth_poly1305_BYTES, SV_HAS_TRAILING_NUL);
      break;
    default:
      sv_usepvn_flags(RETVAL, (char *)out_buf, crypto_onetimeauth_BYTES, SV_HAS_TRAILING_NUL);
  }

  OUTPUT:
  RETVAL

void update(SV *self, ...)

  ALIAS:
  Crypt::Sodium::XS::onetimeauth::poly1305_multi::update = 1

  PREINIT:
  protmem *state_pm, *msg_mv = NULL;
  unsigned char *msg_buf;
  STRLEN msg_len;
  I32 i;

  PPCODE:
  switch(ix) {
    case 1:
      state_pm = protmem_get(aTHX_ self, "Crypt::Sodium::XS::onetimeauth::poly1305_multi");
      break;
    default:
      state_pm = protmem_get(aTHX_ self, "Crypt::Sodium::XS::onetimeauth::multi");
  }
  if (protmem_grant(aTHX_ state_pm, PROTMEM_FLAG_MPROTECT_RW) != 0)
    croak("update: Failed to grant state protmem RW");

  for (i = 1; i < items; i++) {
    if (sv_derived_from(ST(i), MEMVAULT_CLASS)) {
      msg_mv = protmem_get(aTHX_ ST(i), MEMVAULT_CLASS);
      msg_buf = msg_mv->pm_ptr;
      msg_len = msg_mv->size;
    }
    else
      msg_buf = (unsigned char *)SvPVbyte(ST(i), msg_len);

    if (msg_mv && protmem_grant(aTHX_ msg_mv, PROTMEM_FLAG_MPROTECT_RO) != 0) {
      protmem_release(aTHX_ state_pm, PROTMEM_FLAG_MPROTECT_RW);
      croak("update: Failed to grant msg protmem RO");
    }

    switch(ix) {
      case 1:
        crypto_onetimeauth_poly1305_update(state_pm->pm_ptr, msg_buf, msg_len);
        break;
      default:
        crypto_onetimeauth_update(state_pm->pm_ptr, msg_buf, msg_len);
    }

    if (msg_mv && protmem_release(aTHX_ msg_mv, PROTMEM_FLAG_MPROTECT_RO) != 0) {
      protmem_release(aTHX_ state_pm, PROTMEM_FLAG_MPROTECT_RW);
      croak("update: Failed to release msg protmem RO");
    }

    msg_mv = NULL;
  }

  if (protmem_release(aTHX_ state_pm, PROTMEM_FLAG_MPROTECT_RW) != 0)
    croak("update: Failed to release state protmem RW");

  XSRETURN(1);



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