Crypt-Sodium-XS

 view release on metacpan or  search on metacpan

inc/protmem.xs  view on Meta::CPAN

MODULE = Crypt::Sodium::XS PACKAGE = Crypt::Sodium::XS::ProtMem

void _define_constants()

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

  PPCODE:
  newCONSTSUB(stash, "PROTMEM_ALL_DISABLED",
              newSVuv(PROTMEM_FLAG_ALL_DISABLED));
  newCONSTSUB(stash, "PROTMEM_ALL_ENABLED",
              newSVuv(PROTMEM_FLAG_ALL_ENABLED));
  newCONSTSUB(stash, "PROTMEM_MASK_MPROTECT",
              newSVuv(PROTMEM_FLAG_MPROTECT_MASK));
  newCONSTSUB(stash, "PROTMEM_FLAGS_MPROTECT_NOACCESS",
              newSVuv(PROTMEM_FLAG_MPROTECT_NOACCESS));
  newCONSTSUB(stash, "PROTMEM_FLAGS_MPROTECT_RO",
              newSVuv(PROTMEM_FLAG_MPROTECT_RO));
  newCONSTSUB(stash, "PROTMEM_FLAGS_MPROTECT_RW",
              newSVuv(PROTMEM_FLAG_MPROTECT_RW));
  newCONSTSUB(stash, "PROTMEM_MASK_MLOCK",
              newSVuv(PROTMEM_FLAG_MLOCK_MASK));
  newCONSTSUB(stash, "PROTMEM_FLAGS_MLOCK_PERMISSIVE",
              newSVuv(PROTMEM_FLAG_MLOCK_PERMISSIVE));
  newCONSTSUB(stash, "PROTMEM_FLAGS_MLOCK_NONE",
              newSVuv(PROTMEM_FLAG_MLOCK_NONE));
  newCONSTSUB(stash, "PROTMEM_FLAGS_MLOCK_STRICT",
              newSVuv(PROTMEM_FLAG_MLOCK_STRICT));
  newCONSTSUB(stash, "PROTMEM_MASK_LOCK",
              newSVuv(PROTMEM_FLAG_LOCK_MASK));
  newCONSTSUB(stash, "PROTMEM_FLAGS_LOCK_LOCKED",
              newSVuv(PROTMEM_FLAG_LOCK_LOCKED));
  newCONSTSUB(stash, "PROTMEM_FLAGS_LOCK_UNLOCKED",
              newSVuv(PROTMEM_FLAG_LOCK_UNLOCKED));
  newCONSTSUB(stash, "PROTMEM_FLAGS_MPROTECT_LOCKED",
              newSVuv(PROTMEM_FLAG_MPROTECT_MASK));
  newCONSTSUB(stash, "PROTMEM_MASK_MEMZERO",
              newSVuv(PROTMEM_FLAG_MEMZERO_MASK));
  newCONSTSUB(stash, "PROTMEM_FLAGS_MEMZERO_ENABLED",
              newSVuv(PROTMEM_FLAG_MEMZERO_ENABLED));
  newCONSTSUB(stash, "PROTMEM_FLAGS_MEMZERO_DISABLED",
              newSVuv(PROTMEM_FLAG_MEMZERO_DISABLED));
  newCONSTSUB(stash, "PROTMEM_MASK_MALLOC",
              newSVuv(PROTMEM_FLAG_MALLOC_MASK));
  newCONSTSUB(stash, "PROTMEM_FLAGS_MALLOC_SODIUM",
              newSVuv(PROTMEM_FLAG_MALLOC_SODIUM));
  newCONSTSUB(stash, "PROTMEM_FLAGS_MALLOC_PLAIN",
              newSVuv(PROTMEM_FLAG_MALLOC_PLAIN));
  XSRETURN_YES;

void protmem_default_flags_memvault(SV * flags = &PL_sv_undef)

  ALIAS:
  protmem_default_flags_key = 1
  protmem_default_flags_decrypt = 2
  protmem_default_flags_state = 3
  protmem_default_flags_memvault_mprotect = 4
  protmem_default_flags_key_mprotect = 5
  protmem_default_flags_decrypt_mprotect = 6
  protmem_default_flags_state_mprotect = 7
  protmem_default_flags_memvault_mlock = 8
  protmem_default_flags_key_mlock = 9
  protmem_default_flags_decrypt_mlock = 10
  protmem_default_flags_state_mlock = 11
  protmem_default_flags_key_lock = 12
  protmem_default_flags_memvault_lock = 13
  protmem_default_flags_decrypt_lock = 14
  protmem_default_flags_state_lock = 15
  protmem_default_flags_key_memzero = 16
  protmem_default_flags_memvault_memzero = 17
  protmem_default_flags_decrypt_memzero = 18
  protmem_default_flags_state_memzero = 19
  protmem_default_flags_key_malloc = 20
  protmem_default_flags_memvault_malloc = 21
  protmem_default_flags_decrypt_malloc = 22
  protmem_default_flags_state_malloc = 23

  PREINIT:
  U32 new_flags, old_flags, *global, mask = 0;

  PPCODE:
  switch(ix % 4) {
    case 1:
      global = &g_protmem_default_flags_key;
      break;
    case 2:
      global = &g_protmem_default_flags_decrypt;
      break;
    case 3:
      global = &g_protmem_default_flags_state;
      break;
    default:
      global = &g_protmem_default_flags_memvault;
  }
  if (ix > 3) {
    if (ix <= 7)
      mask = PROTMEM_FLAG_MPROTECT_MASK;
    else if (ix <= 11)
      mask = PROTMEM_FLAG_MLOCK_MASK;
    else if (ix <= 15)
      mask = PROTMEM_FLAG_LOCK_MASK;
    else if (ix <= 19)
      mask = PROTMEM_FLAG_MEMZERO_MASK;
    else
      mask = PROTMEM_FLAG_MALLOC_MASK;
  }

  old_flags = *global;
  if (ix > 3)
    old_flags &= mask;

  SvGETMAGIC(flags);
  if (SvOK(flags)) {
    new_flags = SvUV_nomg(flags);
    /* TODO: check for invalid flags */
    if (ix <= 3)
      *global = new_flags;
    else {
      *global &= ~mask;
      new_flags &= mask;
      *global |= new_flags;
    }
  }

  XSRETURN_UV(old_flags);



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