From c334d5ea05a0353afe3ca3ecd18b2353be2b2031 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 18 Apr 2015 00:24:04 +0200 Subject: [PATCH] implementing /test/ecdhe --- src/mint/taler-mint-httpd.c | 9 ++++- src/mint/taler-mint-httpd_test.c | 67 +++++++++++++++++++++++++++++++- src/mint/taler-mint-httpd_test.h | 22 +++++++++++ 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/src/mint/taler-mint-httpd.c b/src/mint/taler-mint-httpd.c index c61d57985..b04583c2a 100644 --- a/src/mint/taler-mint-httpd.c +++ b/src/mint/taler-mint-httpd.c @@ -211,13 +211,20 @@ handle_mhd_request (void *cls, "Only POST is allowed", 0, &TMH_MHD_handler_send_json_pack_error, MHD_HTTP_METHOD_NOT_ALLOWED }, + { "/test/ecdhe", MHD_HTTP_METHOD_POST, "application/json", + NULL, 0, + &TMH_TEST_handler_test_ecdhe, MHD_HTTP_OK }, + { "/test/ecdhe", NULL, "text/plain", + "Only POST is allowed", 0, + &TMH_MHD_handler_send_json_pack_error, MHD_HTTP_METHOD_NOT_ALLOWED }, + { "/test/ecdsa", MHD_HTTP_METHOD_POST, "application/json", NULL, 0, &TMH_TEST_handler_test_ecdsa, MHD_HTTP_OK }, { "/test/ecdsa", NULL, "text/plain", "Only POST is allowed", 0, &TMH_MHD_handler_send_json_pack_error, MHD_HTTP_METHOD_NOT_ALLOWED }, - + { "/test/eddsa", MHD_HTTP_METHOD_POST, "application/json", NULL, 0, &TMH_TEST_handler_test_eddsa, MHD_HTTP_OK }, diff --git a/src/mint/taler-mint-httpd_test.c b/src/mint/taler-mint-httpd_test.c index 7889ff805..004138e80 100644 --- a/src/mint/taler-mint-httpd_test.c +++ b/src/mint/taler-mint-httpd_test.c @@ -20,7 +20,6 @@ * @author Christian Grothoff * * TODO: - * - ECDHE operations * - HKDF operations * - Symmetric encryption/decryption * - high-level transfer key logic @@ -94,6 +93,72 @@ TMH_TEST_handler_test_base32 (struct TMH_RequestHandler *rh, } +/** + * Handle a "/test/ecdhe" request. Parses the JSON in the post, which + * must contain a "ecdhe_pub" with a public key and an "ecdhe_priv" + * with a private key. The reply is the resulting JSON is an object + * with the field "ecdh_hash" containing a Crockford Base32-encoded + * string representing the hash derived via ECDH of the two keys. + * + * @param rh context of the handler + * @param connection the MHD connection to handle + * @param[in,out] connection_cls the connection's closure (can be updated) + * @param upload_data upload data + * @param[in,out] upload_data_size number of bytes (left) in @a upload_data + * @return MHD result code + */ +int +TMH_TEST_handler_test_ecdhe (struct TMH_RequestHandler *rh, + struct MHD_Connection *connection, + void **connection_cls, + const char *upload_data, + size_t *upload_data_size) +{ + json_t *json; + int res; + struct GNUNET_CRYPTO_EcdhePublicKey pub; + struct GNUNET_CRYPTO_EcdhePrivateKey priv; + struct GNUNET_HashCode hc; + struct TMH_PARSE_FieldSpecification spec[] = { + TMH_PARSE_MEMBER_FIXED ("ecdhe_pub", &pub), + TMH_PARSE_MEMBER_FIXED ("ecdhe_priv", &priv), + TMH_PARSE_MEMBER_END + }; + + res = TMH_PARSE_post_json (connection, + connection_cls, + upload_data, + upload_data_size, + &json); + if (GNUNET_SYSERR == res) + return MHD_NO; + if ( (GNUNET_NO == res) || (NULL == json) ) + return MHD_YES; + res = TMH_PARSE_json_data (connection, + json, + spec); + json_decref (json); + if (GNUNET_YES != res) + return (GNUNET_NO == res) ? MHD_YES : MHD_NO; + if (GNUNET_OK != + GNUNET_CRYPTO_ecc_ecdh (&priv, + &pub, + &hc)) + { + TMH_PARSE_release_data (spec); + return TMH_RESPONSE_reply_internal_error (connection, + "Failed to perform ECDH"); + } + TMH_PARSE_release_data (spec); + return TMH_RESPONSE_reply_json_pack (connection, + MHD_HTTP_OK, + "{s:o}", + "ecdh_hash", + TALER_json_from_data (&hc, + sizeof (hc))); +} + + /** * Handle a "/test/ecdsa" request. Parses the JSON in the post, * which must contain a "ecdsa_pub" with a public key and an diff --git a/src/mint/taler-mint-httpd_test.h b/src/mint/taler-mint-httpd_test.h index 9d340eb4f..4ac1d94a0 100644 --- a/src/mint/taler-mint-httpd_test.h +++ b/src/mint/taler-mint-httpd_test.h @@ -49,6 +49,28 @@ TMH_TEST_handler_test_base32 (struct TMH_RequestHandler *rh, size_t *upload_data_size); +/** + * Handle a "/test/ecdhe" request. Parses the JSON in the post, which + * must contain a "ecdhe_pub" with a public key and an "ecdhe_priv" + * with a private key. The reply is the resulting JSON is an object + * with the field "ecdh_hash" containing a Crockford Base32-encoded + * string representing the hash derived via ECDH of the two keys. + * + * @param rh context of the handler + * @param connection the MHD connection to handle + * @param[in,out] connection_cls the connection's closure (can be updated) + * @param upload_data upload data + * @param[in,out] upload_data_size number of bytes (left) in @a upload_data + * @return MHD result code + */ +int +TMH_TEST_handler_test_ecdhe (struct TMH_RequestHandler *rh, + struct MHD_Connection *connection, + void **connection_cls, + const char *upload_data, + size_t *upload_data_size); + + /** * Handle a "/test/ecdsa" request. Parses the JSON in the post, * which must contain a "ecdsa_pub" with a public key and an