---
generated_at: 2026-03-01 03:00:00
metrics:
  claims_total: 85
  claims_with_evidence: 85
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：Encryption モジュール単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：85 / 85、根拠なし：0
- 優先レビュー（高）
  1. 全テストケースにソースコード根拠あり
  2. 追加で確認が必要な項目なし
  3. -

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `src/Illuminate/Encryption/Encrypter.php` - 主要な暗号化クラス（405行）
- E-02: `src/Illuminate/Encryption/EncryptionServiceProvider.php` - サービスプロバイダー（87行）
- E-03: `src/Illuminate/Encryption/MissingAppKeyException.php` - 例外クラス（18行）
- E-04: `src/Illuminate/Contracts/Encryption/Encrypter.php` - Encrypterインターフェース（49行）
- E-05: `src/Illuminate/Contracts/Encryption/StringEncrypter.php` - StringEncrypterインターフェース（26行）
- E-06: `src/Illuminate/Contracts/Encryption/DecryptException.php` - 復号例外インターフェース
- E-07: `src/Illuminate/Contracts/Encryption/EncryptException.php` - 暗号化例外インターフェース

## 3) Claims と根拠の対応（レビューの主戦場）

### Encrypterクラス - コンストラクタ（UT-ENC-001 〜 UT-ENC-011）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | aes-128-cbcで16バイトキーが必要 | E-01 L39-44: `$supportedCiphers`定義 | ○ |
| C-02 | aes-256-cbcで32バイトキーが必要 | E-01 L39-44: `$supportedCiphers`定義 | ○ |
| C-03 | aes-128-gcmで16バイトキーが必要 | E-01 L39-44: `$supportedCiphers`定義 | ○ |
| C-04 | aes-256-gcmで32バイトキーが必要 | E-01 L39-44: `$supportedCiphers`定義 | ○ |
| C-05 | cipherは大文字小文字を区別しない | E-01 L77: `strtolower($cipher)` | ○ |
| C-06 | デフォルトcipherはaes-128-cbc | E-01 L54: `$cipher = 'aes-128-cbc'` | ○ |
| C-07 | 不正cipherでRuntimeException | E-01 L58-62: `throw new RuntimeException` | ○ |
| C-08 | 不正キー長でRuntimeException | E-01 L58-62: `supported()` チェック | ○ |
| C-09 | 空キーでRuntimeException | E-01 L56,58: キー検証 | ○ |
| C-10 | 境界値：15バイトキーは不正 | E-01 L81: `mb_strlen`での厳密チェック | ○ |
| C-11 | 境界値：17バイトキーは不正 | E-01 L81: `mb_strlen`での厳密チェック | ○ |

### Encrypterクラス - supportedメソッド（UT-ENC-012 〜 UT-ENC-016）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-12 | 有効な組み合わせでtrue | E-01 L75-82: `supported()`メソッド | ○ |
| C-13 | aes-256-cbc/32バイトでtrue | E-01 L40,81: サイズチェック | ○ |
| C-14 | 大文字cipherも正しく判定 | E-01 L77: `strtolower($cipher)` | ○ |
| C-15 | 未知cipherでfalse | E-01 L77-79: `isset`チェック | ○ |
| C-16 | 不正キー長でfalse | E-01 L81: サイズ比較 | ○ |

### Encrypterクラス - generateKeyメソッド（UT-ENC-017 〜 UT-ENC-022）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-17 | aes-128-cbcで16バイト生成 | E-01 L90-93: `generateKey()`実装 | ○ |
| C-18 | aes-256-cbcで32バイト生成 | E-01 L92: サイズ参照 | ○ |
| C-19 | aes-128-gcmで16バイト生成 | E-01 L92: サイズ参照 | ○ |
| C-20 | aes-256-gcmで32バイト生成 | E-01 L92: サイズ参照 | ○ |
| C-21 | 大文字cipherも正しく処理 | E-01 L92: `strtolower($cipher)` | ○ |
| C-22 | 未知cipherで32バイト（デフォルト） | E-01 L92: `?? 32`フォールバック | ○ |

