Astro~/0.4
** Conformance
** Astro * Conformance
** /conformance/bp

Bundle Protocol

PICS proforma: what this package implements, clause by clause.

Conformance Statement for pkg/bp, RFC 9171


A1.1 GENERAL INFORMATION

A1.1.1 Identification of PICS

FieldValue
Date of Statement (DD/MM/YYYY)03/09/2026
PICS Serial NumberASTRO-BP-PICS-002
System Conformance Statement Cross-ReferenceThis document

A1.1.2 Identification of Implementation Under Test (IUT)

FieldValue
Implementation Nameastro/pkg/bp
Implementation VersionSee go.mod / latest commit on main
Special ConfigurationNone
Other InformationGo library implementing Bundle Protocol version 7 block formats: the primary block, canonical blocks, the three extension blocks RFC 9171 defines, fragmentation and reassembly, and bundle status reports. Bundle agent behaviour — routing, storage, forwarding, convergence layers — is out of scope.

A1.1.3 Identification of Supplier

FieldValue
SupplierRavi Suhag
Contact Point for QueriesGitHub, github.com/ravisuhag/astro
Implementation Name(s) and Version(s)astro/pkg/bp (Go package)
System Name(s)Astro

A1.1.4 Identification of Specification

FieldValue
SpecificationRFC 9171 (Bundle Protocol Version 7, Standards Track, January 2022), with the ipn URI scheme per RFC 9758 (May 2025)
Have any exceptions been required?Yes [X] No [ ], see A1.6

A1.2 ENCODING

FeatureReferenceStatusSupport
Bundles conform to CBORclause 4.1M
Core deterministic encoding, indefinite-length items exceptedclause 4.1M
Bundle is a CBOR indefinite-length array closed by a breakclause 4.1M
Non-conformant input accepted and transformedclause 4.1O

A1.3 FUNDAMENTAL DATA STRUCTURES

FeatureReferenceStatusSupport
CRC type codes 0, 1, 2 and no othersclause 4.2.1MY: code 3 and above refused
X-25 CRC-16clause 4.2.1MY: pinned to the published check value 0x906E
CRC-32C, Castagnoliclause 4.2.1MY: stdlib hash/crc32
CRC as a byte string of 2 or 4 octets, network byte orderclause 4.2.2MY
CRC computed with its own field zeroedclauses 4.3.1, 4.3.2MY
Bundle processing control flagsclause 4.2.3MY: all nine version 7 bits
Unrecognised bundle flags ignored, not refusedclause 4.2.3MY
Administrative record must not request status reportsclause 4.2.3MY: validated
Anonymous source must set must-not-fragment and request no reportsclause 4.2.3MY: validated
Block processing control flagsclause 4.2.4MY: all four version 7 bits
Endpoint ID as a two-item arrayclause 4.2.5.1MY
dtn URI scheme, with dtn:none as an integer zeroclause 4.2.5.1.1MY
ipn URI schemeclause 4.2.5.1.2MY: per RFC 9758, see A1.6
DTN time, milliseconds since 2000-01-01, no leap secondsclause 4.2.6MY
Creation timestamp as time plus sequence numberclause 4.2.7MY

A1.4 BLOCK FORMATS

FeatureReferenceStatusSupport
Primary block as an array of 8, 9, 10 or 11 itemsclause 4.3.1MY: a length disagreeing with the flags and CRC type is refused
Version field = 7clause 4.3.1MY: other versions refused on decode
Three endpoint IDs, then timestamp and lifetimeclause 4.3.1MY
Fragment offset and total ADU length, iff the fragment flag is setclause 4.3.1MY
Primary block CRC present unless a BPSec BIB targets itclause 4.3.1MPartial: astro permits CRC type 0, since it cannot see a BIB it does not implement. See A1.6
Canonical block as an array of 5 or 6 itemsclause 4.3.2MY: a length disagreeing with the CRC type is refused
Block type code, number, flags, CRC type, type-specific dataclause 4.3.2MY
Block-type-specific data as a definite-length byte stringclause 4.3.2MY: the indefinite form is refused
Payload block is type 1, number 1, and lastclauses 4.1, 4.3.2MY: validated
Exactly one primary and one payload blockclause 4.1MY: validated
Block numbers unique within a bundleclause 4.1MY: validated
Bundle ends at the break stop codeclause 4.1MY: trailing octets refused

A1.5 EXTENSION BLOCKS AND PROCEDURES

FeatureReferenceStatusSupport
Recognise, parse and act on the three defined extension blocksclause 4.4MY
Unknown block types forwarded intactclause 4.4MY: data and flags round-trip byte for byte
Previous Node block, type 6clause 4.4.1MY: at most one per bundle, validated
Bundle Age block, type 7clause 4.4.2MY: at most one per bundle; required when the creation time is zero
Hop Count block, type 10clause 4.4.3MY: hop limit bounded to 1 through 255
Fragmentationclause 5.8OY
Fragment payloads concatenate to the originalclause 5.8MY
Fragment carries the offset, total length and a fresh CRCclause 5.8MY
Replicate-in-every-fragment blocks copied to all fragmentsclause 5.8MY
Offset-zero fragment carries the remaining extension blocksclause 5.8MY
Must-not-fragment respectedclause 5.8MY
Reassembly by material extentsclause 5.9OY: any order, overlaps tolerated, gaps refused
Administrative record as a two-item arrayclause 6.1MY
Bundle status report, record type 1clause 6.1.1OY
Report array of 4 or 6 elements by subject fragmentationclause 6.1.1MY
Status item of 2 elements only when asserted and times requestedclause 6.1.1MY: a time on an unasserted status is refused
At least four status assertions, extras skippedclause 6.1.1MY
Reason codesclause 6.1.1, table 1MY: the twelve RFC 9171 defines; unknown codes decode rather than fail

A1.6 EXCEPTIONS AND UNSUPPORTED FEATURES

FeatureReferenceSupportRationale
Bundle protocol agent: routing, storage, forwarding, dispatchclause 5N
Convergence layer adaptersclause 7N
Bundle Protocol SecurityRFC 9172, RFC 9173N
Primary block CRC mandatory unless a BIB targets itclause 4.3.1Partial
Accepting non-conformant CBOR and repairing itclause 4.1N
ipn scheme exactly as RFC 9171 prints itclause 4.2.5.1.2Superseded
Bundle Protocol version 6RFC 5050, CCSDS 734.2-B-1N

A1.7 IMPLEMENTATION LIMITS

LimitValueSource
Unsigned integer range0 to 2^64 - 1CBOR argument width, RFC 8949 clause 3
ipn allocator identifier and node numberbelow 2^32 eachRFC 9758 clause 6.3
Hop limit1 to 255RFC 9171 clause 4.4.3
Bundle and block sizebounded by the input sliceNo ceiling is imposed: a decoder reads from a caller-supplied slice, so the caller's own bound applies

Wire test vectors

The octets backing this statement live in the vector corpus — 24 vectors. Each vector names the clause it comes from and carries the derivation that produced it.

File
bp/bundle.json18 vectors
bp/interop.json6 vectors, captured from dtn7-go v0.10.2

Four of them are published octets rather than derived values. RFC 9173 appendix A prints worked example bundles beside their hex, and the primary block, payload block, Bundle Age block and whole-bundle vectors are those bytes. A different working group wrote them, which is corroboration almost nothing else in this corpus has.

These are data files, so any implementation can check itself against the same octets. See CONTRACT.md for how, and how this is verified for what rests on a published vector versus a reading of the clause.