Standards and conformance#
Anything defined by a published standard is implemented from the authoritative specification itself, and its tests are anchored to that specification's own reference vectors. Bit layouts, field orders, reserved bits, and algorithm constants are where the subtle bugs hide, and a plausible guess is worse than none.
Every row below links two things: the document, and the test in this repository that
holds the code to it. cargo xtask links fetches each document on every run, so a
specification that moves fails the build rather than sitting here looking authoritative.
A handful of publishers refuse scripted clients; those rows say so, and a person opens
them instead.
What a row's second heading claims:
| Anchored to | What the test asserts |
|---|---|
| Published vector | The specification's own test vector or worked example |
| Specification rule | Its constants, bit layout or equation, asserted directly |
| Live implementation | A third-party implementation the test talks to |
| Round trip only | The code against itself, with no external vector to pin against |
62 standards registered, 35 of them pinned to the document's own published vectors. Counted from docs/standards.toml when this page was rendered.
Cryptography#
The primitives under device identity, the secured session, and signed updates.
FIPS 197-upd1#
NIST
AES-128, the block cipher under the LoRaWAN MIC and session keys
Appendix C.1. The cipher itself is the RustCrypto `aes` crate; the vector is asserted through this crate's wrapper.
Read it
Published vector
RFC 4493#
IETF
AES-CMAC, the message integrity code on every LoRaWAN frame
All four worked examples in section 4, including the 40 and 64 byte cases.
Read it
Published vector
FIPS 180-4#
NIST
SHA-256, under MAVLink signing, the audit chain and the dashboard pairing channel
Both Appendix B worked examples, against the hand-written implementation the browser uses.
Read it
Published vector
RFC 2104#
IETF
HMAC, the construction the session key schedule is built on
Pinned through RFC 4231, which publishes the SHA-256 vectors RFC 2104 does not.
Read it
Published vector
RFC 4231#
IETF
The published HMAC-SHA-256 test vectors
Cases 1 and 2 in Rust, cases 1, 2 and 6 in the browser implementation.
Read it
Published vector
RFC 5869#
IETF
HKDF, which derives the session keys from the shared secret
The basic vector in Appendix A.1.
Read it
Published vector
RFC 7748#
IRTF
X25519, the key agreement that opens a secured session
The Alice and Bob example in section 6.1, both public keys and the shared secret.
Read it
Published vector
RFC 8439#
IRTF
ChaCha20-Poly1305, which carries every sealed frame
The worked example in section 2.8.2, sealed and opened.
Read it
Published vector
RFC 9124#
IETF
The information model a firmware manifest must answer
Each named threat is answered by a test named after it. The SUIT CBOR serialization is a deliberate deviation: draft-ietf-suit-manifest is still a draft.
Read it
Specification rule
RFC 9019#
IETF
The firmware update architecture the update layer is built to
Read it
Specification rule
Identity and signing#
What names a device and what proves a message came from it.
RFC 8032#
IRTF
Ed25519, which signs a device identity, a telemetry batch, an audit entry and a release
TEST 2 in section 7.1, asserting the full 64-byte signature.
Read it
Published vector
Encodings#
The wire formats readings and manifests are written in.
RFC 8949#
IETF
CBOR, the encoding a signed update manifest is written in
The Appendix A vectors, plus the shortest-form rule in 4.2.1 and the refusal of indefinite-length items.
Read it
Published vector
Protocol Buffers encoding#
LEB128 varints and zigzag mapping, under the delta codec
The published signed-integer mapping, asserted value by value.
Read it
Published vector
RFC 4648#
IETF
base64, which carries a radio payload through the packet forwarder
All seven vectors in section 10, encoded and decoded, plus the unpadded form.
Read it
Published vector
Field I/O#
The buses and framings that reach a part on the end of a wire.
RFC 1055, STD 47#
IETF
SLIP framing over a serial line
The octal constants and the stuffing rule, asserted as the RFC prints them.
Read it
Specification rule
Cheshire and Baker 1999#
IEEE/ACM Transactions on Networking 7(2)
Consistent Overhead Byte Stuffing
COBS has no published standard; the paper is the authority. All eleven of its example encodings are asserted.
CRC-16/MODBUS#
CRC RevEng
The frame check on every Modbus RTU frame
Check value 0x4B37 over the ASCII digits, plus a real six-byte request frame.
Read it
Published vector
MODBUS Application Protocol Specification V1.1b3#
Modbus Organization
The function codes and their limits, the four data tables, and the exception responses a device answers with
The worked request and reply of each of the eight functions in section 6, the exception example in section 7, and the register-count example given for exception 0x02.
Modbus over Serial Line V1.02#
Modbus Organization
The RTU frame, the silence between frames, unit addresses and broadcasts, and a client's timeouts
The 3.5-character gap and its fixed 1.75 ms above 19200 baud from section 2.5.1.1; a broadcast carried out and not answered, and a frame that fails its CRC left unanswered, from sections 2.2 and 2.6.
ISO 11898-1:2024#
ISO
The CAN data link layer, classical and CAN FD
Edition 3 supersedes the 2015 edition and the 1991 Bosch CAN 2.0 document.
SAE J1939-21#
SAE International
The J1939 data link layer: PGNs, the data page bit, and the PDU1 and PDU2 boundary
Real published PGNs, including EEC1 at 61444 and the request PGN at 59904.
SocketCAN, the Linux kernel's CAN documentation#
The Linux kernel
The raw CAN socket: its frame layouts, its receive filters, and which frames a socket hears
Run in CI against the kernel's own virtual CAN interface: classic, extended, remote, and CAN FD frames, a filter by J1939 parameter group, and no echo of a node's own frames.
Read it
Live implementation
UM10204 Rev. 7.0#
NXP
The I2C bus: addressing, the ten-bit form, and the reserved ranges
The manual's own ten-bit worked example, 0x2A5 framing as 0xF4 0xA5.
Read it
Published vector
CRC-8/MAXIM-DOW#
CRC RevEng
The 1-Wire check byte, on every DS18B20 scratchpad and ROM code
Read it
Published vector
Sensors and actuators#
Parts decoded byte for byte, each from the manufacturer's own datasheet.
Sensirion CRC-8#
Sensirion
The check byte on every SHT3x and SCD4x word
The datasheets' own worked examples, including every CRC in the SCD4x command tables.
Read it
Published vector
Twelve manufacturer datasheets#
Bosch, Analog Devices, Texas Instruments, Sensirion, NXP
BME280, BMP280, DS18B20, HDC1080, INA219, INA226, ADS1115, OPT3001, SCD4x, SHT3x, TMP117 and PCA9685
Each driver asserts its datasheet's own worked compensation example. Every document is linked from the hardware page, part by part.
Read it
Published vector
A4988 Rev. 8 and DRV8825 SLVSA73F#
Allegro MicroSystems, Texas Instruments
Step and direction timing: the direction settled before the step line rises, and the pulse's minimum width
Figure 1 of the A4988 datasheet and the DRV8825's timing requirements: 200 ns and 650 ns of setup before the rising edge, 1 and 1.9 microseconds high. The driver holds each for its pulse width, 10 microseconds unless told otherwise.
Read it
Specification rule
w1_therm sysfs interface#
The Linux kernel
The w1_slave file a Linux board serves for each DS18B20 on its 1-Wire bus
The text is the one w1_slave_show prints in the kernel's drivers/w1/slaves/w1_therm.c, and its millidegrees are the datasheet's temperature rows.
Read it
Specification rule
Radio, mesh and gateways#
Reaching a network that is not there, and the rules a regulator sets for doing it.
TS001-1.0.4#
LoRa Alliance
The LoRaWAN L2 specification: MAC framing and the OTAA join
The join accept field positions in tables 44 and 55.
Read it
Specification rule
RP002-1.0.5#
LoRa Alliance
The regional parameters for nine channel plans
Each test is named after the table it checks: data rates, maximum payloads, the RX1 offset matrix.
Read it
Published vector
TS011-1.0.1#
LoRa Alliance
The LoRaWAN relay: wake-on-radio frames, forwarding and relay commands
Appendix 1's worked synchronization example, with WOR frames checked against Semtech LoRa Basics Modem and the root key against The Things Stack.
Read it
Published vector
TS003-2.0.0#
LoRa Alliance
Application layer clock synchronization, so a device without a clock knows the time
Every command checked against the size the specification gives it, cross-read with Semtech LoRa Basics Modem's own size constants.
Read it
Published vector
TS004-2.0.0#
LoRa Alliance
Fragmented data block transport, which carries an image larger than a frame
ChirpStack's own command bytes, and the parity matrix against an independent rendering. The coded fragments are seeded by the index among the coded fragments, which is what Semtech's Basics Modem and ChirpStack both do; the appendix reads as though the session index were the seed.
Read it
Published vector
TS005-2.0.0#
LoRa Alliance
Remote multicast setup: one address, one key and one window for a group of devices
ChirpStack's own command bytes, with the key chain of section 4.3 checked step by step.
Read it
Published vector
TS006-1.0.0#
LoRa Alliance
Firmware management: what a device runs, what it holds, and the one reboot it keeps
Every command checked against the size the specification gives it, including the version that rides only with an installable image.
Read it
Published vector
ITU-R P.525-5#
ITU-R
Free-space attenuation, under the link budget
Equations 5 and 6, reproduced and checked.
Read it
Specification rule
ITU-R P.526-16#
ITU-R
Propagation by diffraction, under the Fresnel zone clearance
Equations 2 and 3.
Read it
Specification rule
AN1200.22#
Semtech
LoRa modulation: the noise floor and the demodulator SNR per spreading factor
SX1261/SX1262 datasheet, Rev 2.2#
Semtech
The sub-GHz transceiver: its command set, its IRQ map and its calibration sequences
SX1276/77/78/79 datasheet, Rev 7#
Semtech
The earlier sub-GHz transceiver, and the errata its driver works around
PROTOCOL.TXT#
Semtech, Lora-net/packet_forwarder
The UDP packet forwarder protocol, spoken from both the gateway and the server side
The protocol's own printed example datagrams, and every TX_ACK error value.
Read it
Published vector
LoRa Basics Station 2.0.6#
Semtech
The LNS protocol a gateway speaks to a network server
The three ID6 identifier examples the protocol glossary prints.
Read it
Published vector
CRC-16/IBM-3740#
CRC RevEng
The integrity check a mesh frame carries
Check value 0x29B1. Also listed as CRC-16/CCITT-FALSE; the bare name CRC-16/CCITT means a different algorithm, KERMIT, which checks 0x2189.
Read it
Published vector
47 CFR 15.247#
United States, FCC
Conducted power, and the antenna gain allowance above 6 dBi
Read it
Specification rule
ETSI EN 300 220-2 V3.3.1#
ETSI
The European short-range device limits the radio pages quote
Read it
Specification rule
CEPT ERC Recommendation 70-03#
CEPT/ECC
The duty cycle and power limits per European sub-band
Revised often; the link resolves to the current edition rather than a dated one.
ITU-T K.27#
ITU-T
Bonding and earthing inside a building, behind the mast guidance
With IEC 62305-2 for the risk assessment and IEC 62305-3 for the protection system itself.
Read it
Specification rule
Drones#
The protocol a ground station and a flight controller speak.
MAVLink v1 and v2#
MAVLink project
The frame layout, its magic bytes and its extension fields
Read it
Specification rule
CRC-16/MCRF4XX#
CRC RevEng
The frame checksum MAVLink calls X.25 but is not
Check value 0x6F91, with a second test asserting it is not the X-25 value 0x906E.
Read it
Published vector
CRC_EXTRA#
MAVLink project
The per-message byte that makes a dialect mismatch fail loudly
Read it
Published vector
MAVLink common dialect, minimal.xml and common.xml#
MAVLink project
The typed messages with their extension fields, and the named values of every enumeration they use
Every enumeration value as the dialect files define them at that commit, whose names every binding reads back identically.
Read it
Specification rule
MAVLink 2 signing#
MAVLink project
The thirteen-byte signature and its replay window
Read it
Specification rule
Robotics#
Naming, typing and carrying messages the way ROS 2 and Zenoh do.
REP-103#
ROS project
The units and axes a robot's motion is measured in
Every twist, pose, and chassis model uses its body frame: x forward, y left, and a positive yaw turning left.
Read it
Specification rule
ROS 2 topic and service names#
Open Robotics
What a valid name is, and how it maps to a DDS topic
Read it
Specification rule
REP-2011, RIHS01#
ROS 2 project
The type hash that tells two nodes they mean the same message
The published hash for std_msgs/msg/String.
Read it
Published vector
DDS-XTypes 1.3, clause 7.4#
OMG
Extended CDR, the encoding a ROS 2 message travels in
Plain CDR is the CORBA transfer syntax; DDS and ROS 2 use the extended form.
Read it
Round trip only
rmw_zenoh key expressions#
ROS 2 project
The key a ROS 2 topic becomes when Zenoh carries it
Read it
Specification rule
The Key Expressions Language, Zenoh RFC#
Zenoh project
Validity, canonical form, verbatim chunks, and how two expressions intersect or include
Every intersection and inclusion vector from zenoh-keyexpr's own tests, the RFC's canonical-form statements, and a test that asks Zenoh's implementation the same questions.
Read it
Published vector
Messaging#
The protocols a node speaks to a broker or a server.
MQTT Version 5.0#
OASIS
Topic names, the single and multi-level wildcards, and the rule that a wildcard never matches a $-topic
Sections 4.7.1 and 4.7.2. The client itself speaks 3.1.1, whose topic rules are the same.
Read it
Specification rule
MQTT Version 3.1.1#
OASIS
The client: packet framing and size, topic and filter rules, clean sessions, the three delivery guarantees and their acknowledgments, retained messages, the last will, and signing in
The valid and invalid filters of sections 4.7.1.2 and 4.7.1.3, and the remaining-length boundaries of Table 2.4. Acknowledged delivery at each level (4.3), a retained message and its clearing (3.3.1.3), the will a dropped client leaves and the DISCONNECT that discards it (3.1.2.5, 3.14.4), and the password rule of 3.1.2.9 are tested against an in-process broker in crates/pamoja-mqtt/tests/delivery.rs and were checked against Mosquitto 2.1.2.
Read it
Published vector
RFC 7252#
IETF
CoAP: the message types, retransmission, deduplication, Reset, and the response codes
Sections 4.2 to 4.5 and 5.3.1, and table 6. Beside it, a Reset and a 4.04 fail a confirmable send, and a ping is answered with a Reset.
Read it
Specification rule
RFC 7641#
IETF
Observing a CoAP resource: registration, notifications by token, freshness, and cancelling with a Reset
The freshness conditions of section 3.4, including the 24-bit wrap and the 128-second rule.
Read it
Specification rule
Across languages#
A second set of vectors, in
conformance/vectors.json,
does the same job across languages rather than against a specification. It is generated
from the Rust implementation by
cargo run -p pamoja-examples --example conformance_vectors
and asserted by all four binding suites, so a facade that drifts fails instead of quietly
returning something else. CI regenerates the file and fails on any difference.
Each vector pins the exact bytes where a capability has a wire format, and the register values, tables and timings where it does not. The suites are checked by perturbation: each runner mutates a vector it has loaded and asserts that its own comparison rejects it, so a suite that silently stopped comparing fails instead of passing.
Against the real thing#
Where a specification has a live implementation to talk to, CI talks to it.
The MAVLink layer commands ArduPilot and PX4 in SITL. It reads a heartbeat, requests a message, and waits for the autopilot to report its pre-arm checks passing. Then it downloads the vehicle's plan, uploads one of its own and reads it back item for item, and arms and disarms. The arm has to be accepted and then seen in the vehicle's own heartbeat. Nothing is flown.
The ROS 2 bridge exchanges topics, services and actions with
ROS 2 Jazzy in the official image, under the RMW that
image selects. The same job then selects rmw_zenoh and publishes a Twist from a ROS 2
node that a plain pamoja Zenoh peer receives, on the key pamoja-ros2 builds for that topic
and type, and decodes with its own CDR. The LoRa gateway registers a device with a
ChirpStack network server and forwards a join and an uplink
through it.
Every no_std crate is cross-compiled for a Cortex-M4F microcontroller, since a host
no_std build still links the host std.