]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Merge pull request #551 from pwpiwi/remove_reveng
authorIceman <iceman@iuse.se>
Wed, 24 Jan 2018 09:47:59 +0000 (10:47 +0100)
committerGitHub <noreply@github.com>
Wed, 24 Jan 2018 09:47:59 +0000 (10:47 +0100)
Remove reveng

27 files changed:
CI/.travis.yml [new file with mode: 0644]
CI/appveyor.yml [new file with mode: 0644]
CI/readme.md [new file with mode: 0644]
CI/travis_test_commands.scr [new file with mode: 0644]
appveyor.yml [deleted file]
armsrc/appmain.c
armsrc/iso14443a.c
armsrc/mifarecmd.c
armsrc/mifaresniff.c
armsrc/mifaresniff.h
armsrc/mifareutil.h
client/cmddata.c
client/cmdhf14a.c
client/cmdhf14a.h
client/cmdhfmf.c
client/cmdhfmfhard.c
client/emv/apduinfo.c
client/emv/crypto_polarssl.c
client/emv/emv_pki.c
client/emv/test/crypto_test.c
client/fpga_compress.c
client/hardnested/hardnested_bf_core.c
client/hardnested/hardnested_bf_core.h
client/hardnested/hardnested_bruteforce.c
client/loclass/ikeys.c
client/mifarehost.c
client/util_posix.c

