|
@@ -1135,6 +1135,48 @@ test_crypto_sha3_xof(void *arg)
|
|
|
tor_free(mem_op_hex_tmp);
|
|
|
}
|
|
|
|
|
|
+/* Test our MAC-SHA3 function. There are not actually any MAC-SHA3 test
|
|
|
+ * vectors out there for our H(len(k) || k || m) construction. Hence what we
|
|
|
+ * are gonna do is test our crypto_mac_sha3_256() function against manually
|
|
|
+ * doing H(len(k) || k||m). If in the future the Keccak group decides to
|
|
|
+ * standarize an MAC construction and make test vectors, we should
|
|
|
+ * incorporate them here. */
|
|
|
+static void
|
|
|
+test_crypto_mac_sha3(void *arg)
|
|
|
+{
|
|
|
+ const char msg[] = "i am in a library somewhere using my computer";
|
|
|
+ const char key[] = "i'm from the past talking to the future.";
|
|
|
+
|
|
|
+ char hmac_test[DIGEST256_LEN];
|
|
|
+ char hmac_manual[DIGEST256_LEN];
|
|
|
+
|
|
|
+ (void) arg;
|
|
|
+
|
|
|
+ /* First let's use our nice HMAC-SHA3 function */
|
|
|
+ crypto_mac_sha3_256(hmac_test, sizeof(hmac_test),
|
|
|
+ key, strlen(key),
|
|
|
+ msg, strlen(msg));
|
|
|
+
|
|
|
+ /* Now let's try a manual H(k || m) construction */
|
|
|
+ {
|
|
|
+ char *key_msg_concat = NULL;
|
|
|
+ int result;
|
|
|
+
|
|
|
+ tor_asprintf(&key_msg_concat, "%s%s", key, msg);
|
|
|
+
|
|
|
+ result = crypto_digest256(hmac_manual,
|
|
|
+ key_msg_concat, strlen(key_msg_concat),
|
|
|
+ DIGEST_SHA3_256);
|
|
|
+ tt_int_op(result, ==, 0);
|
|
|
+ tor_free(key_msg_concat);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Now compare the two results */
|
|
|
+ tt_mem_op(hmac_test, OP_EQ, hmac_manual, DIGEST256_LEN);
|
|
|
+
|
|
|
+ done: ;
|
|
|
+}
|
|
|
+
|
|
|
/** Run unit tests for our public key crypto functions */
|
|
|
static void
|
|
|
test_crypto_pk(void *arg)
|
|
@@ -2918,6 +2960,7 @@ struct testcase_t crypto_tests[] = {
|
|
|
{ "digest_names", test_crypto_digest_names, 0, NULL, NULL },
|
|
|
{ "sha3", test_crypto_sha3, TT_FORK, NULL, NULL},
|
|
|
{ "sha3_xof", test_crypto_sha3_xof, TT_FORK, NULL, NULL},
|
|
|
+ { "mac_sha3", test_crypto_mac_sha3, TT_FORK, NULL, NULL},
|
|
|
CRYPTO_LEGACY(dh),
|
|
|
{ "aes_iv_AES", test_crypto_aes_iv, TT_FORK, &passthrough_setup,
|
|
|
(void*)"aes" },
|