read all necessary files
This commit is contained in:
parent
10a40be1b0
commit
ed4f06ae90
@ -142,10 +142,10 @@ Connector::Response Connector::sendICC(int cla, int ins, int p1, int p2, int ne,
|
|||||||
}
|
}
|
||||||
sm->decrypt(DO->value);
|
sm->decrypt(DO->value);
|
||||||
response.data = DO->value;
|
response.data = DO->value;
|
||||||
logBytes("decrypted %s", response.data);
|
|
||||||
if (isPadded) {
|
if (isPadded) {
|
||||||
iso9797_unpad(response.data);
|
iso9797_unpad(response.data);
|
||||||
}
|
}
|
||||||
|
logBytes("decrypted %s", response.data);
|
||||||
response.success = true;
|
response.success = true;
|
||||||
response.code = (do99->value[0] << 8) | do99->value[1];
|
response.code = (do99->value[0] << 8) | do99->value[1];
|
||||||
}
|
}
|
||||||
@ -196,11 +196,24 @@ Connector::Response Connector::readBinaryBySFI(int sfi, int offset) {
|
|||||||
return sendICC(ISO7816_CLA::NO_SM, ISO7816_INS::READ_BINARY, sfi, offset, readAheadLength, t);
|
return sendICC(ISO7816_CLA::NO_SM, ISO7816_INS::READ_BINARY, sfi, offset, readAheadLength, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
Connector::Response Connector::readBinaryExt(int offset, int ne) {
|
Connector::Response Connector::readBinaryExt(size_t offset, size_t ne) {
|
||||||
// make data with TLV 0x54 for offset
|
int ne_nbyte = bytecount(ne);
|
||||||
bytes data;
|
int addBytes = 1 + ne_nbyte + (ne > 0x80 ? 1 : 0);
|
||||||
int truncated_offset;
|
if (ne <= 256) {
|
||||||
return sendICC(ISO7816_CLA::NO_SM, ISO7816_INS::READ_BINARY_EXT, 0, 0, truncated_offset, data);
|
ne = ne + addBytes < 256 ? ne + addBytes : 256;
|
||||||
|
} else {
|
||||||
|
ne = ne + addBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes data = num2bytes(offset);
|
||||||
|
data.erase(data.begin(), data.end() - bytecount(offset));
|
||||||
|
TLV(0x54, data);
|
||||||
|
return sendICC(ISO7816_CLA::NO_SM, ISO7816_INS::READ_BINARY_EXT, 0, 0, ne, data);
|
||||||
|
}
|
||||||
|
Connector::Response Connector::readBinaryNormal(size_t offset, size_t toRead) {
|
||||||
|
LOGI("Read normal offset=%d len=%d");
|
||||||
|
bytes t;
|
||||||
|
return sendICC(ISO7816_CLA::NO_SM, ISO7816_INS::READ_BINARY, offset >> 8, offset & 0xff, toRead, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Connector::selectDf1() {
|
bool Connector::selectDf1() {
|
||||||
@ -314,7 +327,82 @@ void Connector::initBAC() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bytes Connector::readFileBySFI(int sfi) {
|
||||||
|
auto seek = readBinaryBySFI(sfi, 0);
|
||||||
|
auto t = TLV(seek.data, false);
|
||||||
|
|
||||||
|
// [TAG | LENGTH | DATA]
|
||||||
|
// LENGTH denotes DATA length
|
||||||
|
// but we seek 8 bytes a head so we must offset with correct length
|
||||||
|
auto length = t.length - (seek.data.size() - t.size);
|
||||||
|
auto rest = readBinary(seek.data.size(), length);
|
||||||
|
|
||||||
|
bytes content;
|
||||||
|
content.insert(content.end(), seek.data.begin(), seek.data.end());
|
||||||
|
content.insert(content.end(), rest.begin(), rest.end());
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes Connector::readBinary(size_t offset, size_t length) {
|
||||||
|
bytes r;
|
||||||
|
const size_t maxToRead = 256;
|
||||||
|
|
||||||
|
LOGI("INIT READ FILE offset=%d len=%d", offset, length);
|
||||||
|
while (length > 0) {
|
||||||
|
size_t toRead = length > maxToRead ? maxToRead : length;
|
||||||
|
LOGI("READ FILE offset=%d len=%d", offset, toRead);
|
||||||
|
Connector::Response response;
|
||||||
|
if (offset > 0x7fff) {
|
||||||
|
// extended read
|
||||||
|
response = readBinaryExt(offset, toRead);
|
||||||
|
} else {
|
||||||
|
// normal read
|
||||||
|
if (offset + toRead > 0x7fff) {
|
||||||
|
toRead = 0x7fff - offset;
|
||||||
|
}
|
||||||
|
response = readBinaryNormal(offset, toRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
const int s = response.data.size();
|
||||||
|
r.insert(r.end(), response.data.begin(), response.data.end());
|
||||||
|
offset += s;
|
||||||
|
length -= s;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
void Connector::readEFCOM() {
|
void Connector::readEFCOM() {
|
||||||
auto binary = readBinaryBySFI(EFCOM_SFI, 0);
|
auto content = readFileBySFI(EFCOM_SFI);
|
||||||
auto decoded = TLV(binary.data);
|
LOGI("FILE COM size %d", content.size());
|
||||||
|
logBytes("FILE COM %s", content);
|
||||||
|
}
|
||||||
|
void Connector::readEFDG1() {
|
||||||
|
auto content = readFileBySFI(EFDG1_SFI);
|
||||||
|
LOGI("FILE DG1 size %d", content.size());
|
||||||
|
logBytes("FILE DG1 %s", content);
|
||||||
|
}
|
||||||
|
void Connector::readEFDG2() {
|
||||||
|
auto content = readFileBySFI(EFDG2_SFI);
|
||||||
|
LOGI("FILE DG2 size %d", content.size());
|
||||||
|
logBytes("FILE DG2 %s", content);
|
||||||
|
}
|
||||||
|
void Connector::readEFDG13() {
|
||||||
|
auto content = readFileBySFI(EFDG13_SFI);
|
||||||
|
LOGI("FILE DG13 size %d", content.size());
|
||||||
|
logBytes("FILE DG13 %s", content);
|
||||||
|
}
|
||||||
|
void Connector::readEFDG14() {
|
||||||
|
auto content = readFileBySFI(EFDG14_SFI);
|
||||||
|
LOGI("FILE DG14 size %d", content.size());
|
||||||
|
logBytes("FILE DG14 %s", content);
|
||||||
|
}
|
||||||
|
void Connector::readEFDG15() {
|
||||||
|
auto content = readFileBySFI(EFDG15_SFI);
|
||||||
|
LOGI("FILE DG15 size %d", content.size());
|
||||||
|
logBytes("FILE DG15 %s", content);
|
||||||
|
}
|
||||||
|
void Connector::readEFSOD() {
|
||||||
|
auto content = readFileBySFI(EFSOD_SFI);
|
||||||
|
LOGI("FILE SOD size %d", content.size());
|
||||||
|
logBytes("FILE SOD %s", content);
|
||||||
}
|
}
|
@ -27,7 +27,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// decode to TLV
|
// decode to TLV
|
||||||
TLV(bytes data) {
|
TLV(bytes data, bool full = true) {
|
||||||
size_t offset = 0;
|
size_t offset = 0;
|
||||||
tag = data[offset++];
|
tag = data[offset++];
|
||||||
if (tag == 0x1f) {
|
if (tag == 0x1f) {
|
||||||
@ -43,12 +43,16 @@ public:
|
|||||||
if (length_nbyte > 3) {
|
if (length_nbyte > 3) {
|
||||||
throw "length too big to decode";
|
throw "length too big to decode";
|
||||||
}
|
}
|
||||||
|
length = 0;
|
||||||
for (size_t i = 0; i < length_nbyte; i++) {
|
for (size_t i = 0; i < length_nbyte; i++) {
|
||||||
length <<= 8;
|
length <<= 8;
|
||||||
length |= data[offset++];
|
length |= data[offset++];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size = offset;
|
||||||
|
if (!full) return;
|
||||||
|
|
||||||
value.insert(value.end(), data.begin() + offset, data.begin() + offset + length);
|
value.insert(value.end(), data.begin() + offset, data.begin() + offset + length);
|
||||||
size = offset + length;
|
size = offset + length;
|
||||||
}
|
}
|
||||||
@ -72,7 +76,7 @@ public:
|
|||||||
bytes encoded;
|
bytes encoded;
|
||||||
encoded.insert(encoded.end(), tag_encoded.begin(), tag_encoded.end());
|
encoded.insert(encoded.end(), tag_encoded.begin(), tag_encoded.end());
|
||||||
encoded.insert(encoded.end(), len_encoded.begin(), len_encoded.end());
|
encoded.insert(encoded.end(), len_encoded.begin(), len_encoded.end());
|
||||||
encoded.insert(value.end(), value.begin(), value.end());
|
encoded.insert(encoded.end(), value.begin(), value.end());
|
||||||
return encoded;
|
return encoded;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -218,9 +222,11 @@ private:
|
|||||||
Connector::Response externalAuthenticate(bytes& eifd, uint64_t mifd);
|
Connector::Response externalAuthenticate(bytes& eifd, uint64_t mifd);
|
||||||
|
|
||||||
Connector::Response readBinaryBySFI(int sfi, int offset);
|
Connector::Response readBinaryBySFI(int sfi, int offset);
|
||||||
Connector::Response readBinaryExt(int offset, int ne);
|
Connector::Response readBinaryExt(size_t offset, size_t ne);
|
||||||
|
Connector::Response readBinaryNormal(size_t offset, size_t ne);
|
||||||
|
|
||||||
// setupSecureMessaging();
|
bytes readFileBySFI(int sfi);
|
||||||
|
bytes readBinary(size_t offset, size_t length);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
transceive_type transceive;
|
transceive_type transceive;
|
||||||
@ -233,6 +239,13 @@ public:
|
|||||||
bool selectDf1();
|
bool selectDf1();
|
||||||
void initBAC();
|
void initBAC();
|
||||||
void readEFCOM();
|
void readEFCOM();
|
||||||
|
void readEFDG1();
|
||||||
|
void readEFDG2();
|
||||||
|
void readEFDG13();
|
||||||
|
void readEFDG14();
|
||||||
|
void readEFDG15();
|
||||||
|
void readEFSOD();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //CCCC_API_H
|
#endif //CCCC_API_H
|
||||||
|
@ -65,4 +65,14 @@ constexpr int defaultSelectP2 = (ISO97816_SelectFileP2::returnFCP | ISO
|
|||||||
constexpr uint8_t Df1Name[] = {0xA0,0x00,0x00,0x02,0x47,0x10,0x01};
|
constexpr uint8_t Df1Name[] = {0xA0,0x00,0x00,0x02,0x47,0x10,0x01};
|
||||||
constexpr uint8_t EFCOM_SFI = 0x1e;
|
constexpr uint8_t EFCOM_SFI = 0x1e;
|
||||||
|
|
||||||
|
constexpr uint8_t EFDG1_SFI = 0x01;
|
||||||
|
constexpr uint8_t EFDG2_SFI = 0x02;
|
||||||
|
constexpr uint8_t EFDG13_SFI = 0x0d;
|
||||||
|
constexpr uint8_t EFDG14_SFI = 0x0e;
|
||||||
|
constexpr uint8_t EFDG15_SFI = 0x0f;
|
||||||
|
constexpr uint8_t EFSOD_SFI = 0x1d;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif //CCCC_CONSTS_H
|
#endif //CCCC_CONSTS_H
|
||||||
|
@ -22,7 +22,14 @@ Java_com_bshield_cccc_MainActivity_initNFCScan(
|
|||||||
|
|
||||||
connector->selectDf1();
|
connector->selectDf1();
|
||||||
connector->initBAC();
|
connector->initBAC();
|
||||||
|
|
||||||
connector->readEFCOM();
|
connector->readEFCOM();
|
||||||
|
connector->readEFDG1();
|
||||||
|
connector->readEFDG2();
|
||||||
|
connector->readEFDG13();
|
||||||
|
connector->readEFDG14();
|
||||||
|
connector->readEFDG15();
|
||||||
|
connector->readEFSOD();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user