소스 검색

Add router_get_by_pk function; use in connection_tls_finish_handshake.

svn:r441
Nick Mathewson 22 년 전
부모
커밋
36a3086434
3개의 변경된 파일26개의 추가작업 그리고 2개의 파일을 삭제
  1. 7 2
      src/or/connection.c
  2. 1 0
      src/or/or.h
  3. 18 0
      src/or/routers.c

+ 7 - 2
src/or/connection.c

@@ -315,10 +315,14 @@ static int connection_tls_finish_handshake(connection_t *conn) {
         log_fn(LOG_INFO,"Other side has a cert but it's bad. Closing.");
         return -1;
       }
-      router = look up which router I just connected to. /* XXX */
+      router = router_get_by_pk(pk);
+      if (!router) {
+        log_fn(LOG_INFO,"Unrecognized public key from peer. Closing.");
+        crypto_free_pk_env(pk);
+      }
       conn->bandwidth = router->bandwidth;
       conn->addr = router->addr, conn->port = router->or_port;
-      conn->pkey = crypto_pk_dup_key(router->pkey);
+      conn->pkey = pk;
       if(conn->address)
         free(conn->address);
       conn->address = strdup(router->address);
@@ -326,6 +330,7 @@ static int connection_tls_finish_handshake(connection_t *conn) {
       conn->bandwidth = DEFAULT_BANDWIDTH_OP;
     }
   } else { /* I'm a client */
+    /* XXX Clients should also verify certificates. */
     conn->bandwidth = DEFAULT_BANDWIDTH_OP;
     circuit_n_conn_open(conn); /* send the pending create */
   }

+ 1 - 0
src/or/or.h

@@ -758,6 +758,7 @@ int learn_my_address(struct sockaddr_in *me);
 void router_retry_connections(void);
 routerinfo_t *router_pick_directory_server(void);
 routerinfo_t *router_get_by_addr_port(uint32_t addr, uint16_t port);
+routerinfo_t *router_get_by_pk(crypto_pk_env_t *pk);
 void router_get_directory(directory_t **pdirectory);
 int router_is_me(uint32_t addr, uint16_t port);
 void router_forget_router(uint32_t addr, uint16_t port);

+ 18 - 0
src/or/routers.c

@@ -111,6 +111,24 @@ routerinfo_t *router_get_by_addr_port(uint32_t addr, uint16_t port) {
   return NULL;
 }
 
+routerinfo_t *router_get_by_pk(crypto_pk_env_t *pk) 
+{
+  int i;
+  routerinfo_t *router;
+
+  assert(directory);
+
+  for(i=0;i<directory->n_routers;i++) {
+    router = directory->routers[i];
+    /* XXX Should this really be a separate link key? */
+    if (0 == crypto_pk_cmp_keys(router->pkey, pk))
+      return router;
+  }
+  
+  return NULL;
+}
+  
+
 void router_get_directory(directory_t **pdirectory) {
   *pdirectory = directory;
 }