| Internet-Draft | MyClerk Protocol | January 2026 |
| Arcan | Expires 14 July 2026 | [Page] |
This document specifies the MyClerk Protocol, a tiered-security communication protocol designed for distributed family orchestration systems. The protocol provides six security tiers ranging from 1-byte minimal overhead for tunneled messages to 144-byte full security for critical operations. It supports multiple transport mechanisms including NATS, Matrix, WebSocket, and direct TCP, while maintaining end-to-end encryption using ChaCha20-Poly1305 and X25519 key exchange.¶
The protocol is transport-agnostic, federation-capable, and optimized for environments ranging from resource-constrained IoT devices to full-featured desktop clients.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 14 July 2026.¶
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 of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document.¶
Modern families operate across multiple locations and devices: a primary home with network-attached storage, a vacation house with a mini-PC, grandparents with a Raspberry Pi, and mobile devices requiring access while traveling. The MyClerk Protocol addresses the communication requirements of such distributed family systems.¶
Traditional protocols impose significant overhead that becomes problematic for constrained channels. The MyClerk Protocol introduces tiered security levels, allowing applications to select appropriate overhead based on the security requirements of each operation.¶
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 MyClerk Protocol is a binary protocol using MessagePack [RFC8949] for payload encoding. It defines six security tiers with increasing header sizes and cryptographic protections.¶
| Tier | Header Size | Encryption | Authentication | Use Case |
|---|---|---|---|---|
| 0 | 1 byte | None (tunneled) | None | Inside secure session |
| 1 | 4 bytes | None | None | Fire-and-forget commands |
| 2 | 6 bytes | Optional | CRC-16 | Home automation |
| 3 | 12 bytes | ChaCha20-Poly1305 | HMAC-32 | Conversational |
| 4 | 42 bytes | ChaCha20-Poly1305 | HMAC-64 | Key exchange |
| 5 | 58+ bytes | ChaCha20-Poly1305 | HMAC-256 + Poly1305 | Maximum security |
All messages consist of a header, optional payload, and optional trailer. The header format varies by security tier.¶
The first byte (Flags) is present in all tiers and has the following structure:¶
0 0 1 2 3 4 5 6 7 +-+-+-+-+-+-+-+-+ |V V|T T T|C|F|E| +-+-+-+-+-+-+-+-+ V: Protocol Version (2 bits) - Currently 0 T: Security Tier (3 bits) - Values 0-5 C: Compressed (1 bit) - Payload is compressed F: Fragmented (1 bit) - Message is fragmented E: Encrypted (1 bit) - Payload is encrypted¶
Tier 0 is used for messages tunneled inside an already-secure session. It provides minimal overhead.¶
0 0 1 2 3 4 5 6 7 +-+-+-+-+-+-+-+-+ |0 0|0 0 0|C|F|E| +-+-+-+-+-+-+-+-+¶
Tier 0 messages MUST only be sent within an established Tier 3+ session. Implementations receiving a Tier 0 message outside of a secure session MUST discard it.¶
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V V|0 0 1|C|F|E| Operation Code | Sequence | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+¶
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V V|0 1 0|C|F|E| Operation Code | Sequence | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Session ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+¶
Tier 2 messages SHOULD include a CRC-16 trailer for error detection.¶
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V V|0 1 1|C|F|E| Operation Code | Sequence | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Session ID | Timestamp | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Timestamp (cont.) | Nonce | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+¶
Tier 3 messages with the E flag set MUST be encrypted using ChaCha20-Poly1305 as specified in [RFC8439].¶
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V V|1 0 0|C|F|E| Operation Code | Sequence | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Session ID | Timestamp | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Timestamp (cont.) | Nonce | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Key ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | ECDH Public Key (X25519) | | (32 bytes) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+¶
Tier 5 extends Tier 4 with a full Poly1305 authentication tag in the header:¶
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | [Tier 4 Header - 42 bytes] | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Poly1305 Tag (16 bytes) | | | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+¶
Tier 5 messages MUST include a full HMAC-SHA256 (32 bytes) in the trailer, providing dual authentication: Poly1305 for AEAD integrity and HMAC-SHA256 for post-quantum resistance.¶
ChaCha20-Poly1305 requires a 96-bit (12-byte) nonce that MUST NOT be reused with the same key. The MyClerk Protocol constructs nonces as follows:¶
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Timestamp (32 bits) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Random (32 bits) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Counter (32 bits) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+¶
All fields are encoded in big-endian byte order.¶
This construction provides a collision probability of less than 2^-80 per year at 1 million operations per second, assuming proper CSPRNG implementation.¶
Session keys are derived using HKDF as specified in [RFC5869] with SHA-256 as the hash function.¶
For Tier 4+ sessions:¶
shared_secret = X25519(local_private_key, remote_public_key)
session_key = HKDF-SHA256(
IKM = shared_secret,
salt = nonce_initiator || nonce_responder,
info = "myclerk-session-v0",
L = 32
)
¶
Keys MUST be rotated after any of the following conditions:¶
Rotated keys are derived as:¶
new_key = HKDF-SHA256(
IKM = current_key,
salt = "rotate",
info = rotation_counter (4 bytes, big-endian),
L = 32
)
¶
Operations are identified by a 16-bit operation code. The operation space is divided into ranges:¶
| Range | Category |
|---|---|
| 0x0000-0x00FF | Core Operations (Session, Key Management) |
| 0x0100-0x01FF | Standard Operations (Device, Identity, Messaging) |
| 0x0200-0x02FF | Resource Sharing (Streams, GPU, Routing) |
| 0x0300-0x03FF | Federation |
| 0x0400-0x04FF | Billing and Economics |
| 0x0500-0x05FF | Virtual File System (VFS) |
| 0x0600-0x06FF | Hardware Passthrough (USB, GPIO, I2C, SPI, CAN) |
| 0xF000-0xFFFE | Vendor Extensions |
| 0xFFFF | Reserved |
| Code | Name | Description |
|---|---|---|
| 0x0000 | NOP | No operation |
| 0x0001 | KEEPALIVE | Session keepalive |
| 0x0002 | KEEPALIVE_ACK | Keepalive acknowledgment |
| 0x0003 | SESSION_INIT | Initialize session |
| 0x0004 | SESSION_ACK | Session acknowledgment |
| 0x0005 | SESSION_CLOSE | Close session |
| 0x0006 | SESSION_CLOSE_ACK | Close acknowledgment |
| 0x0007 | SESSION_RESUME | Resume session with ticket |
| 0x0008 | SESSION_RESUMED | Session resumed |
| Code | Name | Description |
|---|---|---|
| 0x0010 | KEY_EXCHANGE_INIT | Initiate key exchange |
| 0x0011 | KEY_EXCHANGE_RESPONSE | Key exchange response |
| 0x0012 | KEY_EXCHANGE_COMPLETE | Key exchange complete |
| 0x0016 | SESSION_ROTATE | Rotate session key |
| 0x0017 | SESSION_REVOKE | Revoke session key |
Resource Sharing operations enable devices to expose and consume resources across the network. These operations support video, audio, HID, and GPU services.¶
| Code | Name | Description |
|---|---|---|
| 0x0200 | DEVICE_LIST | List available devices |
| 0x0201 | DEVICE_INFO | Get device information |
| 0x0202 | DEVICE_SUBSCRIBE | Subscribe to device events |
| 0x0203 | DEVICE_UNSUBSCRIBE | Unsubscribe from device |
| 0x0204 | DEVICE_LOCK | Lock device for exclusive use |
| 0x0205 | DEVICE_UNLOCK | Release device lock |
| 0x0206 | DEVICE_CONFIGURE | Configure device parameters |
| 0x0207 | DEVICE_CAPABILITIES | Query device capabilities |
| Code | Name | Description |
|---|---|---|
| 0x0210 | STREAM_START | Start data stream |
| 0x0211 | STREAM_STOP | Stop data stream |
| 0x0212 | STREAM_DATA | Stream data payload |
| 0x0213 | STREAM_CONFIGURE | Configure stream parameters |
| 0x0214 | STREAM_QUALITY | Adjust quality settings |
| 0x0215 | STREAM_PAUSE | Pause stream |
| 0x0216 | STREAM_RESUME | Resume paused stream |
Stream types are indicated in the STREAM_START payload:¶
GPU operations enable queue-based access to inference services (LLM, TTS, STT, Image Generation).¶
| Code | Name | Description |
|---|---|---|
| 0x0220 | GPU_REQUEST | Submit GPU request |
| 0x0221 | GPU_RESPONSE | GPU response (streaming) |
| 0x0222 | GPU_STATUS | Query service status |
| 0x0223 | GPU_CANCEL | Cancel pending request |
| 0x0224 | GPU_QUEUE_INFO | Queue position and ETA |
GPU service types:¶
Dynamic routing enables Hub-controlled device assignment and per-client access control. A Hub can redirect device streams between clients dynamically.¶
| Code | Name | Description |
|---|---|---|
| 0x0240 | ROUTE_CREATE | Create device route |
| 0x0241 | ROUTE_DELETE | Delete device route |
| 0x0242 | ROUTE_LIST | List active routes |
| 0x0243 | ROUTE_MODIFY | Modify existing route |
| 0x0244 | ACL_SET | Set access control |
| 0x0245 | ACL_GET | Get access control |
| 0x0246 | ACL_GRANT | Grant client access |
| 0x0247 | ACL_REVOKE | Revoke client access |
| 0x0248 | ROUTE_PRIORITY | Set routing priority |
Access modes:¶
Hardware Passthrough operations enable low-level access to hardware interfaces. Unlike service-based resource sharing, these operations provide direct protocol-level access to hardware buses.¶
USB passthrough virtualizes USB at the URB (USB Request Block) level, allowing any USB device to appear as natively connected on the client.¶
| Code | Name | Description |
|---|---|---|
| 0x0600 | USB_DEVICE_LIST | List USB devices |
| 0x0601 | USB_DEVICE_ATTACH | Attach USB device |
| 0x0602 | USB_DEVICE_DETACH | Detach USB device |
| 0x0603 | USB_CONTROL_TRANSFER | USB control transfer |
| 0x0604 | USB_BULK_TRANSFER | USB bulk transfer |
| 0x0605 | USB_INTERRUPT_TRANSFER | USB interrupt transfer |
| 0x0606 | USB_ISOCHRONOUS_TRANSFER | USB isochronous transfer |
| 0x0607 | USB_GET_DESCRIPTOR | Get USB descriptor |
| 0x0608 | USB_SET_CONFIGURATION | Set USB configuration |
| 0x0609 | USB_SET_INTERFACE | Set USB interface |
| 0x060A | USB_CLEAR_HALT | Clear endpoint halt |
| 0x060B | USB_RESET | Reset USB device |
Serial passthrough supports RS-232, RS-485, and UART interfaces.¶
| Code | Name | Description |
|---|---|---|
| 0x0610 | SERIAL_PORT_LIST | List serial ports |
| 0x0611 | SERIAL_PORT_OPEN | Open serial port |
| 0x0612 | SERIAL_PORT_CLOSE | Close serial port |
| 0x0613 | SERIAL_PORT_CONFIGURE | Configure baud, parity, etc. |
| 0x0614 | SERIAL_DATA_WRITE | Write to serial port |
| 0x0615 | SERIAL_DATA_READ | Read from serial port |
| 0x0616 | SERIAL_CONTROL_SET | Set control lines (DTR, RTS) |
| 0x0617 | SERIAL_CONTROL_GET | Get control line status |
| 0x0618 | SERIAL_BREAK | Send break condition |
GPIO operations enable control of General Purpose Input/Output pins.¶
| Code | Name | Description |
|---|---|---|
| 0x0620 | GPIO_CHIP_LIST | List GPIO chips |
| 0x0621 | GPIO_LINE_INFO | Get line information |
| 0x0622 | GPIO_LINE_REQUEST | Request GPIO line |
| 0x0623 | GPIO_LINE_RELEASE | Release GPIO line |
| 0x0624 | GPIO_LINE_SET | Set line value |
| 0x0625 | GPIO_LINE_GET | Get line value |
| 0x0626 | GPIO_LINE_WATCH | Watch for edge events |
| 0x0627 | GPIO_EVENT | GPIO edge event notification |
| 0x0628 | GPIO_PWM_CONFIGURE | Configure PWM output |
| 0x0629 | GPIO_PWM_SET | Set PWM duty cycle |
I2C (Inter-Integrated Circuit) bus operations for sensor and peripheral communication.¶
| Code | Name | Description |
|---|---|---|
| 0x0630 | I2C_BUS_LIST | List I2C buses |
| 0x0631 | I2C_BUS_SCAN | Scan for devices on bus |
| 0x0632 | I2C_TRANSFER | I2C read/write transfer |
| 0x0633 | I2C_WRITE_BYTE | Write single byte |
| 0x0634 | I2C_READ_BYTE | Read single byte |
| 0x0635 | I2C_WRITE_BLOCK | Write data block |
| 0x0636 | I2C_READ_BLOCK | Read data block |
| 0x0637 | I2C_SMBUS_COMMAND | SMBus protocol command |
SPI (Serial Peripheral Interface) operations for high-speed peripheral communication.¶
| Code | Name | Description |
|---|---|---|
| 0x0640 | SPI_BUS_LIST | List SPI buses |
| 0x0641 | SPI_DEVICE_OPEN | Open SPI device |
| 0x0642 | SPI_DEVICE_CLOSE | Close SPI device |
| 0x0643 | SPI_CONFIGURE | Configure mode, speed, bits |
| 0x0644 | SPI_TRANSFER | Full-duplex SPI transfer |
| 0x0645 | SPI_WRITE | SPI write-only |
| 0x0646 | SPI_READ | SPI read-only |
CAN (Controller Area Network) bus operations for automotive and industrial protocols.¶
| Code | Name | Description |
|---|---|---|
| 0x0650 | CAN_INTERFACE_LIST | List CAN interfaces |
| 0x0651 | CAN_INTERFACE_OPEN | Open CAN interface |
| 0x0652 | CAN_INTERFACE_CLOSE | Close CAN interface |
| 0x0653 | CAN_CONFIGURE | Configure bitrate, mode |
| 0x0654 | CAN_FRAME_SEND | Send CAN frame |
| 0x0655 | CAN_FRAME_RECEIVE | Receive CAN frame |
| 0x0656 | CAN_FILTER_SET | Set receive filter |
| 0x0657 | CAN_ERROR_STATUS | Get error counters |
1-Wire bus operations for temperature sensors, iButtons, and similar devices.¶
| Code | Name | Description |
|---|---|---|
| 0x0660 | ONEWIRE_BUS_LIST | List 1-Wire buses |
| 0x0661 | ONEWIRE_SEARCH | Search for devices |
| 0x0662 | ONEWIRE_RESET | Reset bus |
| 0x0663 | ONEWIRE_READ_ROM | Read device ROM |
| 0x0664 | ONEWIRE_MATCH_ROM | Select device by ROM |
| 0x0665 | ONEWIRE_SKIP_ROM | Skip ROM (single device) |
| 0x0666 | ONEWIRE_READ | Read bytes |
| 0x0667 | ONEWIRE_WRITE | Write bytes |
Payloads are encoded using MessagePack (a subset of CBOR). This section defines payload structures using CDDL [RFC8610].¶
session-init = {
nonce: bstr .size 8,
timestamp: uint,
? capabilities: [* capability],
? device-id: bstr .size 16,
}
capability = &(
compression-lz4: 0,
compression-zstd: 1,
encryption-chacha20: 2,
encryption-aes256gcm: 3,
fragmentation: 4,
streaming: 5,
federation: 6,
vfs: 8,
)
¶
session-ack = {
session-id: uint .size 2,
nonce: bstr .size 8,
selected-tier: uint .le 5,
? selected-capabilities: [* capability],
}
¶
session-resume = {
old-session-id: uint .size 2,
ticket: bstr .size 64,
}
; Ticket structure (encrypted with server key, AES-256-GCM):
; - session-key: 32 bytes
; - device-id: 16 bytes
; - issued-at: 4 bytes (Unix timestamp)
; - expires-at: 4 bytes (Unix timestamp)
; - ticket-nonce: 8 bytes
¶
When endpoints support different maximum tiers, they MUST negotiate to the highest common tier. The server MUST respond with the minimum of its supported tier and the client's requested tier.¶
Servers MAY enforce minimum tier requirements for specific operations. If a client requests an operation at an insufficient tier, the server MUST respond with error code 0x12 (FORBIDDEN) and include the required tier in the error payload.¶
The following operations have minimum tier requirements:¶
| Operation Category | Minimum Tier |
|---|---|
| Lock/Unlock (physical access) | 3 |
| Key Exchange | 4 |
| Federation Operations | 4 |
| Emergency Operations | 3 |
Error codes are 8-bit values organized into ranges:¶
| Range | Category |
|---|---|
| 0x00-0x0F | Success |
| 0x10-0x1F | Client Errors |
| 0x20-0x2F | Server Errors |
| 0x30-0x3F | Federation Errors |
| 0xF0-0xFF | Reserved |
Reusing a nonce with the same key in ChaCha20-Poly1305 completely compromises the confidentiality and authenticity of all messages encrypted with that key-nonce pair. Implementations MUST ensure nonces are never reused by:¶
Tier 3+ messages include timestamps for replay protection. Implementations SHOULD reject messages with timestamps more than 5 minutes in the past or future. Session resumption tickets include a nonce that MUST be tracked to prevent replay attacks.¶
An attacker might attempt to force communication at a lower tier. Servers MUST enforce minimum tier requirements for sensitive operations. Clients SHOULD warn users when connecting at a lower tier than expected.¶
If a session key is compromised, an attacker can decrypt all messages in that session. The 24-hour automatic key rotation limits the window of exposure. For forward secrecy, implementations SHOULD use ephemeral ECDH keys for each session.¶
The X25519 key exchange is not quantum-resistant. Tier 5 includes an additional HMAC-SHA256 trailer that provides some protection against future quantum attacks on Poly1305. Implementations concerned about long-term confidentiality SHOULD use Tier 5 for sensitive data.¶
This document has no IANA actions.¶
If this protocol were to be standardized, IANA would be requested to create a registry for MyClerk Protocol operation codes with the ranges defined in Section 6.¶
This specification is part of the MyClerk project, a privacy-first family orchestration platform currently in development. For more information, visit https://myclerk.eu.¶