• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2022 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.aead;
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.runner.RunWith;
25 import org.junit.runners.JUnit4;
26 
27 @RunWith(JUnit4.class)
28 public final class AesGcmParametersTest {
29   private static final AesGcmParameters.Variant NO_PREFIX = AesGcmParameters.Variant.NO_PREFIX;
30   private static final AesGcmParameters.Variant TINK = AesGcmParameters.Variant.TINK;
31   private static final AesGcmParameters.Variant CRUNCHY = AesGcmParameters.Variant.CRUNCHY;
32 
33   @Test
buildParametersAndGetProperties()34   public void buildParametersAndGetProperties() throws Exception {
35     AesGcmParameters parameters =
36         AesGcmParameters.builder()
37             .setKeySizeBytes(16)
38             .setIvSizeBytes(16)
39             .setTagSizeBytes(16)
40             .setVariant(NO_PREFIX)
41             .build();
42     assertThat(parameters.getKeySizeBytes()).isEqualTo(16);
43     assertThat(parameters.getIvSizeBytes()).isEqualTo(16);
44     assertThat(parameters.getTagSizeBytes()).isEqualTo(16);
45     assertThat(parameters.getVariant()).isEqualTo(NO_PREFIX);
46     assertThat(parameters.hasIdRequirement()).isFalse();
47   }
48 
49   @Test
buildParametersWithoutSettingVariant_hasNoPrefix()50   public void buildParametersWithoutSettingVariant_hasNoPrefix() throws Exception {
51     AesGcmParameters parameters =
52         AesGcmParameters.builder()
53             .setKeySizeBytes(16)
54             .setIvSizeBytes(16)
55             .setTagSizeBytes(16)
56             .build();
57     assertThat(parameters.getVariant()).isEqualTo(NO_PREFIX);
58     assertThat(parameters.hasIdRequirement()).isFalse();
59   }
60 
61   @Test
buildParametersWithoutSettingKeySize_fails()62   public void buildParametersWithoutSettingKeySize_fails() throws Exception {
63     assertThrows(
64         GeneralSecurityException.class,
65         () ->
66             AesGcmParameters.builder()
67                 .setVariant(NO_PREFIX)
68                 .setIvSizeBytes(16)
69                 .setTagSizeBytes(16)
70                 .build());
71   }
72 
73   @Test
buildParametersWithoutSettingIvSize_fails()74   public void buildParametersWithoutSettingIvSize_fails() throws Exception {
75     assertThrows(
76         GeneralSecurityException.class,
77         () ->
78             AesGcmParameters.builder()
79                 .setKeySizeBytes(16)
80                 .setTagSizeBytes(16)
81                 .setVariant(NO_PREFIX)
82                 .build());
83   }
84 
85   @Test
buildParametersWithoutSettingTagSize_fails()86   public void buildParametersWithoutSettingTagSize_fails() throws Exception {
87     assertThrows(
88         GeneralSecurityException.class,
89         () ->
90             AesGcmParameters.builder()
91                 .setKeySizeBytes(16)
92                 .setIvSizeBytes(16)
93                 .setVariant(NO_PREFIX)
94                 .build());
95   }
96 
97   @Test
buildWithVariantSetToNull_fails()98   public void buildWithVariantSetToNull_fails() throws Exception {
99     assertThrows(
100         GeneralSecurityException.class,
101         () ->
102             AesGcmParameters.builder()
103                 .setKeySizeBytes(16)
104                 .setIvSizeBytes(16)
105                 .setTagSizeBytes(16)
106                 .setVariant(null)
107                 .build());
108   }
109 
110   @Test
buildParametersWithTinkPrefix()111   public void buildParametersWithTinkPrefix() throws Exception {
112     AesGcmParameters parameters =
113         AesGcmParameters.builder()
114             .setKeySizeBytes(24)
115             .setIvSizeBytes(16)
116             .setTagSizeBytes(16)
117             .setVariant(TINK)
118             .build();
119     assertThat(parameters.getKeySizeBytes()).isEqualTo(24);
120     assertThat(parameters.getVariant()).isEqualTo(TINK);
121     assertThat(parameters.hasIdRequirement()).isTrue();
122   }
123 
124   @Test
buildParametersWithCrunchyPrefix()125   public void buildParametersWithCrunchyPrefix() throws Exception {
126     AesGcmParameters parameters =
127         AesGcmParameters.builder()
128             .setKeySizeBytes(32)
129             .setIvSizeBytes(16)
130             .setTagSizeBytes(16)
131             .setVariant(CRUNCHY)
132             .build();
133     assertThat(parameters.getKeySizeBytes()).isEqualTo(32);
134     assertThat(parameters.getVariant()).isEqualTo(CRUNCHY);
135     assertThat(parameters.hasIdRequirement()).isTrue();
136   }
137 
138   @Test
testEqualsAndEqualHashCode()139   public void testEqualsAndEqualHashCode() throws Exception {
140     AesGcmParameters parameters1 =
141         AesGcmParameters.builder()
142             .setKeySizeBytes(16)
143             .setIvSizeBytes(16)
144             .setTagSizeBytes(16)
145             .setVariant(NO_PREFIX)
146             .build();
147     AesGcmParameters parameters2 =
148         AesGcmParameters.builder()
149             .setKeySizeBytes(16)
150             .setIvSizeBytes(16)
151             .setTagSizeBytes(16)
152             .setVariant(NO_PREFIX)
153             .build();
154     assertThat(parameters1).isEqualTo(parameters2);
155     assertThat(parameters1.hashCode()).isEqualTo(parameters2.hashCode());
156   }
157 
158   @Test
buildParametersWithBadKeySizeFails()159   public void buildParametersWithBadKeySizeFails() throws Exception {
160     assertThrows(
161         GeneralSecurityException.class,
162         () ->
163             AesGcmParameters.builder()
164                 .setKeySizeBytes(12)
165                 .setIvSizeBytes(16)
166                 .setTagSizeBytes(16)
167                 .setVariant(NO_PREFIX)
168                 .build());
169 
170     assertThrows(
171         GeneralSecurityException.class,
172         () ->
173             AesGcmParameters.builder()
174                 .setKeySizeBytes(34)
175                 .setIvSizeBytes(16)
176                 .setTagSizeBytes(16)
177                 .setVariant(NO_PREFIX)
178                 .build());
179   }
180 
181   @Test
buildParametersWithBadTagSizeFails()182   public void buildParametersWithBadTagSizeFails() throws Exception {
183     assertThrows(
184         GeneralSecurityException.class,
185         () ->
186             AesGcmParameters.builder()
187                 .setKeySizeBytes(16)
188                 .setIvSizeBytes(16)
189                 .setTagSizeBytes(17)
190                 .setVariant(NO_PREFIX)
191                 .build());
192   }
193 
194   @Test
buildParametersWithBadIvSizeFails()195   public void buildParametersWithBadIvSizeFails() throws Exception {
196     assertThrows(
197         GeneralSecurityException.class,
198         () ->
199             AesGcmParameters.builder()
200                 .setKeySizeBytes(16)
201                 .setIvSizeBytes(0)
202                 .setTagSizeBytes(17)
203                 .setVariant(NO_PREFIX)
204                 .build());
205   }
206 
207   @Test
testNotEqualandNotEqualHashCode()208   public void testNotEqualandNotEqualHashCode() throws Exception {
209     AesGcmParameters parameters1 =
210         AesGcmParameters.builder()
211             .setKeySizeBytes(16)
212             .setIvSizeBytes(12)
213             .setTagSizeBytes(16)
214             .setVariant(NO_PREFIX)
215             .build();
216 
217     AesGcmParameters parameters2 =
218         AesGcmParameters.builder()
219             .setKeySizeBytes(24)
220             .setIvSizeBytes(12)
221             .setTagSizeBytes(16)
222             .setVariant(NO_PREFIX)
223             .build();
224     assertThat(parameters1).isNotEqualTo(parameters2);
225     assertThat(parameters1.hashCode()).isNotEqualTo(parameters2.hashCode());
226 
227     parameters2 =
228         AesGcmParameters.builder()
229             .setKeySizeBytes(16)
230             .setIvSizeBytes(12)
231             .setTagSizeBytes(14)
232             .setVariant(NO_PREFIX)
233             .build();
234     assertThat(parameters1).isNotEqualTo(parameters2);
235     assertThat(parameters1.hashCode()).isNotEqualTo(parameters2.hashCode());
236 
237     parameters2 =
238         AesGcmParameters.builder()
239             .setKeySizeBytes(16)
240             .setIvSizeBytes(12)
241             .setTagSizeBytes(16)
242             .setVariant(TINK)
243             .build();
244     assertThat(parameters1).isNotEqualTo(parameters2);
245     assertThat(parameters1.hashCode()).isNotEqualTo(parameters2.hashCode());
246 
247     parameters2 =
248         AesGcmParameters.builder()
249             .setKeySizeBytes(16)
250             .setIvSizeBytes(12)
251             .setTagSizeBytes(16)
252             .setVariant(CRUNCHY)
253             .build();
254     assertThat(parameters1).isNotEqualTo(parameters2);
255     assertThat(parameters1.hashCode()).isNotEqualTo(parameters2.hashCode());
256   }
257 }
258