xref: /titanic_51/usr/src/lib/libkmf/include/kmfapiP.h (revision 02744e811b15322c5f109827a116c33bfe3438b5)
199ebb4caSwyllys /*
299ebb4caSwyllys  * CDDL HEADER START
399ebb4caSwyllys  *
499ebb4caSwyllys  * The contents of this file are subject to the terms of the
599ebb4caSwyllys  * Common Development and Distribution License (the "License").
699ebb4caSwyllys  * You may not use this file except in compliance with the License.
799ebb4caSwyllys  *
899ebb4caSwyllys  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
999ebb4caSwyllys  * or http://www.opensolaris.org/os/licensing.
1099ebb4caSwyllys  * See the License for the specific language governing permissions
1199ebb4caSwyllys  * and limitations under the License.
1299ebb4caSwyllys  *
1399ebb4caSwyllys  * When distributing Covered Code, include this CDDL HEADER in each
1499ebb4caSwyllys  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1599ebb4caSwyllys  * If applicable, add the following below this CDDL HEADER, with the
1699ebb4caSwyllys  * fields enclosed by brackets "[]" replaced with your own identifying
1799ebb4caSwyllys  * information: Portions Copyright [yyyy] [name of copyright owner]
1899ebb4caSwyllys  *
1999ebb4caSwyllys  * CDDL HEADER END
2099ebb4caSwyllys  */
2199ebb4caSwyllys /*
22*02744e81Swyllys  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
2399ebb4caSwyllys  * Use is subject to license terms.
2499ebb4caSwyllys  */
2599ebb4caSwyllys #ifndef _KMFAPIP_H
2699ebb4caSwyllys #define	_KMFAPIP_H
2799ebb4caSwyllys 
2899ebb4caSwyllys #pragma ident	"%Z%%M%	%I%	%E% SMI"
2999ebb4caSwyllys 
3099ebb4caSwyllys #include <kmfapi.h>
3199ebb4caSwyllys #include <kmfpolicy.h>
3299ebb4caSwyllys 
3399ebb4caSwyllys #ifdef __cplusplus
3499ebb4caSwyllys extern "C" {
3599ebb4caSwyllys #endif
3699ebb4caSwyllys 
3799ebb4caSwyllys /* Plugin function table */
3899ebb4caSwyllys typedef struct {
3999ebb4caSwyllys 	ushort_t	version;
4099ebb4caSwyllys 	KMF_RETURN	(*ConfigureKeystore) (
4199ebb4caSwyllys 			KMF_HANDLE_T,
4299ebb4caSwyllys 			KMF_CONFIG_PARAMS *);
4399ebb4caSwyllys 
4499ebb4caSwyllys 	KMF_RETURN	(*FindCert) (
4599ebb4caSwyllys 			KMF_HANDLE_T,
4699ebb4caSwyllys 			KMF_FINDCERT_PARAMS	*,
4799ebb4caSwyllys 			KMF_X509_DER_CERT *,
4899ebb4caSwyllys 			uint32_t *);
4999ebb4caSwyllys 
5099ebb4caSwyllys 	void		(*FreeKMFCert) (
5199ebb4caSwyllys 			KMF_HANDLE_T,
5299ebb4caSwyllys 			KMF_X509_DER_CERT *);
5399ebb4caSwyllys 
5499ebb4caSwyllys 	KMF_RETURN	(*StoreCert) (
5599ebb4caSwyllys 			KMF_HANDLE_T,
5699ebb4caSwyllys 			KMF_STORECERT_PARAMS *,
5799ebb4caSwyllys 			KMF_DATA *);
5899ebb4caSwyllys 
5999ebb4caSwyllys 	KMF_RETURN	(*ImportCert) (
6099ebb4caSwyllys 			KMF_HANDLE_T,
6199ebb4caSwyllys 			KMF_IMPORTCERT_PARAMS *);
6299ebb4caSwyllys 
6399ebb4caSwyllys 	KMF_RETURN	(*ImportCRL) (
6499ebb4caSwyllys 			KMF_HANDLE_T,
6599ebb4caSwyllys 			KMF_IMPORTCRL_PARAMS *);
6699ebb4caSwyllys 
6799ebb4caSwyllys 	KMF_RETURN	(*DeleteCert) (
6899ebb4caSwyllys 			KMF_HANDLE_T,
6999ebb4caSwyllys 			KMF_DELETECERT_PARAMS *);
7099ebb4caSwyllys 
7199ebb4caSwyllys 	KMF_RETURN	(*DeleteCRL) (
7299ebb4caSwyllys 			KMF_HANDLE_T,
7399ebb4caSwyllys 			KMF_DELETECRL_PARAMS *);
7499ebb4caSwyllys 
7599ebb4caSwyllys 	KMF_RETURN	(*CreateKeypair) (
7699ebb4caSwyllys 			KMF_HANDLE_T,
7799ebb4caSwyllys 			KMF_CREATEKEYPAIR_PARAMS *,
7899ebb4caSwyllys 			KMF_KEY_HANDLE *,
7999ebb4caSwyllys 			KMF_KEY_HANDLE *);
8099ebb4caSwyllys 
8199ebb4caSwyllys 	KMF_RETURN	(*FindKey) (
8299ebb4caSwyllys 			KMF_HANDLE_T,
8399ebb4caSwyllys 			KMF_FINDKEY_PARAMS *,
8499ebb4caSwyllys 			KMF_KEY_HANDLE *,
8599ebb4caSwyllys 			uint32_t *);
8699ebb4caSwyllys 
8799ebb4caSwyllys 	KMF_RETURN	(*EncodePubkeyData) (
8899ebb4caSwyllys 			KMF_HANDLE_T,
8999ebb4caSwyllys 			KMF_KEY_HANDLE *,
9099ebb4caSwyllys 			KMF_DATA *);
9199ebb4caSwyllys 
9299ebb4caSwyllys 	KMF_RETURN	(*SignData) (
9399ebb4caSwyllys 			KMF_HANDLE_T,
9499ebb4caSwyllys 			KMF_KEY_HANDLE *,
9599ebb4caSwyllys 			KMF_OID *,
9699ebb4caSwyllys 			KMF_DATA *,
9799ebb4caSwyllys 			KMF_DATA *);
9899ebb4caSwyllys 
9999ebb4caSwyllys 	KMF_RETURN	(*DeleteKey) (
10099ebb4caSwyllys 			KMF_HANDLE_T,
10199ebb4caSwyllys 			KMF_DELETEKEY_PARAMS *,
10299ebb4caSwyllys 			KMF_KEY_HANDLE *,
10399ebb4caSwyllys 			boolean_t);
10499ebb4caSwyllys 
10599ebb4caSwyllys 	KMF_RETURN	(*ListCRL) (
10699ebb4caSwyllys 			KMF_HANDLE_T,
10799ebb4caSwyllys 			KMF_LISTCRL_PARAMS *,
10899ebb4caSwyllys 			char **);
10999ebb4caSwyllys 
11099ebb4caSwyllys 	KMF_RETURN	(*FindCRL) (
11199ebb4caSwyllys 			KMF_HANDLE_T,
11299ebb4caSwyllys 			KMF_FINDCRL_PARAMS *,
11399ebb4caSwyllys 			char **,
11499ebb4caSwyllys 			int *);
11599ebb4caSwyllys 
11699ebb4caSwyllys 	KMF_RETURN	(*FindCertInCRL) (
11799ebb4caSwyllys 			KMF_HANDLE_T,
11899ebb4caSwyllys 			KMF_FINDCERTINCRL_PARAMS *);
11999ebb4caSwyllys 
12099ebb4caSwyllys 	KMF_RETURN	(*GetErrorString) (
12199ebb4caSwyllys 			KMF_HANDLE_T,
12299ebb4caSwyllys 			char **);
12399ebb4caSwyllys 
12499ebb4caSwyllys 	KMF_RETURN	(*GetPrikeyByCert) (
12599ebb4caSwyllys 			KMF_HANDLE_T,
12699ebb4caSwyllys 			KMF_CRYPTOWITHCERT_PARAMS *,
12799ebb4caSwyllys 			KMF_DATA *,
12899ebb4caSwyllys 			KMF_KEY_HANDLE *,
12999ebb4caSwyllys 			KMF_KEY_ALG);
13099ebb4caSwyllys 
13199ebb4caSwyllys 	KMF_RETURN	(*DecryptData) (
13299ebb4caSwyllys 			KMF_HANDLE_T,
13399ebb4caSwyllys 			KMF_KEY_HANDLE *,
13499ebb4caSwyllys 			KMF_OID *,
13599ebb4caSwyllys 			KMF_DATA *,
13699ebb4caSwyllys 			KMF_DATA *);
13799ebb4caSwyllys 
13899ebb4caSwyllys 	KMF_RETURN	(*ExportP12)(
13999ebb4caSwyllys 			KMF_HANDLE_T,
14099ebb4caSwyllys 			KMF_EXPORTP12_PARAMS *,
14199ebb4caSwyllys 			int, KMF_X509_DER_CERT *,
14299ebb4caSwyllys 			int, KMF_KEY_HANDLE *,
14399ebb4caSwyllys 			char *);
14499ebb4caSwyllys 
14599ebb4caSwyllys 	KMF_RETURN	(*StorePrivateKey)(
14699ebb4caSwyllys 			KMF_HANDLE_T,
14799ebb4caSwyllys 			KMF_STOREKEY_PARAMS *,
14899ebb4caSwyllys 			KMF_RAW_KEY_DATA *);
14999ebb4caSwyllys 
15099ebb4caSwyllys 	KMF_RETURN	(*CreateSymKey) (
15199ebb4caSwyllys 			KMF_HANDLE_T,
15299ebb4caSwyllys 			KMF_CREATESYMKEY_PARAMS *,
15399ebb4caSwyllys 			KMF_KEY_HANDLE *);
15499ebb4caSwyllys 
15599ebb4caSwyllys 	KMF_RETURN	(*GetSymKeyValue) (
15699ebb4caSwyllys 			KMF_HANDLE_T,
15799ebb4caSwyllys 			KMF_KEY_HANDLE *,
15899ebb4caSwyllys 			KMF_RAW_SYM_KEY *);
15999ebb4caSwyllys 
16099ebb4caSwyllys 	KMF_RETURN	(*SetTokenPin) (
16199ebb4caSwyllys 			KMF_HANDLE_T,
16299ebb4caSwyllys 			KMF_SETPIN_PARAMS *,
16399ebb4caSwyllys 			KMF_CREDENTIAL *);
16499ebb4caSwyllys 
165*02744e81Swyllys 	KMF_RETURN	(*VerifyDataWithCert) (
166*02744e81Swyllys 			KMF_HANDLE_T,
167*02744e81Swyllys 			KMF_ALGORITHM_INDEX,
168*02744e81Swyllys 			KMF_DATA *,
169*02744e81Swyllys 			KMF_DATA *,
170*02744e81Swyllys 			KMF_DATA *);
171*02744e81Swyllys 
17299ebb4caSwyllys 	void		(*Finalize) ();
17399ebb4caSwyllys 
17499ebb4caSwyllys } KMF_PLUGIN_FUNCLIST;
17599ebb4caSwyllys 
17699ebb4caSwyllys typedef struct {
17799ebb4caSwyllys 	KMF_KEYSTORE_TYPE	type;
17899ebb4caSwyllys 	char			*applications;
17999ebb4caSwyllys 	char 			*path;
18099ebb4caSwyllys 	void 			*dldesc;
18199ebb4caSwyllys 	KMF_PLUGIN_FUNCLIST	*funclist;
18299ebb4caSwyllys } KMF_PLUGIN;
18399ebb4caSwyllys 
18499ebb4caSwyllys typedef struct _KMF_PLUGIN_LIST {
18599ebb4caSwyllys 	KMF_PLUGIN		*plugin;
18699ebb4caSwyllys 	struct _KMF_PLUGIN_LIST *next;
18799ebb4caSwyllys } KMF_PLUGIN_LIST;
18899ebb4caSwyllys 
18999ebb4caSwyllys typedef struct _kmf_handle {
19099ebb4caSwyllys 	/*
19199ebb4caSwyllys 	 * session handle opened by KMF_SelectToken() to talk
19299ebb4caSwyllys 	 * to a specific slot in Crypto framework. It is used
19399ebb4caSwyllys 	 * by pkcs11 plugin module.
19499ebb4caSwyllys 	 */
19599ebb4caSwyllys 	CK_SESSION_HANDLE	pk11handle;
19699ebb4caSwyllys 	KMF_ERROR		lasterr;
19799ebb4caSwyllys 	KMF_POLICY_RECORD	*policy;
19899ebb4caSwyllys 	KMF_PLUGIN_LIST		*plugins;
19999ebb4caSwyllys } KMF_HANDLE;
20099ebb4caSwyllys 
20199ebb4caSwyllys #define	CLEAR_ERROR(h, rv) { \
20299ebb4caSwyllys 	if (h == NULL) { \
20399ebb4caSwyllys 		rv = KMF_ERR_BAD_PARAMETER; \
20499ebb4caSwyllys 	} else { \
20599ebb4caSwyllys 		h->lasterr.errcode = 0; \
20699ebb4caSwyllys 		h->lasterr.kstype = 0; \
20799ebb4caSwyllys 		rv = KMF_OK; \
20899ebb4caSwyllys 	} \
20999ebb4caSwyllys }
21099ebb4caSwyllys 
21199ebb4caSwyllys #define	KMF_PLUGIN_INIT_SYMBOL	"KMF_Plugin_Initialize"
21299ebb4caSwyllys 
21399ebb4caSwyllys #ifndef KMF_PLUGIN_PATH
21499ebb4caSwyllys #if defined(__sparcv9)
21599ebb4caSwyllys #define	KMF_PLUGIN_PATH "/usr/lib/security/sparcv9/"
21699ebb4caSwyllys #elif defined(__sparc)
21799ebb4caSwyllys #define	KMF_PLUGIN_PATH "/usr/lib/security/"
21899ebb4caSwyllys #elif defined(__i386)
21999ebb4caSwyllys #define	KMF_PLUGIN_PATH "/usr/lib/security/"
22099ebb4caSwyllys #elif defined(__amd64)
22199ebb4caSwyllys #define	KMF_PLUGIN_PATH "/usr/lib/security/amd64/"
22299ebb4caSwyllys #endif
22399ebb4caSwyllys #endif /* !KMF_PLUGIN_PATH */
22499ebb4caSwyllys 
22599ebb4caSwyllys KMF_PLUGIN_FUNCLIST *KMF_Plugin_Initialize();
22699ebb4caSwyllys 
22799ebb4caSwyllys KMF_RETURN
22899ebb4caSwyllys VerifyDataWithKey(KMF_HANDLE_T, KMF_DATA *, KMF_ALGORITHM_INDEX, KMF_DATA *,
22999ebb4caSwyllys 	KMF_DATA *);
23099ebb4caSwyllys 
23199ebb4caSwyllys KMF_RETURN
23299ebb4caSwyllys SignCsr(KMF_HANDLE_T, const KMF_DATA *, KMF_KEY_HANDLE *,
23399ebb4caSwyllys 		KMF_X509_ALGORITHM_IDENTIFIER *, KMF_DATA *);
23499ebb4caSwyllys 
23599ebb4caSwyllys KMF_BOOL PKCS_ConvertAlgorithmId2PKCSKeyType(
23699ebb4caSwyllys 	KMF_ALGORITHM_INDEX, CK_KEY_TYPE *);
23799ebb4caSwyllys 
23899ebb4caSwyllys KMF_RETURN PKCS_VerifyData(
23999ebb4caSwyllys 	KMF_HANDLE *,
24099ebb4caSwyllys 	KMF_ALGORITHM_INDEX,
24199ebb4caSwyllys 	KMF_X509_SPKI *,
24299ebb4caSwyllys 	KMF_DATA *, KMF_DATA *);
24399ebb4caSwyllys 
24499ebb4caSwyllys KMF_RETURN PKCS_EncryptData(
24599ebb4caSwyllys 	KMF_HANDLE *,
24699ebb4caSwyllys 	KMF_ALGORITHM_INDEX,
24799ebb4caSwyllys 	KMF_X509_SPKI *,
24899ebb4caSwyllys 	KMF_DATA *,
24999ebb4caSwyllys 	KMF_DATA *);
25099ebb4caSwyllys 
25199ebb4caSwyllys KMF_PLUGIN *FindPlugin(KMF_HANDLE_T, KMF_KEYSTORE_TYPE);
25299ebb4caSwyllys 
25399ebb4caSwyllys KMF_BOOL IsEqualOid(KMF_OID *, KMF_OID *);
25499ebb4caSwyllys 
25599ebb4caSwyllys KMF_OID *X509_AlgIdToAlgorithmOid(KMF_ALGORITHM_INDEX);
25699ebb4caSwyllys KMF_ALGORITHM_INDEX X509_AlgorithmOidToAlgId(KMF_OID *);
257*02744e81Swyllys KMF_RETURN PKCS_AcquirePublicKeyHandle(CK_SESSION_HANDLE ckSession,
258*02744e81Swyllys 	const KMF_X509_SPKI *, CK_KEY_TYPE, CK_OBJECT_HANDLE *,
259*02744e81Swyllys 	KMF_BOOL *);
260*02744e81Swyllys 
26199ebb4caSwyllys KMF_RETURN GetIDFromSPKI(KMF_X509_SPKI *, KMF_DATA *);
26299ebb4caSwyllys CK_RV DigestData(CK_SESSION_HANDLE, KMF_DATA *, KMF_DATA *);
26399ebb4caSwyllys 
26499ebb4caSwyllys KMF_RETURN KMF_SetAltName(KMF_X509_EXTENSIONS *,
26599ebb4caSwyllys 	KMF_OID *, int, KMF_GENERALNAMECHOICES, char *);
26699ebb4caSwyllys KMF_RETURN GetSequenceContents(char *, size_t, char **, size_t *);
26799ebb4caSwyllys KMF_X509_EXTENSION *FindExtn(KMF_X509_EXTENSIONS *, KMF_OID *);
26899ebb4caSwyllys KMF_RETURN add_an_extension(KMF_X509_EXTENSIONS *exts,
26999ebb4caSwyllys 	KMF_X509_EXTENSION *newextn);
27099ebb4caSwyllys KMF_RETURN set_integer(KMF_DATA *, void *, int);
27199ebb4caSwyllys void free_keyidlist(KMF_OID *, int);
27299ebb4caSwyllys KMF_RETURN copy_data(KMF_DATA *, KMF_DATA *);
27399ebb4caSwyllys void Cleanup_PK11_Session(KMF_HANDLE_T handle);
27499ebb4caSwyllys void free_dp_name(KMF_CRL_DIST_POINT *);
27599ebb4caSwyllys void free_dp(KMF_CRL_DIST_POINT *);
27699ebb4caSwyllys KMF_RETURN set_key_usage_extension(KMF_X509_EXTENSIONS *,
27799ebb4caSwyllys 	int, uint32_t);
27899ebb4caSwyllys int is_pk11_ready();
27999ebb4caSwyllys KMF_RETURN KMF_SelectToken(KMF_HANDLE_T, char *, int);
28099ebb4caSwyllys 
28199ebb4caSwyllys 
28299ebb4caSwyllys /* Indexes into the key parts array for RSA keys */
28399ebb4caSwyllys #define	KMF_RSA_MODULUS			(0)
28499ebb4caSwyllys #define	KMF_RSA_PUBLIC_EXPONENT		(1)
28599ebb4caSwyllys #define	KMF_RSA_PRIVATE_EXPONENT	(2)
28699ebb4caSwyllys #define	KMF_RSA_PRIME1			(3)
28799ebb4caSwyllys #define	KMF_RSA_PRIME2			(4)
28899ebb4caSwyllys #define	KMF_RSA_EXPONENT1		(5)
28999ebb4caSwyllys #define	KMF_RSA_EXPONENT2		(6)
29099ebb4caSwyllys #define	KMF_RSA_COEFFICIENT		(7)
29199ebb4caSwyllys 
29299ebb4caSwyllys /* Key part counts for RSA keys */
29399ebb4caSwyllys #define	KMF_NUMBER_RSA_PUBLIC_KEY_PARTS		(2)
29499ebb4caSwyllys #define	KMF_NUMBER_RSA_PRIVATE_KEY_PARTS	(8)
29599ebb4caSwyllys 
29699ebb4caSwyllys /* Key part counts for DSA keys */
29799ebb4caSwyllys #define	KMF_NUMBER_DSA_PUBLIC_KEY_PARTS		(4)
29899ebb4caSwyllys #define	KMF_NUMBER_DSA_PRIVATE_KEY_PARTS	(4)
29999ebb4caSwyllys 
30099ebb4caSwyllys /* Indexes into the key parts array for DSA keys */
30199ebb4caSwyllys #define	KMF_DSA_PRIME		(0)
30299ebb4caSwyllys #define	KMF_DSA_SUB_PRIME	(1)
30399ebb4caSwyllys #define	KMF_DSA_BASE		(2)
30499ebb4caSwyllys #define	KMF_DSA_PUBLIC_VALUE	(3)
30599ebb4caSwyllys 
30699ebb4caSwyllys #ifndef max
30799ebb4caSwyllys #define	max(a, b) ((a) < (b) ? (b) : (a))
30899ebb4caSwyllys #endif
30999ebb4caSwyllys 
31099ebb4caSwyllys /* Maximum key parts for all algorithms */
31199ebb4caSwyllys #define	KMF_MAX_PUBLIC_KEY_PARTS \
31299ebb4caSwyllys 	(max(KMF_NUMBER_RSA_PUBLIC_KEY_PARTS, \
31399ebb4caSwyllys 	KMF_NUMBER_DSA_PUBLIC_KEY_PARTS))
31499ebb4caSwyllys 
31599ebb4caSwyllys #define	KMF_MAX_PRIVATE_KEY_PARTS \
31699ebb4caSwyllys 	(max(KMF_NUMBER_RSA_PRIVATE_KEY_PARTS, \
31799ebb4caSwyllys 	KMF_NUMBER_DSA_PRIVATE_KEY_PARTS))
31899ebb4caSwyllys 
31999ebb4caSwyllys #define	KMF_MAX_KEY_PARTS \
32099ebb4caSwyllys 	(max(KMF_MAX_PUBLIC_KEY_PARTS, KMF_MAX_PRIVATE_KEY_PARTS))
32199ebb4caSwyllys 
32299ebb4caSwyllys typedef enum {
32399ebb4caSwyllys 	KMF_ALGMODE_NONE	= 0,
32499ebb4caSwyllys 	KMF_ALGMODE_CUSTOM,
32599ebb4caSwyllys 	KMF_ALGMODE_PUBLIC_KEY,
32699ebb4caSwyllys 	KMF_ALGMODE_PRIVATE_KEY,
32799ebb4caSwyllys 	KMF_ALGMODE_PKCS1_EMSA_V15
32899ebb4caSwyllys } KMF_SIGNATURE_MODE;
32999ebb4caSwyllys 
33099ebb4caSwyllys #define	KMF_CERT_PRINTABLE_LEN	1024
33199ebb4caSwyllys #define	SHA1_HASH_LENGTH 20
33299ebb4caSwyllys 
33399ebb4caSwyllys #define	OCSPREQ_TEMPNAME	"/tmp/ocsp.reqXXXXXX"
33499ebb4caSwyllys #define	OCSPRESP_TEMPNAME	"/tmp/ocsp.respXXXXXX"
33599ebb4caSwyllys 
33699ebb4caSwyllys #ifdef __cplusplus
33799ebb4caSwyllys }
33899ebb4caSwyllys #endif
33999ebb4caSwyllys #endif /* _KMFAPIP_H */
340