diff options
author | Christian Grothoff <christian@grothoff.org> | 2018-05-17 12:26:30 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2018-05-17 12:26:30 +0200 |
commit | dd8289771b35e5ea36ebdcbfd5b09b599bd59c67 (patch) | |
tree | e79e565302867ab16d9ed8560793919094288716 /src/util/crypto_ecc.c | |
parent | 3175cde841a8a7836fcf74a3e1b804c71a3aa153 (diff) | |
download | gnunet-dd8289771b35e5ea36ebdcbfd5b09b599bd59c67.tar.gz gnunet-dd8289771b35e5ea36ebdcbfd5b09b599bd59c67.zip |
work-around for crypto bug (to be documented more)
Diffstat (limited to 'src/util/crypto_ecc.c')
-rw-r--r-- | src/util/crypto_ecc.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/src/util/crypto_ecc.c b/src/util/crypto_ecc.c index 8cc6c18cb..1abf0fddc 100644 --- a/src/util/crypto_ecc.c +++ b/src/util/crypto_ecc.c | |||
@@ -52,6 +52,9 @@ | |||
52 | #define LOG_GCRY(level, cmd, rc) do { LOG(level, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, gcry_strerror(rc)); } while(0) | 52 | #define LOG_GCRY(level, cmd, rc) do { LOG(level, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, gcry_strerror(rc)); } while(0) |
53 | 53 | ||
54 | 54 | ||
55 | #include "crypto_bug.c" | ||
56 | |||
57 | |||
55 | /** | 58 | /** |
56 | * Extract values from an S-expression. | 59 | * Extract values from an S-expression. |
57 | * | 60 | * |
@@ -455,7 +458,7 @@ GNUNET_CRYPTO_eddsa_public_key_from_string (const char *enc, | |||
455 | int | 458 | int |
456 | GNUNET_CRYPTO_eddsa_private_key_from_string (const char *enc, | 459 | GNUNET_CRYPTO_eddsa_private_key_from_string (const char *enc, |
457 | size_t enclen, | 460 | size_t enclen, |
458 | struct GNUNET_CRYPTO_EddsaPrivateKey *pub) | 461 | struct GNUNET_CRYPTO_EddsaPrivateKey *priv) |
459 | { | 462 | { |
460 | size_t keylen = (sizeof (struct GNUNET_CRYPTO_EddsaPrivateKey)) * 8; | 463 | size_t keylen = (sizeof (struct GNUNET_CRYPTO_EddsaPrivateKey)) * 8; |
461 | 464 | ||
@@ -465,10 +468,19 @@ GNUNET_CRYPTO_eddsa_private_key_from_string (const char *enc, | |||
465 | if (enclen != keylen) | 468 | if (enclen != keylen) |
466 | return GNUNET_SYSERR; | 469 | return GNUNET_SYSERR; |
467 | 470 | ||
468 | if (GNUNET_OK != GNUNET_STRINGS_string_to_data (enc, enclen, | 471 | if (GNUNET_OK != |
469 | pub, | 472 | GNUNET_STRINGS_string_to_data (enc, enclen, |
470 | sizeof (struct GNUNET_CRYPTO_EddsaPrivateKey))) | 473 | priv, |
474 | sizeof (struct GNUNET_CRYPTO_EddsaPrivateKey))) | ||
471 | return GNUNET_SYSERR; | 475 | return GNUNET_SYSERR; |
476 | #if CRYPTO_BUG | ||
477 | if (GNUNET_OK != | ||
478 | check_eddsa_key (priv)) | ||
479 | { | ||
480 | GNUNET_break (0); | ||
481 | return GNUNET_OK; | ||
482 | } | ||
483 | #endif | ||
472 | return GNUNET_OK; | 484 | return GNUNET_OK; |
473 | } | 485 | } |
474 | 486 | ||
@@ -651,6 +663,9 @@ GNUNET_CRYPTO_eddsa_key_create () | |||
651 | gcry_mpi_t d; | 663 | gcry_mpi_t d; |
652 | int rc; | 664 | int rc; |
653 | 665 | ||
666 | #if CRYPTO_BUG | ||
667 | again: | ||
668 | #endif | ||
654 | if (0 != (rc = gcry_sexp_build (&s_keyparam, NULL, | 669 | if (0 != (rc = gcry_sexp_build (&s_keyparam, NULL, |
655 | "(genkey(ecc(curve \"" CURVE "\")" | 670 | "(genkey(ecc(curve \"" CURVE "\")" |
656 | "(flags eddsa)))"))) | 671 | "(flags eddsa)))"))) |
@@ -683,6 +698,17 @@ GNUNET_CRYPTO_eddsa_key_create () | |||
683 | priv = GNUNET_new (struct GNUNET_CRYPTO_EddsaPrivateKey); | 698 | priv = GNUNET_new (struct GNUNET_CRYPTO_EddsaPrivateKey); |
684 | GNUNET_CRYPTO_mpi_print_unsigned (priv->d, sizeof (priv->d), d); | 699 | GNUNET_CRYPTO_mpi_print_unsigned (priv->d, sizeof (priv->d), d); |
685 | gcry_mpi_release (d); | 700 | gcry_mpi_release (d); |
701 | |||
702 | #if CRYPTO_BUG | ||
703 | if (GNUNET_OK != | ||
704 | check_eddsa_key (priv)) | ||
705 | { | ||
706 | GNUNET_break (0); | ||
707 | GNUNET_free (priv); | ||
708 | goto again; | ||
709 | } | ||
710 | #endif | ||
711 | |||
686 | return priv; | 712 | return priv; |
687 | } | 713 | } |
688 | 714 | ||