keycard-go/apdu/response.go

53 lines
900 B
Go

package apdu
import (
"bytes"
"encoding/binary"
"errors"
)
const respOK = 36864 // 0x9000
type Response struct {
Data []byte
Sw1 uint8
Sw2 uint8
Sw uint16
}
var ErrBadRawResponse = errors.New("response data must be at least 2 bytes")
func ParseResponse(data []byte) (*Response, error) {
r := &Response{}
return r, r.deserialize(data)
}
func (r *Response) deserialize(data []byte) error {
if len(data) < 2 {
return ErrBadRawResponse
}
r.Data = make([]byte, len(data)-2)
buf := bytes.NewReader(data)
if err := binary.Read(buf, binary.BigEndian, &r.Data); err != nil {
return err
}
if err := binary.Read(buf, binary.BigEndian, &r.Sw1); err != nil {
return err
}
if err := binary.Read(buf, binary.BigEndian, &r.Sw2); err != nil {
return err
}
r.Sw = (uint16(r.Sw1) << 8) | uint16(r.Sw2)
return nil
}
func (r *Response) IsOK() bool {
return r.Sw == respOK
}