Lines Matching refs:drbg

194 static int drbg_uninstantiate(struct drbg_state *drbg);
235 static bool drbg_fips_continuous_test(struct drbg_state *drbg, in drbg_fips_continuous_test() argument
241 if (list_empty(&drbg->test_data.list)) in drbg_fips_continuous_test()
246 if (!drbg->fips_primed) { in drbg_fips_continuous_test()
248 memcpy(drbg->prev, buf, drbg_blocklen(drbg)); in drbg_fips_continuous_test()
249 drbg->fips_primed = true; in drbg_fips_continuous_test()
253 ret = memcmp(drbg->prev, buf, drbg_blocklen(drbg)); in drbg_fips_continuous_test()
256 memcpy(drbg->prev, buf, drbg_blocklen(drbg)); in 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, in drbg_ctr_bcc() argument
312 drbg_string_fill(&data, out, drbg_blocklen(drbg)); in drbg_ctr_bcc()
321 if (drbg_blocklen(drbg) == cnt) { in drbg_ctr_bcc()
323 ret = drbg_kcapi_sym(drbg, key, out, &data); in drbg_ctr_bcc()
335 ret = drbg_kcapi_sym(drbg, key, out, &data); in drbg_ctr_bcc()
380 static int drbg_ctr_df(struct drbg_state *drbg, in drbg_ctr_df() argument
389 unsigned char *pad = df_data + drbg_statelen(drbg); in drbg_ctr_df()
390 unsigned char *iv = pad + drbg_blocklen(drbg); in drbg_ctr_df()
391 unsigned char *temp = iv + drbg_blocklen(drbg); in drbg_ctr_df()
407 memset(pad, 0, drbg_blocklen(drbg)); in drbg_ctr_df()
408 memset(iv, 0, drbg_blocklen(drbg)); in drbg_ctr_df()
425 padlen = (inputlen + sizeof(L_N) + 1) % (drbg_blocklen(drbg)); in drbg_ctr_df()
428 padlen = drbg_blocklen(drbg) - padlen; in drbg_ctr_df()
438 drbg_string_fill(&S1, iv, drbg_blocklen(drbg)); in drbg_ctr_df()
447 while (templen < (drbg_keylen(drbg) + (drbg_blocklen(drbg)))) { in drbg_ctr_df()
455 ret = drbg_ctr_bcc(drbg, temp + templen, K, &bcc_list); in drbg_ctr_df()
460 templen += drbg_blocklen(drbg); in drbg_ctr_df()
464 X = temp + (drbg_keylen(drbg)); in drbg_ctr_df()
465 drbg_string_fill(&cipherin, X, drbg_blocklen(drbg)); in drbg_ctr_df()
477 ret = drbg_kcapi_sym(drbg, temp, X, &cipherin); in drbg_ctr_df()
480 blocklen = (drbg_blocklen(drbg) < in drbg_ctr_df()
482 drbg_blocklen(drbg) : in drbg_ctr_df()
492 memset(iv, 0, drbg_blocklen(drbg)); in drbg_ctr_df()
493 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg)); in drbg_ctr_df()
494 memset(pad, 0, drbg_blocklen(drbg)); in drbg_ctr_df()
513 static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed, in drbg_ctr_update() argument
518 unsigned char *temp = drbg->scratchpad; in drbg_ctr_update()
519 unsigned char *df_data = drbg->scratchpad + drbg_statelen(drbg) + in drbg_ctr_update()
520 drbg_blocklen(drbg); in drbg_ctr_update()
526 memset(df_data, 0, drbg_statelen(drbg)); in drbg_ctr_update()
530 ret = drbg_ctr_df(drbg, df_data, drbg_statelen(drbg), seed); in drbg_ctr_update()
535 drbg_string_fill(&cipherin, drbg->V, drbg_blocklen(drbg)); in drbg_ctr_update()
540 while (len < (drbg_statelen(drbg))) { in drbg_ctr_update()
542 crypto_inc(drbg->V, drbg_blocklen(drbg)); in drbg_ctr_update()
545 ret = drbg_kcapi_sym(drbg, drbg->C, temp + len, &cipherin); in drbg_ctr_update()
549 len += drbg_blocklen(drbg); in drbg_ctr_update()
555 for (len = 0; len < drbg_statelen(drbg); len++) { in drbg_ctr_update()
561 memcpy(drbg->C, temp, drbg_keylen(drbg)); in drbg_ctr_update()
563 memcpy(drbg->V, temp + drbg_keylen(drbg), drbg_blocklen(drbg)); in drbg_ctr_update()
567 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg)); in drbg_ctr_update()
569 memset(df_data, 0, drbg_statelen(drbg)); in drbg_ctr_update()
578 static int drbg_ctr_generate(struct drbg_state *drbg, in drbg_ctr_generate() argument
588 ret = drbg_ctr_update(drbg, addtl, 2); in drbg_ctr_generate()
594 crypto_inc(drbg->V, drbg_blocklen(drbg)); in drbg_ctr_generate()
595 drbg_string_fill(&data, drbg->V, drbg_blocklen(drbg)); in drbg_ctr_generate()
599 ret = drbg_kcapi_sym(drbg, drbg->C, drbg->scratchpad, &data); in drbg_ctr_generate()
604 outlen = (drbg_blocklen(drbg) < (buflen - len)) ? in drbg_ctr_generate()
605 drbg_blocklen(drbg) : (buflen - len); in drbg_ctr_generate()
606 if (!drbg_fips_continuous_test(drbg, drbg->scratchpad)) { in drbg_ctr_generate()
608 crypto_inc(drbg->V, drbg_blocklen(drbg)); in drbg_ctr_generate()
612 memcpy(buf + len, drbg->scratchpad, outlen); in drbg_ctr_generate()
616 crypto_inc(drbg->V, drbg_blocklen(drbg)); in drbg_ctr_generate()
620 ret = drbg_ctr_update(drbg, NULL, 3); in drbg_ctr_generate()
625 memset(drbg->scratchpad, 0, drbg_blocklen(drbg)); in 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, in drbg_hmac_update() argument
671 memset(drbg->V, 1, drbg_statelen(drbg)); in drbg_hmac_update()
673 drbg_string_fill(&seed1, drbg->V, drbg_statelen(drbg)); in drbg_hmac_update()
682 drbg_string_fill(&vdata, drbg->V, drbg_statelen(drbg)); in drbg_hmac_update()
691 ret = drbg_kcapi_hash(drbg, drbg->C, drbg->C, &seedlist); in drbg_hmac_update()
696 ret = drbg_kcapi_hash(drbg, drbg->C, drbg->V, &vdatalist); in drbg_hmac_update()
709 static int drbg_hmac_generate(struct drbg_state *drbg, in drbg_hmac_generate() argument
721 ret = drbg_hmac_update(drbg, addtl, 1); in drbg_hmac_generate()
726 drbg_string_fill(&data, drbg->V, drbg_statelen(drbg)); in drbg_hmac_generate()
731 ret = drbg_kcapi_hash(drbg, drbg->C, drbg->V, &datalist); in drbg_hmac_generate()
734 outlen = (drbg_blocklen(drbg) < (buflen - len)) ? in drbg_hmac_generate()
735 drbg_blocklen(drbg) : (buflen - len); in drbg_hmac_generate()
736 if (!drbg_fips_continuous_test(drbg, drbg->V)) in drbg_hmac_generate()
740 memcpy(buf + len, drbg->V, outlen); in drbg_hmac_generate()
746 ret = drbg_hmac_update(drbg, addtl, 1); in drbg_hmac_generate()
748 ret = drbg_hmac_update(drbg, NULL, 1); in drbg_hmac_generate()
826 static int drbg_hash_df(struct drbg_state *drbg, in drbg_hash_df() argument
833 unsigned char *tmp = drbg->scratchpad + drbg_statelen(drbg); in drbg_hash_df()
848 ret = drbg_kcapi_hash(drbg, NULL, tmp, entropylist); in drbg_hash_df()
853 blocklen = (drbg_blocklen(drbg) < (outlen - len)) ? in drbg_hash_df()
854 drbg_blocklen(drbg) : (outlen - len); in drbg_hash_df()
860 memset(tmp, 0, drbg_blocklen(drbg)); in drbg_hash_df()
865 static int drbg_hash_update(struct drbg_state *drbg, struct list_head *seed, in drbg_hash_update() argument
872 unsigned char *V = drbg->scratchpad; in drbg_hash_update()
880 memcpy(V, drbg->V, drbg_statelen(drbg)); in drbg_hash_update()
883 drbg_string_fill(&data2, V, drbg_statelen(drbg)); in drbg_hash_update()
889 ret = drbg_hash_df(drbg, drbg->V, drbg_statelen(drbg), &datalist); in drbg_hash_update()
897 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg)); in drbg_hash_update()
900 ret = drbg_hash_df(drbg, drbg->C, drbg_statelen(drbg), &datalist2); in drbg_hash_update()
903 memset(drbg->scratchpad, 0, drbg_statelen(drbg)); in drbg_hash_update()
908 static int drbg_hash_process_addtl(struct drbg_state *drbg, in drbg_hash_process_addtl() argument
922 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg)); in drbg_hash_process_addtl()
926 ret = drbg_kcapi_hash(drbg, NULL, drbg->scratchpad, &datalist); in drbg_hash_process_addtl()
931 drbg_add_buf(drbg->V, drbg_statelen(drbg), in drbg_hash_process_addtl()
932 drbg->scratchpad, drbg_blocklen(drbg)); in drbg_hash_process_addtl()
935 memset(drbg->scratchpad, 0, drbg_blocklen(drbg)); in drbg_hash_process_addtl()
940 static int drbg_hash_hashgen(struct drbg_state *drbg, in drbg_hash_hashgen() argument
946 unsigned char *src = drbg->scratchpad; in drbg_hash_hashgen()
947 unsigned char *dst = drbg->scratchpad + drbg_statelen(drbg); in drbg_hash_hashgen()
952 memcpy(src, drbg->V, drbg_statelen(drbg)); in drbg_hash_hashgen()
954 drbg_string_fill(&data, src, drbg_statelen(drbg)); in drbg_hash_hashgen()
959 ret = drbg_kcapi_hash(drbg, NULL, dst, &datalist); in drbg_hash_hashgen()
964 outlen = (drbg_blocklen(drbg) < (buflen - len)) ? in drbg_hash_hashgen()
965 drbg_blocklen(drbg) : (buflen - len); in drbg_hash_hashgen()
966 if (!drbg_fips_continuous_test(drbg, dst)) { in drbg_hash_hashgen()
967 crypto_inc(src, drbg_statelen(drbg)); in drbg_hash_hashgen()
975 crypto_inc(src, drbg_statelen(drbg)); in drbg_hash_hashgen()
979 memset(drbg->scratchpad, 0, in drbg_hash_hashgen()
980 (drbg_statelen(drbg) + drbg_blocklen(drbg))); in drbg_hash_hashgen()
985 static int drbg_hash_generate(struct drbg_state *drbg, in drbg_hash_generate() argument
1000 ret = drbg_hash_process_addtl(drbg, addtl); in drbg_hash_generate()
1004 len = drbg_hash_hashgen(drbg, buf, buflen); in drbg_hash_generate()
1010 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg)); in drbg_hash_generate()
1012 ret = drbg_kcapi_hash(drbg, NULL, drbg->scratchpad, &datalist); in drbg_hash_generate()
1019 drbg_add_buf(drbg->V, drbg_statelen(drbg), in drbg_hash_generate()
1020 drbg->scratchpad, drbg_blocklen(drbg)); in drbg_hash_generate()
1021 drbg_add_buf(drbg->V, drbg_statelen(drbg), in drbg_hash_generate()
1022 drbg->C, drbg_statelen(drbg)); in drbg_hash_generate()
1023 u.req_int = cpu_to_be64(drbg->reseed_ctr); in drbg_hash_generate()
1024 drbg_add_buf(drbg->V, drbg_statelen(drbg), u.req, 8); in drbg_hash_generate()
1027 memset(drbg->scratchpad, 0, drbg_blocklen(drbg)); in drbg_hash_generate()
1047 static inline int __drbg_seed(struct drbg_state *drbg, struct list_head *seed, in __drbg_seed() argument
1050 int ret = drbg->d_ops->update(drbg, seed, reseed); in __drbg_seed()
1055 drbg->seeded = true; in __drbg_seed()
1057 drbg->reseed_ctr = 1; in __drbg_seed()
1066 struct drbg_state *drbg = container_of(work, struct drbg_state, in drbg_async_seed() local
1068 unsigned int entropylen = drbg_sec_strength(drbg->core->flags); in drbg_async_seed()
1078 mutex_lock(&drbg->drbg_mutex); in drbg_async_seed()
1081 crypto_free_rng(drbg->jent); in drbg_async_seed()
1082 drbg->jent = NULL; in drbg_async_seed()
1087 drbg->seeded = false; in drbg_async_seed()
1089 __drbg_seed(drbg, &seedlist, true); in drbg_async_seed()
1091 if (drbg->seeded) in drbg_async_seed()
1092 drbg->reseed_threshold = drbg_max_requests(drbg); in drbg_async_seed()
1094 mutex_unlock(&drbg->drbg_mutex); in drbg_async_seed()
1110 static int drbg_seed(struct drbg_state *drbg, struct drbg_string *pers, in drbg_seed() argument
1115 unsigned int entropylen = drbg_sec_strength(drbg->core->flags); in drbg_seed()
1120 if (pers && pers->len > (drbg_max_addtl(drbg))) { in drbg_seed()
1126 if (list_empty(&drbg->test_data.list)) { in drbg_seed()
1127 drbg_string_fill(&data1, drbg->test_data.buf, in drbg_seed()
1128 drbg->test_data.len); in drbg_seed()
1147 if (!drbg->jent) { in drbg_seed()
1153 ret = crypto_rng_get_bytes(drbg->jent, in drbg_seed()
1179 memset(drbg->V, 0, drbg_statelen(drbg)); in drbg_seed()
1180 memset(drbg->C, 0, drbg_statelen(drbg)); in drbg_seed()
1183 ret = __drbg_seed(drbg, &seedlist, reseed); in drbg_seed()
1191 static inline void drbg_dealloc_state(struct drbg_state *drbg) in drbg_dealloc_state() argument
1193 if (!drbg) in drbg_dealloc_state()
1195 kzfree(drbg->V); in drbg_dealloc_state()
1196 drbg->V = NULL; in drbg_dealloc_state()
1197 kzfree(drbg->C); in drbg_dealloc_state()
1198 drbg->C = NULL; in drbg_dealloc_state()
1199 kzfree(drbg->scratchpad); in drbg_dealloc_state()
1200 drbg->scratchpad = NULL; in drbg_dealloc_state()
1201 drbg->reseed_ctr = 0; in drbg_dealloc_state()
1202 drbg->d_ops = NULL; in drbg_dealloc_state()
1203 drbg->core = NULL; in drbg_dealloc_state()
1205 kzfree(drbg->prev); in drbg_dealloc_state()
1206 drbg->prev = NULL; in drbg_dealloc_state()
1207 drbg->fips_primed = false; in drbg_dealloc_state()
1215 static inline int drbg_alloc_state(struct drbg_state *drbg) in drbg_alloc_state() argument
1220 switch (drbg->core->flags & DRBG_TYPE_MASK) { in drbg_alloc_state()
1223 drbg->d_ops = &drbg_hmac_ops; in drbg_alloc_state()
1228 drbg->d_ops = &drbg_hash_ops; in drbg_alloc_state()
1233 drbg->d_ops = &drbg_ctr_ops; in drbg_alloc_state()
1241 drbg->V = kmalloc(drbg_statelen(drbg), GFP_KERNEL); in drbg_alloc_state()
1242 if (!drbg->V) in drbg_alloc_state()
1244 drbg->C = kmalloc(drbg_statelen(drbg), GFP_KERNEL); in drbg_alloc_state()
1245 if (!drbg->C) in drbg_alloc_state()
1248 drbg->prev = kmalloc(drbg_blocklen(drbg), GFP_KERNEL); in drbg_alloc_state()
1249 if (!drbg->prev) in drbg_alloc_state()
1251 drbg->fips_primed = false; in drbg_alloc_state()
1254 if (drbg->core->flags & DRBG_HMAC) in drbg_alloc_state()
1256 else if (drbg->core->flags & DRBG_CTR) in drbg_alloc_state()
1257 sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg) + /* temp */ in drbg_alloc_state()
1258 drbg_statelen(drbg) + /* df_data */ in drbg_alloc_state()
1259 drbg_blocklen(drbg) + /* pad */ in drbg_alloc_state()
1260 drbg_blocklen(drbg) + /* iv */ in drbg_alloc_state()
1261 drbg_statelen(drbg) + drbg_blocklen(drbg); /* temp */ in drbg_alloc_state()
1263 sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg); in drbg_alloc_state()
1266 drbg->scratchpad = kzalloc(sb_size, GFP_KERNEL); in drbg_alloc_state()
1267 if (!drbg->scratchpad) in drbg_alloc_state()
1274 drbg_dealloc_state(drbg); in drbg_alloc_state()
1298 static int drbg_generate(struct drbg_state *drbg, in drbg_generate() argument
1305 if (!drbg->core) { in drbg_generate()
1320 if (buflen > (drbg_max_request_bytes(drbg))) { in drbg_generate()
1329 if (addtl && addtl->len > (drbg_max_addtl(drbg))) { in drbg_generate()
1340 if (drbg->reseed_threshold < drbg->reseed_ctr) in drbg_generate()
1341 drbg->seeded = false; in drbg_generate()
1343 if (drbg->pr || !drbg->seeded) { in drbg_generate()
1346 drbg->pr ? "true" : "false", in drbg_generate()
1347 drbg->seeded ? "seeded" : "unseeded"); in drbg_generate()
1349 len = drbg_seed(drbg, addtl, true); in drbg_generate()
1359 len = drbg->d_ops->generate(drbg, buf, buflen, &addtllist); in drbg_generate()
1362 drbg->reseed_ctr++; in drbg_generate()
1382 if (drbg->reseed_ctr && !(drbg->reseed_ctr % 4096)) { in drbg_generate()
1385 if (drbg->core->flags & DRBG_HMAC) in drbg_generate()
1388 else if (drbg->core->flags & DRBG_CTR) in drbg_generate()
1400 drbg_uninstantiate(drbg); in drbg_generate()
1425 static int drbg_generate_long(struct drbg_state *drbg, in drbg_generate_long() argument
1434 slice = ((buflen - len) / drbg_max_request_bytes(drbg)); in drbg_generate_long()
1435 chunk = slice ? drbg_max_request_bytes(drbg) : (buflen - len); in drbg_generate_long()
1436 mutex_lock(&drbg->drbg_mutex); in drbg_generate_long()
1437 err = drbg_generate(drbg, buf + len, chunk, addtl); in drbg_generate_long()
1438 mutex_unlock(&drbg->drbg_mutex); in drbg_generate_long()
1448 struct drbg_state *drbg = container_of(rdy, struct drbg_state, in drbg_schedule_async_seed() local
1451 schedule_work(&drbg->seed_work); in drbg_schedule_async_seed()
1454 static int drbg_prepare_hrng(struct drbg_state *drbg) in drbg_prepare_hrng() argument
1459 if (list_empty(&drbg->test_data.list)) in drbg_prepare_hrng()
1462 INIT_WORK(&drbg->seed_work, drbg_async_seed); in drbg_prepare_hrng()
1464 drbg->random_ready.owner = THIS_MODULE; in drbg_prepare_hrng()
1465 drbg->random_ready.func = drbg_schedule_async_seed; in drbg_prepare_hrng()
1467 err = add_random_ready_callback(&drbg->random_ready); in drbg_prepare_hrng()
1478 drbg->random_ready.func = NULL; in drbg_prepare_hrng()
1482 drbg->jent = crypto_alloc_rng("jitterentropy_rng", 0, 0); in drbg_prepare_hrng()
1488 drbg->reseed_threshold = 50; in drbg_prepare_hrng()
1510 static int drbg_instantiate(struct drbg_state *drbg, struct drbg_string *pers, in drbg_instantiate() argument
1518 mutex_lock(&drbg->drbg_mutex); in drbg_instantiate()
1530 if (!drbg->core) { in drbg_instantiate()
1531 drbg->core = &drbg_cores[coreref]; in drbg_instantiate()
1532 drbg->pr = pr; in drbg_instantiate()
1533 drbg->seeded = false; in drbg_instantiate()
1534 drbg->reseed_threshold = drbg_max_requests(drbg); in drbg_instantiate()
1536 ret = drbg_alloc_state(drbg); in drbg_instantiate()
1541 if (drbg->d_ops->crypto_init(drbg)) in drbg_instantiate()
1544 ret = drbg_prepare_hrng(drbg); in drbg_instantiate()
1548 if (IS_ERR(drbg->jent)) { in drbg_instantiate()
1549 ret = PTR_ERR(drbg->jent); in drbg_instantiate()
1550 drbg->jent = NULL; in drbg_instantiate()
1559 ret = drbg_seed(drbg, pers, reseed); in drbg_instantiate()
1564 mutex_unlock(&drbg->drbg_mutex); in drbg_instantiate()
1568 drbg_dealloc_state(drbg); in drbg_instantiate()
1570 mutex_unlock(&drbg->drbg_mutex); in drbg_instantiate()
1574 mutex_unlock(&drbg->drbg_mutex); in drbg_instantiate()
1575 drbg_uninstantiate(drbg); in drbg_instantiate()
1588 static int drbg_uninstantiate(struct drbg_state *drbg) in drbg_uninstantiate() argument
1590 if (drbg->random_ready.func) { in drbg_uninstantiate()
1591 del_random_ready_callback(&drbg->random_ready); in drbg_uninstantiate()
1592 cancel_work_sync(&drbg->seed_work); in drbg_uninstantiate()
1593 crypto_free_rng(drbg->jent); in drbg_uninstantiate()
1594 drbg->jent = NULL; in drbg_uninstantiate()
1597 if (drbg->d_ops) in drbg_uninstantiate()
1598 drbg->d_ops->crypto_fini(drbg); in drbg_uninstantiate()
1599 drbg_dealloc_state(drbg); in drbg_uninstantiate()
1614 struct drbg_state *drbg = crypto_rng_ctx(tfm); in drbg_kcapi_set_entropy() local
1616 mutex_lock(&drbg->drbg_mutex); in drbg_kcapi_set_entropy()
1617 drbg_string_fill(&drbg->test_data, data, len); in drbg_kcapi_set_entropy()
1618 mutex_unlock(&drbg->drbg_mutex); in drbg_kcapi_set_entropy()
1631 static int drbg_init_hash_kernel(struct drbg_state *drbg) in drbg_init_hash_kernel() argument
1636 tfm = crypto_alloc_shash(drbg->core->backend_cra_name, 0, 0); in drbg_init_hash_kernel()
1639 drbg->core->backend_cra_name); in drbg_init_hash_kernel()
1642 BUG_ON(drbg_blocklen(drbg) != crypto_shash_digestsize(tfm)); in drbg_init_hash_kernel()
1652 drbg->priv_data = sdesc; in drbg_init_hash_kernel()
1656 static int drbg_fini_hash_kernel(struct drbg_state *drbg) in drbg_fini_hash_kernel() argument
1658 struct sdesc *sdesc = (struct sdesc *)drbg->priv_data; in drbg_fini_hash_kernel()
1663 drbg->priv_data = NULL; in drbg_fini_hash_kernel()
1667 static int drbg_kcapi_hash(struct drbg_state *drbg, const unsigned char *key, in drbg_kcapi_hash() argument
1670 struct sdesc *sdesc = (struct sdesc *)drbg->priv_data; in drbg_kcapi_hash()
1674 crypto_shash_setkey(sdesc->shash.tfm, key, drbg_statelen(drbg)); in drbg_kcapi_hash()
1683 static int drbg_init_sym_kernel(struct drbg_state *drbg) in drbg_init_sym_kernel() argument
1688 tfm = crypto_alloc_cipher(drbg->core->backend_cra_name, 0, 0); in drbg_init_sym_kernel()
1691 drbg->core->backend_cra_name); in drbg_init_sym_kernel()
1694 BUG_ON(drbg_blocklen(drbg) != crypto_cipher_blocksize(tfm)); in drbg_init_sym_kernel()
1695 drbg->priv_data = tfm; in drbg_init_sym_kernel()
1699 static int drbg_fini_sym_kernel(struct drbg_state *drbg) in drbg_fini_sym_kernel() argument
1702 (struct crypto_cipher *)drbg->priv_data; in drbg_fini_sym_kernel()
1705 drbg->priv_data = NULL; in drbg_fini_sym_kernel()
1709 static int drbg_kcapi_sym(struct drbg_state *drbg, const unsigned char *key, in drbg_kcapi_sym() argument
1713 (struct crypto_cipher *)drbg->priv_data; in drbg_kcapi_sym()
1715 crypto_cipher_setkey(tfm, key, (drbg_keylen(drbg))); in drbg_kcapi_sym()
1717 BUG_ON(in->len < drbg_blocklen(drbg)); in drbg_kcapi_sym()
1769 struct drbg_state *drbg = crypto_tfm_ctx(tfm); in drbg_kcapi_init() local
1771 mutex_init(&drbg->drbg_mutex); in drbg_kcapi_init()
1794 struct drbg_state *drbg = crypto_rng_ctx(tfm); in drbg_kcapi_random() local
1804 return drbg_generate_long(drbg, dst, dlen, addtl); in drbg_kcapi_random()
1813 struct drbg_state *drbg = crypto_rng_ctx(tfm); in drbg_kcapi_seed() local
1827 return drbg_instantiate(drbg, seed_string, coreref, pr); in drbg_kcapi_seed()
1849 struct drbg_state *drbg = NULL; in drbg_healthcheck_sanity() local
1869 drbg = kzalloc(sizeof(struct drbg_state), GFP_KERNEL); in drbg_healthcheck_sanity()
1870 if (!drbg) in drbg_healthcheck_sanity()
1873 mutex_init(&drbg->drbg_mutex); in drbg_healthcheck_sanity()
1884 ret = drbg_instantiate(drbg, NULL, coreref, pr); in drbg_healthcheck_sanity()
1889 max_addtllen = drbg_max_addtl(drbg); in drbg_healthcheck_sanity()
1890 max_request_bytes = drbg_max_request_bytes(drbg); in drbg_healthcheck_sanity()
1893 len = drbg_generate(drbg, buf, OUTBUFLEN, &addtl); in drbg_healthcheck_sanity()
1896 len = drbg_generate(drbg, buf, (max_request_bytes + 1), NULL); in drbg_healthcheck_sanity()
1898 drbg_uninstantiate(drbg); in drbg_healthcheck_sanity()
1901 ret = drbg_instantiate(drbg, &addtl, coreref, pr); in drbg_healthcheck_sanity()
1909 drbg_uninstantiate(drbg); in drbg_healthcheck_sanity()
1911 kzfree(drbg); in drbg_healthcheck_sanity()