implement capability container and ndef tag to work with nexus 6
This commit is contained in:
parent
91d092a27a
commit
5f637992b1
@ -17,13 +17,13 @@
|
|||||||
|
|
||||||
const CAPABILITY_CONTAINER NFC_CC = {
|
const CAPABILITY_CONTAINER NFC_CC = {
|
||||||
.cclen_hi = 0x00, .cclen_lo = 0x0f,
|
.cclen_hi = 0x00, .cclen_lo = 0x0f,
|
||||||
.version = 0x01,
|
.version = 0x20,
|
||||||
.MLe_hi = 0x00, .MLe_lo = 0xff,
|
.MLe_hi = 0x00, .MLe_lo = 0x7f,
|
||||||
.MLc_hi = 0x00, .MLc_lo = 0xff,
|
.MLc_hi = 0x00, .MLc_lo = 0x7f,
|
||||||
.tlv = { 0x04,0x06,
|
.tlv = { 0x04,0x06,
|
||||||
0x11,0x11,
|
0xe1,0x04,
|
||||||
0x00,0xff,
|
0x00,0x7f,
|
||||||
0x00,0xff }
|
0x00,0x00 }
|
||||||
};
|
};
|
||||||
|
|
||||||
uint8_t NDEF_SAMPLE[] = "\x00\x13\xD1\x01\x0ET\x02enHello World";
|
uint8_t NDEF_SAMPLE[] = "\x00\x13\xD1\x01\x0ET\x02enHello World";
|
||||||
@ -259,9 +259,24 @@ int select_applet(uint8_t * aid, int len)
|
|||||||
if (memcmp(aid,AID_FIDO,sizeof(AID_FIDO)) == 0)
|
if (memcmp(aid,AID_FIDO,sizeof(AID_FIDO)) == 0)
|
||||||
{
|
{
|
||||||
NFC_STATE.selected_applet = APP_FIDO;
|
NFC_STATE.selected_applet = APP_FIDO;
|
||||||
return 1;
|
return APP_FIDO;
|
||||||
}
|
}
|
||||||
return 0;
|
else if (memcmp(aid,AID_NDEF_TYPE_4,sizeof(AID_NDEF_TYPE_4)) == 0)
|
||||||
|
{
|
||||||
|
NFC_STATE.selected_applet = APP_NDEF_TYPE_4;
|
||||||
|
return APP_NDEF_TYPE_4;
|
||||||
|
}
|
||||||
|
else if (memcmp(aid,AID_CAPABILITY_CONTAINER,sizeof(AID_CAPABILITY_CONTAINER)) == 0)
|
||||||
|
{
|
||||||
|
NFC_STATE.selected_applet = APP_CAPABILITY_CONTAINER;
|
||||||
|
return APP_CAPABILITY_CONTAINER;
|
||||||
|
}
|
||||||
|
else if (memcmp(aid,AID_NDEF_TAG,sizeof(AID_NDEF_TAG)) == 0)
|
||||||
|
{
|
||||||
|
NFC_STATE.selected_applet = APP_NDEF_TAG;
|
||||||
|
return APP_NDEF_TAG;
|
||||||
|
}
|
||||||
|
return APP_NOTHING;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nfc_process_iblock(uint8_t * buf, int len)
|
void nfc_process_iblock(uint8_t * buf, int len)
|
||||||
@ -303,7 +318,7 @@ void nfc_process_iblock(uint8_t * buf, int len)
|
|||||||
// else
|
// else
|
||||||
{
|
{
|
||||||
selected = select_applet(payload, plen);
|
selected = select_applet(payload, plen);
|
||||||
if (selected)
|
if (selected == APP_FIDO)
|
||||||
{
|
{
|
||||||
// block = buf[0] & 1;
|
// block = buf[0] & 1;
|
||||||
// block = NFC_STATE.block_num;
|
// block = NFC_STATE.block_num;
|
||||||
@ -311,6 +326,11 @@ void nfc_process_iblock(uint8_t * buf, int len)
|
|||||||
// NFC_STATE.block_num = block;
|
// NFC_STATE.block_num = block;
|
||||||
nfc_write_response_ex(buf[0], (uint8_t *)"U2F_V2", 6, SW_SUCCESS);
|
nfc_write_response_ex(buf[0], (uint8_t *)"U2F_V2", 6, SW_SUCCESS);
|
||||||
printf1(TAG_NFC, "FIDO applet selected.\r\n");
|
printf1(TAG_NFC, "FIDO applet selected.\r\n");
|
||||||
|
}
|
||||||
|
else if (selected != APP_NOTHING)
|
||||||
|
{
|
||||||
|
nfc_write_response(buf[0], SW_SUCCESS);
|
||||||
|
printf1(TAG_NFC, "SELECTED %d\r\n", selected);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -401,7 +421,8 @@ void nfc_process_iblock(uint8_t * buf, int len)
|
|||||||
printf1(TAG_ERR, "Truncating requested CC length %d\r\n", apdu->lc);
|
printf1(TAG_ERR, "Truncating requested CC length %d\r\n", apdu->lc);
|
||||||
plen = 15;
|
plen = 15;
|
||||||
}
|
}
|
||||||
memmove(res+1, &NFC_CC, plen);
|
nfc_write_response_ex(buf[0], &NFC_CC, plen, SW_SUCCESS);
|
||||||
|
ams_wait_for_tx(10);
|
||||||
break;
|
break;
|
||||||
case APP_NDEF_TAG:
|
case APP_NDEF_TAG:
|
||||||
printf1(TAG_NFC,"APP_NDEF_TAG\r\n");
|
printf1(TAG_NFC,"APP_NDEF_TAG\r\n");
|
||||||
@ -410,20 +431,15 @@ void nfc_process_iblock(uint8_t * buf, int len)
|
|||||||
printf1(TAG_ERR, "Truncating requested CC length %d\r\n", apdu->lc);
|
printf1(TAG_ERR, "Truncating requested CC length %d\r\n", apdu->lc);
|
||||||
plen = sizeof(NDEF_SAMPLE) - 1;
|
plen = sizeof(NDEF_SAMPLE) - 1;
|
||||||
}
|
}
|
||||||
memmove(res+1, NDEF_SAMPLE, plen);
|
nfc_write_response_ex(buf[0], NDEF_SAMPLE, plen, SW_SUCCESS);
|
||||||
|
ams_wait_for_tx(10);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf1(TAG_ERR, "No binary applet selected!\r\n");
|
printf1(TAG_ERR, "No binary applet selected!\r\n");
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
res[0] = NFC_CMD_IBLOCK | (buf[0] & 1);
|
|
||||||
|
|
||||||
res[1+plen] = SW_SUCCESS>>8;
|
|
||||||
res[2+plen] = SW_SUCCESS & 0xff;
|
|
||||||
nfc_write_frame(res, 3+plen);
|
|
||||||
printf1(TAG_NFC,"APDU_INS_READ_BINARY\r\n");
|
|
||||||
printf1(TAG_NFC,"<< "); dump_hex1(TAG_NFC,res, 3+plen);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf1(TAG_NFC, "Unknown INS %02x\r\n", apdu->ins);
|
printf1(TAG_NFC, "Unknown INS %02x\r\n", apdu->ins);
|
||||||
@ -490,7 +506,7 @@ void nfc_process_block(uint8_t * buf, int len)
|
|||||||
|
|
||||||
nfc_process_iblock(ibuf, ibuflen);
|
nfc_process_iblock(ibuf, ibuflen);
|
||||||
} else {
|
} else {
|
||||||
printf1(TAG_NFC, "NFC_CMD_IBLOCK\r\n");
|
// printf1(TAG_NFC, "NFC_CMD_IBLOCK\r\n");
|
||||||
nfc_process_iblock(buf, len);
|
nfc_process_iblock(buf, len);
|
||||||
}
|
}
|
||||||
ibuflen = 0;
|
ibuflen = 0;
|
||||||
@ -506,8 +522,8 @@ void nfc_process_block(uint8_t * buf, int len)
|
|||||||
|
|
||||||
if ((buf[0] & NFC_SBLOCK_DESELECT) == 0)
|
if ((buf[0] & NFC_SBLOCK_DESELECT) == 0)
|
||||||
{
|
{
|
||||||
nfc_write_frame(buf, 1);
|
|
||||||
printf1(TAG_NFC, "NFC_CMD_SBLOCK, DESELECTED\r\n");
|
printf1(TAG_NFC, "NFC_CMD_SBLOCK, DESELECTED\r\n");
|
||||||
|
nfc_write_frame(buf, 1);
|
||||||
ams_wait_for_tx(2);
|
ams_wait_for_tx(2);
|
||||||
ams_write_command(AMS_CMD_SLEEP);
|
ams_write_command(AMS_CMD_SLEEP);
|
||||||
nfc_state_init();
|
nfc_state_init();
|
||||||
|
@ -41,7 +41,7 @@ typedef struct
|
|||||||
#define AID_NDEF_TYPE_4 "\xD2\x76\x00\x00\x85\x01\x01"
|
#define AID_NDEF_TYPE_4 "\xD2\x76\x00\x00\x85\x01\x01"
|
||||||
#define AID_NDEF_MIFARE_TYPE_4 "\xD2\x76\x00\x00\x85\x01\x00"
|
#define AID_NDEF_MIFARE_TYPE_4 "\xD2\x76\x00\x00\x85\x01\x00"
|
||||||
#define AID_CAPABILITY_CONTAINER "\xE1\x03"
|
#define AID_CAPABILITY_CONTAINER "\xE1\x03"
|
||||||
#define AID_NDEF_TAG "\x11\x11"
|
#define AID_NDEF_TAG "\xE1\x04"
|
||||||
#define AID_FIDO "\xa0\x00\x00\x06\x47\x2f\x00\x01"
|
#define AID_FIDO "\xa0\x00\x00\x06\x47\x2f\x00\x01"
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
Loading…
x
Reference in New Issue
Block a user