xref: /onnv-gate/usr/src/lib/libkmf/include/kmfapiP.h (revision 8192:1e71c4032126)
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 /*
226051Swyllys  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
233089Swyllys  * Use is subject to license terms.
243089Swyllys  */
253089Swyllys #ifndef _KMFAPIP_H
263089Swyllys #define	_KMFAPIP_H
273089Swyllys 
283089Swyllys #include <kmfapi.h>
293089Swyllys #include <kmfpolicy.h>
303089Swyllys 
313089Swyllys #ifdef __cplusplus
323089Swyllys extern "C" {
333089Swyllys #endif
343089Swyllys 
353089Swyllys /* Plugin function table */
363089Swyllys typedef struct {
373089Swyllys 	ushort_t	version;
383089Swyllys 	KMF_RETURN	(*ConfigureKeystore) (
393089Swyllys 			KMF_HANDLE_T,
405051Swyllys 			int,
415051Swyllys 			KMF_ATTRIBUTE *);
423089Swyllys 
433089Swyllys 	KMF_RETURN	(*FindCert) (
443089Swyllys 			KMF_HANDLE_T,
455051Swyllys 			int,
465051Swyllys 			KMF_ATTRIBUTE *);
473089Swyllys 
483089Swyllys 	void		(*FreeKMFCert) (
493089Swyllys 			KMF_HANDLE_T,
503089Swyllys 			KMF_X509_DER_CERT *);
513089Swyllys 
523089Swyllys 	KMF_RETURN	(*StoreCert) (
533089Swyllys 			KMF_HANDLE_T,
545051Swyllys 			int, KMF_ATTRIBUTE *);
553089Swyllys 
563089Swyllys 	KMF_RETURN	(*ImportCert) (
573089Swyllys 			KMF_HANDLE_T,
585051Swyllys 			int, KMF_ATTRIBUTE *);
593089Swyllys 
603089Swyllys 	KMF_RETURN	(*ImportCRL) (
613089Swyllys 			KMF_HANDLE_T,
625051Swyllys 			int, KMF_ATTRIBUTE *);
633089Swyllys 
643089Swyllys 	KMF_RETURN	(*DeleteCert) (
653089Swyllys 			KMF_HANDLE_T,
665051Swyllys 			int, KMF_ATTRIBUTE *);
673089Swyllys 
683089Swyllys 	KMF_RETURN	(*DeleteCRL) (
693089Swyllys 			KMF_HANDLE_T,
705051Swyllys 			int, KMF_ATTRIBUTE *);
713089Swyllys 
723089Swyllys 	KMF_RETURN	(*CreateKeypair) (
733089Swyllys 			KMF_HANDLE_T,
745051Swyllys 			int,
755051Swyllys 			KMF_ATTRIBUTE *);
763089Swyllys 
773089Swyllys 	KMF_RETURN	(*FindKey) (
783089Swyllys 			KMF_HANDLE_T,
795051Swyllys 			int,
805051Swyllys 			KMF_ATTRIBUTE *);
813089Swyllys 
823089Swyllys 	KMF_RETURN	(*EncodePubkeyData) (
833089Swyllys 			KMF_HANDLE_T,
843089Swyllys 			KMF_KEY_HANDLE *,
853089Swyllys 			KMF_DATA *);
863089Swyllys 
873089Swyllys 	KMF_RETURN	(*SignData) (
883089Swyllys 			KMF_HANDLE_T,
893089Swyllys 			KMF_KEY_HANDLE *,
903089Swyllys 			KMF_OID *,
913089Swyllys 			KMF_DATA *,
923089Swyllys 			KMF_DATA *);
933089Swyllys 
943089Swyllys 	KMF_RETURN	(*DeleteKey) (
953089Swyllys 			KMF_HANDLE_T,
965051Swyllys 			int,
975051Swyllys 			KMF_ATTRIBUTE *);
983089Swyllys 
993089Swyllys 	KMF_RETURN	(*ListCRL) (
1003089Swyllys 			KMF_HANDLE_T,
1015051Swyllys 			int, KMF_ATTRIBUTE *);
1023089Swyllys 
1033089Swyllys 	KMF_RETURN	(*FindCRL) (
1043089Swyllys 			KMF_HANDLE_T,
1055051Swyllys 			int, KMF_ATTRIBUTE *);
1063089Swyllys 
1073089Swyllys 	KMF_RETURN	(*FindCertInCRL) (
1083089Swyllys 			KMF_HANDLE_T,
1095051Swyllys 			int, KMF_ATTRIBUTE *);
1103089Swyllys 
1113089Swyllys 	KMF_RETURN	(*GetErrorString) (
1123089Swyllys 			KMF_HANDLE_T,
1133089Swyllys 			char **);
1143089Swyllys 
1155051Swyllys 	KMF_RETURN	(*FindPrikeyByCert) (
1163089Swyllys 			KMF_HANDLE_T,
1175051Swyllys 			int,
1185051Swyllys 			KMF_ATTRIBUTE *);
1193089Swyllys 
1203089Swyllys 	KMF_RETURN	(*DecryptData) (
1213089Swyllys 			KMF_HANDLE_T,
1223089Swyllys 			KMF_KEY_HANDLE *,
1233089Swyllys 			KMF_OID *,
1243089Swyllys 			KMF_DATA *,
1253089Swyllys 			KMF_DATA *);
1263089Swyllys 
1275051Swyllys 	KMF_RETURN	(*ExportPK12)(
1283089Swyllys 			KMF_HANDLE_T,
1295051Swyllys 			int,
1305051Swyllys 			KMF_ATTRIBUTE *);
1313089Swyllys 
1323089Swyllys 	KMF_RETURN	(*CreateSymKey) (
1333089Swyllys 			KMF_HANDLE_T,
1345051Swyllys 			int,
1355051Swyllys 			KMF_ATTRIBUTE *);
1363089Swyllys 
1373089Swyllys 	KMF_RETURN	(*GetSymKeyValue) (
1383089Swyllys 			KMF_HANDLE_T,
1393089Swyllys 			KMF_KEY_HANDLE *,
1403089Swyllys 			KMF_RAW_SYM_KEY *);
1413089Swyllys 
1423089Swyllys 	KMF_RETURN	(*SetTokenPin) (
1433089Swyllys 			KMF_HANDLE_T,
1445051Swyllys 			int, KMF_ATTRIBUTE *);
1453089Swyllys 
1463754Swyllys 	KMF_RETURN	(*VerifyDataWithCert) (
1473754Swyllys 			KMF_HANDLE_T,
1483754Swyllys 			KMF_ALGORITHM_INDEX,
1493754Swyllys 			KMF_DATA *,
1503754Swyllys 			KMF_DATA *,
1513754Swyllys 			KMF_DATA *);
1523754Swyllys 
1535051Swyllys 	KMF_RETURN	(*StoreKey) (
1545051Swyllys 			KMF_HANDLE_T,
1555051Swyllys 			int,
1565051Swyllys 			KMF_ATTRIBUTE *);
1575051Swyllys 
1583089Swyllys 	void		(*Finalize) ();
1593089Swyllys 
1603089Swyllys } KMF_PLUGIN_FUNCLIST;
1613089Swyllys 
1623089Swyllys typedef struct {
1635051Swyllys 	KMF_ATTR_TYPE	type;
1645051Swyllys 	boolean_t	null_value_ok; /* Is the pValue required */
1655051Swyllys 	uint32_t	minlen;
1665051Swyllys 	uint32_t	maxlen;
1675051Swyllys } KMF_ATTRIBUTE_TESTER;
1685051Swyllys 
1695051Swyllys typedef struct {
1703089Swyllys 	KMF_KEYSTORE_TYPE	type;
1713089Swyllys 	char			*applications;
1723089Swyllys 	char 			*path;
1733089Swyllys 	void 			*dldesc;
1743089Swyllys 	KMF_PLUGIN_FUNCLIST	*funclist;
1753089Swyllys } KMF_PLUGIN;
1763089Swyllys 
1773089Swyllys typedef struct _KMF_PLUGIN_LIST {
1783089Swyllys 	KMF_PLUGIN		*plugin;
1793089Swyllys 	struct _KMF_PLUGIN_LIST *next;
1803089Swyllys } KMF_PLUGIN_LIST;
1813089Swyllys 
1823089Swyllys typedef struct _kmf_handle {
1833089Swyllys 	/*
1845051Swyllys 	 * session handle opened by kmf_select_token() to talk
1853089Swyllys 	 * to a specific slot in Crypto framework. It is used
1863089Swyllys 	 * by pkcs11 plugin module.
1873089Swyllys 	 */
1883089Swyllys 	CK_SESSION_HANDLE	pk11handle;
1893089Swyllys 	KMF_ERROR		lasterr;
1903089Swyllys 	KMF_POLICY_RECORD	*policy;
1913089Swyllys 	KMF_PLUGIN_LIST		*plugins;
1923089Swyllys } KMF_HANDLE;
1933089Swyllys 
1943089Swyllys #define	CLEAR_ERROR(h, rv) { \
1953089Swyllys 	if (h == NULL) { \
1963089Swyllys 		rv = KMF_ERR_BAD_PARAMETER; \
1973089Swyllys 	} else { \
1983089Swyllys 		h->lasterr.errcode = 0; \
1993089Swyllys 		h->lasterr.kstype = 0; \
2003089Swyllys 		rv = KMF_OK; \
2013089Swyllys 	} \
2023089Swyllys }
2033089Swyllys 
2043089Swyllys #define	KMF_PLUGIN_INIT_SYMBOL	"KMF_Plugin_Initialize"
2053089Swyllys 
2063089Swyllys #ifndef KMF_PLUGIN_PATH
2073089Swyllys #if defined(__sparcv9)
208*8192SJohn.Zolnowsky@Sun.COM #define	KMF_PLUGIN_PATH "/lib/crypto/sparcv9/"
2093089Swyllys #elif defined(__sparc)
210*8192SJohn.Zolnowsky@Sun.COM #define	KMF_PLUGIN_PATH "/lib/crypto/"
2113089Swyllys #elif defined(__i386)
212*8192SJohn.Zolnowsky@Sun.COM #define	KMF_PLUGIN_PATH "/lib/crypto/"
2133089Swyllys #elif defined(__amd64)
214*8192SJohn.Zolnowsky@Sun.COM #define	KMF_PLUGIN_PATH "/lib/crypto/amd64/"
2153089Swyllys #endif
2163089Swyllys #endif /* !KMF_PLUGIN_PATH */
2173089Swyllys 
2183089Swyllys KMF_PLUGIN_FUNCLIST *KMF_Plugin_Initialize();
2193089Swyllys 
2206051Swyllys extern KMF_RETURN
2216051Swyllys VerifyDataWithKey(KMF_HANDLE_T, KMF_DATA *, KMF_ALGORITHM_INDEX,
2226051Swyllys     KMF_DATA *, KMF_DATA *);
2233089Swyllys 
2246051Swyllys extern KMF_BOOL pkcs_algid_to_keytype(
2256051Swyllys     KMF_ALGORITHM_INDEX, CK_KEY_TYPE *);
2263089Swyllys 
2276051Swyllys extern KMF_RETURN PKCS_VerifyData(
2286051Swyllys     KMF_HANDLE *,
2296051Swyllys     KMF_ALGORITHM_INDEX,
2306051Swyllys     KMF_X509_SPKI *,
2316051Swyllys     KMF_DATA *, KMF_DATA *);
2323089Swyllys 
2336051Swyllys extern KMF_RETURN PKCS_EncryptData(
2346051Swyllys     KMF_HANDLE *,
2356051Swyllys     KMF_ALGORITHM_INDEX,
2366051Swyllys     KMF_X509_SPKI *,
2376051Swyllys     KMF_DATA *,
2386051Swyllys     KMF_DATA *);
2393089Swyllys 
2406051Swyllys extern KMF_PLUGIN *FindPlugin(KMF_HANDLE_T, KMF_KEYSTORE_TYPE);
2413089Swyllys 
2426051Swyllys extern KMF_BOOL IsEqualOid(KMF_OID *, KMF_OID *);
2433089Swyllys 
2446051Swyllys extern KMF_RETURN copy_algoid(KMF_X509_ALGORITHM_IDENTIFIER *destid,
2456051Swyllys     KMF_X509_ALGORITHM_IDENTIFIER *srcid);
2465051Swyllys 
2476051Swyllys extern KMF_OID *x509_algid_to_algoid(KMF_ALGORITHM_INDEX);
2486051Swyllys extern KMF_ALGORITHM_INDEX x509_algoid_to_algid(KMF_OID *);
2495051Swyllys 
2506051Swyllys extern KMF_RETURN PKCS_AcquirePublicKeyHandle(CK_SESSION_HANDLE ckSession,
2516051Swyllys     const KMF_X509_SPKI *, CK_KEY_TYPE, CK_OBJECT_HANDLE *,
2526051Swyllys     KMF_BOOL *);
2533089Swyllys 
2546051Swyllys extern KMF_RETURN GetIDFromSPKI(KMF_X509_SPKI *, KMF_DATA *);
2556051Swyllys extern KMF_RETURN kmf_select_token(KMF_HANDLE_T, char *, int);
2566051Swyllys extern KMF_RETURN kmf_set_altname(KMF_X509_EXTENSIONS *,
2576051Swyllys     KMF_OID *, int, KMF_GENERALNAMECHOICES, char *);
2586051Swyllys extern KMF_RETURN GetSequenceContents(char *, size_t, char **, size_t *);
2596051Swyllys extern KMF_X509_EXTENSION *FindExtn(KMF_X509_EXTENSIONS *, KMF_OID *);
2606051Swyllys extern KMF_RETURN add_an_extension(KMF_X509_EXTENSIONS *exts,
2616051Swyllys     KMF_X509_EXTENSION *newextn);
2626051Swyllys extern KMF_RETURN set_integer(KMF_DATA *, void *, int);
2636051Swyllys extern void free_keyidlist(KMF_OID *, int);
2646051Swyllys extern KMF_RETURN copy_data(KMF_DATA *, KMF_DATA *);
2656051Swyllys extern void Cleanup_PK11_Session(KMF_HANDLE_T handle);
2666051Swyllys extern void free_dp_name(KMF_CRL_DIST_POINT *);
2676051Swyllys extern void free_dp(KMF_CRL_DIST_POINT *);
2686051Swyllys extern KMF_RETURN set_key_usage_extension(KMF_X509_EXTENSIONS *,
2696051Swyllys     int, uint32_t);
2706051Swyllys extern KMF_RETURN init_pk11();
2716051Swyllys extern KMF_RETURN test_attributes(int, KMF_ATTRIBUTE_TESTER *,
2726051Swyllys     int, KMF_ATTRIBUTE_TESTER *, int, KMF_ATTRIBUTE *);
2733089Swyllys 
2743089Swyllys /* Indexes into the key parts array for RSA keys */
2753089Swyllys #define	KMF_RSA_MODULUS			(0)
2763089Swyllys #define	KMF_RSA_PUBLIC_EXPONENT		(1)
2773089Swyllys #define	KMF_RSA_PRIVATE_EXPONENT	(2)
2783089Swyllys #define	KMF_RSA_PRIME1			(3)
2793089Swyllys #define	KMF_RSA_PRIME2			(4)
2803089Swyllys #define	KMF_RSA_EXPONENT1		(5)
2813089Swyllys #define	KMF_RSA_EXPONENT2		(6)
2823089Swyllys #define	KMF_RSA_COEFFICIENT		(7)
2833089Swyllys 
2843089Swyllys /* Key part counts for RSA keys */
2853089Swyllys #define	KMF_NUMBER_RSA_PUBLIC_KEY_PARTS		(2)
2863089Swyllys #define	KMF_NUMBER_RSA_PRIVATE_KEY_PARTS	(8)
2873089Swyllys 
2883089Swyllys /* Key part counts for DSA keys */
2893089Swyllys #define	KMF_NUMBER_DSA_PUBLIC_KEY_PARTS		(4)
2903089Swyllys #define	KMF_NUMBER_DSA_PRIVATE_KEY_PARTS	(4)
2913089Swyllys 
2923089Swyllys /* Indexes into the key parts array for DSA keys */
2933089Swyllys #define	KMF_DSA_PRIME		(0)
2943089Swyllys #define	KMF_DSA_SUB_PRIME	(1)
2953089Swyllys #define	KMF_DSA_BASE		(2)
2963089Swyllys #define	KMF_DSA_PUBLIC_VALUE	(3)
2973089Swyllys 
2983089Swyllys #ifndef max
2993089Swyllys #define	max(a, b) ((a) < (b) ? (b) : (a))
3003089Swyllys #endif
3013089Swyllys 
3023089Swyllys /* Maximum key parts for all algorithms */
3033089Swyllys #define	KMF_MAX_PUBLIC_KEY_PARTS \
3043089Swyllys 	(max(KMF_NUMBER_RSA_PUBLIC_KEY_PARTS, \
3053089Swyllys 	KMF_NUMBER_DSA_PUBLIC_KEY_PARTS))
3063089Swyllys 
3073089Swyllys #define	KMF_MAX_PRIVATE_KEY_PARTS \
3083089Swyllys 	(max(KMF_NUMBER_RSA_PRIVATE_KEY_PARTS, \
3093089Swyllys 	KMF_NUMBER_DSA_PRIVATE_KEY_PARTS))
3103089Swyllys 
3113089Swyllys #define	KMF_MAX_KEY_PARTS \
3123089Swyllys 	(max(KMF_MAX_PUBLIC_KEY_PARTS, KMF_MAX_PRIVATE_KEY_PARTS))
3133089Swyllys 
3143089Swyllys typedef enum {
3153089Swyllys 	KMF_ALGMODE_NONE	= 0,
3163089Swyllys 	KMF_ALGMODE_CUSTOM,
3173089Swyllys 	KMF_ALGMODE_PUBLIC_KEY,
3183089Swyllys 	KMF_ALGMODE_PRIVATE_KEY,
3193089Swyllys 	KMF_ALGMODE_PKCS1_EMSA_V15
3203089Swyllys } KMF_SIGNATURE_MODE;
3213089Swyllys 
3223089Swyllys #define	KMF_CERT_PRINTABLE_LEN	1024
3233089Swyllys #define	SHA1_HASH_LENGTH 20
3243089Swyllys 
3253089Swyllys #define	OCSPREQ_TEMPNAME	"/tmp/ocsp.reqXXXXXX"
3263089Swyllys #define	OCSPRESP_TEMPNAME	"/tmp/ocsp.respXXXXXX"
3273089Swyllys 
3285626Shylee #define	_PATH_KMF_CONF	"/etc/crypto/kmf.conf"
3295626Shylee #define	CONF_MODULEPATH	"modulepath="
3305626Shylee #define	CONF_OPTION	"option="
3315626Shylee 
3325626Shylee typedef struct {
3335626Shylee 	char			*keystore;
3345626Shylee 	char			*modulepath;
3355626Shylee 	char 			*option;
3365626Shylee 	KMF_KEYSTORE_TYPE	kstype;
3375626Shylee } conf_entry_t;
3385626Shylee 
3395626Shylee typedef struct conf_entrylist {
3405626Shylee 	conf_entry_t		*entry;
3415626Shylee 	struct conf_entrylist 	*next;
3425626Shylee } conf_entrylist_t;
3435626Shylee 
3445626Shylee 
3455626Shylee extern KMF_RETURN get_entrylist(conf_entrylist_t **);
3465626Shylee extern void free_entrylist(conf_entrylist_t *);
3475626Shylee extern void free_entry(conf_entry_t *);
3485626Shylee extern conf_entry_t *dup_entry(conf_entry_t *);
3496051Swyllys extern boolean_t is_valid_keystore_type(KMF_KEYSTORE_TYPE);
3506051Swyllys extern KMF_BOOL is_eku_present(KMF_X509EXT_EKU *, KMF_OID *);
3516051Swyllys extern KMF_RETURN parse_eku_data(const KMF_DATA *, KMF_X509EXT_EKU *);
3526669Swyllys extern KMF_RETURN
3536669Swyllys copy_extension_data(KMF_X509_EXTENSION *, KMF_X509_EXTENSION *);
3545626Shylee 
3553089Swyllys #ifdef __cplusplus
3563089Swyllys }
3573089Swyllys #endif
3583089Swyllys #endif /* _KMFAPIP_H */
359