SaQura .NET · アップグレードノート
バージョンと互換性 — SaQura .NET
更新の前に
現在のバージョン: 1.0.15 · NuGet · SaQura (NuGet) · ドキュメントへ
- 公開済みの全バージョン(1.0.0.2〜1.0.15)のデータは 1.0.15 で読み取れます。唯一の例外は、1.0.4.4 以前の byte[] API で作成した AES 暗号文で、1.0.8 で導入された移行ヘルパーが必要です(該当項を参照)。
- ライセンスファイルはそのまま有効です。1.0.13 から任意のバインディング項目が加わりましたが、この項目のないライセンスは従来とバイト単位で同一に動作します。
- パッケージは net8.0 に加え、net10.0-android・net10.0-ios・net10.0-maccatalyst を対象とします。デスクトップおよびサーバー用プロジェクトは引き続き net8.0 ターゲットを使用します。
各バージョンの表は、同じ 5 つの質問に同じ順序で答えます。「ドロップイン更新:可」とは、当社のクロスプラットフォームのテストコーパスにより、新バージョンが旧バージョンのデータを読み取れ、呼び出しの変更が不要であることが確認されたという意味です。
任意モジュール
- 任意モジュールはありません。すべての機能(AES、RSA、パスワードハッシュ、Quantum Gen1〜Gen8、ML-DSA/SLH-DSA、SQS1 ストリーミング、ライセンス)が 1 つのアセンブリに含まれます。
- 依存関係:BouncyCastle(NuGet 経由の推移的依存で、自動的にインストールされます)。
- トリミングと AOT:モバイル向けアセンブリ(net10.0-*)は iOS/Android のトリマーおよび AOT ランタイムで動作し、実機で確認済みです。独自のリンカ記述子は不要です。
ライセンスとアプリバインディング
- 非バインドのライセンスはアプリバインディングの影響を受けません。呼び出しの変更も再発行も不要です。
- バインド済み配布ライセンス(1.0.13 以降)は、OS が報告するパッケージ/バンドル ID と署名証明書を検証します。Android(パッケージ+証明書)、iOS/Mac Catalyst(バンドル ID)、Windows(ホストの Authenticode)、macOS デスクトップは 1.0.14 以降(署名識別子+証明書)。Linux には OS が保証するアプリ識別情報がないため、非バインドのライセンスをお使いください。
- 1.0.15 以降、ライセンスサーバーが確認した標準ライセンスの失効は強制され、保存されます。配布ライセンスおよび完全オフラインの導入は対象外で、有効期限をもって終了します。
1.0.15 · 2026-07-15
ライセンス失効のオンライン強制と保存、診断出力を stderr へ
- ライセンスサーバーが標準ライセンスを失効と報告した場合、ライセンスは無効化され、その状態が保存されます。失効は即時および次回起動時(オフラインでも)に適用されます。サーバーに到達できない場合は従来どおり致命的ではありません(オフライン猶予)。
- 配布ライセンスと完全オフラインの導入はオンライン検証されないため失効できません。有効期間は有効期限によって定まります。
- ライセンス診断(登録失敗、ファイルエラー)は stdout ではなく stderr に出力されます。stdout をデータチャネルとして使うプログラム(stdio 経由の MCP サーバーなど)に影響しなくなりました。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 変更なし | — |
| ライセンスファイル(バインド有/無) | 変更なし | ファイル形式は変更なし。サーバー側で失効した標準ライセンスの動作のみ新規。 |
| ネイティブライブラリ/ABI | 変更なし | — |
| R8・keep ルール、トリミング/リンカ | 変更なし | — |
| 最小プラットフォーム | 変更なし | .NET 8.0 |
| ドロップイン更新 | 可 | — |
1.0.14 · 2026-07-15
macOS デスクトップでもアプリバインディングに対応
- バインド済み配布ライセンスがネイティブの macOS デスクトップアプリでも強制されるようになりました。ライブラリは OS から自身のコード署名を読み取ります。署名識別子(署名済み .app ではバンドル ID)と署名証明書の SHA-256(配布時は Developer ID Application 証明書)です。
- 署名されていない macOS ホストには保証された識別情報がないため、バインド済みライセンスは拒否されます。非バインドのライセンスは引き続き動作します。
- 任意のバインディングの対応範囲:Android、iOS/Mac Catalyst、Windows、macOS デスクトップ。Linux はバインディング非対応のため、非バインドのライセンスを配布してください。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 変更なし | — |
| ライセンスファイル(バインド有/無) | 追加(既存に影響なし) | 純粋な追加。既存ライセンスはバイト単位で同一。 |
| ネイティブライブラリ/ABI | 変更なし | — |
| R8・keep ルール、トリミング/リンカ | 変更なし | — |
| 最小プラットフォーム | 変更なし | .NET 8.0 |
| ドロップイン更新 | 可 | — |
1.0.13 · 2026-07-04
配布ライセンスのアプリバインディングと .NET MAUI ターゲット
- 任意のライセンス項目 boundPackage と boundSignature により、配布ライセンスをアプリのパッケージ/バンドル ID と署名証明書に紐付けます。他のアプリにコピーされたライセンスファイルは有効化時に拒否されます(ValidationResult.BindingMismatch)。新しいプロパティ:LicenseInfo.BoundPackage と LicenseInfo.BoundSignature。
- アプリの識別情報は呼び出し元ではなく OS から取得します。2 つの項目を持たないライセンスは従来とまったく同じに動作します。項目は署名対象テキストの hardwareId の後に追加されるため、既存ライセンスはバイト単位で同一のままです。
- パッケージは追加で net10.0-android・net10.0-ios・net10.0-maccatalyst を対象とし、net8.0 ターゲットは変更ありません。ネイティブのデバイスバインディングにはこの .NET 10 MAUI ターゲットが必要です。net8.0 ベースの MAUI アプリにはデバイス識別情報がないため、バインド済みライセンスは拒否されます。非バインドのライセンスはそのまま動作します。
- モバイル向けアセンブリは iOS/Android のトリマーおよび AOT ランタイムで動作します。バインディングの受理と拒否は iPhone、Android、Windows で検証済みです。
- 1.0.11 と 1.0.12 はこの機能の中間ビルドであり、1.0.13 に置き換えられています。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 変更なし | — |
| ライセンスファイル(バインド有/無) | 追加(既存に影響なし) | 任意項目。非バインドのライセンスはバイト単位で同一。 |
| ネイティブライブラリ/ABI | 変更あり | 新ターゲット net10.0-android/-ios/-maccatalyst。net8.0 は変更なし。 |
| R8・keep ルール、トリミング/リンカ | 追加(既存に影響なし) | モバイル向けアセンブリはトリマー/AOT 対応。独自のリンカルールは不要。 |
| 最小プラットフォーム | 変更なし | .NET 8.0。モバイルターゲットには .NET 10 SDK が必要。 |
| ドロップイン更新 | 可 | — |
1.0.10 · 2026-06-06
大容量ファイル向けストリーミング暗号化(SQS1)
- SaQura 名前空間に新しいストリーム API:EncryptStreamAsync / DecryptStreamAsync、EncryptFileAsync / DecryptFileAsync、ReadStreamInfoAsync、CountCompleteSegments(再開用)。固定セグメントで暗号化し、ファイルサイズに関係なく一定のメモリ(セグメントサイズの約 2 倍、既定 1 MiB)で動作します。
- ヘッダーから自動選択される 2 つの AEAD スイート:AES-256-GCM と ChaCha20-Poly1305。
- ポスト量子エンベロープ(Pro):ランダムなファイル鍵を SaQura Quantum 鍵ペア(例:Gen8)で一度だけラップします。サイドカーファイル .saqkey(既定)または埋め込みとして保存。
- 新形式は独自の SQS1 識別子を持ち、純粋な追加です。既存の呼び出しや形式は変更されていません。ストリーミングは Standard 以上、エンベロープは Pro 以上。
- ライセンス検証と無料ティアの識別を強化。API や形式の変更はありません。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 追加(既存に影響なし) | 新形式 SQS1。従来の形式はすべて変更なし。 |
| ライセンスファイル(バインド有/無) | 変更なし | — |
| ネイティブライブラリ/ABI | 変更なし | — |
| R8・keep ルール、トリミング/リンカ | 変更なし | — |
| 最小プラットフォーム | 変更なし | .NET 8.0 |
| ドロップイン更新 | 可 | — |
1.0.9 · 2026-06-05
NIST ポスト量子アルゴリズム:Gen8、ML-DSA、SLH-DSA
- 第 8 世代:X25519 と ML-KEM(FIPS 203)によるハイブリッド鍵カプセル化。両方の共有秘密を HKDF-SHA256 で結合し、その後 AES-256-GCM を適用。
- 署名 ML-DSA(FIPS 204)の強度 44 / 65 / 87、および SLH-DSA(FIPS 205、SHA2)の 128f / 192f / 256f。署名は Pro 以上、検証は全ティアで可能。
- Gen8、ML-DSA、SLH-DSA は Swift および Kotlin SDK とバイト単位で同一です(双方向で検証済み)。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 追加(既存に影響なし) | 新アルゴリズム追加。Gen1〜Gen7、AES、RSA は変更なし。 |
| ライセンスファイル(バインド有/無) | 変更なし | — |
| ネイティブライブラリ/ABI | 変更なし | — |
| R8・keep ルール、トリミング/リンカ | 変更なし | — |
| 最小プラットフォーム | 変更なし | .NET 8.0 |
| ドロップイン更新 | 可 | — |
1.0.8 · 2026-05-19
クロスプラットフォーム整合(未公開の 1.0.5〜1.0.7 を含む)
- AES-256-GCM の byte[] API:暗号文は従来の追加 Base64 ラッピングなしで、[nonce 12][暗号文][tag 16] のレイアウトで直接出力されます。文字列 API は変更ありません。1.0.4.4 以前で保存した byte[] 暗号文は、MigrateLegacyAESByteCiphertextAsync で平文バイトを取り出し、EncryptWithAESAsync で再暗号化してください。通常の DecryptWithAESAsync(byte[]) は新形式のみ読み取ります。
- PBKDF2-SHA512 パスワードハッシュ:JSON のフィールド名を長形式(algorithm、version、parameters、createdUtc)に変更、タイムスタンプは秒未満なし。Verify は両形式を読み取り、既存のハッシュは有効なままです。
- RSA-4096 ハイブリッド:.NET の形式は変更なし。Swift と Kotlin が並行リリースでこれに整合しました。
- 修正:Quantum 第 6 世代の強度 Medium と Highest(ヘッダーの長さ誤りにより復号エラー)。世代×強度の全 15 組み合わせが正しく往復します。
- 1.0.5 より:Quantum 操作は内部エラー時に null を返す代わりに QuantumOperationException(サブタイプ QuantumKeyGenerationException、QuantumEncryptionException、QuantumDecryptionException)をスローします。復号時の認証失敗(鍵の誤り、改ざんデータ)は引き続き string.Empty を返します。null をチェックしていた呼び出し元は try/catch を追加してください。
- 1.0.6 および 1.0.7 より:リリースビルドから内部診断スイッチを削除。Quantum API は空の鍵バッファやゼロ消去された鍵バッファを ArgumentException で拒否します。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 変更あり | AES byte[] と PBKDF2 JSON を変更。旧 PBKDF2 ハッシュは検証可能、旧 AES byte[] 暗号文は移行ヘルパー経由。RSA、Quantum、ライセンスは変更なし。 |
| ライセンスファイル(バインド有/無) | 変更なし | — |
| ネイティブライブラリ/ABI | 変更なし | — |
| R8・keep ルール、トリミング/リンカ | 変更なし | — |
| 最小プラットフォーム | 変更なし | .NET 8.0 |
| ドロップイン更新 | 移行が必要 | 1.0.4.4 以前の暗号文を保存している AES byte[] API の呼び出し元(レコードごとに一度の移行)と、Quantum API の null 戻り値を評価していたコードのみ該当。それ以外はドロップイン可能。 |
1.0.0.2 – 1.0.4.4 · 2025-12-30 – 2026-01-10
初期リリース
- 1.0.0.2:AES-256-GCM、RSA-4096、パスワードハッシュ、デジタル署名、ポスト量子暗号(第 1〜7 世代)、ライセンスティア、.lic ファイルによるオフライン有効化、iOS と Android 対応の初回リリース。
- 1.0.1.2:App Store および Play Store アプリ向けの配布ライセンス(LicenseType.Distribution)。デバイスバインディングなし、有効化回数無制限、署名のみ検証。ライセンスキーは 2〜4 文字の任意のティア接頭辞を受け付けます。
- 1.0.2.2:iOS および macOS での AES-GCM を修正(以前は PlatformNotSupportedException)。
- 1.0.3.2:ライセンスサーバーへの登録はブロックせずバックグラウンドで実行。サーバーの拒否は呼び出し元に報告されます。
- 1.0.4.2:ドキュメント。1.0.4.4:モバイルプラットフォーム検出の改善、iOS での有効化タイムアウトを解消。
| 互換性 | 状態 | 備考 |
|---|---|---|
| データ形式(鍵・暗号文・ストリーム) | 変更なし | このシリーズ内では変更なし。AES byte[] の変更は 1.0.8 から。 |
| ライセンスファイル(バインド有/無) | 追加(既存に影響なし) | 1.0.1.2 から配布ライセンス種別を追加。 |
| ネイティブライブラリ/ABI | 変更なし | — |
| R8・keep ルール、トリミング/リンカ | 変更なし | — |
| 最小プラットフォーム | 変更なし | .NET 8.0 |
| ドロップイン更新 | 可 | — |