pkcs8test.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  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/sm2.h>
  14. #include <gmssl/asn1.h>
  15. #include <gmssl/pkcs8.h>
  16. #include <gmssl/error.h>
  17. static int test_pbkdf2_params(void)
  18. {
  19. uint8_t salt[8] = {0};
  20. size_t saltlen;
  21. int iter = 65536;
  22. int keylen = 16;
  23. int prf = OID_hmac_sm3;
  24. uint8_t buf[128];
  25. uint8_t *p = buf;
  26. const uint8_t *cp = buf;
  27. size_t len = 0;
  28. const uint8_t *d;
  29. size_t dlen;
  30. const uint8_t *psalt;
  31. if (pbkdf2_params_to_der(salt, sizeof(salt), iter, keylen, prf, &p, &len) != 1
  32. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  33. || asn1_length_is_zero(len) != 1) {
  34. error_print();
  35. return -1;
  36. }
  37. pbkdf2_params_print(stderr, 0, 0, "PBKDF2-params", d, dlen);
  38. p = buf;
  39. cp = buf;
  40. len = 0;
  41. keylen = -1;
  42. prf = -1;
  43. if (pbkdf2_params_to_der(salt, sizeof(salt), iter, keylen, prf, &p, &len) != 1
  44. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  45. || asn1_length_is_zero(len) != 1) {
  46. error_print();
  47. return -1;
  48. }
  49. pbkdf2_params_print(stderr, 0, 0, "PBKDF2-params", d, dlen);
  50. p = buf;
  51. cp = buf;
  52. len = 0;
  53. keylen = -1;
  54. prf = -1;
  55. if (pbkdf2_params_to_der(salt, sizeof(salt), iter, keylen, prf, &p, &len) != 1
  56. || pbkdf2_params_from_der(&psalt, &saltlen, &iter, &keylen, &prf, &cp, &len) != 1
  57. || asn1_length_is_zero(len) != 1) {
  58. error_print();
  59. return -1;
  60. }
  61. format_print(stderr, 0, 0, "PBKDF2-params\n");
  62. format_bytes(stderr, 0, 4, "salt", psalt, saltlen);
  63. format_print(stderr, 0, 4, "iterationCount: %d\n", iter);
  64. format_print(stderr, 0, 4, "keyLength: %d\n", keylen);
  65. format_print(stderr, 0, 4, "prf: %d\n", prf);
  66. printf("%s() ok\n", __FUNCTION__);
  67. return 0;
  68. }
  69. static int test_pbkdf2_algor(void)
  70. {
  71. uint8_t salt[8] = {0};
  72. size_t saltlen;
  73. int iter = 65536;
  74. int keylen = 16;
  75. int prf = OID_hmac_sm3;
  76. uint8_t buf[128];
  77. uint8_t *p = buf;
  78. const uint8_t *cp = buf;
  79. size_t len = 0;
  80. const uint8_t *d;
  81. size_t dlen;
  82. const uint8_t *psalt;
  83. if (pbkdf2_algor_to_der(salt, sizeof(salt), iter, keylen, prf, &p, &len) != 1
  84. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  85. || asn1_length_is_zero(len) != 1) {
  86. error_print();
  87. return -1;
  88. }
  89. pbkdf2_algor_print(stderr, 0, 0, "PBKDF2", d, dlen);
  90. p = buf;
  91. cp = buf;
  92. len = 0;
  93. if (pbkdf2_algor_to_der(salt, sizeof(salt), iter, keylen, prf, &p, &len) != 1
  94. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  95. || asn1_length_is_zero(len) != 1) {
  96. error_print();
  97. return -1;
  98. }
  99. format_print(stderr, 0, 0, "PBKDF2\n");
  100. format_bytes(stderr, 0, 4, "salt", psalt, saltlen);
  101. format_print(stderr, 0, 4, "iterationCount: %d\n", iter);
  102. format_print(stderr, 0, 4, "keyLength: %d\n", keylen);
  103. format_print(stderr, 0, 4, "prf: %d\n", prf);
  104. printf("%s() ok\n", __FUNCTION__);
  105. return 0;
  106. }
  107. static int test_pbes2_enc_algor(void)
  108. {
  109. int cipher = OID_sm4_cbc;
  110. uint8_t iv[16] = {1};
  111. uint8_t buf[128];
  112. uint8_t *p = buf;
  113. const uint8_t *cp = buf;
  114. size_t len = 0;
  115. const uint8_t *d;
  116. size_t dlen;
  117. const uint8_t *piv;
  118. size_t ivlen;
  119. if (pbes2_enc_algor_to_der(cipher, iv, sizeof(iv), &p, &len) != 1
  120. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  121. || asn1_length_is_zero(len) != 1) {
  122. error_print();
  123. return -1;
  124. }
  125. pbes2_enc_algor_print(stderr, 0, 0, "PBES2-Enc", d, dlen);
  126. p = buf;
  127. cp = buf;
  128. len = 0;
  129. if (pbes2_enc_algor_to_der(cipher, iv, sizeof(iv), &p, &len) != 1
  130. || pbes2_enc_algor_from_der(&cipher, &piv, &ivlen, &cp, &len) != 1
  131. || asn1_check(cipher == OID_sm4_cbc) != 1
  132. || asn1_check(ivlen == sizeof(iv)) != 1
  133. || asn1_length_is_zero(len) != 1) {
  134. error_print();
  135. return -1;
  136. }
  137. printf("%s() ok\n", __FUNCTION__);
  138. return 0;
  139. }
  140. static int test_pbes2_params(void)
  141. {
  142. uint8_t salt[8] = {0};
  143. size_t saltlen;
  144. int iter = 65536;
  145. int keylen = -1;
  146. int prf = OID_hmac_sm3;
  147. int cipher = OID_sm4_cbc;
  148. uint8_t iv[16];
  149. uint8_t buf[256];
  150. uint8_t *p = buf;
  151. const uint8_t *cp = buf;
  152. size_t len = 0;
  153. const uint8_t *d;
  154. size_t dlen;
  155. const uint8_t *psalt;
  156. const uint8_t *piv;
  157. size_t ivlen;
  158. if (pbes2_params_to_der(salt, sizeof(salt), iter, keylen, prf, cipher, iv, sizeof(iv), &p, &len) != 1
  159. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  160. || asn1_length_is_zero(len) != 1) {
  161. error_print();
  162. return -1;
  163. }
  164. pbes2_params_print(stderr, 0, 0, "PBES2-params", d, dlen);
  165. p = buf;
  166. cp = buf;
  167. len = 0;
  168. if (pbes2_params_to_der(salt, sizeof(salt), iter, keylen, prf, cipher, iv, sizeof(iv), &p, &len) != 1
  169. || pbes2_params_from_der(&psalt, &saltlen, &iter, &keylen, &prf, &cipher, &piv, &ivlen, &cp, &len) != 1
  170. || asn1_check(saltlen == sizeof(salt)) != 1
  171. || asn1_check(iter == 65536) != 1
  172. || asn1_check(keylen == -1) != 1
  173. || asn1_check(prf == OID_hmac_sm3) != 1
  174. || asn1_check(cipher == OID_sm4_cbc) != 1
  175. || asn1_check(ivlen == sizeof(iv)) != 1
  176. || asn1_length_is_zero(len) != 1) {
  177. error_print();
  178. return -1;
  179. }
  180. printf("%s() ok\n", __FUNCTION__);
  181. return 0;
  182. }
  183. static int test_pbes2_algor(void)
  184. {
  185. uint8_t salt[8] = {0};
  186. size_t saltlen;
  187. int iter = 65536;
  188. int keylen = -1;
  189. int prf = OID_hmac_sm3;
  190. int cipher = OID_sm4_cbc;
  191. uint8_t iv[16];
  192. uint8_t buf[256];
  193. uint8_t *p = buf;
  194. const uint8_t *cp = buf;
  195. size_t len = 0;
  196. const uint8_t *d;
  197. size_t dlen;
  198. const uint8_t *psalt;
  199. const uint8_t *piv;
  200. size_t ivlen;
  201. if (pbes2_algor_to_der(salt, sizeof(salt), iter, keylen, prf, cipher, iv, sizeof(iv), &p, &len) != 1
  202. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  203. || asn1_length_is_zero(len) != 1) {
  204. error_print();
  205. return -1;
  206. }
  207. pbes2_algor_print(stderr, 0, 0, "PBES2", d, dlen);
  208. p = buf;
  209. cp = buf;
  210. len = 0;
  211. if (pbes2_algor_to_der(salt, sizeof(salt), iter, keylen, prf, cipher, iv, sizeof(iv), &p, &len) != 1
  212. || pbes2_algor_from_der(&psalt, &saltlen, &iter, &keylen, &prf, &cipher, &piv, &ivlen, &cp, &len) != 1
  213. || asn1_check(saltlen == sizeof(salt)) != 1
  214. || asn1_check(iter == 65536) != 1
  215. || asn1_check(keylen == -1) != 1
  216. || asn1_check(prf == OID_hmac_sm3) != 1
  217. || asn1_check(cipher == OID_sm4_cbc) != 1
  218. || asn1_check(ivlen == sizeof(iv)) != 1
  219. || asn1_length_is_zero(len) != 1) {
  220. error_print();
  221. return -1;
  222. }
  223. printf("%s() ok\n", __FUNCTION__);
  224. return 0;
  225. }
  226. static int test_pkcs8_enced_private_key_info(void)
  227. {
  228. uint8_t salt[8] = { 1,0 };
  229. int iter = 65536;
  230. int keylen = -1;
  231. int prf = OID_hmac_sm3;
  232. int cipher = OID_sm4_cbc;
  233. uint8_t iv[16] = { 2,0 };
  234. uint8_t enced[128] = { 3,0 };
  235. uint8_t buf[256];
  236. uint8_t *p = buf;
  237. const uint8_t *cp = buf;
  238. size_t len = 0;
  239. const uint8_t *d;
  240. size_t dlen;
  241. const uint8_t *psalt;
  242. size_t saltlen;
  243. const uint8_t *piv;
  244. size_t ivlen;
  245. const uint8_t *penced;
  246. size_t encedlen;
  247. if (pkcs8_enced_private_key_info_to_der(
  248. salt, sizeof(salt), iter, keylen, prf,
  249. cipher, iv, sizeof(iv),
  250. enced, sizeof(enced), &p, &len) != 1
  251. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  252. || asn1_length_is_zero(len) != 1) {
  253. error_print();
  254. return -1;
  255. }
  256. pkcs8_enced_private_key_info_print(stderr, 0, 0, "EncryptedPrivateKeyInfo", d, dlen);
  257. p = buf;
  258. cp = buf;
  259. len = 0;
  260. if (pkcs8_enced_private_key_info_to_der(
  261. salt, sizeof(salt), iter, keylen, prf,
  262. cipher, iv, sizeof(iv),
  263. enced, sizeof(enced), &p, &len) != 1
  264. || pkcs8_enced_private_key_info_from_der(
  265. &psalt, &saltlen, &iter, &keylen, &prf,
  266. &cipher, &piv, &ivlen,
  267. &penced, &encedlen, &cp, &len) != 1
  268. || asn1_check(saltlen == sizeof(salt)) != 1
  269. || asn1_check(keylen == -1) != 1
  270. || asn1_check(prf == OID_hmac_sm3) != 1
  271. || asn1_check(cipher == OID_sm4_cbc) != 1
  272. || asn1_check(ivlen == sizeof(iv)) != 1
  273. || asn1_check(encedlen == sizeof(enced)) != 1
  274. || asn1_length_is_zero(len) != 1) {
  275. error_print();
  276. return -1;
  277. }
  278. printf("%s() ok\n", __FUNCTION__);
  279. return 0;
  280. }
  281. static int test_pkcs8(void)
  282. {
  283. int err = 0;
  284. SM2_KEY sm2_key;
  285. SM2_KEY sm2_buf;
  286. const uint8_t *attrs;
  287. size_t attrslen;
  288. uint8_t buf[1024];
  289. uint8_t *p = buf;
  290. const uint8_t *cp = buf;
  291. size_t len = 0;
  292. sm2_key_generate(&sm2_key);
  293. memcpy(&sm2_buf, &sm2_key, sizeof(sm2_key));
  294. sm2_key_print(stderr, 0, 0, "SM2_KEY", &sm2_key);
  295. if (sm2_private_key_info_encrypt_to_der(&sm2_key, "password", &p, &len) != 1) {
  296. error_print();
  297. return -1;
  298. }
  299. {
  300. const uint8_t *a = buf;
  301. size_t alen = len;
  302. const uint8_t *d;
  303. size_t dlen;
  304. if (asn1_sequence_from_der(&d, &dlen, &a, &alen) != 1
  305. || asn1_length_is_zero(alen) != 1) {
  306. error_print();
  307. return -1;
  308. }
  309. pkcs8_enced_private_key_info_print(stderr, 0, 0, "test_pkcs8: 392", d, dlen);
  310. fprintf(stderr, "\n");
  311. }
  312. memset(&sm2_key, 0, sizeof(sm2_key));
  313. if (sm2_private_key_info_decrypt_from_der(&sm2_key, &attrs, &attrslen, "password", &cp, &len) != 1
  314. || asn1_length_is_zero(len) != 1) {
  315. error_print();
  316. return -1;
  317. }
  318. fprintf(stderr, "\n");
  319. sm2_key_print(stderr, 0, 0, "SM2_KEY", &sm2_key);
  320. printf("%s() ok\n", __FUNCTION__);
  321. return 0;
  322. }
  323. static int test_pkcs8_pem(void)
  324. {
  325. int err = 0;
  326. char *file = "test_pkcs8_pem.pem";
  327. char *pass = "password";
  328. SM2_KEY sm2_key;
  329. SM2_KEY sm2_buf;
  330. FILE *fp;
  331. sm2_key_generate(&sm2_key);
  332. memcpy(&sm2_buf, &sm2_key, sizeof(sm2_key));
  333. sm2_key_print(stderr, 0, 0, "SM2_KEY", &sm2_key);
  334. if (!(fp = fopen(file, "w"))
  335. || sm2_private_key_info_encrypt_to_pem(&sm2_key, pass, fp) != 1) {
  336. error_print();
  337. return -1;
  338. }
  339. fclose(fp);
  340. memset(&sm2_key, 0, sizeof(sm2_key));
  341. if (!(fp = fopen(file, "r"))
  342. || sm2_private_key_info_decrypt_from_pem(&sm2_key, pass, fp) != 1) {
  343. error_print();
  344. return -1;
  345. }
  346. sm2_key_print(stderr, 0, 0, "SM2_KEY", &sm2_key);
  347. printf("%s() ok\n", __FUNCTION__);
  348. return 0;
  349. }
  350. int main(void)
  351. {
  352. int err = 0;
  353. /*
  354. err += test_pbkdf2_params();
  355. err += test_pbkdf2_algor();
  356. err += test_pbes2_enc_algor();
  357. err += test_pbes2_params();
  358. err += test_pbes2_algor();
  359. err += test_pkcs8_enced_private_key_info();
  360. */
  361. err += test_pkcs8();
  362. // err += test_pkcs8_pem();
  363. return err;
  364. }