File Coverage

inc/CryptX_Digest_SHAKE.xs.inc
Criterion Covered Total %
statement 28 35 80.0
branch 17 26 65.3
condition n/a
subroutine n/a
pod n/a
total 45 61 73.7


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