diff --git a/briar-android/assets/tor-arm-pie.zip b/briar-android/assets/tor-arm-pie.zip index 1feb226e87d377ff5806b25abb803a24c730d13c..06dad238eb762fa464c50a889ab865fdd0454851 100644 Binary files a/briar-android/assets/tor-arm-pie.zip and b/briar-android/assets/tor-arm-pie.zip differ diff --git a/briar-android/assets/tor-arm.zip b/briar-android/assets/tor-arm.zip index d46070d7ddecb459ed656b22a846c2cd63374543..c7251cb9e84f6fae81ceb09954aedc92063f93db 100644 Binary files a/briar-android/assets/tor-arm.zip and b/briar-android/assets/tor-arm.zip differ diff --git a/briar-android/assets/tor-x86-pie.zip b/briar-android/assets/tor-x86-pie.zip index 17f53ceca87775060569b8bf86880465708d0f42..49f452b32d27d8152503196999f35d094e430623 100644 Binary files a/briar-android/assets/tor-x86-pie.zip and b/briar-android/assets/tor-x86-pie.zip differ diff --git a/briar-android/assets/tor-x86.zip b/briar-android/assets/tor-x86.zip index d1e173125d64a8c47daa1a0d43e93eb41aad4d8d..13d46ae10ac3f16423a3dd3e496ff8966f46f54d 100644 Binary files a/briar-android/assets/tor-x86.zip and b/briar-android/assets/tor-x86.zip differ diff --git a/briar-android/libs/jtorctl-briar.jar b/briar-android/libs/jtorctl-briar.jar index 70d7a68546d34302fb077b4669ee28ecc5f0beab..134f85dbcb386b866b1cb9023a9f1fa29e308f84 100644 Binary files a/briar-android/libs/jtorctl-briar.jar and b/briar-android/libs/jtorctl-briar.jar differ diff --git a/patches/jtorctl.patch b/patches/jtorctl.patch index 891f48495a86e1c710f4728818987228288699b0..167af82d22592834bed17fe41098c3096168988e 100644 --- a/patches/jtorctl.patch +++ b/patches/jtorctl.patch @@ -1,23 +1,13 @@ -diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-briar/net/freehaven/tor/control/TorControlConnection.java ---- jtorctl/net/freehaven/tor/control/TorControlConnection.java 2014-10-03 12:21:51.883098440 +0100 -+++ jtorctl-briar/net/freehaven/tor/control/TorControlConnection.java 2014-10-06 16:28:53.516851714 +0100 -@@ -728,5 +728,19 @@ - sendAndWaitForResponse("CLOSECIRCUIT "+circID+ - (ifUnused?" IFUNUSED":"")+"\r\n", null); +diff --git a/net/freehaven/tor/control/TorControlConnection.java b/net/freehaven/tor/control/TorControlConnection.java +index 9524612..38b1879 100644 +--- a/net/freehaven/tor/control/TorControlConnection.java ++++ b/net/freehaven/tor/control/TorControlConnection.java +@@ -740,7 +740,7 @@ public class TorControlConnection implements TorControlCommands { + * service with the given hostname (excluding the .onion extension). + */ + public void forgetHiddenService(String hostname) throws IOException { +- sendAndWaitForResponse("FORGETHS " + hostname + "\r\n", null); ++ sendAndWaitForResponse("HSFORGET " + hostname + "\r\n", null); } -+ -+ /** Tells Tor to exit when this control connection is closed. This command -+ * was added in Tor 0.2.2.28-beta. -+ */ -+ public void takeOwnership() throws IOException { -+ sendAndWaitForResponse("TAKEOWNERSHIP\r\n", null); -+ } -+ -+ /** Tells Tor to forget any cached client state relating to the hidden -+ * service with the given hostname (excluding the .onion extension). -+ */ -+ public void forgetHiddenService(String hostname) throws IOException { -+ sendAndWaitForResponse("FORGETHS " + hostname + "\r\n", null); -+ } } diff --git a/patches/tor.patch b/patches/tor.patch index 5937db8bf48bb0091c43cba6e56ea1167c47cd3c..4d4da5bb1d3bb0f2176da8d52e265c766941789e 100644 --- a/patches/tor.patch +++ b/patches/tor.patch @@ -1,39 +1,30 @@ diff --git a/src/or/control.c b/src/or/control.c -index e25c3b2..3fff71d 100644 +index 220e7e5..a54c8a2 100644 --- a/src/or/control.c +++ b/src/or/control.c -@@ -37,6 +37,8 @@ - #include "nodelist.h" - #include "policies.h" - #include "reasons.h" -+#include "rendclient.h" -+#include "rendcommon.h" - #include "rephist.h" - #include "router.h" - #include "routerlist.h" -@@ -157,6 +159,8 @@ static int handle_control_resolve(control_connection_t *conn, uint32_t len, - static int handle_control_usefeature(control_connection_t *conn, - uint32_t len, - const char *body); -+static int handle_control_forgeths(control_connection_t *conn, uint32_t len, +@@ -176,6 +176,8 @@ static int handle_control_hsfetch(control_connection_t *conn, uint32_t len, + const char *body); + static int handle_control_hspost(control_connection_t *conn, uint32_t len, + const char *body); ++static int handle_control_hsforget(control_connection_t *conn, uint32_t len, + const char *body); - static int write_stream_target_to_buf(entry_connection_t *conn, char *buf, - size_t len); - static void orconn_target_get_name(char *buf, size_t len, -@@ -3211,6 +3215,33 @@ handle_control_dropguards(control_connection_t *conn, + static int handle_control_add_onion(control_connection_t *conn, uint32_t len, + const char *body); + static int handle_control_del_onion(control_connection_t *conn, uint32_t len, +@@ -3725,6 +3727,33 @@ handle_control_hspost(control_connection_t *conn, return 0; } -+/** Called when we get a FORGETHS command: parse the hidden service's onion ++/** Called when we get an HSFORGET command: parse the hidden service's onion + * address and purge any cached state related to the service. */ +static int -+handle_control_forgeths(control_connection_t *conn, uint32_t len, ++handle_control_hsforget(control_connection_t *conn, uint32_t len, + const char *body) +{ + smartlist_t *args; + char *onion_address; + -+ args = getargs_helper("FORGETHS", conn, body, 1, 1); ++ args = getargs_helper("HSFORGET", conn, body, 1, 1); + if (!args) + return -1; + onion_address = smartlist_get(args, 0); @@ -51,74 +42,32 @@ index e25c3b2..3fff71d 100644 + return 0; +} + - /** Called when <b>conn</b> has no more bytes left on its outbuf. */ - int - connection_control_finished_flushing(control_connection_t *conn) -@@ -3508,6 +3539,9 @@ connection_control_process_inbuf(control_connection_t *conn) - } else if (!strcasecmp(conn->incoming_cmd, "DROPGUARDS")) { - if (handle_control_dropguards(conn, cmd_data_len, args)) + /** Called when we get a ADD_ONION command; parse the body, and set up + * the new ephemeral Onion Service. */ + static int +@@ -4396,6 +4425,9 @@ connection_control_process_inbuf(control_connection_t *conn) + } else if (!strcasecmp(conn->incoming_cmd, "+HSPOST")) { + if (handle_control_hspost(conn, cmd_data_len, args)) return -1; -+ } else if (!strcasecmp(conn->incoming_cmd, "FORGETHS")) { -+ if (handle_control_forgeths(conn, cmd_data_len, args)) ++ } else if (!strcasecmp(conn->incoming_cmd, "HSFORGET")) { ++ if (handle_control_hsforget(conn, cmd_data_len, args)) + return -1; - } else { - connection_printf_to_buf(conn, "510 Unrecognized command \"%s\"\r\n", - conn->incoming_cmd); -diff --git a/src/or/rendclient.c b/src/or/rendclient.c -index 162e0ac..d255eb9 100644 ---- a/src/or/rendclient.c -+++ b/src/or/rendclient.c -@@ -31,6 +31,8 @@ - static extend_info_t *rend_client_get_random_intro_impl( - const rend_cache_entry_t *rend_query, - const int strict, const int warnings); -+static void purge_hid_serv_from_last_hid_serv_requests( -+ const char *onion_address); - - /** Purge all potentially remotely-detectable state held in the hidden - * service client code. Called on SIGNAL NEWNYM. */ -@@ -42,6 +44,16 @@ rend_client_purge_state(void) - rend_client_purge_last_hid_serv_requests(); - } - -+/** Purge all cached state relating to the given hidden service. */ -+void -+rend_client_purge_hidden_service(const char *onion_address) -+{ -+ tor_assert(rend_valid_service_id(onion_address)); -+ -+ rend_cache_remove_entry(onion_address); -+ purge_hid_serv_from_last_hid_serv_requests(onion_address); -+} -+ - /** Called when we've established a circuit to an introduction point: - * send the introduction request. */ - void -diff --git a/src/or/rendclient.h b/src/or/rendclient.h -index 098c61d..15b0956 100644 ---- a/src/or/rendclient.h -+++ b/src/or/rendclient.h -@@ -13,6 +13,7 @@ - #define TOR_RENDCLIENT_H - - void rend_client_purge_state(void); -+void rend_client_purge_hidden_service(const char *onion_address); - - void rend_client_introcirc_has_opened(origin_circuit_t *circ); - void rend_client_rendcirc_has_opened(origin_circuit_t *circ); -diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c -index 5fdd13e..8171008 100644 ---- a/src/or/rendcommon.c -+++ b/src/or/rendcommon.c -@@ -952,6 +952,34 @@ rend_cache_lookup_entry(const char *query, int version, rend_cache_entry_t **e) - return 1; + } else if (!strcasecmp(conn->incoming_cmd, "ADD_ONION")) { + int ret = handle_control_add_onion(conn, cmd_data_len, args); + memwipe(args, 0, cmd_data_len); /* Scrub the private key. */ +diff --git a/src/or/rendcache.c b/src/or/rendcache.c +index d4bdd68..b9d79b8 100644 +--- a/src/or/rendcache.c ++++ b/src/or/rendcache.c +@@ -535,6 +535,34 @@ rend_cache_lookup_entry(const char *query, int version, rend_cache_entry_t **e) + return ret; } -+/** Remove any cached descriptors for <b>service_id/b>. */ ++/** Remove any cached descriptors for <b>service_id</b>. */ +void +rend_cache_remove_entry(const char *service_id) +{ -+ char key[REND_SERVICE_ID_LEN_BASE32+2]; /* <version><service_id>\0 */ ++ char key[REND_SERVICE_ID_LEN_BASE32 + 2]; /* <version><service_id>\0 */ + rend_cache_entry_t *removed; + + tor_assert(rend_valid_service_id(service_id)); @@ -145,15 +94,57 @@ index 5fdd13e..8171008 100644 /** Lookup the v2 service descriptor with base32-encoded <b>desc_id</b> and * copy the pointer to it to *<b>desc</b>. Return 1 on success, 0 on * well-formed-but-not-found, and -1 on failure. -diff --git a/src/or/rendcommon.h b/src/or/rendcommon.h -index 8396cc3..c12940a 100644 ---- a/src/or/rendcommon.h -+++ b/src/or/rendcommon.h -@@ -39,6 +39,7 @@ void rend_cache_free_all(void); - int rend_valid_service_id(const char *query); +diff --git a/src/or/rendcache.h b/src/or/rendcache.h +index 0512058..2c8ebfd 100644 +--- a/src/or/rendcache.h ++++ b/src/or/rendcache.h +@@ -56,6 +56,7 @@ void rend_cache_purge(void); + void rend_cache_free_all(void); int rend_cache_lookup_entry(const char *query, int version, rend_cache_entry_t **entry_out); +void rend_cache_remove_entry(const char *service_id); int rend_cache_lookup_v2_desc_as_dir(const char *query, const char **desc); /** Return value from rend_cache_store_v2_desc_as_{dir,client}. */ typedef enum { +diff --git a/src/or/rendclient.c b/src/or/rendclient.c +index a39e518..909e47f 100644 +--- a/src/or/rendclient.c ++++ b/src/or/rendclient.c +@@ -32,6 +32,9 @@ static extend_info_t *rend_client_get_random_intro_impl( + const rend_cache_entry_t *rend_query, + const int strict, const int warnings); + ++static void purge_hid_serv_from_last_hid_serv_requests( ++ const char *onion_address); ++ + /** Purge all potentially remotely-detectable state held in the hidden + * service client code. Called on SIGNAL NEWNYM. */ + void +@@ -43,6 +46,15 @@ rend_client_purge_state(void) + rend_client_purge_last_hid_serv_requests(); + } + ++/** Purge all cached state relating to the given hidden service. */ ++void ++rend_client_purge_hidden_service(const char *onion_address) ++{ ++ tor_assert(rend_valid_service_id(onion_address)); ++ rend_cache_remove_entry(onion_address); ++ purge_hid_serv_from_last_hid_serv_requests(onion_address); ++} ++ + /** Called when we've established a circuit to an introduction point: + * send the introduction request. */ + void +diff --git a/src/or/rendclient.h b/src/or/rendclient.h +index 124433e..b27d2db 100644 +--- a/src/or/rendclient.h ++++ b/src/or/rendclient.h +@@ -15,6 +15,7 @@ + #include "rendcache.h" + + void rend_client_purge_state(void); ++void rend_client_purge_hidden_service(const char *onion_address); + + void rend_client_introcirc_has_opened(origin_circuit_t *circ); + void rend_client_rendcirc_has_opened(origin_circuit_t *circ);