Handle rendezvous relay cells

svn:r1464
This commit is contained in:
Nick Mathewson 2004-04-03 03:37:11 +00:00
parent 7eaa655b6d
commit d93ff0b82f
6 changed files with 76 additions and 15 deletions

View File

@ -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
@ -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:
*/

View File

@ -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;
@ -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;

View File

@ -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,
@ -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,
@ -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);
@ -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

View File

@ -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*/
@ -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

View File

@ -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];
@ -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];
@ -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];
@ -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];

View File

@ -302,7 +302,7 @@ rend_service_get_by_pk_digest(const char* digest)
* rendezvous points.
*/
int
rend_service_introduce(circuit_t *circuit, char *request, int request_len)
rend_service_introduce(circuit_t *circuit, const char *request, int request_len)
{
char *ptr, *rp_nickname, *r_cookie;
char buf[RELAY_PAYLOAD_SIZE];