diff options
author | ioannanedelcu <ioannanedelcu@google.com> | 2023-07-05 03:51:51 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2023-07-05 03:53:20 -0700 |
commit | 1001873facdce717e6cf510082c70325f6e98102 (patch) | |
tree | fcc9f1bb20e28fe388ff262896e83e0d00fd08e9 /java_src/src/test/java/com/google/crypto/tink | |
parent | d14920fb36ff6c5183b510cc6c396498d1280956 (diff) | |
download | tink-1001873facdce717e6cf510082c70325f6e98102.tar.gz |
Add EciesParameters class in Java.
PiperOrigin-RevId: 545623249
Diffstat (limited to 'java_src/src/test/java/com/google/crypto/tink')
-rw-r--r-- | java_src/src/test/java/com/google/crypto/tink/hybrid/BUILD.bazel | 19 | ||||
-rw-r--r-- | java_src/src/test/java/com/google/crypto/tink/hybrid/EciesParametersTest.java | 525 |
2 files changed, 544 insertions, 0 deletions
diff --git a/java_src/src/test/java/com/google/crypto/tink/hybrid/BUILD.bazel b/java_src/src/test/java/com/google/crypto/tink/hybrid/BUILD.bazel index 80bb9f5bf..3f0091afa 100644 --- a/java_src/src/test/java/com/google/crypto/tink/hybrid/BUILD.bazel +++ b/java_src/src/test/java/com/google/crypto/tink/hybrid/BUILD.bazel @@ -355,3 +355,22 @@ java_test( "@maven//:junit_junit", ], ) + +java_test( + name = "EciesParametersTest", + size = "small", + srcs = ["EciesParametersTest.java"], + deps = [ + "//src/main/java/com/google/crypto/tink:parameters", + "//src/main/java/com/google/crypto/tink/aead:aes_ctr_hmac_aead_parameters", + "//src/main/java/com/google/crypto/tink/aead:aes_gcm_parameters", + "//src/main/java/com/google/crypto/tink/aead:cha_cha20_poly1305_parameters", + "//src/main/java/com/google/crypto/tink/aead:x_cha_cha20_poly1305_parameters", + "//src/main/java/com/google/crypto/tink/daead:aes_siv_parameters", + "//src/main/java/com/google/crypto/tink/hybrid:ecies_parameters", + "//src/main/java/com/google/crypto/tink/subtle:hex", + "//src/main/java/com/google/crypto/tink/util:bytes", + "@maven//:com_google_truth_truth", + "@maven//:junit_junit", + ], +) diff --git a/java_src/src/test/java/com/google/crypto/tink/hybrid/EciesParametersTest.java b/java_src/src/test/java/com/google/crypto/tink/hybrid/EciesParametersTest.java new file mode 100644 index 000000000..2ec5bc8ff --- /dev/null +++ b/java_src/src/test/java/com/google/crypto/tink/hybrid/EciesParametersTest.java @@ -0,0 +1,525 @@ +// Copyright 2023 Google LLC +// +// Licensed 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 com.google.crypto.tink.hybrid; + +import static com.google.common.truth.Truth.assertThat; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertThrows; + +import com.google.crypto.tink.Parameters; +import com.google.crypto.tink.aead.AesCtrHmacAeadParameters; +import com.google.crypto.tink.aead.AesGcmParameters; +import com.google.crypto.tink.aead.ChaCha20Poly1305Parameters; +import com.google.crypto.tink.aead.XChaCha20Poly1305Parameters; +import com.google.crypto.tink.daead.AesSivParameters; +import com.google.crypto.tink.subtle.Hex; +import com.google.crypto.tink.util.Bytes; +import java.security.GeneralSecurityException; +import org.junit.Test; +import org.junit.experimental.theories.DataPoints; +import org.junit.experimental.theories.FromDataPoints; +import org.junit.experimental.theories.Theories; +import org.junit.experimental.theories.Theory; +import org.junit.runner.RunWith; + +@RunWith(Theories.class) +public final class EciesParametersTest { + + private static final Bytes SALT = Bytes.copyFrom(Hex.decode("2023af")); + + @DataPoints("curveTypes") + public static final EciesParameters.CurveType[] CURVE_TYPES = + new EciesParameters.CurveType[] { + EciesParameters.CurveType.NIST_P256, + EciesParameters.CurveType.NIST_P384, + EciesParameters.CurveType.NIST_P521, + EciesParameters.CurveType.X25519 + }; + + @DataPoints("hashTypes") + public static final EciesParameters.HashType[] HASH_TYPES = + new EciesParameters.HashType[] { + EciesParameters.HashType.SHA1, + EciesParameters.HashType.SHA224, + EciesParameters.HashType.SHA256, + EciesParameters.HashType.SHA384, + EciesParameters.HashType.SHA512, + }; + + @DataPoints("pointFormats") + public static final EciesParameters.PointFormat[] POINT_FORMATS = + new EciesParameters.PointFormat[] { + EciesParameters.PointFormat.COMPRESSED, + EciesParameters.PointFormat.UNCOMPRESSED, + EciesParameters.PointFormat.LEGACY_UNCOMPRESSED, + }; + + @DataPoints("variants") + public static final EciesParameters.Variant[] VARIANTS = + new EciesParameters.Variant[] { + EciesParameters.Variant.TINK, + EciesParameters.Variant.CRUNCHY, + EciesParameters.Variant.NO_PREFIX, + }; + + @Theory + public void buildParametersWithAesGcm_hasExpectedValues( + @FromDataPoints("variants") EciesParameters.Variant variant, + @FromDataPoints("hashTypes") EciesParameters.HashType hashType, + @FromDataPoints("curveTypes") EciesParameters.CurveType curveType, + @FromDataPoints("pointFormats") EciesParameters.PointFormat pointFormat) + throws Exception { + Parameters aesGcmParameters = + AesGcmParameters.builder() + .setKeySizeBytes(16) + .setIvSizeBytes(16) + .setTagSizeBytes(16) + .setVariant(AesGcmParameters.Variant.NO_PREFIX) + .build(); + + EciesParameters params = + EciesParameters.builder() + .setCurveType(curveType) + .setHashType(hashType) + .setPointFormat(pointFormat) + .setVariant(variant) + .setDemParameters(aesGcmParameters) + .setSalt(SALT) + .build(); + + assertThat(params.getVariant()).isEqualTo(variant); + assertThat(params.getCurveType()).isEqualTo(curveType); + assertThat(params.getHashType()).isEqualTo(hashType); + assertThat(params.getPointFormat()).isEqualTo(pointFormat); + assertThat(params.getDemParameters()).isEqualTo(aesGcmParameters); + assertThat(params.getSalt()).isEqualTo(SALT); + } + + @Test + public void buildWithAesCtrHmacAead_succeeds() throws Exception { + Parameters aesCtrHmacAeadParameters = + AesCtrHmacAeadParameters.builder() + .setAesKeySizeBytes(16) + .setHmacKeySizeBytes(16) + .setIvSizeBytes(16) + .setTagSizeBytes(21) + .setHashType(AesCtrHmacAeadParameters.HashType.SHA256) + .setVariant(AesCtrHmacAeadParameters.Variant.NO_PREFIX) + .build(); + + EciesParameters params = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P521) + .setHashType(EciesParameters.HashType.SHA512) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.TINK) + .setDemParameters(aesCtrHmacAeadParameters) + .setSalt(SALT) + .build(); + + assertThat(params.getDemParameters()).isEqualTo(aesCtrHmacAeadParameters); + } + + @Theory + public void buildParametersWithXChaCha20Poly1305_succeeds() throws Exception { + Parameters xChaCha20Poly1305Parameters = XChaCha20Poly1305Parameters.create(); + + EciesParameters params = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.COMPRESSED) + .setVariant(EciesParameters.Variant.CRUNCHY) + .setDemParameters(xChaCha20Poly1305Parameters) + .setSalt(SALT) + .build(); + + assertThat(params.getDemParameters()).isEqualTo(xChaCha20Poly1305Parameters); + } + + @Theory + public void buildParametersWithAesSiv_succeeds() throws Exception { + Parameters aesSivParameters = AesSivParameters.builder().setKeySizeBytes(32).build(); + + EciesParameters params = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters(aesSivParameters) + .setSalt(SALT) + .build(); + + assertThat(params.getDemParameters()).isEqualTo(aesSivParameters); + } + + @Test + public void buildWithoutSettingSalt_succeeds() throws Exception { + EciesParameters parameters = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + assertThat(parameters.getSalt()).isNull(); + } + + @Test + public void buildWithEmptySalt_succeeds() throws Exception { + EciesParameters parameters = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .setSalt(Bytes.copyFrom("".getBytes(UTF_8))) + .build(); + + assertThat(parameters.getSalt()).isNull(); + } + + @Test + public void clearSaltWithEmptyString_succeeds() throws Exception { + EciesParameters parameters = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .setSalt(Bytes.copyFrom("Some Salt".getBytes(UTF_8))) + .setSalt(Bytes.copyFrom("".getBytes(UTF_8))) + .build(); + + assertThat(parameters.getSalt()).isNull(); + } + + @Theory + public void buildWithDefaultVariant_hasNoPrefix() throws Exception { + Parameters demParameters = XChaCha20Poly1305Parameters.create(); + EciesParameters params = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters(demParameters) + .setSalt(SALT) + .build(); + + assertThat(params.getVariant()).isEqualTo(EciesParameters.Variant.NO_PREFIX); + } + + @Test + public void buildWithoutCurveType_fails() throws Exception { + EciesParameters.Builder builder = + EciesParameters.builder() + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters(XChaCha20Poly1305Parameters.create()); + + assertThrows(GeneralSecurityException.class, builder::build); + } + + @Test + public void buildWithoutHashType_fails() throws Exception { + EciesParameters.Builder builder = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters(XChaCha20Poly1305Parameters.create()); + + assertThrows(GeneralSecurityException.class, builder::build); + } + + @Test + public void buildWithoutPointFormat_fails() throws Exception { + EciesParameters.Builder builder = + EciesParameters.builder() + .setHashType(EciesParameters.HashType.SHA256) + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters(XChaCha20Poly1305Parameters.create()); + + assertThrows(GeneralSecurityException.class, builder::build); + } + + @Test + public void buildWithoutDemParameters_fails() throws Exception { + EciesParameters.Builder builder = + EciesParameters.builder() + .setHashType(EciesParameters.HashType.SHA256) + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setPointFormat(EciesParameters.PointFormat.COMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX); + + assertThrows(GeneralSecurityException.class, builder::build); + } + + @Test + public void sethUnsupportedDemParameters_fails() throws Exception { + assertThrows( + GeneralSecurityException.class, + () -> + EciesParameters.builder() + .setHashType(EciesParameters.HashType.SHA256) + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setPointFormat(EciesParameters.PointFormat.COMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters(ChaCha20Poly1305Parameters.create()) + .build()); + } + + @Test + public void setDemParametersWithIdRequirement_fails() throws Exception { + assertThrows( + GeneralSecurityException.class, + () -> + EciesParameters.builder() + .setHashType(EciesParameters.HashType.SHA256) + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setPointFormat(EciesParameters.PointFormat.COMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters( + XChaCha20Poly1305Parameters.create(XChaCha20Poly1305Parameters.Variant.TINK)) + .build()); + } + + @Test + public void buildWithVariantSetToNull_fails() throws Exception { + EciesParameters.Builder builder = + EciesParameters.builder() + .setHashType(EciesParameters.HashType.SHA256) + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setPointFormat(EciesParameters.PointFormat.COMPRESSED) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .setVariant(null); + + assertThrows(GeneralSecurityException.class, builder::build); + } + + @Test + public void buildWithNoPrefix_doesNotHaveIdRequirement() throws Exception { + EciesParameters noPrefixParams = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + assertThat(noPrefixParams.hasIdRequirement()).isFalse(); + } + + @Test + public void buildWithTink_hasIdRequirement() throws Exception { + EciesParameters tinkParams = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.TINK) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + assertThat(tinkParams.hasIdRequirement()).isTrue(); + } + + @Test + public void buildWithCrunchy_hasIdRequirement() throws Exception { + + EciesParameters crunchyParams = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.CRUNCHY) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + assertThat(crunchyParams.hasIdRequirement()).isTrue(); + } + + @Test + public void testEqualsAndEqualHashCode() throws Exception { + EciesParameters params = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .setSalt(SALT) + .build(); + EciesParameters duplicateParams = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.NO_PREFIX) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .setSalt(SALT) + .build(); + + assertThat(params).isEqualTo(duplicateParams); + assertThat(params.hashCode()).isEqualTo(duplicateParams.hashCode()); + } + + @Test + public void parametersWithDifferentVariants_areNotEqual() throws Exception { + EciesParameters crunchyParams = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.CRUNCHY) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + EciesParameters tinkParams = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setVariant(EciesParameters.Variant.TINK) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + assertThat(crunchyParams).isNotEqualTo(tinkParams); + assertThat(crunchyParams.hashCode()).isNotEqualTo(tinkParams.hashCode()); + } + + @Test + public void parametersWithDifferentCurveTypes_areNotEqual() throws Exception { + EciesParameters p256Params = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + EciesParameters p521Params = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P521) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + assertThat(p256Params).isNotEqualTo(p521Params); + assertThat(p256Params.hashCode()).isNotEqualTo(p521Params.hashCode()); + } + + @Test + public void parametersWithDifferentHashTypes_areNotEqual() throws Exception { + EciesParameters sha256Params = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + EciesParameters sha512Params = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA512) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + assertThat(sha256Params).isNotEqualTo(sha512Params); + assertThat(sha256Params.hashCode()).isNotEqualTo(sha512Params.hashCode()); + } + + @Test + public void parametersWithDifferenPointFormats_areNotEqual() throws Exception { + EciesParameters compressedParams = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.COMPRESSED) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + EciesParameters uncompressedParams = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + assertThat(compressedParams).isNotEqualTo(uncompressedParams); + assertThat(compressedParams.hashCode()).isNotEqualTo(uncompressedParams.hashCode()); + } + + @Test + public void parametersWithDifferentDemParameters_areNotEqual() throws Exception { + EciesParameters aesSivParams = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setDemParameters(AesSivParameters.builder().setKeySizeBytes(32).build()) + .build(); + + EciesParameters xChaCha20Poly1305Params = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .build(); + + assertThat(aesSivParams).isNotEqualTo(xChaCha20Poly1305Params); + assertThat(aesSivParams.hashCode()).isNotEqualTo(xChaCha20Poly1305Params.hashCode()); + } + + @Test + public void parametersWithDifferentSalts_areNotEqual() throws Exception { + EciesParameters nonEmptySaltParams = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .setSalt(SALT) + .build(); + + EciesParameters emptySaltParams = + EciesParameters.builder() + .setCurveType(EciesParameters.CurveType.NIST_P256) + .setHashType(EciesParameters.HashType.SHA256) + .setPointFormat(EciesParameters.PointFormat.UNCOMPRESSED) + .setDemParameters(XChaCha20Poly1305Parameters.create()) + .setSalt(Bytes.copyFrom("".getBytes(UTF_8))) + .build(); + + assertThat(emptySaltParams).isNotEqualTo(nonEmptySaltParams); + assertThat(emptySaltParams.hashCode()).isNotEqualTo(nonEmptySaltParams.hashCode()); + } +} |