-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
102 lines (87 loc) · 2.05 KB
/
main.go
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package main
import (
"log"
"time"
"github.com/ebfe/scard"
"github.com/tpc3/go-felica/felica"
"github.com/tpc3/go-felica/felica_pcsc"
)
func main() {
ctx, err := scard.EstablishContext()
if err != nil {
log.Panic("Failed to make context", err)
}
defer ctx.Release()
readers, err := ctx.ListReaders()
if err != nil {
log.Panic("Failed to list readers: ", err)
}
if len(readers) != 1 {
log.Panic("Invalid number of reader: ", len(readers))
}
for {
log.Print("Waiting for card...")
var rawCard *scard.Card
for rawCard == nil {
err := ctx.GetStatusChange([]scard.ReaderState{
{
Reader: readers[0],
CurrentState: scard.StateEmpty,
},
}, -1)
if err != nil {
log.Panic("failed to wait card: ", err)
}
rawCard, err = ctx.Connect(readers[0], scard.ShareExclusive, scard.ProtocolT1)
if err != nil {
log.Print("failed to connect card: ", err)
}
}
log.Print("card connected")
validCard := true
cardType, err := felica_pcsc.GetData(rawCard, felica.DataTypeCardType)
if err != nil {
log.Panic("Failed to get card type: ", err)
}
log.Printf("card type: %x", cardType)
if cardType[0] != 0x04 {
validCard = false
}
uid, err := felica_pcsc.GetData(rawCard, felica.DataTypeUID)
if err != nil {
log.Panic("Failed to get uid: ", err)
}
log.Printf("card uid: %x", uid)
// if cardType[0] != 0x04 {
// validCard = false
// }
if validCard {
masterKey := [24]byte([]byte("xNhAMv2J4bAW86Nddq8WDizc"))
_, err = felica_pcsc.NewCard(rawCard, func(CKV [2]byte) *[24]byte {
if CKV[0] == 0x00 && CKV[1] == 0x00 {
return &masterKey
}
return nil
})
if err != nil {
log.Print("card NG: ", err)
} else {
log.Print("card OK")
}
}
err = ctx.GetStatusChange([]scard.ReaderState{
{
Reader: readers[0],
CurrentState: scard.StatePresent,
},
}, 10*time.Second)
if err != nil {
log.Print("wait disconnect NG")
}
err = rawCard.Disconnect(scard.ResetCard)
if err != nil {
log.Print("disconnect NG")
}
log.Print("end")
}
}