File Coverage

inc/CryptX_Stream_Sosemanuk.xs.inc
Criterion Covered Total %
statement 41 50 82.0
branch 19 40 47.5
condition n/a
subroutine n/a
pod n/a
total 60 90 66.6


line stmt bran cond sub pod time code
1             MODULE = CryptX PACKAGE = Crypt::Stream::Sosemanuk
2              
3             PROTOTYPES: DISABLE
4              
5             Crypt::Stream::Sosemanuk
6             new(Class, SV * key, SV * nonce=&PL_sv_undef)
7             CODE:
8             {
9             int rv;
10 17           STRLEN iv_len=0, k_len=0;
11 17           unsigned char *iv=NULL, *k=NULL;
12              
13 17 50         if (!SvPOK_spec(key)) croak("FATAL: key must be string/buffer scalar");
    50          
    0          
    0          
    0          
14 17           k = (unsigned char *)SvPVbyte(key, k_len);
15              
16 17           Newz(0, RETVAL, 1, sosemanuk_state);
17 17 50         if (!RETVAL) croak("FATAL: Newz failed");
18              
19 17           rv = sosemanuk_setup(RETVAL, k, (unsigned long)k_len);
20 17 50         if (rv != CRYPT_OK) {
21 0           Safefree(RETVAL);
22 0           croak("FATAL: sosemanuk_setup failed: %s", error_to_string(rv));
23             }
24              
25 17 100         if (SvOK(nonce)) {
26 15 50         if (!SvPOK_spec(nonce)) {
    50          
    0          
    0          
    0          
27 0           sosemanuk_done(RETVAL);
28 0           Safefree(RETVAL);
29 0           croak("FATAL: nonce must be string/buffer scalar");
30             }
31 15           iv = (unsigned char *)SvPVbyte(nonce, iv_len);
32 15           rv = sosemanuk_setiv(RETVAL, iv, (unsigned long)iv_len);
33             }
34             else {
35 2           rv = sosemanuk_setiv(RETVAL, NULL, 0);
36             }
37 17 100         if (rv != CRYPT_OK) {
38 1           sosemanuk_done(RETVAL);
39 1           Safefree(RETVAL);
40 1           croak("FATAL: sosemanuk_setiv failed: %s", error_to_string(rv));
41             }
42              
43             }
44             OUTPUT:
45             RETVAL
46              
47             void
48             DESTROY(Crypt::Stream::Sosemanuk self)
49             CODE:
50 18           sosemanuk_done(self);
51 18           zeromem(self, sizeof(*self));
52 18           Safefree(self);
53              
54             Crypt::Stream::Sosemanuk
55             clone(Crypt::Stream::Sosemanuk self)
56             CODE:
57 2           Newz(0, RETVAL, 1, sosemanuk_state);
58 2 50         if (!RETVAL) croak("FATAL: Newz failed");
59 2           Copy(self, RETVAL, 1, sosemanuk_state);
60             OUTPUT:
61             RETVAL
62              
63             SV *
64             keystream(Crypt::Stream::Sosemanuk self, unsigned long out_len)
65             CODE:
66             {
67             int rv;
68             unsigned char *out_data;
69              
70 5 100         if (out_len == 0) {
71 1           RETVAL = newSVpvn("", 0);
72             }
73             else {
74 4 100         if (out_len == ULONG_MAX) croak("FATAL: output length too large");
75 2           RETVAL = NEWSV(0, out_len); /* avoid zero! */
76 2           SvPOK_only(RETVAL);
77 2           SvCUR_set(RETVAL, out_len);
78 2           out_data = (unsigned char *)SvPVX(RETVAL);
79 2           rv = sosemanuk_keystream(self, out_data, out_len);
80 2 50         if (rv != CRYPT_OK) {
81 0           SvREFCNT_dec(RETVAL);
82 0           croak("FATAL: sosemanuk_keystream failed: %s", error_to_string(rv));
83             }
84             }
85             }
86             OUTPUT:
87             RETVAL
88              
89             SV *
90             crypt(Crypt::Stream::Sosemanuk self, SV * data)
91             CODE:
92             {
93             int rv;
94             STRLEN in_data_len;
95             unsigned char *in_data, *out_data;
96              
97 15           in_data = (unsigned char *)SvPVbyte(data, in_data_len);
98 15 100         if (in_data_len == 0) {
99 1           RETVAL = newSVpvn("", 0);
100             }
101             else {
102 14           RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
103 14           SvPOK_only(RETVAL);
104 14           SvCUR_set(RETVAL, in_data_len);
105 14           out_data = (unsigned char *)SvPVX(RETVAL);
106 14           rv = sosemanuk_crypt(self, in_data, (unsigned long)in_data_len, out_data);
107 14 50         if (rv != CRYPT_OK) {
108 0           SvREFCNT_dec(RETVAL);
109 0           croak("FATAL: sosemanuk_crypt failed: %s", error_to_string(rv));
110             }
111             }
112             }
113             OUTPUT:
114             RETVAL