class Matter::Fabric

Overview

Fabric represents a unique administrative domain in Matter

A fabric is a logical grouping of Matter nodes that share a common trust root and can communicate securely. Each fabric has:

Matter devices can be members of multiple fabrics simultaneously (multi-admin). Each fabric gets a local Fabric Index (1-254) on the device.

Specification: Matter 1.4 § 4.13 (Fabrics)

Defined in:

matter/fabric.cr

Constructors

Instance Method Summary

Constructor Detail

def self.from_h(data : Hash(String, String | UInt64 | UInt16 | UInt8 | Int64)) : Fabric #

Deserialize fabric from hash


[View source]
def self.new(fabric_id : UInt64, fabric_index : UInt8, node_id : UInt64, root_public_key : Bytes, operational_cert : Bytes, operational_key : Crypto::Key, ipk : Bytes, vendor_id : UInt16 = 65521_u16, label : String = "", intermediate_cert : Bytes | Nil = nil, created_at : Int64 = Time.utc.to_unix, last_used_at : Int64 = Time.utc.to_unix) #

[View source]

Instance Method Detail

def compressed_fabric_id : Bytes #

Get the compressed fabric identifier using HKDF This is used in various Matter protocols, especially mDNS service discovery

The compressed fabric ID is an 8-byte value derived from:

  • Key: root public key (excluding first byte which is 0x04 format indicator)
  • Salt: fabric_id (8 bytes, little-endian)
  • Info: "CompressedFabric"
  • Length: 8 bytes

Specification: Matter 1.4 § 4.13.2.4.2 (Compressed Fabric Identifier)


[View source]
def created_at : Int64 #

Timestamp when this fabric was created (Unix epoch seconds)


[View source]
def created_at=(created_at : Int64) #

Timestamp when this fabric was created (Unix epoch seconds)


[View source]
def expired?(threshold_seconds : Int64 = 31536000) : Bool #

Check if this fabric is expired (unused for more than 1 year)


[View source]
def fabric_id : UInt64 #

Unique 64-bit identifier for this fabric (globally unique)


[View source]
def fabric_id=(fabric_id : UInt64) #

Unique 64-bit identifier for this fabric (globally unique)


[View source]
def fabric_index : UInt8 #

Local index on the device (1-254, 0 is reserved) This is device-specific and may differ across devices


[View source]
def fabric_index=(fabric_index : UInt8) #

Local index on the device (1-254, 0 is reserved) This is device-specific and may differ across devices


[View source]
def intermediate_cert : Bytes | Nil #

Intermediate CA certificate (optional) If present, forms a chain: Root CA -> ICA -> NOC


[View source]
def intermediate_cert=(intermediate_cert : Bytes | Nil) #

Intermediate CA certificate (optional) If present, forms a chain: Root CA -> ICA -> NOC


[View source]
def ipk : Bytes #

Identity Protection Key (IPK) - 16 bytes Used to encrypt node IDs in operational discovery for privacy


[View source]
def ipk=(ipk : Bytes) #

Identity Protection Key (IPK) - 16 bytes Used to encrypt node IDs in operational discovery for privacy


[View source]
def label : String #

User-friendly label for this fabric (max 32 UTF-8 characters)


[View source]
def label=(label : String) #

User-friendly label for this fabric (max 32 UTF-8 characters)


[View source]
def last_used_at : Int64 #

Timestamp when this fabric was last used (Unix epoch seconds)


[View source]
def last_used_at=(last_used_at : Int64) #

Timestamp when this fabric was last used (Unix epoch seconds)


[View source]
def mark_used #

Update the last used timestamp


[View source]
def matches_id?(id : UInt64) : Bool #

Helper to check if a given fabric_id matches


[View source]
def matches_index?(index : UInt8) : Bool #

Helper to check if a given fabric_index matches


[View source]
def node_id : UInt64 #

Our Node ID within this fabric (64-bit) Combined with fabric_id forms a globally unique identifier


[View source]
def node_id=(node_id : UInt64) #

Our Node ID within this fabric (64-bit) Combined with fabric_id forms a globally unique identifier


[View source]
def operational_cert : Bytes #

Node Operational Certificate (NOC) - our identity certificate TLV-encoded Matter certificate


[View source]
def operational_cert=(operational_cert : Bytes) #

Node Operational Certificate (NOC) - our identity certificate TLV-encoded Matter certificate


[View source]
def operational_key : Crypto::Key #

Private key corresponding to the public key in our NOC


[View source]
def operational_key=(operational_key : Crypto::Key) #

Private key corresponding to the public key in our NOC


[View source]
def root_public_key : Bytes #

Trusted Root Certificate Authority public key This is the trust anchor for certificate validation


[View source]
def root_public_key=(root_public_key : Bytes) #

Trusted Root Certificate Authority public key This is the trust anchor for certificate validation


[View source]
def scoped_node_id : UInt64 #

Get scoped node ID (used in CASE for peer identification)


[View source]
def to_h : Hash(String, String | UInt64 | UInt16 | UInt8 | Int64) #

Serialize fabric to hash for storage


[View source]
def to_s(io : IO) #

String representation for debugging


[View source]
def vendor_id : UInt16 #

Vendor ID for this fabric (identifies the admin/commissioner)


[View source]
def vendor_id=(vendor_id : UInt16) #

Vendor ID for this fabric (identifies the admin/commissioner)


[View source]