summaryrefslogtreecommitdiff
path: root/cvend/cvend.go
blob: 13a6af72509709d0d6122d3699b83439dfa32623 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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 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))
	}
}