Skip to content

Commit ad42346

Browse files
tholenstcopybara-github
authored andcommitted
Migrate the Ed25519 KeyManagers to use createKeyFromRandomness instead of deriveKey.
PiperOrigin-RevId: 566987074 Change-Id: I9d77ef3e7843db6a5a711481bc1b4622583442e5
1 parent ca962f6 commit ad42346

File tree

4 files changed

+120
-19
lines changed

4 files changed

+120
-19
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,21 +250,29 @@ java_library(
250250
srcs = ["Ed25519PrivateKeyManager.java"],
251251
deps = [
252252
":ed25519_parameters",
253+
":ed25519_private_key",
253254
":ed25519_proto_serialization",
255+
":ed25519_public_key",
254256
":ed25519_public_key_manager",
255257
"//proto:ed25519_java_proto",
256258
"//proto:tink_java_proto",
259+
"//src/main/java/com/google/crypto/tink:accesses_partial_key",
257260
"//src/main/java/com/google/crypto/tink:key_template",
258261
"//src/main/java/com/google/crypto/tink:parameters",
259262
"//src/main/java/com/google/crypto/tink:public_key_sign",
260263
"//src/main/java/com/google/crypto/tink:registry",
264+
"//src/main/java/com/google/crypto/tink:secret_key_access",
261265
"//src/main/java/com/google/crypto/tink/internal:key_type_manager",
262266
"//src/main/java/com/google/crypto/tink/internal:mutable_parameters_registry",
263267
"//src/main/java/com/google/crypto/tink/internal:primitive_factory",
264268
"//src/main/java/com/google/crypto/tink/internal:private_key_type_manager",
265269
"//src/main/java/com/google/crypto/tink/internal:tink_bug_exception",
270+
"//src/main/java/com/google/crypto/tink/internal:util",
266271
"//src/main/java/com/google/crypto/tink/subtle:ed25519_sign",
267272
"//src/main/java/com/google/crypto/tink/subtle:validators",
273+
"//src/main/java/com/google/crypto/tink/util:bytes",
274+
"//src/main/java/com/google/crypto/tink/util:secret_bytes",
275+
"@maven//:com_google_code_findbugs_jsr305",
268276
"@maven//:com_google_protobuf_protobuf_java",
269277
],
270278
)
@@ -878,21 +886,29 @@ android_library(
878886
srcs = ["Ed25519PrivateKeyManager.java"],
879887
deps = [
880888
":ed25519_parameters-android",
889+
":ed25519_private_key-android",
881890
":ed25519_proto_serialization-android",
891+
":ed25519_public_key-android",
882892
":ed25519_public_key_manager-android",
883893
"//proto:ed25519_java_proto_lite",
884894
"//proto:tink_java_proto_lite",
895+
"//src/main/java/com/google/crypto/tink:accesses_partial_key-android",
885896
"//src/main/java/com/google/crypto/tink:key_template-android",
886897
"//src/main/java/com/google/crypto/tink:parameters-android",
887898
"//src/main/java/com/google/crypto/tink:public_key_sign-android",
888899
"//src/main/java/com/google/crypto/tink:registry-android",
900+
"//src/main/java/com/google/crypto/tink:secret_key_access-android",
889901
"//src/main/java/com/google/crypto/tink/internal:key_type_manager-android",
890902
"//src/main/java/com/google/crypto/tink/internal:mutable_parameters_registry-android",
891903
"//src/main/java/com/google/crypto/tink/internal:primitive_factory-android",
892904
"//src/main/java/com/google/crypto/tink/internal:private_key_type_manager-android",
893905
"//src/main/java/com/google/crypto/tink/internal:tink_bug_exception-android",
906+
"//src/main/java/com/google/crypto/tink/internal:util-android",
894907
"//src/main/java/com/google/crypto/tink/subtle:ed25519_sign-android",
895908
"//src/main/java/com/google/crypto/tink/subtle:validators-android",
909+
"//src/main/java/com/google/crypto/tink/util:bytes-android",
910+
"//src/main/java/com/google/crypto/tink/util:secret_bytes-android",
911+
"@maven//:com_google_code_findbugs_jsr305",
896912
"@maven//:com_google_protobuf_protobuf_javalite",
897913
],
898914
)

