Skip to content

Commit 4e2c7c9

Browse files
committed
Stop being cute with the datastructure.
This should fix the issue from PR #8 while using a single datastructure instead of two.
1 parent a1089d2 commit 4e2c7c9

5 files changed

Lines changed: 40 additions & 66 deletions

File tree

calculate.go

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,15 @@ func (o *OATH) calculate(name string) (string, error) {
6363
return "", err
6464
}
6565

66-
for _, tag := range res.tags {
66+
for _, tv := range res {
6767

68-
value := res.values[tag][0]
69-
70-
switch tag {
68+
switch tv.tag {
7169

7270
case 0x76:
73-
return otp(value), nil
71+
return otp(tv.value), nil
7472

7573
default:
76-
return "", fmt.Errorf(errUnknownTag, tag)
74+
return "", fmt.Errorf(errUnknownTag, tv.tag)
7775
}
7876

7977
}
@@ -103,27 +101,21 @@ func (o *OATH) calculateAll() (map[string]string, error) {
103101
return nil, err
104102
}
105103

106-
for _, tag := range res.tags {
107-
108-
values := res.values[tag]
109-
110-
for _, value := range values {
104+
for _, tv := range res {
111105

112-
switch tag {
106+
switch tv.tag {
113107

114-
case 0x71:
115-
names = append(names, string(value))
108+
case 0x71:
109+
names = append(names, string(tv.value))
116110

117-
case 0x7c:
118-
codes = append(codes, touchRequired)
111+
case 0x7c:
112+
codes = append(codes, touchRequired)
119113

120-
case 0x76:
121-
codes = append(codes, otp(value))
122-
123-
default:
124-
return nil, fmt.Errorf(errUnknownTag, tag)
125-
}
114+
case 0x76:
115+
codes = append(codes, otp(tv.value))
126116

117+
default:
118+
return nil, fmt.Errorf(errUnknownTag, tv.tag)
127119
}
128120

129121
}

list.go

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,21 @@ func (o *OATH) List() ([]*Name, error) {
2727
return nil, err
2828
}
2929

30-
for _, tag := range res.tags {
30+
for _, tv := range res {
3131

32-
values := res.values[tag]
33-
34-
switch tag {
32+
switch tv.tag {
3533
case 0x72:
3634

37-
for _, value := range values {
38-
39-
name := &Name{
40-
Algorithm: Algorithm(value[0] & 0x0f),
41-
Name: string(value[1:]),
42-
Type: Type(value[0] & 0xf0),
43-
}
44-
45-
names = append(names, name)
46-
35+
name := &Name{
36+
Algorithm: Algorithm(tv.value[0] & 0x0f),
37+
Name: string(tv.value[1:]),
38+
Type: Type(tv.value[0] & 0xf0),
4739
}
4840

41+
names = append(names, name)
42+
4943
default:
50-
return nil, fmt.Errorf(errUnknownTag, tag)
44+
return nil, fmt.Errorf(errUnknownTag, tv.tag)
5145
}
5246

5347
}

select.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,19 @@ func (o *OATH) Select() (*Select, error) {
2525

2626
s := new(Select)
2727

28-
for _, tag := range res.tags {
28+
for _, tv := range res {
2929

30-
value := res.values[tag][0]
31-
32-
switch tag {
30+
switch tv.tag {
3331
case 0x7b:
34-
s.Algorithm = value
32+
s.Algorithm = tv.value
3533
case 0x74:
36-
s.Challenge = value
34+
s.Challenge = tv.value
3735
case 0x71:
38-
s.Name = value
36+
s.Name = tv.value
3937
case 0x79:
40-
s.Version = value
38+
s.Version = tv.value
4139
default:
42-
return nil, fmt.Errorf(errUnknownTag, tag)
40+
return nil, fmt.Errorf(errUnknownTag, tv.tag)
4341
}
4442

4543
}

tlv.go

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,20 @@ import (
44
"fmt"
55
)
66

7-
// tvs is map of tags to slice of byte slices that remembers the insertion order
8-
type tvs struct {
9-
tags []byte
10-
values map[byte][][]byte
7+
type tv struct {
8+
tag byte
9+
value []byte
1110
}
1211

13-
// add adds another tagged value and memorizes the insertion order
14-
func (t *tvs) add(tag byte, value []byte) {
15-
16-
prev, ok := t.values[tag]
17-
18-
if !ok {
19-
t.tags = append(t.tags, tag)
20-
}
21-
22-
t.values[tag] = append(prev, value)
23-
24-
}
12+
type tvs []tv
2513

2614
// read will read a number of tagged values from a buffer
27-
func read(buf []byte) *tvs {
15+
func read(buf []byte) (tvs tvs) {
2816

2917
var (
3018
idx int
3119
length int
3220
tag byte
33-
tvs = &tvs{values: make(map[byte][][]byte)}
3421
value []byte
3522
)
3623

@@ -53,7 +40,10 @@ func read(buf []byte) *tvs {
5340
idx = idx + length
5441

5542
// append the result
56-
tvs.add(tag, value)
43+
tvs = append(tvs, tv{
44+
tag: tag,
45+
value: value,
46+
})
5747

5848
}
5949

ykoath.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func (o *OATH) Close() error {
9595
}
9696

9797
// send sends an APDU to the card
98-
func (o *OATH) send(cla, ins, p1, p2 byte, data ...[]byte) (*tvs, error) {
98+
func (o *OATH) send(cla, ins, p1, p2 byte, data ...[]byte) (tvs, error) {
9999

100100
var (
101101
code code

0 commit comments

Comments
 (0)