diff --git a/commands/constructors.go b/commands/constructors.go index 4ffccfd..129b66e 100644 --- a/commands/constructors.go +++ b/commands/constructors.go @@ -411,7 +411,20 @@ func CreateSignAttestationCertCommand(keyObjID, attestationObjID uint16) (*Comma payload := bytes.NewBuffer([]byte{}) binary.Write(payload, binary.BigEndian, keyObjID) binary.Write(payload, binary.BigEndian, attestationObjID) - + command.Data = payload.Bytes() + + return command, nil +} + +func CreateExportWrappedCommand(wrapObjID uint16, objType uint8, objID uint16) (*CommandMessage, error) { + command := &CommandMessage{ + CommandType: CommandTypeExportWrapped, + } + + payload := bytes.NewBuffer([]byte{}) + binary.Write(payload, binary.BigEndian, wrapObjID) + binary.Write(payload, binary.BigEndian, objType) + binary.Write(payload, binary.BigEndian, objID) command.Data = payload.Bytes() return command, nil diff --git a/commands/response.go b/commands/response.go index c2f6c60..44c9216 100644 --- a/commands/response.go +++ b/commands/response.go @@ -107,6 +107,11 @@ type ( SignAttestationCertResponse struct { Cert []byte } + + ExportWrappedResponse struct { + Nonce []byte + Data []byte + } ) // ParseResponse parses the binary response from the card to the relevant Response type. @@ -175,6 +180,8 @@ func ParseResponse(data []byte) (Response, error) { return parseGetOpaqueResponse(payload) case CommandTypeAttestAsymmetric: return parseAttestationCertResponse(payload) + case CommandTypeExportWrapped: + return parseExportWrappedResponse(payload) case ErrorResponseCode: return nil, parseErrorResponse(payload) default: @@ -397,6 +404,17 @@ func parseAttestationCertResponse(payload []byte) (Response, error) { }, nil } +func parseExportWrappedResponse(payload []byte) (Response, error) { + if len(payload) < 13 { + return nil, errors.New("invalid response payload length") + } + + return &ExportWrappedResponse{ + Nonce: payload[:13], + Data: payload[13:], + }, nil +} + // Error formats a card error message into a human readable format func (e *Error) Error() string { message := ""