Blame view

crypto/drbg.c 59.6 KB
541af946f   Stephan Mueller   crypto: drbg - SP...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  /*
   * DRBG: Deterministic Random Bits Generator
   *       Based on NIST Recommended DRBG from NIST SP800-90A with the following
   *       properties:
   *		* CTR DRBG with DF with AES-128, AES-192, AES-256 cores
   *		* Hash DRBG with DF with SHA-1, SHA-256, SHA-384, SHA-512 cores
   *		* HMAC DRBG with DF with SHA-1, SHA-256, SHA-384, SHA-512 cores
   *		* with and without prediction resistance
   *
   * Copyright Stephan Mueller <smueller@chronox.de>, 2014
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice, and the entire permission notice in its entirety,
   *    including the disclaimer of warranties.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the distribution.
   * 3. The name of the author may not be used to endorse or promote
   *    products derived from this software without specific prior
   *    written permission.
   *
   * ALTERNATIVELY, this product may be distributed under the terms of
   * the GNU General Public License, in which case the provisions of the GPL are
   * required INSTEAD OF the above restrictions.  (This clause is
   * necessary due to a potential bad interaction between the GPL and
   * the restrictions contained in a BSD-style copyright.)
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
   * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
   * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
   * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
   * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
   * DAMAGE.
   *
   * DRBG Usage
   * ==========
   * The SP 800-90A DRBG allows the user to specify a personalization string
   * for initialization as well as an additional information string for each
   * random number request. The following code fragments show how a caller
   * uses the kernel crypto API to use the full functionality of the DRBG.
   *
   * Usage without any additional data
   * ---------------------------------
   * struct crypto_rng *drng;
   * int err;
   * char data[DATALEN];
   *
   * drng = crypto_alloc_rng(drng_name, 0, 0);
   * err = crypto_rng_get_bytes(drng, &data, DATALEN);
   * crypto_free_rng(drng);
   *
   *
   * Usage with personalization string during initialization
   * -------------------------------------------------------
   * struct crypto_rng *drng;
   * int err;
   * char data[DATALEN];
   * struct drbg_string pers;
   * char personalization[11] = "some-string";
   *
   * drbg_string_fill(&pers, personalization, strlen(personalization));
   * drng = crypto_alloc_rng(drng_name, 0, 0);
   * // The reset completely re-initializes the DRBG with the provided
   * // personalization string
   * err = crypto_rng_reset(drng, &personalization, strlen(personalization));
   * err = crypto_rng_get_bytes(drng, &data, DATALEN);
   * crypto_free_rng(drng);
   *
   *
   * Usage with additional information string during random number request
   * ---------------------------------------------------------------------
   * struct crypto_rng *drng;
   * int err;
   * char data[DATALEN];
   * char addtl_string[11] = "some-string";
   * string drbg_string addtl;
   *
   * drbg_string_fill(&addtl, addtl_string, strlen(addtl_string));
   * drng = crypto_alloc_rng(drng_name, 0, 0);
   * // The following call is a wrapper to crypto_rng_get_bytes() and returns
   * // the same error codes.
   * err = crypto_drbg_get_bytes_addtl(drng, &data, DATALEN, &addtl);
   * crypto_free_rng(drng);
   *
   *
   * Usage with personalization and additional information strings
   * -------------------------------------------------------------
   * Just mix both scenarios above.
   */
  
  #include <crypto/drbg.h>
0eb76ba29   Ard Biesheuvel   crypto: remove ci...
101
  #include <crypto/internal/cipher.h>
57225e679   Stephan Mueller   crypto: drbg - Us...
102
  #include <linux/kernel.h>
541af946f   Stephan Mueller   crypto: drbg - SP...
103

541af946f   Stephan Mueller   crypto: drbg - SP...
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  /***************************************************************
   * Backend cipher definitions available to DRBG
   ***************************************************************/
  
  /*
   * The order of the DRBG definitions here matter: every DRBG is registered
   * as stdrng. Each DRBG receives an increasing cra_priority values the later
   * they are defined in this array (see drbg_fill_array).
   *
   * HMAC DRBGs are favored over Hash DRBGs over CTR DRBGs, and
   * the SHA256 / AES 256 over other ciphers. Thus, the favored
   * DRBGs are the latest entries in this array.
   */
  static const struct drbg_core drbg_cores[] = {
  #ifdef CONFIG_CRYPTO_DRBG_CTR
  	{
  		.flags = DRBG_CTR | DRBG_STRENGTH128,
  		.statelen = 32, /* 256 bits as defined in 10.2.1 */
541af946f   Stephan Mueller   crypto: drbg - SP...
122
123
  		.blocklen_bytes = 16,
  		.cra_name = "ctr_aes128",
04bcbfcf7   Stephan Mueller   crypto: drbg - us...
124
  		.backend_cra_name = "aes",
541af946f   Stephan Mueller   crypto: drbg - SP...
125
126
127
  	}, {
  		.flags = DRBG_CTR | DRBG_STRENGTH192,
  		.statelen = 40, /* 320 bits as defined in 10.2.1 */
541af946f   Stephan Mueller   crypto: drbg - SP...
128
129
  		.blocklen_bytes = 16,
  		.cra_name = "ctr_aes192",
04bcbfcf7   Stephan Mueller   crypto: drbg - us...
130
  		.backend_cra_name = "aes",
541af946f   Stephan Mueller   crypto: drbg - SP...
131
132
133
  	}, {
  		.flags = DRBG_CTR | DRBG_STRENGTH256,
  		.statelen = 48, /* 384 bits as defined in 10.2.1 */
541af946f   Stephan Mueller   crypto: drbg - SP...
134
135
  		.blocklen_bytes = 16,
  		.cra_name = "ctr_aes256",
04bcbfcf7   Stephan Mueller   crypto: drbg - us...
136
  		.backend_cra_name = "aes",
541af946f   Stephan Mueller   crypto: drbg - SP...
137
138
139
140
141
142
  	},
  #endif /* CONFIG_CRYPTO_DRBG_CTR */
  #ifdef CONFIG_CRYPTO_DRBG_HASH
  	{
  		.flags = DRBG_HASH | DRBG_STRENGTH128,
  		.statelen = 55, /* 440 bits */
541af946f   Stephan Mueller   crypto: drbg - SP...
143
144
145
146
147
148
  		.blocklen_bytes = 20,
  		.cra_name = "sha1",
  		.backend_cra_name = "sha1",
  	}, {
  		.flags = DRBG_HASH | DRBG_STRENGTH256,
  		.statelen = 111, /* 888 bits */
541af946f   Stephan Mueller   crypto: drbg - SP...
149
150
151
152
153
154
  		.blocklen_bytes = 48,
  		.cra_name = "sha384",
  		.backend_cra_name = "sha384",
  	}, {
  		.flags = DRBG_HASH | DRBG_STRENGTH256,
  		.statelen = 111, /* 888 bits */
541af946f   Stephan Mueller   crypto: drbg - SP...
155
156
157
158
159
160
  		.blocklen_bytes = 64,
  		.cra_name = "sha512",
  		.backend_cra_name = "sha512",
  	}, {
  		.flags = DRBG_HASH | DRBG_STRENGTH256,
  		.statelen = 55, /* 440 bits */
541af946f   Stephan Mueller   crypto: drbg - SP...
161
162
163
164
165
166
167
  		.blocklen_bytes = 32,
  		.cra_name = "sha256",
  		.backend_cra_name = "sha256",
  	},
  #endif /* CONFIG_CRYPTO_DRBG_HASH */
  #ifdef CONFIG_CRYPTO_DRBG_HMAC
  	{
5b635e280   Stephan Mueller   crypto: drbg - HM...
168
  		.flags = DRBG_HMAC | DRBG_STRENGTH128,
541af946f   Stephan Mueller   crypto: drbg - SP...
169
  		.statelen = 20, /* block length of cipher */
541af946f   Stephan Mueller   crypto: drbg - SP...
170
171
172
173
174
175
  		.blocklen_bytes = 20,
  		.cra_name = "hmac_sha1",
  		.backend_cra_name = "hmac(sha1)",
  	}, {
  		.flags = DRBG_HMAC | DRBG_STRENGTH256,
  		.statelen = 48, /* block length of cipher */
541af946f   Stephan Mueller   crypto: drbg - SP...
176
177
178
179
180
  		.blocklen_bytes = 48,
  		.cra_name = "hmac_sha384",
  		.backend_cra_name = "hmac(sha384)",
  	}, {
  		.flags = DRBG_HMAC | DRBG_STRENGTH256,
541af946f   Stephan Mueller   crypto: drbg - SP...
181
  		.statelen = 32, /* block length of cipher */
541af946f   Stephan Mueller   crypto: drbg - SP...
182
183
184
  		.blocklen_bytes = 32,
  		.cra_name = "hmac_sha256",
  		.backend_cra_name = "hmac(sha256)",
9b7b94683   Stephan Müller   crypto: DRBG - sw...
185
186
187
188
189
190
  	}, {
  		.flags = DRBG_HMAC | DRBG_STRENGTH256,
  		.statelen = 64, /* block length of cipher */
  		.blocklen_bytes = 64,
  		.cra_name = "hmac_sha512",
  		.backend_cra_name = "hmac(sha512)",
541af946f   Stephan Mueller   crypto: drbg - SP...
191
192
193
  	},
  #endif /* CONFIG_CRYPTO_DRBG_HMAC */
  };
57225e679   Stephan Mueller   crypto: drbg - Us...
194
  static int drbg_uninstantiate(struct drbg_state *drbg);
541af946f   Stephan Mueller   crypto: drbg - SP...
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
  /******************************************************************
   * Generic helper functions
   ******************************************************************/
  
  /*
   * Return strength of DRBG according to SP800-90A section 8.4
   *
   * @flags DRBG flags reference
   *
   * Return: normalized strength in *bytes* value or 32 as default
   *	   to counter programming errors
   */
  static inline unsigned short drbg_sec_strength(drbg_flag_t flags)
  {
  	switch (flags & DRBG_STRENGTH_MASK) {
  	case DRBG_STRENGTH128:
  		return 16;
  	case DRBG_STRENGTH192:
  		return 24;
  	case DRBG_STRENGTH256:
  		return 32;
  	default:
  		return 32;
  	}
  }
  
  /*
db07cd26a   Stephan Mueller   crypto: drbg - ad...
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
   * FIPS 140-2 continuous self test for the noise source
   * The test is performed on the noise source input data. Thus, the function
   * implicitly knows the size of the buffer to be equal to the security
   * strength.
   *
   * Note, this function disregards the nonce trailing the entropy data during
   * initial seeding.
   *
   * drbg->drbg_mutex must have been taken.
   *
   * @drbg DRBG handle
   * @entropy buffer of seed data to be checked
   *
   * return:
   *	0 on success
   *	-EAGAIN on when the CTRNG is not yet primed
   *	< 0 on error
   */
  static int drbg_fips_continuous_test(struct drbg_state *drbg,
  				     const unsigned char *entropy)
  {
  	unsigned short entropylen = drbg_sec_strength(drbg->core->flags);
  	int ret = 0;
  
  	if (!IS_ENABLED(CONFIG_CRYPTO_FIPS))
  		return 0;
  
  	/* skip test if we test the overall system */
  	if (list_empty(&drbg->test_data.list))
  		return 0;
  	/* only perform test in FIPS mode */
  	if (!fips_enabled)
  		return 0;
  
  	if (!drbg->fips_primed) {
  		/* Priming of FIPS test */
  		memcpy(drbg->prev, entropy, entropylen);
  		drbg->fips_primed = true;
  		/* priming: another round is needed */
  		return -EAGAIN;
  	}
  	ret = memcmp(drbg->prev, entropy, entropylen);
  	if (!ret)
  		panic("DRBG continuous self test failed
  ");
  	memcpy(drbg->prev, entropy, entropylen);
  
  	/* the test shall pass when the two values are not equal */
  	return 0;
  }
  
  /*
541af946f   Stephan Mueller   crypto: drbg - SP...
274
275
276
   * Convert an integer into a byte representation of this integer.
   * The byte representation is big-endian
   *
541af946f   Stephan Mueller   crypto: drbg - SP...
277
   * @val value to be converted
72f3e00dd   Stephan Mueller   crypto: drbg - re...
278
279
   * @buf buffer holding the converted integer -- caller must ensure that
   *      buffer size is at least 32 bit
541af946f   Stephan Mueller   crypto: drbg - SP...
280
281
   */
  #if (defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_CTR))
72f3e00dd   Stephan Mueller   crypto: drbg - re...
282
  static inline void drbg_cpu_to_be32(__u32 val, unsigned char *buf)
541af946f   Stephan Mueller   crypto: drbg - SP...
283
  {
72f3e00dd   Stephan Mueller   crypto: drbg - re...
284
  	struct s {
7c8ae03f4   Stephan Mueller   crypto: drbg - fi...
285
  		__be32 conv;
72f3e00dd   Stephan Mueller   crypto: drbg - re...
286
287
  	};
  	struct s *conversion = (struct s *) buf;
541af946f   Stephan Mueller   crypto: drbg - SP...
288

72f3e00dd   Stephan Mueller   crypto: drbg - re...
289
  	conversion->conv = cpu_to_be32(val);
541af946f   Stephan Mueller   crypto: drbg - SP...
290
  }
541af946f   Stephan Mueller   crypto: drbg - SP...
291
292
293
294
295
296
297
  #endif /* defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_CTR) */
  
  /******************************************************************
   * CTR DRBG callback functions
   ******************************************************************/
  
  #ifdef CONFIG_CRYPTO_DRBG_CTR
e25e47ec3   Stephan Mueller   crypto: drbg - cl...
298
  #define CRYPTO_DRBG_CTR_STRING "CTR "
0653a7cf6   Stephan Mueller   crypto: drbg - us...
299
300
301
302
303
304
  MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes256");
  MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes256");
  MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes192");
  MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes192");
  MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes128");
  MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes128");
62b62b6e5   Stephan Mueller   crypto: drbg - ad...
305

ed494d4fa   Stephan Mueller   crypto: drbg - re...
306
307
308
309
  static void drbg_kcapi_symsetkey(struct drbg_state *drbg,
  				 const unsigned char *key);
  static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,
  			  const struct drbg_string *in);
541af946f   Stephan Mueller   crypto: drbg - SP...
310
311
  static int drbg_init_sym_kernel(struct drbg_state *drbg);
  static int drbg_fini_sym_kernel(struct drbg_state *drbg);
a07203fbf   Stephan Mueller   crypto: drbg - us...
312
313
314
  static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
  			      u8 *inbuf, u32 inbuflen,
  			      u8 *outbuf, u32 outlen);
43490e804   Stephan Müller   crypto: drbg - in...
315
  #define DRBG_OUTSCRATCHLEN 256
541af946f   Stephan Mueller   crypto: drbg - SP...
316
317
318
319
  
  /* BCC function for CTR DRBG as defined in 10.4.3 */
  static int drbg_ctr_bcc(struct drbg_state *drbg,
  			unsigned char *out, const unsigned char *key,
8c9871660   Stephan Mueller   crypto: drbg - us...
320
  			struct list_head *in)
