• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2023 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 ////////////////////////////////////////////////////////////////////////////////
16 
17 package com.google.crypto.tink.hybrid;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 import static java.nio.charset.StandardCharsets.UTF_8;
21 import static org.junit.Assert.assertThrows;
22 
23 import com.google.crypto.tink.Parameters;
24 import com.google.crypto.tink.aead.AesCtrHmacAeadParameters;
25 import com.google.crypto.tink.aead.AesGcmParameters;
26 import com.google.crypto.tink.aead.ChaCha20Poly1305Parameters;
27 import com.google.crypto.tink.aead.XChaCha20Poly1305Parameters;
28 import com.google.crypto.tink.daead.AesSivParameters;
29 import com.google.crypto.tink.subtle.Hex;
30 import com.google.crypto.tink.util.Bytes;
31 import java.security.GeneralSecurityException;
32 import org.junit.Test;
33 import org.junit.experimental.theories.DataPoints;
34 import org.junit.experimental.theories.FromDataPoints;
35 import org.junit.experimental.theories.Theories;
36 import org.junit.experimental.theories.Theory;
37 import org.junit.runner.RunWith;
38 
39 @RunWith(Theories.class)
40 public final class EciesParametersTest {
41 
42   private static final Bytes SALT = Bytes.copyFrom(Hex.decode("2023af"));
43 
44   @DataPoints("curveTypes")
45   public static final EciesParameters.CurveType[] NIST_CURVE_TYPES =
46       new EciesParameters.CurveType[] {
47         EciesParameters.CurveType.NIST_P256,
48         EciesParameters.CurveType.NIST_P384,
49         EciesParameters.CurveType.NIST_P521,
50       };
51 
52   @DataPoints("hashTypes")
53   public static final EciesParameters.HashType[] HASH_TYPES =
54       new EciesParameters.HashType[] {
55         EciesParameters.HashType.SHA1,
56         EciesParameters.HashType.SHA224,
57         EciesParameters.HashType.SHA256,
58         EciesParameters.HashType.SHA384,
59         EciesParameters.HashType.SHA512,
60       };
61 
62   @DataPoints("pointFormats")
63   public static final EciesParameters.PointFormat[] POINT_FORMATS =
64       new EciesParameters.PointFormat[] {
65         EciesParameters.PointFormat.COMPRESSED,
66         EciesParameters.PointFormat.UNCOMPRESSED,
67         EciesParameters.PointFormat.LEGACY_UNCOMPRESSED,
68       };
69 
70   @DataPoints("variants")
71   public static final EciesParameters.Variant[] VARIANTS =
72       new EciesParameters.Variant[] {
73         EciesParameters.Variant.TINK,
74         EciesParameters.Variant.CRUNCHY,
75         EciesParameters.Variant.NO_PREFIX,
76       };
77 
78   @Theory
buildWithNistCurvesAndAesGcmDem_hasExpectedValues( @romDataPoints"variants") EciesParameters.Variant variant, @FromDataPoints("hashTypes") EciesParameters.HashType hashType, @FromDataPoints("curveTypes") EciesParameters.CurveType curveType, @FromDataPoints("pointFormats") EciesParameters.PointFormat pointFormat)79   public void buildWithNistCurvesAndAesGcmDem_hasExpectedValues(
80       @FromDataPoints("variants") EciesParameters.Variant variant,
81       @FromDataPoints("hashTypes") EciesParameters.HashType hashType,
82       @FromDataPoints("curveTypes") EciesParameters.CurveType curveType,
83       @FromDataPoints("pointFormats") EciesParameters.PointFormat pointFormat)
84       throws Exception {
85     Parameters aesGcmParameters =
86         AesGcmParameters.builder()
87             .setIvSizeBytes(12)
88             .setKeySizeBytes(16)
89             .setTagSizeBytes(16)
90             .setVariant(AesGcmParameters.Variant.NO_PREFIX)
91             .build();
92 
93     EciesParameters params =
94         EciesParameters.builder()
95             .setCurveType(curveType)
96             .setHashType(hashType)
97             .setNistCurvePointFormat(pointFormat)
98             .setVariant(variant)
99             .setDemParameters(aesGcmParameters)
100             .setSalt(SALT)
101             .build();
102 
103     assertThat(params.getVariant()).isEqualTo(variant);
104     assertThat(params.getCurveType()).isEqualTo(curveType);
105     assertThat(params.getHashType()).isEqualTo(hashType);
106     assertThat(params.getNistCurvePointFormat()).isEqualTo(pointFormat);
107     assertThat(params.getDemParameters()).isEqualTo(aesGcmParameters);
108     assertThat(params.getSalt()).isEqualTo(SALT);
109   }
110 
111   @Test
buildWithAesCtrHmacAeadDem_succeeds()112   public void buildWithAesCtrHmacAeadDem_succeeds() throws Exception {
113     Parameters aesCtrHmacAeadParameters =
114         AesCtrHmacAeadParameters.builder()
115             .setAesKeySizeBytes(16)
116             .setHmacKeySizeBytes(32)
117             .setTagSizeBytes(16)
118             .setIvSizeBytes(16)
119             .setHashType(AesCtrHmacAeadParameters.HashType.SHA256)
120             .setVariant(AesCtrHmacAeadParameters.Variant.NO_PREFIX)
121             .build();
122 
123     EciesParameters params =
124         EciesParameters.builder()
125             .setCurveType(EciesParameters.CurveType.NIST_P521)
126             .setHashType(EciesParameters.HashType.SHA512)
127             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
128             .setVariant(EciesParameters.Variant.TINK)
129             .setDemParameters(aesCtrHmacAeadParameters)
130             .setSalt(SALT)
131             .build();
132 
133     assertThat(params.getDemParameters()).isEqualTo(aesCtrHmacAeadParameters);
134   }
135 
136   @Theory
buildWithXChaCha20Poly1305Dem_succeeds()137   public void buildWithXChaCha20Poly1305Dem_succeeds() throws Exception {
138     Parameters xChaCha20Poly1305Parameters = XChaCha20Poly1305Parameters.create();
139 
140     EciesParameters params =
141         EciesParameters.builder()
142             .setCurveType(EciesParameters.CurveType.NIST_P256)
143             .setHashType(EciesParameters.HashType.SHA256)
144             .setNistCurvePointFormat(EciesParameters.PointFormat.COMPRESSED)
145             .setVariant(EciesParameters.Variant.CRUNCHY)
146             .setDemParameters(xChaCha20Poly1305Parameters)
147             .setSalt(SALT)
148             .build();
149 
150     assertThat(params.getDemParameters()).isEqualTo(xChaCha20Poly1305Parameters);
151   }
152 
153   @Theory
buildWithAesSivDem_succeeds()154   public void buildWithAesSivDem_succeeds() throws Exception {
155     Parameters aesSivParameters =
156         AesSivParameters.builder()
157             .setKeySizeBytes(64)
158             .setVariant(AesSivParameters.Variant.NO_PREFIX)
159             .build();
160 
161     EciesParameters params =
162         EciesParameters.builder()
163             .setCurveType(EciesParameters.CurveType.NIST_P256)
164             .setHashType(EciesParameters.HashType.SHA256)
165             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
166             .setVariant(EciesParameters.Variant.NO_PREFIX)
167             .setDemParameters(aesSivParameters)
168             .setSalt(SALT)
169             .build();
170 
171     assertThat(params.getDemParameters()).isEqualTo(aesSivParameters);
172   }
173 
174   @Theory
buildWithX25519_succeeds( @romDataPoints"variants") EciesParameters.Variant variant, @FromDataPoints("hashTypes") EciesParameters.HashType hashType)175   public void buildWithX25519_succeeds(
176       @FromDataPoints("variants") EciesParameters.Variant variant,
177       @FromDataPoints("hashTypes") EciesParameters.HashType hashType)
178       throws Exception {
179     Parameters xChaCha20Poly1305Parameters = XChaCha20Poly1305Parameters.create();
180 
181     EciesParameters params =
182         EciesParameters.builder()
183             .setCurveType(EciesParameters.CurveType.X25519)
184             .setHashType(hashType)
185             .setVariant(variant)
186             .setDemParameters(xChaCha20Poly1305Parameters)
187             .setSalt(SALT)
188             .build();
189 
190     assertThat(params.getCurveType()).isEqualTo(EciesParameters.CurveType.X25519);
191     assertThat(params.getNistCurvePointFormat()).isEqualTo(null);
192     assertThat(params.getHashType()).isEqualTo(hashType);
193     assertThat(params.getVariant()).isEqualTo(variant);
194   }
195 
196   @Test
buildWithX25519NistCurveSet_fails()197   public void buildWithX25519NistCurveSet_fails() throws Exception {
198     Parameters xChaCha20Poly1305Parameters = XChaCha20Poly1305Parameters.create();
199 
200     EciesParameters.Builder builder =
201         EciesParameters.builder()
202             .setCurveType(EciesParameters.CurveType.X25519)
203             .setHashType(EciesParameters.HashType.SHA256)
204             .setNistCurvePointFormat(EciesParameters.PointFormat.COMPRESSED)
205             .setVariant(EciesParameters.Variant.NO_PREFIX)
206             .setDemParameters(xChaCha20Poly1305Parameters)
207             .setSalt(SALT);
208 
209     assertThrows(GeneralSecurityException.class, builder::build);
210   }
211 
212   @Test
buildWithoutSettingSalt_succeeds()213   public void buildWithoutSettingSalt_succeeds() throws Exception {
214     EciesParameters parameters =
215         EciesParameters.builder()
216             .setCurveType(EciesParameters.CurveType.NIST_P256)
217             .setHashType(EciesParameters.HashType.SHA256)
218             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
219             .setVariant(EciesParameters.Variant.NO_PREFIX)
220             .setDemParameters(XChaCha20Poly1305Parameters.create())
221             .build();
222 
223     assertThat(parameters.getSalt()).isNull();
224   }
225 
226   @Test
buildWithEmptySalt_succeeds()227   public void buildWithEmptySalt_succeeds() throws Exception {
228     EciesParameters parameters =
229         EciesParameters.builder()
230             .setCurveType(EciesParameters.CurveType.NIST_P256)
231             .setHashType(EciesParameters.HashType.SHA256)
232             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
233             .setVariant(EciesParameters.Variant.NO_PREFIX)
234             .setDemParameters(XChaCha20Poly1305Parameters.create())
235             .setSalt(Bytes.copyFrom("".getBytes(UTF_8)))
236             .build();
237 
238     assertThat(parameters.getSalt()).isNull();
239   }
240 
241   @Test
clearSaltWithEmptyString_succeeds()242   public void clearSaltWithEmptyString_succeeds() throws Exception {
243     EciesParameters parameters =
244         EciesParameters.builder()
245             .setCurveType(EciesParameters.CurveType.NIST_P256)
246             .setHashType(EciesParameters.HashType.SHA256)
247             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
248             .setVariant(EciesParameters.Variant.NO_PREFIX)
249             .setDemParameters(XChaCha20Poly1305Parameters.create())
250             .setSalt(Bytes.copyFrom("Some Salt".getBytes(UTF_8)))
251             .setSalt(Bytes.copyFrom("".getBytes(UTF_8)))
252             .build();
253 
254     assertThat(parameters.getSalt()).isNull();
255   }
256 
257   @Theory
buildWithDefaultVariant_hasNoPrefix()258   public void buildWithDefaultVariant_hasNoPrefix() throws Exception {
259     Parameters demParameters = XChaCha20Poly1305Parameters.create();
260     EciesParameters params =
261         EciesParameters.builder()
262             .setCurveType(EciesParameters.CurveType.NIST_P256)
263             .setHashType(EciesParameters.HashType.SHA256)
264             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
265             .setVariant(EciesParameters.Variant.NO_PREFIX)
266             .setDemParameters(demParameters)
267             .setSalt(SALT)
268             .build();
269 
270     assertThat(params.getVariant()).isEqualTo(EciesParameters.Variant.NO_PREFIX);
271   }
272 
273   @Test
buildWithoutCurveType_fails()274   public void buildWithoutCurveType_fails() throws Exception {
275     EciesParameters.Builder builder =
276         EciesParameters.builder()
277             .setHashType(EciesParameters.HashType.SHA256)
278             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
279             .setVariant(EciesParameters.Variant.NO_PREFIX)
280             .setDemParameters(XChaCha20Poly1305Parameters.create());
281 
282     assertThrows(GeneralSecurityException.class, builder::build);
283   }
284 
285   @Test
buildWithoutHashType_fails()286   public void buildWithoutHashType_fails() throws Exception {
287     EciesParameters.Builder builder =
288         EciesParameters.builder()
289             .setCurveType(EciesParameters.CurveType.NIST_P256)
290             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
291             .setVariant(EciesParameters.Variant.NO_PREFIX)
292             .setDemParameters(XChaCha20Poly1305Parameters.create());
293 
294     assertThrows(GeneralSecurityException.class, builder::build);
295   }
296 
297   @Test
buildWithoutPointFormat_fails()298   public void buildWithoutPointFormat_fails() throws Exception {
299     EciesParameters.Builder builder =
300         EciesParameters.builder()
301             .setHashType(EciesParameters.HashType.SHA256)
302             .setCurveType(EciesParameters.CurveType.NIST_P256)
303             .setVariant(EciesParameters.Variant.NO_PREFIX)
304             .setDemParameters(XChaCha20Poly1305Parameters.create());
305 
306     assertThrows(GeneralSecurityException.class, builder::build);
307   }
308 
309   @Test
buildWithoutDemParameters_fails()310   public void buildWithoutDemParameters_fails() throws Exception {
311     EciesParameters.Builder builder =
312         EciesParameters.builder()
313             .setHashType(EciesParameters.HashType.SHA256)
314             .setCurveType(EciesParameters.CurveType.NIST_P256)
315             .setNistCurvePointFormat(EciesParameters.PointFormat.COMPRESSED)
316             .setVariant(EciesParameters.Variant.NO_PREFIX);
317 
318     assertThrows(GeneralSecurityException.class, builder::build);
319   }
320 
321   @Test
setUnsupportedDemParameters_fails()322   public void setUnsupportedDemParameters_fails() throws Exception {
323     assertThrows(
324         GeneralSecurityException.class,
325         () ->
326             EciesParameters.builder()
327                 .setHashType(EciesParameters.HashType.SHA256)
328                 .setCurveType(EciesParameters.CurveType.NIST_P256)
329                 .setNistCurvePointFormat(EciesParameters.PointFormat.COMPRESSED)
330                 .setVariant(EciesParameters.Variant.NO_PREFIX)
331                 .setDemParameters(ChaCha20Poly1305Parameters.create())
332                 .build());
333   }
334 
335   @Test
setDemParametersWithIdRequirement_fails()336   public void setDemParametersWithIdRequirement_fails() throws Exception {
337     assertThrows(
338         GeneralSecurityException.class,
339         () ->
340             EciesParameters.builder()
341                 .setHashType(EciesParameters.HashType.SHA256)
342                 .setCurveType(EciesParameters.CurveType.NIST_P256)
343                 .setNistCurvePointFormat(EciesParameters.PointFormat.COMPRESSED)
344                 .setVariant(EciesParameters.Variant.NO_PREFIX)
345                 .setDemParameters(
346                     XChaCha20Poly1305Parameters.create(XChaCha20Poly1305Parameters.Variant.TINK))
347                 .build());
348   }
349 
350   @Test
buildWithVariantSetToNull_fails()351   public void buildWithVariantSetToNull_fails() throws Exception {
352     EciesParameters.Builder builder =
353         EciesParameters.builder()
354             .setHashType(EciesParameters.HashType.SHA256)
355             .setCurveType(EciesParameters.CurveType.NIST_P256)
356             .setNistCurvePointFormat(EciesParameters.PointFormat.COMPRESSED)
357             .setDemParameters(XChaCha20Poly1305Parameters.create())
358             .setVariant(null);
359 
360     assertThrows(GeneralSecurityException.class, builder::build);
361   }
362 
363   @Test
buildWithNoPrefix_doesNotHaveIdRequirement()364   public void buildWithNoPrefix_doesNotHaveIdRequirement() throws Exception {
365     EciesParameters noPrefixParams =
366         EciesParameters.builder()
367             .setCurveType(EciesParameters.CurveType.NIST_P256)
368             .setHashType(EciesParameters.HashType.SHA256)
369             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
370             .setVariant(EciesParameters.Variant.NO_PREFIX)
371             .setDemParameters(XChaCha20Poly1305Parameters.create())
372             .build();
373 
374     assertThat(noPrefixParams.hasIdRequirement()).isFalse();
375   }
376 
377   @Test
buildWithTink_hasIdRequirement()378   public void buildWithTink_hasIdRequirement() throws Exception {
379     EciesParameters tinkParams =
380         EciesParameters.builder()
381             .setCurveType(EciesParameters.CurveType.NIST_P256)
382             .setHashType(EciesParameters.HashType.SHA256)
383             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
384             .setVariant(EciesParameters.Variant.TINK)
385             .setDemParameters(XChaCha20Poly1305Parameters.create())
386             .build();
387 
388     assertThat(tinkParams.hasIdRequirement()).isTrue();
389   }
390 
391   @Test
buildWithCrunchy_hasIdRequirement()392   public void buildWithCrunchy_hasIdRequirement() throws Exception {
393 
394     EciesParameters crunchyParams =
395         EciesParameters.builder()
396             .setCurveType(EciesParameters.CurveType.NIST_P256)
397             .setHashType(EciesParameters.HashType.SHA256)
398             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
399             .setVariant(EciesParameters.Variant.CRUNCHY)
400             .setDemParameters(XChaCha20Poly1305Parameters.create())
401             .build();
402 
403     assertThat(crunchyParams.hasIdRequirement()).isTrue();
404   }
405 
406   @Test
testEqualsAndEqualHashCode()407   public void testEqualsAndEqualHashCode() throws Exception {
408     EciesParameters params =
409         EciesParameters.builder()
410             .setCurveType(EciesParameters.CurveType.NIST_P256)
411             .setHashType(EciesParameters.HashType.SHA256)
412             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
413             .setVariant(EciesParameters.Variant.NO_PREFIX)
414             .setDemParameters(XChaCha20Poly1305Parameters.create())
415             .setSalt(SALT)
416             .build();
417     EciesParameters duplicateParams =
418         EciesParameters.builder()
419             .setCurveType(EciesParameters.CurveType.NIST_P256)
420             .setHashType(EciesParameters.HashType.SHA256)
421             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
422             .setVariant(EciesParameters.Variant.NO_PREFIX)
423             .setDemParameters(XChaCha20Poly1305Parameters.create())
424             .setSalt(SALT)
425             .build();
426 
427     assertThat(params).isEqualTo(duplicateParams);
428     assertThat(params.hashCode()).isEqualTo(duplicateParams.hashCode());
429   }
430 
431   @Test
parametersWithDifferentVariants_areNotEqual()432   public void parametersWithDifferentVariants_areNotEqual() throws Exception {
433     EciesParameters crunchyParams =
434         EciesParameters.builder()
435             .setCurveType(EciesParameters.CurveType.NIST_P256)
436             .setHashType(EciesParameters.HashType.SHA256)
437             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
438             .setVariant(EciesParameters.Variant.CRUNCHY)
439             .setDemParameters(XChaCha20Poly1305Parameters.create())
440             .build();
441 
442     EciesParameters tinkParams =
443         EciesParameters.builder()
444             .setCurveType(EciesParameters.CurveType.NIST_P256)
445             .setHashType(EciesParameters.HashType.SHA256)
446             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
447             .setVariant(EciesParameters.Variant.TINK)
448             .setDemParameters(XChaCha20Poly1305Parameters.create())
449             .build();
450 
451     assertThat(crunchyParams).isNotEqualTo(tinkParams);
452     assertThat(crunchyParams.hashCode()).isNotEqualTo(tinkParams.hashCode());
453   }
454 
455   @Test
parametersWithDifferentCurveTypes_areNotEqual()456   public void parametersWithDifferentCurveTypes_areNotEqual() throws Exception {
457     EciesParameters p256Params =
458         EciesParameters.builder()
459             .setCurveType(EciesParameters.CurveType.NIST_P256)
460             .setHashType(EciesParameters.HashType.SHA256)
461             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
462             .setDemParameters(XChaCha20Poly1305Parameters.create())
463             .build();
464 
465     EciesParameters p521Params =
466         EciesParameters.builder()
467             .setCurveType(EciesParameters.CurveType.NIST_P521)
468             .setHashType(EciesParameters.HashType.SHA256)
469             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
470             .setDemParameters(XChaCha20Poly1305Parameters.create())
471             .build();
472 
473     assertThat(p256Params).isNotEqualTo(p521Params);
474     assertThat(p256Params.hashCode()).isNotEqualTo(p521Params.hashCode());
475   }
476 
477   @Test
parametersWithDifferentHashTypes_areNotEqual()478   public void parametersWithDifferentHashTypes_areNotEqual() throws Exception {
479     EciesParameters sha256Params =
480         EciesParameters.builder()
481             .setCurveType(EciesParameters.CurveType.NIST_P256)
482             .setHashType(EciesParameters.HashType.SHA256)
483             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
484             .setDemParameters(XChaCha20Poly1305Parameters.create())
485             .build();
486 
487     EciesParameters sha512Params =
488         EciesParameters.builder()
489             .setCurveType(EciesParameters.CurveType.NIST_P256)
490             .setHashType(EciesParameters.HashType.SHA512)
491             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
492             .setDemParameters(XChaCha20Poly1305Parameters.create())
493             .build();
494 
495     assertThat(sha256Params).isNotEqualTo(sha512Params);
496     assertThat(sha256Params.hashCode()).isNotEqualTo(sha512Params.hashCode());
497   }
498 
499   @Test
parametersWithDifferenPointFormats_areNotEqual()500   public void parametersWithDifferenPointFormats_areNotEqual() throws Exception {
501     EciesParameters compressedParams =
502         EciesParameters.builder()
503             .setCurveType(EciesParameters.CurveType.NIST_P256)
504             .setHashType(EciesParameters.HashType.SHA256)
505             .setNistCurvePointFormat(EciesParameters.PointFormat.COMPRESSED)
506             .setDemParameters(XChaCha20Poly1305Parameters.create())
507             .build();
508 
509     EciesParameters uncompressedParams =
510         EciesParameters.builder()
511             .setCurveType(EciesParameters.CurveType.NIST_P256)
512             .setHashType(EciesParameters.HashType.SHA256)
513             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
514             .setDemParameters(XChaCha20Poly1305Parameters.create())
515             .build();
516 
517     assertThat(compressedParams).isNotEqualTo(uncompressedParams);
518     assertThat(compressedParams.hashCode()).isNotEqualTo(uncompressedParams.hashCode());
519   }
520 
521   @Test
parametersWithDifferentDemParameters_areNotEqual()522   public void parametersWithDifferentDemParameters_areNotEqual() throws Exception {
523     EciesParameters aesSivParams =
524         EciesParameters.builder()
525             .setCurveType(EciesParameters.CurveType.NIST_P256)
526             .setHashType(EciesParameters.HashType.SHA256)
527             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
528             .setDemParameters(
529                 AesSivParameters.builder()
530                     .setKeySizeBytes(64)
531                     .setVariant(AesSivParameters.Variant.NO_PREFIX)
532                     .build())
533             .build();
534 
535     EciesParameters xChaCha20Poly1305Params =
536         EciesParameters.builder()
537             .setCurveType(EciesParameters.CurveType.NIST_P256)
538             .setHashType(EciesParameters.HashType.SHA256)
539             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
540             .setDemParameters(XChaCha20Poly1305Parameters.create())
541             .build();
542 
543     assertThat(aesSivParams).isNotEqualTo(xChaCha20Poly1305Params);
544     assertThat(aesSivParams.hashCode()).isNotEqualTo(xChaCha20Poly1305Params.hashCode());
545   }
546 
547   @Test
parametersWithDifferentSalts_areNotEqual()548   public void parametersWithDifferentSalts_areNotEqual() throws Exception {
549     EciesParameters nonEmptySaltParams =
550         EciesParameters.builder()
551             .setCurveType(EciesParameters.CurveType.NIST_P256)
552             .setHashType(EciesParameters.HashType.SHA256)
553             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
554             .setDemParameters(XChaCha20Poly1305Parameters.create())
555             .setSalt(SALT)
556             .build();
557 
558     EciesParameters emptySaltParams =
559         EciesParameters.builder()
560             .setCurveType(EciesParameters.CurveType.NIST_P256)
561             .setHashType(EciesParameters.HashType.SHA256)
562             .setNistCurvePointFormat(EciesParameters.PointFormat.UNCOMPRESSED)
563             .setDemParameters(XChaCha20Poly1305Parameters.create())
564             .setSalt(Bytes.copyFrom("".getBytes(UTF_8)))
565             .build();
566 
567     assertThat(emptySaltParams).isNotEqualTo(nonEmptySaltParams);
568     assertThat(emptySaltParams.hashCode()).isNotEqualTo(nonEmptySaltParams.hashCode());
569   }
570 }
571