s390/crypto: Renaming PPNO to PRNO.
The PPNO (Perform Pseudorandom Number Operation) instruction has been renamed to PRNO (Perform Random Number Operation). To avoid confusion and conflicts with future extensions with this instruction (like e.g. provide a true random number generator) this patch renames all occurences in cpacf.h and adjusts the only exploiter code which is the prng device driver and one line in the s390 kvm feature check. Signed-off-by: Harald Freudenberger <freude@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
Родитель
1366def38b
Коммит
985a9d20da
|
@ -81,7 +81,7 @@ struct prng_ws_s {
|
||||||
u64 byte_counter;
|
u64 byte_counter;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ppno_ws_s {
|
struct prno_ws_s {
|
||||||
u32 res;
|
u32 res;
|
||||||
u32 reseed_counter;
|
u32 reseed_counter;
|
||||||
u64 stream_bytes;
|
u64 stream_bytes;
|
||||||
|
@ -93,7 +93,7 @@ struct prng_data_s {
|
||||||
struct mutex mutex;
|
struct mutex mutex;
|
||||||
union {
|
union {
|
||||||
struct prng_ws_s prngws;
|
struct prng_ws_s prngws;
|
||||||
struct ppno_ws_s ppnows;
|
struct prno_ws_s prnows;
|
||||||
};
|
};
|
||||||
u8 *buf;
|
u8 *buf;
|
||||||
u32 rest;
|
u32 rest;
|
||||||
|
@ -306,12 +306,12 @@ static int __init prng_sha512_selftest(void)
|
||||||
0x36, 0x8c, 0x5a, 0x9f, 0x7a, 0x4b, 0x3e, 0xe2 };
|
0x36, 0x8c, 0x5a, 0x9f, 0x7a, 0x4b, 0x3e, 0xe2 };
|
||||||
|
|
||||||
u8 buf[sizeof(random)];
|
u8 buf[sizeof(random)];
|
||||||
struct ppno_ws_s ws;
|
struct prno_ws_s ws;
|
||||||
|
|
||||||
memset(&ws, 0, sizeof(ws));
|
memset(&ws, 0, sizeof(ws));
|
||||||
|
|
||||||
/* initial seed */
|
/* initial seed */
|
||||||
cpacf_ppno(CPACF_PPNO_SHA512_DRNG_SEED,
|
cpacf_prno(CPACF_PRNO_SHA512_DRNG_SEED,
|
||||||
&ws, NULL, 0, seed, sizeof(seed));
|
&ws, NULL, 0, seed, sizeof(seed));
|
||||||
|
|
||||||
/* check working states V and C */
|
/* check working states V and C */
|
||||||
|
@ -324,9 +324,9 @@ static int __init prng_sha512_selftest(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* generate random bytes */
|
/* generate random bytes */
|
||||||
cpacf_ppno(CPACF_PPNO_SHA512_DRNG_GEN,
|
cpacf_prno(CPACF_PRNO_SHA512_DRNG_GEN,
|
||||||
&ws, buf, sizeof(buf), NULL, 0);
|
&ws, buf, sizeof(buf), NULL, 0);
|
||||||
cpacf_ppno(CPACF_PPNO_SHA512_DRNG_GEN,
|
cpacf_prno(CPACF_PRNO_SHA512_DRNG_GEN,
|
||||||
&ws, buf, sizeof(buf), NULL, 0);
|
&ws, buf, sizeof(buf), NULL, 0);
|
||||||
|
|
||||||
/* check against expected data */
|
/* check against expected data */
|
||||||
|
@ -374,16 +374,16 @@ static int __init prng_sha512_instantiate(void)
|
||||||
/* followed by 16 bytes of unique nonce */
|
/* followed by 16 bytes of unique nonce */
|
||||||
get_tod_clock_ext(seed + 64 + 32);
|
get_tod_clock_ext(seed + 64 + 32);
|
||||||
|
|
||||||
/* initial seed of the ppno drng */
|
/* initial seed of the prno drng */
|
||||||
cpacf_ppno(CPACF_PPNO_SHA512_DRNG_SEED,
|
cpacf_prno(CPACF_PRNO_SHA512_DRNG_SEED,
|
||||||
&prng_data->ppnows, NULL, 0, seed, sizeof(seed));
|
&prng_data->prnows, NULL, 0, seed, sizeof(seed));
|
||||||
|
|
||||||
/* if fips mode is enabled, generate a first block of random
|
/* if fips mode is enabled, generate a first block of random
|
||||||
bytes for the FIPS 140-2 Conditional Self Test */
|
bytes for the FIPS 140-2 Conditional Self Test */
|
||||||
if (fips_enabled) {
|
if (fips_enabled) {
|
||||||
prng_data->prev = prng_data->buf + prng_chunk_size;
|
prng_data->prev = prng_data->buf + prng_chunk_size;
|
||||||
cpacf_ppno(CPACF_PPNO_SHA512_DRNG_GEN,
|
cpacf_prno(CPACF_PRNO_SHA512_DRNG_GEN,
|
||||||
&prng_data->ppnows,
|
&prng_data->prnows,
|
||||||
prng_data->prev, prng_chunk_size, NULL, 0);
|
prng_data->prev, prng_chunk_size, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -412,9 +412,9 @@ static int prng_sha512_reseed(void)
|
||||||
if (ret != sizeof(seed))
|
if (ret != sizeof(seed))
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* do a reseed of the ppno drng with this bytestring */
|
/* do a reseed of the prno drng with this bytestring */
|
||||||
cpacf_ppno(CPACF_PPNO_SHA512_DRNG_SEED,
|
cpacf_prno(CPACF_PRNO_SHA512_DRNG_SEED,
|
||||||
&prng_data->ppnows, NULL, 0, seed, sizeof(seed));
|
&prng_data->prnows, NULL, 0, seed, sizeof(seed));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -425,15 +425,15 @@ static int prng_sha512_generate(u8 *buf, size_t nbytes)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* reseed needed ? */
|
/* reseed needed ? */
|
||||||
if (prng_data->ppnows.reseed_counter > prng_reseed_limit) {
|
if (prng_data->prnows.reseed_counter > prng_reseed_limit) {
|
||||||
ret = prng_sha512_reseed();
|
ret = prng_sha512_reseed();
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PPNO generate */
|
/* PRNO generate */
|
||||||
cpacf_ppno(CPACF_PPNO_SHA512_DRNG_GEN,
|
cpacf_prno(CPACF_PRNO_SHA512_DRNG_GEN,
|
||||||
&prng_data->ppnows, buf, nbytes, NULL, 0);
|
&prng_data->prnows, buf, nbytes, NULL, 0);
|
||||||
|
|
||||||
/* FIPS 140-2 Conditional Self Test */
|
/* FIPS 140-2 Conditional Self Test */
|
||||||
if (fips_enabled) {
|
if (fips_enabled) {
|
||||||
|
@ -653,7 +653,7 @@ static ssize_t prng_counter_show(struct device *dev,
|
||||||
if (mutex_lock_interruptible(&prng_data->mutex))
|
if (mutex_lock_interruptible(&prng_data->mutex))
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
if (prng_mode == PRNG_MODE_SHA512)
|
if (prng_mode == PRNG_MODE_SHA512)
|
||||||
counter = prng_data->ppnows.stream_bytes;
|
counter = prng_data->prnows.stream_bytes;
|
||||||
else
|
else
|
||||||
counter = prng_data->prngws.byte_counter;
|
counter = prng_data->prngws.byte_counter;
|
||||||
mutex_unlock(&prng_data->mutex);
|
mutex_unlock(&prng_data->mutex);
|
||||||
|
@ -774,8 +774,8 @@ static int __init prng_init(void)
|
||||||
|
|
||||||
/* choose prng mode */
|
/* choose prng mode */
|
||||||
if (prng_mode != PRNG_MODE_TDES) {
|
if (prng_mode != PRNG_MODE_TDES) {
|
||||||
/* check for MSA5 support for PPNO operations */
|
/* check for MSA5 support for PRNO operations */
|
||||||
if (!cpacf_query_func(CPACF_PPNO, CPACF_PPNO_SHA512_DRNG_GEN)) {
|
if (!cpacf_query_func(CPACF_PRNO, CPACF_PRNO_SHA512_DRNG_GEN)) {
|
||||||
if (prng_mode == PRNG_MODE_SHA512) {
|
if (prng_mode == PRNG_MODE_SHA512) {
|
||||||
pr_err("The prng module cannot "
|
pr_err("The prng module cannot "
|
||||||
"start in SHA-512 mode\n");
|
"start in SHA-512 mode\n");
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
#define CPACF_KMO 0xb92b /* MSA4 */
|
#define CPACF_KMO 0xb92b /* MSA4 */
|
||||||
#define CPACF_PCC 0xb92c /* MSA4 */
|
#define CPACF_PCC 0xb92c /* MSA4 */
|
||||||
#define CPACF_KMCTR 0xb92d /* MSA4 */
|
#define CPACF_KMCTR 0xb92d /* MSA4 */
|
||||||
#define CPACF_PPNO 0xb93c /* MSA5 */
|
#define CPACF_PRNO 0xb93c /* MSA5 */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* En/decryption modifier bits
|
* En/decryption modifier bits
|
||||||
|
@ -123,12 +123,12 @@
|
||||||
#define CPACF_PCKMO_ENC_AES_256_KEY 0x14
|
#define CPACF_PCKMO_ENC_AES_256_KEY 0x14
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function codes for the PPNO (PERFORM PSEUDORANDOM NUMBER OPERATION)
|
* Function codes for the PRNO (PERFORM RANDOM NUMBER OPERATION)
|
||||||
* instruction
|
* instruction
|
||||||
*/
|
*/
|
||||||
#define CPACF_PPNO_QUERY 0x00
|
#define CPACF_PRNO_QUERY 0x00
|
||||||
#define CPACF_PPNO_SHA512_DRNG_GEN 0x03
|
#define CPACF_PRNO_SHA512_DRNG_GEN 0x03
|
||||||
#define CPACF_PPNO_SHA512_DRNG_SEED 0x83
|
#define CPACF_PRNO_SHA512_DRNG_SEED 0x83
|
||||||
|
|
||||||
typedef struct { unsigned char bytes[16]; } cpacf_mask_t;
|
typedef struct { unsigned char bytes[16]; } cpacf_mask_t;
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ static inline int __cpacf_check_opcode(unsigned int opcode)
|
||||||
case CPACF_PCC:
|
case CPACF_PCC:
|
||||||
case CPACF_KMCTR:
|
case CPACF_KMCTR:
|
||||||
return test_facility(77); /* check for MSA4 */
|
return test_facility(77); /* check for MSA4 */
|
||||||
case CPACF_PPNO:
|
case CPACF_PRNO:
|
||||||
return test_facility(57); /* check for MSA5 */
|
return test_facility(57); /* check for MSA5 */
|
||||||
default:
|
default:
|
||||||
BUG();
|
BUG();
|
||||||
|
@ -373,16 +373,16 @@ static inline int cpacf_kmctr(unsigned long func, void *param, u8 *dest,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cpacf_ppno() - executes the PPNO (PERFORM PSEUDORANDOM NUMBER OPERATION)
|
* cpacf_prno() - executes the PRNO (PERFORM RANDOM NUMBER OPERATION)
|
||||||
* instruction
|
* instruction
|
||||||
* @func: the function code passed to PPNO; see CPACF_PPNO_xxx defines
|
* @func: the function code passed to PRNO; see CPACF_PRNO_xxx defines
|
||||||
* @param: address of parameter block; see POP for details on each func
|
* @param: address of parameter block; see POP for details on each func
|
||||||
* @dest: address of destination memory area
|
* @dest: address of destination memory area
|
||||||
* @dest_len: size of destination memory area in bytes
|
* @dest_len: size of destination memory area in bytes
|
||||||
* @seed: address of seed data
|
* @seed: address of seed data
|
||||||
* @seed_len: size of seed data in bytes
|
* @seed_len: size of seed data in bytes
|
||||||
*/
|
*/
|
||||||
static inline void cpacf_ppno(unsigned long func, void *param,
|
static inline void cpacf_prno(unsigned long func, void *param,
|
||||||
u8 *dest, long dest_len,
|
u8 *dest, long dest_len,
|
||||||
const u8 *seed, long seed_len)
|
const u8 *seed, long seed_len)
|
||||||
{
|
{
|
||||||
|
@ -398,7 +398,7 @@ static inline void cpacf_ppno(unsigned long func, void *param,
|
||||||
" brc 1,0b\n" /* handle partial completion */
|
" brc 1,0b\n" /* handle partial completion */
|
||||||
: [dst] "+a" (r2), [dlen] "+d" (r3)
|
: [dst] "+a" (r2), [dlen] "+d" (r3)
|
||||||
: [fc] "d" (r0), [pba] "a" (r1),
|
: [fc] "d" (r0), [pba] "a" (r1),
|
||||||
[seed] "a" (r4), [slen] "d" (r5), [opc] "i" (CPACF_PPNO)
|
[seed] "a" (r4), [slen] "d" (r5), [opc] "i" (CPACF_PRNO)
|
||||||
: "cc", "memory");
|
: "cc", "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -273,7 +273,7 @@ static void kvm_s390_cpu_feat_init(void)
|
||||||
kvm_s390_available_subfunc.pcc);
|
kvm_s390_available_subfunc.pcc);
|
||||||
}
|
}
|
||||||
if (test_facility(57)) /* MSA5 */
|
if (test_facility(57)) /* MSA5 */
|
||||||
__cpacf_query(CPACF_PPNO, (cpacf_mask_t *)
|
__cpacf_query(CPACF_PRNO, (cpacf_mask_t *)
|
||||||
kvm_s390_available_subfunc.ppno);
|
kvm_s390_available_subfunc.ppno);
|
||||||
|
|
||||||
if (MACHINE_HAS_ESOP)
|
if (MACHINE_HAS_ESOP)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче