PutWrapkeyCommand

This commit is contained in:
Gary Belvin 2021-03-04 15:46:36 +00:00 committed by Gary Belvin
parent bcd16c93b1
commit 7d8389a6ff
2 changed files with 47 additions and 0 deletions

View File

@ -248,3 +248,31 @@ func CreateGetPseudoRandomCommand(numBytes uint16) *CommandMessage {
return command
}
func CreatePutWrapkeyCommand(objID uint16, label []byte, domains uint16, capabilities, delegated uint64, wrapkey []byte) (*CommandMessage, error) {
if len(label) > LabelLength {
return nil, errors.New("label is too long")
}
if len(label) < LabelLength {
label = append(label, bytes.Repeat([]byte{0x00}, LabelLength-len(label))...)
}
if keyLen := len(wrapkey); keyLen != 16 && keyLen != 24 && keyLen != 32 {
return nil, errors.New("wrapkey is wrong length")
}
command := &CommandMessage{
CommandType: CommandTypePutWrapKey,
}
payload := bytes.NewBuffer([]byte{})
binary.Write(payload, binary.BigEndian, objID)
payload.Write(label)
binary.Write(payload, binary.BigEndian, domains)
binary.Write(payload, binary.BigEndian, capabilities)
binary.Write(payload, binary.BigEndian, delegated)
payload.Write(wrapkey)
command.Data = payload.Bytes()
return command, nil
}

View File

@ -83,6 +83,10 @@ type (
ChangeAuthenticationKeyResponse struct {
ObjectID uint16
}
PutWrapkeyResponse struct {
ObjectID uint16
}
)
// ParseResponse parses the binary response from the card to the relevant Response type.
@ -139,6 +143,8 @@ func ParseResponse(data []byte) (Response, error) {
return parseChangeAuthenticationKeyResponse(payload)
case CommandTypeGetPseudoRandom:
return parseGetPseudoRandomResponse(payload), nil
case CommandTypePutWrapKey:
return parsePutWrapkeyResponse(payload)
case ErrorResponseCode:
return nil, parseErrorResponse(payload)
default:
@ -288,6 +294,19 @@ func parseGetPseudoRandomResponse(payload []byte) Response {
return payload
}
func parsePutWrapkeyResponse(payload []byte) (Response, error) {
if len(payload) != 2 {
return nil, errors.New("invalid response payload length")
}
var objectID uint16
err := binary.Read(bytes.NewReader(payload), binary.BigEndian, &objectID)
if err != nil {
return nil, err
}
return &PutWrapkeyResponse{ObjectID: objectID}, nil
}
// Error formats a card error message into a human readable format
func (e *Error) Error() string {
message := ""