2013-03-01 01:04:23 +08:00
//-----------------------------------------------------------------------------
// Copyright (C) 2012 Chalk <chalk.secu at gmail.com>
2015-08-26 21:53:49 +08:00
// 2015 Dake <thomas.cayrou at gmail.com>
2013-03-01 01:04:23 +08:00
// 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.
//-----------------------------------------------------------------------------
// Low frequency PCF7931 commands
//-----------------------------------------------------------------------------
# include <stdio.h>
# include <string.h>
# include "proxmark3.h"
# include "ui.h"
# include "graph.h"
# include "cmdparser.h"
# include "cmddata.h"
# include "cmdmain.h"
# include "cmdlf.h"
# include "cmdlfpcf7931.h"
static int CmdHelp ( const char * Cmd ) ;
2015-08-26 21:53:49 +08:00
struct pcf7931_config configPcf = { { 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF } , 17500 , { 0 , 0 } } ;
2013-03-01 01:04:23 +08:00
int CmdLFPCF7931Read ( const char * Cmd )
{
UsbCommand c = { CMD_PCF7931_READ } ;
SendCommand ( & c ) ;
UsbCommand resp ;
WaitForResponse ( CMD_ACK , & resp ) ;
return 0 ;
}
2015-08-26 21:53:49 +08:00
int CmdLFPCF7931Config ( const char * Cmd )
{
int res = 0 ;
res = sscanf ( Cmd , " %02x %02x %02x %02x %02x %02x %02x %d %d %d " , & configPcf . password [ 0 ] , & configPcf . password [ 1 ] , & configPcf . password [ 2 ] , & configPcf . password [ 3 ] , & configPcf . password [ 4 ] , & configPcf . password [ 5 ] , & configPcf . password [ 6 ] , & configPcf . init_delay , & configPcf . offset [ 0 ] , & configPcf . offset [ 1 ] ) ;
if ( res > = 7 | | res < 1 ) {
if ( res = = 7 ) configPcf . init_delay = 17500 ; //default value
if ( res < = 8 ) {
configPcf . offset [ 0 ] = - 10 ; //default value
configPcf . offset [ 1 ] = 30 ; //default value
}
if ( res < 1 ) {
PrintAndLog ( " Usage: <password byte 1 (in hex, lsb first)> <password byte 2 (in hex, lsb first)> [...] <password byte 7 (in hex, lsb first)> <tag initialization delay (in us)> <optional : offset on the low pulses width (in us)> <optional : offset on the low pulses position (in us)> " ) ;
PrintAndLog ( " The time offsets could be usefull to correct slew rate generated by the antenna. " ) ;
}
PrintAndLog ( " Current configuration : " ) ;
PrintAndLog ( " Password (LSB first on each byte) : %02x %02x %02x %02x %02x %02x %02x " , configPcf . password [ 0 ] , configPcf . password [ 1 ] , configPcf . password [ 2 ] , configPcf . password [ 3 ] , configPcf . password [ 4 ] , configPcf . password [ 5 ] , configPcf . password [ 6 ] ) ;
PrintAndLog ( " Tag initialization delay : %d us " , configPcf . init_delay ) ;
PrintAndLog ( " Offsets : %d us on the low pulses width, %d us on the low pulses positions " , configPcf . offset [ 0 ] , configPcf . offset [ 1 ] ) ;
return 0 ;
}
//default values
configPcf . password [ 0 ] = 0xFF ;
configPcf . password [ 1 ] = 0xFF ;
configPcf . password [ 2 ] = 0xFF ;
configPcf . password [ 3 ] = 0xFF ;
configPcf . password [ 4 ] = 0xFF ;
configPcf . password [ 5 ] = 0xFF ;
configPcf . password [ 6 ] = 0xFF ;
configPcf . init_delay = 17500 ;
configPcf . offset [ 0 ] = 0 ;
configPcf . offset [ 1 ] = 0 ;
PrintAndLog ( " Incorrect format " ) ;
PrintAndLog ( " Examples of right usage : lf pcf7931 config 11 22 33 44 55 66 77 20000 " ) ;
PrintAndLog ( " lf pcf7931 config FF FF FF FF FF FF FF 17500 -10 30 " ) ;
return 0 ;
}
int CmdLFPCF7931Write ( const char * Cmd )
{
UsbCommand c = { CMD_PCF7931_WRITE } ;
int res = 0 ;
res = sscanf ( Cmd , " %x %x %x " , & c . arg [ 0 ] , & c . arg [ 1 ] , & c . arg [ 2 ] ) ;
if ( res < 1 ) {
PrintAndLog ( " Please specify the block address in hex " ) ;
return 0 ;
}
if ( res = = 1 ) {
PrintAndLog ( " Please specify the byte address in hex " ) ;
return 0 ;
}
if ( res = = 2 ) {
PrintAndLog ( " Please specify the data in hex (1 byte) " ) ;
return 0 ;
}
if ( res = = 3 ) {
uint8_t n = 0 ;
for ( n = 0 ; n < 7 ; n + + ) c . d . asDwords [ n ] = configPcf . password [ n ] ;
c . d . asDwords [ 7 ] = ( configPcf . offset [ 0 ] + 128 ) ;
c . d . asDwords [ 8 ] = ( configPcf . offset [ 1 ] + 128 ) ;
c . d . asDwords [ 9 ] = configPcf . init_delay ;
SendCommand ( & c ) ;
return 0 ;
}
PrintAndLog ( " INCORRECT FORMAT " ) ;
return 0 ;
}
2013-03-01 01:04:23 +08:00
static command_t CommandTable [ ] =
{
{ " help " , CmdHelp , 1 , " This help " } ,
{ " read " , CmdLFPCF7931Read , 1 , " Read content of a PCF7931 transponder " } ,
2015-08-26 21:53:49 +08:00
{ " write " , CmdLFPCF7931Write , 1 , " Write data on a PCF7931 transponder. Usage : lf pcf7931 write <bloc address> <byte address> <data> " } ,
{ " config " , CmdLFPCF7931Config , 1 , " Configure the password, the tags initialization delay and time offsets (optional) " } ,
2013-03-01 01:04:23 +08:00
{ NULL , NULL , 0 , NULL }
} ;
int CmdLFPCF7931 ( const char * Cmd )
{
CmdsParse ( CommandTable , Cmd ) ;
return 0 ;
}
int CmdHelp ( const char * Cmd )
{
CmdsHelp ( CommandTable ) ;
return 0 ;
}