Crypt-Sodium-XS
view release on metacpan or search on metacpan
#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 )