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

1202 lines
53 KiB
C
Raw Normal View History

/*!
\ingroup RSA
\brief RSAKEY構造体を初期化します使XMALLOCXFREEXREALLOCを参照wc_rsa_blindingが有効な場合WC_RSASETRNGによってRNGに関連付けられなければなりません
\return 0 使RSA構造の初期化に成功したときに返されます
\return BAD_FUNC_ARGS RSAキーポインタがNULLに評価された場合に返されます
\param key RSAKEY構造へのポインタ
_Example_
\code
RsaKey enc;
int ret;
ret = wc_InitRsaKey(&enc, NULL); // not using heap hint. No custom memory
if ( ret != 0 ) {
// error initializing RSA key
}
\endcode
\sa wc_RsaInitCavium
\sa wc_FreeRsaKey
\sa wc_RsaSetRNG
*/
int wc_InitRsaKey(RsaKey* key, void* heap);
/*!
\ingroup RSA
\brief RSAKEY構造体を初期化しますIDとLENはDEVIDがデバイスを識別している間にデバイス上のキーを識別するために使用されます使XMALLOCXFREEXREALLOCを参照wc_rsa_blindingが有効な場合WC_RSASETRNGによってRNGに関連付けられなければなりません
\return 0 使RSA構造の初期化に成功したときに返されます
\return BAD_FUNC_ARGS RSAキーポインタがNULLに評価された場合に返されます
\return BUFFER_E LENがRSA_MAX_ID_LENよりも小さい場合
\param key RSAKEY構造へのポインタ
\param id
\param len
\param heap 使RSAオブジェクトで使用するためにメモリを割り当てるときに使用されるデフォルトになります
_Example_
\code
RsaKey enc;
unsigned char* id = (unsigned char*)"RSA2048";
int len = 6;
int devId = 1;
int ret;
ret = wc_CryptoDev_RegisterDevice(devId, wc_Pkcs11_CryptoDevCb,
&token);
if ( ret != 0) {
// error associating callback and token with device id
}
ret = wc_InitRsaKey_Id(&enc, id, len, NULL, devId); // not using heap hint
if ( ret != 0 ) {
// error initializing RSA key
}
\endcode
\sa wc_InitRsaKey
\sa wc_RsaInitCavium
\sa wc_FreeRsaKey
\sa wc_RsaSetRNG
*/
int wc_InitRsaKey_Id(RsaKey* key, unsigned char* id, int len,
void* heap, int devId);
/*!
\ingroup RSA
\brief RNGをキーに関連付けますWC_RSA_BLINDINGが有効になっている場合は必要です
\return 0
\return BAD_FUNC_ARGS RSAキーの場合RNGポインタがNULLに評価された場合
\param key RSAKEY構造へのポインタ
_Example_
\code
ret = wc_InitRsaKey(&key, NULL);
if (ret == 0) {
ret = wc_InitRng(&rng);
} else return -1;
if (ret == 0) {
ret = wc_RsaSetRNG(&key, &rng);
\endcode
\sa wc_InitRsaKey
\sa wc_RsaSetRNG
*/
int wc_RsaSetRNG(RsaKey* key, WC_RNG* rng);
/*!
\ingroup RSA
\brief MP_Clearを使用して提供されたRSAKEY構造体を解放します
\return 0
_Example_
\code
RsaKey enc;
wc_InitRsaKey(&enc, NULL); // not using heap hint. No custom memory
... set key, do encryption
wc_FreeRsaKey(&enc);
\endcode
\sa wc_InitRsaKey
*/
int wc_FreeRsaKey(RsaKey* key);
/*!
\ingroup RSA
\brief INから暗号化しounlenの中で書き込まれたバイトを返します
\return Success 0outlenの値を格納することによってOUTに書き込まれた数のバイト数を返します
\return BAD_FUNC_ARG
\return RSA_BUFFER_E CipherTextを保存するには
\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 使
\return MP_ZERO_E 使
\param in
\param inLen
\param out
\param outLen
\param key 使RSAKEY構造体へのポインタ
_Example_
\code
RsaKey pub;
int ret = 0;
byte n[] = { // initialize with received n component of public key };
byte e[] = { // initialize with received e component of public key };
byte msg[] = { // initialize with plaintext of message to encrypt };
byte cipher[256]; // 256 bytes is large enough to store 2048 bit RSA
ciphertext
wc_InitRsaKey(&pub, NULL); // not using heap hint. No custom memory
wc_RsaPublicKeyDecodeRaw(n, sizeof(n), e, sizeof(e), &pub);
// initialize with received public key parameters
ret = wc_RsaPublicEncrypt(msg, sizeof(msg), out, sizeof(out), &pub, &rng);
if ( ret != 0 ) {
// error encrypting message
}
\endcode
\sa wc_RsaPrivateDecrypt
*/
int wc_RsaPublicEncrypt(const byte* in, word32 inLen, byte* out,
word32 outLen, RsaKey* key, WC_RNG* rng);
/*!
\ingroup RSA
\brief WC_RSAPrivateCrypt関数によって利用されます
\return Success
\return RSA_PAD_E RSAUNPADエラー
\param in
\param inLen
\param out
_Example_
\code
none
\endcode
\sa wc_RsaPrivateDecrypt
*/
int wc_RsaPrivateDecryptInline(byte* in, word32 inLen, byte** out,
RsaKey* key);
/*!
\ingroup RSA
\brief RSA復号化を提供します
\return Success
\return MEMORY_E -125
\return BAD_FUNC_ARG -173
\param in
\param inLen
\param out
\param outLen
_Example_
\code
ret = wc_RsaPublicEncrypt(in, inLen, out, sizeof(out), &key, &rng);
if (ret < 0) {
return -1;
}
ret = wc_RsaPrivateDecrypt(out, ret, plain, sizeof(plain), &key);
if (ret < 0) {
return -1;
}
\endcode
\sa RsaUnPad
\sa wc_RsaFunction
\sa wc_RsaPrivateDecryptInline
*/
int wc_RsaPrivateDecrypt(const byte* in, word32 inLen, byte* out,
word32 outLen, RsaKey* key);
/*!
\ingroup RSA
\brief
\return RSA_BUFFER_E: -131RSAバッファエラー
\param in
\param inLen
\param out
\param outLen
\param key 使
_Example_
\code
ret = wc_RsaSSL_Sign(in, inLen, out, sizeof(out), &key, &rng);
if (ret < 0) {
return -1;
}
memset(plain, 0, sizeof(plain));
ret = wc_RsaSSL_Verify(out, ret, plain, sizeof(plain), &key);
if (ret < 0) {
return -1;
}
\endcode
\sa wc_RsaPad
*/
int wc_RsaSSL_Sign(const byte* in, word32 inLen, byte* out,
word32 outLen, RsaKey* key, WC_RNG* rng);
/*!
\ingroup RSA
\brief RSAキーによって署名されたことを確認するために使用されます使
\return >0
\return <0
\param in
\param inLen
\param out
_Example_
\code
RsaKey key;
WC_WC_RNG rng;
int ret = 0;
long e = 65537; // standard value to use for exponent
wc_InitRsaKey(&key, NULL); // not using heap hint. No custom memory
wc_InitRng(&rng);
wc_MakeRsaKey(&key, 2048, e, &rng);
byte in[] = { // Initialize with some RSA encrypted information }
byte* out;
if(wc_RsaSSL_VerifyInline(in, sizeof(in), &out, &key) < 0)
{
// handle error
}
\endcode
\sa wc_RsaSSL_Verify
\sa wc_RsaSSL_Sign
*/
int wc_RsaSSL_VerifyInline(byte* in, word32 inLen, byte** out,
RsaKey* key);
/*!
\ingroup RSA
\brief 使
\return Success
\return MEMORY_E
\param in
\param inLen
\param out
\param outLen
_Example_
\code
ret = wc_RsaSSL_Sign(in, inLen, out, sizeof(out), &key, &rng);
if (ret < 0) {
return -1;
}
memset(plain, 0, sizeof(plain));
ret = wc_RsaSSL_Verify(out, ret, plain, sizeof(plain), &key);
if (ret < 0) {
return -1;
}
\endcode
\sa wc_RsaSSL_Sign
*/
int wc_RsaSSL_Verify(const byte* in, word32 inLen, byte* out,
word32 outLen, RsaKey* key);
/*!
\ingroup RSA
\brief
\return RSA_BUFFER_E: -131RSAバッファエラー
\param in
\param inLen
\param out
\param outLen
\param hash
\param mgf
_Example_
\code
ret = wc_InitRsaKey(&key, NULL);
if (ret == 0) {
ret = wc_InitRng(&rng);
} else return -1;
if (ret == 0) {
ret = wc_RsaSetRNG(&key, &rng);
} else return -1;
if (ret == 0) {
ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
} else return -1;
ret = wc_RsaPSS_Sign((byte*)szMessage, (word32)XSTRLEN(szMessage)+1,
pSignature, sizeof(pSignature),
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
if (ret > 0 ){
sz = ret;
} else return -1;
ret = wc_RsaPSS_Verify(pSignature, sz, pt, outLen,
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
if (ret <= 0)return -1;
wc_FreeRsaKey(&key);
wc_FreeRng(&rng);
\endcode
\sa wc_RsaPSS_Verify
\sa wc_RsaSetRNG
*/
int wc_RsaPSS_Sign(const byte* in, word32 inLen, byte* out,
word32 outLen, enum wc_HashType hash, int mgf,
RsaKey* key, WC_RNG* rng);
/*!
\ingroup RSA
\brief wc_rsa_blindingが有効な場合WC_RSASETRNGによってRNGに関連付けられなければなりません
\return Success
\return MEMORY_E
\param in
\param inLen
\param out
\param outLen
\param hash
\param mgf
_Example_
\code
ret = wc_InitRsaKey(&key, NULL);
if (ret == 0) {
ret = wc_InitRng(&rng);
} else return -1;
if (ret == 0) {
ret = wc_RsaSetRNG(&key, &rng);
} else return -1;
if (ret == 0) {
ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
} else return -1;
ret = wc_RsaPSS_Sign((byte*)szMessage, (word32)XSTRLEN(szMessage)+1,
pSignature, sizeof(pSignature),
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
if (ret > 0 ){
sz = ret;
} else return -1;
ret = wc_RsaPSS_Verify(pSignature, sz, pt, outLen,
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
if (ret <= 0)return -1;
wc_FreeRsaKey(&key);
wc_FreeRng(&rng);
\endcode
\sa wc_RsaPSS_Sign
\sa wc_RsaPSS_VerifyInline
\sa wc_RsaPSS_CheckPadding
\sa wc_RsaSetRNG
*/
int wc_RsaPSS_Verify(byte* in, word32 inLen, byte* out,
word32 outLen, enum wc_HashType hash, int mgf,
RsaKey* key);
/*!
\ingroup RSA
\brief RSAキーによって署名されたことを確認します使wc_rsa_blindingが有効な場合WC_RSASETRNGによってRNGに関連付けられなければなりません
\return >0
\return <0
\param in
\param inLen
\param out PSSデータを含むアドレスへのポインタ
\param hash
\param mgf
_Example_
\code
ret = wc_InitRsaKey(&key, NULL);
if (ret == 0) {
ret = wc_InitRng(&rng);
} else return -1;
if (ret == 0) {
ret = wc_RsaSetRNG(&key, &rng);
} else return -1;
if (ret == 0) {
ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
} else return -1;
ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
if (ret > 0 ){
sz = ret;
} else return -1;
ret = wc_RsaPSS_VerifyInline(pSignature, sz, pt,
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
if (ret <= 0)return -1;
wc_FreeRsaKey(&key);
wc_FreeRng(&rng);
\endcode
\sa wc_RsaPSS_Verify
\sa wc_RsaPSS_Sign
\sa wc_RsaPSS_VerifyCheck
\sa wc_RsaPSS_VerifyCheck_ex
\sa wc_RsaPSS_VerifyCheckInline
\sa wc_RsaPSS_VerifyCheckInline_ex
\sa wc_RsaPSS_CheckPadding
\sa wc_RsaPSS_CheckPadding_ex
\sa wc_RsaSetRNG
*/
int wc_RsaPSS_VerifyInline(byte* in, word32 inLen, byte** out,
enum wc_HashType hash, int mgf,
RsaKey* key);
/*!
\ingroup RSA
\brief RSA-PSSで署名されたメッセージを確認してくださいwc_rsa_blindingが有効な場合WC_RSASETRNGによってRNGに関連付けられなければなりません
\return the PSSデータの長さが成功し
\return MEMORY_E
\param in
\param inLen
\param out PSSデータを含むアドレスへのポインタ
\param outLen
\param digest
\param digestLen
\param hash
\param mgf
_Example_
\code
ret = wc_InitRsaKey(&key, NULL);
if (ret == 0) {
ret = wc_InitRng(&rng);
} else return -1;
if (ret == 0) {
ret = wc_RsaSetRNG(&key, &rng);
} else return -1;
if (ret == 0) {
ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
} else return -1;
if (ret == 0) {
digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
} else return -1;
if (ret == 0) {
ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
if (ret > 0 ){
sz = ret;
} else return -1;
} else return -1;
if (ret == 0) {
ret = wc_RsaPSS_VerifyCheck(pSignature, sz, pt, outLen,
digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
if (ret <= 0) return -1;
} else return -1;
wc_FreeRsaKey(&key);
wc_FreeRng(&rng);
\endcode
\sa wc_RsaPSS_Sign
\sa wc_RsaPSS_Verify
\sa wc_RsaPSS_VerifyCheck_ex
\sa wc_RsaPSS_VerifyCheckInline
\sa wc_RsaPSS_VerifyCheckInline_ex
\sa wc_RsaPSS_CheckPadding
\sa wc_RsaPSS_CheckPadding_ex
\sa wc_RsaSetRNG
*/
int wc_RsaPSS_VerifyCheck(byte* in, word32 inLen,
byte* out, word32 outLen,
const byte* digest, word32 digestLen,
enum wc_HashType hash, int mgf,
RsaKey* key);
/*!
\ingroup RSA
\brief RSA-PSSで署名されたメッセージを確認してくださいwc_rsa_blindingが有効な場合WC_RSASETRNGによってRNGに関連付けられなければなりません
\return the PSSデータの長さが成功し
\return MEMORY_E
\param in
\param inLen
\param out PSSデータを含むアドレスへのポインタ
\param outLen
\param digest
\param digestLen
\param hash
\param mgf
\param saltLen 使RSA_PSSS_SALT_LEN_DEFAULT-1RSA_PSS_SALT_LEN_DISCOVERは
_Example_
\code
ret = wc_InitRsaKey(&key, NULL);
if (ret == 0) {
ret = wc_InitRng(&rng);
} else return -1;
if (ret == 0) {
ret = wc_RsaSetRNG(&key, &rng);
} else return -1;
if (ret == 0) {
ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
} else return -1;
if (ret == 0) {
digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
} else return -1;
if (ret == 0) {
ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
if (ret > 0 ){
sz = ret;
} else return -1;
} else return -1;
if (ret == 0) {
ret = wc_RsaPSS_VerifyCheck_ex(pSignature, sz, pt, outLen,
digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, saltLen, &key);
if (ret <= 0) return -1;
} else return -1;
wc_FreeRsaKey(&key);
wc_FreeRng(&rng);
\endcode
\sa wc_RsaPSS_Sign
\sa wc_RsaPSS_Verify
\sa wc_RsaPSS_VerifyCheck
\sa wc_RsaPSS_VerifyCheckInline
\sa wc_RsaPSS_VerifyCheckInline_ex
\sa wc_RsaPSS_CheckPadding
\sa wc_RsaPSS_CheckPadding_ex
\sa wc_RsaSetRNG
*/
int wc_RsaPSS_VerifyCheck_ex(byte* in, word32 inLen,
byte* out, word32 outLen,
const byte* digest, word32 digestLen,
enum wc_HashType hash, int mgf, int saltLen,
RsaKey* key);
/*!
\ingroup RSA
\brief RSA-PSSで署名されたメッセージを確認してくださいwc_rsa_blindingが有効な場合WC_RSASETRNGによってRNGに関連付けられなければなりません
\return the PSSデータの長さが成功し
\param in
\param inLen
\param out
\param digest
\param digestLen
\param hash
\param mgf
_Example_
\code
ret = wc_InitRsaKey(&key, NULL);
if (ret == 0) {
ret = wc_InitRng(&rng);
} else return -1;
if (ret == 0) {
ret = wc_RsaSetRNG(&key, &rng);
} else return -1;
if (ret == 0) {
ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
} else return -1;
if (ret == 0) {
digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
} else return -1;
if (ret == 0) {
ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
if (ret > 0 ){
sz = ret;
} else return -1;
} else return -1;
if (ret == 0) {
ret = wc_RsaPSS_VerifyCheckInline(pSignature, sz, pt,
digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
if (ret <= 0) return -1;
} else return -1;
wc_FreeRsaKey(&key);
wc_FreeRng(&rng);
\endcode
\sa wc_RsaPSS_Sign
\sa wc_RsaPSS_Verify
\sa wc_RsaPSS_VerifyCheck
\sa wc_RsaPSS_VerifyCheck_ex
\sa wc_RsaPSS_VerifyCheckInline_ex
\sa wc_RsaPSS_CheckPadding
\sa wc_RsaPSS_CheckPadding_ex
\sa wc_RsaSetRNG
*/
int wc_RsaPSS_VerifyCheckInline(byte* in, word32 inLen, byte** out,
const byte* digest, word32 digentLen,
enum wc_HashType hash, int mgf,
RsaKey* key);
/*!
\ingroup RSA
\brief RSA-PSSで署名されたメッセージを確認してくださいwc_rsa_blindingが有効な場合WC_RSASETRNGによってRNGに関連付けられなければなりません
\return the PSSデータの長さが成功し
\param in
\param inLen
\param out
\param digest
\param digestLen
\param hash
\param mgf
\param saltLen 使RSA_PSSS_SALT_LEN_DEFAULT-1RSA_PSS_SALT_LEN_DISCOVERは
_Example_
\code
ret = wc_InitRsaKey(&key, NULL);
if (ret == 0) {
ret = wc_InitRng(&rng);
} else return -1;
if (ret == 0) {
ret = wc_RsaSetRNG(&key, &rng);
} else return -1;
if (ret == 0) {
ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
} else return -1;
if (ret == 0) {
digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
} else return -1;
if (ret == 0) {
ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
if (ret > 0 ){
sz = ret;
} else return -1;
} else return -1;
if (ret == 0) {
ret = wc_RsaPSS_VerifyCheckInline_ex(pSignature, sz, pt,
digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, saltLen, &key);
if (ret <= 0) return -1;
} else return -1;
wc_FreeRsaKey(&key);
wc_FreeRng(&rng);
\endcode
\sa wc_RsaPSS_Sign
\sa wc_RsaPSS_Verify
\sa wc_RsaPSS_VerifyCheck
\sa wc_RsaPSS_VerifyCheck_ex
\sa wc_RsaPSS_VerifyCheckInline
\sa wc_RsaPSS_CheckPadding
\sa wc_RsaPSS_CheckPadding_ex
\sa wc_RsaSetRNG
*/
int wc_RsaPSS_VerifyCheckInline_ex(byte* in, word32 inLen, byte** out,
const byte* digest, word32 digentLen,
enum wc_HashType hash, int mgf, int saltLen,
RsaKey* key);
/*!
\ingroup RSA
\brief PSSデータを確認してwc_rsa_blindingが有効な場合WC_RSASETRNGによってRNGに関連付けられなければなりません
\return BAD_PADDING_E PSSデータが無効な場合NULLがINまたはSIGまたはINSZに渡されるとBAD_FUNC_ARGはハッシュアルゴリズムの長さと同じではありません
\return MEMORY_E
\param in
\param inSz
\param sig PSSデータを保持するバッファ
\param sigSz PSSデータのサイズ
_Example_
\code
ret = wc_InitRsaKey(&key, NULL);
if (ret == 0) {
ret = wc_InitRng(&rng);
} else return -1;
if (ret == 0) {
ret = wc_RsaSetRNG(&key, &rng);
} else return -1;
if (ret == 0) {
ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
} else return -1;
if (ret == 0) {
digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
} else return -1;
ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, sizeof(pSignature),
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
if (ret > 0 ){
sz = ret;
} else return -1;
verify = wc_RsaPSS_Verify(pSignature, sz, out, outLen,
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
if (verify <= 0)return -1;
ret = wc_RsaPSS_CheckPadding(digest, digestSz, out, verify, hash);
wc_FreeRsaKey(&key);
wc_FreeRng(&rng);
\endcode
\sa wc_RsaPSS_Sign
\sa wc_RsaPSS_Verify
\sa wc_RsaPSS_VerifyInline
\sa wc_RsaPSS_VerifyCheck
\sa wc_RsaPSS_VerifyCheck_ex
\sa wc_RsaPSS_VerifyCheckInline
\sa wc_RsaPSS_VerifyCheckInline_ex
\sa wc_RsaPSS_CheckPadding_ex
\sa wc_RsaSetRNG
*/
int wc_RsaPSS_CheckPadding(const byte* in, word32 inLen, byte* sig,
word32 sigSz,
enum wc_HashType hashType);
/*!
\ingroup RSA
\brief PSSデータを確認して
\return BAD_PADDING_E PSSデータが無効な場合NULLがINまたはSIGまたはINSZに渡されるとBAD_FUNC_ARGはハッシュアルゴリズムの長さと同じではありません
\return MEMORY_E
\param in
\param inSz
\param sig PSSデータを保持するバッファ
\param sigSz PSSデータのサイズ
\param hashType
\param saltLen 使RSA_PSSS_SALT_LEN_DEFAULT-1RSA_PSS_SALT_LEN_DISCOVERは
_Example_
\code
ret = wc_InitRsaKey(&key, NULL);
if (ret == 0) {
ret = wc_InitRng(&rng);
} else return -1;
if (ret == 0) {
ret = wc_RsaSetRNG(&key, &rng);
} else return -1;
if (ret == 0) {
ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
} else return -1;
if (ret == 0) {
digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
} else return -1;
ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, sizeof(pSignature),
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
if (ret > 0 ){
sz = ret;
} else return -1;
verify = wc_RsaPSS_Verify(pSignature, sz, out, outLen,
WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
if (verify <= 0)return -1;
ret = wc_RsaPSS_CheckPadding_ex(digest, digestSz, out, verify, hash, saltLen, 0);
wc_FreeRsaKey(&key);
wc_FreeRng(&rng);
\endcode
\sa wc_RsaPSS_Sign
\sa wc_RsaPSS_Verify
\sa wc_RsaPSS_VerifyInline
\sa wc_RsaPSS_VerifyCheck
\sa wc_RsaPSS_VerifyCheck_ex
\sa wc_RsaPSS_VerifyCheckInline
\sa wc_RsaPSS_VerifyCheckInline_ex
\sa wc_RsaPSS_CheckPadding
*/
int wc_RsaPSS_CheckPadding_ex(const byte* in, word32 inLen, byte* sig,
word32 sigSz, enum wc_HashType hashType, int saltLen, int bits);
/*!
\ingroup RSA
\brief
\return Success
_Example_
\code
int sz = wc_RsaEncryptSize(&key);
\endcode
\sa wc_InitRsaKey
\sa wc_InitRsaKey_ex
\sa wc_MakeRsaKey
*/
int wc_RsaEncryptSize(RsaKey* key);
/*!
\ingroup RSA
\brief DerフォーマットされたRSA秘密鍵を解析しResakey構造に格納しますIDXに解析された距離も設定します
\return 0 DERエンコード入力から秘密鍵の解析に成功したときに返されます
\return ASN_PARSE_E ASN.1
\return ASN_RSA_KEY_E RSAキー入力の秘密鍵要素を読み取るエラーがある場合
\param input DERフォーマット秘密鍵を含むバッファへのポインタ
\param inOutIdx 0InoutIDXは入力バッファを介して解析された距離を記憶します
\param key RSAKEY構造へのポインタ
_Example_
\code
RsaKey enc;
word32 idx = 0;
int ret = 0;
byte der[] = { // initialize with DER-encoded RSA private key };
wc_InitRsaKey(&enc, NULL); // not using heap hint. No custom memory
ret = wc_RsaPrivateKeyDecode(der, &idx, &enc, sizeof(der));
if( ret != 0 ) {
// error parsing private key
}
\endcode
\sa wc_RsaPublicKeyDecode
\sa wc_MakeRsaKey
*/
int wc_RsaPrivateKeyDecode(const byte* input, word32* inOutIdx,
RsaKey* key, word32 inSz);
/*!
\ingroup RSA
\brief DerフォーマットのRSA公開鍵を解析しResakey構造に格納しますIDXに解析された距離も設定します
\return 0 DERエンコード入力から公開鍵の解析に成功したときに返された
\return ASN_PARSE_E ASN.1
\return ASN_OBJECT_ID_E ASN.1IDがRSA公開鍵のそれと一致しない場合に返されます
\return ASN_EXPECT_0_E ASN.1
\return ASN_BITSTR_E ASN.1
\return ASN_RSA_KEY_E RSAキー入力の公開鍵要素を読み取るエラーがある場合
\param input DERエンコードRSA公開鍵を含むバッファへのポインタ
\param inOutIdx 0InoutIDXは入力バッファを介して解析された距離を記憶します
\param key RSAKEY構造体へのポインタ
_Example_
\code
RsaKey pub;
word32 idx = 0;
int ret = 0;
byte der[] = { // initialize with DER-encoded RSA public key };
wc_InitRsaKey(&pub, NULL); // not using heap hint. No custom memory
ret = wc_RsaPublicKeyDecode(der, &idx, &pub, sizeof(der));
if( ret != 0 ) {
// error parsing public key
}
\endcode
\sa wc_RsaPublicKeyDecodeRaw
*/
int wc_RsaPublicKeyDecode(const byte* input, word32* inOutIdx,
RsaKey* key, word32 inSz);
/*!
\ingroup RSA
\brief neRSA公開鍵の生の要素を復号しますRSAKEY構造体に格納し/使
\return 0 RSAKEY構造に復号したときに返された
\return BAD_FUNC_ARG NULLに評価された場合に返されます
\return MP_INIT_E MP_INT使
\return ASN_GETINT_E RSAキー要素nまたはeのいずれかを読むエラーがある場合に返されます
\param n Public RSAキーのRAWモジュラスパラメータを含むバッファへのポインタ
\param nSz Nを含むバッファのサイズ
\param e Public RSAキーのRAW指数パラメータを含むバッファへのポインタ
\param eSz Eを含むバッファのサイズ
_Example_
\code
RsaKey pub;
int ret = 0;
byte n[] = { // initialize with received n component of public key };
byte e[] = { // initialize with received e component of public key };
wc_InitRsaKey(&pub, NULL); // not using heap hint. No custom memory
ret = wc_RsaPublicKeyDecodeRaw(n, sizeof(n), e, sizeof(e), &pub);
if( ret != 0 ) {
// error parsing public key elements
}
\endcode
\sa wc_RsaPublicKeyDecode
*/
int wc_RsaPublicKeyDecodeRaw(const byte* n, word32 nSz,
const byte* e, word32 eSz, RsaKey* key);
/*!
\ingroup RSA
\brief RSAKEYキーをDERフォーマットに変換します
\return 0
\return BAD_FUNC_ARG NULLの場合 - >RSA_PRIVATEでない場合INLENが出力バッファに十分な大きさでない場合は返されます
\return MEMORY_E
\param key RSAKEY構造
\param output
_Example_
\code
byte* der;
// Allocate memory for der
int derSz = // Amount of memory allocated for der;
RsaKey key;
WC_WC_RNG rng;
long e = 65537; // standard value to use for exponent
ret = wc_MakeRsaKey(&key, 2048, e, &rng); // generate 2048 bit long
private key
wc_InitRsaKey(&key, NULL);
wc_InitRng(&rng);
if(wc_RsaKeyToDer(&key, der, derSz) != 0)
{
// Handle the error thrown
}
\endcode
\sa wc_RsaKeyToPublicDer
\sa wc_InitRsaKey
\sa wc_MakeRsaKey
\sa wc_InitRng
*/
int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen);
/*!
\ingroup RSA
\brief 使RSA暗号化を実行します
\return size
\return RSA_BUFFER_E RSAバッファエラー
\param in
\param inLen
\param out MSGが作成されました
\param outLen MSGを保持するために利用可能なバッファの長さ
\param key RSAキー構造体
\param rng WC_RNG構造体
\param type 使WC_RSA_OAEP_PADまたはWC_RSA_PKCSV15_PAD
\param hash 使hash.hにあります
\param mgf 使
\param label
_Example_
\code
WC_WC_WC_RNG rng;
RsaKey key;
byte in[] = I use Turing Machines to ask questions
byte out[256];
int ret;
ret = wc_RsaPublicEncrypt_ex(in, sizeof(in), out, sizeof(out), &key, &rng,
WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
if (ret < 0) {
//handle error
}
\endcode
\sa wc_RsaPublicEncrypt
\sa wc_RsaPrivateDecrypt_ex
*/
int wc_RsaPublicEncrypt_ex(const byte* in, word32 inLen, byte* out,
word32 outLen, RsaKey* key, WC_RNG* rng, int type,
enum wc_HashType hash, int mgf, byte* label, word32 labelSz);
/*!
\ingroup RSA
\brief RSAを使用してメッセージを復号化し
\return size
\return MEMORY_E MallocにMallocにするのに十分なメモリがない場合は返されます
\return BAD_FUNC_ARG
\param in
\param inLen
\param out MSGが作成されました
\param outLen MSGを保持するために利用可能なバッファの長さ
\param key RSAキー構造体
\param type 使WC_RSA_OAEP_PADまたはWC_RSA_PKCSV15_PAD
\param hash 使hash.hにあります
\param mgf 使
\param label
_Example_
\code
WC_WC_WC_RNG rng;
RsaKey key;
byte in[] = I use Turing Machines to ask questions
byte out[256];
byte plain[256];
int ret;
ret = wc_RsaPublicEncrypt_ex(in, sizeof(in), out, sizeof(out), &key,
&rng, WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
if (ret < 0) {
//handle error
}
ret = wc_RsaPrivateDecrypt_ex(out, ret, plain, sizeof(plain), &key,
WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
if (ret < 0) {
//handle error
}
\endcode
\sa none
*/
int wc_RsaPrivateDecrypt_ex(const byte* in, word32 inLen,
byte* out, word32 outLen, RsaKey* key, int type,
enum wc_HashType hash, int mgf, byte* label, word32 labelSz);
/*!
\ingroup RSA
\brief RSAを使用してメッセージをインラインで復号化しINバッファにはIN
\return size
\return MEMORY_E: MallocにMallocにするのに十分なメモリがない場合は返されます
\return RSA_PAD_E:
\return BAD_PADDING_E:
\return BAD_FUNC_ARG:
\param in
\param inLen
\param out "in"
\param key RSAキー構造体
\param type 使WC_RSA_OAEP_PADまたはWC_RSA_PKCSV15_PAD
\param hash 使hash.hにあります
\param mgf 使
\param label
_Example_
\code
WC_WC_WC_RNG rng;
RsaKey key;
byte in[] = I use Turing Machines to ask questions
byte out[256];
byte* plain;
int ret;
ret = wc_RsaPublicEncrypt_ex(in, sizeof(in), out, sizeof(out), &key,
&rng, WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
if (ret < 0) {
//handle error
}
ret = wc_RsaPrivateDecryptInline_ex(out, ret, &plain, &key,
WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
if (ret < 0) {
//handle error
}
\endcode
\sa none
*/
int wc_RsaPrivateDecryptInline_ex(byte* in, word32 inLen,
byte** out, RsaKey* key, int type, enum wc_HashType hash,
int mgf, byte* label, word32 labelSz);
/*!
\ingroup RSA
\brief RSAアルゴリズムに使用される個々の要素ENRSAKEY構造体を平らにします
\return 0
\return BAD_FUNC_ARG: NULL値で渡された場合に返されます
\return RSA_BUFFER_E: eまたはnバッファが正しいサイズではない場合に返されます
\return MP_MEM:
\return MP_VAL:
\param key 使
\param e eの値のバッファーeはRSAモジュラ演算での大きな正の整数です
\param eSz eバッファのサイズ
\param n nの値のバッファーNはRSAモジュラー演算では大きな正の整数です
_Example_
\code
Rsa key; // A valid RSA key.
byte e[ buffer sz E.g. 256 ];
byte n[256];
int ret;
word32 eSz = sizeof(e);
word32 nSz = sizeof(n);
...
ret = wc_RsaFlattenPublicKey(&key, e, &eSz, n, &nSz);
if (ret != 0) {
// Failure case.
}
\endcode
\sa wc_InitRsaKey
\sa wc_InitRsaKey_ex
\sa wc_MakeRsaKey
*/
int wc_RsaFlattenPublicKey(RsaKey* key, byte* e, word32* eSz, byte* n,
word32* nSz);
/*!
\ingroup RSA
\brief RSA公開鍵をDERフォーマットに変換します
\return >0
\return BAD_FUNC_ARG NULLの場合に返されます
\return MEMORY_E
\return <0
\param key RSAキー構造
\param output NULLが長さのみを返す場合
_Example_
\code
RsaKey key;
wc_InitRsaKey(&key, NULL);
// Use key
const int BUFFER_SIZE = 1024; // Some adequate size for the buffer
byte output[BUFFER_SIZE];
if (wc_RsaKeyToPublicDer(&key, output, sizeof(output)) != 0) {
// Handle Error
}
\endcode
\sa wc_RsaPublicKeyDerSize
\sa wc_RsaKeyToPublicDer_ex
\sa wc_InitRsaKey
*/
int wc_RsaKeyToPublicDer(RsaKey* key, byte* output, word32 inLen);
/*!
\ingroup RSA
\brief RSA公開鍵をDERフォーマットに変換しますwith_headerが0の場合seq + n + eASN.1 Derフォーマットで返され
\return >0
\return BAD_FUNC_ARG NULLの場合に返されます
\return MEMORY_E
\return <0
\param key RSAキー構造
\param output NULLが長さのみを返す場合
_Example_
\code
RsaKey key;
wc_InitRsaKey(&key, NULL);
// Use key
const int BUFFER_SIZE = 1024; // Some adequate size for the buffer
byte output[BUFFER_SIZE];
if (wc_RsaKeyToPublicDer_ex(&key, output, sizeof(output), 0) != 0) {
// Handle Error
}
\endcode
\sa wc_RsaPublicKeyDerSize
\sa wc_RsaKeyToPublicDer
\sa wc_InitRsaKey
*/
int wc_RsaKeyToPublicDer_ex(RsaKey* key, byte* output, word32 inLen,
int with_header);
/*!
\ingroup RSA
\brief RSA秘密鍵を生成しeRSAKEY構造体に格納するため/使Eに使用するセキュア番号は65537ですRSA_MIN_SIZEよりも大きくRSA_MAX_SIZEよりも大きくなる必要がありますwolfssl_key_genを有効にする必要があります - 使./configureを使用する場合は-enable-keygenで実現できます
\return 0 RSA秘密鍵の生成に成功したら返されました
\return BAD_FUNC_ARG NULLの場合eが誤って選択されている場合
\return RNG_FAILURE_E RNG構造体を使用してランダムブロックを生成するエラーがある場合
\return MP_INIT_E
\return MP_READ_E RSAキーの生成中に使用された数学ライブラリにエラーがある場合に返されたRSAキーの生成中に使用された数学ライブラリにエラーがある場合に返される可能性があります
\return MP_CMP_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります
\return MP_INVMOD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります
\return MP_EXPTMOD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります
\return MP_MOD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります
\return MP_MUL_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります
\return MP_ADD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります
\return MP_MULMOD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります
\return MP_TO_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります
\return MP_MEM RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります
\return MP_ZERO_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります
\param key RSAKEY構造体へのポインタ
\param size rsa_min_sizeより大きくrsa_max_sizeよりも大きくなる必要があります
\param e 使65537
_Example_
\code
RsaKey priv;
WC_WC_RNG rng;
int ret = 0;
long e = 65537; // standard value to use for exponent
wc_InitRsaKey(&priv, NULL); // not using heap hint. No custom memory
wc_InitRng(&rng);
// generate 2048 bit long private key
ret = wc_MakeRsaKey(&priv, 2048, e, &rng);
if( ret != 0 ) {
// error generating private key
}
\endcode
\sa none
*/
int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng);
/*!
\ingroup RSA
\brief RSAコンテキストを設定しますRSANBコンテキストが設定されている場合RSA関数を多くの小さな操作に分割する高速数学ベースの非ブロッキングEXPTMODが可能になりますwc_rsa_nonblockが定義されているときに有効になっています
\return 0
\return BAD_FUNC_ARG NBがNULLの場合に返されます
\param key RSAキー構造
_Example_
\code
int ret, count = 0;
RsaKey key;
RsaNb nb;
wc_InitRsaKey(&key, NULL);
// Enable non-blocking RSA mode - provide context
ret = wc_RsaSetNonBlock(key, &nb);
if (ret != 0)
return ret;
do {
ret = wc_RsaSSL_Sign(in, inLen, out, outSz, key, rng);
count++; // track number of would blocks
if (ret == FP_WOULDBLOCK) {
// do "other" work here
}
} while (ret == FP_WOULDBLOCK);
if (ret < 0) {
return ret;
}
printf("RSA non-block sign: size %d, %d times\n", ret, count);
\endcode
\sa wc_RsaSetNonBlockTime
*/
int wc_RsaSetNonBlock(RsaKey* key, RsaNb* nb);
/*!
\ingroup RSA
\brief CPU速度と共に事前計算されたテーブルTFM.cexptModnbinstを参照使wc_rsa_nonblock_timeが定義されているときに有効になります
\return 0
\return BAD_FUNC_ARG NULLの場合WC_RSASETNONBLOCKが以前に呼び出され - > NBはNULLの場合に返されます
\param key RSAキー構造
\param maxBlockUs
_Example_
\code
RsaKey key;
RsaNb nb;
wc_InitRsaKey(&key, NULL);
wc_RsaSetNonBlock(key, &nb);
wc_RsaSetNonBlockTime(&key, 4000, 160); // Block Max = 4 ms, CPU = 160MHz
\endcode
\sa wc_RsaSetNonBlock
*/
int wc_RsaSetNonBlockTime(RsaKey* key, word32 maxBlockUs,
word32 cpuMHz);