[AUTOSAR] Crypto Stack

# はじめに
AUTOSAR R22-11がリリースされましたが、まだ中身を確認できていません。
ただ、よく使っているCrypto Stackの使い方について、まとめてました。
AUTOSARの仕様を理解するには、SWSを見て実際にコンフィグレーションしてみるのが一番早いんですが、
SWSってコンポーネント毎の仕様しか載っていないので、
コンポーネント間の設定がどう関係していて、どうコンフィグレーションすべきか、というイメージを掴むのが難しいです。
一応、EXPというドキュメントが用意されていて、インテグレーターに対する概念が記載されている。
それを見ても文字ばっかりでイメージ湧かないという人向けに簡単に図で説明します。

AUTOSAR Layerの考え方や、基本的な部分は省略します。
説明文の正確さは保証しません。あくまで筆者の理解している言葉で説明します。

# 参考文献
[AUTOSAR_EXP_UtilizationOfCryptoServices.pdf](https://www.autosar.org/fileadmin/standards/classic/22-11/AUTOSAR_EXP_UtilizationOfCryptoServices.pdf)

# コンポーネント構成
![module.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/436370aa-4ca2-db4b-aaea-019c6d871b86.png)

Crypto Stack構成：
| レイヤ | コンポーネント | 役割 | 
|:-:|:-:|:-:|
| Service  |  Csm（Crypto Service Manager） | HWの違いを隠蔽し、アプリケーション(SW-C or CDD)にサービスを提供する(Rte経由) |
| HardwareAbstraction  |  CryIf（Crypto Interface） | Crypto Driverに依存しないインターフェースをCsmに提供する |
| Driver  |  Crypto Driver |　HWに依存したドライバ。SW用、セキュアHW用など複数存在する可能性あり　|

# 使い方
アプリケーションから見たときの、Csmの使いかたとしてはJobとして処理されるAPIと、そうでないAPI(Direct API)があります。
![job.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/2ea86d71-cdaf-4132-0524-575e64ab058a.png)

暗号演算をするようなAPIはJobとして処理される、
Direct APIは主に鍵を管理するようなAPIです。
見分け方としては、API仕様のSync/Asyncのところが「Depends on configuration」になっていて、
引数にJobIdが指定できるようになっているようなAPIはJobとして処理されます。

![hashAPI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/d03da104-a124-4495-e80a-29362e86f89a.png)

逆にDirectAPIは「Syncronous」のみになっていて、引数にJobIdは設定できません。

![KeyAPI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/c9f89136-dab6-6aec-5cac-cf020f02c3b4.png)

Jobで処理されるAPIかどうかによって、
Csmのコンフィグレーションで同期・非同期の切り替えができたり、
非同期Jobのキューイングができたりします。

# 同期・非同期
暗号サービスの計算量が多いときや、時間がかかるような要求の場合は、非同期に設定することができます。
同期であれば、呼び出し元（アプリケーション）に即結果が返りますが、
非同期の場合は、呼び出し元への結果の返し方が異なります。
CsmのSWSには簡易的なシーケンスが記載されています。

![async.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/ff5c047b-fdc2-63ed-5cf9-12ae8ef8d2f5.png)

※CsmでJobキューが空のときのシーケンスです。
Job実行中であれば、Csmの周期処理でJob優先度に応じて順番に処理します。

:::note info
Csm, CryptoDriverの周期設計ポイント：
Csm：アプリからどのくらいの頻度で要求されて、応答時間制約がどれくらいか
CryptoDriver：HW or SWの処理結果をどれくらいの頻度でポーリング、アプリに通知する必要があるか
:::
非同期にするなら、Csmは優先度を高く、CryptoDriverは優先度を低く設定し、裏で処理をさせるようにすると良いです。（タスク構成によるが）
Jobがすべて同期であれば、CryptoDriverのメイン周期は実行することがないので、マッピング不要。


API仕様：
![callbackAPI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/f8be2bbf-0af1-5ccc-ae6d-b8372de8bd5f.png)

Config：
![config_callback.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/163241a8-d5f4-3ed4-594d-5970aa78d67b.png)

Csmで対応するJob毎に、Callbackも設定します。赤枠で囲った部分が対応しているコールバックになります。
Job毎にCallbackを作成することもできるし、複数のJobをひとつのCallbackに集約してアプリに通知することもできます。

CallbackはClient-Serverポートで通知するアプリケーションに接続しておく必要があります。
![callback_portinterface.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/b6159835-0ae2-04e3-b948-6fcaf35b457c.png)

# キューイング、優先順位
Job毎に非同期に設定できるという話だったが、キューはCrypto Driver Objectに紐づけられます。
Crypto Driver Objectは暗号演算リソースを示していて、
たとえばSWだけで暗号演算するときはSW用のCrypto Driver Object、SWとHWで一つずつ演算できるのであれば2つのCrypto Driver Objectで構成されて、それぞれ非同期で動かすのであれば、2つのキューを作ることができます。

![queue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/016cb44d-c728-6091-2d29-38ecdb138b6b.png)
この例では、HSMのAES用とRSA用のCrypto Driver Objectを持っていて、キューも二つあります。
Csmのメイン処理で、キューに複数のJobが溜まっている場合は、Jobの優先度が高いものから順に処理していきます。

# ストリーミング方式、シングルコール方式
「Start」「Update」「Finish」の各操作を呼び出すストリーミング方式と、
その3つの処理を一括して呼び出すシングルコール方式がある。

巨大なデータを分割して処理したいような場合は、ストリーミング方式を使って少しずつ処理します。
小さなデータを一括で処理したいような場合は、シングルコール方式を使って簡単に暗号演算することができます。

ストリーミング方式を使う場面例：
リプロするデータを少しずつ通信して署名検証する時など。

シングルコール方式を使う場面例：
他ECUから受信した認証子付きメッセージの認証時など。

## 気になっていること
SW-CからCsmのサービスを呼び出すときは、Rte経由で呼び出す必要があります。
Client-Serverポートの定義を見ると、シングルコールしか対応していないように見える。。

![clientport.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/ac049bae-f552-98cc-3ff9-35ef88ab5507.png)

上記のストリーミング方式を使う場面で、SW-CからCsmのサービスを使いたいときはどうすれば良いのか？
Cddにストリーミング方式で要求するためのWrapperを作ってRte経由で通知、通知された情報を使ってCddからCsmをストリーミング方式で呼び出す、
というのは可能だが、なぜストリーミング方式に対応していないのかが不明。
そういうケースはあり得ないとAUTOSARは考えている？

# まとめ
Crypto Stackの使い方について、理解しておいた方が良い点をまとめてみました。
具体的な使い方がイメージできるような資料が存在しないので、
自分の考えをまとめておくためにも作成していけたら良いと考えています。