17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 58047c9fbSmcpowers * Common Development and Distribution License (the "License"). 68047c9fbSmcpowers * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 229b009fc1SValerie Bubb Fenwick * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. 237c478bd9Sstevel@tonic-gate */ 247c478bd9Sstevel@tonic-gate 257c478bd9Sstevel@tonic-gate #ifndef _SYS_CRYPTO_IMPL_H 267c478bd9Sstevel@tonic-gate #define _SYS_CRYPTO_IMPL_H 277c478bd9Sstevel@tonic-gate 287c478bd9Sstevel@tonic-gate /* 297c478bd9Sstevel@tonic-gate * Kernel Cryptographic Framework private implementation definitions. 307c478bd9Sstevel@tonic-gate */ 317c478bd9Sstevel@tonic-gate 327c478bd9Sstevel@tonic-gate #include <sys/types.h> 337c478bd9Sstevel@tonic-gate #include <sys/param.h> 347c478bd9Sstevel@tonic-gate 357c478bd9Sstevel@tonic-gate #ifdef _KERNEL 367c478bd9Sstevel@tonic-gate #include <sys/crypto/common.h> 377c478bd9Sstevel@tonic-gate #include <sys/crypto/api.h> 387c478bd9Sstevel@tonic-gate #include <sys/crypto/spi.h> 397c478bd9Sstevel@tonic-gate #include <sys/crypto/ioctl.h> 407c478bd9Sstevel@tonic-gate #include <sys/tnf_probe.h> 417c478bd9Sstevel@tonic-gate #include <sys/atomic.h> 427c478bd9Sstevel@tonic-gate #include <sys/project.h> 437c478bd9Sstevel@tonic-gate #include <sys/taskq.h> 447c478bd9Sstevel@tonic-gate #include <sys/rctl.h> 45ef56a3c5SKrishna Yenduri #include <sys/cpuvar.h> 467c478bd9Sstevel@tonic-gate #endif /* _KERNEL */ 477c478bd9Sstevel@tonic-gate 487c478bd9Sstevel@tonic-gate #ifdef __cplusplus 497c478bd9Sstevel@tonic-gate extern "C" { 507c478bd9Sstevel@tonic-gate #endif 517c478bd9Sstevel@tonic-gate 527c478bd9Sstevel@tonic-gate #ifdef _KERNEL 537c478bd9Sstevel@tonic-gate 547c478bd9Sstevel@tonic-gate /* 557c478bd9Sstevel@tonic-gate * Prefixes convention: structures internal to the kernel cryptographic 567c478bd9Sstevel@tonic-gate * framework start with 'kcf_'. Exposed structure start with 'crypto_'. 577c478bd9Sstevel@tonic-gate */ 587c478bd9Sstevel@tonic-gate 597c478bd9Sstevel@tonic-gate /* Provider stats. Not protected. */ 607c478bd9Sstevel@tonic-gate typedef struct kcf_prov_stats { 617c478bd9Sstevel@tonic-gate kstat_named_t ps_ops_total; 627c478bd9Sstevel@tonic-gate kstat_named_t ps_ops_passed; 637c478bd9Sstevel@tonic-gate kstat_named_t ps_ops_failed; 647c478bd9Sstevel@tonic-gate kstat_named_t ps_ops_busy_rval; 657c478bd9Sstevel@tonic-gate } kcf_prov_stats_t; 667c478bd9Sstevel@tonic-gate 677c478bd9Sstevel@tonic-gate /* Various kcf stats. Not protected. */ 687c478bd9Sstevel@tonic-gate typedef struct kcf_stats { 697c478bd9Sstevel@tonic-gate kstat_named_t ks_thrs_in_pool; 707c478bd9Sstevel@tonic-gate kstat_named_t ks_idle_thrs; 717c478bd9Sstevel@tonic-gate kstat_named_t ks_minthrs; 727c478bd9Sstevel@tonic-gate kstat_named_t ks_maxthrs; 737c478bd9Sstevel@tonic-gate kstat_named_t ks_swq_njobs; 747c478bd9Sstevel@tonic-gate kstat_named_t ks_swq_maxjobs; 75c41e7ccaSkrishna kstat_named_t ks_taskq_threads; 767c478bd9Sstevel@tonic-gate kstat_named_t ks_taskq_minalloc; 777c478bd9Sstevel@tonic-gate kstat_named_t ks_taskq_maxalloc; 787c478bd9Sstevel@tonic-gate } kcf_stats_t; 797c478bd9Sstevel@tonic-gate 80ef56a3c5SKrishna Yenduri #define CPU_SEQID (CPU->cpu_seqid) 81ef56a3c5SKrishna Yenduri 82ef56a3c5SKrishna Yenduri typedef struct kcf_lock_withpad { 83ef56a3c5SKrishna Yenduri kmutex_t kl_lock; 84ef56a3c5SKrishna Yenduri uint8_t kl_pad[64 - sizeof (kmutex_t)]; 85ef56a3c5SKrishna Yenduri } kcf_lock_withpad_t; 86ef56a3c5SKrishna Yenduri 877c478bd9Sstevel@tonic-gate /* 88ef56a3c5SKrishna Yenduri * Per-CPU structure used by a provider to keep track of 89ef56a3c5SKrishna Yenduri * various counters. 907c478bd9Sstevel@tonic-gate */ 91ef56a3c5SKrishna Yenduri typedef struct kcf_prov_cpu { 92ef56a3c5SKrishna Yenduri kmutex_t kp_lock; 93ef56a3c5SKrishna Yenduri int kp_holdcnt; /* can go negative! */ 94ef56a3c5SKrishna Yenduri uint_t kp_jobcnt; 957c478bd9Sstevel@tonic-gate 96ef56a3c5SKrishna Yenduri uint64_t kp_ndispatches; 97ef56a3c5SKrishna Yenduri uint64_t kp_nfails; 98ef56a3c5SKrishna Yenduri uint64_t kp_nbusy_rval; 99ef56a3c5SKrishna Yenduri kcondvar_t kp_cv; 1007c478bd9Sstevel@tonic-gate 101ef56a3c5SKrishna Yenduri uint8_t kp_pad[64 - sizeof (kmutex_t) - 2 * sizeof (int) - 102ef56a3c5SKrishna Yenduri 3 * sizeof (uint64_t) - sizeof (kcondvar_t)]; 103ef56a3c5SKrishna Yenduri } kcf_prov_cpu_t; 1047c478bd9Sstevel@tonic-gate 105c41e7ccaSkrishna /* 106ef56a3c5SKrishna Yenduri * kcf_get_refcnt(pd) is the number of inflight requests to the 107ef56a3c5SKrishna Yenduri * provider. So, it is a good measure of the load on a provider when 108ef56a3c5SKrishna Yenduri * it is not in a busy state. Once a provider notifies it is busy, requests 109c41e7ccaSkrishna * backup in the taskq. So, we use tq_nalloc in that case which gives 110c41e7ccaSkrishna * the number of task entries in the task queue. Note that we do not 111c41e7ccaSkrishna * acquire any locks here as it is not critical to get the exact number 112ef56a3c5SKrishna Yenduri * and the lock contention is too costly for this code path. 113c41e7ccaSkrishna */ 114c41e7ccaSkrishna #define KCF_PROV_LOAD(pd) ((pd)->pd_state != KCF_PROV_BUSY ? \ 115ef56a3c5SKrishna Yenduri kcf_get_refcnt(pd, B_FALSE) : (pd)->pd_taskq->tq_nalloc) 1167c478bd9Sstevel@tonic-gate 1177c478bd9Sstevel@tonic-gate 1187c478bd9Sstevel@tonic-gate /* 1197c478bd9Sstevel@tonic-gate * The following two macros should be 1207c478bd9Sstevel@tonic-gate * #define KCF_OPS_CLASSSIZE (KCF_LAST_OPSCLASS - KCF_FIRST_OPSCLASS + 2) 1217c478bd9Sstevel@tonic-gate * #define KCF_MAXMECHTAB KCF_MAXCIPHER 1227c478bd9Sstevel@tonic-gate * 1237c478bd9Sstevel@tonic-gate * However, doing that would involve reorganizing the header file a bit. 1247c478bd9Sstevel@tonic-gate * When impl.h is broken up (bug# 4703218), this will be done. For now, 1257c478bd9Sstevel@tonic-gate * we hardcode these values. 1267c478bd9Sstevel@tonic-gate */ 1277c478bd9Sstevel@tonic-gate #define KCF_OPS_CLASSSIZE 8 1287c478bd9Sstevel@tonic-gate #define KCF_MAXMECHTAB 32 1297c478bd9Sstevel@tonic-gate 1307c478bd9Sstevel@tonic-gate /* 1317c478bd9Sstevel@tonic-gate * Valid values for the state of a provider. The order of 1327c478bd9Sstevel@tonic-gate * the elements is important. 1337c478bd9Sstevel@tonic-gate * 1347c478bd9Sstevel@tonic-gate * Routines which get a provider or the list of providers 1357c478bd9Sstevel@tonic-gate * should pick only those that are either in KCF_PROV_READY state 1367c478bd9Sstevel@tonic-gate * or in KCF_PROV_BUSY state. 1377c478bd9Sstevel@tonic-gate */ 1387c478bd9Sstevel@tonic-gate typedef enum { 1397c478bd9Sstevel@tonic-gate KCF_PROV_ALLOCATED = 1, 1407c478bd9Sstevel@tonic-gate KCF_PROV_UNVERIFIED, 14173556491SAnthony Scarpino KCF_PROV_UNVERIFIED_FIPS140, 142fe2f7468Skrishna KCF_PROV_VERIFICATION_FAILED, 1437c478bd9Sstevel@tonic-gate /* 1447c478bd9Sstevel@tonic-gate * state < KCF_PROV_READY means the provider can not 1457c478bd9Sstevel@tonic-gate * be used at all. 1467c478bd9Sstevel@tonic-gate */ 1477c478bd9Sstevel@tonic-gate KCF_PROV_READY, 1487c478bd9Sstevel@tonic-gate KCF_PROV_BUSY, 1497c478bd9Sstevel@tonic-gate /* 1507c478bd9Sstevel@tonic-gate * state > KCF_PROV_BUSY means the provider can not 1517c478bd9Sstevel@tonic-gate * be used for new requests. 1527c478bd9Sstevel@tonic-gate */ 1537c478bd9Sstevel@tonic-gate KCF_PROV_FAILED, 1547c478bd9Sstevel@tonic-gate /* 1557c478bd9Sstevel@tonic-gate * Threads setting the following two states should do so only 1567c478bd9Sstevel@tonic-gate * if the current state < KCF_PROV_DISABLED. 1577c478bd9Sstevel@tonic-gate */ 1587c478bd9Sstevel@tonic-gate KCF_PROV_DISABLED, 159ef56a3c5SKrishna Yenduri KCF_PROV_UNREGISTERING, 160ef56a3c5SKrishna Yenduri KCF_PROV_UNREGISTERED 1617c478bd9Sstevel@tonic-gate } kcf_prov_state_t; 1627c478bd9Sstevel@tonic-gate 1637c478bd9Sstevel@tonic-gate #define KCF_IS_PROV_UNVERIFIED(pd) ((pd)->pd_state == KCF_PROV_UNVERIFIED) 1647c478bd9Sstevel@tonic-gate #define KCF_IS_PROV_USABLE(pd) ((pd)->pd_state == KCF_PROV_READY || \ 1657c478bd9Sstevel@tonic-gate (pd)->pd_state == KCF_PROV_BUSY) 166ef56a3c5SKrishna Yenduri #define KCF_IS_PROV_REMOVED(pd) ((pd)->pd_state >= KCF_PROV_UNREGISTERING) 1677c478bd9Sstevel@tonic-gate 1686a1073f8Skrishna /* Internal flags valid for pd_flags field */ 1696a1073f8Skrishna #define KCF_LPROV_MEMBER 0x80000000 /* is member of a logical provider */ 170c892ebf1Skrishna 171c892ebf1Skrishna /* 1727c478bd9Sstevel@tonic-gate * A provider descriptor structure. There is one such structure per 1737c478bd9Sstevel@tonic-gate * provider. It is allocated and initialized at registration time and 1747c478bd9Sstevel@tonic-gate * freed when the provider unregisters. 1757c478bd9Sstevel@tonic-gate * 1767c478bd9Sstevel@tonic-gate * pd_prov_type: Provider type, hardware or software 1776a1073f8Skrishna * pd_sid: Session ID of the provider used by kernel clients. 1786a1073f8Skrishna * This is valid only for session-oriented providers. 179ef56a3c5SKrishna Yenduri * pd_taskq: taskq used to dispatch crypto requests 180ef56a3c5SKrishna Yenduri * pd_nbins: number of bins in pd_percpu_bins 181ef56a3c5SKrishna Yenduri * pd_percpu_bins: Pointer to an array of per-CPU structures 182ef56a3c5SKrishna Yenduri * containing a lock, a cv and various counters. 1836a1073f8Skrishna * pd_lock: lock protects pd_state and pd_provider_list 1846a1073f8Skrishna * pd_state: State value of the provider 1856a1073f8Skrishna * pd_provider_list: Used to cross-reference logical providers and their 1866a1073f8Skrishna * members. Not used for software providers. 1876a1073f8Skrishna * pd_resume_cv: cv to wait for state to change from KCF_PROV_BUSY 1886a1073f8Skrishna * pd_prov_handle: Provider handle specified by provider 1896a1073f8Skrishna * pd_ops_vector: The ops vector specified by Provider 1906a1073f8Skrishna * pd_mech_indx: Lookup table which maps a core framework mechanism 1916a1073f8Skrishna * number to an index in pd_mechanisms array 1926a1073f8Skrishna * pd_mechanisms: Array of mechanisms supported by the provider, specified 1936a1073f8Skrishna * by the provider during registration 1946a1073f8Skrishna * pd_mech_list_count: The number of entries in pi_mechanisms, specified 1956a1073f8Skrishna * by the provider during registration 1967c478bd9Sstevel@tonic-gate * pd_name: Device name or module name 1977c478bd9Sstevel@tonic-gate * pd_instance: Device instance 1987c478bd9Sstevel@tonic-gate * pd_module_id: Module ID returned by modload 1997c478bd9Sstevel@tonic-gate * pd_mctlp: Pointer to modctl structure for this provider 2006a1073f8Skrishna * pd_description: Provider description string 201ef56a3c5SKrishna Yenduri * pd_flags: bitwise OR of pi_flags from crypto_provider_info_t 202ba5f469cSkrishna * and other internal flags defined above. 203ef56a3c5SKrishna Yenduri * pd_hash_limit: Maximum data size that hash mechanisms of this provider 204ba5f469cSkrishna * can support. 2054df55fdeSJanie Lu * pd_hmac_limit: Maximum data size that HMAC mechanisms of this provider 2064df55fdeSJanie Lu * can support. 2076a1073f8Skrishna * pd_kcf_prov_handle: KCF-private handle assigned by KCF 2086a1073f8Skrishna * pd_prov_id: Identification # assigned by KCF to provider 2096a1073f8Skrishna * pd_kstat: kstat associated with the provider 2106a1073f8Skrishna * pd_ks_data: kstat data 2117c478bd9Sstevel@tonic-gate */ 2127c478bd9Sstevel@tonic-gate typedef struct kcf_provider_desc { 2137c478bd9Sstevel@tonic-gate crypto_provider_type_t pd_prov_type; 2146a1073f8Skrishna crypto_session_id_t pd_sid; 215ef56a3c5SKrishna Yenduri taskq_t *pd_taskq; 216ef56a3c5SKrishna Yenduri uint_t pd_nbins; 217ef56a3c5SKrishna Yenduri kcf_prov_cpu_t *pd_percpu_bins; 2186a1073f8Skrishna kmutex_t pd_lock; 2196a1073f8Skrishna kcf_prov_state_t pd_state; 2206a1073f8Skrishna struct kcf_provider_list *pd_provider_list; 2216a1073f8Skrishna kcondvar_t pd_resume_cv; 2226a1073f8Skrishna crypto_provider_handle_t pd_prov_handle; 2236a1073f8Skrishna crypto_ops_t *pd_ops_vector; 2246a1073f8Skrishna ushort_t pd_mech_indx[KCF_OPS_CLASSSIZE]\ 2256a1073f8Skrishna [KCF_MAXMECHTAB]; 2266a1073f8Skrishna crypto_mech_info_t *pd_mechanisms; 2276a1073f8Skrishna uint_t pd_mech_list_count; 2287c478bd9Sstevel@tonic-gate char *pd_name; 2297c478bd9Sstevel@tonic-gate uint_t pd_instance; 2307c478bd9Sstevel@tonic-gate int pd_module_id; 2317c478bd9Sstevel@tonic-gate struct modctl *pd_mctlp; 2326a1073f8Skrishna char *pd_description; 233894b2776Smcpowers uint_t pd_flags; 234ba5f469cSkrishna uint_t pd_hash_limit; 2354df55fdeSJanie Lu uint_t pd_hmac_limit; 2366a1073f8Skrishna crypto_kcf_provider_handle_t pd_kcf_prov_handle; 2376a1073f8Skrishna crypto_provider_id_t pd_prov_id; 2386a1073f8Skrishna kstat_t *pd_kstat; 2396a1073f8Skrishna kcf_prov_stats_t pd_ks_data; 2407c478bd9Sstevel@tonic-gate } kcf_provider_desc_t; 2417c478bd9Sstevel@tonic-gate 2427c478bd9Sstevel@tonic-gate /* useful for making a list of providers */ 2437c478bd9Sstevel@tonic-gate typedef struct kcf_provider_list { 2447c478bd9Sstevel@tonic-gate struct kcf_provider_list *pl_next; 2457c478bd9Sstevel@tonic-gate struct kcf_provider_desc *pl_provider; 2467c478bd9Sstevel@tonic-gate } kcf_provider_list_t; 2477c478bd9Sstevel@tonic-gate 2487c478bd9Sstevel@tonic-gate /* 2497c478bd9Sstevel@tonic-gate * If a component has a reference to a kcf_provider_desc_t, 2507c478bd9Sstevel@tonic-gate * it REFHOLD()s. A new provider descriptor which is referenced only 2517c478bd9Sstevel@tonic-gate * by the providers table has a reference counter of one. 2527c478bd9Sstevel@tonic-gate */ 2537c478bd9Sstevel@tonic-gate #define KCF_PROV_REFHOLD(desc) { \ 254ef56a3c5SKrishna Yenduri kcf_prov_cpu_t *mp; \ 255ef56a3c5SKrishna Yenduri \ 256ef56a3c5SKrishna Yenduri mp = &((desc)->pd_percpu_bins[CPU_SEQID]); \ 257ef56a3c5SKrishna Yenduri mutex_enter(&mp->kp_lock); \ 258ef56a3c5SKrishna Yenduri mp->kp_holdcnt++; \ 259ef56a3c5SKrishna Yenduri mutex_exit(&mp->kp_lock); \ 2607c478bd9Sstevel@tonic-gate } 2617c478bd9Sstevel@tonic-gate 2627c478bd9Sstevel@tonic-gate #define KCF_PROV_REFRELE(desc) { \ 263ef56a3c5SKrishna Yenduri kcf_prov_cpu_t *mp; \ 264ef56a3c5SKrishna Yenduri \ 265ef56a3c5SKrishna Yenduri mp = &((desc)->pd_percpu_bins[CPU_SEQID]); \ 266ef56a3c5SKrishna Yenduri mutex_enter(&mp->kp_lock); \ 267ef56a3c5SKrishna Yenduri mp->kp_holdcnt--; \ 268ef56a3c5SKrishna Yenduri mutex_exit(&mp->kp_lock); \ 2697c478bd9Sstevel@tonic-gate } 2707c478bd9Sstevel@tonic-gate 271ef56a3c5SKrishna Yenduri #define KCF_PROV_REFHELD(desc) (kcf_get_refcnt(desc, B_TRUE) >= 1) 272ef56a3c5SKrishna Yenduri 273ef56a3c5SKrishna Yenduri /* 274ef56a3c5SKrishna Yenduri * The JOB macros are used only for a hardware provider. 275ef56a3c5SKrishna Yenduri * Hardware providers can have holds that stay forever. 276ef56a3c5SKrishna Yenduri * So, the job counter is used to check if it is safe to 277ef56a3c5SKrishna Yenduri * unregister a provider. 278ef56a3c5SKrishna Yenduri */ 279ef56a3c5SKrishna Yenduri #define KCF_PROV_JOB_HOLD(mp) { \ 280ef56a3c5SKrishna Yenduri mutex_enter(&(mp)->kp_lock); \ 281ef56a3c5SKrishna Yenduri (mp)->kp_jobcnt++; \ 282ef56a3c5SKrishna Yenduri mutex_exit(&(mp)->kp_lock); \ 283ef56a3c5SKrishna Yenduri } 284ef56a3c5SKrishna Yenduri 285ef56a3c5SKrishna Yenduri #define KCF_PROV_JOB_RELE(mp) { \ 286ef56a3c5SKrishna Yenduri mutex_enter(&(mp)->kp_lock); \ 287ef56a3c5SKrishna Yenduri (mp)->kp_jobcnt--; \ 288ef56a3c5SKrishna Yenduri if ((mp)->kp_jobcnt == 0) \ 289ef56a3c5SKrishna Yenduri cv_signal(&(mp)->kp_cv); \ 290ef56a3c5SKrishna Yenduri mutex_exit(&(mp)->kp_lock); \ 291ef56a3c5SKrishna Yenduri } 292ef56a3c5SKrishna Yenduri 293ef56a3c5SKrishna Yenduri #define KCF_PROV_JOB_RELE_STAT(mp, doincr) { \ 294ef56a3c5SKrishna Yenduri if (doincr) \ 295ef56a3c5SKrishna Yenduri (mp)->kp_nfails++; \ 296ef56a3c5SKrishna Yenduri KCF_PROV_JOB_RELE(mp); \ 297ef56a3c5SKrishna Yenduri } 298ef56a3c5SKrishna Yenduri 299ef56a3c5SKrishna Yenduri #define KCF_PROV_INCRSTATS(pd, error) { \ 300ef56a3c5SKrishna Yenduri kcf_prov_cpu_t *mp; \ 301ef56a3c5SKrishna Yenduri \ 302ef56a3c5SKrishna Yenduri mp = &((pd)->pd_percpu_bins[CPU_SEQID]); \ 303ef56a3c5SKrishna Yenduri mp->kp_ndispatches++; \ 304ef56a3c5SKrishna Yenduri if ((error) == CRYPTO_BUSY) \ 305ef56a3c5SKrishna Yenduri mp->kp_nbusy_rval++; \ 306ef56a3c5SKrishna Yenduri else if ((error) != CRYPTO_SUCCESS && (error) != CRYPTO_QUEUED) \ 307ef56a3c5SKrishna Yenduri mp->kp_nfails++; \ 308ef56a3c5SKrishna Yenduri } 3097c478bd9Sstevel@tonic-gate 3107c478bd9Sstevel@tonic-gate /* list of crypto_mech_info_t valid as the second mech in a dual operation */ 3117c478bd9Sstevel@tonic-gate 3127c478bd9Sstevel@tonic-gate typedef struct crypto_mech_info_list { 3137c478bd9Sstevel@tonic-gate struct crypto_mech_info_list *ml_next; 3147c478bd9Sstevel@tonic-gate crypto_mech_type_t ml_kcf_mechid; /* KCF's id */ 3157c478bd9Sstevel@tonic-gate crypto_mech_info_t ml_mech_info; 3167c478bd9Sstevel@tonic-gate } crypto_mech_info_list_t; 3177c478bd9Sstevel@tonic-gate 3187c478bd9Sstevel@tonic-gate /* 3197c478bd9Sstevel@tonic-gate * An element in a mechanism provider descriptors chain. 3207c478bd9Sstevel@tonic-gate * The kcf_prov_mech_desc_t is duplicated in every chain the provider belongs 3217c478bd9Sstevel@tonic-gate * to. This is a small tradeoff memory vs mutex spinning time to access the 3227c478bd9Sstevel@tonic-gate * common provider field. 3237c478bd9Sstevel@tonic-gate */ 3247c478bd9Sstevel@tonic-gate 3257c478bd9Sstevel@tonic-gate typedef struct kcf_prov_mech_desc { 3267c478bd9Sstevel@tonic-gate struct kcf_mech_entry *pm_me; /* Back to the head */ 3277c478bd9Sstevel@tonic-gate struct kcf_prov_mech_desc *pm_next; /* Next in the chain */ 3287c478bd9Sstevel@tonic-gate crypto_mech_info_t pm_mech_info; /* Provider mech info */ 3297c478bd9Sstevel@tonic-gate crypto_mech_info_list_t *pm_mi_list; /* list for duals */ 3307c478bd9Sstevel@tonic-gate kcf_provider_desc_t *pm_prov_desc; /* Common desc. */ 3317c478bd9Sstevel@tonic-gate } kcf_prov_mech_desc_t; 3327c478bd9Sstevel@tonic-gate 3337c478bd9Sstevel@tonic-gate /* and the notation shortcuts ... */ 3347c478bd9Sstevel@tonic-gate #define pm_provider_type pm_prov_desc.pd_provider_type 3357c478bd9Sstevel@tonic-gate #define pm_provider_handle pm_prov_desc.pd_provider_handle 3367c478bd9Sstevel@tonic-gate #define pm_ops_vector pm_prov_desc.pd_ops_vector 3377c478bd9Sstevel@tonic-gate 338ef56a3c5SKrishna Yenduri extern kcf_lock_withpad_t *me_mutexes; 3397c478bd9Sstevel@tonic-gate 340fa626f0cSkrishna #define KCF_CPU_PAD (128 - sizeof (crypto_mech_name_t) - \ 3416f3f1c68Skrishna sizeof (crypto_mech_type_t) - \ 342ef56a3c5SKrishna Yenduri 2 * sizeof (kcf_prov_mech_desc_t *) - \ 343fa626f0cSkrishna sizeof (int) - sizeof (uint32_t) - sizeof (size_t)) 344fa626f0cSkrishna 3457c478bd9Sstevel@tonic-gate /* 346fa626f0cSkrishna * A mechanism entry in an xxx_mech_tab[]. KCF_CPU_PAD needs 347fa626f0cSkrishna * to be adjusted if this structure is changed. 3487c478bd9Sstevel@tonic-gate */ 3497c478bd9Sstevel@tonic-gate typedef struct kcf_mech_entry { 3507c478bd9Sstevel@tonic-gate crypto_mech_name_t me_name; /* mechanism name */ 3516f3f1c68Skrishna crypto_mech_type_t me_mechid; /* Internal id for mechanism */ 3527c478bd9Sstevel@tonic-gate kcf_prov_mech_desc_t *me_hw_prov_chain; /* list of HW providers */ 3537c478bd9Sstevel@tonic-gate kcf_prov_mech_desc_t *me_sw_prov; /* SW provider */ 3547c478bd9Sstevel@tonic-gate /* 3557c478bd9Sstevel@tonic-gate * Number of HW providers in the chain. There is only one 3567c478bd9Sstevel@tonic-gate * SW provider. So, we need only a count of HW providers. 3577c478bd9Sstevel@tonic-gate */ 3587c478bd9Sstevel@tonic-gate int me_num_hwprov; 3597c478bd9Sstevel@tonic-gate /* 3607c478bd9Sstevel@tonic-gate * When a SW provider is present, this is the generation number that 3617c478bd9Sstevel@tonic-gate * ensures no objects from old SW providers are used in the new one 3627c478bd9Sstevel@tonic-gate */ 3637c478bd9Sstevel@tonic-gate uint32_t me_gen_swprov; 3647c478bd9Sstevel@tonic-gate /* 3657c478bd9Sstevel@tonic-gate * threshold for using hardware providers for this mech 3667c478bd9Sstevel@tonic-gate */ 3677c478bd9Sstevel@tonic-gate size_t me_threshold; 368fa626f0cSkrishna uint8_t me_pad[KCF_CPU_PAD]; 3697c478bd9Sstevel@tonic-gate } kcf_mech_entry_t; 3707c478bd9Sstevel@tonic-gate 3717c478bd9Sstevel@tonic-gate /* 3727c478bd9Sstevel@tonic-gate * A policy descriptor structure. It is allocated and initialized 3737c478bd9Sstevel@tonic-gate * when administrative ioctls load disabled mechanisms. 3747c478bd9Sstevel@tonic-gate * 3757c478bd9Sstevel@tonic-gate * pd_prov_type: Provider type, hardware or software 3767c478bd9Sstevel@tonic-gate * pd_name: Device name or module name. 3777c478bd9Sstevel@tonic-gate * pd_instance: Device instance. 3787c478bd9Sstevel@tonic-gate * pd_refcnt: Reference counter for this policy descriptor 3797c478bd9Sstevel@tonic-gate * pd_mutex: Protects array and count of disabled mechanisms. 3807c478bd9Sstevel@tonic-gate * pd_disabled_count: Count of disabled mechanisms. 3817c478bd9Sstevel@tonic-gate * pd_disabled_mechs: Array of disabled mechanisms. 3827c478bd9Sstevel@tonic-gate */ 3837c478bd9Sstevel@tonic-gate typedef struct kcf_policy_desc { 3847c478bd9Sstevel@tonic-gate crypto_provider_type_t pd_prov_type; 3857c478bd9Sstevel@tonic-gate char *pd_name; 3867c478bd9Sstevel@tonic-gate uint_t pd_instance; 3877c478bd9Sstevel@tonic-gate uint_t pd_refcnt; 3887c478bd9Sstevel@tonic-gate kmutex_t pd_mutex; 3897c478bd9Sstevel@tonic-gate uint_t pd_disabled_count; 3907c478bd9Sstevel@tonic-gate crypto_mech_name_t *pd_disabled_mechs; 3917c478bd9Sstevel@tonic-gate } kcf_policy_desc_t; 3927c478bd9Sstevel@tonic-gate 3937c478bd9Sstevel@tonic-gate /* 3947c478bd9Sstevel@tonic-gate * If a component has a reference to a kcf_policy_desc_t, 3957c478bd9Sstevel@tonic-gate * it REFHOLD()s. A new policy descriptor which is referenced only 3967c478bd9Sstevel@tonic-gate * by the policy table has a reference count of one. 3977c478bd9Sstevel@tonic-gate */ 3987c478bd9Sstevel@tonic-gate #define KCF_POLICY_REFHOLD(desc) { \ 399*1a5e258fSJosef 'Jeff' Sipek atomic_inc_32(&(desc)->pd_refcnt); \ 4007c478bd9Sstevel@tonic-gate ASSERT((desc)->pd_refcnt != 0); \ 4017c478bd9Sstevel@tonic-gate } 4027c478bd9Sstevel@tonic-gate 4037c478bd9Sstevel@tonic-gate /* 4047c478bd9Sstevel@tonic-gate * Releases a reference to a policy descriptor. When the last 4057c478bd9Sstevel@tonic-gate * reference is released, the descriptor is freed. 4067c478bd9Sstevel@tonic-gate */ 4077c478bd9Sstevel@tonic-gate #define KCF_POLICY_REFRELE(desc) { \ 4087c478bd9Sstevel@tonic-gate ASSERT((desc)->pd_refcnt != 0); \ 4097c478bd9Sstevel@tonic-gate membar_exit(); \ 410*1a5e258fSJosef 'Jeff' Sipek if (atomic_dec_32_nv(&(desc)->pd_refcnt) == 0) \ 4117c478bd9Sstevel@tonic-gate kcf_policy_free_desc(desc); \ 4127c478bd9Sstevel@tonic-gate } 4137c478bd9Sstevel@tonic-gate 4147c478bd9Sstevel@tonic-gate /* 4157c478bd9Sstevel@tonic-gate * This entry stores the name of a software module and its 4167c478bd9Sstevel@tonic-gate * mechanisms. The mechanisms are 'hints' that are used to 4177c478bd9Sstevel@tonic-gate * trigger loading of the module. 4187c478bd9Sstevel@tonic-gate */ 4197c478bd9Sstevel@tonic-gate typedef struct kcf_soft_conf_entry { 4207c478bd9Sstevel@tonic-gate struct kcf_soft_conf_entry *ce_next; 4217c478bd9Sstevel@tonic-gate char *ce_name; 4227c478bd9Sstevel@tonic-gate crypto_mech_name_t *ce_mechs; 4237c478bd9Sstevel@tonic-gate uint_t ce_count; 4247c478bd9Sstevel@tonic-gate } kcf_soft_conf_entry_t; 4257c478bd9Sstevel@tonic-gate 4267c478bd9Sstevel@tonic-gate extern kmutex_t soft_config_mutex; 4277c478bd9Sstevel@tonic-gate extern kcf_soft_conf_entry_t *soft_config_list; 4287c478bd9Sstevel@tonic-gate 4297c478bd9Sstevel@tonic-gate /* 4307c478bd9Sstevel@tonic-gate * Global tables. The sizes are from the predefined PKCS#11 v2.20 mechanisms, 4317c478bd9Sstevel@tonic-gate * with a margin of few extra empty entry points 4327c478bd9Sstevel@tonic-gate */ 4337c478bd9Sstevel@tonic-gate 4347c478bd9Sstevel@tonic-gate #define KCF_MAXDIGEST 16 /* Digests */ 4357c478bd9Sstevel@tonic-gate #define KCF_MAXCIPHER 64 /* Ciphers */ 4367c478bd9Sstevel@tonic-gate #define KCF_MAXMAC 40 /* Message authentication codes */ 4377c478bd9Sstevel@tonic-gate #define KCF_MAXSIGN 24 /* Sign/Verify */ 4387c478bd9Sstevel@tonic-gate #define KCF_MAXKEYOPS 116 /* Key generation and derivation */ 4397c478bd9Sstevel@tonic-gate #define KCF_MAXMISC 16 /* Others ... */ 4407c478bd9Sstevel@tonic-gate 4417c478bd9Sstevel@tonic-gate #define KCF_MAXMECHS KCF_MAXDIGEST + KCF_MAXCIPHER + KCF_MAXMAC + \ 4427c478bd9Sstevel@tonic-gate KCF_MAXSIGN + KCF_MAXKEYOPS + \ 4437c478bd9Sstevel@tonic-gate KCF_MAXMISC 4447c478bd9Sstevel@tonic-gate 4457c478bd9Sstevel@tonic-gate extern kcf_mech_entry_t kcf_digest_mechs_tab[]; 4467c478bd9Sstevel@tonic-gate extern kcf_mech_entry_t kcf_cipher_mechs_tab[]; 4477c478bd9Sstevel@tonic-gate extern kcf_mech_entry_t kcf_mac_mechs_tab[]; 4487c478bd9Sstevel@tonic-gate extern kcf_mech_entry_t kcf_sign_mechs_tab[]; 4497c478bd9Sstevel@tonic-gate extern kcf_mech_entry_t kcf_keyops_mechs_tab[]; 4507c478bd9Sstevel@tonic-gate extern kcf_mech_entry_t kcf_misc_mechs_tab[]; 4517c478bd9Sstevel@tonic-gate 4527c478bd9Sstevel@tonic-gate extern kmutex_t kcf_mech_tabs_lock; 4537c478bd9Sstevel@tonic-gate 4547c478bd9Sstevel@tonic-gate typedef enum { 4557c478bd9Sstevel@tonic-gate KCF_DIGEST_CLASS = 1, 4567c478bd9Sstevel@tonic-gate KCF_CIPHER_CLASS, 4577c478bd9Sstevel@tonic-gate KCF_MAC_CLASS, 4587c478bd9Sstevel@tonic-gate KCF_SIGN_CLASS, 4597c478bd9Sstevel@tonic-gate KCF_KEYOPS_CLASS, 4607c478bd9Sstevel@tonic-gate KCF_MISC_CLASS 4617c478bd9Sstevel@tonic-gate } kcf_ops_class_t; 4627c478bd9Sstevel@tonic-gate 4637c478bd9Sstevel@tonic-gate #define KCF_FIRST_OPSCLASS KCF_DIGEST_CLASS 4647c478bd9Sstevel@tonic-gate #define KCF_LAST_OPSCLASS KCF_MISC_CLASS 4657c478bd9Sstevel@tonic-gate 4667c478bd9Sstevel@tonic-gate /* The table of all the kcf_xxx_mech_tab[]s, indexed by kcf_ops_class */ 4677c478bd9Sstevel@tonic-gate 4687c478bd9Sstevel@tonic-gate typedef struct kcf_mech_entry_tab { 4697c478bd9Sstevel@tonic-gate int met_size; /* Size of the met_tab[] */ 4707c478bd9Sstevel@tonic-gate kcf_mech_entry_t *met_tab; /* the table */ 4717c478bd9Sstevel@tonic-gate } kcf_mech_entry_tab_t; 4727c478bd9Sstevel@tonic-gate 4737c478bd9Sstevel@tonic-gate extern kcf_mech_entry_tab_t kcf_mech_tabs_tab[]; 4747c478bd9Sstevel@tonic-gate 4757c478bd9Sstevel@tonic-gate #define KCF_MECHID(class, index) \ 4767c478bd9Sstevel@tonic-gate (((crypto_mech_type_t)(class) << 32) | (crypto_mech_type_t)(index)) 4777c478bd9Sstevel@tonic-gate 4787c478bd9Sstevel@tonic-gate #define KCF_MECH2CLASS(mech_type) ((kcf_ops_class_t)((mech_type) >> 32)) 4797c478bd9Sstevel@tonic-gate 4807c478bd9Sstevel@tonic-gate #define KCF_MECH2INDEX(mech_type) ((int)(mech_type)) 4817c478bd9Sstevel@tonic-gate 4826a1073f8Skrishna #define KCF_TO_PROV_MECH_INDX(pd, mech_type) \ 4836a1073f8Skrishna ((pd)->pd_mech_indx[KCF_MECH2CLASS(mech_type)] \ 4846a1073f8Skrishna [KCF_MECH2INDEX(mech_type)]) 4856a1073f8Skrishna 4866a1073f8Skrishna #define KCF_TO_PROV_MECHINFO(pd, mech_type) \ 4876a1073f8Skrishna ((pd)->pd_mechanisms[KCF_TO_PROV_MECH_INDX(pd, mech_type)]) 4886a1073f8Skrishna 4896a1073f8Skrishna #define KCF_TO_PROV_MECHNUM(pd, mech_type) \ 4906a1073f8Skrishna (KCF_TO_PROV_MECHINFO(pd, mech_type).cm_mech_number) 4916a1073f8Skrishna 4926a1073f8Skrishna #define KCF_CAN_SHARE_OPSTATE(pd, mech_type) \ 4936a1073f8Skrishna ((KCF_TO_PROV_MECHINFO(pd, mech_type).cm_mech_flags) & \ 4946a1073f8Skrishna CRYPTO_CAN_SHARE_OPSTATE) 4956a1073f8Skrishna 4967c478bd9Sstevel@tonic-gate /* ps_refcnt is protected by cm_lock in the crypto_minor structure */ 4977c478bd9Sstevel@tonic-gate typedef struct crypto_provider_session { 4987c478bd9Sstevel@tonic-gate struct crypto_provider_session *ps_next; 4997c478bd9Sstevel@tonic-gate crypto_session_id_t ps_session; 5007c478bd9Sstevel@tonic-gate kcf_provider_desc_t *ps_provider; 5017c478bd9Sstevel@tonic-gate kcf_provider_desc_t *ps_real_provider; 5027c478bd9Sstevel@tonic-gate uint_t ps_refcnt; 5037c478bd9Sstevel@tonic-gate } crypto_provider_session_t; 5047c478bd9Sstevel@tonic-gate 5057c478bd9Sstevel@tonic-gate typedef struct crypto_session_data { 5067c478bd9Sstevel@tonic-gate kmutex_t sd_lock; 5077c478bd9Sstevel@tonic-gate kcondvar_t sd_cv; 5087c478bd9Sstevel@tonic-gate uint32_t sd_flags; 5092d794da1Skrishna int sd_pre_approved_amount; 5107c478bd9Sstevel@tonic-gate crypto_ctx_t *sd_digest_ctx; 5117c478bd9Sstevel@tonic-gate crypto_ctx_t *sd_encr_ctx; 5127c478bd9Sstevel@tonic-gate crypto_ctx_t *sd_decr_ctx; 5137c478bd9Sstevel@tonic-gate crypto_ctx_t *sd_sign_ctx; 5147c478bd9Sstevel@tonic-gate crypto_ctx_t *sd_verify_ctx; 5157c478bd9Sstevel@tonic-gate crypto_ctx_t *sd_sign_recover_ctx; 5167c478bd9Sstevel@tonic-gate crypto_ctx_t *sd_verify_recover_ctx; 5177c478bd9Sstevel@tonic-gate kcf_provider_desc_t *sd_provider; 5187c478bd9Sstevel@tonic-gate void *sd_find_init_cookie; 5197c478bd9Sstevel@tonic-gate crypto_provider_session_t *sd_provider_session; 5207c478bd9Sstevel@tonic-gate } crypto_session_data_t; 5217c478bd9Sstevel@tonic-gate 5227c478bd9Sstevel@tonic-gate #define CRYPTO_SESSION_IN_USE 0x00000001 5237c478bd9Sstevel@tonic-gate #define CRYPTO_SESSION_IS_BUSY 0x00000002 5247c478bd9Sstevel@tonic-gate #define CRYPTO_SESSION_IS_CLOSED 0x00000004 5257c478bd9Sstevel@tonic-gate 5267c478bd9Sstevel@tonic-gate #define KCF_MAX_PIN_LEN 1024 5277c478bd9Sstevel@tonic-gate 5287c478bd9Sstevel@tonic-gate /* 5297c478bd9Sstevel@tonic-gate * Per-minor info. 5307c478bd9Sstevel@tonic-gate * 5317c478bd9Sstevel@tonic-gate * cm_lock protects everything in this structure except for cm_refcnt. 5327c478bd9Sstevel@tonic-gate */ 5337c478bd9Sstevel@tonic-gate typedef struct crypto_minor { 5347c478bd9Sstevel@tonic-gate uint_t cm_refcnt; 5357c478bd9Sstevel@tonic-gate kmutex_t cm_lock; 5367c478bd9Sstevel@tonic-gate kcondvar_t cm_cv; 5377c478bd9Sstevel@tonic-gate crypto_session_data_t **cm_session_table; 5387c478bd9Sstevel@tonic-gate uint_t cm_session_table_count; 5397c478bd9Sstevel@tonic-gate kcf_provider_desc_t **cm_provider_array; 5407c478bd9Sstevel@tonic-gate uint_t cm_provider_count; 5417c478bd9Sstevel@tonic-gate crypto_provider_session_t *cm_provider_session; 5427c478bd9Sstevel@tonic-gate } crypto_minor_t; 5437c478bd9Sstevel@tonic-gate 5447c478bd9Sstevel@tonic-gate /* resource control framework handle used by /dev/crypto */ 5457c478bd9Sstevel@tonic-gate extern rctl_hndl_t rc_project_crypto_mem; 5467c478bd9Sstevel@tonic-gate /* 5477c478bd9Sstevel@tonic-gate * Return codes for internal functions 5487c478bd9Sstevel@tonic-gate */ 5497c478bd9Sstevel@tonic-gate #define KCF_SUCCESS 0x0 /* Successful call */ 5507c478bd9Sstevel@tonic-gate #define KCF_INVALID_MECH_NUMBER 0x1 /* invalid mechanism number */ 5517c478bd9Sstevel@tonic-gate #define KCF_INVALID_MECH_NAME 0x2 /* invalid mechanism name */ 5527c478bd9Sstevel@tonic-gate #define KCF_INVALID_MECH_CLASS 0x3 /* invalid mechanism class */ 5537c478bd9Sstevel@tonic-gate #define KCF_MECH_TAB_FULL 0x4 /* Need more room in the mech tabs. */ 5546a1073f8Skrishna #define KCF_INVALID_INDX ((ushort_t)-1) 5557c478bd9Sstevel@tonic-gate 5567c478bd9Sstevel@tonic-gate /* 5577c478bd9Sstevel@tonic-gate * kCF internal mechanism and function group for tracking RNG providers. 5587c478bd9Sstevel@tonic-gate */ 5597c478bd9Sstevel@tonic-gate #define SUN_RANDOM "random" 5607c478bd9Sstevel@tonic-gate #define CRYPTO_FG_RANDOM 0x80000000 /* generate_random() */ 5617c478bd9Sstevel@tonic-gate 5627c478bd9Sstevel@tonic-gate /* 5637c478bd9Sstevel@tonic-gate * Wrappers for ops vectors. In the wrapper definitions below, the pd 5647c478bd9Sstevel@tonic-gate * argument always corresponds to a pointer to a provider descriptor 5657c478bd9Sstevel@tonic-gate * of type kcf_prov_desc_t. 5667c478bd9Sstevel@tonic-gate */ 5677c478bd9Sstevel@tonic-gate 568894b2776Smcpowers #define KCF_PROV_CONTROL_OPS(pd) ((pd)->pd_ops_vector->co_control_ops) 569894b2776Smcpowers #define KCF_PROV_CTX_OPS(pd) ((pd)->pd_ops_vector->co_ctx_ops) 570894b2776Smcpowers #define KCF_PROV_DIGEST_OPS(pd) ((pd)->pd_ops_vector->co_digest_ops) 571894b2776Smcpowers #define KCF_PROV_CIPHER_OPS(pd) ((pd)->pd_ops_vector->co_cipher_ops) 572894b2776Smcpowers #define KCF_PROV_MAC_OPS(pd) ((pd)->pd_ops_vector->co_mac_ops) 573894b2776Smcpowers #define KCF_PROV_SIGN_OPS(pd) ((pd)->pd_ops_vector->co_sign_ops) 574894b2776Smcpowers #define KCF_PROV_VERIFY_OPS(pd) ((pd)->pd_ops_vector->co_verify_ops) 575894b2776Smcpowers #define KCF_PROV_DUAL_OPS(pd) ((pd)->pd_ops_vector->co_dual_ops) 5767c478bd9Sstevel@tonic-gate #define KCF_PROV_DUAL_CIPHER_MAC_OPS(pd) \ 577894b2776Smcpowers ((pd)->pd_ops_vector->co_dual_cipher_mac_ops) 578894b2776Smcpowers #define KCF_PROV_RANDOM_OPS(pd) ((pd)->pd_ops_vector->co_random_ops) 579894b2776Smcpowers #define KCF_PROV_SESSION_OPS(pd) ((pd)->pd_ops_vector->co_session_ops) 580894b2776Smcpowers #define KCF_PROV_OBJECT_OPS(pd) ((pd)->pd_ops_vector->co_object_ops) 581894b2776Smcpowers #define KCF_PROV_KEY_OPS(pd) ((pd)->pd_ops_vector->co_key_ops) 582894b2776Smcpowers #define KCF_PROV_PROVIDER_OPS(pd) ((pd)->pd_ops_vector->co_provider_ops) 583894b2776Smcpowers #define KCF_PROV_MECH_OPS(pd) ((pd)->pd_ops_vector->co_mech_ops) 584034448feSmcpowers #define KCF_PROV_NOSTORE_KEY_OPS(pd) \ 585034448feSmcpowers ((pd)->pd_ops_vector->co_nostore_key_ops) 58673556491SAnthony Scarpino #define KCF_PROV_FIPS140_OPS(pd) ((pd)->pd_ops_vector->co_fips140_ops) 5874df55fdeSJanie Lu #define KCF_PROV_PROVMGMT_OPS(pd) ((pd)->pd_ops_vector->co_provider_ops) 5887c478bd9Sstevel@tonic-gate 5897c478bd9Sstevel@tonic-gate /* 5907c478bd9Sstevel@tonic-gate * Wrappers for crypto_control_ops(9S) entry points. 5917c478bd9Sstevel@tonic-gate */ 5927c478bd9Sstevel@tonic-gate 5937c478bd9Sstevel@tonic-gate #define KCF_PROV_STATUS(pd, status) ( \ 5947c478bd9Sstevel@tonic-gate (KCF_PROV_CONTROL_OPS(pd) && \ 5957c478bd9Sstevel@tonic-gate KCF_PROV_CONTROL_OPS(pd)->provider_status) ? \ 5967c478bd9Sstevel@tonic-gate KCF_PROV_CONTROL_OPS(pd)->provider_status( \ 5977c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, status) : \ 5987c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 5997c478bd9Sstevel@tonic-gate 6007c478bd9Sstevel@tonic-gate /* 6017c478bd9Sstevel@tonic-gate * Wrappers for crypto_ctx_ops(9S) entry points. 6027c478bd9Sstevel@tonic-gate */ 6037c478bd9Sstevel@tonic-gate 6047c478bd9Sstevel@tonic-gate #define KCF_PROV_CREATE_CTX_TEMPLATE(pd, mech, key, template, size, req) ( \ 6057c478bd9Sstevel@tonic-gate (KCF_PROV_CTX_OPS(pd) && KCF_PROV_CTX_OPS(pd)->create_ctx_template) ? \ 6067c478bd9Sstevel@tonic-gate KCF_PROV_CTX_OPS(pd)->create_ctx_template( \ 6077c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, mech, key, template, size, req) : \ 6087c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 6097c478bd9Sstevel@tonic-gate 6107c478bd9Sstevel@tonic-gate #define KCF_PROV_FREE_CONTEXT(pd, ctx) ( \ 6117c478bd9Sstevel@tonic-gate (KCF_PROV_CTX_OPS(pd) && KCF_PROV_CTX_OPS(pd)->free_context) ? \ 6127c478bd9Sstevel@tonic-gate KCF_PROV_CTX_OPS(pd)->free_context(ctx) : CRYPTO_NOT_SUPPORTED) 6137c478bd9Sstevel@tonic-gate 614894b2776Smcpowers #define KCF_PROV_COPYIN_MECH(pd, umech, kmech, errorp, mode) ( \ 615894b2776Smcpowers (KCF_PROV_MECH_OPS(pd) && KCF_PROV_MECH_OPS(pd)->copyin_mechanism) ? \ 616894b2776Smcpowers KCF_PROV_MECH_OPS(pd)->copyin_mechanism( \ 617894b2776Smcpowers (pd)->pd_prov_handle, umech, kmech, errorp, mode) : \ 618894b2776Smcpowers CRYPTO_NOT_SUPPORTED) 619894b2776Smcpowers 620894b2776Smcpowers #define KCF_PROV_COPYOUT_MECH(pd, kmech, umech, errorp, mode) ( \ 621894b2776Smcpowers (KCF_PROV_MECH_OPS(pd) && KCF_PROV_MECH_OPS(pd)->copyout_mechanism) ? \ 622894b2776Smcpowers KCF_PROV_MECH_OPS(pd)->copyout_mechanism( \ 623894b2776Smcpowers (pd)->pd_prov_handle, kmech, umech, errorp, mode) : \ 624894b2776Smcpowers CRYPTO_NOT_SUPPORTED) 625894b2776Smcpowers 626894b2776Smcpowers #define KCF_PROV_FREE_MECH(pd, prov_mech) ( \ 627894b2776Smcpowers (KCF_PROV_MECH_OPS(pd) && KCF_PROV_MECH_OPS(pd)->free_mechanism) ? \ 628894b2776Smcpowers KCF_PROV_MECH_OPS(pd)->free_mechanism( \ 629894b2776Smcpowers (pd)->pd_prov_handle, prov_mech) : CRYPTO_NOT_SUPPORTED) 630894b2776Smcpowers 6317c478bd9Sstevel@tonic-gate /* 6327c478bd9Sstevel@tonic-gate * Wrappers for crypto_digest_ops(9S) entry points. 6337c478bd9Sstevel@tonic-gate */ 6347c478bd9Sstevel@tonic-gate 6357c478bd9Sstevel@tonic-gate #define KCF_PROV_DIGEST_INIT(pd, ctx, mech, req) ( \ 6367c478bd9Sstevel@tonic-gate (KCF_PROV_DIGEST_OPS(pd) && KCF_PROV_DIGEST_OPS(pd)->digest_init) ? \ 6377c478bd9Sstevel@tonic-gate KCF_PROV_DIGEST_OPS(pd)->digest_init(ctx, mech, req) : \ 6387c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 6397c478bd9Sstevel@tonic-gate 6407c478bd9Sstevel@tonic-gate /* 6417c478bd9Sstevel@tonic-gate * The _ (underscore) in _digest is needed to avoid replacing the 6427c478bd9Sstevel@tonic-gate * function digest(). 6437c478bd9Sstevel@tonic-gate */ 6447c478bd9Sstevel@tonic-gate #define KCF_PROV_DIGEST(pd, ctx, data, _digest, req) ( \ 6457c478bd9Sstevel@tonic-gate (KCF_PROV_DIGEST_OPS(pd) && KCF_PROV_DIGEST_OPS(pd)->digest) ? \ 6467c478bd9Sstevel@tonic-gate KCF_PROV_DIGEST_OPS(pd)->digest(ctx, data, _digest, req) : \ 6477c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 6487c478bd9Sstevel@tonic-gate 6497c478bd9Sstevel@tonic-gate #define KCF_PROV_DIGEST_UPDATE(pd, ctx, data, req) ( \ 6507c478bd9Sstevel@tonic-gate (KCF_PROV_DIGEST_OPS(pd) && KCF_PROV_DIGEST_OPS(pd)->digest_update) ? \ 6517c478bd9Sstevel@tonic-gate KCF_PROV_DIGEST_OPS(pd)->digest_update(ctx, data, req) : \ 6527c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 6537c478bd9Sstevel@tonic-gate 6547c478bd9Sstevel@tonic-gate #define KCF_PROV_DIGEST_KEY(pd, ctx, key, req) ( \ 6557c478bd9Sstevel@tonic-gate (KCF_PROV_DIGEST_OPS(pd) && KCF_PROV_DIGEST_OPS(pd)->digest_key) ? \ 6567c478bd9Sstevel@tonic-gate KCF_PROV_DIGEST_OPS(pd)->digest_key(ctx, key, req) : \ 6577c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 6587c478bd9Sstevel@tonic-gate 6597c478bd9Sstevel@tonic-gate #define KCF_PROV_DIGEST_FINAL(pd, ctx, digest, req) ( \ 6607c478bd9Sstevel@tonic-gate (KCF_PROV_DIGEST_OPS(pd) && KCF_PROV_DIGEST_OPS(pd)->digest_final) ? \ 6617c478bd9Sstevel@tonic-gate KCF_PROV_DIGEST_OPS(pd)->digest_final(ctx, digest, req) : \ 6627c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 6637c478bd9Sstevel@tonic-gate 6647c478bd9Sstevel@tonic-gate #define KCF_PROV_DIGEST_ATOMIC(pd, session, mech, data, digest, req) ( \ 6657c478bd9Sstevel@tonic-gate (KCF_PROV_DIGEST_OPS(pd) && KCF_PROV_DIGEST_OPS(pd)->digest_atomic) ? \ 6667c478bd9Sstevel@tonic-gate KCF_PROV_DIGEST_OPS(pd)->digest_atomic( \ 6677c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, mech, data, digest, req) : \ 6687c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 6697c478bd9Sstevel@tonic-gate 6707c478bd9Sstevel@tonic-gate /* 6717c478bd9Sstevel@tonic-gate * Wrappers for crypto_cipher_ops(9S) entry points. 6727c478bd9Sstevel@tonic-gate */ 6737c478bd9Sstevel@tonic-gate 6747c478bd9Sstevel@tonic-gate #define KCF_PROV_ENCRYPT_INIT(pd, ctx, mech, key, template, req) ( \ 6757c478bd9Sstevel@tonic-gate (KCF_PROV_CIPHER_OPS(pd) && KCF_PROV_CIPHER_OPS(pd)->encrypt_init) ? \ 6767c478bd9Sstevel@tonic-gate KCF_PROV_CIPHER_OPS(pd)->encrypt_init(ctx, mech, key, template, \ 6777c478bd9Sstevel@tonic-gate req) : \ 6787c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 6797c478bd9Sstevel@tonic-gate 6807c478bd9Sstevel@tonic-gate #define KCF_PROV_ENCRYPT(pd, ctx, plaintext, ciphertext, req) ( \ 6817c478bd9Sstevel@tonic-gate (KCF_PROV_CIPHER_OPS(pd) && KCF_PROV_CIPHER_OPS(pd)->encrypt) ? \ 6827c478bd9Sstevel@tonic-gate KCF_PROV_CIPHER_OPS(pd)->encrypt(ctx, plaintext, ciphertext, req) : \ 6837c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 6847c478bd9Sstevel@tonic-gate 6857c478bd9Sstevel@tonic-gate #define KCF_PROV_ENCRYPT_UPDATE(pd, ctx, plaintext, ciphertext, req) ( \ 6867c478bd9Sstevel@tonic-gate (KCF_PROV_CIPHER_OPS(pd) && KCF_PROV_CIPHER_OPS(pd)->encrypt_update) ? \ 6877c478bd9Sstevel@tonic-gate KCF_PROV_CIPHER_OPS(pd)->encrypt_update(ctx, plaintext, \ 6887c478bd9Sstevel@tonic-gate ciphertext, req) : \ 6897c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 6907c478bd9Sstevel@tonic-gate 6917c478bd9Sstevel@tonic-gate #define KCF_PROV_ENCRYPT_FINAL(pd, ctx, ciphertext, req) ( \ 6927c478bd9Sstevel@tonic-gate (KCF_PROV_CIPHER_OPS(pd) && KCF_PROV_CIPHER_OPS(pd)->encrypt_final) ? \ 6937c478bd9Sstevel@tonic-gate KCF_PROV_CIPHER_OPS(pd)->encrypt_final(ctx, ciphertext, req) : \ 6947c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 6957c478bd9Sstevel@tonic-gate 6967c478bd9Sstevel@tonic-gate #define KCF_PROV_ENCRYPT_ATOMIC(pd, session, mech, key, plaintext, ciphertext, \ 6977c478bd9Sstevel@tonic-gate template, req) ( \ 6987c478bd9Sstevel@tonic-gate (KCF_PROV_CIPHER_OPS(pd) && KCF_PROV_CIPHER_OPS(pd)->encrypt_atomic) ? \ 6997c478bd9Sstevel@tonic-gate KCF_PROV_CIPHER_OPS(pd)->encrypt_atomic( \ 7007c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, mech, key, plaintext, ciphertext, \ 7017c478bd9Sstevel@tonic-gate template, req) : \ 7027c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7037c478bd9Sstevel@tonic-gate 7047c478bd9Sstevel@tonic-gate #define KCF_PROV_DECRYPT_INIT(pd, ctx, mech, key, template, req) ( \ 7057c478bd9Sstevel@tonic-gate (KCF_PROV_CIPHER_OPS(pd) && KCF_PROV_CIPHER_OPS(pd)->decrypt_init) ? \ 7067c478bd9Sstevel@tonic-gate KCF_PROV_CIPHER_OPS(pd)->decrypt_init(ctx, mech, key, template, \ 7077c478bd9Sstevel@tonic-gate req) : \ 7087c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7097c478bd9Sstevel@tonic-gate 7107c478bd9Sstevel@tonic-gate #define KCF_PROV_DECRYPT(pd, ctx, ciphertext, plaintext, req) ( \ 7117c478bd9Sstevel@tonic-gate (KCF_PROV_CIPHER_OPS(pd) && KCF_PROV_CIPHER_OPS(pd)->decrypt) ? \ 7127c478bd9Sstevel@tonic-gate KCF_PROV_CIPHER_OPS(pd)->decrypt(ctx, ciphertext, plaintext, req) : \ 7137c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7147c478bd9Sstevel@tonic-gate 7157c478bd9Sstevel@tonic-gate #define KCF_PROV_DECRYPT_UPDATE(pd, ctx, ciphertext, plaintext, req) ( \ 7167c478bd9Sstevel@tonic-gate (KCF_PROV_CIPHER_OPS(pd) && KCF_PROV_CIPHER_OPS(pd)->decrypt_update) ? \ 7177c478bd9Sstevel@tonic-gate KCF_PROV_CIPHER_OPS(pd)->decrypt_update(ctx, ciphertext, \ 7187c478bd9Sstevel@tonic-gate plaintext, req) : \ 7197c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7207c478bd9Sstevel@tonic-gate 7217c478bd9Sstevel@tonic-gate #define KCF_PROV_DECRYPT_FINAL(pd, ctx, plaintext, req) ( \ 7227c478bd9Sstevel@tonic-gate (KCF_PROV_CIPHER_OPS(pd) && KCF_PROV_CIPHER_OPS(pd)->decrypt_final) ? \ 7237c478bd9Sstevel@tonic-gate KCF_PROV_CIPHER_OPS(pd)->decrypt_final(ctx, plaintext, req) : \ 7247c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7257c478bd9Sstevel@tonic-gate 7267c478bd9Sstevel@tonic-gate #define KCF_PROV_DECRYPT_ATOMIC(pd, session, mech, key, ciphertext, plaintext, \ 7277c478bd9Sstevel@tonic-gate template, req) ( \ 7287c478bd9Sstevel@tonic-gate (KCF_PROV_CIPHER_OPS(pd) && KCF_PROV_CIPHER_OPS(pd)->decrypt_atomic) ? \ 7297c478bd9Sstevel@tonic-gate KCF_PROV_CIPHER_OPS(pd)->decrypt_atomic( \ 7307c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, mech, key, ciphertext, plaintext, \ 7317c478bd9Sstevel@tonic-gate template, req) : \ 7327c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7337c478bd9Sstevel@tonic-gate 7347c478bd9Sstevel@tonic-gate /* 7357c478bd9Sstevel@tonic-gate * Wrappers for crypto_mac_ops(9S) entry points. 7367c478bd9Sstevel@tonic-gate */ 7377c478bd9Sstevel@tonic-gate 7387c478bd9Sstevel@tonic-gate #define KCF_PROV_MAC_INIT(pd, ctx, mech, key, template, req) ( \ 7397c478bd9Sstevel@tonic-gate (KCF_PROV_MAC_OPS(pd) && KCF_PROV_MAC_OPS(pd)->mac_init) ? \ 7407c478bd9Sstevel@tonic-gate KCF_PROV_MAC_OPS(pd)->mac_init(ctx, mech, key, template, req) \ 7417c478bd9Sstevel@tonic-gate : CRYPTO_NOT_SUPPORTED) 7427c478bd9Sstevel@tonic-gate 7437c478bd9Sstevel@tonic-gate /* 7447c478bd9Sstevel@tonic-gate * The _ (underscore) in _mac is needed to avoid replacing the 7457c478bd9Sstevel@tonic-gate * function mac(). 7467c478bd9Sstevel@tonic-gate */ 7477c478bd9Sstevel@tonic-gate #define KCF_PROV_MAC(pd, ctx, data, _mac, req) ( \ 7487c478bd9Sstevel@tonic-gate (KCF_PROV_MAC_OPS(pd) && KCF_PROV_MAC_OPS(pd)->mac) ? \ 7497c478bd9Sstevel@tonic-gate KCF_PROV_MAC_OPS(pd)->mac(ctx, data, _mac, req) : \ 7507c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7517c478bd9Sstevel@tonic-gate 7527c478bd9Sstevel@tonic-gate #define KCF_PROV_MAC_UPDATE(pd, ctx, data, req) ( \ 7537c478bd9Sstevel@tonic-gate (KCF_PROV_MAC_OPS(pd) && KCF_PROV_MAC_OPS(pd)->mac_update) ? \ 7547c478bd9Sstevel@tonic-gate KCF_PROV_MAC_OPS(pd)->mac_update(ctx, data, req) : \ 7557c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7567c478bd9Sstevel@tonic-gate 7577c478bd9Sstevel@tonic-gate #define KCF_PROV_MAC_FINAL(pd, ctx, mac, req) ( \ 7587c478bd9Sstevel@tonic-gate (KCF_PROV_MAC_OPS(pd) && KCF_PROV_MAC_OPS(pd)->mac_final) ? \ 7597c478bd9Sstevel@tonic-gate KCF_PROV_MAC_OPS(pd)->mac_final(ctx, mac, req) : \ 7607c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7617c478bd9Sstevel@tonic-gate 7627c478bd9Sstevel@tonic-gate #define KCF_PROV_MAC_ATOMIC(pd, session, mech, key, data, mac, template, \ 7637c478bd9Sstevel@tonic-gate req) ( \ 7647c478bd9Sstevel@tonic-gate (KCF_PROV_MAC_OPS(pd) && KCF_PROV_MAC_OPS(pd)->mac_atomic) ? \ 7657c478bd9Sstevel@tonic-gate KCF_PROV_MAC_OPS(pd)->mac_atomic( \ 7667c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, mech, key, data, mac, template, \ 7677c478bd9Sstevel@tonic-gate req) : \ 7687c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7697c478bd9Sstevel@tonic-gate 7707c478bd9Sstevel@tonic-gate #define KCF_PROV_MAC_VERIFY_ATOMIC(pd, session, mech, key, data, mac, \ 7717c478bd9Sstevel@tonic-gate template, req) ( \ 7727c478bd9Sstevel@tonic-gate (KCF_PROV_MAC_OPS(pd) && KCF_PROV_MAC_OPS(pd)->mac_verify_atomic) ? \ 7737c478bd9Sstevel@tonic-gate KCF_PROV_MAC_OPS(pd)->mac_verify_atomic( \ 7747c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, mech, key, data, mac, template, \ 7757c478bd9Sstevel@tonic-gate req) : \ 7767c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7777c478bd9Sstevel@tonic-gate 7787c478bd9Sstevel@tonic-gate /* 7797c478bd9Sstevel@tonic-gate * Wrappers for crypto_sign_ops(9S) entry points. 7807c478bd9Sstevel@tonic-gate */ 7817c478bd9Sstevel@tonic-gate 7827c478bd9Sstevel@tonic-gate #define KCF_PROV_SIGN_INIT(pd, ctx, mech, key, template, req) ( \ 7837c478bd9Sstevel@tonic-gate (KCF_PROV_SIGN_OPS(pd) && KCF_PROV_SIGN_OPS(pd)->sign_init) ? \ 7847c478bd9Sstevel@tonic-gate KCF_PROV_SIGN_OPS(pd)->sign_init( \ 7857c478bd9Sstevel@tonic-gate ctx, mech, key, template, req) : CRYPTO_NOT_SUPPORTED) 7867c478bd9Sstevel@tonic-gate 7877c478bd9Sstevel@tonic-gate #define KCF_PROV_SIGN(pd, ctx, data, sig, req) ( \ 7887c478bd9Sstevel@tonic-gate (KCF_PROV_SIGN_OPS(pd) && KCF_PROV_SIGN_OPS(pd)->sign) ? \ 7897c478bd9Sstevel@tonic-gate KCF_PROV_SIGN_OPS(pd)->sign(ctx, data, sig, req) : \ 7907c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7917c478bd9Sstevel@tonic-gate 7927c478bd9Sstevel@tonic-gate #define KCF_PROV_SIGN_UPDATE(pd, ctx, data, req) ( \ 7937c478bd9Sstevel@tonic-gate (KCF_PROV_SIGN_OPS(pd) && KCF_PROV_SIGN_OPS(pd)->sign_update) ? \ 7947c478bd9Sstevel@tonic-gate KCF_PROV_SIGN_OPS(pd)->sign_update(ctx, data, req) : \ 7957c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 7967c478bd9Sstevel@tonic-gate 7977c478bd9Sstevel@tonic-gate #define KCF_PROV_SIGN_FINAL(pd, ctx, sig, req) ( \ 7987c478bd9Sstevel@tonic-gate (KCF_PROV_SIGN_OPS(pd) && KCF_PROV_SIGN_OPS(pd)->sign_final) ? \ 7997c478bd9Sstevel@tonic-gate KCF_PROV_SIGN_OPS(pd)->sign_final(ctx, sig, req) : \ 8007c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 8017c478bd9Sstevel@tonic-gate 8027c478bd9Sstevel@tonic-gate #define KCF_PROV_SIGN_ATOMIC(pd, session, mech, key, data, template, \ 8037c478bd9Sstevel@tonic-gate sig, req) ( \ 8047c478bd9Sstevel@tonic-gate (KCF_PROV_SIGN_OPS(pd) && KCF_PROV_SIGN_OPS(pd)->sign_atomic) ? \ 8057c478bd9Sstevel@tonic-gate KCF_PROV_SIGN_OPS(pd)->sign_atomic( \ 8067c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, mech, key, data, sig, template, \ 8077c478bd9Sstevel@tonic-gate req) : CRYPTO_NOT_SUPPORTED) 8087c478bd9Sstevel@tonic-gate 8097c478bd9Sstevel@tonic-gate #define KCF_PROV_SIGN_RECOVER_INIT(pd, ctx, mech, key, template, \ 8107c478bd9Sstevel@tonic-gate req) ( \ 8117c478bd9Sstevel@tonic-gate (KCF_PROV_SIGN_OPS(pd) && KCF_PROV_SIGN_OPS(pd)->sign_recover_init) ? \ 8127c478bd9Sstevel@tonic-gate KCF_PROV_SIGN_OPS(pd)->sign_recover_init(ctx, mech, key, template, \ 8137c478bd9Sstevel@tonic-gate req) : CRYPTO_NOT_SUPPORTED) 8147c478bd9Sstevel@tonic-gate 8157c478bd9Sstevel@tonic-gate #define KCF_PROV_SIGN_RECOVER(pd, ctx, data, sig, req) ( \ 8167c478bd9Sstevel@tonic-gate (KCF_PROV_SIGN_OPS(pd) && KCF_PROV_SIGN_OPS(pd)->sign_recover) ? \ 8177c478bd9Sstevel@tonic-gate KCF_PROV_SIGN_OPS(pd)->sign_recover(ctx, data, sig, req) : \ 8187c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 8197c478bd9Sstevel@tonic-gate 8207c478bd9Sstevel@tonic-gate #define KCF_PROV_SIGN_RECOVER_ATOMIC(pd, session, mech, key, data, template, \ 8217c478bd9Sstevel@tonic-gate sig, req) ( \ 8227c478bd9Sstevel@tonic-gate (KCF_PROV_SIGN_OPS(pd) && \ 8237c478bd9Sstevel@tonic-gate KCF_PROV_SIGN_OPS(pd)->sign_recover_atomic) ? \ 8247c478bd9Sstevel@tonic-gate KCF_PROV_SIGN_OPS(pd)->sign_recover_atomic( \ 8257c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, mech, key, data, sig, template, \ 8267c478bd9Sstevel@tonic-gate req) : CRYPTO_NOT_SUPPORTED) 8277c478bd9Sstevel@tonic-gate 8287c478bd9Sstevel@tonic-gate /* 8297c478bd9Sstevel@tonic-gate * Wrappers for crypto_verify_ops(9S) entry points. 8307c478bd9Sstevel@tonic-gate */ 8317c478bd9Sstevel@tonic-gate 8327c478bd9Sstevel@tonic-gate #define KCF_PROV_VERIFY_INIT(pd, ctx, mech, key, template, req) ( \ 8337c478bd9Sstevel@tonic-gate (KCF_PROV_VERIFY_OPS(pd) && KCF_PROV_VERIFY_OPS(pd)->verify_init) ? \ 8347c478bd9Sstevel@tonic-gate KCF_PROV_VERIFY_OPS(pd)->verify_init(ctx, mech, key, template, \ 8357c478bd9Sstevel@tonic-gate req) : CRYPTO_NOT_SUPPORTED) 8367c478bd9Sstevel@tonic-gate 8377c478bd9Sstevel@tonic-gate #define KCF_PROV_VERIFY(pd, ctx, data, sig, req) ( \ 8387c478bd9Sstevel@tonic-gate (KCF_PROV_VERIFY_OPS(pd) && KCF_PROV_VERIFY_OPS(pd)->verify) ? \ 8397c478bd9Sstevel@tonic-gate KCF_PROV_VERIFY_OPS(pd)->verify(ctx, data, sig, req) : \ 8407c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 8417c478bd9Sstevel@tonic-gate 8427c478bd9Sstevel@tonic-gate #define KCF_PROV_VERIFY_UPDATE(pd, ctx, data, req) ( \ 8437c478bd9Sstevel@tonic-gate (KCF_PROV_VERIFY_OPS(pd) && KCF_PROV_VERIFY_OPS(pd)->verify_update) ? \ 8447c478bd9Sstevel@tonic-gate KCF_PROV_VERIFY_OPS(pd)->verify_update(ctx, data, req) : \ 8457c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 8467c478bd9Sstevel@tonic-gate 8477c478bd9Sstevel@tonic-gate #define KCF_PROV_VERIFY_FINAL(pd, ctx, sig, req) ( \ 8487c478bd9Sstevel@tonic-gate (KCF_PROV_VERIFY_OPS(pd) && KCF_PROV_VERIFY_OPS(pd)->verify_final) ? \ 8497c478bd9Sstevel@tonic-gate KCF_PROV_VERIFY_OPS(pd)->verify_final(ctx, sig, req) : \ 8507c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 8517c478bd9Sstevel@tonic-gate 8527c478bd9Sstevel@tonic-gate #define KCF_PROV_VERIFY_ATOMIC(pd, session, mech, key, data, template, sig, \ 8537c478bd9Sstevel@tonic-gate req) ( \ 8547c478bd9Sstevel@tonic-gate (KCF_PROV_VERIFY_OPS(pd) && KCF_PROV_VERIFY_OPS(pd)->verify_atomic) ? \ 8557c478bd9Sstevel@tonic-gate KCF_PROV_VERIFY_OPS(pd)->verify_atomic( \ 8567c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, mech, key, data, sig, template, \ 8577c478bd9Sstevel@tonic-gate req) : CRYPTO_NOT_SUPPORTED) 8587c478bd9Sstevel@tonic-gate 8597c478bd9Sstevel@tonic-gate #define KCF_PROV_VERIFY_RECOVER_INIT(pd, ctx, mech, key, template, \ 8607c478bd9Sstevel@tonic-gate req) ( \ 8617c478bd9Sstevel@tonic-gate (KCF_PROV_VERIFY_OPS(pd) && \ 8627c478bd9Sstevel@tonic-gate KCF_PROV_VERIFY_OPS(pd)->verify_recover_init) ? \ 8637c478bd9Sstevel@tonic-gate KCF_PROV_VERIFY_OPS(pd)->verify_recover_init(ctx, mech, key, \ 8647c478bd9Sstevel@tonic-gate template, req) : CRYPTO_NOT_SUPPORTED) 8657c478bd9Sstevel@tonic-gate 8667c478bd9Sstevel@tonic-gate /* verify_recover() CSPI routine has different argument order than verify() */ 8677c478bd9Sstevel@tonic-gate #define KCF_PROV_VERIFY_RECOVER(pd, ctx, sig, data, req) ( \ 8687c478bd9Sstevel@tonic-gate (KCF_PROV_VERIFY_OPS(pd) && KCF_PROV_VERIFY_OPS(pd)->verify_recover) ? \ 8697c478bd9Sstevel@tonic-gate KCF_PROV_VERIFY_OPS(pd)->verify_recover(ctx, sig, data, req) : \ 8707c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 8717c478bd9Sstevel@tonic-gate 8727c478bd9Sstevel@tonic-gate /* 8737c478bd9Sstevel@tonic-gate * verify_recover_atomic() CSPI routine has different argument order 8747c478bd9Sstevel@tonic-gate * than verify_atomic(). 8757c478bd9Sstevel@tonic-gate */ 8767c478bd9Sstevel@tonic-gate #define KCF_PROV_VERIFY_RECOVER_ATOMIC(pd, session, mech, key, sig, \ 8777c478bd9Sstevel@tonic-gate template, data, req) ( \ 8787c478bd9Sstevel@tonic-gate (KCF_PROV_VERIFY_OPS(pd) && \ 8797c478bd9Sstevel@tonic-gate KCF_PROV_VERIFY_OPS(pd)->verify_recover_atomic) ? \ 8807c478bd9Sstevel@tonic-gate KCF_PROV_VERIFY_OPS(pd)->verify_recover_atomic( \ 8817c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, mech, key, sig, data, template, \ 8827c478bd9Sstevel@tonic-gate req) : CRYPTO_NOT_SUPPORTED) 8837c478bd9Sstevel@tonic-gate 8847c478bd9Sstevel@tonic-gate /* 8857c478bd9Sstevel@tonic-gate * Wrappers for crypto_dual_ops(9S) entry points. 8867c478bd9Sstevel@tonic-gate */ 8877c478bd9Sstevel@tonic-gate 8887c478bd9Sstevel@tonic-gate #define KCF_PROV_DIGEST_ENCRYPT_UPDATE(digest_ctx, encrypt_ctx, plaintext, \ 8897c478bd9Sstevel@tonic-gate ciphertext, req) ( \ 8907c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_OPS(pd) && \ 8917c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_OPS(pd)->digest_encrypt_update) ? \ 8927c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_OPS(pd)->digest_encrypt_update( \ 8937c478bd9Sstevel@tonic-gate digest_ctx, encrypt_ctx, plaintext, ciphertext, req) : \ 8947c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 8957c478bd9Sstevel@tonic-gate 8967c478bd9Sstevel@tonic-gate #define KCF_PROV_DECRYPT_DIGEST_UPDATE(decrypt_ctx, digest_ctx, ciphertext, \ 8977c478bd9Sstevel@tonic-gate plaintext, req) ( \ 8987c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_OPS(pd) && \ 8997c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_OPS(pd)->decrypt_digest_update) ? \ 9007c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_OPS(pd)->decrypt_digest_update( \ 9017c478bd9Sstevel@tonic-gate decrypt_ctx, digest_ctx, ciphertext, plaintext, req) : \ 9027c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 9037c478bd9Sstevel@tonic-gate 9047c478bd9Sstevel@tonic-gate #define KCF_PROV_SIGN_ENCRYPT_UPDATE(sign_ctx, encrypt_ctx, plaintext, \ 9057c478bd9Sstevel@tonic-gate ciphertext, req) ( \ 9067c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_OPS(pd) && \ 9077c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_OPS(pd)->sign_encrypt_update) ? \ 9087c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_OPS(pd)->sign_encrypt_update( \ 9097c478bd9Sstevel@tonic-gate sign_ctx, encrypt_ctx, plaintext, ciphertext, req) : \ 9107c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 9117c478bd9Sstevel@tonic-gate 9127c478bd9Sstevel@tonic-gate #define KCF_PROV_DECRYPT_VERIFY_UPDATE(decrypt_ctx, verify_ctx, ciphertext, \ 9137c478bd9Sstevel@tonic-gate plaintext, req) ( \ 9147c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_OPS(pd) && \ 9157c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_OPS(pd)->decrypt_verify_update) ? \ 9167c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_OPS(pd)->decrypt_verify_update( \ 9177c478bd9Sstevel@tonic-gate decrypt_ctx, verify_ctx, ciphertext, plaintext, req) : \ 9187c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 9197c478bd9Sstevel@tonic-gate 9207c478bd9Sstevel@tonic-gate /* 9217c478bd9Sstevel@tonic-gate * Wrappers for crypto_dual_cipher_mac_ops(9S) entry points. 9227c478bd9Sstevel@tonic-gate */ 9237c478bd9Sstevel@tonic-gate 9247c478bd9Sstevel@tonic-gate #define KCF_PROV_ENCRYPT_MAC_INIT(pd, ctx, encr_mech, encr_key, mac_mech, \ 9257c478bd9Sstevel@tonic-gate mac_key, encr_ctx_template, mac_ctx_template, req) ( \ 9267c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_CIPHER_MAC_OPS(pd) && \ 9277c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->encrypt_mac_init) ? \ 9287c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->encrypt_mac_init( \ 9297c478bd9Sstevel@tonic-gate ctx, encr_mech, encr_key, mac_mech, mac_key, encr_ctx_template, \ 9307c478bd9Sstevel@tonic-gate mac_ctx_template, req) : \ 9317c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 9327c478bd9Sstevel@tonic-gate 9337c478bd9Sstevel@tonic-gate #define KCF_PROV_ENCRYPT_MAC(pd, ctx, plaintext, ciphertext, mac, req) ( \ 9347c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_CIPHER_MAC_OPS(pd) && \ 9357c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->encrypt_mac) ? \ 9367c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->encrypt_mac( \ 9377c478bd9Sstevel@tonic-gate ctx, plaintext, ciphertext, mac, req) : \ 9387c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 9397c478bd9Sstevel@tonic-gate 9407c478bd9Sstevel@tonic-gate #define KCF_PROV_ENCRYPT_MAC_UPDATE(pd, ctx, plaintext, ciphertext, req) ( \ 9417c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_CIPHER_MAC_OPS(pd) && \ 9427c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->encrypt_mac_update) ? \ 9437c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->encrypt_mac_update( \ 9447c478bd9Sstevel@tonic-gate ctx, plaintext, ciphertext, req) : \ 9457c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 9467c478bd9Sstevel@tonic-gate 9477c478bd9Sstevel@tonic-gate #define KCF_PROV_ENCRYPT_MAC_FINAL(pd, ctx, ciphertext, mac, req) ( \ 9487c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_CIPHER_MAC_OPS(pd) && \ 9497c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->encrypt_mac_final) ? \ 9507c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->encrypt_mac_final( \ 9517c478bd9Sstevel@tonic-gate ctx, ciphertext, mac, req) : \ 9527c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 9537c478bd9Sstevel@tonic-gate 9547c478bd9Sstevel@tonic-gate #define KCF_PROV_ENCRYPT_MAC_ATOMIC(pd, session, encr_mech, encr_key, \ 9557c478bd9Sstevel@tonic-gate mac_mech, mac_key, plaintext, ciphertext, mac, \ 9567c478bd9Sstevel@tonic-gate encr_ctx_template, mac_ctx_template, req) ( \ 9577c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_CIPHER_MAC_OPS(pd) && \ 9587c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->encrypt_mac_atomic) ? \ 9597c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->encrypt_mac_atomic( \ 9607c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, encr_mech, encr_key, \ 9617c478bd9Sstevel@tonic-gate mac_mech, mac_key, plaintext, ciphertext, mac, \ 9627c478bd9Sstevel@tonic-gate encr_ctx_template, mac_ctx_template, req) : \ 9637c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 9647c478bd9Sstevel@tonic-gate 9657c478bd9Sstevel@tonic-gate #define KCF_PROV_MAC_DECRYPT_INIT(pd, ctx, mac_mech, mac_key, decr_mech, \ 9667c478bd9Sstevel@tonic-gate decr_key, mac_ctx_template, decr_ctx_template, req) ( \ 9677c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_CIPHER_MAC_OPS(pd) && \ 9687c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->mac_decrypt_init) ? \ 9697c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->mac_decrypt_init( \ 9707c478bd9Sstevel@tonic-gate ctx, mac_mech, mac_key, decr_mech, decr_key, mac_ctx_template, \ 9717c478bd9Sstevel@tonic-gate decr_ctx_template, req) : \ 9727c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 9737c478bd9Sstevel@tonic-gate 9747c478bd9Sstevel@tonic-gate #define KCF_PROV_MAC_DECRYPT(pd, ctx, ciphertext, mac, plaintext, req) ( \ 9757c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_CIPHER_MAC_OPS(pd) && \ 9767c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->mac_decrypt) ? \ 9777c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->mac_decrypt( \ 9787c478bd9Sstevel@tonic-gate ctx, ciphertext, mac, plaintext, req) : \ 9797c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 9807c478bd9Sstevel@tonic-gate 9817c478bd9Sstevel@tonic-gate #define KCF_PROV_MAC_DECRYPT_UPDATE(pd, ctx, ciphertext, plaintext, req) ( \ 9827c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_CIPHER_MAC_OPS(pd) && \ 9837c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->mac_decrypt_update) ? \ 9847c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->mac_decrypt_update( \ 9857c478bd9Sstevel@tonic-gate ctx, ciphertext, plaintext, req) : \ 9867c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 9877c478bd9Sstevel@tonic-gate 9887c478bd9Sstevel@tonic-gate #define KCF_PROV_MAC_DECRYPT_FINAL(pd, ctx, mac, plaintext, req) ( \ 9897c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_CIPHER_MAC_OPS(pd) && \ 9907c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->mac_decrypt_final) ? \ 9917c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->mac_decrypt_final( \ 9927c478bd9Sstevel@tonic-gate ctx, mac, plaintext, req) : \ 9937c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 9947c478bd9Sstevel@tonic-gate 9957c478bd9Sstevel@tonic-gate #define KCF_PROV_MAC_DECRYPT_ATOMIC(pd, session, mac_mech, mac_key, \ 9967c478bd9Sstevel@tonic-gate decr_mech, decr_key, ciphertext, mac, plaintext, \ 9977c478bd9Sstevel@tonic-gate mac_ctx_template, decr_ctx_template, req) ( \ 9987c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_CIPHER_MAC_OPS(pd) && \ 9997c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->mac_decrypt_atomic) ? \ 10007c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->mac_decrypt_atomic( \ 10017c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, mac_mech, mac_key, \ 10027c478bd9Sstevel@tonic-gate decr_mech, decr_key, ciphertext, mac, plaintext, \ 10037c478bd9Sstevel@tonic-gate mac_ctx_template, decr_ctx_template, req) : \ 10047c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 10057c478bd9Sstevel@tonic-gate 10067c478bd9Sstevel@tonic-gate #define KCF_PROV_MAC_VERIFY_DECRYPT_ATOMIC(pd, session, mac_mech, mac_key, \ 10077c478bd9Sstevel@tonic-gate decr_mech, decr_key, ciphertext, mac, plaintext, \ 10087c478bd9Sstevel@tonic-gate mac_ctx_template, decr_ctx_template, req) ( \ 10097c478bd9Sstevel@tonic-gate (KCF_PROV_DUAL_CIPHER_MAC_OPS(pd) && \ 10107c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->mac_verify_decrypt_atomic \ 10117c478bd9Sstevel@tonic-gate != NULL) ? \ 10127c478bd9Sstevel@tonic-gate KCF_PROV_DUAL_CIPHER_MAC_OPS(pd)->mac_verify_decrypt_atomic( \ 10137c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, mac_mech, mac_key, \ 10147c478bd9Sstevel@tonic-gate decr_mech, decr_key, ciphertext, mac, plaintext, \ 10157c478bd9Sstevel@tonic-gate mac_ctx_template, decr_ctx_template, req) : \ 10167c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 10177c478bd9Sstevel@tonic-gate 10187c478bd9Sstevel@tonic-gate /* 10197c478bd9Sstevel@tonic-gate * Wrappers for crypto_random_number_ops(9S) entry points. 10207c478bd9Sstevel@tonic-gate */ 10217c478bd9Sstevel@tonic-gate 10228047c9fbSmcpowers #define KCF_PROV_SEED_RANDOM(pd, session, buf, len, est, flags, req) ( \ 10237c478bd9Sstevel@tonic-gate (KCF_PROV_RANDOM_OPS(pd) && KCF_PROV_RANDOM_OPS(pd)->seed_random) ? \ 10247c478bd9Sstevel@tonic-gate KCF_PROV_RANDOM_OPS(pd)->seed_random((pd)->pd_prov_handle, \ 10258047c9fbSmcpowers session, buf, len, est, flags, req) : CRYPTO_NOT_SUPPORTED) 10267c478bd9Sstevel@tonic-gate 10277c478bd9Sstevel@tonic-gate #define KCF_PROV_GENERATE_RANDOM(pd, session, buf, len, req) ( \ 10287c478bd9Sstevel@tonic-gate (KCF_PROV_RANDOM_OPS(pd) && \ 10297c478bd9Sstevel@tonic-gate KCF_PROV_RANDOM_OPS(pd)->generate_random) ? \ 10307c478bd9Sstevel@tonic-gate KCF_PROV_RANDOM_OPS(pd)->generate_random((pd)->pd_prov_handle, \ 10317c478bd9Sstevel@tonic-gate session, buf, len, req) : CRYPTO_NOT_SUPPORTED) 10327c478bd9Sstevel@tonic-gate 10337c478bd9Sstevel@tonic-gate /* 10347c478bd9Sstevel@tonic-gate * Wrappers for crypto_session_ops(9S) entry points. 10357c478bd9Sstevel@tonic-gate * 10367c478bd9Sstevel@tonic-gate * ops_pd is the provider descriptor that supplies the ops_vector. 10377c478bd9Sstevel@tonic-gate * pd is the descriptor that supplies the provider handle. 10387c478bd9Sstevel@tonic-gate * Only session open/close needs two handles. 10397c478bd9Sstevel@tonic-gate */ 10407c478bd9Sstevel@tonic-gate 10417c478bd9Sstevel@tonic-gate #define KCF_PROV_SESSION_OPEN(ops_pd, session, req, pd) ( \ 10427c478bd9Sstevel@tonic-gate (KCF_PROV_SESSION_OPS(ops_pd) && \ 10437c478bd9Sstevel@tonic-gate KCF_PROV_SESSION_OPS(ops_pd)->session_open) ? \ 10447c478bd9Sstevel@tonic-gate KCF_PROV_SESSION_OPS(ops_pd)->session_open((pd)->pd_prov_handle, \ 10457c478bd9Sstevel@tonic-gate session, req) : CRYPTO_NOT_SUPPORTED) 10467c478bd9Sstevel@tonic-gate 10477c478bd9Sstevel@tonic-gate #define KCF_PROV_SESSION_CLOSE(ops_pd, session, req, pd) ( \ 10487c478bd9Sstevel@tonic-gate (KCF_PROV_SESSION_OPS(ops_pd) && \ 10497c478bd9Sstevel@tonic-gate KCF_PROV_SESSION_OPS(ops_pd)->session_close) ? \ 10507c478bd9Sstevel@tonic-gate KCF_PROV_SESSION_OPS(ops_pd)->session_close((pd)->pd_prov_handle, \ 10517c478bd9Sstevel@tonic-gate session, req) : CRYPTO_NOT_SUPPORTED) 10527c478bd9Sstevel@tonic-gate 10537c478bd9Sstevel@tonic-gate #define KCF_PROV_SESSION_LOGIN(pd, session, user_type, pin, len, req) ( \ 10547c478bd9Sstevel@tonic-gate (KCF_PROV_SESSION_OPS(pd) && \ 10557c478bd9Sstevel@tonic-gate KCF_PROV_SESSION_OPS(pd)->session_login) ? \ 10567c478bd9Sstevel@tonic-gate KCF_PROV_SESSION_OPS(pd)->session_login((pd)->pd_prov_handle, \ 10577c478bd9Sstevel@tonic-gate session, user_type, pin, len, req) : CRYPTO_NOT_SUPPORTED) 10587c478bd9Sstevel@tonic-gate 10597c478bd9Sstevel@tonic-gate #define KCF_PROV_SESSION_LOGOUT(pd, session, req) ( \ 10607c478bd9Sstevel@tonic-gate (KCF_PROV_SESSION_OPS(pd) && \ 10617c478bd9Sstevel@tonic-gate KCF_PROV_SESSION_OPS(pd)->session_logout) ? \ 10627c478bd9Sstevel@tonic-gate KCF_PROV_SESSION_OPS(pd)->session_logout((pd)->pd_prov_handle, \ 10637c478bd9Sstevel@tonic-gate session, req) : CRYPTO_NOT_SUPPORTED) 10647c478bd9Sstevel@tonic-gate 10657c478bd9Sstevel@tonic-gate /* 10667c478bd9Sstevel@tonic-gate * Wrappers for crypto_object_ops(9S) entry points. 10677c478bd9Sstevel@tonic-gate */ 10687c478bd9Sstevel@tonic-gate 10697c478bd9Sstevel@tonic-gate #define KCF_PROV_OBJECT_CREATE(pd, session, template, count, object, req) ( \ 10707c478bd9Sstevel@tonic-gate (KCF_PROV_OBJECT_OPS(pd) && KCF_PROV_OBJECT_OPS(pd)->object_create) ? \ 10717c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_create((pd)->pd_prov_handle, \ 10727c478bd9Sstevel@tonic-gate session, template, count, object, req) : CRYPTO_NOT_SUPPORTED) 10737c478bd9Sstevel@tonic-gate 10747c478bd9Sstevel@tonic-gate #define KCF_PROV_OBJECT_COPY(pd, session, object, template, count, \ 10757c478bd9Sstevel@tonic-gate new_object, req) ( \ 10767c478bd9Sstevel@tonic-gate (KCF_PROV_OBJECT_OPS(pd) && KCF_PROV_OBJECT_OPS(pd)->object_copy) ? \ 10777c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_copy((pd)->pd_prov_handle, \ 10787c478bd9Sstevel@tonic-gate session, object, template, count, new_object, req) : \ 10797c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 10807c478bd9Sstevel@tonic-gate 10817c478bd9Sstevel@tonic-gate #define KCF_PROV_OBJECT_DESTROY(pd, session, object, req) ( \ 10827c478bd9Sstevel@tonic-gate (KCF_PROV_OBJECT_OPS(pd) && KCF_PROV_OBJECT_OPS(pd)->object_destroy) ? \ 10837c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_destroy((pd)->pd_prov_handle, \ 10847c478bd9Sstevel@tonic-gate session, object, req) : CRYPTO_NOT_SUPPORTED) 10857c478bd9Sstevel@tonic-gate 10867c478bd9Sstevel@tonic-gate #define KCF_PROV_OBJECT_GET_SIZE(pd, session, object, size, req) ( \ 10877c478bd9Sstevel@tonic-gate (KCF_PROV_OBJECT_OPS(pd) && \ 10887c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_get_size) ? \ 10897c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_get_size((pd)->pd_prov_handle, \ 10907c478bd9Sstevel@tonic-gate session, object, size, req) : CRYPTO_NOT_SUPPORTED) 10917c478bd9Sstevel@tonic-gate 10927c478bd9Sstevel@tonic-gate #define KCF_PROV_OBJECT_GET_ATTRIBUTE_VALUE(pd, session, object, template, \ 10937c478bd9Sstevel@tonic-gate count, req) ( \ 10947c478bd9Sstevel@tonic-gate (KCF_PROV_OBJECT_OPS(pd) && \ 10957c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_get_attribute_value) ? \ 10967c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_get_attribute_value( \ 10977c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, object, template, count, req) : \ 10987c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 10997c478bd9Sstevel@tonic-gate 11007c478bd9Sstevel@tonic-gate #define KCF_PROV_OBJECT_SET_ATTRIBUTE_VALUE(pd, session, object, template, \ 11017c478bd9Sstevel@tonic-gate count, req) ( \ 11027c478bd9Sstevel@tonic-gate (KCF_PROV_OBJECT_OPS(pd) && \ 11037c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_set_attribute_value) ? \ 11047c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_set_attribute_value( \ 11057c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, session, object, template, count, req) : \ 11067c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 11077c478bd9Sstevel@tonic-gate 11087c478bd9Sstevel@tonic-gate #define KCF_PROV_OBJECT_FIND_INIT(pd, session, template, count, ppriv, \ 11097c478bd9Sstevel@tonic-gate req) ( \ 11107c478bd9Sstevel@tonic-gate (KCF_PROV_OBJECT_OPS(pd) && \ 11117c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_find_init) ? \ 11127c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_find_init((pd)->pd_prov_handle, \ 11137c478bd9Sstevel@tonic-gate session, template, count, ppriv, req) : CRYPTO_NOT_SUPPORTED) 11147c478bd9Sstevel@tonic-gate 11157c478bd9Sstevel@tonic-gate #define KCF_PROV_OBJECT_FIND(pd, ppriv, objects, max_objects, object_count, \ 11167c478bd9Sstevel@tonic-gate req) ( \ 11177c478bd9Sstevel@tonic-gate (KCF_PROV_OBJECT_OPS(pd) && KCF_PROV_OBJECT_OPS(pd)->object_find) ? \ 11187c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_find( \ 11197c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, ppriv, objects, max_objects, object_count, \ 11207c478bd9Sstevel@tonic-gate req) : CRYPTO_NOT_SUPPORTED) 11217c478bd9Sstevel@tonic-gate 11227c478bd9Sstevel@tonic-gate #define KCF_PROV_OBJECT_FIND_FINAL(pd, ppriv, req) ( \ 11237c478bd9Sstevel@tonic-gate (KCF_PROV_OBJECT_OPS(pd) && \ 11247c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_find_final) ? \ 11257c478bd9Sstevel@tonic-gate KCF_PROV_OBJECT_OPS(pd)->object_find_final( \ 11267c478bd9Sstevel@tonic-gate (pd)->pd_prov_handle, ppriv, req) : CRYPTO_NOT_SUPPORTED) 11277c478bd9Sstevel@tonic-gate 11287c478bd9Sstevel@tonic-gate /* 11297c478bd9Sstevel@tonic-gate * Wrappers for crypto_key_ops(9S) entry points. 11307c478bd9Sstevel@tonic-gate */ 11317c478bd9Sstevel@tonic-gate 11327c478bd9Sstevel@tonic-gate #define KCF_PROV_KEY_GENERATE(pd, session, mech, template, count, object, \ 11337c478bd9Sstevel@tonic-gate req) ( \ 11347c478bd9Sstevel@tonic-gate (KCF_PROV_KEY_OPS(pd) && KCF_PROV_KEY_OPS(pd)->key_generate) ? \ 11357c478bd9Sstevel@tonic-gate KCF_PROV_KEY_OPS(pd)->key_generate((pd)->pd_prov_handle, \ 11367c478bd9Sstevel@tonic-gate session, mech, template, count, object, req) : \ 11377c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 11387c478bd9Sstevel@tonic-gate 11397c478bd9Sstevel@tonic-gate #define KCF_PROV_KEY_GENERATE_PAIR(pd, session, mech, pub_template, \ 11407c478bd9Sstevel@tonic-gate pub_count, priv_template, priv_count, pub_key, priv_key, req) ( \ 11417c478bd9Sstevel@tonic-gate (KCF_PROV_KEY_OPS(pd) && KCF_PROV_KEY_OPS(pd)->key_generate_pair) ? \ 11427c478bd9Sstevel@tonic-gate KCF_PROV_KEY_OPS(pd)->key_generate_pair((pd)->pd_prov_handle, \ 11437c478bd9Sstevel@tonic-gate session, mech, pub_template, pub_count, priv_template, \ 11447c478bd9Sstevel@tonic-gate priv_count, pub_key, priv_key, req) : \ 11457c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 11467c478bd9Sstevel@tonic-gate 11477c478bd9Sstevel@tonic-gate #define KCF_PROV_KEY_WRAP(pd, session, mech, wrapping_key, key, wrapped_key, \ 11487c478bd9Sstevel@tonic-gate wrapped_key_len, req) ( \ 11497c478bd9Sstevel@tonic-gate (KCF_PROV_KEY_OPS(pd) && KCF_PROV_KEY_OPS(pd)->key_wrap) ? \ 11507c478bd9Sstevel@tonic-gate KCF_PROV_KEY_OPS(pd)->key_wrap((pd)->pd_prov_handle, \ 11517c478bd9Sstevel@tonic-gate session, mech, wrapping_key, key, wrapped_key, wrapped_key_len, \ 11527c478bd9Sstevel@tonic-gate req) : \ 11537c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 11547c478bd9Sstevel@tonic-gate 11557c478bd9Sstevel@tonic-gate #define KCF_PROV_KEY_UNWRAP(pd, session, mech, unwrapping_key, wrapped_key, \ 11567c478bd9Sstevel@tonic-gate wrapped_key_len, template, count, key, req) ( \ 11577c478bd9Sstevel@tonic-gate (KCF_PROV_KEY_OPS(pd) && KCF_PROV_KEY_OPS(pd)->key_unwrap) ? \ 11587c478bd9Sstevel@tonic-gate KCF_PROV_KEY_OPS(pd)->key_unwrap((pd)->pd_prov_handle, \ 11597c478bd9Sstevel@tonic-gate session, mech, unwrapping_key, wrapped_key, wrapped_key_len, \ 11607c478bd9Sstevel@tonic-gate template, count, key, req) : \ 11617c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 11627c478bd9Sstevel@tonic-gate 11637c478bd9Sstevel@tonic-gate #define KCF_PROV_KEY_DERIVE(pd, session, mech, base_key, template, count, \ 11647c478bd9Sstevel@tonic-gate key, req) ( \ 11657c478bd9Sstevel@tonic-gate (KCF_PROV_KEY_OPS(pd) && KCF_PROV_KEY_OPS(pd)->key_derive) ? \ 11667c478bd9Sstevel@tonic-gate KCF_PROV_KEY_OPS(pd)->key_derive((pd)->pd_prov_handle, \ 11677c478bd9Sstevel@tonic-gate session, mech, base_key, template, count, key, req) : \ 11687c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 11697c478bd9Sstevel@tonic-gate 11707c478bd9Sstevel@tonic-gate #define KCF_PROV_KEY_CHECK(pd, mech, key) ( \ 11717c478bd9Sstevel@tonic-gate (KCF_PROV_KEY_OPS(pd) && KCF_PROV_KEY_OPS(pd)->key_check) ? \ 11727c478bd9Sstevel@tonic-gate KCF_PROV_KEY_OPS(pd)->key_check((pd)->pd_prov_handle, mech, key) : \ 11737c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 11747c478bd9Sstevel@tonic-gate 11757c478bd9Sstevel@tonic-gate /* 11767c478bd9Sstevel@tonic-gate * Wrappers for crypto_provider_management_ops(9S) entry points. 11777c478bd9Sstevel@tonic-gate * 11787c478bd9Sstevel@tonic-gate * ops_pd is the provider descriptor that supplies the ops_vector. 11797c478bd9Sstevel@tonic-gate * pd is the descriptor that supplies the provider handle. 11807c478bd9Sstevel@tonic-gate * Only ext_info needs two handles. 11817c478bd9Sstevel@tonic-gate */ 11827c478bd9Sstevel@tonic-gate 11837c478bd9Sstevel@tonic-gate #define KCF_PROV_EXT_INFO(ops_pd, provext_info, req, pd) ( \ 11847c478bd9Sstevel@tonic-gate (KCF_PROV_PROVIDER_OPS(ops_pd) && \ 11857c478bd9Sstevel@tonic-gate KCF_PROV_PROVIDER_OPS(ops_pd)->ext_info) ? \ 11867c478bd9Sstevel@tonic-gate KCF_PROV_PROVIDER_OPS(ops_pd)->ext_info((pd)->pd_prov_handle, \ 11877c478bd9Sstevel@tonic-gate provext_info, req) : CRYPTO_NOT_SUPPORTED) 11887c478bd9Sstevel@tonic-gate 11897c478bd9Sstevel@tonic-gate #define KCF_PROV_INIT_TOKEN(pd, pin, pin_len, label, req) ( \ 11907c478bd9Sstevel@tonic-gate (KCF_PROV_PROVIDER_OPS(pd) && KCF_PROV_PROVIDER_OPS(pd)->init_token) ? \ 11917c478bd9Sstevel@tonic-gate KCF_PROV_PROVIDER_OPS(pd)->init_token((pd)->pd_prov_handle, \ 11927c478bd9Sstevel@tonic-gate pin, pin_len, label, req) : CRYPTO_NOT_SUPPORTED) 11937c478bd9Sstevel@tonic-gate 11947c478bd9Sstevel@tonic-gate #define KCF_PROV_INIT_PIN(pd, session, pin, pin_len, req) ( \ 11957c478bd9Sstevel@tonic-gate (KCF_PROV_PROVIDER_OPS(pd) && KCF_PROV_PROVIDER_OPS(pd)->init_pin) ? \ 11967c478bd9Sstevel@tonic-gate KCF_PROV_PROVIDER_OPS(pd)->init_pin((pd)->pd_prov_handle, \ 11977c478bd9Sstevel@tonic-gate session, pin, pin_len, req) : CRYPTO_NOT_SUPPORTED) 11987c478bd9Sstevel@tonic-gate 11997c478bd9Sstevel@tonic-gate #define KCF_PROV_SET_PIN(pd, session, old_pin, old_len, new_pin, new_len, \ 12007c478bd9Sstevel@tonic-gate req) ( \ 12017c478bd9Sstevel@tonic-gate (KCF_PROV_PROVIDER_OPS(pd) && KCF_PROV_PROVIDER_OPS(pd)->set_pin) ? \ 12027c478bd9Sstevel@tonic-gate KCF_PROV_PROVIDER_OPS(pd)->set_pin((pd)->pd_prov_handle, \ 12037c478bd9Sstevel@tonic-gate session, old_pin, old_len, new_pin, new_len, req) : \ 12047c478bd9Sstevel@tonic-gate CRYPTO_NOT_SUPPORTED) 12057c478bd9Sstevel@tonic-gate 12067c478bd9Sstevel@tonic-gate /* 1207034448feSmcpowers * Wrappers for crypto_nostore_key_ops(9S) entry points. 1208034448feSmcpowers */ 1209034448feSmcpowers 1210034448feSmcpowers #define KCF_PROV_NOSTORE_KEY_GENERATE(pd, session, mech, template, count, \ 1211034448feSmcpowers out_template, out_count, req) ( \ 1212034448feSmcpowers (KCF_PROV_NOSTORE_KEY_OPS(pd) && \ 1213034448feSmcpowers KCF_PROV_NOSTORE_KEY_OPS(pd)->nostore_key_generate) ? \ 1214034448feSmcpowers KCF_PROV_NOSTORE_KEY_OPS(pd)->nostore_key_generate( \ 1215034448feSmcpowers (pd)->pd_prov_handle, session, mech, template, count, \ 1216034448feSmcpowers out_template, out_count, req) : CRYPTO_NOT_SUPPORTED) 1217034448feSmcpowers 1218034448feSmcpowers #define KCF_PROV_NOSTORE_KEY_GENERATE_PAIR(pd, session, mech, pub_template, \ 1219034448feSmcpowers pub_count, priv_template, priv_count, out_pub_template, \ 1220034448feSmcpowers out_pub_count, out_priv_template, out_priv_count, req) ( \ 1221034448feSmcpowers (KCF_PROV_NOSTORE_KEY_OPS(pd) && \ 1222034448feSmcpowers KCF_PROV_NOSTORE_KEY_OPS(pd)->nostore_key_generate_pair) ? \ 1223034448feSmcpowers KCF_PROV_NOSTORE_KEY_OPS(pd)->nostore_key_generate_pair( \ 1224034448feSmcpowers (pd)->pd_prov_handle, session, mech, pub_template, pub_count, \ 1225034448feSmcpowers priv_template, priv_count, out_pub_template, out_pub_count, \ 1226034448feSmcpowers out_priv_template, out_priv_count, req) : CRYPTO_NOT_SUPPORTED) 1227034448feSmcpowers 1228034448feSmcpowers #define KCF_PROV_NOSTORE_KEY_DERIVE(pd, session, mech, base_key, template, \ 1229034448feSmcpowers count, out_template, out_count, req) ( \ 1230034448feSmcpowers (KCF_PROV_NOSTORE_KEY_OPS(pd) && \ 1231034448feSmcpowers KCF_PROV_NOSTORE_KEY_OPS(pd)->nostore_key_derive) ? \ 1232034448feSmcpowers KCF_PROV_NOSTORE_KEY_OPS(pd)->nostore_key_derive( \ 1233034448feSmcpowers (pd)->pd_prov_handle, session, mech, base_key, template, count, \ 1234034448feSmcpowers out_template, out_count, req) : CRYPTO_NOT_SUPPORTED) 1235034448feSmcpowers 1236034448feSmcpowers /* 12377c478bd9Sstevel@tonic-gate * The following routines are exported by the kcf module (/kernel/misc/kcf) 12387c478bd9Sstevel@tonic-gate * to the crypto and cryptoadmin modules. 12397c478bd9Sstevel@tonic-gate */ 12407c478bd9Sstevel@tonic-gate 12417c478bd9Sstevel@tonic-gate /* Digest/mac/cipher entry points that take a provider descriptor and session */ 12427c478bd9Sstevel@tonic-gate extern int crypto_digest_single(crypto_context_t, crypto_data_t *, 12437c478bd9Sstevel@tonic-gate crypto_data_t *, crypto_call_req_t *); 12447c478bd9Sstevel@tonic-gate 12457c478bd9Sstevel@tonic-gate extern int crypto_mac_single(crypto_context_t, crypto_data_t *, 12467c478bd9Sstevel@tonic-gate crypto_data_t *, crypto_call_req_t *); 12477c478bd9Sstevel@tonic-gate 12487c478bd9Sstevel@tonic-gate extern int crypto_encrypt_single(crypto_context_t, crypto_data_t *, 12497c478bd9Sstevel@tonic-gate crypto_data_t *, crypto_call_req_t *); 12507c478bd9Sstevel@tonic-gate 12517c478bd9Sstevel@tonic-gate extern int crypto_decrypt_single(crypto_context_t, crypto_data_t *, 12527c478bd9Sstevel@tonic-gate crypto_data_t *, crypto_call_req_t *); 12537c478bd9Sstevel@tonic-gate 12547c478bd9Sstevel@tonic-gate 12557c478bd9Sstevel@tonic-gate /* Other private digest/mac/cipher entry points not exported through k-API */ 12567c478bd9Sstevel@tonic-gate extern int crypto_digest_key_prov(crypto_context_t, crypto_key_t *, 12577c478bd9Sstevel@tonic-gate crypto_call_req_t *); 12587c478bd9Sstevel@tonic-gate 12597c478bd9Sstevel@tonic-gate /* Private sign entry points exported by KCF */ 12607c478bd9Sstevel@tonic-gate extern int crypto_sign_single(crypto_context_t, crypto_data_t *, 12617c478bd9Sstevel@tonic-gate crypto_data_t *, crypto_call_req_t *); 12627c478bd9Sstevel@tonic-gate 12637c478bd9Sstevel@tonic-gate extern int crypto_sign_recover_single(crypto_context_t, crypto_data_t *, 12647c478bd9Sstevel@tonic-gate crypto_data_t *, crypto_call_req_t *); 12657c478bd9Sstevel@tonic-gate 12667c478bd9Sstevel@tonic-gate /* Private verify entry points exported by KCF */ 12677c478bd9Sstevel@tonic-gate extern int crypto_verify_single(crypto_context_t, crypto_data_t *, 12687c478bd9Sstevel@tonic-gate crypto_data_t *, crypto_call_req_t *); 12697c478bd9Sstevel@tonic-gate 12707c478bd9Sstevel@tonic-gate extern int crypto_verify_recover_single(crypto_context_t, crypto_data_t *, 12717c478bd9Sstevel@tonic-gate crypto_data_t *, crypto_call_req_t *); 12727c478bd9Sstevel@tonic-gate 12737c478bd9Sstevel@tonic-gate /* Private dual operations entry points exported by KCF */ 12747c478bd9Sstevel@tonic-gate extern int crypto_digest_encrypt_update(crypto_context_t, crypto_context_t, 12757c478bd9Sstevel@tonic-gate crypto_data_t *, crypto_data_t *, crypto_call_req_t *); 12767c478bd9Sstevel@tonic-gate extern int crypto_decrypt_digest_update(crypto_context_t, crypto_context_t, 12777c478bd9Sstevel@tonic-gate crypto_data_t *, crypto_data_t *, crypto_call_req_t *); 12787c478bd9Sstevel@tonic-gate extern int crypto_sign_encrypt_update(crypto_context_t, crypto_context_t, 12797c478bd9Sstevel@tonic-gate crypto_data_t *, crypto_data_t *, crypto_call_req_t *); 12807c478bd9Sstevel@tonic-gate extern int crypto_decrypt_verify_update(crypto_context_t, crypto_context_t, 12817c478bd9Sstevel@tonic-gate crypto_data_t *, crypto_data_t *, crypto_call_req_t *); 12827c478bd9Sstevel@tonic-gate 12837c478bd9Sstevel@tonic-gate /* Random Number Generation */ 12847c478bd9Sstevel@tonic-gate int crypto_seed_random(crypto_provider_handle_t provider, uchar_t *buf, 12857c478bd9Sstevel@tonic-gate size_t len, crypto_call_req_t *req); 12867c478bd9Sstevel@tonic-gate int crypto_generate_random(crypto_provider_handle_t provider, uchar_t *buf, 12877c478bd9Sstevel@tonic-gate size_t len, crypto_call_req_t *req); 12887c478bd9Sstevel@tonic-gate 12897c478bd9Sstevel@tonic-gate /* Provider Management */ 12907c478bd9Sstevel@tonic-gate int crypto_get_provider_info(crypto_provider_id_t id, 12917c478bd9Sstevel@tonic-gate crypto_provider_info_t **info, crypto_call_req_t *req); 12927c478bd9Sstevel@tonic-gate int crypto_get_provider_mechanisms(crypto_minor_t *, crypto_provider_id_t id, 12937c478bd9Sstevel@tonic-gate uint_t *count, crypto_mech_name_t **list); 12947c478bd9Sstevel@tonic-gate int crypto_init_token(crypto_provider_handle_t provider, char *pin, 12957c478bd9Sstevel@tonic-gate size_t pin_len, char *label, crypto_call_req_t *); 12967c478bd9Sstevel@tonic-gate int crypto_init_pin(crypto_provider_handle_t provider, char *pin, 12977c478bd9Sstevel@tonic-gate size_t pin_len, crypto_call_req_t *req); 12987c478bd9Sstevel@tonic-gate int crypto_set_pin(crypto_provider_handle_t provider, char *old_pin, 12997c478bd9Sstevel@tonic-gate size_t old_len, char *new_pin, size_t new_len, crypto_call_req_t *req); 13007c478bd9Sstevel@tonic-gate void crypto_free_provider_list(crypto_provider_entry_t *list, uint_t count); 13017c478bd9Sstevel@tonic-gate void crypto_free_provider_info(crypto_provider_info_t *info); 13027c478bd9Sstevel@tonic-gate 13037c478bd9Sstevel@tonic-gate /* Administrative */ 13047c478bd9Sstevel@tonic-gate int crypto_get_dev_list(uint_t *count, crypto_dev_list_entry_t **list); 13057c478bd9Sstevel@tonic-gate int crypto_get_soft_list(uint_t *count, char **list, size_t *len); 13067c478bd9Sstevel@tonic-gate int crypto_get_dev_info(char *name, uint_t instance, uint_t *count, 13077c478bd9Sstevel@tonic-gate crypto_mech_name_t **list); 13087c478bd9Sstevel@tonic-gate int crypto_get_soft_info(caddr_t name, uint_t *count, 13097c478bd9Sstevel@tonic-gate crypto_mech_name_t **list); 13107c478bd9Sstevel@tonic-gate int crypto_load_dev_disabled(char *name, uint_t instance, uint_t count, 13117c478bd9Sstevel@tonic-gate crypto_mech_name_t *list); 13127c478bd9Sstevel@tonic-gate int crypto_load_soft_disabled(caddr_t name, uint_t count, 13137c478bd9Sstevel@tonic-gate crypto_mech_name_t *list); 13147c478bd9Sstevel@tonic-gate int crypto_unload_soft_module(caddr_t path); 13157c478bd9Sstevel@tonic-gate int crypto_load_soft_config(caddr_t name, uint_t count, 13167c478bd9Sstevel@tonic-gate crypto_mech_name_t *list); 13177c478bd9Sstevel@tonic-gate int crypto_load_door(uint_t did); 13187c478bd9Sstevel@tonic-gate void crypto_free_mech_list(crypto_mech_name_t *list, uint_t count); 13197c478bd9Sstevel@tonic-gate void crypto_free_dev_list(crypto_dev_list_entry_t *list, uint_t count); 132073556491SAnthony Scarpino extern void kcf_activate(); 13217c478bd9Sstevel@tonic-gate 13227c478bd9Sstevel@tonic-gate /* Miscellaneous */ 13237c478bd9Sstevel@tonic-gate int crypto_get_mechanism_number(caddr_t name, crypto_mech_type_t *number); 13247c478bd9Sstevel@tonic-gate int crypto_get_function_list(crypto_provider_id_t id, 13257c478bd9Sstevel@tonic-gate crypto_function_list_t **list, int kmflag); 13267c478bd9Sstevel@tonic-gate void crypto_free_function_list(crypto_function_list_t *list); 13277c478bd9Sstevel@tonic-gate int crypto_build_permitted_mech_names(kcf_provider_desc_t *, 13287c478bd9Sstevel@tonic-gate crypto_mech_name_t **, uint_t *, int); 13297c478bd9Sstevel@tonic-gate extern void kcf_init_mech_tabs(void); 13306a1073f8Skrishna extern int kcf_add_mech_provider(short, kcf_provider_desc_t *, 13317c478bd9Sstevel@tonic-gate kcf_prov_mech_desc_t **); 13327c478bd9Sstevel@tonic-gate extern void kcf_remove_mech_provider(char *, kcf_provider_desc_t *); 13337c478bd9Sstevel@tonic-gate extern int kcf_get_mech_entry(crypto_mech_type_t, kcf_mech_entry_t **); 13347c478bd9Sstevel@tonic-gate extern kcf_provider_desc_t *kcf_alloc_provider_desc(crypto_provider_info_t *); 13357c478bd9Sstevel@tonic-gate extern void kcf_free_provider_desc(kcf_provider_desc_t *); 13367c478bd9Sstevel@tonic-gate extern void kcf_soft_config_init(void); 13377c478bd9Sstevel@tonic-gate extern int get_sw_provider_for_mech(crypto_mech_name_t, char **); 13387c478bd9Sstevel@tonic-gate extern crypto_mech_type_t crypto_mech2id_common(char *, boolean_t); 13397c478bd9Sstevel@tonic-gate extern void undo_register_provider(kcf_provider_desc_t *, boolean_t); 13407c478bd9Sstevel@tonic-gate extern void redo_register_provider(kcf_provider_desc_t *); 13417c478bd9Sstevel@tonic-gate extern void kcf_rnd_init(); 13427c478bd9Sstevel@tonic-gate extern boolean_t kcf_rngprov_check(void); 13437c478bd9Sstevel@tonic-gate extern int kcf_rnd_get_pseudo_bytes(uint8_t *, size_t); 13448b502715SKrishna Yenduri extern int kcf_rnd_get_bytes(uint8_t *, size_t, boolean_t); 13458047c9fbSmcpowers extern int random_add_pseudo_entropy(uint8_t *, size_t, uint_t); 13469d31afc5SKrishna Yenduri extern void kcf_rnd_chpoll(short, int, short *, struct pollhead **); 134723c57df7Smcpowers extern int crypto_uio_data(crypto_data_t *, uchar_t *, int, cmd_type_t, 134823c57df7Smcpowers void *, void (*update)()); 134923c57df7Smcpowers extern int crypto_mblk_data(crypto_data_t *, uchar_t *, int, cmd_type_t, 135023c57df7Smcpowers void *, void (*update)()); 135123c57df7Smcpowers extern int crypto_put_output_data(uchar_t *, crypto_data_t *, int); 135223c57df7Smcpowers extern int crypto_get_input_data(crypto_data_t *, uchar_t **, uchar_t *); 135323c57df7Smcpowers extern int crypto_copy_key_to_ctx(crypto_key_t *, crypto_key_t **, size_t *, 135423c57df7Smcpowers int kmflag); 135523c57df7Smcpowers extern int crypto_digest_data(crypto_data_t *, void *, uchar_t *, 135623c57df7Smcpowers void (*update)(), void (*final)(), uchar_t); 135723c57df7Smcpowers extern int crypto_update_iov(void *, crypto_data_t *, crypto_data_t *, 135823c57df7Smcpowers int (*cipher)(void *, caddr_t, size_t, crypto_data_t *), 135923c57df7Smcpowers void (*copy_block)(uint8_t *, uint64_t *)); 136023c57df7Smcpowers extern int crypto_update_uio(void *, crypto_data_t *, crypto_data_t *, 136123c57df7Smcpowers int (*cipher)(void *, caddr_t, size_t, crypto_data_t *), 136223c57df7Smcpowers void (*copy_block)(uint8_t *, uint64_t *)); 136323c57df7Smcpowers extern int crypto_update_mp(void *, crypto_data_t *, crypto_data_t *, 136423c57df7Smcpowers int (*cipher)(void *, caddr_t, size_t, crypto_data_t *), 136523c57df7Smcpowers void (*copy_block)(uint8_t *, uint64_t *)); 136623c57df7Smcpowers extern int crypto_get_key_attr(crypto_key_t *, crypto_attr_type_t, uchar_t **, 136723c57df7Smcpowers ssize_t *); 13687c478bd9Sstevel@tonic-gate 13697c478bd9Sstevel@tonic-gate /* Access to the provider's table */ 13707c478bd9Sstevel@tonic-gate extern void kcf_prov_tab_init(void); 13717c478bd9Sstevel@tonic-gate extern int kcf_prov_tab_add_provider(kcf_provider_desc_t *); 13727c478bd9Sstevel@tonic-gate extern int kcf_prov_tab_rem_provider(crypto_provider_id_t); 13737c478bd9Sstevel@tonic-gate extern kcf_provider_desc_t *kcf_prov_tab_lookup_by_name(char *); 13747c478bd9Sstevel@tonic-gate extern kcf_provider_desc_t *kcf_prov_tab_lookup_by_dev(char *, uint_t); 13757c478bd9Sstevel@tonic-gate extern int kcf_get_hw_prov_tab(uint_t *, kcf_provider_desc_t ***, int, 13767c478bd9Sstevel@tonic-gate char *, uint_t, boolean_t); 13777c478bd9Sstevel@tonic-gate extern int kcf_get_slot_list(uint_t *, kcf_provider_desc_t ***, boolean_t); 13787c478bd9Sstevel@tonic-gate extern void kcf_free_provider_tab(uint_t, kcf_provider_desc_t **); 13797c478bd9Sstevel@tonic-gate extern kcf_provider_desc_t *kcf_prov_tab_lookup(crypto_provider_id_t); 13807c478bd9Sstevel@tonic-gate extern int kcf_get_sw_prov(crypto_mech_type_t, kcf_provider_desc_t **, 13816a1073f8Skrishna kcf_mech_entry_t **, boolean_t); 13827c478bd9Sstevel@tonic-gate 1383ef56a3c5SKrishna Yenduri extern kmutex_t prov_tab_mutex; 1384ef56a3c5SKrishna Yenduri extern boolean_t kcf_need_provtab_walk; 1385ef56a3c5SKrishna Yenduri extern int kcf_get_refcnt(kcf_provider_desc_t *, boolean_t); 1386ef56a3c5SKrishna Yenduri 13877c478bd9Sstevel@tonic-gate /* Access to the policy table */ 13887c478bd9Sstevel@tonic-gate extern boolean_t is_mech_disabled(kcf_provider_desc_t *, crypto_mech_name_t); 13897c478bd9Sstevel@tonic-gate extern boolean_t is_mech_disabled_byname(crypto_provider_type_t, char *, 13907c478bd9Sstevel@tonic-gate uint_t, crypto_mech_name_t); 13917c478bd9Sstevel@tonic-gate extern void kcf_policy_tab_init(void); 13927c478bd9Sstevel@tonic-gate extern void kcf_policy_free_desc(kcf_policy_desc_t *); 13937c478bd9Sstevel@tonic-gate extern void kcf_policy_remove_by_name(char *, uint_t *, crypto_mech_name_t **); 13947c478bd9Sstevel@tonic-gate extern void kcf_policy_remove_by_dev(char *, uint_t, uint_t *, 13957c478bd9Sstevel@tonic-gate crypto_mech_name_t **); 13967c478bd9Sstevel@tonic-gate extern kcf_policy_desc_t *kcf_policy_lookup_by_name(char *); 13977c478bd9Sstevel@tonic-gate extern kcf_policy_desc_t *kcf_policy_lookup_by_dev(char *, uint_t); 13987c478bd9Sstevel@tonic-gate extern int kcf_policy_load_soft_disabled(char *, uint_t, crypto_mech_name_t *, 13997c478bd9Sstevel@tonic-gate uint_t *, crypto_mech_name_t **); 14007c478bd9Sstevel@tonic-gate extern int kcf_policy_load_dev_disabled(char *, uint_t, uint_t, 14017c478bd9Sstevel@tonic-gate crypto_mech_name_t *, uint_t *, crypto_mech_name_t **); 140273556491SAnthony Scarpino extern void remove_soft_config(char *); 140373556491SAnthony Scarpino 14047c478bd9Sstevel@tonic-gate #endif /* _KERNEL */ 14057c478bd9Sstevel@tonic-gate 14067c478bd9Sstevel@tonic-gate #ifdef __cplusplus 14077c478bd9Sstevel@tonic-gate } 14087c478bd9Sstevel@tonic-gate #endif 14097c478bd9Sstevel@tonic-gate 14107c478bd9Sstevel@tonic-gate #endif /* _SYS_CRYPTO_IMPL_H */ 1411