mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-14 18:47:24 -07:00
emv/sc fixes and modifications: (#780)
* print selected Smartcard Reader in PrintChannel() * implement 'sc sel <readername>'. Readername can include wildcards * and ? * fixing EMV APDU exchange (again) * use EMVExchangeEx() instead of EMVExchange() in fidocore.c
This commit is contained in:
parent
fbf77474f5
commit
41bdfce385
7 changed files with 165 additions and 118 deletions
|
@ -11,7 +11,10 @@
|
|||
//
|
||||
|
||||
#include "cbortools.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "emv/emvjson.h"
|
||||
#include "util.h"
|
||||
#include "fidocore.h"
|
||||
|
|
|
@ -22,7 +22,10 @@
|
|||
#include "crypto/libpcrypto.h"
|
||||
#include "fido/additional_ca.h"
|
||||
#include "fido/cose.h"
|
||||
#include "emv/dump.h"
|
||||
#include "protocols.h"
|
||||
#include "ui.h"
|
||||
#include "util.h"
|
||||
|
||||
|
||||
typedef struct {
|
||||
|
@ -176,22 +179,22 @@ int FIDOSelect(bool ActivateField, bool LeaveFieldON, uint8_t *Result, size_t Ma
|
|||
}
|
||||
|
||||
int FIDOExchange(uint8_t* apdu, int apdulen, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw) {
|
||||
int res = EMVExchange(ECC_CONTACTLESS, true, apdu, apdulen, Result, MaxResultLen, ResultLen, sw, NULL);
|
||||
if (res == 5) // apdu result (sw) not a 0x9000
|
||||
res = 0;
|
||||
// software chaining
|
||||
while (!res && (*sw >> 8) == 0x61) {
|
||||
uint8_t La = *sw & 0xff;
|
||||
uint8_t get_response_APDU[5] = {apdu[0], ISO7816_GET_RESPONSE, 0x00, 0x00, La};
|
||||
size_t oldlen = *ResultLen;
|
||||
res = EMVExchange(ECC_CONTACTLESS, true, get_response_APDU, sizeof(get_response_APDU), &Result[oldlen], MaxResultLen - oldlen, ResultLen, sw, NULL);
|
||||
if (res == 5) // apdu result (sw) not a 0x9000
|
||||
res = 0;
|
||||
int res = EMVExchangeEx(ECC_CONTACTLESS, false, true, apdu, apdulen, Result, MaxResultLen, ResultLen, sw, NULL);
|
||||
// if (res == 5) // apdu result (sw) not a 0x9000
|
||||
// res = 0;
|
||||
// // software chaining
|
||||
// while (!res && (*sw >> 8) == 0x61) {
|
||||
// uint8_t La = *sw & 0xff;
|
||||
// uint8_t get_response_APDU[5] = {apdu[0], ISO7816_GET_RESPONSE, 0x00, 0x00, La};
|
||||
// size_t oldlen = *ResultLen;
|
||||
// res = EMVExchange(ECC_CONTACTLESS, true, get_response_APDU, sizeof(get_response_APDU), &Result[oldlen], MaxResultLen - oldlen, ResultLen, sw, NULL);
|
||||
// if (res == 5) // apdu result (sw) not a 0x9000
|
||||
// res = 0;
|
||||
|
||||
*ResultLen += oldlen;
|
||||
if (*ResultLen > MaxResultLen)
|
||||
return 100;
|
||||
}
|
||||
// *ResultLen += oldlen;
|
||||
// if (*ResultLen > MaxResultLen)
|
||||
// return 100;
|
||||
// }
|
||||
return res;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue