File Coverage

inc/CryptX_Stream_RC4.xs.inc
Criterion Covered Total %
statement 34 38 89.4
branch 14 26 53.8
condition n/a
subroutine n/a
pod n/a
total 48 64 75.0


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