From 492f2ef74d8736d81ce9d46f33dc391442a0464b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar(a)redhat.com>
Date: Tue, 1 Nov 2016 09:39:58 +0100
Subject: Restore support for setting private key before public key
---
...t-OpenSSL-DSA-0.15-Adapt-to-OpenSSL-1.1.0.patch | 72 ++++++++++++++++++----
perl-Crypt-OpenSSL-DSA.spec | 5 +-
2 files changed, 65 insertions(+), 12 deletions(-)
diff --git a/Crypt-OpenSSL-DSA-0.15-Adapt-to-OpenSSL-1.1.0.patch
b/Crypt-OpenSSL-DSA-0.15-Adapt-to-OpenSSL-1.1.0.patch
index aa8285d..c0be243 100644
--- a/Crypt-OpenSSL-DSA-0.15-Adapt-to-OpenSSL-1.1.0.patch
+++ b/Crypt-OpenSSL-DSA-0.15-Adapt-to-OpenSSL-1.1.0.patch
@@ -1,4 +1,4 @@
-From 1217fbbff67098c8ded649f0a9d21cb4288b972f Mon Sep 17 00:00:00 2001
+From 48707824049eda6a6dd2d8414c2df01a96f44099 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar(a)redhat.com>
Date: Fri, 14 Oct 2016 11:26:01 +0200
Subject: [PATCH] Adapt to OpenSSL 1.1.0
@@ -23,12 +23,13 @@ CPAN RT#118346
Signed-off-by: Petr Písař <ppisar(a)redhat.com>
---
- DSA.xs | 269 +++++++++++++++++++++++++++++++++++++++++++++++---
+ DSA.xs | 282 +++++++++++++++++++++++++++++++++++++++++++++++---
+ t/10-selftest.t | 18 +++-
t/90-openssl-compat.t | 2 +-
- 2 files changed, 256 insertions(+), 15 deletions(-)
+ 3 files changed, 286 insertions(+), 16 deletions(-)
diff --git a/DSA.xs b/DSA.xs
-index 00e6b27..a5d7ad0 100644
+index 00e6b27..4c5e2ac 100644
--- a/DSA.xs
+++ b/DSA.xs
@@ -18,6 +18,95 @@ extern "C" {
@@ -332,7 +333,7 @@ index 00e6b27..a5d7ad0 100644
SV * pub_key_SV
PREINIT:
int len;
-+ BIGNUM *pub_key;
++ BIGNUM *pub_key;
CODE:
len = SvCUR(pub_key_SV);
- dsa->pub_key = BN_bin2bn(SvPV(pub_key_SV, len), len, NULL);
@@ -344,12 +345,25 @@ index 00e6b27..a5d7ad0 100644
void
set_priv_key(dsa, priv_key_SV)
-@@ -369,9 +566,14 @@ set_priv_key(dsa, priv_key_SV)
+@@ -369,9 +566,27 @@ set_priv_key(dsa, priv_key_SV)
SV * priv_key_SV
PREINIT:
int len;
-+ BIGNUM *priv_key;
++ const BIGNUM *old_pub_key;
++ BIGNUM *pub_key;
++ BIGNUM *priv_key;
CODE:
++ DSA_get0_key(dsa, &old_pub_key, NULL);
++ if (NULL == old_pub_key) {
++ pub_key = BN_new();
++ if (NULL == pub_key) {
++ croak("Could not create a dummy public key");
++ }
++ if (!DSA_set0_key(dsa, pub_key, NULL)) {
++ BN_free(pub_key);
++ croak("Could not set a dummy public key");
++ }
++ }
len = SvCUR(priv_key_SV);
- dsa->priv_key = BN_bin2bn(SvPV(priv_key_SV, len), len, NULL);
+ priv_key = BN_bin2bn(SvPV(priv_key_SV, len), len, NULL);
@@ -360,7 +374,7 @@ index 00e6b27..a5d7ad0 100644
MODULE = Crypt::OpenSSL::DSA PACKAGE = Crypt::OpenSSL::DSA::Signature
-@@ -393,11 +595,13 @@ SV *
+@@ -393,11 +608,13 @@ SV *
get_r(dsa_sig)
DSA_SIG *dsa_sig
PREINIT:
@@ -375,7 +389,7 @@ index 00e6b27..a5d7ad0 100644
RETVAL = newSVpvn(to, len);
free(to);
OUTPUT:
-@@ -407,11 +611,13 @@ SV *
+@@ -407,11 +624,13 @@ SV *
get_s(dsa_sig)
DSA_SIG *dsa_sig
PREINIT:
@@ -390,7 +404,7 @@ index 00e6b27..a5d7ad0 100644
RETVAL = newSVpvn(to, len);
free(to);
OUTPUT:
-@@ -423,9 +629,27 @@ set_r(dsa_sig, r_SV)
+@@ -423,9 +642,27 @@ set_r(dsa_sig, r_SV)
SV * r_SV
PREINIT:
int len;
@@ -419,7 +433,7 @@ index 00e6b27..a5d7ad0 100644
void
set_s(dsa_sig, s_SV)
-@@ -433,6 +657,23 @@ set_s(dsa_sig, s_SV)
+@@ -433,6 +670,23 @@ set_s(dsa_sig, s_SV)
SV * s_SV
PREINIT:
int len;
@@ -444,6 +458,42 @@ index 00e6b27..a5d7ad0 100644
+ BN_free(s);
+ croak("Could not set a signature");
+ }
+diff --git a/t/10-selftest.t b/t/10-selftest.t
+index 54b517a..ed89c4f 100644
+--- a/t/10-selftest.t
++++ b/t/10-selftest.t
+@@ -5,7 +5,7 @@ use strict;
+ use Test;
+ use Crypt::OpenSSL::DSA;
+
+-BEGIN { plan tests => 30 }
++BEGIN { plan tests => 36 }
+
+ my $message = "foo bar";
+
+@@ -101,6 +101,22 @@ ok($dsa4->verify($message, $dsa_sig3), 1);
+ ok($dsa5->verify($message, $dsa_sig3), 1);
+ ok($dsa6->verify($message, $dsa_sig3), 1);
+
++# Check setting private key before public key.
++# This is not suppored by OpenSSL-1.1.0.
++my $dsa7 = Crypt::OpenSSL::DSA->new();
++$dsa7->set_p($p);
++$dsa7->set_q($q);
++$dsa7->set_g($g);
++ok($dsa7->get_p,$p);
++ok($dsa7->get_q,$q);
++ok($dsa7->get_g,$g);
++$dsa7->set_priv_key($priv_key);
++ok($dsa7->get_priv_key,$priv_key);
++my $dsa_sig4 = $dsa7->sign($message);
++$dsa7->set_pub_key($pub_key);
++ok($dsa7->get_pub_key,$pub_key);
++ok($dsa7->verify($message, $dsa_sig4), 1);
++
+ unlink("dsa.param.pem");
+ unlink("dsa.priv.pem");
+ unlink("dsa.pub.pem");
diff --git a/t/90-openssl-compat.t b/t/90-openssl-compat.t
index eba43fe..1e0ca96 100644
--- a/t/90-openssl-compat.t
diff --git a/perl-Crypt-OpenSSL-DSA.spec b/perl-Crypt-OpenSSL-DSA.spec
index c169c41..1cf90bb 100644
--- a/perl-Crypt-OpenSSL-DSA.spec
+++ b/perl-Crypt-OpenSSL-DSA.spec
@@ -1,6 +1,6 @@
Name: perl-Crypt-OpenSSL-DSA
Version: 0.15
-Release: 6%{?dist}
+Release: 7%{?dist}
Summary: Perl interface to OpenSSL for DSA
License: GPL+ or Artistic
Group: Development/Libraries
@@ -54,6 +54,9 @@ rm -rf %{buildroot}
%{_mandir}/man3/*
%changelog
+* Tue Nov 01 2016 Petr Pisar <ppisar(a)redhat.com> - 0.15-7
+- Restore support for setting private key before public key (bug #1383651)
+
* Thu Oct 27 2016 Petr Pisar <ppisar(a)redhat.com> - 0.15-6
- Adapt to OpenSSL 1.1.0 (bug #1383651)
--
cgit v0.12
http://pkgs.fedoraproject.org/cgit/perl-Crypt-OpenSSL-DSA.git/commit/?h=m...