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