-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Add initial ISO7816 support * Format sources and sync API Symbols version * Debug: change VID/PID in ccid test app to opensc detectable generic one Co-authored-by: あく <alleteam@gmail.com>
- Loading branch information
Showing
10 changed files
with
253 additions
and
68 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
#ifndef _ISO7816_ATR_H_ | ||
#define _ISO7816_ATR_H_ | ||
|
||
typedef struct { | ||
uint8_t TS; | ||
uint8_t T0; | ||
} Iso7816Atr; | ||
|
||
#endif //_ISO7816_ATR_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
// transforms low level calls such as XFRCallback or ICC Power on to a structured one | ||
// an application can register these calls and listen for the callbacks defined in Iso7816Callbacks | ||
|
||
#include "iso7816_t0_apdu.h" | ||
#include "iso7816_atr.h" | ||
#include "iso7816_callbacks.h" | ||
#include <stdint.h> | ||
#include <stddef.h> | ||
#include <furi.h> | ||
|
||
#define ISO7816_RESPONSE_BUFFER_SIZE 255 | ||
|
||
static Iso7816Callbacks* callbacks = NULL; | ||
|
||
void iso7816_set_callbacks(Iso7816Callbacks* cb) { | ||
callbacks = cb; | ||
} | ||
|
||
void iso7816_icc_power_on_callback(uint8_t* atrBuffer, uint32_t* atrlen) { | ||
Iso7816Atr atr; | ||
callbacks->iso7816_answer_to_reset(&atr); | ||
|
||
furi_assert(atr.T0 == 0x00); | ||
|
||
uint8_t AtrBuffer[2] = {atr.TS, atr.T0}; | ||
|
||
*atrlen = 2; | ||
|
||
memcpy(atrBuffer, AtrBuffer, sizeof(uint8_t) * (*atrlen)); | ||
} | ||
|
||
//dataBlock points to the buffer | ||
//dataBlockLen tells reader how nany bytes should be read | ||
void iso7816_xfr_datablock_callback( | ||
const uint8_t* pcToReaderDataBlock, | ||
uint32_t pcToReaderDataBlockLen, | ||
uint8_t* readerToPcDataBlock, | ||
uint32_t* readerToPcDataBlockLen) { | ||
struct ISO7816_Response_APDU responseAPDU; | ||
uint8_t responseApduDataBuffer[ISO7816_RESPONSE_BUFFER_SIZE]; | ||
uint8_t responseApduDataBufferLen = 0; | ||
|
||
if(callbacks != NULL) { | ||
struct ISO7816_Command_APDU commandAPDU; | ||
|
||
const uint8_t* commandApduDataBuffer = NULL; | ||
uint8_t commandApduDataBufferLen = 0; | ||
|
||
iso7816_read_command_apdu(&commandAPDU, pcToReaderDataBlock, pcToReaderDataBlockLen); | ||
|
||
if(commandAPDU.Lc > 0) { | ||
commandApduDataBufferLen = commandAPDU.Lc; | ||
commandApduDataBuffer = &pcToReaderDataBlock[5]; | ||
} | ||
|
||
callbacks->iso7816_process_command( | ||
&commandAPDU, | ||
&responseAPDU, | ||
commandApduDataBuffer, | ||
commandApduDataBufferLen, | ||
responseApduDataBuffer, | ||
&responseApduDataBufferLen); | ||
|
||
} else { | ||
//class not supported | ||
responseAPDU.SW1 = 0x6E; | ||
responseAPDU.SW2 = 0x00; | ||
} | ||
|
||
iso7816_write_response_apdu( | ||
&responseAPDU, | ||
readerToPcDataBlock, | ||
readerToPcDataBlockLen, | ||
responseApduDataBuffer, | ||
responseApduDataBufferLen); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
#ifndef _ISO7816_CALLBACKS_H_ | ||
#define _ISO7816_CALLBACKS_H_ | ||
|
||
#include <stdint.h> | ||
#include "iso7816_atr.h" | ||
#include "iso7816_t0_apdu.h" | ||
|
||
typedef struct { | ||
void (*iso7816_answer_to_reset)(Iso7816Atr* atr); | ||
void (*iso7816_process_command)( | ||
const struct ISO7816_Command_APDU* command, | ||
struct ISO7816_Response_APDU* response, | ||
const uint8_t* commandApduDataBuffer, | ||
uint8_t commandApduDataBufferLen, | ||
uint8_t* responseApduDataBuffer, | ||
uint8_t* responseApduDataBufferLen); | ||
} Iso7816Callbacks; | ||
|
||
void iso7816_set_callbacks(Iso7816Callbacks* cb); | ||
|
||
void iso7816_icc_power_on_callback(uint8_t* atrBuffer, uint32_t* atrlen); | ||
void iso7816_xfr_datablock_callback( | ||
const uint8_t* dataBlock, | ||
uint32_t dataBlockLen, | ||
uint8_t* responseDataBlock, | ||
uint32_t* responseDataBlockLen); | ||
|
||
#endif //_ISO7816_CALLBACKS_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.