• 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.prf;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 import static org.junit.Assert.assertThrows;
21 
22 import java.security.GeneralSecurityException;
23 import org.junit.Test;
24 import org.junit.experimental.theories.DataPoints;
25 import org.junit.experimental.theories.FromDataPoints;
26 import org.junit.experimental.theories.Theories;
27 import org.junit.experimental.theories.Theory;
28 import org.junit.runner.RunWith;
29 
30 @RunWith(Theories.class)
31 public final class HmacPrfParametersTest {
32   @DataPoints("keySizes")
33   public static final int[] KEY_SIZES = new int[] {16, 32};
34 
35   @DataPoints("hashTypes")
36   public static final HmacPrfParameters.HashType[] HASH_TYPES =
37       new HmacPrfParameters.HashType[] {
38         HmacPrfParameters.HashType.SHA1,
39         HmacPrfParameters.HashType.SHA224,
40         HmacPrfParameters.HashType.SHA256,
41         HmacPrfParameters.HashType.SHA384,
42         HmacPrfParameters.HashType.SHA512
43       };
44 
45   @Theory
buildParametersVariedValuesAndGetProperties( @romDataPoints"keySizes") int keySize, @FromDataPoints("hashTypes") HmacPrfParameters.HashType hashType)46   public void buildParametersVariedValuesAndGetProperties(
47       @FromDataPoints("keySizes") int keySize,
48       @FromDataPoints("hashTypes") HmacPrfParameters.HashType hashType)
49       throws Exception {
50     HmacPrfParameters parameters =
51         HmacPrfParameters.builder().setKeySizeBytes(keySize).setHashType(hashType).build();
52     assertThat(parameters.getKeySizeBytes()).isEqualTo(keySize);
53     assertThat(parameters.getHashType()).isEqualTo(hashType);
54     assertThat(parameters.hasIdRequirement()).isFalse();
55     assertThat(parameters.toString())
56         .isEqualTo("HMAC PRF Parameters (hashType: " + hashType + " and " + keySize + "-byte key)");
57   }
58 
59   @Test
buildWithoutSettingKeySize_fails()60   public void buildWithoutSettingKeySize_fails() throws Exception {
61     assertThrows(
62         GeneralSecurityException.class,
63         () -> HmacPrfParameters.builder().setHashType(HmacPrfParameters.HashType.SHA256).build());
64   }
65 
66   @Test
buildWithUnsupportedKeySize_fails()67   public void buildWithUnsupportedKeySize_fails() throws Exception {
68     assertThrows(
69         GeneralSecurityException.class,
70         () ->
71             HmacPrfParameters.builder()
72                 .setKeySizeBytes(15)
73                 .setHashType(HmacPrfParameters.HashType.SHA256)
74                 .build());
75   }
76 
77   @Test
buildWithoutSettingHashType_fails()78   public void buildWithoutSettingHashType_fails() throws Exception {
79     assertThrows(
80         GeneralSecurityException.class,
81         () -> HmacPrfParameters.builder().setKeySizeBytes(16).build());
82   }
83 
84   @Test
testEqualsAndHashCode()85   public void testEqualsAndHashCode() throws Exception {
86     HmacPrfParameters parameters =
87         HmacPrfParameters.builder()
88             .setKeySizeBytes(16)
89             .setHashType(HmacPrfParameters.HashType.SHA256)
90             .build();
91     HmacPrfParameters sameParameters =
92         HmacPrfParameters.builder()
93             .setKeySizeBytes(16)
94             .setHashType(HmacPrfParameters.HashType.SHA256)
95             .build();
96     assertThat(sameParameters).isEqualTo(parameters);
97     assertThat(sameParameters.hashCode()).isEqualTo(parameters.hashCode());
98 
99     // Different key size
100     HmacPrfParameters keySize32Parameters =
101         HmacPrfParameters.builder()
102             .setKeySizeBytes(32)
103             .setHashType(parameters.getHashType())
104             .build();
105     assertThat(keySize32Parameters).isNotEqualTo(parameters);
106     assertThat(keySize32Parameters.hashCode()).isNotEqualTo(parameters.hashCode());
107 
108     // Different hash type
109     HmacPrfParameters sha512Parameters =
110         HmacPrfParameters.builder()
111             .setKeySizeBytes(parameters.getKeySizeBytes())
112             .setHashType(HmacPrfParameters.HashType.SHA512)
113             .build();
114     assertThat(sha512Parameters).isNotEqualTo(parameters);
115     assertThat(sha512Parameters.hashCode()).isNotEqualTo(parameters.hashCode());
116   }
117 
118   @Test
119   @SuppressWarnings("TruthIncompatibleType")
testEqualDifferentClass()120   public void testEqualDifferentClass() throws Exception {
121     HmacPrfParameters hmacPrfParameters =
122         HmacPrfParameters.builder()
123             .setKeySizeBytes(16)
124             .setHashType(HmacPrfParameters.HashType.SHA256)
125             .build();
126     HkdfPrfParameters hkdfPrfParameters =
127         HkdfPrfParameters.builder()
128             .setKeySizeBytes(16)
129             .setHashType(HkdfPrfParameters.HashType.SHA256)
130             .build();
131     assertThat(hmacPrfParameters).isNotEqualTo(hkdfPrfParameters);
132   }
133 }
134