Skip to content

Commit 9de8d44

Browse files
juergwcopybara-github
authored andcommitted
Add TINK output prefix to LegacyKmsEnvelopeAeadKey.
PiperOrigin-RevId: 619226820 Change-Id: If7d0741f209f22b6c9d5e95edbefb449823e57a7
1 parent 5d2eb06 commit 9de8d44

10 files changed

+389
-33
lines changed

src/main/java/com/google/crypto/tink/aead/BUILD.bazel

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ java_library(
249249
"//src/main/java/com/google/crypto/tink:key_template",
250250
"//src/main/java/com/google/crypto/tink:kms_clients",
251251
"//src/main/java/com/google/crypto/tink:parameters",
252+
"//src/main/java/com/google/crypto/tink/aead/internal:legacy_full_aead",
252253
"//src/main/java/com/google/crypto/tink/config/internal:tink_fips_util",
253254
"//src/main/java/com/google/crypto/tink/internal:key_manager_registry",
254255
"//src/main/java/com/google/crypto/tink/internal:legacy_key_manager_impl",
@@ -680,6 +681,7 @@ android_library(
680681
"//src/main/java/com/google/crypto/tink:key_template-android",
681682
"//src/main/java/com/google/crypto/tink:kms_clients-android",
682683
"//src/main/java/com/google/crypto/tink:parameters-android",
684+
"//src/main/java/com/google/crypto/tink/aead/internal:legacy_full_aead-android",
683685
"//src/main/java/com/google/crypto/tink/config/internal:tink_fips_util-android",
684686
"//src/main/java/com/google/crypto/tink/internal:key_manager_registry-android",
685687
"//src/main/java/com/google/crypto/tink/internal:legacy_key_manager_impl-android",
@@ -1125,7 +1127,9 @@ android_library(
11251127
":aead_key-android",
11261128
":legacy_kms_envelope_aead_parameters-android",
11271129
"//src/main/java/com/google/crypto/tink:key-android",
1130+
"//src/main/java/com/google/crypto/tink/internal:output_prefix_util-android",
11281131
"//src/main/java/com/google/crypto/tink/util:bytes-android",
1132+
"@maven//:com_google_code_findbugs_jsr305",
11291133
],
11301134
)
11311135

@@ -1136,7 +1140,9 @@ java_library(
11361140
":aead_key",
11371141
":legacy_kms_envelope_aead_parameters",
11381142
"//src/main/java/com/google/crypto/tink:key",
1143+
"//src/main/java/com/google/crypto/tink/internal:output_prefix_util",
11391144
"//src/main/java/com/google/crypto/tink/util:bytes",
1145+
"@maven//:com_google_code_findbugs_jsr305",
11401146
],
11411147
)
11421148

