validation.sh 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/env bash
  2. ERROR_FOUND=0
  3. REQUIRED_PATTERNS=(
  4. "^Filetype: Flipper NFC device$"
  5. "^Version: 4$"
  6. "^Device type: SLIX$"
  7. "^UID:( [A-F0-9]{2}){8}$"
  8. "^DSFID: 00$"
  9. "^AFI: 00$"
  10. "^IC Reference: 03$"
  11. "^Lock DSFID: false$"
  12. "^Lock AFI: false$"
  13. "^Block Count: 8$"
  14. "^Block Size: 04$"
  15. "^Data Content:( [A-F0-9]{2}){32}$"
  16. "^Security Status: 00 00 00 00 00 00 00 00$"
  17. "^Capabilities: Default$"
  18. "^Password Privacy: 7F FD 6E 5B$"
  19. "^Password Destroy: 0F 0F 0F 0F$"
  20. "^Password EAS: 00 00 00 00$"
  21. "^Privacy Mode: false$"
  22. "^Lock EAS: false$"
  23. )
  24. FORBIDDEN_PATTERNS=(
  25. # This showed up in Unleashed firmware, see https://github.com/nortakales/flipper-zero-tonies/pull/82
  26. "Subtype: ([0-9]){2}"
  27. )
  28. FILE_AND_DIR_ALLOWED_CHARACTERS="A-Za-z0-9().,!%&+ -";
  29. FILE_AND_DIR_REGEX="^\.[$FILE_AND_DIR_ALLOWED_CHARACTERS/]+\/[$FILE_AND_DIR_ALLOWED_CHARACTERS]+\.nfc$"
  30. # Use process substitution so that ERROR_FOUND is updated in the main shell.
  31. while read -r filename; do
  32. content=$(cat "$filename")
  33. if ! echo "$filename" | awk "/$FILE_AND_DIR_REGEX/ { found=1 } END { exit !found }"; then
  34. echo "$filename"
  35. echo " Filename has invalid characters or missing .nfc extension. Allowed characters are $FILE_AND_DIR_ALLOWED_CHARACTERS"
  36. ERROR_FOUND=1
  37. fi
  38. for pattern in "${REQUIRED_PATTERNS[@]}"; do
  39. if ! echo "$content" | awk "/$pattern/ { found=1 } END { exit !found }"; then
  40. echo "$filename"
  41. echo " Missing pattern: $pattern"
  42. ERROR_FOUND=1
  43. fi
  44. done
  45. for pattern in "${FORBIDDEN_PATTERNS[@]}"; do
  46. if echo "$content" | awk "/$pattern/ { found=1 } END { exit !found }"; then
  47. echo "$filename"
  48. echo " Forbidden pattern found: $pattern"
  49. ERROR_FOUND=1
  50. fi
  51. done
  52. # The likelihood of two blocks of 00 in data content is almost impossible,
  53. # so use that as a check for when the full data is not read
  54. if echo "$content" | awk '/Data Content:( [A-F0-9]{2})* 00 00( [A-F0-9]{2})*/ { found=1 } END { exit !found }'; then
  55. echo "$filename"
  56. echo " Full data not read"
  57. ERROR_FOUND=1
  58. fi
  59. # Not necessarily going to cause issues, but keep line endings the same for consistency
  60. if echo "$content" | awk '/\r/ { found=1 } END { exit !found }'; then
  61. echo "$filename"
  62. echo " Has carriage return characters"
  63. ERROR_FOUND=1
  64. fi
  65. done < <(find . -type f -name "*.nfc")
  66. exit $ERROR_FOUND