These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / 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         .fops   = &prng_sha512_fops,
673 };
674 static struct miscdevice prng_tdes_dev = {
675         .name   = "prandom",
676         .minor  = MISC_DYNAMIC_MINOR,
677         .fops   = &prng_tdes_fops,
678 };
679
680
681 /* chunksize attribute (ro) */
682 static ssize_t prng_chunksize_show(struct device *dev,
683                                    struct device_attribute *attr,
684                                    char *buf)
685 {
686         return snprintf(buf, PAGE_SIZE, "%u\n", prng_chunk_size);
687 }
688 static DEVICE_ATTR(chunksize, 0444, prng_chunksize_show, NULL);
689
690 /* counter attribute (ro) */
691 static ssize_t prng_counter_show(struct device *dev,
692                                  struct device_attribute *attr,
693                                  char *buf)
694 {
695         u64 counter;
696
697         if (mutex_lock_interruptible(&prng_data->mutex))
698                 return -ERESTARTSYS;
699         if (prng_mode == PRNG_MODE_SHA512)
700                 counter = prng_data->ppnows.stream_bytes;
701         else
702                 counter = prng_data->prngws.byte_counter;
703         mutex_unlock(&prng_data->mutex);
704
705         return snprintf(buf, PAGE_SIZE, "%llu\n", counter);
706 }
707 static DEVICE_ATTR(byte_counter, 0444, prng_counter_show, NULL);
708
709 /* errorflag attribute (ro) */
710 static ssize_t prng_errorflag_show(struct device *dev,
711                                    struct device_attribute *attr,
712                                    char *buf)
713 {
714         return snprintf(buf, PAGE_SIZE, "%d\n", prng_errorflag);
715 }
716 static DEVICE_ATTR(errorflag, 0444, prng_errorflag_show, NULL);
717
718 /* mode attribute (ro) */
719 static ssize_t prng_mode_show(struct device *dev,
720                               struct device_attribute *attr,
721                               char *buf)
722 {
723         if (prng_mode == PRNG_MODE_TDES)
724                 return snprintf(buf, PAGE_SIZE, "TDES\n");
725         else
726                 return snprintf(buf, PAGE_SIZE, "SHA512\n");
727 }
728 static DEVICE_ATTR(mode, 0444, prng_mode_show, NULL);
729
730 /* reseed attribute (w) */
731 static ssize_t prng_reseed_store(struct device *dev,
732                                  struct device_attribute *attr,
733                                  const char *buf, size_t count)
734 {
735         if (mutex_lock_interruptible(&prng_data->mutex))
736                 return -ERESTARTSYS;
737         prng_sha512_reseed();
738         mutex_unlock(&prng_data->mutex);
739
740         return count;
741 }
742 static DEVICE_ATTR(reseed, 0200, NULL, prng_reseed_store);
743
744 /* reseed limit attribute (rw) */
745 static ssize_t prng_reseed_limit_show(struct device *dev,
746                                       struct device_attribute *attr,
747                                       char *buf)
748 {
749         return snprintf(buf, PAGE_SIZE, "%u\n", prng_reseed_limit);
750 }
751 static ssize_t prng_reseed_limit_store(struct device *dev,
752                                        struct device_attribute *attr,
753                                        const char *buf, size_t count)
754 {
755         unsigned limit;
756
757         if (sscanf(buf, "%u\n", &limit) != 1)
758                 return -EINVAL;
759
760         if (prng_mode == PRNG_MODE_SHA512) {
761                 if (limit < PRNG_RESEED_LIMIT_SHA512_LOWER)
762                         return -EINVAL;
763         } else {
764                 if (limit < PRNG_RESEED_LIMIT_TDES_LOWER)
765                         return -EINVAL;
766         }
767
768         prng_reseed_limit = limit;
769
770         return count;
771 }
772 static DEVICE_ATTR(reseed_limit, 0644,
773                    prng_reseed_limit_show, prng_reseed_limit_store);
774
775 /* strength attribute (ro) */
776 static ssize_t prng_strength_show(struct device *dev,
777                                   struct device_attribute *attr,
778                                   char *buf)
779 {
780         return snprintf(buf, PAGE_SIZE, "256\n");
781 }
782 static DEVICE_ATTR(strength, 0444, prng_strength_show, NULL);
783
784 static struct attribute *prng_sha512_dev_attrs[] = {
785         &dev_attr_errorflag.attr,
786         &dev_attr_chunksize.attr,
787         &dev_attr_byte_counter.attr,
788         &dev_attr_mode.attr,
789         &dev_attr_reseed.attr,
790         &dev_attr_reseed_limit.attr,
791         &dev_attr_strength.attr,
792         NULL
793 };
794 static struct attribute *prng_tdes_dev_attrs[] = {
795         &dev_attr_chunksize.attr,
796         &dev_attr_byte_counter.attr,
797         &dev_attr_mode.attr,
798         NULL
799 };
800
801 static struct attribute_group prng_sha512_dev_attr_group = {
802         .attrs = prng_sha512_dev_attrs
803 };
804 static struct attribute_group prng_tdes_dev_attr_group = {
805         .attrs = prng_tdes_dev_attrs
806 };
807
808
809 /*** module init and exit ***/
810
811 static int __init prng_init(void)
812 {
813         int ret;
814
815         /* check if the CPU has a PRNG */
816         if (!crypt_s390_func_available(KMC_PRNG, CRYPT_S390_MSA))
817                 return -EOPNOTSUPP;
818
819         /* choose prng mode */
820         if (prng_mode != PRNG_MODE_TDES) {
821                 /* check for MSA5 support for PPNO operations */
822                 if (!crypt_s390_func_available(PPNO_SHA512_DRNG_GEN,
823                                                CRYPT_S390_MSA5)) {
824                         if (prng_mode == PRNG_MODE_SHA512) {
825                                 pr_err("The prng module cannot "
826                                        "start in SHA-512 mode\n");
827                                 return -EOPNOTSUPP;
828                         }
829                         prng_mode = PRNG_MODE_TDES;
830                 } else
831                         prng_mode = PRNG_MODE_SHA512;
832         }
833
834         if (prng_mode == PRNG_MODE_SHA512) {
835
836                 /* SHA512 mode */
837
838                 if (prng_chunk_size < PRNG_CHUNKSIZE_SHA512_MIN
839                     || prng_chunk_size > PRNG_CHUNKSIZE_SHA512_MAX)
840                         return -EINVAL;
841                 prng_chunk_size = (prng_chunk_size + 0x3f) & ~0x3f;
842
843                 if (prng_reseed_limit == 0)
844                         prng_reseed_limit = PRNG_RESEED_LIMIT_SHA512;
845                 else if (prng_reseed_limit < PRNG_RESEED_LIMIT_SHA512_LOWER)
846                         return -EINVAL;
847
848                 ret = prng_sha512_instantiate();
849                 if (ret)
850                         goto out;
851
852                 ret = misc_register(&prng_sha512_dev);
853                 if (ret) {
854                         prng_sha512_deinstantiate();
855                         goto out;
856                 }
857                 ret = sysfs_create_group(&prng_sha512_dev.this_device->kobj,
858                                          &prng_sha512_dev_attr_group);
859                 if (ret) {
860                         misc_deregister(&prng_sha512_dev);
861                         prng_sha512_deinstantiate();
862                         goto out;
863                 }
864
865         } else {
866
867                 /* TDES mode */
868
869                 if (prng_chunk_size < PRNG_CHUNKSIZE_TDES_MIN
870                     || prng_chunk_size > PRNG_CHUNKSIZE_TDES_MAX)
871                         return -EINVAL;
872                 prng_chunk_size = (prng_chunk_size + 0x07) & ~0x07;
873
874                 if (prng_reseed_limit == 0)
875                         prng_reseed_limit = PRNG_RESEED_LIMIT_TDES;
876                 else if (prng_reseed_limit < PRNG_RESEED_LIMIT_TDES_LOWER)
877                         return -EINVAL;
878
879                 ret = prng_tdes_instantiate();
880                 if (ret)
881                         goto out;
882
883                 ret = misc_register(&prng_tdes_dev);
884                 if (ret) {
885                         prng_tdes_deinstantiate();
886                         goto out;
887                 }
888                 ret = sysfs_create_group(&prng_tdes_dev.this_device->kobj,
889                                          &prng_tdes_dev_attr_group);
890                 if (ret) {
891                         misc_deregister(&prng_tdes_dev);
892                         prng_tdes_deinstantiate();
893                         goto out;
894                 }
895
896         }
897
898 out:
899         return ret;
900 }
901
902
903 static void __exit prng_exit(void)
904 {
905         if (prng_mode == PRNG_MODE_SHA512) {
906                 sysfs_remove_group(&prng_sha512_dev.this_device->kobj,
907                                    &prng_sha512_dev_attr_group);
908                 misc_deregister(&prng_sha512_dev);
909                 prng_sha512_deinstantiate();
910         } else {
911                 sysfs_remove_group(&prng_tdes_dev.this_device->kobj,
912                                    &prng_tdes_dev_attr_group);
913                 misc_deregister(&prng_tdes_dev);
914                 prng_tdes_deinstantiate();
915         }
916 }
917
918 module_cpu_feature_match(MSA, prng_init);
919 module_exit(prng_exit);