((*(((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
#define correct_socket_errno(s) (errno)
#endif
-
#endif
+
+/*
+ Local Variables:
+ mode:c
+ indent-tabs-mode:nil
+ c-basic-offset:2
+ End:
+*/
* 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;
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;
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,
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,
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);
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
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*/
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
* 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];
* 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];
* 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];
* 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];
* 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];