diff --git a/lib/Crypt/OpenPGP/Buffer.pm b/lib/Crypt/OpenPGP/Buffer.pm index 52103f3..39b4a4e 100644 --- a/lib/Crypt/OpenPGP/Buffer.pm +++ b/lib/Crypt/OpenPGP/Buffer.pm @@ -1,4 +1,7 @@ package Crypt::OpenPGP::Buffer; + +use strict; + use base qw( Data::Buffer ); use Crypt::OpenPGP::Util qw( bin2mp mp2bin bitsize ); diff --git a/lib/Crypt/OpenPGP/Key/Public/ElGamal.pm b/lib/Crypt/OpenPGP/Key/Public/ElGamal.pm index a00cfeb..b446eea 100644 --- a/lib/Crypt/OpenPGP/Key/Public/ElGamal.pm +++ b/lib/Crypt/OpenPGP/Key/Public/ElGamal.pm @@ -53,7 +53,7 @@ sub gen_k { my($p) = @_; ## XXX choose bitsize based on bitsize of $p my $bits = 198; - my $p_minus1 = $p - 1; + my $p_minus1 = Math::BigInt->new($p) - 1; my $k = Crypt::OpenPGP::Util::get_random_bigint($bits); while (1) { diff --git a/lib/Crypt/OpenPGP/Key/Public/RSA.pm b/lib/Crypt/OpenPGP/Key/Public/RSA.pm index ff78445..c2af056 100644 --- a/lib/Crypt/OpenPGP/Key/Public/RSA.pm +++ b/lib/Crypt/OpenPGP/Key/Public/RSA.pm @@ -64,9 +64,14 @@ sub verify { { my %ENCODING = ( - MD2 => pack('H*', '3020300C06082A864886F70D020205000410'), - MD5 => pack('H*', '3020300C06082A864886F70D020505000410'), - SHA1 => pack('H*', '3021300906052B0E03021A05000414'), + MD2 => pack('H*', '3020300C06082A864886F70D020205000410'), + MD5 => pack('H*', '3020300C06082A864886F70D020505000410'), + SHA1 => pack('H*', '3021300906052B0E03021A05000414'), + SHA256 => pack('H*', '3031300d060960864801650304020105000420'), + SHA224 => pack('H*', '302d300d06096086480165030402040500041c'), + SHA384 => pack('H*', '3041300d060960864801650304020205000430'), + SHA512 => pack('H*', '3051300d060960864801650304020305000440'), + RIPEMD160 => pack('H*', '3021300906052b2403020105000414'), ); sub encode { diff --git a/t/14-sha2-verify.t b/t/14-sha2-verify.t new file mode 100644 index 0000000..7c8dad6 --- /dev/null +++ b/t/14-sha2-verify.t @@ -0,0 +1,31 @@ +use strict; +use Test::More tests => 2; + +use Crypt::OpenPGP; + +use vars qw( $SAMPLES ); +unshift @INC, 't/'; +require 'test-common.pl'; +use File::Spec; + + +my $key_id = '43AA1C85'; +my $pass = ""; +my $uid = 'Test Key (SHA-512 key for Crypt::OpenPGP tests) '; + +my $secring = File::Spec->catfile( $SAMPLES, 'gpg', 'sha2.sec' ); +my $pubring = File::Spec->catfile( $SAMPLES, 'gpg', 'sha2.pub' ); +my $pgp = Crypt::OpenPGP->new( + SecRing => $secring, + PubRing => $pubring, +); +isa_ok $pgp, 'Crypt::OpenPGP'; + +{ + diag 'sig generated by gpg with SHA512'; + + # Test a signature created by gnupg with SHA512 key + my $sig_file = File::Spec->catfile( $SAMPLES, 'sha2.asc' ); + my $signer = $pgp->verify( SigFile => $sig_file ); + is $signer, $uid, 'verified as signed by uid'; +} diff --git a/t/samples/gpg/sha2.pub b/t/samples/gpg/sha2.pub new file mode 100644 index 0000000..27d42e6 --- /dev/null +++ b/t/samples/gpg/sha2.pub @@ -0,0 +1,31 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQENBFcBiKwBCADRfsWVaJosDG12BcCMOYwIhI3d9STGT33IV+uuw02JlPkpf7Cz +7KqcZ1VlBdw3+9MFtzwfkZYXa5ARlwKkE6IzMcwGQuSRVD41w5Pth5S2bwwdfwjT +lV2w1mMFkYcZiDyFMMRgYgAgm0lje3mK5qTKd85ZG3mH+SAuWyCpPG44DSGZSfqE +O/6Rj6fY4NZ+MTxcKh+HXgSW4FKsaHP9J7DIOzgjZBGBdRJVvDLWTHUi3y8iQA51 +oJ732z//gwxCdCHMrf9CN3ZjoMmzF+o1lVJRmtGFTfF5JKVONiBS4d74FgvxWr7T +C2oKvpye2j9GI03nv7J2boUdk/9Y0YOIdTL9ABEBAAG0QVRlc3QgS2V5IChTSEEt +NTEyIGtleSBmb3IgQ3J5cHQ6Ok9wZW5QR1AgdGVzdHMpIDx0ZXN0QHNoYTUxMi5z +aWc+iQE3BBMBCgAhBQJXAYisAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJ +EPvN3TNDqhyFw/4H/0yqdTizfgQqHVqmH0SsKJ0uwzKSeRglPQeOGPxpy0hkyBld +02jsvmu9VvDoBXIE5+WKdTGb2vrQd6izpbewhl6NEZ9BrbtbW0SkiAx5gbETPflD +Se74wFCdl6RyTbqnssPgqTnTzB4XpTpLbfnqC8u5BROIpCbre0oggNfdBio3psD8 +McshP/oN9GL6fsp8XlOdP/lwvnLXyZQCTOdmwYWUXlSSAkIM0dOEErGEcRApYiHT +xQOVmYdEiFCFKtkCix7UJP4qpwukcrznGNTC5wKe9CLJqykaxHE/tSAS6Clm3Wce +gBajBCRGTyJhlBaJF3c56kKN2XlcLGZoZ3+CeKO5AQ0EVwGIrAEIAK7LRErkfvzZ +E0EOyqD0aaGj8aEmyB6+/ztUeI0e3VEqP3YexSYS2Uv1kh72TQodzoqDRPtxrVE6 +DWMWTHB3PrxUuzufOKkpRHgvD5xtntJutjnF1uX5+WQUVpfluaF1d/Lu/d8lKh+E +kpjlW5FfKqKdQrjohjVir/4+/ecOue+7JAadCqE9GTCq9KIIM+Xta/yM4riURXat +qVB/eoANeQ90Re83sLnZJ6205zk14PtqEzE1RPEerCxLfw/oKMGaxk9qKx7I58pk +D9SrXJKfLHo2R+sXBAqgE6usOOXFrgddyPlKBvqvV8lRKkh+Glr8caSpwHKn1ZoT +qVrh/tTlSc0AEQEAAYkBHwQYAQoACQUCVwGIrAIbDAAKCRD7zd0zQ6ochcWgCACC +7GFzrwEQE+27RWlS+KuXymh11B1haEpIMpFaEE9YOhnqZ+F2xvu6gVjxA7RZXJpS +Eg0NCMqongTrTUvKRuTxml3UyHSTL7O0bXbz7T4D3jKIbWiYnTGvC4VPXfEyCpgt +vxIZ4en95nePq3DLgaGG/rB24sdL+PJruVypvPMF6+mmIhK4JOPGWD1/+ht1SKPI +6UmNiCoH+cTVqTse2thtTbtVcPMV+h4CvChDbDm4SVaaA7QIx6vODs+j9MI6M9E5 +LNPiR4Tv3HjYRlbCbFhhmzuvjVea5uwToPT66XsaKb9ZR4LuomporWYJ1u5U7WS5 +y/kuI17EufLSxPQMHY0F +=JX1K +-----END PGP PUBLIC KEY BLOCK----- diff --git a/t/samples/gpg/sha2.sec b/t/samples/gpg/sha2.sec new file mode 100644 index 0000000..cab9ace --- /dev/null +++ b/t/samples/gpg/sha2.sec @@ -0,0 +1,58 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- +Version: GnuPG v1 + +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 +1u5U7WS5y/kuI17EufLSxPQMHY0F +=TbV3 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/t/samples/sha2.asc b/t/samples/sha2.asc new file mode 100644 index 0000000..3d188ad --- /dev/null +++ b/t/samples/sha2.asc @@ -0,0 +1,14 @@ +-----BEGIN PGP MESSAGE----- +Version: GnuPG v1 + +owGbwMvMwMX4++xdY+dVMq2Ma0qTBIozEo3iUysScwtyUvVKKkrCGac/ycsvVyjJ +SFUoLs1TyCxWSCotysvMS+fKzFNISU0tSC0uUSguSExO5SrJSCxRLwYrLU+sBNJA +VcUKiUUgmaL80vQMhUSF4pL8olyFTIXkxJyc1BSFyvxSrk5GGRYGRi4GNlYmkG0M +XJwCMCfJ2bD/rxVaoMGweCFf6bKblftlxLxEMmKblNRb9rac8w3bbbOgIVa85oOg +XGrxDqGPNa33m8+lbVjkWSv4wjCv88PEz66XWHdI+5x2fXnzXfon7Vahn9mTTySu +0rU2eBfF9vX59wYz075iRb83S8JUhMRnrdCJOJPMvmuzev3TbW65x7fVdi2d7KCy +7PZubZ0jBpWbrT0Olh5huntylvJZYU6mHzMmv92iue2i/aOdE6f7zv0kWMW/Wf3b +iyVfn22Z7naRy+0Bx0/bFT6iElnzmtZrH5gskqaRfGebTEL19gcR8v/PflNzLera +J5U+51HZtLPs55W8Hhw1LV2W13P8htzmloxzBi6iVx6Vef+/mhfzGgA= +=WAvB +-----END PGP MESSAGE-----