Searched refs:drbg (Results 1 - 5 of 5) sorted by relevance

/linux-4.4.14/crypto/
H A Ddrbg.c100 #include <crypto/drbg.h>
194 static int drbg_uninstantiate(struct drbg_state *drbg);
228 * @drbg DRBG handle
235 static bool drbg_fips_continuous_test(struct drbg_state *drbg, drbg_fips_continuous_test() argument
241 if (list_empty(&drbg->test_data.list)) drbg_fips_continuous_test()
246 if (!drbg->fips_primed) { drbg_fips_continuous_test()
248 memcpy(drbg->prev, buf, drbg_blocklen(drbg)); drbg_fips_continuous_test()
249 drbg->fips_primed = true; drbg_fips_continuous_test()
253 ret = memcmp(drbg->prev, buf, drbg_blocklen(drbg)); drbg_fips_continuous_test()
256 memcpy(drbg->prev, buf, drbg_blocklen(drbg)); drbg_fips_continuous_test()
297 static int drbg_kcapi_sym(struct drbg_state *drbg, const unsigned char *key,
299 static int drbg_init_sym_kernel(struct drbg_state *drbg);
300 static int drbg_fini_sym_kernel(struct drbg_state *drbg);
303 static int drbg_ctr_bcc(struct drbg_state *drbg, drbg_ctr_bcc() argument
312 drbg_string_fill(&data, out, drbg_blocklen(drbg)); drbg_ctr_bcc()
321 if (drbg_blocklen(drbg) == cnt) { list_for_each_entry()
323 ret = drbg_kcapi_sym(drbg, key, out, &data); list_for_each_entry()
335 ret = drbg_kcapi_sym(drbg, key, out, &data);
346 * start: drbg->scratchpad
347 * length: drbg_statelen(drbg) + drbg_blocklen(drbg)
354 * start: drbg->scratchpad +
355 * drbg_statelen(drbg) + drbg_blocklen(drbg)
356 * length: drbg_statelen(drbg)
360 * start: df_data + drbg_statelen(drbg)
361 * length: drbg_blocklen(drbg)
363 * start: pad + drbg_blocklen(drbg)
364 * length: drbg_blocklen(drbg)
366 * start: iv + drbg_blocklen(drbg)
367 * length: drbg_satelen(drbg) + drbg_blocklen(drbg)
369 * on. BCC operates blockwise. drbg_statelen(drbg)
375 * Therefore, add drbg_blocklen(drbg) to cover all
380 static int drbg_ctr_df(struct drbg_state *drbg, drbg_ctr_df() argument
389 unsigned char *pad = df_data + drbg_statelen(drbg); drbg_ctr_df()
390 unsigned char *iv = pad + drbg_blocklen(drbg); drbg_ctr_df()
391 unsigned char *temp = iv + drbg_blocklen(drbg); drbg_ctr_df()
407 memset(pad, 0, drbg_blocklen(drbg)); drbg_ctr_df()
408 memset(iv, 0, drbg_blocklen(drbg)); drbg_ctr_df()
425 padlen = (inputlen + sizeof(L_N) + 1) % (drbg_blocklen(drbg)); drbg_ctr_df()
428 padlen = drbg_blocklen(drbg) - padlen; drbg_ctr_df()
438 drbg_string_fill(&S1, iv, drbg_blocklen(drbg)); drbg_ctr_df()
447 while (templen < (drbg_keylen(drbg) + (drbg_blocklen(drbg)))) { drbg_ctr_df()
455 ret = drbg_ctr_bcc(drbg, temp + templen, K, &bcc_list); drbg_ctr_df()
460 templen += drbg_blocklen(drbg); drbg_ctr_df()
464 X = temp + (drbg_keylen(drbg)); drbg_ctr_df()
465 drbg_string_fill(&cipherin, X, drbg_blocklen(drbg)); drbg_ctr_df()
477 ret = drbg_kcapi_sym(drbg, temp, X, &cipherin); drbg_ctr_df()
480 blocklen = (drbg_blocklen(drbg) < drbg_ctr_df()
482 drbg_blocklen(drbg) : drbg_ctr_df()
492 memset(iv, 0, drbg_blocklen(drbg)); drbg_ctr_df()
493 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg)); drbg_ctr_df()
494 memset(pad, 0, drbg_blocklen(drbg)); drbg_ctr_df()
513 static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed, drbg_ctr_update() argument
518 unsigned char *temp = drbg->scratchpad; drbg_ctr_update()
519 unsigned char *df_data = drbg->scratchpad + drbg_statelen(drbg) + drbg_ctr_update()
520 drbg_blocklen(drbg); drbg_ctr_update()
526 memset(df_data, 0, drbg_statelen(drbg)); drbg_ctr_update()
530 ret = drbg_ctr_df(drbg, df_data, drbg_statelen(drbg), seed); drbg_ctr_update()
535 drbg_string_fill(&cipherin, drbg->V, drbg_blocklen(drbg)); drbg_ctr_update()
540 while (len < (drbg_statelen(drbg))) { drbg_ctr_update()
542 crypto_inc(drbg->V, drbg_blocklen(drbg)); drbg_ctr_update()
545 ret = drbg_kcapi_sym(drbg, drbg->C, temp + len, &cipherin); drbg_ctr_update()
549 len += drbg_blocklen(drbg); drbg_ctr_update()
555 for (len = 0; len < drbg_statelen(drbg); len++) { drbg_ctr_update()
561 memcpy(drbg->C, temp, drbg_keylen(drbg)); drbg_ctr_update()
563 memcpy(drbg->V, temp + drbg_keylen(drbg), drbg_blocklen(drbg)); drbg_ctr_update()
567 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg)); drbg_ctr_update()
569 memset(df_data, 0, drbg_statelen(drbg)); drbg_ctr_update()
578 static int drbg_ctr_generate(struct drbg_state *drbg, drbg_ctr_generate() argument
588 ret = drbg_ctr_update(drbg, addtl, 2); drbg_ctr_generate()
594 crypto_inc(drbg->V, drbg_blocklen(drbg)); drbg_ctr_generate()
595 drbg_string_fill(&data, drbg->V, drbg_blocklen(drbg)); drbg_ctr_generate()
599 ret = drbg_kcapi_sym(drbg, drbg->C, drbg->scratchpad, &data); drbg_ctr_generate()
604 outlen = (drbg_blocklen(drbg) < (buflen - len)) ? drbg_ctr_generate()
605 drbg_blocklen(drbg) : (buflen - len); drbg_ctr_generate()
606 if (!drbg_fips_continuous_test(drbg, drbg->scratchpad)) { drbg_ctr_generate()
608 crypto_inc(drbg->V, drbg_blocklen(drbg)); drbg_ctr_generate()
612 memcpy(buf + len, drbg->scratchpad, outlen); drbg_ctr_generate()
616 crypto_inc(drbg->V, drbg_blocklen(drbg)); drbg_ctr_generate()
620 ret = drbg_ctr_update(drbg, NULL, 3); drbg_ctr_generate()
625 memset(drbg->scratchpad, 0, drbg_blocklen(drbg)); drbg_ctr_generate()
642 static int drbg_kcapi_hash(struct drbg_state *drbg, const unsigned char *key,
644 static int drbg_init_hash_kernel(struct drbg_state *drbg);
645 static int drbg_fini_hash_kernel(struct drbg_state *drbg);
660 static int drbg_hmac_update(struct drbg_state *drbg, struct list_head *seed, drbg_hmac_update() argument
671 memset(drbg->V, 1, drbg_statelen(drbg)); drbg_hmac_update()
673 drbg_string_fill(&seed1, drbg->V, drbg_statelen(drbg)); drbg_hmac_update()
682 drbg_string_fill(&vdata, drbg->V, drbg_statelen(drbg)); drbg_hmac_update()
691 ret = drbg_kcapi_hash(drbg, drbg->C, drbg->C, &seedlist); drbg_hmac_update()
696 ret = drbg_kcapi_hash(drbg, drbg->C, drbg->V, &vdatalist); drbg_hmac_update()
709 static int drbg_hmac_generate(struct drbg_state *drbg, drbg_hmac_generate() argument
721 ret = drbg_hmac_update(drbg, addtl, 1); drbg_hmac_generate()
726 drbg_string_fill(&data, drbg->V, drbg_statelen(drbg)); drbg_hmac_generate()
731 ret = drbg_kcapi_hash(drbg, drbg->C, drbg->V, &datalist); drbg_hmac_generate()
734 outlen = (drbg_blocklen(drbg) < (buflen - len)) ? drbg_hmac_generate()
735 drbg_blocklen(drbg) : (buflen - len); drbg_hmac_generate()
736 if (!drbg_fips_continuous_test(drbg, drbg->V)) drbg_hmac_generate()
740 memcpy(buf + len, drbg->V, outlen); drbg_hmac_generate()
746 ret = drbg_hmac_update(drbg, addtl, 1); drbg_hmac_generate()
748 ret = drbg_hmac_update(drbg, NULL, 1); drbg_hmac_generate()
814 * start: drbg->scratchpad
815 * length: drbg_statelen(drbg)
817 * start: drbg->scratchpad + drbg_statelen(drbg)
818 * length: drbg_blocklen(drbg)
826 static int drbg_hash_df(struct drbg_state *drbg, drbg_hash_df() argument
833 unsigned char *tmp = drbg->scratchpad + drbg_statelen(drbg); drbg_hash_df()
848 ret = drbg_kcapi_hash(drbg, NULL, tmp, entropylist); drbg_hash_df()
853 blocklen = (drbg_blocklen(drbg) < (outlen - len)) ? drbg_hash_df()
854 drbg_blocklen(drbg) : (outlen - len); drbg_hash_df()
860 memset(tmp, 0, drbg_blocklen(drbg)); drbg_hash_df()
865 static int drbg_hash_update(struct drbg_state *drbg, struct list_head *seed, drbg_hash_update() argument
872 unsigned char *V = drbg->scratchpad; drbg_hash_update()
880 memcpy(V, drbg->V, drbg_statelen(drbg)); drbg_hash_update()
883 drbg_string_fill(&data2, V, drbg_statelen(drbg)); drbg_hash_update()
889 ret = drbg_hash_df(drbg, drbg->V, drbg_statelen(drbg), &datalist); drbg_hash_update()
897 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg)); drbg_hash_update()
900 ret = drbg_hash_df(drbg, drbg->C, drbg_statelen(drbg), &datalist2); drbg_hash_update()
903 memset(drbg->scratchpad, 0, drbg_statelen(drbg)); drbg_hash_update()
908 static int drbg_hash_process_addtl(struct drbg_state *drbg, drbg_hash_process_addtl() argument
922 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg)); drbg_hash_process_addtl()
926 ret = drbg_kcapi_hash(drbg, NULL, drbg->scratchpad, &datalist); drbg_hash_process_addtl()
931 drbg_add_buf(drbg->V, drbg_statelen(drbg), drbg_hash_process_addtl()
932 drbg->scratchpad, drbg_blocklen(drbg)); drbg_hash_process_addtl()
935 memset(drbg->scratchpad, 0, drbg_blocklen(drbg)); drbg_hash_process_addtl()
940 static int drbg_hash_hashgen(struct drbg_state *drbg, drbg_hash_hashgen() argument
946 unsigned char *src = drbg->scratchpad; drbg_hash_hashgen()
947 unsigned char *dst = drbg->scratchpad + drbg_statelen(drbg); drbg_hash_hashgen()
952 memcpy(src, drbg->V, drbg_statelen(drbg)); drbg_hash_hashgen()
954 drbg_string_fill(&data, src, drbg_statelen(drbg)); drbg_hash_hashgen()
959 ret = drbg_kcapi_hash(drbg, NULL, dst, &datalist); drbg_hash_hashgen()
964 outlen = (drbg_blocklen(drbg) < (buflen - len)) ? drbg_hash_hashgen()
965 drbg_blocklen(drbg) : (buflen - len); drbg_hash_hashgen()
966 if (!drbg_fips_continuous_test(drbg, dst)) { drbg_hash_hashgen()
967 crypto_inc(src, drbg_statelen(drbg)); drbg_hash_hashgen()
975 crypto_inc(src, drbg_statelen(drbg)); drbg_hash_hashgen()
979 memset(drbg->scratchpad, 0, drbg_hash_hashgen()
980 (drbg_statelen(drbg) + drbg_blocklen(drbg))); drbg_hash_hashgen()
985 static int drbg_hash_generate(struct drbg_state *drbg, drbg_hash_generate() argument
1000 ret = drbg_hash_process_addtl(drbg, addtl); drbg_hash_generate()
1004 len = drbg_hash_hashgen(drbg, buf, buflen); drbg_hash_generate()
1010 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg)); drbg_hash_generate()
1012 ret = drbg_kcapi_hash(drbg, NULL, drbg->scratchpad, &datalist); drbg_hash_generate()
1019 drbg_add_buf(drbg->V, drbg_statelen(drbg), drbg_hash_generate()
1020 drbg->scratchpad, drbg_blocklen(drbg)); drbg_hash_generate()
1021 drbg_add_buf(drbg->V, drbg_statelen(drbg), drbg_hash_generate()
1022 drbg->C, drbg_statelen(drbg)); drbg_hash_generate()
1023 u.req_int = cpu_to_be64(drbg->reseed_ctr); drbg_hash_generate()
1024 drbg_add_buf(drbg->V, drbg_statelen(drbg), u.req, 8); drbg_hash_generate()
1027 memset(drbg->scratchpad, 0, drbg_blocklen(drbg)); drbg_hash_generate()
1047 static inline int __drbg_seed(struct drbg_state *drbg, struct list_head *seed, __drbg_seed() argument
1050 int ret = drbg->d_ops->update(drbg, seed, reseed); __drbg_seed()
1055 drbg->seeded = true; __drbg_seed()
1057 drbg->reseed_ctr = 1; __drbg_seed()
1066 struct drbg_state *drbg = container_of(work, struct drbg_state, drbg_async_seed() local
1068 unsigned int entropylen = drbg_sec_strength(drbg->core->flags); drbg_async_seed()
1078 mutex_lock(&drbg->drbg_mutex); drbg_async_seed()
1081 crypto_free_rng(drbg->jent); drbg_async_seed()
1082 drbg->jent = NULL; drbg_async_seed()
1087 drbg->seeded = false; drbg_async_seed()
1089 __drbg_seed(drbg, &seedlist, true); drbg_async_seed()
1091 if (drbg->seeded) drbg_async_seed()
1092 drbg->reseed_threshold = drbg_max_requests(drbg); drbg_async_seed()
1094 mutex_unlock(&drbg->drbg_mutex); drbg_async_seed()
1102 * @drbg: DRBG state struct
1110 static int drbg_seed(struct drbg_state *drbg, struct drbg_string *pers, drbg_seed() argument
1115 unsigned int entropylen = drbg_sec_strength(drbg->core->flags); drbg_seed()
1120 if (pers && pers->len > (drbg_max_addtl(drbg))) { drbg_seed()
1126 if (list_empty(&drbg->test_data.list)) { drbg_seed()
1127 drbg_string_fill(&data1, drbg->test_data.buf, drbg_seed()
1128 drbg->test_data.len); drbg_seed()
1147 if (!drbg->jent) { drbg_seed()
1153 ret = crypto_rng_get_bytes(drbg->jent, drbg_seed()
1179 memset(drbg->V, 0, drbg_statelen(drbg)); drbg_seed()
1180 memset(drbg->C, 0, drbg_statelen(drbg)); drbg_seed()
1183 ret = __drbg_seed(drbg, &seedlist, reseed); drbg_seed()
1191 static inline void drbg_dealloc_state(struct drbg_state *drbg) drbg_dealloc_state() argument
1193 if (!drbg) drbg_dealloc_state()
1195 kzfree(drbg->V); drbg_dealloc_state()
1196 drbg->V = NULL; drbg_dealloc_state()
1197 kzfree(drbg->C); drbg_dealloc_state()
1198 drbg->C = NULL; drbg_dealloc_state()
1199 kzfree(drbg->scratchpad); drbg_dealloc_state()
1200 drbg->scratchpad = NULL; drbg_dealloc_state()
1201 drbg->reseed_ctr = 0; drbg_dealloc_state()
1202 drbg->d_ops = NULL; drbg_dealloc_state()
1203 drbg->core = NULL; drbg_dealloc_state()
1205 kzfree(drbg->prev); drbg_dealloc_state()
1206 drbg->prev = NULL; drbg_dealloc_state()
1207 drbg->fips_primed = false; drbg_dealloc_state()
1215 static inline int drbg_alloc_state(struct drbg_state *drbg) drbg_alloc_state() argument
1220 switch (drbg->core->flags & DRBG_TYPE_MASK) { drbg_alloc_state()
1223 drbg->d_ops = &drbg_hmac_ops; drbg_alloc_state()
1228 drbg->d_ops = &drbg_hash_ops; drbg_alloc_state()
1233 drbg->d_ops = &drbg_ctr_ops; drbg_alloc_state()
1241 drbg->V = kmalloc(drbg_statelen(drbg), GFP_KERNEL); drbg_alloc_state()
1242 if (!drbg->V) drbg_alloc_state()
1244 drbg->C = kmalloc(drbg_statelen(drbg), GFP_KERNEL); drbg_alloc_state()
1245 if (!drbg->C) drbg_alloc_state()
1248 drbg->prev = kmalloc(drbg_blocklen(drbg), GFP_KERNEL); drbg_alloc_state()
1249 if (!drbg->prev) drbg_alloc_state()
1251 drbg->fips_primed = false; drbg_alloc_state()
1254 if (drbg->core->flags & DRBG_HMAC) drbg_alloc_state()
1256 else if (drbg->core->flags & DRBG_CTR) drbg_alloc_state()
1257 sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg) + /* temp */ drbg_alloc_state()
1258 drbg_statelen(drbg) + /* df_data */ drbg_alloc_state()
1259 drbg_blocklen(drbg) + /* pad */ drbg_alloc_state()
1260 drbg_blocklen(drbg) + /* iv */ drbg_alloc_state()
1261 drbg_statelen(drbg) + drbg_blocklen(drbg); /* temp */ drbg_alloc_state()
1263 sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg); drbg_alloc_state()
1266 drbg->scratchpad = kzalloc(sb_size, GFP_KERNEL); drbg_alloc_state()
1267 if (!drbg->scratchpad) drbg_alloc_state()
1274 drbg_dealloc_state(drbg); drbg_alloc_state()
1286 * @drbg DRBG state handle
1298 static int drbg_generate(struct drbg_state *drbg, drbg_generate() argument
1305 if (!drbg->core) { drbg_generate()
1320 if (buflen > (drbg_max_request_bytes(drbg))) { drbg_generate()
1329 if (addtl && addtl->len > (drbg_max_addtl(drbg))) { drbg_generate()
1340 if (drbg->reseed_threshold < drbg->reseed_ctr) drbg_generate()
1341 drbg->seeded = false; drbg_generate()
1343 if (drbg->pr || !drbg->seeded) { drbg_generate()
1346 drbg->pr ? "true" : "false", drbg_generate()
1347 drbg->seeded ? "seeded" : "unseeded"); drbg_generate()
1349 len = drbg_seed(drbg, addtl, true); drbg_generate()
1359 len = drbg->d_ops->generate(drbg, buf, buflen, &addtllist); drbg_generate()
1362 drbg->reseed_ctr++; drbg_generate()
1382 if (drbg->reseed_ctr && !(drbg->reseed_ctr % 4096)) { drbg_generate()
1385 if (drbg->core->flags & DRBG_HMAC) drbg_generate()
1388 else if (drbg->core->flags & DRBG_CTR) drbg_generate()
1400 drbg_uninstantiate(drbg); drbg_generate()
1425 static int drbg_generate_long(struct drbg_state *drbg, drbg_generate_long() argument
1434 slice = ((buflen - len) / drbg_max_request_bytes(drbg)); drbg_generate_long()
1435 chunk = slice ? drbg_max_request_bytes(drbg) : (buflen - len); drbg_generate_long()
1436 mutex_lock(&drbg->drbg_mutex); drbg_generate_long()
1437 err = drbg_generate(drbg, buf + len, chunk, addtl); drbg_generate_long()
1438 mutex_unlock(&drbg->drbg_mutex); drbg_generate_long()
1448 struct drbg_state *drbg = container_of(rdy, struct drbg_state, drbg_schedule_async_seed() local
1451 schedule_work(&drbg->seed_work); drbg_schedule_async_seed()
1454 static int drbg_prepare_hrng(struct drbg_state *drbg) drbg_prepare_hrng() argument
1459 if (list_empty(&drbg->test_data.list)) drbg_prepare_hrng()
1462 INIT_WORK(&drbg->seed_work, drbg_async_seed); drbg_prepare_hrng()
1464 drbg->random_ready.owner = THIS_MODULE; drbg_prepare_hrng()
1465 drbg->random_ready.func = drbg_schedule_async_seed; drbg_prepare_hrng()
1467 err = add_random_ready_callback(&drbg->random_ready); drbg_prepare_hrng()
1478 drbg->random_ready.func = NULL; drbg_prepare_hrng()
1482 drbg->jent = crypto_alloc_rng("jitterentropy_rng", 0, 0); drbg_prepare_hrng()
1488 drbg->reseed_threshold = 50; drbg_prepare_hrng()
1498 * @drbg memory of state -- if NULL, new memory is allocated
1510 static int drbg_instantiate(struct drbg_state *drbg, struct drbg_string *pers, drbg_instantiate() argument
1518 mutex_lock(&drbg->drbg_mutex); drbg_instantiate()
1524 * and the flag is copied into drbg->flags -- drbg_instantiate()
1530 if (!drbg->core) { drbg_instantiate()
1531 drbg->core = &drbg_cores[coreref]; drbg_instantiate()
1532 drbg->pr = pr; drbg_instantiate()
1533 drbg->seeded = false; drbg_instantiate()
1534 drbg->reseed_threshold = drbg_max_requests(drbg); drbg_instantiate()
1536 ret = drbg_alloc_state(drbg); drbg_instantiate()
1541 if (drbg->d_ops->crypto_init(drbg)) drbg_instantiate()
1544 ret = drbg_prepare_hrng(drbg); drbg_instantiate()
1548 if (IS_ERR(drbg->jent)) { drbg_instantiate()
1549 ret = PTR_ERR(drbg->jent); drbg_instantiate()
1550 drbg->jent = NULL; drbg_instantiate()
1559 ret = drbg_seed(drbg, pers, reseed); drbg_instantiate()
1564 mutex_unlock(&drbg->drbg_mutex); drbg_instantiate()
1568 drbg_dealloc_state(drbg); drbg_instantiate()
1570 mutex_unlock(&drbg->drbg_mutex); drbg_instantiate()
1574 mutex_unlock(&drbg->drbg_mutex); drbg_instantiate()
1575 drbg_uninstantiate(drbg); drbg_instantiate()
1583 * @drbg DRBG state handle
1588 static int drbg_uninstantiate(struct drbg_state *drbg) drbg_uninstantiate() argument
1590 if (drbg->random_ready.func) { drbg_uninstantiate()
1591 del_random_ready_callback(&drbg->random_ready); drbg_uninstantiate()
1592 cancel_work_sync(&drbg->seed_work); drbg_uninstantiate()
1593 crypto_free_rng(drbg->jent); drbg_uninstantiate()
1594 drbg->jent = NULL; drbg_uninstantiate()
1597 if (drbg->d_ops) drbg_uninstantiate()
1598 drbg->d_ops->crypto_fini(drbg); drbg_uninstantiate()
1599 drbg_dealloc_state(drbg); drbg_uninstantiate()
1607 * @drbg DRBG state handle
1614 struct drbg_state *drbg = crypto_rng_ctx(tfm); drbg_kcapi_set_entropy() local
1616 mutex_lock(&drbg->drbg_mutex); drbg_kcapi_set_entropy()
1617 drbg_string_fill(&drbg->test_data, data, len); drbg_kcapi_set_entropy()
1618 mutex_unlock(&drbg->drbg_mutex); drbg_kcapi_set_entropy()
1631 static int drbg_init_hash_kernel(struct drbg_state *drbg) drbg_init_hash_kernel() argument
1636 tfm = crypto_alloc_shash(drbg->core->backend_cra_name, 0, 0); drbg_init_hash_kernel()
1639 drbg->core->backend_cra_name); drbg_init_hash_kernel()
1642 BUG_ON(drbg_blocklen(drbg) != crypto_shash_digestsize(tfm)); drbg_init_hash_kernel()
1652 drbg->priv_data = sdesc; drbg_init_hash_kernel()
1656 static int drbg_fini_hash_kernel(struct drbg_state *drbg) drbg_fini_hash_kernel() argument
1658 struct sdesc *sdesc = (struct sdesc *)drbg->priv_data; drbg_fini_hash_kernel()
1663 drbg->priv_data = NULL; drbg_fini_hash_kernel()
1667 static int drbg_kcapi_hash(struct drbg_state *drbg, const unsigned char *key, drbg_kcapi_hash() argument
1670 struct sdesc *sdesc = (struct sdesc *)drbg->priv_data; drbg_kcapi_hash()
1674 crypto_shash_setkey(sdesc->shash.tfm, key, drbg_statelen(drbg)); drbg_kcapi_hash()
1683 static int drbg_init_sym_kernel(struct drbg_state *drbg) drbg_init_sym_kernel() argument
1688 tfm = crypto_alloc_cipher(drbg->core->backend_cra_name, 0, 0); drbg_init_sym_kernel()
1691 drbg->core->backend_cra_name); drbg_init_sym_kernel()
1694 BUG_ON(drbg_blocklen(drbg) != crypto_cipher_blocksize(tfm)); drbg_init_sym_kernel()
1695 drbg->priv_data = tfm; drbg_init_sym_kernel()
1699 static int drbg_fini_sym_kernel(struct drbg_state *drbg) drbg_fini_sym_kernel() argument
1702 (struct crypto_cipher *)drbg->priv_data; drbg_fini_sym_kernel()
1705 drbg->priv_data = NULL; drbg_fini_sym_kernel()
1709 static int drbg_kcapi_sym(struct drbg_state *drbg, const unsigned char *key, drbg_kcapi_sym() argument
1713 (struct crypto_cipher *)drbg->priv_data; drbg_kcapi_sym()
1715 crypto_cipher_setkey(tfm, key, (drbg_keylen(drbg))); drbg_kcapi_sym()
1717 BUG_ON(in->len < drbg_blocklen(drbg)); drbg_kcapi_sym()
1769 struct drbg_state *drbg = crypto_tfm_ctx(tfm); drbg_kcapi_init() local
1771 mutex_init(&drbg->drbg_mutex); drbg_kcapi_init()
1794 struct drbg_state *drbg = crypto_rng_ctx(tfm); drbg_kcapi_random() local
1804 return drbg_generate_long(drbg, dst, dlen, addtl); drbg_kcapi_random()
1813 struct drbg_state *drbg = crypto_rng_ctx(tfm); drbg_kcapi_seed() local
1827 return drbg_instantiate(drbg, seed_string, coreref, pr); drbg_kcapi_seed()
1849 struct drbg_state *drbg = NULL; drbg_healthcheck_sanity() local
1869 drbg = kzalloc(sizeof(struct drbg_state), GFP_KERNEL); drbg_healthcheck_sanity()
1870 if (!drbg) drbg_healthcheck_sanity()
1873 mutex_init(&drbg->drbg_mutex); drbg_healthcheck_sanity()
1884 ret = drbg_instantiate(drbg, NULL, coreref, pr); drbg_healthcheck_sanity()
1889 max_addtllen = drbg_max_addtl(drbg); drbg_healthcheck_sanity()
1890 max_request_bytes = drbg_max_request_bytes(drbg); drbg_healthcheck_sanity()
1893 len = drbg_generate(drbg, buf, OUTBUFLEN, &addtl); drbg_healthcheck_sanity()
1896 len = drbg_generate(drbg, buf, (max_request_bytes + 1), NULL); drbg_healthcheck_sanity()
1898 drbg_uninstantiate(drbg); drbg_healthcheck_sanity()
1901 ret = drbg_instantiate(drbg, &addtl, coreref, pr); drbg_healthcheck_sanity()
1909 drbg_uninstantiate(drbg); drbg_healthcheck_sanity()
1911 kzfree(drbg); drbg_healthcheck_sanity()
H A DMakefile113 obj-$(CONFIG_CRYPTO_DRBG) += drbg.o
H A Dtestmgr.c33 #include <crypto/drbg.h>
139 struct drbg_test_suite drbg; member in union:alg_test_desc::__anon3289
1770 printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for " drbg_cavs_test()
1781 printk(KERN_ERR "alg: drbg: Failed to reset rng\n"); drbg_cavs_test()
1795 printk(KERN_ERR "alg: drbg: could not obtain random data for " drbg_cavs_test()
1810 printk(KERN_ERR "alg: drbg: could not obtain random data for " drbg_cavs_test()
1830 struct drbg_testvec *template = desc->suite.drbg.vecs; alg_test_drbg()
1831 unsigned int tcount = desc->suite.drbg.count; alg_test_drbg()
1839 printk(KERN_ERR "alg: drbg: Test %d failed for %s\n", alg_test_drbg()
2770 .drbg = {
2780 .drbg = {
2790 .drbg = {
2808 .drbg = {
2832 .drbg = {
2851 .drbg = {
2874 .drbg = {
2897 .drbg = {
H A Dtestmgr.h23973 * http://csrc.nist.gov/groups/STM/cavp/documents/drbg/drbgtestvectors.zip
24413 * http://csrc.nist.gov/groups/STM/cavp/documents/drbg/drbgtestvectors.zip
/linux-4.4.14/include/crypto/
H A Ddrbg.h93 int (*update)(struct drbg_state *drbg, struct list_head *seed,
95 int (*generate)(struct drbg_state *drbg,
98 int (*crypto_init)(struct drbg_state *drbg);
99 int (*crypto_fini)(struct drbg_state *drbg);
132 static inline __u8 drbg_statelen(struct drbg_state *drbg) drbg_statelen() argument
134 if (drbg && drbg->core) drbg_statelen()
135 return drbg->core->statelen; drbg_statelen()
139 static inline __u8 drbg_blocklen(struct drbg_state *drbg) drbg_blocklen() argument
141 if (drbg && drbg->core) drbg_blocklen()
142 return drbg->core->blocklen_bytes; drbg_blocklen()
146 static inline __u8 drbg_keylen(struct drbg_state *drbg) drbg_keylen() argument
148 if (drbg && drbg->core) drbg_keylen()
149 return (drbg->core->statelen - drbg->core->blocklen_bytes); drbg_keylen()
153 static inline size_t drbg_max_request_bytes(struct drbg_state *drbg) drbg_max_request_bytes() argument
159 static inline size_t drbg_max_addtl(struct drbg_state *drbg) drbg_max_addtl() argument
174 static inline size_t drbg_max_requests(struct drbg_state *drbg) drbg_max_requests() argument

Completed in 292 milliseconds