[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r10589: Unit tests and debugging for generating and parsing consensu (in tor/trunk: . src/or)
Author: nickm
Date: 2007-06-13 15:06:23 -0400 (Wed, 13 Jun 2007)
New Revision: 10589
Modified:
tor/trunk/
tor/trunk/src/or/dirserv.c
tor/trunk/src/or/dirvote.c
tor/trunk/src/or/or.h
tor/trunk/src/or/routerparse.c
tor/trunk/src/or/test.c
tor/trunk/src/or/test_data.c
Log:
r13395@catbus: nickm | 2007-06-13 15:01:23 -0400
Unit tests and debugging for generating and parsing consensus networkstatus documents. Still need to test actual contents.
Property changes on: tor/trunk
___________________________________________________________________
svk:merge ticket from /tor/trunk [r13395] on 8246c3cf-6607-4228-993b-4d95d33730f1
Modified: tor/trunk/src/or/dirserv.c
===================================================================
--- tor/trunk/src/or/dirserv.c 2007-06-13 18:29:16 UTC (rev 10588)
+++ tor/trunk/src/or/dirserv.c 2007-06-13 19:06:23 UTC (rev 10589)
@@ -1608,7 +1608,6 @@
struct in_addr in;
char *cp;
- int f_authority;
char published[ISO_TIME_LEN+1];
char ipaddr[INET_NTOA_BUF_LEN];
char identity64[BASE64_DIGEST_LEN+1];
@@ -1620,8 +1619,6 @@
in.s_addr = htonl(rs->addr);
tor_inet_ntoa(&in, ipaddr, sizeof(ipaddr));
- f_authority = router_digest_is_trusted_dir(rs->identity_digest);
-
r = tor_snprintf(buf, buf_len,
"r %s %s %s %s %s %d %d\n",
rs->nickname,
@@ -1641,7 +1638,7 @@
r = tor_snprintf(cp, buf_len - (cp-buf),
"s%s%s%s%s%s%s%s%s%s%s\n",
/* These must stay in alphabetical order. */
- f_authority?" Authority":"",
+ rs->is_authority?" Authority":"",
rs->is_bad_exit?" BadExit":"",
rs->is_exit?" Exit":"",
rs->is_fast?" Fast":"",
@@ -1690,6 +1687,8 @@
!tor_version_as_new_as(ri->platform,"0.1.1.16-rc-cvs");
memset(rs, 0, sizeof(routerstatus_t));
+ rs->is_authority = router_digest_is_trusted_dir(rs->identity_digest);
+
/* Already set by compute_performance_thresholds. */
rs->is_exit = ri->is_exit;
rs->is_stable = ri->is_stable =
Modified: tor/trunk/src/or/dirvote.c
===================================================================
--- tor/trunk/src/or/dirvote.c 2007-06-13 18:29:16 UTC (rev 10588)
+++ tor/trunk/src/or/dirvote.c 2007-06-13 19:06:23 UTC (rev 10589)
@@ -37,11 +37,16 @@
authority_cert_free(ns->cert);
if (ns->routerstatus_list) {
- SMARTLIST_FOREACH(ns->routerstatus_list, vote_routerstatus_t *, rs,
- {
- tor_free(rs->version);
- tor_free(rs);
- });
+ if (ns->is_vote) {
+ SMARTLIST_FOREACH(ns->routerstatus_list, vote_routerstatus_t *, rs,
+ {
+ tor_free(rs->version);
+ tor_free(rs);
+ });
+ } else {
+ SMARTLIST_FOREACH(ns->routerstatus_list, routerstatus_t *, rs,
+ tor_free(rs));
+ }
smartlist_free(ns->routerstatus_list);
}
@@ -442,6 +447,8 @@
named_flag[i] = -1;
SMARTLIST_FOREACH(votes, networkstatus_vote_t *, v,
{
+ flag_map[v_sl_idx] = tor_malloc_zero(
+ sizeof(int)*smartlist_len(v->known_flags));
SMARTLIST_FOREACH(v->known_flags, const char *, fl,
{
int p = smartlist_string_pos(flags, fl);
Modified: tor/trunk/src/or/or.h
===================================================================
--- tor/trunk/src/or/or.h 2007-06-13 18:29:16 UTC (rev 10588)
+++ tor/trunk/src/or/or.h 2007-06-13 19:06:23 UTC (rev 10589)
@@ -1205,6 +1205,7 @@
uint32_t addr; /**< IPv4 address for this router. */
uint16_t or_port; /**< OR port for this router. */
uint16_t dir_port; /**< Directory port for this router. */
+ unsigned int is_authority:1; /**< True iff this router is an authority. */
unsigned int is_exit:1; /**< True iff this router is a good exit. */
unsigned int is_stable:1; /**< True iff this router stays up a long time. */
unsigned int is_fast:1; /**< True iff this router has good bandwidth. */
Modified: tor/trunk/src/or/routerparse.c
===================================================================
--- tor/trunk/src/or/routerparse.c 2007-06-13 18:29:16 UTC (rev 10588)
+++ tor/trunk/src/or/routerparse.c 2007-06-13 19:06:23 UTC (rev 10589)
@@ -1534,6 +1534,8 @@
rs->is_bad_exit = 1;
else if (!strcmp(tok->args[i], "BadDirectory"))
rs->is_bad_directory = 1;
+ else if (!strcmp(tok->args[i], "Authority"))
+ rs->is_authority = 1;
}
}
if ((tok = find_first_by_keyword(tokens, K_V))) {
Modified: tor/trunk/src/or/test.c
===================================================================
--- tor/trunk/src/or/test.c 2007-06-13 18:29:16 UTC (rev 10588)
+++ tor/trunk/src/or/test.c 2007-06-13 19:06:23 UTC (rev 10589)
@@ -2133,41 +2133,53 @@
extern const char AUTHORITY_CERT_2[];
extern const char AUTHORITY_IDKEY_2[];
extern const char AUTHORITY_SIGNKEY_2[];
+extern const char AUTHORITY_CERT_3[];
+extern const char AUTHORITY_IDKEY_3[];
+extern const char AUTHORITY_SIGNKEY_3[];
static void
test_v3_networkstatus(void)
{
- authority_cert_t *cert1, *cert2;//, *cert_tmp;
- crypto_pk_env_t *id_skey_1, *id_skey_2;
- crypto_pk_env_t *sign_skey_1, *sign_skey_2;
+ authority_cert_t *cert1, *cert2, *cert3;
+ crypto_pk_env_t *id_skey_1, *id_skey_2, *id_skey_3;
+ crypto_pk_env_t *sign_skey_1, *sign_skey_2, *sign_skey_3;
time_t now = time(NULL);
networkstatus_voter_info_t *voter;
- networkstatus_vote_t *vote, *v1;
+ networkstatus_vote_t *vote, *v1, *v2, *v3, *consensus;
vote_routerstatus_t *vrs;
routerstatus_t *rs;
- char *v1_text, *cp;
+ char *v1_text, *v2_text, *v3_text, *consensus_text, *cp;
+ smartlist_t *votes = smartlist_create();
- add_stream_log(LOG_NOTICE, LOG_ERR, "", stdout);
+ add_stream_log(LOG_NOTICE, LOG_ERR, "", stdout);//XXXX020 remove me.
/* Parse certificates and keys. */
cert1 = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL);
test_assert(cert1);
cert2 = authority_cert_parse_from_string(AUTHORITY_CERT_2, NULL);
test_assert(cert2);
+ cert3 = authority_cert_parse_from_string(AUTHORITY_CERT_3, NULL);
+ test_assert(cert3);
id_skey_1 = crypto_new_pk_env();
id_skey_2 = crypto_new_pk_env();
+ id_skey_3 = crypto_new_pk_env();
sign_skey_1 = crypto_new_pk_env();
sign_skey_2 = crypto_new_pk_env();
+ sign_skey_3 = crypto_new_pk_env();
test_assert(!crypto_pk_read_private_key_from_string(id_skey_1,
AUTHORITY_IDKEY_1));
test_assert(!crypto_pk_read_private_key_from_string(id_skey_2,
AUTHORITY_IDKEY_2));
+ test_assert(!crypto_pk_read_private_key_from_string(id_skey_3,
+ AUTHORITY_IDKEY_3));
test_assert(!crypto_pk_read_private_key_from_string(sign_skey_1,
AUTHORITY_SIGNKEY_1));
test_assert(!crypto_pk_read_private_key_from_string(sign_skey_2,
AUTHORITY_SIGNKEY_2));
+ test_assert(!crypto_pk_read_private_key_from_string(sign_skey_3,
+ AUTHORITY_SIGNKEY_3));
test_assert(!crypto_pk_cmp_keys(id_skey_1, cert1->identity_key));
test_assert(!crypto_pk_cmp_keys(sign_skey_1, cert1->signing_key));
@@ -2230,6 +2242,20 @@
rs->is_exit = rs->is_stable = rs->is_fast = rs->is_running =
rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1;
smartlist_add(vote->routerstatus_list, vrs);
+ /* add the third routerstatus. */
+ vrs = tor_malloc_zero(sizeof(vote_routerstatus_t));
+ rs = &vrs->status;
+ vrs->version = tor_strdup("0.1.0.3");
+ rs->published_on = now-1000;
+ strlcpy(rs->nickname, "router3", sizeof(rs->nickname));
+ memset(rs->identity_digest, 33, DIGEST_LEN);
+ memset(rs->descriptor_digest, 78, DIGEST_LEN);
+ rs->addr = 0xAA009901;
+ rs->or_port = 400;
+ rs->dir_port = 9999;
+ rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast =
+ rs->is_running = rs->is_valid = rs->is_v2_dir = rs->is_possible_guard = 1;
+ smartlist_add(vote->routerstatus_list, vrs);
/* dump the vote and try to parse it. */
v1_text = format_networkstatus_vote(sign_skey_1, vote);
@@ -2261,7 +2287,7 @@
cp = smartlist_join_strings(v1->known_flags, ":", 0, NULL);
test_streq(cp, "Authority:Exit:Fast:Guard:Running:Stable:V2Dir:Valid");
tor_free(cp);
- test_eq(smartlist_len(v1->routerstatus_list), 2);
+ test_eq(smartlist_len(v1->routerstatus_list), 3);
/* Check the first routerstatus. */
vrs = smartlist_get(v1->routerstatus_list, 0);
rs = &vrs->status;
@@ -2291,19 +2317,97 @@
test_eq(rs->dir_port, 0);
test_eq(vrs->flags, U64_LITERAL(254)); // all flags except "authority."
- /* XXXXX020 Generate 2 more votes */
+ /* Generate second vote. It disagrees on some of the times,
+ * and doesn't list versions, and knows some crazy flags */
+ vote->published = now+1;
+ vote->fresh_until = now+205;
+ vote->dist_seconds = 300;
+ authority_cert_free(vote->cert);
+ vote->cert = authority_cert_dup(cert2);
+ tor_free(vote->client_versions);
+ tor_free(vote->server_versions);
+ voter = smartlist_get(vote->voters, 0);
+ tor_free(voter->nickname);
+ tor_free(voter->address);
+ voter->nickname = tor_strdup("Voter2");
+ voter->address = tor_strdup("2.3.4.5");
+ voter->addr = 0x02030405;
+ crypto_pk_get_digest(id_skey_2, voter->identity_digest);
+ smartlist_add(vote->known_flags, tor_strdup("MadeOfCheese"));
+ smartlist_add(vote->known_flags, tor_strdup("MadeOfTin"));
+ smartlist_sort_strings(vote->known_flags);
+ vrs = smartlist_get(vote->routerstatus_list, 2);
+ smartlist_del_keeporder(vote->routerstatus_list, 2);
+ tor_free(vrs->version);
+ tor_free(vrs);
+ /* XXXX020 set some flags in router0 */
+ /* generate and parse. */
+ v2_text = format_networkstatus_vote(sign_skey_2, vote);
+ test_assert(v2_text);
+ v2 = networkstatus_parse_vote_from_string(v2_text, 1);
+ test_assert(v2);
+ /* Check that flags come out right.*/
+ cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL);
+ test_streq(cp, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:"
+ "Running:Stable:V2Dir:Valid");
+ tor_free(cp);
+ vrs = smartlist_get(v2->routerstatus_list, 1);
+ /* 1023 - authority(1) - madeofcheese(16) - madeoftin(32) */
+ test_eq(vrs->flags, U64_LITERAL(974));
- /* XXXXX020 compute, write, and parse a consensus. */
+ /* XXXX Generate third vote. */
+ vote->published = now;
+ vote->fresh_until = now+203;
+ vote->dist_seconds = 250;
+ authority_cert_free(vote->cert);
+ vote->cert = authority_cert_dup(cert3);
+ vote->client_versions = tor_strdup("0.1.2.14,0.1.2.17");
+ vote->server_versions = tor_strdup("0.1.2.10,0.1.2.15,0.1.2.16");
+ voter = smartlist_get(vote->voters, 0);
+ tor_free(voter->nickname);
+ tor_free(voter->address);
+ voter->nickname = tor_strdup("Voter3");
+ voter->address = tor_strdup("3.4.5.6");
+ voter->addr = 0x03040506;
+ crypto_pk_get_digest(id_skey_3, voter->identity_digest);
+ vrs = smartlist_get(vote->routerstatus_list, 0);
+ smartlist_del_keeporder(vote->routerstatus_list, 0);
+ tor_free(vrs->version);
+ tor_free(vrs);
+ /* XXXX020 clear some flags in the remaining entry. */
+ v3_text = format_networkstatus_vote(sign_skey_3, vote);
+ test_assert(v3_text);
+ v3 = networkstatus_parse_vote_from_string(v3_text, 1);
+ test_assert(v3);
+ /* Compute a consensus as voter 3. */
+ smartlist_add(votes, v3);
+ smartlist_add(votes, v1);
+ smartlist_add(votes, v2);
+ consensus_text = networkstatus_compute_consensus(votes,
+ id_skey_3, sign_skey_3);
+ test_assert(consensus_text);
+ consensus = networkstatus_parse_vote_from_string(consensus_text, 0);
+ test_assert(consensus);
+
+ /* XXXX020 check consensus contents. */
+
tor_free(v1_text);
+ tor_free(v2_text);
+ tor_free(v3_text);
networkstatus_vote_free(vote);
networkstatus_vote_free(v1);
+ networkstatus_vote_free(v2);
+ networkstatus_vote_free(v3);
crypto_free_pk_env(id_skey_1);
crypto_free_pk_env(id_skey_2);
+ crypto_free_pk_env(id_skey_3);
crypto_free_pk_env(sign_skey_1);
crypto_free_pk_env(sign_skey_2);
+ crypto_free_pk_env(sign_skey_3);
authority_cert_free(cert1);
authority_cert_free(cert2);
+ authority_cert_free(cert3);
}
static void
Modified: tor/trunk/src/or/test_data.c
===================================================================
--- tor/trunk/src/or/test_data.c 2007-06-13 18:29:16 UTC (rev 10588)
+++ tor/trunk/src/or/test_data.c 2007-06-13 19:06:23 UTC (rev 10589)
@@ -191,3 +191,95 @@
"rjZyXmEZS3oe7TRCDD28GAGMmxSDvNfOOpyn14ishEs5AQ==\n"
"-----END RSA PRIVATE KEY-----\n";
+const char AUTHORITY_CERT_3[] =
+"dir-key-certificate-version 3\n"
+"fingerprint ED3719BF554DE9D7D59F5CA5A4F5AD121D020ED9\n"
+"dir-key-published 2007-06-13 16:52:40\n"
+"dir-key-expires 2008-06-13 16:52:40\n"
+"dir-identity-key\n"
+"-----BEGIN RSA PUBLIC KEY-----\n"
+"MIIBigKCAYEAtB+yw4BNxtZAG4cPaedkhWNmeij7IuNWmXjh58ZYEGurvGyHs1w4\n"
+"QlwNYI2UftSIeIGdWZ5fJ17h9P3xvO6eeJuOt4KPrNOxUbSGrELEx1Lje1fDAJ1X\n"
+"SvN+dvptusxtyFUr8afgTPrFIvYuazQ6q/Rw+NDagjmDx3h/A/enihpBnjwzeH8j\n"
+"Xzu7b+HKnzFnNfveTDdvSy0NSC6tCOnrfXo31XbXRXtlesnMIpbJClUcAv55eyai\n"
+"/PrVPCCUz8mk0sQnn2Xhv1YJmwOlQTGMfg0a0kWLmh+UWcHsGQ4VWxBZJcuzgFHG\n"
+"hu2/Fz6DXSpX5Q6B9HKoGmnH1oBh24l0kUW1jL8BxPY4YDU1Lt5t3qgcDn9dXYcI\n"
+"o8VvyI0ecSc26Q2PYFWX1hpN4VIBZ8uGaW3IpyTdNiRq0g3iMGRFEXcDlWuyMB9E\n"
+"EbSM7m/79V/z7SjDd75EP8Z0qDPESEVB8a8LbuSJtzFVE0KHd7RzkIEN5sorXspZ\n"
+"/THukftSmkIvAgMBAAE=\n"
+"-----END RSA PUBLIC KEY-----\n"
+"dir-signing-key\n"
+"-----BEGIN RSA PUBLIC KEY-----\n"
+"MIGJAoGBANrSZlUq38Boz3iuUOydYTJV57rTbq1bz805FP2QG2Z+2bwpgKIOZag/\n"
+"gN2A1ySJaIYLgZIg9irxrLkqlY/UAjC23y6V9fJXP1S3TXoqLmHleW8PsaDLuwTo\n"
+"hCWaR61Mx9WG7IXcodn2Z7RiCfZpSW4Rztbk5WtjQa5jPXSFOuBJAgMBAAE=\n"
+"-----END RSA PUBLIC KEY-----\n"
+"dir-key-certification\n"
+"-----BEGIN SIGNATURE-----\n"
+"UNXZy+4OQ8iat+gw+vg2ynvKj2BYbqZt+EAZAV3rmw6gux44U9TLRECRd6LsA08N\n"
+"4+Vz01TU81xqMgfrUy94ei2YvcfpO8art9/muWHTP9SmOX8S1uqDqLWA+n723C9A\n"
+"HyVXn4aINncO2081gJcIW5+Ul8WTCeZe/n3LVPTCKbTdqxvmrPUdCWlJTQUmb19M\n"
+"T+kcCjaEfgQGLC+Y2MHqYe/nxz+aBKqpjiWUDdjc35va6r/2e3c0jGi1B1xRZxN1\n"
+"xThPZ+CifjDoWBxJdDGlIfZRK1lMnOCJY9w9ibTXQ1UnvE4whFvmB55/t9/XLq4q\n"
+"3pnZz0H7funey3+ilmTxDohoAYT1GX+4a+3xYH07UmAFqlTzqKClj84XEHn+Cer7\n"
+"Nun9kJlJFuBgUpQjwCkzedFZKKLOHgB2h7trJfnqcBpAM8Rup1Bb5u/RcBx9gy1q\n"
+"pMc65FviIrc/Q5TUku6NNbCbnGll1599PvWuUzkG42lJ17V6psKHIsqGtVdHlCUc\n"
+"-----END SIGNATURE-----\n";
+
+const char AUTHORITY_IDKEY_3[] =
+"-----BEGIN RSA PRIVATE KEY-----\n"
+"MIIG4wIBAAKCAYEAtB+yw4BNxtZAG4cPaedkhWNmeij7IuNWmXjh58ZYEGurvGyH\n"
+"s1w4QlwNYI2UftSIeIGdWZ5fJ17h9P3xvO6eeJuOt4KPrNOxUbSGrELEx1Lje1fD\n"
+"AJ1XSvN+dvptusxtyFUr8afgTPrFIvYuazQ6q/Rw+NDagjmDx3h/A/enihpBnjwz\n"
+"eH8jXzu7b+HKnzFnNfveTDdvSy0NSC6tCOnrfXo31XbXRXtlesnMIpbJClUcAv55\n"
+"eyai/PrVPCCUz8mk0sQnn2Xhv1YJmwOlQTGMfg0a0kWLmh+UWcHsGQ4VWxBZJcuz\n"
+"gFHGhu2/Fz6DXSpX5Q6B9HKoGmnH1oBh24l0kUW1jL8BxPY4YDU1Lt5t3qgcDn9d\n"
+"XYcIo8VvyI0ecSc26Q2PYFWX1hpN4VIBZ8uGaW3IpyTdNiRq0g3iMGRFEXcDlWuy\n"
+"MB9EEbSM7m/79V/z7SjDd75EP8Z0qDPESEVB8a8LbuSJtzFVE0KHd7RzkIEN5sor\n"
+"XspZ/THukftSmkIvAgMBAAECggGAQ0dfvzRKWM2oDmApOrZqToRtP43VGBfwPczw\n"
+"HGFyfVeqQuwK18zHWsoFWR4o7CK4gsJvIo1MH2mKXrcHtzktygDYkuTag4RixBD5\n"
+"CJi75XOpcmW6eZ1LgLxobUpm+BHpo51kl5PL7RTx03g+qF5O1/GqzNU9+MxA053H\n"
+"W5UCaEwcXF1CIGzkqmqmPUkKJOIQGhLk2nUORfci8eY1TZIKGsku17XW/KX1pqJ/\n"
+"dB/8IbbeiqPAfmZVFMcgJKBK1T4MiPbqn2a9Av8wy0pmLLI9bUO+5bky8Nb1pytS\n"
+"Op67R4lXmbSv4uETL4hE55ENHW4utWYuQgkiRrwmW/D2ynVtF6AK3NnH3YDj1+Bi\n"
+"zVpYXNdGYtcRtKE66PlWwq/h/rQdNA6zrgqIZT93XSkxo9QuJqogqNOjedAwjn73\n"
+"8xAu32Odbw6HQ6tKzbUK96LJqHpL4tABpXbzeY8d5o+gq6H9uhDUcs+ZvWOYFXEC\n"
+"mwlpptXQy7BK7aaT2A5jbm2CTiSxAoHBAOBgKCMOXu/vi1wOaGW1g6Dba+Ob8ahX\n"
+"zjATNq/XyfRt7SHskj+91HQFwq05W0C7ixDKJBqUuU+BYLmW973/z8QQOdkyNOmF\n"
+"ENptJbMiABHSU4r+hkAnzaEoJ9nmLRWOF29rI8gFZL6vBygKIW97TnwZ+uCEBX2t\n"
+"BxaIOkh27XEy77C3f6GYEPMcb0tJqAxJ20BQGelzi8zCN+bmhywsXA2WFHgwXpz7\n"
+"HPOOqv4UOLTPnZnEpA5MNl/OT1EK5uFNJwKBwQDNgt0bbJ8J9nWaRlLhe6gndu8j\n"
+"ntqluIVv8G7B+sIt73mBX9cOxGLYkSjaBnJDaA2kNBj+YciElYsjvMhmV/Z3lpyK\n"
+"WXRmo8nCVKEKK/SUhdnPVutNPRnAdxy9m6wmxh/cO6HFEjCa0xX7sX3ieqLXGe/G\n"
+"b9q/p4tnHExDPpc5qxx46g1zLL52DjsvMdFnLZ96GFYAnKNhs9Tz8aqiESpz42+B\n"
+"dZJimSLPZ8+BuwlxGdLB01BDr9nb13BPVHQtF7kCgcEAxkp0bja/FBCA+oQJIwm9\n"
+"ICWKPYaNlJa0s6vnQpPT+N5FGRv3S7m5zidhGrF7wcN8bQQX0B3rfyX5k0ql+xXe\n"
+"SYmFdjt2o4FjmYWoMZ00rotQJaA2iPAkO+4++cT/xvLiJydqYdTSaepIysvZLKqu\n"
+"e+KB4nUKXTzS7MjLqUrhII9BYM1qUCcRo6hXexPHHcUPrNCddcEVpYlm2fqVLyas\n"
+"25zsziMBGn6Z4W0OFKlOTAzHXSN5UOFtlFHBqv+Vdzs1AoHADu0qUguZoYedEw94\n"
+"hZgNppAk3llzWAYG6xJzePNVlzCFirgDTrdE1qX0aaF+OxcbpomCJzfC8J5L9NSJ\n"
+"WaWZ6SWvSP0mTy4mQU8UQ0DeCsuN/lk5zepaLHh6RetAnbBWMBDEtyOTFCuwtQ83\n"
+"LXPqz+S6XZdSNAlfPqX3hArPwQiEkOOvBmaBjuGJuuvLYcsWgi+yT2kRFM+S8ATl\n"
+"d8/3XWNvfd+kOjUVKitIDwweq3BMtnc6pS/oiuci6SAhMAVBAoHAFzOe4DfXCZtb\n"
+"UcpQMb+8VUlwIkqYuP5N0A6e5ifQhtpliEemN3pDf/nBCUM5jeGauYte0qPhh57z\n"
+"nA+8q2+USUCfkaIMSjq+wzbGkgjon+QMcPgSTT7EO8w0TavHMy/OAzuRg/dNOwDd\n"
+"vediEzCJxvlCIq9CPNTSzopTd7ZGr+OJsTkwrvLh+mmxK9F2y3jbqCWTayXku99G\n"
+"mKoaXAa/w5KbxYwCzBGcV5DhujOWcPxQ+IQzpn9VojZkJPJXsCaB\n"
+"-----END RSA PRIVATE KEY-----\n";
+
+const char AUTHORITY_SIGNKEY_3[] =
+"-----BEGIN RSA PRIVATE KEY-----\n"
+"MIICXgIBAAKBgQDa0mZVKt/AaM94rlDsnWEyVee6026tW8/NORT9kBtmftm8KYCi\n"
+"DmWoP4DdgNckiWiGC4GSIPYq8ay5KpWP1AIwtt8ulfXyVz9Ut016Ki5h5XlvD7Gg\n"
+"y7sE6IQlmketTMfVhuyF3KHZ9me0Ygn2aUluEc7W5OVrY0GuYz10hTrgSQIDAQAB\n"
+"AoGBAIyoeG1AnQmildKeQpiGZackf0uhg2BeRwpFKg//5Q0Sd0Wza+M/2+q1v1Ei\n"
+"86ihxxV7KfPTykk6hmuUSwVkI28Z+5J9NYTr35EzPiUlqpo0iclTkFqrlbqSPULx\n"
+"9fQhvcOGv1c0m5CnYrHsM8eu3tagLg+6OE4abLOYX4Az5pkxAkEA/NwHhVaVJrXH\n"
+"lGDrRAfGtaD5Tzeeg1H9DNZi5lmFiSNR0O11sgDLkiZNP5oM8knyqo8Gq08hwxEb\n"
+"yqMXM3XtJQJBAN2KJbFhOjDIkvJyYvbmcP6P7vV2c9j+oUTKkFMF7vvfWunxMi9j\n"
+"ghbdUKgl7tU0VFpw7ufDDD0pkN6sua3gp1UCQQCvNzTK861U7p/GtMYyFQVf9JTt\n"
+"jMf9jYHBNInBvwTme6AFG5bz6tMlif77dJ9GAXHzODrR2Hq3thJA/3RjR3M1AkBg\n"
+"+6M4ncmtpYC+5lhwob0Bk90WU/6vFflfdhXsYoKWfNb95vsDR9qhS82Nbt25NClh\n"
+"VmMfzoFDHTkwYgj/F4PpAkEA+RaaSRP7BmbvFNqvlm8J/m0RVdAH4+p/Q5Z5u6Yo\n"
+"N7xC/gFi0qFPGKsDvD2CncAYmt+KNsd8S0JGDN4eieKn+Q==\n"
+"-----END RSA PRIVATE KEY-----\n";