File Coverage

inc/CryptX_Digest_KangarooTwelve.xs.inc
Criterion Covered Total %
statement 37 41 90.2
branch 24 36 66.6
condition n/a
subroutine n/a
pod n/a
total 61 77 79.2


line stmt bran cond sub pod time code
1             MODULE = CryptX PACKAGE = Crypt::Digest::KangarooTwelve
2              
3             PROTOTYPES: DISABLE
4              
5             #define CRYPTX_DIGEST_KANGAROOTWELVE_MAX_OUTPUT_LEN 1000000000UL
6              
7             Crypt::Digest::KangarooTwelve
8             new(Class, int num)
9             CODE:
10             {
11             int rv;
12              
13 15           Newz(0, RETVAL, 1, struct digest_shake_struct);
14 15 50         if (!RETVAL) croak("FATAL: Newz failed");
15              
16 15           RETVAL->num = num;
17 15           RETVAL->squeezing = 0;
18 15           rv = kangaroo_twelve_init(&RETVAL->state, RETVAL->num);
19 15 50         if (rv != CRYPT_OK) {
20 0           Safefree(RETVAL);
21 0           croak("FATAL: kangaroo_twelve_init failed: %s", error_to_string(rv));
22             }
23             }
24             OUTPUT:
25             RETVAL
26              
27             void
28             DESTROY(Crypt::Digest::KangarooTwelve self)
29             CODE:
30 16           Safefree(self);
31              
32             void
33             reset(Crypt::Digest::KangarooTwelve self)
34             PPCODE:
35             {
36             int rv;
37 1           rv = kangaroo_twelve_init(&self->state, self->num);
38 1 50         if (rv != CRYPT_OK) croak("FATAL: kangaroo_twelve_init failed: %s", error_to_string(rv));
39 1           self->squeezing = 0;
40 1 50         XPUSHs(ST(0)); /* return self */
41             }
42              
43             Crypt::Digest::KangarooTwelve
44             clone(Crypt::Digest::KangarooTwelve 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::KangarooTwelve 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 = kangaroo_twelve_process(&self->state, in, (unsigned long)inlen);
66 6 50         if (rv != CRYPT_OK) croak("FATAL: kangaroo_twelve_process failed: %s", error_to_string(rv));
67             }
68             }
69 6 50         XPUSHs(ST(0)); /* return self */
70             }
71              
72             void
73             customization(Crypt::Digest::KangarooTwelve self, ...)
74             PPCODE:
75             {
76             STRLEN inlen;
77             int rv, i;
78             unsigned char *in;
79              
80 5 100         if (self->squeezing) croak("FATAL: cannot add after done; call reset first");
81              
82 8 100         for(i=1; i
83 4           in = (unsigned char *)SvPVbyte(ST(i), inlen);
84 4 50         if (inlen>0) {
85 4           rv = kangaroo_twelve_customization(&self->state, in, (unsigned long)inlen);
86 4 50         if (rv != CRYPT_OK) croak("FATAL: kangaroo_twelve_customization failed: %s", error_to_string(rv));
87             }
88             }
89 4 50         XPUSHs(ST(0)); /* return self */
90             }
91              
92             SV *
93             done(Crypt::Digest::KangarooTwelve self, unsigned long out_len)
94             CODE:
95             {
96             int rv;
97             unsigned char *out_data;
98              
99 18 100         if (out_len == 0) croak("FATAL: invalid output length");
100 17 100         if (out_len > CRYPTX_DIGEST_KANGAROOTWELVE_MAX_OUTPUT_LEN) croak("FATAL: output length too large");
101 15           RETVAL = NEWSV(0, out_len); /* avoid zero! */
102 15           SvPOK_only(RETVAL);
103 15           SvCUR_set(RETVAL, out_len);
104 15           out_data = (unsigned char *)SvPVX(RETVAL);
105 15           rv = kangaroo_twelve_done(&self->state, out_data, out_len);
106 15 50         if (rv != CRYPT_OK) {
107 0           SvREFCNT_dec(RETVAL);
108 0           croak("FATAL: kangaroo_twelve_done failed: %s", error_to_string(rv));
109             }
110 15           self->squeezing = 1;
111             }
112             OUTPUT:
113             RETVAL