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