|  | @@ -0,0 +1,62 @@
 | 
	
		
			
				|  |  | +/* Copyright (c) 2001 Matej Pfajfar.
 | 
	
		
			
				|  |  | + * Copyright (c) 2001-2004, Roger Dingledine.
 | 
	
		
			
				|  |  | + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
 | 
	
		
			
				|  |  | + * Copyright (c) 2007-2018, The Tor Project, Inc. */
 | 
	
		
			
				|  |  | +/* See LICENSE for licensing information */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * \file nickname.c
 | 
	
		
			
				|  |  | + * \brief Check and manipulate relay nicknames.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#include "core/or/or.h"
 | 
	
		
			
				|  |  | +#include "feature/nodelist/nickname.h"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/** Return true iff <b>s</b> is a valid server nickname. (That is, a string
 | 
	
		
			
				|  |  | + * containing between 1 and MAX_NICKNAME_LEN characters from
 | 
	
		
			
				|  |  | + * LEGAL_NICKNAME_CHARACTERS.) */
 | 
	
		
			
				|  |  | +int
 | 
	
		
			
				|  |  | +is_legal_nickname(const char *s)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  size_t len;
 | 
	
		
			
				|  |  | +  tor_assert(s);
 | 
	
		
			
				|  |  | +  len = strlen(s);
 | 
	
		
			
				|  |  | +  return len > 0 && len <= MAX_NICKNAME_LEN &&
 | 
	
		
			
				|  |  | +    strspn(s,LEGAL_NICKNAME_CHARACTERS) == len;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/** Return true iff <b>s</b> is a valid server nickname or
 | 
	
		
			
				|  |  | + * hex-encoded identity-key digest. */
 | 
	
		
			
				|  |  | +int
 | 
	
		
			
				|  |  | +is_legal_nickname_or_hexdigest(const char *s)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  if (*s!='$')
 | 
	
		
			
				|  |  | +    return is_legal_nickname(s);
 | 
	
		
			
				|  |  | +  else
 | 
	
		
			
				|  |  | +    return is_legal_hexdigest(s);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/** Return true iff <b>s</b> is a valid hex-encoded identity-key
 | 
	
		
			
				|  |  | + * digest. (That is, an optional $, followed by 40 hex characters,
 | 
	
		
			
				|  |  | + * followed by either nothing, or = or ~ followed by a nickname, or
 | 
	
		
			
				|  |  | + * a character other than =, ~, or a hex character.)
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +int
 | 
	
		
			
				|  |  | +is_legal_hexdigest(const char *s)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  size_t len;
 | 
	
		
			
				|  |  | +  tor_assert(s);
 | 
	
		
			
				|  |  | +  if (s[0] == '$') s++;
 | 
	
		
			
				|  |  | +  len = strlen(s);
 | 
	
		
			
				|  |  | +  if (len > HEX_DIGEST_LEN) {
 | 
	
		
			
				|  |  | +    if (s[HEX_DIGEST_LEN] == '=' ||
 | 
	
		
			
				|  |  | +        s[HEX_DIGEST_LEN] == '~') {
 | 
	
		
			
				|  |  | +      if (!is_legal_nickname(s+HEX_DIGEST_LEN+1))
 | 
	
		
			
				|  |  | +        return 0;
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      return 0;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return (len >= HEX_DIGEST_LEN &&
 | 
	
		
			
				|  |  | +          strspn(s,HEX_CHARACTERS)==HEX_DIGEST_LEN);
 | 
	
		
			
				|  |  | +}
 |