/*!
    \ingroup ASCON
    \brief この関数は、ハッシュ化のためにASCONコンテキストを初期化します。

    \return 0 成功時。
    \return BAD_FUNC_ARG コンテキストポインタがNULLの場合。

    \param a 初期化するASCONコンテキストへのポインタ。

    _Example_
    \code
    wc_AsconHash256 a;
    byte data[] = {0x01, 0x02, 0x03};
    byte hash[ASCON_HASH256_SZ];

    if (wc_AsconHash256_Init(&a) != 0)
        // エラーを処理
    if (wc_AsconHash256_Update(&ctx, data, sizeof(data)) != 0)
        // エラーを処理
    if (wc_AsconHash256_Final(&ctx, hash, sizeof(hash)) != 0)
        // エラーを処理
    // hashに最終ハッシュが含まれます
    \endcode

    \sa wc_AsconHash256_Update
    \sa wc_AsconHash256_Final
    */
int wc_AsconHash256_Init(wc_AsconHash256* a);

/*!
    \ingroup ASCON
    \brief この関数は、入力データでASCONハッシュを更新します。

    \return 0 成功時。
    \return BAD_FUNC_ARG コンテキストまたは入力ポインタがNULLの場合。

    \param ctx ASCONコンテキストへのポインタ。
    \param in 入力データへのポインタ。
    \param inSz 入力データのサイズ。

    _Example_
    \code
    wc_AsconHash256 a;
    byte data[] = {0x01, 0x02, 0x03};
    byte hash[ASCON_HASH256_SZ];

    if (wc_AsconHash256_Init(&a) != 0)
        // エラーを処理
    if (wc_AsconHash256_Update(&ctx, data, sizeof(data)) != 0)
        // エラーを処理
    if (wc_AsconHash256_Final(&ctx, hash, sizeof(hash)) != 0)
        // エラーを処理
    // hashに最終ハッシュが含まれます
    \endcode

    \sa wc_AsconHash256_Init
    \sa wc_AsconHash256_Final
    */
int wc_AsconHash256_Update(wc_AsconHash256* a, const byte* data, word32 dataSz);

/*!
    \ingroup ASCON
    \brief この関数は、ASCONハッシュを完了し、出力を生成します。

    \return 0 成功時。
    \return BAD_FUNC_ARG コンテキストまたは出力ポインタがNULLの場合。

    \param ctx ASCONコンテキストへのポインタ。
    \param out 出力バッファへのポインタ。
    \param outSz 出力バッファのサイズ、少なくともASCON_HASH256_SZである必要があります。

    _Example_
    \code
    wc_AsconHash256 a;
    byte data[] = {0x01, 0x02, 0x03};
    byte hash[ASCON_HASH256_SZ];

    if (wc_AsconHash256_Init(&a) != 0)
        // エラーを処理
    if (wc_AsconHash256_Update(&ctx, data, sizeof(data)) != 0)
        // エラーを処理
    if (wc_AsconHash256_Final(&ctx, hash, sizeof(hash)) != 0)
        // エラーを処理
    // hashに最終ハッシュが含まれます
    \endcode

    \sa wc_AsconHash256_Init
    \sa wc_AsconHash256_Update
    */
int wc_AsconHash256_Final(wc_AsconHash256* a, byte* hash);

/*!
    \ingroup ASCON
    \brief この関数は、新しいAscon AEADコンテキストを割り当てて初期化します。

    \return pointer 新しく割り当てられたAscon AEADコンテキストへのポインタ
    \return NULL 失敗時。

    _Example_
    \code
    wc_AsconAEAD128* a = wc_AsconAEAD128_New();
    if (a == NULL) {
        // 割り当てエラーを処理
    }
    wc_AsconAEAD128_Free(a);
    \endcode

    \sa wc_AsconAEAD128_Free
*/
wc_AsconAEAD128* wc_AsconAEAD128_New(void);

/*!
    \ingroup ASCON
    \brief この関数は、Ascon AEADコンテキストに関連付けられたリソースを解放します。

    \param a 解放するAscon AEADコンテキストへのポインタ。

    _Example_
    \code
    wc_AsconAEAD128* a = wc_AsconAEAD128_New();
    if (a == NULL) {
        // 割り当てエラーを処理
    }
    // コンテキストを使用
    wc_AsconAEAD128_Free(a);
    \endcode

    \sa wc_AsconAEAD128_New
*/
void wc_AsconAEAD128_Free(wc_AsconAEAD128 *a);


