/*!
    \ingroup DSA
    \brief  この関数は、デジタル署名アルゴリズム（DSA）を介した認証に使用するためにDSAKEYオブジェクトを初期化します。
    \return 0  成功に戻りました。
    \return BAD_FUNC_ARG  NULLキーが渡された場合に返されます。
    _Example_
    \code
    DsaKey key;
    int ret;
    ret = wc_InitDsaKey(&key); // initialize DSA key
    \endcode
    \sa wc_FreeDsaKey
*/
int wc_InitDsaKey(DsaKey* key);

/*!
    \ingroup DSA
    \brief  この関数は、使用された後にdsakeyオブジェクトを解放します。
    \return none  いいえ返します。
    _Example_
    \code
    DsaKey key;
    // initialize key, use for authentication
    ...
    wc_FreeDsaKey(&key); // free DSA key
    \endcode
    \sa wc_FreeDsaKey
*/
void wc_FreeDsaKey(DsaKey* key);

/*!
    \ingroup DSA
    \brief  この機能は入力ダイジェストに署名し、結果を出力バッファーに格納します。
    \return 0  入力ダイジェストに正常に署名したときに返されました
    \return MP_INIT_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_READ_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_CMP_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_INVMOD_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_EXPTMOD_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_MOD_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_MUL_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_ADD_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_MULMOD_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_TO_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_MEM  DSA署名の処理にエラーがある場合は返される可能性があります。
    \param digest  署名するハッシュへのポインタ
    \param out  署名を保存するバッファへのポインタ
    \param key  署名を生成するための初期化されたDsakey構造へのポインタ
    _Example_
    \code
    DsaKey key;
    // initialize DSA key, load private Key
    int ret;
    WC_RNG rng;
    wc_InitRng(&rng);
    byte hash[] = { // initialize with hash digest };
    byte signature[40]; // signature will be 40 bytes (320 bits)

    ret = wc_DsaSign(hash, signature, &key, &rng);
    if (ret != 0) {
	    // error generating DSA signature
    }
    \endcode
    \sa wc_DsaVerify
*/
int wc_DsaSign(const byte* digest, byte* out,
                           DsaKey* key, WC_RNG* rng);

/*!
    \ingroup DSA
    \brief  この関数は、秘密鍵を考えると、ダイジェストの署名を検証します。回答パラメータでキーが正しく検証されているかどうか、正常な検証に対応する1、および失敗した検証に対応する0が格納されます。
    \return 0  検証要求の処理に成功したときに返されます。注：これは、署名が検証されていることを意味するわけではなく、関数が成功したというだけです。
    \return MP_INIT_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_READ_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_CMP_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_INVMOD_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_EXPTMOD_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_MOD_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_MUL_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_ADD_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_MULMOD_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_TO_E  DSA署名の処理にエラーがある場合は返される可能性があります。
    \return MP_MEM  DSA署名の処理にエラーがある場合は返される可能性があります。
    \param digest  署名の主題を含むダイジェストへのポインタ
    \param sig  確認する署名を含むバッファへのポインタ
    \param key  署名を検証するための初期化されたDsakey構造へのポインタ
    _Example_
    \code
    DsaKey key;
    // initialize DSA key, load public Key

    int ret;
    int verified;
    byte hash[] = { // initialize with hash digest };
    byte signature[] = { // initialize with signature to verify };
    ret = wc_DsaVerify(hash, signature, &key, &verified);
    if (ret != 0) {
    	// error processing verify request
    } else if (answer == 0) {
    	// invalid signature
    }
    \endcode
    \sa wc_DsaSign
*/
int wc_DsaVerify(const byte* digest, const byte* sig,
                             DsaKey* key, int* answer);

/*!
    \ingroup DSA
    \brief  この機能は、DSA公開鍵を含むDERフォーマットの証明書バッファを復号し、与えられたDSakey構造体にキーを格納します。また、入力読み取りの長さに応じてINOUTIDXパラメータを設定します。
    \return 0  dsakeyオブジェクトの公開鍵を正常に設定する
    \return ASN_PARSE_E  証明書バッファを読みながらエンコーディングにエラーがある場合
    \return ASN_DH_KEY_E  DSAパラメータの1つが誤ってフォーマットされている場合に返されます
    \param input  DERフォーマットDSA公開鍵を含むバッファへのポインタ
    \param inOutIdx  証明書の最後のインデックスを保存する整数へのポインタ
    \param key  公開鍵を保存するDsakey構造へのポインタ
    _Example_
    \code
    int ret, idx=0;

    DsaKey key;
    wc_InitDsaKey(&key);
    byte derBuff[] = { // DSA public key};
    ret = wc_DsaPublicKeyDecode(derBuff, &idx, &key, inSz);
    if (ret != 0) {
    	// error reading public key
    }
    \endcode
    \sa wc_InitDsaKey
    \sa wc_DsaPrivateKeyDecode
*/
int wc_DsaPublicKeyDecode(const byte* input, word32* inOutIdx,
                                      DsaKey* key, word32 inSz);

