SaQura Swift · Upgrade notes

Versions & compatibility — SaQura Swift

Before you update

Current version: 1.2.0 · saqura.de/swift · SaQura (binary xcframework) · to the documentation

  • Data from every version delivered via saqura.de (1.0.9 to 1.2.0) is read by 1.2.0; no format has changed in this series. RSA hybrid ciphertexts in the old format (before 1.0.8) are still decrypted.
  • Your license file stays valid. Since 1.2.0 there are optional binding fields; a license without them behaves byte-identically to before.
  • The package is a single xcframework (about 10 MB as ZIP), added as a binaryTarget with URL and checksum in Package.swift. On a version change the URL and checksum change; Xcode reports a wrong checksum as an error.

The tables under each version answer the same five questions in the same order. “Drop-in update: yes” means: our cross-platform test corpus has shown that the new version reads the data of the previous one and no call needs to change.

Optional modules

  • No excludable modules. The xcframework contains the post-quantum algorithms (liboqs 0.15.0) and, since 1.1.0, the MLS core; both are linked statically into the library.
  • No linker or strip work on your side; the framework comes prebuilt and signed.

Licenses & app binding

  • Unbound licenses are not affected by app binding: no call changes, no re-issue needed.
  • Bound distribution licenses (from 1.2.0) check the bundle identifier from Bundle.main; on macOS additionally, where readable, the Team ID of the code signature. No extra call needed.

1.2.0 · 2026-07-11

App binding for distribution licenses (iOS / macOS)

  • The optional license fields boundPackage and boundSignature tie a distribution license to the bundle identifier and, where the platform allows it, to the Team ID of the code signature. A copied license file in a foreign app is rejected at activation (ValidationResult.bindingMismatch). The identity comes from Bundle.main and the Security framework, never from the caller.
  • Fully backward compatible: the fields are appended only when set; unbound licenses produce the same signed text as before and verify unchanged.
CompatibilityStatusNote
Data formats (keys, ciphertexts, streams)unchanged
License files (bound / unbound)new, additiveOptional fields; unbound licenses byte-identical.
Native libraries / ABIunchanged
R8 / keep rules, trimming / linkerbaseline
Minimum platformunchangediOS 15, macOS 12, tvOS 15, watchOS 8; Swift 5.9
Drop-in update?Yes

1.1.1 · 2026-06-14

MLS: KeyPackage validity start moved back by one hour

  • A strict RFC 9420 peer rejected a SaQura KeyPackage when it validated it in the same second it was created. The validity start is now one hour earlier. Format and cryptography unchanged.
CompatibilityStatusNote
Data formats (keys, ciphertexts, streams)unchanged
License files (bound / unbound)unchanged
Native libraries / ABIunchanged
R8 / keep rules, trimming / linkerbaseline
Minimum platformunchangediOS 15, macOS 12, tvOS 15, watchOS 8; Swift 5.9
Drop-in update?Yes

1.1.0 · 2026-06-13

MLS group messaging per RFC 9420 (Pro)

  • Group messaging with TreeKEM, per-message forward secrecy, Welcome and Commit messages, signing via the Secure Enclave and persistence of the group state. Standard suite P-256 (0x0002), interoperable with other RFC 9420 implementations, checked against the MLS working group's test vectors.
  • Additional suite 0xF108 (SaQura Gen8 hybrid, X25519 with ML-KEM-768): both peers must be SaQura; deliberately not presented as a standard suite. Creating a group, generating a KeyPackage and joining from Pro; reading and restoring stays open.
  • The xcframework contains the MLS core from here on; the package size grew accordingly.
CompatibilityStatusNote
Data formats (keys, ciphertexts, streams)new, additiveMLS new; all previous formats unchanged.
License files (bound / unbound)unchanged
Native libraries / ABIchangedMLS core included in the xcframework; not excludable.
R8 / keep rules, trimming / linkerbaseline
Minimum platformunchangediOS 15, macOS 12, tvOS 15, watchOS 8; Swift 5.9
Drop-in update?Yes

1.0.9 · 2026-06-07

Gen8, ML-DSA, SLH-DSA; first delivery as a prebuilt xcframework via saqura.de

  • Gen8 (X25519 with ML-KEM, FIPS 203) via encryptWithQuantum / decryptWithQuantum with .gen8. Signatures signWithMLDsa / verifyMLDsaSignature (FIPS 204, .standard / .medium / .highest) and signWithSlhDsa / verifySlhDsaSignature (FIPS 205, 128f / 192f / 256f). Signing from Pro, verifying in every tier. Byte-identical to .NET and Kotlin.
  • Bundled liboqs raised to 0.15.0; FrodoKEM and Classic McEliece unchanged. Delivered as a signed xcframework with checksum (binaryTarget in Package.swift) instead of source.
  • From 1.0.8 (May 2026): the tier accessors ApiLicense.is…Available now follow the same rule as .NET and Kotlin (features 0 means: the tier decides); a Pro license with features 0 previously read as Free. RSA hybrid format aligned to .NET, the old format is still decrypted; PKCS#1 keys from .NET are wrapped automatically on import. From 1.0.6 and 1.0.7: typed errors QuantumOperationError (.keyGeneration / .encryption / .decryption) instead of raw errors; empty and zero-wiped key buffers are rejected with SaQuraError.invalidInput.
CompatibilityStatusNote
Data formats (keys, ciphertexts, streams)new, additiveNew algorithms; RSA hybrid in the .NET format since 1.0.8, old format readable.
License files (bound / unbound)unchangedFile format unchanged; tier evaluation corrected since 1.0.8.
Native libraries / ABIchangedDelivered as xcframework; liboqs 0.15.0.
R8 / keep rules, trimming / linkerbaseline
Minimum platformunchangediOS 15, macOS 12, tvOS 15, watchOS 8; Swift 5.9
Drop-in update?YesCode that caught Quantum errors as SaQuraError adds a branch for QuantumOperationError.