541af946f   Stephan Mueller   crypto: drbg - SP...
321
  {
8c9871660   Stephan Mueller   crypto: drbg - us...
322
323
  	int ret = 0;
  	struct drbg_string *curr = NULL;
541af946f   Stephan Mueller   crypto: drbg - SP...
324
  	struct drbg_string data;
8c9871660   Stephan Mueller   crypto: drbg - us...
325
  	short cnt = 0;
541af946f   Stephan Mueller   crypto: drbg - SP...
326
327
  
  	drbg_string_fill(&data, out, drbg_blocklen(drbg));
541af946f   Stephan Mueller   crypto: drbg - SP...
328
  	/* 10.4.3 step 2 / 4 */
ed494d4fa   Stephan Mueller   crypto: drbg - re...
329
  	drbg_kcapi_symsetkey(drbg, key);
8c9871660   Stephan Mueller   crypto: drbg - us...
330
331
332
  	list_for_each_entry(curr, in, list) {
  		const unsigned char *pos = curr->buf;
  		size_t len = curr->len;
541af946f   Stephan Mueller   crypto: drbg - SP...
333
  		/* 10.4.3 step 4.1 */
8c9871660   Stephan Mueller   crypto: drbg - us...
334
335
336
337
  		while (len) {
  			/* 10.4.3 step 4.2 */
  			if (drbg_blocklen(drbg) == cnt) {
  				cnt = 0;
ed494d4fa   Stephan Mueller   crypto: drbg - re...
338
  				ret = drbg_kcapi_sym(drbg, out, &data);
8c9871660   Stephan Mueller   crypto: drbg - us...
339
340
  				if (ret)
  					return ret;
541af946f   Stephan Mueller   crypto: drbg - SP...
341
  			}
8c9871660   Stephan Mueller   crypto: drbg - us...
342
343
344
345
  			out[cnt] ^= *pos;
  			pos++;
  			cnt++;
  			len--;
541af946f   Stephan Mueller   crypto: drbg - SP...
346
  		}
541af946f   Stephan Mueller   crypto: drbg - SP...
347
  	}
8c9871660   Stephan Mueller   crypto: drbg - us...
348
349
  	/* 10.4.3 step 4.2 for last block */
  	if (cnt)
ed494d4fa   Stephan Mueller   crypto: drbg - re...
350
  		ret = drbg_kcapi_sym(drbg, out, &data);
8c9871660   Stephan Mueller   crypto: drbg - us...
351
352
  
  	return ret;
541af946f   Stephan Mueller   crypto: drbg - SP...
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
  }
  
  /*
   * scratchpad usage: drbg_ctr_update is interlinked with drbg_ctr_df
   * (and drbg_ctr_bcc, but this function does not need any temporary buffers),
   * the scratchpad is used as follows:
   * drbg_ctr_update:
   *	temp
   *		start: drbg->scratchpad
   *		length: drbg_statelen(drbg) + drbg_blocklen(drbg)
   *			note: the cipher writing into this variable works
   *			blocklen-wise. Now, when the statelen is not a multiple
   *			of blocklen, the generateion loop below "spills over"
   *			by at most blocklen. Thus, we need to give sufficient
   *			memory.
   *	df_data
   *		start: drbg->scratchpad +
   *				drbg_statelen(drbg) + drbg_blocklen(drbg)
   *		length: drbg_statelen(drbg)
   *
   * drbg_ctr_df:
   *	pad
   *		start: df_data + drbg_statelen(drbg)
   *		length: drbg_blocklen(drbg)
   *	iv
   *		start: pad + drbg_blocklen(drbg)
   *		length: drbg_blocklen(drbg)
   *	temp
   *		start: iv + drbg_blocklen(drbg)
8fecaad77   Stephan Mueller   crypto: drbg - fi...
382
383
384
385
386
387
388
389
390
391
   *		length: drbg_satelen(drbg) + drbg_blocklen(drbg)
   *			note: temp is the buffer that the BCC function operates
   *			on. BCC operates blockwise. drbg_statelen(drbg)
   *			is sufficient when the DRBG state length is a multiple
   *			of the block size. For AES192 (and maybe other ciphers)
   *			this is not correct and the length for temp is
   *			insufficient (yes, that also means for such ciphers,
   *			the final output of all BCC rounds are truncated).
   *			Therefore, add drbg_blocklen(drbg) to cover all
   *			possibilities.
541af946f   Stephan Mueller   crypto: drbg - SP...
392
393
394
395
396
   */
  
  /* Derivation Function for CTR DRBG as defined in 10.4.2 */
  static int drbg_ctr_df(struct drbg_state *drbg,
  		       unsigned char *df_data, size_t bytes_to_return,
8c9871660   Stephan Mueller   crypto: drbg - us...
397
  		       struct list_head *seedlist)
541af946f   Stephan Mueller   crypto: drbg - SP...
398
399
400
401
402
  {
  	int ret = -EFAULT;
  	unsigned char L_N[8];
  	/* S3 is input */
  	struct drbg_string S1, S2, S4, cipherin;
8c9871660   Stephan Mueller   crypto: drbg - us...
403
  	LIST_HEAD(bcc_list);
541af946f   Stephan Mueller   crypto: drbg - SP...
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
  	unsigned char *pad = df_data + drbg_statelen(drbg);
  	unsigned char *iv = pad + drbg_blocklen(drbg);
  	unsigned char *temp = iv + drbg_blocklen(drbg);
  	size_t padlen = 0;
  	unsigned int templen = 0;
  	/* 10.4.2 step 7 */
  	unsigned int i = 0;
  	/* 10.4.2 step 8 */
  	const unsigned char *K = (unsigned char *)
  			   "\x00\x01\x02\x03\x04\x05\x06\x07"
  			   "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
  			   "\x10\x11\x12\x13\x14\x15\x16\x17"
  			   "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f";
  	unsigned char *X;
  	size_t generated_len = 0;
  	size_t inputlen = 0;
8c9871660   Stephan Mueller   crypto: drbg - us...
420
  	struct drbg_string *seed = NULL;
541af946f   Stephan Mueller   crypto: drbg - SP...
421
422
423
  
  	memset(pad, 0, drbg_blocklen(drbg));
  	memset(iv, 0, drbg_blocklen(drbg));
541af946f   Stephan Mueller   crypto: drbg - SP...
424
425
426
427
428
429
430
431
  
  	/* 10.4.2 step 1 is implicit as we work byte-wise */
  
  	/* 10.4.2 step 2 */
  	if ((512/8) < bytes_to_return)
  		return -EINVAL;
  
  	/* 10.4.2 step 2 -- calculate the entire length of all input data */
8c9871660   Stephan Mueller   crypto: drbg - us...
432
433
  	list_for_each_entry(seed, seedlist, list)
  		inputlen += seed->len;
72f3e00dd   Stephan Mueller   crypto: drbg - re...
434
  	drbg_cpu_to_be32(inputlen, &L_N[0]);
541af946f   Stephan Mueller   crypto: drbg - SP...
435
436
  
  	/* 10.4.2 step 3 */
72f3e00dd   Stephan Mueller   crypto: drbg - re...
437
  	drbg_cpu_to_be32(bytes_to_return, &L_N[4]);
541af946f   Stephan Mueller   crypto: drbg - SP...
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
  
  	/* 10.4.2 step 5: length is L_N, input_string, one byte, padding */
  	padlen = (inputlen + sizeof(L_N) + 1) % (drbg_blocklen(drbg));
  	/* wrap the padlen appropriately */
  	if (padlen)
  		padlen = drbg_blocklen(drbg) - padlen;
  	/*
  	 * pad / padlen contains the 0x80 byte and the following zero bytes.
  	 * As the calculated padlen value only covers the number of zero
  	 * bytes, this value has to be incremented by one for the 0x80 byte.
  	 */
  	padlen++;
  	pad[0] = 0x80;
  
  	/* 10.4.2 step 4 -- first fill the linked list and then order it */
  	drbg_string_fill(&S1, iv, drbg_blocklen(drbg));
8c9871660   Stephan Mueller   crypto: drbg - us...
454
  	list_add_tail(&S1.list, &bcc_list);
541af946f   Stephan Mueller   crypto: drbg - SP...
455
  	drbg_string_fill(&S2, L_N, sizeof(L_N));
8c9871660   Stephan Mueller   crypto: drbg - us...
456
457
  	list_add_tail(&S2.list, &bcc_list);
  	list_splice_tail(seedlist, &bcc_list);
541af946f   Stephan Mueller   crypto: drbg - SP...
458
  	drbg_string_fill(&S4, pad, padlen);
8c9871660   Stephan Mueller   crypto: drbg - us...
459
  	list_add_tail(&S4.list, &bcc_list);
541af946f   Stephan Mueller   crypto: drbg - SP...
460
461
462
463
464
465
466
467
  
  	/* 10.4.2 step 9 */
  	while (templen < (drbg_keylen(drbg) + (drbg_blocklen(drbg)))) {
  		/*
  		 * 10.4.2 step 9.1 - the padding is implicit as the buffer
  		 * holds zeros after allocation -- even the increment of i
  		 * is irrelevant as the increment remains within length of i
  		 */
72f3e00dd   Stephan Mueller   crypto: drbg - re...
468
  		drbg_cpu_to_be32(i, iv);
541af946f   Stephan Mueller   crypto: drbg - SP...
469
  		/* 10.4.2 step 9.2 -- BCC and concatenation with temp */
8c9871660   Stephan Mueller   crypto: drbg - us...
470
  		ret = drbg_ctr_bcc(drbg, temp + templen, K, &bcc_list);
541af946f   Stephan Mueller   crypto: drbg - SP...
471
472
473
474
475
476
477
478
479
480
481
482
483
484
  		if (ret)
  			goto out;
  		/* 10.4.2 step 9.3 */
  		i++;
  		templen += drbg_blocklen(drbg);
  	}
  
  	/* 10.4.2 step 11 */
  	X = temp + (drbg_keylen(drbg));
  	drbg_string_fill(&cipherin, X, drbg_blocklen(drbg));
  
  	/* 10.4.2 step 12: overwriting of outval is implemented in next step */
  
  	/* 10.4.2 step 13 */
ed494d4fa   Stephan Mueller   crypto: drbg - re...
485
  	drbg_kcapi_symsetkey(drbg, temp);
541af946f   Stephan Mueller   crypto: drbg - SP...
486
487
488
489
490
491
492
  	while (generated_len < bytes_to_return) {
  		short blocklen = 0;
  		/*
  		 * 10.4.2 step 13.1: the truncation of the key length is
  		 * implicit as the key is only drbg_blocklen in size based on
  		 * the implementation of the cipher function callback
  		 */
ed494d4fa   Stephan Mueller   crypto: drbg - re...
493
  		ret = drbg_kcapi_sym(drbg, X, &cipherin);
541af946f   Stephan Mueller   crypto: drbg - SP...
494
495
496
497
498
499
500
501
502
503
504
505
506
507
  		if (ret)
  			goto out;
  		blocklen = (drbg_blocklen(drbg) <
  				(bytes_to_return - generated_len)) ?
  			    drbg_blocklen(drbg) :
  				(bytes_to_return - generated_len);
  		/* 10.4.2 step 13.2 and 14 */
  		memcpy(df_data + generated_len, X, blocklen);
  		generated_len += blocklen;
  	}
  
  	ret = 0;
  
  out:
1471f09f9   Herbert Xu   Revert "crypto: d...
508
  	memset(iv, 0, drbg_blocklen(drbg));
8e0498d99   Stephan Mueller   cryoto: drbg - cl...
509
  	memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg));
1471f09f9   Herbert Xu   Revert "crypto: d...
510
  	memset(pad, 0, drbg_blocklen(drbg));
541af946f   Stephan Mueller   crypto: drbg - SP...
511
512
  	return ret;
  }
72e7c25aa   Stephan Mueller   crypto: drbg - Ca...
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
  /*
   * update function of CTR DRBG as defined in 10.2.1.2
   *
   * The reseed variable has an enhanced meaning compared to the update
   * functions of the other DRBGs as follows:
   * 0 => initial seed from initialization
   * 1 => reseed via drbg_seed
   * 2 => first invocation from drbg_ctr_update when addtl is present. In
   *      this case, the df_data scratchpad is not deleted so that it is
   *      available for another calls to prevent calling the DF function
   *      again.
   * 3 => second invocation from drbg_ctr_update. When the update function
   *      was called with addtl, the df_data memory already contains the
   *      DFed addtl information and we do not need to call DF again.
   */
8c9871660   Stephan Mueller   crypto: drbg - us...
528
529
  static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed,
  			   int reseed)
541af946f   Stephan Mueller   crypto: drbg - SP...
530
531
532
533
534
535
  {
  	int ret = -EFAULT;
  	/* 10.2.1.2 step 1 */
  	unsigned char *temp = drbg->scratchpad;
  	unsigned char *df_data = drbg->scratchpad + drbg_statelen(drbg) +
  				 drbg_blocklen(drbg);
541af946f   Stephan Mueller   crypto: drbg - SP...
536

72e7c25aa   Stephan Mueller   crypto: drbg - Ca...
537
538
  	if (3 > reseed)
  		memset(df_data, 0, drbg_statelen(drbg));
541af946f   Stephan Mueller   crypto: drbg - SP...
539

355912852   Stephan Mueller   crypto: drbg - us...
540
541
542
543
544
545
546
547
548
549
550
551
  	if (!reseed) {
  		/*
  		 * The DRBG uses the CTR mode of the underlying AES cipher. The
  		 * CTR mode increments the counter value after the AES operation
  		 * but SP800-90A requires that the counter is incremented before
  		 * the AES operation. Hence, we increment it at the time we set
  		 * it by one.
  		 */
  		crypto_inc(drbg->V, drbg_blocklen(drbg));
  
  		ret = crypto_skcipher_setkey(drbg->ctr_handle, drbg->C,
  					     drbg_keylen(drbg));
541af946f   Stephan Mueller   crypto: drbg - SP...
552
553
554
  		if (ret)
  			goto out;
  	}
355912852   Stephan Mueller   crypto: drbg - us...
555
556
557
  	/* 10.2.1.3.2 step 2 and 10.2.1.4.2 step 2 */
  	if (seed) {
  		ret = drbg_ctr_df(drbg, df_data, drbg_statelen(drbg), seed);
541af946f   Stephan Mueller   crypto: drbg - SP...
558
559
  		if (ret)
  			goto out;
541af946f   Stephan Mueller   crypto: drbg - SP...
560
  	}
a07203fbf   Stephan Mueller   crypto: drbg - us...
561
562
  	ret = drbg_kcapi_sym_ctr(drbg, df_data, drbg_statelen(drbg),
  				 temp, drbg_statelen(drbg));
355912852   Stephan Mueller   crypto: drbg - us...
563
564
  	if (ret)
  		return ret;
541af946f   Stephan Mueller   crypto: drbg - SP...
565
  	/* 10.2.1.2 step 5 */
103eb3f7b   Stephan Mueller   crypto: drbg - av...
566
  	ret = crypto_skcipher_setkey(drbg->ctr_handle, temp,
355912852   Stephan Mueller   crypto: drbg - us...
567
568
569
  				     drbg_keylen(drbg));
  	if (ret)
  		goto out;
541af946f   Stephan Mueller   crypto: drbg - SP...
570
571
  	/* 10.2.1.2 step 6 */
  	memcpy(drbg->V, temp + drbg_keylen(drbg), drbg_blocklen(drbg));
355912852   Stephan Mueller   crypto: drbg - us...
572
573
  	/* See above: increment counter by one to compensate timing of CTR op */
  	crypto_inc(drbg->V, drbg_blocklen(drbg));
541af946f   Stephan Mueller   crypto: drbg - SP...
574
575
576
  	ret = 0;
  
  out:
1471f09f9   Herbert Xu   Revert "crypto: d...
577
  	memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg));
72e7c25aa   Stephan Mueller   crypto: drbg - Ca...
578
  	if (2 != reseed)
1471f09f9   Herbert Xu   Revert "crypto: d...
579
  		memset(df_data, 0, drbg_statelen(drbg));
