|
@@ -9,9 +9,9 @@ FreeFareTagBusiness::FreeFareTagBusiness(std::shared_ptr<FreeFareTag> tag)
|
9
|
9
|
{
|
10
|
10
|
}
|
11
|
11
|
|
12
|
|
-ResultBool FreeFareTagBusiness::authenticate(int sector, int block, std::string key, int keyType)
|
|
12
|
+ResultBool FreeFareTagBusiness::authenticate(int sector, std::string key, int keyType)
|
13
|
13
|
{
|
14
|
|
- return _tag->authenticate(sector, block, key, keyType);
|
|
14
|
+ return _tag->authenticate(sector, key, keyType);
|
15
|
15
|
}
|
16
|
16
|
|
17
|
17
|
ResultString FreeFareTagBusiness::readBlock(int sector, int block, std::string key, int keyType)
|
|
@@ -52,33 +52,29 @@ std::shared_ptr<FreeFareTag> FreeFareTagBusiness::getTag() const
|
52
|
52
|
|
53
|
53
|
Result<MappedKeys> FreeFareTagBusiness::mapKeys(std::vector<std::string> keys, std::function<void(int, int)> cb)
|
54
|
54
|
{
|
55
|
|
- std::vector<std::vector<std::pair<std::string, std::string>>> mappedKeys;
|
|
55
|
+ MappedKeys mappedKeys;
|
56
|
56
|
|
57
|
57
|
for (int i = 0; i < 16; ++i) {
|
58
|
|
- std::vector<std::pair<std::string, std::string>> sectorKeys;
|
59
|
|
- for (int j = 0; j < 4; ++j) {
|
60
|
|
- std::pair<std::string, std::string> blockKeys;
|
61
|
|
- for (int k = 0; k < keys.size(); ++k) {
|
62
|
|
- auto key = keys[k];
|
63
|
|
- if (authenticate(i, j, key, MFC_KEY_A)) {
|
64
|
|
- blockKeys.first = key;
|
65
|
|
- }
|
66
|
|
- if (authenticate(i, j, key, MFC_KEY_B)) {
|
67
|
|
- blockKeys.second = key;
|
68
|
|
- }
|
69
|
|
- if (cb != 0) {
|
70
|
|
- cb((i * 4 * keys.size()) + (j * keys.size()) + k + 1, 16 * 4 * keys.size());
|
71
|
|
- }
|
72
|
|
- if (!blockKeys.first.empty() && !blockKeys.second.empty()) {
|
73
|
|
- break;
|
74
|
|
- }
|
|
58
|
+ std::pair<std::string, std::string> blockKeys;
|
|
59
|
+ for (int k = 0; k < keys.size(); ++k) {
|
|
60
|
+ auto key = keys[k];
|
|
61
|
+ if (authenticate(i, key, MFC_KEY_A)) {
|
|
62
|
+ blockKeys.first = key;
|
|
63
|
+ }
|
|
64
|
+ if (authenticate(i, key, MFC_KEY_B)) {
|
|
65
|
+ blockKeys.second = key;
|
|
66
|
+ }
|
|
67
|
+ if (cb != 0) {
|
|
68
|
+ cb((i * keys.size()) + k + 1, 16 * keys.size());
|
|
69
|
+ }
|
|
70
|
+ if (!blockKeys.first.empty() && !blockKeys.second.empty()) {
|
|
71
|
+ break;
|
75
|
72
|
}
|
76
|
|
- sectorKeys.push_back(blockKeys);
|
77
|
73
|
}
|
78
|
|
- mappedKeys.push_back(sectorKeys);
|
|
74
|
+ mappedKeys.push_back(blockKeys);
|
79
|
75
|
}
|
80
|
76
|
|
81
|
|
- return Result<std::vector<std::vector<std::pair<std::string, std::string>>>>::ok(mappedKeys);
|
|
77
|
+ return Result<MappedKeys>::ok(mappedKeys);
|
82
|
78
|
}
|
83
|
79
|
|
84
|
80
|
Result<std::vector<SectorDbo>> FreeFareTagBusiness::dump(MappedKeys keys, std::function<void(int, int)> cb)
|
|
@@ -86,30 +82,23 @@ Result<std::vector<SectorDbo>> FreeFareTagBusiness::dump(MappedKeys keys, std::f
|
86
|
82
|
if (keys.size() != 16) {
|
87
|
83
|
return Result<std::vector<SectorDbo>>::error("Must have 16 sectors");
|
88
|
84
|
}
|
89
|
|
- for (int i = 0; i < keys.size(); ++i) {
|
90
|
|
- auto key = keys[i];
|
91
|
|
- if (key.size() != 4) {
|
92
|
|
- return Result<std::vector<SectorDbo>>::error("Must have 4 keys in sector " + i);
|
93
|
|
- }
|
94
|
|
- }
|
95
|
85
|
std::vector<SectorDbo> sectors;
|
96
|
86
|
for (int s = 0; s < keys.size(); ++s) {
|
97
|
|
- auto sectorKeys = keys[s];
|
|
87
|
+ auto sectorKey = keys[s];
|
98
|
88
|
SectorDbo sector;
|
99
|
89
|
bool keyA = false;
|
100
|
90
|
bool keyB = false;
|
101
|
|
- for (int b = 0; b < sectorKeys.size() - 1; ++b) {
|
102
|
|
- auto blockKey = sectorKeys[b];
|
|
91
|
+ for (int b = 0; b < 3; ++b) {
|
103
|
92
|
std::string data = "";
|
104
|
|
- if (!blockKey.first.empty()) {
|
105
|
|
- auto blockResult = readBlock(s, b, blockKey.first, MFC_KEY_A);
|
|
93
|
+ if (!sectorKey.first.empty()) {
|
|
94
|
+ auto blockResult = readBlock(s, b, sectorKey.first, MFC_KEY_A);
|
106
|
95
|
if (blockResult) {
|
107
|
96
|
data = blockResult.getData();
|
108
|
97
|
keyA = true;
|
109
|
98
|
}
|
110
|
99
|
}
|
111
|
|
- if (!blockKey.second.empty()) {
|
112
|
|
- auto blockResult = readBlock(s, b, blockKey.second, MFC_KEY_B);
|
|
100
|
+ if (!sectorKey.second.empty()) {
|
|
101
|
+ auto blockResult = readBlock(s, b, sectorKey.second, MFC_KEY_B);
|
113
|
102
|
if (blockResult) {
|
114
|
103
|
if (data.empty()) {
|
115
|
104
|
data = blockResult.getData();
|
|
@@ -119,37 +108,36 @@ Result<std::vector<SectorDbo>> FreeFareTagBusiness::dump(MappedKeys keys, std::f
|
119
|
108
|
}
|
120
|
109
|
sector.setBlock(b, data);
|
121
|
110
|
if (cb != 0) {
|
122
|
|
- cb((s * sectorKeys.size()) + b + 1, keys.size() * sectorKeys.size());
|
|
111
|
+ cb((s * 4) + b + 1, keys.size() * 4);
|
123
|
112
|
}
|
124
|
113
|
}
|
125
|
|
- int b = sectorKeys.size() - 1;
|
126
|
|
- auto blockKey = sectorKeys[b];
|
|
114
|
+ int b = 3;
|
127
|
115
|
std::string dataA = "";
|
128
|
116
|
std::string dataB = "";
|
129
|
|
- if (!blockKey.first.empty()) {
|
130
|
|
- auto blockResult = readBlock(s, b, blockKey.first, MFC_KEY_A);
|
|
117
|
+ if (!sectorKey.first.empty()) {
|
|
118
|
+ auto blockResult = readBlock(s, b, sectorKey.first, MFC_KEY_A);
|
131
|
119
|
if (blockResult) {
|
132
|
120
|
dataA = blockResult.getData();
|
133
|
121
|
keyA = true;
|
134
|
122
|
}
|
135
|
123
|
}
|
136
|
|
- if (!blockKey.second.empty()) {
|
137
|
|
- auto blockResult = readBlock(s, b, blockKey.second, MFC_KEY_B);
|
|
124
|
+ if (!sectorKey.second.empty()) {
|
|
125
|
+ auto blockResult = readBlock(s, b, sectorKey.second, MFC_KEY_B);
|
138
|
126
|
if (blockResult) {
|
139
|
127
|
dataB = blockResult.getData();
|
140
|
128
|
keyB = true;
|
141
|
129
|
}
|
142
|
130
|
}
|
143
|
131
|
if (cb != 0) {
|
144
|
|
- cb((s * sectorKeys.size()) + b + 1, keys.size() * sectorKeys.size());
|
|
132
|
+ cb((s * 4) + b + 1, keys.size() * 4);
|
145
|
133
|
}
|
146
|
134
|
|
147
|
135
|
sector.setBlock(b, dataA);
|
148
|
136
|
AccessBitsDbo accessBitsDboA = sector.getAccessBitsDbo();
|
149
|
137
|
sector.setBlock(b, dataB);
|
150
|
138
|
AccessBitsDbo accessBitsDboB = sector.getAccessBitsDbo();
|
151
|
|
- sector.setKeyA(keyA ? blockKey.first : "");
|
152
|
|
- sector.setKeyB(keyB ? blockKey.second : "");
|
|
139
|
+ sector.setKeyA(keyA ? sectorKey.first : "");
|
|
140
|
+ sector.setKeyB(keyB ? sectorKey.second : "");
|
153
|
141
|
|
154
|
142
|
std::string accessBits;
|
155
|
143
|
if (keyA && accessBitsDboA.canKeyAReadAccessBitsTrailer()) {
|