File Coverage

inc/CryptX_Digest_TurboSHAKE.xs.inc
Criterion Covered Total %
statement 30 34 88.2
branch 17 26 65.3
condition n/a
subroutine n/a
pod n/a
total 47 60 78.3


line stmt bran cond sub pod time code
1             MODULE = CryptX PACKAGE = Crypt::Digest::TurboSHAKE
2              
3             PROTOTYPES: DISABLE
4              
5             #define CRYPTX_DIGEST_TURBOSHAKE_MAX_OUTPUT_LEN 1000000000UL
6              
7             Crypt::Digest::TurboSHAKE
8             new(Class, int num)
9             CODE:
10             {
11             int rv;
12              
13 13           Newz(0, RETVAL, 1, struct digest_shake_struct);
14 13 50         if (!RETVAL) croak("FATAL: Newz failed");
15              
16 13           RETVAL->num = num;
17 13           RETVAL->squeezing = 0;
18 13           rv = turbo_shake_init(&RETVAL->state, RETVAL->num);
19 13 50         if (rv != CRYPT_OK) {
20 0           Safefree(RETVAL);
21 0           croak("FATAL: turbo_shake_init failed: %s", error_to_string(rv));
22             }
23             }
24             OUTPUT:
25             RETVAL
26              
27             void
28             DESTROY(Crypt::Digest::TurboSHAKE self)
29             CODE:
30 14           Safefree(self);
31              
32             void
33             reset(Crypt::Digest::TurboSHAKE self)
34             PPCODE:
35             {
36             int rv;
37 2           rv = turbo_shake_init(&self->state, self->num);
38 2 50         if (rv != CRYPT_OK) croak("FATAL: turbo_shake_init failed: %s", error_to_string(rv));
39 2           self->squeezing = 0;
40 2 50         XPUSHs(ST(0)); /* return self */
41             }
42              
43             Crypt::Digest::TurboSHAKE
44             clone(Crypt::Digest::TurboSHAKE self)
45             CODE:
46 1           Newz(0, RETVAL, 1, struct digest_shake_struct);
47 1 50         if (!RETVAL) croak("FATAL: Newz failed");
48 1           Copy(self, RETVAL, 1, struct digest_shake_struct);
49             OUTPUT:
50             RETVAL
51              
52             void
53             add(Crypt::Digest::TurboSHAKE self, ...)
54             PPCODE:
55             {
56             STRLEN inlen;
57             int rv, i;
58             unsigned char *in;
59              
60 7 100         if (self->squeezing) croak("FATAL: cannot add after done; call reset first");
61              
62 12 100         for(i=1; i
63 6           in = (unsigned char *)SvPVbyte(ST(i), inlen);
64 6 50         if (inlen>0) {
65 6           rv = turbo_shake_process(&self->state, in, (unsigned long)inlen);
66 6 50         if (rv != CRYPT_OK) croak("FATAL: turbo_shake_process failed: %s", error_to_string(rv));
67             }
68             }
69 6 50         XPUSHs(ST(0)); /* return self */
70             }
71              
72             SV *
73             done(Crypt::Digest::TurboSHAKE self, unsigned long out_len)
74             CODE:
75             {
76             int rv;
77             unsigned char *out_data;
78              
79 16 100         if (out_len == 0) croak("FATAL: invalid output length");
80 15 100         if (out_len > CRYPTX_DIGEST_TURBOSHAKE_MAX_OUTPUT_LEN) croak("FATAL: output length too large");
81 13           RETVAL = NEWSV(0, out_len); /* avoid zero! */
82 13           SvPOK_only(RETVAL);
83 13           SvCUR_set(RETVAL, out_len);
84 13           out_data = (unsigned char *)SvPVX(RETVAL);
85 13           rv = turbo_shake_done(&self->state, out_data, out_len);
86 13 50         if (rv != CRYPT_OK) {
87 0           SvREFCNT_dec(RETVAL);
88 0           croak("FATAL: turbo_shake_done failed: %s", error_to_string(rv));
89             }
90 13           self->squeezing = 1;
91             }
92             OUTPUT:
93             RETVAL