summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2004-08-18 04:48:59 +0000
committerNick Mathewson <nickm@torproject.org>2004-08-18 04:48:59 +0000
commit196e6c1cc2276db90457cdf701330eecdca0599c (patch)
tree3a055a222e49251393949634ae3f3a754492bb81
parent86980cf6e232dd30de59bec2c32e0a85c81eb1d2 (diff)
downloadtor-196e6c1cc2276db90457cdf701330eecdca0599c.tar.gz
tor-196e6c1cc2276db90457cdf701330eecdca0599c.zip
Support new INTRODUCE2 cell format
svn:r2270
-rw-r--r--src/or/rendservice.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/or/rendservice.c b/src/or/rendservice.c
index 617e185390..b788593c69 100644
--- a/src/or/rendservice.c
+++ b/src/or/rendservice.c
@@ -354,6 +354,8 @@ rend_service_introduce(circuit_t *circuit, const char *request, int request_len)
crypt_path_t *cpath = NULL;
char serviceid[REND_SERVICE_ID_LEN+1];
char hexcookie[9];
+ int version;
+ int nickname_field_len;
base32_encode(serviceid, REND_SERVICE_ID_LEN+1,
circuit->rend_pk_digest,10);
@@ -367,7 +369,7 @@ rend_service_introduce(circuit_t *circuit, const char *request, int request_len)
}
/* min key length plus digest length plus nickname length */
- if (request_len < DIGEST_LEN+REND_COOKIE_LEN+(MAX_NICKNAME_LEN+1)+
+ if (request_len < DIGEST_LEN+REND_COOKIE_LEN+(HEX_DIGEST_LEN+2)+
DH_KEY_LEN+42){
log_fn(LOG_WARN, "Got a truncated INTRODUCE2 cell on circ %d",
circuit->n_circ_id);
@@ -401,19 +403,29 @@ rend_service_introduce(circuit_t *circuit, const char *request, int request_len)
log_fn(LOG_WARN, "Couldn't decrypt INTRODUCE2 cell");
return -1;
}
- ptr=memchr(buf,0,MAX_NICKNAME_LEN+1);
- if (!ptr || ptr == buf) {
+ if (*buf == 1) {
+ rp_nickname = buf+1;
+ nickname_field_len = HEX_DIGEST_LEN+2;
+ version = 1;
+ } else {
+ nickname_field_len = MAX_NICKNAME_LEN+1;
+ rp_nickname = buf;
+ version = 0;
+ }
+ ptr=memchr(rp_nickname,0,nickname_field_len);
+ if (!ptr || ptr == rp_nickname) {
log_fn(LOG_WARN, "Couldn't find a null-padded nickname in INTRODUCE2 cell");
return -1;
}
- if ((int)strspn(buf,LEGAL_NICKNAME_CHARACTERS) != ptr-buf) {
- log_fn(LOG_WARN, "Nickname in INTRODUCE2 cell contains illegal character.");
+ if ((version == 0 && !is_legal_nickname(rp_nickname)) ||
+ (version == 1 && !is_legal_nickname_or_hexdigest(rp_nickname)) ||
+ (int)strspn(buf,LEGAL_NICKNAME_CHARACTERS) != ptr-buf) {
+ log_fn(LOG_WARN, "Bad nickname in INTRODUCE2 cell.");
return -1;
}
- /* Okay, now we know that the nickname is at the start of the buffer. */
- rp_nickname = buf;
- ptr = buf+(MAX_NICKNAME_LEN+1);
- len -= (MAX_NICKNAME_LEN+1);
+ /* Okay, now we know that a nickname is at the start of the buffer. */
+ ptr = rp_nickname+nickname_field_len;
+ len -= nickname_field_len;
if (len != REND_COOKIE_LEN+DH_KEY_LEN) {
log_fn(LOG_WARN, "Bad length for INTRODUCE2 cell.");
return -1;