Blob Blame History Raw
From 0fb25e59e825cdd996384a4571f5ac3a308b4784 Mon Sep 17 00:00:00 2001
From: Karel Miko <karel.miko@gmail.com>
Date: Mon, 4 Jun 2018 16:52:29 +0200
Subject: [PATCH] adopt to the new libtomcrypt
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Petr Písař: Ported from CryptX-0.61:

commit 2466727cd0603184442ba7c8251e64674c6731a7
Author: Karel Miko <karel.miko@gmail.com>
Date:   Mon Jun 4 16:52:29 2018 +0200

    adopt to the new libtomcrypt

ECC support removed.

Signed-off-by: Petr Písař <ppisar@redhat.com>
---
 inc/CryptX_PK_ECC.xs.inc | 15 +++++++++++++++
 lib/Crypt/Misc.pm        |  3 +++
 lib/Crypt/PK/RSA.pm      |  5 +++++
 t/cipher_des_ede.t       | 12 ++++++------
 4 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/inc/CryptX_PK_ECC.xs.inc b/inc/CryptX_PK_ECC.xs.inc
index 2ecbd3c..a3afa69 100644
--- a/inc/CryptX_PK_ECC.xs.inc
+++ b/inc/CryptX_PK_ECC.xs.inc
@@ -45,6 +45,21 @@ _import(Crypt::PK::ECC self, SV * key_data)
         XPUSHs(ST(0)); /* return self */
     }
 
+void
+_import_old(Crypt::PK::ECC self, SV * key_data)
+    PPCODE:
+    {
+        int rv;
+        unsigned char *data=NULL;
+        STRLEN data_len=0;
+
+        data = (unsigned char *)SvPVbyte(key_data, data_len);
+        if (self->key.type != -1) { ecc_free(&self->key); self->key.type = -1; }
+        rv = ecc_import(data, (unsigned long)data_len, &self->key);
+        if (rv != CRYPT_OK) croak("FATAL: ecc_import failed: %s", error_to_string(rv));
+        XPUSHs(ST(0)); /* return self */
+    }
+
 void
 _import_pkcs8(Crypt::PK::ECC self, SV * key_data, SV * passwd)
     PPCODE:
diff --git a/lib/Crypt/Misc.pm b/lib/Crypt/Misc.pm
index 9bd0223..523490c 100644
--- a/lib/Crypt/Misc.pm
+++ b/lib/Crypt/Misc.pm
@@ -252,6 +252,9 @@ sub _name2mode {
   my ($cipher, undef, $klen, $mode) = $cipher_name =~ /^(AES|CAMELLIA|DES|DES-EDE3|SEED)(-(\d+))?-(CBC|CFB|ECB|OFB)$/i;
   croak "FATAL: unsupported cipher '$cipher_name'" unless $cipher && $mode;
   $cipher = $trans{$cipher} || $cipher;
+  $klen = 192 if $cipher eq 'DES_EDE';
+  $klen = 64  if $cipher eq 'DES';
+  $klen = 128 if $cipher eq 'SEED';
   $klen = $klen ? int($klen/8) : Crypt::Cipher::min_keysize($cipher);
   my $ilen = Crypt::Cipher::blocksize($cipher);
   croak "FATAL: unsupported cipher '$cipher_name'" unless $klen && $ilen;
diff --git a/lib/Crypt/PK/RSA.pm b/lib/Crypt/PK/RSA.pm
index 69e1c1f..a0be518 100644
--- a/lib/Crypt/PK/RSA.pm
+++ b/lib/Crypt/PK/RSA.pm
@@ -10,6 +10,7 @@ our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
 our @EXPORT = qw();
 
 use Carp;
+$Carp::Internal{(__PACKAGE__)}++;
 use CryptX qw(_encode_json _decode_json);
 use Crypt::Digest qw(digest_data digest_data_b64u);
 use Crypt::Misc qw(read_rawfile encode_b64u decode_b64u encode_b64 decode_b64 pem_to_der der_to_pem);
@@ -24,6 +25,7 @@ sub new {
 
 sub export_key_pem {
   my ($self, $type, $password, $cipher) = @_;
+  local $SIG{__DIE__} = \&CryptX::_croak;
   my $key = $self->export_key_der($type||'');
   return unless $key;
 
@@ -40,6 +42,7 @@ sub export_key_pem {
 
 sub export_key_jwk {
   my ($self, $type, $wanthash) = @_;
+  local $SIG{__DIE__} = \&CryptX::_croak;
   my $kh = $self->key2hash;
   if ($type eq 'private') {
     return unless $kh->{N} && $kh->{e} && $kh->{d} && $kh->{p} && $kh->{q} && $kh->{dP} && $kh->{dQ} && $kh->{qP};
@@ -75,6 +78,7 @@ sub export_key_jwk {
 
 sub export_key_jwk_thumbprint {
   my ($self, $hash_name) = @_;
+  local $SIG{__DIE__} = \&CryptX::_croak;
   $hash_name ||= 'SHA256';
   my $h = $self->export_key_jwk('public', 1);
   my $json = _encode_json({kty=>$h->{kty}, n=>$h->{n}, e=>$h->{e}});
@@ -83,6 +87,7 @@ sub export_key_jwk_thumbprint {
 
 sub import_key {
   my ($self, $key, $password) = @_;
+  local $SIG{__DIE__} = \&CryptX::_croak;
   croak "FATAL: undefined key" unless $key;
 
   # special case
diff --git a/t/cipher_des_ede.t b/t/cipher_des_ede.t
index cfd8d68..b8134db 100644
--- a/t/cipher_des_ede.t
+++ b/t/cipher_des_ede.t
@@ -11,13 +11,13 @@ use Crypt::Cipher::DES_EDE;
 is( Crypt::Cipher::DES_EDE::blocksize, 8, '::blocksize');
 is( Crypt::Cipher::DES_EDE::keysize, 24, '::keysize');
 is( Crypt::Cipher::DES_EDE::max_keysize, 24, '::max_keysize');
-is( Crypt::Cipher::DES_EDE::min_keysize, 24, '::min_keysize');
+is( Crypt::Cipher::DES_EDE::min_keysize, 16, '::min_keysize');
 is( Crypt::Cipher::DES_EDE::default_rounds, 16, '::default_rounds');
 
 is( Crypt::Cipher::DES_EDE->blocksize, 8, '->blocksize');
 is( Crypt::Cipher::DES_EDE->keysize, 24, '->keysize');
 is( Crypt::Cipher::DES_EDE->max_keysize, 24, '->max_keysize');
-is( Crypt::Cipher::DES_EDE->min_keysize, 24, '->min_keysize');
+is( Crypt::Cipher::DES_EDE->min_keysize, 16, '->min_keysize');
 is( Crypt::Cipher::DES_EDE->default_rounds, 16, '->default_rounds');
 
 my $min_key = 'kkkkkkkkkkkkkkkkkkkkkkkk';
@@ -26,25 +26,25 @@ my $max_key = 'KKKKKKKKKKKKKKKKKKKKKKKK';
 is( Crypt::Cipher::blocksize('DES_EDE'), 8, 'Cipher->blocksize');
 is( Crypt::Cipher::keysize('DES_EDE'), 24, 'Cipher->keysize');
 is( Crypt::Cipher::max_keysize('DES_EDE'), 24, 'Cipher->max_keysize');
-is( Crypt::Cipher::min_keysize('DES_EDE'), 24, 'Cipher->min_keysize');
+is( Crypt::Cipher::min_keysize('DES_EDE'), 16, 'Cipher->min_keysize');
 is( Crypt::Cipher::default_rounds('DES_EDE'), 16, 'Cipher->default_rounds');
 
 is( Crypt::Cipher->blocksize('DES_EDE'), 8, 'Cipher->blocksize');
 is( Crypt::Cipher->keysize('DES_EDE'), 24, 'Cipher->keysize');
 is( Crypt::Cipher->max_keysize('DES_EDE'), 24, 'Cipher->max_keysize');
-is( Crypt::Cipher->min_keysize('DES_EDE'), 24, 'Cipher->min_keysize');
+is( Crypt::Cipher->min_keysize('DES_EDE'), 16, 'Cipher->min_keysize');
 is( Crypt::Cipher->default_rounds('DES_EDE'), 16, 'Cipher->default_rounds');
 
 is( Crypt::Cipher::DES_EDE->new($min_key)->blocksize, 8, 'DES_EDE->new()->blocksize');
 is( Crypt::Cipher::DES_EDE->new($min_key)->keysize, 24, 'DES_EDE->new()->keysize');
 is( Crypt::Cipher::DES_EDE->new($min_key)->max_keysize, 24, 'DES_EDE->new()->max_keysize');
-is( Crypt::Cipher::DES_EDE->new($min_key)->min_keysize, 24, 'DES_EDE->new()->min_keysize');
+is( Crypt::Cipher::DES_EDE->new($min_key)->min_keysize, 16, 'DES_EDE->new()->min_keysize');
 is( Crypt::Cipher::DES_EDE->new($min_key)->default_rounds, 16, 'DES_EDE->new()->default_rounds');
 
 is( Crypt::Cipher->new('DES_EDE', $min_key)->blocksize, 8, 'Cipher->new()->blocksize');
 is( Crypt::Cipher->new('DES_EDE', $min_key)->keysize, 24, 'Cipher->new()->keysize');
 is( Crypt::Cipher->new('DES_EDE', $min_key)->max_keysize, 24, 'Cipher->new()->max_keysize');
-is( Crypt::Cipher->new('DES_EDE', $min_key)->min_keysize, 24, 'Cipher->new()->min_keysize');
+is( Crypt::Cipher->new('DES_EDE', $min_key)->min_keysize, 16, 'Cipher->new()->min_keysize');
 is( Crypt::Cipher->new('DES_EDE', $min_key)->default_rounds, 16, 'Cipher->new()->default_rounds');
 
 my $block_plain = 'BBBBBBBB';
-- 
2.17.2