package cvend import ( "bytes" "encoding/binary" "encoding/hex" "log" "pm3.dev/ipp" ) const Path = "/dev/ttymxc3" func OpenIPP(handler ipp.Handler) (ipp.Session, error) { return ipp.Open(Path, handler) } func LogIPP(msgType byte, msgData []byte) { switch msgType { case 0x07: log.Printf("Heartbeat(%s)", hex.EncodeToString(msgData)) case 0x0f: log.Printf("Startup(%s)", hex.EncodeToString(msgData)) case 0xed: if len(msgData) == 0 { log.Printf("Log()") } else { log.Printf("Log(%d) %s", msgData[0], string(bytes.TrimSuffix(msgData[1:], []byte{0}))) } case 0xb1: if len(msgData) < 9 { log.Printf("ISORead(short)\n%s", hex.Dump(msgData)) } else { uid := msgData[2:9] log.Printf("ISORead(uid %s)\n%s", hex.EncodeToString(uid), hex.Dump(msgData)) } case 0xb3: log.Printf("ISOCardReleased\n%s", hex.Dump(msgData)) case 0xb5: log.Printf("APDUProxReply\n%s", hex.Dump(msgData)) case 0xb9: if len(msgData) < 11 { log.Printf("DESFireRead(short)\n%s", hex.Dump(msgData)) } else { uid := msgData[4:11] log.Printf("DESFireRead(uid %s)\n%s", hex.EncodeToString(uid), hex.Dump(msgData)) } case 0xbb: log.Printf("DESFireCardRemoved\n%s", hex.Dump(msgData)) case 0xbe: if len(msgData) < 22 || len(msgData) < 22+int(msgData[21]) { log.Printf("UnhandledCard(short)\n%s", hex.Dump(msgData)) } else { _ = msgData[:11] // unknown uid := msgData[11:18] atqa := binary.LittleEndian.Uint16(msgData[18:20]) sak := msgData[20] atrLen := msgData[21] atr := msgData[22 : 22+atrLen] _ = msgData[22+atrLen:] // unknown log.Printf("UnhandledCard(uid %s atqa 0x%04x sak %02x atr %s)\n%s", hex.EncodeToString(uid), atqa, sak, hex.EncodeToString(atr), hex.Dump(msgData)) } case 0xd1: log.Printf("EMVStatus\n%s", hex.Dump(msgData)) default: log.Printf("ipp %02x\n%s", msgType, hex.Dump(msgData)) } }