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