forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
KEYS: add SP800-56A KDF support for DH
SP800-56A defines the use of DH with key derivation function based on a counter. The input to the KDF is defined as (DH shared secret || other information). The value for the "other information" is to be provided by the caller. The KDF is implemented using the hash support from the kernel crypto API. The implementation uses the symmetric hash support as the input to the hash operation is usually very small. The caller is allowed to specify the hash name that he wants to use to derive the key material allowing the use of all supported hashes provided with the kernel crypto API. As the KDF implements the proper truncation of the DH shared secret to the requested size, this patch fills the caller buffer up to its size. The patch is tested with a new test added to the keyutils user space code which uses a CAVS test vector testing the compliance with SP800-56A. Signed-off-by: Stephan Mueller <[email protected]> Signed-off-by: David Howells <[email protected]>
- Loading branch information
1 parent
f0df90c
commit f1c316a
Showing
10 changed files
with
315 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
/* 32-bit compatibility syscall for 64-bit systems for DH operations | ||
* | ||
* Copyright (C) 2016 Stephan Mueller <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version | ||
* 2 of the License, or (at your option) any later version. | ||
*/ | ||
|
||
#include <linux/uaccess.h> | ||
|
||
#include "internal.h" | ||
|
||
/* | ||
* Perform the DH computation or DH based key derivation. | ||
* | ||
* If successful, 0 will be returned. | ||
*/ | ||
long compat_keyctl_dh_compute(struct keyctl_dh_params __user *params, | ||
char __user *buffer, size_t buflen, | ||
struct compat_keyctl_kdf_params __user *kdf) | ||
{ | ||
struct keyctl_kdf_params kdfcopy; | ||
struct compat_keyctl_kdf_params compat_kdfcopy; | ||
|
||
if (!kdf) | ||
return __keyctl_dh_compute(params, buffer, buflen, NULL); | ||
|
||
if (copy_from_user(&compat_kdfcopy, kdf, sizeof(compat_kdfcopy)) != 0) | ||
return -EFAULT; | ||
|
||
kdfcopy.hashname = compat_ptr(compat_kdfcopy.hashname); | ||
kdfcopy.otherinfo = compat_ptr(compat_kdfcopy.otherinfo); | ||
kdfcopy.otherinfolen = compat_kdfcopy.otherinfolen; | ||
|
||
return __keyctl_dh_compute(params, buffer, buflen, &kdfcopy); | ||
} |
Oops, something went wrong.