Files
wolfssl/doc/dox_comments/header_files-ja/ecc.h

1362 lines
68 KiB
C
Raw Normal View History

/*!
\ingroup ECC
\brief ECC_KEYを生成し
\return 0
\return ECC_BAD_ARG_E RNGまたはキーがNULLに評価された場合に返されます
\return BAD_FUNC_ARG
\return MEMORY_E ECCキーの計算中にメモリの割り当てエラーがある場合に返されます
\return MP_INIT_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_READ_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_CMP_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_INVMOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_EXPTMOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_MOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_MUL_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_ADD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_MULMOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_TO_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_MEM ECCキーの計算中にエラーが発生した場合に返される可能性があります
\param rng RNGオブジェクトへのポインタ
\param keysize ECC_KEYの希望の長さ
_Example_
\code
ecc_key key;
wc_ecc_init(&key);
WC_WC_RNG rng;
wc_InitRng(&rng);
wc_ecc_make_key(&rng, 32, &key); // initialize 32 byte ecc key
\endcode
\sa wc_ecc_init
\sa wc_ecc_shared_secret
*/
int wc_ecc_make_key(WC_RNG* rng, int keysize, ecc_key* key);
/*!
\ingroup ECC
\brief ECC_KEYを生成し
\return 0
\return ECC_BAD_ARG_E RNGまたはキーがNULLに評価された場合に返されます
\return BAD_FUNC_ARG
\return MEMORY_E ECCキーの計算中にメモリの割り当てエラーがある場合に返されます
\return MP_INIT_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_READ_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_CMP_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_INVMOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_EXPTMOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_MOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_MUL_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_ADD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_MULMOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_TO_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
\return MP_MEM ECCキーの計算中にエラーが発生した場合に返される可能性があります
\param key
\param keysize CavenIDに基づいて設定されたバイト単位で作成するキーのサイズ
\param rng 使RNG
_Example_
\code
ecc_key key;
int ret;
WC_WC_RNG rng;
wc_ecc_init(&key);
wc_InitRng(&rng);
int curveId = ECC_SECP521R1;
int keySize = wc_ecc_get_curve_size_from_id(curveId);
ret = wc_ecc_make_key_ex(&rng, keySize, &key, curveId);
if (ret != MP_OKAY) {
// error handling
}
\endcode
\sa wc_ecc_make_key
\sa wc_ecc_get_curve_size_from_id
*/
int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id);
/*!
\ingroup ECC
\brief ECCキーの有効性を有効にします
\return MP_OKAY
\return BAD_FUNC_ARG NULLの場合は返します
\return ECC_INF_E WC_ECC_POINT_IS_AT_INFINITYが1を返す場合に返します
_Example_
\code
ecc_key key;
WC_WC_RNG rng;
int check_result;
wc_ecc_init(&key);
wc_InitRng(&rng);
wc_ecc_make_key(&rng, 32, &key);
check_result = wc_ecc_check_key(&key);
if (check_result == MP_OKAY)
{
// key check succeeded
}
else
{
// key check failed
}
\endcode
\sa wc_ecc_point_is_at_infinity
*/
int wc_ecc_check_key(ecc_key* key);
/*!
\ingroup ECC
\brief 使ECC_KEYキーを解放します
_Example_
\code
// initialize key and perform ECC operations
...
wc_ecc_key_free(&key);
\endcode
\sa wc_ecc_key_new
\sa wc_ecc_init_ex
*/
void wc_ecc_key_free(ecc_key* key);
/*!
\ingroup ECC
\brief 使outlentenを更新します
\return 0
\return BAD_FUNC_ARG NULLに評価された場合に返されます
\return ECC_BAD_ARG_E ecc_privatekeyではない場合ECC-> DPによって与えられた
\return MEMORY_E ECCポイントを生成するエラーが発生した場合
\return BUFFER_E
\return MP_INIT_E
\return MP_READ_E
\return MP_CMP_E
\return MP_INVMOD_E
\return MP_EXPTMOD_E
\return MP_MOD_E
\return MP_MUL_E
\return MP_ADD_E
\return MP_MULMOD_E
\return MP_TO_E
\return MP_MEM
\param private_key ECC_KEY構造体へのポインタ
\param public_key ECC_Key構造体へのポインタ
\param out
_Example_
\code
ecc_key priv, pub;
WC_WC_RNG rng;
byte secret[1024]; // can hold 1024 byte shared secret key
word32 secretSz = sizeof(secret);
int ret;
wc_InitRng(&rng); // initialize rng
wc_ecc_init(&priv); // initialize key
wc_ecc_make_key(&rng, 32, &priv); // make public/private key pair
// receive public key, and initialise into pub
ret = wc_ecc_shared_secret(&priv, &pub, secret, &secretSz);
// generate secret key
if ( ret != 0 ) {
// error generating shared secret key
}
\endcode
\sa wc_ecc_init
\sa wc_ecc_make_key
*/
int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out,
word32* outlen);
/*!
\ingroup ECC
\brief ECC共有秘密を作成します
\return MP_OKAY
\return BAD_FUNC_ARG NULLのときにエラーが返されます
\return ECC_BAD_ARG_E private_key-> typeがecc_privatekeyまたはprivate_key-> idxが検証できない場合に返されました
\return BUFFER_E outlenが小さすぎるとエラーが発生します
\return MEMORY_E
\return MP_VAL
\return MP_MEM
\param private_key ECCキー
\param point 使
\param out ANSI X9.63EC-DHに準拠しています
_Example_
\code
ecc_key key;
ecc_point* point;
byte shared_secret[];
int secret_size;
int result;
point = wc_ecc_new_point();
result = wc_ecc_shared_secret_ex(&key, point,
&shared_secret, &secret_size);
if (result != MP_OKAY)
{
// Handle error
}
\endcode
\sa wc_ecc_verify_hash_ex
*/
int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point,
byte* out, word32 *outlen);
/*!
\ingroup ECC
\brief ECC_KEYオブジェクトを使用してメッセージダイジェストに署名します
\return 0
\return BAD_FUNC_ARG NULLに評価された場合
\return ECC_BAD_ARG_E ECC OIDが無効な場合
\return RNG_FAILURE_E RNGが満足のいくキーを正常に生成できない場合に返されます
\return MP_INIT_E
\return MP_READ_E
\return MP_CMP_E
\return MP_INVMOD_E
\return MP_EXPTMOD_E
\return MP_MOD_E
\return MP_MUL_E
\return MP_ADD_E
\return MP_MULMOD_E
\return MP_TO_E
\return MP_MEM
\param in
\param inlen
\param out
\param outlen
_Example_
\code
ecc_key key;
WC_WC_RNG rng;
int ret, sigSz;
byte sig[512]; // will hold generated signature
sigSz = sizeof(sig);
byte digest[] = { // initialize with message hash };
wc_InitRng(&rng); // initialize rng
wc_ecc_init(&key); // initialize key
wc_ecc_make_key(&rng, 32, &key); // make public/private key pair
ret = wc_ecc_sign_hash(digest, sizeof(digest), sig, &sigSz, &key);
if ( ret != 0 ) {
// error generating message signature
}
\endcode
\sa wc_ecc_verify_hash
*/
int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen,
WC_RNG* rng, ecc_key* key);
/*!
\ingroup ECC
\brief
\return MP_OKAY
\return ECC_BAD_ARG_E ECC IDXが無効な場合NULLに評価されている場合
\return RNG_FAILURE_E RNGが満足のいくキーを正常に生成できない場合に返されます
\return MP_INIT_E
\return MP_READ_E
\return MP_CMP_E
\return MP_INVMOD_E
\return MP_EXPTMOD_E
\return MP_MOD_E
\return MP_MUL_E
\return MP_ADD_E
\return MP_MULMOD_E
\return MP_TO_E
\return MP_MEM
\param in
\param inlen
\param rng WC_RNG構造体へのポインタ
\param key ECCキー
\param r Rコンポーネントの宛先
_Example_
\code
ecc_key key;
WC_WC_WC_RNG rng;
int ret, sigSz;
mp_int r; // destination for r component of signature.
mp_int s; // destination for s component of signature.
byte sig[512]; // will hold generated signature
sigSz = sizeof(sig);
byte digest[] = { initialize with message hash };
wc_InitRng(&rng); // initialize rng
wc_ecc_init(&key); // initialize key
mp_init(&r); // initialize r component
mp_init(&s); // initialize s component
wc_ecc_make_key(&rng, 32, &key); // make public/private key pair
ret = wc_ecc_sign_hash_ex(digest, sizeof(digest), &rng, &key, &r, &s);
if ( ret != MP_OKAY ) {
// error generating message signature
}
\endcode
\sa wc_ecc_verify_hash_ex
*/
int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
ecc_key* key, mp_int *r, mp_int *s);
/*!
\ingroup ECC
\brief ECCシグネチャを検証します10
\return 0 STATで格納されます
\return BAD_FUNC_ARG NULLに評価されます
\return MEMORY_E
\return MP_INIT_E
\return MP_READ_E
\return MP_CMP_E
\return MP_INVMOD_E
\return MP_EXPTMOD_E
\return MP_MOD_E
\return MP_MUL_E
\return MP_ADD_E
\return MP_MULMOD_E
\return MP_TO_E
\return MP_MEM
\param sig
\param siglen
\param hash
\param hashlen
\param stat 1
_Example_
\code
ecc_key key;
int ret, verified = 0;
byte sig[1024] { initialize with received signature };
byte digest[] = { initialize with message hash };
// initialize key with received public key
ret = wc_ecc_verify_hash(sig, sizeof(sig), digest,sizeof(digest),
&verified, &key);
if ( ret != 0 ) {
// error performing verification
} else if ( verified == 0 ) {
// the signature is invalid
}
\endcode
\sa wc_ecc_sign_hash
\sa wc_ecc_verify_hash_ex
*/
int wc_ecc_verify_hash(const byte* sig, word32 siglen, const byte* hash,
word32 hashlen, int* stat, ecc_key* key);
/*!
\ingroup ECC
\brief ECC署名を確認してくださいstatに書き込まれます10使statのみを使用してください
\return MP_OKAY
\return ECC_BAD_ARG_E NULLの場合key-idxが無効な場合は返します
\return MEMORY_E INTまたはポイントの割り当て中にエラーが発生しました
\param r Rコンポーネント
\param s Sコンポーネント
\param hash
\param hashlen
\param stat 1 ==0 ==
_Example_
\code
mp_int r;
mp_int s;
int stat;
byte hash[] = { Some hash }
ecc_key key;
if(wc_ecc_verify_hash_ex(&r, &s, hash, hashlen, &stat, &key) == MP_OKAY)
{
// Check stat
}
\endcode
\sa wc_ecc_verify_hash
*/
int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
word32 hashlen, int* stat, ecc_key* key);
/*!
\ingroup ECC
\brief 使ECC_KEYオブジェクトを初期化します
\return 0 ECC_Keyオブジェクトの初期化に成功したときに返されます
\return MEMORY_E
_Example_
\code
ecc_key key;
wc_ecc_init(&key);
\endcode
\sa wc_ecc_make_key
\sa wc_ecc_free
*/
int wc_ecc_init(ecc_key* key);
/*!
\ingroup ECC
\brief 使ECC_KEYオブジェクトを初期化します
\return 0 ECC_Keyオブジェクトの初期化に成功したときに返されます
\return MEMORY_E
\param key ECC_Keyオブジェクトへのポインタ
\param devId 使ID
_Example_
\code
ecc_key key;
wc_ecc_init_ex(&key, heap, devId);
\endcode
\sa wc_ecc_make_key
\sa wc_ecc_free
\sa wc_ecc_init
*/
int wc_ecc_init_ex(ecc_key* key, void* heap, int devId);
/*!
\ingroup ECC
\brief 使
\return 0 ECC_Keyオブジェクトの初期化に成功したときに返されます
_Example_
\code
wc_ecc_key_new(&heap);
\endcode
\sa wc_ecc_make_key
\sa wc_ecc_key_free
\sa wc_ecc_init
*/
ecc_key* wc_ecc_key_new(void* heap);
/*!
\ingroup ECC
\brief 使ECC_KEYオブジェクトを解放します
\return int integerがWolfSSLエラーまたは成功状況を示すことを返しました
_Example_
\code
// initialize key and perform secure exchanges
...
wc_ecc_free(&key);
\endcode
\sa wc_ecc_init
*/
int wc_ecc_free(ecc_key* key);
/*!
\ingroup ECC
\brief ECCで使用でき使FP_ECCECC
\return none
_Example_
\code
ecc_key key;
// initialize key and perform secure exchanges
...
wc_ecc_fp_free();
\endcode
\sa wc_ecc_free
*/
void wc_ecc_fp_free(void);
/*!
\ingroup ECC
\brief ECC IDXが有効かどうかを確認します
\return 1
\return 0
_Example_
\code
ecc_key key;
WC_WC_RNG rng;
int is_valid;
wc_ecc_init(&key);
wc_InitRng(&rng);
wc_ecc_make_key(&rng, 32, &key);
is_valid = wc_ecc_is_valid_idx(key.idx);
if (is_valid == 1)
{
// idx is valid
}
else if (is_valid == 0)
{
// idx is not valid
}
\endcode
\sa none
*/
int wc_ecc_is_valid_idx(int n);
/*!
\ingroup ECC
\brief ECCポイントを割り当てます
\return p
\return NULL NULLを返します
_Example_
\code
ecc_point* point;
point = wc_ecc_new_point();
if (point == NULL)
{
// Handle point creation error
}
// Do stuff with point
\endcode
\sa wc_ecc_del_point
\sa wc_ecc_cmp_point
\sa wc_ecc_copy_point
*/
ecc_point* wc_ecc_new_point(void);
/*!
\ingroup ECC
\brief ECCポイントを解放します
\return none
_Example_
\code
ecc_point* point;
point = wc_ecc_new_point();
if (point == NULL)
{
// Handle point creation error
}
// Do stuff with point
wc_ecc_del_point(point);
\endcode
\sa wc_ecc_new_point
\sa wc_ecc_cmp_point
\sa wc_ecc_copy_point
*/
void wc_ecc_del_point(ecc_point* p);
/*!
\ingroup ECC
\brief
\return ECC_BAD_ARG_E PまたはRがNULLのときにスローされたエラー
\return MP_OKAY
\return ret ...
\param p
_Example_
\code
ecc_point* point;
ecc_point* copied_point;
int copy_return;
point = wc_ecc_new_point();
copy_return = wc_ecc_copy_point(point, copied_point);
if (copy_return != MP_OKAY)
{
// Handle error
}
\endcode
\sa wc_ecc_new_point
\sa wc_ecc_cmp_point
\sa wc_ecc_del_point
*/
int wc_ecc_copy_point(ecc_point* p, ecc_point *r);
/*!
\ingroup ECC
\brief
\return BAD_FUNC_ARG 1nullです
\return MP_EQ
\return ret mp_ltまたはmp_gtのどちらかで
\param a
_Example_
\code
ecc_point* point;
ecc_point* point_to_compare;
int cmp_result;
point = wc_ecc_new_point();
point_to_compare = wc_ecc_new_point();
cmp_result = wc_ecc_cmp_point(point, point_to_compare);
if (cmp_result == BAD_FUNC_ARG)
{
// arguments are invalid
}
else if (cmp_result == MP_EQ)
{
// Points are equal
}
else
{
// Points are not equal
}
\endcode
\sa wc_ecc_new_point
\sa wc_ecc_del_point
\sa wc_ecc_copy_point
*/
int wc_ecc_cmp_point(ecc_point* a, ecc_point *b);
/*!
\ingroup ECC
\brief 100<00
\return 1 Pは無限大です
\return 0 Pは無限大ではありません
\return <0
_Example_
\code
ecc_point* point;
int is_infinity;
point = wc_ecc_new_point();
is_infinity = wc_ecc_point_is_at_infinity(point);
if (is_infinity < 0)
{
// Handle error
}
else if (is_infinity == 0)
{
// Point is not at infinity
}
else if (is_infinity == 1)
{
// Point is at infinity
}
\endcode
\sa wc_ecc_new_point
\sa wc_ecc_del_point
\sa wc_ecc_cmp_point
\sa wc_ecc_copy_point
*/
int wc_ecc_point_is_at_infinity(ecc_point *p);
/*!
\ingroup ECC
\brief ECC固定点乗算を実行します
\return MP_OKAY
\return MP_INIT_E Precision IntegerMP_INT使
\param k
\param G
\param R
\param modulus
_Example_
\code
ecc_point* base;
ecc_point* destination;
// Initialize points
base = wc_ecc_new_point();
destination = wc_ecc_new_point();
// Setup other arguments
mp_int multiplicand;
mp_int modulus;
int map;
\endcode
\sa none
*/
int wc_ecc_mulmod(mp_int* k, ecc_point *G, ecc_point *R,
mp_int* a, mp_int* modulus, int map);
/*!
\ingroup ECC
\brief ECCキーをECC_KEY構造体からエクスポートしOUTに格納しますANSI X9.63outlenの出力バッファに書き込まれたバイトを格納します
\return 0 ECC_KEYのエクスポートに正常に返されました
\return LENGTH_ONLY_E NULLに評価されている場合は返されますが2
\return ECC_BAD_ARG_E NULLの場合
\return BUFFER_E ECCキーを保存する場合は返されますoutlenに返されます
\return MEMORY_E xmallocでメモリを割り当てるエラーがある場合
\return MP_INIT_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_READ_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_CMP_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_INVMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_EXPTMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MUL_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_ADD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MULMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_TO_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MEM ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\param key ECC_KEYオブジェクトへのポインタ
\param out ANSI X9.63
_Example_
\code
int ret;
byte buff[1024];
word32 buffSz = sizeof(buff);
ecc_key key;
// initialize key, make key
ret = wc_ecc_export_x963(&key, buff, &buffSz);
if ( ret != 0) {
// error exporting key
}
\endcode
\sa wc_ecc_export_x963_ex
\sa wc_ecc_import_x963
*/
int wc_ecc_export_x963(ecc_key* key, byte* out, word32* outLen);
/*!
\ingroup ECC
\brief ECCキーをECC_KEY構造体からエクスポートしOUTに格納しますANSI X9.63outlenの出力バッファに書き込まれたバイトを格納します使trueの場合ANSI X9.63
\return 0 ECC_KEYのエクスポートに正常に返されました
\return NOT_COMPILED_IN hand_comp_keyがコンパイル時に有効になっていない場合は返されますが
\return LENGTH_ONLY_E NULLに評価されている場合は返されますが2
\return ECC_BAD_ARG_E NULLの場合
\return BUFFER_E ECCキーを保存する場合は返されますoutlenに返されます
\return MEMORY_E xmallocでメモリを割り当てるエラーがある場合
\return MP_INIT_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_READ_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_CMP_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_INVMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_EXPTMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MUL_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_ADD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MULMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_TO_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MEM ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\param key ECC_KEYオブジェクトへのポインタ
\param out ANSI X9.63
\param outLen
_Example_
\code
int ret;
byte buff[1024];
word32 buffSz = sizeof(buff);
ecc_key key;
// initialize key, make key
ret = wc_ecc_export_x963_ex(&key, buff, &buffSz, 1);
if ( ret != 0) {
// error exporting key
}
\endcode
\sa wc_ecc_export_x963
\sa wc_ecc_import_x963
*/
int wc_ecc_export_x963_ex(ecc_key* key, byte* out, word32* outLen, int compressed);
/*!
\ingroup ECC
\brief ANSI X9.63ECCキーをインポートしますhand_comp_keyオプションを介してコンパイル時に有効になっている限り
\return 0 ECC_KEYのインポートに成功しました
\return NOT_COMPILED_IN hand_comp_keyがコンパイル時に有効になっていない場合は返されますが
\return ECC_BAD_ARG_E INまたはKEYがNULLに評価された場合Inlenが偶数の場合X9.63
\return MEMORY_E
\return ASN_PARSE_E ECCキーの解析中にエラーがある場合は返されますECCキーが有効なANSI X9.63
\return IS_POINT_E ECC曲線上の点ではない場合に返されます
\return MP_INIT_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_READ_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_CMP_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_INVMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_EXPTMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MUL_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_ADD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MULMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_TO_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MEM ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\param in ANSI x9.63ECCキーを含むバッファへのポインタ
\param inLen
_Example_
\code
int ret;
byte buff[] = { initialize with ANSI X9.63 formatted key };
ecc_key pubKey;
wc_ecc_init(&pubKey);
ret = wc_ecc_import_x963(buff, sizeof(buff), &pubKey);
if ( ret != 0) {
// error importing key
}
\endcode
\sa wc_ecc_export_x963
\sa wc_ecc_import_private_key
*/
int wc_ecc_import_x963(const byte* in, word32 inLen, ecc_key* key);
/*!
\ingroup ECC
\brief ANSI X9.632/ECCキーのペアをインポートしますhand_comp_keyオプションを介してコンパイル時に有効になっている限り
\return 0 habe_comp_keyがコンパイル時に有効になっていない場合はecc_key not_compiled_inを正常にインポートしましたが
\return ECC_BAD_ARG_E INまたはKEYがNULLに評価された場合Inlenが偶数の場合X9.63
\return MEMORY_E
\return ASN_PARSE_E ECCキーの解析中にエラーがある場合は返されますECCキーが有効なANSI X9.63
\return IS_POINT_E ECC曲線上の点ではない場合に返されます
\return MP_INIT_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_READ_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_CMP_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_INVMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_EXPTMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MUL_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_ADD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MULMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_TO_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MEM ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\param priv RAW秘密鍵を含むバッファへのポインタ
\param privSz
\param pub ANSI x9.63ECC公開鍵を含むバッファへのポインタ
\param pubSz
_Example_
\code
int ret;
byte pub[] = { initialize with ANSI X9.63 formatted key };
byte priv[] = { initialize with the raw private key };
ecc_key key;
wc_ecc_init(&key);
ret = wc_ecc_import_private_key(priv, sizeof(priv), pub, sizeof(pub),
&key);
if ( ret != 0) {
// error importing key
}
\endcode
\sa wc_ecc_export_x963
\sa wc_ecc_import_private_key
*/
int wc_ecc_import_private_key(const byte* priv, word32 privSz, const byte* pub,
word32 pubSz, ecc_key* key);
/*!
\ingroup ECC
\brief ECCシグネチャのR部分とS部分をDER符号化ECDSAシグネチャに変換しますoutlenでは
\return 0
\return ECC_BAD_ARG_E NULLに評価された場合DERエンコードされたECDSAシグネチャを保持するのに十分な大きさでない場合に返されます
\return MP_INIT_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_READ_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_CMP_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_INVMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_EXPTMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MUL_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_ADD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MULMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_TO_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\return MP_MEM ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
\param r R部分を文字列として含むバッファへのポインタ
\param s S部分を含むバッファへのポインタ文字列としてのポインタ
\param out DERエンコードされたECDSAシグネチャを保存するバッファへのポインタ
_Example_
\code
int ret;
ecc_key key;
// initialize key, generate R and S
char r[] = { initialize with R };
char s[] = { initialize with S };
byte sig[wc_ecc_sig_size(key)];
// signature size will be 2 * ECC key size + ~10 bytes for ASN.1 overhead
word32 sigSz = sizeof(sig);
ret = wc_ecc_rs_to_sig(r, s, sig, &sigSz);
if ( ret != 0) {
// error converting parameters to signature
}
\endcode
\sa wc_ecc_sign_hash
\sa wc_ecc_sig_size
*/
int wc_ecc_rs_to_sig(const char* r, const char* s, byte* out, word32* outlen);
/*!
\ingroup ECC
\brief ECC署名のRAW成分を持つECC_KEY構造体を埋めます
\return 0 ECC_Key構造体に正常にインポートされたときに返されます
\return ECC_BAD_ARG_E NULLに評価された場合に返されます
\return MEMORY_E ECC_Keyのパラメータを格納するためのエラーの初期化スペースがある場合に返されます
\return ASN_PARSE_E ECC_SETSで定義されていない場合
\return MP_INIT_E
\return MP_READ_E
\return MP_CMP_E
\return MP_INVMOD_E
\return MP_EXPTMOD_E
\return MP_MOD_E
\return MP_MUL_E
\return MP_ADD_E
\return MP_MULMOD_E
\return MP_TO_E
\return MP_MEM
\param key ECC_KEY構造体へのポインタ
\param qx ASCII六角文字列として基点のXコンポーネントを含むバッファへのポインタ
\param qy ASCII六角文字列として基点のY成分を含むバッファへのポインタ
\param d ASCII hex文字列として秘密鍵を含むバッファへのポインタ
_Example_
\code
int ret;
ecc_key key;
wc_ecc_init(&key);
char qx[] = { initialize with x component of base point };
char qy[] = { initialize with y component of base point };
char d[] = { initialize with private key };
ret = wc_ecc_import_raw(&key,qx, qy, d, "ECC-256");
if ( ret != 0) {
// error initializing key with given inputs
}
\endcode
\sa wc_ecc_import_private_key
*/
int wc_ecc_import_raw(ecc_key* key, const char* qx, const char* qy,
const char* d, const char* curveName);
/*!
\ingroup ECC
\brief ECC_KEY構造体から秘密鍵のみをエクスポートしますoutlenにこのバッファに書き込まれたバイトを設定します
\return 0
\return ECC_BAD_ARG_E NULLに評価された場合に返されます
\return MEMORY_E ECC_Keyのパラメータを格納するためのエラーの初期化スペースがある場合に返されます
\return ASN_PARSE_E ECC_SETSで定義されていない場合
\return MP_INIT_E
\return MP_READ_E
\return MP_CMP_E
\return MP_INVMOD_E
\return MP_EXPTMOD_E
\return MP_MOD_E
\return MP_MUL_E
\return MP_ADD_E
\return MP_MULMOD_E
\return MP_TO_E
\return MP_MEM
\param key ECC_Key構造体へのポインタ
\param out
_Example_
\code
int ret;
ecc_key key;
// initialize key, make key
char priv[ECC_KEY_SIZE];
word32 privSz = sizeof(priv);
ret = wc_ecc_export_private_only(&key, priv, &privSz);
if ( ret != 0) {
// error exporting private key
}
\endcode
\sa wc_ecc_import_private_key
*/
int wc_ecc_export_private_only(ecc_key* key, byte* out, word32* outLen);
/*!
\ingroup ECC
\brief DERへのエクスポートポイント
\return 0
\return ECC_BAD_ARG_E curve_idxが0未満または無効である場合は返します
\return LENGTH_ONLY_E outlenは設定されていますが
\return BUFFER_E outlennが1 + 2 *
\return MEMORY_E
\param curve_idx ECC_SETSから使用される曲線のインデックス
\param point Derへのエクスポートを指す
\param out
_Example_
\code
int curve_idx;
ecc_point* point;
byte out[];
word32 outLen;
wc_ecc_export_point_der(curve_idx, point, out, &outLen);
\endcode
\sa wc_ecc_import_point_der
*/
int wc_ecc_export_point_der(const int curve_idx, ecc_point* point,
byte* out, word32* outLen);
/*!
\ingroup ECC
\brief Derフォーマットからのインポートポイント
\return ECC_BAD_ARG_E nullの場合Inlenが偶数の場合は返します
\return MEMORY_E
\return NOT_COMPILED_IN habe_comp_keyが真実でない場合は返されinは圧縮証明書です
\return MP_OKAY
\param in Der Buffer
\param inLen DERバッファの長さ
\param curve_idx
_Example_
\code
byte in[];
word32 inLen;
int curve_idx;
ecc_point* point;
wc_ecc_import_point_der(in, inLen, curve_idx, point);
\endcode
\sa wc_ecc_export_point_der
*/
int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx,
ecc_point* point);
/*!
\ingroup ECC
\brief ecc_key構造体のキーサイズをオクテットで返します
\return Given
\return 0 NULLの場合に返されます
_Example_
\code
int keySz;
ecc_key key;
// initialize key, make key
keySz = wc_ecc_size(&key);
if ( keySz == 0) {
// error determining key size
}
\endcode
\sa wc_ecc_make_key
*/
int wc_ecc_size(ecc_key* key);
/*!
\ingroup ECC
\brief ECCシグネチャの最悪の場合のサイズを返しますKEYSZ * 2+ SIG_HEADER_SZ + ECC_MAX_PAD_SZWC_ECC_SIGN_HASHで計算できます
\return returns
_Example_
\code
int sigSz = wc_ecc_sig_size_calc(32);
if ( sigSz == 0) {
// error determining sig size
}
\endcode
\sa wc_ecc_sign_hash
\sa wc_ecc_sig_size
*/
int wc_ecc_sig_size_calc(int sz);
/*!
\ingroup ECC
\brief ECCシグネチャの最悪の場合のサイズを返しますKEYSZ * 2+ SIG_HEADER_SZ + ECC_MAX_PAD_SZWC_ECC_SIGN_HASHで計算できます
\return Success
\return 0 NULLの場合に返されます
_Example_
\code
int sigSz;
ecc_key key;
// initialize key, make key
sigSz = wc_ecc_sig_size(&key);
if ( sigSz == 0) {
// error determining sig size
}
\endcode
\sa wc_ecc_sign_hash
\sa wc_ecc_sig_size_calc
*/
int wc_ecc_sig_size(ecc_key* key);
/*!
\ingroup ECC
\brief ECCとの安全なメッセージ交換を可能にするためにECCコンテキストオブジェクトのスペースを割り当て
\return Success ECENCCTXオブジェクトの生成に成功した場合は
\return NULL ECENCCTXオブジェクトを生成できない場合に返されます
\param flags .req_resp_clientreq_resp_server
_Example_
\code
ecEncCtx* ctx;
WC_WC_RNG rng;
wc_InitRng(&rng);
ctx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng);
if(ctx == NULL) {
// error generating new ecEncCtx object
}
\endcode
\sa wc_ecc_encrypt
\sa wc_ecc_encrypt_ex
\sa wc_ecc_decrypt
*/
ecEncCtx* wc_ecc_ctx_new(int flags, WC_RNG* rng);
/*!
\ingroup ECC
\brief 使ECENCCTXオブジェクトを解放します
\return none
_Example_
\code
ecEncCtx* ctx;
WC_WC_RNG rng;
wc_InitRng(&rng);
ctx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng);
// do secure communication
...
wc_ecc_ctx_free(&ctx);
\endcode
\sa wc_ecc_ctx_new
*/
void wc_ecc_ctx_free(ecEncCtx*);
/*!
\ingroup ECC
\brief ECENCCTX構造をリセットして
\return 0 ecencctx構造が正常にリセットされた場合に返されます
\return BAD_FUNC_ARG RNGまたはCTXがNULLの場合に返されます
\return RNG_FAILURE_E ECCオブジェクトに新しい塩を生成するエラーがある場合
\param ctx ECENCCTXオブジェクトへのポインタ
_Example_
\code
ecEncCtx* ctx;
WC_WC_RNG rng;
wc_InitRng(&rng);
ctx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng);
// do secure communication
...
wc_ecc_ctx_reset(&ctx, &rng);
// do more secure communication
\endcode
\sa wc_ecc_ctx_new
*/
int wc_ecc_ctx_reset(ecEncCtx* ctx, WC_RNG* rng); /* reset for use again w/o alloc/free */
/*!
\ingroup ECC
\brief wc_ecc_ctx_newの後にオプションで呼び出されることができますKDFMACアルゴリズムをECENCENCCTXオブジェクトに設定します
\return 0 ECENCCTXオブジェクトの情報を正常に設定すると返されます
\return BAD_FUNC_ARG ecencctxオブジェクトがNULLの場合に返されます
\param ctx ECENCCTXへのポインタ
\param encAlgo 使
\param kdfAlgo 使KDFアルゴリズム
_Example_
\code
ecEncCtx* ctx;
// initialize ctx
if(wc_ecc_ctx_set_algo(&ctx, ecAES_128_CTR, ecHKDF_SHA256, ecHMAC_SHA256))) {
// error setting info
}
\endcode
\sa wc_ecc_ctx_new
*/
int wc_ecc_ctx_set_algo(ecEncCtx* ctx, byte encAlgo, byte kdfAlgo,
byte macAlgo);
/*!
\ingroup ECC
\brief ECENCENCCTXオブジェクトの塩を返しますECENCCTXの状態がECSRV_INITまたはECCLI_INITの場合にのみ呼び出す必要があります
\return Success ECENCENTX塩を返します
\return NULL ecencctxオブジェクトがNULLの場合ECENCCTXの状態がECSRV_INITまたはECCLI_INITでない場合に返されます2ECSRV_BAD_STATEまたはECCLI_BAD_STATEにECENCCTXの状態を設定します
_Example_
\code
ecEncCtx* ctx;
WC_WC_RNG rng;
const byte* salt;
wc_InitRng(&rng);
ctx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng);
salt = wc_ecc_ctx_get_own_salt(&ctx);
if(salt == NULL) {
// error getting salt
}
\endcode
\sa wc_ecc_ctx_new
\sa wc_ecc_ctx_set_peer_salt
*/
const byte* wc_ecc_ctx_get_own_salt(ecEncCtx*);
/*!
\ingroup ECC
\brief ECENCENCCTXオブジェクトのピアソルトを設定します
\return 0 ECENCCTXオブジェクトのピアソルトの設定に成功したときに返されます
\return BAD_FUNC_ARG ecencctxオブジェクトがnullまたは無効なプロトコルがある場合NULLの場合
\return BAD_ENC_STATE_E ecencctxの状態がECSRV_SALT_GETまたはECCLI_SALT_GETの場合に返されます2ECSRV_BAD_STATEまたはECCLI_BAD_STATEにECENCCTXの状態を設定します
\param ctx ecencctxへのポインタ
_Example_
\code
ecEncCtx* cliCtx, srvCtx;
WC_WC_RNG rng;
const byte* cliSalt, srvSalt;
int ret;
wc_InitRng(&rng);
cliCtx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng);
srvCtx = wc_ecc_ctx_new(REQ_RESP_SERVER, &rng);
cliSalt = wc_ecc_ctx_get_own_salt(&cliCtx);
srvSalt = wc_ecc_ctx_get_own_salt(&srvCtx);
ret = wc_ecc_ctx_set_peer_salt(&cliCtx, srvSalt);
\endcode
\sa wc_ecc_ctx_get_own_salt
*/
int wc_ecc_ctx_set_peer_salt(ecEncCtx* ctx, const byte* salt);
/*!
\ingroup ECC
\brief wc_ecc_ctx_set_peer_saltの前後にオプションで呼び出されることができますECENCCTXオブジェクトのオプションの情報を設定します
\return 0 ECENCCTXオブジェクトの情報を正常に設定すると返されます
\return BAD_FUNC_ARG ECENCCTXオブジェクトがNULLの場合NULLまたはサイズが無効です
\param ctx ECENCCTXへのポインタ
\param info
_Example_
\code
ecEncCtx* ctx;
byte info[] = { initialize with information };
// initialize ctx, get salt,
if(wc_ecc_ctx_set_info(&ctx, info, sizeof(info))) {
// error setting info
}
\endcode
\sa wc_ecc_ctx_new
*/
int wc_ecc_ctx_set_info(ecEncCtx* ctx, const byte* info, int sz);
/*!
\ingroup ECC
\brief MSGからOUTに暗号化しますCTXオブジェクトを取りますECENCCTXのEncalgoKdfalgoMacalgoに基づいて暗号化が進みますCTXが指定されていない場合ECAES_128_CBCECHKDF_SHA256ECHMAC_SHA256で完了しますCTXで指定された暗号化タイプに従って埋め込まれている必要があります
\return 0
\return BAD_FUNC_ARG PRIVKEYPUBKEYMSGMSGSZOUTOUTSZがNULLの場合CTXオブジェクトがサポートされていない暗号化タイプを指定します
\return BAD_ENC_STATE_E CTXオブジェクトが暗号化に適していない状態にある場合に返されます
\return BUFFER_E
\return MEMORY_E
\param privKey 使ECC_KEYオブジェクトへのポインタ
\param pubKey ECC_Keyオブジェクトへのポインタ
\param msg
\param msgSz
\param out
\param outSz OUTバッファ内の使用可能なサイズを含むWord32オブジェクトへのポインタ
_Example_
\code
byte msg[] = { initialize with msg to encrypt. Ensure padded to block size };
byte out[sizeof(msg)];
word32 outSz = sizeof(out);
int ret;
ecc_key cli, serv;
// initialize cli with private key
// initialize serv with received public key
ecEncCtx* cliCtx, servCtx;
// initialize cliCtx and servCtx
// exchange salts
ret = wc_ecc_encrypt(&cli, &serv, msg, sizeof(msg), out, &outSz, cliCtx);
if(ret != 0) {
// error encrypting message
}
\endcode
\sa wc_ecc_encrypt_ex
\sa wc_ecc_decrypt
*/
int wc_ecc_encrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx);
/*!
\ingroup ECC
\brief MSGからOUTに暗号化しますCTXオブジェクトを取りますECENCCTXのEncalgoKdfalgoMacalgoに基づいて暗号化が進みますCTXが指定されていない場合ECAES_128_CBCECHKDF_SHA256ECHMAC_SHA256で完了しますCTXで指定された暗号化タイプに従って埋め込まれている必要があります
\return 0
\return BAD_FUNC_ARG PRIVKEYPUBKEYMSGMSGSZOUTOUTSZがNULLの場合CTXオブジェクトがサポートされていない暗号化タイプを指定します
\return BAD_ENC_STATE_E CTXオブジェクトが暗号化に適していない状態にある場合に返されます
\return BUFFER_E
\return MEMORY_E
\param privKey 使ECC_KEYオブジェクトへのポインタ
\param pubKey ECC_Keyオブジェクトへのポインタ
\param msg
\param msgSz
\param out
\param outSz OUTバッファ内の使用可能なサイズを含むWord32オブジェクトへのポインタ
\param ctx 使ECENCCTXオブジェクトへのポインタ
_Example_
\code
byte msg[] = { initialize with msg to encrypt. Ensure padded to block size };
byte out[sizeof(msg)];
word32 outSz = sizeof(out);
int ret;
ecc_key cli, serv;
// initialize cli with private key
// initialize serv with received public key
ecEncCtx* cliCtx, servCtx;
// initialize cliCtx and servCtx
// exchange salts
ret = wc_ecc_encrypt_ex(&cli, &serv, msg, sizeof(msg), out, &outSz, cliCtx,
1);
if(ret != 0) {
// error encrypting message
}
\endcode
\sa wc_ecc_encrypt
\sa wc_ecc_decrypt
*/
int wc_ecc_encrypt_ex(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx, int compressed);
/*!
\ingroup ECC
\brief MSGからOUTへの暗号文を復号化しますCTXオブジェクトを取りますECENCCTXのEncalgoKdfalgoMacalgoに基づいて暗号化が進みますCTXが指定されていない場合ECAES_128_CBCECHKDF_SHA256ECHMAC_SHA256で完了しますCTXで指定された暗号化タイプに従って埋め込まれている必要があります
\return 0
\return BAD_FUNC_ARG PRIVKEYPUBKEYMSGMSGSZOUTOUTSZがNULLの場合CTXオブジェクトがサポートされていない暗号化タイプを指定します
\return BAD_ENC_STATE_E CTXオブジェクトが復号化に適していない状態にある場合に返されます
\return BUFFER_E
\return MEMORY_E
\param privKey 使ECC_Keyオブジェクトへのポインタ
\param pubKey ECC_Keyオブジェクトへのポインタ
\param msg
\param msgSz
\param out
\param outSz OUTバッファ内の使用可能なサイズを含むWord32オブジェクトへのポインタ
_Example_
\code
byte cipher[] = { initialize with
ciphertext to decrypt. Ensure padded to block size };
byte plain[sizeof(cipher)];
word32 plainSz = sizeof(plain);
int ret;
ecc_key cli, serv;
// initialize cli with private key
// initialize serv with received public key
ecEncCtx* cliCtx, servCtx;
// initialize cliCtx and servCtx
// exchange salts
ret = wc_ecc_decrypt(&cli, &serv, cipher, sizeof(cipher),
plain, &plainSz, cliCtx);
if(ret != 0) {
// error decrypting message
}
\endcode
\sa wc_ecc_encrypt
\sa wc_ecc_encrypt_ex
*/
int wc_ecc_decrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx);
/*!
\ingroup ECC
\brief ECCサポートを有効にします使SP.WolfSSL_SP_SP_SMALL WOLFSSL_SP_NO_MALLOC WC_ECC_NONBLOCK
\return 0
\param key ECC_KEYオブジェクトへのポインタ
_Example_
\code
int ret;
ecc_key ecc;
ecc_nb_ctx_t nb_ctx;
ret = wc_ecc_init(&ecc);
if (ret == 0) {
ret = wc_ecc_set_nonblock(&ecc, &nb_ctx);
if (ret == 0) {
do {
ret = wc_ecc_verify_hash_ex(
&r, &s, // r/s as mp_int
hash, hashSz, // computed hash digest
&verify_res, // verification result 1=success
&key
);
// TODO: Real-time work can be called here
} while (ret == FP_WOULDBLOCK);
}
wc_ecc_free(&key);
}
\endcode
*/
int wc_ecc_set_nonblock(ecc_key *key, ecc_nb_ctx_t* ctx);