tls.h 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  1. /*
  2. * Copyright 2014-2022 The GmSSL Project. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the License); you may
  5. * not use this file except in compliance with the License.
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. */
  9. #ifndef GMSSL_TLS_H
  10. #define GMSSL_TLS_H
  11. #include <stdint.h>
  12. #include <gmssl/sm2.h>
  13. #include <gmssl/sm3.h>
  14. #include <gmssl/sm4.h>
  15. #include <gmssl/digest.h>
  16. #include <gmssl/block_cipher.h>
  17. #include <gmssl/socket.h>
  18. #ifdef __cplusplus
  19. extern "C" {
  20. #endif
  21. /*
  22. TLS Public API
  23. TLS_PROTOCOL
  24. TLS_protocol_tlcp
  25. TLS_protocol_tls12
  26. TLS_protocol_tls13
  27. TLS_CIPHER_SUITE
  28. TLS_cipher_ecc_sm4_cbc_sm3
  29. TLS_cipher_ecc_sm4_gcm_sm3
  30. TLS_cipher_ecdhe_sm4_cbc_sm3
  31. TLS_cipher_ecdhe_sm4_gcm_sm3
  32. TLS_cipher_sm4_gcm_sm3
  33. TLS_CTX
  34. tls_ctx_init
  35. tls_ctx_set_cipher_suites
  36. tls_ctx_set_ca_certificates
  37. tls_ctx_set_certificate_and_key
  38. tls_ctx_set_tlcp_server_certificate_and_keys
  39. tls_ctx_cleanup
  40. TLS_CONNECT
  41. tls_init
  42. tls_set_socket
  43. tls_do_handshake
  44. tls_send
  45. tls_recv
  46. tls_shutdown
  47. tls_cleanup
  48. */
  49. typedef uint32_t uint24_t;
  50. #define tls_uint8_size() 1
  51. #define tls_uint16_size() 2
  52. #define tls_uint24_size() 3
  53. void tls_uint8_to_bytes(uint8_t a, uint8_t **out, size_t *outlen);
  54. void tls_uint16_to_bytes(uint16_t a, uint8_t **out, size_t *outlen);
  55. void tls_uint24_to_bytes(uint24_t a, uint8_t **out, size_t *outlen);
  56. void tls_uint32_to_bytes(uint32_t a, uint8_t **out, size_t *outlen);
  57. void tls_array_to_bytes(const uint8_t *data, size_t len, uint8_t **out, size_t *outlen);
  58. void tls_uint8array_to_bytes(const uint8_t *data, size_t datalen, uint8_t **out, size_t *outlen);
  59. void tls_uint16array_to_bytes(const uint8_t *data, size_t datalen, uint8_t **out, size_t *outlen);
  60. void tls_uint24array_to_bytes(const uint8_t *data, size_t datalen, uint8_t **out, size_t *outlen);
  61. int tls_uint8_from_bytes(uint8_t *a, const uint8_t **in, size_t *inlen);
  62. int tls_uint16_from_bytes(uint16_t *a, const uint8_t **in, size_t *inlen);
  63. int tls_uint24_from_bytes(uint24_t *a, const uint8_t **in, size_t *inlen);
  64. int tls_uint32_from_bytes(uint32_t *a, const uint8_t **in, size_t *inlen);
  65. int tls_array_from_bytes(const uint8_t **data, size_t datalen, const uint8_t **in, size_t *inlen);
  66. int tls_uint8array_from_bytes(const uint8_t **data, size_t *datalen, const uint8_t **in, size_t *inlen);
  67. int tls_uint16array_from_bytes(const uint8_t **data, size_t *datalen, const uint8_t **in, size_t *inlen);
  68. int tls_uint24array_from_bytes(const uint8_t **data, size_t *datalen, const uint8_t **in, size_t *inlen);
  69. int tls_length_is_zero(size_t len);
  70. typedef enum {
  71. TLS_protocol_tlcp = 0x0101,
  72. TLS_protocol_ssl2 = 0x0200,
  73. TLS_protocol_ssl3 = 0x0300,
  74. TLS_protocol_tls1 = 0x0301,
  75. TLS_protocol_tls11 = 0x0302,
  76. TLS_protocol_tls12 = 0x0303,
  77. TLS_protocol_tls13 = 0x0304,
  78. TLS_protocol_dtls1 = 0xfeff, // {254, 255}
  79. TLS_protocol_dtls12 = 0xfefd, // {254, 253}
  80. } TLS_PROTOCOL;
  81. const char *tls_protocol_name(int proto);
  82. typedef enum {
  83. TLS_cipher_null_with_null_null = 0x0000,
  84. // TLS 1.3, RFC 8998
  85. TLS_cipher_sm4_gcm_sm3 = 0x00c6,
  86. TLS_cipher_sm4_ccm_sm3 = 0x00c7,
  87. // TLCP, GB/T 38636-2020, GM/T 0024-2012
  88. TLS_cipher_ecdhe_sm4_cbc_sm3 = 0xe011, // 可以让TLSv1.2使用这个
  89. TLS_cipher_ecdhe_sm4_gcm_sm3 = 0xe051,
  90. TLS_cipher_ecc_sm4_cbc_sm3 = 0xe013,
  91. TLS_cipher_ecc_sm4_gcm_sm3 = 0xe053,
  92. TLS_cipher_ibsdh_sm4_cbc_sm3 = 0xe015,
  93. TLS_cipher_ibsdh_sm4_gcm_sm3 = 0xe055,
  94. TLS_cipher_ibc_sm4_cbc_sm3 = 0xe017,
  95. TLS_cipher_ibc_sm4_gcm_sm3 = 0xe057,
  96. TLS_cipher_rsa_sm4_cbc_sm3 = 0xe019,
  97. TLS_cipher_rsa_sm4_gcm_sm3 = 0xe059,
  98. TLS_cipher_rsa_sm4_cbc_sha256 = 0xe01c,
  99. TLS_cipher_rsa_sm4_gcm_sha256 = 0xe05a,
  100. // TLS 1.3 RFC 8446
  101. TLS_cipher_aes_128_gcm_sha256 = 0x1301, // Mandatory-to-implement
  102. TLS_cipher_aes_256_gcm_sha384 = 0x1302, // SHOULD implement
  103. TLS_cipher_chacha20_poly1305_sha256 = 0x1303, // SHOULD implement
  104. TLS_cipher_aes_128_ccm_sha256 = 0x1304,
  105. TLS_cipher_aes_128_ccm_8_sha256 = 0x1305,
  106. TLS_cipher_empty_renegotiation_info_scsv = 0x00ff,
  107. } TLS_CIPHER_SUITE;
  108. const char *tls_cipher_suite_name(int cipher);
  109. int tls_cipher_suites_select(const uint8_t *client_ciphers, size_t client_ciphers_len,
  110. const int *server_ciphers, size_t server_ciphers_cnt, int *selected_cipher);
  111. int tls_cipher_suite_in_list(int cipher, const int *list, size_t list_count);
  112. typedef enum {
  113. TLS_compression_null = 0,
  114. TLS_compression_default = 1,
  115. } TLS_COMPRESSION_METHOD;
  116. const char *tls_compression_method_name(int meth);
  117. typedef enum {
  118. TLS_record_invalid = 0, // TLS 1.3
  119. TLS_record_change_cipher_spec = 20, // 0x14
  120. TLS_record_alert = 21, // 0x15
  121. TLS_record_handshake = 22, // 0x16
  122. TLS_record_application_data = 23, // 0x17
  123. TLS_record_heartbeat = 24, // 0x18
  124. TLS_record_tls12_cid = 25, // 0x19
  125. } TLS_RECORD_TYPE;
  126. const char *tls_record_type_name(int type);
  127. typedef enum {
  128. TLS_handshake_hello_request = 0,
  129. TLS_handshake_client_hello = 1,
  130. TLS_handshake_server_hello = 2,
  131. TLS_handshake_hello_verify_request = 3,
  132. TLS_handshake_new_session_ticket = 4,
  133. TLS_handshake_end_of_early_data = 5,
  134. TLS_handshake_hello_retry_request = 6,
  135. TLS_handshake_encrypted_extensions = 8,
  136. TLS_handshake_certificate = 11,
  137. TLS_handshake_server_key_exchange = 12,
  138. TLS_handshake_certificate_request = 13,
  139. TLS_handshake_server_hello_done = 14,
  140. TLS_handshake_certificate_verify = 15,
  141. TLS_handshake_client_key_exchange = 16,
  142. TLS_handshake_finished = 20,
  143. TLS_handshake_certificate_url = 21,
  144. TLS_handshake_certificate_status = 22,
  145. TLS_handshake_supplemental_data = 23,
  146. TLS_handshake_key_update = 24,
  147. TLS_handshake_compressed_certificate = 25,
  148. TLS_handshake_ekt_key = 26,
  149. TLS_handshake_message_hash = 254,
  150. } TLS_HANDSHAKE_TYPE;
  151. const char *tls_handshake_type_name(int type);
  152. typedef enum {
  153. TLS_cert_type_rsa_sign = 1,
  154. TLS_cert_type_dss_sign = 2,
  155. TLS_cert_type_rsa_fixed_dh = 3,
  156. TLS_cert_type_dss_fixed_dh = 4,
  157. TLS_cert_type_rsa_ephemeral_dh_RESERVED = 5,
  158. TLS_cert_type_dss_ephemeral_dh_RESERVED = 6,
  159. TLS_cert_type_fortezza_dms_RESERVED = 20,
  160. TLS_cert_type_ecdsa_sign = 64, // also for sm2
  161. TLS_cert_type_rsa_fixed_ecdh = 65,
  162. TLS_cert_type_ecdsa_fixed_ecdh = 66,
  163. TLS_cert_type_gost_sign256 = 67,
  164. TLS_cert_type_gost_sign512 = 68,
  165. TLS_cert_type_ibc_params = 80,
  166. } TLS_CERTIFICATE_TYPE;
  167. const char *tls_cert_type_name(int type);
  168. int tls_cert_type_from_oid(int oid);
  169. typedef enum {
  170. TLS_extension_server_name = 0,
  171. TLS_extension_max_fragment_length = 1,
  172. TLS_extension_client_certificate_url = 2,
  173. TLS_extension_trusted_ca_keys = 3,
  174. TLS_extension_truncated_hmac = 4,
  175. TLS_extension_status_request = 5,
  176. TLS_extension_user_mapping = 6,
  177. TLS_extension_client_authz = 7,
  178. TLS_extension_server_authz = 8,
  179. TLS_extension_cert_type = 9,
  180. TLS_extension_supported_groups = 10,
  181. TLS_extension_ec_point_formats = 11,
  182. TLS_extension_srp = 12,
  183. TLS_extension_signature_algorithms = 13,
  184. TLS_extension_use_srtp = 14,
  185. TLS_extension_heartbeat = 15,
  186. TLS_extension_application_layer_protocol_negotiation= 16,
  187. TLS_extension_status_request_v2 = 17,
  188. TLS_extension_signed_certificate_timestamp = 18,
  189. TLS_extension_client_certificate_type = 19,
  190. TLS_extension_server_certificate_type = 20,
  191. TLS_extension_padding = 21,
  192. TLS_extension_encrypt_then_mac = 22,
  193. TLS_extension_extended_master_secret = 23,
  194. TLS_extension_token_binding = 24,
  195. TLS_extension_cached_info = 25,
  196. TLS_extension_tls_lts = 26,
  197. TLS_extension_compress_certificate = 27,
  198. TLS_extension_record_size_limit = 28,
  199. TLS_extension_pwd_protect = 29,
  200. TLS_extension_pwd_clear = 30,
  201. TLS_extension_password_salt = 31,
  202. TLS_extension_ticket_pinning = 32,
  203. TLS_extension_tls_cert_with_extern_psk = 33,
  204. TLS_extension_delegated_credentials = 34,
  205. TLS_extension_session_ticket = 35,
  206. TLS_extension_TLMSP = 36,
  207. TLS_extension_TLMSP_proxying = 37,
  208. TLS_extension_TLMSP_delegate = 38,
  209. TLS_extension_supported_ekt_ciphers = 39,
  210. TLS_extension_pre_shared_key = 41,
  211. TLS_extension_early_data = 42,
  212. TLS_extension_supported_versions = 43,
  213. TLS_extension_cookie = 44,
  214. TLS_extension_psk_key_exchange_modes = 46,
  215. TLS_extension_certificate_authorities = 47,
  216. TLS_extension_oid_filters = 48,
  217. TLS_extension_post_handshake_auth = 49,
  218. TLS_extension_signature_algorithms_cert = 50,
  219. TLS_extension_key_share = 51,
  220. TLS_extension_transparency_info = 52,
  221. TLS_extension_connection_id = 53,
  222. TLS_extension_external_id_hash = 55,
  223. TLS_extension_external_session_id = 56,
  224. TLS_extension_quic_transport_parameters = 57,
  225. TLS_extension_ticket_request = 58,
  226. TLS_extension_renegotiation_info = 65281,
  227. } TLS_EXTENSION_TYPE;
  228. const char *tls_extension_name(int ext);
  229. typedef enum {
  230. TLS_point_uncompressed = 0,
  231. TLS_point_ansix962_compressed_prime = 1,
  232. TLS_point_ansix962_compressed_char2 = 2,
  233. } TLS_EC_POINT_FORMAT;
  234. const char *tls_ec_point_format_name(int format);
  235. typedef enum {
  236. TLS_curve_type_explicit_prime = 1,
  237. TLS_curve_type_explicit_char2 = 2,
  238. TLS_curve_type_named_curve = 3,
  239. } TLS_CURVE_TYPE;
  240. const char *tls_curve_type_name(int type);
  241. // 与其支持v2,还不如直接修改v2,让v2和v3兼容
  242. typedef enum {
  243. TLS_curve_secp256k1 = 22,
  244. TLS_curve_secp256r1 = 23,
  245. TLS_curve_secp384r1 = 24,
  246. TLS_curve_secp521r1 = 25,
  247. TLS_curve_brainpoolp256r1 = 26,
  248. TLS_curve_brainpoolp384r1 = 27,
  249. TLS_curve_brainpoolp512r1 = 28,
  250. TLS_curve_x25519 = 29,
  251. TLS_curve_x448 = 30,
  252. TLS_curve_brainpoolp256r1tls13 = 31,
  253. TLS_curve_brainpoolp384r1tls13 = 32,
  254. TLS_curve_brainpoolp512r1tls13 = 33,
  255. TLS_curve_sm2p256v1 = 41, // GmSSLv2: 30
  256. } TLS_NAMED_CURVE;
  257. const char *tls_named_curve_name(int curve);
  258. typedef enum {
  259. TLS_sig_rsa_pkcs1_sha1 = 0x0201,
  260. TLS_sig_ecdsa_sha1 = 0x0203,
  261. TLS_sig_rsa_pkcs1_sha256 = 0x0401,
  262. TLS_sig_ecdsa_secp256r1_sha256 = 0x0403,
  263. TLS_sig_rsa_pkcs1_sha256_legacy = 0x0420,
  264. TLS_sig_rsa_pkcs1_sha384 = 0x0501,
  265. TLS_sig_ecdsa_secp384r1_sha384 = 0x0503,
  266. TLS_sig_rsa_pkcs1_sha384_legacy = 0x0520,
  267. TLS_sig_rsa_pkcs1_sha512 = 0x0601,
  268. TLS_sig_ecdsa_secp521r1_sha512 = 0x0603,
  269. TLS_sig_rsa_pkcs1_sha512_legacy = 0x0620,
  270. TLS_sig_sm2sig_sm3 = 0x0708, // GmSSLv2: 0x0707
  271. TLS_sig_rsa_pss_rsae_sha256 = 0x0804,
  272. TLS_sig_rsa_pss_rsae_sha384 = 0x0805,
  273. TLS_sig_rsa_pss_rsae_sha512 = 0x0806,
  274. TLS_sig_ed25519 = 0x0807,
  275. TLS_sig_ed448 = 0x0808,
  276. TLS_sig_rsa_pss_pss_sha256 = 0x0809,
  277. TLS_sig_rsa_pss_pss_sha384 = 0x080A,
  278. TLS_sig_rsa_pss_pss_sha512 = 0x080B,
  279. TLS_sig_ecdsa_brainpoolP256r1tls13_sha256 = 0x081A,
  280. TLS_sig_ecdsa_brainpoolP384r1tls13_sha384 = 0x081B,
  281. TLS_sig_ecdsa_brainpoolP512r1tls13_sha512 = 0x081C,
  282. } TLS_SIGNATURE_SCHEME;
  283. const char *tls_signature_scheme_name(int scheme);
  284. typedef enum {
  285. TLS_change_cipher_spec = 1,
  286. } TLS_CHANGE_CIPHER_SPEC_TYPE;
  287. typedef enum {
  288. TLS_alert_level_warning = 1,
  289. TLS_alert_level_fatal = 2,
  290. } TLS_ALERT_LEVEL;
  291. const char *tls_alert_level_name(int level);
  292. typedef enum {
  293. TLS_alert_close_notify = 0,
  294. TLS_alert_unexpected_message = 10,
  295. TLS_alert_bad_record_mac = 20,
  296. TLS_alert_decryption_failed = 21,
  297. TLS_alert_record_overflow = 22,
  298. TLS_alert_decompression_failure = 30,
  299. TLS_alert_handshake_failure = 40,
  300. TLS_alert_no_certificate = 41,
  301. TLS_alert_bad_certificate = 42,
  302. TLS_alert_unsupported_certificate = 43,
  303. TLS_alert_certificate_revoked = 44,
  304. TLS_alert_certificate_expired = 45,
  305. TLS_alert_certificate_unknown = 46,
  306. TLS_alert_illegal_parameter = 47,
  307. TLS_alert_unknown_ca = 48,
  308. TLS_alert_access_denied = 49,
  309. TLS_alert_decode_error = 50,
  310. TLS_alert_decrypt_error = 51,
  311. TLS_alert_export_restriction = 60,
  312. TLS_alert_protocol_version = 70,
  313. TLS_alert_insufficient_security = 71,
  314. TLS_alert_internal_error = 80,
  315. TLS_alert_user_canceled = 90,
  316. TLS_alert_no_renegotiation = 100,
  317. TLS_alert_unsupported_extension = 110,
  318. TLS_alert_unsupported_site2site = 200,
  319. TLS_alert_no_area = 201,
  320. TLS_alert_unsupported_areatype = 202,
  321. TLS_alert_bad_ibcparam = 203,
  322. TLS_alert_unsupported_ibcparam = 204,
  323. TLS_alert_identity_need = 205,
  324. } TLS_ALERT_DESCRIPTION;
  325. const char *tls_alert_description_text(int description);
  326. int tls_prf(const uint8_t *secret, size_t secretlen, const char *label,
  327. const uint8_t *seed, size_t seedlen,
  328. const uint8_t *more, size_t morelen,
  329. size_t outlen, uint8_t *out);
  330. int tls13_hkdf_extract(const DIGEST *digest, const uint8_t salt[32], const uint8_t in[32], uint8_t out[32]);
  331. int tls13_hkdf_expand_label(const DIGEST *digest, const uint8_t secret[32],
  332. const char *label, const uint8_t *context, size_t context_len,
  333. size_t outlen, uint8_t *out);
  334. int tls13_derive_secret(const uint8_t secret[32], const char *label, const DIGEST_CTX *dgst_ctx, uint8_t out[32]);
  335. int tls_cbc_encrypt(const SM3_HMAC_CTX *hmac_ctx, const SM4_KEY *enc_key,
  336. const uint8_t seq_num[8], const uint8_t header[5],
  337. const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen);
  338. int tls_cbc_decrypt(const SM3_HMAC_CTX *hmac_ctx, const SM4_KEY *dec_key,
  339. const uint8_t seq_num[8], const uint8_t header[5],
  340. const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen);
  341. int tls_record_encrypt(const SM3_HMAC_CTX *hmac_ctx, const SM4_KEY *cbc_key,
  342. const uint8_t seq_num[8], const uint8_t *in, size_t inlen,
  343. uint8_t *out, size_t *outlen);
  344. int tls_record_decrypt(const SM3_HMAC_CTX *hmac_ctx, const SM4_KEY *cbc_key,
  345. const uint8_t seq_num[8], const uint8_t *in, size_t inlen,
  346. uint8_t *out, size_t *outlen);
  347. int tls_seq_num_incr(uint8_t seq_num[8]);
  348. int tls_random_generate(uint8_t random[32]);
  349. int tls_random_print(FILE *fp, const uint8_t random[32], int format, int indent);
  350. int tls_pre_master_secret_generate(uint8_t pre_master_secret[48], int protocol);
  351. int tls_pre_master_secret_print(FILE *fp, const uint8_t pre_master_secret[48], int format, int indent);
  352. int tls_secrets_print(FILE *fp,
  353. const uint8_t *pre_master_secret, size_t pre_master_secret_len,
  354. const uint8_t client_random[32], const uint8_t server_random[32],
  355. const uint8_t master_secret[48],
  356. const uint8_t *key_block, size_t key_block_len,
  357. int format, int indent);
  358. typedef struct {
  359. uint8_t type;
  360. uint8_t protocol[2];
  361. uint8_t data_length[2];
  362. } TLS_RECORD_HEADER;
  363. #define TLS_RECORD_HEADER_SIZE (1 + tls_uint16_size() + tls_uint16_size()) // 5
  364. #define TLS_MAX_PLAINTEXT_SIZE (1 << 14) // 16384
  365. #define TLS_MAX_COMPRESSED_SIZE ((1 << 14) + 1024) // 17408
  366. #define TLS_MAX_CIPHERTEXT_SIZE ((1 << 14) + 2048) // 18432
  367. #define TLS_MAX_RECORD_SIZE (TLS_RECORD_HEADER_SIZE + TLS_MAX_CIPHERTEXT_SIZE) // 18437
  368. #define tls_record_type(record) ((record)[0])
  369. #define tls_record_header(record) ((record)+0)
  370. #define tls_record_protocol(record) (((uint16_t)((record)[1]) << 8) | (record)[2])
  371. #define tls_record_data(record) ((record)+TLS_RECORD_HEADER_SIZE)
  372. #define tls_record_data_length(record) (((uint16_t)((record)[3]) << 8) | (record)[4])
  373. #define tls_record_length(record) (TLS_RECORD_HEADER_SIZE + tls_record_data_length(record))
  374. int tls_record_set_type(uint8_t *record, int type);
  375. int tls_record_set_protocol(uint8_t *record, int protocol);
  376. int tls_record_set_data_length(uint8_t *record, size_t length);
  377. int tls_record_set_data(uint8_t *record, const uint8_t *data, size_t datalen);
  378. // 握手消息ServerKeyExchange, ClientKeyExchange的解析依赖当前密码套件
  379. #define tls_format_set_cipher_suite(fmt,cipher) do {(fmt)|=((cipher)<<8);} while (0)
  380. int tls_record_print(FILE *fp, const uint8_t *record, size_t recordlen, int format, int indent);
  381. int tlcp_record_print(FILE *fp, const uint8_t *record, size_t recordlen, int format, int indent);
  382. int tls_record_send(const uint8_t *record, size_t recordlen, tls_socket_t sock);
  383. int tls_record_recv(uint8_t *record, size_t *recordlen, tls_socket_t sock);
  384. int tls12_record_recv(uint8_t *record, size_t *recordlen, tls_socket_t sock);
  385. // Handshake
  386. typedef struct {
  387. uint8_t type;
  388. uint8_t length[3];
  389. } TLS_HANDSHAKE_HEADER;
  390. #define TLS_HANDSHAKE_HEADER_SIZE 4
  391. #define TLS_MAX_HANDSHAKE_DATA_SIZE (TLS_MAX_PLAINTEXT_SIZE - TLS_HANDSHAKE_HEADER_SIZE)
  392. #define tls_handshake_data(p) ((p) + TLS_HANDSHAKE_HEADER_SIZE)
  393. //#define tls_handshake_data_length(p)
  394. int tls_record_set_handshake(uint8_t *record, size_t *recordlen,
  395. int type, const uint8_t *data, size_t datalen);
  396. int tls_record_get_handshake(const uint8_t *record,
  397. int *type, const uint8_t **data, size_t *datalen);
  398. int tls_handshake_print(FILE *fp, const uint8_t *handshake, size_t handshakelen, int format, int indent);
  399. // HelloRequest
  400. int tls_hello_request_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent);
  401. // ClientHello, ServerHello
  402. #define TLS_MIN_SESSION_ID_SIZE 0
  403. #define TLS_MAX_SESSION_ID_SIZE 32
  404. int tls_record_set_handshake_client_hello(uint8_t *record, size_t *recordlen,
  405. int client_protocol, const uint8_t random[32],
  406. const uint8_t *session_id, size_t session_id_len,
  407. const int *cipher_suites, size_t cipher_suites_count,
  408. const uint8_t *exts, size_t exts_len);
  409. int tls_record_get_handshake_client_hello(const uint8_t *record,
  410. int *client_protocol, const uint8_t **random,
  411. const uint8_t **session_id, size_t *session_id_len,
  412. const uint8_t **cipher_suites, size_t *cipher_suites_len,
  413. const uint8_t **exts, size_t *exts_len);
  414. int tls_client_hello_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent);
  415. int tls_record_set_handshake_server_hello(uint8_t *record, size_t *recordlen,
  416. int server_protocol, const uint8_t random[32],
  417. const uint8_t *session_id, size_t session_id_len,
  418. int cipher_suite, const uint8_t *exts, size_t exts_len);
  419. int tls_record_get_handshake_server_hello(const uint8_t *record,
  420. int *protocol, const uint8_t **random, const uint8_t **session_id, size_t *session_id_len,
  421. int *cipher_suite, const uint8_t **exts, size_t *exts_len);
  422. int tls_server_hello_print(FILE *fp, const uint8_t *server_hello, size_t len, int format, int indent);
  423. // Extensions
  424. int tls_ec_point_formats_ext_to_bytes(const int *formats, size_t formats_cnt,
  425. uint8_t **out, size_t *outlen);
  426. int tls_process_client_ec_point_formats(const uint8_t *ext_data, size_t ext_datalen,
  427. uint8_t **out, size_t *outlen);
  428. int tls_process_server_ec_point_formats(const uint8_t *ext_data, size_t ext_datalen);
  429. int tls_supported_groups_ext_to_bytes(const int *groups, size_t groups_cnt,
  430. uint8_t **out, size_t *outlen);
  431. int tls_process_client_supported_groups(const uint8_t *ext_data, size_t ext_datalen,
  432. uint8_t **out, size_t *outlen);
  433. int tls_process_server_supported_groups(const uint8_t *ext_data, size_t ext_datalen);
  434. int tls_signature_algorithms_ext_to_bytes_ex(int ext_type, const int *algs, size_t algs_cnt,
  435. uint8_t **out, size_t *outlen);
  436. int tls_signature_algorithms_ext_to_bytes(const int *algs, size_t algs_cnt,
  437. uint8_t **out, size_t *outlen);
  438. int tls13_signature_algorithms_cert_ext_to_bytes(const int *algs, size_t algs_cnt,
  439. uint8_t **out, size_t *outlen);
  440. int tls_process_client_signature_algorithms(const uint8_t *ext_data, size_t ext_datalen,
  441. uint8_t **out, size_t *outlen);
  442. int tls_process_server_signature_algors(const uint8_t *ext_data, size_t ext_datalen);
  443. int tls13_supported_versions_ext_to_bytes(int handshake_type, const int *protos, size_t protos_cnt,
  444. uint8_t **out, size_t *outlen);
  445. int tls13_process_client_supported_versions(const uint8_t *ext_data, size_t ext_datalen,
  446. uint8_t **out, size_t *outlen);
  447. int tls13_process_server_supported_versions(const uint8_t *ext_data, size_t ext_datalen);
  448. int tls13_key_share_entry_to_bytes(const SM2_POINT *point, uint8_t **out, size_t *outlen);
  449. int tls13_client_key_share_ext_to_bytes(const SM2_POINT *point, uint8_t **out, size_t *outlen);
  450. int tls13_server_key_share_ext_to_bytes(const SM2_POINT *point, uint8_t **out, size_t *outlen);
  451. int tls13_process_client_key_share(const uint8_t *ext_data, size_t ext_datalen,
  452. const SM2_KEY *server_ecdhe_key, SM2_POINT *client_ecdhe_public,
  453. uint8_t **out, size_t *outlen);
  454. int tls13_process_server_key_share(const uint8_t *ext_data, size_t ext_datalen, SM2_POINT *point);
  455. int tls13_certificate_authorities_ext_to_bytes(const uint8_t *ca_names, size_t ca_names_len,
  456. uint8_t **out, size_t *outlen);
  457. int tls_ext_from_bytes(int *type, const uint8_t **data, size_t *datalen, const uint8_t **in, size_t *inlen);
  458. int tls_process_client_exts(const uint8_t *exts, size_t extslen, uint8_t *out, size_t *outlen, size_t maxlen);
  459. int tls_process_server_exts(const uint8_t *exts, size_t extslen,
  460. int *ec_point_format, int *supported_group, int *signature_algor);
  461. // Certificate
  462. int tls_record_set_handshake_certificate(uint8_t *record, size_t *recordlen,
  463. const uint8_t *certs, size_t certslen);
  464. // 这个函数比较特殊,是直接解析了证书链,而不是返回指针
  465. // 应该提供一个独立的解析函数来解析TLS的证书链
  466. int tls_record_get_handshake_certificate(const uint8_t *record, uint8_t *certs, size_t *certslen);
  467. // ServerKeyExchange
  468. int tls_server_key_exchange_print(FILE *fp, const uint8_t *ske, size_t skelen, int format, int indent);
  469. #define TLS_MAX_SIGNATURE_SIZE SM2_MAX_SIGNATURE_SIZE
  470. int tls_sign_server_ecdh_params(const SM2_KEY *server_sign_key,
  471. const uint8_t client_random[32], const uint8_t server_random[32],
  472. int curve, const SM2_POINT *point, uint8_t *sig, size_t *siglen);
  473. int tls_verify_server_ecdh_params(const SM2_KEY *server_sign_key,
  474. const uint8_t client_random[32], const uint8_t server_random[32],
  475. int curve, const SM2_POINT *point, const uint8_t *sig, size_t siglen);
  476. int tls_record_set_handshake_server_key_exchange_ecdhe(uint8_t *record, size_t *recordlen,
  477. int curve, const SM2_POINT *point, const uint8_t *sig, size_t siglen);
  478. int tls_record_get_handshake_server_key_exchange_ecdhe(const uint8_t *record,
  479. int *curve, SM2_POINT *point, const uint8_t **sig, size_t *siglen);
  480. int tls_server_key_exchange_ecdhe_print(FILE *fp, const uint8_t *data, size_t datalen,
  481. int format, int indent);
  482. int tlcp_record_set_handshake_server_key_exchange_pke(uint8_t *record, size_t *recordlen,
  483. const uint8_t *sig, size_t siglen);
  484. int tlcp_record_get_handshake_server_key_exchange_pke(const uint8_t *record,
  485. const uint8_t **sig, size_t *siglen);
  486. int tlcp_server_key_exchange_pke_print(FILE *fp, const uint8_t *sig, size_t siglen, int format, int indent);
  487. // CertificateRequest
  488. #define TLS_MAX_CERTIFICATE_TYPES 256
  489. #define TLS_MAX_CA_NAMES_SIZE (TLS_MAX_HANDSHAKE_DATA_SIZE - tls_uint8_size() - tls_uint16_size())
  490. int tls_authorities_from_certs(uint8_t *ca_names, size_t *ca_names_len, size_t maxlen, const uint8_t *certs, size_t certslen);
  491. int tls_authorities_issued_certificate(const uint8_t *ca_names, size_t ca_namelen, const uint8_t *certs, size_t certslen);
  492. int tls_cert_types_accepted(const uint8_t *types, size_t types_len, const uint8_t *client_certs, size_t client_certs_len);
  493. int tls_record_set_handshake_certificate_request(uint8_t *record, size_t *recordlen,
  494. const uint8_t *cert_types, size_t cert_types_len,
  495. const uint8_t *ca_names, size_t ca_names_len);
  496. int tls_record_get_handshake_certificate_request(const uint8_t *record,
  497. const uint8_t **cert_types, size_t *cert_types_len,
  498. const uint8_t **ca_names, size_t *ca_names_len);
  499. int tls_certificate_request_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent);
  500. // ServerHelloDone
  501. int tls_record_set_handshake_server_hello_done(uint8_t *record, size_t *recordlen);
  502. int tls_record_get_handshake_server_hello_done(const uint8_t *record);
  503. int tls_server_hello_done_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent);
  504. // ClientKeyExchange
  505. int tls_record_set_handshake_client_key_exchange_pke(uint8_t *record, size_t *recordlen,
  506. const uint8_t *enced_pms, size_t enced_pms_len);
  507. int tls_record_get_handshake_client_key_exchange_pke(const uint8_t *record,
  508. const uint8_t **enced_pms, size_t *enced_pms_len);
  509. int tls_client_key_exchange_pke_print(FILE *fp, const uint8_t *cke, size_t ckelen, int format, int indent);
  510. int tls_client_key_exchange_print(FILE *fp, const uint8_t *cke, size_t ckelen, int format, int indent);
  511. int tls_record_set_handshake_client_key_exchange_ecdhe(uint8_t *record, size_t *recordlen,
  512. const SM2_POINT *point); // 这里不应该支持SM2_POINT类型
  513. int tls_record_get_handshake_client_key_exchange_ecdhe(const uint8_t *record, SM2_POINT *point);
  514. int tls_client_key_exchange_ecdhe_print(FILE *fp, const uint8_t *data, size_t datalen,
  515. int format, int indent);
  516. // CertificateVerify
  517. int tls_record_set_handshake_certificate_verify(uint8_t *record, size_t *recordlen,
  518. const uint8_t *sig, size_t siglen);
  519. int tls_record_get_handshake_certificate_verify(const uint8_t *record,
  520. const uint8_t **sig, size_t *siglen);
  521. int tls_certificate_verify_print(FILE *fp, const uint8_t *p, size_t len, int format, int indent);
  522. typedef enum {
  523. TLS_client_verify_client_hello = 0,
  524. TLS_client_verify_server_hello = 1,
  525. TLS_client_verify_server_certificate = 2,
  526. TLS_client_verify_server_key_exchange = 3,
  527. TLS_client_verify_cert_request = 4,
  528. TLS_client_verify_server_hello_done = 5,
  529. TLS_client_verify_client_certificate = 6,
  530. TLS_client_verify_client_key_exchange = 7,
  531. } TLS_CLIENT_VERIFY_INDEX;
  532. typedef struct {
  533. TLS_CLIENT_VERIFY_INDEX index;
  534. uint8_t *handshake[8]; // Record data only, no record header
  535. size_t handshake_len[8];
  536. } TLS_CLIENT_VERIFY_CTX;
  537. int tls_client_verify_init(TLS_CLIENT_VERIFY_CTX *ctx);
  538. int tls_client_verify_update(TLS_CLIENT_VERIFY_CTX *ctx, const uint8_t *handshake, size_t handshake_len);
  539. int tls_client_verify_finish(TLS_CLIENT_VERIFY_CTX *ctx, const uint8_t *sig, size_t siglen, const SM2_KEY *public_key);
  540. void tls_client_verify_cleanup(TLS_CLIENT_VERIFY_CTX *ctx);
  541. // Finished
  542. // FIXME: 支持TLS 1.3 提供MIN, MAX或TLS12, TLS13, TLCP...
  543. #define TLS_VERIFY_DATA_SIZE 12 // TLS 1.3或者其他版本支持更长的verify_data
  544. #define TLS_FINISHED_RECORD_SIZE (TLS_RECORD_HEADER_SIZE + TLS_HANDSHAKE_HEADER_SIZE + TLS_VERIFY_DATA_SIZE) // 21
  545. #define TLS_MAX_PADDING_SIZE (1 + 255)
  546. #define TLS_MAC_SIZE SM3_HMAC_SIZE
  547. #define TLS_FINISHED_RECORD_BUF_SIZE (TLS_FINISHED_RECORD_SIZE + TLS_MAC_SIZE + TLS_MAX_PADDING_SIZE) // 309
  548. int tls_record_set_handshake_finished(uint8_t *record, size_t *recordlen,
  549. const uint8_t *verify_data, size_t verify_data_len);
  550. int tls_record_get_handshake_finished(const uint8_t *record,
  551. const uint8_t **verify_data, size_t *verify_data_len);
  552. int tls_finished_print(FILE *fp, const uint8_t *a, size_t len, int format, int indent);
  553. // Alert
  554. typedef struct {
  555. uint8_t level;
  556. uint8_t description;
  557. } TLS_ALERT;
  558. #define TLS_ALERT_RECORD_SIZE (TLS_RECORD_HEADER_SIZE + 2)
  559. int tls_record_set_alert(uint8_t *record, size_t *recordlen, int alert_level, int alert_description);
  560. int tls_record_get_alert(const uint8_t *record, int *alert_level, int *alert_description);
  561. int tls_alert_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent);
  562. // ChangeCipherSpec
  563. typedef struct {
  564. uint8_t type;
  565. } TLS_CHANGE_CIPHER_SPEC;
  566. const char *tls_change_cipher_spec_text(int change_cipher_spec);
  567. int tls_change_cipher_spec_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent);
  568. int tls_record_set_change_cipher_spec(uint8_t *record, size_t *recordlen);
  569. int tls_record_get_change_cipher_spec(const uint8_t *record);
  570. // ApplicationData
  571. int tls_record_set_application_data(uint8_t *record, size_t *recordlen,
  572. const uint8_t *data, size_t datalen);
  573. int tls_record_get_application_data(uint8_t *record,
  574. const uint8_t **data, size_t *datalen);
  575. int tls_application_data_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent);
  576. enum {
  577. TLS_server_mode = 0,
  578. TLS_client_mode = 1,
  579. };
  580. #define TLS_MAX_CIPHER_SUITES_COUNT 64
  581. typedef struct {
  582. int protocol;
  583. int is_client;
  584. int cipher_suites[TLS_MAX_CIPHER_SUITES_COUNT];
  585. size_t cipher_suites_cnt;
  586. uint8_t *cacerts;
  587. size_t cacertslen;
  588. uint8_t *certs;
  589. size_t certslen;
  590. SM2_KEY signkey;
  591. SM2_KEY kenckey;
  592. int verify_depth;
  593. } TLS_CTX;
  594. int tls_ctx_init(TLS_CTX *ctx, int protocol, int is_client);
  595. int tls_ctx_set_cipher_suites(TLS_CTX *ctx, const int *cipher_suites, size_t cipher_suites_cnt);
  596. int tls_ctx_set_ca_certificates(TLS_CTX *ctx, const char *cacertsfile, int depth);
  597. int tls_ctx_set_certificate_and_key(TLS_CTX *ctx, const char *chainfile,
  598. const char *keyfile, const char *keypass);
  599. int tls_ctx_set_tlcp_server_certificate_and_keys(TLS_CTX *ctx, const char *chainfile,
  600. const char *signkeyfile, const char *signkeypass,
  601. const char *kenckeyfile, const char *kenckeypass);
  602. void tls_ctx_cleanup(TLS_CTX *ctx);
  603. #define TLS_MAX_CERTIFICATES_SIZE 2048
  604. #define TLS_DEFAULT_VERIFY_DEPTH 4
  605. #define TLS_MAX_VERIFY_DEPTH 5
  606. typedef struct {
  607. int protocol;
  608. int is_client;
  609. int cipher_suites[TLS_MAX_CIPHER_SUITES_COUNT];
  610. size_t cipher_suites_cnt;
  611. tls_socket_t sock;
  612. uint8_t enced_record[TLS_MAX_RECORD_SIZE];
  613. size_t enced_record_len;
  614. uint8_t record[TLS_MAX_RECORD_SIZE];
  615. // 其实这个就不太对了,还是应该有一个完整的密文记录
  616. uint8_t databuf[TLS_MAX_PLAINTEXT_SIZE];
  617. uint8_t *data;
  618. size_t datalen;
  619. int cipher_suite;
  620. uint8_t session_id[32];
  621. size_t session_id_len;
  622. uint8_t server_certs[TLS_MAX_CERTIFICATES_SIZE]; // 动态的可能会好一点
  623. size_t server_certs_len;
  624. uint8_t client_certs[TLS_MAX_CERTIFICATES_SIZE];
  625. size_t client_certs_len;
  626. uint8_t ca_certs[2048];
  627. size_t ca_certs_len;
  628. SM2_KEY sign_key;
  629. SM2_KEY kenc_key;
  630. int verify_result;
  631. uint8_t master_secret[48];
  632. uint8_t key_block[96];
  633. SM3_HMAC_CTX client_write_mac_ctx;
  634. SM3_HMAC_CTX server_write_mac_ctx;
  635. SM4_KEY client_write_enc_key;
  636. SM4_KEY server_write_enc_key;
  637. uint8_t client_seq_num[8];
  638. uint8_t server_seq_num[8];
  639. uint8_t client_write_iv[12]; // tls13
  640. uint8_t server_write_iv[12]; // tls13
  641. BLOCK_CIPHER_KEY client_write_key;
  642. BLOCK_CIPHER_KEY server_write_key;
  643. } TLS_CONNECT;
  644. #define TLS_MAX_EXTENSIONS_SIZE 512 // 这个应该再考虑一下数值,是否可以用其他的缓冲区装载?
  645. int tls_init(TLS_CONNECT *conn, const TLS_CTX *ctx);
  646. int tls_set_socket(TLS_CONNECT *conn, tls_socket_t sock);
  647. int tls_do_handshake(TLS_CONNECT *conn);
  648. int tls_send(TLS_CONNECT *conn, const uint8_t *in, size_t inlen, size_t *sentlen);
  649. int tls_recv(TLS_CONNECT *conn, uint8_t *out, size_t outlen, size_t *recvlen);
  650. int tls_shutdown(TLS_CONNECT *conn);
  651. void tls_cleanup(TLS_CONNECT *conn);
  652. int tlcp_do_connect(TLS_CONNECT *conn);
  653. int tlcp_do_accept(TLS_CONNECT *conn);
  654. int tls12_do_connect(TLS_CONNECT *conn);
  655. int tls12_do_accept(TLS_CONNECT *conn);
  656. #define TLS13_SM2_ID "TLSv1.3+GM+Cipher+Suite"
  657. #define TLS13_SM2_ID_LENGTH (sizeof(TLS13_SM2_ID)-1)
  658. int tls13_do_connect(TLS_CONNECT *conn);
  659. int tls13_do_accept(TLS_CONNECT *conn);
  660. int tls_send_alert(TLS_CONNECT *conn, int alert);
  661. int tls_send_warning(TLS_CONNECT *conn, int alert);
  662. int tls13_send(TLS_CONNECT *conn, const uint8_t *data, size_t datalen, size_t *sentlen);
  663. int tls13_recv(TLS_CONNECT *conn, uint8_t *out, size_t outlen, size_t *recvlen);
  664. int tls13_connect(TLS_CONNECT *conn, const char *hostname, int port, FILE *server_cacerts_fp,
  665. FILE *client_certs_fp, const SM2_KEY *client_sign_key);
  666. int tls13_accept(TLS_CONNECT *conn, int port,
  667. FILE *server_certs_fp, const SM2_KEY *server_sign_key,
  668. FILE *client_cacerts_fp);
  669. int tls13_supported_versions_ext_print(FILE *fp, int fmt, int ind, int handshake_type, const uint8_t *data, size_t datalen);
  670. int tls13_key_share_ext_print(FILE *fp, int fmt, int ind, int handshake_type, const uint8_t *data, size_t datalen);
  671. int tls_process_client_hello_exts(const uint8_t *exts, size_t extslen, uint8_t *out, size_t *outlen, size_t maxlen);
  672. int tls_process_server_hello_exts(const uint8_t *exts, size_t extslen,
  673. int *ec_point_format, int *supported_group, int *signature_algor);
  674. int tls13_encrypted_extensions_print(FILE *fp, int fmt, int ind, const uint8_t *data, size_t datalen);
  675. int tls13_extension_print(FILE *fp, int fmt, int ind,
  676. int handshake_type, int ext_type, const uint8_t *ext_data, size_t ext_datalen);
  677. int tls13_extensions_print(FILE *fp, int fmt, int ind,
  678. int handshake_type, const uint8_t *exts, size_t extslen);
  679. int tls13_certificate_print(FILE *fp, int fmt, int ind, const uint8_t *cert, size_t certlen);
  680. int tls13_certificate_request_print(FILE *fp, int fmt, int ind, const uint8_t *cert, size_t certlen);
  681. int tls13_certificate_verify_print(FILE *fp, int fmt, int ind, const uint8_t *d, size_t dlen);
  682. int tls13_record_print(FILE *fp, int format, int indent, const uint8_t *record, size_t recordlen);
  683. int tls13_gcm_encrypt(const BLOCK_CIPHER_KEY *key, const uint8_t iv[12],
  684. const uint8_t seq_num[8], int record_type,
  685. const uint8_t *in, size_t inlen, size_t padding_len, // TLSInnerPlaintext.content
  686. uint8_t *out, size_t *outlen); // TLSCiphertext.encrypted_record
  687. int tls13_gcm_decrypt(const BLOCK_CIPHER_KEY *key, const uint8_t iv[12],
  688. const uint8_t seq_num[8], const uint8_t *in, size_t inlen,
  689. int *record_type, uint8_t *out, size_t *outlen);
  690. #ifdef TLS_DEBUG
  691. # define tls_trace(s) fprintf(stderr,(s))
  692. # define tls_record_trace(fp,rec,reclen,fmt,ind) tls_record_print(fp,rec,reclen,fmt,ind)
  693. # define tlcp_record_trace(fp,rec,reclen,fmt,ind) tlcp_record_print(fp,rec,reclen,fmt,ind)
  694. # define tls12_record_trace(fp,rec,reclen,fmt,ind) tls12_record_print(fp,rec,reclen,fmt,ind)
  695. # define tls13_record_trace(fp,rec,reclen,fmt,ind) tls13_record_print(fp,fmt,ind,rec,reclen)
  696. #else
  697. # define tls_trace(s)
  698. # define tls_record_trace(fp,rec,reclen,fmt,ind)
  699. # define tlcp_record_trace(fp,rec,reclen,fmt,ind)
  700. # define tls12_record_trace(fp,rec,reclen,fmt,ind)
  701. # define tls13_record_trace(fp,rec,reclen,fmt,ind)
  702. #endif
  703. #ifdef __cplusplus
  704. }
  705. #endif
  706. #endif