tlcp.c 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. /*
  2. * Copyright 2014-2023 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. #include <time.h>
  10. #include <errno.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <gmssl/rand.h>
  15. #include <gmssl/x509.h>
  16. #include <gmssl/error.h>
  17. #include <gmssl/mem.h>
  18. #include <gmssl/sm2.h>
  19. #include <gmssl/sm3.h>
  20. #include <gmssl/sm4.h>
  21. #include <gmssl/pem.h>
  22. #include <gmssl/tls.h>
  23. static const int tlcp_ciphers[] = { TLS_cipher_ecc_sm4_cbc_sm3 };
  24. static const size_t tlcp_ciphers_count = sizeof(tlcp_ciphers)/sizeof(tlcp_ciphers[0]);
  25. void printbyte(uint8_t *ptr, int len, char *name) {
  26. fprintf(stderr, "%s", name);
  27. for (int i = 0; i < len; i++) {
  28. if (i % 16 == 0)
  29. fprintf(stderr, "\n");
  30. fprintf(stderr, "0x%02X ", ptr[i]);
  31. }
  32. fprintf(stderr, "\n");
  33. }
  34. int tlcp_record_print(FILE *fp, const uint8_t *record, size_t recordlen, int format, int indent)
  35. {
  36. // 目前只支持TLCP的ECC公钥加密套件,因此不论用哪个套件解析都是一样的
  37. // 如果未来支持ECDHE套件,可以将函数改为宏,直接传入 (conn->cipher_suite << 8)
  38. format |= tlcp_ciphers[0] << 8;
  39. return tls_record_print(fp, record, recordlen, format, indent);
  40. }
  41. int tlcp_record_set_handshake_server_key_exchange_pke(uint8_t *record, size_t *recordlen,
  42. const uint8_t *sig, size_t siglen)
  43. {
  44. int type = TLS_handshake_server_key_exchange;
  45. uint8_t *p;
  46. size_t len = 0;
  47. if (!record || !recordlen || !sig || !siglen) {
  48. error_print();
  49. return -1;
  50. }
  51. if (siglen > SM2_MAX_SIGNATURE_SIZE) {
  52. error_print();
  53. return -1;
  54. }
  55. if (tls_record_protocol(record) != TLS_protocol_tlcp) {
  56. error_print();
  57. return -1;
  58. }
  59. p = tls_handshake_data(tls_record_data(record));
  60. // 注意TLCP的ServerKeyExchange中的签名值需要封装在uint16array中
  61. // 但是CertificateVerify中直接装载签名值DER
  62. tls_uint16array_to_bytes(sig, siglen, &p, &len);
  63. tls_record_set_handshake(record, recordlen, type, NULL, len);
  64. return 1;
  65. }
  66. int tlcp_record_get_handshake_server_key_exchange_pke(const uint8_t *record,
  67. const uint8_t **sig, size_t *siglen)
  68. {
  69. int type;
  70. const uint8_t *p;
  71. size_t len;
  72. if (!record || !sig || !siglen) {
  73. error_print();
  74. return -1;
  75. }
  76. if (tls_record_get_handshake(record, &type, &p, &len) != 1) {
  77. error_print();
  78. return -1;
  79. }
  80. if (type != TLS_handshake_server_key_exchange) {
  81. error_print();
  82. return -1;
  83. }
  84. if (tls_record_protocol(record) != TLS_protocol_tlcp) {
  85. error_print();
  86. return -1;
  87. }
  88. if (tls_uint16array_from_bytes(sig, siglen, &p, &len) != 1) {
  89. error_print();
  90. return -1;
  91. }
  92. if (len) {
  93. error_print();
  94. return -1;
  95. }
  96. return 1;
  97. }
  98. int tlcp_server_key_exchange_pke_print(FILE *fp, const uint8_t *data, size_t datalen, int format, int indent)
  99. {
  100. const uint8_t *sig;
  101. size_t siglen;
  102. format_print(fp, format, indent, "ServerKeyExchange\n");
  103. indent += 4;
  104. if (tls_uint16array_from_bytes(&sig, &siglen, &data, &datalen) != 1) {
  105. error_print();
  106. return -1;
  107. }
  108. format_bytes(fp, format, indent, "signature", sig, siglen);
  109. if (datalen) {
  110. error_print();
  111. return -1;
  112. }
  113. return 1;
  114. }
  115. int tlcp_do_connect(TLS_CONNECT *conn)
  116. {
  117. int ret = -1;
  118. uint8_t *record = conn->record;
  119. uint8_t finished_record[TLS_FINISHED_RECORD_BUF_SIZE];
  120. size_t recordlen, finished_record_len;
  121. uint8_t client_random[32];
  122. uint8_t server_random[32];
  123. int protocol;
  124. int cipher_suite;
  125. const uint8_t *random;
  126. const uint8_t *session_id;
  127. size_t session_id_len;
  128. const uint8_t *exts;
  129. size_t exts_len;
  130. SM2_KEY server_sign_key;
  131. SM2_KEY server_enc_key;
  132. SM2_SIGN_CTX verify_ctx;
  133. SM2_SIGN_CTX sign_ctx;
  134. const uint8_t *sig;
  135. size_t siglen;
  136. uint8_t pre_master_secret[48];
  137. uint8_t enced_pre_master_secret[SM2_MAX_CIPHERTEXT_SIZE];
  138. size_t enced_pre_master_secret_len;
  139. SM3_CTX sm3_ctx;
  140. SM3_CTX tmp_sm3_ctx;
  141. uint8_t sm3_hash[32];
  142. const uint8_t *verify_data;
  143. size_t verify_data_len;
  144. uint8_t local_verify_data[12];
  145. int handshake_type;
  146. const uint8_t *server_enc_cert;
  147. size_t server_enc_cert_len;
  148. uint8_t server_enc_cert_lenbuf[3];
  149. const uint8_t *cp;
  150. uint8_t *p;
  151. size_t len;
  152. int depth = 5;
  153. int alert = 0;
  154. int verify_result;
  155. // 初始化记录缓冲
  156. tls_record_set_protocol(record, TLS_protocol_tlcp);
  157. tls_record_set_protocol(finished_record, TLS_protocol_tlcp);
  158. // 准备Finished Context(和ClientVerify)
  159. sm3_init(&sm3_ctx);
  160. // send ClientHello
  161. tls_random_generate(client_random);
  162. if (tls_record_set_handshake_client_hello(record, &recordlen,
  163. TLS_protocol_tlcp, client_random, NULL, 0,
  164. tlcp_ciphers, tlcp_ciphers_count, NULL, 0) != 1) {
  165. error_print();
  166. goto end;
  167. }
  168. tls_trace("send ClientHello\n");
  169. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  170. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  171. error_print();
  172. goto end;
  173. }
  174. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  175. // recv ServerHello
  176. tls_trace("recv ServerHello\n");
  177. if (tls_record_recv(record, &recordlen, conn->sock) != 1) {
  178. error_print();
  179. tls_send_alert(conn, TLS_alert_unexpected_message);
  180. goto end;
  181. }
  182. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  183. if (tls_record_protocol(record) != TLS_protocol_tlcp) {
  184. error_print();
  185. tls_send_alert(conn, TLS_alert_protocol_version);
  186. goto end;
  187. }
  188. if (tls_record_get_handshake_server_hello(record,
  189. &protocol, &random, &session_id, &session_id_len, &cipher_suite,
  190. &exts, &exts_len) != 1) {
  191. error_print();
  192. tls_send_alert(conn, TLS_alert_unexpected_message);
  193. goto end;
  194. }
  195. if (protocol != TLS_protocol_tlcp) {
  196. tls_send_alert(conn, TLS_alert_protocol_version);
  197. error_print();
  198. goto end;
  199. }
  200. if (tls_cipher_suite_in_list(cipher_suite, tlcp_ciphers, tlcp_ciphers_count) != 1) {
  201. tls_send_alert(conn, TLS_alert_handshake_failure);
  202. error_print();
  203. goto end;
  204. }
  205. if (exts) {
  206. error_print();
  207. tls_send_alert(conn, TLS_alert_unexpected_message);
  208. goto end;
  209. }
  210. memcpy(server_random, random, 32);
  211. memcpy(conn->session_id, session_id, session_id_len);
  212. conn->cipher_suite = cipher_suite;
  213. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  214. // recv ServerCertificate
  215. tls_trace("recv ServerCertificate\n");
  216. if (tls_record_recv(record, &recordlen, conn->sock) != 1
  217. || tls_record_protocol(record) != TLS_protocol_tlcp) {
  218. error_print();
  219. tls_send_alert(conn, TLS_alert_unexpected_message);
  220. goto end;
  221. }
  222. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  223. if (tls_record_get_handshake_certificate(record,
  224. conn->server_certs, &conn->server_certs_len) != 1) {
  225. error_print();
  226. tls_send_alert(conn, TLS_alert_unexpected_message);
  227. goto end;
  228. }
  229. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  230. // verify ServerCertificate
  231. if (conn->ca_certs_len) {
  232. // 只有提供了CA证书才验证服务器证书链
  233. // FIXME: 逻辑需要再检查
  234. if (x509_certs_verify_tlcp(conn->server_certs, conn->server_certs_len, X509_cert_chain_server,
  235. conn->ca_certs, conn->ca_certs_len, depth, &verify_result) != 1) {
  236. error_print();
  237. tls_send_alert(conn, TLS_alert_bad_certificate);
  238. goto end;
  239. }
  240. }
  241. // recv ServerKeyExchange
  242. tls_trace("recv ServerKeyExchange\n");
  243. if (tls_record_recv(record, &recordlen, conn->sock) != 1
  244. || tls_record_protocol(record) != TLS_protocol_tlcp) {
  245. error_print();
  246. tls_send_alert(conn, TLS_alert_unexpected_message);
  247. goto end;
  248. }
  249. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  250. if (tlcp_record_get_handshake_server_key_exchange_pke(record, &sig, &siglen) != 1) {
  251. error_print();
  252. tls_send_alert(conn, TLS_alert_unexpected_message);
  253. goto end;
  254. }
  255. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  256. // verify ServerKeyExchange
  257. if (x509_certs_get_cert_by_index(conn->server_certs, conn->server_certs_len, 0, &cp, &len) != 1
  258. || x509_cert_get_subject_public_key(cp, len, &server_sign_key) != 1
  259. || x509_certs_get_cert_by_index(conn->server_certs, conn->server_certs_len, 1, &server_enc_cert, &server_enc_cert_len) != 1
  260. || x509_cert_get_subject_public_key(server_enc_cert, server_enc_cert_len, &server_enc_key) != 1) {
  261. error_print();
  262. tls_send_alert(conn, TLS_alert_bad_certificate);
  263. goto end;
  264. }
  265. p = server_enc_cert_lenbuf; len = 0;
  266. tls_uint24_to_bytes((uint24_t)server_enc_cert_len, &p, &len);
  267. if (sm2_verify_init(&verify_ctx, &server_sign_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH) != 1
  268. || sm2_verify_update(&verify_ctx, client_random, 32) != 1
  269. || sm2_verify_update(&verify_ctx, server_random, 32) != 1
  270. || sm2_verify_update(&verify_ctx, server_enc_cert_lenbuf, 3) != 1
  271. || sm2_verify_update(&verify_ctx, server_enc_cert, server_enc_cert_len) != 1) {
  272. error_print();
  273. tls_send_alert(conn, TLS_alert_internal_error);
  274. goto end;
  275. }
  276. if (sm2_verify_finish(&verify_ctx, sig, siglen) != 1) {
  277. error_print();
  278. tls_send_alert(conn, TLS_alert_decrypt_error);
  279. goto end;
  280. }
  281. // recv CertificateRequest or ServerHelloDone
  282. if (tls_record_recv(record, &recordlen, conn->sock) != 1
  283. || tls_record_protocol(record) != TLS_protocol_tlcp
  284. || tls_record_get_handshake(record, &handshake_type, &cp, &len) != 1) {
  285. error_print();
  286. tls_send_alert(conn, TLS_alert_unexpected_message);
  287. goto end;
  288. }
  289. if (handshake_type == TLS_handshake_certificate_request) {
  290. const uint8_t *cert_types;
  291. size_t cert_types_len;
  292. const uint8_t *ca_names;
  293. size_t ca_names_len;
  294. // recv CertificateRequest
  295. tls_trace("recv CertificateRequest\n");
  296. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  297. if (tls_record_get_handshake_certificate_request(record,
  298. &cert_types, &cert_types_len, &ca_names, &ca_names_len) != 1) {
  299. error_print();
  300. tls_send_alert(conn, TLS_alert_unexpected_message);
  301. goto end;
  302. }
  303. if(!conn->client_certs_len) {
  304. error_print();
  305. tls_send_alert(conn, TLS_alert_internal_error);
  306. goto end;
  307. }
  308. if (tls_cert_types_accepted(cert_types, cert_types_len, conn->client_certs, conn->client_certs_len) != 1
  309. || tls_authorities_issued_certificate(ca_names, ca_names_len, conn->client_certs, conn->client_certs_len) != 1) {
  310. error_print();
  311. tls_send_alert(conn, TLS_alert_unsupported_certificate);
  312. goto end;
  313. }
  314. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  315. // recv ServerHelloDone
  316. if (tls_record_recv(record, &recordlen, conn->sock) != 1
  317. || tls_record_protocol(record) != TLS_protocol_tlcp) {
  318. error_print();
  319. tls_send_alert(conn, TLS_alert_unexpected_message);
  320. goto end;
  321. }
  322. } else {
  323. // 这个得处理一下
  324. conn->client_certs_len = 0;
  325. gmssl_secure_clear(&conn->sign_key, sizeof(SM2_KEY));
  326. //client_sign_key = NULL;
  327. }
  328. tls_trace("recv ServerHelloDone\n");
  329. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  330. if (tls_record_get_handshake_server_hello_done(record) != 1) {
  331. error_print();
  332. tls_send_alert(conn, TLS_alert_unexpected_message);
  333. goto end;
  334. }
  335. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  336. // send ClientCertificate
  337. if (conn->client_certs_len) {
  338. tls_trace("send ClientCertificate\n");
  339. if (tls_record_set_handshake_certificate(record, &recordlen, conn->client_certs, conn->client_certs_len) != 1) {
  340. error_print();
  341. tls_send_alert(conn, TLS_alert_internal_error);
  342. goto end;
  343. }
  344. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  345. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  346. error_print();
  347. goto end;
  348. }
  349. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  350. }
  351. // generate MASTER_SECRET
  352. tls_trace("generate secrets\n");
  353. if (tls_pre_master_secret_generate(pre_master_secret, TLS_protocol_tlcp) != 1
  354. || tls_prf(pre_master_secret, 48, "master secret",
  355. client_random, 32, server_random, 32,
  356. 48, conn->master_secret) != 1
  357. || tls_prf(conn->master_secret, 48, "key expansion",
  358. server_random, 32, client_random, 32,
  359. 96, conn->key_block) != 1) {
  360. error_print();
  361. tls_send_alert(conn, TLS_alert_internal_error);
  362. goto end;
  363. }
  364. sm3_hmac_init(&conn->client_write_mac_ctx, conn->key_block, 32);
  365. sm3_hmac_init(&conn->server_write_mac_ctx, conn->key_block + 32, 32);
  366. sm4_set_encrypt_key(&conn->client_write_enc_key, conn->key_block + 64);
  367. sm4_set_decrypt_key(&conn->server_write_enc_key, conn->key_block + 80);
  368. /*
  369. tls_secrets_print(stderr,
  370. pre_master_secret, 48,
  371. client_random, server_random,
  372. conn->master_secret,
  373. conn->key_block, 96,
  374. 0, 4);
  375. */
  376. // send ClientKeyExchange
  377. tls_trace("send ClientKeyExchange\n");
  378. if (sm2_encrypt(&server_enc_key, pre_master_secret, 48,
  379. enced_pre_master_secret, &enced_pre_master_secret_len) != 1
  380. || tls_record_set_handshake_client_key_exchange_pke(record, &recordlen,
  381. enced_pre_master_secret, enced_pre_master_secret_len) != 1) {
  382. error_print();
  383. tls_send_alert(conn, TLS_alert_internal_error);
  384. goto end;
  385. }
  386. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  387. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  388. error_print();
  389. goto end;
  390. }
  391. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  392. // send CertificateVerify
  393. if (conn->client_certs_len) {
  394. tls_trace("send CertificateVerify\n");
  395. SM3_CTX cert_verify_sm3_ctx = sm3_ctx;
  396. uint8_t cert_verify_hash[SM3_DIGEST_SIZE];
  397. uint8_t sigbuf[SM2_MAX_SIGNATURE_SIZE];
  398. sm3_finish(&cert_verify_sm3_ctx, cert_verify_hash);
  399. if (sm2_sign_init(&sign_ctx, &conn->sign_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH) != 1
  400. || sm2_sign_update(&sign_ctx, cert_verify_hash, SM3_DIGEST_SIZE) != 1
  401. || sm2_sign_finish(&sign_ctx, sigbuf, &siglen) != 1) {
  402. error_print();
  403. tls_send_alert(conn, TLS_alert_internal_error);
  404. goto end;
  405. }
  406. if (tls_record_set_handshake_certificate_verify(record, &recordlen, sigbuf, siglen) != 1) {
  407. error_print();
  408. tls_send_alert(conn, TLS_alert_internal_error);
  409. goto end;
  410. }
  411. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  412. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  413. error_print();
  414. goto end;
  415. }
  416. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  417. }
  418. // send [ChangeCipherSpec]
  419. tls_trace("send [ChangeCipherSpec]\n");
  420. if (tls_record_set_change_cipher_spec(record, &recordlen) !=1) {
  421. error_print();
  422. tls_send_alert(conn, TLS_alert_internal_error);
  423. goto end;
  424. }
  425. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  426. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  427. error_print();
  428. goto end;
  429. }
  430. // send Client Finished
  431. tls_trace("send Finished\n");
  432. memcpy(&tmp_sm3_ctx, &sm3_ctx, sizeof(sm3_ctx));
  433. sm3_finish(&tmp_sm3_ctx, sm3_hash);
  434. if (tls_prf(conn->master_secret, 48, "client finished",
  435. sm3_hash, 32, NULL, 0, sizeof(local_verify_data), local_verify_data) != 1
  436. || tls_record_set_handshake_finished(finished_record, &finished_record_len,
  437. local_verify_data, sizeof(local_verify_data)) != 1) {
  438. error_print();
  439. tls_send_alert(conn, TLS_alert_internal_error);
  440. goto end;
  441. }
  442. tlcp_record_trace(stderr, finished_record, finished_record_len, 0, 0);
  443. sm3_update(&sm3_ctx, finished_record + 5, finished_record_len - 5);
  444. // encrypt Client Finished
  445. tls_trace("encrypt Finished\n");
  446. if (tls_record_encrypt(&conn->client_write_mac_ctx, &conn->client_write_enc_key,
  447. conn->client_seq_num, finished_record, finished_record_len, record, &recordlen) != 1) {
  448. error_print();
  449. tls_send_alert(conn, TLS_alert_internal_error);
  450. goto end;
  451. }
  452. tlcp_record_trace(stderr, record, recordlen, (1<<24), 0); // 强制打印密文原数据
  453. tls_seq_num_incr(conn->client_seq_num);
  454. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  455. error_print();
  456. goto end;
  457. }
  458. // [ChangeCipherSpec]
  459. tls_trace("recv [ChangeCipherSpec]\n");
  460. if (tls_record_recv(record, &recordlen, conn->sock) != 1
  461. || tls_record_protocol(record) != TLS_protocol_tlcp) {
  462. error_print();
  463. tls_send_alert(conn, TLS_alert_unexpected_message);
  464. goto end;
  465. }
  466. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  467. if (tls_record_get_change_cipher_spec(record) != 1) {
  468. error_print();
  469. tls_send_alert(conn, TLS_alert_unexpected_message);
  470. goto end;
  471. }
  472. // Finished
  473. tls_trace("recv Finished\n");
  474. if (tls_record_recv(record, &recordlen, conn->sock) != 1
  475. || tls_record_protocol(record) != TLS_protocol_tlcp) {
  476. error_print();
  477. tls_send_alert(conn, TLS_alert_unexpected_message);
  478. goto end;
  479. }
  480. if (recordlen > sizeof(finished_record)) {
  481. error_print(); // 解密可能导致 finished_record 溢出
  482. tls_send_alert(conn, TLS_alert_bad_record_mac);
  483. goto end;
  484. }
  485. tlcp_record_trace(stderr, record, recordlen, (1<<24), 0); // 强制打印密文原数据
  486. tls_trace("decrypt Finished\n");
  487. if (tls_record_decrypt(&conn->server_write_mac_ctx, &conn->server_write_enc_key,
  488. conn->server_seq_num, record, recordlen, finished_record, &finished_record_len) != 1) {
  489. error_print();
  490. tls_send_alert(conn, TLS_alert_bad_record_mac);
  491. goto end;
  492. }
  493. tlcp_record_trace(stderr, finished_record, finished_record_len, 0, 0);
  494. tls_seq_num_incr(conn->server_seq_num);
  495. if (tls_record_get_handshake_finished(finished_record, &verify_data, &verify_data_len) != 1) {
  496. error_print();
  497. tls_send_alert(conn, TLS_alert_unexpected_message);
  498. goto end;
  499. }
  500. if (verify_data_len != sizeof(local_verify_data)) {
  501. error_print();
  502. tls_send_alert(conn, TLS_alert_unexpected_message);
  503. goto end;
  504. }
  505. sm3_finish(&sm3_ctx, sm3_hash);
  506. if (tls_prf(conn->master_secret, 48, "server finished",
  507. sm3_hash, 32, NULL, 0, sizeof(local_verify_data), local_verify_data) != 1) {
  508. error_print();
  509. tls_send_alert(conn, TLS_alert_internal_error);
  510. goto end;
  511. }
  512. if (memcmp(verify_data, local_verify_data, sizeof(local_verify_data)) != 0) {
  513. error_print();
  514. tls_send_alert(conn, TLS_alert_decrypt_error);
  515. goto end;
  516. }
  517. fprintf(stderr, "Connection established!\n");
  518. conn->protocol = TLS_protocol_tlcp;
  519. conn->cipher_suite = cipher_suite;
  520. ret = 1;
  521. end:
  522. gmssl_secure_clear(&sign_ctx, sizeof(sign_ctx));
  523. gmssl_secure_clear(pre_master_secret, sizeof(pre_master_secret));
  524. return ret;
  525. }
  526. int tlcp_do_accept(TLS_CONNECT *conn)
  527. {
  528. int ret = -1;
  529. int client_verify = 0;
  530. uint8_t *record = conn->record;
  531. uint8_t finished_record[TLS_FINISHED_RECORD_BUF_SIZE]; // 解密可能导致前面的record被覆盖
  532. size_t recordlen, finished_record_len;
  533. const int server_ciphers[] = { TLS_cipher_ecc_sm4_cbc_sm3 }; // 未来应该支持GCM/CBC两个套件
  534. // ClientHello, ServerHello
  535. uint8_t client_random[32];
  536. uint8_t server_random[32];
  537. int protocol;
  538. const uint8_t *random;
  539. const uint8_t *session_id; // TLCP服务器忽略客户端SessionID,也不主动设置SessionID
  540. size_t session_id_len;
  541. const uint8_t *client_ciphers;
  542. size_t client_ciphers_len;
  543. const uint8_t *exts;
  544. size_t exts_len;
  545. // ServerKeyExchange
  546. const uint8_t *server_enc_cert;
  547. size_t server_enc_cert_len;
  548. uint8_t server_enc_cert_lenbuf[3];
  549. SM2_SIGN_CTX sign_ctx;
  550. uint8_t sigbuf[SM2_MAX_SIGNATURE_SIZE];
  551. size_t siglen;
  552. // ClientCertificate, CertificateVerify
  553. SM2_KEY client_sign_key;
  554. SM2_SIGN_CTX verify_ctx;
  555. const uint8_t *sig;
  556. const int verify_depth = 5;
  557. int verify_result;
  558. // ClientKeyExchange
  559. const uint8_t *enced_pms;
  560. size_t enced_pms_len;
  561. uint8_t pre_master_secret[SM2_MAX_PLAINTEXT_SIZE]; // sm2_decrypt 保证输出不会溢出
  562. size_t pre_master_secret_len;
  563. // Finished
  564. SM3_CTX sm3_ctx;
  565. SM3_CTX tmp_sm3_ctx;
  566. uint8_t sm3_hash[32];
  567. uint8_t local_verify_data[12];
  568. const uint8_t *verify_data;
  569. size_t verify_data_len;
  570. uint8_t *p;
  571. const uint8_t *cp;
  572. size_t len;
  573. // 服务器端如果设置了CA
  574. if (conn->ca_certs_len)
  575. client_verify = 1;
  576. // 初始化Finished和客户端验证环境
  577. sm3_init(&sm3_ctx);
  578. // recv ClientHello
  579. tls_trace("recv ClientHello\n");
  580. if (tls_record_recv(record, &recordlen, conn->sock) != 1) {
  581. error_print();
  582. tls_send_alert(conn, TLS_alert_unexpected_message);
  583. goto end;
  584. }
  585. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  586. if (tls_record_protocol(record) != TLS_protocol_tlcp) {
  587. error_print();
  588. tls_send_alert(conn, TLS_alert_protocol_version);
  589. goto end;
  590. }
  591. if (tls_record_get_handshake_client_hello(record,
  592. &protocol, &random, &session_id, &session_id_len,
  593. &client_ciphers, &client_ciphers_len,
  594. &exts, &exts_len) != 1) {
  595. error_print();
  596. tls_send_alert(conn, TLS_alert_unexpected_message);
  597. goto end;
  598. }
  599. if (protocol != TLS_protocol_tlcp) {
  600. error_print();
  601. tls_send_alert(conn, TLS_alert_protocol_version);
  602. goto end;
  603. }
  604. memcpy(client_random, random, 32);
  605. if (tls_cipher_suites_select(client_ciphers, client_ciphers_len,
  606. server_ciphers, sizeof(server_ciphers)/sizeof(server_ciphers[0]),
  607. &conn->cipher_suite) != 1) {
  608. error_print();
  609. tls_send_alert(conn, TLS_alert_insufficient_security);
  610. goto end;
  611. }
  612. if (exts) {
  613. // 忽略客户端扩展错误可以兼容错误的TLCP客户端实现
  614. error_print();
  615. tls_send_alert(conn, TLS_alert_unexpected_message);
  616. goto end;
  617. }
  618. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  619. // send ServerHello
  620. tls_trace("send ServerHello\n");
  621. tls_random_generate(server_random);
  622. if (tls_record_set_handshake_server_hello(record, &recordlen,
  623. TLS_protocol_tlcp, server_random, NULL, 0,
  624. conn->cipher_suite, NULL, 0) != 1) {
  625. error_print();
  626. tls_send_alert(conn, TLS_alert_internal_error);
  627. goto end;
  628. }
  629. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  630. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  631. error_print();
  632. goto end;
  633. }
  634. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  635. // send ServerCertificate
  636. tls_trace("send ServerCertificate\n");
  637. if (tls_record_set_handshake_certificate(record, &recordlen,
  638. conn->server_certs, conn->server_certs_len) != 1) {
  639. error_print();
  640. tls_send_alert(conn, TLS_alert_internal_error);
  641. goto end;
  642. }
  643. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  644. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  645. error_print();
  646. goto end;
  647. }
  648. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  649. // send ServerKeyExchange
  650. tls_trace("send ServerKeyExchange\n");
  651. if (x509_certs_get_cert_by_index(conn->server_certs, conn->server_certs_len, 1,
  652. &server_enc_cert, &server_enc_cert_len) != 1) {
  653. error_print();
  654. goto end;
  655. }
  656. p = server_enc_cert_lenbuf; len = 0;
  657. tls_uint24_to_bytes((uint24_t)server_enc_cert_len, &p, &len);
  658. if (sm2_sign_init(&sign_ctx, &conn->sign_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH) != 1
  659. || sm2_sign_update(&sign_ctx, client_random, 32) != 1
  660. || sm2_sign_update(&sign_ctx, server_random, 32) != 1
  661. || sm2_sign_update(&sign_ctx, server_enc_cert_lenbuf, 3) != 1
  662. || sm2_sign_update(&sign_ctx, server_enc_cert, server_enc_cert_len) != 1
  663. || sm2_sign_finish(&sign_ctx, sigbuf, &siglen) != 1) {
  664. error_print();
  665. tls_send_alert(conn, TLS_alert_internal_error);
  666. goto end;
  667. }
  668. if (tlcp_record_set_handshake_server_key_exchange_pke(record, &recordlen, sigbuf, siglen) != 1) {
  669. error_print();
  670. tls_send_alert(conn, TLS_alert_internal_error);
  671. goto end;
  672. }
  673. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  674. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  675. error_print();
  676. goto end;
  677. }
  678. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  679. // send CertificateRequest
  680. if (client_verify) {
  681. const uint8_t cert_types[] = { TLS_cert_type_ecdsa_sign };
  682. uint8_t ca_names[TLS_MAX_CA_NAMES_SIZE] = {0}; // TODO: 根据客户端验证CA证书列计算缓冲大小,或直接输出到record缓冲
  683. size_t ca_names_len = 0;
  684. tls_trace("send CertificateRequest\n");
  685. if (tls_authorities_from_certs(ca_names, &ca_names_len, sizeof(ca_names),
  686. conn->ca_certs, conn->ca_certs_len) != 1) {
  687. error_print();
  688. goto end;
  689. }
  690. if (tls_record_set_handshake_certificate_request(record, &recordlen,
  691. cert_types, sizeof(cert_types),
  692. ca_names, ca_names_len) != 1) {
  693. error_print();
  694. goto end;
  695. }
  696. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  697. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  698. error_print();
  699. goto end;
  700. }
  701. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  702. }
  703. // send ServerHelloDone
  704. tls_trace("send ServerHelloDone\n");
  705. tls_record_set_handshake_server_hello_done(record, &recordlen);
  706. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  707. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  708. error_print();
  709. goto end;
  710. }
  711. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  712. // recv ClientCertificate
  713. if (conn->ca_certs_len) {
  714. tls_trace("recv ClientCertificate\n");
  715. if (tls_record_recv(record, &recordlen, conn->sock) != 1
  716. || tls_record_protocol(record) != TLS_protocol_tlcp) {
  717. error_print();
  718. tls_send_alert(conn, TLS_alert_unexpected_message);
  719. goto end;
  720. }
  721. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  722. if (tls_record_get_handshake_certificate(record, conn->client_certs, &conn->client_certs_len) != 1) {
  723. error_print();
  724. tls_send_alert(conn, TLS_alert_unexpected_message);
  725. goto end;
  726. }
  727. if (x509_certs_verify(conn->client_certs, conn->client_certs_len, X509_cert_chain_client,
  728. conn->ca_certs, conn->ca_certs_len, verify_depth, &verify_result) != 1) {
  729. error_print();
  730. tls_send_alert(conn, TLS_alert_bad_certificate);
  731. goto end;
  732. }
  733. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  734. }
  735. // ClientKeyExchange
  736. tls_trace("recv ClientKeyExchange\n");
  737. if (tls_record_recv(record, &recordlen, conn->sock) != 1
  738. || tls_record_protocol(record) != TLS_protocol_tlcp) {
  739. error_print();
  740. tls_send_alert(conn, TLS_alert_unexpected_message);
  741. goto end;
  742. }
  743. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  744. if (tls_record_get_handshake_client_key_exchange_pke(record, &enced_pms, &enced_pms_len) != 1) {
  745. error_print();
  746. tls_send_alert(conn, TLS_alert_unexpected_message);
  747. goto end;
  748. }
  749. if (sm2_decrypt(&conn->kenc_key, enced_pms, enced_pms_len,
  750. pre_master_secret, &pre_master_secret_len) != 1) {
  751. error_print();
  752. tls_send_alert(conn, TLS_alert_decrypt_error);
  753. goto end;
  754. }
  755. if (pre_master_secret_len != 48) {
  756. error_print();
  757. tls_send_alert(conn, TLS_alert_decrypt_error);
  758. goto end;
  759. }
  760. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  761. // recv CertificateVerify
  762. if (client_verify) {
  763. tls_trace("recv CertificateVerify\n");
  764. SM3_CTX cert_verify_sm3_ctx = sm3_ctx;
  765. uint8_t cert_verify_hash[SM3_DIGEST_SIZE];
  766. if (tls_record_recv(record, &recordlen, conn->sock) != 1
  767. || tls_record_protocol(record) != TLS_protocol_tlcp) {
  768. tls_send_alert(conn, TLS_alert_unexpected_message);
  769. error_print();
  770. goto end;
  771. }
  772. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  773. if (tls_record_get_handshake_certificate_verify(record, &sig, &siglen) != 1) {
  774. tls_send_alert(conn, TLS_alert_unexpected_message);
  775. error_print();
  776. goto end;
  777. }
  778. if (x509_certs_get_cert_by_index(conn->client_certs, conn->client_certs_len, 0, &cp, &len) != 1
  779. || x509_cert_get_subject_public_key(cp, len, &client_sign_key) != 1) {
  780. error_print();
  781. tls_send_alert(conn, TLS_alert_bad_certificate);
  782. goto end;
  783. }
  784. sm3_finish(&cert_verify_sm3_ctx, cert_verify_hash);
  785. if (sm2_verify_init(&verify_ctx, &client_sign_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH) != 1
  786. || sm2_verify_update(&verify_ctx, cert_verify_hash, SM3_DIGEST_SIZE) != 1
  787. || sm2_verify_finish(&verify_ctx, sig, siglen) != 1) {
  788. error_print();
  789. tls_send_alert(conn, TLS_alert_decrypt_error);
  790. goto end;
  791. }
  792. sm3_update(&sm3_ctx, record + 5, recordlen - 5);
  793. }
  794. // generate secrets
  795. tls_trace("generate secrets\n");
  796. if (tls_prf(pre_master_secret, 48, "master secret",
  797. client_random, 32, server_random, 32,
  798. 48, conn->master_secret) != 1
  799. || tls_prf(conn->master_secret, 48, "key expansion",
  800. server_random, 32, client_random, 32,
  801. 96, conn->key_block) != 1) {
  802. error_print();
  803. tls_send_alert(conn, TLS_alert_internal_error);
  804. goto end;
  805. }
  806. sm3_hmac_init(&conn->client_write_mac_ctx, conn->key_block, 32);
  807. sm3_hmac_init(&conn->server_write_mac_ctx, conn->key_block + 32, 32);
  808. sm4_set_decrypt_key(&conn->client_write_enc_key, conn->key_block + 64);
  809. sm4_set_encrypt_key(&conn->server_write_enc_key, conn->key_block + 80);
  810. /*
  811. tls_secrets_print(stderr,
  812. pre_master_secret, 48,
  813. client_random, server_random,
  814. conn->master_secret,
  815. conn->key_block, 96,
  816. 0, 4);
  817. */
  818. // recv [ChangeCipherSpec]
  819. tls_trace("recv [ChangeCipherSpec]\n");
  820. if (tls_record_recv(record, &recordlen, conn->sock) != 1
  821. || tls_record_protocol(record) != TLS_protocol_tlcp) {
  822. error_print();
  823. tls_send_alert(conn, TLS_alert_unexpected_message);
  824. goto end;
  825. }
  826. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  827. if (tls_record_get_change_cipher_spec(record) != 1) {
  828. error_print();
  829. tls_send_alert(conn, TLS_alert_unexpected_message);
  830. goto end;
  831. }
  832. // recv ClientFinished
  833. tls_trace("recv Finished\n");
  834. if (tls_record_recv(record, &recordlen, conn->sock) != 1
  835. || tls_record_protocol(record) != TLS_protocol_tlcp) {
  836. error_print();
  837. tls_send_alert(conn, TLS_alert_unexpected_message);
  838. goto end;
  839. }
  840. if (recordlen > sizeof(finished_record)) {
  841. error_print();
  842. tls_send_alert(conn, TLS_alert_unexpected_message);
  843. goto end;
  844. }
  845. tlcp_record_trace(stderr, record, recordlen, (1<<24), 0); // 强制打印密文原数据
  846. // decrypt ClientFinished
  847. tls_trace("decrypt Finished\n");
  848. if (tls_record_decrypt(&conn->client_write_mac_ctx, &conn->client_write_enc_key,
  849. conn->client_seq_num, record, recordlen, finished_record, &finished_record_len) != 1) {
  850. error_print();
  851. tls_send_alert(conn, TLS_alert_bad_record_mac);
  852. goto end;
  853. }
  854. tlcp_record_trace(stderr, finished_record, finished_record_len, 0, 0);
  855. tls_seq_num_incr(conn->client_seq_num);
  856. if (tls_record_get_handshake_finished(finished_record, &verify_data, &verify_data_len) != 1) {
  857. error_print();
  858. tls_send_alert(conn, TLS_alert_bad_record_mac);
  859. goto end;
  860. }
  861. if (verify_data_len != sizeof(local_verify_data)) {
  862. error_print();
  863. tls_send_alert(conn, TLS_alert_bad_record_mac);
  864. goto end;
  865. }
  866. // verify ClientFinished
  867. memcpy(&tmp_sm3_ctx, &sm3_ctx, sizeof(SM3_CTX));
  868. sm3_update(&sm3_ctx, finished_record + 5, finished_record_len - 5);
  869. sm3_finish(&tmp_sm3_ctx, sm3_hash);
  870. if (tls_prf(conn->master_secret, 48, "client finished", sm3_hash, 32, NULL, 0,
  871. sizeof(local_verify_data), local_verify_data) != 1) {
  872. error_print();
  873. tls_send_alert(conn, TLS_alert_internal_error);
  874. goto end;
  875. }
  876. if (memcmp(verify_data, local_verify_data, sizeof(local_verify_data)) != 0) {
  877. error_puts("client_finished.verify_data verification failure");
  878. tls_send_alert(conn, TLS_alert_decrypt_error);
  879. goto end;
  880. }
  881. // send [ChangeCipherSpec]
  882. tls_trace("send [ChangeCipherSpec]\n");
  883. if (tls_record_set_change_cipher_spec(record, &recordlen) != 1) {
  884. error_print();
  885. tls_send_alert(conn, TLS_alert_internal_error);
  886. goto end;
  887. }
  888. tlcp_record_trace(stderr, record, recordlen, 0, 0);
  889. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  890. error_print();
  891. goto end;
  892. }
  893. // send ServerFinished
  894. tls_trace("send Finished\n");
  895. sm3_finish(&sm3_ctx, sm3_hash);
  896. if (tls_prf(conn->master_secret, 48, "server finished", sm3_hash, 32, NULL, 0,
  897. sizeof(local_verify_data), local_verify_data) != 1
  898. || tls_record_set_handshake_finished(finished_record, &finished_record_len,
  899. local_verify_data, sizeof(local_verify_data)) != 1) {
  900. error_print();
  901. tls_send_alert(conn, TLS_alert_internal_error);
  902. goto end;
  903. }
  904. tlcp_record_trace(stderr, finished_record, finished_record_len, 0, 0);
  905. if (tls_record_encrypt(&conn->server_write_mac_ctx, &conn->server_write_enc_key,
  906. conn->server_seq_num, finished_record, finished_record_len, record, &recordlen) != 1) {
  907. error_print();
  908. tls_send_alert(conn, TLS_alert_internal_error);
  909. goto end;
  910. }
  911. tls_trace("encrypt Finished\n");
  912. tlcp_record_trace(stderr, record, recordlen, (1<<24), 0); // 强制打印密文原数据
  913. tls_seq_num_incr(conn->server_seq_num);
  914. if (tls_record_send(record, recordlen, conn->sock) != 1) {
  915. error_print();
  916. goto end;
  917. }
  918. conn->protocol = TLS_protocol_tlcp;
  919. fprintf(stderr, "Connection Established!\n\n");
  920. ret = 1;
  921. end:
  922. gmssl_secure_clear(&sign_ctx, sizeof(sign_ctx));
  923. gmssl_secure_clear(pre_master_secret, sizeof(pre_master_secret));
  924. return ret;
  925. }