-
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.
s390/crypto: Provide s390 specific arch random functionality.
This patch introduces s390 specific arch random functionality. There exists a generic kernel API for arch specific random number implementation (see include/linux/random.h). Here comes the header file and a very small static code part implementing the arch_random_* API based on the TRNG subfunction coming with the reworked PRNG instruction. The arch random implementation hooks into the kernel initialization and checks for availability of the TRNG function. In accordance to the arch random API all functions return false if the TRNG is not available. Otherwise the new high quality entropy source provides fresh random on each invocation. The s390 arch random feature build is controlled via CONFIG_ARCH_RANDOM. This config option located in arch/s390/Kconfig is enabled by default and appears as entry "s390 architectural random number generation API" in the submenu "Processor type and features" for s390 builds. Signed-off-by: Harald Freudenberger <[email protected]> Signed-off-by: Martin Schwidefsky <[email protected]>
- Loading branch information
Harald Freudenberger
authored and
Martin Schwidefsky
committed
Apr 26, 2017
1 parent
f75fa65
commit 4c637cd
Showing
5 changed files
with
117 additions
and
1 deletion.
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
/* | ||
* s390 arch random implementation. | ||
* | ||
* Copyright IBM Corp. 2017 | ||
* Author(s): Harald Freudenberger <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License (version 2 only) | ||
* as published by the Free Software Foundation. | ||
* | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/atomic.h> | ||
#include <linux/static_key.h> | ||
#include <asm/cpacf.h> | ||
|
||
DEFINE_STATIC_KEY_FALSE(s390_arch_random_available); | ||
|
||
atomic64_t s390_arch_random_counter = ATOMIC64_INIT(0); | ||
EXPORT_SYMBOL(s390_arch_random_counter); | ||
|
||
static int __init s390_arch_random_init(void) | ||
{ | ||
/* check if subfunction CPACF_PRNO_TRNG is available */ | ||
if (cpacf_query_func(CPACF_PRNO, CPACF_PRNO_TRNG)) | ||
static_branch_enable(&s390_arch_random_available); | ||
|
||
return 0; | ||
} | ||
arch_initcall(s390_arch_random_init); |
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,69 @@ | ||
/* | ||
* Kernel interface for the s390 arch_random_* functions | ||
* | ||
* Copyright IBM Corp. 2017 | ||
* | ||
* Author: Harald Freudenberger <[email protected]> | ||
* | ||
*/ | ||
|
||
#ifndef _ASM_S390_ARCHRANDOM_H | ||
#define _ASM_S390_ARCHRANDOM_H | ||
|
||
#ifdef CONFIG_ARCH_RANDOM | ||
|
||
#include <linux/static_key.h> | ||
#include <linux/atomic.h> | ||
#include <asm/cpacf.h> | ||
|
||
DECLARE_STATIC_KEY_FALSE(s390_arch_random_available); | ||
extern atomic64_t s390_arch_random_counter; | ||
|
||
static void s390_arch_random_generate(u8 *buf, unsigned int nbytes) | ||
{ | ||
cpacf_trng(NULL, 0, buf, nbytes); | ||
atomic64_add(nbytes, &s390_arch_random_counter); | ||
} | ||
|
||
static inline bool arch_has_random(void) | ||
{ | ||
if (static_branch_likely(&s390_arch_random_available)) | ||
return true; | ||
return false; | ||
} | ||
|
||
static inline bool arch_has_random_seed(void) | ||
{ | ||
return arch_has_random(); | ||
} | ||
|
||
static inline bool arch_get_random_long(unsigned long *v) | ||
{ | ||
if (static_branch_likely(&s390_arch_random_available)) { | ||
s390_arch_random_generate((u8 *)v, sizeof(*v)); | ||
return true; | ||
} | ||
return false; | ||
} | ||
|
||
static inline bool arch_get_random_int(unsigned int *v) | ||
{ | ||
if (static_branch_likely(&s390_arch_random_available)) { | ||
s390_arch_random_generate((u8 *)v, sizeof(*v)); | ||
return true; | ||
} | ||
return false; | ||
} | ||
|
||
static inline bool arch_get_random_seed_long(unsigned long *v) | ||
{ | ||
return arch_get_random_long(v); | ||
} | ||
|
||
static inline bool arch_get_random_seed_int(unsigned int *v) | ||
{ | ||
return arch_get_random_int(v); | ||
} | ||
|
||
#endif /* CONFIG_ARCH_RANDOM */ | ||
#endif /* _ASM_S390_ARCHRANDOM_H */ |