/*!
    \ingroup ASCON
    \brief この関数は、Ascon AEADコンテキストを初期化します。

    \return 0 成功時。
    \return BAD_FUNC_ARG コンテキストまたは出力ポインタがNULLの場合。

    \param a 初期化するAscon AEADコンテキストへのポインタ。

    _Example_
    \code
    AsconAead a;

    if (wc_AsconAEAD128_Init(&a) != 0)
        // エラーを処理
    \endcode

    \sa wc_AsconAeadEncrypt
    \sa wc_AsconAeadDecrypt
    */
int wc_AsconAEAD128_Init(wc_AsconAEAD128* a);

/*!
    \ingroup ASCON
    \brief この関数は、Ascon AEADコンテキストを非初期化します。コンテキストは解放しません。

    \param a 非初期化するAscon AEADコンテキストへのポインタ。

    _Example_
    \code
    AsconAead a;

    if (wc_AsconAEAD128_Init(&a) != 0)
        // エラーを処理
    wc_AsconAEAD128_Clear(&a);
    \endcode

    \sa wc_AsconAeadEncrypt
    \sa wc_AsconAeadDecrypt
    */
void wc_AsconAEAD128_Clear(wc_AsconAEAD128 *a);

/*!
    \ingroup ASCON
    \brief この関数は、Ascon AEADコンテキストの鍵を設定します。

    \return 0 成功時。
    \return BAD_FUNC_ARG コンテキストまたは鍵ポインタがNULLの場合。
    \return BAD_STATE_E 鍵が既に設定されている場合。

    \param a 初期化されたAscon AEADコンテキストへのポインタ。
    \param key ASCON_AEAD128_KEY_SZの長さの鍵バッファへのポインタ。

    _Example_
    \code
    wc_AsconAEAD128 a;
    byte key[ASCON_AEAD128_KEY_SZ] = { ... };

    if (wc_AsconAEAD128_Init(&a) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetKey(&a, key) != 0)
        // エラーを処理
    \endcode

    \sa wc_AsconAEAD128_Init
    \sa wc_AsconAEAD128_SetNonce
    \sa wc_AsconAEAD128_SetAD
*/
int wc_AsconAEAD128_SetKey(wc_AsconAEAD128* a, const byte* key);

/*!
    \ingroup ASCON
    \brief この関数は、Ascon AEADコンテキストのnonceを設定します。

    \return 0 成功時。
    \return BAD_FUNC_ARG コンテキストまたはnonceポインタがNULLの場合。
    \return BAD_STATE_E nonceが既に設定されている場合。

    \param a 初期化されたAscon AEADコンテキストへのポインタ。
    \param nonce ASCON_AEAD128_NONCE_SZの長さのnonceバッファへのポインタ。

    _Example_
    \code
    wc_AsconAEAD128 a;
    byte nonce[ASCON_AEAD128_NONCE_SZ] = { ... };

    if (wc_AsconAEAD128_Init(&a) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetNonce(&a, nonce) != 0)
        // エラーを処理
    \endcode

    \sa wc_AsconAEAD128_Init
    \sa wc_AsconAEAD128_SetKey
    \sa wc_AsconAEAD128_SetAD
*/
int wc_AsconAEAD128_SetNonce(wc_AsconAEAD128* a, const byte* nonce);

/*!
    \ingroup ASCON
    \brief この関数は、Ascon AEADコンテキストの関連データを設定します。

    \return 0 成功時。
    \return BAD_FUNC_ARG コンテキストまたは関連データポインタがNULLの場合。
    \return BAD_STATE_E 鍵またはnonceが設定されていない場合。

    \param a 初期化されたAscon AEADコンテキストへのポインタ。
    \param ad 関連データバッファへのポインタ。
    \param adSz 関連データバッファのサイズ。

    _Example_
    \code
    wc_AsconAEAD128 a;
    byte key[ASCON_AEAD128_KEY_SZ] = { ... };
    byte nonce[ASCON_AEAD128_NONCE_SZ] = { ... };
    byte ad[] = { ... };

    if (wc_AsconAEAD128_Init(&a) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetKey(&a, key) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetNonce(&a, nonce) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetAD(&a, ad, sizeof(ad)) != 0)
        // エラーを処理
    \endcode

    \sa wc_AsconAEAD128_Init
    \sa wc_AsconAEAD128_SetKey
    \sa wc_AsconAEAD128_SetNonce
*/
int wc_AsconAEAD128_SetAD(wc_AsconAEAD128* a, const byte* ad, word32 adSz);

