<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="info" docName="draft-hallambaker-jsdevice-00" indexInclude="false" ipr="trust200902" scripts="Common,Latin" sortRefs="true" submissionType="independent" symRefs="true" tocDepth="3" tocInclude="true" version="3" xml:lang="en"><front>
<title abbrev="JSDevice Device Description">JSDevice Device Description</title>
<seriesInfo name="draft-hallambaker-jsdevice-00" value="draft-hallambaker-jsdevice" stream="independent"/>
<author fullname="Phillip Hallam-Baker" initials="P. M." surname="Hallam-Baker"><organization>ThresholdSecrets.com</organization>
<address>
<email>phill@hallambaker.com</email>
</address>
</author>
<date day="11" month="May" year="2025"/>
<area/>
<workgroup/>
<keyword>Identity</keyword>
<keyword>Cryptography</keyword>
<keyword>OAUTH</keyword>
<abstract>
<t>A JSON format for describing devices is described. Device descriptions provide identification information for the device and model number, images and video showing the device and its use, network configuration information and identifies associated consumable items, accessories and maintenance schedules.</t>
</abstract>
</front>
<middle>
<section title="Introduction" anchor="n-introduction"><t>JSDevice is a JSON document format that provides a machine-readable description of a class of devices with the same characteristics or of a specific device, their use and associated consumable items, accessories and maintenance schedules. The format is intended as a counterpart to the JSContact <xref target="RFC9553"></xref> specification describing contact information for people and organizations.</t>
<t>The JSDevice data <bcp14>MAY</bcp14> be presented to the user by means of a QR code containing an Encrypted Authenticated Resource Locator (EARL) <xref target="draft-hallambaker-earl"></xref> printed on the device packaging, on the device itself or presented to the user on the device display. Alternatively the JSDevice description <bcp14>MAY</bcp14> be provided during the purchasing process.</t>
<t>A JSDevice description can present all the information necessary to configure and use the device including:</t>
<dl>
<dt>General information </dt>
<dd>
<t>e.g. model identifier, device identifier, place of origin, data of manufacture, etc.</t>
</dd>
<dt>Physical properties</dt>
<dd>
<t>The size and weight of the device.</t>
</dd>
<dt>Documentation</dt>
<dd>
<t>Images and schematic diagrams depicting the device, manuals and tutorial videos.</t>
</dd>
<dt>Operations</dt>
<dd>
<t>Required and advised maintenance schedule.  Consumables, accessories and parts relevant to use of the machine.</t>
</dd>
<dt>Network</dt>
<dd>
<t>Description of the networking services provided by and consumed by the device and the credentials used to authenticate the device to the network.</t>
</dd>
</dl>
<t>Description data <bcp14>MAY</bcp14> be contained within the JSDevice description itself or linked by means of a URI. If the URI is an EARL, the authentication context from the document context protecting it is preserved.</t>
<t>While the primary objective of the JSDevice specification is to enable seamless onboarding for network connected devices, JSDevice descriptions <bcp14>MAY</bcp14> be created for any type of device, including devices that have no networked functionality. This allows homeowners to compile a catalog of all their appliances supporting the specification, their consumable inks, filters, etc. and maintenance requirements.</t>
<section title="Onboarding" anchor="n-onboarding"><t>The process of provisioning a device with the credentials and network configurations required for its initial function is known as 'onboarding'. The onboarding process is in turn divided into three phases:</t>
<dl>
<dt>Preparation</dt>
<dd>
<t>The installer verifies that the device meets the intended purpose and that all the necessary support infrastructure is available.</t>
</dd>
<dt>Bootstrapping</dt>
<dd>
<t>The device acquires an initial communication connection to the device administering the onboarding process.</t>
</dd>
<dt>Configuration</dt>
<dd>
<t>The device acquires the credentials, network configurations and authorizations required to perform its function.</t>
</dd>
</dl>
<t>JSDevice is not an onboarding protocol, it is a means of specifying the bootstrapping and configuration protocols supported by the device and the network affordances required for the device to operate.</t>
<section title="Preparation" anchor="n-preparation"><t>Preparation is an optional step in which the installer verifies that the device meets the intended purpose and that the necessary support infrastructure is available. This process would ideally take place before purchase.</t>
<t>To facilitate this use, a JSDevice description <bcp14>MAY</bcp14> describe a class of devices rather than a specific instance. Such a description does not contain a device unique identifier or device specific credentials.</t>
<sourcecode>{
  "@type": "Device"
  "uid": "NBEG-DJNO-DW3Q-RBKT-SXZ5-CAWH-MXUT"
  "prodId": "Configulator/1.0"
  "created": "2025-05-07T05:40:22Z"
  "updated":
  "version": "1.0"
  "kind": "model"
  "language": "en"
  "modelName": "Acme WebCam 4K"
  "manufacturer": "Acme Corp."
  "dateManufacture":
  "endSupport":
  "endLife":
  ...
}</sourcecode>
</section>
<section title="Bootstrapping" anchor="n-bootstrapping"><t>Bootstrapping establishes an initial communication connection between the device being onboarded and the device administering the onboarding. A JSDevice description obtained from an EARL printed on the device itself, <bcp14>MAY</bcp14> specify one or more 'hailing channels' and contact credentials for establishing such a connection by means of a wired connection (e.g. Ethernet, USB-C), or a wireless connection such as WiFi or Near Field Communication.</t>
<t>Bootstrap mechanisms established in this fashion <bcp14>MAY</bcp14> make use of the Access Authenticator obtained from the EARL to authenticate the onboarding request, providing proof of physical possession of the device.</t>
<t>While the EARL mechanism is secure, retrieval of the ciphertext package referenced by the EARL depends on there being an external service available that can resolve the locator. A device <bcp14>MAY</bcp14> support delivery of the device description by the device itself using a hailing channel derived from the EARL by means of a cryptographic digest.</t>
<t>For example, a webcam has a QR code containing a JSDevice QR code printed on it:</t>
<sourcecode>jsdevice://example.com/el7i-i65v-c2ht-2zfe-pkeh-nocr-dd73</sourcecode>
<t>The corresponding JSDevice description describes the device itself. The document identifier is different to the one specified in the model description, the kind is device and there is a date of manufacture.</t>
<sourcecode>{
  "@type": "Device"
  "uid": "NDXT-KQ6W-FXFM-5D2A-4AXY-LTAM-OAFR"
  "prodId": "Configulator/1.0"
  "created": "2025-05-11T05:40:22Z"
  "updated": "2025-05-11T05:40:22Z"
  "version": "1.0"
  "kind": "device"
  "language": "en"
  "modelName": "Acme WebCam 4K"
  "manufacturer": "Acme Corp."
  "dateManufacture": "2025-05-11T05:40:22Z"
  "endSupport": "2030-05-11T05:40:22Z"
  "endLife": "2035-05-11T05:40:22Z"
  ...
}</sourcecode>
<t>The network property of the description provides a declarative specification of each of the network protocols supported by the device. Bootstrap protocols are identifier by the <tt>kind</tt> property value <tt>bootstrap</tt>.</t>
<sourcecode>{
  ...
  "network": {
    "boot1": {
      "kind": "bootstrap",
      "identifier": "mmm-connect",
      "ports": [80
        ],
      "keys": {
        "id": "udf:MCBG-ZSI4-XSWX-UNEE-GU6X-YTBZ-XPH5"}}}
  ...
}</sourcecode>
<t>Devices <bcp14>MAY</bcp14> specify multiple bootstrap protocols or no bootstrap protocol leaving this to the user.</t>
<t>In this example, the Mathematical Mesh Device Connection protocol <tt>mmm-connect</tt> is used to establish the initial connection. This protocol cryptographically binds the device to a specific Mesh Account and provides the DNS address of the current provider servicing that account. Since the keys used to authenticate the device to the service are passed in-band during the connection protocol, it is sufficient to specify the fingerprint of the device profile through which the device keys are authenticated.</t>
</section>
<section title="Network Configuration" anchor="n-network-configuration"><t>Network configuration is the process of assigning network addresses, names and providing network credentials.</t>
<t>A core goal of the JSDevice description is to enable automation of the entire process of network configuration by offloading the task of configuring the network IP assignment, DNS,  firewall, NAT and PKI to a local service.</t>
<t>While the network environment in which the device is to function <bcp14>MAY</bcp14> be of Byzantine complexity with multiple layers of firewalls, NAT and VPN, the device itself does not need to know anything more than the interface between itself and the rest of the network.</t>
<t>For example, regardless of the network in which Alice's Webcam is to be deployed, all the device needs to know is:</t>
<ul>
<li>The IP address of the device on the local network</li>
<li>The DNS name by which the device is discovered</li>
<li>The PKI credentials to be used to authenticate the device to clients.</li>
</ul>
<t>In this example, the device employs a two stage configuration approach</t>
<t>In the first stage, the device obtains a temporary address on the local network via DHCP.</t>
<t>The device uses the IP address obtained in the first stage to connect to the 'anything' service and request that the necessary configurations be made to the network infrastructure and the corresponding IP, DNS and PKI data sent to the device</t>
<t>These protocols are specified as follows:</t>
<sourcecode>{
  ...
  "network": {
    "disc1": {
      "kind": "discovery",
      "identifier": "dhcp",
      "endpoints": ["ip"
        ]},
    "disc2": {
      "kind": "discovery",
      "identifier": "anything",
      "endpoints": ["ip",
        "dns",
        "webpki"
        ]}}
  ...
}</sourcecode>
<t>At the end of the network configuration process, Alice and Bob to access the device as</t>
<sourcecode>https://camera01.alice.example.com/</sourcecode>
<t>The webcam supports viewing of the output via HTTP and MOQ and has a motorized mount that can be controlled through the proprietary <tt>acme_cam_control</tt> Web Service:</t>
<sourcecode>{
  ...
  "network": {
    "motor1": {
      "kind": "service",
      "identifier": "acme_cam_control",
      "ports": [443
        ],
      "endpoints": ["dns",
        "webpki"
        ],
      "permissions": ["admin"
        ]},
    "web1": {
      "kind": "service",
      "identifier": "https",
      "ports": [443
        ],
      "endpoints": ["dns",
        "webpki"
        ],
      "permissions": ["read"
        ]},
    "moq1": {
      "kind": "service",
      "identifier": "moq",
      "endpoints": ["dns",
        "webpki"
        ],
      "permissions": ["read"
        ]}}
  ...
}</sourcecode>
</section>
</section>
<section title="User Documentation" anchor="n-user-documentation"><t>JSDevice descriptions <bcp14>MAY</bcp14> include links to images of the physical device itself and schematics showing its use and to user documentation of various forms.</t>
<t>For example, the Webcam has photographs of the front and rear of a typical device and a schematic. The documentation includes a guide to unpacking it, a quick start guide and a user manual</t>
<sourcecode>{
  ...
  "images": [{
      "@type": "Media",
      "kind": "front",
      "uri": "https://acme.example.net/media/webcam4k.front.png",
      "mediaType": "image/png",
      "label": "Front View"},
    {
      "@type": "Media",
      "kind": "rear",
      "uri": "httpe://acme.example.net/media/webcam4k.rear.png",
      "mediaType": "image/png",
      "label": "Rear View"},
    {
      "@type": "Media",
      "kind": "schematic",
      "uri": "https://acme.example.net/media/webcam4k.schematic.svg",
      "mediaType": "image/svg",
      "label": "Rear View"}
    ]
  "documentation": [{
      "@type": "Media",
      "kind": "quickstart",
      "uri": "httpe://acme.example.net/media/webcam4k.quickstart.pd
f",
      "mediaType": "application/pdf",
      "label": "Quick Start Guide"},
    {
      "@type": "Media",
      "kind": "unpacking",
      "uri": "https://acme.example.net/media/webcam4k.unboxing.pdf",
      "mediaType": "application/pdf",
      "label": "Rear View"},
    {
      "@type": "Media",
      "kind": "manual",
      "uri": "httpe://acme.example.net/media/webcam4k.manual.pdf",
      "mediaType": "application/pdf",
      "label": "Manual"}
    ]
  ...
}</sourcecode>
</section>
<section title="Operation" anchor="n-operation"><t>JSDevice descriptions <bcp14>MAY</bcp14> include information relevant to the operation of the device itself including maintenance schedules, related parts, accessories and consumables, and suppliers of additional devices.</t>
<t>For example, the motorized mount requires that the camera mount be lubricated and checked every 24 months through a process described in the user manual.</t>
<sourcecode>{
  ...
  "suppliers": [{
      "@type": "Supplier",
      "uri": "https://store.acme.example.net/webcam4k",
      "mediaType": "text/html",
      "label": "Acme Store"}
    ]
  "maintenance": {
    "maint1": {
      "@type": "Maintenance",
      "uri": "https://acme.example.net/media/webcam4k.manual.pdf#lu
brication",
      "label": "Lubricate mount",
      "recurring": true,
      "months": 24}}
  "relatedItems": {
    "part1": {
      "@type": "RelatedItem",
      "kind": "part",
      "uri": "https://acme.example.net/media/bearings/24U.jsdevice",
      "mediaType": "application/jsdevice",
      "label": "Mount bearing"},
    "accessory1": {
      "@type": "RelatedItem",
      "kind": "accessory",
      "uri": "https://acme.example.net/media/lenses/telephoto200.js
device",
      "mediaType": "application/jsdevice",
      "label": "Lens Kit"}}
  ...
}</sourcecode>
</section>
</section>
<section title="Definitions" anchor="n-definitions"><t>This section presents the related specifications and standard, the terms that are used as terms of art within the documents and the terms used as requirements language.</t>
<section title="Requirements Language" anchor="n-requirements-language"><t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as described in RFC 2119 <xref target="RFC2119"></xref>.</t>
</section>
<section title="Defined Terms" anchor="n-defined-terms"><t></t>
</section>
<section title="Related Specifications" anchor="n-related-specifications"><dl>
<dt>JSContact: A JSON Representation of Contact Data <xref target="RFC9553"></xref>.</dt>
<dd>
<t>Describes the format used for contact data interchange.</t>
</dd>
<dt>JSContact Extensions <xref target="draft-hallambaker-jscontact"></xref>.</dt>
<dd>
<t>Extensions to the JSContact format to improve support for use of cryptographic credentials and allow for authenticated updates.</t>
</dd>
<dt>Encrypted Authenticated Resource Locator <xref target="draft-hallambaker-earl"></xref>.</dt>
<dd>
<t>Describes a URI form that provides means of retrieving, decrypting and authenticating an associated ciphertext.</t>
</dd>
</dl>
</section>
<section title="Implementation Status" anchor="n-implementation-status"><t>Reference code under the MIT Open Source license has been developed to demonstrate all the features described in this document.</t>
</section>
</section>
<section title="Architecture" anchor="n-architecture"><t>The JSDevice format is limited to describing a device or class of devices. The means by which the device description is obtained by relying applications is outside the scope of this specification but <bcp14>MAY</bcp14> be relevant to the authenticity and currency of the description obtained.</t>
<t>Different delivery mechanisms present different authenticity and currency properties and thus the controls relevant to achieving these concerns differ by context.</t>
<t>A device description obtained by scanning a QR code on the device itself has a very high probability of being authentic and accurate with respect to the properties of the device scanned but a lower probability of being current. A device description provided by a vendor during the acquisition process is more vulnerable to forgery but likely to reflect important updates if genuine.</t>
<t>It is anticipated that a JSDevice description will normally be delivered wrapped in an assertion structure which at minimum provides integrity controls. The decision to use an assertion format and its scope is left as an implementation decision.</t>
<section title="EARL" anchor="n-earl"><t>The Encrypted Authenticated Resource Locator <xref target="draft-hallambaker-earl"></xref> is a resource location scheme that provides a basic cryptographic envelope that provides confidentiality and integrity controls.</t>
<t>The envelope payload and metadata <bcp14>MAY</bcp14> be signed providing an assertion structure and the keys used for signing <bcp14>MAY</bcp14> be supported by credentials issued by a Trusted Third Party.</t>
</section>
<section title="Updates" anchor="n-updates"><t>Device descriptions <bcp14>MAY</bcp14> support updates via the mechanism presented in JSContact Extensions <xref target="draft-hallambaker-jscontact"></xref>.</t>
<t>[Alternatively, the update mechanism could be specified in the protected header of the Assertion structure.]</t>
</section>
</section>
<section title="Data Binding" anchor="n-data-binding"><t>The data binding conventions established in <xref target="RFC9553"></xref> are applied. For convenience, these are summarized here.</t>
<section title="Data Type Notations" anchor="n-data-type-notations"><t>The underlying format for JSContact is JSON, so its data types also build on JSON values. The terms "object" and "array" as well as the four primitive types ("strings", "numbers", "booleans", and "null") are to be interpreted as described in Section 1 of <xref target="RFC8259"></xref>. All JSContact data <bcp14>MUST</bcp14> be valid according to the constraints given in I-JSON <xref target="RFC7493"></xref>. Unless otherwise noted, all member names in JSON objects and all string values are case-sensitive. Within the context of JSON objects, the term "key" is synonymous with "member name" as defined in Section 1 of <xref target="RFC8259"></xref>.</t>
</section>
<section title="Common Data Types" anchor="n-common-data-types"><t>The common data type Resource specified in section 1.4.4 of <xref target="RFC9553"></xref> and the type CryptoKey specified in section 2.6.1 of <xref target="RFC9553"></xref> are used.</t>
</section>
<section title="Internationalization" anchor="n-internationalization"><t>JSDevice aims to be used for devices in international use. Notably, text values such as product names, manuals, etc. are likely to cover a wide range of languages and cultures.</t>
<section title="Free-Form Text" anchor="n-freeform-text"><t>Properties having free-form text values <bcp14>MAY</bcp14> contain any valid sequence of Unicode characters encoded as a JSON string. Such values can contain unidirectional left-to-right and right-to-left text, as well as bidirectional text using Unicode Directional Formatting Characters as described in Section 2 of [TBS]. Implementations setting bidirectional text <bcp14>MUST</bcp14> make sure that each property value complies with the requirements of the Unicode Bidirectional Algorithm. Implementations <bcp14>MUST NOT</bcp14> assume that text values of adjacent properties are processed or displayed as a combined string; for example, the values of a given name component and a surname component may or may not be rendered together.</t>
</section>
<section title="URIs" anchor="n-uris"><t>Several properties require their string value to be a URI as defined in [RFC3986]. Implementations <bcp14>MUST</bcp14> make sure to use proper percent-encoding for URIs that cannot be represented using unreserved URI characters. Section 3.1 of <xref target="RFC3987"></xref> defines how to convert Internationalized Resource Identifiers to URIs. JSContact makes no recommendation on how to display URIs, but the WHATWG URL Living Standard (see "Internationalization and special characters" (Section 4.8.3) of [TBS]) provides guidance for URLs found in the context of a web browser.</t>
</section>
</section>
<section title="Vendor Specific Extensions" anchor="n-vendor-specific-extensions"><t>Vendors may extend properties and values for experimentation or to store contacts data that is only useful for a single service or application. Such extensions are not meant for interoperation. If, instead, interoperation is desired, vendors are strongly encouraged to define and register new properties, types, and values at IANA.</t>
</section>
<section title="Versioning" anchor="n-versioning"><t>Every instance of a JSDevice description indicates which JSDevice version its IANA-registered properties and values are based on. The version is indicated both in the property within the description and in the version parameter of the JSDevice media type. All IANA-registered elements indicate the version at which they were introduced or obsoleted.</t>
<t>A JSDevice version consists of a major and minor version.</t>
<t>Differing major version values indicate substantial differences in JSDevice semantics and format. Implementations <bcp14>MUST</bcp14> be prepared for property definitions and other JSDevice elements that differ in a backwards-incompatible manner.</t>
<t>Differing minor version values indicate additions that enrich JSDevice data but do not introduce backwards-incompatible changes. Typically, these are new property enum values or properties with a narrow semantic scope. A new minor version <bcp14>MUST NOT</bcp14> require implementations to change their processing of JSDevice data. Changing the major version number resets the minor version number to zero.</t>
<section title="Version Format and Requirements" anchor="n-version-format-and-requirements"><t>A version value starts with the numeric major version, followed by the FULL STOP character (U+002E), followed by the numeric minor version. Later versions are numerically higher than former versions, with the major version being more significant than the minor version. A version value is produced by the following ABNF:</t>
<sourcecode>jsversion = 1*DIGIT "." 1*DIGIT</sourcecode>
<t>Figure: The ABNF for JSDevice Version Values</t>
</section>
<section title="Current Version" anchor="n-current-version"><t>This specification registers JSDevice version value "1.0".</t>
</section>
</section>
</section>
<section title="Device Description" anchor="n-device-description"><section title="Common Properties" anchor="n-common-properties"><t>The following properties are common to JScontact, JSCalendar and JSDevice and used in the same fashion in each specification.</t>
<section title="@type" anchor="n--type-"><t>"@type": String (mandatory) This specifies the type that this object represents. The allowed value  differs by object type and is defined in Sections 2.1, 2.2, and 2.3. </t>
<sourcecode>"@type": "Device"</sourcecode>
</section>
<section title="uid" anchor="n--uid-"><t>"uid": String (mandatory) This is a globally unique identifier used to associate objects representing the same item. Updates to the document describing the same item MUST have the  same UID. </t>
<sourcecode>"uid": "NDXT-KQ6W-FXFM-5D2A-4AXY-LTAM-OAFR"</sourcecode>
</section>
<section title="prodId" anchor="n--prodid-"><t>"prodId": String (optional) An identifier for the product that last updated the JSCalendar  object. This should be set whenever the data in the object is modified  (i.e., whenever the updated property is set). </t>
<sourcecode>"prodId": "Configulator/1.0"</sourcecode>
</section>
<section title="created" anchor="n--created-"><t>"created": UTCDateTime (optional) The date and time this object was initially created. </t>
<sourcecode>"created": "2025-05-11T05:40:22Z"</sourcecode>
</section>
<section title="updated" anchor="n--updated-"><t>"updated": UTCDateTime (optional) The date and time this object was last modified. </t>
<sourcecode>"updated": "2025-05-11T05:40:22Z"</sourcecode>
</section>
</section>
<section title="Metadata" anchor="n--metadata-"><t>Information related to the description itself </t>
<section title="version" anchor="n--version-"><t>"version": String (mandatory) The JSDevice version of this description. The value MUST be one  of the IANA-registered JSDevice Version values for the version property.  </t>
<sourcecode>"version": "1.0"</sourcecode>
</section>
<section title="kind" anchor="n--kind-"><t>"kind": String (optional) The kind of the entity described </t>
<sourcecode>"kind": "device"</sourcecode>
</section>
<section title="language" anchor="n--language-"><t>"language": String (optional) The language tag, as defined in [RFC5646], that best describes the language  used for text in the description, optionally including additional information such  as the script. Note that values MAY be localized in the localizations  property. </t>
<sourcecode>"language": "en"</sourcecode>
</section>
<section title="localizations" anchor="n--localizations-"><t>"localizations": String[JsDevice] (optional) The property values localized to languages other than the main language  (Section 2.1.5) of the Card. Localizations provide language-specific alternatives  for existing property values and SHOULD NOT add new properties. The keys in  the localizations property value are language tags [RFC5646]; the values  are of type PatchObject and localize the Card in that language tag. The paths  in the PatchObject are relative to the Card that includes the localizations property. A patch MUST NOT target the localizations property. </t>
<t>The JsDevice object is defined in [TBS]. </t>
<sourcecode>"localizations": {
  "cy": {
    "@type": "Device",
    "modelName": "Acme GweGamera 4K"}}</sourcecode>
