CXL (Compute Express Link) その16 - CXL.ioコマンド: セキュリティ関連

私はメモリデバイスの不揮発性メモリ制御やホストIFなどを扱うソフト屋をやっております。
仕事でCXL(Compute Express Link)まわりの技術に関わっています。
CXL技術に関連するメモ書きを残していこうと思います。
ホストのCPUとOS/Applicationまわりの経験・知識共に乏しいので、親切な方は教えて下さると幸いです。
また、間違い、アドバイス、その他、ご意見やご要望ありましたらお気軽にどうぞ。

---
今回の記事で凡そCXL.ioのMailboxコマンドの詳細については書き終わってしまうので、CXL.ioコマンド関連する記事は今回で最後となると思います。次回はCLX関連で何を書くか決めていません。

今回はセキュリティ機能に関連するCXL.ioコマンドについて書きます。
CXL IFの通信路の暗号化と完全性チェック機能であるCXL IDEについては、今回は触れません。

# 1. セキュリティ
CXLの仕様として定められているセキュリティに関連のCXL.ioのコマンドセットは、以下の2つのコマンドセットです。
- Sanitizeコマンドセット
CXLメモリデバイスに記録されたデータの消去するためのコマンドセット。
- Persistent Memory Data-at-rest Securityコマンドセット
CXLメモリデバイスのパスワードによるアクセスコントロールを行うためのコマンドセット。

Persistent Memory Data-at-rest Securityコマンドセットでは、パスワードによりCXLメモリデバイスのLock/Unlockの制御を行います。CXLメモリデバイスは、Unlock状態のときはCXL.memでのデータの読み書きを禁止します。Persistent Memory Data-at-rest Securityコマンドセットでは、ATAの仕様で定められているアクセスコントロールに相当する機能が扱われます。

TCG Opal SSCやTCG Enterprise SSCに相当するセキュリティ機能は、CXLの仕様では扱われません。それらのセキュリティ機能に対応するCXLメモリデバイスを作りたい場合は、NVMeで対応させる際と同様の扱いで、Security Passthroughコマンドセットを使うことになります。CXLの仕様では、NVMeの仕様と同様に、やり取りされるデータの中身はCXLの仕様外とするSecurity Passthroughコマンドセットが定められています。

なお、CXLはIFの仕様であるので、CXLメモリデバイスに記録されるデータの暗号化については仕様範囲外です。

以下は、個人的な感想として書きますが、CXLメモリデバイスに記録されるデータの暗号化はどの顧客からも要求されます。要求の実現方法は、CPUによるデータの暗号化と、CXLメモリデバイスのコントローラによるデータの暗号化、の大きく2通りあります。
CXLメモリデバイスのベンダー側の立場としては、CPUによるデータの暗号化が、CXLメモリデバイスの全てのユースケースに適用できるか分からないので、何らかの対応を入れておくことになります。
IntelのSGXやAMDのSEVといったCPUによるデータの暗号化機能があるため、CPUベンダーからは、CXLメモリデバイスのコントローラで暗号化・復号を行う必要はないので、暗号化・復号に掛かるレイテンシを削減して応答を返すようにして欲しいという要求もあります。
従って、CXLメモリデバイスの対応としては、例えば、ユーザがPersistent Memory Data-at-rest Securityコマンドセットで、CXLメモリデバイスにアクセスコントロールを掛ける場合には、設定されたパスワードを元に鍵を生成し、CXLメモリデバイスのコントローラで暗号化を行い、アクセスコントロールを掛けない場合には暗号化・復号エンジンをスルーさせて動かす等、CXLの仕様では書かれませんが、CXLのIFの仕様と関連させてCXLメモリデバイスに記録されるデータの暗号化に対応するという手段などで対応します。

# 2. Sanitize Command Set
Sanitizeコマンドセットには、下表に示す2つのコマンドが定義されています。

| Command | Required | 概要 |
|:--|:-:|:--|
| Sanitize | O | CXLメモリデバイスに書き込んだデータを全て消去する。 |
| Secure Erase | O | CXLメモリデバイスでデータを暗号化して書き込む際に使用した鍵を消去する。 |

## 2.1. Sanitize
CXLメモリデバイスに書き込まれた全てのユーザデータを上書き、もしくは消去することにより、ユーザが書き込んだデータがCXLメモリデバイスに残っていない状態にします。ユーザがCXLメモリデバイスを破棄する際にSanitizeコマンドを使用することが想定されます。
Sanitizeが完了するまでに掛かる時間は、CXLメモリデバイスに搭載されたメモリの特性と容量に依存します。

Sanitizeコマンドが完了するまで、CXLメモリデバイスはDisableの状態になり、CXL.memでデータの読み書きできなくなります。CXLメモリデバイスがDisableの状態であることは、レジスタを通してホストシステムに通知されます。
CXLメモリデバイスは、Disableの状態のとき、データの読み出しに対してはランダムなデータ等書き込んだデータとは無関係なデータを返し、データの書き込みに対しては無視をします。

## 2.2. Secure Erase
CXLメモリデバイスが書き込みにおいて受信したデータを、コントローラで暗号化して、不揮発性メモリに書き込んでいることを前提とした場合に有効なコマンドです。Secure Eraseでは、コントローラがユーザデータを暗号化する際に使用した鍵を変更、もしくは消去することにより、ユーザデータを復号できない状態にします。
CXLメモリデバイスに記録されたユーザデータは、暗号化された状態で不揮発性メモリに残っています。
Secure Eraseで行われる処理は、鍵の変更、もしくは消去の処理だけなので、Sanitizeよりも短時間で完了することが期待されます。