/*!
    \ingroup DSA
    \brief  この機能は、DSA秘密鍵を含むDERフォーマットの証明書バッファをデコードし、指定されたDSakey構造体にキーを格納します。また、入力読み取りの長さに応じてINOUTIDXパラメータを設定します。
    \return 0  dsakeyオブジェクトの秘密鍵を正常に設定するに返されました
    \return ASN_PARSE_E  証明書バッファを読みながらエンコーディングにエラーがある場合
    \return ASN_DH_KEY_E  DSAパラメータの1つが誤ってフォーマットされている場合に返されます
    \param input  DERフォーマットDSA秘密鍵を含むバッファへのポインタ
    \param inOutIdx  証明書の最後のインデックスを保存する整数へのポインタ
    \param key  秘密鍵を保存するDSakey構造へのポインタ
    _Example_
    \code
    int ret, idx=0;

    DsaKey key;
    wc_InitDsaKey(&key);
    byte derBuff[] = { // DSA private key };
    ret = wc_DsaPrivateKeyDecode(derBuff, &idx, &key, inSz);
    if (ret != 0) {
    	// error reading private key
    }
    \endcode
    \sa wc_InitDsaKey
    \sa wc_DsaPublicKeyDecode
*/
int wc_DsaPrivateKeyDecode(const byte* input, word32* inOutIdx,
                                       DsaKey* key, word32 inSz);

/*!
    \ingroup DSA
    \brief  DSAKEYキーをDERフォーマット、出力への書き込み（Inlen）、書き込まれたバイトを返します。
    \return outLen  成功、書かれたバイト数
    \return BAD_FUNC_ARG  キーまたは出力はNULLまたはキー - >タイプがDSA_PRIVATEではありません。
    \return MEMORY_E  メモリの割り当て中にエラーが発生しました。
    \param key  変換するdsakey構造へのポインタ。
    \param output  変換キーの出力バッファへのポインタ。
    _Example_
    \code
    DsaKey key;
    WC_RNG rng;
    int derSz;
    int bufferSize = // Sufficient buffer size;
    byte der[bufferSize];

    wc_InitDsaKey(&key);
    wc_InitRng(&rng);
    wc_MakeDsaKey(&rng, &key);
    derSz = wc_DsaKeyToDer(&key, der, bufferSize);
    \endcode
    \sa wc_InitDsaKey
    \sa wc_FreeDsaKey
    \sa wc_MakeDsaKey
*/
int wc_DsaKeyToDer(DsaKey* key, byte* output, word32 inLen);

/*!
    \ingroup DSA
    \brief  DSAキーを作成します。
    \return MP_OKAY  成功
    \return BAD_FUNC_ARG  RNGまたはDSAのどちらかがnullです。
    \return MEMORY_E  バッファにメモリを割り当てることができませんでした。
    \return MP_INIT_E  MP_INTの初期化エラー
    \param rng  WC_RNG構造体へのポインタ。
    _Example_
    \code
    WC_RNG rng;
    DsaKey dsa;
    wc_InitRng(&rng);
    wc_InitDsa(&dsa);
    if(wc_MakeDsaKey(&rng, &dsa) != 0)
    {
        // Error creating key
    }
    \endcode
    \sa wc_InitDsaKey
    \sa wc_FreeDsaKey
    \sa wc_DsaSign
*/
int wc_MakeDsaKey(WC_RNG *rng, DsaKey *dsa);

/*!
    \ingroup DSA
    \brief  FIPS 186-4は、modulus_size値の有効な値を定義します（1024,160）（2048,256）（3072,256）
    \return 0  成功
    \return BAD_FUNC_ARG  RNGまたはDSAはNULLまたはMODULUS_SIZEが無効です。
    \return MEMORY_E  メモリを割り当てようとするエラーが発生しました。
    \param rng  WolfCrypt RNGへのポインタ。
    \param modulus_size  1024,2048、または3072は有効な値です。
    _Example_
    \code
    DsaKey key;
    WC_RNG rng;
    wc_InitDsaKey(&key);
    wc_InitRng(&rng);
    if(wc_MakeDsaParameters(&rng, 1024, &genKey) != 0)
    {
        // Handle error
    }
    \endcode
    \sa wc_MakeDsaKey
    \sa wc_DsaKeyToDer
    \sa wc_InitDsaKey
*/
int wc_MakeDsaParameters(WC_RNG *rng, int modulus_size, DsaKey *dsa);
