From c5b0d8c76eacbafc4990f247e1de41304265801a Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 18 Apr 2015 00:30:21 +0200 Subject: [PATCH] implementing /test/hkdf --- src/mint/taler-mint-httpd.c | 7 ++++ src/mint/taler-mint-httpd_test.c | 65 +++++++++++++++++++++++++++++++- src/mint/taler-mint-httpd_test.h | 25 ++++++++++++ 3 files changed, 95 insertions(+), 2 deletions(-) diff --git a/src/mint/taler-mint-httpd.c b/src/mint/taler-mint-httpd.c index b04583c2a..2b7d1d5e2 100644 --- a/src/mint/taler-mint-httpd.c +++ b/src/mint/taler-mint-httpd.c @@ -211,6 +211,13 @@ handle_mhd_request (void *cls, "Only POST is allowed", 0, &TMH_MHD_handler_send_json_pack_error, MHD_HTTP_METHOD_NOT_ALLOWED }, + { "/test/hkdf", MHD_HTTP_METHOD_POST, "application/json", + NULL, 0, + &TMH_TEST_handler_test_hkdf, MHD_HTTP_OK }, + { "/test/hkdf", NULL, "text/plain", + "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 }, diff --git a/src/mint/taler-mint-httpd_test.c b/src/mint/taler-mint-httpd_test.c index 004138e80..5061b22b8 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: - * - HKDF operations * - Symmetric encryption/decryption * - high-level transfer key logic */ @@ -49,7 +48,7 @@ * @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_base32 (struct TMH_RequestHandler *rh, struct MHD_Connection *connection, @@ -93,6 +92,68 @@ TMH_TEST_handler_test_base32 (struct TMH_RequestHandler *rh, } +/** + * Handle a "/test/hkdf" request. Parses the JSON in the post, runs + * the Crockford Base32 decoder on the "input" field in the JSON, + * computes `HKDF(input, "salty")` and sends the result back as a JSON + * string with in Base32 Crockford encoding. Thus, this API allows + * testing the use of the (H)KDF. Note that the test fixes the + * input and output sizes and the salt (and the hash functions used + * by the HKDF), so this is only useful to test the HKDF in the + * same way it will be used within Taler/GNUnet. + * + * @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_hkdf (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_HashCode hc; + struct TMH_PARSE_FieldSpecification spec[] = { + TMH_PARSE_MEMBER_VARIABLE ("input"), + 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); + if (GNUNET_YES != res) + return (GNUNET_NO == res) ? MHD_YES : MHD_NO; + GNUNET_CRYPTO_kdf (&hc, sizeof (hc), + "salty", strlen ("salty"), + spec[0].destination, + spec[0].destination_size_out, + NULL, 0); + TMH_PARSE_release_data (spec); + json_decref (json); + json = TALER_json_from_data (&hc, sizeof (struct GNUNET_HashCode)); + res = TMH_RESPONSE_reply_json (connection, + json, + MHD_HTTP_OK); + json_decref (json); + return res; +} + + /** * 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" diff --git a/src/mint/taler-mint-httpd_test.h b/src/mint/taler-mint-httpd_test.h index 4ac1d94a0..5de63bb15 100644 --- a/src/mint/taler-mint-httpd_test.h +++ b/src/mint/taler-mint-httpd_test.h @@ -49,6 +49,31 @@ TMH_TEST_handler_test_base32 (struct TMH_RequestHandler *rh, size_t *upload_data_size); +/** + * Handle a "/test/hkdf" request. Parses the JSON in the post, runs + * the Crockford Base32 decoder on the "input" field in the JSON, + * computes `HKDF(input, "salty")` and sends the result back as a JSON + * string with in Base32 Crockford encoding. Thus, this API allows + * testing the use of the (H)KDF. Note that the test fixes the + * input and output sizes and the salt (and the hash functions used + * by the HKDF), so this is only useful to test the HKDF in the + * same way it will be used within Taler/GNUnet. + * + * @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_hkdf (struct TMH_RequestHandler *rh, + struct MHD_Connection *connection, + void **connection_cls, + const char *upload_data, + 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"