Internet-Draft PQST November 2026
Henry Expires 6 May 2027 [Page]
Workgroup:
Network Working Group
Internet-Draft:
draft-henry-pqst-00
Published:
Intended Status:
Standards Track
Expires:
Author:
C. Henry

Post-Quantum Secure Transport (PQST)

Abstract

PQST (Post-Quantum Secure Transport) is a post-quantum native session-primary datagram transport for secure tunnels without classical public key cryptography, hybrid key exchange, or classical fallback. Its central rule is that the cryptographic session is the persistent object and the network path is a replaceable carrier. A PQST session can outlive the complete loss of every network path and be re-anchored on a new path with fresh post-quantum key material, without the tunnel, its addressing, its authorization, or the peers' authenticated identities changing. PQST runs directly over UDP as one protocol with one state machine. Identities are ML-KEM-1024 keys and authentication is by decapsulation, so no signature is computed online. The same exchange that establishes a session also recovers it, re-proves it, and ratchets it. The per-packet overhead is 44 octets with the epoch and sequence number hidden, identifiers are derived rather than signalled, and every input that has not been authenticated costs a bounded amount and changes no authoritative state. PQST is designed as the substrate for group continuity across intermittent networks; its events are typed so that a layer above it can distinguish a transport event from a security event.

Status of This Memo

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 6 May 2027.

▲

Table of Contents

1. Introduction

1.1. The Problem

Mobile and edge devices change networks constantly: wireless to cellular, address translation rebinding, gateway failover, coverage gaps, and outright disconnection in denied, degraded, intermittent and limited-bandwidth environments. The secure transports in use today accommodate part of this, each by its own mechanism. QUIC keeps a connection across a change of address or port by its connection identifiers, may hold the connection while no validated path exists, and lets both endpoints disable the idle timeout that would otherwise end it (Sections 9 and 10.1 of [RFC9000]); a connection that did end is replaced by a new one, with or without resumption. IKEv2 with MOBIKE moves a security association to new addresses ([RFC4555]); whether an association outlives a period with no path is a liveness decision the implementation makes ([RFC7296]), and an association that was deleted can be resumed from a ticket, as a new IKE SA ([RFC5723]). WireGuard keeps a configured peer, its static key and its allowed addresses, across any change of that peer's address, and replaces short-lived traffic keys underneath that relationship by a handshake it repeats as needed [WireGuard]. These mechanisms accomplish precisely what they were built for.

The problem that PQST engages begins where the live cryptographic and transport state is gone. After a process restart, after a dormancy long enough that keeping the state was not worth its cost, or when another endpoint instance, a second gateway, must take the session up. Existing deployments answer with application-level continuity, session resumption, re-authentication of the peer or reconstruction of the association, each with its own state, cost and semantics, and none of it defined as the transport's own behaviour.

PQST defines the logical session independently of its paths and of its live key state: a continuity record keeps what a fresh post-quantum re-anchor needs, so that the session identifier, the authorization it holds and the bindings above it survive the loss of everything else, and the recovery, persistence, erasure and failure behaviour of that mechanism are specified rather than left to the deployment.

On constrained links the cost of recovery is bytes, round trips, retransmissions and the cryptographic work of restoring authorization, paid at the worst possible moment. PQST is designed to make that cost small relative to rebuilding the equivalent session state. How small is a property of an implementation under a given network and security configuration; it is measured, not asserted (Section 27).

1.2. The Thesis

PQST inverts the layering: identity, then cryptographic session, then current network path. The session is the primary, long-lived object. Paths attach to it, detach from it, and may disappear entirely while the session stays meaningful. Recovery re-establishes a path and fresh key material and keeps the session: while the continuity record is recoverable and authorization permits, a re-anchor creates the next generation of the session's secrets without replacing the session identifier or anything bound to it, and when it cannot, the session is replaced by a new FRESH exchange, as Section 16.10 states. The falsifiable form of the claim is the first sentence of the Abstract, and the protocol is justified only if that sentence holds and the protocol is self-contained and post-quantum from the ground up.

Five consequences follow and organise this document:

  1. Everything above the path is owned by the session (Section 3). A path event, by itself, changes neither the authenticated identity, nor the committed generation, nor authorization or upper-layer bindings; it selects which path the session uses. Losing every path starts a transition of the session's own, RECOVERING and then DORMANT, which discards live keys, identifiers and replay windows as Section 12 and Section 16 require and keeps the continuity state a re-anchor needs; a session with zero paths is a defined state, not an error.

  2. One exchange establishes and recovers (Section 9). Performed from nothing it is the handshake; performed from an existing session it is a re-anchor, which creates the next generation of the session's secrets from the previous one plus a fresh post-quantum secret. Re-anchor is the one mechanism for recovery after path loss, survival across a restart, the post-compromise ratchet, identity re-proof, identifier renewal and lineage renewal. With a prekey exchanged in advance it costs no round trip.

  3. Identity is a KEM key (Section 6 and Section 9). Long-term identities are ML-KEM-1024 keys and a peer proves its identity by decapsulating. No signature is computed online in any exchange; ML-DSA-87 certifies identity keys offline where a deployment needs that.

  4. Nothing unauthenticated changes authoritative state (Sections 11 to 14). The epoch and sequence number travel header-protected inside the routing slot, a receiver performs at most one AEAD operation per packet, replay and epoch state move only after that operation succeeds, and no error is ever signalled to an unauthenticated sender. What an unauthenticated datagram may cause before that is bounded and named: reassembly state within fixed limits, one cached key derivation, and three answers that repeat or commit nothing.

  5. Nothing is signalled that can be derived (Section 8, Section 15 and Section 19). Packet identifiers, recovery identifiers and epoch keys are derived by both endpoints; what must be delivered is a small set of versioned state objects with one reliability rule.

1.3. What PQST Is and Is Not

PQST carries datagrams, typically IP packets, between two authenticated endpoints over UDP, with confidentiality, integrity, replay protection, and forward secrecy and post-compromise security at the granularity of its re-anchors, against adversaries with quantum computers: a generation's epochs share one lineage secret, and session-scoped exporter material lasts the session (Section 23.1). It is a self-contained secure datagram encapsulation and session-management protocol: handshake, data plane, key management, path management, recovery and authorization are one protocol with one state machine (Section 18). It provides neither reliable delivery nor congestion control: the traffic it carries brings its own, and the UDP guidelines of [RFC8085] apply to the application and the deployment. It assumes nothing from below but datagram delivery, and nothing from the deployment but that each endpoint holds its own identity key and knows the identity key of the peers it talks to, which is the deployment model of WireGuard. It needs no public key infrastructure, no load balancer that understands it, no ticket store, and no synchronised clock beyond the loose agreement a gateway group's sealed records need (Section 16.6.3).

PQST is not a traffic-analysis countermeasure beyond hiding header contents and permitting padding and dummy packets. It is not a group protocol: it is the pairwise substrate on which one can be built, and it reserves what such a layer needs (Section 3.9 and Section 26); the cohort layer built on it is specified in a companion Experimental document [PQST-COHORT]. Unlike MLS and IPsec, a removal from a cohort closes that member's sessions with the sequencer and not its pairwise sessions with other members, and a re-anchor, a restart or a path change of a session advances no membership epoch.

1.4. Relationship to Existing Work

Many of PQST's components are, deliberately, not new; its contribution is a transport in which the same KEM identity establishes, recovers and re-proves a session that the network path cannot end.

  • The handshake is the KEM instantiation of the Noise IK pattern [Noise], as in PQ-WireGuard [PQWireGuard] and Rosenpass [Rosenpass], and shares its properties with KEMTLS [KEMTLS] and the AuthKEM proposal for TLS 1.3 [AuthKEM]. PQST differs in using the pattern for recovery as well as establishment, and in carrying an identity re-proof inside recovery.

  • Header protection by an AES mask over a ciphertext sample is QUIC's ([RFC9001]). PQST protects the full epoch and sequence number rather than a truncated packet number and a key-phase bit, and needs no packet-number reconstruction.

  • Zero-round-trip recovery with single-use prekeys descends from X3DH [X3DH] and PQXDH [PQXDH]. PQST exchanges the prekeys inside the session and uses them for transport recovery, which makes the recovery forward-secret and, toward a stateful receiver, not replayable by anyone else, two properties TLS early data lacks; what became of early data whose attempt a gateway group answered with a RETRY is unknown to its sender, and an application that sends it again accepts that it may arrive twice (Section 16.3.2 and Section 23).

  • Identity and locator separation recalls HIP ([RFC7401]), and QUIC preserves a connection's identity across address changes by its connection identifiers ([RFC9000]). PQST builds on the same separation and adds what neither specifies: a durable continuity record and a cryptographic re-anchor that recover a logical session after its live state has been discarded, with authorization and exporter values owned by that session. The closest prior art for the record is IKEv2 session resumption ([RFC5723]), a ticket from which a deleted association is resumed as a new IKE SA (Section 1.1), where PQST's record restores the same session, its identifier, grants and exporter values with it. These are protocol mechanisms; an application or session layer above another transport could implement their like, at its own cost in state and coordination.

  • Post-quantum key agreement is standardized for TLS 1.3 ([RFC10024]) and for IKEv2 ([RFC9370]). PQST is not distinguished by using a post-quantum KEM but by using KEM identities and fresh post-quantum contributions throughout establishment, continuity, re-proof and recovery, with no signature online; the relative cost depends on the authentication profile and on the recovery operation compared.

  • MASQUE proxies UDP and IP through HTTP/3 and QUIC ([RFC9298], [RFC9484]), and a session layer above it could keep its own identity, authorization and continuity state across connections. It is the architectural alternative to a new transport: mature HTTP infrastructure, proxy traversal and congestion control on one side; a compact purpose-built protocol, direct control of cryptographic recovery, fewer layers to coordinate and a state model built for severe intermittency on the other. Nothing here makes either impossible; the question is which is simpler, cheaper and more predictable for the environments of Section 1.1, and PQST can itself be carried through such a proxy where direct connectivity is absent.

  • Group continuity above PQST relates to MLS ([RFC9420]), GDOI and sender-key designs; PQST contributes the transport-aware part they lack and is positioned against them in the companion document [PQST-COHORT].

The comparison, scenario by scenario, as the mechanisms stand:

  • address or port change while live. QUIC: supported; WireGuard: roaming supported; IKEv2 with MOBIKE: supported; PQST: supported

  • a period with no path. QUIC: the connection may be retained; WireGuard: the peer persists; traffic keys expire; IKEv2 with MOBIKE: the association may be retained, by liveness policy; PQST: RECOVERING, then DORMANT, both specified

  • process restart. QUIC: not resumed as the same connection; WireGuard: the peer persists; a new handshake; IKEv2 with MOBIKE: the association re-established, or resumed from a ticket; PQST: re-anchored from the continuity record

  • the same cryptographic session identity after a restart. QUIC: not a base guarantee; WireGuard: not its abstraction; IKEv2 with MOBIKE: not a general guarantee; PQST: a design objective, within the limits of Section 16.10

  • post-quantum key establishment. QUIC: through TLS ([RFC10024]); WireGuard: not in the baseline; IKEv2 with MOBIKE: [RFC9370]; PQST: native ML-KEM

  • authorization carried by the transport. QUIC: the application's; WireGuard: the peer configuration; IKEv2 with MOBIKE: IPsec policy; PQST: session-owned grants

Where another row reads "supported" or "may be retained", the other protocol has it and PQST claims no novelty; the rows that distinguish PQST are the ones its remaining sections specify and Section 27 measures.

1.5. Applicability

These statements bound what this document claims.

  • PQST starts every path at a 1,200-octet datagram MTU and searches only upward from it (Section 15.5). A path with a smaller datagram budget is served by configuring a lower start, not below 576 octets, for the endpoints that use it; PQST does not discover such a budget by itself, and a deployment on such paths tests one.

  • PQST gathers no candidate addresses and traverses no NAT. An address learned elsewhere, from the host, from discovery or from another session, is a hint; validation is still the probe of Section 15, and a peer behind an address translator that no probe reaches is not reached.

  • Authorization of a session's own traffic is this document's: the grants of Section 17, which Section 5.2 requires. Membership is not: it belongs to the deployment and to the companion document [PQST-COHORT], which specifies the properties of the authority a cohort needs and does not include one.

  • No UDP port is assigned or requested (Section 25). A deployment configures the port its endpoints listen on as it provisions their identities and addresses; two endpoints that have not agreed one cannot reach each other.

  • The continuity claim holds while the continuity record is recoverable and the recovery of Section 16 completes as a re-anchor. When a recovery FRESH wins the race of Section 16.10, as it often does on a very slow, lossy link, the session comes back as a new session with the same peer: the layer above sees the old session closed with SUPERSEDED and the new one established, rather than a transition of one session.

  • A conforming endpoint keeps its continuity record in storage that is durable, replaced atomically and protected as Section 16.6.2 requires, and writes it before the transmissions that depend on it (Section 16.4). That is an applicability boundary, stated in terms of those guarantees and not of a file system: an endpoint whose storage gives none of them, or gives durability without atomic replacement or protection, as some browser and constrained environments do, is outside this document except as a responder serving from sealed records (Section 16.6.3), whose state its peers carry for it.

1.6. Structure of This Document

Sections 2 to 5 define terms, the architecture, the threat model and conformance. Sections 6 to 8 define algorithms, encoding and the key schedule. Section 9 defines the anchor exchange. Sections 10 to 14 define the data plane: packet format, receiver processing, nonces, replay protection and epochs. Sections 15 to 17 define paths, dormancy and re-anchor, and authorization. Section 18 is the state machine; Section 19 the control frames and state objects; Section 20 error handling. Sections 21 to 25 cover extensibility, invariants, security, privacy and registries, and Section 26 points to the cohort layer of the companion document. The appendices give the identity binding statement, replay-window pseudocode, an informative signature-based profile, and test vectors.

2. 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. They appear only in the body of this document, never in an appendix.

2.1. Roles

Endpoint. A participant in a PQST session.

Grantor, grantee, issuer, holder. The endpoint that issues a grant or a state object, and the endpoint that receives it.

Initiator, responder. The session roles, fixed for the session's life: the initiator is the endpoint that sent the FRESH request that created the session. They name the traffic directions i2r (initiator to responder) and r2i. After establishment the roles are symmetric: either endpoint may advance an epoch, open a path, re-anchor, issue objects and close.

Requester, responder of an exchange. The roles within one anchor exchange. In the FRESH and DISCOVER forms the requester becomes the session's initiator; in the CONTINUE forms either session role may be the requester.

2.2. Objects

Continuity record. What an endpoint retains while DORMANT or across a restart.

Continuity secret. The session's root secret for a generation, from which everything of that generation is derived and which is the salt of the next.

Epoch. One set of traffic keys within a lineage, identified by epoch_id = lineage_gen || epoch_index. In this document, bare "epoch" always means the PQST epoch.

Fleet secret. An optional pre-shared secret among endpoints of one deployment, used for pre-authentication and as a hedge in the key schedule.

Generation. One continuity secret cs(g), numbered from 0. Each anchor exchange creates a generation.

Grant. The AUTHZ state object by which one endpoint authorizes the other's traffic, with its own lifetime.

Identifier (RID). The eight-octet routing key of a protected packet, derived by both endpoints from the lineage secret and prefixed by the receiver.

Identity. A long-term key pair of the suite's KEM (ML-KEM-1024 in suite 0x0001, Section 6) that authenticates an endpoint. Its fingerprint is the SHA-384 hash of the encapsulation key.

Lineage. The epochs under one generation. lineage_gen in the epoch identifier is the generation number.

Path. A pair of addresses currently carrying a session's packets; CANDIDATE until validated, VALIDATED after, LOST when liveness fails.

Path set. The paths a session holds; empty when DORMANT.

Prefix. The zero-to-two-octet value a receiver places at the front of identifiers it receives on.

Prekey. A single-use encapsulation key of the suite's KEM one endpoint issues to the other so that a later re-anchor needs no round trip.

Recovery identifier. The routing key of a re-anchor request, derived from the continuity secret.

Sealed record. A copy of a responder's record, sealed under its own key and held by the peer.

Session. The persistent cryptographic association between two identities. It owns generations, epochs, replay state, grants, exporter values and inner addressing, and it holds zero or more paths. It is named internally by its session identifier, an exporter value that never appears on the wire.

State object. A versioned value one endpoint owns and the other holds a copy of, delivered by OBJECT frames.

Tombstone. What a closed session leaves behind to answer a late re-anchor request.

2.3. Exchanges and States

Anchor exchange. The two-message exchange of Section 9 that creates a generation.

Commit. The point at which a new generation becomes the session's current one and the previous generation's secret is erased.

DISCOVER. The optional preliminary exchange that delivers a responder's identity key.

DORMANT. The session state with no usable path and no recovery attempt under way, in which only the continuity record is retained.

ESTABLISHED. A committed generation and at least one usable path.

Epoch advance. Moving to the next epoch within a lineage by key chaining, signalled only by the epoch field of the next packet.

Event class. Transport-class events change nothing above the session; security-class events may require a layer above to act (Section 3.7).

Handshake. The anchor exchange in its FRESH form, which creates a session.

Re-anchor. The anchor exchange in a CONTINUE form, which creates the next generation of an existing session.

RECOVERING. The session state with no usable path and recovery attempts under way, in which all state is retained.

2.4. The Persistence Hierarchy

Five levels, each outliving the next: identity, cohort membership, session, generation and epoch, path. The persistence rule is that an event at a shorter-lived level never invalidates state at a longer-lived level (Section 3.2). Cohort, cohort epoch and member are reserved terms for the group layer defined outside this document; a cohort epoch is never a PQST epoch.

2.5. Notation

|| is concatenation. XOR is bitwise exclusive-or. H() is SHA-384. Extract and Expand are HKDF's functions with HMAC-SHA-384. label(X) is the octet string "PQST " followed by X. Encap(pk) returns (ct, ss); Decap(ct) returns ss. x(n) in a field list means a field of n octets; NOCTET in a structure definition means N octets; *OCTET means a variable number. Integers are big-endian and fixed-width. Bit 0 of an octet is its least significant bit. [x] marks a field present only when stated.

Identifiers in code and on the wire carry their layer: session_id, lineage_gen, epoch_id, path_id, rid, cohort_id, cohort_epoch. "Connection", "tunnel" (except for the inner IP tunnel), "client" and "server" are not used in normative text.

3. Architecture

3.1. The Inversion

path-bound (incumbents)      session-primary (PQST)

  PATH                         IDENTITY
   +- CONNECTION                  +- SESSION
        +- SECURITY                    +- generations and epochs
                                       +- replay state
                                       +- grants
                                       +- exporter values
                                       +- inner addressing
                                       +- PATH SET {P1, ..., Pn}
                                          (n = 0 is DORMANT)

A session is created by an anchor exchange between two identities and ended only by a close. Paths are carriers; a session may hold any number, change any of them, or hold none. All state that PQST exposes to higher layers belongs to the session rather than to any particular path, and the session is reachable through whichever paths are available.

3.2. The Persistence Hierarchy and the Persistence Rule

Table 1
Level Created by Ended by Typical lifetime
identity provisioning revocation years
cohort membership outside this document outside this document a deployment
session the FRESH exchange close (Section 20) days to months
generation and its epochs each anchor exchange; each advance the next exchange; the next advance an hour; seconds to minutes
path validation loss, abandonment seconds to hours

The persistence rule. An event that originates at a shorter-lived level MUST NOT invalidate state at any longer-lived level. Invalidation cascades downward only.

  • Losing a path does not end an epoch, a generation or the session; a re-anchor does not touch the session's identity, grants or exporter values; a session's end does not end cohort membership; none of these change an identity.

  • Revoking an identity ends its memberships, sessions, generations and paths; closing a session erases its generations and releases its paths; retiring a generation discards its epochs.

  • Each level's own state changes only through that level's events or a cascade from above. That is the testable form, and Section 22 lists it as an invariant.

Durable state above the session is keyed on the peer's identity, not on the session: a session may be superseded by another with the same peer (Section 9.6 and Section 16.7), and a layer above correlates through the fingerprint that every Established event carries.

3.3. The Object Model

Table 2
Object Lifetime Owns Changed only by
identity long-term the ML-KEM-1024 key pair; the fingerprint; optional offline certification provisioning, revocation
session until close session identifier, session_root, the current continuity secret and generation, grants issued and held, state objects, inner addressing, the path set, the continuity record anchor exchanges (generations), objects (grants, prekeys, addresses), close
generation until the next commit plus grace cs(g), lineage_secret(g), header-protection keys, identifiers, recovery identifiers the next anchor exchange
epoch until the next advance plus overlap traffic keys and IVs per direction, one replay window per direction epoch advance
grant its own lifetime ttl, ref the grantor's new version, revocation
path until loss or abandonment addresses, identifier index, validation state, liveness, round-trip estimate, MTU validation, rebind, loss

3.4. The Ownership Rule

Everything above the path is owned by the session. No path event can, by itself, create, modify or destroy session-owned state; a path event can only select which path the session uses, and change the path set, including the previously validated addresses the record carries. The transitions that prolonged path loss causes, RECOVERING and DORMANT (Section 16.7), are the session's own: they discard live generation state as Section 12 and Section 16 require and keep the continuity and authorization state a re-anchor needs. Session-owned state changes only through cryptographic events (epoch advance, anchor exchange), policy events (grant versions, revocation, close) and the objects an endpoint issues. Replay windows and keys belong to the session and are shared by all paths; a path change never creates, resets or modifies a window. The budget toward an unvalidated address is the endpoint's, per remote address, shared by every session and path toward it (Section 15.4).

3.5. Lifecycle

A session is HALF_OPEN while its first exchange is in progress, ESTABLISHED while it has a committed generation and at least one usable path, RECOVERING while it has no usable path and is attempting to re-anchor with all its state retained, DORMANT while it has no usable path and retains only its continuity record, and CLOSED when ended. Section 18 is the authoritative transition table. DORMANT is the concrete form of "the path can disappear": other transports can hold a connection while no path exists (Section 1.1); what PQST specifies is exactly what is retained in that state, the continuity record and nothing else, and how the session returns from it.

3.6. Operations and What They Touch

  • epoch advance (Section 14). Epoch and replay: new epoch, new window, same lineage

  • opening a path, migration (Section 15). Paths: new path, new identifier index

  • NAT rebind. Paths: address updated after validation, same identifier

  • entering DORMANT. Generation: retained in the record; Epoch and replay: discarded; Grants: retained; Paths: none

  • re-anchor (Section 16). Identity: re-proved if the policy asks; Session: same session; Generation: new generation; previous erased on commit; Epoch and replay: new lineage; Grants: unchanged, never extended; Paths: kept if the address is unchanged

  • restart. Session: restored from the record; Generation: new generation by re-anchor; Epoch and replay: never resumed; Grants: held grant treated as expired until refreshed; Paths: new

  • scheduled re-anchor (Section 16.8). Generation: new generation; post-compromise ratchet; Epoch and replay: new lineage; Paths: kept

  • grant version, revocation (Section 17). Grants: changed

  • close (Section 20). Session: ended; Generation: erased; Epoch and replay: erased; Grants: ended; Paths: released

3.7. Events and Their Classes

An endpoint reports the events of Section 18.5 to the layer above it; that table, rendered from the state table, is the inventory of the events and their classes, and this section summarises it. The classes are normative:

  • Transport-class events (Established, PathAdded, PathChanged, PathLost, EpochAdvanced, ReAnchored, Recovering, Dormant{announced}, and the local reports EarlyDataUncertain{reason}, ReanchorFailed, OpenFailed, Discovered and DiscoverFailed) change no state above the session: none of them, by itself, touches the session's authenticated identity, its grants, its exporter values or the bindings a layer above keeps. A layer above MAY use them for connectivity, recovery and delivery-status decisions, as EarlyDataUncertain{reason} (Section 16.3.2) informs the retry of an operation that must not run twice; it MUST NOT read one as a security-class event, and MUST NOT read one as proof that data was not delivered unless the event's own definition says so.

  • Security-class events (Closed{reason}, AuthzExpired, AuthzRevoked, ReproofFailed, and GrantHeld and CertReceived, which report new authorization or identity evidence held) are the only events after which a layer above may need to act on its own state.

  • Data events (Delivered{stream_id}, ObjectHeld{kind}, InnerAddr) deliver application data, held objects and inner addresses after authentication, replay commit and the grant check.

No transport event closes a session; there is no transport class of close reason (Section 20.2). This split is what enables a group layer to mechanically apply its own continuity rule. A member's transport events never reach the group, only its security events do.

3.8. Symmetry, Multiplexing and Capacity

After establishment the protocol is symmetric: every mechanism is written for either endpoint, and the only asymmetries are the names of the directions and two tie-break rules: by fingerprint before a session exists (Section 9.6.1) and by handshake role within one (Section 16.4). Any number of sessions, in either role, share one UDP port; the routing key is the only demultiplexer, and an endpoint that is responder in one session may be initiator in another on the same port. Per-session state is bounded by the inventory of Section 16.6 while DORMANT and by that plus per-generation, per-epoch and per-path state while active; the per-endpoint state that grows with the number of peers is the session table and, per peer identity, the freshness high-water mark and the half-open count of Section 9.4; what grows with the number of addresses heard from is bounded apart from the peers, the reflection budget table of Section 15.4 and the reassembly pools of Section 9.4, each with the bound its section states.

3.9. Composition Upward

PQST is written so that a group layer can be built on it without a wire change: reserved stream identifiers, frame types, object kinds, capability bits, close reasons and exporter labels (Section 25); an exporter at session and lineage scope (Section 8.6); events keyed on identity; symmetric roles; paths through forwarding members (Section 10.1.2); and a reserved packet type for a group-keyed packet, which an extension may define (Section 21.1). Section 26 lists the reservations, and the companion document [PQST-COHORT] specifies the cohort layer. The group layer, its membership state, its ordering of changes and its keys are outside this document. The only statement this document makes about it is the one its design enforces: a member's transport events never need to reach the group.

3.10. Design Principles

Table 3
# Principle Where it shows
P1 session primacy ownership and persistence rules; DORMANT; re-anchor keeps the session
P2 self-contained one protocol, one state machine, directly over UDP; no PKI, balancer, synchronised clock or ticket store
P3 post-quantum from the ground up ML-KEM-1024 identities and key establishment; ML-DSA-87 offline only; no classical fallback
P4 datagram-native one AEAD attempt per packet; two-phase replay check; fragmentation with parity; no acknowledgements except for objects
P5 minimal metadata masked epoch and sequence; derived unlinkable identifiers; no cleartext rekey or recovery signal beyond flight shape
P6 nothing unauthenticated changes authoritative state the state-mutation rule, with its bounded pre-authentication work named; no unauthenticated error; reflection bounded by the budget of Section 15.4
P7 derive rather than signal identifiers, recovery identifiers, epoch keys and versions are computed; what must be sent is a state object
P8 composable upward typed events, identity-keyed state, reserved codepoints, exporter

4. Threat Model

4.1. System Model

Two endpoints hold ML-KEM-1024 identity keys and each knows the other's, either by provisioning, pinning or the optional DISCOVER exchange followed by certification. They communicate over a network that provides datagram delivery and nothing else. Either may be mobile; either may be behind address translation; either may lose connectivity for hours and may restart. A responder may be one of a group of gateways sharing an identity (Section 16.9).

4.2. Adversaries

Network adversary. Observes, drops, delays, reorders, duplicates, injects and modifies any packet; spoofs addresses; manipulates routing and address translation; induces path changes. This is the full Dolev-Yao attacker and PQST assumes it everywhere.

Quantum-capable cryptographic adversary. Has a cryptographically relevant quantum computer and large classical resources. PQST assumes ML-KEM-1024 is IND-CCA2 secure, AES-256-GCM is a secure AEAD within the limits of Section 12.4, HKDF-SHA-384 is a pseudorandom function, and ML-DSA-87 is EUF-CMA secure where it is used offline, all against such an adversary.

Malicious authenticated peer. Holds a valid identity and a live session, and uses it against the other endpoint or third parties: claims addresses it does not hold to make the endpoint send there; re-anchors, migrates and probes at a rate meant to exhaust resources; replays its own traffic; sends ill-formed frames and objects; announces false suspension. PQST treats the authenticated peer as untrusted beyond its identity.

Holder of a storage image. Has a copy of an endpoint's persistent storage, including its continuity records, but not its hardware keystore.

Holder of a continuity secret. Has the current cs(g) of a session, by memory compromise, without the identity key.

Compromised gateway in a group. Holds the group's replicated identity key and sealing key.

Denial-of-service adversary. Sends at line rate: garbage, replayed handshakes, fragments, probes.

4.3. Security Goals

Table 4
Goal Mechanism Section
Mutual authentication without online signatures decapsulation of ct_peer and ct_req; key confirmation 9.3.9
Confidentiality and integrity of application data AES-256-GCM under per-epoch, per-direction keys 10, 12
Forward secrecy ephemeral and single-use prekey decapsulation keys, erased after use (Section 9.8); erasure of an epoch secret hides that epoch from a thief who obtains only a later epoch secret, and not from one who obtains lineage_secret (Section 14.3) 9.8, 14.3
Post-compromise security the continuity-secret ratchet with a fresh KEM secret at every re-anchor heals a passive theft of cs(g); the identity re-proof deadline bounds an active holder 16.3.3, 16.8, 23.1
Replay protection per-epoch windows with the two-phase check; freshness counter; single-use recovery identifiers and prekeys 13, 9.3.5, 16.5
Amplification control a response no larger than its request; toward an address not validated, a byte and packet budget beyond a probe floor of k_probe probes per address and interval, kept across the budget table's forgetting; the previously validated addresses exempt for validated_ttl; no unauthenticated response 9.5, 15.3, 15.4, 20.1
Identity hiding requester identity sealed under the responder's key; responder identity never sent except in DISCOVER 9.8
Unlinkability of a migration or re-anchor by header contents, within the limits of Section 24.3 derived identifiers, masked epoch and sequence 15.1, 24.3
Session continuity across the loss of every path and across a restart, while the continuity state remains available and valid; otherwise supersession by a new FRESH session DORMANT, the continuity record, re-anchor; supersession 16, 16.7, 16.10
Authority bounded by its grant grants with lifetimes; no delivery past expiry plus delta; re-anchor never extends 17
Bounded cost of unauthenticated input one block cipher and one AEAD per packet; one decapsulation per replayed handshake; no authoritative state before authentication, and bounded reassembly state and one cached derivation before it 11.6, 11.7
Nothing unauthenticated changes authoritative state the state-mutation rule, with its bounded pre-authentication work named 11.7

4.4. What Each Adversary Can and Cannot Do

  • Network adversary: can deny service, observe the metadata of Section 24, and retransmit or reroute any packet; cannot read or forge traffic, cannot have a replayed packet delivered as fresh data (Section 13) or move a session to an address no probe has validated (Section 15), cannot end a session by any packet, cannot make an endpoint send to any address more than the reflection budget of Section 15.4 allows, what it received from that address beyond a floor of k_probe x 56 octets, and cannot learn the initiator's identity key or fingerprint from the handshake without the responder's identity secret (Section 9.8); it sees which network address initiated, and the protocol claims no anonymity against traffic analysis (Section 4.5).

  • Malicious authenticated peer: can make the endpoint send toward a claimed address at most the reflection budget of Section 15.4, what it sent from that address beyond the probe floor; can cause at most the work the budgets of Section 9.4, Section 15.4 and Section 19.2 allow before it is rate-limited and closed (Section 20.3); cannot replay its own traffic past the window; cannot affect any other session; cannot exhaust identifiers; learns nothing of the endpoint's other peers from this protocol's messages or from the session state it is shown, timing and traffic analysis being outside scope (Section 4.5).

  • Holder of a storage image: cannot recover any session or re-anchor as the endpoint if the identity key is in hardware (Section 16.6.2); otherwise holds the identity and is the endpoint.

  • Holder of cs(g): can re-anchor as the endpoint until the re-proof deadline of Section 16.3.3 or the grant's expiry, and the ratchet heals the leak once the legitimate endpoint re-anchors first (Section 16.10). Cannot produce a transferable proof of anything.

  • Compromised gateway: holds the group identity; this is the stated containment cost of session portability across a group (Section 16.9).

  • Denial-of-service adversary: can prevent new sessions from being established at a saturated responder and can consume the receiver's per-packet budget; cannot modify established sessions, because recovery is authenticated symmetrically before any public key operation and reassembled in a pool of its own (Section 9.4); how fast their recovery proceeds under a flood is a capacity property of an implementation (Section 23).

4.5. Out of Scope

Compromise of an endpoint's memory beyond the bounds stated above; side channels below the protocol (power, electromagnetic, microarchitectural), beyond the constant-time requirements of Section 11.8; traffic analysis of packet sizes, timing and volumes beyond what padding and dummy packets allow a deployment to blunt; attacks on routing and name resolution; bandwidth exhaustion of a link; the correctness of the group layer above; the security of the provisioning channel that delivers identity keys and fleet secrets.

4.6. Summary

Table 5
Threat Covered
passive and active network attacker, quantum-capable yes
replay of packets, handshakes, recoveries yes
reflection and amplification bounded: the budget of Section 15.4, the probe floor included (Section 23.1)
malicious authenticated peer yes, within stated budgets
storage image theft yes, with a hardware identity key
continuity-secret theft bounded and stated
gateway compromise in a group stated containment cost
denial of service against new sessions partial; established sessions unmodified, their recovery's speed under a flood an implementation's capacity (Section 23)
endpoint memory compromise, side channels, traffic analysis, routing out of scope

5. Protocol Overview and Conformance

5.1. A Session's Life in One Page

  1. Establishment. The initiator, holding the responder's identity key, sends a FRESH request: a fresh ephemeral ML-KEM-1024 key, an encapsulation to the responder's identity key, and, sealed under the resulting secret, its own identity, a freshness counter, its capabilities and its receive prefix. The responder decapsulates, checks the counter, encapsulates to the ephemeral key and to the initiator's identity key, derives generation 0, and answers with both ciphertexts and a sealed part carrying its capabilities, prefix and grant. The initiator derives generation 0 and sends its first protected packet, which authenticates it. One round trip to initiator data; about 3.3 KB each way; no signature (Section 9).

  2. Data. Each protected packet carries a derived identifier as routing key, a header-protected block with the epoch and a 64-bit sequence number, and an AEAD-protected payload; 44 octets of overhead. The receiver looks up the identifier, unmasks, filters, performs one AEAD operation, and only then commits replay and epoch state (Sections 10 to 13).

  3. Epochs. Either endpoint advances to the next epoch by naming it in a packet; the keys are chained; a successful AEAD under the next keys is the authentication of the advance. Nothing is negotiated and nothing is signalled (Section 14).

  4. Paths. A packet from a new address on a new identifier index is a new path; the endpoint validates it with a probe, sending no more than it received until then. A session may hold several validated paths and send on any of them (Section 15).

  5. Objects. Grants, prekeys, sealed records and inner addresses are versioned state objects, delivered by OBJECT frames and acknowledged by version (Section 19).

  6. Dormancy. When every path is lost the session is RECOVERING with its state retained, and then DORMANT with only its continuity record. It is not closed; it is closed only by policy or by its peer (Section 16.7).

  7. Re-anchor. The session's next generation is created by a CONTINUE request on the recovery identifier, authenticated under the current continuity secret, with a fresh KEM secret; with a prekey it carries data at zero round trips. The same exchange runs on a schedule as the post-compromise ratchet, after a restart, and whenever an identity proof is wanted (Section 9 and Section 16).

  8. Close. A CLOSE frame with a classed reason; a tombstone answers late re-anchors (Section 19.6 and Section 20).

5.2. Conformance: PQST CORE

An implementation conforms to PQST CORE if it implements, as this document specifies:

  • the suite of Section 6 and the key schedule of Section 8;

  • the anchor exchange in its FRESH, CONTINUE and CONTINUE_0RTT forms, including RETRY, the freshness counter, the identifier window, fragmentation with parity recovery, and the reflection bound (Section 9 and Section 10.4);

  • the packet format, receiver pipeline, nonce rules, replay protection and epoch advance of Sections 10 to 14, including the one-AEAD rule and the state-mutation rule;

  • paths with validation, the byte-counted budget, active liveness, and the ability to hold and receive on several validated paths (Section 15);

  • dormancy, recovery, the continuity record with its at-rest protection, write-ahead and commit rules, and the scheduled re-anchor (Section 16);

  • grants in both directions (Section 17);

  • the state machine of Section 18 with its event classes;

  • the six frames and the NEXT_EK, AUTHZ and RECORD object kinds as holder, NEXT_EK and AUTHZ as issuer (Section 19);

  • the close reasons and error principles of Section 20;

  • the exporter (Section 8.6).

A conforming implementation MAY omit sending parity fragments, initiating MTU probing, issuing sealed records, and opening more than one path; it MUST handle each when the peer does it.

5.3. Optional Features

Table 6
Feature Signalled by Section
DISCOVER (first contact with an unknown responder key) configuration; a responder that does not implement it drops the form 9.7
fleet secret: pre-authentication tag and key-schedule hedge configuration on both sides 9.3.4
inner address assignment (INNER_ADDR) capability bit 1 19.4.4
sealed records and stateless service of re-anchors capability bit 2 (issuer); configuration (server) 16.6.3
certificate delivery after establishment (CERT) configuration; the holder either verifies or does not rely on unknown identities 9.7.3, 19.4.5
passive liveness local policy 15.6
redundant transmission and path scheduling local policy 15.7
prekey regeneration from a local secret local implementation 16.3.2

There is no second conformance tier. A feature is either part of CORE or optional and discoverable through capabilities or configuration; an implementation that does not implement an optional feature behaves as this document specifies for an absent capability.

5.4. Dependencies

A conforming endpoint needs UDP sockets, AES-256-GCM, AES-256 block encryption, HMAC-SHA-384, ML-KEM-1024 (key generation, encapsulation, decapsulation, and seeded key generation if it regenerates prekeys), a cryptographically secure random source, a monotonic clock, and persistent storage for the continuity record and the freshness state. It does not need ML-DSA-87 online, ASN.1 or X.509 parsing unless it verifies certificates, TLS, HTTP, a synchronised clock, a load balancer that understands the protocol, a ticket store, or negotiated parameters of any kind.

6. Cryptographic Algorithms

6.1. The Suite

PQST version 0x14 defines one suite, identifier 0x0001, aligned with CNSA 2.0:

Table 7
Function Algorithm Reference Use
key encapsulation ML-KEM-1024 [FIPS203] identity keys, ephemeral keys, prekeys, record wrapping
authenticated encryption AES-256-GCM, 16-octet tag, 12-octet nonce [SP800-38D] traffic, sealed parts, sealed records, records at rest
header protection AES-256 block encryption of a 16-octet sample [FIPS197] the mask of Section 10.3
key derivation and hashing HKDF with HMAC-SHA-384; SHA-384 [RFC5869], [FIPS180], [FIPS198] the key schedule, transcripts, fingerprints, pre-authentication
offline certification ML-DSA-87 [FIPS204] the binding statement of Appendix A; X.509 certificates with ML-KEM keys

Every function is at NIST security category 5 or the symmetric equivalent. The suite is implied by the identity key the requester encapsulates to and is bound into every transcript (Section 8.3); a future suite is a new identity key type and a new registry entry (Section 21).

Suite parameters. The wire formats are written with two lengths of the suite's key encapsulation mechanism: L_ek, the octets of an encapsulation key (identity keys, ephemeral keys and prekeys alike), and L_ct, the octets of a ciphertext. For suite 0x0001, ML-KEM-1024, both are 1568, and the figures and examples of this document use those values. Every other length, the AEAD, the hash and the key schedule are the same in every suite of this version; only L_ek, L_ct and the lengths derived from them change, which are DISCOVER's pad (L_ek + 16, Section 9.2.1), the bound of NEXT_EK (Section 19.4) and the key field of the binding statement (Appendix A). A suite whose KEM has other lengths, ML-KEM-768 (L_ek 1184, L_ct 1088, NIST security category 3) for deployments on constrained links being the expected one, is defined by its own document with its identifier, its values and its test vectors; it needs no change to this one, since the suite is implied by the identity key and bound into every transcript (Section 21.2). Every implementation of this version MUST support suite 0x0001.

6.2. ML-KEM-1024

  • Identity keys. An identity is an ML-KEM-1024 key pair; the encapsulation key is 1,568 octets, the decapsulation key 3,168, and the fingerprint is H(encapsulation key). The decapsulation key SHOULD be held in a hardware keystore or equivalent; Section 16.6.2 depends on it.

  • Ephemeral keys are generated per anchor attempt and the decapsulation key is erased when the attempt completes or is abandoned.

  • Prekeys are generated per issuance; the decapsulation key is used exactly once and erased. An issuer MAY generate the pair from a 64-octet seed with the deterministic key generation of [FIPS203] (ML-KEM.KeyGen_internal(d, z) with d the seed's first 32 octets and z its last 32) so that only the seed, or the secret it derives from, need be stored (Section 16.3.2).

  • Implicit rejection. Decapsulation of a malformed or mismatched ciphertext returns a pseudorandom secret and no error; PQST relies on this so that no decapsulation oracle exists (Section 9.3.2). Implementations MUST NOT short-circuit decapsulation on ciphertext validity checks in a way that is observable to the sender.

  • Shared secrets are 32 octets and enter the key schedule only through Extract (Section 8.4).

6.3. AES-256-GCM

Keys are 32 octets, nonces 12, tags 16. Traffic nonces are the construction of Section 12.1 and are never reused under a key by the rules of Section 12. Sealing keys (Section 8.4) and record-wrapping keys (Section 8.7) carry their nonce in the derived 44 octets and are used for exactly one encryption. The per-key confidentiality limit is 2^23 packets (Section 12.4). The integrity limit of 2^52 forgery attempts is not approached because the pre-authentication filter rejects almost all forgeries before the AEAD (Section 11.3).

6.4. Header Protection

The mask is one raw AES-256 block encryption, under a 32-octet header-protection key, of the first 16 octets of the AEAD output (Section 10.3). The key is per generation and direction. This is the construction of Section 5.4.3 of [RFC9001] applied to a full 16-octet block.

6.5. HKDF and SHA-384

Extract(salt, ikm) = HMAC-SHA-384(salt, ikm); Expand(prk, info, L) as [RFC5869] with HMAC-SHA-384, producing at most 255 x 48 octets. Implementations MUST use HMAC, never a keyed hash substitute. Every derivation in this document uses a distinct label() and, where a transcript or index is relevant, includes it in info; Section 8 is exhaustive, and no other derivation from PQST secrets is permitted except through the exporter (Section 8.6). SHA-384 is used for transcripts, fingerprints and the pre-authentication tag.

6.6. ML-DSA-87, Offline Only

No PQST message carries a signature and no endpoint signs or verifies anything during an exchange. ML-DSA-87 certifies identity keys offline, in one of two formats delivered as a CERT object after establishment (Section 19.4.5) or out of band at provisioning:

  1. the binding statement of Appendix A: an ML-KEM-1024 encapsulation key, a subject, validity, and an ML-DSA-87 signature by an issuer the relying endpoint trusts;

  2. an X.509 certificate whose subject public key is an ML-KEM-1024 key, as profiled by the IETF LAMPS working group ([RFC9935] for the ML-KEM subject key, [RFC9881] for the signature algorithm), with an ML-DSA-87 signature.

Verifying either requires a clock for validity and trust anchors for the issuer, both of which are policy of the relying endpoint; CORE requires neither, because CORE trust is by provisioning or pinning (Section 9.1).

6.7. Randomness, Constant Time, and Hedges

  • Every nonce, ephemeral key, prekey, handshake identifier, probe value and freshness counter contribution that this document calls random MUST come from a cryptographically secure random source. Padding octets need not (Section 10.2.2).

  • Operations on secret key material MUST be constant-time with respect to the secrets (Section 11.8); the replay bitmap and the filter MUST NOT branch on key material.

  • The optional fleet secret (Section 9.3.4) enters the continuity secret alongside the KEM secrets and is the only hedge CORE provides against a failure of the KEM; there is no classical key exchange and no classical fallback in the security-critical path.

6.8. Test Vectors

Appendix D gives test vectors for the key schedule, the mask, a protected packet, a FRESH exchange and a CONTINUE exchange. An implementation MUST reproduce them to claim conformance.

7. Encoding

7.1. Rules

  • All integers are unsigned, big-endian and fixed-width. There are no variable-length integers.

  • Structures are the concatenation of their fields in the order written, with no alignment, padding or tags. A structure's encoding is therefore a function of its field values alone: the same values always produce the same octets, and parsing is a function of the octets and the lengths they carry.

  • Variable-length fields are preceded by their length in a fixed-width field of the size stated; the length counts octets. A length that would extend beyond the enclosing structure, or beyond a bound this document states for the field, MUST cause the message to be dropped before any allocation sized by it.

  • Where this document writes x(n), x is a field of exactly n octets; NOCTET in a definition means N octets; *OCTET means the number of octets the enclosing length implies; [x] means a field present only under the stated condition and otherwise absent entirely, not zero-filled.

  • Bit 0 of an octet is its least significant bit. Reserved bits and octets MUST be zero when sent and MUST cause the packet or message to be dropped when non-zero, as each section states.

  • Octet strings written as labels are UTF-8 with no terminator; label(X) is the string "PQST " (five octets, the last a space) followed by X. Labels whose X begins with "group " are reserved for the cohort layer (Section 26), so that no key it derives can coincide with one this document derives.

7.2. Structures Defined in This Document

Table 8
Structure Section Carried in
CommonHeader, ProtectedPacket, PacketNumberBlock, MessagePacket, message_header, ControlFrame 10 datagrams
AnchorRequest, AnchorResponse, their form-specific fields and sealed parts 9.2 MessagePacket fragments
Object, OBJECT, OBJECT_ACK, PROBE, PROBE_ACK, SUSPEND, CLOSE 19 ControlFrame
INNER_ADDR, AUTHZ, NEXT_EK, CERT, SUPERSEDE bodies (RECORD is opaque) 19.4 Object
BindingStatement Appendix A CERT or out of band

7.3. Sealed Parts

A sealed part is AES-256-GCM output over a plaintext structure, under a 44-octet sealing key whose first 32 octets are the key and last 12 the nonce (Section 8.4), with the stated transcript hash as associated data. On the wire it is ciphertext || tag(16), and its length is the plaintext length plus 16; the enclosing message's msg_len bounds it. A sealed part is opened exactly once per message and never retried under another key, with one exception: a responder that holds two identity keys during a rotation opens a FRESH request whose rk_hint is 0 under each in turn (Section 9.3.2).

7.4. Transcript Inputs

Transcript hashes (Section 8.3) are computed over octets exactly as transmitted, in order: the whole cleartext of a message from msg_len to the last cleartext field, then the sealed part with its tag. Nothing is re-encoded, canonicalised or omitted. A receiver that reassembles a message from fragments hashes the reassembled message, not the fragments; fragment headers are not part of any transcript.

7.5. Parsing Discipline

A parser reads each field once, in order, checking each length against the remaining octets before using it. A message with octets remaining after its last field is malformed and MUST be dropped; a message shorter than its fixed fields likewise. These checks are pure functions of the octets and are performed before any cryptographic operation that the field would feed (Section 11.6). Parsers MUST be exercised against the negative test vectors of Appendix D.

8. Key Schedule

This section defines every secret PQST derives, from the shared secrets of an anchor exchange (Section 9) down to the per-packet keys of Section 10, and the exporter through which upper layers obtain keys of their own. All derivation uses HKDF with HMAC-SHA-384 ([RFC5869]); Extract(salt, ikm) and Expand(prk, info, L) are its two functions. label(X) is the octet string "PQST " followed by X. H() is SHA-384. Integers in info strings are big-endian and fixed-width as noted.

8.1. Overview

anchor exchange for generation g
  ss_fresh, [ss_peer], [ss_req], [psk_cs]
      |
      v
  cs(g)        continuity secret of generation g; the salt of g + 1,
      |        erased on commit of g + 1
      +--> rec(g, dir)           recovery identifiers (16.2)
      +--> k_tomb(g) -> resp_rid(g, dir, nonce)
      |                          response routing keys (9.3.8) and
      |                          tombstone replies (19.6)
      +--> k_resp                this exchange's response (9)
      +--> k_retry               a RETRY to a request for g + 1
      +--> session_root          g = 0 only; kept for the session
      |
      v
  lineage_secret(g)
      +--> hp_i2r(g), hp_r2i(g)  header protection (10.3)
      +--> rid(g, dir, j)        packet identifiers (15.1)
      +--> Export(lineage, ...)  lineage-scope exporter (8.6)
      |
      v
  epoch_secret(g, 0) -> epoch_secret(g, 1) -> ...      (14.3)
      |
      v
  key_i2r, iv_i2r, key_r2i, iv_r2i, per epoch and direction (10.2.2)

A generation g is one continuity secret. Generation 0 is created by the handshake; each re-anchor creates generation g + 1 from generation g. A lineage is the set of epochs under one generation; lineage_gen in the epoch identifier (Section 12.2) is g.

8.2. Inputs

Table 9
Input Octets Source
ss_fresh 32 ML-KEM-1024 shared secret from the exchange's fresh encapsulation: to the requester's ephemeral key (ss_e) in the FRESH, CONTINUE and DISCOVER forms, or to a prekey (ss_n) in the CONTINUE_0RTT form (Section 9.2)
ss_peer 32 shared secret from the requester's encapsulation to the peer's identity key; present when the peer is proved (always in FRESH; by flag otherwise)
ss_req 32 shared secret from the peer's encapsulation to the requester's identity key; present when the requester is proved (always in FRESH; by flag otherwise)
psk >= 32 the fleet secret, if one is configured (Section 9.3.4); otherwise absent
cs(g - 1) 48 the previous continuity secret; absent for g = 0
transcript hashes th_1, th_2, th_3 48 Section 8.3

Shared secrets are concatenated in the order given. Both endpoints must agree on which optional inputs are present; the request's form and flags (Section 9.2) determine ss_peer and ss_req, and the fleet secret is configuration. A disagreement makes the sealed response unopenable, which is the failure mode intended.

8.3. Transcript

The transcript hashes bind each message of an anchor exchange into the key that seals it, and the request into the lineage and the session root; the continuity secret itself takes the shared secrets of the exchange and no transcript hash (Section 8.4). With RequestCleartext the octets of the request from msg_len up to but not including the sealed part, and ResponseCleartext likewise for the response:

th_0 = H(label("anchor") || version(1) || suite(2) || fp_peer(48))
th_1 = H(th_0 || RequestCleartext)
th_2 = H(th_1 || sealed_req || tag_req)   ; DISCOVER: th_2 = th_1
th_3 = H(th_2 || ResponseCleartext)
th_4 = H(th_3 || sealed_resp || tag_resp)
  • version is the wire version (0x14). suite is the cipher suite identifier, 0x0001 for the suite of Section 6 (ML-KEM-1024, AES-256-GCM, HKDF-SHA-384); it is never transmitted, because the suite is implied by the identity key the requester encapsulates to (Section 21), and it is in the transcript so that a future suite cannot share keys with this one.

  • fp_peer is the fingerprint H(peer_pk) of the peer identity key the requester encapsulates to, or intends to, in every form in which the requester knows it. In the DISCOVER form it is 48 zero octets.

  • A FRESH exchange that follows a DISCOVER exchange carries the DISCOVER exchange's th_4 as the cleartext field prior of its request (Section 9.7), which therefore enters th_1 and everything derived after it.

th_4 is retained only until the next message is processed; the lineage is derived from th_2 so that a requester in the CONTINUE_0RTT form can derive it before the response exists (Section 8.5). The response is bound by k_resp, which is derived from th_3, and by the shared secrets it carries, which enter cs(g).

8.4. Continuity Secret and Sealing Keys

salt(0)   = label("cs")
salt(g)   = cs(g - 1)                     ; g >= 1
ikm(g)    = ss_fresh || [ss_peer] || [ss_req] || [psk_cs]
cs(g)     = Extract(salt(g), ikm(g))      ; 48 octets

; only when a fleet secret is configured (Section 9.3.4)
prk_fleet = Extract(label("fleet"), psk)
psk_cs    = Expand(prk_fleet, label("cs input"), 48)
k_pre     = Expand(prk_fleet, label("preauth"), 48)

; FRESH
k_req     = Expand(Extract(label("init"), ss_peer),
                   label("seal req") || th_1, 44)
; CONTINUE, CONTINUE_0RTT
k_req     = Expand(cs(g - 1), label("seal req") || th_1, 44)
; the DISCOVER response
k_disc    = Expand(Extract(label("discover"), ss_fresh),
                   label("seal disc") || th_3, 44)
k_resp    = Expand(cs(g), label("seal resp") || th_3, 44)
k_retry   = Expand(cs(g - 1), label("seal retry") || th_3, 44)

A 44-octet sealing key is an AES-256-GCM key (the first 32 octets) and nonce (the last 12). Each sealing key is derived from a transcript that includes a fresh nonce and is used for exactly one message, so the nonce is never reused. The associated data of a sealed request is th_1; of a sealed response, th_3.

8.5. Lineage, Epochs, Traffic Keys, Identifiers

lineage_secret(g) = Expand(cs(g),
                           label("lineage") || g(2) || th_2, 48)
session_root = Expand(cs(0), label("session root") || th_2, 48)
               ; at g = 0 only, and retained

hp_i2r(g) = Expand(lineage_secret(g), label("hp i2r"), 32)
hp_r2i(g) = Expand(lineage_secret(g), label("hp r2i"), 32)

; Section 14.3
epoch_secret(g, 0) = Expand(lineage_secret(g), label("epoch 0"), 48)
epoch_secret(g, k + 1) = Expand(epoch_secret(g, k),
                                label("epoch step"), 48)

key_i2r(g, k) = Expand(epoch_secret(g, k), label("key i2r"), 32)
iv_i2r(g, k)  = Expand(epoch_secret(g, k), label("iv i2r"), 12)
key_r2i(g, k) = Expand(epoch_secret(g, k), label("key r2i"), 32)
iv_r2i(g, k)  = Expand(epoch_secret(g, k), label("iv r2i"), 12)

rid(g, dir, j) = prefix(dir) ||
    Expand(lineage_secret(g), label("rid") || dir(1) || j(4),
           8 - len(prefix(dir)))
rec(g, dir) = prefix(dir) ||
    Expand(cs(g), label("recovery") || dir(1), 8 - len(prefix(dir)))
resp_rid(g, dir, nonce) = prefix(dir) ||
    Expand(k_tomb(g), label("response") || nonce(32),
           8 - len(prefix(dir)))
  • dir is 0x00 for i2r and 0x01 for r2i. prefix(dir) is the zero-to-two-octet prefix chosen by the endpoint that receives packets in that direction and delivered in its sealed part of the FRESH exchange (Section 9.2); it is fixed for the session. j is the identifier index (Section 15.1).

  • rid(g, dir, j) is the routing key of protected packets sent in direction dir under generation g on the path that was assigned index j. rec(g, dir) is the routing key of a re-anchor request sent in direction dir while generation g is current (Section 16.2). resp_rid(g, dir, nonce) is the routing key of the response to a re-anchor request whose cleartext nonce is nonce, sent in direction dir (the responder's direction) while generation g is current. It exists for that attempt only: the requester listens on it until the attempt ends, so a response to an attempt it has abandoned matches nothing and is dropped before any public key operation (Section 9.3.8). It is derived from k_tomb(g) (Section 8.7) rather than from cs(g) so that a tombstone, which holds k_tomb and not cs, can route its reply (Section 19.6). None of the three is ever transmitted other than in its role.

  • resp_rid takes its direction only through prefix(dir): the nonce, fresh per attempt, already separates the keys of different attempts, and an endpoint never answers its own request.

  • The traffic keys of Section 10.2.2 are key(direction, epoch_id) and iv(direction, epoch_id) with epoch_id = g || k.

  • The keys of generation g are derivable only from cs(g) or lineage_secret(g); compromise of a later generation reveals nothing about an earlier one, because cs(g - 1) is erased on commit of g (Section 16.4) and Extract is one-way in its salt.

8.6. Exporter

Upper layers obtain keys bound to the session through the exporter and in no other way; PQST consumes no upper-layer keys.

Export(session, ulabel, context, L) =
    Expand(session_root, label("export session") || x, L)
Export(lineage, ulabel, context, L) =
    Expand(lineage_secret(g), label("export lineage") || x, L)

x = len(ulabel)(1) || ulabel || len(context)(2) || context
  • Session scope is stable for the session's life, across every epoch and re-anchor, because session_root is derived once and retained (it is part of the continuity record, Section 16.6). Export(session, "session id", "", 16) is the session identifier, the handle by which upper layers and both endpoints name the session; it is never transmitted by PQST.

  • Lineage scope changes at every re-anchor. It is for bindings that must be re-presented after recovery and that should not survive a compromise healed by a re-anchor.

  • Compromise. A re-anchor changes the lineage-scoped root and not session_root: an adversary that obtains session_root, or the generation-0 secrets it derives from, keeps deriving session-scoped exports after every later re-anchor, and only a new session, by FRESH, gives exports independent of it; lineage-scoped exports are healed by a re-anchor whose fresh KEM input the adversary does not hold (Section 23.1). Material that must rotate with post-compromise recovery belongs in lineage scope.

  • ulabel is at most 255 octets. Two namespaces are distinct: the strings this document passes to label() for its own derivations are internal to the key schedule, fixed by it and not registered; exporter labels are the application's, chosen freely except that a label MUST NOT begin with the octets "PQST", which this document reserves for itself and for the layers it specifies, the group layer's labels beginning "PQST group" among them (Section 26). Because the exporter's own label precedes ulabel in info, no application label can collide with a key PQST derives for itself; applications avoid collisions among themselves by their own naming, and no IANA registry of exporter labels is established (Section 25).

8.7. Other Derived Values

; Section 16.6, the record at rest
k_wrap   = Expand(Extract(label("record wrap"), ss_w),
                  label("wrap key"), 44)
; Section 19.6, kept after close
k_tomb   = Expand(cs(g), label("tombstone"), 48)
; Section 19.6, the CLOSED response
k_closed = Expand(k_tomb, label("seal closed") || th_3, 44)
; Section 16.3, prekey regeneration
nek_seed = Expand(local_secret, label("nek seed") ||
                  session_id(16) || version(4), 64)

8.8. Erasure

Each secret is erased as soon as the protocol no longer needs it: ss_* once the commit of the generation they feed is durable (Section 9.3.8), a requester's ss_peer being kept with its write-ahead state until the response (Section 16.4); an ephemeral dk when its exchange completes or is abandoned; a prekey's decapsulation key in the write that serves the request consuming it, or, for a prekey regenerated from local_secret (Section 16.3.2), when that secret is rotated; cs(g - 1) on commit of generation g (Section 16.4); lineage_secret(g) when lineage g is retired; epoch_secret(g, k) as Section 14.3 requires; sealing keys after their one message; a DISCOVER requester's dk, ss_fresh and k_disc when the response opens or the attempt ends (Section 9.7.1). Between exchanges the continuity record keeps session_root, cs(g) for the current g, and the prekey decapsulation key or local_secret; while an exchange is in flight it also keeps the write-ahead state of Section 16.4 (Section 16.6.1). A close erases them all; the tombstone keys k_tomb are the only secrets derived from a session that survive it, for tombstone_ttl (Section 19.6). Keys outside the key schedule have their own erasure rules: the retiring identity key (Section 23.4), the previous record key (Section 16.6.3) and the cohort layer's keys by its own (Section 26).

9. The Anchor Exchange: Handshake and Re-Anchor

PQST has one key-establishing exchange, the anchor exchange. Performed from no prior state it is the handshake and creates a session; performed from an existing session it is a re-anchor and creates the session's next generation (Section 16). Both are the same two messages with the same key schedule (Section 8), the same fragmentation (Section 10.4), and the same crash rules (Section 16.4). What differs between the forms is which secrets go into the continuity secret and how the request is authenticated.

9.1. Overview

Roles. Within one exchange there is a requester, which sends the request, and a responder. In the FRESH and DISCOVER forms the requester becomes the session's initiator and the responder its responder; these session roles name the traffic directions i2r and r2i for the session's life. In the CONTINUE forms either session role may be the requester.

Forms.

  • 0. Name: FRESH; Creates: generation 0; Fresh secret: encapsulation to the requester's ephemeral key; Peer proved: always; Requester proved: always; Round trips to requester data: 1

  • 1. Name: CONTINUE; Creates: generation g + 1 from g; Fresh secret: encapsulation to the requester's ephemeral key; Peer proved: by flag; Requester proved: by responder policy; Round trips to requester data: 1

  • 2. Name: CONTINUE_0RTT; Creates: generation g + 1 from g; Fresh secret: encapsulation to a prekey the responder issued earlier; Peer proved: by flag; Requester proved: not possible; the responder answers RETRY if it requires it; Round trips to requester data: 0

  • 3. Name: DISCOVER (OPTIONAL, Section 9.7); Creates: nothing; delivers the responder's identity key; Fresh secret: encapsulation to the requester's ephemeral key; Peer proved: no; Requester proved: no

Messages. Two message types, carried in HANDSHAKE packets (FRESH, DISCOVER) or RECOVERY packets (CONTINUE forms) under the framing of Section 10.4:

msg_type 0x01  AnchorRequest
msg_type 0x02  AnchorResponse

The routing key of a FRESH or DISCOVER request is a handshake identifier: eight octets chosen at random by the requester for this attempt, and its response carries the same key.

The routing key of a CONTINUE request is the recovery identifier rec(g - 1, dir) of the current generation (Section 16.2); its response carries resp_rid(g - 1, dir', nonce) (Section 8.5), derived from the request's nonce and the responder's direction dir', a key that exists for that attempt only.

Generations. Throughout this section and Section 16, g names the generation an exchange creates: 0 for FRESH, and the current generation plus one for the CONTINUE forms, whose requests are sent under generation g - 1 and authenticated with cs(g - 1).

Prerequisites. In FRESH, the requester holds the peer's identity key (pinned, provisioned, or obtained by DISCOVER); the responder holds, or receives in the request, the requester's identity key. Identity keys are ML-KEM-1024 encapsulation keys; an identity's fingerprint is H(pk). Certification of identity keys is offline and optional (Section 6; Section 9.7.3).

Two Illustrated Exchanges (informative). The ladders illustrate the FRESH exchange and the zero-round-trip re-anchor as Section 9.2 and Section 9.3 specify them; they omit fragmentation, retransmission, the reply cache, the RETRY answers other than the one shown and the crash rules of Section 16.4.

requester                                            responder
    |  AnchorRequest FRESH, in a HANDSHAKE packet         |
    |  ek, ct_peer = Encap(resp_pk), init_counter,        |
    |  the sealed part under k_req                        |
    |---------------------------------------------------->|
    |               Decap(ct_peer); open the sealed part; |
    |               ct_e = Encap(ek); ct_req = Encap(req_pk)
    |               arm generation 0 (write-ahead)        |
    |  AnchorResponse: nonce_r, ct_e, ct_req,             |
    |  the sealed part under k_resp (grant, objects)      |
    |<----------------------------------------------------|
    |  Decap(ct_e), Decap(ct_req); cs(0); commit (write)  |
    |                                                     |
    |           PROBE under generation 0, repeated        |
    |<----------------------------------------------------|
    |  the first packet under generation 0:               |
    |  data, or PROBE_ACK                                 |
    |---------------------------------------------------->|
    |               it authenticates: generation 0 commits|
    |               at the responder; established         |
requester (holds the prekey nek, version v)          responder
    |  AnchorRequest CONTINUE_0RTT, in a RECOVERY packet  |
    |  on rec(g-1, dir): record, nek_version v,           |
    |  ct_n = Encap(nek), the sealed part under k_req     |
    |  derived from cs(g-1)                               |
    |---------------------------------------------------->|
    |  cs(g) derived at once; protected packets under g   |
    |  may follow in the same or later datagrams          |
    |  (early data, Section 16.3.2)                       |
    |---------------------------------------------------->|
    |               open under cs(g-1); Decap(ct_n) with  |
    |               the prekey, now consumed; cs(g);      |
    |               arm g (write-ahead), or answer RETRY  |
    |               PROOF_REQUIRED when proof is required |
    |  AnchorResponse: nonce_r, no ciphertext,            |
    |  the sealed part under k_resp                       |
    |<----------------------------------------------------|
    |  commit g (write)                                   |
    |           PROBE under generation g, repeated        |
    |<----------------------------------------------------|
    |               the early data, or a later packet,    |
    |               authenticates under g: generation g   |
    |               commits at the responder              |

9.2. Message Formats

All fields are fixed-width and big-endian (Section 7). [x] marks a field present only when stated.

9.2.1. AnchorRequest

AnchorRequest = msg_len form flags target_gen nonce form_fields
                [sealed_req tag]

msg_len     = 2OCTET     ; octets in the message, including msg_len
form        = OCTET      ; Section 9.1
flags       = OCTET      ; bit 0: prove_peer (ct_peer present); bit
                         ; 1: offer_proof (the requester asks to be
                         ; proved: the responder SHOULD set
                         ; prove_req); bits 2-7 reserved, MUST be 0
target_gen  = 2OCTET     ; generation this exchange creates; 0 in
                         ; FRESH and DISCOVER
nonce       = 32OCTET    ; fresh randomness

form_fields, by form:

FRESH:          rk_hint(1) preauth_len(1) preauth(0|16) prior_len(1)
                prior(0|48) ek(L_ek) ct_peer(L_ct)
CONTINUE:       record_len(2) record(0..472) ek(L_ek) [ct_peer(L_ct)
                if prove_peer] [proof_pad(L_ct) if offer_proof and
                not prove_peer]
CONTINUE_0RTT:  record_len(2) record(0..472) nek_version(4)
                ct_n(L_ct) [ct_peer(L_ct) if prove_peer]
DISCOVER:       ek(L_ek) pad(L_ek + 16)
  • rk_hint names which of the responder's identity keys ct_peer was encapsulated to: an opaque octet provisioned with the key by the responder's operator; 0x00 means unspecified, and a responder then tries at most two keys. prove_peer MUST be 1 in FRESH and 0 in DISCOVER, which carries no ct_peer; target_gen MUST be 0 in FRESH and DISCOVER and at least 1 in the CONTINUE forms. offer_proof MUST be 0 in FRESH and DISCOVER and in CONTINUE_0RTT, where proof of the requester is impossible; in CONTINUE it lets a requester that needs to be freshly proved to its peer, for example on rejoining a group, ask for it without any other message.

  • preauth is the pre-authentication tag of Section 9.3.4; preauth_len is 0 or 16.

  • prior is the final transcript hash of a DISCOVER exchange this request follows (Section 9.7); otherwise prior_len is 0.

  • Lengths L_ek and L_ct are those of the suite (Section 6.1): 1568 each in suite 0x0001. ek is a fresh encapsulation key of the suite's KEM generated for this attempt; its decapsulation key is erased when the exchange completes or is abandoned. ct_peer = Encap(peer_pk). ct_n = Encap(nek) where nek is the prekey with version nek_version that the responder issued (Section 16.3). pad is 1,584 zero octets, the size of the responder's identity key plus a tag, so that the DISCOVER response is no larger than its request (Section 9.5). proof_pad is 1,568 zero octets, room for the responder's ct_req, so that a CONTINUE response that proves the requester is no larger than its request. A receiver MUST drop a request whose pad or proof_pad is not all zero.

  • record is a sealed record the responder issued earlier (Section 16.6), echoed so that a responder without state can serve the request. It is cleartext to the requester and lies entirely within the first fragment at any legal frag_size.

sealed_req is AES-256-GCM output under k_req (Section 8.4) with associated data th_1, over:

FRESH:            id_type(1) identity(48|L_ek) init_counter(8)
                  capabilities(2) prefix_len(1) prefix(0..2)
                  hint_len(1) authz_hint(0..64) objects_len(2)
                  objects(*)
CONTINUE forms:   attempt(2) objects_len(2) objects(*)
DISCOVER:         no sealed part and no tag
  • id_type 0: identity is the requester's fingerprint (48 octets); 1: its identity key (L_ek octets, 1,568 in suite 0x0001).

  • init_counter is the freshness counter of Section 9.3.5.

  • capabilities is the bit field of Section 21; unknown bits are ignored.

  • prefix is the prefix the requester will use on identifiers it receives on (prefix(r2i), Section 8.5), fixed for the session.

  • authz_hint is an opaque input to the responder's authorization decision (Section 17); it is not a credential and proves nothing by itself.

  • objects is a sequence of state objects in the encoding of Section 19, each complete; an object that would not fit is sent after establishment instead.

9.2.2. AnchorResponse

AnchorResponse = msg_len form flags target_gen nonce_r form_fields
                 sealed_resp tag

form        = OCTET      ; the request's form, or 4 = RETRY, or 5 =
                         ; CLOSED (Section 19.6)
flags       = OCTET      ; bit 1: prove_req (ct_req present); bits 0,
                         ; 2-7 reserved, MUST be 0
target_gen  = 2OCTET     ; echoes the request
nonce_r     = 32OCTET    ; random, chosen by the responder for each
                         ; response

form_fields, by form:

FRESH:          ct_e(L_ct) ct_req(L_ct)   ; prove_req MUST be 1
CONTINUE:       ct_e(L_ct) [ct_req(L_ct) if prove_req]
CONTINUE_0RTT:  (none)                    ; prove_req MUST be 0
DISCOVER:       ct_e(L_ct)
RETRY, CLOSED:  (none)

nonce_r makes each response's transcript, and so its keys, unique, a RETRY or CLOSED answer included, which carries no fresh ciphertext. ct_e = Encap(ek); ct_req = Encap(req_pk) where req_pk is the requester's identity key. sealed_resp is AES-256-GCM output under k_resp (k_disc for DISCOVER, k_retry for RETRY, k_closed for CLOSED) with associated data th_3, over:

FRESH:            capabilities(2) prefix_len(1) prefix(0..2)
                  objects_len(2) objects(*)
CONTINUE forms:   objects_len(2) objects(*)
DISCOVER:         peer_pk(L_ek)
RETRY, CLOSED:    reason(1) detail(1)

prefix here is prefix(i2r). RETRY reasons: 1 PROOF_REQUIRED (the responder requires proof of the requester, which the CONTINUE_0RTT form cannot carry, or for which a CONTINUE request from an address the responder has not validated has no room), 2 PREKEY_UNAVAILABLE (the named prekey is not held), 3 FORM_NOT_PERMITTED (policy), 5 IDENTIFIER_COLLISION (the generation a CONTINUE_0RTT request fixed derives an identifier the responder already holds, Section 15.1; the requester repeats with a new request). detail is 0. A RETRY or CLOSED answers only the CONTINUE forms; a FRESH request is never answered by either. The CLOSED form is a RETRY in every respect except its form value and its sealing key: it carries reason = 4 (CLOSED) and, in detail, the close reason of Section 20, and it is sealed under k_closed (Section 19.6). The distinct form value lets the requester select the key without a trial opening (Section 7.3): a live responder answers RETRY under k_retry, a tombstone answers CLOSED under k_closed, and the requester opens each exactly once.

9.3. Processing

Checks are listed in the order they MUST be performed: each is cheaper than the next, and no public key operation precedes a check that could reject the message without one.

9.3.1. Requester: Sending

  1. Generate nonce, the handshake identifier (FRESH, DISCOVER), and (ek, dk) (all forms but CONTINUE_0RTT). In CONTINUE_0RTT, select the unconsumed prekey nek and its version.

  2. FRESH: (ct_peer, ss_peer) = Encap(peer_pk). CONTINUE forms with prove_peer: the same. CONTINUE_0RTT: (ct_n, ss_n) = Encap(nek).

  3. Compute th_0, th_1 (Section 8.3), k_req, and seal. FRESH: obtain init_counter (Section 9.3.5) and, if configured, preauth (Section 9.3.4).

  4. Write-ahead. FRESH: persist the new init_counter before transmission. CONTINUE forms: persist what Section 16.4 requires before transmission.

  5. CONTINUE_0RTT only: compute cs(g), lineage_secret(g) and the keys of Section 8.5 now; protected packets under generation g, with routing key rid(g, dir, 0), MAY follow the request in the same or later datagrams.

  6. Transmit the request as fragments (Section 9.4), then retransmit on the schedule of Section 9.4 until a response is accepted or the attempt is abandoned, by the schedule of Section 16.7 or at the end of its life, anchor_timeout from this transmission. For the life of the attempt the requester listens for the response on the handshake identifier (FRESH, DISCOVER) or on resp_rid(g - 1, dir', nonce) (CONTINUE forms; Section 8.5) and on nothing else.

9.3.2. Responder: FRESH and DISCOVER Requests

On the first fragment (cleartext fields are complete within it):

  1. form, flags and target_gen valid for the form; otherwise drop.

  2. FRESH: rk_hint names a key this responder holds, or is 0; otherwise drop.

  3. FRESH, if policy requires pre-authentication: verify preauth (Section 9.3.4) and drop on failure or absence. Reassembly state MUST NOT be allocated before this check passes: the tag is in fragment zero, so a fragment of a request not yet verified that is not fragment zero, a parity fragment included, is discarded without allocation (Section 11.5), and a requester sends fragment zero first.

  4. Allocate reassembly state within the limits of Section 9.4.

On the complete message:

  1. On the complete message: a byte-identical retransmission of a request answered within the reply cache window is answered from the cache (Section 9.4) and processing stops, before any public key operation. Compute th_1. FRESH: ss_peer = Decap(ct_peer) under the key rk_hint names (or each of the two keys a responder holds during a rotation, Section 23.4, when rk_hint is 0); derive k_req; open the sealed part. Failure under every candidate: drop. ML-KEM decapsulation never fails observably (implicit rejection), so a forged ct_peer is detected here and nowhere earlier.

  2. FRESH: apply the freshness rule of Section 9.3.5. A stale counter: drop.

  3. FRESH: resolve the identity (Section 9.3.6). Unknown or disallowed: drop.

  4. FRESH: (ct_e, ss_fresh) = Encap(ek); (ct_req, ss_req) = Encap(req_pk). DISCOVER: (ct_e, ss_fresh) = Encap(ek) only.

  5. FRESH: compute cs(0), session_root, lineage_secret(0) and the keys of Section 8.5; choose prefix(i2r); derive rid(0, i2r, 0..7) and rec(0, i2r) and, if any is already in a lookup table, return to step 8 with fresh encapsulations (Section 15.1, collision); install the identifiers (Section 15.1); build and seal the response with the objects the responder issues at establishment (Section 9.3.7). DISCOVER: build the response with the responder's identity key sealed under k_disc; no state is retained.

  6. FRESH: persist the armed generation and the response about to be sent, as Section 16.4 requires; the counter high-water mark is not changed here but at confirmation (Section 9.3.5). Send the response as fragments subject to Section 9.5, on the handshake identifier; cache it as Section 9.4 requires; FRESH: start the confirmation probe and the confirmation timer (Section 9.3.9).

9.3.3. Responder: CONTINUE and CONTINUE_0RTT Requests

Processing in Section 11.5 reaches this point with the session located by rec(g - 1, dir) (Section 16.2) or by a sealed record (Section 16.6).

  1. form, flags and target_gen valid; otherwise drop. If the request arrived on the recovery identifier of a generation that is armed but not committed here, the peer holds that generation: open the request under that generation's cs (one AEAD) and, if it opens, commit the generation first (Section 16.4), then continue with it as the current generation. Then target_gen equals the current generation plus one; otherwise apply the generation rules of Section 16.5 (cached reply or drop). If the session's own request for the same target_gen is outstanding, the simultaneous rule of Section 16.4 decides by role, form and transmission count; a request it drops unopened is dropped here; nothing further is done for a request that will not be served.

  2. On the complete message: compute th_1; derive k_req from cs(g - 1); open the sealed part. Failure: drop. This step costs one AEAD and authenticates the request as coming from a holder of the session's continuity secret before any public key operation; nothing before it has changed state, and nothing after it is done for a request that did not open. attempt is the requester's attempt number: each new request of the session carries a number greater than every earlier one, so that a later attempt for a target always carries a higher number (a counter per session satisfies this; Section 16.7); a request whose attempt is below one already served for the same target generation is dropped, because the requester has abandoned it and serving it would displace the later attempt's generation. attempt is 16 bits and MUST NOT wrap: a requester that cannot allocate a value greater than every value already used on the session closes the session with SESSION_LIFETIME (Section 20), as it does when lineage_gen is exhausted (Section 12.2), and the application opens a new session.

  3. Policy. If the grant this endpoint issued has expired beyond delta or been revoked (Section 17.3), close the session, its tombstone durable first (Section 19.6), and respond CLOSED with AUTHZ_EXPIRED or AUTHZ_REVOKED; no early data is delivered. If the responder requires proof of the requester (Section 16.3) and the form is CONTINUE_0RTT: respond RETRY PROOF_REQUIRED. If it requires that proof of a CONTINUE request that neither offers it nor carries prove_peer, from an address it has not validated (Section 15.4): respond RETRY PROOF_REQUIRED, and the requester repeats offering the proof. If CONTINUE_0RTT names a prekey the responder does not hold: RETRY PREKEY_UNAVAILABLE. If the form is not permitted by policy: RETRY FORM_NOT_PERMITTED. A RETRY consumes nothing: the generation, the prekey and the recovery identifier remain usable, and the requester repeats with another form; the one exception is IDENTIFIER_COLLISION (step 7), which consumes the prekey of a CONTINUE_0RTT request, because the lineage had to be derived to detect it. A RETRY travels on the attempt's resp_rid.

  4. Now, and not before, the request may displace state: if generation g is armed from an earlier request and this request differs from it, it is replaced, the earlier generation going only once its replacement is written in step 7 (Section 16.4, re-serving); if this endpoint's own request for g is outstanding, it yields, pauses or abandons that attempt as the simultaneous rule of Section 16.4 says.

  5. Decapsulate: CONTINUE_0RTT, ss_fresh = Decap(ct_n) with the prekey's decapsulation key, which is then erased (the prekey is consumed); with prove_peer, ss_peer = Decap(ct_peer).

  6. CONTINUE: (ct_e, ss_fresh) = Encap(ek); if proof of the requester is required by policy, or offered by the request's offer_proof flag, (ct_req, ss_req) = Encap(req_pk) and set prove_req.

  7. Compute cs(g), lineage_secret(g) and the keys; derive rid(g, dir_in, 0..7) and rec(g, dir_in). If any is already in a lookup table (Section 15.1, collision): CONTINUE, return to step 6 with a fresh encapsulation; CONTINUE_0RTT, respond RETRY IDENTIFIER_COLLISION and stop. Install generation g armed (Section 16.4) with its identifiers; build and seal the response with the objects of Section 9.3.7. Persist the armed generation and the response (Section 16.4); on failure, send nothing and restore every piece of state the arming changed (Section 16.4), leaving the request servable when it is retransmitted. Send the response on resp_rid(g - 1, dir', nonce); cache it (Section 9.4); start the confirmation probe (Section 9.3.9).

  8. CONTINUE_0RTT: protected packets under generation g that arrived with the request are processed now (Section 11.2) and delivered; they commit nothing (Section 16.4).

9.3.4. Pre-Authentication Tag and Fleet Secret (OPTIONAL)

A deployment MAY provision a fleet secret psk of at least 32 octets to every endpoint that may handshake with one another. When it is configured:

preauth = HMAC-SHA-384(k_pre, th_0 || nonce)[0:16]
          ; k_pre from Section 8.4

The requester includes it in every FRESH request; a responder configured to require it verifies it with one HMAC, or two during an identity rotation when rk_hint is 0, since th_0 names the key the requester encapsulated to (Section 23.4), before allocating reassembly state or performing any public key operation, and drops silently on failure. The tag covers only fragment zero's fields so that it can be checked on fragment zero, whichever fragment arrives first; fragments of an unverified request that arrive before it are discarded, so that under this policy the parity fragment cannot recover a lost fragment zero and the requester retransmits instead (Section 9.4).

It stops strangers but it does not stop replays, which Section 9.3.5 bounds. The same psk enters cs(g) through psk_cs (Section 8.4) in every exchange of every session between endpoints that share it, which hedges the key establishment against a failure of the KEM. An observer learns from preauth_len that the deployment uses pre-authentication, and nothing else.

9.3.5. Freshness Counter

init_counter is a 64-bit value that the requester MUST make strictly greater than every value it has previously used in a FRESH request to any responder, so that a responder that rotates its key never sees a requester's counter regress. Sources, in order of preference: a persisted counter; a persisted boot count in the high 16 bits with a per-boot sequence below it; a coarse local clock in the high bits with a sequence below it. No clock synchronisation is involved.

A requester that has lost its counter falls back to the boot-count or clock source. Only a monotonic store guarantees a value above every earlier counter; a boot count or a coarse clock exceeds them under assumptions that a restored storage image, a lost boot count or a clock set back can break, and a requester whose counter has fallen behind the responder's stored mark is refused as a replay although it holds its identity key.

A deployment therefore declares how such a requester recovers: a counter in protected monotonic storage, or re-provisioning of the identity, which gives the responder a new fingerprint and mark. A RETRY answering a stale counter with the stored mark, which only the identity's holder could use, is planned for a later version.

The responder keeps, per requester identity, the highest init_counter it has accepted, and SHOULD persist it with the identity's record. A FRESH request whose counter is not greater than the stored value is dropped, after the decapsulation needed to open the sealed part (one per identity key tried, Section 9.3.2) and before any encapsulation or response. The stored value is advanced, to the greater of itself and the request's counter, only when the exchange is confirmed (Section 9.3.9), in the write that commits generation 0 (Section 16.4).

Until then the request's identity is only claimed, and the responder MUST NOT change anything keyed by it (Section 22, I-21). A mark advanced when the request is served would let anyone who knows a peer's fingerprint and the responder's public key lock that peer out of FRESH with one forged request carrying a counter near 2^64, since every later counter of the peer must exceed it.

The counter is a control on load, not on authentication. A replayed request can never be confirmed, because confirmation needs ss_req and ss_fresh, and the requester erases the ephemeral decapsulation key from which ss_fresh comes. What it stops is a confirmed request replayed to create unconfirmable exchanges in the requester's name; a request never confirmed and replayed after its exchange has expired is served again, at the cost of any forged request (Section 23).

There is one exception: a request byte-identical to one answered within reply_cache_ttl (Section 9.4) is answered again from the cache, before and after the generation it created is committed, so that a lost response costs the requester only a retransmission: from the original source address without condition, from any other address within the reflection budget of Section 15.4 toward that address, so that a requester that changed address during the exchange is answered where it now is.

Any other request whose counter is stale, under another handshake identifier or differing in a byte, costs the responder one decapsulation and produces no reply; a replay from a third address obtains at most the cached octets its budget allows, which the network carried to the responder first. Half-open duplicates are impossible for the same reason.

9.3.6. Identity Resolution and Policy

  • id_type 0: the fingerprint MUST match an identity key the responder holds; otherwise the identity is unknown.

  • id_type 1: the key is accepted if its fingerprint matches a known identity or if the responder's policy admits unknown identities.

  • CORE default: unknown identities are rejected. A responder MAY instead admit an unknown identity as an unauthenticated-identity session, in which case its authorization grant (Section 17) reflects that status and any trust in the identity is established afterwards (Section 9.7.3).

  • Concurrent sessions for one identity pair are permitted (Section 9.6.2).

9.3.7. Objects in the Response

The FRESH request carries the initiator's AUTHZ grant, which every endpoint issues (Section 17.1), and, when the exchange is a recovery (Section 16.7), a SUPERSEDE object naming the session it replaces. The FRESH response carries capabilities, prefix(i2r), and the objects the responder issues at establishment: its AUTHZ grant, and any other object kind of Section 19 it chooses.

Every CONTINUE request and response carries its sender's current AUTHZ grant at its current version, so that a peer restored without it regains it (Section 17.5), and a CONTINUE response also carries a new RECORD if the responder issues sealed records. A holder applies an object carried in a sealed part only if its version is greater than the one it holds, as for an OBJECT (Section 19.3.4, rule 2), and does not acknowledge it: the exchange that carries it is retransmitted whole until it completes.

Prekeys (NEXT_EK) are never carried in a response (Section 16.3). An object that would make the response larger than Section 9.5 permits is sent as OBJECT frames after establishment instead; a grant so deferred is the first object sent. Until an endpoint holds the peer's grant it sends the peer no application data, which the peer would not deliver (Section 17.1).

With a fingerprint identity and no hint or objects in the request, the response has 61 + len(prefix(r2i)) - len(prefix(i2r)) octets of room beyond its fixed parts, at least 59, so a grant whose reference is at most 47 octets always fits.

9.3.8. Requester: Processing the Response

  1. Associate by routing key with an outstanding attempt: the handshake identifier (FRESH, DISCOVER) or the attempt's resp_rid (CONTINUE forms), each of which belongs to this attempt alone, resp_rid being derived from its nonce; the sealed part, under keys bound to the request's transcript, completes the match. A response that matches no attempt is dropped before any public key operation; because resp_rid is per attempt, a late or replayed response to an attempt already abandoned costs nothing. The response's source address is credited with the response under Section 15.4, whether or not it is the address the request was sent to, which is not credited. The response validates the address pair the request was transmitted to, when the attempt was transmitted to one pair only (Section 15.3): the request is the challenge, unpredictable and sent to an address of the requester's own choosing, and the transcript binds the answer to it, so the answer proves that the peer received the request there, as a PROBE_ACK proves a PROBE. The response's source proves nothing about itself: a source that differs from that pair is a candidate (Section 18.3, P1), credited, probed at once and budgeted until its probe is answered, and the validated pair is the exchange's path and the session's address meanwhile (Section 18.2, S3). When the attempt was transmitted to more than one address pair, the response validates none of them, since which copy it answers is unknown, and its source is a candidate probed at once; a request restored from the record after a restart (Section 16.6.2) counts as transmitted to more than one pair.

  2. form echoes the request's form or is RETRY or CLOSED, except that a FRESH request is never answered by RETRY or CLOSED; flags valid for the form; target_gen echoes.

  3. Compute th_3. FRESH and CONTINUE: ss_fresh = Decap(ct_e) with dk; with prove_req, ss_req = Decap(ct_req) with the identity key. DISCOVER: ss_fresh = Decap(ct_e). RETRY, CLOSED: no decapsulation.

  4. Compute cs(g) (not for DISCOVER, RETRY or CLOSED), the sealing key (k_retry for RETRY, k_closed for CLOSED), and open the sealed part. Failure: drop and continue waiting; the attempt's retransmission schedule is unchanged.

  5. FRESH and CONTINUE: compute lineage_secret(g) and the keys; store prefix(i2r); derive rid(g, dir_in, 0..7) and rec(g, dir_in). If any is already in a lookup table (Section 15.1, collision), adopt nothing: abandon the attempt and send a new request for the same generation (a new FRESH, or a new CONTINUE that the responder serves afresh under Section 16.4), then stop. Otherwise install them provisionally: until the commit of step 6 is durable they are state of the attempt, not of the session, and no packet is processed under them (Section 16.4). CONTINUE_0RTT: the lineage already exists, and was checked before the request was sent (Section 16.3.2).

  6. Before committing generation g, validate and stage the sealed record the authenticated response carries (Section 16.6.3); then commit: persist the record atomically with the state transition that commits g, in the one write Section 16.4 requires. Neither the generation nor the record is authoritative until that combined write is durable; then, and not before, erase dk and every ss_*, apply the response's other objects and persist those that persist in the next write. If the combined write fails, or its outcome is uncertain, nothing is adopted and the attempt stays outstanding with the previous record in place: the provisional identifiers go, dk and the attempt's derived state stay with the attempt, in memory or rebuilt from its write-ahead record, the request is retransmitted on its schedule, the responder answers it from the reply cache, and the commit is attempted again on that response.

  7. Confirmation. Unless a protected packet under generation g has already been sent (CONTINUE_0RTT), send one immediately, a PROBE (Section 19) if there is no data, and repeat the PROBE at the probe interval until its PROBE_ACK arrives. Until the responder receives a packet under g it has not authenticated the requester; until the requester receives one it does not know that the responder committed, which is why the response is not evidence for the first epoch (Section 14.1).

  8. RETRY: discard any armed generation, then act on the reason (Section 16.3); IDENTIFIER_COLLISION is answered at once by a new request, as CONTINUE when the attempt was CONTINUE_0RTT, whose prekey is consumed. CLOSED: close with the carried reason (Section 19.6). DISCOVER: continue at Section 9.7.

9.3.9. Key Confirmation and Establishment

  • A response that opens proves to the requester that the responder holds every secret in cs(g): in FRESH, ss_peer and therefore the identity key ct_peer was encapsulated to; in the CONTINUE forms, cs(g - 1), and with prove_peer the identity key as well.

  • The first protected packet that authenticates under generation g proves to the responder that the requester holds every secret in cs(g): in FRESH, ss_req and therefore the requester's identity key; with prove_req in CONTINUE likewise.

  • The responder MUST NOT deliver application data from the requester, rely on the requester's identity for any purpose, or report the session as established before that packet. The grant it placed in the response is readable only by the holder of ss_req, so issuing it early commits the responder to nothing. It holds the exchange half-open until the packet arrives or anchor_timeout (Section 9.4) expires, whichever is first; on expiry it discards the half-open state, or, for a CONTINUE, the armed generation (Section 16.4).

  • Confirmation probe. Having sent a response toward the request's source address, validated or a candidate until its probe is answered (Section 15.7), the responder sends a PROBE (Section 19.2) under the armed generation and repeats it with doubling interval, from the probe interval (at least twice the session's exchange floor, Section 15.3) to 8 s, until a packet authenticates under the generation or the armed generation expires. If the response reached the requester, the requester has committed and answers with PROBE_ACK, which commits the generation at the responder without waiting for requester data; if the response was lost, a requester that cannot yet authenticate the probe drops it at no cost, and the requester's retransmitted request obtains the cached response. The probe is what keeps a session alive when the requester's packets toward the responder are being lost while the responder's reach the requester: without it the requester, having committed g, would re-anchor on rec(g, .), which the responder does not yet hold. The probe goes on the path the request arrived on (Section 16.4); toward an address that is not validated it is sent within the budget and probe floor of Section 15.4, and nothing else beyond the response is sent there; where the budget allows no probe, the requester's first packet commits the generation, as before.

  • The requester MAY send application data as soon as it has the lineage keys: after the response in FRESH and CONTINUE, with the request in CONTINUE_0RTT.

9.4. Fragmentation, Retransmission, Parity, and Limits

  • Size. An anchor message MUST NOT exceed MAX_MESSAGE = 8192 octets. Reassembly buffers are bounded by it.

  • Fragments. A message is sent as fragments of a frag_size the sender chooses (Section 10.4), default MAX_FRAGMENT. A requester on a path of known small MTU chooses a smaller frag_size; the responder mirrors it.

  • Parity. A sender MAY add the parity fragment of Section 10.4 to any flight of two or more source fragments. It SHOULD add it to every retransmission, a cached reply to the request's original address included (toward any other address the cached reply is within the reflection budget, which the parity fragment would exceed), and whenever the session's observed loss exceeds 2 %, on the first transmission of a request too; it MAY omit it otherwise. Observed loss is the fraction of sequence numbers missing among the protected packets received under the current generation, taken over windows of 64 packets and averaged with weight 1/4 for the newest window; it is kept in memory only, so that the first exchange after an outage benefits from the loss seen before it. Receivers MUST implement recovery.

  • Retransmission. The requester retransmits the whole request, byte-identical, when no response has been accepted after a retransmission interval: initially 1 s, or twice the path's smoothed round-trip time or twice the session's last anchor exchange time (Section 16.7) when either is longer, doubling to a cap of 16 s. While a fragment of the response is being reassembled the request is not retransmitted: the answer is on its way, and a copy of the request would only queue ahead of the rest of it on a slow link; the reassembly's own deadline, anchor_timeout, bounds the wait, and so does the attempt's life (Section 16.7): a response completed after the attempt ended commits nothing, and a response that fails to open restarts the timer. A FRESH or DISCOVER attempt is abandoned after 5 transmissions; CONTINUE attempts follow Section 16.7. A responder never retransmits on its own; a retransmitted request elicits the cached response.

  • Reply cache. The responder keeps the last response it sent for a session for reply_cache_ttl (Section 16.1), keyed by the request's bytes, with the request's source address, and persists it with the armed generation (Section 16.4). A cached response is sent on the routing key the original was sent on: to the recorded address without condition; to any other address only within the reflection budget of Section 15.4 toward that address, the retransmission credited to it and the reply debited, so that a requester that changed address during the exchange is answered where it now is and a replay from a third address obtains no more than the network already carried. Commit does not end the cache: a CONTINUE_0RTT requester that crashed after sending may need the response after the responder has committed on its early data, and a byte-identical retransmission is the only thing a cached response ever answers (Section 16.4).

  • Abandonment. A requester that abandons an attempt erases dk and treats the attempt's nonce and handshake identifier as consumed.

The bounds on the state these messages may hold before anything is authenticated are the following; Section 23 states the costs they bound.

9.4.1. Handshake Limits

Table 10
Held by a responder At most Expires
FRESH or DISCOVER exchanges per source address, in reassembly or awaiting confirmation 4 an incomplete message anchor_timeout after its first fragment (Section 16.1); half-open state after a response, anchor_timeout without a protected packet that authenticates
such exchanges in all an implementation parameter the same
FRESH exchanges per claimed requester identity, awaiting confirmation 4 the same

Reassembly state is keyed by (routing key, source address, msg_id) for every message type (Section 10.4), so that the fragments of two messages on one routing key, such as a requester's consecutive attempts, are never combined, and so that a datagram from another address can neither complete nor poison a message in reassembly. The bound per claimed identity exists because until confirmation the identity is only claimed (Section 9.3.5), and one forged identity sent from many addresses would otherwise fill the table (Section 23). A request that does not open, or is refused before a response is built, frees its half-open state at once, so that requests that cost their sender nothing hold none of these bounds against a requester behind the same address.

9.4.2. Recovery Limits

Recovery messages have a pool of their own, separate from the handshake pool.

Table 11
Held by an endpoint At most Expires
incomplete recovery messages per recovery identifier 4 anchor_timeout after the first fragment
incomplete recovery messages in all an implementation parameter, sized to the sessions the endpoint serves the same

The bound per identifier is the legitimate requester's own need: one attempt outstanding, at most its retransmission from a new address, and one successor within anchor_timeout. Four times the sessions in recovery is the legitimate peak, which sizes the global bound. There is no bound per source address, because members behind one address recover together. Recognising a recovery identifier exempts nothing from these bounds: the identifier is visible on the wire, and an incomplete message on it is unauthenticated.

9.4.3. Behaviour at a Bound

When a bound is reached, a new message is refused until one expires, and nothing is evicted, so that a stranger who knows an identifier can delay that session's recovery by at most anchor_timeout per message and cannot displace the requester's own. Reaching any bound discards no committed state and touches no established session, and, the pools being separate, a handshake flood cannot occupy the recovery pool. Implementations SHOULD give authenticated traffic and recovery their own processing capacity as well (Section 23).

9.5. Reflection Bound

A responder MUST NOT send, in reply to an unauthenticated request, more octets than it received in that request. Specifically:

  • A FRESH response is never larger than its request: the fixed parts of the response are smaller than those of the request, and objects that would exceed the bound are deferred (Section 9.3.7). A responder adds a parity fragment only under the rule of Section 10.4.

  • A DISCOVER request carries pad so that the response, which carries the responder's identity key, is no larger than the request.

  • No response of any kind is sent to a request that fails before its sealed part opens (FRESH) or before the message is complete (DISCOVER).

  • A CONTINUE request is authenticated under cs(g - 1) before any response, so its sender holds the session's secret, or replays one who does; its source address proves nothing (Section 23). Its response is no larger than the request toward an address the responder has not validated: proof of the requester adds ct_req, for which a request that offers the proof carries proof_pad and a request with prove_peer carries ct_peer, and a request with neither is answered RETRY PROOF_REQUIRED there. Replays of a CONTINUE request obtain at most the cached response, to the original source address or within the budget of Section 15.4 elsewhere, and nothing after reply_cache_ttl.

Together with the budget for unvalidated paths (Section 15.4) this bounds what an endpoint sends toward an address it has not validated to what it received from it, beyond the probe floor of Section 15.4 and apart from the anchor requests it initiates on its own schedules (Section 9.4 and Section 16.7); a validated path, and a previously validated address within validated_ttl (Section 15.3), send unbudgeted, so the bound against third-party reflection rests on path validation, on the expiry of previous validation and on the endpoint-wide budget, not on a ratio alone.

9.6. Simultaneous Open and Concurrent Sessions

9.6.1. Simultaneous Open

Two endpoints may send FRESH requests to each other at once. When an endpoint with an outstanding FRESH request to peer P receives a FRESH request from P, it compares its own identity fingerprint with P's as 48-octet big-endian integers:

  • If its own is lower, it ignores P's request and continues its own attempt, which P serves.

  • If P's is lower, it serves P's request as responder and keeps its own attempt: P's request is not authenticated until it is confirmed (Section 9.3.9), and a request forged in P's name must not cancel the endpoint's own (Section 22, I-21). When the session P initiated is confirmed, it abandons its own attempt if that is still outstanding (Section 9.4).

If, despite this rule, two sessions between the same identity pair complete within a short interval because the requests crossed before either side could compare, each endpoint closes the session initiated by the higher fingerprint with reason SUPERSEDED (Section 20) as soon as the other is confirmed. The rule is deterministic and needs no message.

9.6.2. Concurrent Sessions

Any number of sessions may exist between the same identity pair. They are distinguished by their routing keys and session identifiers and share no state except identity keys, the fleet secret, the freshness counter toward a given responder, and the prekey regeneration secret. A new session supersedes an older one only when Section 16.7 says so.

9.7. DISCOVER: First Contact with an Unknown Responder Key (OPTIONAL)

A requester that does not hold the responder's identity key MAY perform a DISCOVER exchange and then a FRESH exchange bound to it. Support is signalled by configuration, not by negotiation; a responder that does not implement it drops DISCOVER requests like any other unknown form.

9.7.1. Exchange

  1. Requester: FRESH prerequisites aside, build a DISCOVER request with a fresh ek and pad; th_0 uses an all-zero fp_peer.

  2. Responder: on the complete message, (ct_e, ss_fresh) = Encap(ek); derive k_disc; seal its identity key; respond to the request's source. It retains no state beyond the reassembly of the request and performs no decapsulation. DISCOVER is one of the three answers Section 11.7 permits to an unauthenticated request: it is bounded by pad, carries nothing secret, and changes no state. A responder that requires the pre-authentication tag (Section 9.3.4) does not serve DISCOVER, which cannot carry the tag, and DISCOVER skips the rk_hint check, which it has no field for.

  3. Requester: ss_fresh = Decap(ct_e); open; obtain peer_pk; compute the DISCOVER exchange's th_4; erase dk.

  4. Requester: perform a FRESH exchange to peer_pk with prior = th_4 of the DISCOVER exchange, a new ek, and a new handshake identifier. The responder uses prior as given; it is the requester's binding of what it was told to what it then keys.

9.7.2. Cost

One and a half round trips to requester data; two DISCOVER messages of about 3.2 KB each in addition to the FRESH exchange. The DISCOVER response is no larger than its request because of pad.

9.7.3. Trust

DISCOVER delivers a key, not trust in it. Before an endpoint relies on an identity it did not already hold, it applies one of:

  • Pin on first use. Record the fingerprint and require it thereafter. The first contact is unauthenticated against an active attacker; the deployment accepts that, as SSH deployments do.

  • Certificate after establishment. The holder of the key delivers its certification (Section 6: an ML-DSA-87 binding statement or an X.509 chain) as a CERT object (Section 19) over the established session, which exists at that point with keys and identifiers but carries no application data. The relying endpoint verifies it against its trust anchors before delivering application data or granting authorization, and closes with REPROOF_FAILED if verification fails or the object does not arrive within anchor_timeout. This applies equally to a responder that admitted an unknown initiator identity (Section 9.3.6).

Certificates never travel inside anchor messages, which keeps every anchor message within MAX_MESSAGE and keeps the reflection bound.

9.8. Properties

Stated here; argued in Section 23.

  • Mutual authentication by decapsulation. The responder is authenticated by ss_peer, the requester by ss_req; no signature is computed online in any form.

  • Key-compromise impersonation resistance. Each party's authentication rests on the other party's identity key through its own decapsulation, so compromise of one identity key does not allow impersonating the other party to its owner.

  • Forward secrecy from ss_fresh: the decapsulation key it was produced with (the ephemeral dk, or a single-use prekey) is erased after one use. Later compromise of both identity keys reveals ss_peer and ss_req but not ss_fresh.

  • Identity hiding. In FRESH the requester's identity is sealed under a key only the holder of the responder's identity key can derive, so it is hidden from passive observers and from active attackers without that key; the responder's identity is never transmitted except in DISCOVER. Limits: a later compromise of the responder's identity key reveals the identities in captured requests; flight sizes reveal that an exchange took place.

  • Transcript binding. The wire version, the suite, the intended peer identity, any preceding DISCOVER exchange (as prior) and the request cleartext are in th_1, which keys the request's sealing key and is its associated data; the sealed request and its tag extend the transcript to th_2, which enters the lineage secret and, for generation 0, the session root; the response cleartext extends it to th_3, which keys the response's sealing key and is its associated data; the sealed response and its tag extend it to th_4, which a FRESH exchange following a DISCOVER exchange carries as prior (Section 8.3). The continuity secret cs(g) takes the shared secrets of both messages' ciphertexts and no transcript hash (Section 8.4), so what the lineage confirms is the request and the secrets, not the response's cleartext: a response altered in its cleartext fails to open under k_resp, and a captured ciphertext cannot be reused with a different ephemeral key, but the lineage key confirms the response only through the secrets it carried. A request cannot be reinterpreted under another form.

  • Replay. A replayed FRESH request costs the responder one decapsulation, two during a rotation when rk_hint is 0, and obtains no response, unless it is byte-identical to one answered within reply_cache_ttl, in which case the cached response is resent at no public key cost, or it was never confirmed and its exchange has expired, in which case it is served again at the cost of a forged request (Section 9.3.5), to the original address without condition and to another within the reflection budget of Section 15.4; a replayed CONTINUE request likewise obtains at most the cached response under the same bound. A replayed or late response matches no attempt and costs the requester nothing (Section 9.3.8).

  • Reflection bounded by the budget of Section 15.4, the probe floor included (Section 9.5).

  • Deniability. No transferable proof of participation exists, since nothing is signed online.

  • Downgrade. One suite per version, implied by the identity key; the version and suite are in the transcript; an attacker who drops a higher-version request can only make the requester retry at a version it is configured to accept (Section 21).

  • Agility is by identity-key provisioning: a new suite is a new identity key of the new type, selected by rk_hint.

10. Packet Format and Header Protection

This section defines the wire format of every PQST packet and the header protection applied to protected packets. The anchor messages carried by handshake and recovery packets are defined in Section 9 using the encoding rules of Section 7; their packet-level framing is defined here. Bit 0 of an octet is its least significant bit.

All PQST packets are carried in UDP datagrams. One datagram carries exactly one PQST packet.

10.1. Common Header

Every PQST packet begins with a 12-octet common header:

CommonHeader = magic version type routing_key

magic       = 2OCTET     ; 0x5150
version     = OCTET      ; 0x14
type        = OCTET      ; packet type and reserved bits
                         ; (Section 10.1.1)
routing_key = 8OCTET     ; type-dependent (Section 10.1.2)

10.1.1. Type Octet

bits 0-1   packet_type   0 = PROTECTED, 1 = HANDSHAKE, 2 = RECOVERY,
                         3 = reserved for the cohort layer's
                         group packet (Section 26); defined only
                         by an extension enabled by capability
                         bit 0 (Section 21.1)
bits 2-7   reserved      MUST be 0

Receivers MUST drop, before any other processing, a packet whose magic or version does not match or whose reserved bits are non-zero. A receiver implementing only this document MUST likewise drop a packet whose packet_type is 3, which is reserved for a future extension (Section 21.1) and has no semantics here; an implementation of an extension that defines that type processes it only as the extension states, under the capability the extension requires. Dropping is silent: no response is sent and no state is changed.

10.1.2. Routing Key

The routing_key is the eight octets at offset 4 of every packet, regardless of type:

Table 12
packet_type routing_key Determined by
PROTECTED a RID of the receiving endpoint (Section 15.1), derived by both endpoints from the lineage secret and prefixed by the receiver the receiver's prefix and the lineage secret
HANDSHAKE the handshake identifier (Section 9) the initiator of the handshake
RECOVERY the recovery identifier (Section 16.2), derived from the continuity secret and prefixed by the receiver the receiver's prefix and the continuity secret

A demultiplexer or load balancer MAY route any packet by the routing_key alone and never needs to interpret packet_type. The only structure in a RID or recovery identifier is the receiver's prefix of zero to two octets (Section 15.1), fixed for the session and chosen by the endpoint that receives on it; the remaining octets are the output of a pseudorandom function and are unpredictable to anyone without the session's secrets. Nothing is signalled to allocate, retire or replace an identifier: both endpoints compute the same sequence, and the receiver installs identifiers in its lookup table by derivation, when a lineage is established and as its window slides after authenticated use (Section 15.1), never because a packet carried one.

The same property lets a third party forward datagrams it does not own: a forwarder that maps routing keys to next hops needs no session state and cannot distinguish the packets it forwards; because identifiers are derived, an endpoint can give a forwarder its next identifiers in advance. A path that traverses such a forwarder is, to both endpoints, an ordinary path (Section 15). This is the basis of the multipath and group end states described in Section 3.

10.1.3. Magic Value

The magic value identifies the protocol to a receiver that multiplexes several protocols on one port, and lets a misdelivered datagram be dropped before any lookup. It is not a security mechanism, and it is a static fingerprint for passive classification; Section 24 states this. It is retained deliberately: the two octets buy demultiplexing and debuggability, and hiding them would not hide the protocol, whose packet sizes and timing identify it anyway.

10.2. Protected Packets

A protected packet carries application data or control frames under the session's current traffic keys.

ProtectedPacket = CommonHeader masked_block ciphertext tag

masked_block = 16OCTET     ; PacketNumberBlock XOR mask
                           ; (Section 10.3)
ciphertext   = *OCTET      ; AEAD output over the plaintext
                           ; (Section 10.2.2)
tag          = 16OCTET     ; AEAD authentication tag

CommonHeader.packet_type is PROTECTED and CommonHeader.routing_key is a RID of the receiving endpoint (Section 15.1).

10.2.1. Packet Number Block

PacketNumberBlock = epoch_id seq stream_id pflags padding_len

epoch_id    = 4OCTET     ; lineage_gen (16 bits) || epoch_index (16
                         ; bits); Section 12.2
seq         = 8OCTET     ; sequence number within (direction,
                         ; epoch_id); Section 12.3
stream_id   = OCTET      ; 0x00-0xDF application-defined; 0xE0-0xFD
                         ; reserved for protocol-defined upper layers
                         ; (Section 25); 0xFE = STREAM_CONTROL
                         ; (Section 10.5); 0xFF = STREAM_DUMMY
pflags      = OCTET      ; reserved; MUST be 0
padding_len = 2OCTET     ; number of padding octets at the end of the
                         ; plaintext

The block exists in two forms. The plaintext form is used as associated data (Section 10.2.2) and is never transmitted. The masked form (Section 10.3) is transmitted in masked_block.

10.2.2. AEAD Construction

key       = AEAD key for (direction, epoch_id)
            ; Section 8
nonce     = iv(direction, epoch_id) XOR (epoch_id || seq)
            ; Section 12.1
aad       = magic || version || type || PacketNumberBlock
            ; 20 octets, plaintext form; the routing key is excluded
plaintext = payload || padding
ciphertext || tag = AEAD-Encrypt(key, nonce, aad, plaintext)
  • padding is padding_len octets at the end of the plaintext. Padding octets MAY be zero: their content carries no information, because they are encrypted and authenticated with the rest of the plaintext. Receivers MUST discard them after authentication, and they MUST NOT influence parsing.

  • stream_id selects what payload is. 0x00 to 0xDF: application data for that stream. 0xE0 to 0xFD: data for the protocol-defined upper layer registered for that value (Section 25); a receiver that implements no layer for the value MUST discard the payload after authentication and SHOULD count it. 0xFE (STREAM_CONTROL): a sequence of control frames (Section 10.5). 0xFF (STREAM_DUMMY): a dummy packet whose payload receivers MUST discard after authentication.

  • Dummy packets and control packets MUST consume sequence numbers and MUST be subject to replay protection exactly as other packets.

  • Because the plaintext form of the block is associated data, epoch_id, seq, stream_id, pflags and padding_len are all authenticated by the tag, and no copy of them is carried inside the plaintext.

  • The routing key is deliberately not associated data. Every identifier of one session, generation and direction resolves to the same keys, so binding one of them into the tag would add nothing; leaving it out lets a sender transmit one encryption of a packet on several paths, each copy carrying that path's identifier (Section 15.7), with no second AEAD operation and therefore no nonce reuse. A packet relabelled with another identifier of the same session, generation and direction is the same packet, and the replay window treats it as such.

10.2.3. Size Constraints

MIN_PACKET_SIZE   = 12 + 16 + 16 = 44 octets
                    ; a protected packet with an empty payload
INITIAL_PATH_MTU  = 1200 octets
                    ; a sender's bound on a path until probing
                    ; raises it
MAX_PAYLOAD(path) = path_mtu - 44 - padding_len
  • A sender MUST NOT send a protected packet larger than the path's current MTU. That value is INITIAL_PATH_MTU for every new path and rises only when a probe has validated a larger size (Section 15.5); it never exceeds what the local interface can send.

  • A receiver MUST drop PROTECTED packets shorter than 44 octets and message packets shorter than 18 (the 12-octet common header, the 5-octet message header and one octet of a fragment; the last fragment of a message is not padded, Section 10.4), and any packet longer than its local maximum, which is the largest datagram its interface can deliver, before performing any cryptographic operation. These checks precede all others. The receiver's bound is local and is deliberately not the sender's path MTU: a receiver accepts any size it can deliver, which is what makes MTU probing possible.

10.3. Header Protection

Header protection hides PacketNumberBlock from observers. It provides confidentiality for the block only; integrity comes from the block's inclusion in the associated data.

10.3.1. Keys

Two header-protection keys exist per lineage, one per direction, hp_i2r and hp_r2i, derived from the lineage secret as defined in Section 8. Header-protection keys are not changed at an epoch advance (Section 14); they are replaced when a re-anchor creates a new lineage (Section 16). The receiver therefore always knows which key applies before it unmasks: the RID identifies the session and the lineage.

10.3.2. Mask

sample       = the first 16 octets of (ciphertext || tag)
mask         = AES-256-Encrypt(hp_key, sample)
               ; one raw block encryption of the 16-octet sample
masked_block = PacketNumberBlock XOR mask

The sample always exists: a protected packet with an empty payload has a 16-octet tag. The sample is AEAD output under a nonce that is unique per packet, so the mask is unique per packet with overwhelming probability.

10.3.3. Sender Procedure

  1. Allocate (epoch_id, seq) for the direction (Section 12.3).

  2. Build PacketNumberBlock in plaintext form; build aad from the first four octets of the common header and the block.

  3. Compute nonce (Section 12.1).

  4. ciphertext || tag = AEAD-Encrypt(key, nonce, aad, payload || padding).

  5. mask = AES-256-Encrypt(hp_key, (ciphertext || tag)[0:16]).

  6. Transmit CommonHeader || (PacketNumberBlock XOR mask) || ciphertext || tag.

Step 4 precedes step 5 because the mask depends on the ciphertext; there is no circularity.

10.3.4. Receiver Procedure

The receiver procedure, including the single-attempt rule, is defined in Section 11. The values obtained by unmasking are hints for key selection and nonce construction until the AEAD succeeds; they MUST NOT change any state before that point.

10.3.5. Properties

  • Without hp_key, masked_block is indistinguishable from 16 uniformly random octets.

  • Modification of any octet of masked_block by an attacker changes the nonce or the associated data, causes the AEAD to fail, and changes no authoritative state (Section 11.7).

  • Changing the routing key to another identifier of the same session, generation and direction yields the same packet on another path; changing it to anything else fails the lookup or the AEAD.

  • A passive observer sees, per packet: magic, version, type, the routing key (for a protected packet, a RID including any receiver prefix), 16 pseudorandom octets, and the packet's length and timing. Section 24 states what these permit an observer to learn.

10.4. Handshake and Recovery Packets

Handshake packets (Section 9) and recovery packets (Section 16) carry anchor messages (Section 9.1) that may exceed one datagram. They share one framing:

MessagePacket = CommonHeader message_header fragment

message_header = msg_type frag_index frag_count msg_id
                 ; 5 octets
msg_type       = OCTET      ; message type; values in Sections 9
                            ; and 16
frag_index     = OCTET      ; 0-based index of a source fragment; the
                            ; value frag_count denotes the parity
                            ; fragment
frag_count     = OCTET      ; number of source fragments of the
                            ; message, at least 1
msg_id         = 2OCTET     ; identifies the message among those the
                            ; sender has in flight on this routing
                            ; key; the same in every fragment and in
                            ; every retransmission of the message
fragment       = *OCTET     ; at most frag_size octets
MAX_FRAGMENT = 1183 octets      ; so that a message packet, 12 + 5 +
                                ; 1183, is at most 1200 octets
MIN_FRAGMENT = 512 octets
  • Every anchor message begins with msg_len, a 2-octet count of the octets in the message including msg_len itself (Section 9.1), so that the zero padding a last fragment recovered through the parity fragment carries can be trimmed. That is the only padding a reassembled message has: otherwise msg_len equals the reassembled length, and a message whose msg_len is anything else is malformed and MUST be dropped.

  • The sender chooses frag_size, with MIN_FRAGMENT <= frag_size <= MAX_FRAGMENT, and splits the message into frag_count source fragments of exactly frag_size octets, except the last, which carries the remainder (between 1 and frag_size octets). frag_count is the smallest count that holds the message, and at least 1. Every anchor request is longer than MAX_FRAGMENT, so every request has at least two source fragments and the responder learns frag_size from any fragment other than the last source fragment; a response may be a single fragment. Reassembly itself needs only the index order.

  • A sender MAY add one parity fragment to a message of two or more source fragments, with frag_index = frag_count: the bitwise exclusive-or of all source fragments, each zero-padded to frag_size, so that it is exactly frag_size octets. A receiver holding all but one source fragment together with the parity fragment MUST recover the missing source fragment by exclusive-or, trimming the result with msg_len if it is the last. Receivers MUST implement recovery; whether to send a parity fragment is the sender's decision per flight (Section 9.4).

  • frag_index MUST NOT exceed frag_count. A packet violating this, or whose fragment is longer than MAX_FRAGMENT, MUST be dropped.

  • msg_id tells the fragments of one message from those of another on the same routing key and from the same source, which a receiver MUST reassemble separately (Section 9.4): a requester's consecutive attempts travel on one recovery identifier, and the fragments of an attempt it has abandoned may still be in flight when the next one is sent. A sender sets msg_id to the first two octets of H(message), SHA-384 over the complete message as sent, from msg_len on, so that a retransmission carries the same value; the receiver treats it as opaque. Without it, fragments of two messages of equal length combined through the parity fragment into a message that parsed but did not open, and cost the requester a decapsulation.

  • A responder MUST NOT use a frag_size larger than the frag_size of the request it is answering, and MUST NOT add a parity fragment unless the request carried one or its reply is otherwise no larger than the request. A reply is therefore never larger than the message that elicited it (Section 9.5).

  • Reassembly, retransmission and the limits on half-open state are defined in Section 9.4 and apply to both packet types.

  • routing_key is the handshake identifier for HANDSHAKE packets and the recovery identifier for RECOVERY packets. All fragments of one message carry the same routing_key.

The 1200-octet bound is chosen so that a message packet fits the IPv6 minimum MTU with IP and UDP headers; the 512-octet floor lets a flight cross a link with a smaller MTU at the cost of more fragments. Message packets are never padded.

10.5. Control Frame Framing

Within a protected packet whose stream_id is 0xFE (STREAM_CONTROL), payload is one or more control frames:

ControlFrame = ctrl_type length ctrl_data

ctrl_type = OCTET
length    = 2OCTET     ; length of ctrl_data in octets
ctrl_data = *OCTET

A control frame MUST be fully contained in one packet. A control packet MUST carry at least one frame. Receivers MUST drop, after authentication and after the replay commit (Section 11.4, step 15), a control packet whose payload is empty or whose declared frame lengths do not exactly consume payload. Control frame types and their ctrl_data formats are defined in Section 19. Carrying control frames on a reserved stream identifier rather than signalling them with a flag keeps dispatch a function of stream_id alone and leaves every pflags bit free.

11. Receiver Processing

This section defines how an endpoint processes an incoming datagram. Its purpose is to make the cost of every unauthenticated input bounded and small, and to make every state change depend on authentication.

11.1. Processing Order

Receivers MUST process an incoming datagram in the following order and MUST stop at the first failing step. "Drop" means: discard the datagram, send nothing, change no protocol state, and at most increment a counter.

  1. Size. Drop if shorter than 18 octets, the common header, the message header and one octet of a fragment, or longer than the receiver's local maximum (Section 10.2.3).

  2. Common header. Parse the 12-octet common header. Drop on a magic or version mismatch, on non-zero reserved type bits, or on packet_type 3 unless the receiver implements the extension that defines it (Section 21.1); such a drop leaves no trace but a counter.

  3. Dispatch by type. PROTECTED packets shorter than 44 octets (MIN_PACKET_SIZE, Section 10.2.3) are dropped; the others continue at Section 11.2. HANDSHAKE and RECOVERY packets continue at Section 11.5.

11.2. Protected Packets: The Single-Attempt Pipeline

  1. Session lookup. Look up routing_key as a RID. The lookup yields the session, the lineage the RID belongs to, and the receive direction. On a miss, drop. Receivers MUST NOT attempt decryption, unmasking or any key derivation for an unknown RID. RIDs enter the lookup table only by derivation, at lineage establishment and as the window slides after authenticated use (Section 15.1), never because a packet carried them.

  2. Unmask. With hp_key the header-protection key of the lineage and receive direction (Section 10.3.1): mask = AES-256-Encrypt(hp_key, (ciphertext || tag)[0:16]); block = masked_block XOR mask; parse block as PacketNumberBlock.

  3. Pre-authentication filter (Section 11.3). Drop on any failure. This step reads state and MUST NOT write any.

  4. Key selection. Select the AEAD key and IV for (direction, epoch_id). If epoch_id is the next epoch and its keys have not yet been derived, derive them now (Section 14.3). This is the only key derivation an unauthenticated packet can cause, it happens at most once per epoch, and its result is retained.

  5. Nonce and AAD. nonce = iv XOR (epoch_id || seq); aad = CommonHeader[0:4] || block, the routing key excluded (Section 10.2.2).

  6. AEAD. Perform exactly one AEAD-Decrypt(key, nonce, aad, ciphertext || tag). On failure, drop. Receivers MUST NOT retry with another key, epoch, sequence number or nonce. Every state change in the remainder of this section is conditional on this step succeeding.

  7. Post-authentication processing (Section 11.4).

11.3. Pre-Authentication Filter

The filter rejects, before the AEAD, packets that cannot be valid. It is a cost filter, not a security boundary: a packet that passes it gains nothing, and a packet that fails it is merely dropped early. All checks are pure functions of the block and of receiver state.

  • pflags MUST be 0; all eight bits are reserved.

  • epoch_id MUST be in the receive direction's permitted set (Section 14.2): the current epoch, the next epoch, and the previous epoch while its overlap period is active.

  • seq MUST satisfy WouldAccept(direction, epoch_id, seq) (Section 13.3), the non-mutating form of the replay check.

  • padding_len MUST NOT exceed the plaintext length, which is the length of ciphertext.

Without hp_key, an attacker's block is uniformly random after unmasking, and the probability that a random block passes the filter is at most about 2^-80. The cost of a packet that fails the filter is one table lookup and one block-cipher invocation.

11.4. Post-Authentication Processing

After step 9 succeeds, in this order:

  1. Replay commit. Check(direction, epoch_id, seq) (Section 13.4), the mutating form of the replay check. If it reports a duplicate, drop and count it (Section 12.5): at a receiver that serializes the packets of a direction it cannot, since step 6 dropped the duplicate before the AEAD; at one that processes them concurrently, a copy that passed step 6 before another committed is dropped here.

  2. Epoch commit. If epoch_id is the next epoch, advance the receive epoch as defined in Section 14.4.

  3. Path handling. If the datagram's source address differs from the path the RID was last seen on, apply Section 15.3 (candidate path). Path state is updated only here, after authentication.

  4. Padding. Remove the last padding_len octets.

  5. Dispatch by stream_id. 0xFF: discard the payload. 0xFE: parse and process the control frames (Section 19); a control packet whose payload is empty or whose frames do not exactly consume the payload is dropped at this point, after its replay commit. 0xE0 to 0xFD: deliver the payload to the upper layer registered for the value, or discard it if none is implemented. 0x00 to 0xDF: deliver the payload to the application for stream_id.

A control frame that fails its own validation (Section 19) MUST NOT affect session state; the packet's replay commit (step 11) stands.

11.5. Handshake and Recovery Packets

  1. Framing. Parse message_header. Drop if frag_index > frag_count or if the fragment is longer than MAX_FRAGMENT (Section 10.4).

  2. Association. HANDSHAKE: associate by (source address, routing_key). RECOVERY: look up routing_key as a recovery identifier (Section 16.2), as a stale identifier kept for the reply cache (Section 16.4), as a tombstoned recovery identifier (Section 19.6), or, for an AnchorResponse, as the resp_rid of an outstanding attempt (Section 9.3.8). On a miss, drop, with one exception: if the fragment is the first fragment of a request that carries a sealed record and the receiver is configured to serve from records (Section 16.6), the receiver unseals and verifies the record before allocating any state, and drops if that fails; a verified record permits reassembly state only, and the session is created once the complete request opens (Section 16.6.3). Receivers MUST NOT otherwise allocate state for a RECOVERY packet whose routing key is unknown. HANDSHAKE, at a responder requiring the pre-authentication tag (Section 9.3.4): a fragment of a request not yet verified that is not fragment zero, the parity fragment included, is dropped here without allocation; fragment zero is checked as Section 9.3.2 says before any state is allocated, and once it has passed, the request's other fragments are stored in any order. "First fragment" throughout means frag_index 0, not the first to arrive. Reassembly state is keyed by (routing_key, source address, msg_id) in both packet types (Section 9.4).

  3. Reassembly. Store the fragment subject to the limits in Section 9.4: the handshake pool's per-source and global bounds, the recovery pool's per-identifier and global bounds, each pool separate, a bound reached refusing the new message and evicting none. The first fragment that is not the last source fragment fixes frag_size, in whatever order fragments arrive; a fragment inconsistent with it drops the reassembly: a source fragment other than the last, or the parity fragment, of any other length, or a last source fragment longer than frag_size, including one stored before frag_size was known. When all source fragments are present, or all but one together with the parity fragment, reassemble in index order, recovering a missing fragment by exclusive-or if needed (Section 10.4); trim a last fragment so recovered to msg_len, drop a message whose msg_len differs from its length otherwise, and process the message as defined in Section 9 (handshake) or Section 16 (recovery). A message is processed at most once.

The public key operations a handshake or recovery message causes are bounded by the message definitions themselves (Section 9 and Section 16) and are never performed on an incomplete message.

11.6. Resource Bounds

Implementations MUST enforce the following bounds. They are what make the receiver's cost per datagram bounded regardless of its contents.

Table 13
Resource Bound
AEAD operations per protected packet at most 1: exactly one for a packet that reaches the AEAD stage, none for one dropped before it (Section 11.2), never a retry under another key or epoch
Block-cipher operations per protected packet before the AEAD at most 1: exactly one for a packet whose routing identifier is known, none otherwise
Key derivations caused by one protected packet at most one epoch derivation (one chain step and its traffic keys), only when the next epoch is first named
Public key operations caused by one message packet 0; operations are performed on complete messages only
Public key operations caused by a forged, replayed or unconfirmed handshake message none for a byte-identical retransmission the reply cache answers; for a request that does not open, or whose counter is stale, one decapsulation per identity key the responder holds, so two during a rotation when rk_hint is 0 (Section 23.4), the per-identity freshness counter (Section 9.3.5) being checked before any encapsulation or reply; for a request that opens with a fresh counter, which anyone holding the responder's public key and an authorized identity's fingerprint can make, the serve: that decapsulation, two encapsulations, the key schedule and a response of at most the request's size, with the write-ahead of Section 16.4 as its one durable write and nothing keyed by the claimed identity changed, at most 4 outstanding per source address and 4 per claimed identity (Section 9.4)
Public key operations caused by a DISCOVER request, where served one encapsulation and no decapsulation (Section 9.7.1), at no more than the request's size in reply
Public key operations caused by a replayed CONTINUE request at a responder serving from sealed records those of one serve, at most once per anchor_timeout per request: the serve's state answers further replays from the reply cache (Section 16.6.3)
Session lookup constant or logarithmic time; linear search is not conformant
Replay window operations constant time in the window size
Allocation driven by a length field none before the field has been validated against the datagram length
Half-open handshake state per source address and globally; reassembly buffer per message bounded as defined in Section 9.4; a message by MAX_MESSAGE
Incomplete recovery messages per recovery identifier and globally at most 4 per identifier; a global implementation parameter, a pool separate from the handshake pool (Section 9.4)
Effect of a pool's exhaustion the new message refused, nothing evicted; no committed state discarded, no established session touched
Rate of accepted unknown-RID, malformed and failed-AEAD packets counted; implementations SHOULD rate-limit sources that exceed a threshold

11.7. The State-Mutation Rule

No unauthenticated datagram changes authoritative session state: the committed generation and the armed one, the committed receive epoch, the replay window, paths and their validation, routing identifiers, session allocation, grants, and the freshness marks of Section 9.3.5. Before the AEAD has succeeded on a datagram the receiver does only the bounded work this section and Section 9.4 name, and a datagram that fails the AEAD leaves no trace in authoritative state. The bounded work is: parsing, lookup and the one block-cipher and one AEAD operation of Section 11.2; the one-time derivation of the next epoch's traffic keys when a packet first names that epoch (Section 11.2, step 7), whose cached result advances nothing, the receive epoch moving only when a packet under it authenticates (step 12); reassembly state for a handshake or recovery message within the limits of Section 9.4, discarded at its deadline; and the three transmissions below. Processing an unauthenticated datagram never causes an unbounded increase in memory, retained state or cryptographic work.

A receiver MUST NOT, on the basis of an unauthenticated packet: advance an epoch; slide, clear or mark a replay window; create, promote, validate or retire a path; install or retire a RID; allocate session state; commit or discard a generation; move a freshness mark; issue, extend or revoke a grant; or send a response.

There are exactly three transmissions that an unauthenticated datagram may cause. The first is the cached reply to a byte-identical retransmission of an answered anchor request (Section 9.4), which repeats octets the network has already carried: to the request's original address, or to another address within the reflection budget of Section 15.4 toward it. The second is a tombstone's CLOSED answer to a request on a closed session's recovery identifier (Section 19.6), which is under a hundred octets (56 in Appendix D.11), commits no state and is sent only to the request's source. The third, at a responder configured to serve it, is the DISCOVER response (Section 9.7), which carries only the responder's public identity key, is no larger than its request, commits no state and is sent only to the request's source. Section 22 lists this rule as an invariant; Section 13 and Section 14 define the two-phase checks that implement it for sequence numbers and epochs. The invariant is testable as a comparison: the authoritative state of an endpoint before and after an unauthenticated datagram is the same, whatever the datagram contained and whatever bounded work it caused.

11.8. Constant-Time Requirements

Comparison of authentication tags is performed by the AEAD. The replay bitmap operations and the filter comparisons MUST NOT branch on secret key material. Timing differences between "dropped by the filter" and "dropped by the AEAD" reveal only whether the sender holds hp_key, which the sender already knows, and are acceptable.

12. Nonce Construction and Sequence Numbers

12.1. Nonce

PQST uses a 96-bit AEAD nonce, constructed for each protected packet as:

nonce = iv XOR (epoch_id || seq)
  • iv is the 12-octet IV for the packet's direction and epoch, derived from the key schedule (Section 8).

  • epoch_id is the 32-bit epoch identifier (Section 12.2) and seq the 64-bit sequence number (Section 12.3), both big-endian, concatenated to 12 octets.

This construction is mandatory and MUST be implemented exactly as specified. Both endpoints construct the nonce from the same (epoch_id, seq): the sender from its allocation state, the receiver from the unmasked packet number block (Section 11.2). Nonce uniqueness is required independently for each direction, because each direction has independent keys and IVs.

12.2. Epoch Identifier

epoch_id = lineage_gen (16 bits, high) || epoch_index (16 bits, low)
  • lineage_gen is the generation of the session's continuity secret (Section 16). It is 0 for the lineage created by the handshake and increases by exactly 1 at each successful re-anchor.

  • epoch_index is the epoch within the lineage. It is 0 for the first epoch of a lineage and increases by exactly 1 at each epoch advance (Section 14).

Because lineage_gen occupies the high bits, epoch_id is strictly increasing over the life of a session across both epoch advances and re-anchors. Every rule in this specification that compares epochs compares the 32-bit value.

  • The sender MUST NOT advance epoch_index beyond 0xFFFF. If epoch_index reaches 0xFFFF, the endpoint MUST perform a re-anchor (Section 16) before that epoch's sequence limit (Section 12.4) is reached, and MUST NOT send further packets in the lineage once the limit is reached.

  • If lineage_gen would exceed 0xFFFF, the session MUST be closed with reason SESSION_LIFETIME (Section 20) and a new handshake performed.

12.3. Sequence Numbers

For each direction, the sender maintains (epoch_id, seq) for its current sending epoch.

  • seq starts at 0 in every epoch and MUST increase by exactly 1 for each packet sent, including dummy packets and packets carrying only control frames.

  • (epoch_id, seq) MUST NEVER repeat for a given direction. This is the sender's responsibility and the single most important rule in this specification: a repeat is an AEAD nonce reuse.

  • Allocation of (epoch_id, seq) MUST be linearizable (Section 12.6): no two packets may be allocated the same pair, and no packet may be allocated a pair from an epoch whose keys it does not use.

  • A future packet type in which several senders share one key (Section 10.1.1, type 3) will partition seq, for example by reserving its high 16 bits for a sender index, so that senders have disjoint nonce spaces. That reservation does not change the formula above for protected packets.

12.4. Per-Epoch Limits

The AEAD is AES-256-GCM, whose confidentiality bound degrades with the number of packets encrypted under one key (Section 6.6 of [RFC9001]; Section 5.5 of [RFC9846]).

  • A sender MUST NOT encrypt more than 2^23 packets under one (direction, epoch_id).

  • A sender MUST advance the epoch (Section 14.1) no later than seq = 2^23 - 2^20. The margin is the forward acceptance bound F of Section 13.2, so that every sequence number a receiver can accept lies within the epoch's limit.

  • Epoch overlap (Section 14.4) does not increase the number of packets that may be encrypted under an epoch's keys.

  • The integrity bound of AES-256-GCM is 2^52 forgery attempts per key, the limit Section 6.6 of [RFC9001] sets for QUIC from the analysis of Appendix B.1 of [RFC9001]. The pre-authentication filter (Section 11.3) rejects almost every forgery whose header an attacker had to guess, but not one made from a captured packet with its tag altered, which passes the filter as often as it is sent while the packet's sequence number is uncommitted (Section 23.2); a receiver therefore counts the failed verifications under each generation's receive keys and, should the count reach 2^52, retires the keys by a re-anchor and accepts nothing under them from that count on, whether or not the re-anchor that replaces them completes: a session whose re-anchor fails recovers by the schedule of Section 16.7, under new keys. The count is a bookkeeping of the bound, not a defence against the cost of the attack, which Section 23.2 states.

seq is carried as 64 bits on the wire so that the nonce formula is fixed-width; values at or above 2^23 are never valid and are rejected by the filter.

12.5. Duplicates at the Receiver

Nonce uniqueness is the sender's responsibility (Section 12.3, Section 12.6 and Section 12.7), and it is enforced at the sender, not detected at the receiver: a receiver cannot tell a sender's reuse from a duplicate the network made, and it does not try.

  • A packet whose (epoch_id, seq) is already accepted in the replay window is dropped by WouldAccept before the AEAD (Section 11.2, step 6; Section 13.4), so a second packet under a nonce the receiver has accepted is never authenticated, whatever it carries. Receivers MUST discard it and SHOULD count it, as a replay or a duplicate.

  • The mutating check of Section 11.4, step 11, reports a duplicate only at a receiver that processes the packets of one direction concurrently, where two copies passed WouldAccept before either committed; the later is dropped and counted the same way.

  • A receiver retains no tags and compares no ciphertexts, and no count of duplicates closes a session: the duplicates are unauthenticated, so a close on them would let anyone who captured packets close the session by replaying them, and the retention that would detect a sender's fault after the fact would be paid on every packet for a fault a conforming sender cannot commit.

12.6. Linearizability and State Coupling

  • allocate(direction) -> (epoch_id, seq) and install_epoch(direction, epoch_id, key, iv) MUST be linearizable with respect to each other: every packet is encrypted with the key, IV and (epoch_id, seq) of a single, consistent epoch snapshot.

  • Implementations SHOULD bundle epoch_id, key, IV and the sequence counter into one immutable snapshot that is installed atomically, so that the coupling cannot be violated by construction.

  • In multi-threaded implementations, epoch installation MUST be performed by a single owner (the session's I/O context); other components request an advance and never mutate epoch state directly.

  • There MUST NOT be any window in which a packet could be encrypted with a nonce from one epoch and the key of another.

12.7. Fail-Closed on Loss of Sequence State

A sender that cannot prove continuity of its (epoch_id, seq) state, for example after a crash or an unclean shutdown, MUST NOT send any packet under any previously used epoch. The only permitted recovery is a re-anchor (Section 16), which creates a new lineage with fresh keys, or a new handshake. Persisting sequence counters in order to resume an epoch is not permitted; Section 16.6 defines the only state that survives a restart.

A generation re-created after its sending state was discarded, from the continuity record after a restart or from a kept attempt's state after entry to DORMANT (Section 16.3.2), is receive-only. A restart re-creates only an armed generation and one an outstanding CONTINUE_0RTT request had derived (Section 16.6.2), from the cs and lineage_secret the record keeps for them; the committed generation is kept as its continuity secret alone, its identifiers and keys not re-created, so that packets the peer sends under it are dropped as unknown until the re-anchor that follows the restart. A re-created generation is receive-only: the endpoint sends nothing under it, for the reason above, but keeps its receiving identifiers and keys so that packets the peer sends under it still authenticate, and so that a generation the peer holds committed is not lost. It delivers nothing under it either: its replay window is empty when it is re-created, so a packet the peer sent before, replayed, would be delivered a second time (Section 16.6.2).

As soon as such a generation commits, by a packet from the peer, by a request that opens under it or by the endpoint's own response opening, the session re-anchors (Section 16.6.2); the new generation is the first one that sends. Until it does, the session is RECOVERING whatever its paths, and the recovery schedule drives the re-anchor. Without this rule, a restored generation committed by a request that opened under it would leave a session ESTABLISHED and unable to send for the rest of its life, and a restored session whose one attempt failed would sit the same way. The rule is enforced where packets are built, for every kind of packet, and the lineage of a restored generation is never derived again as a sending one: the prekey a CONTINUE_0RTT request consumed is erased with the write that arms the generation (Section 16.4), and a restored generation is displaced by a re-served request only once that request's generation is written. Anchor messages are not packets under a generation and may be retransmitted after a restart.

13. Replay Protection

Replay protection in PQST uses only (epoch_id, seq). It requires no clock and no timestamp, and it is enforced identically on every path a session uses.

13.1. Windows

  • Each endpoint maintains, for each receive direction and each epoch in that direction's permitted set (Section 14.2), one replay window: the highest accepted sequence number last_seq, and a bitmap of W bits recording which of the W sequence numbers at or below last_seq have been accepted.

  • Windows are per epoch. A window is created when its epoch first becomes permitted and discarded when the epoch leaves the permitted set (Section 14.5). Windows are never reset or copied between epochs.

  • Windows belong to the session, not to a path. All paths of a session share one window per (direction, epoch); a path change never creates, resets or modifies a window (Section 3, ownership rule). This is also what makes redundant transmission on several paths safe: the second copy is a duplicate and is dropped.

13.2. Parameters

W   replay window size in packets   64 <= W <= 65536, default 4096
F   forward acceptance bound        default 2^20
  • W bounds how far behind last_seq a late packet may arrive and still be accepted. It MUST be large enough to cover the reordering the session's paths can produce. When a session may hold several paths (Section 15), W MUST exceed the packet rate multiplied by the largest round-trip-time difference between those paths, so that packets on a slower path are not rejected as old. The default of 4096 covers about 4 ms of reordering at one million packets per second and several seconds at typical rates.

  • F bounds how far ahead of last_seq the pre-authentication filter will pass a packet. It exists only to keep the filter's false-positive rate low; it is not a security boundary. A legitimate burst loss of up to F packets is tolerated without any recovery. F MUST be less than the per-epoch limit of Section 12.4; the default leaves a margin of 2^20 below 2^23.

Neither parameter is negotiated. Each endpoint chooses its own receive-side values.

13.3. WouldAccept: The Non-Mutating Check

WouldAccept(direction, epoch_id, seq) is evaluated in the pre-authentication filter (Section 11.3). It returns true if and only if:

  • epoch_id is in the direction's permitted set, and

  • seq < 2^23, and

  • seq + W > last_seq (the packet is not too old; computed in this form to avoid underflow), and

  • seq <= last_seq + F (the packet is not too far ahead), and

  • if seq <= last_seq, the bit for seq is not set (the packet is not already accepted).

WouldAccept MUST NOT modify last_seq, the bitmap, or any other field. Implementations MUST be able to show, by test, that a sequence of WouldAccept calls leaves the window byte-for-byte unchanged.

For an epoch whose window does not yet exist (the next epoch, Section 14.3), WouldAccept is evaluated against an empty window with last_seq = 0 and no bits set, which accepts 0 <= seq <= F.

13.4. Check: The Authoritative Check

Check(direction, epoch_id, seq) is evaluated only after the AEAD has succeeded (Section 11.4, step 11). It MUST return the same decision WouldAccept returned for the same inputs with the same state, and on acceptance it mutates the window:

  • If seq > last_seq: slide the bitmap forward by seq - last_seq positions (clearing it entirely if the distance is at least W), set last_seq = seq, and set the bit for seq.

  • If seq <= last_seq: set the bit for seq.

Check MUST be called exactly once per authenticated packet and never for a packet that failed authentication.

13.5. The Two-Phase Rule

The split between WouldAccept and Check is a security requirement, not an optimisation. Because seq is carried on the wire, an attacker who could cause the window to advance before authentication could, with one forged packet carrying a large seq, slide the window past every legitimate in-flight packet and end the session. Therefore:

  • Phase one (WouldAccept) MUST be side-effect free.

  • Phase two (Check) MUST be reached only through a successful AEAD.

  • Phase one MUST accept everything phase two would accept, so that no legitimate packet is dropped by the filter.

  • A forged packet that fails the AEAD MUST leave last_seq, every bitmap, and every epoch-permission state byte-for-byte unchanged.

An authenticated forward jump of any size up to F is accepted: it is burst loss, and rejecting it would convert packet loss into session loss. Jumps beyond F cannot be accepted by the data plane; the session recovers by re-anchor (Section 16), which starts a new lineage.

13.6. Epochs and Overlap

  • A packet is checked against the window of the epoch it names. Windows of different epochs are independent; the sequence spaces are disjoint by construction (Section 12.2).

  • When the receive epoch advances (Section 14.4), the previous epoch's window is retained for the overlap period and continues to reject duplicates within it; the new epoch's window starts empty.

  • When an epoch leaves the permitted set, its window is discarded together with its keys. No packet naming that epoch can be accepted afterwards, so nothing is lost by discarding the window.

13.7. Handshake and Recovery Messages

Replay protection for handshake messages is provided by the per-identity freshness counter and the single-use ephemeral key of Section 9.4; for recovery messages by the single-use recovery identifier and generation counter of Section 16.5. Neither uses the windows of this section.

14. Epochs and Key Advance

An epoch is one set of traffic keys within a lineage. Epochs bound the number of packets encrypted under one key (Section 12.4). Advancing an epoch costs no bytes on the wire and no round trip: the packet names its epoch, the keys of the next epoch are derivable from those of the current one, and a successful AEAD under the next epoch's keys is the authentication of the advance.

14.1. Sender Rules

For each direction, an endpoint has a sending epoch e.

  • An endpoint MAY advance its sending epoch from e to e + 1 whenever it holds the evidence below, and MUST do so before seq reaches 2^23 - 2^20 in epoch e (Section 12.4). Policy MAY also advance on a time or volume threshold.

  • Evidence. An endpoint MUST NOT advance its sending epoch from e to e + 1 unless it holds a PROBE_ACK for a PROBE it sent in epoch e (Section 19.2). The acknowledgement proves that the peer accepted a packet of epoch e and therefore that the peer's receive epoch is at least e, so that e + 1 is in the peer's permitted set (Section 14.2). A packet the peer sent in epoch e is not sufficient evidence, because the peer may have advanced to e on its own without having accepted any packet of e; without this rule two unilateral advances with lost packets in between leave one direction unable to accept the other's epoch.

  • First epoch of a generation. The evidence is asymmetric. For the responder of the anchor exchange, the packet that committed the generation (Section 16.4) is the evidence: it proves the requester receives under g. For the requester, the response proves only that the responder derived g, not that it committed it, so the requester sends a PROBE in epoch (g, 0) as soon as it commits and repeats it at the probe interval until the PROBE_ACK arrives (Section 9.3.8); until then it holds no evidence and does not advance. The probe is also what commits the generation at a responder that has not yet seen requester data.

  • An endpoint that accepts a packet in epoch e + 1 while its sending epoch is e MUST set its sending epoch to e + 1 before transmitting its next packet. Both directions therefore move together, and either endpoint can initiate.

  • Probe on every advance. Whenever an endpoint's sending epoch changes, by its own decision or by following a received packet, it MUST send a PROBE in the new epoch, and MUST repeat it at the probe interval (Section 15) until acknowledged. The probe is at once the packet that confirms to the peer that the advance was followed and the evidence the endpoint needs before its own next advance. If every path is lost while the acknowledgement is owed, the probe resumes when the session has a usable path again, whether it returns by a path or by a re-anchor.

  • If the per-epoch limit is reached without evidence, the endpoint MUST stop sending in that lineage and recover by re-anchor (Section 16).

  • Advance within a lineage is by epoch chaining (Section 14.3). Advance to a new lineage is only by re-anchor (Section 16); epoch_index resets to 0 and lineage_gen increments there.

14.2. Receiver Rules and the Permitted Set

For each direction and each lineage it holds keys for (the current one, an armed or paused one, and a retiring one during lineage_grace, Section 16.4), an endpoint has a receive epoch r and a permitted set of epochs that the pre-authentication filter (Section 11.3) accepts:

permitted(direction) = { r }
                     U { r + 1 }   if epoch_index(r) < 0xFFFF
                     U { r - 1 }   while the overlap of r - 1 lasts
  • A packet naming r + 1 is decrypted with the keys of r + 1, derived on first need (Section 14.3). AEAD success advances the receive epoch (Section 14.4).

  • A packet naming an epoch outside the permitted set is dropped by the filter. No key is derived for it.

  • A receiver MUST NOT advance its receive epoch on any basis other than a successful AEAD under the keys of r + 1. In particular, observing r + 1 in an unmasked block is not evidence of anything (Section 11.7).

14.3. Key Derivation

epoch_secret(lineage, 0) =
    HKDF-Expand(lineage_secret, label("epoch 0"), 48)
epoch_secret(lineage, k + 1) =
    HKDF-Expand(epoch_secret(lineage, k), label("epoch step"), 48)

Traffic keys and IVs for each direction are derived from epoch_secret as defined in Section 8. Header-protection keys are per lineage and are not re-derived at an advance.

  • Keys for r + 1 MAY be derived in advance or on first need. They MUST be derived at most once and retained until the epoch leaves the permitted set.

  • epoch_secret(lineage, k) MUST be erased as soon as epoch_secret(lineage, k + 1) has been derived and epoch k has left the permitted set. Compromise of the value epoch_secret(lineage, k + 1) alone, without lineage_secret, then reveals nothing about epoch k. Compromise of the endpoint reveals lineage_secret, which is retained until the lineage is retired (Section 8.8) and from which every epoch secret of the lineage is derived, so the erasure of an epoch secret does not hide that epoch's traffic from a later compromise of the endpoint. Forward secrecy of a generation's traffic against compromise of the endpoint begins when that generation is retired and its cs and lineage_secret are gone.

  • Epoch chaining does not protect later epochs from compromise of an earlier one. Post-compromise security within a session comes only from the fresh KEM secret of a re-anchor (Section 16); policy MAY perform a re-anchor on a live path for that purpose.

14.4. Receive Epoch Advance and Overlap

When a packet naming r + 1 authenticates:

  1. Commit the packet's replay check in the window of r + 1 (Section 13.4).

  2. Set the receive epoch to r + 1.

  3. Start the overlap period for the previous epoch, ending first any overlap still active for the epoch before it, whose keys and window are erased (Section 14.5). During it, packets naming r (now r - 1) remain in the permitted set, so that in-flight packets reordered across the advance are not lost.

  4. Apply the sender rule of Section 14.1: set the sending epoch to r + 1 if it is lower, and confirm.

The overlap period is local to the receiver, is not negotiated, and MUST be bounded by time or by a packet count. A RECOMMENDED bound is the larger of two round-trip times and W packets received in the new epoch. Longer overlap periods extend the lifetime of the old keys and nothing else.

14.5. Erasure

When the overlap period ends, or immediately if no overlap is used:

  • the previous epoch's keys, IV and epoch_secret MUST be securely erased;

  • its replay window MUST be discarded (Section 13.6);

  • it leaves the permitted set, and no packet naming it can be accepted again.

Keys of an epoch that has not yet been reached (r + 1) are retained until that epoch is reached and then subject to the same rules.

14.6. Properties

  • Zero cost. An advance is signalled by the epoch field of the next packet, which is masked. An observer cannot see when it happens (Section 24).

  • Bounded divergence. A sender is never more than one epoch ahead of the peer's receive epoch, the peers' sending epochs differ by at most one, and a receiver holds keys for at most three epochs per lineage. A new lineage's first epoch is entered by the commit of its generation (Section 16.4), not by the advance rule.

  • No negotiation. There is no rekey frame, no arming step and no overlap extension; the only control traffic involved is one PROBE and its acknowledgement per epoch and direction.

  • Symmetric. Either endpoint advances; neither is authoritative.

15. Paths, Identifiers, Validation and Liveness

A path is a pair of addresses over which a session's packets currently travel. Paths are the shortest-lived level of the persistence hierarchy (Section 3): a session may hold several, may change any of them, and may hold none. Nothing in this section changes session-owned state.

Policy parameters, with defaults; none is negotiated.

Table 14
Parameter Default Meaning
liveness active per path: active probes an idle path; passive does not (Section 15.6)
T_idle 15 s silence on an active path before a PROBE is sent
k_probe 3 unanswered probes before a path is lost
probe interval max(2 x srtt, 1 s), doubling to 8 s spacing of liveness probes
path_retire 60 s how long a lost or abandoned path's identifier stays installed
validated_ttl 5 min lifetime of an entry in the previously validated addresses
mtu_reprobe 10 min interval between confirmations of a path's MTU
max_paths 8 validated paths an endpoint holds per session

15.1. Identifiers

Every protected packet carries, as its routing key, an identifier of the endpoint that receives it (Section 10.1.2). Identifiers are derived, not issued:

rid(g, dir, j) = prefix(dir) ||                      ; Section 8.5
    Expand(lineage_secret(g), label("rid") || dir(1) || j(4),
           8 - len(prefix(dir)))
  • Prefix. prefix(dir) is zero to two octets chosen by the endpoint that receives in direction dir, delivered once in its sealed part of the FRESH exchange (Section 9.2) and fixed for the session. It is the operator's routing hook: a gateway group gives each gateway its own prefix so that an external balancer can route by it without state (Section 16.9). Identifiers that share a prefix are known to reach the same receiver, an anonymity set of that receiver's sessions (Section 24). A single endpoint uses no prefix. A prefix also sizes the namespace the sessions behind it share: with a two-octet prefix the random part of an identifier is 48 bits, with the collision rates given at the end of this section.

  • Index. j is a 32-bit index. When the sender opens a new path it assigns the lowest index it has not yet used in this generation and direction; the identifier stays with that path for the path's life. A path's identifier is never reused on another path, and a NAT rebind (Section 15.3) keeps the identifier. When a new generation is installed, armed or committed (Section 16.4), the sender assigns that generation's indices to the paths that exist at that moment, from 0 in the order of their previous indices, and continues from there for paths opened later; the assignment stands when the generation commits, so that nothing sent under the generation while it was armed (early data, the confirmation probe) is renumbered and no index is used twice within a generation. The receiver learns the index the peer uses on each path from the packets that arrive on it, generation by generation: at a new generation every path's peer index is unknown again until a packet arrives, because the two endpoints' views of which paths still exist can differ. A receiver MUST NOT infer the peer's new numbering from the old; a wrong inference takes a packet from a new address for a rebind of the wrong path and sends that path's identifier to an unrelated address (Section 24.3).

  • Window. When a generation is installed, and after each use of an index, the receiver installs in its lookup table the identifiers of the k = 8 lowest unused indices for its receive direction, so that the next eight paths the sender may open are always resolvable. Because the sender always takes the lowest unused index, the receiver's installed set is exactly the set the sender may use next. An identifier whose path has been lost or abandoned is removed from the table path_retire after the loss; an index below the lowest in use is never reinstalled.

  • Within the window. The sender keeps within that window: an index with eight or more lower indices on which the peer has never acknowledged a packet could not be resolved there, so a sender that would need one re-anchors instead, which assigns the live paths indices from 0 again, and repeats that re-anchor on the recovery schedule until a generation commits, through an attempt that fails or one that could not start while another was outstanding; a path that is LOST when a generation is installed receives no index under it and takes the next one if it revives. The check applies to the numbering a generation commits with as well as to a new path: a path opened while a generation is armed takes the generation's next index, and if at the commit that index has eight or more unacknowledged indices below it, the sender re-anchors then. It does so only when fewer than eight live paths precede that path, since otherwise the new numbering would give it an index just as far out, and the paths' liveness (Section 15.3) has to retire some first. Reusing the index of a retired path was considered and not adopted: the identifier would be sent to a new address after an old one, which Section 24 forbids.

  • Installation. Identifiers enter the table only at installation, never because a packet carried them (Section 11.2). Each entry maps to the session, the generation (which selects the header-protection key) and the direction.

  • Collision. A derived identifier that is already present in the receiver's table, for any session, is never installed: the generation that would carry it is replaced before it is used, by whichever endpoint can replace it at no cost on the wire. The responder of a FRESH or CONTINUE request, whose encapsulation fixes the lineage, encapsulates again before arming (Section 9.3.2 and Section 9.3.3). The responder of a CONTINUE_0RTT request, whose lineage the requester fixed, answers RETRY IDENTIFIER_COLLISION, which consumes the prekey, and the requester repeats with a new request (Section 16.3.2). A requester that finds the collision when a FRESH or CONTINUE response opens adopts nothing and sends a new request for the same generation, which the responder serves afresh (Section 9.3.8 and Section 16.4); a CONTINUE_0RTT requester finds it before sending and encapsulates again. The same rule covers the recovery identifier (Section 16.2).

  • Collision in a live generation. An identifier that collides as the window slides, or in a generation restored from the record (Section 16.6.2), is skipped and the session re-anchors at once, which derives a new set (repeated until a generation commits); the peer's packets on that index are lost until the new generation, which the inner transport absorbs. Re-anchoring only once the colliding generation had committed would wait on the peer's recovery schedule: when the colliding index is the peer's only path, the commit needs a packet on that very index.

  • Recovery identifiers are the separate derivation of Section 16.2 and follow its rules.

Nothing is signalled to allocate, retire or replace an identifier, there is no exhaustion, and after a restart an endpoint recomputes every identifier of the generations it re-creates from the record (Section 12.7).

Rates. With a two-octet prefix the derived part of an identifier is 48 bits. A population that installs eight receive identifiers per session has, by the birthday bound, about one chance in 90,000 of a collision somewhere among 10,000 sessions, about one in 900 among 100,000 and about one in nine among 1,000,000; a large gateway installing 10^8 identifiers a year meets one about once in three years; with no prefix it does not happen in practice. A collision is detected and resolved as above and costs one exchange, so these are rates of that event, not failures of a session or of confidentiality. A deployment with very large populations distributes receiver prefixes so that no one 48-bit namespace carries them all, and measures the collision rate in its scale tests.

15.2. Path State

Per path, an endpoint holds: the local and remote addresses; the identifier index in use for sending and the identifier last seen from the peer; a state, CANDIDATE, VALIDATED or LOST; a local handle path_id (one octet, carried in PROBE frames and echoed by the peer; Section 19.2); the liveness timer and unanswered-probe count; a smoothed round-trip estimate; the path's MTU (Section 15.5); and the outstanding probes, each with its challenge, the time it was sent and the sending epoch it went out in (Section 14.1), MTU probes apart from liveness probes. The budget of Section 15.4 is held per remote address, not per path. Each endpoint numbers and validates paths independently; the same pair of addresses is, to each endpoint, its own path object.

Path state is created, changed and discarded only after a packet has authenticated (Section 11.4, step 13) or by local decision; no unauthenticated input touches it.

15.3. Candidate Paths and Validation

A candidate path arises when:

  1. an authenticated packet of the session arrives from an address pair not currently a path. If its identifier's index has been seen in this generation on another path, this is a rebind of that path (the peer's address changed under it, as a NAT does); if the index has not been seen in this generation, it is a migration or an additional path the peer opened (Section 15.1);

  2. a local source supplies an address: configuration, the previously validated addresses, or an upper layer acting as rendezvous (externally supplied hints);

  3. a CONTINUE request arrives from a new address (Section 16.3);

  4. an anchor response arrives from an address pair other than the one its request was transmitted to (Section 9.3.8).

Validation. An endpoint validates a candidate by sending a PROBE on it; the matching PROBE_ACK, on whichever path it arrives, proves that the peer receives at that address and answers. On validation the path becomes VALIDATED and joins the session's set (Section 15.7); a rebind replaces the old address of its path, which stays in use until then, and a candidate whose rebind address validates becomes VALIDATED at it. A packet owed to the rebind address, such as the PROBE_ACK to a probe from it, is sent through that path. Each endpoint validates in its own direction; the peer's PROBE on the same addresses is the peer's validation, and answering it is required by Section 19.2 regardless of the local path's state.

Probes. The probe is repeated at the probe interval, doubling to probe_max, until the acknowledgement arrives or k_probe probes have gone unanswered, after which a new path is discarded and a rebind keeps the old address (Section 18.3); a probe that cannot be sent, because no generation can send yet, counts for nothing. The probe interval is at least twice the path's smoothed round trip and at least twice the session's exchange floor (Section 16.7), the time its last anchor exchange took, since a probe's acknowledgement waits in the same queue as that exchange did.

Revival. A LOST path whose address sends an authenticated packet or an anchor message is a candidate again and earns one probe per packet received, keeping its count, so that an address that sends but never answers costs at most one probe per packet. A LOST path whose address pair a local source supplies again (a link that came back) is a candidate again with a full probe count and is probed at once: a locally supplied address earns its probes, unlike one revived by a packet.

Previously validated addresses. Each session keeps a bounded set of peer addresses it has validated, with validated_ttl. A candidate whose address is in the set is VALIDATED immediately. This is what lets both directions of a CONTINUE_0RTT re-anchor flow at once when a device returns to a known network. The lifetime is short because the set weakens the reflection bound for exactly its duration: an authenticated peer could claim an address it recently held. The set is part of the continuity record (Section 16.6.1), so it survives dormancy and a restart, and a session that supersedes this one inherits it (Section 16.7). Only a validated address becomes the address the peer was last seen at, which recovery attempts and anchor requests are sent to (Section 16.7); a candidate's address is relied on for nothing but the budgeted probe toward it and its place in the recovery rotation (Section 16.7).

Until validated, sending on a candidate is limited by Section 15.4. Receiving on it is not limited: authenticated packets are processed normally whatever path they arrive on, because the replay window and the keys belong to the session (Section 13.1).

A NAT rebind keeps the identifier and is therefore linkable by an observer to the path it rebinds; a migration uses a new identifier and is not. Section 24 states both.

15.4. Budget for Unvalidated Paths

Until an address is validated, an endpoint MUST NOT send toward it more octets than it has received from it, and MUST NOT send more packets toward it than it has received from it, with one exception, the probe floor: k_probe probes of 56 octets toward the address outside the budget. The budget belongs to the endpoint, per remote address: every session, path and rebind toward that address shares one budget and one probe floor, because the bound protects the address, not the path or the session, and Section 22 states it for the endpoint (two sessions with one peer would otherwise each spend the floor). It applies to whatever path a packet toward the address is sent on; only a VALIDATED path to its own address, or a previously validated address within validated_ttl, sends unbudgeted. It is lifted when any path to the address validates, and forgotten after budget_ttl (default validated_ttl) without use, so the floor is k_probe probes per address and interval; the table is bounded (max_budgets, default 65,536) and the least recently used entry is forgotten beyond the bound.

Forgetting is an accounting boundary. An address forgotten for room, rather than for its interval ending, with its floor spent, obtains no second floor before its interval ends; an endpoint keeps the floors it has spent for such addresses, bounded like the table, and grants no floor to a new address while that memory is full, so that churning the table with claimed addresses yields no floor an address would not otherwise have had.

PROBE_ACK frames owed under Section 19.2 and the endpoint's own PROBE are sent first within the budget; application data follows only if budget remains. Anchor requests an endpoint initiates, a first FRESH to a configured address or a recovery attempt to an address of the rotation (Section 16.7), are outside the budget: their number and spacing are bounded by the retransmission schedules of Section 9.4 and Section 16.7, and only a holder of the request's keys can make the request draw a response. The floor exists because two endpoints that are each other's candidates, as after a migration on both sides, have each received nothing from the other's new address and could otherwise never send the first probe.

The reflection ratio toward any address a peer claims is therefore at most one beyond the floor of k_probe x 56 octets, by the same accounting as the anchor exchange (Section 9.5). An authenticated but malicious peer that claims a victim's address can make the endpoint send the victim at most what the peer itself sent from that address, beyond that floor. The cost is that a peer that moves without keeping its old path waits one round trip before it receives more than it sends; with the old path still live, or with the previously validated addresses, there is no wait.

15.5. Path MTU

Every path starts at initial_path_mtu, 1,200 octets by default (INITIAL_PATH_MTU, Section 10.2.3), which crosses the IPv6 minimum MTU with room for outer encapsulation. The procedure below only raises a path's MTU from that start and returns it there; it never searches below it. A deployment whose paths carry less, an encapsulation or a radio link with a smaller datagram budget, configures a lower initial_path_mtu for its endpoints (Appendix F), not below 576 octets, so that its protected packets fit from the first; the anchor messages cross such paths in fragments of MIN_FRAGMENT (Section 10.4), and a receiver accepts any size up to its local maximum, so the start is each sender's own choice and no negotiation. Section 1.5 states this as a limit of applicability.

An endpoint MAY raise a validated path's MTU by probing: it sends a PROBE in a protected packet padded (Section 10.2.2) to a candidate size; the matching PROBE_ACK confirms that the candidate size traverses the path, and the path's MTU becomes that size. A probe that is not answered within the probe interval, twice, means the size does not traverse; the endpoint tries a smaller one. A reasonable search is the local interface MTU less headers (1,452 octets on Ethernet), then halfway between the last failure and the last success, stopping when the gap is under 32 octets. The MTU never exceeds what the local interface can send, and an endpoint that does not know its interface MTU does not probe. MTU probes are accounted apart from liveness probes: an MTU probe that goes unanswered twice at a size fails that size and says nothing about the path, and no other packet disturbs the search.

An endpoint confirms a raised MTU every mtu_reprobe with one probe at the current size; after k_probe consecutive failed confirmations at that size while the path's liveness is intact (its small packets are still answered), it returns the path to INITIAL_PATH_MTU and may search again later. This is the model of [RFC8899], implemented with the frame of Section 19.2 and no other mechanism; receivers need nothing, because they accept any size up to their local maximum.

The MTU is per path and survives a re-anchor on the same address (Section 16.4). Raising it from 1,200 to 1,452 octets increases the payload per packet from 1,156 to 1,408 octets, about 22 % fewer packets for bulk traffic.

15.6. Liveness

Liveness is a per-path policy with two modes.

  • Active. If no authenticated packet has arrived on the path for T_idle, send a PROBE on it. If k_probe consecutive probes go unanswered, spaced by the probe interval, the path is lost: state LOST, event PathLost. Any authenticated packet on the path resets the timer and the count. Under the defaults a path is lost about 22 s after the last packet.

  • Passive. No probe is sent for silence alone. When the endpoint sends on the path after a silence longer than T_idle and nothing arrives within the probe interval, it probes as in the active mode; loss is detected only when there is something to send. A battery-powered device chooses passive; a gateway active.

Receipt refreshes liveness in both modes, so a path that carries traffic in either direction is never probed. A peer that has gone DORMANT answers nothing, because it holds no keys under which to authenticate what arrives (Section 16.7); its silence is what liveness detects, and the session recovers by re-anchor.

Network address translation. An endpoint that wants to remain reachable inbound through a translator sends on each such path at least once per binding lifetime, 25 s being the customary bound; a PROBE serves. An endpoint that does not need inbound reachability lets the path idle, in either mode. The session is unaffected by the choice: at worst the path is lost and the session recovers on the next send (Section 16.7). Keepalive traffic is a reachability choice, never a session requirement.

Consequences of loss. Losing a path discards that path's state after path_retire and nothing else. If it was the session's last usable path, candidate or validated, the session enters RECOVERING (Section 16.7); otherwise sending continues on the remaining paths. A lost path is the ordinary case in the environments this protocol is for; it is never an error.

15.7. Multiple Paths and the Sender's Choice

A session holds any number of validated paths up to max_paths, each with its own identifier index. Which path carries which packet is the sender's policy and outside this document: a primary with the others as standby, round-robin, lowest round-trip time, or redundant transmission, in which the same packet is sent on several paths. Redundant copies are one encryption of one packet, identical in every octet except the routing key, which is each path's own identifier; the associated data excludes the routing key for exactly this purpose (Section 10.2.2), so no second AEAD operation and no second nonce is involved.

The receiver accepts the first copy and discards the rest through the replay window (Section 13.1), and no further mechanism exists or is needed. When paths with different latencies are in use, the window sizing rule of Section 13.2 applies. A sender that treats one path as primary moves the primary to another validated path when the peer's packets arrive on that path while the primary has received nothing for longer than a probe interval and a probe on the primary is unanswered.

Adding a validated path reports PathAdded, the first time and again when a path that was lost is revived and validated once more, so that a layer above learns that a RECOVERING session is back on a path; a change of the path the sender treats as primary reports PathChanged; loss reports PathLost. All are transport-class events (Section 3) and change nothing above the path. Four rules shape the set a sender chooses from:

  • The new generation's path is preferred. Once a path is validated on which the peer has sent under the current generation, a sender that keeps a primary SHOULD prefer it over a primary that has received nothing since that generation committed: the peer re-anchored from there, after a restart on a new port or a migration, and is there now. The condition is checked when the path is validated and again when the generation commits, since either can come second: a CONTINUE_0RTT responder commits on a PROBE_ACK that has just validated the path while the previous generation was still current (Section 16.4). Between two validated paths the same preference applies when the peer's packets arrive on one while the primary has received nothing for longer than a probe interval and a probe on the primary is unanswered: the peer has moved, and the sender follows it (PathChanged) rather than sending into silence until the old path's liveness fails.

  • A response validates the address its request was sent to. An anchor response validates, at the requester, the address pair the request was transmitted to, when the attempt went to one pair only: the request is the challenge and the response its answer, as a PROBE_ACK answers a PROBE, with a transcript only the peer could complete (Section 9.3.8). The response's source address is not validated by the response: an authenticated response proves possession of the exchange's secrets, not that the peer receives at the address the datagram claims to come from, which any sender on the path can set. A source that differs from the request's destination is a candidate, probed and budgeted (Section 15.3). The responder's side is unchanged: the request's source stays a candidate until its probe is answered, since a request can be replayed from any address.

  • A path is an address pair. Two paths may share the peer's address and differ in the local one (two interfaces toward one server); the local address a packet arrived on selects among them, before the peer's address alone.

  • A path is also lost by local decision. An endpoint whose interface or address goes away withdraws the paths from it at once, with no probes, since the host knows what no probe can tell it sooner; an address whose path has been lost leaves the previously validated set, so that a recovery attempt toward it makes no validated path without proof.

15.8. Paths and Everything Above Them

  • A path through a third party that forwards datagrams by their routing key is, to both endpoints, an ordinary path (Section 10.1.2); an endpoint may give such a forwarder its next identifiers in advance, since it can compute them.

  • A path that survives a re-anchor with its address unchanged keeps its validation, MTU and liveness state (Section 16.4); only the identifiers used on it change.

  • When both endpoints have moved, neither can reach the other without an externally supplied address (candidate source 2 in Section 15.3); how an upper layer supplies one is outside this document.

  • No path event creates, extends, revokes or refreshes authorization, generation, exporter values or any upper-layer binding.

16. Dormancy, Recovery and Re-Anchor

A PQST session is not ended by the loss of its paths. This section defines what survives when every path is gone, how the session is recovered, and how the anchor exchange of Section 9 in its CONTINUE forms creates each new generation of the session. Section 16.10 lists the scenarios this section was exercised against.

16.1. Overview

Lifetimes. Five levels of state, each outliving the next (Section 3):

Table 15
Level Created by Ended by Bound
identity provisioning revocation policy
cohort membership outside this document outside this document --
session the FRESH exchange close (Section 20) max_dormancy, authorization, lineage_gen exhaustion
generation (lineage) each anchor exchange the next anchor exchange reanchor_interval, epoch_index exhaustion
epoch each advance (Section 14) the next advance 2^23 packets
path validation (Section 15) loss liveness timers

An event at a shorter-lived level never invalidates state at a longer-lived one. Losing every path starts the session's recovery, and, if recovery does not reach the peer, makes it DORMANT; it does not end it.

Re-anchor is the anchor exchange performed from an existing session. It is one mechanism with six uses: recovery after the last path is lost; survival across a restart; the post-compromise ratchet (Section 16.8); identity re-proof on demand; renewal of identifiers; and renewal of the lineage when epoch_index is exhausted (Section 12.2). It costs one round trip, or none with a prekey, and about 1.7 KB of anchor messages in each direction; the measured cost of a recovery, with fragmentation, retransmission, confirmation and path validation, is a matter for Section 27.

Policy parameters used in this section, with defaults. None is negotiated; each endpoint applies its own.

Table 16
Parameter Default Meaning
max_dormancy 24 h longest a session may stay DORMANT before it is closed
reanchor_interval 1 h scheduled re-anchor on a live path (Section 16.8)
reproof_after_dormancy 1 h a re-anchor after the peer has been silent longer than this requires identity proof of the peer
max_reproof_interval 24 h longest interval between identity proofs of the peer: a proof is sought one reanchor_interval before it ends, and past it nothing above the session moves until a proof succeeds (Section 16.3.3); 0 disables it and claims no bound
reproof_after_restart off require identity proof of the peer when serving its request from a sealed record, after this endpoint lost its state
anchor_timeout 30 s Section 9.4
reply_cache_ttl 120 s Section 9.4
recover_schedule 1, 2, 4, 8, 16 s intervals between recovery attempts; at the initiator, a FRESH attempt at the third and fifth
recover_hold 60 s after the schedule's last attempt, how long the session stays RECOVERING, sending nothing and keeping its generation, before it enters DORMANT
dormant_retry 60 s, doubling to 1 h interval between recovery attempts while DORMANT
lineage_grace 2 x srtt, at least 1 s how long a retired lineage's identifiers and keys are kept for packets in flight
tombstone_ttl max_dormancy + reanchor_interval how long a closed session's tombstone answers re-anchor requests (Section 19.6)

16.2. Recovery Identifiers

rec(g, dir) = prefix(dir) ||                         ; Section 8.5
    Expand(cs(g), label("recovery") || dir(1), 8 - len(prefix(dir)))
  • Both endpoints compute both directions' recovery identifiers when generation g is installed, and each installs in its lookup table the one for the direction it receives on. The entry is retained while the session is live and while it is DORMANT: it is how a dormant session is found. It is removed when generation g is committed as superseded (Section 16.4) or the session is closed.

  • A recovery identifier is the routing key of a CONTINUE or CONTINUE_0RTT request sent in direction dir while generation g is current. The response travels on resp_rid(g, dir', nonce) (Section 8.5), a key that exists for the attempt only. Neither is used for any other packet: a recovery identifier is never a data identifier, it is not transmitted before its use, and it cannot be linked to the session's data identifiers by anyone without cs(g).

  • It is single-use. Once a request on rec(g, dir) has created generation g + 1 and that generation is committed, the identifier is stale: it stays in the table for reply_cache_ttl, answers a byte-identical retransmission of the request it served with the cached response, and answers nothing else (Section 16.4). Any other request on it is handled by Section 16.5.

  • A receiver that finds a recovery identifier already present in its table on installation applies the collision rule of Section 15.1.

16.3. The CONTINUE Forms

16.3.1. CONTINUE: One Round Trip

The requester sends a fresh ephemeral key; the responder encapsulates to it. Identity proofs are optional in both directions: prove_peer adds ct_peer to the request, and the responder adds ct_req to the response when its policy requires proof of the requester (Section 9.2). Requester data flows after the response.

16.3.2. CONTINUE_0RTT: Prekeys

Each endpoint issues to the other, as a NEXT_EK object (Section 19), one prekey: a fresh ML-KEM-1024 encapsulation key whose decapsulation key the issuer keeps for exactly one use.

  • A prekey is issued after establishment and again after each consumption; at most one unconsumed prekey per direction is outstanding. A new version supersedes an unconsumed one, whose decapsulation key is erased when the new version is acknowledged or after reply_cache_ttl, whichever is first (Section 19.4.1). Prekeys are never carried in anchor responses; they travel as objects over the established lineage, so a recovery in the first moments after establishment uses the CONTINUE form.

  • The issuer MAY regenerate the decapsulation key on demand from nek_seed (Section 8.7) using the seeded key generation of [FIPS203] instead of storing the decapsulation key (3,168 octets in suite 0x0001) per session. local_secret MUST be rotated no less often than max_dormancy and erased on rotation; prekeys issued under an erased secret become PREKEY_UNAVAILABLE, and forward secrecy of recoveries is bounded by the rotation period. The issuer keeps, with each such prekey, the generation of the secret it was issued under, and keeps the current secret and its generation where its records are; a prekey whose generation is not current is unavailable, and a rotation issues a new NEXT_EK on every established session.

  • The requester encapsulates to the prekey (ct_n, naming nek_version), derives generation g at once, and MAY send protected packets under g with routing key rid(g, dir, 0) in the same datagram sequence as the request. The responder, on accepting the request, consumes the prekey, derives g, and processes those packets. A protected packet reordered ahead of the request is dropped, because its identifier is not yet installed; the inner transport recovers it.

  • The request's source address is a candidate path unless it is a previously validated address (Section 15); the responder's sending toward it is limited by the budget of Section 15.4 until it is validated. Requester data is unaffected.

  • Not replayable, in this sense: the recovery identifier and the prekey are both consumed by the first accepted request, and a stateful responder rejects a second one (Section 16.5), so that no one can cause the original protected packets of a consumed prekey to be accepted again under the receiver's state. This is 0-RTT data that is forward-secret and not replayable by an attacker. It is not delivered exactly once: the gateway race below can leave its fate unknown to the sender, and an application that sends it again accepts that it may arrive twice, with its own idempotency or transaction identifier where that matters (Section 23).

  • Proof of the requester is impossible in this form, because the lineage is derived before the response; a responder that requires it answers RETRY PROOF_REQUIRED, arming nothing, so that no early data opens, whether it serves from state or from a sealed record, which carries the time of the last proof (Section 16.6.3), and the requester repeats the attempt as CONTINUE. The requester discards the generation, which no responder commits; what became of its early data is stated below.

  • A CONTINUE_0RTT attempt under whose generation the requester has sent is kept until the responder answers it with RESPONSE, RETRY or CLOSED, or the session closes: it is never abandoned for another attempt at the same number, not by the recovery schedule, not by exhausted retransmissions, not on entry to DORMANT, where it stays in the record and is retransmitted by the schedule when a path or an address is available again, the generation re-created from the attempt's state receive-only (Section 12.7) so that the answer or the responder's packets under it commit it. The responder may hold that generation armed, delivering the early data, or committed on an acknowledgement sent under it (Section 16.4); a second generation with the number, derived by a replacement attempt and sent under from a fresh sequence, would repeat epoch identifiers the responder has already delivered, and, had the responder committed the first, the requester that discarded it would be a generation behind for good.

  • A RETRY in a gateway group. A RETRY shows only that the responder that sent it did not arm the generation: in a gateway group (Section 16.9), another member that serves the session from state, where the one that answered served it from a sealed record, may have armed it and delivered the early data. The downgrade to CONTINUE after a RETRY is safe all the same, because the requester sends nothing more under the generation, so no member commits it, and the CONTINUE for the number replaces it (Section 16.4). Early data of an attempt answered by RETRY has therefore an unknown fate: the requester MUST NOT report it to the layer above as not delivered; it reports the refusal and that early data was sent under the refused attempt (the EarlyDataUncertain event of this section), and a layer that sends it again must accept that it may arrive twice (Section 23).

  • An attempt nothing was sent under. A 0-RTT attempt under whose generation nothing has been sent may be abandoned like a CONTINUE attempt: the responder cannot commit a generation it has received nothing under.

  • The one exception. The one exception is the simultaneous rule of Section 16.4: a responder serving a crossing CONTINUE_0RTT abandons its own 0-RTT attempt, because the initiator never serves a crossing request while a 0-RTT attempt of its own is outstanding, so nothing can complete the responder's attempt and nothing holds its generation; the exception applies on that condition alone. In a gateway group (Section 16.9) another member of the initiator's group may have served the responder's request from the record: the generation it armed is never committed, since the responder abandoned the attempt and nothing confirms it, and it expires unconfirmed, so no fork results; early data it delivered is the limit Section 16.10 states.

  • Because the request fixes the lineage, the requester derives generation g before sending and, if one of its identifiers collides in its own table (Section 15.1), encapsulates to the prekey again; a responder whose table collides cannot derive again and answers RETRY IDENTIFIER_COLLISION, which consumes the prekey, and the requester repeats as CONTINUE.

  • An endpoint that holds an armed generation created by the peer's request (Section 16.4) sends no request of its own for that number, in either form: its attempt waits for the peer's generation to commit or expire (Section 16.4).

16.3.3. Identity Proof Policy

Proof of the peer by the requester (prove_peer) and proof of the requester by the responder (prove_req) are each decided by the endpoint that benefits:

  • An endpoint MUST require proof of its peer in the next anchor exchange once max_reproof_interval - reanchor_interval has passed since the peer was last proved, so that in ordinary operation the proof is in hand before the interval ends, and SHOULD require it when no authenticated packet has come from the peer for longer than reproof_after_dormancy, when an upper layer demands it, and, if reproof_after_restart is on, when it serves the peer's request from a sealed record, the one in-protocol sign that it lost its own state. As requester it sets prove_peer; as responder it proves the requester. An endpoint MAY require proof of the requester in every re-anchor it serves under an identity, as a policy of that identity rather than of a session: the policy is then applied to a request served from a sealed record (Section 16.6.3) as to one served from state, before the request is served, and depends on nothing the record carries; the companion document requires it of a sequencer [PQST-COHORT]. A FRESH exchange proves both identities; a CONTINUE proves the peer once its response opens with prove_peer, and the requester once the generation it served with prove_req commits. The time of the last proof and of the last authenticated packet are kept in the record.

  • An endpoint that needs a fresh proof of its peer initiates a CONTINUE with prove_peer itself; one that needs to be freshly proved to its peer initiates a CONTINUE with offer_proof (Section 9.2.1). A requester answered PROOF_REQUIRED offers the proof in every later request of the session, which spares the RETRY. No message asks the peer to act, and either endpoint can do either at any time on a live path.

  • Proof of the peer costs the requester one encapsulation and L_ct octets (1,568 in suite 0x0001); proof of the requester costs the responder the same and forces the CONTINUE form, and a requester that offers it pads its request by L_ct octets so that the response fits the reflection bound (Section 9.5).

  • A re-anchor that fails a required proof produces no response that opens, and a response that fails to open proves nothing: an on-path attacker can alter the tag of the peer's answer, which Section 9.3.8 drops while the attempt waits, so such a response MUST NOT by itself close the session or change what the attempt is taken for. When the requiring endpoint gives the attempt up without a proof, having heard the peer meanwhile from an address the attempt was sent to, by data under the session's keys or by any part of an answer, the demand is unsatisfied, not failed: under loss an honest peer's answers are lost or damaged as its data is not. Before the deadline below the endpoint then delivers nothing from the peer above the session and sends nothing above it, as past the deadline, and repeats the proving exchange on the recovery schedule until a proof succeeds, which lifts the gate; once the deadline has passed, an attempt so given up closes the session with REPROOF_FAILED (Section 20), a security-class event. An attempt that met only silence, or that was heard past only from addresses it never went to, as a peer whose address moves faster than a probe is, is the network's; the session recovers as from any other, and the proof is still due. The theft of a continuity secret is thereby bounded, as the next rule states.

  • The deadline. Once max_reproof_interval has passed since the peer was last proved without a proof succeeding, the endpoint delivers nothing from the peer above the session and sends nothing above it, data on any stream and objects alike, until a proof succeeds; the anchor exchange, probes, acknowledgements and CLOSED continue, so that the proof can be obtained or the session closed. An exchange that did not prove the peer never moves the time of its last proof, whatever it authenticated, a CONTINUE_0RTT included. The time travels in the record, so a restart and a gateway serving from a sealed record (Section 16.6.3) enforce the same deadline. A deployment that sets max_reproof_interval to 0 enforces no deadline and claims no bound on a holder of the continuity secret. With the deadline the theft is bounded: a thief that re-anchored before the legitimate endpoint holds the session for at most max_reproof_interval after the last proof; nothing above the session moves after that, nor from the moment it leaves a demanded proof unanswered while it keeps sending, which comes within one attempt's life of the first demand; and the session closes with REPROOF_FAILED when the deadline passes with the demand unsatisfied, as above; no unauthenticated response closes it or moves that time.

16.4. Commit, Crash Consistency, and Simultaneous Re-Anchor

This section states the rules of an anchor exchange after the request is built: what is written before what is sent, when a generation becomes usable, what happens to an attempt that is overtaken, and how two endpoints that re-anchor at once settle on one generation.

  • Write-ahead, requester. Before transmitting a CONTINUE request the requester persists everything needed to retransmit it byte-for-byte and to continue afterwards: target_gen, nonce, the request's octets and transcript hashes, ss_peer when it carries prove_peer, and either dk (CONTINUE) or cs(g) and lineage_secret(g), which a CONTINUE_0RTT request derives before it is sent, and the time of the request's first transmission, from which the attempt's life is measured (Section 16.7), across a restart too. cs(g - 1) is kept until generation g is committed. Every record written while the request is outstanding, for whatever reason, carries it, so that no later write loses the attempt; a restart retransmits it.

  • Write-ahead, responder. Before transmitting a response, FRESH or CONTINUE, the responder persists the armed generation and the response it is about to send (the reply-cache entry of Section 9.4), so that a restart neither loses a generation the requester may have committed nor fails to answer the requester's retransmission. In FRESH the freshness counter (Section 9.3.5) is not advanced by this write but by the one that commits generation 0, on confirmation.

  • The write's cost. The write is the cost of a request that opens, one decapsulation deep and bounded by the half-open table per source and per claimed identity (Section 9.4 and Section 23), and it stays: without it a responder restarting between its response and the confirmation loses an exchange the requester has committed, and the requester's recovery from a generation its peer never held is the slow path of Section 16.7.

  • A failed write at the responder. If the write fails, the responder sends nothing and discards the generation it was about to arm and every piece of state the arming changed: the armed slot, the reply cache, the served attempt number and a prekey the request consumed; it serves the request when it is retransmitted. Each generation holds its own copies of cs and the lineage secret, and a discarded generation is referenced by nothing. A generation that a new request displaces (re-serving, below) goes only once its replacement is written. The prekey a CONTINUE_0RTT request consumed is erased in the same write (Section 16.3.2), and an issuer that regenerates prekeys records it consumed in that write, so that a restart cannot bring it back or regenerate it; a later request naming it is answered PREKEY_UNAVAILABLE.

  • Durable commit. A generation is committed at an endpoint only when the record that resumes it is durable; the cryptographic work that precedes the write, opening a response or authenticating a confirming packet, prepares the generation and commits nothing. Keys and identifiers derived before the write are provisional: no packet is processed under them, nothing is sent under them, and nothing externally visible depends on them until the write holds; an implementation whose dispatch could reach them before then defers the packet.

  • A failed commit write. When the write fails, the endpoint keeps or rebuilds what it needs to attempt the commit again, in memory or from the write-ahead record, and does not activate the generation. The requester keeps its attempt outstanding and its decapsulation key, uninstalls the provisional identifiers, and commits on the cached response its retransmission obtains (Section 9.3.8). The responder, whose armed generation was already durable, keeps it armed and drops the confirming packet undelivered, its sequence number consumed, so that the next packet under the generation, the requester's repeated confirmation probe or its data, commits; a failed write therefore consumes one packet, never the only event that could complete the commit.

  • Delivery before durability. Nothing is delivered under a generation whose commit is not durable, except the early data of a CONTINUE_0RTT, whose standing Section 16.3.2 gives. The reference implementation is one serialized state machine, so the interval between deriving and committing is never observed; the rule is stated for implementations that are not.

  • Arm, then commit. The responder installs generation g armed when it sends the response: its keys and identifiers exist, generation g - 1 is untouched. It commits, by the write of the durable-commit rule above, on the first packet of any kind that authenticates under g, data, a PROBE, a PROBE_ACK or an OBJECT, except under a generation a CONTINUE_0RTT request armed, which only a PROBE_ACK to a probe sent under g commits (below), and on a request on rec(g, .) that opens under cs(g) (the peer has committed g and asks for g + 1; the responder commits g first and then serves). On commit it persists cs(g) and the new record, for generation 0 of a FRESH with the requester's freshness mark (Section 9.3.5), then erases cs(g - 1), removes rec(g - 1, .) from the live table (it becomes stale, below), and retires lineage g - 1 after lineage_grace.

  • Evidence for an armed generation. Only a packet that authenticates under the armed generation is evidence for it: early data under a generation a CONTINUE_0RTT request armed is delivered but commits nothing, since the requester may have abandoned that request and may hold another generation with the number; an acknowledgement that opens under the current generation says nothing about the peer's lineage, whichever probe it answers. A session with no committed generation, as after dormancy, sends its probes and their answers under the peer's armed generation for the purpose. The confirmation probe goes on the path the request arrived on, candidate or validated.

  • The requester's commit. The requester commits, by the same write, when the response opens, or, in CONTINUE_0RTT, on any packet that authenticates under the armed generation; it persists cs(g) and the new record before erasing cs(g - 1). A commit that cannot be persisted adopts nothing: the responder keeps the generation armed and the requester keeps the attempt outstanding, and each is retried on the next packet or response.

  • One armed generation. A session holds at most one armed generation at a time, whichever role created it, together with at most one paused generation of its own (simultaneous re-anchor, below). While the peer's generation for the next number is armed, the endpoint makes no request of its own for that number: the attempt waits for the peer's generation to commit on the peer's packets, or to expire unconfirmed, and proceeds then. While its own 0-RTT generation is armed, the peer's request for the same number is resolved by the simultaneous rule below.

  • Retirement. Retiring a lineage discards its epoch keys, replay windows and data identifiers after lineage_grace. Paths survive: a path whose address is unchanged is the same path under the new generation, keeps its validation and MTU state, and changes only the identifiers used on it, assigned when the generation was installed, from index 0 in the order of the previous indices (Section 15.1). A re-anchor on a live path never re-validates anything.

  • Idempotent retransmission. A byte-identical retransmission of an answered request is answered from the reply cache (Section 9.4) on the attempt's resp_rid, for reply_cache_ttl, before and after commit: from the original source address without condition, from another address within the reflection budget of Section 15.4 toward it.

  • Stale identifiers. After the commit the identifier the request arrived on, rec(g - 1, dir) or the handshake identifier, is stale: it stays in the table for the same period and answers that retransmission and nothing else; any other datagram on it is dropped without a response, a public key operation or a state change, because on a stale identifier an unauthenticated datagram may cause no transmission but the cached reply (Section 11.7). A requester that crashed after receiving the response but before persisting cs(g) recovers this way: it rebuilds the request from its write-ahead state and receives the same response.

  • Re-serving an uncommitted generation. A request on rec(g - 1, dir) with target_gen = g, different contents and a higher attempt (Section 9.3.3), arriving while generation g is armed but not committed, replaces the armed generation once it has opened under cs(g - 1): the responder discards the earlier cs(g), which no one else can use, and serves the new request. An unauthenticated request never displaces an armed generation, because the peer may already hold it committed and an observer of the identifier could otherwise strand the session. A committed generation is never re-served; such a request is dropped (Section 16.5). This keeps the no-forking invariant in its usable form, no two usable generations with the same number, while giving a requester whose first attempt was lost a way to continue.

  • Abandoned attempts. A requester that abandons an attempt, including by yielding under the simultaneous rule, discards its write-ahead state for it and writes the record without it, so that a restart does not resurrect the attempt beside the exchange it yielded to; a CONTINUE_0RTT attempt sent under is abandoned only by yielding to a crossing CONTINUE_0RTT, the one exception (Section 16.3.2), an abandonment written out of the record like any other.

  • The life of an armed generation. The responder's armed generation lives exactly as long as the cached answer that creates it, and every retransmission the cache answers renews both: anchor_timeout for the generation of a CONTINUE, whose attempt ends within that time by the rule of Section 16.7, replaced by the schedule or abandoned at the end of its own life, across pauses and restarts, and reply_cache_ttl for the generation of a CONTINUE_0RTT, whose attempt is kept and retransmitted. An unconfirmed generation and its answer therefore go together, when the requester has been silent for that long.

  • The reserved number. The answer to a CONTINUE_0RTT may outlive them, held in the network, and still complete the kept attempt it answers: a responder whose generation armed by a CONTINUE_0RTT request expires unconfirmed therefore keeps the number reserved, making no request of its own for it, until it commits a generation with that number or serves a later attempt for it, which shows the requester gave the 0-RTT attempt up. The reservation is kept in the record. It never holds recovery: a session that may not request the number follows its recovery schedule, whose FRESH attempts take no number (Section 16.7).

  • Superseded attempts. A commit of generation g while the endpoint's own request for g is outstanding supersedes that attempt: the request and any generation it armed are discarded, because the number is taken by a generation both sides hold. The superseded attempt is reported as ReanchorFailed{superseded} only if it carried prove_peer or offer_proof, since the proof it sought was not obtained; otherwise ReAnchored for the committed generation is the whole report.

  • Simultaneous re-anchor. Both endpoints may request the same generation g at once. The roles of the handshake decide, so that no comparison and no message is needed:

    • The initiator whose own attempt is a CONTINUE yields to the peer's request, in either form: once the peer's request has opened under cs(g - 1), and before any of its own write-ahead state is replaced, it abandons its own attempt, cancels its retransmissions, and serves the peer's request. An initiator whose own outstanding attempt is CONTINUE_0RTT does not yield: the requester of a CONTINUE_0RTT fixed the lineage of g itself and has sent under it, so the peer may hold that generation already or commit it on the next acknowledgement; it drops the responder's crossing request unopened and keeps retransmitting its own.

    • The responder does not yield while its own attempt is young: it drops the peer's request before opening it and keeps retransmitting its own. Once its requests for the number have been transmitted three times without an answer, the peer's request, which did arrive, is the one that can complete, and the responder serves it too. The count is per target number and survives the attempts the recovery schedule replaces; an attempt restored from the record after a restart counts as transmitted three times already, and keeps its age (Section 16.6.2). Serving a crossing CONTINUE, the responder pauses its own attempt rather than abandoning it: no further retransmission, but the response slot and the generation the attempt armed stay, receive-only, because the initiator may have served that request and its answer may still be in flight; the paused attempt completes if the answer arrives, is superseded by whichever commit settles the number first, and otherwise waits for anchor_timeout, the life of the generation it yielded to, within its own life (Section 16.7): a kept CONTINUE_0RTT attempt is then retransmitted, a CONTINUE attempt is abandoned when its life ends and the next attempt is a new one. Serving a crossing CONTINUE_0RTT, the responder abandons its own attempt instead, its generation with it: the initiator never serves a crossing request while a 0-RTT attempt of its own is outstanding, so nothing can complete the responder's attempt and nothing holds its generation.

    • Whichever answer arrives first completes the surviving attempt; a commit of g supersedes the other attempt and discards the generation it armed, as above. Requests for different generations are not simultaneous: one of them commits a generation the other targeted, and the superseded rule applies.

  • Response routing. A response travels on resp_rid(g - 1, dir', nonce) (Section 8.5), which the requester installs for the attempt and removes when the attempt ends. A response to an attempt that has ended, a replayed response, and a response from a tombstone (Section 19.6) are all routed, or not, by that key alone.

16.5. Generation Rules

  • target_gen in a request MUST equal the responder's current generation plus one, except as Section 16.4 allows for an uncommitted generation. A request with target_gen at or below the current generation is answered from the reply cache if it is byte-identical to a cached request (Section 9.4; from another address within the budget of Section 15.4), and dropped otherwise. A request with target_gen more than one ahead is dropped.

  • A responder never regresses: having committed generation g, it never again accepts a request that would create g or any lower generation, and it refuses any sealed record whose generation is lower than one it knows for that session (Section 16.6).

  • lineage_gen in the epoch identifier is the generation. If a re-anchor would make it exceed 0xFFFF the session is closed with SESSION_LIFETIME (Section 12.2) and a new handshake performed; at the default reanchor_interval this is seven and a half years.

16.6. The Continuity Record

16.6.1. Contents

The continuity record is everything an endpoint retains while DORMANT or across a restart, and nothing else. Epoch keys, replay windows, data identifiers, path state and sealing keys are discarded on entry to DORMANT and rebuilt by the re-anchor, except a generation the peer's request armed, which stays installed (Section 16.7).

Table 17
Field Octets, approximately, in suite 0x0001
session identifier (Section 8.6), own session role, peer fingerprint, and the peer's identity key if the peer was admitted as an unknown identity (Section 9.3.6), reference to own identity key 16 + 1 + 48 (+ 1,568) + small
cs(g) and g; the committed generation is not re-created from them after a restart (Section 16.6.2) 48 + 2
session_root 48
prefix(i2r), prefix(r2i) <= 2 + 2
the grant this endpoint issued (its AUTHZ object, Section 17), with remaining lifetime at the time of writing <= 80
objects held from the peer whose kinds persist (Section 19): INNER_ADDR, RECORD small, <= 472
the peer's prekey and version; own prekey decapsulation key or local_secret reference, and version 1,568 + 4 + 3,168 (or 4) + 4
object versions issued and held, per kind 4 each
the previously validated peer addresses with their remaining lifetime (Section 15.3) <= 8 x 20
the time the last anchor exchange took, request sent to response complete, in milliseconds (Section 16.7) 4
a generation number reserved after an unconfirmed CONTINUE_0RTT generation expired (Section 16.4) 2
the wall-clock time the record was written, of the peer's last identity proof, and of its last authenticated packet 24
while an exchange is in flight (Section 16.4): the armed generation, cs(g + 1), lineage_secret(g + 1) and its number, if this endpoint served the request; the response last sent, with the request's hash, source address and resp_rid, for reply_cache_ttl, and the request's init_counter for a FRESH half-open exchange (Section 9.3.5); the outstanding request's write-ahead state, if this endpoint sent one 98; <= 3.2 KB (FRESH) or <= 1.7 KB; <= 3.3 KB + dk 3,168 (CONTINUE) or cs/lineage 96 (CONTINUE_0RTT)

About 5 KB between exchanges, or about 2 KB with prekey regeneration, and up to about 12 KB while an exchange is in flight, in suite 0x0001; a suite with smaller keys (Section 6.1) needs less. The per-identity freshness counter state of Section 9.3.5 is kept per identity, not per session. A grant held from the peer is not relied on after a restart: the re-anchor response carries the peer's current AUTHZ object (Section 9.3.7), and until it arrives the held grant is treated as expired. Every lifetime the record carries is the time remaining when it was written; a restore counts the time since against each, and an endpoint that cannot measure that time takes them as spent: the previously validated addresses are dropped, and the issued grant is renewed or the session closed as if it had expired (Section 17.5).

16.6.2. Persistence

  • Write-ahead ordering. The record is written before any message that depends on it is sent (Section 16.4), and a new record is persisted before the secrets it replaces are erased.

  • Atomicity and serialization. Every transition of the record, a commit, an abandonment, a reply-cache entry, a consumed prekey, an outstanding attempt, a closure, is atomic with respect to a crash and serialized with the record's other transitions: a write that completes leaves the whole new record recoverable under the store's declared failure model, and one that does not leaves the previous record whole. The store reports a write as done only when it is durable under that model; a write whose outcome is unknown is treated as failed, which is safe because every write replaces the whole record and repeating it is idempotent. No transition, however concurrent, overwrites a newer committed generation, brings back a consumed prekey or an abandoned attempt, drops an outstanding attempt still needed for recovery, or undoes a recorded closure. The reference implementation is one serialized state machine whose file store writes a temporary file, syncs it, renames it over the record and syncs the directory; any construction with the same properties conforms.

  • At rest, the record MUST be protected so that recovering it requires the device's identity key, or a keystore of equivalent protection. Reference construction: (ct_w, ss_w) = Encap(own_pk); k_wrap from Section 8.7; store ct_w || sealed record, the record sealed with AES-256-GCM under k_wrap, with label("record") || own fingerprint as associated data. own_pk is the endpoint's current identity key at the time of writing; after a rotation (Section 23.4) a record wrapped to the retiring key is read under it and rewritten under the new key at its next write. Writing needs only the public key; loading needs one decapsulation with the identity key. A sealed record (Section 16.6.3) is the one copy of the record not protected this way: its protection is the record key's. Where the identity key lives in hardware, a copy of storage is useless without the device; where it is software on the same storage, no protocol rule could add protection, and reproof_after_restart remains available as policy.

  • Erasure. A record MUST be erased when the session is closed for any reason, when the identity it belongs to is revoked, when it is superseded by a record of a higher generation, and when it is found to be older than the generation the peer knows (Section 16.5). A device MUST NOT hold records for sessions it no longer holds in any other sense.

  • Restart. A restart never resumes an epoch (Section 12.7). The device loads each record and re-anchors at once toward the address the peer was last seen at, entering RECOVERING; an outstanding request in the record is retransmitted byte for byte instead if it is younger than anchor_timeout from its first transmission, which the record states; an older CONTINUE attempt is abandoned at the restart, since the generation it may have created at the peer has expired (Section 16.4) and completing it later could commit that generation beside one the peer has committed since; a kept CONTINUE_0RTT attempt is retransmitted whatever its age (Section 16.3.2). The recovery schedule of Section 16.7 runs beside a retransmitted attempt from the restart, so that its FRESH attempts reach a peer that lost all state.

  • Generations re-created from the record. A generation in the record that was armed, or that an outstanding CONTINUE_0RTT request had derived, is re-created receive-only (Section 12.7): the peer's packets under it commit it, and the session then re-anchors again, so that the first generation that sends after a restart is always one created after it. A re-created armed generation lives for what remains of the life Section 16.4 gives it, restored with its cached answer, or anchor_timeout from the restart when the record holds no answer, and is then discarded as one that was never confirmed. A session whose committed generation is one re-created from the record is RECOVERING, with the schedule's retries, FRESH interleave and dormancy bound, until a generation created after the restart commits (Section 12.7); it is never ESTABLISHED on a generation it cannot send under.

  • A paused attempt restored. When the record holds both, the peer's armed generation and an outstanding CONTINUE_0RTT request of the endpoint's own, the attempt had been paused (Section 16.4) and is restored that way: its own generation stays receive-only beside the peer's, and the attempt completes only with its own, never with the peer's.

  • Nothing moves under a re-created generation. Nothing is ever sent under a generation re-created from the record, and nothing received under it is delivered: its replay window began empty at the restart, and a packet delivered before the crash could be delivered again; the packets that authenticate under it commit it and are then discarded, and the re-anchor that follows brings the generation that delivers.

16.6.3. Sealed Records and the Stateless Responder (OPTIONAL)

A responder MAY issue, as a RECORD object (Section 19), a copy of its side of the record sealed under a key known only to it or to its gateway group (Section 16.9), at most 472 octets, so that it lies in the first fragment of a request at the smallest frag_size (Section 10.4), re-issued with every generation. The requester stores it and echoes the latest in the cleartext record field of every CONTINUE request. A responder that holds no state for a recovery identifier, or that is configured to prefer records, unseals and verifies the record before allocating any state (Section 11.5), and then serves the request as if from its own state. Rules when serving from a record alone:

  • It MUST discard any protected packets that arrived with the request and let the requester retransmit after the response, because without state it cannot detect a replay of early data.

  • It MUST NOT serve a record whose generation is below any generation it knows for that session, and it never regresses a generation.

  • It MUST issue a new RECORD in the response. It holds no validated address, so the response is no larger than the request (Section 9.5): the RECORD stays in it, and the grant, if it would not fit, follows as an OBJECT once the generation commits (Section 9.3.7).

  • It MUST NOT allocate any state for the request until the record has opened and verified from the request's first fragment: the record names the recovery identifier the request arrived on and the generation one below the request's target_gen. It may then hold reassembly state for the request, in a pool of its own with one entry per recovery identifier, bounded as the recovery pool of Section 9.4 is, per identifier and globally, and creates the session only once the complete request opens under the record's continuity secret. An exchange served this way that is never confirmed leaves nothing behind when it expires.

  • A record carries the endpoint's side of the session (identifier, role, generation, continuity secret, session root, peer identity fingerprint, the peer's identifier prefix, the grant it issued with its expiry, the wall-clock time of the peer's last successful identity proof, and the time it was sealed) and never the decapsulation key of a prekey. It is sealed with the fingerprint of the identity key its session uses as associated data: during an identity rotation (Section 23.4) the responder opens it under either key's fingerprint and serves the session under that key. A responder serving from records cannot enforce a prekey's single use, so it answers a CONTINUE_0RTT request PREKEY_UNAVAILABLE and the requester repeats as CONTINUE.

  • The last-proof time MUST be carried, and a responder restoring from the record MUST enforce the deadline of Section 16.3.3 from it: neither the restoration nor the re-anchor it serves moves that time, only an exchange that proves the requester does, so that a holder of a stolen continuity secret gains nothing by moving between gateways or by having a record restored. A responder restoring from a record counts the time since the proof as if the sealing gateway's clock had been five minutes ahead of its own, the skew allowed below among a gateway group's members, so that the uncertainty can bring the deadline forward and never past max_reproof_interval after the proof; one that cannot establish how much time has passed since the record was sealed treats the deadline as reached, nothing above the session moving until a proof succeeds, never as untouched.

  • A proof policy of the endpoint's own, reproof_after_restart or proof required in every re-anchor served under the identity (Section 16.3.3), is applied before the request is served from the record, as it would be from state.

  • A responder MUST refuse a record sealed more than max_dormancy + reanchor_interval ago, the longest a session that re-anchors on schedule goes without a new one, or dated more than five minutes ahead of its clock, the skew allowed among a gateway group's members. A refused record leaves the session to recover by FRESH.

  • A responder MUST NOT serve a record of a session that is closed at this endpoint, whichever endpoint closed it and whatever the record's generation: the tombstone (Section 19.6) retains the session identifier and the record names it, so the comparison is independent of the generations the session traversed and of which recovery identifier the request arrived on. Opening a record proves only that the record key sealed it, not that the session is open, that the grant it carries stands, or that the identity is still authorized. Before restoring anything the responder verifies that the session is not closed, that the record is within its lifetime, that the grant it carries is neither expired beyond delta nor revoked, and that the peer identity is permitted under current policy (Section 17.4), each against state authoritative for the decision; a failed check restores nothing, commits no generation and reinstates no grant. An endpoint that issues records keeps its closure state across restarts, and a gateway group replicates it with the record key (Section 16.9); tombstone_ttl is at least the record lifetime above, so every record of a closed session is refused for as long as it could open. An endpoint that cannot establish its closure state complete, because a closure write is pending or a restart lost the state, serves no record until it can; the operational remedy for lost state is to retire the record key, after which no outstanding record opens, at the cost of a FRESH for each session it would have restored. A record whose grant has expired beyond delta, or been revoked, is answered CLOSED like a live session's request (Section 17.3).

  • The record key MUST be rotated no less often than max_dormancy. The previous key is kept to open records, never to seal them, for the record lifetime, and then erased; a record under an erased key is refused. The record key protects the continuity secrets of every record sealed under it that an observer captured, so its compromise exposes the generations those records name, within its lifetime (Section 23.3).

  • An endpoint that issues records issues one for every generation it commits: in the response of each CONTINUE it serves, and as a RECORD object after any other commit (a FRESH exchange, whose session identifier is not known when the response is built, and exchanges it requested). The record in a CONTINUE response is sealed before the requester's proof succeeds, which it does only when the generation commits (Section 16.3.3), so it carries the previous last-proof time; a responder SHOULD issue a RECORD object after committing a generation whose exchange proved the requester, carrying the new time, and a responder restoring from the earlier record keeps the older time, which demands the proof sooner and never later, and MUST NOT infer a newer proof from the generation number.

  • A generation such an endpoint commits as the requester is durable only once its peer holds that generation's record. If the endpoint loses its state before then, the generation is abandoned with that state: the peer, holding the older record, re-anchors from it, and the number is served again. No endpoint that holds state ever holds both generations, so the invariant of usable generations (I-8) holds; a peer that had committed the abandoned generation from the requester's packets finds its next request refused, its record naming a generation two below its target, and recovers by FRESH.

  • Under these rules a replayed request at a stateless responder yields at most an armed generation that no one can use, because the attacker holds neither the requester's dk nor the prekey's decapsulation key; the no-forking invariant holds in its usable form. It costs at most one serve per anchor_timeout, because the served state answers later copies from the reply cache.

The format of the record is the responder's own; the group-key distribution a gateway group needs for it is a companion to this document.

16.7. Dormancy and Recovery

The next recovery transmission. For an endpoint that is RECOVERING or DORMANT and whose next attempt is due, the transmission is decided in this order. The paragraphs that follow give the reasons and the details, citing these steps, and Section 9.3, Section 9.4, Section 16.3 and Section 16.4 the mechanisms each step relies on; Section 18 names the states and does not repeat this list.

  1. A CONTINUE_0RTT attempt under whose generation the endpoint has sent is kept and retransmitted by the schedule, in DORMANT too and across a restart, with the FRESH attempts of the schedule proceeding beside it; it ends only when the responder answers it, with RESPONSE, RETRY or CLOSED, when it yields under the simultaneous rule of Section 16.4, or when the session closes (Section 16.3.2).

  2. A CONTINUE attempt whose response has begun to arrive, a fragment of it reassembled, is granted up to two further intervals for the rest of it and no more than its life: anchor_timeout from its first transmission, across pauses and restarts. A response completed after that life commits nothing (Section 9.4).

  3. Any other outstanding CONTINUE or FRESH attempt is abandoned without a report when the next attempt is due, and a CONTINUE attempt is abandoned at the end of its life whatever the schedule's interval; a paused attempt (Section 16.4) waits for its answer for anchor_timeout, and an attempt withheld because the peer's generation for the number is armed waits for that generation to commit or expire, at most anchor_timeout, the attempts refused meanwhile counting as failed.

  4. The next attempt is CONTINUE_0RTT when it is the first of a run of the schedule, a prekey of the peer is held and the peer has not asked for proof; every later attempt of the run is CONTINUE, except that at the session's initiator the third and fifth attempts of a run are FRESH unless, within the current interval, a protected packet from the peer authenticated or a request of the peer's opened with an attempt above every earlier one. At the responder every attempt is CONTINUE. A re-anchor the protocol requires while RECOVERING or DORMANT is the schedule's attempt like any other; one whose number is reserved counts as a failed attempt.

  5. An attempt restored from the write-ahead record at a restart is retransmitted while it is younger than its life, and a restored CONTINUE attempt older than its life is abandoned at the restart, the endpoint then re-anchoring afresh (Section 16.6.2).

  6. The attempt goes to the next address of the rotation below, as a pair with the local address that belongs to it, the FRESH attempts rotating on a count of their own, and a hint probed first and then tried ahead. Silence is judged as Section 16.3.3 says: only an exhausted attempt sent toward the address the peer has since been heard from counts toward a failed proof; silence on an attempt sent elsewhere is the network's.

Entering DORMANT. A session enters DORMANT when the recovery schedule that follows the loss of its last path is exhausted and recover_hold has then passed without its return (Section 18.2, S15), when the peer announces suspension with SUSPEND (Section 19), or by local decision.

What DORMANT discards and keeps. It discards everything but the continuity record and the recovery-identifier table entry, the current generation's keys and identifiers included, and with the paths every record that names one, the outstanding probes above all, since a probe record that outlives its path lets a late acknowledgement validate the dead path and send on it with an identifier a new path has taken; a generation armed by the peer's request stays installed, with its keys and its sending state, because the record carries it and its confirmation probes may already have been sent under it (Section 9.3.9), and the packet that commits it leaves DORMANT (Section 18.2, S17).

What a DORMANT session receives. A DORMANT session therefore receives nothing under its old generation: the peer's packets, its probes and even its CLOSE are dropped as unknown identifiers, the peer detects the silence by liveness and recovers by re-anchor, and a CLOSE the dormant endpoint missed is answered later by the closer's tombstone (Section 19.6). Retaining the receive keys while DORMANT was considered and not adopted: dormancy would then not bound memory, and keys the protocol no longer needs would stay in place (I-14).

What DORMANT reports and leaves untouched. The session reports the transport-class event Dormant, with announced set when a SUSPEND caused it. Entering and leaving DORMANT change nothing above the session (I-6): identity, authorization, the generation's number and lineage, exporter values and upper-layer bindings are untouched; the live keys and identifiers they discard are the session's own and are re-created from the record.

Bounds. A DORMANT session is closed when it has been DORMANT for max_dormancy, with reason DORMANCY_EXPIRED, or when its authorization expires (Section 17), with AUTHZ_EXPIRED; both are policy-class closes and security-class events. Nothing a path does can close a session.

RECOVERING. When the last path is lost, on restart (Section 16.6.2), and whenever an application send is attempted while DORMANT or, once per outage, in recover_hold, the session enters RECOVERING, or stays in it, and runs the recovery schedule afresh (the hold that follows a schedule so restarted ends in DORMANT whatever is sent, so that an active sender does not keep its keys for the whole outage): one attempt at a time, toward one address at a time, until a generation commits, a FRESH establishes a replacement session, or the schedule is exhausted. The schedule has three parts.

  1. The attempts. An attempt is a CONTINUE request (Section 16.3) carrying the session's next attempt number (Section 9.3.3), one higher per attempt and persisted, so that a responder never serves an abandoned attempt after its successor.

    • Step 4, the first attempt. The zero-round-trip form is used only for the first attempt of a run because its response carries no ciphertext, about half of the exchange on the wire, and data the application sends while it is outstanding is early data with the properties of Section 16.3.2, forward-secret and not replayable; every later attempt of the run is CONTINUE, so that a prekey a lost answer consumed is not tried twice.

    • Step 4, the FRESH attempts. A peer that has lost all state and a peer that is unreachable both answer CONTINUE with silence, and a FRESH request is the only message that distinguishes them: hence the initiator's third and fifth attempts, unless the hearing rule says the peer holds the session and is reachable.

    • Hearing. Opening is not enough for a request to count as hearing: one recorded earlier and replayed still opens under the session's secret, and once the reply cache has let it go, or after a later attempt was served and it is dropped as stale (Section 9.3.3), nothing else stops it; counted, it would hold back the FRESH, the only attempt that recovers from a peer that has lost its state, for as long as the replays went on. The peer's attempt numbers only increase, so a new request always counts and a replayed one never does; the highest number seen is kept in memory only, so after a restart the first replay counts once.

    • One schedule probes. Both ends recover by CONTINUE and only one needs to probe with FRESH: two schedules sending FRESH on a slow link crowd out the CONTINUE that would recover the session and often supersede it. An initiator that has itself lost all state holds no session to recover and opens a new one. A recovery FRESH carries a SUPERSEDE object (Section 19.4.6) naming the session it replaces, because concurrent sessions with one peer are permitted (Section 9.6.2) and the responder cannot otherwise know which session to close.

    • Steps 1 to 3, replacement and life. An attempt is replaced when the next is due so that one unanswered address never holds recovery for anchor_timeout; a CONTINUE attempt ends at anchor_timeout from its first transmission because that is the life of the generation it created at the responder (Section 16.4), whatever the schedule's interval, a pause or a restart; and the grace for a response that has begun to arrive, to a CONTINUE attempt or to a recovery FRESH, stays within that life because a response completed after the attempt ended would commit a generation the responder has let go. The kept CONTINUE_0RTT attempt is not replaced because a new session takes no generation number of the old one; a paused attempt waits for its answer, and an attempt withheld for the peer's armed generation waits for its commit or expiry, the attempts refused meanwhile counting as failed, so that the schedule may run out during the wait and the session then recover from the hold or on dormant_retry.

    • The schedule also governs the next attempt whenever one ends without a commit: by yielding, by a failure to write the record, or because the generation the peer created in answer was discarded unconfirmed. Either endpoint may recover; Section 16.4 resolves both doing so at once.

  2. The intervals. Attempts follow recover_schedule. A re-anchor the protocol makes at once while RECOVERING, after a restored generation commits (Section 16.6.2), is the schedule's current attempt and is given its interval. Any re-anchor the protocol requires is the schedule's attempt like any other while the session is RECOVERING or DORMANT: one that cannot be made, because its number is reserved (Section 16.4), counts as a failed attempt, and at the initiator the third and fifth attempts are FRESH as for every session, since a FRESH makes no generation of this session and takes no number. Waiting for an armed generation of the peer's counts the same way; it ends by itself, by the generation's commit or its expiry within anchor_timeout.

    • Each interval is at least twice the last measured round trip and at least twice the session's exchange floor, the time its last anchor exchange took: at the requester from the request's last transmission to the response complete, at the responder from its last transmission of the response, a reply-cache answer to a retransmitted request included, to the requester's first packet that authenticates under the generation that response armed, so that neither measure includes the waits of lost copies; a response whose generation expired unconfirmed yields no measure. The floor is kept in the record so that the first attempt after a restart has it too, and it bounds the retransmit timer of Section 9.4 and the probe intervals of Section 9.3.9 and Section 15.3 as well, which never exceed probe_max under it, so that a generation's confirmation is probed several times within anchor_timeout whatever the exchange took.

    • After the schedule's last attempt has had its interval, the session stays RECOVERING for recover_hold, sending nothing, that attempt abandoned (a kept CONTINUE_0RTT attempt excepted, Section 16.3.2) and no further one made, and keeping its current generation; a wait that completes the count (above) leaves an attempt outstanding its interval, and the hold begins when that interval ends. The session keeps its generation so that a path that returns within it validates with a probe and the session resumes without a re-anchor (Section 18.2, S14); then it enters DORMANT and retries on dormant_retry, doubling to one hour, until max_dormancy; a session made DORMANT by SUSPEND{expected} makes its first retry no earlier than expected seconds after the announcement (Section 19.5).

  3. The rotation. Each CONTINUE attempt goes to the next address of an ordered list, as a pair with the local address that belongs to it: the local address of the candidate path whose address it goes to, else the local address the peer's address was last validated from, else the session's.

    • The list is, in order:

      • the addresses supplied to the session while it had no usable path (Section 15.3, source 2), newest first, which stay in the list after a candidate path made from one is lost to unanswered probes, since a supplied address is knowledge about where the peer is and a peer that cannot answer a probe can still answer an attempt;

      • the addresses at which the same peer identity is reached by this endpoint's other established sessions, the freshest evidence of where the peer is;

      • the addresses of the session's candidate paths, newest first;

      • the address the peer was last validated at;

      • the other previously validated addresses;

      • the configured hints.

    • The rotation advances with every CONTINUE attempt actually transmitted, retransmissions included. The FRESH attempts rotate over the same list on a count of their own, which the CONTINUE attempts do not advance and which does not advance them: the first FRESH attempt of an outage goes to the head of the list, the address the peer is most likely at, and each later one to the next address, across the runs of the schedule the outage takes, because a FRESH attempt is the only one that heals a peer holding a different lineage, as a responder whose armed generation expired (Section 16.4) after this endpoint committed it does, and the CONTINUE attempts reach such a peer but it can open none of them. While the CONTINUE attempts are withheld, the FRESH attempts take the CONTINUE count instead, being the only attempts sent.

    • A schedule that starts afresh, on the loss of the last path, on a send while DORMANT or in recover_hold, or on a hint, starts the CONTINUE rotation at the head; the FRESH count starts at the head on the loss of the last path and on a hint, and continues across a send while DORMANT or in recover_hold and across dormant_retry, which bring no knowledge of where the peer is.

    • A RECOVERING session that still has a validated primary path, as one whose committed generation was re-created from the record has (Section 12.7), makes the run's first attempt on it and rotates from the head after it, since an address validated from the set of Section 15.3 may answer nothing.

    • A hint (Section 15.3, source 2) given to a RECOVERING session that still holds a generation is probed at once and, if the probe is not answered within three measured round trips (at least 100 ms, at most the probe interval, which applies when no round trip is known), is the address of the next attempt, ahead of a candidate path the attempt would otherwise go to first; a re-anchor made at once because a packet from a candidate address committed a restored generation (Section 12.7) goes to that address first.

Supersession. If a FRESH attempt made during recovery completes and is confirmed (Section 9.3.9), the new session supersedes the old one at both endpoints: the responder closes the session named by SUPERSEDE with SUPERSEDED when the new one is confirmed (Section 9.3.9), never before, because a replayed FRESH request can never be confirmed; the requester closes it when the exchange completes. The new session inherits the previously validated addresses of the old one (Section 15.3).

The old session preferred. If a delayed CONTINUE response for the old session arrives first, the endpoint keeps the session confirmed most recently and abandons the FRESH attempt; so does a path of the old session validating while the FRESH is outstanding, and so does a path hint from the host, which restarts the schedule with the hinted pair as its first address, so that a FRESH completing a moment after a link returns does not supersede a session that is recovering on its own path.

Above the session. Durable state above the session is keyed on the peer's identity, not on the session, so that it survives supersession: the layer above sees Closed{SUPERSEDED} on the old session and Established on the new one, with the same peer fingerprint (Section 3).

Events. Recovering on entry to RECOVERING; ReAnchored on commit of a new generation; Dormant as above; EarlyDataUncertain{reason} when a CONTINUE_0RTT attempt under whose generation data was sent is answered with a RETRY (Section 16.3.2); Closed{reason} for the closes above. All but Closed are transport-class.

16.8. Scheduled Re-Anchor

A session re-anchors on its live path every reanchor_interval, using CONTINUE_0RTT when a prekey is held and CONTINUE otherwise. The handshake initiator schedules it; the handshake responder initiates its own only if the initiator is late by more than a quarter of the interval, so that the two do not routinely collide. Epoch chaining limits how many packets one traffic key encrypts and hides earlier epochs from an attacker who obtains only a later epoch secret; it does not hide them from one who obtains lineage_secret (Section 14.3). The scheduled re-anchor is the post-compromise ratchet. It heals a passive theft of the lineage's secrets: the successor secret folds in a fresh KEM secret the thief does not hold, so the thief loses the session at the first re-anchor it took no part in, within reanchor_interval. It does not by itself evict a thief who re-anchors first, since an ordinary CONTINUE authenticates by possession of cs(g - 1) alone; that thief is bounded by the identity re-proof deadline of Section 16.3.3, not by this interval. Because the address is unchanged, a scheduled re-anchor validates nothing and stalls nothing (Section 16.4).

16.9. Gateway Groups

A session recovered at a different gateway of the same operator is the same session only if that gateway holds the same identity key and the same records or the key that unseals them. Session portability across a gateway group therefore implies one gateway-group identity key, replicated to every gateway and preferably held in hardware at each, with the consequence that compromise of one gateway is compromise of the group identity. The sealed-record key, the tombstones of closed sessions (Section 16.6.3) and the receiver prefix convention (Section 15.1) are replicated the same way. Closure state is negative authority and the inverse of the cohort's freshness rule: a gateway restores a session from a record only with closure state it knows to include every closure of the group, and one that cannot establish that serves no record, so that a closure made at one gateway cannot be undone at another. Prekeys need no coordination: a prekey's decapsulation key is never in a record, so only the gateway that issued it can serve a CONTINUE_0RTT under it, and a gateway serving from a record answers PREKEY_UNAVAILABLE (Section 16.6.3). A single gateway is the degenerate case. This is a deployment decision and is stated as such; Section 23 states its containment cost.

16.10. Stated Limits and Exercised Scenarios

Limits (restated in Section 23).

  • A holder of cs(g). A holder of cs(g) can re-anchor as the session's endpoint until the identity re-proof deadline of Section 16.3.3, at most max_reproof_interval after the last proof, after which nothing above the session moves and the session closes when a proving exchange is given up unsatisfied (Section 16.3.3); the ratchet heals a one-time leak once the legitimate endpoint re-anchors first, and the race is real. Neither reanchor_interval nor max_dormancy bounds the holder: the first is the ratchet's period, the second bounds dormancy.

  • Records. A copy of a record at rest is bounded by Section 16.6.2, and a sealed record by its record key (Section 16.6.3).

  • Closure state. An endpoint that loses its closure state with the rest of its state cannot tell a closed session's record from a live one; it serves no record until the state is recovered or the record key retired (Section 16.6.3), at the cost of FRESH for every session it would have restored, and a gateway group that replicates its closure state is not exposed. A storage failure followed by a crash before the closure write could be retried leaves the session's record where a tombstone should be; the restart restores the session DORMANT, and a holder of its secret can re-anchor it, which is the residual the write-ahead rule of Section 19.6 leaves.

  • Early data. The CONTINUE_0RTT form at a stateless responder degrades to one round trip and never to replayable data; in a gateway group whose members serve the same session one from state and another from a sealed record, early data of an attempt the second refuses may have been delivered by the first, so a RETRY leaves its fate unknown (Section 16.3.2).

  • Authorization. Dormancy keeps the session and not its authority: a re-anchor never extends authorization.

  • The session identifier. A requester that commits g on a CONTINUE response, after which every packet it sends is lost for the life of the responder's armed g (anchor_timeout, Section 16.4), is a generation ahead of a peer that holds g - 1, and has erased cs(g - 1): the session recovers by the schedule's FRESH attempt, which supersedes it (Section 16.7). The case is safe and live, and costs the session identifier.

  • The identifier under two schedules. An outage that ends while both endpoints run their recovery schedules can also cost the identifier although both kept the session: the initiator's third and fifth attempts are FRESH (Section 16.7), and one that completes before a CONTINUE of the responder supersedes the session. Because only the initiator makes them, and only when it has not heard from the peer within the interval (Section 16.7), and because recover_hold keeps the generation after the schedule's last attempt, this is uncommon even on a slow link, where the endpoint that detects the loss by liveness runs its schedule late. It too is safe and live: the layer above sees Closed{SUPERSEDED} and Established with the same peer fingerprint (Section 16.7).

  • Declining a FRESH. A responder that still holds the session could decline such a FRESH and keep the identifier, but declining is safe only while both ends can re-anchor at once, which a lossy link often prevents for a moment; this version does not decline.

17. Authorization

Authorization is what a session is permitted to carry, as distinct from identity (who the peer is, Section 9) and from paths (where the peer is, Section 15). It is session-owned state: no path event, dormancy or re-anchor creates, extends, refreshes or revokes it.

17.1. Grants

A grant is the AUTHZ object of Section 19.4.2, issued by one endpoint to the other:

AUTHZ = ttl(4) ref_len(1) ref(0..255)
  • The grantor is authoritative for the grants it issues; the grantee holds a copy. Each endpoint issues its own grant to the peer, so a session carries two independent grants, one per direction. In a client-and-gateway deployment the gateway's grant is the one that matters and the client's is unbounded; between peers of equal standing both matter.

  • A grant states that the grantor will accept the peer's application data and provide its services to the peer until the grant expires. It governs delivery of application data (stream_id 0x00 to 0xDF and upper-layer streams), not control frames, probes or anchor exchanges, which a session needs in order to exist at all.

  • ttl is in seconds. The grantee counts it from its first receipt of that version; ttl = 0xFFFFFFFF means until revoked; ttl = 0 revokes (Section 17.4). ref is opaque to PQST: it names the grant to the grantor's own policy or to an upper layer, which may use it to look up what the grant covers.

  • An endpoint that performs no authorization of its own MUST still issue a grant, with ttl = 0xFFFFFFFF and an empty ref, at establishment. The absence of a current grant means nothing from the peer is delivered.

17.2. Issuance and Delivery

Each endpoint issues version (0, 1) of its grant in its sealed part of the FRESH exchange, the initiator in the request and the responder in the response (Section 9.3.7), or, if that would exceed the reflection bound, as an OBJECT immediately after establishment. The exchange's objects belong to generation 0, whose counters continue after it commits (Section 19.3.1). Later versions travel as OBJECT frames with the reliability of Section 19.3. The grantor's own decisions use the grant it issued from the moment of issuance, whether or not it has been acknowledged; acknowledgement tells the grantor that the grantee knows the terms.

The three inputs to the grantor's decision at establishment is: the peer's identity (Section 9.3.6), the authz_hint the peer sent in its sealed request (Section 9.2.1), and the grantor's policy. The hint is at most 64 octets and proves nothing: a deployment that needs a verified token binds it to the identity through its own policy, for example by accepting a token only from the fingerprint it was issued to.

17.3. Expiry

  • The grantor stops delivering the peer's application data when, by its own clock, the grant it issued has been expired for longer than authz_delivery_bound (delta, default 5 s), which covers the grantee's later receipt of the version and clock drift between two monotonic clocks. It then closes the session with AUTHZ_EXPIRED (Section 20), a policy-class close reported as the security-class event AuthzExpired.

  • The grantee stops sending application data when its copy expires, and, if no newer version arrives within delta, closes with AUTHZ_EXPIRED as well. Under normal delivery the grantor's CLOSE arrives first. When the grantor cannot deliver the renewal, because it holds no path or is DORMANT, the grantee's copy expires first and the grantee closes; the grantor learns of it from the tombstone when it re-anchors, or closes on its own expiry. A short grant therefore bounds how long a session survives unreachability as well as how long it lives; a deployment that wants sessions to survive outages issues grants longer than the outages it expects.

  • A grantor that intends the session to continue renews before expiry: a new version with a new ttl, RECOMMENDED at half the previous lifetime, so that one lost renewal and its retransmissions fit before expiry.

  • A grant's lifetime bounds the session as effectively as max_dormancy does: a session whose grant expires while DORMANT is closed when the expiry is noticed, and a re-anchor of a session whose grant has expired is refused with CLOSE{AUTHZ_EXPIRED} after the request authenticates. A deployment that wants sessions to survive long dormancy issues grants at least as long as max_dormancy.

  • Nothing in expiry uses a synchronised clock. Both endpoints count seconds on local monotonic clocks; the grantor's count starts earlier, which is why the grantor's view is the authoritative one.

17.4. Revocation

The grantor issues a version with ttl = 0, then CLOSE{AUTHZ_REVOKED}. From the moment of issuance it delivers nothing from the peer and refuses any re-anchor of the session; the close reason is a policy-class close reported as the security-class event AuthzRevoked. Revocation of an identity, as opposed to a grant, is an authorization decision and not a cryptographic one: a revoked identity still holds its private key and completes any identity proof, and that success restores nothing. A revoked identity obtains no new session by FRESH, since the responder admits a FRESH only from an identity its policy authorizes (Section 9.3.6), and restores none by CONTINUE or from a sealed record, since restoration is verified against current authorization (Section 16.6.3); its sessions are closed with AUTHZ_REVOKED as a grant's are. Closing a session and revoking an identity are distinct: the first ends that session identifier for good, and the identity may open a new session while it is authorized; the second ends the identity's authorization until it is explicitly reauthorized.

17.5. Restart and Re-Anchor

  • Grants are persisted in the continuity record as Section 16.6.1 states: the grant the endpoint issued, with its remaining lifetime at the time of writing, so that it can be enforced and re-issued, and with the time since the write counted against it on restore (Section 16.6.1); the grant held is not relied on after a restart: neither its terms nor its version number are restored, so that the peer's current version, which every re-anchor request and response carries (Section 9.3.7), is adopted whatever its number. Until it arrives the held grant is treated as expired, which stops the sending of application data and nothing else.

  • A re-anchor never extends, refreshes or restores a grant; only a new version issued by the grantor does. Identity re-proof (Section 16.3.3) may be the grantor's precondition for issuing one, which is the grantor's policy, not a protocol rule.

  • A session admitted with an unknown identity (Section 9.3.6) receives whatever grant the grantor's policy gives such sessions, which may be none.

17.6. Upper Layers

An upper layer that keeps its own authorization state binds it to the session through the exporter (Section 8.6) and to the identity through the fingerprint, and may place a reference to it in ref. PQST enforces only the grant; what the reference means is the upper layer's. A grant's class in the persistence hierarchy is the session's (Section 3): it is above paths and epochs and below identity.

18. State Machine

This section is the authoritative transition table of a PQST endpoint. It is written so that it can be checked mechanically: every transition names its trigger, its guard, its effect, the state it leads to, and the class of event it reports. The invariant harness (Section 22) reads this table; the prose sections it summarises govern where they say more.

18.1. States

Session.

Table 18
State Meaning
NONE no session
HALF_OPEN an anchor exchange for generation 0 is in progress and no generation is committed
ESTABLISHED a generation created in this process is committed (never one re-created from the record, Section 12.7) and at least one path is CANDIDATE or VALIDATED
RECOVERING a generation is committed, no path is usable, and recovery attempts are under way or recover_hold runs after the schedule's last; all state is retained
DORMANT no path is usable and no attempt is under way; only the continuity record and the recovery-identifier entry are retained
CLOSED terminal; only a tombstone may remain (Section 19.6)

Path (per path, Section 15): CANDIDATE, VALIDATED, LOST, then removed.

Generation (per generation, Section 16.4): ARMED, COMMITTED, RETIRED, then erased.

Exchange (per anchor exchange in progress, Section 9): REQUESTED (request sent, awaiting response) at the requester; RESPONDED (response sent, awaiting confirmation) at the responder.

18.2. Session Transitions

Triggers are authenticated packets, exchange completions, timers, or local decisions. No transition is triggered by an unauthenticated packet (Section 11.7). "Class" is the event class of Section 3.

  • S1. From: NONE; Trigger: application opens a session; Guard: identity key and peer key held; Effect: write-ahead init_counter; send FRESH (or DISCOVER then FRESH); To: HALF_OPEN

  • S2. From: NONE; Trigger: FRESH request accepted (Section 9.3.2); Guard: checks of 9.3.2 pass; Effect: respond; generation 0 ARMED; half-open timer; To: HALF_OPEN

  • S3. From: HALF_OPEN; Trigger: response opens (requester); Guard: 9.3.8; Effect: commit generation 0; send confirmation packet; the pair the request was sent to VALIDATED when the attempt went to one pair, the response's source CANDIDATE when it differs (Section 9.3.8); To: ESTABLISHED; Event (class): Established (transport)

  • S4. From: HALF_OPEN; Trigger: first protected packet authenticates (responder); Effect: commit generation 0; To: ESTABLISHED; Event (class): Established (transport)

  • S5. From: HALF_OPEN; Trigger: anchor_timeout, attempts exhausted, or the session the peer initiated confirmed under 9.6.1; Effect: erase exchange state and dk; To: NONE; Event (class): OpenFailed (transport)

  • S6. From: ESTABLISHED; Trigger: path becomes VALIDATED; To: ESTABLISHED; Event (class): PathAdded (transport)

  • S7. From: ESTABLISHED; Trigger: sender's primary path changes; To: ESTABLISHED; Event (class): PathChanged (transport)

  • S8. From: ESTABLISHED; Trigger: a path is lost; Guard: another path is CANDIDATE or VALIDATED; Effect: retire the path after path_retire; To: ESTABLISHED; Event (class): PathLost (transport)

  • S9. From: ESTABLISHED; Trigger: a path is lost; Guard: no other usable path; Effect: start recover_schedule; retain everything; To: RECOVERING; Event (class): PathLost, Recovering (transport)

  • S10. From: ESTABLISHED; Trigger: receive epoch advances (Section 14.4); To: ESTABLISHED; Event (class): EpochAdvanced (transport)

  • S11. From: ESTABLISHED; Trigger: re-anchor commits (scheduled, on demand, or peer-initiated); Effect: new generation COMMITTED; previous RETIRED after lineage_grace; identifiers reinstalled; paths kept; unacknowledged objects sent again (Section 19.3.3); To: ESTABLISHED; Event (class): ReAnchored (transport)

  • S12. From: ESTABLISHED, RECOVERING; Trigger: SUSPEND received; Effect: discard all but record, recovery entry and a peer-armed generation (Section 16.7); To: DORMANT; Event (class): Dormant{announced} (transport)

  • S13. From: ESTABLISHED; Trigger: local decision to suspend; Effect: optionally send SUSPEND; discard as S12; To: DORMANT; Event (class): Dormant (transport)

  • S14. From: RECOVERING; Trigger: authenticated packet creates a CANDIDATE path, or a re-anchor commits; Guard: the committed generation was created in this process (Section 12.7); Effect: stop the schedule; unacknowledged objects sent again (Section 19.3.3); To: ESTABLISHED; Event (class): PathAdded or ReAnchored (transport)

  • S15. From: RECOVERING; Trigger: recover_schedule exhausted and recover_hold passed; Effect: discard as S12; start dormant_retry; To: DORMANT; Event (class): Dormant (transport)

  • S16. From: DORMANT; Trigger: dormant_retry fires, application sends, or a hint arrives; Guard: within max_dormancy; Effect: start recover_schedule; To: RECOVERING; Event (class): Recovering (transport)

  • S17. From: DORMANT; Trigger: peer's CONTINUE request accepted and committed, or a generation armed before dormancy commits (Section 16.7); Effect: rebuild from record; unacknowledged objects sent again (Section 19.3.3), except under a generation re-created from the record, after whose re-anchor they go; when the committed generation was re-created from the record, schedule the re-anchor it calls for; To: ESTABLISHED or RECOVERING; Event (class): ReAnchored (transport), then Recovering (transport) in the second case

  • S18. From: DORMANT; Trigger: max_dormancy elapsed; Effect: erase record; keep tombstone; To: CLOSED; Event (class): Closed{DORMANCY_EXPIRED} (security)

  • S19. From: any but NONE, CLOSED; Trigger: issued grant expired beyond delta, or held grant expired beyond delta with no renewal (Section 17.3); Effect: tombstone; send CLOSE if a path exists; erase record; To: CLOSED; Event (class): AuthzExpired, Closed{AUTHZ_EXPIRED} (security)

  • S20. From: any but NONE, CLOSED; Trigger: grantor revokes (Section 17.4); Effect: AUTHZ with ttl = 0; tombstone; CLOSE; erase; To: CLOSED; Event (class): AuthzRevoked, Closed{AUTHZ_REVOKED} (security)

  • S21. From: any but NONE, CLOSED; Trigger: required identity proof or CERT verification fails (Section 16.3.3 and Section 19.4.5); Effect: tombstone; CLOSE; erase; To: CLOSED; Event (class): ReproofFailed, Closed{REPROOF_FAILED} (security)

  • S23. From: any but NONE, CLOSED; Trigger: lineage_gen would exceed 0xFFFF (Section 12.2), or attempt would (Section 9.3.3); Effect: tombstone; CLOSE; erase; the application may open a new session; To: CLOSED; Event (class): Closed{SESSION_LIFETIME} (security)

  • S24. From: any but NONE, CLOSED; Trigger: a newer session that names this one in SUPERSEDE is confirmed (Section 9.6.1 and Section 16.7); Effect: tombstone; CLOSE; erase; To: CLOSED; Event (class): Closed{SUPERSEDED} (security)

  • S25. From: any but NONE, CLOSED; Trigger: CLOSE received, or RETRY CLOSED opened; Guard: authenticated; Effect: tombstone; erase record and state; no reply; To: CLOSED; Event (class): Closed{reason} (security)

  • S26. From: any but NONE, CLOSED; Trigger: application closes; Effect: tombstone; CLOSE up to three times; erase; To: CLOSED; Event (class): Closed{LOCAL_CLOSE} (security)

  • S27. From: any but NONE, CLOSED; Trigger: persistent protocol violation after authentication (Section 20.3); Guard: threshold; Effect: tombstone; CLOSE; erase; To: CLOSED; Event (class): Closed{PROTOCOL_ERROR} (security)

  • S28. From: NONE; Trigger: restart: the continuity record is loaded (Section 16.6.2); Guard: record present and within max_dormancy; Effect: re-create the record's armed generation, and one a kept CONTINUE_0RTT attempt derived, receive-only (Section 12.7), the committed generation as its continuity secret alone; retransmit an outstanding request younger than anchor_timeout from its first transmission, else abandon it and re-anchor toward the address the peer was last seen at; To: DORMANT or RECOVERING; Event (class): Recovering (transport) once an attempt is made

  • S29. From: RECOVERING; Trigger: application sends, once per outage, in recover_hold, or a hint arrives (Section 16.7); Effect: restart recover_schedule; a hint starts the rotation at the head and probes its pair first; To: RECOVERING

A FRESH exchange started during recovery (Section 16.7) is a new session following S1 and S3; its SUPERSEDE object triggers S24 on the session it names when the new one is confirmed.

18.3. Path Transitions

  • P1. Trigger: authenticated packet from a new address pair with an index not seen in this generation (Section 15.1); local supply; CONTINUE request from a new address; anchor response from a pair other than its request's destination (Section 9.3.8); Effect: create path; the address's budget applies; To: CANDIDATE

  • P2. From: CANDIDATE or VALIDATED; Trigger: authenticated packet from a new address with an index seen in this generation on this path; Effect: rebind: the new address is recorded as the path's candidate address and replaces the old one on validation (P3); the old address stays in use until then; To: unchanged (same path, same identifier)

  • P3. From: CANDIDATE, or any state with a rebind address pending; Trigger: matching PROBE_ACK for a PROBE sent toward the address, on whichever path it arrives; the address is in the previously validated set; or, at the requester, the pair the anchor request was transmitted to, alone, when its response opens and the exchange commits (Section 9.3.8); Effect: budget lifted; the address joins the session's validated set; a rebind adopts the new address, and a CANDIDATE path whose rebind address validates is VALIDATED there; To: VALIDATED; Event: PathAdded (transport) for a new path; PathChanged (transport) when the primary's address changes; none otherwise

  • P4. From: CANDIDATE; Trigger: k_probe probes unanswered; Effect: discard a new path; for a rebind, keep the old address if it is still live, else LOST; To: removed or LOST; Event: PathLost if lost

  • P5. From: VALIDATED; Trigger: k_probe probes unanswered (active), or after a send (passive); or the local address is withdrawn by the endpoint; Effect: identifier retired after path_retire; the address leaves the previously validated set; To: LOST; Event: PathLost (transport)

  • P6. From: any; Trigger: session leaves ESTABLISHED or RECOVERING for DORMANT, or closes; Effect: discard, with every record that names the path (Section 16.7); To: removed

  • P7. From: any; Trigger: re-anchor commits with the address unchanged; Effect: identifiers change; validation, MTU and liveness kept; To: unchanged

  • P8. From: LOST; Trigger: authenticated packet or anchor message from the path's address; Effect: one probe (Section 15.3); To: CANDIDATE

Any authenticated packet on a path refreshes its liveness in every state.

18.4. Generation Transitions

  • G1. Trigger: response sent (responder) or request sent in CONTINUE_0RTT (requester); Effect: keys and identifiers installed; previous generation untouched; To: ARMED

  • G2. From: ARMED; Trigger: first packet authenticates under it (responder: a PROBE_ACK or a request under a CONTINUE_0RTT generation, any packet otherwise, Section 16.4); response opens (requester); Effect: persist cs(g), the commit standing only once the write holds (Section 16.4); erase cs(g - 1); remove rec(g - 1, .); To: COMMITTED

  • G3. From: ARMED; Trigger: its lifetime elapses with its cached answer (anchor_timeout for CONTINUE, reply_cache_ttl for CONTINUE_0RTT, renewed by retransmissions, or anchor_timeout from a restart that restored it without an answer, Section 16.6.2); a different request re-serves the generation (Section 16.4); the number is settled by another commit; its own requester abandons it by yielding to a crossing CONTINUE_0RTT (Section 16.4); Effect: discard; To: erased

  • G4. From: COMMITTED; Trigger: the next generation commits; Effect: keys, windows and identifiers kept for lineage_grace; To: RETIRED

  • G5. From: RETIRED; Trigger: lineage_grace elapsed; Effect: erase; To: erased

18.5. Event Classes

Table 19
Class Events Guarantee
transport Established, PathAdded, PathChanged, PathLost, EpochAdvanced, ReAnchored, Recovering, Dormant{announced}, EarlyDataUncertain{reason}, ReanchorFailed, OpenFailed, Discovered, DiscoverFailed changes no state above the session: identity, grants, exporter values, upper-layer bindings and the session identifier are untouched
security Closed{reason}, AuthzExpired, AuthzRevoked, ReproofFailed, GrantHeld, CertReceived the only events after which an upper layer may need to act on its own state: a close, or new authorization or identity evidence held
data Delivered{stream_id}, ObjectHeld{kind}, InnerAddr application data delivered after authentication, replay commit and grant check

Established carries the peer's fingerprint and the session identifier, which is how an upper layer keys its durable state on identity (Section 3). ReanchorFailed and OpenFailed are local reports of an attempt that ended without a commit; GrantHeld reports a grant object from the peer adopted (Section 17.5) and CertReceived a certificate (Section 19.4.5).

18.6. Properties Checkable from the Tables

  1. Every trigger in Section 18.2 is an authenticated packet, an exchange completion that required authentication, a timer, or a local decision; none is an unauthenticated packet (Section 11.7).

  2. Every transport-class transition leaves everything above the session unchanged: the identity, the grants, session_root and the session identifier (Section 3). The generation, the epochs and the paths are the session's own and may change; a re-anchor is transport-class for that reason. The two events that change what is held above the session, GrantHeld and CertReceived, are security-class.

  3. CLOSED has no outgoing transition.

  4. DORMANT retains only the continuity record, the recovery-identifier entry and a generation the peer's request armed (Section 16.7).

  5. No path transition changes session state except S8, S9 and S14, and those change only the session's reachability state.

  6. The only transitions that erase a committed generation's secret are G2 (the next commit) and the closes.

19. Control Frames and State Objects

Control frames are the only protocol signalling that travels inside a session. They are carried in protected packets on stream_id 0xFE under the framing of Section 10.5, authenticated and header-protected like application data, and processed only after the packet's replay commit (Section 11.4). There are six frames: two for probing, two for state objects, one announcement and one close. Everything an endpoint must deliver reliably to its peer is a state object; everything else is transient.

19.1. Frame Types and Registry Ranges

Table 20
Range Use Unknown type
0x00 never valid drop the packet's remaining frames; count
0x01-0x3F session core (this document) skip by length; count
0x40-0x7F reserved for multipath extensions skip by length
0x80-0xBF reserved for protocol-defined upper layers, assigned by registry (Section 25) skip by length
0xC0-0xFF private use skip by length

A receiver skips a frame whose type it does not implement, using its length, and continues with the next frame; it MUST NOT close the session because of an unknown type. Whether a peer implements an optional frame or object kind is known from capabilities (Section 21), not discovered by trial.

Table 21
Type Name ctrl_data Section
0x01 PROBE path_id(1) data(8) 19.2
0x02 PROBE_ACK path_id(1) data(8) 19.2
0x03 OBJECT kind(1) version(4) total_len(2) offset(2) data(*) 19.3
0x04 OBJECT_ACK kind(1) version(4) 19.3
0x05 SUSPEND expected(2) 19.5
0x06 CLOSE reason(1) 19.6

A frame whose ctrl_data is shorter than its fixed fields, or longer than its definition allows, is malformed; the packet's remaining frames are dropped and the event is counted. Frames already processed from the same packet stand, as does the packet's replay commit.

19.2. PROBE and PROBE_ACK

PROBE     = path_id(1) data(8)      ; data is fresh randomness from a
                                    ; cryptographically secure source
PROBE_ACK = path_id(1) data(8)      ; both fields echoed

path_id is the sender's local handle for the path on which it sends the PROBE (Section 15.2); the peer echoes it without interpretation, so each endpoint numbers its own paths.

Rules.

  • A receiver MUST answer every PROBE with exactly one PROBE_ACK carrying the same fields, sent on the path on which the PROBE arrived, under its current sending generation and epoch; a PROBE that authenticates under an armed generation commits it first (Section 16.4), so the answer to a confirmation probe is under the probe's generation; a PROBE under a generation a CONTINUE_0RTT request armed commits nothing, and is answered under the current generation; when the PROBE came from an address being validated as a path's rebind, through that path to that address (Section 15.3). A PROBE_ACK packet is 56 octets, never padded, and never larger than the packet that elicited it, so it always fits the budget for an unvalidated path (Section 15.4).

  • A PROBE_ACK is accepted only if data matches a PROBE the receiver sent and has not yet matched; otherwise it is ignored and counted. An endpoint keeps at most 8 outstanding probes per path and discards the oldest when it needs a ninth.

  • Any authenticated packet refreshes the liveness of the path it arrives on (Section 15.6); a PROBE_ACK additionally validates the path the matching PROBE was sent on (Section 15.3), and if that PROBE was carried in a packet padded to a candidate size, confirms that size for the path (Section 15.5).

One frame pair therefore serves five purposes: liveness, path validation, confirmation of an epoch advance (Section 14.1, where the required PROBE_ACK answers a PROBE sent in the epoch being left, whatever epoch the acknowledgement itself arrives in), confirmation of a new generation by either side (Section 9.3.8 and Section 9.3.9), and path MTU discovery. The randomness is needed for validation, where the challenge must be unpredictable to a peer that claims an address it does not hold; it costs nothing to keep for the other uses.

19.3. OBJECT and OBJECT_ACK

A state object is a value one endpoint owns and the other must hold a current copy of. Objects replace per-purpose signalling frames with one reliable, idempotent delivery mechanism.

19.3.1. Object Encoding

ObjectHeader = kind(1) version(4)
Object       = ObjectHeader body_len(2) body(*)
               ; the form used inside anchor messages (Section 9.2)

version      = lineage_gen(16) || counter(16)
  • kind identifies the object type (Section 19.4).

  • version is assigned by the issuer per (session, kind): lineage_gen is the generation in which the version was issued, which for an object carried in the response that creates generation g is g, counter starts at 1 in each generation and increases by 1 for each new version of that kind. Versions are therefore strictly increasing over the session with nothing persisted across a restart, because a restart forces a re-anchor and a new generation. The counters of generation 0 continue after it commits: the objects of the FRESH exchange are generation-0 versions (Section 9.3.7), and a reset at the first commit would reissue (0, 1). A version that would exceed 0xFFFF in counter forces a re-anchor.

  • The holder of a kind is the endpoint that receives it; the issuer is the endpoint that sends it. For most kinds both endpoints are issuers of their own instance (each endpoint issues its own AUTHZ grant, its own NEXT_EK); the instances are independent objects.

19.3.2. Frames

OBJECT     = kind(1) version(4) total_len(2) offset(2) data(*)
OBJECT_ACK = kind(1) version(4)

An object whose body fits one packet is sent as one OBJECT frame with offset = 0 and total_len = len(data). A larger object is sent as segments, each carrying total_len and its offset; segments MUST NOT overlap and together MUST exactly cover [0, total_len). total_len MUST NOT exceed MAX_OBJECT = 16384 octets; kinds impose their own smaller bounds (Section 19.4).

19.3.3. Issuer Rules

  1. Assign the next version; persist what the kind requires (Section 19.4) before transmission.

  2. Send every segment. Retransmit all segments of the object when no OBJECT_ACK with a version at or above it has arrived after a retransmission interval: initially 1 s or twice the smoothed round-trip time when known, doubling to a cap of 16 s, without limit while the session has a validated path. When a session has a usable path again after an outage, or a generation commits (not one re-created from the record, under which nothing is sent, Section 12.7: the objects go after the re-anchor that follows), every object not yet acknowledged is sent again at once, its interval reset: a session can return from RECOVERING on its generation without a re-anchor (Section 16.7), and an object outstanding through the outage would otherwise wait for a timer that the outage let lapse. Issuing a newer version supersedes the older: stop sending it and send the new one. An issuer paces the segments of an object larger than one datagram across the path's round-trip time rather than sending them as one burst ([RFC8085]); a retransmission sends the object's segments again, and the holder keeps the ones it already had (Section 19.3.4).

  3. Treat an OBJECT_ACK carrying a version at or above the outstanding one as delivery; treat a lower version as a request to continue retransmitting.

19.3.4. Holder Rules

  1. Assemble segments per (kind, version) in a buffer bounded by MAX_OBJECT, keeping the segments received across the issuer's retransmissions, so that a retransmission completes the object by the segments the holder lacked rather than starting it over, and ignoring a segment already held; hold at most one incomplete object per kind, discarding an incomplete older version when a segment of a newer version arrives, and discarding any segment whose version is not greater than the version already held for the kind.

  2. When an object is complete and its version is greater than the version held for the kind, apply it as its kind defines, record the version, and persist what the kind requires.

  3. After processing any complete OBJECT, and on receipt of a segment of a version already held or superseded, send OBJECT_ACK carrying the version now held for the kind. Duplicates are acknowledged, never applied twice.

  4. Kinds 0x10-0x1F, reserved for the cohort layer (Section 26), and 0x80-0xFF, for upper layers and private use, are delivered to the layer above the session with their versions, and acknowledged; that is what implementing them means at this layer. For these kinds the version held is the process's, not the record's: the holder persists neither the version nor the body, so that after a restart it holds none, acknowledges nothing it has not received since, and delivers again whatever the issuer sends, the same version included; delivery to the layer above is therefore at least once across the holder's restart, the issuer's versions increase across its own restarts because it persists them, and what the layer above needs across a restart it persists itself. An acknowledgement before a restart implies nothing about what the layer above holds after it; a layer that needs to know asks it, as the cohort's REPORT does. An object of any other kind the holder does not implement is acknowledged (so the issuer stops) and otherwise ignored; issuers consult capabilities before sending optional kinds.

  5. An object of a kind the holder implements whose body does not parse for that kind (Section 19.4) is discarded: it is neither applied nor acknowledged, its version is not recorded, and it counts as a protocol violation (Section 20.3). The same holds for an object carried in a sealed part.

Delivery is idempotent within a process, and resumable after a crash on either side for the kinds whose versions and bodies the record keeps (Section 16.6), at least once across the holder's restart for the kinds it hands to the layer above; it costs an eight-octet acknowledgement frame per version, which rides in any packet.

19.4. Object Kinds

  • 0x01. Name: NEXT_EK; Issuer: either; Body: nek(L_ek); Bound: L_ek (1,568 in suite 0x0001); Persisted by holder: yes

  • 0x02. Name: AUTHZ; Issuer: either; Body: ttl(4) ref_len(1) ref(0..255); Bound: 260; Persisted by holder: yes, as Section 16.6 states

  • 0x03. Name: RECORD; Issuer: a responder that issues sealed records; Body: opaque; Bound: 472; Persisted by holder: yes

  • 0x04. Name: INNER_ADDR; Issuer: either, if capability bit 1; Body: Section 19.4.4; Bound: 512; Persisted by holder: yes

  • 0x05. Name: CERT; Issuer: either; Body: cert_type(1) certificate(*); Bound: 16,384; Persisted by holder: no

  • 0x06. Name: SUPERSEDE; Issuer: the requester of a recovery FRESH (Section 16.7); Body: session_id(16); Bound: 16; Persisted by holder: no; applied at confirmation

  • 0x10-0x1F. Name: reserved for the cohort layer (Section 26), delivered to the layer above; Bound: 16,384 (MAX_OBJECT); Persisted by holder: neither the version nor the body, at this layer; the cohort layer persists what it needs (Section 19.3.4)

  • 0x80-0xBF. Name: reserved for protocol-defined upper layers (Section 25)

  • 0xC0-0xFF. Name: private use

19.4.1. NEXT_EK

A prekey for the CONTINUE_0RTT form (Section 16.3.2). The issuer persists the decapsulation key, or the local_secret and version from which it regenerates it, before sending. On applying a new version the holder replaces the prekey it held; the issuer erases the decapsulation key of any unconsumed earlier version when the new one is acknowledged. A NEXT_EK is issued after establishment and after each consumption (Section 16.3.2), and reissued when a regenerated prekey's local_secret is rotated; a re-anchor that consumes nothing leaves the prekey held valid. It never travels inside an anchor message.

19.4.2. AUTHZ

The issuer's grant to the holder (Section 17). ttl is seconds, counted by the holder from its first receipt of that version; ttl = 0xFFFFFFFF means until revoked; ttl = 0 revokes. ref is opaque to PQST and names the grant to the issuer's own policy or to an upper layer. The holder treats a grant held across its own restart as expired until a fresher version arrives (Section 16.6.1).

19.4.3. RECORD

A sealed record (Section 16.6.3). The holder stores the latest version and echoes it in the cleartext record field of its CONTINUE requests.

19.4.4. INNER_ADDR (OPTIONAL; Capability Bit 1)

The inner addresses the issuer assigns to the holder for the traffic the session carries:

INNER_ADDR = count(1) *( family(1) address(4|16) prefix_len(1)
             lifetime(4) )
family     = 4 (IPv4, 4-octet address) | 6 (IPv6, 16-octet address)
lifetime   = seconds from first receipt of this version; 0xFFFFFFFF =
             until revoked

prefix_len is at most 32 for family 4 and at most 128 for family 6. A body with another family, a longer prefix_len, or a length other than count entries does not parse (Section 19.3.4, rule 5).

A new version replaces the previous assignment entirely. Addresses survive every epoch, path and re-anchor because the object does; their lifetime is counted on the holder's monotonic clock and is refreshed by a new version. Routing, address conflicts and anything beyond assignment are outside this document. Deployments that configure inner addresses statically do not use this kind.

19.4.5. CERT

Offline certification of the issuer's identity key, delivered after establishment to a peer that did not already trust the key (Section 9.7.3): cert_type 1 is an ML-DSA-87 binding statement, 2 an X.509 chain, in the formats of Section 6. The holder verifies against its trust anchors and closes with REPROOF_FAILED on failure.

19.4.6. SUPERSEDE

The session identifier (Section 8.6) of the session a recovery FRESH request replaces (Section 16.7). It travels only in the sealed objects of a FRESH request (Section 9.2.1). The responder keeps it with the half-open exchange and, when the exchange is confirmed (Section 9.3.9), closes the named session with SUPERSEDED if it holds one with the same peer; before confirmation it closes nothing, because a replayed request can never be confirmed. A body of another length is malformed and discarded (Section 19.3.4, rule 5), and the request is served without it. The object is never acknowledged, never persisted and never sent as a frame.

19.5. SUSPEND

SUSPEND = expected(2)     ; seconds the sender expects to be
                          ; unreachable; 0 = unknown

Sent by an endpoint that is about to lose connectivity deliberately (radio off, sleep, a planned move), up to three times 1 s apart (the initial retransmission interval of Section 9.4), after which it stops transmitting and is DORMANT itself. The receiver stops probing the sender's paths, moves the session to DORMANT at once with the announced flag (Section 16.7), and makes its first recovery attempt after the larger of dormant_retry and expected seconds; an application send while DORMANT starts recovery at once (Section 16.7), announcement or not. SUSPEND carries no authority beyond the sender's own session: it cannot affect any other session, and a peer that keeps sending after announcing suspension is simply still reachable. For an upper layer that tracks membership this is the signal that distinguishes a deliberate absence from a lost one.

19.6. CLOSE

CLOSE = reason(1)         ; Section 20

Sender. Closure is durable before it is visible: the sender persists the tombstone below in place of the continuity record, atomically, before the first CLOSE leaves and before it reports the session closed; a transition to CLOSED is terminal for the session identifier, which neither endpoint ever restores by CONTINUE, CONTINUE_0RTT or a sealed record. If the write fails, the session is closed to the layer above at once, nothing is delivered or sent on it but CLOSE, no CLOSE leaves until the write succeeds, and the write is retried; while any closure write is pending the endpoint serves no sealed record (Section 16.6.3). Then send CLOSE up to three times 1 s apart (the initial retransmission interval of Section 9.4), if a path exists, and discard all session state except the tombstone: the session identifier (Section 8.6), under which the tombstone is stored and by which every sealed record of the session, of any generation, is recognised as closed (Section 16.6.3); the recovery identifier the peer would use to re-anchor toward this endpoint, rec(g, dir_in), derived from cs(g) at close so that a session closed while DORMANT or after a restart, which holds no live generation, leaves one too, and likewise rec(g + 1, dir_in) for a generation g + 1 armed but not committed at close, since the peer may hold it committed and re-anchor from it; the peer's receiver prefix, prefix(dir_out), needed to form the reply's routing key; the fingerprint of the identity key the session used, needed for the request's th_0 (Section 8.3), which during an identity rotation (Section 23.4) may be the retiring key's; the close reason; and, for each kept identifier, the key

k_tomb = Expand(cs, label("tombstone"), 48)

where cs is the continuity secret of the generation the identifier belongs to, cs(g) or cs(g + 1), derived at close, before the secrets are erased with the rest. The tombstone is kept for tombstone_ttl (Section 16.1) and persisted in place of the continuity record, so that it survives a restart; it holds no session secret. A tombstone can answer a re-anchor request but cannot open one, cannot create a generation, and cannot impersonate the session's traffic. A CLOSE sent to a peer that is DORMANT is dropped unread (Section 16.7); the tombstone is what answers that peer's later re-anchor.

Tombstone behaviour. A CONTINUE or CONTINUE_0RTT request arriving on a tombstoned recovery identifier is answered, without being opened, by an AnchorResponse with form = CLOSED (Section 9.2.2), reason = CLOSED, and detail set to the close reason, sealed under

k_closed = Expand(k_tomb, label("seal closed") || th_3, 44)

which the peer derives from its cs(g) (cs(g + 1) and g + 1 throughout, on the identifier of an armed generation), and sent to the request's source address on resp_rid(g, dir_out, nonce) (Section 8.5), which the tombstone derives from k_tomb, the stored prefix and the request's cleartext nonce. The reply is under a hundred octets (56 in Appendix D.11) to a request of over a thousand, is bound to the request's transcript, and can be produced only by a holder of cs(g) or of the tombstone. The peer, on opening it, closes with the carried reason, erases its record, and reports Closed{reason} with the reason's class (Section 20.2). The form value tells the peer which key to open with; a live responder's RETRY and a tombstone's CLOSED are never confused and never cost a trial opening.

Receiver. After authentication, record the reason, report Closed{reason}, send nothing, and persist a tombstone of its own in place of the continuity record, as the sender does, before discarding the session state. The closer's tombstone answers the receiver's re-anchors; only the receiver's own closure state refuses the sealed records it issued for the session, which a former peer may keep together with the session's secret and present after sending CLOSE itself (Section 16.6.3).

20. Error Handling and Close Reasons

20.1. Principles

  • Before authentication, every error is a silent drop. PQST sends no unauthenticated error message of any kind: no version-negotiation message, no "unknown identifier", no rejection of a handshake. Each would be a reflection vector, a reset vector, or a fingerprint. The cost is that a requester learns of failure only by timeout, and Section 9.4 and Section 16.7 size the timeouts and fallbacks accordingly.

  • After authentication, an error is counted, ignored, or closes the session. Nothing in between: PQST has no error frame, no warning, no negotiation of a repair.

  • The network is never an error source. ICMP messages, including unreachable and packet-too-big, MUST NOT change path, session or MTU state; an implementation MAY let them accelerate a PROBE it would have sent anyway. Loss of a path is detected by probes (Section 15.6) and is not an error.

20.2. Close Reasons

A close reason is one octet, carried in CLOSE (Section 19.6) and in the detail of a CLOSED response (form 5) (Section 9.2.2). Reasons are grouped by class; the class is what an upper layer acts on.

  • 0x00. Reason: reserved; Meaning: never sent

  • 0x01. Reason: LOCAL_CLOSE; Class: policy; Meaning: the application closed the session; Defined in: 18.2 S26

  • 0x02. Reason: SUPERSEDED; Class: policy; Meaning: a newer session with the same peer was confirmed; Defined in: 9.6.1, 16.7

  • 0x03. Reason: SESSION_LIFETIME; Class: policy; Meaning: lineage_gen or attempt would exceed 0xFFFF; Defined in: 9.3.3, 12.2, 16.5

  • 0x04. Reason: DORMANCY_EXPIRED; Class: policy; Meaning: max_dormancy elapsed; Defined in: 16.7

  • 0x05. Reason: AUTHZ_EXPIRED; Class: policy; Meaning: a grant expired without renewal; Defined in: 17.3

  • 0x06. Reason: AUTHZ_REVOKED; Class: policy; Meaning: the grantor revoked; Defined in: 17.4

  • 0x10. Reason: PROTOCOL_ERROR; Class: protocol; Meaning: persistent violation after authentication; Defined in: 20.3

  • 0x20. Reason: REPROOF_FAILED; Class: compromise; Meaning: a required identity proof or certificate verification failed; Defined in: 16.3.3, 19.4.5

  • 0x21. Reason: COMPROMISE_SUSPECTED; Class: compromise; Meaning: reserved: no rule of this document raises it, since a receiver detects no nonce reuse (Section 12.5); an endpoint closing a session on a compromise it learned of by other means MAY use it; Defined in: 12.5

  • 0x80-0xBF. Reason: upper-layer reasons, assigned by registry (Section 25); Class: as registered

  • 0xC0-0xFF. Reason: private use; Class: private

Codes 0x01-0x0F are policy class, 0x10-0x1F protocol class, 0x20-0x2F compromise class; the remaining codes below 0x80 are reserved. There is no transport class of close, because no transport event closes a session (Section 3). Every close is reported as the security-class event Closed{reason}; AUTHZ_EXPIRED, AUTHZ_REVOKED, REPROOF_FAILED and COMPROMISE_SUSPECTED are additionally reported under their own names (Section 18.5).

A receiver treats an unknown code as PROTOCOL_ERROR class for the purpose of acting on it and preserves the code for logging.

20.3. Violations After Authentication

A packet that authenticates but violates a MUST of this specification (a malformed frame, frames that do not consume the payload, a control packet with an empty payload, a PROBE_ACK matching nothing, an OBJECT segment outside its total_len, an anchor request with impossible fields) is handled as the defining section says, in every case by dropping the offending part and counting the event; its replay commit stands (Section 11.4). A receiver MAY close the session with PROTOCOL_ERROR when such events exceed a policy threshold (RECOMMENDED: 10 in 60 seconds; violation_limit and violation_window in the reference, which closes on the tenth), because a peer that persistently violates the protocol is either broken or hostile and in neither case worth keeping.

An authenticated peer that abuses a budgeted mechanism, by re-anchoring, migrating or probing at a rate the local policy will not sustain, is rate-limited per session before it is closed; the budgets of Section 9.4, Section 15.4 and Section 19.2 are the first line, and PROTOCOL_ERROR the last.

20.4. Counters

Implementations SHOULD maintain, and SHOULD be able to expose, at least these counters, per endpoint and where meaningful per session: packets dropped by size, header, unknown routing key, pre-authentication filter, and failed AEAD; replay-window rejections, duplicates and packets below the window; frames unknown and malformed; unmatched probe acknowledgements; anchor requests dropped at each check of Section 9.3 by reason; RETRY responses sent by reason; objects discarded for version or size; paths validated, lost and rebound; closes by reason. They are the only trace an unauthenticated packet leaves in authoritative state, the bounded pre-authentication work of Section 11.7 being the other (Section 11.1) and the first instrument of the validation plan.

20.5. Logging

A close with COMPROMISE_SUSPECTED, where an endpoint uses it (Section 20.2), is logged at the highest severity available; REPROOF_FAILED and AUTHZ_REVOKED at high severity. Logs identify sessions by their session identifier (Section 8.6) and peers by fingerprint, never by identifier or address alone, and never include key material, sealed parts, or authz_hint. Section 24 states what logs may reveal and how long they should live.

21. Extensibility and Versioning

21.1. Versions

The version octet in every packet is 0x14 for this document. A receiver that does not implement the version of a packet drops it silently (Section 20.1); there is no version-negotiation message, because one would be an unauthenticated reflection and a fingerprint. An initiator configured for several versions sends its highest first and MAY retry a lower one after an attempt times out; the lowest version it will use is its policy, and that policy is the only protection against an attacker who drops higher-version requests. The version is in every transcript (Section 8.3), so an exchange that completes was not downgraded within itself.

A new version is a new value of the octet and a new document. Within a version, behaviour changes only through the mechanisms below. One of them adds a packet type: packet type 3 is reserved for a future extension, intended for a group data plane above the cohort layer (Section 26), and has no semantics in this document; the extension that defines it states its acceptance, authentication and capability rules, a receiver that does not implement it drops the type at the common header (Section 10.1.1; Section 11.1, step 2), and a packet of the type MUST NOT create or change any state this document defines unless it authenticates under keys the extension derives (I-1).

21.2. Suites

A suite is a fixed set of algorithms (Section 6.1). The suite in use is implied by the identity key the requester encapsulates to, selected among a responder's keys by rk_hint (Section 9.2.1), and is bound into every transcript. A deployment moves to a new suite by provisioning identity keys of the new type; endpoints that hold keys of both types can serve both during a transition. No suite negotiation exists and none is needed: agility is by key provisioning. Suite identifiers are registered (Section 25).

21.3. Capabilities

capabilities is a 16-bit field exchanged in the sealed parts of the FRESH exchange and fixed for the session. A bit set means the endpoint implements the feature as issuer or server; an endpoint consults the peer's bits before sending an optional object kind or relying on an optional behaviour. Unknown bits MUST be ignored.

Table 22
Bit Feature Section
0 reserved for a future group data-plane extension (Section 26); no semantics in this version, and not set 21.1
1 INNER_ADDR objects 19.4.4
2 sealed records: the endpoint issues RECORD objects and serves re-anchors from them 16.6.3
3-15 unassigned 25

Capabilities are not negotiated: each endpoint states what it does, and the peer behaves accordingly. A feature that needs agreement from both sides is on when both set its bit.

21.4. Extensions

The anchor exchange is extended by objects: an extension carries its data as an object in the objects of a sealed part (Section 9.2.1 and Section 19.4), under a kind registered for it, and is therefore in the transcript; a receiver ignores an object kind it does not implement (Section 21.5). The binding statement (Appendix A) has an ext field of ext_type(2) ext_len(2) ext_data(*) entries, bounded by the enclosing length; a receiver MUST ignore an extension type it does not implement and continue, and MUST NOT fail the verification for it. An extension MUST NOT change the behaviour of anything this document specifies for an endpoint that does not implement the extension. Extension types are registered (Section 25); the range 0xC000-0xFFFF is private use.

21.5. Codepoints

Frame types, object kinds, close reasons, stream identifiers, RETRY reasons, forms and message types each have a registry with a reserved range for upper layers and a private-use range (Section 25). Receivers skip unknown frame types, acknowledge and ignore unknown object kinds, treat unknown close reasons as protocol class, and discard data on unimplemented reserved stream identifiers, as the defining sections state; none of these is fatal. Reserved codepoints are never reused with another meaning within a version.

21.6. Principles

  • Everything that affects a sealing key is in that key's transcript before the key is derived; the lineage and the session root take the request's transcript, and the continuity secret the shared secrets alone (Section 8).

  • No negotiation exists in CORE, so no downgrade within an exchange exists; the only downgrade surface is the initiator's version floor, which is policy.

  • Unknown is ignorable at every level except the version octet and the reserved bits of the packet and block headers, which are the fingerprint-free, cost-free places to reject garbage; a reserved packet type is dropped there unless the receiver implements the extension that defines it.

  • CORE semantics are stable across extensions and capabilities; an endpoint that implements only CORE interoperates with every endpoint of the same version.

22. Security Invariants

An implementation MUST maintain every invariant below at all times. Each names the section that enforces it and the check in the validation harness that observes it; the harness checks are C1-C13 of the plan's simulator and the architectural invariants A1-A10, kept under their original numbers, and are the names under which the validation manifest of the implementation's repository (Section 27) lists them so that existing tests map onto this document; C7, written for early data, now covers every unauthenticated input, and C11's identifier rules are the derived-identifier rules of Section 15.1.

Three kinds of statement are made here and in Section 23, and each is validated in its own way.

A protocol safety invariant is a state the receiver never enters, whatever the input: I-1, I-3, I-5, I-6, I-12 and I-23 are of this kind, and the state machine, the simulator's monitors and the formal models check them.

A conditional cryptographic guarantee holds under named assumptions, which it states: I-8's single usable generation among endpoints that hold state, the ratchet's healing of a passive theft and the re-proof deadline against an active holder (Section 16.3.3) are of this kind, proved under their assumptions and tested against the adversary that breaks them when an assumption fails.

An operational property, such as the speed of recovery under a flood of handshakes (Section 23), is measured for an implementation and never promised by the packet format or the state rules. An invariant below is of the first kind unless it says otherwise; I-10 and I-19 state their allowances and their limits where they are not.

Table 23
# Invariant Enforced by Harness
I-1 Authentication-gated authoritative state. No unauthenticated datagram changes authoritative session state (the committed and armed generations, the committed receive epoch, the replay window, paths, routing identifiers, session allocation, grants, freshness marks); before the AEAD has succeeded the receiver does only the bounded work Section 9.4 and Section 11.7 name (reassembly within fixed limits, one cached next-epoch derivation that advances nothing), and a datagram that fails leaves no trace in authoritative state; the only transmissions an unauthenticated datagram may cause are the three of Section 11.7: a cached reply, a tombstone's CLOSED answer and, where served, a DISCOVER response 9.4, 11.3, 11.5, 11.7, 13.5, 14.2, 16.6.3, 19.6 C7, C12
I-2 Two-phase replay. WouldAccept is side-effect free; Check is reached only through a successful AEAD; phase one accepts everything phase two accepts 13.3-13.5 C2, A4
I-3 Nonce uniqueness. No (key, nonce) pair is used twice: (epoch_id, seq) never repeats per direction, allocation and epoch installation are linearizable, no epoch's sending state is resumed once discarded, by a restart or on entry to DORMANT 12.3, 12.6, 12.7, 16.3.2, 16.6.2 C1, A3
I-4 Epoch sovereignty. A receive epoch advances only on AEAD success under the next epoch's keys, never on header observation; per lineage and direction, the permitted set is exactly {r - 1 during overlap, r, r + 1}; a new lineage's first epoch is entered only by a commit 14.2, 14.4, 16.4 C3, C4
I-5 One attempt. At most one block-cipher operation and at most one AEAD operation per protected packet, exactly one of each for a packet that reaches the stage and never a retry under another key or epoch; at most one key derivation, once per epoch; no public key operation on an incomplete message; for a replayed or forged handshake, at most one decapsulation per identity key held, and the serve, once, of a request never confirmed that is replayed after its exchange expired (Section 9.3.5), and none for a retransmission the reply cache answers; the other public key costs of unauthenticated or replayed requests are those Section 11.6 bounds (DISCOVER, a stateless responder's serve) 9.3.2, 9.3.5, 9.7.1, 11.6, 16.6.3 receiver-surface tests
I-6 Ownership and lifecycle isolation. A change of path state does not, by itself, change the authenticated peer identity, commit a generation, change authorization or invalidate the session; the session's own transitions on prolonged loss of connectivity, RECOVERING and DORMANT, may discard live traffic keys, replay windows and identifiers as Section 12 and Section 16 require, and preserve the continuity and authorization state a permitted re-anchor needs, under the closure, expiry and supersession rules; no event at a shorter-lived level invalidates state at a longer-lived level 3.2, 3.4, 15.8, 16.7, 18.6 A1, C12; SC-10
I-7 Identity invariance. No network event changes the authenticated peer identity or the binding of any generation to it; supersession is a new session, never a changed one 3.2, 9.6, 16.7 A2, C9
I-8 No usable fork. At most one usable generation, one committed at either endpoint, exists for a given number among the endpoints that hold state (a generation abandoned with an endpoint's lost state, Section 16.6.3, is usable by no one); a generation committed by an endpoint that still holds state is never re-served; a recovery identifier is consumed by the commit of a generation a request on it created, and a prekey by the first request served under it or answered IDENTIFIER_COLLISION; under the storage model of Section 16.6.2 (record transitions atomic and serialized, a write of unknown outcome treated as failed) 9.3.3, 12.7, 16.3.2, 16.4, 16.5, 16.6.3 A5, C6
I-9 Write-ahead. No message is sent before the state it depends on is persisted: a CONTINUE request can be retransmitted byte-for-byte from the record, a response from the reply cache, and a FRESH request is sent only once its counter is persisted; a generation an endpoint serving from sealed records commits as requester is durable once the peer holds its record; a new record is persisted before the secrets it replaces are erased; a generation is committed only when its record is durable, and nothing is processed, sent or delivered under it before (Section 16.4) 9.3.1, 16.4, 16.6.2, 16.6.3 C6 with crash and record-write faults; GC-03, GC-04
I-10 Reflection bound. An endpoint never sends, toward any address it has not validated, more octets than it received from it beyond the probe floor of Section 15.4, apart from the anchor requests it initiates, which the schedules of Section 9.4 and Section 16.7 bound; and it never responds to anything that has not authenticated or completed, apart from the three answers of Section 11.7 9.4, 9.5, 9.7.1, 11.7, 15.4, 16.4, 16.7, 20.1 A6, C8, simulator monitor I-11
I-11 Validated paths only. Unlimited sending happens only on VALIDATED paths or to previously validated addresses within validated_ttl 15.3, 15.4 A6, simulator monitor I-11
I-12 Authority bounded. No application data is delivered after the issued grant's expiry plus delta or after revocation; no path event, dormancy or re-anchor extends a grant 17.3, 17.4, 17.5 A7, simulator monitor C13
I-13 Key separation. Every derived key is derived with its own label for one purpose, and every random key (the record key, local_secret; the companion's epoch key under its own rules) serves one purpose; identity keys are used only for encapsulation; no PQST secret leaves PQST in usable form except through the exporter, or sealed under the record key in a sealed record 8, 6.5, 16.3.2, 16.6.3 derivation review
I-14 Erasure. Each secret is erased when the protocol no longer needs it: ephemeral keys when their exchange ends, a prekey decapsulation key on its one use (a regenerated one at the rotation of local_secret), cs(g - 1) on commit, epoch secrets after overlap, everything on close except the tombstone keys, and the keys of Section 8.8's last sentence by their own rules 8.8, 14.5, 16.3.2, 16.4, 16.6.3, 19.6, 23.4 --
I-15 Unlinkability by header contents. No cleartext header field links the packets of a deliberate migration or re-anchor to the previous path; identifiers are PRF outputs; the epoch and sequence are masked; an identifier is sent to a second address only for a rebind the peer itself made, apart from the stated limits of Section 24.3 (an anchor exchange that spans a move, recovery attempts for one generation) 10.3, 15.1, 16.2, 16.7, 9.4, 24.3 A8, simulator monitor C11
I-16 Liveness. Once faults stop, a session reaches ESTABLISHED, DORMANT or CLOSED{reason}, or NONE for a session never established, within a bound determined by the policy parameters; no state is unbounded 15.6, 16.7, 18 A9, C10
I-17 Advance and paths interleave. Epoch advance, path operations and re-anchor interleave at every phase without split-brain, because each reads or changes the others' state only at the points Section 14.1, Section 15.1, Section 15.7 and Section 16.4 name: a generation's installation assigns path indices, a full identifier window calls for a re-anchor, a response validates the address its request went to, the first-epoch probe commits a generation 9.3.8, 9.3.9, 13.1, 14, 15, 16.4, 16.7 A10, C5
I-18 Deterministic encoding. One encoding per value; transcripts are over octets as transmitted 7 test vectors
I-19 Symmetric authentication before public key work. Every CONTINUE request is authenticated under the continuity secret before any decapsulation or encapsulation; a response is matched to an outstanding attempt by its per-attempt routing key before any decapsulation; a handshake flood cannot modify an established session or occupy the recovery pool, and its work is bounded by the admission controls of Section 9.4 (whether recovery proceeds at full speed under such a flood is a capacity property of an implementation, Section 23) 9.3.3, 9.3.8, 9.4 simulator monitor I-19
I-20 Record at rest. Recovering a continuity record requires the device's identity key or equivalent 16.6.2 storage-image fault
I-21 Claimed identity. Until a FRESH exchange is confirmed, the request changes no state keyed by the identity it claims other than its own half-open exchange: not the freshness mark, not another session, not an attempt of the responder's own 9.3.5, 9.3.9, 9.6.1, 16.7 I-21 monitor; TestForgedFreshCounter
I-22 Re-proof deadline. An exchange that did not prove the peer never moves the time of its last proof; once max_reproof_interval has passed since that time without a proof, nothing above the session is delivered or sent until one succeeds; a proof is sought a reanchor_interval before the deadline 16.3.3 PC-05, PC-06, PC-07, PC-10; Tamarin T2, the thief with proofs
I-23 Terminal closure. A closed session identifier is restored at neither endpoint, by CONTINUE, CONTINUE_0RTT or a sealed record; the tombstone, which retains the identifier, is durable before the first CLOSE leaves or closure is reported, at the sender and at the receiver of CLOSE alike; restoration from a record is verified against closure, lifetime, grant and identity authorization, and refused while closure state is incomplete 16.6.3, 17.4, 19.6 ST-01 to ST-04, ST-12, ST-13; TestClosedSessionRecordRefused

The six properties of Section 18.6 are the mechanically checkable form of I-1, I-6, I-7, I-14 and I-16 over the state table. An implementation that cannot demonstrate I-1, I-2 and I-3 by test is not conformant whatever its wire behaviour.

22.1. What Changes Each Part of a Session's State (Informative)

A session's state has several parts that move independently, and a packet can be authentic without being evidence for all of them. The table restates, from the sections named, what changes each part and what does not; nothing in it is new.

Table 24
Part Changed only by Not changed by
Committed generation a commit (Section 16.4): at the requester, its response opening (Section 9.3.8); at the responder, the first packet of any kind that authenticates under the armed generation, or a request on its recovery identifier that opens under its secret; under a generation a CONTINUE_0RTT request armed, only a PROBE_ACK to a probe sent under it, or such a request. It never goes back. a packet under an older generation; early data under a 0-RTT-armed generation (Section 16.4); a RETRY; a path event; anything that does not authenticate (I-1)
Armed generation installed when the response is sent, or at the requester when its request goes in CONTINUE_0RTT form (Section 16.3.2); leaves by its commit, by a commit of the same or a higher number, or when its lifetime elapses with its cached answer, anchor_timeout for CONTINUE and reply_cache_ttl for CONTINUE_0RTT, each renewed by a retransmission the reply cache answers, or anchor_timeout from a restart that restored it without an answer (Section 16.4 and Section 16.6.2) path events; entry to DORMANT, which keeps it (Section 16.7)
Path validation a matching PROBE_ACK for a PROBE sent toward the address, on whichever path it arrives; the address being in the previously validated set; at the requester, the address pair an anchor request was transmitted to, alone, when its response opens and commits (Section 18.3, P3) an authenticated packet or an anchor response's source address, which makes a candidate path or a rebind candidate (P1, P2); a commit alone
Primary path the sender's choice among validated paths (Section 15.7), preferring the one the peer sent from under the current generation when the primary has received nothing since it committed, checked both when the path validates and when the generation commits an address that has not validated, beyond the budget of Section 15.4
RECOVERING to ESTABLISHED an authenticated packet that creates a candidate path, or a commit, under a generation created in this process (Section 18.2, S14); the path must then validate or be lost (P3, P4) a packet under a generation re-created from the record (Section 12.7); a request alone
Evidence that the peer is alive (Section 16.7) a protected packet that authenticates, which the replay window admits once; a request that opens with an attempt above every one of the peer's seen before a replayed or stale request; a retransmission answered from the reply cache; an unauthenticated datagram
Recovery schedule the loss of the last path (S9), a restart (S28), a send while DORMANT or dormant_retry (S16), a send once per outage in recover_hold or a hint (S29); it ends with a commit, a FRESH that establishes a replacement, a path that returns within recover_hold and validates by a probe (S14), exhaustion followed by recover_hold and DORMANT (S15), or SUSPEND (S12) data or requests received
An issued object's delivery sent until an OBJECT_ACK at or above its version arrives, and sent again at once, its interval reset, when the session has a usable path after an outage or a generation commits (Section 19.3.3) an outage, which leaves it outstanding rather than dropped; a newer version, which supersedes it
Prekeys consumed by the first request accepted under one and erased in the write that serves it (Section 16.4); never derived again as a sending lineage after a restart (Section 12.7) a replayed request, answered from the reply cache or with PREKEY_UNAVAILABLE
Authorization the grantor's AUTHZ versions, their expiry and revocation (Section 17) a re-anchor, recovery, dormancy or a restart, after which the held grant is treated as expired until the peer's current version arrives (Section 17.5)
Identity proof an exchange that proves the peer (Section 16.3.3) a CONTINUE without proof; a CONTINUE_0RTT, which cannot prove the requester (Section 16.3.2)

23. Security Considerations

This section argues the properties the body claims, states their limits, and lists implementation risks. The threat model is Section 4; the invariants are Section 22.

Scope of guarantees. The guarantees are made under the adversary and cryptographic assumptions of Section 4, the storage and crash-consistency rules of Section 16 and the authorization rules of Section 17. The protocol's safety invariants concern authenticated state transitions and the confidentiality and integrity of protected traffic; they promise neither availability, nor instantaneous recovery, nor revocation at a disconnected peer, nor immunity to loss of the state the rules require to be kept. Where the protocol permits an exception for the sake of progress or continuity, the probe floor, the previously validated addresses, early data, retained records and supersession by FRESH among them, the exception is part of the security model and is stated with the guarantee it qualifies, below and in Section 22.

23.1. The Anchor Exchange

Authentication. In FRESH, the requester encapsulates to the responder's identity key and the responder to the requester's; both secrets enter cs(0). A response that opens proves the responder holds ss_peer, hence its identity key; the requester's first protected packet proves it holds ss_req, hence its identity key. Authentication rests on the IND-CCA2 security of ML-KEM-1024 and on key confirmation, not on signatures, which is the structure of the KEM instantiation of Noise IK [Noise] analysed for PQ-WireGuard [PQWireGuard]; PQST adds the transcript hash as info in every derivation and binds the intended peer identity, the version, the suite and any DISCOVER prefix into th_0. In the CONTINUE forms authentication is possession of cs(g - 1), which is the session, and identity proofs are added by flag.

Key-compromise impersonation. Compromise of the responder's identity key lets an attacker read the identities in captured requests and impersonate the responder to anyone, but not impersonate another requester to the responder, because that requires decapsulating ct_req with the requester's key; symmetrically for the requester's key. Each party's authentication of the other depends on a decapsulation only the other can perform.

Early data is not delivered exactly once. The consumed prekey and recovery identifier make zero-round-trip early data unreplayable toward a stateful receiver: an attacker cannot have the original packets accepted again under the receiver's state. They do not make its delivery exactly once across the outcomes of a recovery: in a gateway group one gateway may arm the generation and deliver the early data while another answers RETRY, and the requester, which then repeats the attempt as a CONTINUE, cannot know whether the data was delivered (Section 16.3.2). An application that sends an action as early data and repeats it after a RETRY must make the action idempotent or carry a transaction identifier; the transport reports the attempt's refusal and never reports the early data as undelivered.

Forward secrecy comes from ss_fresh: the ephemeral decapsulation key or the single-use prekey, erased after one use. Later compromise of both identity keys yields ss_peer and ss_req from captured traffic and nothing else; cs(g) is not recoverable. Within a lineage, the erasure of an epoch secret hides that epoch's traffic from an attacker who obtains only a later epoch secret, and not from one who obtains the retained lineage_secret; forward secrecy of a generation's traffic against compromise of the endpoint begins when the generation is retired and its cs and lineage_secret are gone (Section 14.3).

Post-compromise security comes from the ratchet: every re-anchor folds a fresh KEM secret into cs(g + 1) and erases cs(g). Against a passive adversary that learned cs(g) and takes no part in the next re-anchor the successor is secret, and the scheduled re-anchor makes that happen within reanchor_interval. An active adversary holding cs(g) can authenticate an ordinary CONTINUE without either identity key, and if its exchange commits first it holds the successor instead of the legitimate endpoint: ordinary continuity, recovery and generation advance are not fresh verification of identity. What bounds that adversary is the identity re-proof deadline of Section 16.3.3: an exchange that proves the peer encapsulates to its identity key, which the holder of the continuity secret cannot decapsulate; a proof is sought a reanchor_interval before the deadline, nothing above the session moves after it without a proof, and the session closes when the proving exchange fails. max_dormancy bounds dormancy, not an actively maintained session, and a grant's lifetime bounds authorization, not identity. The race is real and stated: a thief who re-anchors before the legitimate endpoint holds the session until the deadline and no longer.

Exporter compromise and recovery. A re-anchor changes the lineage-scoped exporter's root and nothing session-scoped: session_root is derived once and kept for the session's life (Section 8.6). An adversary that obtains session_root, or the generation-0 material it derives from, keeps deriving session-scoped exports after every later re-anchor; recovery of such material needs a new session, by FRESH, whose root is independent of the old. Lineage-scoped exports are healed by a re-anchor whose fresh input the adversary does not hold, as the continuity secret is. Applications put material meant to rotate with post-compromise recovery in lineage scope, and the session identifier and bindings meant to last in session scope, knowing what each survives.

Identity hiding holds against passive observers and against active attackers who do not hold the responder's identity key. It does not hold against a later compromise of that key for captured requests, and flight sizes reveal that an exchange occurred (Section 24).

Replay. A replayed FRESH request whose exchange was confirmed fails the freshness counter after one decapsulation and gets no reply; one replayed while its exchange is half-open is answered from the reply cache; one never confirmed and replayed after its exchange expired is served again and can never be confirmed, which costs the responder what a forged request costs and ends at the requester's next confirmed FRESH (Section 9.3.5); a replayed CONTINUE request gets at most the cached reply at the original address; a replayed CONTINUE_0RTT request at a stateful responder finds its prekey consumed; at a stateless responder serving from a record it yields an armed generation no one can use (Section 16.6.3).

Reflection. Section 9.5 and Section 15.4 together bound what an endpoint sends toward an address it has not validated to what it received from it, for authenticated and unauthenticated input alike, beyond two named allowances: the probe floor of k_probe probes of 56 octets per address and interval, kept across the budget table's forgetting so that churning the table yields no second floor, and the previously validated addresses, which send unbudgeted for validated_ttl toward an address the peer legitimately held, which is why that lifetime is minutes. The bound against third-party reflection therefore rests on path validation, on the expiry of previous validation and on the endpoint-wide budget, not on a ratio alone. An authenticated anchor response proves possession of the exchange's secrets, not control of the address it appears to come from, which an attacker that observes or relays an authentic response can set at will; a response therefore validates the address the request was sent to, never its own source, and an unknown source stays within the budget until a probe sent to it is answered (Section 9.3.8, Section 15.7). Without that rule one relayed response would lift the budget toward any address.

Denial of service. The unauthenticated path performs public key operations only on a complete FRESH request whose cleartext parses, and two attackers are to be told apart. One without a sealed part that opens, the blind forger and the stale replay, costs one decapsulation per identity key the responder holds before any other check that could reject the request, and, rejected, holds no half-open state (Section 9.3.2); at line rate on a 1 Gbps link that is about 40,000 decapsulations a second, roughly one core. One holding the responder's public key and the fingerprint of an identity the responder authorizes, which the responder's peers all hold, can make a request that opens with a fresh counter: it costs the responder that decapsulation, two encapsulations, the key schedule, a response of at most the request's size (Section 9.5), a half-open entry until anchor_timeout and the write-ahead of that entry (Section 16.4), and nothing keyed by the identity, whose counter mark does not move until confirmation (Section 9.3.5); the half-open bounds per source address and per claimed identity (Section 9.4) cap what one such attacker holds at once, and the work per request is the work of one establishment, which the responder was provisioned to do for that identity. The pre-authentication tag moves the rejection of strangers of both kinds before reassembly and before any public key operation. The figure is a benchmark for one implementation on one machine, not a property of the protocol. Established sessions cannot be modified by any handshake-path load, because recovery is located by identifier, authenticated with one AEAD under cs(g - 1) before any public key work, and reassembled in a pool the handshake path cannot occupy (Section 9.4); the work a flood can cause is bounded by the admission controls of Section 9.4 and the rate limits of Section 11.6. Whether recovery proceeds at full speed while the handshake path is saturated is a capacity property of an implementation, its workers, queues and buffers, which an implementation that claims it demonstrates by measurement: recovery latency and continuity under increasing rates of invalid FRESH requests, with the pre-authentication tag off and on. The protocol's property, worth stating to operators as such, is that an attack on new sessions cannot reach into the fleet's sessions; the implementation's property is how much of its capacity it keeps for them.

What an unconfirmed FRESH reveals. A request that opens with a fresh counter is answered; one naming an identity the responder does not authorize, or carrying a stale counter, is dropped in silence (Section 9.3.2). Whoever can make a request that opens therefore learns, from the presence of a response, whether the identity it named is authorized at this responder, and, by trying counters, where that identity's freshness mark stands, in at most 64 requests. Neither changes any state: the mark moves only on confirmation (Section 9.3.5, I-21), and the response seals its grant to the holder of the named identity's key (Section 9.3.9). What is disclosed is a membership and a counter, which a passive observer of the identity's own exchanges with this responder learns more slowly. A deployment for which that matters configures the fleet secret (Section 9.3.4): without psk no request passes the tag, so nothing is answered and nothing is learned; Section 24.4 states the privacy side.

Deniability. Nothing is signed online, so no party can produce a transferable proof that the other participated. This is a privacy property and an audit limitation; authorization references and upper-layer records are where accountability lives.

Downgrade and agility. One suite per identity key type, bound into every transcript; no negotiation; the version floor is the initiator's policy (Section 21).

23.2. The Data Plane

Nonce uniqueness is the single property whose failure is catastrophic with AES-GCM. It rests on the sender's rules of Section 12 and nothing else; the receiver's detection is defence in depth. The two rules implementers break are resuming an epoch after a restart and allocating a sequence number under one epoch's counter while encrypting under another's keys; Section 12.6 and Section 12.7 exist for them.

AES-GCM limits. 2^23 packets per key is the [RFC9001] figure for packets up to 2^11 octets; it is conservative for 1,200-octet packets and costs nothing because an epoch advance is free.

Header protection hides the epoch, sequence, stream, flags and padding length from observers but is not an integrity mechanism; integrity comes from the block being associated data. The mask key is per generation and direction, so its compromise reveals the metadata of one lineage and nothing else. The timing difference between a filter drop and an AEAD drop reveals only possession of the mask key. The filter's bound of about 2^-80 holds for a block an attacker had to guess. It does not hold for an active attacker who holds a legitimate packet whose sequence number the receiver has not yet accepted: keeping the routing key, the masked block and the first sixteen octets of ciphertext, which the mask is derived from, and altering the tag, the attacker makes variants that unmask to the same valid header, pass the filter and fail only at the AEAD, as many as it sends until it lets the original through. Nothing of the receiver's state moves, the one-AEAD-per-datagram invariant holds, and the integrity bound is counted (Section 12.4); what the attacker gains is one AEAD of the receiver's work per datagram it sends, the same as any forged datagram costs a protocol without a filter. An implementation that limits the rate of failed verifications it attempts per routing key does so far above any legitimate rate, since a limit that drops packets at an identifier drops the legitimate sender's too; the filter alone is not an argument that forgery attempts are negligible.

The one-AEAD rule and the two-phase check are where a privacy feature becomes a session-killing bug if implemented loosely: a receiver that retries under other keys, or advances a window before authentication, hands an off-path attacker a way to desynchronise or exhaust the session. Both are invariants with required tests (Section 22).

Derived identifiers are unpredictable to anyone without the lineage secret and need no signalling, so there is no identifier-allocation protocol to attack. Their one cost is the collision rule of Section 15.1, which fires with negligible probability without a prefix and rarely with one, and resolves by re-anchor.

Cross-path copies. An on-path attacker that copies a protected packet onto another path of the same session, or relabels it with another of the session's routing keys, which the associated data does not cover (Section 10.2.2), delivers at most what the original would have: the replay window is the session's, not the path's (Section 13), so whichever copy arrives first is accepted once and every other is a duplicate; the path the accepted copy arrives on gains the liveness evidence any authentic packet gives it and nothing more, sending toward an address still waiting on validation (Section 15.3); and a copy moved to a path of another session fails that session's AEAD.

23.3. Recovery, Records and Groups

The continuity record is the session; its protection at rest is the protection of every session the device holds. Section 16.6.2 requires that recovering it take the identity key, which makes a storage image useless when the key is in hardware. Hardware keystores that decapsulate ML-KEM-1024 are not yet universal; where the key is software on the same storage the rule still costs nothing and reproof_after_restart is available as policy. Records are erased on close, revocation, supersession and generation regression.

Prekeys give forward-secret zero-round-trip recovery; their decapsulation keys are the only long-lived private material besides the identity key, which is why a regenerating issuer MUST rotate and erase its local_secret at least every max_dormancy.

Recovery that supersedes. One case recovers by a new session instead of continuing the old one: a requester that commits on a response and is then cut off for the life of the responder's armed generation (Section 16.10). It is safe and live, and costs the session identifier; the layer above sees a supersession (Section 16.7). A second case has the same cost and the same safety: an outage that ends while both endpoints run their recovery schedules, when the initiator's FRESH completes before a CONTINUE does (Section 16.10).

Evidence that the peer is alive. An initiator that has heard from the peer within an interval makes a CONTINUE instead of its scheduled FRESH (Section 16.7), so what counts as hearing decides whether a peer that has lost its state can be recovered from. A protected packet counts because the replay window admits each one once; a request counts only if its attempt is above every one seen, because a recorded request replayed still opens under the session's secret, and an attacker able to send spoofed packets could otherwise hold back every FRESH with one old capture (Section 16.7). What remains needs an attacker on the path: packets of the peer's that it withheld and releases one per interval are new to the replay window and count. Such an attacker can as well drop everything, and so gains nothing it did not have; the session stays safe, and recovers once the attacker stops.

The record key protects the continuity secrets carried by every sealed record an observer captured; its compromise exposes the generations those records name, which is why Section 16.6.3 bounds its lifetime by rotation and erasure. It deserves the protection of the identity key.

Stateless service from sealed records holds the no-fork property in its usable form and degrades zero-round-trip data to one round trip, never to replayable data. A requester cannot tell, from a RETRY, whether another member of a gateway group delivered its early data (Section 16.3.2): zero-round-trip data is at most once per member state, and of unknown fate when refused.

Gateway groups. Session portability across gateways requires one replicated identity key, one sealing key and one prefix convention; compromise of one gateway is compromise of the group identity, and the group should treat its gateways as one trust boundary with the key in hardware at each. Single gateways are the degenerate case.

The malicious authenticated peer can do exactly what Section 4.4 says and no more. The design treats a valid identity as a reason to deliver its traffic, never as a reason to trust its claims about addresses, rates or other sessions.

23.4. Operational

  • PQST performs no congestion control; the traffic it carries brings its own, and [RFC8085] applies. PQST's own traffic is bounded: one probe per interval per path, one acknowledgement per object version, anchor messages at the retransmission schedule.

  • Any number of sessions in either role share one port; nothing in the protocol depends on port numbers.

  • No synchronised clock is needed by packet protection, replay prevention, the pairwise re-anchor or the session's timers, which run on monotonic local clocks; the absolute times are in optional certificate validity and in the sealed records of a gateway group, whose age check tolerates a skew of five minutes among the group's members (Section 16.6.3), the one place a deployment's clocks must agree.

  • ICMP is never a state input (Section 20.1).

  • Logs identify sessions and peers as Section 20.5 says and never contain key material.

  • Symbolic models of the three anchor forms (Tamarin; FRESH, CONTINUE, CONTINUE_0RTT, each one exchange) establish, under a Dolev-Yao adversary that may reveal long-term keys, ephemeral keys, continuity secrets and prekeys, the cryptographic properties of Section 9.8 for the modelled exchanges: secrecy and forward secrecy of cs(0) and of cs(g), injective agreement, resistance to key-compromise impersonation, the binding of a DISCOVER through prior, healing of a one-time leak against a passive adversary, the identity-proof requirement, agreement on generation and lineage, and the single use of prekeys and early data; a fourth model covers tombstones and sealed records. They show the limit of Section 16.10 as an attack: a holder of cs(g - 1) completes a CONTINUE without proofs in either role. They do not establish identity hiding, the reflection and cost bounds, deniability, the re-proof deadline of Section 16.3.3, which is a policy with its own tests, crash recovery or gateway-group behaviour; Section 27 states each model's scope, and the correspondence note beside the models maps their operations to the implementation.

Identity key rotation. A responder rotates its identity key by holding two keys for an overlap: the new one, which it gives to requesters from then on, and the retiring one, distinguished by rk_hint (Section 9.2.1; with an unspecified hint the responder tries both, never more than two). A FRESH request is served under whichever key it was encapsulated to, and a session remembers the key it was established under, which it needs for every later proof of the responder (prove_peer, Section 16.3.3) and keeps in its record (Section 16.6.2); records written before the rotation are read under the retiring key, and a sealed record names the key by its associated data (Section 16.6.3). Sessions need nothing else: a CONTINUE without prove_peer is authenticated by the session's own secret, whichever key began it. The retiring key is erased once no session established under it remains or max_dormancy has passed since the rotation. A proof of the responder demanded of a session after that fails, and the requester delivers nothing above the session from the first unsatisfied demand and closes it with REPROOF_FAILED at the deadline (Section 16.3.3), a compromise-class report for what was a planned rotation; a requester that has learned the new key avoids it by replacing each session established under the retiring key with a FRESH exchange to the new key that carries SUPERSEDE (Section 16.7), before the retiring key is erased. The new session carries the new fingerprint, and the layer above, which knows of the rotation from the same source as the new key, relates the two. Requesters learn the new key out of band, by DISCOVER (Section 9.7) or from a certificate (Section 9.7.3); the freshness counter is one counter across every responder (Section 9.3.5), so the rotation never makes a requester's FRESH look stale.

23.5. Implementation Pitfalls

At most one AEAD attempt per packet, exactly one for a packet that reaches the AEAD, with no retry under another key or epoch. A WouldAccept that is provably side-effect free. A sequence allocator that is linearizable with epoch installation and never persisted for resumption. Erasure of cs(g - 1) only after cs(g) is persisted. Reassembly state allocated only after the pre-authentication tag, where used, and never for an unknown recovery identifier without a verified record. Cached anchor responses sent to the original source, or elsewhere only within the budget of Section 15.4. Reply to a PROBE on the path it arrived on. Identifier installation only at lineage establishment. Constant-time filter comparisons. No response to anything unauthenticated beyond the three of Section 11.7.

24. Privacy Considerations

24.1. What a Passive Observer Sees

Per protected packet: the magic value, the version, the type octet, the eight-octet routing key, sixteen pseudorandom octets, the packet's length and its timing. Per anchor exchange: the same framing, the fragment headers, the sizes of the flights, and, in a FRESH request, rk_hint, whether a pre-authentication tag is present, and whether a prior is present; in a CONTINUE request, whether a sealed record is echoed. Everything else is encrypted or masked: the epoch, the sequence number, the stream identifier, whether a packet is control or data or dummy, the padding length, every field of every sealed part, every control frame and every object.

24.2. What the Observer Can Infer

  • That this is PQST, from the magic value, the version and the fixed framing, and from the sizes of anchor flights. PQST does not hide what it is; it hides what it carries and who is talking. Operators on hostile networks should expect classification and blocking of the protocol as such.

  • That an exchange occurred, from flight sizes: three maximum-size packets each way is a handshake, two is a re-anchor. The type octet is not hidden because hiding it would not hide the event.

  • Which receiver a packet is for, from the routing key's prefix where a deployment uses one: identifiers sharing a prefix reach the same gateway, an anonymity set of that gateway's sessions. A deployment that wants no such inference uses no prefix.

  • Volume and timing of a session on one path, which PQST does not disguise; padding (Section 10.2.2) and dummy packets on STREAM_DUMMY let a deployment blunt size and timing analysis at the cost it chooses, and nothing in the protocol depends on secrets in a way that padding decisions could leak.

24.3. Unlinkability

An observer who sees packets on two paths cannot link a deliberate migration or a re-anchor to the previous path by any header field: identifiers are pseudorandom-function outputs, the epoch and sequence are masked, and nothing on the new path repeats a value seen on the old one. Stated limits:

  • A NAT rebind keeps the identifier, because the endpoint does not know its address changed; it is linkable by an observer who sees both addresses. The pair of addresses so linked is exactly the pair the rebinding endpoint itself used: a receiver never sends an identifier toward an address on the strength of an inferred index (Section 15.1).

  • A requester that changes address during an anchor exchange retransmits its request byte-identical (Section 9.4), so the request's routing key reaches the responder from both addresses, and the cached reply it obtains at the new address carries the response key the original did: both addresses are linkable by an observer who sees both, exactly as under a rebind, and by nothing the responder adds. A requester that wants the two addresses unlinked abandons the attempt and starts a new one from the new address, at the cost of a fresh exchange; the rule only ensures that the one it keeps can complete. A CONTINUE_0RTT attempt that has been sent under cannot be abandoned (Section 16.3.2), so its requester has no such choice.

  • Recovery attempts for one generation all travel on the same recovery identifier, rec(g - 1, dir) (Section 16.2), and echo the same sealed record, if any: attempts that the recovery rotation (Section 16.7) sends to several addresses, or that a moving requester sends from several, are linkable to each other by an observer who sees them, though not to the paths the session used before.

  • A prefix links identifiers to a receiver, not to a session.

  • Timing correlation across paths is possible for an observer who sees both; a simultaneous observer can correlate the end of one path with the start of the next.

  • Epoch advance deliberately does not change the identifier, because changing it would reveal the advance.

  • Redundant transmission on several paths sends copies that differ only in their routing key; an observer who sees both paths can match them by their identical masked block and ciphertext.

24.4. Identities

The initiator's identity is sealed under a key only the holder of the responder's identity key can derive; passive observers and active attackers without that key learn nothing of it. The responder's identity is never transmitted except in the optional DISCOVER exchange, where it is sealed under the ephemeral secret and therefore visible only to the requester. A later compromise of the responder's identity key reveals the identities in captured FRESH requests; deployments for which that matters rotate responder keys and keep them in hardware. A responder answers a FRESH request that opens under its key with a fresh counter and drops one naming an identity it does not authorize, so that whoever holds the responder's public key and a fingerprint can learn whether that identity is authorized there and where its counter mark stands (Section 23); the fleet secret of Section 9.3.4 withholds the answer from anyone outside the fleet. Fingerprints appear in logs (Section 20.5) and in Established events; they are stable identifiers of devices and should be handled as such.

24.5. Signals to the Peer Only

A SUSPEND tells the peer, and only the peer, that an absence is planned. The authz_hint, capabilities, inner addresses and certificates travel sealed. preauth_len reveals to an observer that a deployment uses pre-authentication and nothing more.

24.6. Membership

Nothing in a session's wire data indicates whether its endpoints belong to a group above the session, which identifiers belong to which members, or whether a path traverses a forwarding member: sessions between members are indistinguishable from any other sessions, and a forwarder sees only routing keys. A forwarding member does see the volume and timing of what it forwards. This holds for the packets this document defines; a packet type an extension defines, such as the cohort layer's group packet, states its own linkage properties.

24.7. Logs and Records

Logs should live no longer than operations require and never contain key material, sealed parts or hints. Continuity records contain the peer's fingerprint and the session's addresses and are protected at rest as Section 16.6.2 requires; an endpoint that no longer holds a session MUST NOT hold its record. Tombstones hold no identity and expire with tombstone_ttl.

25. IANA Considerations

The assignments in this section are requested for the publication of this document as an RFC. At the Internet-Draft stage none has been allocated: an implementation that predates allocation uses the values here provisionally and follows the published values once they exist. This document establishes the registries below under a new "PQST Parameters" group. For each, the table gives the field, every range of its value space with the policy that governs it, in the terms of [RFC8126], and the initial contents.

For the policies: Standards Action for the two namespaces whose misuse would undermine the cryptography, wire versions and suites; IETF Review for the other core ranges, so that an IETF-stream document of any category can assign them; Specification Required for the ranges reserved to upper layers specified elsewhere, under the guidance to designated experts below; Private Use for the ranges so marked, which IANA does not register; and Reserved for values that are not available for assignment until a later document changes their designation. A value within a range and not listed is Unassigned under the range's policy.

Guidance to designated experts. For a Specification Required range the expert checks that the specification is public and stable enough to implement from, that it names the layer the value belongs to and the sessions or exchanges the value appears in, that the value's semantics alter no behaviour this document defines for the core ranges, and that the registration conflicts with no reserved value. The expert does not judge the merit of the layer.

Table 25
Registry Field Ranges and policies Initial contents
Wire Versions 1 octet 0x00 Reserved; 0x01-0xFF Standards Action 0x14 this document
Suites 2 octets 0x0000 Reserved; 0x0001-0x7FFF Standards Action; 0x8000-0xFFFF Private Use 0x0001 (Section 6.1)
Packet Types 2 bits 0-2 assigned by this document; 3 Reserved for a future extension defining a group data plane (Section 21.1), which assigns it 0 PROTECTED, 1 HANDSHAKE, 2 RECOVERY, 3 Reserved
Message Types 1 octet 0x00 Reserved; 0x01-0x3F IETF Review; 0x40-0x7F Reserved; 0x80-0xBF Specification Required; 0xC0-0xFF Private Use 0x01 AnchorRequest, 0x02 AnchorResponse
Anchor Forms 1 octet 0x00-0x3F IETF Review; 0x40-0xBF Reserved; 0xC0-0xFF Private Use 0 FRESH, 1 CONTINUE, 2 CONTINUE_0RTT, 3 DISCOVER, 4 RETRY, 5 CLOSED
RETRY Reasons 1 octet 0x00 Reserved; 0x01-0x3F IETF Review; 0x40-0x7F Reserved; 0x80-0xBF Specification Required; 0xC0-0xFF Private Use 1 PROOF_REQUIRED, 2 PREKEY_UNAVAILABLE, 3 FORM_NOT_PERMITTED, 4 CLOSED, 5 IDENTIFIER_COLLISION
Frame Types 1 octet 0x00 Reserved; 0x01-0x3F IETF Review; 0x40-0x7F Reserved for multipath extensions, IETF Review; 0x80-0xBF Specification Required; 0xC0-0xFF Private Use 0x01 PROBE, 0x02 PROBE_ACK, 0x03 OBJECT, 0x04 OBJECT_ACK, 0x05 SUSPEND, 0x06 CLOSE
Object Kinds 1 octet 0x00 Reserved; 0x01-0x3F IETF Review; 0x40-0x7F Reserved; 0x80-0xBF Specification Required; 0xC0-0xFF Private Use; kinds 0x10-0x1F and 0x80-0xFF are delivered to the layer above the session (Section 19.3.4) 0x01 NEXT_EK, 0x02 AUTHZ, 0x03 RECORD, 0x04 INNER_ADDR, 0x05 CERT, 0x06 SUPERSEDE; 0x10-0x1F Reserved for the cohort layer, which [PQST-COHORT] assigns
Capability Bits bit index, 16 bits 0 Reserved for a future group data-plane extension; 1-15 IETF Review 1 INNER_ADDR, 2 sealed records; 3-15 Unassigned
Close Reasons 1 octet 0x00 Reserved; 0x01-0x2F IETF Review, by class (Section 20.2); 0x30-0x7F Reserved; 0x80-0xBF Specification Required; 0xC0-0xFF Private Use Section 20.2
Stream Identifiers 1 octet 0x00-0xDF application-defined, not registered; 0xE0-0xFD Specification Required; 0xFE and 0xFF assigned by this document 0xE0 STREAM_COHORT, reserved for [PQST-COHORT]; 0xFE STREAM_CONTROL; 0xFF STREAM_DUMMY
Extension Types 2 octets 0x0000 Reserved; 0x0001-0x7FFF IETF Review; 0x8000-0xBFFF Specification Required; 0xC000-0xFFFF Private Use none
Certificate Types 1 octet 0x00 Reserved; 0x01-0x3F IETF Review; 0x40-0x7F Reserved; 0x80-0xBF Specification Required; 0xC0-0xFF Private Use 1 binding statement (Appendix A), 2 X.509

Exporter labels are not a registry: Section 8.6 reserves the labels beginning "PQST" for this document and the layers it specifies, and applications choose theirs freely among the rest.

No UDP port is requested: PQST runs on whatever port a deployment configures, and nothing in the protocol depends on the port. An ALPN identifier is not applicable, because PQST does not run over TLS. A service name and port may be requested by a later document if operational experience shows a default is needed.

26. The Cohort Layer (Informative)

PQST is designed to carry a group layer above its sessions: the cohort, which is to its members' sessions what a session is to its paths. The cohort layer is specified in a companion document [PQST-COHORT]. One sequencer, an identity that a gateway group may share (Section 16.9), commits membership, policy and a group epoch key, on security-class events only. Members receive them inside their pairwise sessions as protocol objects, keep them through partitions, and return after dormancy or a restart without re-admission. The companion's next version is intended to add a group data plane, which would give the members one secure session among themselves.

Nothing in this document depends on the cohort layer, and an endpoint that does not implement it interoperates with every endpoint of this version. This document reserves for it:

The pairwise properties the cohort layer relies on are part of this document:

27. Implementation Status

This section records the status of known implementations of the protocol defined by this specification at the time of posting of this Internet-Draft, and is based on a proposal described in [RFC7942]. It is to be removed before publication as an RFC. The evidence here is a snapshot of 2026-11-02. The reproduction data for every result, revisions, commands, seeds, configurations, model files and results, is a manifest in the implementation's repository (pqst/validation/EVIDENCE.md), and the formal models, their configurations and a note mapping their operations to the code are beside it (pqst/formal/). A traceability index beside the manifest (pqst/validation/TRACEABILITY.md), generated from the drafts, the conformance map, the tests' own citations, the census records and the models' table, and checked by the test suite, links each invariant of Section 22 and each property the external reviews named to its directed tests, its monitors, the last clean and the latest census, its model with the configurations' results, the interoperation steps that exercise it, and what nothing covers.

Reference implementation. A Go implementation of Sections 6 to 25 by the author: the endpoint state machine, from which the tables of Section 18 are rendered, the UDP driver and a file store for continuity records; the cohort layer of Section 26 is implemented over it and reported in [PQST-COHORT]. Maturity: a research prototype, run on one machine and in a network-namespace harness, not in production. Revision: the one this draft was built from, recorded in the manifest. The repository is available from the author on request until it is published; the test names in this section are the names of the checks the manifest and the traceability index list. Licensing Declaration to Be Provided Later. Coverage: its conformance map ties every section of Sections 8 to 20 and 26 that states a requirement to a test, with one exception, Section 11.8, the constant-time requirement, which is reviewed and not automatically verified: the tag comparison is the AEAD of the Go standard library, the replay bitmap and the filter comparisons were examined by reading for branches on secret material, and no timing measurement was made or is claimed. Erasure (I-14) is verified as a property of protocol state, that no secret is reachable from the state machine after the point the rule names; physical erasure from memory, from crash dumps and from storage is an implementation and platform property this evidence does not establish. Every value of Appendix D is generated by the reference, and the appendix is checked against the generator: the vectors establish wire compatibility with the reference, and the independent implementation's reproduction of them establishes that two readings of the text agree; neither establishes that a reading is right, which the negative cases of Appendix D.15 and the tests of lifecycle behaviour are for.

Independent implementation. A Python implementation written from this text alone, with ML-KEM-1024 written from [FIPS203], by an implementer who did not read the reference: an independent partial implementation, with verified agreement on the features enumerated here. It reproduces every test vector of Appendix D and implements Sections 6 to 19 and the recovery rules of this version. It does not serve sessions from sealed records or implement gateway groups (Section 16.6.3 and Section 16.9), addresses supplied to a recovering session (Section 15.3), or the probe wait of Section 16.7 that applies to them; it holds and echoes sealed records; of Section 17 it issues and holds grants but neither enforces their lifetimes nor revokes them. Its ML-KEM is not constant-time; its role is interoperation, not production. The places where the text was imprecise, 24 in the first pass, have been corrected in this version. Its extension to the whole protocol is planned after this revision.

Interoperation. The independent implementation and the reference interoperate over UDP: a FRESH exchange opened by either, CONTINUE re-anchors requested by either, data in both directions after each, both identity proofs, CLOSE in both directions, a tombstone's CLOSED answer, parity recovery, the reply cache, epoch advance, repeated scheduled re-anchors without loss, a freshness counter that a FRESH never confirmed does not advance (Section 9.3.5), and the recovery schedule of Section 16.7 with recover_hold and a zero-round-trip first attempt. The nine places where this exposed imprecision in the text, or a departure of the reference from it, are corrected in this version; the campaign also found one departure of each implementation, both corrected. The suite was last run on 2026-11-02 against the reference at the revision this draft was built from, with the same result at each earlier revision it was run against since 2026-10-29: 112 of 112 checks of its third phase and every check of the first two. Behaviours the independent implementation does not cover, service from sealed records, gateway groups, grant lifetimes and revocation, a required proof during recovery and persistence faults, are tested against the reference alone and are not reported here as interoperated.

Simulation. The reference is exercised by a discrete-event simulator that generates establishment, recovery, path changes, loss, duplication, reordering, replay, spoofed sources, address churn, NAT rebinding, multipath, process restarts with and without the record, and store faults, and checks after every step the monitors the manifest names: the nonce, replay and epoch checks, the no-fork check, identity continuity, the state-mutation, reflection, authentication-order and claimed-identity invariants, and an oracle of the state table of Section 18. On the code of this revision, the pairwise census of 10^6 generated scenarios, seeds 1 to 10^6 over three scenario families, run on the simulator's stub suite with every hundredth seed run on the real suite as well, 622,729,311 steps, observed no violation of the enabled monitors, the end-state checks among them; the manifest keeps the per-transition event counts of the run, among them 8,281 attempts abandoned at their life, 43,763 sealed records served and 138,086 failed persists. The cohort census of 10^5 scenarios is reported in [PQST-COHORT] with its figures. These results establish the absence of detected violations within the generated distributions on this revision; they do not establish that the invariants cannot be violated, and the distributions, the step bound and the topology, two endpoints, or N members and one model sequencer, bound what they say. The cohort simulation's sequencer is a model, one in-memory authority with the faults of Section 4 of [PQST-COHORT] and not a replicated consensus system, so its clean results are evidence for the single-authority state machine it models, not for a distributed deployment. The censuses of earlier revisions found defects in both layers; each was reduced to a directed test, the rule it forced is in the text, and every monitored failure in the project's history is kept as a regression scenario the test suite replays on both of the simulator's suites.

Fuzzing. Eleven coverage-guided targets of the Go toolchain's native fuzzer, each run for ten minutes at one worker with seeds from the test vectors and recorded datagrams, over the datagram receiver, the recovery first fragment, the anchor messages and their sealed parts, the wire packets, reassembly, the replay window, the record at rest, the sealed record, the cohort frames and the inner address, from 485,253 to 20,872,523 executions per target. They found four defects of the reference's encoders and parsers, none reachable from the network unauthenticated, and one of the text: nothing bounded the lengths of a message's fragments independently of their arrival order, so two forged datagrams, before any authentication, could crash a receiver. Section 11.5 now states the bound, both implementations follow it, and the input is kept as a regression test with the targets' corpora. Fuzzing of protocol-event sequences, establishment, validation, rotation, close and a later record, is planned beside the parser fuzzing.

Formal models. A TLA+ model of the commit protocol of Section 16.4, over a network that loses, duplicates, delays and reorders, with restarts, was checked with TLC on bounded configurations: one or two generations, two attempts, up to eight identifiers and up to two crashes, from 138,812 to 42,689,760 distinct states exhaustively, and 213,739,623 distinct states of the largest configuration without exhausting it. Within those bounds it found no violation of the no-fork invariant (I-8) after the generation-reservation rule of Section 16.4, which it had found missing: a held answer to a CONTINUE_0RTT request completing the requester's kept attempt after the responder's generation had expired. A second form of the model, asked for by the external review, keeps the continuity record as its own variable and gives every write one of three outcomes, held and acknowledged, failed, or held but reported failed, with restarts rebuilding memory from the record; it checks the no-fork invariant, the durable-commit barrier of Section 16.4, the write-ahead rule in the form the record keeps and the record's ability to re-create an own armed generation. Checked exhaustively without a restart and with one faulty write (1,544,656 distinct states) with one restart and one faulty write (9,775,080 distinct states) with one restart and two faulty writes (29,535,536 distinct states) and with two restarts and one faulty write (30,918,204 distinct states), it found no violation after one correction it forced: with one restart alone it reached a fork in eight steps, a restored CONTINUE attempt living on past the generation it had created at the peer, which the rule of Section 16.7 that an attempt lives anchor_timeout from its first transmission, across restarts, now prevents. At two generations, with one restart and one faulty write, the configuration with six identifiers was checked exhaustively (75,198,264 distinct states, the longest behaviour 31 steps), and the configuration with eight identifiers to a bound: every behaviour of up to 23 steps, 4,423,356,166 distinct states, no violation, stopped at a checkpoint and not exhaustive. The variant in which the requester commits before its write holds breaks the barrier in four steps. Both models omit timing, tombstones, sealed records and gateway groups; their results say nothing of those. A second TLA+ model, of the cohort's authority and the gateways' commit path, checked with two and three gateways and up to five revisions, found no violation of its five invariants and shows, in a variant without resolution by reading, two keys for one epoch in five steps; [PQST-COHORT] reports it. Tamarin models of the three anchor forms, one exchange each, under a Dolev-Yao adversary that may reveal long-term keys, ephemeral keys, continuity secrets and prekeys, establish for the modelled exchanges secrecy and forward secrecy of cs(0) and of cs(g), injective agreement, resistance to key-compromise impersonation, the binding of a DISCOVER through prior, healing of a one-time leak against a passive adversary, the cryptographic identity-proof requirement, agreement on generation and lineage, and the single use of prekeys and early data; a fourth model covers tombstones and sealed records. They show the limit of Section 16.10 as an attack trace: a holder of cs(g - 1) completes a CONTINUE without proofs in either role. They do not establish identity hiding, the reflection and cost bounds, deniability, the re-proof deadline of Section 16.3.3, which is a policy with its own tests, crash recovery or gateway-group behaviour; what covers each of those, or that it is open, Section 23 says. A correspondence note maps each model operation to the reference's function and persistence step, so that the models' claims can be read against the code.

Comparative measurements. Twelve recovery scenarios on PQST, WireGuard, Rosenpass over WireGuard, IKEv2 with MOBIKE and MASQUE CONNECT-IP, on one commit and one machine, at four link speeds with loss, measure the resume delay after outages of one second to ten minutes and after address changes. In the classes the external review of 2026-10-30 proposed, A is path migration without a new identity proof, B fresh key material under established authentication, C a fresh proof of identity, D establishment from nothing and E the restoration of identity and authorization after a process restart; the measured PQST operation is of class B, a CONTINUE re-anchor, with class C where policy required a proof, against each alternative's own class-B mechanism, and the measured bytes include fragmentation, retransmission, confirmation and path validation. Classes D and E, and recovery under a flood of handshakes, are not yet measured comparatively. The figures are in the manifest's results and not in this document, since they are one implementation's on one machine.

Verification by mechanism.

Known limitations. The stated limits of Section 16.10 and Section 23; the replicated authority and the gateway group exist as models, not as a consensus system; the independent implementation's exclusions above; the comparative figures being one implementation's on one machine; two rules of this revision the reference does not yet implement: the RECORD re-issued after a proving CONTINUE commits (Section 16.6.3) and the refusal of every packet under receive keys that have reached the integrity count (Section 12.4); the constant-time and erasure properties reviewed, not measured.

Licensing and contact. Licensing Declaration to Be Provided Later. Contact the author, Clayton Henry, at clay@viaforge.ai.

28. References

28.1. Normative References

[FIPS180]
National Institute of Standards and Technology, "Secure Hash Standard (SHS)", FIPS 180-4, .
[FIPS197]
National Institute of Standards and Technology, "Advanced Encryption Standard (AES)", FIPS 197, .
[FIPS198]
National Institute of Standards and Technology, "The Keyed-Hash Message Authentication Code (HMAC)", FIPS 198-1, .
[FIPS203]
National Institute of Standards and Technology, "Module-Lattice-Based Key-Encapsulation Mechanism Standard", FIPS 203, .
[FIPS204]
National Institute of Standards and Technology, "Module-Lattice-Based Digital Signature Standard", FIPS 204, .
[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", RFC 2119, BCP 14, , <https://www.rfc-editor.org/rfc/rfc2119>.
[RFC5869]
Krawczyk, H. and P. Eronen, "HMAC-based Extract-and-Expand Key Derivation Function (HKDF)", RFC 5869, , <https://www.rfc-editor.org/rfc/rfc5869>.
[RFC8126]
Cotton, M., Leiba, B., and T. Narten, "Guidelines for Writing an IANA Considerations Section in RFCs", RFC 8126, BCP 26, , <https://www.rfc-editor.org/rfc/rfc8126>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", RFC 8174, BCP 14, , <https://www.rfc-editor.org/rfc/rfc8174>.
[RFC9881]
Massimo, J., Kampanakis, P., Turner, S., and B. E. Westerbaan, "Internet X.509 Public Key Infrastructure: Algorithm Identifiers for the Module-Lattice-Based Digital Signature Algorithm (ML-DSA)", RFC 9881, , <https://www.rfc-editor.org/rfc/rfc9881>.
[RFC9935]
Turner, S., Kampanakis, P., Massimo, J., and B. E. Westerbaan, "Internet X.509 Public Key Infrastructure: Algorithm Identifiers for the Module-Lattice-Based Key-Encapsulation Mechanism (ML-KEM)", RFC 9935, , <https://www.rfc-editor.org/rfc/rfc9935>.
[SP800-38D]
Dworkin, M., "Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC", NIST Special Publication 800-38D, .

28.2. Informative References

[AuthKEM]
Wiggers, T., Celi, S., Schwabe, P., Stebila, D., and N. Sullivan, "KEM-based Authentication for TLS 1.3", Work in Progress, Internet-Draft, draft-celi-wiggers-tls-authkem-08, , <https://datatracker.ietf.org/doc/draft-celi-wiggers-tls-authkem/>.
[KEMTLS]
Schwabe, P., Stebila, D., and T. Wiggers, "Post-quantum TLS without handshake signatures", ACM CCS 2020, , <https://eprint.iacr.org/2020/534>.
[Noise]
Perrin, T., "The Noise Protocol Framework", , <https://noiseprotocol.org/noise.html>.
[PQST-COHORT]
Henry, C., "The Cohort Layer of Post-Quantum Secure Transport (PQST)", Work in Progress, Internet-Draft, draft-henry-pqst-cohort-00, , <https://datatracker.ietf.org/doc/html/draft-henry-pqst-cohort-00>.
[PQWireGuard]
Huelsing, A., Ning, K., Schwabe, P., Weber, F. J., and P. R. Zimmermann, "Post-quantum WireGuard", IEEE Symposium on Security and Privacy 2021, , <https://eprint.iacr.org/2020/379>.
[PQXDH]
Kret, E. and R. Schmidt, "The PQXDH Key Agreement Protocol", , <https://signal.org/docs/specifications/pqxdh/>.
[RFC4555]
Eronen, P., "IKEv2 Mobility and Multihoming Protocol (MOBIKE)", RFC 4555, , <https://www.rfc-editor.org/rfc/rfc4555>.
[RFC5723]
Sheffer, Y. and H. Tschofenig, "Internet Key Exchange Protocol Version 2 (IKEv2) Session Resumption", RFC 5723, , <https://www.rfc-editor.org/rfc/rfc5723>.
[RFC7296]
Kaufman, C., Hoffman, P., Nir, Y., Eronen, P., and T. Kivinen, "Internet Key Exchange Protocol Version 2 (IKEv2)", RFC 7296, STD 79, , <https://www.rfc-editor.org/rfc/rfc7296>.
[RFC7401]
Moskowitz, R., Heer, T., Jokela, P., and T. Henderson, "Host Identity Protocol Version 2 (HIPv2)", RFC 7401, , <https://www.rfc-editor.org/rfc/rfc7401>.
[RFC7942]
Sheffer, Y. and A. Farrel, "Improving Awareness of Running Code: The Implementation Status Section", RFC 7942, BCP 205, , <https://www.rfc-editor.org/rfc/rfc7942>.
[RFC8085]
Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage Guidelines", RFC 8085, BCP 145, , <https://www.rfc-editor.org/rfc/rfc8085>.
[RFC8899]
Fairhurst, G., Jones, T., Tuexen, M., Ruengeler, I., and T. Voelker, "Packetization Layer Path MTU Discovery for Datagram Transports", RFC 8899, , <https://www.rfc-editor.org/rfc/rfc8899>.
[RFC9000]
Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed and Secure Transport", RFC 9000, , <https://www.rfc-editor.org/rfc/rfc9000>.
[RFC9001]
Thomson, M. and S. Turner, "Using TLS to Secure QUIC", RFC 9001, , <https://www.rfc-editor.org/rfc/rfc9001>.
[RFC9298]
Schinazi, D., "Proxying UDP in HTTP", RFC 9298, , <https://www.rfc-editor.org/rfc/rfc9298>.
[RFC9370]
Tjhai, C., Tomlinson, M., Bartlett, G., Fluhrer, S., Geest, D. V., Garcia-Morchon, O., and V. Smyslov, "Multiple Key Exchanges in the Internet Key Exchange Protocol Version 2 (IKEv2)", RFC 9370, , <https://www.rfc-editor.org/rfc/rfc9370>.
[RFC9420]
Barnes, R., Beurdouche, B., Robert, R., Millican, J., Omara, E., and K. Cohn-Gordon, "The Messaging Layer Security (MLS) Protocol", RFC 9420, , <https://www.rfc-editor.org/rfc/rfc9420>.
[RFC9484]
Pauly, T., Schinazi, D., Chernyakhovsky, A., Kuehlewind, M., and M. Westerlund, "Proxying IP in HTTP", RFC 9484, , <https://www.rfc-editor.org/rfc/rfc9484>.
[RFC9846]
Rescorla, E., "The Transport Layer Security (TLS) Protocol Version 1.3", RFC 9846, , <https://www.rfc-editor.org/rfc/rfc9846>.
[RFC10024]
Kwiatkowski, K., Kampanakis, P., Westerbaan, B. E., and D. Stebila, "Post-Quantum Traditional (PQ/T) Hybrid Key Agreement Mechanisms for TLS 1.3", RFC 10024, , <https://www.rfc-editor.org/rfc/rfc10024>.
[Rosenpass]
The Rosenpass project, "Rosenpass: Post-Quantum Secure VPN", , <https://rosenpass.eu/>.
[WireGuard]
Donenfeld, J., "WireGuard: Next Generation Kernel Network Tunnel", NDSS 2017, .
[X3DH]
Marlinspike, M. and T. Perrin, "The X3DH Key Agreement Protocol", , <https://signal.org/docs/specifications/x3dh/>.

Appendix A. Identity Binding Statement

This appendix defines the binding statement named in Section 6.6: an offline certification of an ML-KEM-1024 identity key by an ML-DSA-87 signer. It is one of the two certificate types a CERT object may carry (Section 19.4.5) and may also be delivered at provisioning. It is deliberately minimal: one key, one subject, one issuer, one validity interval, one signature. A deployment that needs chains, policies or name constraints uses X.509 instead.

A.1. Format

BindingStatement = version kem_pk subject_len subject issuer_id
                   not_before not_after ext_len ext signature

version     = OCTET       ; 0x01
kem_pk      = L_ek octets ; the encapsulation key being certified
                          ; (Section 6.1; 1568 in suite 0x0001)
subject_len = OCTET
subject     = *OCTET      ; opaque to PQST: a device name, a serial
                          ; number, a role; at most 255 octets
issuer_id   = 48OCTET     ; SHA-384 of the issuer's ML-DSA-87 public
                          ; key
not_before  = 8OCTET      ; seconds since 1970-01-01T00:00:00Z
not_after   = 8OCTET      ; seconds since 1970-01-01T00:00:00Z;
                          ; 0xFFFFFFFFFFFFFFFF = no expiry
ext_len     = 2OCTET
ext         = *OCTET      ; extension entries as Section 21.4, for
                          ; the issuer's own use
signature   = 4627OCTET   ; ML-DSA-87 signature

The signature is ML-DSA.Sign(issuer_sk, M, ctx) of [FIPS204] with M the octets of the statement from version through ext, and the context string ctx = "PQST binding v1". The statement is 6,263 octets plus subject and extensions.

A.2. Verification

A relying endpoint accepts a statement for an identity if and only if: version is 0x01; issuer_id names an ML-DSA-87 public key in its trust anchors; ML-DSA.Verify succeeds with the same ctx; the current time, if the endpoint has one, lies within [not_before, not_after]; and the fingerprint H(kem_pk) is the identity being verified. An endpoint without a trustworthy clock may skip the validity check and rely on its trust anchors' revocation information, which is outside this document, or on pinning after the first verification.

A.3. Uses

A device's existing ML-DSA-87 key can issue a statement for its own new ML-KEM-1024 identity once, which lets a fleet that already holds ML-DSA-87 identities adopt PQST without a new authority. An operator's authority can issue statements for every device. A group authority can issue statements that a member presents to peers it meets for the first time. In every case the statement is verified offline or after establishment; it never appears in an anchor message.

Appendix B. Replay Window Pseudocode

This appendix gives a reference form of the replay window of Section 13, one per (direction, epoch). It is written for clarity, not speed; a bitmap in machine words with the same semantics is the usual implementation.

<CODE BEGINS>
constant W            # window size, 64 <= W <= 65536, default 4096
constant F            # forward bound, default 2^20
constant SEQ_LIMIT    # 2^23

structure Window:
    last_seq : integer, initially 0
    bits     : array of W booleans, initially all false
    # bits[s mod W] is the bit for sequence number s,
    # valid for last_seq - W < s <= last_seq

# no assignment to w anywhere in this function
function WouldAccept(w : Window, seq) -> boolean:
    if seq >= SEQ_LIMIT:          return false
    # too old; written to avoid underflow
    if seq + W <= w.last_seq:     return false
    if seq > w.last_seq + F:      return false   # too far ahead
    if seq <= w.last_seq:
        return not w.bits[seq mod W]             # not yet accepted
    return true

# called only after AEAD success
function Check(w : Window, seq) -> boolean:
    # the identical decision, on the same state
    if not WouldAccept(w, seq):   return false
    if seq > w.last_seq:
        distance = seq - w.last_seq
        if distance >= W:
            set all of w.bits to false
        else:
            # clear the bits that now fall inside the window
            for s from w.last_seq + 1 to seq:
                w.bits[s mod W] = false
        w.last_seq = seq
    w.bits[seq mod W] = true
    return true

<CODE ENDS>

Notes.

Appendix C. Signature-Based Authentication Profile (Informative)

CORE authenticates by decapsulation and computes no signature online (Section 9). Some evaluation regimes require online signatures with a certificate presented in the handshake. This appendix sketches, without normative force and without security analysis, how such a profile would be shaped, so that an evaluator can see that it is a profile of the same transport rather than a different protocol.

I -> R   ek_I, nonce_I          ; as DISCOVER, without pad
R -> I   ct_e, nonce_R          ; R encapsulates to ek_I
I -> R   sealed under ss_e: credential_I, Sig_I(transcript)
R -> I   sealed under ss_e: credential_R, Sig_R(transcript)
         ; then data both ways

It is not part of this document because CORE's decapsulation-based authentication is lighter by one round trip, two signatures and two certificates, has key-compromise impersonation resistance in both directions, and leaves no transferable proof of participation. A deployment that needs the signature profile should expect it to be a separate document with its own analysis.

Appendix D. Test Vectors

The vectors below were generated by the reference implementation with the real suite of Section 6.1 (ML-KEM-1024, AES-256-GCM, HKDF with HMAC-SHA-384) from fixed inputs, for wire version 0x14. The wire format is identified by the version octet, and a change to it takes a new one (Section 21): a vector of this version changes only for a defect that would otherwise break interoperability or security, and any such change is recorded in the change log. Implementations of this version should not expect to interoperate with a later version, which its version octet signals.

Octet strings are in hexadecimal. Where an exchange draws randomness, the vector gives what is needed to check every value without reproducing the draws: the identity key seeds ([FIPS203] seeded key generation), and the requester's ephemeral decapsulation key and ss_peer, from which every shared secret is recovered. Field names are those of the reference's vector files.

Table 26
Vector Inputs fixed Outputs checked
D.1 key schedule ss_fresh, ss_peer, ss_req, th_1, th_2, th_3, a prefix cs(0), k_req, k_resp, lineage_secret(0), session_root, header-protection keys, epoch_secret(0, 0) and (0, 1), traffic keys and IVs, routing and recovery identifiers, the session identifier
D.2 header protection a key and a sample the mask
D.3 protected packet the D.1 lineage, epoch, sequence, stream, padding, payload, prefix the routing key, block, AAD, nonce, ciphertext, mask and datagram; negative variants
D.4 FRESH exchange identity key seeds, counter, capabilities, prefixes both messages, the transcript hashes, cs(0), lineage_secret(0), session_root, the session identifier
D.5 CONTINUE exchange cs(0), target_gen = 1, both proofs both messages, cs(1), lineage_secret(1), the request's and the response's routing keys
D.6 CONTINUE_0RTT exchange cs(0), a prekey seed and version the prekey, both messages, cs(1), the first data packet's routing key, both routing keys
D.7 fragmentation and parity the D.4 request, frag_size 1,183 and 512 every fragment, parity included
D.8 replay window trace W, F and a sequence of (seq, AEAD result) events both decisions and the window state after each
D.9 epoch advance trace packets naming epochs 0, 1 and 2, and the end of an overlap the permitted set's decision, the receive epoch and the overlap after each
D.10 record wrapping a record and the D.4 responder's key the record's encoding and its wrapped form
D.11 tombstone reply k_tomb(0), a CONTINUE request, close reason AUTHZ_EXPIRED the CLOSED response and its routing key
D.12 DISCOVER exchange the D.4 responder's key both messages, the key delivered and th_4
D.13 CONTINUE offering proof cs(0), offer_proof both messages, cs(1)
D.14 negative messages requests, a response and a message packet derived from D.4 to D.7 the stage at which each is dropped
D.15 RETRY a CONTINUE_0RTT from cs(0) the RETRY PROOF_REQUIRED answer
D.16 FRESH with every option identity key sent, rk_hint, fleet secret, authz_hint, objects, prior both messages, cs(0)
D.17 CONTINUE_0RTT with a proof, a record and objects cs(0), the D.6 prekey both messages, cs(1)
D.18 exporter a label and a context both scopes' outputs
D.19 prekey regeneration local_secret, a session identifier, a version nek_seed and the prekey
D.20 implicit rejection a changed ct_peer the shared secret [FIPS203] returns
D.21 protected packet of a later lineage lineage 1 of D.5 the datagram

No vector is given for the binding statement of Appendix A, which is optional and which the reference does not implement; an implementation of it checks it against the test vectors of ML-DSA-87 ([FIPS204]).

D.1. Key Schedule

Fixed shared secrets and transcript hashes; every derived secret, key and identifier of generation 0.

Inputs.SSFresh (32 octets):

1111111111111111111111111111111111111111111111111111111111111111

Inputs.SSPeer (32 octets):

2222222222222222222222222222222222222222222222222222222222222222

Inputs.SSReq (32 octets):

3333333333333333333333333333333333333333333333333333333333333333

Inputs.TH1 (48 octets):

a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1
a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1

Inputs.TH2 (48 octets):

a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2
a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2

Inputs.TH3 (48 octets):

a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3
a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3

Inputs.Prefix (2 octets):

abcd

Outputs.CS0 (48 octets):

0821c8acd6e3714b3bea0abb6b879323796d573e4d84a8da0603c761c9e643ea
fe9602477eaf461d71d37913bea0e735

Outputs.KReqFresh (44 octets):

f64598d66273c1790988b750612c3ceec7713605e0fd8648e8d6cd00ad89d96a
3b6f1348cf915050c420aa43

Outputs.KResp (44 octets):

f57fc33a4ce6d0636a2818d94ad354634ea84638effbccb6d63ee66b051aa927
7d9c7214cfc2b15b8812a3f7

Outputs.Lineage0 (48 octets):

5dde1d98a0420b0a69efe62c14826edb99e4ce80de58485700426bf329e92c27
5c2fe293e398746c0340ca44cd8c8e31

Outputs.SessionRoot (48 octets):

2792c026862095b6b08ba219f729d5be87d8b1eec388170afa88be14f09f6467
db575ad37803167262c648aaab504d9d

Outputs.HPI2R (32 octets):

72a0ece94149e55b0f63b35174324398aa0f4570d533cf9cf0f2680494e5560d

Outputs.HPR2I (32 octets):

2def9c1efb9ed77576994082ddafb0dbc9c113e73540afde994d31748d7f0d27

Outputs.Epoch0 (48 octets):

190751c65adc76251a6f1664cbb634b9afc5eb9990d074f9283674841c8c79a1
7e23d68f8ee75518f8cc436a6d326eb9

Outputs.Epoch1 (48 octets):

f93a7860204488f5b8501af99908a4286348b79425a0d851c081cd97d8b88b34
c15a47f83e16916a2493132d34df9b07

Outputs.KeyI2R (32 octets):

996311b3b320bbf270593ba4a66616e423a309dac32ebf0df5dab6cac6efa567

Outputs.IVI2R (12 octets):

739cee5694ba9b6cd85c5c7c

Outputs.KeyR2I (32 octets):

b90df1388b87200213036ec5bea59d6527f24782d761fa9fc54b3922e81eb658

Outputs.IVR2I (12 octets):

8e793fcf3baa60c1f5b02caf

Outputs.RIDI2R0 (8 octets):

08798518f46cacd7

Outputs.RIDI2R1 (8 octets):

73927601529f70c0

Outputs.RIDI2R2 (8 octets):

cacbacfd12b61880

Outputs.RIDI2R0Prefixed (8 octets):

abcd08798518f46c

Outputs.RecI2R (8 octets):

8da46042ca944ef6

Outputs.RecR2I (8 octets):

e265ff18f5de9e30

Outputs.RecI2RPrefixed (8 octets):

abcd8da46042ca94

Outputs.SessionID (16 octets):

e4f3e863bf8ba2fec51d78400d16f495

D.2. Header Protection

The mask of Section 10.3 for a fixed key and sample.

HPKey (32 octets):

4242424242424242424242424242424242424242424242424242424242424242

Sample (16 octets):

17171717171717171717171717171717

Mask (16 octets):

b1ba7ea15efdb1e8d2194283b2199b66

D.3. Protected Packet

A packet of the initiator in epoch 0.3 under the D.1 lineage, on the identifier of index 0, its padding octets zero, with its negative variants and the stage that drops each; the receiver's receive epoch is 0.3.

Inputs.Lineage0 (48 octets):

5dde1d98a0420b0a69efe62c14826edb99e4ce80de58485700426bf329e92c27
5c2fe293e398746c0340ca44cd8c8e31

Inputs.Role: initiator

Inputs.EpochID: 3

Inputs.Seq: 1000

Inputs.StreamID: 7

Inputs.PaddingLen: 10

Inputs.Payload (17 octets):

505153542074657374207061796c6f6164

Inputs.PeerPrefix (1 octets):

01

Outputs.RoutingKey (8 octets):

0108798518f46cac

Outputs.Block (16 octets):

0000000300000000000003e80700000a

Outputs.AAD (20 octets):

515014000000000300000000000003e80700000a

Outputs.Nonce (12 octets):

7e490e1c736e48ba2e9cec40

Outputs.Ciphertext (43 octets):

6704af68b8417322d082f4fc9d64b07dedbdb72303b4d2c4d2087ffb86fbf5bc
012bc3d67355d6542e749c

Outputs.Mask (16 octets):

2a538ef2275efe4a2900e3d951cf6cd2

Outputs.Datagram (71 octets):

515014000108798518f46cac2a538ef1275efe4a2900e03156cf6cd86704af68
b8417322d082f4fc9d64b07dedbdb72303b4d2c4d2087ffb86fbf5bc012bc3d6
7355d6542e749c

Negative 0, Name: truncated to 43 octets

Negative 0, Datagram (43 octets):

515014000108798518f46cac2a538ef1275efe4a2900e03156cf6cd86704af68
b8417322d082f4fc9d64b0

Negative 0, Stage: size

Negative 1, Name: reserved type bit set

Negative 1, Datagram (71 octets):

515014080108798518f46cac2a538ef1275efe4a2900e03156cf6cd86704af68
b8417322d082f4fc9d64b07dedbdb72303b4d2c4d2087ffb86fbf5bc012bc3d6
7355d6542e749c

Negative 1, Stage: header

Negative 2, Name: packet type 3

Negative 2, Datagram (71 octets):

515014030108798518f46cac2a538ef1275efe4a2900e03156cf6cd86704af68
b8417322d082f4fc9d64b07dedbdb72303b4d2c4d2087ffb86fbf5bc012bc3d6
7355d6542e749c

Negative 2, Stage: header

Negative 3, Name: wrong version

Negative 3, Datagram (71 octets):

515013000108798518f46cac2a538ef1275efe4a2900e03156cf6cd86704af68
b8417322d082f4fc9d64b07dedbdb72303b4d2c4d2087ffb86fbf5bc012bc3d6
7355d6542e749c

Negative 3, Stage: header

Negative 4, Name: unknown routing key

Negative 4, Datagram (71 octets):

515014000108798518f46c532a538ef1275efe4a2900e03156cf6cd86704af68
b8417322d082f4fc9d64b07dedbdb72303b4d2c4d2087ffb86fbf5bc012bc3d6
7355d6542e749c

Negative 4, Stage: unknown_rid

Negative 5, Name: masked block flipped (filter or aead)

Negative 5, Datagram (71 octets):

515014000108798518f46cacaa538ef1275efe4a2900e03156cf6cd86704af68
b8417322d082f4fc9d64b07dedbdb72303b4d2c4d2087ffb86fbf5bc012bc3d6
7355d6542e749c

Negative 5, Stage: filter_or_aead

Negative 6, Name: sample flipped (mask changes: filter or aead)

Negative 6, Datagram (71 octets):

515014000108798518f46cac2a538ef1275efe4a2900e03156cf6cd86604af68
b8417322d082f4fc9d64b07dedbdb72303b4d2c4d2087ffb86fbf5bc012bc3d6
7355d6542e749c

Negative 6, Stage: filter_or_aead

Negative 7, Name: tag flipped

Negative 7, Datagram (71 octets):

515014000108798518f46cac2a538ef1275efe4a2900e03156cf6cd86704af68
b8417322d082f4fc9d64b07dedbdb72303b4d2c4d2087ffb86fbf5bc012bc3d6
7355d6542e749d

Negative 7, Stage: aead

Negative 8, Name: ciphertext flipped beyond the sample

Negative 8, Datagram (71 octets):

515014000108798518f46cac2a538ef1275efe4a2900e03156cf6cd86704af68
b8417322d082f4fc9d64b07dedbdb72303b4d3c4d2087ffb86fbf5bc012bc3d6
7355d6542e749c

Negative 8, Stage: aead

D.4. FRESH Exchange

Identity key seeds and both messages, each carrying its endpoint's grant (ttl 0xFFFFFFFF, empty ref, Section 17.1). EphemeralDK and SSPeer are the requester's: with the two identity keys they recover ss_fresh, ss_peer and ss_req, so every value can be checked without reproducing the randomness.

Inputs.SeedI (64 octets):

1100000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000

Inputs.SeedR (64 octets):

2200000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000

Inputs.RandSeed (8 octets):

0000000000000004

Inputs.InitCounter: 1

Inputs.CapabilitiesI: 6

Inputs.CapabilitiesR: 2

Inputs.PrefixI (1 octets):

ab

Inputs.PrefixR (2 octets):

cdef

Outputs.FingerprintI (48 octets):

dcb21085b6a0d515168eef511380e92de6e2fa7605f6f2a0a7c46748d7e561cc
fcb6e2ee1019343338a451dd93e63993

Outputs.FingerprintR (48 octets):

9d647dfc02032319260cf96ac633f4569ccc0c40e8742aa39b41012824b01f5a
79a75977e68ebe1cdcde1c3ab53c7ce3

Outputs.Request (3269 octets):

0cc500010000e2807d9c1dce26af00ca81d4fe11c23e8eb6752e1f9ad716c61f
c24f2d80c041000000c95760d41810e7058dfab0c20703432653a0b716a9d7fb
970d755d6d9654bec89f8809377cd2505cf67771fc469309b86d503f7aea94b5
0395357bba9861070c95adf950a73645b3c5547616d50101272d90e4926531be
e76a3c8266325286a3aed64e3f23c8250b0a81ccbe42e0b3ce69331a2cb833f9
939bf6c0cf5b0a382c179f577b688cba1dd966c1b0c0f9240ffb48358f09cafd
6ab20c4205eab64bd91311b431bc5d1cab83730e8da3822d5c88fb2796ee08b6
bd8ca16c01cb9ebcb6de22935396457d6c291d8722b67c023fa2bd66f7147f3b
5b9b2b8a1c6507222b32fc95bd20454e8b696fcafb1b7ddc1f0b08b5a3871ed0
605e419ba32f734dcbb29b69c58581160b24453d96981eb2a957f1a2908e4a08
4cb0360e6aaf9194a649d52a5bc2c0038c9ec0488c02a02f7dd46002b657167b
435cfa8577eba3fe127cdf515489875f72754ae0698320f10694479cb2d1bc34
5674ac2739c6055c558b84ecd33fdaac2b49449f04893d11d7394865609eeccd
6fc57f43a31e1682a53a98bd8916bc68c9950702236fc7b879a971e066a89f1c
3cf41c3aec29431a686eed216d3730c5bbd03738a49aeb962541661c8e806b20
773f44da40b7c857cc7ab50b007bf102ad54c181bee552fd8b1948f05a1a4a7f
c7c1c9a19a62447c570633ab8f92aa12e723fa79752b7bc770926c1ba8b7f4b6
8336213960a13c22d891bf12cb92d541f3a30e3e69b197101dfaf83cd7b13953
f1971374279fd76f9e845c7441328cf18e914230333387ab50a048e27dcb48c5
a8d87f2430905979094f2357bfcc9d2ed69f30a9087b82c2d7e223ae392077fa
aaa8f78f33f8073c41081e27851b8a8876029695bc261be3a214a5cd98a7409f
eab2c3739015d2800a3c8f96a75e7a11a1a9322725a9aea399529dc77d953232
3716b2413c83158598cc8688ef142f14c57440da51462c5f7791c030e24d1dbb
0836a426a86607a6aab8c484935c8322d993cc7055366aeb4cdfb13ab53688a0
f535ea0125cb78c8c5e037f818712aca0d2ff6480fb96e2baca8a288775e5b26
7d6b3dbd2164b045817c4b4f432473a87b973d551f36187100ec3b24e7872d86
99779398f6852650977499738af0f1bb64c95e7e6a98597a8a451894d6f66ede
b2282c55bd29bb94f7eb9b93bb06f5f1a6a5069effd36550926bc350c752aca6
79e6a96b144d39694eada052bb985fde9c9ddabcb77b6b89142603d9b8ce86b1
845672aa1ab5c510bac615099432c99ad23b5c4a548afcc4c98177abe0a0b82f
364d35b96f5633bcd3a0489b28b6ff5cbfd4356b4a904e1cb59bae046ac61287
3b8a83080788f0eb4de169ab19187312267e17c4a008000d638054a759115212
ca9482c555a05fde9868fbc93274956d535aa3cb9b4ebdf192b998c189683be7
b60d1d4075d848574d581522f993661221d26802e1360295216700944f5c55bd
fb54238df94c8d99c174534dfe1306f70992413566304a05c84a86ec9464390b
1bd3b459fdb06fffe09e1dd6175bd5bba96299d0237846a86e9b606db512b96a
22543e3420a91019b890129a198b45d9097e32588e538b68162e5f3212ed2a43
f97c68b54840f8bc573622911fc57b2a189d0241af5d8150dcf73e6f68cf5f09
cb635472a942627c553db40778db340f6a24166ba8c05907885fdab498167e18
952f529aaf0d183f168aa10322cad4656831c9be0d700544f99ce3b8c345c51b
e46c56952884a7371e97b24eec1ba918f93a931b360c05010508462fd9987621
ba4082b35cf082cc372d82e545ff9a55a9db0c712c6f82312e7f6b3cbbb5c446
f3778b069d55d4a23b674307a3c66cd9964740a2518c9f2d4cb6fbf68bc593be
b40574a101774e565ec3e9058e4674501cb865a94e0d6c3991f5875afa39b3a6
299f6c5e0bac23cb037416184e9a41725d12cf8ec282590c434e3b300ce34d8b
1224f3e57357e01031771c434aab9a624b314bb9acc345a78a1c3f707ffcc885
191833a7ebc3a9973a7e03b5d6c062a192824d7576343253d232cb34a321486c
43e3676f1a86af15f208292548a7e1513f630467589bef51533de564a0e9a57b
5b85ebd5895d5a38e662422ceab070827c9d28674c44243bf265032957c3d561
5fe02e385ca55499b109780197b0b4803dfa13289889b77837574e34d0e7d797
5f6e66b12c035fe999718feeeb928fdcdf0ed7e0f20a640a9cef52d36a707223
54d0183ed6b3e29d259b227b9cf38fb6f603d42cce8801d0d60bb67f176af11e
b0c9ebfc12a479d08769b9825bac2ff709366ed71c8a83c59ed6566652cb35ef
052adb01007d773eaa98bdbaa1d695a1bbc190b2d5b05cc541a38da255520f2e
cb6a9b77822bdfc2b80a52aaba6c0f3ec38b26c47be41801de9e09e691aa256c
e8e7fb0396300f949c55c91be09b03a5ac431a230f0c950d3f5b4e01922e6140
c0d672c92b052499a3e283fcdac3e9aedb53e8251ef93f72c1dfb09adfaf9827
a75b7d2bd8a29e9f499c76002b903987195f2f69c3ce945d3e1d574099fc6a84
c555e244896ed6fd455f9d8c041f781a22390430c80ec661e60cfd4a6d3330c0
28c4a0ccda47ced566f0255294e659b732cd5eabcafa3fd04e730f2ddc12116e
aed501195f3dcc97ada5d3d0fa32aeac41f4256873f3923216b7fa00ef94a0eb
24b357dacecd09e9fbf7c33bbde8a83b531f50dd43a02cd7831e7f11a0d6bf05
895cb2737df1343fc61f6354cc23d837e7c4b7e0b5af3164785dec26b31ec69f
14617d76eb7bf4f77325692b52149bb2a87db6a6d2b97aa927395a1283900a42
41354c980e089dbe9f50066b17bbfd39415693d621d4d3ef8ee85c2d5b19b1e1
7bc404da6d57025d9958a268abaa1adcf197b7e1519b23055c676efaddac9bc1
fdb7f67d8f12ca72781db9fbdd918ff22288b93ac2584d4103a564cc957e92ea
bbf0342ad89e15c9b4fa7647f5517398f25f4fd4cf762c12405e2510bc508883
e4294cd045e1bb40318f16ca660b4f9d4cd087fec1f7edcfe598bbc3bceb0cef
dc65f0aa8373305af77b6c6746272022df06daba91449b7e3a46f646c74fe7d5
5803bfc065de3007b857431d2e3b059976eda9c5b1bfbd9ac5ba6501026ed7db
6508c08773ac0cb85be1e21bb88dbdd05f423352237a4d4c372cf3fa96219dab
fc0a068036d73de49d1ebec5b8586c57084a66e25bde34f65a6101f88e265b4a
73a1d9b78ea152cc64123bccf05e3d01eb07a9fb0706392592959901a021bc54
70d68fbac24a71db2c0f5facb94955ec38b7531219923cae7c2382ed3dd89690
8762fa8207c270f3a515b528f3ea2419cb4a325df289ac58dc98cb4db5803601
ceff975fe614000ade64738feeb51894a9e38f72a03e4ca7773e59d0fb567d74
fabafd8bb661f9934a55c08846e9317a5b3cc7d70200a691538d6b1d016c0f2e
64199dea83475152ce500c283485790e944ab103cea373988337f7986c22e46d
3b2b29a9497b67c386e7c28b2d30e8d31ebcba559fc42fedecb9277da498f46b
d67d33a8ea6162caa88d48bcdd7cacc2b15c9d1501479f230f283736bfba5ae0
6c7ac96447ae127ff6f6de093b9d3cb7ebfd671852f2779e098c2f55011531f8
b6b530ee231bbc7b6740a0868ec8732027f75efead0f7690250e930e9a6ece8b
5a191626da3267a23300ace60c8f10bec7a2317dccae9186a1caa3bc9ea77b22
b92c56d5d2282a5464752e93ef17890436dfbd1a173dd62cfa985743dcbc63b9
87ca1917d12bb0223a4908566077c5e8b0eaf18655b0b43a04582b823b5bbfea
ba3fe3ca76e861826ad2658997d65709113bcf676c5a3d691f470b00ca7e4579
5d5a973974517ea45fc4bca296967d76e9bebeb786cf3229df80b2a7da9290d7
7e2123942fe65dfcdc497b3febdf82b374a59eb26ab04d3012f6d51f49fb740d
6b5d8d3a37de99044d39b09c2acd08e990aaf3a5f566871366ee5e281007f0dd
72f4bdcaf30c4bca5172260a4b8635c05186adb915b83ee1848d9e6d4f46f934
35d1006bd7fd8f9ebe7519fd0c1bcd188f244845dfd85e1c7c3539445bcb9685
9030bf8df47ccb66e80a5f4b408f3f5c4e12669a432b083da26e9d204cf4d70c
7da4b7b9296a139dbb965c2164b2528709096a5e6012c57dbbcf079a17163507
43ca567fccd7d6edf857947d10e97c5d7a6d46be4e046adee218a6beeaa1f0b2
694475a52565dab5f4ce49dd856dadc4c0eeb597634fa49e04b543c91a947469
71469cafa0f76d0c6b4fcf0014c68d0ed6362e7c6caccd43cd73f98c71d8a22b
7fa5b64e728e7747cdf812ad2f5dbb78a4742bd0955f9509678a2a8b93eff154
cfc781df05a004110892a829bfb3e78d84916c8e79a141a42e53965329388959
91eb028dcd99ac2b6c87e56233cd94aeee4fca0b2e9fd384e7967907dd319cdb
11199111120367af37afbc401ab2d7fc3192e007ee953c5c0b48512c55a7b1c1
9bf17bb12164943c252a9021934e35ed4bbc23101db956292cab5c90bf25075a
b92ffa1021

Outputs.Response (3209 octets):

0c89000200005ef625033f810cdaa9543319e2060bdfa691e8b9248908ff3616
6831f5987726267840488717113dc6f0961162d52bedaffa74035d7fffce87ae
b8d4dfa0a1deff6357d350cedabe86e29d4cbe1519b8400fd329a7964b1daa29
859ef37f3d137983f7951e69a858997c707abf57d00079b6873e2d6511125269
11ce118af65bba97576126095cad14488b36dece55a8f6a1312c38789d4b1fe1
0929abb522117e30585b3b4db363768042c7e68ec49f69193b3a215bcf116e8a
7489b61c3d6f528030194c918d600cb69a3ef19fcc28124a8d01c76a11b3f2a7
779611a17bd38bc9a579949e379a40e5a19f95452649138e5cc66f9219796156
c9e88b9a4b0aacb2327b7efc3d8fd655c79d7994f9f93211a9945c7dae1601e3
a2634f31a4f88b9ed2a4bea1f75f3bbf059b9d6709e0f86c7c497eb681131777
3ff2832a1f4b37d48a740bedba67d260979ef07745c46d0aaa23ddaa2bed2276
97f5a5e6386a740ae8b6da157edcc24ee04dfedc75a3e47680e852f969a9b371
0c1884debe8dce57afe9c42e850f6742d7b2636747e5e63f9401131055acb89d
8bb3b4f89ce1126a5a30f80659a92e4f571c0a79cacd2f7c250931b6d436e46c
7cf9c37c6d69beac2dd3a237428cbcff8272cde2341bd96203d0687ab94ef493
1e19fd48d52d1cc1fc016f61b3d8ed6b51c1ca9eaeaf3dc3c4d3252b567cc063
88a6f3c7c0236f2c76fb69be1355801be2dcf339c552e7248765137146c476d5
cc7986b5b5b0c5c4ca2e2d0c916935c0a15d07376f4dc4ae5c2191d2252911d7
d493be31e48ffd16488a7eee3c66b52f5f12cd19a74a80f0e9bffa52843d787e
493ab0a02bd9dd3e28994ba995528a85396d10eea936d4b5a382138f70dacdfa
2d03c5a8c8b98e090351098b29e6e7321f165bbf2d9ce58426c00964ec4fa2f8
9a909c39e1b53893649972cbf414452960794fe96bfda4e658a9a5cc5a80b926
8ff70d5e6243cfda5e8eb6b18e6190e4f2c7f2311b07e3075cce8aa3a7d3bcd7
30b77a657f60a12ca8364477b0a726d843d32b010fabc37fdf30287bba8be06a
e87e9e9f4418b967a7e5e74a11a34c285e6ad18fe1659fc321cb012e9d09c30d
cb2ed80a887c0193e3741c32794bdbc5fa3f224910d92b805c1789a9a7bae6b1
3345a548e71eae4afb26ce47bc5799a81202274fbcb956ac29fbadfa08d4910f
eb23df309e52b20248eece2f2a44d1c3ed8dbae119d501e92b149996c2650e63
b3e23ac31941749ec4fa3b3019a2435321c111ad35927562d70e390cef2f14a4
1024bc5db4d99ffb3f04e4eb26e178014477a5696f6acfd6f5be00eccbac4a12
870342088976d544eba81c433d1572e95341436c220709001a707bba1acf962d
a236fb3d140b6256cc4c16cfb539c3df9bcbd7a75d95218e79a02176faf31d68
ed14c1de9002fe6bca1f91e47798b820fbb751c9cbd26d4c3db3cf6dc638693c
dcd92aefd410051998b6aec34119fc17c170834b8d224be20c29ef65c5f3b559
f46cf91bbd2ac8bf91301c854ac70a7d3bf4dbd20b8a11eb75d779d9452ceed6
6521afd080e7e593aa4171f505c45704418cb49695107fc3b03027742f917c7c
316d76a85ae3ba84ed6ea47eb6f92f3e8b30a256ef9c8ffb4941847e779afa8f
9d8e2496d59f8bcfe967586db62562f95698d36f037a8121aece96821ec87ca3
920a3b7c5b3bf9f286d50514983bafe711d1f8d596fe1f4dc998d1ae87b8ce7f
630d2e228d3236eddf06a33a9184fb24154fcb0b174540e868f01fd018031be7
e71874bb8094baf8118aa00670948de587fdb29e750f60d3db6e211cbecabe35
fc0da2c29fcea627c18503d7f1a3846cdc3d70ebd9cac796255b9eaee236735d
073496e16f6847d990607198b3596926ffbe5c4a985c60f7f164118df91f440e
18cc389f6c42d83d04477175cfdd726d31614c638446e1340f03f9f4efb5c303
5c08ca0ac15e5253d0caff21814e9624671b63fdebe7d6ec29411852ba1b9338
74979f216e85c3ccdc47abd97c85908c8d70f8d52e4db68c149c399cea0f36a2
e83740febfc7b70e93e96f136ee9e2526d5cf0cfc76f7da9c4a68e2e496630b0
aea730e989b4cb4f2c145c21a66fc4041238571038747129ce1ae6b5738cd929
61e1c51cf5e9a8c803fc31cb9505db834d4f85bace7809894d2ac0aa3d8149ea
04da4a4f9da3f6b011032ae09420941c8dae42194b78f96917fcf8ac5e196215
59a4a5425733be18fca92f7e772b604f6b7bcd296ad3cbba4df72536d1e5c973
fdfa2210ee338c328383dc4cbb10275636bc87bf295ef72b66096db91988c593
726e2eca074b19b7986e00ae3446c56c28e6fa16f09290a6405b6dba063b67a0
db969f6ed77731d599f485debcf08723ebf7b48dd1906d8f98ea261d940f2123
b56bfcfc75b4b2d25b09a9e2aeb9327348fa933a8fcaf5320c8bf52f3e1dc17b
979829b25b367617f26951e6c1e5714968d0c79199b254a66fbed5e59a44a78a
e2287e0b963aa2a9998bb7101c27791e6c901d66098462effb3b7d847721cc95
911e8b4cacd26752369e79d9ed63a53c417089cd8b3515ac99d0173133edc392
72daee5176d662c84adec6444fd827ea6a8d28e2602fccc968d4d1ed42543b53
cf71daa90a2a6a7cdd1b7106519bc8c55397c03954c1b725e2f19d021a46f09a
7da9a72cad1721899ba88f78ef6797e36d2661424c625a2ca64aefe5b77f1b4a
56c8154670586a19b81b71e2236cdfb3118b301e03514a39e726ca9eba690402
f962060d0232d2f71195269415ebb10e39e91438431d4b2b86045070cb0d3da5
e2a539f3cd457acd186ca6075bfd1c14a4e13c6ddbba70aea3b89896e85f9c87
9e089338c939bd03d05161008017abdf29490c0fae2d1df1c9bee64a5dc11b9a
702f00274a216a27777dd7826ececd3de3e96d88002dae60286cba3415822fdc
777546a13f9648c28637d9afe7f13d457d3605bdf14aae13e0c04fabdb5361f8
4dfa31d781683f6cd9d5017aff945d8cc4eb433e353968efc898ee55fc46cc34
e6307de53296594e6689d46961a6c7d336b347885c2b11df6d5419367c06d94c
d3066fff188dd85ce0efb54c6ba3b22382b4f69be110f42e9a90c6bbbf08f6c7
618a8e34586b5bbd52cb86ee2d1ea26b2ef3a11cbac90030b2485c01d45e6077
78c2a0e207b8059c19222209cdf4147a801440e3ea200e25c11d433a041881b7
b11e765d24f061ff61836beb11a6b34a304ca73b14c41cf07ecda01012f85a66
5e6169603eb674db8d4e1822cf8a60902caee17d8ceb66e3c1ba0804c02fdfb0
568f72ca8f8914de2ca2020af1d6bdc07f057a8ae056358afc1bf7fd655d8db5
132da6a5951f91c403ae2d9d53f5f6cf6e4e11d49288ea3ec34b10ae43ed150b
5523c48319e104ec8f8bb8d45a976a49ff18d46bd3bd696cf435d3955bdb6ea2
c9dd5afab3d1365ba8d1e043dd6840c74d7729399484644473215d683efe0d51
2822115cdad026fcab25b43b83738bf4f869852764803dd8730fb75718cf9cef
cb7ff8aba7ece8562ff8397f9b0d09aefa395acce872a22aa248007e749182d9
11b68bea9aa36c2087637925ab7ad6925be4e870307fd56c3366294e44697d09
e03d836d9d072fcd6940f6c3eb46ef4daa9a949313155a4bc0f05e9e21a1e4ef
b3b296acd26fca01750b116e734b851f641c3edd1a7b5ea92a0aff57317f881f
d91d2e5c48f0d83cf0872677b602553bb3cee5c4dd96ac4c95d88e0e15d22bdc
860b4154a128636e989bae980227e8c275a2df70e7db31c7fb4a481832d68672
d1829ffeaf402a41039901b9947398dad3a5d85b0a34bba7437ed76b81b6942e
0a75838fe850bee3ad3aac67eefff55bd4fd3ed4888aacc658bcc07482ada312
7a2d4a76c713dc6a2a89eeb767accba4c772445ae8339cb9eb748f579d494f34
152e0b6e99da7cea2b50136d4264d422cde2db12faa3a7280e9befa4826fbc3d
cf891691a65902578f13e0fada05ec2d44c42611403ce451f0b3faf3666ce1a9
46318d14d45fd4f4a2280c5369a136a936d2f800f35dfa5df93571e824b19470
98720e27694fdb9970348648dee51055bd2621d492db4e08425be7049681dba9
5e2a2f99812960395024166994e9f5aadda25ed2a9b46650359f60bebe85b47a
72f425f87649334b559ffd106f217f1c69998bd179bdd7ec2680bb696affdfd1
96e2377d212bcd7dd2859d34424e0c2bf78415a46d1aafa11842835ebad84759
7e24729e4f81bd7774126a2dfa2d2ab36b5ba0914d4ef6d213041894818dfc27
79b98e23afbebb5f4d257ec72a9784e902a2eba789d2842c99b0da7cdd8d813c
000d1bb22177296e17cbc57db1780fa86ead5c08a8c76840190a5e15afdaa7bb
88cb5ff631a0254c34e78a76a3303da7d0d753cea82752c1dc80e89f0dfff198
121302ceb8c0c91da0b9d1efae278f36ac3b3b04d44c347ad9278654d5502bb8
5fcea7aa335a3b3e0a

Outputs.TH0 (48 octets):

c244141fe3bfd938d2d869696a5ad2f4c640de3731ab685a49e0a5d276d116c8
191bacf4cec5fd60d0532e3550fba2b8

Outputs.TH1 (48 octets):

a778dd05b0e0e02b0864c0202e8881d37c803c08ca1774102cae1078c4da2c16
4e37cd3aa72aa9fb7f8bd5ac1c0663b9

Outputs.TH2 (48 octets):

551c2461bd525cdf44e372d084785b2dde4c68fe6b392f393e8930f92fc7ea13
92b10538f48c7f394b07583cb3195b09

Outputs.CS0 (48 octets):

d9d122caed3d61e03a7333c90f462c10a422de1ef3bf942998e49fefc44e9c74
eaa5ca77668e3e428ca1c6e25ad5dbf0

Outputs.Lineage0 (48 octets):

24d0387477bb375f33c69d448aa28ebe89084ebab4afb8442fcc16eb4cbdbf1f
48cd4c7dedafa181abeee0f1c533d2d3

Outputs.SessionRoot (48 octets):

92f435572d336f8824fee372e28246d195e52062081b13cf0325da3bcd9d10a0
d0c73d7f1377ea9cb2f11b8561d4683b

Outputs.SessionID (16 octets):

3a97c10ae35ec7097a267e56dc73fa2b

Outputs.EphemeralDK (3168 octets):

8216911852226e852d48da256ca6c9d03906fc04c5cca188d3430c0b40401768
a529871e2083cd5ffccd21dba4dae914ad18a53c0652fe767b91b00bd5b25e92
b68984d14eb5930348981247b77d715067e432b77fd2c6ffe3111ce9b6242282
c1b7a2021410bfcc959d7566bb3bb2c99b6b07160c4ee6990992462865986e44
68e7b5502eba1955d60bd4ba7990b1b22ac226e5f84eb42b1955e6ce5e5b8e99
c5c0212ab007638be1fb9de0619531801032e1239a08701fa27a6a442395db48
f9561d6c8050db8b7df10338dd13a17fa4165692cf98f58809604467666ae310
6d5e4cab2b5249444290b26404c0b522c4bca56b088b30c15f483b83920c01ee
cb2db657295b1240b5709b0e9203e90ab14e22a35407c9dd6bad97ecb8a1bc39
df98b1c6168a0275acbc7323ee2a467dfa905ddb521b35cd62d0434123423306
3225abc848e65b105255f3808186f6672d041069a16a0d7b2765256fe0795118
292ce1b94fb5cc8fab9b8d7a3b6b1ce4283353343168a5e5209ffdf40f49b6cc
38b4520bc27c6437289ca34709004dc9816c186b2fb8319f047b2f2002b40bb1
a6bd722553313be4e1c80424a48ed82cc219852cf9871748228e410a2803127f
9133d0b3021641c946eba6c1551d3e523dbd2087171b0221ec4180a75c20689b
bba553cb6a32d4b538a8133c76d7b21eb882c0267563280895f70ca3bc0d398a
4a51c83505d4adfd2983c8326674040f155b02dfe27b1c250df88b0d3801bfca
e567dd9c51f0b54846db45b27b564db106312a70d094c1dba8a230c6bae9f0bd
c7aa7139378e4ed1acd6f4457bb7058bd6014d005135c43b0c516b90330d14a1
b92d6a417c53042b316fcea17b77d08b5c905a95b9344191bb4bc0c571fa193e
748bf4b1c389c893326a62bf108b7091ad71195a56e4a27dc5b99e4aab32047e
2004551fe12f427238083aa3a86cc4702193eee83175847181056786a01ae41a
12a4b4bcb9eb28edb5263030132957ba01919cbfab8288c9cbc24c044f08b5e6
e17e7c210899d8cc52e51305f35d4e9c9121692f55301d25152cfe18c0a48b3d
a36ac5b7164a24293c8d24c6b1f0a66ec7085867b7a919072a4c2118402f78c4
337a63791b651068f900eb7346f13acc00ccccc75792146a42c1819b07a82693
336f273b39ff7209b8fb4b22a8b38009b2514b72355946276a96952b196c820f
07e924774a509041cf512c2692595a6fb7809a7c822f4132ae4a1ab39a142f05
8ab75733fb18692c96c8776b52140573e0286a92472e5c20c82685c1238145dc
0980a50115f40642f3132ea1c07408b410599643a32101710227a1137ec6c056
f8962c925345b3f92f8b6b5d13837450a925e4805cf119b5dfa8797028711d57
83a6b12ef7cc04dfd964d919270059a92fe70e1a3c436c166ce76b5d98227bb8
8855dc2b252ecabf23c4c0016a96a1d3bf7e9b3c57836bf3223203f258235511
912496fa451281206e72c57dc21a2808d62fc94b0fbc5584e4123ad95473eb51
2e758b0506606e96d66b634252a523609cb3663347644e8917903c1a95301b8e
601b4b77a3dc6179fef28ecdc8b436b7ce61f36ce8547b922b843c10cbfab926
a39a303f01ababd827ca3aa1358c4ce27b8306a13b7e5a5e502c9438d325d310
520066c58a27b1047a5afd9396192c05030a40cef70a816564808981c6daaad1
c041c4c60a901719773360d5e6126a3bc23ec405dbe4bdfae630c99c38824608
488924426989ea711090a524b6067b06e5c265e510b54b81fdc7590326867630
2e77e86e9761a53b8a1ccd08b1e2f816834b1d35bb054f90453db171409b5f34
da03c2b04a36b27870bccc55093441a0bdb2f098f0e390b6b1489b62ce313aa9
ea32136f45a2c1bc532c214c7395b8f902cc7673401de71376c032c4183846e0
bf6ac36f0439369ec9187fd98a3cab706a4cbd5807a5ad609649fc2d40e72e4e
44108089521b71c7615843d91979cc6c14ec57667d9325599a57de6b931df1ab
d3ea8e23e3ad5435241ad54df277b050dbc3195657a6f260d89b563305826814
4b0ec13d88f732e0300fc5759a81ac1db0172324f34c886670ff00af3d4321df
b854e6e85f8a9944d6689448b6855cb46e198c6e65c4b0a6549d9ec287764102
c95760d41810e7058dfab0c20703432653a0b716a9d7fb970d755d6d9654bec8
9f8809377cd2505cf67771fc469309b86d503f7aea94b50395357bba9861070c
95adf950a73645b3c5547616d50101272d90e4926531bee76a3c8266325286a3
aed64e3f23c8250b0a81ccbe42e0b3ce69331a2cb833f9939bf6c0cf5b0a382c
179f577b688cba1dd966c1b0c0f9240ffb48358f09cafd6ab20c4205eab64bd9
1311b431bc5d1cab83730e8da3822d5c88fb2796ee08b6bd8ca16c01cb9ebcb6
de22935396457d6c291d8722b67c023fa2bd66f7147f3b5b9b2b8a1c6507222b
32fc95bd20454e8b696fcafb1b7ddc1f0b08b5a3871ed0605e419ba32f734dcb
b29b69c58581160b24453d96981eb2a957f1a2908e4a084cb0360e6aaf9194a6
49d52a5bc2c0038c9ec0488c02a02f7dd46002b657167b435cfa8577eba3fe12
7cdf515489875f72754ae0698320f10694479cb2d1bc345674ac2739c6055c55
8b84ecd33fdaac2b49449f04893d11d7394865609eeccd6fc57f43a31e1682a5
3a98bd8916bc68c9950702236fc7b879a971e066a89f1c3cf41c3aec29431a68
6eed216d3730c5bbd03738a49aeb962541661c8e806b20773f44da40b7c857cc
7ab50b007bf102ad54c181bee552fd8b1948f05a1a4a7fc7c1c9a19a62447c57
0633ab8f92aa12e723fa79752b7bc770926c1ba8b7f4b68336213960a13c22d8
91bf12cb92d541f3a30e3e69b197101dfaf83cd7b13953f1971374279fd76f9e
845c7441328cf18e914230333387ab50a048e27dcb48c5a8d87f243090597909
4f2357bfcc9d2ed69f30a9087b82c2d7e223ae392077faaaa8f78f33f8073c41
081e27851b8a8876029695bc261be3a214a5cd98a7409feab2c3739015d2800a
3c8f96a75e7a11a1a9322725a9aea399529dc77d9532323716b2413c83158598
cc8688ef142f14c57440da51462c5f7791c030e24d1dbb0836a426a86607a6aa
b8c484935c8322d993cc7055366aeb4cdfb13ab53688a0f535ea0125cb78c8c5
e037f818712aca0d2ff6480fb96e2baca8a288775e5b267d6b3dbd2164b04581
7c4b4f432473a87b973d551f36187100ec3b24e7872d8699779398f685265097
7499738af0f1bb64c95e7e6a98597a8a451894d6f66edeb2282c55bd29bb94f7
eb9b93bb06f5f1a6a5069effd36550926bc350c752aca679e6a96b144d39694e
ada052bb985fde9c9ddabcb77b6b89142603d9b8ce86b1845672aa1ab5c510ba
c615099432c99ad23b5c4a548afcc4c98177abe0a0b82f364d35b96f5633bcd3
a0489b28b6ff5cbfd4356b4a904e1cb59bae046ac612873b8a83080788f0eb4d
e169ab19187312267e17c4a008000d638054a759115212ca9482c555a05fde98
68fbc93274956d535aa3cb9b4ebdf192b998c189683be7b60d1d4075d848574d
581522f993661221d26802e1360295216700944f5c55bdfb54238df94c8d99c1
74534dfe1306f70992413566304a05c84a86ec9464390b1bd3b459fdb06fffe0
9e1dd6175bd5bba96299d0237846a86e9b606db512b96a22543e3420a91019b8
90129a198b45d9097e32588e538b68162e5f3212ed2a43f97c68b54840f8bc57
3622911fc57b2a189d0241af5d8150dcf73e6f68cf5f09cb635472a942627c55
3db40778db340f6a24166ba8c05907885fdab498167e18952f529aaf0d183f16
8aa10322cad4656831c9be0d700544f99ce3b8c345c51be46c56952884a7371e
97b24eec1ba918f93a931b360c05010508462fd9987621ba4082b35cf082cc37
2d82e545ff9a55a9db0c712c6f82312e7f6b3cbbb5c446f3778b069d55d4a23b
674307a3c66cd9964740a2518c9f2d4cb6fbf68bc593beb40574a101774e565e
c3e9058e4674501cb865a94e0d6c3991f5875afa39b3a6299f6c5e0bac23cb03
7416184e9a41725d12cf8ec282590c434e3b300ce34d8b1224f3e57357e01031
771c434aab9a624b314bb9acc345a78a1c3f707ffcc885191833a7ebc3a9973a
7e03b5d6c062a192824d7576343253d232cb34a321486c43e3676f1a86af15f2
08292548a7e1513f630467589bef51533de564a0e9a57b5b85ebd5895d5a38e6
62422ceab070827c9d28674c44243bf265032957c3d5615fe02e385ca55499b1
09780197b0b4803dfa13289889b77837574e34d0e7d7975f6e66b12c035fe999
a33e918a44f7cb0eedf71ecb3d500b4d89ab25d13680b07d93ab3c7522e04cc8
97f4378037ad8aa15ea7c95db087c51c99644230bb8f8b6243b21cdcc0152375

Outputs.SSPeer (32 octets):

1ae718348dbbde04eef0cd601e30d72197335df794a936bb76d6c9013cb26d2b

D.5. CONTINUE Exchange with Both Proofs

From cs(0) of D.4, target_gen = 1, attempt 0; the requester, here and in D.6, D.11, D.13, D.15 and D.17, is the D.4 initiator.

Inputs.CSPrev (48 octets):

d9d122caed3d61e03a7333c90f462c10a422de1ef3bf942998e49fefc44e9c74
eaa5ca77668e3e428ca1c6e25ad5dbf0

Inputs.RandSeed (8 octets):

0000000000000005

Outputs.Request (3196 octets):

0c7c01030001c00913e02a63e4cf532d9b2ce282fad85af699815c18c595ea80
4462a794f7510000761a4f21385317432fe08b6934ba38aee70f5bd4274426b4
f2b8c891fb9a0eb9cb6b46c4d9aa3cbb083a60364594b29d3b6254abbc123da4
80e7a3257c6845d701cd0c20164d0483d23698f7ea7850d83d31652be789af8d
65b4ab282a44157a6508b132399052034e2719cb09a257b858b964c652244259
9fc4959ff775768938e10399d4691536899928219ab59a4a06db3e0576089477
586a7510a7597004f13577028fe9bc65eb46aafb6368e1ea72e1180dc81b7858
083f05e46a06bac004b76f119c1d433249f31cc158316693990171179c55a15f
4e0cc75264328ec10d5d6a39bcd375c8913e82109f93335438e7848c28c3ee21
2c590c1c1e5129098584d1646f99cacdbcc63743f7ce4bab9f9f979c4bf6bfa0
09af7ee558cdcc39dbea52e46507d973905be2c6ebb87b21794db7c24f4ed47d
2ff653ac708bf6b8134831329065aaa87b782248a4e5491c5dd934d9a866143a
5d2b0a94d3657cece8869b0a73088b8e242181218806b3a6b25c039eaee17611
c88e1d696bda574735aa6621637e46108a94f077053653610811f5f403b2689a
3088c2bb24354014baa3dc625313715a051e262811d29964ee2c8df6a481a9a1
6f62b3bd4ecc9266fa388119601afc0ff863cd2ff1a103c077c6385245a20b86
d6658e13650f68aabfeb693886cdfbe47262cb33d96ab3ad6a4e580501e74a8e
a6fb3f807223f2da5a83443289903ea1825fb47bc98b502d050b7f1037684ce7
a2ade624298c2a96080483787ae8a6be49f1beee8b34173ac15a54cab416b1fa
a870f0f407efb4715c8c6f71ac080063299c47c130e64d1e02339a9426582c1c
0ee363b95b42f6d4ccdfcb308101c3a14631ee2574d66b15c09528e8c5c5eaa0
766a7a10e40380df9c4eed293597b02139ea981c5a2d33db0c788ba532353933
209517158d00281b009a947cc03a7ae867bfea99bf706c423818d68a8db63abd
cd26be62486bbf230dbc1456e1666d7b0254f72aaf09f09cfc686e3ff850e2dc
af42b26445d17d4d55af80e630d51097c9d27f3a5a3f81d50bc46b1de23073fd
e890a85ac5050a1bb701020eeac7ae4909446a89b7d91f19eb86d9423425bc6c
1713841d8323fe2b1428720a3d066dfddb008b584f704625905317a761720ecc
4ec28607dea6153119af49b4b133e018f9467846ec01436108676c24a2213f05
55ca4dd769fbf64704d32d50570d12d4abf496523f2b7f1a18b82080027c7c6a
debc0868e3a6321a6c6c369d2ac55d7e867367c76d9438b3f1c42260a268ac02
82b277323c64031ff87855474b47803215370b6e354871892ff85c9c01aa1484
f9027204a439d1c6a0348f854955bd909609c793ce41ccfe0579bdc4bf11d17e
ec4288371b4534e12734346fb8ab4561d550dee81b5f7b6dd6a93465612b68b5
9cb82b2d2aea2569219afae57999a0365266a7a1679deb6b161ad96a76872dcc
a390264b6674b631595a86b0070bb4bb82005870e9f53fa8327cb7bba6da019c
f5d6a757c74da5a26be430655a481010178389290f7f48bc76da8582d14911b3
2d716b8baa789f13606612517e9fa1a0201885a21108d05ba50adb5057f6265d
8925fa95a4a93aaa82c06d42f199cea14f71c5a18bc6cd8cd3158922206fe855
a9b05794cb9bb83aa84e975799298ee1b85f9a4070317439c48202325907947b
100d154a38a6b8ddf392662bafd2ec061b6191d4ab01c32c0b8b3abf0fc919d5
8699b0006c7b972223bb5185a88d8fa37696f028c7f1214fd131276b950f295c
f4ea7c881c81c0da8271b53e2d3059a853590bfb13eee422d60c58a1f557a990
c80b70b68736055db9237dca2ae5f4974ef764fa1c419ad24d63cb2e96e1ad64
9070e6363ce4877317558ab631453b3c358d7860e39a49e2d011d4f00a5bc756
1c27c1c881ba199362e61c840e6ac1ba460b87305c5a0ac4b9d447950578abf5
c9cd39c20bb0ca742b0a88968651300f12bb5965fab8b1740785db5e6f840548
85b2658c7faa6306ae03b465327f5196a3b9d2040c34881aa60ad0f45be7198b
ebe6b2d0415f1b48075feabe381c0cb07a7e276a0147c988044645b10a826745
567c37a65e257bf7c80abfc8330832094e8227fbd68933f4a1c3428ccf271f5e
e62d3b982538722a3ba81253bae0caf30084efd7e03913eb4852056af5184bdf
0953e0d84a640a7472440b8fdbf5a91705fe2d4a22bd6c7a0ab58c531dc8a18f
05f92125b319957aeaa2d17d809f9a2f71ced9ab19900e9386f2b5df50b688f4
2be44059f17f75d01353fc2c164e126d750562bf5742614f231e3dc3d620f798
07f029ce9638e0c75c0d76642f72f582801f1ee731cf1511fe9e25251c069ea7
35a53ba178932da924f94b6a0b75aec28c6c9dfce3b93a1c57d281adf56f9e44
77b9a7a534549f5970004acf7d376fdefc2698d460bee8638d83225676834d9d
b0779891bd42ca552350392e0b6b49d0797f50da5028199a23735ddeb2392325
e0b034f186b69f7e8b17d40dba33f28d975445381d52910de6958da8cc7fe93e
efe0405f3c1876f3efd7322fdfca7c30f0958e071c39cc3a096802fa106dc219
cb0b8b9dba502e3061bceefadaf173699a47b1a24cf5cdfab2013b142a341e13
2ddf12276984ab955fa4d50de980e05d26106ffa00053425ec5330e1eff24a03
8092ca480bbc249073089e674953fdd717a52de4da23f1cfb228cd79c1d13eac
da87e8fa7e743ebd11c57c4c57b133384747dbbda91ef98b921d718d8632c727
6f4fb964fb01ab9b306795002b9b87f8eda2e761d57b608cd6961f784d110635
0e858f4860c4c83824163889e388c832c2b6673dc2f898e430747a330468fb35
4d704ab4ec4a7850512929c7919668b66d8899bd2646879019f0a80ed8dc8d33
b7c89ec0039a40cff1ce0fcf37b341c98e9e04cb3a3b5a061daa056d2d5d2522
b988ac3234be654ca907c6530fc9866e517c897e2767ee97d329c6def846160a
bea729f3054924b0f2a48889da4269fc074ead921af746c4d4f968b29a6432e6
05939ad15b05ef9e8698bd2225aa414151c8a350e34fdedf441ea45c17545a71
8c5653226d43596feb9793dacefb723af5bedf3b818d12d0f0618a2ac7153b13
be2568c735448c723000a909413cd3ca22192fc91e8aff02b0e02f4a2b06546d
29df22b487e44788c1d8033eaeea4d6eff0d4ebb01d416a6135dd52cfb329ac8
612ac6092880632c6d6f9111466a277510e4a8ff9203b529ed021dde1931ff1f
97d8bf489376c4117874821dd62f34a72f94953e66e35c8d2faa930dd3aa1242
c062be94b059223c299b2003153f0aab21f9f7c2c22131e1ebce5f0605b05992
f0a66c8f076cf890542c93048c1e316b740b877f4c8bfc59cff93e7f86c2482e
b343cfdb236ca393fe9f34f24dd56c1224708cd03eb54c3564900162207d1a46
0496322e4653a83313deec40a272f58258c66595ca189c2fc173845ce487d850
be181a222393bcec9d4ea47ecbe5d41ecc3881befd9f5076531e14ec103e1601
54dbaec83c6c12df0053cd03ff73007b8fd62044f99c73aa5e90df466bcaaa32
2f4f05bee2c257948a006e253848f50bb65420a580beee864e3e8df4dd5a67f5
ca440400521ee23b7f9917504a7afa39f07da83d03a9634dfcc03e47c8505c3b
25da24a4332d4d464961564f321b7963639fbff9addeb2881d463e49e13e25c5
a4ed6c51c1ea50e1eaab4c7079bf0136eaea6f59b730e59005b0692ed81aa265
e80ee204c59b16574498a05b0cd9b99cd646ca8e939c4f6b20ef14e14f993bdd
0c241f6d372e23354a35d8e628a7e193a248d6bee0f10814f2d22a9fe51bf821
a2b3dc262aaff5f2f1994b90fef0d6bb44fd1d5f737cbaa1a76c0e78f0cb4cd2
027f2d4ac7855ecf612d702da94e6b490278937232d17b588296a4e8345463cb
179894cf9ff566716e2273cfb503d5da0318bdf2269fc0465c12355f84ed487c
68c2071cbe860eb12b114a9554156e64e79beab22fd5de4f1e271188c9026065
49c9236b7275b28c52175d14a5b1a254c1b7f15eac5840ce575cf9044ff3df38
63d967402cc89d934e11ff8b8ba6956dcbe50e7db4292fbe492aaf676ada7cab
0495143c5c6b5f61c29cb903f360f487f8321b2f52c48529e49f14ae3e573d9f
dc6e1573603de5e796caeed04f7d7d99fdce9a9b0159f97e299621c755b595b7
d02bd574409e65c63e70a659aacc3ddc86ae8ee4f420100d5af6b554b72e612e
0208dc062f7c5bd55f44dea56604c85f25f92a1cf30529d7fe1e8c48d46f0c07
5b05da3cdf2351c04e91da15cb0e0f06b4a8c4ca5e00e4c589cadbe63c60227e
1a98748a325fde9787aded5c7f2c528b9c10ffb623b71cb13e6b973a493f2b24
e7434e51c851bc1727afc92307eeb3b00210a5fa9c190290eae3256e

Outputs.Response (3192 octets):

0c78010200010fe97c737b7c8f72adda57c4a29edf179f02f3d0bfd3eafd8e77
33b84037ea8791ad4e77d70e6e6d90dbd1856e7851685afa0b23e8064d63bafd
2c50f9b9f75b6a137422b1b58548f1c88b87c24f95052ead4c9a55e17a9c982e
f5cc39a69361ed740e9557e7b57e14eb0e14ddd10f37cfdbf8e7dc865ff2eabb
7526dfb1c4afec3022c1b67ac886c895afae9069f35eb818e9f30e50356bb2cb
1e6e3a7530f62f4808817981c0a9341656cfc91ebe70653d1d120251cee40879
08ee3e875c3b932f7f8285136e1d2b68cca3479449027f783dfdfbf979f7d362
81f38b21edb580e16a245b273e5886543ce7d771c4b461cf45dda650ecd21256
0e7b5b935c120230362d41037d14708df7ffc43738f66805ac862751869b2b8c
35c65d43bd4b33f4831596b381eab377d54152aebdb2a41f58ff4f748aaff679
5c1b3e6f82caaf6ada8613ef02e03e06733cb4b1b9e1626c9c875135ce827745
072fee564f74fa026f7ba12be46e4e2ed1c17ec72804be3098011bc1ff2a50e7
b128373030d6c985b3ffb0a3a55bddd0b0918c48da43d7067145f378d397fe06
31effab2ad58c434deeffa257e7cce38bd2243ce42bcc984af422ec37a73e55d
64ad717b59b5bd03fbe4be3ce4aaf27c3d11305990c599b155cf99a3ff3cae7e
dc93a9e6eb988465e3aea77f47ec97f8cee13583c702e3b9735cd45612b73c7e
225cfa2ea9b10d3d88218d2405357394575d954328b3cebf24b5c20988a7bb69
8731a82cbccb83b9dd21abb5d1473e0262d7004094d291182c8fff344dbc4cac
7a7d74af77d55822b668a71b37c351a5d2fbafc4dd8ae2fa97b601a19fcccf41
08ff4298c7b70767757888c1865f5f215d03fced53604b4bbeac2c96e149a3db
0f33249759543ffa0831cc190f7066af522c32e3c2248b7f781f58148a4043c7
f4296e1ed646d37deadb9601cb2ef7c232acdc1f5117b39e3e334f062d87df79
0cc9bfddd357b94164e5e1c55af91689a061c5845914592175c4c062b136c65d
f10e935bc4fe59840113fa323fc8a6f930a93f611ae31e5e900e55c4576707cc
39dd1c39e2152ff146a5daf4051d96ed2d5b2dd551ae8fc6ea150b619870dc85
6d571880e965797f64e3d14148c0ef0a26aa867cf9c9bb56a80762b9c1cd1b3d
7d122eb17426d5115f84b0dba93010d6c265843864633e621f2da326758b0db1
068d64566c541354c6b8b1bc098710f7328576d52c8cffcdf7a2a2da99bf4ee7
e8d3138f702e7d4ebb58002d1112431e3daa05ee7d8f7bec808632e609e2929d
088d5de3114bb0872bad4c8fb8b104d9d57248ccf650e062228b095474938645
62bbe7ca0556f66d55a06c16a5c45bca7fb2830dfe361a84ae199d0bc175699f
b2389fb0921f18d4b0be45418004708b65c0ed4d6a951e0a3ab31603eca32199
4ba7fc1a80b6599e5f3f5a1323be075d7fc308a045cbb394cb9819a5b347219d
56c09469c6b9ce3bd26ec66b7c39062f57b90b5d13879ed9d70eeea7077e9a7d
5af9fb02cfdee97cb8d812170fcfd94a28c86e25a8983b063aeeb0d720d94cf8
55f0793eb284b2598350c327af43f366ff8cdef7722cfc9d6aeef057e1c1fbc8
76472a178ced4177e8411170becef8f95deb5161ef5ef41696462fc1e8614830
680b68f3f0d7261b30abc8fec43c8c1792c3408e1185c6a364d130e4a2251bf6
2215b028fdf89be77eba4f7f928ba871a3997a502405ca2641b58a61825c7f54
081e76ba6758cfb72edb4c4cebeb89d253da4945f8cb49fd39ae02f4c354c5a1
15614ff3092692927fa437c65f0ce884c6ae5229fc69e376f730f56d0b4aa6e5
b8499a7844fa893042c9d4c130135027e6ab09e48d8173e46bbe31adccc0813b
4bdb862cfa5853bafab3e64ff51631a11f4560fc18c494b6de55a38b2eb6527d
26191753ccd3ce73d85473bfd897afa94417488e5d4ec73df188960dab3bc588
bcfa68dec693067f6f51d01007e8083322ae69363e50305687f315cf19282ad6
1485c489be325e533bb2338c341373d0f15ea4d22ec682aeb0e010216fdc01cd
f694a4ea68fd808c36e2c11bc206912bc80de5d4cf131e491ea6fa929d12ccb4
e5dd2ffcb7fa5429683f0fe20c442b8036fcedd132978e7f0bcd35acd87b4541
e93bd749206b61ed987f323d2b127f04897f822b58a9990242e5341f06c3e08a
10522883043054987e37996e1252b27dd3fc5ad7eb1d7c61d6d236e073ebd906
301a556c69719444acb858ebd5008f0f8838bf39746e91ef6c49462b85a1731b
6bac214a1447dd98e38464bcc5bfe36842127d6c5862cf643f7e6b5b08a0f128
d63ec28aea81e8f182d61fe375678606067c959a940e3872c65c6042184eab8b
e4f17fb4d878a828488476aebdde2f484963314453969917b2d437b518d089bf
d2e011d8ae924262e01b24689c2fdfc8c7c097f52acc79f62a63bff5cf3140aa
0fbbc2a4ef50db9fd3c1e7c2d06497d27e07fa1dc3afaad4dec8cc540e0d9dcd
ecd1f97c5074c930c7140aca57b948b3c16d470da682feb2c50a1ab806272769
c2dfc6d6e36319ffc202f12345845e7151ae4ee70f9ec1df5a27b23ca2dafc3c
903e6b25058056d8ac77e6978ceee2732ebe16fc328b8eca4a88ac5954f6acde
ec5f1a3c1737a3d5d5be68e1be05050bd681114a0186d86f5826b1e27724d42b
e50f443f1c168cca27becfdf1e70c9bbc5613364c66ebae5233638167471f6d0
b6a9c81523948956f7958e7e76b782ec381ffd86ef477d821a4206142427cb6b
b3ea37753544222f24dd1e082db1ea58cbf0750122acb8a04f5191c02932baf5
145500aa618921f99d8973a0b2cc782298493e39a37dbfc502b7e6eb0634fdf3
3e781e8fb0db98647e3c6acf675a85659e4e631dd5521ab3c1a2f61975845a07
35849fa6f3c22381c19f7559ddc59f2179c52842eaf37dd4341d40a19c3734a6
173aac8e78ff20cf9d07c2dd826958be76875dc39fd00fdca14953dd91f11221
0b20a352f84d478eeafe1f9fa5c41b59e47c7831bdc0d5849150f26a4df55139
1eb4929d36aa75dbff61cdc6d92242993151f06c84764a3e0ce13edcde215630
bb3c78481bff996c7b8e7655a364c7ea47825b573dc025feb5adeae2a4579eb1
ae6d6b5704053a2edc075a8b36ac3b80f6e495f61d02903a2f16bef049e3c22e
703621ae3295a55eff100cadfd16e2f49edbbf26344fed7a7cc8007db211bd76
c27c901ec5fe47261e1cc5f72949602b0421bd3f68fca189425d4a584b54026e
47615b4f8e91d1abc4d75b1d1e2fa3dbbd7c2c89a112e4fb1ba014ef95b176ff
1c4299200eee1625e5e2147913654bc43c4d32f033a25a9c7f7a8bd41a59fdbb
9c12b0860323db7982302c94578d4a77b363b78f8a03282067195e885dc0d110
ae6c7e96b2de60983a98f665fe29faa81922d00fd9cf455c40455bb663dfb13d
62247ff021280f2fcc7c85d1f1a8f965d42855e45aac86e591809392824c76d6
86d2d118b3fd540445a49be0001b9ff4c3effe020e19343b364036b4b0cfca49
f7695f7c3d11e6ce37190c0d135c37c13aa2523257f0f6351a03f9c5634fd745
b3e9f241e1bc63916451a6de5c09a01b9e9049a4be625ddff7362b7faa756751
dd773abe20042c2bb0c66627c1b345c54b27d04f535a6c2df037195c4fdbb487
9eba592bf987c7d3c8c68034398fbbcf7223404c96dd133049e5794daac9e2d5
8164850ced32acfc3bc797b6f976aa32ef9ef279b3ac0c9e37a907671c47e1b0
a39a9ffe14f2410d502015f6e2e7f668b0cdeb2a5c63423ef3be7026abf4092d
8858a4bac2b119a719e34856fcaba5bc0e9c4ca0ddbcf1f68db04b2423f69c1d
83948f1e17c2c742fd93b4e0d080251f7a7a58227b3c3022ebe5ad529d1351f7
e72d029148afd8fb414ed918d18c1b8d6fd8dc0278c4922e181fccf7781291d3
c6d54f9984a72366cb8b0f568f7117dd24bae3d245b611ded42512d1f55007c8
f637fa3f9a171e9017858645b8293e7b0ac7f8f7b15b18437cedd235c8e98383
656b0f1b10af3f2e930557956e9a790712d3cd74c87a41336276966028f06303
66d83e54ba2c5540135defd6f7f3b3191d8b139eb7b8dcc37f8b232c7de9e0d4
4d31ba8cf9ad87176ee0d7fe90d0ac437ab93b03ca997ff02d0e710c1a86b229
91479752788c738bb67d5ce3c97e9c86c5d99787cd7f47c8ab661546aca64c0c
2b9b0c606ab53811c859f4bce1f660a2eeba25aa8be78cafe812ed72a77547a1
8a0d907dd2edc60b0d86275b4ca41899a04eec4fc062bedd8e198ed6507f1664
058fe5bdf43175b6a9fc5299d77bb03256a8e90b05c9abe96ee7567305b7574d
df4c2fa4c1a62a468512b1df98da193c1873d9aac9edc7583b7ed879a47a0923
245b84b2a58500efb1decdf455861f1639e22f87653cfc1d8a4f3b78d0f88bc8
99cc93b61d7704aa4fe673d981695a91d497c24fd9a62597

Outputs.CS1 (48 octets):

ebb93f89f10b0f9add3a32ce7bb1d81eebc7a3d96202c369a6e514cbfd950c0b
491ee55a18a4e1ad347c583fed7bd75a

Outputs.Lineage1 (48 octets):

ff03fb226109210e2d156dd924601c23a96346113ee70a636fe13b055acd590f
37dbd1e407300a3b9d089fad8ca7f8fc

Outputs.RequestRID (8 octets):

cdef4ca087388249

Outputs.ResponseRID (8 octets):

ab01d43fc4ee3f92

Outputs.EphemeralDK (3168 octets):

bc95a4d7e356f92b8aff23481aa394b1b37487277b65681c019a434a5138875c
749d9504ad4175e56a4b45251c743387fef16d28655356fa88d080c36393c52e
e5bf26713b522b499489af72aabc99921050a6abd7e127de7593fcec2b57ac61
cc174bbb07b7bd10397c922d074cc8293a8f4c7b6dd6b3c30153828974038a93
7d698a35bb2150b25b383e135517e0228a56b9e9eb4d2f094b365683cae703e7
5c66e953450bdb1bdeda86f0f6104474983b46654030152422153de448bc000c
4e1979cf15b9097089e8680c5f7657d43b984bd5b5fa6a9dcb3b1819703d1e13
489ca2b29a94c31fe60ae7249648c627d86baffbca8e8d095542a67875190e3d
f2c795860ee0bb7b1bd15a4c5282ba780db4ba7eef82c76c3a6a9633a834acbb
07aba524722cd1e9ca5d691bff30a018165e1889b5f2b6bad1f8b3ff87a5c6b8
a4bec48c51149cd7a5b552420a42a549f3114f66a6b96dfa64d33cc7083a68ad
dc91901423242898251a74962a5baa960228f630d85c7bd219101a646556781d
f1768d872188b288659845b988f4a09d7380478486c5070de186c785aa0e4df5
31cb96365ce157d3119ddda1121903c0d113189760a07c411d6b85c6ea89b33d
e21c033aafe75382c55715faf787d859ac2ebc973db3cfee334e14753424a339
ccd10aa7f83a9bd1b90c11b57dc3978ae786470c6c4757cc32f081e5420edcb9
a4ae8787a5fb57293705c8d07b4f35191daa1a179a1a44a27af8556e4780ac9a
821eec28b2aec601c4c8bcc97227a9095cd5ca54eddc14bab9949c7b1351735e
c9a2aff25250e19c34429bb12b987e00e47c423b7dce14adb660ccbc482c23d6
aecf39b885571329fc87389ba5ad7b623018bad10837c0c97d557415ec8207d7
9097bd809f06413ca8bac3f9f09f4ca6b442c57f67583129c68cd449c3e33c9a
918a1ee1690b3be8acffe59a1f0a984770acc5b55bcdc7cf9a609f7f469b9c7a
46c8e61f14f2abb0caa1d965c16d88824bdc034ce8189d656a1c17c2b11887b1
026ac296c94455a4a3b0924ee490245baf73e237410b8093481eae345bd3f860
2438383d785535f83d5c9847071b3d4041316ff99a1cd6849597062ac495a530
aa7697381f6b03f2f1a0535998c26168e0d973dc323b98c1681619a3ac940f16
4343fcd1c9218a25c5e08710e06d4238a809595bb62447b8f829d0cc052d2889
a7f0779f6322f78c931975887448a8a4f1a3895a3e217b47a8094def315262d5
8cf84167598c87f87a0f15871c652998ebe2a9e69538992b7a07b9ca3111c66d
071737631c6d2913ba9bc8dc5314c4e371d3c22f5f472fb085b55b877149fc3e
a93b6851333c20f5ca9777561ea908ba011ba967362de63f447b5b44e44fd0da
0c131c97ebf1692a59a5f890b5d6462bb21041688084dfcba2f7912566600e72
bb2c12d7b572416c32c6ca491a51bcf6a48c72c294590f6bb426aa6c0de2f46a
17077c8684cbda8258801250c022396224538c38618a30b292cc4ee5e97f7e16
a8ae1382d4241e6bd919d04b8ea9d302a4081eac68a10c15116b961187ea597d
497c842152c3331a5e12a56b2712780b71bde7378da22207619909aa6d42d50e
0655011870839dac3e323c43ab423575563f2891412af27f1fb394fbf939a164
5fd0da9c21aa63696a206d1726a7bb6b6d25a64d349cdbc533285214d0f2ad97
daa6dd3a04d860179cf5b601ea7b10ac56b5702746917c9223b407d7433e3b9b
466a91c66964bd37001c20591c537529c5553ce4b8035978b8466517f61ed7c1
7c956369bce591872467a2d782bd7a76c01790b6f2cf6189a53c5888fd8256f0
35beb4635ce0b9306fb24f4927567c514de5c274052a4fe5096e9b1912680447
480461c0120f7aea763e317bbb1664b645b16c18689a71a06431348823398744
06912039c02ba1a4e468326a5a231097c4551655e03725247aa4b5c930da7959
132eb95145a8fa521c296506a65a53a1cda8f2b55720bdec6346991aa3dc8c94
757699bea8014e788a92a55b07156577ea498514380c8383c2f569a432365248
b653d3344f514a362932c2d20da7565280d17a5499157785a2224a2e42f62d13
9654240a45f67a2756134fbfe262caab950542198812b71a86862ce016bca68c
761a4f21385317432fe08b6934ba38aee70f5bd4274426b4f2b8c891fb9a0eb9
cb6b46c4d9aa3cbb083a60364594b29d3b6254abbc123da480e7a3257c6845d7
01cd0c20164d0483d23698f7ea7850d83d31652be789af8d65b4ab282a44157a
6508b132399052034e2719cb09a257b858b964c6522442599fc4959ff7757689
38e10399d4691536899928219ab59a4a06db3e0576089477586a7510a7597004
f13577028fe9bc65eb46aafb6368e1ea72e1180dc81b7858083f05e46a06bac0
04b76f119c1d433249f31cc158316693990171179c55a15f4e0cc75264328ec1
0d5d6a39bcd375c8913e82109f93335438e7848c28c3ee212c590c1c1e512909
8584d1646f99cacdbcc63743f7ce4bab9f9f979c4bf6bfa009af7ee558cdcc39
dbea52e46507d973905be2c6ebb87b21794db7c24f4ed47d2ff653ac708bf6b8
134831329065aaa87b782248a4e5491c5dd934d9a866143a5d2b0a94d3657cec
e8869b0a73088b8e242181218806b3a6b25c039eaee17611c88e1d696bda5747
35aa6621637e46108a94f077053653610811f5f403b2689a3088c2bb24354014
baa3dc625313715a051e262811d29964ee2c8df6a481a9a16f62b3bd4ecc9266
fa388119601afc0ff863cd2ff1a103c077c6385245a20b86d6658e13650f68aa
bfeb693886cdfbe47262cb33d96ab3ad6a4e580501e74a8ea6fb3f807223f2da
5a83443289903ea1825fb47bc98b502d050b7f1037684ce7a2ade624298c2a96
080483787ae8a6be49f1beee8b34173ac15a54cab416b1faa870f0f407efb471
5c8c6f71ac080063299c47c130e64d1e02339a9426582c1c0ee363b95b42f6d4
ccdfcb308101c3a14631ee2574d66b15c09528e8c5c5eaa0766a7a10e40380df
9c4eed293597b02139ea981c5a2d33db0c788ba532353933209517158d00281b
009a947cc03a7ae867bfea99bf706c423818d68a8db63abdcd26be62486bbf23
0dbc1456e1666d7b0254f72aaf09f09cfc686e3ff850e2dcaf42b26445d17d4d
55af80e630d51097c9d27f3a5a3f81d50bc46b1de23073fde890a85ac5050a1b
b701020eeac7ae4909446a89b7d91f19eb86d9423425bc6c1713841d8323fe2b
1428720a3d066dfddb008b584f704625905317a761720ecc4ec28607dea61531
19af49b4b133e018f9467846ec01436108676c24a2213f0555ca4dd769fbf647
04d32d50570d12d4abf496523f2b7f1a18b82080027c7c6adebc0868e3a6321a
6c6c369d2ac55d7e867367c76d9438b3f1c42260a268ac0282b277323c64031f
f87855474b47803215370b6e354871892ff85c9c01aa1484f9027204a439d1c6
a0348f854955bd909609c793ce41ccfe0579bdc4bf11d17eec4288371b4534e1
2734346fb8ab4561d550dee81b5f7b6dd6a93465612b68b59cb82b2d2aea2569
219afae57999a0365266a7a1679deb6b161ad96a76872dcca390264b6674b631
595a86b0070bb4bb82005870e9f53fa8327cb7bba6da019cf5d6a757c74da5a2
6be430655a481010178389290f7f48bc76da8582d14911b32d716b8baa789f13
606612517e9fa1a0201885a21108d05ba50adb5057f6265d8925fa95a4a93aaa
82c06d42f199cea14f71c5a18bc6cd8cd3158922206fe855a9b05794cb9bb83a
a84e975799298ee1b85f9a4070317439c48202325907947b100d154a38a6b8dd
f392662bafd2ec061b6191d4ab01c32c0b8b3abf0fc919d58699b0006c7b9722
23bb5185a88d8fa37696f028c7f1214fd131276b950f295cf4ea7c881c81c0da
8271b53e2d3059a853590bfb13eee422d60c58a1f557a990c80b70b68736055d
b9237dca2ae5f4974ef764fa1c419ad24d63cb2e96e1ad649070e6363ce48773
17558ab631453b3c358d7860e39a49e2d011d4f00a5bc7561c27c1c881ba1993
62e61c840e6ac1ba460b87305c5a0ac4b9d447950578abf5c9cd39c20bb0ca74
2b0a88968651300f12bb5965fab8b1740785db5e6f84054885b2658c7faa6306
ae03b465327f5196a3b9d2040c34881aa60ad0f45be7198bebe6b2d0415f1b48
075feabe381c0cb07a7e276a0147c988044645b10a826745567c37a65e257bf7
c80abfc8330832094e8227fbd68933f4a1c3428ccf271f5ee62d3b982538722a
3ba81253bae0caf30084efd7e03913eb4852056af5184bdf0953e0d84a640a74
835024e194edd9a9f1c89e40d7a53538fe6b9e179bcc123d326f207e71480afb
10e43cb2ef4662aceef9304835d744e43af04165e3d13cd1f7b9adead9e072bc

Outputs.SSPeer (32 octets):

66aad258253cdd944d889c96c3d30d80e58012ca42f4b795685bd9c33f15c65c

D.6. CONTINUE_0RTT Exchange

From cs(0) of D.4 with the prekey generated from PrekeySeed, version 1.

Inputs.CSPrev (48 octets):

d9d122caed3d61e03a7333c90f462c10a422de1ef3bf942998e49fefc44e9c74
eaa5ca77668e3e428ca1c6e25ad5dbf0

Inputs.PrekeySeed (64 octets):

6600000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000

Inputs.NEKVersion: 1

Inputs.RandSeed (8 octets):

0000000000000006

Outputs.NEK (1568 octets):

44f9b37d349bb2a61c10c20524e412381c545757c632125fdd529419cb331b8c
9991341f2a29c8c6825356744bfc33a31f37a154da86615251ca72875085ade6
bac033c45a2c32a023c22c9cfa1170eb401d199497466b40dc7ca9e633d336cb
3eac232b76509906065d467aee086685f64a72e63c6890b40f9941d143b03cb2
2cb3473775122e3cf25245baa631435bb013ce51682226203be0954407211733
76ca40d2152a7898595398b7559d0f1104906a3f83d81f58094b39da5b031901
fb1aa60dd54ae4516811fb6b8de9bb6d0bbf581951ac8ba5022590fe8355f829
29395202776882df59966236c83e45a58b3bc51aba07bc2617107bb1565bad98
00ada1871d7959b0033a3af8db150d9c9ffb2567f8186065a4910ff475b81090
1a4b6db0477e8f8a82e32867e0d700dbd88a185296a3ab88db812b5328bc8266
2dcfa7944dcb2416f19cf91b7fa3d42b92428e02343af339243fd93ebb59479a
37892c486c28492ebe1cc14466676474010fb9c5953bb8f97928942a04422445
35477edcd51d0416862d89390c505cd0c49daa7c041a976331d56545d5b0abc9
50cea4b7317723869c4d2279b2e9ab2dacbb2d9692027846a5a8a579d4098609
0471d9e07c21237fb3081fbe2c5709b6023f254a29069ca31444d145acb45778
e2e014be73023c2a4eaf6393f4ebb2bba3c6d414619f95c04e53c6b4fc0d7323
5745e67a2538a95e18caa11357d840424e99ce98510382e353f4645124c59ee5
6c868b9625fe073f1dd81b6f32a797c0a2f975a57363bcdb779b5a28911b8338
890a6cb8e7a0b826a7443c85b976cd87a954747153eeb4052f532fadf601f560
22a42611f223b115c88c8ae8b0a36890cffc0c57943d9a57189d8b40e917aa9b
bb2b42d39adb86c216392208db7cbe7a8b0f954bfe816cf4dcace90883253973
fa7bcdd7376635f39aa03087cee241ddb1cd6ae82f56421274582eae52bb7493
91bac8238db046fb5358be89c7325bbb5416b212909363b706a2b5786d519abf
31701a54047c6ac227e9c53997318719c63f557e275a5f56985392a09c15699c
eba6aacf561f5e5b779d5442aef85fd978560c01bb40f50c2e06733b8a740110
58e5fc3c4a336177d1744e74a1ecfb1a4a900e965484c02a1cd7e23265e7009f
d38353b1a8137b7568a4c3a81760e37a0dfa21bd6c99523e1664a13785b761c6
6154381824476b36b32b549c9697a365260c285604c1b81c3a0350ec03b4ae22
74597b30b7ca9593a6850d2c31fd9232b6da388a646ee86164c7da6197c8676f
079733b6a9c9688151773f55927f8debce635524e7d515fff6b70fabc7dd715c
f7c9b667453185ecaa4cf17959487b256aa512a83ce7459f54b96e58fbb527a7
57ebfa6c8f302952455f4dd36d7cc74541bb35bc744bf87a3b5087091b82b91e
b52c6f7413822585cd3a28b4cb32360a0c8e2664a1b82ed6d646a31c37b2f10a
8d49893f7127308c27fc495d10d8b7446241ec802abeb1331cc8034bf1c3a4c4
314c071fa5fcb9124787703552570bb2e201a3591576e7d5b6eb6497968836cb
acc5918b636d1a4add878438268bf13cb6850b6e6862c398e825e1e1aa1fe239
e99aa37491bfad265c64c81033d9890c2165d3b14752250ebc39c380cba76325
bfd8e0bbaa7aa9fc49117e7b3b3875a1c4530b1c3c49c71a4b97688aa8b741c4
44af5f0a3394053a1c2478f076cee7149a79982bae2ca708a230e9e46a84b779
e1602660279adbba4583205ff645730d461660a4a93bacad6ef35baee570329b
20bb9a24b70cbc717240df836587bb36dc827ab5769c84313a09ca98e55baa06
7c0dae4100b92cccba64abdedb505947555d465712abb13ce784ab8c48570699
f9ba69fe872814510b5f9b148459a8b492abcb7264c6e108ac8014f885499117
1985755fee50568ef502217cb3be2b23d7b8c361bbbce4a19340c277cd2b2976
286e2f790e6120cc30dc627c71c2a3154a516483c2032086d26a04a53a6e8755
c2189bb89c6fbbf04c89682f078acaab15ae6fb3837edb6c3fa020857790e8f6
53e52aab66604aa1571b9594be0954b904933985954609515800d4b7df175c88
66cce851824b3533f19b57072aa7a38a00f95347cca538f702a7d9136cb4fa20
bc6ba48ffd18dd5b115f1f748d3ea3a3d72c348f0ba44085e912aa56597bb97d

Outputs.Request (1632 octets):

066002000001158fe87f5cf3dff06e50dbd3e81b2242314ba86c2b962f6c0b9e
0e91a04496c0000000000001ee6c52dadb064adafa5a804db37d3b998e88b3a2
2fc78c06039af4d8fa9355a51e351478c49e036e56790c9f0ec76186f5b75692
c755403a19e19a17e04a5638c19fcb4ab2489a1058efa58fc76b1a68fd8af92b
630ad01a38abe1534e503af970c8b923482b9a8a8b68f18f1932b2408da8fc9e
a1ad56ca4025e43ff02c077dab82705a66e048ce18853b15b23ab3c29c7b5165
e5593d7d8619b5940b45aefef43a0d5b562ada02355e008c2dd32455d233e09c
2dc7ebde18c081c5abe3193e714018de9fb86761eb429c35f057c801cf828a9c
b3c7fffc60512788822667557d54489062ebcfc5f067ad45e61f1cb2a505168c
80165ef8a43543556ba80e886f5558c3099bd148c93b7ac5a258b25268e5e99f
327530c5279acbf2373bb1113dad78929f19160e3bf3438ebeda56e6155898bf
5f0afc7f1e09fb74ac7fb20cec54ba8bd7d75daa08e630c47339c49f33b446ba
3803ede65f27697f4d75b13a52a14f3df91f806587431b350ec8a57a923d6996
1c2c2c58fb2c5910090069e6ee49a0245a2b270e4c928b8c7307e23226b5bd50
f695c49a198eb2e18caf73e237967d4f443811aeb63ef182d86b7f9607c0c6f4
1fead4f841603a96fbca859d2c61aafb8ece82a14765302988c2d8d5e5ab1dd2
2d307a7018daaf21ce3ca0011d58b6921751d0a26b74011c365140fd70715017
fbfd627b3a7e658163ec991103da90a1ec9de0f30d825ba4f2b5a8b6253c8b51
1844dc87894ec10a97f5342f4e6d0787f2fb11d251db66e2ced852fb6f9e6e04
2e3e03a1d34c7a73b683a0513c1dc3e4f72bb9fc05194e55a80b1f9e07d6ccc5
1508c1935a1570de20dd2177fd45950f24edaa287e9fa6836ce74c9c7dfd6669
eb1c261544504cc1d5704c05e9082b4a080feaae50a30530c46cac2334da9b3d
3e8f5d5c79ee228cf6f09105b176422ca97d84c74a0606b7d59e95e02ebbe8d1
952579589b40edc0963fd16128ada08e5d3c3117971580395eb245b28fb4736a
893dec4c6d933c2098c83fd6789953d98545ca86d0b0567bf83b544b28a21c53
567b08773d5309192dc79ddd869b2552036fccdac777aba55e4218b043a2eae6
b6665bfc430034ff0d29fee1242f5888a185c9f1def90b5248cf99ee58d1ee27
0610f79f052804db8d326d086b094f337e19a960f19dcf45f106e6aa436cc5f6
94992e74ee0209317a7a7414577553423a6196056e8a96e27db9961841e0c960
0e52ac6d55a337d652d18228b389922c4e4a55e059610d0d3e8d85f9962fd71c
218094f559829b3b80981bbeb6ea7b41f8142546ecb61e84e7d694f1f965d67c
326b9e486925a9da7134203abfbb99e0b90775dfeda824752c8958d0c2e73b8d
8a464566b7ffaad68d1224a1c57c25f9c13a5e657e9fc71157020eec5428c70b
55a9ebbc187b3312a1a56c28d3cfa90241d99e6a62904dd45e4fb50f10c5412f
bce1d53331a55513f52f65504c6ea01b4414d6c84d75e397b3ae268ad48c8b41
76323501539ab3ad7209dc49a211a180c673c2df2d9183a8e201276bbaec5400
0dd595eaeb613500988b3897db5e9645e00193d6cf20a06b22615a1e04d55457
c0fbaa56c2c4da4c25ae34f8a1e2ffdaf1ea3a2b34f2b20c259da4f9bdfd19bb
5e87a4b965d728192d2a9577cc211305ff78c1ec67f28a53d27926fa24810bbd
4bc5b02affd960a5b80b1f04e461c050c2601da8046a9ade55a7dfc18e20e9a8
1fd4ecd640412ca4735e20d366f079a2ff331b535652a595251f2748fc62fc25
341b1551786daa96662d5587fd039cce44fbb0b278168e31e2bface70562862c
056fcd382a07eadb9a4c509a174cd0a429798f8b92b9d6dcc63b05d2b42d8dac
855ba37f0282484e61962738b4a9da8f9e78b75e154ddf6299a229020ce7c1cc
90be81fe747a5a7904bca050f06237351676d4f1ddad0945d31391675da5c335
07fcfcb77950737826c41b7f8c69de30ce910cd7fa791d5c2793961f78cf3be8
08cf06d68f439cfe43dfb7aca53a4eaed3c927f813214a585d5d77fcdea94af1
4645fe8e1908c797db279f8bef06e7e4870b5852442251c06ef1e842e44eea10
2bca75c3745f447e9ca8610d1c4aea70f8bbf7ea629facbe0aaf7e9024c218d9
0408d0381f4f5852cc4411f8bf8ab95fa1491d79dfef36b32436ec2fef5337bc
4b8fe4f313d8abd4b4d3de14a0435336eeff0510de642eb354bea83120defb8a

Outputs.Response (56 octets):

00380200000148b8e4079cfd997bb422e5519c178597f7c38b620fffb02d766d
4fe1fbc3f3ab6ad5c694d78ec44b994319391b43bf8daac1

Outputs.CS1 (48 octets):

b19c9001d9ec2915e82bbeeb805170e3ca91c5eb4439fed733d9eae34f63ad5e
e56773b8014db40d929e3890b6cb80b3

Outputs.Lineage1 (48 octets):

32065b60171628fa508f4a075a0998eb9cc32746109932efd86c70063139bbb0
e445aa16e54de93ed220183126857d2b

Outputs.FirstDataRID (8 octets):

cdef3d4d91d82511

Outputs.RequestRID (8 octets):

cdef4ca087388249

Outputs.ResponseRID (8 octets):

ab3cd1073166107a

D.7. Fragmentation and Parity

The D.4 request as fragments of 1,183 and 512 octets; the last fragment of each list is the parity fragment.

Message (3269 octets):

0cc500010000e2807d9c1dce26af00ca81d4fe11c23e8eb6752e1f9ad716c61f
c24f2d80c041000000c95760d41810e7058dfab0c20703432653a0b716a9d7fb
970d755d6d9654bec89f8809377cd2505cf67771fc469309b86d503f7aea94b5
0395357bba9861070c95adf950a73645b3c5547616d50101272d90e4926531be
e76a3c8266325286a3aed64e3f23c8250b0a81ccbe42e0b3ce69331a2cb833f9
939bf6c0cf5b0a382c179f577b688cba1dd966c1b0c0f9240ffb48358f09cafd
6ab20c4205eab64bd91311b431bc5d1cab83730e8da3822d5c88fb2796ee08b6
bd8ca16c01cb9ebcb6de22935396457d6c291d8722b67c023fa2bd66f7147f3b
5b9b2b8a1c6507222b32fc95bd20454e8b696fcafb1b7ddc1f0b08b5a3871ed0
605e419ba32f734dcbb29b69c58581160b24453d96981eb2a957f1a2908e4a08
4cb0360e6aaf9194a649d52a5bc2c0038c9ec0488c02a02f7dd46002b657167b
435cfa8577eba3fe127cdf515489875f72754ae0698320f10694479cb2d1bc34
5674ac2739c6055c558b84ecd33fdaac2b49449f04893d11d7394865609eeccd
6fc57f43a31e1682a53a98bd8916bc68c9950702236fc7b879a971e066a89f1c
3cf41c3aec29431a686eed216d3730c5bbd03738a49aeb962541661c8e806b20
773f44da40b7c857cc7ab50b007bf102ad54c181bee552fd8b1948f05a1a4a7f
c7c1c9a19a62447c570633ab8f92aa12e723fa79752b7bc770926c1ba8b7f4b6
8336213960a13c22d891bf12cb92d541f3a30e3e69b197101dfaf83cd7b13953
f1971374279fd76f9e845c7441328cf18e914230333387ab50a048e27dcb48c5
a8d87f2430905979094f2357bfcc9d2ed69f30a9087b82c2d7e223ae392077fa
aaa8f78f33f8073c41081e27851b8a8876029695bc261be3a214a5cd98a7409f
eab2c3739015d2800a3c8f96a75e7a11a1a9322725a9aea399529dc77d953232
3716b2413c83158598cc8688ef142f14c57440da51462c5f7791c030e24d1dbb
0836a426a86607a6aab8c484935c8322d993cc7055366aeb4cdfb13ab53688a0
f535ea0125cb78c8c5e037f818712aca0d2ff6480fb96e2baca8a288775e5b26
7d6b3dbd2164b045817c4b4f432473a87b973d551f36187100ec3b24e7872d86
99779398f6852650977499738af0f1bb64c95e7e6a98597a8a451894d6f66ede
b2282c55bd29bb94f7eb9b93bb06f5f1a6a5069effd36550926bc350c752aca6
79e6a96b144d39694eada052bb985fde9c9ddabcb77b6b89142603d9b8ce86b1
845672aa1ab5c510bac615099432c99ad23b5c4a548afcc4c98177abe0a0b82f
364d35b96f5633bcd3a0489b28b6ff5cbfd4356b4a904e1cb59bae046ac61287
3b8a83080788f0eb4de169ab19187312267e17c4a008000d638054a759115212
ca9482c555a05fde9868fbc93274956d535aa3cb9b4ebdf192b998c189683be7
b60d1d4075d848574d581522f993661221d26802e1360295216700944f5c55bd
fb54238df94c8d99c174534dfe1306f70992413566304a05c84a86ec9464390b
1bd3b459fdb06fffe09e1dd6175bd5bba96299d0237846a86e9b606db512b96a
22543e3420a91019b890129a198b45d9097e32588e538b68162e5f3212ed2a43
f97c68b54840f8bc573622911fc57b2a189d0241af5d8150dcf73e6f68cf5f09
cb635472a942627c553db40778db340f6a24166ba8c05907885fdab498167e18
952f529aaf0d183f168aa10322cad4656831c9be0d700544f99ce3b8c345c51b
e46c56952884a7371e97b24eec1ba918f93a931b360c05010508462fd9987621
ba4082b35cf082cc372d82e545ff9a55a9db0c712c6f82312e7f6b3cbbb5c446
f3778b069d55d4a23b674307a3c66cd9964740a2518c9f2d4cb6fbf68bc593be
b40574a101774e565ec3e9058e4674501cb865a94e0d6c3991f5875afa39b3a6
299f6c5e0bac23cb037416184e9a41725d12cf8ec282590c434e3b300ce34d8b
1224f3e57357e01031771c434aab9a624b314bb9acc345a78a1c3f707ffcc885
191833a7ebc3a9973a7e03b5d6c062a192824d7576343253d232cb34a321486c
43e3676f1a86af15f208292548a7e1513f630467589bef51533de564a0e9a57b
5b85ebd5895d5a38e662422ceab070827c9d28674c44243bf265032957c3d561
5fe02e385ca55499b109780197b0b4803dfa13289889b77837574e34d0e7d797
5f6e66b12c035fe999718feeeb928fdcdf0ed7e0f20a640a9cef52d36a707223
54d0183ed6b3e29d259b227b9cf38fb6f603d42cce8801d0d60bb67f176af11e
b0c9ebfc12a479d08769b9825bac2ff709366ed71c8a83c59ed6566652cb35ef
052adb01007d773eaa98bdbaa1d695a1bbc190b2d5b05cc541a38da255520f2e
cb6a9b77822bdfc2b80a52aaba6c0f3ec38b26c47be41801de9e09e691aa256c
e8e7fb0396300f949c55c91be09b03a5ac431a230f0c950d3f5b4e01922e6140
c0d672c92b052499a3e283fcdac3e9aedb53e8251ef93f72c1dfb09adfaf9827
a75b7d2bd8a29e9f499c76002b903987195f2f69c3ce945d3e1d574099fc6a84
c555e244896ed6fd455f9d8c041f781a22390430c80ec661e60cfd4a6d3330c0
28c4a0ccda47ced566f0255294e659b732cd5eabcafa3fd04e730f2ddc12116e
aed501195f3dcc97ada5d3d0fa32aeac41f4256873f3923216b7fa00ef94a0eb
24b357dacecd09e9fbf7c33bbde8a83b531f50dd43a02cd7831e7f11a0d6bf05
895cb2737df1343fc61f6354cc23d837e7c4b7e0b5af3164785dec26b31ec69f
14617d76eb7bf4f77325692b52149bb2a87db6a6d2b97aa927395a1283900a42
41354c980e089dbe9f50066b17bbfd39415693d621d4d3ef8ee85c2d5b19b1e1
7bc404da6d57025d9958a268abaa1adcf197b7e1519b23055c676efaddac9bc1
fdb7f67d8f12ca72781db9fbdd918ff22288b93ac2584d4103a564cc957e92ea
bbf0342ad89e15c9b4fa7647f5517398f25f4fd4cf762c12405e2510bc508883
e4294cd045e1bb40318f16ca660b4f9d4cd087fec1f7edcfe598bbc3bceb0cef
dc65f0aa8373305af77b6c6746272022df06daba91449b7e3a46f646c74fe7d5
5803bfc065de3007b857431d2e3b059976eda9c5b1bfbd9ac5ba6501026ed7db
6508c08773ac0cb85be1e21bb88dbdd05f423352237a4d4c372cf3fa96219dab
fc0a068036d73de49d1ebec5b8586c57084a66e25bde34f65a6101f88e265b4a
73a1d9b78ea152cc64123bccf05e3d01eb07a9fb0706392592959901a021bc54
70d68fbac24a71db2c0f5facb94955ec38b7531219923cae7c2382ed3dd89690
8762fa8207c270f3a515b528f3ea2419cb4a325df289ac58dc98cb4db5803601
ceff975fe614000ade64738feeb51894a9e38f72a03e4ca7773e59d0fb567d74
fabafd8bb661f9934a55c08846e9317a5b3cc7d70200a691538d6b1d016c0f2e
64199dea83475152ce500c283485790e944ab103cea373988337f7986c22e46d
3b2b29a9497b67c386e7c28b2d30e8d31ebcba559fc42fedecb9277da498f46b
d67d33a8ea6162caa88d48bcdd7cacc2b15c9d1501479f230f283736bfba5ae0
6c7ac96447ae127ff6f6de093b9d3cb7ebfd671852f2779e098c2f55011531f8
b6b530ee231bbc7b6740a0868ec8732027f75efead0f7690250e930e9a6ece8b
5a191626da3267a23300ace60c8f10bec7a2317dccae9186a1caa3bc9ea77b22
b92c56d5d2282a5464752e93ef17890436dfbd1a173dd62cfa985743dcbc63b9
87ca1917d12bb0223a4908566077c5e8b0eaf18655b0b43a04582b823b5bbfea
ba3fe3ca76e861826ad2658997d65709113bcf676c5a3d691f470b00ca7e4579
5d5a973974517ea45fc4bca296967d76e9bebeb786cf3229df80b2a7da9290d7
7e2123942fe65dfcdc497b3febdf82b374a59eb26ab04d3012f6d51f49fb740d
6b5d8d3a37de99044d39b09c2acd08e990aaf3a5f566871366ee5e281007f0dd
72f4bdcaf30c4bca5172260a4b8635c05186adb915b83ee1848d9e6d4f46f934
35d1006bd7fd8f9ebe7519fd0c1bcd188f244845dfd85e1c7c3539445bcb9685
9030bf8df47ccb66e80a5f4b408f3f5c4e12669a432b083da26e9d204cf4d70c
7da4b7b9296a139dbb965c2164b2528709096a5e6012c57dbbcf079a17163507
43ca567fccd7d6edf857947d10e97c5d7a6d46be4e046adee218a6beeaa1f0b2
694475a52565dab5f4ce49dd856dadc4c0eeb597634fa49e04b543c91a947469
71469cafa0f76d0c6b4fcf0014c68d0ed6362e7c6caccd43cd73f98c71d8a22b
7fa5b64e728e7747cdf812ad2f5dbb78a4742bd0955f9509678a2a8b93eff154
cfc781df05a004110892a829bfb3e78d84916c8e79a141a42e53965329388959
91eb028dcd99ac2b6c87e56233cd94aeee4fca0b2e9fd384e7967907dd319cdb
11199111120367af37afbc401ab2d7fc3192e007ee953c5c0b48512c55a7b1c1
9bf17bb12164943c252a9021934e35ed4bbc23101db956292cab5c90bf25075a
b92ffa1021

Frag1183 0 (1183 octets):

0cc500010000e2807d9c1dce26af00ca81d4fe11c23e8eb6752e1f9ad716c61f
c24f2d80c041000000c95760d41810e7058dfab0c20703432653a0b716a9d7fb
970d755d6d9654bec89f8809377cd2505cf67771fc469309b86d503f7aea94b5
0395357bba9861070c95adf950a73645b3c5547616d50101272d90e4926531be
e76a3c8266325286a3aed64e3f23c8250b0a81ccbe42e0b3ce69331a2cb833f9
939bf6c0cf5b0a382c179f577b688cba1dd966c1b0c0f9240ffb48358f09cafd
6ab20c4205eab64bd91311b431bc5d1cab83730e8da3822d5c88fb2796ee08b6
bd8ca16c01cb9ebcb6de22935396457d6c291d8722b67c023fa2bd66f7147f3b
5b9b2b8a1c6507222b32fc95bd20454e8b696fcafb1b7ddc1f0b08b5a3871ed0
605e419ba32f734dcbb29b69c58581160b24453d96981eb2a957f1a2908e4a08
4cb0360e6aaf9194a649d52a5bc2c0038c9ec0488c02a02f7dd46002b657167b
435cfa8577eba3fe127cdf515489875f72754ae0698320f10694479cb2d1bc34
5674ac2739c6055c558b84ecd33fdaac2b49449f04893d11d7394865609eeccd
6fc57f43a31e1682a53a98bd8916bc68c9950702236fc7b879a971e066a89f1c
3cf41c3aec29431a686eed216d3730c5bbd03738a49aeb962541661c8e806b20
773f44da40b7c857cc7ab50b007bf102ad54c181bee552fd8b1948f05a1a4a7f
c7c1c9a19a62447c570633ab8f92aa12e723fa79752b7bc770926c1ba8b7f4b6
8336213960a13c22d891bf12cb92d541f3a30e3e69b197101dfaf83cd7b13953
f1971374279fd76f9e845c7441328cf18e914230333387ab50a048e27dcb48c5
a8d87f2430905979094f2357bfcc9d2ed69f30a9087b82c2d7e223ae392077fa
aaa8f78f33f8073c41081e27851b8a8876029695bc261be3a214a5cd98a7409f
eab2c3739015d2800a3c8f96a75e7a11a1a9322725a9aea399529dc77d953232
3716b2413c83158598cc8688ef142f14c57440da51462c5f7791c030e24d1dbb
0836a426a86607a6aab8c484935c8322d993cc7055366aeb4cdfb13ab53688a0
f535ea0125cb78c8c5e037f818712aca0d2ff6480fb96e2baca8a288775e5b26
7d6b3dbd2164b045817c4b4f432473a87b973d551f36187100ec3b24e7872d86
99779398f6852650977499738af0f1bb64c95e7e6a98597a8a451894d6f66ede
b2282c55bd29bb94f7eb9b93bb06f5f1a6a5069effd36550926bc350c752aca6
79e6a96b144d39694eada052bb985fde9c9ddabcb77b6b89142603d9b8ce86b1
845672aa1ab5c510bac615099432c99ad23b5c4a548afcc4c98177abe0a0b82f
364d35b96f5633bcd3a0489b28b6ff5cbfd4356b4a904e1cb59bae046ac61287
3b8a83080788f0eb4de169ab19187312267e17c4a008000d638054a759115212
ca9482c555a05fde9868fbc93274956d535aa3cb9b4ebdf192b998c189683be7
b60d1d4075d848574d581522f993661221d26802e1360295216700944f5c55bd
fb54238df94c8d99c174534dfe1306f70992413566304a05c84a86ec9464390b
1bd3b459fdb06fffe09e1dd6175bd5bba96299d0237846a86e9b606db512b96a
22543e3420a91019b890129a198b45d9097e32588e538b68162e5f3212ed2a

Frag1183 1 (1183 octets):

43f97c68b54840f8bc573622911fc57b2a189d0241af5d8150dcf73e6f68cf5f
09cb635472a942627c553db40778db340f6a24166ba8c05907885fdab498167e
18952f529aaf0d183f168aa10322cad4656831c9be0d700544f99ce3b8c345c5
1be46c56952884a7371e97b24eec1ba918f93a931b360c05010508462fd99876
21ba4082b35cf082cc372d82e545ff9a55a9db0c712c6f82312e7f6b3cbbb5c4
46f3778b069d55d4a23b674307a3c66cd9964740a2518c9f2d4cb6fbf68bc593
beb40574a101774e565ec3e9058e4674501cb865a94e0d6c3991f5875afa39b3
a6299f6c5e0bac23cb037416184e9a41725d12cf8ec282590c434e3b300ce34d
8b1224f3e57357e01031771c434aab9a624b314bb9acc345a78a1c3f707ffcc8
85191833a7ebc3a9973a7e03b5d6c062a192824d7576343253d232cb34a32148
6c43e3676f1a86af15f208292548a7e1513f630467589bef51533de564a0e9a5
7b5b85ebd5895d5a38e662422ceab070827c9d28674c44243bf265032957c3d5
615fe02e385ca55499b109780197b0b4803dfa13289889b77837574e34d0e7d7
975f6e66b12c035fe999718feeeb928fdcdf0ed7e0f20a640a9cef52d36a7072
2354d0183ed6b3e29d259b227b9cf38fb6f603d42cce8801d0d60bb67f176af1
1eb0c9ebfc12a479d08769b9825bac2ff709366ed71c8a83c59ed6566652cb35
ef052adb01007d773eaa98bdbaa1d695a1bbc190b2d5b05cc541a38da255520f
2ecb6a9b77822bdfc2b80a52aaba6c0f3ec38b26c47be41801de9e09e691aa25
6ce8e7fb0396300f949c55c91be09b03a5ac431a230f0c950d3f5b4e01922e61
40c0d672c92b052499a3e283fcdac3e9aedb53e8251ef93f72c1dfb09adfaf98
27a75b7d2bd8a29e9f499c76002b903987195f2f69c3ce945d3e1d574099fc6a
84c555e244896ed6fd455f9d8c041f781a22390430c80ec661e60cfd4a6d3330
c028c4a0ccda47ced566f0255294e659b732cd5eabcafa3fd04e730f2ddc1211
6eaed501195f3dcc97ada5d3d0fa32aeac41f4256873f3923216b7fa00ef94a0
eb24b357dacecd09e9fbf7c33bbde8a83b531f50dd43a02cd7831e7f11a0d6bf
05895cb2737df1343fc61f6354cc23d837e7c4b7e0b5af3164785dec26b31ec6
9f14617d76eb7bf4f77325692b52149bb2a87db6a6d2b97aa927395a1283900a
4241354c980e089dbe9f50066b17bbfd39415693d621d4d3ef8ee85c2d5b19b1
e17bc404da6d57025d9958a268abaa1adcf197b7e1519b23055c676efaddac9b
c1fdb7f67d8f12ca72781db9fbdd918ff22288b93ac2584d4103a564cc957e92
eabbf0342ad89e15c9b4fa7647f5517398f25f4fd4cf762c12405e2510bc5088
83e4294cd045e1bb40318f16ca660b4f9d4cd087fec1f7edcfe598bbc3bceb0c
efdc65f0aa8373305af77b6c6746272022df06daba91449b7e3a46f646c74fe7
d55803bfc065de3007b857431d2e3b059976eda9c5b1bfbd9ac5ba6501026ed7
db6508c08773ac0cb85be1e21bb88dbdd05f423352237a4d4c372cf3fa96219d
abfc0a068036d73de49d1ebec5b8586c57084a66e25bde34f65a6101f88e265b
4a73a1d9b78ea152cc64123bccf05e3d01eb07a9fb0706392592959901a021

Frag1183 2 (903 octets):

bc5470d68fbac24a71db2c0f5facb94955ec38b7531219923cae7c2382ed3dd8
96908762fa8207c270f3a515b528f3ea2419cb4a325df289ac58dc98cb4db580
3601ceff975fe614000ade64738feeb51894a9e38f72a03e4ca7773e59d0fb56
7d74fabafd8bb661f9934a55c08846e9317a5b3cc7d70200a691538d6b1d016c
0f2e64199dea83475152ce500c283485790e944ab103cea373988337f7986c22
e46d3b2b29a9497b67c386e7c28b2d30e8d31ebcba559fc42fedecb9277da498
f46bd67d33a8ea6162caa88d48bcdd7cacc2b15c9d1501479f230f283736bfba
5ae06c7ac96447ae127ff6f6de093b9d3cb7ebfd671852f2779e098c2f550115
31f8b6b530ee231bbc7b6740a0868ec8732027f75efead0f7690250e930e9a6e
ce8b5a191626da3267a23300ace60c8f10bec7a2317dccae9186a1caa3bc9ea7
7b22b92c56d5d2282a5464752e93ef17890436dfbd1a173dd62cfa985743dcbc
63b987ca1917d12bb0223a4908566077c5e8b0eaf18655b0b43a04582b823b5b
bfeaba3fe3ca76e861826ad2658997d65709113bcf676c5a3d691f470b00ca7e
45795d5a973974517ea45fc4bca296967d76e9bebeb786cf3229df80b2a7da92
90d77e2123942fe65dfcdc497b3febdf82b374a59eb26ab04d3012f6d51f49fb
740d6b5d8d3a37de99044d39b09c2acd08e990aaf3a5f566871366ee5e281007
f0dd72f4bdcaf30c4bca5172260a4b8635c05186adb915b83ee1848d9e6d4f46
f93435d1006bd7fd8f9ebe7519fd0c1bcd188f244845dfd85e1c7c3539445bcb
96859030bf8df47ccb66e80a5f4b408f3f5c4e12669a432b083da26e9d204cf4
d70c7da4b7b9296a139dbb965c2164b2528709096a5e6012c57dbbcf079a1716
350743ca567fccd7d6edf857947d10e97c5d7a6d46be4e046adee218a6beeaa1
f0b2694475a52565dab5f4ce49dd856dadc4c0eeb597634fa49e04b543c91a94
746971469cafa0f76d0c6b4fcf0014c68d0ed6362e7c6caccd43cd73f98c71d8
a22b7fa5b64e728e7747cdf812ad2f5dbb78a4742bd0955f9509678a2a8b93ef
f154cfc781df05a004110892a829bfb3e78d84916c8e79a141a42e5396532938
895991eb028dcd99ac2b6c87e56233cd94aeee4fca0b2e9fd384e7967907dd31
9cdb11199111120367af37afbc401ab2d7fc3192e007ee953c5c0b48512c55a7
b1c19bf17bb12164943c252a9021934e35ed4bbc23101db956292cab5c90bf25
075ab92ffa1021

Frag1183 3 (1183 octets):

f3680cbf3af26032b01007e3e81c7cf8fe205ba4d083caa5195c94873a933498
5d14c9b6486a45a00c6fcfc1664838392efe15ec9bf231938d8323f5697c7405
b99994f06066bfb2f783dccc47d1f631210aef5bcd394332b033bbe29bf92a26
6505a397d23b53c1c218701edec36b059a4635d9ca340f0480b9cb2fd6a1a8a4
c9fe1819488421433ecb359cd64e033a27adce8a7e6d41928cdfcf46e79bea1f
3105ba60e06f1697e9ef7ef3be4067e62c9c3f3da8c4ea7f0d5a12775effabf6
206ddf4b97432b64ed877ad07c8ec614575d7a37b9f88e06fa3a0188fb228ebf
4145527a96a475316fa2a07395d1e4a122c3e4b5cb6caca9447ffad1e84d9d63
e171b9ccc9f873d98778ecc95eec601c9a0279761c491396ce11318440f67876
2bcc03b112e26ad63b2ad66adcb54dfbba0800d2d293e62e6b0362a30791f5e7
5bd16c455360c51399efb976501988f554a5959356402cfdfaaba77f85b42362
5bbef8a4bb752f8f9ab8875a7035575835e16722ff493165895c26c7b00444ba
88c1f636e250d6e0adb8e746b721fdcefc7dafb7e376d8fc9267006c5f4ec164
bde34c7f850b618c3207b6f6db5fb871683ce06b7d2a4b13411c4132076535fc
8f77b203f16bdf1ea8b7aa4a6d9428958f95404916e60927b8a77f5c2488482a
1d82e66c319f5bf085f9918b32bc77e052b467459a5c2d18c994f8486260914d
d819918e26a8ca072266fa641339370173586a6f6a47de238b324b1b948fe9ff
54c97e731748c00095b70b3578d5b55500780a3ce58facd042381a000864c8bd
0bfa64bf9b84131cc17ee1b70599577d14614f3876a6c81555a2b1c2e1792a50
3f14d4f24e02753783717a421f373a752ac36a48473b1bef605e47d1a465cf74
b808ef384e5f697508ac7a06114d0a588d46b3d7935b9b7395f45a827e805654
9ec5ffd5a13999332dcc24c56287e004164fcbcda0f6c32a5c2a958f74311b96
835707a76cf6f2bc20a61de27280dd8bff485bb2d4f0bacc6a9c7e4c361d7e72
c4b30e82077748e44a52acaf510b9ed1ceaa9c2116950c26ebc0614a9f528fef
ef4596917edab061280ac8a98be57dd1d1f16d89be74b7a63a8f92a4f0ada4a1
f1bbf0e450948ce8129138abf28a63bdd8de17ad358899dfb710815eb833ee71
9ab8e3fc117f4fa707a88bb51de2ff92019d125a2c4d0e951f3e2a869559ab73
41a882e85e96926ddd48eebf4030dd42aa091bb10ae2ac3a2bcc07a7b6990a32
9fc7d44034304f6b1334f8f0d333f5c4406c4d0b562af0aa117a64b742132a2a
45abc55c673ad7dac8be08b06fef58152019d4f36e48a4898882d2cf2c35c6bd
dcf6c58d458eada91a14b2ed6f43ae2f27266a249e5f3830a7dbf0217a7a420f
b86eaa44d7cd11500dd0e6bdd37e785dbb32c7435ec9f7e0ac65cc1c9aadb91e
2548e735ff232ceec29f80a55532b24d7185a51121dff96aec83de37cfaf7400
63551effb5bd96674ae04261e4bd5d17b8a485ab2487bd28bba2baf14e5e3b6a
20312b4d7e3f2195792fb2afe5ab8b4ad9cd030634133048847daa1f6ef21896
b02fbe5f7d86b8c204030368d2e38dd7fe6ad3b6c123989c98c1016c4d9c9f31
68279fed9727b14b74f400a1d57b1be4089535f175548d5133bccaab134d0b

Frag512 0 (512 octets):

0cc500010000e2807d9c1dce26af00ca81d4fe11c23e8eb6752e1f9ad716c61f
c24f2d80c041000000c95760d41810e7058dfab0c20703432653a0b716a9d7fb
970d755d6d9654bec89f8809377cd2505cf67771fc469309b86d503f7aea94b5
0395357bba9861070c95adf950a73645b3c5547616d50101272d90e4926531be
e76a3c8266325286a3aed64e3f23c8250b0a81ccbe42e0b3ce69331a2cb833f9
939bf6c0cf5b0a382c179f577b688cba1dd966c1b0c0f9240ffb48358f09cafd
6ab20c4205eab64bd91311b431bc5d1cab83730e8da3822d5c88fb2796ee08b6
bd8ca16c01cb9ebcb6de22935396457d6c291d8722b67c023fa2bd66f7147f3b
5b9b2b8a1c6507222b32fc95bd20454e8b696fcafb1b7ddc1f0b08b5a3871ed0
605e419ba32f734dcbb29b69c58581160b24453d96981eb2a957f1a2908e4a08
4cb0360e6aaf9194a649d52a5bc2c0038c9ec0488c02a02f7dd46002b657167b
435cfa8577eba3fe127cdf515489875f72754ae0698320f10694479cb2d1bc34
5674ac2739c6055c558b84ecd33fdaac2b49449f04893d11d7394865609eeccd
6fc57f43a31e1682a53a98bd8916bc68c9950702236fc7b879a971e066a89f1c
3cf41c3aec29431a686eed216d3730c5bbd03738a49aeb962541661c8e806b20
773f44da40b7c857cc7ab50b007bf102ad54c181bee552fd8b1948f05a1a4a7f

Frag512 1 (512 octets):

c7c1c9a19a62447c570633ab8f92aa12e723fa79752b7bc770926c1ba8b7f4b6
8336213960a13c22d891bf12cb92d541f3a30e3e69b197101dfaf83cd7b13953
f1971374279fd76f9e845c7441328cf18e914230333387ab50a048e27dcb48c5
a8d87f2430905979094f2357bfcc9d2ed69f30a9087b82c2d7e223ae392077fa
aaa8f78f33f8073c41081e27851b8a8876029695bc261be3a214a5cd98a7409f
eab2c3739015d2800a3c8f96a75e7a11a1a9322725a9aea399529dc77d953232
3716b2413c83158598cc8688ef142f14c57440da51462c5f7791c030e24d1dbb
0836a426a86607a6aab8c484935c8322d993cc7055366aeb4cdfb13ab53688a0
f535ea0125cb78c8c5e037f818712aca0d2ff6480fb96e2baca8a288775e5b26
7d6b3dbd2164b045817c4b4f432473a87b973d551f36187100ec3b24e7872d86
99779398f6852650977499738af0f1bb64c95e7e6a98597a8a451894d6f66ede
b2282c55bd29bb94f7eb9b93bb06f5f1a6a5069effd36550926bc350c752aca6
79e6a96b144d39694eada052bb985fde9c9ddabcb77b6b89142603d9b8ce86b1
845672aa1ab5c510bac615099432c99ad23b5c4a548afcc4c98177abe0a0b82f
364d35b96f5633bcd3a0489b28b6ff5cbfd4356b4a904e1cb59bae046ac61287
3b8a83080788f0eb4de169ab19187312267e17c4a008000d638054a759115212

Frag512 2 (512 octets):

ca9482c555a05fde9868fbc93274956d535aa3cb9b4ebdf192b998c189683be7
b60d1d4075d848574d581522f993661221d26802e1360295216700944f5c55bd
fb54238df94c8d99c174534dfe1306f70992413566304a05c84a86ec9464390b
1bd3b459fdb06fffe09e1dd6175bd5bba96299d0237846a86e9b606db512b96a
22543e3420a91019b890129a198b45d9097e32588e538b68162e5f3212ed2a43
f97c68b54840f8bc573622911fc57b2a189d0241af5d8150dcf73e6f68cf5f09
cb635472a942627c553db40778db340f6a24166ba8c05907885fdab498167e18
952f529aaf0d183f168aa10322cad4656831c9be0d700544f99ce3b8c345c51b
e46c56952884a7371e97b24eec1ba918f93a931b360c05010508462fd9987621
ba4082b35cf082cc372d82e545ff9a55a9db0c712c6f82312e7f6b3cbbb5c446
f3778b069d55d4a23b674307a3c66cd9964740a2518c9f2d4cb6fbf68bc593be
b40574a101774e565ec3e9058e4674501cb865a94e0d6c3991f5875afa39b3a6
299f6c5e0bac23cb037416184e9a41725d12cf8ec282590c434e3b300ce34d8b
1224f3e57357e01031771c434aab9a624b314bb9acc345a78a1c3f707ffcc885
191833a7ebc3a9973a7e03b5d6c062a192824d7576343253d232cb34a321486c
43e3676f1a86af15f208292548a7e1513f630467589bef51533de564a0e9a57b

Frag512 3 (512 octets):

5b85ebd5895d5a38e662422ceab070827c9d28674c44243bf265032957c3d561
5fe02e385ca55499b109780197b0b4803dfa13289889b77837574e34d0e7d797
5f6e66b12c035fe999718feeeb928fdcdf0ed7e0f20a640a9cef52d36a707223
54d0183ed6b3e29d259b227b9cf38fb6f603d42cce8801d0d60bb67f176af11e
b0c9ebfc12a479d08769b9825bac2ff709366ed71c8a83c59ed6566652cb35ef
052adb01007d773eaa98bdbaa1d695a1bbc190b2d5b05cc541a38da255520f2e
cb6a9b77822bdfc2b80a52aaba6c0f3ec38b26c47be41801de9e09e691aa256c
e8e7fb0396300f949c55c91be09b03a5ac431a230f0c950d3f5b4e01922e6140
c0d672c92b052499a3e283fcdac3e9aedb53e8251ef93f72c1dfb09adfaf9827
a75b7d2bd8a29e9f499c76002b903987195f2f69c3ce945d3e1d574099fc6a84
c555e244896ed6fd455f9d8c041f781a22390430c80ec661e60cfd4a6d3330c0
28c4a0ccda47ced566f0255294e659b732cd5eabcafa3fd04e730f2ddc12116e
aed501195f3dcc97ada5d3d0fa32aeac41f4256873f3923216b7fa00ef94a0eb
24b357dacecd09e9fbf7c33bbde8a83b531f50dd43a02cd7831e7f11a0d6bf05
895cb2737df1343fc61f6354cc23d837e7c4b7e0b5af3164785dec26b31ec69f
14617d76eb7bf4f77325692b52149bb2a87db6a6d2b97aa927395a1283900a42

Frag512 4 (512 octets):

41354c980e089dbe9f50066b17bbfd39415693d621d4d3ef8ee85c2d5b19b1e1
7bc404da6d57025d9958a268abaa1adcf197b7e1519b23055c676efaddac9bc1
fdb7f67d8f12ca72781db9fbdd918ff22288b93ac2584d4103a564cc957e92ea
bbf0342ad89e15c9b4fa7647f5517398f25f4fd4cf762c12405e2510bc508883
e4294cd045e1bb40318f16ca660b4f9d4cd087fec1f7edcfe598bbc3bceb0cef
dc65f0aa8373305af77b6c6746272022df06daba91449b7e3a46f646c74fe7d5
5803bfc065de3007b857431d2e3b059976eda9c5b1bfbd9ac5ba6501026ed7db
6508c08773ac0cb85be1e21bb88dbdd05f423352237a4d4c372cf3fa96219dab
fc0a068036d73de49d1ebec5b8586c57084a66e25bde34f65a6101f88e265b4a
73a1d9b78ea152cc64123bccf05e3d01eb07a9fb0706392592959901a021bc54
70d68fbac24a71db2c0f5facb94955ec38b7531219923cae7c2382ed3dd89690
8762fa8207c270f3a515b528f3ea2419cb4a325df289ac58dc98cb4db5803601
ceff975fe614000ade64738feeb51894a9e38f72a03e4ca7773e59d0fb567d74
fabafd8bb661f9934a55c08846e9317a5b3cc7d70200a691538d6b1d016c0f2e
64199dea83475152ce500c283485790e944ab103cea373988337f7986c22e46d
3b2b29a9497b67c386e7c28b2d30e8d31ebcba559fc42fedecb9277da498f46b

Frag512 5 (512 octets):

d67d33a8ea6162caa88d48bcdd7cacc2b15c9d1501479f230f283736bfba5ae0
6c7ac96447ae127ff6f6de093b9d3cb7ebfd671852f2779e098c2f55011531f8
b6b530ee231bbc7b6740a0868ec8732027f75efead0f7690250e930e9a6ece8b
5a191626da3267a23300ace60c8f10bec7a2317dccae9186a1caa3bc9ea77b22
b92c56d5d2282a5464752e93ef17890436dfbd1a173dd62cfa985743dcbc63b9
87ca1917d12bb0223a4908566077c5e8b0eaf18655b0b43a04582b823b5bbfea
ba3fe3ca76e861826ad2658997d65709113bcf676c5a3d691f470b00ca7e4579
5d5a973974517ea45fc4bca296967d76e9bebeb786cf3229df80b2a7da9290d7
7e2123942fe65dfcdc497b3febdf82b374a59eb26ab04d3012f6d51f49fb740d
6b5d8d3a37de99044d39b09c2acd08e990aaf3a5f566871366ee5e281007f0dd
72f4bdcaf30c4bca5172260a4b8635c05186adb915b83ee1848d9e6d4f46f934
35d1006bd7fd8f9ebe7519fd0c1bcd188f244845dfd85e1c7c3539445bcb9685
9030bf8df47ccb66e80a5f4b408f3f5c4e12669a432b083da26e9d204cf4d70c
7da4b7b9296a139dbb965c2164b2528709096a5e6012c57dbbcf079a17163507
43ca567fccd7d6edf857947d10e97c5d7a6d46be4e046adee218a6beeaa1f0b2
694475a52565dab5f4ce49dd856dadc4c0eeb597634fa49e04b543c91a947469

Frag512 6 (197 octets):

71469cafa0f76d0c6b4fcf0014c68d0ed6362e7c6caccd43cd73f98c71d8a22b
7fa5b64e728e7747cdf812ad2f5dbb78a4742bd0955f9509678a2a8b93eff154
cfc781df05a004110892a829bfb3e78d84916c8e79a141a42e53965329388959
91eb028dcd99ac2b6c87e56233cd94aeee4fca0b2e9fd384e7967907dd319cdb
11199111120367af37afbc401ab2d7fc3192e007ee953c5c0b48512c55a7b1c1
9bf17bb12164943c252a9021934e35ed4bbc23101db956292cab5c90bf25075a
b92ffa1021

Frag512 7 (512 octets):

bc1b432f0201316208021657aff893c26f0caf7b2c20ed3429d37afe34719505
c08f4431d1ea4789865feb9dcec38a275418748d443fe02c1ff87d0f11f537ef
4665645936ef23b919d1b98a8f25ccd5851528de4db940d8b490ad73df1d4260
944cc6b96e3e6b5c2ba28ec0aed006eee1899d81de19aaab4e5d9af3f6fb614a
934395d1e20dcac8bf0ae7686bb139e636dd9135a8e2f442f0cd222fc1c9b25d
4521140b644f437e339d7bfad73bc8073b7cce3936c9f37f1948e76b8c30f78d
06bed71c20364ff57e6d5705a5f21ba9a08e65d9d2246f87a7258644b50fdcdb
f020fb6d976dfcad929cd0b62c80d139c7348f8fd049f9c55d16e0b85ffa5ebc
083fc0c3231e9c5c12f03f25c00ec1d6d8c01aeced3950423fe3886f153384b7
18d2d733bf6614931d54af93325d6484bb9a012e946fae994da231d3e56685c5
e1c7fea4b9578f8a3278eb74842445573518240f7332a256a58562aaf4c9b47f
df06f854c1cd6784c6c424400adeb648becb0d643ff6e40cebd4feb2bde312de
f61740d96b7218058399cdb272354d644cc39d2de196d93c43b64e7c8c852d64
5a1ae3e49b3ad06524bfce65c83c245651b5eda5fa9431e051682aad4f586a9a
bd2e63c25add6ab171a85d0e7b0e705c9f650f7bad36bffb5b9abe2c72fae38b
495881c7dadcde28729f17f8ab8dbde4c2666b4668444c7b7491c7959e7e3756

D.8. Replay Window Trace

Appendix B with W = 64 and F = 1,000: each packet's two decisions and the window's highest sequence number after it.

W: 64

F: 1000

Events:

Table 27
Seq AEADOK WouldAccept Accepted LastSeq
0 true true true 0
1 true true true 1
1 true false false 1
5 true true true 5
3 true true true 5
3 true false false 5
70 true true true 70
6 true false false 70
7 true true true 70
7 false false false 70
1100 true false false 70
71 true true true 71
200 false true false 71
200 true true true 200
136 true false false 200
137 true true true 200

D.9. Epoch Advance Trace

The receiving side of direction i2r of the D.1 lineage from epoch 0.0: the permitted set's decision, the receive epoch and the overlap after each event.

Events:

  • packet. Index: 0; Seq: 0; Permitted: true; Advanced: false; Receive: 0; OverlapActive: false

  • packet. Index: 2; Seq: 0; Permitted: false; Advanced: false; Receive: 0; OverlapActive: false

  • packet. Index: 1; Seq: 0; Permitted: true; Advanced: true; Receive: 1; OverlapActive: true

  • packet. Index: 0; Seq: 1; Permitted: true; Advanced: false; Receive: 1; OverlapActive: true

  • packet. Index: 2; Seq: 0; Permitted: true; Advanced: true; Receive: 2; OverlapActive: true

  • end_overlap. Index: 0; Seq: 0; Permitted: false; Advanced: false; Receive: 2; OverlapActive: false

  • packet. Index: 0; Seq: 2; Permitted: false; Advanced: false; Receive: 2; OverlapActive: false

  • packet. Index: 1; Seq: 1; Permitted: false; Advanced: false; Receive: 2; OverlapActive: false

  • packet. Index: 2; Seq: 1; Permitted: true; Advanced: false; Receive: 2; OverlapActive: false

D.10. Record Wrapping

The reference construction of Section 16.6.2, wrapped to the D.4 responder's identity key.

RandSeed (8 octets):

000000000000000a

Record (201 octets):

0100103a97c10ae35ec7097a267e56dc73fa2b02000100030030dcb21085b6a0
d515168eef511380e92de6e2fa7605f6f2a0a7c46748d7e561ccfcb6e2ee1019
343338a451dd93e63993040030d9d122caed3d61e03a7333c90f462c10a422de
1ef3bf942998e49fefc44e9c74eaa5ca77668e3e428ca1c6e25ad5dbf0050002
000006003092f435572d336f8824fee372e28246d195e52062081b13cf0325da
3bcd9d10a0d0c73d7f1377ea9cb2f11b8561d4683b070002cdef080001ab1c00
08000001a3185c5000

Wrapped (1785 octets):

1b5f6e64122df3bfadf6eec872340635c6e12daf79a0ba938b74f45a59484667
c4ec3e1124f4d6227345a21a0a323b9cad7b158506c93517223507c2cc7ffe04
003aad8a632b89eeeb86bc3ad43b7acd85d28da265100709654b3adee29b80e0
f20d27f66913ff0136751ee9d5eda747e3ef79ab41033a17583ff28a65c6eea6
20fbbf4414e72f804aa6e9196a3a60b093c97c76965c75b5cbafb386f19f6ccf
2479a7de17301cb2965f771bcc847bf1cf24d4e07a18efaf8fd9b3c7e2648da7
be57ed13030c0f98a383e863bb2e4d88839f62d3a7764c23103ffe71444b5712
65ff3dd7eb21e98fb71cd3af41023561cae24ca906903c805b068b454fcd9f1e
b810074bf10f9a3872e4a1b7ed2fd202414b62a1210e98ba6cfed270f7dfb02f
d4542129b353f9e7f3b2764bea6be968ee3b3f0061a12e2e13728d63ec2ff9d4
d590fc7038341906e1f8b64db2fe79f3e598ec710c425884c6f486f272e1c094
3d2df628ce4c90eda35ac90213db2b9e7fc8a9635944b6ed266081618fd97857
a298743b292a4479422d9911f98a78ac17870d0cedcd78ea3583c87a70032187
c2d87406b0f265834114e7aca97b307e26ddac7cf4ac746a68ee0a4523524089
8b427215900d6671093240a7d2f6ae0190827931f4d4c68eb768f1f06070fb91
be6884234eedd6e79a84b63733c58ed71f3fc874ab54c07a924ba3e2f7628f0e
e451d0178be74e58182d40239dbc01995d23cb27433dd98947434088350614c5
90322d0a9eb29e52641243e2e70e776cebe56331520f255f5fd42e91ff49f98f
c8ddca9d066f1eb6a37627195153379002a381cea595a63b6ce4024a87e06b53
cd08a613f9185217d82c096258948889b0a154700e8d323455b766186a733d31
b41052f1f73832e910ec41e201bc1c05a022e62f1f0f657db299ce118b667085
72092fd844ede618e161c03bbefb01a9bea3184076930e368993fd5de2d80917
89dc2ff1e3f68a54c6870c484378d90e48a5bec07bfb2bfe3722d3e9ee15db32
cd987c42828ba8bfad25b3816e760663c523531886e10ba8e002fcd8f53fd24a
62aaec72a0919ffbba8169edeb4628a54b61335d788f034666c7b3f1f770c5a5
9dc34053e31d46b2789f2d8610c32d9a6d48a4ef73d6c6d59631a8287d5fa617
28e55673eb1a24996b4295dbab38fed1ff1f0d9c0d9b08cff5bcce9a27484b7b
0420edb79a55b236f2f8213f18ae6a79818ce5c88baae6191afec2132dccbfaf
6d73ccd94f6550600f2713dc534f97616fd2b27e76ca112e03d44b770c093579
811a6b30a30d52cdd915ebe94c62eb97b8d704cdaae85938029290627560c227
164d6b070faf85bc7753956dfbc3007c7ee55d8d7e45015c6bebb3f2a2b10f6f
540bff61f5f55dc4576c7ee2d79caea9539fcc2790a749925fafcdfd4ae12c01
bbb4657799d2f42ba35d762cd04b08b23af61888ac5c6aabb58797ebb4a0678e
45d3c3417053bbe16f128b861610e4183db86f560b92e0f1e481369695b0b3a3
1d1af1cc2212e963da46e0761bcc6952f75039d682b4be2883c6c48deb3d1860
aa42d0bbcd9d5438e8f05b3730a094db9de089cd09930a0de46ea396ea402200
3a41a273e4a1f17b69d7bf506e59e032ecc1761569cd5d91a54051c1447cc0ea
ae896822ad88e406483b37013d0a3b52dcacb4c45f429530ab45f84eaecf703a
c3bd4d7a44439ca2a290eb8178ae8db1534b7450328633ec000abaa6c65dea5f
bec6c07997b26b103f465daefd838d4e96ad3a89ed034d5cfe21f782ae23b342
fc0eb05c3200e6a094333d63512d2f96b50661efb71c1e4ec80d4743b230cb52
2168238dadbd8775ea931f3cec720c111b6b7f6bcf4253fc3f0fa1dd1c6a81af
9fb5ed30a130084d4ade797f35e0a108339fddc50aca869e911fd1a36625e930
b423f7e35ac51bc55c7272f2d16d27d4c7aac926d0c35388041fa2d32e4c6fda
ae4121cb21f2b5a076980024e9c6d1cad1491b4e6f6ecbbda3e09876444dec99
cd4ffd029a97a179bdae013ced8f3eba3084f5ad43adc0bd879bcbb50df80005
06e0ff3e2556dcaa1911ea2cc8f0dc61b72d03181540cb151f5c69b4f147c680
8e6d789ab85386351a8e06433f1b3d324785d000ccf24a24df625db5f16037a0
5607d6d19647b1c3a97c1f779fbd06d3beac8ea390359ae1b13c04db2a46b2f2
55014cf4aef87509265b381eccafbd0d756ce69553bab5b967c6074ba4dbb216
d0ce9ae459950a415407f0fb6b226699b96ee5663cc563177f77dc8b0c48a508
ccd2b5bd41dc6b026c11555fe8712a5ad4fdc029270f7751d1882122ef37e4a9
a6e5f983488d06fe3e6240c1cc59896875c3b1351e0d10958cf60b7842b78a50
e52a72ed52ef465f8e1a7a77ad5afb26b585e6dc02f5e5c9f96370aed452b817
0ba4f9b85e38f144bd056f6a7d477308611e885508ffc831e57a19141870a85d
8a2b9b95f78405a20f0c3609d099f44f430d001258ce239ddc

D.11. Tombstone Reply

A tombstone's CLOSED answer (Section 19.6) to a CONTINUE from cs(0) of D.4, close reason AUTHZ_EXPIRED (0x05) in detail, and its routing key; the tombstone answers under the D.4 responder's fingerprint.

KTomb (48 octets):

17d9380ccf66ad32dec6f832412ac19eae8c6ae67c800ae6bcb6ee9392951ae6
e1af6c26a4ad472eaa159cab013af59f

Request (1628 octets):

065c010000013686b9e669d928c859963733b8a6fb1c29a0cac8f67261055faa
92fdd9e3558e000023ca7de4aa6c67eac3965c9641188d3aa78593c87d5da583
91b958df2668da199db15ac9ea548e9cc13e89c56484982a9e84a4aee2200750
8b99a28bea8ab93cd88e8bd04ffa37ce7a7a701a77ab9bab2e71813102cac8f0
ea252ed8305c094c39db1b8a4855175b3fe29b43a2170b0a0542fcf4687eb280
c4e73d4354a9a640a027a5ab2a1c2c894693cfc0772e010fba09a0264a6ccaa7
6757935a0fc4ad4c4463c5a1c9103490d73019dfa81cd13846110875f833c846
7bac9d964173a782990a106bc4cee54145d2d2813ce94ea9f0a98792c669571f
b4d900877a9c20342ec2cc70d1f75c69ca8c0d729b7a20b2cf116c595c651ac8
cedc1bab34195c1bf4208de9cd79f6202c548a31875876e14c0d887ce019817a
e2aff268483a54ae57d38f65ca0e2898ca8e20c645ab1dff9a57ed419dcaa905
1e7a822941b7521671ca3117ee9b2cce5b6bc981b9c4b8a628ecb07bec1ef524
bb43d61c6f462825a2259dabcce5a104cbe0abb2f457703b61452a000517a986
f641e0744c9703bad02015e26062649989b0bbbaa8d5b1bf493004672c82a4c4
dff64f08562a214844a8cb3e3095b679d5bf2b59000b3409e459b2713ca1e367
20a4609b1a15ccc8f7bccffc24a6588918523552c6a2ecf342d82592be20a37e
8aa307db7ff0f2a4a74c790bd522521c64eaca24283068b5c69936f38d19774a
9dba88668b8af5fa6c22743101cc89d2672cfdd9ca0f58081e7471e0640aa818
15b1ecb3a9e5b9985929ac4540a5dc71d65c1b348aa94bcb3d923b4fdcec2079
320ee15a5a09357d657a3a94a905d7062462705b6881c2d49a8f0db8363fb899
2a223038073b891652fff005b33148afa017d8790f46812d6f31927c7223e923
6809ab2878a6850f623ab6568a7f05a7b258cb46756e3e7b76705721b4f90656
0cb730e44b7b80223bd983978825ac576355a0c40704c0cee98edef652fe93ad
01049dd86a9dcbe0094ce085e123caad708764e57d41824848d353f2a1699b89
8937413b3aa66635d984b7e38d8cba789f82423e6b8c29c57fdc078059ba55a8
171cd586cc7b753ce24725c8c251f2a2074f94595eb910a326b356f27f203273
b0cccaf5747d3fecb8cf8767f9b14567955444db5f2a7b38db94beebc74df0bc
14007d370a4c773590841eb6b51c646b3c1b58b73845bda048bdc90968d36be4
766841dc050f1b387ff52eea5950635b84a1451300f8c53711c2e9677cb8da1e
ba457f82eaa791436a52f4860630c377428cd9fc836505ba2615909af1a6d082
31fdc69271b9c385eb3bfae017af64af312aa3f4e3c322f67f82aa3ab70481ea
47b612f0357424a86f698989a63b2c680f351073d8137b5a4248027666aa841b
0222c1ec700dd5918bdd8343ea514a5bf6137cd9051b51463f98c8730362e9ca
4e94a4993ce42efe575c3f1ca9986a80073b1a1841abe2ecb777b596cf8a30d2
e098a40595b8e4b1307c7735e917002c65ded65e483ba5a901cf72c150742331
3460ad6a069a76f52836b5ced4e0700e863cebf9a9ad81bc68c723bd7c2c14a2
c6fe24b92ce25fbe9b28cec58ecad60ced58676160219b425a9b7836c2a7a124
eb41c05a8f98d011152697b008d0258bc83eca1d32b36d0ae9c6970b93291976
c05956d4b9039a68a33196aac7466c47f1ac005d71f375071b9637f7820b200b
9b715aa79adc8dc3d8a67ffc9cffc95f92b100b1a2b73c742b5a241f998a78e8
0a569fe6393872c656913ae7a38ee347caeee840c79396f2006dd4fc90ed701d
c4179bc746b8bf23c42fa7a89d34374548c918b5bb9e4b0d0266997244156eb8
2e45ab5d5a22b9f51b445b5c2db7b4a7ce8901a8e306ede4b395a84c31cc0269
92965720bfc72673c7626402498d14dab8019b4234232c4211cb8a1b1964e0ba
e7e15c5d62b18ce76bda686a24b3829014c772a5c2598559d96759e1520d98d0
80261c692b92cebc06890e58143988c525e466616b88f9a6968c62688e6b1a54
4184c50698f6fbc28edc76a7627466b68fa76c01e9726e748b7d997ca9804011
e1a95b0c8306067b66690b1cbd8ca994b83dec928d9df13c21a7c8212b0b7cc9
129c53aa9d764eb3ea3be9ca2a461b54ab0a796b3514ea4211f9f15e12275dc2
02a260e876597b9b461bc81d19b7ee079911f869946810998fae8267d56bfab6
9b027d7d06aa7ac0b0b0880b2ee2dd65f6ea781864e5bf9cad077de8

Response (56 octets):

003805000001e8c1dbd8130bd152d88d7ca8e4bfd3355d8e335437a326d8a75b
bf6c32cd806ccf0e699b3ee6806185d60eb00e51be9e89c2

ResponseRID (8 octets):

abd890b25537a523

Reason: 5

D.12. DISCOVER Exchange

Section 9.7.1 against the D.4 responder; EphemeralDK is the requester's, from which ss_fresh and k_disc follow.

RandSeed (8 octets):

000000000000000d

Request (3190 octets):

0c76030000001407bf28e80aebf04cf757812428b0763112efb33b6f4fad7deb
445e54d8cac4a8b74390811029e444c0b8925e1387127b8755fb3cb97438b085
63680952dbf508d4e38e0603a66f0acab2c05cff9676185aa71e8794f2223f6d
b62c53a92ddd3a7df4fa2ba15c8489233f5729b985fc4623824dd7354dd5775a
0b69037736693ed63350a581df567007c906066885d68222e5fc51e3b5664595
a3c72a7a54c2856a6b75cf0728242626eae43c249530f9647208b63636558b78
5229ce69461df90347965553678d71da3e319834a36204b5013d94d08cdf1a15
9e734a95992029e57c1390168b0c67e8c173342907b43691adf4adb2d52ac645
6dc040b9a1b0ce45ac0b59e1c1cf238f6c54c371742ebf94444f3443123581bf
e7c2ca426b3ad41ea37841c5b1aba1e5a90d8a98ee26a6823441495819b3c757
c60b89abea319f3b74c0753eec1245c78a8bcca8b0790309fe159b26e0b7e3f9
cb3b44012ce374b9d33b0c5254b36275fc0a387c6271a85c5087e78dbbec0f14
6000027c9e6f461008e5c955f1ca1c7a9335363c7d14a81da56829278932c849
c62261ae099114c5649de1a4cf3ab0a7ea3bb095bc488862a6940617545a95b0
85207525fd99299286751a227c27a4980282bdf5f284b998474825bae4261d40
6080ed33b807bb75d2b40ed9b43ee91bac0c0ac4df059c77623c3f861f694ba7
aa2b3a4d8b9c5149a5d25c5df9f033ac732655213c9508a03f991280b459df95
122394b2293613fcd2152b6743b8727cc6c7610f4b15105b01f89013ffb37191
58b02b094e0042bf182b0e5811ce101c18d4c1c59a1ac49f1a54fba75861cbc9
2722926dd80f0475630c340266d87746d345dcd86b0ab1a30d6605c99b17a5f6
8b03a270f3ba8902a58be31cc9bad6492504d093c63e03600b99f0700f7523d2
53cebef610b553c611a811b0d30283d93b500692c0c66d65c95a218990312a08
50912de7e2bbacd5a03c9b8df9db773afb93ff3693c1d2ca01373c6b64cbbc27
8b01999c9c594fc2110377c8561580321dda0099580327b441b52c85b9e55146
913439cc3561787ebda3631a92cad4f75b650342eccc054b8a43df4b8ce452cc
755179b8418b760c5304251aad35c29626ad93e26b40a0741ec87495a35e1e51
7a5e1274e8c8a1a9677b265c6cbe387765630d480b0080e98cc8d8675aeac023
6cbbf8a71b4773bc1ce23c2a4a9ca703b5f3bb4863e081b6837c6e5969d80747
04271e1d94538f54a29e3791dcf800471438ccc21cbfda34492b7e672770ee97
3b78f766252aa7ebacc397fa6fc489cb9865483cf0856045c131435648112a6a
76b65a157c75c2ae41a66ea3b878273838af73481018a29a1a7dbc3580623526
c9c00ab68505e8b37798a20a82ec365c073838273fa03909b2db888a89692df4
5bbf56ad8708c206318aed4171c6bcbc8411c4355991c1f05ca7113343c8cda2
6c15830bc3ef5113756115d43678dfa0a2b2ab98a5516c5b09af10bc039b0964
f2f1a12c0220ee4422c83579dfd506ba287b2eda337c27290bda7df302bd60b0
2800ea1e5c9081325b3711c0a5f6747e597661207b02d2e4670915461ce26355
4560477bca00148010c25002866aaa7527ed97a0e86083ab1a7d737ba318b4b6
afc5543c80b8a934c4ac40b1a155af3da854dafca42ff7015525a98e9b49f3c8
b28e961bac5b80c591457ab32acd238dd3c257b77b04fbdcc2508a4e6fb923b1
5174f3231cef38ada23285c6e32bfe5798a038c492e861621a198ab09a47c03a
96064a9371acc4f71c570b9cc0d09d85a7b20638813d119209bb316d442f3b49
19cec73f0d072b13c64c34a0255582571f026ddc44135c57b7b38b41dd7776d9
5476f07c3953f0658325578181bd214b72fa2b18b57121dcf8c534ea559b1b48
8dc6c9617cceeeb49e8e2b5555c408e7913450f5c83ebba26bb82418301258a9
a34b082d750982b115cbb194789eb28290c2791d4154a0c04e53e88f9c37c101
b7904e374f9c880e99671aec3414a79bac857ab10892ce75e922b4f1c0957000
8e73630790c8042b1353092a3ab5a98ce66277e7c1debcc39eda4bbc939b9b19
c0e7237f58a211c3339fd23c668c31953f402e92b79a89c1b1b416a8fc6065a5
c9ba2dc43aa4080c2e860dd34a4e332b0395aa6bef474c813c57916b4c10a3a1
997c93029aa43e9313ce1203329d6a1b4863c150429be93f00bfc7f3f7e6b85f
e5595cb61b660000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000

Response (3190 octets):

0c76030000003add2f053ebd404abb88852515862c15c5d18be11ab1608280c6
4b77dc361552b49000b2a8155483e7a341910fa8c4fcf620d474b5a042cb2941
88b874c771cfdd4951c79f2bc1afa032893af34be6fafe3d63d8160c5f94ee09
13966e3e3c4a02a16487c978b5405f8f7976ebd16862d55ad5957c82ead0f11b
e78644bc72c980f697813ecb337f56912e1fde7d3557afc7a493e2f6c00d87b7
61ad361484b518d74fe0533911a2eecdeb700cba32357953bbb0729c5fb3b037
04076fa72dc9c76bf625e339c403046bc10632a7127ee9462e8f91487c709f9d
aa95982bd8ac6ed51e5d2553eeb3a4572da100255994dd764467c80e32ee1009
8e2df2ea289a895a33dc04bd077c0ca6552872295958cf0a62a6dba42fb6d3fb
61d08b6d1d86ba3a512b80290bb02eefea011fe17ce894f9d7c4a5d2bbeb87d2
627e8419c98c1c60927c2d484687e2cddcd0417df9b16caa4627438cded264b1
5c4a1c4e76f3bc8688d66b449b35abfab6eece328fc3e098e94b3851906204c0
f77c2965dec07e1ddbb2f2dcb8402a2e82e7c22a3e69bcae58127a0c64efe2f3
ecdbcb7bd58ff0e4b1025ef3ac2ed8e448110c776516684df28323870856e0a3
68ea945de0c79cc57abe5a5d117591e49320ff7d9cf0bf90bcaf69d52ab936cd
c45a972b889fa71eec214fc3d8eb38c0ac9b971e42decb58c0d36f9ab0a34777
0c2f93a288ce886a4409cb6720498f6a4461620ab1975aa584907474d732ff9c
c7f0c9863d759e4f471693a2c30b6d5d593a46232addf469b1e767270cf8bae5
fd854a3005be7dff4e2888b21a9b62412b97e3fe1c07805bc75627628c733d22
08a9c1b028c9b6fa358dad1558838ee75b54bea10f991c4f00c72191f90a8f58
da57770f02f776ccbcda88174a1f36226617e6d751074ab51af5fcca920b5946
785f228f1545e420160e46336f4ae02713ffaf2b47db30e9255544848c97066d
9311f7ed5eecca6c325cfaf43370f13474ef247a3e6a7b28e0635f7fa704461f
87d5623ce763be61a13f970a43a65fa1967f589b0155cf5d54ea42d98d7c1614
2cd65bb9e5dded8fdfd75dc53aaaf1595b64eb3a5fb23b97b6d86ad431e3b230
310e551d7cd00920640b546f2078e9a15fd1d87a14dacc99e8f15cefcc41ecb6
767f8eb6d5448f0e91139caaa1c77c9e829f27b5d887d71abe4b9017dd8f4dbe
0f6abf07aaab082d52e8ff8165c7e30749361c9653076a8f758d2942160d9b3f
ab8c088bde2681754583090470a5cbaf9bd6abb32856c13d3ccaca231fe3b2d9
29ed1c5bf60898e13be7e20b14597f12e7fa87a97b15b76f99684e5e60e6ff88
edba68eea21530a3d52c7d0ec427d3e5132a1ac922fdbe13892d7b82a8a90080
524168b678af00720f8e87550f39ce0d3c69d9c27bf5e550811d22357446f8ae
2c7086073d2a1e49f8512c420ec7fa80771c295cbe2e8e47a495bc5f238aabf6
15228f510ef09e7ace1657088d4cc975f5346d94c693736526e5e76cff971549
96725638f7356264c48ebdf8323bac69111022a4cde873014178962e886a3283
b800c74ee1c777297a03dca800ddbd5cea7b233d5063315a15106ff856880192
aa18bb074340b5a004015c16108c59289775e08d3be1a7d2dd3d0ec41cea8cc5
8255b0c56c6495ebddc7eb04f915066a7c1e5e2ff80141362504df95425e5e88
f08b34bfdb44c773a051619c0a2a012d7beefe27cdd091423d6a69ca1f0cae92
b3a4c2b6e962e5436bf473d229e7c503b081f5dd6a2b14bb8d5e8ebb87cdea52
0d887e6af0526f93a23e27ef85ba3759bb1dcb56a8edfb48deb1fc8230c5d320
f7600a311819ae26ed4acd114da77d52140a9d1036937720597695ba14a8149a
b5a3263e07bef8dea82f22c248bc69adcfc7a12fa979333f471da11d85a89df7
11a36ac10077cc30fb35f9a3d1058d2366bfd8e0512e71cd1c9b72eae1d4962a
0d56c971d8f99df63add136e19dda39910094760232f6816b10968138fb9d6c2
a095104adcf78445858d4853f02f7f0a546f31c0d3d895d0590c87ce93425f02
7bc7a65dae6e39fb5aec444e804ba5ce2dab906f00d9e9cb7146617e33508f42
1f04bb6a36f55c274c1415b1be10d3508ad002524c18a2fca9dcf57d14c383e3
7d9568c3537969841c1fdd604f94143c38e0b5144446dbb208bfdc9477ef8cc2
3a6bda3eb7a4ee3741c17d6a2b3f097e96fb37e745ead66792075338327fe5fc
577c640887bed19ca587db7d618cbb8cef00dcd3c2ebdd11521585301565572d
c15540a26aff0b34048bd02b27c27c6050a5bd24aa2fd52645b0eeb64cd763d0
c433c35ed71678636ceb6c54099c6752656ea55daf370a4465e623988c86f9f6
4f97b35b28a1043663cb764205bd208c861da5e4f9177b9ffbead52aa795ab32
8dde2d9ad439090db033dcc71ccea6f63b9eddc1cda6dcbf06b581e3159fb7c8
603e857e97fdbc7dc354294e540cf4bbfc5accb42c536c9a09c7963aed4a52af
199ffaaf234900f2dcd01c32198ecf2091659cb4101602e4a427c5eb77d85d76
a748a3410f558b07027b4cebbec383887427759f881c17f7e23caee70b8ebc28
9f865232b4b9ca579cd0731e21be54c9e7cd07d1d58d79bd66453efa04020a24
e249dd662d532f6eedb2c23a2548ddd0a4188cd48e7583ff1dde08f5e9aa4b23
c81cf83ddc2f285b59bb0c1b71ed7f1be8d585732f23ad50c09d5c73eb60e1da
96079c890a24fb4def98d66951a8c2419fc7f619d07134bf4263e5fe68ea03bd
58d786a771cb0897741b140c09031422af6de47759eb71bcbbdb2baaff759835
7d6a3fbfcc08cf6040dff44efa9145361d77e97de16bb84e3ff3f0ea033b9ef2
cf536540355af3dd51c38994805a5c46842e75e067c794a98566cfc895e97687
95b7414b64fc8b46214368e0f33ef9cc9e71db4bc94cc762a29de1be0fbdec0c
cde4cb55756c2e6837aec156957e9e8b08251dcdcf3f6574134ab35832bf8e06
ef7c3f5e2574632060e88d0f2119ba00d7fb8f28ad92df2e32a20010890ed6a7
6f0b5598213e1c5a79bfa3063ef550b539edfb9c6e1325d7a3121159fe1b228d
c940003a2172f7b60b7f6d26a6daadba46637f0e594f46a3b7c0dc9eaaaf6048
242f60590d1207d4926fe627b96828c3fc5c302d742ca74033482125ae632051
eae16bcc290df7322f2d61df23fac107544c0f3bed2ee66b6153501df2b25fb2
6bcab5ef14127ee74a79887bb9dc2d53a4ffef65eaf8e280110a47b9955f658f
56801b4e248c63885d2a18e7df14741695318be3bc4f07ad342d0796e855cb62
839d77e4c62d690e0ac763445a1d87eaa196575575443796eebffb567ef12d70
80ed15a202e8f5b46877e28a1099cee3310d84ed7364e81cba8a8c206004a7cd
f8c7914322597a056cba0a63cd3f928e7984fabb2ea142a6380caa660bdbb9ba
00a743e7aa6d2107a9d52b4ea90ab6fc056fdc0247ff2f7dfb3808b5efdae6cb
91fdc2b7c575b7ae5f6659628dde01aaf368d1bc53833f9d9a8f2e960a2b56fe
9c305e382c3fb6aabd6301c8487c127314f63d6804c98b0676127176f25495ab
54f85e88b7599b2cf6e698150ba4dfdb97266511ca55381b6009f9062f2b9908
e0d3e86ced01b8e26b3037ded4f0eb0238abb675a5597ebbb5374dba1cb96df3
fed7383293cad9e42c15c0963f20a394b4618719de52b741dafa74a445b4c1d0
02b3c24fefdb10aa7e55145eb3e01a11414c96fd4e58a689903d742165a05a2c
7631653bf9c93163a6639ea8e6c282a6ff02577f56b5eab8944ba2a6830a66f4
d8a1f919b7d7bcd8df8006e22e95af33cb7828be4b6c2eb3c017f1b100130f9f
1d93e8fe1037e3c348d1532c1bdf2ccfe034610c90f7283f6436ad68c14ed9b3
c7873cb1666d7436bb9980f9c27a39f1b5202cca4754c7d0d97b887b168495cd
215211c7d00ca3bdf2cdb0823efe2ae624b5dd7944e905dcbde1022a2b47d38c
5c98dfaf6920204317f6693c7a987b4be631d4ebc35ac2f7ee7cc2b97571580d
c7bf6eaaf3b3997e44ec5ee15183f185537ebd63536b56cb64fca01b107414c0
31f6c07e69a2cbf087a8568cdc69f159b1454d61b81916c9c3a577c8ab2fd92a
d3cb9ffc3ae1a469e3c81692fdf0aab9beaa995fecb351e7c24db415fdb7bf62
30d8e36e9804dde7d750e4e13a582508fc6f5866b272cc8baea0293c4490f52a
149ba7504929c6bc9f74dd214fa05de883a2c4134e21ff9d3f31b507b1ee7382
af913206d4b7198d3fab13467f939816bfc85e3b65247393aac6c2f6baf1a258
f8d95415786ed959737427bad4242777103e902b8329e806cdfaec7d6e27b7c0
609ff00a9873f337ffd9d2dc94c908a1d09b91fbcd59de1845ad4dc786d7d975
d4d69b64c55a3a1bb4cb2ff105da55750d362309d3bd7404609c4eab44d246ec
8fbdbd228c3d5f618ef920e705d25d7c85b74aef6ffb

PeerPK (1568 octets):

0b3406ad570e2320045ae8852334a50b4cc5f1844dd765405acb956ff923fe19
3964a1c351ab1fa544acab152ee259019e8a99f65c92d6f66c0e7a008f91af63
660a1cd4704f550f0664af6ac39f26731d350bbd6965c1f7b90064f894e6fc43
a1e259c031cf375425d0a459fc77a09e641f747607d1d2456d028dc45c389127
48fd126973b52e1d099d6ce6a520b681847338cc0c566c040c906a9373776458
accf64e4c9a4c7464ffba8f7d9079c115949735a2309c05d2313cc071546c65e
6a363a5f5b1e98f3711876550ef9293b075e24a08fde0c4e5809705bc41d58a0
159432055a698638998c6f245687368598fc3709b46845ca9fb99011c95b5d05
87c0d4272be31babaac52e81047d03ba91c0b248169b4f6c987990c14e696c3b
e922354a7635b0577695807c37377602ec0b16f17b58c968909aaeab85384fc5
c06bc9c3cbcba5d9ac1abc25b5efbc3226c0829bc3359bd664e2b33825f74a67
2839b5f602a69c8c90865837b062eef28c46f497f6cb4e8d82318f4670b2d569
5d016f87083d2290c32fb4b44e2043964b64f47ca73cda5bdec0951d84a8b365
38dd5842b6d780e1042e74d6ae04197b20605aa5e13cc1866d99819335b1adc7
c464db49b80783ae1f8686f18caf0a664bb5bbb2132416b773c485111edc7545
932ac649097a05fa5177783183d0375d5b5dbfb57b2dc4b91bd6bcefcc27c055
53a9248ca41355203a86b2468878867f8530a7d5339f7a1670d2bb597313595d
dbb1e38176e8858b407a0a5eab2044bc46ab59626e717ed8f89a68fabc41324b
f9844b1bb056ced73443c08336fb84d47b6cbf8bc0971b595f1c7382b513dcd0
47c83bcbfb9965299296afe150ddf134c6ac284e214c91c948e6c92d19777dc9
455ea1dc116d6c4089077c6027b34c85c2de0906fc975889d01da0c4251e264d
f2d844f7668814e338229b4f28e4a0035a69ca677d5dc32ac2ea712d812f9c1a
4469669c00ada2fa8c80991636cc733411f506eb801473f37662f5263fe63eb3
2b58a8f064d2eb489113449ca777a98b1b6ba90d43c85268f7503ab53964467f
c3d1173f792020ac492d537d4a23340764660ad1b1790779550093812964cb56
cd983a352d8a006464bcfb010dd538140de41457e0107bc9c1df1336aba162e9
5cc8f98cc04b0a6b5944c5b0aa4422e408793032cca3a0cf3c2f87acab5871b4
7000161ba802b57b961ff983dab8b97fd274eae02d774b3a272a9c19627eeab9
9271b2948f293972d095cb53078235770164610de3313d060cfa0929914aa622
30b4f9501293a447ce1461a84066ef8193eb673f12741451915c515c0d30f115
739561750291361a510ba7c7f8a6c95f1bac47f20d29c80064a4cc80079585ec
13f15101a8e48830cb5dbe1365d919cc4279bf26a73dd3844e4066431258a802
42c5aa96764201a7a1215c10d255f9da4f280a8174eb88ed19c6fabc8cb0009b
687b6bef81422431847df8ab756b8f8b55a7ec0404e76979d5a63354a12f1227
4733a434e1562f13e3422547869c431c648a4d513a9cc64c958f4114e1b096e5
e06cecc690e845a126459e5858758b70422ae0124332bb442b22e2096251c8a9
f4a4834a15a0331111bae469e6f19d6d8584dfe6ccb4193ec63675ec7883882a
246a80480234778e36a83b124b8123a39af789774011c76a10778360d670943f
a21ca42c9a9c27c32cb31042b41d806b12d0f58aaef69781328c77db1ea2c085
e9541b1afbae93099facc107a9620aa663c261dbaeb5427c1af62126fb14a320
5e5501c287a7af41957396157c2c67338346772a5091f223962cc2608f4c3722
d5a1f15c06566a8ac44133a5027f6e99b49db64fab9c7aede37eef234f55c611
066294a595c173a9747bb5a5d4906cafe36ccea3908d9c13a0b5cc7b2cce7ab7
7f69ca2c03ca274a9792552a2fb00ba3cf69416b4997b42753da646526a34bca
e94ef9dbae10100a2cf03bb241395f5b818fe9c7892b9c9beb98b76029727a28
8f439578a0b301154fcb96cda45acdf0720eb0b02c97278ee1834063a32b3ce4
2dfd2c13c215731b6bba8615ccbc58a93d0861da9c3ac9a746ce65922e8b8c15
18c03a104581ebc5a649b51d8a6c8bbacf7caabfaef61c2ccb57f9d8273b27ac
8b296e0df7c63d8384d524624547964c298052ab65034aa2d68ba8d08fa89da1

TH4 (48 octets):

21ba0b1628a1197321a2d79e29354143239176968222aa6923b809e9b9db723f
3bbb0ef191823abca90904b450185449

EphemeralDK (3168 octets):

dfec2c13978cb82249d5db38ab6bac3c1439d1b58232a2b5a4e94523810db4eb
11c778360e6952a202751a118cbac37afa730930d258b7315c18f6ce4cb2b38a
1a8eb6ca2cff12ca06b28ff3437b0c3a60e4fb5fee9703b512b74676b29a869a
41a4c7bd7768bbc44283c24e3a7769e0f8b1cd8ac41116ccba00c12e7a028084
af1b209761dac7705215a317bdfe660b9cfb0900bc1963fcb9911aa62b306cc7
1a4b09b4c0fc0a879c313e3a28288edc3af10a9cc23370b85cc3410655613a13
8249aa7f317e7a51246d35a1dbd69db83b9432741819a218f4680d3f830dfa16
02a7a50b6e51526a16663b08c1df093956e84c8c311961e238e1804176095e07
ca90d629c5b2fc4ab7a7cc7c6a2fc72c9d40b5ba7a6a91d3f35c970573951516
cd6c3a66170fe5580013061cf58870f5c02a65236386682bf8b24d3809033a50
7db851915d630db4812942a835e3944631459fee1cb7cc17b03113ae62eb87c6
a330cc6c1926026e547b22d8e76a8fba28c2398469451c226673a1790d63f67b
6a3209b3985bfb434aea159f761482918abc924c46ab12a2289ac288447e1051
59a369c4509871fc33120e80134ca5922e5b8151f3821c67c6c937a570e24a06
91218154484bd42b4e8321b80b4fdfb9a80a051f468036fdc0972a993735e39e
5df26f74c4a6055275cd0277c7cc8c6cc1a1a9c7823972c146b239ecf64cca8b
754fb29454608e86b85701e6aeba670877637aa7aab27be78a7333b863168ccd
644dcd64b7864897f2f511d80019a7f2242b864e7bd263eda993d21120b9c785
4cd7ae059b4173bb442a79b54cfc0da7953fc59b336d88322e553134ba8853d4
8b3a2865ce203c47915617db8379f5780b3ac0afa23ef1617b8a2608c9eac6a3
f58aae0ac5801314dc29c69f0196b2d27df665bdef38b05b2641897a613c60b1
1e78ce7b11a3636803797b7a63b1971a065338a78dda934941892dda39763305
182e339bf586bb0cc06bd5c9b8a68640348b2739c6cb88c715dd44420b529627
658a70aa5348f38b410791c76c1470acb3699951fffc939584809aec2c122221
6a4c822e968074d0acbeb244296187293225d2a1401beca841ba4ff04c31d8f8
070d3c0c5eb5875295273df9b6aec1b4735c32a484b7fde7b8cc919df3f67ad6
b81539a9b8e6212b8b06669a063805260b7a4881d427b4fde3a7343956066932
5c48395eb1674c3b0bf20473028112bcd049dd083cc6322b2ed490410394ec54
c847a5392a21b2a22288f2250b026cacfc11195898805cd03b6d852d10109497
da892f103833d700e5c636608968b50bb202cb6d4aa7428b895123c41d5831c8
65a996d8681ca6545351aa0c1c67479dc75a10a7cd17ab80f46689caf81630a7
a000cb5150a67383fa39082003135ba5314595b3c446d5497b771ca98a321d85
a098354ba582b73cdd4a2ce566ce61c488e4468eca036b5791379f1a07ec4466
d4f0b7e2564f9043c7d2fa3a5143091ac603810c85242311dfb4c8ed11c5016c
0760b1a9dd072fc6e97abb78852ec9747e7cc087517580679fba6b6493e762e9
bab8a34ba8e90cbed47313cfe35639959c31b51c571c4d0aac74a7876a8e1758
bbe28fa995ad06c926d7897697e9a050f937e75535a3cc4a94a03e33b5309186
c32550c2ff5670a4ec216271202d793846d707645989d8c7207a141d6c26b2a9
6c40e8198a92937c13961d5a2829d132b28bfca6211c02bfc3aca70468c51978
677325666919bfc5c498065fde3a244b2762f75a21e844003f5b0ca272880ed4
04c7a83bd42a3b56eb66f58bb566136b306c6864393e378ca6235b697e565c25
e95f69771a1de9bc6ed9b1cfdc3fb6d5a6b09a6eff0b465a06237d38bb0d1270
5137aa313662d8031c54731270824b295274f4f5c9a871b97fcb156d998436a8
051e0a4515443ed1720c1ff2026e4404bf0418e090c251fca43e85177ef3bd2d
3759800995a15770d9b0bf1d18aafa1b6a53082568365359bb16c42b95884427
dea09efc236092f58935fc2dc6c90d651102ea75721599c63bb59ce15804bbab
48c25108f7760c3e63b7c9d4150141c7096b3ce01c7b047780abcb10a208c120
2b1595bccdfff591b71c3a8d240b88c5c2997001f09a0e5e8b65c5e57d19812e
a8b74390811029e444c0b8925e1387127b8755fb3cb97438b08563680952dbf5
08d4e38e0603a66f0acab2c05cff9676185aa71e8794f2223f6db62c53a92ddd
3a7df4fa2ba15c8489233f5729b985fc4623824dd7354dd5775a0b6903773669
3ed63350a581df567007c906066885d68222e5fc51e3b5664595a3c72a7a54c2
856a6b75cf0728242626eae43c249530f9647208b63636558b785229ce69461d
f90347965553678d71da3e319834a36204b5013d94d08cdf1a159e734a959920
29e57c1390168b0c67e8c173342907b43691adf4adb2d52ac6456dc040b9a1b0
ce45ac0b59e1c1cf238f6c54c371742ebf94444f3443123581bfe7c2ca426b3a
d41ea37841c5b1aba1e5a90d8a98ee26a6823441495819b3c757c60b89abea31
9f3b74c0753eec1245c78a8bcca8b0790309fe159b26e0b7e3f9cb3b44012ce3
74b9d33b0c5254b36275fc0a387c6271a85c5087e78dbbec0f146000027c9e6f
461008e5c955f1ca1c7a9335363c7d14a81da56829278932c849c62261ae0991
14c5649de1a4cf3ab0a7ea3bb095bc488862a6940617545a95b085207525fd99
299286751a227c27a4980282bdf5f284b998474825bae4261d406080ed33b807
bb75d2b40ed9b43ee91bac0c0ac4df059c77623c3f861f694ba7aa2b3a4d8b9c
5149a5d25c5df9f033ac732655213c9508a03f991280b459df95122394b22936
13fcd2152b6743b8727cc6c7610f4b15105b01f89013ffb3719158b02b094e00
42bf182b0e5811ce101c18d4c1c59a1ac49f1a54fba75861cbc92722926dd80f
0475630c340266d87746d345dcd86b0ab1a30d6605c99b17a5f68b03a270f3ba
8902a58be31cc9bad6492504d093c63e03600b99f0700f7523d253cebef610b5
53c611a811b0d30283d93b500692c0c66d65c95a218990312a0850912de7e2bb
acd5a03c9b8df9db773afb93ff3693c1d2ca01373c6b64cbbc278b01999c9c59
4fc2110377c8561580321dda0099580327b441b52c85b9e55146913439cc3561
787ebda3631a92cad4f75b650342eccc054b8a43df4b8ce452cc755179b8418b
760c5304251aad35c29626ad93e26b40a0741ec87495a35e1e517a5e1274e8c8
a1a9677b265c6cbe387765630d480b0080e98cc8d8675aeac0236cbbf8a71b47
73bc1ce23c2a4a9ca703b5f3bb4863e081b6837c6e5969d8074704271e1d9453
8f54a29e3791dcf800471438ccc21cbfda34492b7e672770ee973b78f766252a
a7ebacc397fa6fc489cb9865483cf0856045c131435648112a6a76b65a157c75
c2ae41a66ea3b878273838af73481018a29a1a7dbc3580623526c9c00ab68505
e8b37798a20a82ec365c073838273fa03909b2db888a89692df45bbf56ad8708
c206318aed4171c6bcbc8411c4355991c1f05ca7113343c8cda26c15830bc3ef
5113756115d43678dfa0a2b2ab98a5516c5b09af10bc039b0964f2f1a12c0220
ee4422c83579dfd506ba287b2eda337c27290bda7df302bd60b02800ea1e5c90
81325b3711c0a5f6747e597661207b02d2e4670915461ce263554560477bca00
148010c25002866aaa7527ed97a0e86083ab1a7d737ba318b4b6afc5543c80b8
a934c4ac40b1a155af3da854dafca42ff7015525a98e9b49f3c8b28e961bac5b
80c591457ab32acd238dd3c257b77b04fbdcc2508a4e6fb923b15174f3231cef
38ada23285c6e32bfe5798a038c492e861621a198ab09a47c03a96064a9371ac
c4f71c570b9cc0d09d85a7b20638813d119209bb316d442f3b4919cec73f0d07
2b13c64c34a0255582571f026ddc44135c57b7b38b41dd7776d95476f07c3953
f0658325578181bd214b72fa2b18b57121dcf8c534ea559b1b488dc6c9617cce
eeb49e8e2b5555c408e7913450f5c83ebba26bb82418301258a9a34b082d7509
82b115cbb194789eb28290c2791d4154a0c04e53e88f9c37c101b7904e374f9c
880e99671aec3414a79bac857ab10892ce75e922b4f1c09570008e73630790c8
042b1353092a3ab5a98ce66277e7c1debcc39eda4bbc939b9b19c0e7237f58a2
11c3339fd23c668c31953f402e92b79a89c1b1b416a8fc6065a5c9ba2dc43aa4
080c2e860dd34a4e332b0395aa6bef474c813c57916b4c10a3a1997c93029aa4
3e9313ce1203329d6a1b4863c150429be93f00bfc7f3f7e6b85fe5595cb61b66
20c49b1a591117cb5ad4e2a9a86b3f6365c8831eb88c730cdc50aa1132effb0c
2296ba1412acec2fc9a0c0f71a1e479a49f3773c497b685e6eb1ebbf6b1a4beb

D.13. CONTINUE Offering Proof

A CONTINUE with offer_proof and no prove_peer, carrying proof_pad; its response proves the requester and is no larger than the request (Section 9.5).

RandSeed (8 octets):

000000000000000e

Request (3196 octets):

0c7c01020001e97b35949d7de919a80a59dc6a9be7ff11b603cbfb5d3ddc7a28
b24e3d2ca52500004d3911920acad0b17e2255b732d965aeda7f44085ce0e220
729c2606138c1a370250ca45307853701c35e3dab93aea4ff917cf03702d91e1
c07c862deb8a3aab6305e2172d7ac25dae45abd2b654d00899aba900636544ca
411d37fba953d1cb96c3940a6b183df2a1c3982bc3529f7332a2f202c18552b0
f81656b6487bda63239988599c179d1931a755d7caa1359cd6b9ab9f899e4414
ba18aa1ecb863ba9634fbeeba561b414b6897804757ef060b3453c8b8578c518
f975e1335dabd5a673bb3301d32f497237efca99387223590ccf26c5113c4814
f8b61ed6f60c0fa0470fa4613c499a1d2a5f2e62263b9723a6362d5b411465b1
7b6110344bf3cf827c556449ab6570105e228e8192bd8415c469c98c17d0ab9d
475d595642fcc55f29a6ba6f49a06c20771ea8b03fa8859d1b6d03eb25a392b9
a8bc6ed3c1867165be4f297dc737115a1aa90e95717a89cef76328f6943ae4b0
07c6c48adff34aad3848f309a5a6ebbdcdc6a2a2a8380d2219d5f94e50e3901d
d40faa4080391697bf9253f7f11090057383018c2e64734ae29dbd4bc821e001
cee1551316cffe586eea13448719c0052705abf186f94318a75ba3cb5028ff00
cfa6132df3e521ed34c0aee38524a15a470777ff17a699675d55f9198dc97999
d083825cb74801275d32640b499b31d2353c519ce4a6743470c714c006c62333
f1852c0aa6b8419908ee864f5c74bd2fe9065a8bcadf298ba14714bbc2386649
9d4bb4ad79a0a00af9c3998c5d5e87b4f862251f0ab27ee7a38aec9beb54ccc5
653919b754e52152fca40dc790cd542491b54a290ce2215d323e5d501f4a8122
e4089d4905c2bde41f36d7273ab08937063c4d9166a2335216334e8540a55be4
242c06229cc912839c9e281338015b975cc0b8a88b3cfd9a34079b5851e29b10
040623f04469a6bdfe694cfd696cd31731a4d0b7b714ab0d7a7d7c7521398560
6c4382e8844f23e588ff95874997b547f372bea60e1c9b146c1019ca902ce5a4
8c3e44b3a8a94bb827599162b81bd24964346a208a8257f8772cd80c287790b2
0b334b1c508f551a7d1b3ff7026d58e76ef031af4aab5debfc882b808478d390
737a57b3c4947e526cb4612a80e6c0ed567704669d9e9c5a51eb95b1658d95b8
5f7223bf1b589ff8a31ef5066a1beb285779c1a8e2b66e6556a72c760746549b
4057913b1a48d348456b842d1b6afc5cb654e7593aba1e283a7b53f153aacc33
ca0bb54e480fc24004c529b54f18ce14c69efbe15a83db5569db298611a7f07c
be0a0832e28b2bf687106e163ab6257df871ce1110c8ce3bb4c1c3c3fe2705ec
e73ac832c68e466dcf199adc33441224be9b7548e320b3331185262325768815
3fa89f0ac1187045ccdf01a8f49649a9bc4c05b0358d6a36a5c0bf59c489819a
65ac77a67b851fd9585c0310511c54c0f19a403218bfc8902a72e94ed6b2cecf
b4903d6b66942205553bca4aa2c6330bc843619afee7448519a909a7572b7992
d4678b6977cfff5b749573b7646bb3ed90b548898ef233126c5229c9b392f776
c51f31182e937b20e53050f167a785372f7602a4e2bb9916c6f88a9132987c7c
d2c848a1b854170007a3669ba0724f751c4303683d2ca5c8e94259cc2e1759b1
e389685ad58f20a37c9529bd945b5521b61e4a29a463684658056af296a9ba2c
376f915d1ec47ffe53b02b0a53d1d11c1bd569e4d7c94f8808e33685b4ac6a9a
607cbc11be04670728f18a27b9509d927d0274599c75555c1c7b383648ece7bd
13b07cdd65499fab369e57a6d2753ae10940173324245570000d7389b06acb1b
12c1d514f81804eb9b7b4ff6bf4a8c453c2450537191755b7e13ca6f01f049d0
89c49a6b9cf7874b9c9548b93ccee20202fe4c776353aeaf6943a60425f33160
d72886122901041c4970e510fb53cf203740eb291f61e96613ac39c31b0cbc40
03c96210a7c383b7296b4d0a249c0c3cd5a7ae2a8aace6dc37eb164d3e6257ab
100bf88c92bfc88b5fa6127f4a8420775e61655eb3765e47b17482a90bbca845
2ab4ce119b089415229945025fe9ce5b0b7d93d7afff8307410c9e30dbbbd2a8
1236e987e179267694995c6269eac5525d189e53621bd0492224c1be5ac94d9c
6779a96601907802ee12d22566327da43dd393e871fef7f7792868eab9776524
d3cd8b18bf114326000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000e0818c36d6d6e8218ef9bb3c7fa875087303cf8c

Response (3192 octets):

0c780102000100082eebf880500097ad28b8dfbc8a82b34a20891cb965f45d26
4a673b30523a0be5309802b7cecb0cbf05749bf7ecace73f6f81692042d8e7b3
05cf35aa72d8dc11793c60f6e6ae56d094617a235d1f6c1e0bbed23f6e86d263
507583d9630bc65b123d8c9d6be5883242a6670b3339e845af7834abef431dbb
da8edd3a3ac8f5ae655468588647d7c489dadd4f8be2ee0a9b37a7d801e87cac
2e998ef32da739d6e2927b0dab0d4d6ad4077c3efcc9505040cfcd7238a0b820
9954cf210ea3241f38759f09587b5ac7223077fbb89d9e4347cd887608f14d03
8416875f4dbb9fe923185e13391ae2887046924f62993fb03a7f01aa36c33a4c
7387af1091e88cdb8fe0ce90a27cb60b06e88cade5c452d549f0a89455a2fe96
d85aaffdde672ac043d05ecefc6857030f297ebf6459eacca2a38aaa018c8ef1
f73b69b2e38e40967bd93d30ddc4a608369ff2c46c75b1b77c46299581f62046
004ca32cdaff1ea5ae61be4a4b176c67ea74751866677d056c6f0e90b51e7ed0
17d8e79b3a2a66edf466993a577ec25812ee90e1f7180d446ac5af572876136a
660a59902fcfd6cc8dc417374c2de2162523ef7d825aa725adb34c1183debd88
f44c1b257fb70757b4ba086367f6a9b5ce07b46f616e2f2f9359ab1364e048fc
dad5b95122dbb6f8ec317e2a6814cbf896c7aaed0a8319bdc42a25563182548d
2e587f66d692154f6a51f6de52621772a67fb40333f62a41077458714f6bac85
716dac9e4c779e20e3f602f67ea6e682390ba489543197109cbece1981b8a403
8a77900cdee89c7a39cd1ea587f7eecf06b421dcf9058c8fc2beeaea1556572a
6736022523135085380eaba1799f9768484cb88fad57c544afdb9bf352881ea3
ff1b6da9edaa2f6a75965c1c6735a1791988912cbecc4f0ab89a082c229e3d39
635b1eb9b1990351b0f49536378fe6197e419326b893e7452b9dbe1ed3ca3d39
289b32faf3d96426581135d665841ec2eb17a765635a5ef53264e2e37421dae8
7c04567c50567ac4ecaf4ced5820bfc178e918c764cbd3ae7c9b5b65072fe1b1
0cc49ff7778f245366083f98d464c18fe844c5ea4914d0c9408fa079e43cc97c
1493a61e4899c9a15e5ecb468d432ef542188e8dd4c9a723693f86909a0134ca
49e531379a11930750abd6f7c3b7fd98ad9268b9a62d7d1373d1a4beeeea30ce
f4bb63239e0e302967af1b4b6e2dc894bad226bb30440fed1f82df86b443080e
b3bd474715a737c825e26b2ff07d41db82df525974f6de6439d6afb559d1db8f
efac17e5db8fdfbd13d88b0844a9a992aeef680d8a628411fb35000d6d4eefc8
2148a3eda0df33242dacc94bf3d61f8e44b719ee9bef148079a342e107b569d7
c07e27812e09675949f7c919af4f47014dc730b461bfc416cc07b3a843beff90
499d3531eca1e3c94fa68f700729334aa08b3e195411a9494bfe1b960649b843
1e09eef3124541181a4b1d502fdc6e23d88889f8ab14dd80a80405b40bbf57c7
89ff53b309a6773a8bccc4f6980d3309bf1dc2e1f0dcbf295432fb096620f29b
0e2f0edd3b8490411067a28f10048f49104f2302a51fcd5dfb2038a132d844f1
69f93711cd954fc7f2d5fe3ff25f4a3ea9667c6bc6602518a8c5c2cc57ffd326
00d2a8293cd3c504862436186c2fe6a535bafe07b5ce496c7c3976dd07ffe3d9
3373cf470ebf68102d9102813d3e4c592064cd63eeae145ed9223a771b3cfaa0
d7b7a9de754b6af9b67760815d7924dd12eec45741e5ccc4cf3bdeef5734dc26
d2433576b8f0c424d49d5363bff75437b68ae5746f482632608d047b54bde279
11830c77e0a14bfde740acb7382f23bb37fcb463b9ed58482fb2b0fac0988d08
de45895c506939353fe33c2393aa6472c38934b5dd5906d965a7d06a61ff447c
e88d2f8fef83cc1c3996f6bc2baa4b8c60dddc0ae64ed36722a28951022762ab
3aadc4be1bc6af75ad762914403624d6638ccdb1a0229a5692ddbdb6f3afb1a5
d6482b46e431563c868e90142be5f2431ed12381b54bf829fb79ffa7b1bb9460
8d78d208be6e8fe5cf58d2cc129f3bba522a32f180715cf44afdab04d0a7b856
98e441c1617db50f223b22a8f9e9f1d55799afef1faf1f039cda66f36a951e4e
0024fa77accd0dab54a3370a134107371345b8ecd971f1513a8cd4211b313585
1a3931de875d52d86eacbc88282d5d1a4201f7e6bf309dbcdd33ce6644e7d9ec
db61dd200f11292aebba635bbceef6deccede2efe22cb967d022ba18abeb9361
8eb1c51ad91c373a98e9362d81cf5aa6f49e0815d900ea17242880d5ecbfbf02
857998d7ed47e0eb614baff8bbd545bfa253ae28736128ff02c09692cd4e1f0d
e2d29914595acdbc589d624bfc8b1236e1e8e1363ab082edae5c66c91daa8f90
c6ecbbb713f699e1027858658ade6f484b0ce4f990597161c0787f351c9b13b3
8ab6ade5ef5395484e76d19763a88e4a77f822ec4c087999abba92728ae019b2
7042aaed5390d9ce88afc3f126918bc5c32f9dc89367475e8516998fa1912c4f
4dfbed20f540fd89d87fadb0ea19387e4c46ab603bdbef1a402ee8b62c1b3f12
413f478f8e6b61f5ed4fbf562db5fcfe68486e6f77944dd8e28a83ac3402aaec
312b85ca381c76acc30a8ef6198f9cbeee51e985904baa4ceb0a6dba00e40869
21628d7b8d4bc39e966562619fa623e9be1ffd0a42f1b389accfa76615e39ceb
8461d9fc7eb83020b8effa3df2725a64601a75560e828584fa6b27d02284fa54
278ecb6c29e93fbfd8530377fc1807e3395ea411bdf666eb66ea1ded58d56443
155c32618ef8d8a82a4484968317687b39d6c6d5dbea63df0261ce8bac1b649d
a56ee63577d1986ecfeb3c0c7ed42a7d7640e41f7b8f6ef32fc0d7a47f97a187
4754e61e7d1a6e67e524503a100d8e03a334f2371aa8113fc00e6c312eda59f9
5fbfbdfea5c382dcdfa3b72734cf8112ed87625086deb1e77c70ed1367d87f88
cd798dfdc4a9938f01bab7efb2c8726271181bc8a0ce7f4d446a14867b7cc1e4
a5c401d0dacb223928d7fe7ddaf08c33529f6c429445ebf24213f757fe5cab53
5ca1dc2603f0ba42447eb35302c4182232b9afad2c0cb8f4398c7aeec0d33f6b
251104b4ef08ff3fbae18e4644bfb54c08f31a8df0c189b25d68dda949b7ecd0
a16c4aad412a238fb850d3d4684ad8a8adf16ec447488e2ff014c27531e8a6ce
e2655551fb2fa366cfe69beea73682a2c775dc0968b0b0e90bb5cd461b834d1c
d260462d0e6bb761bd07832ceafb3fbe3fd4f037b8daf7bcc7985ba2bc8ce1f6
9c6d2faf2ca34c835f37ae7127cfac98d85d8166673235925b5806e57c51b3cd
1c8dc4c401db686dc64e0dbc4f9d88f1742f78d9e666133c4d9706ade00d3c1b
975810d55bb55a2eab7d5a89466263eccba36d2f47f51b911087a2b496484126
c54d09539c9cfbf45c64ec852f684289834aafe9013d2bfaf4ad7d0a9c06768f
49fd8046cb21d38fbad15f143c2c52563d8c3cf28c88a7ebab301960e956b5b5
b507e2bfd2c0fddbf45f9dc8ddb8a1feef0744759a4842167a3cf54c4f5dd21e
c2f0f7aa5c719ce19b7e807979d0a584dd7fe842a057a78404cfec5c591f94f2
6a6ee2d99ff024daeee71a65521e1b1100f4abeb42c44fb15a7135cfc292cf6d
12d845d379cb9ab8ae8daa404a74465c581876e677ab177bba2dce2a12598fac
57af16e05e913e81dbeb710fb87dc36afe19e883c15c148bc1cfa1dc00ba0abd
07f6a0f5d6c45c157dfd82771793a5ea92a958613810c5a853cdac8b24e1648d
f581467adcc28bda2b2d832e7cb5d335e0f58f7afd080556d9a06013fa68c7a8
635112d0546ab63fdbf3446c611ee6a7d23c606901156101f63468ca08557b67
62744acf9dfdcdc8e129b494927dff429c5b55dd20fd38f40b1ca712a03e877e
d4e76e433c1d719cf05d658d1ea5945ff23c70ecca068f8bf9a1a4a0a076d89e
bb8e868e710b516bf3f859fbe87571b12bc60f0cc652ce223205d95382324749
8202f4d434638cacd099f3dadd1fdb3f3ae8906086c113c86156bf2e85e15f0a
af7a0d44d9aef4b2d5284c9caa50a8595540868a8d96134703f98c69749b4522
9a7f113e527a15bbae5cc8d6fc9dcdae7cfbad9cff82e5d9be77f37730bd483c
22b2cb232177c0e688b93ba4ce22412107bae31a0b5197eb668bba1d6d48ac10
ef474b16c0bd8dca4c540007d052573b175f076cabf806613cb0dc40a2b2323d
eb00bd1080efe1a9e8d4509e737f8657c8c38f7ab84b02dadf4322700a3902e9
1d99ae0216e4b8a29dccdcbe73149b70ca2d4c70323b3b593f63b8588281735a
41b5fdf59c37433257b2495a5db0fd7806ce9389dd1f40b32f6e2b2bb5f80fba
9a7913c4e7ecbf625921d8445fba4d0664080fe6349867eeefadde353ae5a487
dd62aa60091db53ee22e0bc6ca25267feb07889ec64cd4a6

CS1 (48 octets):

63ae22acc5cd4ae9f6f44a78c10da585e28d4e72e28b344acba62efe5c8a924c
eb647f08f5c316a21f9d2558bbe60894

EphemeralDK (3168 octets):

b443cf3a310c14d45464ac5bd01bb694b19e78450e3e31026179b2deab49ee82
cfd42c67213a3fb0d73cccf5348b57ced3b6c533261704794ae86ac0b9b1b134
99b70ff1274773b28d202c3bf296fac19eabec5a6ec306bbca1fac2b6577f40f
b9a33924b83b6ec274ab2a6921a8b9cc93b45811b4cbc3906fdc54ad76a712f3
896574400b0c134460b987899c62ac6f3925090ea1905018bc3e53b3ed441284
140f1bab2c6211891e398cc8dc6a04fb32b14b2c87012a532c000a6cbeb78ab5
bed4ad5670bb77f041c0b792792108586b2832845419134fc5123a4688a8b43a
1525345fe97c853fa7ab4914c5dfd33f8829b0b582a8e4f3088486096d199f2b
f2b06c720a99f9133c6ac34655cc77d25bd25798bd6580d1a24b024c8af7c9af
355824f7db928f831f0fa34c39184b84f82891a8580beb597909ba3de8afcee9
751aca4d594c1a01309d82e4cd83a3ad812b3d9ec226d349c7bda7a649560ce2
a48652d1cc65cb689346ca6da3a95d8005efca4655966a3c9a8fe212bfc14814
4227873f53a807d3c84e3b0c1225059c14cb5447a0e5d613e517a22fcbc19e17
2936a3274102254ee2ac2bc5c8c47a12502c8d84178ccf4c8782703f77d98790
58b6695018bd021a2345c73e10a803eb8f1b3b38244131d8da5655c68bca332d
884acc032a892e90b7b8050575f2745f8497b7da5683e04f81d2baade8666cb3
1bf81bcb4dd00c886a6cbba91497dace22e5300070579ed5c095896669d6ce1c
a5bca7c8a6fc38c46e51c164445d621372f50c82cf9a4c55983d63b8720da919
69e45139048ae4b96c59e2901424893706ac8deba99e98ce62261632c222ed63
80708a21e4366a16a92749d11ccc890eec1a9692171cf837636181ac81f56d7c
179fcf7170a0c1a89af94bec8894278676a6e9077f15b3c9574ef6747c9e1577
df733cece5ae42d20d8d9b1db4bc2e0f5a1f94a5789ff22519196504e46761e3
5c9972a48bf7ca6a03cf1a75b30dd32917e3948f77983c856a964645be4462e0
ba223f73b6ebfa688437c767627f485b29f2a8199d0a1ef211a687d22ab91c3b
76d4c2792b00b6897b625c88dd847cb7d90fe54762be7b8bee63a8733b769748
2b1f687e7c726d749b8219194a25b24f59490e7f8b55b5125d319bcd89289e4d
3cbd60214aa38427e6733d77bb3ccb0c5ede38141140672186b8e0a232c144a8
2c9a3a7917665eb1b4c67a8bc281877d22ca255b1aed4a6ca043a74cb82a71b5
a388640cef45bbe7a956e227697381c2c7b344ff9abd8f5000c54570fb373c26
47a735255939b21eb8327ce8d8c90e52bb83b285cda545e35a43a7123593a479
4a6c447198884b7943e6f55387134e34d94acba71fed2b3eafe4a90a2247f701
b855e53019b37dc752048945b1e7aa91d45b63cd1052a4703b33a267b9d10f57
7b1754c245495137465c3dad0a41493c82d4aa01a3213ef4055bc19c2c16a259
86c251303a6543130ac4c91420bb97433688f72642e381363b36b70e77bf5503
ccb02c53d04b9f13158a33f68d87a43b3d9685b7e518ba05822591ab1a149e17
f6568fb26778a31db44179fbf08513a84a71083b5556cd89059e7d7ab20a4c72
f1a01ff8751ee7a14b867c35c3410f0fd38a2bc438a00547b3d99806f280b9f6
57ae33684f453f1a920e5b6b79bbeb5777f81de005350550c884315b9f6c012e
71517da6a40de002b158b3742a09ed049f68d8725211530bcc2046363ab1e901
e690b761b75abaf259244a6053a4218c8230c8d443a7323538c10b2fb08e2bf5
b709fccdb8898143f66b844868ab5b5c36357a62e318025977d040772cd99604
453c3413ac533abc1cc23246e0c48611336a8b27f8f98886f0c1692112d40a2b
0c75259ac1009cc84e7cbac5b15a67bed2b760e719c3a6c58a20284a3a724874
958e6c9009a14c578a203d5188c57c684802cc18175eed15a1cc442ac312b606
ea0a2c2c0fe9c29aae89956c09ce5ae1bad4a89323e8bcd28c7cae8c5e14d99f
a2f8196cf9bef2b48a9fd887ba585031e97bec5a6b6632598d367ffc7ac23f30
1123074bde8440b8507a9d429f189b7fc0da3e72a60ba9f66873823d7e32be38
5724578442a7637c7e958e722c9469872039928d7c294349462aa6e139dd3933
4d3911920acad0b17e2255b732d965aeda7f44085ce0e220729c2606138c1a37
0250ca45307853701c35e3dab93aea4ff917cf03702d91e1c07c862deb8a3aab
6305e2172d7ac25dae45abd2b654d00899aba900636544ca411d37fba953d1cb
96c3940a6b183df2a1c3982bc3529f7332a2f202c18552b0f81656b6487bda63
239988599c179d1931a755d7caa1359cd6b9ab9f899e4414ba18aa1ecb863ba9
634fbeeba561b414b6897804757ef060b3453c8b8578c518f975e1335dabd5a6
73bb3301d32f497237efca99387223590ccf26c5113c4814f8b61ed6f60c0fa0
470fa4613c499a1d2a5f2e62263b9723a6362d5b411465b17b6110344bf3cf82
7c556449ab6570105e228e8192bd8415c469c98c17d0ab9d475d595642fcc55f
29a6ba6f49a06c20771ea8b03fa8859d1b6d03eb25a392b9a8bc6ed3c1867165
be4f297dc737115a1aa90e95717a89cef76328f6943ae4b007c6c48adff34aad
3848f309a5a6ebbdcdc6a2a2a8380d2219d5f94e50e3901dd40faa4080391697
bf9253f7f11090057383018c2e64734ae29dbd4bc821e001cee1551316cffe58
6eea13448719c0052705abf186f94318a75ba3cb5028ff00cfa6132df3e521ed
34c0aee38524a15a470777ff17a699675d55f9198dc97999d083825cb7480127
5d32640b499b31d2353c519ce4a6743470c714c006c62333f1852c0aa6b84199
08ee864f5c74bd2fe9065a8bcadf298ba14714bbc23866499d4bb4ad79a0a00a
f9c3998c5d5e87b4f862251f0ab27ee7a38aec9beb54ccc5653919b754e52152
fca40dc790cd542491b54a290ce2215d323e5d501f4a8122e4089d4905c2bde4
1f36d7273ab08937063c4d9166a2335216334e8540a55be4242c06229cc91283
9c9e281338015b975cc0b8a88b3cfd9a34079b5851e29b10040623f04469a6bd
fe694cfd696cd31731a4d0b7b714ab0d7a7d7c75213985606c4382e8844f23e5
88ff95874997b547f372bea60e1c9b146c1019ca902ce5a48c3e44b3a8a94bb8
27599162b81bd24964346a208a8257f8772cd80c287790b20b334b1c508f551a
7d1b3ff7026d58e76ef031af4aab5debfc882b808478d390737a57b3c4947e52
6cb4612a80e6c0ed567704669d9e9c5a51eb95b1658d95b85f7223bf1b589ff8
a31ef5066a1beb285779c1a8e2b66e6556a72c760746549b4057913b1a48d348
456b842d1b6afc5cb654e7593aba1e283a7b53f153aacc33ca0bb54e480fc240
04c529b54f18ce14c69efbe15a83db5569db298611a7f07cbe0a0832e28b2bf6
87106e163ab6257df871ce1110c8ce3bb4c1c3c3fe2705ece73ac832c68e466d
cf199adc33441224be9b7548e320b33311852623257688153fa89f0ac1187045
ccdf01a8f49649a9bc4c05b0358d6a36a5c0bf59c489819a65ac77a67b851fd9
585c0310511c54c0f19a403218bfc8902a72e94ed6b2cecfb4903d6b66942205
553bca4aa2c6330bc843619afee7448519a909a7572b7992d4678b6977cfff5b
749573b7646bb3ed90b548898ef233126c5229c9b392f776c51f31182e937b20
e53050f167a785372f7602a4e2bb9916c6f88a9132987c7cd2c848a1b8541700
07a3669ba0724f751c4303683d2ca5c8e94259cc2e1759b1e389685ad58f20a3
7c9529bd945b5521b61e4a29a463684658056af296a9ba2c376f915d1ec47ffe
53b02b0a53d1d11c1bd569e4d7c94f8808e33685b4ac6a9a607cbc11be046707
28f18a27b9509d927d0274599c75555c1c7b383648ece7bd13b07cdd65499fab
369e57a6d2753ae10940173324245570000d7389b06acb1b12c1d514f81804eb
9b7b4ff6bf4a8c453c2450537191755b7e13ca6f01f049d089c49a6b9cf7874b
9c9548b93ccee20202fe4c776353aeaf6943a60425f33160d72886122901041c
4970e510fb53cf203740eb291f61e96613ac39c31b0cbc4003c96210a7c383b7
296b4d0a249c0c3cd5a7ae2a8aace6dc37eb164d3e6257ab100bf88c92bfc88b
5fa6127f4a8420775e61655eb3765e47b17482a90bbca8452ab4ce119b089415
229945025fe9ce5b0b7d93d7afff8307410c9e30dbbbd2a81236e987e1792676
94995c6269eac5525d189e53621bd0492224c1be5ac94d9c6779a96601907802
ee12d22566327da43dd393e871fef7f7792868eab9776524d3cd8b18bf114326
4d2b9d1f76c2afc3d737929abdc5d88a852207425750a80b641aa8626564964f
5896ba68db5b943ae22868543c2d888d8968059075a5dca5c3a962b764bd5f52

D.14. Negative Messages

Each is dropped at the stage named: parse (the cleartext does not parse), open (the sealed part does not open), freshness (it opens with a counter not above D.4's), generation (dropped before it is opened, its target_gen two ahead of cs(0)'s generation; a verifier can open it under cs(0) to confirm that is its only fault), fragment (the message packet is refused). None changes state or draws a response.

  1. reserved flag bit set, from the D.4 request; dropped at parse.

0cc500810000e2807d9c1dce26af00ca81d4fe11c23e8eb6752e1f9ad716c61f
c24f2d80c041000000c95760d41810e7058dfab0c20703432653a0b716a9d7fb
970d755d6d9654bec89f8809377cd2505cf67771fc469309b86d503f7aea94b5
0395357bba9861070c95adf950a73645b3c5547616d50101272d90e4926531be
e76a3c8266325286a3aed64e3f23c8250b0a81ccbe42e0b3ce69331a2cb833f9
939bf6c0cf5b0a382c179f577b688cba1dd966c1b0c0f9240ffb48358f09cafd
6ab20c4205eab64bd91311b431bc5d1cab83730e8da3822d5c88fb2796ee08b6
bd8ca16c01cb9ebcb6de22935396457d6c291d8722b67c023fa2bd66f7147f3b
5b9b2b8a1c6507222b32fc95bd20454e8b696fcafb1b7ddc1f0b08b5a3871ed0
605e419ba32f734dcbb29b69c58581160b24453d96981eb2a957f1a2908e4a08
4cb0360e6aaf9194a649d52a5bc2c0038c9ec0488c02a02f7dd46002b657167b
435cfa8577eba3fe127cdf515489875f72754ae0698320f10694479cb2d1bc34
5674ac2739c6055c558b84ecd33fdaac2b49449f04893d11d7394865609eeccd
6fc57f43a31e1682a53a98bd8916bc68c9950702236fc7b879a971e066a89f1c
3cf41c3aec29431a686eed216d3730c5bbd03738a49aeb962541661c8e806b20
773f44da40b7c857cc7ab50b007bf102ad54c181bee552fd8b1948f05a1a4a7f
c7c1c9a19a62447c570633ab8f92aa12e723fa79752b7bc770926c1ba8b7f4b6
8336213960a13c22d891bf12cb92d541f3a30e3e69b197101dfaf83cd7b13953
f1971374279fd76f9e845c7441328cf18e914230333387ab50a048e27dcb48c5
a8d87f2430905979094f2357bfcc9d2ed69f30a9087b82c2d7e223ae392077fa
aaa8f78f33f8073c41081e27851b8a8876029695bc261be3a214a5cd98a7409f
eab2c3739015d2800a3c8f96a75e7a11a1a9322725a9aea399529dc77d953232
3716b2413c83158598cc8688ef142f14c57440da51462c5f7791c030e24d1dbb
0836a426a86607a6aab8c484935c8322d993cc7055366aeb4cdfb13ab53688a0
f535ea0125cb78c8c5e037f818712aca0d2ff6480fb96e2baca8a288775e5b26
7d6b3dbd2164b045817c4b4f432473a87b973d551f36187100ec3b24e7872d86
99779398f6852650977499738af0f1bb64c95e7e6a98597a8a451894d6f66ede
b2282c55bd29bb94f7eb9b93bb06f5f1a6a5069effd36550926bc350c752aca6
79e6a96b144d39694eada052bb985fde9c9ddabcb77b6b89142603d9b8ce86b1
845672aa1ab5c510bac615099432c99ad23b5c4a548afcc4c98177abe0a0b82f
364d35b96f5633bcd3a0489b28b6ff5cbfd4356b4a904e1cb59bae046ac61287
3b8a83080788f0eb4de169ab19187312267e17c4a008000d638054a759115212
ca9482c555a05fde9868fbc93274956d535aa3cb9b4ebdf192b998c189683be7
b60d1d4075d848574d581522f993661221d26802e1360295216700944f5c55bd
fb54238df94c8d99c174534dfe1306f70992413566304a05c84a86ec9464390b
1bd3b459fdb06fffe09e1dd6175bd5bba96299d0237846a86e9b606db512b96a
22543e3420a91019b890129a198b45d9097e32588e538b68162e5f3212ed2a43
f97c68b54840f8bc573622911fc57b2a189d0241af5d8150dcf73e6f68cf5f09
cb635472a942627c553db40778db340f6a24166ba8c05907885fdab498167e18
952f529aaf0d183f168aa10322cad4656831c9be0d700544f99ce3b8c345c51b
e46c56952884a7371e97b24eec1ba918f93a931b360c05010508462fd9987621
ba4082b35cf082cc372d82e545ff9a55a9db0c712c6f82312e7f6b3cbbb5c446
f3778b069d55d4a23b674307a3c66cd9964740a2518c9f2d4cb6fbf68bc593be
b40574a101774e565ec3e9058e4674501cb865a94e0d6c3991f5875afa39b3a6
299f6c5e0bac23cb037416184e9a41725d12cf8ec282590c434e3b300ce34d8b
1224f3e57357e01031771c434aab9a624b314bb9acc345a78a1c3f707ffcc885
191833a7ebc3a9973a7e03b5d6c062a192824d7576343253d232cb34a321486c
43e3676f1a86af15f208292548a7e1513f630467589bef51533de564a0e9a57b
5b85ebd5895d5a38e662422ceab070827c9d28674c44243bf265032957c3d561
5fe02e385ca55499b109780197b0b4803dfa13289889b77837574e34d0e7d797
5f6e66b12c035fe999718feeeb928fdcdf0ed7e0f20a640a9cef52d36a707223
54d0183ed6b3e29d259b227b9cf38fb6f603d42cce8801d0d60bb67f176af11e
b0c9ebfc12a479d08769b9825bac2ff709366ed71c8a83c59ed6566652cb35ef
052adb01007d773eaa98bdbaa1d695a1bbc190b2d5b05cc541a38da255520f2e
cb6a9b77822bdfc2b80a52aaba6c0f3ec38b26c47be41801de9e09e691aa256c
e8e7fb0396300f949c55c91be09b03a5ac431a230f0c950d3f5b4e01922e6140
c0d672c92b052499a3e283fcdac3e9aedb53e8251ef93f72c1dfb09adfaf9827
a75b7d2bd8a29e9f499c76002b903987195f2f69c3ce945d3e1d574099fc6a84
c555e244896ed6fd455f9d8c041f781a22390430c80ec661e60cfd4a6d3330c0
28c4a0ccda47ced566f0255294e659b732cd5eabcafa3fd04e730f2ddc12116e
aed501195f3dcc97ada5d3d0fa32aeac41f4256873f3923216b7fa00ef94a0eb
24b357dacecd09e9fbf7c33bbde8a83b531f50dd43a02cd7831e7f11a0d6bf05
895cb2737df1343fc61f6354cc23d837e7c4b7e0b5af3164785dec26b31ec69f
14617d76eb7bf4f77325692b52149bb2a87db6a6d2b97aa927395a1283900a42
41354c980e089dbe9f50066b17bbfd39415693d621d4d3ef8ee85c2d5b19b1e1
7bc404da6d57025d9958a268abaa1adcf197b7e1519b23055c676efaddac9bc1
fdb7f67d8f12ca72781db9fbdd918ff22288b93ac2584d4103a564cc957e92ea
bbf0342ad89e15c9b4fa7647f5517398f25f4fd4cf762c12405e2510bc508883
e4294cd045e1bb40318f16ca660b4f9d4cd087fec1f7edcfe598bbc3bceb0cef
dc65f0aa8373305af77b6c6746272022df06daba91449b7e3a46f646c74fe7d5
5803bfc065de3007b857431d2e3b059976eda9c5b1bfbd9ac5ba6501026ed7db
6508c08773ac0cb85be1e21bb88dbdd05f423352237a4d4c372cf3fa96219dab
fc0a068036d73de49d1ebec5b8586c57084a66e25bde34f65a6101f88e265b4a
73a1d9b78ea152cc64123bccf05e3d01eb07a9fb0706392592959901a021bc54
70d68fbac24a71db2c0f5facb94955ec38b7531219923cae7c2382ed3dd89690
8762fa8207c270f3a515b528f3ea2419cb4a325df289ac58dc98cb4db5803601
ceff975fe614000ade64738feeb51894a9e38f72a03e4ca7773e59d0fb567d74
fabafd8bb661f9934a55c08846e9317a5b3cc7d70200a691538d6b1d016c0f2e
64199dea83475152ce500c283485790e944ab103cea373988337f7986c22e46d
3b2b29a9497b67c386e7c28b2d30e8d31ebcba559fc42fedecb9277da498f46b
d67d33a8ea6162caa88d48bcdd7cacc2b15c9d1501479f230f283736bfba5ae0
6c7ac96447ae127ff6f6de093b9d3cb7ebfd671852f2779e098c2f55011531f8
b6b530ee231bbc7b6740a0868ec8732027f75efead0f7690250e930e9a6ece8b
5a191626da3267a23300ace60c8f10bec7a2317dccae9186a1caa3bc9ea77b22
b92c56d5d2282a5464752e93ef17890436dfbd1a173dd62cfa985743dcbc63b9
87ca1917d12bb0223a4908566077c5e8b0eaf18655b0b43a04582b823b5bbfea
ba3fe3ca76e861826ad2658997d65709113bcf676c5a3d691f470b00ca7e4579
5d5a973974517ea45fc4bca296967d76e9bebeb786cf3229df80b2a7da9290d7
7e2123942fe65dfcdc497b3febdf82b374a59eb26ab04d3012f6d51f49fb740d
6b5d8d3a37de99044d39b09c2acd08e990aaf3a5f566871366ee5e281007f0dd
72f4bdcaf30c4bca5172260a4b8635c05186adb915b83ee1848d9e6d4f46f934
35d1006bd7fd8f9ebe7519fd0c1bcd188f244845dfd85e1c7c3539445bcb9685
9030bf8df47ccb66e80a5f4b408f3f5c4e12669a432b083da26e9d204cf4d70c
7da4b7b9296a139dbb965c2164b2528709096a5e6012c57dbbcf079a17163507
43ca567fccd7d6edf857947d10e97c5d7a6d46be4e046adee218a6beeaa1f0b2
694475a52565dab5f4ce49dd856dadc4c0eeb597634fa49e04b543c91a947469
71469cafa0f76d0c6b4fcf0014c68d0ed6362e7c6caccd43cd73f98c71d8a22b
7fa5b64e728e7747cdf812ad2f5dbb78a4742bd0955f9509678a2a8b93eff154
cfc781df05a004110892a829bfb3e78d84916c8e79a141a42e53965329388959
91eb028dcd99ac2b6c87e56233cd94aeee4fca0b2e9fd384e7967907dd319cdb
11199111120367af37afbc401ab2d7fc3192e007ee953c5c0b48512c55a7b1c1
9bf17bb12164943c252a9021934e35ed4bbc23101db956292cab5c90bf25075a
b92ffa1021
  1. msg_len disagrees with the length, from the D.4 request; dropped at parse.

0cc400010000e2807d9c1dce26af00ca81d4fe11c23e8eb6752e1f9ad716c61f
c24f2d80c041000000c95760d41810e7058dfab0c20703432653a0b716a9d7fb
970d755d6d9654bec89f8809377cd2505cf67771fc469309b86d503f7aea94b5
0395357bba9861070c95adf950a73645b3c5547616d50101272d90e4926531be
e76a3c8266325286a3aed64e3f23c8250b0a81ccbe42e0b3ce69331a2cb833f9
939bf6c0cf5b0a382c179f577b688cba1dd966c1b0c0f9240ffb48358f09cafd
6ab20c4205eab64bd91311b431bc5d1cab83730e8da3822d5c88fb2796ee08b6
bd8ca16c01cb9ebcb6de22935396457d6c291d8722b67c023fa2bd66f7147f3b
5b9b2b8a1c6507222b32fc95bd20454e8b696fcafb1b7ddc1f0b08b5a3871ed0
605e419ba32f734dcbb29b69c58581160b24453d96981eb2a957f1a2908e4a08
4cb0360e6aaf9194a649d52a5bc2c0038c9ec0488c02a02f7dd46002b657167b
435cfa8577eba3fe127cdf515489875f72754ae0698320f10694479cb2d1bc34
5674ac2739c6055c558b84ecd33fdaac2b49449f04893d11d7394865609eeccd
6fc57f43a31e1682a53a98bd8916bc68c9950702236fc7b879a971e066a89f1c
3cf41c3aec29431a686eed216d3730c5bbd03738a49aeb962541661c8e806b20
773f44da40b7c857cc7ab50b007bf102ad54c181bee552fd8b1948f05a1a4a7f
c7c1c9a19a62447c570633ab8f92aa12e723fa79752b7bc770926c1ba8b7f4b6
8336213960a13c22d891bf12cb92d541f3a30e3e69b197101dfaf83cd7b13953
f1971374279fd76f9e845c7441328cf18e914230333387ab50a048e27dcb48c5
a8d87f2430905979094f2357bfcc9d2ed69f30a9087b82c2d7e223ae392077fa
aaa8f78f33f8073c41081e27851b8a8876029695bc261be3a214a5cd98a7409f
eab2c3739015d2800a3c8f96a75e7a11a1a9322725a9aea399529dc77d953232
3716b2413c83158598cc8688ef142f14c57440da51462c5f7791c030e24d1dbb
0836a426a86607a6aab8c484935c8322d993cc7055366aeb4cdfb13ab53688a0
f535ea0125cb78c8c5e037f818712aca0d2ff6480fb96e2baca8a288775e5b26
7d6b3dbd2164b045817c4b4f432473a87b973d551f36187100ec3b24e7872d86
99779398f6852650977499738af0f1bb64c95e7e6a98597a8a451894d6f66ede
b2282c55bd29bb94f7eb9b93bb06f5f1a6a5069effd36550926bc350c752aca6
79e6a96b144d39694eada052bb985fde9c9ddabcb77b6b89142603d9b8ce86b1
845672aa1ab5c510bac615099432c99ad23b5c4a548afcc4c98177abe0a0b82f
364d35b96f5633bcd3a0489b28b6ff5cbfd4356b4a904e1cb59bae046ac61287
3b8a83080788f0eb4de169ab19187312267e17c4a008000d638054a759115212
ca9482c555a05fde9868fbc93274956d535aa3cb9b4ebdf192b998c189683be7
b60d1d4075d848574d581522f993661221d26802e1360295216700944f5c55bd
fb54238df94c8d99c174534dfe1306f70992413566304a05c84a86ec9464390b
1bd3b459fdb06fffe09e1dd6175bd5bba96299d0237846a86e9b606db512b96a
22543e3420a91019b890129a198b45d9097e32588e538b68162e5f3212ed2a43
f97c68b54840f8bc573622911fc57b2a189d0241af5d8150dcf73e6f68cf5f09
cb635472a942627c553db40778db340f6a24166ba8c05907885fdab498167e18
952f529aaf0d183f168aa10322cad4656831c9be0d700544f99ce3b8c345c51b
e46c56952884a7371e97b24eec1ba918f93a931b360c05010508462fd9987621
ba4082b35cf082cc372d82e545ff9a55a9db0c712c6f82312e7f6b3cbbb5c446
f3778b069d55d4a23b674307a3c66cd9964740a2518c9f2d4cb6fbf68bc593be
b40574a101774e565ec3e9058e4674501cb865a94e0d6c3991f5875afa39b3a6
299f6c5e0bac23cb037416184e9a41725d12cf8ec282590c434e3b300ce34d8b
1224f3e57357e01031771c434aab9a624b314bb9acc345a78a1c3f707ffcc885
191833a7ebc3a9973a7e03b5d6c062a192824d7576343253d232cb34a321486c
43e3676f1a86af15f208292548a7e1513f630467589bef51533de564a0e9a57b
5b85ebd5895d5a38e662422ceab070827c9d28674c44243bf265032957c3d561
5fe02e385ca55499b109780197b0b4803dfa13289889b77837574e34d0e7d797
5f6e66b12c035fe999718feeeb928fdcdf0ed7e0f20a640a9cef52d36a707223
54d0183ed6b3e29d259b227b9cf38fb6f603d42cce8801d0d60bb67f176af11e
b0c9ebfc12a479d08769b9825bac2ff709366ed71c8a83c59ed6566652cb35ef
052adb01007d773eaa98bdbaa1d695a1bbc190b2d5b05cc541a38da255520f2e
cb6a9b77822bdfc2b80a52aaba6c0f3ec38b26c47be41801de9e09e691aa256c
e8e7fb0396300f949c55c91be09b03a5ac431a230f0c950d3f5b4e01922e6140
c0d672c92b052499a3e283fcdac3e9aedb53e8251ef93f72c1dfb09adfaf9827
a75b7d2bd8a29e9f499c76002b903987195f2f69c3ce945d3e1d574099fc6a84
c555e244896ed6fd455f9d8c041f781a22390430c80ec661e60cfd4a6d3330c0
28c4a0ccda47ced566f0255294e659b732cd5eabcafa3fd04e730f2ddc12116e
aed501195f3dcc97ada5d3d0fa32aeac41f4256873f3923216b7fa00ef94a0eb
24b357dacecd09e9fbf7c33bbde8a83b531f50dd43a02cd7831e7f11a0d6bf05
895cb2737df1343fc61f6354cc23d837e7c4b7e0b5af3164785dec26b31ec69f
14617d76eb7bf4f77325692b52149bb2a87db6a6d2b97aa927395a1283900a42
41354c980e089dbe9f50066b17bbfd39415693d621d4d3ef8ee85c2d5b19b1e1
7bc404da6d57025d9958a268abaa1adcf197b7e1519b23055c676efaddac9bc1
fdb7f67d8f12ca72781db9fbdd918ff22288b93ac2584d4103a564cc957e92ea
bbf0342ad89e15c9b4fa7647f5517398f25f4fd4cf762c12405e2510bc508883
e4294cd045e1bb40318f16ca660b4f9d4cd087fec1f7edcfe598bbc3bceb0cef
dc65f0aa8373305af77b6c6746272022df06daba91449b7e3a46f646c74fe7d5
5803bfc065de3007b857431d2e3b059976eda9c5b1bfbd9ac5ba6501026ed7db
6508c08773ac0cb85be1e21bb88dbdd05f423352237a4d4c372cf3fa96219dab
fc0a068036d73de49d1ebec5b8586c57084a66e25bde34f65a6101f88e265b4a
73a1d9b78ea152cc64123bccf05e3d01eb07a9fb0706392592959901a021bc54
70d68fbac24a71db2c0f5facb94955ec38b7531219923cae7c2382ed3dd89690
8762fa8207c270f3a515b528f3ea2419cb4a325df289ac58dc98cb4db5803601
ceff975fe614000ade64738feeb51894a9e38f72a03e4ca7773e59d0fb567d74
fabafd8bb661f9934a55c08846e9317a5b3cc7d70200a691538d6b1d016c0f2e
64199dea83475152ce500c283485790e944ab103cea373988337f7986c22e46d
3b2b29a9497b67c386e7c28b2d30e8d31ebcba559fc42fedecb9277da498f46b
d67d33a8ea6162caa88d48bcdd7cacc2b15c9d1501479f230f283736bfba5ae0
6c7ac96447ae127ff6f6de093b9d3cb7ebfd671852f2779e098c2f55011531f8
b6b530ee231bbc7b6740a0868ec8732027f75efead0f7690250e930e9a6ece8b
5a191626da3267a23300ace60c8f10bec7a2317dccae9186a1caa3bc9ea77b22
b92c56d5d2282a5464752e93ef17890436dfbd1a173dd62cfa985743dcbc63b9
87ca1917d12bb0223a4908566077c5e8b0eaf18655b0b43a04582b823b5bbfea
ba3fe3ca76e861826ad2658997d65709113bcf676c5a3d691f470b00ca7e4579
5d5a973974517ea45fc4bca296967d76e9bebeb786cf3229df80b2a7da9290d7
7e2123942fe65dfcdc497b3febdf82b374a59eb26ab04d3012f6d51f49fb740d
6b5d8d3a37de99044d39b09c2acd08e990aaf3a5f566871366ee5e281007f0dd
72f4bdcaf30c4bca5172260a4b8635c05186adb915b83ee1848d9e6d4f46f934
35d1006bd7fd8f9ebe7519fd0c1bcd188f244845dfd85e1c7c3539445bcb9685
9030bf8df47ccb66e80a5f4b408f3f5c4e12669a432b083da26e9d204cf4d70c
7da4b7b9296a139dbb965c2164b2528709096a5e6012c57dbbcf079a17163507
43ca567fccd7d6edf857947d10e97c5d7a6d46be4e046adee218a6beeaa1f0b2
694475a52565dab5f4ce49dd856dadc4c0eeb597634fa49e04b543c91a947469
71469cafa0f76d0c6b4fcf0014c68d0ed6362e7c6caccd43cd73f98c71d8a22b
7fa5b64e728e7747cdf812ad2f5dbb78a4742bd0955f9509678a2a8b93eff154
cfc781df05a004110892a829bfb3e78d84916c8e79a141a42e53965329388959
91eb028dcd99ac2b6c87e56233cd94aeee4fca0b2e9fd384e7967907dd319cdb
11199111120367af37afbc401ab2d7fc3192e007ee953c5c0b48512c55a7b1c1
9bf17bb12164943c252a9021934e35ed4bbc23101db956292cab5c90bf25075a
b92ffa1021
  1. one octet too long, from the D.4 request; dropped at open.

0cc600010000e2807d9c1dce26af00ca81d4fe11c23e8eb6752e1f9ad716c61f
c24f2d80c041000000c95760d41810e7058dfab0c20703432653a0b716a9d7fb
970d755d6d9654bec89f8809377cd2505cf67771fc469309b86d503f7aea94b5
0395357bba9861070c95adf950a73645b3c5547616d50101272d90e4926531be
e76a3c8266325286a3aed64e3f23c8250b0a81ccbe42e0b3ce69331a2cb833f9
939bf6c0cf5b0a382c179f577b688cba1dd966c1b0c0f9240ffb48358f09cafd
6ab20c4205eab64bd91311b431bc5d1cab83730e8da3822d5c88fb2796ee08b6
bd8ca16c01cb9ebcb6de22935396457d6c291d8722b67c023fa2bd66f7147f3b
5b9b2b8a1c6507222b32fc95bd20454e8b696fcafb1b7ddc1f0b08b5a3871ed0
605e419ba32f734dcbb29b69c58581160b24453d96981eb2a957f1a2908e4a08
4cb0360e6aaf9194a649d52a5bc2c0038c9ec0488c02a02f7dd46002b657167b
435cfa8577eba3fe127cdf515489875f72754ae0698320f10694479cb2d1bc34
5674ac2739c6055c558b84ecd33fdaac2b49449f04893d11d7394865609eeccd
6fc57f43a31e1682a53a98bd8916bc68c9950702236fc7b879a971e066a89f1c
3cf41c3aec29431a686eed216d3730c5bbd03738a49aeb962541661c8e806b20
773f44da40b7c857cc7ab50b007bf102ad54c181bee552fd8b1948f05a1a4a7f
c7c1c9a19a62447c570633ab8f92aa12e723fa79752b7bc770926c1ba8b7f4b6
8336213960a13c22d891bf12cb92d541f3a30e3e69b197101dfaf83cd7b13953
f1971374279fd76f9e845c7441328cf18e914230333387ab50a048e27dcb48c5
a8d87f2430905979094f2357bfcc9d2ed69f30a9087b82c2d7e223ae392077fa
aaa8f78f33f8073c41081e27851b8a8876029695bc261be3a214a5cd98a7409f
eab2c3739015d2800a3c8f96a75e7a11a1a9322725a9aea399529dc77d953232
3716b2413c83158598cc8688ef142f14c57440da51462c5f7791c030e24d1dbb
0836a426a86607a6aab8c484935c8322d993cc7055366aeb4cdfb13ab53688a0
f535ea0125cb78c8c5e037f818712aca0d2ff6480fb96e2baca8a288775e5b26
7d6b3dbd2164b045817c4b4f432473a87b973d551f36187100ec3b24e7872d86
99779398f6852650977499738af0f1bb64c95e7e6a98597a8a451894d6f66ede
b2282c55bd29bb94f7eb9b93bb06f5f1a6a5069effd36550926bc350c752aca6
79e6a96b144d39694eada052bb985fde9c9ddabcb77b6b89142603d9b8ce86b1
845672aa1ab5c510bac615099432c99ad23b5c4a548afcc4c98177abe0a0b82f
364d35b96f5633bcd3a0489b28b6ff5cbfd4356b4a904e1cb59bae046ac61287
3b8a83080788f0eb4de169ab19187312267e17c4a008000d638054a759115212
ca9482c555a05fde9868fbc93274956d535aa3cb9b4ebdf192b998c189683be7
b60d1d4075d848574d581522f993661221d26802e1360295216700944f5c55bd
fb54238df94c8d99c174534dfe1306f70992413566304a05c84a86ec9464390b
1bd3b459fdb06fffe09e1dd6175bd5bba96299d0237846a86e9b606db512b96a
22543e3420a91019b890129a198b45d9097e32588e538b68162e5f3212ed2a43
f97c68b54840f8bc573622911fc57b2a189d0241af5d8150dcf73e6f68cf5f09
cb635472a942627c553db40778db340f6a24166ba8c05907885fdab498167e18
952f529aaf0d183f168aa10322cad4656831c9be0d700544f99ce3b8c345c51b
e46c56952884a7371e97b24eec1ba918f93a931b360c05010508462fd9987621
ba4082b35cf082cc372d82e545ff9a55a9db0c712c6f82312e7f6b3cbbb5c446
f3778b069d55d4a23b674307a3c66cd9964740a2518c9f2d4cb6fbf68bc593be
b40574a101774e565ec3e9058e4674501cb865a94e0d6c3991f5875afa39b3a6
299f6c5e0bac23cb037416184e9a41725d12cf8ec282590c434e3b300ce34d8b
1224f3e57357e01031771c434aab9a624b314bb9acc345a78a1c3f707ffcc885
191833a7ebc3a9973a7e03b5d6c062a192824d7576343253d232cb34a321486c
43e3676f1a86af15f208292548a7e1513f630467589bef51533de564a0e9a57b
5b85ebd5895d5a38e662422ceab070827c9d28674c44243bf265032957c3d561
5fe02e385ca55499b109780197b0b4803dfa13289889b77837574e34d0e7d797
5f6e66b12c035fe999718feeeb928fdcdf0ed7e0f20a640a9cef52d36a707223
54d0183ed6b3e29d259b227b9cf38fb6f603d42cce8801d0d60bb67f176af11e
b0c9ebfc12a479d08769b9825bac2ff709366ed71c8a83c59ed6566652cb35ef
052adb01007d773eaa98bdbaa1d695a1bbc190b2d5b05cc541a38da255520f2e
cb6a9b77822bdfc2b80a52aaba6c0f3ec38b26c47be41801de9e09e691aa256c
e8e7fb0396300f949c55c91be09b03a5ac431a230f0c950d3f5b4e01922e6140
c0d672c92b052499a3e283fcdac3e9aedb53e8251ef93f72c1dfb09adfaf9827
a75b7d2bd8a29e9f499c76002b903987195f2f69c3ce945d3e1d574099fc6a84
c555e244896ed6fd455f9d8c041f781a22390430c80ec661e60cfd4a6d3330c0
28c4a0ccda47ced566f0255294e659b732cd5eabcafa3fd04e730f2ddc12116e
aed501195f3dcc97ada5d3d0fa32aeac41f4256873f3923216b7fa00ef94a0eb
24b357dacecd09e9fbf7c33bbde8a83b531f50dd43a02cd7831e7f11a0d6bf05
895cb2737df1343fc61f6354cc23d837e7c4b7e0b5af3164785dec26b31ec69f
14617d76eb7bf4f77325692b52149bb2a87db6a6d2b97aa927395a1283900a42
41354c980e089dbe9f50066b17bbfd39415693d621d4d3ef8ee85c2d5b19b1e1
7bc404da6d57025d9958a268abaa1adcf197b7e1519b23055c676efaddac9bc1
fdb7f67d8f12ca72781db9fbdd918ff22288b93ac2584d4103a564cc957e92ea
bbf0342ad89e15c9b4fa7647f5517398f25f4fd4cf762c12405e2510bc508883
e4294cd045e1bb40318f16ca660b4f9d4cd087fec1f7edcfe598bbc3bceb0cef
dc65f0aa8373305af77b6c6746272022df06daba91449b7e3a46f646c74fe7d5
5803bfc065de3007b857431d2e3b059976eda9c5b1bfbd9ac5ba6501026ed7db
6508c08773ac0cb85be1e21bb88dbdd05f423352237a4d4c372cf3fa96219dab
fc0a068036d73de49d1ebec5b8586c57084a66e25bde34f65a6101f88e265b4a
73a1d9b78ea152cc64123bccf05e3d01eb07a9fb0706392592959901a021bc54
70d68fbac24a71db2c0f5facb94955ec38b7531219923cae7c2382ed3dd89690
8762fa8207c270f3a515b528f3ea2419cb4a325df289ac58dc98cb4db5803601
ceff975fe614000ade64738feeb51894a9e38f72a03e4ca7773e59d0fb567d74
fabafd8bb661f9934a55c08846e9317a5b3cc7d70200a691538d6b1d016c0f2e
64199dea83475152ce500c283485790e944ab103cea373988337f7986c22e46d
3b2b29a9497b67c386e7c28b2d30e8d31ebcba559fc42fedecb9277da498f46b
d67d33a8ea6162caa88d48bcdd7cacc2b15c9d1501479f230f283736bfba5ae0
6c7ac96447ae127ff6f6de093b9d3cb7ebfd671852f2779e098c2f55011531f8
b6b530ee231bbc7b6740a0868ec8732027f75efead0f7690250e930e9a6ece8b
5a191626da3267a23300ace60c8f10bec7a2317dccae9186a1caa3bc9ea77b22
b92c56d5d2282a5464752e93ef17890436dfbd1a173dd62cfa985743dcbc63b9
87ca1917d12bb0223a4908566077c5e8b0eaf18655b0b43a04582b823b5bbfea
ba3fe3ca76e861826ad2658997d65709113bcf676c5a3d691f470b00ca7e4579
5d5a973974517ea45fc4bca296967d76e9bebeb786cf3229df80b2a7da9290d7
7e2123942fe65dfcdc497b3febdf82b374a59eb26ab04d3012f6d51f49fb740d
6b5d8d3a37de99044d39b09c2acd08e990aaf3a5f566871366ee5e281007f0dd
72f4bdcaf30c4bca5172260a4b8635c05186adb915b83ee1848d9e6d4f46f934
35d1006bd7fd8f9ebe7519fd0c1bcd188f244845dfd85e1c7c3539445bcb9685
9030bf8df47ccb66e80a5f4b408f3f5c4e12669a432b083da26e9d204cf4d70c
7da4b7b9296a139dbb965c2164b2528709096a5e6012c57dbbcf079a17163507
43ca567fccd7d6edf857947d10e97c5d7a6d46be4e046adee218a6beeaa1f0b2
694475a52565dab5f4ce49dd856dadc4c0eeb597634fa49e04b543c91a947469
71469cafa0f76d0c6b4fcf0014c68d0ed6362e7c6caccd43cd73f98c71d8a22b
7fa5b64e728e7747cdf812ad2f5dbb78a4742bd0955f9509678a2a8b93eff154
cfc781df05a004110892a829bfb3e78d84916c8e79a141a42e53965329388959
91eb028dcd99ac2b6c87e56233cd94aeee4fca0b2e9fd384e7967907dd319cdb
11199111120367af37afbc401ab2d7fc3192e007ee953c5c0b48512c55a7b1c1
9bf17bb12164943c252a9021934e35ed4bbc23101db956292cab5c90bf25075a
b92ffa102100
  1. one octet too short, from the D.4 request; dropped at open.

0cc400010000e2807d9c1dce26af00ca81d4fe11c23e8eb6752e1f9ad716c61f
c24f2d80c041000000c95760d41810e7058dfab0c20703432653a0b716a9d7fb
970d755d6d9654bec89f8809377cd2505cf67771fc469309b86d503f7aea94b5
0395357bba9861070c95adf950a73645b3c5547616d50101272d90e4926531be
e76a3c8266325286a3aed64e3f23c8250b0a81ccbe42e0b3ce69331a2cb833f9
939bf6c0cf5b0a382c179f577b688cba1dd966c1b0c0f9240ffb48358f09cafd
6ab20c4205eab64bd91311b431bc5d1cab83730e8da3822d5c88fb2796ee08b6
bd8ca16c01cb9ebcb6de22935396457d6c291d8722b67c023fa2bd66f7147f3b
5b9b2b8a1c6507222b32fc95bd20454e8b696fcafb1b7ddc1f0b08b5a3871ed0
605e419ba32f734dcbb29b69c58581160b24453d96981eb2a957f1a2908e4a08
4cb0360e6aaf9194a649d52a5bc2c0038c9ec0488c02a02f7dd46002b657167b
435cfa8577eba3fe127cdf515489875f72754ae0698320f10694479cb2d1bc34
5674ac2739c6055c558b84ecd33fdaac2b49449f04893d11d7394865609eeccd
6fc57f43a31e1682a53a98bd8916bc68c9950702236fc7b879a971e066a89f1c
3cf41c3aec29431a686eed216d3730c5bbd03738a49aeb962541661c8e806b20
773f44da40b7c857cc7ab50b007bf102ad54c181bee552fd8b1948f05a1a4a7f
c7c1c9a19a62447c570633ab8f92aa12e723fa79752b7bc770926c1ba8b7f4b6
8336213960a13c22d891bf12cb92d541f3a30e3e69b197101dfaf83cd7b13953
f1971374279fd76f9e845c7441328cf18e914230333387ab50a048e27dcb48c5
a8d87f2430905979094f2357bfcc9d2ed69f30a9087b82c2d7e223ae392077fa
aaa8f78f33f8073c41081e27851b8a8876029695bc261be3a214a5cd98a7409f
eab2c3739015d2800a3c8f96a75e7a11a1a9322725a9aea399529dc77d953232
3716b2413c83158598cc8688ef142f14c57440da51462c5f7791c030e24d1dbb
0836a426a86607a6aab8c484935c8322d993cc7055366aeb4cdfb13ab53688a0
f535ea0125cb78c8c5e037f818712aca0d2ff6480fb96e2baca8a288775e5b26
7d6b3dbd2164b045817c4b4f432473a87b973d551f36187100ec3b24e7872d86
99779398f6852650977499738af0f1bb64c95e7e6a98597a8a451894d6f66ede
b2282c55bd29bb94f7eb9b93bb06f5f1a6a5069effd36550926bc350c752aca6
79e6a96b144d39694eada052bb985fde9c9ddabcb77b6b89142603d9b8ce86b1
845672aa1ab5c510bac615099432c99ad23b5c4a548afcc4c98177abe0a0b82f
364d35b96f5633bcd3a0489b28b6ff5cbfd4356b4a904e1cb59bae046ac61287
3b8a83080788f0eb4de169ab19187312267e17c4a008000d638054a759115212
ca9482c555a05fde9868fbc93274956d535aa3cb9b4ebdf192b998c189683be7
b60d1d4075d848574d581522f993661221d26802e1360295216700944f5c55bd
fb54238df94c8d99c174534dfe1306f70992413566304a05c84a86ec9464390b
1bd3b459fdb06fffe09e1dd6175bd5bba96299d0237846a86e9b606db512b96a
22543e3420a91019b890129a198b45d9097e32588e538b68162e5f3212ed2a43
f97c68b54840f8bc573622911fc57b2a189d0241af5d8150dcf73e6f68cf5f09
cb635472a942627c553db40778db340f6a24166ba8c05907885fdab498167e18
952f529aaf0d183f168aa10322cad4656831c9be0d700544f99ce3b8c345c51b
e46c56952884a7371e97b24eec1ba918f93a931b360c05010508462fd9987621
ba4082b35cf082cc372d82e545ff9a55a9db0c712c6f82312e7f6b3cbbb5c446
f3778b069d55d4a23b674307a3c66cd9964740a2518c9f2d4cb6fbf68bc593be
b40574a101774e565ec3e9058e4674501cb865a94e0d6c3991f5875afa39b3a6
299f6c5e0bac23cb037416184e9a41725d12cf8ec282590c434e3b300ce34d8b
1224f3e57357e01031771c434aab9a624b314bb9acc345a78a1c3f707ffcc885
191833a7ebc3a9973a7e03b5d6c062a192824d7576343253d232cb34a321486c
43e3676f1a86af15f208292548a7e1513f630467589bef51533de564a0e9a57b
5b85ebd5895d5a38e662422ceab070827c9d28674c44243bf265032957c3d561
5fe02e385ca55499b109780197b0b4803dfa13289889b77837574e34d0e7d797
5f6e66b12c035fe999718feeeb928fdcdf0ed7e0f20a640a9cef52d36a707223
54d0183ed6b3e29d259b227b9cf38fb6f603d42cce8801d0d60bb67f176af11e
b0c9ebfc12a479d08769b9825bac2ff709366ed71c8a83c59ed6566652cb35ef
052adb01007d773eaa98bdbaa1d695a1bbc190b2d5b05cc541a38da255520f2e
cb6a9b77822bdfc2b80a52aaba6c0f3ec38b26c47be41801de9e09e691aa256c
e8e7fb0396300f949c55c91be09b03a5ac431a230f0c950d3f5b4e01922e6140
c0d672c92b052499a3e283fcdac3e9aedb53e8251ef93f72c1dfb09adfaf9827
a75b7d2bd8a29e9f499c76002b903987195f2f69c3ce945d3e1d574099fc6a84
c555e244896ed6fd455f9d8c041f781a22390430c80ec661e60cfd4a6d3330c0
28c4a0ccda47ced566f0255294e659b732cd5eabcafa3fd04e730f2ddc12116e
aed501195f3dcc97ada5d3d0fa32aeac41f4256873f3923216b7fa00ef94a0eb
24b357dacecd09e9fbf7c33bbde8a83b531f50dd43a02cd7831e7f11a0d6bf05
895cb2737df1343fc61f6354cc23d837e7c4b7e0b5af3164785dec26b31ec69f
14617d76eb7bf4f77325692b52149bb2a87db6a6d2b97aa927395a1283900a42
41354c980e089dbe9f50066b17bbfd39415693d621d4d3ef8ee85c2d5b19b1e1
7bc404da6d57025d9958a268abaa1adcf197b7e1519b23055c676efaddac9bc1
fdb7f67d8f12ca72781db9fbdd918ff22288b93ac2584d4103a564cc957e92ea
bbf0342ad89e15c9b4fa7647f5517398f25f4fd4cf762c12405e2510bc508883
e4294cd045e1bb40318f16ca660b4f9d4cd087fec1f7edcfe598bbc3bceb0cef
dc65f0aa8373305af77b6c6746272022df06daba91449b7e3a46f646c74fe7d5
5803bfc065de3007b857431d2e3b059976eda9c5b1bfbd9ac5ba6501026ed7db
6508c08773ac0cb85be1e21bb88dbdd05f423352237a4d4c372cf3fa96219dab
fc0a068036d73de49d1ebec5b8586c57084a66e25bde34f65a6101f88e265b4a
73a1d9b78ea152cc64123bccf05e3d01eb07a9fb0706392592959901a021bc54
70d68fbac24a71db2c0f5facb94955ec38b7531219923cae7c2382ed3dd89690
8762fa8207c270f3a515b528f3ea2419cb4a325df289ac58dc98cb4db5803601
ceff975fe614000ade64738feeb51894a9e38f72a03e4ca7773e59d0fb567d74
fabafd8bb661f9934a55c08846e9317a5b3cc7d70200a691538d6b1d016c0f2e
64199dea83475152ce500c283485790e944ab103cea373988337f7986c22e46d
3b2b29a9497b67c386e7c28b2d30e8d31ebcba559fc42fedecb9277da498f46b
d67d33a8ea6162caa88d48bcdd7cacc2b15c9d1501479f230f283736bfba5ae0
6c7ac96447ae127ff6f6de093b9d3cb7ebfd671852f2779e098c2f55011531f8
b6b530ee231bbc7b6740a0868ec8732027f75efead0f7690250e930e9a6ece8b
5a191626da3267a23300ace60c8f10bec7a2317dccae9186a1caa3bc9ea77b22
b92c56d5d2282a5464752e93ef17890436dfbd1a173dd62cfa985743dcbc63b9
87ca1917d12bb0223a4908566077c5e8b0eaf18655b0b43a04582b823b5bbfea
ba3fe3ca76e861826ad2658997d65709113bcf676c5a3d691f470b00ca7e4579
5d5a973974517ea45fc4bca296967d76e9bebeb786cf3229df80b2a7da9290d7
7e2123942fe65dfcdc497b3febdf82b374a59eb26ab04d3012f6d51f49fb740d
6b5d8d3a37de99044d39b09c2acd08e990aaf3a5f566871366ee5e281007f0dd
72f4bdcaf30c4bca5172260a4b8635c05186adb915b83ee1848d9e6d4f46f934
35d1006bd7fd8f9ebe7519fd0c1bcd188f244845dfd85e1c7c3539445bcb9685
9030bf8df47ccb66e80a5f4b408f3f5c4e12669a432b083da26e9d204cf4d70c
7da4b7b9296a139dbb965c2164b2528709096a5e6012c57dbbcf079a17163507
43ca567fccd7d6edf857947d10e97c5d7a6d46be4e046adee218a6beeaa1f0b2
694475a52565dab5f4ce49dd856dadc4c0eeb597634fa49e04b543c91a947469
71469cafa0f76d0c6b4fcf0014c68d0ed6362e7c6caccd43cd73f98c71d8a22b
7fa5b64e728e7747cdf812ad2f5dbb78a4742bd0955f9509678a2a8b93eff154
cfc781df05a004110892a829bfb3e78d84916c8e79a141a42e53965329388959
91eb028dcd99ac2b6c87e56233cd94aeee4fca0b2e9fd384e7967907dd319cdb
11199111120367af37afbc401ab2d7fc3192e007ee953c5c0b48512c55a7b1c1
9bf17bb12164943c252a9021934e35ed4bbc23101db956292cab5c90bf25075a
b92ffa10
  1. wrong tag, from the D.4 request; dropped at open.

0cc500010000e2807d9c1dce26af00ca81d4fe11c23e8eb6752e1f9ad716c61f
c24f2d80c041000000c95760d41810e7058dfab0c20703432653a0b716a9d7fb
970d755d6d9654bec89f8809377cd2505cf67771fc469309b86d503f7aea94b5
0395357bba9861070c95adf950a73645b3c5547616d50101272d90e4926531be
e76a3c8266325286a3aed64e3f23c8250b0a81ccbe42e0b3ce69331a2cb833f9
939bf6c0cf5b0a382c179f577b688cba1dd966c1b0c0f9240ffb48358f09cafd
6ab20c4205eab64bd91311b431bc5d1cab83730e8da3822d5c88fb2796ee08b6
bd8ca16c01cb9ebcb6de22935396457d6c291d8722b67c023fa2bd66f7147f3b
5b9b2b8a1c6507222b32fc95bd20454e8b696fcafb1b7ddc1f0b08b5a3871ed0
605e419ba32f734dcbb29b69c58581160b24453d96981eb2a957f1a2908e4a08
4cb0360e6aaf9194a649d52a5bc2c0038c9ec0488c02a02f7dd46002b657167b
435cfa8577eba3fe127cdf515489875f72754ae0698320f10694479cb2d1bc34
5674ac2739c6055c558b84ecd33fdaac2b49449f04893d11d7394865609eeccd
6fc57f43a31e1682a53a98bd8916bc68c9950702236fc7b879a971e066a89f1c
3cf41c3aec29431a686eed216d3730c5bbd03738a49aeb962541661c8e806b20
773f44da40b7c857cc7ab50b007bf102ad54c181bee552fd8b1948f05a1a4a7f
c7c1c9a19a62447c570633ab8f92aa12e723fa79752b7bc770926c1ba8b7f4b6
8336213960a13c22d891bf12cb92d541f3a30e3e69b197101dfaf83cd7b13953
f1971374279fd76f9e845c7441328cf18e914230333387ab50a048e27dcb48c5
a8d87f2430905979094f2357bfcc9d2ed69f30a9087b82c2d7e223ae392077fa
aaa8f78f33f8073c41081e27851b8a8876029695bc261be3a214a5cd98a7409f
eab2c3739015d2800a3c8f96a75e7a11a1a9322725a9aea399529dc77d953232
3716b2413c83158598cc8688ef142f14c57440da51462c5f7791c030e24d1dbb
0836a426a86607a6aab8c484935c8322d993cc7055366aeb4cdfb13ab53688a0
f535ea0125cb78c8c5e037f818712aca0d2ff6480fb96e2baca8a288775e5b26
7d6b3dbd2164b045817c4b4f432473a87b973d551f36187100ec3b24e7872d86
99779398f6852650977499738af0f1bb64c95e7e6a98597a8a451894d6f66ede
b2282c55bd29bb94f7eb9b93bb06f5f1a6a5069effd36550926bc350c752aca6
79e6a96b144d39694eada052bb985fde9c9ddabcb77b6b89142603d9b8ce86b1
845672aa1ab5c510bac615099432c99ad23b5c4a548afcc4c98177abe0a0b82f
364d35b96f5633bcd3a0489b28b6ff5cbfd4356b4a904e1cb59bae046ac61287
3b8a83080788f0eb4de169ab19187312267e17c4a008000d638054a759115212
ca9482c555a05fde9868fbc93274956d535aa3cb9b4ebdf192b998c189683be7
b60d1d4075d848574d581522f993661221d26802e1360295216700944f5c55bd
fb54238df94c8d99c174534dfe1306f70992413566304a05c84a86ec9464390b
1bd3b459fdb06fffe09e1dd6175bd5bba96299d0237846a86e9b606db512b96a
22543e3420a91019b890129a198b45d9097e32588e538b68162e5f3212ed2a43
f97c68b54840f8bc573622911fc57b2a189d0241af5d8150dcf73e6f68cf5f09
cb635472a942627c553db40778db340f6a24166ba8c05907885fdab498167e18
952f529aaf0d183f168aa10322cad4656831c9be0d700544f99ce3b8c345c51b
e46c56952884a7371e97b24eec1ba918f93a931b360c05010508462fd9987621
ba4082b35cf082cc372d82e545ff9a55a9db0c712c6f82312e7f6b3cbbb5c446
f3778b069d55d4a23b674307a3c66cd9964740a2518c9f2d4cb6fbf68bc593be
b40574a101774e565ec3e9058e4674501cb865a94e0d6c3991f5875afa39b3a6
299f6c5e0bac23cb037416184e9a41725d12cf8ec282590c434e3b300ce34d8b
1224f3e57357e01031771c434aab9a624b314bb9acc345a78a1c3f707ffcc885
191833a7ebc3a9973a7e03b5d6c062a192824d7576343253d232cb34a321486c
43e3676f1a86af15f208292548a7e1513f630467589bef51533de564a0e9a57b
5b85ebd5895d5a38e662422ceab070827c9d28674c44243bf265032957c3d561
5fe02e385ca55499b109780197b0b4803dfa13289889b77837574e34d0e7d797
5f6e66b12c035fe999718feeeb928fdcdf0ed7e0f20a640a9cef52d36a707223
54d0183ed6b3e29d259b227b9cf38fb6f603d42cce8801d0d60bb67f176af11e
b0c9ebfc12a479d08769b9825bac2ff709366ed71c8a83c59ed6566652cb35ef
052adb01007d773eaa98bdbaa1d695a1bbc190b2d5b05cc541a38da255520f2e
cb6a9b77822bdfc2b80a52aaba6c0f3ec38b26c47be41801de9e09e691aa256c
e8e7fb0396300f949c55c91be09b03a5ac431a230f0c950d3f5b4e01922e6140
c0d672c92b052499a3e283fcdac3e9aedb53e8251ef93f72c1dfb09adfaf9827
a75b7d2bd8a29e9f499c76002b903987195f2f69c3ce945d3e1d574099fc6a84
c555e244896ed6fd455f9d8c041f781a22390430c80ec661e60cfd4a6d3330c0
28c4a0ccda47ced566f0255294e659b732cd5eabcafa3fd04e730f2ddc12116e
aed501195f3dcc97ada5d3d0fa32aeac41f4256873f3923216b7fa00ef94a0eb
24b357dacecd09e9fbf7c33bbde8a83b531f50dd43a02cd7831e7f11a0d6bf05
895cb2737df1343fc61f6354cc23d837e7c4b7e0b5af3164785dec26b31ec69f
14617d76eb7bf4f77325692b52149bb2a87db6a6d2b97aa927395a1283900a42
41354c980e089dbe9f50066b17bbfd39415693d621d4d3ef8ee85c2d5b19b1e1
7bc404da6d57025d9958a268abaa1adcf197b7e1519b23055c676efaddac9bc1
fdb7f67d8f12ca72781db9fbdd918ff22288b93ac2584d4103a564cc957e92ea
bbf0342ad89e15c9b4fa7647f5517398f25f4fd4cf762c12405e2510bc508883
e4294cd045e1bb40318f16ca660b4f9d4cd087fec1f7edcfe598bbc3bceb0cef
dc65f0aa8373305af77b6c6746272022df06daba91449b7e3a46f646c74fe7d5
5803bfc065de3007b857431d2e3b059976eda9c5b1bfbd9ac5ba6501026ed7db
6508c08773ac0cb85be1e21bb88dbdd05f423352237a4d4c372cf3fa96219dab
fc0a068036d73de49d1ebec5b8586c57084a66e25bde34f65a6101f88e265b4a
73a1d9b78ea152cc64123bccf05e3d01eb07a9fb0706392592959901a021bc54
70d68fbac24a71db2c0f5facb94955ec38b7531219923cae7c2382ed3dd89690
8762fa8207c270f3a515b528f3ea2419cb4a325df289ac58dc98cb4db5803601
ceff975fe614000ade64738feeb51894a9e38f72a03e4ca7773e59d0fb567d74
fabafd8bb661f9934a55c08846e9317a5b3cc7d70200a691538d6b1d016c0f2e
64199dea83475152ce500c283485790e944ab103cea373988337f7986c22e46d
3b2b29a9497b67c386e7c28b2d30e8d31ebcba559fc42fedecb9277da498f46b
d67d33a8ea6162caa88d48bcdd7cacc2b15c9d1501479f230f283736bfba5ae0
6c7ac96447ae127ff6f6de093b9d3cb7ebfd671852f2779e098c2f55011531f8
b6b530ee231bbc7b6740a0868ec8732027f75efead0f7690250e930e9a6ece8b
5a191626da3267a23300ace60c8f10bec7a2317dccae9186a1caa3bc9ea77b22
b92c56d5d2282a5464752e93ef17890436dfbd1a173dd62cfa985743dcbc63b9
87ca1917d12bb0223a4908566077c5e8b0eaf18655b0b43a04582b823b5bbfea
ba3fe3ca76e861826ad2658997d65709113bcf676c5a3d691f470b00ca7e4579
5d5a973974517ea45fc4bca296967d76e9bebeb786cf3229df80b2a7da9290d7
7e2123942fe65dfcdc497b3febdf82b374a59eb26ab04d3012f6d51f49fb740d
6b5d8d3a37de99044d39b09c2acd08e990aaf3a5f566871366ee5e281007f0dd
72f4bdcaf30c4bca5172260a4b8635c05186adb915b83ee1848d9e6d4f46f934
35d1006bd7fd8f9ebe7519fd0c1bcd188f244845dfd85e1c7c3539445bcb9685
9030bf8df47ccb66e80a5f4b408f3f5c4e12669a432b083da26e9d204cf4d70c
7da4b7b9296a139dbb965c2164b2528709096a5e6012c57dbbcf079a17163507
43ca567fccd7d6edf857947d10e97c5d7a6d46be4e046adee218a6beeaa1f0b2
694475a52565dab5f4ce49dd856dadc4c0eeb597634fa49e04b543c91a947469
71469cafa0f76d0c6b4fcf0014c68d0ed6362e7c6caccd43cd73f98c71d8a22b
7fa5b64e728e7747cdf812ad2f5dbb78a4742bd0955f9509678a2a8b93eff154
cfc781df05a004110892a829bfb3e78d84916c8e79a141a42e53965329388959
91eb028dcd99ac2b6c87e56233cd94aeee4fca0b2e9fd384e7967907dd319cdb
11199111120367af37afbc401ab2d7fc3192e007ee953c5c0b48512c55a7b1c1
9bf17bb12164943c252a9021934e35ed4bbc23101db956292cab5c90bf25075a
b92ffa1020
  1. reserved flag bit set, from the D.5 request; dropped at parse.

0c7c01830001c00913e02a63e4cf532d9b2ce282fad85af699815c18c595ea80
4462a794f7510000761a4f21385317432fe08b6934ba38aee70f5bd4274426b4
f2b8c891fb9a0eb9cb6b46c4d9aa3cbb083a60364594b29d3b6254abbc123da4
80e7a3257c6845d701cd0c20164d0483d23698f7ea7850d83d31652be789af8d
65b4ab282a44157a6508b132399052034e2719cb09a257b858b964c652244259
9fc4959ff775768938e10399d4691536899928219ab59a4a06db3e0576089477
586a7510a7597004f13577028fe9bc65eb46aafb6368e1ea72e1180dc81b7858
083f05e46a06bac004b76f119c1d433249f31cc158316693990171179c55a15f
4e0cc75264328ec10d5d6a39bcd375c8913e82109f93335438e7848c28c3ee21
2c590c1c1e5129098584d1646f99cacdbcc63743f7ce4bab9f9f979c4bf6bfa0
09af7ee558cdcc39dbea52e46507d973905be2c6ebb87b21794db7c24f4ed47d
2ff653ac708bf6b8134831329065aaa87b782248a4e5491c5dd934d9a866143a
5d2b0a94d3657cece8869b0a73088b8e242181218806b3a6b25c039eaee17611
c88e1d696bda574735aa6621637e46108a94f077053653610811f5f403b2689a
3088c2bb24354014baa3dc625313715a051e262811d29964ee2c8df6a481a9a1
6f62b3bd4ecc9266fa388119601afc0ff863cd2ff1a103c077c6385245a20b86
d6658e13650f68aabfeb693886cdfbe47262cb33d96ab3ad6a4e580501e74a8e
a6fb3f807223f2da5a83443289903ea1825fb47bc98b502d050b7f1037684ce7
a2ade624298c2a96080483787ae8a6be49f1beee8b34173ac15a54cab416b1fa
a870f0f407efb4715c8c6f71ac080063299c47c130e64d1e02339a9426582c1c
0ee363b95b42f6d4ccdfcb308101c3a14631ee2574d66b15c09528e8c5c5eaa0
766a7a10e40380df9c4eed293597b02139ea981c5a2d33db0c788ba532353933
209517158d00281b009a947cc03a7ae867bfea99bf706c423818d68a8db63abd
cd26be62486bbf230dbc1456e1666d7b0254f72aaf09f09cfc686e3ff850e2dc
af42b26445d17d4d55af80e630d51097c9d27f3a5a3f81d50bc46b1de23073fd
e890a85ac5050a1bb701020eeac7ae4909446a89b7d91f19eb86d9423425bc6c
1713841d8323fe2b1428720a3d066dfddb008b584f704625905317a761720ecc
4ec28607dea6153119af49b4b133e018f9467846ec01436108676c24a2213f05
55ca4dd769fbf64704d32d50570d12d4abf496523f2b7f1a18b82080027c7c6a
debc0868e3a6321a6c6c369d2ac55d7e867367c76d9438b3f1c42260a268ac02
82b277323c64031ff87855474b47803215370b6e354871892ff85c9c01aa1484
f9027204a439d1c6a0348f854955bd909609c793ce41ccfe0579bdc4bf11d17e
ec4288371b4534e12734346fb8ab4561d550dee81b5f7b6dd6a93465612b68b5
9cb82b2d2aea2569219afae57999a0365266a7a1679deb6b161ad96a76872dcc
a390264b6674b631595a86b0070bb4bb82005870e9f53fa8327cb7bba6da019c
f5d6a757c74da5a26be430655a481010178389290f7f48bc76da8582d14911b3
2d716b8baa789f13606612517e9fa1a0201885a21108d05ba50adb5057f6265d
8925fa95a4a93aaa82c06d42f199cea14f71c5a18bc6cd8cd3158922206fe855
a9b05794cb9bb83aa84e975799298ee1b85f9a4070317439c48202325907947b
100d154a38a6b8ddf392662bafd2ec061b6191d4ab01c32c0b8b3abf0fc919d5
8699b0006c7b972223bb5185a88d8fa37696f028c7f1214fd131276b950f295c
f4ea7c881c81c0da8271b53e2d3059a853590bfb13eee422d60c58a1f557a990
c80b70b68736055db9237dca2ae5f4974ef764fa1c419ad24d63cb2e96e1ad64
9070e6363ce4877317558ab631453b3c358d7860e39a49e2d011d4f00a5bc756
1c27c1c881ba199362e61c840e6ac1ba460b87305c5a0ac4b9d447950578abf5
c9cd39c20bb0ca742b0a88968651300f12bb5965fab8b1740785db5e6f840548
85b2658c7faa6306ae03b465327f5196a3b9d2040c34881aa60ad0f45be7198b
ebe6b2d0415f1b48075feabe381c0cb07a7e276a0147c988044645b10a826745
567c37a65e257bf7c80abfc8330832094e8227fbd68933f4a1c3428ccf271f5e
e62d3b982538722a3ba81253bae0caf30084efd7e03913eb4852056af5184bdf
0953e0d84a640a7472440b8fdbf5a91705fe2d4a22bd6c7a0ab58c531dc8a18f
05f92125b319957aeaa2d17d809f9a2f71ced9ab19900e9386f2b5df50b688f4
2be44059f17f75d01353fc2c164e126d750562bf5742614f231e3dc3d620f798
07f029ce9638e0c75c0d76642f72f582801f1ee731cf1511fe9e25251c069ea7
35a53ba178932da924f94b6a0b75aec28c6c9dfce3b93a1c57d281adf56f9e44
77b9a7a534549f5970004acf7d376fdefc2698d460bee8638d83225676834d9d
b0779891bd42ca552350392e0b6b49d0797f50da5028199a23735ddeb2392325
e0b034f186b69f7e8b17d40dba33f28d975445381d52910de6958da8cc7fe93e
efe0405f3c1876f3efd7322fdfca7c30f0958e071c39cc3a096802fa106dc219
cb0b8b9dba502e3061bceefadaf173699a47b1a24cf5cdfab2013b142a341e13
2ddf12276984ab955fa4d50de980e05d26106ffa00053425ec5330e1eff24a03
8092ca480bbc249073089e674953fdd717a52de4da23f1cfb228cd79c1d13eac
da87e8fa7e743ebd11c57c4c57b133384747dbbda91ef98b921d718d8632c727
6f4fb964fb01ab9b306795002b9b87f8eda2e761d57b608cd6961f784d110635
0e858f4860c4c83824163889e388c832c2b6673dc2f898e430747a330468fb35
4d704ab4ec4a7850512929c7919668b66d8899bd2646879019f0a80ed8dc8d33
b7c89ec0039a40cff1ce0fcf37b341c98e9e04cb3a3b5a061daa056d2d5d2522
b988ac3234be654ca907c6530fc9866e517c897e2767ee97d329c6def846160a
bea729f3054924b0f2a48889da4269fc074ead921af746c4d4f968b29a6432e6
05939ad15b05ef9e8698bd2225aa414151c8a350e34fdedf441ea45c17545a71
8c5653226d43596feb9793dacefb723af5bedf3b818d12d0f0618a2ac7153b13
be2568c735448c723000a909413cd3ca22192fc91e8aff02b0e02f4a2b06546d
29df22b487e44788c1d8033eaeea4d6eff0d4ebb01d416a6135dd52cfb329ac8
612ac6092880632c6d6f9111466a277510e4a8ff9203b529ed021dde1931ff1f
97d8bf489376c4117874821dd62f34a72f94953e66e35c8d2faa930dd3aa1242
c062be94b059223c299b2003153f0aab21f9f7c2c22131e1ebce5f0605b05992
f0a66c8f076cf890542c93048c1e316b740b877f4c8bfc59cff93e7f86c2482e
b343cfdb236ca393fe9f34f24dd56c1224708cd03eb54c3564900162207d1a46
0496322e4653a83313deec40a272f58258c66595ca189c2fc173845ce487d850
be181a222393bcec9d4ea47ecbe5d41ecc3881befd9f5076531e14ec103e1601
54dbaec83c6c12df0053cd03ff73007b8fd62044f99c73aa5e90df466bcaaa32
2f4f05bee2c257948a006e253848f50bb65420a580beee864e3e8df4dd5a67f5
ca440400521ee23b7f9917504a7afa39f07da83d03a9634dfcc03e47c8505c3b
25da24a4332d4d464961564f321b7963639fbff9addeb2881d463e49e13e25c5
a4ed6c51c1ea50e1eaab4c7079bf0136eaea6f59b730e59005b0692ed81aa265
e80ee204c59b16574498a05b0cd9b99cd646ca8e939c4f6b20ef14e14f993bdd
0c241f6d372e23354a35d8e628a7e193a248d6bee0f10814f2d22a9fe51bf821
a2b3dc262aaff5f2f1994b90fef0d6bb44fd1d5f737cbaa1a76c0e78f0cb4cd2
027f2d4ac7855ecf612d702da94e6b490278937232d17b588296a4e8345463cb
179894cf9ff566716e2273cfb503d5da0318bdf2269fc0465c12355f84ed487c
68c2071cbe860eb12b114a9554156e64e79beab22fd5de4f1e271188c9026065
49c9236b7275b28c52175d14a5b1a254c1b7f15eac5840ce575cf9044ff3df38
63d967402cc89d934e11ff8b8ba6956dcbe50e7db4292fbe492aaf676ada7cab
0495143c5c6b5f61c29cb903f360f487f8321b2f52c48529e49f14ae3e573d9f
dc6e1573603de5e796caeed04f7d7d99fdce9a9b0159f97e299621c755b595b7
d02bd574409e65c63e70a659aacc3ddc86ae8ee4f420100d5af6b554b72e612e
0208dc062f7c5bd55f44dea56604c85f25f92a1cf30529d7fe1e8c48d46f0c07
5b05da3cdf2351c04e91da15cb0e0f06b4a8c4ca5e00e4c589cadbe63c60227e
1a98748a325fde9787aded5c7f2c528b9c10ffb623b71cb13e6b973a493f2b24
e7434e51c851bc1727afc92307eeb3b00210a5fa9c190290eae3256e
  1. msg_len disagrees with the length, from the D.5 request; dropped at parse.

0c7d01030001c00913e02a63e4cf532d9b2ce282fad85af699815c18c595ea80
4462a794f7510000761a4f21385317432fe08b6934ba38aee70f5bd4274426b4
f2b8c891fb9a0eb9cb6b46c4d9aa3cbb083a60364594b29d3b6254abbc123da4
80e7a3257c6845d701cd0c20164d0483d23698f7ea7850d83d31652be789af8d
65b4ab282a44157a6508b132399052034e2719cb09a257b858b964c652244259
9fc4959ff775768938e10399d4691536899928219ab59a4a06db3e0576089477
586a7510a7597004f13577028fe9bc65eb46aafb6368e1ea72e1180dc81b7858
083f05e46a06bac004b76f119c1d433249f31cc158316693990171179c55a15f
4e0cc75264328ec10d5d6a39bcd375c8913e82109f93335438e7848c28c3ee21
2c590c1c1e5129098584d1646f99cacdbcc63743f7ce4bab9f9f979c4bf6bfa0
09af7ee558cdcc39dbea52e46507d973905be2c6ebb87b21794db7c24f4ed47d
2ff653ac708bf6b8134831329065aaa87b782248a4e5491c5dd934d9a866143a
5d2b0a94d3657cece8869b0a73088b8e242181218806b3a6b25c039eaee17611
c88e1d696bda574735aa6621637e46108a94f077053653610811f5f403b2689a
3088c2bb24354014baa3dc625313715a051e262811d29964ee2c8df6a481a9a1
6f62b3bd4ecc9266fa388119601afc0ff863cd2ff1a103c077c6385245a20b86
d6658e13650f68aabfeb693886cdfbe47262cb33d96ab3ad6a4e580501e74a8e
a6fb3f807223f2da5a83443289903ea1825fb47bc98b502d050b7f1037684ce7
a2ade624298c2a96080483787ae8a6be49f1beee8b34173ac15a54cab416b1fa
a870f0f407efb4715c8c6f71ac080063299c47c130e64d1e02339a9426582c1c
0ee363b95b42f6d4ccdfcb308101c3a14631ee2574d66b15c09528e8c5c5eaa0
766a7a10e40380df9c4eed293597b02139ea981c5a2d33db0c788ba532353933
209517158d00281b009a947cc03a7ae867bfea99bf706c423818d68a8db63abd
cd26be62486bbf230dbc1456e1666d7b0254f72aaf09f09cfc686e3ff850e2dc
af42b26445d17d4d55af80e630d51097c9d27f3a5a3f81d50bc46b1de23073fd
e890a85ac5050a1bb701020eeac7ae4909446a89b7d91f19eb86d9423425bc6c
1713841d8323fe2b1428720a3d066dfddb008b584f704625905317a761720ecc
4ec28607dea6153119af49b4b133e018f9467846ec01436108676c24a2213f05
55ca4dd769fbf64704d32d50570d12d4abf496523f2b7f1a18b82080027c7c6a
debc0868e3a6321a6c6c369d2ac55d7e867367c76d9438b3f1c42260a268ac02
82b277323c64031ff87855474b47803215370b6e354871892ff85c9c01aa1484
f9027204a439d1c6a0348f854955bd909609c793ce41ccfe0579bdc4bf11d17e
ec4288371b4534e12734346fb8ab4561d550dee81b5f7b6dd6a93465612b68b5
9cb82b2d2aea2569219afae57999a0365266a7a1679deb6b161ad96a76872dcc
a390264b6674b631595a86b0070bb4bb82005870e9f53fa8327cb7bba6da019c
f5d6a757c74da5a26be430655a481010178389290f7f48bc76da8582d14911b3
2d716b8baa789f13606612517e9fa1a0201885a21108d05ba50adb5057f6265d
8925fa95a4a93aaa82c06d42f199cea14f71c5a18bc6cd8cd3158922206fe855
a9b05794cb9bb83aa84e975799298ee1b85f9a4070317439c48202325907947b
100d154a38a6b8ddf392662bafd2ec061b6191d4ab01c32c0b8b3abf0fc919d5
8699b0006c7b972223bb5185a88d8fa37696f028c7f1214fd131276b950f295c
f4ea7c881c81c0da8271b53e2d3059a853590bfb13eee422d60c58a1f557a990
c80b70b68736055db9237dca2ae5f4974ef764fa1c419ad24d63cb2e96e1ad64
9070e6363ce4877317558ab631453b3c358d7860e39a49e2d011d4f00a5bc756
1c27c1c881ba199362e61c840e6ac1ba460b87305c5a0ac4b9d447950578abf5
c9cd39c20bb0ca742b0a88968651300f12bb5965fab8b1740785db5e6f840548
85b2658c7faa6306ae03b465327f5196a3b9d2040c34881aa60ad0f45be7198b
ebe6b2d0415f1b48075feabe381c0cb07a7e276a0147c988044645b10a826745
567c37a65e257bf7c80abfc8330832094e8227fbd68933f4a1c3428ccf271f5e
e62d3b982538722a3ba81253bae0caf30084efd7e03913eb4852056af5184bdf
0953e0d84a640a7472440b8fdbf5a91705fe2d4a22bd6c7a0ab58c531dc8a18f
05f92125b319957aeaa2d17d809f9a2f71ced9ab19900e9386f2b5df50b688f4
2be44059f17f75d01353fc2c164e126d750562bf5742614f231e3dc3d620f798
07f029ce9638e0c75c0d76642f72f582801f1ee731cf1511fe9e25251c069ea7
35a53ba178932da924f94b6a0b75aec28c6c9dfce3b93a1c57d281adf56f9e44
77b9a7a534549f5970004acf7d376fdefc2698d460bee8638d83225676834d9d
b0779891bd42ca552350392e0b6b49d0797f50da5028199a23735ddeb2392325
e0b034f186b69f7e8b17d40dba33f28d975445381d52910de6958da8cc7fe93e
efe0405f3c1876f3efd7322fdfca7c30f0958e071c39cc3a096802fa106dc219
cb0b8b9dba502e3061bceefadaf173699a47b1a24cf5cdfab2013b142a341e13
2ddf12276984ab955fa4d50de980e05d26106ffa00053425ec5330e1eff24a03
8092ca480bbc249073089e674953fdd717a52de4da23f1cfb228cd79c1d13eac
da87e8fa7e743ebd11c57c4c57b133384747dbbda91ef98b921d718d8632c727
6f4fb964fb01ab9b306795002b9b87f8eda2e761d57b608cd6961f784d110635
0e858f4860c4c83824163889e388c832c2b6673dc2f898e430747a330468fb35
4d704ab4ec4a7850512929c7919668b66d8899bd2646879019f0a80ed8dc8d33
b7c89ec0039a40cff1ce0fcf37b341c98e9e04cb3a3b5a061daa056d2d5d2522
b988ac3234be654ca907c6530fc9866e517c897e2767ee97d329c6def846160a
bea729f3054924b0f2a48889da4269fc074ead921af746c4d4f968b29a6432e6
05939ad15b05ef9e8698bd2225aa414151c8a350e34fdedf441ea45c17545a71
8c5653226d43596feb9793dacefb723af5bedf3b818d12d0f0618a2ac7153b13
be2568c735448c723000a909413cd3ca22192fc91e8aff02b0e02f4a2b06546d
29df22b487e44788c1d8033eaeea4d6eff0d4ebb01d416a6135dd52cfb329ac8
612ac6092880632c6d6f9111466a277510e4a8ff9203b529ed021dde1931ff1f
97d8bf489376c4117874821dd62f34a72f94953e66e35c8d2faa930dd3aa1242
c062be94b059223c299b2003153f0aab21f9f7c2c22131e1ebce5f0605b05992
f0a66c8f076cf890542c93048c1e316b740b877f4c8bfc59cff93e7f86c2482e
b343cfdb236ca393fe9f34f24dd56c1224708cd03eb54c3564900162207d1a46
0496322e4653a83313deec40a272f58258c66595ca189c2fc173845ce487d850
be181a222393bcec9d4ea47ecbe5d41ecc3881befd9f5076531e14ec103e1601
54dbaec83c6c12df0053cd03ff73007b8fd62044f99c73aa5e90df466bcaaa32
2f4f05bee2c257948a006e253848f50bb65420a580beee864e3e8df4dd5a67f5
ca440400521ee23b7f9917504a7afa39f07da83d03a9634dfcc03e47c8505c3b
25da24a4332d4d464961564f321b7963639fbff9addeb2881d463e49e13e25c5
a4ed6c51c1ea50e1eaab4c7079bf0136eaea6f59b730e59005b0692ed81aa265
e80ee204c59b16574498a05b0cd9b99cd646ca8e939c4f6b20ef14e14f993bdd
0c241f6d372e23354a35d8e628a7e193a248d6bee0f10814f2d22a9fe51bf821
a2b3dc262aaff5f2f1994b90fef0d6bb44fd1d5f737cbaa1a76c0e78f0cb4cd2
027f2d4ac7855ecf612d702da94e6b490278937232d17b588296a4e8345463cb
179894cf9ff566716e2273cfb503d5da0318bdf2269fc0465c12355f84ed487c
68c2071cbe860eb12b114a9554156e64e79beab22fd5de4f1e271188c9026065
49c9236b7275b28c52175d14a5b1a254c1b7f15eac5840ce575cf9044ff3df38
63d967402cc89d934e11ff8b8ba6956dcbe50e7db4292fbe492aaf676ada7cab
0495143c5c6b5f61c29cb903f360f487f8321b2f52c48529e49f14ae3e573d9f
dc6e1573603de5e796caeed04f7d7d99fdce9a9b0159f97e299621c755b595b7
d02bd574409e65c63e70a659aacc3ddc86ae8ee4f420100d5af6b554b72e612e
0208dc062f7c5bd55f44dea56604c85f25f92a1cf30529d7fe1e8c48d46f0c07
5b05da3cdf2351c04e91da15cb0e0f06b4a8c4ca5e00e4c589cadbe63c60227e
1a98748a325fde9787aded5c7f2c528b9c10ffb623b71cb13e6b973a493f2b24
e7434e51c851bc1727afc92307eeb3b00210a5fa9c190290eae3256e
  1. one octet too long, from the D.5 request; dropped at open.

0c7d01030001c00913e02a63e4cf532d9b2ce282fad85af699815c18c595ea80
4462a794f7510000761a4f21385317432fe08b6934ba38aee70f5bd4274426b4
f2b8c891fb9a0eb9cb6b46c4d9aa3cbb083a60364594b29d3b6254abbc123da4
80e7a3257c6845d701cd0c20164d0483d23698f7ea7850d83d31652be789af8d
65b4ab282a44157a6508b132399052034e2719cb09a257b858b964c652244259
9fc4959ff775768938e10399d4691536899928219ab59a4a06db3e0576089477
586a7510a7597004f13577028fe9bc65eb46aafb6368e1ea72e1180dc81b7858
083f05e46a06bac004b76f119c1d433249f31cc158316693990171179c55a15f
4e0cc75264328ec10d5d6a39bcd375c8913e82109f93335438e7848c28c3ee21
2c590c1c1e5129098584d1646f99cacdbcc63743f7ce4bab9f9f979c4bf6bfa0
09af7ee558cdcc39dbea52e46507d973905be2c6ebb87b21794db7c24f4ed47d
2ff653ac708bf6b8134831329065aaa87b782248a4e5491c5dd934d9a866143a
5d2b0a94d3657cece8869b0a73088b8e242181218806b3a6b25c039eaee17611
c88e1d696bda574735aa6621637e46108a94f077053653610811f5f403b2689a
3088c2bb24354014baa3dc625313715a051e262811d29964ee2c8df6a481a9a1
6f62b3bd4ecc9266fa388119601afc0ff863cd2ff1a103c077c6385245a20b86
d6658e13650f68aabfeb693886cdfbe47262cb33d96ab3ad6a4e580501e74a8e
a6fb3f807223f2da5a83443289903ea1825fb47bc98b502d050b7f1037684ce7
a2ade624298c2a96080483787ae8a6be49f1beee8b34173ac15a54cab416b1fa
a870f0f407efb4715c8c6f71ac080063299c47c130e64d1e02339a9426582c1c
0ee363b95b42f6d4ccdfcb308101c3a14631ee2574d66b15c09528e8c5c5eaa0
766a7a10e40380df9c4eed293597b02139ea981c5a2d33db0c788ba532353933
209517158d00281b009a947cc03a7ae867bfea99bf706c423818d68a8db63abd
cd26be62486bbf230dbc1456e1666d7b0254f72aaf09f09cfc686e3ff850e2dc
af42b26445d17d4d55af80e630d51097c9d27f3a5a3f81d50bc46b1de23073fd
e890a85ac5050a1bb701020eeac7ae4909446a89b7d91f19eb86d9423425bc6c
1713841d8323fe2b1428720a3d066dfddb008b584f704625905317a761720ecc
4ec28607dea6153119af49b4b133e018f9467846ec01436108676c24a2213f05
55ca4dd769fbf64704d32d50570d12d4abf496523f2b7f1a18b82080027c7c6a
debc0868e3a6321a6c6c369d2ac55d7e867367c76d9438b3f1c42260a268ac02
82b277323c64031ff87855474b47803215370b6e354871892ff85c9c01aa1484
f9027204a439d1c6a0348f854955bd909609c793ce41ccfe0579bdc4bf11d17e
ec4288371b4534e12734346fb8ab4561d550dee81b5f7b6dd6a93465612b68b5
9cb82b2d2aea2569219afae57999a0365266a7a1679deb6b161ad96a76872dcc
a390264b6674b631595a86b0070bb4bb82005870e9f53fa8327cb7bba6da019c
f5d6a757c74da5a26be430655a481010178389290f7f48bc76da8582d14911b3
2d716b8baa789f13606612517e9fa1a0201885a21108d05ba50adb5057f6265d
8925fa95a4a93aaa82c06d42f199cea14f71c5a18bc6cd8cd3158922206fe855
a9b05794cb9bb83aa84e975799298ee1b85f9a4070317439c48202325907947b
100d154a38a6b8ddf392662bafd2ec061b6191d4ab01c32c0b8b3abf0fc919d5
8699b0006c7b972223bb5185a88d8fa37696f028c7f1214fd131276b950f295c
f4ea7c881c81c0da8271b53e2d3059a853590bfb13eee422d60c58a1f557a990
c80b70b68736055db9237dca2ae5f4974ef764fa1c419ad24d63cb2e96e1ad64
9070e6363ce4877317558ab631453b3c358d7860e39a49e2d011d4f00a5bc756
1c27c1c881ba199362e61c840e6ac1ba460b87305c5a0ac4b9d447950578abf5
c9cd39c20bb0ca742b0a88968651300f12bb5965fab8b1740785db5e6f840548
85b2658c7faa6306ae03b465327f5196a3b9d2040c34881aa60ad0f45be7198b
ebe6b2d0415f1b48075feabe381c0cb07a7e276a0147c988044645b10a826745
567c37a65e257bf7c80abfc8330832094e8227fbd68933f4a1c3428ccf271f5e
e62d3b982538722a3ba81253bae0caf30084efd7e03913eb4852056af5184bdf
0953e0d84a640a7472440b8fdbf5a91705fe2d4a22bd6c7a0ab58c531dc8a18f
05f92125b319957aeaa2d17d809f9a2f71ced9ab19900e9386f2b5df50b688f4
2be44059f17f75d01353fc2c164e126d750562bf5742614f231e3dc3d620f798
07f029ce9638e0c75c0d76642f72f582801f1ee731cf1511fe9e25251c069ea7
35a53ba178932da924f94b6a0b75aec28c6c9dfce3b93a1c57d281adf56f9e44
77b9a7a534549f5970004acf7d376fdefc2698d460bee8638d83225676834d9d
b0779891bd42ca552350392e0b6b49d0797f50da5028199a23735ddeb2392325
e0b034f186b69f7e8b17d40dba33f28d975445381d52910de6958da8cc7fe93e
efe0405f3c1876f3efd7322fdfca7c30f0958e071c39cc3a096802fa106dc219
cb0b8b9dba502e3061bceefadaf173699a47b1a24cf5cdfab2013b142a341e13
2ddf12276984ab955fa4d50de980e05d26106ffa00053425ec5330e1eff24a03
8092ca480bbc249073089e674953fdd717a52de4da23f1cfb228cd79c1d13eac
da87e8fa7e743ebd11c57c4c57b133384747dbbda91ef98b921d718d8632c727
6f4fb964fb01ab9b306795002b9b87f8eda2e761d57b608cd6961f784d110635
0e858f4860c4c83824163889e388c832c2b6673dc2f898e430747a330468fb35
4d704ab4ec4a7850512929c7919668b66d8899bd2646879019f0a80ed8dc8d33
b7c89ec0039a40cff1ce0fcf37b341c98e9e04cb3a3b5a061daa056d2d5d2522
b988ac3234be654ca907c6530fc9866e517c897e2767ee97d329c6def846160a
bea729f3054924b0f2a48889da4269fc074ead921af746c4d4f968b29a6432e6
05939ad15b05ef9e8698bd2225aa414151c8a350e34fdedf441ea45c17545a71
8c5653226d43596feb9793dacefb723af5bedf3b818d12d0f0618a2ac7153b13
be2568c735448c723000a909413cd3ca22192fc91e8aff02b0e02f4a2b06546d
29df22b487e44788c1d8033eaeea4d6eff0d4ebb01d416a6135dd52cfb329ac8
612ac6092880632c6d6f9111466a277510e4a8ff9203b529ed021dde1931ff1f
97d8bf489376c4117874821dd62f34a72f94953e66e35c8d2faa930dd3aa1242
c062be94b059223c299b2003153f0aab21f9f7c2c22131e1ebce5f0605b05992
f0a66c8f076cf890542c93048c1e316b740b877f4c8bfc59cff93e7f86c2482e
b343cfdb236ca393fe9f34f24dd56c1224708cd03eb54c3564900162207d1a46
0496322e4653a83313deec40a272f58258c66595ca189c2fc173845ce487d850
be181a222393bcec9d4ea47ecbe5d41ecc3881befd9f5076531e14ec103e1601
54dbaec83c6c12df0053cd03ff73007b8fd62044f99c73aa5e90df466bcaaa32
2f4f05bee2c257948a006e253848f50bb65420a580beee864e3e8df4dd5a67f5
ca440400521ee23b7f9917504a7afa39f07da83d03a9634dfcc03e47c8505c3b
25da24a4332d4d464961564f321b7963639fbff9addeb2881d463e49e13e25c5
a4ed6c51c1ea50e1eaab4c7079bf0136eaea6f59b730e59005b0692ed81aa265
e80ee204c59b16574498a05b0cd9b99cd646ca8e939c4f6b20ef14e14f993bdd
0c241f6d372e23354a35d8e628a7e193a248d6bee0f10814f2d22a9fe51bf821
a2b3dc262aaff5f2f1994b90fef0d6bb44fd1d5f737cbaa1a76c0e78f0cb4cd2
027f2d4ac7855ecf612d702da94e6b490278937232d17b588296a4e8345463cb
179894cf9ff566716e2273cfb503d5da0318bdf2269fc0465c12355f84ed487c
68c2071cbe860eb12b114a9554156e64e79beab22fd5de4f1e271188c9026065
49c9236b7275b28c52175d14a5b1a254c1b7f15eac5840ce575cf9044ff3df38
63d967402cc89d934e11ff8b8ba6956dcbe50e7db4292fbe492aaf676ada7cab
0495143c5c6b5f61c29cb903f360f487f8321b2f52c48529e49f14ae3e573d9f
dc6e1573603de5e796caeed04f7d7d99fdce9a9b0159f97e299621c755b595b7
d02bd574409e65c63e70a659aacc3ddc86ae8ee4f420100d5af6b554b72e612e
0208dc062f7c5bd55f44dea56604c85f25f92a1cf30529d7fe1e8c48d46f0c07
5b05da3cdf2351c04e91da15cb0e0f06b4a8c4ca5e00e4c589cadbe63c60227e
1a98748a325fde9787aded5c7f2c528b9c10ffb623b71cb13e6b973a493f2b24
e7434e51c851bc1727afc92307eeb3b00210a5fa9c190290eae3256e00
  1. one octet too short, from the D.5 request; dropped at open.

0c7b01030001c00913e02a63e4cf532d9b2ce282fad85af699815c18c595ea80
4462a794f7510000761a4f21385317432fe08b6934ba38aee70f5bd4274426b4
f2b8c891fb9a0eb9cb6b46c4d9aa3cbb083a60364594b29d3b6254abbc123da4
80e7a3257c6845d701cd0c20164d0483d23698f7ea7850d83d31652be789af8d
65b4ab282a44157a6508b132399052034e2719cb09a257b858b964c652244259
9fc4959ff775768938e10399d4691536899928219ab59a4a06db3e0576089477
586a7510a7597004f13577028fe9bc65eb46aafb6368e1ea72e1180dc81b7858
083f05e46a06bac004b76f119c1d433249f31cc158316693990171179c55a15f
4e0cc75264328ec10d5d6a39bcd375c8913e82109f93335438e7848c28c3ee21
2c590c1c1e5129098584d1646f99cacdbcc63743f7ce4bab9f9f979c4bf6bfa0
09af7ee558cdcc39dbea52e46507d973905be2c6ebb87b21794db7c24f4ed47d
2ff653ac708bf6b8134831329065aaa87b782248a4e5491c5dd934d9a866143a
5d2b0a94d3657cece8869b0a73088b8e242181218806b3a6b25c039eaee17611
c88e1d696bda574735aa6621637e46108a94f077053653610811f5f403b2689a
3088c2bb24354014baa3dc625313715a051e262811d29964ee2c8df6a481a9a1
6f62b3bd4ecc9266fa388119601afc0ff863cd2ff1a103c077c6385245a20b86
d6658e13650f68aabfeb693886cdfbe47262cb33d96ab3ad6a4e580501e74a8e
a6fb3f807223f2da5a83443289903ea1825fb47bc98b502d050b7f1037684ce7
a2ade624298c2a96080483787ae8a6be49f1beee8b34173ac15a54cab416b1fa
a870f0f407efb4715c8c6f71ac080063299c47c130e64d1e02339a9426582c1c
0ee363b95b42f6d4ccdfcb308101c3a14631ee2574d66b15c09528e8c5c5eaa0
766a7a10e40380df9c4eed293597b02139ea981c5a2d33db0c788ba532353933
209517158d00281b009a947cc03a7ae867bfea99bf706c423818d68a8db63abd
cd26be62486bbf230dbc1456e1666d7b0254f72aaf09f09cfc686e3ff850e2dc
af42b26445d17d4d55af80e630d51097c9d27f3a5a3f81d50bc46b1de23073fd
e890a85ac5050a1bb701020eeac7ae4909446a89b7d91f19eb86d9423425bc6c
1713841d8323fe2b1428720a3d066dfddb008b584f704625905317a761720ecc
4ec28607dea6153119af49b4b133e018f9467846ec01436108676c24a2213f05
55ca4dd769fbf64704d32d50570d12d4abf496523f2b7f1a18b82080027c7c6a
debc0868e3a6321a6c6c369d2ac55d7e867367c76d9438b3f1c42260a268ac02
82b277323c64031ff87855474b47803215370b6e354871892ff85c9c01aa1484
f9027204a439d1c6a0348f854955bd909609c793ce41ccfe0579bdc4bf11d17e
ec4288371b4534e12734346fb8ab4561d550dee81b5f7b6dd6a93465612b68b5
9cb82b2d2aea2569219afae57999a0365266a7a1679deb6b161ad96a76872dcc
a390264b6674b631595a86b0070bb4bb82005870e9f53fa8327cb7bba6da019c
f5d6a757c74da5a26be430655a481010178389290f7f48bc76da8582d14911b3
2d716b8baa789f13606612517e9fa1a0201885a21108d05ba50adb5057f6265d
8925fa95a4a93aaa82c06d42f199cea14f71c5a18bc6cd8cd3158922206fe855
a9b05794cb9bb83aa84e975799298ee1b85f9a4070317439c48202325907947b
100d154a38a6b8ddf392662bafd2ec061b6191d4ab01c32c0b8b3abf0fc919d5
8699b0006c7b972223bb5185a88d8fa37696f028c7f1214fd131276b950f295c
f4ea7c881c81c0da8271b53e2d3059a853590bfb13eee422d60c58a1f557a990
c80b70b68736055db9237dca2ae5f4974ef764fa1c419ad24d63cb2e96e1ad64
9070e6363ce4877317558ab631453b3c358d7860e39a49e2d011d4f00a5bc756
1c27c1c881ba199362e61c840e6ac1ba460b87305c5a0ac4b9d447950578abf5
c9cd39c20bb0ca742b0a88968651300f12bb5965fab8b1740785db5e6f840548
85b2658c7faa6306ae03b465327f5196a3b9d2040c34881aa60ad0f45be7198b
ebe6b2d0415f1b48075feabe381c0cb07a7e276a0147c988044645b10a826745
567c37a65e257bf7c80abfc8330832094e8227fbd68933f4a1c3428ccf271f5e
e62d3b982538722a3ba81253bae0caf30084efd7e03913eb4852056af5184bdf
0953e0d84a640a7472440b8fdbf5a91705fe2d4a22bd6c7a0ab58c531dc8a18f
05f92125b319957aeaa2d17d809f9a2f71ced9ab19900e9386f2b5df50b688f4
2be44059f17f75d01353fc2c164e126d750562bf5742614f231e3dc3d620f798
07f029ce9638e0c75c0d76642f72f582801f1ee731cf1511fe9e25251c069ea7
35a53ba178932da924f94b6a0b75aec28c6c9dfce3b93a1c57d281adf56f9e44
77b9a7a534549f5970004acf7d376fdefc2698d460bee8638d83225676834d9d
b0779891bd42ca552350392e0b6b49d0797f50da5028199a23735ddeb2392325
e0b034f186b69f7e8b17d40dba33f28d975445381d52910de6958da8cc7fe93e
efe0405f3c1876f3efd7322fdfca7c30f0958e071c39cc3a096802fa106dc219
cb0b8b9dba502e3061bceefadaf173699a47b1a24cf5cdfab2013b142a341e13
2ddf12276984ab955fa4d50de980e05d26106ffa00053425ec5330e1eff24a03
8092ca480bbc249073089e674953fdd717a52de4da23f1cfb228cd79c1d13eac
da87e8fa7e743ebd11c57c4c57b133384747dbbda91ef98b921d718d8632c727
6f4fb964fb01ab9b306795002b9b87f8eda2e761d57b608cd6961f784d110635
0e858f4860c4c83824163889e388c832c2b6673dc2f898e430747a330468fb35
4d704ab4ec4a7850512929c7919668b66d8899bd2646879019f0a80ed8dc8d33
b7c89ec0039a40cff1ce0fcf37b341c98e9e04cb3a3b5a061daa056d2d5d2522
b988ac3234be654ca907c6530fc9866e517c897e2767ee97d329c6def846160a
bea729f3054924b0f2a48889da4269fc074ead921af746c4d4f968b29a6432e6
05939ad15b05ef9e8698bd2225aa414151c8a350e34fdedf441ea45c17545a71
8c5653226d43596feb9793dacefb723af5bedf3b818d12d0f0618a2ac7153b13
be2568c735448c723000a909413cd3ca22192fc91e8aff02b0e02f4a2b06546d
29df22b487e44788c1d8033eaeea4d6eff0d4ebb01d416a6135dd52cfb329ac8
612ac6092880632c6d6f9111466a277510e4a8ff9203b529ed021dde1931ff1f
97d8bf489376c4117874821dd62f34a72f94953e66e35c8d2faa930dd3aa1242
c062be94b059223c299b2003153f0aab21f9f7c2c22131e1ebce5f0605b05992
f0a66c8f076cf890542c93048c1e316b740b877f4c8bfc59cff93e7f86c2482e
b343cfdb236ca393fe9f34f24dd56c1224708cd03eb54c3564900162207d1a46
0496322e4653a83313deec40a272f58258c66595ca189c2fc173845ce487d850
be181a222393bcec9d4ea47ecbe5d41ecc3881befd9f5076531e14ec103e1601
54dbaec83c6c12df0053cd03ff73007b8fd62044f99c73aa5e90df466bcaaa32
2f4f05bee2c257948a006e253848f50bb65420a580beee864e3e8df4dd5a67f5
ca440400521ee23b7f9917504a7afa39f07da83d03a9634dfcc03e47c8505c3b
25da24a4332d4d464961564f321b7963639fbff9addeb2881d463e49e13e25c5
a4ed6c51c1ea50e1eaab4c7079bf0136eaea6f59b730e59005b0692ed81aa265
e80ee204c59b16574498a05b0cd9b99cd646ca8e939c4f6b20ef14e14f993bdd
0c241f6d372e23354a35d8e628a7e193a248d6bee0f10814f2d22a9fe51bf821
a2b3dc262aaff5f2f1994b90fef0d6bb44fd1d5f737cbaa1a76c0e78f0cb4cd2
027f2d4ac7855ecf612d702da94e6b490278937232d17b588296a4e8345463cb
179894cf9ff566716e2273cfb503d5da0318bdf2269fc0465c12355f84ed487c
68c2071cbe860eb12b114a9554156e64e79beab22fd5de4f1e271188c9026065
49c9236b7275b28c52175d14a5b1a254c1b7f15eac5840ce575cf9044ff3df38
63d967402cc89d934e11ff8b8ba6956dcbe50e7db4292fbe492aaf676ada7cab
0495143c5c6b5f61c29cb903f360f487f8321b2f52c48529e49f14ae3e573d9f
dc6e1573603de5e796caeed04f7d7d99fdce9a9b0159f97e299621c755b595b7
d02bd574409e65c63e70a659aacc3ddc86ae8ee4f420100d5af6b554b72e612e
0208dc062f7c5bd55f44dea56604c85f25f92a1cf30529d7fe1e8c48d46f0c07
5b05da3cdf2351c04e91da15cb0e0f06b4a8c4ca5e00e4c589cadbe63c60227e
1a98748a325fde9787aded5c7f2c528b9c10ffb623b71cb13e6b973a493f2b24
e7434e51c851bc1727afc92307eeb3b00210a5fa9c190290eae325
  1. wrong tag, from the D.5 request; dropped at open.

0c7c01030001c00913e02a63e4cf532d9b2ce282fad85af699815c18c595ea80
4462a794f7510000761a4f21385317432fe08b6934ba38aee70f5bd4274426b4
f2b8c891fb9a0eb9cb6b46c4d9aa3cbb083a60364594b29d3b6254abbc123da4
80e7a3257c6845d701cd0c20164d0483d23698f7ea7850d83d31652be789af8d
65b4ab282a44157a6508b132399052034e2719cb09a257b858b964c652244259
9fc4959ff775768938e10399d4691536899928219ab59a4a06db3e0576089477
586a7510a7597004f13577028fe9bc65eb46aafb6368e1ea72e1180dc81b7858
083f05e46a06bac004b76f119c1d433249f31cc158316693990171179c55a15f
4e0cc75264328ec10d5d6a39bcd375c8913e82109f93335438e7848c28c3ee21
2c590c1c1e5129098584d1646f99cacdbcc63743f7ce4bab9f9f979c4bf6bfa0
09af7ee558cdcc39dbea52e46507d973905be2c6ebb87b21794db7c24f4ed47d
2ff653ac708bf6b8134831329065aaa87b782248a4e5491c5dd934d9a866143a
5d2b0a94d3657cece8869b0a73088b8e242181218806b3a6b25c039eaee17611
c88e1d696bda574735aa6621637e46108a94f077053653610811f5f403b2689a
3088c2bb24354014baa3dc625313715a051e262811d29964ee2c8df6a481a9a1
6f62b3bd4ecc9266fa388119601afc0ff863cd2ff1a103c077c6385245a20b86
d6658e13650f68aabfeb693886cdfbe47262cb33d96ab3ad6a4e580501e74a8e
a6fb3f807223f2da5a83443289903ea1825fb47bc98b502d050b7f1037684ce7
a2ade624298c2a96080483787ae8a6be49f1beee8b34173ac15a54cab416b1fa
a870f0f407efb4715c8c6f71ac080063299c47c130e64d1e02339a9426582c1c
0ee363b95b42f6d4ccdfcb308101c3a14631ee2574d66b15c09528e8c5c5eaa0
766a7a10e40380df9c4eed293597b02139ea981c5a2d33db0c788ba532353933
209517158d00281b009a947cc03a7ae867bfea99bf706c423818d68a8db63abd
cd26be62486bbf230dbc1456e1666d7b0254f72aaf09f09cfc686e3ff850e2dc
af42b26445d17d4d55af80e630d51097c9d27f3a5a3f81d50bc46b1de23073fd
e890a85ac5050a1bb701020eeac7ae4909446a89b7d91f19eb86d9423425bc6c
1713841d8323fe2b1428720a3d066dfddb008b584f704625905317a761720ecc
4ec28607dea6153119af49b4b133e018f9467846ec01436108676c24a2213f05
55ca4dd769fbf64704d32d50570d12d4abf496523f2b7f1a18b82080027c7c6a
debc0868e3a6321a6c6c369d2ac55d7e867367c76d9438b3f1c42260a268ac02
82b277323c64031ff87855474b47803215370b6e354871892ff85c9c01aa1484
f9027204a439d1c6a0348f854955bd909609c793ce41ccfe0579bdc4bf11d17e
ec4288371b4534e12734346fb8ab4561d550dee81b5f7b6dd6a93465612b68b5
9cb82b2d2aea2569219afae57999a0365266a7a1679deb6b161ad96a76872dcc
a390264b6674b631595a86b0070bb4bb82005870e9f53fa8327cb7bba6da019c
f5d6a757c74da5a26be430655a481010178389290f7f48bc76da8582d14911b3
2d716b8baa789f13606612517e9fa1a0201885a21108d05ba50adb5057f6265d
8925fa95a4a93aaa82c06d42f199cea14f71c5a18bc6cd8cd3158922206fe855
a9b05794cb9bb83aa84e975799298ee1b85f9a4070317439c48202325907947b
100d154a38a6b8ddf392662bafd2ec061b6191d4ab01c32c0b8b3abf0fc919d5
8699b0006c7b972223bb5185a88d8fa37696f028c7f1214fd131276b950f295c
f4ea7c881c81c0da8271b53e2d3059a853590bfb13eee422d60c58a1f557a990
c80b70b68736055db9237dca2ae5f4974ef764fa1c419ad24d63cb2e96e1ad64
9070e6363ce4877317558ab631453b3c358d7860e39a49e2d011d4f00a5bc756
1c27c1c881ba199362e61c840e6ac1ba460b87305c5a0ac4b9d447950578abf5
c9cd39c20bb0ca742b0a88968651300f12bb5965fab8b1740785db5e6f840548
85b2658c7faa6306ae03b465327f5196a3b9d2040c34881aa60ad0f45be7198b
ebe6b2d0415f1b48075feabe381c0cb07a7e276a0147c988044645b10a826745
567c37a65e257bf7c80abfc8330832094e8227fbd68933f4a1c3428ccf271f5e
e62d3b982538722a3ba81253bae0caf30084efd7e03913eb4852056af5184bdf
0953e0d84a640a7472440b8fdbf5a91705fe2d4a22bd6c7a0ab58c531dc8a18f
05f92125b319957aeaa2d17d809f9a2f71ced9ab19900e9386f2b5df50b688f4
2be44059f17f75d01353fc2c164e126d750562bf5742614f231e3dc3d620f798
07f029ce9638e0c75c0d76642f72f582801f1ee731cf1511fe9e25251c069ea7
35a53ba178932da924f94b6a0b75aec28c6c9dfce3b93a1c57d281adf56f9e44
77b9a7a534549f5970004acf7d376fdefc2698d460bee8638d83225676834d9d
b0779891bd42ca552350392e0b6b49d0797f50da5028199a23735ddeb2392325
e0b034f186b69f7e8b17d40dba33f28d975445381d52910de6958da8cc7fe93e
efe0405f3c1876f3efd7322fdfca7c30f0958e071c39cc3a096802fa106dc219
cb0b8b9dba502e3061bceefadaf173699a47b1a24cf5cdfab2013b142a341e13
2ddf12276984ab955fa4d50de980e05d26106ffa00053425ec5330e1eff24a03
8092ca480bbc249073089e674953fdd717a52de4da23f1cfb228cd79c1d13eac
da87e8fa7e743ebd11c57c4c57b133384747dbbda91ef98b921d718d8632c727
6f4fb964fb01ab9b306795002b9b87f8eda2e761d57b608cd6961f784d110635
0e858f4860c4c83824163889e388c832c2b6673dc2f898e430747a330468fb35
4d704ab4ec4a7850512929c7919668b66d8899bd2646879019f0a80ed8dc8d33
b7c89ec0039a40cff1ce0fcf37b341c98e9e04cb3a3b5a061daa056d2d5d2522
b988ac3234be654ca907c6530fc9866e517c897e2767ee97d329c6def846160a
bea729f3054924b0f2a48889da4269fc074ead921af746c4d4f968b29a6432e6
05939ad15b05ef9e8698bd2225aa414151c8a350e34fdedf441ea45c17545a71
8c5653226d43596feb9793dacefb723af5bedf3b818d12d0f0618a2ac7153b13
be2568c735448c723000a909413cd3ca22192fc91e8aff02b0e02f4a2b06546d
29df22b487e44788c1d8033eaeea4d6eff0d4ebb01d416a6135dd52cfb329ac8
612ac6092880632c6d6f9111466a277510e4a8ff9203b529ed021dde1931ff1f
97d8bf489376c4117874821dd62f34a72f94953e66e35c8d2faa930dd3aa1242
c062be94b059223c299b2003153f0aab21f9f7c2c22131e1ebce5f0605b05992
f0a66c8f076cf890542c93048c1e316b740b877f4c8bfc59cff93e7f86c2482e
b343cfdb236ca393fe9f34f24dd56c1224708cd03eb54c3564900162207d1a46
0496322e4653a83313deec40a272f58258c66595ca189c2fc173845ce487d850
be181a222393bcec9d4ea47ecbe5d41ecc3881befd9f5076531e14ec103e1601
54dbaec83c6c12df0053cd03ff73007b8fd62044f99c73aa5e90df466bcaaa32
2f4f05bee2c257948a006e253848f50bb65420a580beee864e3e8df4dd5a67f5
ca440400521ee23b7f9917504a7afa39f07da83d03a9634dfcc03e47c8505c3b
25da24a4332d4d464961564f321b7963639fbff9addeb2881d463e49e13e25c5
a4ed6c51c1ea50e1eaab4c7079bf0136eaea6f59b730e59005b0692ed81aa265
e80ee204c59b16574498a05b0cd9b99cd646ca8e939c4f6b20ef14e14f993bdd
0c241f6d372e23354a35d8e628a7e193a248d6bee0f10814f2d22a9fe51bf821
a2b3dc262aaff5f2f1994b90fef0d6bb44fd1d5f737cbaa1a76c0e78f0cb4cd2
027f2d4ac7855ecf612d702da94e6b490278937232d17b588296a4e8345463cb
179894cf9ff566716e2273cfb503d5da0318bdf2269fc0465c12355f84ed487c
68c2071cbe860eb12b114a9554156e64e79beab22fd5de4f1e271188c9026065
49c9236b7275b28c52175d14a5b1a254c1b7f15eac5840ce575cf9044ff3df38
63d967402cc89d934e11ff8b8ba6956dcbe50e7db4292fbe492aaf676ada7cab
0495143c5c6b5f61c29cb903f360f487f8321b2f52c48529e49f14ae3e573d9f
dc6e1573603de5e796caeed04f7d7d99fdce9a9b0159f97e299621c755b595b7
d02bd574409e65c63e70a659aacc3ddc86ae8ee4f420100d5af6b554b72e612e
0208dc062f7c5bd55f44dea56604c85f25f92a1cf30529d7fe1e8c48d46f0c07
5b05da3cdf2351c04e91da15cb0e0f06b4a8c4ca5e00e4c589cadbe63c60227e
1a98748a325fde9787aded5c7f2c528b9c10ffb623b71cb13e6b973a493f2b24
e7434e51c851bc1727afc92307eeb3b00210a5fa9c190290eae3256f
  1. reserved flag bit set, from the D.6 request; dropped at parse.

066002800001158fe87f5cf3dff06e50dbd3e81b2242314ba86c2b962f6c0b9e
0e91a04496c0000000000001ee6c52dadb064adafa5a804db37d3b998e88b3a2
2fc78c06039af4d8fa9355a51e351478c49e036e56790c9f0ec76186f5b75692
c755403a19e19a17e04a5638c19fcb4ab2489a1058efa58fc76b1a68fd8af92b
630ad01a38abe1534e503af970c8b923482b9a8a8b68f18f1932b2408da8fc9e
a1ad56ca4025e43ff02c077dab82705a66e048ce18853b15b23ab3c29c7b5165
e5593d7d8619b5940b45aefef43a0d5b562ada02355e008c2dd32455d233e09c
2dc7ebde18c081c5abe3193e714018de9fb86761eb429c35f057c801cf828a9c
b3c7fffc60512788822667557d54489062ebcfc5f067ad45e61f1cb2a505168c
80165ef8a43543556ba80e886f5558c3099bd148c93b7ac5a258b25268e5e99f
327530c5279acbf2373bb1113dad78929f19160e3bf3438ebeda56e6155898bf
5f0afc7f1e09fb74ac7fb20cec54ba8bd7d75daa08e630c47339c49f33b446ba
3803ede65f27697f4d75b13a52a14f3df91f806587431b350ec8a57a923d6996
1c2c2c58fb2c5910090069e6ee49a0245a2b270e4c928b8c7307e23226b5bd50
f695c49a198eb2e18caf73e237967d4f443811aeb63ef182d86b7f9607c0c6f4
1fead4f841603a96fbca859d2c61aafb8ece82a14765302988c2d8d5e5ab1dd2
2d307a7018daaf21ce3ca0011d58b6921751d0a26b74011c365140fd70715017
fbfd627b3a7e658163ec991103da90a1ec9de0f30d825ba4f2b5a8b6253c8b51
1844dc87894ec10a97f5342f4e6d0787f2fb11d251db66e2ced852fb6f9e6e04
2e3e03a1d34c7a73b683a0513c1dc3e4f72bb9fc05194e55a80b1f9e07d6ccc5
1508c1935a1570de20dd2177fd45950f24edaa287e9fa6836ce74c9c7dfd6669
eb1c261544504cc1d5704c05e9082b4a080feaae50a30530c46cac2334da9b3d
3e8f5d5c79ee228cf6f09105b176422ca97d84c74a0606b7d59e95e02ebbe8d1
952579589b40edc0963fd16128ada08e5d3c3117971580395eb245b28fb4736a
893dec4c6d933c2098c83fd6789953d98545ca86d0b0567bf83b544b28a21c53
567b08773d5309192dc79ddd869b2552036fccdac777aba55e4218b043a2eae6
b6665bfc430034ff0d29fee1242f5888a185c9f1def90b5248cf99ee58d1ee27
0610f79f052804db8d326d086b094f337e19a960f19dcf45f106e6aa436cc5f6
94992e74ee0209317a7a7414577553423a6196056e8a96e27db9961841e0c960
0e52ac6d55a337d652d18228b389922c4e4a55e059610d0d3e8d85f9962fd71c
218094f559829b3b80981bbeb6ea7b41f8142546ecb61e84e7d694f1f965d67c
326b9e486925a9da7134203abfbb99e0b90775dfeda824752c8958d0c2e73b8d
8a464566b7ffaad68d1224a1c57c25f9c13a5e657e9fc71157020eec5428c70b
55a9ebbc187b3312a1a56c28d3cfa90241d99e6a62904dd45e4fb50f10c5412f
bce1d53331a55513f52f65504c6ea01b4414d6c84d75e397b3ae268ad48c8b41
76323501539ab3ad7209dc49a211a180c673c2df2d9183a8e201276bbaec5400
0dd595eaeb613500988b3897db5e9645e00193d6cf20a06b22615a1e04d55457
c0fbaa56c2c4da4c25ae34f8a1e2ffdaf1ea3a2b34f2b20c259da4f9bdfd19bb
5e87a4b965d728192d2a9577cc211305ff78c1ec67f28a53d27926fa24810bbd
4bc5b02affd960a5b80b1f04e461c050c2601da8046a9ade55a7dfc18e20e9a8
1fd4ecd640412ca4735e20d366f079a2ff331b535652a595251f2748fc62fc25
341b1551786daa96662d5587fd039cce44fbb0b278168e31e2bface70562862c
056fcd382a07eadb9a4c509a174cd0a429798f8b92b9d6dcc63b05d2b42d8dac
855ba37f0282484e61962738b4a9da8f9e78b75e154ddf6299a229020ce7c1cc
90be81fe747a5a7904bca050f06237351676d4f1ddad0945d31391675da5c335
07fcfcb77950737826c41b7f8c69de30ce910cd7fa791d5c2793961f78cf3be8
08cf06d68f439cfe43dfb7aca53a4eaed3c927f813214a585d5d77fcdea94af1
4645fe8e1908c797db279f8bef06e7e4870b5852442251c06ef1e842e44eea10
2bca75c3745f447e9ca8610d1c4aea70f8bbf7ea629facbe0aaf7e9024c218d9
0408d0381f4f5852cc4411f8bf8ab95fa1491d79dfef36b32436ec2fef5337bc
4b8fe4f313d8abd4b4d3de14a0435336eeff0510de642eb354bea83120defb8a
  1. msg_len disagrees with the length, from the D.6 request; dropped at parse.

066102000001158fe87f5cf3dff06e50dbd3e81b2242314ba86c2b962f6c0b9e
0e91a04496c0000000000001ee6c52dadb064adafa5a804db37d3b998e88b3a2
2fc78c06039af4d8fa9355a51e351478c49e036e56790c9f0ec76186f5b75692
c755403a19e19a17e04a5638c19fcb4ab2489a1058efa58fc76b1a68fd8af92b
630ad01a38abe1534e503af970c8b923482b9a8a8b68f18f1932b2408da8fc9e
a1ad56ca4025e43ff02c077dab82705a66e048ce18853b15b23ab3c29c7b5165
e5593d7d8619b5940b45aefef43a0d5b562ada02355e008c2dd32455d233e09c
2dc7ebde18c081c5abe3193e714018de9fb86761eb429c35f057c801cf828a9c
b3c7fffc60512788822667557d54489062ebcfc5f067ad45e61f1cb2a505168c
80165ef8a43543556ba80e886f5558c3099bd148c93b7ac5a258b25268e5e99f
327530c5279acbf2373bb1113dad78929f19160e3bf3438ebeda56e6155898bf
5f0afc7f1e09fb74ac7fb20cec54ba8bd7d75daa08e630c47339c49f33b446ba
3803ede65f27697f4d75b13a52a14f3df91f806587431b350ec8a57a923d6996
1c2c2c58fb2c5910090069e6ee49a0245a2b270e4c928b8c7307e23226b5bd50
f695c49a198eb2e18caf73e237967d4f443811aeb63ef182d86b7f9607c0c6f4
1fead4f841603a96fbca859d2c61aafb8ece82a14765302988c2d8d5e5ab1dd2
2d307a7018daaf21ce3ca0011d58b6921751d0a26b74011c365140fd70715017
fbfd627b3a7e658163ec991103da90a1ec9de0f30d825ba4f2b5a8b6253c8b51
1844dc87894ec10a97f5342f4e6d0787f2fb11d251db66e2ced852fb6f9e6e04
2e3e03a1d34c7a73b683a0513c1dc3e4f72bb9fc05194e55a80b1f9e07d6ccc5
1508c1935a1570de20dd2177fd45950f24edaa287e9fa6836ce74c9c7dfd6669
eb1c261544504cc1d5704c05e9082b4a080feaae50a30530c46cac2334da9b3d
3e8f5d5c79ee228cf6f09105b176422ca97d84c74a0606b7d59e95e02ebbe8d1
952579589b40edc0963fd16128ada08e5d3c3117971580395eb245b28fb4736a
893dec4c6d933c2098c83fd6789953d98545ca86d0b0567bf83b544b28a21c53
567b08773d5309192dc79ddd869b2552036fccdac777aba55e4218b043a2eae6
b6665bfc430034ff0d29fee1242f5888a185c9f1def90b5248cf99ee58d1ee27
0610f79f052804db8d326d086b094f337e19a960f19dcf45f106e6aa436cc5f6
94992e74ee0209317a7a7414577553423a6196056e8a96e27db9961841e0c960
0e52ac6d55a337d652d18228b389922c4e4a55e059610d0d3e8d85f9962fd71c
218094f559829b3b80981bbeb6ea7b41f8142546ecb61e84e7d694f1f965d67c
326b9e486925a9da7134203abfbb99e0b90775dfeda824752c8958d0c2e73b8d
8a464566b7ffaad68d1224a1c57c25f9c13a5e657e9fc71157020eec5428c70b
55a9ebbc187b3312a1a56c28d3cfa90241d99e6a62904dd45e4fb50f10c5412f
bce1d53331a55513f52f65504c6ea01b4414d6c84d75e397b3ae268ad48c8b41
76323501539ab3ad7209dc49a211a180c673c2df2d9183a8e201276bbaec5400
0dd595eaeb613500988b3897db5e9645e00193d6cf20a06b22615a1e04d55457
c0fbaa56c2c4da4c25ae34f8a1e2ffdaf1ea3a2b34f2b20c259da4f9bdfd19bb
5e87a4b965d728192d2a9577cc211305ff78c1ec67f28a53d27926fa24810bbd
4bc5b02affd960a5b80b1f04e461c050c2601da8046a9ade55a7dfc18e20e9a8
1fd4ecd640412ca4735e20d366f079a2ff331b535652a595251f2748fc62fc25
341b1551786daa96662d5587fd039cce44fbb0b278168e31e2bface70562862c
056fcd382a07eadb9a4c509a174cd0a429798f8b92b9d6dcc63b05d2b42d8dac
855ba37f0282484e61962738b4a9da8f9e78b75e154ddf6299a229020ce7c1cc
90be81fe747a5a7904bca050f06237351676d4f1ddad0945d31391675da5c335
07fcfcb77950737826c41b7f8c69de30ce910cd7fa791d5c2793961f78cf3be8
08cf06d68f439cfe43dfb7aca53a4eaed3c927f813214a585d5d77fcdea94af1
4645fe8e1908c797db279f8bef06e7e4870b5852442251c06ef1e842e44eea10
2bca75c3745f447e9ca8610d1c4aea70f8bbf7ea629facbe0aaf7e9024c218d9
0408d0381f4f5852cc4411f8bf8ab95fa1491d79dfef36b32436ec2fef5337bc
4b8fe4f313d8abd4b4d3de14a0435336eeff0510de642eb354bea83120defb8a
  1. one octet too long, from the D.6 request; dropped at open.

066102000001158fe87f5cf3dff06e50dbd3e81b2242314ba86c2b962f6c0b9e
0e91a04496c0000000000001ee6c52dadb064adafa5a804db37d3b998e88b3a2
2fc78c06039af4d8fa9355a51e351478c49e036e56790c9f0ec76186f5b75692
c755403a19e19a17e04a5638c19fcb4ab2489a1058efa58fc76b1a68fd8af92b
630ad01a38abe1534e503af970c8b923482b9a8a8b68f18f1932b2408da8fc9e
a1ad56ca4025e43ff02c077dab82705a66e048ce18853b15b23ab3c29c7b5165
e5593d7d8619b5940b45aefef43a0d5b562ada02355e008c2dd32455d233e09c
2dc7ebde18c081c5abe3193e714018de9fb86761eb429c35f057c801cf828a9c
b3c7fffc60512788822667557d54489062ebcfc5f067ad45e61f1cb2a505168c
80165ef8a43543556ba80e886f5558c3099bd148c93b7ac5a258b25268e5e99f
327530c5279acbf2373bb1113dad78929f19160e3bf3438ebeda56e6155898bf
5f0afc7f1e09fb74ac7fb20cec54ba8bd7d75daa08e630c47339c49f33b446ba
3803ede65f27697f4d75b13a52a14f3df91f806587431b350ec8a57a923d6996
1c2c2c58fb2c5910090069e6ee49a0245a2b270e4c928b8c7307e23226b5bd50
f695c49a198eb2e18caf73e237967d4f443811aeb63ef182d86b7f9607c0c6f4
1fead4f841603a96fbca859d2c61aafb8ece82a14765302988c2d8d5e5ab1dd2
2d307a7018daaf21ce3ca0011d58b6921751d0a26b74011c365140fd70715017
fbfd627b3a7e658163ec991103da90a1ec9de0f30d825ba4f2b5a8b6253c8b51
1844dc87894ec10a97f5342f4e6d0787f2fb11d251db66e2ced852fb6f9e6e04
2e3e03a1d34c7a73b683a0513c1dc3e4f72bb9fc05194e55a80b1f9e07d6ccc5
1508c1935a1570de20dd2177fd45950f24edaa287e9fa6836ce74c9c7dfd6669
eb1c261544504cc1d5704c05e9082b4a080feaae50a30530c46cac2334da9b3d
3e8f5d5c79ee228cf6f09105b176422ca97d84c74a0606b7d59e95e02ebbe8d1
952579589b40edc0963fd16128ada08e5d3c3117971580395eb245b28fb4736a
893dec4c6d933c2098c83fd6789953d98545ca86d0b0567bf83b544b28a21c53
567b08773d5309192dc79ddd869b2552036fccdac777aba55e4218b043a2eae6
b6665bfc430034ff0d29fee1242f5888a185c9f1def90b5248cf99ee58d1ee27
0610f79f052804db8d326d086b094f337e19a960f19dcf45f106e6aa436cc5f6
94992e74ee0209317a7a7414577553423a6196056e8a96e27db9961841e0c960
0e52ac6d55a337d652d18228b389922c4e4a55e059610d0d3e8d85f9962fd71c
218094f559829b3b80981bbeb6ea7b41f8142546ecb61e84e7d694f1f965d67c
326b9e486925a9da7134203abfbb99e0b90775dfeda824752c8958d0c2e73b8d
8a464566b7ffaad68d1224a1c57c25f9c13a5e657e9fc71157020eec5428c70b
55a9ebbc187b3312a1a56c28d3cfa90241d99e6a62904dd45e4fb50f10c5412f
bce1d53331a55513f52f65504c6ea01b4414d6c84d75e397b3ae268ad48c8b41
76323501539ab3ad7209dc49a211a180c673c2df2d9183a8e201276bbaec5400
0dd595eaeb613500988b3897db5e9645e00193d6cf20a06b22615a1e04d55457
c0fbaa56c2c4da4c25ae34f8a1e2ffdaf1ea3a2b34f2b20c259da4f9bdfd19bb
5e87a4b965d728192d2a9577cc211305ff78c1ec67f28a53d27926fa24810bbd
4bc5b02affd960a5b80b1f04e461c050c2601da8046a9ade55a7dfc18e20e9a8
1fd4ecd640412ca4735e20d366f079a2ff331b535652a595251f2748fc62fc25
341b1551786daa96662d5587fd039cce44fbb0b278168e31e2bface70562862c
056fcd382a07eadb9a4c509a174cd0a429798f8b92b9d6dcc63b05d2b42d8dac
855ba37f0282484e61962738b4a9da8f9e78b75e154ddf6299a229020ce7c1cc
90be81fe747a5a7904bca050f06237351676d4f1ddad0945d31391675da5c335
07fcfcb77950737826c41b7f8c69de30ce910cd7fa791d5c2793961f78cf3be8
08cf06d68f439cfe43dfb7aca53a4eaed3c927f813214a585d5d77fcdea94af1
4645fe8e1908c797db279f8bef06e7e4870b5852442251c06ef1e842e44eea10
2bca75c3745f447e9ca8610d1c4aea70f8bbf7ea629facbe0aaf7e9024c218d9
0408d0381f4f5852cc4411f8bf8ab95fa1491d79dfef36b32436ec2fef5337bc
4b8fe4f313d8abd4b4d3de14a0435336eeff0510de642eb354bea83120defb8a
00
  1. one octet too short, from the D.6 request; dropped at open.

065f02000001158fe87f5cf3dff06e50dbd3e81b2242314ba86c2b962f6c0b9e
0e91a04496c0000000000001ee6c52dadb064adafa5a804db37d3b998e88b3a2
2fc78c06039af4d8fa9355a51e351478c49e036e56790c9f0ec76186f5b75692
c755403a19e19a17e04a5638c19fcb4ab2489a1058efa58fc76b1a68fd8af92b
630ad01a38abe1534e503af970c8b923482b9a8a8b68f18f1932b2408da8fc9e
a1ad56ca4025e43ff02c077dab82705a66e048ce18853b15b23ab3c29c7b5165
e5593d7d8619b5940b45aefef43a0d5b562ada02355e008c2dd32455d233e09c
2dc7ebde18c081c5abe3193e714018de9fb86761eb429c35f057c801cf828a9c
b3c7fffc60512788822667557d54489062ebcfc5f067ad45e61f1cb2a505168c
80165ef8a43543556ba80e886f5558c3099bd148c93b7ac5a258b25268e5e99f
327530c5279acbf2373bb1113dad78929f19160e3bf3438ebeda56e6155898bf
5f0afc7f1e09fb74ac7fb20cec54ba8bd7d75daa08e630c47339c49f33b446ba
3803ede65f27697f4d75b13a52a14f3df91f806587431b350ec8a57a923d6996
1c2c2c58fb2c5910090069e6ee49a0245a2b270e4c928b8c7307e23226b5bd50
f695c49a198eb2e18caf73e237967d4f443811aeb63ef182d86b7f9607c0c6f4
1fead4f841603a96fbca859d2c61aafb8ece82a14765302988c2d8d5e5ab1dd2
2d307a7018daaf21ce3ca0011d58b6921751d0a26b74011c365140fd70715017
fbfd627b3a7e658163ec991103da90a1ec9de0f30d825ba4f2b5a8b6253c8b51
1844dc87894ec10a97f5342f4e6d0787f2fb11d251db66e2ced852fb6f9e6e04
2e3e03a1d34c7a73b683a0513c1dc3e4f72bb9fc05194e55a80b1f9e07d6ccc5
1508c1935a1570de20dd2177fd45950f24edaa287e9fa6836ce74c9c7dfd6669
eb1c261544504cc1d5704c05e9082b4a080feaae50a30530c46cac2334da9b3d
3e8f5d5c79ee228cf6f09105b176422ca97d84c74a0606b7d59e95e02ebbe8d1
952579589b40edc0963fd16128ada08e5d3c3117971580395eb245b28fb4736a
893dec4c6d933c2098c83fd6789953d98545ca86d0b0567bf83b544b28a21c53
567b08773d5309192dc79ddd869b2552036fccdac777aba55e4218b043a2eae6
b6665bfc430034ff0d29fee1242f5888a185c9f1def90b5248cf99ee58d1ee27
0610f79f052804db8d326d086b094f337e19a960f19dcf45f106e6aa436cc5f6
94992e74ee0209317a7a7414577553423a6196056e8a96e27db9961841e0c960
0e52ac6d55a337d652d18228b389922c4e4a55e059610d0d3e8d85f9962fd71c
218094f559829b3b80981bbeb6ea7b41f8142546ecb61e84e7d694f1f965d67c
326b9e486925a9da7134203abfbb99e0b90775dfeda824752c8958d0c2e73b8d
8a464566b7ffaad68d1224a1c57c25f9c13a5e657e9fc71157020eec5428c70b
55a9ebbc187b3312a1a56c28d3cfa90241d99e6a62904dd45e4fb50f10c5412f
bce1d53331a55513f52f65504c6ea01b4414d6c84d75e397b3ae268ad48c8b41
76323501539ab3ad7209dc49a211a180c673c2df2d9183a8e201276bbaec5400
0dd595eaeb613500988b3897db5e9645e00193d6cf20a06b22615a1e04d55457
c0fbaa56c2c4da4c25ae34f8a1e2ffdaf1ea3a2b34f2b20c259da4f9bdfd19bb
5e87a4b965d728192d2a9577cc211305ff78c1ec67f28a53d27926fa24810bbd
4bc5b02affd960a5b80b1f04e461c050c2601da8046a9ade55a7dfc18e20e9a8
1fd4ecd640412ca4735e20d366f079a2ff331b535652a595251f2748fc62fc25
341b1551786daa96662d5587fd039cce44fbb0b278168e31e2bface70562862c
056fcd382a07eadb9a4c509a174cd0a429798f8b92b9d6dcc63b05d2b42d8dac
855ba37f0282484e61962738b4a9da8f9e78b75e154ddf6299a229020ce7c1cc
90be81fe747a5a7904bca050f06237351676d4f1ddad0945d31391675da5c335
07fcfcb77950737826c41b7f8c69de30ce910cd7fa791d5c2793961f78cf3be8
08cf06d68f439cfe43dfb7aca53a4eaed3c927f813214a585d5d77fcdea94af1
4645fe8e1908c797db279f8bef06e7e4870b5852442251c06ef1e842e44eea10
2bca75c3745f447e9ca8610d1c4aea70f8bbf7ea629facbe0aaf7e9024c218d9
0408d0381f4f5852cc4411f8bf8ab95fa1491d79dfef36b32436ec2fef5337bc
4b8fe4f313d8abd4b4d3de14a0435336eeff0510de642eb354bea83120defb
  1. wrong tag, from the D.6 request; dropped at open.

066002000001158fe87f5cf3dff06e50dbd3e81b2242314ba86c2b962f6c0b9e
0e91a04496c0000000000001ee6c52dadb064adafa5a804db37d3b998e88b3a2
2fc78c06039af4d8fa9355a51e351478c49e036e56790c9f0ec76186f5b75692
c755403a19e19a17e04a5638c19fcb4ab2489a1058efa58fc76b1a68fd8af92b
630ad01a38abe1534e503af970c8b923482b9a8a8b68f18f1932b2408da8fc9e
a1ad56ca4025e43ff02c077dab82705a66e048ce18853b15b23ab3c29c7b5165
e5593d7d8619b5940b45aefef43a0d5b562ada02355e008c2dd32455d233e09c
2dc7ebde18c081c5abe3193e714018de9fb86761eb429c35f057c801cf828a9c
b3c7fffc60512788822667557d54489062ebcfc5f067ad45e61f1cb2a505168c
80165ef8a43543556ba80e886f5558c3099bd148c93b7ac5a258b25268e5e99f
327530c5279acbf2373bb1113dad78929f19160e3bf3438ebeda56e6155898bf
5f0afc7f1e09fb74ac7fb20cec54ba8bd7d75daa08e630c47339c49f33b446ba
3803ede65f27697f4d75b13a52a14f3df91f806587431b350ec8a57a923d6996
1c2c2c58fb2c5910090069e6ee49a0245a2b270e4c928b8c7307e23226b5bd50
f695c49a198eb2e18caf73e237967d4f443811aeb63ef182d86b7f9607c0c6f4
1fead4f841603a96fbca859d2c61aafb8ece82a14765302988c2d8d5e5ab1dd2
2d307a7018daaf21ce3ca0011d58b6921751d0a26b74011c365140fd70715017
fbfd627b3a7e658163ec991103da90a1ec9de0f30d825ba4f2b5a8b6253c8b51
1844dc87894ec10a97f5342f4e6d0787f2fb11d251db66e2ced852fb6f9e6e04
2e3e03a1d34c7a73b683a0513c1dc3e4f72bb9fc05194e55a80b1f9e07d6ccc5
1508c1935a1570de20dd2177fd45950f24edaa287e9fa6836ce74c9c7dfd6669
eb1c261544504cc1d5704c05e9082b4a080feaae50a30530c46cac2334da9b3d
3e8f5d5c79ee228cf6f09105b176422ca97d84c74a0606b7d59e95e02ebbe8d1
952579589b40edc0963fd16128ada08e5d3c3117971580395eb245b28fb4736a
893dec4c6d933c2098c83fd6789953d98545ca86d0b0567bf83b544b28a21c53
567b08773d5309192dc79ddd869b2552036fccdac777aba55e4218b043a2eae6
b6665bfc430034ff0d29fee1242f5888a185c9f1def90b5248cf99ee58d1ee27
0610f79f052804db8d326d086b094f337e19a960f19dcf45f106e6aa436cc5f6
94992e74ee0209317a7a7414577553423a6196056e8a96e27db9961841e0c960
0e52ac6d55a337d652d18228b389922c4e4a55e059610d0d3e8d85f9962fd71c
218094f559829b3b80981bbeb6ea7b41f8142546ecb61e84e7d694f1f965d67c
326b9e486925a9da7134203abfbb99e0b90775dfeda824752c8958d0c2e73b8d
8a464566b7ffaad68d1224a1c57c25f9c13a5e657e9fc71157020eec5428c70b
55a9ebbc187b3312a1a56c28d3cfa90241d99e6a62904dd45e4fb50f10c5412f
bce1d53331a55513f52f65504c6ea01b4414d6c84d75e397b3ae268ad48c8b41
76323501539ab3ad7209dc49a211a180c673c2df2d9183a8e201276bbaec5400
0dd595eaeb613500988b3897db5e9645e00193d6cf20a06b22615a1e04d55457
c0fbaa56c2c4da4c25ae34f8a1e2ffdaf1ea3a2b34f2b20c259da4f9bdfd19bb
5e87a4b965d728192d2a9577cc211305ff78c1ec67f28a53d27926fa24810bbd
4bc5b02affd960a5b80b1f04e461c050c2601da8046a9ade55a7dfc18e20e9a8
1fd4ecd640412ca4735e20d366f079a2ff331b535652a595251f2748fc62fc25
341b1551786daa96662d5587fd039cce44fbb0b278168e31e2bface70562862c
056fcd382a07eadb9a4c509a174cd0a429798f8b92b9d6dcc63b05d2b42d8dac
855ba37f0282484e61962738b4a9da8f9e78b75e154ddf6299a229020ce7c1cc
90be81fe747a5a7904bca050f06237351676d4f1ddad0945d31391675da5c335
07fcfcb77950737826c41b7f8c69de30ce910cd7fa791d5c2793961f78cf3be8
08cf06d68f439cfe43dfb7aca53a4eaed3c927f813214a585d5d77fcdea94af1
4645fe8e1908c797db279f8bef06e7e4870b5852442251c06ef1e842e44eea10
2bca75c3745f447e9ca8610d1c4aea70f8bbf7ea629facbe0aaf7e9024c218d9
0408d0381f4f5852cc4411f8bf8ab95fa1491d79dfef36b32436ec2fef5337bc
4b8fe4f313d8abd4b4d3de14a0435336eeff0510de642eb354bea83120defb8b
  1. wrong tag, from the D.4 response; dropped at open.

0c89000200005ef625033f810cdaa9543319e2060bdfa691e8b9248908ff3616
6831f5987726267840488717113dc6f0961162d52bedaffa74035d7fffce87ae
b8d4dfa0a1deff6357d350cedabe86e29d4cbe1519b8400fd329a7964b1daa29
859ef37f3d137983f7951e69a858997c707abf57d00079b6873e2d6511125269
11ce118af65bba97576126095cad14488b36dece55a8f6a1312c38789d4b1fe1
0929abb522117e30585b3b4db363768042c7e68ec49f69193b3a215bcf116e8a
7489b61c3d6f528030194c918d600cb69a3ef19fcc28124a8d01c76a11b3f2a7
779611a17bd38bc9a579949e379a40e5a19f95452649138e5cc66f9219796156
c9e88b9a4b0aacb2327b7efc3d8fd655c79d7994f9f93211a9945c7dae1601e3
a2634f31a4f88b9ed2a4bea1f75f3bbf059b9d6709e0f86c7c497eb681131777
3ff2832a1f4b37d48a740bedba67d260979ef07745c46d0aaa23ddaa2bed2276
97f5a5e6386a740ae8b6da157edcc24ee04dfedc75a3e47680e852f969a9b371
0c1884debe8dce57afe9c42e850f6742d7b2636747e5e63f9401131055acb89d
8bb3b4f89ce1126a5a30f80659a92e4f571c0a79cacd2f7c250931b6d436e46c
7cf9c37c6d69beac2dd3a237428cbcff8272cde2341bd96203d0687ab94ef493
1e19fd48d52d1cc1fc016f61b3d8ed6b51c1ca9eaeaf3dc3c4d3252b567cc063
88a6f3c7c0236f2c76fb69be1355801be2dcf339c552e7248765137146c476d5
cc7986b5b5b0c5c4ca2e2d0c916935c0a15d07376f4dc4ae5c2191d2252911d7
d493be31e48ffd16488a7eee3c66b52f5f12cd19a74a80f0e9bffa52843d787e
493ab0a02bd9dd3e28994ba995528a85396d10eea936d4b5a382138f70dacdfa
2d03c5a8c8b98e090351098b29e6e7321f165bbf2d9ce58426c00964ec4fa2f8
9a909c39e1b53893649972cbf414452960794fe96bfda4e658a9a5cc5a80b926
8ff70d5e6243cfda5e8eb6b18e6190e4f2c7f2311b07e3075cce8aa3a7d3bcd7
30b77a657f60a12ca8364477b0a726d843d32b010fabc37fdf30287bba8be06a
e87e9e9f4418b967a7e5e74a11a34c285e6ad18fe1659fc321cb012e9d09c30d
cb2ed80a887c0193e3741c32794bdbc5fa3f224910d92b805c1789a9a7bae6b1
3345a548e71eae4afb26ce47bc5799a81202274fbcb956ac29fbadfa08d4910f
eb23df309e52b20248eece2f2a44d1c3ed8dbae119d501e92b149996c2650e63
b3e23ac31941749ec4fa3b3019a2435321c111ad35927562d70e390cef2f14a4
1024bc5db4d99ffb3f04e4eb26e178014477a5696f6acfd6f5be00eccbac4a12
870342088976d544eba81c433d1572e95341436c220709001a707bba1acf962d
a236fb3d140b6256cc4c16cfb539c3df9bcbd7a75d95218e79a02176faf31d68
ed14c1de9002fe6bca1f91e47798b820fbb751c9cbd26d4c3db3cf6dc638693c
dcd92aefd410051998b6aec34119fc17c170834b8d224be20c29ef65c5f3b559
f46cf91bbd2ac8bf91301c854ac70a7d3bf4dbd20b8a11eb75d779d9452ceed6
6521afd080e7e593aa4171f505c45704418cb49695107fc3b03027742f917c7c
316d76a85ae3ba84ed6ea47eb6f92f3e8b30a256ef9c8ffb4941847e779afa8f
9d8e2496d59f8bcfe967586db62562f95698d36f037a8121aece96821ec87ca3
920a3b7c5b3bf9f286d50514983bafe711d1f8d596fe1f4dc998d1ae87b8ce7f
630d2e228d3236eddf06a33a9184fb24154fcb0b174540e868f01fd018031be7
e71874bb8094baf8118aa00670948de587fdb29e750f60d3db6e211cbecabe35
fc0da2c29fcea627c18503d7f1a3846cdc3d70ebd9cac796255b9eaee236735d
073496e16f6847d990607198b3596926ffbe5c4a985c60f7f164118df91f440e
18cc389f6c42d83d04477175cfdd726d31614c638446e1340f03f9f4efb5c303
5c08ca0ac15e5253d0caff21814e9624671b63fdebe7d6ec29411852ba1b9338
74979f216e85c3ccdc47abd97c85908c8d70f8d52e4db68c149c399cea0f36a2
e83740febfc7b70e93e96f136ee9e2526d5cf0cfc76f7da9c4a68e2e496630b0
aea730e989b4cb4f2c145c21a66fc4041238571038747129ce1ae6b5738cd929
61e1c51cf5e9a8c803fc31cb9505db834d4f85bace7809894d2ac0aa3d8149ea
04da4a4f9da3f6b011032ae09420941c8dae42194b78f96917fcf8ac5e196215
59a4a5425733be18fca92f7e772b604f6b7bcd296ad3cbba4df72536d1e5c973
fdfa2210ee338c328383dc4cbb10275636bc87bf295ef72b66096db91988c593
726e2eca074b19b7986e00ae3446c56c28e6fa16f09290a6405b6dba063b67a0
db969f6ed77731d599f485debcf08723ebf7b48dd1906d8f98ea261d940f2123
b56bfcfc75b4b2d25b09a9e2aeb9327348fa933a8fcaf5320c8bf52f3e1dc17b
979829b25b367617f26951e6c1e5714968d0c79199b254a66fbed5e59a44a78a
e2287e0b963aa2a9998bb7101c27791e6c901d66098462effb3b7d847721cc95
911e8b4cacd26752369e79d9ed63a53c417089cd8b3515ac99d0173133edc392
72daee5176d662c84adec6444fd827ea6a8d28e2602fccc968d4d1ed42543b53
cf71daa90a2a6a7cdd1b7106519bc8c55397c03954c1b725e2f19d021a46f09a
7da9a72cad1721899ba88f78ef6797e36d2661424c625a2ca64aefe5b77f1b4a
56c8154670586a19b81b71e2236cdfb3118b301e03514a39e726ca9eba690402
f962060d0232d2f71195269415ebb10e39e91438431d4b2b86045070cb0d3da5
e2a539f3cd457acd186ca6075bfd1c14a4e13c6ddbba70aea3b89896e85f9c87
9e089338c939bd03d05161008017abdf29490c0fae2d1df1c9bee64a5dc11b9a
702f00274a216a27777dd7826ececd3de3e96d88002dae60286cba3415822fdc
777546a13f9648c28637d9afe7f13d457d3605bdf14aae13e0c04fabdb5361f8
4dfa31d781683f6cd9d5017aff945d8cc4eb433e353968efc898ee55fc46cc34
e6307de53296594e6689d46961a6c7d336b347885c2b11df6d5419367c06d94c
d3066fff188dd85ce0efb54c6ba3b22382b4f69be110f42e9a90c6bbbf08f6c7
618a8e34586b5bbd52cb86ee2d1ea26b2ef3a11cbac90030b2485c01d45e6077
78c2a0e207b8059c19222209cdf4147a801440e3ea200e25c11d433a041881b7
b11e765d24f061ff61836beb11a6b34a304ca73b14c41cf07ecda01012f85a66
5e6169603eb674db8d4e1822cf8a60902caee17d8ceb66e3c1ba0804c02fdfb0
568f72ca8f8914de2ca2020af1d6bdc07f057a8ae056358afc1bf7fd655d8db5
132da6a5951f91c403ae2d9d53f5f6cf6e4e11d49288ea3ec34b10ae43ed150b
5523c48319e104ec8f8bb8d45a976a49ff18d46bd3bd696cf435d3955bdb6ea2
c9dd5afab3d1365ba8d1e043dd6840c74d7729399484644473215d683efe0d51
2822115cdad026fcab25b43b83738bf4f869852764803dd8730fb75718cf9cef
cb7ff8aba7ece8562ff8397f9b0d09aefa395acce872a22aa248007e749182d9
11b68bea9aa36c2087637925ab7ad6925be4e870307fd56c3366294e44697d09
e03d836d9d072fcd6940f6c3eb46ef4daa9a949313155a4bc0f05e9e21a1e4ef
b3b296acd26fca01750b116e734b851f641c3edd1a7b5ea92a0aff57317f881f
d91d2e5c48f0d83cf0872677b602553bb3cee5c4dd96ac4c95d88e0e15d22bdc
860b4154a128636e989bae980227e8c275a2df70e7db31c7fb4a481832d68672
d1829ffeaf402a41039901b9947398dad3a5d85b0a34bba7437ed76b81b6942e
0a75838fe850bee3ad3aac67eefff55bd4fd3ed4888aacc658bcc07482ada312
7a2d4a76c713dc6a2a89eeb767accba4c772445ae8339cb9eb748f579d494f34
152e0b6e99da7cea2b50136d4264d422cde2db12faa3a7280e9befa4826fbc3d
cf891691a65902578f13e0fada05ec2d44c42611403ce451f0b3faf3666ce1a9
46318d14d45fd4f4a2280c5369a136a936d2f800f35dfa5df93571e824b19470
98720e27694fdb9970348648dee51055bd2621d492db4e08425be7049681dba9
5e2a2f99812960395024166994e9f5aadda25ed2a9b46650359f60bebe85b47a
72f425f87649334b559ffd106f217f1c69998bd179bdd7ec2680bb696affdfd1
96e2377d212bcd7dd2859d34424e0c2bf78415a46d1aafa11842835ebad84759
7e24729e4f81bd7774126a2dfa2d2ab36b5ba0914d4ef6d213041894818dfc27
79b98e23afbebb5f4d257ec72a9784e902a2eba789d2842c99b0da7cdd8d813c
000d1bb22177296e17cbc57db1780fa86ead5c08a8c76840190a5e15afdaa7bb
88cb5ff631a0254c34e78a76a3303da7d0d753cea82752c1dc80e89f0dfff198
121302ceb8c0c91da0b9d1efae278f36ac3b3b04d44c347ad9278654d5502bb8
5fcea7aa335a3b3e0b
  1. init_counter not above the stored one, from the D.4 request; dropped at freshness.

0cc50001000068087cc0282c35d9ad8b51bf6a35a933d44053e66c37dd4bb675
1207f037f2e50000003e0243478538a22a92b5b2be87aa5b6aac311db552f7ec
14f7825e3a7a1aeaec8fbf321c226a29e9141f857aaed968822acb0744854ddf
d05e1bc920a9b9c37f630eae70bbda340d14c030ead5878bd1442e3232a74a51
42c56e5cdac85d543a9d43b7b719b5e9929e3fe40d22caaca71974fc20871ed2
564b514d429543835446081833367b81cba7c618c5b20a35cd5d34c0e93023f2
060f31f43ccd0b5603e78cd7472ebcc0a1ff461eb80c4011548e74b98a60569c
3ed4837cd355e540a7bb1365ef1119c29109aa29be43f37e78970d9adb9e3418
1ac935537226b79a4a7cf712c01cbb6ee6c2011766c93c8434c22b0e58d09b5a
399644aa84be8b1dbeb99505aa70c73c0a64737a8f70946b4986396454c010be
7f77a5377411a7a575f5a71beb161c2580247a2479c18628f4132fa4a58442fa
09500b561f66c3981598bbea124b209e87b5b3221b3dc3c358359306e52ac9b8
9289474281be43af8973ae418963a4369d45590faef027821a0fefb4b906005d
4137201e3546a3a04041169010928c6e878f27949459663d0af95be2204e022a
c40f105109bbab95b8b64c004537c2ad48c24716f6bfdf511510f31ced62b430
7bc3c4aaaed2628a7e2799f1297f86e8715f6c832e0813cdf51270eb40b3d159
8df939c8b6a3e038a5c52b38ef1aceb1d1b72906a8537c49c8918984385f2301
2cd1507dd56a552a9b65bd8937b320493f7144b77863b27cc20152be2ae61ebc
7012db740e59874773b5cd1a48777dfb79b8576ee4a1c88706c294e5773b2514
75164cc4fa5a5bc82d348bad8bbcc7173006c360714f8b5af03309cfa58d2563
87a59b88efe626d9ab1bce315b97d440b7534e3644c5df4a0803586cf17c6286
d7c077d033c0c34dcad8860e0b021428352e3b0e07f776557011b6954eec9241
f5b4843e167d32b57d731950602c5eff9133dd840ac0f5a135b0cdf97491f684
904805a632d768b97a0b9a8a0d676aadf09609e8107ff12827aa5674fb6c5e5b
fb1be48b5c7b855ec6a1bd92c41a1340bfe6a1878ab62f903006a4a7c301e937
033b23956626b825c36745ade9258a0102c667125e403a945ada7a75321fbba6
075e2c71eb5c9dcdd2c328cc5797a32309286ad173c9ed51c9a6eb61ff41bc7d
0398aaacce3f786c4dd0617c9c33edc02f1ad167bf026f1e191f805039781747
8acc0bbe52bbc6b543e6c9cd66f1c7ff25999b519a7f14377733b472373b347b
7d6cf77921f76fb2bb6fb737cae5586c44d359d11c636771340b2a40ea19aaaa
62a406630bf6c77a848417ebca98d5e5b07a5a8fbd72564c9b305545031a9253
38e0ca15b15ef501317bf3c009d0c3ffd53f64199ea6734560a0a5763b0fc672
ad3006a2976c440b1c0ee5250737084335a00951433794b28076d89cc06b9854
585584735cf8ea05d39451161ac1a61493887962436409ee70343fba2d50a349
f22252888a5ccce800b2f4316207b84ef176fa701d368449135abee22a075507
5be350a4b8e7287eb73392b63da2300a8ea6b9c07c035a66946fa81a33672bca
a0bce0c1ce7b654f19804595d57f0b34542b9485bd3767018bc4a7ebb9394837
fa87172c72c6e5c32cee12b858b17beedcc383031c005d78c1b225297490008a
72102991e34044f8c837a440a9c0a28fd6601b8728a581905bad113b4f237158
952f79c13f4b734c12a1a96ff2379c874194a49e25a62a0a0b203d87315c662a
2354a5fe28cca3497e415a1bf319b05530ccad4149491a9de9715168c63b6dda
71638c51211212032938cf50868a9377b545778f372c0c8ca6eb6732db658e97
2bb5d19bb9b459c0e785840784aed59a1a7e20c06f6244033bc682338b302438
989b334b97073867a0a3c65dfdb46aa7249b71ac48c890800ba6088538b97421
a99fe23e3ff64bb502c26b6698047915ecac1fe09119817a506d2a2ed1ebc83a
b8809c477f5684a56247892a3caaa29390954722d702068eb5c2fffc6415b818
4b045203c279ce31545d51cd13ebc1ec113c238c3bd1dc6af9c2211044c38b83
c5b7f3a95d10ce7e8c0bf07c8c0a475e30a09400a0b7c85c6afff091b206500c
a0a36e077f864853bcc38bd0464e6f908abf5004f7a5b8d674bd029231fed71a
9e64021a1a554a9c6a3e8fb837eff1fd84ca49dd6fa5a22d96ccfe71159da4e4
f51e245db1c9eb866f81b2f6789585e3563c500c432560a6e239611097a67897
a782f77437b0971aad80b6cc86d7e86db75fc10c328d6a4ab26f59c73179e17c
36b959c9f4008eca399cc177c6e64836e626eb23edae5b538f49adc91485ac9a
62318fbab19798536f56854d37e1ffee23f96fce430c8600405252fe16757df5
16654884e955a7d72a1631b9b67be48815c50059d24fe868b4c1f402ab53a4bd
0f0b6b3d1afba695ea3abb0be1eb6ed9ce93430fd1b55695fd90d5c5dd4b06d2
83d7266d5740ee1605e13218732255f59cd6de54bd7b5327c3fa0d9938196561
fa4cf9b921535e2a3def5dc9e40885c2d11dd4cb6cc90222c90e03dcc2ed09d5
8c656fde684968d3125934aa0d6ae1c24c83b09e92722255093cbee91a59b5c0
ce99f3b5931e30c5fc8adba53522f06442dff4b4e95a2c071326b56037f8dbd6
3a7ad5eca5feaf7ba4a168b2f984080ff6f0faf145350c28b2088b793bdd7e00
3a76b300cb012a6abdec8dac6b58d2ba4c52b9a3b0eab46f3b95a1f11687b8e1
8837b72117cc382f72df476c21e9bbd89f9bff09c8c00b8ae1c5721a3592af2a
bf4a0db6dea53312981011e1faaeab9b48a6096b0963c200710d29bb5accd6f4
40a0cb328a581ad30e78ee25333e07fe0c2ee4d90ae559275083d1df19cb15ee
f92097260ed6860d6030a9772c4c2ee0dd8e5eaaebe53743c7c84592cd4fd0a6
718ef33bcb8d0a325c9719c7ba5a4ec6f24608cc8752f87fe182172a53fe54f5
66cd8f5c81ce53254e31320614af16d9cdf5679ef59ab4e6568ab2228007f467
00fc18ccdbe747a1702e9c177f433a9b3fcbfed9d056fff88cf21a7ef39b58d2
9cc160346b2f8a819b51b66dca86d2f659d05b6bfe156938031f5afd3c1a7599
d6ddde5f043fedeb0bfc2a3dda0ea411e86a361f989e0c6f402c51b147137bf6
62adf7fc414e5a2ece355aec2bb85062e221222090e33b6a54425cded8911d22
752cf7865d57af2ce5306ede4d4924033ef741fa402308edf9eabe20a814ed75
09e456d77f03e5e5256d7e17fec785006fe0f480edc136237672cb74d733b74e
00c094a452a765922406bc68c3dcb9bcacfd406d1b0ba89b4d8d1a185b1feac8
915540d3024fe66913cb1774f2ff0705f650aa25b652aba1e124d5399ecf3933
9d272ce7694b564df56f7bf361988c7c3fdf6e7fbd944517a2629fa15d722f76
3c158d440a272c1b98a7f3488e27994d0d2a36264eb09ebef4bbab6be2c58581
edeeb339283c80db6f9393c4b265315647e661ffde276012279ee504b25c0c51
1e87d8f34607fb59ed8dce8c3d2a2fb33f71d89b16652a0bfbef2bc6c773a32a
276f7604cee8fce68098124dd934905626ea25592ac5d2acff010da9fcb6beea
4583c96033335da6bebcf81afa0c7d8161a3ebb859ca653f1cc03d29f596d702
6130fc0b9f32dfeb7be3804beb3f640b249c68c61c748b733630b62424da22cb
4362c6e6db04bf1e4dfb5be8b8c4a70fa2dabe794232516d462683034cb7599b
cae8526298ce5c12e1e0209b6b37691da808cda850c2966f5c1597ce00b7a4a2
b45efdc37703a310960b4e6d167cb9e95e2ba485a2e5851e7225afa34b024dbc
c704124505aae8d153dd4bfcda30f01c56673efe28952c1aca2dfdab289cfb43
6ba0926f484483dac2a992bc2f69f4a4355dedf3096b4fe6fce91d9db8fd325e
d4491c00c2234ccbf2073cd282e03c34b8cc3ab8c89b8f50501d6c92265ad3c2
71ea2bf79ba525b734af210aaaab3fc674c04f76d31133f71463ddf097f08173
508792ef37d44bc511fc178946f7047a738407498c0221a439ba56a65d99e904
415ffe6f1167ea118a0bf6100eec026a5339beb816a6b6110228ceffd3565e9a
695dbf1adc4d28e0f4cdef8980c459b22330d417862ed874c693a340479f5640
02ee4eff95f1d7e652bad5820dd89e4d9dd4137b2483b3ba43f88d321bc7d074
a8634f8aa0c700af870deeee2349c4a04b46500a90240962c6f1a51dba7d9a78
b8934c5da183df67068bd055652daaa50f6cba2670f2dfecedb17025dab8e1e7
86fe3706cc8f47e4c790c139169984b113ce2734f7a69dadc78cb7e51d7129fa
305930a080f7df904e975963d46b7a2ceb02ee0fe18ff6b64cba25b0c4d76b9f
9a87429a615fc2b2ad89017f7ce3af459d0af1bac8d0cf5b425ae7819ee470e6
d7bc068476b77fca313db5a20075df8213dd6ece843191400030a8e2ac3bf9c9
30466987535601b838adaf39a97b787b8845105634397476190e8313b7d72be7
953a4c066bb77e14ee507bf20e7a301ba509f6f681a0a592ba2465976649211e
ad0cf313e9
  1. target_gen two ahead, from a CONTINUE from cs(0) of D.4; dropped at generation.

065c010000023d813194e9ed6b09a1ae301b83bfdd9dfc4778e5fcb4d7519893
90c1e98b6a9b0000aa33304cf9c179a782d2084ec9a301a3821cc2773f8b647b
3f657645e5c19fe926a05921ad408ecc137d1af0ac1578a66a9aaa84aa3eaf7c
38b87547bd995f03155b84065da0d3023a01c526d537869535c4ebcb04d9744c
22afb0c6a6ef3b051d039d03a81be48a40e5b17108121aa40986d18335027a40
3a4b865034a0b4fc09adb45b2f613f1643c214b64a03d936d8b936fb09a206ac
7732d8b19ae296b08c1af5d1cac7a273c20902089b9ec98c2efce84b72628281
fa12562a7faa27246476523249a732d286aa1b69c1a9bc0d335daee57188b20c
7af030932c4ccd757e48c097d124bb1916c177a75b7cc378c13a1346f919a349
4f5ed63a6b8b1f38776250aa40e9543e78a34bbb6946b99aa668ab5d24438254
558e85649b09b91481843372a867f02c04a9a6a6bb3a774bd88bbbe32c09b52d
1b532315dc56926b23b522985457be27f345381ccb854698f2210a73bb259cd7
840111ccada8a492273ba95111f0f03bffd1c4d04c581e4701ec514ec1bc14ae
2b4a4c19835cf55e3de1660573c205280351fb16aa293bdc5782d9f90fa903c2
545b4d1e2a72f6e2336a1228128768cd468b817a70b3a6514f2b61070465513b
af1fa294fdb5a0eb6330d7e3a0b4407429d66c8dd44dc3d0ab87089dabe815c0
bb9b34fb81f659532c776c9e4cc00d169747bb9a99ba4ddbf79eb0303618b242
5bb7a78f395505e02b00e7cc982b87b2798e6b61a0bba5b5e8a9a1dc928f1131
4a6e660dc7f9cc8cd76082a20cae544ffcca313d80c451886a1210472e56aec5
b5830514925182893fb65fdb85643f7486f447a49cd7041a131c9ca281ae995f
f585a3b34a7b3c751597f60220041799d59e31ec453e69582b38cb5ae876f208
5c0cb90d8eab78be82c7f8914d4644aea991c8f107795f970c7df29a8889201c
00bcee5b6a0b098204c47e2e887a731816e3491ce25cac91827ad459289f5115
f1f6a13ebc14e072166362b40162cae3c477d27abd9cf137c1a76330ab2e85a0
596e1bb1cca574bd13a03d84b6783396230b8fcfa0c9ce48619ad43579d037c9
492441e63144213f9d00af3fa6c910375a8229218f75ce085645bcf999f455cc
c00a36b7936db683c7f325b0be177ed89a86687046d25995ea4211861a6b7ffa
800cb79fbf44979f9c52b87225915a6a7e9a5f77d3247bf35ed480ce78678a55
ea5953f99d55536e084411d3d6872bb866d0aaab97c56a0631964dbb88cfc054
9708417129278ce823094c2f9df69ce0335217683d5e998b7d8c397000957571
3aa209a97a015e48a42e62b61eb2176f15a899841b59172a1c60b2ab4311231a
e6908f9b0960596ff243c6eba4747da78db1f1bb1a1b1d9b448e061c961ee52b
4a460fc73b30bd2aca432a3ead0b3bdeeb8d5f3a30ce107ff715a2e51891ac1c
1516a0a8ebdc5243aa328bb4391e2ac4e4f26dcbf56b3cc92d08d75b1bbc3678
8a8228208b5f985a75e72e32e678f6142016f50dd1db505e0753d012630c9521
3e582aa35a1a834c4b31c8a74a6b4a56818d35777874002f5f9c62d8dca16098
ba45dc91c686b12b2230c5eca58d663bf503cec5ab529b49bacd25084cc23af7
b2b18d3a0e1225b6a6e67dcf4b37c8468925209c69e749b48755deb614b1dc4a
4749271f6a074b735fe203723d4c9594dc41d08214c772130d6060c36c9519a7
0ec2bcc67351b44b67c701b004d3748e7ac52fd5b09249b1422f14846ffc1683
03192339c6bc755781d46c7008cf69b82301f424886438d520b207cb37ea0ba2
94f050c54c16372c25081879020c5fe55865744b05e610494e4793d71ba76fd2
4c95888e20141326b4b265629244f7b097100bc99750c4c3cee979651dfbbecd
185b392a030deb36d3b1876e7b01fc6768cc743e3cb988d03a6dc3f89b343004
fa85ca65549434f3597549597748107be19f0c153d54e66ed98a701331b5ae49
97e87734b63a23a7ccbb97011a29686a9a8c1c0e2a9797d12e9b6c04070295da
68b790fc09c91ccda054c734b299ceaa2dd4a29eb4937e94a06f89040739c825
1477a515891144f082c852125a7859d14a9686ba9b62678644b9b1b5b7795082
0e1b822a97c1c292b339b7e74d60a8728974a0d442c915f023ce3ba560d27ca6
b0ac5ab71f5330692449ae0bb2a97d5efa2c3c014b9308705225fc305d096fd1
55e935cb5d1b3ba52c206c7102c223a4a90d26a6d6f70ca507802943
  1. sealed part under another continuity secret, from a CONTINUE from cs(0) of D.4; dropped at open.

065c010000011b06f7b567c7f2319bf39f28aa391537550f0daf6b92564fdfb4
4dda63c06962000066fb2f2cfc13330752dbf4bcb8565c8e48406ca518822566
1a4c96272027733a9c205c94fff940215276b1668bd9c9123a089163f6c2d68a
0d596102f13a78273876815691c6055e7ad1764fcb7d863c42abdccf3d2b90a1
0ca2dcc62f7315c0a3d6088aaa23317415a910babaa879f5066a9584a3fcc316
79c7ac8bb47594eb866e3705721bc9c22b7fc152a029ca927194a8625642e735
3e20e23d3b767fe560533c777e7b4195729aaa91097da8b8a400c5bccac18250
878c81f7457eb2c5a6309462e50709d69bbd26b15e903d78e83e6e8b289ea778
443674601474dacac9d0019d7638af3108889ca11bfca49c8407a62b1a00a8dc
84ae11345713124e6752a3c1acc8998ed808631c7a7136c430a9e6c837304b1a
91427e3a4ffd2665971075c8f72fc07a248e5195e43282f8137d75fa40773606
01443ff27aaeb0726a6601532f830028c875d71b0bf098622bc894dfb5b58b8a
7f6b906d0e094103a91bb9f99e5d5839040a87b3f48705cb74cd66c5762bc375
e916fd3680fc2795eaa01f173b01337c558b5b70a3d14572732072165b0bb86b
4aa326e631098e8bb2f4474dfdb11481c822ae8ccbef190992d522dc04334c8a
62b781ce4c92965d91667442a4148ab12d689c26404722e31692e312a8f78be8
9834112939a773b2f9dc26c9f0454849a78719be2fdb170e01cd0ea8009c42a3
91d29862830d3aa3981ca16a8c73cd5af5c160c5a10979053bc81c8089146300
8cc5f7aa0ec933bdd4798771235e9c51dee6a9a163199a91213db91fb877455a
5a961b84bf7f218d2a1025f664984467310970740728778dc91bdae1b285a69f
ea7a54b59a3fc6136763bcc31ad63b58073bd9eba4bd486417a9046191a54f49
04b54cb9c9ca80977c69a6ba77546c2f6d18c003a395917ac47c5830eaa43027
40b47b114bf6a22967875794d091352b09887899f6a877127ac9340173db4973
f109918bf0802323af14a0185d9c0b93861ef2bb6e4eb6bfbb8a1054cab19ef5
5b3af40150d642a779192a68a48811708ef78d19f81050b6ba7cd1bcb3c66fbd
ac5a805cc8464a3f2c8745e880a0ce52520947a73e617b1bc40f1d6025fdf675
d8101277f9445e5a72556931d4344c3f05848b00be87c46815b6c8f07569c231
c79aec0b3a8c802d9453df913c00356d704306611366e01b0b13d149d07ac8ac
a3cb078abb81455f12682f9e05334e06be993673d5d09351032fd262870fa45b
b2ea22d108444749622c40bd426c098d018074c1b9c1279a00325c333a9887d2
aa79b27148d77df2715e7b070fe45518dc3b72511b1d3291a072339a4893b92c
346b1a892479cb56fb2a962807330f708d8237b641ac9cf1400101e59f180484
13c300db805ac80a15e66bb6c4b15364810af6fa858b2c1f11e205e6c32879fc
702f22cfc16501c5fa020ea514fb1117a4e249291aa18fb53d5c9b5cd69bbdc1
1a3c5dcbcd9aacc952b3a7256c321e97b88c9a51fcd81771d7c09a1741201a48
6a8c83e0c164310a68a57153e1b29b8a19ab89a80649dcac95827e3fa61ed00a
6bd1275d6ee5620b23a1494006a575bc2ff6bdd9d93946458a5bf06834689ac2
b6c191357a2ee18cafd9c157bbca5d89b9ad335a601c8cd052ba98763fc0a872
2f8133ba9833ffd272e7421a99c492023c9cc7bcaad4384f4b2a9f966baacf18
54880abc8bcb0331170b404c636b445bae3a728d739f3742368f1952d21a71ce
ac3c0b5744b8a672261c94359c42ea913e7a82aeb41aab0cd16a27b57111a506
c0047bad67858292656ff75770e2a681223c464885afc06b654a8843c54d3068
9c551731e3cbb682fb92f3f75f502b5533d863caf53a09d18f1091a02f0b1246
c03a52e631af09ae03d9cd9f5024cb3452ec400266354bd45bbfc5314acf5b89
370619b4fa96162c26cd75bfe65029046340cb344d66095e691b5fb281a455b6
c107e7419d498e32d2a87a0c8234d794755172ed962216d2a728576b70742f51
54ceb5b1ce503c2ed0aa1f14142280da2e76b22b1401c744e21ebb8029113919
66acc3cbe3c23fd9b4b0405bea441d87639312b96d8daa6263429bf3756b0651
3db8134e82f8664cf0bf3f3c76c90716a2f5c669583fd6113ed1f8631df38d91
22cd44f219e90c69303ba39154c9bd6c5606c81b0e93824b72ceded0e37ff38f
32ed32e244ee21626cd309be39e5d3dc935ee1ca2db00524bae0245b
  1. frag_index beyond the parity fragment, from the D.7 fragment 0; dropped at fragment.

51501401d701020304050607010403b2d30cc500010000e2807d9c1dce26af00
ca81d4fe11c23e8eb6752e1f9ad716c61fc24f2d80c041000000c95760d41810
e7058dfab0c20703432653a0b716a9d7fb970d755d6d9654bec89f8809377cd2
505cf67771fc469309b86d503f7aea94b50395357bba9861070c95adf950a736
45b3c5547616d50101272d90e4926531bee76a3c8266325286a3aed64e3f23c8
250b0a81ccbe42e0b3ce69331a2cb833f9939bf6c0cf5b0a382c179f577b688c
ba1dd966c1b0c0f9240ffb48358f09cafd6ab20c4205eab64bd91311b431bc5d
1cab83730e8da3822d5c88fb2796ee08b6bd8ca16c01cb9ebcb6de2293539645
7d6c291d8722b67c023fa2bd66f7147f3b5b9b2b8a1c6507222b32fc95bd2045
4e8b696fcafb1b7ddc1f0b08b5a3871ed0605e419ba32f734dcbb29b69c58581
160b24453d96981eb2a957f1a2908e4a084cb0360e6aaf9194a649d52a5bc2c0
038c9ec0488c02a02f7dd46002b657167b435cfa8577eba3fe127cdf51548987
5f72754ae0698320f10694479cb2d1bc345674ac2739c6055c558b84ecd33fda
ac2b49449f04893d11d7394865609eeccd6fc57f43a31e1682a53a98bd8916bc
68c9950702236fc7b879a971e066a89f1c3cf41c3aec29431a686eed216d3730
c5bbd03738a49aeb962541661c8e806b20773f44da40b7c857cc7ab50b007bf1
02ad54c181bee552fd8b1948f05a1a4a7fc7c1c9a19a62447c570633ab8f92aa
12e723fa79752b7bc770926c1ba8b7f4b68336213960a13c22d891bf12cb92d5
41f3a30e3e69b197101dfaf83cd7b13953f1971374279fd76f9e845c7441328c
f18e914230333387ab50a048e27dcb48c5a8d87f2430905979094f2357bfcc9d
2ed69f30a9087b82c2d7e223ae392077faaaa8f78f33f8073c41081e27851b8a
8876029695bc261be3a214a5cd98a7409feab2c3739015d2800a3c8f96a75e7a
11a1a9322725a9aea399529dc77d9532323716b2413c83158598cc8688ef142f
14c57440da51462c5f7791c030e24d1dbb0836a426a86607a6aab8c484935c83
22d993cc7055366aeb4cdfb13ab53688a0f535ea0125cb78c8c5e037f818712a
ca0d2ff6480fb96e2baca8a288775e5b267d6b3dbd2164b045817c4b4f432473
a87b973d551f36187100ec3b24e7872d8699779398f6852650977499738af0f1
bb64c95e7e6a98597a8a451894d6f66edeb2282c55bd29bb94f7eb9b93bb06f5
f1a6a5069effd36550926bc350c752aca679e6a96b144d39694eada052bb985f
de9c9ddabcb77b6b89142603d9b8ce86b1845672aa1ab5c510bac615099432c9
9ad23b5c4a548afcc4c98177abe0a0b82f364d35b96f5633bcd3a0489b28b6ff
5cbfd4356b4a904e1cb59bae046ac612873b8a83080788f0eb4de169ab191873
12267e17c4a008000d638054a759115212ca9482c555a05fde9868fbc9327495
6d535aa3cb9b4ebdf192b998c189683be7b60d1d4075d848574d581522f99366
1221d26802e1360295216700944f5c55bdfb54238df94c8d99c174534dfe1306
f70992413566304a05c84a86ec9464390b1bd3b459fdb06fffe09e1dd6175bd5
bba96299d0237846a86e9b606db512b96a22543e3420a91019b890129a198b45
d9097e32588e538b68162e5f3212ed2a

D.15. RETRY

A CONTINUE_0RTT from cs(0) of D.4 answered RETRY PROOF_REQUIRED under k_retry.

Request (1632 octets):

066002000001a48a8032dc75ac309512765baac04483f07c96dc5eb82660704f
9e5aaf1593320000000000010ccc74346a023fd52d329230c47e52b1a3aa5638
21a848cc66502abe564463b432030ef2cb0d425030eaf00a5167d3f2a1558c41
b571bb49069a4830051bd6943cdff09144024a515ed0c22915b85cea5f4468fd
dd7fa63a5708faa5652010917133e81c4e3b26df9617a216b5bf0c1e019cf6b0
9dce18fff487836124093552f67f3defeb0dbbf07eaab9a49bd2b7b38a3c9bcd
1103cee266e5083ce01b0c6899c01bf142eaaaf231566ee0ca09de06ce7bd262
94a8bf1b83a0c53b5227826c1a0a6d406a35a79548093bbe8083e82b038bac12
8cf8647890f632da3d2c54487db6ad1a6c2ff911546bdeb5763612784d95247a
37d874223eccacd4566f5b79834a475178ca652aec2b43b4c33c72afaabaa669
aae2d80bd8d69fc5ccd508e2c08334f2e1d02acba86541df2bfec611f53dbe47
b19f313ce64e76162b3edcbe5d9ea814c2862a7ae20d408ca2444a91f922cf3c
c16be335ac54a88a760c28a3d2da6d466d5ea4a0390020a862b901cf9ee29bc5
1e50cb26ef37797174fadb59ca89fe9a8f61a8ab448cb644d94ec7ae8c0d5ae4
dd6d70179794101842bfd1ed7d6cc1bdd63239b2a5277a3fd99f9055414730f1
54bfcd3397ffb6fcc1d62c8783b3401ebe2b467b1712ebabf7a754827ba870b4
a55d223c2d217e90077df89357f0c3db2c13fed17ee80e931fa8c35f13bc00af
ee55e16c3d5760c7faaae619cc3028e0e0ba23eb2ad1707f5526f919bb96a1a4
169934e2bc48540fc8e5a44f0ed7adf4154adf005d3211321ed6949a1e1af04d
cb4e211b650739b33999a79c08813736d105a8abd6542955f27f51bd67d51772
604e53c209a03e1f3682808bda6fa36e9d6434b26373a04b83223afb15e342ba
b26975127a8024772d09aceecf14937ce9b4d43994fa8a389d47a1ff0e0411a7
6a1af1b3207b2c242613283ab976cc9b21755712d98cb57bc99dba1710db5c7e
dd2fabea972d6ee48bec606a6ff0fdd545b5e90c1f35efdb330ccbb1ab84651f
6c3f4e772e31541a359c84b33e088bd6eb65ed90ba19fee48a6e9747df17b586
6673cca0f951ab76315b106d77ea587a085c0b19eb0bc94a306a1199eae3dcba
819924da84e60c4ede40da114cc998aed507daea241fcc32696fbf2b4a4e32a6
316425f97769bdcb8d02d96a55cda2c46315a2212cb2b0afa64458a51fe5cdc7
5d4c1255d508ff2a3f0f1138b23e0e1f31d9abf1090b37e85e0186c815cd2c24
b4efe59f470764f12768129e512ee4f9901a8bb2bbff436bf1c109e92d73660c
1f5f160c360666d6a1937824bf5456736d8d21cb3d47967a15dd9ae47a0f8019
6033cf9094a042bca08b6b9c13e5fc11a5f8550f51ca1d129e9549c8a57995b1
496ae90d7b9f500759bcbcd54b645c85b687414522b674e2da41538e3ed6d263
217d03921f125c312a1f6cc141f02065324505e949f54b632ecdaa460fb0fe05
7b218f45fc07d01508e7dd1d0995b9b3296e5a1072c3e59d89673ab259355a40
10920813c24d44a7fa00697a8365471a7c7ee1f03e292a60da8263f569fcd044
0f2635bc9eced49ff18325901ac24cdd0b203588bcc916cbe222c152d460b8c1
70000a9ff56ec9d7591152445fe1487bb71724aa48bbe7296e6fd80a00d52ea9
c647bc30b60d071576508b36b2f8ee2c12198874e09f57911bdf9c42d8b44290
2c76ee868919ac81754e79dfd06efa9f328d3d77a53481d55c034935f5e88bdf
7df8519f0aed912c0a866d11b0374530e1170d61abf0edbbf1f17a270ae082d4
407d9527aece03246a53c946d163fb7f98ca918b7b3acc46b7363aaf228acbde
2cc45a9967c33b8174157d869ea1c190fffcae97135b6e46f680b09838f21d2a
2b7c1a5a5167349262d679d09b4d79c85187958bfbaeef177f5b462d3e334e01
a6e4ce001f532e63b03d01fe66481fdbf00012697ab2aac6bd6c51131645fc30
ed5d8884e0e4df2510f1ddab4685f7237cbd2be8a15b66c2c0a2cc7514b78589
3307432d99a362e964667663eb82ac39511947926161530f76ad3becb4146d1b
aad69471f8db44d1bf87dbf4b78922dabb449af81b7143419091a998f4b3896b
3adb3e5f23090ee98f06ebd36edbcdbf8b68837782e64b29444e324e8e533039
b201ee5fe7c4b9bf2a6ae171b1274fbd8c7fb1e75006c653f2eaca92b5bb2b1c
3558135ccc7c0012065f3e153c0fcb05db2f2a67009ef0fd4503fd75ca276e3e

Response (56 octets):

0038040000018c0b29a7219941c53c498cc85a48f6393d833baa6c4c116775b1
c6eab00fb508ad97d390426aa30d411df3778d2170d26123

Reason (1 octets):

01

D.16. FRESH with Every Option

The identity key sent (id_type 1), rk_hint 7, the pre-authentication tag and the fleet secret from PSK, an authz_hint, an AUTHZ object in each sealed part with reference AuthzRef, and prior from D.12; identity seeds as D.4.

PSK (32 octets):

7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f

AuthzRef (13 octets):

6578616d706c65206772616e74

RKHint: 7

Request (4870 octets):

1306000100007ac385e2a9f46959700717777c4b7ccd2cc67bbd263514a5aab0
10b02a0acd270710f06ce394e09d874403ddf2599470571f3021ba0b1628a119
7321a2d79e29354143239176968222aa6923b809e9b9db723f3bbb0ef191823a
bca90904b4501854499ea9897e027cb1a32530a7042b56147ae2c00db66edf88
b9354c009db69547cc35eaf3a05ad42eeca9a6903b9137844f9b7b626a719189
5c8e4075c1e67b6c07660d6403215221a2ed476e6c54324a6891965aa8eb3b7e
32f3a5068378b3749a8e4b595df79d23b94920053e97e9bd4350526557962064
4bdb3b32463978f071391f23c21d37733dec5927d591d08a667488c27a3c3e7a
0a1f882ba99593773f41386c94297832384535876847bc5e04ad11d90864f960
8d713437243974116e42933962438bc0038c57499b8f952cb4bb67a837435e66
b8da4c15955415f8c5cbead010a226a12c8655f4150969386843f3881b494d29
5bb7b4a20f60457b9809916870a76931ab3d252c6745c8c22a59a4a39ef33307
56bc04636a76c1b69726042c35930f80245be32a5850bc7f1c391b6cb629be47
10d3570d721a65ab7bc5dd652ef91a7f72460ed9115e8d26710778a718882aa8
5b71762031c91b153452a6edb190e3791e35d18f3fbb328912b703883c25854e
c1b3978bcc6d5c6852142c8d2398297e8329808b9ab88b538782a97a934c9705
3265093ef053204417b0c05580eea97b1cd29ce2d58fb89956cf1b74f873a5e2
e016ae5900af2c17a1eb18cad35e07f74090976b3b4955ab24293ad02854eab2
e7ec9149d1bb7a609454888ac8ab3313fb3f5be1464deb9db3269dd3e8325e59
add7061899a7cafd5c62667ca3f0e70b435b9240a853ee377aa5179d9ecab8fe
9c22d58223c5f33e6198cf644c59ea133e1e7488184b87fbc51c08c3066aec42
1005c04a5a7aa34744f6c919cf10499dabba461004ecd1533a1b7539e9badea9
4c6ef525c728aea8fb6c2107651483378b3bcc9a8c8c05e2b793f66c0f6aa881
64c8f77a6a6246174dec7d55068a71b852cc93007b4ccfc6216efa30b636e2c4
23f48e2c486bdd05742e073a921b0fad0992b63193868969ee4c0e567c58ba38
b633087aeee5b3fd229c9fa4a3258567d625ab549825bc031bdd60c074e14eb5
c4c75c0409e58aa79f943b4504848842477d6c6e0f39c841c1391e212ff7752b
9c819991286714100d5daa4f9004710e014ceec5259ab2079761bf7bf992d130
a0de3250ab8acbd68426021ccc88ba94a511ccc09cba2e084653969bd49c1350
450adfb3a695f43f8afb0565cc8a22c7b3a0539ae917a20d33c3d2482cabda53
a43b717048622a1b09bb232054769338c75a11f0084dcbb87cba87a7160f8636
a350b485294159b885cd67374c908239673339a0667e3e7ccd5749a274fcc838
e417955179961232a9d592b0c80d92d921e7c70e39673d3fb34f8ed7cfa3e5a9
b45b24849b1767b69140b44e8a00448e1369711a087b6a474bd4587b4170f5b1
7520301dfb1bcc1cf20a8dab428ae96427158f16d607c8893fab944f146c4e05
3395ad47be08794dfcb5a3309bbed74c8881b18aba92a8a7f155c9f8b2121a03
87e4cc0b5305f74251c4f5568c325686c1b389937a606ba1e8475041f3a462ac
48a513c02be9b22570a3d3fbbbac654e014aa22b91bd934a4626e27db8f388c1
2b062af46980f92bf9364cfc047910617cc9ba08a456abfa173510a4189d96b2
c3cc2a1599b4d8635ed22c0f037c4e7a782481787043807345d1adb377c66a6b
9b5c3098f4022e527a437c2540951c8f21da04cd4236dcc3c95d243b0f999da0
293f5445022bb51d45a5682a72a08ee01781003a4d77b1186016fda3588b5c41
b998bd9fc61c573aa22cb780b7644340f82cabdc3b03f8c77fc6a538c96e10b6
94b3fa834f62cb2096855247471c1165bd0aa1ede91ffb19615ffc8fa7376602
54a7a25c6119c24190356f8b4643adbb6d1cea860039582fc9beb6d272322ca6
4b4b51efe30e3596100124b42eb66112db6769c6062f43c8feaab7b940b8a3f2
877277a6a3d3470e6154ee630b87f5660379bf6c72697bd98a7a4bc685917422
2b762ec2804a77032e9a6372a386737528ae6a37bdeb0f6e8036269c7665f958
eeca8342da84ecba6f645987bf610407142f4d0a0784e2b84f86b18cc267c4c5
41ebb69d8b31c9745aba739aaf7c657cd2066d92ba3eb52c88dd504014454a1b
d6795dc2291b8b629ee33bf5355e4c2cb4fd33594c896996174fa3b0cd1bb780
d2c57be5b18ed666855a7b5abde451c484004c75670dc1629d514072e31ff15b
89722360be2f036079cd5c92f19d109725be2cd545d75ca8e52881f3e8a0c1ba
07b06e35b5c465dc9947403cc7d6c0d614e37bfde9c1a34c63e95edad010f530
09275dd5e77c9b6819859f8cbf61af710b7bdc29e359f714bcb460748c456a02
d040a811043b868c415edbb578424b5d248f68853880800fb2b1316b6b5f5c76
6aec270f2288a8695a4142e6bd24e0234539caa7fe97e0319998276159177baa
545305ccd15b8ffe25eccfbb3bb0ee540591ca1757fb231ed08802242752273a
8247f763f8ce3ad0f592018c474246fe85d87114de3fbdde80daf90d8aa9d946
d832428a1595ebdc4aee4e66292005e0ae31fd1d5587332d39b5092e9723fdcd
2a8473e9b1214b24ba57fa744b05a5f668c46bb64041fcf2cec468b8cab18a5b
3404a891badb256d0a858926e807959036958362428a90219d7e17517619032b
8cd05bb030b8bbea0acf5e4e0abccf3b96a366bd2bed5aa19e65bdae538a9d38
8d3b4c82a1e94dc6f0eabd9545adef6bd40f531c5005d1a77f4dd87fe9deb28b
223827c52b7cbb367ebcbb6d8bc73903c361193129118de1d0e172a9f8164c57
9f0f18e7f18ed5b47e9a32cb9c1282c23ee727c730e5d51b14fb827fb6f3f76a
52c6db5d7afe356fb2d5e848d1ff0cbbe401d484f838fca56cc21e109282718d
1327c28a4b9100a24bac2a464e6d64c469cced531488bf88856327a6a6dcfd69
c56377ac0de380d3dc9d5b9ce563da7941feaf489593103f1f5579b90d5a636d
3faa358aa5229ff6a5acc4a5cd1ab8e8b9426108a2f9dbd6a20d4c2d0f4064c2
ffa2384f591adce099b1bdbbc9bf8a8cdecea0a11b7626fc29b4e14a02f2116d
b3f783f2cce9a59b08e25db72145f1fc2dec258d66cdbd2ae0817950aa661381
fa0a04f54b297953e4f1721f8775f8b88981dc15432cccd2d2c0651d452159d8
4adb27f8df34cbdf8a7f52b9eefd7c5d3a33b1e77d161ac3b34fc513e314816b
7d3b3b11ca1f830bfc4b3f3b490ce2bbde3a73b7438e64e3bad9d123c92dcc71
07d238d28d2c073989fd1a628694b0e071a04f3b8c1e5f9d94fa1611125f9bf3
9a6a276f25270152701c578d0be3fc4ad51803b97e19a40f2f58f66e598164bf
6ca70633a4dc5772e945ef8a120418e6a89d8e0a618c636e90bf5dd907294b8d
db755aeb29d17c2dbfb82512e8c54dff62d44d0b2ff4d58f85799024e48e75ef
5dbd18e6bdc6bf1cfa79a18dea64ae8e0b7fe7b769d2e47c4f4be26f5210581e
fa1d727d893035fc89bd30355875744971ab981eca9d0def4a6d7b0597e7e673
f84c2b80ea91d89f86bb5add5ffda6cb7deba8a0de294eeb13ded8e67bb573d7
95fe1f31a521878e8404ef5492e0be523e3c5f6fe1ff5436ccc98cd30f411a1d
7436f50d72d890f25566545410e8ea31dddc3d73f21ef7fd37095e20171d7d00
c71f0d0fb787cf8c9778c4f1a91273da57ba1c2c0e6dd722fdfc75f34814844e
26b72a329637b9558c3d3b80bc059167a66639e5ec48057a75c6361640531282
c5f0bb7970f2aab8754108b35af07379b252cb4bbe998a37313a3073ed999c70
b39802a03539d6bc4fd43bd7708e30d26e72e1bb7c66e4c535c55bd2e5d6628c
bdd4707cf9c88d39f6d2538b055dc29a80aa35c4b3d0d04623adfe7f72681446
1f348d98bd234bc650fc8dfd31f42ea768912affad5dff4c6861900d55ab3ce2
fba92776613c38a1b722377cc189d592c6556e60fde1661b558529543120987f
d18596bf4cb4b43a6394a01c13c1c723747a130b60f0dbc985f98479a2ef7688
f989d653f801315c6f260e054136e3f2ef2a545d61549e40f882c04e66420b1a
a71e22b8d654e20b0402775013553824eeb786e8daf1d4c35b05d9754290d9a2
2af7e32bc45756fa49a56e13a0c5c614b97ee30314d60d519de877de622a9c96
64fd89587a3647195de9c5ae1e31d87803e26b067685889c393e034b83329d44
3d57e003df08b3f80362ed740bef93d25c65e049724b92fe8e1a50195a4f3629
7891ac3de50608fb8949e4a21464428965976f5902e2f9000c0572e63d612c00
b53cf462d8e42a0c94bd7b91e5e2528be2dd342db5a1bf642c4f52b07dae0fec
a78bca15b87e136cb7a3fbdb84290b21ec4ccc6afe7d085718e5a6454ca1ff93
1ccd3f3dadd313ecd089d9febb4077fd93f5b14c46e6f3f4a8d6f3b2612a5919
ae81eae365f83e98431bf9c58ec67b4c0a4024470b90f7537b09cfede1d42f73
3fcc56db48a6624315e6b590c6fbb64ce8c5940381ff4142aa756c79ada98351
198498c82dba5e6f4d52995f540b4f3ed54e54bdca2911e5fdd7fa9c524e3fa5
e4364518d0a9b01ee651863388ebabfc5395940d81503e0c295520bfe7fe18e9
e7cb8fdd38a6ea70c46708d1df489fe5951ecb5f8705ad208ad7a16ceeb31967
a2ec661e7cd16652e189a447fc1bc8fa0b3e846fc8c1a305c451b0226b5749fc
7064075b5212f5d569a18f7f7dac1b846bf48fb10b049f2f8eea920f5380428f
f3dfe73839ee61271a92214c07a6610e3d0f49bdc88179f8f3e5f79c0fc4e334
91eb21f8da0e7bf7c199392e778bb4628bedc9ec11755166a453869d4f909bce
87be4cb86b611ad2a73331feb51b2dd9c663788b1c7915fc29f8b3cdf482f296
496223f37e524901bda147495933b23e628aaf49def21f49ca9a495bf7ab0433
f54bb45ff30060cc95cc716a7db7cbd9857868eefe87c46f7f900d8a151410db
0f9677e4fc42d2637497556e8c39495b3f0186f4ad50697aa9c1f811489c92a2
61d5cab73824bc16e04e7d074dab4615391ae5d5670953240679737fe4ebf950
3f516c5ce1cb7806a4ed362845ae8a5731b2be2de9275ba3025c6f745fdf91fe
6544b801838dc566d7223c6a45c35f400feee3b61f137229011a514ed16800cf
6ed559e97163499b0465a7c3af9d2edcaa302ab281f54e22f56bf8fe35746cbe
3b1fc66215c8b2693dd95d3c8a8a5bcd7194a207b3547ced304a456a2abcad0f
192b4daa3f465d1148ee7cef3d85cfb60e662b676b333779497ed94b6bdd56a0
6bab28a0487725cd1e83b64972fda869f1441e575a332f61b2e4cf68941ecff4
a8fff812cc93ab2001f3e9aa3c83e106eb5f0686a9db9642c3ee5adb00060f84
a62e9d0d49f9cfd465634dcceccef03b7aae6c4630f16b1ce7cf24ebe93dc632
371f834657bd129b9b9aae35d435f12ba2f80432792b6d61c9e81fb845acfe28
80a8ee69eacd0bf55acefc8542f4c6a0e4754c242c94770edfa5d3d08d4ece9f
7f348790cefaef32d4fb855a7c5ff1293abf94010756be06c7950dd8342c30ae
6cd9454a5bc9919c534646af3e7ba6c5060d9fc7356eb6747187ab43b79679c9
82e51b3b5bc76942bc485a35b9f2cdbb14ba8ffad8bd76442647486398ad42e7
22328af02dd81043ebc82cf541e7e8a6e84e123c32a1f7f34ca938356bf9dfb3
6e7d1bd644e0c43368ff9650fe1ed71e3f232b0aeb85ca48523ac443e8fc078c
80a285aaf30fae8dc9faeaaccc7d8991ada760fdb2141fd69385c29bc7a328fe
9ab86246973c940f0a18728eaf449b09ad04fabb723a1e181615ef85dec92086
99db8a312caeaf959160274bd6a8e37e890e84052d7ee0a3b010ccc714ccd705
d423a6dd3451fe76ae2f600628439a736227269b4a7408713b1a9d883ac12b27
10ea3f8ef3a5e92df430ef00b1982786ab7b05bfedeec947ded063cdcb525ae7
7a5b62ed51dee2ab72c39e7f85769be8e4947272e932decebb9ba652d07bcf70
6e84eef050d93b70b7a0840e5a9ea3bbe19c223e62905eba7f4818531ec47ccf
31d767bd3a8c7a107bce757b74da262f4c5dccd305ee2fa0083ec0d89e9a555d
e0d0465fd234328d28b863d4da699be123bc5a7a5ee83e60f633d5e20b2949db
d86f5b92745f45f8128213cf27ff08e305ff04f9eb0376a6cb09c32de566f424
8f92270f832d702ba25771c241674fb979ab6d7f014eaecae4cd20d0b8fcb474
78fdb2e8fa94c8dcbdf2dd182060dbe027d2c3ae0f73cf2cfd973f5f7dfa6d98
1e86d653291a5d45fb492daaedb137e5973879d0bcd9a5e2ada660bcb31969ce
70009d0ddb6311d89d18d616236054733c11e4c74ad56e3ff5ed45b1650582a3
00b3b4230a4f95d3017ed4fde48a5b91455b0ef13b7d93112a1155bb8cda7aa2
769dfd8f3af0f4657f2ab57e593a2bac56637a31d809d1794a9085b5e276e731
d954718161e4e349df78a8792d01ca0cfa0fab0402b84a25a555a21af534017f
667f97c7bd7d54f008e0493f15abf721e82407d70f97df01ba9329bbf163e616
f6e993b05ab71c4a0089e71ecac38ef83b37c86bf39bccb2641eedc327965fe3
7d6564fbd6669e8f207d61ced55626b270f62513afb84161ca55d0a98c7f86f4
2e9dac965be49d73f82626d8ee585ce4b4f430e22b565174e0199934c2c97faf
a5ce90ccc77e49beacb076961630139ce0ec604655744c5105dd57205b08d7bd
64c33f11fc16

Response (3222 octets):

0c9600020000a9b199d7e2b1a13c5b26c8358def72ba998405fe740ceb00264b
22e56538b66ec8a9b714114ca5b4f68dc86e56d0598fc974c0485d39c89b6acd
624aeade3c95ccd40f41156261bfbc9772cfb3066c3bff52631356c9ce45f0a9
40f934609358189c7022637bd8b42280ddaa6d1925e3eaf6b61bc58f5aac6535
fdb3e9e26683f365f91ae531521e8231582a09f5bf230a729ebd66a7ea7fe219
edd16a3163698297ae8d98ab5617666a70641396dc2acca98e8e4f2dac9f8d65
28a6dc41fbe261fb5ca05142bccfbb504c81dd9e4f530b431ddaa841ed2eb049
7144933d5ac33038d8a11b4dbb9b319c541efe89b492ef51390b11d810b73428
8cabbff2571d90247113c642501323a24a313ac1a182abc7ac86610f552467ff
233765af5ecd91256587e61aedfba5cc4ff1b48166474f0598044f394fbedace
59c59b37d44ff6b5d7278d81a075d370abf0a1a832f443494f080ed636a7c109
e1e2f6e0d6e3b9e3501f1ade14d0ebbf0874e5da7d692a8dac4b489303fbf0e2
d2541b30d31085a84b22c0d41cf9c48cab145849158d49853e86e549003c8640
108b7ce0440f1f374fffc07b05d534a80aec9f8192461a9fd9014e0b6b3edfef
c6cb6592fd2cd61e3f826156b24b76e0de47d12b138f13b481465dcc2e50ec37
f5fc902c702a89cea6b3326777534097791704cace21b3b0dacf8125c0d32b95
ca478dc4920a6cbab1d74d456a0aabaa414fda707d3c168961271c0965ab6519
79ff7bcee538f01fb01681036b7467c86757b9f46b4a16113de143bf4c937af0
2953db3e61e2c40c982ebb70c154cb17dbfb8c413b7da256e1910a515133bab6
ef2095ea8b10c3c27f039499921ecb3c703824fce6c186183fa90d19bb0ac7e7
1960987c16a23c8a145dcd17e66326d3a34ce237b1c0c7e700051ef9b02853b5
a9733bc60e00ab4cda935425bf73c97512c0b4efd8ba63e3b70f26129a6bebe8
46462eb3c8bef4bcdc8e3ce30c86f827653a91b0124965d66e3f218d0b6f3b2a
e3b45fa4c176ea18ac2e37d9bf3ba807014c1ff42ee306dd9192a19681eeff06
2b0c7d1df13825e07b9976de2e3a515490d99c3c9b95c45fcf368a524c3d52be
b36123aab01c6d52fa8462cb06d2ab46cedc79d571fa1014a989926613e6c8b4
434113874dfb0c6993c5c4bc3d28530eb396e4d79c391b932f0ef4ea2d4f0f1d
2226f2d06a46091e6ddc09ee0b0be6fda670ce37c13f0b46bb8814743f674e10
deb6b0a8b80b886f4a2efacefccce410756b34a9d7fa3e971e2ca3bdcb840f0a
803886d6a8908b6fd74067ead06def692bd02981949e1f2bede370e6a92ee028
4f3db2c04b2b08664d69c8c25bc5e6edc2c670a55ab8a924ea44ade5f88137d0
16aafaf5e5b7631e17f58f3063ea2911cc7abec5311fa217c9a7a2b59cee3d15
546e4c31e5e8e72364c4e6226987f490941edd90cb044e24894aa02957140e42
838a0d51993fac7c03ca79abea44c587718e5efecfe268df8a3a01e9bf837288
c013b336e09fd43b14d9dd04a8537dfd327ba592b9b57268183febcf87af4a5f
c7bdd70d0f96656cbf9b86127a60ffdb0858c75365654b073e61c528a185fbf4
120b32ee27dd457e98494804f01a6f17ffd3141cde98146d5d1c6fb26d681857
e08c5d7a20ce17ec57d7c01745dd10b6a39916301b7cabb2dd99cc509a2fde74
11b62ee2b4c19d4317f787595c3b172e019a9e7bcec125031ccde95b032b71ca
fb0a6c3afc7d8b3d5d30d681c7b88b1d05df3f988d5ed4a883ee87c2f193c12c
ea762340d8572bb7e91639639fc72846299c70ce440bad6b8b14ae41c72984b4
e41d26137498ee25340d216ecc68a6974ccfd388dc683ab763ecd8453f01dc60
6b871bb6253aa713a4e0b4b8005871a514d96b565fbb19fc7710c518d28469c4
aa7932c918cbd86958c7f368032d1cb9a44182552708c1e8863529c62fbd5fdf
c83a2d983a5f73bc2b1fedffabfd69ceb4fb3cb395132dce74729579812680ab
ef862745340f993adab5169f10754cdd1afcae147853249eb7b8c26d0d141560
7e4da667ccfdba71d312f0f20c9492678a8f9b0d77200849a910a7ab96cdc64d
c907a20fc681773ed6519caaf18c485aba5038e10275788cb8702808a9cf41bd
6dc2261689e1178ec82b40f1d5e426f4c3452e609a4f5901b206d6c3aaa97314
94babdf994282c45a8b2fe735179181026f1808e353fd095f409cffaef454f33
a73732102d40be25096364d8cc23a1e7dbed141b67477ef1dfebcad07b420f7f
d2e2880839d8c7260a358e9b6785eb1cd4605d4cc2dbdec45d7a7ba8af3f96f1
c47bb88adcbf8c19c91552dcaec99871a712617d1106cd177ed28208a37bca3b
72d57ac7874b9c243cc5e4ef98be4b75cca548e48199651a92cef8bf1fe4dadd
fb6c8d83658066a8f57d2fdb1feb68788bafa0971f2a98985c6b81b190a9aaa7
65587fee13e49f651f5bf21eb52692292170b442fd519b7a80a4920ff111c2a2
33bd39cebec381a939ee16cdde1422c68a2a16c529b175bc4295dc08435f059e
44fc11269aab5ee4335600731dfd21010b1597de4ebe248446acdb9c0d1cdf93
cb048da7054e66b2894bc02100811a9b1c68a58fee41c5210fc3acb8d5d98c4e
366e1b087a7170ee6fc1fa955726dd702230ac32ce7ddb5630b23d2078ac3b43
457c1b172d6a861279ea9617aa85b733232e493bf4a5321b3bb98fbd32df62aa
654ce38623a92aaf1ce7cc017d51accc0de6777d20736d94a256f9ad786cea83
83f608d326c0708e3f55ff860f84cc5a39c62861ed8b167ef33496f2ec16fee4
1bfcf3d0b870a4a0ef0945c6d137ecd52a4454e34edc546598dc07a54b357527
604f7b67663e34a425c18eb690836a4bd52b6d3dbd20ffdab6279505440ea7ce
41aeeaae2511fefd0359ed17a0249460bce77e46bca53c33410dff075bfd8288
70be0a950d7c581969b7a1cfd96a44bc729c69266895933ce447428048486c81
e0d13cd7753cf6b5726a262b1e0fbf7d8c56f22de4be57edeb975de9aeda61c3
28dbcf750f8b1d4c851a29d87a227176e9a5c4f7536415a824144e63841f6880
0795d46ab881f6f902cf985d5a9b8c8f3165e6a90c15bb6a969b31d7d617bf5e
76a73d5bd25bbb00ca94e5ecc70c34f835742871818f27fc99f8b75c1cbd336c
7c9f957fce0a18f2c0482057c8778bf6389bc951f81014a025189dc871a1b818
260ee82cd64eeba2d1d2490b3cc2d048746d3c3318fb6aed7413987d89ed9033
476233aae8fe0fb244315f4cf069ee8fc7a6d19f6d7a4f8364afb088626ecbe7
307bab94443b78cde9f7b12c567d0caed8be660f5ce4121785eba62bceb4bbb8
83ed230299273eeabdc4180da1295e6747915b8b626a5befc984e3e2c84d0b19
361ce1e166022da0a67ef304525d1ce33efa0bb0d97b5f091be5f8af6666d510
aafc7afd7a82540ec4c3bd313532fbcf14b1a847c20ab7a744d89debe0d6ab63
1979db99dbfb3598c814d1a72e28134d96c9e59e8112a3f3c5a3fbb341a31554
1a532fb0219c022e2322d3e8fdf63c0a4a89518de9995f134d89398fa7da09eb
fab589300e72b90ad9b49b086a61e1a4ca6325e3ae681f1a537baed41d7982d3
81b52aeb0dd3e59303ab037491653d045b6d50fc30b968526ee30a89e7a99a37
3b7bc72ac7387254f0feb7fbf17ecbee46e1d5b5b910eb98e7bd181a9937a690
0cc38ad5ed5fe4769fbe7cdac7c5b2d7e4976151ceaf968035503741f3a2df05
840077b0e4d90bf14aa7281274bb3b539fe251fe90c27c756a4449ddc90ecaf0
f4168ce5ddface76e6fb8b53ac0ef27ad1a36d429fdaa7d739f15ceb0baddf68
b80a58ef478e2887e90792fcbfdd2f22eeac96b8ce4d12fec4d381d61dbf9dc3
852f671be2c9db0436a161861f8227f56d6603661059f20bf44fb34175afcf1f
1e08c4a90aed59c64f4a9ad43c7e8c5f591dc0f91431571251585f1089818711
64732f4e8ae32189dd593f069fb9435803ad0b83a334f740f228aefe65de2ef4
0836bcb8177d213e9b5d9e9c27189ef80f165008e19b7aa94e764001ffd23403
e003a0f8796253ccabff45cbccfb8c9b609d9a768098432db936635e0c20c375
b9fe3ba7a79d7b2f0a870561be85aa78073737989c021b8cb18aef40c2f0ca73
9d70f7cbb1879224cdab3e342875d1087e5d2a7629ca9950750580921a30dc62
2b4d1ff4296c9b47ee0820d1134ecd074d5bfd8fb38ceaccd63abdc4283ed5ae
8fd57ebbef29a4738753ed5ab1550d33eb04972c80c2f54c368deb0a34547b3a
056bfea97a31fe0aa1c902efd600d22f25bd7e7b9098eeda80c5eb97c073abf1
ea821160a11f98311dc089179aa5e9c89e98d059dd4cf579df0bb0a08eee8fc5
f0fba0730c347b6dc5d6f54917badf9f56e3b3835dbdcc3fe2c287b68396a811
e798a1e5cc7dc69f794740b14c2876cccccd012e8b1597a39fe9ca3084a7972c
ddbc4d8ee04caac88e10c8cf98f18498e2c3629d45f4

EphemeralDK (3168 octets):

278836d513beeca3453fc1bffcc5bc31d374a9ebc228c2517ea4419c6023aa8c
390d93aa40ca37791756d4f58c8395836b669b58120961016dd4d31c557c5c0c
00662d0a6981e212126678e4507bff74063fbb4103564ee6d64bf66756872196
224056d9d7c4d83443d4659f9200bef0c9a3398741aeb36441f303e3443a7797
56c2ba785659789bd35913eb938382a162342a55a747dd0374e40554a1ac98d1
24a35480736c76970300b51cd566b967aa6ae054cb9c500cec5ee8c407d64736
e61088b2084497655d97f9cb765b4e3c032715098e39d8c909e0a4235a8c5093
510ea726a0468703d8875fe67ef0c11523f32f9abbb4aaa7926c7ab61e475299
eca521992314b3a150404026e6ab757094378b98c24a65f0965e6a984ca01bc9
e19a1f61570e82e80ca004a9184c34b2e19cc484ae3d001f059acafbc4bd3368
2c76576f812b5cb1d37421531b98c0c69a028abfb70fdc202e6aa6b3cd81b69c
85374006184011ab3528a1423b5a7dd59d2644890d274d1cc3826dacc1465b43
6f23bfe5bb680f791375981c7dc3b3667c7b0e8b17d3d65ff662c05f39be1560
22cd3276e545a9078302fa7c6e6805b8ac7229e62143202315b755bb84147c3d
0bb468780a63758d747034064775ee387b877c1281593750cb3c3d118285fa45
fc779da35b83b69c24c6e31562270e72a5134e269800dbbf09126ecbc99c8354
9a2c7004d8612d41a1193112325457cd69fccae32ac91f7432c5b524bf5451f0
18b4a047103ed01a0ef8227798bb098bcfba97942498458a6b9a2449ad94c14f
6133535e4ace476945fdd91daaeb5bd7171abbf6a0706876709c515d17277e69
21c8816962bb76bdd59ed22b91d9847055b40b3c0c0562d8701e3519a424c28e
eccdf43a228c695ac9153b0db84d71926074d447cc2c13731321183055391226
2bf37245d154f2b9b35cb66abb3991781c550d49243a19696a8a244cab8df8e1
b6ed129c68bbbd8a66b52a519c23d11edfbb1107aaa73ce9c86cf4b002c7a641
2c08282c87b60a03ffb61453ea2e8d339861e04a21165b40447aa5c06fc3ea12
53d29261094891d351d18430a8e743fc04936f7316e98017f34cc1390c48b7c9
6c6fb9841bf75ea0a42662d73e61a19226e8aad6b8b45d01b2613b2892a96c7c
d2203d7a0754227578a63e79fc199097cd86ac3f388a72dbac59f132abcc0c32
fb38a8a3530ffbc46e3a5a73c31c070f5c2651b84dc2fb8224c83ae0571528fc
25a65b9f88ab2a5587c75a0090abf1051c77888c39b622905618eac0ea134df0
ca980c72b61bf26c1bd8ac397775ae945e72f325df07425dc38a5ef85fb5fb91
bdc584600ac58d9709031a81b801abb0da88c895967ab9029d3b2bdb00c49a01
11035c72a6444afaa56b36732381ca6d9fb74ffb1842713a112aa218f7f3c7d4
ea6b0c5b3ea0953a05884df6b489d5171616fb6a5bc907eb8827cb96bdac1460
c3f4a596430c1671865217222fb185d725ab9ad26c2271486f189c9fc3202355
3954a65a32c970678a8999d4cce3074336894e6a697ca89458bfa17e77c2a255
206d12da4a26239fa56249e6300b7d409b6eb11f0d120583542b4f86628ea081
adac41d750cfb62a55bd3185c167acf6b17a56d879c0e430001d7dea405a2f30
03d2c448bac72df1c2bbd6c6c73de36f74340284462df1c479c6e54f61d36c0c
f7630270a2e6449590d3744605adbf0462d7271c65d26102f22ba91321de6561
2da65e6e7135f4e3909f59b5af9c77373a0a869c7130b76e90e954b72359cdcb
1d40111b97526424466ff7ec204e40b9ae7462d0135faf697da3263035203d8f
3472aa9c97c6f40124f7004d35b4b9497d6d823fd0748484885ff5677931285b
9095124b89cb214ba507cc7ed527938a5a499b800907480a60fb03848b4f1570
be8126a4d21701b3412a3c594a8b31a27de65d5b5ab72d2b8443e562fa312bea
f79dc5a965b0e1caf5b09fc413ca16c44ef5e1b12f3b83eb66beba35b1b69466
efb82b6a52967e7892f6baac34886b40fb88615323d1212234052b604a432872
4eab4205d74326789909852028f1427255922e93a9ccd2c9bc3612ac275b5577
964456fa6b98d2bbaa835042eb8065cccea1f49284c125f9c70e1ddc15df5922
9ea9897e027cb1a32530a7042b56147ae2c00db66edf88b9354c009db69547cc
35eaf3a05ad42eeca9a6903b9137844f9b7b626a7191895c8e4075c1e67b6c07
660d6403215221a2ed476e6c54324a6891965aa8eb3b7e32f3a5068378b3749a
8e4b595df79d23b94920053e97e9bd43505265579620644bdb3b32463978f071
391f23c21d37733dec5927d591d08a667488c27a3c3e7a0a1f882ba99593773f
41386c94297832384535876847bc5e04ad11d90864f9608d713437243974116e
42933962438bc0038c57499b8f952cb4bb67a837435e66b8da4c15955415f8c5
cbead010a226a12c8655f4150969386843f3881b494d295bb7b4a20f60457b98
09916870a76931ab3d252c6745c8c22a59a4a39ef3330756bc04636a76c1b697
26042c35930f80245be32a5850bc7f1c391b6cb629be4710d3570d721a65ab7b
c5dd652ef91a7f72460ed9115e8d26710778a718882aa85b71762031c91b1534
52a6edb190e3791e35d18f3fbb328912b703883c25854ec1b3978bcc6d5c6852
142c8d2398297e8329808b9ab88b538782a97a934c97053265093ef053204417
b0c05580eea97b1cd29ce2d58fb89956cf1b74f873a5e2e016ae5900af2c17a1
eb18cad35e07f74090976b3b4955ab24293ad02854eab2e7ec9149d1bb7a6094
54888ac8ab3313fb3f5be1464deb9db3269dd3e8325e59add7061899a7cafd5c
62667ca3f0e70b435b9240a853ee377aa5179d9ecab8fe9c22d58223c5f33e61
98cf644c59ea133e1e7488184b87fbc51c08c3066aec421005c04a5a7aa34744
f6c919cf10499dabba461004ecd1533a1b7539e9badea94c6ef525c728aea8fb
6c2107651483378b3bcc9a8c8c05e2b793f66c0f6aa88164c8f77a6a6246174d
ec7d55068a71b852cc93007b4ccfc6216efa30b636e2c423f48e2c486bdd0574
2e073a921b0fad0992b63193868969ee4c0e567c58ba38b633087aeee5b3fd22
9c9fa4a3258567d625ab549825bc031bdd60c074e14eb5c4c75c0409e58aa79f
943b4504848842477d6c6e0f39c841c1391e212ff7752b9c819991286714100d
5daa4f9004710e014ceec5259ab2079761bf7bf992d130a0de3250ab8acbd684
26021ccc88ba94a511ccc09cba2e084653969bd49c1350450adfb3a695f43f8a
fb0565cc8a22c7b3a0539ae917a20d33c3d2482cabda53a43b717048622a1b09
bb232054769338c75a11f0084dcbb87cba87a7160f8636a350b485294159b885
cd67374c908239673339a0667e3e7ccd5749a274fcc838e417955179961232a9
d592b0c80d92d921e7c70e39673d3fb34f8ed7cfa3e5a9b45b24849b1767b691
40b44e8a00448e1369711a087b6a474bd4587b4170f5b17520301dfb1bcc1cf2
0a8dab428ae96427158f16d607c8893fab944f146c4e053395ad47be08794dfc
b5a3309bbed74c8881b18aba92a8a7f155c9f8b2121a0387e4cc0b5305f74251
c4f5568c325686c1b389937a606ba1e8475041f3a462ac48a513c02be9b22570
a3d3fbbbac654e014aa22b91bd934a4626e27db8f388c12b062af46980f92bf9
364cfc047910617cc9ba08a456abfa173510a4189d96b2c3cc2a1599b4d8635e
d22c0f037c4e7a782481787043807345d1adb377c66a6b9b5c3098f4022e527a
437c2540951c8f21da04cd4236dcc3c95d243b0f999da0293f5445022bb51d45
a5682a72a08ee01781003a4d77b1186016fda3588b5c41b998bd9fc61c573aa2
2cb780b7644340f82cabdc3b03f8c77fc6a538c96e10b694b3fa834f62cb2096
855247471c1165bd0aa1ede91ffb19615ffc8fa737660254a7a25c6119c24190
356f8b4643adbb6d1cea860039582fc9beb6d272322ca64b4b51efe30e359610
0124b42eb66112db6769c6062f43c8feaab7b940b8a3f2877277a6a3d3470e61
54ee630b87f5660379bf6c72697bd98a7a4bc6859174222b762ec2804a77032e
9a6372a386737528ae6a37bdeb0f6e8036269c7665f958eeca8342da84ecba6f
645987bf610407142f4d0a0784e2b84f86b18cc267c4c541ebb69d8b31c9745a
ba739aaf7c657cd2066d92ba3eb52c88dd504014454a1bd6795dc2291b8b629e
e33bf5355e4c2cb4fd33594c896996174fa3b0cd1bb780d2c57be5b18ed66685
5a7b5abde451c484004c75670dc1629d514072e31ff15b89722360be2f036079
0c2b53fbc3a95d855764f1c2c32ecdf073904f66a508d23474b89a0901936637
47ee59e2382f8a7f7f172d6b01cd4a758375719efac3565988f80246b43642d5

SSPeer (32 octets):

c8c5d49f0034580dc8107526626239f7e69126bc0d00e8fe906dc2f33248f24b

CS0 (48 octets):

5915e3c7295823c27c029f6034483b39f1451f63e9795cb6363c2b4e7f77f2ac
9bd5c8c81d9fccf468f9ef1ad47a5ede

Prior (48 octets):

21ba0b1628a1197321a2d79e29354143239176968222aa6923b809e9b9db723f
3bbb0ef191823abca90904b450185449

D.17. CONTINUE_0RTT with a Proof, a Record and Objects

From cs(0) of D.4 with the D.6 prekey, prove_peer, an echoed record of 100 octets, attempt 1 and an AUTHZ object in each sealed part.

Record (100 octets):

5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c
5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c
5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c
5c5c5c5c

Request (3325 octets):

0cfd02010001d788ab3f27fe0170838ab204f288b46629d78f0868b382d32bce
86a7135aa22000645c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c
5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c
5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c
5c5c5c5c5c5c5c5c5c5c5c5c0000000107b8f9a64be9b59fdc73f5b0e5d01812
cfdff4df65e602af511aec0cea630c269a0236de7ce4b8539c5ccbe808e9baab
1a45f03c374c5f93a4fa5f8d396a7130484ecdf824bcca370d50a811bf8eb918
8eedbc1fc10ad36e358abf559f5821b85ee065ac6dd0e1c7ba6529fcc3ddcecc
6ac51cf848d132d6c4260c9e3af8b443e7d2e1abc3f334fdd72a4cc0c1acf099
17131d97f563a8c197e4e8b5a0c8b2f8ae30f21b4a9cb8c5d306ffef99d158f7
e15499e0537d71a4f0a1463731b44771b8b40ee9504414e809e4dfc5ddb92adf
85908bafbdda08fb9e35f78a3e000b24b147a48be17f9dc4419a94bf6d7bb26c
ff265b138fed121482f08a50891d5b940b35a0143aa9800d5e567d6ae03591c1
2167535b59026296d878a2dbcccea7b4c7a6fcf09e49846539952c4b2fa9c1c5
fa48f05b0a22acd55910f757a21852dc426894dfb36bee2f93bf07c37275ec5b
3456b6448cc7d564d4d5ffd72b5f7e5674bc36dd9506b4981bbd81ed373f75d8
1abed410ff385d2cbf1228d44afec70433695e8c412df75d30e36d837eaa18c9
0d00bf0c3491e8fd27da8eb95365b4d2e28cbfcdb1a030f69a923121e72d45e2
2c3bd62adf6f9c4448337a5e2d2bb71df318fdb2660211bbc75f892d952142c1
cca6933e2a38365362b5a39489d75d4d87bfc7cc52ee856f67dafca7504923e9
bdf60d15224799fc7d4837392741f22c63409290933985937798f001e45f97e9
3e449da2a88ca24af27db4f9355733966682aa970b7b07e295c7ab8bc5336e38
25292df6039a8038977ab6e9580db0e2b92025b6a12506406915525e2b6b4618
3396ac2f3a50c396f234333e1395d28b61a75628ec8f3ea1eeec54bb20718d87
5924c4bb323316a37b9465bdd1f87e48158f33945590fe63bfb3fe31891b2458
3f215db3ea9265a7d9f0b655d40bb76d2457e1d0b4489acdc78b4e5b7eb57eee
70ab8f527c7ba7f1bb10a3291e1024fee3085af021b0aaf6445dca5e9d24caf3
6ed68f40564ce8ac599aeb8ce47e8d9dce94d460943f0e41ca00b331a232b691
0d7998b20ddd91a385ce85463e66225108155444cb570188a6b1eb90326db425
8878ab4658fdc71d35f503e3c7c5126d5ca68d89353d6a24c88d8f3cdab6b117
8a062b8f9342f7d2a0c238f8134e04fad1653efeb90c7423594b211ac5c3fdd0
aac67c173c1d61438e7ad688d70bdc283ec83638e895e698fdbe863e61140777
8b56f5119e4ff6624ac7766ab9fe4db3c84e628c9de3e7d01b3ed4aaad36f931
fa15d6ffb2bd8c3489144a9d23dc59f574bbd58f8cbca510be0e3f0099fa7501
3d02680a6baebc2ef824b61ba5c7d585091e60e5299d38819ad09cda7e9a7e28
6248a9c240317241c95c64dd28236527e1b4fd32296f3720975b574db254e140
6004f8b5cda7759f8a21babe08030b0bcf4c8cdee605bf6420913d840fb53132
effee302746137ebb048bd69a54dacabc6d3f1be579e16d915feeab9ed360338
103bfddfe1d6169dafb644206c75290bc1b2e0e5a73236d04ce7e3491a991c59
e70e15a5523c372988db0d0e5537df17fb73ff3f55f05f03525e0b8e492d64b0
997a29f49d8605b7dfe2a63b26de1fc5e7d0f20875f34209e33f54660387f05b
32224f4c27ad99f6c1bcad881c454192f845d383dbc63e78d91da02ccf762ca2
071c9fa62410416d1ac52c8e039edf3746828b441ffdc05478b4de3ed518dc8d
d2d0ce5a09bfcb9fac183e7cbbe79db3731b4bda37e3306a1cb5e018ca3bf93c
c9cab75c1cdafa89874081c68e9f1725e07c949f7d0f8b85d54a89cece5786cb
555583121b2c8d18f129a6fb5366e99e79da5ed366548e443df75f8723a0cbce
cd1346517035cdde2bd67d8cbf4e019b5cee7d26addd56e20188cf06aa03850b
3bc4859c69401adc9af649106a1f85542e183977c79fe9411084fc188151a174
6ee3b2540ba262b1333bf5ee56554a3efc44f89e1a9f3ce1eb5c481c16580e2c
ce31797f2aa2108d89fbc506471efd55ef9a3ce2df4e61104bde39a98daa09f3
5c3029ac37b3b66f91d2f168f1d80219a532c317b1ace1873a42ce9b4c4f5289
ca51b35d721193480981549ac502c389b915d6eb3b3f00388a2e97ac2e356168
c466e8e740ff812c834fc10201704ec30c067cd86e084d81627bae9d8fc70c39
31ae98815a9d418b4c95e4c42ff476d2aab266e641e18472d8586228f2db11d8
3a9d7b0ba77482c7617f38ccab966e8f0ee2d32c6417a2944382f667a696f2a3
0be2ef404743307e1cc85ba2c1d0e93dd3998ec4c29d886c46328790cf823818
ad0656c4702877cc90647b9a8fcf94dd6aa591a805c5c472313640432d14f91f
5c9ec737f08e2749f239b461194fae7abc5d0c773c3794d8322251a08e4b39f1
be467596ba37ecc4db8662b1500cb70a1af00035c1e3f30e49a873ec9cbd1d45
d72d0764fd5fa21a7e4aaabf61b1a01f52aab5af95feeef52624073a6a80b787
d81da52227ef66ef91d3c40ebebbcc26ff97721ae4db37b6804187bcffd38ab8
53323d22a350a52b622dbab84d8b561657fe232925fccbf4ea3f6f9ba4d9b665
a2304228fd940c6368bfcaeed8d8919fd9696e9eaadab6b2383daf9318189462
604a61c245f51a9eb954a9c250fe6572525aafb219829591fe05f2dd30eba540
f2ad5354852d9ce90311835331fbd67da556c0ecd80d4ebcfb90dca8892bb73d
3e4934e8296fe980867a6b3cb089a61aaef5e46224fcecced6b7caa76d3f36c4
48e84de79e97e906a710bb9f0f25548aef101df95a098f47ff80d6ed91fc2eb1
98f64b8dfa950e8066ad2968efc920d2e881dc7d8b3b6abed6bf11279e5c775f
e7fd2766e5aae6a46fa2041699d5640a70349ba659806506441fdad21448deb6
c21b64811b421f84437072486e69c199e66fb0a63593f0684c97f80ffa884350
5b8d7cf6385c59cd3b64f84294f3795446300117e04577b127014e5586041b40
62becdd2ad80cc6d8caa070a87eac36aeed2b877dd443189660a009b5e4a195c
17f6f43046c2927c511f2896bad093f1d0932a6b05bffd1e5ebf1a37b963e262
ee34fe5677f0de23125a8ea263638a3b87b640973e48751bc529f6aa59f5621e
d3d22002a09c0a77477c35cc6ae2415dcb6d89b826f162e3d5e8fb46f0c66593
cabf51a3ef17dbd2e8dc67ba246db94308f3e3026500e23fe399bc0e64a9b597
ddaf51a1187cd2d0939db529b3e3b3bb34d74af14c8ae68346fe1e9ce372c2b5
7598ced98c72f75078fa7c0c91c5ab96e41c442b499c6d9f608680d6c896ec0d
f3b42365014c0b5a47e5f1ae7f153691b8ea55e62c14084f8d9c4bd247da96cf
7436e3c538478ecd80ce0026688ba4ceb097c737687c6d4c7aa17c6883fd2e7b
5928ca6d996b6dde22166dfde1d31c1bcd622f4f6e2d6fca468a1680b2e24a24
9cf1802bd2ec60f4884bda970a80566a231b3d643fe6e20f98eab12b922cd562
594125af32f2eef58d2f28e683234f0468fcf598325447d3fb44200023fd8727
76509aebe9293c495786a25181e4db599e66509e6167bca7261aaaca15be9eba
bd6c81db63a9124eac14c60ef70c9d5862f8535a29dfc24771d75137d2ee62e3
1bf1458eb0675ce912bd2c1ca090297a9d768f227517771dd241bf6aa1b9739c
92c4da5017088f27d0f1f90cb3a38b4ef2e3862070c4b8712755bcaebf0f861c
d029322038c8169c958782aa3f4a383a03d14b7b0307175e7d0f6e99a2710389
a76df7e5ba1dc15cd78938fe5d95eb66c513191a43ad8820a917c5874e707b0d
89695d227b200fa60afb397980b5748614547d7ebdd6e2a399d2c4d77772ea3b
083ee7fb83a7e5e7b258cd5635a9b04f96d7595ee5b5c2247a010823ca745257
d2fa8801dc29280b0d0ff0387e30c50b0aba9c5267b9dc01f76fccefa2374660
edb2a0e143f2c81926ed64ab15c9270e6fb8d9760590d91cda50d97f42af5afd
7a28b3c12e706481ce2358135283134c521c86345f5c4fd70557d9fdf0700ac1
c7155de140f6c99b71a9fabd0bd04848ce202e7701d7087dd667c89208c9487c
44b5a018344431683d4051904ff5b6804151fbf32bddf46d8feecf91e9e5bc47
6b3ad04f96df9c5844532aeaf72cf02cc52ab6afcda5827664e6483efe4262c3
884086e462d6bfa9a5b38ef2c9812ffebf208c3054f3bae787bcdcafac6cb6d0
1972ac3663fd81c7186a48e0b33c50980fd6ad077c8d88b3ca67aabb164f33d4
759e93a815fa0525d9fb67eddd78fee4e25dc1575981f9559adb5ba7dcb67941
99330a562c4dd46c9c3a47f903261f16e9ebf7b2405b05552429effb0109c201
97bafbb66218a11b17694e0363e30a9b25ee0347c297c6afd09993c21514c7ba
97bf50cfb413f7caf135a27f4a77b34810f9eaa53c61b39ad2ddcf8bd2d5c52d
2f9ec9613033ee6bd5d4f141ed37d779395cc984deb30c5e969a07a30e

Response (81 octets):

0051020000019a12e6a81bb24fe0f2a377f9e7c002fd3fbf478d2360fe3e2868
a9f19f89d0af17968ff5f0d977154c35cd89289901a991bc04aa0d8b44fc5cd8
494e64d489f8506db236fd2fc3b38296ed

SSPeer (32 octets):

a546306d5a7460c2dd602e4094a84b217e10fe67ad14739af4e13cb99356989f

CS1 (48 octets):

34cd55c6068e6495720c0508269a699063f74baabedde10316b31066fbc7f168
95627f3e0b9b235347df83ebe875ce1b

D.18. Exporter

Section 8.6 with the label and context given: the session scope from D.4's session_root, the lineage scope from D.4's lineage_secret(0) with an empty context; 32 octets each.

Label (13 octets):

6578616d706c65206c6162656c

Context (15 octets):

6578616d706c6520636f6e74657874

Session (32 octets):

3f748c45cb8c82119a79cf4f72d55b4af189b50ed7cacb02359cb4f1c0dfba58

Lineage (32 octets):

9034e736fa95b9f6a2ef6faf9442f4a70a568dd297c2ca06ec11542fb63ec6c0

D.19. Prekey Regeneration

nek_seed of Section 8.7 from a local_secret, D.4's session identifier and a version, and the prekey generated from it.

LocalSecret (32 octets):

5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a

SessionID (16 octets):

3a97c10ae35ec7097a267e56dc73fa2b

Version: 7

Seed (64 octets):

f3fdcd67b5a7498652a8fe1313925d1b5b028fbb63c72d72a3aff861668d3334
0f822909b539bf0b95174c03c6f0a601bdcfec98225cb0ae2e74d6f4359f1471

NEK (1568 octets):

4ee212b420698f37ad3c78cc90029958d5a187da17c2c442d4d5136125baec47
c725ab1f117a4a9e429c0f138c5491bcf028234d6654c0b1cc7159091a738ba4
77a1a3615626076d8f4bb1642677b2e3208d24a6aca0b9aa924612ba541fa15a
9d27a63949118d0347e921091229cbea4189829194e1d67343aa69ada9098ed6
1a89b9cdcdf168fc718fc8b54967f5c54be366b2d99056493a6a6c1ec8baab0b
9066a756c37fe92789141df3439239e967e9d15bad62c991d0229f05afdcd297
3056a52fc63109f77e1a8c33dbb98613f783a5e59d6f16024af2cf7297afd2f9
3a6cc05d063b6324bb5d55a86f60e11f7e82307b48495c2a03c5bbbcef7a5f31
4baecfe9c3b4138840b28e29fc24b2f48cc230c75ca4c70d5a31d8b60760a96b
f0a70fdf66cadee69715c511daf76b4ac589aa1840c7a721a863b204b21819e5
46e0db4fabbc4748431e3345b277330b27e33f2d2750c6ba5af6718e9a5b38fa
920ae6932a0008bafe4a3ea21c2691e43f80520eb172144e0c37755b731f3b13
9faa6f46345e129582c7aa219e9004eddba40a7b42af02a9b8b2a0f30450fc26
0592a19f73a09a64da3bf9e82a240513d9c30227813eaeec3951eb362c27736a
0c40fc9086a9c1020aeaa765830a2fecad2997266f37a2ecc60f02cb3668b41a
7333168ed67d9de998669c80f7e27fb9a533e9f513b23b94cc48b757443fe546
242a276cd1db0fce958725570b99b41e2328c463b741ec025ba225004071b9ab
82cac46977af928cbd57b2bd11583313cf02e761d7037be0dacefa036946e554
3c33c6bdea251ee050714423f1ba8c514987ad66953c47903b3b0a65102f3e65
b0fcbc087703a6d4a1bf36899f35d57de2659723f5af7b3b9804151a0bd66992
9334cb5c5c5d53186a8664eb7951c326a786e41ff25433b4b581884579c97718
9167921f15b070dc30eeb6440775344a637b50714a8f8488daf65017717eeb02
6ee5310490d4b13034501c4b92e21b58d1d11a9c6656bda66300c09a335a6cb1
5239c1fa8a01a28c0c991097c4a8a6a48f6357b44c6b230cd5af7e067dee844f
40f64932aa9ff0677e89ea9d1647578f190e9c144354698956c53888f4c9a272
786cb946b5e54d0d2787aac347a8e338409a6a277a70540750794aaca6e05181
ea049b10c9261225063c473bec286c880e4e442f83546127505de37a7cee12a1
b53287483b77e937b2e8126e158c101f6bae7096c08ad8b1a9aaa32e1016e965
9b7da6c7724b46ec4378fdc1485740bdf5b216519661e907991d91bc398b7640
d80961bb7785ac9221b90c5808c470579473b1b152721c6cdc70585bbfb93436
ef967457a92ec1233b989997ba180333710d316c562948ae95dcb46299661b0a
93ce10a7b04ace98138b8607b4a2d8c18c37bda04664e9c7319b199e0160b4b1
6279866b333f3b7b132344e22b51d05184af349e59949eb3b7956bb0518312c4
6009320c09a2745151de3cad6dc476a4728259a608b52122e3c815b8463c8054
89d00226b4b2b63954614be843d0456a46fc7cf4c7c3f3486b59160cd9031f55
7c202db37e3f013387c19e230a5673b595f3598e0812809c0094bb294c2878c5
ae152228186cb2102b0c407d1afc0ea66a4206113daf49b75964af51e8c932ab
073e95a2eed82c17cb6176478fe4729f9281c586954df358341acb911edb504f
c40752649bb93744b5a99b66441978264866ab59012c4704405367a91e6c148b
11b6c393cc7a5c766b544634a0b04b37887b29104c0b7301e938b8aaa6c5651c
2638610edac17a0c061f3b33b3a21940adb96a1f9a3c07758e9e97addf179ffe
41b9a3a414aee847a8e6090cb1251fb65669402e3159c917340ac775088235bd
23ac1b9e8ccee31b7fab83ab5b11528be18010f709b9d6b7a6b59c3879a925a3
9812b8c233a40f1de8aea5490771f5a932e22b4960b1dd8aa70d0407bc963aeb
621d14bb9e9d549c00222e84d977dba756a96a75d441315507c0adaa1fe1ac0b
f00ab2fa207163406c533b043c40ccf41b3c3796bcab96b757157b81d416e9c2
8d5ab665fa4b191f70c2feb5161d180f681b2cabd38f9be10f82363c4a4660ec
099d4bd8cd8e7c6cc5437c5ce038cf365988960ce168b71cf5c2285871024a08
083e0040a12527e53cce261dc21c02966aadd48f312284219247fe8dda30e513

D.20. Implicit Rejection

The D.4 request's ct_peer with its first octet changed, decapsulated under the D.4 responder's key: [FIPS203] returns J(z || c), which no vector above reaches.

Ciphertext (1568 octets):

708feeeb928fdcdf0ed7e0f20a640a9cef52d36a70722354d0183ed6b3e29d25
9b227b9cf38fb6f603d42cce8801d0d60bb67f176af11eb0c9ebfc12a479d087
69b9825bac2ff709366ed71c8a83c59ed6566652cb35ef052adb01007d773eaa
98bdbaa1d695a1bbc190b2d5b05cc541a38da255520f2ecb6a9b77822bdfc2b8
0a52aaba6c0f3ec38b26c47be41801de9e09e691aa256ce8e7fb0396300f949c
55c91be09b03a5ac431a230f0c950d3f5b4e01922e6140c0d672c92b052499a3
e283fcdac3e9aedb53e8251ef93f72c1dfb09adfaf9827a75b7d2bd8a29e9f49
9c76002b903987195f2f69c3ce945d3e1d574099fc6a84c555e244896ed6fd45
5f9d8c041f781a22390430c80ec661e60cfd4a6d3330c028c4a0ccda47ced566
f0255294e659b732cd5eabcafa3fd04e730f2ddc12116eaed501195f3dcc97ad
a5d3d0fa32aeac41f4256873f3923216b7fa00ef94a0eb24b357dacecd09e9fb
f7c33bbde8a83b531f50dd43a02cd7831e7f11a0d6bf05895cb2737df1343fc6
1f6354cc23d837e7c4b7e0b5af3164785dec26b31ec69f14617d76eb7bf4f773
25692b52149bb2a87db6a6d2b97aa927395a1283900a4241354c980e089dbe9f
50066b17bbfd39415693d621d4d3ef8ee85c2d5b19b1e17bc404da6d57025d99
58a268abaa1adcf197b7e1519b23055c676efaddac9bc1fdb7f67d8f12ca7278
1db9fbdd918ff22288b93ac2584d4103a564cc957e92eabbf0342ad89e15c9b4
fa7647f5517398f25f4fd4cf762c12405e2510bc508883e4294cd045e1bb4031
8f16ca660b4f9d4cd087fec1f7edcfe598bbc3bceb0cefdc65f0aa8373305af7
7b6c6746272022df06daba91449b7e3a46f646c74fe7d55803bfc065de3007b8
57431d2e3b059976eda9c5b1bfbd9ac5ba6501026ed7db6508c08773ac0cb85b
e1e21bb88dbdd05f423352237a4d4c372cf3fa96219dabfc0a068036d73de49d
1ebec5b8586c57084a66e25bde34f65a6101f88e265b4a73a1d9b78ea152cc64
123bccf05e3d01eb07a9fb0706392592959901a021bc5470d68fbac24a71db2c
0f5facb94955ec38b7531219923cae7c2382ed3dd896908762fa8207c270f3a5
15b528f3ea2419cb4a325df289ac58dc98cb4db5803601ceff975fe614000ade
64738feeb51894a9e38f72a03e4ca7773e59d0fb567d74fabafd8bb661f9934a
55c08846e9317a5b3cc7d70200a691538d6b1d016c0f2e64199dea83475152ce
500c283485790e944ab103cea373988337f7986c22e46d3b2b29a9497b67c386
e7c28b2d30e8d31ebcba559fc42fedecb9277da498f46bd67d33a8ea6162caa8
8d48bcdd7cacc2b15c9d1501479f230f283736bfba5ae06c7ac96447ae127ff6
f6de093b9d3cb7ebfd671852f2779e098c2f55011531f8b6b530ee231bbc7b67
40a0868ec8732027f75efead0f7690250e930e9a6ece8b5a191626da3267a233
00ace60c8f10bec7a2317dccae9186a1caa3bc9ea77b22b92c56d5d2282a5464
752e93ef17890436dfbd1a173dd62cfa985743dcbc63b987ca1917d12bb0223a
4908566077c5e8b0eaf18655b0b43a04582b823b5bbfeaba3fe3ca76e861826a
d2658997d65709113bcf676c5a3d691f470b00ca7e45795d5a973974517ea45f
c4bca296967d76e9bebeb786cf3229df80b2a7da9290d77e2123942fe65dfcdc
497b3febdf82b374a59eb26ab04d3012f6d51f49fb740d6b5d8d3a37de99044d
39b09c2acd08e990aaf3a5f566871366ee5e281007f0dd72f4bdcaf30c4bca51
72260a4b8635c05186adb915b83ee1848d9e6d4f46f93435d1006bd7fd8f9ebe
7519fd0c1bcd188f244845dfd85e1c7c3539445bcb96859030bf8df47ccb66e8
0a5f4b408f3f5c4e12669a432b083da26e9d204cf4d70c7da4b7b9296a139dbb
965c2164b2528709096a5e6012c57dbbcf079a1716350743ca567fccd7d6edf8
57947d10e97c5d7a6d46be4e046adee218a6beeaa1f0b2694475a52565dab5f4
ce49dd856dadc4c0eeb597634fa49e04b543c91a94746971469cafa0f76d0c6b
4fcf0014c68d0ed6362e7c6caccd43cd73f98c71d8a22b7fa5b64e728e7747cd
f812ad2f5dbb78a4742bd0955f9509678a2a8b93eff154cfc781df05a0041108
92a829bfb3e78d84916c8e79a141a42e5396532938895991eb028dcd99ac2b6c

SharedSecret (32 octets):

073c2edbfef18e69d82c696381090a9bac5e90070b0451c50ac71e21ef59afab

D.21. Protected Packet of a Later Lineage

A packet of the initiator under lineage 1 of D.5, epoch 1.0, sequence 0, stream 1, on the identifier of index 0 with D.4's responder prefix.

EpochID: 65536

Seq: 0

StreamID: 1

Payload (9 octets):

6c696e656167652031

Datagram (53 octets):

51501400cdef97f8d04698a553b187df97acbe899e74d0cd6313c51ac80f8808
ce37a5f66a554cb6fbff7b535d40c82a2adf60c16a

Appendix E. Wire Formats (Informative)

This appendix collects in one place the layout of every structure PQST puts on the wire. It is generated from the sections that define them, which are normative; each entry names its section. Lengths L_ek and L_ct are those of the suite (Section 6.1), 1568 octets each in suite 0x0001; every other length is the same in every suite. Fields are big-endian, lengths in parentheses are in octets, [...] is an optional field and (*) a field whose length another field gives (Section 7).

E.1. Packets

Common header (Section 10.1):

CommonHeader = magic version type routing_key

magic       = 2OCTET     ; 0x5150
version     = OCTET      ; 0x14
type        = OCTET      ; packet type and reserved bits
                         ; (Section 10.1.1)
routing_key = 8OCTET     ; type-dependent (Section 10.1.2)

Type octet (Section 10.1.1):

bits 0-1   packet_type   0 = PROTECTED, 1 = HANDSHAKE, 2 = RECOVERY,
                         3 = reserved for the cohort layer's
                         group packet (Section 26); defined only
                         by an extension enabled by capability
                         bit 0 (Section 21.1)
bits 2-7   reserved      must be 0

Protected packet (Section 10.2):

ProtectedPacket = CommonHeader masked_block ciphertext tag

masked_block = 16OCTET     ; PacketNumberBlock XOR mask
                           ; (Section 10.3)
ciphertext   = *OCTET      ; AEAD output over the plaintext
                           ; (Section 10.2.2)
tag          = 16OCTET     ; AEAD authentication tag

Packet number block (Section 10.2.1):

PacketNumberBlock = epoch_id seq stream_id pflags padding_len

epoch_id    = 4OCTET     ; lineage_gen (16 bits) || epoch_index (16
                         ; bits); Section 12.2
seq         = 8OCTET     ; sequence number within (direction,
                         ; epoch_id); Section 12.3
stream_id   = OCTET      ; 0x00-0xDF application-defined; 0xE0-0xFD
                         ; reserved for protocol-defined upper layers
                         ; (Section 25); 0xFE = STREAM_CONTROL
                         ; (Section 10.5); 0xFF = STREAM_DUMMY
pflags      = OCTET      ; reserved; must be 0
padding_len = 2OCTET     ; number of padding octets at the end of the
                         ; plaintext

Size constraints (Section 10.2.3):

MIN_PACKET_SIZE   = 12 + 16 + 16 = 44 octets
                    ; a protected packet with an empty payload
INITIAL_PATH_MTU  = 1200 octets
                    ; a sender's bound on a path until probing
                    ; raises it
MAX_PAYLOAD(path) = path_mtu - 44 - padding_len

Handshake and recovery packets (Section 10.4):

MessagePacket = CommonHeader message_header fragment

message_header = msg_type frag_index frag_count msg_id
                 ; 5 octets
msg_type       = OCTET      ; message type; values in Sections 9
                            ; and 16
frag_index     = OCTET      ; 0-based index of a source fragment; the
                            ; value frag_count denotes the parity
                            ; fragment
frag_count     = OCTET      ; number of source fragments of the
                            ; message, at least 1
msg_id         = 2OCTET     ; identifies the message among those the
                            ; sender has in flight on this routing
                            ; key; the same in every fragment and in
                            ; every retransmission of the message
fragment       = *OCTET     ; at most frag_size octets

Fragment size (Section 10.4):

MAX_FRAGMENT = 1183 octets      ; so that a message packet, 12 + 5 +
                                ; 1183, is at most 1200 octets
MIN_FRAGMENT = 512 octets

Control frame framing (Section 10.5):

ControlFrame = ctrl_type length ctrl_data

ctrl_type = OCTET
length    = 2OCTET     ; length of ctrl_data in octets
ctrl_data = *OCTET

E.2. Anchor Messages

Message types (Section 9.2):

msg_type 0x01  AnchorRequest
msg_type 0x02  AnchorResponse

Request (Section 9.2.1):

AnchorRequest = msg_len form flags target_gen nonce form_fields
                [sealed_req tag]

msg_len     = 2OCTET     ; octets in the message, including msg_len
form        = OCTET      ; Section 9.1
flags       = OCTET      ; bit 0: prove_peer (ct_peer present); bit
                         ; 1: offer_proof (the requester asks to be
                         ; proved: the responder should set
                         ; prove_req); bits 2-7 reserved, must be 0
target_gen  = 2OCTET     ; generation this exchange creates; 0 in
                         ; FRESH and DISCOVER
nonce       = 32OCTET    ; fresh randomness

Request fields by form (Section 9.2.1):

FRESH:          rk_hint(1) preauth_len(1) preauth(0|16) prior_len(1)
                prior(0|48) ek(L_ek) ct_peer(L_ct)
CONTINUE:       record_len(2) record(0..472) ek(L_ek) [ct_peer(L_ct)
                if prove_peer] [proof_pad(L_ct) if offer_proof and
                not prove_peer]
CONTINUE_0RTT:  record_len(2) record(0..472) nek_version(4)
                ct_n(L_ct) [ct_peer(L_ct) if prove_peer]
DISCOVER:       ek(L_ek) pad(L_ek + 16)

Sealed part of a request (Section 9.2.1):

FRESH:            id_type(1) identity(48|L_ek) init_counter(8)
                  capabilities(2) prefix_len(1) prefix(0..2)
                  hint_len(1) authz_hint(0..64) objects_len(2)
                  objects(*)
CONTINUE forms:   attempt(2) objects_len(2) objects(*)
DISCOVER:         no sealed part and no tag

Response (Section 9.2.2):

AnchorResponse = msg_len form flags target_gen nonce_r form_fields
                 sealed_resp tag

form        = OCTET      ; the request's form, or 4 = RETRY, or 5 =
                         ; CLOSED (Section 19.6)
flags       = OCTET      ; bit 1: prove_req (ct_req present); bits 0,
                         ; 2-7 reserved, must be 0
target_gen  = 2OCTET     ; echoes the request
nonce_r     = 32OCTET    ; random, chosen by the responder for each
                         ; response

Response fields by form (Section 9.2.2):

FRESH:          ct_e(L_ct) ct_req(L_ct)   ; prove_req must be 1
CONTINUE:       ct_e(L_ct) [ct_req(L_ct) if prove_req]
CONTINUE_0RTT:  (none)                    ; prove_req must be 0
DISCOVER:       ct_e(L_ct)
RETRY, CLOSED:  (none)

Sealed part of a response (Section 9.2.2):

FRESH:            capabilities(2) prefix_len(1) prefix(0..2)
                  objects_len(2) objects(*)
CONTINUE forms:   objects_len(2) objects(*)
DISCOVER:         peer_pk(L_ek)
RETRY, CLOSED:    reason(1) detail(1)

E.3. Control Frames

PROBE and PROBE_ACK (Section 19.2):

PROBE     = path_id(1) data(8)      ; data is fresh randomness from a
                                    ; cryptographically secure source
PROBE_ACK = path_id(1) data(8)      ; both fields echoed

OBJECT and OBJECT_ACK (Section 19.3.2):

OBJECT     = kind(1) version(4) total_len(2) offset(2) data(*)
OBJECT_ACK = kind(1) version(4)

SUSPEND (Section 19.5):

SUSPEND = expected(2)     ; seconds the sender expects to be
                          ; unreachable; 0 = unknown

CLOSE (Section 19.6):

CLOSE = reason(1)         ; Section 20

E.4. Objects

Object encoding (Section 19.3.1):

ObjectHeader = kind(1) version(4)
Object       = ObjectHeader body_len(2) body(*)
               ; the form used inside anchor messages (Section 9.2)

version      = lineage_gen(16) || counter(16)

Object kinds (Section 19.4):

  • 0x01. Name: NEXT_EK; Issuer: either; Body: nek(L_ek); Bound: L_ek (1,568 in suite 0x0001); Persisted by holder: yes

  • 0x02. Name: AUTHZ; Issuer: either; Body: ttl(4) ref_len(1) ref(0..255); Bound: 260; Persisted by holder: yes, as Section 16.6 states

  • 0x03. Name: RECORD; Issuer: a responder that issues sealed records; Body: opaque; Bound: 472; Persisted by holder: yes

  • 0x04. Name: INNER_ADDR; Issuer: either, if capability bit 1; Body: Section 19.4.4; Bound: 512; Persisted by holder: yes

  • 0x05. Name: CERT; Issuer: either; Body: cert_type(1) certificate(*); Bound: 16,384; Persisted by holder: no

  • 0x06. Name: SUPERSEDE; Issuer: the requester of a recovery FRESH (Section 16.7); Body: session_id(16); Bound: 16; Persisted by holder: no; applied at confirmation

  • 0x10-0x1F. Name: reserved for the cohort layer (Section 26), delivered to the layer above; Bound: 16,384 (MAX_OBJECT); Persisted by holder: neither the version nor the body, at this layer; the cohort layer persists what it needs (Section 19.3.4)

  • 0x80-0xBF. Name: reserved for protocol-defined upper layers (Section 25)

  • 0xC0-0xFF. Name: private use

INNER_ADDR body (Section 19.4.4):

INNER_ADDR = count(1) *( family(1) address(4|16) prefix_len(1)
             lifetime(4) )
family     = 4 (IPv4, 4-octet address) | 6 (IPv6, 16-octet address)
lifetime   = seconds from first receipt of this version; 0xFFFFFFFF =
             until revoked

E.5. Binding Statement

Binding statement (Appendix A):

BindingStatement = version kem_pk subject_len subject issuer_id
                   not_before not_after ext_len ext signature

version     = OCTET       ; 0x01
kem_pk      = L_ek octets ; the encapsulation key being certified
                          ; (Section 6.1; 1568 in suite 0x0001)
subject_len = OCTET
subject     = *OCTET      ; opaque to PQST: a device name, a serial
                          ; number, a role; at most 255 octets
issuer_id   = 48OCTET     ; SHA-384 of the issuer's ML-DSA-87 public
                          ; key
not_before  = 8OCTET      ; seconds since 1970-01-01T00:00:00Z
not_after   = 8OCTET      ; seconds since 1970-01-01T00:00:00Z;
                          ; 0xFFFFFFFFFFFFFFFF = no expiry
ext_len     = 2OCTET
ext         = *OCTET      ; extension entries as Section 21.4, for
                          ; the issuer's own use
signature   = 4627OCTET   ; ML-DSA-87 signature

E.6. Fixed Sizes

Table 28
Quantity Octets Where
common header 12 Section 10.1
packet number block 16 Section 10.2.1
AEAD tag 16 Section 6.1
smallest protected packet 44 Section 10.2.3
largest fragment, MAX_FRAGMENT 1183 Section 10.4
largest anchor message, MAX_MESSAGE 8192 Section 9.4
largest object, MAX_OBJECT 16384 Section 19.3.2
largest sealed record 472 Section 16.6.3
identity fingerprint 48 Section 6.1
L_ek, L_ct in suite 0x0001 1568, 1568 Section 6.1

Appendix F. Parameters and Their Relations (Informative)

Every parameter this document defines, with its default, where it is defined, and the relations between parameters that the text relies on. The relations are stated so that a deployment that changes a default sees what else it must change; each is implied by the section cited and adds nothing to it.

F.1. The Parameters

Table 29
Parameter Default Where
T_idle 15 s Section 15 (its table), Section 15.6
k_probe 3 Section 15 (its table), Section 15.6
probe interval max(2 x srtt, 1 s), doubling to probe_max 8 s, floored by the exchange floor Section 15 (its table), Section 15.3 and Section 16.7
path_retire 60 s Section 15 (its table)
validated_ttl 5 min Section 15 (its table), Section 15.3
mtu_reprobe 10 min Section 15 (its table), Section 15.5
initial_path_mtu 1,200 octets (INITIAL_PATH_MTU); not below 576 Section 10.2.3, Section 15.5
max_paths 8 Section 15 (its table), Section 15.7
identifier window k 8 Section 15.1
budget_ttl, max_budgets validated_ttl; 65,536 Section 15.4
retransmission interval of an anchor request 1 s, or twice the smoothed round trip or the exchange floor when longer, doubling to 16 s Section 9.4
FRESH and DISCOVER transmissions 5 Section 9.4
half-open FRESH or DISCOVER exchanges per source address; per claimed requester identity; in all 4; 4; an implementation parameter Section 9.4.1
incomplete recovery messages per recovery identifier; in all 4; an implementation parameter, sized to the sessions served Section 9.4.2
anchor_timeout 30 s Section 16.1 (its table), Section 9.4 and Section 16.4
reply_cache_ttl 120 s Section 16.1 (its table), Section 9.4 and Section 16.4
recover_schedule 1, 2, 4, 8, 16 s Section 16.1 (its table), Section 16.7
recover_hold 60 s Section 16.1 (its table), Section 16.7
dormant_retry 60 s, doubling to 1 h Section 16.1 (its table), Section 16.7
max_dormancy 24 h Section 16.1 (its table), Section 16.7
reanchor_interval 1 h Section 16.1 (its table), Section 16.8
lineage_grace 2 x srtt, at least 1 s Section 16.1 (its table), Section 16.4
reproof_after_dormancy, max_reproof_interval 1 h, 24 h Section 16.1 (its table), Section 16.3.3
reproof_after_restart off Section 16.1 (its table), Section 16.3.3
tombstone_ttl max_dormancy + reanchor_interval Section 16.1 (its table), Section 16.6.3 and Section 19.6
record key rotation no less often than max_dormancy Section 16.6.3
replay window W and its forward bound 4096; the bound of Section 13 Section 13
epoch overlap at a receiver bounded by time or packets, as Section 14.4 recommends Section 14.4
authorization delivery bound delta (authz_delivery_bound), renewal point 5 s, half-life Section 17.3
SUSPEND and CLOSE repetitions 3, 1 s apart Section 19.5 and Section 19.6
violation threshold (violation_limit in violation_window) 10 in 60 s (recommended) Section 20.3

F.2. Relations the Text Relies On

Table 30
Relation Why Where
T_idle + k_probe probe intervals < recover_schedule's total (31 s) + recover_hold the endpoint that detects the loss by its own liveness, later than its peer, still finds the peer RECOVERING with its generation kept, so that the two recover by CONTINUE and a FRESH that supersedes stays uncommon Section 16.10
an armed generation lives exactly as long as its cached answer anchor_timeout for a CONTINUE, reply_cache_ttl for a CONTINUE_0RTT, whose kept attempt may be retransmitted long after the first answer; both are renewed by a retransmission the cache answers Section 16.4
a CONTINUE attempt lives anchor_timeout from its first transmission, across pauses and restarts, the record stating the time, so that it never outlives the generation its request created at the responder anchor_timeout; a kept CONTINUE_0RTT attempt is unbounded, its generation's expiry covered by the reservation of Section 16.4 Section 16.4, Section 16.6.2 and Section 16.7
recover_hold >= the hint's probe wait (at most the probe interval) a path that returns within the hold is validated by a probe before the session goes DORMANT Section 16.7
dormant_retry's cap (1 h) < max_dormancy a DORMANT session retries, doubling to the cap, before max_dormancy closes it Section 16.7
max_reproof_interval > reanchor_interval the proof is sought one interval before the deadline, so a scheduled exchange carries it before the deadline in ordinary operation Section 16.3.3
reproof_after_dormancy <= max_reproof_interval a peer silent past the dormancy threshold is proved before the deadline can pass Section 16.3.3
tombstone_ttl >= max_dormancy + reanchor_interval, the record lifetime a peer that is DORMANT for the longest allowed, then re-anchors, still meets the tombstone of a session closed meanwhile Section 16.6.3 and Section 19.6
record key rotation period <= max_dormancy, the previous key kept for the record lifetime, max_dormancy + reanchor_interval a sealed record issued under the previous key opens for as long as the session it names may be DORMANT and then re-anchor Section 16.6.3
lineage_grace >= 2 x srtt packets of the retired lineage in flight at the commit are still delivered Section 16.4
the forward bound < the epoch's packet limit a receiver's window never admits a sequence number the sender could not have used in the epoch Section 13
delta >= the delivery delay of a renewal the grantee's copy does not expire before a renewal sent at half-life arrives Section 17.3

Author's Address

Clayton Henry