aboutsummaryrefslogtreecommitdiff
path: root/src/util/crypto_ecc.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2018-05-17 12:26:30 +0200
committerChristian Grothoff <christian@grothoff.org>2018-05-17 12:26:30 +0200
commitdd8289771b35e5ea36ebdcbfd5b09b599bd59c67 (patch)
treee79e565302867ab16d9ed8560793919094288716 /src/util/crypto_ecc.c
parent3175cde841a8a7836fcf74a3e1b804c71a3aa153 (diff)
downloadgnunet-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.c34
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,
455int 458int
456GNUNET_CRYPTO_eddsa_private_key_from_string (const char *enc, 459GNUNET_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