1 /* Copyright (c) 2001 Matej Pfajfar.
2 * Copyright (c) 2001-2004, Roger Dingledine.
3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4 * Copyright (c) 2007-2018, The Tor Project, Inc. */
5 /* See LICENSE for licensing information */
9 * \brief Check and manipulate relay nicknames.
12 #include "core/or/or.h"
13 #include "feature/nodelist/nickname.h"
15 /** Return true iff <b>s</b> is a valid server nickname. (That is, a string
16 * containing between 1 and MAX_NICKNAME_LEN characters from
17 * LEGAL_NICKNAME_CHARACTERS.) */
19 is_legal_nickname(const char *s
)
24 return len
> 0 && len
<= MAX_NICKNAME_LEN
&&
25 strspn(s
,LEGAL_NICKNAME_CHARACTERS
) == len
;
28 /** Return true iff <b>s</b> is a valid server nickname or
29 * hex-encoded identity-key digest. */
31 is_legal_nickname_or_hexdigest(const char *s
)
34 return is_legal_nickname(s
);
36 return is_legal_hexdigest(s
);
39 /** Return true iff <b>s</b> is a valid hex-encoded identity-key
40 * digest. (That is, an optional $, followed by 40 hex characters,
41 * followed by either nothing, or = or ~ followed by a nickname, or
42 * a character other than =, ~, or a hex character.)
45 is_legal_hexdigest(const char *s
)
51 if (len
> HEX_DIGEST_LEN
) {
52 if (s
[HEX_DIGEST_LEN
] == '=' ||
53 s
[HEX_DIGEST_LEN
] == '~') {
54 if (!is_legal_nickname(s
+HEX_DIGEST_LEN
+1))
60 return (len
>= HEX_DIGEST_LEN
&&
61 strspn(s
,HEX_CHARACTERS
)==HEX_DIGEST_LEN
);