diff options
author | Christian Grothoff <christian@grothoff.org> | 2020-04-11 21:43:28 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2020-04-11 21:43:34 +0200 |
commit | 90ff9edfa9c5fcfa3a36d1653ff105e89b888e21 (patch) | |
tree | 780a2071f5072c8e8e044db741eb295c3f3ea2a7 /src/util/crypto_ecc.c | |
parent | 3bcfe59f1ce533246bda271f00b3ee957cae304d (diff) | |
download | gnunet-90ff9edfa9c5fcfa3a36d1653ff105e89b888e21.tar.gz gnunet-90ff9edfa9c5fcfa3a36d1653ff105e89b888e21.zip |
fixing #6149
Diffstat (limited to 'src/util/crypto_ecc.c')
-rw-r--r-- | src/util/crypto_ecc.c | 96 |
1 files changed, 38 insertions, 58 deletions
diff --git a/src/util/crypto_ecc.c b/src/util/crypto_ecc.c index 4c1169f43..851a45f93 100644 --- a/src/util/crypto_ecc.c +++ b/src/util/crypto_ecc.c | |||
@@ -491,118 +491,98 @@ GNUNET_CRYPTO_eddsa_key_clear (struct GNUNET_CRYPTO_EddsaPrivateKey *pk) | |||
491 | 491 | ||
492 | 492 | ||
493 | /** | 493 | /** |
494 | * Create a new private key. Caller must free return value. | 494 | * Create a new private key. |
495 | * | 495 | * |
496 | * @return fresh private key | 496 | * @param[out] pk fresh private key |
497 | */ | 497 | */ |
498 | struct GNUNET_CRYPTO_EcdhePrivateKey * | 498 | void |
499 | GNUNET_CRYPTO_ecdhe_key_create () | 499 | GNUNET_CRYPTO_ecdhe_key_create (struct GNUNET_CRYPTO_EcdhePrivateKey *pk) |
500 | { | ||
501 | struct GNUNET_CRYPTO_EcdhePrivateKey *priv; | ||
502 | |||
503 | priv = GNUNET_new (struct GNUNET_CRYPTO_EcdhePrivateKey); | ||
504 | if (GNUNET_OK != GNUNET_CRYPTO_ecdhe_key_create2 (priv)) | ||
505 | { | ||
506 | GNUNET_free (priv); | ||
507 | return NULL; | ||
508 | } | ||
509 | return priv; | ||
510 | } | ||
511 | |||
512 | |||
513 | /** | ||
514 | * @ingroup crypto | ||
515 | * Create a new private key. Clear with #GNUNET_CRYPTO_ecdhe_key_clear(). | ||
516 | * | ||
517 | * @param[out] pk set to fresh private key; | ||
518 | * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure | ||
519 | */ | ||
520 | int | ||
521 | GNUNET_CRYPTO_ecdhe_key_create2 (struct GNUNET_CRYPTO_EcdhePrivateKey *pk) | ||
522 | { | 500 | { |
523 | BENCHMARK_START (ecdhe_key_create); | 501 | BENCHMARK_START (ecdhe_key_create); |
524 | GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_NONCE, | 502 | GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_NONCE, |
525 | pk, | 503 | pk, |
526 | sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey)); | 504 | sizeof (struct GNUNET_CRYPTO_EcdhePrivateKey)); |
527 | BENCHMARK_END (ecdhe_key_create); | 505 | BENCHMARK_END (ecdhe_key_create); |
528 | return GNUNET_OK; | ||
529 | } | 506 | } |
530 | 507 | ||
531 | 508 | ||
532 | /** | 509 | /** |
533 | * Create a new private key. Caller must free return value. | 510 | * Create a new private key. |
534 | * | 511 | * |
535 | * @return fresh private key | 512 | * @param[out] pk private key to initialize |
536 | */ | 513 | */ |
537 | struct GNUNET_CRYPTO_EcdsaPrivateKey * | 514 | void |
538 | GNUNET_CRYPTO_ecdsa_key_create () | 515 | GNUNET_CRYPTO_ecdsa_key_create (struct GNUNET_CRYPTO_EcdsaPrivateKey *pk) |
539 | { | 516 | { |
540 | struct GNUNET_CRYPTO_EcdsaPrivateKey *priv; | ||
541 | gcry_sexp_t priv_sexp; | 517 | gcry_sexp_t priv_sexp; |
542 | gcry_sexp_t s_keyparam; | 518 | gcry_sexp_t s_keyparam; |
543 | gcry_mpi_t d; | 519 | gcry_mpi_t d; |
544 | int rc; | 520 | int rc; |
545 | 521 | ||
546 | BENCHMARK_START (ecdsa_key_create); | 522 | BENCHMARK_START (ecdsa_key_create); |
547 | |||
548 | if (0 != (rc = gcry_sexp_build (&s_keyparam, | 523 | if (0 != (rc = gcry_sexp_build (&s_keyparam, |
549 | NULL, | 524 | NULL, |
550 | "(genkey(ecc(curve \"" CURVE "\")" | 525 | "(genkey(ecc(curve \"" CURVE "\")" |
551 | "(flags)))"))) | 526 | "(flags)))"))) |
552 | { | 527 | { |
553 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, "gcry_sexp_build", rc); | 528 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, |
554 | return NULL; | 529 | "gcry_sexp_build", |
530 | rc); | ||
531 | GNUNET_assert (0); | ||
555 | } | 532 | } |
556 | if (0 != (rc = gcry_pk_genkey (&priv_sexp, s_keyparam))) | 533 | if (0 != (rc = gcry_pk_genkey (&priv_sexp, |
534 | s_keyparam))) | ||
557 | { | 535 | { |
558 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, "gcry_pk_genkey", rc); | 536 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, |
537 | "gcry_pk_genkey", | ||
538 | rc); | ||
559 | gcry_sexp_release (s_keyparam); | 539 | gcry_sexp_release (s_keyparam); |
560 | return NULL; | 540 | GNUNET_assert (0); |
561 | } | 541 | } |
562 | gcry_sexp_release (s_keyparam); | 542 | gcry_sexp_release (s_keyparam); |
563 | #if EXTRA_CHECKS | 543 | #if EXTRA_CHECKS |
564 | if (0 != (rc = gcry_pk_testkey (priv_sexp))) | 544 | if (0 != (rc = gcry_pk_testkey (priv_sexp))) |
565 | { | 545 | { |
566 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, "gcry_pk_testkey", rc); | 546 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, |
547 | "gcry_pk_testkey", | ||
548 | rc); | ||
567 | gcry_sexp_release (priv_sexp); | 549 | gcry_sexp_release (priv_sexp); |
568 | return NULL; | 550 | GNUNET_assert (0); |
569 | } | 551 | } |
570 | #endif | 552 | #endif |
571 | if (0 != (rc = key_from_sexp (&d, priv_sexp, "private-key", "d"))) | 553 | if (0 != (rc = key_from_sexp (&d, priv_sexp, |
554 | "private-key", | ||
555 | "d"))) | ||
572 | { | 556 | { |
573 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, "key_from_sexp", rc); | 557 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, |
558 | "key_from_sexp", | ||
559 | rc); | ||
574 | gcry_sexp_release (priv_sexp); | 560 | gcry_sexp_release (priv_sexp); |
575 | return NULL; | 561 | GNUNET_assert (0); |
576 | } | 562 | } |
577 | gcry_sexp_release (priv_sexp); | 563 | gcry_sexp_release (priv_sexp); |
578 | priv = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPrivateKey); | 564 | GNUNET_CRYPTO_mpi_print_unsigned (pk->d, |
579 | GNUNET_CRYPTO_mpi_print_unsigned (priv->d, sizeof(priv->d), d); | 565 | sizeof(pk->d), |
566 | d); | ||
580 | gcry_mpi_release (d); | 567 | gcry_mpi_release (d); |
581 | |||
582 | BENCHMARK_END (ecdsa_key_create); | 568 | BENCHMARK_END (ecdsa_key_create); |
583 | |||
584 | return priv; | ||
585 | } | 569 | } |
586 | 570 | ||
587 | 571 | ||
588 | /** | 572 | /** |
589 | * Create a new private key. Caller must free return value. | 573 | * Create a new private key. |
590 | * | 574 | * |
591 | * @return fresh private key | 575 | * @param[out] pk set to fresh private key |
592 | */ | 576 | */ |
593 | struct GNUNET_CRYPTO_EddsaPrivateKey * | 577 | void |
594 | GNUNET_CRYPTO_eddsa_key_create () | 578 | GNUNET_CRYPTO_eddsa_key_create (struct GNUNET_CRYPTO_EddsaPrivateKey *pk) |
595 | { | 579 | { |
596 | struct GNUNET_CRYPTO_EddsaPrivateKey *priv; | ||
597 | |||
598 | BENCHMARK_START (eddsa_key_create); | 580 | BENCHMARK_START (eddsa_key_create); |
599 | priv = GNUNET_new (struct GNUNET_CRYPTO_EddsaPrivateKey); | ||
600 | GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_NONCE, | 581 | GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_NONCE, |
601 | priv, | 582 | pk, |
602 | sizeof (struct GNUNET_CRYPTO_EddsaPrivateKey)); | 583 | sizeof (struct GNUNET_CRYPTO_EddsaPrivateKey)); |
584 | // FIXME: should we not do the clamping here? Or is this done elsewhere? | ||
603 | BENCHMARK_END (eddsa_key_create); | 585 | BENCHMARK_END (eddsa_key_create); |
604 | |||
605 | return priv; | ||
606 | } | 586 | } |
607 | 587 | ||
608 | 588 | ||