Skip to content

Commit 163c2a7

Browse files
LizaTretyakovacopybara-github
authored andcommitted
Add a way to create HkdfStreamingPrf from the new HkdfPrfKey. Also, use this opporunity to improve tests: rewrite them in a more concise fashion, and fix one test vector.
PiperOrigin-RevId: 563414893 Change-Id: I428f31e2dee21ebbf71177140c66afd9c1b6f177
1 parent 84a56b6 commit 163c2a7

File tree

4 files changed

+237
-181
lines changed

4 files changed

+237
-181
lines changed

src/main/java/com/google/crypto/tink/subtle/prf/BUILD.bazel

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,14 @@ java_library(
3131
srcs = ["HkdfStreamingPrf.java"],
3232
deps = [
3333
":streaming_prf",
34+
"//src/main/java/com/google/crypto/tink:accesses_partial_key",
35+
"//src/main/java/com/google/crypto/tink:insecure_secret_key_access",
36+
"//src/main/java/com/google/crypto/tink/internal:enum_type_proto_converter",
37+
"//src/main/java/com/google/crypto/tink/prf:hkdf_prf_key",
38+
"//src/main/java/com/google/crypto/tink/prf:hkdf_prf_parameters",
3439
"//src/main/java/com/google/crypto/tink/subtle:enums",
3540
"//src/main/java/com/google/crypto/tink/subtle:subtle_util_cluster",
41+
"//src/main/java/com/google/crypto/tink/util:bytes",
3642
"@maven//:com_google_errorprone_error_prone_annotations",
3743
],
3844
)
@@ -42,8 +48,14 @@ android_library(
4248
srcs = ["HkdfStreamingPrf.java"],
4349
deps = [
4450
":streaming_prf-android",
51+
"//src/main/java/com/google/crypto/tink:accesses_partial_key-android",
52+
"//src/main/java/com/google/crypto/tink:insecure_secret_key_access-android",
53+
"//src/main/java/com/google/crypto/tink/internal:enum_type_proto_converter-android",
54+
"//src/main/java/com/google/crypto/tink/prf:hkdf_prf_key-android",
55+
"//src/main/java/com/google/crypto/tink/prf:hkdf_prf_parameters-android",
4556
"//src/main/java/com/google/crypto/tink/subtle:enums-android",
4657
"//src/main/java/com/google/crypto/tink/subtle:subtle_util_cluster-android",
58+
"//src/main/java/com/google/crypto/tink/util:bytes-android",
4759
"@maven//:com_google_errorprone_error_prone_annotations",
4860
],
4961
)

src/main/java/com/google/crypto/tink/subtle/prf/HkdfStreamingPrf.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,15 @@
1818

1919
import static java.lang.Math.min;
2020

21+
import com.google.crypto.tink.AccessesPartialKey;
22+
import com.google.crypto.tink.InsecureSecretKeyAccess;
23+
import com.google.crypto.tink.internal.EnumTypeProtoConverter;
24+
import com.google.crypto.tink.prf.HkdfPrfKey;
25+
import com.google.crypto.tink.prf.HkdfPrfParameters;
2126
import com.google.crypto.tink.subtle.EngineFactory;
27+
import com.google.crypto.tink.subtle.Enums;
2228
import com.google.crypto.tink.subtle.Enums.HashType;
29+
import com.google.crypto.tink.util.Bytes;
2330
import com.google.errorprone.annotations.Immutable;
2431
import java.io.IOException;
2532
import java.io.InputStream;
@@ -30,7 +37,19 @@
3037

3138
/** An implementation of the HKDF pseudorandom function, as given by RFC 5869. */
3239
@Immutable
40+
@AccessesPartialKey
3341
public class HkdfStreamingPrf implements StreamingPrf {
42+
// This converter is not used with a proto but rather with an ordinary enum type.
43+
private static final EnumTypeProtoConverter<Enums.HashType, HkdfPrfParameters.HashType>
44+
HASH_TYPE_CONVERTER =
45+
EnumTypeProtoConverter.<Enums.HashType, HkdfPrfParameters.HashType>builder()
46+
.add(Enums.HashType.SHA1, HkdfPrfParameters.HashType.SHA1)
47+
.add(Enums.HashType.SHA224, HkdfPrfParameters.HashType.SHA224)
48+
.add(Enums.HashType.SHA256, HkdfPrfParameters.HashType.SHA256)
49+
.add(Enums.HashType.SHA384, HkdfPrfParameters.HashType.SHA384)
50+
.add(Enums.HashType.SHA512, HkdfPrfParameters.HashType.SHA512)
51+
.build();
52+
3453
private static String getJavaxHmacName(HashType hashType) throws GeneralSecurityException {
3554
switch (hashType) {
3655
case SHA1:
@@ -53,6 +72,14 @@ public HkdfStreamingPrf(final HashType hashType, final byte[] ikm, final byte[]
5372
this.salt = Arrays.copyOf(salt, salt.length);
5473
}
5574

75+
public static StreamingPrf create(HkdfPrfKey key) throws GeneralSecurityException {
76+
Bytes saltFromKey = key.getParameters().getSalt();
77+
return new HkdfStreamingPrf(
78+
HASH_TYPE_CONVERTER.toProtoEnum(key.getParameters().getHashType()),
79+
key.getKeyBytes().toByteArray(InsecureSecretKeyAccess.get()),
80+
saltFromKey == null ? new byte[] {} : saltFromKey.toByteArray());
81+
}
82+
5683
private final HashType hashType;
5784

5885
// Manual inspection shows that this is never mutated (and copied on construction)

src/test/java/com/google/crypto/tink/subtle/prf/BUILD.bazel

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,21 @@ java_test(
55
size = "small",
66
srcs = ["HkdfStreamingPrfTest.java"],
77
deps = [
8+
"//src/main/java/com/google/crypto/tink:insecure_secret_key_access",
9+
"//src/main/java/com/google/crypto/tink/internal:enum_type_proto_converter",
10+
"//src/main/java/com/google/crypto/tink/prf:hkdf_prf_key",
11+
"//src/main/java/com/google/crypto/tink/prf:hkdf_prf_parameters",
812
"//src/main/java/com/google/crypto/tink/prf:prf_set",
913
"//src/main/java/com/google/crypto/tink/subtle:enums",
1014
"//src/main/java/com/google/crypto/tink/subtle:hex",
1115
"//src/main/java/com/google/crypto/tink/subtle:hkdf",
1216
"//src/main/java/com/google/crypto/tink/subtle:random",
1317
"//src/main/java/com/google/crypto/tink/subtle/prf:hkdf_streaming_prf",
1418
"//src/main/java/com/google/crypto/tink/subtle/prf:prf_impl",
19+
"//src/main/java/com/google/crypto/tink/subtle/prf:streaming_prf",
1520
"//src/main/java/com/google/crypto/tink/testing:test_util",
21+
"//src/main/java/com/google/crypto/tink/util:bytes",
22+
"//src/main/java/com/google/crypto/tink/util:secret_bytes",
1623
"@maven//:com_google_truth_truth",
1724
"@maven//:junit_junit",
1825
],

0 commit comments

Comments
 (0)