/*!
    \ingroup CMAC
    \brief Cmac構造体をデフォルト値で初期化します
    \return 0 成功時
    \param cmac Cmac構造体へのポインタ
    \param key キーポインタ
    \param keySz キーポインタのサイズ(16、24、または32)
    \param type 常にWC_CMAC_AES = 1
    \param unused 使用されません。互換性に関する将来の使用の可能性のために存在します

    _Example_
    \code
    Cmac cmac[1];
    ret = wc_InitCmac(cmac, key, keySz, WC_CMAC_AES, NULL);
    if (ret == 0) {
        ret = wc_CmacUpdate(cmac, in, inSz);
    }
    if (ret == 0) {
        ret = wc_CmacFinal(cmac, out, outSz);
    }
    \endcode

    \sa wc_InitCmac_ex
    \sa wc_CmacUpdate
    \sa wc_CmacFinal
    \sa wc_CmacFinalNoFree
    \sa wc_CmacFree
*/
int wc_InitCmac(Cmac* cmac,
                const byte* key, word32 keySz,
                int type, void* unused);

/*!
    \ingroup CMAC
    \brief Cmac構造体をデフォルト値で初期化します
    \return 0 成功時
    \param cmac Cmac構造体へのポインタ
    \param key キーポインタ
    \param keySz キーポインタのサイズ(16、24、または32)
    \param type 常にWC_CMAC_AES = 1
    \param unused 使用されません。互換性に関する将来の使用の可能性のために存在します
    \param heap 動的割り当てに使用されるヒープヒントへのポインタ。通常、静的メモリオプションで使用されます。NULLにできます。
    \param devId 暗号コールバックまたは非同期ハードウェアで使用するID。使用しない場合はINVALID_DEVID(-2)に設定します

    _Example_
    \code
    Cmac cmac[1];
    ret = wc_InitCmac_ex(cmac, key, keySz, WC_CMAC_AES, NULL, NULL, INVALID_DEVID);
    if (ret == 0) {
        ret = wc_CmacUpdate(cmac, in, inSz);
    }
    if (ret == 0) {
        ret = wc_CmacFinal(cmac, out, &outSz);
    }
    \endcode

    \sa wc_InitCmac_ex
    \sa wc_CmacUpdate
    \sa wc_CmacFinal
    \sa wc_CmacFinalNoFree
    \sa wc_CmacFree
*/
int wc_InitCmac_ex(Cmac* cmac,
                const byte* key, word32 keySz,
                int type, void* unused, void* heap, int devId);

/*!
    \ingroup CMAC
    \brief 暗号ベースメッセージ認証コード入力データを追加します
    \return 0 成功時
    \param cmac Cmac構造体へのポインタ
    \param in 処理する入力データ
    \param inSz 入力データのサイズ

    _Example_
    \code
    ret = wc_CmacUpdate(cmac, in, inSz);
    \endcode

    \sa wc_InitCmac
    \sa wc_CmacFinal
    \sa wc_CmacFinalNoFree
    \sa wc_CmacFree
*/
int wc_CmacUpdate(Cmac* cmac,
                  const byte* in, word32 inSz);


/*!
    \ingroup CMAC
    \brief 暗号ベースメッセージ認証コードを使用して最終結果を生成し、コンテキストのクリーンアップを延期します。
    \return 0 成功時
    \param cmac Cmac構造体へのポインタ
    \param out 結果を返すポインタ
    \param outSz 出力のポインタサイズ(入出力)

    _Example_
    \code
    ret = wc_CmacFinalNoFree(cmac, out, &outSz);
    (void)wc_CmacFree(cmac);
    \endcode

    \sa wc_InitCmac
    \sa wc_CmacFinal
    \sa wc_CmacFinalNoFree
    \sa wc_CmacFree
*/
int wc_CmacFinalNoFree(Cmac* cmac,
                 byte* out, word32* outSz);

/*!
    \ingroup CMAC
    \brief 暗号ベースメッセージ認証コードを使用して最終結果を生成し、wc_CmacFree()でコンテキストをクリーンアップします。
    \return 0 成功時
    \param cmac Cmac構造体へのポインタ
    \param out 結果を返すポインタ
    \param outSz 出力のポインタサイズ(入出力)

    _Example_
    \code
    ret = wc_CmacFinal(cmac, out, &outSz);
    \endcode

    \sa wc_InitCmac
    \sa wc_CmacFinalNoFree
    \sa wc_CmacFinalNoFree
    \sa wc_CmacFree
*/
int wc_CmacFinal(Cmac* cmac,
                 byte* out, word32* outSz);

/*!
    \ingroup CMAC
    \brief CMACコンテキスト内の割り当てをクリーンアップします。
    \return 0 成功時
    \param cmac Cmac構造体へのポインタ

    _Example_
    \code
    ret = wc_CmacFinalNoFree(cmac, out, &outSz);
    (void)wc_CmacFree(cmac);
    \endcode

    \sa wc_InitCmac
    \sa wc_CmacFinalNoFree
    \sa wc_CmacFinal
    \sa wc_CmacFree
*/
int wc_CmacFree(Cmac* cmac);

/*!
    \ingroup CMAC
    \brief CMACを生成するためのシングルショット関数
    \return 0 成功時
    \param out 結果を返すポインタ
    \param outSz 出力のポインタサイズ(入出力)
    \param in 処理する入力データ
    \param inSz 入力データのサイズ
    \param key キーポインタ
    \param keySz キーポインタのサイズ(16、24、または32)

    _Example_
    \code
    ret = wc_AesCmacGenerate(mac, &macSz, msg, msgSz, key, keySz);
    \endcode

    \sa wc_AesCmacVerify
*/
int wc_AesCmacGenerate(byte* out, word32* outSz,
                       const byte* in, word32 inSz,
                       const byte* key, word32 keySz);

/*!
    \ingroup CMAC
    \brief CMACを検証するためのシングルショット関数
    \return 0 成功時
    \param check 検証するCMAC値
    \param checkSz checkバッファのサイズ
    \param in 処理する入力データ
    \param inSz 入力データのサイズ
    \param key キーポインタ
    \param keySz キーポインタのサイズ(16、24、または32)

    _Example_
    \code
    ret = wc_AesCmacVerify(mac, macSz, msg, msgSz, key, keySz);
    \endcode

    \sa wc_AesCmacGenerate
*/
int wc_AesCmacVerify(const byte* check, word32 checkSz,
                     const byte* in, word32 inSz,
                     const byte* key, word32 keySz);


/*!
    \ingroup CMAC
    \brief ハードウェアがシングルショットを必要とし、更新をメモリにキャッシュする必要がある場合にWOLFSSL_HASH_KEEPでのみ使用されます
    \return 0 成功時
    \param in 処理する入力データ
    \param inSz 入力データのサイズ

    _Example_
    \code
    ret = wc_CMAC_Grow(cmac, in, inSz)
    \endcode
*/
int wc_CMAC_Grow(Cmac* cmac, const byte* in, int inSz);