</section>
</section>
<section title="General" anchor="n--general-"><t>General information related to the device and model. </t>
<section title="deviceId" anchor="n--deviceid-"><t>"deviceId": String (optional) A URI that uniquely identifies the device. </t>
<sourcecode>"deviceId": "NDXT-KQ6W-FXFM-5D2A-4AXY-LTAM-OAFR"</sourcecode>
</section>
<section title="modelId" anchor="n--modelid-"><t>"modelId": String (optional) A URI that uniquely identifies the device model. </t>
<sourcecode>"modelId": "NBEG-DJNO-DW3Q-RBKT-SXZ5-CAWH-MXUT"</sourcecode>
</section>
<section title="modelName" anchor="n--modelname-"><t>"modelName": String (optional) Human readable model name. </t>
<sourcecode>"modelName": "Acme WebCam 4K"</sourcecode>
</section>
<section title="manufacturer" anchor="n--manufacturer-"><t>"manufacturer": String (optional) Device manufacturer name. </t>
<sourcecode>"manufacturer": "Acme Corp."</sourcecode>
</section>
<section title="dateManufacture" anchor="n--datemanufacture-"><t>"dateManufacture": UTCDateTime (optional) Date of manufacture. </t>
<sourcecode>"dateManufacture": "2025-05-11T05:40:22Z"</sourcecode>
</section>
<section title="endSupport" anchor="n--endsupport-"><t>"endSupport": UTCDateTime (optional) Date at which support for the device is scheduled to end. </t>
<sourcecode>"endSupport": "2030-05-11T05:40:22Z"</sourcecode>
</section>
<section title="endLife" anchor="n--endlife-"><t>"endLife": UTCDateTime (optional) Date at which it is advised the device be taken out of service. </t>
<sourcecode>"endLife": "2035-05-11T05:40:22Z"</sourcecode>
</section>
</section>
<section title="Physical" anchor="n--physical-"><t>Information related to the physical properties of the device. </t>
<section title="components" anchor="n--components-"><t>"components": String[Component] (optional) The physical components making up the device and their dimensions. </t>
<t>A Component object has all the properties of the Resource data type, with the following additional definition: </t>
<t>"dimensions": String[Dimensions] (optional) The dimension specifications </t>
<t>A Dimensions object has the following properties. </t>
<t>"kind": String (optional) The type of dimensions specified, 'typical', 'maximum', 'shipping' </t>
<t>"weight": Number (optional) The weight of the component in kilograms </t>
<t>"width": Number (optional) The width of the component in meters </t>
<t>"depth": Number (optional) The depth of the component in meters </t>
<t>"height": Number (optional) The height of the component in meters </t>
<t>"temperatureMin": Number (optional) The minimum temperature for the device </t>
<t>"temperatureMax": Number (optional) The maximum temperature for the device </t>
<sourcecode>"components": {
  "main": {
    "@type": "Component",
    "dimensions": {
      "typical": {
        "kind": "typical",
        "weight": 0.05,
        "width": 0.1,
        "depth": 0.1,
        "height": 0.1}}}}</sourcecode>