Secure Eraseコマンドは短時間で完了することが想定されており、CXLメモリデバイスはDisableの状態になりません。
このコマンドで指定するパラメータと応答で返されるパラメータはどちらもありません。

## 2.3. コマンドパラメータ
Snitizeコマンドセットのコマンドでは、指定するパラメータと応答で返されるパラメータはどちらもありません。


# 3. Persistent Memory Data-at-rest Security Command Set

Persistent Memory Data-at-rest Securityコマンドセットには、下表に示す6つのコマンドが定義されています。

| Command | Required | 概要 |
|:--|:-:|:--|
| Get Security State | O | 設定されたセキュリティ機能の状態を取得する。 |
| Set Passphrase | O | パスワードのセットを行う。 |
| Disable Passphrase | O | 設定されたパスワードを無効にする。 |
| Unlock | O | Lock状態を解除する。 |
| Freeze Security State | O | Frozenの状態にする。 |
| Passphrase Secure Erase | O | ユーザパスワードの消去とユーザデータの暗号化に使用した鍵を消去する。 |

Persistent Memory Data-at-rest Securityコマンドセットで扱われるセキュリティ機能における、状態遷移の概略図を下図に示します。

![SecurityStateTransition.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/35765e0d-ff55-1fa4-3525-4e269cb15bc9.png)

Lock/Unlokckの状態遷移は、ユーザパスワードによって行われます。
マスターパスワードは、ユーザパスワードの設定前にのみ設定することができ、ユーザパスワードの消去にのみに使用されます。ユーザパスワードを忘れた場合などに利用することが想定されています。マスターパスワードでユーザパスワードを消去する場合はPassphrase Secure Eraseコマンドが使用され、CXLメモリデバイスに記録されたデータは全て読めない状態となります。

## 3.1. コマンドパラメータ
Persistent Memory Data-at-rest Securityコマンドセットで定義されるコマンドの詳細を示します。
ホストシステムがコマンドで指定するパラメータをInput Payload、ホストシステムに応答として返されるパラメータをOutput Payloadで記載します。

### 3.1.1. Get Security State
Get Security Stateでは、CXLメモリデバイスに設定されたセキュリティ機能の状態を取得します。

***Output Payload***
| Byte Offset | Length | Description |
|--:|--:|:--|
| 0 | 4 | Security State<br>　Bit[0] User Passphrase Set: ユーザパスワードがセットされアクセスコントロール機能が有効になっていることを示す<br>　Bit[1] Master Passphrase Set: マスターパスワードがセットされていることをしめす<br>　Bit[2] Locked CXLメモリデバイスがLockの状態であることを示す<br>　Bit[3] Frozen パスワードを規定回数以上誤って入力した等の原因により、CXLメモリデバイスがFrozenの状態となり、復帰にはCold Resetが必要であることを示す<br>　Bit[4] User Passphrase Attempt Count Reached: ユーザパスワードを規定回数以上誤って入力したことを示す<br>　Bit[5] Master Passphrase Attempt Count Reached: マスターパスワードを規定回数以上誤って入力したことを示す |

### 3.1.2. Set Passphrase
マスターパスワード、もしくはユーザパスワードの設定、または変更を行います。
ユーザパスワードの設定後、Hot reset、Warm Reset、Cold ResetによりCXLメモリデバイスはLockの状態になります。

***Input Payload***
| Byte Offset | Length | Description |
|--:|--:|:--|
| 0 | 1 | Passphrase Type: 設定・変更を行うパスワードを指定する<br>　00h = Master passphrase<br>　01h = User passphrase |
| 1 | 1Fh | Reserved |
| 20h | 20h | Current Passphrase: 設定されているパスワード |
| 40h | 20h | New Passphrase: 新たに設定するパスワードを指定する |

### 3.1.3. Disable Passphrase
マスターパスワード、もしくはユーザパスワードを無効にします。
パスワードが無効になるのは、Hot reset、Warm Reset、Cold Reset後です。


***Input Payload***
| Byte Offset | Length | Description |
|--:|--:|:--|
| 0 | 1 | Passphrase Type: 無効にするパスワードを指定する<br>　00h = Master passphrase<br>　01h = User passphrase |
| 1 | 1Fh | Reserved |
| 20h | 20h | Current Passphrase: 設定されているパスワード |

### 3.1.4. Unlock
Lock状態にあるCXLメモリデバイスをUnlockの状態にします。

***Input Payload***
| Byte Offset | Length | Description |
|--:|--:|:--|
| 0 | 20h | Current Passphrase: 設定されているパスワード |

### 3.1.5. Freeze Security State
CXLメモリデバイスをFrozenの状態にする。
Frozenの状態では、Persistent Memory Data-at-rest Security Command Setのコマンドは無効なコマンドとして扱われ、再び有効にするためにはCold Resetが必要です。
このコマンドで指定するパラメータと応答で返されるパラメータはどちらもありません。

### 3.1.6. Passphrase Secure Erase
CXLメモリデバイスでデータを暗号化して書き込む際に使用した鍵の消去と、CXLメモリデバイスに設定されたユーザパスワードを消去します。コマンド実行時に使用するパスワードはマスターパスワードでもユーザパスワードどちらも使用できます。

***Input Payload***
| Byte Offset | Length | Description |
|--:|--:|:--|
| 0 | 1 | Passphrase Type: 使用するパスワードを選択する<br>　00h = Master passphrase<br>　01h = User passphrase |
| 1 | 1Fh | Reserved |
| 20h | 20h | Current Passphrase: 設定されているパスワード |

---