1 // SPDX-License-Identifier: GPL-2.0
3 * Implementation of HKDF ("HMAC-based Extract-and-Expand Key Derivation
4 * Function"), aka RFC 5869. See also the original paper (Krawczyk 2010):
5 * "Cryptographic Extraction and Key Derivation: The HKDF Scheme".
7 * This is used to derive keys from the fscrypt master keys.
9 * Copyright 2019 Google LLC
12 #include <crypto/hash.h>
13 #include <crypto/sha2.h>
15 #include "fscrypt_private.h"
18 * HKDF supports any unkeyed cryptographic hash algorithm, but fscrypt uses
19 * SHA-512 because it is well-established, secure, and reasonably efficient.
21 * HKDF-SHA256 was also considered, as its 256-bit security strength would be
22 * sufficient here. A 512-bit security strength is "nice to have", though.
23 * Also, on 64-bit CPUs, SHA-512 is usually just as fast as SHA-256. In the
24 * common case of deriving an AES-256-XTS key (512 bits), that can result in
25 * HKDF-SHA512 being much faster than HKDF-SHA256, as the longer digest size of
26 * SHA-512 causes HKDF-Expand to only need to do one iteration rather than two.
28 #define HKDF_HMAC_ALG "hmac(sha512)"
29 #define HKDF_HASHLEN SHA512_DIGEST_SIZE
32 * HKDF consists of two steps:
34 * 1. HKDF-Extract: extract a pseudorandom key of length HKDF_HASHLEN bytes from
35 * the input keying material and optional salt.
36 * 2. HKDF-Expand: expand the pseudorandom key into output keying material of
37 * any length, parameterized by an application-specific info string.
39 * HKDF-Extract can be skipped if the input is already a pseudorandom key of
40 * length HKDF_HASHLEN bytes. However, cipher modes other than AES-256-XTS take
41 * shorter keys, and we don't want to force users of those modes to provide
42 * unnecessarily long master keys. Thus fscrypt still does HKDF-Extract. No
43 * salt is used, since fscrypt master keys should already be pseudorandom and
44 * there's no way to persist a random salt per master key from kernel mode.
47 /* HKDF-Extract (RFC 5869 section 2.2), unsalted */
48 static int hkdf_extract(struct crypto_shash
*hmac_tfm
, const u8
*ikm
,
49 unsigned int ikmlen
, u8 prk
[HKDF_HASHLEN
])
51 static const u8 default_salt
[HKDF_HASHLEN
];
54 err
= crypto_shash_setkey(hmac_tfm
, default_salt
, HKDF_HASHLEN
);
58 return crypto_shash_tfm_digest(hmac_tfm
, ikm
, ikmlen
, prk
);
62 * Compute HKDF-Extract using the given master key as the input keying material,
63 * and prepare an HMAC transform object keyed by the resulting pseudorandom key.
65 * Afterwards, the keyed HMAC transform object can be used for HKDF-Expand many
66 * times without having to recompute HKDF-Extract each time.
68 int fscrypt_init_hkdf(struct fscrypt_hkdf
*hkdf
, const u8
*master_key
,
69 unsigned int master_key_size
)
71 struct crypto_shash
*hmac_tfm
;
75 hmac_tfm
= crypto_alloc_shash(HKDF_HMAC_ALG
, 0, 0);
76 if (IS_ERR(hmac_tfm
)) {
77 fscrypt_err(NULL
, "Error allocating " HKDF_HMAC_ALG
": %ld",
79 return PTR_ERR(hmac_tfm
);
82 if (WARN_ON_ONCE(crypto_shash_digestsize(hmac_tfm
) != sizeof(prk
))) {
87 err
= hkdf_extract(hmac_tfm
, master_key
, master_key_size
, prk
);
91 err
= crypto_shash_setkey(hmac_tfm
, prk
, sizeof(prk
));
95 hkdf
->hmac_tfm
= hmac_tfm
;
99 crypto_free_shash(hmac_tfm
);
101 memzero_explicit(prk
, sizeof(prk
));
106 * HKDF-Expand (RFC 5869 section 2.3). This expands the pseudorandom key, which
107 * was already keyed into 'hkdf->hmac_tfm' by fscrypt_init_hkdf(), into 'okmlen'
108 * bytes of output keying material parameterized by the application-specific
109 * 'info' of length 'infolen' bytes, prefixed by "fscrypt\0" and the 'context'
110 * byte. This is thread-safe and may be called by multiple threads in parallel.
112 * ('context' isn't part of the HKDF specification; it's just a prefix fscrypt
113 * adds to its application-specific info strings to guarantee that it doesn't
114 * accidentally repeat an info string when using HKDF for different purposes.)
116 int fscrypt_hkdf_expand(const struct fscrypt_hkdf
*hkdf
, u8 context
,
117 const u8
*info
, unsigned int infolen
,
118 u8
*okm
, unsigned int okmlen
)
120 SHASH_DESC_ON_STACK(desc
, hkdf
->hmac_tfm
);
124 const u8
*prev
= NULL
;
126 u8 tmp
[HKDF_HASHLEN
];
128 if (WARN_ON_ONCE(okmlen
> 255 * HKDF_HASHLEN
))
131 desc
->tfm
= hkdf
->hmac_tfm
;
133 memcpy(prefix
, "fscrypt\0", 8);
136 for (i
= 0; i
< okmlen
; i
+= HKDF_HASHLEN
) {
138 err
= crypto_shash_init(desc
);
143 err
= crypto_shash_update(desc
, prev
, HKDF_HASHLEN
);
148 err
= crypto_shash_update(desc
, prefix
, sizeof(prefix
));
152 err
= crypto_shash_update(desc
, info
, infolen
);
156 BUILD_BUG_ON(sizeof(counter
) != 1);
157 if (okmlen
- i
< HKDF_HASHLEN
) {
158 err
= crypto_shash_finup(desc
, &counter
, 1, tmp
);
161 memcpy(&okm
[i
], tmp
, okmlen
- i
);
162 memzero_explicit(tmp
, sizeof(tmp
));
164 err
= crypto_shash_finup(desc
, &counter
, 1, &okm
[i
]);
174 memzero_explicit(okm
, okmlen
); /* so caller doesn't need to */
175 shash_desc_zero(desc
);
179 void fscrypt_destroy_hkdf(struct fscrypt_hkdf
*hkdf
)
181 crypto_free_shash(hkdf
->hmac_tfm
);