From 0e77a47cc1690e23be9c68fffd6233a80dae8c94 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 19 Apr 2019 14:02:01 +0100 Subject: [PATCH] Refactor key handling to use public classes. --- .../api/crypto/AgreementPrivateKey.java | 30 ++++++++++++++++ .../api/crypto/AgreementPublicKey.java | 35 +++++++++++++++++++ .../bramble/api/crypto/CryptoConstants.java | 10 ++++++ .../bramble/api/crypto/PrivateKey.java | 5 +++ .../bramble/api/crypto/PublicKey.java | 5 +++ .../api/crypto/SignaturePrivateKey.java | 30 ++++++++++++++++ .../api/crypto/SignaturePublicKey.java | 35 +++++++++++++++++++ .../bramble/crypto/CryptoComponentImpl.java | 17 +++++---- .../bramble/crypto/Curve25519KeyParser.java | 6 ++-- .../bramble/crypto/Curve25519PrivateKey.java | 18 ---------- .../bramble/crypto/Curve25519PublicKey.java | 18 ---------- .../bramble/crypto/EdKeyParser.java | 6 ++-- .../bramble/crypto/EdPrivateKey.java | 18 ---------- .../bramble/crypto/EdPublicKey.java | 18 ---------- .../bramble/crypto/EdSignature.java | 5 +-- .../bramble/crypto/MessageEncrypter.java | 7 ++-- .../bramble/crypto/Sec1KeyParser.java | 8 +++-- .../bramble/crypto/Sec1PrivateKey.java | 9 ++++- .../bramble/crypto/Sec1PublicKey.java | 9 ++++- .../bramble/crypto/EdSignatureTest.java | 6 ++-- .../bramble/crypto/KeyAgreementTest.java | 3 +- 21 files changed, 203 insertions(+), 95 deletions(-) create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/crypto/AgreementPrivateKey.java create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/crypto/AgreementPublicKey.java create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/crypto/SignaturePrivateKey.java create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/crypto/SignaturePublicKey.java delete mode 100644 bramble-core/src/main/java/org/briarproject/bramble/crypto/Curve25519PrivateKey.java delete mode 100644 bramble-core/src/main/java/org/briarproject/bramble/crypto/Curve25519PublicKey.java delete mode 100644 bramble-core/src/main/java/org/briarproject/bramble/crypto/EdPrivateKey.java delete mode 100644 bramble-core/src/main/java/org/briarproject/bramble/crypto/EdPublicKey.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/AgreementPrivateKey.java b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/AgreementPrivateKey.java new file mode 100644 index 000000000..3e1cd624e --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/AgreementPrivateKey.java @@ -0,0 +1,30 @@ +package org.briarproject.bramble.api.crypto; + +import org.briarproject.bramble.api.Bytes; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.concurrent.Immutable; + +import static org.briarproject.bramble.api.crypto.CryptoConstants.KEY_TYPE_AGREEMENT; + +/** + * Type-safe wrapper for a private key used for key agreement. + */ +@Immutable +@NotNullByDefault +public class AgreementPrivateKey extends Bytes implements PrivateKey { + + public AgreementPrivateKey(byte[] encoded) { + super(encoded); + } + + @Override + public String getKeyType() { + return KEY_TYPE_AGREEMENT; + } + + @Override + public byte[] getEncoded() { + return getBytes(); + } +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/AgreementPublicKey.java b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/AgreementPublicKey.java new file mode 100644 index 000000000..fa595fa4c --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/AgreementPublicKey.java @@ -0,0 +1,35 @@ +package org.briarproject.bramble.api.crypto; + +import org.briarproject.bramble.api.Bytes; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.concurrent.Immutable; + +import static org.briarproject.bramble.api.crypto.CryptoConstants.KEY_TYPE_AGREEMENT; +import static org.briarproject.bramble.api.crypto.CryptoConstants.MAX_AGREEMENT_PUBLIC_KEY_BYTES; + +/** + * Type-safe wrapper for a public key used for key agreement. + */ +@Immutable +@NotNullByDefault +public class AgreementPublicKey extends Bytes implements PublicKey { + + public AgreementPublicKey(byte[] encoded) { + super(encoded); + if (encoded.length == 0 || + encoded.length > MAX_AGREEMENT_PUBLIC_KEY_BYTES) { + throw new IllegalArgumentException(); + } + } + + @Override + public String getKeyType() { + return KEY_TYPE_AGREEMENT; + } + + @Override + public byte[] getEncoded() { + return getBytes(); + } +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/CryptoConstants.java b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/CryptoConstants.java index b9f772d2b..01b080266 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/CryptoConstants.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/CryptoConstants.java @@ -7,11 +7,21 @@ public interface CryptoConstants { */ int MAX_AGREEMENT_PUBLIC_KEY_BYTES = 32; + /** + * The key type for agreement key pairs. + */ + String KEY_TYPE_AGREEMENT = "Curve25519"; + /** * The maximum length of a signature public key in bytes. */ int MAX_SIGNATURE_PUBLIC_KEY_BYTES = 32; + /** + * The key type for signature key pairs. + */ + String KEY_TYPE_SIGNATURE = "Ed25519"; + /** * The maximum length of a signature in bytes. */ diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/PrivateKey.java b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/PrivateKey.java index edf478c40..f53ef5ef8 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/PrivateKey.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/PrivateKey.java @@ -8,6 +8,11 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; @NotNullByDefault public interface PrivateKey { + /** + * Returns the type of this key pair. + */ + String getKeyType(); + /** * Returns the encoded representation of this key. */ diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/PublicKey.java b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/PublicKey.java index e5cc522ca..c091e6e0a 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/PublicKey.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/PublicKey.java @@ -8,6 +8,11 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; @NotNullByDefault public interface PublicKey { + /** + * Returns the type of this key pair. + */ + String getKeyType(); + /** * Returns the encoded representation of this key. */ diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/SignaturePrivateKey.java b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/SignaturePrivateKey.java new file mode 100644 index 000000000..1680d54af --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/SignaturePrivateKey.java @@ -0,0 +1,30 @@ +package org.briarproject.bramble.api.crypto; + +import org.briarproject.bramble.api.Bytes; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.concurrent.Immutable; + +import static org.briarproject.bramble.api.crypto.CryptoConstants.KEY_TYPE_SIGNATURE; + +/** + * Type-safe wrapper for a public key used for signing. + */ +@Immutable +@NotNullByDefault +public class SignaturePrivateKey extends Bytes implements PrivateKey { + + public SignaturePrivateKey(byte[] bytes) { + super(bytes); + } + + @Override + public String getKeyType() { + return KEY_TYPE_SIGNATURE; + } + + @Override + public byte[] getEncoded() { + return getBytes(); + } +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/SignaturePublicKey.java b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/SignaturePublicKey.java new file mode 100644 index 000000000..12b743d10 --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/crypto/SignaturePublicKey.java @@ -0,0 +1,35 @@ +package org.briarproject.bramble.api.crypto; + +import org.briarproject.bramble.api.Bytes; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.concurrent.Immutable; + +import static org.briarproject.bramble.api.crypto.CryptoConstants.KEY_TYPE_SIGNATURE; +import static org.briarproject.bramble.api.crypto.CryptoConstants.MAX_SIGNATURE_PUBLIC_KEY_BYTES; + +/** + * Type-safe wrapper for a public key used for verifying signatures. + */ +@Immutable +@NotNullByDefault +public class SignaturePublicKey extends Bytes implements PublicKey { + + public SignaturePublicKey(byte[] encoded) { + super(encoded); + if (encoded.length == 0 || + encoded.length > MAX_SIGNATURE_PUBLIC_KEY_BYTES) { + throw new IllegalArgumentException(); + } + } + + @Override + public String getKeyType() { + return KEY_TYPE_SIGNATURE; + } + + @Override + public byte[] getEncoded() { + return getBytes(); + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoComponentImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoComponentImpl.java index dc0470a6f..433947f8f 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoComponentImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoComponentImpl.java @@ -4,12 +4,16 @@ import net.i2p.crypto.eddsa.EdDSAPrivateKey; import net.i2p.crypto.eddsa.EdDSAPublicKey; import net.i2p.crypto.eddsa.KeyPairGenerator; +import org.briarproject.bramble.api.crypto.AgreementPrivateKey; +import org.briarproject.bramble.api.crypto.AgreementPublicKey; import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.crypto.KeyPair; import org.briarproject.bramble.api.crypto.KeyParser; import org.briarproject.bramble.api.crypto.PrivateKey; import org.briarproject.bramble.api.crypto.PublicKey; import org.briarproject.bramble.api.crypto.SecretKey; +import org.briarproject.bramble.api.crypto.SignaturePrivateKey; +import org.briarproject.bramble.api.crypto.SignaturePublicKey; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.system.SecureRandomProvider; import org.briarproject.bramble.util.ByteUtils; @@ -31,6 +35,7 @@ import javax.annotation.Nullable; import javax.inject.Inject; import static java.util.logging.Level.INFO; +import static org.briarproject.bramble.api.crypto.CryptoConstants.KEY_TYPE_AGREEMENT; import static org.briarproject.bramble.util.ByteUtils.INT_32_BYTES; import static org.briarproject.bramble.util.LogUtils.logDuration; import static org.briarproject.bramble.util.LogUtils.now; @@ -125,9 +130,9 @@ class CryptoComponentImpl implements CryptoComponent { // Package access for testing byte[] performRawKeyAgreement(PrivateKey priv, PublicKey pub) throws GeneralSecurityException { - if (!(priv instanceof Curve25519PrivateKey)) + if (!priv.getKeyType().equals(KEY_TYPE_AGREEMENT)) throw new IllegalArgumentException(); - if (!(pub instanceof Curve25519PublicKey)) + if (!pub.getKeyType().equals(KEY_TYPE_AGREEMENT)) throw new IllegalArgumentException(); long start = now(); byte[] secret = curve25519.calculateAgreement(pub.getEncoded(), @@ -143,8 +148,8 @@ class CryptoComponentImpl implements CryptoComponent { @Override public KeyPair generateAgreementKeyPair() { Curve25519KeyPair keyPair = curve25519.generateKeyPair(); - PublicKey pub = new Curve25519PublicKey(keyPair.getPublicKey()); - PrivateKey priv = new Curve25519PrivateKey(keyPair.getPrivateKey()); + PublicKey pub = new AgreementPublicKey(keyPair.getPublicKey()); + PrivateKey priv = new AgreementPrivateKey(keyPair.getPrivateKey()); return new KeyPair(pub, priv); } @@ -158,9 +163,9 @@ class CryptoComponentImpl implements CryptoComponent { java.security.KeyPair keyPair = signatureKeyPairGenerator.generateKeyPair(); EdDSAPublicKey edPublicKey = (EdDSAPublicKey) keyPair.getPublic(); - PublicKey publicKey = new EdPublicKey(edPublicKey.getAbyte()); + PublicKey publicKey = new SignaturePublicKey(edPublicKey.getAbyte()); EdDSAPrivateKey edPrivateKey = (EdDSAPrivateKey) keyPair.getPrivate(); - PrivateKey privateKey = new EdPrivateKey(edPrivateKey.getSeed()); + PrivateKey privateKey = new SignaturePrivateKey(edPrivateKey.getSeed()); return new KeyPair(publicKey, privateKey); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/Curve25519KeyParser.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/Curve25519KeyParser.java index e7b39ad8d..dbd658fef 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/Curve25519KeyParser.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/crypto/Curve25519KeyParser.java @@ -1,5 +1,7 @@ package org.briarproject.bramble.crypto; +import org.briarproject.bramble.api.crypto.AgreementPrivateKey; +import org.briarproject.bramble.api.crypto.AgreementPublicKey; import org.briarproject.bramble.api.crypto.KeyParser; import org.briarproject.bramble.api.crypto.PrivateKey; import org.briarproject.bramble.api.crypto.PublicKey; @@ -14,14 +16,14 @@ class Curve25519KeyParser implements KeyParser { public PublicKey parsePublicKey(byte[] encodedKey) throws GeneralSecurityException { if (encodedKey.length != 32) throw new GeneralSecurityException(); - return new Curve25519PublicKey(encodedKey); + return new AgreementPublicKey(encodedKey); } @Override public PrivateKey parsePrivateKey(byte[] encodedKey) throws GeneralSecurityException { if (encodedKey.length != 32) throw new GeneralSecurityException(); - return new Curve25519PrivateKey(clamp(encodedKey)); + return new AgreementPrivateKey(clamp(encodedKey)); } static byte[] clamp(byte[] b) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/Curve25519PrivateKey.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/Curve25519PrivateKey.java deleted file mode 100644 index b7f1a0cc5..000000000 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/Curve25519PrivateKey.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.briarproject.bramble.crypto; - -import org.briarproject.bramble.api.Bytes; -import org.briarproject.bramble.api.crypto.PrivateKey; -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; - -@NotNullByDefault -class Curve25519PrivateKey extends Bytes implements PrivateKey { - - Curve25519PrivateKey(byte[] bytes) { - super(bytes); - } - - @Override - public byte[] getEncoded() { - return getBytes(); - } -} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/Curve25519PublicKey.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/Curve25519PublicKey.java deleted file mode 100644 index 94d703d01..000000000 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/Curve25519PublicKey.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.briarproject.bramble.crypto; - -import org.briarproject.bramble.api.Bytes; -import org.briarproject.bramble.api.crypto.PublicKey; -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; - -@NotNullByDefault -class Curve25519PublicKey extends Bytes implements PublicKey { - - Curve25519PublicKey(byte[] bytes) { - super(bytes); - } - - @Override - public byte[] getEncoded() { - return getBytes(); - } -} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdKeyParser.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdKeyParser.java index 0e8f0844f..ef0578d65 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdKeyParser.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdKeyParser.java @@ -3,6 +3,8 @@ package org.briarproject.bramble.crypto; import org.briarproject.bramble.api.crypto.KeyParser; import org.briarproject.bramble.api.crypto.PrivateKey; import org.briarproject.bramble.api.crypto.PublicKey; +import org.briarproject.bramble.api.crypto.SignaturePrivateKey; +import org.briarproject.bramble.api.crypto.SignaturePublicKey; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import java.security.GeneralSecurityException; @@ -14,13 +16,13 @@ class EdKeyParser implements KeyParser { public PublicKey parsePublicKey(byte[] encodedKey) throws GeneralSecurityException { if (encodedKey.length != 32) throw new GeneralSecurityException(); - return new EdPublicKey(encodedKey); + return new SignaturePublicKey(encodedKey); } @Override public PrivateKey parsePrivateKey(byte[] encodedKey) throws GeneralSecurityException { if (encodedKey.length != 32) throw new GeneralSecurityException(); - return new EdPrivateKey(encodedKey); + return new SignaturePrivateKey(encodedKey); } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdPrivateKey.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdPrivateKey.java deleted file mode 100644 index c58912db1..000000000 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdPrivateKey.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.briarproject.bramble.crypto; - -import org.briarproject.bramble.api.Bytes; -import org.briarproject.bramble.api.crypto.PrivateKey; -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; - -@NotNullByDefault -class EdPrivateKey extends Bytes implements PrivateKey { - - EdPrivateKey(byte[] bytes) { - super(bytes); - } - - @Override - public byte[] getEncoded() { - return getBytes(); - } -} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdPublicKey.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdPublicKey.java deleted file mode 100644 index 862011f7e..000000000 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdPublicKey.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.briarproject.bramble.crypto; - -import org.briarproject.bramble.api.Bytes; -import org.briarproject.bramble.api.crypto.PublicKey; -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; - -@NotNullByDefault -class EdPublicKey extends Bytes implements PublicKey { - - EdPublicKey(byte[] bytes) { - super(bytes); - } - - @Override - public byte[] getEncoded() { - return getBytes(); - } -} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdSignature.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdSignature.java index 081e810ff..aeb95836f 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdSignature.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/crypto/EdSignature.java @@ -17,6 +17,7 @@ import java.security.NoSuchAlgorithmException; import java.security.Provider; import static net.i2p.crypto.eddsa.EdDSAEngine.SIGNATURE_ALGORITHM; +import static org.briarproject.bramble.api.crypto.CryptoConstants.KEY_TYPE_SIGNATURE; @NotNullByDefault class EdSignature implements Signature { @@ -39,7 +40,7 @@ class EdSignature implements Signature { @Override public void initSign(PrivateKey k) throws GeneralSecurityException { - if (!(k instanceof EdPrivateKey)) + if (!k.getKeyType().equals(KEY_TYPE_SIGNATURE)) throw new IllegalArgumentException(); EdDSAPrivateKey privateKey = new EdDSAPrivateKey( new EdDSAPrivateKeySpec(k.getEncoded(), CURVE_SPEC)); @@ -48,7 +49,7 @@ class EdSignature implements Signature { @Override public void initVerify(PublicKey k) throws GeneralSecurityException { - if (!(k instanceof EdPublicKey)) + if (!k.getKeyType().equals(KEY_TYPE_SIGNATURE)) throw new IllegalArgumentException(); EdDSAPublicKey publicKey = new EdDSAPublicKey( new EdDSAPublicKeySpec(k.getEncoded(), CURVE_SPEC)); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/MessageEncrypter.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/MessageEncrypter.java index 6a86ad97c..7154ea327 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/MessageEncrypter.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/crypto/MessageEncrypter.java @@ -49,6 +49,7 @@ import javax.annotation.concurrent.Immutable; @NotNullByDefault public class MessageEncrypter { + private static final String KEY_TYPE = "SEC1_brainpoolp512r1"; private static final ECDomainParameters PARAMETERS; private static final int MESSAGE_KEY_BITS = 512; private static final int MAC_KEY_BITS = 256; @@ -69,7 +70,7 @@ public class MessageEncrypter { MessageEncrypter(SecureRandom random) { generator = new ECKeyPairGenerator(); generator.init(new ECKeyGenerationParameters(PARAMETERS, random)); - parser = new Sec1KeyParser(PARAMETERS, MESSAGE_KEY_BITS); + parser = new Sec1KeyParser(KEY_TYPE, PARAMETERS, MESSAGE_KEY_BITS); KeyEncoder encoder = new PublicKeyEncoder(); ephemeralGenerator = new EphemeralKeyPairGenerator(generator, encoder); ephemeralParser = new PublicKeyParser(PARAMETERS); @@ -80,11 +81,11 @@ public class MessageEncrypter { // Return a wrapper that uses the SEC 1 encoding ECPublicKeyParameters ecPublicKey = (ECPublicKeyParameters) keyPair.getPublic(); - PublicKey publicKey = new Sec1PublicKey(ecPublicKey); + PublicKey publicKey = new Sec1PublicKey(KEY_TYPE, ecPublicKey); ECPrivateKeyParameters ecPrivateKey = (ECPrivateKeyParameters) keyPair.getPrivate(); PrivateKey privateKey = - new Sec1PrivateKey(ecPrivateKey, MESSAGE_KEY_BITS); + new Sec1PrivateKey(KEY_TYPE, ecPrivateKey, MESSAGE_KEY_BITS); return new KeyPair(publicKey, privateKey); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/Sec1KeyParser.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/Sec1KeyParser.java index a769af06d..c3b6ac9ab 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/Sec1KeyParser.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/crypto/Sec1KeyParser.java @@ -31,11 +31,13 @@ class Sec1KeyParser implements KeyParser { private static final Logger LOG = Logger.getLogger(Sec1KeyParser.class.getName()); + private final String keyType; private final ECDomainParameters params; private final BigInteger modulus; private final int keyBits, bytesPerInt, publicKeyBytes, privateKeyBytes; - Sec1KeyParser(ECDomainParameters params, int keyBits) { + Sec1KeyParser(String keyType, ECDomainParameters params, int keyBits) { + this.keyType = keyType; this.params = params; this.keyBits = keyBits; modulus = ((ECCurve.Fp) params.getCurve()).getQ(); @@ -80,7 +82,7 @@ class Sec1KeyParser implements KeyParser { throw new GeneralSecurityException(); // Construct a public key from the point (x, y) and the params ECPublicKeyParameters k = new ECPublicKeyParameters(pub, params); - PublicKey p = new Sec1PublicKey(k); + PublicKey p = new Sec1PublicKey(keyType, k); logDuration(LOG, "Parsing public key", start); return p; } @@ -97,7 +99,7 @@ class Sec1KeyParser implements KeyParser { throw new GeneralSecurityException(); // Construct a private key from the private value and the params ECPrivateKeyParameters k = new ECPrivateKeyParameters(d, params); - PrivateKey p = new Sec1PrivateKey(k, keyBits); + PrivateKey p = new Sec1PrivateKey(keyType, k, keyBits); logDuration(LOG, "Parsing private key", start); return p; } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/Sec1PrivateKey.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/Sec1PrivateKey.java index 89e297c43..7d93a9cbb 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/Sec1PrivateKey.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/crypto/Sec1PrivateKey.java @@ -10,14 +10,21 @@ import javax.annotation.concurrent.Immutable; @NotNullByDefault class Sec1PrivateKey implements PrivateKey { + private final String keyType; private final ECPrivateKeyParameters key; private final int bytesPerInt; - Sec1PrivateKey(ECPrivateKeyParameters key, int keyBits) { + Sec1PrivateKey(String keyType, ECPrivateKeyParameters key, int keyBits) { + this.keyType = keyType; this.key = key; bytesPerInt = (keyBits + 7) / 8; } + @Override + public String getKeyType() { + return keyType; + } + @Override public byte[] getEncoded() { byte[] encodedKey = new byte[bytesPerInt]; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/Sec1PublicKey.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/Sec1PublicKey.java index a7fd114e8..3f4046f42 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/Sec1PublicKey.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/crypto/Sec1PublicKey.java @@ -15,12 +15,19 @@ import javax.annotation.concurrent.Immutable; @NotNullByDefault class Sec1PublicKey implements PublicKey { + private final String keyType; private final ECPublicKeyParameters key; - Sec1PublicKey(ECPublicKeyParameters key) { + Sec1PublicKey(String keyType, ECPublicKeyParameters key) { + this.keyType = keyType; this.key = key; } + @Override + public String getKeyType() { + return keyType; + } + @Override public byte[] getEncoded() { return key.getQ().getEncoded(false); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/crypto/EdSignatureTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/EdSignatureTest.java index 62bf21819..7f9a0feb0 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/crypto/EdSignatureTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/EdSignatureTest.java @@ -1,6 +1,8 @@ package org.briarproject.bramble.crypto; import org.briarproject.bramble.api.crypto.KeyPair; +import org.briarproject.bramble.api.crypto.SignaturePrivateKey; +import org.briarproject.bramble.api.crypto.SignaturePublicKey; import org.junit.Test; import java.security.GeneralSecurityException; @@ -157,11 +159,11 @@ public class EdSignatureTest extends SignatureTest { byte[] signatureBytes = fromHexString(vector[3]); EdSignature signature = new EdSignature(); - signature.initSign(new EdPrivateKey(privateKeyBytes)); + signature.initSign(new SignaturePrivateKey(privateKeyBytes)); signature.update(messageBytes); assertArrayEquals(signatureBytes, signature.sign()); - signature.initVerify(new EdPublicKey(publicKeyBytes)); + signature.initVerify(new SignaturePublicKey(publicKeyBytes)); signature.update(messageBytes); assertTrue(signature.verify(signatureBytes)); } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyAgreementTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyAgreementTest.java index f0505f4f1..378d0bf7f 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyAgreementTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyAgreementTest.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.crypto; +import org.briarproject.bramble.api.crypto.AgreementPublicKey; import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.crypto.KeyPair; import org.briarproject.bramble.api.crypto.PublicKey; @@ -58,7 +59,7 @@ public class KeyAgreementTest extends BrambleTestCase { @Test(expected = GeneralSecurityException.class) public void testRejectsInvalidPublicKey() throws Exception { KeyPair keyPair = crypto.generateAgreementKeyPair(); - PublicKey invalid = new Curve25519PublicKey(new byte[32]); + PublicKey invalid = new AgreementPublicKey(new byte[32]); crypto.deriveSharedSecret(SHARED_SECRET_LABEL, invalid, keyPair, inputs); }