diff --git a/CI/.travis.yml b/CI/.travis.yml
new file mode 100644 (file)
index 0000000..8e9289b
--- /dev/null
@@ -0,0 +1,55 @@
+# Travis-CI config
+# variable REPOSITORY_EP must be filled with repository name. as sample: "merlokk/proxmark3"
+language: c
+
+compiler: gcc
+
+# Test on Linux and MacOS
+matrix:
+  include:
+    - os: osx
+      osx_image: xcode7.3      # OS X 10.11
+    - os: osx
+      osx_image: xcode8.3   # OS X 10.12
+    - os: osx
+      osx_image: xcode9     # OS X 10.12
+    - os: osx
+      osx_image: xcode9.2   # OS X 10.12
+    - os: linux
+      dist: trusty
+      sudo: required
+
+before_install:
+## Install ARM toolchain on Linux.
+## add our homebrew tap for MacOS
+## Note: all dependencies on MacOS should be resolved by the brew install command
+  echo $REPOSITORY_EP;
+  if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then 
+    sudo apt-get update -qq;
+    sudo apt-get install -y gcc-arm-none-eabi;
+  elif [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
+    brew update;
+    if [[ "$REPOSITORY_EP" == "" ]]; then
+      brew tap proxmark/proxmark3;
+    else
+      brew tap "$REPOSITORY_EP" --env=std;
+    fi
+  fi
+
+install:
+  if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then 
+    brew info proxmark3;
+    brew install -v --HEAD proxmark3;
+  elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then 
+    make all;
+  fi
+
+before_script:
+
+script: 
+## for the time being we are satisfied if it can be build and then successfully started
+  if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then 
+    proxmark3 /dev/notexists travis_test_commands.scr ;
+  elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then 
+    ./client/proxmark3  /dev/notexists travis_test_commands.scr ;
+  fi
diff --git a/CI/appveyor.yml b/CI/appveyor.yml
new file mode 100644 (file)
index 0000000..f5ae2c7
--- /dev/null
@@ -0,0 +1,297 @@
+version: 3.0.1.{build}
+image: Visual Studio 2017
+clone_folder: C:\ProxSpace\pm3
+init:
+- ps: >-
+    $psversiontable
+
+    #Get-ChildItem Env:
+
+
+    $releasename=""
+
+    $env:APPVEYOR_REPO_COMMIT_SHORT = $env:APPVEYOR_REPO_COMMIT.Substring(0, 8)
+
+    if ($env:appveyor_repo_tag -match "true"){
+      $releasename=$env:APPVEYOR_REPO_TAG_NAME + "/"
+    }
+
+    $releasename+=$env:APPVEYOR_BUILD_VERSION + " [" + $env:APPVEYOR_REPO_COMMIT_SHORT + "]"
+
+
+    Write-Host "repository: $env:appveyor_repo_name branch:$env:APPVEYOR_REPO_BRANCH release: $releasename" -ForegroundColor Yellow
+
+    Add-AppveyorMessage -Message "[$env:APPVEYOR_REPO_COMMIT_SHORT]$env:appveyor_repo_name($env:APPVEYOR_REPO_BRANCH)" -Category Information -Details "repository: $env:appveyor_repo_name branch: $env:APPVEYOR_REPO_BRANCH release: $releasename"
+
+
+    iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
+clone_script:
+- ps: >-
+    Write-Host "Removing ProxSpace..." -NoNewLine
+
+    cd \
+
+    Remove-Item -Recurse -Force -Path c:\ProxSpace\*
+
+    Write-Host "[ OK ]" -ForegroundColor Green
+
+
+    Write-Host "Git clone ProxSpace..." -NoNewLine
+
+    git clone -q https://github.com/Gator96100/ProxSpace c:\ProxSpace
+
+    Write-Host "[ OK ]" -ForegroundColor Green
+
+
+    Write-Host "Removing pm3 dir..." -NoNewLine
+
+    Remove-Item -Recurse -Force -Path c:\ProxSpace\pm3\*
+
+    Write-Host "[ OK ]" -ForegroundColor Green
+
+
+    Write-Host "Cloning repository <$env:appveyor_repo_name> to $env:appveyor_build_folder ..." -NoNewLine
+
+    if(-not $env:appveyor_pull_request_number) {
+        git clone -q --branch=$env:appveyor_repo_branch https://github.com/$env:appveyor_repo_name.git $env:appveyor_build_folder
+        cd $env:appveyor_build_folder
+        git checkout -qf $env:appveyor_repo_commit
+    } else {
+        git clone -q https://github.com/$env:appveyor_repo_name.git $env:appveyor_build_folder
+        cd $env:appveyor_build_folder
+        git fetch -q origin +refs/pull/$env:appveyor_pull_request_number/merge:
+        git checkout -qf FETCH_HEAD
+    }
+
+    Write-Host "[ OK ]" -ForegroundColor Green
+
+
+    Write-Host "Fill msys\etc\fstab file..." -NoNewLine
+
+    New-Item c:\ProxSpace\msys\etc\fstab -type file -force -value "#Win32_Path Mount_Point`nc:\ProxSpace\devkitARM /devkitARM`nc:\ProxSpace\Qt\5.6 /qt `nc:\ProxSpace\pm3 /pm3`n"
+
+    Write-Host "[ OK ]" -ForegroundColor Green
+install:
+- ps: >-
+    function Exec-External {
+              param(
+                [Parameter(Position=0,Mandatory=1)][scriptblock] $command
+              )
+              & $command
+              if ($LASTEXITCODE -ne 0) {
+                throw ("Command returned non-zero error-code ${LASTEXITCODE}: $command")
+              }
+            }
+build_script:
+- ps: >-
+    $env:Path = "C:\ProxSpace\msys\bin;$env:Path"
+
+
+    #make
+
+    bash -lc -i "pwd;make all"
+
+
+    #some checks
+
+    if(!(Test-Path C:\ProxSpace\pm3\client\proxmark3.exe)){
+
+    throw "Main file proxmark3.exe not exists."
+
+    }
+
+    if(!(Test-Path C:\ProxSpace\pm3\armsrc\obj\fullimage.elf)){
+
+    throw "ARM file fullimage.elf not exists."
+
+    }
+
+    if(!(Test-Path C:\ProxSpace\pm3\client\hardnested\tables\*.bin.z)){
+
+    throw "Files in hardnested\tables not exists."
+
+    }
+
+
+    #copy
+
+    Write-Host "Copy release files..." -NoNewLine -ForegroundColor Yellow
+
+    New-Item -ItemType Directory -Force -Path C:\ProxSpace\Release
+
+    Copy-Item C:\ProxSpace\pm3\client\*.exe C:\ProxSpace\Release
+
+    New-Item -ItemType Directory -Force -Path C:\ProxSpace\Release\arm
+
+    Copy-Item C:\ProxSpace\pm3\armsrc\obj\*.elf C:\ProxSpace\Release\arm
+
+    Copy-Item C:\ProxSpace\pm3\bootrom\obj\*.elf C:\ProxSpace\Release\arm
+
+    New-Item -ItemType Directory -Force -Path C:\ProxSpace\Release\scripts
+
+    Copy-Item C:\ProxSpace\pm3\client\scripts\*.lua C:\ProxSpace\Release\scripts
+
+    New-Item -ItemType Directory -Force -Path C:\ProxSpace\Release\hardnested\tables
+
+    Copy-Item C:\ProxSpace\pm3\client\hardnested\*.bin C:\ProxSpace\Release\hardnested
+
+    Copy-Item C:\ProxSpace\pm3\client\hardnested\tables\*.bin.z C:\ProxSpace\Release\hardnested\tables
+
+    Write-Host "[ OK ]" -ForegroundColor Green
+
+
+    #archive and push
+
+    $releasename=""
+
+    if ($env:appveyor_repo_tag -match "true"){
+
+    $releasename=$env:APPVEYOR_REPO_TAG_NAME + "/"
+
+    }
+
+    $releasename+=$env:APPVEYOR_BUILD_VERSION + " [" + $env:APPVEYOR_REPO_COMMIT.Substring(0, 7) + "]"
+
+
+    Write-Host "Archive and publish release files ($releasename)..." -NoNewLine -ForegroundColor Yellow
+
+    cd C:\ProxSpace
+
+    7z a release.zip C:\ProxSpace\Release
+
+    Push-AppveyorArtifact release.zip -DeploymentName "$releasename"
+
+    Write-Host "[ OK ]" -ForegroundColor Green
+
+
+    Write-Host "Builded..." -ForegroundColor Yellow
+test_script:
+- ps: >-
+    $env:Path = "C:\ProxSpace\msys\bin;$env:Path"
+
+    cd c:\ProxSpace\pm3
+
+
+    $global:TestsPassed=$true
+
+
+    Function ExecTest($Name, $File, $Cmd, $CheckResult) {
+
+    #--- begin Job
+
+    $Job = Start-Job -ScriptBlock {
+      [bool]$res=$false
+      $TestTime=[System.Environment]::TickCount
+      $env:Path = "C:\ProxSpace\msys\bin;$env:Path"
+      Set-Location $using:PWD
+
+      $sb=[scriptblock]::Create("$using:Cmd")
+      #execute scriptblock
+      Write-host "Test [$using:Name] job: $using:Cmd"
+      $Cond=&$sb
+
+      if ($Cond -eq $null){
+      } ElseIf($using:CheckResult -ne $null) {
+        [String]$searchstr=""
+        if ($Cond -is [Object]){
+          ForEach($line in $Cond){
+            Write-host $line -ForegroundColor Gray
+            $searchstr += $line
+          }
+        }else{
+          Write-host "$Cond" -ForegroundColor Gray
+          $searchstr = $Cond
+        }
+        If($searchstr -like "*$using:CheckResult*") {
+          $res=$true
+        }
+        $Cond="*$using:CheckResult*"
+      } Else {
+        If (!($Cond -is [bool] -or $Cond -is [byte] -or $Cond -is [int16] -or $Cond -is [int32] -or $Cond -is [int64] -or $Cond -is [float])){
+            if ($Cond -is "String" -and $Cond -like "*passed*"){
+              $res= $true
+            }
+            if ($Cond -is "String" -and $Cond -like "*true*"){
+              $res= $true
+            }
+        } Else {
+          $res=$Cond
+        }
+      }
+
+      If ($res) {
+        Write-host "Result[$using:Name]: $Cond" -ForegroundColor Green
+        Add-AppveyorTest -Name "$using:Name" -Framework NUnit -Filename "$using:File" -Outcome Passed -Duration "$([System.Environment]::TickCount-$TestTime)"
+      }Else {
+        Write-host "Result[$using:Name]: $Cond" -ForegroundColor Red
+        Add-AppveyorTest -Name "$using:Name" -Framework NUnit -Filename "$using:File" -Outcome Failed -Duration "$([System.Environment]::TickCount-$TestTime)" -ErrorMessage "command:$using:Cmd`nresult:$Cond"
+      }
+        return $res
+    }
+
+    #--- end Job
+
+      [bool]$res=$false
+      # Wait 120 sec timeout for Job
+      if(Wait-Job $Job -Timeout 120){
+        $Results = $Job | Receive-Job
+        if($Results -like "true"){
+          $res=$true
+        }
+      } else {
+        Write-host "Test [$Name] timeout" -ForegroundColor Red
+        Add-AppveyorTest -Name "$Name" -Framework NUnit -Filename "$File" -Outcome Failed -Duration 40000 -ErrorMessage "timeout"
+      }
+      Remove-Job -Force $Job
+
+      if(!$res){
+        $global:TestsPassed=$false
+      }
+    }
+
+
+    Write-Host "Running tests..." -ForegroundColor Yellow
+
+
+    #file test
+
+    ExecTest "proxmark3 exists" "proxmark3.exe" {Test-Path C:\ProxSpace\Release\proxmark3.exe}
+
+    ExecTest "arm image exists" "\arm\fullimage1.elf" {Test-Path C:\ProxSpace\Release\arm\fullimage.elf}
+
+    ExecTest "bootrom exists" "bootrom.elf" {Test-Path C:\ProxSpace\Release\arm\bootrom.elf}
+
+    ExecTest "hardnested tables exists" "hardnested" {Test-Path C:\ProxSpace\Release\hardnested\tables\*.z}
+
+    ExecTest "release exists" "release.zip" {Test-Path C:\ProxSpace\release.zip}
+
+
+    #proxmark logic tests
+
+    ExecTest "proxmark help" "proxmark3 -h" {bash -lc 'cd ~/client;proxmark3 -h | grep -q Execute && echo Passed || echo Failed'}
+
+    ExecTest "proxmark help hardnested" "proxmark3 -h" {bash -lc 'cd ~/client;proxmark3 -h | grep -q hardnested && echo Passed || echo Failed'}
+
+
+    ExecTest "hf mf offline text" "hf mf" {bash -lc "cd ~/client;proxmark3 comx -c 'hf mf'"} "at_enc"
+
+    ExecTest "hf mf hardnested" "hf mf hardnested" {bash -lc "cd ~/client;proxmark3 comx -c 'hf mf hardnested t 1 000000000000'"} "found:"
+
+
+    #proxmark crypto tests
+
+    ExecTest "hf emv test" "hf emv test" {bash -lc "cd ~/client;proxmark3 comx -c 'hf emv test'"} "Tests ?OK"
+
+
+    if ($global:TestsPassed) {
+      Write-Host "Tests [ OK ]" -ForegroundColor Green
+    } else {
+      Write-Host "Tests [ ERROR ]" -ForegroundColor Red
+      throw "Tests error."
+    }
+on_success:
+- ps: Write-Host "Build success..." -ForegroundColor Green
+on_failure:
+- ps: Write-Host "Build error." -ForegroundColor Red
+on_finish:
+- ps: $blockRdp = $false; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
diff --git a/CI/readme.md b/CI/readme.md
new file mode 100644 (file)
index 0000000..d415929
--- /dev/null
@@ -0,0 +1,20 @@
+# How to configure continuous integration
+
+Here 2 CI configuration files:
+
+1. for [travis](travis-ci.org)
+2. for [appveyor](appveyor.com)
+
+It needs to put files from this directory to repository root and then configure CI from appropriate WEB portal.
+
+## travis
+
+- Copy .travis.yml and travis_test_commands.scr files to repository root 
+- Configure CI from http://travis-ci.org
+- It needs to fork https://github.com/Proxmark/homebrew-proxmark3 from your proxmark repository home
+- Put to file `proxmark3.rb` in line `head "https://github.com/proxmark/proxmark3.git"` your repository link. As sample: `head "https://github.com/merlokk/proxmark3.git"`
+
+
+## appveyor
+
+- Just copy appveyor.yml file to root and configure it from http://appveyor.com
diff --git a/CI/travis_test_commands.scr b/CI/travis_test_commands.scr
new file mode 100644 (file)
index 0000000..4f5b025
--- /dev/null
@@ -0,0 +1,3 @@
+hf mf hardnested t 1 000000000000
+hf emv test
+exit
diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644 (file)
index f5ae2c7..0000000
+++ /dev/null
@@ -1,297 +0,0 @@
-version: 3.0.1.{build}
-image: Visual Studio 2017
-clone_folder: C:\ProxSpace\pm3
-init:
-- ps: >-
-    $psversiontable
-
-    #Get-ChildItem Env:
-
-
-    $releasename=""
-
-    $env:APPVEYOR_REPO_COMMIT_SHORT = $env:APPVEYOR_REPO_COMMIT.Substring(0, 8)
-
-    if ($env:appveyor_repo_tag -match "true"){
-      $releasename=$env:APPVEYOR_REPO_TAG_NAME + "/"
-    }
-
-    $releasename+=$env:APPVEYOR_BUILD_VERSION + " [" + $env:APPVEYOR_REPO_COMMIT_SHORT + "]"
-
-
-    Write-Host "repository: $env:appveyor_repo_name branch:$env:APPVEYOR_REPO_BRANCH release: $releasename" -ForegroundColor Yellow
-
-    Add-AppveyorMessage -Message "[$env:APPVEYOR_REPO_COMMIT_SHORT]$env:appveyor_repo_name($env:APPVEYOR_REPO_BRANCH)" -Category Information -Details "repository: $env:appveyor_repo_name branch: $env:APPVEYOR_REPO_BRANCH release: $releasename"
-
-
-    iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
-clone_script:
-- ps: >-
-    Write-Host "Removing ProxSpace..." -NoNewLine
-
-    cd \
-
-    Remove-Item -Recurse -Force -Path c:\ProxSpace\*
-
-    Write-Host "[ OK ]" -ForegroundColor Green
-
-
-    Write-Host "Git clone ProxSpace..." -NoNewLine
-
-    git clone -q https://github.com/Gator96100/ProxSpace c:\ProxSpace
-
-    Write-Host "[ OK ]" -ForegroundColor Green
-
-
-    Write-Host "Removing pm3 dir..." -NoNewLine
-
-    Remove-Item -Recurse -Force -Path c:\ProxSpace\pm3\*
-
-    Write-Host "[ OK ]" -ForegroundColor Green
-
-
-    Write-Host "Cloning repository <$env:appveyor_repo_name> to $env:appveyor_build_folder ..." -NoNewLine
-
-    if(-not $env:appveyor_pull_request_number) {
-        git clone -q --branch=$env:appveyor_repo_branch https://github.com/$env:appveyor_repo_name.git $env:appveyor_build_folder
-        cd $env:appveyor_build_folder
-        git checkout -qf $env:appveyor_repo_commit
-    } else {
-        git clone -q https://github.com/$env:appveyor_repo_name.git $env:appveyor_build_folder
-        cd $env:appveyor_build_folder
-        git fetch -q origin +refs/pull/$env:appveyor_pull_request_number/merge:
-        git checkout -qf FETCH_HEAD
-    }
-
-    Write-Host "[ OK ]" -ForegroundColor Green
-
-
-    Write-Host "Fill msys\etc\fstab file..." -NoNewLine
-
-    New-Item c:\ProxSpace\msys\etc\fstab -type file -force -value "#Win32_Path Mount_Point`nc:\ProxSpace\devkitARM /devkitARM`nc:\ProxSpace\Qt\5.6 /qt `nc:\ProxSpace\pm3 /pm3`n"
-
-    Write-Host "[ OK ]" -ForegroundColor Green
-install:
-- ps: >-
-    function Exec-External {
-              param(
-                [Parameter(Position=0,Mandatory=1)][scriptblock] $command
-              )
-              & $command
-              if ($LASTEXITCODE -ne 0) {
-                throw ("Command returned non-zero error-code ${LASTEXITCODE}: $command")
-              }
-            }
-build_script:
-- ps: >-
-    $env:Path = "C:\ProxSpace\msys\bin;$env:Path"
-
-
-    #make
-
-    bash -lc -i "pwd;make all"
-
-
-    #some checks
-
-    if(!(Test-Path C:\ProxSpace\pm3\client\proxmark3.exe)){
-
-    throw "Main file proxmark3.exe not exists."
-
-    }
-
-    if(!(Test-Path C:\ProxSpace\pm3\armsrc\obj\fullimage.elf)){
-
-    throw "ARM file fullimage.elf not exists."
-
-    }
-
-    if(!(Test-Path C:\ProxSpace\pm3\client\hardnested\tables\*.bin.z)){
-
-    throw "Files in hardnested\tables not exists."
-
-    }
-
-
-    #copy
-
-    Write-Host "Copy release files..." -NoNewLine -ForegroundColor Yellow
-
-    New-Item -ItemType Directory -Force -Path C:\ProxSpace\Release
-
-    Copy-Item C:\ProxSpace\pm3\client\*.exe C:\ProxSpace\Release
-
-    New-Item -ItemType Directory -Force -Path C:\ProxSpace\Release\arm
-
-    Copy-Item C:\ProxSpace\pm3\armsrc\obj\*.elf C:\ProxSpace\Release\arm
-
-    Copy-Item C:\ProxSpace\pm3\bootrom\obj\*.elf C:\ProxSpace\Release\arm
-
-    New-Item -ItemType Directory -Force -Path C:\ProxSpace\Release\scripts
-
-    Copy-Item C:\ProxSpace\pm3\client\scripts\*.lua C:\ProxSpace\Release\scripts
-
-    New-Item -ItemType Directory -Force -Path C:\ProxSpace\Release\hardnested\tables
-
-    Copy-Item C:\ProxSpace\pm3\client\hardnested\*.bin C:\ProxSpace\Release\hardnested
-
-    Copy-Item C:\ProxSpace\pm3\client\hardnested\tables\*.bin.z C:\ProxSpace\Release\hardnested\tables
-
-    Write-Host "[ OK ]" -ForegroundColor Green
-
-
-    #archive and push
-
-    $releasename=""
-
-    if ($env:appveyor_repo_tag -match "true"){
-
-    $releasename=$env:APPVEYOR_REPO_TAG_NAME + "/"
-
-    }
-
-    $releasename+=$env:APPVEYOR_BUILD_VERSION + " [" + $env:APPVEYOR_REPO_COMMIT.Substring(0, 7) + "]"
-
-
-    Write-Host "Archive and publish release files ($releasename)..." -NoNewLine -ForegroundColor Yellow
-
-    cd C:\ProxSpace
-
-    7z a release.zip C:\ProxSpace\Release
-
-    Push-AppveyorArtifact release.zip -DeploymentName "$releasename"
-
-    Write-Host "[ OK ]" -ForegroundColor Green
-
-
-    Write-Host "Builded..." -ForegroundColor Yellow
-test_script:
-- ps: >-
-    $env:Path = "C:\ProxSpace\msys\bin;$env:Path"
-
-    cd c:\ProxSpace\pm3
-
-
-    $global:TestsPassed=$true
-
-
-    Function ExecTest($Name, $File, $Cmd, $CheckResult) {
-
-    #--- begin Job
-
-    $Job = Start-Job -ScriptBlock {
-      [bool]$res=$false
-      $TestTime=[System.Environment]::TickCount
-      $env:Path = "C:\ProxSpace\msys\bin;$env:Path"
-      Set-Location $using:PWD
-
-      $sb=[scriptblock]::Create("$using:Cmd")
-      #execute scriptblock
-      Write-host "Test [$using:Name] job: $using:Cmd"
-      $Cond=&$sb
-
-      if ($Cond -eq $null){
-      } ElseIf($using:CheckResult -ne $null) {
-        [String]$searchstr=""
-        if ($Cond -is [Object]){
-          ForEach($line in $Cond){
-            Write-host $line -ForegroundColor Gray
-            $searchstr += $line
-          }
-        }else{
-          Write-host "$Cond" -ForegroundColor Gray
-          $searchstr = $Cond
-        }
-        If($searchstr -like "*$using:CheckResult*") {
-          $res=$true
-        }
-        $Cond="*$using:CheckResult*"
-      } Else {
-        If (!($Cond -is [bool] -or $Cond -is [byte] -or $Cond -is [int16] -or $Cond -is [int32] -or $Cond -is [int64] -or $Cond -is [float])){
-            if ($Cond -is "String" -and $Cond -like "*passed*"){
-              $res= $true
-            }
-            if ($Cond -is "String" -and $Cond -like "*true*"){
-              $res= $true
-            }
-        } Else {
-          $res=$Cond
-        }
-      }
-
-      If ($res) {
-        Write-host "Result[$using:Name]: $Cond" -ForegroundColor Green
-        Add-AppveyorTest -Name "$using:Name" -Framework NUnit -Filename "$using:File" -Outcome Passed -Duration "$([System.Environment]::TickCount-$TestTime)"
-      }Else {
-        Write-host "Result[$using:Name]: $Cond" -ForegroundColor Red
-        Add-AppveyorTest -Name "$using:Name" -Framework NUnit -Filename "$using:File" -Outcome Failed -Duration "$([System.Environment]::TickCount-$TestTime)" -ErrorMessage "command:$using:Cmd`nresult:$Cond"
-      }
-        return $res
-    }
-
-    #--- end Job
-
-      [bool]$res=$false
-      # Wait 120 sec timeout for Job
-      if(Wait-Job $Job -Timeout 120){
-        $Results = $Job | Receive-Job
-        if($Results -like "true"){
-          $res=$true
-        }
-      } else {
-        Write-host "Test [$Name] timeout" -ForegroundColor Red
-        Add-AppveyorTest -Name "$Name" -Framework NUnit -Filename "$File" -Outcome Failed -Duration 40000 -ErrorMessage "timeout"
-      }
-      Remove-Job -Force $Job
-
-      if(!$res){
-        $global:TestsPassed=$false
-      }
-    }
-
-
-    Write-Host "Running tests..." -ForegroundColor Yellow
-
-
-    #file test
-
-    ExecTest "proxmark3 exists" "proxmark3.exe" {Test-Path C:\ProxSpace\Release\proxmark3.exe}
-
-    ExecTest "arm image exists" "\arm\fullimage1.elf" {Test-Path C:\ProxSpace\Release\arm\fullimage.elf}
-
-    ExecTest "bootrom exists" "bootrom.elf" {Test-Path C:\ProxSpace\Release\arm\bootrom.elf}
-
-    ExecTest "hardnested tables exists" "hardnested" {Test-Path C:\ProxSpace\Release\hardnested\tables\*.z}
-
-    ExecTest "release exists" "release.zip" {Test-Path C:\ProxSpace\release.zip}
-
-
-    #proxmark logic tests
-
-    ExecTest "proxmark help" "proxmark3 -h" {bash -lc 'cd ~/client;proxmark3 -h | grep -q Execute && echo Passed || echo Failed'}
-
-    ExecTest "proxmark help hardnested" "proxmark3 -h" {bash -lc 'cd ~/client;proxmark3 -h | grep -q hardnested && echo Passed || echo Failed'}
-
-
-    ExecTest "hf mf offline text" "hf mf" {bash -lc "cd ~/client;proxmark3 comx -c 'hf mf'"} "at_enc"
-
-    ExecTest "hf mf hardnested" "hf mf hardnested" {bash -lc "cd ~/client;proxmark3 comx -c 'hf mf hardnested t 1 000000000000'"} "found:"
-
-
-    #proxmark crypto tests
-
-    ExecTest "hf emv test" "hf emv test" {bash -lc "cd ~/client;proxmark3 comx -c 'hf emv test'"} "Tests ?OK"
-
-
-    if ($global:TestsPassed) {
-      Write-Host "Tests [ OK ]" -ForegroundColor Green
-    } else {
-      Write-Host "Tests [ ERROR ]" -ForegroundColor Red
-      throw "Tests error."
-    }
-on_success:
-- ps: Write-Host "Build success..." -ForegroundColor Green
-on_failure:
-- ps: Write-Host "Build error." -ForegroundColor Red
-on_finish:
-- ps: $blockRdp = $false; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
index e292483b80b5a6634151a11ad5243bf0ff77cf49..6476892235facc30fbf41a32b9636656ebb59d19 100644 (file)
@@ -135,35 +135,28 @@ void Dbhexdump(int len, uint8_t *d, bool bAsci) {
 // return that.
 //-----------------------------------------------------------------------------
 static int ReadAdc(int ch)
-{
-       uint32_t d;
-
-       AT91C_BASE_ADC->ADC_CR = AT91C_ADC_SWRST;
-       AT91C_BASE_ADC->ADC_MR =
-               ADC_MODE_PRESCALE(63  /* was 32 */) |                                                   // ADC_CLK = MCK / ((63+1) * 2) = 48MHz / 128 = 375kHz
-               ADC_MODE_STARTUP_TIME(1  /* was 16 */) |                                                // Startup Time = (1+1) * 8 / ADC_CLK = 16 / 375kHz = 42,7us     Note: must be > 20us
-               ADC_MODE_SAMPLE_HOLD_TIME(15  /* was 8 */);                                     // Sample & Hold Time SHTIM = 15 / ADC_CLK = 15 / 375kHz = 40us
-
+{      
        // Note: ADC_MODE_PRESCALE and ADC_MODE_SAMPLE_HOLD_TIME are set to the maximum allowed value. 
-       // Both AMPL_LO and AMPL_HI are very high impedance (10MOhm) outputs, the input capacitance of the ADC is 12pF (typical). This results in a time constant
-       // of RC = 10MOhm * 12pF = 120us. Even after the maximum configurable sample&hold time of 40us the input capacitor will not be fully charged. 
+       // AMPL_HI is are high impedance (10MOhm || 1MOhm) output, the input capacitance of the ADC is 12pF (typical). This results in a time constant
+       // of RC = (0.91MOhm) * 12pF = 10.9us. Even after the maximum configurable sample&hold time of 40us the input capacitor will not be fully charged. 
        // 
        // The maths are:
        // If there is a voltage v_in at the input, the voltage v_cap at the capacitor (this is what we are measuring) will be
        //
-       //       v_cap = v_in * (1 - exp(-RC/SHTIM))  =   v_in * (1 - exp(-3))  =  v_in * 0,95                   (i.e. an error of 5%)
-       // 
-       // Note: with the "historic" values in the comments above, the error was 34%  !!!
-       
-       AT91C_BASE_ADC->ADC_CHER = ADC_CHANNEL(ch);
+       //       v_cap = v_in * (1 - exp(-SHTIM/RC))  =   v_in * (1 - exp(-40us/10.9us))  =  v_in * 0,97                   (i.e. an error of 3%)
 
-       AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
+       AT91C_BASE_ADC->ADC_CR = AT91C_ADC_SWRST;
+       AT91C_BASE_ADC->ADC_MR =
+               ADC_MODE_PRESCALE(63) |                                                 // ADC_CLK = MCK / ((63+1) * 2) = 48MHz / 128 = 375kHz
+               ADC_MODE_STARTUP_TIME(1) |                                              // Startup Time = (1+1) * 8 / ADC_CLK = 16 / 375kHz = 42,7us     Note: must be > 20us
+               ADC_MODE_SAMPLE_HOLD_TIME(15);                                  // Sample & Hold Time SHTIM = 15 / ADC_CLK = 15 / 375kHz = 40us
 
-       while(!(AT91C_BASE_ADC->ADC_SR & ADC_END_OF_CONVERSION(ch)))
-               ;
-       d = AT91C_BASE_ADC->ADC_CDR[ch];
+       AT91C_BASE_ADC->ADC_CHER = ADC_CHANNEL(ch);
+       AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
 
-       return d;
+       while(!(AT91C_BASE_ADC->ADC_SR & ADC_END_OF_CONVERSION(ch))) {};
+       
+       return AT91C_BASE_ADC->ADC_CDR[ch];
 }
 
 int AvgAdc(int ch) // was static - merlok
@@ -193,6 +186,8 @@ void MeasureAntennaTuningLfOnly(int *vLf125, int *vLf134, int *peakf, int *peakv
 
        FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
        FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
+       SpinDelay(50);
+       
        for (i=255; i>=19; i--) {
                WDT_HIT();
                FpgaSendCommand(FPGA_CMD_SET_DIVISOR, i);
@@ -201,7 +196,7 @@ void MeasureAntennaTuningLfOnly(int *vLf125, int *vLf134, int *peakf, int *peakv
                if (i==95) *vLf125 = adcval; // voltage at 125Khz
                if (i==89) *vLf134 = adcval; // voltage at 134Khz
 
-               LF_Results[i] = adcval>>8; // scale int to fit in byte for graphing purposes
+               LF_Results[i] = adcval >> 9; // scale int to fit in byte for graphing purposes
                if(LF_Results[i] > peak) {
                        *peakv = adcval;
                        peak = LF_Results[i];
@@ -249,7 +244,7 @@ void MeasureAntennaTuning(int mode)
                }
        }
 
-       cmd_send(CMD_MEASURED_ANTENNA_TUNING, vLf125 | (vLf134<<16), vHf, peakf | (peakv<<16), LF_Results, 256);
+       cmd_send(CMD_MEASURED_ANTENNA_TUNING, vLf125>>1 | (vLf134>>1<<16), vHf, peakf | (peakv>>1<<16), LF_Results, 256);
        FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
        LED_B_OFF();
        return;
index 94ca52f542e242de6816f04e4970dd7fdda5e986..6703cc65c7286cd041e19fda40b29e02604e16a2 100644 (file)
@@ -2482,7 +2482,7 @@ void RAMFUNC SniffMifare(uint8_t param) {
        for(uint32_t sniffCounter = 0; true; ) {
        
                if(BUTTON_PRESS()) {
-                       DbpString("cancelled by button");
+                       DbpString("Canceled by button.");
                        break;
                }
 
@@ -2539,7 +2539,9 @@ void RAMFUNC SniffMifare(uint8_t param) {
                        if(!TagIsActive) {              // no need to try decoding tag data if the reader is sending
                                uint8_t readerdata = (previous_data & 0xF0) | (*data >> 4);
                                if(MillerDecoding(readerdata, (sniffCounter-1)*4)) {
-                                       LED_C_INV();
+                                       LED_B_ON();
+                                       LED_C_OFF();
+
                                        if (MfSniffLogic(receivedCmd, Uart.len, Uart.parity, Uart.bitCount, true)) break;
 
                                        /* And ready to receive another command. */
@@ -2554,7 +2556,8 @@ void RAMFUNC SniffMifare(uint8_t param) {
                        if(!ReaderIsActive) {           // no need to try decoding tag data if the reader is sending
                                uint8_t tagdata = (previous_data << 4) | (*data & 0x0F);
                                if(ManchesterDecoding(tagdata, 0, (sniffCounter-1)*4)) {
-                                       LED_C_INV();
+                                       LED_B_OFF();
+                                       LED_C_ON();
 
                                        if (MfSniffLogic(receivedResponse, Demod.len, Demod.parity, Demod.bitCount, false)) break;
 
@@ -2576,7 +2579,7 @@ void RAMFUNC SniffMifare(uint8_t param) {
 
        } // main cycle
 
-       DbpString("COMMAND FINISHED");
+       DbpString("COMMAND FINISHED.");
 
        FpgaDisableSscDma();
        MfSniffEnd();
index fcfd7e8fddb80f9c1bac092def66cd5fbb1d23c0..3854b5899611e1f573352467dfeac34c6e278cd1 100644 (file)
@@ -20,6 +20,9 @@
 #include "parity.h"\r
 #include "crc.h"\r
 \r
+#define HARDNESTED_AUTHENTICATION_TIMEOUT 848                  // card times out 1ms after wrong authentication (according to NXP documentation)\r
+#define HARDNESTED_PRE_AUTHENTICATION_LEADTIME 400             // some (non standard) cards need a pause after select before they are ready for first authentication \r
+\r
 // the block number for the ISO14443-4 PCB\r
 static uint8_t pcb_blocknum = 0;\r
 // Deselect card by sending a s-block. the crc is precalced for speed\r
@@ -677,7 +680,7 @@ void MifareAcquireEncryptedNonces(uint32_t arg0, uint32_t arg1, uint32_t flags,
                }\r
 \r
                if (slow) {\r
-                       timeout = GetCountSspClk() + PRE_AUTHENTICATION_LEADTIME;\r
+                       timeout = GetCountSspClk() + HARDNESTED_PRE_AUTHENTICATION_LEADTIME;\r
                        while(GetCountSspClk() < timeout);\r
                }\r
 \r
@@ -694,10 +697,12 @@ void MifareAcquireEncryptedNonces(uint32_t arg0, uint32_t arg1, uint32_t flags,
                        continue;\r
                }\r
 \r
-               // send a dummy response in order to trigger the cards authentication failure timeout\r
-               uint8_t dummy_answer[8] = {0};\r
-               ReaderTransmit(dummy_answer, 8, NULL);\r
+               // send an incomplete dummy response in order to trigger the card's authentication failure timeout\r
+               uint8_t dummy_answer[1] = {0};\r
+               ReaderTransmit(dummy_answer, 1, NULL);\r
 \r
+               timeout = GetCountSspClk() + HARDNESTED_AUTHENTICATION_TIMEOUT;\r
+               \r
                num_nonces++;\r
                if (num_nonces % 2) {\r
                        memcpy(buf+i, receivedAnswer, 4);\r
@@ -709,6 +714,9 @@ void MifareAcquireEncryptedNonces(uint32_t arg0, uint32_t arg1, uint32_t flags,
                        i += 9;\r
                }\r
 \r
+               // wait for the card to become ready again\r
+               while(GetCountSspClk() < timeout);\r
+\r
        }\r
 \r
        LED_C_OFF();\r
index 7f94b0fe7c01ecdbce7a036a1fb94e00cfb1cbb2..4e573be7dc9c630b6f6ec7c3b7ef21c351eafc3e 100644 (file)
-//-----------------------------------------------------------------------------\r
-// Merlok - 2012\r
-//\r
-// This code is licensed to you under the terms of the GNU GPL, version 2 or,\r
-// at your option, any later version. See the LICENSE.txt file for the text of\r
-// the license.\r
-//-----------------------------------------------------------------------------\r
-// Routines to support mifare classic sniffer.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "mifaresniff.h"\r
-#include "apps.h"\r
-#include "proxmark3.h"\r
-#include "util.h"\r
-#include "string.h"\r
-#include "iso14443crc.h"\r
-#include "iso14443a.h"\r
-#include "crapto1/crapto1.h"\r
-#include "mifareutil.h"\r
-#include "common.h"\r
-\r
-\r
-static int sniffState = SNF_INIT;\r
-static uint8_t sniffUIDType;\r
-static uint8_t sniffUID[8] = {0x00};\r
-static uint8_t sniffATQA[2] = {0x00};\r
-static uint8_t sniffSAK;\r
-static uint8_t sniffBuf[16] = {0x00};\r
-static uint32_t timerData = 0;\r
-\r
-\r
-bool MfSniffInit(void){\r
-       memset(sniffUID, 0x00, 8);\r
-       memset(sniffATQA, 0x00, 2);\r
-       sniffSAK = 0;\r
-       sniffUIDType = SNF_UID_4;\r
-\r
-       return FALSE;\r
-}\r
-\r
-bool MfSniffEnd(void){\r
-       LED_B_ON();\r
-       cmd_send(CMD_ACK,0,0,0,0,0);\r
-       LED_B_OFF();\r
-\r
-       return FALSE;\r
-}\r
-\r
-bool RAMFUNC MfSniffLogic(const uint8_t *data, uint16_t len, uint8_t *parity, uint16_t bitCnt, bool reader) {\r
-\r
-       if (reader && (len == 1) && (bitCnt == 7)) {            // reset on 7-Bit commands from reader\r
-               sniffState = SNF_INIT;\r
-       }\r
-\r
-       switch (sniffState) {\r
-               case SNF_INIT:{\r
-                       if ((len == 1) && (reader) && (bitCnt == 7) ) {  // REQA or WUPA from reader\r
-                               sniffUIDType = SNF_UID_4;\r
-                               memset(sniffUID, 0x00, 8);\r
-                               memset(sniffATQA, 0x00, 2);\r
-                               sniffSAK = 0;\r
-                               sniffState = SNF_WUPREQ;\r
-                       }\r
-                       break;\r
-               }\r
-               case SNF_WUPREQ:{\r
-                       if ((!reader) && (len == 2)) {          // ATQA from tag\r
-                               memcpy(sniffATQA, data, 2);\r
-                               sniffState = SNF_ATQA;\r
-                       }\r
-                       break;\r
-               }\r
-               case SNF_ATQA:{\r
-                       if ((reader) && (len == 2) && (data[0] == 0x93) && (data[1] == 0x20)) { // Select ALL from reader\r
-                               sniffState = SNF_ANTICOL1;\r
-                       }\r
-                       break;\r
-               }\r
-               case SNF_ANTICOL1:{\r
-                       if ((!reader) && (len == 5) && ((data[0] ^ data[1] ^ data[2] ^ data[3]) == data[4])) {  // UID from tag (CL1) \r
-                               memcpy(sniffUID + 3, data, 4);\r
-                               sniffState = SNF_UID1;\r
-                       }\r
-                       break;\r
-               }\r
+//-----------------------------------------------------------------------------
+// Merlok - 2012
+//
+// This code is licensed to you under the terms of the GNU GPL, version 2 or,
+// at your option, any later version. See the LICENSE.txt file for the text of
+// the license.
+//-----------------------------------------------------------------------------
+// Routines to support mifare classic sniffer.
+//-----------------------------------------------------------------------------
+
+#include "mifaresniff.h"
+#include "apps.h"
+#include "proxmark3.h"
+#include "util.h"
+#include "string.h"
+#include "iso14443crc.h"
+#include "iso14443a.h"
+#include "crapto1/crapto1.h"
+#include "mifareutil.h"
+#include "common.h"
+
+
+static int sniffState = SNF_INIT;
+static uint8_t sniffUIDType;
+static uint8_t sniffUID[8] = {0x00};
+static uint8_t sniffATQA[2] = {0x00};
+static uint8_t sniffSAK;
+static uint8_t sniffBuf[16] = {0x00};
+static uint32_t timerData = 0;
+
+
+bool MfSniffInit(void){
+       memset(sniffUID, 0x00, 8);
+       memset(sniffATQA, 0x00, 2);
+       sniffSAK = 0;
+       sniffUIDType = SNF_UID_4;
+
+       return FALSE;
+}
+
+bool MfSniffEnd(void){
+       LED_B_ON();
+       cmd_send(CMD_ACK,0,0,0,0,0);
+       LED_B_OFF();
+
+       return FALSE;
+}
+
+bool RAMFUNC MfSniffLogic(const uint8_t *data, uint16_t len, uint8_t *parity, uint16_t bitCnt, bool reader) {
+
+       if (reader && (len == 1) && (bitCnt == 7)) {            // reset on 7-Bit commands from reader
+               sniffState = SNF_INIT;
+       }
+
+       switch (sniffState) {
+               case SNF_INIT:{
+                       if ((len == 1) && (reader) && (bitCnt == 7) ) {  // REQA or WUPA from reader
+                               sniffUIDType = SNF_UID_4;
+                               memset(sniffUID, 0x00, 8);
+                               memset(sniffATQA, 0x00, 2);
+                               sniffSAK = 0;
+                               sniffState = SNF_ATQA;
+                               if (data[0] == 0x40) 
+                                       sniffState = SNF_MAGIC_WUPC2;
+                       }
+                       break;
+               }
+               case SNF_MAGIC_WUPC2:
+                       if ((len == 1) && (reader) && (data[0] == 0x43) ) {  
+                               sniffState = SNF_CARD_IDLE;
+                       }
+                       break;
+               case SNF_ATQA:{
+                       if ((!reader) && (len == 2)) {          // ATQA from tag
+                               memcpy(sniffATQA, data, 2);
+                               sniffState = SNF_UID1;
+                       }
+                       break;
+               }
                case SNF_UID1:{\r
                        if ((reader) && (len == 9) && (data[0] == 0x93) && (data[1] == 0x70) && (CheckCrc14443(CRC_14443_A, data, 9))) {   // Select 4 Byte UID from reader\r
+                               memcpy(sniffUID + 3, &data[2], 4);\r
                                sniffState = SNF_SAK;\r
                        }\r
-                       break;\r
-               }\r
-               case SNF_SAK:{\r
-                       if ((!reader) && (len == 3) && (CheckCrc14443(CRC_14443_A, data, 3))) { // SAK from card?\r
-                               sniffSAK = data[0];\r
-                               if (sniffUID[3] == 0x88) {                      // CL2 UID part to be expected\r
-                                       sniffState = SNF_ANTICOL2;\r
-                               } else {                                                        // select completed\r
-                                       sniffState = SNF_CARD_IDLE;\r
-                               }\r
-                       }\r
-                       break;\r
-               }\r
-               case SNF_ANTICOL2:{\r
-                       if ((!reader) && (len == 5) && ((data[0] ^ data[1] ^ data[2] ^ data[3]) == data[4])) { // CL2 UID \r
-                               memcpy(sniffUID, sniffUID+4, 3);\r
-                               memcpy(sniffUID+3, data, 4);\r
-                               sniffUIDType = SNF_UID_7;\r
-                               sniffState = SNF_UID2;\r
-                       }\r
-                       break;\r
+                       break;
                }\r
+               case SNF_SAK:{
+                       if ((!reader) && (len == 3) && (CheckCrc14443(CRC_14443_A, data, 3))) { // SAK from card?
+                               sniffSAK = data[0];
+                               if ((sniffUID[3] == 0x88) && (sniffUIDType == SNF_UID_4)) {                     // CL2 UID part to be expected
+                                       sniffUIDType = SNF_UID_7;\r
+                                       memcpy(sniffUID, sniffUID + 4, 3);\r
+                                       sniffState = SNF_UID2;
+                               } else {                                                                                                                        // select completed
+                                       sniffState = SNF_CARD_IDLE;
+                               }
+                       }
+                       break;
+               }
                case SNF_UID2:{\r
-                       if ((reader) && (len == 9) && (data[0] == 0x95) && (data[1] == 0x70) && (CheckCrc14443(CRC_14443_A, data, 9))) {        // Select 2nd part of 7 Byte UID\r
+                       if ((reader) && (len == 9) && (data[0] == 0x95) && (data[1] == 0x70) && (CheckCrc14443(CRC_14443_A, data, 9))) {\r
+                               memcpy(sniffUID + 3, &data[2], 4);\r
                                sniffState = SNF_SAK;\r
                        }\r
                        break;\r
                }\r
-               case SNF_CARD_IDLE:{    // trace the card select sequence\r
-                       sniffBuf[0] = 0xFF;\r
-                       sniffBuf[1] = 0xFF;\r
-                       memcpy(sniffBuf + 2, sniffUID, 7);\r
-                       memcpy(sniffBuf + 9, sniffATQA, 2);\r
-                       sniffBuf[11] = sniffSAK;\r
-                       sniffBuf[12] = 0xFF;\r
-                       sniffBuf[13] = 0xFF;\r
-                       LogTrace(sniffBuf, 14, 0, 0, NULL, TRUE);\r
-               }       // intentionally no break;\r
-               case SNF_CARD_CMD:{             \r
-                       LogTrace(data, len, 0, 0, NULL, TRUE);\r
-                       sniffState = SNF_CARD_RESP;\r
-                       timerData = GetTickCount();\r
-                       break;\r
-               }\r
-               case SNF_CARD_RESP:{\r
-                       LogTrace(data, len, 0, 0, NULL, FALSE);\r
-                       sniffState = SNF_CARD_CMD;\r
-                       timerData = GetTickCount();\r
-                       break;\r
-               }\r
-       \r
-               default:\r
-                       sniffState = SNF_INIT;\r
-               break;\r
-       }\r
-\r
-\r
-       return FALSE;\r
-}\r
-\r
-bool RAMFUNC MfSniffSend(uint16_t maxTimeoutMs) {\r
-       if (BigBuf_get_traceLen() && (GetTickCount() > timerData + maxTimeoutMs)) {\r
-               return intMfSniffSend();\r
-       }\r
-       return FALSE;\r
-}\r
-\r
-// internal sending function. not a RAMFUNC.\r
-bool intMfSniffSend() {\r
-\r
-       int pckSize = 0;\r
-       int pckLen = BigBuf_get_traceLen();\r
-       int pckNum = 0;\r
-       uint8_t *trace = BigBuf_get_addr();\r
-       \r
-       FpgaDisableSscDma();\r
-       while (pckLen > 0) {\r
-               pckSize = MIN(USB_CMD_DATA_SIZE, pckLen);\r
-               LED_B_ON();\r
-               cmd_send(CMD_ACK, 1, BigBuf_get_traceLen(), pckSize, trace + BigBuf_get_traceLen() - pckLen, pckSize);\r
-               LED_B_OFF();\r
-\r
-               pckLen -= pckSize;\r
-               pckNum++;\r
-       }\r
-\r
-       LED_B_ON();\r
-       cmd_send(CMD_ACK,2,0,0,0,0);\r
-       LED_B_OFF();\r
-\r
-       clear_trace();\r
-       \r
-       return TRUE;\r
-}\r
+               case SNF_CARD_IDLE:{    // trace the card select sequence
+                       sniffBuf[0] = 0xFF;
+                       sniffBuf[1] = 0xFF;
+                       memcpy(sniffBuf + 2, sniffUID, 7);
+                       memcpy(sniffBuf + 9, sniffATQA, 2);
+                       sniffBuf[11] = sniffSAK;
+                       sniffBuf[12] = 0xFF;
+                       sniffBuf[13] = 0xFF;
+                       LogTrace(sniffBuf, 14, 0, 0, NULL, TRUE);
+                       sniffState = SNF_CARD_CMD;
+               }       // intentionally no break;
+               case SNF_CARD_CMD:{     
+                       LogTrace(data, len, 0, 0, NULL, reader);
+                       timerData = GetTickCount();
+                       break;
+               }
+       
+               default:
+                       sniffState = SNF_INIT;
+               break;
+       }
+
+
+       return FALSE;
+}
+
+bool RAMFUNC MfSniffSend(uint16_t maxTimeoutMs) {
+       if (BigBuf_get_traceLen() && (GetTickCount() > timerData + maxTimeoutMs)) {
+               return intMfSniffSend();
+       }
+       return FALSE;
+}
+
+// internal sending function. not a RAMFUNC.
+bool intMfSniffSend() {
+
+       int pckSize = 0;
+       int pckLen = BigBuf_get_traceLen();
+       int pckNum = 0;
+       uint8_t *trace = BigBuf_get_addr();
+       
+       FpgaDisableSscDma();
+       while (pckLen > 0) {
+               pckSize = MIN(USB_CMD_DATA_SIZE, pckLen);
+               LED_B_ON();
+               cmd_send(CMD_ACK, 1, BigBuf_get_traceLen(), pckSize, trace + BigBuf_get_traceLen() - pckLen, pckSize);
+               LED_B_OFF();
+
+               pckLen -= pckSize;
+               pckNum++;
+       }
+
+       LED_B_ON();
+       cmd_send(CMD_ACK,2,0,0,0,0);
+       LED_B_OFF();
+
+       clear_trace();
+       
+       return TRUE;
+}
index 8a8e31a9e70503ab775e567b5877f93301ea9feb..b181f982c6f58b43a10877e061a46b40ddb3f725 100644 (file)
@@ -27,6 +27,7 @@
 #define SNF_CARD_IDLE                  9\r
 #define SNF_CARD_CMD                   10\r
 #define SNF_CARD_RESP                  11\r
+#define SNF_MAGIC_WUPC2                        12\r
 \r
 #define SNF_UID_4                              0\r
 #define SNF_UID_7                              0\r
index c34dc8f4d8983dfb89fb0e4ddd96fe43ce69491c..b2912895888fc47f948d9f5d68155cc946034564 100644 (file)
@@ -24,8 +24,6 @@
 #define CRYPT_REQUEST 2\r
 #define AUTH_FIRST    0        \r
 #define AUTH_NESTED   2\r
-#define AUTHENTICATION_TIMEOUT 848                     // card times out 1ms after wrong authentication (according to NXP documentation)\r
-#define PRE_AUTHENTICATION_LEADTIME 400                // some (non standard) cards need a pause after select before they are ready for first authentication\r
 \r
 // mifare 4bit card answers\r
 #define CARD_ACK      0x0A  // 1010 - ACK\r
index 1f548284826fb65b8fd430742ce09b5405a3305b..9bfe58f9652fe3ca41a2ceed16e3645aeb95d58a 100644 (file)
@@ -1281,26 +1281,36 @@ int CmdTuneSamples(const char *Cmd)
        peakf = resp.arg[2] & 0xffff;
        peakv = resp.arg[2] >> 16;
        PrintAndLog("");
-       PrintAndLog("# LF antenna: %5.2f V @   125.00 kHz", vLf125/1000.0);
-       PrintAndLog("# LF antenna: %5.2f V @   134.00 kHz", vLf134/1000.0);
-       PrintAndLog("# LF optimal: %5.2f V @%9.2f kHz", peakv/1000.0, 12000.0/(peakf+1));
-       PrintAndLog("# HF antenna: %5.2f V @    13.56 MHz", vHf/1000.0);
-
- #define LF_UNUSABLE_V         2948            // was 2000. Changed due to bugfix in voltage measurements. LF results are now 47% higher.
- #define LF_MARGINAL_V         14739           // was 10000. Changed due to bugfix bug in voltage measurements. LF results are now 47% higher.
- #define HF_UNUSABLE_V         3167            // was 2000. Changed due to bugfix in voltage measurements. HF results are now 58% higher.
- #define HF_MARGINAL_V         7917            // was 5000. Changed due to bugfix in voltage measurements. HF results are now 58% higher.
-
-       if (peakv < LF_UNUSABLE_V)
-               PrintAndLog("# Your LF antenna is unusable.");
-       else if (peakv < LF_MARGINAL_V)
-               PrintAndLog("# Your LF antenna is marginal.");
-       if (vHf < HF_UNUSABLE_V)
-               PrintAndLog("# Your HF antenna is unusable.");
-       else if (vHf < HF_MARGINAL_V)
-               PrintAndLog("# Your HF antenna is marginal.");
-
-       if (peakv >= LF_UNUSABLE_V)     {
+       if (arg & FLAG_TUNE_LF)
+       {
+               PrintAndLog("# LF antenna: %5.2f V @   125.00 kHz", vLf125/500.0);
+               PrintAndLog("# LF antenna: %5.2f V @   134.00 kHz", vLf134/500.0);
+               PrintAndLog("# LF optimal: %5.2f V @%9.2f kHz", peakv/500.0, 12000.0/(peakf+1));
+       }
+       if (arg & FLAG_TUNE_HF)
+               PrintAndLog("# HF antenna: %5.2f V @    13.56 MHz", vHf/1000.0);
+
+ #define LF_UNUSABLE_V         3000
+ #define LF_MARGINAL_V         15000
+ #define HF_UNUSABLE_V         3200
+ #define HF_MARGINAL_V         8000
+
+       if (arg & FLAG_TUNE_LF)
+       {
+               if (peakv<<1 < LF_UNUSABLE_V)
+                       PrintAndLog("# Your LF antenna is unusable.");
+               else if (peakv<<1 < LF_MARGINAL_V)
+                       PrintAndLog("# Your LF antenna is marginal.");
+       }
+       if (arg & FLAG_TUNE_HF)
+       {
+               if (vHf < HF_UNUSABLE_V)
+                       PrintAndLog("# Your HF antenna is unusable.");
+               else if (vHf < HF_MARGINAL_V)
+                       PrintAndLog("# Your HF antenna is marginal.");
+       }
+
+       if (peakv<<1 >= LF_UNUSABLE_V)  {
                for (int i = 0; i < 256; i++) {
                        GraphBuffer[i] = resp.d.asBytes[i] - 128;
                }
index e4b245c36e0a8e0c1802063268ca8481fd44bb77..480923d663a91f3de77531b67f2b5ddac4fcb2b9 100644 (file)
 static int CmdHelp(const char *Cmd);
 static int waitCmd(uint8_t iLen);
 
+// structure and database for uid -> tagtype lookups 
+typedef struct { 
+       uint8_t uid;
+       char* desc;
+} manufactureName; 
 
-const manufactureName manufactureMapping[] = {
+static const manufactureName manufactureMapping[] = {
        // ID,  "Vendor Country"
        { 0x01, "Motorola UK" },
        { 0x02, "ST Microelectronics SA France" },
@@ -154,7 +159,7 @@ int CmdHF14AReader(const char *Cmd) {
                        break;
                case 'x':
                case 'X':
-                       cm = cm - ISO14A_CONNECT;
+                       cm &= ~ISO14A_CONNECT;
                        break;
                default:
                        PrintAndLog("Unknown command.");
@@ -192,7 +197,7 @@ int CmdHF14AReader(const char *Cmd) {
 
                PrintAndLog(" UID : %s", sprint_hex(card.uid, card.uidlen));
                PrintAndLog("ATQA : %02x %02x", card.atqa[1], card.atqa[0]);
-               PrintAndLog(" SAK : %02x [%d]", card.sak, resp.arg[0]);
+               PrintAndLog(" SAK : %02x [%" PRIu64 "]", card.sak, resp.arg[0]);
                if(card.ats_len >= 3) {                 // a valid ATS consists of at least the length byte (TL) and 2 CRC bytes
                        PrintAndLog(" ATS : %s", sprint_hex(card.ats, card.ats_len));
                }
@@ -244,7 +249,7 @@ int CmdHF14AInfo(const char *Cmd)
 
        PrintAndLog(" UID : %s", sprint_hex(card.uid, card.uidlen));
        PrintAndLog("ATQA : %02x %02x", card.atqa[1], card.atqa[0]);
-       PrintAndLog(" SAK : %02x [%d]", card.sak, resp.arg[0]);
+       PrintAndLog(" SAK : %02x [%" PRIu64 "]", card.sak, resp.arg[0]);
 
        bool isMifareClassic = true;
        switch (card.sak) {
index 401cead04469666897d3167be62d8ae8049b65fd..71007f954f7475e6a7d1f679db62bb04ab2135c0 100644 (file)
 #include <stdint.h>
 #include <stdbool.h>
 
-// structure and database for uid -> tagtype lookups 
-typedef struct { 
-       uint8_t uid;
-       char* desc;
-} manufactureName; 
-
 int CmdHF14A(const char *Cmd);
 int CmdHF14AList(const char *Cmd);
 int CmdHF14AMifare(const char *Cmd);
index 5ebf814498a1f18ff272051986fcad131969fe63..b653cf300a1a7199b0d7e869cda93a187188c895 100644 (file)
@@ -25,6 +25,7 @@
 #include "mifarehost.h"\r
 #include "mifare.h"\r
 #include "mfkey.h"\r
+#include "hardnested/hardnested_bf_core.h"\r
 \r
 #define NESTED_SECTOR_RETRY     10                     // how often we try mfested() until we give up\r
 \r
@@ -862,6 +863,13 @@ int CmdHF14AMfNestedHard(const char *Cmd)
                PrintAndLog("      w: Acquire nonces and write them to binary file nonces.bin");\r
                PrintAndLog("      s: Slower acquisition (required by some non standard cards)");\r
                PrintAndLog("      r: Read nonces.bin and start attack");\r
+               PrintAndLog("      iX: set type of SIMD instructions. Without this flag programs autodetect it.");\r
+               PrintAndLog("        i5: AVX512");\r
+               PrintAndLog("        i2: AVX2");\r
+               PrintAndLog("        ia: AVX");\r
+               PrintAndLog("        is: SSE2");\r
+               PrintAndLog("        im: MMX");\r
+               PrintAndLog("        in: none (use CPU regular instruction set)");\r
                PrintAndLog(" ");\r
                PrintAndLog("      sample1: hf mf hardnested 0 A FFFFFFFFFFFF 4 A");\r
                PrintAndLog("      sample2: hf mf hardnested 0 A FFFFFFFFFFFF 4 A w");\r
@@ -880,15 +888,20 @@ int CmdHF14AMfNestedHard(const char *Cmd)
        int tests = 0;\r
 \r
 \r
+       uint16_t iindx = 0;\r
        if (ctmp == 'R' || ctmp == 'r') {\r
                nonce_file_read = true;\r
+               iindx = 1;\r
                if (!param_gethex(Cmd, 1, trgkey, 12)) {\r
                        know_target_key = true;\r
+                       iindx = 2;\r
                }\r
        } else if (ctmp == 'T' || ctmp == 't') {\r
                tests = param_get32ex(Cmd, 1, 100, 10);\r
+               iindx = 2;\r
                if (!param_gethex(Cmd, 2, trgkey, 12)) {\r
                        know_target_key = true;\r
+                       iindx = 3;\r
                }\r
        } else {\r
                blockNo = param_get8(Cmd, 0);\r
@@ -922,19 +935,54 @@ int CmdHF14AMfNestedHard(const char *Cmd)
                        know_target_key = true;\r
                        i++;\r
                }\r
+               iindx = i;\r
 \r
                while ((ctmp = param_getchar(Cmd, i))) {\r
                        if (ctmp == 's' || ctmp == 'S') {\r
                                slow = true;\r
                        } else if (ctmp == 'w' || ctmp == 'W') {\r
                                nonce_file_write = true;\r
+                       } else if (param_getlength(Cmd, i) == 2 && ctmp == 'i') {\r
+                               iindx = i;\r
                        } else {\r
-                               PrintAndLog("Possible options are w and/or s");\r
+                               PrintAndLog("Possible options are w , s and/or iX");\r
                                return 1;\r
                        }\r
                        i++;\r
                }\r
        }\r
+       \r
+       SetSIMDInstr(SIMD_AUTO);\r
+       if (iindx > 0) {\r
+               while ((ctmp = param_getchar(Cmd, iindx))) {\r
+                       if (param_getlength(Cmd, iindx) == 2 && ctmp == 'i') {\r
+                               switch(param_getchar_indx(Cmd, 1, iindx)) {\r
+                                       case '5':\r
+                                               SetSIMDInstr(SIMD_AVX512);\r
+                                               break;\r
+                                       case '2':\r
+                                               SetSIMDInstr(SIMD_AVX2);\r
+                                               break;\r
+                                       case 'a':\r
+                                               SetSIMDInstr(SIMD_AVX);\r
+                                               break;\r
+                                       case 's':\r
+                                               SetSIMDInstr(SIMD_SSE2);\r
+                                               break;\r
+                                       case 'm':\r
+                                               SetSIMDInstr(SIMD_MMX);\r
+                                               break;\r
+                                       case 'n':\r
+                                               SetSIMDInstr(SIMD_NONE);\r
+                                               break;\r
+                                       default:\r
+                                               PrintAndLog("Unknown SIMD type. %c", param_getchar_indx(Cmd, 1, iindx));\r
+                                               return 1;\r
+                               }\r
+                       }\r
+                       iindx++;\r
+               }       \r
+       }\r
 \r
        PrintAndLog("--target block no:%3d, target key type:%c, known target key: 0x%02x%02x%02x%02x%02x%02x%s, file action: %s, Slow: %s, Tests: %d ",\r
                        trgBlockNo,\r
@@ -987,6 +1035,7 @@ int CmdHF14AMfChk(const char *Cmd)
        int i, res;\r
        int     keycnt = 0;\r
        char ctmp       = 0x00;\r
+       int clen = 0;\r
        char ctmp3[3]   = {0x00};\r
        uint8_t blockNo = 0;\r
        uint8_t SectorsCnt = 0;\r
@@ -1015,32 +1064,36 @@ int CmdHF14AMfChk(const char *Cmd)
                blockNo = param_get8(Cmd, 0);\r
 \r
        ctmp = param_getchar(Cmd, 1);\r
-       switch (ctmp) {\r
-       case 'a': case 'A':\r
-               keyType = 0;\r
-               break;\r
-       case 'b': case 'B':\r
-               keyType = 1;\r
-               break;\r
-       case '?':\r
-               keyType = 2;\r
-               break;\r
-       default:\r
-               PrintAndLog("Key type must be A , B or ?");\r
-               free(keyBlock);\r
-               return 1;\r
-       };\r
+       clen = param_getlength(Cmd, 1);\r
+       if (clen == 1) {\r
+               switch (ctmp) {\r
+               case 'a': case 'A':\r
+                       keyType = 0;\r
+                       break;\r
+               case 'b': case 'B':\r
+                       keyType = 1;\r
+                       break;\r
+               case '?':\r
+                       keyType = 2;\r
+                       break;\r
+               default:\r
+                       PrintAndLog("Key type must be A , B or ?");\r
+                       free(keyBlock);\r
+                       return 1;\r
+               };\r
+       }\r
 \r
        // transfer to emulator & create dump file\r
        ctmp = param_getchar(Cmd, 2);\r
-       if (ctmp == 't' || ctmp == 'T') transferToEml = 1;\r
-       if (ctmp == 'd' || ctmp == 'D') createDumpFile = 1;\r
+       clen = param_getlength(Cmd, 2);\r
+       if (clen == 1 && (ctmp == 't' || ctmp == 'T')) transferToEml = 1;\r
+       if (clen == 1 && (ctmp == 'd' || ctmp == 'D')) createDumpFile = 1;\r
        \r
        param3InUse = transferToEml | createDumpFile;\r
        \r
        timeout14a = 500; // fast by default\r
        // double parameters - ts, ds\r
-       int clen = param_getlength(Cmd, 2);\r
+       clen = param_getlength(Cmd, 2);\r
        if (clen == 2 || clen == 3){\r
                param_getstr(Cmd, 2, ctmp3, sizeof(ctmp3));\r
                ctmp = ctmp3[1];\r
@@ -2474,14 +2527,13 @@ int CmdHF14AMfSniff(const char *Cmd){
                }\r
 \r
                UsbCommand resp;\r
-               if (WaitForResponseTimeout(CMD_ACK,&resp,2000)) {\r
+               if (WaitForResponseTimeoutW(CMD_ACK, &resp, 2000, false)) {\r
                        res = resp.arg[0] & 0xff;\r
                        uint16_t traceLen = resp.arg[1];\r
                        len = resp.arg[2];\r
 \r
                        if (res == 0) {                                                         // we are done\r
-                               free(buf);\r
-                               return 0;\r
+                               break;\r
                        }\r
 \r
                        if (res == 1) {                                                         // there is (more) data to be transferred\r
@@ -2557,6 +2609,9 @@ int CmdHF14AMfSniff(const char *Cmd){
        } // while (true)\r
 \r
        free(buf);\r
+       \r
+       msleep(300); // wait for exiting arm side.\r
+       PrintAndLog("Done.");\r
        return 0;\r
 }\r
 \r
index 0153541e187e8ea46119231ebf9b3e1ba9157763..69ad898db4ead30997ce98ede7837db0b886d2cb 100644 (file)
@@ -32,6 +32,7 @@
 #include "crapto1/crapto1.h"
 #include "parity.h"
 #include "hardnested/hardnested_bruteforce.h"
+#include "hardnested/hardnested_bf_core.h"
 #include "hardnested/hardnested_bitarray_core.h"
 #include "zlib.h"
 
@@ -71,27 +72,32 @@ static float brute_force_per_second;
 
 
 static void get_SIMD_instruction_set(char* instruction_set) {
-#if defined (__i386__) || defined (__x86_64__) 
-       #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1))
-               #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2)
-       if (__builtin_cpu_supports("avx512f")) strcpy(instruction_set, "AVX512F");
-       else if (__builtin_cpu_supports("avx2")) strcpy(instruction_set, "AVX2");
-               #else 
-       if (__builtin_cpu_supports("avx2")) strcpy(instruction_set, "AVX2");
-               #endif
-       else if (__builtin_cpu_supports("avx")) strcpy(instruction_set, "AVX");
-       else if (__builtin_cpu_supports("sse2")) strcpy(instruction_set, "SSE2");
-       else if (__builtin_cpu_supports("mmx")) strcpy(instruction_set, "MMX");
-       else 
-       #endif
-#endif
-               strcpy(instruction_set, "no");
+       switch(GetSIMDInstrAuto()) {
+               case SIMD_AVX512:
+                       strcpy(instruction_set, "AVX512F");
+                       break;
+               case SIMD_AVX2:
+                       strcpy(instruction_set, "AVX2");
+                       break;
+               case SIMD_AVX:
+                       strcpy(instruction_set, "AVX");
+                       break;
+               case SIMD_SSE2:
+                       strcpy(instruction_set, "SSE2");
+                       break;
+               case SIMD_MMX:
+                       strcpy(instruction_set, "MMX");
+                       break;
+               default:
+                       strcpy(instruction_set, "no");
+                       break;
+       }       
 }
 
 
 static void print_progress_header(void) {
        char progress_text[80];
-       char instr_set[12] = "";
+       char instr_set[12] = {0};
        get_SIMD_instruction_set(instr_set);
        sprintf(progress_text, "Start using %d threads and %s SIMD core", num_CPUs(), instr_set);
        PrintAndLog("\n\n");
@@ -144,12 +150,6 @@ static inline void set_bit24(uint32_t *bitarray, uint32_t index)
 }
 
 
-static inline void clear_bit24(uint32_t *bitarray, uint32_t index)
-{
-       bitarray[index>>5] &= ~(0x80000000>>(index&0x0000001f));
-}
-
-
 static inline uint32_t test_bit24(uint32_t *bitarray, uint32_t index)
 {
        return  bitarray[index>>5] & (0x80000000>>(index&0x0000001f));
@@ -190,40 +190,6 @@ static inline uint32_t next_state(uint32_t *bitarray, uint32_t state)
 }
 
 
-static inline uint32_t next_not_state(uint32_t *bitarray, uint32_t state)
-{
-       if (++state == 1<<24) return 1<<24;
-       uint32_t index = state >> 5;
-       uint_fast8_t bit = state & 0x1f;
-       uint32_t line = bitarray[index] << bit;
-       while (bit <= 0x1f) {
-               if ((line & 0x80000000) == 0) return state;
-               state++;
-               bit++;
-               line <<= 1;
-       }
-       index++;
-       while (bitarray[index] == 0xffffffff && state < 1<<24) {
-               index++;
-               state += 0x20;
-       }
-       if (state >= 1<<24) return 1<<24;
-#if defined __GNUC__
-       return state + __builtin_clz(~bitarray[index]);
-#else
-       bit = 0x00;
-       line = bitarray[index];
-       while (bit <= 0x1f) {
-               if ((line & 0x80000000) == 0) return state;
-               state++;
-               bit++;
-               line <<= 1;
-       }
-       return 1<<24;
-#endif
-}
-
-
 
 
 #define BITFLIP_2ND_BYTE                               0x0200
@@ -2528,6 +2494,10 @@ static void set_test_state(uint8_t byte)
 int mfnestedhard(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBlockNo, uint8_t trgKeyType, uint8_t *trgkey, bool nonce_file_read, bool nonce_file_write, bool slow, int tests) 
 {
        char progress_text[80];
+       
+       char instr_set[12] = {0};
+       get_SIMD_instruction_set(instr_set);
+       PrintAndLog("Using %s SIMD core.", instr_set);
 
        srand((unsigned) time(NULL));
        brute_force_per_second = brute_force_benchmark();
index ec7a64a199ef1a35b1a89df959846c0210c9e969..a631c6142219ca3e9ad2f0d55bb41fbce621c053 100644 (file)
@@ -132,7 +132,7 @@ const APDUCode APDUCodeTable[] = {
        {"6EXX",        APDUCODE_TYPE_ERROR,            "Instruction class not supported (procedure byte), (ISO 7816-3)"},
        {"6F--",        APDUCODE_TYPE_ERROR,            "Internal exception"},
        {"6F00",        APDUCODE_TYPE_ERROR,            "Command aborted - more exact diagnosis not possible (e.g., operating system error)."},
-       {"6FFF",        APDUCODE_TYPE_ERROR,            "Card dead (overuse, \85)"},
+       {"6FFF",        APDUCODE_TYPE_ERROR,            "Card dead (overuse, ...)"},
        {"6FXX",        APDUCODE_TYPE_ERROR,            "No precise diagnosis (procedure byte), (ISO 7816-3)"},
        {"9---",        APDUCODE_TYPE_NONE,             ""},
        {"9000",        APDUCODE_TYPE_INFO,                     "Command successfully executed (OK)."},
index 760395c4fc9db545b7b81e88b0480102bcff21b6..3d11afe5e2b73c7fea79ff1fba6990e7dfbf5b5f 100644 (file)
@@ -215,7 +215,7 @@ static unsigned char *crypto_pk_polarssl_encrypt(const struct crypto_pk *_cp, co
 
        res = rsa_public(&cp->ctx, buf, result);
        if(res) {
-               printf("RSA encrypt failed. Error: %x data len: %d key len: %d\n", res * -1, len, keylen);
+               printf("RSA encrypt failed. Error: %x data len: %zd key len: %zd\n", res * -1, len, keylen);
                return NULL;
        }
        
@@ -241,7 +241,7 @@ static unsigned char *crypto_pk_polarssl_decrypt(const struct crypto_pk *_cp, co
 
        res = rsa_private(&cp->ctx, buf, result); // CHECK???
        if(res) {
-               printf("RSA decrypt failed. Error: %x data len: %d key len: %d\n", res * -1, len, keylen);
+               printf("RSA decrypt failed. Error: %x data len: %zd key len: %zd\n", res * -1, len, keylen);
                return NULL;
        }
        
index 7803060e2e6b33eda5c471d182ed6d65f6708ce4..f79e30453fd3929c3b8cfc31590348a6e27ba0db 100644 (file)
@@ -53,7 +53,7 @@ static unsigned char *emv_pki_decode_message(const struct emv_pk *enc_pk,
        }
 
        if (cert_tlv->len != enc_pk->mlen) {
-               printf("ERROR: Certificate length (%d) not equal key length (%d)\n", cert_tlv->len, enc_pk->mlen);
+               printf("ERROR: Certificate length (%zd) not equal key length (%zd)\n", cert_tlv->len, enc_pk->mlen);
                return NULL;
        }
        kcp = crypto_pk_open(enc_pk->pk_algo,
@@ -451,7 +451,7 @@ struct tlvdb *emv_pki_perform_cda_ex(const struct emv_pk *enc_pk, const struct t
                        un_tlv,
                        NULL);
        if (!data || data_len < 3) {
-               printf("ERROR: can't decode message. len %d\n", data_len);
+               printf("ERROR: can't decode message. len %zd\n", data_len);
                return NULL;
        }
 
index ff18b9da79eee37297ba3cb4d6b51147cb6a71ce..352f48b44c12410ffb0514fa9c2ccdd1f8677e58 100644 (file)
@@ -219,7 +219,7 @@ static int test_pk(bool verbose)
 
        tmp = crypto_pk_get_parameter(pubk, 0, &tmp_len);
        if (tmp_len != sizeof(pk_N) || memcmp(tmp, pk_N, tmp_len)) {
-               fprintf(stderr, "ERROR: crypto_pk_get_parameter(0) Modulus. param len %d len %d\n", tmp_len, sizeof(pk_N));
+               fprintf(stderr, "ERROR: crypto_pk_get_parameter(0) Modulus. param len %zd len %zd\n", tmp_len, sizeof(pk_N));
                free(tmp);
                goto close_pub;
        }
@@ -256,7 +256,7 @@ static int test_pk(bool verbose)
 
        tmp = crypto_pk_get_parameter(privk, 0, &tmp_len);
        if (tmp_len != sizeof(pk_N) || memcmp(tmp, pk_N, tmp_len)) {
-               fprintf(stderr, "ERROR: crypto_pk_get_parameter(0) Modulus. param len %d len %d\n", tmp_len, sizeof(pk_N));
+               fprintf(stderr, "ERROR: crypto_pk_get_parameter(0) Modulus. param len %zd len %zd\n", tmp_len, sizeof(pk_N));
                free(tmp);
                goto close;
        }
index a672ab585e99ffbcd75c4d7ab25d391f05c6c480..fc298a8b87b6bb948be72a69d4c731d559e1ede6 100644 (file)
@@ -297,9 +297,9 @@ int main(int argc, char **argv)
                }
                infiles = calloc(num_input_files, sizeof(FILE*));
                for (uint16_t i = 0; i < num_input_files; i++) { 
-                       infiles[i] = fopen(argv[i+hardnested_mode?2:1], "rb");
+                       infiles[i] = fopen(argv[i+(hardnested_mode?2:1)], "rb");
                        if (infiles[i] == NULL) {
-                               fprintf(stderr, "Error. Cannot open input file %s", argv[i+hardnested_mode?2:1]);
+                               fprintf(stderr, "Error. Cannot open input file %s", argv[i+(hardnested_mode?2:1)]);
                                return(EXIT_FAILURE);
                        }
                }
index 3c0c044ff5b7932ffb0418502abe0d16634f153b..d02209e9da7d0888912374af13b7c0bd025d5a40 100644 (file)
@@ -548,44 +548,105 @@ out:
 crack_states_bitsliced_t *crack_states_bitsliced_function_p = &crack_states_bitsliced_dispatch;
 bitslice_test_nonces_t *bitslice_test_nonces_function_p = &bitslice_test_nonces_dispatch;
 
-// determine the available instruction set at runtime and call the correct function
-const uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_bytes, statelist_t *p, uint32_t *keys_found, uint64_t *num_keys_tested, uint32_t nonces_to_bruteforce, uint8_t *bf_test_nonce_2nd_byte, noncelist_t *nonces) {
+static SIMDExecInstr intSIMDInstr = SIMD_AUTO;
+
+void SetSIMDInstr(SIMDExecInstr instr) {
+       intSIMDInstr = instr;
+       
+       crack_states_bitsliced_function_p = &crack_states_bitsliced_dispatch;
+       bitslice_test_nonces_function_p = &bitslice_test_nonces_dispatch;
+}
+
+SIMDExecInstr GetSIMDInstr() {
+       SIMDExecInstr instr = SIMD_NONE;
+       
 #if defined (__i386__) || defined (__x86_64__)
        #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1))
                #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) 
-               if (__builtin_cpu_supports("avx512f")) crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX512;
-               else if (__builtin_cpu_supports("avx2")) crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX2;
+               if (__builtin_cpu_supports("avx512f")) instr = SIMD_AVX512;
+               else if (__builtin_cpu_supports("avx2")) instr = SIMD_AVX2;
                #else
-               if (__builtin_cpu_supports("avx2")) crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX2;
+               if (__builtin_cpu_supports("avx2")) instr = SIMD_AVX2;
                #endif
-               else if (__builtin_cpu_supports("avx")) crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX;
-               else if (__builtin_cpu_supports("sse2")) crack_states_bitsliced_function_p = &crack_states_bitsliced_SSE2;
-               else if (__builtin_cpu_supports("mmx")) crack_states_bitsliced_function_p = &crack_states_bitsliced_MMX;
+               else if (__builtin_cpu_supports("avx")) instr = SIMD_AVX;
+               else if (__builtin_cpu_supports("sse2")) instr = SIMD_SSE2;
+               else if (__builtin_cpu_supports("mmx")) instr = SIMD_MMX;
                else
        #endif
 #endif
-               crack_states_bitsliced_function_p = &crack_states_bitsliced_NOSIMD;
+               instr = SIMD_NONE;
+               
+       return instr;
+}
+
+SIMDExecInstr GetSIMDInstrAuto() {
+       SIMDExecInstr instr = intSIMDInstr;
+       if (instr == SIMD_AUTO)
+               return GetSIMDInstr();
+       
+       return instr;
+}
+
+// determine the available instruction set at runtime and call the correct function
+const uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_bytes, statelist_t *p, uint32_t *keys_found, uint64_t *num_keys_tested, uint32_t nonces_to_bruteforce, uint8_t *bf_test_nonce_2nd_byte, noncelist_t *nonces) {
+       switch(GetSIMDInstrAuto()) {
+#if defined (__i386__) || defined (__x86_64__)
+#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1))
+#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) 
+               case SIMD_AVX512:
+                       crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX512;
+                       break;
+#endif
+               case SIMD_AVX2:
+                       crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX2;
+                       break;
+               case SIMD_AVX:
+                       crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX;
+                       break;
+               case SIMD_SSE2:
+                       crack_states_bitsliced_function_p = &crack_states_bitsliced_SSE2;
+                       break;
+               case SIMD_MMX:
+                       crack_states_bitsliced_function_p = &crack_states_bitsliced_MMX;
+                       break;
+#endif
+#endif
+               default:
+                       crack_states_bitsliced_function_p = &crack_states_bitsliced_NOSIMD;
+                       break;
+       }       
 
     // call the most optimized function for this CPU
     return (*crack_states_bitsliced_function_p)(cuid, best_first_bytes, p, keys_found, num_keys_tested, nonces_to_bruteforce, bf_test_nonce_2nd_byte, nonces);
 }
 
 void bitslice_test_nonces_dispatch(uint32_t nonces_to_bruteforce, uint32_t *bf_test_nonce, uint8_t *bf_test_nonce_par) {
-#if defined (__i386__) || defined (__x86_64__) 
-       #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1))
-               #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2)
-               if (__builtin_cpu_supports("avx512f")) bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX512;
-               else if (__builtin_cpu_supports("avx2")) bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX2;
-               #else
-               if (__builtin_cpu_supports("avx2")) bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX2;
-               #endif
-               else if (__builtin_cpu_supports("avx")) bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX;
-               else if (__builtin_cpu_supports("sse2")) bitslice_test_nonces_function_p = &bitslice_test_nonces_SSE2;
-               else if (__builtin_cpu_supports("mmx")) bitslice_test_nonces_function_p = &bitslice_test_nonces_MMX;
-               else
-       #endif
+       switch(GetSIMDInstrAuto()) {
+#if defined (__i386__) || defined (__x86_64__)
+#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1))
+#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) 
+               case SIMD_AVX512:
+                       bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX512;
+                       break;
+#endif
+               case SIMD_AVX2:
+                       bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX2;
+                       break;
+               case SIMD_AVX:
+                       bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX;
+                       break;
+               case SIMD_SSE2:
+                       bitslice_test_nonces_function_p = &bitslice_test_nonces_SSE2;
+                       break;
+               case SIMD_MMX:
+                       bitslice_test_nonces_function_p = &bitslice_test_nonces_MMX;
+                       break;
+#endif
 #endif
-               bitslice_test_nonces_function_p = &bitslice_test_nonces_NOSIMD;
+               default:
+                       bitslice_test_nonces_function_p = &bitslice_test_nonces_NOSIMD;
+                       break;
+       }       
 
     // call the most optimized function for this CPU
     (*bitslice_test_nonces_function_p)(nonces_to_bruteforce, bf_test_nonce, bf_test_nonce_par);
index 7a445993e223615a3b82d3e28ddb7a3029df9e4f..b3df05474838c1d0a4db4e6feb2e50b0d41ade21 100644 (file)
@@ -52,6 +52,18 @@ THE SOFTWARE.
 
 #include "hardnested_bruteforce.h"                     // statelist_t
 
+typedef enum {
+       SIMD_AUTO,
+       SIMD_AVX512,
+       SIMD_AVX2,
+       SIMD_AVX,
+       SIMD_SSE2,
+       SIMD_MMX,
+       SIMD_NONE,
+} SIMDExecInstr;
+extern void SetSIMDInstr(SIMDExecInstr instr);
+extern SIMDExecInstr GetSIMDInstrAuto();
+
 extern const uint64_t crack_states_bitsliced(uint32_t cuid, uint8_t *best_first_bytes, statelist_t *p, uint32_t *keys_found, uint64_t *num_keys_tested, uint32_t nonces_to_bruteforce, uint8_t *bf_test_nonces_2nd_byte, noncelist_t *nonces);
 extern void bitslice_test_nonces(uint32_t nonces_to_bruteforce, uint32_t *bf_test_nonces, uint8_t *bf_test_nonce_par);
 
index 718b7c5d518ad1214ab58a4bc080fe5b2adf2da7..deea69d8479f0b9fbff56811ba619ab24a22ce87 100644 (file)
@@ -139,8 +139,13 @@ bool verify_key(uint32_t cuid, noncelist_t *nonces, uint8_t *best_first_bytes, u
        return true;
 }
 
-
-static void* crack_states_thread(void* x){
+static void* 
+#ifdef __has_attribute
+#if __has_attribute(force_align_arg_pointer)
+__attribute__((force_align_arg_pointer)) 
+#endif
+#endif
+crack_states_thread(void* x){
 
        struct arg {
                bool silent;
index 72acf6906d6a61bc18db1a6f2e9e604ce543e13d..2a6a00109297c72afe47de08426814f37a510f7e 100644 (file)
@@ -739,18 +739,16 @@ int readKeyFile(uint8_t key[8])
        FILE *f;
        int retval = 1;
        f = fopen("iclass_key.bin", "rb");
-       if (f)
-       {
-               if(fread(key, sizeof(uint8_t), 8, f) == 1) 
-               {
-                       retval = 0;     
-               }
-               fclose(f);
+       if (!f)
+               return retval;
+       
+       if (fread(key, sizeof(uint8_t), 8, f) == 8) {
+               retval = 0;
        }
+       fclose(f);      
        return retval;
 }
 
-
 int doKeyTests(uint8_t debuglevel)
 {
        debug_print = debuglevel;
index 67277b5904aa3c0f58cf1974808944a869d9cf79..d204bf12c87e9a3358eba16c392e05a80ae980dc 100644 (file)
@@ -609,7 +609,8 @@ int saveTraceCard(void) {
        for (int i = 0; i < 64; i++) {  // blocks\r
                for (int j = 0; j < 16; j++)  // bytes\r
                        fprintf(f, "%02x", *(traceCard + i * 16 + j));\r
-               fprintf(f,"\n");\r
+               if (i < 63)\r
+                       fprintf(f,"\n");\r
        }\r
        fclose(f);\r
        return 0;\r
@@ -826,20 +827,30 @@ int mfTraceDecode(uint8_t *data_src, int len, bool wantSaveToEmlFile) {
                if (len ==4) {\r
                        traceState = TRACE_IDLE;\r
 \r
-                       at_enc = bytes_to_num(data, 4);\r
-\r
-                       //  decode key here)\r
-                       ks2 = ar_enc ^ prng_successor(nt, 64);\r
-                       ks3 = at_enc ^ prng_successor(nt, 96);\r
-                       revstate = lfsr_recovery64(ks2, ks3);\r
-                       lfsr_rollback_word(revstate, 0, 0);\r
-                       lfsr_rollback_word(revstate, 0, 0);\r
-                       lfsr_rollback_word(revstate, nr_enc, 1);\r
-                       lfsr_rollback_word(revstate, uid ^ nt, 0);\r
+                       if (!traceCrypto1) {\r
+                               at_enc = bytes_to_num(data, 4);\r
+\r
+                               //  decode key here)\r
+                               ks2 = ar_enc ^ prng_successor(nt, 64);\r
+                               ks3 = at_enc ^ prng_successor(nt, 96);\r
+                               revstate = lfsr_recovery64(ks2, ks3);\r
+                               lfsr_rollback_word(revstate, 0, 0);\r
+                               lfsr_rollback_word(revstate, 0, 0);\r
+                               lfsr_rollback_word(revstate, nr_enc, 1);\r
+                               lfsr_rollback_word(revstate, uid ^ nt, 0);\r
+\r
+                               crypto1_get_lfsr(revstate, &lfsr);\r
+                               printf("key> %x%x\n", (unsigned int)((lfsr & 0xFFFFFFFF00000000) >> 32), (unsigned int)(lfsr & 0xFFFFFFFF));\r
+                               AddLogUint64(logHexFileName, "key> ", lfsr);\r
+                       } else {\r
+                               printf("key> nested not implemented!\n");\r
+                               at_enc = bytes_to_num(data, 4);\r
+                               \r
+                               crypto1_destroy(traceCrypto1);\r
 \r
-                       crypto1_get_lfsr(revstate, &lfsr);\r
-                       printf("key> %x%x\n", (unsigned int)((lfsr & 0xFFFFFFFF00000000) >> 32), (unsigned int)(lfsr & 0xFFFFFFFF));\r
-                       AddLogUint64(logHexFileName, "key> ", lfsr);\r
+                               // not implemented\r
+                               traceState = TRACE_ERROR;\r
+                       }\r
 \r
                        int blockShift = ((traceCurBlock & 0xFC) + 3) * 16;\r
                        if (isBlockEmpty((traceCurBlock & 0xFC) + 3)) memcpy(traceCard + blockShift + 6, trailerAccessBytes, 4);\r
@@ -857,15 +868,6 @@ int mfTraceDecode(uint8_t *data_src, int len, bool wantSaveToEmlFile) {
 \r
                        // set cryptosystem state\r
                        traceCrypto1 = lfsr_recovery64(ks2, ks3);\r
-\r
-//     nt = crypto1_word(traceCrypto1, nt ^ uid, 1) ^ nt;\r
-\r
-       /*      traceCrypto1 = crypto1_create(lfsr); // key in lfsr\r
-               crypto1_word(traceCrypto1, nt ^ uid, 0);\r
-               crypto1_word(traceCrypto1, ar, 1);\r
-               crypto1_word(traceCrypto1, 0, 0);\r
-               crypto1_word(traceCrypto1, 0, 0);*/\r
-\r
                        return 0;\r
                } else {\r
                        traceState = TRACE_ERROR;\r
index 8f3ed46b6a45c827950dfb377745965ade89e3c7..32158adab3403fa394f1406d40961692ad19425d 100644 (file)
@@ -37,8 +37,12 @@ void msleep(uint32_t n) {
 
 #ifdef __APPLE__
 
+#ifndef CLOCK_MONOTONIC
        #define CLOCK_MONOTONIC (1)
+#endif
+#ifndef CLOCK_REALTIME
        #define CLOCK_REALTIME (2)
+#endif
 
        #include <sys/time.h>
        #include <mach/clock.h>
Impressum, Datenschutz