Codebase list libcryptx-perl / 5d507df
xs tuning Karel Miko 6 years ago
19 changed file(s) with 324 addition(s) and 192 deletion(s). Raw diff Collapse all Expand all
335335 STRLEN in_len;
336336 unsigned long out_len;
337337 unsigned char *out_data, *in_data;
338 int rv;
339338
340339 if (!SvPOK(in)) XSRETURN_UNDEF;
341340 in_data = (unsigned char *) SvPVbyte(in, in_len);
342 out_len = (unsigned long)(4 * ((in_len + 2) / 3) + 1);
343 Newz(0, out_data, out_len, unsigned char);
344 if (!out_data) croak("FATAL: Newz failed [%ld]", out_len);
345 rv = base64url_encode(in_data, (unsigned long)in_len, out_data, &out_len);
346 RETVAL = (rv == CRYPT_OK) ? newSVpvn((char *)out_data, out_len) : newSVpvn(NULL, 0);
347 Safefree(out_data);
341 if (in_len == 0) {
342 RETVAL = newSVpvn("", 0);
343 }
344 else {
345 out_len = (unsigned long)(4 * ((in_len + 2) / 3) + 1);
346 RETVAL = NEWSV(0, out_len);
347 SvPOK_only(RETVAL);
348 out_data = (unsigned char *)SvPVX(RETVAL);
349 if (base64url_encode(in_data, (unsigned long)in_len, out_data, &out_len) != CRYPT_OK) {
350 SvREFCNT_dec(RETVAL);
351 XSRETURN_UNDEF;
352 }
353 SvCUR_set(RETVAL, out_len);
354 }
348355 }
349356 OUTPUT:
350357 RETVAL
356363 STRLEN in_len;
357364 unsigned long out_len;
358365 unsigned char *out_data, *in_data;
359 int rv;
360366
361367 if (!SvPOK(in)) XSRETURN_UNDEF;
362368 in_data = (unsigned char *) SvPVbyte(in, in_len);
363 out_len = (unsigned long)in_len;
364 Newz(0, out_data, out_len, unsigned char);
365 if (!out_data) croak("FATAL: Newz failed [%ld]", out_len);
366 rv = base64url_decode(in_data, (unsigned long)in_len, out_data, &out_len);
367 RETVAL = (rv == CRYPT_OK) ? newSVpvn((char *)out_data, out_len) : newSVpvn(NULL, 0);
368 Safefree(out_data);
369 if (in_len == 0) {
370 RETVAL = newSVpvn("", 0);
371 }
372 else {
373 out_len = (unsigned long)in_len;
374 RETVAL = NEWSV(0, out_len);
375 SvPOK_only(RETVAL);
376 out_data = (unsigned char *)SvPVX(RETVAL);
377 if (base64url_decode(in_data, (unsigned long)in_len, out_data, &out_len) != CRYPT_OK) {
378 SvREFCNT_dec(RETVAL);
379 XSRETURN_UNDEF;
380 }
381 SvCUR_set(RETVAL, out_len);
382 }
369383 }
370384 OUTPUT:
371385 RETVAL
377391 STRLEN in_len;
378392 unsigned long out_len;
379393 unsigned char *out_data, *in_data;
380 int rv;
381394
382395 if (!SvPOK(in)) XSRETURN_UNDEF;
383396 in_data = (unsigned char *) SvPVbyte(in, in_len);
384 out_len = (unsigned long)(4 * ((in_len + 2) / 3) + 1);
385 Newz(0, out_data, out_len, unsigned char);
386 if (!out_data) croak("FATAL: Newz failed [%ld]", out_len);
387 rv = base64_encode(in_data, (unsigned long)in_len, out_data, &out_len);
388 RETVAL = (rv == CRYPT_OK) ? newSVpvn((char *)out_data, out_len) : newSVpvn(NULL, 0);
389 Safefree(out_data);
397 if (in_len == 0) {
398 RETVAL = newSVpvn("", 0);
399 }
400 else {
401 out_len = (unsigned long)(4 * ((in_len + 2) / 3) + 1);
402 RETVAL = NEWSV(0, out_len);
403 SvPOK_only(RETVAL);
404 out_data = (unsigned char *)SvPVX(RETVAL);
405 if (base64_encode(in_data, (unsigned long)in_len, out_data, &out_len) != CRYPT_OK) {
406 SvREFCNT_dec(RETVAL);
407 XSRETURN_UNDEF;
408 }
409 SvCUR_set(RETVAL, out_len);
410 }
390411 }
391412 OUTPUT:
392413 RETVAL
398419 STRLEN in_len;
399420 unsigned long out_len;
400421 unsigned char *out_data, *in_data;
401 int rv;
402422
403423 if (!SvPOK(in)) XSRETURN_UNDEF;
404 in_data = (unsigned char *) SvPVbyte(in, in_len);
405 out_len = (unsigned long)in_len;
406 Newz(0, out_data, out_len, unsigned char);
407 if (!out_data) croak("FATAL: Newz failed [%ld]", out_len);
408 rv = base64_decode(in_data, (unsigned long)in_len, out_data, &out_len);
409 RETVAL = (rv == CRYPT_OK) ? newSVpvn((char *)out_data, out_len) : newSVpvn(NULL, 0);
410 Safefree(out_data);
424 in_data = (unsigned char *)SvPVbyte(in, in_len);
425 if (in_len == 0) {
426 RETVAL = newSVpvn("", 0);
427 }
428 else {
429 out_len = (unsigned long)in_len;
430 RETVAL = NEWSV(0, out_len);
431 SvPOK_only(RETVAL);
432 out_data = (unsigned char *)SvPVX(RETVAL);
433 if (base64_decode(in_data, (unsigned long)in_len, out_data, &out_len) != CRYPT_OK) {
434 SvREFCNT_dec(RETVAL);
435 XSRETURN_UNDEF;
436 }
437 SvCUR_set(RETVAL, out_len);
438 }
411439 }
412440 OUTPUT:
413441 RETVAL
419447 STRLEN in_len;
420448 unsigned long out_len;
421449 unsigned char *out_data, *in_data;
422 int rv, id = -1;
450 int id = -1;
423451
424452 if (!SvPOK(in)) XSRETURN_UNDEF;
425453 if (idx == 0) id = BASE32_RFC4648;
428456 if (idx == 3) id = BASE32_CROCKFORD;
429457 if (id == -1) XSRETURN_UNDEF;
430458 in_data = (unsigned char *) SvPVbyte(in, in_len);
431 out_len = (unsigned long)((8 * in_len + 4) / 5);
432 Newz(0, out_data, out_len, unsigned char);
433 if (!out_data) croak("FATAL: Newz failed [%ld]", out_len);
434 rv = base32_encode(in_data, (unsigned long)in_len, out_data, &out_len, id);
435 RETVAL = (rv == CRYPT_OK) ? newSVpvn((char *)out_data, out_len) : newSVpvn(NULL, 0);
436 Safefree(out_data);
459 if (in_len == 0) {
460 RETVAL = newSVpvn("", 0);
461 }
462 else {
463 out_len = (unsigned long)((8 * in_len + 4) / 5);
464 RETVAL = NEWSV(0, out_len);
465 SvPOK_only(RETVAL);
466 out_data = (unsigned char *)SvPVX(RETVAL);
467 if (base32_encode(in_data, (unsigned long)in_len, out_data, &out_len, id) != CRYPT_OK) {
468 SvREFCNT_dec(RETVAL);
469 XSRETURN_UNDEF;
470 }
471 SvCUR_set(RETVAL, out_len);
472 }
437473 }
438474 OUTPUT:
439475 RETVAL
445481 STRLEN in_len;
446482 unsigned long out_len;
447483 unsigned char *out_data, *in_data;
448 int rv, id = -1;
484 int id = -1;
449485
450486 if (!SvPOK(in)) XSRETURN_UNDEF;
451487 if (idx == 0) id = BASE32_RFC4648;
453489 if (idx == 2) id = BASE32_ZBASE32;
454490 if (idx == 3) id = BASE32_CROCKFORD;
455491 if (id == -1) XSRETURN_UNDEF;
456 in_data = (unsigned char *) SvPVbyte(in, in_len);
457 out_len = (unsigned long)in_len;
458 Newz(0, out_data, out_len, unsigned char);
459 if (!out_data) croak("FATAL: Newz failed [%ld]", out_len);
460 rv = base32_decode(in_data, (unsigned long)in_len, out_data, &out_len, id);
461 RETVAL = (rv == CRYPT_OK) ? newSVpvn((char *)out_data, out_len) : newSVpvn(NULL, 0);
462 Safefree(out_data);
492 in_data = (unsigned char *)SvPVbyte(in, in_len);
493 if (in_len == 0) {
494 RETVAL = newSVpvn("", 0);
495 }
496 else {
497 out_len = (unsigned long)in_len;
498 RETVAL = NEWSV(0, out_len);
499 SvPOK_only(RETVAL);
500 out_data = (unsigned char *)SvPVX(RETVAL);
501 if (base32_decode(in_data, (unsigned long)in_len, out_data, &out_len, id) != CRYPT_OK) {
502 SvREFCNT_dec(RETVAL);
503 XSRETURN_UNDEF;
504 }
505 SvCUR_set(RETVAL, out_len);
506 }
463507 }
464508 OUTPUT:
465509 RETVAL
472516 unsigned char *out_data, *in_data;
473517
474518 if (!SvPOK(in)) XSRETURN_UNDEF;
475 in_data = (unsigned char *) SvPVbyte(in, len);
519 in_data = (unsigned char *)SvPVbyte(in, len);
476520 if (len == 0) XSRETURN_UNDEF;
477521
478522 RETVAL = NEWSV(0, len);
479523 SvPOK_only(RETVAL);
480524 SvCUR_set(RETVAL, len);
481 out_data = (unsigned char *)SvPV_nolen(RETVAL);
525 out_data = (unsigned char *)SvPVX(RETVAL);
482526 Copy(in_data, out_data, len, unsigned char);
483527 while (i < len) {
484528 out_data[i]++;
485529 if (0 != out_data[i]) break;
486530 i++;
487531 }
488 if (i == len) croak("FATAL: increment_octets_le overflow");
532 if (i == len) {
533 SvREFCNT_dec(RETVAL);
534 croak("FATAL: increment_octets_le overflow");
535 }
489536 }
490537 OUTPUT:
491538 RETVAL
498545 unsigned char *out_data, *in_data;
499546
500547 if (!SvPOK(in)) XSRETURN_UNDEF;
501 in_data = (unsigned char *) SvPVbyte(in, len);
548 in_data = (unsigned char *)SvPVbyte(in, len);
502549 if (len == 0) XSRETURN_UNDEF;
503550
504551 RETVAL = NEWSV(0, len);
505552 SvPOK_only(RETVAL);
506553 SvCUR_set(RETVAL, len);
507 out_data = (unsigned char *)SvPV_nolen(RETVAL);
554 out_data = (unsigned char *)SvPVX(RETVAL);
508555 Copy(in_data, out_data, len, unsigned char);
509556 while (i < len) {
510557 out_data[len - 1 - i]++;
511558 if (0 != out_data[len - 1 - i]) break;
512559 i++;
513560 }
514 if (i == len) croak("FATAL: increment_octets_le overflow");
561 if (i == len) {
562 SvREFCNT_dec(RETVAL);
563 croak("FATAL: increment_octets_be overflow");
564 }
515565 }
516566 OUTPUT:
517567 RETVAL
533583 RETVAL = NEWSV(0, len);
534584 SvPOK_only(RETVAL);
535585 SvCUR_set(RETVAL, len);
536 out_data = (unsigned char *)SvPV_nolen(RETVAL);
586 out_data = (unsigned char *)SvPVX(RETVAL);
537587 mp_to_unsigned_bin(&mpi, out_data);
538588 mp_clear(&mpi);
539589 }
570620
571621 RETVAL = NEWSV(0, digits + 1);
572622 SvPOK_only(RETVAL);
573 out_data = SvPV_nolen(RETVAL);
623 out_data = SvPVX(RETVAL);
574624 mp_toradix(&mpi, out_data, radix);
575625 SvCUR_set(RETVAL, digits);
576626 mp_clear(&mpi);
9292 unsigned char *in_data, *out_data;
9393
9494 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
95 if (in_data_len==0) {
95 if (in_data_len == 0) {
9696 RETVAL = newSVpvn("", 0);
9797 }
9898 else {
9999 RETVAL = NEWSV(0, in_data_len);
100100 SvPOK_only(RETVAL);
101101 SvCUR_set(RETVAL, in_data_len);
102 out_data = (unsigned char *)SvPV_nolen(RETVAL);
102 out_data = (unsigned char *)SvPVX(RETVAL);
103103
104104 if (self->direction == 1) {
105105 rv = [%lc_name%]_encrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
106 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_encrypt failed: %s", error_to_string(rv));
106 if (rv != CRYPT_OK) {
107 SvREFCNT_dec(RETVAL);
108 croak("FATAL: [%lc_name%]_encrypt failed: %s", error_to_string(rv));
109 }
107110 }
108111 else if (self->direction == -1) {
109112 rv = [%lc_name%]_decrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
110 if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_decrypt failed: %s", error_to_string(rv));
113 if (rv != CRYPT_OK) {
114 SvREFCNT_dec(RETVAL);
115 croak("FATAL: [%lc_name%]_decrypt failed: %s", error_to_string(rv));
116 }
111117 }
112118 else {
119 SvREFCNT_dec(RETVAL);
113120 croak("FATAL: [%lc_name%]_crypt failed: call start_encrypt or start_decrypt first");
114121 }
115122 }
118118 RETVAL = NEWSV(0, i);
119119 SvPOK_only(RETVAL);
120120 SvCUR_set(RETVAL, i);
121 out_data = (unsigned char *)SvPV_nolen(RETVAL);
122
121 out_data = (unsigned char *)SvPVX(RETVAL);
123122 if (has_tmp_block) {
124123 Copy(tmp_block, out_data, blen, unsigned char);
125124 out_data += blen;
244243 RETVAL = NEWSV(0, i);
245244 SvPOK_only(RETVAL);
246245 SvCUR_set(RETVAL, i);
247 out_data = (unsigned char *)SvPV_nolen(RETVAL);
246 out_data = (unsigned char *)SvPVX(RETVAL);
248247 if (has_tmp_block) {
249248 Copy(tmp_block, out_data, blen, unsigned char);
250249 out_data += blen;
2828 if(tag_len<4 || tag_len>16) tag_len = 16;
2929
3030 rv = ccm_memory(id, k, (unsigned long)k_len, NULL, n, (unsigned long)n_len, h, (unsigned long)h_len,
31 pt, (unsigned long)pt_len, (unsigned char *)SvPV_nolen(ct), tag, &tag_len, CCM_ENCRYPT);
31 pt, (unsigned long)pt_len, (unsigned char *)SvPVX(ct), tag, &tag_len, CCM_ENCRYPT);
3232 if (rv != CRYPT_OK) croak("FATAL: ccm_memory failed: %s", error_to_string(rv));
3333
3434 XPUSHs(sv_2mortal(ct));
9595 unsigned char *in_data, *out_data;
9696
9797 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
98 if (in_data_len==0) {
98 if (in_data_len == 0) {
9999 RETVAL = newSVpvn("", 0);
100100 }
101101 else {
102102 RETVAL = NEWSV(0, in_data_len);
103103 SvPOK_only(RETVAL);
104104 SvCUR_set(RETVAL, in_data_len);
105 out_data = (unsigned char *)SvPV_nolen(RETVAL);
105 out_data = (unsigned char *)SvPVX(RETVAL);
106106 rv = chacha20poly1305_decrypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
107 if (rv != CRYPT_OK) croak("FATAL: chacha20poly1305_decrypt failed: %s", error_to_string(rv));
107 if (rv != CRYPT_OK) {
108 SvREFCNT_dec(RETVAL);
109 croak("FATAL: chacha20poly1305_decrypt failed: %s", error_to_string(rv));
110 }
108111 }
109112 }
110113 OUTPUT:
119122 unsigned char *in_data, *out_data;
120123
121124 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
122 if (in_data_len==0) {
125 if (in_data_len == 0) {
123126 RETVAL = newSVpvn("", 0);
124127 }
125128 else {
126129 RETVAL = NEWSV(0, in_data_len);
127130 SvPOK_only(RETVAL);
128131 SvCUR_set(RETVAL, in_data_len);
129 out_data = (unsigned char *)SvPV_nolen(RETVAL);
132 out_data = (unsigned char *)SvPVX(RETVAL);
130133 rv = chacha20poly1305_encrypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
131 if (rv != CRYPT_OK) croak("FATAL: chacha20poly1305_encrypt failed: %s", error_to_string(rv));
134 if (rv != CRYPT_OK) {
135 SvREFCNT_dec(RETVAL);
136 croak("FATAL: chacha20poly1305_encrypt failed: %s", error_to_string(rv));
137 }
132138 }
133139 }
134140 OUTPUT:
5656 unsigned char *in_data, *out_data;
5757
5858 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
59 if (in_data_len==0) {
59 if (in_data_len == 0) {
6060 RETVAL = newSVpvn("", 0);
6161 }
6262 else {
6363 RETVAL = NEWSV(0, in_data_len);
6464 SvPOK_only(RETVAL);
6565 SvCUR_set(RETVAL, in_data_len);
66 out_data = (unsigned char *)SvPV_nolen(RETVAL);
66 out_data = (unsigned char *)SvPVX(RETVAL);
6767 rv = eax_encrypt(&self->state, in_data, out_data, (unsigned long)in_data_len);
68 if (rv != CRYPT_OK) croak("FATAL: eax_encrypt failed: %s", error_to_string(rv));
68 if (rv != CRYPT_OK) {
69 SvREFCNT_dec(RETVAL);
70 croak("FATAL: eax_encrypt failed: %s", error_to_string(rv));
71 }
6972 }
7073 }
7174 OUTPUT:
8083 unsigned char *in_data, *out_data;
8184
8285 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
83 if (in_data_len==0) {
86 if (in_data_len == 0) {
8487 RETVAL = newSVpvn("", 0);
8588 }
8689 else {
8790 RETVAL = NEWSV(0, in_data_len);
8891 SvPOK_only(RETVAL);
8992 SvCUR_set(RETVAL, in_data_len);
90 out_data = (unsigned char *)SvPV_nolen(RETVAL);
93 out_data = (unsigned char *)SvPVX(RETVAL);
9194 rv = eax_decrypt(&self->state, in_data, out_data, (unsigned long)in_data_len);
92 if (rv != CRYPT_OK) croak("FATAL: eax_decrypt failed: %s", error_to_string(rv));
95 if (rv != CRYPT_OK) {
96 SvREFCNT_dec(RETVAL);
97 croak("FATAL: eax_decrypt failed: %s", error_to_string(rv));
98 }
9399 }
94100 }
95101 OUTPUT:
6464 unsigned char *in_data, *out_data;
6565
6666 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
67 if (in_data_len==0) {
67 if (in_data_len == 0) {
6868 RETVAL = newSVpvn("", 0);
6969 }
7070 else
7272 RETVAL = NEWSV(0, in_data_len);
7373 SvPOK_only(RETVAL);
7474 SvCUR_set(RETVAL, in_data_len);
75 out_data = (unsigned char *)SvPV_nolen(RETVAL);
75 out_data = (unsigned char *)SvPVX(RETVAL);
7676 rv = gcm_process(&self->state, in_data, (unsigned long)in_data_len, out_data, GCM_ENCRYPT);
77 if (rv != CRYPT_OK) croak("FATAL: encrypt_add/gcm_process failed: %s", error_to_string(rv));
77 if (rv != CRYPT_OK) {
78 SvREFCNT_dec(RETVAL);
79 croak("FATAL: encrypt_add/gcm_process failed: %s", error_to_string(rv));
80 }
7881 }
7982 }
8083 OUTPUT:
117120 unsigned char *in_data, *out_data;
118121
119122 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
120 if (in_data_len==0) {
123 if (in_data_len == 0) {
121124 RETVAL = newSVpvn("", 0);
122125 }
123126 else {
124127 RETVAL = NEWSV(0, in_data_len);
125128 SvPOK_only(RETVAL);
126129 SvCUR_set(RETVAL, in_data_len);
127 out_data = (unsigned char *)SvPV_nolen(RETVAL);
130 out_data = (unsigned char *)SvPVX(RETVAL);
128131 rv = gcm_process(&self->state, out_data, (unsigned long)in_data_len, in_data, GCM_DECRYPT);
129 if (rv != CRYPT_OK) croak("FATAL: encrypt_add/gcm_process failed: %s", error_to_string(rv));
132 if (rv != CRYPT_OK) {
133 SvREFCNT_dec(RETVAL);
134 croak("FATAL: encrypt_add/gcm_process failed: %s", error_to_string(rv));
135 }
130136 }
131137 }
132138 OUTPUT:
6767 unsigned char *in_data, *out_data;
6868
6969 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
70 if (in_data_len == 0) {
71 RETVAL = newSVpvn("", 0);
72 }
73 else {
74 if (in_data_len % (&self->state)->block_len) {
75 croak ("FATAL: sizeof(data) should be multiple of blocksize (%d)", (&self->state)->block_len);
76 }
77 RETVAL = NEWSV(0, in_data_len);
78 SvPOK_only(RETVAL);
79 SvCUR_set(RETVAL, in_data_len);
80 out_data = (unsigned char *)SvPVX(RETVAL);
81 rv = ocb3_encrypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
82 if (rv != CRYPT_OK) {
83 SvREFCNT_dec(RETVAL);
84 croak("FATAL: ocb3_encrypt failed: %s", error_to_string(rv));
85 }
86 }
87 }
88 OUTPUT:
89 RETVAL
90
91 SV *
92 encrypt_last(Crypt::AuthEnc::OCB self, SV * data)
93 CODE:
94 {
95 int rv;
96 STRLEN in_data_len;
97 unsigned char *in_data, *out_data;
98
99 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
100 if (in_data_len > 0) {
101 RETVAL = NEWSV(0, in_data_len);
102 SvPOK_only(RETVAL);
103 SvCUR_set(RETVAL, in_data_len);
104 out_data = (unsigned char *)SvPVX(RETVAL);
105 }
106 else {
107 RETVAL = newSVpvn("", 0);
108 out_data = NULL;
109 }
110 rv = ocb3_encrypt_last(&self->state, in_data, (unsigned long)in_data_len, out_data);
111 if (rv != CRYPT_OK) {
112 SvREFCNT_dec(RETVAL);
113 croak("FATAL: ocb3_encrypt_last failed: %s", error_to_string(rv));
114 }
115 }
116 OUTPUT:
117 RETVAL
118
119 SV *
120 decrypt_add(Crypt::AuthEnc::OCB self, SV * data)
121 CODE:
122 {
123 int rv;
124 STRLEN in_data_len;
125 unsigned char *in_data, *out_data;
126
127 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
70128 if (in_data_len==0) {
71129 RETVAL = newSVpvn("", 0);
72130 }
73131 else {
74 RETVAL = NEWSV(0, in_data_len);
75 SvPOK_only(RETVAL);
76 SvCUR_set(RETVAL, in_data_len);
77 out_data = (unsigned char *)SvPV_nolen(RETVAL);
78
79 if (in_data_len % (&self->state)->block_len)
132 if (in_data_len % (&self->state)->block_len) {
80133 croak ("FATAL: sizeof(data) should be multiple of blocksize (%d)", (&self->state)->block_len);
81
82 rv = ocb3_encrypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
83 if (rv != CRYPT_OK) croak("FATAL: ocb3_encrypt failed: %s", error_to_string(rv));
84 }
85 }
86 OUTPUT:
87 RETVAL
88
89 SV *
90 encrypt_last(Crypt::AuthEnc::OCB self, SV * data)
91 CODE:
92 {
93 int rv;
94 STRLEN in_data_len;
95 unsigned char *in_data, *out_data;
96
97 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
98 if (in_data_len>0) {
99 RETVAL = NEWSV(0, in_data_len);
100 SvPOK_only(RETVAL);
101 SvCUR_set(RETVAL, in_data_len);
102 out_data = (unsigned char *)SvPV_nolen(RETVAL);
103 }
104 else {
105 RETVAL = newSVpvn("", 0);
106 out_data = NULL;
107 }
108 rv = ocb3_encrypt_last(&self->state, in_data, (unsigned long)in_data_len, out_data);
109 if (rv != CRYPT_OK) croak("FATAL: ocb3_encrypt_last failed: %s", error_to_string(rv));
110 }
111 OUTPUT:
112 RETVAL
113
114 SV *
115 decrypt_add(Crypt::AuthEnc::OCB self, SV * data)
116 CODE:
117 {
118 int rv;
119 STRLEN in_data_len;
120 unsigned char *in_data, *out_data;
121
122 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
123 if (in_data_len==0) {
124 RETVAL = newSVpvn("", 0);
125 }
126 else {
127 RETVAL = NEWSV(0, in_data_len);
128 SvPOK_only(RETVAL);
129 SvCUR_set(RETVAL, in_data_len);
130 out_data = (unsigned char *)SvPV_nolen(RETVAL);
131
132 if (in_data_len % (&self->state)->block_len)
133 croak ("FATAL: sizeof(data) should be multiple of blocksize (%d)", (&self->state)->block_len);
134
134 }
135 RETVAL = NEWSV(0, in_data_len);
136 SvPOK_only(RETVAL);
137 SvCUR_set(RETVAL, in_data_len);
138 out_data = (unsigned char *)SvPVX(RETVAL);
135139 rv = ocb3_decrypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
136 if (rv != CRYPT_OK) croak("FATAL: ocb3_decrypt failed: %s", error_to_string(rv));
140 if (rv != CRYPT_OK) {
141 SvREFCNT_dec(RETVAL);
142 croak("FATAL: ocb3_decrypt failed: %s", error_to_string(rv));
143 }
137144 }
138145 }
139146 OUTPUT:
148155 unsigned char *in_data, *out_data;
149156
150157 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
151 if (in_data_len>0) {
152 RETVAL = NEWSV(0, in_data_len);
153 SvPOK_only(RETVAL);
154 SvCUR_set(RETVAL, in_data_len);
155 out_data = (unsigned char *)SvPV_nolen(RETVAL);
158 if (in_data_len > 0) {
159 RETVAL = NEWSV(0, in_data_len);
160 SvPOK_only(RETVAL);
161 SvCUR_set(RETVAL, in_data_len);
162 out_data = (unsigned char *)SvPVX(RETVAL);
156163 }
157164 else {
158165 RETVAL = newSVpvn("", 0);
7676 STRLEN len;
7777 void *plaintext = SvPVbyte(data, len);
7878
79 if (len==0)
79 if (len == 0) {
8080 RETVAL = newSVpvn("", 0);
81 else if (len % self->desc->block_length)
82 croak ("FATAL: sizeof(data) should be multiple of blocksize (%d)", self->desc->block_length);
83 else {
84 /* idea from Crypt::Rijndael */
81 }
82 else if (len == self->desc->block_length) {
8583 RETVAL = NEWSV(0, len);
8684 SvPOK_only(RETVAL);
8785 SvCUR_set(RETVAL, len);
88 rv = self->desc->ecb_encrypt((unsigned char *)plaintext, (unsigned char *)SvPV_nolen(RETVAL), &self->skey);
89 if (rv!=CRYPT_OK) croak("FATAL: encrypt failed: %s", error_to_string(rv));
86 rv = self->desc->ecb_encrypt((unsigned char *)plaintext, (unsigned char *)SvPVX(RETVAL), &self->skey);
87 if (rv!=CRYPT_OK) {
88 SvREFCNT_dec(RETVAL);
89 croak("FATAL: encrypt failed: %s", error_to_string(rv));
90 }
91 }
92 else {
93 croak ("FATAL: input size not equal to blocksize (%d)", self->desc->block_length);
9094 }
9195 }
9296 OUTPUT:
102106 STRLEN len;
103107 void *ciphertext = SvPVbyte(data, len);
104108
105 if (len==0)
109 if (len == 0) {
106110 RETVAL = newSVpvn("", 0);
107 else if (len % self->desc->block_length)
108 croak ("FATAL: sizeof(data) should be multiple of blocksize (%d)", self->desc->block_length);
109 else {
110 /* idea from Crypt::Rijndael */
111 }
112 else if (len == self->desc->block_length) {
111113 RETVAL = NEWSV(0, len);
112114 SvPOK_only(RETVAL);
113115 SvCUR_set(RETVAL, len);
114 rv = self->desc->ecb_decrypt((unsigned char *)ciphertext, (unsigned char *)SvPV_nolen(RETVAL), &self->skey);
115 if (rv!=CRYPT_OK) croak("FATAL: decrypt failed: %s", error_to_string(rv));
116 rv = self->desc->ecb_decrypt((unsigned char *)ciphertext, (unsigned char *)SvPVX(RETVAL), &self->skey);
117 if (rv!=CRYPT_OK) {
118 SvREFCNT_dec(RETVAL);
119 croak("FATAL: decrypt failed: %s", error_to_string(rv));
120 }
121 }
122 else {
123 croak ("FATAL: input size not equal to blocksize (%d)", self->desc->block_length);
116124 }
117125 }
118126 OUTPUT:
6666 RETVAL = NEWSV(0, out_len);
6767 SvPOK_only(RETVAL);
6868 SvCUR_set(RETVAL, out_len);
69 out_data = (unsigned char *)SvPV_nolen(RETVAL);
69 out_data = (unsigned char *)SvPVX(RETVAL);
7070 rv = sha3_shake_done(&self->state, out_data, out_len);
71 if (rv != CRYPT_OK) croak("FATAL: sha3_shake_done failed: %s", error_to_string(rv));
71 if (rv != CRYPT_OK) {
72 SvREFCNT_dec(RETVAL);
73 croak("FATAL: sha3_shake_done failed: %s", error_to_string(rv));
74 }
7275 }
7376 OUTPUT:
7477 RETVAL
106106 RETVAL = NEWSV(0, i);
107107 SvPOK_only(RETVAL);
108108 SvCUR_set(RETVAL, i);
109 out_data = (unsigned char *)SvPV_nolen(RETVAL);
110
109 out_data = (unsigned char *)SvPVX(RETVAL);
111110 if (has_tmp_block) {
112111 Copy(tmp_block, out_data, blen, unsigned char);
113112 out_data += blen;
232231 RETVAL = NEWSV(0, i);
233232 SvPOK_only(RETVAL);
234233 SvCUR_set(RETVAL, i);
235 out_data = (unsigned char *)SvPV_nolen(RETVAL);
234 out_data = (unsigned char *)SvPVX(RETVAL);
236235 if (has_tmp_block) {
237236 Copy(tmp_block, out_data, blen, unsigned char);
238237 out_data += blen;
6363 unsigned char *in_data, *out_data;
6464
6565 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
66 if (in_data_len==0) {
66 if (in_data_len == 0) {
6767 RETVAL = newSVpvn("", 0);
6868 }
6969 else {
7070 RETVAL = NEWSV(0, in_data_len);
7171 SvPOK_only(RETVAL);
7272 SvCUR_set(RETVAL, in_data_len);
73 out_data = (unsigned char *)SvPV_nolen(RETVAL);
73 out_data = (unsigned char *)SvPVX(RETVAL);
7474
7575 if (self->direction == 1) {
7676 rv = cfb_encrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
77 if (rv != CRYPT_OK) croak("FATAL: cfb_encrypt failed: %s", error_to_string(rv));
77 if (rv != CRYPT_OK) {
78 SvREFCNT_dec(RETVAL);
79 croak("FATAL: cfb_encrypt failed: %s", error_to_string(rv));
80 }
7881 }
7982 else if (self->direction == -1) {
8083 rv = cfb_decrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
81 if (rv != CRYPT_OK) croak("FATAL: cfb_decrypt failed: %s", error_to_string(rv));
84 if (rv != CRYPT_OK) {
85 SvREFCNT_dec(RETVAL);
86 croak("FATAL: cfb_decrypt failed: %s", error_to_string(rv));
87 }
8288 }
8389 else {
90 SvREFCNT_dec(RETVAL);
8491 croak("FATAL: cfb_crypt failed: call start_encrypt or start_decrypt first");
8592 }
8693 }
6868 unsigned char *in_data, *out_data;
6969
7070 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
71 if (in_data_len==0) {
71 if (in_data_len == 0) {
7272 RETVAL = newSVpvn("", 0);
7373 }
7474 else {
7575 RETVAL = NEWSV(0, in_data_len);
7676 SvPOK_only(RETVAL);
7777 SvCUR_set(RETVAL, in_data_len);
78 out_data = (unsigned char *)SvPV_nolen(RETVAL);
78 out_data = (unsigned char *)SvPVX(RETVAL);
7979
8080 if (self->direction == 1) {
8181 rv = ctr_encrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
82 if (rv != CRYPT_OK) croak("FATAL: ctr_encrypt failed: %s", error_to_string(rv));
82 if (rv != CRYPT_OK) {
83 SvREFCNT_dec(RETVAL);
84 croak("FATAL: ctr_encrypt failed: %s", error_to_string(rv));
85 }
8386 }
8487 else if (self->direction == -1) {
8588 rv = ctr_decrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
86 if (rv != CRYPT_OK) croak("FATAL: ctr_decrypt failed: %s", error_to_string(rv));
89 if (rv != CRYPT_OK) {
90 SvREFCNT_dec(RETVAL);
91 croak("FATAL: ctr_decrypt failed: %s", error_to_string(rv));
92 }
8793 }
8894 else {
95 SvREFCNT_dec(RETVAL);
8996 croak("FATAL: ctr_crypt failed: call start_encrypt or start_decrypt first");
9097 }
9198 }
9999 RETVAL = NEWSV(0, i);
100100 SvPOK_only(RETVAL);
101101 SvCUR_set(RETVAL, i);
102 out_data = (unsigned char *)SvPV_nolen(RETVAL);
103
102 out_data = (unsigned char *)SvPVX(RETVAL);
104103 if (has_tmp_block) {
105104 Copy(tmp_block, out_data, blen, unsigned char);
106105 out_data += blen;
225224 RETVAL = NEWSV(0, i);
226225 SvPOK_only(RETVAL);
227226 SvCUR_set(RETVAL, i);
228 out_data = (unsigned char *)SvPV_nolen(RETVAL);
227 out_data = (unsigned char *)SvPVX(RETVAL);
229228 if (has_tmp_block) {
230229 Copy(tmp_block, out_data, blen, unsigned char);
231230 out_data += blen;
6363 unsigned char *in_data, *out_data;
6464
6565 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
66 if (in_data_len==0) {
66 if (in_data_len == 0) {
6767 RETVAL = newSVpvn("", 0);
6868 }
6969 else {
7070 RETVAL = NEWSV(0, in_data_len);
7171 SvPOK_only(RETVAL);
7272 SvCUR_set(RETVAL, in_data_len);
73 out_data = (unsigned char *)SvPV_nolen(RETVAL);
73 out_data = (unsigned char *)SvPVX(RETVAL);
7474
7575 if (self->direction == 1) {
7676 rv = ofb_encrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
77 if (rv != CRYPT_OK) croak("FATAL: ofb_encrypt failed: %s", error_to_string(rv));
77 if (rv != CRYPT_OK) {
78 SvREFCNT_dec(RETVAL);
79 croak("FATAL: ofb_encrypt failed: %s", error_to_string(rv));
80 }
7881 }
7982 else if (self->direction == -1) {
8083 rv = ofb_decrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
81 if (rv != CRYPT_OK) croak("FATAL: ofb_decrypt failed: %s", error_to_string(rv));
84 if (rv != CRYPT_OK) {
85 SvREFCNT_dec(RETVAL);
86 croak("FATAL: ofb_decrypt failed: %s", error_to_string(rv));
87 }
8288 }
8389 else {
90 SvREFCNT_dec(RETVAL);
8491 croak("FATAL: ofb_crypt failed: call start_encrypt or start_decrypt first");
8592 }
8693 }
8383 RETVAL = NEWSV(0, output_len);
8484 SvPOK_only(RETVAL);
8585 SvCUR_set(RETVAL, output_len);
86 rdata = (unsigned char *)SvPV_nolen(RETVAL);
86 rdata = (unsigned char *)SvPVX(RETVAL);
8787 rv_len = (self->desc->read)(rdata, (unsigned long)output_len, &self->state);
88 if ((UV)rv_len != output_len) croak("FATAL: PRNG_read failed");
88 if ((UV)rv_len != output_len) {
89 SvREFCNT_dec(RETVAL);
90 croak("FATAL: PRNG_read failed");
91 }
8992 }
9093 OUTPUT:
9194 RETVAL
5858 RETVAL = NEWSV(0, out_len);
5959 SvPOK_only(RETVAL);
6060 SvCUR_set(RETVAL, out_len);
61 out_data = (unsigned char *)SvPV_nolen(RETVAL);
61 out_data = (unsigned char *)SvPVX(RETVAL);
6262 rv = chacha_keystream(&self->state, out_data, out_len);
63 if (rv != CRYPT_OK) croak("FATAL: chacha_keystream failed: %s", error_to_string(rv));
63 if (rv != CRYPT_OK) {
64 SvREFCNT_dec(RETVAL);
65 croak("FATAL: chacha_keystream failed: %s", error_to_string(rv));
66 }
6467 }
6568 OUTPUT:
6669 RETVAL
8184 RETVAL = NEWSV(0, in_data_len);
8285 SvPOK_only(RETVAL);
8386 SvCUR_set(RETVAL, in_data_len);
84 out_data = (unsigned char *)SvPV_nolen(RETVAL);
87 out_data = (unsigned char *)SvPVX(RETVAL);
8588 rv = chacha_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
86 if (rv != CRYPT_OK) croak("FATAL: chacha_crypt failed: %s", error_to_string(rv));
89 if (rv != CRYPT_OK) {
90 SvREFCNT_dec(RETVAL);
91 croak("FATAL: chacha_crypt failed: %s", error_to_string(rv));
92 }
8793 }
8894 }
8995 OUTPUT:
4444 RETVAL = NEWSV(0, out_len);
4545 SvPOK_only(RETVAL);
4646 SvCUR_set(RETVAL, out_len);
47 out_data = (unsigned char *)SvPV_nolen(RETVAL);
47 out_data = (unsigned char *)SvPVX(RETVAL);
4848 rv = rc4_stream_keystream(&self->state, out_data, out_len);
49 if (rv != CRYPT_OK) croak("FATAL: rc4_stream_keystream failed: %s", error_to_string(rv));
49 if (rv != CRYPT_OK) {
50 SvREFCNT_dec(RETVAL);
51 croak("FATAL: rc4_stream_keystream failed: %s", error_to_string(rv));
52 }
5053 }
5154 OUTPUT:
5255 RETVAL
6770 RETVAL = NEWSV(0, in_data_len);
6871 SvPOK_only(RETVAL);
6972 SvCUR_set(RETVAL, in_data_len);
70 out_data = (unsigned char *)SvPV_nolen(RETVAL);
73 out_data = (unsigned char *)SvPVX(RETVAL);
7174 rv = rc4_stream_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
72 if (rv != CRYPT_OK) croak("FATAL: rc4_stream_crypt failed: %s", error_to_string(rv));
75 if (rv != CRYPT_OK) {
76 SvREFCNT_dec(RETVAL);
77 croak("FATAL: rc4_stream_crypt failed: %s", error_to_string(rv));
78 }
7379 }
7480 }
7581 OUTPUT:
4949 RETVAL = NEWSV(0, out_len);
5050 SvPOK_only(RETVAL);
5151 SvCUR_set(RETVAL, out_len);
52 out_data = (unsigned char *)SvPV_nolen(RETVAL);
52 out_data = (unsigned char *)SvPVX(RETVAL);
5353 rv = sober128_stream_keystream(&self->state, out_data, out_len);
54 if (rv != CRYPT_OK) croak("FATAL: sober128_stream_keystream failed: %s", error_to_string(rv));
54 if (rv != CRYPT_OK) {
55 SvREFCNT_dec(RETVAL);
56 croak("FATAL: sober128_stream_keystream failed: %s", error_to_string(rv));
57 }
5558 }
5659 OUTPUT:
5760 RETVAL
7275 RETVAL = NEWSV(0, in_data_len);
7376 SvPOK_only(RETVAL);
7477 SvCUR_set(RETVAL, in_data_len);
75 out_data = (unsigned char *)SvPV_nolen(RETVAL);
78 out_data = (unsigned char *)SvPVX(RETVAL);
7679 rv = sober128_stream_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
77 if (rv != CRYPT_OK) croak("FATAL: sober128_stream_crypt failed: %s", error_to_string(rv));
80 if (rv != CRYPT_OK) {
81 SvREFCNT_dec(RETVAL);
82 croak("FATAL: sober128_stream_crypt failed: %s", error_to_string(rv));
83 }
7884 }
7985 }
8086 OUTPUT: