Crypt-Sodium-XS

 view release on metacpan or  search on metacpan

inc/scalarmult.xs  view on Meta::CPAN

MODULE = Crypt::Sodium::XS PACKAGE = Crypt::Sodium::XS::scalarmult

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

  PPCODE:
  newCONSTSUB(stash, "scalarmult_BYTES",
              newSVuv(crypto_scalarmult_BYTES));
  newCONSTSUB(stash, "scalarmult_SCALARBYTES",
              newSVuv(crypto_scalarmult_SCALARBYTES));
  newCONSTSUB(stash, "scalarmult_x25519_BYTES",
              newSVuv(crypto_scalarmult_BYTES));
  newCONSTSUB(stash, "scalarmult_x25519_SCALARBYTES",
              newSVuv(crypto_scalarmult_SCALARBYTES));
  newCONSTSUB(stash, "scalarmult_ed25519_BYTES",
              newSVuv(crypto_scalarmult_ed25519_BYTES));
  newCONSTSUB(stash, "scalarmult_ed25519_SCALARBYTES",
              newSVuv(crypto_scalarmult_ed25519_SCALARBYTES));
#ifdef SODIUM_HAS_RISTRETTO255
  newCONSTSUB(stash, "scalarmult_ristretto255_BYTES",
              newSVuv(crypto_scalarmult_ristretto255_BYTES));
  newCONSTSUB(stash, "scalarmult_ristretto255_SCALARBYTES",
              newSVuv(crypto_scalarmult_ristretto255_SCALARBYTES));
  newCONSTSUB(stash, "scalarmult_ristretto255_available", &PL_sv_yes);
#else
  newCONSTSUB(stash, "scalarmult_ristretto255_available", &PL_sv_no);
#endif

SV * scalarmult_keygen(SV * flags = &PL_sv_undef)

  ALIAS:
  scalarmult_ed25519_keygen = 1
  scalarmult_ristretto255_keygen = 2
  scalarmult_x25519_keygen = 99

  PREINIT:
  protmem *new_pm;
  unsigned int new_flags = g_protmem_default_flags_key;

  CODE:
  SvGETMAGIC(flags);
  if (SvOK(flags))
    new_flags = SvUV_nomg(flags);

  switch(ix) {
    case 1:
      new_pm = protmem_init(aTHX_ crypto_core_ed25519_SCALARBYTES, new_flags);
      if (new_pm == NULL)
        croak("scalarmult_ed25519_keygen: Failed to allocate protmem");
      crypto_core_ed25519_scalar_random(new_pm->pm_ptr);
      if (protmem_release(aTHX_ new_pm, PROTMEM_FLAG_MPROTECT_RW) != 0) {
        croak("scalarmult_ed25519_keygen: Failed to release protmem RW");
      }

      RETVAL = protmem_to_sv(aTHX_ new_pm, MEMVAULT_CLASS);
      break;
    case 2:
#ifdef SODIUM_HAS_RISTRETTO255
      new_pm = protmem_init(aTHX_ crypto_core_ed25519_SCALARBYTES, new_flags);
      if (new_pm == NULL)
        croak("scalarmult_ed25519_keygen: Failed to allocate protmem");
      crypto_core_ristretto255_scalar_random(new_pm->pm_ptr);
      if (protmem_release(aTHX_ new_pm, PROTMEM_FLAG_MPROTECT_RW) != 0) {
        croak("scalarmult_ed25519_keygen: Failed to release protmem RW");
      }



( run in 0.296 second using v1.01-cache-2.11-cpan-5511b514fd6 )