Crypt-Sodium-XS
view release on metacpan or search on metacpan
MODULE = Crypt::Sodium::XS PACKAGE = Crypt::Sodium::XS::xof
void _define_constants()
PREINIT:
HV *stash = gv_stashpv("Crypt::Sodium::XS::xof", 0);
PPCODE:
#ifdef SODIUM_HAS_XOF
newCONSTSUB(stash, "xof_shake128_BLOCKBYTES",
newSVuv(crypto_xof_shake128_BLOCKBYTES));
newCONSTSUB(stash, "xof_shake128_STATEBYTES",
newSVuv(crypto_xof_shake128_STATEBYTES));
newCONSTSUB(stash, "xof_shake128_DOMAIN_STANDARD",
newSVpvf("%c", crypto_xof_shake128_DOMAIN_STANDARD));
newCONSTSUB(stash, "xof_shake256_BLOCKBYTES",
newSVuv(crypto_xof_shake256_BLOCKBYTES));
newCONSTSUB(stash, "xof_shake256_STATEBYTES",
newSVuv(crypto_xof_shake256_STATEBYTES));
newCONSTSUB(stash, "xof_shake256_DOMAIN_STANDARD",
newSVpvf("%c", crypto_xof_shake256_DOMAIN_STANDARD));
newCONSTSUB(stash, "xof_turboshake128_BLOCKBYTES",
newSVuv(crypto_xof_turboshake128_BLOCKBYTES));
newCONSTSUB(stash, "xof_turboshake128_STATEBYTES",
newSVuv(crypto_xof_turboshake128_STATEBYTES));
newCONSTSUB(stash, "xof_turboshake128_DOMAIN_STANDARD",
newSVpvf("%c", crypto_xof_turboshake128_DOMAIN_STANDARD));
newCONSTSUB(stash, "xof_turboshake256_BLOCKBYTES",
newSVuv(crypto_xof_turboshake256_BLOCKBYTES));
newCONSTSUB(stash, "xof_turboshake256_STATEBYTES",
newSVuv(crypto_xof_turboshake256_STATEBYTES));
newCONSTSUB(stash, "xof_turboshake256_DOMAIN_STANDARD",
newSVpvf("%c", crypto_xof_turboshake256_DOMAIN_STANDARD));
newCONSTSUB(stash, "available", &PL_sv_yes);
#else
newCONSTSUB(stash, "available", &PL_sv_no);
#endif
SV * xof_shake128(SV * msg, STRLEN out_len, SV * flags = &PL_sv_undef)
ALIAS:
xof_shake256 = 1
xof_turboshake128 = 2
xof_turboshake256 = 3
xof_shake128_key = 16
xof_shake256_key = 17
xof_turboshake128_key = 18
xof_turboshake256_key = 19
PREINIT:
protmem *msg_pm = NULL, *out_pm = NULL;
unsigned char *msg_buf, *out_buf;
STRLEN msg_len;
unsigned int out_flags = g_protmem_default_flags_key;
CODE:
#ifdef SODIUM_HAS_XOF
SvGETMAGIC(flags);
if (SvOK(flags))
out_flags = SvUV_nomg(flags);
if (sv_derived_from(msg, MEMVAULT_CLASS)) {
msg_pm = protmem_get(aTHX_ msg, MEMVAULT_CLASS);
msg_buf = msg_pm->pm_ptr;
msg_len = msg_pm->size;
}
else
msg_buf = (unsigned char *)SvPVbyte(msg, msg_len);
if (out_pm)
protmem_free(aTHX_ out_pm);
else
Safefree(out_buf);
croak("squeeze: Failed to grant protmem RW");
}
switch(ix & ~0x10) {
case 1:
crypto_xof_shake256_squeeze(state_pm->pm_ptr, out_buf, out_len);
break;
case 2:
crypto_xof_turboshake128_squeeze(state_pm->pm_ptr, out_buf, out_len);
break;
case 3:
crypto_xof_turboshake256_squeeze(state_pm->pm_ptr, out_buf, out_len);
break;
default:
crypto_xof_shake128_squeeze(state_pm->pm_ptr, out_buf, out_len);
}
if (protmem_release(aTHX_ state_pm, PROTMEM_FLAG_MPROTECT_RW) != 0) {
if (out_pm)
protmem_free(aTHX_ out_pm);
else
Safefree(out_buf);
croak("squeeze: Failed to release state protmem RW");
}
if (ix & 0x10) {
if (protmem_release(aTHX_ out_pm, PROTMEM_FLAG_MPROTECT_RW) != 0) {
protmem_free(aTHX_ state_pm);
croak("squeeze: Failed to release out protmem RW");
}
RETVAL = protmem_to_sv(aTHX_ out_pm, MEMVAULT_CLASS);
}
else {
RETVAL = newSV(0);
sv_usepvn_flags(RETVAL, (char *)out_buf, out_len, SV_HAS_TRAILING_NUL);
}
#else
croak("XOF not supported by this version of libsodium");
#endif
OUTPUT:
RETVAL
void update(SV * self, ...)
ALIAS:
Crypt::Sodium::XS::xof::shake256_multi::update = 1
Crypt::Sodium::XS::xof::turboshake128_multi::update = 2
Crypt::Sodium::XS::xof::turboshake256_multi::update = 3
PREINIT:
protmem *state_pm, *msg_pm = NULL;
unsigned char *msg_buf;
STRLEN msg_len;
I32 i;
PPCODE:
#ifdef SODIUM_HAS_XOF
switch(ix) {
case 1:
state_pm = protmem_get(aTHX_ self, "Crypt::Sodium::XS::xof::shake256_multi");
break;
case 2:
state_pm = protmem_get(aTHX_ self, "Crypt::Sodium::XS::xof::turboshake128_multi");
break;
case 3:
state_pm = protmem_get(aTHX_ self, "Crypt::Sodium::XS::xof::turboshake256_multi");
break;
default:
state_pm = protmem_get(aTHX_ self, "Crypt::Sodium::XS::xof::shake128_multi");
}
if (protmem_grant(aTHX_ state_pm, PROTMEM_FLAG_MPROTECT_RW) != 0)
croak("update: Failed to grant state protmem RW");
for (i = 1; i < items; i++) {
if (sv_derived_from(ST(i), MEMVAULT_CLASS)) {
msg_pm = protmem_get(aTHX_ ST(i), MEMVAULT_CLASS);
msg_buf = msg_pm->pm_ptr;
msg_len = msg_pm->size;
}
else
msg_buf = (unsigned char *)SvPVbyte(ST(i), msg_len);
if (msg_pm && protmem_grant(aTHX_ msg_pm, PROTMEM_FLAG_MPROTECT_RO) != 0) {
protmem_release(aTHX_ state_pm, PROTMEM_FLAG_MPROTECT_RW);
croak("update: Failed to grant msg protmem RO");
}
switch(ix) {
case 1:
crypto_xof_shake128_update(state_pm->pm_ptr, msg_buf, msg_len);
break;
case 2:
crypto_xof_turboshake128_update(state_pm->pm_ptr, msg_buf, msg_len);
break;
case 3:
crypto_xof_turboshake256_update(state_pm->pm_ptr, msg_buf, msg_len);
break;
default:
crypto_xof_shake128_update(state_pm->pm_ptr, msg_buf, msg_len);
}
if (msg_pm && protmem_release(aTHX_ msg_pm, PROTMEM_FLAG_MPROTECT_RO) != 0) {
protmem_release(aTHX_ state_pm, PROTMEM_FLAG_MPROTECT_RW);
croak("update: Failed to release msg protmem RO");
}
msg_pm = NULL;
}
if (protmem_release(aTHX_ state_pm, PROTMEM_FLAG_MPROTECT_RW) != 0)
croak("update: Failed to release state protmem RW");
XSRETURN(1);
#else
croak("XOF not supported by this version of libsodium");
#endif
( run in 0.734 second using v1.01-cache-2.11-cpan-4e7a2411597 )