Crypt-Sodium-XS

 view release on metacpan or  search on metacpan

inc/curve25519.xs  view on Meta::CPAN

MODULE = Crypt::Sodium::XS PACKAGE = Crypt::Sodium::XS::curve25519

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

  PPCODE:
  newCONSTSUB(stash, "core_ed25519_BYTES",
              newSVuv(crypto_core_ed25519_BYTES));
  newCONSTSUB(stash, "core_ed25519_HASHBYTES",
              newSVuv(crypto_core_ed25519_HASHBYTES));
  newCONSTSUB(stash, "core_ed25519_NONREDUCEDSCALARBYTES",
              newSVuv(crypto_core_ed25519_NONREDUCEDSCALARBYTES));
  newCONSTSUB(stash, "core_ed25519_SCALARBYTES",
              newSVuv(crypto_core_ed25519_SCALARBYTES));
  newCONSTSUB(stash, "core_ed25519_UNIFORMBYTES",
              newSVuv(crypto_core_ed25519_UNIFORMBYTES));
#ifdef SODIUM_HAS_RISTRETTO255
  newCONSTSUB(stash, "core_ristretto255_BYTES",
              newSVuv(crypto_core_ristretto255_BYTES));
  newCONSTSUB(stash, "core_ristretto255_HASHBYTES",
              newSVuv(crypto_core_ristretto255_HASHBYTES));
  newCONSTSUB(stash, "core_ristretto255_NONREDUCEDSCALARBYTES",
              newSVuv(crypto_core_ristretto255_NONREDUCEDSCALARBYTES));
  newCONSTSUB(stash, "core_ristretto255_SCALARBYTES",
              newSVuv(crypto_core_ristretto255_SCALARBYTES));
  newCONSTSUB(stash, "core_ristretto255_available", &PL_sv_yes);
#else
  newCONSTSUB(stash, "core_ristretto255_available", &PL_sv_no);
#endif

SV * core_ed25519_add(SV * p, SV * q)

  ALIAS:
  core_ed25519_sub = 1
  core_ristretto255_add = 2
  core_ristretto255_sub = 3

  PREINIT:
  protmem *p_pm = NULL, *q_pm = NULL;
  int ret;
  unsigned char *a_buf, *p_buf, *q_buf;
  STRLEN a_len, p_len, p_req_len, q_len, q_req_len;

  CODE:
  switch(ix) {
    /* case 1 is same as default */
    case 2:
      /* fallthrough */
    case 3:
      a_len = crypto_core_ristretto255_BYTES;
      p_req_len = crypto_core_ristretto255_BYTES;
      q_req_len = crypto_core_ristretto255_BYTES;
      break;
    default:
      a_len = crypto_core_ed25519_BYTES;
      p_req_len = crypto_core_ed25519_BYTES;
      q_req_len = crypto_core_ed25519_BYTES;
  }
  if (sv_derived_from(p, MEMVAULT_CLASS)) {
    p_pm = protmem_get(aTHX_ p, MEMVAULT_CLASS);
    p_buf = p_pm->pm_ptr;
    p_len = p_pm->size;
  }
  else
    p_buf = (unsigned char *)SvPVbyte(p, p_len);
  if (p_len != p_req_len)

inc/curve25519.xs  view on Meta::CPAN


  RETVAL = newSV(0);
  sv_usepvn_flags(RETVAL, (char *)a_buf, a_len, SV_HAS_TRAILING_NUL);

  OUTPUT:
  RETVAL

SV * core_ed25519_from_uniform(SV * r)

  ALIAS:
  core_ristretto255_from_hash = 1

  PREINIT:
  STRLEN p_len, r_len, r_req_len;
  unsigned char *p_buf, *r_buf;

  CODE:
  switch(ix) {
    case 1:
      p_len = crypto_core_ristretto255_BYTES;
      r_req_len = crypto_core_ristretto255_BYTES;
      break;
    default:
      p_len = crypto_core_ed25519_BYTES;
      r_req_len = crypto_core_ed25519_BYTES;
  }
  r_buf = (unsigned char *)SvPVbyte(r, r_len);
  if (r_len != r_req_len)
    croak("ed25519_from_uniform: invalid vector length");

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

  switch(ix) {
    case 1:
      crypto_core_ristretto255_from_hash(p_buf, r_buf);
      break;
    default:
      crypto_core_ed25519_from_uniform(p_buf, r_buf);
  }

  RETVAL = newSV(0);
  sv_usepvn_flags(RETVAL, (char *)p_buf, p_len, SV_HAS_TRAILING_NUL);

  OUTPUT:
  RETVAL

SV * core_ed25519_is_valid_point(SV * p)

  ALIAS:
  core_ristretto255_is_valid_point = 1

  PREINIT:
  protmem *p_pm = NULL;
  int ret;
  unsigned char *p_buf;
  STRLEN p_len, p_req_len;

  PPCODE:
  PERL_UNUSED_VAR(RETVAL);
  switch(ix) {
    case 1:
      p_req_len = crypto_core_ristretto255_BYTES;
      break;
    default:
      p_req_len = crypto_core_ed25519_BYTES;
  }
  if (sv_derived_from(p, MEMVAULT_CLASS)) {
    p_pm = protmem_get(aTHX_ p, MEMVAULT_CLASS);
    p_buf = p_pm->pm_ptr;
    p_len = p_pm->size;
  }
  else
    p_buf = (unsigned char *)SvPVbyte(p, p_len);
  if (p_len != p_req_len)
    croak("ed25519_is_valid_point: Invalid point length");

  if (p_pm && protmem_grant(aTHX_ p_pm, PROTMEM_FLAG_MPROTECT_RO) != 0)
    croak("ed25519_is_valid_point: Failed to grant protmem RO");

  switch(ix) {
    case 1:
      ret = crypto_core_ristretto255_is_valid_point(p_buf);
      break;
    default:
      ret = crypto_core_ed25519_is_valid_point(p_buf);
  }

  if (p_pm && protmem_release(aTHX_ p_pm, PROTMEM_FLAG_MPROTECT_RO) != 0)
    croak("ed25519_is_valid_point: Failed to release protmem RO");

  if (ret == 1)
    XSRETURN_YES;
  XSRETURN_NO;

SV * core_ed25519_random()

  ALIAS:
  core_ristretto255_random = 1

  PREINIT:
  unsigned char *p_buf;
  STRLEN p_len;

  CODE:
  switch(ix) {
    case 1:
      p_len = crypto_core_ristretto255_BYTES;
      break;
    default:
      p_len = crypto_core_ed25519_BYTES;
  }
  Newx(p_buf, p_len + 1, unsigned char);
  if (p_buf == NULL)
    croak("ed25519_scalar_random: Failed to allocate memory");
  p_buf[p_len] = '\0';

  switch(ix) {
    case 1:



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