SaQura Kotlin · アップグレードノート
バージョンと互換性 — SaQura Kotlin
更新の前に
現在のバージョン: 1.2.1 · Maven Central · jp.co.kyototech:saqura · ドキュメントへ
- 公開済みの全バージョン(1.1.1〜1.2.1)のデータは 1.2.1 で読み取れます。初回リリース以降、形式の変更はありません。
- ライセンスファイルはそのまま有効です。1.2.0 から任意のバインディング項目が加わりましたが、この項目のないライセンスは従来とバイト単位で同一に動作します。
- R8 の keep ルールは AAR 内の consumer rules として同梱されており、アプリ側で追加するものはありません。MLS ライブラリは任意で、除外できます。
- 最小プラットフォームは Android 8.0(API 26)です。パッケージのマニフェストは API 24 を許可していますが、ライセンス検証とパスワードハッシュは API 26 以降にしか存在しない java.time を使用します。24 や 25 に対応する必要がある場合は、アプリ側でコアライブラリの脱糖(desugaring)を有効にしてください。
各バージョンの表は、同じ 5 つの質問に同じ順序で答えます。「ドロップイン更新:可」とは、当社のクロスプラットフォームのテストコーパスにより、新バージョンが旧バージョンのデータを読み取れ、呼び出しの変更が不要であることが確認されたという意味です。
任意モジュール
- MLS(RFC 9420、1.2.0 以降)は独自のロードパスを持ち、libsaqura_mls.so と libsaqura_mls_jni.so は最初の MLS 呼び出し時にのみロードされます。ABI ごとのサイズ:arm64-v8a 1.18 MB、x86_64 1.47 MB、armeabi-v7a 0.90 MB、x86 1.54 MB(それぞれ約 17 KB の JNI ブリッジを加算)。
- MLS を使用しない場合は、アプリモジュールで 2 つのライブラリを除外します:android { packaging { jniLibs { excludes += listOf("**/libsaqura_mls.so", "**/libsaqura_mls_jni.so") } } }。他の機能はすべてそのまま動作し、MLS の呼び出しのみロードエラーになります。
- 任意ではないもの:liboqs.so と libsaqura_oqs.so(ポスト量子アルゴリズム)、4 つの ABI(arm64-v8a、armeabi-v7a、x86、x86_64)すべて。64 ビットライブラリは 1.2.1 以降 16 KB ページ境界に整列済み。
- POM の依存関係:org.bouncycastle:bcprov-jdk18on(API 24 以降の Gen8 用 X25519)と kotlinx-coroutines。
ライセンスとアプリバインディング
- 非バインドのライセンスはアプリバインディングの影響を受けません。呼び出しの変更も再発行も不要です。
- バインド済み配布ライセンス(1.2.0 以降)は、OS が報告するパッケージ名と署名証明書を検証します。ライブラリが両方を読み取れるよう、アプリ起動時に ApiLicense.initialize(context) を呼び出してください。
- boundSignature は、デバイス上でアプリに署名されている証明書の SHA-256 フィンガープリントです。Google Play アプリ署名を使う場合は、アップロード鍵ではなく Play Console のアプリ署名鍵になります。複数のフィンガープリント(アップロード証明書やデバッグ証明書を追加するなど)をリストとして指定できます。
1.2.1 · 2026-07-31
64 ビットライブラリの 16 KB ページ整列
- Google Play は、targetSdk 35 以上でネイティブ 64 ビットライブラリが 16 KB ページ境界に整列していないアプリバンドルを拒否します。1.2.0 までは同梱ライブラリが 4 KB でリンクされていたため、SaQura を含むアプリをアップロードできませんでした。現在は arm64-v8a と x86_64 のすべてのライブラリが LOAD 整列 0x4000 を報告します。
- 32 ビット ABI は Play のルールの対象外で変更ありません。API、形式、動作の変更はなく、ビルドのみの変更です。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 変更なし | — |
| ライセンスファイル(バインド有/無) | 変更なし | — |
| ネイティブライブラリ/ABI | 変更あり | 64 ビットライブラリの整列のみ。名前と数は変更なし。 |
| R8・keep ルール、トリミング/リンカ | 変更なし | — |
| 最小プラットフォーム | 変更なし | Android 8.0(API 26) |
| ドロップイン更新 | 可 | — |
1.2.0 · 2026-06-26
MLS グループメッセージング(RFC 9420)とアプリバインディング
- 新パッケージ co.kyototech.saqura.mls:SaQuraMLS(configure、generateKeyPackage、createGroup、joinGroup、loadGroup)、MLSGroup(addMembers、removeMembers、update、processHandshake、encrypt、decrypt、members、epoch、serialize)、およびインターフェース MLSSigner と MLSStorageProvider。2 つのスイート:p256Standard(0x0002、RFC 9420 標準、相互運用可能)と saquraGen8Hybrid(0xF108、X25519 と ML-KEM-768)。
- MLS のバイト列は Swift SDK と同一です(実機で検証済み、Kotlin は Swift のトラフィックも読み取れます)。署名はお客様の MLSSigner(例:Android Keystore の P-256 鍵)経由で行われ、秘密署名鍵がライブラリに渡ることはありません。アクティブな操作(作成、参加、送信、メンバー変更)は Pro 以上、既存グループの読み取りと復元は制限なし。
- ABI ごとに 2 つのネイティブライブラリ(libsaqura_mls.so、libsaqura_mls_jni.so)を追加。最初の MLS 呼び出し時にのみロードされ、除外可能です(「任意モジュール」参照)。
- アプリバインディング:任意のライセンス項目 boundPackage と boundSignature により、配布ライセンスをパッケージ名と署名証明書の SHA-256 に紐付けます。どちらも OS から読み取ります(アプリ起動時に ApiLicense.initialize(context))。他のアプリにコピーされたライセンスファイルは拒否されます。これらの項目のないライセンスはバイト単位で同一で、従来どおり動作します。
- AES、RSA、Quantum、ストリーミング、ライセンス、パスワードの各 API とその形式に変更はありません。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 追加(既存に影響なし) | MLS を追加。従来の形式はすべて変更なし。 |
| ライセンスファイル(バインド有/無) | 追加(既存に影響なし) | 任意のバインディング項目。非バインドのライセンスはバイト単位で同一。 |
| ネイティブライブラリ/ABI | 追加(既存に影響なし) | ABI ごとに MLS ライブラリを 2 つ追加、除外可能。 |
| R8・keep ルール、トリミング/リンカ | 追加(既存に影響なし) | MLS パッケージの keep ルールを同梱の consumer rules に追加。自動適用。 |
| 最小プラットフォーム | 変更なし | Android 8.0(API 26) |
| ドロップイン更新 | 可 | — |
1.1.4 · 2026-06-16
リリースビルドでのポスト量子機能のクラッシュを修正
- 縮小化されたリリースビルドで Quantum.* と QuantumSignature.* が最初の呼び出しで異常終了していました(対象 1.1.1、1.1.2、1.1.3)。ネイティブ層のみが読むフィールドを R8 が削除していたためです。ライブラリが AAR 内の consumer rules として同梱する keep ルールで修正済みで、アプリ側で追加するものはありません。
- API、形式、動作の変更はありません。Android でポスト量子機能を使う 1.1.1〜1.1.3 のアプリはアップグレードしてください。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 変更なし | — |
| ライセンスファイル(バインド有/無) | 変更なし | — |
| ネイティブライブラリ/ABI | 変更なし | — |
| R8・keep ルール、トリミング/リンカ | 変更あり | keep ルールを修正して同梱。対応不要。 |
| 最小プラットフォーム | 変更なし | Android 8.0(API 26) |
| ドロップイン更新 | 可 | — |
1.1.3 · 2026-06-06
大容量ファイル向けストリーミング暗号化(SQS1)
- 新パッケージ co.kyototech.saqura.streaming:encryptStreamFile / decryptStreamFile、InputStream.encryptStream / decryptStream、readStreamInfo、countCompleteSegments(再開用)。ファイルサイズに関係なく一定のメモリ(セグメントサイズの約 2 倍、既定 1 MiB)。
- ヘッダーによる 2 つの AEAD スイート(AES-256-GCM、ChaCha20-Poly1305)と、ポスト量子エンベロープ StreamingEnvelope.encryptFile / decryptFile(Pro)。サイドカーファイル .saqkey または埋め込み鍵。ストリーミングは Standard 以上、エンベロープは Pro 以上。純粋な追加で、.NET および Swift とバイト単位で同一。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 追加(既存に影響なし) | 新形式 SQS1。従来の形式はすべて変更なし。 |
| ライセンスファイル(バインド有/無) | 変更なし | — |
| ネイティブライブラリ/ABI | 変更なし | — |
| R8・keep ルール、トリミング/リンカ | 変更なし | — |
| 最小プラットフォーム | 変更なし | Android 8.0(API 26) |
| ドロップイン更新 | 可 | — |
1.1.2 · 2026-06-05
NIST ポスト量子アルゴリズム:Gen8、ML-DSA、SLH-DSA
- 既存の Quantum インターフェースで QuantumGeneration.GEN8 を指定して Gen8(X25519 と ML-KEM、FIPS 203)を利用可能。署名 ML-DSA(FIPS 204、44 / 65 / 87)と SLH-DSA(FIPS 205、128f / 192f / 256f)は QuantumSignature と SignatureAlgorithm 経由。署名は Pro 以上、検証は全ティア。.NET および Swift とバイト単位で同一。
- 同梱の liboqs を 0.15.0 で再ビルド(4 つの ABI すべて)。POM に新しい依存関係 org.bouncycastle:bcprov-jdk18on を追加(API 24 以降の X25519 用)。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 追加(既存に影響なし) | 新アルゴリズム追加。従来の世代は変更なし。 |
| ライセンスファイル(バインド有/無) | 変更なし | — |
| ネイティブライブラリ/ABI | 変更あり | liboqs を再ビルド。POM に BouncyCastle の依存関係を追加。 |
| R8・keep ルール、トリミング/リンカ | 変更なし | — |
| 最小プラットフォーム | 変更なし | Android 8.0(API 26) |
| ドロップイン更新 | 可 | — |
1.1.1 · 2026-05-27
Maven Central での初回リリース
- SaQura for .NET 1.0.8 および Swift 1.0.8 と機能同等:AES-256-GCM(String と ByteArray)、旧暗号文の読み取り専用 AES-CBC+HMAC-SHA256、PBKDF2-SHA512、RSA-4096(OAEP、PSS、大きなペイロード向けハイブリッド、PKCS#1/PKCS#8/SPKI の PEM インポート)、JSON エンベロープ付きパスワードハッシュ、同梱 liboqs によるポスト量子暗号(FrodoKEM、Classic McEliece、Gen7 ハイブリッド)を 4 つの ABI で提供、EncryptedSharedPreferences に保存する .lic ファイルによるライセンス。
- 無料ティアの識別を含むすべての形式が .NET および Swift とバイト単位で同一。Kotlin らしい設計(suspend 関数、String と ByteArray の拡張関数)で、すべての公開 API は Java からも利用可能。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 基準 | 基準バージョン。.NET 1.0.8 および Swift 1.0.8 とバイト単位で同一。 |
| ライセンスファイル(バインド有/無) | 基準 | — |
| ネイティブライブラリ/ABI | 基準 | arm64-v8a、armeabi-v7a、x86、x86_64 向けの liboqs.so と libsaqura_oqs.so。 |
| R8・keep ルール、トリミング/リンカ | 基準 | AAR 内の consumer rules。 |
| 最小プラットフォーム | 基準 | Android 8.0(API 26) |
| ドロップイン更新 | 可 | 初版。 |