From 83c482127d7dab4c4c41491c32c6b90d6954b15b Mon Sep 17 00:00:00 2001 From: Lars Bahner Date: Wed, 7 Feb 2024 23:51:14 +0100 Subject: [PATCH] Make som more unpack functions for messages and envelopes --- msg/envelope.go | 31 +++++++++++++++++++++++++++++++ msg/message.go | 26 ++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/msg/envelope.go b/msg/envelope.go index 554b731..8885858 100644 --- a/msg/envelope.go +++ b/msg/envelope.go @@ -28,6 +28,37 @@ func UnmarshalEnvelopeFromCBOR(data []byte) (*Envelope, error) { return e, nil } +func UnmarshalAndVerifyEnvelopeFromCBOR(data []byte) (*Envelope, error) { + + e, err := UnmarshalEnvelopeFromCBOR(data) + if err != nil { + return nil, fmt.Errorf("envelope: error unmarshalling envelope: %s", err) + } + + err = e.Verify() + if err != nil { + return nil, fmt.Errorf("envelope: error verifying envelope: %s", err) + } + + return e, nil +} + +func (e *Envelope) Verify() error { + if e.EphemeralKey == nil || e.EncryptedContent == nil || e.EncryptedHeaders == nil { + return fmt.Errorf("envelope: missing fields in envelope") + } + + if len(e.EphemeralKey) != 32 { + return fmt.Errorf("envelope: invalid ephemeral key length") + } + + return nil +} + +func (e *Envelope) IsValid() bool { + return e.Verify() == nil +} + func (e *Envelope) getContent(privkey []byte) ([]byte, error) { return decrypt(e.EncryptedContent, e.EphemeralKey, privkey) } diff --git a/msg/message.go b/msg/message.go index a032ca6..980994e 100644 --- a/msg/message.go +++ b/msg/message.go @@ -6,6 +6,7 @@ import ( "time" "github.com/bahner/go-ma" + cbor "github.com/fxamacker/cbor/v2" nanoid "github.com/matoous/go-nanoid/v2" ) @@ -111,3 +112,28 @@ func newFromHeaders(h *Headers) (*Message, error) { } return m, nil } + +// UnmarshalMessageFromCBOR unmarshals a Message from a CBOR byte slice +// and verifies the signature +func UnmarshalMessageFromCBOR(b []byte) (*Message, error) { + var m *Message = new(Message) + err := cbor.Unmarshal(b, m) + if err != nil { + return nil, fmt.Errorf("msg_unmarshal_message_from_cbor: failed to unmarshal message: %w", err) + } + return m, nil +} + +func UnmarshalAndVerifyMessageFromCBOR(b []byte) (*Message, error) { + m, err := UnmarshalMessageFromCBOR(b) + if err != nil { + return nil, fmt.Errorf("msg_unmarshal_message_from_cbor_and_verify_signature: failed to unmarshal message: %w", err) + } + + err = m.Verify() + if err != nil { + return nil, fmt.Errorf("msg_unmarshal_message_from_cbor_and_verify_signature: failed to verify message: %w", err) + } + + return m, nil +}