1 // Copyright 2023 Google Inc. 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.assertFalse; 21 import static org.junit.Assert.assertTrue; 22 23 import com.google.crypto.tink.util.Bytes; 24 import com.google.crypto.tink.util.SecretBytes; 25 import org.junit.Test; 26 import org.junit.runner.RunWith; 27 import org.junit.runners.JUnit4; 28 29 @RunWith(JUnit4.class) 30 public final class LegacyKmsEnvelopeAeadKeyTest { 31 private static final AeadParameters CHACHA20POLY1305_PARAMETERS = 32 ChaCha20Poly1305Parameters.create(ChaCha20Poly1305Parameters.Variant.NO_PREFIX); 33 34 @Test createKeyAndGetProperties()35 public void createKeyAndGetProperties() throws Exception { 36 LegacyKmsEnvelopeAeadParameters parameters = 37 LegacyKmsEnvelopeAeadParameters.builder() 38 .setKekUri("SomeKekUri") 39 .setDekParsingStrategy( 40 LegacyKmsEnvelopeAeadParameters.DekParsingStrategy.ASSUME_CHACHA20POLY1305) 41 .setDekParametersForNewKeys(CHACHA20POLY1305_PARAMETERS) 42 .build(); 43 44 LegacyKmsEnvelopeAeadKey key = LegacyKmsEnvelopeAeadKey.create(parameters); 45 46 assertThat(key.getOutputPrefix().size()).isEqualTo(0); 47 assertThat(key.getParameters()).isEqualTo(parameters); 48 assertThat(key.getIdRequirementOrNull()).isNull(); 49 } 50 51 @Test createKeyWithNullIdRequirementAndGetProperties()52 public void createKeyWithNullIdRequirementAndGetProperties() throws Exception { 53 LegacyKmsEnvelopeAeadParameters parameters = 54 LegacyKmsEnvelopeAeadParameters.builder() 55 .setKekUri("SomeKekUri") 56 .setDekParsingStrategy( 57 LegacyKmsEnvelopeAeadParameters.DekParsingStrategy.ASSUME_CHACHA20POLY1305) 58 .setDekParametersForNewKeys(CHACHA20POLY1305_PARAMETERS) 59 .build(); 60 61 LegacyKmsEnvelopeAeadKey key = 62 LegacyKmsEnvelopeAeadKey.create(parameters, /* idRequirement= */ null); 63 64 assertThat(key.getOutputPrefix().size()).isEqualTo(0); 65 assertThat(key.getParameters()).isEqualTo(parameters); 66 assertThat(key.getIdRequirementOrNull()).isNull(); 67 } 68 69 @Test createKeyWithTinkOutptPrefixAndGetProperties()70 public void createKeyWithTinkOutptPrefixAndGetProperties() throws Exception { 71 LegacyKmsEnvelopeAeadParameters parameters = 72 LegacyKmsEnvelopeAeadParameters.builder() 73 .setVariant(LegacyKmsEnvelopeAeadParameters.Variant.TINK) 74 .setKekUri("SomeKekUri") 75 .setDekParsingStrategy( 76 LegacyKmsEnvelopeAeadParameters.DekParsingStrategy.ASSUME_CHACHA20POLY1305) 77 .setDekParametersForNewKeys(CHACHA20POLY1305_PARAMETERS) 78 .build(); 79 80 LegacyKmsEnvelopeAeadKey key = LegacyKmsEnvelopeAeadKey.create(parameters, 0xaabbccdd); 81 82 assertThat(key.getOutputPrefix()) 83 .isEqualTo( 84 Bytes.copyFrom( 85 new byte[] {(byte) 0x01, (byte) 0xaa, (byte) 0xbb, (byte) 0xcc, (byte) 0xdd})); 86 assertThat(key.getParameters()).isEqualTo(parameters); 87 assertThat(key.getIdRequirementOrNull()).isEqualTo(0xaabbccdd); 88 } 89 90 @Test testEqualKey()91 public void testEqualKey() throws Exception { 92 LegacyKmsEnvelopeAeadParameters parameters1 = 93 LegacyKmsEnvelopeAeadParameters.builder() 94 .setKekUri("SomeKekUri") 95 .setDekParsingStrategy( 96 LegacyKmsEnvelopeAeadParameters.DekParsingStrategy.ASSUME_CHACHA20POLY1305) 97 .setDekParametersForNewKeys(CHACHA20POLY1305_PARAMETERS) 98 .build(); 99 LegacyKmsEnvelopeAeadParameters parameters1Copy = 100 LegacyKmsEnvelopeAeadParameters.builder() 101 .setKekUri("SomeKekUri") 102 .setDekParsingStrategy( 103 LegacyKmsEnvelopeAeadParameters.DekParsingStrategy.ASSUME_CHACHA20POLY1305) 104 .setDekParametersForNewKeys(CHACHA20POLY1305_PARAMETERS) 105 .build(); 106 LegacyKmsEnvelopeAeadParameters parameters2 = 107 LegacyKmsEnvelopeAeadParameters.builder() 108 .setKekUri("someOtherKekUri") 109 .setDekParsingStrategy( 110 LegacyKmsEnvelopeAeadParameters.DekParsingStrategy.ASSUME_CHACHA20POLY1305) 111 .setDekParametersForNewKeys(CHACHA20POLY1305_PARAMETERS) 112 .build(); 113 114 LegacyKmsEnvelopeAeadKey key1 = LegacyKmsEnvelopeAeadKey.create(parameters1); 115 LegacyKmsEnvelopeAeadKey key1Copy = LegacyKmsEnvelopeAeadKey.create(parameters1Copy); 116 LegacyKmsEnvelopeAeadKey key2 = LegacyKmsEnvelopeAeadKey.create(parameters2); 117 118 assertTrue(key1.equalsKey(key1Copy)); 119 assertFalse(key1.equalsKey(key2)); 120 } 121 122 @Test testTinkEqualKey()123 public void testTinkEqualKey() throws Exception { 124 LegacyKmsEnvelopeAeadParameters parametersTink = 125 LegacyKmsEnvelopeAeadParameters.builder() 126 .setVariant(LegacyKmsEnvelopeAeadParameters.Variant.TINK) 127 .setKekUri("kekUri") 128 .setDekParsingStrategy( 129 LegacyKmsEnvelopeAeadParameters.DekParsingStrategy.ASSUME_CHACHA20POLY1305) 130 .setDekParametersForNewKeys(CHACHA20POLY1305_PARAMETERS) 131 .build(); 132 LegacyKmsEnvelopeAeadParameters parametersTinkCopy = 133 LegacyKmsEnvelopeAeadParameters.builder() 134 .setVariant(LegacyKmsEnvelopeAeadParameters.Variant.TINK) 135 .setKekUri("kekUri") 136 .setDekParsingStrategy( 137 LegacyKmsEnvelopeAeadParameters.DekParsingStrategy.ASSUME_CHACHA20POLY1305) 138 .setDekParametersForNewKeys(CHACHA20POLY1305_PARAMETERS) 139 .build(); 140 LegacyKmsEnvelopeAeadParameters parametersNoPrefix = 141 LegacyKmsEnvelopeAeadParameters.builder() 142 .setVariant(LegacyKmsEnvelopeAeadParameters.Variant.NO_PREFIX) 143 .setKekUri("kekUri") 144 .setDekParsingStrategy( 145 LegacyKmsEnvelopeAeadParameters.DekParsingStrategy.ASSUME_CHACHA20POLY1305) 146 .setDekParametersForNewKeys(CHACHA20POLY1305_PARAMETERS) 147 .build(); 148 149 LegacyKmsEnvelopeAeadKey keyTink = 150 LegacyKmsEnvelopeAeadKey.create(parametersTink, /* idRequirement= */ 123); 151 LegacyKmsEnvelopeAeadKey keyTinkCopy = 152 LegacyKmsEnvelopeAeadKey.create(parametersTinkCopy, /* idRequirement= */ 123); 153 LegacyKmsEnvelopeAeadKey keyTink2 = 154 LegacyKmsEnvelopeAeadKey.create(parametersTink, /* idRequirement= */ 234); 155 LegacyKmsEnvelopeAeadKey keyNoPrefix = 156 LegacyKmsEnvelopeAeadKey.create(parametersNoPrefix, /* idRequirement= */ null); 157 158 assertTrue(keyTink.equalsKey(keyTinkCopy)); 159 assertFalse(keyTink.equalsKey(keyTink2)); 160 assertFalse(keyTink.equalsKey(keyNoPrefix)); 161 } 162 163 @Test testDifferentKeyTypesEquality_fails()164 public void testDifferentKeyTypesEquality_fails() throws Exception { 165 LegacyKmsEnvelopeAeadParameters parameters = 166 LegacyKmsEnvelopeAeadParameters.builder() 167 .setKekUri("SomeKekUri") 168 .setDekParsingStrategy( 169 LegacyKmsEnvelopeAeadParameters.DekParsingStrategy.ASSUME_CHACHA20POLY1305) 170 .setDekParametersForNewKeys(CHACHA20POLY1305_PARAMETERS) 171 .build(); 172 LegacyKmsEnvelopeAeadKey key = LegacyKmsEnvelopeAeadKey.create(parameters); 173 174 XChaCha20Poly1305Key xChaCha20Poly1305Key = 175 XChaCha20Poly1305Key.create(SecretBytes.randomBytes(32)); 176 177 assertThat(key.equalsKey(xChaCha20Poly1305Key)).isFalse(); 178 } 179 } 180