SaQura Kotlin · Upgrade-Hinweise

Versionen & Kompatibilität — SaQura Kotlin

Vor dem Update

Aktuelle Version: 1.2.1 · Maven Central · jp.co.kyototech:saqura · zur Dokumentation

  • Daten aus jeder veröffentlichten Version (1.1.1 bis 1.2.1) werden von 1.2.1 gelesen; kein Format hat sich seit der ersten Veröffentlichung geändert.
  • Ihre Lizenzdatei bleibt gültig. Seit 1.2.0 gibt es optionale Bindungsfelder; eine Lizenz ohne diese Felder verhält sich byte-identisch wie zuvor.
  • Die Keep-Regeln für R8 liefert die Bibliothek als consumer-rules im AAR mit; in Ihrer App ist nichts zu ergänzen. Die MLS-Bibliotheken sind optional und lassen sich ausschließen.
  • Mindest-Plattform ist Android 8.0 (API 26): Das Paket-Manifest erlaubt API 24, aber Lizenzprüfung und Passwort-Hashing nutzen java.time, das erst ab API 26 vorhanden ist. Wer 24 oder 25 bedienen muss, aktiviert Core-Library-Desugaring in der eigenen App.

Die Tabellen unter jeder Version beantworten dieselben fünf Fragen in derselben Reihenfolge. „Drop-in-Update: Ja“ heißt: Unser plattformübergreifender Testkorpus hat belegt, dass die neue Version die Daten der vorherigen liest und kein Aufruf geändert werden muss.

Optionale Module

  • MLS (RFC 9420, ab 1.2.0) hat einen eigenen Ladepfad: libsaqura_mls.so und libsaqura_mls_jni.so werden erst beim ersten MLS-Aufruf geladen. Größe je ABI: arm64-v8a 1,18 MB, x86_64 1,47 MB, armeabi-v7a 0,90 MB, x86 1,54 MB (jeweils plus etwa 17 KB JNI-Brücke).
  • Wer MLS nicht nutzt, schließt die beiden Bibliotheken im App-Modul aus: android { packaging { jniLibs { excludes += listOf("**/libsaqura_mls.so", "**/libsaqura_mls_jni.so") } } }. Alle anderen Funktionen laufen unverändert; nur ein MLS-Aufruf würde dann mit einem Ladefehler scheitern.
  • Nicht optional: liboqs.so und libsaqura_oqs.so (Post-Quanten-Verfahren) für alle vier ABIs arm64-v8a, armeabi-v7a, x86, x86_64. Die 64-Bit-Bibliotheken sind seit 1.2.1 auf 16-KB-Seiten ausgerichtet.
  • Abhängigkeit im POM: org.bouncycastle:bcprov-jdk18on (X25519 für Gen8 ab API 24) sowie kotlinx-coroutines.

Lizenzen & App-Bindung

  • Ungebundene Lizenzen sind von der App-Bindung nicht betroffen: kein Aufruf ändert sich, keine Neuausstellung nötig.
  • Gebundene Distributions-Lizenzen (ab 1.2.0) prüfen den Package-Namen und das Signaturzertifikat, die das Betriebssystem meldet. Rufen Sie beim App-Start ApiLicense.initialize(context) auf, damit die Bibliothek beides lesen kann.
  • boundSignature ist der SHA-256-Fingerabdruck des Zertifikats, mit dem die App auf dem Gerät signiert ist. Bei Google Play App Signing ist das der App-Signing-Schlüssel aus der Play Console, nicht Ihr Upload-Schlüssel. Mehrere Fingerabdrücke (etwa zusätzlich Upload- und Debug-Zertifikat) sind als Liste möglich.

1.2.1 · 2026-07-31

16-KB-Seitenausrichtung der 64-Bit-Bibliotheken

  • Google Play lehnt App-Bundles mit targetSdk 35 oder höher ab, deren native 64-Bit-Bibliotheken nicht auf 16-KB-Seiten ausgerichtet sind. Bis 1.2.0 waren die gebündelten Bibliotheken mit 4 KB gelinkt; eine App mit SaQura konnte nicht hochgeladen werden. Jetzt melden alle Bibliotheken auf arm64-v8a und x86_64 eine LOAD-Ausrichtung von 0x4000.
  • Die 32-Bit-ABIs sind von der Play-Regel nicht betroffen und unverändert. Keine Änderung an API, Format oder Verhalten; reiner Bauwechsel.