/*!
    \ingroup ASCON
    \brief この関数は、Ascon AEADを使用して平文メッセージを暗号化します。出力はoutバッファに格納されます。出力の長さは入力の長さと等しくなります。

    \return 0 成功時。
    \return BAD_FUNC_ARG コンテキストまたは出力ポインタがNULLの場合、または入力サイズが0より大きいのに入力がNULLの場合。
    \return BAD_STATE_E 鍵、nonce、または追加データが設定されていない場合、またはコンテキストが以前に復号に使用された場合。

    \param a 初期化されたAscon AEADコンテキストへのポインタ。
    \param out 暗号文を格納する出力バッファへのポインタ。
    \param in 平文メッセージを含む入力バッファへのポインタ。
    \param inSz 入力バッファの長さ。

    _Example_
    \code
    wc_AsconAEAD128 a;
    byte key[ASCON_AEAD128_KEY_SZ] = { ... };
    byte nonce[ASCON_AEAD128_NONCE_SZ] = { ... };
    byte plaintext[PLAIN_TEXT_SIZE] = { ... };
    byte ciphertext[CIPHER_TEXT_SIZE];
    byte tag[ASCON_AEAD128_TAG_SZ] = { ... };

    if (wc_AsconAeadInit(&a) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetKey(&a, key) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetNonce(&a, nonce) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetAD(&a, ad, sizeof(ad)) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_EncryptUpdate(&a, ciphertext, plaintext,
                                      sizeof(plaintext)) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_EncryptFinal(&a, tag) != 0)
        // エラーを処理
    \endcode

    \sa wc_AsconAeadInit
    \sa wc_AsconAEAD128_Clear
    \sa wc_AsconAEAD128_SetKey
    \sa wc_AsconAEAD128_SetNonce
    \sa wc_AsconAEAD128_SetAD
    \sa wc_AsconAEAD128_EncryptFinal
    \sa wc_AsconAEAD128_DecryptUpdate
    \sa wc_AsconAEAD128_DecryptFinal
    */
int wc_AsconAEAD128_EncryptUpdate(wc_AsconAEAD128* a, byte* out, const byte* in,
                                  word32 inSz);

/*!
    \ingroup ASCON
    \brief この関数は、Ascon AEADを使用した暗号化プロセスを完了し、認証タグを生成します。

    \return 0 成功時。
    \return BAD_FUNC_ARG コンテキストまたは出力ポインタがNULLの場合、または入力サイズが0より大きいのに入力がNULLの場合。
    \return BAD_STATE_E 鍵、nonce、または追加データが設定されていない場合、またはコンテキストが以前に復号に使用された場合。

    \param a 初期化されたAscon AEADコンテキストへのポインタ。
    \param tag 認証タグを格納する出力バッファへのポインタ。

    _Example_
    \code
    wc_AsconAEAD128 a;
    byte key[ASCON_AEAD128_KEY_SZ] = { ... };
    byte nonce[ASCON_AEAD128_NONCE_SZ] = { ... };
    byte plaintext[PLAIN_TEXT_SIZE] = { ... };
    byte ciphertext[CIPHER_TEXT_SIZE];
    byte tag[ASCON_AEAD128_TAG_SZ] = { ... };

    if (wc_AsconAeadInit(&a) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetKey(&a, key) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetNonce(&a, nonce) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetAD(&a, ad, sizeof(ad)) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_EncryptUpdate(&a, ciphertext, plaintext,
                                      sizeof(plaintext)) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_EncryptFinal(&a, tag) != 0)
        // エラーを処理
    \endcode

    \sa wc_AsconAEAD128_Init
    \sa wc_AsconAEAD128_SetKey
    \sa wc_AsconAEAD128_SetNonce
    \sa wc_AsconAEAD128_SetAD
    \sa wc_AsconAEAD128_EncryptUpdate
    \sa wc_AsconAEAD128_DecryptUpdate
    \sa wc_AsconAEAD128_DecryptFinal
    */
