2
0

iotsafe.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. /*!
  2. \ingroup IoTSafe
  3. \brief この関数は与えられたコンテキストでのIoTセーフサポートを有効にします。
  4. \param ctx IOTセーフサポートを有効にする必要があるWOLFSSL_CTXオブジェクトへのポインタ
  5. \return 0 成功した
  6. _Example_
  7. \code
  8. WOLFSSL_CTX *ctx;
  9. ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method());
  10. if (!ctx)
  11. return NULL;
  12. wolfSSL_CTX_iotsafe_enable(ctx);
  13. \endcode
  14. \sa wolfSSL_iotsafe_on
  15. \sa wolfIoTSafe_SetCSIM_read_cb
  16. \sa wolfIoTSafe_SetCSIM_write_cb
  17. */
  18. int wolfSSL_CTX_iotsafe_enable(WOLFSSL_CTX *ctx);
  19. /*!
  20. \ingroup IoTSafe
  21. \brief この関数は、IOT-SAFE TLSコールバックを特定のSSLセッションに接続します。
  22. \brief スロットのIDが1バイトの長さの場合、SSLセッションをIoT-Safeアプレットに接続するように呼び出す必要があります。IOTセーフスロットのIDが2バイト以上の場合、\ REF WOLFSSL_IOTSAFE_ON_EX「WOLFSSL_IOTSAFE_ON_EX()」を使用する必要があります。
  23. \param ssl コールバックが有効になるWolfSSLオブジェクトへのポインタ
  24. \param privkey_id ホストの秘密鍵を含むIOTセーフなアプレットスロットのID
  25. \param ecdh_keypair_slot ECDH鍵ペアを保存するためのIoT安全アプレットスロットのID
  26. \param peer_pubkey_slot ECDH用の他のエンドポイントの公開鍵を保存するためのIOT-SAFEアプレットスロットのID
  27. \param peer_cert_slot 検証のための他のエンドポイントの公開鍵を保存するためのIOTセーフなアプレットスロットのID
  28. \return 0 成功すると
  29. \return NOT_COMPILED_IN habe_pk_callbacksが無効になっている場合
  30. _Example_
  31. \code
  32. // Define key ids for IoT-Safe
  33. #define PRIVKEY_ID 0x02
  34. #define ECDH_KEYPAIR_ID 0x03
  35. #define PEER_PUBKEY_ID 0x04
  36. #define PEER_CERT_ID 0x05
  37. // Create new ssl session
  38. WOLFSSL *ssl;
  39. ssl = wolfSSL_new(ctx);
  40. if (!ssl)
  41. return NULL;
  42. // Enable IoT-Safe and associate key slots
  43. ret = wolfSSL_CTX_iotsafe_enable(ctx);
  44. if (ret == 0) {
  45. ret = wolfSSL_iotsafe_on(ssl, PRIVKEY_ID, ECDH_KEYPAIR_ID, PEER_PUBKEY_ID, PEER_CERT_ID);
  46. }
  47. \endcode
  48. \sa wolfSSL_iotsafe_on_ex
  49. \sa wolfSSL_CTX_iotsafe_enable
  50. */
  51. int wolfSSL_iotsafe_on(WOLFSSL *ssl, byte privkey_id,
  52. byte ecdh_keypair_slot, byte peer_pubkey_slot, byte peer_cert_slot);
  53. /*!
  54. \ingroup IoTSafe
  55. \brief この関数は、IOT-SAFE TLSコールバックを特定のSSLセッションに接続します。これは、IOTセーフスロットのIDを参照で渡すことができ、IDフィールドの長さをパラメータ "id_size"で指定できます。
  56. \param ssl コールバックが有効になるWolfSSLオブジェクトへのポインタ
  57. \param privkey_id ホストの秘密鍵を含むIoTセーフアプレットスロットのIDへのポインタ
  58. \param ecdh_keypair_slot ECDH鍵ペアを保存するIOT-SafeアプレットスロットのIDへのポインタ
  59. \param peer_pubkey_slot ECDH用の他のエンドポイントの公開鍵を保存するIOTセーフアプレットスロットのIDへのポインタ
  60. \param peer_cert_slot 検証のために他のエンドポイントの公開鍵を保存するためのIOT-SAFEアプレットスロットのIDへのポインタ
  61. \param id_size 各スロットIDのサイズ
  62. \return 0 成功すると
  63. \return NOT_COMPILED_IN habe_pk_callbacksが無効になっている場合
  64. _Example_
  65. \code
  66. // Define key ids for IoT-Safe (16 bit, little endian)
  67. #define PRIVKEY_ID 0x0201
  68. #define ECDH_KEYPAIR_ID 0x0301
  69. #define PEER_PUBKEY_ID 0x0401
  70. #define PEER_CERT_ID 0x0501
  71. #define ID_SIZE (sizeof(word16))
  72. word16 privkey = PRIVKEY_ID,
  73. ecdh_keypair = ECDH_KEYPAIR_ID,
  74. peer_pubkey = PEER_PUBKEY_ID,
  75. peer_cert = PEER_CERT_ID;
  76. // Create new ssl session
  77. WOLFSSL *ssl;
  78. ssl = wolfSSL_new(ctx);
  79. if (!ssl)
  80. return NULL;
  81. // Enable IoT-Safe and associate key slots
  82. ret = wolfSSL_CTX_iotsafe_enable(ctx);
  83. if (ret == 0) {
  84. ret = wolfSSL_CTX_iotsafe_on_ex(ssl, &privkey, &ecdh_keypair, &peer_pubkey, &peer_cert, ID_SIZE);
  85. }
  86. \endcode
  87. \sa wolfSSL_iotsafe_on
  88. \sa wolfSSL_CTX_iotsafe_enable
  89. */
  90. int wolfSSL_iotsafe_on_ex(WOLFSSL *ssl, byte *privkey_id,
  91. byte *ecdh_keypair_slot, byte *peer_pubkey_slot, byte *peer_cert_slot, word16 id_size);
  92. /*!
  93. \ingroup IoTSafe
  94. \brief AT + CSIMコマンドのリードコールバックを関連付けます。この入力関数は通常、モデムと通信するUARTチャネルの読み取りイベントに関連付けられています。読み取りコールバックが関連付けられているのは、同時にIoT-Safeサポートを使用するすべてのコンテキストのグローバルと変更です。
  95. _Example_
  96. \code
  97. // USART read function, defined elsewhere
  98. int usart_read(char *buf, int len);
  99. wolfIoTSafe_SetCSIM_read_cb(usart_read);
  100. \endcode
  101. \sa wolfIoTSafe_SetCSIM_write_cb
  102. */
  103. void wolfIoTSafe_SetCSIM_read_cb(wolfSSL_IOTSafe_CSIM_read_cb rf);
  104. /*!
  105. \ingroup IoTSafe
  106. \brief AT + CSIMコマンドの書き込みコールバックを関連付けます。この出力関数は通常、モデムと通信するUARTチャネル上のライトイベントに関連付けられています。Write Callbackが関連付けられているのは、同時にIoT-Safeサポートを使用するすべてのコンテキストのグローバルと変更です。
  107. _Example_
  108. \code
  109. // USART write function, defined elsewhere
  110. int usart_write(const char *buf, int len);
  111. wolfIoTSafe_SetCSIM_write_cb(usart_write);
  112. \endcode
  113. \sa wolfIoTSafe_SetCSIM_read_cb
  114. */
  115. void wolfIoTSafe_SetCSIM_write_cb(wolfSSL_IOTSafe_CSIM_write_cb wf);
  116. /*!
  117. \ingroup IoTSafe
  118. \brief IOTセーフ機能getrandomを使用して、指定されたサイズのランダムなバッファを生成します。この関数は、WolfCrypt RNGオブジェクトによって自動的に使用されます。
  119. \param out ランダムなバイトシーケンスが格納されているバッファ。
  120. \param sz 生成するランダムシーケンスのサイズ(バイト単位)
  121. */
  122. int wolfIoTSafe_GetRandom(unsigned char* out, word32 sz);
  123. /*!
  124. \ingroup IoTSafe
  125. \brief IOT-Safeアプレット上のファイルに保存されている証明書をインポートし、ローカルにメモリに保存します。1バイトのファイルIDフィールドで動作します。
  126. \param id 証明書が保存されているIOTセーフ・アプレットのファイルID
  127. \param output 証明書がインポートされるバッファー
  128. \param sz バッファ出力で使用可能な最大サイズ
  129. \return the 輸入された証明書の長さ
  130. _Example_
  131. \code
  132. #define CRT_CLIENT_FILE_ID 0x03
  133. unsigned char cert_buffer[2048];
  134. // Get the certificate into the buffer
  135. cert_buffer_size = wolfIoTSafe_GetCert(CRT_CLIENT_FILE_ID, cert_buffer, 2048);
  136. if (cert_buffer_size < 1) {
  137. printf("Bad cli cert\n");
  138. return -1;
  139. }
  140. printf("Loaded Client certificate from IoT-Safe, size = %lu\n", cert_buffer_size);
  141. // Use the certificate buffer as identity for the TLS client context
  142. if (wolfSSL_CTX_use_certificate_buffer(cli_ctx, cert_buffer,
  143. cert_buffer_size, SSL_FILETYPE_ASN1) != SSL_SUCCESS) {
  144. printf("Cannot load client cert\n");
  145. return -1;
  146. }
  147. printf("Client certificate successfully imported.\n");
  148. \endcode
  149. */
  150. int wolfIoTSafe_GetCert(uint8_t id, unsigned char *output, unsigned long sz);
  151. /*!
  152. \ingroup IoTSafe
  153. \brief IOT-Safeアプレット上のファイルに保存されている証明書をインポートし、ローカルにメモリに保存します。\ ref wolfiotsafe_getcert "wolfiotsafe_getcert"と同等です。ただし、2バイト以上のファイルIDで呼び出すことができます。
  154. \param id 証明書が保存されているIOT-SAFEアプレットのファイルIDへのポインタ
  155. \param id_sz ファイルIDのサイズ:バイト数
  156. \param output 証明書がインポートされるバッファー
  157. \param sz バッファ出力で使用可能な最大サイズ
  158. \return the 輸入された証明書の長さ
  159. _Example_
  160. \code
  161. #define CRT_CLIENT_FILE_ID 0x0302
  162. #define ID_SIZE (sizeof(word16))
  163. unsigned char cert_buffer[2048];
  164. word16 client_file_id = CRT_CLIENT_FILE_ID;
  165. // Get the certificate into the buffer
  166. cert_buffer_size = wolfIoTSafe_GetCert_ex(&client_file_id, ID_SIZE, cert_buffer, 2048);
  167. if (cert_buffer_size < 1) {
  168. printf("Bad cli cert\n");
  169. return -1;
  170. }
  171. printf("Loaded Client certificate from IoT-Safe, size = %lu\n", cert_buffer_size);
  172. // Use the certificate buffer as identity for the TLS client context
  173. if (wolfSSL_CTX_use_certificate_buffer(cli_ctx, cert_buffer,
  174. cert_buffer_size, SSL_FILETYPE_ASN1) != SSL_SUCCESS) {
  175. printf("Cannot load client cert\n");
  176. return -1;
  177. }
  178. printf("Client certificate successfully imported.\n");
  179. \endcode
  180. */
  181. int wolfIoTSafe_GetCert_ex(uint8_t *id, uint16_t id_sz, unsigned char *output, unsigned long sz);
  182. /*!
  183. \ingroup IoTSafe
  184. \brief IOTセーフアプレットに格納されているECC 256ビットの公開鍵をECC_Keyオブジェクトにインポートします。
  185. \param key IOT-SAFEアプレットからインポートされたキーを含むECC_KEYオブジェクト
  186. \param id 公開鍵が保存されているIOTセーフアプレットのキーID
  187. \return 0 成功すると
  188. \sa wc_iotsafe_ecc_export_public
  189. \sa wc_iotsafe_ecc_export_private
  190. */
  191. int wc_iotsafe_ecc_import_public(ecc_key *key, byte key_id);
  192. /*!
  193. \ingroup IoTSafe
  194. \brief ECC_KEYオブジェクトからIOT-SAFEアプレットへの書き込み可能なパブリックキースロットにECC 256ビット公開鍵をエクスポートします。
  195. \param key エクスポートする鍵を含むecc_keyオブジェクト
  196. \param id 公開鍵が保存されているIOTセーフアプレットのキーID
  197. \return 0 成功すると
  198. \sa wc_iotsafe_ecc_import_public_ex
  199. \sa wc_iotsafe_ecc_export_private
  200. */
  201. int wc_iotsafe_ecc_export_public(ecc_key *key, byte key_id);
  202. /*!
  203. \ingroup IoTSafe
  204. \brief ECC_KEYオブジェクトからIOT-SAFEアプレットへの書き込み可能なパブリックキースロットにECC 256ビット公開鍵をエクスポートします。\ ref WC_IOTSAFE_ECC_IMPORT_PUBLIC「WC_IOTSAFE_ECC_IMPORT_PUBLIC」と同等のものは、2バイト以上のキーIDで呼び出すことができる点を除きます。
  205. \param key エクスポートする鍵を含むecc_keyオブジェクト
  206. \param id 公開鍵が保存されるIOTセーフアプレットのキーIDへのポインタ
  207. \param id_size キーIDサイズ
  208. \return 0 成功すると
  209. \sa wc_iotsafe_ecc_import_public
  210. \sa wc_iotsafe_ecc_export_private
  211. */
  212. int wc_iotsafe_ecc_import_public_ex(ecc_key *key, byte *key_id, word16 id_size);
  213. /*!
  214. \ingroup IoTSafe
  215. \brief ECC 256ビットキーをECC_KEYオブジェクトからIOTセーフアプレットに書き込み可能なプライベートキースロットにエクスポートします。
  216. \param key エクスポートする鍵を含むecc_keyオブジェクト
  217. \param id 秘密鍵が保存されるIOTセーフアプレットのキーID
  218. \return 0 成功すると
  219. \sa wc_iotsafe_ecc_export_private_ex
  220. \sa wc_iotsafe_ecc_import_public
  221. \sa wc_iotsafe_ecc_export_public
  222. */
  223. int wc_iotsafe_ecc_export_private(ecc_key *key, byte key_id);
  224. /*!
  225. \ingroup IoTSafe
  226. \brief ECC 256ビットキーをECC_KEYオブジェクトからIOTセーフアプレットに書き込み可能なプライベートキースロットにエクスポートします。\ ref WC_IOTSAFE_ECC_EXPORT_PRIVATE「WC_IOTSAFE_ECC_EXPORT_PRIVATE」を除き、2バイト以上のキーIDを呼び出すことができる点を除き、
  227. \param key エクスポートする鍵を含むecc_keyオブジェクト
  228. \param id 秘密鍵が保存されるIOTセーフアプレットのキーIDへのポインタ
  229. \param id_size キーIDサイズ
  230. \return 0 成功すると
  231. \sa wc_iotsafe_ecc_export_private
  232. \sa wc_iotsafe_ecc_import_public
  233. \sa wc_iotsafe_ecc_export_public
  234. */
  235. int wc_iotsafe_ecc_export_private_ex(ecc_key *key, byte *key_id, word16 id_size);
  236. /*!
  237. \ingroup IoTSafe
  238. \brief 事前計算された256ビットハッシュに署名して、IOT-SAFEアプレットに、以前に保存されたプライベートキー、またはプリプロビジョニングされています。
  239. \param in サインするメッセージハッシュを含むバッファへのポインタ
  240. \param inlen 署名するメッセージの長さ
  241. \param out 生成された署名を保存するためのバッファ
  242. \param outlen 出力バッファの最大長。バイトを保存します
  243. \param id メッセージ署名の生成に成功したときに書き込まれたペイロードに署名するための秘密鍵を含むスロットのIOTセーフアプレットのキーID
  244. \return 0 成功すると
  245. \sa wc_iotsafe_ecc_sign_hash_ex
  246. \sa wc_iotsafe_ecc_verify_hash
  247. \sa wc_iotsafe_ecc_gen_k
  248. */
  249. int wc_iotsafe_ecc_sign_hash(byte *in, word32 inlen, byte *out, word32 *outlen, byte key_id);
  250. /*!
  251. \ingroup IoTSafe
  252. \brief 事前計算された256ビットハッシュに署名して、IOT-SAFEアプレットに、以前に保存されたプライベートキー、またはプリプロビジョニングされています。\ ref wc_iotsafe_ecc_sign_hash "wc_iotsafe_ecc_sign_hash"と同等です。ただし、2バイト以上のキーIDで呼び出すことができます。
  253. \param in サインするメッセージハッシュを含むバッファへのポインタ
  254. \param inlen 署名するメッセージの長さ
  255. \param out 生成された署名を保存するためのバッファ
  256. \param outlen 出力バッファの最大長。バイトを保存します
  257. \param id 秘密鍵を含むスロットのIOT-SAFEアプレットのキーIDへのポインタメッセージ署名の生成に成功したときに書き込まれるペイロードに署名する
  258. \param id_size キーIDサイズ
  259. \return 0 成功すると
  260. \sa wc_iotsafe_ecc_sign_hash
  261. \sa wc_iotsafe_ecc_verify_hash
  262. \sa wc_iotsafe_ecc_gen_k
  263. */
  264. int wc_iotsafe_ecc_sign_hash_ex(byte *in, word32 inlen, byte *out, word32 *outlen, byte *key_id, word16 id_size);
  265. /*!
  266. \ingroup IoTSafe
  267. \brief 予め計算された256ビットハッシュに対するECCシグネチャを、IOT-SAFEアプレット内のプリプロビジョニング、またはプロビジョニングされたプリプロビジョニングを使用します。結果はRESに書き込まれます。1が有効で、0が無効です。注:有効なテストに戻り値を使用しないでください。Resのみを使用してください。
  268. \return 0 成功すると(署名が無効であっても)
  269. \return < 故障の場合は0
  270. \param sig 検証する署名を含むバッファ
  271. \param hash 署名されたハッシュ(メッセージダイジェスト)
  272. \param hashlen ハッシュの長さ(オクテット)
  273. \param res 署名の結果、1 ==有効、0 ==無効
  274. \sa wc_iotsafe_ecc_verify_hash_ex
  275. \sa wc_iotsafe_ecc_sign_hash
  276. \sa wc_iotsafe_ecc_gen_k
  277. */
  278. int wc_iotsafe_ecc_verify_hash(byte *sig, word32 siglen, byte *hash, word32 hashlen, int *res, byte key_id);
  279. /*!
  280. \ingroup IoTSafe
  281. \brief 予め計算された256ビットハッシュに対するECCシグネチャを、IOT-SAFEアプレット内のプリプロビジョニング、またはプロビジョニングされたプリプロビジョニングを使用します。結果はRESに書き込まれます。1が有効で、0が無効です。注:有効なテストに戻り値を使用しないでください。Resのみを使用してください。\ ref WC_IOTSAFE_ECC_VERIFY_HASH "WC_IOTSAFE_ECC_VERIFY_HASH"を除き、2バイト以上のキーIDで呼び出すことができる点を除きます。
  282. \return 0 成功すると(署名が無効であっても)
  283. \return < 故障の場合は0
  284. \param sig 検証する署名を含むバッファ
  285. \param hash 署名されたハッシュ(メッセージダイジェスト)
  286. \param hashlen ハッシュの長さ(オクテット)
  287. \param res 署名の結果、1 ==有効、0 ==無効
  288. \param key_id パブリックECCキーがIOTセーフアプレットに保存されているスロットのID
  289. \sa wc_iotsafe_ecc_verify_hash
  290. \sa wc_iotsafe_ecc_sign_hash
  291. \sa wc_iotsafe_ecc_gen_k
  292. */
  293. int wc_iotsafe_ecc_verify_hash_ex(byte *sig, word32 siglen, byte *hash, word32 hashlen, int *res, byte *key_id, word16 id_size);
  294. /*!
  295. \ingroup IoTSafe
  296. \brief ECC 256ビットのキーペアを生成し、それを(書き込み可能な)スロットにIOTセーフなアプレットに保存します。
  297. \param key_id ECCキーペアがIOTセーフアプレットに格納されているスロットのID。
  298. \return 0 成功すると
  299. \sa wc_iotsafe_ecc_gen_k_ex
  300. \sa wc_iotsafe_ecc_sign_hash
  301. \sa wc_iotsafe_ecc_verify_hash
  302. */
  303. int wc_iotsafe_ecc_gen_k(byte key_id);
  304. /*!
  305. \ingroup IoTSafe
  306. \brief ECC 256ビットのキーペアを生成し、それを(書き込み可能な)スロットにIOTセーフなアプレットに保存します。\ ref wc_iotsafe_ecc_gen_k "wc_iotsafe_ecc_gen_k"と同等です。ただし、2バイト以上のキーIDで呼び出すことができます。
  307. \param key_id ECCキーペアがIOTセーフアプレットに格納されているスロットのID。
  308. \param id_size キーIDサイズ
  309. \return 0 成功すると
  310. \sa wc_iotsafe_ecc_gen_k
  311. \sa wc_iotsafe_ecc_sign_hash_ex
  312. \sa wc_iotsafe_ecc_verify_hash_ex
  313. */
  314. int wc_iotsafe_ecc_gen_k(byte key_id);