@@ -57,7 +57,7 @@ func (key *scardYubiKey) Context() context.Context {
5757 return key .ctx
5858}
5959
60- func (key * scardYubiKey ) GetCodeWithPassword (pwd string ) (string , error ) {
60+ func (key * scardYubiKey ) GetCodeWithPassword (pwd string , slotName string ) (string , error ) {
6161
6262 card := key .card
6363
@@ -93,16 +93,18 @@ func (key *scardYubiKey) GetCodeWithPassword(pwd string) (string, error) {
9393 return "" , err
9494 }
9595
96- tlvs , err := key .parseTlvs (resp_oath )
96+ tlvsList , err := key .parseTlvs (resp_oath )
9797 if err != nil {
9898 return "" , err
9999 }
100+ tlvs := tlvsToMap (tlvsList )
100101
101102 OATH_TAG_NAME := byte (0x71 )
102103 OATH_TAG_CHALLENGE := byte (0x74 )
103104 OATH_TAG_ALGORITHM := byte (0x7b )
104105 OATH_TAG_VERSION := byte (0x79 )
105106 OATH_TAG_RESPONSE := byte (0x75 )
107+ OATH_TAG_TRUNCATED_RESPONSE := byte (0x76 )
106108
107109 name := binary .BigEndian .Uint64 (tlvs [OATH_TAG_NAME ].value )
108110
@@ -144,16 +146,17 @@ func (key *scardYubiKey) GetCodeWithPassword(pwd string) (string, error) {
144146 return "" , err
145147 }
146148
147- verify_tlvs , err := key .parseTlvs (verify_resp )
149+ verifyTlvsList , err := key .parseTlvs (verify_resp )
148150 if err != nil {
149151 return "" , err
150152 }
153+ verifyTlvs := tlvsToMap (verifyTlvsList )
151154
152- println (verify_tlvs )
155+ println (verifyTlvs )
153156 fmt .Printf ("verification: % 0x\n " , verification )
154- fmt .Printf ("verification: % 0x\n " , verify_tlvs [OATH_TAG_RESPONSE ].value )
157+ fmt .Printf ("verification: % 0x\n " , verifyTlvs [OATH_TAG_RESPONSE ].value )
155158
156- if ! reflect .DeepEqual (verification , verify_tlvs [OATH_TAG_RESPONSE ].value ) {
159+ if ! reflect .DeepEqual (verification , verifyTlvs [OATH_TAG_RESPONSE ].value ) {
157160 panic ("Verification failed" )
158161 }
159162
@@ -172,20 +175,40 @@ func (key *scardYubiKey) GetCodeWithPassword(pwd string) (string, error) {
172175 }
173176 fmt .Printf ("% 0x\n " , rsp_5 )
174177
175- creds_tlvs , err := key .parseTlvs (rsp_5 )
178+ credsTlvs , err := key .parseTlvs (rsp_5 )
176179 if err != nil {
177180 return "" , err
178181 }
179182
180- TRUNCATED_RESPONSE := byte (0x76 )
183+ foundSlot := false
184+ var strCode string
185+ for _ , tlv := range credsTlvs {
186+ if tlv .tag == OATH_TAG_NAME {
187+ keySlotName := string (tlv .value )
188+
189+ if slotName == "" || keySlotName == slotName {
190+ foundSlot = true
191+ fmt .Printf ("slot %s matched\n " , keySlotName )
192+ } else {
193+ fmt .Printf ("found non-matching slot %s\n " , keySlotName )
194+ }
195+ }
196+
197+ if foundSlot && tlv .tag == OATH_TAG_TRUNCATED_RESPONSE {
198+ fmt .Printf ("code is in: % 0x\n " , tlv .value )
181199
182- fmt . Printf ( " code is in: % 0x \n " , creds_tlvs [ TRUNCATED_RESPONSE ] .value )
200+ code := parseTruncated ( tlv .value [ 1 :] )
183201
184- code := parseTruncated (creds_tlvs [TRUNCATED_RESPONSE ].value [1 :])
202+ fmt .Printf ("code: %06d\n " , code )
203+ strCode = fmt .Sprintf ("%06d" , code )
185204
186- fmt .Printf ("code: %06d\n " , code )
205+ break
206+ }
207+ }
187208
188- strCode := fmt .Sprintf ("%06d" , code )
209+ if ! foundSlot {
210+ return "" , yubierror .ErrorSlotNotFound
211+ }
189212
190213 return strCode , err
191214}
@@ -260,8 +283,8 @@ type Tlv struct {
260283 value []byte
261284}
262285
263- func (self * scardYubiKey ) parseTlvs (response []byte ) (map [ byte ]Tlv , error ) {
264- tlvs := make ( map [ byte ]Tlv )
286+ func (self * scardYubiKey ) parseTlvs (response []byte ) ([ ]Tlv , error ) {
287+ var tlvs [ ]Tlv
265288 for len (response ) > 0 {
266289 tag := response [0 ]
267290 ln := uint64 (response [1 ])
@@ -284,12 +307,22 @@ func (self *scardYubiKey) parseTlvs(response []byte) (map[byte]Tlv, error) {
284307 value : value ,
285308 }
286309
287- tlvs [ tag ] = tlv
310+ tlvs = append ( tlvs , tlv )
288311 }
289312
290313 return tlvs , nil
291314}
292315
316+ func tlvsToMap (tlvs []Tlv ) map [byte ]Tlv {
317+ result := make (map [byte ]Tlv )
318+
319+ for _ , tlv := range tlvs {
320+ result [tlv .tag ] = tlv
321+ }
322+
323+ return result
324+ }
325+
293326func (self Tlv ) buffer () []byte {
294327 res := make ([]byte , 1 )
295328 res [0 ] = self .tag
0 commit comments