</section>
</section>
<section title="Media" anchor="n--media-"><t>Media related to the device and its operation. </t>
<section title="images" anchor="n--images-"><t>"images": Media[] (optional) Photographs and schematics of the device or model. </t>
<t>The Media object is defined in [TBS]. </t>
<sourcecode>"images": [{
    "@type": "Media",
    "kind": "front",
    "uri": "https://acme.example.net/media/webcam4k.front.png",
    "mediaType": "image/png",
    "label": "Front View"},
  {
    "@type": "Media",
    "kind": "rear",
    "uri": "httpe://acme.example.net/media/webcam4k.rear.png",
    "mediaType": "image/png",
    "label": "Rear View"},
  {
    "@type": "Media",
    "kind": "schematic",
    "uri": "https://acme.example.net/media/webcam4k.schematic.svg",
    "mediaType": "image/svg",
    "label": "Rear View"}]</sourcecode>
</section>
<section title="documentation" anchor="n--documentation-"><t>"documentation": Media[] (optional) Manuals describing the device. </t>
<t>The Media object is defined in [TBS]. </t>
<sourcecode>"documentation": [{
    "@type": "Media",
    "kind": "quickstart",
    "uri": "httpe://acme.example.net/media/webcam4k.quickstart.pdf",
    "mediaType": "application/pdf",
    "label": "Quick Start Guide"},
  {
    "@type": "Media",
    "kind": "unpacking",
    "uri": "https://acme.example.net/media/webcam4k.unboxing.pdf",
    "mediaType": "application/pdf",
    "label": "Rear View"},
  {
    "@type": "Media",
    "kind": "manual",
    "uri": "httpe://acme.example.net/media/webcam4k.manual.pdf",
    "mediaType": "application/pdf",
    "label": "Manual"}]</sourcecode>
