2010-02-21 05:24:25 +08:00
//-----------------------------------------------------------------------------
// Jonathan Westhues, Aug 2005
2011-05-18 20:33:32 +08:00
// Gerhard de Koning Gans, April 2008, May 2011
2010-02-21 08:12:52 +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.
//-----------------------------------------------------------------------------
// Definitions internal to the app source.
2010-02-21 05:24:25 +08:00
//-----------------------------------------------------------------------------
# ifndef __APPS_H
# define __APPS_H
2010-02-21 06:51:00 +08:00
# include <stdint.h>
# include <stddef.h>
2014-09-12 05:23:46 +08:00
# include <stdlib.h>
2015-07-23 05:00:52 +08:00
# include <sys/types.h>
# include "common.h"
# include "crc32.h"
# include "lfdemod.h"
2015-01-16 18:00:17 +08:00
# include "BigBuf.h"
2015-06-25 18:22:34 +08:00
# include "fpgaloader.h"
2015-07-23 05:45:41 +08:00
# include "usb_cdc.h"
2015-07-19 02:43:14 +08:00
# include "hitag2.h"
2016-03-05 02:06:47 +08:00
# include "hitagS.h"
2015-07-19 02:43:14 +08:00
# include "mifare.h"
2015-10-14 17:39:51 +08:00
# include "pcf7931.h"
2015-03-24 18:45:31 +08:00
//#include "des.h"
//#include "aes.h"
# include "desfire.h"
2016-03-21 02:33:07 +08:00
# include "iso14443b.h"
2014-12-18 03:33:21 +08:00
extern const uint8_t OddByteParity [ 256 ] ;
2012-06-28 21:38:40 +08:00
extern int rsamples ; // = 0;
extern int tracing ; // = TRUE;
extern uint8_t trigger ;
2010-02-21 05:24:25 +08:00
2010-10-08 18:23:04 +08:00
// This may be used (sparingly) to declare a function to be copied to
// and executed from RAM
# define RAMFUNC __attribute((long_call, section(".ramfunc")))
2010-02-21 05:24:25 +08:00
/// appmain.h
void ReadMem ( int addr ) ;
void __attribute__ ( ( noreturn ) ) AppMain ( void ) ;
void SamyRun ( void ) ;
//void DbpIntegers(int a, int b, int c);
void DbpString ( char * str ) ;
void Dbprintf ( const char * fmt , . . . ) ;
2012-09-18 21:53:17 +08:00
void Dbhexdump ( int len , uint8_t * d , bool bAsci ) ;
2010-02-21 05:24:25 +08:00
2015-02-03 14:21:57 +08:00
// ADC Vref = 3300mV, and an (10M+1M):1M voltage divider on the HF input can measure voltages up to 36300 mV
# define MAX_ADC_HF_VOLTAGE 36300
// ADC Vref = 3300mV, and an (10000k+240k):240k voltage divider on the LF input can measure voltages up to 140800 mV
# define MAX_ADC_LF_VOLTAGE 140800
2011-06-10 21:35:10 +08:00
int AvgAdc ( int ch ) ;
2016-04-27 17:21:29 +08:00
void PrintToSendBuffer ( void ) ;
2010-02-21 05:24:25 +08:00
void ToSendStuffBit ( int b ) ;
void ToSendReset ( void ) ;
void ListenReaderField ( int limit ) ;
extern int ToSendMax ;
2010-02-21 06:51:00 +08:00
extern uint8_t ToSend [ ] ;
2010-02-21 05:24:25 +08:00
/// lfops.h
2015-01-29 07:57:22 +08:00
extern uint8_t decimation ;
extern uint8_t bits_per_sample ;
extern bool averaging ;
2013-09-27 21:48:20 +08:00
void AcquireRawAdcSamples125k ( int divisor ) ;
2015-10-21 01:00:02 +08:00
void ModThenAcquireRawAdcSamples125k ( uint32_t delay_off , uint32_t period_0 , uint32_t period_1 , uint8_t * command ) ;
2010-02-21 05:24:25 +08:00
void ReadTItag ( void ) ;
2010-02-21 06:51:00 +08:00
void WriteTItag ( uint32_t idhi , uint32_t idlo , uint16_t crc ) ;
2015-10-21 01:00:02 +08:00
2010-02-21 05:24:25 +08:00
void AcquireTiType ( void ) ;
void AcquireRawBitsTI ( void ) ;
2015-05-05 06:34:20 +08:00
void SimulateTagLowFrequency ( int period , int gap , int ledcontrol ) ;
2015-11-23 00:33:41 +08:00
void SimulateTagLowFrequencyBidir ( int divisor , int max_bitlen ) ;
2015-02-04 18:48:36 +08:00
void CmdHIDsimTAG ( int hi , int lo , int ledcontrol ) ;
2015-02-20 10:35:34 +08:00
void CmdFSKsimTAG ( uint16_t arg1 , uint16_t arg2 , size_t size , uint8_t * BitStream ) ;
void CmdASKsimTag ( uint16_t arg1 , uint16_t arg2 , size_t size , uint8_t * BitStream ) ;
2015-02-22 10:36:02 +08:00
void CmdPSKsimTag ( uint16_t arg1 , uint16_t arg2 , size_t size , uint8_t * BitStream ) ;
2010-02-21 05:24:25 +08:00
void CmdHIDdemodFSK ( int findone , int * high , int * low , int ledcontrol ) ;
2015-07-19 02:43:14 +08:00
void CmdAWIDdemodFSK ( int findone , int * high , int * low , int ledcontrol ) ; // Realtime demodulation mode for AWID26
2014-12-31 18:35:43 +08:00
void CmdEM410xdemod ( int findone , int * high , int * low , int ledcontrol ) ;
2014-03-19 04:52:48 +08:00
void CmdIOdemodFSK ( int findone , int * high , int * low , int ledcontrol ) ;
2015-11-03 03:46:17 +08:00
void CopyIOtoT55x7 ( uint32_t hi , uint32_t lo ) ; // Clone an ioProx card to T5557/T5567
2013-03-01 01:04:23 +08:00
void CopyHIDtoT55x7 ( uint32_t hi2 , uint32_t hi , uint32_t lo , uint8_t longFMT ) ; // Clone an HID card to T5557/T5567
2015-11-23 00:33:41 +08:00
void CopyVikingtoT55xx ( uint32_t block1 , uint32_t block2 , uint8_t Q5 ) ;
2012-03-07 21:44:53 +08:00
void WriteEM410x ( uint32_t card , uint32_t id_hi , uint32_t id_lo ) ;
2015-10-28 04:47:21 +08:00
void CopyIndala64toT55x7 ( uint32_t hi , uint32_t lo ) ; // Clone Indala 64-bit tag by UID to T55x7
void CopyIndala224toT55x7 ( uint32_t uid1 , uint32_t uid2 , uint32_t uid3 , uint32_t uid4 , uint32_t uid5 , uint32_t uid6 , uint32_t uid7 ) ; // Clone Indala 224-bit tag by UID to T55x7
2015-11-03 03:46:17 +08:00
void T55xxResetRead ( void ) ;
2015-11-23 00:33:41 +08:00
void T55xxWriteBlock ( uint32_t Data , uint8_t Block , uint32_t Pwd , uint8_t PwdMode ) ;
void T55xxWriteBlockExt ( uint32_t Data , uint8_t Block , uint32_t Pwd , uint8_t PwdMode ) ;
2015-10-21 01:00:02 +08:00
void T55xxReadBlock ( uint16_t arg0 , uint8_t Block , uint32_t Pwd ) ;
void T55xxWakeUp ( uint32_t Pwd ) ;
2014-10-07 01:42:50 +08:00
void TurnReadLFOn ( ) ;
2015-10-14 17:39:51 +08:00
void EM4xReadWord ( uint8_t Address , uint32_t Pwd , uint8_t PwdMode ) ;
void EM4xWriteWord ( uint32_t Data , uint8_t Address , uint32_t Pwd , uint8_t PwdMode ) ;
2010-02-21 05:24:25 +08:00
/// iso14443.h
2016-04-27 17:21:29 +08:00
void SimulateIso14443bTag ( uint32_t pupi ) ;
2015-06-18 15:52:53 +08:00
void AcquireRawAdcSamplesIso14443b ( uint32_t parameter ) ;
2016-03-21 02:33:07 +08:00
void ReadSTMemoryIso14443b ( uint8_t numofblocks ) ;
2015-06-18 15:52:53 +08:00
void RAMFUNC SnoopIso14443b ( void ) ;
2013-09-02 02:41:05 +08:00
void SendRawCommand14443B ( uint32_t , uint32_t , uint8_t , uint8_t [ ] ) ;
2010-02-21 05:24:25 +08:00
/// iso14443a.h
2015-05-16 21:34:01 +08:00
void RAMFUNC SniffIso14443a ( uint8_t param ) ;
2015-07-29 07:10:06 +08:00
void SimulateIso14443aTag ( int tagType , int flags , byte_t * data ) ;
2012-12-05 07:39:18 +08:00
void ReaderIso14443a ( UsbCommand * c ) ;
2012-06-28 21:38:40 +08:00
// Also used in iclass.c
2014-12-18 03:33:21 +08:00
bool RAMFUNC LogTrace ( const uint8_t * btBytes , uint16_t len , uint32_t timestamp_start , uint32_t timestamp_end , uint8_t * parity , bool readerToTag ) ;
2014-12-16 14:41:07 +08:00
void GetParity ( const uint8_t * pbtCmd , uint16_t len , uint8_t * parity ) ;
2012-12-05 07:39:18 +08:00
void iso14a_set_trigger ( bool enable ) ;
2015-02-08 03:49:40 +08:00
2012-07-07 23:29:51 +08:00
void RAMFUNC SniffMifare ( uint8_t param ) ;
2011-06-18 02:39:54 +08:00
2012-08-29 05:39:50 +08:00
/// epa.h
2012-12-05 07:39:18 +08:00
void EPA_PACE_Collect_Nonce ( UsbCommand * c ) ;
2015-06-24 04:30:18 +08:00
void EPA_PACE_Replay ( UsbCommand * c ) ;
2012-08-29 05:39:50 +08:00
2011-06-18 02:39:54 +08:00
// mifarecmd.h
2016-01-21 05:26:01 +08:00
//void ReaderMifare(bool first_try);
void ReaderMifare ( bool first_try , uint8_t block ) ;
2013-09-15 17:33:17 +08:00
int32_t dist_nt ( uint32_t nt1 , uint32_t nt2 ) ;
2011-05-26 20:55:15 +08:00
void MifareReadBlock ( uint8_t arg0 , uint8_t arg1 , uint8_t arg2 , uint8_t * data ) ;
2015-03-24 18:45:31 +08:00
void MifareUReadBlock ( uint8_t arg0 , uint8_t arg1 , uint8_t * datain ) ;
2015-05-16 21:34:01 +08:00
void MifareUC_Auth ( uint8_t arg0 , uint8_t * datain ) ;
2015-05-05 06:34:20 +08:00
void MifareUReadCard ( uint8_t arg0 , uint16_t arg1 , uint8_t arg2 , uint8_t * datain ) ;
2011-05-26 20:55:15 +08:00
void MifareReadSector ( uint8_t arg0 , uint8_t arg1 , uint8_t arg2 , uint8_t * datain ) ;
void MifareWriteBlock ( uint8_t arg0 , uint8_t arg1 , uint8_t arg2 , uint8_t * datain ) ;
2015-05-28 05:23:46 +08:00
//void MifareUWriteBlockCompat(uint8_t arg0,uint8_t *datain);
void MifareUWriteBlock ( uint8_t arg0 , uint8_t arg1 , uint8_t * datain ) ;
2011-06-07 20:35:52 +08:00
void MifareNested ( uint32_t arg0 , uint32_t arg1 , uint32_t arg2 , uint8_t * datain ) ;
2015-11-27 23:24:00 +08:00
void MifareAcquireEncryptedNonces ( uint32_t arg0 , uint32_t arg1 , uint32_t flags , uint8_t * datain ) ;
2015-07-13 04:58:16 +08:00
void MifareChkKeys ( uint16_t arg0 , uint8_t arg1 , uint8_t arg2 , uint8_t * datain ) ;
2011-05-26 20:55:15 +08:00
void Mifare1ksim ( uint8_t arg0 , uint8_t arg1 , uint8_t arg2 , uint8_t * datain ) ;
2011-06-18 02:39:54 +08:00
void MifareSetDbgLvl ( uint32_t arg0 , uint32_t arg1 , uint32_t arg2 , uint8_t * datain ) ;
void MifareEMemClr ( uint32_t arg0 , uint32_t arg1 , uint32_t arg2 , uint8_t * datain ) ;
void MifareEMemSet ( uint32_t arg0 , uint32_t arg1 , uint32_t arg2 , uint8_t * datain ) ;
void MifareEMemGet ( uint32_t arg0 , uint32_t arg1 , uint32_t arg2 , uint8_t * datain ) ;
void MifareECardLoad ( uint32_t arg0 , uint32_t arg1 , uint32_t arg2 , uint8_t * datain ) ;
2015-11-10 04:46:15 +08:00
void MifareCSetBlock ( uint32_t arg0 , uint32_t arg1 , uint8_t * datain ) ; // Work with "magic Chinese" card
void MifareCGetBlock ( uint32_t arg0 , uint32_t arg1 , uint8_t * datain ) ;
2014-12-27 04:32:58 +08:00
void MifareCIdent ( ) ; // is "magic chinese" card?
2015-03-30 22:24:03 +08:00
void MifareUSetPwd ( uint8_t arg0 , uint8_t * datain ) ;
2015-11-10 04:46:15 +08:00
void OnSuccessMagic ( ) ;
void OnErrorMagic ( uint8_t reason ) ;
2015-04-25 00:41:49 +08:00
2014-12-31 18:35:43 +08:00
//desfire
void Mifare_DES_Auth1 ( uint8_t arg0 , uint8_t * datain ) ;
void Mifare_DES_Auth2 ( uint32_t arg0 , uint8_t * datain ) ;
2014-09-12 05:23:46 +08:00
// mifaredesfire.h
2014-10-07 01:42:50 +08:00
bool InitDesfireCard ( ) ;
void MifareSendCommand ( uint8_t arg0 , uint8_t arg1 , uint8_t * datain ) ;
void MifareDesfireGetInformation ( ) ;
void MifareDES_Auth1 ( uint8_t arg0 , uint8_t arg1 , uint8_t arg2 , uint8_t * datain ) ;
void ReaderMifareDES ( uint32_t param , uint32_t param2 , uint8_t * datain ) ;
int DesfireAPDU ( uint8_t * cmd , size_t cmd_len , uint8_t * dataout ) ;
size_t CreateAPDU ( uint8_t * datain , size_t len , uint8_t * dataout ) ;
void OnSuccess ( ) ;
2015-01-08 00:42:57 +08:00
void OnError ( uint8_t reason ) ;
2014-10-07 01:42:50 +08:00
2015-03-24 18:45:31 +08:00
// desfire_crypto.h
void * mifare_cryto_preprocess_data ( desfiretag_t tag , void * data , size_t * nbytes , off_t offset , int communication_settings ) ;
void * mifare_cryto_postprocess_data ( desfiretag_t tag , void * data , ssize_t * nbytes , int communication_settings ) ;
void mifare_cypher_single_block ( desfirekey_t key , uint8_t * data , uint8_t * ivect , MifareCryptoDirection direction , MifareCryptoOperation operation , size_t block_size ) ;
void mifare_cypher_blocks_chained ( desfiretag_t tag , desfirekey_t key , uint8_t * ivect , uint8_t * data , size_t data_size , MifareCryptoDirection direction , MifareCryptoOperation operation ) ;
size_t key_block_size ( const desfirekey_t key ) ;
size_t padded_data_length ( const size_t nbytes , const size_t block_size ) ;
size_t maced_data_length ( const desfirekey_t key , const size_t nbytes ) ;
size_t enciphered_data_length ( const desfiretag_t tag , const size_t nbytes , int communication_settings ) ;
void cmac_generate_subkeys ( desfirekey_t key ) ;
void cmac ( const desfirekey_t key , uint8_t * ivect , const uint8_t * data , size_t len , uint8_t * cmac ) ;
2014-09-12 05:23:46 +08:00
2010-02-21 05:24:25 +08:00
/// iso15693.h
2010-10-19 22:25:17 +08:00
void RecordRawAdcSamplesIso15693 ( void ) ;
2010-02-21 05:24:25 +08:00
void AcquireRawAdcSamplesIso15693 ( void ) ;
2010-02-21 06:51:00 +08:00
void ReaderIso15693 ( uint32_t parameter ) ; // Simulate an ISO15693 reader - greg
2014-10-30 21:11:37 +08:00
void SimTagIso15693 ( uint32_t parameter , uint8_t * uid ) ; // simulate an ISO15693 tag - greg
2010-10-19 22:25:17 +08:00
void BruteforceIso15693Afi ( uint32_t speed ) ; // find an AFI of a tag - atrox
void DirectTag15693Command ( uint32_t datalen , uint32_t speed , uint32_t recv , uint8_t data [ ] ) ; // send arbitrary commands from CLI - atrox
void SetDebugIso15693 ( uint32_t flag ) ;
2010-02-21 05:24:25 +08:00
2011-05-18 20:33:32 +08:00
/// iclass.h
void RAMFUNC SnoopIClass ( void ) ;
2014-04-17 15:53:54 +08:00
void SimulateIClass ( uint32_t arg0 , uint32_t arg1 , uint32_t arg2 , uint8_t * datain ) ;
2012-06-28 21:38:40 +08:00
void ReaderIClass ( uint8_t arg0 ) ;
2014-09-12 05:23:46 +08:00
void ReaderIClass_Replay ( uint8_t arg0 , uint8_t * MAC ) ;
void IClass_iso14443A_GetPublic ( uint8_t arg0 ) ;
2015-10-08 05:00:46 +08:00
void iClass_Authentication ( uint8_t * MAC ) ;
void iClass_WriteBlock ( uint8_t blockNo , uint8_t * data ) ;
void iClass_ReadBlk ( uint8_t blockNo ) ;
bool iClass_ReadBlock ( uint8_t blockNo , uint8_t * readdata ) ;
void iClass_Dump ( uint8_t blockno , uint8_t numblks ) ;
void iClass_Clone ( uint8_t startblock , uint8_t endblock , uint8_t * data ) ;
void iClass_ReadCheck ( uint8_t blockNo , uint8_t keyType ) ;
2011-05-18 20:33:32 +08:00
2015-10-14 17:39:51 +08:00
2012-09-18 21:53:17 +08:00
// hitag2.h
void SnoopHitag ( uint32_t type ) ;
void SimulateHitagTag ( bool tag_mem_supplied , byte_t * data ) ;
void ReaderHitag ( hitag_function htf , hitag_data * htd ) ;
2016-03-05 02:06:47 +08:00
//hitagS.h
void SimulateHitagSTag ( bool tag_mem_supplied , byte_t * data ) ;
void ReadHitagS ( hitag_function htf , hitag_data * htd ) ;
void WritePageHitagS ( hitag_function htf , hitag_data * htd , int page ) ;
void check_challenges ( bool file_given , byte_t * data ) ;
2012-12-06 00:14:10 +08:00
// cmd.h
bool cmd_receive ( UsbCommand * cmd ) ;
2013-02-27 21:23:38 +08:00
bool cmd_send ( uint32_t cmd , uint32_t arg0 , uint32_t arg1 , uint32_t arg2 , void * data , size_t len ) ;
2012-12-06 00:14:10 +08:00
2010-02-21 05:24:25 +08:00
/// util.h
2015-10-28 04:47:21 +08:00
void HfSnoop ( int , int ) ;
2016-01-21 05:26:01 +08:00
//EMV functions emvcmd.h
void EMVTransaction ( void ) ;
void EMVgetUDOL ( void ) ;
void EMVloadvalue ( uint32_t tag , uint8_t * datain ) ;
void EMVdumpcard ( void ) ;
2010-02-21 05:24:25 +08:00
# endif