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.
| Compatibility | Status | Note |
|---|---|---|
| Data formats (keys, ciphertexts, streams) | unchanged | — |
| License files (bound / unbound) | new, additive | Optional fields; unbound licenses byte-identical. |
| Native libraries / ABI | unchanged | — |
| R8 / keep rules, trimming / linker | baseline | — |
| Minimum platform | unchanged | iOS 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.
| Compatibility | Status | Note |
|---|---|---|
| Data formats (keys, ciphertexts, streams) | unchanged | — |
| License files (bound / unbound) | unchanged | — |
| Native libraries / ABI | unchanged | — |
| R8 / keep rules, trimming / linker | baseline | — |
| Minimum platform | unchanged | iOS 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.
| Compatibility | Status | Note |
|---|---|---|
| Data formats (keys, ciphertexts, streams) | new, additive | MLS new; all previous formats unchanged. |
| License files (bound / unbound) | unchanged | — |
| Native libraries / ABI | changed | MLS core included in the xcframework; not excludable. |
| R8 / keep rules, trimming / linker | baseline | — |
| Minimum platform | unchanged | iOS 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.
| Compatibility | Status | Note |
|---|---|---|
| Data formats (keys, ciphertexts, streams) | new, additive | New algorithms; RSA hybrid in the .NET format since 1.0.8, old format readable. |
| License files (bound / unbound) | unchanged | File format unchanged; tier evaluation corrected since 1.0.8. |
| Native libraries / ABI | changed | Delivered as xcframework; liboqs 0.15.0. |
| R8 / keep rules, trimming / linker | baseline | — |
| Minimum platform | unchanged | iOS 15, macOS 12, tvOS 15, watchOS 8; Swift 5.9 |
| Drop-in update? | Yes | Code that caught Quantum errors as SaQuraError adds a branch for QuantumOperationError. |