PageRenderTime 49ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/usr/src/lib/libkmf/libkmf/common/keyop.c

https://bitbucket.org/dilos/onarm-gate
C | 559 lines | 423 code | 85 blank | 51 comment | 131 complexity | 888c58846ed795d66c62ee571d19066b MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, AGPL-3.0, MIT, Apache-2.0, 0BSD, GPL-2.0, LGPL-2.0, AGPL-1.0, BSD-3-Clause, LGPL-3.0, BSD-3-Clause-No-Nuclear-License-2014
  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 2007 Sun Microsystems, Inc. All rights reserved.
  23. * Use is subject to license terms.
  24. */
  25. #pragma ident "%Z%%M% %I% %E% SMI"
  26. #include <stdio.h>
  27. #include <link.h>
  28. #include <fcntl.h>
  29. #include <ctype.h>
  30. #include <sys/param.h>
  31. #include <sys/types.h>
  32. #include <sys/stat.h>
  33. #include <ber_der.h>
  34. #include <kmfapiP.h>
  35. #include <libgen.h>
  36. #include <cryptoutil.h>
  37. KMF_RETURN
  38. kmf_create_keypair(KMF_HANDLE_T handle,
  39. int num_args,
  40. KMF_ATTRIBUTE *attrlist)
  41. {
  42. KMF_RETURN ret = KMF_OK;
  43. KMF_PLUGIN *plugin;
  44. KMF_KEYSTORE_TYPE kstype;
  45. uint32_t len;
  46. KMF_ATTRIBUTE_TESTER required_attrs[] = {
  47. {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
  48. {KMF_PRIVKEY_HANDLE_ATTR, FALSE, sizeof (KMF_KEY_HANDLE),
  49. sizeof (KMF_KEY_HANDLE)},
  50. {KMF_PUBKEY_HANDLE_ATTR, FALSE, sizeof (KMF_KEY_HANDLE),
  51. sizeof (KMF_KEY_HANDLE)},
  52. };
  53. int num_req_attrs = sizeof (required_attrs) /
  54. sizeof (KMF_ATTRIBUTE_TESTER);
  55. if (handle == NULL)
  56. return (KMF_ERR_BAD_PARAMETER);
  57. CLEAR_ERROR(handle, ret);
  58. ret = test_attributes(num_req_attrs, required_attrs,
  59. 0, NULL, num_args, attrlist);
  60. if (ret != KMF_OK)
  61. return (ret);
  62. len = sizeof (kstype);
  63. ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_args,
  64. &kstype, &len);
  65. if (ret != KMF_OK)
  66. return (ret);
  67. plugin = FindPlugin(handle, kstype);
  68. if (plugin != NULL && plugin->funclist->CreateKeypair != NULL) {
  69. return (plugin->funclist->CreateKeypair(handle, num_args,
  70. attrlist));
  71. } else {
  72. return (KMF_ERR_PLUGIN_NOTFOUND);
  73. }
  74. }
  75. KMF_RETURN
  76. kmf_delete_key_from_keystore(KMF_HANDLE_T handle,
  77. int num_args,
  78. KMF_ATTRIBUTE *attrlist)
  79. {
  80. KMF_RETURN ret = KMF_OK;
  81. KMF_PLUGIN *plugin;
  82. KMF_KEYSTORE_TYPE kstype;
  83. uint32_t len;
  84. KMF_KEY_HANDLE *key;
  85. KMF_ATTRIBUTE_TESTER required_attrs[] = {
  86. {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
  87. {KMF_KEY_HANDLE_ATTR, FALSE, sizeof (KMF_KEY_HANDLE),
  88. sizeof (KMF_KEY_HANDLE)},
  89. };
  90. int num_req_attrs = sizeof (required_attrs) /
  91. sizeof (KMF_ATTRIBUTE_TESTER);
  92. if (handle == NULL)
  93. return (KMF_ERR_BAD_PARAMETER);
  94. CLEAR_ERROR(handle, ret);
  95. ret = test_attributes(num_req_attrs, required_attrs,
  96. 0, NULL, num_args, attrlist);
  97. if (ret != KMF_OK)
  98. return (ret);
  99. len = sizeof (kstype);
  100. ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_args,
  101. &kstype, &len);
  102. if (ret != KMF_OK)
  103. return (ret);
  104. plugin = FindPlugin(handle, kstype);
  105. if (plugin != NULL && plugin->funclist->DeleteKey != NULL) {
  106. ret = plugin->funclist->DeleteKey(handle, num_args, attrlist);
  107. } else {
  108. ret = KMF_ERR_PLUGIN_NOTFOUND;
  109. }
  110. if (ret == KMF_OK) {
  111. key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, num_args);
  112. if (key == NULL)
  113. return (KMF_ERR_BAD_PARAMETER);
  114. if (key->keylabel != NULL)
  115. free(key->keylabel);
  116. if (key->israw && key->keyp != NULL) {
  117. if (key->keyclass == KMF_ASYM_PUB ||
  118. key->keyclass == KMF_ASYM_PRI) {
  119. kmf_free_raw_key(key->keyp);
  120. free(key->keyp);
  121. } else if (key->keyclass == KMF_SYMMETRIC) {
  122. kmf_free_raw_sym_key(key->keyp);
  123. }
  124. /* Else we don't know how to free the memory. */
  125. }
  126. (void) memset(key, 0, sizeof (KMF_KEY_HANDLE));
  127. }
  128. return (ret);
  129. }
  130. KMF_RETURN
  131. kmf_find_key(KMF_HANDLE_T handle,
  132. int num_args,
  133. KMF_ATTRIBUTE *attrlist)
  134. {
  135. KMF_RETURN ret = KMF_OK;
  136. KMF_PLUGIN *plugin;
  137. KMF_KEYSTORE_TYPE kstype;
  138. uint32_t len;
  139. KMF_ATTRIBUTE_TESTER required_attrs[] = {
  140. {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
  141. {KMF_COUNT_ATTR, FALSE, sizeof (uint32_t),
  142. sizeof (uint32_t)}
  143. };
  144. int num_req_attrs = sizeof (required_attrs) /
  145. sizeof (KMF_ATTRIBUTE_TESTER);
  146. if (handle == NULL)
  147. return (KMF_ERR_BAD_PARAMETER);
  148. CLEAR_ERROR(handle, ret);
  149. ret = test_attributes(num_req_attrs, required_attrs,
  150. 0, NULL, num_args, attrlist);
  151. if (ret != KMF_OK)
  152. return (ret);
  153. len = sizeof (kstype);
  154. ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_args,
  155. &kstype, &len);
  156. if (ret != KMF_OK)
  157. return (ret);
  158. plugin = FindPlugin(handle, kstype);
  159. if (plugin != NULL && plugin->funclist->FindKey != NULL) {
  160. return (plugin->funclist->FindKey(handle, num_args, attrlist));
  161. }
  162. return (KMF_ERR_PLUGIN_NOTFOUND);
  163. }
  164. KMF_RETURN
  165. kmf_create_sym_key(KMF_HANDLE_T handle,
  166. int num_args,
  167. KMF_ATTRIBUTE *attrlist)
  168. {
  169. KMF_RETURN ret = KMF_OK;
  170. KMF_PLUGIN *plugin;
  171. KMF_KEYSTORE_TYPE kstype;
  172. uint32_t len;
  173. KMF_ATTRIBUTE_TESTER required_attrs[] = {
  174. {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
  175. {KMF_KEY_HANDLE_ATTR, FALSE, sizeof (KMF_KEY_HANDLE),
  176. sizeof (KMF_KEY_HANDLE)},
  177. {KMF_KEYALG_ATTR, FALSE, 1, sizeof (KMF_KEY_ALG)},
  178. };
  179. int num_req_attrs = sizeof (required_attrs) /
  180. sizeof (KMF_ATTRIBUTE_TESTER);
  181. if (handle == NULL)
  182. return (KMF_ERR_BAD_PARAMETER);
  183. CLEAR_ERROR(handle, ret);
  184. ret = test_attributes(num_req_attrs, required_attrs,
  185. 0, NULL, num_args, attrlist);
  186. if (ret != KMF_OK)
  187. return (ret);
  188. len = sizeof (kstype);
  189. ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_args,
  190. &kstype, &len);
  191. if (ret != KMF_OK)
  192. return (ret);
  193. plugin = FindPlugin(handle, kstype);
  194. if (plugin != NULL && plugin->funclist->CreateSymKey != NULL) {
  195. return (plugin->funclist->CreateSymKey(handle, num_args,
  196. attrlist));
  197. } else {
  198. return (KMF_ERR_PLUGIN_NOTFOUND);
  199. }
  200. }
  201. KMF_RETURN
  202. kmf_get_sym_key_value(KMF_HANDLE_T handle, KMF_KEY_HANDLE *symkey,
  203. KMF_RAW_SYM_KEY *rkey)
  204. {
  205. KMF_PLUGIN *plugin;
  206. KMF_RETURN ret;
  207. CLEAR_ERROR(handle, ret);
  208. if (ret != KMF_OK)
  209. return (ret);
  210. if (symkey == NULL || rkey == NULL)
  211. return (KMF_ERR_BAD_PARAMETER);
  212. plugin = FindPlugin(handle, symkey->kstype);
  213. if (plugin != NULL &&
  214. plugin->funclist->GetSymKeyValue != NULL) {
  215. return (plugin->funclist->GetSymKeyValue(handle,
  216. symkey, rkey));
  217. } else {
  218. return (KMF_ERR_PLUGIN_NOTFOUND);
  219. }
  220. }
  221. KMF_RETURN
  222. kmf_store_key(KMF_HANDLE_T handle,
  223. int numattr,
  224. KMF_ATTRIBUTE *attrlist)
  225. {
  226. KMF_RETURN ret = KMF_OK;
  227. KMF_PLUGIN *plugin;
  228. KMF_KEYSTORE_TYPE kstype;
  229. KMF_ATTRIBUTE_TESTER required_attrs[] = {
  230. {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
  231. };
  232. int num_req_attrs = sizeof (required_attrs) /
  233. sizeof (KMF_ATTRIBUTE_TESTER);
  234. if (handle == NULL)
  235. return (KMF_ERR_BAD_PARAMETER);
  236. CLEAR_ERROR(handle, ret);
  237. ret = test_attributes(num_req_attrs, required_attrs,
  238. 0, NULL, numattr, attrlist);
  239. if (ret != KMF_OK)
  240. return (ret);
  241. ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
  242. &kstype, NULL);
  243. if (ret != KMF_OK)
  244. return (ret);
  245. plugin = FindPlugin(handle, kstype);
  246. if (plugin != NULL) {
  247. if (plugin->funclist->StoreKey != NULL)
  248. return (plugin->funclist->StoreKey(handle,
  249. numattr, attrlist));
  250. else
  251. return (KMF_ERR_FUNCTION_NOT_FOUND);
  252. }
  253. return (KMF_ERR_PLUGIN_NOTFOUND);
  254. }
  255. /*
  256. * The following are Phase 1 APIs still needed to maintain compat with elfsign.
  257. */
  258. /*
  259. * Name: KMF_SignDataWithKey
  260. *
  261. * Description:
  262. * This function signs a block of data using the private key
  263. * and returns the signature in output
  264. *
  265. * Parameters:
  266. * handle(input) - opaque handle for KMF session
  267. * key(input) - contains private key handle needed for signing
  268. * AlgOID(input) - contains algorithm to be used for signing
  269. * tobesigned(input) - pointer to a KMF_DATA structure containing
  270. * the data to be signed
  271. * output(output) - pointer to the KMF_DATA structure containing the
  272. * signed data
  273. *
  274. * Returns:
  275. * A KMF_RETURN value indicating success or specifying a particular
  276. * error condition.
  277. * The value KMF_OK indicates success. All other values represent
  278. * an error condition.
  279. *
  280. */
  281. KMF_RETURN
  282. KMF_SignDataWithKey(KMF_HANDLE_T handle,
  283. KMF_KEY_HANDLE *key,
  284. KMF_OID *AlgOID,
  285. KMF_DATA *tobesigned,
  286. KMF_DATA *output)
  287. {
  288. KMF_ATTRIBUTE attlist[5]; /* only 5 attrs for SignData */
  289. int i = 0;
  290. if (key == NULL || AlgOID == NULL ||
  291. tobesigned == NULL || output == NULL)
  292. return (KMF_ERR_BAD_PARAMETER);
  293. kmf_set_attr_at_index(attlist, i,
  294. KMF_KEYSTORE_TYPE_ATTR, &key->kstype, sizeof (key->kstype));
  295. i++;
  296. kmf_set_attr_at_index(attlist, i,
  297. KMF_KEY_HANDLE_ATTR, key, sizeof (KMF_KEY_HANDLE));
  298. i++;
  299. kmf_set_attr_at_index(attlist, i,
  300. KMF_OID_ATTR, AlgOID, sizeof (KMF_OID));
  301. i++;
  302. kmf_set_attr_at_index(attlist, i,
  303. KMF_DATA_ATTR, tobesigned, sizeof (KMF_DATA));
  304. i++;
  305. kmf_set_attr_at_index(attlist, i,
  306. KMF_OUT_DATA_ATTR, output, sizeof (KMF_DATA));
  307. i++;
  308. return (kmf_sign_data(handle, i, attlist));
  309. }
  310. KMF_RETURN
  311. KMF_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *params,
  312. KMF_KEY_HANDLE *keys, uint32_t *numkeys)
  313. {
  314. KMF_ATTRIBUTE attlist[16]; /* Max 16 attributes used here */
  315. int i = 0;
  316. if (params == NULL || numkeys == NULL)
  317. return (KMF_ERR_BAD_PARAMETER);
  318. kmf_set_attr_at_index(attlist, i,
  319. KMF_KEYSTORE_TYPE_ATTR, &params->kstype, sizeof (params->kstype));
  320. i++;
  321. if (keys) {
  322. kmf_set_attr_at_index(attlist, i,
  323. KMF_KEY_HANDLE_ATTR, keys, sizeof (KMF_KEY_HANDLE));
  324. i++;
  325. }
  326. kmf_set_attr_at_index(attlist, i,
  327. KMF_COUNT_ATTR, numkeys, sizeof (uint32_t));
  328. i++;
  329. kmf_set_attr_at_index(attlist, i,
  330. KMF_KEYALG_ATTR, &params->keytype, sizeof (params->keytype));
  331. i++;
  332. kmf_set_attr_at_index(attlist, i,
  333. KMF_KEYCLASS_ATTR, &params->keyclass, sizeof (params->keyclass));
  334. i++;
  335. kmf_set_attr_at_index(attlist, i,
  336. KMF_ENCODE_FORMAT_ATTR, &params->format, sizeof (params->format));
  337. i++;
  338. if (params->findLabel != NULL) {
  339. kmf_set_attr_at_index(attlist, i,
  340. KMF_KEYLABEL_ATTR, params->findLabel,
  341. strlen(params->findLabel));
  342. i++;
  343. }
  344. if (params->idstr != NULL) {
  345. kmf_set_attr_at_index(attlist, i,
  346. KMF_IDSTR_ATTR, params->idstr,
  347. strlen(params->idstr));
  348. i++;
  349. }
  350. if (params->cred.credlen > 0) {
  351. kmf_set_attr_at_index(attlist, i,
  352. KMF_CREDENTIAL_ATTR, &params->cred,
  353. sizeof (KMF_CREDENTIAL));
  354. i++;
  355. }
  356. if (params->kstype == KMF_KEYSTORE_NSS) {
  357. if (params->nssparms.slotlabel != NULL) {
  358. kmf_set_attr_at_index(attlist, i,
  359. KMF_TOKEN_LABEL_ATTR,
  360. params->nssparms.slotlabel,
  361. strlen(params->nssparms.slotlabel));
  362. i++;
  363. }
  364. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  365. if (params->sslparms.dirpath != NULL) {
  366. kmf_set_attr_at_index(attlist, i,
  367. KMF_DIRPATH_ATTR,
  368. params->sslparms.dirpath,
  369. strlen(params->sslparms.dirpath));
  370. i++;
  371. }
  372. if (params->sslparms.keyfile != NULL) {
  373. kmf_set_attr_at_index(attlist, i,
  374. KMF_KEY_FILENAME_ATTR,
  375. params->sslparms.keyfile,
  376. strlen(params->sslparms.keyfile));
  377. i++;
  378. }
  379. kmf_set_attr_at_index(attlist, i,
  380. KMF_ENCODE_FORMAT_ATTR,
  381. &params->sslparms.format,
  382. sizeof (params->sslparms.format));
  383. i++;
  384. } else if (params->kstype == KMF_KEYSTORE_PK11TOKEN) {
  385. kmf_set_attr_at_index(attlist, i,
  386. KMF_TOKEN_BOOL_ATTR,
  387. &params->pkcs11parms.token,
  388. sizeof (params->pkcs11parms.token));
  389. i++;
  390. kmf_set_attr_at_index(attlist, i,
  391. KMF_PRIVATE_BOOL_ATTR,
  392. &params->pkcs11parms.private,
  393. sizeof (params->pkcs11parms.private));
  394. i++;
  395. }
  396. return (kmf_find_key(handle, i, attlist));
  397. }
  398. KMF_RETURN
  399. KMF_CreateKeypair(KMF_HANDLE_T handle,
  400. KMF_CREATEKEYPAIR_PARAMS *params,
  401. KMF_KEY_HANDLE *privKey,
  402. KMF_KEY_HANDLE *pubKey)
  403. {
  404. KMF_ATTRIBUTE attlist[12]; /* max 12 attrs used here */
  405. int i = 0;
  406. if (handle == NULL || params == NULL ||
  407. privKey == NULL || pubKey == NULL)
  408. return (KMF_ERR_BAD_PARAMETER);
  409. (void) memset(privKey, 0, sizeof (KMF_KEY_HANDLE));
  410. (void) memset(pubKey, 0, sizeof (KMF_KEY_HANDLE));
  411. kmf_set_attr_at_index(attlist, i,
  412. KMF_KEYSTORE_TYPE_ATTR, &params->kstype, sizeof (params->kstype));
  413. i++;
  414. kmf_set_attr_at_index(attlist, i,
  415. KMF_KEYALG_ATTR, &params->keytype, sizeof (params->keytype));
  416. i++;
  417. kmf_set_attr_at_index(attlist, i,
  418. KMF_KEYLENGTH_ATTR, &params->keylength, sizeof (params->keylength));
  419. i++;
  420. if (params->keylabel != NULL) {
  421. kmf_set_attr_at_index(attlist, i,
  422. KMF_KEYLABEL_ATTR, params->keylabel,
  423. strlen(params->keylabel));
  424. i++;
  425. }
  426. if (params->cred.credlen > 0) {
  427. kmf_set_attr_at_index(attlist, i,
  428. KMF_CREDENTIAL_ATTR, &params->cred,
  429. sizeof (KMF_CREDENTIAL));
  430. i++;
  431. }
  432. if (params->rsa_exponent.len > 0) {
  433. kmf_set_attr_at_index(attlist, i,
  434. KMF_RSAEXP_ATTR, &params->cred,
  435. sizeof (KMF_BIGINT));
  436. i++;
  437. }
  438. kmf_set_attr_at_index(attlist, i, KMF_PRIVKEY_HANDLE_ATTR, privKey,
  439. sizeof (KMF_KEY_HANDLE));
  440. i++;
  441. kmf_set_attr_at_index(attlist, i, KMF_PUBKEY_HANDLE_ATTR, pubKey,
  442. sizeof (KMF_KEY_HANDLE));
  443. i++;
  444. if (params->kstype == KMF_KEYSTORE_NSS) {
  445. if (params->nssparms.slotlabel != NULL) {
  446. kmf_set_attr_at_index(attlist, i,
  447. KMF_TOKEN_LABEL_ATTR,
  448. params->nssparms.slotlabel,
  449. strlen(params->nssparms.slotlabel));
  450. i++;
  451. }
  452. } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
  453. if (params->sslparms.dirpath != NULL) {
  454. kmf_set_attr_at_index(attlist, i,
  455. KMF_DIRPATH_ATTR,
  456. params->sslparms.dirpath,
  457. strlen(params->sslparms.dirpath));
  458. i++;
  459. }
  460. if (params->sslparms.keyfile != NULL) {
  461. kmf_set_attr_at_index(attlist, i,
  462. KMF_KEY_FILENAME_ATTR,
  463. params->sslparms.keyfile,
  464. strlen(params->sslparms.keyfile));
  465. i++;
  466. }
  467. kmf_set_attr_at_index(attlist, i,
  468. KMF_ENCODE_FORMAT_ATTR,
  469. &params->sslparms.format,
  470. sizeof (params->sslparms.format));
  471. i++;
  472. }
  473. return (kmf_create_keypair(handle, i, attlist));
  474. }