</section>
</section>
<section title="Operations" anchor="n--operations-"><t>Information related to operation of the device. </t>
<section title="suppliers" anchor="n--suppliers-"><t>"suppliers": Supplier[] (optional) Suppliers for the device and related accessories. </t>
<t>A Supplier object has all the properties of the Resource data type. </t>
<sourcecode>"suppliers": [{
    "@type": "Supplier",
    "uri": "https://store.acme.example.net/webcam4k",
    "mediaType": "text/html",
    "label": "Acme Store"}]</sourcecode>
</section>
<section title="maintenance" anchor="n--maintenance-"><t>"maintenance": String[Maintenance] (optional) List of maintenance events associated with the device. </t>
<t>A Maintenance object has all the properties of the Resource data type, with the following additional definitions: </t>
<t>"recurring": Boolean (optional) If true (default), the maintenance event recurs as specified by the days, months and years properties. If false, the maintenance event  is a one-time operation occurring the specified interval after installation. </t>
<t>"days": Number (optional) Interval days. </t>
<t>"months": Number (optional) Interval months. If specified, the days property is ignored. </t>
<sourcecode>"maintenance": {
  "maint1": {
    "@type": "Maintenance",
    "uri": "https://acme.example.net/media/webcam4k.manual.pdf#lubric
        ation",
    "label": "Lubricate mount",
    "recurring": true,
    "months": 24}}</sourcecode>
