private byte[] SendCommand(byte[] command) { if (Port == null) { return(null); } Pm3UsbCommand cmd = new Pm3UsbCommand(0x313, (byte)command.Length, 1, 1, command); LogWindow.Log(LogWindow.eLogLevel.Debug, "[PM3] GetResponse: Send " + BitConverter.ToString(command).Replace("-", "")); cmd.Write(Port); while (true) { Pm3UsbResponse response = new Pm3UsbResponse(Port); switch (response.Cmd) { case Pm3UsbResponse.eResponseType.DebugString: { string debugStr = Encoding.UTF8.GetString(response.data.d, 0, response.data.dataLen); LogWindow.Log(LogWindow.eLogLevel.Debug, "[PM3] GetResponse: DebugMessage '" + debugStr + "'"); break; } case Pm3UsbResponse.eResponseType.NoData: case Pm3UsbResponse.eResponseType.Timeout: LogWindow.Log(LogWindow.eLogLevel.Debug, "[PM3] GetResponse: timeout, returning"); return(null); case Pm3UsbResponse.eResponseType.ACK: if (response.data.arg[0] > 0 && response.data.arg[0] < response.data.d.Length) { byte[] ret = new byte[response.data.arg[0]]; Array.Copy(response.data.d, ret, response.data.arg[0]); if (!ISO15693.CheckChecksum(ret)) { LogWindow.Log(LogWindow.eLogLevel.Debug, "[PM3] GetResponse: ACK, but Checksum failed"); return(null); } LogWindow.Log(LogWindow.eLogLevel.Debug, "[PM3] GetResponse: ACK, returning data"); return(ret); } else { LogWindow.Log(LogWindow.eLogLevel.Debug, "[PM3] GetResponse: no tag answered, returning"); return(null); } default: LogWindow.Log(LogWindow.eLogLevel.Debug, "[PM3] GetResponse: Unhandled: " + response.Cmd); break; } } }
private byte[] GetRandom(byte[] uid = null) { byte[] cmdIdentify = ISO15693.BuildCommand(ISO15693.Command.NXP_GET_RANDOM_NUMBER, uid, null); byte[] data = SendCommand(cmdIdentify); if (data == null || data.Length != 5) { LogWindow.Log(LogWindow.eLogLevel.Debug, "[PM3] GetRandom: Failed (" + ((data == null) ? "no resp" : (data.Length + " bytes")) + ")"); return(null); } byte[] rnd = new byte[2]; Array.Copy(data, 1, rnd, 0, 2); return(rnd); }
private byte[] ReadMemory(int bank, int tries = 1) { for (int tried = 0; tried < tries; tried++) { byte[] cmdReadMem = ISO15693.BuildCommand(ISO15693.Command.READBLOCK, new[] { (byte)bank }); byte[] data = SendCommand(cmdReadMem); if (data == null || data.Length != 7) { LogWindow.Log(LogWindow.eLogLevel.Debug, "[PM3] ReadMemory: Failed (" + ((data == null) ? "no resp" : (data.Length + " bytes")) + ")"); continue; } byte[] mem = new byte[4]; Array.Copy(data, 1, mem, 0, 4); string str = BitConverter.ToString(mem.ToArray()).Replace("-", ""); LogWindow.Log(LogWindow.eLogLevel.Debug, "[PM3] ReadMemory: ACK, returning " + str + ""); return(mem); } return(null); }
private byte[] GetUID(int tries = 1) { for (int tried = 0; tried < tries; tried++) { byte[] cmdIdentify = ISO15693.BuildCommand(ISO15693.Command.INVENTORY, new byte[1]); byte[] data = SendCommand(cmdIdentify); if (data == null || data.Length != 12) { LogWindow.Log(LogWindow.eLogLevel.Debug, "[PM3] GetUID: Failed (" + ((data == null) ? "no resp" : (data.Length + " bytes")) + ")"); continue; } byte[] uidBytes = new byte[8]; Array.Copy(data, 2, uidBytes, 0, 8); string uid = BitConverter.ToString(uidBytes.Reverse().ToArray()).Replace("-", ""); LogWindow.Log(LogWindow.eLogLevel.Debug, "[PM3] GetUID: ACK, returning " + uid.Length + " byte"); return(uidBytes); } return(null); }