#!/bin/bash # NTAG424 簡化測試腳本 # 專為固定放置 NTAG424 卡片設計 set -e # 顏色定義 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 可執行檔案 EXEC="./nt4h_c_example" echo -e "${YELLOW}========================================${NC}" echo -e "${YELLOW} NTAG424 簡化測試腳本${NC}" echo -e "${YELLOW}========================================${NC}" echo "" # 檢查檔案 if [[ ! -f "$EXEC" ]]; then echo -e "${RED}錯誤: 找不到 $EXEC${NC}" exit 1 fi if [[ ! -f "keys.txt" ]]; then echo -e "${RED}錯誤: 找不到 keys.txt${NC}" exit 1 fi if [[ ! -f "urls.txt" ]]; then echo -e "${RED}錯誤: 找不到 urls.txt${NC}" exit 1 fi echo -e "${GREEN}✓ 所有必要檔案都存在${NC}" echo "" # 測試函數 run_test() { local name="$1" local cmd="$2" local expected="$3" echo -e "${BLUE}[測試] $name${NC}" echo "執行: $cmd" if output=$(eval "$cmd" 2>&1); then if [[ -n "$expected" ]]; then if echo "$output" | grep -q "$expected"; then echo -e "${GREEN}✓ 通過${NC}" return 0 else echo -e "${RED}✗ 失敗 - 未找到: $expected${NC}" echo "輸出: $output" return 1 fi else echo -e "${GREEN}✓ 通過${NC}" return 0 fi else echo -e "${RED}✗ 失敗 - 命令錯誤${NC}" echo "錯誤: $output" return 1 fi } # 測試計數器 passed=0 failed=0 # 測試 1: 讀取 UID if run_test "讀取 UID" "$EXEC getuid --quiet --key 1" "SUCCEED"; then ((passed++)) else ((failed++)) fi # 測試 2: CMAC 驗證 if run_test "CMAC 驗證" "$EXEC verify --quiet --key 1" "SUCCEED"; then ((passed++)) else ((failed++)) fi # 測試 3: 快速 SDM 設定 if run_test "快速 SDM 設定" "$EXEC setsdm --quiet --url 1 --key 1" "SUCCEED"; then ((passed++)) else ((failed++)) fi # 測試 4: 使用不同金鑰 if run_test "使用金鑰 2" "$EXEC verify --quiet --key 2" "SUCCEED"; then ((passed++)) else ((failed++)) fi # 測試 5: 使用不同 URL if run_test "使用 URL 2" "$EXEC setsdm --quiet --url 2 --key 1" "SUCCEED"; then ((passed++)) else ((failed++)) fi # 測試 6: 詳細模式讀取 UID if run_test "詳細模式讀取 UID" "$EXEC getuid --key 1" "UID:"; then ((passed++)) else ((failed++)) fi # 測試 7: 詳細模式 CMAC 驗證 if run_test "詳細模式 CMAC 驗證" "$EXEC verify --key 1" "MAC 驗證"; then ((passed++)) else ((failed++)) fi # 測試 8: 手動驗證模式 echo -e "${BLUE}[測試] 手動驗證模式${NC}" echo "正在讀取卡片資料..." # 讀取實際資料進行手動驗證 if verify_output=$($EXEC verify --key 1 2>&1); then uid=$(echo "$verify_output" | grep "UID:" | awk '{print $2}') ctr=$(echo "$verify_output" | grep "計數器:" | awk '{print $2}') mac=$(echo "$verify_output" | grep "MAC:" | awk '{print $2}') if [[ -n "$uid" && -n "$ctr" && -n "$mac" ]]; then if run_test "手動驗證" "$EXEC verify --manual --quiet --uid $uid --ctr $ctr --cmac $mac --key 1" "SUCCEED"; then ((passed++)) else ((failed++)) fi else echo -e "${YELLOW}⚠ 跳過手動驗證 - 無法解析資料${NC}" ((passed++)) fi else echo -e "${YELLOW}⚠ 跳過手動驗證 - 無法讀取卡片${NC}" ((passed++)) fi # 測試 9: 錯誤處理 if run_test "錯誤處理 - 無效命令" "$EXEC invalid_command" "未知命令"; then ((passed++)) else ((failed++)) fi # 顯示結果 echo "" echo -e "${YELLOW}========================================${NC}" echo -e "${YELLOW} 測試結果${NC}" echo -e "${YELLOW}========================================${NC}" echo -e "通過: ${GREEN}$passed${NC}" echo -e "失敗: ${RED}$failed${NC}" echo -e "總計: $((passed + failed))" if [[ $failed -eq 0 ]]; then echo -e "${GREEN}🎉 所有測試通過!${NC}" exit 0 else echo -e "${RED}❌ 有 $failed 個測試失敗${NC}" exit 1 fi