Lines Matching +full:y +full:- +full:rc

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2019-2021 Intel Corporation
35 #define DRV_NAME "keembay-ocs-ecc"
79 * struct ocs_ecc_dev - ECC device context
97 * struct ocs_ecc_ctx - Transformation context.
142 return readl_poll_timeout((dev->base_reg + HW_OFFS_OCS_ECC_STATUS), in ocs_ecc_wait_idle()
151 ecc_dev->base_reg + HW_OFFS_OCS_ECC_COMMAND); in ocs_ecc_cmd_start()
161 iowrite32(op_size | inst, dev->base_reg + HW_OFFS_OCS_ECC_COMMAND); in ocs_ecc_write_cmd_and_data()
164 memcpy_toio(dev->base_reg + HW_OFFS_OCS_ECC_DATA_IN, data_in, in ocs_ecc_write_cmd_and_data()
172 reinit_completion(&ecc_dev->irq_done); in ocs_ecc_trigger_op()
174 iowrite32(ECC_ENABLE_INTR, ecc_dev->base_reg + HW_OFFS_OCS_ECC_IER); in ocs_ecc_trigger_op()
175 iowrite32(op_size | inst, ecc_dev->base_reg + HW_OFFS_OCS_ECC_COMMAND); in ocs_ecc_trigger_op()
177 return wait_for_completion_interruptible(&ecc_dev->irq_done); in ocs_ecc_trigger_op()
181 * ocs_ecc_read_cx_out() - Read the CX data output buffer.
190 memcpy_fromio(cx_out, dev->base_reg + HW_OFFS_OCS_ECC_CX_DATA_OUT, in ocs_ecc_read_cx_out()
195 * ocs_ecc_read_cy_out() - Read the CX data output buffer.
204 memcpy_fromio(cy_out, dev->base_reg + HW_OFFS_OCS_ECC_CY_DATA_OUT, in ocs_ecc_read_cy_out()
210 if (tctx->ecc_dev) in kmb_ocs_ecc_find_dev()
211 return tctx->ecc_dev; in kmb_ocs_ecc_find_dev()
216 tctx->ecc_dev = list_first_entry(&ocs_ecc.dev_list, struct ocs_ecc_dev, in kmb_ocs_ecc_find_dev()
221 return tctx->ecc_dev; in kmb_ocs_ecc_find_dev()
232 u32 op_size = (curve->g.ndigits > ECC_CURVE_NIST_P256_DIGITS) ? in kmb_ecc_point_mult()
234 size_t nbytes = digits_to_bytes(curve->g.ndigits); in kmb_ecc_point_mult()
235 int rc = 0; in kmb_ecc_point_mult() local
238 rc = crypto_get_default_rng(); in kmb_ecc_point_mult()
239 if (rc) in kmb_ecc_point_mult()
240 return rc; in kmb_ecc_point_mult()
242 rc = crypto_rng_get_bytes(crypto_default_rng, sca, nbytes); in kmb_ecc_point_mult()
244 if (rc) in kmb_ecc_point_mult()
245 return rc; in kmb_ecc_point_mult()
248 rc = ocs_ecc_wait_idle(ecc_dev); in kmb_ecc_point_mult()
249 if (rc) in kmb_ecc_point_mult()
250 return rc; in kmb_ecc_point_mult()
257 point->x, nbytes); in kmb_ecc_point_mult()
261 point->y, nbytes); in kmb_ecc_point_mult()
268 * side-channel-resistance value. in kmb_ecc_point_mult()
280 curve->p, nbytes); in kmb_ecc_point_mult()
284 curve->a, nbytes); in kmb_ecc_point_mult()
287 rc = ocs_ecc_trigger_op(ecc_dev, op_size, OCS_ECC_INST_CALC_D_IDX_A); in kmb_ecc_point_mult()
288 if (rc) in kmb_ecc_point_mult()
289 return rc; in kmb_ecc_point_mult()
292 ocs_ecc_read_cx_out(ecc_dev, result->x, nbytes); in kmb_ecc_point_mult()
293 ocs_ecc_read_cy_out(ecc_dev, result->y, nbytes); in kmb_ecc_point_mult()
299 * kmb_ecc_do_scalar_op() - Perform Scalar operation using OCS ECC HW.
318 int rc; in kmb_ecc_do_scalar_op() local
321 rc = ocs_ecc_wait_idle(ecc_dev); in kmb_ecc_do_scalar_op()
322 if (rc) in kmb_ecc_do_scalar_op()
323 return rc; in kmb_ecc_do_scalar_op()
338 curve->p, nbytes); in kmb_ecc_do_scalar_op()
341 rc = ocs_ecc_trigger_op(ecc_dev, op_size, inst); in kmb_ecc_do_scalar_op()
342 if (rc) in kmb_ecc_do_scalar_op()
343 return rc; in kmb_ecc_do_scalar_op()
348 return -EINVAL; in kmb_ecc_do_scalar_op()
353 /* SP800-56A section 5.6.2.3.4 partial verification: ephemeral keys only */
361 int rc; in kmb_ocs_ecc_is_pubkey_valid_partial() local
363 if (WARN_ON(pk->ndigits != curve->g.ndigits)) in kmb_ocs_ecc_is_pubkey_valid_partial()
364 return -EINVAL; in kmb_ocs_ecc_is_pubkey_valid_partial()
368 return -EINVAL; in kmb_ocs_ecc_is_pubkey_valid_partial()
370 /* Check 2: Verify key is in the range [0, p-1]. */ in kmb_ocs_ecc_is_pubkey_valid_partial()
371 if (vli_cmp(curve->p, pk->x, pk->ndigits) != 1) in kmb_ocs_ecc_is_pubkey_valid_partial()
372 return -EINVAL; in kmb_ocs_ecc_is_pubkey_valid_partial()
374 if (vli_cmp(curve->p, pk->y, pk->ndigits) != 1) in kmb_ocs_ecc_is_pubkey_valid_partial()
375 return -EINVAL; in kmb_ocs_ecc_is_pubkey_valid_partial()
377 /* Check 3: Verify that y^2 == (x^3 + a·x + b) mod p */ in kmb_ocs_ecc_is_pubkey_valid_partial()
379 /* y^2 */ in kmb_ocs_ecc_is_pubkey_valid_partial()
380 /* Compute y^2 -> store in yy */ in kmb_ocs_ecc_is_pubkey_valid_partial()
381 rc = kmb_ecc_do_scalar_op(ecc_dev, yy, pk->y, pk->y, curve, pk->ndigits, in kmb_ocs_ecc_is_pubkey_valid_partial()
383 if (rc) in kmb_ocs_ecc_is_pubkey_valid_partial()
390 rc = kmb_ecc_do_scalar_op(ecc_dev, xxx, pk->x, w, curve, pk->ndigits, in kmb_ocs_ecc_is_pubkey_valid_partial()
392 if (rc) in kmb_ocs_ecc_is_pubkey_valid_partial()
395 /* Do a*x -> store in w. */ in kmb_ocs_ecc_is_pubkey_valid_partial()
396 rc = kmb_ecc_do_scalar_op(ecc_dev, w, curve->a, pk->x, curve, in kmb_ocs_ecc_is_pubkey_valid_partial()
397 pk->ndigits, in kmb_ocs_ecc_is_pubkey_valid_partial()
399 if (rc) in kmb_ocs_ecc_is_pubkey_valid_partial()
403 rc = kmb_ecc_do_scalar_op(ecc_dev, w, w, curve->b, curve, in kmb_ocs_ecc_is_pubkey_valid_partial()
404 pk->ndigits, in kmb_ocs_ecc_is_pubkey_valid_partial()
406 if (rc) in kmb_ocs_ecc_is_pubkey_valid_partial()
409 /* x^3 + ax + b == x^3 + w -> store in w. */ in kmb_ocs_ecc_is_pubkey_valid_partial()
410 rc = kmb_ecc_do_scalar_op(ecc_dev, w, xxx, w, curve, pk->ndigits, in kmb_ocs_ecc_is_pubkey_valid_partial()
412 if (rc) in kmb_ocs_ecc_is_pubkey_valid_partial()
415 /* Compare y^2 == x^3 + a·x + b. */ in kmb_ocs_ecc_is_pubkey_valid_partial()
416 rc = vli_cmp(yy, w, pk->ndigits); in kmb_ocs_ecc_is_pubkey_valid_partial()
417 if (rc) in kmb_ocs_ecc_is_pubkey_valid_partial()
418 rc = -EINVAL; in kmb_ocs_ecc_is_pubkey_valid_partial()
425 return rc; in kmb_ocs_ecc_is_pubkey_valid_partial()
428 /* SP800-56A section 5.6.2.3.3 full verification */
434 int rc; in kmb_ocs_ecc_is_pubkey_valid_full() local
437 rc = kmb_ocs_ecc_is_pubkey_valid_partial(ecc_dev, curve, pk); in kmb_ocs_ecc_is_pubkey_valid_full()
438 if (rc) in kmb_ocs_ecc_is_pubkey_valid_full()
439 return rc; in kmb_ocs_ecc_is_pubkey_valid_full()
442 nQ = ecc_alloc_point(pk->ndigits); in kmb_ocs_ecc_is_pubkey_valid_full()
444 return -ENOMEM; in kmb_ocs_ecc_is_pubkey_valid_full()
446 rc = kmb_ecc_point_mult(ecc_dev, nQ, pk, curve->n, curve); in kmb_ocs_ecc_is_pubkey_valid_full()
447 if (rc) in kmb_ocs_ecc_is_pubkey_valid_full()
451 rc = -EINVAL; in kmb_ocs_ecc_is_pubkey_valid_full()
456 return rc; in kmb_ocs_ecc_is_pubkey_valid_full()
462 size_t ndigits = curve->g.ndigits; in kmb_ecc_is_key_valid()
467 return -EINVAL; in kmb_ecc_is_key_valid()
470 return -EINVAL; in kmb_ecc_is_key_valid()
472 /* Make sure the private key is in the range [2, n-3]. */ in kmb_ecc_is_key_valid()
473 if (vli_cmp(one, private_key, ndigits) != -1) in kmb_ecc_is_key_valid()
474 return -EINVAL; in kmb_ecc_is_key_valid()
476 vli_sub(res, curve->n, one, ndigits); in kmb_ecc_is_key_valid()
479 return -EINVAL; in kmb_ecc_is_key_valid()
486 * equivalent to that described in FIPS 186-4, Appendix B.4.1.
490 * 0 <= c mod(n-1) <= n-2 and implies that
491 * 1 <= d <= n-1
494 * [1, n-1].
498 size_t nbytes = digits_to_bytes(curve->g.ndigits); in kmb_ecc_gen_privkey()
501 int rc; in kmb_ecc_gen_privkey() local
503 nbits = vli_num_bits(curve->n, curve->g.ndigits); in kmb_ecc_gen_privkey()
505 /* Check that N is included in Table 1 of FIPS 186-4, section 6.1.1 */ in kmb_ecc_gen_privkey()
506 if (nbits < 160 || curve->g.ndigits > ARRAY_SIZE(priv)) in kmb_ecc_gen_privkey()
507 return -EINVAL; in kmb_ecc_gen_privkey()
510 * FIPS 186-4 recommends that the private key should be obtained from a in kmb_ecc_gen_privkey()
514 * The maximum security strength identified by NIST SP800-57pt1r4 for in kmb_ecc_gen_privkey()
521 return -EFAULT; in kmb_ecc_gen_privkey()
523 rc = crypto_rng_get_bytes(crypto_default_rng, (u8 *)priv, nbytes); in kmb_ecc_gen_privkey()
525 if (rc) in kmb_ecc_gen_privkey()
528 rc = kmb_ecc_is_key_valid(curve, priv, nbytes); in kmb_ecc_gen_privkey()
529 if (rc) in kmb_ecc_gen_privkey()
532 ecc_swap_digits(priv, privkey, curve->g.ndigits); in kmb_ecc_gen_privkey()
537 return rc; in kmb_ecc_gen_privkey()
545 int rc = 0; in kmb_ocs_ecdh_set_secret() local
547 rc = crypto_ecdh_decode_key(buf, len, &params); in kmb_ocs_ecdh_set_secret()
548 if (rc) in kmb_ocs_ecdh_set_secret()
552 if (params.key_size > digits_to_bytes(tctx->curve->g.ndigits)) { in kmb_ocs_ecdh_set_secret()
553 rc = -EINVAL; in kmb_ocs_ecdh_set_secret()
557 /* Auto-generate private key is not provided. */ in kmb_ocs_ecdh_set_secret()
559 rc = kmb_ecc_gen_privkey(tctx->curve, tctx->private_key); in kmb_ocs_ecdh_set_secret()
563 rc = kmb_ecc_is_key_valid(tctx->curve, (const u64 *)params.key, in kmb_ocs_ecdh_set_secret()
565 if (rc) in kmb_ocs_ecdh_set_secret()
568 ecc_swap_digits((const u64 *)params.key, tctx->private_key, in kmb_ocs_ecdh_set_secret()
569 tctx->curve->g.ndigits); in kmb_ocs_ecdh_set_secret()
573 if (rc) in kmb_ocs_ecdh_set_secret()
574 tctx->curve = NULL; in kmb_ocs_ecdh_set_secret()
576 return rc; in kmb_ocs_ecdh_set_secret()
583 struct ocs_ecc_dev *ecc_dev = tctx->ecc_dev; in kmb_ecc_do_shared_secret()
584 const struct ecc_curve *curve = tctx->curve; in kmb_ecc_do_shared_secret()
589 int rc; in kmb_ecc_do_shared_secret() local
591 nbytes = digits_to_bytes(curve->g.ndigits); in kmb_ecc_do_shared_secret()
597 copied = sg_copy_to_buffer(req->src, in kmb_ecc_do_shared_secret()
598 sg_nents_for_len(req->src, pubk_len), in kmb_ecc_do_shared_secret()
601 return -EINVAL; in kmb_ecc_do_shared_secret()
604 pk = ecc_alloc_point(curve->g.ndigits); in kmb_ecc_do_shared_secret()
606 return -ENOMEM; in kmb_ecc_do_shared_secret()
608 ecc_swap_digits(pubk_buf, pk->x, curve->g.ndigits); in kmb_ecc_do_shared_secret()
609 ecc_swap_digits(&pubk_buf[curve->g.ndigits], pk->y, curve->g.ndigits); in kmb_ecc_do_shared_secret()
614 * Check 2: Verify key is in the range [1, p-1]. in kmb_ecc_do_shared_secret()
615 * Check 3: Verify that y^2 == (x^3 + a·x + b) mod p in kmb_ecc_do_shared_secret()
617 rc = kmb_ocs_ecc_is_pubkey_valid_partial(ecc_dev, curve, pk); in kmb_ecc_do_shared_secret()
618 if (rc) in kmb_ecc_do_shared_secret()
622 result = ecc_alloc_point(pk->ndigits); in kmb_ecc_do_shared_secret()
624 rc = -ENOMEM; in kmb_ecc_do_shared_secret()
629 rc = kmb_ecc_point_mult(ecc_dev, result, pk, tctx->private_key, curve); in kmb_ecc_do_shared_secret()
630 if (rc) in kmb_ecc_do_shared_secret()
634 rc = -EFAULT; in kmb_ecc_do_shared_secret()
639 ecc_swap_digits(result->x, shared_secret, result->ndigits); in kmb_ecc_do_shared_secret()
642 nbytes = min_t(size_t, nbytes, req->dst_len); in kmb_ecc_do_shared_secret()
644 copied = sg_copy_from_buffer(req->dst, in kmb_ecc_do_shared_secret()
645 sg_nents_for_len(req->dst, nbytes), in kmb_ecc_do_shared_secret()
649 rc = -EINVAL; in kmb_ecc_do_shared_secret()
659 return rc; in kmb_ecc_do_shared_secret()
666 const struct ecc_curve *curve = tctx->curve; in kmb_ecc_do_public_key()
671 int rc; in kmb_ecc_do_public_key() local
674 pubk_len = 2 * digits_to_bytes(curve->g.ndigits); in kmb_ecc_do_public_key()
676 pk = ecc_alloc_point(curve->g.ndigits); in kmb_ecc_do_public_key()
678 return -ENOMEM; in kmb_ecc_do_public_key()
681 rc = kmb_ecc_point_mult(tctx->ecc_dev, pk, &curve->g, tctx->private_key, in kmb_ecc_do_public_key()
683 if (rc) in kmb_ecc_do_public_key()
686 /* SP800-56A rev 3 5.6.2.1.3 key check */ in kmb_ecc_do_public_key()
687 if (kmb_ocs_ecc_is_pubkey_valid_full(tctx->ecc_dev, curve, pk)) { in kmb_ecc_do_public_key()
688 rc = -EAGAIN; in kmb_ecc_do_public_key()
693 ecc_swap_digits(pk->x, pubk_buf, pk->ndigits); in kmb_ecc_do_public_key()
694 ecc_swap_digits(pk->y, &pubk_buf[pk->ndigits], pk->ndigits); in kmb_ecc_do_public_key()
696 /* Copy public key to req->dst. */ in kmb_ecc_do_public_key()
697 copied = sg_copy_from_buffer(req->dst, in kmb_ecc_do_public_key()
698 sg_nents_for_len(req->dst, pubk_len), in kmb_ecc_do_public_key()
702 rc = -EINVAL; in kmb_ecc_do_public_key()
707 return rc; in kmb_ecc_do_public_key()
715 struct ocs_ecc_dev *ecc_dev = tctx->ecc_dev; in kmb_ocs_ecc_do_one_request()
716 int rc; in kmb_ocs_ecc_do_one_request() local
718 if (req->src) in kmb_ocs_ecc_do_one_request()
719 rc = kmb_ecc_do_shared_secret(tctx, req); in kmb_ocs_ecc_do_one_request()
721 rc = kmb_ecc_do_public_key(tctx, req); in kmb_ocs_ecc_do_one_request()
723 crypto_finalize_kpp_request(ecc_dev->engine, req, rc); in kmb_ocs_ecc_do_one_request()
731 const struct ecc_curve *curve = tctx->curve; in kmb_ocs_ecdh_generate_public_key()
734 if (!tctx->curve) in kmb_ocs_ecdh_generate_public_key()
735 return -EINVAL; in kmb_ocs_ecdh_generate_public_key()
738 if (!req->dst) in kmb_ocs_ecdh_generate_public_key()
739 return -EINVAL; in kmb_ocs_ecdh_generate_public_key()
742 if (req->dst_len < (2 * digits_to_bytes(curve->g.ndigits))) in kmb_ocs_ecdh_generate_public_key()
743 return -EINVAL; in kmb_ocs_ecdh_generate_public_key()
746 if (req->src) in kmb_ocs_ecdh_generate_public_key()
747 return -EINVAL; in kmb_ocs_ecdh_generate_public_key()
749 return crypto_transfer_kpp_request_to_engine(tctx->ecc_dev->engine, in kmb_ocs_ecdh_generate_public_key()
756 const struct ecc_curve *curve = tctx->curve; in kmb_ocs_ecdh_compute_shared_secret()
759 if (!tctx->curve) in kmb_ocs_ecdh_compute_shared_secret()
760 return -EINVAL; in kmb_ocs_ecdh_compute_shared_secret()
763 if (!req->dst) in kmb_ocs_ecdh_compute_shared_secret()
764 return -EINVAL; in kmb_ocs_ecdh_compute_shared_secret()
767 if (!req->src) in kmb_ocs_ecdh_compute_shared_secret()
768 return -EINVAL; in kmb_ocs_ecdh_compute_shared_secret()
771 * req->src is expected to the (other-side) public key, so its length in kmb_ocs_ecdh_compute_shared_secret()
774 if (req->src_len != 2 * digits_to_bytes(curve->g.ndigits)) in kmb_ocs_ecdh_compute_shared_secret()
775 return -EINVAL; in kmb_ocs_ecdh_compute_shared_secret()
777 return crypto_transfer_kpp_request_to_engine(tctx->ecc_dev->engine, in kmb_ocs_ecdh_compute_shared_secret()
785 tctx->ecc_dev = kmb_ocs_ecc_find_dev(tctx); in kmb_ecc_tctx_init()
787 if (IS_ERR(tctx->ecc_dev)) { in kmb_ecc_tctx_init()
789 PTR_ERR(tctx->ecc_dev)); in kmb_ecc_tctx_init()
790 return PTR_ERR(tctx->ecc_dev); in kmb_ecc_tctx_init()
793 tctx->curve = ecc_get_curve(curve_id); in kmb_ecc_tctx_init()
794 if (!tctx->curve) in kmb_ecc_tctx_init()
795 return -EOPNOTSUPP; in kmb_ecc_tctx_init()
797 tctx->engine_ctx.op.prepare_request = NULL; in kmb_ecc_tctx_init()
798 tctx->engine_ctx.op.do_one_request = kmb_ocs_ecc_do_one_request; in kmb_ecc_tctx_init()
799 tctx->engine_ctx.op.unprepare_request = NULL; in kmb_ecc_tctx_init()
822 memzero_explicit(tctx->private_key, sizeof(*tctx->private_key)); in kmb_ocs_ecdh_exit_tfm()
830 return digits_to_bytes(tctx->curve->g.ndigits) * 2; in kmb_ocs_ecdh_max_size()
841 .cra_name = "ecdh-nist-p256",
842 .cra_driver_name = "ecdh-nist-p256-keembay-ocs",
857 .cra_name = "ecdh-nist-p384",
858 .cra_driver_name = "ecdh-nist-p384-keembay-ocs",
874 status = ioread32(ecc_dev->base_reg + HW_OFFS_OCS_ECC_ISR); in ocs_ecc_irq_handler()
875 iowrite32(status, ecc_dev->base_reg + HW_OFFS_OCS_ECC_ISR); in ocs_ecc_irq_handler()
880 complete(&ecc_dev->irq_done); in ocs_ecc_irq_handler()
887 struct device *dev = &pdev->dev; in kmb_ocs_ecc_probe()
889 int rc; in kmb_ocs_ecc_probe() local
893 return -ENOMEM; in kmb_ocs_ecc_probe()
895 ecc_dev->dev = dev; in kmb_ocs_ecc_probe()
899 INIT_LIST_HEAD(&ecc_dev->list); in kmb_ocs_ecc_probe()
900 init_completion(&ecc_dev->irq_done); in kmb_ocs_ecc_probe()
903 ecc_dev->base_reg = devm_platform_ioremap_resource(pdev, 0); in kmb_ocs_ecc_probe()
904 if (IS_ERR(ecc_dev->base_reg)) { in kmb_ocs_ecc_probe()
906 rc = PTR_ERR(ecc_dev->base_reg); in kmb_ocs_ecc_probe()
911 ecc_dev->irq = platform_get_irq(pdev, 0); in kmb_ocs_ecc_probe()
912 if (ecc_dev->irq < 0) { in kmb_ocs_ecc_probe()
913 rc = ecc_dev->irq; in kmb_ocs_ecc_probe()
917 rc = devm_request_threaded_irq(dev, ecc_dev->irq, ocs_ecc_irq_handler, in kmb_ocs_ecc_probe()
918 NULL, 0, "keembay-ocs-ecc", ecc_dev); in kmb_ocs_ecc_probe()
919 if (rc < 0) { in kmb_ocs_ecc_probe()
926 list_add_tail(&ecc_dev->list, &ocs_ecc.dev_list); in kmb_ocs_ecc_probe()
930 ecc_dev->engine = crypto_engine_alloc_init(dev, 1); in kmb_ocs_ecc_probe()
931 if (!ecc_dev->engine) { in kmb_ocs_ecc_probe()
933 rc = -ENOMEM; in kmb_ocs_ecc_probe()
937 rc = crypto_engine_start(ecc_dev->engine); in kmb_ocs_ecc_probe()
938 if (rc) { in kmb_ocs_ecc_probe()
944 rc = crypto_register_kpp(&ocs_ecdh_p256); in kmb_ocs_ecc_probe()
945 if (rc) { in kmb_ocs_ecc_probe()
951 rc = crypto_register_kpp(&ocs_ecdh_p384); in kmb_ocs_ecc_probe()
952 if (rc) { in kmb_ocs_ecc_probe()
964 crypto_engine_exit(ecc_dev->engine); in kmb_ocs_ecc_probe()
968 list_del(&ecc_dev->list); in kmb_ocs_ecc_probe()
971 return rc; in kmb_ocs_ecc_probe()
984 list_del(&ecc_dev->list); in kmb_ocs_ecc_remove()
987 crypto_engine_exit(ecc_dev->engine); in kmb_ocs_ecc_remove()
995 .compatible = "intel,keembay-ocs-ecc",
1013 MODULE_ALIAS_CRYPTO("ecdh-nist-p256");
1014 MODULE_ALIAS_CRYPTO("ecdh-nist-p384");
1015 MODULE_ALIAS_CRYPTO("ecdh-nist-p256-keembay-ocs");
1016 MODULE_ALIAS_CRYPTO("ecdh-nist-p384-keembay-ocs");