RFC 9944
Device Schema Extensions to the System for Cross-Domain Identity Management (SCIM) Model
Device Schema Extensions to the System for Cross-Domain Identity Management (SCIM) Model π
RFC 9944 β¨ IETF (Internet Engineering Task Force), Standards Track, ISSN 2070-1721, May 2026
The authors are M. Shahzad and H. Iqbal from North Carolina State University, and E. Lear from Cisco Systems π
Abstract πΈ
Okay so the original SCIM core schema was built for provisioning users π€ This memo adds schema extensions so you can provision devices too π₯ It works with bootstrapping systems like Wi-Fi Easy Connect, FIDO device onboarding vouchers, Bluetooth Low Energy (BLE) passcodes, and MAC Authenticated Bypass (MAB) β¨
Status of This Memo π§
Bestie, this is an Internet Standards Track document π
This doc is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community, got public review, and was approved for publication by the Internet Engineering Steering Group (IESG). If you want more on Internet Standards, check Section 2 of RFC 7841 π¦
For the current status, any errata, and how to send feedback, go to https://www.rfc-editor.org/info/rfc9944 π
Copyright Notice π
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved. π
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication. Please read these carefully, because they describe your rights and restrictions for this document π Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions, and they're provided without warranty as described in the Revised BSD License π₯
Table of Contents π
1. Introduction
1.1. Why SCIM for Devices?
1.2. Protocol Participants
1.3. Schema Description
1.4. Schema Representation
1.5. Terminology
2. ResourceType Device
2.1. Common Attributes
3. SCIM Core Device Schema
3.1. Singular Attributes
4. Groups
5. Resource Type EndpointApp
6. SCIM EndpointApp Schema
6.1. Common Attributes
6.2. Singular Attributes
6.3. Complex Attributes
6.3.1. certificateInfo
7. SCIM Device Extensions
7.1. Bluetooth Low Energy (BLE) Extension
7.1.1. Singular Attributes
7.1.2. Multivalued Attributes
7.1.3. BLE Pairing Method Extensions
7.2. Wi-Fi Easy Connect Extension
7.2.1. Singular Attributes
7.2.2. Multivalued Attributes
7.3. Ethernet MAB Extension
7.3.1. Single Attribute
7.4. FIDO Device Onboard Extension
7.4.1. Single Attribute
7.5. Zigbee Extension
7.5.1. Singular Attribute
7.5.2. Multivalued Attribute
7.6. The Endpoint Applications Extension Schema
7.6.1. Singular Attributes
7.6.2. Multivalued Attribute
8. Security Considerations
8.1. SCIM Operations
8.1.1. Unauthorized Object Creation
8.2. Object Deletion
8.3. Read Operations
8.4. Update Operations
8.5. Higher Level Protection for Certain Systems
8.6. Logging
9. IANA Considerations
9.1. New Schemas
9.2. Device Schema Extensions
10. References
10.1. Normative References
10.2. Informative References
Appendix A. JSON Schema Representation
A.1. Resource Schema
A.2. Core Device Schema
A.3. EndpointApp Schema
A.4. BLE Extension Schema
A.5. DPP Extension Schema
A.6. Ethernet MAB Extension Schema
A.7. FDO Extension Schema
A.8. Zigbee Extension Schema
A.9. endpointAppsExt Extension Schema
Appendix B. OpenAPI Representation
B.1. Core Device Schema OpenAPI Representation
B.2. EndpointApp Schema OpenAPI Representation
B.3. BLE Extension Schema OpenAPI Representation
B.4. DPP Extension Schema OpenAPI Representation
B.5. Ethernet MAB Extension Schema OpenAPI Representation
B.6. FDO Extension Schema OpenAPI Representation
B.7. Zigbee Extension Schema OpenAPI Representation
B.8. endpointAppsExt Extension Schema OpenAPI Representation
Appendix C. FIDO Device Onboarding Example Flow
Acknowledgments
Authors' Addresses
1. Introduction π¦
The Internet of Things is a whole management challenge, and it's giving many dimensions π One big piece is being able to onboard and manage a huge number of devices. There are lots of models for bootstrapping trust between devices and network deployments, and honestly it's expected that different manufacturers will use different methods π
SCIM [RFC7643] [RFC7644] defines a protocol and a schema for provisioning users. BUT it can easily be extended to provision device credentials and other attributes into a network π§ The protocol and core schema were designed to permit exactly that kind of extension. Bulk operations are supported, and this is so good because devices are often procured in bulk π
The main goal of this specification is to provision the network for onboarding and communications access to and from devices within a local deployment, based on the underlying capabilities of those devices π
The security mechanisms of devices range from non-existent, like the Bluetooth Low Energy (BLE) "Just Works" pairing method, all the way up to a robust FIDO Device Onboard (FDO) mechanism π Information from the SCIM server gets dispatched to control functions based on the selected schema extensions, so these communications can happen within a network β¨ Basically, the SCIM database is essentially equivalent to a network's Authentication, Authorization, and Accounting (AAA) database, so it should be carefully managed as such π
1.1. Why SCIM for Devices? π·
There are a bunch of existing models that could be the basis for provisioning devices onto a network. Two are standardized by the IETF: NETCONF [RFC6241] or RESTCONF [RFC8040] with YANG [RFC7950]. SCIM was chosen for these reasons π
- NETCONF and RESTCONF focus on configuration rather than provisioning. π οΈ
- SCIM is designed with inter-domain provisioning in mind. Because it uses HTTP as a substrate, it supports both user-based authentication for local provisioning apps and OAUTH or certificate-based authentication π The inter-domain nature of these operations doesn't expose local policy. Local policy has to be configured with other APIs, and many of those aren't standardized (and often the policy really is configured that way) π
- SCIM is also a familiar tool in enterprise environments, where it's used a lot to configure federated user accounts π’
- Finally, once you pick a vehicle like SCIM, you're beholden to its data model. The SCIM data model is more targeted to provisioning, as laid out in [RFC7643] π
Taken together with the fact that end devices aren't meant to be directly configured, this leaves SCIM as the best standard option π
1.2. Protocol Participants π§ββοΈ
In the normal SCIM model, the presumption was that large federated deployments would be SCIM clients, provisioning and removing employees and contractors as they join and leave. Federated services like sales, payment, or conferencing would be the servers πΌ
In the device model, the roles are flipped and can be a bit more varied π The SCIM server lives within a deployment and is used to receive information about devices that are expected to connect to its network. That server applies appropriate local policies about whether and how the device should connect π₯
The client could be one of a few different entities:
- A vendor who's authorized to add devices to a network as part of a sales transaction. This is similar to the sales integration sometimes envisioned by Bootstrapping Remote Secure Key Infrastructure (BRSKI) [RFC8995] ποΈ
- A client app that admins or employees use to add, remove, or get info about devices. For example, a tablet or phone app that scans Wi-Fi Easy Connect QR codes π±
Here's the non-IP picture π
+-----------------------------------+
| |
+-----------+ Request | +---------+ |
| Onboarding|------------->| SCIM | |
| App |<-------------| Server | |
+-----------+ Ctrl Endpt +---------+ |
| | |
| |(Device Info) |
| v |
+-----------+ | +------------+ +-------+ |
| Control |...........|..| ALG |.........|Device | |
| App | | +------------+ +-------+ |
+-----------+ | |
| Local Network |
+-----------------------------------+
Figure 1: Basic Architecture - Non-IP Example
In Figure 1, the onboarding app (app) provides the device particulars. These vary based on the type of device, as indicated by the selection of schema extensions π As part of the response, the SCIM server might give back additional info, especially for non-IP devices, where an application-layer gateway may need to be used to talk to the device (c.f., [NIPC]) π§ The control endpoint is one of several objects that may be returned. That control endpoint then communicates with the Application Layer Gateway (ALG) to reach the device π
Now for IP-based endpoints π
+------------------------------------+
| |
+-----------+ Request | +---------+ +----+ +------+ |
| Onboarding|------------->| SCIM |-->| AAA|<-->|Switch| |
| App |<-------------| Server | +----+ +------+ |
+-----------+ Ctrl Endpt +---------+ | |
| | |
+-----------+ | +------------+ +-------+ |
| Control |...........|..| Router/fw |.........|Device | |
| App | | +------------+ +-------+ |
+-----------+ | |
| Local Network |
+------------------------------------+
Figure 2: Interaction with AAA
Figure 2 shows how IP-based endpoints can be provisioned π¦ In this case, the onboarding app provisions a device via SCIM. The necessary info is passed to the Authentication, Authorization, and Accounting (AAA) subsystem, so the device is permitted to connect. Once it's online, since the device is IP-based, it won't need an ALG. Instead it uses the normal IP infrastructure to talk to its control app π«Ά
1.3. Schema Description π
okay so [RFC7643] doesn't give you a language for describing a schema. it just uses a narrative description with examples, and we're following that same approach β¨. we also include non-normative JSON Schemas [JSONSchema] and OpenAPI [OpenAPI] versions in the appendices to make implementing easier π«Ά. neither of those existed when SCIM was first developed π°οΈ. the only difference the authors noticed between the normative schema representations is that the JSON Schemas and OpenAPI versions can't express case sensitivity, so attributes that aren't case sensitive have to be checked manually π.
several extra schemas cover specific onboarding mechanisms, like Bluetooth Low Energy (BLE) [BLE54], Wi-Fi Easy Connect [DPP2], and FIDO Device Onboard [FDO11] π¦.
whenever JSON appears in this memo, it's folded in accordance with [RFC8792] π.
1.4. Schema Representation π
attributes in the device core schema (see Section 2.2 of [RFC7643]) and in extensions are made up of characteristics and the SCIM datatypes (defined in Section 2.3 of [RFC7643]). this specification does not define new characteristics and datatypes for the SCIM attributes π.
1.5. Terminology π
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
the reader is also expected to be familiar with the narrative schema language used in [RFC7643] π§ .
2. ResourceType Device π§
a new resource type, Device, is specified here. the "ResourceType" schema holds the metadata about a resource type (see Section 6 of [RFC7643]). it's made up of a core device schema plus several extension schemas. the core schema gives a minimal resource representation, and the extension schemas build on it depending on the device's capability β¨.
2.1. Common Attributes
the device schema has three common attributes from Section 3.1 of [RFC7643]. no semantic or syntax changes happen here. they're only listed for completeness π .
- id: A required and unique attribute of the core device schema (see Section 3.1 of [RFC7643]).
- externalId: An optional attribute (see Section 3.1 of [RFC7643]).
- meta: A required and complex attribute (see Section 3.1 of [RFC7643]).
3. SCIM Core Device Schema π
the core device schema is the minimal representation of a resource Device. it only includes the attributes any device might need, and only one attribute is required. it's identified by this schema URI:
urn:ietf:params:scim:schemas:core:2.0:Device
the following attributes are defined in the core device schema.
3.1. Singular Attributes
displayName: a string that gives a human-readable name for a device. it's meant to be shown to end users, so it should be suitable for that purpose π. the attribute isn't required and isn't case sensitive. it may be modified and SHOULD be returned by default. no uniqueness constraints are imposed on this attribute.
active: a mutable boolean that is required π. if it's set to true, the device is intended to be operational. attempts to control or access a device where this value is set to false may fail. for example, when used together with Non-Internet-Connected Physical Components (NIPC) [NIPC], commands (such as connect, disconnect, and subscribe) that an application sends to the controller for devices will be rejected by the controller π«.
mudUrl: a string that represents the URL to the Manufacturer Usage Description (MUD) file associated with this device π. this attribute is optional, mutable, and returned by default. when present, it may be used as described in [RFC8520]. the mudUrl value is case sensitive and not unique.
groups: an optional read-only complex object that indicates group membership π―. its form is precisely the same as the one defined in Section 4.1.2 of [RFC7643].
+=============+=======+=====+=======+=========+========+========+
| Attribute | Multi | Req | Case | Mutable | Return | Unique |
| | Value | | Exact | | | |
+=============+=======+=====+=======+=========+========+========+
| displayName | F | F | F | RW | Def | None |
+-------------+-------+-----+-------+---------+--------+--------+
| active | F | T | F | RW | Def | None |
+-------------+-------+-----+-------+---------+--------+--------+
| mudUrl | F | F | T | RW | Def | None |
+-------------+-------+-----+-------+---------+--------+--------+
| groups | T | F | T | RO | Def | n/a |
+-------------+-------+-----+-------+---------+--------+--------+
Table 1: Characteristics of Device Schema Attributes
Legend: Req = Required, T = True, F = False, RO = ReadOnly, RW = ReadWrite, Def = Default
Example:
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Device"],
"id": "e9e30dba-f08f-4109-8486-d5c6a3316111",
"displayName": "BLE Heart Monitor",
"active": true,
"meta": {
"resourceType": "Device",
"created": "2022-01-23T04:56:22Z",
"lastModified": "2022-05-13T04:42:34Z",
"version": "W\/\"a330bc54f0671c9\"",
"location": "https://example.com/v2/Devices/e9e30dba-f08f-\
4109-8486-d5c6a3316111"
}
}
Figure 3: Core Device Example Entries π§
4. Groups π«Ά
device and EndpointApp groups are created using the SCIM groups defined in Section 4.2 of [RFC7643]. if set, the "type" subattribute of the "members" attribute MUST be set to Device for devices and EndpointApp for endpoint applications π.
5. Resource Type EndpointApp π
this section defines the EndpointApp resource type. the "ResourceType" schema specifies the metadata about a resource type (see Section 6 of [RFC7643]). the EndpointApp resource represents client applications that can control and/or receive data from the devices π±.
6. SCIM EndpointApp Schema π
the EndpointApp schema is used to authorize control or telemetry services for clients. it identifies the application and how clients authenticate to the various services π.
the schema for EndpointApp is identified by this schema URI:
urn:ietf:params:scim:schemas:core:2.0:EndpointApp
the following attributes are defined in this schema.
6.1. Common Attributes
like Section 2.1, the EndpointApp schema has the three common attributes specified in Section 3.1 of [RFC7643] π¦.
6.2. Singular Attributes
applicationType: a string that represents the type of application. it will only contain two values: deviceControl or telemetry πΉοΈ. deviceControl is the application that sends commands to control the device. telemetry is the application that receives data from the device. the attribute is required and not case sensitive. it's immutable and should be returned by default. no uniqueness constraints are imposed on this attribute.
applicationName: a string that represents a human-readable name for the application π·οΈ. this attribute is required and mutable. it should be returned by default, and there's no uniqueness constraint on it.
clientToken: a string that contains a token the client uses to authenticate itself π. each token may be a string up to 500 characters in length. it isn't mutable. it's read-only and case sensitive, and it's generated if no certificateInfo object is provisioned. it's returned by default if it exists. the SCIM server should expect that client tokens will be shared by the SCIM client with other components within the client's infrastructure π.
groups: an optional read-only complex object that indicates group membership π―. its form is precisely the same as the one defined in Section 4.1.2 of [RFC7643].
6.3. Complex Attributes β¨
6.3.1. certificateInfo π
okay so certificateInfo is a complex attribute π that holds an X.509 certificate's subject name and root Certificate Authority (CA) info for the application clients that'll connect for device control or telemetry π§
rootCA: this is a base64-encoded string, as described in Section 4 of [RFC4648] π It's a trust anchor certificate for the certs used for client application access. The object is not required. It's singular, case sensitive, and read/write. If it isn't there, a set of trust anchors MUST be configured out of band π
subjectName: a string that holds one of two names π
- a distinguished name that will be present in the certificate subject field, as described in Section 4.1.2.4 of [RFC5280] or
- a dnsName as part of a subjectAlternateName, as described in Section 4.2.1.6 of [RFC5280]
In the latter case, servers validating such certificates SHALL reject connections when the name of the peer as resolved by a DNS reverse lookup does not match the dnsName in the certificate. π If multiple dnsNames are present, it's left to server implementations to address any authorization conflicts associated with those names. This attribute is not required and not case sensitive. It's mutable and singular β¨
+=================+=======+===+=======+=========+========+========+
| Attribute | Multi |Req| Case | Mutable | Return | Unique |
| | Value | | Exact | | | |
+=================+=======+===+=======+=========+========+========+
| applicationType | F |T | F | Imm | Def | None |
+-----------------+-------+---+-------+---------+--------+--------+
| applicationName | F |T | F | RW | Def | None |
+-----------------+-------+---+-------+---------+--------+--------+
| clientToken | F |F | T | RO | Def | None |
+-----------------+-------+---+-------+---------+--------+--------+
| certificateInfo | F |F | F | RW | Def | None |
+-----------------+-------+---+-------+---------+--------+--------+
| rootCA | F |F | T | RW | Def | None |
+-----------------+-------+---+-------+---------+--------+--------+
| subjectName | F |T | T | RW | Def | None |
+-----------------+-------+---+-------+---------+--------+--------+
| groups | T |F | T | RO | Def | n/a |
+-----------------+-------+---+-------+---------+--------+--------+
Table 2: Characteristics of EndpointApp Schema Attributes
Legend: Req = Required, T = True, F = False, RO = ReadOnly, RW = ReadWrite, N = No, Def = Default, Imm = Immutable π
If certificateInfo is provided by the client and is accepted by the server, the server MUST return that multivalued attribute in its response. Otherwise, the server is expected to return a clientToken. If the server returns neither certificateInfo nor a clientToken, then external authentication such as [OAUTHv2] MUST be pre-arranged. If the server accepts a certificate and produces a clientToken, then control and telemetry servers MUST validate both π«Ά
certificateInfo is preferred in situations where client functions are federated, so different clients may connect for different purposes π
Example:
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:EndpointApp"],
"id": "e9e30dba-f08f-4109-8486-d5c6a3316212",
"applicationType": "deviceControl",
"applicationName": "Device Control App 1",
"certificateInfo": {
"rootCA" : "MIIBIjAN...",
"subjectName": "www.example.com"
},
"meta": {
"resourceType": "EndpointApp",
"created": "2022-01-23T04:56:22Z",
"lastModified": "2022-05-13T04:42:34Z",
"version": "W\/\"a330bc54f0671c9\"",
"location": "https://example.com/v2/EndpointApps/e9e30dba-f08f-\
4109-8486-d5c6a3316212"
}
}
Figure 4: Endpoint App Example π§
7. SCIM Device Extensions π¦
SCIM provides various extension schemas and their attributes, along with JSON representations and example objects. The core schema is extended with a new resource type, Device. No schemaExtensions list is specified in that definition. Instead, IANA registry entries have been created, where all values for "required" are set to false. All extensions to the device schema MUST be registered via IANA, as described in Section 9.2. The schemas below demonstrate how this model is to work. All the SCIM server-related schema URIs are valid only with Device resource types π
7.1. Bluetooth Low Energy (BLE) Extension π‘
This schema extends the device schema to represent the devices supporting BLE. The extension is identified using the following schema URI:
urn:ietf:params:scim:schemas:extension:ble:2.0:Device
The attributes are as follows.
7.1.1. Singular Attributes β¨
deviceMacAddress: a string value that represents a public MAC address assigned by the manufacturer. It is a unique 48-bit value. It is required, case insensitive, mutable, and returned by default. The ECMA regular expression pattern [ECMA] is the following:
^[0-9A-Fa-f]{2}(:[0-9A-Fa-f]{2}){5}$
isRandom: a boolean flag π² If false, the device is using a public MAC address. If true, the device uses a random address. If an Identifying Resolving Key (IRK) is present, the address represents a resolvable private address. Otherwise, the address is assumed to be a random static address. Non-resolvable private addresses are not supported by this specification. This attribute is not required. It is mutable and is returned by default. The default value is false. See Volume 6, Part B, Section 1.3 of [BLE54] for more information about different address types.
separateBroadcastAddress: when present, this string represents an address used for broadcasts/advertisements π’ This value MUST NOT be set when an IRK is provided. Its form is the same as deviceMacAddress. It is not required. It is multivalued, mutable, and returned by default.
irk: a string value that specifies the IRK, which is unique to each device π It is used to resolve a private random address. It should only be provisioned when isRandom is true. It is mutable and never returned. For more information about the use of the IRK, see Volume 1, Part A, Section 5.4.5 of [BLE54].
mobility: a boolean attribute to enable BLE device mobility πΆββοΈ If set to true, the device could be expected to move within a network of Access Points (APs). For example, if a BLE device is connected with AP-1 and moves out of range but comes in range of AP-2, it will be disconnected with AP-1 and connected with AP-2. It is returned by default and mutable.
7.1.2. Multivalued Attributes πΈ
versionSupport: a multivalued set of strings that specifies the BLE versions supported by the device in the form of an array, for example, ["4.1", "4.2", "5.0", "5.1", "5.2", "5.3", "5.4"]. It is required, mutable, and returned by default.
pairingMethods: a multivalued set of strings that specifies pairing methods associated with the BLE device. The pairing methods may require subattributes such as key/password for the device pairing process. To enable the scalability of pairing methods in the future, they are represented as extensions to incorporate various attributes that are part of the respective pairing process. Pairing method extensions are nested inside the BLE extension. It is required, case sensitive, mutable, and returned by default π₯°
7.1.3. BLE Pairing Method Extensions π¦
okay so the details on pairing methods and their attributes live in Volume 1, Part A, Section 5.2.4 of [BLE54] π. this memo defines extensions for four pairing methods that get nested inside the BLE extension schema π«Ά. every one of them carries the common attributes from Section 2.1. here's the lineup:
pairingNull extension: π identified by this schema URI:
urn:ietf:params:scim:schemas:extension:pairingNull:2.0:Device
pairingNull has no attributes at all, literally nothing π. it allows pairing for BLE devices that don't need a pairing method. so chill, it's giving "no key needed" energy β¨
pairingJustWorks extension: πΈ identified by this schema URI:
urn:ietf:params:scim:schemas:extension:pairingJustWorks:2.0:Device
the Just Works pairing method doesn't need a key to pair devices π. for completeness the key attribute is still included, and it's set to 'null' π. the key attribute is required, immutable, and returned by default. no cap, that's a whole vibe π
pairingPassKey extension: π§ identified by this schema URI:
urn:ietf:params:scim:schemas:extension:pairingPassKey:2.0:Device
the passkey pairing method requires a 6-digit key to pair devices π₯. this extension has one singular integer attribute, "key", which is required, mutable, and returned by default. the key pattern is:
^[0-9]{6}$
pairingOOB extension: π identified by this schema URI:
urn:ietf:params:scim:schemas:extension:pairingOOB:2.0:Device
the out-of-band (OOB) pairing method has three singular attributes: key, randomNumber, and confirmationNumber π.
key: π a string value that is required and received from out-of-band sources such as Near Field Communication (NFC) π±. it's case sensitive, mutable, and returned by default.
randomNumber: π an integer that represents a nonce added to the key. it's a required attribute, mutable, and returned by default.
confirmationNumber: π«Ά an integer that some solutions require in a RESTful message exchange (where RESTful refers to the Representational State Transfer (REST) architecture) πΈ. it is not required, it's mutable, and it's returned by default if it exists.
here's the characteristics table for the BLE extension schema attributes, all in one place π:
+==================+=======+===+=======+=========+========+========+
| Attribute | Multi |Req| Case | Mutable | Return | Unique |
| | Value | | Exact | | | |
+==================+=======+===+=======+=========+========+========+
| deviceMacAddress | F |T | F | RW | Def | Manuf |
+------------------+-------+---+-------+---------+--------+--------+
| isRandom | F |F | F | RW | Def | None |
+------------------+-------+---+-------+---------+--------+--------+
| sepBroadcastAdd | T |F | F | RW | Def | None |
+------------------+-------+---+-------+---------+--------+--------+
| irk | F |F | F | WO | Nev | Manuf |
+------------------+-------+---+-------+---------+--------+--------+
| versionSupport | T |T | F | RW | Def | None |
+------------------+-------+---+-------+---------+--------+--------+
| mobility | F |F | F | RW | Def | None |
+------------------+-------+---+-------+---------+--------+--------+
| pairingMethods | T |T | T | RW | Def | None |
+------------------+-------+---+-------+---------+--------+--------+
Table 3: Characteristics of BLE Extension Schema Attributes π
Legend: sepBroadcastAdd = separateBroadcastAddress, Req = Required, T = True, F = False, RW = ReadWrite, WO = WriteOnly, Def = Default, Nev = Never, Manuf = Manufacturer π
Example: π
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Device",
"urn:ietf:params:scim:schemas:extension:ble:2.0:Device"],
"id": "e9e30dba-f08f-4109-8486-d5c6a3316111",
"displayName": "BLE Heart Monitor",
"active": true,
"urn:ietf:params:scim:schemas:extension:ble:2.0:Device" : {
"versionSupport": ["5.4"],
"deviceMacAddress": "2C:54:91:88:C9:E2",
"isRandom": false,
"separateBroadcastAddress": ["AA:BB:88:77:22:11", "AA:BB:88:77:\
22:12"],
"mobility": true,
"pairingMethods": ["urn:ietf:params:scim:schemas:extension:\
pairingPassKey:2.0:Device"],
"urn:ietf:params:scim:schemas:extension:pairingPassKey:2.0:\
Device" : {
"key": 123456
}
},
"meta": {
"resourceType": "Device",
"created": "2022-01-23T04:56:22Z",
"lastModified": "2022-05-13T04:42:34Z",
"version": "W\/\"a330bc54f0671c9\"",
"location": "https://example.com/v2/Devices/e9e30dba-f08f-4109-\
8486-d5c6a3316111"
}
}
Figure 5: BLE Example π
in the example above, the pairing method is "pairingPassKey", which means this BLE device pairs using only a passkey π. in another example below, the pairing method is "pairingOOB", showing that this BLE device uses the out-of-band pairing method π¦.
Example: πΈ
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Device",
"urn:ietf:params:scim:schemas:extension:ble:2.0:Device"],
"id": "e9e30dba-f08f-4109-8486-d5c6a3316111",
"displayName": "BLE Heart Monitor",
"active": true,
"urn:ietf:params:scim:schemas:extension:ble:2.0:Device" : {
"versionSupport": ["5.4"],
"deviceMacAddress": "2C:54:91:88:C9:E2",
"isRandom": false,
"separateBroadcastAddress": ["AA:BB:88:77:22:11", "AA:BB:88:77:\
22:12"],
"mobility": true,
"pairingMethods": ["urn:ietf:params:scim:schemas:extension:\
pairingOOB:2.0:Device"],
"urn:ietf:params:scim:schemas:extension:pairingOOB:2.0:Device": {
"key": "TheKeyvalueRetrievedFromOOB",
"randomNumber": 238796813516896
}
},
"meta": {
"resourceType": "Device",
"created": "2022-01-23T04:56:22Z",
"lastModified": "2022-05-13T04:42:34Z",
"version": "W\/\"a330bc54f0671c9\"",
"location": "https://example.com/v2/Devices/e9e30dba-f08f-4109-\
8486-d5c6a3316111"
}
}
Figure 6: BLE with pairingOOB π«Ά
however, a device can have more than one pairing method π€―. support for multiple pairing methods is also provided by the multivalued attribute pairingMethods β¨. in the example below, the BLE device can pair with both passkey and OOB pairing methods π.
Example: π§
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Device",
"urn:ietf:params:scim:schemas:extension:ble:2.0:Device"],
"id": "e9e30dba-f08f-4109-8486-d5c6a3316111",
"displayName": "BLE Heart Monitor",
"active": true,
"urn:ietf:params:scim:schemas:extension:ble:2.0:Device" : {
"versionSupport": ["5.4"],
"deviceMacAddress": "2C:54:91:88:C9:E2",
"isRandom": false,
"separateBroadcastAddress": ["AA:BB:88:77:22:11", "AA:BB:88:77:\
22:12"],
"mobility": true,
"pairingMethods": ["urn:ietf:params:scim:schemas:extension:\
pairingPassKey:2.0:Device",
"urn:ietf:params:scim:schemas:extension:pairingOOB:2.0:\
Device"],
"urn:ietf:params:scim:schemas:extension:pairingPassKey:2.0:\
Device" : {
"key": 123456
},
"urn:ietf:params:scim:schemas:extension:pairingOOB:2.0:Device": {
"key": "TheKeyvalueRetrievedFromOOB",
"randomNumber": 238796813516896
}
},
"meta": {
"resourceType": "Device",
"created": "2022-01-23T04:56:22Z",
"lastModified": "2022-05-13T04:42:34Z",
"version": "W\/\"a330bc54f0671c9\"",
"location": "https://example.com/v2/Devices/e9e30dba-f08f-4109-\
8486-d5c6a3316111"
}
}
Figure 7: BLE Pairing with Both Passkey and OOB π
7.2. Wi-Fi Easy Connect Extension πΆ
this section describes a schema that extends the device schema to enable Wi-Fi Easy Connect (otherwise known as Device Provisioning Protocol (DPP)) π. throughout this specification, we use the term "DPP" β¨. the extension is identified by this schema URI:
urn:ietf:params:scim:schemas:extension:dpp:2.0:Device
the attributes in this extension are adopted from [DPP2] π. here they are.
7.2.1. Singular Attributes π
dppVersion: an integer that represents the version of DPP the device supports π₯. this attribute is required, case insensitive, mutable, and returned by default.
bootstrapKey: a string value representing an Elliptic Curve Diffie-Hellman (ECDH) public key π. the base64-encoded lengths for P-256, P-384, and P-521 are 80, 96, and 120 characters π . this attribute is required, case sensitive, write only, and never returned π.
deviceMacAddress: a MAC address stored as a string π±. it's a unique 48-bit value π¦. this attribute is optional, case insensitive, mutable, and returned by default. its form is identical to that of the deviceMacAddress for BLE devices π«Ά.
serialNumber: an alphanumeric serial number stored as a string πΈ. it may also be passed as bootstrapping information π§. this attribute is optional, case insensitive, mutable, and returned by default β¨.
7.2.2. Multivalued Attributes π
okay so this part is where the multivalued attributes for the Wi-Fi Easy Connect extension live, and bestie, the tables are giving main character energy π
bootstrappingMethod: One or more strings of all the bootstrapping methods available on the enrollee device, for example, [QR, NFC]. This attribute is optional, case insensitive, mutable, and returned by default. π
classChannel: One or more strings representing the global operating class and channel shared as bootstrapping information. It is formatted as class/channel, for example, ['81/1','115/36']. This attribute is optional, case insensitive, mutable, and returned by default. β¨
Here's the full characteristics table for the DPP extension schema attributes, slay π¦
+=====================+=====+===+=====+=========+========+========+
| Attribute |Multi|Req|Case | Mutable | Return | Unique |
| |Value| |Exact| | | |
+=====================+=====+===+=====+=========+========+========+
| dppVersion |F |T |F | RW | Def | None |
+---------------------+-----+---+-----+---------+--------+--------+
| bootstrapKey |F |T |T | WO | Nev | None |
+---------------------+-----+---+-----+---------+--------+--------+
| deviceMacAddress |F |F |F | RW | Def | Manuf |
+---------------------+-----+---+-----+---------+--------+--------+
| serialNumber |F |F |F | RW | Def | None |
+---------------------+-----+---+-----+---------+--------+--------+
| bootstrappingMethod |T |F |F | RW | Def | None |
+---------------------+-----+---+-----+---------+--------+--------+
| classChannel |T |F |F | RW | Def | None |
+---------------------+-----+---+-----+---------+--------+--------+
Table 4: Characteristics of DPP Extension Schema Attributes
Legend: Req = Required, T = True, F = False, RW = ReadWrite, WO = WriteOnly, Def = Default, Nev = Never, Manuf = Manufacturer
Example time π§ Here's the DPP device, with its bootstrapping info and everything:
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Device",
"urn:ietf:params:scim:schemas:extension:dpp:2.0:\
Device"],
"id": "e9e30dba-f08f-4109-8486-d5c6a3316111",
"displayName": "WiFi Heart Monitor",
"active": true,
"urn:ietf:params:scim:schemas:extension:dpp:2.0:Device" : {
"dppVersion": 2,
"bootstrappingMethod": ["QR"],
"bootstrapKey": "\
MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgADURzxmttZoIRIPWGoQMV00XHWCAQIhXru\
VWOz0NjlkIA=",
"deviceMacAddress": "2C:54:91:88:C9:F2",
"classChannel": ["81/1", "115/36"],
"serialNumber": "4774LH2b4044"
},
"meta": {
"resourceType": "Device",
"created": "2022-01-23T04:56:22Z",
"lastModified": "2022-05-13T04:42:34Z",
"version": "W\/\"a330bc54f0671c9\"",
"location": "https://example.com/v2/Devices/e9e30dba-f08f-\
4109-8486-d5c6a3316111"
}
}
Figure 8: DPP Example
7.3. Ethernet MAB Extension β¨
This extension enables a legacy means of (very) weak authentication, known as MAC Authenticated Bypass (MAB), that is supported in many wired ethernet solutions. If the MAC address is known, then the device may be permitted (perhaps limited) access. The extension is identified by the following URI:
urn:ietf:params:scim:schemas:extension:ethernet-mab:2.0:Device
Note that this method is not likely to work properly with MAC address randomization. π
7.3.1. Single Attribute πΈ
This extension has a singular attribute:
deviceMacAddress: This is the Ethernet address to be provisioned onto the network. It takes the identical form as found in the BLE extension.
+==================+=======+===+=======+=========+========+========+
| Attribute | Multi |Req| Case | Mutable | Return | Unique |
| | Value | | Exact | | | |
+==================+=======+===+=======+=========+========+========+
| deviceMacAddress | F |T | F | RW | Def | None |
+------------------+-------+---+-------+---------+--------+--------+
Table 5: Characteristics of MAB Extension Schema Attributes
Legend: Req = Required, T = True, F = False, RW = ReadWrite, Def = Default
Example, bestie π
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Device",
"urn:ietf:params:scim:schemas:extension:ethernet-mab:2.0:Device\
"],
"id": "e9e30dba-f08f-4109-8486-d5c6a3316111",
"displayName": "Some random Ethernet Device",
"active": true,
"urn:ietf:params:scim:schemas:extension:ethernet-mab:2.0:Device" \
: {
"deviceMacAddress": "2C:54:91:88:C9:E2"
},
"meta": {
"resourceType": "Device",
"created": "2022-01-23T04:56:22Z",
"lastModified": "2022-05-13T04:42:34Z",
"version": "W\/\"a330bc54f0671c9\"",
"location": "https://example.com/v2/Devices/e9e30dba-f08f-4109-\
8486-d5c6a3316111"
}
}
Figure 9: MAB Example
7.4. FIDO Device Onboard Extension π₯
This extension specifies a voucher to be used by the FDO Device Onboard (FDO) protocols [FDO11] to complete a trusted transfer of ownership and control of the device to the environment. The SCIM server MUST know how to process the voucher, either directly or by forwarding it along to an owner process as defined in the FDO specification. The extension is identified using the following schema URI:
urn:ietf:params:scim:schemas:extension:fido-device-onboard:2.0:Device
7.4.1. Single Attribute π
This extension has a singular attribute:
fdoVoucher: The voucher is formatted as a PEM-encoded object in accordance with [FDO11].
+============+=======+=====+=======+=========+========+========+
| Attribute | Multi | Req | Case | Mutable | Return | Unique |
| | Value | | Exact | | | |
+============+=======+=====+=======+=========+========+========+
| fdoVoucher | F | T | F | WO | Nev | None |
+------------+-------+-----+-------+---------+--------+--------+
Table 6: Characteristics of FDO Extension Schema Attributes
Legend: Req = Required, T = True, F = False, WO = WriteOnly, Nev = Never
Example:
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Device",
"urn:ietf:params:scim:schemas:extension:fido-device-onboard:2.0\
:Device"],
"id": "e9e30dba-f08f-4109-8486-d5c6a3316111",
"displayName": "Some random Ethernet Device",
"active": true,
"urn:ietf:params:scim:schemas:extension:fido-device-onboard:2.0:\
Device" : {
"fdoVoucher": "{... voucher ...}"
},
"meta": {
"resourceType": "Device",
"created": "2022-01-23T04:56:22Z",
"lastModified": "2022-05-13T04:42:34Z",
"version": "W\/\"a330bc54f0671c9\"",
"location": "https://example.com/v2/Devices/e9e30dba-f08f-4109-\
8486-d5c6a3316111"
}
}
Figure 10: FDO Example
7.5. Zigbee Extension π
This section describes a schema that extends the device schema to enable the provisioning of Zigbee devices [Zigbee]. The extension is identified using the following schema URI:
urn:ietf:params:scim:schemas:extension:zigbee:2.0:Device
It has one singular attribute and one multivalued attribute. The attributes are as follows.
7.5.1. Singular Attribute π
deviceEui64Address: A 64-bit Extended Unique Identifier (EUI-64) device address stored as string. This attribute is required, case insensitive, mutable, and returned by default. It takes the same form as the deviceMacAddress in the BLE extension.
7.5.2. Multivalued Attribute π
versionSupport: One or more strings of all the Zigbee versions supported by the device, for example, [3.0]. This attribute is required, case insensitive, mutable, and returned by default.
+====================+=====+===+=======+=========+========+========+
| Attribute |Multi|Req| Case | Mutable | Return | Unique |
| |Value| | Exact | | | |
+====================+=====+===+=======+=========+========+========+
| deviceEui64Address |F |T | F | RW | Def | None |
+--------------------+-----+---+-------+---------+--------+--------+
| versionSupport |T |T | F | RW | Def | None |
+--------------------+-----+---+-------+---------+--------+--------+
Table 7: Characteristics of Zigbee Extension Schema Attributes
Legend: Req = Required, T = True, F = False, RW = ReadWrite, Def = Default
Example:
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Device",
"urn:ietf:params:scim:schemas:extension:zigbee:2.0:Device"],
"id": "e9e30dba-f08f-4109-8486-d5c6a3316111",
"displayName": "Zigbee Heart Monitor",
"active": true,
"urn:ietf:params:scim:schemas:extension:zigbee:2.0:Device" : {
"versionSupport": ["3.0"],
"deviceEui64Address": "50:32:5F:FF:FE:E7:67:28"
},
"meta": {
"resourceType": "Device",
"created": "2022-01-23T04:56:22Z",
"lastModified": "2022-05-13T04:42:34Z",
"version": "W\/\"a330bc54f0671c9\"",
"location": "https://example.com/v2/Devices/e9e30dba-f08f-4109-\
8486-d5c6a3316111"
}
}
Figure 11: Zigbee Example
7.6. The Endpoint Applications Extension Schema π§
Sometimes non-IP devices such as those using BLE or Zigbee require an application gateway interface to manage them. π«Ά
endpointAppsExt provides the list of applications that connect to an enterprise gateway. endpointAppsExt has one multivalued attribute and two singular attributes. The extension is identified using the following schema URI:
urn:ietf:params:scim:schemas:extension:endpointAppsExt:2.0:Device
7.6.1. Singular Attributes β¨
okay so there are two singular attributes here and they're both read-only, which is lowkey iconic π
deviceControlEnterpriseEndpoint: a string holding the URL of the enterprise endpoint used to reach the enterprise gateway. when the enterprise gets the SCIM object from the onboarding application, it adds this attribute and sends the object back to the onboarding application as a response. this attribute is required, case sensitive, read-only, and returned by default. the enterprise is the one who enforces uniqueness π
telemetryEnterpriseEndpoint: a string holding a URL of the enterprise endpoint used to reach an enterprise gateway for telemetry π‘ same flow as above: the enterprise adds it to the SCIM object and sends it back to the onboarding application. this attribute is optional, case sensitive, read-only, and returned by default, and the enterprise enforces uniqueness here too. it only gets populated when the enterprise actually provides a telemetry endpoint (for example, one hosted by the enterprise gateway). if the SCIM server doesn't know about a telemetry service, the attribute just won't be returned π in that case, if the application needs telemetry, separate arrangements must be made.
7.6.2. Multivalued Attribute π¦
applications: a multivalued attribute made up of one or more complex attributes, each representing an endpoint application. the list covers deviceControl and telemetry. every entry has two attributes, "value" and "$ref".
value: a string containing the identifier of the endpoint application, formatted as a Universally Unique Identifier (UUID) π it's the same as the common attribute "$id" of the EndpointApp resource. it's read/write, required, case insensitive, and returned by default.
$ref: a reference to the matching EndpointApp resource object stored in the SCIM server. it's readOnly, required, case sensitive, and returned by default.
Here's the whole attribute breakdown in one table, because it's so much easier to scan at a glance π
+====================+=====+===+=======+=========+========+========+
| Attribute |Multi|Req| Case | Mutable | Return | Unique |
| |Value| | Exact | | | |
+====================+=====+===+=======+=========+========+========+
| devContEntEndpoint |F |T | T | RO | Def | Ent |
+--------------------+-----+---+-------+---------+--------+--------+
| telEntEndpoint |F |F | T | RO | Def | Ent |
+--------------------+-----+---+-------+---------+--------+--------+
| applications |T |T | F | RW | Def | None |
+--------------------+-----+---+-------+---------+--------+--------+
| value |F |T | F | RW | Def | None |
+--------------------+-----+---+-------+---------+--------+--------+
| $ref |F |T | T | RO | Def | None |
+--------------------+-----+---+-------+---------+--------+--------+
Table 8: Characteristics of endpointAppsExt Extension Schema
Attributes
Legend, for the shorthand-lovers π
Legend: devContEntEndpoint = deviceControlEnterpriseEndpoint,
telEntEndpoint = telemetryEnterpriseEndpoint,
Req = Required, T = True, F = False, RO = ReadOnly,
RW = ReadWrite, Ent = Enterprise, Def = Default
And here's a full example so you can see how it all clicks together π§
Example:
<CODE BEGINS>
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Device",
"urn:ietf:params:scim:schemas:extension:ble:2.0:Device",
"urn:ietf:params:scim:schemas:extension:endpointAppsExt:2.0:\
Device"],
"id": "e9e30dba-f08f-4109-8486-d5c6a3316111",
"displayName": "BLE Heart Monitor",
"active": true,
"urn:ietf:params:scim:schemas:extension:ble:2.0:Device" : {
"versionSupport": ["5.4"],
"deviceMacAddress": "2C:54:91:88:C9:E2",
"isRandom": false,
"separateBroadcastAddress": ["AA:BB:88:77:22:11", "AA:BB:88:77:\
22:12"],
"mobility": false,
"pairingMethods": [
"urn:ietf:params:scim:schemas:extension:pairingPassKey:2.0:\
Device"],
"urn:ietf:params:scim:schemas:extension:pairingPassKey:2.0:\
Device" : {
"key": 123456
}
},
"urn:ietf:params:scim:schemas:extension:endpointAppsExt:2.0:Device\
": {
"applications": [
{
"value" : "e9e30dba-f08f-4109-8486-d5c6a3316212",
"$ref" : "https://example.com/v2/EndpointApps/e9e30dba-f08f-\
4109-8486-d5c6a3316212"
},
{
"value" : "e9e30dba-f08f-4109-8486-d5c6a3316333",
"$ref" : "https://example.com/v2/EndpointApps/e9e30dba-f08f-\
4109-8486-d5c6a3316333"
}
],
"deviceControlEnterpriseEndpoint": "https://example.com/\
device_control_app_endpoint/",
"telemetryEnterpriseEndpoint": "mqtts://example.com/\
telemetry_app_endpoint/"
},
"meta": {
"resourceType": "Device",
"created": "2022-01-23T04:56:22Z",
"lastModified": "2022-05-13T04:42:34Z",
"version": "W\/\"a330bc54f0671c9\"",
"location": "https://example.com/v2/Devices/e9e30dba-f08f-4109-\
8486-d5c6a3316111"
}
}
<CODE ENDS>
Figure 12: Endpoint Applications Extension Example π
The endpointAppsExt schema, along with the BLE extension, is written out in JSON in Appendix A.9, and the OpenAPI version is in Appendix B.8 π
8. Security Considerations π
Provisioning lets devices onto a network, so this part is serious, bestie. Each SCIM client MUST be appropriately authenticated. no exceptions π ββοΈ
8.1. SCIM Operations
An attacker that has authenticated to a trusted SCIM client could mess with parts of the SCIM database π¬ to make the risks clear, each operation is spelled out below.
8.1.1. Unauthorized Object Creation
An authenticated attacker could try to add elements that the enterprise wouldn't normally allow on its network. for example, an enterprise may not want devices with well-known vulnerabilities showing up in its environment. to mitigate this, network administrators should layer additional policies about which devices are permitted on the network.
An attacker that gets into SCIM could try to add an IP-based device that itself attempts unauthorized access, basically acting like a bot π€ Network administrators SHOULD establish appropriate access-control policies that follow the principle of least privilege to mitigate this attack.
8.2. Object Deletion
Once access is granted, the server may or may not act when the object is removed π€·ββοΈ deleting the object is a signal from the application that it no longer expects the device to be on the network. it's strictly up to the SCIM server and its back-end policy to decide whether to revoke access to the infrastructure. It is RECOMMENDED that SCIM delete operations trigger a workflow in accordance with local network policy.
8.3. Read Operations
Read operations are how an application syncs its state, so it knows which devices it's supposed to manage π an attacker with access to SCIM objects might get access to the devices themselves. to stop one SCIM client from interfering with devices it has no business managing, only clients that created the objects, or the ones they authorize, SHOULD be able to read those objects π
8.4. Update Operations
Update operations may be necessary if a device has been changed in some way π οΈ attackers with update access might be able to cut a device off from the network, or cut a network off from its devices π± to avoid that, the same access control policy used for read operations is RECOMMENDED here too.
8.5. Higher Level Protection for Certain Systems
Devices provisioned with this model may be completely controlled by the administrator of the SCIM server, depending on how those systems are defined ποΈ for instance, if BLE passkeys are provided, the device can be connected to, and maybe paired with. if the administrator of the SCIM client doesn't want the network to have full access to the device, the device itself MUST support finer levels of access control and additional authentication mechanisms. any extra security has to come from higher application layers. for example, if client applications want to keep private information flowing to and from the device, they should encrypt that information over-the-top πβ¨
8.6. Logging
An attacker could figure out which devices are on a network just by examining SCIM logs π because SCIM operations are sensitive, logs SHOULD be encrypted both on disk and in transit π
9. IANA Considerations π
9.1. New Schemas
IANA has added the following entries to the "SCIM Schema URIs for Data Resources" registry ποΈ
Schema URI: urn:ietf:params:scim:schemas:core:2.0:Device
Name: Core Device Schema
Reference: RFC 9944, Section 3
Schema URI: urn:ietf:params:scim:schemas:core:2.0:EndpointApp
Name: Endpoint Application
Reference: RFC 9944, Section 6
9.2. Device Schema Extensions
IANA has created the following extensions in the "SCIM Server-Related Schema URIs" registry (leaving out the "Resource Type" field) as described in Section 7 πΈ
Schema URI: urn:ietf:params:scim:schemas:extension:ble:2.0:Device
Name: BLE Extension
Resource Type: Device
Reference: RFC 9944, Section 7.1
Schema URI:
urn:ietf:params:scim:schemas:extension:ethernet-mab:2.0:Device
Name: Ethernet MAB
Resource Type: Device
Reference: RFC 9944, Section 7.3
Schema URI:
urn:ietf:params:scim:schemas:extension:fido-device-
onboard:2.0:Device
Name: FIDO Device Onboard
Resource Type: Device
Reference: RFC 9944, Section 7.4
Schema URI: urn:ietf:params:scim:schemas:extension:dpp:2.0:Device
Name: Wi-Fi Easy Connect
Resource Type: Device
Reference: RFC 9944, Section 7.2
Schema URI:
urn:ietf:params:scim:schemas:extension:endpointAppsExt:2.0:Device
Name: Application Endpoint Extension
Resource Type: Device
Reference: RFC 9944, Section 7.6
Schema URI:
urn:ietf:params:scim:schemas:extension:pairingJustWorks:2.0:Device
Name: Just Works Auth BLE
Resource Type: Device
Reference: RFC 9944, Section 7.1.3
Schema URI:
urn:ietf:params:scim:schemas:extension:pairingOOB:2.0:Device
Name: Out-of-Band Pairing for BLE
Resource Type: Device
Reference: RFC 9944, Section 7.1.3
Schema URI:
urn:ietf:params:scim:schemas:extension:pairingPassKey:2.0:Device
Name: Passkey Pairing for BLE
Resource Type: Device
Reference: RFC 9944, Section 7.1.3
Schema URI:
urn:ietf:params:scim:schemas:extension:pairingNull:2.0:Device
Name: Pairing Null
Resource Type: Device
Reference: RFC 9944, Section 7.1.3
Schema URI: urn:ietf:params:scim:schemas:extension:zigbee:2.0:Device
Name: Zigbee
Resource Type: Device
Reference: RFC 9944, Section 7.5
10. References π
10.1. Normative References πβ¨
These are the must-read specs for this doc, bestie, so grab your snacks π
- [BLE54] Bluetooth SIG, "Bluetooth Core Specification", Version 5.4, 2023,
https://www.bluetooth.org/DocMan/handlers/DownloadDoc.ashx?doc_id=587177. - [DPP2] Wi-Fi Alliance, "Wi-Fi Easy Connect Specification", Version 3.0, 2020,
https://www.wi-fi.org/system/files/Wi-Fi_Easy_Connect_Specification_v3.0.pdf. - [ECMA] ECMA International, "ECMAScript(R) 2025 Language Specification", ECMA-262, 16th Edition, June 2025,
https://ecma-international.org/publications-and-standards/standards/ecma-262/. - [FDO11] FIDO Alliance, "FIDO Device Onboard Specification 1.1", Proposed Standard, April 2022,
https://fidoalliance.org/specs/FDO/FIDO-Device-Onboard-PS-v1.1-20220419/FIDO-Device-Onboard-PS-v1.1-20220419.html. - [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997,
https://www.rfc-editor.org/info/rfc2119. - [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006,
https://www.rfc-editor.org/info/rfc4648. - [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., Housley, R., and W. Polk, "Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008,
https://www.rfc-editor.org/info/rfc5280. - [RFC7643] Hunt, P., Ed., Grizzle, K., Wahlstroem, E., and C. Mortimore, "System for Cross-domain Identity Management: Core Schema", RFC 7643, DOI 10.17487/RFC7643, September 2015,
https://www.rfc-editor.org/info/rfc7643. - [RFC7644] Hunt, P., Ed., Grizzle, K., Ansari, M., Wahlstroem, E., and C. Mortimore, "System for Cross-domain Identity Management: Protocol", RFC 7644, DOI 10.17487/RFC7644, September 2015,
https://www.rfc-editor.org/info/rfc7644. - [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017,
https://www.rfc-editor.org/info/rfc8174. - [RFC8520] Lear, E., Droms, R., and D. Romascanu, "Manufacturer Usage Description Specification", RFC 8520, DOI 10.17487/RFC8520, March 2019,
https://www.rfc-editor.org/info/rfc8520. - [Zigbee] Zigbee Alliance, "Zigbee Specification", ZigBee Document 05-3474-21, August 2015,
https://zigbeealliance.org/wp-content/uploads/2019/11/docs-05-3474-21-0csg-zigbee-specification.pdf.
10.2. Informative References π§
These ones are the extra-credit reading, the "oh wait, let me look that up" list π
- [JSONSchema] Wright, A., Ed., Andrews, H. A., Ed., Hutton, B., Ed., and G. Dennis, "JSON Schema: A Media Type for Describing JSON Documents", December 2022,
https://json-schema.org/draft/2020-12/json-schema-core. - [NIPC] Brinckman, B., Mohan, R., and B. Sanford, "An Application Layer Interface for Non-Internet-Connected Physical Components (NIPC)", Work in Progress, Internet-Draft, draft-ietf-asdf-nipc-19, 21 April 2026,
https://datatracker.ietf.org/doc/html/draft-ietf-asdf-nipc-19. - [OAUTHv2] Hardt, D., Ed., "The OAuth 2.0 Authorization Framework", RFC 6749, DOI 10.17487/RFC6749, October 2012,
https://www.rfc-editor.org/info/rfc6749. - [OpenAPI] Swagger, "OpenAPI Specification", Version 3.1.1, October 2024,
https://swagger.io/specification/. - [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., "Network Configuration Protocol (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011,
https://www.rfc-editor.org/info/rfc6241. - [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", RFC 7950, DOI 10.17487/RFC7950, August 2016,
https://www.rfc-editor.org/info/rfc7950. - [RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017,
https://www.rfc-editor.org/info/rfc8040. - [RFC8792] Watsen, K., Auerswald, E., Farrel, A., and Q. Wu, "Handling Long Lines in Content of Internet-Drafts and RFCs", RFC 8792, DOI 10.17487/RFC8792, June 2020,
https://www.rfc-editor.org/info/rfc8792. - [RFC8995] Pritikin, M., Richardson, M., Eckert, T., Behringer, M., and K. Watsen, "Bootstrapping Remote Secure Key Infrastructure (BRSKI)", RFC 8995, DOI 10.17487/RFC8995, May 2021,
https://www.rfc-editor.org/info/rfc8995.
Appendix A. JSON Schema Representation π
Okay, the schema corner is here, and it's giving pure JSON realness π€π
A.1. Resource Schema πΈ
<CODE BEGINS>
[
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:ResourceType"\
],
"id": "Device",
"name": "Device",
"endpoint": "/Devices",
"description": "Device account.",
"schema": "urn:ietf:params:scim:schemas:core:2.0:Device",
"meta": {
"location": "https://example.com/v2/ResourceTypes/Device",
"resourceType": "ResourceType"
}
},
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:ResourceType"\
],
"id": "EndpointApp",
"name": "EndpointApp",
"endpoint": "/EndpointApps",
"description": "Endpoint application such as device control and \
telemetry.",
"schema": "urn:ietf:params:scim:schemas:core:2.0:EndpointApp",
"meta": {
"location": "https://example.com/v2/ResourceTypes/EndpointApps",
"resourceType": "ResourceType"
}
}
]
<CODE ENDS>
A.2. Core Device Schema π
<CODE BEGINS>
{
"id": "urn:ietf:params:scim:schemas:core:2.0:Device",
"name": "Device",
"description": "Entry containing attributes about a device.",
"attributes" : [
{
"name": "displayName",
"type": "string",
"description": "Human-readable name of the device, suitable \
for displaying to end users, for example, 'BLE Heart Monitor' etc.",
"multiValued": false,
"required": false,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "active",
"type": "boolean",
"description": "A mutable boolean value indicating the device \
administrative status. If true, the commands (such as connect, \
disconnect, subscribe) that control app sends to the controller for \
the devices will be processed by the controller. If false, any \
command coming from the control app for the device will be \
rejected by the controller.",
"multiValued": false,
"required": true,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "mudUrl",
"type": "reference",
"description": "A URL to MUD file of the device (RFC 8520).",
"multiValued": false,
"required": false,
"caseExact": true,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "groups",
"type": "complex",
"multiValued": true,
"description": "A list of groups to which the device belongs, \
either through direct membership, through nested groups, or \
dynamically calculated.",
"required": false,
"subAttributes": [
{
"name": "value",
"type": "string",
"multiValued": false,
"description": "The identifier of the device's group.",
"required": false,
"caseExact": false,
"mutability": "readOnly",
"returned": "default",
"uniqueness": "none"
},
{
"name": "$ref",
"type": "reference",
"referenceTypes": [
"Group"
],
"multiValued": false,
"description": "The URI of the corresponding 'Group' \
resource to which the device belongs.",
"required": false,
"caseExact": false,
"mutability": "readOnly",
"returned": "default",
"uniqueness": "none"
},
{
"name": "display",
"type": "string",
"multiValued": false,
"description": "A human-readable name, primarily used for \
display purposes. READ-ONLY.",
"required": false,
"caseExact": false,
"mutability": "readOnly",
"returned": "default",
"uniqueness": "none"
},
{
"name": "type",
"type": "string",
"multiValued": false,
"description": "A label indicating the attribute's \
function, e.g., 'direct' or 'indirect'.",
"required": false,
"caseExact": false,
"canonicalValues": [
"direct",
"indirect"
],
"mutability": "readOnly",
"returned": "default",
"uniqueness": "none"
}
],
"mutability": "readOnly",
"returned": "default"
}
],
"meta" : {
"resourceType" : "Schema",
"location" :
"/v2/Schemas/urn:ietf:params:scim:schemas:core:2.0:Device"
}
}
<CODE ENDS>
A.3. EndpointApp Schema β¨
okay so this is the EndpointApp schema π it's where endpoint apps and their credentials live, bestie. I copied it over exactly, character for character, so nothing gets lost π«Ά
{
"id": "urn:ietf:params:scim:schemas:core:2.0:EndpointApp",
"name": "EndpointApp",
"description": "Endpoint application and their credentials.",
"attributes" : [
{
"name": "applicationType",
"type": "string",
"description": "This attribute will only contain two values: \
deviceControl or telemetry.",
"multiValued": false,
"required": true,
"caseExact": false,
"mutability": "readOnly",
"returned": "default",
"uniqueness": "none"
},
{
"name": "applicationName",
"type": "string",
"description": "Human-readable name of the application.",
"multiValued": false,
"required": true,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "certificateInfo",
"type": "complex",
"description": "Contains X.509 certificate's subject name and \
root CA information associated with the device control or telemetry \
app.",
"multiValued": false,
"required": false,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none",
"subAttributes" : [
{
"name" : "rootCA",
"type" : "string",
"description" : "The base64 encoding of the DER encoding \
of the CA certificate.",
"multiValued" : false,
"required" : false,
"caseExact" : true,
"mutability" : "readWrite",
"returned" : "default",
"uniqueness" : "none"
},
{
"name" : "subjectName",
"type" : "string",
"description" : "A Common Name (CN) of the form of CN = \
dnsName.",
"multiValued" : false,
"required" : true,
"caseExact" : true,
"mutability" : "readWrite",
"returned" : "default",
"uniqueness" : "none"
}
]
},
{
"name": "clientToken",
"type": "string",
"description": "This attribute contains a token that the \
client will use to authenticate itself. Each token may be a string \
up to 500 characters in length.",
"multiValued": false,
"required": false,
"caseExact": true,
"mutability": "readOnly",
"returned": "default",
"uniqueness": "none"
},
{
"name": "groups",
"type": "complex",
"multiValued": true,
"description": "A list of groups to which an endpoint \
application belongs, either through direct membership, through \
nested groups, or dynamically calculated.",
"required": false,
"subAttributes": [
{
"name": "value",
"type": "string",
"multiValued": false,
"description": "The identifier of the endpoint application\
's group.",
"required": false,
"caseExact": false,
"mutability": "readOnly",
"returned": "default",
"uniqueness": "none"
},
{
"name": "$ref",
"type": "reference",
"referenceTypes": [
"Group"
],
"multiValued": false,
"description": "The URI of the corresponding 'Group' \
resource to which the endpoint application belongs.",
"required": false,
"caseExact": false,
"mutability": "readOnly",
"returned": "default",
"uniqueness": "none"
},
{
"name": "display",
"type": "string",
"multiValued": false,
"description": "A human-readable name, primarily used for \
display purposes. READ-ONLY.",
"required": false,
"caseExact": false,
"mutability": "readOnly",
"returned": "default",
"uniqueness": "none"
},
{
"name": "type",
"type": "string",
"multiValued": false,
"description": "A label indicating the attribute's \
function, e.g., 'direct' or 'indirect'.",
"required": false,
"caseExact": false,
"canonicalValues": [
"direct",
"indirect"
],
"mutability": "readOnly",
"returned": "default",
"uniqueness": "none"
}
],
"mutability": "readOnly",
"returned": "default"
}
],
"meta" : {
"resourceType" : "Schema",
"location" :
"/v2/Schemas/urn:ietf:params:scim:schemas:core:2.0:EndpointApp"
}
}
A.4. BLE Extension Schema π¦
Okay, bestie, this one is the Bluetooth Low Energy schema, and it's giving full main character energy π It's a list of schemas: one for the extension, plus a few for the pairing methods.
[
{
"id": "urn:ietf:params:scim:schemas:extension:ble:2.0:Device",
"name": "bleExtension",
"description": "BLE extension for device account.",
"attributes" : [
{
"name": "versionSupport",
"type": "string",
"description": "Provides a list of all the BLE versions \
supported by the device, for example, [4.1, 4.2, 5.0, 5.1, 5.2, 5.4]\
.",
"multiValued": true,
"required": true,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "deviceMacAddress",
"type": "string",
"pattern": "^[0-9A-Fa-f]{2}(:[0-9A-Fa-f]{2}){5}$",
"description": "A unique public MAC address assigned by the \
manufacturer.",
"multiValued": false,
"required": true,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "Manufacturer"
},
{
"name": "isRandom",
"type": "boolean",
"description": "The isRandom flag is taken from the BLE \
core specifications 5.4. If true, device is using a random address\
. Default value is false.",
"multiValued": false,
"required": false,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "separateBroadcastAddress",
"type": "string",
"description": "When present, this address is used for \
broadcasts/advertisements. This value MUST NOT be set when an IRK \
is provided. Its form is the same as deviceMacAddress.",
"multiValued": true,
"required": false,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "irk",
"type": "string",
"description": "Identity Resolving Key (IRK), which is \
unique for every device. It is used to resolve a random address. \
This value MUST NOT be set when separateBroadcastAddress is set.",
"multiValued": false,
"required": false,
"caseExact": false,
"mutability": "writeOnly",
"returned": "never",
"uniqueness": "Manufacturer"
},
{
"name": "mobility",
"type": "boolean",
"description": "If set to true, the BLE device will \
automatically connect to the closest AP. For example, if a BLE \
device is connected with AP-1 and moves out of range but comes in \
range of AP-2, it will be disconnected with AP-1 and \
connected with AP-2.",
"multiValued": false,
"required": false,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "pairingMethods",
"type": "string",
"description": "List of pairing methods associated with the \
BLE device, stored as schema URI.",
"multiValued": true,
"required": true,
"caseExact": true,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
}
],
"meta" : {
"resourceType" : "Schema",
"location" : "/v2/Schemas/urn:ietf:params:scim:schemas:\
extension:ble:2.0:Device"
}
},
{
"id": "urn:ietf:params:scim:schemas:extension:pairingNull:2.0:\
Device",
"name": "nullPairing",
"description": "Null pairing method for BLE. It is included for \
the devices that do not have a pairing method.",
"meta" : {
"resourceType" : "Schema",
"location" : "/v2/Schemas/urn:ietf:params:scim:schemas:\
extension:pairingNull:2.0:Device"
}
},
{
"id": "urn:ietf:params:scim:schemas:extension:pairingJustWorks:2\
.0:Device",
"name": "pairingJustWorks",
"description": "Just Works pairing method for BLE.",
"attributes" : [
{
"name": "key",
"type": "integer",
"description": "Just Works does not have any key value. For \
completeness, it is added with a key value 'null'.",
"multiValued": false,
"required": false,
"caseExact": false,
"mutability": "immutable",
"returned": "default",
"uniqueness": "none"
}
],
"meta" : {
"resourceType" : "Schema",
"location" : "/v2/Schemas/urn:ietf:params:scim:schemas:\
extension:pairingJustWorks:2.0:Device"
}
},
{
"id": "urn:ietf:params:scim:schemas:extension:pairingPassKey:2.0\
:Device",
"name": "pairingPassKey",
"description": "Pass key pairing method for BLE.",
"attributes" : [
{
"name": "key",
"type": "integer",
"description": "A six-digit passkey for BLE a device. The \
pattern of key is ^[0-9]{6}$.",
"multiValued": false,
"required": true,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
}
],
"meta" : {
"resourceType" : "Schema",
"location" : "/v2/Schemas/urn:ietf:params:scim:schemas:\
extension:pairingPassKey:2.0:Device"
}
},
{
"id": "urn:ietf:params:scim:schemas:extension:pairingOOB:2.0:\
Device",
"name": "pairingOOB",
"description": "Out-of-band pairing method for BLE.",
"attributes" : [
{
"name": "key",
"type": "string",
"description": "A key value retrieved from out-of-band \
source such as NFC.",
"multiValued": false,
"required": true,
"caseExact": true,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "randomNumber",
"type": "integer",
"description": "Nonce added to the key.",
"multiValued": false,
"required": true,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "confirmationNumber",
"type": "integer",
"description": "Some solutions require confirmation number \
in RESTful message exchange.",
"multiValued": false,
"required": false,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
}
],
"meta" : {
"resourceType" : "Schema",
"location" : "/v2/Schemas/urn:ietf:params:scim:schemas:\
extension:pairingOOB:2.0:Device"
}
}
]
A.5. DPP Extension Schema π
Next up is the DPP one, the Wi-Fi Easy Connect / Device Provisioning Protocol schema. It's one object, no list, and it's so cute it's making me π
{
"id": "urn:ietf:params:scim:schemas:extension:dpp:2.0:Device",
"name": "dppExtension",
"description": "Device extension schema for Wi-Fi Easy \
Connect / Device Provisioning Protocol (DPP).",
"attributes" : [
{
"name": "dppVersion",
"type": "integer",
"description": "Version of DPP this device supports.",
"multiValued": false,
"required": true,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "bootstrappingMethod",
"type": "string",
"description": "The list of all the bootstrapping methods \
available on the enrollee device, for example, [QR, NFC].",
"multiValued": true,
"required": false,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "bootstrapKey",
"type": "string",
"description": "A base64-encoded Elliptic Curve Diffie-\
Hellman public key (may be P-256, P-384, or P-521).",
"multiValued": false,
"required": true,
"caseExact": true,
"mutability": "writeOnly",
"returned": "never",
"uniqueness": "none"
},
{
"name": "deviceMacAddress",
"type": "string",
"pattern": "^[0-9A-Fa-f]{2}(:[0-9A-Fa-f]{2}){5}$",
"description": "A unique public MAC address assigned by the \
manufacturer.",
"multiValued": false,
"required": false,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "Manufacturer"
},
{
"name": "classChannel",
"type": "string",
"description": "A list of global operating class and \
channel shared as bootstrapping information. It is formatted as \
class/channel, for example, '81/1', '115/36'.",
"multiValued": true,
"required": false,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "serialNumber",
"type": "string",
"description": "An alphanumeric serial number that may also \
be passed as bootstrapping information.",
"multiValued": false,
"required": false,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
}
],
"meta" : {
"resourceType" : "Schema",
"location" : "/v2/Schemas/urn:ietf:params:scim:schemas:\
extension:dpp:2.0:Device"
}
}
A.6. Ethernet MAB Extension Schema π
okay bestie, this one is the Ethernet MAB extension schema π¦ It's a device extension for MAC Authentication Bypass, and it's literally just one attribute, deviceMacAddress, which is the MAC address the manufacturer assigned. β¨
{
"id": "urn:ietf:params:scim:schemas:extension:ethernet-mab:2.0:\
Device",
"name": "ethernetMabExtension",
"description": "Device extension schema for MAC Authentication \
Bypass.",
"attributes" : [
{
"name": "deviceMacAddress",
"type": "string",
"pattern": "^[0-9A-Fa-f]{2}(:[0-9A-Fa-f]{2}){5}$",
"description": "A MAC address assigned by the manufacturer.",
"multiValued": false,
"required": true,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "Manufacturer"
}
],
"meta" : {
"resourceType" : "Schema",
"location" : "/v2/Schemas/urn:ietf:params:scim:schemas:extension\
:ethernet-mab:2.0:Device"
}
}
A.7. FDO Extension Schema πΈ
this one is for FIDO Device Onboard (FDO) π It holds a single write-only attribute called fdoVoucher, which is a voucher as defined in the FDO specification. It's "returned": "never", so it's never handed back to anyone, which is very much giving secret keeper. π€«
{
"id": "urn:ietf:params:scim:schemas:extension:fido-device-onboard:\
2.0:Device",
"name": "FDOExtension",
"description": "Device extension schema for FIDO Device Onboard (\
FDO).",
"attributes" : [
{
"name": "fdoVoucher",
"type": "string",
"description": "A voucher as defined in the FDO \
specification.",
"multiValued": false,
"required": true,
"caseExact": false,
"mutability": "writeOnly",
"returned": "never",
"uniqueness": "Manufacturer"
}
],
"meta" : {
"resourceType" : "Schema",
"location" : "/v2/Schemas/urn:ietf:params:scim:schemas:extension\
:fido-device-onboard:2.0:Device"
}
}
A.8. Zigbee Extension Schema β
now Zigbee π This schema has two attributes. The first is versionSupport, a multi-valued string listing every Zigbee version the device supports, for example [3.0]. The second is deviceEui64Address, which is the 64-bit Extended Unique Identifier (EUI-64) device address, written as eight colon-separated hex pairs. Both are required, so no skipping, bestie. π
{
"id": "urn:ietf:params:scim:schemas:extension:zigbee:2.0:Device",
"name": "zigbeeExtension",
"description": "Device extension schema for Zigbee.",
"attributes" : [
{
"name": "versionSupport",
"type": "string",
"description": "Provides a list of all the Zigbee versions \
supported by the device, for example, [3.0].",
"multiValued": true,
"required": true,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
},
{
"name": "deviceEui64Address",
"type": "string",
"pattern": "^[0-9A-Fa-f]{2}(:[0-9A-Fa-f]{2}){7}$",
"description": "The 64-bit Extended Unique Identifier \
(EUI-64) device address.",
"multiValued": false,
"required": true,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none"
}
],
"meta" : {
"resourceType" : "Schema",
"location" : "/v2/Schemas/urn:ietf:params:scim:schemas:extension\
:zigbee:2.0:Device"
}
}
A.9. endpointAppsExt Extension Schema π
this is the endpointAppsExt schema, and it's a whole vibe π It's for partner endpoint applications that can onboard, control, and talk to the device. The applications attribute is a complex, multi-valued attribute with two sub-attributes: value (the identifier of the EndpointApp) and $ref (the URI of the EndpointApp that controls the device or pulls data from it). Then there are two enterprise endpoint URLs: deviceControlEnterpriseEndpoint, which is required, and telemetryEnterpriseEndpoint, which is optional. Iconic. π«Ά
{
"id": "urn:ietf:params:scim:schemas:extension:endpointAppsExt:2.0:\
Device",
"name": "endpointAppsExt",
"description": "Extension for partner endpoint applications that \
can onboard, control, and communicate with the device.",
"attributes" : [
{
"name": "applications",
"type": "complex",
"description": "Includes references to two types of \
applications that connect with enterprise, i.e., deviceControl and \
telemetry.",
"multiValued": true,
"required": true,
"caseExact": false,
"mutability": "readWrite",
"returned": "default",
"uniqueness": "none",
"subAttributes" : [
{
"name" : "value",
"type" : "string",
"description" : "The identifier of the EndpointApp.",
"multiValued" : false,
"required" : true,
"caseExact" : false,
"mutability" : "readWrite",
"returned" : "default",
"uniqueness" : "none"
},
{
"name" : "$ref",
"type" : "reference",
"referenceTypes" : "EndpointApps",
"description" : "The URI of the corresponding EndpointApp\
resource that will control or obtain data from the device.",
"multiValued" : false,
"required" : true,
"caseExact" : true,
"mutability" : "readOnly",
"returned" : "default",
"uniqueness" : "none"
}
]
},
{
"name": "deviceControlEnterpriseEndpoint",
"type": "reference",
"description": "The URL of the enterprise endpoint that \
device control apps use to reach enterprise network gateway.",
"multiValued": false,
"required": true,
"caseExact": true,
"mutability": "readOnly",
"returned": "default",
"uniqueness": "Enterprise"
},
{
"name": "telemetryEnterpriseEndpoint",
"type": "reference",
"description": "The URL of the enterprise endpoint that \
telemetry apps use to reach enterprise network gateway.",
"multiValued": false,
"required": false,
"caseExact": true,
"mutability": "readOnly",
"returned": "default",
"uniqueness": "Enterprise"
}
],
"meta" : {
"resourceType" : "Schema",
"location" : "/v2/Schemas/urn:ietf:params:scim:schemas:extension\
:endpointAppsExt:2.0:Device"
}
}
Appendix B. OpenAPI Representation π
okay, now the OpenAPI stuff π§ Heads up: these sections are informational only, so they're extra helpful but they're not the official rules. β¨
B.1. Core Device Schema OpenAPI Representation π
here's the OpenAPI version of the core device schema. It defines the Group, Device, and CommonAttributes components, and it's a lot, so grab a snack π
openapi: 3.1.0
info:
title: SCIM Device Schema
version: 1.0.0
components:
schemas:
Group:
type: object
description: A list of groups to which the device belongs,
either through direct membership, through nested
groups, or dynamically calculated.
properties:
value:
type: string
description: The unique identifier of a group,
typically a UUID.
readOnly: true
writeOnly: false
display:
type: string
description: A display string for the group.
readOnly: true
writeOnly: false
$ref:
type: string
format: uri
description: Reference to the group object.
readOnly: true
writeOnly: true
Device:
description: Entry containing attributes about a device.
type: object
properties:
displayName:
type: string
description: "Human-readable name of the device, suitable
for displaying to end users, for example,
'BLE Heart Monitor' etc."
readOnly: false
writeOnly: false
active:
type: boolean
description: A mutable boolean value indicating the device
administrative status. If true, the
commands (such as connect, disconnect,
subscribe) that control app sends to the
controller for the devices will be processed
by the controller. If false, any command
coming from the control app for the device
will be rejected by the controller.
readOnly: false
writeOnly: false
mudUrl:
type: string
format: uri
description: A URL to MUD file of the device (RFC 8520).
It is added for future use. Current usage is
not defined yet.
readOnly: false
writeOnly: false
groups:
type: array
description: List of groups to which a device belongs to.
items:
$ref: '#/components/schemas/Group'
required:
- active
additionalProperties: false
allOf:
- $ref: '#/components/schemas/CommonAttributes'
CommonAttributes:
type: object
properties:
schemas:
type: array
items:
type: string
enum:
- urn:ietf:params:scim:schemas:core:2.0:Device
description: The list of schemas that define the resource.
id:
type: string
format: uri
description: The unique identifier for a resource.
readOnly: true
writeOnly: false
externalId:
type: string
description: An identifier for the resource that is
defined by the provisioning client.
readOnly: false
writeOnly: false
meta:
type: object
readOnly: true
properties:
resourceType:
type: string
description: The name of the resource type of the
resource.
readOnly: true
writeOnly: false
location:
type: string
format: uri
description: The URI of the resource being returned.
readOnly: true
writeOnly: false
created:
type: string
format: date-time
description: The date and time the resource was added
to the service provider.
readOnly: true
writeOnly: false
lastModified:
type: string
format: date-time
description: The most recent date and time that the
details of this resource were updated at
the service provider.
readOnly: true
writeOnly: false
version:
type: string
description: The version of the resource.
readOnly: true
writeOnly: false
additionalProperties: false
B.2. EndpointApp Schema OpenAPI Representation β¨
okay so here's the OpenAPI version of the EndpointApp schema π this is the bit where the spec gets super literal, so every line counts. the code block is the source of truth, so read it closely π
openapi: 3.1.0
info:
title: SCIM Endpoint App Schema
version: 1.0.0
components:
schemas:
Group:
type: object
description: A list of groups to which the endpoint
application belongs, either through
direct membership, through nested
groups, or dynamically calculated.
properties:
value:
type: string
description: The unique identifier of a group,
typically a UUID.
readOnly: true
writeOnly: false
display:
type: string
description: A display string for the group.
readOnly: true
writeOnly: false
$ref:
type: string
format: uri
description: Reference to the group object.
readOnly: true
writeOnly: true
EndpointApp:
title: EndpointApp
description: Endpoint application resource.
type: object
properties:
applicationType:
type: string
description: This attribute will only contain two values:
deviceControl or telemetry.
readOnly: false
writeOnly: false
applicationName:
type: string
description: Human-readable name of the application.
readOnly: false
writeOnly: false
groups:
type: array
description: List of groups to which the EndpointApp
belongs.
items:
$ref: '#/components/schemas/Group'
required:
- applicationType
- applicationName
additionalProperties: true
oneOf:
- $ref: '#/components/schemas/clientToken'
- $ref: '#/components/schemas/certificateInfo'
allOf:
- $ref: '#/components/schemas/CommonAttributes'
clientToken:
type: string
description: "This attribute contains a token that the client
will use to authenticate itself. Each token may
be a string up to 500 characters in length."
readOnly: true
writeOnly: false
certificateInfo:
type: object
description: "Contains X.509 certificate's subject name and
root CA information associated with the device
control or telemetry app."
properties:
rootCA:
type: string
description: "The base64 encoding of a trust anchor
certificate, as per RFC 4648, Section 4."
readOnly: false
writeOnly: false
subjectName:
type: string
description: "Also known as the Common Name (CN), the
Subject Name is a field in the X.509
certificate that identifies the primary
domain or IP address for which the
certificate is issued."
readOnly: false
writeOnly: false
required:
- subjectName
CommonAttributes:
type: object
properties:
schemas:
type: array
items:
type: string
enum:
- urn:ietf:params:scim:schemas:core:2.0:EndpointApp
description: The list of schemas that define the resource.
id:
type: string
format: uri
description: The unique identifier for a resource.
readOnly: true
writeOnly: false
meta:
type: object
readOnly: true
properties:
resourceType:
type: string
description: The name of the resource type of the
resource.
readOnly: true
writeOnly: false
location:
type: string
format: uri
description: The URI of the resource being returned.
readOnly: true
writeOnly: false
created:
type: string
format: date-time
description: The date and time the resource was added
to the service provider.
readOnly: true
writeOnly: false
lastModified:
type: string
format: date-time
description: The most recent date and time that the
details of this resource were updated at
the service provider.
readOnly: true
writeOnly: false
version:
type: string
description: The version of the resource.
readOnly: true
writeOnly: false
additionalProperties: false
B.3. BLE Extension Schema OpenAPI Representation π¦
next up is the BLE extension schema in OpenAPI form π there's a lot of pairing stuff in here, so take your time and don't skip the fine print. the bits about the MAC address format and the key patterns are super specific, bestie π₯
openapi: 3.1.0
info:
title: SCIM Bluetooth Extension Schema
version: 1.0.0
components:
schemas:
BleDevice:
type: object
description: BLE device schema.
properties:
schemas:
type: array
items:
type: string
enum:
- urn:ietf:params:scim:schemas:extension:ble:2.0
:Device
urn:ietf:params:scim:schemas:extension:ble:2.0:Device:
$ref: '#/components/schemas/BleDeviceExtension'
required: true
BleDeviceExtension:
type: object
properties:
versionSupport:
type: array
items:
type: string
description: Provides a list of all the BLE versions
supported by the device, for example,
[4.1, 4.2, 5.0, 5.1, 5.2, 5.4].
readOnly: false
writeOnly: false
deviceMacAddress:
type: string
description: It is the public MAC address assigned by the
manufacturer. It is a unique 48-bit value. The
regex pattern is
^[0-9A-Fa-f]{2}(:[0-9A-Fa-f]{2}){5}.
readOnly: false
writeOnly: false
isRandom:
type: boolean
description: AddressType flag is taken from the BLE core
specifications 5.4. If false, the device is
using a public MAC address. If true, device
is using a random address.
readOnly: false
writeOnly: false
separateBroadcastAddress:
type: string
description: "When present, this address is used for
broadcasts/advertisements. This value
MUST NOT be set when an IRK is provided.
Its form is the same as deviceMacAddress."
readOnly: false
writeOnly: false
irk:
type: string
description: Identity Resolving Key (IRK), which is unique
for every device. It is used to resolve a
random address.
readOnly: false
writeOnly: true
mobility:
type: boolean
description: If set to true, the BLE device will
automatically connect to the closest AP. For
example, if a BLE device is connected with
AP-1 and moves out of range but comes in
range of AP-2, it will be disconnected with
AP-1 and connected with AP-2.
readOnly: false
writeOnly: false
pairingMethods:
type: array
items:
type: string
description: List of pairing methods associated with the
BLE device, stored as schema URI.
readOnly: false
writeOnly: false
urn:ietf:params:scim:schemas:extension:pairingNull:2.0
:Device:
$ref: '#/components/schemas/NullPairing'
required: false
urn:ietf:params:scim:schemas:extension:pairingJustWorks:2.0
:Device:
$ref: '#/components/schemas/PairingJustWorks'
required: false
urn:ietf:params:scim:schemas:extension:pairingPassKey:2.0
:Device:
$ref: '#/components/schemas/PairingPassKey'
required: false
urn:ietf:params:scim:schemas:extension:pairingOOB:2.0
:Device:
$ref: '#/components/schemas/PairingOOB'
required: false
required:
- versionSupport
- deviceMacAddress
- AddressType
- pairingMethods
additionalProperties: false
NullPairing:
type: object
PairingJustWorks:
type: object
description: Just Works pairing method for BLE.
properties:
key:
type: integer
description: Just Works does not have any key value. For
completeness, it is added with a key value
'null'.
readOnly: false
writeOnly: false
required:
- key
PairingPassKey:
type: object
description: Passkey pairing method for BLE.
properties:
key:
type: integer
description: A six-digit passkey for a BLE device.
The pattern of key is ^[0-9]{6}$.
readOnly: false
writeOnly: true
required:
- key
PairingOOB:
type: object
description: Out-of-band pairing method for BLE.
properties:
key:
type: string
description: The OOB key value for a BLE device.
readOnly: false
writeOnly: false
randomNumber:
type: integer
description: Nonce added to the key.
readOnly: false
writeOnly: true
confirmationNumber:
type: integer
description: Some solutions require a confirmation number
in the RESTful message exchange.
readOnly: false
writeOnly: true
required:
- key
- randomNumber
B.4. DPP Extension Schema OpenAPI Representation β¨
okay so here's the OpenAPI version of the DPP extension schema π it's the Wi-Fi Easy Connect one, and it's giving very organized energy π
openapi: 3.1.0
info:
title: SCIM Device Provisioning Protocol Extension Schema
version: 1.0.0
components:
schemas:
DppDevice:
type: object
description: Wi-Fi Easy Connect (DPP) device extension schema.
properties:
schemas:
type: array
items:
type: string
enum:
- urn:ietf:params:scim:schemas:extension:dpp:2.0
:Device
urn:ietf:params:scim:schemas:extension:dpp:2.0:Device:
$ref: '#/components/schemas/DppDeviceExtension'
required: true
DppDeviceExtension:
type: object
properties:
dppVersion:
type: integer
description: Version of DPP this device supports.
readOnly: false
writeOnly: false
bootstrappingMethod:
type: array
items:
type: string
description: The list of all the bootstrapping methods
available on the enrollee device, for
example, [QR, NFC].
readOnly: false
writeOnly: false
bootstrapKey:
type: string
description: An Elliptic Curve Diffie-Hellman
(ECDH) public key. The base64-encoded length
for P-256, P-384, and P-521 is 80, 96, and
120 characters.
readOnly: false
writeOnly: true
deviceMacAddress:
type: string
description: The MAC address assigned by the manufacturer.
The regex pattern is
^[0-9A-Fa-f]{2}(:[0-9A-Fa-f]{2}){5}.
readOnly: false
writeOnly: false
classChannel:
type: array
items:
type: string
description: A list of global operating class and channel
shared as bootstrapping information. It is
formatted as class/channel, for example,
'81/1', '115/36'.
readOnly: false
writeOnly: false
serialNumber:
type: string
description: An alphanumeric serial number that may also
be passed as bootstrapping information.
readOnly: false
writeOnly: false
required:
- dppVersion
- bootstrapKey
additionalProperties: false
B.5. Ethernet MAB Extension Schema OpenAPI Representation π¦
next up is the Ethernet MAB one (MAC Authentication Bypass, for the Ethernet side of things) πΈ here's how it looks in OpenAPI
openapi: 3.1.0
info:
title: SCIM MAC Authentication Bypass Extension Schema
version: 1.0.0
components:
schemas:
EthernetMABDevice:
type: object
description: Ethernet MAC Authenticated Bypass.
properties:
schemas:
type: array
items:
type: string
enum:
- urn:ietf:params:scim:schemas:extension:ethernet-mab
:2.0:Device
urn:ietf:params:scim:schemas:extension:ethernet-mab:2.0
:Device:
$ref: '#/components/schemas/EthernetMABDeviceExtension'
required: true
EthernetMABDeviceExtension:
type: object
properties:
deviceMacAddress:
type: string
description: It is the public MAC address assigned by the
manufacturer. It is a unique 48-bit value.
The regex pattern is
^[0-9A-Fa-f]{2}(:[0-9A-Fa-f]{2}){5}.
readOnly: false
writeOnly: false
required:
- deviceMacAddress
description: Device extension schema for Ethernet-MAB.
B.6. FDO Extension Schema OpenAPI Representation π§
now the FDO one, which is FIDO Device Onboarding π it's got a voucher, so it's lowkey a whole vibe ποΈ
openapi: 3.1.0
info:
title: SCIM FIDO Device Onboarding Extension Schema
version: 1.0.0
components:
schemas:
FDODevice:
type: object
description: FIDO Device Onboarding (FDO) extension.
properties:
schemas:
type: array
items:
type: string
enum:
- urn:ietf:params:scim:schemas:extension:fido-device
-onboard:2.0:Device
urn:ietf:params:scim:schemas:extension:fido-device-onboard
:2.0:Device:
$ref: '#/components/schemas/FDODeviceExtension'
required: true
FDODeviceExtension:
type: object
properties:
fdoVoucher:
type: string
description: A FIDO Device Onboard (FDO) voucher.
readOnly: false
writeOnly: false
required:
- fdoVoucher
description: Device extension for a FIDO Device Onboard (FDO).
B.7. Zigbee Extension Schema OpenAPI Representation π
Zigbee's next, and it's serving versions and EUI-64 addresses, iykyk πβ¨
openapi: 3.1.0
info:
title: SCIM Zigbee Extension Schema
version: 1.0.0
components:
schemas:
ZigbeeDevice:
type: object
description: Zigbee device schema.
properties:
schemas:
type: array
items:
type: string
enum:
- urn:ietf:params:scim:schemas:extension:zigbee:2.0
:Device
urn:ietf:params:scim:schemas:extension:zigbee:2.0:Device:
$ref: '#/components/schemas/ZigbeeDeviceExtension'
required: true
ZigbeeDeviceExtension:
type: object
properties:
versionSupport:
type: array
items:
type: string
description: Provides a list of all the Zigbee versions
supported by the device, for example, [3.0].
readOnly: false
writeOnly: false
deviceEui64Address:
type: string
description: The 64-bit Extended Unique Identifier (EUI-64)
device address. The regex pattern is
^[0-9A-Fa-f]{16}$.
readOnly: false
writeOnly: false
required:
- versionSupport
- deviceEui64Address
description: Device extension schema for Zigbee.
B.8. endpointAppsExt Extension Schema OpenAPI Representation π
last one in this bit is endpointAppsExt, and it's the main character of the endpoint stuff π it links up to the EndpointApp resources, so it's very connected bestie π«Ά
openapi: 3.1.0
info:
title: SCIM Endpoint Extension Schema
version: 1.0.0
components:
schemas:
EndpointAppsExt:
type: object
properties:
applications:
$ref: '#/components/schemas/applications'
deviceControlEnterpriseEndpoint:
type: string
format: url
description: The URL of the enterprise endpoint that
device control apps use to reach an
enterprise network gateway.
readOnly: true
writeOnly: false
telemetryEnterpriseEndpoint:
type: string
format: url
description: The URL of the enterprise endpoint that
telemetry apps use to reach an enterprise
network gateway.
readOnly: true
writeOnly: false
required:
- applications
- deviceControlEnterpriseEndpoint
applications:
type: array
items:
value:
type: string
description: The identifier of the EndpointApp.
readOnly: false
writeOnly: false
ref:
type: string
format: uri
description: The URI of the corresponding EndpointApp
resource that will control or obtain data
from the device.
readOnly: true
writeOnly: false
required:
- value
- ref
Appendix C. FIDO Device Onboarding Example Flow π¦
okay so bestie, this is the part where the spec finally shows you the whole story in pictures π these diagrams show how FDO can be used. in the first one, a device gets onboarded to the device owner process AND to the AAA server for its initial onboarding π the voucher holds a device certificate, and the AAA system uses that certificate to authenticate the device β¨
,------. ,------. ,-------.
|SCIM | |SCIM | |Owner | ,---.
|Client| |Server| |Service| |AAA|
`---+--' `---+--' `---+---' `-+-'
,------------------------------!. | |
|Voucher contains |_\ | |
|an X.509 cert chain | | |
`--------------------------------' | |
|1 POST [FDO(voucher)] | | |
|/HTTP | | |
|--------------------->| | |
| | | |
| |----. | |
| | | 2 Recover X.509 | |
| |<---' cert chain | |
| | from voucher | |
| | | |
| | | |
| |3 Add device(voucher) | |
| |/HTTP | |
| |--------------------->| |
| | | |
| | 4 200 "ok" | |
| |<---------------------| |
| | | |
| | 5 Add identity |
| |------------------------------->|
| | | |
| | 6 200 "ok" |
| |<-------------------------------|
| | | |
| 7 200 "ok" | | |
|<---------------------| | |
| | | |
| | | |
once this flow is complete, the device can first provisionally onboard and then later get a trust anchor through FDO's Transfer Ownership Protocol 2 (TO2) process πΈ here's how that looks β¨
,-------. ,------.
|Owner | ,---. |Access| ,------.
|Service| |AAA| |Point | |Device|
`---+---' `-+-' `---+--' `---+--'
| | | ,------------------!.
| | | |Device configured |_\
| | | |with well-known |
| | | |RCOI and for trust |
| | | |on first use |
| | | `--------------------'
| | ,---------------!. |
| | |WLAN configured|_\ |
| | |with well-known | |
| | |RCOI | |
| | `-----------------' |
| | | 1 EAP-TLS/EAPOL |
| | |<-----------------|
| | | |
| |2 EAP-TLS/Radius | |
| |<----------------| |
| | | |
| | ,--------------------------!.
| | |Device skips |_\
| | |server authentication |
| | `----------------------------'
| |3 Result=Success | |
| |---------------->| |
| | | |
| ,-----------------------!. |
| |Limited access |_\ |
| |for now | |
| `-------------------------' |
| | |4 Result=Success |
| | |----------------->|
| | | |
| | 5 FDO TO2 | |
|<----------------------------------------------------|
| | | |
,-------------------------------------------------------------!.
|FSIM, Runtime SSID, |_\
|Credentials incl. |
|local trust anchor |
`---------------------------------------------------------------'
| | | 6 dissasociate |
| | |<-----------------|
| | | |
| | |7 EAP-TLS w/ LSC |
| | |<-----------------|
| | | |
| | | |
. . etc . .
Acknowledgments π«Ά
the authors want to thank Sriram Sekar, Bart Brinckman, Rohit Mohan, Lars Streubesand, Christian AmsΓΌss, Jason Livingwood, Mike Ounsworth, Monty Wiseman, Geoffrey Cooper, Paulo Jorge N. Correia, Phil Hunt, and Elwyn Davies for their reviews π and Nick Ross for his contribution to the appendix π absolute legends, all of you π
Authors' Addresses π
Muhammad Shahzad North Carolina State University Department of Computer Science 890 Oval Drive Campus Box 8206 Raleigh, NC 27695-8206 United States of America Email: mshahza@ncsu.edu
Hassan Iqbal North Carolina State University Department of Computer Science 890 Oval Drive Campus Box 8206 Raleigh, NC 27695-8206 United States of America Email: hassaniqbal931@gmail.com
Eliot Lear Cisco Systems Richtistrasse 7 CH-8304 Wallisellen Switzerland Phone: +41 44 878 9200 Email: lear@cisco.com
π¦ where this page comes from
- ietf: rfc9944 2026-05
- π girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms