from __future__ import annotations
import synta
import synta.acme as acme
import synta.oids as oids
def section(title: str) -> None:
print(f"\n{'─' * 60}\n{title}\n{'─' * 60}")
DEMO_TOKEN = "LoqXcYV8q5ONbJQxbmR7SCkF3nLudld73GnNwqiTvjU"
DEMO_THUMBPRINT_B64URL = "XNpDJCeS4be1RGe8XCfv_BnFjFm8Hm-u5IfmE3QUIA"
def demo_compute_digest() -> bytes:
section("Step 1 — Compute key authorization digest (RFC 8737 §3)")
key_auth = f"{DEMO_TOKEN}.{DEMO_THUMBPRINT_B64URL}"
print(f" keyAuthorization string : {key_auth!r}")
print(f" length : {len(key_auth)} characters")
digest_bytes = synta.digest("sha256", key_auth.encode("ascii"))
print(f" SHA-256 digest (hex) : {digest_bytes.hex()}")
print(f" digest length : {len(digest_bytes)} bytes")
assert len(digest_bytes) == 32, "SHA-256 digest must be 32 bytes"
return digest_bytes
def demo_construct_authorization(digest_bytes: bytes) -> acme.AcmeAuthorization:
section("Step 2 — Construct AcmeAuthorization from digest")
auth = acme.AcmeAuthorization(digest_bytes)
print(f" repr : {repr(auth)}")
print(f" hex_digest : {auth.hex_digest}")
print(f" len : {len(auth)} bytes")
raw = bytes(auth)
assert len(raw) == 32
assert raw == digest_bytes
print(f" bytes(auth) matches digest input : OK")
return auth
def demo_der_round_trip(auth: acme.AcmeAuthorization) -> None:
section("Step 3 — DER encoding and decoding round-trip")
der = auth.to_der()
print(f" DER (hex) : {der.hex()}")
print(f" DER length : {len(der)} bytes (= 2 bytes TLV + 32 bytes value)")
assert len(der) == 34
auth2 = acme.AcmeAuthorization.from_der(der)
print(f" from_der repr : {repr(auth2)}")
assert auth == auth2, "round-trip produced different value"
print(f" Round-trip : OK")
enc = synta.Encoder(synta.Encoding.DER)
enc.encode_octet_string(bytes(auth))
raw_der = enc.finish()
auth3 = acme.AcmeAuthorization.from_der(raw_der)
assert auth3 == auth
print(f" from_der via Encoder : OK")
def demo_oid_constant() -> None:
section("Step 4 — OID lookup: id-pe-acmeIdentifier")
oid = acme.ID_PE_ACME_IDENTIFIER
print(f" acme.ID_PE_ACME_IDENTIFIER : {oid}")
assert str(oid) == "1.3.6.1.5.5.7.1.31"
oid2 = oids.PE_ACME_IDENTIFIER
print(f" oids.PE_ACME_IDENTIFIER : {oid2}")
assert str(oid2) == "1.3.6.1.5.5.7.1.31"
print(f" OID arc: id-pkix.id-pe.31 (id-pe-acmeIdentifier)")
print(f" OID assertion : OK")
def demo_extension_note(auth: "acme.AcmeAuthorization") -> None:
section("Step 5 — How to embed in a validation certificate (note)")
ext_value_der = auth.to_der()
print(
" Per RFC 8737 §3, the validation certificate must carry:\n"
" - SAN: exactly one dNSName equal to the domain under validation\n"
" - Extension OID: 1.3.6.1.5.5.7.1.31 (id-pe-acmeIdentifier)\n"
" - Critical: TRUE (must be marked critical)\n"
" - extnValue: the DER encoding of the Authorization OCTET STRING"
)
print(f"\n extnValue content (hex) : {ext_value_der.hex()}")
print(f" extnValue length : {len(ext_value_der)} bytes")
recovered = acme.AcmeAuthorization.from_der(ext_value_der)
assert recovered == auth
print(f" Decode from cert extnValue : OK")
print(
"\n Note: the certificate MUST NOT be served outside of acme-tls/1\n"
" ALPN negotiation (RFC 8737 §3 / RFC 7301)."
)
def main() -> None:
print("=== ACME TLS-ALPN-01 Extension Example (RFC 8737) ===")
digest_bytes = demo_compute_digest()
auth = demo_construct_authorization(digest_bytes)
demo_der_round_trip(auth)
demo_oid_constant()
demo_extension_note(auth)
print("\nAll steps completed successfully.")
if __name__ == "__main__":
main()