summaryrefslogtreecommitdiff
path: root/inc
diff options
context:
space:
mode:
authorKarel Miko <karel.miko@gmail.com>2017-04-07 23:34:28 +0200
committerKarel Miko <karel.miko@gmail.com>2017-04-07 23:34:28 +0200
commit11baf0441ef14e93ee1997b100c66d0bd876d9ef (patch)
tree7d3e1861a862c71fbf4ad1c0fbac58b7ed32ee64 /inc
parentebfeedfd82e787b728f73994e6ac95a27bea0ef3 (diff)
Crypt::Digest::SHAKE
Diffstat (limited to 'inc')
-rw-r--r--inc/CryptX_Digest_SHAKE.xs.inc74
1 files changed, 74 insertions, 0 deletions
diff --git a/inc/CryptX_Digest_SHAKE.xs.inc b/inc/CryptX_Digest_SHAKE.xs.inc
new file mode 100644
index 00000000..aa5335fa
--- /dev/null
+++ b/inc/CryptX_Digest_SHAKE.xs.inc
@@ -0,0 +1,74 @@
+MODULE = CryptX PACKAGE = Crypt::Digest::SHAKE
+
+Crypt::Digest::SHAKE
+_new(int num)
+ CODE:
+ {
+ int rv;
+
+ Newz(0, RETVAL, 1, struct digest_shake_struct);
+ if (!RETVAL) croak("FATAL: Newz failed");
+
+ RETVAL->num = num;
+ rv = sha3_shake_init(&RETVAL->state, RETVAL->num);
+ if (rv != CRYPT_OK) croak("FATAL: sha3_shake_init failed: %s", error_to_string(rv));
+ }
+ OUTPUT:
+ RETVAL
+
+void
+DESTROY(Crypt::Digest::SHAKE self)
+ CODE:
+ Safefree(self);
+
+void
+reset(Crypt::Digest::SHAKE self)
+ CODE:
+ {
+ int rv;
+ rv = sha3_shake_init(&self->state, self->num);
+ if (rv != CRYPT_OK) croak("FATAL: sha3_shake_init failed: %s", error_to_string(rv));
+ }
+
+Crypt::Digest::SHAKE
+clone(Crypt::Digest::SHAKE self)
+ CODE:
+ Newz(0, RETVAL, 1, struct digest_shake_struct);
+ Copy(&self->state, &RETVAL->state, 1, struct digest_shake_struct);
+ OUTPUT:
+ RETVAL
+
+void
+add(Crypt::Digest::SHAKE self, ...)
+ PPCODE:
+ {
+ STRLEN inlen;
+ int rv, i;
+ unsigned char *in;
+
+ for(i=1; i<items; i++) {
+ in = (unsigned char *)SvPVbyte(ST(i), inlen);
+ if (inlen>0) {
+ rv = sha3_shake_process(&self->state, in, (unsigned long)inlen);
+ if (rv != CRYPT_OK) croak("FATAL: sha3_shake_process failed: %s", error_to_string(rv));
+ }
+ }
+ XPUSHs(ST(0)); /* return self */
+ }
+
+SV *
+done(Crypt::Digest::SHAKE self, STRLEN out_len)
+ CODE:
+ {
+ int rv;
+ unsigned char *out_data;
+
+ RETVAL = NEWSV(0, out_len);
+ SvPOK_only(RETVAL);
+ SvCUR_set(RETVAL, out_len);
+ out_data = (unsigned char *)SvPV_nolen(RETVAL);
+ rv = sha3_shake_done(&self->state, out_data, out_len);
+ if (rv != CRYPT_OK) croak("FATAL: sha3_shake_done failed: %s", error_to_string(rv));
+ }
+ OUTPUT:
+ RETVAL