src/main/java/com/google/crypto/tink/signature/Ed25519PrivateKeyManager.java

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,25 @@
1818

1919
import static com.google.crypto.tink.internal.TinkBugException.exceptionIsBug;
2020

21+
import com.google.crypto.tink.AccessesPartialKey;
2122
import com.google.crypto.tink.KeyTemplate;
2223
import com.google.crypto.tink.Parameters;
2324
import com.google.crypto.tink.PublicKeySign;
2425
import com.google.crypto.tink.Registry;
26+
import com.google.crypto.tink.SecretKeyAccess;
2527
import com.google.crypto.tink.internal.KeyTypeManager;
2628
import com.google.crypto.tink.internal.MutableParametersRegistry;
2729
import com.google.crypto.tink.internal.PrimitiveFactory;
2830
import com.google.crypto.tink.internal.PrivateKeyTypeManager;
31+
import com.google.crypto.tink.internal.Util;
2932
import com.google.crypto.tink.proto.Ed25519KeyFormat;
3033
import com.google.crypto.tink.proto.Ed25519PrivateKey;
3134
import com.google.crypto.tink.proto.Ed25519PublicKey;
3235
import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
3336
import com.google.crypto.tink.subtle.Ed25519Sign;
3437
import com.google.crypto.tink.subtle.Validators;
38+
import com.google.crypto.tink.util.Bytes;
39+
import com.google.crypto.tink.util.SecretBytes;
3540
import com.google.protobuf.ByteString;
3641
import com.google.protobuf.ExtensionRegistryLite;
3742
import com.google.protobuf.InvalidProtocolBufferException;
@@ -40,6 +45,7 @@
4045
import java.util.Collections;
4146
import java.util.HashMap;
4247
import java.util.Map;
48+
import javax.annotation.Nullable;
4349

