nickname.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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 */
  6. /**
  7. * \file nickname.c
  8. * \brief Check and manipulate relay nicknames.
  9. */
  10. #include "core/or/or.h"
  11. #include "feature/nodelist/nickname.h"
  12. /** Return true iff <b>s</b> is a valid server nickname. (That is, a string
  13. * containing between 1 and MAX_NICKNAME_LEN characters from
  14. * LEGAL_NICKNAME_CHARACTERS.) */
  15. int
  16. is_legal_nickname(const char *s)
  17. {
  18. size_t len;
  19. tor_assert(s);
  20. len = strlen(s);
  21. return len > 0 && len <= MAX_NICKNAME_LEN &&
  22. strspn(s,LEGAL_NICKNAME_CHARACTERS) == len;
  23. }
  24. /** Return true iff <b>s</b> is a valid server nickname or
  25. * hex-encoded identity-key digest. */
  26. int
  27. is_legal_nickname_or_hexdigest(const char *s)
  28. {
  29. if (*s!='$')
  30. return is_legal_nickname(s);
  31. else
  32. return is_legal_hexdigest(s);
  33. }
  34. /** Return true iff <b>s</b> is a valid hex-encoded identity-key
  35. * digest. (That is, an optional $, followed by 40 hex characters,
  36. * followed by either nothing, or = or ~ followed by a nickname, or
  37. * a character other than =, ~, or a hex character.)
  38. */
  39. int
  40. is_legal_hexdigest(const char *s)
  41. {
  42. size_t len;
  43. tor_assert(s);
  44. if (s[0] == '$') s++;
  45. len = strlen(s);
  46. if (len > HEX_DIGEST_LEN) {
  47. if (s[HEX_DIGEST_LEN] == '=' ||
  48. s[HEX_DIGEST_LEN] == '~') {
  49. if (!is_legal_nickname(s+HEX_DIGEST_LEN+1))
  50. return 0;
  51. } else {
  52. return 0;
  53. }
  54. }
  55. return (len >= HEX_DIGEST_LEN &&
  56. strspn(s,HEX_CHARACTERS)==HEX_DIGEST_LEN);
  57. }