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