flipper-zero-tonies/validation.sh

71 lines
1.9 KiB
Bash
Raw Normal View History

2025-02-21 13:20:08 +01:00
#!/usr/bin/env bash
2025-02-22 13:07:29 -08:00
ERROR_FOUND=0
REQUIRED_PATTERNS=(
2025-02-22 13:07:29 -08:00
"^Filetype: Flipper NFC device$"
"^Version: 4$"
"^Device type: SLIX$"
"^UID:( [A-F0-9]{2}){8}$"
"^DSFID: 00$"
"^AFI: 00$"
"^IC Reference: 03$"
"^Lock DSFID: false$"
"^Lock AFI: false$"
"^Block Count: 8$"
"^Block Size: 04$"
"^Data Content:( [A-F0-9]{2}){32}$"
"^Security Status: 00 00 00 00 00 00 00 00$"
"^Capabilities: Default$"
"^Password Privacy: 7F FD 6E 5B$"
"^Password Destroy: 0F 0F 0F 0F$"
"^Password EAS: 00 00 00 00$"
"^Privacy Mode: false$"
"^Lock EAS: false$"
)
2025-02-21 13:20:08 +01:00
FORBIDDEN_PATTERNS=(
2025-02-22 13:07:29 -08:00
# This showed up in Unleashed firmware, see https://github.com/nortakales/flipper-zero-tonies/pull/82
2025-02-21 13:20:08 +01:00
"Subtype: ([0-9]){2}"
)
2025-02-22 13:07:29 -08:00
# Use process substitution so that ERROR_FOUND is updated in the main shell.
2025-02-21 13:20:08 +01:00
while read -r filename; do
content=$(cat "$filename")
2025-02-21 13:20:08 +01:00
for pattern in "${REQUIRED_PATTERNS[@]}"; do
if ! echo "$content" | awk "/$pattern/ { found=1 } END { exit !found }"; then
echo "$filename"
2025-02-22 13:07:29 -08:00
echo " Missing pattern: $pattern"
ERROR_FOUND=1
fi
done
for pattern in "${FORBIDDEN_PATTERNS[@]}"; do
if echo "$content" | awk "/$pattern/ { found=1 } END { exit !found }"; then
echo "$filename"
echo " Forbidden pattern found: $pattern"
ERROR_FOUND=1
fi
2025-02-21 13:20:08 +01:00
done
# The likelihood of two blocks of 00 in data content is almost impossible,
# so use that as a check for when the full data is not read
if echo "$content" | awk '/Data Content:( [A-F0-9]{2})* 00 00( [A-F0-9]{2})*/ { found=1 } END { exit !found }'; then
echo "$filename"
echo " Full data not read"
2025-02-22 13:07:29 -08:00
ERROR_FOUND=1
2025-02-21 13:20:08 +01:00
fi
2025-02-22 13:07:29 -08:00
# Not necessarily going to cause issues, but keep line endings the same for consistency
2025-02-21 13:20:08 +01:00
if echo "$content" | awk '/\r/ { found=1 } END { exit !found }'; then
echo "$filename"
echo " Has carriage return characters"
2025-02-22 13:07:29 -08:00
ERROR_FOUND=1
2025-02-21 13:20:08 +01:00
fi
done < <(find . -type f -name "*.nfc")
2025-02-22 13:07:29 -08:00
exit $ERROR_FOUND