+ return TRUE;
+}
+
+// EM word parity test.
+// 9*5 = 45 bits in total
+// 012345678|r1
+// 012345678|r2
+// 012345678|r3
+// 012345678|r4
+// ------------
+//c012345678| 0
+// |- must be zero
+
+bool EMwordparitytest(uint8_t *bits){
+
+ // last row/col parity must be 0
+ if (bits[44] != 0 ) return FALSE;
+
+ // col parity check
+ uint8_t c1 = bytebits_to_byte(bits, 8) ^ bytebits_to_byte(bits+9, 8) ^ bytebits_to_byte(bits+18, 8) ^ bytebits_to_byte(bits+27, 8);
+ uint8_t c2 = bytebits_to_byte(bits+36, 8);
+ if ( c1 != c2 ) return FALSE;
+
+ // row parity check
+ uint8_t rowP = 0;
+ for ( uint8_t i = 0; i < 36; ++i ) {
+
+ rowP ^= bits[i];
+ if ( i>0 && (i % 9) == 0) {
+
+ if ( rowP != EVEN )
+ return FALSE;
+
+ rowP = 0;
+ }
+ }
+ // all checks ok.
+ return TRUE;
+}
+
+
+//////////////// 4050 / 4450 commands
+int usage_lf_em4x50_dump(void) {
+ PrintAndLog("Dump EM4x50/EM4x69. Tag must be on antenna. ");
+ PrintAndLog("");
+ PrintAndLog("Usage: lf em 4x50dump [h] <pwd>");
+ PrintAndLog("Options:");
+ PrintAndLog(" h - this help");
+ PrintAndLog(" pwd - password (hex) (optional)");
+ PrintAndLog("samples:");
+ PrintAndLog(" lf em 4x50dump");
+ PrintAndLog(" lf em 4x50dump 11223344");
+ return 0;
+}
+int usage_lf_em4x50_read(void) {
+ PrintAndLog("Read EM 4x50/EM4x69. Tag must be on antenna. ");
+ PrintAndLog("");
+ PrintAndLog("Usage: lf em 4x50read [h] <address> <pwd>");
+ PrintAndLog("Options:");
+ PrintAndLog(" h - this help");
+ PrintAndLog(" address - memory address to read. (0-15)");
+ PrintAndLog(" pwd - password (hex) (optional)");
+ PrintAndLog("samples:");
+ PrintAndLog(" lf em 4x50read 1");
+ PrintAndLog(" lf em 4x50read 1 11223344");
+ return 0;
+}
+int usage_lf_em4x50_write(void) {
+ PrintAndLog("Write EM 4x50/4x69. Tag must be on antenna. ");
+ PrintAndLog("");
+ PrintAndLog("Usage: lf em 4x50write [h] <address> <data> <pwd>");
+ PrintAndLog("Options:");
+ PrintAndLog(" h - this help");
+ PrintAndLog(" address - memory address to write to. (0-15)");
+ PrintAndLog(" data - data to write (hex)");
+ PrintAndLog(" pwd - password (hex) (optional)");
+ PrintAndLog("samples:");
+ PrintAndLog(" lf em 4x50write 1 deadc0de");
+ PrintAndLog(" lf em 4x50write 1 deadc0de 11223344");
+ return 0;