|  | @@ -13,9 +13,6 @@
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include "or.h"
 | 
	
		
			
				|  |  | -#ifdef HAVE_UNAME
 | 
	
		
			
				|  |  | -#include <sys/utsname.h>
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /****************************************************************************/
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -771,6 +768,8 @@ routerinfo_t *router_get_entry_from_string(char**s) {
 | 
	
		
			
				|  |  |    directory_token_t *tok = &_tok;
 | 
	
		
			
				|  |  |    struct tm published;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  int t;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #define NEXT_TOKEN()                                                     \
 | 
	
		
			
				|  |  |    do { if (router_get_next_token(s, tok)) {                              \
 | 
	
		
			
				|  |  |        log_fn(LOG_WARNING, "Error reading directory: %s", tok->val.error);\
 | 
	
	
		
			
				|  | @@ -779,8 +778,10 @@ routerinfo_t *router_get_entry_from_string(char**s) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define ARGS tok->val.cmd.args
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if (router_get_router_hash(*s, digest) < 0)
 | 
	
		
			
				|  |  | +  if (router_get_router_hash(*s, digest) < 0) {
 | 
	
		
			
				|  |  | +    log_fn(LOG_WARNING, "Couldn't compute router hash.");
 | 
	
		
			
				|  |  |      return NULL;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    NEXT_TOKEN();
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -802,11 +803,15 @@ routerinfo_t *router_get_entry_from_string(char**s) {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    if (!(router->nickname = strdup(ARGS[0])))
 | 
	
		
			
				|  |  |      goto err;
 | 
	
		
			
				|  |  | -  if (strlen(router->nickname) > MAX_NICKNAME_LEN)
 | 
	
		
			
				|  |  | +  if (strlen(router->nickname) > MAX_NICKNAME_LEN) {
 | 
	
		
			
				|  |  | +    log_fn(LOG_WARNING,"Router nickname too long.");
 | 
	
		
			
				|  |  |      goto err;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    if (strspn(router->nickname, LEGAL_NICKNAME_CHARACTERS) != 
 | 
	
		
			
				|  |  | -      strlen(router->nickname))
 | 
	
		
			
				|  |  | +      strlen(router->nickname)) {
 | 
	
		
			
				|  |  | +    log_fn(LOG_WARNING, "Router nickname contains illegal characters.");
 | 
	
		
			
				|  |  |      goto err;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    /* read router.address */
 | 
	
		
			
				|  |  |    if (!(router->address = strdup(ARGS[1])))
 | 
	
	
		
			
				|  | @@ -830,6 +835,7 @@ routerinfo_t *router_get_entry_from_string(char**s) {
 | 
	
		
			
				|  |  |    router->bandwidth = atoi(ARGS[5]);
 | 
	
		
			
				|  |  |    if (!router->bandwidth) {
 | 
	
		
			
				|  |  |      log_fn(LOG_WARNING,"bandwidth unreadable or 0. Failing.");
 | 
	
		
			
				|  |  | +    goto err;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    log_fn(LOG_DEBUG,"or_port %d, ap_port %d, dir_port %d, bandwidth %d.",
 | 
	
	
		
			
				|  | @@ -900,9 +906,9 @@ routerinfo_t *router_get_entry_from_string(char**s) {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    assert (router->identity_pkey);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if (crypto_pk_public_checksig(router->identity_pkey, tok->val.signature,
 | 
	
		
			
				|  |  | -                                128, signed_digest) != 20) {
 | 
	
		
			
				|  |  | -    log_fn(LOG_WARNING, "Invalid signature");
 | 
	
		
			
				|  |  | +  if ((t=crypto_pk_public_checksig(router->identity_pkey, tok->val.signature,
 | 
	
		
			
				|  |  | +                                   128, signed_digest)) != 20) {
 | 
	
		
			
				|  |  | +    log_fn(LOG_WARNING, "Invalid signature %d",t);
 | 
	
		
			
				|  |  |      goto err;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    if (memcmp(digest, signed_digest, 20)) {
 | 
	
	
		
			
				|  | @@ -1082,20 +1088,12 @@ int router_rebuild_descriptor(void) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void get_platform_str(char *platform, int len)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -#ifdef HAVE_UNAME
 | 
	
		
			
				|  |  | -  struct utsname u;
 | 
	
		
			
				|  |  | -  if (!uname(&u)) {
 | 
	
		
			
				|  |  | -    snprintf(platform, len-1, "Tor %s on %s %s %s %s %s",
 | 
	
		
			
				|  |  | -             VERSION, u.sysname, u.nodename, u.release, u.version, u.machine);
 | 
	
		
			
				|  |  | -    platform[len-1] = '\0';
 | 
	
		
			
				|  |  | -    return;
 | 
	
		
			
				|  |  | -  } else
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -      snprintf(platform, len-1, "Tor %s", VERSION);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +  snprintf(platform, len-1, "Tor %s on %s", VERSION, get_uname());
 | 
	
		
			
				|  |  | +  platform[len-1] = '\0';
 | 
	
		
			
				|  |  | +  return;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#define DEBUG_ROUTER_DUMP_ROUTER_TO_STRING
 | 
	
		
			
				|  |  |  int router_dump_router_to_string(char *s, int maxlen, routerinfo_t *router,
 | 
	
		
			
				|  |  |                                   crypto_pk_env_t *ident_key) {
 | 
	
		
			
				|  |  |    char *onion_pkey;
 | 
	
	
		
			
				|  | @@ -1109,9 +1107,18 @@ int router_dump_router_to_string(char *s, int maxlen, routerinfo_t *router,
 | 
	
		
			
				|  |  |    int written;
 | 
	
		
			
				|  |  |    int result=0;
 | 
	
		
			
				|  |  |    struct exit_policy_t *tmpe;
 | 
	
		
			
				|  |  | +#ifdef DEBUG_ROUTER_DUMP_ROUTER_TO_STRING
 | 
	
		
			
				|  |  | +  char *s_tmp, *s_dup;
 | 
	
		
			
				|  |  | +  routerinfo_t *ri_tmp;
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    get_platform_str(platform, sizeof(platform));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  if (crypto_pk_cmp_keys(ident_key, router->identity_pkey)) {
 | 
	
		
			
				|  |  | +    log_fn(LOG_WARNING,"Tried to sign a router with a private key that didn't match router's public key!");
 | 
	
		
			
				|  |  | +    return -1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    if(crypto_pk_write_public_key_to_string(router->onion_pkey,
 | 
	
		
			
				|  |  |                                            &onion_pkey,&onion_pkeylen)<0) {
 | 
	
		
			
				|  |  |      log_fn(LOG_WARNING,"write onion_pkey to string failed!");
 | 
	
	
		
			
				|  | @@ -1196,6 +1203,19 @@ int router_dump_router_to_string(char *s, int maxlen, routerinfo_t *router,
 | 
	
		
			
				|  |  |    /* include a last '\n' */
 | 
	
		
			
				|  |  |    s[written] = '\n';
 | 
	
		
			
				|  |  |    s[written+1] = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#ifdef DEBUG_ROUTER_DUMP_ROUTER_TO_STRING
 | 
	
		
			
				|  |  | +  s_tmp = s_dup = strdup(s);
 | 
	
		
			
				|  |  | +  ri_tmp = router_get_entry_from_string(&s_tmp);
 | 
	
		
			
				|  |  | +  if (!ri_tmp) {
 | 
	
		
			
				|  |  | +    log_fn(LOG_ERR, "We just generated a router descriptor we can't parse: <<%s>>", 
 | 
	
		
			
				|  |  | +           s);
 | 
	
		
			
				|  |  | +    return -1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  free(s_dup);
 | 
	
		
			
				|  |  | +  routerinfo_free(ri_tmp);
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    return written+1;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |