PageRenderTime 68ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/usr/src/suites/security/kmf/lib/libkmf_test_util.c

https://bitbucket.org/illumos/illumos-stc
C | 3916 lines | 2903 code | 439 blank | 574 comment | 784 complexity | 09c9f60ae64fecbc321af5c5a0a72e9e MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception
  1. /*
  2. * CDDL HEADER START
  3. *
  4. * The contents of this file are subject to the terms of the
  5. * Common Development and Distribution License (the "License").
  6. * You may not use this file except in compliance with the License.
  7. *
  8. * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  9. * or http://www.opensolaris.org/os/licensing.
  10. * See the License for the specific language governing permissions
  11. * and limitations under the License.
  12. *
  13. * When distributing Covered Code, include this CDDL HEADER in each
  14. * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15. * If applicable, add the following below this CDDL HEADER, with the
  16. * fields enclosed by brackets "[]" replaced with your own identifying
  17. * information: Portions Copyright [yyyy] [name of copyright owner]
  18. *
  19. * CDDL HEADER END
  20. */
  21. /*
  22. * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
  23. * Use is subject to license terms.
  24. */
  25. #include <stdio.h>
  26. #include "kmf_test_util.h"
  27. #include <unistd.h>
  28. #include <sys/stat.h>
  29. #include <fcntl.h>
  30. #include <string.h>
  31. #include <errno.h>
  32. extern int errno;
  33. static char *softtoken_dir = NULL;
  34. /*
  35. *
  36. * Name: kmf_rvtostr
  37. *
  38. * Description:
  39. * convert KMF API return codes to readable string
  40. *
  41. * Parameter:
  42. * type(input): KMF API return code
  43. *
  44. * Return:
  45. * readable string
  46. *
  47. */
  48. char *
  49. kmf_rvtostr(KMF_RETURN type)
  50. {
  51. static char primbuf[80];
  52. switch (type) {
  53. case KMF_OK:
  54. return ("KMF_OK");
  55. case KMF_ERR_BAD_PARAMETER:
  56. return ("KMF_ERR_BAD_PARAMETER");
  57. case KMF_ERR_BAD_KEY_FORMAT:
  58. return ("KMF_ERR_BAD_KEY_FORMAT");
  59. case KMF_ERR_BAD_ALGORITHM:
  60. return ("KMF_ERR_BAD_ALGORITHM");
  61. case KMF_ERR_MEMORY:
  62. return ("KMF_ERR_MEMORY");
  63. case KMF_ERR_ENCODING:
  64. return ("KMF_ERR_ENCODING");
  65. case KMF_ERR_PLUGIN_INIT:
  66. return ("KMF_ERR_PLUGIN_INIT");
  67. case KMF_ERR_PLUGIN_NOTFOUND:
  68. return ("KMF_ERR_PLUGIN_NOTFOUND");
  69. case KMF_ERR_INTERNAL:
  70. return ("KMF_ERR_INTERNAL");
  71. case KMF_ERR_BAD_CERT_FORMAT:
  72. return ("KMF_ERR_BAD_CERT_FORMAT");
  73. case KMF_ERR_KEYGEN_FAILED:
  74. return ("KMF_ERR_KEYGEN_FAILED");
  75. case KMF_ERR_UNINITIALIZED:
  76. return ("KMF_ERR_UNINITIALIZED");
  77. case KMF_ERR_ISSUER:
  78. return ("KMF_ERR_ISSUER");
  79. case KMF_ERR_NOT_REVOKED:
  80. return ("KMF_ERR_NOT_REVOKED");
  81. case KMF_ERR_CERT_NOT_FOUND:
  82. return ("KMF_ERR_CERT_NOT_FOUND");
  83. case KMF_ERR_CRL_NOT_FOUND:
  84. return ("KMF_ERR_CRL_NOT_FOUND");
  85. case KMF_ERR_RDN_PARSER:
  86. return ("KMF_ERR_RDN_PARSER");
  87. case KMF_ERR_RDN_ATTR:
  88. return ("KMF_ERR_RDN_ATTR");
  89. case KMF_ERR_SLOTNAME:
  90. return ("KMF_ERR_SLOTNAME");
  91. case KMF_ERR_EMPTY_CRL:
  92. return ("KMF_ERR_EMPTY_CRL");
  93. case KMF_ERR_AUTH_FAILED:
  94. return ("KMF_ERR_AUTH_FAILED");
  95. case KMF_ERR_TOKEN_SELECTED:
  96. return ("KMF_ERR_TOKEN_SELECTED");
  97. case KMF_ERR_NO_TOKEN_SELECTED:
  98. return ("KMF_ERR_NO_TOKEN_SELECTED");
  99. case KMF_ERR_TOKEN_NOT_PRESENT:
  100. return ("KMF_ERR_TOKEN_NOT_PRESENT");
  101. case KMF_ERR_EXTENSION_NOT_FOUND:
  102. return ("KMF_ERR_EXTENSION_NOT_FOUND");
  103. case KMF_ERR_POLICY_ENGINE:
  104. return ("KMF_ERR_POLICY_ENGINE");
  105. case KMF_ERR_POLICY_DB_FORMAT:
  106. return ("KMF_ERR_POLICY_DB_FORMAT");
  107. case KMF_ERR_POLICY_NOT_FOUND:
  108. return ("KMF_ERR_POLICY_NOT_FOUND");
  109. case KMF_ERR_POLICY_DB_FILE:
  110. return ("KMF_ERR_POLICY_DB_FILE");
  111. case KMF_ERR_POLICY_NAME:
  112. return ("KMF_ERR_POLICY_NAME");
  113. case KMF_ERR_OCSP_POLICY:
  114. return ("KMF_ERR_OCSP_POLICY");
  115. case KMF_ERR_TA_POLICY:
  116. return ("KMF_ERR_TA_POLICY");
  117. case KMF_ERR_KEY_NOT_FOUND:
  118. return ("KMF_ERR_KEY_NOT_FOUND");
  119. case KMF_ERR_OPEN_FILE:
  120. return ("KMF_ERR_OPEN_FILE");
  121. case KMF_ERR_OCSP_BAD_ISSUER:
  122. return ("KMF_ERR_OCSP_BAD_ISSUER");
  123. case KMF_ERR_OCSP_BAD_CERT:
  124. return ("KMF_ERR_OCSP_BAD_CERT");
  125. case KMF_ERR_OCSP_CREATE_REQUEST:
  126. return ("KMF_ERR_OCSP_CREATE_REQUEST");
  127. case KMF_ERR_CONNECT_SERVER:
  128. return ("KMF_ERR_CONNECT_SERVER");
  129. case KMF_ERR_SEND_REQUEST:
  130. return ("KMF_ERR_SEND_REQUEST");
  131. case KMF_ERR_OCSP_CERTID:
  132. return ("KMF_ERR_OCSP_CERTID");
  133. case KMF_ERR_OCSP_MALFORMED_RESPONSE:
  134. return ("KMF_ERR_OCSP_MALFORMED_RESPONSE");
  135. case KMF_ERR_OCSP_RESPONSE_STATUS:
  136. return ("KMF_ERR_OCSP_RESPONSE_STATUS");
  137. case KMF_ERR_OCSP_NO_BASIC_RESPONSE:
  138. return ("KMF_ERR_OCSP_NO_BASIC_RESPONSE");
  139. case KMF_ERR_OCSP_BAD_SIGNER:
  140. return ("KMF_ERR_OCSP_BAD_SIGNER");
  141. case KMF_ERR_OCSP_RESPONSE_SIGNATURE:
  142. return ("KMF_ERR_OCSP_RESPONSE_SIGNATURE");
  143. case KMF_ERR_OCSP_UNKNOWN_CERT:
  144. return ("KMF_ERR_OCSP_UNKNOWN_CERT");
  145. case KMF_ERR_OCSP_STATUS_TIME_INVALID:
  146. return ("KMF_ERR_OCSP_STATUS_TIME_INVALID");
  147. case KMF_ERR_BAD_HTTP_RESPONSE:
  148. return ("KMF_ERR_BAD_HTTP_RESPONSE");
  149. case KMF_ERR_RECV_RESPONSE:
  150. return ("KMF_ERR_RECV_RESPONSE");
  151. case KMF_ERR_RECV_TIMEOUT:
  152. return ("KMF_ERR_RECV_TIMEOUT");
  153. case KMF_ERR_DUPLICATE_KEYFILE:
  154. return ("KMF_ERR_DUPLICATE_KEYFILE");
  155. case KMF_ERR_AMBIGUOUS_PATHNAME:
  156. return ("KMF_ERR_AMBIGUOUS_PATHNAME");
  157. case KMF_ERR_FUNCTION_NOT_FOUND:
  158. return ("KMF_ERR_FUNCTION_NOT_FOUND");
  159. case KMF_ERR_PKCS12_FORMAT:
  160. return ("KMF_ERR_PKCS12_FORMAT");
  161. case KMF_ERR_BAD_KEY_TYPE:
  162. return ("KMF_ERR_BAD_KEY_TYPE");
  163. case KMF_ERR_BAD_KEY_CLASS:
  164. return ("KMF_ERR_BAD_KEY_CLASS");
  165. case KMF_ERR_BAD_KEY_SIZE:
  166. return ("KMF_ERR_BAD_KEY_SIZE");
  167. case KMF_ERR_BAD_HEX_STRING:
  168. return ("KMF_ERR_BAD_HEX_STRING");
  169. case KMF_ERR_KEYUSAGE:
  170. return ("KMF_ERR_KEYUSAGE");
  171. case KMF_ERR_VALIDITY_PERIOD:
  172. return ("KMF_ERR_VALIDITY_PERIOD");
  173. case KMF_ERR_OCSP_REVOKED:
  174. return ("KMF_ERR_OCSP_REVOKED");
  175. case KMF_ERR_CERT_MULTIPLE_FOUND:
  176. return ("KMF_ERR_CERT_MULTIPLE_FOUND");
  177. case KMF_ERR_WRITE_FILE:
  178. return ("KMF_ERR_WRITE_FILE");
  179. case KMF_ERR_BAD_URI:
  180. return ("KMF_ERR_BAD_URI");
  181. case KMF_ERR_BAD_CRLFILE:
  182. return ("KMF_ERR_BAD_CRLFILE");
  183. case KMF_ERR_BAD_CERTFILE:
  184. return ("KMF_ERR_BAD_CERTFILE");
  185. case KMF_ERR_GETKEYVALUE_FAILED:
  186. return ("KMF_ERR_GETKEYVALUE_FAILED");
  187. case KMF_ERR_BAD_KEYHANDLE:
  188. return ("KMF_ERR_BAD_KEYHANDLE");
  189. case KMF_ERR_UNINITIALIZED_TOKEN:
  190. return ("KMF_ERR_UNINITIALIZED_TOKEN");
  191. case KMF_ERR_BUFFER_SIZE:
  192. return ("KMF_ERR_BUFFER_SIZE");
  193. default:
  194. (void) snprintf(primbuf, sizeof (primbuf),
  195. "unknown return type %02x", type);
  196. return (primbuf);
  197. }
  198. }
  199. /*
  200. *
  201. * Name: compare_result
  202. *
  203. * Description:
  204. * Compare the return value with the expected one
  205. *
  206. * Parameters:
  207. * rv(input): return value
  208. * exp_rv(input): expected return value
  209. *
  210. * Returns:
  211. * 0: rv equals exp_rv
  212. * 1: rv doesn't equal exp_rv
  213. *
  214. */
  215. int
  216. compare_result(KMF_RETURN rv, KMF_RETURN exp_rv)
  217. {
  218. int ret = 0;
  219. if (rv != exp_rv) {
  220. (void) jnl_printf("Expected value: 0x%02x (%s)\n",
  221. exp_rv, kmf_rvtostr(exp_rv));
  222. (void) jnl_printf("Return value: 0x%02x (%s)\n", rv,
  223. kmf_rvtostr(rv));
  224. (void) jnl_printf("%s\n", result_tbl[STF_FAIL]);
  225. ret = 1;
  226. }
  227. else
  228. (void) jnl_printf("%s\n", result_tbl[STF_PASS]);
  229. return (ret);
  230. }
  231. /*
  232. *
  233. * Name: limit_heap
  234. *
  235. * Description:
  236. * Limit the heap size, get the original heap size
  237. *
  238. * Parameter:
  239. * prl_orig(output): contains the original heap size
  240. *
  241. * Returns:
  242. * 0: successful
  243. * 1: failed to get the original heap size
  244. * 2: failed to limit the heap size
  245. *
  246. */
  247. int
  248. limit_heap(struct rlimit *prl_orig)
  249. {
  250. struct rlimit rl_old, rl_new;
  251. if ((getrlimit(RLIMIT_DATA, &rl_old)) != 0) {
  252. (void) jnl_printf("Failed to get the original heap size");
  253. return (1);
  254. }
  255. rl_new.rlim_cur = KMF_HEAP_SIZE;
  256. rl_new.rlim_max = rl_old.rlim_max;
  257. if ((setrlimit(RLIMIT_DATA, &rl_new)) != 0) {
  258. (void) jnl_printf("Failed to limit the heap size");
  259. return (2);
  260. }
  261. *prl_orig = rl_old;
  262. return (0);
  263. }
  264. /*
  265. *
  266. * Name: restore_heap
  267. *
  268. * Description:
  269. * Restore the heap size
  270. *
  271. * Parameter:
  272. * prl_orig(input): the original heap size
  273. *
  274. */
  275. void
  276. restore_heap(struct rlimit *prl_orig)
  277. {
  278. if ((setrlimit(RLIMIT_DATA, prl_orig)) != 0)
  279. (void) jnl_printf("Warning: failed to restore the heap size\n");
  280. }
  281. /*
  282. * Name: print_test
  283. *
  284. * Description:
  285. * print test number, API name and the expected return value
  286. *
  287. * Parameters:
  288. * num(input): test number
  289. * str(input): API name
  290. * exp_ret(input): expected return value
  291. *
  292. */
  293. void
  294. print_test(int num, char *str, KMF_RETURN exp_ret)
  295. {
  296. (void) jnl_printf("\n%3d. %-20s: %-20s\n", num, str,
  297. kmf_rvtostr(exp_ret));
  298. }
  299. /*
  300. *
  301. * Name: use_bad_file
  302. *
  303. * Description:
  304. * backup the original file, create a blank one
  305. *
  306. * Parameters:
  307. * orig(input): original file name
  308. * bak(inpu): backup file name
  309. *
  310. * Returns:
  311. * 0: successful
  312. * 1: failed
  313. *
  314. */
  315. int
  316. use_bad_file(const char *orig, const char *bak)
  317. {
  318. if ((link(orig, bak)) != 0)
  319. (void) jnl_printf("Warning: failed to save %s to %s\n",
  320. orig, bak);
  321. if ((unlink(orig)) != 0) {
  322. (void) jnl_printf("Failed to remove the original file %s\n",
  323. orig);
  324. return (1);
  325. }
  326. if ((creat(orig, 755)) == -1) {
  327. (void) jnl_printf("Failed to create the bad file %s\n", orig);
  328. return (1);
  329. }
  330. return (0);
  331. }
  332. /*
  333. *
  334. * Name: restore_file
  335. *
  336. * Description:
  337. * resotre the original file, remove the backup
  338. *
  339. * Parameters:
  340. * bak(input): backup file name
  341. * orig(input): original file name
  342. *
  343. */
  344. void
  345. restore_file(const char *bak, const char *orig)
  346. {
  347. if ((unlink(orig)) != 0)
  348. (void) jnl_printf("Warning: failed to remove the bad file %s\n",
  349. orig);
  350. if ((link(bak, orig)) != 0)
  351. (void) jnl_printf("Warning: failed to restore %s from %s\n",
  352. orig, bak);
  353. if ((unlink(bak)) != 0)
  354. (void) jnl_printf("Warning: failed to remove "
  355. "the backup file %s\n", bak);
  356. }
  357. /*
  358. *
  359. * Name: kmf_test_initialize
  360. *
  361. * Description:
  362. * Invoke kmf_initialize to initialize KMF API tests
  363. *
  364. * Parameters:
  365. * outhandle(output): KMF handle
  366. * policyname(input): policy name
  367. *
  368. * Returns:
  369. * 0: successful
  370. * 1: failed
  371. *
  372. */
  373. int
  374. kmf_test_initialize(KMF_HANDLE_T *outhandle, char *policyname)
  375. {
  376. KMF_RETURN rv;
  377. int ret = 0;
  378. char envvar[1024];
  379. KMF_CREDENTIAL newpin, oldcred;
  380. KMF_ATTRIBUTE attrlist[8];
  381. KMF_KEYSTORE_TYPE kstype = 0;
  382. int numattr = 0;
  383. softtoken_dir = malloc(1024);
  384. if (softtoken_dir == NULL) {
  385. (void) jnl_printf("Failed to create softtoken directory - "
  386. "out of memory.\n");
  387. return (1);
  388. }
  389. /* Create a temporary softtoken directory for each test. */
  390. (void) snprintf(softtoken_dir, 1024, "/var/tmp/kmftest-%d", getpid());
  391. if (mkdir(softtoken_dir, 0755) == -1) {
  392. (void) jnl_printf("Failed to create softtoken directory "
  393. "%s: %s\n", softtoken_dir, strerror(errno));
  394. free(softtoken_dir);
  395. softtoken_dir = NULL;
  396. return (1);
  397. }
  398. (void) snprintf(envvar, sizeof (envvar),
  399. "SOFTTOKEN_DIR=%s", softtoken_dir);
  400. if (snprintf(softtoken_dir, 1024,
  401. "%s", envvar) != strlen(envvar)) {
  402. (void) jnl_printf("Failed to create SOFTTOKEN_DIR variable - "
  403. "out of memory.\n");
  404. return (1);
  405. }
  406. if (putenv(softtoken_dir) != 0) {
  407. (void) jnl_printf("Failed to create SOFTTOKEN_DIR variable - "
  408. "putenv error.\n");
  409. return (1);
  410. }
  411. if ((rv = kmf_initialize(outhandle, NULL, policyname)) != KMF_OK) {
  412. (void) jnl_printf("kmf_initialize failed with %s\n",
  413. kmf_rvtostr(rv));
  414. ret = 1;
  415. }
  416. kstype = KMF_KEYSTORE_PK11TOKEN;
  417. char *pk11_label = DEFAULT_PK11TOKEN;
  418. boolean_t pk11_readonly = B_FALSE;
  419. numattr = 0;
  420. kmf_set_attr_at_index(attrlist, numattr++, KMF_KEYSTORE_TYPE_ATTR,
  421. &kstype, sizeof (KMF_KEYSTORE_TYPE));
  422. kmf_set_attr_at_index(attrlist, numattr++, KMF_TOKEN_LABEL_ATTR,
  423. pk11_label, strlen(pk11_label));
  424. kmf_set_attr_at_index(attrlist, numattr++, KMF_READONLY_ATTR,
  425. &pk11_readonly, sizeof (boolean_t));
  426. /*
  427. * Configure handle for PKCS#11 use.
  428. */
  429. rv = kmf_configure_keystore(*outhandle, numattr, attrlist);
  430. numattr = 0;
  431. if (rv != KMF_OK && rv != KMF_ERR_TOKEN_SELECTED) {
  432. (void) jnl_printf("Error configure PKCS#11: %s\n",
  433. kmf_rvtostr(rv));
  434. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  435. ret = 1;
  436. goto out;
  437. }
  438. /* Initialize the token pin for the PKCS#11 token */
  439. newpin.cred = strdup(DEFAULT_PASSWORD);
  440. newpin.credlen = strlen(newpin.cred);
  441. oldcred.cred = "changeme";
  442. oldcred.credlen = strlen(oldcred.cred);
  443. numattr = 0;
  444. numattr = set_setpin_params(attrlist,
  445. &kstype, DEFAULT_PK11TOKEN, &oldcred);
  446. kmf_set_attr_at_index(attrlist, numattr++, KMF_NEWPIN_ATTR,
  447. &newpin, sizeof (newpin));
  448. rv = kmf_set_token_pin(*outhandle, numattr, attrlist);
  449. if (rv != KMF_OK) {
  450. (void) jnl_printf("Error initializing PKCS#11 token pin: %s\n",
  451. kmf_rvtostr(rv));
  452. ret = 1;
  453. goto out;
  454. }
  455. /*
  456. * Initialize the NSS token pin for each test.
  457. */
  458. numattr = 0;
  459. kstype = KMF_KEYSTORE_NSS;
  460. char *nssdir = getenv("SOFTTOKEN_DIR");
  461. kmf_set_attr_at_index(attrlist, numattr++, KMF_KEYSTORE_TYPE_ATTR,
  462. &kstype, sizeof (KMF_KEYSTORE_TYPE));
  463. kmf_set_attr_at_index(attrlist, numattr++, KMF_DIRPATH_ATTR,
  464. nssdir, strlen(nssdir));
  465. /*
  466. * Configure handle for NSS use.
  467. */
  468. rv = kmf_configure_keystore(*outhandle, numattr, attrlist);
  469. numattr = 0;
  470. if (rv != KMF_OK && rv != KMF_KEYSTORE_ALREADY_INITIALIZED) {
  471. jnl_printf("kmf_configure_keystore (nss) failed "
  472. "with %s", kmf_rvtostr(rv));
  473. jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  474. ret = 1;
  475. goto out;
  476. }
  477. oldcred.cred = DEFAULT_PASSWORD;
  478. oldcred.credlen = strlen(oldcred.cred);
  479. kstype = KMF_KEYSTORE_NSS;
  480. numattr = set_setpin_params(attrlist, &kstype,
  481. DEFAULT_NSSLABEL, &oldcred);
  482. kmf_set_attr_at_index(attrlist, numattr, KMF_NEWPIN_ATTR,
  483. &newpin, sizeof (newpin));
  484. numattr++;
  485. rv = kmf_set_token_pin(*outhandle, numattr, attrlist);
  486. if (rv != KMF_OK) {
  487. (void) jnl_printf("Error initializing NSS token pin: %s\n",
  488. kmf_rvtostr(rv));
  489. }
  490. free(newpin.cred);
  491. out:
  492. return (ret);
  493. }
  494. /*
  495. *
  496. * Name: kmf_test_finalize
  497. *
  498. * Description:
  499. * Invoke kmf_finalize to finalize KMF API tests
  500. *
  501. * Parameter:
  502. * handle(input): KMF handle
  503. *
  504. */
  505. void
  506. kmf_test_finalize(KMF_HANDLE_T handle)
  507. {
  508. KMF_RETURN rv;
  509. char syscmd[2048];
  510. if ((rv = kmf_finalize(handle)) != KMF_OK) {
  511. (void) jnl_printf("Warning: kmf_finalize failed with %s\n",
  512. kmf_rvtostr(rv));
  513. }
  514. /* cleanup NSS databases so the next test is clean */
  515. (void) unlink("cert8.db");
  516. (void) unlink("key3.db");
  517. (void) unlink("secmod.db");
  518. (void) unlink("prikey.der");
  519. /* cleanup the temporary softtoken directory */
  520. if (getenv("SOFTTOKEN_DIR")) {
  521. (void) snprintf(syscmd, sizeof (syscmd), "/bin/rm -rf %s",
  522. getenv("SOFTTOKEN_DIR"));
  523. (void) system(syscmd);
  524. }
  525. if (softtoken_dir)
  526. free(softtoken_dir);
  527. softtoken_dir = NULL;
  528. }
  529. int
  530. test_malloc(const char *p)
  531. {
  532. char *tmp = NULL;
  533. tmp = strdup(p);
  534. if (tmp == NULL) {
  535. (void) jnl_printf("Malloc failed");
  536. return (0);
  537. } else {
  538. free(tmp);
  539. return (1);
  540. }
  541. }
  542. /*
  543. * Name: set_createkeypair_params
  544. *
  545. * Description:
  546. * Set KMF_CREATEKEYPAIR_PARAMS
  547. *
  548. * Parameter:
  549. * params: parameter to be set
  550. * kstype: keystore type
  551. * keytype: key type
  552. * keylength: key length
  553. * password: password for keystore
  554. *
  555. * Returns:
  556. * 1: failed
  557. * 0: succussful
  558. *
  559. */
  560. int
  561. set_createkeypair_params(KMF_CREATEKEYPAIR_PARAMS *params,
  562. KMF_KEYSTORE_TYPE kstype, KMF_KEY_ALG keytype, uint32_t keylength,
  563. char *password)
  564. {
  565. int ret = 0;
  566. if (params == NULL) {
  567. ret = 1;
  568. goto out;
  569. }
  570. (void) memset(params, 0, sizeof (KMF_CREATEKEYPAIR_PARAMS));
  571. params->kstype = kstype;
  572. params->keytype = keytype;
  573. params->keylength = keylength;
  574. params->keylabel = strdup(KMF_KEY_PAIR);
  575. if (params->keylabel == NULL) {
  576. ret = 1;
  577. goto out;
  578. }
  579. params->cred.cred = password;
  580. if (password)
  581. params->cred.credlen = strlen(password);
  582. else
  583. params->cred.credlen = 0;
  584. if (kstype == KMF_KEYSTORE_NSS) { /* NSS */
  585. params->nssparms.slotlabel = strdup(DEFAULT_NSSLABEL);
  586. if (params->nssparms.slotlabel == NULL) {
  587. ret = 1;
  588. goto out;
  589. }
  590. } else if (kstype == KMF_KEYSTORE_OPENSSL) { /* OpenSSL */
  591. params->sslparms.dirpath = strdup(SSL_DIR_PATH);
  592. if (params->sslparms.dirpath == NULL) {
  593. ret = 1;
  594. goto out;
  595. }
  596. params->sslparms.keyfile = strdup(SSL_KEY_FILE);
  597. if (params->sslparms.keyfile == NULL) {
  598. ret = 1;
  599. goto out;
  600. }
  601. params->sslparms.format = KMF_FORMAT_ASN1;
  602. }
  603. params->rsa_exponent.len = 0;
  604. out:
  605. if (ret) {
  606. (void) jnl_printf("set_createkeypair_params failed\n");
  607. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  608. free_createkeypair_params(params);
  609. }
  610. return (ret);
  611. }
  612. /*
  613. * Name: free_createkeypair_params
  614. *
  615. * Description:
  616. * Free heap memory used by KMF_CREATEKEYPAIR_PARAMS
  617. *
  618. * Parameter:
  619. * params: parameter to be freed
  620. *
  621. */
  622. void
  623. free_createkeypair_params(KMF_CREATEKEYPAIR_PARAMS *params)
  624. {
  625. if (params == NULL)
  626. return;
  627. if (params->keylabel != NULL)
  628. free(params->keylabel);
  629. if (params->kstype == KMF_KEYSTORE_NSS) {
  630. if (params->nssparms.slotlabel != NULL)
  631. free(params->nssparms.slotlabel);
  632. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  633. if (params->sslparms.dirpath != NULL)
  634. free(params->sslparms.dirpath);
  635. if (params->sslparms.keyfile != NULL)
  636. free(params->sslparms.keyfile);
  637. }
  638. }
  639. int
  640. set_createkeypair_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  641. KMF_CREATEKEYPAIR_PARAMS *params,
  642. KMF_KEY_HANDLE *privKey, KMF_KEY_HANDLE *pubKey)
  643. {
  644. int ret = 0;
  645. int i = 0;
  646. if (NULL != privKey) {
  647. kmf_set_attr_at_index(attlist, i,
  648. KMF_PRIVKEY_HANDLE_ATTR,
  649. privKey, sizeof (KMF_KEY_HANDLE));
  650. i++;
  651. }
  652. if (NULL != pubKey) {
  653. kmf_set_attr_at_index(attlist, i, KMF_PUBKEY_HANDLE_ATTR,
  654. pubKey, sizeof (KMF_KEY_HANDLE));
  655. i++;
  656. }
  657. if (NULL != params) {
  658. kmf_set_attr_at_index(attlist, i,
  659. KMF_KEYSTORE_TYPE_ATTR, &params->kstype,
  660. sizeof (params->kstype));
  661. i++;
  662. kmf_set_attr_at_index(attlist, i,
  663. KMF_KEYALG_ATTR, &params->keytype,
  664. sizeof (params->keytype));
  665. i++;
  666. kmf_set_attr_at_index(attlist, i,
  667. KMF_KEYLENGTH_ATTR, &params->keylength,
  668. sizeof (params->keylength));
  669. i++;
  670. if (params->keylabel != NULL) {
  671. kmf_set_attr_at_index(attlist, i,
  672. KMF_KEYLABEL_ATTR, params->keylabel,
  673. strlen(params->keylabel));
  674. i++;
  675. }
  676. if (params->cred.credlen > 0) {
  677. kmf_set_attr_at_index(attlist, i,
  678. KMF_CREDENTIAL_ATTR, &params->cred,
  679. sizeof (KMF_CREDENTIAL));
  680. i++;
  681. }
  682. if (params->rsa_exponent.len > 0) {
  683. kmf_set_attr_at_index(attlist, i,
  684. KMF_RSAEXP_ATTR, &params->rsa_exponent,
  685. sizeof (KMF_BIGINT));
  686. i++;
  687. }
  688. if (params->kstype == KMF_KEYSTORE_NSS) {
  689. if (params->nssparms.slotlabel != NULL) {
  690. kmf_set_attr_at_index(attlist, i,
  691. KMF_TOKEN_LABEL_ATTR,
  692. params->nssparms.slotlabel,
  693. strlen(params->nssparms.slotlabel));
  694. i++;
  695. }
  696. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  697. if (params->sslparms.dirpath != NULL) {
  698. kmf_set_attr_at_index(attlist, i,
  699. KMF_DIRPATH_ATTR,
  700. params->sslparms.dirpath,
  701. strlen(params->sslparms.dirpath));
  702. i++;
  703. }
  704. if (params->sslparms.keyfile != NULL) {
  705. kmf_set_attr_at_index(attlist, i,
  706. KMF_KEY_FILENAME_ATTR,
  707. params->sslparms.keyfile,
  708. strlen(params->sslparms.keyfile));
  709. i++;
  710. }
  711. kmf_set_attr_at_index(attlist, i,
  712. KMF_ENCODE_FORMAT_ATTR,
  713. &params->sslparms.format,
  714. sizeof (params->sslparms.format));
  715. i++;
  716. }
  717. }
  718. *attnum = i;
  719. return (ret);
  720. }
  721. int
  722. create_keypair(KMF_HANDLE_T handle,
  723. KMF_KEY_HANDLE *privKey, KMF_KEY_HANDLE *pubKey,
  724. KMF_KEYSTORE_TYPE kstype, KMF_KEY_ALG keytype, uint32_t keylength,
  725. char *password)
  726. {
  727. int ret = 0;
  728. KMF_RETURN rv;
  729. KMF_CREATEKEYPAIR_PARAMS params;
  730. KMF_ATTRIBUTE attlist[32];
  731. int numattr;
  732. if (handle == NULL || privKey == NULL || pubKey == NULL) {
  733. ret = 1;
  734. goto out;
  735. }
  736. if ((ret = set_createkeypair_params(&params, kstype, keytype,
  737. keylength, password)))
  738. return (ret);
  739. if ((ret = set_createkeypair_attrs(attlist, &numattr, &params,
  740. privKey, pubKey)))
  741. goto out;
  742. rv = kmf_create_keypair(handle, numattr, attlist);
  743. if (rv != KMF_OK) {
  744. (void) jnl_printf("kmf_create_keypair failed with %s\n",
  745. kmf_rvtostr(rv));
  746. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  747. ret = 2;
  748. goto out;
  749. }
  750. out:
  751. free_createkeypair_params(&params);
  752. return (ret);
  753. }
  754. int
  755. testcall(KMF_RETURN kmf_ret, char *func)
  756. {
  757. if (kmf_ret != KMF_OK) {
  758. (void) jnl_printf("%s failed with %s\n", func,
  759. kmf_rvtostr(kmf_ret));
  760. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  761. return (1);
  762. }
  763. return (0);
  764. }
  765. static int
  766. build_x509_nokeyusage_cert(KMF_HANDLE_T kmfhandle,
  767. KMF_X509_CERTIFICATE *cert,
  768. uchar_t *sernum, uint32_t numlen, KMF_KEY_HANDLE *key)
  769. {
  770. KMF_BIGINT SerialNumber;
  771. KMF_X509_NAME *issuer_name_ptr = NULL;
  772. KMF_X509_NAME *subject_name_ptr = NULL;
  773. char *subject_name_string = "C=CH, O=Sun, CN=hua.tang@sun.com";
  774. char *issuer_name_string = "C=CH, O=Sun, CN=hua.tang@sun.com";
  775. KMF_X509_NAME cert_issuer_name, cert_subject_name;
  776. KMF_GENERALNAMECHOICES nametype = GENNAME_RFC822NAME;
  777. char *namedata = "hua.tang@sun.com";
  778. (void) memset(cert, 0, sizeof (KMF_X509_CERTIFICATE));
  779. if (testcall(kmf_set_cert_version(cert, 2), "KMF_SetCertVersion"))
  780. goto fail_out;
  781. if (testcall(kmf_set_cert_validity(cert, NULL, 3650*24*60*60),
  782. "KMF_SetCertValidityTimes"))
  783. goto fail_out;
  784. SerialNumber.val = sernum;
  785. SerialNumber.len = numlen;
  786. if (testcall(kmf_set_cert_serial(cert, &SerialNumber),
  787. "KMF_SetCertSerialNumber"))
  788. goto fail_out;
  789. if (testcall(kmf_dn_parser(issuer_name_string, &cert_issuer_name),
  790. "KMF_DNParser"))
  791. goto fail_out;
  792. issuer_name_ptr = &cert_issuer_name;
  793. if (testcall(kmf_set_cert_issuer(cert, issuer_name_ptr),
  794. "KMF_SetCertIssuerName"))
  795. goto fail_out;
  796. if (testcall(kmf_dn_parser(subject_name_string, &cert_subject_name),
  797. "KMF_DNParser"))
  798. goto fail_out;
  799. subject_name_ptr = &cert_subject_name;
  800. if (testcall(kmf_set_cert_subject(cert, subject_name_ptr),
  801. "KMF_SetCertSubjectName"))
  802. goto fail_out;
  803. if (testcall(kmf_set_cert_pubkey(kmfhandle, key, cert),
  804. "KMF_SetCertPubKey"))
  805. goto fail_out;
  806. if (testcall(kmf_set_cert_sig_alg(cert,
  807. KMF_ALGID_MD5WithRSA), "KMF_SetCertSignatureAlgorithm"))
  808. goto fail_out;
  809. return (0);
  810. fail_out:
  811. return (1);
  812. }
  813. int
  814. build_x509_cert(KMF_HANDLE_T kmfhandle, KMF_X509_CERTIFICATE *cert,
  815. uchar_t *sernum, uint32_t numlen, KMF_KEY_HANDLE *key)
  816. {
  817. KMF_GENERALNAMECHOICES nametype = GENNAME_RFC822NAME;
  818. char *namedata = "hua.tang@sun.com";
  819. KMF_X509EXT_BASICCONSTRAINTS bc;
  820. if (build_x509_nokeyusage_cert(kmfhandle, cert, sernum, numlen, key))
  821. goto fail_out;
  822. bc.cA = B_TRUE;
  823. bc.pathLenConstraintPresent = B_FALSE;
  824. if (testcall(kmf_set_cert_basic_constraint(cert, B_TRUE, &bc),
  825. "KMF_SetCertBasicConstraintExt"))
  826. goto fail_out;
  827. if (testcall(kmf_set_cert_subject_altname(cert, 1, nametype, namedata),
  828. "KMF_SetCertSubjectAltName"))
  829. goto fail_out;
  830. if (testcall(kmf_set_cert_issuer_altname(cert, 1, nametype, namedata),
  831. "KMF_SetCertIssuerAltName"))
  832. goto fail_out;
  833. if (testcall(kmf_add_cert_eku(cert,
  834. (KMF_OID *)&KMFOID_PKIX_KP_ServerAuth, 1), "KMF_AddCertEKU"))
  835. goto fail_out;
  836. if (testcall(kmf_set_cert_ku(cert, 0,
  837. (KMF_dataEncipherment | KMF_digitalSignature | KMF_keyCertSign)),
  838. "KMF_SetCertKeyUsage"))
  839. goto fail_out;
  840. return (0);
  841. fail_out:
  842. return (1);
  843. }
  844. /* no extension, no keysuage */
  845. int
  846. build_x509_base_cert(KMF_HANDLE_T kmfhandle, KMF_X509_CERTIFICATE *cert,
  847. uchar_t *sernum, uint32_t numlen, KMF_KEY_HANDLE *key)
  848. {
  849. if (build_x509_nokeyusage_cert(kmfhandle, cert, sernum, numlen, key))
  850. goto fail_out;
  851. if (testcall(kmf_set_cert_ku(cert, 0,
  852. KMF_keyAgreement), "KMF_SetCertKeyUsage"))
  853. goto fail_out;
  854. return (0);
  855. fail_out:
  856. return (1);
  857. }
  858. int
  859. sign_cert_record(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
  860. KMF_X509_CERTIFICATE *cert, KMF_DATA *signedCertData)
  861. {
  862. int i = 0;
  863. KMF_ATTRIBUTE attrlist[8];
  864. kmf_set_attr_at_index(attrlist, i, KMF_KEYSTORE_TYPE_ATTR,
  865. &key->kstype, sizeof (KMF_KEYSTORE_TYPE));
  866. i++;
  867. kmf_set_attr_at_index(attrlist, i, KMF_KEY_HANDLE_ATTR,
  868. key, sizeof (KMF_KEY_HANDLE));
  869. i++;
  870. kmf_set_attr_at_index(attrlist, i, KMF_X509_CERTIFICATE_ATTR,
  871. cert, sizeof (KMF_X509_CERTIFICATE));
  872. i++;
  873. kmf_set_attr_at_index(attrlist, i, KMF_CERT_DATA_ATTR,
  874. signedCertData, sizeof (KMF_DATA));
  875. i++;
  876. if (testcall(kmf_sign_cert(handle, i, attrlist), "kmf_sign_cert"))
  877. return (1);
  878. return (0);
  879. }
  880. int
  881. sign_cert_with_key(KMF_HANDLE_T kmfhandle, KMF_CREATEKEYPAIR_PARAMS *params,
  882. KMF_KEY_HANDLE *privKey, KMF_KEY_HANDLE *pubKey,
  883. KMF_KEYSTORE_TYPE kstype, KMF_KEY_ALG keytype, uint32_t keylength,
  884. char *password, KMF_X509_CERTIFICATE *cert,
  885. uchar_t *sernum, uint32_t numlen, KMF_DATA *x509Cert)
  886. {
  887. int ret = 0;
  888. if (create_keypair(kmfhandle, privKey, pubKey,
  889. kstype, keytype, keylength, password)) {
  890. ret = 1;
  891. goto out;
  892. }
  893. if (build_x509_cert(kmfhandle, cert, sernum, numlen, pubKey)) {
  894. ret = 2;
  895. goto out;
  896. }
  897. if (sign_cert_record(kmfhandle, privKey, cert, x509Cert)) {
  898. ret = 3;
  899. }
  900. out:
  901. return (ret);
  902. }
  903. int
  904. create_signed_cert(KMF_HANDLE_T kmfhandle, KMF_CREATEKEYPAIR_PARAMS *params,
  905. KMF_KEY_HANDLE *privKey, KMF_KEY_HANDLE *pubKey,
  906. KMF_KEYSTORE_TYPE kstype, KMF_KEY_ALG keytype, uint32_t keylength,
  907. char *password, KMF_X509_CERTIFICATE *cert,
  908. uchar_t *sernum, uint32_t numlen, KMF_DATA *x509Cert)
  909. {
  910. int ret = 0;
  911. if (create_keypair(kmfhandle, privKey, pubKey,
  912. kstype, keytype, keylength, password)) {
  913. ret = 1;
  914. goto out;
  915. }
  916. if (build_x509_cert(kmfhandle, cert, sernum, numlen, pubKey)) {
  917. ret = 2;
  918. goto out;
  919. }
  920. if (sign_cert_record(kmfhandle, privKey, cert, x509Cert)) {
  921. ret = 3;
  922. goto out;
  923. }
  924. out:
  925. return (ret);
  926. }
  927. int
  928. encode_cert_record(KMF_HANDLE_T kmfhandle, KMF_CREATEKEYPAIR_PARAMS *params,
  929. KMF_KEY_HANDLE *privKey, KMF_KEY_HANDLE *pubKey,
  930. KMF_KEYSTORE_TYPE kstype, KMF_KEY_ALG keytype, uint32_t keylength,
  931. char *password, KMF_X509_CERTIFICATE *cert,
  932. uchar_t *sernum, uint32_t numlen, KMF_DATA *encodeCert)
  933. {
  934. int ret = 0;
  935. if (create_keypair(kmfhandle, privKey, pubKey,
  936. kstype, keytype, keylength, password)) {
  937. ret = 1;
  938. goto out;
  939. }
  940. if (build_x509_cert(kmfhandle, cert, sernum, numlen, pubKey)) {
  941. ret = 2;
  942. goto out;
  943. }
  944. if (kmf_encode_cert_record(cert, encodeCert) != KMF_OK) {
  945. ret = 3;
  946. goto out;
  947. }
  948. out:
  949. return (ret);
  950. }
  951. /*
  952. * Name: set_cryptowithcert_params
  953. *
  954. * Description:
  955. * Set KMF_CRYPTOWITHCERT_PARAMS
  956. *
  957. * Parameter:
  958. * params: parameter to be set
  959. * kstype: keystore type
  960. * format: key format
  961. * password: password for keystore
  962. *
  963. * Returns:
  964. * 1: failed
  965. * 0: succussful
  966. *
  967. */
  968. int
  969. set_cryptowithcert_params(KMF_CRYPTOWITHCERT_PARAMS *params,
  970. KMF_KEYSTORE_TYPE kstype, KMF_ENCODE_FORMAT format, char *password)
  971. {
  972. int ret = 0;
  973. if (params == NULL) {
  974. ret = 1;
  975. goto out;
  976. }
  977. (void) memset(params, 0, sizeof (KMF_CRYPTOWITHCERT_PARAMS));
  978. params->kstype = kstype;
  979. params->format = format;
  980. params->certLabel = strdup(KMF_CERT_LABEL);
  981. if (params->certLabel == NULL) {
  982. ret = 1;
  983. goto out;
  984. }
  985. params->cred.cred = password;
  986. if (password)
  987. params->cred.credlen = strlen(password);
  988. else
  989. params->cred.credlen = 0;
  990. if (kstype == KMF_KEYSTORE_NSS) { /* NSS */
  991. params->nssparms.slotlabel = strdup(DEFAULT_NSSLABEL);
  992. if (params->nssparms.slotlabel == NULL) {
  993. ret = 1;
  994. goto out;
  995. }
  996. } else if (kstype == KMF_KEYSTORE_OPENSSL) { /* OpenSSL */
  997. params->sslparms.dirpath = strdup(SSL_DIR_PATH);
  998. if (params->sslparms.dirpath == NULL) {
  999. ret = 1;
  1000. goto out;
  1001. }
  1002. params->sslparms.keyfile = strdup(SSL_KEY_FILE);
  1003. if (params->sslparms.keyfile == NULL) {
  1004. ret = 1;
  1005. goto out;
  1006. }
  1007. params->sslparms.format = KMF_FORMAT_ASN1;
  1008. }
  1009. out:
  1010. if (ret) {
  1011. (void) jnl_printf("set_cryptowithcert_params failed\n");
  1012. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  1013. free_cryptowithcert_params(params);
  1014. }
  1015. return (ret);
  1016. }
  1017. /*
  1018. * Name: free_cryptowithcert_params
  1019. *
  1020. * Description:
  1021. * Free heap memory used by KMF_CRYPTOWITHCERT_PARAMS
  1022. *
  1023. * Parameter:
  1024. * params: parameter to be freed
  1025. *
  1026. */
  1027. void
  1028. free_cryptowithcert_params(KMF_CRYPTOWITHCERT_PARAMS *params)
  1029. {
  1030. if (params == NULL)
  1031. return;
  1032. if (params->certLabel != NULL)
  1033. free(params->certLabel);
  1034. if (params->kstype == KMF_KEYSTORE_NSS) {
  1035. if (params->nssparms.slotlabel != NULL)
  1036. free(params->nssparms.slotlabel);
  1037. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  1038. if (params->sslparms.dirpath != NULL)
  1039. free(params->sslparms.dirpath);
  1040. if (params->sslparms.keyfile != NULL)
  1041. free(params->sslparms.keyfile);
  1042. }
  1043. }
  1044. int
  1045. set_cryptowithcert_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  1046. KMF_CRYPTOWITHCERT_PARAMS *params, KMF_DATA *cert,
  1047. KMF_DATA *plaintext, KMF_DATA *ciphertext)
  1048. {
  1049. int i = 0;
  1050. int ret = 0;
  1051. if (cert) {
  1052. kmf_set_attr_at_index(attlist, i, KMF_CERT_DATA_ATTR,
  1053. cert, sizeof (KMF_DATA));
  1054. i++;
  1055. }
  1056. if (plaintext) {
  1057. kmf_set_attr_at_index(attlist, i, KMF_PLAINTEXT_DATA_ATTR,
  1058. plaintext, sizeof (KMF_DATA));
  1059. i++;
  1060. }
  1061. if (ciphertext) {
  1062. kmf_set_attr_at_index(attlist, i, KMF_CIPHERTEXT_DATA_ATTR,
  1063. ciphertext, sizeof (KMF_DATA));
  1064. i++;
  1065. }
  1066. if (NULL == params) {
  1067. *attnum = i;
  1068. return (ret);
  1069. }
  1070. kmf_set_attr_at_index(attlist, i,
  1071. KMF_KEYSTORE_TYPE_ATTR, &params->kstype,
  1072. sizeof (params->kstype));
  1073. i++;
  1074. if (params->certLabel != NULL) {
  1075. kmf_set_attr_at_index(attlist, i, KMF_CERT_LABEL_ATTR,
  1076. params->certLabel, strlen(params->certLabel));
  1077. i++;
  1078. }
  1079. kmf_set_attr_at_index(attlist, i, KMF_ENCODE_FORMAT_ATTR,
  1080. &params->format, sizeof (KMF_ENCODE_FORMAT));
  1081. i++;
  1082. kmf_set_attr_at_index(attlist, i, KMF_CREDENTIAL_ATTR,
  1083. &params->cred, sizeof (KMF_CREDENTIAL));
  1084. i++;
  1085. if (params->kstype == KMF_KEYSTORE_NSS) {
  1086. if (params->nssparms.slotlabel != NULL) {
  1087. kmf_set_attr_at_index(attlist, i,
  1088. KMF_TOKEN_LABEL_ATTR,
  1089. params->nssparms.slotlabel,
  1090. strlen(params->nssparms.slotlabel));
  1091. i++;
  1092. }
  1093. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  1094. if (params->sslparms.dirpath != NULL) {
  1095. kmf_set_attr_at_index(attlist, i,
  1096. KMF_DIRPATH_ATTR,
  1097. params->sslparms.dirpath,
  1098. strlen(params->sslparms.dirpath));
  1099. i++;
  1100. }
  1101. if (params->sslparms.keyfile != NULL) {
  1102. kmf_set_attr_at_index(attlist, i,
  1103. KMF_KEY_FILENAME_ATTR,
  1104. params->sslparms.keyfile,
  1105. strlen(params->sslparms.keyfile));
  1106. i++;
  1107. }
  1108. kmf_set_attr_at_index(attlist, i, KMF_ENCODE_FORMAT_ATTR,
  1109. &params->sslparms.format,
  1110. sizeof (params->sslparms.format));
  1111. i++;
  1112. }
  1113. *attnum = i;
  1114. return (ret);
  1115. }
  1116. int
  1117. create_base_signed_cert(KMF_HANDLE_T kmfhandle,
  1118. KMF_CREATEKEYPAIR_PARAMS *params,
  1119. KMF_KEY_HANDLE *privKey, KMF_KEY_HANDLE *pubKey,
  1120. KMF_KEYSTORE_TYPE kstype, KMF_KEY_ALG keytype, uint32_t keylength,
  1121. char *password, KMF_X509_CERTIFICATE *cert,
  1122. uchar_t *sernum, uint32_t numlen, KMF_DATA *x509Cert)
  1123. {
  1124. int ret = 0;
  1125. if (create_keypair(kmfhandle, privKey, pubKey,
  1126. kstype, keytype, keylength, password)) {
  1127. ret = 1;
  1128. goto out;
  1129. }
  1130. if (build_x509_base_cert(kmfhandle, cert, sernum, numlen, pubKey)) {
  1131. ret = 2;
  1132. goto out;
  1133. }
  1134. if (sign_cert_record(kmfhandle, privKey, cert, x509Cert)) {
  1135. ret = 3;
  1136. goto out;
  1137. }
  1138. out:
  1139. return (ret);
  1140. }
  1141. /*
  1142. * Name: set_storecert_params
  1143. *
  1144. * Description:
  1145. * Set KMF_STORECERT_PARAMS
  1146. *
  1147. * Parameter:
  1148. * params: parameter to be set
  1149. * kstype: keystore type
  1150. * certlabel: cert label
  1151. * keyfile: ssl private key file
  1152. * certfile: ssl cert file name
  1153. *
  1154. * Returns:
  1155. * 1: failed
  1156. * 0: succussful
  1157. *
  1158. */
  1159. int
  1160. set_storecert_params(KMF_STORECERT_PARAMS *params,
  1161. KMF_KEYSTORE_TYPE kstype,
  1162. char *certlabel, char *keyfile, char *certfile)
  1163. {
  1164. int ret = 0;
  1165. if (params == NULL) {
  1166. ret = 1;
  1167. goto out;
  1168. }
  1169. (void) memset(params, 0, sizeof (KMF_STORECERT_PARAMS));
  1170. params->kstype = kstype;
  1171. params->certLabel = certlabel;
  1172. if (kstype == KMF_KEYSTORE_NSS) { /* NSS */
  1173. params->nssparms.slotlabel = strdup(DEFAULT_NSSLABEL);
  1174. if (params->nssparms.slotlabel == NULL) {
  1175. ret = 1;
  1176. goto out;
  1177. }
  1178. params->nssparms.trustflag = strdup(NSS_TRUST_FLAG);
  1179. if (params->nssparms.trustflag == NULL) {
  1180. ret = 1;
  1181. goto out;
  1182. }
  1183. } else if (kstype == KMF_KEYSTORE_OPENSSL) { /* OpenSSL */
  1184. params->sslparms.dirpath = strdup(SSL_DIR_PATH);
  1185. if (params->sslparms.dirpath == NULL) {
  1186. ret = 1;
  1187. goto out;
  1188. }
  1189. params->sslparms.keyfile = keyfile;
  1190. params->sslparms.certfile = certfile;
  1191. params->sslparms.format = KMF_FORMAT_ASN1;
  1192. }
  1193. out:
  1194. if (ret) {
  1195. (void) jnl_printf("set_storecert_params failed\n");
  1196. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  1197. free_storecert_params(params);
  1198. }
  1199. return (ret);
  1200. }
  1201. /*
  1202. * Name: free_storecert_params
  1203. *
  1204. * Description:
  1205. * Free heap memory used by KMF_STORECERT_PARAMS
  1206. *
  1207. * Parameter:
  1208. * params: parameter to be freed
  1209. *
  1210. */
  1211. void
  1212. free_storecert_params(KMF_STORECERT_PARAMS *params)
  1213. {
  1214. if (params == NULL)
  1215. return;
  1216. if (params->kstype == KMF_KEYSTORE_NSS) {
  1217. if (params->nssparms.slotlabel != NULL)
  1218. free(params->nssparms.slotlabel);
  1219. if (params->nssparms.trustflag != NULL)
  1220. free(params->nssparms.trustflag);
  1221. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  1222. if (params->sslparms.dirpath != NULL)
  1223. free(params->sslparms.dirpath);
  1224. }
  1225. }
  1226. int
  1227. set_storecert_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  1228. KMF_STORECERT_PARAMS *params, KMF_DATA *pcert)
  1229. {
  1230. int i = 0;
  1231. int ret = 0;
  1232. if (NULL != pcert) {
  1233. kmf_set_attr_at_index(attlist, i,
  1234. KMF_CERT_DATA_ATTR, pcert, sizeof (KMF_DATA));
  1235. i++;
  1236. }
  1237. if (NULL != params) {
  1238. kmf_set_attr_at_index(attlist, i,
  1239. KMF_KEYSTORE_TYPE_ATTR, &params->kstype,
  1240. sizeof (params->kstype));
  1241. i++;
  1242. if (params->kstype == KMF_KEYSTORE_NSS) {
  1243. if (params->certLabel != NULL) {
  1244. kmf_set_attr_at_index(attlist, i,
  1245. KMF_CERT_LABEL_ATTR, params->certLabel,
  1246. strlen(params->certLabel));
  1247. i++;
  1248. }
  1249. if (params->nssparms.trustflag != NULL) {
  1250. kmf_set_attr_at_index(attlist, i,
  1251. KMF_TRUSTFLAG_ATTR,
  1252. params->nssparms.trustflag,
  1253. strlen(params->nssparms.trustflag));
  1254. i++;
  1255. }
  1256. if (params->nssparms.slotlabel != NULL) {
  1257. kmf_set_attr_at_index(attlist, i,
  1258. KMF_TOKEN_LABEL_ATTR,
  1259. params->nssparms.slotlabel,
  1260. strlen(params->nssparms.slotlabel));
  1261. i++;
  1262. }
  1263. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  1264. /* certfile is a required attribute for OpenSSL */
  1265. if (params->sslparms.certfile != NULL) {
  1266. kmf_set_attr_at_index(attlist, i,
  1267. KMF_CERT_FILENAME_ATTR,
  1268. params->sslparms.certfile,
  1269. strlen(params->sslparms.certfile));
  1270. i++;
  1271. } else {
  1272. return (KMF_ERR_BAD_PARAMETER);
  1273. }
  1274. if (params->sslparms.dirpath != NULL) {
  1275. kmf_set_attr_at_index(attlist, i,
  1276. KMF_DIRPATH_ATTR,
  1277. params->sslparms.dirpath,
  1278. strlen(params->sslparms.dirpath));
  1279. i++;
  1280. }
  1281. kmf_set_attr_at_index(attlist, i,
  1282. KMF_ENCODE_FORMAT_ATTR,
  1283. &params->sslparms.format,
  1284. sizeof (params->sslparms.format));
  1285. i++;
  1286. } else if (params->kstype == KMF_KEYSTORE_PK11TOKEN) {
  1287. if (params->certLabel != NULL) {
  1288. kmf_set_attr_at_index(attlist, i,
  1289. KMF_CERT_LABEL_ATTR, params->certLabel,
  1290. strlen(params->certLabel));
  1291. i++;
  1292. }
  1293. }
  1294. }
  1295. *attnum = i;
  1296. return (ret);
  1297. }
  1298. /*
  1299. * Name: set_importcert_params
  1300. *
  1301. * Description:
  1302. * Set KMF_IMPORTCERT_PARAMS
  1303. *
  1304. * Parameter:
  1305. * params: parameter to be set
  1306. * kstype: keystore type
  1307. * certlabel: cert label
  1308. * certfile: cert file name to be imported
  1309. *
  1310. * Returns:
  1311. * 1: failed
  1312. * 0: succussful
  1313. *
  1314. */
  1315. int
  1316. set_importcert_params(KMF_IMPORTCERT_PARAMS *params,
  1317. KMF_KEYSTORE_TYPE kstype, char *certlabel, char *certfile)
  1318. {
  1319. int ret = 0;
  1320. if (params == NULL) {
  1321. ret = 1;
  1322. goto out;
  1323. }
  1324. (void) memset(params, 0, sizeof (KMF_IMPORTCERT_PARAMS));
  1325. params->kstype = kstype;
  1326. params->certLabel = certlabel;
  1327. params->certfile = certfile;
  1328. if (kstype == KMF_KEYSTORE_NSS) { /* NSS */
  1329. params->nssparms.slotlabel = strdup(DEFAULT_NSSLABEL);
  1330. if (params->nssparms.slotlabel == NULL) {
  1331. ret = 1;
  1332. goto out;
  1333. }
  1334. params->nssparms.trustflag = strdup(NSS_TRUST_FLAG);
  1335. if (params->nssparms.trustflag == NULL) {
  1336. ret = 1;
  1337. goto out;
  1338. }
  1339. }
  1340. out:
  1341. if (ret) {
  1342. (void) jnl_printf("set_importcert_params failed\n");
  1343. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  1344. free_importcert_params(params);
  1345. }
  1346. return (ret);
  1347. }
  1348. /*
  1349. * Name: free_importcert_params
  1350. *
  1351. * Description:
  1352. * Free heap memory used by KMF_IMPORTCERT_PARAMS
  1353. *
  1354. * Parameter:
  1355. * params: parameter to be freed
  1356. *
  1357. */
  1358. void
  1359. free_importcert_params(KMF_IMPORTCERT_PARAMS *params)
  1360. {
  1361. if (params == NULL)
  1362. return;
  1363. if (params->kstype == KMF_KEYSTORE_NSS) {
  1364. if (params->nssparms.slotlabel != NULL)
  1365. free(params->nssparms.slotlabel);
  1366. if (params->nssparms.trustflag != NULL)
  1367. free(params->nssparms.trustflag);
  1368. }
  1369. }
  1370. int
  1371. set_importcert_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  1372. KMF_IMPORTCERT_PARAMS *params)
  1373. {
  1374. int i = 0;
  1375. int ret = 0;
  1376. if (NULL == params) {
  1377. *attnum = i;
  1378. return (ret);
  1379. }
  1380. kmf_set_attr_at_index(attlist, i,
  1381. KMF_KEYSTORE_TYPE_ATTR, &params->kstype, sizeof (params->kstype));
  1382. i++;
  1383. kmf_set_attr_at_index(attlist, i, KMF_CERT_FILENAME_ATTR,
  1384. params->certfile, sizeof (params->certfile));
  1385. i++;
  1386. if (params->kstype == KMF_KEYSTORE_NSS) {
  1387. if (params->certLabel != NULL) {
  1388. kmf_set_attr_at_index(attlist, i, KMF_CERT_LABEL_ATTR,
  1389. params->certLabel, strlen(params->certLabel));
  1390. i++;
  1391. }
  1392. if (params->nssparms.trustflag != NULL) {
  1393. kmf_set_attr_at_index(attlist, i, KMF_TRUSTFLAG_ATTR,
  1394. params->nssparms.trustflag,
  1395. strlen(params->nssparms.trustflag));
  1396. i++;
  1397. }
  1398. if (params->nssparms.slotlabel != NULL) {
  1399. kmf_set_attr_at_index(attlist, i,
  1400. KMF_TOKEN_LABEL_ATTR,
  1401. params->nssparms.slotlabel,
  1402. strlen(params->nssparms.slotlabel));
  1403. i++;
  1404. }
  1405. } else if (params->kstype == KMF_KEYSTORE_PK11TOKEN) {
  1406. if (params->certLabel != NULL) {
  1407. kmf_set_attr_at_index(attlist, i, KMF_CERT_LABEL_ATTR,
  1408. params->certLabel, strlen(params->certLabel));
  1409. i++;
  1410. }
  1411. }
  1412. *attnum = i;
  1413. return (ret);
  1414. }
  1415. /*
  1416. * Name: set_exportp12_params
  1417. *
  1418. * Description:
  1419. * Set KMF_EXPORTP12_PARAMS
  1420. *
  1421. * Parameter:
  1422. * params: parameter to be set
  1423. * kstype: keystore type
  1424. * certlabel: cert label
  1425. * issuer: issuer name
  1426. * subject: cert subject
  1427. * idstr: id string
  1428. * serial: serial number
  1429. * token_password: password for keystore
  1430. * export_password: export password for keystore
  1431. * keyfile: ssl key file name
  1432. * certfile: ssl cert file name
  1433. * format: ssl cert encode format
  1434. *
  1435. * Returns:
  1436. * 1: failed
  1437. * 0: succussful
  1438. *
  1439. */
  1440. int
  1441. set_exportp12_params(KMF_EXPORTP12_PARAMS *params,
  1442. KMF_KEYSTORE_TYPE kstype, char *certlabel, char *issuer,
  1443. char *subject, char *idstr, KMF_BIGINT *serial,
  1444. char *token_password, char *export_password,
  1445. char *keyfile, char *certfile, KMF_ENCODE_FORMAT format)
  1446. {
  1447. int ret = 0;
  1448. if (params == NULL) {
  1449. ret = 1;
  1450. goto out;
  1451. }
  1452. (void) memset(params, 0, sizeof (KMF_EXPORTP12_PARAMS));
  1453. params->kstype = kstype;
  1454. params->certLabel = certlabel;
  1455. params->issuer = issuer;
  1456. params->subject = subject;
  1457. params->idstr = idstr;
  1458. params->serial = serial;
  1459. params->cred.cred = token_password;
  1460. params->p12cred.cred = export_password;
  1461. if (token_password)
  1462. params->cred.credlen = strlen(token_password);
  1463. else
  1464. params->cred.credlen = 0;
  1465. if (export_password)
  1466. params->p12cred.credlen = strlen(export_password);
  1467. else
  1468. params->p12cred.credlen = 0;
  1469. if (kstype == KMF_KEYSTORE_NSS) { /* NSS */
  1470. params->nssparms.slotlabel = strdup(DEFAULT_NSSLABEL);
  1471. if (params->nssparms.slotlabel == NULL) {
  1472. ret = 1;
  1473. goto out;
  1474. }
  1475. params->nssparms.trustflag = strdup(NSS_TRUST_FLAG);
  1476. if (params->nssparms.trustflag == NULL) {
  1477. ret = 1;
  1478. goto out;
  1479. }
  1480. } else if (kstype == KMF_KEYSTORE_OPENSSL) { /* OpenSSL */
  1481. params->sslparms.dirpath = strdup(SSL_DIR_PATH);
  1482. if (params->sslparms.dirpath == NULL) {
  1483. ret = 1;
  1484. goto out;
  1485. }
  1486. params->sslparms.keyfile = keyfile;
  1487. params->sslparms.certfile = certfile;
  1488. params->sslparms.format = format;
  1489. }
  1490. out:
  1491. if (ret) {
  1492. (void) jnl_printf("set_exportp12_params failed\n");
  1493. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  1494. free_exportp12_params(params);
  1495. }
  1496. return (ret);
  1497. }
  1498. /*
  1499. * Name: free_exportp12_params
  1500. *
  1501. * Description:
  1502. * Free heap memory used by KMF_EXPORTP12_PARAMS
  1503. *
  1504. * Parameter:
  1505. * params: parameter to be freed
  1506. *
  1507. */
  1508. void
  1509. free_exportp12_params(KMF_EXPORTP12_PARAMS *params)
  1510. {
  1511. if (params == NULL)
  1512. return;
  1513. if (params->kstype == KMF_KEYSTORE_NSS) {
  1514. if (params->nssparms.slotlabel != NULL)
  1515. free(params->nssparms.slotlabel);
  1516. if (params->nssparms.trustflag != NULL)
  1517. free(params->nssparms.trustflag);
  1518. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  1519. if (params->sslparms.dirpath != NULL)
  1520. free(params->sslparms.dirpath);
  1521. }
  1522. }
  1523. int
  1524. set_exportp12_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  1525. KMF_EXPORTP12_PARAMS *params, char *filename)
  1526. {
  1527. int i = 0;
  1528. int ret = 0;
  1529. if (NULL != filename) {
  1530. kmf_set_attr_at_index(attlist, i,
  1531. KMF_OUTPUT_FILENAME_ATTR, filename, strlen(filename));
  1532. i++;
  1533. }
  1534. if (NULL == params) {
  1535. *attnum = i;
  1536. return (ret);
  1537. }
  1538. kmf_set_attr_at_index(attlist, i,
  1539. KMF_KEYSTORE_TYPE_ATTR, &params->kstype, sizeof (params->kstype));
  1540. i++;
  1541. kmf_set_attr_at_index(attlist, i,
  1542. KMF_PK12CRED_ATTR, &params->p12cred, sizeof (KMF_CREDENTIAL));
  1543. i++;
  1544. if (params->kstype == KMF_KEYSTORE_NSS ||
  1545. params->kstype == KMF_KEYSTORE_PK11TOKEN) {
  1546. if (params->certLabel != NULL) {
  1547. kmf_set_attr_at_index(attlist, i,
  1548. KMF_CERT_LABEL_ATTR, params->certLabel,
  1549. strlen(params->certLabel));
  1550. i++;
  1551. }
  1552. if (params->issuer != NULL) {
  1553. kmf_set_attr_at_index(attlist, i,
  1554. KMF_ISSUER_NAME_ATTR, params->issuer,
  1555. strlen(params->issuer));
  1556. i++;
  1557. }
  1558. if (params->subject != NULL) {
  1559. kmf_set_attr_at_index(attlist, i,
  1560. KMF_SUBJECT_NAME_ATTR, params->subject,
  1561. strlen(params->subject));
  1562. i++;
  1563. }
  1564. if (params->serial != NULL) {
  1565. kmf_set_attr_at_index(attlist, i, KMF_BIGINT_ATTR,
  1566. params->serial, sizeof (KMF_BIGINT));
  1567. i++;
  1568. }
  1569. kmf_set_attr_at_index(attlist, i,
  1570. KMF_CREDENTIAL_ATTR, &params->cred,
  1571. sizeof (KMF_CREDENTIAL));
  1572. i++;
  1573. }
  1574. if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  1575. if (params->sslparms.dirpath != NULL) {
  1576. kmf_set_attr_at_index(attlist, i,
  1577. KMF_DIRPATH_ATTR,
  1578. params->sslparms.dirpath,
  1579. strlen(params->sslparms.dirpath));
  1580. i++;
  1581. }
  1582. if (params->sslparms.certfile != NULL) {
  1583. kmf_set_attr_at_index(attlist, i,
  1584. KMF_CERT_FILENAME_ATTR,
  1585. params->sslparms.certfile,
  1586. strlen(params->sslparms.certfile));
  1587. i++;
  1588. }
  1589. if (params->sslparms.keyfile != NULL) {
  1590. kmf_set_attr_at_index(attlist, i,
  1591. KMF_KEY_FILENAME_ATTR,
  1592. params->sslparms.keyfile,
  1593. strlen(params->sslparms.keyfile));
  1594. i++;
  1595. }
  1596. }
  1597. if (params->kstype == KMF_KEYSTORE_NSS) {
  1598. if (params->nssparms.slotlabel != NULL) {
  1599. kmf_set_attr_at_index(attlist, i,
  1600. KMF_TOKEN_LABEL_ATTR,
  1601. params->nssparms.slotlabel,
  1602. strlen(params->nssparms.slotlabel));
  1603. i++;
  1604. }
  1605. }
  1606. *attnum = i;
  1607. return (ret);
  1608. }
  1609. /*
  1610. * Name: set_findcert_params
  1611. *
  1612. * Description:
  1613. * Set KMF_FINDCERT_PARAMS
  1614. *
  1615. * Parameter:
  1616. * params: parameter to be set
  1617. * kstype: keystore type
  1618. * certlabel: cert label
  1619. * issuer: issuer name
  1620. * subject: cert subject
  1621. * idstr: id string
  1622. * serial: serial number
  1623. * validity: cert validity method
  1624. * keyfile: ssl key file name
  1625. * certfile: ssl cert file name
  1626. * format: ssl cert encode format
  1627. *
  1628. * Returns:
  1629. * 1: failed
  1630. * 0: succussful
  1631. *
  1632. */
  1633. int
  1634. set_findcert_params(KMF_FINDCERT_PARAMS *params,
  1635. KMF_KEYSTORE_TYPE kstype, char *certlabel, char *issuer,
  1636. char *subject, char *idstr, KMF_BIGINT *serial,
  1637. KMF_CERT_VALIDITY validity,
  1638. char *keyfile, char *certfile, KMF_ENCODE_FORMAT format)
  1639. {
  1640. int ret = 0;
  1641. if (params == NULL) {
  1642. ret = 1;
  1643. goto out;
  1644. }
  1645. (void) memset(params, 0, sizeof (KMF_FINDCERT_PARAMS));
  1646. params->kstype = kstype;
  1647. params->certLabel = certlabel;
  1648. params->issuer = issuer;
  1649. params->subject = subject;
  1650. params->idstr = idstr;
  1651. params->serial = serial;
  1652. params->find_cert_validity = validity;
  1653. if (kstype == KMF_KEYSTORE_NSS) { /* NSS */
  1654. params->nssparms.slotlabel = strdup(DEFAULT_NSSLABEL);
  1655. if (params->nssparms.slotlabel == NULL) {
  1656. ret = 1;
  1657. goto out;
  1658. }
  1659. params->nssparms.trustflag = strdup(NSS_TRUST_FLAG);
  1660. if (params->nssparms.trustflag == NULL) {
  1661. ret = 1;
  1662. goto out;
  1663. }
  1664. } else if (kstype == KMF_KEYSTORE_OPENSSL) { /* OpenSSL */
  1665. params->sslparms.dirpath = strdup(SSL_DIR_PATH);
  1666. if (params->sslparms.dirpath == NULL) {
  1667. ret = 1;
  1668. goto out;
  1669. }
  1670. params->sslparms.keyfile = keyfile;
  1671. params->sslparms.certfile = certfile;
  1672. params->sslparms.format = format;
  1673. } else if (kstype == KMF_KEYSTORE_PK11TOKEN) { /* pkcs11 */
  1674. params->pkcs11parms.private = B_TRUE;
  1675. }
  1676. out:
  1677. if (ret) {
  1678. (void) jnl_printf("set_findcert_params failed\n");
  1679. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  1680. free_findcert_params(params);
  1681. }
  1682. return (ret);
  1683. }
  1684. /*
  1685. * Name: free_findcert_params
  1686. *
  1687. * Description:
  1688. * Free heap memory used by KMF_FINDCERT_PARAMS
  1689. *
  1690. * Parameter:
  1691. * params: parameter to be freed
  1692. *
  1693. */
  1694. void
  1695. free_findcert_params(KMF_FINDCERT_PARAMS *params)
  1696. {
  1697. if (params == NULL)
  1698. return;
  1699. if (params->kstype == KMF_KEYSTORE_NSS) {
  1700. if (params->nssparms.slotlabel != NULL)
  1701. free(params->nssparms.slotlabel);
  1702. if (params->nssparms.trustflag != NULL)
  1703. free(params->nssparms.trustflag);
  1704. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  1705. if (params->sslparms.dirpath != NULL)
  1706. free(params->sslparms.dirpath);
  1707. }
  1708. }
  1709. int
  1710. set_findcert_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  1711. KMF_FINDCERT_PARAMS *params, KMF_X509_DER_CERT *kmf_cert,
  1712. uint32_t *numcerts)
  1713. {
  1714. int i = 0;
  1715. int ret = 0;
  1716. if (NULL != numcerts) {
  1717. kmf_set_attr_at_index(attlist, i,
  1718. KMF_COUNT_ATTR, numcerts, sizeof (uint32_t));
  1719. i++;
  1720. }
  1721. if (kmf_cert != NULL) {
  1722. kmf_set_attr_at_index(attlist, i,
  1723. KMF_X509_DER_CERT_ATTR, kmf_cert,
  1724. sizeof (KMF_X509_DER_CERT));
  1725. i++;
  1726. }
  1727. if (NULL != params) {
  1728. kmf_set_attr_at_index(attlist, i,
  1729. KMF_KEYSTORE_TYPE_ATTR, &params->kstype,
  1730. sizeof (params->kstype));
  1731. i++;
  1732. /* Set the optional searching attributes for all 3 plugins */
  1733. if (params->issuer != NULL) {
  1734. kmf_set_attr_at_index(attlist, i,
  1735. KMF_ISSUER_NAME_ATTR,
  1736. params->issuer, strlen(params->issuer));
  1737. i++;
  1738. }
  1739. if (params->subject != NULL) {
  1740. kmf_set_attr_at_index(attlist, i,
  1741. KMF_SUBJECT_NAME_ATTR,
  1742. params->subject, strlen(params->subject));
  1743. i++;
  1744. }
  1745. if (params->serial != NULL) {
  1746. kmf_set_attr_at_index(attlist, i, KMF_BIGINT_ATTR,
  1747. params->serial, sizeof (KMF_BIGINT));
  1748. i++;
  1749. }
  1750. kmf_set_attr_at_index(attlist, i, KMF_CERT_VALIDITY_ATTR,
  1751. &params->find_cert_validity, sizeof (KMF_CERT_VALIDITY));
  1752. i++;
  1753. if (params->kstype == KMF_KEYSTORE_NSS) {
  1754. if (params->certLabel != NULL) {
  1755. kmf_set_attr_at_index(attlist, i,
  1756. KMF_CERT_LABEL_ATTR,
  1757. params->certLabel,
  1758. strlen(params->certLabel));
  1759. i++;
  1760. }
  1761. if (params->nssparms.slotlabel != NULL) {
  1762. kmf_set_attr_at_index(attlist, i,
  1763. KMF_TOKEN_LABEL_ATTR,
  1764. params->nssparms.slotlabel,
  1765. strlen(params->nssparms.slotlabel));
  1766. i++;
  1767. }
  1768. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  1769. if (params->sslparms.certfile != NULL) {
  1770. kmf_set_attr_at_index(attlist, i,
  1771. KMF_CERT_FILENAME_ATTR,
  1772. params->sslparms.certfile,
  1773. strlen(params->sslparms.certfile));
  1774. i++;
  1775. }
  1776. if (params->sslparms.dirpath != NULL) {
  1777. kmf_set_attr_at_index(attlist, i,
  1778. KMF_DIRPATH_ATTR,
  1779. params->sslparms.dirpath,
  1780. strlen(params->sslparms.dirpath));
  1781. i++;
  1782. }
  1783. } else if (params->kstype == KMF_KEYSTORE_PK11TOKEN) {
  1784. if (params->certLabel != NULL) {
  1785. kmf_set_attr_at_index(attlist, i,
  1786. KMF_CERT_LABEL_ATTR,
  1787. params->certLabel,
  1788. strlen(params->certLabel));
  1789. i++;
  1790. }
  1791. kmf_set_attr_at_index(attlist, i,
  1792. KMF_PRIVATE_BOOL_ATTR,
  1793. &params->pkcs11parms.private,
  1794. sizeof (params->pkcs11parms.private));
  1795. i++;
  1796. }
  1797. }
  1798. *attnum = i;
  1799. return (ret);
  1800. }
  1801. int set_deletecert_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  1802. KMF_DELETECERT_PARAMS *params)
  1803. {
  1804. int i = 0;
  1805. int ret = 0;
  1806. if (NULL != params) {
  1807. kmf_set_attr_at_index(attlist, i,
  1808. KMF_KEYSTORE_TYPE_ATTR, &params->kstype,
  1809. sizeof (params->kstype));
  1810. i++;
  1811. /* Set the optional searching attributes for all 3 plugins */
  1812. if (params->issuer != NULL) {
  1813. kmf_set_attr_at_index(attlist, i,
  1814. KMF_ISSUER_NAME_ATTR,
  1815. params->issuer, strlen(params->issuer));
  1816. i++;
  1817. }
  1818. if (params->subject != NULL) {
  1819. kmf_set_attr_at_index(attlist, i,
  1820. KMF_SUBJECT_NAME_ATTR,
  1821. params->subject, strlen(params->subject));
  1822. i++;
  1823. }
  1824. if (params->serial != NULL) {
  1825. kmf_set_attr_at_index(attlist, i, KMF_BIGINT_ATTR,
  1826. params->serial, sizeof (KMF_BIGINT));
  1827. i++;
  1828. }
  1829. kmf_set_attr_at_index(attlist, i, KMF_CERT_VALIDITY_ATTR,
  1830. &params->find_cert_validity, sizeof (KMF_CERT_VALIDITY));
  1831. i++;
  1832. if (params->kstype == KMF_KEYSTORE_NSS) {
  1833. if (params->certLabel != NULL) {
  1834. kmf_set_attr_at_index(attlist, i,
  1835. KMF_CERT_LABEL_ATTR,
  1836. params->certLabel,
  1837. strlen(params->certLabel));
  1838. i++;
  1839. }
  1840. if (params->nssparms.slotlabel != NULL) {
  1841. kmf_set_attr_at_index(attlist, i,
  1842. KMF_TOKEN_LABEL_ATTR,
  1843. params->nssparms.slotlabel,
  1844. strlen(params->nssparms.slotlabel));
  1845. i++;
  1846. }
  1847. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  1848. if (params->sslparms.certfile != NULL) {
  1849. kmf_set_attr_at_index(attlist, i,
  1850. KMF_CERT_FILENAME_ATTR,
  1851. params->sslparms.certfile,
  1852. strlen(params->sslparms.certfile));
  1853. i++;
  1854. }
  1855. if (params->sslparms.dirpath != NULL) {
  1856. kmf_set_attr_at_index(attlist, i,
  1857. KMF_DIRPATH_ATTR,
  1858. params->sslparms.dirpath,
  1859. strlen(params->sslparms.dirpath));
  1860. i++;
  1861. }
  1862. } else if (params->kstype == KMF_KEYSTORE_PK11TOKEN) {
  1863. if (params->certLabel != NULL) {
  1864. kmf_set_attr_at_index(attlist, i,
  1865. KMF_CERT_LABEL_ATTR,
  1866. params->certLabel,
  1867. strlen(params->certLabel));
  1868. i++;
  1869. }
  1870. kmf_set_attr_at_index(attlist, i,
  1871. KMF_PRIVATE_BOOL_ATTR,
  1872. &params->pkcs11parms.private,
  1873. sizeof (params->pkcs11parms.private));
  1874. i++;
  1875. }
  1876. }
  1877. *attnum = i;
  1878. return (ret);
  1879. }
  1880. int
  1881. build_csr_data(KMF_HANDLE_T kmfhandle, KMF_CSR_DATA *csr,
  1882. KMF_KEY_HANDLE *key)
  1883. {
  1884. KMF_X509_NAME *subject_name_ptr = NULL;
  1885. char *subject_name_string = "C=CH, O=Sun, CN=hua.tang@sun.com";
  1886. KMF_X509_NAME csr_subject_name;
  1887. KMF_GENERALNAMECHOICES nametype = GENNAME_RFC822NAME;
  1888. char *namedata = "hua.tang@sun.com";
  1889. (void) memset(csr, 0, sizeof (KMF_CSR_DATA));
  1890. if (testcall(kmf_set_csr_version(csr, 2),
  1891. "kmf_set_csr_version"))
  1892. goto fail_out;
  1893. if (testcall(kmf_dn_parser(subject_name_string, &csr_subject_name),
  1894. "kmf_dn_parser"))
  1895. goto fail_out;
  1896. subject_name_ptr = &csr_subject_name;
  1897. if (testcall(kmf_set_csr_subject(csr, subject_name_ptr),
  1898. "kmf_set_csr_subject"))
  1899. goto fail_out;
  1900. if (testcall(kmf_set_csr_subject_altname(csr, namedata, 1, nametype),
  1901. "kmf_set_csr_subj_altname"))
  1902. goto fail_out;
  1903. if (testcall(kmf_set_csr_pubkey(kmfhandle, key, csr),
  1904. "kmf_set_csr_pubkey"))
  1905. goto fail_out;
  1906. if (testcall(kmf_set_csr_sig_alg(csr, KMF_ALGID_MD5WithRSA),
  1907. "kmf_set_csr_sigalg"))
  1908. goto fail_out;
  1909. if (testcall(kmf_set_csr_ku(csr, 0,
  1910. (KMF_dataEncipherment | KMF_digitalSignature | KMF_keyCertSign)),
  1911. "kmf_set_csr_keyusage"))
  1912. goto fail_out;
  1913. return (0);
  1914. fail_out:
  1915. return (1);
  1916. }
  1917. /*
  1918. * Name: set_importcrl_params
  1919. *
  1920. * Description:
  1921. * Set kmf_import_crl attributes
  1922. *
  1923. * Parameter:
  1924. * attributes: attributes to be set
  1925. * kstype: keystore type
  1926. * format: ssl crl encode format
  1927. * incrlfile: input crl file name
  1928. * incertfile: ssl input cert file name
  1929. * outcrlfile: ssl output crl file name
  1930. *
  1931. * Returns:
  1932. * 1: failed
  1933. * 0: succussful
  1934. *
  1935. */
  1936. int
  1937. set_importcrl_params(KMF_ATTRIBUTE *attrlist,
  1938. KMF_KEYSTORE_TYPE *kstype, KMF_ENCODE_FORMAT *format,
  1939. char *incrlfile, char *incertfile, char *outcrlfile)
  1940. {
  1941. int ret = 0;
  1942. int numattr = 0;
  1943. static boolean_t check = B_TRUE;
  1944. kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
  1945. kstype, sizeof (KMF_KEYSTORE_TYPE));
  1946. numattr++;
  1947. if (*kstype == KMF_KEYSTORE_NSS) { /* NSS */
  1948. char *slotlabel = strdup(DEFAULT_NSSLABEL);
  1949. char *trustflag = strdup(NSS_TRUST_FLAG);
  1950. if (slotlabel == NULL) {
  1951. ret = -1;
  1952. goto out;
  1953. }
  1954. kmf_set_attr_at_index(attrlist, numattr,
  1955. KMF_TOKEN_LABEL_ATTR, slotlabel,
  1956. strlen(slotlabel));
  1957. numattr++;
  1958. if (trustflag == NULL) {
  1959. ret = -1;
  1960. goto out;
  1961. }
  1962. kmf_set_attr_at_index(attrlist, numattr,
  1963. KMF_TRUSTFLAG_ATTR, trustflag,
  1964. strlen(trustflag));
  1965. numattr++;
  1966. if (incrlfile != NULL) {
  1967. kmf_set_attr_at_index(attrlist, numattr,
  1968. KMF_CRL_FILENAME_ATTR, incrlfile,
  1969. strlen(incrlfile));
  1970. numattr++;
  1971. }
  1972. } else if (*kstype == KMF_KEYSTORE_OPENSSL) { /* OpenSSL */
  1973. char *dirpath = strdup(SSL_DIR_PATH);
  1974. if (dirpath == NULL) {
  1975. ret = -1;
  1976. goto out;
  1977. }
  1978. if (incertfile) {
  1979. kmf_set_attr_at_index(attrlist, numattr,
  1980. KMF_CERT_FILENAME_ATTR, incertfile,
  1981. strlen(incertfile));
  1982. numattr++;
  1983. }
  1984. if (incrlfile) {
  1985. kmf_set_attr_at_index(attrlist, numattr,
  1986. KMF_CRL_FILENAME_ATTR, incrlfile,
  1987. strlen(incrlfile));
  1988. numattr++;
  1989. }
  1990. if (outcrlfile) {
  1991. kmf_set_attr_at_index(attrlist, numattr,
  1992. KMF_CRL_OUTFILE_ATTR, outcrlfile,
  1993. strlen(outcrlfile));
  1994. numattr++;
  1995. }
  1996. kmf_set_attr_at_index(attrlist, numattr,
  1997. KMF_CRL_CHECK_ATTR, &check, sizeof (check));
  1998. numattr++;
  1999. kmf_set_attr_at_index(attrlist, numattr,
  2000. KMF_ENCODE_FORMAT_ATTR, format,
  2001. sizeof (KMF_ENCODE_FORMAT));
  2002. numattr++;
  2003. }
  2004. out:
  2005. if (ret) {
  2006. (void) jnl_printf("set_importcrl_params failed\n");
  2007. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  2008. return (-1);
  2009. }
  2010. return (numattr);
  2011. }
  2012. void
  2013. free_importcrl_params(KMF_ATTRIBUTE *attrlist, int numattr)
  2014. {
  2015. char *p;
  2016. if (attrlist == NULL || numattr == 0)
  2017. return;
  2018. p = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR,
  2019. attrlist, numattr);
  2020. if (p)
  2021. free(p);
  2022. p = kmf_get_attr_ptr(KMF_TRUSTFLAG_ATTR,
  2023. attrlist, numattr);
  2024. if (p)
  2025. free(p);
  2026. p = kmf_get_attr_ptr(KMF_DIRPATH_ATTR,
  2027. attrlist, numattr);
  2028. if (p)
  2029. free(p);
  2030. }
  2031. /*
  2032. * Name: set_deletecrl_params
  2033. *
  2034. * Description:
  2035. * Set KMF_DELETECRL_PARAMS
  2036. *
  2037. * Parameter:
  2038. * attrlist: attribute list to be set
  2039. * kstype: keystore type
  2040. * format: ssl crl encode format
  2041. * crl_subjName: crl subject name
  2042. * crl_issuerName: crl issuer name
  2043. * crlfile: crl file name
  2044. * dirpath: directory path
  2045. *
  2046. * Returns:
  2047. * 1: failed
  2048. * 0: succussful
  2049. *
  2050. */
  2051. int
  2052. set_deletecrl_params(KMF_ATTRIBUTE *attrlist,
  2053. KMF_KEYSTORE_TYPE *kstype, KMF_ENCODE_FORMAT *format,
  2054. char *crl_subjName, char *crl_issuerName, char *crlfile, char *dirpath)
  2055. {
  2056. int ret = 0;
  2057. int numattr = 0;
  2058. char *slotlabel = NULL;
  2059. char *trustflag = NULL;
  2060. if (attrlist == NULL) {
  2061. ret = -1;
  2062. goto out;
  2063. }
  2064. kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
  2065. kstype, sizeof (KMF_KEYSTORE_TYPE));
  2066. numattr++;
  2067. if (*kstype == KMF_KEYSTORE_NSS) { /* NSS */
  2068. slotlabel = strdup(DEFAULT_NSSLABEL);
  2069. if (slotlabel == NULL) {
  2070. ret = -1;
  2071. goto out;
  2072. }
  2073. kmf_set_attr_at_index(attrlist, numattr,
  2074. KMF_TOKEN_LABEL_ATTR, slotlabel,
  2075. strlen(slotlabel));
  2076. numattr++;
  2077. trustflag = strdup(NSS_TRUST_FLAG);
  2078. if (trustflag == NULL) {
  2079. ret = -1;
  2080. goto out;
  2081. }
  2082. kmf_set_attr_at_index(attrlist, numattr,
  2083. KMF_TRUSTFLAG_ATTR, trustflag,
  2084. strlen(trustflag));
  2085. numattr++;
  2086. if (crl_subjName != NULL) {
  2087. kmf_set_attr_at_index(attrlist, numattr,
  2088. KMF_SUBJECT_NAME_ATTR, crl_subjName,
  2089. strlen(crl_subjName));
  2090. numattr++;
  2091. }
  2092. if (crl_issuerName != NULL) {
  2093. kmf_set_attr_at_index(attrlist, numattr,
  2094. KMF_ISSUER_NAME_ATTR, crl_issuerName,
  2095. strlen(crl_issuerName));
  2096. numattr++;
  2097. }
  2098. } else { /* OpenSSL and PKCS#11 use the same parameters */
  2099. if (dirpath != NULL) {
  2100. kmf_set_attr_at_index(attrlist, numattr,
  2101. KMF_DIRPATH_ATTR, dirpath,
  2102. strlen(dirpath));
  2103. numattr++;
  2104. }
  2105. if (crlfile != NULL) {
  2106. kmf_set_attr_at_index(attrlist, numattr,
  2107. KMF_CRL_FILENAME_ATTR, crlfile,
  2108. strlen(crlfile));
  2109. numattr++;
  2110. }
  2111. kmf_set_attr_at_index(attrlist, numattr,
  2112. KMF_ENCODE_FORMAT_ATTR, format,
  2113. sizeof (KMF_ENCODE_FORMAT));
  2114. numattr++;
  2115. }
  2116. out:
  2117. if (ret) {
  2118. (void) jnl_printf("set_deletecrl_params failed\n");
  2119. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  2120. free_deletecrl_params(attrlist, numattr);
  2121. return (-1);
  2122. }
  2123. return (numattr);
  2124. }
  2125. /*
  2126. * Name: free_deletecrl_params
  2127. *
  2128. * Description:
  2129. * Free heap memory used by the delete_crl tests.
  2130. *
  2131. * Parameter:
  2132. * params: parameter to be freed
  2133. *
  2134. */
  2135. void
  2136. free_deletecrl_params(KMF_ATTRIBUTE *attrlist, int numattr)
  2137. {
  2138. char *p;
  2139. if (attrlist == NULL || numattr == 0)
  2140. return;
  2141. p = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR,
  2142. attrlist, numattr);
  2143. if (p)
  2144. free(p);
  2145. p = kmf_get_attr_ptr(KMF_TRUSTFLAG_ATTR,
  2146. attrlist, numattr);
  2147. if (p)
  2148. free(p);
  2149. }
  2150. /*
  2151. * Name: set_listcrl_params
  2152. *
  2153. * Description:
  2154. * Set parameters for kmf_list_crl
  2155. *
  2156. * Parameter:
  2157. * attrlist: attribute list to be set
  2158. * kstype: keystore type
  2159. * format: ssl crl encode format
  2160. * crl_subjName: crl subject name
  2161. * crl_issuerName: crl issuer name
  2162. * crlfile: crl file name
  2163. * dirpath: directory path
  2164. *
  2165. * Returns:
  2166. * 1: failed
  2167. * 0: succussful
  2168. *
  2169. */
  2170. int
  2171. set_listcrl_params(KMF_ATTRIBUTE *attrlist,
  2172. KMF_KEYSTORE_TYPE *kstype, KMF_ENCODE_FORMAT *format,
  2173. char *crl_subjName, char *crl_issuerName, char *crlfile,
  2174. char *dirpath, char **crldata)
  2175. {
  2176. int ret = 0;
  2177. int numattr = 0;
  2178. char *slotlabel = NULL;
  2179. char *trustflag = NULL;
  2180. if (attrlist == NULL) {
  2181. ret = 1;
  2182. goto out;
  2183. }
  2184. kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
  2185. kstype, sizeof (KMF_KEYSTORE_TYPE));
  2186. numattr++;
  2187. if (*kstype == KMF_KEYSTORE_NSS) { /* NSS */
  2188. slotlabel = strdup(DEFAULT_NSSLABEL);
  2189. if (slotlabel == NULL) {
  2190. ret = -1;
  2191. goto out;
  2192. }
  2193. kmf_set_attr_at_index(attrlist, numattr,
  2194. KMF_TOKEN_LABEL_ATTR, slotlabel,
  2195. strlen(slotlabel));
  2196. numattr++;
  2197. trustflag = strdup(NSS_TRUST_FLAG);
  2198. if (trustflag == NULL) {
  2199. ret = -1;
  2200. goto out;
  2201. }
  2202. kmf_set_attr_at_index(attrlist, numattr,
  2203. KMF_TRUSTFLAG_ATTR, trustflag,
  2204. strlen(trustflag));
  2205. numattr++;
  2206. if (crl_subjName != NULL) {
  2207. kmf_set_attr_at_index(attrlist, numattr,
  2208. KMF_SUBJECT_NAME_ATTR, crl_subjName,
  2209. strlen(crl_subjName));
  2210. numattr++;
  2211. }
  2212. if (crl_issuerName != NULL) {
  2213. kmf_set_attr_at_index(attrlist, numattr,
  2214. KMF_ISSUER_NAME_ATTR, crl_issuerName,
  2215. strlen(crl_issuerName));
  2216. numattr++;
  2217. }
  2218. } else { /* OpenSSL and PKCS#11 use the same parameters */
  2219. if (dirpath != NULL) {
  2220. kmf_set_attr_at_index(attrlist, numattr,
  2221. KMF_DIRPATH_ATTR, dirpath,
  2222. strlen(dirpath));
  2223. numattr++;
  2224. }
  2225. if (crlfile != NULL) {
  2226. kmf_set_attr_at_index(attrlist, numattr,
  2227. KMF_CRL_FILENAME_ATTR, crlfile,
  2228. strlen(crlfile));
  2229. numattr++;
  2230. }
  2231. kmf_set_attr_at_index(attrlist, numattr,
  2232. KMF_ENCODE_FORMAT_ATTR, format,
  2233. sizeof (KMF_ENCODE_FORMAT));
  2234. numattr++;
  2235. }
  2236. if (crldata != NULL) {
  2237. kmf_set_attr_at_index(attrlist, numattr,
  2238. KMF_CRL_DATA_ATTR, crldata, sizeof (char *));
  2239. numattr++;
  2240. }
  2241. out:
  2242. if (ret) {
  2243. (void) jnl_printf("set_listcrl_params failed\n");
  2244. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  2245. free_listcrl_params(attrlist, numattr);
  2246. return (-1);
  2247. }
  2248. return (numattr);
  2249. }
  2250. /*
  2251. * Name: free_listcrl_params
  2252. *
  2253. * Description:
  2254. * Free heap memory used by KMF_LISTCRL_PARAMS
  2255. *
  2256. * Parameter:
  2257. * params: parameter to be freed
  2258. *
  2259. */
  2260. void
  2261. free_listcrl_params(KMF_ATTRIBUTE *attrlist, int numattr)
  2262. {
  2263. char *p;
  2264. if (attrlist == NULL || numattr == 0)
  2265. return;
  2266. p = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR,
  2267. attrlist, numattr);
  2268. if (p)
  2269. free(p);
  2270. p = kmf_get_attr_ptr(KMF_TRUSTFLAG_ATTR,
  2271. attrlist, numattr);
  2272. if (p)
  2273. free(p);
  2274. }
  2275. int
  2276. set_setpin_params(KMF_ATTRIBUTE *attrlist,
  2277. KMF_KEYSTORE_TYPE *kstype, char *tokenname,
  2278. KMF_CREDENTIAL *oldcred)
  2279. {
  2280. int i = 0;
  2281. if (attrlist == NULL)
  2282. return (0);
  2283. kmf_set_attr_at_index(attrlist, i, KMF_KEYSTORE_TYPE_ATTR,
  2284. kstype, sizeof (KMF_KEYSTORE_TYPE));
  2285. i++;
  2286. if (tokenname != NULL) {
  2287. kmf_set_attr_at_index(attrlist, i, KMF_TOKEN_LABEL_ATTR,
  2288. tokenname, strlen(tokenname));
  2289. i++;
  2290. }
  2291. if (oldcred != NULL) {
  2292. kmf_set_attr_at_index(attrlist, i, KMF_CREDENTIAL_ATTR,
  2293. oldcred, sizeof (KMF_CREDENTIAL));
  2294. i++;
  2295. }
  2296. return (i);
  2297. }
  2298. /*
  2299. * Name: set_createsymkey_params
  2300. *
  2301. * Description:
  2302. * Set KMF_CREATESYMKEY_PARAMS
  2303. *
  2304. * Parameter:
  2305. * params: parameter to be set
  2306. * kstype: keystore type
  2307. * keytype: key type
  2308. * keylength: key length
  2309. * keylabel: key label
  2310. * token_password: password for keystore
  2311. * keyfile: OpenSSL key file name
  2312. * format: OpenSSL key format
  2313. *
  2314. * Returns:
  2315. * 1: failed
  2316. * 0: succussful
  2317. *
  2318. */
  2319. int
  2320. set_createsymkey_params(KMF_CREATESYMKEY_PARAMS *params,
  2321. KMF_KEYSTORE_TYPE kstype, KMF_KEY_ALG keytype,
  2322. uint32_t keylength, char *keylabel,
  2323. char *token_password, char *keyfile, KMF_ENCODE_FORMAT format)
  2324. {
  2325. int ret = 0;
  2326. if (params == NULL) {
  2327. ret = 1;
  2328. goto out;
  2329. }
  2330. (void) memset(params, 0, sizeof (KMF_CREATESYMKEY_PARAMS));
  2331. params->kstype = kstype;
  2332. params->keytype = keytype;
  2333. params->keylength = keylength;
  2334. params->keylabel = keylabel;
  2335. params->cred.cred = token_password;
  2336. if (token_password)
  2337. params->cred.credlen = strlen(token_password);
  2338. else
  2339. params->cred.credlen = 0;
  2340. if (kstype == KMF_KEYSTORE_NSS) { /* NSS */
  2341. params->nssparms.slotlabel = strdup(DEFAULT_NSSLABEL);
  2342. if (params->nssparms.slotlabel == NULL) {
  2343. ret = 1;
  2344. goto out;
  2345. }
  2346. params->nssparms.trustflag = strdup(NSS_TRUST_FLAG);
  2347. if (params->nssparms.trustflag == NULL) {
  2348. ret = 1;
  2349. goto out;
  2350. }
  2351. } else if (kstype == KMF_KEYSTORE_OPENSSL) { /* OpenSSL */
  2352. params->sslparms.dirpath = strdup(SSL_DIR_PATH);
  2353. if (params->sslparms.dirpath == NULL) {
  2354. ret = 1;
  2355. goto out;
  2356. }
  2357. params->sslparms.keyfile = keyfile;
  2358. params->sslparms.format = format;
  2359. } else if (kstype == KMF_KEYSTORE_PK11TOKEN) {
  2360. params->pkcs11parms.sensitive = B_FALSE;
  2361. params->pkcs11parms.not_extractable = B_FALSE;
  2362. }
  2363. out:
  2364. if (ret) {
  2365. (void) jnl_printf("set_createsymkey_params failed\n");
  2366. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  2367. free_createsymkey_params(params);
  2368. }
  2369. return (ret);
  2370. }
  2371. /*
  2372. * Name: free_createsymkey_params
  2373. *
  2374. * Description:
  2375. * Free heap memory used by KMF_CREATESYMKEY_PARAMS
  2376. *
  2377. * Parameter:
  2378. * params: parameter to be freed
  2379. *
  2380. */
  2381. void
  2382. free_createsymkey_params(KMF_CREATESYMKEY_PARAMS *params)
  2383. {
  2384. if (params == NULL)
  2385. return;
  2386. if (params->kstype == KMF_KEYSTORE_NSS) {
  2387. if (params->nssparms.slotlabel != NULL)
  2388. free(params->nssparms.slotlabel);
  2389. if (params->nssparms.trustflag != NULL)
  2390. free(params->nssparms.trustflag);
  2391. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  2392. if (params->sslparms.dirpath != NULL)
  2393. free(params->sslparms.dirpath);
  2394. }
  2395. }
  2396. int
  2397. set_createsymkey_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  2398. KMF_CREATESYMKEY_PARAMS *params,
  2399. KMF_KEY_HANDLE *symKey)
  2400. {
  2401. int ret = 0;
  2402. int i = 0;
  2403. if (NULL != symKey) {
  2404. kmf_set_attr_at_index(attlist, i,
  2405. KMF_KEY_HANDLE_ATTR, symKey, sizeof (KMF_KEY_HANDLE));
  2406. i++;
  2407. }
  2408. if (NULL != params) {
  2409. kmf_set_attr_at_index(attlist, i,
  2410. KMF_KEYSTORE_TYPE_ATTR, &params->kstype,
  2411. sizeof (params->kstype));
  2412. i++;
  2413. kmf_set_attr_at_index(attlist, i,
  2414. KMF_KEYALG_ATTR, &params->keytype,
  2415. sizeof (params->keytype));
  2416. i++;
  2417. kmf_set_attr_at_index(attlist, i,
  2418. KMF_KEYLENGTH_ATTR, &params->keylength,
  2419. sizeof (params->keylength));
  2420. i++;
  2421. if (params->keylabel != NULL) {
  2422. kmf_set_attr_at_index(attlist, i,
  2423. KMF_KEYLABEL_ATTR, params->keylabel,
  2424. strlen(params->keylabel));
  2425. i++;
  2426. }
  2427. if (params->cred.credlen > 0) {
  2428. kmf_set_attr_at_index(attlist, i,
  2429. KMF_CREDENTIAL_ATTR, &params->cred,
  2430. sizeof (KMF_CREDENTIAL));
  2431. i++;
  2432. }
  2433. if (params->kstype == KMF_KEYSTORE_NSS) {
  2434. if (params->nssparms.slotlabel != NULL) {
  2435. kmf_set_attr_at_index(attlist, i,
  2436. KMF_TOKEN_LABEL_ATTR,
  2437. params->nssparms.slotlabel,
  2438. strlen(params->nssparms.slotlabel));
  2439. i++;
  2440. }
  2441. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  2442. if (params->sslparms.dirpath != NULL) {
  2443. kmf_set_attr_at_index(attlist, i,
  2444. KMF_DIRPATH_ATTR,
  2445. params->sslparms.dirpath,
  2446. strlen(params->sslparms.dirpath));
  2447. i++;
  2448. }
  2449. if (params->sslparms.keyfile != NULL) {
  2450. kmf_set_attr_at_index(attlist, i,
  2451. KMF_KEY_FILENAME_ATTR,
  2452. params->sslparms.keyfile,
  2453. strlen(params->sslparms.keyfile));
  2454. i++;
  2455. }
  2456. kmf_set_attr_at_index(attlist, i,
  2457. KMF_ENCODE_FORMAT_ATTR,
  2458. &params->sslparms.format,
  2459. sizeof (params->sslparms.format));
  2460. i++;
  2461. } else if (params->kstype == KMF_KEYSTORE_PK11TOKEN) {
  2462. kmf_set_attr_at_index(attlist, i,
  2463. KMF_SENSITIVE_BOOL_ATTR,
  2464. &params->pkcs11parms.sensitive,
  2465. sizeof (params->pkcs11parms.sensitive));
  2466. i++;
  2467. kmf_set_attr_at_index(attlist, i,
  2468. KMF_NON_EXTRACTABLE_BOOL_ATTR,
  2469. &params->pkcs11parms.not_extractable,
  2470. sizeof (params->pkcs11parms.not_extractable));
  2471. i++;
  2472. }
  2473. } /* end of "if (NULL != params)" */
  2474. *attnum = i;
  2475. return (ret);
  2476. }
  2477. /*
  2478. * Name: set_findkey_params
  2479. *
  2480. * Description:
  2481. * Set KMF_FINDKEY_PARAMS
  2482. *
  2483. * Parameter:
  2484. * params: parameter to be set
  2485. * kstype: keystore type
  2486. * keytype: key type
  2487. * keyclass: key class
  2488. * token_password: password for keystore
  2489. * findLabel: key label to be found
  2490. * format: key format
  2491. * idstr: id string
  2492. * keyfile: OpenSSL key file name
  2493. *
  2494. * Returns:
  2495. * 1: failed
  2496. * 0: succussful
  2497. *
  2498. */
  2499. int
  2500. set_findkey_params(KMF_FINDKEY_PARAMS *params,
  2501. KMF_KEYSTORE_TYPE kstype, KMF_KEY_ALG keytype,
  2502. KMF_KEY_CLASS keyclass, char *token_password,
  2503. char *findLabel, KMF_ENCODE_FORMAT format,
  2504. char *idstr, char *keyfile)
  2505. {
  2506. int ret = 0;
  2507. if (params == NULL) {
  2508. ret = 1;
  2509. goto out;
  2510. }
  2511. (void) memset(params, 0, sizeof (KMF_FINDKEY_PARAMS));
  2512. params->kstype = kstype;
  2513. params->keytype = keytype;
  2514. params->keyclass = keyclass;
  2515. params->cred.cred = token_password;
  2516. if (token_password)
  2517. params->cred.credlen = strlen(token_password);
  2518. else
  2519. params->cred.credlen = 0;
  2520. params->findLabel = findLabel;
  2521. params->format = format;
  2522. params->idstr = idstr;
  2523. if (kstype == KMF_KEYSTORE_NSS) { /* NSS */
  2524. params->nssparms.slotlabel = strdup(DEFAULT_NSSLABEL);
  2525. if (params->nssparms.slotlabel == NULL) {
  2526. ret = 1;
  2527. goto out;
  2528. }
  2529. params->nssparms.trustflag = strdup(NSS_TRUST_FLAG);
  2530. if (params->nssparms.trustflag == NULL) {
  2531. ret = 1;
  2532. goto out;
  2533. }
  2534. } else if (kstype == KMF_KEYSTORE_OPENSSL) { /* OpenSSL */
  2535. params->sslparms.dirpath = strdup(SSL_DIR_PATH);
  2536. if (params->sslparms.dirpath == NULL) {
  2537. ret = 1;
  2538. goto out;
  2539. }
  2540. params->sslparms.keyfile = keyfile;
  2541. params->sslparms.format = format;
  2542. } else if (kstype == KMF_KEYSTORE_PK11TOKEN) {
  2543. params->pkcs11parms.token = B_TRUE;
  2544. params->pkcs11parms.private = B_TRUE;
  2545. }
  2546. out:
  2547. if (ret) {
  2548. (void) jnl_printf("set_findkey_params failed\n");
  2549. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  2550. free_findkey_params(params);
  2551. }
  2552. return (ret);
  2553. }
  2554. /*
  2555. * Name: free_findkey_params
  2556. *
  2557. * Description:
  2558. * Free heap memory used by KMF_FINDKEY_PARAMS
  2559. *
  2560. * Parameter:
  2561. * params: parameter to be freed
  2562. *
  2563. */
  2564. void
  2565. free_findkey_params(KMF_FINDKEY_PARAMS *params)
  2566. {
  2567. if (params == NULL)
  2568. return;
  2569. if (params->kstype == KMF_KEYSTORE_NSS) {
  2570. if (params->nssparms.slotlabel != NULL)
  2571. free(params->nssparms.slotlabel);
  2572. if (params->nssparms.trustflag != NULL)
  2573. free(params->nssparms.trustflag);
  2574. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  2575. if (params->sslparms.dirpath != NULL)
  2576. free(params->sslparms.dirpath);
  2577. }
  2578. }
  2579. int
  2580. set_findkey_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  2581. KMF_FINDKEY_PARAMS *params, KMF_KEY_HANDLE *keylist,
  2582. uint32_t *numkeys)
  2583. {
  2584. int ret = 0;
  2585. int i = 0;
  2586. if (NULL != keylist) {
  2587. kmf_set_attr_at_index(attlist, i,
  2588. KMF_KEY_HANDLE_ATTR, keylist, sizeof (KMF_KEY_HANDLE));
  2589. i++;
  2590. }
  2591. if (NULL != numkeys) {
  2592. kmf_set_attr_at_index(attlist, i,
  2593. KMF_COUNT_ATTR, numkeys, sizeof (uint32_t));
  2594. i++;
  2595. }
  2596. if (NULL != params) {
  2597. kmf_set_attr_at_index(attlist, i,
  2598. KMF_KEYSTORE_TYPE_ATTR, &params->kstype,
  2599. sizeof (params->kstype));
  2600. i++;
  2601. kmf_set_attr_at_index(attlist, i,
  2602. KMF_KEYALG_ATTR, &params->keytype,
  2603. sizeof (params->keytype));
  2604. i++;
  2605. kmf_set_attr_at_index(attlist, i,
  2606. KMF_KEYCLASS_ATTR, &params->keyclass,
  2607. sizeof (params->keyclass));
  2608. i++;
  2609. kmf_set_attr_at_index(attlist, i,
  2610. KMF_ENCODE_FORMAT_ATTR, &params->format,
  2611. sizeof (params->format));
  2612. i++;
  2613. if (params->findLabel != NULL) {
  2614. kmf_set_attr_at_index(attlist, i,
  2615. KMF_KEYLABEL_ATTR, params->findLabel,
  2616. strlen(params->findLabel));
  2617. i++;
  2618. }
  2619. if (params->idstr != NULL) {
  2620. kmf_set_attr_at_index(attlist, i,
  2621. KMF_IDSTR_ATTR, params->idstr,
  2622. strlen(params->idstr));
  2623. i++;
  2624. }
  2625. if (params->cred.credlen > 0) {
  2626. kmf_set_attr_at_index(attlist, i,
  2627. KMF_CREDENTIAL_ATTR, &params->cred,
  2628. sizeof (KMF_CREDENTIAL));
  2629. i++;
  2630. }
  2631. if (params->kstype == KMF_KEYSTORE_NSS) {
  2632. if (params->nssparms.slotlabel != NULL) {
  2633. kmf_set_attr_at_index(attlist, i,
  2634. KMF_TOKEN_LABEL_ATTR,
  2635. params->nssparms.slotlabel,
  2636. strlen(params->nssparms.slotlabel));
  2637. i++;
  2638. }
  2639. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  2640. if (params->sslparms.dirpath != NULL) {
  2641. kmf_set_attr_at_index(attlist, i,
  2642. KMF_DIRPATH_ATTR,
  2643. params->sslparms.dirpath,
  2644. strlen(params->sslparms.dirpath));
  2645. i++;
  2646. }
  2647. if (params->sslparms.keyfile != NULL) {
  2648. kmf_set_attr_at_index(attlist, i,
  2649. KMF_KEY_FILENAME_ATTR,
  2650. params->sslparms.keyfile,
  2651. strlen(params->sslparms.keyfile));
  2652. i++;
  2653. }
  2654. kmf_set_attr_at_index(attlist, i,
  2655. KMF_ENCODE_FORMAT_ATTR,
  2656. &params->sslparms.format,
  2657. sizeof (params->sslparms.format));
  2658. i++;
  2659. } else if (params->kstype == KMF_KEYSTORE_PK11TOKEN) {
  2660. kmf_set_attr_at_index(attlist, i,
  2661. KMF_TOKEN_BOOL_ATTR,
  2662. &params->pkcs11parms.token,
  2663. sizeof (params->pkcs11parms.token));
  2664. i++;
  2665. kmf_set_attr_at_index(attlist, i,
  2666. KMF_PRIVATE_BOOL_ATTR,
  2667. &params->pkcs11parms.private,
  2668. sizeof (params->pkcs11parms.private));
  2669. i++;
  2670. }
  2671. }
  2672. *attnum = i;
  2673. return (i);
  2674. }
  2675. /*
  2676. * Name: set_storekey_params
  2677. *
  2678. * Description:
  2679. * Set KMF_STOREKEY_PARAMS
  2680. *
  2681. * Parameter:
  2682. * params: parameter to be set
  2683. * kstype: keystore type
  2684. * token_password: password for keystore
  2685. * certificate: cert data
  2686. * label: key label
  2687. * keyfiel: ssl keyfile
  2688. * format: ssl key encode format
  2689. *
  2690. * Returns:
  2691. * 1: failed
  2692. * 0: succussful
  2693. *
  2694. */
  2695. int
  2696. set_storekey_params(KMF_STOREKEY_PARAMS *params,
  2697. KMF_KEYSTORE_TYPE kstype, char *token_password,
  2698. KMF_DATA *certificate, char *label,
  2699. char *keyfile, KMF_ENCODE_FORMAT format)
  2700. {
  2701. int ret = 0;
  2702. if (params == NULL) {
  2703. ret = 1;
  2704. goto out;
  2705. }
  2706. (void) memset(params, 0, sizeof (KMF_STOREKEY_PARAMS));
  2707. params->kstype = kstype;
  2708. params->cred.cred = token_password;
  2709. if (token_password)
  2710. params->cred.credlen = strlen(token_password);
  2711. else
  2712. params->cred.credlen = 0;
  2713. params->certificate = certificate;
  2714. params->label = label;
  2715. if (kstype == KMF_KEYSTORE_NSS) { /* NSS */
  2716. params->nssparms.slotlabel = strdup(DEFAULT_NSSLABEL);
  2717. if (params->nssparms.slotlabel == NULL) {
  2718. ret = 1;
  2719. goto out;
  2720. }
  2721. } else if (kstype == KMF_KEYSTORE_OPENSSL) { /* OpenSSL */
  2722. params->sslparms.dirpath = strdup(SSL_DIR_PATH);
  2723. if (params->sslparms.dirpath == NULL) {
  2724. ret = 1;
  2725. goto out;
  2726. }
  2727. params->sslparms.keyfile = keyfile;
  2728. params->sslparms.format = format;
  2729. }
  2730. out:
  2731. if (ret) {
  2732. (void) jnl_printf("set_storekey_params failed\n");
  2733. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  2734. free_storekey_params(params);
  2735. }
  2736. return (ret);
  2737. }
  2738. /*
  2739. * Name: free_storekey_params
  2740. *
  2741. * Description:
  2742. * Free heap memory used by KMF_STOREKEY_PARAMS
  2743. *
  2744. * Parameter:
  2745. * params: parameter to be freed
  2746. *
  2747. */
  2748. void
  2749. free_storekey_params(KMF_STOREKEY_PARAMS *params)
  2750. {
  2751. if (params == NULL)
  2752. return;
  2753. if (params->kstype == KMF_KEYSTORE_NSS) {
  2754. if (params->nssparms.slotlabel != NULL)
  2755. free(params->nssparms.slotlabel);
  2756. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  2757. if (params->sslparms.dirpath != NULL)
  2758. free(params->sslparms.dirpath);
  2759. }
  2760. }
  2761. int
  2762. set_storekey_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  2763. KMF_STOREKEY_PARAMS *params,
  2764. KMF_RAW_KEY_DATA *rawKey)
  2765. {
  2766. int ret = 0;
  2767. int i = 0;
  2768. if (NULL != rawKey) {
  2769. kmf_set_attr_at_index(attlist, i, KMF_RAW_KEY_ATTR,
  2770. rawKey, sizeof (KMF_RAW_KEY_DATA));
  2771. i++;
  2772. }
  2773. if (NULL != params) {
  2774. kmf_set_attr_at_index(attlist, i, KMF_KEYSTORE_TYPE_ATTR,
  2775. &params->kstype, sizeof (params->kstype));
  2776. i++;
  2777. if (params->cred.credlen > 0) {
  2778. kmf_set_attr_at_index(attlist, i,
  2779. KMF_CREDENTIAL_ATTR,
  2780. &params->cred, sizeof (KMF_CREDENTIAL));
  2781. i++;
  2782. }
  2783. if (params->label != NULL) {
  2784. kmf_set_attr_at_index(attlist, i,
  2785. KMF_KEYLABEL_ATTR,
  2786. params->label, strlen(params->label));
  2787. i++;
  2788. }
  2789. if (params->certificate != NULL) {
  2790. kmf_set_attr_at_index(attlist, i,
  2791. KMF_CERT_DATA_ATTR,
  2792. params->certificate, sizeof (KMF_DATA));
  2793. i++;
  2794. }
  2795. if (params->kstype == KMF_KEYSTORE_NSS) {
  2796. if (params->nssparms.slotlabel != NULL) {
  2797. kmf_set_attr_at_index(attlist, i,
  2798. KMF_TOKEN_LABEL_ATTR,
  2799. params->nssparms.slotlabel,
  2800. strlen(params->nssparms.slotlabel));
  2801. i++;
  2802. }
  2803. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  2804. if (params->sslparms.dirpath != NULL) {
  2805. kmf_set_attr_at_index(attlist, i,
  2806. KMF_DIRPATH_ATTR,
  2807. params->sslparms.dirpath,
  2808. strlen(params->sslparms.dirpath));
  2809. i++;
  2810. }
  2811. if (params->sslparms.keyfile != NULL) {
  2812. kmf_set_attr_at_index(attlist, i,
  2813. KMF_KEY_FILENAME_ATTR,
  2814. params->sslparms.keyfile,
  2815. strlen(params->sslparms.keyfile));
  2816. i++;
  2817. }
  2818. kmf_set_attr_at_index(attlist, i,
  2819. KMF_ENCODE_FORMAT_ATTR,
  2820. &params->sslparms.format,
  2821. sizeof (params->sslparms.format));
  2822. i++;
  2823. }
  2824. }
  2825. *attnum = i;
  2826. return (ret);
  2827. }
  2828. int
  2829. set_delete_key_from_keystore_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  2830. KMF_KEYSTORE_TYPE *kstype, KMF_CREDENTIAL *cred,
  2831. KMF_KEY_HANDLE *key, boolean_t *token_destroy, char *slotlabel)
  2832. {
  2833. int i = 0;
  2834. int ret = 0;
  2835. if (NULL != kstype) {
  2836. kmf_set_attr_at_index(attlist, i,
  2837. KMF_KEYSTORE_TYPE_ATTR, kstype,
  2838. sizeof (KMF_KEYSTORE_TYPE));
  2839. i++;
  2840. }
  2841. if (NULL != key) {
  2842. kmf_set_attr_at_index(attlist, i,
  2843. KMF_KEY_HANDLE_ATTR, key, sizeof (KMF_KEY_HANDLE));
  2844. i++;
  2845. }
  2846. if (NULL != token_destroy) {
  2847. kmf_set_attr_at_index(attlist, i,
  2848. KMF_DESTROY_BOOL_ATTR, token_destroy, sizeof (boolean_t));
  2849. i++;
  2850. }
  2851. if (cred && cred->credlen > 0) {
  2852. kmf_set_attr_at_index(attlist, i,
  2853. KMF_CREDENTIAL_ATTR, cred,
  2854. sizeof (KMF_CREDENTIAL));
  2855. i++;
  2856. }
  2857. if (*kstype == KMF_KEYSTORE_NSS) {
  2858. if (slotlabel != NULL) {
  2859. kmf_set_attr_at_index(attlist, i,
  2860. KMF_TOKEN_LABEL_ATTR, slotlabel,
  2861. strlen(slotlabel));
  2862. i++;
  2863. }
  2864. }
  2865. *attnum = i;
  2866. return (ret);
  2867. }
  2868. /*
  2869. * Name: set_findcrl_params
  2870. *
  2871. * Description:
  2872. * Set attributes for kmf_find_crl function
  2873. *
  2874. * Parameter:
  2875. * attrlist: attribute list to be set
  2876. * kstype: keystore type
  2877. * crl_subjName: crl subject name
  2878. * crl_issuerName: crl issuer name
  2879. *
  2880. * Returns:
  2881. * -1: failed
  2882. * >0 : number of attributes set
  2883. *
  2884. */
  2885. int
  2886. set_findcrl_params(KMF_ATTRIBUTE *attrlist,
  2887. KMF_KEYSTORE_TYPE *kstype,
  2888. char *crl_subjName, char *crl_issuerName,
  2889. char **namelist, int *crlcount)
  2890. {
  2891. int ret = 0;
  2892. int numattr = 0;
  2893. char *slotlabel = NULL;
  2894. char *trustflag = NULL;
  2895. if (attrlist == NULL || kstype == NULL) {
  2896. return (-1);
  2897. }
  2898. kmf_set_attr_at_index(attrlist, numattr,
  2899. KMF_KEYSTORE_TYPE_ATTR,
  2900. kstype, sizeof (KMF_KEYSTORE_TYPE));
  2901. numattr++;
  2902. if (namelist != NULL) {
  2903. kmf_set_attr_at_index(attrlist, numattr,
  2904. KMF_CRL_NAMELIST_ATTR,
  2905. namelist, sizeof (char *));
  2906. numattr++;
  2907. }
  2908. kmf_set_attr_at_index(attrlist, numattr,
  2909. KMF_CRL_COUNT_ATTR,
  2910. crlcount, sizeof (int *));
  2911. numattr++;
  2912. if (*kstype == KMF_KEYSTORE_NSS) { /* NSS */
  2913. slotlabel = strdup(DEFAULT_NSSLABEL);
  2914. if (slotlabel == NULL) {
  2915. ret = -1;
  2916. goto out;
  2917. }
  2918. kmf_set_attr_at_index(attrlist, numattr,
  2919. KMF_TOKEN_LABEL_ATTR, slotlabel,
  2920. strlen(slotlabel));
  2921. numattr++;
  2922. trustflag = strdup(NSS_TRUST_FLAG);
  2923. if (trustflag == NULL) {
  2924. ret = -1;
  2925. goto out;
  2926. }
  2927. kmf_set_attr_at_index(attrlist, numattr,
  2928. KMF_TRUSTFLAG_ATTR, trustflag,
  2929. strlen(trustflag));
  2930. numattr++;
  2931. if (crl_subjName != NULL) {
  2932. kmf_set_attr_at_index(attrlist, numattr,
  2933. KMF_SUBJECT_NAME_ATTR, crl_subjName,
  2934. strlen(crl_subjName));
  2935. numattr++;
  2936. }
  2937. if (crl_issuerName != NULL) {
  2938. kmf_set_attr_at_index(attrlist, numattr,
  2939. KMF_ISSUER_NAME_ATTR, crl_issuerName,
  2940. strlen(crl_issuerName));
  2941. numattr++;
  2942. }
  2943. }
  2944. out:
  2945. if (ret) {
  2946. (void) jnl_printf("set_findcrl_params failed\n");
  2947. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  2948. free_findcrl_params(attrlist, numattr);
  2949. return (-1);
  2950. }
  2951. return (numattr);
  2952. }
  2953. /*
  2954. * Name: free_findcrl_params
  2955. *
  2956. * Description:
  2957. * Free heap memory used by KMF_FINDCRL_PARAMS
  2958. *
  2959. * Parameter:
  2960. * params: parameter to be freed
  2961. *
  2962. */
  2963. void
  2964. free_findcrl_params(KMF_ATTRIBUTE *attrlist, int numattr)
  2965. {
  2966. char *p;
  2967. if (attrlist == NULL || numattr == 0)
  2968. return;
  2969. p = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR,
  2970. attrlist, numattr);
  2971. if (p)
  2972. free(p);
  2973. p = kmf_get_attr_ptr(KMF_TRUSTFLAG_ATTR,
  2974. attrlist, numattr);
  2975. if (p)
  2976. free(p);
  2977. }
  2978. /* build expired cert */
  2979. int
  2980. build_x509_expired_cert(KMF_HANDLE_T kmfhandle,
  2981. KMF_X509_CERTIFICATE *cert,
  2982. uchar_t *sernum, uint32_t numlen, KMF_KEY_HANDLE *key)
  2983. {
  2984. struct tm time;
  2985. time_t starttime;
  2986. (void) memset(&time, 0, sizeof (time));
  2987. time.tm_year = 2000 - 1900;
  2988. starttime = mktime(&time);
  2989. if (build_x509_nokeyusage_cert(kmfhandle, cert, sernum, numlen, key))
  2990. goto fail_out;
  2991. if (testcall(kmf_set_cert_validity(cert, starttime, 365*24*60*60),
  2992. "KMF_SetCertValidityTimes"))
  2993. goto fail_out;
  2994. return (0);
  2995. fail_out:
  2996. return (1);
  2997. }
  2998. /*
  2999. * Name: set_findcertincrl_params
  3000. *
  3001. * Description:
  3002. * Set attribute list for kmf_find_cert_in_crl
  3003. *
  3004. * Parameter:
  3005. * attrlist: attribute list to be set
  3006. * kstype: keystore type
  3007. * certLabel: cert label
  3008. * dirpath: ssl dir path
  3009. * crlfile: ssl crl file name
  3010. * certfile: ssl cert file name
  3011. * format: ssl crl encode format
  3012. *
  3013. * Returns:
  3014. * -1: failed
  3015. * >0: number of attributes added
  3016. */
  3017. int
  3018. set_findcertincrl_params(KMF_ATTRIBUTE *attrlist,
  3019. KMF_KEYSTORE_TYPE *kstype,
  3020. char *certLabel, char *dirpath, char *crlfile,
  3021. char *certfile, KMF_ENCODE_FORMAT *format)
  3022. {
  3023. int ret = 0;
  3024. int numattr = 0;
  3025. char *slotlabel = NULL;
  3026. char *trustflag = NULL;
  3027. if (attrlist == NULL) {
  3028. return (-1);
  3029. }
  3030. kmf_set_attr_at_index(attrlist, numattr,
  3031. KMF_KEYSTORE_TYPE_ATTR,
  3032. kstype, sizeof (KMF_KEYSTORE_TYPE));
  3033. numattr++;
  3034. if (*kstype == KMF_KEYSTORE_NSS) { /* NSS */
  3035. slotlabel = strdup(DEFAULT_NSSLABEL);
  3036. if (slotlabel == NULL) {
  3037. ret = -1;
  3038. goto out;
  3039. }
  3040. kmf_set_attr_at_index(attrlist, numattr,
  3041. KMF_TOKEN_LABEL_ATTR, slotlabel,
  3042. strlen(slotlabel));
  3043. numattr++;
  3044. trustflag = strdup(NSS_TRUST_FLAG);
  3045. if (trustflag == NULL) {
  3046. ret = -1;
  3047. goto out;
  3048. }
  3049. kmf_set_attr_at_index(attrlist, numattr,
  3050. KMF_TRUSTFLAG_ATTR, trustflag,
  3051. strlen(trustflag));
  3052. numattr++;
  3053. if (certLabel != NULL) {
  3054. kmf_set_attr_at_index(attrlist, numattr,
  3055. KMF_CERT_LABEL_ATTR, certLabel,
  3056. strlen(certLabel));
  3057. numattr++;
  3058. }
  3059. } else { /* OpenSSL or PK11TOKEN */
  3060. if (dirpath != NULL) {
  3061. kmf_set_attr_at_index(attrlist, numattr,
  3062. KMF_DIRPATH_ATTR, dirpath,
  3063. strlen(dirpath));
  3064. numattr++;
  3065. }
  3066. if (crlfile != NULL) {
  3067. kmf_set_attr_at_index(attrlist, numattr,
  3068. KMF_CRL_FILENAME_ATTR, crlfile,
  3069. strlen(crlfile));
  3070. numattr++;
  3071. }
  3072. if (certfile) {
  3073. kmf_set_attr_at_index(attrlist, numattr,
  3074. KMF_CERT_FILENAME_ATTR, certfile,
  3075. strlen(certfile));
  3076. numattr++;
  3077. }
  3078. kmf_set_attr_at_index(attrlist, numattr,
  3079. KMF_ENCODE_FORMAT_ATTR, format,
  3080. sizeof (KMF_ENCODE_FORMAT));
  3081. numattr++;
  3082. }
  3083. out:
  3084. if (ret) {
  3085. (void) jnl_printf("set_findcertincrl_params failed\n");
  3086. (void) jnl_printf("%s\n", result_tbl[STF_UNRESOLVED]);
  3087. free_findcertincrl_params(attrlist, NULL);
  3088. return (-1);
  3089. }
  3090. return (numattr);
  3091. }
  3092. /*
  3093. * Name: free_findcertincrl_params
  3094. *
  3095. * Description:
  3096. * Free heap memory used by attributes in kmf_find_cert_in_crl
  3097. *
  3098. * Parameter:
  3099. * attrlist - list of attributes
  3100. * numattr - number of attributes
  3101. *
  3102. */
  3103. void
  3104. free_findcertincrl_params(KMF_ATTRIBUTE *attrlist, int numattr)
  3105. {
  3106. char *p;
  3107. p = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR,
  3108. attrlist, numattr);
  3109. if (p)
  3110. free(p);
  3111. p = kmf_get_attr_ptr(KMF_TRUSTFLAG_ATTR,
  3112. attrlist, numattr);
  3113. if (p)
  3114. free(p);
  3115. }
  3116. int
  3117. set_ocsprequest_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  3118. KMF_DATA *issuer_cert, KMF_DATA *user_cert, char *reqfile)
  3119. {
  3120. int i = 0;
  3121. int ret = 0;
  3122. if (NULL != reqfile) {
  3123. kmf_set_attr_at_index(attlist, i,
  3124. KMF_OCSP_REQUEST_FILENAME_ATTR, reqfile, strlen(reqfile));
  3125. i++;
  3126. }
  3127. if (NULL != user_cert) {
  3128. kmf_set_attr_at_index(attlist, i,
  3129. KMF_USER_CERT_DATA_ATTR, user_cert, sizeof (KMF_DATA));
  3130. i++;
  3131. }
  3132. if (NULL != issuer_cert) {
  3133. kmf_set_attr_at_index(attlist, i,
  3134. KMF_ISSUER_CERT_DATA_ATTR, issuer_cert,
  3135. sizeof (KMF_DATA));
  3136. i++;
  3137. }
  3138. *attnum = i;
  3139. return (ret);
  3140. }
  3141. int
  3142. set_get_ocsp_status_for_cert_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  3143. KMF_OCSPRESPONSE_PARAMS_INPUT *params_in,
  3144. KMF_OCSPRESPONSE_PARAMS_OUTPUT *params_out)
  3145. {
  3146. int i = 0;
  3147. int ret = 0;
  3148. if (params_in) {
  3149. kmf_set_attr_at_index(attlist, i,
  3150. KMF_ISSUER_CERT_DATA_ATTR, params_in->issuer_cert,
  3151. sizeof (KMF_DATA));
  3152. i++;
  3153. kmf_set_attr_at_index(attlist, i,
  3154. KMF_USER_CERT_DATA_ATTR, params_in->user_cert,
  3155. sizeof (KMF_DATA));
  3156. i++;
  3157. kmf_set_attr_at_index(attlist, i,
  3158. KMF_OCSP_RESPONSE_DATA_ATTR, params_in->response,
  3159. sizeof (KMF_DATA));
  3160. i++;
  3161. kmf_set_attr_at_index(attlist, i,
  3162. KMF_SIGNER_CERT_DATA_ATTR, params_in->signer_cert,
  3163. sizeof (KMF_DATA));
  3164. i++;
  3165. kmf_set_attr_at_index(attlist, i,
  3166. KMF_IGNORE_RESPONSE_SIGN_ATTR, &params_in->ignore_response_sign,
  3167. sizeof (boolean_t));
  3168. i++;
  3169. kmf_set_attr_at_index(attlist, i,
  3170. KMF_RESPONSE_LIFETIME_ATTR, &params_in->response_lifetime,
  3171. sizeof (uint32_t));
  3172. i++;
  3173. }
  3174. if (params_out) {
  3175. kmf_set_attr_at_index(attlist, i,
  3176. KMF_OCSP_RESPONSE_STATUS_ATTR, &params_out->response_status,
  3177. sizeof (int));
  3178. i++;
  3179. kmf_set_attr_at_index(attlist, i,
  3180. KMF_OCSP_RESPONSE_REASON_ATTR, &params_out->reason,
  3181. sizeof (int));
  3182. i++;
  3183. kmf_set_attr_at_index(attlist, i,
  3184. KMF_OCSP_RESPONSE_CERT_STATUS_ATTR, &params_out->cert_status,
  3185. sizeof (int));
  3186. i++;
  3187. }
  3188. *attnum = i;
  3189. return (ret);
  3190. }
  3191. int
  3192. set_encrypt_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  3193. KMF_DATA *cert, KMF_DATA *plaintext, KMF_DATA *ciphertext)
  3194. {
  3195. int i = 0;
  3196. int ret = 0;
  3197. if (cert) {
  3198. kmf_set_attr_at_index(attlist, i, KMF_CERT_DATA_ATTR,
  3199. cert, sizeof (KMF_DATA));
  3200. i++;
  3201. }
  3202. if (plaintext) {
  3203. kmf_set_attr_at_index(attlist, i,
  3204. KMF_PLAINTEXT_DATA_ATTR, plaintext,
  3205. sizeof (KMF_DATA));
  3206. i++;
  3207. }
  3208. if (ciphertext) {
  3209. kmf_set_attr_at_index(attlist, i,
  3210. KMF_CIPHERTEXT_DATA_ATTR, ciphertext,
  3211. sizeof (KMF_DATA));
  3212. i++;
  3213. }
  3214. *attnum = i;
  3215. return (ret);
  3216. }
  3217. int
  3218. set_verify_data_attrs(KMF_ATTRIBUTE *attrlist, int *attnum,
  3219. KMF_ALGORITHM_INDEX *algid, KMF_DATA *indata, KMF_DATA *insig,
  3220. KMF_KEYSTORE_TYPE *kstype, const KMF_DATA *SignerCert,
  3221. KMF_KEY_HANDLE *KMFKey)
  3222. {
  3223. int numattr = 0;
  3224. int ret = 0;
  3225. if (algid) {
  3226. kmf_set_attr_at_index(attrlist, numattr,
  3227. KMF_ALGORITHM_INDEX_ATTR,
  3228. algid, sizeof (KMF_ALGORITHM_INDEX));
  3229. numattr++;
  3230. }
  3231. if (indata) {
  3232. kmf_set_attr_at_index(attrlist, numattr,
  3233. KMF_DATA_ATTR,
  3234. indata, sizeof (KMF_DATA));
  3235. numattr++;
  3236. }
  3237. if (insig) {
  3238. kmf_set_attr_at_index(attrlist, numattr,
  3239. KMF_IN_SIGN_ATTR,
  3240. insig, sizeof (KMF_DATA));
  3241. numattr++;
  3242. }
  3243. if (kstype) {
  3244. kmf_set_attr_at_index(attrlist, numattr,
  3245. KMF_KEYSTORE_TYPE_ATTR,
  3246. kstype, sizeof (KMF_KEYSTORE_TYPE));
  3247. numattr++;
  3248. }
  3249. if (SignerCert) {
  3250. kmf_set_attr_at_index(attrlist, numattr,
  3251. KMF_SIGNER_CERT_DATA_ATTR,
  3252. (KMF_DATA *)SignerCert, sizeof (KMF_DATA));
  3253. numattr++;
  3254. }
  3255. if (KMFKey) {
  3256. kmf_set_attr_at_index(attrlist, numattr,
  3257. KMF_KEYSTORE_TYPE_ATTR, &KMFKey->kstype,
  3258. sizeof (KMF_KEYSTORE_TYPE));
  3259. numattr++;
  3260. kmf_set_attr_at_index(attrlist, numattr,
  3261. KMF_KEY_HANDLE_ATTR, KMFKey, sizeof (KMF_KEY_HANDLE));
  3262. numattr++;
  3263. }
  3264. *attnum = numattr;
  3265. return (ret);
  3266. }
  3267. int
  3268. set_sign_data_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  3269. KMF_DATA *tobesigned, KMF_DATA *output,
  3270. KMF_KEY_HANDLE *key, KMF_OID *AlgOID,
  3271. KMF_CRYPTOWITHCERT_PARAMS *params, KMF_DATA *SignerCertData)
  3272. {
  3273. int i = 0;
  3274. int ret = 0;
  3275. if (NULL != key) {
  3276. kmf_set_attr_at_index(attlist, i,
  3277. KMF_KEYSTORE_TYPE_ATTR, &key->kstype,
  3278. sizeof (key->kstype));
  3279. i++;
  3280. kmf_set_attr_at_index(attlist, i,
  3281. KMF_KEY_HANDLE_ATTR, key, sizeof (KMF_KEY_HANDLE));
  3282. i++;
  3283. }
  3284. if (NULL != AlgOID) {
  3285. kmf_set_attr_at_index(attlist, i,
  3286. KMF_OID_ATTR, AlgOID, sizeof (KMF_OID));
  3287. i++;
  3288. }
  3289. if (NULL != tobesigned) {
  3290. kmf_set_attr_at_index(attlist, i,
  3291. KMF_DATA_ATTR, tobesigned, sizeof (KMF_DATA));
  3292. i++;
  3293. }
  3294. if (NULL != output) {
  3295. kmf_set_attr_at_index(attlist, i,
  3296. KMF_OUT_DATA_ATTR, output, sizeof (KMF_DATA));
  3297. i++;
  3298. }
  3299. if (NULL != SignerCertData) {
  3300. kmf_set_attr_at_index(attlist, i,
  3301. KMF_SIGNER_CERT_DATA_ATTR, SignerCertData,
  3302. sizeof (KMF_DATA));
  3303. i++;
  3304. }
  3305. if (NULL == params) {
  3306. *attnum = i;
  3307. return (ret);
  3308. }
  3309. kmf_set_attr_at_index(attlist, i,
  3310. KMF_KEYSTORE_TYPE_ATTR, &params->kstype,
  3311. sizeof (params->kstype));
  3312. i++;
  3313. if (params->cred.credlen > 0) {
  3314. kmf_set_attr_at_index(attlist, i,
  3315. KMF_CREDENTIAL_ATTR, &params->cred,
  3316. sizeof (KMF_CREDENTIAL));
  3317. i++;
  3318. }
  3319. if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  3320. if (params->sslparms.keyfile == NULL)
  3321. return (KMF_ERR_BAD_PARAMETER);
  3322. else {
  3323. kmf_set_attr_at_index(attlist, i,
  3324. KMF_KEY_FILENAME_ATTR,
  3325. params->sslparms.keyfile,
  3326. strlen(params->sslparms.keyfile));
  3327. i++;
  3328. }
  3329. if (params->sslparms.dirpath != NULL) {
  3330. kmf_set_attr_at_index(attlist, i,
  3331. KMF_DIRPATH_ATTR, params->sslparms.dirpath,
  3332. strlen(params->sslparms.dirpath));
  3333. i++;
  3334. }
  3335. }
  3336. if (params->algid != KMF_ALGID_NONE) {
  3337. kmf_set_attr_at_index(attlist, i,
  3338. KMF_ALGORITHM_INDEX_ATTR,
  3339. &params->algid, sizeof (KMF_ALGORITHM_INDEX));
  3340. i++;
  3341. }
  3342. *attnum = i;
  3343. return (ret);
  3344. }
  3345. int
  3346. set_SignCertWithCert_attrs(KMF_ATTRIBUTE *attlist, int *attnum,
  3347. KMF_CRYPTOWITHCERT_PARAMS *params,
  3348. const KMF_X509_CERTIFICATE *CertToBeSigned, KMF_DATA *SignerCert,
  3349. KMF_DATA *SignedCert)
  3350. {
  3351. int i = 0;
  3352. int ret = 0;
  3353. if (NULL != CertToBeSigned) {
  3354. kmf_set_attr_at_index(attlist, i, KMF_X509_CERTIFICATE_ATTR,
  3355. (void *)CertToBeSigned, sizeof (KMF_X509_CERTIFICATE_ATTR));
  3356. i++;
  3357. }
  3358. if (NULL != SignedCert) {
  3359. kmf_set_attr_at_index(attlist, i, KMF_CERT_DATA_ATTR,
  3360. (void *)SignedCert, sizeof (KMF_DATA));
  3361. i++;
  3362. }
  3363. if (NULL != SignerCert) {
  3364. kmf_set_attr_at_index(attlist, i,
  3365. KMF_SIGNER_CERT_DATA_ATTR, SignerCert,
  3366. sizeof (KMF_DATA));
  3367. i++;
  3368. }
  3369. if (NULL == params) {
  3370. *attnum = i;
  3371. return (ret);
  3372. }
  3373. kmf_set_attr_at_index(attlist, i,
  3374. KMF_KEYSTORE_TYPE_ATTR, &params->kstype,
  3375. sizeof (params->kstype));
  3376. i++;
  3377. if (params->cred.credlen > 0) {
  3378. kmf_set_attr_at_index(attlist, i,
  3379. KMF_CREDENTIAL_ATTR, &params->cred,
  3380. sizeof (KMF_CREDENTIAL));
  3381. i++;
  3382. }
  3383. if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  3384. if (params->sslparms.keyfile != NULL) {
  3385. kmf_set_attr_at_index(attlist, i,
  3386. KMF_KEY_FILENAME_ATTR, params->sslparms.keyfile,
  3387. strlen(params->sslparms.keyfile));
  3388. i++;
  3389. }
  3390. if (params->sslparms.dirpath != NULL) {
  3391. kmf_set_attr_at_index(attlist, i,
  3392. KMF_DIRPATH_ATTR, params->sslparms.dirpath,
  3393. strlen(params->sslparms.dirpath));
  3394. i++;
  3395. }
  3396. } else if (params->kstype == KMF_KEYSTORE_NSS) {
  3397. if (params->nssparms.slotlabel != NULL) {
  3398. kmf_set_attr_at_index(attlist, i,
  3399. KMF_TOKEN_LABEL_ATTR,
  3400. params->nssparms.slotlabel,
  3401. strlen(params->nssparms.slotlabel));
  3402. i++;
  3403. }
  3404. }
  3405. *attnum = i;
  3406. return (ret);
  3407. }
  3408. int
  3409. set_SignCertRecord_attrs(KMF_ATTRIBUTE *attrs, int *attnum,
  3410. KMF_KEY_HANDLE *key, KMF_X509_CERTIFICATE *certrec,
  3411. KMF_DATA *signedcert)
  3412. {
  3413. int i = 0;
  3414. int ret = 0;
  3415. if (key) {
  3416. kmf_set_attr_at_index(attrs, i, KMF_KEYSTORE_TYPE_ATTR,
  3417. &key->kstype, sizeof (KMF_KEYSTORE_TYPE));
  3418. i++;
  3419. kmf_set_attr_at_index(attrs, i, KMF_KEY_HANDLE_ATTR,
  3420. key, sizeof (KMF_KEY_HANDLE));
  3421. i++;
  3422. }
  3423. if (certrec) {
  3424. kmf_set_attr_at_index(attrs, i, KMF_X509_CERTIFICATE_ATTR,
  3425. certrec, sizeof (KMF_X509_CERTIFICATE));
  3426. i++;
  3427. }
  3428. if (signedcert) {
  3429. kmf_set_attr_at_index(attrs, i, KMF_CERT_DATA_ATTR,
  3430. signedcert, sizeof (KMF_DATA));
  3431. i++;
  3432. }
  3433. *attnum = i;
  3434. return (ret);
  3435. }
  3436. int
  3437. set_SignCertWithKey_attrs(KMF_ATTRIBUTE *attrs, int *attnum,
  3438. KMF_X509_CERTIFICATE *unsigned_cert, KMF_KEY_HANDLE *key,
  3439. KMF_DATA *signed_cert)
  3440. {
  3441. int ret = 0;
  3442. int i = 0;
  3443. if (key) {
  3444. kmf_set_attr_at_index(attrs, i, KMF_KEYSTORE_TYPE_ATTR,
  3445. &key->kstype, sizeof (KMF_KEYSTORE_TYPE));
  3446. i++;
  3447. kmf_set_attr_at_index(attrs, i, KMF_KEY_HANDLE_ATTR,
  3448. key, sizeof (KMF_KEY_HANDLE));
  3449. i++;
  3450. }
  3451. if (unsigned_cert) {
  3452. kmf_set_attr_at_index(attrs, i, KMF_X509_CERTIFICATE_ATTR,
  3453. unsigned_cert, sizeof (KMF_X509_CERTIFICATE_ATTR));
  3454. i++;
  3455. }
  3456. if (signed_cert) {
  3457. kmf_set_attr_at_index(attrs, i, KMF_CERT_DATA_ATTR,
  3458. signed_cert, sizeof (KMF_DATA));
  3459. i++;
  3460. }
  3461. return (i);
  3462. }
  3463. int
  3464. add_attr(KMF_ATTR *list_in, int len, KMF_ATTRIBUTE *list_out)
  3465. {
  3466. int i, idx;
  3467. idx = 0;
  3468. for (i = 0; i < len; i++) {
  3469. if (list_in[idx].pValue) {
  3470. kmf_set_attr_at_index(list_out, idx,
  3471. list_in[idx].type, list_in[idx].pValue,
  3472. list_in[idx].valueLen);
  3473. idx++;
  3474. }
  3475. }
  3476. return (idx);
  3477. }