xref: /onnv-gate/usr/src/lib/libkmf/include/kmfapiP.h (revision 3754:79eeec53e95c)
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 /*
22*3754Swyllys  * 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,
423089Swyllys 			KMF_CONFIG_PARAMS *);
433089Swyllys 
443089Swyllys 	KMF_RETURN	(*FindCert) (
453089Swyllys 			KMF_HANDLE_T,
463089Swyllys 			KMF_FINDCERT_PARAMS	*,
473089Swyllys 			KMF_X509_DER_CERT *,
483089Swyllys 			uint32_t *);
493089Swyllys 
503089Swyllys 	void		(*FreeKMFCert) (
513089Swyllys 			KMF_HANDLE_T,
523089Swyllys 			KMF_X509_DER_CERT *);
533089Swyllys 
543089Swyllys 	KMF_RETURN	(*StoreCert) (
553089Swyllys 			KMF_HANDLE_T,
563089Swyllys 			KMF_STORECERT_PARAMS *,
573089Swyllys 			KMF_DATA *);
583089Swyllys 
593089Swyllys 	KMF_RETURN	(*ImportCert) (
603089Swyllys 			KMF_HANDLE_T,
613089Swyllys 			KMF_IMPORTCERT_PARAMS *);
623089Swyllys 
633089Swyllys 	KMF_RETURN	(*ImportCRL) (
643089Swyllys 			KMF_HANDLE_T,
653089Swyllys 			KMF_IMPORTCRL_PARAMS *);
663089Swyllys 
673089Swyllys 	KMF_RETURN	(*DeleteCert) (
683089Swyllys 			KMF_HANDLE_T,
693089Swyllys 			KMF_DELETECERT_PARAMS *);
703089Swyllys 
713089Swyllys 	KMF_RETURN	(*DeleteCRL) (
723089Swyllys 			KMF_HANDLE_T,
733089Swyllys 			KMF_DELETECRL_PARAMS *);
743089Swyllys 
753089Swyllys 	KMF_RETURN	(*CreateKeypair) (
763089Swyllys 			KMF_HANDLE_T,
773089Swyllys 			KMF_CREATEKEYPAIR_PARAMS *,
783089Swyllys 			KMF_KEY_HANDLE *,
793089Swyllys 			KMF_KEY_HANDLE *);
803089Swyllys 
813089Swyllys 	KMF_RETURN	(*FindKey) (
823089Swyllys 			KMF_HANDLE_T,
833089Swyllys 			KMF_FINDKEY_PARAMS *,
843089Swyllys 			KMF_KEY_HANDLE *,
853089Swyllys 			uint32_t *);
863089Swyllys 
873089Swyllys 	KMF_RETURN	(*EncodePubkeyData) (
883089Swyllys 			KMF_HANDLE_T,
893089Swyllys 			KMF_KEY_HANDLE *,
903089Swyllys 			KMF_DATA *);
913089Swyllys 
923089Swyllys 	KMF_RETURN	(*SignData) (
933089Swyllys 			KMF_HANDLE_T,
943089Swyllys 			KMF_KEY_HANDLE *,
953089Swyllys 			KMF_OID *,
963089Swyllys 			KMF_DATA *,
973089Swyllys 			KMF_DATA *);
983089Swyllys 
993089Swyllys 	KMF_RETURN	(*DeleteKey) (
1003089Swyllys 			KMF_HANDLE_T,
1013089Swyllys 			KMF_DELETEKEY_PARAMS *,
1023089Swyllys 			KMF_KEY_HANDLE *,
1033089Swyllys 			boolean_t);
1043089Swyllys 
1053089Swyllys 	KMF_RETURN	(*ListCRL) (
1063089Swyllys 			KMF_HANDLE_T,
1073089Swyllys 			KMF_LISTCRL_PARAMS *,
1083089Swyllys 			char **);
1093089Swyllys 
1103089Swyllys 	KMF_RETURN	(*FindCRL) (
1113089Swyllys 			KMF_HANDLE_T,
1123089Swyllys 			KMF_FINDCRL_PARAMS *,
1133089Swyllys 			char **,
1143089Swyllys 			int *);
1153089Swyllys 
1163089Swyllys 	KMF_RETURN	(*FindCertInCRL) (
1173089Swyllys 			KMF_HANDLE_T,
1183089Swyllys 			KMF_FINDCERTINCRL_PARAMS *);
1193089Swyllys 
1203089Swyllys 	KMF_RETURN	(*GetErrorString) (
1213089Swyllys 			KMF_HANDLE_T,
1223089Swyllys 			char **);
1233089Swyllys 
1243089Swyllys 	KMF_RETURN	(*GetPrikeyByCert) (
1253089Swyllys 			KMF_HANDLE_T,
1263089Swyllys 			KMF_CRYPTOWITHCERT_PARAMS *,
1273089Swyllys 			KMF_DATA *,
1283089Swyllys 			KMF_KEY_HANDLE *,
1293089Swyllys 			KMF_KEY_ALG);
1303089Swyllys 
1313089Swyllys 	KMF_RETURN	(*DecryptData) (
1323089Swyllys 			KMF_HANDLE_T,
1333089Swyllys 			KMF_KEY_HANDLE *,
1343089Swyllys 			KMF_OID *,
1353089Swyllys 			KMF_DATA *,
1363089Swyllys 			KMF_DATA *);
1373089Swyllys 
1383089Swyllys 	KMF_RETURN	(*ExportP12)(
1393089Swyllys 			KMF_HANDLE_T,
1403089Swyllys 			KMF_EXPORTP12_PARAMS *,
1413089Swyllys 			int, KMF_X509_DER_CERT *,
1423089Swyllys 			int, KMF_KEY_HANDLE *,
1433089Swyllys 			char *);
1443089Swyllys 
1453089Swyllys 	KMF_RETURN	(*StorePrivateKey)(
1463089Swyllys 			KMF_HANDLE_T,
1473089Swyllys 			KMF_STOREKEY_PARAMS *,
1483089Swyllys 			KMF_RAW_KEY_DATA *);
1493089Swyllys 
1503089Swyllys 	KMF_RETURN	(*CreateSymKey) (
1513089Swyllys 			KMF_HANDLE_T,
1523089Swyllys 			KMF_CREATESYMKEY_PARAMS *,
1533089Swyllys 			KMF_KEY_HANDLE *);
1543089Swyllys 
1553089Swyllys 	KMF_RETURN	(*GetSymKeyValue) (
1563089Swyllys 			KMF_HANDLE_T,
1573089Swyllys 			KMF_KEY_HANDLE *,
1583089Swyllys 			KMF_RAW_SYM_KEY *);
1593089Swyllys 
1603089Swyllys 	KMF_RETURN	(*SetTokenPin) (
1613089Swyllys 			KMF_HANDLE_T,
1623089Swyllys 			KMF_SETPIN_PARAMS *,
1633089Swyllys 			KMF_CREDENTIAL *);
1643089Swyllys 
165*3754Swyllys 	KMF_RETURN	(*VerifyDataWithCert) (
166*3754Swyllys 			KMF_HANDLE_T,
167*3754Swyllys 			KMF_ALGORITHM_INDEX,
168*3754Swyllys 			KMF_DATA *,
169*3754Swyllys 			KMF_DATA *,
170*3754Swyllys 			KMF_DATA *);
171*3754Swyllys 
1723089Swyllys 	void		(*Finalize) ();
1733089Swyllys 
1743089Swyllys } KMF_PLUGIN_FUNCLIST;
1753089Swyllys 
1763089Swyllys typedef struct {
1773089Swyllys 	KMF_KEYSTORE_TYPE	type;
1783089Swyllys 	char			*applications;
1793089Swyllys 	char 			*path;
1803089Swyllys 	void 			*dldesc;
1813089Swyllys 	KMF_PLUGIN_FUNCLIST	*funclist;
1823089Swyllys } KMF_PLUGIN;
1833089Swyllys 
1843089Swyllys typedef struct _KMF_PLUGIN_LIST {
1853089Swyllys 	KMF_PLUGIN		*plugin;
1863089Swyllys 	struct _KMF_PLUGIN_LIST *next;
1873089Swyllys } KMF_PLUGIN_LIST;
1883089Swyllys 
1893089Swyllys typedef struct _kmf_handle {
1903089Swyllys 	/*
1913089Swyllys 	 * session handle opened by KMF_SelectToken() to talk
1923089Swyllys 	 * to a specific slot in Crypto framework. It is used
1933089Swyllys 	 * by pkcs11 plugin module.
1943089Swyllys 	 */
1953089Swyllys 	CK_SESSION_HANDLE	pk11handle;
1963089Swyllys 	KMF_ERROR		lasterr;
1973089Swyllys 	KMF_POLICY_RECORD	*policy;
1983089Swyllys 	KMF_PLUGIN_LIST		*plugins;
1993089Swyllys } KMF_HANDLE;
2003089Swyllys 
2013089Swyllys #define	CLEAR_ERROR(h, rv) { \
2023089Swyllys 	if (h == NULL) { \
2033089Swyllys 		rv = KMF_ERR_BAD_PARAMETER; \
2043089Swyllys 	} else { \
2053089Swyllys 		h->lasterr.errcode = 0; \
2063089Swyllys 		h->lasterr.kstype = 0; \
2073089Swyllys 		rv = KMF_OK; \
2083089Swyllys 	} \
2093089Swyllys }
2103089Swyllys 
2113089Swyllys #define	KMF_PLUGIN_INIT_SYMBOL	"KMF_Plugin_Initialize"
2123089Swyllys 
2133089Swyllys #ifndef KMF_PLUGIN_PATH
2143089Swyllys #if defined(__sparcv9)
2153089Swyllys #define	KMF_PLUGIN_PATH "/usr/lib/security/sparcv9/"
2163089Swyllys #elif defined(__sparc)
2173089Swyllys #define	KMF_PLUGIN_PATH "/usr/lib/security/"
2183089Swyllys #elif defined(__i386)
2193089Swyllys #define	KMF_PLUGIN_PATH "/usr/lib/security/"
2203089Swyllys #elif defined(__amd64)
2213089Swyllys #define	KMF_PLUGIN_PATH "/usr/lib/security/amd64/"
2223089Swyllys #endif
2233089Swyllys #endif /* !KMF_PLUGIN_PATH */
2243089Swyllys 
2253089Swyllys KMF_PLUGIN_FUNCLIST *KMF_Plugin_Initialize();
2263089Swyllys 
2273089Swyllys KMF_RETURN
2283089Swyllys VerifyDataWithKey(KMF_HANDLE_T, KMF_DATA *, KMF_ALGORITHM_INDEX, KMF_DATA *,
2293089Swyllys 	KMF_DATA *);
2303089Swyllys 
2313089Swyllys KMF_RETURN
2323089Swyllys SignCsr(KMF_HANDLE_T, const KMF_DATA *, KMF_KEY_HANDLE *,
2333089Swyllys 		KMF_X509_ALGORITHM_IDENTIFIER *, KMF_DATA *);
2343089Swyllys 
2353089Swyllys KMF_BOOL PKCS_ConvertAlgorithmId2PKCSKeyType(
2363089Swyllys 	KMF_ALGORITHM_INDEX, CK_KEY_TYPE *);
2373089Swyllys 
2383089Swyllys KMF_RETURN PKCS_VerifyData(
2393089Swyllys 	KMF_HANDLE *,
2403089Swyllys 	KMF_ALGORITHM_INDEX,
2413089Swyllys 	KMF_X509_SPKI *,
2423089Swyllys 	KMF_DATA *, KMF_DATA *);
2433089Swyllys 
2443089Swyllys KMF_RETURN PKCS_EncryptData(
2453089Swyllys 	KMF_HANDLE *,
2463089Swyllys 	KMF_ALGORITHM_INDEX,
2473089Swyllys 	KMF_X509_SPKI *,
2483089Swyllys 	KMF_DATA *,
2493089Swyllys 	KMF_DATA *);
2503089Swyllys 
2513089Swyllys KMF_PLUGIN *FindPlugin(KMF_HANDLE_T, KMF_KEYSTORE_TYPE);
2523089Swyllys 
2533089Swyllys KMF_BOOL IsEqualOid(KMF_OID *, KMF_OID *);
2543089Swyllys 
2553089Swyllys KMF_OID *X509_AlgIdToAlgorithmOid(KMF_ALGORITHM_INDEX);
256*3754Swyllys KMF_ALGORITHM_INDEX X509_AlgorithmOidToAlgId(KMF_OID *);
257*3754Swyllys KMF_RETURN PKCS_AcquirePublicKeyHandle(CK_SESSION_HANDLE ckSession,
258*3754Swyllys 	const KMF_X509_SPKI *, CK_KEY_TYPE, CK_OBJECT_HANDLE *,
259*3754Swyllys 	KMF_BOOL *);
2603089Swyllys 
2613089Swyllys KMF_RETURN GetIDFromSPKI(KMF_X509_SPKI *, KMF_DATA *);
2623089Swyllys CK_RV DigestData(CK_SESSION_HANDLE, KMF_DATA *, KMF_DATA *);
2633089Swyllys 
2643089Swyllys KMF_RETURN KMF_SetAltName(KMF_X509_EXTENSIONS *,
2653089Swyllys 	KMF_OID *, int, KMF_GENERALNAMECHOICES, char *);
2663089Swyllys KMF_RETURN GetSequenceContents(char *, size_t, char **, size_t *);
2673089Swyllys KMF_X509_EXTENSION *FindExtn(KMF_X509_EXTENSIONS *, KMF_OID *);
2683089Swyllys KMF_RETURN add_an_extension(KMF_X509_EXTENSIONS *exts,
2693089Swyllys 	KMF_X509_EXTENSION *newextn);
2703089Swyllys KMF_RETURN set_integer(KMF_DATA *, void *, int);
2713089Swyllys void free_keyidlist(KMF_OID *, int);
2723089Swyllys KMF_RETURN copy_data(KMF_DATA *, KMF_DATA *);
2733089Swyllys void Cleanup_PK11_Session(KMF_HANDLE_T handle);
2743089Swyllys void free_dp_name(KMF_CRL_DIST_POINT *);
2753089Swyllys void free_dp(KMF_CRL_DIST_POINT *);
2763089Swyllys KMF_RETURN set_key_usage_extension(KMF_X509_EXTENSIONS *,
2773089Swyllys 	int, uint32_t);
2783089Swyllys int is_pk11_ready();
2793089Swyllys KMF_RETURN KMF_SelectToken(KMF_HANDLE_T, char *, int);
2803089Swyllys 
2813089Swyllys 
2823089Swyllys /* Indexes into the key parts array for RSA keys */
2833089Swyllys #define	KMF_RSA_MODULUS			(0)
2843089Swyllys #define	KMF_RSA_PUBLIC_EXPONENT		(1)
2853089Swyllys #define	KMF_RSA_PRIVATE_EXPONENT	(2)
2863089Swyllys #define	KMF_RSA_PRIME1			(3)
2873089Swyllys #define	KMF_RSA_PRIME2			(4)
2883089Swyllys #define	KMF_RSA_EXPONENT1		(5)
2893089Swyllys #define	KMF_RSA_EXPONENT2		(6)
2903089Swyllys #define	KMF_RSA_COEFFICIENT		(7)
2913089Swyllys 
2923089Swyllys /* Key part counts for RSA keys */
2933089Swyllys #define	KMF_NUMBER_RSA_PUBLIC_KEY_PARTS		(2)
2943089Swyllys #define	KMF_NUMBER_RSA_PRIVATE_KEY_PARTS	(8)
2953089Swyllys 
2963089Swyllys /* Key part counts for DSA keys */
2973089Swyllys #define	KMF_NUMBER_DSA_PUBLIC_KEY_PARTS		(4)
2983089Swyllys #define	KMF_NUMBER_DSA_PRIVATE_KEY_PARTS	(4)
2993089Swyllys 
3003089Swyllys /* Indexes into the key parts array for DSA keys */
3013089Swyllys #define	KMF_DSA_PRIME		(0)
3023089Swyllys #define	KMF_DSA_SUB_PRIME	(1)
3033089Swyllys #define	KMF_DSA_BASE		(2)
3043089Swyllys #define	KMF_DSA_PUBLIC_VALUE	(3)
3053089Swyllys 
3063089Swyllys #ifndef max
3073089Swyllys #define	max(a, b) ((a) < (b) ? (b) : (a))
3083089Swyllys #endif
3093089Swyllys 
3103089Swyllys /* Maximum key parts for all algorithms */
3113089Swyllys #define	KMF_MAX_PUBLIC_KEY_PARTS \
3123089Swyllys 	(max(KMF_NUMBER_RSA_PUBLIC_KEY_PARTS, \
3133089Swyllys 	KMF_NUMBER_DSA_PUBLIC_KEY_PARTS))
3143089Swyllys 
3153089Swyllys #define	KMF_MAX_PRIVATE_KEY_PARTS \
3163089Swyllys 	(max(KMF_NUMBER_RSA_PRIVATE_KEY_PARTS, \
3173089Swyllys 	KMF_NUMBER_DSA_PRIVATE_KEY_PARTS))
3183089Swyllys 
3193089Swyllys #define	KMF_MAX_KEY_PARTS \
3203089Swyllys 	(max(KMF_MAX_PUBLIC_KEY_PARTS, KMF_MAX_PRIVATE_KEY_PARTS))
3213089Swyllys 
3223089Swyllys typedef enum {
3233089Swyllys 	KMF_ALGMODE_NONE	= 0,
3243089Swyllys 	KMF_ALGMODE_CUSTOM,
3253089Swyllys 	KMF_ALGMODE_PUBLIC_KEY,
3263089Swyllys 	KMF_ALGMODE_PRIVATE_KEY,
3273089Swyllys 	KMF_ALGMODE_PKCS1_EMSA_V15
3283089Swyllys } KMF_SIGNATURE_MODE;
3293089Swyllys 
3303089Swyllys #define	KMF_CERT_PRINTABLE_LEN	1024
3313089Swyllys #define	SHA1_HASH_LENGTH 20
3323089Swyllys 
3333089Swyllys #define	OCSPREQ_TEMPNAME	"/tmp/ocsp.reqXXXXXX"
3343089Swyllys #define	OCSPRESP_TEMPNAME	"/tmp/ocsp.respXXXXXX"
3353089Swyllys 
3363089Swyllys #ifdef __cplusplus
3373089Swyllys }
3383089Swyllys #endif
3393089Swyllys #endif /* _KMFAPIP_H */
340