541af946f   Stephan Mueller   crypto: drbg - SP...
580
581
582
583
584
585
586
587
588
589
  	return ret;
  }
  
  /*
   * scratchpad use: drbg_ctr_update is called independently from
   * drbg_ctr_extract_bytes. Therefore, the scratchpad is reused
   */
  /* Generate function of CTR DRBG as defined in 10.2.1.5.2 */
  static int drbg_ctr_generate(struct drbg_state *drbg,
  			     unsigned char *buf, unsigned int buflen,
27e4de2bd   Stephan Mueller   crypto: drbg - Mi...
590
  			     struct list_head *addtl)
541af946f   Stephan Mueller   crypto: drbg - SP...
591
  {
355912852   Stephan Mueller   crypto: drbg - us...
592
593
  	int ret;
  	int len = min_t(int, buflen, INT_MAX);
541af946f   Stephan Mueller   crypto: drbg - SP...
594

541af946f   Stephan Mueller   crypto: drbg - SP...
595
  	/* 10.2.1.5.2 step 2 */
27e4de2bd   Stephan Mueller   crypto: drbg - Mi...
596
597
  	if (addtl && !list_empty(addtl)) {
  		ret = drbg_ctr_update(drbg, addtl, 2);
541af946f   Stephan Mueller   crypto: drbg - SP...
598
599
600
601
602
  		if (ret)
  			return 0;
  	}
  
  	/* 10.2.1.5.2 step 4.1 */
43490e804   Stephan Müller   crypto: drbg - in...
603
  	ret = drbg_kcapi_sym_ctr(drbg, NULL, 0, buf, len);
355912852   Stephan Mueller   crypto: drbg - us...
604
605
  	if (ret)
  		return ret;
541af946f   Stephan Mueller   crypto: drbg - SP...
606

72e7c25aa   Stephan Mueller   crypto: drbg - Ca...
607
608
  	/* 10.2.1.5.2 step 6 */
  	ret = drbg_ctr_update(drbg, NULL, 3);
541af946f   Stephan Mueller   crypto: drbg - SP...
609
610
  	if (ret)
  		len = ret;
541af946f   Stephan Mueller   crypto: drbg - SP...
611
612
  	return len;
  }
e4bc02ace   Julia Lawall   crypto: drbg - co...
613
  static const struct drbg_state_ops drbg_ctr_ops = {
541af946f   Stephan Mueller   crypto: drbg - SP...
614
615
616
617
618
619
620
621
622
623
624
625
  	.update		= drbg_ctr_update,
  	.generate	= drbg_ctr_generate,
  	.crypto_init	= drbg_init_sym_kernel,
  	.crypto_fini	= drbg_fini_sym_kernel,
  };
  #endif /* CONFIG_CRYPTO_DRBG_CTR */
  
  /******************************************************************
   * HMAC DRBG callback functions
   ******************************************************************/
  
  #if defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_HMAC)
4218ebe8c   Stephan Mueller   crypto: drbg - se...
626
627
628
629
  static int drbg_kcapi_hash(struct drbg_state *drbg, unsigned char *outval,
  			   const struct list_head *in);
  static void drbg_kcapi_hmacsetkey(struct drbg_state *drbg,
  				  const unsigned char *key);
541af946f   Stephan Mueller   crypto: drbg - SP...
630
631
632
633
634
  static int drbg_init_hash_kernel(struct drbg_state *drbg);
  static int drbg_fini_hash_kernel(struct drbg_state *drbg);
  #endif /* (CONFIG_CRYPTO_DRBG_HASH || CONFIG_CRYPTO_DRBG_HMAC) */
  
  #ifdef CONFIG_CRYPTO_DRBG_HMAC
e25e47ec3   Stephan Mueller   crypto: drbg - cl...
635
  #define CRYPTO_DRBG_HMAC_STRING "HMAC "
0653a7cf6   Stephan Mueller   crypto: drbg - us...
636
637
638
639
640
641
642
643
  MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha512");
  MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha512");
  MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha384");
  MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha384");
  MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha256");
  MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha256");
  MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha1");
  MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha1");
62b62b6e5   Stephan Mueller   crypto: drbg - ad...
644

541af946f   Stephan Mueller   crypto: drbg - SP...
645
  /* update function of HMAC DRBG as defined in 10.1.2.2 */
8c9871660   Stephan Mueller   crypto: drbg - us...
646
647
  static int drbg_hmac_update(struct drbg_state *drbg, struct list_head *seed,
  			    int reseed)
