Codebase list libcryptx-perl / 611fb98
moving more code to XS Karel Miko 6 years ago
58 changed file(s) with 692 addition(s) and 756 deletion(s). Raw diff Collapse all Expand all
261261 return str_add_leading_zero(str, maxlen, minlen);
262262 }
263263
264 int _base16_encode(const unsigned char *in, unsigned long inlen, unsigned char *out, unsigned long *outlen)
265 {
266 unsigned long i;
267 const char alphabet[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
268
269 if (*outlen < inlen * 2) {
270 *outlen = inlen * 2;
271 return CRYPT_BUFFER_OVERFLOW;
272 }
273
274 for (i = 0; i < inlen; i++) {
275 out[i*2] = (unsigned char)alphabet[in[i] >> 4];
276 out[i*2+1] = (unsigned char)alphabet[in[i] & 0xF];
277 }
278
279 *outlen = inlen * 2;
280 return CRYPT_OK;
281 }
282
283 int _find_hash(const char *name)
284 {
285 char ltcname[100] = { 0 };
286 size_t i, start = 0, ltclen = sizeof(ltcname) - 1;
287 if (name == NULL || strlen(name) + 1 > ltclen) croak("FATAL: invalid hash name") ;
288 /* normalize */
289 for (i = 0; i < ltclen && name[i] > 0; i++) {
290 if (name[i] >= 'A' && name[i] <= 'Z') {
291 ltcname[i] = name[i] + 32; /* lowecase */
292 }
293 else if (name[i] == '_') {
294 ltcname[i] = '-';
295 }
296 else {
297 ltcname[i] = name[i];
298 }
299 if (name[i] == ':') start = i + 1;
300 }
301 /* special cases */
302 if (strcmp(ltcname + start, "ripemd128") == 0) return find_hash("rmd128");
303 if (strcmp(ltcname + start, "ripemd160") == 0) return find_hash("rmd160");
304 if (strcmp(ltcname + start, "ripemd256") == 0) return find_hash("rmd256");
305 if (strcmp(ltcname + start, "ripemd320") == 0) return find_hash("rmd320");
306 if (strcmp(ltcname + start, "tiger192") == 0) return find_hash("tiger");
307 if (strcmp(ltcname + start, "chaes") == 0) return find_hash("chc_hash");
308 if (strcmp(ltcname + start, "chc-hash") == 0) return find_hash("chc_hash");
309 return find_hash(ltcname + start);
310 }
311
312 int _find_cipher(const char *name)
313 {
314 char ltcname[100] = { 0 };
315 size_t i, start = 0, ltclen = sizeof(ltcname) - 1;
316 if (name == NULL || strlen(name) + 1 > ltclen) croak("FATAL: invalid cipher name") ;
317 /* normalize */
318 for (i = 0; i < ltclen && name[i] > 0; i++) {
319 if (name[i] >= 'A' && name[i] <= 'Z') {
320 ltcname[i] = name[i] + 32; /* lowecase */
321 }
322 else if (name[i] == '_') {
323 ltcname[i] = '-';
324 }
325 else {
326 ltcname[i] = name[i];
327 }
328 if (name[i] == ':') start = i + 1;
329 }
330 /* special cases */
331 if (strcmp(ltcname + start, "des-ede") == 0) return find_cipher("3des");
332 if (strcmp(ltcname + start, "saferp") == 0) return find_cipher("safer+");
333 return find_cipher(ltcname + start);
334 }
335
264336 /* Math::BigInt::LTM related */
265337 typedef mp_int * Math__BigInt__LTM;
266338 STATIC SV * sv_from_mpi(mp_int *mpi) {
1212
1313 use CryptX;
1414 [%-IF lc_name == 'hmac' %]
15 use Crypt::Digest;
16
17 sub new { my $class = shift; _new(Crypt::Digest::_trans_digest_name(shift), @_) }
1815 sub [%lc_name%] { Crypt::Mac::[%orig_name%]->new(shift, shift)->add(@_)->mac }
1916 sub [%lc_name%]_hex { Crypt::Mac::[%orig_name%]->new(shift, shift)->add(@_)->hexmac }
2017 sub [%lc_name%]_b64 { Crypt::Mac::[%orig_name%]->new(shift, shift)->add(@_)->b64mac }
2118 sub [%lc_name%]_b64u { Crypt::Mac::[%orig_name%]->new(shift, shift)->add(@_)->b64umac }
2219 [%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
23 sub new { my $class = shift; _new(@_) }
2420 sub [%lc_name%] { Crypt::Mac::[%orig_name%]->new(shift, shift)->add(@_)->mac }
2521 sub [%lc_name%]_hex { Crypt::Mac::[%orig_name%]->new(shift, shift)->add(@_)->hexmac }
2622 sub [%lc_name%]_b64 { Crypt::Mac::[%orig_name%]->new(shift, shift)->add(@_)->b64mac }
2723 sub [%lc_name%]_b64u { Crypt::Mac::[%orig_name%]->new(shift, shift)->add(@_)->b64umac }
2824 [%-ELSIF lc_name == 'pelican' || lc_name == 'poly1305' %]
29 sub new { my $class = shift; _new(@_) }
3025 sub [%lc_name%] { Crypt::Mac::[%orig_name%]->new(shift)->add(@_)->mac }
3126 sub [%lc_name%]_hex { Crypt::Mac::[%orig_name%]->new(shift)->add(@_)->hexmac }
3227 sub [%lc_name%]_b64 { Crypt::Mac::[%orig_name%]->new(shift)->add(@_)->b64mac }
3328 sub [%lc_name%]_b64u { Crypt::Mac::[%orig_name%]->new(shift)->add(@_)->b64umac }
3429 [%-ELSE%]
35 use Crypt::Cipher;
36
37 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
3830 sub [%lc_name%] { Crypt::Mac::[%orig_name%]->new(shift, shift)->add(@_)->mac }
3931 sub [%lc_name%]_hex { Crypt::Mac::[%orig_name%]->new(shift, shift)->add(@_)->hexmac }
4032 sub [%lc_name%]_b64 { Crypt::Mac::[%orig_name%]->new(shift, shift)->add(@_)->b64mac }
33
44 Crypt::Mac::[%orig_name%]
55 [%-IF lc_name == 'hmac' %]
6 _new(char * hash_name, SV * key)
7 [%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
8 _new(int size, SV * key)
6 new(char * class, char * hash_name, SV * key)
7 [%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
8 new(char * class, int size, SV * key)
99 [%-ELSIF lc_name == 'pelican' || lc_name == 'poly1305' %]
10 _new(SV * key)
11 [%-ELSE%]
12 _new(char * cipher_name, SV * key)
10 new(char * class, SV * key)
11 [%-ELSE%]
12 new(char * class, char * cipher_name, SV * key)
1313 [%-END%]
1414 CODE:
1515 {
1919 [%-IF lc_name == 'hmac' %]
2020 int id;
2121
22 id = find_hash(hash_name);
22 id = _find_hash(hash_name);
2323 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
2424 [%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
2525 [%-ELSIF lc_name == 'pelican' || lc_name == 'poly1305' %]
2626 [%-ELSE%]
2727 int id;
2828
29 id = find_cipher(cipher_name);
29 id = _find_cipher(cipher_name);
3030 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
3131 [%-END%]
3232
8989 CODE:
9090 {
9191 char mac[MAXBLOCKSIZE];
92 unsigned long mac_len;
93 int rv;
94
95 [%-IF lc_name == 'pelican' %]
96 mac_len = 16;
92 unsigned long maclen;
93 int rv;
94
95 [%-IF lc_name == 'pelican' %]
96 maclen = 16;
9797 rv = [%lc_name%]_done(&self->state, (unsigned char*)mac);
9898 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
9999 [%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
100 mac_len = sizeof(mac);
101 rv = [%lc_name%]mac_done(&self->state, (unsigned char*)mac, &mac_len);
102 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
103 [%-ELSE%]
104 mac_len = sizeof(mac);
105 rv = [%lc_name%]_done(&self->state, (unsigned char*)mac, &mac_len);
106 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
107 [%-END%]
108 RETVAL = newSVpvn(mac, mac_len);
100 maclen = sizeof(mac);
101 rv = [%lc_name%]mac_done(&self->state, (unsigned char*)mac, &maclen);
102 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
103 [%-ELSE%]
104 maclen = sizeof(mac);
105 rv = [%lc_name%]_done(&self->state, (unsigned char*)mac, &maclen);
106 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
107 [%-END%]
108 RETVAL = newSVpvn(mac, maclen);
109109 }
110110 OUTPUT:
111111 RETVAL
115115 CODE:
116116 {
117117 unsigned char mac[MAXBLOCKSIZE];
118 unsigned long mac_len;
118 unsigned long maclen;
119119 int rv;
120120 unsigned long outlen;
121 char mac_base64[MAXBLOCKSIZE*2 + 1];
122
123 [%-IF lc_name == 'pelican' %]
124 mac_len = 16;
121 char out[MAXBLOCKSIZE*2];
122
123 [%-IF lc_name == 'pelican' %]
124 maclen = 16;
125125 rv = [%lc_name%]_done(&self->state, mac);
126126 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
127127 [%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
128 mac_len = sizeof(mac);
129 rv = [%lc_name%]mac_done(&self->state, mac, &mac_len);
130 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
131 [%-ELSE%]
132 mac_len = sizeof(mac);
133 rv = [%lc_name%]_done(&self->state, mac, &mac_len);
134 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
135 [%-END%]
136 outlen = sizeof(mac_base64);
137 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
128 maclen = sizeof(mac);
129 rv = [%lc_name%]mac_done(&self->state, mac, &maclen);
130 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
131 [%-ELSE%]
132 maclen = sizeof(mac);
133 rv = [%lc_name%]_done(&self->state, mac, &maclen);
134 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
135 [%-END%]
136 outlen = sizeof(out);
137 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
138138 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
139 RETVAL = newSVpvn(mac_base64, outlen);
139 RETVAL = newSVpvn(out, outlen);
140140 }
141141 OUTPUT:
142142 RETVAL
146146 CODE:
147147 {
148148 unsigned char mac[MAXBLOCKSIZE];
149 unsigned long mac_len;
149 unsigned long maclen;
150150 int rv;
151151 unsigned long outlen;
152 char mac_base64[MAXBLOCKSIZE*2 + 1];
153
154 [%-IF lc_name == 'pelican' %]
155 mac_len = 16;
152 char out[MAXBLOCKSIZE*2 + 1];
153
154 [%-IF lc_name == 'pelican' %]
155 maclen = 16;
156156 rv = [%lc_name%]_done(&self->state, mac);
157157 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
158158 [%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
159 mac_len = sizeof(mac);
160 rv = [%lc_name%]mac_done(&self->state, mac, &mac_len);
161 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
162 [%-ELSE%]
163 mac_len = sizeof(mac);
164 rv = [%lc_name%]_done(&self->state, mac, &mac_len);
165 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
166 [%-END%]
167 outlen = sizeof(mac_base64);
168 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
159 maclen = sizeof(mac);
160 rv = [%lc_name%]mac_done(&self->state, mac, &maclen);
161 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
162 [%-ELSE%]
163 maclen = sizeof(mac);
164 rv = [%lc_name%]_done(&self->state, mac, &maclen);
165 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
166 [%-END%]
167 outlen = sizeof(out);
168 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
169169 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
170 RETVAL = newSVpvn(mac_base64, outlen);
170 RETVAL = newSVpvn(out, outlen);
171171 }
172172 OUTPUT:
173173 RETVAL
177177 CODE:
178178 {
179179 unsigned char mac[MAXBLOCKSIZE];
180 unsigned long mac_len, i;
181 int rv;
182 char mac_hex[MAXBLOCKSIZE*2 + 1];
183
184 [%-IF lc_name == 'pelican' %]
185 mac_len = 16;
180 unsigned long maclen, outlen;
181 int rv;
182 char out[MAXBLOCKSIZE*2];
183
184 [%-IF lc_name == 'pelican' %]
185 maclen = 16;
186186 rv = [%lc_name%]_done(&self->state, mac);
187187 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
188188 [%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
189 mac_len = sizeof(mac);
190 rv = [%lc_name%]mac_done(&self->state, mac, &mac_len);
191 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
192 [%-ELSE%]
193 mac_len = sizeof(mac);
194 rv = [%lc_name%]_done(&self->state, mac, &mac_len);
195 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
196 [%-END%]
197 mac_hex[0] = '\0';
198 for(i=0; i<mac_len; i++)
199 sprintf(&mac_hex[2*i], "%02x", mac[i]);
200 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
201 }
202 OUTPUT:
203 RETVAL
189 maclen = sizeof(mac);
190 rv = [%lc_name%]mac_done(&self->state, mac, &maclen);
191 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
192 [%-ELSE%]
193 maclen = sizeof(mac);
194 rv = [%lc_name%]_done(&self->state, mac, &maclen);
195 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
196 [%-END%]
197 outlen = sizeof(out);
198 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
199 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
200 RETVAL = newSVpvn(out, outlen);
201 }
202 OUTPUT:
203 RETVAL
77
88 use Crypt::Cipher;
99 use base 'Crypt::Mode';
10
11 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
1210
1311 1;
1412
33
44 Crypt::Mode::[%orig_name%]
55 [%-IF lc_name == 'ctr' %]
6 _new(char * cipher_name, int ctr_mode=0, int ctr_width=0, int rounds=0)
6 new(char * class, char * cipher_name, int ctr_mode=0, int ctr_width=0, int rounds=0)
77 [%-ELSE%]
8 _new(char * cipher_name, int rounds=0)
8 new(char * class, char * cipher_name, int rounds=0)
99 [%-END%]
1010 CODE:
1111 {
1313 if (!RETVAL) croak("FATAL: Newz failed");
1414 RETVAL->direction = 0;
1515 RETVAL->cipher_rounds = rounds;
16 RETVAL->cipher_id = find_cipher(cipher_name);
16 RETVAL->cipher_id = _find_cipher(cipher_name);
1717 if (RETVAL->cipher_id == -1) {
1818 Safefree(RETVAL);
1919 croak("FATAL: find_cipfer failed for '%s'", cipher_name);
22 [%comment%]
33
44 Crypt::Mode::[%orig_name%]
5 _new(char * cipher_name, int padding=1, int rounds=0)
5 new(char * class, char * cipher_name, int padding=1, int rounds=0)
66 CODE:
77 {
88 Newz(0, RETVAL, 1, struct [%lc_name%]_struct);
1111 RETVAL->padlen = 0;
1212 RETVAL->direction = 0;
1313 RETVAL->cipher_rounds = rounds;
14 RETVAL->cipher_id = find_cipher(cipher_name);
14 RETVAL->cipher_id = _find_cipher(cipher_name);
1515 if (RETVAL->cipher_id == -1) {
1616 Safefree(RETVAL);
1717 croak("FATAL: find_cipfer failed for '%s'", cipher_name);
00 MODULE = CryptX PACKAGE = Crypt::AuthEnc::CCM
11
22 Crypt::AuthEnc::CCM
3 _new(char * cipher_name, SV * key, SV * nonce, SV * adata, int tag_len, int pt_len)
3 new(char * class, char * cipher_name, SV * key, SV * nonce, SV * adata, int tag_len, int pt_len)
44 CODE:
55 {
66 unsigned char *k=NULL;
2020 if (!SvPOK(adata)) croak("FATAL: adata must be string/buffer scalar");
2121 h = (unsigned char *) SvPVbyte(adata, h_len);
2222
23 id = find_cipher(cipher_name);
23 id = _find_cipher(cipher_name);
2424 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
2525
2626 Newz(0, RETVAL, 1, struct ccm_struct);
00 MODULE = CryptX PACKAGE = Crypt::AuthEnc::ChaCha20Poly1305
11
22 Crypt::AuthEnc::ChaCha20Poly1305
3 _new(SV * key, SV * nonce = NULL)
3 new(char * class, SV * key, SV * nonce = NULL)
44 CODE:
55 {
66 int rv;
00 MODULE = CryptX PACKAGE = Crypt::AuthEnc::EAX
11
22 Crypt::AuthEnc::EAX
3 _new(char * cipher_name, SV * key, SV * nonce, SV * adata=&PL_sv_undef)
3 new(char * class, char * cipher_name, SV * key, SV * nonce, SV * adata=&PL_sv_undef)
44 CODE:
55 {
66 STRLEN k_len=0;
2020 h = (unsigned char *) SvPVbyte(adata, h_len);
2121 }
2222
23 id = find_cipher(cipher_name);
23 id = _find_cipher(cipher_name);
2424 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
2525
2626 Newz(0, RETVAL, 1, struct eax_struct);
00 MODULE = CryptX PACKAGE = Crypt::AuthEnc::GCM
11
22 Crypt::AuthEnc::GCM
3 _new(char * cipher_name, SV * key, SV * nonce = NULL)
3 new(char * class, char * cipher_name, SV * key, SV * nonce = NULL)
44 CODE:
55 {
66 STRLEN k_len = 0, iv_len = 0;
1414 iv = (unsigned char *)SvPVbyte(nonce, iv_len);
1515 }
1616
17 id = find_cipher(cipher_name);
17 id = _find_cipher(cipher_name);
1818 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1919
2020 Newz(0, RETVAL, 1, struct gcm_struct);
00 MODULE = CryptX PACKAGE = Crypt::AuthEnc::OCB
11
22 Crypt::AuthEnc::OCB
3 _new(char * cipher_name, SV * key, SV * nonce, unsigned long taglen)
3 new(char * class, char * cipher_name, SV * key, SV * nonce, unsigned long taglen)
44 CODE:
55 {
66 STRLEN k_len=0;
1414 if (!SvPOK(nonce)) croak("FATAL: nonce must be string/buffer scalar");
1515 n = (unsigned char *) SvPVbyte(nonce, n_len);
1616
17 id = find_cipher(cipher_name);
17 id = _find_cipher(cipher_name);
1818 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1919
2020 Newz(0, RETVAL, 1, struct ocb_struct);
00 MODULE = CryptX PACKAGE = Crypt::Cipher
11
22 Crypt::Cipher
3 _new(cipher_name, key, rounds=0)
4 char * cipher_name
5 SV * key
6 int rounds
3 new(char * class, ...)
74 CODE:
85 {
96 STRLEN key_len;
10 unsigned char *key_data=NULL;
11 int rv;
12 int id;
7 unsigned char *key_data = NULL;
8 SV *key;
9 char *cipher_name;
10 int rv, id, rounds = 0, idx;
11
12 /* we need to handle:
13 Crypt::Cipher->new('AES');
14 Crypt::Cipher::AES->new();
15 */
16 idx = strcmp("Crypt::Cipher", class) == 0 ? 1 : 0;
17 if (idx + 1 > items) croak("FATAL: missing argument");
18 cipher_name = SvPVX(ST(idx));
19 key = ST(idx + 1);
20 if (idx + 3 <= items) rounds = (int)SvIV(ST(idx + 2));
1321
1422 if (!SvPOK (key)) croak("FATAL: key must be string scalar");
1523 key_data = (unsigned char *)SvPVbyte(key, key_len);
1624
17 id = find_cipher(cipher_name);
25 id = _find_cipher(cipher_name);
1826 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1927
2028 Newz(0, RETVAL, 1, struct cipher_struct);
3240 RETVAL
3341
3442 void
35 DESTROY(self)
36 Crypt::Cipher self
43 DESTROY(Crypt::Cipher self)
3744 CODE:
3845 Safefree(self);
3946
40 int
41 _max_keysize(self, ...)
42 Crypt::Cipher self
43 CODE:
44 RETVAL = self->desc->max_key_length;
45 OUTPUT:
46 RETVAL
47
48 int
49 _min_keysize(self, ...)
50 Crypt::Cipher self
51 CODE:
52 RETVAL = self->desc->min_key_length;
53 OUTPUT:
54 RETVAL
55
56 int
57 _blocksize(self, ...)
58 Crypt::Cipher self
59 CODE:
60 RETVAL = self->desc->block_length;
61 OUTPUT:
62 RETVAL
63
64 int
65 _default_rounds(self, ...)
66 Crypt::Cipher self
67 CODE:
68 RETVAL = self->desc->default_rounds;
69 OUTPUT:
70 RETVAL
71
7247 SV *
73 encrypt(self, data)
74 Crypt::Cipher self
75 SV * data
48 encrypt(Crypt::Cipher self, SV * data)
7649 CODE:
7750 {
7851 int rv;
10073 RETVAL
10174
10275 SV *
103 decrypt(self, data)
104 Crypt::Cipher self
105 SV * data
76 decrypt(Crypt::Cipher self, SV * data)
10677 CODE:
10778 {
10879 int rv;
130101 RETVAL
131102
132103 int
133 _block_length_by_name(cipher_name)
134 char * cipher_name
104 blocksize(SV * param, char * extra = NULL)
135105 CODE:
136106 {
137 int rv, id;
138
139 id = find_cipher(cipher_name);
140 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
141
142 rv = cipher_descriptor[id].block_length;
143 if (!rv) XSRETURN_UNDEF;
144 RETVAL = rv;
107 if (sv_isobject(param) && sv_derived_from(param, "Crypt::Cipher")) {
108 IV tmp = SvIV((SV*)SvRV(param));
109 Crypt__Cipher obj = INT2PTR(Crypt__Cipher, tmp);
110 RETVAL = obj->desc->block_length;
111 }
112 else {
113 char *name = SvPOK(param) && strcmp(SvPVX(param), "Crypt::Cipher") ? SvPVX(param) : extra;
114 int rv, id = _find_cipher(name);
115 if (id == -1) croak("FATAL: find_cipher failed for '%s'", name);
116 rv = cipher_descriptor[id].block_length;
117 if (!rv) croak("FATAL: invalid block_length for '%s'", name);
118 RETVAL = rv;
119 }
145120 }
146121 OUTPUT:
147122 RETVAL
148123
149124 int
150 _min_key_length_by_name(cipher_name)
151 char * cipher_name
125 max_keysize(SV * param, char * extra = NULL)
152126 CODE:
153127 {
154 int rv, id;
155
156 id = find_cipher(cipher_name);
157 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
158
159 rv = cipher_descriptor[id].min_key_length;
160 if (!rv) XSRETURN_UNDEF;
161 RETVAL = rv;
128 if (sv_isobject(param) && sv_derived_from(param, "Crypt::Cipher")) {
129 IV tmp = SvIV((SV*)SvRV(param));
130 Crypt__Cipher obj = INT2PTR(Crypt__Cipher, tmp);
131 RETVAL = obj->desc->max_key_length;
132 }
133 else {
134 char *name = SvPOK(param) && strcmp(SvPVX(param), "Crypt::Cipher") ? SvPVX(param) : extra;
135 int rv, id = _find_cipher(name);
136 if (id == -1) croak("FATAL: find_cipher failed for '%s'", name);
137 rv = cipher_descriptor[id].max_key_length;
138 if (!rv) croak("FATAL: invalid max_key_length for '%s'", name);
139 RETVAL = rv;
140 }
162141 }
163142 OUTPUT:
164143 RETVAL
165144
166145 int
167 _max_key_length_by_name(cipher_name)
168 char * cipher_name
146 min_keysize(SV * param, char * extra = NULL)
169147 CODE:
170148 {
171 int rv, id;
172
173 id = find_cipher(cipher_name);
174 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
175
176 rv = cipher_descriptor[id].max_key_length;
177 if (!rv) XSRETURN_UNDEF;
178 RETVAL = rv;
149 if (sv_isobject(param) && sv_derived_from(param, "Crypt::Cipher")) {
150 IV tmp = SvIV((SV*)SvRV(param));
151 Crypt__Cipher obj = INT2PTR(Crypt__Cipher, tmp);
152 RETVAL = obj->desc->min_key_length;
153 }
154 else {
155 char *name = SvPOK(param) && strcmp(SvPVX(param), "Crypt::Cipher") ? SvPVX(param) : extra;
156 int rv, id = _find_cipher(name);
157 if (id == -1) croak("FATAL: find_cipher failed for '%s'", name);
158 rv = cipher_descriptor[id].min_key_length;
159 if (!rv) croak("FATAL: invalid min_key_length for '%s'", name);
160 RETVAL = rv;
161 }
179162 }
180163 OUTPUT:
181164 RETVAL
182165
183166 int
184 _default_rounds_by_name(cipher_name)
185 char * cipher_name
167 default_rounds(SV * param, char * extra = NULL)
186168 CODE:
187169 {
188 int rv, id;
189
190 id = find_cipher(cipher_name);
191 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
192
193 rv = cipher_descriptor[id].default_rounds;
194 if (!rv) XSRETURN_UNDEF;
195 RETVAL = rv;
170 if (sv_isobject(param) && sv_derived_from(param, "Crypt::Cipher")) {
171 IV tmp = SvIV((SV*)SvRV(param));
172 Crypt__Cipher obj = INT2PTR(Crypt__Cipher, tmp);
173 RETVAL = obj->desc->default_rounds;
174 }
175 else {
176 char *name = SvPOK(param) && strcmp(SvPVX(param), "Crypt::Cipher") ? SvPVX(param) : extra;
177 int rv, id = _find_cipher(name);
178 if (id == -1) croak("FATAL: find_cipher failed for '%s'", name);
179 rv = cipher_descriptor[id].default_rounds;
180 if (!rv) XSRETURN_UNDEF;
181 RETVAL = rv;
182 }
196183 }
197184 OUTPUT:
198185 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Digest
11
22 Crypt::Digest
3 _new(digest_name)
4 char * digest_name
3 new(char * cname, char * pname = NULL)
54 CODE:
65 {
76 int rv;
87 int id;
9
10 id = find_hash(digest_name);
8 char *digest_name = strcmp(cname, "Crypt::Digest") == 0 ? pname : cname;
9
10 id = _find_hash(digest_name);
1111 if (id == -1) croak("FATAL: find_hash failed for '%s'", digest_name);
1212
1313 Newz(0, RETVAL, 1, struct digest_struct);
2525 RETVAL
2626
2727 void
28 DESTROY(self)
29 Crypt::Digest self
28 DESTROY(Crypt::Digest self)
3029 CODE:
3130 Safefree(self);
3231
3332 void
34 reset(self)
35 Crypt::Digest self
33 reset(Crypt::Digest self)
3634 PPCODE:
3735 {
3836 int rv;
4240 }
4341
4442 Crypt::Digest
45 clone(self)
46 Crypt::Digest self
43 clone(Crypt::Digest self)
4744 CODE:
4845 Newz(0, RETVAL, 1, struct digest_struct);
4946 if (!RETVAL) croak("FATAL: Newz failed");
7067 }
7168
7269 SV *
73 digest(self)
74 Crypt::Digest self
70 digest(Crypt::Digest self)
7571 CODE:
7672 {
7773 unsigned char hash[MAXBLOCKSIZE];
8581 RETVAL
8682
8783 SV *
88 hexdigest(self)
89 Crypt::Digest self
90 CODE:
91 {
92 int rv;
93 unsigned long i;
94 unsigned char hash[MAXBLOCKSIZE];
95 char hash_hex[MAXBLOCKSIZE*2 + 1];
96
97 rv = self->desc->done(&self->state, hash);
98 if (rv != CRYPT_OK) croak("FATAL: digest done failed: %s", error_to_string(rv));
99
100 hash_hex[0] = '\0';
101 for(i=0; i<self->desc->hashsize; i++)
102 sprintf(&hash_hex[2*i], "%02x", hash[i]);
103 RETVAL = newSVpvn(hash_hex, strlen(hash_hex));
104 }
105 OUTPUT:
106 RETVAL
107
108 SV *
109 b64digest(self)
110 Crypt::Digest self
84 hexdigest(Crypt::Digest self)
11185 CODE:
11286 {
11387 int rv;
11488 unsigned long outlen;
11589 unsigned char hash[MAXBLOCKSIZE];
116 char hash_base64[MAXBLOCKSIZE*2 + 1];
117
118 rv = self->desc->done(&self->state, hash);
119 if (rv != CRYPT_OK) croak("FATAL: digest done failed: %s", error_to_string(rv));
120
121 outlen = sizeof(hash_base64);
122 rv = base64_encode(hash, self->desc->hashsize, (unsigned char *)hash_base64, &outlen);
90 char out[MAXBLOCKSIZE*2];
91
92 rv = self->desc->done(&self->state, hash);
93 if (rv != CRYPT_OK) croak("FATAL: digest done failed: %s", error_to_string(rv));
94
95 outlen = sizeof(out);
96 rv = _base16_encode(hash, self->desc->hashsize, (unsigned char *)out, &outlen);
97 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
98 RETVAL = newSVpvn(out, outlen);
99 }
100 OUTPUT:
101 RETVAL
102
103 SV *
104 b64digest(Crypt::Digest self)
105 CODE:
106 {
107 int rv;
108 unsigned long outlen;
109 unsigned char hash[MAXBLOCKSIZE];
110 char out[MAXBLOCKSIZE*2];
111
112 rv = self->desc->done(&self->state, hash);
113 if (rv != CRYPT_OK) croak("FATAL: digest done failed: %s", error_to_string(rv));
114
115 outlen = sizeof(out);
116 rv = base64_encode(hash, self->desc->hashsize, (unsigned char *)out, &outlen);
123117 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
124 RETVAL = newSVpvn(hash_base64, outlen);
125 }
126 OUTPUT:
127 RETVAL
128
129 SV *
130 b64udigest(self)
131 Crypt::Digest self
118 RETVAL = newSVpvn(out, outlen);
119 }
120 OUTPUT:
121 RETVAL
122
123 SV *
124 b64udigest(Crypt::Digest self)
132125 CODE:
133126 {
134127 int rv;
135128 unsigned long outlen;
136129 unsigned char hash[MAXBLOCKSIZE];
137 char hash_base64[MAXBLOCKSIZE*2 + 1];
138
139 rv = self->desc->done(&self->state, hash);
140 if (rv != CRYPT_OK) croak("FATAL: digest done failed: %s", error_to_string(rv));
141
142 outlen = sizeof(hash_base64);
143 rv = base64url_encode(hash, self->desc->hashsize, (unsigned char *)hash_base64, &outlen);
130 char out[MAXBLOCKSIZE*2];
131
132 rv = self->desc->done(&self->state, hash);
133 if (rv != CRYPT_OK) croak("FATAL: digest done failed: %s", error_to_string(rv));
134
135 outlen = sizeof(out);
136 rv = base64url_encode(hash, self->desc->hashsize, (unsigned char *)out, &outlen);
144137 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
145 RETVAL = newSVpvn(hash_base64, outlen);
138 RETVAL = newSVpvn(out, outlen);
146139 }
147140 OUTPUT:
148141 RETVAL
149142
150143 int
151 _hashsize(self)
152 Crypt::Digest self
153 CODE:
154 RETVAL = self->desc->hashsize;
155 OUTPUT:
156 RETVAL
157
158 int
159 _hashsize_by_name(digest_name)
160 char * digest_name
161 CODE:
162 {
163 int rv, id;
164
165 id = find_hash(digest_name);
166 if (id == -1) croak("FATAL: find_digest failed for '%s'", digest_name);
167
168 rv = hash_descriptor[id].hashsize;
169 if (!rv) croak("FATAL: invalid hashsize for '%s'", digest_name);;
170 RETVAL = rv;
171 }
172 OUTPUT:
173 RETVAL
144 hashsize(SV * param, char * extra = NULL)
145 CODE:
146 {
147 if (sv_isobject(param) && sv_derived_from(param, "Crypt::Digest")) {
148 IV tmp = SvIV((SV*)SvRV(param));
149 Crypt__Digest obj = INT2PTR(Crypt__Digest, tmp);
150 RETVAL = obj->desc->hashsize;
151 }
152 else {
153 char *digest_name;
154 int rv, id;
155 digest_name = SvPOK(param) && strcmp(SvPVX(param), "Crypt::Digest") ? SvPVX(param) : extra;
156 id = _find_hash(digest_name);
157 if (id == -1) croak("FATAL: find_hash failed for '%s'", digest_name);
158 rv = hash_descriptor[id].hashsize;
159 if (!rv) croak("FATAL: invalid hashsize for '%s'", digest_name);;
160 RETVAL = rv;
161 }
162 }
163 OUTPUT:
164 RETVAL
165
166 SV *
167 digest_data(char * digest_name, SV * data)
168 CODE:
169 {
170 STRLEN inlen;
171 int rv, id;
172 unsigned char *in, hash[MAXBLOCKSIZE];
173 unsigned long len = sizeof(hash);
174
175 id = _find_hash(digest_name);
176 if (id == -1) croak("FATAL: find_digest failed for '%s'", digest_name);
177 in = (unsigned char *)SvPVbyte(data, inlen);
178 rv = hash_memory(id, in, inlen, hash, &len);
179 if (rv != CRYPT_OK) croak("FATAL: hash_memory failed: %s", error_to_string(rv));
180 RETVAL = newSVpvn((char *) hash, len);
181 }
182 OUTPUT:
183 RETVAL
184
185 SV *
186 digest_data_hex(char * digest_name, SV * data)
187 CODE:
188 {
189 STRLEN inlen;
190 int rv, id;
191 unsigned char *in, hash[MAXBLOCKSIZE];
192 unsigned long len = sizeof(hash), outlen;
193 char out[MAXBLOCKSIZE*2];
194
195 id = _find_hash(digest_name);
196 if (id == -1) croak("FATAL: find_digest failed for '%s'", digest_name);
197 in = (unsigned char *)SvPVbyte(data, inlen);
198 rv = hash_memory(id, in, inlen, hash, &len);
199 if (rv != CRYPT_OK) croak("FATAL: hash_memory failed: %s", error_to_string(rv));
200 outlen = sizeof(out);
201 rv = _base16_encode(hash, len, (unsigned char *)out, &outlen);
202 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
203 RETVAL = newSVpvn((char *) out, outlen);
204 }
205 OUTPUT:
206 RETVAL
207
208 SV *
209 digest_data_b64(char * digest_name, SV * data)
210 CODE:
211 {
212 STRLEN inlen;
213 int rv, id;
214 unsigned char *in, hash[MAXBLOCKSIZE];
215 unsigned long len = sizeof(hash), outlen;
216 char out[MAXBLOCKSIZE*2];
217
218 id = _find_hash(digest_name);
219 if (id == -1) croak("FATAL: find_digest failed for '%s'", digest_name);
220 in = (unsigned char *)SvPVbyte(data, inlen);
221 rv = hash_memory(id, in, inlen, hash, &len);
222 if (rv != CRYPT_OK) croak("FATAL: hash_memory failed: %s", error_to_string(rv));
223 outlen = sizeof(out);
224 rv = base64_encode(hash, len, (unsigned char *)out, &outlen);
225 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
226 RETVAL = newSVpvn((char *) out, outlen);
227
228 }
229 OUTPUT:
230 RETVAL
231
232 SV *
233 digest_data_b64u(char * digest_name, SV * data)
234 CODE:
235 {
236 STRLEN inlen;
237 int rv, id;
238 unsigned char *in, hash[MAXBLOCKSIZE];
239 unsigned long len = sizeof(hash), outlen;
240 char out[MAXBLOCKSIZE*2];
241
242 id = _find_hash(digest_name);
243 if (id == -1) croak("FATAL: find_digest failed for '%s'", digest_name);
244 in = (unsigned char *)SvPVbyte(data, inlen);
245 rv = hash_memory(id, in, inlen, hash, &len);
246 if (rv != CRYPT_OK) croak("FATAL: hash_memory failed: %s", error_to_string(rv));
247 outlen = sizeof(out);
248 rv = base64url_encode(hash, len, (unsigned char *)out, &outlen);
249 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
250 RETVAL = newSVpvn((char *) out, outlen);
251 }
252 OUTPUT:
253 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Digest::SHAKE
11
22 Crypt::Digest::SHAKE
3 _new(int num)
3 new(char * class, int num)
44 CODE:
55 {
66 int rv;
1616 unsigned char *salt_ptr=NULL;
1717 STRLEN salt_len=0;
1818
19 id = find_hash(hash_name);
19 id = _find_hash(hash_name);
2020 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
2121
2222 password_ptr = (unsigned char *)SvPVbyte(password, password_len);
5555 unsigned char *salt_ptr=NULL;
5656 STRLEN salt_len=0;
5757
58 id = find_hash(hash_name);
58 id = _find_hash(hash_name);
5959 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
6060
6161 password_ptr = (unsigned char *)SvPVbyte(password, password_len);
9393 unsigned char *salt_ptr=NULL;
9494 STRLEN salt_len=0;
9595
96 id = find_hash(hash_name);
96 id = _find_hash(hash_name);
9797 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
9898
9999 in_ptr = (unsigned char *)SvPVbyte(in, in_len);
124124 unsigned char *info_ptr=NULL;
125125 STRLEN info_len=0;
126126
127 id = find_hash(hash_name);
127 id = _find_hash(hash_name);
128128 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
129129
130130 in_ptr = (unsigned char *)SvPVbyte(in, in_len);
164164 unsigned char *salt_ptr=NULL;
165165 STRLEN salt_len=0;
166166
167 id = find_hash(hash_name);
167 id = _find_hash(hash_name);
168168 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
169169
170170 in_ptr = (unsigned char *)SvPVbyte(in, in_len);
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mac::BLAKE2b
5 _new(int size, SV * key)
5 new(char * class, int size, SV * key)
66 CODE:
77 {
88 STRLEN k_len=0;
5858 CODE:
5959 {
6060 char mac[MAXBLOCKSIZE];
61 unsigned long mac_len;
61 unsigned long maclen;
6262 int rv;
6363
64 mac_len = sizeof(mac);
65 rv = blake2bmac_done(&self->state, (unsigned char*)mac, &mac_len);
64 maclen = sizeof(mac);
65 rv = blake2bmac_done(&self->state, (unsigned char*)mac, &maclen);
6666 if (rv != CRYPT_OK) croak("FATAL: blake2bmac_done failed: %s", error_to_string(rv));
67 RETVAL = newSVpvn(mac, mac_len);
67 RETVAL = newSVpvn(mac, maclen);
6868 }
6969 OUTPUT:
7070 RETVAL
7474 CODE:
7575 {
7676 unsigned char mac[MAXBLOCKSIZE];
77 unsigned long mac_len;
77 unsigned long maclen;
7878 int rv;
7979 unsigned long outlen;
80 char mac_base64[MAXBLOCKSIZE*2 + 1];
80 char out[MAXBLOCKSIZE*2];
8181
82 mac_len = sizeof(mac);
83 rv = blake2bmac_done(&self->state, mac, &mac_len);
82 maclen = sizeof(mac);
83 rv = blake2bmac_done(&self->state, mac, &maclen);
8484 if (rv != CRYPT_OK) croak("FATAL: blake2bmac_done failed: %s", error_to_string(rv));
85 outlen = sizeof(mac_base64);
86 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
85 outlen = sizeof(out);
86 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
8787 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
88 RETVAL = newSVpvn(mac_base64, outlen);
88 RETVAL = newSVpvn(out, outlen);
8989 }
9090 OUTPUT:
9191 RETVAL
9595 CODE:
9696 {
9797 unsigned char mac[MAXBLOCKSIZE];
98 unsigned long mac_len;
98 unsigned long maclen;
9999 int rv;
100100 unsigned long outlen;
101 char mac_base64[MAXBLOCKSIZE*2 + 1];
101 char out[MAXBLOCKSIZE*2 + 1];
102102
103 mac_len = sizeof(mac);
104 rv = blake2bmac_done(&self->state, mac, &mac_len);
103 maclen = sizeof(mac);
104 rv = blake2bmac_done(&self->state, mac, &maclen);
105105 if (rv != CRYPT_OK) croak("FATAL: blake2bmac_done failed: %s", error_to_string(rv));
106 outlen = sizeof(mac_base64);
107 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
106 outlen = sizeof(out);
107 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
108108 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
109 RETVAL = newSVpvn(mac_base64, outlen);
109 RETVAL = newSVpvn(out, outlen);
110110 }
111111 OUTPUT:
112112 RETVAL
116116 CODE:
117117 {
118118 unsigned char mac[MAXBLOCKSIZE];
119 unsigned long mac_len, i;
119 unsigned long maclen, outlen;
120120 int rv;
121 char mac_hex[MAXBLOCKSIZE*2 + 1];
121 char out[MAXBLOCKSIZE*2];
122122
123 mac_len = sizeof(mac);
124 rv = blake2bmac_done(&self->state, mac, &mac_len);
123 maclen = sizeof(mac);
124 rv = blake2bmac_done(&self->state, mac, &maclen);
125125 if (rv != CRYPT_OK) croak("FATAL: blake2bmac_done failed: %s", error_to_string(rv));
126 mac_hex[0] = '\0';
127 for(i=0; i<mac_len; i++)
128 sprintf(&mac_hex[2*i], "%02x", mac[i]);
129 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
126 outlen = sizeof(out);
127 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
128 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
129 RETVAL = newSVpvn(out, outlen);
130130 }
131131 OUTPUT:
132132 RETVAL
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mac::BLAKE2s
5 _new(int size, SV * key)
5 new(char * class, int size, SV * key)
66 CODE:
77 {
88 STRLEN k_len=0;
5858 CODE:
5959 {
6060 char mac[MAXBLOCKSIZE];
61 unsigned long mac_len;
61 unsigned long maclen;
6262 int rv;
6363
64 mac_len = sizeof(mac);
65 rv = blake2smac_done(&self->state, (unsigned char*)mac, &mac_len);
64 maclen = sizeof(mac);
65 rv = blake2smac_done(&self->state, (unsigned char*)mac, &maclen);
6666 if (rv != CRYPT_OK) croak("FATAL: blake2smac_done failed: %s", error_to_string(rv));
67 RETVAL = newSVpvn(mac, mac_len);
67 RETVAL = newSVpvn(mac, maclen);
6868 }
6969 OUTPUT:
7070 RETVAL
7474 CODE:
7575 {
7676 unsigned char mac[MAXBLOCKSIZE];
77 unsigned long mac_len;
77 unsigned long maclen;
7878 int rv;
7979 unsigned long outlen;
80 char mac_base64[MAXBLOCKSIZE*2 + 1];
80 char out[MAXBLOCKSIZE*2];
8181
82 mac_len = sizeof(mac);
83 rv = blake2smac_done(&self->state, mac, &mac_len);
82 maclen = sizeof(mac);
83 rv = blake2smac_done(&self->state, mac, &maclen);
8484 if (rv != CRYPT_OK) croak("FATAL: blake2smac_done failed: %s", error_to_string(rv));
85 outlen = sizeof(mac_base64);
86 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
85 outlen = sizeof(out);
86 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
8787 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
88 RETVAL = newSVpvn(mac_base64, outlen);
88 RETVAL = newSVpvn(out, outlen);
8989 }
9090 OUTPUT:
9191 RETVAL
9595 CODE:
9696 {
9797 unsigned char mac[MAXBLOCKSIZE];
98 unsigned long mac_len;
98 unsigned long maclen;
9999 int rv;
100100 unsigned long outlen;
101 char mac_base64[MAXBLOCKSIZE*2 + 1];
101 char out[MAXBLOCKSIZE*2 + 1];
102102
103 mac_len = sizeof(mac);
104 rv = blake2smac_done(&self->state, mac, &mac_len);
103 maclen = sizeof(mac);
104 rv = blake2smac_done(&self->state, mac, &maclen);
105105 if (rv != CRYPT_OK) croak("FATAL: blake2smac_done failed: %s", error_to_string(rv));
106 outlen = sizeof(mac_base64);
107 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
106 outlen = sizeof(out);
107 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
108108 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
109 RETVAL = newSVpvn(mac_base64, outlen);
109 RETVAL = newSVpvn(out, outlen);
110110 }
111111 OUTPUT:
112112 RETVAL
116116 CODE:
117117 {
118118 unsigned char mac[MAXBLOCKSIZE];
119 unsigned long mac_len, i;
119 unsigned long maclen, outlen;
120120 int rv;
121 char mac_hex[MAXBLOCKSIZE*2 + 1];
121 char out[MAXBLOCKSIZE*2];
122122
123 mac_len = sizeof(mac);
124 rv = blake2smac_done(&self->state, mac, &mac_len);
123 maclen = sizeof(mac);
124 rv = blake2smac_done(&self->state, mac, &maclen);
125125 if (rv != CRYPT_OK) croak("FATAL: blake2smac_done failed: %s", error_to_string(rv));
126 mac_hex[0] = '\0';
127 for(i=0; i<mac_len; i++)
128 sprintf(&mac_hex[2*i], "%02x", mac[i]);
129 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
126 outlen = sizeof(out);
127 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
128 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
129 RETVAL = newSVpvn(out, outlen);
130130 }
131131 OUTPUT:
132132 RETVAL
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mac::F9
5 _new(char * cipher_name, SV * key)
5 new(char * class, char * cipher_name, SV * key)
66 CODE:
77 {
88 STRLEN k_len=0;
1010 int rv;
1111 int id;
1212
13 id = find_cipher(cipher_name);
13 id = _find_cipher(cipher_name);
1414 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1515
1616 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
6262 CODE:
6363 {
6464 char mac[MAXBLOCKSIZE];
65 unsigned long mac_len;
65 unsigned long maclen;
6666 int rv;
6767
68 mac_len = sizeof(mac);
69 rv = f9_done(&self->state, (unsigned char*)mac, &mac_len);
68 maclen = sizeof(mac);
69 rv = f9_done(&self->state, (unsigned char*)mac, &maclen);
7070 if (rv != CRYPT_OK) croak("FATAL: f9_done failed: %s", error_to_string(rv));
71 RETVAL = newSVpvn(mac, mac_len);
71 RETVAL = newSVpvn(mac, maclen);
7272 }
7373 OUTPUT:
7474 RETVAL
7878 CODE:
7979 {
8080 unsigned char mac[MAXBLOCKSIZE];
81 unsigned long mac_len;
81 unsigned long maclen;
8282 int rv;
8383 unsigned long outlen;
84 char mac_base64[MAXBLOCKSIZE*2 + 1];
84 char out[MAXBLOCKSIZE*2];
8585
86 mac_len = sizeof(mac);
87 rv = f9_done(&self->state, mac, &mac_len);
86 maclen = sizeof(mac);
87 rv = f9_done(&self->state, mac, &maclen);
8888 if (rv != CRYPT_OK) croak("FATAL: f9_done failed: %s", error_to_string(rv));
89 outlen = sizeof(mac_base64);
90 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
89 outlen = sizeof(out);
90 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
9191 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
92 RETVAL = newSVpvn(mac_base64, outlen);
92 RETVAL = newSVpvn(out, outlen);
9393 }
9494 OUTPUT:
9595 RETVAL
9999 CODE:
100100 {
101101 unsigned char mac[MAXBLOCKSIZE];
102 unsigned long mac_len;
102 unsigned long maclen;
103103 int rv;
104104 unsigned long outlen;
105 char mac_base64[MAXBLOCKSIZE*2 + 1];
105 char out[MAXBLOCKSIZE*2 + 1];
106106
107 mac_len = sizeof(mac);
108 rv = f9_done(&self->state, mac, &mac_len);
107 maclen = sizeof(mac);
108 rv = f9_done(&self->state, mac, &maclen);
109109 if (rv != CRYPT_OK) croak("FATAL: f9_done failed: %s", error_to_string(rv));
110 outlen = sizeof(mac_base64);
111 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
110 outlen = sizeof(out);
111 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
112112 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
113 RETVAL = newSVpvn(mac_base64, outlen);
113 RETVAL = newSVpvn(out, outlen);
114114 }
115115 OUTPUT:
116116 RETVAL
120120 CODE:
121121 {
122122 unsigned char mac[MAXBLOCKSIZE];
123 unsigned long mac_len, i;
123 unsigned long maclen, outlen;
124124 int rv;
125 char mac_hex[MAXBLOCKSIZE*2 + 1];
125 char out[MAXBLOCKSIZE*2];
126126
127 mac_len = sizeof(mac);
128 rv = f9_done(&self->state, mac, &mac_len);
127 maclen = sizeof(mac);
128 rv = f9_done(&self->state, mac, &maclen);
129129 if (rv != CRYPT_OK) croak("FATAL: f9_done failed: %s", error_to_string(rv));
130 mac_hex[0] = '\0';
131 for(i=0; i<mac_len; i++)
132 sprintf(&mac_hex[2*i], "%02x", mac[i]);
133 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
130 outlen = sizeof(out);
131 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
132 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
133 RETVAL = newSVpvn(out, outlen);
134134 }
135135 OUTPUT:
136136 RETVAL
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mac::HMAC
5 _new(char * hash_name, SV * key)
5 new(char * class, char * hash_name, SV * key)
66 CODE:
77 {
88 STRLEN k_len=0;
1010 int rv;
1111 int id;
1212
13 id = find_hash(hash_name);
13 id = _find_hash(hash_name);
1414 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
1515
1616 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
6262 CODE:
6363 {
6464 char mac[MAXBLOCKSIZE];
65 unsigned long mac_len;
65 unsigned long maclen;
6666 int rv;
6767
68 mac_len = sizeof(mac);
69 rv = hmac_done(&self->state, (unsigned char*)mac, &mac_len);
68 maclen = sizeof(mac);
69 rv = hmac_done(&self->state, (unsigned char*)mac, &maclen);
7070 if (rv != CRYPT_OK) croak("FATAL: hmac_done failed: %s", error_to_string(rv));
71 RETVAL = newSVpvn(mac, mac_len);
71 RETVAL = newSVpvn(mac, maclen);
7272 }
7373 OUTPUT:
7474 RETVAL
7878 CODE:
7979 {
8080 unsigned char mac[MAXBLOCKSIZE];
81 unsigned long mac_len;
81 unsigned long maclen;
8282 int rv;
8383 unsigned long outlen;
84 char mac_base64[MAXBLOCKSIZE*2 + 1];
84 char out[MAXBLOCKSIZE*2];
8585
86 mac_len = sizeof(mac);
87 rv = hmac_done(&self->state, mac, &mac_len);
86 maclen = sizeof(mac);
87 rv = hmac_done(&self->state, mac, &maclen);
8888 if (rv != CRYPT_OK) croak("FATAL: hmac_done failed: %s", error_to_string(rv));
89 outlen = sizeof(mac_base64);
90 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
89 outlen = sizeof(out);
90 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
9191 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
92 RETVAL = newSVpvn(mac_base64, outlen);
92 RETVAL = newSVpvn(out, outlen);
9393 }
9494 OUTPUT:
9595 RETVAL
9999 CODE:
100100 {
101101 unsigned char mac[MAXBLOCKSIZE];
102 unsigned long mac_len;
102 unsigned long maclen;
103103 int rv;
104104 unsigned long outlen;
105 char mac_base64[MAXBLOCKSIZE*2 + 1];
105 char out[MAXBLOCKSIZE*2 + 1];
106106
107 mac_len = sizeof(mac);
108 rv = hmac_done(&self->state, mac, &mac_len);
107 maclen = sizeof(mac);
108 rv = hmac_done(&self->state, mac, &maclen);
109109 if (rv != CRYPT_OK) croak("FATAL: hmac_done failed: %s", error_to_string(rv));
110 outlen = sizeof(mac_base64);
111 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
110 outlen = sizeof(out);
111 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
112112 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
113 RETVAL = newSVpvn(mac_base64, outlen);
113 RETVAL = newSVpvn(out, outlen);
114114 }
115115 OUTPUT:
116116 RETVAL
120120 CODE:
121121 {
122122 unsigned char mac[MAXBLOCKSIZE];
123 unsigned long mac_len, i;
123 unsigned long maclen, outlen;
124124 int rv;
125 char mac_hex[MAXBLOCKSIZE*2 + 1];
125 char out[MAXBLOCKSIZE*2];
126126
127 mac_len = sizeof(mac);
128 rv = hmac_done(&self->state, mac, &mac_len);
127 maclen = sizeof(mac);
128 rv = hmac_done(&self->state, mac, &maclen);
129129 if (rv != CRYPT_OK) croak("FATAL: hmac_done failed: %s", error_to_string(rv));
130 mac_hex[0] = '\0';
131 for(i=0; i<mac_len; i++)
132 sprintf(&mac_hex[2*i], "%02x", mac[i]);
133 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
130 outlen = sizeof(out);
131 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
132 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
133 RETVAL = newSVpvn(out, outlen);
134134 }
135135 OUTPUT:
136136 RETVAL
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mac::OMAC
5 _new(char * cipher_name, SV * key)
5 new(char * class, char * cipher_name, SV * key)
66 CODE:
77 {
88 STRLEN k_len=0;
1010 int rv;
1111 int id;
1212
13 id = find_cipher(cipher_name);
13 id = _find_cipher(cipher_name);
1414 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1515
1616 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
6262 CODE:
6363 {
6464 char mac[MAXBLOCKSIZE];
65 unsigned long mac_len;
65 unsigned long maclen;
6666 int rv;
6767
68 mac_len = sizeof(mac);
69 rv = omac_done(&self->state, (unsigned char*)mac, &mac_len);
68 maclen = sizeof(mac);
69 rv = omac_done(&self->state, (unsigned char*)mac, &maclen);
7070 if (rv != CRYPT_OK) croak("FATAL: omac_done failed: %s", error_to_string(rv));
71 RETVAL = newSVpvn(mac, mac_len);
71 RETVAL = newSVpvn(mac, maclen);
7272 }
7373 OUTPUT:
7474 RETVAL
7878 CODE:
7979 {
8080 unsigned char mac[MAXBLOCKSIZE];
81 unsigned long mac_len;
81 unsigned long maclen;
8282 int rv;
8383 unsigned long outlen;
84 char mac_base64[MAXBLOCKSIZE*2 + 1];
84 char out[MAXBLOCKSIZE*2];
8585
86 mac_len = sizeof(mac);
87 rv = omac_done(&self->state, mac, &mac_len);
86 maclen = sizeof(mac);
87 rv = omac_done(&self->state, mac, &maclen);
8888 if (rv != CRYPT_OK) croak("FATAL: omac_done failed: %s", error_to_string(rv));
89 outlen = sizeof(mac_base64);
90 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
89 outlen = sizeof(out);
90 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
9191 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
92 RETVAL = newSVpvn(mac_base64, outlen);
92 RETVAL = newSVpvn(out, outlen);
9393 }
9494 OUTPUT:
9595 RETVAL
9999 CODE:
100100 {
101101 unsigned char mac[MAXBLOCKSIZE];
102 unsigned long mac_len;
102 unsigned long maclen;
103103 int rv;
104104 unsigned long outlen;
105 char mac_base64[MAXBLOCKSIZE*2 + 1];
105 char out[MAXBLOCKSIZE*2 + 1];
106106
107 mac_len = sizeof(mac);
108 rv = omac_done(&self->state, mac, &mac_len);
107 maclen = sizeof(mac);
108 rv = omac_done(&self->state, mac, &maclen);
109109 if (rv != CRYPT_OK) croak("FATAL: omac_done failed: %s", error_to_string(rv));
110 outlen = sizeof(mac_base64);
111 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
110 outlen = sizeof(out);
111 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
112112 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
113 RETVAL = newSVpvn(mac_base64, outlen);
113 RETVAL = newSVpvn(out, outlen);
114114 }
115115 OUTPUT:
116116 RETVAL
120120 CODE:
121121 {
122122 unsigned char mac[MAXBLOCKSIZE];
123 unsigned long mac_len, i;
123 unsigned long maclen, outlen;
124124 int rv;
125 char mac_hex[MAXBLOCKSIZE*2 + 1];
125 char out[MAXBLOCKSIZE*2];
126126
127 mac_len = sizeof(mac);
128 rv = omac_done(&self->state, mac, &mac_len);
127 maclen = sizeof(mac);
128 rv = omac_done(&self->state, mac, &maclen);
129129 if (rv != CRYPT_OK) croak("FATAL: omac_done failed: %s", error_to_string(rv));
130 mac_hex[0] = '\0';
131 for(i=0; i<mac_len; i++)
132 sprintf(&mac_hex[2*i], "%02x", mac[i]);
133 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
130 outlen = sizeof(out);
131 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
132 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
133 RETVAL = newSVpvn(out, outlen);
134134 }
135135 OUTPUT:
136136 RETVAL
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mac::PMAC
5 _new(char * cipher_name, SV * key)
5 new(char * class, char * cipher_name, SV * key)
66 CODE:
77 {
88 STRLEN k_len=0;
1010 int rv;
1111 int id;
1212
13 id = find_cipher(cipher_name);
13 id = _find_cipher(cipher_name);
1414 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1515
1616 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
6262 CODE:
6363 {
6464 char mac[MAXBLOCKSIZE];
65 unsigned long mac_len;
65 unsigned long maclen;
6666 int rv;
6767
68 mac_len = sizeof(mac);
69 rv = pmac_done(&self->state, (unsigned char*)mac, &mac_len);
68 maclen = sizeof(mac);
69 rv = pmac_done(&self->state, (unsigned char*)mac, &maclen);
7070 if (rv != CRYPT_OK) croak("FATAL: pmac_done failed: %s", error_to_string(rv));
71 RETVAL = newSVpvn(mac, mac_len);
71 RETVAL = newSVpvn(mac, maclen);
7272 }
7373 OUTPUT:
7474 RETVAL
7878 CODE:
7979 {
8080 unsigned char mac[MAXBLOCKSIZE];
81 unsigned long mac_len;
81 unsigned long maclen;
8282 int rv;
8383 unsigned long outlen;
84 char mac_base64[MAXBLOCKSIZE*2 + 1];
84 char out[MAXBLOCKSIZE*2];
8585
86 mac_len = sizeof(mac);
87 rv = pmac_done(&self->state, mac, &mac_len);
86 maclen = sizeof(mac);
87 rv = pmac_done(&self->state, mac, &maclen);
8888 if (rv != CRYPT_OK) croak("FATAL: pmac_done failed: %s", error_to_string(rv));
89 outlen = sizeof(mac_base64);
90 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
89 outlen = sizeof(out);
90 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
9191 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
92 RETVAL = newSVpvn(mac_base64, outlen);
92 RETVAL = newSVpvn(out, outlen);
9393 }
9494 OUTPUT:
9595 RETVAL
9999 CODE:
100100 {
101101 unsigned char mac[MAXBLOCKSIZE];
102 unsigned long mac_len;
102 unsigned long maclen;
103103 int rv;
104104 unsigned long outlen;
105 char mac_base64[MAXBLOCKSIZE*2 + 1];
105 char out[MAXBLOCKSIZE*2 + 1];
106106
107 mac_len = sizeof(mac);
108 rv = pmac_done(&self->state, mac, &mac_len);
107 maclen = sizeof(mac);
108 rv = pmac_done(&self->state, mac, &maclen);
109109 if (rv != CRYPT_OK) croak("FATAL: pmac_done failed: %s", error_to_string(rv));
110 outlen = sizeof(mac_base64);
111 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
110 outlen = sizeof(out);
111 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
112112 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
113 RETVAL = newSVpvn(mac_base64, outlen);
113 RETVAL = newSVpvn(out, outlen);
114114 }
115115 OUTPUT:
116116 RETVAL
120120 CODE:
121121 {
122122 unsigned char mac[MAXBLOCKSIZE];
123 unsigned long mac_len, i;
123 unsigned long maclen, outlen;
124124 int rv;
125 char mac_hex[MAXBLOCKSIZE*2 + 1];
125 char out[MAXBLOCKSIZE*2];
126126
127 mac_len = sizeof(mac);
128 rv = pmac_done(&self->state, mac, &mac_len);
127 maclen = sizeof(mac);
128 rv = pmac_done(&self->state, mac, &maclen);
129129 if (rv != CRYPT_OK) croak("FATAL: pmac_done failed: %s", error_to_string(rv));
130 mac_hex[0] = '\0';
131 for(i=0; i<mac_len; i++)
132 sprintf(&mac_hex[2*i], "%02x", mac[i]);
133 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
130 outlen = sizeof(out);
131 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
132 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
133 RETVAL = newSVpvn(out, outlen);
134134 }
135135 OUTPUT:
136136 RETVAL
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mac::Pelican
5 _new(SV * key)
5 new(char * class, SV * key)
66 CODE:
77 {
88 STRLEN k_len=0;
5858 CODE:
5959 {
6060 char mac[MAXBLOCKSIZE];
61 unsigned long mac_len;
61 unsigned long maclen;
6262 int rv;
6363
64 mac_len = 16;
64 maclen = 16;
6565 rv = pelican_done(&self->state, (unsigned char*)mac);
6666 if (rv != CRYPT_OK) croak("FATAL: pelican_done failed: %s", error_to_string(rv));
67 RETVAL = newSVpvn(mac, mac_len);
67 RETVAL = newSVpvn(mac, maclen);
6868 }
6969 OUTPUT:
7070 RETVAL
7474 CODE:
7575 {
7676 unsigned char mac[MAXBLOCKSIZE];
77 unsigned long mac_len;
77 unsigned long maclen;
7878 int rv;
7979 unsigned long outlen;
80 char mac_base64[MAXBLOCKSIZE*2 + 1];
80 char out[MAXBLOCKSIZE*2];
8181
82 mac_len = 16;
82 maclen = 16;
8383 rv = pelican_done(&self->state, mac);
8484 if (rv != CRYPT_OK) croak("FATAL: pelican_done failed: %s", error_to_string(rv));
85 outlen = sizeof(mac_base64);
86 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
85 outlen = sizeof(out);
86 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
8787 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
88 RETVAL = newSVpvn(mac_base64, outlen);
88 RETVAL = newSVpvn(out, outlen);
8989 }
9090 OUTPUT:
9191 RETVAL
9595 CODE:
9696 {
9797 unsigned char mac[MAXBLOCKSIZE];
98 unsigned long mac_len;
98 unsigned long maclen;
9999 int rv;
100100 unsigned long outlen;
101 char mac_base64[MAXBLOCKSIZE*2 + 1];
101 char out[MAXBLOCKSIZE*2 + 1];
102102
103 mac_len = 16;
103 maclen = 16;
104104 rv = pelican_done(&self->state, mac);
105105 if (rv != CRYPT_OK) croak("FATAL: pelican_done failed: %s", error_to_string(rv));
106 outlen = sizeof(mac_base64);
107 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
106 outlen = sizeof(out);
107 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
108108 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
109 RETVAL = newSVpvn(mac_base64, outlen);
109 RETVAL = newSVpvn(out, outlen);
110110 }
111111 OUTPUT:
112112 RETVAL
116116 CODE:
117117 {
118118 unsigned char mac[MAXBLOCKSIZE];
119 unsigned long mac_len, i;
119 unsigned long maclen, outlen;
120120 int rv;
121 char mac_hex[MAXBLOCKSIZE*2 + 1];
121 char out[MAXBLOCKSIZE*2];
122122
123 mac_len = 16;
123 maclen = 16;
124124 rv = pelican_done(&self->state, mac);
125125 if (rv != CRYPT_OK) croak("FATAL: pelican_done failed: %s", error_to_string(rv));
126 mac_hex[0] = '\0';
127 for(i=0; i<mac_len; i++)
128 sprintf(&mac_hex[2*i], "%02x", mac[i]);
129 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
126 outlen = sizeof(out);
127 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
128 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
129 RETVAL = newSVpvn(out, outlen);
130130 }
131131 OUTPUT:
132132 RETVAL
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mac::Poly1305
5 _new(SV * key)
5 new(char * class, SV * key)
66 CODE:
77 {
88 STRLEN k_len=0;
5858 CODE:
5959 {
6060 char mac[MAXBLOCKSIZE];
61 unsigned long mac_len;
61 unsigned long maclen;
6262 int rv;
6363
64 mac_len = sizeof(mac);
65 rv = poly1305_done(&self->state, (unsigned char*)mac, &mac_len);
64 maclen = sizeof(mac);
65 rv = poly1305_done(&self->state, (unsigned char*)mac, &maclen);
6666 if (rv != CRYPT_OK) croak("FATAL: poly1305_done failed: %s", error_to_string(rv));
67 RETVAL = newSVpvn(mac, mac_len);
67 RETVAL = newSVpvn(mac, maclen);
6868 }
6969 OUTPUT:
7070 RETVAL
7474 CODE:
7575 {
7676 unsigned char mac[MAXBLOCKSIZE];
77 unsigned long mac_len;
77 unsigned long maclen;
7878 int rv;
7979 unsigned long outlen;
80 char mac_base64[MAXBLOCKSIZE*2 + 1];
80 char out[MAXBLOCKSIZE*2];
8181
82 mac_len = sizeof(mac);
83 rv = poly1305_done(&self->state, mac, &mac_len);
82 maclen = sizeof(mac);
83 rv = poly1305_done(&self->state, mac, &maclen);
8484 if (rv != CRYPT_OK) croak("FATAL: poly1305_done failed: %s", error_to_string(rv));
85 outlen = sizeof(mac_base64);
86 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
85 outlen = sizeof(out);
86 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
8787 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
88 RETVAL = newSVpvn(mac_base64, outlen);
88 RETVAL = newSVpvn(out, outlen);
8989 }
9090 OUTPUT:
9191 RETVAL
9595 CODE:
9696 {
9797 unsigned char mac[MAXBLOCKSIZE];
98 unsigned long mac_len;
98 unsigned long maclen;
9999 int rv;
100100 unsigned long outlen;
101 char mac_base64[MAXBLOCKSIZE*2 + 1];
101 char out[MAXBLOCKSIZE*2 + 1];
102102
103 mac_len = sizeof(mac);
104 rv = poly1305_done(&self->state, mac, &mac_len);
103 maclen = sizeof(mac);
104 rv = poly1305_done(&self->state, mac, &maclen);
105105 if (rv != CRYPT_OK) croak("FATAL: poly1305_done failed: %s", error_to_string(rv));
106 outlen = sizeof(mac_base64);
107 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
106 outlen = sizeof(out);
107 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
108108 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
109 RETVAL = newSVpvn(mac_base64, outlen);
109 RETVAL = newSVpvn(out, outlen);
110110 }
111111 OUTPUT:
112112 RETVAL
116116 CODE:
117117 {
118118 unsigned char mac[MAXBLOCKSIZE];
119 unsigned long mac_len, i;
119 unsigned long maclen, outlen;
120120 int rv;
121 char mac_hex[MAXBLOCKSIZE*2 + 1];
121 char out[MAXBLOCKSIZE*2];
122122
123 mac_len = sizeof(mac);
124 rv = poly1305_done(&self->state, mac, &mac_len);
123 maclen = sizeof(mac);
124 rv = poly1305_done(&self->state, mac, &maclen);
125125 if (rv != CRYPT_OK) croak("FATAL: poly1305_done failed: %s", error_to_string(rv));
126 mac_hex[0] = '\0';
127 for(i=0; i<mac_len; i++)
128 sprintf(&mac_hex[2*i], "%02x", mac[i]);
129 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
126 outlen = sizeof(out);
127 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
128 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
129 RETVAL = newSVpvn(out, outlen);
130130 }
131131 OUTPUT:
132132 RETVAL
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mac::XCBC
5 _new(char * cipher_name, SV * key)
5 new(char * class, char * cipher_name, SV * key)
66 CODE:
77 {
88 STRLEN k_len=0;
1010 int rv;
1111 int id;
1212
13 id = find_cipher(cipher_name);
13 id = _find_cipher(cipher_name);
1414 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1515
1616 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
6262 CODE:
6363 {
6464 char mac[MAXBLOCKSIZE];
65 unsigned long mac_len;
65 unsigned long maclen;
6666 int rv;
6767
68 mac_len = sizeof(mac);
69 rv = xcbc_done(&self->state, (unsigned char*)mac, &mac_len);
68 maclen = sizeof(mac);
69 rv = xcbc_done(&self->state, (unsigned char*)mac, &maclen);
7070 if (rv != CRYPT_OK) croak("FATAL: xcbc_done failed: %s", error_to_string(rv));
71 RETVAL = newSVpvn(mac, mac_len);
71 RETVAL = newSVpvn(mac, maclen);
7272 }
7373 OUTPUT:
7474 RETVAL
7878 CODE:
7979 {
8080 unsigned char mac[MAXBLOCKSIZE];
81 unsigned long mac_len;
81 unsigned long maclen;
8282 int rv;
8383 unsigned long outlen;
84 char mac_base64[MAXBLOCKSIZE*2 + 1];
84 char out[MAXBLOCKSIZE*2];
8585
86 mac_len = sizeof(mac);
87 rv = xcbc_done(&self->state, mac, &mac_len);
86 maclen = sizeof(mac);
87 rv = xcbc_done(&self->state, mac, &maclen);
8888 if (rv != CRYPT_OK) croak("FATAL: xcbc_done failed: %s", error_to_string(rv));
89 outlen = sizeof(mac_base64);
90 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
89 outlen = sizeof(out);
90 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
9191 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
92 RETVAL = newSVpvn(mac_base64, outlen);
92 RETVAL = newSVpvn(out, outlen);
9393 }
9494 OUTPUT:
9595 RETVAL
9999 CODE:
100100 {
101101 unsigned char mac[MAXBLOCKSIZE];
102 unsigned long mac_len;
102 unsigned long maclen;
103103 int rv;
104104 unsigned long outlen;
105 char mac_base64[MAXBLOCKSIZE*2 + 1];
105 char out[MAXBLOCKSIZE*2 + 1];
106106
107 mac_len = sizeof(mac);
108 rv = xcbc_done(&self->state, mac, &mac_len);
107 maclen = sizeof(mac);
108 rv = xcbc_done(&self->state, mac, &maclen);
109109 if (rv != CRYPT_OK) croak("FATAL: xcbc_done failed: %s", error_to_string(rv));
110 outlen = sizeof(mac_base64);
111 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
110 outlen = sizeof(out);
111 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
112112 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
113 RETVAL = newSVpvn(mac_base64, outlen);
113 RETVAL = newSVpvn(out, outlen);
114114 }
115115 OUTPUT:
116116 RETVAL
120120 CODE:
121121 {
122122 unsigned char mac[MAXBLOCKSIZE];
123 unsigned long mac_len, i;
123 unsigned long maclen, outlen;
124124 int rv;
125 char mac_hex[MAXBLOCKSIZE*2 + 1];
125 char out[MAXBLOCKSIZE*2];
126126
127 mac_len = sizeof(mac);
128 rv = xcbc_done(&self->state, mac, &mac_len);
127 maclen = sizeof(mac);
128 rv = xcbc_done(&self->state, mac, &maclen);
129129 if (rv != CRYPT_OK) croak("FATAL: xcbc_done failed: %s", error_to_string(rv));
130 mac_hex[0] = '\0';
131 for(i=0; i<mac_len; i++)
132 sprintf(&mac_hex[2*i], "%02x", mac[i]);
133 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
130 outlen = sizeof(out);
131 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
132 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
133 RETVAL = newSVpvn(out, outlen);
134134 }
135135 OUTPUT:
136136 RETVAL
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mode::CBC
5 _new(char * cipher_name, int padding=1, int rounds=0)
5 new(char * class, char * cipher_name, int padding=1, int rounds=0)
66 CODE:
77 {
88 Newz(0, RETVAL, 1, struct cbc_struct);
1111 RETVAL->padlen = 0;
1212 RETVAL->direction = 0;
1313 RETVAL->cipher_rounds = rounds;
14 RETVAL->cipher_id = find_cipher(cipher_name);
14 RETVAL->cipher_id = _find_cipher(cipher_name);
1515 if (RETVAL->cipher_id == -1) {
1616 Safefree(RETVAL);
1717 croak("FATAL: find_cipfer failed for '%s'", cipher_name);
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mode::CFB
5 _new(char * cipher_name, int rounds=0)
5 new(char * class, char * cipher_name, int rounds=0)
66 CODE:
77 {
88 Newz(0, RETVAL, 1, struct cfb_struct);
99 if (!RETVAL) croak("FATAL: Newz failed");
1010 RETVAL->direction = 0;
1111 RETVAL->cipher_rounds = rounds;
12 RETVAL->cipher_id = find_cipher(cipher_name);
12 RETVAL->cipher_id = _find_cipher(cipher_name);
1313 if (RETVAL->cipher_id == -1) {
1414 Safefree(RETVAL);
1515 croak("FATAL: find_cipfer failed for '%s'", cipher_name);
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mode::CTR
5 _new(char * cipher_name, int ctr_mode=0, int ctr_width=0, int rounds=0)
5 new(char * class, char * cipher_name, int ctr_mode=0, int ctr_width=0, int rounds=0)
66 CODE:
77 {
88 Newz(0, RETVAL, 1, struct ctr_struct);
99 if (!RETVAL) croak("FATAL: Newz failed");
1010 RETVAL->direction = 0;
1111 RETVAL->cipher_rounds = rounds;
12 RETVAL->cipher_id = find_cipher(cipher_name);
12 RETVAL->cipher_id = _find_cipher(cipher_name);
1313 if (RETVAL->cipher_id == -1) {
1414 Safefree(RETVAL);
1515 croak("FATAL: find_cipfer failed for '%s'", cipher_name);
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mode::ECB
5 _new(char * cipher_name, int padding=1, int rounds=0)
5 new(char * class, char * cipher_name, int padding=1, int rounds=0)
66 CODE:
77 {
88 Newz(0, RETVAL, 1, struct ecb_struct);
1111 RETVAL->padlen = 0;
1212 RETVAL->direction = 0;
1313 RETVAL->cipher_rounds = rounds;
14 RETVAL->cipher_id = find_cipher(cipher_name);
14 RETVAL->cipher_id = _find_cipher(cipher_name);
1515 if (RETVAL->cipher_id == -1) {
1616 Safefree(RETVAL);
1717 croak("FATAL: find_cipfer failed for '%s'", cipher_name);
22 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
33
44 Crypt::Mode::OFB
5 _new(char * cipher_name, int rounds=0)
5 new(char * class, char * cipher_name, int rounds=0)
66 CODE:
77 {
88 Newz(0, RETVAL, 1, struct ofb_struct);
99 if (!RETVAL) croak("FATAL: Newz failed");
1010 RETVAL->direction = 0;
1111 RETVAL->cipher_rounds = rounds;
12 RETVAL->cipher_id = find_cipher(cipher_name);
12 RETVAL->cipher_id = _find_cipher(cipher_name);
1313 if (RETVAL->cipher_id == -1) {
1414 Safefree(RETVAL);
1515 croak("FATAL: find_cipfer failed for '%s'", cipher_name);
271271
272272 data_ptr = (unsigned char *)SvPVbyte(data, data_len);
273273
274 hash_id = find_hash(hash_name);
274 hash_id = _find_hash(hash_name);
275275 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
276276 rv = dsa_encrypt_key(data_ptr, (unsigned long)data_len, buffer, &buffer_len,
277277 &self->pstate, self->pindex,
288288
289289 data_ptr = (unsigned char *)SvPVbyte(data, data_len);
290290
291 hash_id = find_hash(hash_name);
291 hash_id = _find_hash(hash_name);
292292 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
293293 rv = ecc_encrypt_key(data_ptr, (unsigned long)data_len, buffer, &buffer_len,
294294 &self->pstate, self->pindex,
307307
308308 RETVAL = newSVpvn(NULL, 0); /* undef */
309309 if (strnEQ(padding, "oaep", 4)) {
310 hash_id = find_hash(oaep_hash);
310 hash_id = _find_hash(oaep_hash);
311311 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", oaep_hash);
312312 lparam_ptr = (unsigned char *)SvPVbyte(oaep_lparam, lparam_len);
313313 rv = rsa_encrypt_key_ex(data_ptr, (unsigned long)data_len, buffer, &buffer_len, lparam_ptr, (unsigned long)lparam_len,
352352
353353 RETVAL = newSVpvn(NULL, 0); /* undef */
354354 if (strnEQ(padding, "oaep", 4)) {
355 hash_id = find_hash(oaep_hash);
355 hash_id = _find_hash(oaep_hash);
356356 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", oaep_hash);
357357 lparam_ptr = (unsigned char *)SvPVbyte(oaep_lparam, lparam_len);
358358 rv = rsa_decrypt_key_ex(data_ptr, (unsigned long)data_len, buffer, &buffer_len, lparam_ptr, (unsigned long)lparam_len,
395395
396396 RETVAL = newSVpvn(NULL, 0); /* undef */
397397 if (strnEQ(padding, "pss", 3)) {
398 hash_id = find_hash(hash_name);
398 hash_id = _find_hash(hash_name);
399399 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
400400 rv = rsa_sign_hash_ex(data_ptr, (unsigned long)data_len, buffer, &buffer_len, LTC_PKCS_1_PSS,
401401 &self->pstate, self->pindex,
404404 RETVAL = newSVpvn((char*)buffer, buffer_len);
405405 }
406406 else if (strnEQ(padding, "v1.5", 4)) {
407 hash_id = find_hash(hash_name);
407 hash_id = _find_hash(hash_name);
408408 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
409409 rv = rsa_sign_hash_ex(data_ptr, (unsigned long)data_len, buffer, &buffer_len, LTC_PKCS_1_V1_5,
410410 &self->pstate, self->pindex,
443443 RETVAL = 1;
444444 stat = 0;
445445 if (strnEQ(padding, "pss", 3)) {
446 hash_id = find_hash(hash_name);
446 hash_id = _find_hash(hash_name);
447447 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
448448 rv = rsa_verify_hash_ex(sig_ptr, (unsigned long)sig_len, data_ptr, (unsigned long)data_len, LTC_PKCS_1_PSS,
449449 hash_id, saltlen, &stat, &self->key);
450450 if (rv != CRYPT_OK || stat != 1) RETVAL = 0;
451451 }
452452 else if (strnEQ(padding, "v1.5", 4)) {
453 hash_id = find_hash(hash_name);
453 hash_id = _find_hash(hash_name);
454454 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
455455 rv = rsa_verify_hash_ex(sig_ptr, (unsigned long)sig_len, data_ptr, (unsigned long)data_len, LTC_PKCS_1_V1_5,
456456 hash_id, 0, &stat, &self->key);
1212 $Carp::Internal{(__PACKAGE__)}++;
1313 use CryptX;
1414 use Crypt::Cipher;
15
16 sub new {
17 my $class = shift;
18 local $SIG{__DIE__} = \&CryptX::_croak;
19 return _new(Crypt::Cipher::_trans_cipher_name(shift), @_);
20 }
2115
2216 sub ccm_encrypt_authenticate {
2317 my $cipher_name = shift;
1111 use Carp;
1212 $Carp::Internal{(__PACKAGE__)}++;
1313 use CryptX;
14
15 sub new {
16 my $class = shift;
17 local $SIG{__DIE__} = \&CryptX::_croak;
18 return _new(@_);
19 }
2014
2115 sub chacha20poly1305_encrypt_authenticate {
2216 my $key = shift;
1414 use Crypt::Cipher;
1515
1616 ### the following methods/functions are implemented in XS:
17 # - _new
17 # - new
1818 # - DESTROY
1919 # - clone
2020 # - encrypt_add
2222 # - decrypt_add
2323 # - decrypt_done
2424 # - adata_add
25
26 sub new {
27 my $class = shift;
28 local $SIG{__DIE__} = \&CryptX::_croak;
29 return _new(Crypt::Cipher::_trans_cipher_name(shift), @_);
30 }
3125
3226 sub eax_encrypt_authenticate {
3327 my $cipher_name = shift;
1212 $Carp::Internal{(__PACKAGE__)}++;
1313 use CryptX;
1414 use Crypt::Cipher;
15
16 sub new {
17 my ($class, $cipher, $key, $iv) = @_;
18 local $SIG{__DIE__} = \&CryptX::_croak;
19 my $self = _new(Crypt::Cipher::_trans_cipher_name($cipher), $key);
20 # for backwards compatibility the $iv is optional
21 $self->iv_add($iv) if defined $iv;
22 return $self;
23 }
2415
2516 sub gcm_encrypt_authenticate {
2617 my $cipher_name = shift;
1212 $Carp::Internal{(__PACKAGE__)}++;
1313 use CryptX;
1414 use Crypt::Cipher;
15
16 sub new {
17 my $class = shift;
18 local $SIG{__DIE__} = \&CryptX::_croak;
19 return _new(Crypt::Cipher::_trans_cipher_name(shift), @_);
20 }
2115
2216 sub ocb_encrypt_authenticate {
2317 my $cipher_name = shift;
88 use CryptX;
99
1010 ### the following methods/functions are implemented in XS:
11 # - _new
11 # - new
1212 # - DESTROY
13 # - _keysize
14 # - _max_keysize
15 # - _min_keysize
16 # - _blocksize
17 # - _default_rounds
13 # - blocksize
14 # - decrypt
15 # - default_rounds
1816 # - encrypt
19 # - decrypt
20 #functions, not methods:
21 # - _block_length_by_name
22 # - _min_key_length_by_name
23 # - _max_key_length_by_name
24 # - _default_rounds_by_name
17 # - max_keysize
18 # - min_keysize
2519
26 sub _trans_cipher_name {
27 my $name = shift || "";
28 my %trans = (
29 DES_EDE => '3des',
30 SAFERP => 'safer+',
31 SAFER_K128 => 'safer-k128',
32 SAFER_K64 => 'safer-k64',
33 SAFER_SK128 => 'safer-sk128',
34 SAFER_SK64 => 'safer-sk64',
35 );
36 $name =~ s/^Crypt::Cipher:://;
37 return $trans{uc($name)} if defined $trans{uc($name)};
38 return lc($name);
39 }
40
41 ### METHODS
42
43 sub new {
44 my $pkg = shift;
45 my $cipher_name = $pkg eq __PACKAGE__ ? _trans_cipher_name(shift) : _trans_cipher_name($pkg);
46 local $SIG{__DIE__} = \&CryptX::_croak;
47 return _new($cipher_name, @_);
48 }
49
50 sub blocksize {
51 my $self = shift;
52 return $self->_blocksize if ref($self);
53 $self = _trans_cipher_name(shift) if $self eq __PACKAGE__;
54 local $SIG{__DIE__} = \&CryptX::_croak;
55 return _block_length_by_name(_trans_cipher_name($self));
56 }
57
58 sub max_keysize
59 {
60 my $self = shift;
61 return unless defined $self;
62 return $self->_max_keysize if ref($self);
63 $self = _trans_cipher_name(shift) if $self eq __PACKAGE__;
64 local $SIG{__DIE__} = \&CryptX::_croak;
65 return _max_key_length_by_name(_trans_cipher_name($self));
66 }
67
68 sub min_keysize {
69 my $self = shift;
70 return unless defined $self;
71 return $self->_min_keysize if ref($self);
72 $self = _trans_cipher_name(shift) if $self eq __PACKAGE__;
73 local $SIG{__DIE__} = \&CryptX::_croak;
74 return _min_key_length_by_name(_trans_cipher_name($self));
75 }
76
77 sub keysize {
78 goto &max_keysize;
79 }
80
81 sub default_rounds {
82 my $self = shift;
83 return unless defined $self;
84 return $self->_default_rounds if ref($self);
85 $self = _trans_cipher_name(shift) if $self eq __PACKAGE__;
86 local $SIG{__DIE__} = \&CryptX::_croak;
87 return _default_rounds_by_name(_trans_cipher_name($self));
88 }
20 sub keysize { goto \&max_keysize; } # for Crypt::CBC compatibility
8921
9022 sub CLONE_SKIP { 1 } # prevent cloning
9123
66 use Carp;
77 $Carp::Internal{(__PACKAGE__)}++;
88 use CryptX;
9
10 sub new { my $class = shift; _new(@_) }
119
1210 sub addfile {
1311 my ($self, $file) = @_;
1313 use CryptX;
1414
1515 ### the following methods/functions are implemented in XS:
16 # - _new
17 # - _hashsize
18 # - _hashsize_by_name (function, not method)
16 # - new
17 # - hashsize
1918 # - clone
2019 # - reset
2120 # - digest
2221 # - hexdigest
2322 # - b64digest
2423 # - add
24 # - digest_data
25 # - digest_data_hex
26 # - digest_data_b64
27 # - digest_data_b64u
2528 # - DESTROY
2629
27 sub _trans_digest_name {
28 my $name = shift || "";
29 my %trans = (
30 CHAES => 'chc_hash',
31 RIPEMD128 => 'rmd128',
32 RIPEMD160 => 'rmd160',
33 RIPEMD256 => 'rmd256',
34 RIPEMD320 => 'rmd320',
35 TIGER192 => 'tiger',
36 SHA512_224 => 'sha512-224',
37 SHA512_256 => 'sha512-256',
38 SHA3_224 => 'sha3-224',
39 SHA3_256 => 'sha3-256',
40 SHA3_384 => 'sha3-384',
41 SHA3_512 => 'sha3-512',
42 BLAKE2B_160 => 'blake2b-160',
43 BLAKE2B_256 => 'blake2b-256',
44 BLAKE2B_384 => 'blake2b-384',
45 BLAKE2B_512 => 'blake2b-512',
46 BLAKE2S_128 => 'blake2s-128',
47 BLAKE2S_160 => 'blake2s-160',
48 BLAKE2S_224 => 'blake2s-224',
49 BLAKE2S_256 => 'blake2s-256',
50 );
51 $name =~ s/^Crypt::Digest:://i;
52 return $trans{uc($name)} if defined $trans{uc($name)};
53 return lc($name);
54 }
55
5630 ### METHODS
57
58 sub new {
59 my $pkg = shift;
60 unshift @_, ($pkg eq 'Crypt::Digest' ? _trans_digest_name(shift) : _trans_digest_name($pkg));
61 local $SIG{__DIE__} = \&CryptX::_croak;
62 return _new(@_);
63 }
64
65 sub hashsize {
66 return unless defined $_[0];
67
68 if (ref $_[0]) {
69 local $SIG{__DIE__} = \&CryptX::_croak;
70 return _hashsize(@_);
71 }
72 else {
73 my $pkg = shift;
74 unshift @_, ($pkg eq 'Crypt::Digest' ? _trans_digest_name(shift) : _trans_digest_name($pkg));
75 local $SIG{__DIE__} = \&CryptX::_croak;
76 return _hashsize_by_name(@_);
77 }
78 }
7931
8032 sub addfile {
8133 my ($self, $file) = @_;
10355 sub CLONE_SKIP { 1 } # prevent cloning
10456
10557 ### FUNCTIONS
106
107 sub digest_data { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Digest->new(shift)->add(@_)->digest }
108 sub digest_data_hex { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Digest->new(shift)->add(@_)->hexdigest }
109 sub digest_data_b64 { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Digest->new(shift)->add(@_)->b64digest }
110 sub digest_data_b64u { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Digest->new(shift)->add(@_)->b64udigest }
11158
11259 sub digest_file { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Digest->new(shift)->addfile(@_)->digest }
11360 sub digest_file_hex { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Digest->new(shift)->addfile(@_)->hexdigest }
191138 Logically joins all arguments into a single string, and returns its SHA1 digest encoded as a binary string.
192139
193140 $digest_raw = digest_data('SHA1', 'data string');
194 #or
195 $digest_raw = digest_data('SHA1', 'any data', 'more data', 'even more data');
196141
197142 =head2 digest_data_hex
198143
199144 Logically joins all arguments into a single string, and returns its SHA1 digest encoded as a hexadecimal string.
200145
201146 $digest_hex = digest_data_hex('SHA1', 'data string');
202 #or
203 $digest_hex = digest_data_hex('SHA1', 'any data', 'more data', 'even more data');
204147
205148 =head2 digest_data_b64
206149
207150 Logically joins all arguments into a single string, and returns its SHA1 digest encoded as a Base64 string, B<with> trailing '=' padding.
208151
209152 $digest_b64 = digest_data_b64('SHA1', 'data string');
210 #or
211 $digest_b64 = digest_data_b64('SHA1', 'any data', 'more data', 'even more data');
212153
213154 =head2 digest_data_b64u
214155
215156 Logically joins all arguments into a single string, and returns its SHA1 digest encoded as a Base64 URL Safe string (see RFC 4648 section 5).
216157
217158 $digest_b64url = digest_data_b64u('SHA1', 'data string');
218 #or
219 $digest_b64url = digest_data_b64u('SHA1', 'any data', 'more data', 'even more data');
220159
221160 =head2 digest_file
222161
1616 sub pbkdf1 {
1717 my ($password, $salt, $iteration_count, $hash_name, $len) = @_;
1818 $iteration_count ||= 5000;
19 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA256');
19 $hash_name ||= 'SHA256';
2020 $len ||= 32;
2121 local $SIG{__DIE__} = \&CryptX::_croak;
2222 return _pkcs_5_alg1($password, $salt, $iteration_count, $hash_name, $len);
2525 sub pbkdf2 {
2626 my ($password, $salt, $iteration_count, $hash_name, $len) = @_;
2727 $iteration_count ||= 5000;
28 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA256');
28 $hash_name ||= 'SHA256';
2929 $len ||= 32;
3030 local $SIG{__DIE__} = \&CryptX::_croak;
3131 return _pkcs_5_alg2($password, $salt, $iteration_count, $hash_name, $len);
3535 # RFC: HKDF-Extract(salt, IKM, [Hash]) -> PRK
3636 #my ($hash_name, $salt, $keying_material) = @_;
3737 my ($keying_material, $salt, $hash_name) = @_;
38 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA256');
38 $hash_name ||= 'SHA256';
3939 $salt = pack("H*", "00" x Crypt::Digest->hashsize($hash_name)) unless defined $salt; # according to rfc5869 defaults to HashLen zero octets
4040 local $SIG{__DIE__} = \&CryptX::_croak;
4141 return _hkdf_extract($hash_name, $salt, $keying_material);
4747 my ($keying_material, $hash_name, $len, $info) = @_;
4848 $len ||= 32;
4949 $info ||= '';
50 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA256');
50 $hash_name ||= 'SHA256';
5151 local $SIG{__DIE__} = \&CryptX::_croak;
5252 return _hkdf_expand($hash_name, $info, $keying_material, $len);
5353 }
5757 my ($keying_material, $salt, $hash_name, $len, $info) = @_;
5858 $len ||= 32;
5959 $info ||= '';
60 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA256');
60 $hash_name ||= 'SHA256';
6161 $salt = pack("H*", "00" x Crypt::Digest->hashsize($hash_name)) unless defined $salt; # according to rfc5869 defaults to HashLen zero octets
6262 local $SIG{__DIE__} = \&CryptX::_croak;
6363 return _hkdf($hash_name, $salt, $info, $keying_material, $len);
1111 our @EXPORT = qw();
1212
1313 use CryptX;
14 sub new { my $class = shift; _new(@_) }
1514 sub blake2b { Crypt::Mac::BLAKE2b->new(shift, shift)->add(@_)->mac }
1615 sub blake2b_hex { Crypt::Mac::BLAKE2b->new(shift, shift)->add(@_)->hexmac }
1716 sub blake2b_b64 { Crypt::Mac::BLAKE2b->new(shift, shift)->add(@_)->b64mac }
1111 our @EXPORT = qw();
1212
1313 use CryptX;
14 sub new { my $class = shift; _new(@_) }
1514 sub blake2s { Crypt::Mac::BLAKE2s->new(shift, shift)->add(@_)->mac }
1615 sub blake2s_hex { Crypt::Mac::BLAKE2s->new(shift, shift)->add(@_)->hexmac }
1716 sub blake2s_b64 { Crypt::Mac::BLAKE2s->new(shift, shift)->add(@_)->b64mac }
1111 our @EXPORT = qw();
1212
1313 use CryptX;
14 use Crypt::Cipher;
15
16 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
1714 sub f9 { Crypt::Mac::F9->new(shift, shift)->add(@_)->mac }
1815 sub f9_hex { Crypt::Mac::F9->new(shift, shift)->add(@_)->hexmac }
1916 sub f9_b64 { Crypt::Mac::F9->new(shift, shift)->add(@_)->b64mac }
1111 our @EXPORT = qw();
1212
1313 use CryptX;
14 use Crypt::Digest;
15
16 sub new { my $class = shift; _new(Crypt::Digest::_trans_digest_name(shift), @_) }
1714 sub hmac { Crypt::Mac::HMAC->new(shift, shift)->add(@_)->mac }
1815 sub hmac_hex { Crypt::Mac::HMAC->new(shift, shift)->add(@_)->hexmac }
1916 sub hmac_b64 { Crypt::Mac::HMAC->new(shift, shift)->add(@_)->b64mac }
1111 our @EXPORT = qw();
1212
1313 use CryptX;
14 use Crypt::Cipher;
15
16 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
1714 sub omac { Crypt::Mac::OMAC->new(shift, shift)->add(@_)->mac }
1815 sub omac_hex { Crypt::Mac::OMAC->new(shift, shift)->add(@_)->hexmac }
1916 sub omac_b64 { Crypt::Mac::OMAC->new(shift, shift)->add(@_)->b64mac }
1111 our @EXPORT = qw();
1212
1313 use CryptX;
14 use Crypt::Cipher;
15
16 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
1714 sub pmac { Crypt::Mac::PMAC->new(shift, shift)->add(@_)->mac }
1815 sub pmac_hex { Crypt::Mac::PMAC->new(shift, shift)->add(@_)->hexmac }
1916 sub pmac_b64 { Crypt::Mac::PMAC->new(shift, shift)->add(@_)->b64mac }
1111 our @EXPORT = qw();
1212
1313 use CryptX;
14 sub new { my $class = shift; _new(@_) }
1514 sub pelican { Crypt::Mac::Pelican->new(shift)->add(@_)->mac }
1615 sub pelican_hex { Crypt::Mac::Pelican->new(shift)->add(@_)->hexmac }
1716 sub pelican_b64 { Crypt::Mac::Pelican->new(shift)->add(@_)->b64mac }
1111 our @EXPORT = qw();
1212
1313 use CryptX;
14 sub new { my $class = shift; _new(@_) }
1514 sub poly1305 { Crypt::Mac::Poly1305->new(shift)->add(@_)->mac }
1615 sub poly1305_hex { Crypt::Mac::Poly1305->new(shift)->add(@_)->hexmac }
1716 sub poly1305_b64 { Crypt::Mac::Poly1305->new(shift)->add(@_)->b64mac }
1111 our @EXPORT = qw();
1212
1313 use CryptX;
14 use Crypt::Cipher;
15
16 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
1714 sub xcbc { Crypt::Mac::XCBC->new(shift, shift)->add(@_)->mac }
1815 sub xcbc_hex { Crypt::Mac::XCBC->new(shift, shift)->add(@_)->hexmac }
1916 sub xcbc_b64 { Crypt::Mac::XCBC->new(shift, shift)->add(@_)->b64mac }
77
88 use Crypt::Cipher;
99 use base 'Crypt::Mode';
10
11 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
1210
1311 1;
1412
77
88 use Crypt::Cipher;
99 use base 'Crypt::Mode';
10
11 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
1210
1311 1;
1412
77
88 use Crypt::Cipher;
99 use base 'Crypt::Mode';
10
11 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
1210
1311 1;
1412
77
88 use Crypt::Cipher;
99 use base 'Crypt::Mode';
10
11 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
1210
1311 1;
1412
77
88 use Crypt::Cipher;
99 use base 'Crypt::Mode';
10
11 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
1210
1311 1;
1412
9797
9898 sub encrypt {
9999 my ($self, $data, $hash_name) = @_;
100 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
100 $hash_name ||= 'SHA1';
101101 return $self->_encrypt($data, $hash_name);
102102 }
103103
569569
570570 sub encrypt {
571571 my ($self, $data, $hash_name) = @_;
572 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
572 $hash_name ||= 'SHA1';
573573 return $self->_encrypt($data, $hash_name);
574574 }
575575
168168 my ($self, $data, $padding, $hash_name, $lparam) = @_;
169169 $lparam ||= '';
170170 $padding ||= 'oaep';
171 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
171 $hash_name ||= 'SHA1';
172172
173173 return $self->_encrypt($data, $padding, $hash_name, $lparam);
174174 }
177177 my ($self, $data, $padding, $hash_name, $lparam) = @_;
178178 $lparam ||= '';
179179 $padding ||= 'oaep';
180 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
180 $hash_name ||= 'SHA1';
181181
182182 return $self->_decrypt($data, $padding, $hash_name, $lparam);
183183 }
186186 my ($self, $data, $hash_name, $padding, $saltlen) = @_;
187187 $saltlen ||= 12;
188188 $padding ||= 'pss';
189 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
189 $hash_name ||= 'SHA1';
190190
191191 return $self->_sign($data, $padding, $hash_name, $saltlen);
192192 }
195195 my ($self, $data, $hash_name, $padding, $saltlen) = @_;
196196 $saltlen ||= 12;
197197 $padding ||= 'pss';
198 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
198 $hash_name ||= 'SHA1';
199199
200200 return $self->_sign(digest_data($hash_name, $data), $padding, $hash_name, $saltlen);
201201 }
204204 my ($self, $sig, $data, $hash_name, $padding, $saltlen) = @_;
205205 $saltlen ||= 12;
206206 $padding ||= 'pss';
207 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
207 $hash_name ||= 'SHA1';
208208
209209 return $self->_verify($sig, $data, $padding, $hash_name, $saltlen);
210210 }
213213 my ($self, $sig, $data, $hash_name, $padding, $saltlen) = @_;
214214 $saltlen ||= 12;
215215 $padding ||= 'pss';
216 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
216 $hash_name ||= 'SHA1';
217217
218218 return $self->_verify($sig, digest_data($hash_name, $data), $padding, $hash_name, $saltlen);
219219 }