123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- //
- // Created by robin on 7/22/16.
- //
-
- #include "FreeFareTagBusiness.h"
-
- FreeFareTagBusiness::FreeFareTagBusiness(std::shared_ptr<FreeFareTag> tag)
- : _tag(tag)
- {
- }
-
- ResultBool FreeFareTagBusiness::authenticate(int sector, int block, std::string key, int keyType)
- {
- return _tag->authenticate(sector, block, key, keyType);
- }
-
- ResultString FreeFareTagBusiness::readBlock(int sector, int block, std::string key, int keyType)
- {
- return _tag->readBlock(sector, block, key, keyType);
- }
-
- Result<SectorDbo> FreeFareTagBusiness::readSector(int sector, std::string key, int keyType)
- {
- std::string res;
- int lastBlock = _tag->getSectorBlockCount(sector);
- for (int i = 0; i < lastBlock; ++i) {
- auto data = readBlock(sector, i, key, keyType);
- if (data) {
- res += data.getData();
- }
- else {
- return Result<SectorDbo>::error(data);
- }
- }
- return Result<SectorDbo>::ok(SectorDbo(res));
- }
-
- const std::string &FreeFareTagBusiness::getUid() const
- {
- return _tag->getUid();
- }
-
- freefare_tag_type FreeFareTagBusiness::getType() const
- {
- return _tag->getType();
- }
-
- std::shared_ptr<FreeFareTag> FreeFareTagBusiness::getTag() const
- {
- return _tag;
- }
-
- Result<MappedKeys> FreeFareTagBusiness::mapKeys(std::vector<std::string> keys)
- {
- std::vector<std::vector<std::pair<std::string, std::string>>> mappedKeys;
-
- for (int i = 0; i < 16; ++i) {
- std::vector<std::pair<std::string, std::string>> sectorKeys;
- for (int j = 0; j < 4; ++j) {
- std::pair<std::string, std::string> blockKeys;
- for (auto key : keys) {
- if (authenticate(i, j, key, MFC_KEY_A)) {
- blockKeys.first = key;
- }
- if (authenticate(i, j, key, MFC_KEY_B)) {
- blockKeys.second = key;
- }
- if (!blockKeys.first.empty() && !blockKeys.second.empty()) {
- break;
- }
- }
- sectorKeys.push_back(blockKeys);
- }
- mappedKeys.push_back(sectorKeys);
- }
-
- return Result<std::vector<std::vector<std::pair<std::string, std::string>>>>::ok(mappedKeys);
- }
-
- Result<std::vector<SectorDbo>> FreeFareTagBusiness::dump(MappedKeys keys)
- {
- if (keys.size() != 16) {
- return Result<std::vector<SectorDbo>>::error("Must have 16 sectors");
- }
- for (int i = 0; i < keys.size(); ++i) {
- auto key = keys[i];
- if (key.size() != 4) {
- return Result<std::vector<SectorDbo>>::error("Must have 4 keys in sector " + i);
- }
- }
- std::vector<SectorDbo> sectors;
- for (int s = 0; s < keys.size(); ++s) {
- auto sectorKeys = keys[s];
- SectorDbo sector;
- bool keyA = false;
- bool keyB = false;
- for (int b = 0; b < sectorKeys.size() - 1; ++b) {
- auto blockKey = sectorKeys[b];
- std::string data = "";
- if (!blockKey.first.empty()) {
- auto blockResult = readBlock(s, b, blockKey.first, MFC_KEY_A);
- if (blockResult) {
- data = blockResult.getData();
- keyA = true;
- }
- }
- if (!blockKey.second.empty()) {
- auto blockResult = readBlock(s, b, blockKey.second, MFC_KEY_B);
- if (blockResult) {
- data = blockResult.getData();
- keyB = true;
- }
- }
- sector.setBlock(b, data);
- }
- int b = sectorKeys.size() - 1;
- auto blockKey = sectorKeys[b];
- std::string data = "";
- if (!blockKey.first.empty()) {
- auto blockResult = readBlock(s, b, blockKey.first, MFC_KEY_A);
- if (blockResult) {
- data = blockResult.getData();
- keyA = true;
- }
- }
- if (!blockKey.second.empty()) {
- auto blockResult = readBlock(s, b, blockKey.second, MFC_KEY_B);
- if (blockResult) {
- data = blockResult.getData();
- keyB = true;
- }
- }
- sector.setBlock(b, data);
- AccessBitsDbo accessBitsDbo = sector.getAccessBitsDbo();
-
- sector.setKeyA(keyA ? blockKey.first : "");
- sector.setKeyB(keyB ? blockKey.second : "");
- std::string accessBits;
- if (!data.empty())
- {
- if ((keyA && accessBitsDbo.canKeyAReadAccessBitsTrailer()) || (keyB && accessBitsDbo.canKeyBReadAccessBitsTrailer())) {
- accessBits = accessBitsDbo.getBits();
- }
- }
- sector.setAccessBits(accessBits);
-
- sectors.push_back(sector);
- }
-
- return Result<std::vector<SectorDbo>>::ok(sectors);
- }
-
- Result<std::vector<SectorDbo>> FreeFareTagBusiness::dump(std::vector<std::string> keys)
- {
- auto mappedKeysResult = mapKeys(keys);
- if (!mappedKeysResult) {
- return Result<std::vector<SectorDbo>>::error(mappedKeysResult);
- }
- return dump(mappedKeysResult.getData());
- }
|