1/*
2 * Copyright IBM Corp. 2006, 2015
3 * Author(s): Jan Glauber <jan.glauber@de.ibm.com>
4 *	      Harald Freudenberger <freude@de.ibm.com>
5 * Driver for the s390 pseudo random number generator
6 */
7
8#define KMSG_COMPONENT "prng"
9#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
10
11#include <linux/fs.h>
12#include <linux/fips.h>
13#include <linux/init.h>
14#include <linux/kernel.h>
15#include <linux/device.h>
16#include <linux/miscdevice.h>
17#include <linux/module.h>
18#include <linux/moduleparam.h>
19#include <linux/mutex.h>
20#include <linux/random.h>
21#include <linux/slab.h>
22#include <asm/debug.h>
23#include <asm/uaccess.h>
24#include <asm/timex.h>
25
26#include "crypt_s390.h"
27
28MODULE_LICENSE("GPL");
29MODULE_AUTHOR("IBM Corporation");
30MODULE_DESCRIPTION("s390 PRNG interface");
31
32
33#define PRNG_MODE_AUTO	  0
34#define PRNG_MODE_TDES	  1
35#define PRNG_MODE_SHA512  2
36
37static unsigned int prng_mode = PRNG_MODE_AUTO;
38module_param_named(mode, prng_mode, int, 0);
39MODULE_PARM_DESC(prng_mode, "PRNG mode: 0 - auto, 1 - TDES, 2 - SHA512");
40
41
42#define PRNG_CHUNKSIZE_TDES_MIN   8
43#define PRNG_CHUNKSIZE_TDES_MAX   (64*1024)
44#define PRNG_CHUNKSIZE_SHA512_MIN 64
45#define PRNG_CHUNKSIZE_SHA512_MAX (64*1024)
46
47static unsigned int prng_chunk_size = 256;
48module_param_named(chunksize, prng_chunk_size, int, 0);
49MODULE_PARM_DESC(prng_chunk_size, "PRNG read chunk size in bytes");
50
51
52#define PRNG_RESEED_LIMIT_TDES		 4096
53#define PRNG_RESEED_LIMIT_TDES_LOWER	 4096
54#define PRNG_RESEED_LIMIT_SHA512       100000
55#define PRNG_RESEED_LIMIT_SHA512_LOWER	10000
56
57static unsigned int prng_reseed_limit;
58module_param_named(reseed_limit, prng_reseed_limit, int, 0);
59MODULE_PARM_DESC(prng_reseed_limit, "PRNG reseed limit");
60
61
62/*
63 * Any one who considers arithmetical methods of producing random digits is,
64 * of course, in a state of sin. -- John von Neumann
65 */
66
67static int prng_errorflag;
68
69#define PRNG_GEN_ENTROPY_FAILED  1
70#define PRNG_SELFTEST_FAILED	 2
71#define PRNG_INSTANTIATE_FAILED  3
72#define PRNG_SEED_FAILED	 4
73#define PRNG_RESEED_FAILED	 5
74#define PRNG_GEN_FAILED		 6
75
76struct prng_ws_s {
77	u8  parm_block[32];
78	u32 reseed_counter;
79	u64 byte_counter;
80};
81
82struct ppno_ws_s {
83	u32 res;
84	u32 reseed_counter;
85	u64 stream_bytes;
86	u8  V[112];
87	u8  C[112];
88};
89
90struct prng_data_s {
91	struct mutex mutex;
92	union {
93		struct prng_ws_s prngws;
94		struct ppno_ws_s ppnows;
95	};
96	u8 *buf;
97	u32 rest;
98	u8 *prev;
99};
100
101static struct prng_data_s *prng_data;
102
103/* initial parameter block for tdes mode, copied from libica */
104static const u8 initial_parm_block[32] __initconst = {
105	0x0F, 0x2B, 0x8E, 0x63, 0x8C, 0x8E, 0xD2, 0x52,
106	0x64, 0xB7, 0xA0, 0x7B, 0x75, 0x28, 0xB8, 0xF4,
107	0x75, 0x5F, 0xD2, 0xA6, 0x8D, 0x97, 0x11, 0xFF,
108	0x49, 0xD8, 0x23, 0xF3, 0x7E, 0x21, 0xEC, 0xA0 };
109
110
111/*** helper functions ***/
112
113static int generate_entropy(u8 *ebuf, size_t nbytes)
114{
115	int n, ret = 0;
116	u8 *pg, *h, hash[32];
117
118	pg = (u8 *) __get_free_page(GFP_KERNEL);
119	if (!pg) {
120		prng_errorflag = PRNG_GEN_ENTROPY_FAILED;
121		return -ENOMEM;
122	}
123
124	while (nbytes) {
125		/* fill page with urandom bytes */
126		get_random_bytes(pg, PAGE_SIZE);
127		/* exor page with stckf values */
128		for (n = 0; n < PAGE_SIZE / sizeof(u64); n++) {
129			u64 *p = ((u64 *)pg) + n;
130			*p ^= get_tod_clock_fast();
131		}
132		n = (nbytes < sizeof(hash)) ? nbytes : sizeof(hash);
133		if (n < sizeof(hash))
134			h = hash;
135		else
136			h = ebuf;
137		/* generate sha256 from this page */
138		if (crypt_s390_kimd(KIMD_SHA_256, h,
139				    pg, PAGE_SIZE) != PAGE_SIZE) {
140			prng_errorflag = PRNG_GEN_ENTROPY_FAILED;
141			ret = -EIO;
142			goto out;
143		}
144		if (n < sizeof(hash))
145			memcpy(ebuf, hash, n);
146		ret += n;
147		ebuf += n;
148		nbytes -= n;
149	}
150
151out:
152	free_page((unsigned long)pg);
153	return ret;
154}
155
156
157/*** tdes functions ***/
158
159static void prng_tdes_add_entropy(void)
160{
161	__u64 entropy[4];
162	unsigned int i;
163	int ret;
164
165	for (i = 0; i < 16; i++) {
166		ret = crypt_s390_kmc(KMC_PRNG, prng_data->prngws.parm_block,
167				     (char *)entropy, (char *)entropy,
168				     sizeof(entropy));
169		BUG_ON(ret < 0 || ret != sizeof(entropy));
170		memcpy(prng_data->prngws.parm_block, entropy, sizeof(entropy));
171	}
172}
173
174
175static void prng_tdes_seed(int nbytes)
176{
177	char buf[16];
178	int i = 0;
179
180	BUG_ON(nbytes > sizeof(buf));
181
182	get_random_bytes(buf, nbytes);
183
184	/* Add the entropy */
185	while (nbytes >= 8) {
186		*((__u64 *)prng_data->prngws.parm_block) ^= *((__u64 *)(buf+i));
187		prng_tdes_add_entropy();
188		i += 8;
189		nbytes -= 8;
190	}
191	prng_tdes_add_entropy();
192	prng_data->prngws.reseed_counter = 0;
193}
194
195
196static int __init prng_tdes_instantiate(void)
197{
198	int datalen;
199
200	pr_debug("prng runs in TDES mode with "
201		 "chunksize=%d and reseed_limit=%u\n",
202		 prng_chunk_size, prng_reseed_limit);
203
204	/* memory allocation, prng_data struct init, mutex init */
205	datalen = sizeof(struct prng_data_s) + prng_chunk_size;
206	prng_data = kzalloc(datalen, GFP_KERNEL);
207	if (!prng_data) {
208		prng_errorflag = PRNG_INSTANTIATE_FAILED;
209		return -ENOMEM;
210	}
211	mutex_init(&prng_data->mutex);
212	prng_data->buf = ((u8 *)prng_data) + sizeof(struct prng_data_s);
213	memcpy(prng_data->prngws.parm_block, initial_parm_block, 32);
214
215	/* initialize the PRNG, add 128 bits of entropy */
216	prng_tdes_seed(16);
217
218	return 0;
219}
220
221
222static void prng_tdes_deinstantiate(void)
223{
224	pr_debug("The prng module stopped "
225		 "after running in triple DES mode\n");
226	kzfree(prng_data);
227}
228
229
230/*** sha512 functions ***/
231
232static int __init prng_sha512_selftest(void)
233{
234	/* NIST DRBG testvector for Hash Drbg, Sha-512, Count #0 */
235	static const u8 seed[] __initconst = {
236		0x6b, 0x50, 0xa7, 0xd8, 0xf8, 0xa5, 0x5d, 0x7a,
237		0x3d, 0xf8, 0xbb, 0x40, 0xbc, 0xc3, 0xb7, 0x22,
238		0xd8, 0x70, 0x8d, 0xe6, 0x7f, 0xda, 0x01, 0x0b,
239		0x03, 0xc4, 0xc8, 0x4d, 0x72, 0x09, 0x6f, 0x8c,
240		0x3e, 0xc6, 0x49, 0xcc, 0x62, 0x56, 0xd9, 0xfa,
241		0x31, 0xdb, 0x7a, 0x29, 0x04, 0xaa, 0xf0, 0x25 };
242	static const u8 V0[] __initconst = {
243		0x00, 0xad, 0xe3, 0x6f, 0x9a, 0x01, 0xc7, 0x76,
244		0x61, 0x34, 0x35, 0xf5, 0x4e, 0x24, 0x74, 0x22,
245		0x21, 0x9a, 0x29, 0x89, 0xc7, 0x93, 0x2e, 0x60,
246		0x1e, 0xe8, 0x14, 0x24, 0x8d, 0xd5, 0x03, 0xf1,
247		0x65, 0x5d, 0x08, 0x22, 0x72, 0xd5, 0xad, 0x95,
248		0xe1, 0x23, 0x1e, 0x8a, 0xa7, 0x13, 0xd9, 0x2b,
249		0x5e, 0xbc, 0xbb, 0x80, 0xab, 0x8d, 0xe5, 0x79,
250		0xab, 0x5b, 0x47, 0x4e, 0xdd, 0xee, 0x6b, 0x03,
251		0x8f, 0x0f, 0x5c, 0x5e, 0xa9, 0x1a, 0x83, 0xdd,
252		0xd3, 0x88, 0xb2, 0x75, 0x4b, 0xce, 0x83, 0x36,
253		0x57, 0x4b, 0xf1, 0x5c, 0xca, 0x7e, 0x09, 0xc0,
254		0xd3, 0x89, 0xc6, 0xe0, 0xda, 0xc4, 0x81, 0x7e,
255		0x5b, 0xf9, 0xe1, 0x01, 0xc1, 0x92, 0x05, 0xea,
256		0xf5, 0x2f, 0xc6, 0xc6, 0xc7, 0x8f, 0xbc, 0xf4 };
257	static const u8 C0[] __initconst = {
258		0x00, 0xf4, 0xa3, 0xe5, 0xa0, 0x72, 0x63, 0x95,
259		0xc6, 0x4f, 0x48, 0xd0, 0x8b, 0x5b, 0x5f, 0x8e,
260		0x6b, 0x96, 0x1f, 0x16, 0xed, 0xbc, 0x66, 0x94,
261		0x45, 0x31, 0xd7, 0x47, 0x73, 0x22, 0xa5, 0x86,
262		0xce, 0xc0, 0x4c, 0xac, 0x63, 0xb8, 0x39, 0x50,
263		0xbf, 0xe6, 0x59, 0x6c, 0x38, 0x58, 0x99, 0x1f,
264		0x27, 0xa7, 0x9d, 0x71, 0x2a, 0xb3, 0x7b, 0xf9,
265		0xfb, 0x17, 0x86, 0xaa, 0x99, 0x81, 0xaa, 0x43,
266		0xe4, 0x37, 0xd3, 0x1e, 0x6e, 0xe5, 0xe6, 0xee,
267		0xc2, 0xed, 0x95, 0x4f, 0x53, 0x0e, 0x46, 0x8a,
268		0xcc, 0x45, 0xa5, 0xdb, 0x69, 0x0d, 0x81, 0xc9,
269		0x32, 0x92, 0xbc, 0x8f, 0x33, 0xe6, 0xf6, 0x09,
270		0x7c, 0x8e, 0x05, 0x19, 0x0d, 0xf1, 0xb6, 0xcc,
271		0xf3, 0x02, 0x21, 0x90, 0x25, 0xec, 0xed, 0x0e };
272	static const u8 random[] __initconst = {
273		0x95, 0xb7, 0xf1, 0x7e, 0x98, 0x02, 0xd3, 0x57,
274		0x73, 0x92, 0xc6, 0xa9, 0xc0, 0x80, 0x83, 0xb6,
275		0x7d, 0xd1, 0x29, 0x22, 0x65, 0xb5, 0xf4, 0x2d,
276		0x23, 0x7f, 0x1c, 0x55, 0xbb, 0x9b, 0x10, 0xbf,
277		0xcf, 0xd8, 0x2c, 0x77, 0xa3, 0x78, 0xb8, 0x26,
278		0x6a, 0x00, 0x99, 0x14, 0x3b, 0x3c, 0x2d, 0x64,
279		0x61, 0x1e, 0xee, 0xb6, 0x9a, 0xcd, 0xc0, 0x55,
280		0x95, 0x7c, 0x13, 0x9e, 0x8b, 0x19, 0x0c, 0x7a,
281		0x06, 0x95, 0x5f, 0x2c, 0x79, 0x7c, 0x27, 0x78,
282		0xde, 0x94, 0x03, 0x96, 0xa5, 0x01, 0xf4, 0x0e,
283		0x91, 0x39, 0x6a, 0xcf, 0x8d, 0x7e, 0x45, 0xeb,
284		0xdb, 0xb5, 0x3b, 0xbf, 0x8c, 0x97, 0x52, 0x30,
285		0xd2, 0xf0, 0xff, 0x91, 0x06, 0xc7, 0x61, 0x19,
286		0xae, 0x49, 0x8e, 0x7f, 0xbc, 0x03, 0xd9, 0x0f,
287		0x8e, 0x4c, 0x51, 0x62, 0x7a, 0xed, 0x5c, 0x8d,
288		0x42, 0x63, 0xd5, 0xd2, 0xb9, 0x78, 0x87, 0x3a,
289		0x0d, 0xe5, 0x96, 0xee, 0x6d, 0xc7, 0xf7, 0xc2,
290		0x9e, 0x37, 0xee, 0xe8, 0xb3, 0x4c, 0x90, 0xdd,
291		0x1c, 0xf6, 0xa9, 0xdd, 0xb2, 0x2b, 0x4c, 0xbd,
292		0x08, 0x6b, 0x14, 0xb3, 0x5d, 0xe9, 0x3d, 0xa2,
293		0xd5, 0xcb, 0x18, 0x06, 0x69, 0x8c, 0xbd, 0x7b,
294		0xbb, 0x67, 0xbf, 0xe3, 0xd3, 0x1f, 0xd2, 0xd1,
295		0xdb, 0xd2, 0xa1, 0xe0, 0x58, 0xa3, 0xeb, 0x99,
296		0xd7, 0xe5, 0x1f, 0x1a, 0x93, 0x8e, 0xed, 0x5e,
297		0x1c, 0x1d, 0xe2, 0x3a, 0x6b, 0x43, 0x45, 0xd3,
298		0x19, 0x14, 0x09, 0xf9, 0x2f, 0x39, 0xb3, 0x67,
299		0x0d, 0x8d, 0xbf, 0xb6, 0x35, 0xd8, 0xe6, 0xa3,
300		0x69, 0x32, 0xd8, 0x10, 0x33, 0xd1, 0x44, 0x8d,
301		0x63, 0xb4, 0x03, 0xdd, 0xf8, 0x8e, 0x12, 0x1b,
302		0x6e, 0x81, 0x9a, 0xc3, 0x81, 0x22, 0x6c, 0x13,
303		0x21, 0xe4, 0xb0, 0x86, 0x44, 0xf6, 0x72, 0x7c,
304		0x36, 0x8c, 0x5a, 0x9f, 0x7a, 0x4b, 0x3e, 0xe2 };
305
306	int ret = 0;
307	u8 buf[sizeof(random)];
308	struct ppno_ws_s ws;
309
310	memset(&ws, 0, sizeof(ws));
311
312	/* initial seed */
313	ret = crypt_s390_ppno(PPNO_SHA512_DRNG_SEED,
314			      &ws, NULL, 0,
315			      seed, sizeof(seed));
316	if (ret < 0) {
317		pr_err("The prng self test seed operation for the "
318		       "SHA-512 mode failed with rc=%d\n", ret);
319		prng_errorflag = PRNG_SELFTEST_FAILED;
320		return -EIO;
321	}
322
323	/* check working states V and C */
324	if (memcmp(ws.V, V0, sizeof(V0)) != 0
325	    || memcmp(ws.C, C0, sizeof(C0)) != 0) {
326		pr_err("The prng self test state test "
327		       "for the SHA-512 mode failed\n");
328		prng_errorflag = PRNG_SELFTEST_FAILED;
329		return -EIO;
330	}
331
332	/* generate random bytes */
333	ret = crypt_s390_ppno(PPNO_SHA512_DRNG_GEN,
334			      &ws, buf, sizeof(buf),
335			      NULL, 0);
336	if (ret < 0) {
337		pr_err("The prng self test generate operation for "
338		       "the SHA-512 mode failed with rc=%d\n", ret);
339		prng_errorflag = PRNG_SELFTEST_FAILED;
340		return -EIO;
341	}
342	ret = crypt_s390_ppno(PPNO_SHA512_DRNG_GEN,
343			      &ws, buf, sizeof(buf),
344			      NULL, 0);
345	if (ret < 0) {
346		pr_err("The prng self test generate operation for "
347		       "the SHA-512 mode failed with rc=%d\n", ret);
348		prng_errorflag = PRNG_SELFTEST_FAILED;
349		return -EIO;
350	}
351
352	/* check against expected data */
353	if (memcmp(buf, random, sizeof(random)) != 0) {
354		pr_err("The prng self test data test "
355		       "for the SHA-512 mode failed\n");
356		prng_errorflag = PRNG_SELFTEST_FAILED;
357		return -EIO;
358	}
359
360	return 0;
361}
362
363
364static int __init prng_sha512_instantiate(void)
365{
366	int ret, datalen;
367	u8 seed[64];
368
369	pr_debug("prng runs in SHA-512 mode "
370		 "with chunksize=%d and reseed_limit=%u\n",
371		 prng_chunk_size, prng_reseed_limit);
372
373	/* memory allocation, prng_data struct init, mutex init */
374	datalen = sizeof(struct prng_data_s) + prng_chunk_size;
375	if (fips_enabled)
376		datalen += prng_chunk_size;
377	prng_data = kzalloc(datalen, GFP_KERNEL);
378	if (!prng_data) {
379		prng_errorflag = PRNG_INSTANTIATE_FAILED;
380		return -ENOMEM;
381	}
382	mutex_init(&prng_data->mutex);
383	prng_data->buf = ((u8 *)prng_data) + sizeof(struct prng_data_s);
384
385	/* selftest */
386	ret = prng_sha512_selftest();
387	if (ret)
388		goto outfree;
389
390	/* generate initial seed bytestring, first 48 bytes of entropy */
391	ret = generate_entropy(seed, 48);
392	if (ret != 48)
393		goto outfree;
394	/* followed by 16 bytes of unique nonce */
395	get_tod_clock_ext(seed + 48);
396
397	/* initial seed of the ppno drng */
398	ret = crypt_s390_ppno(PPNO_SHA512_DRNG_SEED,
399			      &prng_data->ppnows, NULL, 0,
400			      seed, sizeof(seed));
401	if (ret < 0) {
402		prng_errorflag = PRNG_SEED_FAILED;
403		ret = -EIO;
404		goto outfree;
405	}
406
407	/* if fips mode is enabled, generate a first block of random
408	   bytes for the FIPS 140-2 Conditional Self Test */
409	if (fips_enabled) {
410		prng_data->prev = prng_data->buf + prng_chunk_size;
411		ret = crypt_s390_ppno(PPNO_SHA512_DRNG_GEN,
412				      &prng_data->ppnows,
413				      prng_data->prev,
414				      prng_chunk_size,
415				      NULL, 0);
416		if (ret < 0 || ret != prng_chunk_size) {
417			prng_errorflag = PRNG_GEN_FAILED;
418			ret = -EIO;
419			goto outfree;
420		}
421	}
422
423	return 0;
424
425outfree:
426	kfree(prng_data);
427	return ret;
428}
429
430
431static void prng_sha512_deinstantiate(void)
432{
433	pr_debug("The prng module stopped after running in SHA-512 mode\n");
434	kzfree(prng_data);
435}
436
437
438static int prng_sha512_reseed(void)
439{
440	int ret;
441	u8 seed[32];
442
443	/* generate 32 bytes of fresh entropy */
444	ret = generate_entropy(seed, sizeof(seed));
445	if (ret != sizeof(seed))
446		return ret;
447
448	/* do a reseed of the ppno drng with this bytestring */
449	ret = crypt_s390_ppno(PPNO_SHA512_DRNG_SEED,
450			      &prng_data->ppnows, NULL, 0,
451			      seed, sizeof(seed));
452	if (ret) {
453		prng_errorflag = PRNG_RESEED_FAILED;
454		return -EIO;
455	}
456
457	return 0;
458}
459
460
461static int prng_sha512_generate(u8 *buf, size_t nbytes)
462{
463	int ret;
464
465	/* reseed needed ? */
466	if (prng_data->ppnows.reseed_counter > prng_reseed_limit) {
467		ret = prng_sha512_reseed();
468		if (ret)
469			return ret;
470	}
471
472	/* PPNO generate */
473	ret = crypt_s390_ppno(PPNO_SHA512_DRNG_GEN,
474			      &prng_data->ppnows, buf, nbytes,
475			      NULL, 0);
476	if (ret < 0 || ret != nbytes) {
477		prng_errorflag = PRNG_GEN_FAILED;
478		return -EIO;
479	}
480
481	/* FIPS 140-2 Conditional Self Test */
482	if (fips_enabled) {
483		if (!memcmp(prng_data->prev, buf, nbytes)) {
484			prng_errorflag = PRNG_GEN_FAILED;
485			return -EILSEQ;
486		}
487		memcpy(prng_data->prev, buf, nbytes);
488	}
489
490	return ret;
491}
492
493
494/*** file io functions ***/
495
496static int prng_open(struct inode *inode, struct file *file)
497{
498	return nonseekable_open(inode, file);
499}
500
501
502static ssize_t prng_tdes_read(struct file *file, char __user *ubuf,
503			      size_t nbytes, loff_t *ppos)
504{
505	int chunk, n, tmp, ret = 0;
506
507	/* lock prng_data struct */
508	if (mutex_lock_interruptible(&prng_data->mutex))
509		return -ERESTARTSYS;
510
511	while (nbytes) {
512		if (need_resched()) {
513			if (signal_pending(current)) {
514				if (ret == 0)
515					ret = -ERESTARTSYS;
516				break;
517			}
518			/* give mutex free before calling schedule() */
519			mutex_unlock(&prng_data->mutex);
520			schedule();
521			/* occopy mutex again */
522			if (mutex_lock_interruptible(&prng_data->mutex)) {
523				if (ret == 0)
524					ret = -ERESTARTSYS;
525				return ret;
526			}
527		}
528
529		/*
530		 * we lose some random bytes if an attacker issues
531		 * reads < 8 bytes, but we don't care
532		 */
533		chunk = min_t(int, nbytes, prng_chunk_size);
534
535		/* PRNG only likes multiples of 8 bytes */
536		n = (chunk + 7) & -8;
537
538		if (prng_data->prngws.reseed_counter > prng_reseed_limit)
539			prng_tdes_seed(8);
540
541		/* if the CPU supports PRNG stckf is present too */
542		*((unsigned long long *)prng_data->buf) = get_tod_clock_fast();
543
544		/*
545		 * Beside the STCKF the input for the TDES-EDE is the output
546		 * of the last operation. We differ here from X9.17 since we
547		 * only store one timestamp into the buffer. Padding the whole
548		 * buffer with timestamps does not improve security, since
549		 * successive stckf have nearly constant offsets.
550		 * If an attacker knows the first timestamp it would be
551		 * trivial to guess the additional values. One timestamp
552		 * is therefore enough and still guarantees unique input values.
553		 *
554		 * Note: you can still get strict X9.17 conformity by setting
555		 * prng_chunk_size to 8 bytes.
556		*/
557		tmp = crypt_s390_kmc(KMC_PRNG, prng_data->prngws.parm_block,
558				     prng_data->buf, prng_data->buf, n);
559		if (tmp < 0 || tmp != n) {
560			ret = -EIO;
561			break;
562		}
563
564		prng_data->prngws.byte_counter += n;
565		prng_data->prngws.reseed_counter += n;
566
567		if (copy_to_user(ubuf, prng_data->buf, chunk))
568			return -EFAULT;
569
570		nbytes -= chunk;
571		ret += chunk;
572		ubuf += chunk;
573	}
574
575	/* unlock prng_data struct */
576	mutex_unlock(&prng_data->mutex);
577
578	return ret;
579}
580
581
582static ssize_t prng_sha512_read(struct file *file, char __user *ubuf,
583				size_t nbytes, loff_t *ppos)
584{
585	int n, ret = 0;
586	u8 *p;
587
588	/* if errorflag is set do nothing and return 'broken pipe' */
589	if (prng_errorflag)
590		return -EPIPE;
591
592	/* lock prng_data struct */
593	if (mutex_lock_interruptible(&prng_data->mutex))
594		return -ERESTARTSYS;
595
596	while (nbytes) {
597		if (need_resched()) {
598			if (signal_pending(current)) {
599				if (ret == 0)
600					ret = -ERESTARTSYS;
601				break;
602			}
603			/* give mutex free before calling schedule() */
604			mutex_unlock(&prng_data->mutex);
605			schedule();
606			/* occopy mutex again */
607			if (mutex_lock_interruptible(&prng_data->mutex)) {
608				if (ret == 0)
609					ret = -ERESTARTSYS;
610				return ret;
611			}
612		}
613		if (prng_data->rest) {
614			/* push left over random bytes from the previous read */
615			p = prng_data->buf + prng_chunk_size - prng_data->rest;
616			n = (nbytes < prng_data->rest) ?
617				nbytes : prng_data->rest;
618			prng_data->rest -= n;
619		} else {
620			/* generate one chunk of random bytes into read buf */
621			p = prng_data->buf;
622			n = prng_sha512_generate(p, prng_chunk_size);
623			if (n < 0) {
624				ret = n;
625				break;
626			}
627			if (nbytes < prng_chunk_size) {
628				n = nbytes;
629				prng_data->rest = prng_chunk_size - n;
630			} else {
631				n = prng_chunk_size;
632				prng_data->rest = 0;
633			}
634		}
635		if (copy_to_user(ubuf, p, n)) {
636			ret = -EFAULT;
637			break;
638		}
639		ubuf += n;
640		nbytes -= n;
641		ret += n;
642	}
643
644	/* unlock prng_data struct */
645	mutex_unlock(&prng_data->mutex);
646
647	return ret;
648}
649
650
651/*** sysfs stuff ***/
652
653static const struct file_operations prng_sha512_fops = {
654	.owner		= THIS_MODULE,
655	.open		= &prng_open,
656	.release	= NULL,
657	.read		= &prng_sha512_read,
658	.llseek		= noop_llseek,
659};
660static const struct file_operations prng_tdes_fops = {
661	.owner		= THIS_MODULE,
662	.open		= &prng_open,
663	.release	= NULL,
664	.read		= &prng_tdes_read,
665	.llseek		= noop_llseek,
666};
667
668static struct miscdevice prng_sha512_dev = {
669	.name	= "prandom",
670	.minor	= MISC_DYNAMIC_MINOR,
671	.fops	= &prng_sha512_fops,
672};
673static struct miscdevice prng_tdes_dev = {
674	.name	= "prandom",
675	.minor	= MISC_DYNAMIC_MINOR,
676	.fops	= &prng_tdes_fops,
677};
678
679
680/* chunksize attribute (ro) */
681static ssize_t prng_chunksize_show(struct device *dev,
682				   struct device_attribute *attr,
683				   char *buf)
684{
685	return snprintf(buf, PAGE_SIZE, "%u\n", prng_chunk_size);
686}
687static DEVICE_ATTR(chunksize, 0444, prng_chunksize_show, NULL);
688
689/* counter attribute (ro) */
690static ssize_t prng_counter_show(struct device *dev,
691				 struct device_attribute *attr,
692				 char *buf)
693{
694	u64 counter;
695
696	if (mutex_lock_interruptible(&prng_data->mutex))
697		return -ERESTARTSYS;
698	if (prng_mode == PRNG_MODE_SHA512)
699		counter = prng_data->ppnows.stream_bytes;
700	else
701		counter = prng_data->prngws.byte_counter;
702	mutex_unlock(&prng_data->mutex);
703
704	return snprintf(buf, PAGE_SIZE, "%llu\n", counter);
705}
706static DEVICE_ATTR(byte_counter, 0444, prng_counter_show, NULL);
707
708/* errorflag attribute (ro) */
709static ssize_t prng_errorflag_show(struct device *dev,
710				   struct device_attribute *attr,
711				   char *buf)
712{
713	return snprintf(buf, PAGE_SIZE, "%d\n", prng_errorflag);
714}
715static DEVICE_ATTR(errorflag, 0444, prng_errorflag_show, NULL);
716
717/* mode attribute (ro) */
718static ssize_t prng_mode_show(struct device *dev,
719			      struct device_attribute *attr,
720			      char *buf)
721{
722	if (prng_mode == PRNG_MODE_TDES)
723		return snprintf(buf, PAGE_SIZE, "TDES\n");
724	else
725		return snprintf(buf, PAGE_SIZE, "SHA512\n");
726}
727static DEVICE_ATTR(mode, 0444, prng_mode_show, NULL);
728
729/* reseed attribute (w) */
730static ssize_t prng_reseed_store(struct device *dev,
731				 struct device_attribute *attr,
732				 const char *buf, size_t count)
733{
734	if (mutex_lock_interruptible(&prng_data->mutex))
735		return -ERESTARTSYS;
736	prng_sha512_reseed();
737	mutex_unlock(&prng_data->mutex);
738
739	return count;
740}
741static DEVICE_ATTR(reseed, 0200, NULL, prng_reseed_store);
742
743/* reseed limit attribute (rw) */
744static ssize_t prng_reseed_limit_show(struct device *dev,
745				      struct device_attribute *attr,
746				      char *buf)
747{
748	return snprintf(buf, PAGE_SIZE, "%u\n", prng_reseed_limit);
749}
750static ssize_t prng_reseed_limit_store(struct device *dev,
751				       struct device_attribute *attr,
752				       const char *buf, size_t count)
753{
754	unsigned limit;
755
756	if (sscanf(buf, "%u\n", &limit) != 1)
757		return -EINVAL;
758
759	if (prng_mode == PRNG_MODE_SHA512) {
760		if (limit < PRNG_RESEED_LIMIT_SHA512_LOWER)
761			return -EINVAL;
762	} else {
763		if (limit < PRNG_RESEED_LIMIT_TDES_LOWER)
764			return -EINVAL;
765	}
766
767	prng_reseed_limit = limit;
768
769	return count;
770}
771static DEVICE_ATTR(reseed_limit, 0644,
772		   prng_reseed_limit_show, prng_reseed_limit_store);
773
774/* strength attribute (ro) */
775static ssize_t prng_strength_show(struct device *dev,
776				  struct device_attribute *attr,
777				  char *buf)
778{
779	return snprintf(buf, PAGE_SIZE, "256\n");
780}
781static DEVICE_ATTR(strength, 0444, prng_strength_show, NULL);
782
783static struct attribute *prng_sha512_dev_attrs[] = {
784	&dev_attr_errorflag.attr,
785	&dev_attr_chunksize.attr,
786	&dev_attr_byte_counter.attr,
787	&dev_attr_mode.attr,
788	&dev_attr_reseed.attr,
789	&dev_attr_reseed_limit.attr,
790	&dev_attr_strength.attr,
791	NULL
792};
793static struct attribute *prng_tdes_dev_attrs[] = {
794	&dev_attr_chunksize.attr,
795	&dev_attr_byte_counter.attr,
796	&dev_attr_mode.attr,
797	NULL
798};
799
800static struct attribute_group prng_sha512_dev_attr_group = {
801	.attrs = prng_sha512_dev_attrs
802};
803static struct attribute_group prng_tdes_dev_attr_group = {
804	.attrs = prng_tdes_dev_attrs
805};
806
807
808/*** module init and exit ***/
809
810static int __init prng_init(void)
811{
812	int ret;
813
814	/* check if the CPU has a PRNG */
815	if (!crypt_s390_func_available(KMC_PRNG, CRYPT_S390_MSA))
816		return -EOPNOTSUPP;
817
818	/* choose prng mode */
819	if (prng_mode != PRNG_MODE_TDES) {
820		/* check for MSA5 support for PPNO operations */
821		if (!crypt_s390_func_available(PPNO_SHA512_DRNG_GEN,
822					       CRYPT_S390_MSA5)) {
823			if (prng_mode == PRNG_MODE_SHA512) {
824				pr_err("The prng module cannot "
825				       "start in SHA-512 mode\n");
826				return -EOPNOTSUPP;
827			}
828			prng_mode = PRNG_MODE_TDES;
829		} else
830			prng_mode = PRNG_MODE_SHA512;
831	}
832
833	if (prng_mode == PRNG_MODE_SHA512) {
834
835		/* SHA512 mode */
836
837		if (prng_chunk_size < PRNG_CHUNKSIZE_SHA512_MIN
838		    || prng_chunk_size > PRNG_CHUNKSIZE_SHA512_MAX)
839			return -EINVAL;
840		prng_chunk_size = (prng_chunk_size + 0x3f) & ~0x3f;
841
842		if (prng_reseed_limit == 0)
843			prng_reseed_limit = PRNG_RESEED_LIMIT_SHA512;
844		else if (prng_reseed_limit < PRNG_RESEED_LIMIT_SHA512_LOWER)
845			return -EINVAL;
846
847		ret = prng_sha512_instantiate();
848		if (ret)
849			goto out;
850
851		ret = misc_register(&prng_sha512_dev);
852		if (ret) {
853			prng_sha512_deinstantiate();
854			goto out;
855		}
856		ret = sysfs_create_group(&prng_sha512_dev.this_device->kobj,
857					 &prng_sha512_dev_attr_group);
858		if (ret) {
859			misc_deregister(&prng_sha512_dev);
860			prng_sha512_deinstantiate();
861			goto out;
862		}
863
864	} else {
865
866		/* TDES mode */
867
868		if (prng_chunk_size < PRNG_CHUNKSIZE_TDES_MIN
869		    || prng_chunk_size > PRNG_CHUNKSIZE_TDES_MAX)
870			return -EINVAL;
871		prng_chunk_size = (prng_chunk_size + 0x07) & ~0x07;
872
873		if (prng_reseed_limit == 0)
874			prng_reseed_limit = PRNG_RESEED_LIMIT_TDES;
875		else if (prng_reseed_limit < PRNG_RESEED_LIMIT_TDES_LOWER)
876			return -EINVAL;
877
878		ret = prng_tdes_instantiate();
879		if (ret)
880			goto out;
881
882		ret = misc_register(&prng_tdes_dev);
883		if (ret) {
884			prng_tdes_deinstantiate();
885			goto out;
886		}
887		ret = sysfs_create_group(&prng_tdes_dev.this_device->kobj,
888					 &prng_tdes_dev_attr_group);
889		if (ret) {
890			misc_deregister(&prng_tdes_dev);
891			prng_tdes_deinstantiate();
892			goto out;
893		}
894
895	}
896
897out:
898	return ret;
899}
900
901
902static void __exit prng_exit(void)
903{
904	if (prng_mode == PRNG_MODE_SHA512) {
905		sysfs_remove_group(&prng_sha512_dev.this_device->kobj,
906				   &prng_sha512_dev_attr_group);
907		misc_deregister(&prng_sha512_dev);
908		prng_sha512_deinstantiate();
909	} else {
910		sysfs_remove_group(&prng_tdes_dev.this_device->kobj,
911				   &prng_tdes_dev_attr_group);
912		misc_deregister(&prng_tdes_dev);
913		prng_tdes_deinstantiate();
914	}
915}
916
917
918module_init(prng_init);
919module_exit(prng_exit);
920