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