Network Working Group H. Jorgen
Internet-Draft Kenosian
Intended status: Experimental 22 September 2026
Expires: 21 February 2027
The TLS TimeToken Secure Protocol (TTTPS)
draft-helmprotocol-tttps-11
Abstract
This document specifies TTTPS, an application-layer protocol for
evaluating temporal evidence before an application accepts an event or
performs a related state transition. The protocol defines a fixed
180-byte Proof-of-Time Record v2 containing context, freshness,
integrity, issuer-authentication, and holder-authentication fields.
When TLS 1.3 transport binding is selected, a separate holder binding
proof is derived from TLS exporter output and holder key material.
The proof is sent with, but is not part of, the 180-byte record.
The fixed-record GRG admission path is bounded with respect to peer
count under declared frame and correction limits.
TTTPS returns an explicit admission result before application state
mutation. Confidence and propagation-aware profiles are optional.
This document does not define agent intent, audit record schemas, or
transparency-log operation.
Discussion Note
This document is prepared for discussion in the AUDIT BOF and related
IETF venues. Comments should be directed through the venue selected by
the responsible IETF process.
Changes from -10:
* Clarified the 180-octet v2 layout and removed the overlapping
reserved field.
* Added issuer trust-anchor and certificate resolution before issuer
signature verification.
* Kept confidence and propagation processing outside the core wire and
cryptographic verification path.
* Clarified the separate TLS exporter binding proof and the scope of
the bounded single-record processing claim.
* Limited this revision to the core protocol; profile mathematics and
physical-context algorithms belong in companion drafts.
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 21 February 2027.
Jorgen Expires 21 February 2027 [Page 3]
Internet-Draft TTTPS September 2026
Copyright Notice
Copyright (c) 2026 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights
and restrictions with respect to this document.
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.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 6
1.1. Motivation . . . . . . . . . . . . . . . 7
1.2. Objectives . . . . . . . . . . . . . . . . . . . . . . . 7
1.3. Protocol Overview . . . . . . . . . . . . . . . . . . . . 8
1.4. Scope . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5. Terminology . . . . . . . . . . . . . . . . . . . . . . . 9
1.6. Use Cases . . . . . . . . . . . . . . . . . . . . . . . . 11
1.6.1. Financial Infrastructure Timestamping . . . . . . . . 11
1.6.2. AI Agent Networks . . . . . . . . . . . . . . . . . . 11
1.6.3. Operational Requirements Summary . . . . . . . . . . 11
1.7. Problem Statement . . . . . . . . . . . . . . . . . . . . 12
2. Proof-of-Time Structure . . . . . . . . . . . . . . . . . . . 14
2.1. PoT Record v2 Wire Format . . . . . . . . . . . . . . . . 14
2.2. Field Definitions . . . . . . . . . . . . . . . . . . . . 15
2.3. Holder Authentication Types . . . . . . . . . . . . . . . 17
2.4. Generation Algorithm . . . . . . . . . . . . . . . . . . 17
2.5. Verification Procedure . . . . . . . . . . . . . . . . . 18
2.6. JOSE and COSE Data Representations . . . . . . . . . . . 19
2.6.1. COSE / CBOR Data Model (CWT Mapping) . . . . . . . . 19
2.6.2. JOSE / JSON Data Model (JWS Mapping) . . . . . . . . 19
3. Gap Analysis vs Existing Timestamping Standards . . . . . . . 20
4. Integrity Algorithm Interface . . . . . . . . . . . . . . . . 21
4.1. Abstract Interface . . . . . . . . . . . . . . . . . . . 21
4.2. Optional Integrity Profiles . . . . . . . . . . . . . . .
22
4.3. External GRG Interface
The core does not define the internal construction, stage ordering,
parameters, correction capacity, or transport framing of an optional
GRG profile. A selected profile MUST be identified by an authenticated
context and MUST declare its protected byte domain, decoder limits, and
intact/resolved/unresolvable result contract.
The core MUST process an unresolvable result as an integrity failure.
A later freshness, issuer, holder, or policy result MUST NOT promote it
to valid. The Confidence document is the companion specification for
GRG-specific processing; this core document makes no IPR determination.
5.1. State Machine . . . . . . . . . . . . . . . . . . . . . . 22
5.2. Transition Conditions and Hysteresis . . . . . . . . . . 22
5.3. Penalty and Exponential Backoff . . . . . . . . . . . . . 23
5.4. Policy Thresholds
5.5. External Policy and Profile Inputs
5.6. GRG Physical Framing Boundary
1. Introduction
TTTPS defines an application-layer protocol for evaluating temporal
evidence before an application accepts an event or performs a related
state transition. It is intended for records exchanged by agents,
services, and other distributed principals.
TLS provides peer authentication, confidentiality, and channel
integrity. DNSSEC provides origin authentication and integrity for DNS
data. Neither protocol, by itself, provides the temporal admission
function defined here. TTTPS does not replace TLS, DNSSEC, RATS, WIMSE,
OAuth, AUDIT, or SCITT.
1.1. Motivation
An authenticated event may still be stale, replayed, or bound to the
wrong context. If an event changes application state before those
conditions are evaluated, a later audit record cannot undo the state
transition. TTTPS places the temporal decision before that transition.
1.2. Objectives
TTTPS has four objectives:
* bind a temporal record to an issuer, context, nonce, and holder
session;
* reject invalid, replayed, or stale records before application
ingestion;
* return explicit ACCEPT, HOLD, UNVERIFIABLE, or REJECT outcomes; and
* support a fixed-record GRG path whose verification cost is O(1) with
respect to peer count when frame, correction, and memory limits are
fixed.
The last property applies to the bounded single-record path. It does
not make quorum aggregation, queue selection, entropy analysis, or
transparency logging O(1).
1.3. Protocol Overview
A sender obtains an issuer-signed PoT Record. When transport binding
is enabled, the holder produces a separate binding proof after the TLS
handshake. The receiver parses the fixed 180-octet record, verifies
integrity and context, checks replay and freshness, verifies the issuer
signature and holder proof, and only then invokes application policy.
The admission result precedes application state mutation.
Over TLS 1.3 or QUIC, the binding uses the TLS exporter after the
handshake reaches the application-data state. Over other transports,
the deployment MUST define an equivalent binding or explicitly disable
that part of the protocol.
1.4. Scope
The core specification defines the 180-octet PoT Record, its integrity
boundary, issuer and holder authentication, transport binding, freshness
checks, and admission states. Confidence and Deep-space processing are
optional profiles. The core does not define agent intent, an audit
record schema, a transparency log, or a particular time-source vendor.
1.5. Terminology
Issuer: the authority that creates and signs a PoT Record.
Holder: the principal that proves possession of the holder key or shared
secret and binds the record to the transport session.
Verifier: the party that evaluates a record and returns an admission
result.
PoT Record: the fixed 180-octet protocol record described in Section 2.
Context manifest: authenticated out-of-band data identified by ctx_id.
1.6. Use Cases
TTTPS can be used before an agent action, service request, or delegated
interaction is admitted to an application state machine. In an AUDIT
deployment, the admission result can be carried into an interaction,
action, or delegation record. In a SCITT deployment, the result and
record digest can be logged after the local admission decision. These
mappings do not change the TTTPS wire record.
1.7. Problem Statement
Existing authentication and transparency mechanisms do not by themselves
answer whether an event is fresh and context-valid at the instant it is
admitted. TTTPS addresses that pre-ingestion gap. It does not claim
that a valid temporal record proves agent intent, physical truth, or the
absence of a compromised trust authority.
2. Proof-of-Time Structure
This section specifies the fixed 180-octet PoT Record. The record
separates the Issuer's attestation of synthesised time from the
Holder's proof of possession bound to a live TLS session. The
separate binding proof closes the binding weakness identified in
earlier revisions.
2.1. PoT Record v2 Wire Format
A PoT Record is encoded as a fixed 180-octet binary sequence. All
multi-octet integer fields are in network byte order (big-endian).
Offset Length Field
------ ------ -----------------------------------------------
0 1 version (0x02 for this document)
1 1 holder_auth_type (0x01 Ed25519 pk MTI,
0x02 shared secret OPTIONAL)
2 2 alg_id (integrity algorithm, Section 4)
4 8 ts (TAI microseconds since epoch)
12 4 dispersion (microseconds, uncertainty bound)
16 16 ctx_id (opaque context identifier)
32 16 nonce (cryptographically random)
48 32 holder_auth_data (holder public key, or PSK digest)
80 32 integrity_tag (Section 4, algorithm per alg_id)
112 4 issuer_key_id (Issuer signing-key identifier)
116 64 issuer_sig (Ed25519 over octets 0-115)
------ ------
Total: 180 octets
The binding_proof carried alongside the PoT Record at TLS binding
time (Section 6.1) is a separate value, not part of these 180 octets:
it is computed by the Holder from live TLS session material and
cannot be produced at PoT generation time, which is the point of the
separation.
2.2. Field Definitions
version (8 bits):
Protocol version. This document defines version 2 (0x02).
Implementations MUST reject PoT records with unknown versions.
holder_auth_type (8 bits):
Identifies how the Holder proves possession. See Section 2.3.
Implementations MUST reject unknown values.
alg_id (16 bits):
Identifies the integrity algorithm protecting this record
(Section 4). Implementations MUST reject unsupported values.
ts (64 bits):
Synthesised timestamp: ts = median(T_1, ..., T_k), k >= 3 sources
from independent administrative domains. TAI microseconds since
the TAI epoch. TAI, rather than UTC, is used to avoid leap-second
ambiguity in the freshness comparison of Section 2.5. Synthesis
MUST use at least three independent sources from distinct
administrative domains (e.g., a national metrology laboratory, a
GNSS-disciplined source, and an NTS-authenticated source).
dispersion (32 bits):
Synthesis uncertainty bound in microseconds: dispersion = max|T_i
- ts| across the k sources. Used in the freshness check of
Section 2.5.
ctx_id (128 bits):
An opaque, application-assigned context identifier. Binds the PoT
Record to its context; see Section 4.1. A verifier that enables an
optional profile MUST resolve ctx_id against an authenticated context
manifest before selecting a physical or confidence profile. The
manifest MAY select a terrestrial, near-Earth/SAGIN, cislunar, or
deep-space profile. A missing, expired, contradictory, or
unauthorized mapping MUST result in HOLD or UNVERIFIABLE; the verifier
MUST NOT infer deep-space context from packet arrival time or silently
apply a terrestrial default.
The manifest is out of band and is not part of the fixed 180-octet
record. It SHOULD bind the profile identifier, epoch, time scale,
coordinate frame, endpoints, OWLT interval, navigation or ephemeris
authority, uncertainty budget, peer/provenance digest, and policy
revision to ctx_id. This lookup is the automatic profile-dispatch
mechanism and does not change the PoT wire length.
nonce (128 bits):
Cryptographically random value. MUST be generated with a
cryptographically secure random number generator. Provides replay
prevention in conjunction with Section 9.2.
holder_auth_data (256 bits):
For holder_auth_type 0x01: the Holder's Ed25519 public key. For
holder_auth_type 0x02: SHA-256(k_h), a digest of the pre-shared
secret, never the secret itself.
integrity_tag (256 bits):
Output of the algorithm identified by alg_id (Section 4), computed
over octets 0-79 of this record. Detection and correction
semantics
are defined by the selected algorithm profile; the core SHA-256
path
is detection-only.
issuer_key_id (32 bits):
Identifies the Issuer's signing key, enabling key rotation without
requiring verifiers to trial multiple keys.
issuer_sig (512 bits):
Ed25519 signature by the Issuer's private key over
octets 0-115 (all preceding fields), following EUF-CMA security.
Issuer Integrity Property: the Issuer cannot forge a timestamp
without detection. A forged ts' != ts produces a different
integrity_tag', and issuer_sig over the changed record then fails
verification against the published Issuer public key. This is a
mathematical consequence of EUF-CMA security, not a procedural
control. The remaining trust assumption is that the Issuer's private
key is not compromised; this is the same trust model as PKI
(Certificate Authority), applied to time rather than identity.
Issuer misbehaviour is auditable via an append-only commitment log of
published PoT records.
2.3. Holder Authentication Types
0x01 -- Ed25519 public key (Mandatory-to-Implement):
holder_auth_data = holder_pk (32 octets). binding_proof (64
octets) = Ed25519.Sign(holder_sk, binding_input), verifiable by
any party holding holder_pk (Section 6.1).
0x02 -- Shared secret (OPTIONAL):
holder_auth_data = SHA-256(k_h) (32 octets). binding_proof (32
octets) = HMAC-SHA256(k_h, binding_input). This type requires
out-of-band distribution of k_h between Holder and verifier and
MUST NOT be used where verification by an external party that does
not already possess k_h is required.
2.4. Generation Algorithm
1. Query k >= 3 time sources from independent administrative
domains.
2. Compute ts = median(T_1, ..., T_k), in TAI microseconds.
3. Compute dispersion = max|T_i - ts|.
4. If dispersion > stratum_tolerance: ABORT.
5. Generate a 128-bit cryptographically random nonce.
6. Assemble octets 0-79: version, holder_auth_type, alg_id, ts,
dispersion, ctx_id, nonce, holder_auth_data.
7. Compute integrity_tag over octets 0-79 using the algorithm
identified by alg_id (Section 4).
8. Assign issuer_key_id identifying the signing Issuer key.
9. Compute issuer_sig = Ed25519.Sign(issuer_sk, octets 0-115).
10. Output the 180-octet PoT Record v2.
binding_proof is deliberately not computed at generation time: it
requires TLS session material that does not yet exist when the Issuer
generates the record, and is instead computed by the Holder at TLS
binding time (Section 6.1).
2.5. Verification Procedure
Implementations MUST verify a received (binding_proof, PoT Record)
pair in the following order. Reordering this sequence, in particular
performing step 3 later, reintroduces the -06 binding weakness
described in the Discussion Note.
1. Frame length check: the received frame MUST equal
len(binding_proof) + 180 octets, where len(binding_proof) is 64
(holder_auth_type 0x01) or 32 (holder_auth_type 0x02); otherwise
REJECT.
2. Support check: version, alg_id, and holder_auth_type MUST all be
values the verifier supports; otherwise REJECT.
3. Integrity-tag interpretation (single fixed-cost pass): apply the
algorithm profile identified by alg_id to octets 0-79 and compare
against integrity_tag. The result is *intact*, *resolved* only
when the selected profile defines bounded correction and confirms
recovery, or *unresolvable* (REJECT immediately). This check MUST
be performed before freshness, replay, certificate resolution,
signature, or holder-binding checks.
4. Freshness: if |now - ts| > tier_window + dispersion: REJECT.
Trigger FULL mode per Section 5.3.
5. Anti-replay: if the (ctx_id, nonce) pair has been seen before
within the freshness window: REJECT.
6. Issuer trust resolution: resolve issuer_key_id through an
authenticated out-of-band trust bundle or an authenticated
in-band certificate or SVID exchange. The verifier MUST validate
the chain, key usage, validity interval, and configured revocation
or status policy. issuer_key_id is only a selector and MUST NOT
be treated as an unauthenticated trust anchor. Failure yields
UNVERIFIABLE or REJECT according to the trust policy.
7. issuer_sig verification: verify the Ed25519 signature over octets
0-115 against the resolved Issuer public key; otherwise REJECT.
8. binding_proof verification: recompute the expected binding_input
from the live TLS-Exporter output (Section 6.1) and verify
binding_proof against holder_auth_data per holder_auth_type;
otherwise REJECT.
9. Accept.
NOTE: performing integrity-tag interpretation first (step 3) gives
early, fixed-cost rejection of corrupted or foreign-context
submissions before the more expensive signature and binding-proof
checks are attempted.
2.6. JOSE and COSE Data Representations
To facilitate seamless integration with modern identity, attestation,
and cryptographic token frameworks (e.g., JWTs, CWTs, RATS Conceptual
Message Wrappers [I-D.ietf-rats-msg-wrap]), a PoT Record v2 MAY be
represented as either a COSE (CBOR Object Signing and Encryption) map
or a JOSE (JSON Object Signing and Encryption) claim set.
2.6.1. COSE / CBOR Data Model (CWT Mapping)
In CBOR Web Token (CWT) contexts, the PoT Record v2 is represented as
a CBOR Map containing the following integer-keyed claims:
+-------+-------------------+-------------------------------------+
| Claim | Key Name | CBOR Type & Value |
+-------+-------------------+-------------------------------------+
| 1 | ver | unsigned integer (0x02) |
| 2 | auth_type | unsigned integer (0x01 / 0x02) |
| 3 | alg_id | unsigned integer
(core/profile-defined) |
| 4 | ts | unsigned integer (microsecond TAI) |
| 5 | dispersion | unsigned integer (microseconds) |
| 6 | ctx_id | byte string (16 octets) |
| 7 | nonce | byte string (16 octets) |
| 8 | holder_auth_data | byte string (32 octets) |
| 9 | integrity_tag | byte string (32 octets) |
| 10 | issuer_key_id | unsigned integer (32 bits) |
| 11 | issuer_sig | byte string (64 octets) |
+-------+-------------------+-------------------------------------+
When encapsulated within a COSE_Sign1 structure, the 180-octet raw
PoT record forms the COSE payload, and the binding_proof is carried
in an unprotected COSE header attribute (Label:
TBD_COSE_HEADER_TTTPS).
2.6.2. JOSE / JSON Data Model (JWS Mapping)
In JSON Web Signature (JWS) and JWT contexts, the PoT Record v2 is
represented as a JSON Object with deterministic Base64URL string
encodings for byte arrays:
{
"ver": 2,
"auth_type": 1,
"alg_id": 1,
"ts": 1787184000000000,
"dispersion": 5,
"ctx_id": "Base64URL(16B)",
"nonce": "Base64URL(16B)",
"holder_auth_data": "Base64URL(32B)",
"integrity_tag": "Base64URL(32B)",
"issuer_key_id": 1001,
"issuer_sig": "Base64URL(64B)"
}
When transmitted over HTTP APIs, a detached JWS header carries the
binding_proof as a JOSE header parameter ("pot_bp").
3. Relationship to Existing Mechanisms
TLS supplies peer authentication, confidentiality, and channel
integrity. DNSSEC supplies origin authentication and integrity for DNS
data. RFC 3161 supplies timestamp tokens for document-preservation
workflows. AUDIT and SCITT define audit and transparency records.
TTTPS addresses a different point in the processing sequence: it
evaluates a fixed record before the application commits a state change.
A deployment MAY record the result in an AUDIT record or a SCITT log
after admission. Those integrations do not change the TTTPS wire
format, and this document does not claim that TTTPS replaces those
mechanisms.
4. Integrity Algorithm Interface
4.1. Abstract Interface
Each alg_id value selects an algorithm that computes integrity_tag
over the 80-octet payload described in Section 2.1, and that a
verifier uses to interpret integrity_tag against three possible
outcomes: intact, resolved, or unresolvable (Section 2.5, step 3).
This document defines SHA-256 as the core algorithm. Optional
integrity
profiles, including GRG, are defined outside the core and are
identified
here only through their profile documents.
alg_id 0x0001 -- SHA-256 (Mandatory-to-Implement):
Detection-only. Fully and publicly specified in Appendix B.1,
All conformant implementations MUST support this algorithm.
Optional GRG profile:
A verifier MAY select a GRG integrity profile only when the
profile
document is available and the deployment has separately evaluated
interoperability and IPR applicability. The core does not assign a
GRG algorithm definition or require its implementation. See
[CONFIDENCE].
When the Confidence GRG profile is selected, its intact/resolved/
unresolvable integrity verdict is evaluated before freshness,
replay,
signature, confidence, or physical-context gates. A later gate
MUST NOT
convert unresolvable input into a valid PoT.
Implementations of any registered algorithm MUST satisfy, at minimum:
* Detection: a registered algorithm MUST state its detection and, if
applicable, correction properties in its profile specification.
* Context binding: the computation MUST incorporate ctx_id (via its
presence in the protected octets), so that a record generated
under one ctx_id cannot be revalidated as if generated under
another.
This revision does not allocate additional alg_id values. A future
Working Group revision may define an allocation procedure after review.
4.2. Optional Integrity Profiles
The core does not reproduce the internal construction, stage
ordering,
parameter choices, or correction claims of optional integrity
profiles.
The Confidence track [CONFIDENCE] is the independent profile
reference
for the optional GRG interface. A deployment MUST NOT infer that a
profile is implemented, interoperable, or free of IPR constraints
merely
because the core accepts an algorithm identifier.
4.3. External GRG Interface
The core does not define the internal construction, stage ordering,
parameters, correction capacity, or transport framing of an optional
GRG profile. A selected profile MUST be identified by an authenticated
context and MUST declare its protected byte domain, decoder limits, and
intact/resolved/unresolvable result contract.
The core MUST process an unresolvable result as an integrity failure.
A later freshness, issuer, holder, or policy result MUST NOT promote it
to valid. The Confidence document is the companion specification for
GRG-specific processing; this core document makes no IPR determination.
5. AdaptiveSwitch
5.1. State Machine
AdaptiveSwitch maintains per-node state in {TURBO, FULL}. A node
enters TURBO only after the configured promotion conditions are met.
A node leaves TURBO on an integrity failure, a freshness failure, or a
confidence result below the configured maintenance threshold.
5.2. Transition Conditions and Hysteresis
The promotion threshold, maintenance threshold, observation window, and
freshness window are deployment parameters. The promotion condition
MUST include a valid integrity result and an in-window submission.
The maintenance condition MUST be no less strict than the deployment
policy declares. Implementations SHOULD use hysteresis to avoid rapid
state flapping.
5.3. Penalty and Exponential Backoff
A policy failure MAY transition the node to FULL and MAY increase a
bounded backoff interval. The maximum backoff, reset condition, and
counter scope MUST be configured and recorded. Backoff is an admission
policy; it is not a cryptographic proof of malicious behaviour.
5.4. Policy Thresholds
AdaptiveSwitch thresholds, freshness windows, backoff limits, and any
cost or service policy are deployment parameters. An implementation
MUST NOT treat example values in an implementation profile as
protocol-wide guarantees. A deployment MAY use hysteresis and backoff
to limit repeated policy failures, but these mechanisms do not establish
an economic equilibrium or eliminate Byzantine behaviour.
5.5. External Policy and Profile Inputs
TTTPS core verification ends after the integrity, freshness, replay,
issuer-trust, and holder-binding checks in Section 2.5. A deployment
MAY invoke a separate policy evaluator after those checks. The
evaluator MAY consume G-Score, correlation-aware confidence,
Epi-Entropy, effective-quorum, or propagation-aware context signals
defined by the companion profiles [CONFIDENCE] and [DEEPSPACE].
A policy result MUST NOT repair a failed core check, change the meaning
of a PoT record, select a decoder, or modify the 180-octet record. It
MAY return ACCEPT, HOLD, UNVERIFIABLE, or REJECT under its declared
policy. HOLD MUST have a bounded terminal transition.
5.6. GRG Physical Framing Boundary
The optional GRG integrity profile and any link-layer GRG framing
profile are distinct contracts. The record is not automatically a
Golay codeword stream because of its length. A deployment MUST declare
the FEC code, interleaver, Rice parameter, protected byte domain,
padding rule, and decoder limits before reception.
The normative PoT record for this document is 180 octets. A framing
profile MUST identify its own protected domain and length. Golay
(23,12,7) and extended Golay [24,12,8] are not interchangeable, and a
decoder MUST NOT select a code by length inference. The current checked
GRG reference path uses Golay (23,12,7); any other code requires a
separately identified profile and interoperability vectors.
GRG parameter selection is session- and context-bound. The receiver
MUST configure the selected profile before decoding and MUST fail closed
on a profile or stream mismatch. FEC correction MUST NOT convert a
failed cryptographic integrity result into PASS. After successful
deinterleaving, FEC, and stream validation, the recovered 180-octet
record is passed to the PoT parser. Epi-Entropy and G-Score operate
only after that boundary and do not control FEC decoding.
6. Transport Binding
6.1. TLS 1.3 Binding
TTTPS uses the TLS Exporter mechanism [RFC5705] to derive binding
material from an established TLS 1.3 session, following the model of
[NTS] Section 5.1. This requires NO new TLS Extension Type
codepoint and is fully backward-compatible with existing TLS 1.3
implementations.
Jorgen Expires 21 February 2027 [Page 24]
Internet-Draft TTTPS September 2026
Binding computation (normative), performed by both Holder and
verifier:
record_hash = SHA-256(pot_record) [all 180 octets]
context_value = SHA-256("tttps-binding-v2" || 0x00 ||
record_hash || ctx_id || nonce)
exporter_output = TLS-Exporter("EXPORTER-TTTPS-v2-Binding",
context_value, 32)
binding_input = "tttps-binding-v2" || 0x00 || exporter_output ||
ctx_id || nonce
binding_proof is then computed by the Holder according to
holder_auth_type (Section 2.3):
0x01: binding_proof = Ed25519.Sign(holder_sk, binding_input) (64
octets)
0x02: binding_proof = HMAC-SHA256(k_h, binding_input) (32
octets)
exporter_output MUST NOT be transmitted; only binding_proof and the
PoT Record are sent. Because exporter_output is derived from the TLS
session's master secret [RFC5705] Section 4, a PoT captured from
session A cannot be replayed into session B: recomputing
binding_input in session B yields a different value, and
binding_proof over session A's binding_input fails verification.
Because binding_proof additionally requires holder key material the
session alone does not provide, a party present in the session but
not in possession of holder_sk or k_h cannot produce a valid
binding_proof even for its own session -- the defect this revision
corrects (Discussion Note).
PoT Frame format:
holder_auth_type 0x01: pot_record(180) || binding_proof(64) = 244B
holder_auth_type 0x02: pot_record(180) || binding_proof(32) = 212B
The verifier's procedure is given in Section 2.5.
6.2. QUIC Integration
TTTPS operates over QUIC [RFC9000] post-handshake. The TLS Exporter
is available after QUIC handshake completion.
Jorgen Expires 21 February 2027 [Page 25]
Internet-Draft TTTPS September 2026
Holder Verifier
|--Initial[CRYPTO]-------------->| (TLS ClientHello)
|<-Initial[CRYPTO]--------------| (TLS ServerHello)
|<-Handshake[CRYPTO]------------| (TLS EncryptedExtensions)
|--Handshake[CRYPTO]----------->| (TLS Finished)
| |
| Holder computes binding_proof|
| per Section 6.1 |
| |
|--1-RTT[STREAM:PoT frame]----->|
|<-1-RTT[STREAM:PoT-Ack]--------|
PoT frames MUST be sent in a dedicated QUIC stream. The stream
identifier is a deployment parameter; this revision makes no IANA
allocation.
6.3. HTTP/3 Frame Type
Over HTTP/3 [RFC9114], PoT records are conveyed in a dedicated HTTP/3
frame type.
Frame Type: deployment-specific value; this revision requests no IANA
allocation
Frame Length: variable (244 octets with a type-0x01
binding_proof, 212 octets with type-0x02)
Frame Body: PoT Record || binding_proof (Section 2.1)
PoT frames MAY appear in any HTTP/3 request or response stream.
Servers MUST NOT reject requests solely on the basis of absent PoT
frames (backward compatibility).
6.4. Backward Compatibility
Servers that do not implement TTTPS MUST be able to process TLS 1.3,
QUIC, and HTTP/3 connections that include TTTPS binding material.
TTTPS MUST NOT modify the TLS handshake in a way that causes
negotiation failure with non-TTTPS peers.
Implementations SHOULD use ALPN [RFC7301] extension identifier
"tttps/1" or another deployment-specific identifier; this revision
does not request IANA allocation to negotiate TTTPS
capability between peers. The ALPN identifier negotiates TTTPS
capability at the transport layer; it is not tied to the PoT Record
version, which is negotiated separately via the version field
(Section 2.2).
Jorgen Expires 21 February 2027 [Page 26]
Internet-Draft TTTPS September 2026
7. Clock Substrate Interface
A deployment MUST provide the Issuer with a timestamp and an
uncertainty bound in the units and time scale declared by the active
context. The source, calibration state, age, and uncertainty bound
MUST be retained as evidence. This document does not require a
particular hardware clock, cloud provider, kernel interface, polling
interval, or storage system.
An implementation MAY use a pre-published clock sample for event
sealing. If it does so, the sample age and accumulated uncertainty
MUST be included in dispersion. A fixed-record implementation MAY
implement the hot path with bounded constant work and no per-event
allocation; this is an implementation property under fixed resource
limits, not a guarantee about the clock substrate or the network.
8. Tier Structure
The core protocol does not assign fixed freshness intervals to tier
identifiers. A deployment MAY define tier identifiers for different
operating policies, but the active context manifest MUST bind each
identifier to a time scale, an interval, a tier_window, and a
max_hold_window. These values are policy inputs and are not inferred
from the record or from the transport.
A verifier MUST reject or return UNVERIFIABLE when the selected tier is
absent, expired, or not authenticated by the active context manifest.
The freshness decision in Section 2.5 uses the authenticated
tier_window and dispersion. This section defines no fee, latency, or
performance target.
9. Security Considerations
9.1. Compromised Time Sources and Path Attacks
This section addresses two threat models: compromised time sources
and compromised network paths between the PoT Issuer and its sources
(the standard IETF network adversary model).
Compromised source: a single compromised time source biases the
synthesised timestamp by at most 1/k of the manipulation, where k >=
3 is the source count. For k=4 independent sources, single-source
bias impact <= 0.25 of manipulation magnitude.
Compromised network path: an attacker controlling the path between
the Issuer and one source can inject delayed or replayed responses.
Two mitigations apply: (a) multi-source median (ts = median(T_1, ...,
T_k), k >= 3, distinct administrative domains) -- a path-level
attacker must simultaneously compromise paths to a majority of
sources to bias the median; (b) the stratum tolerance check
(Section 2.4, step 4) -- a single-path delay injection that pushes
one source beyond tolerance is detected and rejected.
NTS [NTS] on the path between Issuer and sources provides an
additional layer of path authentication; implementations SHOULD use
NTS-authenticated sources where available. Implementations MUST use
sources from distinct administrative domains (e.g., a national
metrology laboratory, a GNSS-disciplined source, and an NTS-
authenticated source) to maximise independence. Sources from a
single autonomous system MUST NOT be counted as independent.
Jorgen Expires 21 February 2027 [Page 30]
Internet-Draft TTTPS September 2026
9.2. Replay Prevention
Each PoT Record includes a 128-bit cryptographically random nonce
(Section 2.2). Verifiers MUST maintain a nonce cache, keyed on
(ctx_id, nonce), for the duration of the tier freshness window.
Duplicate pairs MUST be rejected.
issuer_sig seals the nonce against Issuer-side forgery. Cross-
session replay is additionally prevented by the TLS binding of
Section 6.1.
_Implementations MUST perform the nonce-cache duplicate-check and the
nonce-cache insertion as a single atomic operation._ Split-phase
implementations (check-then-insert without atomicity) are subject to
a Time-of-Check to Time-of-Use (TOCTOU) race under concurrent request
load, permitting an attacker to replay a captured record N times by
issuing N concurrent verifications faster than the cache-insert phase
completes.
The reference implementation uses Redis with SET pot:{event_id} NX EX
<ttl>, which is atomic on the Redis server; equivalent atomic
primitives include PostgreSQL INSERT ... ON CONFLICT DO NOTHING
RETURNING, DynamoDB ConditionalPutItem, and in-process
std::collections::HashSet guarded by a std::sync::Mutex.
Empirical validation: a split-phase implementation deployed with 20
concurrent identical requests observed 20/20 duplicate acceptances
(100 percent TOCTOU exploitation success). After conversion to
atomic SET-NX, the same load produced 1 acceptance and 19 rejections,
matching the correct behaviour.
9.3. Sybil Time Sources and Unique Quorum
A valid signature or a fresh key does not establish a new independent
physical source. Before constructing the agreement distribution,
density
operator, or robust aggregate, the verifier MUST validate D-chain
freshness
and map each stable_node_id to an authority-bound PhysicalEntity and
provenance group.
Duplicate labels for one physical entity count zero after the first
admitted
vote. The effective quorum is
N_eff = | union over i in Roster PhysicalEntity(stable_node_id_i)
|.
Quorum and Byzantine aggregation MUST use N_eff rather than raw
label or
key count. The f < N_eff/2 condition MUST be checked before applying
a
Byzantine median. If the condition fails, the verifier MUST enter
HOLD_AHE
or InsufficientKnowledge and MUST NOT fabricate a quorum.
This defense is bounded by the declared identity and provenance
authority.
It provides no universal guarantee against an attacker that can
forge or
compromise that authority.
9.4. Side-Channel Considerations
Integrity-tag verification and Ed25519 verification MUST be
implemented in constant time. Variable-time implementations risk
timing side-channel attacks against secret key material.
The nonce MUST be generated with a constant-time CSPRNG.
Jorgen Expires 21 February 2027 [Page 31]
Internet-Draft TTTPS September 2026
9.5. Resource and Ordering Attacks
An attacker may submit stale, reordered, or high-rate records to
consume verifier resources or influence an application policy. The
verifier MUST apply the fixed-record integrity and freshness checks
before state mutation. Queue limits, admission quotas, and backoff
MAY be configured by the deployment. TTTPS does not claim that these
controls make an attack economically irrational or remove the need for
application-level rate limiting.
9.6. Delay-Based Temporal Attacks
[NTS] Section 8.6 identifies delay attacks as a primary threat to
time synchronisation security. TTTPS addresses this through two
complementary gates, applied in sequence (Section 2.5):
(1) Integrity-tag gate: a PoT generated under context ctx_id cannot
be presented in a different context ctx_id' without the integrity
check failing, because ctx_id is part of the protected octets
(Section 4.1). This is analogous to the cookie freshness mechanism
of [NTS] Section 5.4.
(2) AdaptiveSwitch freshness gate (Section 5.3): a PoT submitted
outside the tier freshness window is rejected regardless of
cryptographic validity, and FULL mode is triggered immediately.
FILO+Integrity processing discipline: among records that pass both
gates, the most recent qualifying submission is processed first. A
delayed record outside the freshness window is rejected. Queue limits
and backoff are deployment policy and do not establish an economic
guarantee. The full flow is diagrammed in Appendix D.
9.7. Integrity Algorithm Security
The core SHA-256 algorithm has no correction capability and its
security
depends on its standard cryptographic assumptions. Optional GRG
security
and correction properties are profile-specific and MUST NOT be
inferred
by a core verifier. The Confidence profile [CONFIDENCE] is the
source for
any GRG interface claims; this core makes no independent GRG security
claim.
Jorgen Expires 21 February 2027 [Page 32]
Internet-Draft TTTPS September 2026
Implementations MUST NOT expose internal algorithm state, shard
values, or intermediate pipeline results through public APIs or error
messages.
9.8. Path Manipulation
An adversary controlling only network paths (not the Issuer's Ed25519
private key, nor holder key material) cannot produce a PoT that
passes verification: context binding (Section 4.1) rejects cross-
context replay, the freshness gate (Section 2.5, step 4) rejects
path-induced delay beyond the tier window, and the TLS binding
(Section 6.1) rejects cross-session replay because binding_proof
requires holder key material the path attacker does not possess.
This holds independent of the network-layer substrate the PoT
traverses, including legacy signaling gateways; a detailed per-
substrate scenario walkthrough is out of scope for this revision.
9.9. Trust Model and Key Compromise Resilience
9.9.1. Trust Hierarchy
TTTPS defines a two-level trust hierarchy:
Level 0 (L0) Certificate Authority:
An L0 CA issues certificates to PoT Issuers. Verifiers trust L0
CA public keys, published in a transparency log (analogous to
a transparency log).
Level 1 (L1) PoT Issuer:
An L1 Issuer holds an Ed25519 key pair certified by an L0 CA,
identified on the wire by issuer_key_id (Section 2.2). The Issuer
generates PoT Records (Section 2.4) and signs them with its
private key.
Verifier:
Any party that receives a (binding_proof, PoT Record) pair and
verifies it per Section 2.5.
This model is analogous to TLS PKI: L0 CAs are root CAs, L1 Issuers
are intermediate CAs, and verifiers are TLS clients.
Jorgen Expires 21 February 2027 [Page 33]
Internet-Draft TTTPS September 2026
9.9.2. Issuer Key Compromise Response
If an L1 Issuer's Ed25519 private key is compromised: (1) Key
rotation -- the L0 CA revokes the compromised certificate and issues
a new one under a new issuer_key_id (Section 2.2), which verifiers
use to select the correct public key without ambiguity. (2)
Transparency audit -- all PoTs generated by the compromised key are
logged with their timestamps; third parties can determine which PoTs
were generated before versus after the compromise window. (3) Source
independence -- the multi-source median (Section 2.4) provides an
independent check on Issuer-reported timestamps; even after key
compromise, the attacker cannot generate PoTs with timestamps outside
the source consensus window without also compromising k/2 sources.
9.9.3. Untrusted Substrate Scope
The preceding controls provide bounded guarantees only under their
stated assumptions: valid issuer and holder key material, an
authority-backed context, a configured freshness window, and the
declared source and quorum bounds. They prevent a verifier from
accepting a record that fails those checks. They do not guarantee the
correctness of a compromised trust authority, an incorrect time
source, or an application policy, and they do not provide a universal
Byzantine or unlinkability guarantee.
10. Privacy Considerations
10.1. Unlinkability
PoT Records include a 128-bit random nonce (Section 2.2) that MUST be
freshly generated for each record. This prevents linkage of PoT
Records from the same Issuer across sessions. The TLS binding of
Section 6.1 ensures PoT Records are bound to specific TLS sessions
and cannot be used to correlate activity across sessions. Issuers
SHOULD NOT include in PoT Records any information beyond the fields
defined in Section 2.2 that could enable participant identification.
10.2. Minimal Disclosure
The PoT Record wire format (Section 2.1) does not include participant
identity or address, transaction content, or economic parameters or
bid values beyond holder_auth_data, which identifies only the
Holder's public key or a shared-secret digest, not a real-world
identity. ctx_id is an opaque, application-assigned context
identifier and a public, non-sensitive value; because it is an opaque
Jorgen Expires 21 February 2027 [Page 34]
Internet-Draft TTTPS September 2026
string to the protocol, its semantics can be extended by application
convention without any change to the wire format (Section 2) or the
integrity binding (Section 4).
11. IANA Considerations
This revision makes no IANA request. It is an individual draft
prepared for discussion and does not create registries, allocate
protocol identifiers, or claim provisional registration. A future
Working Group revision may request assignments for a TLS exporter
label, ALPN identifier, HTTP/3 frame type, or TTTPS parameters after
the wire semantics, allocation policy, and IPR disclosures have been
reviewed.
12. Intellectual Property
The core SHA-256 integrity mode is completely specified in Appendix
B.1,
and the optional GRG profile is not required for conformance. GRG is
maintained independently in the Confidence track [CONFIDENCE]. IPR
matters are handled only through the IETF disclosure process
specified by
BCP 79 [RFC8179]; this document makes no determination about the
validity
or scope of any IPR claim.
13. Implementation Status
This section records the status of known implementations of TTTPS at
the time of posting, per [RFC7942].
13.1. Reference Implementation
Name: OpenTTT
URL: https://github.com/Helm-Protocol/OpenTTT
Level: Partial (verifier SDK, QUIC transport)
The following implementation results were recorded before the v2
wire-format update and are not v2 conformance evidence.
Earlier tests covered the wire and external integrity interface.
AdaptiveSwitch model. QUIC/TLS binding, source-median synthesis, and
no_std verifier results are implementation evidence only.
Jorgen Expires 21 February 2027 [Page 37]
Internet-Draft TTTPS September 2026
Earlier implementation results were recorded before the v2
wire-format update and are not independently verified in this revision.
They are not v2 conformance evidence. Coverage of v2 will be recorded
only with the implementation revision, test harness, and measurement
method identified.
Private Issuer implementation:
Name: Helm grg-core (reported profile implementation)
Level: Not a core-conformance claim
Note: Any GRG implementation status belongs to the independent
Confidence profile and is not evidence of core TTTPS
conformance.
13.2. Deployment Evidence
No v2 deployment or flight-validation result is claimed in this
revision. Earlier implementation measurements, if cited by a
deployment, MUST identify the implementation revision, wire format,
test harness, collection interval, and measurement method. They are
not protocol requirements and are not evidence of universal latency or
attack resistance.
13.3. Formal Verification Artifacts
The TLA+ appendix contains the current AdaptiveSwitch model and records
the finite parameter set used for its bounded TLC check. That model
does not model the 180-octet parser, cryptographic verification,
certificate resolution, or application state mutation. This document
therefore makes no formal-verification claim for those components.
A future parser-and-gate model MAY specify the BoundedParse,
InvalidIngressNoMutation, and ValidIngressMayCommit obligations listed
in Appendix A. Any result for that model MUST identify the model, tool
version, configuration, and checked state space.
13.4. Interested Parties
This subsection records organisations that have expressed interest in
the deployment scenarios described in Section 1.6. Inclusion here
does not constitute endorsement of any specific version of this
draft. At the time of this revision, no interested-party statements
have been received. Authors request that organisations wishing to be
listed contact the authors directly; a non-binding expression of
interest in the stated use cases is sufficient for inclusion.
14. Roadmap
The following companion profiles are published in parallel with this
revision and are cited informatively:
* draft-helmprotocol-deepspace-00: propagation-aware OWLT, physical
context, integer-preserving correction, sparse-peer handling, and
conservative Epi-Entropy shadow qualification.
* draft-helmprotocol-confidence-00: G-Score, correlation-aware
von Neumann confidence, Epi-Entropy, AdaptiveSwitch, and
InsufficientKnowledge semantics.
* GRG-specific integrity mode extensions are maintained in the
independent Confidence profile; the core remains vendor-neutral.
Profile processing is optional. The companion drafts describe policy
signals and propagation-aware context handling without changing the core
wire record or its cryptographic integrity boundary.
15. References
15.1. Normative References
Jorgen Expires 21 February 2027 [Page 39]
Internet-Draft TTTPS September 2026
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>.
[RFC5705] Rescorla, E., "Keying Material Exporters for Transport
Layer Security (TLS)", RFC 5705, March 2010,
<https://www.rfc-editor.org/info/rfc5705>.
[RFC7301] Friedl, S., "Transport Layer Security (TLS) Application-
Layer Protocol Negotiation Extension", RFC 7301, July
2014, <https://www.rfc-editor.org/info/rfc7301>.
[RFC8179] Bradner, S. and J. Contreras, "Intellectual Property
Rights
in IETF Technology", BCP 79, RFC 8179, May 2017,
<https://www.rfc-editor.org/info/rfc8179>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, May 2017,
<https://www.rfc-editor.org/info/rfc8174>.
[NTS] Franke, D., "Network Time Security for the Network Time
Protocol", RFC 8915, September 2020,
<https://www.rfc-editor.org/info/rfc8915>.
[RFC9000] Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed
and Secure Transport", RFC 9000, May 2021,
<https://www.rfc-editor.org/info/rfc9000>.
[RFC9114] Bishop, M., "HTTP/3", RFC 9114, June 2022,
<https://www.rfc-editor.org/info/rfc9114>.
15.2. Informative References
Jorgen Expires 21 February 2027 [Page 40]
Internet-Draft TTTPS September 2026
[CONFIDENCE] Jorgen, H., "Oracle Confidence Gating:
G-Score,
Correlation-Aware von Neumann Confidence, and
AdaptiveSwitch,"
Work in Progress, draft-helmprotocol-confidence-00,
September 2026,
<https://datatracker.ietf.org/doc/draft-helmprotocol-tttp
-confidence/>.
[DEEPSPACE] Jorgen, H., "TTTPS Deep-space Profile: Propagation-Aware
Time Attestation," Work in Progress,
draft-helmprotocol-deepspace-00, September 2026,
<https://datatracker.ietf.org/doc/draft-helmprotocol-deep
pace/>.
Jorgen Expires 21 February 2027 [Page 41]
Internet-Draft TTTPS September 2026
[RFC7942] Sheffer, Y. and A. Farrel, "Improving Awareness of Running
Code: The Implementation Status Section", BCP 205,
RFC 7942, July 2016,
<https://www.rfc-editor.org/info/rfc7942>.
[I-D.ietf-ntp-roughtime]
Ladd, W. and M. Dansarie, "Roughtime", Work in Progress
(draft-19). RFC Editor Queue; intended status Experimental
(status verified on the IETF Datatracker, June 2026), Work
in Progress, Internet-Draft, draft-ietf-ntp-roughtime-19,
2026, <https://datatracker.ietf.org/doc/html/draft-ietf-
ntp-roughtime-19>.
Jorgen Expires 21 February 2027 [Page 42]
Internet-Draft TTTPS September 2026
Appendix A. AdaptiveSwitch TLA+ Specification
The following TLA+ module specifies the AdaptiveSwitch state
machine. The
model was checked with TLC using the finite parameter set MaxNodes=3,
MaxBlocks=10, TierToleranceMs=100, TurboEntry=95, and
TurboMaintain=85. This check covers the model and parameter set shown
here; it is not a proof of all implementations or deployments.
The module specifies:
* TypeInvariant: all five state variables are well-typed.
* S1 (NoForcedTurbo): TURBO requires match_rate >= 85 AND fail_count
= 0 -- conjunction, not disjunction.
* S2 (DelayRejectionTriggersFull): submission outside tier tolerance
is incompatible with TURBO.
* S3 (FailureExcludesTurbo): any integrity failure forces FULL.
* L1 (EventualTurbo): a node with sustained good behaviour
eventually reaches TURBO (liveness under weak fairness).
EnvStep models nondeterministic updates to match_rate, fail_count, and
submission_delay. The stated invariants are checked for the bounded
model; deployment-specific assumptions remain outside this appendix.
The wire-admission obligations are separate from this AdaptiveSwitch
model. A core parser model MUST include the following properties before
a TLC result is claimed for them:
* BoundedParse: an input frame is accepted for parsing only when its
declared length is 180 octets plus the selected external proof; the
parser visits a fixed set of offsets and performs no input-sized loop.
* InvalidIngressNoMutation: if integrity, freshness, replay, issuer
trust, or holder binding fails, the application state and commit
marker are unchanged.
* ValidIngressMayCommit: an application state transition is enabled
only after all required core predicates have succeeded.
This revision does not claim that the AdaptiveSwitch TLC run checks
these parser obligations. They are included as the required scope of
the next combined parser-and-gate model.
---- MODULE AdaptiveSwitch ----
EXTENDS Naturals, FiniteSets
CONSTANTS MaxNodes, MaxBlocks, TurboEntry, TurboMaintain,
TierToleranceMs
ASSUME /\ TurboEntry = 95 \* 95% match_rate required for TURBO
/\ TurboMaintain = 85 \* 85% minimum to stay in TURBO
/\ TierToleranceMs > 0 \* positive tier tolerance (ms)
NodeId == 1..MaxNodes \* finite set of node identifiers
Modes == { "TURBO", "FULL" }
VARIABLES
node_mode, \* [NodeId -> Modes] per-node state
match_rate, \* [NodeId -> 0..100] ordering-match percentage
fail_count, \* [NodeId -> Nat] consecutive failures
block_count, \* Nat current block number
submission_delay \* [NodeId -> Nat] ms since last PoT gen
vars == <<node_mode, match_rate, fail_count,
block_count, submission_delay>>
\* -- Helpers ------------------------------------------------------
SubmittedOutsideTolerance(n) ==
submission_delay[n] > TierToleranceMs
\* -- Type correctness ---------------------------------------------
TypeInvariant ==
/\ node_mode \in [NodeId -> Modes]
/\ match_rate \in [NodeId -> 0..100]
/\ fail_count \in [NodeId -> Nat]
/\ block_count \in Nat
/\ submission_delay \in [NodeId -> Nat]
\* -- Initial state (all nodes start in FULL, zero counters) -------
Init ==
/\ node_mode = [n \in NodeId |-> "FULL"]
/\ match_rate = [n \in NodeId |-> 0]
/\ fail_count = [n \in NodeId |-> 0]
/\ block_count = 0
/\ submission_delay = [n \in NodeId |-> 0]
\* -- Actions ------------------------------------------------------
\* Promote n from FULL to TURBO when match_rate sufficient
\* and no pending failures.
PromoteToTurbo(n) ==
/\ node_mode[n] = "FULL"
/\ match_rate[n] >= TurboEntry
/\ fail_count[n] = 0
/\ ~SubmittedOutsideTolerance(n)
/\ node_mode' = [node_mode EXCEPT ![n] = "TURBO"]
/\ UNCHANGED <<match_rate, fail_count,
block_count, submission_delay>>
\* Demote n from TURBO to FULL on poor match_rate, integrity
\* failure, or submission outside tier tolerance.
DemoteToFull(n) ==
/\ node_mode[n] = "TURBO"
/\ \/ match_rate[n] < TurboMaintain
\/ fail_count[n] > 0
\/ SubmittedOutsideTolerance(n)
/\ node_mode' = [node_mode EXCEPT ![n] = "FULL"]
/\ UNCHANGED <<match_rate, fail_count,
block_count, submission_delay>>
\* Environment step: update match_rate / fail_count / delay
\* (models external inputs; unconstrained for model checking)
EnvStep(n, mr, fc, sd) ==
/\ match_rate' = [match_rate EXCEPT ![n] = mr]
/\ fail_count' = [fail_count EXCEPT ![n] = fc]
/\ submission_delay' = [submission_delay EXCEPT ![n] = sd]
/\ block_count' = block_count + 1
/\ UNCHANGED node_mode
Next ==
\E n \in NodeId :
\/ PromoteToTurbo(n)
\/ DemoteToFull(n)
\/ \E mr \in 0..100, fc \in 0..5,
sd \in 0..(TierToleranceMs+50) :
EnvStep(n, mr, fc, sd)
Spec == Init /\ [] (Next \/ UNCHANGED vars) /\ WF_vars(Next)
\* -- Safety invariants --------------------------------------------
\* S1: TURBO requires healthy match_rate AND no integrity failures.
NoForcedTurbo ==
\A n \in NodeId :
node_mode[n] = "TURBO" =>
/\ match_rate[n] >= TurboMaintain
/\ fail_count[n] = 0
\* S2: Delay outside tier tolerance must not coexist with TURBO.
DelayRejectionTriggersFull ==
\A n \in NodeId :
SubmittedOutsideTolerance(n) => node_mode[n] = "FULL"
\* S3: fail_count > 0 must not coexist with TURBO.
FailureExcludesTurbo ==
\A n \in NodeId :
fail_count[n] > 0 => node_mode[n] = "FULL"
\* -- Liveness -----------------------------------------------------
\* L1: A node with sustained good behaviour eventually reaches TURBO.
EventualTurbo ==
\A n \in NodeId :
(match_rate[n] >= TurboEntry /\ fail_count[n] = 0
/\ ~SubmittedOutsideTolerance(n))
~> node_mode[n] = "TURBO"
\* -- TLC model values (for model checking) ------------------------
\* MaxNodes = 3, MaxBlocks = 10, TierToleranceMs = 100
\* TurboEntry = 95, TurboMaintain = 85
====
The invariant NoForcedTurbo corresponds to Safety Property S4 of the
Helm Autonomy Layer Yellow Paper v2.0 (AS score external
immutability).
Appendix B. Integrity Algorithm Interface and SHA-256
This appendix specifies the core SHA-256 integrity algorithm.
Optional profile algorithms are not defined by this appendix; the
GRG profile
is
maintained in the independent Confidence track [CONFIDENCE].
B.1. alg_id 0x0001 -- SHA-256 (Mandatory-to-Implement)
This algorithm is specified here and MUST be implemented by all
conformant core implementations.
integrity_tag = SHA-256(pot_record[0:80])
where pot_record[0:80] denotes octets 0 through 79 of the PoT Record
(version through holder_auth_data, Section 2.1). Because the
integrity_tag field is exactly 32 octets, the full SHA-256 output is
used with no truncation.
Verification: the verifier recomputes SHA-256(pot_record[0:80]) and
compares it against integrity_tag. A match yields the *intact*
verdict; a mismatch yields *unresolvable* (this algorithm has no
correction capability, so the *resolved* verdict of Section 2.5 never
applies to it). The security of this check depends on the standard
preimage and collision-resistance assumptions for SHA-256; this
document does not assign a deployment probability to an undetected
modification.
B.2. Optional GRG Profile
The optional GRG integrity profile is specified in the independent
Confidence track [CONFIDENCE]. The core document intentionally does
not
reproduce its stage construction, parameters, correction claims, or
implementation requirements. A core implementation remains conformant
without GRG.
B.3. Future Algorithm Extensions
This revision does not allocate additional alg_id values. A future
Working Group revision may define an allocation procedure after review.
Any future specification MUST state the computation of integrity_tag,
the detection and correction properties under stated assumptions, and
the implementation status of the algorithm.
Test vectors for the core PoT generation and verification are
provided
as property-based tests. Optional profile test vectors belong to
their
respective profile documents.
Required properties (all MUST pass):
C.1 Core integrity verification:
Verify(Generate(P, ctx), ctx) = intact for the SHA-256 profile.
C.2 Nonce uniqueness:
Two calls to Generate() MUST NOT produce equal nonces.
C.3 Context separation:
integrity_tag(P, ctx_A) != integrity_tag(P, ctx_B) for ctx_A !=
ctx_B, subject to the collision-resistance assumptions of the
selected integrity algorithm.
C.4 Verification correctness:
Verify(Generate(P, ctx), ctx) = intact.
C.5 Forgery resistance:
Verify(tampered_record, ctx) = unresolvable for any single-bit
modification exceeding the algorithm's correction capacity.
C.6 Delay rejection:
A PoT submitted at ts + tier_window + dispersion + 1 microsecond
MUST trigger FULL mode.
C.7 Integrity-first ordering:
Integrity-tag verification (Section 2.5, step 3) MUST complete,
and MUST yield unresolvable on failure, before issuer_sig or
binding_proof are attempted (measurable via timing).
An implementation test suite may instantiate these properties for the
180-octet record. The reference implementation status and test count
are maintained separately from this protocol specification; this
test-vector section does not claim conformance from an unreported test
run.
Appendix D. FILO+Integrity Delay Rejection Flow
This appendix provides a normative ASCII diagram of the
FILO+Integrity delay rejection mechanism described in Section 9.6.
TIME AXIS:
|----ts-----|---(ts+window)---|---------(ts+Delta)------->
PoT gen tier freshness delayed submission
time window end zone
VALID SUBMISSION WINDOW: [ts, ts + tier_window + dispersion]
DELAYED ZONE: (ts + tier_window + dispersion, infinity)
GATE 1: Integrity-tag verification (fixed cost, alg_id-dependent)
--------------------------------------------------
Input: PoT Record
If integrity_tag verdict is unresolvable:
-> REJECT immediately
-> DO NOT invoke issuer_sig or binding_proof verification
Covers: wrong context, tampered payload
GATE 2: AdaptiveSwitch freshness check
--------------------------------------------------
Input: PoT Record + current time S
If (S - ts) > tier_window + dispersion:
-> REJECT
-> Trigger FULL mode
-> Apply exponential backoff
Covers: valid PoT submitted outside freshness window
FILO QUEUE (Gate 1 AND Gate 2 passed)
--------------------------------------------------
Queue discipline: most recently generated PoT first.
If multiple PoTs qualify:
Select max(PoT.ts) for processing.
Earlier PoTs remain in queue.
Effect on delayed submissions:
o A record outside the freshness window cannot pass Gate 2.
o A qualifying record is ordered by its timestamp according to the
configured queue policy.
o Repeated failures MAY trigger the configured backoff policy
COMPLEXITY NOTE:
Gate 1 (integrity tag): O(1) per record, fixed cost
Gate 2 (freshness): O(1) per record
Queue ordering: O(log q) for q queued records (priority queue)
Verification path: O(1) with respect to network size and queue length
when the verifier applies the configured bounded single-record path.
Queue selection is separate and remains O(log q) for the priority-queue
implementation described above.
Compare with BFT consensus protocols:
PBFT/Tendermint/HotStuff: O(n^2) network-wide message
exchanges to reach Byzantine tolerance for n total nodes. TTTPS does
not replace a quorum protocol and does not claim to eliminate Byzantine
principals. Its bounded per-record path protects the local admission
decision; peer aggregation and provenance checks remain profile and
deployment policy functions.
Author's Address
Heime Jorgen
Kenosian
Email: heime.jorgen@proton.me
Jorgen Expires 21 February 2027 [Page 50]