yakmesh 2.9.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +637 -0
- package/Caddyfile +77 -0
- package/README.md +119 -29
- package/content/api.js +50 -41
- package/content/index.js +1 -2
- package/content/store.js +323 -177
- package/dashboard/index.html +19 -3
- package/database/replication.js +117 -37
- package/docs/CRYPTO-AGILITY.md +204 -0
- package/docs/MTLS-RESEARCH.md +367 -0
- package/docs/NAMCHE-SPEC.md +681 -0
- package/docs/PEERQUANTA-YAKMESH-INTEGRATION.md +407 -0
- package/docs/PRECISION-DISCLOSURE.md +96 -0
- package/docs/README.md +76 -0
- package/docs/ROADMAP-2.4.0.md +447 -0
- package/docs/ROADMAP-2.5.0.md +244 -0
- package/docs/SECURITY-AUDIT-REPORT.md +306 -0
- package/docs/SST-INTEGRATION.md +712 -0
- package/docs/STEADYWATCH-IMPLEMENTATION.md +303 -0
- package/docs/TERNARY-AUDIT-REPORT.md +247 -0
- package/docs/TME-FAQ.md +221 -0
- package/docs/WHITEPAPER.md +623 -0
- package/docs/adapters.html +1001 -0
- package/docs/advanced-systems.html +1045 -0
- package/docs/annex.html +1046 -0
- package/docs/api.html +970 -0
- package/docs/business/response-templates.md +160 -0
- package/docs/c2c.html +1225 -0
- package/docs/cli.html +1332 -0
- package/docs/configuration.html +1248 -0
- package/docs/darshan.html +1085 -0
- package/docs/dharma.html +966 -0
- package/docs/docs-bundle.html +1075 -0
- package/docs/docs.css +3120 -0
- package/docs/docs.js +556 -0
- package/docs/doko.html +969 -0
- package/docs/geo-proof.html +858 -0
- package/docs/getting-started.html +840 -0
- package/docs/gumba-tutorial.html +1144 -0
- package/docs/gumba.html +1098 -0
- package/docs/index.html +914 -0
- package/docs/jhilke.html +1312 -0
- package/docs/karma.html +1100 -0
- package/docs/katha.html +1037 -0
- package/docs/lama.html +978 -0
- package/docs/mandala.html +1067 -0
- package/docs/mani.html +964 -0
- package/docs/mantra.html +967 -0
- package/docs/mesh.html +1409 -0
- package/docs/nakpak.html +869 -0
- package/docs/namche.html +928 -0
- package/docs/nav-order.json +53 -0
- package/docs/prahari.html +1043 -0
- package/docs/prism-bash.min.js +1 -0
- package/docs/prism-javascript.min.js +1 -0
- package/docs/prism-json.min.js +1 -0
- package/docs/prism-tomorrow.min.css +1 -0
- package/docs/prism.min.js +1 -0
- package/docs/privacy.html +699 -0
- package/docs/quick-reference.html +1181 -0
- package/docs/sakshi.html +1402 -0
- package/docs/sandboxing.md +386 -0
- package/docs/seva.html +911 -0
- package/docs/sherpa.html +871 -0
- package/docs/studio.html +860 -0
- package/docs/stupa.html +995 -0
- package/docs/tailwind.min.css +2 -0
- package/docs/tattva.html +1332 -0
- package/docs/terms.html +686 -0
- package/docs/time-server-deployment.md +166 -0
- package/docs/time-sources.html +1392 -0
- package/docs/tivra.html +1127 -0
- package/docs/trademark-policy.html +686 -0
- package/docs/tribhuj.html +1183 -0
- package/docs/trust-security.html +1029 -0
- package/docs/tutorials/backup-recovery.html +654 -0
- package/docs/tutorials/dashboard.html +604 -0
- package/docs/tutorials/domain-setup.html +605 -0
- package/docs/tutorials/host-website.html +456 -0
- package/docs/tutorials/mesh-network.html +505 -0
- package/docs/tutorials/mobile-access.html +445 -0
- package/docs/tutorials/privacy.html +467 -0
- package/docs/tutorials/raspberry-pi.html +600 -0
- package/docs/tutorials/security-basics.html +539 -0
- package/docs/tutorials/share-files.html +431 -0
- package/docs/tutorials/troubleshooting.html +637 -0
- package/docs/tutorials/trust-karma.html +419 -0
- package/docs/tutorials/yak-protocol.html +456 -0
- package/docs/tutorials.html +1034 -0
- package/docs/vani.html +1270 -0
- package/docs/webserver.html +809 -0
- package/docs/yak-protocol.html +940 -0
- package/docs/yak-timeserver-design.md +475 -0
- package/docs/yakapp.html +1015 -0
- package/docs/ypc27.html +1069 -0
- package/docs/yurt.html +1344 -0
- package/embedded-docs/bundle.js +274 -114
- package/gossip/protocol.js +247 -27
- package/identity/key-resolver.js +262 -0
- package/identity/machine-seed.js +632 -0
- package/identity/node-key.js +669 -368
- package/identity/tribhuj-ratchet.js +506 -0
- package/knowledge-base.js +37 -8
- package/launcher/yakmesh.bat +62 -0
- package/launcher/yakmesh.sh +70 -0
- package/mesh/annex.js +462 -108
- package/mesh/beacon-broadcast.js +4 -1
- package/mesh/darshan.js +17 -5
- package/mesh/gumba.js +47 -13
- package/mesh/jhilke.js +651 -0
- package/mesh/katha.js +5 -2
- package/mesh/nakpak-routing.js +8 -5
- package/mesh/network.js +724 -34
- package/mesh/pulse-sync.js +4 -1
- package/mesh/seva.js +526 -0
- package/mesh/sherpa-discovery.js +89 -8
- package/mesh/sybil-defense.js +19 -5
- package/mesh/temporal-encoder.js +4 -3
- package/mesh/yurt.js +72 -17
- package/models/entropy-sentinel.onnx +0 -0
- package/models/karma-trust.onnx +0 -0
- package/models/manifest.json +43 -0
- package/models/sakshi-anomaly.onnx +0 -0
- package/oracle/code-proof-protocol.js +7 -6
- package/oracle/codebase-lock.js +257 -28
- package/oracle/index.js +74 -15
- package/oracle/ma902-snmp.js +678 -0
- package/oracle/module-sealer.js +5 -3
- package/oracle/packet-checksum.js +201 -0
- package/oracle/ternary-144t.js +714 -0
- package/oracle/ternary-ml.js +481 -0
- package/oracle/time-api.js +239 -0
- package/oracle/time-source.js +137 -47
- package/oracle/validation-oracle-hardened.js +1111 -1071
- package/oracle/validation-oracle.js +4 -2
- package/oracle/ypc27.js +211 -0
- package/package.json +20 -3
- package/protocol/yak-handler.js +35 -9
- package/protocol/yak-protocol.js +6 -5
- package/reference/cpp/yakmesh_mceliece_shard.cpp +168 -0
- package/reference/cpp/yakmesh_ypc27.cpp +179 -0
- package/sbom.json +87 -0
- package/scripts/security-audit.mjs +264 -0
- package/scripts/update-docs-sidebar.cjs +164 -0
- package/security/crypto-config.js +4 -3
- package/security/dharma-moderation.js +4 -3
- package/security/doko-identity.js +193 -143
- package/security/domain-consensus.js +86 -85
- package/security/fs-hardening.js +620 -0
- package/security/hardware-attestation.js +5 -3
- package/security/hybrid-trust.js +227 -87
- package/security/karma-rate-limiter.js +692 -0
- package/security/khata-protocol.js +22 -21
- package/security/khata-trust-integration.js +277 -150
- package/security/memory-safety.js +635 -0
- package/security/mesh-auth.js +11 -10
- package/security/mesh-revocation.js +18 -5
- package/security/namche-gateway.js +298 -69
- package/security/sakshi.js +102 -3
- package/security/sangha.js +770 -0
- package/security/secure-config.js +473 -0
- package/security/silicon-parity.js +13 -10
- package/security/steadywatch.js +1142 -0
- package/security/strike-system.js +32 -3
- package/security/temporal-signing.js +488 -0
- package/security/trit-commitment.js +464 -0
- package/server/crypto/annex.js +247 -0
- package/server/darshan-api.js +343 -0
- package/server/index.js +3259 -362
- package/server/komm-api.js +668 -0
- package/utils/accel.js +2273 -0
- package/utils/ternary-id.js +79 -0
- package/utils/verify-worker.js +57 -0
- package/webserver/index.js +95 -5
- package/assets/yakmesh-logo.png +0 -0
- package/assets/yakmesh-logo.svg +0 -80
- package/assets/yakmesh-logo2.png +0 -0
- package/assets/yakmesh-logo2sm.png +0 -0
- package/assets/ymsm.png +0 -0
- package/scripts/update-docs-nav.cjs +0 -194
- package/update-docs-nav.cjs +0 -18
- package/update-nav.ps1 +0 -16
- package/website/assets/silhouettes/adapters.svg +0 -107
- package/website/assets/silhouettes/api-endpoints.svg +0 -115
- package/website/assets/silhouettes/atomic-clock.svg +0 -83
- package/website/assets/silhouettes/base-camp.svg +0 -81
- package/website/assets/silhouettes/bridge.svg +0 -69
- package/website/assets/silhouettes/docs-bundle.svg +0 -113
- package/website/assets/silhouettes/doko-basket.svg +0 -70
- package/website/assets/silhouettes/fortress.svg +0 -93
- package/website/assets/silhouettes/gateway.svg +0 -54
- package/website/assets/silhouettes/gears.svg +0 -93
- package/website/assets/silhouettes/globe-satellite.svg +0 -67
- package/website/assets/silhouettes/karma-wheel.svg +0 -137
- package/website/assets/silhouettes/lama-council.svg +0 -141
- package/website/assets/silhouettes/mandala-network.svg +0 -169
- package/website/assets/silhouettes/mani-stones.svg +0 -149
- package/website/assets/silhouettes/mantra-wheel.svg +0 -116
- package/website/assets/silhouettes/mesh-nodes.svg +0 -113
- package/website/assets/silhouettes/nakpak.svg +0 -56
- package/website/assets/silhouettes/peak-lightning.svg +0 -73
- package/website/assets/silhouettes/sherpa.svg +0 -69
- package/website/assets/silhouettes/stupa-tower.svg +0 -119
- package/website/assets/silhouettes/tattva-eye.svg +0 -78
- package/website/assets/silhouettes/terminal.svg +0 -74
- package/website/assets/silhouettes/webserver.svg +0 -145
- package/website/assets/silhouettes/yak.svg +0 -78
- package/website/assets/yakmesh-logo.png +0 -0
- package/website/assets/yakmesh-logo.webp +0 -0
- package/website/assets/yakmesh-logo128x140.webp +0 -0
- package/website/assets/yakmesh-logo2.png +0 -0
- package/website/assets/yakmesh-logo2.svg +0 -51
- package/website/assets/yakmesh-logo40x44.webp +0 -0
- package/website/assets/yakmesh.gif +0 -0
- package/website/assets/yakmesh.ico +0 -0
- package/website/assets/yakmesh.jpg +0 -0
- package/website/assets/yakmesh.pdf +0 -0
- package/website/assets/yakmesh.png +0 -0
- package/website/assets/yakmesh.svg +0 -70
- package/website/assets/yakmesh128.webp +0 -0
- package/website/assets/yakmesh32.png +0 -0
- package/website/assets/yakmesh32.svg +0 -65
- package/website/assets/yakmesh32o.ico +0 -2
- package/website/assets/yakmesh32o.svg +0 -65
- package/website/assets/yakmesh32o.svgz +0 -0
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
# mTLS Research: Node-to-Node Authentication for YAKMESH
|
|
2
|
+
|
|
3
|
+
**Date**: 2026-01-18
|
|
4
|
+
**Status**: Research Document
|
|
5
|
+
**Related**: NAMCHE Specification, Domain Consensus
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Executive Summary
|
|
10
|
+
|
|
11
|
+
This document explores how mutual TLS (mTLS) can enhance YAKMESH's node-to-node authentication, complementing the existing ML-DSA-65 signature-based authentication with transport-level security.
|
|
12
|
+
|
|
13
|
+
**Key Findings:**
|
|
14
|
+
1. mTLS without central CA is achievable using self-signed certificates bound to node identity
|
|
15
|
+
2. Post-quantum TLS 1.3 with ML-KEM is emerging as a standard
|
|
16
|
+
3. YAKMESH's existing DOKO certificates can serve as the trust anchor
|
|
17
|
+
4. Hybrid approach recommended: ML-DSA-65 signatures + mTLS for defense-in-depth
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 1. The Challenge
|
|
22
|
+
|
|
23
|
+
### Current State
|
|
24
|
+
YAKMESH nodes currently authenticate at the **application layer**:
|
|
25
|
+
- Messages are signed with ML-DSA-65 (post-quantum)
|
|
26
|
+
- Signatures are verified by receiving nodes
|
|
27
|
+
- Transport (WebSocket) may or may not use TLS
|
|
28
|
+
|
|
29
|
+
### The Gap
|
|
30
|
+
Without transport-layer authentication:
|
|
31
|
+
- Network observers can see connection metadata
|
|
32
|
+
- Man-in-the-middle attacks require active signature forging (hard but not impossible)
|
|
33
|
+
- No forward secrecy for message content
|
|
34
|
+
|
|
35
|
+
### Goal
|
|
36
|
+
Add **mutual TLS** where both client and server present certificates, providing:
|
|
37
|
+
- Transport encryption (confidentiality)
|
|
38
|
+
- Endpoint authentication (both sides verified)
|
|
39
|
+
- Forward secrecy (ephemeral keys)
|
|
40
|
+
- Post-quantum security (when using ML-KEM)
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 2. mTLS Without Central CA
|
|
45
|
+
|
|
46
|
+
### The Traditional Problem
|
|
47
|
+
Standard mTLS requires a Certificate Authority (CA) that both parties trust.
|
|
48
|
+
In a decentralized network, there is no central CA.
|
|
49
|
+
|
|
50
|
+
### Solution: Self-Certifying Identities
|
|
51
|
+
|
|
52
|
+
YAKMESH already has the primitives:
|
|
53
|
+
1. **Node Identity** = ML-DSA-65 keypair
|
|
54
|
+
2. **DOKO Certificate** = Self-signed identity document
|
|
55
|
+
3. **KHATA Protocol** = Certificate distribution
|
|
56
|
+
|
|
57
|
+
We can create TLS certificates that:
|
|
58
|
+
- Are self-signed by the node's ML-DSA-65 key
|
|
59
|
+
- Bind the TLS certificate to the DOKO
|
|
60
|
+
- Are verified against known DOKOs, not a CA
|
|
61
|
+
|
|
62
|
+
### Certificate Chain
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
┌─────────────────────────────────────────┐
|
|
66
|
+
│ DOKO (Distributed Ownership Key Object)│
|
|
67
|
+
│ - Signed by node's ML-DSA-65 key │
|
|
68
|
+
│ - Contains nodeId, publicKey │
|
|
69
|
+
│ - Verified via NAMCHE 7-gate check │
|
|
70
|
+
└─────────────────────────────────────────┘
|
|
71
|
+
│
|
|
72
|
+
│ binds to
|
|
73
|
+
▼
|
|
74
|
+
┌─────────────────────────────────────────┐
|
|
75
|
+
│ TLS Certificate │
|
|
76
|
+
│ - X.509 format for compatibility │
|
|
77
|
+
│ - Subject: nodeId │
|
|
78
|
+
│ - Public Key: derived from DOKO │
|
|
79
|
+
│ - Signed by: node's private key │
|
|
80
|
+
│ - Extension: DOKO hash reference │
|
|
81
|
+
└─────────────────────────────────────────┘
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Verification Process
|
|
85
|
+
|
|
86
|
+
When Node A connects to Node B:
|
|
87
|
+
|
|
88
|
+
1. **TLS Handshake** - Certificates exchanged
|
|
89
|
+
2. **Extract nodeId** - From certificate subject
|
|
90
|
+
3. **Lookup DOKO** - Via KHATA protocol or local cache
|
|
91
|
+
4. **Verify Binding** - Certificate pubkey matches DOKO pubkey
|
|
92
|
+
5. **NAMCHE Verify** - Run 7-gate verification on DOKO
|
|
93
|
+
6. **Accept/Reject** - Based on verification result
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 3. Post-Quantum TLS
|
|
98
|
+
|
|
99
|
+
### Current Options
|
|
100
|
+
|
|
101
|
+
| Option | Algorithm | Status | Notes |
|
|
102
|
+
|--------|-----------|--------|-------|
|
|
103
|
+
| **Hybrid TLS 1.3** | X25519 + ML-KEM-768 | Draft IETF | Best near-term option |
|
|
104
|
+
| **Pure ML-KEM** | ML-KEM-768/1024 | Draft IETF | Future standard |
|
|
105
|
+
| **ML-DSA in TLS** | ML-DSA-65/87 | Experimental | For signatures |
|
|
106
|
+
|
|
107
|
+
### ML-KEM Integration
|
|
108
|
+
|
|
109
|
+
ML-KEM (formerly Kyber) provides post-quantum key encapsulation:
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
TLS 1.3 Handshake with Hybrid Key Exchange:
|
|
113
|
+
|
|
114
|
+
Client Server
|
|
115
|
+
│ │
|
|
116
|
+
│──── ClientHello ───────────────────────▶│
|
|
117
|
+
│ + key_share: X25519 + ML-KEM-768 │
|
|
118
|
+
│ │
|
|
119
|
+
│◀─── ServerHello ────────────────────────│
|
|
120
|
+
│ + key_share: X25519 + ML-KEM-768 │
|
|
121
|
+
│ │
|
|
122
|
+
│ [Encrypted with hybrid shared key] │
|
|
123
|
+
│◀─── Certificate (ML-DSA-65 signed) ─────│
|
|
124
|
+
│◀─── CertificateVerify ──────────────────│
|
|
125
|
+
│◀─── Finished ───────────────────────────│
|
|
126
|
+
│ │
|
|
127
|
+
│──── Certificate (ML-DSA-65 signed) ────▶│
|
|
128
|
+
│──── CertificateVerify ─────────────────▶│
|
|
129
|
+
│──── Finished ──────────────────────────▶│
|
|
130
|
+
│ │
|
|
131
|
+
│ [Application Data, fully encrypted] │
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Node.js Support
|
|
135
|
+
|
|
136
|
+
As of 2026, Node.js support for post-quantum TLS is emerging:
|
|
137
|
+
|
|
138
|
+
```javascript
|
|
139
|
+
// Future API (when available)
|
|
140
|
+
const tls = require('tls');
|
|
141
|
+
|
|
142
|
+
const options = {
|
|
143
|
+
// Hybrid key exchange
|
|
144
|
+
cipherSuites: ['TLS_AES_256_GCM_SHA384'],
|
|
145
|
+
groups: ['x25519_mlkem768', 'x25519'], // Hybrid, fallback to classical
|
|
146
|
+
|
|
147
|
+
// ML-DSA certificate
|
|
148
|
+
cert: loadMLDSACertificate(),
|
|
149
|
+
key: loadMLDSAPrivateKey(),
|
|
150
|
+
|
|
151
|
+
// Custom verification
|
|
152
|
+
requestCert: true,
|
|
153
|
+
rejectUnauthorized: false, // We verify manually
|
|
154
|
+
checkServerIdentity: verifyDoko,
|
|
155
|
+
};
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 4. Integration with NAMCHE
|
|
161
|
+
|
|
162
|
+
### Enhanced DOKO with TLS Binding
|
|
163
|
+
|
|
164
|
+
```javascript
|
|
165
|
+
{
|
|
166
|
+
// ... existing DOKO fields ...
|
|
167
|
+
|
|
168
|
+
// TLS binding (optional)
|
|
169
|
+
"tls": {
|
|
170
|
+
// X.509 certificate fingerprint
|
|
171
|
+
"certFingerprint": "sha256:AB:CD:EF:...",
|
|
172
|
+
|
|
173
|
+
// Certificate validity
|
|
174
|
+
"certIssuedAt": 1737200000000,
|
|
175
|
+
"certExpiresAt": 1768736000000,
|
|
176
|
+
|
|
177
|
+
// Supported TLS features
|
|
178
|
+
"supports": {
|
|
179
|
+
"tls13": true,
|
|
180
|
+
"mlkem": true,
|
|
181
|
+
"hybridKeyExchange": true,
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Verification Flow
|
|
188
|
+
|
|
189
|
+
```javascript
|
|
190
|
+
async function verifyTLSConnection(peerCert, peerDoko) {
|
|
191
|
+
// 1. Verify DOKO via NAMCHE gateway
|
|
192
|
+
const dokoResult = await namcheGateway.verify(peerDoko);
|
|
193
|
+
if (!dokoResult.valid) {
|
|
194
|
+
throw new Error(`DOKO verification failed: ${dokoResult.reason}`);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// 2. Verify TLS certificate binds to DOKO
|
|
198
|
+
const certPubKey = extractPublicKey(peerCert);
|
|
199
|
+
const dokoPubKey = peerDoko.publicKey;
|
|
200
|
+
|
|
201
|
+
if (certPubKey !== dokoPubKey) {
|
|
202
|
+
throw new Error('TLS certificate does not match DOKO public key');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// 3. Verify certificate fingerprint if specified in DOKO
|
|
206
|
+
if (peerDoko.tls?.certFingerprint) {
|
|
207
|
+
const actualFingerprint = computeCertFingerprint(peerCert);
|
|
208
|
+
if (actualFingerprint !== peerDoko.tls.certFingerprint) {
|
|
209
|
+
throw new Error('Certificate fingerprint mismatch');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// 4. Check certificate validity
|
|
214
|
+
const now = Date.now();
|
|
215
|
+
if (peerCert.validFrom > now || peerCert.validTo < now) {
|
|
216
|
+
throw new Error('Certificate expired or not yet valid');
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return { verified: true, nodeId: peerDoko.nodeId };
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## 5. Certificate Pinning Strategy
|
|
226
|
+
|
|
227
|
+
### Recommended Approach
|
|
228
|
+
|
|
229
|
+
For YAKMESH, we recommend **DOKO-based pinning**:
|
|
230
|
+
|
|
231
|
+
```javascript
|
|
232
|
+
class DokoPinning {
|
|
233
|
+
constructor() {
|
|
234
|
+
this.pinnedDokos = new Map(); // nodeId -> DOKO
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
pin(doko) {
|
|
238
|
+
// Only pin after NAMCHE verification
|
|
239
|
+
this.pinnedDokos.set(doko.nodeId, {
|
|
240
|
+
publicKey: doko.publicKey,
|
|
241
|
+
dokoHash: computeDokoHash(doko),
|
|
242
|
+
pinnedAt: Date.now(),
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
verify(nodeId, presentedCert) {
|
|
247
|
+
const pinned = this.pinnedDokos.get(nodeId);
|
|
248
|
+
if (!pinned) {
|
|
249
|
+
// No pin = first contact, verify via NAMCHE
|
|
250
|
+
return { pinned: false };
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Check certificate matches pinned public key
|
|
254
|
+
const certPubKey = extractPublicKey(presentedCert);
|
|
255
|
+
if (certPubKey !== pinned.publicKey) {
|
|
256
|
+
throw new Error('Certificate does not match pinned identity');
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
return { pinned: true, since: pinned.pinnedAt };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Key Rotation
|
|
265
|
+
|
|
266
|
+
When a node rotates keys:
|
|
267
|
+
|
|
268
|
+
1. Old DOKO is revoked via KHATA
|
|
269
|
+
2. New DOKO is announced
|
|
270
|
+
3. Peers update their pins via KHATA messages
|
|
271
|
+
4. Grace period allows both old and new to be accepted
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 6. Implementation Phases
|
|
276
|
+
|
|
277
|
+
### Phase 1: Optional TLS (Current Compatible)
|
|
278
|
+
- Nodes can optionally use TLS for transport
|
|
279
|
+
- No mTLS requirement
|
|
280
|
+
- SHERPA beacon advertises TLS capability
|
|
281
|
+
|
|
282
|
+
### Phase 2: TLS with DOKO Binding
|
|
283
|
+
- TLS certificates bound to DOKOs
|
|
284
|
+
- mTLS between consenting nodes
|
|
285
|
+
- Classical crypto (X25519, Ed25519 fallback)
|
|
286
|
+
|
|
287
|
+
### Phase 3: Hybrid Post-Quantum TLS
|
|
288
|
+
- ML-KEM for key exchange
|
|
289
|
+
- ML-DSA for signatures
|
|
290
|
+
- Fallback to classical for compatibility
|
|
291
|
+
|
|
292
|
+
### Phase 4: Pure Post-Quantum
|
|
293
|
+
- ML-KEM mandatory
|
|
294
|
+
- ML-DSA mandatory
|
|
295
|
+
- Classical algorithms deprecated
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## 7. Security Considerations
|
|
300
|
+
|
|
301
|
+
### Advantages of mTLS + DOKO
|
|
302
|
+
|
|
303
|
+
| Property | mTLS Alone | DOKO Alone | mTLS + DOKO |
|
|
304
|
+
|----------|------------|------------|-------------|
|
|
305
|
+
| Transport encryption | ✅ | ❌ | ✅ |
|
|
306
|
+
| Forward secrecy | ✅ | ❌ | ✅ |
|
|
307
|
+
| Post-quantum signatures | ❌ | ✅ | ✅ |
|
|
308
|
+
| Post-quantum key exchange | ⚠️ | ❌ | ✅ |
|
|
309
|
+
| Decentralized trust | ❌ | ✅ | ✅ |
|
|
310
|
+
| Message-level auth | ❌ | ✅ | ✅ |
|
|
311
|
+
|
|
312
|
+
### Attack Mitigation
|
|
313
|
+
|
|
314
|
+
| Attack | mTLS Protection | DOKO Protection |
|
|
315
|
+
|--------|-----------------|-----------------|
|
|
316
|
+
| Passive eavesdropping | ✅ Encrypted | - |
|
|
317
|
+
| Active MITM | ✅ Cert verification | ✅ Signature verification |
|
|
318
|
+
| Replay attacks | ⚠️ Connection only | ✅ Message timestamps |
|
|
319
|
+
| Identity spoofing | ✅ Cert pinning | ✅ NodeID derivation |
|
|
320
|
+
| Key compromise | ⚠️ Single point | ✅ Revocation via KHATA |
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## 8. Recommendations
|
|
325
|
+
|
|
326
|
+
### Short Term (Now)
|
|
327
|
+
1. Add TLS capability advertisement to SHERPA beacons
|
|
328
|
+
2. Support optional TLS for WebSocket connections
|
|
329
|
+
3. Document certificate generation for node operators
|
|
330
|
+
|
|
331
|
+
### Medium Term (6 months)
|
|
332
|
+
1. Implement DOKO-to-X.509 certificate binding
|
|
333
|
+
2. Add mTLS verification in mesh connections
|
|
334
|
+
3. Integrate with NAMCHE gateway
|
|
335
|
+
|
|
336
|
+
### Long Term (12+ months)
|
|
337
|
+
1. Adopt hybrid ML-KEM key exchange when Node.js supports it
|
|
338
|
+
2. Phase out classical-only connections
|
|
339
|
+
3. Full post-quantum mTLS
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## 9. References
|
|
344
|
+
|
|
345
|
+
1. **IETF TLS 1.3 ML-KEM**: https://datatracker.ietf.org/doc/draft-ietf-tls-mlkem
|
|
346
|
+
2. **OWASP Pinning Guide**: https://cheatsheetseries.owasp.org/cheatsheets/Pinning_Cheat_Sheet.html
|
|
347
|
+
3. **Themis Decentralized mTLS**: https://www.cs.ox.ac.uk/files/14894/3538969.3538983.pdf
|
|
348
|
+
4. **NIST FIPS 203 (ML-KEM)**: https://csrc.nist.gov/pubs/fips/203/final
|
|
349
|
+
5. **NIST FIPS 204 (ML-DSA)**: https://csrc.nist.gov/pubs/fips/204/final
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## 10. Conclusion
|
|
354
|
+
|
|
355
|
+
mTLS integration with YAKMESH's existing DOKO/NAMCHE system provides defense-in-depth:
|
|
356
|
+
|
|
357
|
+
- **DOKO** proves identity mathematically
|
|
358
|
+
- **mTLS** protects the transport layer
|
|
359
|
+
- **Together** they provide comprehensive security
|
|
360
|
+
|
|
361
|
+
The decentralized nature of YAKMESH eliminates the central CA problem - DOKOs verified through NAMCHE become the trust anchor for TLS certificate verification.
|
|
362
|
+
|
|
363
|
+
Post-quantum TLS (ML-KEM + ML-DSA) is the clear path forward, and YAKMESH's existing post-quantum signature infrastructure positions it well for this transition.
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
*"The SHERPA guides, the DOKO certifies, and the encrypted tunnel protects the journey."*
|