/*!
    \ingroup Signature
    \brief  この関数は、結果のシグネチャの最大サイズを返します。
    \return Returns  sig_type_e sig_typeがサポートされていない場合sig_typeが無効な場合はbad_func_argを返します。正の戻り値は、署名の最大サイズを示します。
    \param sig_type  wc_signature_type_eccまたはwc_signature_type_rsaなどの署名型列挙型値。
    \param key  ECC_KEYやRSAKEYなどのキー構造へのポインタ。
    _Example_
    \code
    // Get signature length
    enum wc_SignatureType sig_type = WC_SIGNATURE_TYPE_ECC;
    ecc_key eccKey;
    word32 sigLen;
    wc_ecc_init(&eccKey);
    sigLen = wc_SignatureGetSize(sig_type, &eccKey, sizeof(eccKey));
    if (sigLen > 0) {
    	// Success
    }
    \endcode
    \sa wc_HashGetDigestSize
    \sa wc_SignatureGenerate
    \sa wc_SignatureVerify
*/
int wc_SignatureGetSize(enum wc_SignatureType sig_type,
    const void* key, word32 key_len);

/*!
    \ingroup Signature
    \brief  この関数は、データをハッシュし、結果のハッシュとキーを使用して署名を使用して署名を使用して署名を検証します。
    \return 0  成功
    \return SIG_TYPE_E  -231、署名タイプが有効/利用可能です
    \return BAD_FUNC_ARG  -173、関数の不良引数が提供されています
    \return BUFFER_E  -132、出力バッファが小さすぎたり入力が大きすぎたりします。
    \param hash_type  "wc_hash_type_sha256"などの "enum wc_hashtype"からのハッシュ型。
    \param sig_type  wc_signature_type_eccまたはwc_signature_type_rsaなどの署名型列挙型値。
    \param data  ハッシュへのデータを含むバッファへのポインタ。
    \param data_len  データバッファの長さ。
    \param sig  署名を出力するためのバッファへのポインタ。
    \param sig_len  シグネチャ出力バッファの長さ。
    \param key  ECC_KEYやRSAKEYなどのキー構造へのポインタ。
    _Example_
    \code
    int ret;
    ecc_key eccKey;

    // Import the public key
    wc_ecc_init(&eccKey);
    ret = wc_ecc_import_x963(eccPubKeyBuf, eccPubKeyLen, &eccKey);
    // Perform signature verification using public key
    ret = wc_SignatureVerify(
    WC_HASH_TYPE_SHA256, WC_SIGNATURE_TYPE_ECC,
    fileBuf, fileLen,
    sigBuf, sigLen,
    &eccKey, sizeof(eccKey));
    printf("Signature Verification: %s
    (%d)\n", (ret == 0) ? "Pass" : "Fail", ret);
    wc_ecc_free(&eccKey);
    \endcode
    \sa wc_SignatureGetSize
    \sa wc_SignatureGenerate
*/
int wc_SignatureVerify(
    enum wc_HashType hash_type, enum wc_SignatureType sig_type,
    const byte* data, word32 data_len,
    const byte* sig, word32 sig_len,
    const void* key, word32 key_len);

/*!
    \ingroup Signature
    \brief  この関数は、キーを使用してデータから署名を生成します。まずデータのハッシュを作成し、キーを使用してハッシュに署名します。
    \return 0  成功
    \return SIG_TYPE_E  -231、署名タイプが有効/利用可能です
    \return BAD_FUNC_ARG  -173、関数の不良引数が提供されています
    \return BUFFER_E  -132、出力バッファが小さすぎたり入力が大きすぎたりします。
    \param hash_type  "wc_hash_type_sha256"などの "enum wc_hashtype"からのハッシュ型。
    \param sig_type  wc_signature_type_eccまたはwc_signature_type_rsaなどの署名型列挙型値。
    \param data  ハッシュへのデータを含むバッファへのポインタ。
    \param data_len  データバッファの長さ。
    \param sig  署名を出力するためのバッファへのポインタ。
    \param sig_len  シグネチャ出力バッファの長さ。
    \param key  ECC_KEYやRSAKEYなどのキー構造へのポインタ。
    \param key_len  キー構造のサイズ
    _Example_
    \code
    int ret;
    WC_RNG rng;
    ecc_key eccKey;

    wc_InitRng(&rng);
    wc_ecc_init(&eccKey);

    // Generate key
    ret = wc_ecc_make_key(&rng, 32, &eccKey);

    // Get signature length and allocate buffer
    sigLen = wc_SignatureGetSize(sig_type, &eccKey, sizeof(eccKey));
    sigBuf = malloc(sigLen);

    // Perform signature verification using public key
    ret = wc_SignatureGenerate(
        WC_HASH_TYPE_SHA256, WC_SIGNATURE_TYPE_ECC,
        fileBuf, fileLen,
        sigBuf, &sigLen,
        &eccKey, sizeof(eccKey),
        &rng);
    printf("Signature Generation: %s
    (%d)\n", (ret == 0) ? "Pass" : "Fail", ret);

    free(sigBuf);
    wc_ecc_free(&eccKey);
    wc_FreeRng(&rng);
    \endcode
    \sa wc_SignatureGetSize
    \sa wc_SignatureVerify
*/
int wc_SignatureGenerate(
    enum wc_HashType hash_type, enum wc_SignatureType sig_type,
    const byte* data, word32 data_len,
    byte* sig, word32 *sig_len,
    const void* key, word32 key_len,
    WC_RNG* rng);
