Loading src/common/util.h +15 −6 Original line number Diff line number Diff line Loading @@ -68,15 +68,17 @@ void set_uint32(char *cp, uint32_t v); ((*(((uint8_t*)(cp))+3)) ) ) #define set_uint16(cp,v) \ do { \ uint16_t u16v = (v); \ *(((uint8_t*)(cp))+0) = (v >> 8)&0xff; \ *(((uint8_t*)(cp))+1) = (v >> 0)&0xff; \ } while (0) #define set_uint32(cp,v) \ #define set_uint32(cp,val) \ do { \ *(((uint8_t*)(cp))+0) = (v >> 24)&0xff; \ *(((uint8_t*)(cp))+1) = (v >> 16)&0xff; \ *(((uint8_t*)(cp))+2) = (v >> 8)&0xff; \ *(((uint8_t*)(cp))+3) = (v >> 0)&0xff; \ uint32_t u32v = (v); \ *(((uint8_t*)(cp))+0) = s32 >> 24)&0xff; \ *(((uint8_t*)(cp))+1) = s32 >> 16)&0xff; \ *(((uint8_t*)(cp))+2) = s32 >> 8)&0xff; \ *(((uint8_t*)(cp))+3) = s32 >> 0)&0xff; \ } while (0) #endif #endif Loading Loading @@ -197,5 +199,12 @@ int correct_socket_errno(int s); #define correct_socket_errno(s) (errno) #endif #endif /* Local Variables: mode:c indent-tabs-mode:nil c-basic-offset:2 End: */ src/or/connection_edge.c +10 −1 Original line number Diff line number Diff line Loading @@ -171,7 +171,7 @@ int connection_edge_end(connection_t *conn, char reason, crypt_path_t *cpath_lay * return -1. Else return 0. */ int connection_edge_send_command(connection_t *fromconn, circuit_t *circ, int relay_command, void *payload, int relay_command, const char *payload, int payload_len, crypt_path_t *cpath_layer) { cell_t cell; relay_header_t rh; Loading Loading @@ -433,6 +433,15 @@ int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection_start_reading(conn); connection_edge_package_raw_inbuf(conn); /* handle whatever might still be on the inbuf */ return 0; case RELAY_COMMAND_ESTABLISH_INTRO: case RELAY_COMMAND_ESTABLISH_RENDEZVOUS: case RELAY_COMMAND_INTRODUCE1: case RELAY_COMMAND_INTRODUCE2: case RELAY_COMMAND_RENDEZVOUS1: case RELAY_COMMAND_RENDEZVOUS2: rend_process_relay_cell(circ, rh.command, rh.length, cell->payload+RELAY_HEADER_SIZE); return 0; } log_fn(LOG_WARN,"unknown relay command %d.",rh.command); return -1; Loading src/or/or.h +11 −2 Original line number Diff line number Diff line Loading @@ -829,7 +829,7 @@ int connection_edge_process_inbuf(connection_t *conn); int connection_edge_destroy(uint16_t circ_id, connection_t *conn); int connection_edge_end(connection_t *conn, char reason, crypt_path_t *cpath_layer); int connection_edge_send_command(connection_t *fromconn, circuit_t *circ, int relay_command, void *payload, int relay_command, const char *payload, int payload_len, crypt_path_t *cpath_layer); int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection_t *conn, int edge_type, Loading Loading @@ -1044,6 +1044,9 @@ typedef struct rend_service_descriptor_t { char **intro_points; } rend_service_descriptor_t; void rend_process_relay_cell(circuit_t *circ, int command, int length, const char *payload); void rend_service_descriptor_free(rend_service_descriptor_t *desc); int rend_encode_service_descriptor(rend_service_descriptor_t *desc, crypto_pk_env_t *key, Loading @@ -1058,7 +1061,6 @@ int rend_valid_service_id(char *query); int rend_cache_lookup(char *query, const char **desc, int *desc_len); int rend_cache_store(char *desc, int desc_len); /********************************* rendservice.c ***************************/ int rend_config_services(or_options_t *options); Loading @@ -1067,6 +1069,13 @@ int rend_services_init(void); void rend_service_intro_is_ready(circuit_t *circuit); void rend_service_rendezvous_is_ready(circuit_t *circuit); int rend_service_introduce(circuit_t *circuit, const char *request, int request_len); /********************************* rendmid.c *******************************/ int rend_mid_establish_intro(circuit_t *circ, const char *request, int request_len); int rend_mid_introduce(circuit_t *circ, const char *request, int request_len); int rend_mid_establish_rendezvous(circuit_t *circ, const char *request, int request_len); int rend_mid_rendezvous(circuit_t *circ, const char *request, int request_len); #endif Loading src/or/rendcommon.c +35 −1 Original line number Diff line number Diff line Loading @@ -93,7 +93,11 @@ rend_service_descriptor_t *rend_parse_service_descriptor( cp = eos+1; } keylen = crypto_pk_keysize(result->pk); if (end-cp != keylen) goto truncated; if (end-cp < keylen) goto truncated; if (end-cp > keylen) { log_fn(LOG_WARN, "Signature too long on service descriptor"); goto error; } if (crypto_pk_public_checksig_digest(result->pk, (char*)str,cp-str, /* data */ (char*)cp,end-cp /* signature*/ Loading Loading @@ -248,6 +252,36 @@ int rend_cache_store(char *desc, int desc_len) return 0; } /* Dispatch on rendezvous relay command. */ void rend_process_relay_cell(circuit_t *circ, int command, int length, const char *payload) { int r; switch(command) { case RELAY_COMMAND_ESTABLISH_INTRO: r = rend_mid_establish_intro(circ,payload,length); break; case RELAY_COMMAND_ESTABLISH_RENDEZVOUS: r = rend_mid_establish_rendezvous(circ,payload,length); break; case RELAY_COMMAND_INTRODUCE1: r = rend_mid_introduce(circ,payload,length); break; case RELAY_COMMAND_INTRODUCE2: r = rend_service_introduce(circ,payload,length); break; case RELAY_COMMAND_RENDEZVOUS1: r = rend_mid_rendezvous(circ,payload,length); break; case RELAY_COMMAND_RENDEZVOUS2: /* r = rend_client_rendezvous(circ,payload,length); */ log_fn(LOG_NOTICE, "Ignoring a rendezvous2 cell"); break; default: assert(0); } } /* Local Variables: mode:c Loading src/or/rendmid.c +4 −4 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ * rendevous service. */ int rend_mid_establish_intro(circuit_t *circ, char *request, int request_len) rend_mid_establish_intro(circuit_t *circ, const char *request, int request_len) { crypto_pk_env_t *pk = NULL; char buf[20+9]; Loading Loading @@ -97,7 +97,7 @@ rend_mid_establish_intro(circuit_t *circ, char *request, int request_len) * INTRODUCE2 cell. */ int rend_mid_introduce(circuit_t *circ, char *request, int request_len) rend_mid_introduce(circuit_t *circ, const char *request, int request_len) { circuit_t *intro_circ; char hexid[9]; Loading Loading @@ -149,7 +149,7 @@ rend_mid_introduce(circuit_t *circ, char *request, int request_len) * rendezvous cookie. */ int rend_mid_establish_rendezvous(circuit_t *circ, char *request, int request_len) rend_mid_establish_rendezvous(circuit_t *circ, const char *request, int request_len) { char hexid[9]; Loading Loading @@ -185,7 +185,7 @@ rend_mid_establish_rendezvous(circuit_t *circ, char *request, int request_len) * relaying the cell's body in a RENDEZVOUS2 cell, and connecting the two circuits. */ int rend_mid_rendezvous(circuit_t *circ, char *request, int request_len) rend_mid_rendezvous(circuit_t *circ, const char *request, int request_len) { circuit_t *rend_circ; char hexid[9]; Loading Loading
src/common/util.h +15 −6 Original line number Diff line number Diff line Loading @@ -68,15 +68,17 @@ void set_uint32(char *cp, uint32_t v); ((*(((uint8_t*)(cp))+3)) ) ) #define set_uint16(cp,v) \ do { \ uint16_t u16v = (v); \ *(((uint8_t*)(cp))+0) = (v >> 8)&0xff; \ *(((uint8_t*)(cp))+1) = (v >> 0)&0xff; \ } while (0) #define set_uint32(cp,v) \ #define set_uint32(cp,val) \ do { \ *(((uint8_t*)(cp))+0) = (v >> 24)&0xff; \ *(((uint8_t*)(cp))+1) = (v >> 16)&0xff; \ *(((uint8_t*)(cp))+2) = (v >> 8)&0xff; \ *(((uint8_t*)(cp))+3) = (v >> 0)&0xff; \ uint32_t u32v = (v); \ *(((uint8_t*)(cp))+0) = s32 >> 24)&0xff; \ *(((uint8_t*)(cp))+1) = s32 >> 16)&0xff; \ *(((uint8_t*)(cp))+2) = s32 >> 8)&0xff; \ *(((uint8_t*)(cp))+3) = s32 >> 0)&0xff; \ } while (0) #endif #endif Loading Loading @@ -197,5 +199,12 @@ int correct_socket_errno(int s); #define correct_socket_errno(s) (errno) #endif #endif /* Local Variables: mode:c indent-tabs-mode:nil c-basic-offset:2 End: */
src/or/connection_edge.c +10 −1 Original line number Diff line number Diff line Loading @@ -171,7 +171,7 @@ int connection_edge_end(connection_t *conn, char reason, crypt_path_t *cpath_lay * return -1. Else return 0. */ int connection_edge_send_command(connection_t *fromconn, circuit_t *circ, int relay_command, void *payload, int relay_command, const char *payload, int payload_len, crypt_path_t *cpath_layer) { cell_t cell; relay_header_t rh; Loading Loading @@ -433,6 +433,15 @@ int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection_start_reading(conn); connection_edge_package_raw_inbuf(conn); /* handle whatever might still be on the inbuf */ return 0; case RELAY_COMMAND_ESTABLISH_INTRO: case RELAY_COMMAND_ESTABLISH_RENDEZVOUS: case RELAY_COMMAND_INTRODUCE1: case RELAY_COMMAND_INTRODUCE2: case RELAY_COMMAND_RENDEZVOUS1: case RELAY_COMMAND_RENDEZVOUS2: rend_process_relay_cell(circ, rh.command, rh.length, cell->payload+RELAY_HEADER_SIZE); return 0; } log_fn(LOG_WARN,"unknown relay command %d.",rh.command); return -1; Loading
src/or/or.h +11 −2 Original line number Diff line number Diff line Loading @@ -829,7 +829,7 @@ int connection_edge_process_inbuf(connection_t *conn); int connection_edge_destroy(uint16_t circ_id, connection_t *conn); int connection_edge_end(connection_t *conn, char reason, crypt_path_t *cpath_layer); int connection_edge_send_command(connection_t *fromconn, circuit_t *circ, int relay_command, void *payload, int relay_command, const char *payload, int payload_len, crypt_path_t *cpath_layer); int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection_t *conn, int edge_type, Loading Loading @@ -1044,6 +1044,9 @@ typedef struct rend_service_descriptor_t { char **intro_points; } rend_service_descriptor_t; void rend_process_relay_cell(circuit_t *circ, int command, int length, const char *payload); void rend_service_descriptor_free(rend_service_descriptor_t *desc); int rend_encode_service_descriptor(rend_service_descriptor_t *desc, crypto_pk_env_t *key, Loading @@ -1058,7 +1061,6 @@ int rend_valid_service_id(char *query); int rend_cache_lookup(char *query, const char **desc, int *desc_len); int rend_cache_store(char *desc, int desc_len); /********************************* rendservice.c ***************************/ int rend_config_services(or_options_t *options); Loading @@ -1067,6 +1069,13 @@ int rend_services_init(void); void rend_service_intro_is_ready(circuit_t *circuit); void rend_service_rendezvous_is_ready(circuit_t *circuit); int rend_service_introduce(circuit_t *circuit, const char *request, int request_len); /********************************* rendmid.c *******************************/ int rend_mid_establish_intro(circuit_t *circ, const char *request, int request_len); int rend_mid_introduce(circuit_t *circ, const char *request, int request_len); int rend_mid_establish_rendezvous(circuit_t *circ, const char *request, int request_len); int rend_mid_rendezvous(circuit_t *circ, const char *request, int request_len); #endif Loading
src/or/rendcommon.c +35 −1 Original line number Diff line number Diff line Loading @@ -93,7 +93,11 @@ rend_service_descriptor_t *rend_parse_service_descriptor( cp = eos+1; } keylen = crypto_pk_keysize(result->pk); if (end-cp != keylen) goto truncated; if (end-cp < keylen) goto truncated; if (end-cp > keylen) { log_fn(LOG_WARN, "Signature too long on service descriptor"); goto error; } if (crypto_pk_public_checksig_digest(result->pk, (char*)str,cp-str, /* data */ (char*)cp,end-cp /* signature*/ Loading Loading @@ -248,6 +252,36 @@ int rend_cache_store(char *desc, int desc_len) return 0; } /* Dispatch on rendezvous relay command. */ void rend_process_relay_cell(circuit_t *circ, int command, int length, const char *payload) { int r; switch(command) { case RELAY_COMMAND_ESTABLISH_INTRO: r = rend_mid_establish_intro(circ,payload,length); break; case RELAY_COMMAND_ESTABLISH_RENDEZVOUS: r = rend_mid_establish_rendezvous(circ,payload,length); break; case RELAY_COMMAND_INTRODUCE1: r = rend_mid_introduce(circ,payload,length); break; case RELAY_COMMAND_INTRODUCE2: r = rend_service_introduce(circ,payload,length); break; case RELAY_COMMAND_RENDEZVOUS1: r = rend_mid_rendezvous(circ,payload,length); break; case RELAY_COMMAND_RENDEZVOUS2: /* r = rend_client_rendezvous(circ,payload,length); */ log_fn(LOG_NOTICE, "Ignoring a rendezvous2 cell"); break; default: assert(0); } } /* Local Variables: mode:c Loading
src/or/rendmid.c +4 −4 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ * rendevous service. */ int rend_mid_establish_intro(circuit_t *circ, char *request, int request_len) rend_mid_establish_intro(circuit_t *circ, const char *request, int request_len) { crypto_pk_env_t *pk = NULL; char buf[20+9]; Loading Loading @@ -97,7 +97,7 @@ rend_mid_establish_intro(circuit_t *circ, char *request, int request_len) * INTRODUCE2 cell. */ int rend_mid_introduce(circuit_t *circ, char *request, int request_len) rend_mid_introduce(circuit_t *circ, const char *request, int request_len) { circuit_t *intro_circ; char hexid[9]; Loading Loading @@ -149,7 +149,7 @@ rend_mid_introduce(circuit_t *circ, char *request, int request_len) * rendezvous cookie. */ int rend_mid_establish_rendezvous(circuit_t *circ, char *request, int request_len) rend_mid_establish_rendezvous(circuit_t *circ, const char *request, int request_len) { char hexid[9]; Loading Loading @@ -185,7 +185,7 @@ rend_mid_establish_rendezvous(circuit_t *circ, char *request, int request_len) * relaying the cell's body in a RENDEZVOUS2 cell, and connecting the two circuits. */ int rend_mid_rendezvous(circuit_t *circ, char *request, int request_len) rend_mid_rendezvous(circuit_t *circ, const char *request, int request_len) { circuit_t *rend_circ; char hexid[9]; Loading