|
@@ -21,6 +21,7 @@
|
|
|
#include "feature/nodelist/routerstatus_st.h"
|
|
|
|
|
|
#include "test/test.h"
|
|
|
+#include "test/log_test_helpers.h"
|
|
|
|
|
|
#ifdef HAVE_SYS_STAT_H
|
|
|
#include <sys/stat.h>
|
|
@@ -770,6 +771,80 @@ test_md_parse(void *arg)
|
|
|
tor_free(mem_op_hex_tmp);
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+test_md_parse_id_ed25519(void *arg)
|
|
|
+{
|
|
|
+ (void)arg;
|
|
|
+
|
|
|
+ /* A correct MD with an ed25519 ID ... and an unspecified ID type,
|
|
|
+ * which is permitted. */
|
|
|
+ const char GOOD_MD[] =
|
|
|
+ "onion-key\n"
|
|
|
+ "-----BEGIN RSA PUBLIC KEY-----\n"
|
|
|
+ "MIGJAoGBAM7uUtq5F6h63QNYIvC+4NcWaD0DjtnrOORZMkdpJhinXUOwce3cD5Dj\n"
|
|
|
+ "sgdN1wJpWpTQMXJ2DssfSgmOVXETP7qJuZyRprxalQhaEATMDNJA/66Ml1jSO9mZ\n"
|
|
|
+ "+8Xb7m/4q778lNtkSbsvMaYD2Dq6k2QQ3kMhr9z8oUtX0XA23+pfAgMBAAE=\n"
|
|
|
+ "-----END RSA PUBLIC KEY-----\n"
|
|
|
+ "id ed25519 VGhpcyBpc24ndCBhY3R1YWxseSBhIHB1YmxpYyBrZXk\n"
|
|
|
+ "id wumpus dodecahedron\n";
|
|
|
+
|
|
|
+ smartlist_t *mds = NULL;
|
|
|
+ const microdesc_t *md;
|
|
|
+
|
|
|
+ mds = microdescs_parse_from_string(GOOD_MD,
|
|
|
+ NULL, 1, SAVED_NOWHERE, NULL);
|
|
|
+ tt_assert(mds);
|
|
|
+ tt_int_op(smartlist_len(mds), OP_EQ, 1);
|
|
|
+ md = smartlist_get(mds, 0);
|
|
|
+ tt_mem_op(md->ed25519_identity_pkey, OP_EQ,
|
|
|
+ "This isn't actually a public key", ED25519_PUBKEY_LEN);
|
|
|
+ SMARTLIST_FOREACH(mds, microdesc_t *, m, microdesc_free(m));
|
|
|
+ smartlist_free(mds);
|
|
|
+
|
|
|
+ /* As above, but ed25519 ID key appears twice. */
|
|
|
+ const char DUPLICATE_KEY[] =
|
|
|
+ "onion-key\n"
|
|
|
+ "-----BEGIN RSA PUBLIC KEY-----\n"
|
|
|
+ "MIGJAoGBAM7uUtq5F6h63QNYIvC+4NcWaD0DjtnrOORZMkdpJhinXUOwce3cD5Dj\n"
|
|
|
+ "sgdN1wJpWpTQMXJ2DssfSgmOVXETP7qJuZyRprxalQhaEATMDNJA/66Ml1jSO9mZ\n"
|
|
|
+ "+8Xb7m/4q778lNtkSbsvMaYD2Dq6k2QQ3kMhr9z8oUtX0XA23+pfAgMBAAE=\n"
|
|
|
+ "-----END RSA PUBLIC KEY-----\n"
|
|
|
+ "id ed25519 VGhpcyBpc24ndCBhY3R1YWxseSBhIHB1YmxpYyBrZXk\n"
|
|
|
+ "id ed25519 VGhpcyBpc24ndCBhY3R1YWxseSBhIHB1YmxpYyBrZXk\n";
|
|
|
+
|
|
|
+ setup_capture_of_logs(LOG_WARN);
|
|
|
+ mds = microdescs_parse_from_string(DUPLICATE_KEY,
|
|
|
+ NULL, 1, SAVED_NOWHERE, NULL);
|
|
|
+ tt_assert(mds);
|
|
|
+ tt_int_op(smartlist_len(mds), OP_EQ, 0); // no entries.
|
|
|
+ expect_single_log_msg_containing("Extra ed25519 key");
|
|
|
+ mock_clean_saved_logs();
|
|
|
+ smartlist_free(mds);
|
|
|
+
|
|
|
+ /* As above, but ed25519 ID key is invalid. */
|
|
|
+ const char BOGUS_KEY[] =
|
|
|
+ "onion-key\n"
|
|
|
+ "-----BEGIN RSA PUBLIC KEY-----\n"
|
|
|
+ "MIGJAoGBAM7uUtq5F6h63QNYIvC+4NcWaD0DjtnrOORZMkdpJhinXUOwce3cD5Dj\n"
|
|
|
+ "sgdN1wJpWpTQMXJ2DssfSgmOVXETP7qJuZyRprxalQhaEATMDNJA/66Ml1jSO9mZ\n"
|
|
|
+ "+8Xb7m/4q778lNtkSbsvMaYD2Dq6k2QQ3kMhr9z8oUtX0XA23+pfAgMBAAE=\n"
|
|
|
+ "-----END RSA PUBLIC KEY-----\n"
|
|
|
+ "id ed25519 VGhpcyBpc24ndCBhY3R1YWxseSBhIHB1YmxpYyZZZZZZZZZZZ\n";
|
|
|
+
|
|
|
+ mds = microdescs_parse_from_string(BOGUS_KEY,
|
|
|
+ NULL, 1, SAVED_NOWHERE, NULL);
|
|
|
+ tt_assert(mds);
|
|
|
+ tt_int_op(smartlist_len(mds), OP_EQ, 0); // no entries.
|
|
|
+ expect_single_log_msg_containing("Bogus ed25519 key");
|
|
|
+
|
|
|
+ done:
|
|
|
+ if (mds) {
|
|
|
+ SMARTLIST_FOREACH(mds, microdesc_t *, m, microdesc_free(m));
|
|
|
+ smartlist_free(mds);
|
|
|
+ }
|
|
|
+ teardown_capture_of_logs();
|
|
|
+}
|
|
|
+
|
|
|
static int mock_rgsbd_called = 0;
|
|
|
static routerstatus_t *mock_rgsbd_val_a = NULL;
|
|
|
static routerstatus_t *mock_rgsbd_val_b = NULL;
|
|
@@ -903,6 +978,7 @@ struct testcase_t microdesc_tests[] = {
|
|
|
{ "broken_cache", test_md_cache_broken, TT_FORK, NULL, NULL },
|
|
|
{ "generate", test_md_generate, 0, NULL, NULL },
|
|
|
{ "parse", test_md_parse, 0, NULL, NULL },
|
|
|
+ { "parse_id_ed25519", test_md_parse_id_ed25519, 0, NULL, NULL },
|
|
|
{ "reject_cache", test_md_reject_cache, TT_FORK, NULL, NULL },
|
|
|
{ "corrupt_desc", test_md_corrupt_desc, TT_FORK, NULL, NULL },
|
|
|
END_OF_TESTCASES
|