KompatibilitätStandHinweis
Datenformate (Schlüssel, Chiffrate, Streams)unverändert
Lizenzdateien (gebunden / ungebunden)unverändert
Native Bibliotheken / ABIgeändertNur Ausrichtung der 64-Bit-Bibliotheken; Namen und Anzahl unverändert.
R8-/Keep-Regeln, Trimming / Linkerunverändert
Mindest-PlattformunverändertAndroid 8.0 (API 26)
Drop-in-Update?Ja

1.2.0 · 2026-06-26

MLS-Gruppennachrichten (RFC 9420) und App-Bindung

  • Neues Paket co.kyototech.saqura.mls: SaQuraMLS (configure, generateKeyPackage, createGroup, joinGroup, loadGroup), MLSGroup (addMembers, removeMembers, update, processHandshake, encrypt, decrypt, members, epoch, serialize) sowie die Schnittstellen MLSSigner und MLSStorageProvider. Zwei Suiten: p256Standard (0x0002, RFC-9420-Standard, interoperabel) und saquraGen8Hybrid (0xF108, X25519 mit ML-KEM-768).
  • Die MLS-Bytes sind identisch mit dem Swift-SDK (auf Geräten geprüft, auch Kotlin liest Swift-Verkehr). Die Signatur läuft über Ihren MLSSigner (etwa ein P-256-Schlüssel im Android-Keystore); der private Signaturschlüssel gelangt nie in die Bibliothek. Aktive Operationen (erstellen, beitreten, senden, Mitglieder ändern) ab Pro; Lesen und Wiederherstellen bestehender Gruppen offen.
  • Zwei zusätzliche native Bibliotheken je ABI (libsaqura_mls.so, libsaqura_mls_jni.so), geladen erst beim ersten MLS-Aufruf; ausschließbar, siehe „Optionale Module“.
  • App-Bindung: Die optionalen Lizenzfelder boundPackage und boundSignature binden eine Distributions-Lizenz an Package-Name und SHA-256 des Signaturzertifikats, beides vom Betriebssystem gelesen (ApiLicense.initialize(context) beim App-Start). Eine kopierte Lizenzdatei in einer fremden App wird abgelehnt. Lizenzen ohne diese Felder sind byte-identisch und verhalten sich wie bisher.
  • Keine Änderung an den AES-, RSA-, Quantum-, Streaming-, Lizenz- und Passwort-APIs oder ihren Formaten.
KompatibilitätStandHinweis
Datenformate (Schlüssel, Chiffrate, Streams)neu, additivMLS neu; alle bisherigen Formate unverändert.
Lizenzdateien (gebunden / ungebunden)neu, additivOptionale Bindungsfelder; ungebundene Lizenzen byte-identisch.
Native Bibliotheken / ABIneu, additivZwei MLS-Bibliotheken je ABI, ausschließbar.
R8-/Keep-Regeln, Trimming / Linkerneu, additivKeep-Regeln für das MLS-Paket in den mitgelieferten consumer-rules; automatisch wirksam.
Mindest-PlattformunverändertAndroid 8.0 (API 26)
Drop-in-Update?Ja

1.1.4 · 2026-06-16

Absturz der Post-Quanten-Funktionen in Release-Builds behoben

  • In minimierten Release-Builds brachen Quantum.* und QuantumSignature.* beim ersten Aufruf ab (betroffen 1.1.1, 1.1.2 und 1.1.3): R8 entfernte Felder, die nur die native Schicht liest. Behoben durch Keep-Regeln, die die Bibliothek als consumer-rules im AAR mitliefert; in Ihrer App ist nichts zu ergänzen.
  • Keine Änderung an API, Format oder Verhalten. Apps auf 1.1.1 bis 1.1.3, die Post-Quanten-Funktionen auf Android nutzen, sollten aktualisieren.
KompatibilitätStandHinweis
Datenformate (Schlüssel, Chiffrate, Streams)unverändert
Lizenzdateien (gebunden / ungebunden)unverändert
Native Bibliotheken / ABIunverändert
R8-/Keep-Regeln, Trimming / LinkergeändertKeep-Regeln korrigiert und mitgeliefert; nichts zu tun.
Mindest-PlattformunverändertAndroid 8.0 (API 26)
Drop-in-Update?Ja