int wc_AsconAEAD128_EncryptFinal(wc_AsconAEAD128* a, byte* tag);

/*!
    \ingroup ASCON
    \brief この関数は、Ascon AEADを使用した復号プロセスを更新します。出力はoutバッファに格納されます。出力の長さは入力の長さと等しくなります。

    \return 0 成功時。
    \return BAD_FUNC_ARG コンテキストまたは出力ポインタがNULLの場合、または入力サイズが0より大きいのに入力がNULLの場合。
    \return BAD_STATE_E 鍵、nonce、または追加データが設定されていない場合、またはコンテキストが以前に暗号化に使用された場合。

    \param a 初期化されたAscon AEADコンテキストへのポインタ。
    \param out 平文を格納する出力バッファへのポインタ。
    \param in 暗号文メッセージを含む入力バッファへのポインタ。
    \param inSz 入力バッファの長さ。

    _Example_
    \code
    wc_AsconAEAD128 a;
    byte key[ASCON_AEAD128_KEY_SZ] = { ... };
    byte nonce[ASCON_AEAD128_NONCE_SZ] = { ... };
    byte ciphertext[CIPHER_TEXT_SIZE] = { ... };
    byte plaintext[PLAIN_TEXT_SIZE];
    byte tag[ASCON_AEAD128_TAG_SZ] = { ... };

    if (wc_AsconAeadInit(&a) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetKey(&a, key) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetNonce(&a, nonce) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetAD(&a, ad, sizeof(ad)) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_DecryptUpdate(&a, plaintext, ciphertext,
                                      sizeof(ciphertext)) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_DecryptFinal(&a, tag) != 0)
        // エラーを処理
    \endcode

    \sa wc_AsconAEAD128_Init
    \sa wc_AsconAEAD128_SetKey
    \sa wc_AsconAEAD128_SetNonce
    \sa wc_AsconAEAD128_SetAD
    \sa wc_AsconAEAD128_EncryptUpdate
    \sa wc_AsconAEAD128_EncryptFinal
    \sa wc_AsconAEAD128_DecryptFinal
    */
int wc_AsconAEAD128_DecryptUpdate(wc_AsconAEAD128* a, byte* out, const byte* in,
                                  word32 inSz);

/*!
    \ingroup ASCON
    \brief この関数は、Ascon AEADを使用した復号プロセスを完了し、認証タグを検証します。

    \return 0 成功時。
    \return BAD_FUNC_ARG コンテキストまたはタグポインタがNULLの場合。
    \return BAD_STATE_E 鍵、nonce、または追加データが設定されていない場合、またはコンテキストが以前に暗号化に使用された場合。
    \return ASCON_AUTH_E 認証タグが一致しない場合。

    \param a 初期化されたAscon AEADコンテキストへのポインタ。
    \param tag 検証する認証タグを含むバッファへのポインタ

    _Example_
    \code
    wc_AsconAEAD128 a;
    byte key[ASCON_AEAD128_KEY_SZ] = { ... };
    byte nonce[ASCON_AEAD128_NONCE_SZ] = { ... };
    byte ciphertext[CIPHER_TEXT_SIZE] = { ... };
    byte plaintext[PLAIN_TEXT_SIZE];
    byte tag[ASCON_AEAD128_TAG_SZ] = { ... };

    if (wc_AsconAeadInit(&a) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetKey(&a, key) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetNonce(&a, nonce) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_SetAD(&a, ad, sizeof(ad)) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_DecryptUpdate(&a, plaintext, ciphertext,
                                      sizeof(ciphertext)) != 0)
        // エラーを処理
    if (wc_AsconAEAD128_DecryptFinal(&a, tag) != 0)
        // エラーを処理
    \endcode

    \sa wc_AsconAEAD128_Init
    \sa wc_AsconAEAD128_SetKey
    \sa wc_AsconAEAD128_SetNonce
    \sa wc_AsconAEAD128_SetAD
    \sa wc_AsconAEAD128_DecryptUpdate
    \sa wc_AsconAEAD128_EncryptUpdate
    \sa wc_AsconAEAD128_EncryptFinal
    */
int wc_AsconAEAD128_DecryptFinal(wc_AsconAEAD128* a, const byte* tag);
