Loading src/test/test_hs_service.c +97 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #include "hs_service.h" #include "hs_intropoint.h" #include "hs_ntor.h" /** We simulate the creation of an outgoing ESTABLISH_INTRO cell, and then we * parse it from the receiver side. */ static void Loading Loading @@ -100,11 +102,106 @@ test_gen_establish_intro_cell_bad(void *arg) UNMOCK(ed25519_sign_prefixed); } /** Test the HS ntor handshake. Simulate the sending of an encrypted INTRODUCE1 * cell, and verify the proper derivation of decryption keys on the other end. * Then simulate the sending of an authenticated RENDEZVOUS1 cell and verify * the proper verification on the other end. */ static void test_hs_ntor(void *arg) { int retval; uint8_t subcredential[DIGEST256_LEN]; ed25519_keypair_t service_intro_auth_keypair; curve25519_keypair_t service_intro_enc_keypair; curve25519_keypair_t service_ephemeral_rend_keypair; curve25519_keypair_t client_ephemeral_enc_keypair; hs_ntor_intro_cell_keys_t client_hs_ntor_intro_cell_keys; hs_ntor_intro_cell_keys_t service_hs_ntor_intro_cell_keys; hs_ntor_rend_cell_keys_t service_hs_ntor_rend_cell_keys; hs_ntor_rend_cell_keys_t client_hs_ntor_rend_cell_keys; (void) arg; /* Generate fake data for this unittest */ { /* Generate fake subcredential */ memset(subcredential, 'Z', DIGEST256_LEN); /* service */ curve25519_keypair_generate(&service_intro_enc_keypair, 0); ed25519_keypair_generate(&service_intro_auth_keypair, 0); curve25519_keypair_generate(&service_ephemeral_rend_keypair, 0); /* client */ curve25519_keypair_generate(&client_ephemeral_enc_keypair, 0); } /* Client: Simulate the sending of an encrypted INTRODUCE1 cell */ retval = hs_ntor_client_get_introduce1_keys(&service_intro_auth_keypair.pubkey, &service_intro_enc_keypair.pubkey, &client_ephemeral_enc_keypair, subcredential, &client_hs_ntor_intro_cell_keys); tt_int_op(retval, ==, 0); /* Service: Simulate the decryption of the received INTRODUCE1 */ retval = hs_ntor_service_get_introduce1_keys(&service_intro_auth_keypair.pubkey, &service_intro_enc_keypair, &client_ephemeral_enc_keypair.pubkey, subcredential, &service_hs_ntor_intro_cell_keys); tt_int_op(retval, ==, 0); /* Test that the INTRODUCE1 encryption/mac keys match! */ tt_mem_op(client_hs_ntor_intro_cell_keys.enc_key, OP_EQ, service_hs_ntor_intro_cell_keys.enc_key, CIPHER256_KEY_LEN); tt_mem_op(client_hs_ntor_intro_cell_keys.mac_key, OP_EQ, service_hs_ntor_intro_cell_keys.mac_key, DIGEST256_LEN); /* Service: Simulate creation of RENDEZVOUS1 key material. */ retval = hs_ntor_service_get_rendezvous1_keys(&service_intro_auth_keypair.pubkey, &service_intro_enc_keypair, &service_ephemeral_rend_keypair, &client_ephemeral_enc_keypair.pubkey, &service_hs_ntor_rend_cell_keys); tt_int_op(retval, ==, 0); /* Client: Simulate the verification of a received RENDEZVOUS1 cell */ retval = hs_ntor_client_get_rendezvous1_keys(&service_intro_auth_keypair.pubkey, &client_ephemeral_enc_keypair, &service_intro_enc_keypair.pubkey, &service_ephemeral_rend_keypair.pubkey, &client_hs_ntor_rend_cell_keys); tt_int_op(retval, ==, 0); /* Test that the RENDEZVOUS1 key material match! */ tt_mem_op(client_hs_ntor_rend_cell_keys.rend_cell_auth_mac, OP_EQ, service_hs_ntor_rend_cell_keys.rend_cell_auth_mac, DIGEST256_LEN); tt_mem_op(client_hs_ntor_rend_cell_keys.ntor_key_seed, OP_EQ, service_hs_ntor_rend_cell_keys.ntor_key_seed, DIGEST256_LEN); done: ; } struct testcase_t hs_service_tests[] = { { "gen_establish_intro_cell", test_gen_establish_intro_cell, TT_FORK, NULL, NULL }, { "gen_establish_intro_cell_bad", test_gen_establish_intro_cell_bad, TT_FORK, NULL, NULL }, { "hs_ntor", test_hs_ntor, TT_FORK, NULL, NULL }, END_OF_TESTCASES }; Loading Loading
src/test/test_hs_service.c +97 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #include "hs_service.h" #include "hs_intropoint.h" #include "hs_ntor.h" /** We simulate the creation of an outgoing ESTABLISH_INTRO cell, and then we * parse it from the receiver side. */ static void Loading Loading @@ -100,11 +102,106 @@ test_gen_establish_intro_cell_bad(void *arg) UNMOCK(ed25519_sign_prefixed); } /** Test the HS ntor handshake. Simulate the sending of an encrypted INTRODUCE1 * cell, and verify the proper derivation of decryption keys on the other end. * Then simulate the sending of an authenticated RENDEZVOUS1 cell and verify * the proper verification on the other end. */ static void test_hs_ntor(void *arg) { int retval; uint8_t subcredential[DIGEST256_LEN]; ed25519_keypair_t service_intro_auth_keypair; curve25519_keypair_t service_intro_enc_keypair; curve25519_keypair_t service_ephemeral_rend_keypair; curve25519_keypair_t client_ephemeral_enc_keypair; hs_ntor_intro_cell_keys_t client_hs_ntor_intro_cell_keys; hs_ntor_intro_cell_keys_t service_hs_ntor_intro_cell_keys; hs_ntor_rend_cell_keys_t service_hs_ntor_rend_cell_keys; hs_ntor_rend_cell_keys_t client_hs_ntor_rend_cell_keys; (void) arg; /* Generate fake data for this unittest */ { /* Generate fake subcredential */ memset(subcredential, 'Z', DIGEST256_LEN); /* service */ curve25519_keypair_generate(&service_intro_enc_keypair, 0); ed25519_keypair_generate(&service_intro_auth_keypair, 0); curve25519_keypair_generate(&service_ephemeral_rend_keypair, 0); /* client */ curve25519_keypair_generate(&client_ephemeral_enc_keypair, 0); } /* Client: Simulate the sending of an encrypted INTRODUCE1 cell */ retval = hs_ntor_client_get_introduce1_keys(&service_intro_auth_keypair.pubkey, &service_intro_enc_keypair.pubkey, &client_ephemeral_enc_keypair, subcredential, &client_hs_ntor_intro_cell_keys); tt_int_op(retval, ==, 0); /* Service: Simulate the decryption of the received INTRODUCE1 */ retval = hs_ntor_service_get_introduce1_keys(&service_intro_auth_keypair.pubkey, &service_intro_enc_keypair, &client_ephemeral_enc_keypair.pubkey, subcredential, &service_hs_ntor_intro_cell_keys); tt_int_op(retval, ==, 0); /* Test that the INTRODUCE1 encryption/mac keys match! */ tt_mem_op(client_hs_ntor_intro_cell_keys.enc_key, OP_EQ, service_hs_ntor_intro_cell_keys.enc_key, CIPHER256_KEY_LEN); tt_mem_op(client_hs_ntor_intro_cell_keys.mac_key, OP_EQ, service_hs_ntor_intro_cell_keys.mac_key, DIGEST256_LEN); /* Service: Simulate creation of RENDEZVOUS1 key material. */ retval = hs_ntor_service_get_rendezvous1_keys(&service_intro_auth_keypair.pubkey, &service_intro_enc_keypair, &service_ephemeral_rend_keypair, &client_ephemeral_enc_keypair.pubkey, &service_hs_ntor_rend_cell_keys); tt_int_op(retval, ==, 0); /* Client: Simulate the verification of a received RENDEZVOUS1 cell */ retval = hs_ntor_client_get_rendezvous1_keys(&service_intro_auth_keypair.pubkey, &client_ephemeral_enc_keypair, &service_intro_enc_keypair.pubkey, &service_ephemeral_rend_keypair.pubkey, &client_hs_ntor_rend_cell_keys); tt_int_op(retval, ==, 0); /* Test that the RENDEZVOUS1 key material match! */ tt_mem_op(client_hs_ntor_rend_cell_keys.rend_cell_auth_mac, OP_EQ, service_hs_ntor_rend_cell_keys.rend_cell_auth_mac, DIGEST256_LEN); tt_mem_op(client_hs_ntor_rend_cell_keys.ntor_key_seed, OP_EQ, service_hs_ntor_rend_cell_keys.ntor_key_seed, DIGEST256_LEN); done: ; } struct testcase_t hs_service_tests[] = { { "gen_establish_intro_cell", test_gen_establish_intro_cell, TT_FORK, NULL, NULL }, { "gen_establish_intro_cell_bad", test_gen_establish_intro_cell_bad, TT_FORK, NULL, NULL }, { "hs_ntor", test_hs_ntor, TT_FORK, NULL, NULL }, END_OF_TESTCASES }; Loading