read all necessary files

This commit is contained in:
nganhkhoa 2023-03-01 17:08:28 +07:00
parent 10a40be1b0
commit ed4f06ae90
4 changed files with 130 additions and 12 deletions

View File

@ -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);
} }

View File

@ -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

View File

@ -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

View File

@ -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;
} }