You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by lg...@apache.org on 2019/10/03 16:36:35 UTC

[mina-sshd] 10/10: [SSHD-945] Provide used key instance when invoking AbstractSignature#doInitSignature

This is an automated email from the ASF dual-hosted git repository.

lgoldstein pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mina-sshd.git

commit 871e55bad4ffa2fee8fe3fb9a6d68743f99896d6
Author: Lyor Goldstein <lg...@apache.org>
AuthorDate: Thu Oct 3 16:23:03 2019 +0300

    [SSHD-945] Provide used key instance when invoking AbstractSignature#doInitSignature
---
 CHANGES.md                                         |  2 ++
 .../sshd/common/signature/AbstractSignature.java   | 25 ++++++++++++++++------
 .../sshd/common/signature/SignatureDSATest.java    |  5 ++++-
 .../common/signature/SignatureRSASHA1Test.java     | 15 +++++++++----
 4 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 10f493f..fdaae65 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -50,6 +50,8 @@ occurs. The cache can be invalidated (and thus force a re-load) by invoking `Mod
 exchange via properties - see `DHGEXClient#PROP_DHGEX_CLIENT_MIN/MAX/PRF_KEY`. Similar applies for `DHGEXServer` but only for
 the message type=30 (old request).
 
+* `AbstractSignature#doInitSignature` is now provided also with the `Key` instance for which it is invoked.
+
 ## Behavioral changes and enhancements
 
 * [SSHD-926](https://issues.apache.org/jira/browse/SSHD-930) - Add support for OpenSSH 'lsetstat@openssh.com' SFTP protocol extension.
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java b/sshd-common/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java
index ef06d15..e94a691 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java
@@ -20,6 +20,7 @@ package org.apache.sshd.common.signature;
 
 import java.nio.charset.StandardCharsets;
 import java.security.GeneralSecurityException;
+import java.security.Key;
 import java.security.PrivateKey;
 import java.security.PublicKey;
 import java.security.SignatureException;
@@ -41,7 +42,8 @@ public abstract class AbstractSignature implements Signature {
     private final String algorithm;
 
     protected AbstractSignature(String algorithm) {
-        this.algorithm = ValidateUtils.checkNotNullAndNotEmpty(algorithm, "No signature algorithm specified");
+        this.algorithm =
+            ValidateUtils.checkNotNullAndNotEmpty(algorithm, "No signature algorithm specified");
     }
 
     @Override
@@ -53,12 +55,16 @@ public abstract class AbstractSignature implements Signature {
      * Initializes the internal signature instance
      *
      * @param algo The signature's algorithm
+     * @param the {@link Key} that is provided for initialization - a {@link PrivateKey}
+     * for signing and a {@link PublicKey} for verification
      * @param forSigning If {@code true} then it is being initialized for signing,
      * otherwise for verifying a signature
      * @return The {@link java.security.Signature} instance
      * @throws GeneralSecurityException if failed to initialize
      */
-    protected java.security.Signature doInitSignature(String algo, boolean forSigning) throws GeneralSecurityException {
+    protected java.security.Signature doInitSignature(
+            String algo, Key key, boolean forSigning)
+                throws GeneralSecurityException {
         return SecurityUtils.getSignature(algo);
     }
 
@@ -73,27 +79,31 @@ public abstract class AbstractSignature implements Signature {
 
     @Override
     public byte[] sign() throws Exception {
-        java.security.Signature signature = Objects.requireNonNull(getSignature(), "Signature not initialized");
+        java.security.Signature signature =
+            Objects.requireNonNull(getSignature(), "Signature not initialized");
         return signature.sign();
     }
 
     @Override
     public void initVerifier(PublicKey key) throws Exception {
         String algo = getAlgorithm();
-        signatureInstance = Objects.requireNonNull(doInitSignature(algo, false), "No signature instance create");
+        signatureInstance = Objects.requireNonNull(
+            doInitSignature(algo, key, false), "No signature instance create");
         signatureInstance.initVerify(Objects.requireNonNull(key, "No public key provided"));
     }
 
     @Override
     public void initSigner(PrivateKey key) throws Exception {
         String algo = getAlgorithm();
-        signatureInstance = Objects.requireNonNull(doInitSignature(algo, true), "No signature instance create");
+        signatureInstance = Objects.requireNonNull(
+            doInitSignature(algo, key, true), "No signature instance create");
         signatureInstance.initSign(Objects.requireNonNull(key, "No private key provided"));
     }
 
     @Override
     public void update(byte[] hash, int off, int len) throws Exception {
-        java.security.Signature signature = Objects.requireNonNull(getSignature(), "Signature not initialized");
+        java.security.Signature signature =
+            Objects.requireNonNull(getSignature(), "Signature not initialized");
         signature.update(hash, off, len);
     }
 
@@ -138,7 +148,8 @@ public abstract class AbstractSignature implements Signature {
     }
 
     protected boolean doVerify(byte[] data) throws SignatureException {
-        java.security.Signature signature = Objects.requireNonNull(getSignature(), "Signature not initialized");
+        java.security.Signature signature =
+            Objects.requireNonNull(getSignature(), "Signature not initialized");
         return signature.verify(data);
     }
 
diff --git a/sshd-common/src/test/java/org/apache/sshd/common/signature/SignatureDSATest.java b/sshd-common/src/test/java/org/apache/sshd/common/signature/SignatureDSATest.java
index d9f507d..03a8199 100644
--- a/sshd-common/src/test/java/org/apache/sshd/common/signature/SignatureDSATest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/common/signature/SignatureDSATest.java
@@ -20,6 +20,7 @@ package org.apache.sshd.common.signature;
 
 import java.math.BigInteger;
 import java.security.GeneralSecurityException;
+import java.security.Key;
 import java.security.KeyFactory;
 import java.security.spec.DSAPublicKeySpec;
 
@@ -47,7 +48,9 @@ public class SignatureDSATest extends JUnitTestSupport {
         KeyFactory kf = SecurityUtils.getKeyFactory(KeyUtils.DSS_ALGORITHM);
         SignatureDSA signatureDSA = new SignatureDSA(KeyUtils.DSS_ALGORITHM) {
             @Override
-            protected java.security.Signature doInitSignature(String algo, boolean forSigning) throws GeneralSecurityException {
+            protected java.security.Signature doInitSignature(
+                    String algo, Key key, boolean forSigning)
+                        throws GeneralSecurityException {
                 return java.security.Signature.getInstance(algo);
 
             }
diff --git a/sshd-common/src/test/java/org/apache/sshd/common/signature/SignatureRSASHA1Test.java b/sshd-common/src/test/java/org/apache/sshd/common/signature/SignatureRSASHA1Test.java
index 38d9168..2644b1f 100644
--- a/sshd-common/src/test/java/org/apache/sshd/common/signature/SignatureRSASHA1Test.java
+++ b/sshd-common/src/test/java/org/apache/sshd/common/signature/SignatureRSASHA1Test.java
@@ -20,6 +20,7 @@ package org.apache.sshd.common.signature;
 
 import java.math.BigInteger;
 import java.security.GeneralSecurityException;
+import java.security.Key;
 import java.security.KeyFactory;
 import java.security.Provider;
 import java.security.PublicKey;
@@ -73,9 +74,12 @@ public class SignatureRSASHA1Test extends JUnitTestSupport {
             public SignatureRSA create() {
                 return new SignatureRSASHA1() {
                     @Override
-                    protected java.security.Signature doInitSignature(String algo, boolean forSigning) throws GeneralSecurityException {
+                    protected java.security.Signature doInitSignature(
+                            String algo, Key key, boolean forSigning)
+                                throws GeneralSecurityException {
                         assertFalse("Signature not initialized for verification", forSigning);
-                        java.security.Signature signature = super.doInitSignature(algo, forSigning);
+                        java.security.Signature signature =
+                            super.doInitSignature(algo, key, forSigning);
                         if (SecurityUtils.isBouncyCastleRegistered()) {
                             Provider provider = signature.getProvider();
                             String name = provider.getName();
@@ -92,9 +96,12 @@ public class SignatureRSASHA1Test extends JUnitTestSupport {
     public void testLeadingZeroesJCE() throws Throwable {
         testLeadingZeroes(() -> new SignatureRSASHA1() {
             @Override
-            protected java.security.Signature doInitSignature(String algo, boolean forSigning) throws GeneralSecurityException {
+            protected java.security.Signature doInitSignature(
+                    String algo, Key key, boolean forSigning)
+                        throws GeneralSecurityException {
                 assertFalse("Signature not initialized for verification", forSigning);
-                java.security.Signature signature = java.security.Signature.getInstance(algo);
+                java.security.Signature signature =
+                    java.security.Signature.getInstance(algo);
                 Provider provider = signature.getProvider();
                 String name = provider.getName();
                 assertNotEquals("BC provider used although not required", SecurityUtils.BOUNCY_CASTLE, name);