H A D | drbg.c | 100 #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()
|