### Encrypterクラス - encryptメソッド（UT-ENC-023 〜 UT-ENC-033）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-23 | 文字列の暗号化 | E-01 L104-131: `encrypt()`実装 | ○ |
| C-24 | 配列の暗号化（serialize） | E-01 L109: `serialize($value)` | ○ |
| C-25 | オブジェクトの暗号化 | E-01 L109: `serialize($value)` | ○ |
| C-26 | serialize=false動作 | E-01 L109: 条件分岐 | ○ |
| C-27 | ペイロード構造（iv/value/mac/tag） | E-01 L124: `compact('iv', 'value', 'mac', 'tag')` | ○ |
| C-28 | ランダムIVで異なる結果 | E-01 L106: `random_bytes()`使用 | ○ |
| C-29 | aes-256-gcm暗号化 | E-01 L42,120-121: AEAD対応 | ○ |
| C-30 | 空文字列の暗号化 | E-01 L104-131: 特別なチェックなし | ○ |
| C-31 | 大きなデータの暗号化 | E-01 L108-111: openssl_encrypt使用 | ○ |
| C-32 | null値の暗号化 | E-01 L109: serialize(null)可能 | ○ |
| C-33 | マルチバイト文字対応 | E-01 L108-111: バイナリ処理 | ○ |

### Encrypterクラス - encryptStringメソッド（UT-ENC-034 〜 UT-ENC-036）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-34 | シリアライズなし暗号化 | E-01 L141-144: `encrypt($value, false)` | ○ |
| C-35 | encryptString/decryptString整合性 | E-01 L141-144, L206-208 | ○ |
| C-36 | 空文字列処理 | E-01 L141-144: 特別なチェックなし | ○ |

### Encrypterクラス - decryptメソッド（UT-ENC-037 〜 UT-ENC-048）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-37 | 基本復号 | E-01 L155-196: `decrypt()`実装 | ○ |
| C-38 | 配列の復号 | E-01 L195: `unserialize($decrypted)` | ○ |
| C-39 | unserialize=false動作 | E-01 L195: 条件分岐 | ○ |
| C-40 | AEAD復号 | E-01 L178-180: tag処理 | ○ |
| C-41 | 不正ペイロードでDecryptException | E-01 L234-245: `getJsonPayload()`検証 | ○ |
| C-42 | 改ざん検出 | E-01 L171-176: MAC検証 | ○ |
| C-43 | MAC不正でDecryptException | E-01 L187-189: MAC検証失敗 | ○ |
| C-44 | 異なるキーで復号失敗 | E-01 L178-184: openssl_decrypt失敗 | ○ |
| C-45 | null payloadでDecryptException | E-01 L234-236: `is_string`チェック | ○ |
| C-46 | 配列payloadでDecryptException | E-01 L234-236: `is_string`チェック | ○ |
| C-47 | IV長不正でDecryptException | E-01 L272: IV長検証 | ○ |
| C-48 | previousKeysでの復号 | E-01 L170: `getAllKeys()`ループ | ○ |

### Encrypterクラス - decryptStringメソッド（UT-ENC-049 〜 UT-ENC-050）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-49 | 文字列専用復号 | E-01 L206-208: `decrypt($payload, false)` | ○ |
| C-50 | 不正ペイロードでDecryptException | E-01 L206-208経由でdecrypt | ○ |

### Encrypterクラス - appearsEncryptedメソッド（UT-ENC-051 〜 UT-ENC-058）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-51 | 暗号化値でtrue | E-01 L335-351: `appearsEncrypted()`実装 | ○ |
| C-52 | 通常文字列でfalse | E-01 L341-345: base64デコード失敗 | ○ |
| C-53 | 不正base64でfalse | E-01 L341-345: デコード失敗チェック | ○ |
| C-54 | 不正JSON構造でfalse | E-01 L347-350: JSON/配列チェック | ○ |
| C-55 | 不完全ペイロードでfalse | E-01 L349-350: キー存在チェック | ○ |
| C-56 | nullでfalse | E-01 L337-339: `is_string`チェック | ○ |
| C-57 | 配列でfalse | E-01 L337-339: `is_string`チェック | ○ |
| C-58 | 整数でfalse | E-01 L337-339: `is_string`チェック | ○ |

