1 /* Crypto operations using stored keys
3 * Copyright (c) 2016, Intel Corporation
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version
8 * 2 of the License, or (at your option) any later version.
11 #include <linux/slab.h>
12 #include <linux/uaccess.h>
13 #include <linux/scatterlist.h>
14 #include <linux/crypto.h>
15 #include <crypto/hash.h>
16 #include <crypto/kpp.h>
17 #include <crypto/dh.h>
18 #include <keys/user-type.h>
21 static ssize_t
dh_data_from_key(key_serial_t keyid
, void **data
)
28 key_ref
= lookup_user_key(keyid
, 0, KEY_NEED_READ
);
29 if (IS_ERR(key_ref
)) {
34 key
= key_ref_to_ptr(key_ref
);
37 if (key
->type
== &key_type_user
) {
39 status
= key_validate(key
);
41 const struct user_key_payload
*payload
;
44 payload
= user_key_payload_locked(key
);
46 duplicate
= kmemdup(payload
->data
, payload
->datalen
,
50 ret
= payload
->datalen
;
63 static void dh_free_data(struct dh
*dh
)
70 struct dh_completion
{
71 struct completion completion
;
75 static void dh_crypto_done(struct crypto_async_request
*req
, int err
)
77 struct dh_completion
*compl = req
->data
;
79 if (err
== -EINPROGRESS
)
83 complete(&compl->completion
);
87 struct shash_desc shash
;
91 static int kdf_alloc(struct kdf_sdesc
**sdesc_ret
, char *hashname
)
93 struct crypto_shash
*tfm
;
94 struct kdf_sdesc
*sdesc
;
98 /* allocate synchronous hash */
99 tfm
= crypto_alloc_shash(hashname
, 0, 0);
101 pr_info("could not allocate digest TFM handle %s\n", hashname
);
106 if (crypto_shash_digestsize(tfm
) == 0)
110 size
= sizeof(struct shash_desc
) + crypto_shash_descsize(tfm
);
111 sdesc
= kmalloc(size
, GFP_KERNEL
);
114 sdesc
->shash
.tfm
= tfm
;
115 sdesc
->shash
.flags
= 0x0;
122 crypto_free_shash(tfm
);
126 static void kdf_dealloc(struct kdf_sdesc
*sdesc
)
131 if (sdesc
->shash
.tfm
)
132 crypto_free_shash(sdesc
->shash
.tfm
);
138 * Implementation of the KDF in counter mode according to SP800-108 section 5.1
139 * as well as SP800-56A section 5.8.1 (Single-step KDF).
142 * The src pointer is defined as Z || other info where Z is the shared secret
143 * from DH and other info is an arbitrary string (see SP800-56A section
146 static int kdf_ctr(struct kdf_sdesc
*sdesc
, const u8
*src
, unsigned int slen
,
147 u8
*dst
, unsigned int dlen
, unsigned int zlen
)
149 struct shash_desc
*desc
= &sdesc
->shash
;
150 unsigned int h
= crypto_shash_digestsize(desc
->tfm
);
153 __be32 counter
= cpu_to_be32(1);
156 err
= crypto_shash_init(desc
);
160 err
= crypto_shash_update(desc
, (u8
*)&counter
, sizeof(__be32
));
166 size_t chunk
= min_t(size_t, zlen
, h
);
167 memset(tmpbuffer
, 0, chunk
);
170 err
= crypto_shash_update(desc
, tmpbuffer
,
176 chunk
= min_t(size_t, zlen
, h
);
181 err
= crypto_shash_update(desc
, src
, slen
);
189 err
= crypto_shash_final(desc
, tmpbuffer
);
192 memcpy(dst
, tmpbuffer
, dlen
);
193 memzero_explicit(tmpbuffer
, h
);
196 err
= crypto_shash_final(desc
, dst
);
202 counter
= cpu_to_be32(be32_to_cpu(counter
) + 1);
209 memzero_explicit(dst_orig
, dlen
);
213 static int keyctl_dh_compute_kdf(struct kdf_sdesc
*sdesc
,
214 char __user
*buffer
, size_t buflen
,
215 uint8_t *kbuf
, size_t kbuflen
, size_t lzero
)
217 uint8_t *outbuf
= NULL
;
220 outbuf
= kmalloc(buflen
, GFP_KERNEL
);
226 ret
= kdf_ctr(sdesc
, kbuf
, kbuflen
, outbuf
, buflen
, lzero
);
231 if (copy_to_user(buffer
, outbuf
, buflen
) != 0)
239 long __keyctl_dh_compute(struct keyctl_dh_params __user
*params
,
240 char __user
*buffer
, size_t buflen
,
241 struct keyctl_kdf_params
*kdfcopy
)
247 struct keyctl_dh_params pcopy
;
249 struct scatterlist outsg
;
250 struct dh_completion
compl;
251 struct crypto_kpp
*tfm
;
252 struct kpp_request
*req
;
255 struct kdf_sdesc
*sdesc
= NULL
;
257 if (!params
|| (!buffer
&& buflen
)) {
261 if (copy_from_user(&pcopy
, params
, sizeof(pcopy
)) != 0) {
269 if (memchr_inv(kdfcopy
->__spare
, 0, sizeof(kdfcopy
->__spare
))) {
274 if (buflen
> KEYCTL_KDF_MAX_OUTPUT_LEN
||
275 kdfcopy
->otherinfolen
> KEYCTL_KDF_MAX_OI_LEN
) {
280 /* get KDF name string */
281 hashname
= strndup_user(kdfcopy
->hashname
, CRYPTO_MAX_ALG_NAME
);
282 if (IS_ERR(hashname
)) {
283 ret
= PTR_ERR(hashname
);
287 /* allocate KDF from the kernel crypto API */
288 ret
= kdf_alloc(&sdesc
, hashname
);
294 memset(&dh_inputs
, 0, sizeof(dh_inputs
));
296 dlen
= dh_data_from_key(pcopy
.prime
, &dh_inputs
.p
);
301 dh_inputs
.p_size
= dlen
;
303 dlen
= dh_data_from_key(pcopy
.base
, &dh_inputs
.g
);
308 dh_inputs
.g_size
= dlen
;
310 dlen
= dh_data_from_key(pcopy
.private, &dh_inputs
.key
);
315 dh_inputs
.key_size
= dlen
;
317 secretlen
= crypto_dh_key_len(&dh_inputs
);
318 secret
= kmalloc(secretlen
, GFP_KERNEL
);
323 ret
= crypto_dh_encode_key(secret
, secretlen
, &dh_inputs
);
327 tfm
= crypto_alloc_kpp("dh", CRYPTO_ALG_TYPE_KPP
, 0);
333 ret
= crypto_kpp_set_secret(tfm
, secret
, secretlen
);
337 outlen
= crypto_kpp_maxsize(tfm
);
341 * When not using a KDF, buflen 0 is used to read the
342 * required buffer length
347 } else if (outlen
> buflen
) {
353 outbuf
= kzalloc(kdfcopy
? (outlen
+ kdfcopy
->otherinfolen
) : outlen
,
360 sg_init_one(&outsg
, outbuf
, outlen
);
362 req
= kpp_request_alloc(tfm
, GFP_KERNEL
);
368 kpp_request_set_input(req
, NULL
, 0);
369 kpp_request_set_output(req
, &outsg
, outlen
);
370 init_completion(&compl.completion
);
371 kpp_request_set_callback(req
, CRYPTO_TFM_REQ_MAY_BACKLOG
|
372 CRYPTO_TFM_REQ_MAY_SLEEP
,
373 dh_crypto_done
, &compl);
376 * For DH, generate_public_key and generate_shared_secret are
377 * the same calculation
379 ret
= crypto_kpp_generate_public_key(req
);
380 if (ret
== -EINPROGRESS
) {
381 wait_for_completion(&compl.completion
);
389 * Concatenate SP800-56A otherinfo past DH shared secret -- the
390 * input to the KDF is (DH shared secret || otherinfo)
392 if (copy_from_user(outbuf
+ req
->dst_len
, kdfcopy
->otherinfo
,
393 kdfcopy
->otherinfolen
) != 0) {
398 ret
= keyctl_dh_compute_kdf(sdesc
, buffer
, buflen
, outbuf
,
399 req
->dst_len
+ kdfcopy
->otherinfolen
,
400 outlen
- req
->dst_len
);
401 } else if (copy_to_user(buffer
, outbuf
, req
->dst_len
) == 0) {
408 kpp_request_free(req
);
412 crypto_free_kpp(tfm
);
416 dh_free_data(&dh_inputs
);
422 long keyctl_dh_compute(struct keyctl_dh_params __user
*params
,
423 char __user
*buffer
, size_t buflen
,
424 struct keyctl_kdf_params __user
*kdf
)
426 struct keyctl_kdf_params kdfcopy
;
429 return __keyctl_dh_compute(params
, buffer
, buflen
, NULL
);
431 if (copy_from_user(&kdfcopy
, kdf
, sizeof(kdfcopy
)) != 0)
434 return __keyctl_dh_compute(params
, buffer
, buflen
, &kdfcopy
);