|
@@ -142,21 +142,44 @@ static bool emv_decode_response(uint8_t* buff, uint16_t len, EmvApplication* app
|
|
|
success = true;
|
|
success = true;
|
|
|
FURI_LOG_T(TAG, "found EMV_TAG_AFL %x (len=%d)", tag, tlen);
|
|
FURI_LOG_T(TAG, "found EMV_TAG_AFL %x (len=%d)", tag, tlen);
|
|
|
break;
|
|
break;
|
|
|
- case EMV_TAG_CARD_NUM: // Track 2 Equivalent Data. 0xD0 delimits PAN from expiry (YYMM)
|
|
|
|
|
|
|
+ case EMV_TAG_TRACK_1_EQUIV: {
|
|
|
|
|
+ char track_1_equiv[80];
|
|
|
|
|
+ memcpy(track_1_equiv, &buff[i], tlen);
|
|
|
|
|
+ track_1_equiv[tlen] = '\0';
|
|
|
|
|
+ success = true;
|
|
|
|
|
+ FURI_LOG_T(TAG, "found EMV_TAG_TRACK_1_EQUIV %x : %s", tag, track_1_equiv);
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case EMV_TAG_TRACK_2_EQUIV: {
|
|
|
|
|
+ // 0xD0 delimits PAN from expiry (YYMM)
|
|
|
for(int x = 1; x < tlen; x++) {
|
|
for(int x = 1; x < tlen; x++) {
|
|
|
if(buff[i + x + 1] > 0xD0) {
|
|
if(buff[i + x + 1] > 0xD0) {
|
|
|
memcpy(app->card_number, &buff[i], x + 1);
|
|
memcpy(app->card_number, &buff[i], x + 1);
|
|
|
app->card_number_len = x + 1;
|
|
app->card_number_len = x + 1;
|
|
|
|
|
+ app->exp_year = (buff[i + x + 1] << 4) | (buff[i + x + 2] >> 4);
|
|
|
|
|
+ app->exp_month = (buff[i + x + 2] << 4) | (buff[i + x + 3] >> 4);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // Convert 4-bit to ASCII representation
|
|
|
|
|
+ char track_2_equiv[41];
|
|
|
|
|
+ uint8_t track_2_equiv_len = 0;
|
|
|
|
|
+ for(int x = 0; x < tlen; x++) {
|
|
|
|
|
+ char top = (buff[i + x] >> 4) + '0';
|
|
|
|
|
+ char bottom = (buff[i + x] & 0x0F) + '0';
|
|
|
|
|
+ track_2_equiv[x * 2] = top;
|
|
|
|
|
+ track_2_equiv_len++;
|
|
|
|
|
+ if(top == '?') break;
|
|
|
|
|
+ track_2_equiv[x * 2 + 1] = bottom;
|
|
|
|
|
+ track_2_equiv_len++;
|
|
|
|
|
+ if(bottom == '?') break;
|
|
|
|
|
+ }
|
|
|
|
|
+ track_2_equiv[track_2_equiv_len] = '\0';
|
|
|
success = true;
|
|
success = true;
|
|
|
- FURI_LOG_T(
|
|
|
|
|
- TAG,
|
|
|
|
|
- "found EMV_TAG_CARD_NUM %x (len=%d)",
|
|
|
|
|
- EMV_TAG_CARD_NUM,
|
|
|
|
|
- app->card_number_len);
|
|
|
|
|
|
|
+ FURI_LOG_T(TAG, "found EMV_TAG_TRACK_2_EQUIV %x : %s", tag, track_2_equiv);
|
|
|
break;
|
|
break;
|
|
|
|
|
+ }
|
|
|
case EMV_TAG_PAN:
|
|
case EMV_TAG_PAN:
|
|
|
memcpy(app->card_number, &buff[i], tlen);
|
|
memcpy(app->card_number, &buff[i], tlen);
|
|
|
app->card_number_len = tlen;
|
|
app->card_number_len = tlen;
|