diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-11-05 23:55:43 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-11-05 23:55:43 +0000 |
commit | 95c7b8cc641ad275ebb5f445760f27a7ea937075 (patch) | |
tree | d8c69f028a97b4aa780a1b6a023e4604d7147269 /src/or/command.c | |
parent | 6fcda5299fe7c0a40d3bff06ac4dcfe13d02d476 (diff) | |
download | tor-95c7b8cc641ad275ebb5f445760f27a7ea937075.tar.gz tor-95c7b8cc641ad275ebb5f445760f27a7ea937075.zip |
r14729@31-33-67: nickm | 2007-11-05 18:54:50 -0500
Send and Parse CERT cells correctly. Still need to understand the certs inside.
svn:r12392
Diffstat (limited to 'src/or/command.c')
-rw-r--r-- | src/or/command.c | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/src/or/command.c b/src/or/command.c index 100f1c379f..36de2d15cb 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -603,13 +603,51 @@ connection_or_act_on_netinfo(or_connection_t *conn) } } +/*DOCDOC*/ static void command_process_cert_cell(var_cell_t *cell, or_connection_t *conn) { - (void) cell; - (void) conn; + int n_certs = 0; + uint16_t conn_cert_len, id_cert_len; + const char *conn_cert = NULL, *id_cert = NULL; + const char *cp, *end; + + /*XXXX020 log messages*/ + if (conn->_base.state != OR_CONN_STATE_OR_HANDSHAKING) + goto err; + tor_assert(conn->handshake_state); + if (!conn->handshake_state->received_versions || + !conn->handshake_state->received_netinfo || + conn->handshake_state->received_certs) + goto err; + + cp = cell->payload; + end = cell->payload + cell->payload_len; + + while (cp < end) { + uint16_t len; + if (end-cp == 1) + goto err; + len = ntohs(get_uint16(cp)); + cp += 2; + if (end-cp < len) + goto err; + if (n_certs == 0) { + conn_cert = cp; + conn_cert_len = len; + } else if (n_certs == 1) { + id_cert = cp; + id_cert_len = len; + } else { + goto err; + } + cp += len; + ++n_certs; + } + + /* Now we have 0, 1, or 2 certs. */ + - /* Parse certs. */ /* Verify that identity cert has signed peer cert in SSL, or * peer cert in the cell. */ /* Verify that identity cert is self-signed. */ @@ -617,6 +655,11 @@ command_process_cert_cell(var_cell_t *cell, or_connection_t *conn) /* Learn cert digests. */ /* Remember peer cert public key. */ /* set received_certs. */ + + conn->handshake_state->received_certs = 1; + return; + err: + ; } #define LINK_AUTH_STRING "Tor initiator certificate verification" |