| 
					
				 | 
			
			
				@@ -1513,7 +1513,8 @@ router_parse_entry_from_string(const char *s, const char *end, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     char d[DIGEST_LEN]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tor_assert(tok->n_args == 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tor_strstrip(tok->args[0], " "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (base16_decode(d, DIGEST_LEN, tok->args[0], strlen(tok->args[0]))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (base16_decode(d, DIGEST_LEN, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      tok->args[0], strlen(tok->args[0])) != DIGEST_LEN) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_warn(LD_DIR, "Couldn't decode router fingerprint %s", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                escaped(tok->args[0])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       goto err; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1594,8 +1595,10 @@ router_parse_entry_from_string(const char *s, const char *end, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if ((tok = find_opt_by_keyword(tokens, K_EXTRA_INFO_DIGEST))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tor_assert(tok->n_args >= 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (strlen(tok->args[0]) == HEX_DIGEST_LEN) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      base16_decode(router->cache_info.extra_info_digest, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    DIGEST_LEN, tok->args[0], HEX_DIGEST_LEN); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (base16_decode(router->cache_info.extra_info_digest, DIGEST_LEN, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        tok->args[0], HEX_DIGEST_LEN) != DIGEST_LEN) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          log_warn(LD_DIR,"Invalid extra info digest"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_warn(LD_DIR, "Invalid extra info digest %s", escaped(tok->args[0])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1738,7 +1741,7 @@ extrainfo_parse_entry_from_string(const char *s, const char *end, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   strlcpy(extrainfo->nickname, tok->args[0], sizeof(extrainfo->nickname)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (strlen(tok->args[1]) != HEX_DIGEST_LEN || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       base16_decode(extrainfo->cache_info.identity_digest, DIGEST_LEN, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    tok->args[1], HEX_DIGEST_LEN)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    tok->args[1], HEX_DIGEST_LEN) != DIGEST_LEN) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     log_warn(LD_DIR,"Invalid fingerprint %s on \"extra-info\"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              escaped(tok->args[1])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     goto err; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1960,7 +1963,7 @@ authority_cert_parse_from_string(const char *s, const char **end_of_string) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tok = find_by_keyword(tokens, K_FINGERPRINT); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tor_assert(tok->n_args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (base16_decode(fp_declared, DIGEST_LEN, tok->args[0], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    strlen(tok->args[0]))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    strlen(tok->args[0])) != DIGEST_LEN) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     log_warn(LD_DIR, "Couldn't decode key certificate fingerprint %s", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              escaped(tok->args[0])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     goto err; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3097,7 +3100,8 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       voter->nickname = tor_strdup(tok->args[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (strlen(tok->args[1]) != HEX_DIGEST_LEN || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           base16_decode(voter->identity_digest, sizeof(voter->identity_digest), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        tok->args[1], HEX_DIGEST_LEN) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        tok->args[1], HEX_DIGEST_LEN) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        != sizeof(voter->identity_digest)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         log_warn(LD_DIR, "Error decoding identity digest %s in " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                  "network-status document.", escaped(tok->args[1])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         goto err; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3146,7 +3150,8 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (strlen(tok->args[0]) != HEX_DIGEST_LEN || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         base16_decode(voter->vote_digest, sizeof(voter->vote_digest), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                      tok->args[0], HEX_DIGEST_LEN) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      tok->args[0], HEX_DIGEST_LEN) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      != sizeof(voter->vote_digest)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         log_warn(LD_DIR, "Error decoding vote digest %s in " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                  "network-status consensus.", escaped(tok->args[0])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         goto err; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3171,7 +3176,7 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (strlen(tok->args[0]) == HEX_DIGEST_LEN) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       networkstatus_voter_info_t *voter = smartlist_get(ns->voters, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (base16_decode(voter->legacy_id_digest, DIGEST_LEN, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        tok->args[0], HEX_DIGEST_LEN)<0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        tok->args[0], HEX_DIGEST_LEN) != DIGEST_LEN) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         bad = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         bad = 0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3330,7 +3335,8 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (strlen(id_hexdigest) != HEX_DIGEST_LEN || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         base16_decode(declared_identity, sizeof(declared_identity), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                      id_hexdigest, HEX_DIGEST_LEN) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      id_hexdigest, HEX_DIGEST_LEN) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      != sizeof(declared_identity)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_warn(LD_DIR, "Error decoding declared identity %s in " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                "network-status document.", escaped(id_hexdigest)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       goto err; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3345,7 +3351,8 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     sig->alg = alg; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (strlen(sk_hexdigest) != HEX_DIGEST_LEN || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         base16_decode(sig->signing_key_digest, sizeof(sig->signing_key_digest), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                      sk_hexdigest, HEX_DIGEST_LEN) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      sk_hexdigest, HEX_DIGEST_LEN) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      != sizeof(sig->signing_key_digest)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_warn(LD_DIR, "Error decoding declared signing key digest %s in " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                "network-status document.", escaped(sk_hexdigest)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       tor_free(sig); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3547,7 +3554,7 @@ networkstatus_parse_detached_signatures(const char *s, const char *eos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (base16_decode(digests->d[alg], digest_length, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                      hexdigest, strlen(hexdigest)) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      hexdigest, strlen(hexdigest)) != (int) digest_length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_warn(LD_DIR, "Bad encoding on consensus-digest in detached " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                "networkstatus signatures"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       goto err; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3620,14 +3627,14 @@ networkstatus_parse_detached_signatures(const char *s, const char *eos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (strlen(id_hexdigest) != HEX_DIGEST_LEN || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         base16_decode(id_digest, sizeof(id_digest), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                      id_hexdigest, HEX_DIGEST_LEN) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      id_hexdigest, HEX_DIGEST_LEN) != sizeof(id_digest)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_warn(LD_DIR, "Error decoding declared identity %s in " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                "network-status vote.", escaped(id_hexdigest)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       goto err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (strlen(sk_hexdigest) != HEX_DIGEST_LEN || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         base16_decode(sk_digest, sizeof(sk_digest), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                      sk_hexdigest, HEX_DIGEST_LEN) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      sk_hexdigest, HEX_DIGEST_LEN) != sizeof(sk_digest)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_warn(LD_DIR, "Error decoding declared signing key digest %s in " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                "network-status vote.", escaped(sk_hexdigest)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       goto err; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -4829,7 +4836,7 @@ tor_version_parse(const char *s, tor_version_t *out) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     memwipe(digest, 0, sizeof(digest)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if ( hexlen == 0 || (hexlen % 2) == 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (base16_decode(digest, hexlen/2, cp, hexlen)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (base16_decode(digest, hexlen/2, cp, hexlen) != hexlen/2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     memcpy(out->git_tag, digest, hexlen/2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     out->git_tag_len = hexlen/2; 
			 |