diff options
-rw-r--r-- | src/include/gnunet_crypto_lib.h | 11 | ||||
-rw-r--r-- | src/util/crypto_ecc.c | 35 |
2 files changed, 39 insertions, 7 deletions
diff --git a/src/include/gnunet_crypto_lib.h b/src/include/gnunet_crypto_lib.h index 43fd32a58..07cade0e3 100644 --- a/src/include/gnunet_crypto_lib.h +++ b/src/include/gnunet_crypto_lib.h | |||
@@ -1240,6 +1240,17 @@ GNUNET_CRYPTO_eddsa_key_create (void); | |||
1240 | 1240 | ||
1241 | /** | 1241 | /** |
1242 | * @ingroup crypto | 1242 | * @ingroup crypto |
1243 | * Create a new private key. Clear with #GNUNET_CRYPTO_ecdhe_key_clear(). | ||
1244 | * | ||
1245 | * @param[out] pk set to fresh private key; | ||
1246 | * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure | ||
1247 | */ | ||
1248 | int | ||
1249 | GNUNET_CRYPTO_ecdhe_key_create2 (struct GNUNET_CRYPTO_EcdhePrivateKey *pk); | ||
1250 | |||
1251 | |||
1252 | /** | ||
1253 | * @ingroup crypto | ||
1243 | * Create a new private key. Caller must free return value. | 1254 | * Create a new private key. Caller must free return value. |
1244 | * | 1255 | * |
1245 | * @return fresh private key; free using #GNUNET_free | 1256 | * @return fresh private key; free using #GNUNET_free |
diff --git a/src/util/crypto_ecc.c b/src/util/crypto_ecc.c index 4bba395b3..3f9150762 100644 --- a/src/util/crypto_ecc.c +++ b/src/util/crypto_ecc.c | |||
@@ -488,6 +488,28 @@ struct GNUNET_CRYPTO_EcdhePrivateKey * | |||
488 | GNUNET_CRYPTO_ecdhe_key_create () | 488 | GNUNET_CRYPTO_ecdhe_key_create () |
489 | { | 489 | { |
490 | struct GNUNET_CRYPTO_EcdhePrivateKey *priv; | 490 | struct GNUNET_CRYPTO_EcdhePrivateKey *priv; |
491 | |||
492 | priv = GNUNET_new (struct GNUNET_CRYPTO_EcdhePrivateKey); | ||
493 | if (GNUNET_OK != | ||
494 | GNUNET_CRYPTO_ecdhe_key_create2 (priv)) | ||
495 | { | ||
496 | GNUNET_free (priv); | ||
497 | return NULL; | ||
498 | } | ||
499 | return priv; | ||
500 | } | ||
501 | |||
502 | |||
503 | /** | ||
504 | * @ingroup crypto | ||
505 | * Create a new private key. Clear with #GNUNET_CRYPTO_ecdhe_key_clear(). | ||
506 | * | ||
507 | * @param[out] pk set to fresh private key; | ||
508 | * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure | ||
509 | */ | ||
510 | int | ||
511 | GNUNET_CRYPTO_ecdhe_key_create2 (struct GNUNET_CRYPTO_EcdhePrivateKey *pk) | ||
512 | { | ||
491 | gcry_sexp_t priv_sexp; | 513 | gcry_sexp_t priv_sexp; |
492 | gcry_sexp_t s_keyparam; | 514 | gcry_sexp_t s_keyparam; |
493 | gcry_mpi_t d; | 515 | gcry_mpi_t d; |
@@ -503,13 +525,13 @@ GNUNET_CRYPTO_ecdhe_key_create () | |||
503 | "(flags eddsa no-keytest)))"))) | 525 | "(flags eddsa no-keytest)))"))) |
504 | { | 526 | { |
505 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, "gcry_sexp_build", rc); | 527 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, "gcry_sexp_build", rc); |
506 | return NULL; | 528 | return GNUNET_SYSERR; |
507 | } | 529 | } |
508 | if (0 != (rc = gcry_pk_genkey (&priv_sexp, s_keyparam))) | 530 | if (0 != (rc = gcry_pk_genkey (&priv_sexp, s_keyparam))) |
509 | { | 531 | { |
510 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, "gcry_pk_genkey", rc); | 532 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, "gcry_pk_genkey", rc); |
511 | gcry_sexp_release (s_keyparam); | 533 | gcry_sexp_release (s_keyparam); |
512 | return NULL; | 534 | return GNUNET_SYSERR; |
513 | } | 535 | } |
514 | gcry_sexp_release (s_keyparam); | 536 | gcry_sexp_release (s_keyparam); |
515 | #if EXTRA_CHECKS | 537 | #if EXTRA_CHECKS |
@@ -517,20 +539,19 @@ GNUNET_CRYPTO_ecdhe_key_create () | |||
517 | { | 539 | { |
518 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, "gcry_pk_testkey", rc); | 540 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, "gcry_pk_testkey", rc); |
519 | gcry_sexp_release (priv_sexp); | 541 | gcry_sexp_release (priv_sexp); |
520 | return NULL; | 542 | return GNUNET_SYSERR; |
521 | } | 543 | } |
522 | #endif | 544 | #endif |
523 | if (0 != (rc = key_from_sexp (&d, priv_sexp, "private-key", "d"))) | 545 | if (0 != (rc = key_from_sexp (&d, priv_sexp, "private-key", "d"))) |
524 | { | 546 | { |
525 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, "key_from_sexp", rc); | 547 | LOG_GCRY (GNUNET_ERROR_TYPE_ERROR, "key_from_sexp", rc); |
526 | gcry_sexp_release (priv_sexp); | 548 | gcry_sexp_release (priv_sexp); |
527 | return NULL; | 549 | return GNUNET_SYSERR; |
528 | } | 550 | } |
529 | gcry_sexp_release (priv_sexp); | 551 | gcry_sexp_release (priv_sexp); |
530 | priv = GNUNET_new (struct GNUNET_CRYPTO_EcdhePrivateKey); | 552 | GNUNET_CRYPTO_mpi_print_unsigned (pk->d, sizeof (pk->d), d); |
531 | GNUNET_CRYPTO_mpi_print_unsigned (priv->d, sizeof (priv->d), d); | ||
532 | gcry_mpi_release (d); | 553 | gcry_mpi_release (d); |
533 | return priv; | 554 | return GNUNET_OK; |
534 | } | 555 | } |
535 | 556 | ||
536 | 557 | ||