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