aes.h 35 KB

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