src/main/java/com/google/crypto/tink/aead/KmsEnvelopeAeadKeyManager.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.crypto.tink.KeyTemplate;
2323
import com.google.crypto.tink.KmsClients;
2424
import com.google.crypto.tink.Parameters;
25+
import com.google.crypto.tink.aead.internal.LegacyFullAead;
2526
import com.google.crypto.tink.config.internal.TinkFipsUtil;
2627
import com.google.crypto.tink.internal.KeyManagerRegistry;
2728
import com.google.crypto.tink.internal.LegacyKeyManagerImpl;
@@ -63,11 +64,7 @@ public class KmsEnvelopeAeadKeyManager {
6364
private static LegacyKmsEnvelopeAeadKey newKey(
6465
LegacyKmsEnvelopeAeadParameters parameters, @Nullable Integer idRequirement)
6566
throws GeneralSecurityException {
66-
if (idRequirement != null) {
67-
throw new GeneralSecurityException(
68-
"Id Requirement is not supported for LegacyKmsEnvelopeAeadKey");
69-
}
70-
return LegacyKmsEnvelopeAeadKey.create(parameters);
67+
return LegacyKmsEnvelopeAeadKey.create(parameters, idRequirement);
7168
}
7269

7370
@SuppressWarnings("InlineLambdaConstant") // We need a correct Object#equals in registration.
@@ -77,8 +74,11 @@ private static LegacyKmsEnvelopeAeadKey newKey(
7774
@AccessesPartialKey
7875
private static Aead create(LegacyKmsEnvelopeAeadKey key) throws GeneralSecurityException {
7976
String kekUri = key.getParameters().getKekUri();
80-
return KmsEnvelopeAead.create(
81-
key.getParameters().getDekParametersForNewKeys(), KmsClients.get(kekUri).getAead(kekUri));
77+
Aead rawAead =
78+
KmsEnvelopeAead.create(
79+
key.getParameters().getDekParametersForNewKeys(),
80+
KmsClients.get(kekUri).getAead(kekUri));
81+
return LegacyFullAead.create(rawAead, key.getOutputPrefix());
8282
}
8383

8484
private static final PrimitiveConstructor<LegacyKmsEnvelopeAeadKey, Aead>

src/main/java/com/google/crypto/tink/aead/LegacyKmsEnvelopeAeadKey.java

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
package com.google.crypto.tink.aead;
1818

1919
import com.google.crypto.tink.Key;
20+
import com.google.crypto.tink.internal.OutputPrefixUtil;
2021
import com.google.crypto.tink.util.Bytes;
2122
import java.security.GeneralSecurityException;
23+
import java.util.Objects;
24+
import javax.annotation.Nullable;
2225

2326
/**
2427
* Describes an EnvelopeAead backed by a KMS.
@@ -37,19 +40,48 @@
3740
*/
3841
public class LegacyKmsEnvelopeAeadKey extends AeadKey {
3942
private final LegacyKmsEnvelopeAeadParameters parameters;
43+
private final Bytes outputPrefix;
44+
@Nullable private final Integer idRequirement;
4045

41-
private LegacyKmsEnvelopeAeadKey(LegacyKmsEnvelopeAeadParameters parameters) {
46+
private LegacyKmsEnvelopeAeadKey(
47+
LegacyKmsEnvelopeAeadParameters parameters,
48+
Bytes outputPrefix,
49+
@Nullable Integer idRequirement) {
4250
this.parameters = parameters;
51+
this.outputPrefix = outputPrefix;
52+
this.idRequirement = idRequirement;
53+
}
54+
55+
public static LegacyKmsEnvelopeAeadKey create(
56+
LegacyKmsEnvelopeAeadParameters parameters, @Nullable Integer idRequirement)
57+
throws GeneralSecurityException {
58+
Bytes outputPrefix;
59+
if (parameters.getVariant() == LegacyKmsEnvelopeAeadParameters.Variant.NO_PREFIX) {
60+
if (idRequirement != null) {
61+
throw new GeneralSecurityException(
62+
"For given Variant NO_PREFIX the value of idRequirement must be null");
63+
}
64+
outputPrefix = OutputPrefixUtil.EMPTY_PREFIX;
65+
} else if (parameters.getVariant() == LegacyKmsEnvelopeAeadParameters.Variant.TINK) {
66+
if (idRequirement == null) {
67+
throw new GeneralSecurityException(
68+
"For given Variant TINK the value of idRequirement must be non-null");
69+
}
70+
outputPrefix = OutputPrefixUtil.getTinkOutputPrefix(idRequirement);
71+
} else {
72+
throw new GeneralSecurityException("Unknown Variant: " + parameters.getVariant());
73+
}
74+
return new LegacyKmsEnvelopeAeadKey(parameters, outputPrefix, idRequirement);
4375
}
4476

4577
public static LegacyKmsEnvelopeAeadKey create(LegacyKmsEnvelopeAeadParameters parameters)
4678
throws GeneralSecurityException {
47-
return new LegacyKmsEnvelopeAeadKey(parameters);
79+
return create(parameters, null);
4880
}
4981

5082
@Override
5183
public Bytes getOutputPrefix() {
52-
return Bytes.copyFrom(new byte[] {});
84+
return this.outputPrefix;
5385
}
5486

5587
@Override
@@ -59,7 +91,7 @@ public LegacyKmsEnvelopeAeadParameters getParameters() {
5991

6092
@Override
6193
public Integer getIdRequirementOrNull() {
62-
return null;
94+
return idRequirement;
6395
}
6496

6597
@Override
@@ -68,6 +100,6 @@ public boolean equalsKey(Key o) {
68100
return false;
69101
}
70102
LegacyKmsEnvelopeAeadKey that = (LegacyKmsEnvelopeAeadKey) o;
71-
return that.parameters.equals(parameters);
103+
return that.parameters.equals(parameters) && Objects.equals(that.idRequirement, idRequirement);
72104
}
73105
}

src/main/java/com/google/crypto/tink/aead/LegacyKmsEnvelopeAeadParameters.java

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.google.crypto.tink.aead;
1818

1919
import com.google.crypto.tink.AccessesPartialKey;
20+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
2021
import com.google.errorprone.annotations.Immutable;
2122
import com.google.errorprone.annotations.RestrictedApi;
2223
import java.security.GeneralSecurityException;
@@ -64,6 +65,27 @@
6465
*/
6566
public final class LegacyKmsEnvelopeAeadParameters extends AeadParameters {
6667

68+
/**
69+
* Describes how the prefix is computed. There are two main possibilities: NO_PREFIX (empty
70+
* prefix) and TINK (prefix the ciphertext with 0x01 followed by a 4-byte key id in big endian.
71+
*/
72+
@Immutable
73+
public static final class Variant {
74+
public static final Variant TINK = new Variant("TINK");
75+
public static final Variant NO_PREFIX = new Variant("NO_PREFIX");
76+
77+
private final String name;
78+
79+
private Variant(String name) {
80+
this.name = name;
81+
}
82+
83+
@Override
84+
public String toString() {
85+
return name;
86+
}
87+
}
88+
6789
/**
6890
* Specifies how the DEK in received ciphertexts are parsed.
6991
*
@@ -107,42 +129,55 @@ public String toString() {
107129
}
108130
}
109131

132+
private final Variant variant;
110133
private final String kekUri;
111134
private final DekParsingStrategy dekParsingStrategy;
112135
private final AeadParameters dekParametersForNewKeys;
113136

114137
private LegacyKmsEnvelopeAeadParameters(
138+
Variant variant,
115139
String kekUri,
116140
DekParsingStrategy dekParsingStrategy,
117141
AeadParameters dekParametersForNewKeys) {
142+
this.variant = variant;
118143
this.kekUri = kekUri;
119144
this.dekParsingStrategy = dekParsingStrategy;
120145
this.dekParametersForNewKeys = dekParametersForNewKeys;
121146
}
122147

123148
/** Builder for {@link LegacyKmsEnvelopeAeadParameters}. */
124149
public static class Builder {
150+
@Nullable private Variant variant;
125151
@Nullable private String kekUri;
126152
@Nullable private DekParsingStrategy dekParsingStrategy;
127153
@Nullable private AeadParameters dekParametersForNewKeys;
128154

129155
private Builder() {}
130156

157+
@CanIgnoreReturnValue
158+
public Builder setVariant(Variant variant) {
159+
this.variant = variant;
160+
return this;
161+
}
162+
131163
/**
132164
* Sets the URI of the KMS to be used.
133165
*
134166
* <p>The KMS will be used to encrypt the DEK key as an AEAD.
135167
*/
168+
@CanIgnoreReturnValue
136169
public Builder setKekUri(String kekUri) {
137170
this.kekUri = kekUri;
138171
return this;
139172
}
140173

174+
@CanIgnoreReturnValue
141175
public Builder setDekParsingStrategy(DekParsingStrategy dekParsingStrategy) {
142176
this.dekParsingStrategy = dekParsingStrategy;
143177
return this;
144178
}
145179

180+
@CanIgnoreReturnValue
146181
public Builder setDekParametersForNewKeys(AeadParameters aeadParameters) {
147182
this.dekParametersForNewKeys = aeadParameters;
148183
return this;
@@ -179,6 +214,10 @@ private static boolean parsingStrategyAllowed(
179214

180215
/** Builds the LegacyKmsEnvelopeAeadParameters. */
181216
public LegacyKmsEnvelopeAeadParameters build() throws GeneralSecurityException {
217+
if (variant == null) {
218+
// Use NO_PREFIX as default prefix.
219+
variant = Variant.NO_PREFIX;
220+
}
182221
if (kekUri == null) {
183222
throw new GeneralSecurityException("kekUri must be set");
184223
}
@@ -189,8 +228,7 @@ public LegacyKmsEnvelopeAeadParameters build() throws GeneralSecurityException {
189228
throw new GeneralSecurityException("dekParametersForNewKeys must be set");
190229
}
191230
if (dekParametersForNewKeys.hasIdRequirement()) {
192-
throw new GeneralSecurityException(
193-
"dekParametersForNewKeys must note have ID Requirements");
231+
throw new GeneralSecurityException("dekParametersForNewKeys must not have ID Requirements");
194232
}
195233
if (!parsingStrategyAllowed(dekParsingStrategy, dekParametersForNewKeys)) {
196234
throw new GeneralSecurityException(
@@ -202,7 +240,7 @@ public LegacyKmsEnvelopeAeadParameters build() throws GeneralSecurityException {
202240
}
203241

204242
return new LegacyKmsEnvelopeAeadParameters(
205-
kekUri, dekParsingStrategy, dekParametersForNewKeys);
243+
variant, kekUri, dekParsingStrategy, dekParametersForNewKeys);
206244
}
207245
}
208246

@@ -225,9 +263,13 @@ public String getKekUri() {
225263
return kekUri;
226264
}
227265

266+
public Variant getVariant() {
267+
return variant;
268+
}
269+
228270
@Override
229271
public boolean hasIdRequirement() {
230-
return false;
272+
return variant != Variant.NO_PREFIX;
231273
}
232274

233275
/**
@@ -252,13 +294,18 @@ public boolean equals(Object o) {
252294
LegacyKmsEnvelopeAeadParameters that = (LegacyKmsEnvelopeAeadParameters) o;
253295
return that.dekParsingStrategy.equals(dekParsingStrategy)
254296
&& that.dekParametersForNewKeys.equals(dekParametersForNewKeys)
255-
&& that.kekUri.equals(kekUri);
297+
&& that.kekUri.equals(kekUri)
298+
&& that.variant.equals(variant);
256299
}
257300

258301
@Override
259302
public int hashCode() {
260303
return Objects.hash(
261-
LegacyKmsEnvelopeAeadParameters.class, kekUri, dekParsingStrategy, dekParametersForNewKeys);
304+
LegacyKmsEnvelopeAeadParameters.class,
305+
kekUri,
306+
dekParsingStrategy,
307+
dekParametersForNewKeys,
308+
variant);
262309
}
263310

264311
@Override
@@ -271,6 +318,9 @@ public String toString() {
271318
+ ", "
272319
+ "dekParametersForNewKeys: "
273320
+ dekParametersForNewKeys
321+
+ ", "
322+
+ "variant: "
323+
+ variant
274324
+ ")";
275325
}
276326
}

0 commit comments

Comments
 (0)