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 AesEaxParametersTest { 29 private static final AesEaxParameters.Variant NO_PREFIX = AesEaxParameters.Variant.NO_PREFIX; 30 private static final AesEaxParameters.Variant TINK = AesEaxParameters.Variant.TINK; 31 private static final AesEaxParameters.Variant CRUNCHY = AesEaxParameters.Variant.CRUNCHY; 32 33 @Test buildParametersAndGetProperties()34 public void buildParametersAndGetProperties() throws Exception { 35 AesEaxParameters parameters = 36 AesEaxParameters.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 AesEaxParameters parameters = 52 AesEaxParameters.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 AesEaxParameters.builder() 67 .setIvSizeBytes(16) 68 .setTagSizeBytes(16) 69 .setVariant(NO_PREFIX) 70 .build()); 71 } 72 73 @Test buildParametersWithoutSettingIvSize_fails()74 public void buildParametersWithoutSettingIvSize_fails() throws Exception { 75 assertThrows( 76 GeneralSecurityException.class, 77 () -> 78 AesEaxParameters.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 AesEaxParameters.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 AesEaxParameters.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 AesEaxParameters parameters = 113 AesEaxParameters.builder() 114 .setKeySizeBytes(16) 115 .setIvSizeBytes(16) 116 .setTagSizeBytes(16) 117 .setVariant(TINK) 118 .build(); 119 assertThat(parameters.getKeySizeBytes()).isEqualTo(16); 120 assertThat(parameters.getIvSizeBytes()).isEqualTo(16); 121 assertThat(parameters.getTagSizeBytes()).isEqualTo(16); 122 assertThat(parameters.getVariant()).isEqualTo(TINK); 123 assertThat(parameters.hasIdRequirement()).isTrue(); 124 } 125 126 @Test buildParametersWithCrunchyPrefix()127 public void buildParametersWithCrunchyPrefix() throws Exception { 128 AesEaxParameters parameters = 129 AesEaxParameters.builder() 130 .setKeySizeBytes(16) 131 .setIvSizeBytes(16) 132 .setTagSizeBytes(16) 133 .setVariant(CRUNCHY) 134 .build(); 135 assertThat(parameters.getKeySizeBytes()).isEqualTo(16); 136 assertThat(parameters.getIvSizeBytes()).isEqualTo(16); 137 assertThat(parameters.getTagSizeBytes()).isEqualTo(16); 138 assertThat(parameters.getVariant()).isEqualTo(CRUNCHY); 139 assertThat(parameters.hasIdRequirement()).isTrue(); 140 } 141 142 @Test testEqualsAndEqualHashCode()143 public void testEqualsAndEqualHashCode() throws Exception { 144 AesEaxParameters parameters1 = 145 AesEaxParameters.builder() 146 .setKeySizeBytes(16) 147 .setIvSizeBytes(16) 148 .setTagSizeBytes(16) 149 .setVariant(NO_PREFIX) 150 .build(); 151 AesEaxParameters parameters2 = 152 AesEaxParameters.builder() 153 .setKeySizeBytes(16) 154 .setIvSizeBytes(16) 155 .setTagSizeBytes(16) 156 .setVariant(NO_PREFIX) 157 .build(); 158 assertThat(parameters1).isEqualTo(parameters2); 159 assertThat(parameters1.hashCode()).isEqualTo(parameters2.hashCode()); 160 } 161 162 @Test buildParametersWithKeySize16And32()163 public void buildParametersWithKeySize16And32() throws Exception { 164 AesEaxParameters parameters = 165 AesEaxParameters.builder() 166 .setKeySizeBytes(16) 167 .setIvSizeBytes(16) 168 .setTagSizeBytes(16) 169 .setVariant(NO_PREFIX) 170 .build(); 171 assertThat(parameters.getKeySizeBytes()).isEqualTo(16); 172 parameters = 173 AesEaxParameters.builder() 174 .setKeySizeBytes(32) 175 .setIvSizeBytes(12) 176 .setTagSizeBytes(16) 177 .setVariant(NO_PREFIX) 178 .build(); 179 assertThat(parameters.getKeySizeBytes()).isEqualTo(32); 180 181 assertThrows( 182 GeneralSecurityException.class, 183 () -> 184 AesEaxParameters.builder() 185 .setKeySizeBytes(8) 186 .setIvSizeBytes(16) 187 .setTagSizeBytes(16) 188 .setVariant(NO_PREFIX) 189 .build()); 190 assertThrows( 191 GeneralSecurityException.class, 192 () -> 193 AesEaxParameters.builder() 194 .setKeySizeBytes(12) 195 .setIvSizeBytes(16) 196 .setTagSizeBytes(16) 197 .setVariant(NO_PREFIX) 198 .build()); 199 } 200 201 @Test buildParametersWithLargerTagSizeFails()202 public void buildParametersWithLargerTagSizeFails() throws Exception { 203 assertThrows( 204 GeneralSecurityException.class, 205 () -> 206 AesEaxParameters.builder() 207 .setKeySizeBytes(16) 208 .setIvSizeBytes(16) 209 .setTagSizeBytes(32) 210 .setVariant(NO_PREFIX) 211 .build()); 212 } 213 214 @Test buildParametersWithIvSize12And16()215 public void buildParametersWithIvSize12And16() throws Exception { 216 AesEaxParameters parameters = 217 AesEaxParameters.builder() 218 .setKeySizeBytes(16) 219 .setIvSizeBytes(12) 220 .setTagSizeBytes(16) 221 .setVariant(NO_PREFIX) 222 .build(); 223 assertThat(parameters.getIvSizeBytes()).isEqualTo(12); 224 parameters = 225 AesEaxParameters.builder() 226 .setKeySizeBytes(32) 227 .setIvSizeBytes(16) 228 .setTagSizeBytes(16) 229 .setVariant(NO_PREFIX) 230 .build(); 231 assertThat(parameters.getIvSizeBytes()).isEqualTo(16); 232 233 assertThrows( 234 GeneralSecurityException.class, 235 () -> 236 AesEaxParameters.builder() 237 .setKeySizeBytes(16) 238 .setIvSizeBytes(8) 239 .setTagSizeBytes(16) 240 .setVariant(NO_PREFIX) 241 .build()); 242 assertThrows( 243 GeneralSecurityException.class, 244 () -> 245 AesEaxParameters.builder() 246 .setKeySizeBytes(16) 247 .setIvSizeBytes(22) 248 .setTagSizeBytes(16) 249 .setVariant(NO_PREFIX) 250 .build()); 251 } 252 253 @Test testNotEqualandNotEqualHashCode()254 public void testNotEqualandNotEqualHashCode() throws Exception { 255 AesEaxParameters parameters1 = 256 AesEaxParameters.builder() 257 .setKeySizeBytes(16) 258 .setIvSizeBytes(16) 259 .setTagSizeBytes(16) 260 .setVariant(NO_PREFIX) 261 .build(); 262 263 AesEaxParameters parameters2 = 264 AesEaxParameters.builder() 265 .setKeySizeBytes(32) 266 .setIvSizeBytes(16) 267 .setTagSizeBytes(16) 268 .setVariant(NO_PREFIX) 269 .build(); 270 assertThat(parameters1).isNotEqualTo(parameters2); 271 assertThat(parameters1.hashCode()).isNotEqualTo(parameters2.hashCode()); 272 273 parameters2 = 274 AesEaxParameters.builder() 275 .setKeySizeBytes(16) 276 .setIvSizeBytes(12) 277 .setTagSizeBytes(16) 278 .setVariant(NO_PREFIX) 279 .build(); 280 assertThat(parameters1).isNotEqualTo(parameters2); 281 assertThat(parameters1.hashCode()).isNotEqualTo(parameters2.hashCode()); 282 283 parameters2 = 284 AesEaxParameters.builder() 285 .setKeySizeBytes(32) 286 .setIvSizeBytes(12) 287 .setTagSizeBytes(16) 288 .setVariant(NO_PREFIX) 289 .build(); 290 assertThat(parameters1).isNotEqualTo(parameters2); 291 assertThat(parameters1.hashCode()).isNotEqualTo(parameters2.hashCode()); 292 293 parameters2 = 294 AesEaxParameters.builder() 295 .setKeySizeBytes(16) 296 .setIvSizeBytes(16) 297 .setTagSizeBytes(16) 298 .setVariant(TINK) 299 .build(); 300 assertThat(parameters1).isNotEqualTo(parameters2); 301 assertThat(parameters1.hashCode()).isNotEqualTo(parameters2.hashCode()); 302 303 parameters2 = 304 AesEaxParameters.builder() 305 .setKeySizeBytes(16) 306 .setIvSizeBytes(16) 307 .setTagSizeBytes(16) 308 .setVariant(CRUNCHY) 309 .build(); 310 assertThat(parameters1).isNotEqualTo(parameters2); 311 assertThat(parameters1.hashCode()).isNotEqualTo(parameters2.hashCode()); 312 } 313 } 314