- return CheckCrc14443(CRC_14443_A, buf, cmdsize);
-}
\ No newline at end of file
+ if (!CheckCrypto1Parity(cmd, cmdsize, buf, parity))
+ return false;
+
+ if(!CheckCrc14443(CRC_14443_A, buf, cmdsize))
+ return false;
+
+ AuthData.ks2 = AuthData.ar_enc ^ ar;
+ AuthData.ks3 = AuthData.at_enc ^ at;
+
+ return true;
+}
+
+bool CheckCrypto1Parity(uint8_t *cmd_enc, uint8_t cmdsize, uint8_t *cmd, uint8_t *parity_enc) {
+ for (int i = 0; i < cmdsize - 1; i++) {
+ if (oddparity8(cmd[i]) ^ (cmd[i + 1] & 0x01) ^ ((parity_enc[i / 8] >> (7 - i % 8)) & 0x01) ^ (cmd_enc[i + 1] & 0x01))
+ return false;
+ }
+
+ return true;
+}