xref: /onnv-gate/usr/src/lib/libkmf/include/kmfapiP.h (revision 12611:d9f75b73c5fd)
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
20*12611SJan.Pechanec@Sun.COM  *
21*12611SJan.Pechanec@Sun.COM  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
223089Swyllys  */
233089Swyllys #ifndef _KMFAPIP_H
243089Swyllys #define	_KMFAPIP_H
253089Swyllys 
263089Swyllys #include <kmfapi.h>
273089Swyllys #include <kmfpolicy.h>
283089Swyllys 
293089Swyllys #ifdef __cplusplus
303089Swyllys extern "C" {
313089Swyllys #endif
323089Swyllys 
333089Swyllys /* Plugin function table */
343089Swyllys typedef struct {
353089Swyllys 	ushort_t	version;
363089Swyllys 	KMF_RETURN	(*ConfigureKeystore) (
373089Swyllys 			KMF_HANDLE_T,
385051Swyllys 			int,
395051Swyllys 			KMF_ATTRIBUTE *);
403089Swyllys 
413089Swyllys 	KMF_RETURN	(*FindCert) (
423089Swyllys 			KMF_HANDLE_T,
435051Swyllys 			int,
445051Swyllys 			KMF_ATTRIBUTE *);
453089Swyllys 
463089Swyllys 	void		(*FreeKMFCert) (
473089Swyllys 			KMF_HANDLE_T,
483089Swyllys 			KMF_X509_DER_CERT *);
493089Swyllys 
503089Swyllys 	KMF_RETURN	(*StoreCert) (
513089Swyllys 			KMF_HANDLE_T,
525051Swyllys 			int, KMF_ATTRIBUTE *);
533089Swyllys 
543089Swyllys 	KMF_RETURN	(*ImportCert) (
553089Swyllys 			KMF_HANDLE_T,
565051Swyllys 			int, KMF_ATTRIBUTE *);
573089Swyllys 
583089Swyllys 	KMF_RETURN	(*ImportCRL) (
593089Swyllys 			KMF_HANDLE_T,
605051Swyllys 			int, KMF_ATTRIBUTE *);
613089Swyllys 
623089Swyllys 	KMF_RETURN	(*DeleteCert) (
633089Swyllys 			KMF_HANDLE_T,
645051Swyllys 			int, KMF_ATTRIBUTE *);
653089Swyllys 
663089Swyllys 	KMF_RETURN	(*DeleteCRL) (
673089Swyllys 			KMF_HANDLE_T,
685051Swyllys 			int, KMF_ATTRIBUTE *);
693089Swyllys 
703089Swyllys 	KMF_RETURN	(*CreateKeypair) (
713089Swyllys 			KMF_HANDLE_T,
725051Swyllys 			int,
735051Swyllys 			KMF_ATTRIBUTE *);
743089Swyllys 
753089Swyllys 	KMF_RETURN	(*FindKey) (
763089Swyllys 			KMF_HANDLE_T,
775051Swyllys 			int,
785051Swyllys 			KMF_ATTRIBUTE *);
793089Swyllys 
803089Swyllys 	KMF_RETURN	(*EncodePubkeyData) (
813089Swyllys 			KMF_HANDLE_T,
823089Swyllys 			KMF_KEY_HANDLE *,
833089Swyllys 			KMF_DATA *);
843089Swyllys 
853089Swyllys 	KMF_RETURN	(*SignData) (
863089Swyllys 			KMF_HANDLE_T,
873089Swyllys 			KMF_KEY_HANDLE *,
883089Swyllys 			KMF_OID *,
893089Swyllys 			KMF_DATA *,
903089Swyllys 			KMF_DATA *);
913089Swyllys 
923089Swyllys 	KMF_RETURN	(*DeleteKey) (
933089Swyllys 			KMF_HANDLE_T,
945051Swyllys 			int,
955051Swyllys 			KMF_ATTRIBUTE *);
963089Swyllys 
973089Swyllys 	KMF_RETURN	(*ListCRL) (
983089Swyllys 			KMF_HANDLE_T,
995051Swyllys 			int, KMF_ATTRIBUTE *);
1003089Swyllys 
1013089Swyllys 	KMF_RETURN	(*FindCRL) (
1023089Swyllys 			KMF_HANDLE_T,
1035051Swyllys 			int, KMF_ATTRIBUTE *);
1043089Swyllys 
1053089Swyllys 	KMF_RETURN	(*FindCertInCRL) (
1063089Swyllys 			KMF_HANDLE_T,
1075051Swyllys 			int, KMF_ATTRIBUTE *);
1083089Swyllys 
1093089Swyllys 	KMF_RETURN	(*GetErrorString) (
1103089Swyllys 			KMF_HANDLE_T,
1113089Swyllys 			char **);
1123089Swyllys 
1135051Swyllys 	KMF_RETURN	(*FindPrikeyByCert) (
1143089Swyllys 			KMF_HANDLE_T,
1155051Swyllys 			int,
1165051Swyllys 			KMF_ATTRIBUTE *);
1173089Swyllys 
1183089Swyllys 	KMF_RETURN	(*DecryptData) (
1193089Swyllys 			KMF_HANDLE_T,
1203089Swyllys 			KMF_KEY_HANDLE *,
1213089Swyllys 			KMF_OID *,
1223089Swyllys 			KMF_DATA *,
1233089Swyllys 			KMF_DATA *);
1243089Swyllys 
1255051Swyllys 	KMF_RETURN	(*ExportPK12)(
1263089Swyllys 			KMF_HANDLE_T,
1275051Swyllys 			int,
1285051Swyllys 			KMF_ATTRIBUTE *);
1293089Swyllys 
1303089Swyllys 	KMF_RETURN	(*CreateSymKey) (
1313089Swyllys 			KMF_HANDLE_T,
1325051Swyllys 			int,
1335051Swyllys 			KMF_ATTRIBUTE *);
1343089Swyllys 
1353089Swyllys 	KMF_RETURN	(*GetSymKeyValue) (
1363089Swyllys 			KMF_HANDLE_T,
1373089Swyllys 			KMF_KEY_HANDLE *,
1383089Swyllys 			KMF_RAW_SYM_KEY *);
1393089Swyllys 
1403089Swyllys 	KMF_RETURN	(*SetTokenPin) (
1413089Swyllys 			KMF_HANDLE_T,
1425051Swyllys 			int, KMF_ATTRIBUTE *);
1433089Swyllys 
1445051Swyllys 	KMF_RETURN	(*StoreKey) (
1455051Swyllys 			KMF_HANDLE_T,
1465051Swyllys 			int,
1475051Swyllys 			KMF_ATTRIBUTE *);
1485051Swyllys 
1493089Swyllys 	void		(*Finalize) ();
1503089Swyllys 
1513089Swyllys } KMF_PLUGIN_FUNCLIST;
1523089Swyllys 
1533089Swyllys typedef struct {
1545051Swyllys 	KMF_ATTR_TYPE	type;
1555051Swyllys 	boolean_t	null_value_ok; /* Is the pValue required */
1565051Swyllys 	uint32_t	minlen;
1575051Swyllys 	uint32_t	maxlen;
1585051Swyllys } KMF_ATTRIBUTE_TESTER;
1595051Swyllys 
1605051Swyllys typedef struct {
1613089Swyllys 	KMF_KEYSTORE_TYPE	type;
1623089Swyllys 	char			*applications;
1633089Swyllys 	char 			*path;
1643089Swyllys 	void 			*dldesc;
1653089Swyllys 	KMF_PLUGIN_FUNCLIST	*funclist;
1663089Swyllys } KMF_PLUGIN;
1673089Swyllys 
1683089Swyllys typedef struct _KMF_PLUGIN_LIST {
1693089Swyllys 	KMF_PLUGIN		*plugin;
1703089Swyllys 	struct _KMF_PLUGIN_LIST *next;
1713089Swyllys } KMF_PLUGIN_LIST;
1723089Swyllys 
1733089Swyllys typedef struct _kmf_handle {
1743089Swyllys 	/*
1755051Swyllys 	 * session handle opened by kmf_select_token() to talk
1763089Swyllys 	 * to a specific slot in Crypto framework. It is used
1773089Swyllys 	 * by pkcs11 plugin module.
1783089Swyllys 	 */
1793089Swyllys 	CK_SESSION_HANDLE	pk11handle;
1803089Swyllys 	KMF_ERROR		lasterr;
1813089Swyllys 	KMF_POLICY_RECORD	*policy;
1823089Swyllys 	KMF_PLUGIN_LIST		*plugins;
183*12611SJan.Pechanec@Sun.COM 	KMF_MAPPER_STATE	*mapstate;
1843089Swyllys } KMF_HANDLE;
1853089Swyllys 
1863089Swyllys #define	CLEAR_ERROR(h, rv) { \
1873089Swyllys 	if (h == NULL) { \
1883089Swyllys 		rv = KMF_ERR_BAD_PARAMETER; \
1893089Swyllys 	} else { \
1903089Swyllys 		h->lasterr.errcode = 0; \
1913089Swyllys 		h->lasterr.kstype = 0; \
1923089Swyllys 		rv = KMF_OK; \
1933089Swyllys 	} \
1943089Swyllys }
1953089Swyllys 
1963089Swyllys #define	KMF_PLUGIN_INIT_SYMBOL	"KMF_Plugin_Initialize"
1973089Swyllys 
1983089Swyllys #ifndef KMF_PLUGIN_PATH
1993089Swyllys #if defined(__sparcv9)
2008192SJohn.Zolnowsky@Sun.COM #define	KMF_PLUGIN_PATH "/lib/crypto/sparcv9/"
2013089Swyllys #elif defined(__sparc)
2028192SJohn.Zolnowsky@Sun.COM #define	KMF_PLUGIN_PATH "/lib/crypto/"
2033089Swyllys #elif defined(__i386)
2048192SJohn.Zolnowsky@Sun.COM #define	KMF_PLUGIN_PATH "/lib/crypto/"
2053089Swyllys #elif defined(__amd64)
2068192SJohn.Zolnowsky@Sun.COM #define	KMF_PLUGIN_PATH "/lib/crypto/amd64/"
2073089Swyllys #endif
2083089Swyllys #endif /* !KMF_PLUGIN_PATH */
2093089Swyllys 
2103089Swyllys KMF_PLUGIN_FUNCLIST *KMF_Plugin_Initialize();
2113089Swyllys 
2126051Swyllys extern KMF_RETURN
2136051Swyllys VerifyDataWithKey(KMF_HANDLE_T, KMF_DATA *, KMF_ALGORITHM_INDEX,
2146051Swyllys     KMF_DATA *, KMF_DATA *);
2153089Swyllys 
2166051Swyllys extern KMF_BOOL pkcs_algid_to_keytype(
2176051Swyllys     KMF_ALGORITHM_INDEX, CK_KEY_TYPE *);
2183089Swyllys 
21911973Swyllys.ingersoll@sun.com extern KMF_RETURN PKCS_DigestData(KMF_HANDLE_T,
22011973Swyllys.ingersoll@sun.com     CK_SESSION_HANDLE, CK_MECHANISM_TYPE,
22111973Swyllys.ingersoll@sun.com     KMF_DATA *, KMF_DATA *, boolean_t);
22211973Swyllys.ingersoll@sun.com 
2236051Swyllys extern KMF_RETURN PKCS_VerifyData(
2246051Swyllys     KMF_HANDLE *,
2256051Swyllys     KMF_ALGORITHM_INDEX,
2266051Swyllys     KMF_X509_SPKI *,
2276051Swyllys     KMF_DATA *, KMF_DATA *);
2283089Swyllys 
2296051Swyllys extern KMF_RETURN PKCS_EncryptData(
2306051Swyllys     KMF_HANDLE *,
2316051Swyllys     KMF_ALGORITHM_INDEX,
2326051Swyllys     KMF_X509_SPKI *,
2336051Swyllys     KMF_DATA *,
2346051Swyllys     KMF_DATA *);
2353089Swyllys 
2366051Swyllys extern KMF_PLUGIN *FindPlugin(KMF_HANDLE_T, KMF_KEYSTORE_TYPE);
2373089Swyllys 
2386051Swyllys extern KMF_BOOL IsEqualOid(KMF_OID *, KMF_OID *);
2393089Swyllys 
2406051Swyllys extern KMF_RETURN copy_algoid(KMF_X509_ALGORITHM_IDENTIFIER *destid,
2416051Swyllys     KMF_X509_ALGORITHM_IDENTIFIER *srcid);
2425051Swyllys 
2436051Swyllys extern KMF_OID *x509_algid_to_algoid(KMF_ALGORITHM_INDEX);
2446051Swyllys extern KMF_ALGORITHM_INDEX x509_algoid_to_algid(KMF_OID *);
2455051Swyllys 
2466051Swyllys extern KMF_RETURN GetIDFromSPKI(KMF_X509_SPKI *, KMF_DATA *);
2476051Swyllys extern KMF_RETURN kmf_select_token(KMF_HANDLE_T, char *, int);
2486051Swyllys extern KMF_RETURN kmf_set_altname(KMF_X509_EXTENSIONS *,
2496051Swyllys     KMF_OID *, int, KMF_GENERALNAMECHOICES, char *);
2506051Swyllys extern KMF_RETURN GetSequenceContents(char *, size_t, char **, size_t *);
2516051Swyllys extern KMF_X509_EXTENSION *FindExtn(KMF_X509_EXTENSIONS *, KMF_OID *);
2526051Swyllys extern KMF_RETURN add_an_extension(KMF_X509_EXTENSIONS *exts,
2536051Swyllys     KMF_X509_EXTENSION *newextn);
2546051Swyllys extern KMF_RETURN set_integer(KMF_DATA *, void *, int);
2556051Swyllys extern void free_keyidlist(KMF_OID *, int);
2566051Swyllys extern KMF_RETURN copy_data(KMF_DATA *, KMF_DATA *);
2576051Swyllys extern void Cleanup_PK11_Session(KMF_HANDLE_T handle);
2586051Swyllys extern void free_dp_name(KMF_CRL_DIST_POINT *);
2596051Swyllys extern void free_dp(KMF_CRL_DIST_POINT *);
2606051Swyllys extern KMF_RETURN set_key_usage_extension(KMF_X509_EXTENSIONS *,
2616051Swyllys     int, uint32_t);
2626051Swyllys extern KMF_RETURN init_pk11();
2636051Swyllys extern KMF_RETURN test_attributes(int, KMF_ATTRIBUTE_TESTER *,
2646051Swyllys     int, KMF_ATTRIBUTE_TESTER *, int, KMF_ATTRIBUTE *);
2653089Swyllys 
2663089Swyllys /* Indexes into the key parts array for RSA keys */
2673089Swyllys #define	KMF_RSA_MODULUS			(0)
2683089Swyllys #define	KMF_RSA_PUBLIC_EXPONENT		(1)
2693089Swyllys #define	KMF_RSA_PRIVATE_EXPONENT	(2)
2703089Swyllys #define	KMF_RSA_PRIME1			(3)
2713089Swyllys #define	KMF_RSA_PRIME2			(4)
2723089Swyllys #define	KMF_RSA_EXPONENT1		(5)
2733089Swyllys #define	KMF_RSA_EXPONENT2		(6)
2743089Swyllys #define	KMF_RSA_COEFFICIENT		(7)
2753089Swyllys 
2763089Swyllys /* Key part counts for RSA keys */
2773089Swyllys #define	KMF_NUMBER_RSA_PUBLIC_KEY_PARTS		(2)
2783089Swyllys #define	KMF_NUMBER_RSA_PRIVATE_KEY_PARTS	(8)
2793089Swyllys 
2803089Swyllys /* Key part counts for DSA keys */
2813089Swyllys #define	KMF_NUMBER_DSA_PUBLIC_KEY_PARTS		(4)
2823089Swyllys #define	KMF_NUMBER_DSA_PRIVATE_KEY_PARTS	(4)
2833089Swyllys 
2843089Swyllys /* Indexes into the key parts array for DSA keys */
2853089Swyllys #define	KMF_DSA_PRIME		(0)
2863089Swyllys #define	KMF_DSA_SUB_PRIME	(1)
2873089Swyllys #define	KMF_DSA_BASE		(2)
2883089Swyllys #define	KMF_DSA_PUBLIC_VALUE	(3)
2893089Swyllys 
29011973Swyllys.ingersoll@sun.com #define	KMF_ECDSA_PARAMS	(0)
29111973Swyllys.ingersoll@sun.com #define	KMF_ECDSA_POINT		(1)
29211973Swyllys.ingersoll@sun.com 
2933089Swyllys #ifndef max
2943089Swyllys #define	max(a, b) ((a) < (b) ? (b) : (a))
2953089Swyllys #endif
2963089Swyllys 
2973089Swyllys /* Maximum key parts for all algorithms */
2983089Swyllys #define	KMF_MAX_PUBLIC_KEY_PARTS \
2993089Swyllys 	(max(KMF_NUMBER_RSA_PUBLIC_KEY_PARTS, \
3003089Swyllys 	KMF_NUMBER_DSA_PUBLIC_KEY_PARTS))
3013089Swyllys 
3023089Swyllys #define	KMF_MAX_PRIVATE_KEY_PARTS \
3033089Swyllys 	(max(KMF_NUMBER_RSA_PRIVATE_KEY_PARTS, \
3043089Swyllys 	KMF_NUMBER_DSA_PRIVATE_KEY_PARTS))
3053089Swyllys 
3063089Swyllys #define	KMF_MAX_KEY_PARTS \
3073089Swyllys 	(max(KMF_MAX_PUBLIC_KEY_PARTS, KMF_MAX_PRIVATE_KEY_PARTS))
3083089Swyllys 
3093089Swyllys typedef enum {
3103089Swyllys 	KMF_ALGMODE_NONE	= 0,
3113089Swyllys 	KMF_ALGMODE_CUSTOM,
3123089Swyllys 	KMF_ALGMODE_PUBLIC_KEY,
3133089Swyllys 	KMF_ALGMODE_PRIVATE_KEY,
3143089Swyllys 	KMF_ALGMODE_PKCS1_EMSA_V15
3153089Swyllys } KMF_SIGNATURE_MODE;
3163089Swyllys 
3173089Swyllys #define	KMF_CERT_PRINTABLE_LEN	1024
3183089Swyllys #define	SHA1_HASH_LENGTH 20
3193089Swyllys 
3203089Swyllys #define	OCSPREQ_TEMPNAME	"/tmp/ocsp.reqXXXXXX"
3213089Swyllys #define	OCSPRESP_TEMPNAME	"/tmp/ocsp.respXXXXXX"
3223089Swyllys 
3235626Shylee #define	_PATH_KMF_CONF	"/etc/crypto/kmf.conf"
3245626Shylee #define	CONF_MODULEPATH	"modulepath="
3255626Shylee #define	CONF_OPTION	"option="
3265626Shylee 
3275626Shylee typedef struct {
3285626Shylee 	char			*keystore;
3295626Shylee 	char			*modulepath;
3305626Shylee 	char 			*option;
3315626Shylee 	KMF_KEYSTORE_TYPE	kstype;
3325626Shylee } conf_entry_t;
3335626Shylee 
3345626Shylee typedef struct conf_entrylist {
3355626Shylee 	conf_entry_t		*entry;
3365626Shylee 	struct conf_entrylist 	*next;
3375626Shylee } conf_entrylist_t;
3385626Shylee 
33911973Swyllys.ingersoll@sun.com extern KMF_RETURN get_pk11_data(KMF_ALGORITHM_INDEX,
34011973Swyllys.ingersoll@sun.com 	CK_KEY_TYPE *, CK_MECHANISM_TYPE *, CK_MECHANISM_TYPE *, boolean_t);
34111973Swyllys.ingersoll@sun.com extern KMF_RETURN kmf_create_pk11_session(CK_SESSION_HANDLE *,
34211973Swyllys.ingersoll@sun.com 	CK_MECHANISM_TYPE, CK_FLAGS);
3435626Shylee extern KMF_RETURN get_entrylist(conf_entrylist_t **);
3445626Shylee extern void free_entrylist(conf_entrylist_t *);
3455626Shylee extern void free_entry(conf_entry_t *);
3465626Shylee extern conf_entry_t *dup_entry(conf_entry_t *);
3476051Swyllys extern boolean_t is_valid_keystore_type(KMF_KEYSTORE_TYPE);
3486051Swyllys extern KMF_BOOL is_eku_present(KMF_X509EXT_EKU *, KMF_OID *);
3496051Swyllys extern KMF_RETURN parse_eku_data(const KMF_DATA *, KMF_X509EXT_EKU *);
350*12611SJan.Pechanec@Sun.COM extern KMF_RETURN copy_extension_data(KMF_X509_EXTENSION *,
351*12611SJan.Pechanec@Sun.COM 	KMF_X509_EXTENSION *);
352*12611SJan.Pechanec@Sun.COM extern char *get_mapper_pathname(char *, char *);
3535626Shylee 
3543089Swyllys #ifdef __cplusplus
3553089Swyllys }
3563089Swyllys #endif
3573089Swyllys #endif /* _KMFAPIP_H */
358