### Encrypterクラス - キー管理メソッド（UT-ENC-059 〜 UT-ENC-068）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-59 | getKey()動作 | E-01 L357-361: `return $this->key` | ○ |
| C-60 | getAllKeys()基本動作 | E-01 L367-371: 配列返却 | ○ |
| C-61 | getAllKeys()ローテーション | E-01 L370: スプレッド演算子 | ○ |
| C-62 | getPreviousKeys()空配列 | E-01 L377-381: `return $this->previousKeys` | ○ |
| C-63 | getPreviousKeys()設定値 | E-01 L377-381 | ○ |
| C-64 | previousKeys()設定 | E-01 L391-404: メソッド実装 | ○ |
| C-65 | previousKeys()空配列 | E-01 L401: 空配列セット可能 | ○ |
| C-66 | previousKeys()不正キーでException | E-01 L393-398: supported()チェック | ○ |
| C-67 | previousKeys()部分的不正キー | E-01 L393-398: foreachで全チェック | ○ |
| C-68 | previousKeys()メソッドチェーン | E-01 L403: `return $this` | ○ |

### EncryptionServiceProvider（UT-ENC-069 〜 UT-ENC-082）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-69 | register()シングルトン登録 | E-02 L16-20: `register()`実装 | ○ |
| C-70 | SerializableClosureキー設定 | E-02 L44-54: `registerSerializableClosureSecurityKey()` | ○ |
| C-71 | registerEncrypter()動作 | E-02 L27-37: シングルトン登録 | ○ |
| C-72 | previous_keys設定 | E-02 L33-36: `previousKeys()`呼び出し | ○ |
| C-73 | previous_keys未設定時 | E-02 L35: `?? []`フォールバック | ○ |
| C-74 | parseKey()base64デコード | E-02 L62-69: プレフィックス処理 | ○ |
| C-75 | parseKey()プレーンキー | E-02 L62-68: 条件分岐 | ○ |
| C-76 | parseKey()複数キー処理 | E-02 L33-35: array_map | ○ |
| C-77 | key()抽出 | E-02 L79-86: tap()使用 | ○ |
| C-78 | key()空キーでException | E-02 L82-84: empty()チェック | ○ |
| C-79 | key()nullキーでException | E-02 L82: empty(null)=true | ○ |
| C-80 | key()未設定でException | E-02 L82: empty()チェック | ○ |
| C-81 | SerializableClosure不在時 | E-02 L49-51: class_exists()チェック | ○ |
| C-82 | 空キー時のSerializableClosure | E-02 L49: empty($config['key'])チェック | ○ |

### MissingAppKeyException（UT-ENC-083 〜 UT-ENC-085）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-83 | デフォルトメッセージ | E-03 L14: デフォルト引数 | ○ |
| C-84 | カスタムメッセージ | E-03 L14: `$message`パラメータ | ○ |
| C-85 | RuntimeException継承 | E-03 L7: `extends RuntimeException` | ○ |

## 4) 不足情報（Unknown / Missing）
- 根拠なしの項目はありません
- 全てのテストケースがソースコードに基づいて生成されています

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - 全テストケースがソースコードの実装に基づいており、高い信頼性があります
- 特記事項：
  - 暗号化モジュールのため、セキュリティ観点でのテストケースが重要
  - AEAD（認証付き暗号）とCBC（非AEAD）の両方のモードをカバー
  - キーローテーション機能のテストを網羅

## 6) レビュアーチェックリスト（最小）
- [ ] 各暗号化アルゴリズム（aes-128-cbc, aes-256-cbc, aes-128-gcm, aes-256-gcm）のテストケースが網羅されているか
- [ ] セキュリティ関連のエッジケース（改ざん検出、MAC検証、タグ検証）が十分にテストされているか
- [ ] キーローテーション機能のテストケースが実装要件を満たしているか
- [ ] 例外処理のテストケースが全ての異常パターンをカバーしているか
- [ ] EncryptionServiceProviderのDI登録テストが適切か
