From b28a514e8f0f13447cfb1255be7e7f8111eec38f Mon Sep 17 00:00:00 2001 From: Simon Boissonneault-Robert Date: Tue, 18 Jun 2019 16:18:13 -0400 Subject: [PATCH] Add ListObject and GetObjectInfo support Misc: removed pinged print --- commands/constructors.go | 46 +++++++++++++++++++++++++++++++++ commands/response.go | 55 ++++++++++++++++++++++++++++++++++++++++ commands/types.go | 5 ++++ manager.go | 1 - 4 files changed, 106 insertions(+), 1 deletion(-) diff --git a/commands/constructors.go b/commands/constructors.go index 1d4b3d3..74e9153 100644 --- a/commands/constructors.go +++ b/commands/constructors.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/binary" "errors" + "io" ) func CreateCreateSessionCommand(keySetID uint16, hostChallenge []byte) (*CommandMessage, error) { @@ -118,6 +119,51 @@ func CreatePutAsymmetricKeyCommand(keyID uint16, label []byte, domains uint16, c return command, nil } +type ListCommandOption func(w io.Writer) + +func NewObjectTypeOption(objectType uint8) ListCommandOption { + return func(w io.Writer) { + binary.Write(w, binary.BigEndian, ListObjectParamType) + binary.Write(w, binary.BigEndian, objectType) + } +} + +func NewIDOption(id uint16) ListCommandOption { + return func(w io.Writer) { + binary.Write(w, binary.BigEndian, ListObjectParamID) + binary.Write(w, binary.BigEndian, id) + } +} + +func CreateListObjectsCommand(options ...ListCommandOption) (*CommandMessage, error) { + command := &CommandMessage{ + CommandType: CommandTypeListObjects, + } + + payload := bytes.NewBuffer([]byte{}) + for _, opt := range options { + opt(payload) + } + + command.Data = payload.Bytes() + + return command, nil +} + +func CreateGetObjectInfoCommand(keyID uint16, objectType uint8) (*CommandMessage, error) { + command := &CommandMessage{ + CommandType: CommandTypeGetObjectInfo, + } + + payload := bytes.NewBuffer([]byte{}) + binary.Write(payload, binary.BigEndian, keyID) + binary.Write(payload, binary.BigEndian, objectType) + + command.Data = payload.Bytes() + + return command, nil +} + func CreateCloseSessionCommand() (*CommandMessage, error) { command := &CommandMessage{ CommandType: CommandTypeCloseSession, diff --git a/commands/response.go b/commands/response.go index 60ac2e3..1597efd 100644 --- a/commands/response.go +++ b/commands/response.go @@ -35,6 +35,29 @@ type ( KeyID uint16 } + ObjectInfoResponse struct { + Capabilities uint64 + ObjectID uint16 + Length uint16 + Domains uint16 + Type uint8 + Algorithm Algorithm + Sequence uint8 + Origin uint8 + Label [40]byte + DelegatedCapabilites uint64 + } + + Object struct { + ObjectID uint16 + ObjectType uint8 + Sequence uint8 + } + + ListObjectsResponse struct { + Objects []Object + } + SignDataEddsaResponse struct { Signature []byte } @@ -90,6 +113,10 @@ func ParseResponse(data []byte) (Response, error) { return parseSignDataEcdsaResponse(payload) case CommandTypePutAsymmetric: return parsePutAsymmetricKeyResponse(payload) + case CommandTypeListObjects: + return parseListObjectsResponse(payload) + case CommandTypeGetObjectInfo: + return parseGetObjectInfoResponse(payload) case CommandTypeCloseSession: return nil, nil case CommandTypeGetPubKey: @@ -179,6 +206,34 @@ func parsePutAsymmetricKeyResponse(payload []byte) (Response, error) { }, nil } +func parseListObjectsResponse(payload []byte) (Response, error) { + if len(payload)%4 != 0 { + return nil, errors.New("invalid response payload length") + } + + response := ListObjectsResponse{ + Objects: make([]Object, len(payload)/4), + } + + err := binary.Read(bytes.NewReader(payload), binary.BigEndian, &response.Objects) + if err != nil { + return nil, err + } + + return &response, nil +} + +func parseGetObjectInfoResponse(payload []byte) (Response, error) { + response := ObjectInfoResponse{} + + err := binary.Read(bytes.NewReader(payload), binary.BigEndian, &response) + if err != nil { + return nil, err + } + + return &response, nil +} + func parseGetPubKeyResponse(payload []byte) (Response, error) { if len(payload) < 1 { return nil, errors.New("invalid response payload length") diff --git a/commands/types.go b/commands/types.go index d6da3e8..830d42f 100644 --- a/commands/types.go +++ b/commands/types.go @@ -78,6 +78,7 @@ const ( ErrorCodeCommandUnexecuted ErrorCode = 0xff // Algorithms + AlgorithmP256 Algorithm = 12 AlgorithmSecp256k1 Algorithm = 15 AlgorighmED25519 Algorithm = 46 @@ -155,4 +156,8 @@ const ( ObjectTypeHmacKey uint8 = 0x05 ObjectTypeTemplate uint8 = 0x06 ObjectTypeOtpAeadKey uint8 = 0x07 + + // list objects params + ListObjectParamID uint8 = 0x01 + ListObjectParamType uint8 = 0x02 ) diff --git a/manager.go b/manager.go index d72585b..3bdca77 100644 --- a/manager.go +++ b/manager.go @@ -71,7 +71,6 @@ func (s *SessionManager) pingRoutine() { } } - println("pinged") s.keepAlive.Reset(pingInterval) } }