</section>
<section title="relatedItems" anchor="n--relateditems-"><t>"relatedItems": String[RelatedItem] (optional) Accessories, parts and consumables related to the device.  For example, ink cartridges, parts likely to wear etc. </t>
<t>A RelatedItem object has all the properties of the Resource data type, with the following additional definitions: </t>
<t>"modelId": String[] (optional) A list of URIs specifying model identifiers. These MAY include related variations of the same item. For example, different  sizes of the same color ink. </t>
<t>"suppliers": Supplier[] (optional) A list of URIs linking to suppliers for the consumable. </t>
<t>A Supplier object has all the properties of the Resource data type. </t>
<sourcecode>"relatedItems": {
  "part1": {
    "@type": "RelatedItem",
    "kind": "part",
    "uri": "https://acme.example.net/media/bearings/24U.jsdevice",
    "mediaType": "application/jsdevice",
    "label": "Mount bearing"},
  "accessory1": {
    "@type": "RelatedItem",
    "kind": "accessory",
    "uri": "https://acme.example.net/media/lenses/telephoto200.jsdevi
        ce",
    "mediaType": "application/jsdevice",
    "label": "Lens Kit"}}</sourcecode>
</section>
</section>
<section title="Networking" anchor="n--networking-"><t>Information related to device netowrking (if supported) </t>
<section title="network" anchor="n--network-"><t>"network": String[Network] (optional) The network protocol connections supported. </t>
<t>A Network object has the following properties. </t>
<t>"kind": String (optional) The network connection kind </t>
<t>"address": String[] (optional) The Internet Protocol Address(es) </t>
<t>"identifier": String (optional) The IANA protocol identifier </t>
<t>"ports": Number[] (optional) The default IP ports. </t>
<t>"endpoints": String[] (optional) "keys": String[String] (optional) The identifiers of the set of device keys that MAY be used in combination with this protocol </t>
<t>"permissions": String[] (optional) Permission identifiers used to assign access rights to control of the device. </t>
<sourcecode>"network": {
  "boot1": {
    "kind": "bootstrap",
    "identifier": "mmm-connect",
    "ports": [80],
    "keys": {
      "id": "udf:MCBG-ZSI4-XSWX-UNEE-GU6X-YTBZ-XPH5"}},
  "disc1": {
    "kind": "discovery",
    "identifier": "dhcp",
    "endpoints": ["ip"]},
  "disc2": {
    "kind": "discovery",
    "identifier": "anything",
    "endpoints": ["ip",
      "dns",
      "webpki"]},
  "motor1": {
    "kind": "service",
    "identifier": "acme_cam_control",
    "ports": [443],
    "endpoints": ["dns",
      "webpki"],
    "permissions": ["admin"]},
  "web1": {
    "kind": "service",
    "identifier": "https",
    "ports": [443],
    "endpoints": ["dns",
      "webpki"],
    "permissions": ["read"]},
  "moq1": {
    "kind": "service",
    "identifier": "moq",
    "endpoints": ["dns",
      "webpki"],
    "permissions": ["read"]}}</sourcecode>
