Crypt-Sodium-XS

 view release on metacpan or  search on metacpan

inc/kdf.xs  view on Meta::CPAN

#define csxs_kdf_DERIVE_ID_CEILING 0x1p+53

MODULE = Crypt::Sodium::XS PACKAGE = Crypt::Sodium::XS::kdf

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

  PPCODE:
  newCONSTSUB(stash, "kdf_BYTES_MAX", newSVuv(crypto_kdf_BYTES_MAX));
  newCONSTSUB(stash, "kdf_blake2b_BYTES_MAX",
              newSVuv(crypto_kdf_blake2b_BYTES_MAX));
  newCONSTSUB(stash, "kdf_BYTES_MIN", newSVuv(crypto_kdf_BYTES_MIN));
  newCONSTSUB(stash, "kdf_blake2b_BYTES_MIN",
              newSVuv(crypto_kdf_blake2b_BYTES_MIN));
  newCONSTSUB(stash, "kdf_CONTEXTBYTES", newSVuv(crypto_kdf_CONTEXTBYTES));
  newCONSTSUB(stash, "kdf_blake2b_CONTEXTBYTES",
              newSVuv(crypto_kdf_blake2b_CONTEXTBYTES));
  newCONSTSUB(stash, "kdf_KEYBYTES", newSVuv(crypto_kdf_KEYBYTES));
  newCONSTSUB(stash, "kdf_blake2b_KEYBYTES",
              newSVuv(crypto_kdf_blake2b_KEYBYTES));
  newCONSTSUB(stash, "kdf_PRIMITIVE", newSVpvs(crypto_kdf_PRIMITIVE));
  newCONSTSUB(stash, "kdf_DERIVE_CEILING", newSVnv(csxs_kdf_DERIVE_ID_CEILING));

SV * kdf_derive( \
  SV * key, \
  SV * id_sv, \
  STRLEN new_key_len, \
  SV * ctx = &PL_sv_undef, \
  SV * flags = &PL_sv_undef \
)

  ALIAS:
  kdf_blake2b_derive = 1

  PREINIT:
  protmem *key_mv = NULL, *new_key_mv;
  unsigned char *key_buf;
  char *ctx_buf = NULL;
  STRLEN key_len, ctx_len, key_req_len, ctx_req_len, new_key_req_min, new_key_req_max;
  unsigned int new_key_flags;
  uint64_t id;
  int (*func)(unsigned char *, size_t, uint64_t,
              const char *, const unsigned char *);

  CODE:
#ifdef LESSTHAN64BITINT
  id = SvNV(id_sv);
#else
  id = SvUV(id_sv);
#endif
  if (id >= csxs_kdf_DERIVE_ID_CEILING)
    croak("derive: id cannot be larger than (%a - 1)", csxs_kdf_DERIVE_ID_CEILING);
  switch(ix) {
    case 1:
      key_req_len = crypto_kdf_blake2b_KEYBYTES;
      ctx_req_len = crypto_kdf_blake2b_CONTEXTBYTES;
      new_key_req_min = crypto_kdf_blake2b_BYTES_MIN;
      new_key_req_max = crypto_kdf_blake2b_BYTES_MAX;
      func = crypto_kdf_blake2b_derive_from_key;
      break;
    default:
      key_req_len = crypto_kdf_KEYBYTES;
      ctx_req_len = crypto_kdf_CONTEXTBYTES;
      new_key_req_min = crypto_kdf_BYTES_MIN;
      new_key_req_max = crypto_kdf_BYTES_MAX;
      func = crypto_kdf_derive_from_key;
  }



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