Quick start =========== Installation ------------ Install from PyPI:: pip install pybergshamra Or with `uv `_:: uv add pybergshamra Requirements: Python 3.10 or later. No C compiler needed -- the package ships pre-built wheels compiled from Rust. Load a key ---------- .. code-block:: python import pybergshamra # From file (auto-detect format by extension) key = pybergshamra.load_key_file("rsakey.pem") # RSA private key from PEM bytes pem_data = open("rsakey.pem", "rb").read() key = pybergshamra.load_rsa_private_pem(pem_data) # X.509 certificate from PEM cert = pybergshamra.load_x509_cert_pem(open("cert.pem", "rb").read()) # Auto-detect any PEM type key = pybergshamra.load_pem_auto(pem_data) # Password-protected key file key = pybergshamra.load_key_file_with_password("cakey.pem", "secret123") Verify a signed XML document ----------------------------- .. code-block:: python import pybergshamra xml = open("signed.xml").read() # Set up keys manager = pybergshamra.KeysManager() key = pybergshamra.load_x509_cert_pem(open("cert.pem", "rb").read()) manager.add_key(key) # Verify ctx = pybergshamra.DsigContext(manager) result = pybergshamra.verify(ctx, xml) if result: print("Signature is valid") print("Algorithm:", result.key_info.algorithm) else: print("Invalid:", result.reason) Sign an XML template -------------------- .. code-block:: python import pybergshamra template = open("sign-template.xml").read() manager = pybergshamra.KeysManager() key = pybergshamra.load_rsa_private_pem(open("rsakey.pem", "rb").read()) manager.add_key(key) ctx = pybergshamra.DsigContext(manager) signed_xml = pybergshamra.sign(ctx, template) print(signed_xml) Encrypt data ------------ .. code-block:: python import pybergshamra template = open("enc-template.xml").read() plaintext = b"secret data" manager = pybergshamra.KeysManager() key = pybergshamra.load_x509_cert_pem(open("rsacert.pem", "rb").read()) manager.add_key(key) ctx = pybergshamra.EncContext(manager) encrypted_xml = pybergshamra.encrypt(ctx, template, plaintext) Decrypt data ------------ .. code-block:: python import pybergshamra encrypted_xml = open("encrypted.xml").read() manager = pybergshamra.KeysManager() key = pybergshamra.load_rsa_private_pem(open("rsakey.pem", "rb").read()) manager.add_key(key) ctx = pybergshamra.EncContext(manager) decrypted_xml = pybergshamra.decrypt(ctx, encrypted_xml) # Or get raw bytes (for non-UTF-8 content) decrypted_bytes = pybergshamra.decrypt_to_bytes(ctx, encrypted_xml) Canonicalize XML ---------------- .. code-block:: python import pybergshamra from pybergshamra import C14nMode xml = "" # Full document result = pybergshamra.canonicalize(xml, C14nMode.Exclusive) print(result) # With inclusive namespace prefixes result = pybergshamra.canonicalize(xml, C14nMode.Exclusive, inclusive_prefixes=["ds"]) # Subtree by element ID result = pybergshamra.canonicalize_subtree(xml, "my-element", C14nMode.Exclusive)