541af946f   Stephan Mueller   crypto: drbg - SP...
648
649
650
  {
  	int ret = -EFAULT;
  	int i = 0;
8c9871660   Stephan Mueller   crypto: drbg - us...
651
652
653
  	struct drbg_string seed1, seed2, vdata;
  	LIST_HEAD(seedlist);
  	LIST_HEAD(vdatalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
654

4218ebe8c   Stephan Mueller   crypto: drbg - se...
655
  	if (!reseed) {
f072f0e0f   Stephan Mueller   crypto: drbg - re...
656
  		/* 10.1.2.3 step 2 -- memset(0) of C is implicit with kzalloc */
541af946f   Stephan Mueller   crypto: drbg - SP...
657
  		memset(drbg->V, 1, drbg_statelen(drbg));
4218ebe8c   Stephan Mueller   crypto: drbg - se...
658
659
  		drbg_kcapi_hmacsetkey(drbg, drbg->C);
  	}
541af946f   Stephan Mueller   crypto: drbg - SP...
660
661
  
  	drbg_string_fill(&seed1, drbg->V, drbg_statelen(drbg));
8c9871660   Stephan Mueller   crypto: drbg - us...
662
  	list_add_tail(&seed1.list, &seedlist);
541af946f   Stephan Mueller   crypto: drbg - SP...
663
664
  	/* buffer of seed2 will be filled in for loop below with one byte */
  	drbg_string_fill(&seed2, NULL, 1);
8c9871660   Stephan Mueller   crypto: drbg - us...
665
  	list_add_tail(&seed2.list, &seedlist);
541af946f   Stephan Mueller   crypto: drbg - SP...
666
  	/* input data of seed is allowed to be NULL at this point */
8c9871660   Stephan Mueller   crypto: drbg - us...
667
668
  	if (seed)
  		list_splice_tail(seed, &seedlist);
541af946f   Stephan Mueller   crypto: drbg - SP...
669

8c9871660   Stephan Mueller   crypto: drbg - us...
670
671
  	drbg_string_fill(&vdata, drbg->V, drbg_statelen(drbg));
  	list_add_tail(&vdata.list, &vdatalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
672
673
674
675
676
677
678
  	for (i = 2; 0 < i; i--) {
  		/* first round uses 0x0, second 0x1 */
  		unsigned char prefix = DRBG_PREFIX0;
  		if (1 == i)
  			prefix = DRBG_PREFIX1;
  		/* 10.1.2.2 step 1 and 4 -- concatenation and HMAC for key */
  		seed2.buf = &prefix;
4218ebe8c   Stephan Mueller   crypto: drbg - se...
679
  		ret = drbg_kcapi_hash(drbg, drbg->C, &seedlist);
541af946f   Stephan Mueller   crypto: drbg - SP...
680
681
  		if (ret)
  			return ret;
4218ebe8c   Stephan Mueller   crypto: drbg - se...
682
  		drbg_kcapi_hmacsetkey(drbg, drbg->C);
541af946f   Stephan Mueller   crypto: drbg - SP...
683
684
  
  		/* 10.1.2.2 step 2 and 5 -- HMAC for V */
4218ebe8c   Stephan Mueller   crypto: drbg - se...
685
  		ret = drbg_kcapi_hash(drbg, drbg->V, &vdatalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
686
687
688
689
  		if (ret)
  			return ret;
  
  		/* 10.1.2.2 step 3 */
8c9871660   Stephan Mueller   crypto: drbg - us...
690
  		if (!seed)
541af946f   Stephan Mueller   crypto: drbg - SP...
691
692
693
694
695
696
697
698
699
700
  			return ret;
  	}
  
  	return 0;
  }
  
  /* generate function of HMAC DRBG as defined in 10.1.2.5 */
  static int drbg_hmac_generate(struct drbg_state *drbg,
  			      unsigned char *buf,
  			      unsigned int buflen,
27e4de2bd   Stephan Mueller   crypto: drbg - Mi...
701
  			      struct list_head *addtl)
541af946f   Stephan Mueller   crypto: drbg - SP...
702
703
704
705
  {
  	int len = 0;
  	int ret = 0;
  	struct drbg_string data;
8c9871660   Stephan Mueller   crypto: drbg - us...
706
  	LIST_HEAD(datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
707
708
  
  	/* 10.1.2.5 step 2 */
27e4de2bd   Stephan Mueller   crypto: drbg - Mi...
709
710
  	if (addtl && !list_empty(addtl)) {
  		ret = drbg_hmac_update(drbg, addtl, 1);
541af946f   Stephan Mueller   crypto: drbg - SP...
711
712
713
714
715
  		if (ret)
  			return ret;
  	}
  
  	drbg_string_fill(&data, drbg->V, drbg_statelen(drbg));
8c9871660   Stephan Mueller   crypto: drbg - us...
716
  	list_add_tail(&data.list, &datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
717
718
719
  	while (len < buflen) {
  		unsigned int outlen = 0;
  		/* 10.1.2.5 step 4.1 */
4218ebe8c   Stephan Mueller   crypto: drbg - se...
720
  		ret = drbg_kcapi_hash(drbg, drbg->V, &datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
721
722
723
724
  		if (ret)
  			return ret;
  		outlen = (drbg_blocklen(drbg) < (buflen - len)) ?
  			  drbg_blocklen(drbg) : (buflen - len);
541af946f   Stephan Mueller   crypto: drbg - SP...
725
726
727
728
729
730
731
  
  		/* 10.1.2.5 step 4.2 */
  		memcpy(buf + len, drbg->V, outlen);
  		len += outlen;
  	}
  
  	/* 10.1.2.5 step 6 */
27e4de2bd   Stephan Mueller   crypto: drbg - Mi...
732
733
734
  	if (addtl && !list_empty(addtl))
  		ret = drbg_hmac_update(drbg, addtl, 1);
  	else
8c9871660   Stephan Mueller   crypto: drbg - us...
735
  		ret = drbg_hmac_update(drbg, NULL, 1);
541af946f   Stephan Mueller   crypto: drbg - SP...
736
737
738
739
740
  	if (ret)
  		return ret;
  
  	return len;
  }
e4bc02ace   Julia Lawall   crypto: drbg - co...
741
  static const struct drbg_state_ops drbg_hmac_ops = {
541af946f   Stephan Mueller   crypto: drbg - SP...
742
743
744
745
  	.update		= drbg_hmac_update,
  	.generate	= drbg_hmac_generate,
  	.crypto_init	= drbg_init_hash_kernel,
  	.crypto_fini	= drbg_fini_hash_kernel,
541af946f   Stephan Mueller   crypto: drbg - SP...
746
747
748
749
750
751
752
753
  };
  #endif /* CONFIG_CRYPTO_DRBG_HMAC */
  
  /******************************************************************
   * Hash DRBG callback functions
   ******************************************************************/
  
  #ifdef CONFIG_CRYPTO_DRBG_HASH
e25e47ec3   Stephan Mueller   crypto: drbg - cl...
754
  #define CRYPTO_DRBG_HASH_STRING "HASH "
0653a7cf6   Stephan Mueller   crypto: drbg - us...
755
756
757
758
759
760
761
762
  MODULE_ALIAS_CRYPTO("drbg_pr_sha512");
  MODULE_ALIAS_CRYPTO("drbg_nopr_sha512");
  MODULE_ALIAS_CRYPTO("drbg_pr_sha384");
  MODULE_ALIAS_CRYPTO("drbg_nopr_sha384");
  MODULE_ALIAS_CRYPTO("drbg_pr_sha256");
  MODULE_ALIAS_CRYPTO("drbg_nopr_sha256");
  MODULE_ALIAS_CRYPTO("drbg_pr_sha1");
  MODULE_ALIAS_CRYPTO("drbg_nopr_sha1");
62b62b6e5   Stephan Mueller   crypto: drbg - ad...
763

541af946f   Stephan Mueller   crypto: drbg - SP...
764
  /*
41a84982a   Stephan Mueller   crypto: drbg - us...
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
   * Increment buffer
   *
   * @dst buffer to increment
   * @add value to add
   */
  static inline void drbg_add_buf(unsigned char *dst, size_t dstlen,
  				const unsigned char *add, size_t addlen)
  {
  	/* implied: dstlen > addlen */
  	unsigned char *dstptr;
  	const unsigned char *addptr;
  	unsigned int remainder = 0;
  	size_t len = addlen;
  
  	dstptr = dst + (dstlen-1);
  	addptr = add + (addlen-1);
  	while (len) {
  		remainder += *dstptr + *addptr;
  		*dstptr = remainder & 0xff;
  		remainder >>= 8;
  		len--; dstptr--; addptr--;
  	}
  	len = dstlen - addlen;
  	while (len && remainder > 0) {
  		remainder = *dstptr + 1;
  		*dstptr = remainder & 0xff;
  		remainder >>= 8;
  		len--; dstptr--;
  	}
  }
  
  /*
541af946f   Stephan Mueller   crypto: drbg - SP...
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
   * scratchpad usage: as drbg_hash_update and drbg_hash_df are used
   * interlinked, the scratchpad is used as follows:
   * drbg_hash_update
   *	start: drbg->scratchpad
   *	length: drbg_statelen(drbg)
   * drbg_hash_df:
   *	start: drbg->scratchpad + drbg_statelen(drbg)
   *	length: drbg_blocklen(drbg)
   *
   * drbg_hash_process_addtl uses the scratchpad, but fully completes
   * before either of the functions mentioned before are invoked. Therefore,
   * drbg_hash_process_addtl does not need to be specifically considered.
   */
  
  /* Derivation Function for Hash DRBG as defined in 10.4.1 */
  static int drbg_hash_df(struct drbg_state *drbg,
  			unsigned char *outval, size_t outlen,
8c9871660   Stephan Mueller   crypto: drbg - us...
814
  			struct list_head *entropylist)
541af946f   Stephan Mueller   crypto: drbg - SP...
815
816
817
818
819
  {
  	int ret = 0;
  	size_t len = 0;
  	unsigned char input[5];
  	unsigned char *tmp = drbg->scratchpad + drbg_statelen(drbg);
8c9871660   Stephan Mueller   crypto: drbg - us...
820
  	struct drbg_string data;
541af946f   Stephan Mueller   crypto: drbg - SP...
821

541af946f   Stephan Mueller   crypto: drbg - SP...
822
823
  	/* 10.4.1 step 3 */
  	input[0] = 1;
72f3e00dd   Stephan Mueller   crypto: drbg - re...
824
  	drbg_cpu_to_be32((outlen * 8), &input[1]);
541af946f   Stephan Mueller   crypto: drbg - SP...
825
826
  
  	/* 10.4.1 step 4.1 -- concatenation of data for input into hash */
8c9871660   Stephan Mueller   crypto: drbg - us...
827
828
  	drbg_string_fill(&data, input, 5);
  	list_add(&data.list, entropylist);
541af946f   Stephan Mueller   crypto: drbg - SP...
829
830
831
832
833
  
  	/* 10.4.1 step 4 */
  	while (len < outlen) {
  		short blocklen = 0;
  		/* 10.4.1 step 4.1 */
4218ebe8c   Stephan Mueller   crypto: drbg - se...
834
  		ret = drbg_kcapi_hash(drbg, tmp, entropylist);
541af946f   Stephan Mueller   crypto: drbg - SP...
835
836
837
838
839
840
841
842
843
844
845
  		if (ret)
  			goto out;
  		/* 10.4.1 step 4.2 */
  		input[0]++;
  		blocklen = (drbg_blocklen(drbg) < (outlen - len)) ?
  			    drbg_blocklen(drbg) : (outlen - len);
  		memcpy(outval + len, tmp, blocklen);
  		len += blocklen;
  	}
  
  out:
1471f09f9   Herbert Xu   Revert "crypto: d...
846
  	memset(tmp, 0, drbg_blocklen(drbg));
541af946f   Stephan Mueller   crypto: drbg - SP...
847
848
849
850
  	return ret;
  }
  
  /* update function for Hash DRBG as defined in 10.1.1.2 / 10.1.1.3 */
8c9871660   Stephan Mueller   crypto: drbg - us...
851
  static int drbg_hash_update(struct drbg_state *drbg, struct list_head *seed,
541af946f   Stephan Mueller   crypto: drbg - SP...
852
853
854
855
  			    int reseed)
  {
  	int ret = 0;
  	struct drbg_string data1, data2;
8c9871660   Stephan Mueller   crypto: drbg - us...
856
857
  	LIST_HEAD(datalist);
  	LIST_HEAD(datalist2);
541af946f   Stephan Mueller   crypto: drbg - SP...
858
859
  	unsigned char *V = drbg->scratchpad;
  	unsigned char prefix = DRBG_PREFIX1;
541af946f   Stephan Mueller   crypto: drbg - SP...
860
861
862
863
864
865
866
  	if (!seed)
  		return -EINVAL;
  
  	if (reseed) {
  		/* 10.1.1.3 step 1 */
  		memcpy(V, drbg->V, drbg_statelen(drbg));
  		drbg_string_fill(&data1, &prefix, 1);
8c9871660   Stephan Mueller   crypto: drbg - us...
867
  		list_add_tail(&data1.list, &datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
868
  		drbg_string_fill(&data2, V, drbg_statelen(drbg));
8c9871660   Stephan Mueller   crypto: drbg - us...
869
  		list_add_tail(&data2.list, &datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
870
  	}
8c9871660   Stephan Mueller   crypto: drbg - us...
871
  	list_splice_tail(seed, &datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
872
873
  
  	/* 10.1.1.2 / 10.1.1.3 step 2 and 3 */
8c9871660   Stephan Mueller   crypto: drbg - us...
874
  	ret = drbg_hash_df(drbg, drbg->V, drbg_statelen(drbg), &datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
875
876
877
878
879
880
  	if (ret)
  		goto out;
  
  	/* 10.1.1.2 / 10.1.1.3 step 4  */
  	prefix = DRBG_PREFIX0;
  	drbg_string_fill(&data1, &prefix, 1);
8c9871660   Stephan Mueller   crypto: drbg - us...
881
  	list_add_tail(&data1.list, &datalist2);
541af946f   Stephan Mueller   crypto: drbg - SP...
882
  	drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg));
8c9871660   Stephan Mueller   crypto: drbg - us...
883
  	list_add_tail(&data2.list, &datalist2);
541af946f   Stephan Mueller   crypto: drbg - SP...
884
  	/* 10.1.1.2 / 10.1.1.3 step 4 */
8c9871660   Stephan Mueller   crypto: drbg - us...
885
  	ret = drbg_hash_df(drbg, drbg->C, drbg_statelen(drbg), &datalist2);
541af946f   Stephan Mueller   crypto: drbg - SP...
886
887
  
  out:
1471f09f9   Herbert Xu   Revert "crypto: d...
888
  	memset(drbg->scratchpad, 0, drbg_statelen(drbg));
541af946f   Stephan Mueller   crypto: drbg - SP...
889
890
891
892
893
  	return ret;
  }
  
  /* processing of additional information string for Hash DRBG */
  static int drbg_hash_process_addtl(struct drbg_state *drbg,
27e4de2bd   Stephan Mueller   crypto: drbg - Mi...
894
  				   struct list_head *addtl)
541af946f   Stephan Mueller   crypto: drbg - SP...
895
896
897
  {
  	int ret = 0;
  	struct drbg_string data1, data2;
8c9871660   Stephan Mueller   crypto: drbg - us...
898
  	LIST_HEAD(datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
899
  	unsigned char prefix = DRBG_PREFIX2;
541af946f   Stephan Mueller   crypto: drbg - SP...
900
  	/* 10.1.1.4 step 2 */
27e4de2bd   Stephan Mueller   crypto: drbg - Mi...
901
  	if (!addtl || list_empty(addtl))
541af946f   Stephan Mueller   crypto: drbg - SP...
902
903
904
905
906
  		return 0;
  
  	/* 10.1.1.4 step 2a */
  	drbg_string_fill(&data1, &prefix, 1);
  	drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg));
8c9871660   Stephan Mueller   crypto: drbg - us...
907
908
  	list_add_tail(&data1.list, &datalist);
  	list_add_tail(&data2.list, &datalist);
27e4de2bd   Stephan Mueller   crypto: drbg - Mi...
909
  	list_splice_tail(addtl, &datalist);
4218ebe8c   Stephan Mueller   crypto: drbg - se...
910
  	ret = drbg_kcapi_hash(drbg, drbg->scratchpad, &datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
911
912
913
914
915
916
917
918
  	if (ret)
  		goto out;
  
  	/* 10.1.1.4 step 2b */
  	drbg_add_buf(drbg->V, drbg_statelen(drbg),
  		     drbg->scratchpad, drbg_blocklen(drbg));
  
  out:
1471f09f9   Herbert Xu   Revert "crypto: d...
919
  	memset(drbg->scratchpad, 0, drbg_blocklen(drbg));
541af946f   Stephan Mueller   crypto: drbg - SP...
920
921
922
923
924
925
926
927
928
929
930
931
932
  	return ret;
  }
  
  /* Hashgen defined in 10.1.1.4 */
  static int drbg_hash_hashgen(struct drbg_state *drbg,
  			     unsigned char *buf,
  			     unsigned int buflen)
  {
  	int len = 0;
  	int ret = 0;
  	unsigned char *src = drbg->scratchpad;
  	unsigned char *dst = drbg->scratchpad + drbg_statelen(drbg);
  	struct drbg_string data;
8c9871660   Stephan Mueller   crypto: drbg - us...
933
  	LIST_HEAD(datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
934

541af946f   Stephan Mueller   crypto: drbg - SP...
935
936
937
938
  	/* 10.1.1.4 step hashgen 2 */
  	memcpy(src, drbg->V, drbg_statelen(drbg));
  
  	drbg_string_fill(&data, src, drbg_statelen(drbg));
8c9871660   Stephan Mueller   crypto: drbg - us...
939
  	list_add_tail(&data.list, &datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
940
941
942
  	while (len < buflen) {
  		unsigned int outlen = 0;
  		/* 10.1.1.4 step hashgen 4.1 */
4218ebe8c   Stephan Mueller   crypto: drbg - se...
943
  		ret = drbg_kcapi_hash(drbg, dst, &datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
944
945
946
947
948
949
  		if (ret) {
  			len = ret;
  			goto out;
  		}
  		outlen = (drbg_blocklen(drbg) < (buflen - len)) ?
  			  drbg_blocklen(drbg) : (buflen - len);
541af946f   Stephan Mueller   crypto: drbg - SP...
950
951
952
953
954
  		/* 10.1.1.4 step hashgen 4.2 */
  		memcpy(buf + len, dst, outlen);
  		len += outlen;
  		/* 10.1.1.4 hashgen step 4.3 */
  		if (len < buflen)
41a84982a   Stephan Mueller   crypto: drbg - us...
955
  			crypto_inc(src, drbg_statelen(drbg));
541af946f   Stephan Mueller   crypto: drbg - SP...
956
957
958
  	}
  
  out:
1471f09f9   Herbert Xu   Revert "crypto: d...
959
  	memset(drbg->scratchpad, 0,
541af946f   Stephan Mueller   crypto: drbg - SP...
960
961
962
963
964
965
966
  	       (drbg_statelen(drbg) + drbg_blocklen(drbg)));
  	return len;
  }
  
  /* generate function for Hash DRBG as defined in  10.1.1.4 */
  static int drbg_hash_generate(struct drbg_state *drbg,
  			      unsigned char *buf, unsigned int buflen,
27e4de2bd   Stephan Mueller   crypto: drbg - Mi...
967
  			      struct list_head *addtl)
541af946f   Stephan Mueller   crypto: drbg - SP...
968
969
970
  {
  	int len = 0;
  	int ret = 0;
72f3e00dd   Stephan Mueller   crypto: drbg - re...
971
972
  	union {
  		unsigned char req[8];
7c8ae03f4   Stephan Mueller   crypto: drbg - fi...
973
  		__be64 req_int;
72f3e00dd   Stephan Mueller   crypto: drbg - re...
974
  	} u;
541af946f   Stephan Mueller   crypto: drbg - SP...
975
976
  	unsigned char prefix = DRBG_PREFIX3;
  	struct drbg_string data1, data2;
8c9871660   Stephan Mueller   crypto: drbg - us...
977
  	LIST_HEAD(datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
978
979
980
981
982
983
984
985
986
  
  	/* 10.1.1.4 step 2 */
  	ret = drbg_hash_process_addtl(drbg, addtl);
  	if (ret)
  		return ret;
  	/* 10.1.1.4 step 3 */
  	len = drbg_hash_hashgen(drbg, buf, buflen);
  
  	/* this is the value H as documented in 10.1.1.4 */
541af946f   Stephan Mueller   crypto: drbg - SP...
987
988
  	/* 10.1.1.4 step 4 */
  	drbg_string_fill(&data1, &prefix, 1);
8c9871660   Stephan Mueller   crypto: drbg - us...
989
  	list_add_tail(&data1.list, &datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
990
  	drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg));
8c9871660   Stephan Mueller   crypto: drbg - us...
991
  	list_add_tail(&data2.list, &datalist);
4218ebe8c   Stephan Mueller   crypto: drbg - se...
992
  	ret = drbg_kcapi_hash(drbg, drbg->scratchpad, &datalist);
541af946f   Stephan Mueller   crypto: drbg - SP...
993
994
995
996
997
998
999
1000
1001
1002
  	if (ret) {
  		len = ret;
  		goto out;
  	}
  
  	/* 10.1.1.4 step 5 */
  	drbg_add_buf(drbg->V, drbg_statelen(drbg),
  		     drbg->scratchpad, drbg_blocklen(drbg));
  	drbg_add_buf(drbg->V, drbg_statelen(drbg),
  		     drbg->C, drbg_statelen(drbg));
72f3e00dd   Stephan Mueller   crypto: drbg - re...
1003
1004
  	u.req_int = cpu_to_be64(drbg->reseed_ctr);
  	drbg_add_buf(drbg->V, drbg_statelen(drbg), u.req, 8);
541af946f   Stephan Mueller   crypto: drbg - SP...
1005
1006
  
  out:
1471f09f9   Herbert Xu   Revert "crypto: d...
1007
  	memset(drbg->scratchpad, 0, drbg_blocklen(drbg));
541af946f   Stephan Mueller   crypto: drbg - SP...
1008
1009
1010
1011
1012
1013
1014
  	return len;
  }
  
  /*
   * scratchpad usage: as update and generate are used isolated, both
   * can use the scratchpad
   */
e4bc02ace   Julia Lawall   crypto: drbg - co...
1015
  static const struct drbg_state_ops drbg_hash_ops = {
541af946f   Stephan Mueller   crypto: drbg - SP...
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
  	.update		= drbg_hash_update,
  	.generate	= drbg_hash_generate,
  	.crypto_init	= drbg_init_hash_kernel,
  	.crypto_fini	= drbg_fini_hash_kernel,
  };
  #endif /* CONFIG_CRYPTO_DRBG_HASH */
  
  /******************************************************************
   * Functions common for DRBG implementations
   ******************************************************************/
3d6a5f75d   Stephan Mueller   crypto: drbg - pr...
1026
  static inline int __drbg_seed(struct drbg_state *drbg, struct list_head *seed,
585f6b76d   Nicolai Stange   crypto: drbg - tr...
1027
  			      int reseed, enum drbg_seed_state new_seed_state)
3d6a5f75d   Stephan Mueller   crypto: drbg - pr...
1028
1029
1030
1031
1032
  {
  	int ret = drbg->d_ops->update(drbg, seed, reseed);
  
  	if (ret)
  		return ret;
585f6b76d   Nicolai Stange   crypto: drbg - tr...
1033
  	drbg->seeded = new_seed_state;
3d6a5f75d   Stephan Mueller   crypto: drbg - pr...
1034
1035
  	/* 10.1.1.2 / 10.1.1.3 step 5 */
  	drbg->reseed_ctr = 1;
da208708f   Nicolai Stange   crypto: drbg - mo...
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
  	switch (drbg->seeded) {
  	case DRBG_SEED_STATE_UNSEEDED:
  		/* Impossible, but handle it to silence compiler warnings. */
  		fallthrough;
  	case DRBG_SEED_STATE_PARTIAL:
  		/*
  		 * Require frequent reseeds until the seed source is
  		 * fully initialized.
  		 */
  		drbg->reseed_threshold = 50;
  		break;
  
  	case DRBG_SEED_STATE_FULL:
  		/*
  		 * Seed source has become fully initialized, frequent
  		 * reseeds no longer required.
  		 */
  		drbg->reseed_threshold = drbg_max_requests(drbg);
  		break;
  	}
3d6a5f75d   Stephan Mueller   crypto: drbg - pr...
1056
1057
  	return ret;
  }
db07cd26a   Stephan Mueller   crypto: drbg - ad...
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
  static inline int drbg_get_random_bytes(struct drbg_state *drbg,
  					unsigned char *entropy,
  					unsigned int entropylen)
  {
  	int ret;
  
  	do {
  		get_random_bytes(entropy, entropylen);
  		ret = drbg_fips_continuous_test(drbg, entropy);
  		if (ret && ret != -EAGAIN)
  			return ret;
  	} while (ret);
  
  	return 0;
  }
e61717947   Nicolai Stange   crypto: drbg - ma...
1073
  static int drbg_seed_from_random(struct drbg_state *drbg)
4c7879907   Stephan Mueller   crypto: drbg - ad...
1074
1075
1076
  {
  	struct drbg_string data;
  	LIST_HEAD(seedlist);
57225e679   Stephan Mueller   crypto: drbg - Us...
1077
1078
  	unsigned int entropylen = drbg_sec_strength(drbg->core->flags);
  	unsigned char entropy[32];
db07cd26a   Stephan Mueller   crypto: drbg - ad...
1079
  	int ret;
4c7879907   Stephan Mueller   crypto: drbg - ad...
1080

57225e679   Stephan Mueller   crypto: drbg - Us...
1081
1082
  	BUG_ON(!entropylen);
  	BUG_ON(entropylen > sizeof(entropy));
4c7879907   Stephan Mueller   crypto: drbg - ad...
1083

57225e679   Stephan Mueller   crypto: drbg - Us...
1084
  	drbg_string_fill(&data, entropy, entropylen);
4c7879907   Stephan Mueller   crypto: drbg - ad...
1085
  	list_add_tail(&data.list, &seedlist);
57225e679   Stephan Mueller   crypto: drbg - Us...
1086

db07cd26a   Stephan Mueller   crypto: drbg - ad...
1087
1088
  	ret = drbg_get_random_bytes(drbg, entropy, entropylen);
  	if (ret)
e61717947   Nicolai Stange   crypto: drbg - ma...
1089
  		goto out;
57225e679   Stephan Mueller   crypto: drbg - Us...
1090

e61717947   Nicolai Stange   crypto: drbg - ma...
1091
  	ret = __drbg_seed(drbg, &seedlist, true, DRBG_SEED_STATE_FULL);
57225e679   Stephan Mueller   crypto: drbg - Us...
1092

e61717947   Nicolai Stange   crypto: drbg - ma...
1093
  out:
57225e679   Stephan Mueller   crypto: drbg - Us...
1094
  	memzero_explicit(entropy, entropylen);
e61717947   Nicolai Stange   crypto: drbg - ma...
1095
  	return ret;
4c7879907   Stephan Mueller   crypto: drbg - ad...
1096
  }
541af946f   Stephan Mueller   crypto: drbg - SP...
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
  /*
   * Seeding or reseeding of the DRBG
   *
   * @drbg: DRBG state struct
   * @pers: personalization / additional information buffer
   * @reseed: 0 for initial seed process, 1 for reseeding
   *
   * return:
   *	0 on success
   *	error value otherwise
   */
  static int drbg_seed(struct drbg_state *drbg, struct drbg_string *pers,
  		     bool reseed)
  {
57225e679   Stephan Mueller   crypto: drbg - Us...
1111
1112
1113
  	int ret;
  	unsigned char entropy[((32 + 16) * 2)];
  	unsigned int entropylen = drbg_sec_strength(drbg->core->flags);
541af946f   Stephan Mueller   crypto: drbg - SP...
1114
  	struct drbg_string data1;
8c9871660   Stephan Mueller   crypto: drbg - us...
1115
  	LIST_HEAD(seedlist);
585f6b76d   Nicolai Stange   crypto: drbg - tr...
1116
  	enum drbg_seed_state new_seed_state = DRBG_SEED_STATE_FULL;
541af946f   Stephan Mueller   crypto: drbg - SP...
1117
1118
1119
  
  	/* 9.1 / 9.2 / 9.3.1 step 3 */
  	if (pers && pers->len > (drbg_max_addtl(drbg))) {
a9089571f   Stephan Mueller   crypto: drbg - Fi...
1120
1121
  		pr_devel("DRBG: personalization string too long %zu
  ",
541af946f   Stephan Mueller   crypto: drbg - SP...
1122
1123
1124
  			 pers->len);
  		return -EINVAL;
  	}
8fded5925   Herbert Xu   crypto: drbg - Co...
1125
1126
1127
  	if (list_empty(&drbg->test_data.list)) {
  		drbg_string_fill(&data1, drbg->test_data.buf,
  				 drbg->test_data.len);
541af946f   Stephan Mueller   crypto: drbg - SP...
1128
1129
1130
  		pr_devel("DRBG: using test entropy
  ");
  	} else {
57225e679   Stephan Mueller   crypto: drbg - Us...
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
  		/*
  		 * Gather entropy equal to the security strength of the DRBG.
  		 * With a derivation function, a nonce is required in addition
  		 * to the entropy. A nonce must be at least 1/2 of the security
  		 * strength of the DRBG in size. Thus, entropy + nonce is 3/2
  		 * of the strength. The consideration of a nonce is only
  		 * applicable during initial seeding.
  		 */
  		BUG_ON(!entropylen);
  		if (!reseed)
  			entropylen = ((entropylen + 1) / 2) * 3;
  		BUG_ON((entropylen * 2) > sizeof(entropy));
b8ec5ba42   Stephan Mueller   crypto: drbg - us...
1143
  		/* Get seed from in-kernel /dev/urandom */
585f6b76d   Nicolai Stange   crypto: drbg - tr...
1144
1145
  		if (!rng_is_initialized())
  			new_seed_state = DRBG_SEED_STATE_PARTIAL;
db07cd26a   Stephan Mueller   crypto: drbg - ad...
1146
1147
1148
  		ret = drbg_get_random_bytes(drbg, entropy, entropylen);
  		if (ret)
  			goto out;
57225e679   Stephan Mueller   crypto: drbg - Us...
1149
1150
1151
1152
1153
1154
  
  		if (!drbg->jent) {
  			drbg_string_fill(&data1, entropy, entropylen);
  			pr_devel("DRBG: (re)seeding with %u bytes of entropy
  ",
  				 entropylen);
b8ec5ba42   Stephan Mueller   crypto: drbg - us...
1155
  		} else {
57225e679   Stephan Mueller   crypto: drbg - Us...
1156
1157
1158
1159
1160
1161
1162
  			/* Get seed from Jitter RNG */
  			ret = crypto_rng_get_bytes(drbg->jent,
  						   entropy + entropylen,
  						   entropylen);
  			if (ret) {
  				pr_devel("DRBG: jent failed with %d
  ", ret);
97f2650e5   Stephan Müller   crypto: drbg - al...
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
  
  				/*
  				 * Do not treat the transient failure of the
  				 * Jitter RNG as an error that needs to be
  				 * reported. The combined number of the
  				 * maximum reseed threshold times the maximum
  				 * number of Jitter RNG transient errors is
  				 * less than the reseed threshold required by
  				 * SP800-90A allowing us to treat the
  				 * transient errors as such.
  				 *
  				 * However, we mandate that at least the first
  				 * seeding operation must succeed with the
  				 * Jitter RNG.
  				 */
  				if (!reseed || ret != -EAGAIN)
  					goto out;
57225e679   Stephan Mueller   crypto: drbg - Us...
1180
1181
1182
1183
1184
1185
  			}
  
  			drbg_string_fill(&data1, entropy, entropylen * 2);
  			pr_devel("DRBG: (re)seeding with %u bytes of entropy
  ",
  				 entropylen * 2);
b8ec5ba42   Stephan Mueller   crypto: drbg - us...
1186
  		}
541af946f   Stephan Mueller   crypto: drbg - SP...
1187
  	}
8c9871660   Stephan Mueller   crypto: drbg - us...
1188
  	list_add_tail(&data1.list, &seedlist);
541af946f   Stephan Mueller   crypto: drbg - SP...
1189
1190
1191
1192
1193
1194
  
  	/*
  	 * concatenation of entropy with personalization str / addtl input)
  	 * the variable pers is directly handed in by the caller, so check its
  	 * contents whether it is appropriate
  	 */
8c9871660   Stephan Mueller   crypto: drbg - us...
1195
1196
  	if (pers && pers->buf && 0 < pers->len) {
  		list_add_tail(&pers->list, &seedlist);
541af946f   Stephan Mueller   crypto: drbg - SP...
1197
1198
1199
  		pr_devel("DRBG: using personalization string
  ");
  	}
e6c0244ad   Stephan Mueller   crypto: drbg - us...
1200
1201
1202
1203
  	if (!reseed) {
  		memset(drbg->V, 0, drbg_statelen(drbg));
  		memset(drbg->C, 0, drbg_statelen(drbg));
  	}
585f6b76d   Nicolai Stange   crypto: drbg - tr...
1204
  	ret = __drbg_seed(drbg, &seedlist, reseed, new_seed_state);
3d6a5f75d   Stephan Mueller   crypto: drbg - pr...
1205

db07cd26a   Stephan Mueller   crypto: drbg - ad...
1206
  out:
57225e679   Stephan Mueller   crypto: drbg - Us...
1207
  	memzero_explicit(entropy, entropylen * 2);
4c7879907   Stephan Mueller   crypto: drbg - ad...
1208

541af946f   Stephan Mueller   crypto: drbg - SP...
1209
1210
1211
1212
1213
1214
1215
1216
  	return ret;
  }
  
  /* Free all substructures in a DRBG state without the DRBG state structure */
  static inline void drbg_dealloc_state(struct drbg_state *drbg)
  {
  	if (!drbg)
  		return;
453431a54   Waiman Long   mm, treewide: ren...
1217
  	kfree_sensitive(drbg->Vbuf);
eea0d3ea7   Stephan Mueller   crypto: drbg - se...
1218
  	drbg->Vbuf = NULL;
bd6227a15   Stephan Mueller   crypto: drbg - fi...
1219
  	drbg->V = NULL;
453431a54   Waiman Long   mm, treewide: ren...
1220
  	kfree_sensitive(drbg->Cbuf);
eea0d3ea7   Stephan Mueller   crypto: drbg - se...
1221
  	drbg->Cbuf = NULL;
bd6227a15   Stephan Mueller   crypto: drbg - fi...
1222
  	drbg->C = NULL;
453431a54   Waiman Long   mm, treewide: ren...
1223
  	kfree_sensitive(drbg->scratchpadbuf);
3cfc3b972   Stephan Mueller   crypto: drbg - us...
1224
  	drbg->scratchpadbuf = NULL;
541af946f   Stephan Mueller   crypto: drbg - SP...
1225
  	drbg->reseed_ctr = 0;
2a57e4241   Herbert Xu   crypto: drbg - Do...
1226
1227
  	drbg->d_ops = NULL;
  	drbg->core = NULL;
db07cd26a   Stephan Mueller   crypto: drbg - ad...
1228
  	if (IS_ENABLED(CONFIG_CRYPTO_FIPS)) {
453431a54   Waiman Long   mm, treewide: ren...
1229
  		kfree_sensitive(drbg->prev);
db07cd26a   Stephan Mueller   crypto: drbg - ad...
1230
1231
1232
  		drbg->prev = NULL;
  		drbg->fips_primed = false;
  	}
541af946f   Stephan Mueller   crypto: drbg - SP...
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
  }
  
  /*
   * Allocate all sub-structures for a DRBG state.
   * The DRBG state structure must already be allocated.
   */
  static inline int drbg_alloc_state(struct drbg_state *drbg)
  {
  	int ret = -ENOMEM;
  	unsigned int sb_size = 0;
2a57e4241   Herbert Xu   crypto: drbg - Do...
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
  	switch (drbg->core->flags & DRBG_TYPE_MASK) {
  #ifdef CONFIG_CRYPTO_DRBG_HMAC
  	case DRBG_HMAC:
  		drbg->d_ops = &drbg_hmac_ops;
  		break;
  #endif /* CONFIG_CRYPTO_DRBG_HMAC */
  #ifdef CONFIG_CRYPTO_DRBG_HASH
  	case DRBG_HASH:
  		drbg->d_ops = &drbg_hash_ops;
  		break;
  #endif /* CONFIG_CRYPTO_DRBG_HASH */
  #ifdef CONFIG_CRYPTO_DRBG_CTR
  	case DRBG_CTR:
  		drbg->d_ops = &drbg_ctr_ops;
  		break;
  #endif /* CONFIG_CRYPTO_DRBG_CTR */
  	default:
  		ret = -EOPNOTSUPP;
  		goto err;
  	}
3cfc3b972   Stephan Mueller   crypto: drbg - us...
1263
1264
  	ret = drbg->d_ops->crypto_init(drbg);
  	if (ret < 0)
541af946f   Stephan Mueller   crypto: drbg - SP...
1265
  		goto err;
3cfc3b972   Stephan Mueller   crypto: drbg - us...
1266
1267
  
  	drbg->Vbuf = kmalloc(drbg_statelen(drbg) + ret, GFP_KERNEL);
1a45d7e34   Wei Yongjun   crypto: drbg - fi...
1268
1269
  	if (!drbg->Vbuf) {
  		ret = -ENOMEM;
3cfc3b972   Stephan Mueller   crypto: drbg - us...
1270
  		goto fini;
1a45d7e34   Wei Yongjun   crypto: drbg - fi...
1271
  	}
3cfc3b972   Stephan Mueller   crypto: drbg - us...
1272
1273
  	drbg->V = PTR_ALIGN(drbg->Vbuf, ret + 1);
  	drbg->Cbuf = kmalloc(drbg_statelen(drbg) + ret, GFP_KERNEL);
1a45d7e34   Wei Yongjun   crypto: drbg - fi...
1274
1275
  	if (!drbg->Cbuf) {
  		ret = -ENOMEM;
3cfc3b972   Stephan Mueller   crypto: drbg - us...
1276
  		goto fini;
1a45d7e34   Wei Yongjun   crypto: drbg - fi...
1277
  	}
3cfc3b972   Stephan Mueller   crypto: drbg - us...
1278
  	drbg->C = PTR_ALIGN(drbg->Cbuf, ret + 1);
541af946f   Stephan Mueller   crypto: drbg - SP...
1279
1280
1281
1282
1283
1284
1285
1286
  	/* scratchpad is only generated for CTR and Hash */
  	if (drbg->core->flags & DRBG_HMAC)
  		sb_size = 0;
  	else if (drbg->core->flags & DRBG_CTR)
  		sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg) + /* temp */
  			  drbg_statelen(drbg) +	/* df_data */
  			  drbg_blocklen(drbg) +	/* pad */
  			  drbg_blocklen(drbg) +	/* iv */
8fecaad77   Stephan Mueller   crypto: drbg - fi...
1287
  			  drbg_statelen(drbg) + drbg_blocklen(drbg); /* temp */
541af946f   Stephan Mueller   crypto: drbg - SP...
1288
1289
1290
1291
  	else
  		sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg);
  
  	if (0 < sb_size) {
3cfc3b972   Stephan Mueller   crypto: drbg - us...
1292
  		drbg->scratchpadbuf = kzalloc(sb_size + ret, GFP_KERNEL);
1a45d7e34   Wei Yongjun   crypto: drbg - fi...
1293
1294
  		if (!drbg->scratchpadbuf) {
  			ret = -ENOMEM;
3cfc3b972   Stephan Mueller   crypto: drbg - us...
1295
  			goto fini;
1a45d7e34   Wei Yongjun   crypto: drbg - fi...
1296
  		}
3cfc3b972   Stephan Mueller   crypto: drbg - us...
1297
  		drbg->scratchpad = PTR_ALIGN(drbg->scratchpadbuf, ret + 1);
541af946f   Stephan Mueller   crypto: drbg - SP...
1298
  	}
3d6a5f75d   Stephan Mueller   crypto: drbg - pr...
1299

db07cd26a   Stephan Mueller   crypto: drbg - ad...
1300
1301
1302
  	if (IS_ENABLED(CONFIG_CRYPTO_FIPS)) {
  		drbg->prev = kzalloc(drbg_sec_strength(drbg->core->flags),
  				     GFP_KERNEL);
e0664ebce   Wei Yongjun   crypto: drbg - fi...
1303
1304
  		if (!drbg->prev) {
  			ret = -ENOMEM;
db07cd26a   Stephan Mueller   crypto: drbg - ad...
1305
  			goto fini;
e0664ebce   Wei Yongjun   crypto: drbg - fi...
1306
  		}
db07cd26a   Stephan Mueller   crypto: drbg - ad...
1307
1308
  		drbg->fips_primed = false;
  	}
541af946f   Stephan Mueller   crypto: drbg - SP...
1309
  	return 0;
3cfc3b972   Stephan Mueller   crypto: drbg - us...
1310
1311
  fini:
  	drbg->d_ops->crypto_fini(drbg);
541af946f   Stephan Mueller   crypto: drbg - SP...
1312
1313
1314
1315
  err:
  	drbg_dealloc_state(drbg);
  	return ret;
  }
541af946f   Stephan Mueller   crypto: drbg - SP...
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
  /*************************************************************************
   * DRBG interface functions
   *************************************************************************/
  
  /*
   * DRBG generate function as required by SP800-90A - this function
   * generates random numbers
   *
   * @drbg DRBG state handle
   * @buf Buffer where to store the random numbers -- the buffer must already
   *      be pre-allocated by caller
   * @buflen Length of output buffer - this value defines the number of random
   *	   bytes pulled from DRBG
   * @addtl Additional input that is mixed into state, may be NULL -- note
   *	  the entropy is pulled by the DRBG internally unconditionally
   *	  as defined in SP800-90A. The additional input is mixed into
   *	  the state in addition to the pulled entropy.
   *
cde001e4c   Stephan Mueller   crypto: rng - RNG...
1334
   * return: 0 when all bytes are generated; < 0 in case of an error
541af946f   Stephan Mueller   crypto: drbg - SP...
1335
1336
1337
1338
1339
1340
   */
  static int drbg_generate(struct drbg_state *drbg,
  			 unsigned char *buf, unsigned int buflen,
  			 struct drbg_string *addtl)
  {
  	int len = 0;
27e4de2bd   Stephan Mueller   crypto: drbg - Mi...
1341
  	LIST_HEAD(addtllist);
541af946f   Stephan Mueller   crypto: drbg - SP...
1342

2a57e4241   Herbert Xu   crypto: drbg - Do...
1343
1344
1345
1346
1347
  	if (!drbg->core) {
  		pr_devel("DRBG: not yet seeded
  ");
  		return -EINVAL;
  	}
541af946f   Stephan Mueller   crypto: drbg - SP...
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
  	if (0 == buflen || !buf) {
  		pr_devel("DRBG: no output buffer provided
  ");
  		return -EINVAL;
  	}
  	if (addtl && NULL == addtl->buf && 0 < addtl->len) {
  		pr_devel("DRBG: wrong format of additional information
  ");
  		return -EINVAL;
  	}
541af946f   Stephan Mueller   crypto: drbg - SP...
1358
1359
  	/* 9.3.1 step 2 */
  	len = -EINVAL;
76899a41f   Stephan Mueller   crypto: drbg - re...
1360
  	if (buflen > (drbg_max_request_bytes(drbg))) {
541af946f   Stephan Mueller   crypto: drbg - SP...
1361
1362
1363
1364
1365
1366
1367
1368
1369
  		pr_devel("DRBG: requested random numbers too large %u
  ",
  			 buflen);
  		goto err;
  	}
  
  	/* 9.3.1 step 3 is implicit with the chosen DRBG */
  
  	/* 9.3.1 step 4 */
76899a41f   Stephan Mueller   crypto: drbg - re...
1370
  	if (addtl && addtl->len > (drbg_max_addtl(drbg))) {
541af946f   Stephan Mueller   crypto: drbg - SP...
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
  		pr_devel("DRBG: additional information string too long %zu
  ",
  			 addtl->len);
  		goto err;
  	}
  	/* 9.3.1 step 5 is implicit with the chosen DRBG */
  
  	/*
  	 * 9.3.1 step 6 and 9 supplemented by 9.3.2 step c is implemented
  	 * here. The spec is a bit convoluted here, we make it simpler.
  	 */
42ea507fa   Stephan Mueller   crypto: drbg - re...
1382
  	if (drbg->reseed_threshold < drbg->reseed_ctr)
fa996803b   Nicolai Stange   crypto: drbg - pr...
1383
  		drbg->seeded = DRBG_SEED_STATE_UNSEEDED;
541af946f   Stephan Mueller   crypto: drbg - SP...
1384

fa996803b   Nicolai Stange   crypto: drbg - pr...
1385
  	if (drbg->pr || drbg->seeded == DRBG_SEED_STATE_UNSEEDED) {
541af946f   Stephan Mueller   crypto: drbg - SP...
1386
1387
1388
1389
  		pr_devel("DRBG: reseeding before generation (prediction "
  			 "resistance: %s, state %s)
  ",
  			 drbg->pr ? "true" : "false",
fa996803b   Nicolai Stange   crypto: drbg - pr...
1390
1391
  			 (drbg->seeded ==  DRBG_SEED_STATE_FULL ?
  			  "seeded" : "unseeded"));
541af946f   Stephan Mueller   crypto: drbg - SP...
1392
  		/* 9.3.1 steps 7.1 through 7.3 */
76899a41f   Stephan Mueller   crypto: drbg - re...
1393
  		len = drbg_seed(drbg, addtl, true);
541af946f   Stephan Mueller   crypto: drbg - SP...
1394
1395
1396
1397
  		if (len)
  			goto err;
  		/* 9.3.1 step 7.4 */
  		addtl = NULL;
e61717947   Nicolai Stange   crypto: drbg - ma...
1398
1399
1400
1401
1402
  	} else if (rng_is_initialized() &&
  		   drbg->seeded == DRBG_SEED_STATE_PARTIAL) {
  		len = drbg_seed_from_random(drbg);
  		if (len)
  			goto err;
541af946f   Stephan Mueller   crypto: drbg - SP...
1403
  	}
27e4de2bd   Stephan Mueller   crypto: drbg - Mi...
1404

27e4de2bd   Stephan Mueller   crypto: drbg - Mi...
1405
1406
  	if (addtl && 0 < addtl->len)
  		list_add_tail(&addtl->list, &addtllist);
541af946f   Stephan Mueller   crypto: drbg - SP...
1407
  	/* 9.3.1 step 8 and 10 */
76899a41f   Stephan Mueller   crypto: drbg - re...
1408
  	len = drbg->d_ops->generate(drbg, buf, buflen, &addtllist);
541af946f   Stephan Mueller   crypto: drbg - SP...
1409
1410
  
  	/* 10.1.1.4 step 6, 10.1.2.5 step 7, 10.2.1.5.2 step 7 */
76899a41f   Stephan Mueller   crypto: drbg - re...
1411
  	drbg->reseed_ctr++;
541af946f   Stephan Mueller   crypto: drbg - SP...
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
  	if (0 >= len)
  		goto err;
  
  	/*
  	 * Section 11.3.3 requires to re-perform self tests after some
  	 * generated random numbers. The chosen value after which self
  	 * test is performed is arbitrary, but it should be reasonable.
  	 * However, we do not perform the self tests because of the following
  	 * reasons: it is mathematically impossible that the initial self tests
  	 * were successfully and the following are not. If the initial would
  	 * pass and the following would not, the kernel integrity is violated.
  	 * In this case, the entire kernel operation is questionable and it
  	 * is unlikely that the integrity violation only affects the
  	 * correct operation of the DRBG.
  	 *
  	 * Albeit the following code is commented out, it is provided in
  	 * case somebody has a need to implement the test of 11.3.3.
  	 */
  #if 0
76899a41f   Stephan Mueller   crypto: drbg - re...
1431
  	if (drbg->reseed_ctr && !(drbg->reseed_ctr % 4096)) {
541af946f   Stephan Mueller   crypto: drbg - SP...
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
  		int err = 0;
  		pr_devel("DRBG: start to perform self test
  ");
  		if (drbg->core->flags & DRBG_HMAC)
  			err = alg_test("drbg_pr_hmac_sha256",
  				       "drbg_pr_hmac_sha256", 0, 0);
  		else if (drbg->core->flags & DRBG_CTR)
  			err = alg_test("drbg_pr_ctr_aes128",
  				       "drbg_pr_ctr_aes128", 0, 0);
  		else
  			err = alg_test("drbg_pr_sha256",
  				       "drbg_pr_sha256", 0, 0);
  		if (err) {
  			pr_err("DRBG: periodical self test failed
  ");
  			/*
  			 * uninstantiate implies that from now on, only errors
  			 * are returned when reusing this DRBG cipher handle
  			 */
  			drbg_uninstantiate(drbg);
541af946f   Stephan Mueller   crypto: drbg - SP...
1452
1453
1454
1455
1456
1457
1458
  			return 0;
  		} else {
  			pr_devel("DRBG: self test successful
  ");
  		}
  	}
  #endif
cde001e4c   Stephan Mueller   crypto: rng - RNG...
1459
1460
1461
1462
1463
  	/*
  	 * All operations were successful, return 0 as mandated by
  	 * the kernel crypto API interface.
  	 */
  	len = 0;
541af946f   Stephan Mueller   crypto: drbg - SP...
1464
  err:
541af946f   Stephan Mueller   crypto: drbg - SP...
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
  	return len;
  }
  
  /*
   * Wrapper around drbg_generate which can pull arbitrary long strings
   * from the DRBG without hitting the maximum request limitation.
   *
   * Parameters: see drbg_generate
   * Return codes: see drbg_generate -- if one drbg_generate request fails,
   *		 the entire drbg_generate_long request fails
   */
  static int drbg_generate_long(struct drbg_state *drbg,
  			      unsigned char *buf, unsigned int buflen,
  			      struct drbg_string *addtl)
  {
082eb10ba   Stephan Mueller   crypto: drbg - fi...
1480
  	unsigned int len = 0;
541af946f   Stephan Mueller   crypto: drbg - SP...
1481
1482
  	unsigned int slice = 0;
  	do {
082eb10ba   Stephan Mueller   crypto: drbg - fi...
1483
  		int err = 0;
541af946f   Stephan Mueller   crypto: drbg - SP...
1484
1485
1486
  		unsigned int chunk = 0;
  		slice = ((buflen - len) / drbg_max_request_bytes(drbg));
  		chunk = slice ? drbg_max_request_bytes(drbg) : (buflen - len);
76899a41f   Stephan Mueller   crypto: drbg - re...
1487
  		mutex_lock(&drbg->drbg_mutex);
082eb10ba   Stephan Mueller   crypto: drbg - fi...
1488
  		err = drbg_generate(drbg, buf + len, chunk, addtl);
76899a41f   Stephan Mueller   crypto: drbg - re...
1489
  		mutex_unlock(&drbg->drbg_mutex);
082eb10ba   Stephan Mueller   crypto: drbg - fi...
1490
1491
1492
  		if (0 > err)
  			return err;
  		len += chunk;
ce5481d01   Stephan Mueller   crypto: drbg - fi...
1493
  	} while (slice > 0 && (len < buflen));
082eb10ba   Stephan Mueller   crypto: drbg - fi...
1494
  	return 0;
541af946f   Stephan Mueller   crypto: drbg - SP...
1495
  }
57225e679   Stephan Mueller   crypto: drbg - Us...
1496
1497
  static int drbg_prepare_hrng(struct drbg_state *drbg)
  {
57225e679   Stephan Mueller   crypto: drbg - Us...
1498
1499
1500
  	/* We do not need an HRNG in test mode. */
  	if (list_empty(&drbg->test_data.list))
  		return 0;
97f2650e5   Stephan Müller   crypto: drbg - al...
1501
  	drbg->jent = crypto_alloc_rng("jitterentropy_rng", 0, 0);
e61717947   Nicolai Stange   crypto: drbg - ma...
1502
  	return 0;
57225e679   Stephan Mueller   crypto: drbg - Us...
1503
  }
541af946f   Stephan Mueller   crypto: drbg - SP...
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
  /*
   * DRBG instantiation function as required by SP800-90A - this function
   * sets up the DRBG handle, performs the initial seeding and all sanity
   * checks required by SP800-90A
   *
   * @drbg memory of state -- if NULL, new memory is allocated
   * @pers Personalization string that is mixed into state, may be NULL -- note
   *	 the entropy is pulled by the DRBG internally unconditionally
   *	 as defined in SP800-90A. The additional input is mixed into
   *	 the state in addition to the pulled entropy.
   * @coreref reference to core
   * @pr prediction resistance enabled
   *
   * return
   *	0 on success
   *	error value otherwise
   */
  static int drbg_instantiate(struct drbg_state *drbg, struct drbg_string *pers,
  			    int coreref, bool pr)
  {
2a57e4241   Herbert Xu   crypto: drbg - Do...
1524
1525
  	int ret;
  	bool reseed = true;
541af946f   Stephan Mueller   crypto: drbg - SP...
1526
1527
1528
1529
  
  	pr_devel("DRBG: Initializing DRBG core %d with prediction resistance "
  		 "%s
  ", coreref, pr ? "enabled" : "disabled");
76899a41f   Stephan Mueller   crypto: drbg - re...
1530
  	mutex_lock(&drbg->drbg_mutex);
541af946f   Stephan Mueller   crypto: drbg - SP...
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
  
  	/* 9.1 step 1 is implicit with the selected DRBG type */
  
  	/*
  	 * 9.1 step 2 is implicit as caller can select prediction resistance
  	 * and the flag is copied into drbg->flags --
  	 * all DRBG types support prediction resistance
  	 */
  
  	/* 9.1 step 4 is implicit in  drbg_sec_strength */
2a57e4241   Herbert Xu   crypto: drbg - Do...
1541
1542
1543
  	if (!drbg->core) {
  		drbg->core = &drbg_cores[coreref];
  		drbg->pr = pr;
fa996803b   Nicolai Stange   crypto: drbg - pr...
1544
  		drbg->seeded = DRBG_SEED_STATE_UNSEEDED;
42ea507fa   Stephan Mueller   crypto: drbg - re...
1545
  		drbg->reseed_threshold = drbg_max_requests(drbg);
541af946f   Stephan Mueller   crypto: drbg - SP...
1546

2a57e4241   Herbert Xu   crypto: drbg - Do...
1547
1548
1549
  		ret = drbg_alloc_state(drbg);
  		if (ret)
  			goto unlock;
57225e679   Stephan Mueller   crypto: drbg - Us...
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
  		ret = drbg_prepare_hrng(drbg);
  		if (ret)
  			goto free_everything;
  
  		if (IS_ERR(drbg->jent)) {
  			ret = PTR_ERR(drbg->jent);
  			drbg->jent = NULL;
  			if (fips_enabled || ret != -ENOENT)
  				goto free_everything;
  			pr_info("DRBG: Continuing without Jitter RNG
  ");
  		}
2a57e4241   Herbert Xu   crypto: drbg - Do...
1562
1563
1564
1565
  		reseed = false;
  	}
  
  	ret = drbg_seed(drbg, pers, reseed);
57225e679   Stephan Mueller   crypto: drbg - Us...
1566
1567
  	if (ret && !reseed)
  		goto free_everything;
541af946f   Stephan Mueller   crypto: drbg - SP...
1568

76899a41f   Stephan Mueller   crypto: drbg - re...
1569
  	mutex_unlock(&drbg->drbg_mutex);
2a57e4241   Herbert Xu   crypto: drbg - Do...
1570
  	return ret;
541af946f   Stephan Mueller   crypto: drbg - SP...
1571

76899a41f   Stephan Mueller   crypto: drbg - re...
1572
1573
  unlock:
  	mutex_unlock(&drbg->drbg_mutex);
541af946f   Stephan Mueller   crypto: drbg - SP...
1574
  	return ret;
57225e679   Stephan Mueller   crypto: drbg - Us...
1575
1576
1577
1578
1579
  
  free_everything:
  	mutex_unlock(&drbg->drbg_mutex);
  	drbg_uninstantiate(drbg);
  	return ret;
541af946f   Stephan Mueller   crypto: drbg - SP...
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
  }
  
  /*
   * DRBG uninstantiate function as required by SP800-90A - this function
   * frees all buffers and the DRBG handle
   *
   * @drbg DRBG state handle
   *
   * return
   *	0 on success
   */
  static int drbg_uninstantiate(struct drbg_state *drbg)
  {
819966c06   Stephan Müller   crypto: drbg - al...
1593
1594
1595
  	if (!IS_ERR_OR_NULL(drbg->jent))
  		crypto_free_rng(drbg->jent);
  	drbg->jent = NULL;
2a57e4241   Herbert Xu   crypto: drbg - Do...
1596
1597
  	if (drbg->d_ops)
  		drbg->d_ops->crypto_fini(drbg);
541af946f   Stephan Mueller   crypto: drbg - SP...
1598
1599
  	drbg_dealloc_state(drbg);
  	/* no scrubbing of test_data -- this shall survive an uninstantiate */
541af946f   Stephan Mueller   crypto: drbg - SP...
1600
1601
1602
1603
1604
1605
1606
  	return 0;
  }
  
  /*
   * Helper function for setting the test data in the DRBG
   *
   * @drbg DRBG state handle
8fded5925   Herbert Xu   crypto: drbg - Co...
1607
1608
   * @data test data
   * @len test data length
541af946f   Stephan Mueller   crypto: drbg - SP...
1609
   */
8fded5925   Herbert Xu   crypto: drbg - Co...
1610
1611
  static void drbg_kcapi_set_entropy(struct crypto_rng *tfm,
  				   const u8 *data, unsigned int len)
541af946f   Stephan Mueller   crypto: drbg - SP...
1612
  {
8fded5925   Herbert Xu   crypto: drbg - Co...
1613
1614
1615
1616
  	struct drbg_state *drbg = crypto_rng_ctx(tfm);
  
  	mutex_lock(&drbg->drbg_mutex);
  	drbg_string_fill(&drbg->test_data, data, len);
76899a41f   Stephan Mueller   crypto: drbg - re...
1617
  	mutex_unlock(&drbg->drbg_mutex);
541af946f   Stephan Mueller   crypto: drbg - SP...
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
  }
  
  /***************************************************************
   * Kernel crypto API cipher invocations requested by DRBG
   ***************************************************************/
  
  #if defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_HMAC)
  struct sdesc {
  	struct shash_desc shash;
  	char ctx[];
  };
  
  static int drbg_init_hash_kernel(struct drbg_state *drbg)
  {
  	struct sdesc *sdesc;
  	struct crypto_shash *tfm;
  
  	tfm = crypto_alloc_shash(drbg->core->backend_cra_name, 0, 0);
  	if (IS_ERR(tfm)) {
593dfbd9c   Sergey Senozhatsky   crypto: drbg - re...
1637
1638
1639
  		pr_info("DRBG: could not allocate digest TFM handle: %s
  ",
  				drbg->core->backend_cra_name);
541af946f   Stephan Mueller   crypto: drbg - SP...
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
  		return PTR_ERR(tfm);
  	}
  	BUG_ON(drbg_blocklen(drbg) != crypto_shash_digestsize(tfm));
  	sdesc = kzalloc(sizeof(struct shash_desc) + crypto_shash_descsize(tfm),
  			GFP_KERNEL);
  	if (!sdesc) {
  		crypto_free_shash(tfm);
  		return -ENOMEM;
  	}
  
  	sdesc->shash.tfm = tfm;
541af946f   Stephan Mueller   crypto: drbg - SP...
1651
  	drbg->priv_data = sdesc;
3cfc3b972   Stephan Mueller   crypto: drbg - us...
1652
1653
  
  	return crypto_shash_alignmask(tfm);
541af946f   Stephan Mueller   crypto: drbg - SP...
1654
1655
1656
1657
1658
1659
1660
  }
  
  static int drbg_fini_hash_kernel(struct drbg_state *drbg)
  {
  	struct sdesc *sdesc = (struct sdesc *)drbg->priv_data;
  	if (sdesc) {
  		crypto_free_shash(sdesc->shash.tfm);
453431a54   Waiman Long   mm, treewide: ren...
1661
  		kfree_sensitive(sdesc);
541af946f   Stephan Mueller   crypto: drbg - SP...
1662
1663
1664
1665
  	}
  	drbg->priv_data = NULL;
  	return 0;
  }
4218ebe8c   Stephan Mueller   crypto: drbg - se...
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
  static void drbg_kcapi_hmacsetkey(struct drbg_state *drbg,
  				  const unsigned char *key)
  {
  	struct sdesc *sdesc = (struct sdesc *)drbg->priv_data;
  
  	crypto_shash_setkey(sdesc->shash.tfm, key, drbg_statelen(drbg));
  }
  
  static int drbg_kcapi_hash(struct drbg_state *drbg, unsigned char *outval,
  			   const struct list_head *in)
541af946f   Stephan Mueller   crypto: drbg - SP...
1676
1677
  {
  	struct sdesc *sdesc = (struct sdesc *)drbg->priv_data;
8c9871660   Stephan Mueller   crypto: drbg - us...
1678
  	struct drbg_string *input = NULL;
541af946f   Stephan Mueller   crypto: drbg - SP...
1679

541af946f   Stephan Mueller   crypto: drbg - SP...
1680
  	crypto_shash_init(&sdesc->shash);
8c9871660   Stephan Mueller   crypto: drbg - us...
1681
1682
  	list_for_each_entry(input, in, list)
  		crypto_shash_update(&sdesc->shash, input->buf, input->len);
541af946f   Stephan Mueller   crypto: drbg - SP...
1683
1684
1685
1686
1687
  	return crypto_shash_final(&sdesc->shash, outval);
  }
  #endif /* (CONFIG_CRYPTO_DRBG_HASH || CONFIG_CRYPTO_DRBG_HMAC) */
  
  #ifdef CONFIG_CRYPTO_DRBG_CTR
355912852   Stephan Mueller   crypto: drbg - us...
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
  static int drbg_fini_sym_kernel(struct drbg_state *drbg)
  {
  	struct crypto_cipher *tfm =
  		(struct crypto_cipher *)drbg->priv_data;
  	if (tfm)
  		crypto_free_cipher(tfm);
  	drbg->priv_data = NULL;
  
  	if (drbg->ctr_handle)
  		crypto_free_skcipher(drbg->ctr_handle);
  	drbg->ctr_handle = NULL;
  
  	if (drbg->ctr_req)
88f1d316b   Wu Fengguang   crypto: drbg - fi...
1701
  		skcipher_request_free(drbg->ctr_req);
355912852   Stephan Mueller   crypto: drbg - us...
1702
  	drbg->ctr_req = NULL;
510298121   Stephan Mueller   crypto: drbg - pr...
1703
1704
  	kfree(drbg->outscratchpadbuf);
  	drbg->outscratchpadbuf = NULL;
355912852   Stephan Mueller   crypto: drbg - us...
1705
1706
  	return 0;
  }
541af946f   Stephan Mueller   crypto: drbg - SP...
1707
1708
  static int drbg_init_sym_kernel(struct drbg_state *drbg)
  {
04bcbfcf7   Stephan Mueller   crypto: drbg - us...
1709
  	struct crypto_cipher *tfm;
355912852   Stephan Mueller   crypto: drbg - us...
1710
1711
1712
1713
  	struct crypto_skcipher *sk_tfm;
  	struct skcipher_request *req;
  	unsigned int alignmask;
  	char ctr_name[CRYPTO_MAX_ALG_NAME];
541af946f   Stephan Mueller   crypto: drbg - SP...
1714

04bcbfcf7   Stephan Mueller   crypto: drbg - us...
1715
  	tfm = crypto_alloc_cipher(drbg->core->backend_cra_name, 0, 0);
541af946f   Stephan Mueller   crypto: drbg - SP...
1716
  	if (IS_ERR(tfm)) {
593dfbd9c   Sergey Senozhatsky   crypto: drbg - re...
1717
1718
1719
  		pr_info("DRBG: could not allocate cipher TFM handle: %s
  ",
  				drbg->core->backend_cra_name);
541af946f   Stephan Mueller   crypto: drbg - SP...
1720
1721
  		return PTR_ERR(tfm);
  	}
04bcbfcf7   Stephan Mueller   crypto: drbg - us...
1722
  	BUG_ON(drbg_blocklen(drbg) != crypto_cipher_blocksize(tfm));
541af946f   Stephan Mueller   crypto: drbg - SP...
1723
  	drbg->priv_data = tfm;
541af946f   Stephan Mueller   crypto: drbg - SP...
1724

355912852   Stephan Mueller   crypto: drbg - us...
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
  	if (snprintf(ctr_name, CRYPTO_MAX_ALG_NAME, "ctr(%s)",
  	    drbg->core->backend_cra_name) >= CRYPTO_MAX_ALG_NAME) {
  		drbg_fini_sym_kernel(drbg);
  		return -EINVAL;
  	}
  	sk_tfm = crypto_alloc_skcipher(ctr_name, 0, 0);
  	if (IS_ERR(sk_tfm)) {
  		pr_info("DRBG: could not allocate CTR cipher TFM handle: %s
  ",
  				ctr_name);
  		drbg_fini_sym_kernel(drbg);
  		return PTR_ERR(sk_tfm);
  	}
  	drbg->ctr_handle = sk_tfm;
85a2dea4b   Gilad Ben-Yossef   crypto: drbg - mo...
1739
  	crypto_init_wait(&drbg->ctr_wait);
355912852   Stephan Mueller   crypto: drbg - us...
1740
1741
1742
1743
1744
1745
  
  	req = skcipher_request_alloc(sk_tfm, GFP_KERNEL);
  	if (!req) {
  		pr_info("DRBG: could not allocate request queue
  ");
  		drbg_fini_sym_kernel(drbg);
01ac94580   Dan Carpenter   crypto: drbg - fi...
1746
  		return -ENOMEM;
355912852   Stephan Mueller   crypto: drbg - us...
1747
1748
  	}
  	drbg->ctr_req = req;
85a2dea4b   Gilad Ben-Yossef   crypto: drbg - mo...
1749
1750
1751
  	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG |
  						CRYPTO_TFM_REQ_MAY_SLEEP,
  					crypto_req_done, &drbg->ctr_wait);
355912852   Stephan Mueller   crypto: drbg - us...
1752
1753
  
  	alignmask = crypto_skcipher_alignmask(sk_tfm);
510298121   Stephan Mueller   crypto: drbg - pr...
1754
1755
1756
1757
1758
1759
1760
1761
  	drbg->outscratchpadbuf = kmalloc(DRBG_OUTSCRATCHLEN + alignmask,
  					 GFP_KERNEL);
  	if (!drbg->outscratchpadbuf) {
  		drbg_fini_sym_kernel(drbg);
  		return -ENOMEM;
  	}
  	drbg->outscratchpad = (u8 *)PTR_ALIGN(drbg->outscratchpadbuf,
  					      alignmask + 1);
cf862cbc8   Stephan Mueller   crypto: drbg - el...
1762
  	sg_init_table(&drbg->sg_in, 1);
43490e804   Stephan Müller   crypto: drbg - in...
1763
  	sg_init_one(&drbg->sg_out, drbg->outscratchpad, DRBG_OUTSCRATCHLEN);
cf862cbc8   Stephan Mueller   crypto: drbg - el...
1764

3cfc3b972   Stephan Mueller   crypto: drbg - us...
1765
  	return alignmask;
541af946f   Stephan Mueller   crypto: drbg - SP...
1766
  }
ed494d4fa   Stephan Mueller   crypto: drbg - re...
1767
1768
  static void drbg_kcapi_symsetkey(struct drbg_state *drbg,
  				 const unsigned char *key)
541af946f   Stephan Mueller   crypto: drbg - SP...
1769
  {
04bcbfcf7   Stephan Mueller   crypto: drbg - us...
1770
1771
  	struct crypto_cipher *tfm =
  		(struct crypto_cipher *)drbg->priv_data;
541af946f   Stephan Mueller   crypto: drbg - SP...
1772

04bcbfcf7   Stephan Mueller   crypto: drbg - us...
1773
  	crypto_cipher_setkey(tfm, key, (drbg_keylen(drbg)));
ed494d4fa   Stephan Mueller   crypto: drbg - re...
1774
1775
1776
1777
1778
1779
1780
  }
  
  static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,
  			  const struct drbg_string *in)
  {
  	struct crypto_cipher *tfm =
  		(struct crypto_cipher *)drbg->priv_data;
04bcbfcf7   Stephan Mueller   crypto: drbg - us...
1781
1782
1783
1784
  	/* there is only component in *in */
  	BUG_ON(in->len < drbg_blocklen(drbg));
  	crypto_cipher_encrypt_one(tfm, outval, in->buf);
  	return 0;
541af946f   Stephan Mueller   crypto: drbg - SP...
1785
  }
355912852   Stephan Mueller   crypto: drbg - us...
1786

a07203fbf   Stephan Mueller   crypto: drbg - us...
1787
1788
1789
  static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
  			      u8 *inbuf, u32 inlen,
  			      u8 *outbuf, u32 outlen)
355912852   Stephan Mueller   crypto: drbg - us...
1790
  {
cf862cbc8   Stephan Mueller   crypto: drbg - el...
1791
  	struct scatterlist *sg_in = &drbg->sg_in, *sg_out = &drbg->sg_out;
43490e804   Stephan Müller   crypto: drbg - in...
1792
  	u32 scratchpad_use = min_t(u32, outlen, DRBG_OUTSCRATCHLEN);
510298121   Stephan Mueller   crypto: drbg - pr...
1793
  	int ret;
355912852   Stephan Mueller   crypto: drbg - us...
1794

43490e804   Stephan Müller   crypto: drbg - in...
1795
1796
1797
1798
1799
1800
1801
1802
1803
  	if (inbuf) {
  		/* Use caller-provided input buffer */
  		sg_set_buf(sg_in, inbuf, inlen);
  	} else {
  		/* Use scratchpad for in-place operation */
  		inlen = scratchpad_use;
  		memset(drbg->outscratchpad, 0, scratchpad_use);
  		sg_set_buf(sg_in, drbg->outscratchpad, scratchpad_use);
  	}
355912852   Stephan Mueller   crypto: drbg - us...
1804
1805
  
  	while (outlen) {
510298121   Stephan Mueller   crypto: drbg - pr...
1806
  		u32 cryptlen = min3(inlen, outlen, (u32)DRBG_OUTSCRATCHLEN);
355912852   Stephan Mueller   crypto: drbg - us...
1807

510298121   Stephan Mueller   crypto: drbg - pr...
1808
  		/* Output buffer may not be valid for SGL, use scratchpad */
cf862cbc8   Stephan Mueller   crypto: drbg - el...
1809
  		skcipher_request_set_crypt(drbg->ctr_req, sg_in, sg_out,
355912852   Stephan Mueller   crypto: drbg - us...
1810
  					   cryptlen, drbg->V);
85a2dea4b   Gilad Ben-Yossef   crypto: drbg - mo...
1811
1812
1813
  		ret = crypto_wait_req(crypto_skcipher_encrypt(drbg->ctr_req),
  					&drbg->ctr_wait);
  		if (ret)
510298121   Stephan Mueller   crypto: drbg - pr...
1814
  			goto out;
85a2dea4b   Gilad Ben-Yossef   crypto: drbg - mo...
1815
1816
  
  		crypto_init_wait(&drbg->ctr_wait);
355912852   Stephan Mueller   crypto: drbg - us...
1817

510298121   Stephan Mueller   crypto: drbg - pr...
1818
  		memcpy(outbuf, drbg->outscratchpad, cryptlen);
43490e804   Stephan Müller   crypto: drbg - in...
1819
  		memzero_explicit(drbg->outscratchpad, cryptlen);
510298121   Stephan Mueller   crypto: drbg - pr...
1820

355912852   Stephan Mueller   crypto: drbg - us...
1821
  		outlen -= cryptlen;
8ff4c191d   Stephan Mueller   crypto: drbg - ad...
1822
  		outbuf += cryptlen;
355912852   Stephan Mueller   crypto: drbg - us...
1823
  	}
510298121   Stephan Mueller   crypto: drbg - pr...
1824
  	ret = 0;
355912852   Stephan Mueller   crypto: drbg - us...
1825

510298121   Stephan Mueller   crypto: drbg - pr...
1826
  out:
510298121   Stephan Mueller   crypto: drbg - pr...
1827
  	return ret;
355912852   Stephan Mueller   crypto: drbg - us...
1828
  }
541af946f   Stephan Mueller   crypto: drbg - SP...
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
  #endif /* CONFIG_CRYPTO_DRBG_CTR */
  
  /***************************************************************
   * Kernel crypto API interface to register DRBG
   ***************************************************************/
  
  /*
   * Look up the DRBG flags by given kernel crypto API cra_name
   * The code uses the drbg_cores definition to do this
   *
   * @cra_name kernel crypto API cra_name
   * @coreref reference to integer which is filled with the pointer to
   *  the applicable core
   * @pr reference for setting prediction resistance
   *
   * return: flags
   */
  static inline void drbg_convert_tfm_core(const char *cra_driver_name,
  					 int *coreref, bool *pr)
  {
  	int i = 0;
  	size_t start = 0;
  	int len = 0;
  
  	*pr = true;
  	/* disassemble the names */
  	if (!memcmp(cra_driver_name, "drbg_nopr_", 10)) {
  		start = 10;
  		*pr = false;
  	} else if (!memcmp(cra_driver_name, "drbg_pr_", 8)) {
  		start = 8;
  	} else {
  		return;
  	}
  
  	/* remove the first part */
  	len = strlen(cra_driver_name) - start;
  	for (i = 0; ARRAY_SIZE(drbg_cores) > i; i++) {
  		if (!memcmp(cra_driver_name + start, drbg_cores[i].cra_name,
  			    len)) {
  			*coreref = i;
  			return;
  		}
  	}
  }
  
  static int drbg_kcapi_init(struct crypto_tfm *tfm)
  {
  	struct drbg_state *drbg = crypto_tfm_ctx(tfm);
541af946f   Stephan Mueller   crypto: drbg - SP...
1878

76899a41f   Stephan Mueller   crypto: drbg - re...
1879
  	mutex_init(&drbg->drbg_mutex);
2a57e4241   Herbert Xu   crypto: drbg - Do...
1880
1881
  
  	return 0;
541af946f   Stephan Mueller   crypto: drbg - SP...
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
  }
  
  static void drbg_kcapi_cleanup(struct crypto_tfm *tfm)
  {
  	drbg_uninstantiate(crypto_tfm_ctx(tfm));
  }
  
  /*
   * Generate random numbers invoked by the kernel crypto API:
   * The API of the kernel crypto API is extended as follows:
   *
8fded5925   Herbert Xu   crypto: drbg - Co...
1893
1894
1895
1896
   * src is additional input supplied to the RNG.
   * slen is the length of src.
   * dst is the output buffer where random data is to be stored.
   * dlen is the length of dst.
541af946f   Stephan Mueller   crypto: drbg - SP...
1897
   */
8fded5925   Herbert Xu   crypto: drbg - Co...
1898
1899
1900
  static int drbg_kcapi_random(struct crypto_rng *tfm,
  			     const u8 *src, unsigned int slen,
  			     u8 *dst, unsigned int dlen)
541af946f   Stephan Mueller   crypto: drbg - SP...
1901
1902
  {
  	struct drbg_state *drbg = crypto_rng_ctx(tfm);
8fded5925   Herbert Xu   crypto: drbg - Co...
1903
1904
1905
1906
  	struct drbg_string *addtl = NULL;
  	struct drbg_string string;
  
  	if (slen) {
8c9871660   Stephan Mueller   crypto: drbg - us...
1907
  		/* linked list variable is now local to allow modification */
8fded5925   Herbert Xu   crypto: drbg - Co...
1908
1909
  		drbg_string_fill(&string, src, slen);
  		addtl = &string;
541af946f   Stephan Mueller   crypto: drbg - SP...
1910
  	}
8fded5925   Herbert Xu   crypto: drbg - Co...
1911
1912
  
  	return drbg_generate_long(drbg, dst, dlen, addtl);
541af946f   Stephan Mueller   crypto: drbg - SP...
1913
1914
1915
  }
  
  /*
2a57e4241   Herbert Xu   crypto: drbg - Do...
1916
   * Seed the DRBG invoked by the kernel crypto API
541af946f   Stephan Mueller   crypto: drbg - SP...
1917
   */
8fded5925   Herbert Xu   crypto: drbg - Co...
1918
1919
  static int drbg_kcapi_seed(struct crypto_rng *tfm,
  			   const u8 *seed, unsigned int slen)
541af946f   Stephan Mueller   crypto: drbg - SP...
1920
1921
1922
1923
  {
  	struct drbg_state *drbg = crypto_rng_ctx(tfm);
  	struct crypto_tfm *tfm_base = crypto_rng_tfm(tfm);
  	bool pr = false;
8fded5925   Herbert Xu   crypto: drbg - Co...
1924
1925
  	struct drbg_string string;
  	struct drbg_string *seed_string = NULL;
541af946f   Stephan Mueller   crypto: drbg - SP...
1926
  	int coreref = 0;
541af946f   Stephan Mueller   crypto: drbg - SP...
1927
1928
1929
  	drbg_convert_tfm_core(crypto_tfm_alg_driver_name(tfm_base), &coreref,
  			      &pr);
  	if (0 < slen) {
8fded5925   Herbert Xu   crypto: drbg - Co...
1930
1931
  		drbg_string_fill(&string, seed, slen);
  		seed_string = &string;
541af946f   Stephan Mueller   crypto: drbg - SP...
1932
  	}
8fded5925   Herbert Xu   crypto: drbg - Co...
1933
1934
  
  	return drbg_instantiate(drbg, seed_string, coreref, pr);
541af946f   Stephan Mueller   crypto: drbg - SP...
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
  }
  
  /***************************************************************
   * Kernel module: code to load the module
   ***************************************************************/
  
  /*
   * Tests as defined in 11.3.2 in addition to the cipher tests: testing
   * of the error handling.
   *
   * Note: testing of failing seed source as defined in 11.3.2 is not applicable
   * as seed source of get_random_bytes does not fail.
   *
   * Note 2: There is no sensible way of testing the reseed counter
   * enforcement, so skip it.
   */
  static inline int __init drbg_healthcheck_sanity(void)
  {
541af946f   Stephan Mueller   crypto: drbg - SP...
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
  	int len = 0;
  #define OUTBUFLEN 16
  	unsigned char buf[OUTBUFLEN];
  	struct drbg_state *drbg = NULL;
  	int ret = -EFAULT;
  	int rc = -EFAULT;
  	bool pr = false;
  	int coreref = 0;
  	struct drbg_string addtl;
  	size_t max_addtllen, max_request_bytes;
  
  	/* only perform test in FIPS mode */
  	if (!fips_enabled)
  		return 0;
  
  #ifdef CONFIG_CRYPTO_DRBG_CTR
  	drbg_convert_tfm_core("drbg_nopr_ctr_aes128", &coreref, &pr);
e25e47ec3   Stephan Mueller   crypto: drbg - cl...
1970
  #elif defined CONFIG_CRYPTO_DRBG_HASH
541af946f   Stephan Mueller   crypto: drbg - SP...
1971
1972
1973
1974
1975
1976
1977
1978
  	drbg_convert_tfm_core("drbg_nopr_sha256", &coreref, &pr);
  #else
  	drbg_convert_tfm_core("drbg_nopr_hmac_sha256", &coreref, &pr);
  #endif
  
  	drbg = kzalloc(sizeof(struct drbg_state), GFP_KERNEL);
  	if (!drbg)
  		return -ENOMEM;
e11a75481   Herbert Xu   crypto: drbg - In...
1979
  	mutex_init(&drbg->drbg_mutex);
d89a67134   Stephan Mueller   crypto: drbg - do...
1980
1981
  	drbg->core = &drbg_cores[coreref];
  	drbg->reseed_threshold = drbg_max_requests(drbg);
e11a75481   Herbert Xu   crypto: drbg - In...
1982

541af946f   Stephan Mueller   crypto: drbg - SP...
1983
1984
1985
1986
1987
1988
1989
  	/*
  	 * if the following tests fail, it is likely that there is a buffer
  	 * overflow as buf is much smaller than the requested or provided
  	 * string lengths -- in case the error handling does not succeed
  	 * we may get an OOPS. And we want to get an OOPS as this is a
  	 * grave bug.
  	 */
541af946f   Stephan Mueller   crypto: drbg - SP...
1990
1991
1992
1993
1994
1995
1996
1997
1998
  	max_addtllen = drbg_max_addtl(drbg);
  	max_request_bytes = drbg_max_request_bytes(drbg);
  	drbg_string_fill(&addtl, buf, max_addtllen + 1);
  	/* overflow addtllen with additonal info string */
  	len = drbg_generate(drbg, buf, OUTBUFLEN, &addtl);
  	BUG_ON(0 < len);
  	/* overflow max_bits */
  	len = drbg_generate(drbg, buf, (max_request_bytes + 1), NULL);
  	BUG_ON(0 < len);
541af946f   Stephan Mueller   crypto: drbg - SP...
1999
2000
  
  	/* overflow max addtllen with personalization string */
d89a67134   Stephan Mueller   crypto: drbg - do...
2001
  	ret = drbg_seed(drbg, &addtl, false);
541af946f   Stephan Mueller   crypto: drbg - SP...
2002
  	BUG_ON(0 == ret);
541af946f   Stephan Mueller   crypto: drbg - SP...
2003
2004
2005
2006
2007
2008
  	/* all tests passed */
  	rc = 0;
  
  	pr_devel("DRBG: Sanity tests for failure code paths successfully "
  		 "completed
  ");
d89a67134   Stephan Mueller   crypto: drbg - do...
2009
  	kfree(drbg);
541af946f   Stephan Mueller   crypto: drbg - SP...
2010
  	return rc;
541af946f   Stephan Mueller   crypto: drbg - SP...
2011
  }
8fded5925   Herbert Xu   crypto: drbg - Co...
2012
  static struct rng_alg drbg_algs[22];
541af946f   Stephan Mueller   crypto: drbg - SP...
2013
2014
2015
2016
2017
2018
  
  /*
   * Fill the array drbg_algs used to register the different DRBGs
   * with the kernel crypto API. To fill the array, the information
   * from drbg_cores[] is used.
   */
8fded5925   Herbert Xu   crypto: drbg - Co...
2019
  static inline void __init drbg_fill_array(struct rng_alg *alg,
541af946f   Stephan Mueller   crypto: drbg - SP...
2020
2021
2022
  					  const struct drbg_core *core, int pr)
  {
  	int pos = 0;
51ee14227   Herbert Xu   crypto: drbg - Ad...
2023
  	static int priority = 200;
541af946f   Stephan Mueller   crypto: drbg - SP...
2024

8fded5925   Herbert Xu   crypto: drbg - Co...
2025
  	memcpy(alg->base.cra_name, "stdrng", 6);
541af946f   Stephan Mueller   crypto: drbg - SP...
2026
  	if (pr) {
8fded5925   Herbert Xu   crypto: drbg - Co...
2027
  		memcpy(alg->base.cra_driver_name, "drbg_pr_", 8);
541af946f   Stephan Mueller   crypto: drbg - SP...
2028
2029
  		pos = 8;
  	} else {
8fded5925   Herbert Xu   crypto: drbg - Co...
2030
  		memcpy(alg->base.cra_driver_name, "drbg_nopr_", 10);
541af946f   Stephan Mueller   crypto: drbg - SP...
2031
2032
  		pos = 10;
  	}
8fded5925   Herbert Xu   crypto: drbg - Co...
2033
  	memcpy(alg->base.cra_driver_name + pos, core->cra_name,
541af946f   Stephan Mueller   crypto: drbg - SP...
2034
  	       strlen(core->cra_name));
8fded5925   Herbert Xu   crypto: drbg - Co...
2035
  	alg->base.cra_priority = priority;
541af946f   Stephan Mueller   crypto: drbg - SP...
2036
2037
2038
2039
2040
2041
2042
  	priority++;
  	/*
  	 * If FIPS mode enabled, the selected DRBG shall have the
  	 * highest cra_priority over other stdrng instances to ensure
  	 * it is selected.
  	 */
  	if (fips_enabled)
8fded5925   Herbert Xu   crypto: drbg - Co...
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
  		alg->base.cra_priority += 200;
  
  	alg->base.cra_ctxsize 	= sizeof(struct drbg_state);
  	alg->base.cra_module	= THIS_MODULE;
  	alg->base.cra_init	= drbg_kcapi_init;
  	alg->base.cra_exit	= drbg_kcapi_cleanup;
  	alg->generate		= drbg_kcapi_random;
  	alg->seed		= drbg_kcapi_seed;
  	alg->set_ent		= drbg_kcapi_set_entropy;
  	alg->seedsize		= 0;
541af946f   Stephan Mueller   crypto: drbg - SP...
2053
2054
2055
2056
2057
2058
  }
  
  static int __init drbg_init(void)
  {
  	unsigned int i = 0; /* pointer to drbg_algs */
  	unsigned int j = 0; /* pointer to drbg_cores */
1a45d7e34   Wei Yongjun   crypto: drbg - fi...
2059
  	int ret;
541af946f   Stephan Mueller   crypto: drbg - SP...
2060
2061
2062
2063
2064
2065
2066
  
  	ret = drbg_healthcheck_sanity();
  	if (ret)
  		return ret;
  
  	if (ARRAY_SIZE(drbg_cores) * 2 > ARRAY_SIZE(drbg_algs)) {
  		pr_info("DRBG: Cannot register all DRBG types"
a9089571f   Stephan Mueller   crypto: drbg - Fi...
2067
2068
  			"(slots needed: %zu, slots available: %zu)
  ",
541af946f   Stephan Mueller   crypto: drbg - SP...
2069
  			ARRAY_SIZE(drbg_cores) * 2, ARRAY_SIZE(drbg_algs));
1a45d7e34   Wei Yongjun   crypto: drbg - fi...
2070
  		return -EFAULT;
541af946f   Stephan Mueller   crypto: drbg - SP...
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
  	}
  
  	/*
  	 * each DRBG definition can be used with PR and without PR, thus
  	 * we instantiate each DRBG in drbg_cores[] twice.
  	 *
  	 * As the order of placing them into the drbg_algs array matters
  	 * (the later DRBGs receive a higher cra_priority) we register the
  	 * prediction resistance DRBGs first as the should not be too
  	 * interesting.
  	 */
  	for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
  		drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 1);
  	for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
  		drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 0);
8fded5925   Herbert Xu   crypto: drbg - Co...
2086
  	return crypto_register_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));
541af946f   Stephan Mueller   crypto: drbg - SP...
2087
  }
96956aef2   Fengguang Wu   crypto: drbg - dr...
2088
  static void __exit drbg_exit(void)
541af946f   Stephan Mueller   crypto: drbg - SP...
2089
  {
8fded5925   Herbert Xu   crypto: drbg - Co...
2090
  	crypto_unregister_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));
541af946f   Stephan Mueller   crypto: drbg - SP...
2091
  }
c4741b230   Eric Biggers   crypto: run initc...
2092
  subsys_initcall(drbg_init);
541af946f   Stephan Mueller   crypto: drbg - SP...
2093
  module_exit(drbg_exit);
e25e47ec3   Stephan Mueller   crypto: drbg - cl...
2094
2095
  #ifndef CRYPTO_DRBG_HASH_STRING
  #define CRYPTO_DRBG_HASH_STRING ""
541af946f   Stephan Mueller   crypto: drbg - SP...
2096
  #endif
e25e47ec3   Stephan Mueller   crypto: drbg - cl...
2097
2098
  #ifndef CRYPTO_DRBG_HMAC_STRING
  #define CRYPTO_DRBG_HMAC_STRING ""
541af946f   Stephan Mueller   crypto: drbg - SP...
2099
  #endif
e25e47ec3   Stephan Mueller   crypto: drbg - cl...
2100
2101
  #ifndef CRYPTO_DRBG_CTR_STRING
  #define CRYPTO_DRBG_CTR_STRING ""
541af946f   Stephan Mueller   crypto: drbg - SP...
2102
  #endif
e25e47ec3   Stephan Mueller   crypto: drbg - cl...
2103
2104
2105
2106
2107
2108
2109
  MODULE_LICENSE("GPL");
  MODULE_AUTHOR("Stephan Mueller <smueller@chronox.de>");
  MODULE_DESCRIPTION("NIST SP800-90A Deterministic Random Bit Generator (DRBG) "
  		   "using following cores: "
  		   CRYPTO_DRBG_HASH_STRING
  		   CRYPTO_DRBG_HMAC_STRING
  		   CRYPTO_DRBG_CTR_STRING);
51ee14227   Herbert Xu   crypto: drbg - Ad...
2110
  MODULE_ALIAS_CRYPTO("stdrng");
0eb76ba29   Ard Biesheuvel   crypto: remove ci...
2111
  MODULE_IMPORT_NS(CRYPTO_INTERNAL);