1.1.3 · 2026-06-06

Streaming-Verschlüsselung für große Dateien (SQS1)

  • Neues Paket co.kyototech.saqura.streaming: encryptStreamFile / decryptStreamFile, InputStream.encryptStream / decryptStream, readStreamInfo und countCompleteSegments (Wiederaufnahme). Konstanter Speicher (etwa zweimal Segmentgröße, Standard 1 MiB), unabhängig von der Dateigröße.
  • Zwei AEAD-Suiten per Kopfdaten (AES-256-GCM, ChaCha20-Poly1305) und der Post-Quanten-Umschlag StreamingEnvelope.encryptFile / decryptFile (Pro) mit Sidecar-Datei .saqkey oder eingebettetem Schlüssel. Streaming ab Standard, Umschlag ab Pro. Rein additiv; byte-identisch mit .NET und Swift.
KompatibilitätStandHinweis
Datenformate (Schlüssel, Chiffrate, Streams)neu, additivNeues Format SQS1; alle bisherigen Formate unverändert.
Lizenzdateien (gebunden / ungebunden)unverändert
Native Bibliotheken / ABIunverändert
R8-/Keep-Regeln, Trimming / Linkerunverändert
Mindest-PlattformunverändertAndroid 8.0 (API 26)
Drop-in-Update?Ja

1.1.2 · 2026-06-05

NIST-Post-Quanten-Verfahren: Gen8, ML-DSA, SLH-DSA

  • Gen8 (X25519 mit ML-KEM, FIPS 203) über die bestehende Quantum-Oberfläche mit QuantumGeneration.GEN8. Signaturen ML-DSA (FIPS 204, 44 / 65 / 87) und SLH-DSA (FIPS 205, 128f / 192f / 256f) über QuantumSignature und SignatureAlgorithm. Signieren ab Pro, Verifizieren in jeder Stufe. Byte-identisch mit .NET und Swift.
  • Gebündeltes liboqs auf 0.15.0 neu gebaut (alle vier ABIs). Neue Abhängigkeit org.bouncycastle:bcprov-jdk18on im POM (X25519 ab API 24).
KompatibilitätStandHinweis
Datenformate (Schlüssel, Chiffrate, Streams)neu, additivNeue Verfahren; bisherige Generationen unverändert.
Lizenzdateien (gebunden / ungebunden)unverändert
Native Bibliotheken / ABIgeändertliboqs neu gebaut; neue Abhängigkeit BouncyCastle im POM.
R8-/Keep-Regeln, Trimming / Linkerunverändert
Mindest-PlattformunverändertAndroid 8.0 (API 26)
Drop-in-Update?Ja

1.1.1 · 2026-05-27

Erste Veröffentlichung auf Maven Central

  • Funktionsgleich mit SaQura für .NET 1.0.8 und Swift 1.0.8: AES-256-GCM (String und ByteArray), AES-CBC mit HMAC-SHA256 nur zum Lesen alter Chiffrate, PBKDF2-SHA512, RSA-4096 (OAEP, PSS, Hybrid für große Nutzdaten, PEM-Import PKCS#1/PKCS#8/SPKI), Passwort-Hashing mit JSON-Umschlag, Post-Quanten-Verschlüsselung (FrodoKEM, Classic McEliece, Gen7-Hybrid) über gebündeltes liboqs für alle vier ABIs, Lizenzierung per .lic-Datei mit Ablage in EncryptedSharedPreferences.
  • Alle Formate byte-identisch mit .NET und Swift, einschließlich der Freistufen-Kennzeichnung. Kotlin-idiomatisch (suspend-Funktionen, Erweiterungen auf String und ByteArray), jede öffentliche API auch aus Java erreichbar.
KompatibilitätStandHinweis
Datenformate (Schlüssel, Chiffrate, Streams)AusgangsstandAusgangsstand; byte-identisch mit .NET 1.0.8 und Swift 1.0.8.
Lizenzdateien (gebunden / ungebunden)Ausgangsstand
Native Bibliotheken / ABIAusgangsstandliboqs.so und libsaqura_oqs.so für arm64-v8a, armeabi-v7a, x86, x86_64.
R8-/Keep-Regeln, Trimming / LinkerAusgangsstandconsumer-rules im AAR.
Mindest-PlattformAusgangsstandAndroid 8.0 (API 26)
Drop-in-Update?JaErste Version.