{
  "meta": {
    "api": "londopy",
    "version": "1.0.0",
    "generated": "2026-09-25T06:35:47.999Z",
    "self": "https://londopy.github.io/api/v1/projects/nxtls.json",
    "docs": "https://londopy.github.io/api/"
  },
  "data": {
    "name": "nxtls",
    "tagline": "Cryptography and a TLS 1.3 client written entirely in Nexium — SHA-2 through X.509 chain validation, with no C and no unsafe. Checked against the RFC vectors, Python's cryptography and OpenSSL 3; early, and not yet reviewed by a TLS expert.",
    "cluster": {
      "id": "security",
      "title": "Security tooling"
    },
    "languages": [
      "Nexium",
      "Python"
    ],
    "tags": [
      "cryptography",
      "tls",
      "nexium"
    ],
    "featured": false,
    "stars": 1,
    "pushed_at": "2026-09-24T08:52:39Z",
    "award": null,
    "urls": {
      "page": "https://londopy.github.io/projects/nxtls/",
      "repo": "https://github.com/Londopy/nxtls",
      "demo": null,
      "docs": null,
      "og_image": "https://londopy.github.io/og/nxtls.png",
      "api": "https://londopy.github.io/api/v1/projects/nxtls.json"
    },
    "links": [],
    "install": null,
    "writeup": {
      "html": "<h2><span class=\"hash\">##</span> What it is</h2>\n<p><strong>nxtls</strong> is cryptography and a TLS 1.3 client written entirely in <a href=\"https://londopy.github.io/projects/nexium/\">Nexium</a>, my own language — no C libraries, no <code>@cImport</code>, and not one <code>unsafe</code> block, so a reviewer can read it end to end. It exists so Nexium programs can verify signatures and speak HTTPS without handing their security to a C library. Its first real user is a Discord helper I wrote for an amateur-radio club, which checks the Ed25519 signature on every request with it and talks to Discord through its TLS client.</p>\n\n<h2><span class=\"hash\">##</span> What's in it</h2>\n<ul>\n<li><strong>Primitives</strong> — SHA-256, SHA-384 and SHA-512, HMAC with a constant-time <code>verify</code>, HKDF with TLS 1.3's <code>expand_label</code>, and X25519 and ChaCha20-Poly1305 in constant time.</li>\n<li><strong>Signature verification</strong> — Ed25519 (strict in the ways libsodium is), ECDSA on P-256 and P-384, and RSA PKCS #1 v1.5 and PSS, on top of a strict DER reader and a small Montgomery bignum.</li>\n<li><strong>X.509</strong> — path building across cross-signed CAs, validity periods, CA constraints and path lengths, key usage, and host names with wildcards.</li>\n<li><strong>TLS 1.3</strong> — a client with ChaCha20-Poly1305 and X25519 that handles HelloRetryRequest, KeyUpdate, and servers that ask for a client certificate. The protocol core is bytes in, bytes out; a separate type runs it over TCP.</li>\n</ul>\n\n<h2><span class=\"hash\">##</span> How it's tested</h2>\n<p>Every module is checked against its published vectors — FIPS 180-4 and RFCs 4231, 5869, 7748, 8032, 8439 and 8448 — and against Python's <code>cryptography</code> package, which a generator script uses as an oracle while it re-derives every constant table from its definition. The X.509 code is judged on 68 chains and 13 malformed certificates by <code>cryptography</code>'s own path validation. The TLS client replays 35 recorded exchanges byte for byte, runs against OpenSSL 3's <code>s_server</code> in twelve configurations — including the ones it must refuse: the wrong host, an expired certificate, TLS 1.2 — and connects live to Discord, GitHub, Google and Cloudflare. CI runs all of it on Linux, Windows and macOS, and fails any module that grows an <code>unsafe</code> block, a mutable global, or a foreign call.</p>\n\n<h2><span class=\"hash\">##</span> The honest part</h2>\n<p>It's new, and nobody who knows TLS has reviewed it yet — the README says so up front, and that review is the next item on the plan. It also won't fall back to a weaker source of randomness: on Windows, where it has no <code>/dev/urandom</code>, <code>tls.connect</code> says so and stops. Until that review happens, treat it as a careful reading of the RFCs, not something to trust with anything that matters.</p>",
      "text": "## What it is\n\nnxtls is cryptography and a TLS 1.3 client written entirely in Nexium, my own language — no C libraries, no @cImport, and not one unsafe block, so a reviewer can read it end to end. It exists so Nexium programs can verify signatures and speak HTTPS without handing their security to a C library. Its first real user is a Discord helper I wrote for an amateur-radio club, which checks the Ed25519 signature on every request with it and talks to Discord through its TLS client.\n\n## What's in it\n\n- Primitives — SHA-256, SHA-384 and SHA-512, HMAC with a constant-time verify, HKDF with TLS 1.3's expand_label, and X25519 and ChaCha20-Poly1305 in constant time.\n\n- Signature verification — Ed25519 (strict in the ways libsodium is), ECDSA on P-256 and P-384, and RSA PKCS #1 v1.5 and PSS, on top of a strict DER reader and a small Montgomery bignum.\n\n- X.509 — path building across cross-signed CAs, validity periods, CA constraints and path lengths, key usage, and host names with wildcards.\n\n- TLS 1.3 — a client with ChaCha20-Poly1305 and X25519 that handles HelloRetryRequest, KeyUpdate, and servers that ask for a client certificate. The protocol core is bytes in, bytes out; a separate type runs it over TCP.\n\n## How it's tested\n\nEvery module is checked against its published vectors — FIPS 180-4 and RFCs 4231, 5869, 7748, 8032, 8439 and 8448 — and against Python's cryptography package, which a generator script uses as an oracle while it re-derives every constant table from its definition. The X.509 code is judged on 68 chains and 13 malformed certificates by cryptography's own path validation. The TLS client replays 35 recorded exchanges byte for byte, runs against OpenSSL 3's s_server in twelve configurations — including the ones it must refuse: the wrong host, an expired certificate, TLS 1.2 — and connects live to Discord, GitHub, Google and Cloudflare. CI runs all of it on Linux, Windows and macOS, and fails any module that grows an unsafe block, a mutable global, or a foreign call.\n\n## The honest part\n\nIt's new, and nobody who knows TLS has reviewed it yet — the README says so up front, and that review is the next item on the plan. It also won't fall back to a weaker source of randomness: on Windows, where it has no /dev/urandom, tls.connect says so and stops. Until that review happens, treat it as a careful reading of the RFCs, not something to trust with anything that matters."
    },
    "related": [
      "kto",
      "deadpoint"
    ]
  }
}
