cryptocb.h 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*!
  2. \ingroup CryptoCb
  3. \brief この関数は、Crypto Operationsをキーストア、Secure Element、HSM、PKCS11またはTPMなどの外部ハードウェアにオフロードするための固有のデバイス識別子(DEVID)とコールバック関数を登録します。CryptoコールバックのSTSAFEの場合は、wolfcrypt / src / port / st / stsafe.cとwolfssl_stsafe_cryptodevcb関数を参照してください。TPMベースのCryptoコールバックの例では、wolftpm src / tpm2_wrap.cのwolftpm2_cryptodevcb関数を参照してください。
  4. \return CRYPTOCB_UNAVAILABLE ソフトウェア暗号を使用するためにフォールバックする
  5. \return 0 成功のために
  6. \return negative 失敗の値
  7. \param devId -2(invalid_devid)ではなく、一意の値ではありません。
  8. _Example_
  9. \code
  10. #include <wolfssl/wolfcrypt/settings.h>
  11. #include <wolfssl/wolfcrypt/cryptocb.h>
  12. static int myCryptoCb_Func(int devId, wc_CryptoInfo* info, void* ctx)
  13. {
  14. int ret = CRYPTOCB_UNAVAILABLE;
  15. if (info->algo_type == WC_ALGO_TYPE_PK) {
  16. #ifndef NO_RSA
  17. if (info->pk.type == WC_PK_TYPE_RSA) {
  18. switch (info->pk.rsa.type) {
  19. case RSA_PUBLIC_ENCRYPT:
  20. case RSA_PUBLIC_DECRYPT:
  21. // RSA public op
  22. ret = wc_RsaFunction(
  23. info->pk.rsa.in, info->pk.rsa.inLen,
  24. info->pk.rsa.out, info->pk.rsa.outLen,
  25. info->pk.rsa.type, info->pk.rsa.key,
  26. info->pk.rsa.rng);
  27. break;
  28. case RSA_PRIVATE_ENCRYPT:
  29. case RSA_PRIVATE_DECRYPT:
  30. // RSA private op
  31. ret = wc_RsaFunction(
  32. info->pk.rsa.in, info->pk.rsa.inLen,
  33. info->pk.rsa.out, info->pk.rsa.outLen,
  34. info->pk.rsa.type, info->pk.rsa.key,
  35. info->pk.rsa.rng);
  36. break;
  37. }
  38. }
  39. #endif
  40. #ifdef HAVE_ECC
  41. if (info->pk.type == WC_PK_TYPE_ECDSA_SIGN) {
  42. // ECDSA
  43. ret = wc_ecc_sign_hash(
  44. info->pk.eccsign.in, info->pk.eccsign.inlen,
  45. info->pk.eccsign.out, info->pk.eccsign.outlen,
  46. info->pk.eccsign.rng, info->pk.eccsign.key);
  47. }
  48. #endif
  49. #ifdef HAVE_ED25519
  50. if (info->pk.type == WC_PK_TYPE_ED25519_SIGN) {
  51. // ED25519 sign
  52. ret = wc_ed25519_sign_msg_ex(
  53. info->pk.ed25519sign.in, info->pk.ed25519sign.inLen,
  54. info->pk.ed25519sign.out, info->pk.ed25519sign.outLen,
  55. info->pk.ed25519sign.key, info->pk.ed25519sign.type,
  56. info->pk.ed25519sign.context,
  57. info->pk.ed25519sign.contextLen);
  58. }
  59. #endif
  60. }
  61. return ret;
  62. }
  63. int devId = 1;
  64. wc_CryptoCb_RegisterDevice(devId, myCryptoCb_Func, &myCtx);
  65. wolfSSL_CTX_SetDevId(ctx, devId);
  66. \endcode
  67. \sa wc_CryptoCb_UnRegisterDevice
  68. \sa wolfSSL_SetDevId
  69. \sa wolfSSL_CTX_SetDevId
  70. */
  71. int wc_CryptoCb_RegisterDevice(int devId, CryptoDevCallbackFunc cb, void* ctx);
  72. /*!
  73. \ingroup CryptoCb
  74. \brief この関数は、固有のデバイス識別子(devid)コールバック関数を除外します。
  75. \return none いいえ返します。
  76. _Example_
  77. \code
  78. wc_CryptoCb_UnRegisterDevice(devId);
  79. devId = INVALID_DEVID;
  80. wolfSSL_CTX_SetDevId(ctx, devId);
  81. \endcode
  82. \sa wc_CryptoCb_RegisterDevice
  83. \sa wolfSSL_SetDevId
  84. \sa wolfSSL_CTX_SetDevId
  85. */
  86. void wc_CryptoCb_UnRegisterDevice(int devId);