PageRenderTime 81ms CodeModel.GetById 34ms RepoModel.GetById 1ms app.codeStats 1ms

/usr/src/lib/libkmf/plugins/kmf_openssl/common/openssl_spi.c

https://bitbucket.org/nexenta/illumos-nexenta
C | 5597 lines | 4351 code | 798 blank | 448 comment | 1726 complexity | fe51d8c69f60cf4bf7241d0037c1e994 MD5 | raw file
Possible License(s): LGPL-2.0, BSD-3-Clause-No-Nuclear-License-2014, MPL-2.0-no-copyleft-exception, AGPL-1.0, GPL-3.0, LGPL-3.0, BSD-2-Clause, AGPL-3.0, BSD-3-Clause, GPL-2.0, LGPL-2.1, 0BSD

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
  3. *
  4. * Use is subject to license terms.
  5. */
  6. /*
  7. * Copyright (c) 2012, OmniTI Computer Consulting, Inc. All rights reserved.
  8. */
  9. /*
  10. * Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
  11. * project 2000.
  12. */
  13. /*
  14. * ====================================================================
  15. * Copyright (c) 2000-2004 The OpenSSL Project. All rights reserved.
  16. *
  17. * Redistribution and use in source and binary forms, with or without
  18. * modification, are permitted provided that the following conditions
  19. * are met:
  20. *
  21. * 1. Redistributions of source code must retain the above copyright
  22. * notice, this list of conditions and the following disclaimer.
  23. *
  24. * 2. Redistributions in binary form must reproduce the above copyright
  25. * notice, this list of conditions and the following disclaimer in
  26. * the documentation and/or other materials provided with the
  27. * distribution.
  28. *
  29. * 3. All advertising materials mentioning features or use of this
  30. * software must display the following acknowledgment:
  31. * "This product includes software developed by the OpenSSL Project
  32. * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
  33. *
  34. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  35. * endorse or promote products derived from this software without
  36. * prior written permission. For written permission, please contact
  37. * licensing@OpenSSL.org.
  38. *
  39. * 5. Products derived from this software may not be called "OpenSSL"
  40. * nor may "OpenSSL" appear in their names without prior written
  41. * permission of the OpenSSL Project.
  42. *
  43. * 6. Redistributions of any form whatsoever must retain the following
  44. * acknowledgment:
  45. * "This product includes software developed by the OpenSSL Project
  46. * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
  47. *
  48. * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  49. * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  50. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  51. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  52. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  53. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  54. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  55. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  56. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  57. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  58. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  59. * OF THE POSSIBILITY OF SUCH DAMAGE.
  60. * ====================================================================
  61. *
  62. * This product includes cryptographic software written by Eric Young
  63. * (eay@cryptsoft.com). This product includes software written by Tim
  64. * Hudson (tjh@cryptsoft.com).
  65. *
  66. */
  67. #include <stdlib.h>
  68. #include <kmfapiP.h>
  69. #include <ber_der.h>
  70. #include <fcntl.h>
  71. #include <sys/stat.h>
  72. #include <dirent.h>
  73. #include <cryptoutil.h>
  74. #include <synch.h>
  75. #include <thread.h>
  76. /* OPENSSL related headers */
  77. #include <openssl/bio.h>
  78. #include <openssl/bn.h>
  79. #include <openssl/asn1.h>
  80. #include <openssl/err.h>
  81. #include <openssl/bn.h>
  82. #include <openssl/x509.h>
  83. #include <openssl/rsa.h>
  84. #include <openssl/dsa.h>
  85. #include <openssl/x509v3.h>
  86. #include <openssl/objects.h>
  87. #include <openssl/pem.h>
  88. #include <openssl/pkcs12.h>
  89. #include <openssl/ocsp.h>
  90. #include <openssl/des.h>
  91. #include <openssl/rand.h>
  92. #define PRINT_ANY_EXTENSION (\
  93. KMF_X509_EXT_KEY_USAGE |\
  94. KMF_X509_EXT_CERT_POLICIES |\
  95. KMF_X509_EXT_SUBJALTNAME |\
  96. KMF_X509_EXT_BASIC_CONSTRAINTS |\
  97. KMF_X509_EXT_NAME_CONSTRAINTS |\
  98. KMF_X509_EXT_POLICY_CONSTRAINTS |\
  99. KMF_X509_EXT_EXT_KEY_USAGE |\
  100. KMF_X509_EXT_INHIBIT_ANY_POLICY |\
  101. KMF_X509_EXT_AUTH_KEY_ID |\
  102. KMF_X509_EXT_SUBJ_KEY_ID |\
  103. KMF_X509_EXT_POLICY_MAPPING)
  104. static uchar_t P[] = { 0x00, 0x8d, 0xf2, 0xa4, 0x94, 0x49, 0x22, 0x76,
  105. 0xaa, 0x3d, 0x25, 0x75, 0x9b, 0xb0, 0x68, 0x69,
  106. 0xcb, 0xea, 0xc0, 0xd8, 0x3a, 0xfb, 0x8d, 0x0c,
  107. 0xf7, 0xcb, 0xb8, 0x32, 0x4f, 0x0d, 0x78, 0x82,
  108. 0xe5, 0xd0, 0x76, 0x2f, 0xc5, 0xb7, 0x21, 0x0e,
  109. 0xaf, 0xc2, 0xe9, 0xad, 0xac, 0x32, 0xab, 0x7a,
  110. 0xac, 0x49, 0x69, 0x3d, 0xfb, 0xf8, 0x37, 0x24,
  111. 0xc2, 0xec, 0x07, 0x36, 0xee, 0x31, 0xc8, 0x02,
  112. 0x91 };
  113. static uchar_t Q[] = { 0x00, 0xc7, 0x73, 0x21, 0x8c, 0x73, 0x7e, 0xc8,
  114. 0xee, 0x99, 0x3b, 0x4f, 0x2d, 0xed, 0x30, 0xf4,
  115. 0x8e, 0xda, 0xce, 0x91, 0x5f };
  116. static uchar_t G[] = { 0x00, 0x62, 0x6d, 0x02, 0x78, 0x39, 0xea, 0x0a,
  117. 0x13, 0x41, 0x31, 0x63, 0xa5, 0x5b, 0x4c, 0xb5,
  118. 0x00, 0x29, 0x9d, 0x55, 0x22, 0x95, 0x6c, 0xef,
  119. 0xcb, 0x3b, 0xff, 0x10, 0xf3, 0x99, 0xce, 0x2c,
  120. 0x2e, 0x71, 0xcb, 0x9d, 0xe5, 0xfa, 0x24, 0xba,
  121. 0xbf, 0x58, 0xe5, 0xb7, 0x95, 0x21, 0x92, 0x5c,
  122. 0x9c, 0xc4, 0x2e, 0x9f, 0x6f, 0x46, 0x4b, 0x08,
  123. 0x8c, 0xc5, 0x72, 0xaf, 0x53, 0xe6, 0xd7, 0x88,
  124. 0x02 };
  125. #define SET_ERROR(h, c) h->lasterr.kstype = KMF_KEYSTORE_OPENSSL; \
  126. h->lasterr.errcode = c;
  127. #define SET_SYS_ERROR(h, c) h->lasterr.kstype = -1; h->lasterr.errcode = c;
  128. /*
  129. * Declare some new macros for managing stacks of EVP_PKEYS, similar to
  130. * what wanboot did.
  131. */
  132. DECLARE_STACK_OF(EVP_PKEY)
  133. #define sk_EVP_PKEY_new_null() SKM_sk_new_null(EVP_PKEY)
  134. #define sk_EVP_PKEY_free(st) SKM_sk_free(EVP_PKEY, (st))
  135. #define sk_EVP_PKEY_num(st) SKM_sk_num(EVP_PKEY, (st))
  136. #define sk_EVP_PKEY_value(st, i) SKM_sk_value(EVP_PKEY, (st), (i))
  137. #define sk_EVP_PKEY_push(st, val) SKM_sk_push(EVP_PKEY, (st), (val))
  138. #define sk_EVP_PKEY_pop_free(st, free_func) SKM_sk_pop_free(EVP_PKEY, (st), \
  139. (free_func))
  140. mutex_t init_lock = DEFAULTMUTEX;
  141. static int ssl_initialized = 0;
  142. static BIO *bio_err = NULL;
  143. static int
  144. test_for_file(char *, mode_t);
  145. static KMF_RETURN
  146. openssl_parse_bag(PKCS12_SAFEBAG *, char *, int,
  147. STACK_OF(EVP_PKEY) *, STACK_OF(X509) *);
  148. static KMF_RETURN
  149. local_export_pk12(KMF_HANDLE_T, KMF_CREDENTIAL *, int, KMF_X509_DER_CERT *,
  150. int, KMF_KEY_HANDLE *, char *);
  151. static KMF_RETURN set_pkey_attrib(EVP_PKEY *, ASN1_TYPE *, int);
  152. static KMF_RETURN
  153. extract_pem(KMF_HANDLE *, char *, char *, KMF_BIGINT *, char *,
  154. CK_UTF8CHAR *, CK_ULONG, EVP_PKEY **, KMF_DATA **, int *);
  155. static KMF_RETURN
  156. kmf_load_cert(KMF_HANDLE *, char *, char *, KMF_BIGINT *, KMF_CERT_VALIDITY,
  157. char *, KMF_DATA *);
  158. static KMF_RETURN
  159. load_certs(KMF_HANDLE *, char *, char *, KMF_BIGINT *, KMF_CERT_VALIDITY,
  160. char *, KMF_DATA **, uint32_t *);
  161. static KMF_RETURN
  162. sslBN2KMFBN(BIGNUM *, KMF_BIGINT *);
  163. static EVP_PKEY *
  164. ImportRawRSAKey(KMF_RAW_RSA_KEY *);
  165. static KMF_RETURN
  166. convertToRawKey(EVP_PKEY *, KMF_RAW_KEY_DATA *);
  167. KMF_RETURN
  168. OpenSSL_FindCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  169. void
  170. OpenSSL_FreeKMFCert(KMF_HANDLE_T, KMF_X509_DER_CERT *);
  171. KMF_RETURN
  172. OpenSSL_StoreCert(KMF_HANDLE_T handle, int, KMF_ATTRIBUTE *);
  173. KMF_RETURN
  174. OpenSSL_DeleteCert(KMF_HANDLE_T handle, int, KMF_ATTRIBUTE *);
  175. KMF_RETURN
  176. OpenSSL_CreateKeypair(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  177. KMF_RETURN
  178. OpenSSL_StoreKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  179. KMF_RETURN
  180. OpenSSL_EncodePubKeyData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_DATA *);
  181. KMF_RETURN
  182. OpenSSL_SignData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_OID *,
  183. KMF_DATA *, KMF_DATA *);
  184. KMF_RETURN
  185. OpenSSL_DeleteKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  186. KMF_RETURN
  187. OpenSSL_ImportCRL(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  188. KMF_RETURN
  189. OpenSSL_DeleteCRL(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  190. KMF_RETURN
  191. OpenSSL_ListCRL(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  192. KMF_RETURN
  193. OpenSSL_FindCertInCRL(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  194. KMF_RETURN
  195. OpenSSL_CertGetPrintable(KMF_HANDLE_T, const KMF_DATA *,
  196. KMF_PRINTABLE_ITEM, char *);
  197. KMF_RETURN
  198. OpenSSL_GetErrorString(KMF_HANDLE_T, char **);
  199. KMF_RETURN
  200. OpenSSL_FindPrikeyByCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  201. KMF_RETURN
  202. OpenSSL_DecryptData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_OID *,
  203. KMF_DATA *, KMF_DATA *);
  204. KMF_RETURN
  205. OpenSSL_CreateOCSPRequest(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  206. KMF_RETURN
  207. OpenSSL_GetOCSPStatusForCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  208. KMF_RETURN
  209. OpenSSL_FindKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  210. KMF_RETURN
  211. OpenSSL_ExportPK12(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  212. KMF_RETURN
  213. OpenSSL_CreateSymKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
  214. KMF_RETURN
  215. OpenSSL_GetSymKeyValue(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_RAW_SYM_KEY *);
  216. KMF_RETURN
  217. OpenSSL_VerifyCRLFile(KMF_HANDLE_T, char *, KMF_DATA *);
  218. KMF_RETURN
  219. OpenSSL_CheckCRLDate(KMF_HANDLE_T, char *);
  220. static
  221. KMF_PLUGIN_FUNCLIST openssl_plugin_table =
  222. {
  223. 1, /* Version */
  224. NULL, /* ConfigureKeystore */
  225. OpenSSL_FindCert,
  226. OpenSSL_FreeKMFCert,
  227. OpenSSL_StoreCert,
  228. NULL, /* ImportCert */
  229. OpenSSL_ImportCRL,
  230. OpenSSL_DeleteCert,
  231. OpenSSL_DeleteCRL,
  232. OpenSSL_CreateKeypair,
  233. OpenSSL_FindKey,
  234. OpenSSL_EncodePubKeyData,
  235. OpenSSL_SignData,
  236. OpenSSL_DeleteKey,
  237. OpenSSL_ListCRL,
  238. NULL, /* FindCRL */
  239. OpenSSL_FindCertInCRL,
  240. OpenSSL_GetErrorString,
  241. OpenSSL_FindPrikeyByCert,
  242. OpenSSL_DecryptData,
  243. OpenSSL_ExportPK12,
  244. OpenSSL_CreateSymKey,
  245. OpenSSL_GetSymKeyValue,
  246. NULL, /* SetTokenPin */
  247. OpenSSL_StoreKey,
  248. NULL /* Finalize */
  249. };
  250. static mutex_t *lock_cs;
  251. static long *lock_count;
  252. static void
  253. /* ARGSUSED1 */
  254. locking_cb(int mode, int type, char *file, int line)
  255. {
  256. if (mode & CRYPTO_LOCK) {
  257. (void) mutex_lock(&(lock_cs[type]));
  258. lock_count[type]++;
  259. } else {
  260. (void) mutex_unlock(&(lock_cs[type]));
  261. }
  262. }
  263. static unsigned long
  264. thread_id()
  265. {
  266. return ((unsigned long)thr_self());
  267. }
  268. KMF_PLUGIN_FUNCLIST *
  269. KMF_Plugin_Initialize()
  270. {
  271. int i;
  272. (void) mutex_lock(&init_lock);
  273. if (!ssl_initialized) {
  274. /*
  275. * Add support for extension OIDs that are not yet in the
  276. * openssl default set.
  277. */
  278. (void) OBJ_create("2.5.29.30", "nameConstraints",
  279. "X509v3 Name Constraints");
  280. (void) OBJ_create("2.5.29.33", "policyMappings",
  281. "X509v3 Policy Mappings");
  282. (void) OBJ_create("2.5.29.36", "policyConstraints",
  283. "X509v3 Policy Constraints");
  284. (void) OBJ_create("2.5.29.46", "freshestCRL",
  285. "X509v3 Freshest CRL");
  286. (void) OBJ_create("2.5.29.54", "inhibitAnyPolicy",
  287. "X509v3 Inhibit Any-Policy");
  288. /*
  289. * Set up for thread-safe operation.
  290. */
  291. lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof (mutex_t));
  292. if (lock_cs == NULL) {
  293. (void) mutex_unlock(&init_lock);
  294. return (NULL);
  295. }
  296. lock_count = OPENSSL_malloc(CRYPTO_num_locks() * sizeof (long));
  297. if (lock_count == NULL) {
  298. OPENSSL_free(lock_cs);
  299. (void) mutex_unlock(&init_lock);
  300. return (NULL);
  301. }
  302. for (i = 0; i < CRYPTO_num_locks(); i++) {
  303. lock_count[i] = 0;
  304. (void) mutex_init(&lock_cs[i], USYNC_THREAD, NULL);
  305. }
  306. CRYPTO_set_id_callback((unsigned long (*)())thread_id);
  307. if (CRYPTO_get_locking_callback() == NULL)
  308. CRYPTO_set_locking_callback((void (*)())locking_cb);
  309. OpenSSL_add_all_algorithms();
  310. /* Enable error strings for reporting */
  311. ERR_load_crypto_strings();
  312. ssl_initialized = 1;
  313. }
  314. (void) mutex_unlock(&init_lock);
  315. return (&openssl_plugin_table);
  316. }
  317. /*
  318. * Convert an SSL DN to a KMF DN.
  319. */
  320. static KMF_RETURN
  321. get_x509_dn(X509_NAME *sslDN, KMF_X509_NAME *kmfDN)
  322. {
  323. KMF_DATA derdata;
  324. KMF_RETURN rv = KMF_OK;
  325. uchar_t *tmp;
  326. /* Convert to raw DER format */
  327. derdata.Length = i2d_X509_NAME(sslDN, NULL);
  328. if ((tmp = derdata.Data = (uchar_t *)OPENSSL_malloc(derdata.Length))
  329. == NULL) {
  330. return (KMF_ERR_MEMORY);
  331. }
  332. (void) i2d_X509_NAME(sslDN, &tmp);
  333. /* Decode to KMF format */
  334. rv = DerDecodeName(&derdata, kmfDN);
  335. if (rv != KMF_OK) {
  336. rv = KMF_ERR_BAD_CERT_FORMAT;
  337. }
  338. OPENSSL_free(derdata.Data);
  339. return (rv);
  340. }
  341. int
  342. isdir(char *path)
  343. {
  344. struct stat s;
  345. if (stat(path, &s) == -1)
  346. return (0);
  347. return ((s.st_mode & S_IFMT) == S_IFDIR);
  348. }
  349. static KMF_RETURN
  350. ssl_cert2KMFDATA(KMF_HANDLE *kmfh, X509 *x509cert, KMF_DATA *cert)
  351. {
  352. KMF_RETURN rv = KMF_OK;
  353. unsigned char *buf = NULL, *p;
  354. int len;
  355. /*
  356. * Convert the X509 internal struct to DER encoded data
  357. */
  358. if ((len = i2d_X509(x509cert, NULL)) < 0) {
  359. SET_ERROR(kmfh, ERR_get_error());
  360. rv = KMF_ERR_BAD_CERT_FORMAT;
  361. goto cleanup;
  362. }
  363. if ((buf = malloc(len)) == NULL) {
  364. SET_SYS_ERROR(kmfh, errno);
  365. rv = KMF_ERR_MEMORY;
  366. goto cleanup;
  367. }
  368. /*
  369. * i2d_X509 will increment the buf pointer so that we need to
  370. * save it.
  371. */
  372. p = buf;
  373. if ((len = i2d_X509(x509cert, &p)) < 0) {
  374. SET_ERROR(kmfh, ERR_get_error());
  375. free(buf);
  376. rv = KMF_ERR_BAD_CERT_FORMAT;
  377. goto cleanup;
  378. }
  379. /* caller's responsibility to free it */
  380. cert->Data = buf;
  381. cert->Length = len;
  382. cleanup:
  383. if (rv != KMF_OK) {
  384. if (buf)
  385. free(buf);
  386. cert->Data = NULL;
  387. cert->Length = 0;
  388. }
  389. return (rv);
  390. }
  391. static KMF_RETURN
  392. check_cert(X509 *xcert, char *issuer, char *subject, KMF_BIGINT *serial,
  393. boolean_t *match)
  394. {
  395. KMF_RETURN rv = KMF_OK;
  396. boolean_t findIssuer = FALSE;
  397. boolean_t findSubject = FALSE;
  398. boolean_t findSerial = FALSE;
  399. KMF_X509_NAME issuerDN, subjectDN;
  400. KMF_X509_NAME certIssuerDN, certSubjectDN;
  401. *match = FALSE;
  402. if (xcert == NULL) {
  403. return (KMF_ERR_BAD_PARAMETER);
  404. }
  405. (void) memset(&issuerDN, 0, sizeof (KMF_X509_NAME));
  406. (void) memset(&subjectDN, 0, sizeof (KMF_X509_NAME));
  407. (void) memset(&certIssuerDN, 0, sizeof (KMF_X509_NAME));
  408. (void) memset(&certSubjectDN, 0, sizeof (KMF_X509_NAME));
  409. if (issuer != NULL && strlen(issuer)) {
  410. rv = kmf_dn_parser(issuer, &issuerDN);
  411. if (rv != KMF_OK)
  412. return (KMF_ERR_BAD_PARAMETER);
  413. rv = get_x509_dn(xcert->cert_info->issuer, &certIssuerDN);
  414. if (rv != KMF_OK) {
  415. kmf_free_dn(&issuerDN);
  416. return (KMF_ERR_BAD_PARAMETER);
  417. }
  418. findIssuer = TRUE;
  419. }
  420. if (subject != NULL && strlen(subject)) {
  421. rv = kmf_dn_parser(subject, &subjectDN);
  422. if (rv != KMF_OK) {
  423. rv = KMF_ERR_BAD_PARAMETER;
  424. goto cleanup;
  425. }
  426. rv = get_x509_dn(xcert->cert_info->subject, &certSubjectDN);
  427. if (rv != KMF_OK) {
  428. rv = KMF_ERR_BAD_PARAMETER;
  429. goto cleanup;
  430. }
  431. findSubject = TRUE;
  432. }
  433. if (serial != NULL && serial->val != NULL)
  434. findSerial = TRUE;
  435. if (findSerial) {
  436. BIGNUM *bn;
  437. /* Comparing BIGNUMs is a pain! */
  438. bn = ASN1_INTEGER_to_BN(xcert->cert_info->serialNumber, NULL);
  439. if (bn != NULL) {
  440. int bnlen = BN_num_bytes(bn);
  441. if (bnlen == serial->len) {
  442. uchar_t *a = malloc(bnlen);
  443. if (a == NULL) {
  444. rv = KMF_ERR_MEMORY;
  445. BN_free(bn);
  446. goto cleanup;
  447. }
  448. bnlen = BN_bn2bin(bn, a);
  449. *match = (memcmp(a, serial->val, serial->len) ==
  450. 0);
  451. rv = KMF_OK;
  452. free(a);
  453. }
  454. BN_free(bn);
  455. if (!(*match))
  456. goto cleanup;
  457. } else {
  458. rv = KMF_OK;
  459. goto cleanup;
  460. }
  461. }
  462. if (findIssuer) {
  463. *match = (kmf_compare_rdns(&issuerDN, &certIssuerDN) == 0);
  464. if ((*match) == B_FALSE) {
  465. /* stop checking and bail */
  466. rv = KMF_OK;
  467. goto cleanup;
  468. }
  469. }
  470. if (findSubject) {
  471. *match = (kmf_compare_rdns(&subjectDN, &certSubjectDN) == 0);
  472. if ((*match) == B_FALSE) {
  473. /* stop checking and bail */
  474. rv = KMF_OK;
  475. goto cleanup;
  476. }
  477. }
  478. *match = TRUE;
  479. cleanup:
  480. if (findIssuer) {
  481. kmf_free_dn(&issuerDN);
  482. kmf_free_dn(&certIssuerDN);
  483. }
  484. if (findSubject) {
  485. kmf_free_dn(&subjectDN);
  486. kmf_free_dn(&certSubjectDN);
  487. }
  488. return (rv);
  489. }
  490. /*
  491. * This function loads a certificate file into an X509 data structure, and
  492. * checks if its issuer, subject or the serial number matches with those
  493. * values. If it matches, then return the X509 data structure.
  494. */
  495. static KMF_RETURN
  496. load_X509cert(KMF_HANDLE *kmfh,
  497. char *issuer, char *subject, KMF_BIGINT *serial,
  498. char *pathname, X509 **outcert)
  499. {
  500. KMF_RETURN rv = KMF_OK;
  501. X509 *xcert = NULL;
  502. BIO *bcert = NULL;
  503. boolean_t match = FALSE;
  504. KMF_ENCODE_FORMAT format;
  505. /*
  506. * auto-detect the file format, regardless of what
  507. * the 'format' parameters in the params say.
  508. */
  509. rv = kmf_get_file_format(pathname, &format);
  510. if (rv != KMF_OK) {
  511. if (rv == KMF_ERR_OPEN_FILE)
  512. rv = KMF_ERR_CERT_NOT_FOUND;
  513. return (rv);
  514. }
  515. /* Not ASN1(DER) format */
  516. if ((bcert = BIO_new_file(pathname, "rb")) == NULL) {
  517. SET_ERROR(kmfh, ERR_get_error());
  518. rv = KMF_ERR_OPEN_FILE;
  519. goto cleanup;
  520. }
  521. if (format == KMF_FORMAT_PEM)
  522. xcert = PEM_read_bio_X509_AUX(bcert, NULL, NULL, NULL);
  523. else if (format == KMF_FORMAT_ASN1)
  524. xcert = d2i_X509_bio(bcert, NULL);
  525. else if (format == KMF_FORMAT_PKCS12) {
  526. PKCS12 *p12 = d2i_PKCS12_bio(bcert, NULL);
  527. if (p12 != NULL) {
  528. (void) PKCS12_parse(p12, NULL, NULL, &xcert, NULL);
  529. PKCS12_free(p12);
  530. p12 = NULL;
  531. } else {
  532. SET_ERROR(kmfh, ERR_get_error());
  533. rv = KMF_ERR_BAD_CERT_FORMAT;
  534. }
  535. } else {
  536. rv = KMF_ERR_BAD_PARAMETER;
  537. goto cleanup;
  538. }
  539. if (xcert == NULL) {
  540. SET_ERROR(kmfh, ERR_get_error());
  541. rv = KMF_ERR_BAD_CERT_FORMAT;
  542. goto cleanup;
  543. }
  544. if (check_cert(xcert, issuer, subject, serial, &match) != KMF_OK ||
  545. match == FALSE) {
  546. rv = KMF_ERR_CERT_NOT_FOUND;
  547. goto cleanup;
  548. }
  549. if (outcert != NULL) {
  550. *outcert = xcert;
  551. }
  552. cleanup:
  553. if (bcert != NULL) (void) BIO_free(bcert);
  554. if (rv != KMF_OK && xcert != NULL)
  555. X509_free(xcert);
  556. return (rv);
  557. }
  558. static int
  559. datacmp(const void *a, const void *b)
  560. {
  561. KMF_DATA *adata = (KMF_DATA *)a;
  562. KMF_DATA *bdata = (KMF_DATA *)b;
  563. if (adata->Length > bdata->Length)
  564. return (-1);
  565. if (adata->Length < bdata->Length)
  566. return (1);
  567. return (0);
  568. }
  569. static KMF_RETURN
  570. load_certs(KMF_HANDLE *kmfh, char *issuer, char *subject, KMF_BIGINT *serial,
  571. KMF_CERT_VALIDITY validity, char *pathname,
  572. KMF_DATA **certlist, uint32_t *numcerts)
  573. {
  574. KMF_RETURN rv = KMF_OK;
  575. int i;
  576. KMF_DATA *certs = NULL;
  577. int nc = 0;
  578. int hits = 0;
  579. KMF_ENCODE_FORMAT format;
  580. rv = kmf_get_file_format(pathname, &format);
  581. if (rv != KMF_OK) {
  582. if (rv == KMF_ERR_OPEN_FILE)
  583. rv = KMF_ERR_CERT_NOT_FOUND;
  584. return (rv);
  585. }
  586. if (format == KMF_FORMAT_ASN1) {
  587. /* load a single certificate */
  588. certs = (KMF_DATA *)malloc(sizeof (KMF_DATA));
  589. if (certs == NULL)
  590. return (KMF_ERR_MEMORY);
  591. certs->Data = NULL;
  592. certs->Length = 0;
  593. rv = kmf_load_cert(kmfh, issuer, subject, serial, validity,
  594. pathname, certs);
  595. if (rv == KMF_OK) {
  596. *certlist = certs;
  597. *numcerts = 1;
  598. } else {
  599. kmf_free_data(certs);
  600. free(certs);
  601. certs = NULL;
  602. }
  603. return (rv);
  604. } else if (format == KMF_FORMAT_PKCS12) {
  605. /* We need a credential to access a PKCS#12 file */
  606. rv = KMF_ERR_BAD_CERT_FORMAT;
  607. } else if (format == KMF_FORMAT_PEM ||
  608. format != KMF_FORMAT_PEM_KEYPAIR) {
  609. /* This function only works on PEM files */
  610. rv = extract_pem(kmfh, issuer, subject, serial, pathname,
  611. (uchar_t *)NULL, 0, NULL, &certs, &nc);
  612. } else {
  613. return (KMF_ERR_ENCODING);
  614. }
  615. if (rv != KMF_OK)
  616. return (rv);
  617. for (i = 0; i < nc; i++) {
  618. if (validity == KMF_NONEXPIRED_CERTS) {
  619. rv = kmf_check_cert_date(kmfh, &certs[i]);
  620. } else if (validity == KMF_EXPIRED_CERTS) {
  621. rv = kmf_check_cert_date(kmfh, &certs[i]);
  622. if (rv == KMF_OK)
  623. rv = KMF_ERR_CERT_NOT_FOUND;
  624. if (rv == KMF_ERR_VALIDITY_PERIOD)
  625. rv = KMF_OK;
  626. }
  627. if (rv != KMF_OK) {
  628. /* Remove this cert from the list by clearing it. */
  629. kmf_free_data(&certs[i]);
  630. } else {
  631. hits++; /* count valid certs found */
  632. }
  633. rv = KMF_OK;
  634. }
  635. if (rv == KMF_OK && hits > 0) {
  636. /*
  637. * Sort the list of certs by length to put the cleared ones
  638. * at the end so they don't get accessed by the caller.
  639. */
  640. qsort((void *)certs, nc, sizeof (KMF_DATA), datacmp);
  641. *certlist = certs;
  642. /* since we sorted the list, just return the number of hits */
  643. *numcerts = hits;
  644. } else {
  645. if (rv == KMF_OK && hits == 0)
  646. rv = KMF_ERR_CERT_NOT_FOUND;
  647. if (certs != NULL) {
  648. free(certs);
  649. certs = NULL;
  650. }
  651. }
  652. return (rv);
  653. }
  654. static KMF_RETURN
  655. kmf_load_cert(KMF_HANDLE *kmfh,
  656. char *issuer, char *subject, KMF_BIGINT *serial,
  657. KMF_CERT_VALIDITY validity,
  658. char *pathname,
  659. KMF_DATA *cert)
  660. {
  661. KMF_RETURN rv = KMF_OK;
  662. X509 *x509cert = NULL;
  663. rv = load_X509cert(kmfh, issuer, subject, serial, pathname, &x509cert);
  664. if (rv == KMF_OK && x509cert != NULL && cert != NULL) {
  665. rv = ssl_cert2KMFDATA(kmfh, x509cert, cert);
  666. if (rv != KMF_OK) {
  667. goto cleanup;
  668. }
  669. if (validity == KMF_NONEXPIRED_CERTS) {
  670. rv = kmf_check_cert_date(kmfh, cert);
  671. } else if (validity == KMF_EXPIRED_CERTS) {
  672. rv = kmf_check_cert_date(kmfh, cert);
  673. if (rv == KMF_OK) {
  674. /*
  675. * This is a valid cert so skip it.
  676. */
  677. rv = KMF_ERR_CERT_NOT_FOUND;
  678. }
  679. if (rv == KMF_ERR_VALIDITY_PERIOD) {
  680. /*
  681. * We want to return success when we
  682. * find an invalid cert.
  683. */
  684. rv = KMF_OK;
  685. goto cleanup;
  686. }
  687. }
  688. }
  689. cleanup:
  690. if (x509cert != NULL)
  691. X509_free(x509cert);
  692. return (rv);
  693. }
  694. static KMF_RETURN
  695. readAltFormatPrivateKey(KMF_DATA *filedata, EVP_PKEY **pkey)
  696. {
  697. KMF_RETURN ret = KMF_OK;
  698. KMF_RAW_RSA_KEY rsa;
  699. BerElement *asn1 = NULL;
  700. BerValue filebuf;
  701. BerValue OID = { NULL, 0 };
  702. BerValue *Mod = NULL, *PubExp = NULL;
  703. BerValue *PriExp = NULL, *Prime1 = NULL, *Prime2 = NULL;
  704. BerValue *Coef = NULL;
  705. BIGNUM *D = NULL, *P = NULL, *Q = NULL, *COEF = NULL;
  706. BIGNUM *Exp1 = NULL, *Exp2 = NULL, *pminus1 = NULL;
  707. BIGNUM *qminus1 = NULL;
  708. BN_CTX *ctx = NULL;
  709. *pkey = NULL;
  710. filebuf.bv_val = (char *)filedata->Data;
  711. filebuf.bv_len = filedata->Length;
  712. asn1 = kmfder_init(&filebuf);
  713. if (asn1 == NULL) {
  714. ret = KMF_ERR_MEMORY;
  715. goto out;
  716. }
  717. if (kmfber_scanf(asn1, "{{Dn{IIIIII}}}",
  718. &OID, &Mod, &PubExp, &PriExp, &Prime1,
  719. &Prime2, &Coef) == -1) {
  720. ret = KMF_ERR_ENCODING;
  721. goto out;
  722. }
  723. /*
  724. * We have to derive the 2 Exponents using Bignumber math.
  725. * Exp1 = PriExp mod (Prime1 - 1)
  726. * Exp2 = PriExp mod (Prime2 - 1)
  727. */
  728. /* D = PrivateExponent */
  729. D = BN_bin2bn((const uchar_t *)PriExp->bv_val, PriExp->bv_len, D);
  730. if (D == NULL) {
  731. ret = KMF_ERR_MEMORY;
  732. goto out;
  733. }
  734. /* P = Prime1 (first prime factor of Modulus) */
  735. P = BN_bin2bn((const uchar_t *)Prime1->bv_val, Prime1->bv_len, P);
  736. if (D == NULL) {
  737. ret = KMF_ERR_MEMORY;
  738. goto out;
  739. }
  740. /* Q = Prime2 (second prime factor of Modulus) */
  741. Q = BN_bin2bn((const uchar_t *)Prime2->bv_val, Prime2->bv_len, Q);
  742. if ((ctx = BN_CTX_new()) == NULL) {
  743. ret = KMF_ERR_MEMORY;
  744. goto out;
  745. }
  746. /* Compute (P - 1) */
  747. pminus1 = BN_new();
  748. (void) BN_sub(pminus1, P, BN_value_one());
  749. /* Exponent1 = D mod (P - 1) */
  750. Exp1 = BN_new();
  751. (void) BN_mod(Exp1, D, pminus1, ctx);
  752. /* Compute (Q - 1) */
  753. qminus1 = BN_new();
  754. (void) BN_sub(qminus1, Q, BN_value_one());
  755. /* Exponent2 = D mod (Q - 1) */
  756. Exp2 = BN_new();
  757. (void) BN_mod(Exp2, D, qminus1, ctx);
  758. /* Coef = (Inverse Q) mod P */
  759. COEF = BN_new();
  760. (void) BN_mod_inverse(COEF, Q, P, ctx);
  761. /* Convert back to KMF format */
  762. (void) memset(&rsa, 0, sizeof (rsa));
  763. if ((ret = sslBN2KMFBN(Exp1, &rsa.exp1)) != KMF_OK)
  764. goto out;
  765. if ((ret = sslBN2KMFBN(Exp2, &rsa.exp2)) != KMF_OK)
  766. goto out;
  767. if ((ret = sslBN2KMFBN(COEF, &rsa.coef)) != KMF_OK)
  768. goto out;
  769. rsa.mod.val = (uchar_t *)Mod->bv_val;
  770. rsa.mod.len = Mod->bv_len;
  771. rsa.pubexp.val = (uchar_t *)PubExp->bv_val;
  772. rsa.pubexp.len = PubExp->bv_len;
  773. rsa.priexp.val = (uchar_t *)PriExp->bv_val;
  774. rsa.priexp.len = PriExp->bv_len;
  775. rsa.prime1.val = (uchar_t *)Prime1->bv_val;
  776. rsa.prime1.len = Prime1->bv_len;
  777. rsa.prime2.val = (uchar_t *)Prime2->bv_val;
  778. rsa.prime2.len = Prime2->bv_len;
  779. *pkey = ImportRawRSAKey(&rsa);
  780. out:
  781. if (asn1 != NULL)
  782. kmfber_free(asn1, 1);
  783. if (OID.bv_val) {
  784. free(OID.bv_val);
  785. }
  786. if (PriExp)
  787. free(PriExp);
  788. if (Mod)
  789. free(Mod);
  790. if (PubExp)
  791. free(PubExp);
  792. if (Coef) {
  793. (void) memset(Coef->bv_val, 0, Coef->bv_len);
  794. free(Coef->bv_val);
  795. free(Coef);
  796. }
  797. if (Prime1)
  798. free(Prime1);
  799. if (Prime2)
  800. free(Prime2);
  801. if (ctx != NULL)
  802. BN_CTX_free(ctx);
  803. if (D)
  804. BN_clear_free(D);
  805. if (P)
  806. BN_clear_free(P);
  807. if (Q)
  808. BN_clear_free(Q);
  809. if (pminus1)
  810. BN_clear_free(pminus1);
  811. if (qminus1)
  812. BN_clear_free(qminus1);
  813. if (Exp1)
  814. BN_clear_free(Exp1);
  815. if (Exp2)
  816. BN_clear_free(Exp2);
  817. return (ret);
  818. }
  819. static EVP_PKEY *
  820. openssl_load_key(KMF_HANDLE_T handle, const char *file)
  821. {
  822. BIO *keyfile = NULL;
  823. EVP_PKEY *pkey = NULL;
  824. KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
  825. KMF_ENCODE_FORMAT format;
  826. KMF_RETURN rv;
  827. KMF_DATA filedata;
  828. if (file == NULL) {
  829. return (NULL);
  830. }
  831. if (kmf_get_file_format((char *)file, &format) != KMF_OK)
  832. return (NULL);
  833. keyfile = BIO_new_file(file, "rb");
  834. if (keyfile == NULL) {
  835. goto end;
  836. }
  837. if (format == KMF_FORMAT_ASN1) {
  838. pkey = d2i_PrivateKey_bio(keyfile, NULL);
  839. if (pkey == NULL) {
  840. (void) BIO_free(keyfile);
  841. keyfile = NULL;
  842. /* Try odd ASN.1 variations */
  843. rv = kmf_read_input_file(kmfh, (char *)file,
  844. &filedata);
  845. if (rv == KMF_OK) {
  846. (void) readAltFormatPrivateKey(&filedata,
  847. &pkey);
  848. kmf_free_data(&filedata);
  849. }
  850. }
  851. } else if (format == KMF_FORMAT_PEM ||
  852. format == KMF_FORMAT_PEM_KEYPAIR) {
  853. pkey = PEM_read_bio_PrivateKey(keyfile, NULL, NULL, NULL);
  854. if (pkey == NULL) {
  855. KMF_DATA derdata;
  856. /*
  857. * Check if this is the alt. format
  858. * RSA private key file.
  859. */
  860. rv = kmf_read_input_file(kmfh, (char *)file,
  861. &filedata);
  862. if (rv == KMF_OK) {
  863. uchar_t *d = NULL;
  864. int len;
  865. rv = kmf_pem_to_der(filedata.Data,
  866. filedata.Length, &d, &len);
  867. if (rv == KMF_OK && d != NULL) {
  868. derdata.Data = d;
  869. derdata.Length = (size_t)len;
  870. (void) readAltFormatPrivateKey(
  871. &derdata, &pkey);
  872. free(d);
  873. }
  874. kmf_free_data(&filedata);
  875. }
  876. }
  877. }
  878. end:
  879. if (pkey == NULL)
  880. SET_ERROR(kmfh, ERR_get_error());
  881. if (keyfile != NULL)
  882. (void) BIO_free(keyfile);
  883. return (pkey);
  884. }
  885. KMF_RETURN
  886. OpenSSL_FindCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
  887. {
  888. KMF_RETURN rv = KMF_OK;
  889. KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
  890. int i, n;
  891. uint32_t maxcerts = 0;
  892. uint32_t *num_certs;
  893. KMF_X509_DER_CERT *kmf_cert = NULL;
  894. char *dirpath = NULL;
  895. char *filename = NULL;
  896. char *fullpath = NULL;
  897. char *issuer = NULL;
  898. char *subject = NULL;
  899. KMF_BIGINT *serial = NULL;
  900. KMF_CERT_VALIDITY validity;
  901. num_certs = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
  902. if (num_certs == NULL)
  903. return (KMF_ERR_BAD_PARAMETER);
  904. /* num_certs should reference the size of kmf_cert */
  905. maxcerts = *num_certs;
  906. if (maxcerts == 0)
  907. maxcerts = 0xFFFFFFFF;
  908. *num_certs = 0;
  909. /* Get the optional returned certificate list */
  910. kmf_cert = kmf_get_attr_ptr(KMF_X509_DER_CERT_ATTR, attrlist,
  911. numattr);
  912. /*
  913. * The dirpath attribute and the filename attribute can not be NULL
  914. * at the same time.
  915. */
  916. dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
  917. filename = kmf_get_attr_ptr(KMF_CERT_FILENAME_ATTR, attrlist,
  918. numattr);
  919. fullpath = get_fullpath(dirpath, filename);
  920. if (fullpath == NULL)
  921. return (KMF_ERR_BAD_PARAMETER);
  922. /* Get optional search criteria attributes */
  923. issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
  924. subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
  925. serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
  926. rv = kmf_get_attr(KMF_CERT_VALIDITY_ATTR, attrlist, numattr,
  927. &validity, NULL);
  928. if (rv != KMF_OK) {
  929. validity = KMF_ALL_CERTS;
  930. rv = KMF_OK;
  931. }
  932. if (isdir(fullpath)) {
  933. DIR *dirp;
  934. struct dirent *dp;
  935. n = 0;
  936. /* open all files in the directory and attempt to read them */
  937. if ((dirp = opendir(fullpath)) == NULL) {
  938. return (KMF_ERR_BAD_PARAMETER);
  939. }
  940. while ((dp = readdir(dirp)) != NULL) {
  941. char *fname;
  942. KMF_DATA *certlist = NULL;
  943. uint32_t loaded_certs = 0;
  944. if (strcmp(dp->d_name, ".") == 0 ||
  945. strcmp(dp->d_name, "..") == 0)
  946. continue;
  947. fname = get_fullpath(fullpath, (char *)&dp->d_name);
  948. rv = load_certs(kmfh, issuer, subject, serial,
  949. validity, fname, &certlist, &loaded_certs);
  950. if (rv != KMF_OK) {
  951. free(fname);
  952. if (certlist != NULL) {
  953. for (i = 0; i < loaded_certs; i++)
  954. kmf_free_data(&certlist[i]);
  955. free(certlist);
  956. }
  957. continue;
  958. }
  959. /* If load succeeds, add certdata to the list */
  960. if (kmf_cert != NULL) {
  961. for (i = 0; i < loaded_certs &&
  962. n < maxcerts; i++) {
  963. kmf_cert[n].certificate.Data =
  964. certlist[i].Data;
  965. kmf_cert[n].certificate.Length =
  966. certlist[i].Length;
  967. kmf_cert[n].kmf_private.keystore_type =
  968. KMF_KEYSTORE_OPENSSL;
  969. kmf_cert[n].kmf_private.flags =
  970. KMF_FLAG_CERT_VALID;
  971. kmf_cert[n].kmf_private.label =
  972. strdup(fname);
  973. n++;
  974. }
  975. /*
  976. * If maxcerts < loaded_certs, clean up the
  977. * certs that were not used.
  978. */
  979. for (; i < loaded_certs; i++)
  980. kmf_free_data(&certlist[i]);
  981. } else {
  982. for (i = 0; i < loaded_certs; i++)
  983. kmf_free_data(&certlist[i]);
  984. n += loaded_certs;
  985. }
  986. free(certlist);
  987. free(fname);
  988. }
  989. (*num_certs) = n;
  990. if (*num_certs == 0)
  991. rv = KMF_ERR_CERT_NOT_FOUND;
  992. if (*num_certs > 0)
  993. rv = KMF_OK;
  994. exit:
  995. (void) closedir(dirp);
  996. } else {
  997. KMF_DATA *certlist = NULL;
  998. uint32_t loaded_certs = 0;
  999. rv = load_certs(kmfh, issuer, subject, serial, validity,
  1000. fullpath, &certlist, &loaded_certs);
  1001. if (rv != KMF_OK) {
  1002. free(fullpath);
  1003. return (rv);
  1004. }
  1005. n = 0;
  1006. if (kmf_cert != NULL && certlist != NULL) {
  1007. for (i = 0; i < loaded_certs && i < maxcerts; i++) {
  1008. kmf_cert[n].certificate.Data =
  1009. certlist[i].Data;
  1010. kmf_cert[n].certificate.Length =
  1011. certlist[i].Length;
  1012. kmf_cert[n].kmf_private.keystore_type =
  1013. KMF_KEYSTORE_OPENSSL;
  1014. kmf_cert[n].kmf_private.flags =
  1015. KMF_FLAG_CERT_VALID;
  1016. kmf_cert[n].kmf_private.label =
  1017. strdup(fullpath);
  1018. n++;
  1019. }
  1020. /* If maxcerts < loaded_certs, clean up */
  1021. for (; i < loaded_certs; i++)
  1022. kmf_free_data(&certlist[i]);
  1023. } else if (certlist != NULL) {
  1024. for (i = 0; i < loaded_certs; i++)
  1025. kmf_free_data(&certlist[i]);
  1026. n = loaded_certs;
  1027. }
  1028. if (certlist != NULL)
  1029. free(certlist);
  1030. *num_certs = n;
  1031. }
  1032. free(fullpath);
  1033. return (rv);
  1034. }
  1035. void
  1036. /*ARGSUSED*/
  1037. OpenSSL_FreeKMFCert(KMF_HANDLE_T handle,
  1038. KMF_X509_DER_CERT *kmf_cert)
  1039. {
  1040. if (kmf_cert != NULL) {
  1041. if (kmf_cert->certificate.Data != NULL) {
  1042. kmf_free_data(&kmf_cert->certificate);
  1043. }
  1044. if (kmf_cert->kmf_private.label)
  1045. free(kmf_cert->kmf_private.label);
  1046. }
  1047. }
  1048. /*ARGSUSED*/
  1049. KMF_RETURN
  1050. OpenSSL_StoreCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
  1051. {
  1052. KMF_RETURN ret = KMF_OK;
  1053. KMF_DATA *cert = NULL;
  1054. char *outfilename = NULL;
  1055. char *dirpath = NULL;
  1056. char *fullpath = NULL;
  1057. KMF_ENCODE_FORMAT format;
  1058. /* Get the cert data */
  1059. cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
  1060. if (cert == NULL || cert->Data == NULL)
  1061. return (KMF_ERR_BAD_PARAMETER);
  1062. /* Check the output filename and directory attributes. */
  1063. outfilename = kmf_get_attr_ptr(KMF_CERT_FILENAME_ATTR, attrlist,
  1064. numattr);
  1065. if (outfilename == NULL)
  1066. return (KMF_ERR_BAD_PARAMETER);
  1067. dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
  1068. fullpath = get_fullpath(dirpath, outfilename);
  1069. if (fullpath == NULL)
  1070. return (KMF_ERR_BAD_CERTFILE);
  1071. /* Check the optional format attribute */
  1072. ret = kmf_get_attr(KMF_ENCODE_FORMAT_ATTR, attrlist, numattr,
  1073. &format, NULL);
  1074. if (ret != KMF_OK) {
  1075. /* If there is no format attribute, then default to PEM */
  1076. format = KMF_FORMAT_PEM;
  1077. ret = KMF_OK;
  1078. } else if (format != KMF_FORMAT_ASN1 && format != KMF_FORMAT_PEM) {
  1079. ret = KMF_ERR_BAD_CERT_FORMAT;
  1080. goto out;
  1081. }
  1082. /* Store the certificate in the file with the specified format */
  1083. ret = kmf_create_cert_file(cert, format, fullpath);
  1084. out:
  1085. if (fullpath != NULL)
  1086. free(fullpath);
  1087. return (ret);
  1088. }
  1089. KMF_RETURN
  1090. OpenSSL_DeleteCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
  1091. {
  1092. KMF_RETURN rv;
  1093. KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
  1094. KMF_DATA certdata = {NULL, 0};
  1095. char *dirpath = NULL;
  1096. char *filename = NULL;
  1097. char *fullpath = NULL;
  1098. char *issuer = NULL;
  1099. char *subject = NULL;
  1100. KMF_BIGINT *serial = NULL;
  1101. KMF_CERT_VALIDITY validity;
  1102. /*
  1103. * Get the DIRPATH and CERT_FILENAME attributes. They can not be
  1104. * NULL at the same time.
  1105. */
  1106. dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
  1107. filename = kmf_get_attr_ptr(KMF_CERT_FILENAME_ATTR, attrlist,
  1108. numattr);
  1109. fullpath = get_fullpath(dirpath, filename);
  1110. if (fullpath == NULL)
  1111. return (KMF_ERR_BAD_PARAMETER);
  1112. /* Get optional search criteria attributes */
  1113. issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
  1114. subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
  1115. serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
  1116. rv = kmf_get_attr(KMF_CERT_VALIDITY_ATTR, attrlist, numattr,
  1117. &validity, NULL);
  1118. if (rv != KMF_OK) {
  1119. validity = KMF_ALL_CERTS;
  1120. rv = KMF_OK;
  1121. }
  1122. if (isdir(fullpath)) {
  1123. DIR *dirp;
  1124. struct dirent *dp;
  1125. /* open all files in the directory and attempt to read them */
  1126. if ((dirp = opendir(fullpath)) == NULL) {
  1127. return (KMF_ERR_BAD_PARAMETER);
  1128. }
  1129. while ((dp = readdir(dirp)) != NULL) {
  1130. if (strcmp(dp->d_name, ".") != 0 &&
  1131. strcmp(dp->d_name, "..") != 0) {
  1132. char *fname;
  1133. fname = get_fullpath(fullpath,
  1134. (char *)&dp->d_name);
  1135. if (fname == NULL) {
  1136. rv = KMF_ERR_MEMORY;
  1137. break;
  1138. }
  1139. rv = kmf_load_cert(kmfh, issuer, subject,
  1140. serial, validity, fname, &certdata);
  1141. if (rv == KMF_ERR_CERT_NOT_FOUND) {
  1142. free(fname);
  1143. kmf_free_data(&certdata);
  1144. rv = KMF_OK;
  1145. continue;
  1146. } else if (rv != KMF_OK) {
  1147. free(fname);
  1148. break;
  1149. }
  1150. if (unlink(fname) != 0) {
  1151. SET_SYS_ERROR(kmfh, errno);
  1152. rv = KMF_ERR_INTERNAL;
  1153. free(fname);
  1154. break;
  1155. }
  1156. free(fname);
  1157. kmf_free_data(&certdata);
  1158. }
  1159. }
  1160. (void) closedir(dirp);
  1161. } else {
  1162. /* Just try to load a single certificate */
  1163. rv = kmf_load_cert(kmfh, issuer, subject, serial, validity,
  1164. fullpath, &certdata);
  1165. if (rv == KMF_OK) {
  1166. if (unlink(fullpath) != 0) {
  1167. SET_SYS_ERROR(kmfh, errno);
  1168. rv = KMF_ERR_INTERNAL;
  1169. }
  1170. }
  1171. }
  1172. out:
  1173. if (fullpath != NULL)
  1174. free(fullpath);
  1175. kmf_free_data(&certdata);
  1176. return (rv);
  1177. }
  1178. KMF_RETURN
  1179. OpenSSL_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
  1180. KMF_DATA *keydata)
  1181. {
  1182. KMF_RETURN rv = KMF_OK;
  1183. KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
  1184. int n;
  1185. if (key == NULL || keydata == NULL ||
  1186. key->keyp == NULL)
  1187. return (KMF_ERR_BAD_PARAMETER);
  1188. if (key->keyalg == KMF_RSA) {
  1189. RSA *pubkey = EVP_PKEY_get1_RSA(key->keyp);
  1190. if (!(n = i2d_RSA_PUBKEY(pubkey, &keydata->Data))) {
  1191. SET_ERROR(kmfh, ERR_get_error());
  1192. return (KMF_ERR_ENCODING);
  1193. }
  1194. RSA_free(pubkey);
  1195. } else if (key->keyalg == KMF_DSA) {
  1196. DSA *pubkey = EVP_PKEY_get1_DSA(key->keyp);
  1197. if (!(n = i2d_DSA_PUBKEY(pubkey, &keydata->Data))) {
  1198. SET_ERROR(kmfh, ERR_get_error());
  1199. return (KMF_ERR_ENCODING);
  1200. }
  1201. DSA_free(pubkey);
  1202. } else {
  1203. return (KMF_ERR_BAD_PARAMETER);
  1204. }
  1205. keydata->Length = n;
  1206. cleanup:
  1207. if (rv != KMF_OK) {
  1208. if (keydata->Data)
  1209. free(keydata->Data);
  1210. keydata->Data = NULL;
  1211. keydata->Length = 0;
  1212. }
  1213. return (rv);
  1214. }
  1215. static KMF_RETURN
  1216. ssl_write_key(KMF_HANDLE *kmfh, KMF_ENCODE_FORMAT format, BIO *out,
  1217. KMF_CREDENTIAL *cred, EVP_PKEY *pkey, boolean_t private)
  1218. {
  1219. int rv = 0;
  1220. RSA *rsa;
  1221. DSA *dsa;
  1222. if (pkey == NULL || out == NULL)
  1223. return (KMF_ERR_BAD_PARAMETER);
  1224. switch (format) {
  1225. case KMF_FORMAT_RAWKEY:
  1226. /* same as ASN.1 */
  1227. case KMF_FORMAT_ASN1:
  1228. if (pkey->type == EVP_PKEY_RSA) {
  1229. rsa = EVP_PKEY_get1_RSA(pkey);
  1230. if (private)
  1231. rv = i2d_RSAPrivateKey_bio(out, rsa);
  1232. else
  1233. rv = i2d_RSAPublicKey_bio(out, rsa);
  1234. RSA_free(rsa);
  1235. } else if (pkey->type == EVP_PKEY_DSA) {
  1236. dsa = EVP_PKEY_get1_DSA(pkey);
  1237. rv = i2d_DSAPrivateKey_bio(out, dsa);
  1238. DSA_free(dsa);
  1239. }
  1240. if (rv == 1) {
  1241. rv = KMF_OK;
  1242. } else {
  1243. SET_ERROR(kmfh, rv);
  1244. }
  1245. break;
  1246. case KMF_FORMAT_PEM:
  1247. if (pkey->type == EVP_PKEY_RSA) {
  1248. rsa = EVP_PKEY_get1_RSA(pkey);
  1249. if (private)
  1250. rv = PEM_write_bio_RSAPrivateKey(out,
  1251. rsa, NULL, NULL, 0, NULL,
  1252. (cred != NULL ? cred->cred : NULL));
  1253. else
  1254. rv = PEM_write_bio_RSAPublicKey(out,
  1255. rsa);
  1256. RSA_free(rsa);
  1257. } else if (pkey->type == EVP_PKEY_DSA) {
  1258. dsa = EVP_PKEY_get1_DSA(pkey);
  1259. rv = PEM_write_bio_DSAPrivateKey(out,
  1260. dsa, NULL, NULL, 0, NULL,
  1261. (cred != NULL ? cred->cred : NULL));
  1262. DSA_free(dsa);
  1263. }
  1264. if (rv == 1) {
  1265. rv = KMF_OK;
  1266. } else {
  1267. SET_ERROR(kmfh, rv);
  1268. }
  1269. break;
  1270. default:
  1271. rv = KMF_ERR_BAD_PARAMETER;
  1272. }
  1273. return (rv);
  1274. }
  1275. KMF_RETURN
  1276. OpenSSL_CreateKeypair(KMF_HANDLE_T handle, int numattr,
  1277. KMF_ATTRIBUTE *attrlist)
  1278. {
  1279. KMF_RETURN rv = KMF_OK;
  1280. KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
  1281. uint32_t eValue = 0x010001;
  1282. RSA *sslPrivKey = NULL;
  1283. DSA *sslDSAKey = NULL;
  1284. EVP_PKEY *eprikey = NULL;
  1285. EVP_PKEY *epubkey = NULL;
  1286. BIO *out = NULL;
  1287. KMF_KEY_HANDLE *pubkey = NULL, *privkey = NULL;
  1288. uint32_t keylen = 1024;
  1289. uint32_t keylen_size = sizeof (uint32_t);
  1290. boolean_t storekey = TRUE;
  1291. KMF_KEY_ALG keytype = KMF_RSA;
  1292. rv = kmf_get_attr(KMF_STOREKEY_BOOL_ATTR, attrlist, numattr,
  1293. &storekey, NULL);
  1294. if (rv != KMF_OK) {
  1295. /* "storekey" is optional. Default is TRUE */
  1296. rv = KMF_OK;
  1297. }
  1298. rv = kmf_get_attr(KMF_KEYALG_ATTR, attrlist, numattr,
  1299. (void *)&keytype, NULL);
  1300. if (rv != KMF_OK)
  1301. /* keytype is optional. KMF_RSA is default */
  1302. rv = KMF_OK;
  1303. pubkey = kmf_get_attr_ptr(KMF_PUBKEY_HANDLE_ATTR, attrlist, numattr);
  1304. if (pubkey == NULL)
  1305. return (KMF_ERR_BAD_PARAMETER);
  1306. privkey = kmf_get_attr_ptr(KMF_PRIVKEY_HANDLE_ATTR, attrlist, numattr);
  1307. if (privkey == NULL)
  1308. return (KMF_ERR_BAD_PARAMETER);
  1309. (void) memset(pubkey, 0, sizeof (KMF_KEY_HANDLE));
  1310. (void) memset(privkey, 0, sizeof (KMF_KEY_HANDLE));
  1311. eprikey = EVP_PKEY_new();
  1312. if (eprikey == NULL) {
  1313. SET_ERROR(kmfh, ERR_get_error());
  1314. rv = KMF_ERR_KEYGEN_FAILED;
  1315. goto cleanup;
  1316. }
  1317. epubkey = EVP_PKEY_new();
  1318. if (epubkey == NULL) {
  1319. SET_ERROR(kmfh, ERR_get_error());
  1320. rv = KMF_ERR_KEYGEN_FAILED;
  1321. goto cleanup;
  1322. }
  1323. if (keytype == KMF_RSA) {
  1324. KMF_BIGINT *rsaexp = NULL;
  1325. rsaexp = kmf_get_attr_ptr(KMF_RSAEXP_ATTR, attrlist, numattr);
  1326. if (rsaexp != NULL) {
  1327. if (rsaexp->len > 0 &&
  1328. rsaexp->len <= sizeof (eValue) &&
  1329. rsaexp->val != NULL) {
  1330. /* LINTED E_BAD_PTR_CAST_ALIGN */
  1331. eValue = *(uint32_t *)rsaexp->val;
  1332. } else {
  1333. rv = KMF_ERR_BAD_PARAMETER;
  1334. goto cleanup;
  1335. }
  1336. } else {
  1337. /* RSA Exponent is optional. Default is 0x10001 */
  1338. rv = KMF_OK;
  1339. }
  1340. rv = kmf_get_attr(KMF_KEYLENGTH_ATTR, attrlist, numattr,
  1341. &keylen, &keylen_size);
  1342. if (rv == KMF_ERR_ATTR_NOT_FOUND)
  1343. /* keylen is optional, default is 1024 */
  1344. rv = KMF_OK;
  1345. if (rv != KMF_OK) {
  1346. rv = KMF_ERR_BAD_PARAMETER;
  1347. goto cleanup;
  1348. }
  1349. sslPrivKey = RSA_generate_key(keylen, eValue, NULL, NULL);
  1350. if (sslPrivKey == NULL) {
  1351. SET_ERROR(kmfh, ERR_get_error());
  1352. rv = KMF_ERR_KEYGEN_FAILED;
  1353. } else {
  1354. (void) EVP_PKEY_set1_RSA(eprikey, sslPrivKey);
  1355. privkey->kstype = KMF_KEYSTORE_OPENSSL;
  1356. privkey->keyalg = KMF_RSA;
  1357. privkey->keyclass = KMF_ASYM_PRI;
  1358. privkey->israw = FALSE;
  1359. privkey->keyp = (void *)eprikey;
  1360. /* OpenSSL derives the public key from the private */
  1361. (void) EVP_PKEY_set1_RSA(epubkey, sslPrivKey);
  1362. pubkey->kstype = KMF_KEYSTORE_OPENSSL;
  1363. pubkey->keyalg = KMF_RSA;
  1364. pubkey->israw = FALSE;
  1365. pubkey->keyclass = KMF_ASYM_PUB;
  1366. pubkey->keyp = (void *)epubkey;
  1367. }
  1368. } else if (keytype == KMF_DSA) {
  1369. DSA *dp;
  1370. sslDSAKey = DSA_new();
  1371. if (sslDSAKey == NULL) {
  1372. SET_ERROR(kmfh, ERR_get_error());
  1373. return (KMF_ERR_MEMORY);
  1374. }
  1375. if ((sslDSAKey->p = BN_bin2bn(P, sizeof (P), sslDSAKey->p)) ==
  1376. NULL) {
  1377. SET_ERROR(kmfh, ERR_get_error());
  1378. rv = KMF_ERR_KEYGEN_FAILED;
  1379. goto cleanup;
  1380. }
  1381. if ((sslDSAKey->q = BN_bin2bn(Q, sizeof (Q), sslDSAKey->q)) ==
  1382. NULL) {
  1383. SET_ERROR(kmfh, ERR_get_error());
  1384. rv = KMF_ERR_KEYGEN_FAILED;
  1385. goto cleanup;
  1386. }
  1387. if ((sslDSAKey->g = BN_bin2bn(G, sizeof (G), sslDSAKey->g)) ==
  1388. NULL) {
  1389. SET_ERROR(kmfh, ERR_get_error());
  1390. rv = KMF_ERR_KEYGEN_FAILED;
  1391. goto cleanup;
  1392. }
  1393. if (!DSA_generate_key(sslDSAKey)) {
  1394. SET_ERROR(kmfh, ERR_get_error());
  1395. rv = KMF_ERR_KEYGEN_FAILED;
  1396. goto cleanup;
  1397. }
  1398. privkey->kstype = KMF_KEYSTORE_OPENSSL;
  1399. privkey->keyalg = KMF_DSA;
  1400. privkey->keyclass = KMF_ASYM_PRI;
  1401. privkey->israw = FALSE;
  1402. if (EVP_PKEY_set1_DSA(eprikey, sslDSAKey)) {
  1403. privkey->keyp = (void *)eprikey;
  1404. } else {
  1405. SET_ERROR(kmfh, ERR_get_error());
  1406. rv = KMF_ERR_KEYGEN_FAILED;
  1407. goto cleanup;
  1408. }
  1409. dp = DSA_new();
  1410. /* Make a copy for the public key */
  1411. if (dp != NULL) {
  1412. if ((dp->p = BN_new()) == NULL) {
  1413. SET_ERROR(kmfh, ERR_get_error());
  1414. rv = KMF_ERR_MEMORY;
  1415. DSA_free(dp);
  1416. goto cleanup;
  1417. }
  1418. if ((dp->q = BN_new()) == NULL) {
  1419. SET_ERROR(kmfh, ERR_get_error());
  1420. rv = KMF_ERR_MEMORY;
  1421. BN_free(dp->p);
  1422. DSA_free(dp);
  1423. goto cleanup;
  1424. }
  1425. if ((dp->g = BN_new()) == NULL) {
  1426. SET_ERROR(kmfh, ERR_get_error());
  1427. rv = KMF_ERR_MEMORY;
  1428. BN_free(dp->q);
  1429. BN_free(dp->p);
  1430. DSA_free(dp);
  1431. goto cleanup;
  1432. }
  1433. if ((dp->pub_key = BN_new()) == NULL) {
  1434. SET_ERROR(kmfh, ERR_get_error());
  1435. rv = KMF_ERR_MEMORY;
  1436. BN_free(dp->q);
  1437. BN_free(dp->p);
  1438. BN_free(dp->g);
  1439. DSA_free(dp);
  1440. goto cleanup;
  1441. }
  1442. (void) BN_copy(dp->p, sslDSAKey->p);
  1443. (void) BN_copy(dp->q, sslDSAKey->q);
  1444. (void) BN_copy(dp->g, sslDSAKey->g);
  1445. (void) BN_copy(dp->pub_key, sslDSAKey->pub_key);
  1446. pubkey->kstype = KMF_KEYSTORE_OPENSSL;
  1447. pubkey->keyalg = KMF_DSA;
  1448. pubkey->keyclass = KMF_ASYM_PUB;
  1449. pubkey->israw = FALSE;
  1450. if (EVP_PKEY_set1_DSA(epubkey, sslDSAKey)) {
  1451. pubkey->keyp = (void *)epubkey;
  1452. } else {
  1453. SET_ERROR(kmfh, ERR_get_error());
  1454. rv = KMF_ERR_KEYGEN_FAILED;
  1455. goto cleanup;
  1456. }
  1457. }
  1458. }
  1459. if (rv != KMF_OK) {
  1460. goto cleanup;
  1461. }
  1462. if (storekey) {
  1463. KMF_ATTRIBUTE storeattrs[4]; /* max. 4 attributes needed */
  1464. int i = 0;
  1465. char *keyfile = NULL, *dirpath = NULL;
  1466. KMF_ENCODE_FORMAT format;
  1467. /*
  1468. * Construct a new attribute arrray and call openssl_store_key
  1469. */
  1470. kmf_set_attr_at_index(storeattrs, i, KMF_PRIVKEY_HANDLE_ATTR,
  1471. privkey, sizeof (privkey));
  1472. i++;
  1473. dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
  1474. if (dirpath != NULL) {
  1475. storeattrs[i].type = KMF_DIRPATH_ATTR;
  1476. storeattrs[i].pValue = dirpath;
  1477. storeattrs[i].valueLen = strlen(dirpath);
  1478. i++;
  1479. } else {
  1480. rv = KMF_OK; /* DIRPATH is optional */
  1481. }
  1482. keyfile = kmf_get_attr_ptr(KMF_KEY_FILENAME_ATTR,
  1483. attrlist, numattr);
  1484. if (keyfile != NULL) {
  1485. storeattrs[i].type = KMF_KEY_FILENAME_ATTR;
  1486. storeattrs[i].pValue = keyfile;
  1487. storeattrs[i].valueLen = strlen(keyfile);
  1488. i++;
  1489. } else {
  1490. goto cleanup; /* KEYFILE is required */
  1491. }
  1492. rv = kmf_get_attr(KMF_ENCODE_FORMAT_ATTR, attrlist, numattr,
  1493. (void *)&format, NULL);
  1494. if (rv == KMF_OK) {
  1495. storeattrs[i].type = KMF_ENCODE_FORMAT_ATTR;
  1496. storeattrs[i].pValue = &format;
  1497. storeattrs[i].valueLen = sizeof (format);
  1498. i++;
  1499. }
  1500. rv = OpenSSL_StoreKey(handle, i, storeattrs);
  1501. }
  1502. cleanup:
  1503. if (rv != KMF_OK) {
  1504. if (eprikey != NULL)
  1505. EVP_PKEY_free(eprikey);
  1506. if (epubkey != NULL)
  1507. EVP_PKEY_free(epubkey);
  1508. if (pubkey->keylabel) {
  1509. free(pubkey->keylabel);
  1510. pubkey->keylabel = NULL;
  1511. }
  1512. if (privkey->keylabel) {
  1513. free(privkey->keylabel);
  1514. privkey->keylabel = NULL;
  1515. }
  1516. pubkey->keyp = NULL;
  1517. privkey->keyp = NULL;
  1518. }
  1519. if (sslPrivKey)
  1520. RSA_free(sslPrivKey);
  1521. if (sslDSAKey)
  1522. DSA_free(sslDSAKey);
  1523. if (out != NULL)
  1524. (void) BIO_free(out);
  1525. return (rv);
  1526. }
  1527. /*
  1528. * Make sure the BN conversion is properly padded with 0x00
  1529. * bytes. If not, signature verification for DSA signatures
  1530. * may fail in the case where the bignum value does not use
  1531. * all of the bits.
  1532. */
  1533. static int
  1534. fixbnlen(BIGNUM *bn, unsigned char *buf, int len) {
  1535. int bytes = len - BN_num_bytes(bn);
  1536. /* prepend with leading 0x00 if necessary */
  1537. while (bytes-- > 0)
  1538. *buf++ = 0;
  1539. (void) BN_bn2bin(bn, buf);
  1540. /*
  1541. * Return the desired length since we prepended it
  1542. * with the necessary 0x00 padding.
  1543. */
  1544. return (len);
  1545. }
  1546. KMF_RETURN
  1547. OpenSSL_SignData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
  1548. KMF_OID *AlgOID, KMF_DATA *tobesigned, KMF_DATA *output)
  1549. {
  1550. KMF_RETURN ret = KMF_OK;
  1551. KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
  1552. KMF_ALGORITHM_INDEX AlgId;
  1553. EVP_MD_CTX ctx;
  1554. const EVP_MD *md;
  1555. if (key == NULL || AlgOID == NULL ||
  1556. tobesigned == NULL || output == NULL ||
  1557. tobesigned->Data == NULL ||
  1558. output->Data == NULL)
  1559. return (KMF_ERR_BAD_PARAMETER);
  1560. /* Map the OID to an OpenSSL algorithm */
  1561. AlgId = x509_algoid_to_algid(AlgOID);
  1562. if (AlgId == KMF_ALGID_NONE)
  1563. return (KMF_ERR_BAD_ALGORITHM);
  1564. if (key->keyalg == KMF_RSA) {
  1565. EVP_PKEY *pkey = (EVP_PKEY *)key->keyp;
  1566. uchar_t *p;
  1567. int len;
  1568. if (AlgId == KMF_ALGID_MD5WithRSA)
  1569. md = EVP_md5();
  1570. else if (AlgId == KMF_ALGID_MD2WithRSA)
  1571. md = EVP_md2();
  1572. else if (AlgId == KMF_ALGID_SHA1WithRSA)
  1573. md = EVP_sha1();
  1574. else if (AlgId == KMF_ALGID_SHA256WithRSA)
  1575. md = EVP_sha256();
  1576. else if (AlgId == KMF_ALGID_SHA384WithRSA)
  1577. md = EVP_sha384();
  1578. else if (AlgId == KMF_ALGID_SHA512WithRSA)
  1579. md = EVP_sha512();
  1580. else if (AlgId == KMF_ALGID_RSA)
  1581. md = NULL;
  1582. else
  1583. return (KMF_ERR_BAD_ALGORITHM);
  1584. if ((md == NULL) && (AlgId == KMF_ALGID_RSA)) {
  1585. RSA *rsa = EVP_PKEY_get1_RSA((EVP_PKEY *)pkey);
  1586. p = output->Data;
  1587. if ((len = RSA_private_encrypt(tobesigned->Length,
  1588. tobesigned->Data, p, rsa,
  1589. RSA_PKCS1_PADDING)) <= 0) {
  1590. SET_ERROR(kmfh, ERR_get_error());
  1591. ret = KMF_ERR_INTERNAL;
  1592. }
  1593. output->Length = len;
  1594. } else {
  1595. (void) EVP_MD_CTX_init(&ctx);
  1596. (void) EVP_SignInit_ex(&ctx, md, NULL);
  1597. (void) EVP_SignUpdate(&ctx, tobesigned->Data,
  1598. (uint32_t)tobesigned->Length);
  1599. len = (uint32_t)output->Length;
  1600. p = output->Data;
  1601. if (!EVP_SignFinal(&ctx, p, (uint32_t *)&len, pkey)) {
  1602. SET_ERROR(kmfh, ERR_get_error());
  1603. len = 0;
  1604. ret = KMF_ERR_INTERNAL;
  1605. }
  1606. output->Length = len;
  1607. (void) EVP_MD_CTX_cleanup(&ctx);
  1608. }
  1609. } else if (key->keyalg == KMF_DSA) {
  1610. DSA *dsa = EVP_PKEY_get1_DSA(key->keyp);
  1611. uchar_t hash[EVP_MAX_MD_SIZE];
  1612. uint32_t hashlen;
  1613. DSA_SIG *dsasig;
  1614. if (AlgId == KMF_ALGID_DSA ||
  1615. AlgId == KMF_ALGID_SHA1WithDSA)
  1616. md = EVP_sha1();
  1617. else if (AlgId == KMF_ALGID_SHA256WithDSA)
  1618. md = EVP_sha256();
  1619. else /* Bad algorithm */
  1620. return (KMF_ERR_BAD_ALGORITHM);
  1621. /*
  1622. * OpenSSL EVP_Sign operation automatically converts to
  1623. * ASN.1 output so we do the operations separately so we
  1624. * are assured of NOT getting ASN.1 output returned.
  1625. * KMF does not want ASN.1 encoded results because
  1626. * not all mechanisms return ASN.1 encodings (PKCS#11
  1627. * and NSS return raw signature data).
  1628. */
  1629. EVP_MD_CTX_init(&ctx);
  1630. (void) EVP_DigestInit_ex(&ctx, md, NULL);
  1631. (void) EVP_DigestUpdate(&ctx, tobesigned->Data,
  1632. tobesigned->Length);
  1633. (void) EVP_DigestFinal_ex(&ctx, hash, &hashlen);
  1634. /* Only sign first 20 bytes for SHA2 */
  1635. if (AlgId == KMF_ALGID_SHA256WithDSA)
  1636. hashlen = 20;
  1637. dsasig = DSA_do_sign(hash, hashlen, dsa);
  1638. if (dsasig != NULL) {
  1639. int i;
  1640. output->Length = i = fixbnlen(dsasig->r, output->Data,
  1641. hashlen);
  1642. output->Length += fixbnlen(dsasig->s, &output->Data[i],
  1643. hashlen);
  1644. DSA_SIG_free(dsasig);
  1645. } else {
  1646. SET_ERROR(kmfh, ERR_get_error());
  1647. }
  1648. (void) EVP_MD_CTX_cleanup(&ctx);
  1649. } else {
  1650. return (KMF_ERR_BAD_PARAMETER);
  1651. }
  1652. cleanup:
  1653. return (ret);
  1654. }
  1655. KMF_RETURN
  1656. /*ARGSUSED*/
  1657. OpenSSL_DeleteKey(KMF_HANDLE_T handle,
  1658. int numattr, KMF_ATTRIBUTE *attrlist)
  1659. {
  1660. KMF_RETURN rv = KMF_OK;
  1661. KMF_KEY_HANDLE *key;
  1662. boolean_t destroy = B_TRUE;
  1663. key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
  1664. if (key == NULL || key->keyp == NULL)
  1665. return (KMF_ERR_BAD_PARAMETER);
  1666. rv = kmf_get_attr(KMF_DESTROY_BOOL_ATTR, attrlist, numattr,
  1667. (void *)&destroy, NULL);
  1668. if (rv != KMF_OK) {
  1669. /* "destroy" is optional. Default is TRUE */
  1670. rv = KMF_OK;
  1671. }
  1672. if (key->keyclass != KMF_ASYM_PUB &&
  1673. key->keyclass != KMF_ASYM_PRI &&
  1674. key->keyclass != KMF_SYMMETRIC)
  1675. return (KMF_ERR_BAD_KEY_CLASS);
  1676. if (key->keyclass == KMF_SYMMETRIC) {
  1677. kmf_free_raw_sym_key((KMF_RAW_SYM_KEY *)key->keyp);
  1678. key->keyp = NULL;
  1679. } else {
  1680. if (key->keyp != NULL) {
  1681. EVP_PKEY_free(key->keyp);
  1682. key->keyp = NULL;
  1683. }
  1684. }
  1685. if (key->keylabel != NULL) {
  1686. EVP_PKEY *pkey = NULL;
  1687. /* If the file exists, make sure it is a proper key. */
  1688. pkey = openssl_load_key(handle, key->keylabel);
  1689. if (pkey == NULL) {
  1690. if (key->keylabel != NULL) {
  1691. free(key->keylabel);
  1692. key->keylabel = NULL;
  1693. }
  1694. return (KMF_ERR_KEY_NOT_FOUND);
  1695. }
  1696. EVP_PKEY_free(pkey);
  1697. if (destroy) {
  1698. if (unlink(key->keylabel) != 0) {
  1699. KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
  1700. SET_SYS_ERROR(kmfh, errno);
  1701. rv = KMF_ERR_INTERNAL;
  1702. }
  1703. }
  1704. if (key->keylabel != NULL) {
  1705. free(key->keylabel);
  1706. key->keylabel = NULL;
  1707. }
  1708. }
  1709. return (rv);
  1710. }
  1711. KMF_RETURN
  1712. OpenSSL_GetErrorString(KMF_HANDLE_T handle, char **msgstr)
  1713. {
  1714. KMF_RETURN ret = KMF_OK;
  1715. KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
  1716. char str[256]; /* OpenSSL needs at least 120 byte buffer */
  1717. ERR_error_string_n(kmfh->lasterr.errcode, str, sizeof (str));
  1718. if (strlen(str)) {
  1719. *msgstr = (char *)strdup(str);
  1720. if ((*msgstr) == NULL)
  1721. ret = KMF_ERR_MEMORY;
  1722. } else {
  1723. *msgstr = NULL;
  1724. }
  1725. return (ret);
  1726. }
  1727. static int
  1728. ext2NID(int kmfext)
  1729. {
  1730. switch (kmfext) {
  1731. case KMF_X509_EXT_KEY_USAGE:
  1732. return (NID_key_usage);
  1733. case KMF_X509_EXT_PRIV_KEY_USAGE_PERIOD:
  1734. return (NID_private_key_usage_period);
  1735. case KMF_X509_EXT_CERT_POLICIES:
  1736. return (NID_certificate_policies);
  1737. case KMF_X509_EXT_SUBJ_ALTNAME:
  1738. return (NID_subject_alt_name);
  1739. case KMF_X509_EXT_ISSUER_ALTNAME:
  1740. return (NID_issuer_alt_name);
  1741. case KMF_X509_EXT_BASIC_CONSTRAINTS:
  1742. return (NID_basic_constraints);
  1743. case KMF_X509_EXT_EXT_KEY_USAGE:
  1744. return (NID_ext_key_usage);
  1745. case KMF_X509_EXT_AUTH_KEY_ID:
  1746. return (NID_authority_key_identifier);
  1747. case KMF_X509_EXT_CRL_DIST_POINTS:
  1748. return (NID_crl_distribution_points);
  1749. case KMF_X509_EXT_SUBJ_KEY_ID:
  1750. return (NID_subject_key_identifier);
  1751. case KMF_X509_EXT_POLICY_MAPPINGS:
  1752. return (OBJ_sn2nid("policyMappings"));
  1753. case KMF_X509_EXT_NAME_CONSTRAINTS:
  1754. return (OBJ_sn2nid("nameConstraints"));
  1755. case KMF_X509_EXT_POLICY_CONSTRAINTS:
  1756. return (OBJ_sn2nid("policyConstraints"));
  1757. case KMF_X509_EXT_INHIBIT_ANY_POLICY:
  1758. return (OBJ_sn2nid

Large files files are truncated, but you can click here to view the full file