Documentation
¶
Overview ¶
Package gomatter implements matter protocol to allow talking to matter enabled devices.
Index ¶
- func Commission(ctx context.Context, fabric *Fabric, deviceIP net.IP, pin int, ...) error
- func CreateRandomBytes(n int) []byte
- func EncodeIMInvokeRequest(endpoint uint16, cluster uint32, command uint32, payload []byte, timed bool, ...) []byte
- func EncodeIMReadRequest(endpoint uint16, cluster uint32, attr uint32) []byte
- func EncodeIMStatusResponse(exchangeID uint16, iflag byte) []byte
- func EncodeIMSubscribeAttributeRequest(endpoint uint16, cluster uint32, attr uint32, opts ...SubscribeOption) []byte
- func EncodeIMSubscribeRequest(endpoint uint16, cluster uint32, event uint32, opts ...SubscribeOption) []byte
- func EncodeIMTimedRequest(exchange uint16, timeout uint16) []byte
- func EncodeStatusReport(code StatusReportElements) []byte
- func GenerateIPK() ([]byte, error)
- func ParseImInvokeResponse(resp *mattertlv.TlvItem) (int, error)
- func SerializeCertificateIntoMatter(fabric *Fabric, in *x509.Certificate) []byte
- type CertificateManager
- type DecodedGeneric
- type Fabric
- type FileCertManager
- func (cm *FileCertManager) BootstrapCa() error
- func (cm *FileCertManager) CreateUser(node_id uint64) error
- func (cm *FileCertManager) GetCaCertificate() *x509.Certificate
- func (cm *FileCertManager) GetCaPublicKey() ecdsa.PublicKey
- func (cm *FileCertManager) GetCertificate(id uint64) (*x509.Certificate, error)
- func (cm *FileCertManager) GetPrivkey(id uint64) (*ecdsa.PrivateKey, error)
- func (cm *FileCertManager) Load() error
- func (cm *FileCertManager) SignCertificate(user_pubkey *ecdsa.PublicKey, node_id uint64) (*x509.Certificate, error)
- type FileCertManagerConfig
- type MessageHeader
- type Opcode
- type Option
- type ProtocolId
- type ProtocolMessageHeader
- type SecureChannel
- func ConnectDevice(ctx context.Context, deviceIP net.IP, port int, fabric *Fabric, ...) (*SecureChannel, error)
- func SigmaExchange(ctx context.Context, fabric *Fabric, controllerID uint64, deviceID uint64, ...) (*SecureChannel, error)
- func StartSecureChannel(remoteIP net.IP, remotePort, localPort int) (*SecureChannel, error)
- func (sc *SecureChannel) Close()
- func (sc *SecureChannel) Receive(ctx context.Context) (DecodedGeneric, error)
- func (sc *SecureChannel) ReceiveBlocking() (DecodedGeneric, error)
- func (sc *SecureChannel) ReceiveWithTimeout(timeout time.Duration) (DecodedGeneric, error)
- func (sc *SecureChannel) Send(data []byte) error
- func (sc *SecureChannel) SetReceiveTimeout(timeout time.Duration)
- type SpakeCtx
- type StatusReportElements
- type SubscribeOption
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Commission ¶
func Commission(ctx context.Context, fabric *Fabric, deviceIP net.IP, pin int, controllerID, deviceID uint64, opts ...Option) error
Commission performs commissioning procedure on device with deviceIP ip address.
- fabric is fabric object with approriate certificate authority
- pin is passcode used for device pairing
- controllerID is identifier of node whioch will be owner/admin of this device
- deviceID is identifier of "new" device
func CreateRandomBytes ¶
func EncodeIMInvokeRequest ¶
func EncodeIMInvokeRequest(endpoint uint16, cluster uint32, command uint32, payload []byte, timed bool, exchange uint16) []byte
EncodeIMInvokeRequest encodes Interaction Model Invoke Request message
func EncodeIMReadRequest ¶
EncodeIMInvokeRequest encodes Interaction Model Read Request message
func EncodeIMStatusResponse ¶
EncodeIMStatusResponse encodes success Interaction Model Invoke Response
func EncodeIMSubscribeAttributeRequest ¶
func EncodeIMSubscribeAttributeRequest(endpoint uint16, cluster uint32, attr uint32, opts ...SubscribeOption) []byte
EncodeIMSubscribeAttributeRequest encodes an Interaction Model Subscribe Request for a single attribute path. Use SubscribeOption to configure intervals and filtering behavior.
func EncodeIMSubscribeRequest ¶
func EncodeIMSubscribeRequest(endpoint uint16, cluster uint32, event uint32, opts ...SubscribeOption) []byte
EncodeIMSubscribeRequest encodes an Interaction Model Subscribe Request for a single event path. Use SubscribeOption to configure intervals and filtering behavior.
func EncodeIMTimedRequest ¶
EncodeIMInvokeRequest encodes Interaction Model Timed Request message
func EncodeStatusReport ¶
func EncodeStatusReport(code StatusReportElements) []byte
func GenerateIPK ¶
GenerateIPK creates a cryptographically secure random 16-byte IPK for callers that want helper generation without embedding the policy in NewFabric.
func ParseImInvokeResponse ¶
ParseImInvokeResponse parses IM InvokeResponse TLV. Returns (0, nil) on success, (clusterStatusCode, nil) on cluster error, or (0, err) when the response cannot be parsed.
func SerializeCertificateIntoMatter ¶
func SerializeCertificateIntoMatter(fabric *Fabric, in *x509.Certificate) []byte
SerializeCertificateIntoMatter serializes x509 certificate into matter certificate format. Matter certificate format is way how to make matter even more weird and complicated. Signature of matter vertificate must match signature of certificate reencoded to DER encoding. This requires to handle very carefully order and presence of all elements in original x509.
Types ¶
type CertificateManager ¶
type CertificateManager interface {
GetCaPublicKey() ecdsa.PublicKey
GetCaCertificate() *x509.Certificate
// CreateUser creates keys and certificate for node with specific id
// it must be possible to later retrieve node keys using GetPrivkey and certificate using GetCertificate
CreateUser(node_id uint64) error
// retrieve certificate of specified node (previously created by CreateUser)
GetCertificate(id uint64) (*x509.Certificate, error)
// retrieve key of specified node (previously created by CreateUser)
GetPrivkey(id uint64) (*ecdsa.PrivateKey, error)
// create and sign certificate using local CA keys
SignCertificate(user_pubkey *ecdsa.PublicKey, node_id uint64) (*x509.Certificate, error)
}
matter certificate manager interface all generated certificates must be compatible with matter
- this means that after they are reencoded to matter format and back their signature must match
type DecodedGeneric ¶
type DecodedGeneric struct {
MessageHeader MessageHeader
ProtocolHeader ProtocolMessageHeader
Tlv mattertlv.TlvItem
Payload []byte
StatusReport StatusReportElements
}
type Fabric ¶
type Fabric struct {
CertificateManager CertificateManager
// contains filtered or unexported fields
}
Fabric structure represents matter Fabric. Its main parameters are Id of fabric and certificate manager.
func NewFabric ¶
func NewFabric(id uint64, certman CertificateManager, ipk []byte) (*Fabric, error)
NewFabric constructs new Fabric object and requires a caller-provided IPK. Callers must persist and pass the same 16-byte IPK to reload an existing fabric.
func (Fabric) CompressedFabric ¶
CompressedFabric returns Compressed Fabric Identifier which is used to identify fabric in matter protocol.
func (Fabric) GetOperationalDeviceId ¶
type FileCertManager ¶
type FileCertManager struct {
// contains filtered or unexported fields
}
PEM file backed certiticate manager
func NewFileCertManager ¶
func NewFileCertManager(fabric uint64, config FileCertManagerConfig) *FileCertManager
func (*FileCertManager) BootstrapCa ¶
func (cm *FileCertManager) BootstrapCa() error
BootstrapCa initializes CA - creates CA keys and certificate
func (*FileCertManager) CreateUser ¶
func (cm *FileCertManager) CreateUser(node_id uint64) error
func (*FileCertManager) GetCaCertificate ¶
func (cm *FileCertManager) GetCaCertificate() *x509.Certificate
func (*FileCertManager) GetCaPublicKey ¶
func (cm *FileCertManager) GetCaPublicKey() ecdsa.PublicKey
func (*FileCertManager) GetCertificate ¶
func (cm *FileCertManager) GetCertificate(id uint64) (*x509.Certificate, error)
func (*FileCertManager) GetPrivkey ¶
func (cm *FileCertManager) GetPrivkey(id uint64) (*ecdsa.PrivateKey, error)
func (*FileCertManager) Load ¶
func (cm *FileCertManager) Load() error
Load initializes CA. It loads required state from files.
func (*FileCertManager) SignCertificate ¶
func (cm *FileCertManager) SignCertificate(user_pubkey *ecdsa.PublicKey, node_id uint64) (*x509.Certificate, error)
type FileCertManagerConfig ¶
type FileCertManagerConfig struct {
Path string
}
type MessageHeader ¶
type MessageHeader struct {
// contains filtered or unexported fields
}
func (*MessageHeader) Dump ¶
func (m *MessageHeader) Dump()
func (*MessageHeader) Encode ¶
func (m *MessageHeader) Encode(data *bytes.Buffer)
type Opcode ¶
type Opcode byte
const InteractionOpcodeInvokeReq Opcode = 0x8
const InteractionOpcodeInvokeRsp Opcode = 0x9
const InteractionOpcodeReadReq Opcode = 0x2
const InteractionOpcodeReportData Opcode = 0x5
const InteractionOpcodeStatusRsp Opcode = 0x1
const InteractionOpcodeSubscReq Opcode = 0x3
const InteractionOpcodeSubscRsp Opcode = 0x4
const InteractionOpcodeTimedReq Opcode = 0xa
const SecChanOpcodeAck Opcode = 0x10
const SecChanOpcodePAKE1 Opcode = 0x22
const SecChanOpcodePAKE2 Opcode = 0x23
const SecChanOpcodePAKE3 Opcode = 0x24
const SecChanOpcodePBKDFReq Opcode = 0x20
const SecChanOpcodePBKDFResp Opcode = 0x21
const SecChanOpcodeStatusRep Opcode = 0x40
type Option ¶
type Option func(*channelOptions)
Option configures behavior of Commission and ConnectDevice.
func WithLocalPort ¶
WithLocalPort sets the local UDP port. Defaults to 0 (OS-assigned).
func WithReceiveTimeout ¶
WithReceiveTimeout sets the per-receive deadline. Defaults to 3 seconds. Use 0 for no timeout.
func WithRemotePort ¶
WithRemotePort sets the remote UDP port. Defaults to 5540 (standard Matter port). Applies to Commission only; ConnectDevice takes the remote port as an explicit argument.
type ProtocolId ¶
type ProtocolId uint16
const ProtocolIdInteraction ProtocolId = 1
const ProtocolIdSecureChannel ProtocolId = 0
type ProtocolMessageHeader ¶
type ProtocolMessageHeader struct {
Opcode Opcode
ExchangeId uint16
ProtocolId ProtocolId
// contains filtered or unexported fields
}
func (*ProtocolMessageHeader) Decode ¶
func (m *ProtocolMessageHeader) Decode(data *bytes.Buffer)
func (*ProtocolMessageHeader) Dump ¶
func (m *ProtocolMessageHeader) Dump()
func (*ProtocolMessageHeader) Encode ¶
func (m *ProtocolMessageHeader) Encode(data *bytes.Buffer)
type SecureChannel ¶
type SecureChannel struct {
Udp *udpChannel
Counter uint32
// contains filtered or unexported fields
}
func ConnectDevice ¶
func SigmaExchange ¶
func SigmaExchange(ctx context.Context, fabric *Fabric, controllerID uint64, deviceID uint64, secureChannel *SecureChannel) (*SecureChannel, error)
SigmaExhange establishes secure session using CASE (Certificate Authenticated Session Establishment)
func StartSecureChannel ¶
func StartSecureChannel(remoteIP net.IP, remotePort, localPort int) (*SecureChannel, error)
StartSecureChannel initializes secure channel for plain unencrypted communication. It initializes UDP interface and blocks local udp port. Secure channel becomes encrypted after encryption keys are supplied.
func (*SecureChannel) Close ¶
func (sc *SecureChannel) Close()
Close secure channel. Send close session message to remote end and relase UDP port.
func (*SecureChannel) Receive ¶
func (sc *SecureChannel) Receive(ctx context.Context) (DecodedGeneric, error)
func (*SecureChannel) ReceiveBlocking ¶
func (sc *SecureChannel) ReceiveBlocking() (DecodedGeneric, error)
func (*SecureChannel) ReceiveWithTimeout ¶
func (sc *SecureChannel) ReceiveWithTimeout(timeout time.Duration) (DecodedGeneric, error)
func (*SecureChannel) Send ¶
func (sc *SecureChannel) Send(data []byte) error
Send sends Protocol Message via secure channel. It creates Matter Message by adding Message Header. Protocol Message is aes-ccm encrypted when channel does have encryption keys. When encryption keys are empty plain Message is sent.
func (*SecureChannel) SetReceiveTimeout ¶
func (sc *SecureChannel) SetReceiveTimeout(timeout time.Duration)
type SpakeCtx ¶
type SpakeCtx struct {
W0 []byte
W1 []byte
X point
Y point
Z point
V point
L point
Ke []byte
Ka []byte
// contains filtered or unexported fields
}
func NewSpaceCtx
deprecated
func NewSpaceCtx() SpakeCtx
Deprecated: use NewSpakeCtx.
func NewSpakeCtx ¶
func NewSpakeCtx() SpakeCtx
func (*SpakeCtx) CalculateX ¶
func (ctx *SpakeCtx) CalculateX()
func (*SpakeCtx) CalculateZVb ¶
func (ctx *SpakeCtx) CalculateZVb()
func (*SpakeCtx) GenerateRandomX ¶
func (ctx *SpakeCtx) GenerateRandomX()
func (*SpakeCtx) GenerateRandomY ¶
func (ctx *SpakeCtx) GenerateRandomY()
type StatusReportElements ¶
func (StatusReportElements) Dump ¶
func (sr StatusReportElements) Dump()
func (StatusReportElements) IsOk ¶
func (sr StatusReportElements) IsOk() bool
type SubscribeOption ¶
type SubscribeOption func(*subscribeOptions)
SubscribeOption configures behavior of EncodeIMSubscribeRequest and EncodeIMSubscribeAttributeRequest.
func WithFabricFiltered ¶
func WithFabricFiltered(filtered bool) SubscribeOption
WithFabricFiltered limits attribute and event reports to data visible to the requesting fabric only. Defaults to false.
func WithKeepSubscriptions ¶
func WithKeepSubscriptions(keep bool) SubscribeOption
WithKeepSubscriptions controls whether existing subscriptions on the device are preserved when a new subscription is established. Defaults to false.
func WithMaxInterval ¶
func WithMaxInterval(s uint16) SubscribeOption
WithMaxInterval sets the maximum reporting interval in seconds. Defaults to 5.
func WithMinInterval ¶
func WithMinInterval(s uint16) SubscribeOption
WithMinInterval sets the minimum reporting interval in seconds. Defaults to 0.