Can you remove it from your local repository and try again ? It's definitely not in maven central: https://repo1.maven.org/maven2/net/i2p/crypto/eddsa/
2017-03-10 9:01 GMT+01:00 Lyor Goldstein <lyor.goldst...@gmail.com>: > The version is 0.1.1 - I had no problem when I did the upgrade - no > special repository needed > > בתאריך 10 במרץ 2017 09:58, "Guillaume Nodet" <gno...@apache.org> כתב: > > I can't find this artifact in maven central. >> Could you add the needed repository please ? >> >> 2017-03-02 21:00 GMT+01:00 <lgoldst...@apache.org>: >> >>> Repository: mina-sshd >>> Updated Branches: >>> refs/heads/master 8e255459a -> cbb92d2a8 >>> >>> >>> [SSHD-727] Upgrade used EdDSA artifact version to 1.1 >>> >>> >>> Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo >>> Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/cbb92d2a >>> Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/cbb92d2a >>> Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/cbb92d2a >>> >>> Branch: refs/heads/master >>> Commit: cbb92d2a89600ee8a34abdf7d84cdc08291dcbf5 >>> Parents: 22dc7c3 >>> Author: Lyor Goldstein <lyor.goldst...@gmail.com> >>> Authored: Thu Mar 2 21:47:51 2017 +0200 >>> Committer: Lyor Goldstein <lyor.goldst...@gmail.com> >>> Committed: Thu Mar 2 22:01:14 2017 +0200 >>> >>> ---------------------------------------------------------------------- >>> pom.xml | 6 +- >>> .../common/util/security/SecurityUtils.java | 31 +-- >>> .../security/eddsa/EdDSASecurityProvider.java | 205 >>> ------------------- >>> .../eddsa/EdDSASecurityProviderRegistrar.java | 2 +- >>> .../eddsa/EdDSASecurityProviderUtils.java | 197 >>> ++++++++++++++++++ >>> .../OpenSSHEd25519PrivateKeyEntryDecoder.java | 2 +- >>> .../common/signature/SignaturesDevelopment.java | 6 +- >>> .../util/security/eddsa/Ed25519VectorsTest.java | 12 +- >>> .../EdDSASecurityProviderRegistrarTest.java | 2 + >>> 9 files changed, 229 insertions(+), 234 deletions(-) >>> ---------------------------------------------------------------------- >>> >>> >>> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/cbb92d2a/pom.xml >>> ---------------------------------------------------------------------- >>> diff --git a/pom.xml b/pom.xml >>> index 806f7fb..06ec711 100644 >>> --- a/pom.xml >>> +++ b/pom.xml >>> @@ -104,7 +104,7 @@ >>> <gmaven.plugin.version>2.0</gmaven.plugin.version> >>> <groovy.major.version>2</groovy.major.version> >>> <groovy.minor.version>4</groovy.minor.version> >>> - <groovy.release.version>8</groovy.release.version> >>> + <groovy.release.version>9</groovy.release.version> >>> <groovy.compliance.level>2.0</groovy.compliance.level> >>> <groovy.version>${groovy.major.version}.${groovy.minor.vers >>> ion}.${groovy.release.version}</groovy.version> >>> >>> @@ -202,7 +202,7 @@ >>> <dependency> >>> <groupId>net.i2p.crypto</groupId> >>> <artifactId>eddsa</artifactId> >>> - <version>0.1.0</version> >>> + <version>0.1.1</version> >>> </dependency> >>> >>> <dependency> >>> @@ -594,7 +594,7 @@ >>> <dependency> >>> <groupId>com.puppycrawl.tools</groupId> >>> <artifactId>checkstyle</artifactId> >>> - <version>7.5.1</version> >>> + <version>7.6</version> >>> <exclusions> >>> <!-- MCHECKSTYLE-156 --> >>> <exclusion> >>> >>> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/cbb92d >>> 2a/sshd-core/src/main/java/org/apache/sshd/common/util/secur >>> ity/SecurityUtils.java >>> ---------------------------------------------------------------------- >>> diff --git >>> a/sshd-core/src/main/java/org/apache/sshd/common/util/security/SecurityUtils.java >>> b/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/SecurityUtils.java >>> index 6aff088..b86bcc3 100644 >>> --- a/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/SecurityUtils.java >>> +++ b/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/SecurityUtils.java >>> @@ -73,7 +73,7 @@ import org.apache.sshd.common.util.buffer.Buffer; >>> import org.apache.sshd.common.util.security.bouncycastle.BouncyCast >>> leGeneratorHostKeyProvider; >>> import org.apache.sshd.common.util.security.bouncycastle.BouncyCast >>> leKeyPairResourceParser; >>> import org.apache.sshd.common.util.security.bouncycastle.BouncyCast >>> leRandomFactory; >>> -import org.apache.sshd.common.util.security.eddsa.EdDSASecurityProv >>> ider; >>> +import org.apache.sshd.common.util.security.eddsa.EdDSASecurityProv >>> iderUtils; >>> import org.apache.sshd.common.util.threads.ThreadUtils; >>> import org.apache.sshd.server.keyprovider.AbstractGeneratorHostKeyP >>> rovider; >>> import org.slf4j.Logger; >>> @@ -91,12 +91,13 @@ public final class SecurityUtils { >>> public static final String BOUNCY_CASTLE = "BC"; >>> >>> /** >>> - * EDDSA support >>> + * EDDSA support - should match {@code EdDSAKey.KEY_ALGORITHM} >>> */ >>> public static final String EDDSA = "EdDSA"; >>> >>> // A copy-paste from the original, but we don't want to drag the >>> classes into the classpath >>> - public static final String CURVE_ED25519_SHA512 = "ed25519-sha-512"; >>> + // See EdDSANamedCurveTable.CURVE_ED25519_SHA512 >>> + public static final String CURVE_ED25519_SHA512 = >>> "SHA512withEd25519"; >>> >>> /** >>> * System property used to configure the value for the maximum >>> supported Diffie-Hellman >>> @@ -538,7 +539,7 @@ public final class SecurityUtils { >>> throw new UnsupportedOperationException(EDDSA + " provider >>> N/A"); >>> } >>> >>> - return EdDSASecurityProvider.getEDDSAPublicKeyEntryDecoder(); >>> + return EdDSASecurityProviderUtils.get >>> EDDSAPublicKeyEntryDecoder(); >>> } >>> >>> public static PrivateKeyEntryDecoder<? extends PublicKey, ? extends >>> PrivateKey> getOpenSSHEDDSAPrivateKeyEntryDecoder() { >>> @@ -546,35 +547,35 @@ public final class SecurityUtils { >>> throw new UnsupportedOperationException(EDDSA + " provider >>> N/A"); >>> } >>> >>> - return EdDSASecurityProvider.getOpenS >>> SHEDDSAPrivateKeyEntryDecoder(); >>> + return EdDSASecurityProviderUtils.get >>> OpenSSHEDDSAPrivateKeyEntryDecoder(); >>> } >>> >>> public static org.apache.sshd.common.signature.Signature >>> getEDDSASigner() { >>> if (isEDDSACurveSupported()) { >>> - return EdDSASecurityProvider.getEDDSASignature(); >>> + return EdDSASecurityProviderUtils.getEDDSASignature(); >>> } >>> >>> throw new UnsupportedOperationException(EDDSA + " Signer not >>> available"); >>> } >>> >>> public static int getEDDSAKeySize(Key key) { >>> - return EdDSASecurityProvider.getEDDSAKeySize(key); >>> + return EdDSASecurityProviderUtils.getEDDSAKeySize(key); >>> } >>> >>> public static Class<? extends PublicKey> getEDDSAPublicKeyType() { >>> - return isEDDSACurveSupported() ? >>> EdDSASecurityProvider.getEDDSAPublicKeyType() >>> : PublicKey.class; >>> + return isEDDSACurveSupported() ? >>> EdDSASecurityProviderUtils.getEDDSAPublicKeyType() >>> : PublicKey.class; >>> } >>> >>> public static Class<? extends PrivateKey> getEDDSAPrivateKeyType() { >>> - return isEDDSACurveSupported() ? >>> EdDSASecurityProvider.getEDDSAPrivateKeyType() >>> : PrivateKey.class; >>> + return isEDDSACurveSupported() ? >>> EdDSASecurityProviderUtils.getEDDSAPrivateKeyType() >>> : PrivateKey.class; >>> } >>> >>> public static boolean compareEDDSAPPublicKeys(PublicKey k1, >>> PublicKey k2) { >>> - return isEDDSACurveSupported() ? >>> EdDSASecurityProvider.compareEDDSAPPublicKeys(k1, >>> k2) : false; >>> + return isEDDSACurveSupported() ? >>> EdDSASecurityProviderUtils.compareEDDSAPPublicKeys(k1, >>> k2) : false; >>> } >>> >>> public static boolean compareEDDSAPrivateKeys(PrivateKey k1, >>> PrivateKey k2) { >>> - return isEDDSACurveSupported() ? >>> EdDSASecurityProvider.compareEDDSAPrivateKeys(k1, >>> k2) : false; >>> + return isEDDSACurveSupported() ? >>> EdDSASecurityProviderUtils.compareEDDSAPrivateKeys(k1, >>> k2) : false; >>> } >>> >>> public static PublicKey recoverEDDSAPublicKey(PrivateKey key) >>> throws GeneralSecurityException { >>> @@ -582,7 +583,7 @@ public final class SecurityUtils { >>> throw new NoSuchAlgorithmException(EDDSA + " provider not >>> supported"); >>> } >>> >>> - return EdDSASecurityProvider.recoverEDDSAPublicKey(key); >>> + return EdDSASecurityProviderUtils.recoverEDDSAPublicKey(key); >>> } >>> >>> public static PublicKey generateEDDSAPublicKey(String keyType, >>> byte[] seed) throws GeneralSecurityException { >>> @@ -594,7 +595,7 @@ public final class SecurityUtils { >>> throw new NoSuchAlgorithmException(EDDSA + " provider not >>> supported"); >>> } >>> >>> - return EdDSASecurityProvider.generateEDDSAPublicKey(seed); >>> + return EdDSASecurityProviderUtils.generateEDDSAPublicKey(seed); >>> } >>> >>> public static <B extends Buffer> B putRawEDDSAPublicKey(B buffer, >>> PublicKey key) { >>> @@ -602,7 +603,7 @@ public final class SecurityUtils { >>> throw new UnsupportedOperationException(EDDSA + " provider >>> not supported"); >>> } >>> >>> - return EdDSASecurityProvider.putRawEDDSAPublicKey(buffer, key); >>> + return EdDSASecurityProviderUtils.putRawEDDSAPublicKey(buffer, >>> key); >>> } >>> >>> public static <B extends Buffer> B putEDDSAKeyPair(B buffer, >>> KeyPair kp) { >>> @@ -614,7 +615,7 @@ public final class SecurityUtils { >>> throw new UnsupportedOperationException(EDDSA + " provider >>> not supported"); >>> } >>> >>> - return EdDSASecurityProvider.putEDDSAKeyPair(buffer, pubKey, >>> prvKey); >>> + return EdDSASecurityProviderUtils.putEDDSAKeyPair(buffer, >>> pubKey, prvKey); >>> } >>> >>> public static KeyPair extractEDDSAKeyPair(Buffer buffer, String >>> keyType) throws GeneralSecurityException { >>> >>> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/cbb92d >>> 2a/sshd-core/src/main/java/org/apache/sshd/common/util/secur >>> ity/eddsa/EdDSASecurityProvider.java >>> ---------------------------------------------------------------------- >>> diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/eddsa/EdDSASecurityProvider.java b/sshd-core/src/main/java/org/ >>> apache/sshd/common/util/security/eddsa/EdDSASecurityProvider.java >>> deleted file mode 100644 >>> index e039547..0000000 >>> --- a/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/eddsa/EdDSASecurityProvider.java >>> +++ /dev/null >>> @@ -1,205 +0,0 @@ >>> -/* >>> - * Licensed to the Apache Software Foundation (ASF) under one >>> - * or more contributor license agreements. See the NOTICE file >>> - * distributed with this work for additional information >>> - * regarding copyright ownership. The ASF licenses this file >>> - * to you under the Apache License, Version 2.0 (the >>> - * "License"); you may not use this file except in compliance >>> - * with the License. You may obtain a copy of the License at >>> - * >>> - * http://www.apache.org/licenses/LICENSE-2.0 >>> - * >>> - * Unless required by applicable law or agreed to in writing, >>> - * software distributed under the License is distributed on an >>> - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >>> - * KIND, either express or implied. See the License for the >>> - * specific language governing permissions and limitations >>> - * under the License. >>> - */ >>> -package org.apache.sshd.common.util.security.eddsa; >>> - >>> -import java.security.GeneralSecurityException; >>> -import java.security.InvalidKeyException; >>> -import java.security.Key; >>> -import java.security.KeyFactory; >>> -import java.security.NoSuchAlgorithmException; >>> -import java.security.PrivateKey; >>> -import java.security.Provider; >>> -import java.security.PublicKey; >>> -import java.util.Arrays; >>> -import java.util.Objects; >>> - >>> -import net.i2p.crypto.eddsa.EdDSAKey; >>> -import net.i2p.crypto.eddsa.EdDSAPrivateKey; >>> -import net.i2p.crypto.eddsa.EdDSAPublicKey; >>> -import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable; >>> -import net.i2p.crypto.eddsa.spec.EdDSAParameterSpec; >>> -import net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec; >>> -import net.i2p.crypto.eddsa.spec.EdDSAPublicKeySpec; >>> - >>> -import org.apache.sshd.common.config.keys.PrivateKeyEntryDecoder; >>> -import org.apache.sshd.common.config.keys.PublicKeyEntryDecoder; >>> -import org.apache.sshd.common.keyprovider.KeyPairProvider; >>> -import org.apache.sshd.common.util.ValidateUtils; >>> -import org.apache.sshd.common.util.buffer.Buffer; >>> -import org.apache.sshd.common.util.security.SecurityUtils; >>> - >>> -/** >>> - * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD >>> Project</a> >>> - */ >>> -public class EdDSASecurityProvider extends Provider { >>> - private static final long serialVersionUID = -6183277432144104981L; >>> - >>> - public EdDSASecurityProvider() { >>> - super(SecurityUtils.EDDSA, 0.1, "net.i2p security provider >>> wrapper"); >>> - >>> - // see https://docs.oracle.com/javase >>> /8/docs/technotes/guides/security/crypto/HowToImplAProvider.html >>> - put("KeyPairGenerator." + SecurityUtils.EDDSA, >>> "net.i2p.crypto.eddsa.KeyPairGenerator"); >>> - put("KeyFactory." + SecurityUtils.EDDSA, >>> "net.i2p.crypto.eddsa.KeyFactory"); >>> - put("Signature." + EdDSANamedCurveTable.CURVE_ED25519_SHA512, >>> "net.i2p.crypto.eddsa.EdDSAEngine"); >>> - } >>> - >>> - public static Class<? extends PublicKey> getEDDSAPublicKeyType() { >>> - return EdDSAPublicKey.class; >>> - } >>> - >>> - public static Class<? extends PrivateKey> getEDDSAPrivateKeyType() { >>> - return EdDSAPrivateKey.class; >>> - } >>> - >>> - public static int getEDDSAKeySize(Key key) { >>> - return (SecurityUtils.isEDDSACurveSupported() && (key >>> instanceof EdDSAKey)) ? 256 : -1; >>> - } >>> - >>> - public static boolean compareEDDSAPPublicKeys(PublicKey k1, >>> PublicKey k2) { >>> - if (!SecurityUtils.isEDDSACurveSupported()) { >>> - return false; >>> - } >>> - >>> - if ((k1 instanceof EdDSAPublicKey) && (k2 instanceof >>> EdDSAPublicKey)) { >>> - if (Objects.equals(k1, k2)) { >>> - return true; >>> - } else if (k1 == null || k2 == null) { >>> - return false; // both null is covered by >>> Objects#equals >>> - } >>> - >>> - EdDSAPublicKey ed1 = (EdDSAPublicKey) k1; >>> - EdDSAPublicKey ed2 = (EdDSAPublicKey) k2; >>> - return Arrays.equals(ed1.getAbyte(), ed2.getAbyte()) >>> - && compareEDDSAKeyParams(ed1.getParams(), >>> ed2.getParams()); >>> - } >>> - >>> - return false; >>> - } >>> - >>> - public static boolean isEDDSASignatureAlgorithm(String algorithm) { >>> - return EdDSANamedCurveTable.CURVE_ED2 >>> 5519_SHA512.equalsIgnoreCase(algorithm); >>> - } >>> - >>> - public static EdDSAPublicKey recoverEDDSAPublicKey(PrivateKey key) >>> throws GeneralSecurityException { >>> - ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), >>> SecurityUtils.EDDSA + " not supported"); >>> - if (!(key instanceof EdDSAPrivateKey)) { >>> - throw new InvalidKeyException("Private key is not " + >>> SecurityUtils.EDDSA); >>> - } >>> - >>> - EdDSAPrivateKey prvKey = (EdDSAPrivateKey) key; >>> - EdDSAPublicKeySpec keySpec = new >>> EdDSAPublicKeySpec(prvKey.getSeed(), >>> prvKey.getParams()); >>> - KeyFactory factory = SecurityUtils.getKeyFactory(Se >>> curityUtils.EDDSA); >>> - return EdDSAPublicKey.class.cast(fact >>> ory.generatePublic(keySpec)); >>> - } >>> - >>> - public static org.apache.sshd.common.signature.Signature >>> getEDDSASignature() { >>> - ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), >>> SecurityUtils.EDDSA + " not supported"); >>> - return new SignatureEd25519(); >>> - } >>> - >>> - public static boolean isEDDSAKeyFactoryAlgorithm(String algorithm) >>> { >>> - return SecurityUtils.EDDSA.equalsIgnoreCase(algorithm); >>> - } >>> - >>> - public static boolean isEDDSAKeyPairGeneratorAlgorithm(String >>> algorithm) { >>> - return SecurityUtils.EDDSA.equalsIgnoreCase(algorithm); >>> - } >>> - >>> - public static PublicKeyEntryDecoder<? extends PublicKey, ? extends >>> PrivateKey> getEDDSAPublicKeyEntryDecoder() { >>> - ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), >>> SecurityUtils.EDDSA + " not supported"); >>> - return Ed25519PublicKeyDecoder.INSTANCE; >>> - } >>> - >>> - public static PrivateKeyEntryDecoder<? extends PublicKey, ? extends >>> PrivateKey> getOpenSSHEDDSAPrivateKeyEntryDecoder() { >>> - ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), >>> SecurityUtils.EDDSA + " not supported"); >>> - return OpenSSHEd25519PrivateKeyEntryDecoder.INSTANCE; >>> - } >>> - >>> - public static boolean compareEDDSAPrivateKeys(PrivateKey k1, >>> PrivateKey k2) { >>> - if (!SecurityUtils.isEDDSACurveSupported()) { >>> - return false; >>> - } >>> - >>> - if ((k1 instanceof EdDSAPrivateKey) && (k2 instanceof >>> EdDSAPrivateKey)) { >>> - if (Objects.equals(k1, k2)) { >>> - return true; >>> - } else if (k1 == null || k2 == null) { >>> - return false; // both null is covered by >>> Objects#equals >>> - } >>> - >>> - EdDSAPrivateKey ed1 = (EdDSAPrivateKey) k1; >>> - EdDSAPrivateKey ed2 = (EdDSAPrivateKey) k2; >>> - return Arrays.equals(ed1.getSeed(), ed2.getSeed()) >>> - && compareEDDSAKeyParams(ed1.getParams(), >>> ed2.getParams()); >>> - } >>> - >>> - return false; >>> - } >>> - >>> - public static boolean compareEDDSAKeyParams(EdDSAParameterSpec s1, >>> EdDSAParameterSpec s2) { >>> - if (Objects.equals(s1, s2)) { >>> - return true; >>> - } else if (s1 == null || s2 == null) { >>> - return false; // both null is covered by Objects#equals >>> - } else { >>> - return Objects.equals(s1.getHashAlgorithm(), >>> s2.getHashAlgorithm()) >>> - && Objects.equals(s1.getCurve(), s2.getCurve()) >>> - && Objects.equals(s1.getB(), s2.getB()); >>> - } >>> - } >>> - >>> - public static PublicKey generateEDDSAPublicKey(byte[] seed) throws >>> GeneralSecurityException { >>> - if (!SecurityUtils.isEDDSACurveSupported()) { >>> - throw new NoSuchAlgorithmException(SecurityUtils.EDDSA + " >>> not supported"); >>> - } >>> - >>> - EdDSAParameterSpec params = EdDSANamedCurveTable.getByName >>> (EdDSANamedCurveTable.CURVE_ED25519_SHA512); >>> - EdDSAPublicKeySpec keySpec = new EdDSAPublicKeySpec(seed, >>> params); >>> - KeyFactory factory = SecurityUtils.getKeyFactory(Se >>> curityUtils.EDDSA); >>> - return factory.generatePublic(keySpec); >>> - } >>> - >>> - public static PrivateKey generateEDDSAPrivateKey(byte[] seed) >>> throws GeneralSecurityException { >>> - if (!SecurityUtils.isEDDSACurveSupported()) { >>> - throw new NoSuchAlgorithmException(SecurityUtils.EDDSA + " >>> not supported"); >>> - } >>> - >>> - EdDSAParameterSpec params = EdDSANamedCurveTable.getByName >>> (EdDSANamedCurveTable.CURVE_ED25519_SHA512); >>> - EdDSAPrivateKeySpec keySpec = new EdDSAPrivateKeySpec(seed, >>> params); >>> - KeyFactory factory = SecurityUtils.getKeyFactory(Se >>> curityUtils.EDDSA); >>> - return factory.generatePrivate(keySpec); >>> - } >>> - >>> - public static <B extends Buffer> B putRawEDDSAPublicKey(B buffer, >>> PublicKey key) { >>> - ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), >>> SecurityUtils.EDDSA + " not supported"); >>> - EdDSAPublicKey edKey = ValidateUtils.checkInstanceOf(key, >>> EdDSAPublicKey.class, "Not an EDDSA public key: %s", key); >>> - byte[] seed = Ed25519PublicKeyDecoder.getSeedValue(edKey); >>> - ValidateUtils.checkNotNull(seed, "No seed extracted from key: >>> %s", edKey.getA()); >>> - buffer.putString(KeyPairProvider.SSH_ED25519); >>> - buffer.putBytes(seed); >>> - return buffer; >>> - } >>> - >>> - public static <B extends Buffer> B putEDDSAKeyPair(B buffer, >>> PublicKey pubKey, PrivateKey prvKey) { >>> - ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), >>> SecurityUtils.EDDSA + " not supported"); >>> - ValidateUtils.checkInstanceOf(pubKey, EdDSAPublicKey.class, >>> "Not an EDDSA public key: %s", pubKey); >>> - ValidateUtils.checkInstanceOf(prvKey, EdDSAPrivateKey.class, >>> "Not an EDDSA private key: %s", prvKey); >>> - throw new UnsupportedOperationException("Full SSHD-440 >>> implementation N/A"); >>> - } >>> -} >>> \ No newline at end of file >>> >>> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/cbb92d >>> 2a/sshd-core/src/main/java/org/apache/sshd/common/util/secur >>> ity/eddsa/EdDSASecurityProviderRegistrar.java >>> ---------------------------------------------------------------------- >>> diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/eddsa/EdDSASecurityProviderRegistrar.java >>> b/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/eddsa/EdDSASecurityProviderRegistrar.java >>> index b463d27..2bb3f95 100644 >>> --- a/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/eddsa/EdDSASecurityProviderRegistrar.java >>> +++ b/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/eddsa/EdDSASecurityProviderRegistrar.java >>> @@ -36,7 +36,7 @@ import org.apache.sshd.common.util.th >>> reads.ThreadUtils; >>> * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD >>> Project</a> >>> */ >>> public class EdDSASecurityProviderRegistrar extends >>> AbstractSecurityProviderRegistrar { >>> - public static final String PROVIDER_CLASS = >>> "org.apache.sshd.common.util.security.eddsa.EdDSASecurityProvider"; >>> + public static final String PROVIDER_CLASS = >>> "net.i2p.crypto.eddsa.EdDSASecurityProvider"; >>> // Do not define a static registrar instance to minimize class >>> loading issues >>> private final AtomicReference<Boolean> supportHolder = new >>> AtomicReference<>(null); >>> >>> >>> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/cbb92d >>> 2a/sshd-core/src/main/java/org/apache/sshd/common/util/secur >>> ity/eddsa/EdDSASecurityProviderUtils.java >>> ---------------------------------------------------------------------- >>> diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/eddsa/EdDSASecurityProviderUtils.java b/sshd-core/src/main/java/org/ >>> apache/sshd/common/util/security/eddsa/EdDSASecurityProviderUtils.java >>> new file mode 100644 >>> index 0000000..b5d79f0 >>> --- /dev/null >>> +++ b/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/eddsa/EdDSASecurityProviderUtils.java >>> @@ -0,0 +1,197 @@ >>> +/* >>> + * Licensed to the Apache Software Foundation (ASF) under one >>> + * or more contributor license agreements. See the NOTICE file >>> + * distributed with this work for additional information >>> + * regarding copyright ownership. The ASF licenses this file >>> + * to you under the Apache License, Version 2.0 (the >>> + * "License"); you may not use this file except in compliance >>> + * with the License. You may obtain a copy of the License at >>> + * >>> + * http://www.apache.org/licenses/LICENSE-2.0 >>> + * >>> + * Unless required by applicable law or agreed to in writing, >>> + * software distributed under the License is distributed on an >>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >>> + * KIND, either express or implied. See the License for the >>> + * specific language governing permissions and limitations >>> + * under the License. >>> + */ >>> +package org.apache.sshd.common.util.security.eddsa; >>> + >>> +import java.security.GeneralSecurityException; >>> +import java.security.InvalidKeyException; >>> +import java.security.Key; >>> +import java.security.KeyFactory; >>> +import java.security.NoSuchAlgorithmException; >>> +import java.security.PrivateKey; >>> +import java.security.PublicKey; >>> +import java.util.Arrays; >>> +import java.util.Objects; >>> + >>> +import net.i2p.crypto.eddsa.EdDSAKey; >>> +import net.i2p.crypto.eddsa.EdDSAPrivateKey; >>> +import net.i2p.crypto.eddsa.EdDSAPublicKey; >>> +import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable; >>> +import net.i2p.crypto.eddsa.spec.EdDSAParameterSpec; >>> +import net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec; >>> +import net.i2p.crypto.eddsa.spec.EdDSAPublicKeySpec; >>> + >>> +import org.apache.sshd.common.config.keys.PrivateKeyEntryDecoder; >>> +import org.apache.sshd.common.config.keys.PublicKeyEntryDecoder; >>> +import org.apache.sshd.common.keyprovider.KeyPairProvider; >>> +import org.apache.sshd.common.util.ValidateUtils; >>> +import org.apache.sshd.common.util.buffer.Buffer; >>> +import org.apache.sshd.common.util.security.SecurityUtils; >>> + >>> +/** >>> + * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD >>> Project</a> >>> + */ >>> +public final class EdDSASecurityProviderUtils { >>> + private EdDSASecurityProviderUtils() { >>> + throw new UnsupportedOperationException("No instance"); >>> + } >>> + >>> + public static Class<? extends PublicKey> getEDDSAPublicKeyType() { >>> + return EdDSAPublicKey.class; >>> + } >>> + >>> + public static Class<? extends PrivateKey> getEDDSAPrivateKeyType() { >>> + return EdDSAPrivateKey.class; >>> + } >>> + >>> + public static int getEDDSAKeySize(Key key) { >>> + return (SecurityUtils.isEDDSACurveSupported() && (key >>> instanceof EdDSAKey)) ? 256 : -1; >>> + } >>> + >>> + public static boolean compareEDDSAPPublicKeys(PublicKey k1, >>> PublicKey k2) { >>> + if (!SecurityUtils.isEDDSACurveSupported()) { >>> + return false; >>> + } >>> + >>> + if ((k1 instanceof EdDSAPublicKey) && (k2 instanceof >>> EdDSAPublicKey)) { >>> + if (Objects.equals(k1, k2)) { >>> + return true; >>> + } else if (k1 == null || k2 == null) { >>> + return false; // both null is covered by >>> Objects#equals >>> + } >>> + >>> + EdDSAPublicKey ed1 = (EdDSAPublicKey) k1; >>> + EdDSAPublicKey ed2 = (EdDSAPublicKey) k2; >>> + return Arrays.equals(ed1.getAbyte(), ed2.getAbyte()) >>> + && compareEDDSAKeyParams(ed1.getParams(), >>> ed2.getParams()); >>> + } >>> + >>> + return false; >>> + } >>> + >>> + public static boolean isEDDSASignatureAlgorithm(String algorithm) { >>> + return EdDSANamedCurveTable.CURVE_ED2 >>> 5519_SHA512.equalsIgnoreCase(algorithm); >>> + } >>> + >>> + public static EdDSAPublicKey recoverEDDSAPublicKey(PrivateKey key) >>> throws GeneralSecurityException { >>> + ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), >>> SecurityUtils.EDDSA + " not supported"); >>> + if (!(key instanceof EdDSAPrivateKey)) { >>> + throw new InvalidKeyException("Private key is not " + >>> SecurityUtils.EDDSA); >>> + } >>> + >>> + EdDSAPrivateKey prvKey = (EdDSAPrivateKey) key; >>> + EdDSAPublicKeySpec keySpec = new >>> EdDSAPublicKeySpec(prvKey.getSeed(), >>> prvKey.getParams()); >>> + KeyFactory factory = SecurityUtils.getKeyFactory(Se >>> curityUtils.EDDSA); >>> + return EdDSAPublicKey.class.cast(fact >>> ory.generatePublic(keySpec)); >>> + } >>> + >>> + public static org.apache.sshd.common.signature.Signature >>> getEDDSASignature() { >>> + ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), >>> SecurityUtils.EDDSA + " not supported"); >>> + return new SignatureEd25519(); >>> + } >>> + >>> + public static boolean isEDDSAKeyFactoryAlgorithm(String algorithm) >>> { >>> + return SecurityUtils.EDDSA.equalsIgnoreCase(algorithm); >>> + } >>> + >>> + public static boolean isEDDSAKeyPairGeneratorAlgorithm(String >>> algorithm) { >>> + return SecurityUtils.EDDSA.equalsIgnoreCase(algorithm); >>> + } >>> + >>> + public static PublicKeyEntryDecoder<? extends PublicKey, ? extends >>> PrivateKey> getEDDSAPublicKeyEntryDecoder() { >>> + ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), >>> SecurityUtils.EDDSA + " not supported"); >>> + return Ed25519PublicKeyDecoder.INSTANCE; >>> + } >>> + >>> + public static PrivateKeyEntryDecoder<? extends PublicKey, ? extends >>> PrivateKey> getOpenSSHEDDSAPrivateKeyEntryDecoder() { >>> + ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), >>> SecurityUtils.EDDSA + " not supported"); >>> + return OpenSSHEd25519PrivateKeyEntryDecoder.INSTANCE; >>> + } >>> + >>> + public static boolean compareEDDSAPrivateKeys(PrivateKey k1, >>> PrivateKey k2) { >>> + if (!SecurityUtils.isEDDSACurveSupported()) { >>> + return false; >>> + } >>> + >>> + if ((k1 instanceof EdDSAPrivateKey) && (k2 instanceof >>> EdDSAPrivateKey)) { >>> + if (Objects.equals(k1, k2)) { >>> + return true; >>> + } else if (k1 == null || k2 == null) { >>> + return false; // both null is covered by >>> Objects#equals >>> + } >>> + >>> + EdDSAPrivateKey ed1 = (EdDSAPrivateKey) k1; >>> + EdDSAPrivateKey ed2 = (EdDSAPrivateKey) k2; >>> + return Arrays.equals(ed1.getSeed(), ed2.getSeed()) >>> + && compareEDDSAKeyParams(ed1.getParams(), >>> ed2.getParams()); >>> + } >>> + >>> + return false; >>> + } >>> + >>> + public static boolean compareEDDSAKeyParams(EdDSAParameterSpec s1, >>> EdDSAParameterSpec s2) { >>> + if (Objects.equals(s1, s2)) { >>> + return true; >>> + } else if (s1 == null || s2 == null) { >>> + return false; // both null is covered by Objects#equals >>> + } else { >>> + return Objects.equals(s1.getHashAlgorithm(), >>> s2.getHashAlgorithm()) >>> + && Objects.equals(s1.getCurve(), s2.getCurve()) >>> + && Objects.equals(s1.getB(), s2.getB()); >>> + } >>> + } >>> + >>> + public static PublicKey generateEDDSAPublicKey(byte[] seed) throws >>> GeneralSecurityException { >>> + if (!SecurityUtils.isEDDSACurveSupported()) { >>> + throw new NoSuchAlgorithmException(SecurityUtils.EDDSA + " >>> not supported"); >>> + } >>> + >>> + EdDSAParameterSpec params = EdDSANamedCurveTable.getByName >>> (EdDSANamedCurveTable.CURVE_ED25519_SHA512); >>> + EdDSAPublicKeySpec keySpec = new EdDSAPublicKeySpec(seed, >>> params); >>> + KeyFactory factory = SecurityUtils.getKeyFactory(Se >>> curityUtils.EDDSA); >>> + return factory.generatePublic(keySpec); >>> + } >>> + >>> + public static PrivateKey generateEDDSAPrivateKey(byte[] seed) >>> throws GeneralSecurityException { >>> + if (!SecurityUtils.isEDDSACurveSupported()) { >>> + throw new NoSuchAlgorithmException(SecurityUtils.EDDSA + " >>> not supported"); >>> + } >>> + >>> + EdDSAParameterSpec params = EdDSANamedCurveTable.getByName >>> (EdDSANamedCurveTable.CURVE_ED25519_SHA512); >>> + EdDSAPrivateKeySpec keySpec = new EdDSAPrivateKeySpec(seed, >>> params); >>> + KeyFactory factory = SecurityUtils.getKeyFactory(Se >>> curityUtils.EDDSA); >>> + return factory.generatePrivate(keySpec); >>> + } >>> + >>> + public static <B extends Buffer> B putRawEDDSAPublicKey(B buffer, >>> PublicKey key) { >>> + ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), >>> SecurityUtils.EDDSA + " not supported"); >>> + EdDSAPublicKey edKey = ValidateUtils.checkInstanceOf(key, >>> EdDSAPublicKey.class, "Not an EDDSA public key: %s", key); >>> + byte[] seed = Ed25519PublicKeyDecoder.getSeedValue(edKey); >>> + ValidateUtils.checkNotNull(seed, "No seed extracted from key: >>> %s", edKey.getA()); >>> + buffer.putString(KeyPairProvider.SSH_ED25519); >>> + buffer.putBytes(seed); >>> + return buffer; >>> + } >>> + >>> + public static <B extends Buffer> B putEDDSAKeyPair(B buffer, >>> PublicKey pubKey, PrivateKey prvKey) { >>> + ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), >>> SecurityUtils.EDDSA + " not supported"); >>> + ValidateUtils.checkInstanceOf(pubKey, EdDSAPublicKey.class, >>> "Not an EDDSA public key: %s", pubKey); >>> + ValidateUtils.checkInstanceOf(prvKey, EdDSAPrivateKey.class, >>> "Not an EDDSA private key: %s", prvKey); >>> + throw new UnsupportedOperationException("Full SSHD-440 >>> implementation N/A"); >>> + } >>> +} >>> \ No newline at end of file >>> >>> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/cbb92d >>> 2a/sshd-core/src/main/java/org/apache/sshd/common/util/secur >>> ity/eddsa/OpenSSHEd25519PrivateKeyEntryDecoder.java >>> ---------------------------------------------------------------------- >>> diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/eddsa/OpenSSHEd25519PrivateKeyEntryDecoder.java >>> b/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/eddsa/OpenSSHEd25519PrivateKeyEntryDecoder.java >>> index b05a4cc..e5ae0ac 100644 >>> --- a/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/eddsa/OpenSSHEd25519PrivateKeyEntryDecoder.java >>> +++ b/sshd-core/src/main/java/org/apache/sshd/common/util/securi >>> ty/eddsa/OpenSSHEd25519PrivateKeyEntryDecoder.java >>> @@ -98,7 +98,7 @@ public class OpenSSHEd25519PrivateKeyEntryDecoder >>> extends AbstractPrivateKeyEntr >>> >>> @Override >>> public EdDSAPublicKey recoverPublicKey(EdDSAPrivateKey prvKey) >>> throws GeneralSecurityException { >>> - return EdDSASecurityProvider.recoverEDDSAPublicKey(prvKey); >>> + return EdDSASecurityProviderUtils.rec >>> overEDDSAPublicKey(prvKey); >>> } >>> >>> @Override >>> >>> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/cbb92d >>> 2a/sshd-core/src/test/java/org/apache/sshd/common/signature/ >>> SignaturesDevelopment.java >>> ---------------------------------------------------------------------- >>> diff --git >>> a/sshd-core/src/test/java/org/apache/sshd/common/signature/SignaturesDevelopment.java >>> b/sshd-core/src/test/java/org/apache/sshd/common/signature/S >>> ignaturesDevelopment.java >>> index 6c4929a..180e997 100644 >>> --- a/sshd-core/src/test/java/org/apache/sshd/common/signature/S >>> ignaturesDevelopment.java >>> +++ b/sshd-core/src/test/java/org/apache/sshd/common/signature/S >>> ignaturesDevelopment.java >>> @@ -25,7 +25,7 @@ import java.security.PublicKey; >>> >>> import org.apache.sshd.common.util.GenericUtils; >>> import org.apache.sshd.common.util.buffer.BufferUtils; >>> -import org.apache.sshd.common.util.security.eddsa.EdDSASecurityProv >>> ider; >>> +import org.apache.sshd.common.util.security.eddsa.EdDSASecurityProv >>> iderUtils; >>> import org.apache.sshd.util.test.BaseTestSupport; >>> >>> /** >>> @@ -64,9 +64,9 @@ public class SignaturesDevelopment extends >>> BaseTestSupport { >>> SignatureFactory factory = BuiltinSignatures.resolveFacto >>> ry(args[0]); >>> // TODO recover public/private keys according to factory name >>> byte[] publicKey = BufferUtils.decodeHex(':', args[1]); >>> - PublicKey pubKey = EdDSASecurityProvider.generate >>> EDDSAPublicKey(publicKey); >>> + PublicKey pubKey = EdDSASecurityProviderUtils.gen >>> erateEDDSAPublicKey(publicKey); >>> byte[] privateKey = BufferUtils.decodeHex(':', args[2]); >>> - PrivateKey prvKey = EdDSASecurityProvider.generate >>> EDDSAPrivateKey(privateKey); >>> + PrivateKey prvKey = EdDSASecurityProviderUtils.gen >>> erateEDDSAPrivateKey(privateKey); >>> String op = args[3]; >>> byte[] data = BufferUtils.decodeHex(':', args[4]); >>> byte[] signature = GenericUtils.EMPTY_BYTE_ARRAY; >>> >>> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/cbb92d >>> 2a/sshd-core/src/test/java/org/apache/sshd/common/util/secur >>> ity/eddsa/Ed25519VectorsTest.java >>> ---------------------------------------------------------------------- >>> diff --git a/sshd-core/src/test/java/org/apache/sshd/common/util/securi >>> ty/eddsa/Ed25519VectorsTest.java b/sshd-core/src/test/java/org/ >>> apache/sshd/common/util/security/eddsa/Ed25519VectorsTest.java >>> index fab3294..b58aad3 100644 >>> --- a/sshd-core/src/test/java/org/apache/sshd/common/util/securi >>> ty/eddsa/Ed25519VectorsTest.java >>> +++ b/sshd-core/src/test/java/org/apache/sshd/common/util/securi >>> ty/eddsa/Ed25519VectorsTest.java >>> @@ -60,9 +60,9 @@ public class Ed25519VectorsTest extends >>> BaseTestSupport { >>> public Ed25519VectorsTest(String name, String prvKey, String >>> pubKey, String msg, String signature) >>> throws GeneralSecurityException { >>> prvBytes = BufferUtils.decodeHex(BufferUtils.EMPTY_HEX_SEPARATOR, >>> prvKey); >>> - privateKey = EdDSASecurityProvider.generate >>> EDDSAPrivateKey(prvBytes.clone()); >>> + privateKey = EdDSASecurityProviderUtils.gen >>> erateEDDSAPrivateKey(prvBytes.clone()); >>> pubBytes = BufferUtils.decodeHex(BufferUtils.EMPTY_HEX_SEPARATOR, >>> pubKey); >>> - publicKey = EdDSASecurityProvider.generate >>> EDDSAPublicKey(pubBytes.clone()); >>> + publicKey = EdDSASecurityProviderUtils.gen >>> erateEDDSAPublicKey(pubBytes.clone()); >>> msgBytes = BufferUtils.decodeHex(BufferUtils.EMPTY_HEX_SEPARATOR, >>> msg); >>> expSignature = >>> BufferUtils.decodeHex(BufferUtils.EMPTY_HEX_SEPARATOR, >>> signature); >>> } >>> @@ -200,14 +200,14 @@ public class Ed25519VectorsTest extends >>> BaseTestSupport { >>> >>> @Test >>> public void testSignature() throws Exception { >>> - Signature signer = EdDSASecurityProvider.getEDDSASignature(); >>> + Signature signer = EdDSASecurityProviderUtils.get >>> EDDSASignature(); >>> signer.initSigner(privateKey); >>> signer.update(msgBytes.clone()); >>> >>> byte[] actSignature = signer.sign(); >>> assertArrayEquals("Mismatched signature", expSignature, >>> actSignature); >>> >>> - Signature verifier = EdDSASecurityProvider.getEDDSASignature(); >>> + Signature verifier = EdDSASecurityProviderUtils.get >>> EDDSASignature(); >>> verifier.initVerifier(publicKey); >>> verifier.update(msgBytes.clone()); >>> assertTrue("Verification failed", verifier.verify(expSignature)) >>> ; >>> @@ -222,14 +222,14 @@ public class Ed25519VectorsTest extends >>> BaseTestSupport { >>> System.arraycopy(msgBytes, 0, dataBuf, offset, msgBytes.length); >>> System.arraycopy(extraData, offset, dataBuf, offset + >>> msgBytes.length, extraData.length - offset); >>> >>> - Signature signer = EdDSASecurityProvider.getEDDSASignature(); >>> + Signature signer = EdDSASecurityProviderUtils.get >>> EDDSASignature(); >>> signer.initSigner(privateKey); >>> signer.update(dataBuf.clone(), offset, msgBytes.length); >>> >>> byte[] actSignature = signer.sign(); >>> assertArrayEquals("Mismatched signature", expSignature, >>> actSignature); >>> >>> - Signature verifier = EdDSASecurityProvider.getEDDSASignature(); >>> + Signature verifier = EdDSASecurityProviderUtils.get >>> EDDSASignature(); >>> verifier.initVerifier(publicKey); >>> verifier.update(dataBuf.clone(), offset, msgBytes.length); >>> assertTrue("Verification failed", verifier.verify(expSignature)) >>> ; >>> >>> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/cbb92d >>> 2a/sshd-core/src/test/java/org/apache/sshd/common/util/secur >>> ity/eddsa/EdDSASecurityProviderRegistrarTest.java >>> ---------------------------------------------------------------------- >>> diff --git a/sshd-core/src/test/java/org/apache/sshd/common/util/securi >>> ty/eddsa/EdDSASecurityProviderRegistrarTest.java >>> b/sshd-core/src/test/java/org/apache/sshd/common/util/securi >>> ty/eddsa/EdDSASecurityProviderRegistrarTest.java >>> index 9e12fab..f2c1f3f 100644 >>> --- a/sshd-core/src/test/java/org/apache/sshd/common/util/securi >>> ty/eddsa/EdDSASecurityProviderRegistrarTest.java >>> +++ b/sshd-core/src/test/java/org/apache/sshd/common/util/securi >>> ty/eddsa/EdDSASecurityProviderRegistrarTest.java >>> @@ -26,6 +26,8 @@ import java.util.Arrays; >>> import java.util.Collection; >>> import java.util.HashSet; >>> >>> +import net.i2p.crypto.eddsa.EdDSASecurityProvider; >>> + >>> import org.apache.sshd.common.util.security.SecurityProviderRegistrar; >>> import org.apache.sshd.common.util.security.SecurityProviderRegistr >>> arTestSupport; >>> import org.apache.sshd.common.util.security.SecurityUtils; >>> >>> >> >> >> -- >> ------------------------ >> Guillaume Nodet >> >> -- ------------------------ Guillaume Nodet