aboutsummaryrefslogtreecommitdiff
path: root/java_src/src/test
diff options
context:
space:
mode:
authortholenst <tholenst@google.com>2023-07-20 06:32:03 -0700
committerCopybara-Service <copybara-worker@google.com>2023-07-20 06:33:26 -0700
commit91f28af515a4e782466b4b5c02fd403f568e8aae (patch)
treea24b4796da70ee73db0932767385af9fd8bb16db /java_src/src/test
parentd77ed2887eecb7e17cee2809861af06a0c055724 (diff)
downloadtink-91f28af515a4e782466b4b5c02fd403f568e8aae.tar.gz
Change EciesPublicKey constructor and point accessor into two cases: one for NIST curves and one for X25519
PiperOrigin-RevId: 549613138
Diffstat (limited to 'java_src/src/test')
-rw-r--r--java_src/src/test/java/com/google/crypto/tink/hybrid/EciesPublicKeyTest.java185
1 files changed, 74 insertions, 111 deletions
diff --git a/java_src/src/test/java/com/google/crypto/tink/hybrid/EciesPublicKeyTest.java b/java_src/src/test/java/com/google/crypto/tink/hybrid/EciesPublicKeyTest.java
index 066b8d2d8..815222fdc 100644
--- a/java_src/src/test/java/com/google/crypto/tink/hybrid/EciesPublicKeyTest.java
+++ b/java_src/src/test/java/com/google/crypto/tink/hybrid/EciesPublicKeyTest.java
@@ -20,7 +20,6 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import com.google.crypto.tink.aead.XChaCha20Poly1305Parameters;
-import com.google.crypto.tink.internal.BigIntegerEncoding;
import com.google.crypto.tink.subtle.EllipticCurves;
import com.google.crypto.tink.subtle.X25519;
import com.google.crypto.tink.util.Bytes;
@@ -31,7 +30,6 @@ import java.security.KeyPair;
import java.security.interfaces.ECPublicKey;
import java.security.spec.ECPoint;
import java.security.spec.ECPublicKeySpec;
-import java.security.spec.EllipticCurve;
import org.junit.Test;
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.FromDataPoints;
@@ -62,27 +60,12 @@ public final class EciesPublicKeyTest {
EciesParameters.CurveType.NIST_P521, EllipticCurves.CurveType.NIST_P521)
};
- private static final class PointFormatMapping {
- final EciesParameters.PointFormat pointFormat;
- final EllipticCurves.PointFormatType ecPointFormatType;
-
- PointFormatMapping(
- EciesParameters.PointFormat pointFormat, EllipticCurves.PointFormatType ecPointFormatType) {
- this.pointFormat = pointFormat;
- this.ecPointFormatType = ecPointFormatType;
- }
- }
-
- @DataPoints("pointFormatsMapping")
- public static final PointFormatMapping[] POINT_FORMATS =
- new PointFormatMapping[] {
- new PointFormatMapping(
- EciesParameters.PointFormat.UNCOMPRESSED, EllipticCurves.PointFormatType.UNCOMPRESSED),
- new PointFormatMapping(
- EciesParameters.PointFormat.COMPRESSED, EllipticCurves.PointFormatType.COMPRESSED),
- new PointFormatMapping(
- EciesParameters.PointFormat.LEGACY_UNCOMPRESSED,
- EllipticCurves.PointFormatType.DO_NOT_USE_CRUNCHY_UNCOMPRESSED)
+ @DataPoints("pointFormats")
+ public static final EciesParameters.PointFormat[] POINT_FORMATS =
+ new EciesParameters.PointFormat[] {
+ EciesParameters.PointFormat.UNCOMPRESSED,
+ EciesParameters.PointFormat.COMPRESSED,
+ EciesParameters.PointFormat.LEGACY_UNCOMPRESSED,
};
@Test
@@ -105,17 +88,10 @@ public final class EciesPublicKeyTest {
.setDemParameters(XChaCha20Poly1305Parameters.create())
.build();
- // Encode the ecPublicKey to bytes using the Elliptic-Curve-Point-to-Octet-String conversion.
- Bytes publicPointBytes =
- Bytes.copyFrom(
- EllipticCurves.pointEncode(
- EllipticCurves.CurveType.NIST_P256,
- EllipticCurves.PointFormatType.UNCOMPRESSED,
- ecPublicKey.getW()));
-
// Create EciesPublicKey using the bytes from the ecPublicKey.
EciesPublicKey publicKey =
- EciesPublicKey.create(parameters, publicPointBytes, /* idRequirement= */ null);
+ EciesPublicKey.createForNistCurve(
+ parameters, ecPublicKey.getW(), /* idRequirement= */ null);
// Convert EciesPublicKey back into a ECPublicKey.
KeyFactory keyFactory = KeyFactory.getInstance("EC");
@@ -123,10 +99,7 @@ public final class EciesPublicKeyTest {
(ECPublicKey)
keyFactory.generatePublic(
new ECPublicKeySpec(
- EllipticCurves.pointDecode(
- EllipticCurves.CurveType.NIST_P256,
- EllipticCurves.PointFormatType.UNCOMPRESSED,
- publicKey.getPublicPointBytes().toByteArray()),
+ publicKey.getNistCurvePoint(),
EllipticCurves.getCurveSpec(EllipticCurves.CurveType.NIST_P256)));
assertThat(ecPublicKey2.getW()).isEqualTo(ecPublicKey.getW());
assertThat(ecPublicKey2.getParams().getCurve()).isEqualTo(ecPublicKey.getParams().getCurve());
@@ -135,35 +108,50 @@ public final class EciesPublicKeyTest {
@Theory
public void createNistCurvePublicKey_hasCorrectParameters(
@FromDataPoints("nistCurvesMapping") NistCurveMapping nistCurveMapping,
- @FromDataPoints("pointFormatsMapping") PointFormatMapping pointFormatMapping)
+ @FromDataPoints("pointFormats") EciesParameters.PointFormat pointFormat)
throws Exception {
EciesParameters params =
EciesParameters.builder()
.setHashType(EciesParameters.HashType.SHA256)
.setCurveType(nistCurveMapping.curveType)
- .setNistCurvePointFormat(pointFormatMapping.pointFormat)
+ .setNistCurvePointFormat(pointFormat)
.setVariant(EciesParameters.Variant.NO_PREFIX)
.setDemParameters(XChaCha20Poly1305Parameters.create())
.build();
ECPublicKey ecPublicKey =
(ECPublicKey) EllipticCurves.generateKeyPair(nistCurveMapping.ecNistCurve).getPublic();
- Bytes publicPointBytes =
- Bytes.copyFrom(
- EllipticCurves.pointEncode(
- nistCurveMapping.ecNistCurve,
- pointFormatMapping.ecPointFormatType,
- ecPublicKey.getW()));
EciesPublicKey publicKey =
- EciesPublicKey.create(params, publicPointBytes, /* idRequirement= */ null);
+ EciesPublicKey.createForNistCurve(params, ecPublicKey.getW(), /* idRequirement= */ null);
- assertThat(publicKey.getPublicPointBytes()).isEqualTo(publicPointBytes);
+ assertThat(publicKey.getX25519CurvePointBytes()).isEqualTo(null);
+ assertThat(publicKey.getNistCurvePoint()).isEqualTo(ecPublicKey.getW());
assertThat(publicKey.getOutputPrefix()).isEqualTo(Bytes.copyFrom(new byte[] {}));
assertThat(publicKey.getParameters()).isEqualTo(params);
assertThat(publicKey.getIdRequirementOrNull()).isEqualTo(null);
}
@Test
+ public void callCreateForNistCurveWithX25519Params_throws() throws Exception {
+ EciesParameters parameters =
+ EciesParameters.builder()
+ .setHashType(EciesParameters.HashType.SHA256)
+ .setCurveType(EciesParameters.CurveType.X25519)
+ .setVariant(EciesParameters.Variant.NO_PREFIX)
+ .setDemParameters(XChaCha20Poly1305Parameters.create())
+ .build();
+ ECPublicKey ecPublicKey =
+ (ECPublicKey)
+ EllipticCurves.generateKeyPair(EllipticCurves.CurveType.NIST_P256).getPublic();
+
+ assertThrows(
+ GeneralSecurityException.class,
+ () ->
+ EciesPublicKey.createForNistCurve(
+ parameters, ecPublicKey.getW(), /* idRequirement= */ null));
+ }
+
+ @Test
public void createX25519PublicKey_hasCorrectParameters() throws Exception {
EciesParameters params =
EciesParameters.builder()
@@ -175,47 +163,32 @@ public final class EciesPublicKeyTest {
Bytes publicPointBytes = Bytes.copyFrom(X25519.publicFromPrivate(X25519.generatePrivateKey()));
EciesPublicKey publicKey =
- EciesPublicKey.create(params, publicPointBytes, /* idRequirement= */ null);
+ EciesPublicKey.createForCurveX25519(params, publicPointBytes, /* idRequirement= */ null);
- assertThat(publicKey.getPublicPointBytes()).isEqualTo(publicPointBytes);
+ assertThat(publicKey.getX25519CurvePointBytes()).isEqualTo(publicPointBytes);
+ assertThat(publicKey.getNistCurvePoint()).isEqualTo(null);
assertThat(publicKey.getOutputPrefix()).isEqualTo(Bytes.copyFrom(new byte[] {}));
assertThat(publicKey.getParameters()).isEqualTo(params);
assertThat(publicKey.getIdRequirementOrNull()).isEqualTo(null);
}
- @Theory
- public void createNistCurvePublicKey_withWrongKeyLength_fails(
- @FromDataPoints("nistCurvesMapping") NistCurveMapping nistCurveMapping,
- @FromDataPoints("pointFormatsMapping") PointFormatMapping pointFormatMapping)
- throws Exception {
- EciesParameters params =
+ @Test
+ public void callCreateForCurve25519WithNistParams_throws() throws Exception {
+ EciesParameters parameters =
EciesParameters.builder()
.setHashType(EciesParameters.HashType.SHA256)
- .setCurveType(nistCurveMapping.curveType)
- .setNistCurvePointFormat(pointFormatMapping.pointFormat)
+ .setCurveType(EciesParameters.CurveType.NIST_P256)
+ .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
.setVariant(EciesParameters.Variant.NO_PREFIX)
.setDemParameters(XChaCha20Poly1305Parameters.create())
.build();
- ECPublicKey ecPublicKey =
- (ECPublicKey) EllipticCurves.generateKeyPair(nistCurveMapping.ecNistCurve).getPublic();
- Bytes publicKeyBytes =
- Bytes.copyFrom(
- EllipticCurves.pointEncode(
- nistCurveMapping.ecNistCurve,
- pointFormatMapping.ecPointFormatType,
- ecPublicKey.getW()));
- Bytes tooShort = Bytes.copyFrom(publicKeyBytes.toByteArray(), 0, publicKeyBytes.size() - 1);
- byte[] tooLongBytes = new byte[publicKeyBytes.size() + 1];
- System.arraycopy(publicKeyBytes.toByteArray(), 0, tooLongBytes, 0, publicKeyBytes.size());
- Bytes tooLong = Bytes.copyFrom(tooLongBytes);
-
- assertThrows(
- GeneralSecurityException.class,
- () -> EciesPublicKey.create(params, tooShort, /* idRequirement= */ null));
+ Bytes publicPointBytes = Bytes.copyFrom(X25519.publicFromPrivate(X25519.generatePrivateKey()));
assertThrows(
GeneralSecurityException.class,
- () -> EciesPublicKey.create(params, tooLong, /* idRequirement= */ null));
+ () ->
+ EciesPublicKey.createForCurveX25519(
+ parameters, publicPointBytes, /* idRequirement= */ null));
}
@Test
@@ -235,25 +208,11 @@ public final class EciesPublicKeyTest {
assertThrows(
GeneralSecurityException.class,
- () -> EciesPublicKey.create(params, tooShort, /* idRequirement= */ null));
+ () -> EciesPublicKey.createForCurveX25519(params, tooShort, /* idRequirement= */ null));
assertThrows(
GeneralSecurityException.class,
- () -> EciesPublicKey.create(params, tooLong, /* idRequirement= */ null));
- }
-
- /** Copied from {@link EllipticCurves#pointEncode} to bypass point validation. */
- private static byte[] encodeUncompressedPoint(EllipticCurve curve, ECPoint point)
- throws GeneralSecurityException {
- int coordinateSize = EllipticCurves.fieldSizeInBytes(curve);
- byte[] encoded = new byte[2 * coordinateSize + 1];
- byte[] x = BigIntegerEncoding.toBigEndianBytes(point.getAffineX());
- byte[] y = BigIntegerEncoding.toBigEndianBytes(point.getAffineY());
- // Order of System.arraycopy is important because x,y can have leading 0's.
- System.arraycopy(y, 0, encoded, 1 + 2 * coordinateSize - y.length, y.length);
- System.arraycopy(x, 0, encoded, 1 + coordinateSize - x.length, x.length);
- encoded[0] = 4;
- return encoded;
+ () -> EciesPublicKey.createForCurveX25519(params, tooLong, /* idRequirement= */ null));
}
@Theory
@@ -272,14 +231,9 @@ public final class EciesPublicKeyTest {
ECPoint point = ecPublicKey.getW();
ECPoint badPoint = new ECPoint(point.getAffineX(), point.getAffineY().subtract(BigInteger.ONE));
- Bytes publicPointBytes =
- Bytes.copyFrom(
- encodeUncompressedPoint(
- EllipticCurves.getCurveSpec(nistCurveMapping.ecNistCurve).getCurve(), badPoint));
-
assertThrows(
GeneralSecurityException.class,
- () -> EciesPublicKey.create(params, publicPointBytes, /* idRequirement= */ null));
+ () -> EciesPublicKey.createForNistCurve(params, badPoint, /* idRequirement= */ null));
}
@Test
@@ -295,18 +249,24 @@ public final class EciesPublicKeyTest {
paramsBuilder.setVariant(EciesParameters.Variant.NO_PREFIX).build();
assertThrows(
GeneralSecurityException.class,
- () -> EciesPublicKey.create(noPrefixParams, publicKeyBytes, /* idRequirement= */ 123));
+ () ->
+ EciesPublicKey.createForCurveX25519(
+ noPrefixParams, publicKeyBytes, /* idRequirement= */ 123));
EciesParameters tinkParams = paramsBuilder.setVariant(EciesParameters.Variant.TINK).build();
assertThrows(
GeneralSecurityException.class,
- () -> EciesPublicKey.create(tinkParams, publicKeyBytes, /* idRequirement= */ null));
+ () ->
+ EciesPublicKey.createForCurveX25519(
+ tinkParams, publicKeyBytes, /* idRequirement= */ null));
EciesParameters crunchyParams =
paramsBuilder.setVariant(EciesParameters.Variant.CRUNCHY).build();
assertThrows(
GeneralSecurityException.class,
- () -> EciesPublicKey.create(crunchyParams, publicKeyBytes, /* idRequirement= */ null));
+ () ->
+ EciesPublicKey.createForCurveX25519(
+ crunchyParams, publicKeyBytes, /* idRequirement= */ null));
}
@Test
@@ -321,13 +281,15 @@ public final class EciesPublicKeyTest {
EciesParameters noPrefixParams =
paramsBuilder.setVariant(EciesParameters.Variant.NO_PREFIX).build();
EciesPublicKey noPrefixPublicKey =
- EciesPublicKey.create(noPrefixParams, publicPointBytes, /* idRequirement= */ null);
+ EciesPublicKey.createForCurveX25519(
+ noPrefixParams, publicPointBytes, /* idRequirement= */ null);
assertThat(noPrefixPublicKey.getIdRequirementOrNull()).isEqualTo(null);
assertThat(noPrefixPublicKey.getOutputPrefix()).isEqualTo(Bytes.copyFrom(new byte[] {}));
EciesParameters tinkParams = paramsBuilder.setVariant(EciesParameters.Variant.TINK).build();
EciesPublicKey tinkPublicKey =
- EciesPublicKey.create(tinkParams, publicPointBytes, /* idRequirement= */ 0x02030405);
+ EciesPublicKey.createForCurveX25519(
+ tinkParams, publicPointBytes, /* idRequirement= */ 0x02030405);
assertThat(tinkPublicKey.getIdRequirementOrNull()).isEqualTo(0x02030405);
assertThat(tinkPublicKey.getOutputPrefix())
.isEqualTo(Bytes.copyFrom(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}));
@@ -335,7 +297,8 @@ public final class EciesPublicKeyTest {
EciesParameters crunchyParams =
paramsBuilder.setVariant(EciesParameters.Variant.CRUNCHY).build();
EciesPublicKey crunchyPublicKey =
- EciesPublicKey.create(crunchyParams, publicPointBytes, /* idRequirement= */ 0x01020304);
+ EciesPublicKey.createForCurveX25519(
+ crunchyParams, publicPointBytes, /* idRequirement= */ 0x01020304);
assertThat(crunchyPublicKey.getIdRequirementOrNull()).isEqualTo(0x01020304);
assertThat(crunchyPublicKey.getOutputPrefix())
.isEqualTo(Bytes.copyFrom(new byte[] {0x00, 0x01, 0x02, 0x03, 0x04}));
@@ -353,9 +316,9 @@ public final class EciesPublicKeyTest {
Bytes publicPointBytes = Bytes.copyFrom(X25519.publicFromPrivate(X25519.generatePrivateKey()));
EciesPublicKey publicKey1 =
- EciesPublicKey.create(params, publicPointBytes, /* idRequirement= */ null);
+ EciesPublicKey.createForCurveX25519(params, publicPointBytes, /* idRequirement= */ null);
EciesPublicKey publicKey2 =
- EciesPublicKey.create(params, publicPointBytes, /* idRequirement= */ null);
+ EciesPublicKey.createForCurveX25519(params, publicPointBytes, /* idRequirement= */ null);
assertThat(publicKey1.equalsKey(publicKey2)).isTrue();
}
@@ -372,9 +335,9 @@ public final class EciesPublicKeyTest {
Bytes publicPointBytes = Bytes.copyFrom(X25519.publicFromPrivate(X25519.generatePrivateKey()));
EciesPublicKey publicKey1 =
- EciesPublicKey.create(params, publicPointBytes, /* idRequirement= */ null);
+ EciesPublicKey.createForCurveX25519(params, publicPointBytes, /* idRequirement= */ null);
EciesPublicKey publicKey2 =
- EciesPublicKey.create(params, publicPointBytes, /* idRequirement= */ null);
+ EciesPublicKey.createForCurveX25519(params, publicPointBytes, /* idRequirement= */ null);
assertThat(publicKey1.equalsKey(publicKey2)).isTrue();
}
@@ -390,10 +353,10 @@ public final class EciesPublicKeyTest {
EciesParameters params1 = paramsBuilder.setVariant(EciesParameters.Variant.TINK).build();
EciesPublicKey publicKey1 =
- EciesPublicKey.create(params1, publicKeyBytes, /* idRequirement= */ 123);
+ EciesPublicKey.createForCurveX25519(params1, publicKeyBytes, /* idRequirement= */ 123);
EciesParameters params2 = paramsBuilder.setVariant(EciesParameters.Variant.CRUNCHY).build();
EciesPublicKey publicKey2 =
- EciesPublicKey.create(params2, publicKeyBytes, /* idRequirement= */ 123);
+ EciesPublicKey.createForCurveX25519(params2, publicKeyBytes, /* idRequirement= */ 123);
assertThat(publicKey1.equalsKey(publicKey2)).isFalse();
}
@@ -413,9 +376,9 @@ public final class EciesPublicKeyTest {
Bytes publicKeyBytes2 = Bytes.copyFrom(buf2);
EciesPublicKey publicKey1 =
- EciesPublicKey.create(params, publicKeyBytes1, /* idRequirement= */ null);
+ EciesPublicKey.createForCurveX25519(params, publicKeyBytes1, /* idRequirement= */ null);
EciesPublicKey publicKey2 =
- EciesPublicKey.create(params, publicKeyBytes2, /* idRequirement= */ null);
+ EciesPublicKey.createForCurveX25519(params, publicKeyBytes2, /* idRequirement= */ null);
assertThat(publicKey1.equalsKey(publicKey2)).isFalse();
}
@@ -431,10 +394,10 @@ public final class EciesPublicKeyTest {
EciesParameters params1 = paramsBuilder.setVariant(EciesParameters.Variant.TINK).build();
EciesPublicKey publicKey1 =
- EciesPublicKey.create(params1, publicKeyBytes, /* idRequirement= */ 123);
+ EciesPublicKey.createForCurveX25519(params1, publicKeyBytes, /* idRequirement= */ 123);
EciesParameters params2 = paramsBuilder.setVariant(EciesParameters.Variant.TINK).build();
EciesPublicKey publicKey2 =
- EciesPublicKey.create(params2, publicKeyBytes, /* idRequirement= */ 456);
+ EciesPublicKey.createForCurveX25519(params2, publicKeyBytes, /* idRequirement= */ 456);
assertThat(publicKey1.equalsKey(publicKey2)).isFalse();
}