aboutsummaryrefslogtreecommitdiff
path: root/src/util/crypto_ecc.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2020-04-11 21:43:28 +0200
committerChristian Grothoff <christian@grothoff.org>2020-04-11 21:43:34 +0200
commit90ff9edfa9c5fcfa3a36d1653ff105e89b888e21 (patch)
tree780a2071f5072c8e8e044db741eb295c3f3ea2a7 /src/util/crypto_ecc.c
parent3bcfe59f1ce533246bda271f00b3ee957cae304d (diff)
downloadgnunet-90ff9edfa9c5fcfa3a36d1653ff105e89b888e21.tar.gz
gnunet-90ff9edfa9c5fcfa3a36d1653ff105e89b888e21.zip
fixing #6149
Diffstat (limited to 'src/util/crypto_ecc.c')
-rw-r--r--src/util/crypto_ecc.c96
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 */
498struct GNUNET_CRYPTO_EcdhePrivateKey * 498void
499GNUNET_CRYPTO_ecdhe_key_create () 499GNUNET_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 */
520int
521GNUNET_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 */
537struct GNUNET_CRYPTO_EcdsaPrivateKey * 514void
538GNUNET_CRYPTO_ecdsa_key_create () 515GNUNET_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 */
593struct GNUNET_CRYPTO_EddsaPrivateKey * 577void
594GNUNET_CRYPTO_eddsa_key_create () 578GNUNET_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