</section>
<section title="cryptoKeys" anchor="n--cryptokeys-"><t>"cryptoKeys": String[CryptoKey] (optional) The cryptographic resources such as public keys and certificates associated  with the device </t>
<t>The CryptoKey object is defined in JSContact and JSContact Cryptographic Extensions. </t>
<t>The CryptoKey object is defined in [TBS]. </t>
<sourcecode>"cryptoKeys": {}</sourcecode>
</section>
</section>
</section>
<section title="IANA Considerations" anchor="n-iana-considerations"><t>This document does not specify any actions for IANA (yet).</t>
</section>
<section title="Acknowledgements" anchor="n-acknowledgements"><t>Michael Richardson, Alan DeKok, </t>
<t>Robert Stepanek</t>
</section>
</middle>
<back>
<references title="Normative References"><reference anchor="RFC9553"><front>
<title>JSContact: A JSON Representation of Contact Data</title>
<author fullname="R. Stepanek" initials="R." surname="Stepanek"><address>
</address>
</author>
<author fullname="M. Loffredo" initials="M." surname="Loffredo"><address>
</address>
</author>
<date month="May" year="2024"/>
</front>
<seriesInfo name="RFC" value="9553"/>
<seriesInfo name="DOI" value="10.17487/RFC9553"/>
</reference>
<reference anchor="RFC2119"><front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author fullname="S. Bradner" initials="S." surname="Bradner"><address>
</address>
</author>
<date month="March" year="1997"/>
</front>
<seriesInfo name="BCP" value="14"/>
<seriesInfo name="RFC" value="2119"/>
<seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8259"><front>
<title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
<author fullname="T. Bray" initials="T." surname="Bray"><address>
</address>
</author>
<date month="December" year="2017"/>
</front>
<seriesInfo name="STD" value="90"/>
<seriesInfo name="RFC" value="8259"/>
<seriesInfo name="DOI" value="10.17487/RFC8259"/>
</reference>
<reference anchor="RFC7493"><front>
<title>The I-JSON Message Format</title>
<author fullname="T. Bray" initials="T." surname="Bray"><address>
</address>
</author>
<date month="March" year="2015"/>
</front>
<seriesInfo name="RFC" value="7493"/>
<seriesInfo name="DOI" value="10.17487/RFC7493"/>
</reference>
<reference anchor="draft-hallambaker-earl"><front>
<title>Encrypted Authenticated Resource Locator</title>
<author fullname="Phillip Hallam-Baker" initials="P." surname="Hallam-Baker"><organization>ThresholdSecrets.com</organization>
<address>
</address>
</author>
<date day="10" month="April" year="2025"/>
</front>
<seriesInfo name="Internet-Draft" value="draft-hallambaker-earl-00"/>
</reference>
<reference anchor="draft-hallambaker-jscontact"><front>
<title>JSContact Cryptographic Key Extensions</title>
<author fullname="Phillip Hallam-Baker" initials="P." surname="Hallam-Baker"><organization>ThresholdSecrets.com</organization>
<address>
</address>
</author>
<date day="10" month="May" year="2025"/>
</front>
<seriesInfo name="Internet-Draft" value="draft-hallambaker-jscontact-04"/>
</reference>
</references>
<references title="Informative References"><reference anchor="RFC3987"><front>
<title>Internationalized Resource Identifiers (IRIs)</title>
<author fullname="M. Duerst" initials="M." surname="Duerst"><address>
</address>
</author>
<author fullname="M. Suignard" initials="M." surname="Suignard"><address>
</address>
</author>
<date month="January" year="2005"/>
</front>
<seriesInfo name="RFC" value="3987"/>
<seriesInfo name="DOI" value="10.17487/RFC3987"/>
</reference>
</references>
</back>
</rfc>