4450
/**
4551
* This instance of {@code KeyManager} generates new {@code Ed25519PrivateKey} keys and produces new
@@ -123,30 +129,40 @@ public Ed25519PrivateKey createKey(Ed25519KeyFormat format) throws GeneralSecuri
123129
}
124130

125131
@Override
126-
public Ed25519PrivateKey deriveKey(
127-
KeyTypeManager<Ed25519PrivateKey> keyTypeManager,
128-
Ed25519KeyFormat format,
129-
InputStream inputStream)
132+
public com.google.crypto.tink.signature.Ed25519PrivateKey createKeyFromRandomness(
133+
Parameters parameters,
134+
InputStream stream,
135+
@Nullable Integer idRequirement,
136+
SecretKeyAccess access)
130137
throws GeneralSecurityException {
131-
Validators.validateVersion(format.getVersion(), getVersion());
132-
133-
byte[] pseudorandomness = new byte[Ed25519Sign.SECRET_KEY_LEN];
134-
readFully(inputStream, pseudorandomness);
135-
Ed25519Sign.KeyPair keyPair = Ed25519Sign.KeyPair.newKeyPairFromSeed(pseudorandomness);
136-
Ed25519PublicKey publicKey =
137-
Ed25519PublicKey.newBuilder()
138-
.setVersion(getVersion())
139-
.setKeyValue(ByteString.copyFrom(keyPair.getPublicKey()))
140-
.build();
141-
return Ed25519PrivateKey.newBuilder()
142-
.setVersion(getVersion())
143-
.setKeyValue(ByteString.copyFrom(keyPair.getPrivateKey()))
144-
.setPublicKey(publicKey)
145-
.build();
138+
if (parameters instanceof Ed25519Parameters) {
139+
return createEd25519KeyFromRandomness(
140+
(Ed25519Parameters) parameters, stream, idRequirement, access);
141+
}
142+
throw new GeneralSecurityException(
143+
"Unexpected parameters: expected AesFfxFf1Parameters, but got: " + parameters);
146144
}
147145
};
148146
}
149147

148+
@AccessesPartialKey
149+
static com.google.crypto.tink.signature.Ed25519PrivateKey createEd25519KeyFromRandomness(
150+
Ed25519Parameters parameters,
151+
InputStream stream,
152+
@Nullable Integer idRequirement,
153+
SecretKeyAccess access)
154+
throws GeneralSecurityException {
155+
SecretBytes pseudorandomness =
156+
Util.readIntoSecretBytes(stream, Ed25519Sign.SECRET_KEY_LEN, access);
157+
Ed25519Sign.KeyPair keyPair =
158+
Ed25519Sign.KeyPair.newKeyPairFromSeed(pseudorandomness.toByteArray(access));
159+
com.google.crypto.tink.signature.Ed25519PublicKey publicKey =
160+
com.google.crypto.tink.signature.Ed25519PublicKey.create(
161+
parameters.getVariant(), Bytes.copyFrom(keyPair.getPublicKey()), idRequirement);
162+
return com.google.crypto.tink.signature.Ed25519PrivateKey.create(
163+
publicKey, SecretBytes.copyFrom(keyPair.getPrivateKey(), access));
164+
}
165+
150166
private static Map<String, Parameters> namedParameters() throws GeneralSecurityException {
151167
Map<String, Parameters> result = new HashMap<>();
152168
result.put("ED25519", Ed25519Parameters.create(Ed25519Parameters.Variant.TINK));

src/test/java/com/google/crypto/tink/signature/BUILD.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ java_test(
319319
deps = [
320320
"//proto:ed25519_java_proto",
321321
"//proto:tink_java_proto",
322+
"//src/main/java/com/google/crypto/tink:insecure_secret_key_access",
322323
"//src/main/java/com/google/crypto/tink:key_template",
323324
"//src/main/java/com/google/crypto/tink:key_templates",
324325
"//src/main/java/com/google/crypto/tink:parameters",
@@ -327,11 +328,15 @@ java_test(
327328
"//src/main/java/com/google/crypto/tink:registry_cluster",
328329
"//src/main/java/com/google/crypto/tink/internal:key_type_manager",
329330
"//src/main/java/com/google/crypto/tink/signature:ed25519_parameters",
331+
"//src/main/java/com/google/crypto/tink/signature:ed25519_private_key",
330332
"//src/main/java/com/google/crypto/tink/signature:ed25519_private_key_manager",
333+
"//src/main/java/com/google/crypto/tink/signature:ed25519_public_key",
331334
"//src/main/java/com/google/crypto/tink/signature:signature_config",
332335
"//src/main/java/com/google/crypto/tink/subtle:ed25519_verify",
333336
"//src/main/java/com/google/crypto/tink/subtle:hex",
334337
"//src/main/java/com/google/crypto/tink/subtle:random",
338+
"//src/main/java/com/google/crypto/tink/util:bytes",
339+
"//src/main/java/com/google/crypto/tink/util:secret_bytes",
335340
"@maven//:com_google_protobuf_protobuf_java",
336341
"@maven//:com_google_truth_truth",
337342
"@maven//:junit_junit",

src/test/java/com/google/crypto/tink/signature/Ed25519PrivateKeyManagerTest.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818

1919
import static com.google.common.truth.Truth.assertThat;
2020
import static org.junit.Assert.assertThrows;
21+
import static org.junit.Assert.assertTrue;
2122

23+
import com.google.crypto.tink.InsecureSecretKeyAccess;
2224
import com.google.crypto.tink.KeyTemplate;
2325
import com.google.crypto.tink.KeyTemplates;
2426
import com.google.crypto.tink.KeysetHandle;
@@ -33,6 +35,8 @@
3335
import com.google.crypto.tink.subtle.Ed25519Verify;
3436
import com.google.crypto.tink.subtle.Hex;
3537
import com.google.crypto.tink.subtle.Random;
38+
import com.google.crypto.tink.util.Bytes;
39+
import com.google.crypto.tink.util.SecretBytes;
3640
import com.google.protobuf.ByteString;
3741
import java.io.ByteArrayInputStream;
3842
import java.io.InputStream;
@@ -271,4 +275,64 @@ public void testTemplates(@FromDataPoints("templateNames") String templateName)
271275
assertThat(h.getAt(0).getKey().getParameters())
272276
.isEqualTo(KeyTemplates.get(templateName).toParameters());
273277
}
278+
279+
@Test
280+
public void testCreateRawKeyFromRandomness() throws Exception {
281+
byte[] keyMaterial =
282+
Hex.decode(
283+
""
284+
+ "000102030405060708090A0B0C0D0E0F"
285+
+ "101112131415161718191A1B1C1D1E1F"
286+
+ "202122232425262728292A2B2C2D2E2F");
287+
com.google.crypto.tink.signature.Ed25519PrivateKey key =
288+
Ed25519PrivateKeyManager.createEd25519KeyFromRandomness(
289+
Ed25519Parameters.create(Ed25519Parameters.Variant.NO_PREFIX),
290+
new ByteArrayInputStream(keyMaterial),
291+
null,
292+
InsecureSecretKeyAccess.get());
293+
com.google.crypto.tink.signature.Ed25519PublicKey expectedPublicKey =
294+
com.google.crypto.tink.signature.Ed25519PublicKey.create(
295+
Ed25519Parameters.Variant.NO_PREFIX,
296+
Bytes.copyFrom(
297+
Hex.decode("03a107bff3ce10be1d70dd18e74bc09967e4d6309ba50d5f1ddc8664125531b8")),
298+
/* idRequirement= */ null);
299+
300+
com.google.crypto.tink.signature.Ed25519PrivateKey expectedPrivateKey =
301+
com.google.crypto.tink.signature.Ed25519PrivateKey.create(
302+
expectedPublicKey,
303+
SecretBytes.copyFrom(
304+
Hex.decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"),
305+
InsecureSecretKeyAccess.get()));
306+
assertTrue(key.equalsKey(expectedPrivateKey));
307+
}
308+
309+
@Test
310+
public void testCreateTinkKeyFromRandomness() throws Exception {
311+
byte[] keyMaterial =
312+
Hex.decode(
313+
""
314+
+ "000102030405060708090A0B0C0D0E0F"
315+
+ "101112131415161718191A1B1C1D1E1F"
316+
+ "202122232425262728292A2B2C2D2E2F");
317+
com.google.crypto.tink.signature.Ed25519PrivateKey key =
318+
Ed25519PrivateKeyManager.createEd25519KeyFromRandomness(
319+
Ed25519Parameters.create(Ed25519Parameters.Variant.TINK),
320+
new ByteArrayInputStream(keyMaterial),
321+
2344,
322+
InsecureSecretKeyAccess.get());
323+
com.google.crypto.tink.signature.Ed25519PublicKey expectedPublicKey =
324+
com.google.crypto.tink.signature.Ed25519PublicKey.create(
325+
Ed25519Parameters.Variant.TINK,
326+
Bytes.copyFrom(
327+
Hex.decode("03a107bff3ce10be1d70dd18e74bc09967e4d6309ba50d5f1ddc8664125531b8")),
328+
2344);
329+
330+
com.google.crypto.tink.signature.Ed25519PrivateKey expectedPrivateKey =
331+
com.google.crypto.tink.signature.Ed25519PrivateKey.create(
332+
expectedPublicKey,
333+
SecretBytes.copyFrom(
334+
Hex.decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"),
335+
InsecureSecretKeyAccess.get()));
336+
assertTrue(key.equalsKey(expectedPrivateKey));
337+
}
274338
}

0 commit comments

Comments
 (0)