Skip to main content

FabricConfig

Struct FabricConfig 

Source
#[non_exhaustive]
pub struct FabricConfig { pub fabric_id: u64, pub rcac_id: u64, pub commissioner_node_id: u64, pub validity: (MatterTime, MatterTime), pub issue_icac: bool, }
Expand description

Inputs for creating a new fabric.

#[non_exhaustive]: future fabric-creation knobs (e.g. an explicit IPK or an ICAC tier) can be added without a semver break. Construct via FabricConfig::new from outside this crate.

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§fabric_id: u64

Matter fabric identifier (spec §6.2.1).

§rcac_id: u64

RCAC subject DN’s rcac-id value.

§commissioner_node_id: u64

The stable node ID the controller takes on this fabric.

§validity: (MatterTime, MatterTime)

(not_before, not_after) validity for the RCAC and commissioner NOC.

Pass a real wall-clock not_before — e.g. MatterTime::from_unix_secs(current_unix_time), typically backdated a little (an hour is plenty) to tolerate device clock skew. Use MatterTime::NO_EXPIRY for not_after if the fabric should not expire.

MatterController::create_fabric validates this window and returns crate::Error::InvalidFabricValidity rather than letting a bad one reach a device. Four ways to get it wrong:

  • not_before at the Matter epoch (MatterTime(0), equivalently MatterTime::from_unix_secs(0)) — the reporter’s failure in issue #111. The cause is a signature mismatch, not a validity policy: chip’s ChipEpochToASN1Time (connectedhomeip/src/credentials/CHIPCert.cpp) maps epoch 0 to the X.509 sentinel 99991231235959Z for both notBefore and notAfter, so a device rebuilding the X.509 TBS from our TLV certificate hashes 99991231235959Z where we signed 20000101000000Z and the signature check fails. chip’s own comment: such certificates “are not usable with this code” and “attempted installation of such certficates will fail during commissioning” — surfacing as an opaque IM status 0x85 rejection of AddTrustedRootCertificate deep in commissioning.
  • not_before far in the future — most often a millisecond timestamp handed to MatterTime::from_unix_secs, which saturates to MatterTime(u32::MAX) (≈ year 2136). This one is worse than a rejection: ValidateChipRCAC deliberately does not check RCAC validity times (CHIPCert.cpp), so AddTrustedRootCertificate succeeds and the fabric half-commissions, then every CASE session fails with kNotYetValid.
  • An already-expired window — the symmetric twin of the one above, most often a (not_before, not_after) pair copied from an older document. The ordering check passes and not_before is in the past, so only a comparison against the clock catches it; the same ValidateChipRCAC exemption means the expired root installs and CASE then fails with kExpired.
  • A units mistake in not_afterfrom_unix_secs clamps any pre-2000 Unix time to MatterTime(0), and MatterTime(0) is MatterTime::NO_EXPIRY, so such a mistake silently yields “never expires” — the opposite of the intent — and cannot be rejected here.
§issue_icac: bool

When true, create_fabric mints an intermediate CA (ICAC) under the RCAC and signs the commissioner NOC (and, later, all NOCs issued on this fabric) under the ICAC instead of directly under the RCAC. Defaults to false (the flat RCAC->NOC path) via FabricConfig::new.

Implementations§

Source§

impl FabricConfig

Source

pub fn new( fabric_id: u64, rcac_id: u64, commissioner_node_id: u64, validity: (MatterTime, MatterTime), ) -> Self

Construct a fabric configuration.

This is the supported construction path now that FabricConfig is #[non_exhaustive]; the public fields remain readable/writable in place. See FabricConfig::validity for what to pass as validity — in particular, a real wall-clock not_before, not the Matter epoch.

Trait Implementations§

Source§

impl Clone for FabricConfig

Source§

fn clone(&self) -> FabricConfig

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FabricConfig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more