aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-04-18 00:30:21 +0200
committerChristian Grothoff <christian@grothoff.org>2015-04-18 00:30:21 +0200
commitc5b0d8c76eacbafc4990f247e1de41304265801a (patch)
tree3bb86b7fb584a6ec3c661ac888a9931ca853ad44
parentc334d5ea05a0353afe3ca3ecd18b2353be2b2031 (diff)
implementing /test/hkdf
-rw-r--r--src/mint/taler-mint-httpd.c7
-rw-r--r--src/mint/taler-mint-httpd_test.c65
-rw-r--r--src/mint/taler-mint-httpd_test.h25
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,
@@ -94,6 +93,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"
* with a private key. The reply is the resulting JSON is an object
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
@@ -50,6 +50,31 @@ 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);
+
+
+/**
* 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