xref: /onnv-gate/usr/src/lib/libkmf/include/kmfapiP.h (revision 5051:cbbb7c8b40a9)
13089Swyllys /*
23089Swyllys  * CDDL HEADER START
33089Swyllys  *
43089Swyllys  * The contents of this file are subject to the terms of the
53089Swyllys  * Common Development and Distribution License (the "License").
63089Swyllys  * You may not use this file except in compliance with the License.
73089Swyllys  *
83089Swyllys  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93089Swyllys  * or http://www.opensolaris.org/os/licensing.
103089Swyllys  * See the License for the specific language governing permissions
113089Swyllys  * and limitations under the License.
123089Swyllys  *
133089Swyllys  * When distributing Covered Code, include this CDDL HEADER in each
143089Swyllys  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153089Swyllys  * If applicable, add the following below this CDDL HEADER, with the
163089Swyllys  * fields enclosed by brackets "[]" replaced with your own identifying
173089Swyllys  * information: Portions Copyright [yyyy] [name of copyright owner]
183089Swyllys  *
193089Swyllys  * CDDL HEADER END
203089Swyllys  */
213089Swyllys /*
223754Swyllys  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
233089Swyllys  * Use is subject to license terms.
243089Swyllys  */
253089Swyllys #ifndef _KMFAPIP_H
263089Swyllys #define	_KMFAPIP_H
273089Swyllys 
283089Swyllys #pragma ident	"%Z%%M%	%I%	%E% SMI"
293089Swyllys 
303089Swyllys #include <kmfapi.h>
313089Swyllys #include <kmfpolicy.h>
323089Swyllys 
333089Swyllys #ifdef __cplusplus
343089Swyllys extern "C" {
353089Swyllys #endif
363089Swyllys 
373089Swyllys /* Plugin function table */
383089Swyllys typedef struct {
393089Swyllys 	ushort_t	version;
403089Swyllys 	KMF_RETURN	(*ConfigureKeystore) (
413089Swyllys 			KMF_HANDLE_T,
42*5051Swyllys 			int,
43*5051Swyllys 			KMF_ATTRIBUTE *);
443089Swyllys 
453089Swyllys 	KMF_RETURN	(*FindCert) (
463089Swyllys 			KMF_HANDLE_T,
47*5051Swyllys 			int,
48*5051Swyllys 			KMF_ATTRIBUTE *);
493089Swyllys 
503089Swyllys 	void		(*FreeKMFCert) (
513089Swyllys 			KMF_HANDLE_T,
523089Swyllys 			KMF_X509_DER_CERT *);
533089Swyllys 
543089Swyllys 	KMF_RETURN	(*StoreCert) (
553089Swyllys 			KMF_HANDLE_T,
56*5051Swyllys 			int, KMF_ATTRIBUTE *);
573089Swyllys 
583089Swyllys 	KMF_RETURN	(*ImportCert) (
593089Swyllys 			KMF_HANDLE_T,
60*5051Swyllys 			int, KMF_ATTRIBUTE *);
613089Swyllys 
623089Swyllys 	KMF_RETURN	(*ImportCRL) (
633089Swyllys 			KMF_HANDLE_T,
64*5051Swyllys 			int, KMF_ATTRIBUTE *);
653089Swyllys 
663089Swyllys 	KMF_RETURN	(*DeleteCert) (
673089Swyllys 			KMF_HANDLE_T,
68*5051Swyllys 			int, KMF_ATTRIBUTE *);
693089Swyllys 
703089Swyllys 	KMF_RETURN	(*DeleteCRL) (
713089Swyllys 			KMF_HANDLE_T,
72*5051Swyllys 			int, KMF_ATTRIBUTE *);
733089Swyllys 
743089Swyllys 	KMF_RETURN	(*CreateKeypair) (
753089Swyllys 			KMF_HANDLE_T,
76*5051Swyllys 			int,
77*5051Swyllys 			KMF_ATTRIBUTE *);
783089Swyllys 
793089Swyllys 	KMF_RETURN	(*FindKey) (
803089Swyllys 			KMF_HANDLE_T,
81*5051Swyllys 			int,
82*5051Swyllys 			KMF_ATTRIBUTE *);
833089Swyllys 
843089Swyllys 	KMF_RETURN	(*EncodePubkeyData) (
853089Swyllys 			KMF_HANDLE_T,
863089Swyllys 			KMF_KEY_HANDLE *,
873089Swyllys 			KMF_DATA *);
883089Swyllys 
893089Swyllys 	KMF_RETURN	(*SignData) (
903089Swyllys 			KMF_HANDLE_T,
913089Swyllys 			KMF_KEY_HANDLE *,
923089Swyllys 			KMF_OID *,
933089Swyllys 			KMF_DATA *,
943089Swyllys 			KMF_DATA *);
953089Swyllys 
963089Swyllys 	KMF_RETURN	(*DeleteKey) (
973089Swyllys 			KMF_HANDLE_T,
98*5051Swyllys 			int,
99*5051Swyllys 			KMF_ATTRIBUTE *);
1003089Swyllys 
1013089Swyllys 	KMF_RETURN	(*ListCRL) (
1023089Swyllys 			KMF_HANDLE_T,
103*5051Swyllys 			int, KMF_ATTRIBUTE *);
1043089Swyllys 
1053089Swyllys 	KMF_RETURN	(*FindCRL) (
1063089Swyllys 			KMF_HANDLE_T,
107*5051Swyllys 			int, KMF_ATTRIBUTE *);
1083089Swyllys 
1093089Swyllys 	KMF_RETURN	(*FindCertInCRL) (
1103089Swyllys 			KMF_HANDLE_T,
111*5051Swyllys 			int, KMF_ATTRIBUTE *);
1123089Swyllys 
1133089Swyllys 	KMF_RETURN	(*GetErrorString) (
1143089Swyllys 			KMF_HANDLE_T,
1153089Swyllys 			char **);
1163089Swyllys 
117*5051Swyllys 	KMF_RETURN	(*FindPrikeyByCert) (
1183089Swyllys 			KMF_HANDLE_T,
119*5051Swyllys 			int,
120*5051Swyllys 			KMF_ATTRIBUTE *);
1213089Swyllys 
1223089Swyllys 	KMF_RETURN	(*DecryptData) (
1233089Swyllys 			KMF_HANDLE_T,
1243089Swyllys 			KMF_KEY_HANDLE *,
1253089Swyllys 			KMF_OID *,
1263089Swyllys 			KMF_DATA *,
1273089Swyllys 			KMF_DATA *);
1283089Swyllys 
129*5051Swyllys 	KMF_RETURN	(*ExportPK12)(
1303089Swyllys 			KMF_HANDLE_T,
131*5051Swyllys 			int,
132*5051Swyllys 			KMF_ATTRIBUTE *);
1333089Swyllys 
1343089Swyllys 	KMF_RETURN	(*CreateSymKey) (
1353089Swyllys 			KMF_HANDLE_T,
136*5051Swyllys 			int,
137*5051Swyllys 			KMF_ATTRIBUTE *);
1383089Swyllys 
1393089Swyllys 	KMF_RETURN	(*GetSymKeyValue) (
1403089Swyllys 			KMF_HANDLE_T,
1413089Swyllys 			KMF_KEY_HANDLE *,
1423089Swyllys 			KMF_RAW_SYM_KEY *);
1433089Swyllys 
1443089Swyllys 	KMF_RETURN	(*SetTokenPin) (
1453089Swyllys 			KMF_HANDLE_T,
146*5051Swyllys 			int, KMF_ATTRIBUTE *);
1473089Swyllys 
1483754Swyllys 	KMF_RETURN	(*VerifyDataWithCert) (
1493754Swyllys 			KMF_HANDLE_T,
1503754Swyllys 			KMF_ALGORITHM_INDEX,
1513754Swyllys 			KMF_DATA *,
1523754Swyllys 			KMF_DATA *,
1533754Swyllys 			KMF_DATA *);
1543754Swyllys 
155*5051Swyllys 	KMF_RETURN	(*StoreKey) (
156*5051Swyllys 			KMF_HANDLE_T,
157*5051Swyllys 			int,
158*5051Swyllys 			KMF_ATTRIBUTE *);
159*5051Swyllys 
1603089Swyllys 	void		(*Finalize) ();
1613089Swyllys 
1623089Swyllys } KMF_PLUGIN_FUNCLIST;
1633089Swyllys 
1643089Swyllys typedef struct {
165*5051Swyllys 	KMF_ATTR_TYPE	type;
166*5051Swyllys 	boolean_t	null_value_ok; /* Is the pValue required */
167*5051Swyllys 	uint32_t	minlen;
168*5051Swyllys 	uint32_t	maxlen;
169*5051Swyllys } KMF_ATTRIBUTE_TESTER;
170*5051Swyllys 
171*5051Swyllys typedef struct {
1723089Swyllys 	KMF_KEYSTORE_TYPE	type;
1733089Swyllys 	char			*applications;
1743089Swyllys 	char 			*path;
1753089Swyllys 	void 			*dldesc;
1763089Swyllys 	KMF_PLUGIN_FUNCLIST	*funclist;
1773089Swyllys } KMF_PLUGIN;
1783089Swyllys 
1793089Swyllys typedef struct _KMF_PLUGIN_LIST {
1803089Swyllys 	KMF_PLUGIN		*plugin;
1813089Swyllys 	struct _KMF_PLUGIN_LIST *next;
1823089Swyllys } KMF_PLUGIN_LIST;
1833089Swyllys 
1843089Swyllys typedef struct _kmf_handle {
1853089Swyllys 	/*
186*5051Swyllys 	 * session handle opened by kmf_select_token() to talk
1873089Swyllys 	 * to a specific slot in Crypto framework. It is used
1883089Swyllys 	 * by pkcs11 plugin module.
1893089Swyllys 	 */
1903089Swyllys 	CK_SESSION_HANDLE	pk11handle;
1913089Swyllys 	KMF_ERROR		lasterr;
1923089Swyllys 	KMF_POLICY_RECORD	*policy;
1933089Swyllys 	KMF_PLUGIN_LIST		*plugins;
1943089Swyllys } KMF_HANDLE;
1953089Swyllys 
1963089Swyllys #define	CLEAR_ERROR(h, rv) { \
1973089Swyllys 	if (h == NULL) { \
1983089Swyllys 		rv = KMF_ERR_BAD_PARAMETER; \
1993089Swyllys 	} else { \
2003089Swyllys 		h->lasterr.errcode = 0; \
2013089Swyllys 		h->lasterr.kstype = 0; \
2023089Swyllys 		rv = KMF_OK; \
2033089Swyllys 	} \
2043089Swyllys }
2053089Swyllys 
2063089Swyllys #define	KMF_PLUGIN_INIT_SYMBOL	"KMF_Plugin_Initialize"
2073089Swyllys 
2083089Swyllys #ifndef KMF_PLUGIN_PATH
2093089Swyllys #if defined(__sparcv9)
2103089Swyllys #define	KMF_PLUGIN_PATH "/usr/lib/security/sparcv9/"
2113089Swyllys #elif defined(__sparc)
2123089Swyllys #define	KMF_PLUGIN_PATH "/usr/lib/security/"
2133089Swyllys #elif defined(__i386)
2143089Swyllys #define	KMF_PLUGIN_PATH "/usr/lib/security/"
2153089Swyllys #elif defined(__amd64)
2163089Swyllys #define	KMF_PLUGIN_PATH "/usr/lib/security/amd64/"
2173089Swyllys #endif
2183089Swyllys #endif /* !KMF_PLUGIN_PATH */
2193089Swyllys 
2203089Swyllys KMF_PLUGIN_FUNCLIST *KMF_Plugin_Initialize();
2213089Swyllys 
2223089Swyllys KMF_RETURN
2233089Swyllys VerifyDataWithKey(KMF_HANDLE_T, KMF_DATA *, KMF_ALGORITHM_INDEX, KMF_DATA *,
2243089Swyllys 	KMF_DATA *);
2253089Swyllys 
226*5051Swyllys KMF_BOOL pkcs_algid_to_keytype(
2273089Swyllys 	KMF_ALGORITHM_INDEX, CK_KEY_TYPE *);
2283089Swyllys 
2293089Swyllys KMF_RETURN PKCS_VerifyData(
2303089Swyllys 	KMF_HANDLE *,
2313089Swyllys 	KMF_ALGORITHM_INDEX,
2323089Swyllys 	KMF_X509_SPKI *,
2333089Swyllys 	KMF_DATA *, KMF_DATA *);
2343089Swyllys 
2353089Swyllys KMF_RETURN PKCS_EncryptData(
2363089Swyllys 	KMF_HANDLE *,
2373089Swyllys 	KMF_ALGORITHM_INDEX,
2383089Swyllys 	KMF_X509_SPKI *,
2393089Swyllys 	KMF_DATA *,
2403089Swyllys 	KMF_DATA *);
2413089Swyllys 
2423089Swyllys KMF_PLUGIN *FindPlugin(KMF_HANDLE_T, KMF_KEYSTORE_TYPE);
2433089Swyllys 
2443089Swyllys KMF_BOOL IsEqualOid(KMF_OID *, KMF_OID *);
2453089Swyllys 
246*5051Swyllys KMF_RETURN copy_algoid(KMF_X509_ALGORITHM_IDENTIFIER *destid,
247*5051Swyllys 	KMF_X509_ALGORITHM_IDENTIFIER *srcid);
248*5051Swyllys 
249*5051Swyllys KMF_OID *x509_algid_to_algoid(KMF_ALGORITHM_INDEX);
250*5051Swyllys KMF_ALGORITHM_INDEX x509_algoid_to_algid(KMF_OID *);
251*5051Swyllys 
2523754Swyllys KMF_RETURN PKCS_AcquirePublicKeyHandle(CK_SESSION_HANDLE ckSession,
2533754Swyllys 	const KMF_X509_SPKI *, CK_KEY_TYPE, CK_OBJECT_HANDLE *,
2543754Swyllys 	KMF_BOOL *);
2553089Swyllys 
2563089Swyllys KMF_RETURN GetIDFromSPKI(KMF_X509_SPKI *, KMF_DATA *);
2573089Swyllys 
258*5051Swyllys KMF_RETURN kmf_set_altname(KMF_X509_EXTENSIONS *,
2593089Swyllys 	KMF_OID *, int, KMF_GENERALNAMECHOICES, char *);
2603089Swyllys KMF_RETURN GetSequenceContents(char *, size_t, char **, size_t *);
2613089Swyllys KMF_X509_EXTENSION *FindExtn(KMF_X509_EXTENSIONS *, KMF_OID *);
2623089Swyllys KMF_RETURN add_an_extension(KMF_X509_EXTENSIONS *exts,
2633089Swyllys 	KMF_X509_EXTENSION *newextn);
2643089Swyllys KMF_RETURN set_integer(KMF_DATA *, void *, int);
2653089Swyllys void free_keyidlist(KMF_OID *, int);
2663089Swyllys KMF_RETURN copy_data(KMF_DATA *, KMF_DATA *);
2673089Swyllys void Cleanup_PK11_Session(KMF_HANDLE_T handle);
2683089Swyllys void free_dp_name(KMF_CRL_DIST_POINT *);
2693089Swyllys void free_dp(KMF_CRL_DIST_POINT *);
2703089Swyllys KMF_RETURN set_key_usage_extension(KMF_X509_EXTENSIONS *,
2713089Swyllys 	int, uint32_t);
2723825Swyllys KMF_RETURN init_pk11();
273*5051Swyllys KMF_RETURN kmf_select_token(KMF_HANDLE_T, char *, int);
274*5051Swyllys 
275*5051Swyllys KMF_RETURN test_attributes(int, KMF_ATTRIBUTE_TESTER *,
276*5051Swyllys 	int, KMF_ATTRIBUTE_TESTER *, int, KMF_ATTRIBUTE *);
2773089Swyllys 
2783089Swyllys 
2793089Swyllys /* Indexes into the key parts array for RSA keys */
2803089Swyllys #define	KMF_RSA_MODULUS			(0)
2813089Swyllys #define	KMF_RSA_PUBLIC_EXPONENT		(1)
2823089Swyllys #define	KMF_RSA_PRIVATE_EXPONENT	(2)
2833089Swyllys #define	KMF_RSA_PRIME1			(3)
2843089Swyllys #define	KMF_RSA_PRIME2			(4)
2853089Swyllys #define	KMF_RSA_EXPONENT1		(5)
2863089Swyllys #define	KMF_RSA_EXPONENT2		(6)
2873089Swyllys #define	KMF_RSA_COEFFICIENT		(7)
2883089Swyllys 
2893089Swyllys /* Key part counts for RSA keys */
2903089Swyllys #define	KMF_NUMBER_RSA_PUBLIC_KEY_PARTS		(2)
2913089Swyllys #define	KMF_NUMBER_RSA_PRIVATE_KEY_PARTS	(8)
2923089Swyllys 
2933089Swyllys /* Key part counts for DSA keys */
2943089Swyllys #define	KMF_NUMBER_DSA_PUBLIC_KEY_PARTS		(4)
2953089Swyllys #define	KMF_NUMBER_DSA_PRIVATE_KEY_PARTS	(4)
2963089Swyllys 
2973089Swyllys /* Indexes into the key parts array for DSA keys */
2983089Swyllys #define	KMF_DSA_PRIME		(0)
2993089Swyllys #define	KMF_DSA_SUB_PRIME	(1)
3003089Swyllys #define	KMF_DSA_BASE		(2)
3013089Swyllys #define	KMF_DSA_PUBLIC_VALUE	(3)
3023089Swyllys 
3033089Swyllys #ifndef max
3043089Swyllys #define	max(a, b) ((a) < (b) ? (b) : (a))
3053089Swyllys #endif
3063089Swyllys 
3073089Swyllys /* Maximum key parts for all algorithms */
3083089Swyllys #define	KMF_MAX_PUBLIC_KEY_PARTS \
3093089Swyllys 	(max(KMF_NUMBER_RSA_PUBLIC_KEY_PARTS, \
3103089Swyllys 	KMF_NUMBER_DSA_PUBLIC_KEY_PARTS))
3113089Swyllys 
3123089Swyllys #define	KMF_MAX_PRIVATE_KEY_PARTS \
3133089Swyllys 	(max(KMF_NUMBER_RSA_PRIVATE_KEY_PARTS, \
3143089Swyllys 	KMF_NUMBER_DSA_PRIVATE_KEY_PARTS))
3153089Swyllys 
3163089Swyllys #define	KMF_MAX_KEY_PARTS \
3173089Swyllys 	(max(KMF_MAX_PUBLIC_KEY_PARTS, KMF_MAX_PRIVATE_KEY_PARTS))
3183089Swyllys 
3193089Swyllys typedef enum {
3203089Swyllys 	KMF_ALGMODE_NONE	= 0,
3213089Swyllys 	KMF_ALGMODE_CUSTOM,
3223089Swyllys 	KMF_ALGMODE_PUBLIC_KEY,
3233089Swyllys 	KMF_ALGMODE_PRIVATE_KEY,
3243089Swyllys 	KMF_ALGMODE_PKCS1_EMSA_V15
3253089Swyllys } KMF_SIGNATURE_MODE;
3263089Swyllys 
3273089Swyllys #define	KMF_CERT_PRINTABLE_LEN	1024
3283089Swyllys #define	SHA1_HASH_LENGTH 20
3293089Swyllys 
3303089Swyllys #define	OCSPREQ_TEMPNAME	"/tmp/ocsp.reqXXXXXX"
3313089Swyllys #define	OCSPRESP_TEMPNAME	"/tmp/ocsp.respXXXXXX"
3323089Swyllys 
3333089Swyllys #ifdef __cplusplus
3343089Swyllys }
3353089Swyllys #endif
3363089Swyllys #endif /* _KMFAPIP_H */
337