# AES_Ctr*

## 構文

      #include <twl/aes.h>

      AESResult AES_Ctr( const AESCounter*   pCounter,
                         const void*         src,
                         u32                 srcSize
                         void*               dst,
                         AESCallback         callback,
                         void*               arg );

      AESResult AES_CtrEncrypt( const AESCounter*   pCounter,
                                const void*         src,
                                u32                 srcSize
                                void*               dst,
                                AESCallback         callback,
                                void*               arg );
      AESResult AES_CtrDecrypt( const AESCounter*   pCounter,
                                const void*         src,
                                u32                 srcSize
                                void*               dst,
                                AESCallback         callback,
                                void*               arg );

## 引数

pCounter | 暗号化(復号化)に使用するカウンタの初期値へのポインタ。
src | 平文(暗号文)へのポインタ。4バイトアライメントでなければなりません。また、メインメモリ上を指していなければなりません。
srcSize | 平文(暗号文)のサイズ。0 より大きくなければなりません。
dst | 暗号文(平文)を格納するバッファへのポインタ。4バイトアライメントでなければなりません。また、メインメモリ上を指していなければなりません。 srcSize バイトの領域が必要です。 src と同じポインタを指定することができます。
callback | 暗号化(復号化)完了時に呼び出されるコールバック関数へのポインタ。 NULL を指定することもできます。
arg | 上記コールバック関数に渡されるユーザ定義のパラメータ。 NULL を含む任意の値を指定することができます。

## 返り値

AES の処理を正常に開始できた場合は `AES_RESULT_SUCCESS` を返します。 それ以外の返り値はエラーです。

## 説明

CTR モードでの AES の暗号化（復号化）処理を開始します。
CTR モードでは暗号化と復号化は同じ処理になります。 `AES_CtrEncrypt` と `AES_CtrDecrypt` は `AES_Ctr` の別名であり、これら 3 つの関数は全て同じ処理を行います。

`AES_SetKey()` で設定された鍵と pCounter で指定された カウンタ初期値を用いて src から srcSize バイトを 暗号化(復号化)します。暗号化(復号化)結果は dst から srcSize バイト の領域に書き込まれます。 暗号化(復号化)処理が完了するとその結果と arg を引数として callback が呼び出されます。 callback は割り込みハンドラから呼び出されるため、 割り込み禁止状態で呼び出されることに注意してください。 また、逆に割り込み禁止状態では callback が 呼び出されないことにも注意してください。

この関数は処理を開始するとすぐに制御を返します。 処理が正常に開始されると返り値は `AES_RESULT_SUCCESS` になりますが、 その後、処理中にエラーが発生した場合にはエラー値と arg を引数として callback が呼び出されます。 このコールバックによるエラー通知は割り込みハンドラから起動されますので 場合によっては関数から処理が返る前にコールバックによってエラーが通知される可能性があることに注意してください。

暗号化(復号化)の鍵はあらかじめ `AES_SetKey` で設定しておく必要があります。

鍵とカウンタ初期値は暗号化時と復号化時で同じものを使用しなければなりません。 鍵は外部に知られてはなりませんが、カウンタ初期値は外部に公開しても問題ありません。 ただし、カウンタ初期値はこの関数を呼び出すごとに異なる値を使用しなければなりません。

## 参照

`AES_SetKey`

## 履歴

2009/01/30 dstとsrcが同じバッファでもよい旨を追記。
2007/12/25 初版