File Coverage

inc/CryptX_Mac_HMAC.xs.inc
Criterion Covered Total %
statement 69 76 90.7
branch 56 84 66.6
condition n/a
subroutine n/a
pod n/a
total 125 160 78.1


line stmt bran cond sub pod time code
1             MODULE = CryptX PACKAGE = Crypt::Mac::HMAC
2              
3             PROTOTYPES: DISABLE
4              
5             ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
6              
7             Crypt::Mac::HMAC
8             new(Class, char * hash_name, SV * key)
9             CODE:
10             {
11 1778           STRLEN k_len=0;
12 1778           unsigned char *k=NULL;
13             int rv;
14             int id;
15              
16 1778           id = cryptx_internal_find_hash(hash_name);
17 1778 100         if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
18              
19 1777 100         if (!SvPOK_spec(key)) croak("FATAL: key must be string/buffer scalar");
    100          
    50          
    50          
    50          
20 1776           k = (unsigned char *) SvPVbyte(key, k_len);
21              
22 1776           Newz(0, RETVAL, 1, struct cryptx_mac_hmac_struct);
23 1776 50         if (!RETVAL) croak("FATAL: Newz failed");
24              
25 1776           rv = hmac_init(&RETVAL->state, id, k, (unsigned long)k_len);
26 1776 50         if (rv != CRYPT_OK) {
27 0           Safefree(RETVAL);
28 0           croak("FATAL: hmac_init failed: %s", error_to_string(rv));
29             }
30 1776           RETVAL->finalized = 0;
31             }
32             OUTPUT:
33             RETVAL
34              
35             void
36             DESTROY(Crypt::Mac::HMAC self)
37             CODE:
38             {
39 1776           zeromem(&self->state, sizeof(hmac_state));
40 1776           Safefree(self);
41             }
42              
43             Crypt::Mac::HMAC
44             clone(Crypt::Mac::HMAC self)
45             CODE:
46 0 0         if (self->state.hash >= 0 && self->state.hash < TAB_SIZE && cryptx_internal_noclone_hash(hash_descriptor[self->state.hash].name)) {
    0          
    0          
47 0           croak("FATAL: clone is not supported for given hash state");
48             }
49 0           Newz(0, RETVAL, 1, struct cryptx_mac_hmac_struct);
50 0 0         if (!RETVAL) croak("FATAL: Newz failed");
51 0           Copy(self, RETVAL, 1, struct cryptx_mac_hmac_struct);
52             OUTPUT:
53             RETVAL
54              
55             void
56             add(Crypt::Mac::HMAC self, ...)
57             PPCODE:
58             {
59             int rv, i;
60             STRLEN in_data_len;
61             unsigned char *in_data;
62              
63 1780 100         if (self->finalized) croak("FATAL: MAC object already finalized");
64 3568 100         for(i = 1; i < items; i++) {
65 1789           in_data = (unsigned char *)SvPVbyte(ST(i), in_data_len);
66 1789 100         if (in_data_len > 0) {
67 1768           rv = hmac_process(&self->state, in_data, (unsigned long)in_data_len);
68 1768 50         if (rv != CRYPT_OK) croak("FATAL: hmac_process failed: %s", error_to_string(rv));
69             }
70             }
71 1779 50         XPUSHs(ST(0)); /* return self */
72             }
73              
74             SV *
75             mac(Crypt::Mac::HMAC self)
76             ALIAS:
77             hexmac = 1
78             b64mac = 2
79             b64umac = 3
80             CODE:
81             {
82             unsigned char mac[MAXBLOCKSIZE];
83             unsigned long maclen, outlen;
84             int rv;
85             char out[MAXBLOCKSIZE*2+1];
86              
87 1776 100         if (self->finalized) croak("FATAL: MAC object already finalized");
88 1775           maclen = sizeof(mac);
89 1775           rv = hmac_done(&self->state, mac, &maclen);
90 1775 50         if (rv != CRYPT_OK) croak("FATAL: hmac_done failed: %s", error_to_string(rv));
91 1775           self->finalized = 1;
92 1775           outlen = sizeof(out);
93 1775 100         if (ix == 3) {
94 1           rv = base64url_encode(mac, maclen, out, &outlen);
95 1 50         if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
96 1           RETVAL = newSVpvn(out, outlen);
97             }
98 1774 100         else if (ix == 2) {
99 1           rv = base64_encode(mac, maclen, out, &outlen);
100 1 50         if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
101 1           RETVAL = newSVpvn(out, outlen);
102             }
103 1773 100         else if (ix == 1) {
104 20           rv = base16_encode(mac, maclen, out, &outlen, 0);
105 20 50         if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
106 20           RETVAL = newSVpvn(out, outlen);
107             }
108             else {
109 1753           RETVAL = newSVpvn((char * )mac, maclen);
110             }
111 1775           zeromem(mac, sizeof(mac));
112             }
113             OUTPUT:
114             RETVAL
115              
116             SV *
117             hmac(char * hash_name, SV * key, ...)
118             ALIAS:
119             hmac_hex = 1
120             hmac_b64 = 2
121             hmac_b64u = 3
122             CODE:
123             {
124             STRLEN inlen, klen;
125             unsigned char *in;
126 93 100         if (!SvPOK_spec(key)) croak("FATAL: key must be string/buffer scalar");
    100          
    50          
    50          
    50          
127 92           unsigned char *k = (unsigned char *)SvPVbyte(key, klen);
128             int rv, i;
129             unsigned char mac[MAXBLOCKSIZE];
130 92           unsigned long len = sizeof(mac), outlen;
131             char out[MAXBLOCKSIZE*2+1];
132             hmac_state st;
133              
134 92           int id = cryptx_internal_find_hash(hash_name);
135 92 100         if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
136 91           rv = hmac_init(&st, id, k, (unsigned long)klen);
137 91 50         if (rv != CRYPT_OK) croak("FATAL: hmac_init failed: %s", error_to_string(rv));
138 190 100         for (i = 2; i < items; i++) {
139 99           in = (unsigned char *)SvPVbyte(ST(i), inlen);
140 99 100         if (inlen > 0) {
141 83           rv = hmac_process(&st, in, (unsigned long)inlen);
142 83 50         if (rv != CRYPT_OK) croak("FATAL: hmac_process failed: %s", error_to_string(rv));
143             }
144             }
145 91           rv = hmac_done(&st, mac, &len);
146 91 50         if (rv != CRYPT_OK) croak("FATAL: hmac_done failed: %s", error_to_string(rv));
147              
148 91           outlen = sizeof(out);
149 91 100         if (ix == 3) {
150 13           rv = base64url_encode(mac, len, out, &outlen);
151 13 50         if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
152 13           RETVAL = newSVpvn((char *) out, outlen);
153             }
154 78 100         else if (ix == 2) {
155 13           rv = base64_encode(mac, len, out, &outlen);
156 13 50         if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
157 13           RETVAL = newSVpvn(out, outlen);
158             }
159 65 100         else if (ix == 1) {
160 52           rv = base16_encode(mac, len, out, &outlen, 0);
161 52 50         if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
162 52           RETVAL = newSVpvn(out, outlen);
163             }
164             else {
165 13           RETVAL = newSVpvn((char *) mac, len);
166             }
167 91           zeromem(mac, sizeof(mac));
168             }
169             OUTPUT:
170             RETVAL