#include "Packet.hpp" #include "IO.hpp" #include "u2f.hpp" #include #include #include "Streams.hpp" using namespace std; shared_ptr InitPacket::getPacket(const uint32_t rCID, const uint8_t rCMD) { auto p = make_shared(); p->cid = rCID; p->cmd = rCMD; p->bcnth = readBytes(1)[0]; p->bcntl = readBytes(1)[0]; const auto dataBytes = readBytes(p->data.size()); copy(dataBytes.begin(), dataBytes.end(), p->data.begin()); auto hPStream = getHostPacketStream().get(); fprintf(hPStream, "\t\t\n" "\t\t\t\n" "\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\n" "\t\t\t\n" "\t\t\t\n" "\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\n" "\t\t\t\n" "\t\t
CIDCMDBCNTHBCNTLDATA
0x%08X%u%u%u", p->cid, p->cmd, p->bcnth, p->bcntl); for (auto elem : dataBytes) fprintf(hPStream, "%3u ", elem); fprintf(hPStream, "
" "\t\t
"); clog << "Fully read init packet" << endl; return p; } shared_ptr ContPacket::getPacket(const uint32_t rCID, const uint8_t rSeq) { auto p = make_shared(); p->cid = rCID; p->seq = rSeq; const auto dataBytes = readBytes(p->data.size()); copy(dataBytes.begin(), dataBytes.end(), p->data.begin()); auto hPStream = getHostPacketStream().get(); fprintf(hPStream, "\t\t\n" "\t\t\t\n" "\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\n" "\t\t\t\n" "\t\t\t\n" "\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\n" "\t\t\t\n" "\t\t
CIDSEQDATA
0x%08X%u", p->cid, p->seq); for (auto elem : dataBytes) fprintf(hPStream, "%3u ", elem); fprintf(hPStream, "
\n" "\t\t
"); //clog << "Fully read cont packet" << endl; return p; } shared_ptr Packet::getPacket() { const uint32_t cid = *reinterpret_cast(readBytes(4).data()); uint8_t b = readBytes(1)[0]; //clog << "Packet read 2nd byte as " << static_cast(b) << endl; if (b & TYPE_MASK) { //Init packet return InitPacket::getPacket(cid, b); } else { //Cont packet return ContPacket::getPacket(cid, b); } } void Packet::writePacket() { memset(this->buf, 0, packetSize); memcpy(this->buf, &cid, 4); } void InitPacket::writePacket() { Packet::writePacket(); auto hostStream = getHostStream().get(); auto devStream = getComDevStream().get(); memcpy(this->buf + 4, &cmd, 1); memcpy(this->buf + 5, &bcnth, 1); memcpy(this->buf + 6, &bcntl, 1); memcpy(this->buf + 7, data.data(), data.size()); fwrite(this->buf, packetSize, 1, hostStream); fwrite(this->buf, packetSize, 1, devStream); if (errno != 0) perror("perror " __FILE__ " 85"); auto dPStream = getDevPacketStream().get(); fprintf(dPStream, "\t\t\n" "\t\t\t\n" "\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\n" "\t\t\t\n" "\t\t\t\n" "\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\n" "\t\t\t\n" "\t\t
CIDCMDBCNTHBCNTLDATA
0x%08X%u%u%u", cid, cmd, bcnth, bcntl); for (auto elem : data) fprintf(dPStream, "%3u ", elem); fprintf(dPStream, "
" "\t\t
"); clog << "Fully wrote init packet" << endl; } void ContPacket::writePacket() { Packet::writePacket(); auto hostStream = getHostStream().get(); auto devStream = getComDevStream().get(); memcpy(this->buf + 4, &seq, 1); memcpy(this->buf + 5, data.data(), data.size()); fwrite(this->buf, packetSize, 1, hostStream); fwrite(this->buf, packetSize, 1, devStream); if (errno != 0) perror("perror " __FILE__ " 107"); auto dPStream = getDevPacketStream().get(); fprintf(dPStream, "\t\t\n" "\t\t\t\n" "\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\n" "\t\t\t\n" "\t\t\t\n" "\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\n" "\t\t\t\n" "\t\t
CIDSEQDATA
0x%08X%u", cid, seq); for (auto elem : data) fprintf(dPStream, "%3u ", elem); fprintf(dPStream, "
\n" "\t\t
"); }