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