cmstest.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002
  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. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12. #include <gmssl/oid.h>
  13. #include <gmssl/x509.h>
  14. #include <gmssl/rand.h>
  15. #include <gmssl/error.h>
  16. #include <gmssl/sm4.h>
  17. #include <gmssl/cms.h>
  18. static int test_cms_content_type(void)
  19. {
  20. int tests[] = {
  21. OID_cms_data,
  22. OID_cms_signed_data,
  23. OID_cms_enveloped_data,
  24. OID_cms_signed_and_enveloped_data,
  25. OID_cms_encrypted_data,
  26. OID_cms_key_agreement_info,
  27. };
  28. uint8_t buf[256];
  29. uint8_t *p = buf;
  30. const uint8_t *cp = buf;
  31. size_t len = 0;
  32. int i;
  33. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  34. if (cms_content_type_to_der(tests[i], &p, &len) != 1) {
  35. error_print();
  36. return -1;
  37. }
  38. format_bytes(stderr, 0, 4, "", buf, len);
  39. }
  40. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  41. int oid;
  42. if (cms_content_type_from_der(&oid, &cp, &len) != 1
  43. || asn1_check(oid == tests[i]) != 1) {
  44. error_print();
  45. return -1;
  46. }
  47. format_print(stderr, 0, 4, "%s\n", cms_content_type_name(oid));
  48. }
  49. (void)asn1_length_is_zero(len);
  50. printf("%s() ok\n", __FUNCTION__);
  51. return 1;
  52. }
  53. static int test_cms_content_info(void)
  54. {
  55. uint8_t buf[256];
  56. uint8_t *p = buf;
  57. const uint8_t *cp = buf;
  58. size_t len = 0;
  59. uint8_t data[20] = { 0x01,0x02 };
  60. int oid;
  61. const uint8_t *d;
  62. size_t dlen;
  63. if (cms_content_info_to_der(OID_cms_data, data, sizeof(data), &p, &len) != 1
  64. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  65. || asn1_length_is_zero(len) != 1) {
  66. error_print();
  67. return -1;
  68. }
  69. cms_content_info_print(stderr, 0, 0, "ContentInfo", d, dlen);
  70. p = buf;
  71. cp = buf;
  72. len = 0;
  73. // 当类型为OID_cms_data, 数据是OCTET STRING,需要再解析一次
  74. if (cms_content_info_to_der(OID_cms_data, data, sizeof(data), &p, &len) != 1
  75. || cms_content_info_from_der(&oid, &d, &dlen, &cp, &len) != 1
  76. || asn1_check(oid == OID_cms_data) != 1
  77. // || asn1_check(dlen == sizeof(data)) != 1
  78. // || asn1_check(memcmp(data, d, dlen) == 0) != 1
  79. || asn1_length_is_zero(len) != 1) {
  80. error_print();
  81. return -1;
  82. }
  83. printf("%s() ok\n", __FUNCTION__);
  84. return 1;
  85. }
  86. static int test_cms_enced_content_info(void)
  87. {
  88. uint8_t buf[256];
  89. uint8_t *p = buf;
  90. const uint8_t *cp = buf;
  91. size_t len = 0;
  92. uint8_t iv[16] = {0};
  93. uint8_t enced[32] = { 0x01,0x02 };
  94. const uint8_t *d;
  95. size_t dlen;
  96. int oid;
  97. int cipher;
  98. const uint8_t *piv;
  99. size_t ivlen;
  100. const uint8_t *shared_info1;
  101. size_t shared_info1_len;
  102. const uint8_t *shared_info2;
  103. size_t shared_info2_len;
  104. if (cms_enced_content_info_to_der(OID_cms_data,
  105. OID_sm4_cbc, iv, sizeof(iv), enced, sizeof(enced),
  106. NULL, 0, NULL, 0, &p, &len) != 1
  107. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  108. || asn1_length_is_zero(len) != 1) {
  109. error_print();
  110. return -1;
  111. }
  112. cms_enced_content_info_print(stderr, 0, 0, "EncryptedContentInfo", d, dlen);
  113. p = buf;
  114. cp = buf;
  115. len = 0;
  116. if (cms_enced_content_info_to_der(OID_cms_data,
  117. OID_sm4_cbc, iv, sizeof(iv), enced, sizeof(enced),
  118. NULL, 0, NULL, 0, &p, &len) != 1
  119. || cms_enced_content_info_from_der(&oid,
  120. &cipher, &piv, &ivlen, &d, &dlen,
  121. &shared_info1, &shared_info1_len,
  122. &shared_info2, &shared_info2_len, &cp, &len) != 1
  123. || asn1_check(oid == OID_cms_data) != 1
  124. || asn1_check(cipher == OID_sm4_cbc) != 1
  125. || asn1_check(ivlen == sizeof(iv)) != 1
  126. || asn1_check(dlen == sizeof(enced)) != 1
  127. || asn1_check(shared_info1 == NULL) != 1
  128. || asn1_check(shared_info1_len == 0) != 1
  129. || asn1_check(shared_info2 == NULL) != 1
  130. || asn1_check(shared_info2_len == 0) != 1
  131. || asn1_length_is_zero(len) != 1) {
  132. error_print();
  133. return -1;
  134. }
  135. printf("%s() ok\n", __FUNCTION__);
  136. return 1;
  137. }
  138. static int test_cms_enced_content_info_encrypt(void)
  139. {
  140. uint8_t buf[256];
  141. uint8_t *p = buf;
  142. const uint8_t *cp = buf;
  143. size_t len = 0;
  144. uint8_t key[16] = {0};
  145. uint8_t iv[16] = {1};
  146. uint8_t data[20] = {2};
  147. const uint8_t *d;
  148. size_t dlen;
  149. int oid;
  150. int cipher;
  151. uint8_t data2[256];
  152. const uint8_t *shared_info1;
  153. size_t shared_info1_len;
  154. const uint8_t *shared_info2;
  155. size_t shared_info2_len;
  156. if (cms_enced_content_info_encrypt_to_der(
  157. OID_sm4_cbc,
  158. key, sizeof(key),
  159. iv, sizeof(iv),
  160. OID_cms_data, data, sizeof(data),
  161. NULL, 0,
  162. NULL, 0,
  163. &p, &len) != 1
  164. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  165. || asn1_length_is_zero(len) != 1) {
  166. error_print();
  167. return -1;
  168. }
  169. cms_enced_content_info_print(stderr, 0, 0, "EncryptedContentInfo", d, dlen);
  170. p = buf;
  171. cp = buf;
  172. len = 0;
  173. if (cms_enced_content_info_encrypt_to_der(
  174. OID_sm4_cbc,
  175. key, sizeof(key),
  176. iv, sizeof(iv),
  177. OID_cms_data, data, sizeof(data),
  178. NULL, 0,
  179. NULL, 0,
  180. &p, &len) != 1
  181. // 显然这个解密函数是有问题的,在from_der的时候不知道密文的长度,因此无法知道需要的输出缓冲长度
  182. || cms_enced_content_info_decrypt_from_der(
  183. &cipher,
  184. key, sizeof(key),
  185. &oid, data2, &dlen,
  186. &shared_info1, &shared_info1_len,
  187. &shared_info2, &shared_info2_len,
  188. &cp, &len) != 1
  189. || asn1_check(cipher == OID_sm4_cbc) != 1
  190. || asn1_check(oid = OID_cms_data) != 1
  191. || asn1_check(dlen == sizeof(data)) != 1
  192. || asn1_check(memcmp(data, data2, dlen) == 0) != 1
  193. || asn1_check(shared_info1 == NULL) != 1
  194. || asn1_check(shared_info2 == NULL) != 1
  195. || asn1_length_is_zero(len) != 1) {
  196. error_print();
  197. return -1;
  198. }
  199. printf("%s() ok\n", __FUNCTION__);
  200. return 1;
  201. }
  202. static int test_cms_issuer_and_serial_number(void)
  203. {
  204. uint8_t buf[256];
  205. uint8_t *p = buf;
  206. const uint8_t *cp = buf;
  207. size_t len = 0;
  208. uint8_t issuer[256];
  209. size_t issuer_len;
  210. uint8_t serial[20] = {1};
  211. const uint8_t *d;
  212. size_t dlen;
  213. const uint8_t *pissuer;
  214. const uint8_t *pserial;
  215. size_t serial_len;
  216. if (x509_name_set(issuer, &issuer_len, sizeof(issuer),
  217. "CN", "Beijing", "Haidian", "PKU", "CS", "CA") != 1
  218. || cms_issuer_and_serial_number_to_der(
  219. issuer, issuer_len, serial, sizeof(serial), &p, &len) != 1
  220. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  221. || asn1_length_is_zero(len) != 1) {
  222. error_print();
  223. return -1;
  224. }
  225. cms_issuer_and_serial_number_print(stderr, 0, 0, "IssuerAndSerialNumber", d, dlen);
  226. p = buf;
  227. cp = buf;
  228. len = 0;
  229. if (x509_name_set(issuer, &issuer_len, sizeof(issuer),
  230. "CN", "Beijing", "Haidian", "PKU", "CS", "CA") != 1
  231. || cms_issuer_and_serial_number_to_der(
  232. issuer, issuer_len, serial, sizeof(serial), &p, &len) != 1
  233. || cms_issuer_and_serial_number_from_der(
  234. &pissuer, &issuer_len, &pserial, &serial_len, &cp, &len) != 1
  235. || asn1_check(memcmp(pissuer, issuer, issuer_len) == 0) != 1
  236. || asn1_check(serial_len == sizeof(serial)) != 1
  237. || asn1_check(memcmp(serial, pserial, serial_len) == 0) != 1
  238. || asn1_length_is_zero(len) != 1) {
  239. error_print();
  240. return -1;
  241. }
  242. printf("%s() ok\n", __FUNCTION__);
  243. return 1;
  244. }
  245. static int test_cms_signer_info(void)
  246. {
  247. uint8_t buf[512];
  248. uint8_t *p = buf;
  249. const uint8_t *cp = buf;
  250. size_t len = 0;
  251. const uint8_t *d;
  252. size_t dlen;
  253. uint8_t issuer_buf[256];
  254. size_t issuer_len;
  255. uint8_t serial_buf[20];
  256. uint8_t sig_buf[256];
  257. size_t siglen = sizeof(sig_buf);
  258. int version;
  259. const uint8_t *issuer;
  260. const uint8_t *serial;
  261. size_t serial_len;
  262. int digest_alg;
  263. const uint8_t *auth_attrs;
  264. size_t auth_attrs_len;
  265. int sig_alg;
  266. const uint8_t *sig;
  267. const uint8_t *unauth_attrs;
  268. size_t unauth_attrs_len;
  269. if (x509_name_set(issuer_buf, &issuer_len, sizeof(issuer_buf),
  270. "CN", "Beijing", "Haidian", "PKU", "CS", "CA") != 1) {
  271. error_print();
  272. return -1;
  273. }
  274. if (cms_signer_info_to_der(
  275. CMS_version_v1,
  276. issuer_buf, issuer_len,
  277. serial_buf, sizeof(serial_buf),
  278. OID_sm3,
  279. NULL, 0,
  280. OID_sm2sign_with_sm3,
  281. sig_buf, siglen,
  282. NULL, 0,
  283. &p, &len) != 1
  284. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  285. || asn1_length_is_zero(len) != 1) {
  286. error_print();
  287. return -1;
  288. }
  289. cms_signer_info_print(stderr, 0, 0, "SignerInfo", d, dlen);
  290. cp = p = buf; len = 0;
  291. if (cms_signer_info_to_der(
  292. CMS_version_v1,
  293. issuer_buf, issuer_len,
  294. serial_buf, sizeof(serial_buf),
  295. OID_sm3,
  296. NULL, 0,
  297. OID_sm2sign_with_sm3,
  298. sig_buf, siglen,
  299. NULL, 0,
  300. &p, &len) != 1
  301. || cms_signer_info_from_der(
  302. &version,
  303. &issuer, &issuer_len,
  304. &serial, &serial_len,
  305. &digest_alg,
  306. &auth_attrs, &auth_attrs_len,
  307. &sig_alg,
  308. &sig, &siglen,
  309. &unauth_attrs, &unauth_attrs_len,
  310. &cp, &len) != 1
  311. || asn1_length_is_zero(len) != 1) {
  312. error_print();
  313. return -1;
  314. }
  315. printf("%s() ok\n", __FUNCTION__);
  316. return 1;
  317. }
  318. static int test_cms_signer_info_sign(void)
  319. {
  320. uint8_t buf[1024];
  321. uint8_t *p = buf;
  322. const uint8_t *cp = buf;
  323. size_t len = 0;
  324. const uint8_t *d;
  325. size_t dlen;
  326. SM2_KEY sm2_key;
  327. uint8_t serial_buf[20];
  328. uint8_t name[256];
  329. size_t namelen;
  330. time_t not_before, not_after;
  331. uint8_t certs[1024];
  332. size_t certslen = 0;
  333. uint8_t *pcerts = certs;
  334. SM3_CTX sm3_ctx;
  335. const uint8_t *cert;
  336. size_t certlen;
  337. const uint8_t *serial;
  338. const uint8_t *issuer;
  339. const uint8_t *auth_attrs;
  340. const uint8_t *unauth_attrs;
  341. size_t serial_len, issuer_len, auth_attrs_len, unauth_attrs_len;
  342. if (sm2_key_generate(&sm2_key) != 1
  343. || rand_bytes(serial_buf, sizeof(serial_buf)) != 1
  344. || x509_name_set(name, &namelen, sizeof(name), "CN", "Beijing", "Haidian", "PKU", "CS", "Alice") != 1
  345. || time(&not_before) == -1
  346. || x509_validity_add_days(&not_after, not_before, 365) != 1
  347. || x509_cert_sign_to_der(
  348. X509_version_v3, serial_buf, sizeof(serial_buf),
  349. OID_sm2sign_with_sm3,
  350. name, namelen,
  351. not_before, not_after,
  352. name, namelen,
  353. &sm2_key, NULL, 0, NULL, 0, NULL, 0,
  354. &sm2_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH,
  355. &pcerts, &certslen) != 1) {
  356. error_print();
  357. return -1;
  358. }
  359. sm3_init(&sm3_ctx);
  360. sm3_update(&sm3_ctx, (uint8_t *)"hello", 5);
  361. cp = p = buf; len = 0;
  362. if (cms_signer_info_sign_to_der(
  363. &sm3_ctx, &sm2_key,
  364. name, namelen, serial_buf, sizeof(serial_buf),
  365. NULL, 0, NULL, 0,
  366. &p, &len) != 1
  367. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  368. || asn1_length_is_zero(len) != 1) {
  369. error_print();
  370. return -1;
  371. }
  372. cms_signer_info_print(stderr, 0, 0, "SignerInfo", d, dlen);
  373. cp = p = buf; len = 0;
  374. if (cms_signer_info_sign_to_der(
  375. &sm3_ctx, &sm2_key,
  376. name, namelen, serial_buf, sizeof(serial_buf),
  377. NULL, 0, NULL, 0,
  378. &p, &len) != 1
  379. || cms_signer_info_verify_from_der(
  380. &sm3_ctx, certs, certslen,
  381. &cert, &certlen,
  382. &issuer, &issuer_len,
  383. &serial, &serial_len,
  384. &auth_attrs, &auth_attrs_len,
  385. &unauth_attrs, &unauth_attrs_len,
  386. &cp, &len) != 1
  387. || asn1_length_is_zero(len) != 1) {
  388. error_print();
  389. return -1;
  390. }
  391. printf("%s() ok\n", __FUNCTION__);
  392. return 1;
  393. }
  394. static int test_cms_signer_infos(void)
  395. {
  396. uint8_t buf[1280];
  397. uint8_t *p = buf;
  398. const uint8_t *cp = buf;
  399. size_t len = 0;
  400. const uint8_t *d;
  401. size_t dlen;
  402. uint8_t signer_infos[1024];
  403. size_t signer_infos_len = 0;
  404. SM3_CTX sm3_ctx;
  405. SM2_KEY sm2_key;
  406. uint8_t issuer_buf[256];
  407. size_t issuer_len;
  408. uint8_t serial_buf[20];
  409. sm2_key_generate(&sm2_key);
  410. sm3_init(&sm3_ctx);
  411. sm3_update(&sm3_ctx, (uint8_t *)"hello", 5);
  412. x509_name_set(issuer_buf, &issuer_len, sizeof(issuer_buf), "CN", "Beijing", "Haidian", "PKU", "CS", "CA");
  413. if (cms_signer_infos_add_signer_info(
  414. signer_infos, &signer_infos_len, sizeof(signer_infos),
  415. &sm3_ctx, &sm2_key,
  416. issuer_buf, issuer_len,
  417. serial_buf, sizeof(serial_buf),
  418. NULL, 0,
  419. NULL, 0) != 1
  420. || cms_signer_infos_add_signer_info(
  421. signer_infos, &signer_infos_len, sizeof(signer_infos),
  422. &sm3_ctx, &sm2_key,
  423. issuer_buf, issuer_len,
  424. serial_buf, sizeof(serial_buf),
  425. NULL, 0,
  426. NULL, 0) != 1
  427. || cms_signer_infos_add_signer_info(
  428. signer_infos, &signer_infos_len, sizeof(signer_infos),
  429. &sm3_ctx, &sm2_key,
  430. issuer_buf, issuer_len,
  431. serial_buf, sizeof(serial_buf),
  432. NULL, 0,
  433. NULL, 0) != 1
  434. || cms_signer_infos_to_der(signer_infos, signer_infos_len, &p, &len) != 1
  435. || cms_signer_infos_from_der(&d, &dlen, &cp, &len) != 1
  436. || asn1_length_is_zero(len) != 1){
  437. error_print();
  438. return -1;
  439. }
  440. cms_signer_infos_print(stderr, 0, 0, "SET OF SignerInfo", d, dlen);
  441. printf("%s() ok\n", __FUNCTION__);
  442. return 1;
  443. }
  444. static int test_cms_digest_algors(void)
  445. {
  446. uint8_t buf[512];
  447. uint8_t *p = buf;
  448. const uint8_t *cp = buf;
  449. size_t len = 0;
  450. const uint8_t *d;
  451. size_t dlen;
  452. int oids[] = {
  453. OID_sm3,
  454. OID_md5,
  455. OID_sha1,
  456. OID_sha256,
  457. OID_sha512,
  458. };
  459. int algs[16];
  460. size_t algs_cnt;
  461. if (cms_digest_algors_to_der(oids, sizeof(oids)/sizeof(oids[0]), &p, &len) != 1
  462. || asn1_set_from_der(&d, &dlen, &cp, &len) != 1
  463. || asn1_length_is_zero(len) != 1) {
  464. error_print();
  465. return -1;
  466. }
  467. cms_digest_algors_print(stderr, 0, 0, "digestAlgorithms", d, dlen);
  468. if (cms_digest_algors_to_der(oids, sizeof(oids)/sizeof(oids[0]), &p, &len) != 1
  469. || cms_digest_algors_from_der(algs, &algs_cnt, sizeof(algs)/sizeof(algs[0]), &cp, &len) != 1
  470. || asn1_check(algs_cnt == sizeof(oids)/sizeof(oids[0])) != 1
  471. || asn1_check(memcmp(algs, oids, sizeof(oids)) == 0) != 1
  472. || asn1_length_is_zero(len) != 1) {
  473. error_print();
  474. return -1;
  475. }
  476. printf("%s() ok\n", __FUNCTION__);
  477. return 1;
  478. }
  479. static int test_cms_signed_data(void)
  480. {
  481. SM2_KEY sm2_key;
  482. uint8_t cert[4096];
  483. size_t certlen = 0;
  484. CMS_CERTS_AND_KEY signers[1];
  485. uint8_t data[48] = {0};
  486. uint8_t buf[4096];
  487. uint8_t *p = buf;
  488. const uint8_t *cp = buf;
  489. size_t len = 0;
  490. const uint8_t *d;
  491. size_t dlen;
  492. sm2_key_generate(&sm2_key);
  493. {
  494. uint8_t serial[20];
  495. size_t serial_len = sizeof(serial);
  496. uint8_t name[256];
  497. size_t namelen = 0;
  498. time_t not_before, not_after;
  499. size_t subject_len = 0;
  500. uint8_t *p = cert;
  501. const uint8_t *cp = cert;
  502. rand_bytes(serial, sizeof(serial));
  503. x509_name_set(name, &namelen, sizeof(name), "CN", "Beijing", "Haidian", "PKU", "CS", "CA");
  504. time(&not_before);
  505. x509_validity_add_days(&not_after, not_before, 365);
  506. if (x509_cert_sign_to_der(
  507. X509_version_v3,
  508. serial, sizeof(serial),
  509. OID_sm2sign_with_sm3,
  510. name, namelen,
  511. not_before, not_after,
  512. name, namelen,
  513. &sm2_key,
  514. NULL, 0,
  515. NULL, 0,
  516. NULL, 0,
  517. &sm2_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH,
  518. &p, &certlen) != 1) {
  519. error_print();
  520. return -1;
  521. }
  522. }
  523. signers[0].certs = cert;
  524. signers[0].certs_len = certlen;
  525. signers[0].sign_key = &sm2_key;
  526. if (cms_signed_data_sign_to_der(
  527. signers, sizeof(signers)/sizeof(signers[0]),
  528. OID_cms_data, data, sizeof(data),
  529. NULL, 0,
  530. &p, &len) != 1
  531. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  532. || asn1_length_is_zero(len) != 1) {
  533. error_print();
  534. return -1;
  535. }
  536. cms_signed_data_print(stderr, 0, 0, "SignedData", d, dlen);
  537. cp = p = buf; len = 0;
  538. {
  539. int content_type;
  540. const uint8_t *content;
  541. size_t content_len;
  542. const uint8_t *certs;
  543. size_t certslen;
  544. const uint8_t *crls;
  545. size_t crlslen;
  546. const uint8_t *signer_infos;
  547. size_t signer_infos_len;
  548. if (cms_signed_data_sign_to_der(
  549. signers, sizeof(signers)/sizeof(signers[0]),
  550. OID_cms_data, data, sizeof(data),
  551. NULL, 0,
  552. &p, &len) != 1
  553. || cms_signed_data_verify_from_der(
  554. NULL, 0,
  555. NULL, 0,
  556. &content_type, &content, &content_len,
  557. &certs, &certslen,
  558. &crls, &crlslen,
  559. &signer_infos, &signer_infos_len,
  560. &cp, &len) != 1
  561. || asn1_length_is_zero(len) != 1) {
  562. error_print();
  563. return -1;
  564. }
  565. }
  566. printf("%s() ok\n", __FUNCTION__);
  567. return 1;
  568. }
  569. static int test_cms_recipient_info(void)
  570. {
  571. SM2_KEY sm2_key;
  572. uint8_t name[256];
  573. size_t namelen;
  574. uint8_t serial_buf[20];
  575. uint8_t in[16];
  576. uint8_t buf[1024];
  577. uint8_t *p = buf;
  578. const uint8_t *cp = buf;
  579. size_t len = 0;
  580. const uint8_t *d;
  581. size_t dlen;
  582. int version;
  583. const uint8_t *issuer;
  584. size_t issuer_len;
  585. const uint8_t *serial;
  586. size_t serial_len;
  587. int pke_algor;
  588. const uint8_t *params;
  589. size_t params_len;
  590. const uint8_t *enced_key;
  591. size_t enced_key_len;
  592. uint8_t out[sizeof(in)];
  593. size_t outlen;
  594. sm2_key_generate(&sm2_key);
  595. x509_name_set(name, &namelen, sizeof(name), "US", "CA", NULL, "BB", "AA", "CC");
  596. rand_bytes(serial_buf, sizeof(serial_buf));
  597. rand_bytes(in, sizeof(in));
  598. if (cms_recipient_info_encrypt_to_der(&sm2_key,
  599. name, namelen,
  600. serial_buf, sizeof(serial_buf),
  601. in, sizeof(in),
  602. &p, &len) != 1
  603. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  604. || asn1_length_is_zero(len) != 1) {
  605. error_print();
  606. return -1;
  607. }
  608. cms_recipient_info_print(stderr, 0, 0, "RecipientInfo", d, dlen);
  609. cp = p = buf; len = 0;
  610. if (cms_recipient_info_encrypt_to_der(&sm2_key,
  611. name, namelen,
  612. serial_buf, sizeof(serial_buf),
  613. in, sizeof(in),
  614. &p, &len) != 1
  615. || cms_recipient_info_from_der(
  616. &version,
  617. &issuer, &issuer_len,
  618. &serial, &serial_len,
  619. &pke_algor, &params, &params_len,
  620. &enced_key, &enced_key_len,
  621. &cp, &len) != 1
  622. || asn1_length_is_zero(len) != 1) {
  623. error_print();
  624. return -1;
  625. }
  626. cp = p = buf; len = 0;
  627. if (cms_recipient_info_encrypt_to_der(
  628. &sm2_key,
  629. name, namelen,
  630. serial_buf, sizeof(serial_buf),
  631. in, sizeof(in),
  632. &p, &len) != 1
  633. || cms_recipient_info_decrypt_from_der(
  634. &sm2_key,
  635. name, namelen,
  636. serial_buf, sizeof(serial_buf),
  637. out, &outlen, sizeof(out),
  638. &cp, &len) != 1
  639. || asn1_length_is_zero(len) != 1) {
  640. error_print();
  641. return -1;
  642. }
  643. if (sizeof(in) != outlen
  644. || memcmp(in, out, outlen) != 0) {
  645. error_print();
  646. return -1;
  647. }
  648. printf("%s() ok\n", __FUNCTION__);
  649. return 1;
  650. }
  651. int test_cms_enveloped_data(void)
  652. {
  653. SM2_KEY sm2_key1;
  654. uint8_t name1[256];
  655. size_t name1_len;
  656. uint8_t serial1[20];
  657. SM2_KEY sm2_key2;
  658. uint8_t name2[256];
  659. size_t name2_len;
  660. uint8_t serial2[20];
  661. time_t not_before, not_after;
  662. uint8_t certs[2048];
  663. size_t certslen;
  664. uint8_t key[16];
  665. uint8_t iv[16];
  666. uint8_t in[80];
  667. uint8_t out[256];
  668. size_t outlen;
  669. uint8_t buf[4096];
  670. uint8_t *p;
  671. const uint8_t *cp;
  672. size_t len;
  673. const uint8_t *d;
  674. size_t dlen;
  675. // prepare keys and certs
  676. if (time(&not_before) == -1
  677. || x509_validity_add_days(&not_after, not_before, 365) != 1) {
  678. error_print();
  679. return -1;
  680. }
  681. p = certs;
  682. certslen = 0;
  683. if (sm2_key_generate(&sm2_key1) != 1
  684. || rand_bytes(serial1, sizeof(serial1)) != 1
  685. || x509_name_set(name1, &name1_len, sizeof(name1), "CN", "Beijing", "Haidian", "PKU", "CS", "Alice") != 1
  686. || x509_cert_sign_to_der(
  687. X509_version_v3,
  688. serial1, sizeof(serial1),
  689. OID_sm2sign_with_sm3,
  690. name1, name1_len,
  691. not_before, not_after,
  692. name1, name1_len,
  693. &sm2_key1, NULL, 0, NULL, 0, NULL, 0,
  694. &sm2_key1, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH,
  695. &p, &certslen) != 1) {
  696. error_print();
  697. return -1;
  698. }
  699. if (sm2_key_generate(&sm2_key2) != 1
  700. || rand_bytes(serial2, sizeof(serial2)) != 1
  701. || x509_name_set(name2, &name2_len, sizeof(name2), "CN", "Beijing", "Haidian", "PKU", "CS", "Bob") != 1
  702. || x509_cert_sign_to_der(
  703. X509_version_v3,
  704. serial2, sizeof(serial2),
  705. OID_sm2sign_with_sm3,
  706. name2, name2_len,
  707. not_before, not_after,
  708. name2, name2_len,
  709. &sm2_key2, NULL, 0, NULL, 0, NULL, 0,
  710. &sm2_key2, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH,
  711. &p, &certslen) != 1) {
  712. error_print();
  713. return -1;
  714. }
  715. rand_bytes(key, sizeof(key));
  716. rand_bytes(iv, sizeof(iv));
  717. rand_bytes(in, sizeof(in));
  718. // test
  719. cp = p = buf; len = 0;
  720. if (cms_enveloped_data_encrypt_to_der(
  721. certs, certslen,
  722. OID_sm4_cbc, key, sizeof(key), iv, sizeof(iv),
  723. OID_cms_data, in, sizeof(in),
  724. NULL, 0, NULL, 0,
  725. &p, &len) != 1
  726. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  727. || asn1_length_is_zero(len) != 1) {
  728. error_print();
  729. return -1;
  730. }
  731. cms_enveloped_data_print(stderr, 0, 0, "EnvelopedData", d, dlen);
  732. int content_type;
  733. cp = p = buf; len = 0;
  734. if (cms_enveloped_data_encrypt_to_der(
  735. certs, certslen,
  736. OID_sm4_cbc, key, sizeof(key), iv, sizeof(iv),
  737. OID_cms_data, in, sizeof(in),
  738. NULL, 0, NULL, 0,
  739. &p, &len) != 1) {
  740. error_print();
  741. return -1;
  742. }
  743. const uint8_t *rcpt_infos;
  744. const uint8_t *shared_info1;
  745. const uint8_t *shared_info2;
  746. size_t rcpt_infos_len, shared_info1_len, shared_info2_len;
  747. if (cms_enveloped_data_decrypt_from_der(
  748. &sm2_key1,
  749. name1, name1_len,
  750. serial1, sizeof(serial1),
  751. &content_type, out, &outlen,
  752. &rcpt_infos, &rcpt_infos_len,
  753. &shared_info1, &shared_info1_len,
  754. &shared_info2, &shared_info2_len,
  755. &cp, &len) != 1) {
  756. error_print();
  757. return -1;
  758. }
  759. printf("%s() ok\n", __FUNCTION__);
  760. return 1;
  761. }
  762. static int test_cms_signed_and_enveloped_data(void)
  763. {
  764. /*
  765. SM2_KEY sign_key;
  766. SM2_KEY decr_key;
  767. uint8_t sign_serial[20];
  768. uint8_t sign_name[256];
  769. size_t sign_name_len;
  770. */
  771. printf("%s() ok\n", __FUNCTION__);
  772. return 1;
  773. }
  774. static int test_cms_key_agreement_info(void)
  775. {
  776. SM2_KEY sm2_key;
  777. uint8_t name[256];
  778. size_t namelen;
  779. uint8_t serial[20];
  780. time_t not_before, not_after;
  781. uint8_t cert[2048];
  782. size_t certlen = 0;
  783. uint8_t buf[4096];
  784. uint8_t *p;
  785. const uint8_t *cp;
  786. size_t len;
  787. const uint8_t *d;
  788. size_t dlen;
  789. int version;
  790. SM2_KEY public_key;
  791. const uint8_t *pcert;
  792. size_t pcertlen;
  793. const uint8_t *id;
  794. size_t idlen;
  795. p = cert;
  796. if (sm2_key_generate(&sm2_key) != 1
  797. || rand_bytes(serial, sizeof(serial)) != 1
  798. || x509_name_set(name, &namelen, sizeof(name), "CN", "Beijing", "Haidian", "PKU", "CS", "Alice") != 1
  799. || time(&not_before) == - 1
  800. || x509_validity_add_days(&not_after, not_before, 365) != 1
  801. || x509_cert_sign_to_der(
  802. X509_version_v3,
  803. serial, sizeof(serial),
  804. OID_sm2sign_with_sm3,
  805. name, namelen,
  806. not_before, not_after,
  807. name, namelen,
  808. &sm2_key, NULL, 0, NULL, 0, NULL, 0,
  809. &sm2_key, SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH,
  810. &p, &certlen) != 1) {
  811. error_print();
  812. return -1;
  813. }
  814. cp = p = buf; len = 0;
  815. if (cms_key_agreement_info_to_der(
  816. CMS_version_v1,
  817. &sm2_key,
  818. cert, certlen,
  819. (uint8_t *)SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH,
  820. &p, &len) != 1
  821. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  822. || asn1_length_is_zero(len) != 1) {
  823. error_print();
  824. return -1;
  825. }
  826. cms_key_agreement_info_print(stderr, 0, 0, "KeyAgreementInfo", d, dlen);
  827. cp = p = buf; len = 0;
  828. if (cms_key_agreement_info_to_der(
  829. CMS_version_v1,
  830. &sm2_key,
  831. cert, certlen,
  832. (uint8_t *)SM2_DEFAULT_ID, SM2_DEFAULT_ID_LENGTH,
  833. &p, &len) != 1
  834. || cms_key_agreement_info_from_der(
  835. &version,
  836. &public_key,
  837. &pcert, &pcertlen,
  838. &id, &idlen,
  839. &cp, &len) != 1
  840. || asn1_check(version == CMS_version_v1) != 1
  841. || asn1_length_is_zero(len) != 1) {
  842. error_print();
  843. return -1;
  844. }
  845. if (sm2_public_key_equ(&sm2_key, &public_key) != 1) {
  846. error_print();
  847. return -1;
  848. }
  849. if (pcertlen != certlen
  850. || memcmp(pcert, cert, certlen) != 0
  851. || idlen != SM2_DEFAULT_ID_LENGTH
  852. || memcmp(SM2_DEFAULT_ID, id, idlen) != 0) {
  853. error_print();
  854. return -1;
  855. }
  856. printf("%s() ok\n", __FUNCTION__);
  857. return 1;
  858. }
  859. int main(int argc, char **argv)
  860. {
  861. if (test_cms_content_type() != 1) goto err;
  862. if (test_cms_content_info() != 1) goto err;
  863. if (test_cms_enced_content_info() != 1) goto err;
  864. if (test_cms_enced_content_info_encrypt() != 1) goto err;
  865. if (test_cms_issuer_and_serial_number() != 1) goto err;
  866. if (test_cms_signer_info() != 1) goto err;
  867. if (test_cms_signer_info_sign() != 1) goto err;
  868. if (test_cms_signer_infos() != 1) goto err;
  869. if (test_cms_digest_algors() != 1) goto err;
  870. if (test_cms_signed_data() != 1) goto err;
  871. if (test_cms_recipient_info() != 1) goto err;
  872. if (test_cms_enveloped_data() != 1) goto err;
  873. if (test_cms_key_agreement_info() != 1) goto err;
  874. printf("%s all tests passed\n", __FILE__);
  875. return 0;
  876. err:
  877. error_print();
  878. return -1;
  879. }