| 
					
				 | 
			
			
				@@ -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" }, 
			 |