From 3f0395de8fd1c540e5e6602f22238633d74849ce Mon Sep 17 00:00:00 2001 From: Rohan Meringenti Date: Wed, 15 Jun 2022 17:54:59 -0600 Subject: [PATCH 1/3] adding get device info command --- commands/constructors.go | 9 +++++++++ commands/response.go | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/commands/constructors.go b/commands/constructors.go index c303b06..9b95a4f 100644 --- a/commands/constructors.go +++ b/commands/constructors.go @@ -9,6 +9,15 @@ import ( "github.com/certusone/yubihsm-go/authkey" ) + +func CreateDeviceInfoCommand() (*CommandMessage, error) { + command := &CommandMessage{ + CommandType: CommandTypeDeviceInfo, + } + + return command, nil +} + func CreateCreateSessionCommand(keySetID uint16, hostChallenge []byte) (*CommandMessage, error) { command := &CommandMessage{ CommandType: CommandTypeCreateSession, diff --git a/commands/response.go b/commands/response.go index bd34727..2bdc1b1 100644 --- a/commands/response.go +++ b/commands/response.go @@ -15,6 +15,13 @@ type ( Code ErrorCode } + DeviceInfoResponse struct { + MajorVersion uint8 + MinorVersion uint8 + BuildVersion uint8 + SerialNumber uint32 + } + CreateSessionResponse struct { SessionID uint8 CardChallenge []byte @@ -141,6 +148,8 @@ func ParseResponse(data []byte) (Response, error) { } switch transactionType { + case CommandTypeDeviceInfo: + return parseDeviceInfoResponse(payload) case CommandTypeCreateSession: return parseCreateSessionResponse(payload) case CommandTypeAuthenticateSession: @@ -214,6 +223,20 @@ func parseSessionMessage(payload []byte) (Response, error) { }, nil } +func parseDeviceInfoResponse(payload []byte) (Response, error) { + var serialNumber uint32 + err := binary.Read(bytes.NewReader(payload[3:7]), binary.BigEndian, &serialNumber) + if err != nil { + return nil, err + } + + return &DeviceInfoResponse{ + MajorVersion: payload[0], + MinorVersion: payload[1], + BuildVersion: payload[2], + SerialNumber: serialNumber, + }, nil +} func parseCreateSessionResponse(payload []byte) (Response, error) { if len(payload) != 17 { return nil, errors.New("invalid response payload length") From 7ed80af9d6d6c705426cc6695115c2bf1cdf7c78 Mon Sep 17 00:00:00 2001 From: Rohan Meringenti Date: Tue, 12 Jul 2022 11:49:49 -0400 Subject: [PATCH 2/3] add support for complete response --- README.md | 1 + commands/response.go | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2b5817e..9b9de78 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ messages is depleted. Currently the following commands are implemented: + * DeviceInfo * Reset * GenerateAsymmetricKey * SignDataEddsa diff --git a/commands/response.go b/commands/response.go index 2bdc1b1..ad01647 100644 --- a/commands/response.go +++ b/commands/response.go @@ -16,10 +16,13 @@ type ( } DeviceInfoResponse struct { - MajorVersion uint8 - MinorVersion uint8 - BuildVersion uint8 - SerialNumber uint32 + MajorVersion uint8 + MinorVersion uint8 + BuildVersion uint8 + SerialNumber uint32 + LogTotal uint8 + LogUsed uint8 + SupportedAlgorithms []Algorithm } CreateSessionResponse struct { @@ -235,6 +238,8 @@ func parseDeviceInfoResponse(payload []byte) (Response, error) { MinorVersion: payload[1], BuildVersion: payload[2], SerialNumber: serialNumber, + LogTotal: payload[8], + LogUsed: payload[9], }, nil } func parseCreateSessionResponse(payload []byte) (Response, error) { From f6e7a787afbabeebc4ab5d927a5f8371cd3ad826 Mon Sep 17 00:00:00 2001 From: Rohan Meringenti Date: Tue, 12 Jul 2022 12:06:23 -0400 Subject: [PATCH 3/3] add supported algorithms and fix indexing --- commands/response.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/commands/response.go b/commands/response.go index ad01647..87bcaee 100644 --- a/commands/response.go +++ b/commands/response.go @@ -233,13 +233,19 @@ func parseDeviceInfoResponse(payload []byte) (Response, error) { return nil, err } + var supportedAlgorithms []Algorithm + for _, alg := range payload[9:] { + supportedAlgorithms = append(supportedAlgorithms, Algorithm(alg)) + } + return &DeviceInfoResponse{ MajorVersion: payload[0], MinorVersion: payload[1], BuildVersion: payload[2], SerialNumber: serialNumber, - LogTotal: payload[8], - LogUsed: payload[9], + LogTotal: payload[7], + LogUsed: payload[8], + SupportedAlgorithms: supportedAlgorithms, }, nil } func parseCreateSessionResponse(payload []byte) (Response, error) {