32 static inline void encodeDecodeBlock(uint32_t *block) {
37 *block ^= (*block & 0x00C00000) << 6 | (*block & 0x0000C000) << 12 | (*block & 0x000000C0) << 18 |
38 (*block & 0x000C0000) >> 6 | (*block & 0x00030000) >> 12 | (*block & 0x00000300) >> 6;
39 *block ^= (*block & 0x30000000) >> 6 | (*block & 0x0C000000) >> 12 | (*block & 0x03000000) >> 18 |
40 (*block & 0x00003000) << 6 | (*block & 0x00000030) << 12 | (*block & 0x0000000C) << 6;
41 *block ^= (*block & 0x00C00000) << 6 | (*block & 0x0000C000) << 12 | (*block & 0x000000C0) << 18 |
42 (*block & 0x000C0000) >> 6 | (*block & 0x00030000) >> 12 | (*block & 0x00000300) >> 6;
50 static uint8_t getCurrentTransactionOffset(
MyKey *key) {
54 if (*block3C == 0xFFFFFFFF) {
60 encodeDecodeBlock(¤t);
62 if ((current & 0x00FF0000 >> 16) > 0x07) {
76 static inline void calculateBlockChecksum(uint32_t *block,
const uint8_t blockNum) {
77 uint8_t checksum = 0xFF - blockNum - (*block & 0x0F) - (*block >> 4 & 0x0F) - (*block >> 8 & 0x0F) -
78 (*block >> 12 & 0x0F) - (*block >> 16 & 0x0F) - (*block >> 20 & 0x0F);
82 *block |= checksum << 24;
92 static uint32_t daysDifference(uint8_t day, uint8_t month, uint16_t year) {
97 return year * 365 + year / 4 - year / 100 + year / 400 + (month * 153 + 3) / 5 + day - 728692;
107 uint32_t otp = ~(*block6 << 24 | *block6 & 0x0000FF00 << 8 |
108 *block6 & 0x00FF0000 >> 8 | *block6 >> 24) + 1;
132 static const uint32_t block18Reset = 0x8FCD0F48;
133 static const uint32_t block19Reset = 0xC0820007;
144 encodeDecodeBlock(&creditCheck);
147 uint8_t checksum = creditCheck >> 24;
150 calculateBlockChecksum(&creditCheck, 0x21);
153 return (*
SrixGetBlock(key->
srix4k, 0x05) & 0x000000FF) == 0x7F && checksum != creditCheck >> 24;
158 return block ? *block : 0;
171 uint32_t block18 = vendor >> 16;
172 calculateBlockChecksum(&block18, 0x18);
173 encodeDecodeBlock(&block18);
176 uint32_t block19 = vendor & 0x0000FFFF;
177 calculateBlockChecksum(&block19, 0x19);
178 encodeDecodeBlock(&block19);
228 uint32_t currentBlock;
240 uint8_t day = (*productionDate >> 28 & 0x0F) * 10 + (*productionDate >> 24 & 0x0F);
241 uint8_t month = (*productionDate >> 20 & 0x0F) * 10 + (*productionDate >> 16 & 0x0F);
242 uint16_t year = (*productionDate & 0x0F) * 1000 +
243 (*productionDate >> 4 & 0x0F) * 100 +
244 (*productionDate >> 12 & 0x0F) * 10 +
245 (*productionDate >> 8 & 0x0F);
247 uint32_t elapsed = daysDifference(day, month, year);
249 ((elapsed / 1000 % 10) << 12) + ((elapsed / 100 % 10) << 8) |
250 ((elapsed / 10 % 10) << 4) + (elapsed % 10);
251 calculateBlockChecksum(¤tBlock, i);
261 calculateBlockChecksum(¤tBlock, i);
270 currentBlock = (*productionDate & 0x0000FF00) << 8 | (*productionDate & 0x00FF0000) >> 8 |
271 *productionDate & 0x000000FF;
272 calculateBlockChecksum(¤tBlock, i);
273 encodeDecodeBlock(¤tBlock);
283 calculateBlockChecksum(¤tBlock, i);
291 currentBlock = 0x00040013;
292 calculateBlockChecksum(¤tBlock, i);
300 currentBlock = 0x0000FEDC;
301 calculateBlockChecksum(¤tBlock, i);
302 encodeDecodeBlock(¤tBlock);
310 currentBlock = 0x00000123;
311 calculateBlockChecksum(¤tBlock, i);
312 encodeDecodeBlock(¤tBlock);
320 calculateBlockChecksum(¤tBlock, i);
321 encodeDecodeBlock(¤tBlock);
330 currentBlock = 0x00010000;
331 calculateBlockChecksum(¤tBlock, i);
332 encodeDecodeBlock(¤tBlock);
351 calculateBlockChecksum(¤tBlock, i);
352 encodeDecodeBlock(¤tBlock);
356 currentBlock = 0xFFFFFFFF;
369 encodeDecodeBlock(¤tCredit);
370 return currentCredit;
392 uint16_t precedentCredit;
396 uint8_t current = getCurrentTransactionOffset(key);
401 precedentCredit = actualCredit;
404 if (cents / 200 > 0) {
408 }
else if (cents / 100 > 0) {
412 }
else if (cents / 50 > 0) {
416 }
else if (cents / 20 > 0) {
420 }
else if (cents / 10 > 0) {
424 }
else if (cents / 5 > 0) {
431 actualCredit += cents;
435 current = (current == 7) ? 0 : current + 1;
444 calculateBlockChecksum(block21, 0x21);
445 encodeDecodeBlock(block21);
450 calculateBlockChecksum(block25, 0x25);
451 encodeDecodeBlock(block25);
457 calculateBlockChecksum(block23, 0x23);
458 encodeDecodeBlock(block23);
462 calculateBlockChecksum(block27, 0x27);
463 encodeDecodeBlock(block27);
468 calculateBlockChecksum(block3C, 0x3C);
469 encodeDecodeBlock(block3C);
483 calculateBlockChecksum(block21, 0x21);
484 encodeDecodeBlock(block21);