1
0

base64_valid.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * Determine whether a string looks like valid base64-encoded data.
  3. */
  4. #include "misc.h"
  5. static inline bool valid_char_main(char c)
  6. {
  7. return ((c >= 'A' && c <= 'Z') ||
  8. (c >= 'a' && c <= 'z') ||
  9. (c >= '0' && c <= '9') ||
  10. c == '+' || c == '/');
  11. }
  12. bool base64_valid(ptrlen data)
  13. {
  14. size_t blocklen = 0, nequals = 0;
  15. size_t i; // WINSCP
  16. for (i = 0; i < data.len; i++) {
  17. char c = ((const char *)data.ptr)[i];
  18. if (c == '\n' || c == '\r')
  19. continue;
  20. if (valid_char_main(c)) {
  21. if (nequals) /* can't go back to data after = */
  22. return false;
  23. blocklen++;
  24. if (blocklen == 4)
  25. blocklen = 0;
  26. continue;
  27. }
  28. if (c == '=') {
  29. if (blocklen == 0 && nequals) /* started a fresh block */
  30. return false;
  31. nequals++;
  32. blocklen++;
  33. if (blocklen == 4) {
  34. if (nequals > 2)
  35. return false; /* nonsensical final block */
  36. blocklen = 0;
  37. }
  38. continue;
  39. }
  40. return false; /* bad character */
  41. }
  42. if (blocklen == 0 || blocklen == 2 || blocklen == 3)
  43. return true; /* permit eliding the trailing = */
  44. return false;
  45. }