2
0

aes.h 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816
  1. /*!
  2. \ingroup AES
  3. \brief この関数は、鍵を設定して初期化ベクトルを設定することでAes構造体を初期化します。
  4. \return 0 鍵と初期化ベクトルを正常に設定しました
  5. \return BAD_FUNC_ARG 鍵の長さが無効な場合に返されます。
  6. \param aes 変更するAes構造体へのポインタ
  7. \param key 暗号化と復号のための16,24、または32バイトの秘密鍵
  8. \param len 渡された鍵の長さ
  9. \param iv 鍵を初期化するために使用される初期化ベクトルへのポインタ
  10. _Example_
  11. \code
  12. Aes enc;
  13. int ret = 0;
  14. byte key[] = { some 16, 24 or 32 byte key };
  15. byte iv[] = { some 16 byte iv };
  16. if (ret = wc_AesSetKey(&enc, key, AES_BLOCK_SIZE, iv,
  17. AES_ENCRYPTION) != 0) {
  18. // failed to set aes key
  19. }
  20. \endcode
  21. \sa wc_AesSetKeyDirect
  22. \sa wc_AesSetIV
  23. */
  24. int wc_AesSetKey(Aes* aes, const byte* key, word32 len,
  25. const byte* iv, int dir);
  26. /*!
  27. \ingroup AES
  28. \brief この関数は、指定されたAes構造体の初期化ベクトルを設定します。Aes構造体は、この関数を呼び出す前に初期化されていることが必要です。
  29. \return 0 初期化ベクトルを正常に設定します。
  30. \return BAD_FUNC_ARG Aes構造体へのポインタがNULLの場合に返されます。
  31. \param aes 初期化ベクトルを設定するAes構造体へのポインタ
  32. _Example_
  33. \code
  34. Aes enc;
  35. // set enc key
  36. byte iv[] = { some 16 byte iv };
  37. if (ret = wc_AesSetIV(&enc, iv) != 0) {
  38. // failed to set aes iv
  39. }
  40. \endcode
  41. \sa wc_AesSetKeyDirect
  42. \sa wc_AesSetKey
  43. */
  44. int wc_AesSetIV(Aes* aes, const byte* iv);
  45. /*!
  46. \ingroup AES
  47. \brief 入力バッファの平文メッセージを暗号化し、AESでCipher Block Chainingを使用して出力バッファに出力します。
  48. この関数呼び出しには、メッセージの暗号化前にwc_AesSetKeyを呼び出してAESオブジェクトが初期化されている必要があります。
  49. この関数は、入力メッセージがAESブロック長であると仮定し、入力された長さがブロック長の倍数になることを想定しているため、
  50. ビルド構成でWOLFSSL_AES_CBC_LENGTH_CHECKSが定義されている場合は任意選択でチェックおよび適用されます。
  51. ブロック多入力を保証するために、PKCS#7スタイルのパディングを事前に追加する必要があります。
  52. これは自動的にパディングを追加するOpenSSL AES-CBCメソッドとは異なります。
  53. WOLFSSLと対応するOpenSSL関数を相互運用するには、OpenSSLコマンドライン関数で-nopadオプションを指定して、
  54. wolfSSL_AesCbcEncryptメソッドのように動作し、暗号化中に追加のパディングを追加しません。
  55. \return 0 メッセージの暗号化に成功しました。
  56. \return BAD_ALIGN_E: ブロックアライメントエラー検出時に返される可能性があります
  57. \return BAD_LENGTH_E ライブラリーがWOLFSSL_AES_CBC_LENGTH_CHECKSで構築されている場合で、入力長がAESブロック長の倍数でない場合に返されます。
  58. \param aes データの暗号化に使用されるAESオブジェクトへのポインタ
  59. \param out 暗号化されたメッセージの暗号文を格納する出力バッファへのポインタ
  60. \param in 暗号化されるメッセージを含む入力バッファへのポインタ
  61. _Example_
  62. \code
  63. Aes enc;
  64. int ret = 0;
  65. // initialize enc with AesSetKey, using direction AES_ENCRYPTION
  66. byte msg[AES_BLOCK_SIZE * n]; // multiple of 16 bytes
  67. // fill msg with data
  68. byte cipher[AES_BLOCK_SIZE * n]; // Some multiple of 16 bytes
  69. if ((ret = wc_AesCbcEncrypt(&enc, cipher, message, sizeof(msg))) != 0 ) {
  70. // block align error
  71. }
  72. \endcode
  73. \sa wc_AesSetKey
  74. \sa wc_AesSetIV
  75. \sa wc_AesCbcDecrypt
  76. */
  77. int wc_AesCbcEncrypt(Aes* aes, byte* out,
  78. const byte* in, word32 sz);
  79. /*!
  80. \ingroup AES
  81. \brief 入力バッファからの暗号メッセージを復号し、AESでCipher Block Chainingを使用して出力バッファに出力します。
  82. この関数呼び出しには、メッセージの暗号化前にwc_AesSetKeyを呼び出してAESオブジェクトが初期化されている必要があります。
  83. この関数は、元のメッセージがAESブロック長で整列していたと仮定し、入力された長さがブロック長の倍数になると予想しています。
  84. これはOpenSSL AES-CBCメソッドとは異なります。これは、PKCS#7パディングを自動的に追加するため、ブロックマルチ入力を必要としません。
  85. wolfSSL機能と同等のOpenSSL関数を相互運用するには、OpenSSLコマンドライン関数で-nopadオプションを指定し、
  86. wolfSSL_ AesCbcEncryptメソッドのように動作し、復号中にエラーを発生させません。
  87. \return 0 メッセージを正常に復号しました
  88. \return BAD_ALIGN_E ブロックアライメントエラー検出時に返される可能性があります
  89. \return BAD_LENGTH_E ライブラリーがWOLFSSL_AES_CBC_LENGTH_CHECKSで構築されている場合で、入力長がAESブロック長の倍数でない場合に返されます。
  90. \param aes データを復号するために使用されるAESオブジェクトへのポインタ。
  91. \param out 復号されたメッセージのプレーンテキストを保存する出力バッファへのポインタ。
  92. サイズはAES_BLOCK_SIZEの倍数でなければなりません。必要な場合はパディングは追加されます。
  93. \param in 復号する暗号テキストを含む入力バッファへのポインタ。
  94. サイズはAES_BLOCK_SIZEの倍数でなければなりません。パディングされている必要があります。
  95. \param sz 入力バッファのサイズ
  96. _Example_
  97. \code
  98. Aes dec;
  99. int ret = 0;
  100. // initialize dec with AesSetKey, using direction AES_DECRYPTION
  101. byte cipher[AES_BLOCK_SIZE * n]; // some multiple of 16 bytes
  102. // fill cipher with cipher text
  103. byte plain [AES_BLOCK_SIZE * n];
  104. if ((ret = wc_AesCbcDecrypt(&dec, plain, cipher, sizeof(cipher))) != 0 ) {
  105. // block align error
  106. }
  107. \endcode
  108. \sa wc_AesSetKey
  109. \sa wc_AesCbcEncrypt
  110. */
  111. int wc_AesCbcDecrypt(Aes* aes, byte* out,
  112. const byte* in, word32 sz);
  113. /*!
  114. \ingroup AES
  115. \brief 入力バッファからメッセージを暗号化/復号し、AES CTRモードを使用して出力バッファーに出力します。
  116. この関数は、wolfSSL_Aes_Counterがコンパイル時に有効になっている場合にのみ有効になります。
  117. この機能を呼び出す前に、Aes構造体をwc_AesSetKeyで初期化する必要があります。
  118. この関数は復号と暗号化の両方に使用されます。_注:暗号化と復号のための同じAPIを使用することについて。ユーザーは暗号化/復号のためのAes構造体を区別する必要があります。
  119. \return int WolfSSLエラーまたは成功状況に対応する整数値
  120. \param aes データを復号するために使用されるAes構造体へのポインタ
  121. \param out 暗号化されたメッセージの暗号化テキストを保存する出力バッファへのポインタ
  122. サイズはAES_BLOCK_SIZEの倍数でなければなりません。必要な場合はパディングは追加されます。
  123. \param in 暗号化されるプレーンテキストを含む入力バッファへのポインタ。
  124. サイズはAES_BLOCK_SIZEの倍数でなければなりません。パディングされている必要があります。
  125. \param sz 入力バッファのサイズ
  126. _Example_
  127. \code
  128. Aes enc;
  129. Aes dec;
  130. // initialize enc and dec with AesSetKeyDirect, using direction
  131. AES_ENCRYPTION
  132. // since the underlying API only calls Encrypt and by default calling
  133. encrypt on
  134. // a cipher results in a decryption of the cipher
  135. byte msg[AES_BLOCK_SIZE * n]; //n being a positive integer making msg
  136. some multiple of 16 bytes
  137. // fill plain with message text
  138. byte cipher[AES_BLOCK_SIZE * n];
  139. byte decrypted[AES_BLOCK_SIZE * n];
  140. wc_AesCtrEncrypt(&enc, cipher, msg, sizeof(msg)); // encrypt plain
  141. wc_AesCtrEncrypt(&dec, decrypted, cipher, sizeof(cipher));
  142. // decrypt cipher text
  143. \endcode
  144. \sa wc_AesSetKey
  145. */
  146. int wc_AesCtrEncrypt(Aes* aes, byte* out,
  147. const byte* in, word32 sz);
  148. /*!
  149. \ingroup AES
  150. \brief この関数は、入力ブロックinで与えられた単一の平文データブロックを暗号化して単一の出力ブロックoutに出力します。
  151. その際に、Aes構造体で提供されたの鍵を使用します。鍵はこの機能を呼び出す前にwc_AesSetKeyで初期化されている必要があります。
  152. wc_AesSetKeyへの入力ivにはNULLを指定して呼び出してください。
  153. これは、Configure Option WolfSSL_AES_DIRECTが有効になっている場合にのみ有効になります。
  154. __ warning:ほぼすべてのユースケースでECBモードは安全性が低いと考えられています。
  155. 可能な限りECB APIを直接使用しないでください。
  156. \return int WolfSSLエラーまたは成功状況に対応する整数値
  157. \param aes データの暗号化に使用されるAes構造体へのポインタ
  158. \param out 暗号化されたメッセージの暗号化テキストを保存する出力バッファへのポインタ
  159. _Example_
  160. \code
  161. Aes enc;
  162. // initialize enc with AesSetKey, using direction AES_ENCRYPTION
  163. byte msg [AES_BLOCK_SIZE]; // 16 bytes
  164. // initialize msg with plain text to encrypt
  165. byte cipher[AES_BLOCK_SIZE];
  166. wc_AesEncryptDirect(&enc, cipher, msg);
  167. \endcode
  168. \sa wc_AesDecryptDirect
  169. \sa wc_AesSetKeyDirect
  170. */
  171. int wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in);
  172. /*!
  173. \ingroup AES
  174. \brief この関数は、入力ブロックinで与えられた単一の暗号データブロックを復号して単一の出力ブロックoutに出力します。
  175. 提供されたAes構造体の鍵を使用します。Aes構造体は、この機能を呼び出す前にwc_AesSetKeyで初期化される必要があります。wc_AesSetKeyは、ivがNULLで呼び出される必要があります。
  176. これは、Configure Option WOLFSSL_AES_DIRECTが有効になっている場合にのみ有効になります。
  177. __ warning:ほぼすべてのユースケースでECBモードは安全性が低いと考えられています。可能な限りECB APIを直接使用しないでください。
  178. \return int WolfSSLエラーまたは成功状況に対応する整数値
  179. \param aes データの復号に使用されるAESオブジェクトへのポインタ
  180. \param out 復号された平文テキストを格納する出力バッファへのポインタ
  181. _Example_
  182. \code
  183. Aes dec;
  184. // initialize enc with AesSetKey, using direction AES_DECRYPTION
  185. byte cipher [AES_BLOCK_SIZE]; // 16 bytes
  186. // initialize cipher with cipher text to decrypt
  187. byte msg[AES_BLOCK_SIZE];
  188. wc_AesDecryptDirect(&dec, msg, cipher);
  189. \endcode
  190. \sa wc_AesEncryptDirect
  191. \sa wc_AesSetKeyDirect
  192. */
  193. int wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in);
  194. /*!
  195. \ingroup AES
  196. \brief この関数は、CTRモードのAES鍵をAESで設定するために使用されます。
  197. 指定された鍵、iv(初期化ベクトル)、および暗号化dir(方向)でAESオブジェクトを初期化します。
  198. 構成オプションWOLFSSL_AES_DIRECTが有効になっている場合にのみ有効になります。
  199. wc_AesEncryptDirectとwc_AesDecryptDirectを呼び出す際のAes構造体の初期化にはこの関数を使う必要があります。
  200. 現在wc_AesSetKeyDirectは内部的にwc_AesSetKeyを使用します。
  201. __ warning:ほぼすべてのユースケースでECBモードは安全性が低いと考えられています。
  202. 可能な限りECB APIを直接使用しないでください
  203. \return 0 鍵の設定に成功しました。
  204. \return BAD_FUNC_ARG 与えられたキーが無効な長さの場合に返されます。
  205. \param aes データの暗号化に使用されるAESオブジェクトへのポインタ
  206. \param key 暗号化と復号のための16,24、または32バイトの秘密鍵
  207. \param len 渡された鍵の長さ
  208. \param iv 鍵を初期化するために使用される初期化ベクトル
  209. \param dir 暗号化の方向を指定します。wc_AesEncryptDirectに使用する際にはAES_ENCRYPTION、wc_AesDecryptDirectにはAES_DECRYPTIONを指定します。
  210. (注意: wc_AesSetKeyDirect をAesカウンターモードに使用する際には暗号化/復号によらず、AES_ENCRYPTIONを指定してください。)
  211. _Example_
  212. \code
  213. Aes enc;
  214. int ret = 0;
  215. byte key[] = { some 16, 24, or 32 byte key };
  216. byte iv[] = { some 16 byte iv };
  217. if (ret = wc_AesSetKeyDirect(&enc, key, sizeof(key), iv,
  218. AES_ENCRYPTION) != 0) {
  219. // failed to set aes key
  220. }
  221. \endcode
  222. \sa wc_AesEncryptDirect
  223. \sa wc_AesDecryptDirect
  224. \sa wc_AesSetKey
  225. */
  226. int wc_AesSetKeyDirect(Aes* aes, const byte* key, word32 len,
  227. const byte* iv, int dir);
  228. /*!
  229. \ingroup AES
  230. \brief この機能は、AES GCM(Galois/Counter Mode)の鍵を設定するために使用されます。
  231. 与えられたkeyでAes構造体を初期化します。コンパイル時にConfigureオプションHAVE_AESGCMが有効になっている場合にのみ有効になります。
  232. \return 0 鍵の設定に成功しました。
  233. \return BAD_FUNC_ARG 与えられたkeyが無効な長さの場合に返されます。
  234. \param aes データの暗号化に使用されるAes構造体へのポインタ
  235. \param key 暗号化と復号のための16,24、または32バイトの秘密鍵
  236. _Example_
  237. \code
  238. Aes enc;
  239. int ret = 0;
  240. byte key[] = { some 16, 24,32 byte key };
  241. if (ret = wc_AesGcmSetKey(&enc, key, sizeof(key)) != 0) {
  242. // failed to set aes key
  243. }
  244. \endcode
  245. \sa wc_AesGcmEncrypt
  246. \sa wc_AesGcmDecrypt
  247. */
  248. int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len);
  249. /*!
  250. \ingroup AES
  251. \brief この関数は、バッファinに格納されている平文メッセージを暗号化し結果を出力バッファoutに出力します。
  252. 暗号化する呼び出しごとに新しいiv(初期化ベクトル)が必要です。また、入力認証ベクトル、authIn、authTagへの入力認証ベクトルをエンコードします。
  253. \return 0 入力メッセージの暗号化に成功しました
  254. \param aes データの暗号化に使用されるAESオブジェクトへのポインタ
  255. \param out 暗号テキストを出力する先のバッファへのポインタ。バッファサイズは入力バッファinのサイズ(sz)と同じでなければなりません。
  256. \param in 暗号化する平文メッセージを保持している入力バッファへのポインタ。サイズはAES_BLOCK_SIZEの倍数でなければなりません。パディングされている必要があります。
  257. \param sz 暗号化する入力メッセージの長さ
  258. \param iv 初期化ベクトルを含むバッファへのポインタ
  259. \param ivSz 初期化ベクトルの長さ
  260. \param authTag 認証タグを保存するバッファへのポインタ
  261. \param authTagSz 希望の認証タグの長さ
  262. \param authIn 入力認証ベクトルを含むバッファへのポインタ
  263. _Example_
  264. \code
  265. Aes enc;
  266. // initialize aes structure by calling wc_AesGcmSetKey
  267. byte plain[AES_BLOCK_LENGTH * n]; //n being a positive integer
  268. making plain some multiple of 16 bytes
  269. // initialize plain with msg to encrypt
  270. byte cipher[sizeof(plain)];
  271. byte iv[] = // some 16 byte iv
  272. byte authTag[AUTH_TAG_LENGTH];
  273. byte authIn[] = // Authentication Vector
  274. wc_AesGcmEncrypt(&enc, cipher, plain, sizeof(cipher), iv, sizeof(iv),
  275. authTag, sizeof(authTag), authIn, sizeof(authIn));
  276. \endcode
  277. \sa wc_AesGcmSetKey
  278. \sa wc_AesGcmDecrypt
  279. */
  280. int wc_AesGcmEncrypt(Aes* aes, byte* out,
  281. const byte* in, word32 sz,
  282. const byte* iv, word32 ivSz,
  283. byte* authTag, word32 authTagSz,
  284. const byte* authIn, word32 authInSz);
  285. /*!
  286. \ingroup AES
  287. \brief この関数は、バッファinで与えられた入力暗号テキストを復号し、結果を出力バッファoutに格納します。
  288. また、指定された認証タグ、authTagに対して、入力認証ベクトル、authInをチェックします。
  289. \return 0 入力メッセージの復号に成功しました
  290. \return AES_GCM_AUTH_E 認証タグが提供された認証コードベクトルと一致しない場合、authtag。
  291. \param aes データの復号に使用されるAes構造体へのポインタ
  292. \param out メッセージテキストを保存する出力バッファへのポインタ。サイズは入力バッファinのサイズ(sz)と同じでなければならない。
  293. \param in 暗号テキストを保持する入力バッファへのポインタ。サイズはAES_BLOCK_SIZEの倍数でなければならない。
  294. \param sz 復号する暗号テキストの長さ
  295. \param iv 初期化ベクトルを含むバッファへのポインタ
  296. \param ivSz 初期化ベクトルの長さ
  297. \param authTag 認証タグを含むバッファへのポインタ
  298. \param authTagSz 希望の認証タグの長さ
  299. \param authIn 入力認証ベクトルを含むバッファへのポインタ
  300. _Example_
  301. \code
  302. Aes enc; //can use the same struct as was passed to wc_AesGcmEncrypt
  303. // initialize aes structure by calling wc_AesGcmSetKey if not already done
  304. byte cipher[AES_BLOCK_LENGTH * n]; //n being a positive integer
  305. making cipher some multiple of 16 bytes
  306. // initialize cipher with cipher text to decrypt
  307. byte output[sizeof(cipher)];
  308. byte iv[] = // some 16 byte iv
  309. byte authTag[AUTH_TAG_LENGTH];
  310. byte authIn[] = // Authentication Vector
  311. wc_AesGcmDecrypt(&enc, output, cipher, sizeof(cipher), iv, sizeof(iv),
  312. authTag, sizeof(authTag), authIn, sizeof(authIn));
  313. \endcode
  314. \sa wc_AesGcmSetKey
  315. \sa wc_AesGcmEncrypt
  316. */
  317. int wc_AesGcmDecrypt(Aes* aes, byte* out,
  318. const byte* in, word32 sz,
  319. const byte* iv, word32 ivSz,
  320. const byte* authTag, word32 authTagSz,
  321. const byte* authIn, word32 authInSz);
  322. /*!
  323. \ingroup AES
  324. \brief この関数は、GAROISメッセージ認証に使用されるGmac構造体の鍵を初期化して設定します。
  325. \return 0 鍵の設定に成功しました
  326. \return BAD_FUNC_ARG 引数keyの長さが無効な場合は返されます。
  327. \param gmac 認証に使用されるGmac構造体へのポインタ
  328. \param key 認証のための16,24、または32バイトの秘密鍵
  329. _Example_
  330. \code
  331. Gmac gmac;
  332. key[] = { some 16, 24, or 32 byte length key };
  333. wc_GmacSetKey(&gmac, key, sizeof(key));
  334. \endcode
  335. \sa wc_GmacUpdate
  336. */
  337. int wc_GmacSetKey(Gmac* gmac, const byte* key, word32 len);
  338. /*!
  339. \ingroup AES
  340. \brief この関数はauthIn InputのGMACハッシュを生成し、結果をauthTagバッファに格納します。
  341. wc_GmacUpdateを実行した後、生成されたauthTagを既知の認証タグに比較してメッセージの信頼性を検証する必要があります。
  342. \return 0 GMACハッシュの計算に成功しました。
  343. \param gmac 認証に使用されるGmac構造体へのポインタ
  344. \param iv ハッシュに使用される初期化ベクトル
  345. \param ivSz 使用される初期化ベクトルのサイズ
  346. \param authIn 確認する認証ベクトルを含むバッファへのポインタ
  347. \param authInSz 認証ベクトルのサイズ
  348. \param authTag GMACハッシュを保存する出力バッファへのポインタ
  349. _Example_
  350. \code
  351. Gmac gmac;
  352. key[] = { some 16, 24, or 32 byte length key };
  353. iv[] = { some 16 byte length iv };
  354. wc_GmacSetKey(&gmac, key, sizeof(key));
  355. authIn[] = { some 16 byte authentication input };
  356. tag[AES_BLOCK_SIZE]; // will store authentication code
  357. wc_GmacUpdate(&gmac, iv, sizeof(iv), authIn, sizeof(authIn), tag,
  358. sizeof(tag));
  359. \endcode
  360. \sa wc_GmacSetKey
  361. */
  362. int wc_GmacUpdate(Gmac* gmac, const byte* iv, word32 ivSz,
  363. const byte* authIn, word32 authInSz,
  364. byte* authTag, word32 authTagSz);
  365. /*!
  366. \ingroup AES
  367. \brief この関数は、CCMを使用してAESオブジェクトの鍵を設定します(CBC-MACのカウンタ)。Aes構造体へのポインタを取り、引数で与えられたkeyで初期化します。
  368. \return none
  369. \param aes 引数keyを保管するためのAes構造体
  370. \param key 暗号化と復号のための16,24、または32バイトの秘密鍵
  371. _Example_
  372. \code
  373. Aes enc;
  374. key[] = { some 16, 24, or 32 byte length key };
  375. wc_AesCcmSetKey(&aes, key, sizeof(key));
  376. \endcode
  377. \sa wc_AesCcmEncrypt
  378. \sa wc_AesCcmDecrypt
  379. */
  380. int wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz);
  381. /*!
  382. \ingroup AES
  383. \brief この関数は、CCMを使用して、入力メッセージ、IN、OUT、OUT、OUTをCCM(CBC-MACのカウンタ)を暗号化します。
  384. その後、Authin Inputから認証タグ、AuthtAgを計算して格納します。
  385. \return none
  386. \param aes データの暗号化に使用されるAes構造体へのポインタ
  387. \param out 暗号テキストを保存する出力バッファへのポインタ
  388. \param in 暗号化するメッセージを保持している入力バッファへのポインタ
  389. \param sz 暗号化する入力メッセージの長さ
  390. \param nonce nonceを含むバッファへのポインタ(1回だけ使用されている数)
  391. \param nonceSz ノンスの長さ
  392. \param authTag 認証タグを保存するバッファへのポインタ
  393. \param authTagSz 希望の認証タグの長さ
  394. \param authIn 入力認証ベクトルを含むバッファへのポインタ
  395. _Example_
  396. \code
  397. Aes enc;
  398. // initialize enc with wc_AesCcmSetKey
  399. nonce[] = { initialize nonce };
  400. plain[] = { some plain text message };
  401. cipher[sizeof(plain)];
  402. authIn[] = { some 16 byte authentication input };
  403. tag[AES_BLOCK_SIZE]; // will store authentication code
  404. wc_AesCcmEncrypt(&enc, cipher, plain, sizeof(plain), nonce, sizeof(nonce),
  405. tag, sizeof(tag), authIn, sizeof(authIn));
  406. \endcode
  407. \sa wc_AesCcmSetKey
  408. \sa wc_AesCcmDecrypt
  409. */
  410. int wc_AesCcmEncrypt(Aes* aes, byte* out,
  411. const byte* in, word32 inSz,
  412. const byte* nonce, word32 nonceSz,
  413. byte* authTag, word32 authTagSz,
  414. const byte* authIn, word32 authInSz);
  415. /*!
  416. \ingroup AES
  417. \brief この関数は、CCMを使用して、入力暗号テキストを、CCM(CBC-MACのカウンタ)を使用して出力バッファーに復号します。その後、authIn入力からauthTagを計算します。認証タグが無効な場合は、出力バッファをゼロに設定し、AES_CCM_AUTH_Eを返します。
  418. \return 0 入力メッセージの復号に成功しました
  419. \return AES_CCM_AUTH_E 認証タグが提供された認証コードベクトルと一致しない場合
  420. \param aes データの復号に使用されるAes構造体へのポインタ
  421. \param out 復号したテキストを出力する出力バッファへのポインタ
  422. \param in 復号するメッセージを保持している入力バッファへのポインタ
  423. \param sz 入力暗号テキストのサイズ
  424. \param nonce nonceを含むバッファへのポインタ(1回だけ使用されている数)
  425. \param nonceSz ノンスの長さ
  426. \param authTag 認証タグを保存するバッファへのポインタ
  427. \param authTagSz 希望の認証タグの長さ
  428. \param authIn 入力認証ベクトルを含むバッファへのポインタ
  429. _Example_
  430. \code
  431. Aes dec;
  432. // initialize dec with wc_AesCcmSetKey
  433. nonce[] = { initialize nonce };
  434. cipher[] = { encrypted message };
  435. plain[sizeof(cipher)];
  436. authIn[] = { some 16 byte authentication input };
  437. tag[AES_BLOCK_SIZE] = { authentication tag received for verification };
  438. int return = wc_AesCcmDecrypt(&dec, plain, cipher, sizeof(cipher),
  439. nonce, sizeof(nonce),tag, sizeof(tag), authIn, sizeof(authIn));
  440. if(return != 0) {
  441. // decrypt error, invalid authentication code
  442. }
  443. \endcode
  444. \sa wc_AesCcmSetKey
  445. \sa wc_AesCcmEncrypt
  446. */
  447. int wc_AesCcmDecrypt(Aes* aes, byte* out,
  448. const byte* in, word32 inSz,
  449. const byte* nonce, word32 nonceSz,
  450. const byte* authTag, word32 authTagSz,
  451. const byte* authIn, word32 authInSz);
  452. /*!
  453. \ingroup AES
  454. \brief この関数は、AES XTSモードを使用する暗号化または復号で使用する鍵の設定に使用します。完了したら、AESキーでwc_AesXtsFreeを呼び出すことがユーザーになりました。
  455. \return 0 成功
  456. \param aes 暗号化または復号処理に使用するXtsAes構造体
  457. \param key 補正値(Tewak)を加味したAES鍵を保持しているバッファ
  458. \param len 鍵バッファのサイズ。鍵サイズの2倍にする必要があります。(すなわち、16バイトの鍵の場合は32)
  459. \param dir 処理方向、AES_EncryptionまたはAES_Decryptionのいずれかを指定します。
  460. \param heap メモリに使用するヒープヒント。NULLを設定することもできます。
  461. _Example_
  462. \code
  463. XtsAes aes;
  464. if(wc_AesXtsSetKey(&aes, key, sizeof(key), AES_ENCRYPTION, NULL, 0) != 0)
  465. {
  466. // Handle error
  467. }
  468. wc_AesXtsFree(&aes);
  469. \endcode
  470. \sa wc_AesXtsEncrypt
  471. \sa wc_AesXtsDecrypt
  472. \sa wc_AesXtsFree
  473. */
  474. int wc_AesXtsSetKey(XtsAes* aes, const byte* key,
  475. word32 len, int dir, void* heap, int devId);
  476. /*!
  477. \ingroup AES
  478. \brief wc_AesXtsEncryptと同じ処理を行いますが、バイト配列の代わりにTweak値としてword64型を使用します。本関数でword64をバイト配列に変換し、wc_AesXtsEncryptを呼び出します。
  479. \return 0 成功
  480. \param aes ブロック暗号化/復号に使用するXtsAes構造体
  481. \param out 暗号テキストを保持するための出力バッファ
  482. \param in 暗号化する入力プレーンテキストバッファ
  483. \param sz バッファ(in, out両方)のサイズ
  484. _Example_
  485. \code
  486. XtsAes aes;
  487. unsigned char plain[SIZE];
  488. unsigned char cipher[SIZE];
  489. word64 s = VALUE;
  490. //set up keys with AES_ENCRYPTION as dir
  491. if(wc_AesXtsEncryptSector(&aes, cipher, plain, SIZE, s) != 0)
  492. {
  493. // Handle error
  494. }
  495. wc_AesXtsFree(&aes);
  496. \endcode
  497. \sa wc_AesXtsEncrypt
  498. \sa wc_AesXtsDecrypt
  499. \sa wc_AesXtsSetKey
  500. \sa wc_AesXtsFree
  501. */
  502. int wc_AesXtsEncryptSector(XtsAes* aes, byte* out,
  503. const byte* in, word32 sz, word64 sector);
  504. /*!
  505. \ingroup AES
  506. \brief wc_AesXtsDecryptと同じ処理を行いますが、バイト配列の代わりにTweak値としてword64タイプを使用します。本関数でword64をバイト配列に変換するだけです。
  507. \return 0 成功
  508. \param aes ブロック暗号化/復号に使用するXtsAes構造体
  509. \param out プレーンテキストを保持するための出力バッファ
  510. \param in 復号する暗号テキストバッファ
  511. \param sz バッファ(in, out両方)のサイズ
  512. _Example_
  513. \code
  514. XtsAes aes;
  515. unsigned char plain[SIZE];
  516. unsigned char cipher[SIZE];
  517. word64 s = VALUE;
  518. //set up aes key with AES_DECRYPTION as dir and tweak with AES_ENCRYPTION
  519. if(wc_AesXtsDecryptSector(&aes, plain, cipher, SIZE, s) != 0)
  520. {
  521. // Handle error
  522. }
  523. wc_AesXtsFree(&aes);
  524. \endcode
  525. \sa wc_AesXtsEncrypt
  526. \sa wc_AesXtsDecrypt
  527. \sa wc_AesXtsSetKey
  528. \sa wc_AesXtsFree
  529. */
  530. int wc_AesXtsDecryptSector(XtsAes* aes, byte* out,
  531. const byte* in, word32 sz, word64 sector);
  532. /*!
  533. \ingroup AES
  534. \brief AES XTSモードで暗号化します。(XTS)XEX暗号化と平文がブロック長の倍数でない場合の処理(Ciphertext Stealing)を行います。
  535. \return 0 成功
  536. \param aes ブロック暗号化/復号に使用するXtsAes構造体
  537. \param out 暗号テキストを保持するための出力バッファ
  538. \param in 暗号化する入力プレーンテキストを含むバッファ
  539. \param sz バッファ(in, out両方)のサイズ
  540. \param i Tweakに使用する値
  541. _Example_
  542. \code
  543. XtsAes aes;
  544. unsigned char plain[SIZE];
  545. unsigned char cipher[SIZE];
  546. unsigned char i[AES_BLOCK_SIZE];
  547. //set up key with AES_ENCRYPTION as dir
  548. if(wc_AesXtsEncrypt(&aes, cipher, plain, SIZE, i, sizeof(i)) != 0)
  549. {
  550. // Handle error
  551. }
  552. wc_AesXtsFree(&aes);
  553. \endcode
  554. \sa wc_AesXtsDecrypt
  555. \sa wc_AesXtsSetKey
  556. \sa wc_AesXtsFree
  557. */
  558. int wc_AesXtsEncrypt(XtsAes* aes, byte* out,
  559. const byte* in, word32 sz, const byte* i, word32 iSz);
  560. /*!
  561. \ingroup AES
  562. \brief 暗号化と同じプロセスですが、XtsAes構造体はAES_Decryptionタイプです。
  563. \return 0 成功
  564. \param aes ブロック暗号化/復号に使用するXtsAes構造体
  565. \param out プレーンテキストを保持するための出力バッファ
  566. \param in 復号する暗号テキストを含むバッファ
  567. \param sz バッファ(in, out両方)のサイズ
  568. \param i Tweakに使用する値
  569. _Example_
  570. \code
  571. XtsAes aes;
  572. unsigned char plain[SIZE];
  573. unsigned char cipher[SIZE];
  574. unsigned char i[AES_BLOCK_SIZE];
  575. //set up key with AES_DECRYPTION as dir and tweak with AES_ENCRYPTION
  576. if(wc_AesXtsDecrypt(&aes, plain, cipher, SIZE, i, sizeof(i)) != 0)
  577. {
  578. // Handle error
  579. }
  580. wc_AesXtsFree(&aes);
  581. \endcode
  582. \sa wc_AesXtsEncrypt
  583. \sa wc_AesXtsSetKey
  584. \sa wc_AesXtsFree
  585. */
  586. int wc_AesXtsDecrypt(XtsAes* aes, byte* out,
  587. const byte* in, word32 sz, const byte* i, word32 iSz);
  588. /*!
  589. \ingroup AES
  590. \brief この関数はXtsAes構造体で使用されるすべてのリソースを解放します。
  591. \return 0 成功
  592. _Example_
  593. \code
  594. XtsAes aes;
  595. if(wc_AesXtsSetKey(&aes, key, sizeof(key), AES_ENCRYPTION, NULL, 0) != 0)
  596. {
  597. // Handle error
  598. }
  599. wc_AesXtsFree(&aes);
  600. \endcode
  601. \sa wc_AesXtsEncrypt
  602. \sa wc_AesXtsDecrypt
  603. \sa wc_AesXtsSetKey
  604. */
  605. int wc_AesXtsFree(XtsAes* aes);
  606. /*!
  607. \ingroup AES
  608. \brief Aes構造体を初期化します。ヒープヒントを設定し、ASYNCハードウェアを使用する場合のIDも設定します。Aes構造体の使用が終了した際にwc_AesFreeを呼び出すのはユーザーに任されています。
  609. \return 0 成功
  610. \param aes 初期化対象のAes構造体
  611. \param heap 必要に応じてmalloc / freeに使用するヒープヒント
  612. _Example_
  613. \code
  614. Aes enc;
  615. void* hint = NULL;
  616. int devId = INVALID_DEVID; //if not using async INVALID_DEVID is default
  617. //heap hint could be set here if used
  618. wc_AesInit(&enc, hint, devId);
  619. \endcode
  620. \sa wc_AesSetKey
  621. \sa wc_AesSetIV
  622. */
  623. int wc_AesInit(Aes* aes, void* heap, int devId);
  624. /*!
  625. \ingroup AES
  626. \brief Aes構造体に関連つけられたリソースを可能なら解放します。
  627. 内部的にはノーオペレーションとなることもありますが、ベストプラクティスとしてどのケースでもこの関数を呼び出すことを推奨します。
  628. \return 戻り値なし
  629. \param aes FreeすべきAes構造体へのポインタ
  630. _Example_
  631. \code
  632. Aes enc;
  633. void* hint = NULL;
  634. int devId = INVALID_DEVID; //if not using async INVALID_DEVID is default
  635. //heap hint could be set here if used
  636. wc_AesInit(&enc, hint, devId);
  637. // ... do some interesting things ...
  638. wc_AesFree(&enc);
  639. \endcode
  640. \sa wc_AesInit
  641. */
  642. int wc_AesFree(Aes* aes);
  643. /*!
  644. \ingroup AES
  645. \brief AES CFBモードで暗号化を行います。
  646. \return 0 成功時に返ります。失敗時には負値が返されます。
  647. \param aes ブロック暗号化/復号に使用するAes構造体
  648. \param out 暗号テキストを保持するための出力バッファは、少なくとも入力プレーンテキストバッファと同じサイズが必要です。
  649. \param in 暗号化する入力プレーンテキストバッファ
  650. _Example_
  651. \code
  652. Aes aes;
  653. unsigned char plain[SIZE];
  654. unsigned char cipher[SIZE];
  655. //set up key with AES_ENCRYPTION as dir for both encrypt and decrypt
  656. if(wc_AesCfbEncrypt(&aes, cipher, plain, SIZE) != 0)
  657. {
  658. // Handle error
  659. }
  660. \endcode
  661. \sa wc_AesCfbDecrypt
  662. \sa wc_AesSetKey
  663. */
  664. int wc_AesCfbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz);
  665. /*!
  666. \ingroup AES
  667. \brief AES CFBモードで復号を行います。
  668. \return 0 成功時に返ります。失敗時には負値が返されます。
  669. \param aes ブロック暗号化/復号に使用するAes構造体
  670. \param out 復号されたテキストを保持するための出力バッファは、少なくとも入力バッファと同じサイズが必要です。
  671. \param in 復号する暗号データを保持した入力バッファ
  672. _Example_
  673. \code
  674. Aes aes;
  675. unsigned char plain[SIZE];
  676. unsigned char cipher[SIZE];
  677. //set up key with AES_ENCRYPTION as dir for both encrypt and decrypt
  678. if(wc_AesCfbDecrypt(&aes, plain, cipher, SIZE) != 0)
  679. {
  680. // Handle error
  681. }
  682. \endcode
  683. \sa wc_AesCfbEncrypt
  684. \sa wc_AesSetKey
  685. */
  686. int wc_AesCfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz);
  687. /*!
  688. \ingroup AES
  689. \brief この関数は、RFC 5297に記載されているようにSIV(合成初期化ベクトル)暗号化を実行します。
  690. \return 0 暗号化に成功した場合
  691. \return BAD_FUNC_ARG 鍵、SIV、または出力バッファがNULLの場合。鍵サイズが32,48、または64バイトの場合にも返されます。
  692. \return Other その他の負のエラー値。AESまたはCMAC操作が失敗した場合に返されます。
  693. \param key 使用する鍵を含むバイトバッファ。
  694. \param keySz 鍵バッファの長さ(バイト単位)。
  695. \param assoc 追加の認証された関連データ(AD)。
  696. \param assocSz ADバッファのバイト数
  697. \param nonce ナンス(一度だけ使用される値)。ADと同じ方法でアルゴリズムによって使用されます。
  698. \param nonceSz バイト単位のナンスバッファの長さ。
  699. \param in 暗号化する平文のバッファ。
  700. \param inSz 平文バッファの長さ
  701. \param siv S2VによるSIV出力(RFC 5297 2.4参照)。
  702. _Example_
  703. \code
  704. byte key[] = { some 32, 48, or 64 byte key };
  705. byte assoc[] = {0x01, 0x2, 0x3};
  706. byte nonce[] = {0x04, 0x5, 0x6};
  707. byte plainText[] = {0xDE, 0xAD, 0xBE, 0xEF};
  708. byte siv[AES_BLOCK_SIZE];
  709. byte cipherText[sizeof(plainText)];
  710. if (wc_AesSivEncrypt(key, sizeof(key), assoc, sizeof(assoc), nonce,
  711. sizeof(nonce), plainText, sizeof(plainText), siv, cipherText) != 0) {
  712. // failed to encrypt
  713. }
  714. \endcode
  715. \sa wc_AesSivDecrypt
  716. */
  717. int wc_AesSivEncrypt(const byte* key, word32 keySz, const byte* assoc,
  718. word32 assocSz, const byte* nonce, word32 nonceSz,
  719. const byte* in, word32 inSz, byte* siv, byte* out);
  720. /*!
  721. \ingroup AES
  722. \brief この機能は、RFC 5297に記載されているようにSIV(合成初期化ベクトル)復号を実行します
  723. \return 0 復号に成功した場合
  724. \return BAD_FUNC_ARG 鍵、SIV、または出力バッファがNULLの場合。キーサイズが32,48、または64バイトの場合にも返されます。
  725. \return AES_SIV_AUTH_E S2Vによって派生したSIVが入力SIVと一致しない場合(RFC 5297 2.7を参照)。
  726. \return Other その他の負のエラー値。AESまたはCMAC操作が失敗した場合に返されます。
  727. \param key 使用する鍵を含むバイトバッファ。
  728. \param keySz 鍵バッファの長さ(バイト単位)。
  729. \param assoc 追加の認証された関連データ(AD)。
  730. \param assocSz ADバッファのバイト数
  731. \param nonce ナンス(一度だけ使用される値)。ADと同じ方法で、基礎となるアルゴリズムによって使用されます。
  732. \param nonceSz バイト単位のナンスバッファの長さ。
  733. \param in 復号する暗号文バッファ。
  734. \param inSz 暗号文バッファの長さ
  735. \param siv 暗号文に付随するSIV(RFC 5297 2.4を参照)。
  736. _Example_
  737. \code
  738. byte key[] = { some 32, 48, or 64 byte key };
  739. byte assoc[] = {0x01, 0x2, 0x3};
  740. byte nonce[] = {0x04, 0x5, 0x6};
  741. byte cipherText[] = {0xDE, 0xAD, 0xBE, 0xEF};
  742. byte siv[AES_BLOCK_SIZE] = { the SIV that came with the ciphertext };
  743. byte plainText[sizeof(cipherText)];
  744. if (wc_AesSivDecrypt(key, sizeof(key), assoc, sizeof(assoc), nonce,
  745. sizeof(nonce), cipherText, sizeof(cipherText), siv, plainText) != 0) {
  746. // failed to decrypt
  747. }
  748. \endcode
  749. \sa wc_AesSivEncrypt
  750. */
  751. int wc_AesSivDecrypt(const byte* key, word32 keySz, const byte* assoc,
  752. word32 assocSz, const byte* nonce, word32 nonceSz,
  753. const byte* in, word32 inSz, byte* siv, byte* out);