opencryptoki/SOURCES/0012-EP11-Update-EP11-host-...

2332 lines
99 KiB
Diff

From 1197829d87732e1cae18ee64eefe44f0a6cb391f Mon Sep 17 00:00:00 2001
From: Ingo Franzki <ifranzki@linux.ibm.com>
Date: Wed, 16 Feb 2022 10:09:10 +0100
Subject: [PATCH 12/34] EP11: Update EP11 host library header files
Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com>
---
usr/lib/ep11_stdll/ep11.h | 1345 +++++++++++++++++++++++++-----------------
usr/lib/ep11_stdll/ep11adm.h | 305 +++-------
2 files changed, 911 insertions(+), 739 deletions(-)
diff --git a/usr/lib/ep11_stdll/ep11.h b/usr/lib/ep11_stdll/ep11.h
index cd4f11e5..c68dd045 100644
--- a/usr/lib/ep11_stdll/ep11.h
+++ b/usr/lib/ep11_stdll/ep11.h
@@ -16,7 +16,6 @@
#if !defined(XCP_H__)
#define XCP_H__
-
#if !defined(CKR_OK)
#include "pkcs11.h"
#endif
@@ -25,195 +24,10 @@
#error "We need 64-bit <stdint.h> types, please include before this file."
#endif
-// SHA224 etc. are additions to PKCS#11 2.20
-// remove these if host migrates beyond 2.20 as base minimum [unlikely]
-//
-#if !defined(CKM_SHA224)
-#define CKM_SHA224 0x00000255
-#define CKM_SHA224_HMAC 0x00000256
-#define CKM_SHA224_HMAC_GENERAL 0x00000257
-#define CKM_SHA224_RSA_PKCS 0x00000046
-#define CKM_SHA224_RSA_PKCS_PSS 0x00000047
-#define CKM_SHA224_KEY_DERIVATION 0x00000396
-#define CKM_AES_CTR 0x00001086
-#define CKG_MGF1_SHA224 0x00000005
-#endif
-
-#if !defined(CKM_AES_CMAC)
-#define CKM_AES_CMAC 0x0000108a
-#endif
-
-#if !defined(CKM_DES3_CMAC)
-#define CKM_DES3_CMAC 0x00000138
-#endif
-
-
-
-// max value for target groups
-#define XCP_MAX_GRPIDX 1024u
-//
-// current version of XCP_Module structure; host code SHOULD interact with
-// future/past versions, MUST be set by caller before using m_add_module()
-// valid versions are all >0
-#define XCP_MOD_VERSION 2
//
// used for internal and external paths/addresses
#define MAX_FNAME_CHARS 256
-// macros for setting/checking and removing domains from (tgt.mgmt) domain mask
-#define XCPTGTMASK_SET_DOM(mask, domain) \
- mask[((domain)/8)] |= (1 << (7-(domain)%8))
-#define XCPTGTMASK_DOM_IS_SET(mask, domain) \
- (mask[((domain)/8)] & (1 << (7-(domain)%8)))
-#define XCPTGTMASK_CLR_DOM(mask, domain) \
- mask[((domain)/8)] &= ~(1 << (7-(domain)%8))
-//
-
-
-/* flags that can be set for the target tokens
- *
- * This flags are domain specific and are therefore called domain flags
- *
- * start of flags is >16 Bit. Max value for domains is 0xFF. Should be enough
- * room for extensions
- */
-#define XCP_TGTFL_WCAP 0x10000000 /* Capture wire request in output buffer
- * without sending it to the module
- */
-#define XCP_TGTFL_WCAP_SQ 0x20000000 /* Size query: Return size of request in
- * output buffer length field
- */
-#define XCP_TGTFL_SET_SCMD 0x40000000 /* Protected key special command: Set the
- * special command flag in the CPRB
- * header
- */
-#define XCP_TGTFL_API_CHKD 0x80000000 /* supported API version of modules in
- * target (group) has been checked
- */
-
-#define XCP_TGTFL_NO_LOCK 0x01000000 /* target token ignores sequential locks
- * for target probing
- */
-#define XCP_TGTFL_SET_ACMD 0x04000000 /* add CPRB admin flag to CPRB header */
-
-//--------------------------------------
-// socket use only
-#define XCP_MAXCONNECTIONS 64 /* max value for active connections */
-#define XCP_MAX_PORT 0xffff
-
-// hostname and port value fore one module
-typedef struct XCP_ModuleSocket {
- char host[ MAX_FNAME_CHARS +1 ];
- uint32_t port;
-} *XCP_ModuleSocket_t ;
-
-
-//--------------------------------------
-// diagnostics use only
-typedef struct XCP_DomainPerf {
- /* perf value of last request per domain
- *
- * At the moment unused
- * */
- unsigned int lastperf[ 256 ];
-} *XCP_DomainPerf_t;
-
-
-//--------------------------------------
-// subsequent communications with a module MAY skip infrastructure-specific
-// fields, such as a query not reporting device handles etc., even if they
-// have been supplied originally when the module has been registered.
-//
-typedef struct XCP_Module {
- uint32_t version; /* >0 for supported API versions */
-
- uint64_t flags; /* see XCP_Module_Flags */
-
- uint32_t domains; /* max# addressable under this module;
- * cached from OS
- *
- * when callers set domains to 0, the library
- * returns the module-claimed domain count.
- */
-
- unsigned char domainmask[ 256 /8 ];
- /* higher domain# through future flags (none
- * currently defined) which would add things
- * like 'FLAG_256_1023' etc. at the same time,
- * we would add domainmask2[] etc.
- * corresponding new fields.
- *
- * new fields would then store mask for
- * domains 256+ etc.
- *
- * domain #0 is bit x80 of 1st byte,
- * #255 is bit 0x01 of last byte.
- */
-
- // when a domainmask is supplied, with bits set beyond
- // what the module supports, the bitmask is trimmed to
- // the supported range, but this is NOT reported as an
- // error, unless XCP_MFL_STRICT is also supplied.
- //
- // without XCP_MFL_STRICT, callers are expected to check
- // at least the returned domain count.
-
- /* used only when flags includes XCP_MFL_SOCKET */
- struct XCP_ModuleSocket socket;
-
- /* used when system exposes modules through an
- * array of transparent pipes, or similar abstraction
- * (such as mainframe AP Queues, or other Linux
- * 'device-minor' numbers etc.). Interpretation
- * is platform-dependent.
- *
- * used only when flags includes XCP_MFL_MODULE
- */
- uint32_t module_nr;
-
- /* used by systems which associate devices with
- * device handles/structs/etc. persistent state.
- * opaque pointer, usually a const pointer to
- * such aux structs, MAY be stored here.
- *
- * interpretation is platform-dependent.
- * used only when flags includes XCP_MFL_MHANDLE
- */
- void *mhandle;
- /* diagnostics use only, when XCP_MFL_PERF is set */
- struct XCP_DomainPerf perf;
- //----- end of v1 fields -------------------------------------------
-
- uint32_t api; /* module api version*/
- //----- end of v2 fields -------------------------------------------
-} *XCP_Module_t ;
-
-typedef enum {
- XCP_MFL_SOCKET = 1, /* backend is socket-attached */
- XCP_MFL_MODULE = 2, /* backends identified in
- array-of-modules */
- XCP_MFL_MHANDLE = 4, /* backends uses 'module handle' field */
- XCP_MFL_PERF = 8, /* performance statistics collected
- * for this module, see .perf
- */
- XCP_MFL_VIRTUAL = 0x10, /* queried 'target' is a load-balancer,
- * other other group.
- */
- XCP_MFL_STRICT = 0x20, /* enable aggressive error checking,
- * see field descriptions for effect
- */
- XCP_MFL_PROBE = 0x40, /* send api query to module, to check if
- * target(s) can be used
- */
- XCP_MFL_ALW_TGT_ADD = 0x80, /* Allows it to use a target in any
- * functional and admin call without
- * adding it beforehand with
- * m_add_module()
- */
- XCP_MFL_MAX = 0xff
-} XCP_Module_Flags;
-
-
// Error Values for functions that do not return CK_RV
// general errors
#define XCP_OK 0 /* function successful
@@ -282,17 +96,15 @@ typedef enum {
* flag is not active
*/
-
/*--------------------------------------------------------------------------*/
#define XCP_COMMON_PUBLIC_H__
-#define XCP_API_VERSION 0x071d /* major[8] minor[8] */
+#define XCP_API_VERSION 0x0810 /* major[8] minor[8] */
#define XCP_API_ORDINAL 0x0004
/* increment this with every major/minor change */
-#define XCP_HOST_API_VER 0x030100 /* major[8] minor[8] fixpack[8] */
-#define XCP_RPM_VERSION XCP_HOST_API_VER /* deprecated */
+#define XCP_HOST_API_VER 0x040000 /* major[8] minor[8] fixpack[8] */
/* HSM connection information; not for PKCS11 user consumption */
#define XCP_HSM_AGENT_ID 0x5843 /* ASCII "XC" */
@@ -375,6 +187,8 @@ typedef enum {
#define CKR_IBM_TARGET_INVALID (CKR_VENDOR_DEFINED +0x10030)
+#define CKR_IBM_PQC_PARAMS_NOT_SUPPORTED (CKR_VENDOR_DEFINED +0x10031)
+
// Error returned if internal verification of crypto engines fail
#define CKR_IBM_ERROR_STATE (CKR_VENDOR_DEFINED +0x10101)
@@ -445,12 +259,18 @@ typedef enum {
#define CKM_IBM_ED448_SHA3 (CKM_VENDOR_DEFINED +0x1001f)
+// round counts are passed as mechanism parameters
+#define CKM_IBM_SIPHASH (CKM_VENDOR_DEFINED +0x10021)
+
+
// these need a strength definition
// XCP_U32_VALUE_BITS/CKA_VALUE_BITS would be sufficient; strength->K/L mapping
//
// umbrella mech for PQC/Crystals variants
#define CKM_IBM_DILITHIUM (CKM_VENDOR_DEFINED +0x10023)
// ^^^ sign/verify plus keygen only
+#define CKM_IBM_KYBER (CKM_VENDOR_DEFINED +0x10024)
+ // ^^^ en/decrypt, keygen, key transport, and (hybrid) key derivation
// SHA-3 HMAC variants
#define CKM_IBM_SHA3_224_HMAC (CKM_VENDOR_DEFINED +0x10025)
@@ -481,6 +301,10 @@ typedef enum {
ECSG_IBM_MAX = ECSG_IBM_ECSDSA_COMPR_MULTI,
} ECSG_Var_t;
+#define CK_IBM_ECSG_IBM_ECSDSA_S256 ECSG_IBM_ECSDSA_S256
+#define CK_IBM_ECSG_IBM_ECDSA_COMPR_MULTI_S256 ECSG_IBM_ECDSA_COMPR_MULTI_S256
+#define CK_IBM_ECSG_IBM_MAX ECSG_IBM_MAX
+
//--- transport additions --------------------------------------------------
#define CKM_IBM_CLEARKEY_TRANSPORT (CKM_VENDOR_DEFINED +0x20001)
@@ -565,6 +389,12 @@ typedef enum {
#define CKA_IBM_PQC_PARAMS (CKA_VENDOR_DEFINED +0x1000e)
+// query or modify login session an object is bound to
+#define CKA_IBM_LOGIN_SESSION (CKA_VENDOR_DEFINED +0x1000f)
+
+// query MAC'd spki from a private key
+#define CKA_IBM_MACED_PUBLIC_KEY_INFO (CKA_VENDOR_DEFINED +0x20002)
+
// direct access to attributes' wire form
// parameters of this attribute, if it's the only one present,
// inserted verbatim into request package
@@ -574,6 +404,9 @@ typedef enum {
// matches the key type constant for clear key Dilithium with ICSF
#define CKK_IBM_PQC_DILITHIUM (CKK_VENDOR_DEFINED +0x10023)
+#define CKK_IBM_PQC_KYBER (CKK_VENDOR_DEFINED +0x10024)
+
+
@@ -583,6 +416,7 @@ typedef enum {
#define XCP_MOD_ERROR_STATE_SYSTEST_CMD 0x00000003
#define XCP_MOD_ERROR_STATE_TRNG_HEALTH 0x00000004
+
/*----------------------------------------------------------------------------
* sizes related to blobs and host-visible entities
*
@@ -599,10 +433,10 @@ typedef enum {
#define XCP_BLOBCLRATTR_BYTES 8 /* clear blob attr's bytecount */
/* keep in sync with objattr_t */
#define XCP_BLOBCLRMODE_BYTES 8 /* clear blob modefield bytecount */
-#define MOD_WRAP_BLOCKSIZE ((size_t) (128 /8)) /* blob crypt block bytecount */
+#define XCP_WRAP_BLOCKSIZE ((size_t) (128 /8)) /* blob crypt block bytecount */
#define XCP_MACKEY_BYTES (256 /8) /* derived from controlling WK */
//
-#define XCP_PIN_SALT_BYTES MOD_WRAP_BLOCKSIZE
+#define XCP_PIN_SALT_BYTES XCP_WRAP_BLOCKSIZE
#define XCP_PINBLOB_BYTES \
(XCP_WK_BYTES +XCP_PIN_SALT_BYTES +XCP_HMAC_BYTES)
@@ -664,6 +498,18 @@ typedef enum {
#define XCP_BTC_VERSION 1
+#define XCP_KYBER_KEM_VERSION 0
+
+#define XCP_KYBER_KEM_MIN_WIRE_BYTES (4 + 4 + 4 + 4 + 4 + 4) /* version[32] ||
+ kdf[32] ||
+ mode[32] ||
+ cphr[32] ||
+ shrd[32] ||
+ blob [32] */
+
+#define XCP_KYBER_RAW_BYTES 32
+
+
#define XCP_ECDH1_DERIVE_MAX_PUBLIC_BYTES 1024 /* limit public data length to
reasonable number of bytes */
//
@@ -698,6 +544,8 @@ typedef enum {
// related to the protected-key capability
// see also CKA_IBM_PROTKEY_* description
+ CKF_IBM_HW_DUAL_OA = 0x1000, // module supports dual OA certs/signatures
+ // see CK_IBM_XCPXQ_OA_CAP for more details
} XCP_CK_EXTFLAGS_t;
// these numbers apply to current version, subject to change
@@ -720,7 +568,7 @@ typedef enum {
// ~arbitrary limit on acceptable admin. certificates
// additional limits, such as transport-bytecount, may restrict further
-#define XCP_CERT_MAX_BYTES ((size_t) 4096)
+#define XCP_CERT_MAX_BYTES ((size_t) 12288) /* fits dil certs (8k + meta) */
#define XCP_CERTHASH_BYTES (256/8)
/* hash or SKI of public key, or other hash-identified things; SHA-256 */
@@ -734,6 +582,9 @@ typedef enum {
/* ^^^ increase this when policy moves beyond shorter curves */
#define XCP_MAX_EC_CURVE_BITS 521
+#define XCP_MAX_DIL_SIGNATURE_BYTES 4668 /* max. length of dil. 8-7 sigs */
+#define XCP_MAX_SINFO_META_BYTES 100 /* signer info framework bytes */
+
/* bytecount of raw (generic) keys, not key schedules */
#define MOD_MAX_SYMMKEY_BYTES 256
@@ -754,8 +605,20 @@ typedef enum {
/* trailing big-endian bitcount field after UnwrapKey() checksum */
/* card(OA) signature bytecount: SKI-identified SignerInfo,
- 4096-bit RSA signature, with SHA-256 hash */
-#define XCP_RSPSIG_MAX_BYTES (75 +4096/8)
+ * Non quantum safe: Must contain space for either:
+ * - 4096-bit RSA signature, hash OID, encr. OID and SKI
+ * - EC-P521 signature, hash OID, encr. OID and SKI
+ */
+#define XCP_RSPSIG_RSA (4096 / 8)
+#define XCP_RSPSIG_MAX_BYTES (XCP_MAX_SINFO_META_BYTES + \
+ XCP_RSPSIG_RSA)
+
+/* card(OA) signature bytecount: SKI-identified SignerInfo,
+ * Quantum safe: Must contain space for:
+ * - DIL signature, hash OID, encr. OID and SKI
+ */
+#define XCP_RSPSIG_QS_MAX_BYTES (XCP_MAX_SINFO_META_BYTES + \
+ XCP_MAX_DIL_SIGNATURE_BYTES)
/* minimal padding for raw RSA enc/dec/sign/ver/wr/unwr
* Used for example in CKM_RSA_PKCS. See RFC 2313 chapter 8 for a complete
@@ -772,84 +635,85 @@ typedef enum {
/* indicates particular events, not generic event types/categories, */
/* if bits in this region are non-zero */
-typedef enum { /* functionality categories: keep within uint16_t range */
- XCP_LOGEV_QUERY = 0,
- XCP_LOGEV_FUNCTION = 1,
- XCP_LOGEV_ADMFUNCTION = 2,
- XCP_LOGEV_STARTUP = 3,
- XCP_LOGEV_SHUTDOWN = 4,
- XCP_LOGEV_SELFTEST = 5,
- XCP_LOGEV_DOM_IMPORT = 6, /* import sec-relevant data to domain */
- XCP_LOGEV_DOM_EXPORT = 7, /* export sec-relevant data from domain */
- XCP_LOGEV_FAILURE = 8,
- XCP_LOGEV_GENERATE = 9,
- XCP_LOGEV_REMOVE = 10,
- XCP_LOGEV_SPECIFIC = 11, /* obtain meaning elsewhere */
- XCP_LOGEV_STATE_IMPORT = 12, /* import to card/multiple domains */
- XCP_LOGEV_STATE_EXPORT = 13, /* export from card/multiple domains */
- /* [after successful export] */
- XCP_LOGEV_IMPORT = 14, /* key/state import (UnwrapKey) */
- /* fields provide more context */
- XCP_LOGEV_EXPORT = 15, /* key/state import (WrapKey) */
- /* fields provide more context */
-
- /*--- specific events (any including XCP_LOGEV_SPEC) ---------*/
-
- XCP_LOGSPEV_TRANSACT_ZEROIZE = XCP_LOGEV_SPEC +1,
- /* zeroize card by transaction */
-
- XCP_LOGSPEV_KAT_FAILED = XCP_LOGEV_SPEC +2,
- /* algorithm selftest failed */
-
- XCP_LOGSPEV_KAT_COMPLETED = XCP_LOGEV_SPEC +3,
- /* algorithm selftests completed */
- /* redundant; logged only to */
- /* provide specific event */
-
- XCP_LOGSPEV_EARLY_Q_START = XCP_LOGEV_SPEC +4,
- /* subsequent events were found */
- /* in the early-event queue. */
- /* their timestamps are only */
- /* approximate; order is correct */
-
- XCP_LOGSPEV_EARLY_Q_END = XCP_LOGEV_SPEC +5,
- /* early-even queue processing ends. */
- /* subsequent events are through */
- /* regular auditing, with valid */
- /* timestamps and ordering. */
-
- XCP_LOGSPEV_AUDIT_NEWCHAIN = XCP_LOGEV_SPEC +6,
- /* audit state is corrupted; removed. */
- /* generating new instance and start */
- /* new chain as a replacement */
-
- XCP_LOGSPEV_TIMECHG_BEFORE = XCP_LOGEV_SPEC +7,
- /* time change: original time */
-
- XCP_LOGSPEV_TIMECHG_AFTER = XCP_LOGEV_SPEC +8,
- /* time change: updated time */
-
- XCP_LOGSPEV_MODSTIMPORT_START = XCP_LOGEV_SPEC +9,
- /* accepted full-state import */
- /* data structure */
- /* starting update procedure */
-
- XCP_LOGSPEV_MODSTIMPORT_FAIL = XCP_LOGEV_SPEC +10,
- /* rejected import structure */
- /* issued after initial verify; */
- /* indicates some inconsistency */
- /* of import data structures */
-
- XCP_LOGSPEV_MODSTIMPORT_END = XCP_LOGEV_SPEC +11,
- /* completed full-state import */
-
- XCP_LOGSPEV_MODSTEXPORT_START = XCP_LOGEV_SPEC +12,
- /* started full-state export */
- /* see also: XCP_LOGEV_STATE_EXPORT */
-
- XCP_LOGSPEV_MODSTEXPORT_FAIL = XCP_LOGEV_SPEC +13
- /* full-state export did not complete */
-} XCP_LogEvent_t;
+ /* functionality categories: keep within uint16_t range */
+#define XCP_LOGEV_QUERY 0
+#define XCP_LOGEV_FUNCTION 1
+#define XCP_LOGEV_ADMFUNCTION 2
+#define XCP_LOGEV_STARTUP 3
+#define XCP_LOGEV_SHUTDOWN 4
+#define XCP_LOGEV_SELFTEST 5
+#define XCP_LOGEV_DOM_IMPORT 6 /* import sec-relevant data to */
+ /* domain */
+#define XCP_LOGEV_DOM_EXPORT 7 /* export sec-relevant data from */
+ /* domain */
+#define XCP_LOGEV_FAILURE 8
+#define XCP_LOGEV_GENERATE 9
+#define XCP_LOGEV_REMOVE 10
+#define XCP_LOGEV_SPECIFIC 11 /* obtain meaning elsewhere */
+#define XCP_LOGEV_STATE_IMPORT 12 /* import to card/multiple domains */
+#define XCP_LOGEV_STATE_EXPORT 13 /* export from card/multiple */
+ /* domains */
+ /* [after successful export] */
+#define XCP_LOGEV_IMPORT 14 /* key/state import (UnwrapKey) */
+ /* fields provide more context */
+#define XCP_LOGEV_EXPORT 15 /* key/state import (WrapKey) */
+ /* fields provide more context */
+
+ /*--- specific events (any including XCP_LOGEV_SPEC) ---------*/
+
+#define XCP_LOGSPEV_TRANSACT_ZEROIZE (XCP_LOGEV_SPEC +1)
+ /* zeroize card by transaction */
+
+#define XCP_LOGSPEV_KAT_FAILED (XCP_LOGEV_SPEC +2)
+ /* algorithm selftest failed */
+
+#define XCP_LOGSPEV_KAT_COMPLETED (XCP_LOGEV_SPEC +3)
+ /* algorithm selftests completed */
+ /* redundant; logged only to */
+ /* provide specific event */
+
+#define XCP_LOGSPEV_EARLY_Q_START (XCP_LOGEV_SPEC +4)
+ /* subsequent events were found */
+ /* in the early-event queue. */
+ /* their timestamps are only */
+ /* approximate; order is correct */
+
+#define XCP_LOGSPEV_EARLY_Q_END (XCP_LOGEV_SPEC +5)
+ /* early-even queue processing ends. */
+ /* subsequent events are through */
+ /* regular auditing, with valid */
+ /* timestamps and ordering. */
+
+#define XCP_LOGSPEV_AUDIT_NEWCHAIN (XCP_LOGEV_SPEC +6)
+ /* audit state is corrupted; removed. */
+ /* generating new instance and start */
+ /* new chain as a replacement */
+
+#define XCP_LOGSPEV_TIMECHG_BEFORE (XCP_LOGEV_SPEC +7)
+ /* time change: original time */
+
+#define XCP_LOGSPEV_TIMECHG_AFTER (XCP_LOGEV_SPEC +8)
+ /* time change: updated time */
+
+#define XCP_LOGSPEV_MODSTIMPORT_START (XCP_LOGEV_SPEC +9)
+ /* accepted full-state import */
+ /* data structure */
+ /* starting update procedure */
+
+#define XCP_LOGSPEV_MODSTIMPORT_FAIL (XCP_LOGEV_SPEC +10)
+ /* rejected import structure */
+ /* issued after initial verify; */
+ /* indicates some inconsistency */
+ /* of import data structures */
+
+#define XCP_LOGSPEV_MODSTIMPORT_END (XCP_LOGEV_SPEC +11)
+ /* completed full-state import */
+
+#define XCP_LOGSPEV_MODSTEXPORT_START (XCP_LOGEV_SPEC +12)
+ /* started full-state export */
+ /* see also: XCP_LOGEV_STATE_EXPORT */
+
+#define XCP_LOGSPEV_MODSTEXPORT_FAIL (XCP_LOGEV_SPEC +13)
typedef enum {
@@ -863,21 +727,19 @@ typedef enum {
} XCP_LogSystem_t;
/* bitmask of audit-event flags (mainly optional fields) */
-typedef enum {
- XCP_LOGFL_WK_PRESENT = 0x80000000,
- XCP_LOGFL_COMPLIANCE_PRESENT = 0x40000000, /* ...of hosting domain */
- XCP_LOGFL_FINALWK_PRESENT = 0x20000000,
- XCP_LOGFL_KEYREC0_PRESENT = 0x10000000,
- XCP_LOGFL_KEYREC0_COMPL = 0x08000000, /* key0 compliance */
- XCP_LOGFL_KEYREC1_PRESENT = 0x04000000,
- XCP_LOGFL_KEYREC2_PRESENT = 0x02000000,
- XCP_LOGFL_FINTIME_PRESENT = 0x01000000,
- XCP_LOGFL_SALT0_PRESENT = 0x00800000,
- XCP_LOGFL_SALT1_PRESENT = 0x00400000,
- XCP_LOGFL_SALT2_PRESENT = 0x00200000,
- XCP_LOGFL_REASON_PRESENT = 0x00100000,
- XCP_LOGFL_SEQPRF_PRESENT = 0x00080000
-} XCP_LogFlags_t;
+#define XCP_LOGFL_WK_PRESENT 0x80000000
+#define XCP_LOGFL_COMPLIANCE_PRESENT 0x40000000 /* ...of hosting domain */
+#define XCP_LOGFL_FINALWK_PRESENT 0x20000000
+#define XCP_LOGFL_KEYREC0_PRESENT 0x10000000
+#define XCP_LOGFL_KEYREC0_COMPL 0x08000000 /* key0 compliance */
+#define XCP_LOGFL_KEYREC1_PRESENT 0x04000000
+#define XCP_LOGFL_KEYREC2_PRESENT 0x02000000
+#define XCP_LOGFL_FINTIME_PRESENT 0x01000000
+#define XCP_LOGFL_SALT0_PRESENT 0x00800000
+#define XCP_LOGFL_SALT1_PRESENT 0x00400000
+#define XCP_LOGFL_SALT2_PRESENT 0x00200000
+#define XCP_LOGFL_REASON_PRESENT 0x00100000
+#define XCP_LOGFL_SEQPRF_PRESENT 0x00080000
@@ -885,16 +747,26 @@ typedef enum {
typedef enum {
XCP_IMPRKEY_RSA_2048 = 0,
XCP_IMPRKEY_RSA_4096 = 1,
- XCP_IMPRKEY_EC_P256 = 2, /* EC, NIST P-256 */
- XCP_IMPRKEY_EC_P521 = 3, /* EC, NIST P-521 */
- XCP_IMPRKEY_EC_BP256r = 4, /* EC, Brainpool BP-256r */
- XCP_IMPRKEY_EC_BP320r = 5, /* EC, Brainpool BP-320r */
- XCP_IMPRKEY_EC_BP512r = 6, /* EC, Brainpool BP-512r */
+ XCP_IMPRKEY_EC_P256 = 2, /* EC, NIST P-256 */
+ XCP_IMPRKEY_EC_P521 = 3, /* EC, NIST P-521 */
+ XCP_IMPRKEY_EC_BP256r = 4, /* EC, Brainpool BP-256r */
+ XCP_IMPRKEY_EC_BP320r = 5, /* EC, Brainpool BP-320r */
+ XCP_IMPRKEY_EC_BP512r = 6, /* EC, Brainpool BP-512r */
XCP_IMPRKEY_RSA_3072 = 7,
- XCP_IMPRKEY_MAX = XCP_IMPRKEY_RSA_3072
+ XCP_IMPRKEY_EC_P521_TKE = 8, /* EC, NIST P-521 (TKE propr. sign.) */
+ XCP_IMPRKEY_MAX = XCP_IMPRKEY_EC_P521_TKE
} XCP_IMPRKEY_t;
+//--- OA key types ----------------------------------------------------
+typedef enum {
+ XCP_OAKEY_RSA_4096 = 1, /* RSA 4096 bit */
+ XCP_OAKEY_ECC_P521 = 2, /* ECC NIST P-521 */
+ XCP_OAKEY_DIL_87R2 = 3, /* DIL 8-7 R2 */
+ XCP_OAKEY_MAX = XCP_OAKEY_DIL_87R2
+} XCP_OAKEY_t;
+
+
//--- retained key structures ---------------------------
// initial loading:
@@ -914,6 +786,7 @@ typedef struct CK_RETAINEDKEY_PARAMS {
+
//--- operation categories (perf. measurement) -----------------------------
typedef enum {
XCP_OPCAT_ASYMM_SLOW = 1,
@@ -951,7 +824,12 @@ typedef enum {
/* never be enabled due to */
/* policy-minimum restrictions. */
- CK_IBM_XCPQ_MAX = CK_IBM_XCPQ_CP_BLACKLIST
+ CK_IBM_XCPQ_PQC_STRENGTHS
+ = 14, /* supported quantum safe levels*/
+ /* of strength */
+ /* see: XCP_PQCStrength_t */
+
+ CK_IBM_XCPQ_MAX = CK_IBM_XCPQ_PQC_STRENGTHS
} CK_IBM_XCPQUERY_t;
//--- module sub-query sub-types --------------------------------------------
@@ -966,6 +844,9 @@ typedef enum {
/* attributes bitmask */
CK_IBM_XCPMSQ_ATTRS = 6, /* number of supported */
/* administrative attributes */
+ CK_IBM_XCPMSQ_MOD_V2 = 7, /* add version two fields to */
+ /* module query */
+ CK_IBM_XCPMSQ_MAX = CK_IBM_XCPMSQ_MOD_V2
} CK_IBM_XCPMSUBQUERY_t;
// byte sizes of queries which are not represented as structures
@@ -976,48 +857,34 @@ typedef enum {
#define CK_IBM_XCP_HOSTQ_IDX 0xff000000 /* host-only queries index, min. */
-typedef enum {
- CK_IBM_XCPHQ_COUNT = 0xff000000, /* number of host-query indexes */
- /* including this type itself */
- CK_IBM_XCPHQ_VERSION = 0xff000001, /* host-specific package version */
- /* such as packaging library ID */
- CK_IBM_XCPHQ_VERSION_HASH = 0xff000002,
- /* assumed-unique identifier of */
- /* host code, such as version- */
- /* identifying cryptographic hash */
- /* (library signature field...) */
- CK_IBM_XCPHQ_DIAGS = 0xff000003, /* host code diagnostic level */
- /* 0 if non-diagnostics host code */
- CK_IBM_XCPHQ_HVERSION = 0xff000004, /* human-readable host version */
- /* identification (recommended: */
- /* UTF-8 string) */
- CK_IBM_XCPHQ_TGT_MODE = 0xff000005, /* host targeting modes */
- /* returns supported target modes */
- /* as bitmask */
- /* if not available only compat */
- /* target mode is in use */
- /* See CK_IBM_XCPHQ_TGT_MODES_t */
- CK_IBM_XCPHQ_ECDH_DERPRM = 0xff000006,
- /* ECDH DeriveKey parameter usage */
- /* is being enforced with hostlib */
- /* version */
- /**/
- CK_IBM_XCPHQ_TOL_MODES = 0xff000007,/* check if toleration mode for */
- /* key attribute checking is */
- /* enabled */
- /* If it is, some attribute values*/
- /* are always set to correct */
- /* values automatically - */
- CK__IBM_XCPHQ_MAX = CK_IBM_XCPHQ_TGT_MODE
-} CK_IBM_XCPHQUERY_t;
-
-#define CK_IBM_XCPHQ_ATTR_TOL_ENABLED 0x00000001
- /* flag to indicate that toleration */
- /* mode for key attribute checking */
- /* is enabled i.e. all attributes */
- /* that may no longer be set CK_TRUE */
- /* using a CEX8S HSM will be reset */
- /* to CK_FALSE automatically */
+#define CK_IBM_XCPHQ_COUNT 0xff000000 /* number of host-query indexes */
+ /* including this type itself */
+#define CK_IBM_XCPHQ_VERSION 0xff000001 /* host-specific package version */
+ /* such as packaging library ID */
+#define CK_IBM_XCPHQ_VERSION_HASH 0xff000002
+ /* assumed-unique identifier of */
+ /* host code, such as version- */
+ /* identifying cryptographic hash*/
+ /* (library signature field...) */
+#define CK_IBM_XCPHQ_DIAGS 0xff000003 /* host code diagnostic level */
+ /* 0 if non-diagnostics host code*/
+#define CK_IBM_XCPHQ_HVERSION 0xff000004 /* human-readable host version */
+ /* identification (recommended: */
+ /* UTF-8 string) */
+#define CK_IBM_XCPHQ_TGT_MODE 0xff000005 /* host targeting modes */
+ /* returns supported target modes*/
+ /* as bitmask */
+ /* if not available only compat */
+ /* target mode is in use */
+ /* See CK_IBM_XCPHQ_TGT_MODES_t */
+#define CK_IBM_XCPHQ_ECDH_DERPRM 0xff000006
+ /* ECDH DeriveKey parameter usage*/
+ /* is being enforced with hostlib*/
+ /* version */
+ /**/
+
+#define CK__IBM_XCPHQ_MAX CK_IBM_XCPHQ_TGT_MODE
+
typedef enum {
CK_IBM_XCPHQ_TGT_MODES_TGTGRP = 1, /* target groups are supported */
@@ -1040,7 +907,6 @@ typedef enum {
CK_IBM_XCPXQ_IMPEXP_CAPS = 7, /* capability for WK and state */
/* export / import. See 8.7.1.1.1 */
/* for more info */
- CK_IBM_XCPXQ_DOMIMPORT_VER = 7, /* DEPRECATED */
CK_IBM_XCPXQ_CERT_MAXBYTES = 8, /* bytecount of largest accepted */
/* administrative certificate, if */
/* there is an upper limit. 0 if */
@@ -1058,20 +924,20 @@ typedef enum {
CK_IBM_XCPXQ_ECDSA_OTHER = 15, /* bitmask of supported, other EC
signing mechanisms */
+ CK_IBM_XCPXQ_OA_CAP = 16, /* bitmask of supported outbound
+ authority signing mechanisms */
- CK_IBM_XCPXQ_MAXIDX = CK_IBM_XCPXQ_ECDSA_OTHER,
+ CK_IBM_XCPXQ_MAXIDX = CK_IBM_XCPXQ_OA_CAP,
} CK_IBM_XCPEXTCAP_t;
-typedef enum {
- CK_IBM_DOM_ADMIND = 1, /* administrators present */
- CK_IBM_DOM_CURR_WK = 2, /* domain has current WK */
- CK_IBM_DOM_NEXT_WK = 4, /* domain has pending/next WK */
- CK_IBM_DOM_COMMITTED_NWK = 8, /* next WK is active(committed) */
- CK_IBM_DOM_IMPRINTED = 0x10, /* has left imprint mode */
- CK_IBM_DOM_IMPRINTS = 0x80000000, /* enforces imprint mode */
- CK_IBM_DOM_PROTKEY_ALLOW = 0x20 /* policies allow protected key */
-} CK_IBM_DOMAINQ_t;
+#define CK_IBM_DOM_ADMIND 1 /* administrators present */
+#define CK_IBM_DOM_CURR_WK 2 /* domain has current WK */
+#define CK_IBM_DOM_NEXT_WK 4 /* domain has pending/next WK */
+#define CK_IBM_DOM_COMMITTED_NWK 8 /* next WK is active(committed) */
+#define CK_IBM_DOM_IMPRINTED 0x10 /* has left imprint mode */
+#define CK_IBM_DOM_IMPRINTS 0x80000000 /* enforces imprint mode */
+#define CK_IBM_DOM_PROTKEY_ALLOW 0x20 /* policies allow protected key */
//
// note: CK_IBM_DOM_IMPRINTS will go away
@@ -1142,34 +1008,54 @@ typedef CK_IBM_XCPAPI_INFO CK_PTR CK_IBM_XCPAPI_INFO_PTR;
CK_BYTE infra_count; \
CK_BYTE comp_count;
+#define CK_IBM_XCP_ADMATTRLIST_MEMBER_V2 \
+ CK_BYTE perm_ext01_modes[ 8 ];
+
+#define CK_IBM_XCP_ADMATTRCOUNT_MEMBER_V2 \
+ CK_BYTE perm_ext01_count;
+
// see chapter 5.1.1. in the wire spec
typedef struct CK_IBM_XCP_INFO {
- CK_IBM_XCP_INFO_MEMBERS_V0;
+ CK_IBM_XCP_INFO_MEMBERS_V0
} CK_IBM_XCP_INFO;
//
// see chapter 5.1.1. in the wire spec
typedef struct CK_IBM_XCP_INFO_V1 {
- CK_IBM_XCP_INFO_MEMBERS_V0;
- CK_IBM_XCP_DESCINFO_MEMBER;
+ CK_IBM_XCP_INFO_MEMBERS_V0
+ CK_IBM_XCP_DESCINFO_MEMBER
CK_BYTE fnid_mask[ 16 ];
CK_BYTE fnid_count;
- CK_IBM_XCP_ADMATTRLIST_MEMBER;
- CK_IBM_XCP_ADMATTRCOUNT_MEMBER;
+ CK_IBM_XCP_ADMATTRLIST_MEMBER
+ CK_IBM_XCP_ADMATTRCOUNT_MEMBER
} CK_IBM_XCP_INFO_V1;
//
+// see chapter 5.1.1. in the wire spec
+typedef struct CK_IBM_XCP_INFO_V2 {
+ CK_IBM_XCP_INFO_MEMBERS_V0
+ CK_IBM_XCP_DESCINFO_MEMBER
+ CK_BYTE fnid_mask[ 16 ];
+ CK_BYTE fnid_count;
+ CK_IBM_XCP_ADMATTRLIST_MEMBER
+ CK_IBM_XCP_ADMATTRCOUNT_MEMBER
+ CK_IBM_XCP_ADMATTRLIST_MEMBER_V2
+ CK_IBM_XCP_ADMATTRCOUNT_MEMBER_V2
+} CK_IBM_XCP_INFO_V2;
+//
// see chapter 5.1.1.1. in the wire spec
typedef struct CK_IBM_XCP_DESCINFO {
- CK_IBM_XCP_DESCINFO_MEMBER;
+ CK_IBM_XCP_DESCINFO_MEMBER
} CK_IBM_XCP_DESCINFO;
//
// see chapter 5.1.1.3. in the wire spec
typedef struct CK_IBM_XCP_ATTRLIST {
CK_IBM_XCP_ADMATTRLIST_MEMBER
+ CK_IBM_XCP_ADMATTRLIST_MEMBER_V2
} CK_IBM_XCP_ATTRLIST;
//
// see chapter 5.1.1.3. in the wire spec
typedef struct CK_IBM_XCP_ATTRCOUNT {
CK_IBM_XCP_ADMATTRCOUNT_MEMBER
+ CK_IBM_XCP_ADMATTRCOUNT_MEMBER_V2
} CK_IBM_XCP_ATTRCOUNT;
/**/
@@ -1177,14 +1063,18 @@ typedef struct CK_IBM_XCP_ATTRCOUNT {
{ 0,0, {0,0,},{0,0,}, {0,},{0,},{0,}, {0,},{0,}, \
0,0, 0,0, 0,0,0,0,0,0,0, 0,0,0, }
-typedef CK_IBM_XCP_INFO CK_PTR CK_IBM_XCP_INFO_PTR;
-typedef CK_IBM_XCP_INFO_V1 CK_PTR CK_IBM_XCP_INFO_V1_PTR;
-typedef CK_IBM_XCP_DESCINFO CK_PTR CK_IBM_XCP_DESCINFO_PTR;
-typedef CK_IBM_XCP_ATTRLIST CK_PTR CK_IBM_XCP_ATTRLIST_PTR;
-typedef CK_IBM_XCP_ATTRCOUNT CK_PTR CK_IBM_XCP_ATTRCOUNT_PTR;
+#define CK_IBM_XCP_INFO_V2_INIT0 \
+ { 0,0, {0,0,},{0,0,}, {0,},{0,},{0,}, {0,},{0,}, \
+ 0,0, 0,0, 0,0,0,0,0,0,0, 0,0,0, \
+ {0}, {0}, {0}, 0, {0}, {0}, {0}, 0, 0, 0, \
+ {0}, 0}
-// DEPRECATED - use CK_IBM_XCP_INFO
-typedef CK_IBM_XCP_INFO CK_IBM_EP11_INFO;
+typedef CK_IBM_XCP_INFO CK_PTR CK_IBM_XCP_INFO_PTR;
+typedef CK_IBM_XCP_INFO_V1 CK_PTR CK_IBM_XCP_INFO_V1_PTR;
+typedef CK_IBM_XCP_INFO_V2 CK_PTR CK_IBM_XCP_INFO_V2_PTR;
+typedef CK_IBM_XCP_DESCINFO CK_PTR CK_IBM_XCP_DESCINFO_PTR;
+typedef CK_IBM_XCP_ATTRLIST CK_PTR CK_IBM_XCP_ATTRLIST_PTR;
+typedef CK_IBM_XCP_ATTRCOUNT CK_PTR CK_IBM_XCP_ATTRCOUNT_PTR;
typedef struct CK_IBM_DOMAIN_INFO {
CK_ULONG domain;
@@ -1227,9 +1117,31 @@ typedef enum {
} CK_IBM_BTC_t;
+typedef enum {
+ XCP_KEM_ENCAPSULATE = 1,
+ XCP_KEM_DECAPSULATE = 2,
+} XCP_KEM_t;
+
+typedef CK_ULONG CK_IBM_KEM_MODE;
+
+#define CK_IBM_KEM_ENCAPSULATE XCP_KEM_ENCAPSULATE
+#define CK_IBM_KEM_DECAPSULATE XCP_KEM_DECAPSULATE
+
+typedef struct XCP_KYBER_KEM_PARAMS {
+ CK_ULONG version;
+ CK_IBM_KEM_MODE mode;
+ CK_ULONG kdf;
+ CK_BBOOL prepend;
+ CK_BYTE *pCipher;
+ CK_ULONG ulCipherLen;
+ CK_BYTE *pSharedData;
+ CK_ULONG ulSharedDataLen;
+ CK_BYTE *pBlob;
+ CK_ULONG ulBlobLen;
+} XCP_KYBER_KEM_PARAMS_t;
+
+
//--- attribute constants --------------------------------------------------
-// keep in sync with unprivileged object (XCP_BLOB_NO_RIGHTS)
-// table is parsed by automated tools; please do not change layout
//
typedef enum {
XCP_BLOB_EXTRACTABLE = 1,
@@ -1309,8 +1221,8 @@ typedef enum {
/* CP sets get padded to multiple */
typedef enum {
- XCP_CPB_ADD_CPBS = 0, // allow addition (activation) of CP bits
- XCP_CPB_DELETE_CPBS = 1, // disable activating further control points
+ XCP_CPB_ADD_CPBS = 0, // allow activation of CP bits
+ XCP_CPB_DELETE_CPBS = 1, // allow deactivation of CP bits
// (remove both ADD_CPBs and DELETE_CPBs
// to make unit read-only)
@@ -1424,8 +1336,12 @@ typedef enum {
XCP_CPB_COMPAT_LEGACY_SHA3 = 70, // allow fall-back to non-standard
// SHA3 defaults
-
- XCP_CPBITS_MAX = XCP_CPB_COMPAT_LEGACY_SHA3 // marks last used CPB
+ XCP_CPB_DSA_PARAMETER_GEN = 71, // allow DSA/PQG parameter generation
+ XCP_CPB_DERIVE_NON_AB_KEYS = 72, // allow the derivation of a non-AB or raw
+ // from an AB key. Only relevant if
+ // XCP_CPB_NON_ATTRBOUND
+ XCP_CPBITS_MAX = XCP_CPB_DERIVE_NON_AB_KEYS
+ // marks last used CPB
} XCP_CPbit_t;
@@ -1623,7 +1539,7 @@ typedef enum {
// blob/SPKI
XCP_ADM_DOMAINS_ZEROIZE = 36, // multi-domain zeroize
// XCP_ADM_EXPORT_NEXT_WK = 38, // placeholder, find real entry above
- XCP_ADM_SESSIONS_DROP = 39, // drop all open sessions
+ XCP_ADM_SESSION_REMOVE = 39, // remove all or selected sessions
XCP_ADMQ_ADMIN = 1 | XCP_ADM_QUERY, // admin SKI/cert
XCP_ADMQ_DOMADMIN = 2 | XCP_ADM_QUERY, // domain adm. SKI/cert
@@ -1648,10 +1564,11 @@ typedef enum {
// current migration importer
XCP_ADMQ_AUDIT_STATE = 16 | XCP_ADM_QUERY,
// audit state entry or event count
- XCP_ADMQ_LASTCMD_DOM_MASK = 17 | XCP_ADM_QUERY
+ XCP_ADMQ_LASTCMD_DOM_MASK = 17 | XCP_ADM_QUERY,
// domain-bitmask affected by last
// state-related administrative
// command (export, import)
+ XCP_ADMQ_SVCADMIN = 18 | XCP_ADM_QUERY, // svc admin SKI/cert
} XCP_Admcmd_t;
typedef enum {
@@ -1660,7 +1577,8 @@ typedef enum {
XCP_ADMINT_PERMS = 3, // permissions
XCP_ADMINT_MODE = 4, // operating mode
XCP_ADMINT_STD = 5, // standards' compliance
- XCP_ADMINT_IDX_MAX = XCP_ADMINT_STD
+ XCP_ADMINT_PERMS_EXT01 = 6, // permissions (extension #1)
+ XCP_ADMINT_IDX_MAX = XCP_ADMINT_PERMS_EXT01
} XCP_AdmAttr_t;
#define XCP_ADMIN_ATTRIBUTE_COUNT XCP_ADMINT_IDX_MAX
@@ -1719,6 +1637,29 @@ typedef enum {
#define XCP_ADMP_CHG_DO_NOT_DISTURB \
0x80000000 // allow changing the corresponding
// Do Not Disturb bit
+
+//
+// permissions (extension 01)
+//
+#define XCP_ADMP_NQS_OA_SIGNATURES 1 // enable non-quantum-safe OA signat.
+#define XCP_ADMP_QS_OA_SIGNATURES 2 // enable quantum-safe OA signatures
+#define XCP_ADMP_NQS_ADM_SIGNATURES 4 // enable non-quantum-safe adm signat.
+#define XCP_ADMP_QS_ADM_SIGNATURES 8 // enable quantum-safe adm signatures
+
+#define XCP_ADMP_CHG_NQS_OA_SIGNATURES \
+ 0x10000 // allow changing the corresponding
+ // non-quantum-safe OA signature bit
+#define XCP_ADMP_CHG_QS_OA_SIGNATURES \
+ 0x20000 // allow changing the corresponding
+ // quantum-safe OA signature bit
+#define XCP_ADMP_CHG_NQS_ADM_SIGNATURES \
+ 0x40000 // allow changing the corresponding
+ // non-quantum-safe adm signature bit
+#define XCP_ADMP_CHG_QS_ADM_SIGNATURES \
+ 0x80000 // allow changing the corresponding
+ // quantum-safe adm signature bit
+
+
//
// if adding other change-control bits, also update:
// prevented_perm_changes()
@@ -1754,15 +1695,49 @@ typedef enum {
XCP_ADMP_STATE_1PART | \
XCP_ADMP_DO_NOT_DISTURB)
//
+// CHGBITS / PERMS (extension 01)
+#define XCP_ADMP__CHGBITS_EXT01 \
+ (XCP_ADMP_CHG_NQS_OA_SIGNATURES | \
+ XCP_ADMP_CHG_QS_OA_SIGNATURES | \
+ XCP_ADMP_CHG_NQS_ADM_SIGNATURES | \
+ XCP_ADMP_CHG_QS_ADM_SIGNATURES)
+//
+#define XCP_ADMP__PERMS_EXT01 \
+ (XCP_ADMP_NQS_OA_SIGNATURES | \
+ XCP_ADMP_QS_OA_SIGNATURES | \
+ XCP_ADMP_NQS_ADM_SIGNATURES | \
+ XCP_ADMP_QS_ADM_SIGNATURES)
+//
+#define XCP__ADMP_SUP_EXT01 (XCP_ADMP__PERMS_EXT01 | \
+ XCP_ADMP__CHGBITS_EXT01)
+//
+//
#define XCP_ADMP__DEFAULT \
(XCP_ADMP_WK_IMPORT | \
XCP_ADMP_1SIGN | \
XCP_ADMP__CHGBITS)
//
+#define XCP_ADMP__DEFAULT_EXT01 \
+ (XCP_ADMP__CHGBITS_EXT01 | \
+ XCP_ADMP_NQS_OA_SIGNATURES | \
+ XCP_ADMP_QS_OA_SIGNATURES | \
+ XCP_ADMP_NQS_ADM_SIGNATURES | \
+ XCP_ADMP_QS_ADM_SIGNATURES)
+//
#define XCPM_ADMP__MODULE_DEFAULTS_MASK \
(XCP_ADMP_DO_NOT_DISTURB | \
XCP_ADMP_CHG_DO_NOT_DISTURB)
//
+#define XCPM_ADMP__MODULE_DEFAULTS_MASK_EXT01 \
+ (XCP_ADMP_NQS_OA_SIGNATURES | \
+ XCP_ADMP_CHG_NQS_OA_SIGNATURES | \
+ XCP_ADMP_QS_OA_SIGNATURES | \
+ XCP_ADMP_CHG_QS_OA_SIGNATURES | \
+ XCP_ADMP_NQS_ADM_SIGNATURES | \
+ XCP_ADMP_CHG_NQS_ADM_SIGNATURES | \
+ XCP_ADMP_QS_ADM_SIGNATURES | \
+ XCP_ADMP_CHG_QS_ADM_SIGNATURES)
+//
#define XCP_ADMP__CARD_MASK \
~(XCP_ADMP_WK_IMPORT | \
XCP_ADMP_WK_EXPORT | \
@@ -1775,6 +1750,9 @@ typedef enum {
XCP_ADMP_CHG_WK_RANDOM | \
XCP_ADMP_CHG_CP_1SIGN)
//
+#define XCP_ADMP__CARD_MASK_EXT01 \
+ ~(0U)
+//
#define XCP_ADMP__DOM_MASK \
~(XCP_ADMP_NO_DOMAIN_IMPRINT | \
XCP_ADMP_STATE_IMPORT | \
@@ -1784,6 +1762,12 @@ typedef enum {
XCP_ADMP_CHG_ST_EXPORT | \
XCP_ADMP_CHG_ST_1PART)
//
+#define XCP_ADMP__DOM_MASK_EXT01 \
+ ~(0U)
+//
+
+#define XCP__ADMP_SUP ((XCP_ADMP__PERMS | XCP_ADMP__CHGBITS) &\
+ ~XCP_ADMP_NOT_SUP)
// card modes
#define XCP_ADMM_AUTHENTICATED 1U // no longer in imprint mode
@@ -1838,6 +1822,8 @@ typedef enum {
XCP_ADMM_STR_192BIT | \
XCP_ADMM_STR_256BIT)
+#define XCP__ADMM_SUP XCP_ADMM__MASK
+
// specific standards' compliance suites
#define XCP_ADMS_FIPS2009 1 // NIST, 80+ bits, -2011.01.01.
#define XCP_ADMS_BSI2009 2 // BSI , 80+ bits, -2011.01.01.
@@ -1850,18 +1836,74 @@ typedef enum {
//
#define XCP_ADMS_BSICC2017 0x40 // BSI, EP11 Common Criteria EAL4 2017
//
+#define XCP_ADMS_FIPS2021 0x80 // NIST SP800-131A REV.2, 2021.01.01
+#define XCP_ADMS_FIPS2024 0x100 // NIST SP800-131A REV.2, 2024.01.01
+#define XCP_ADMS_ADM_FIPS2021 0x200 // NIST SP800-131A REV.2, 2021.01.01
#define XCP_ADMS__ALL \
(XCP_ADMS_FIPS2009 | \
XCP_ADMS_BSI2009 | \
XCP_ADMS_FIPS2011 | \
XCP_ADMS_BSI2011 | \
+ XCP_ADMS_BSICC2017 | \
+ XCP_ADMS_FIPS2021 | \
+ XCP_ADMS_FIPS2024 | \
+ XCP_ADMS_ADM_FIPS2021)
+
+#define XCP_ADMS__SUPP (XCP_ADMS__ALL & \
+ ~(XCP_ADMS_FIPS2021 | \
+ XCP_ADMS_ADM_FIPS2021 | \
+ XCP_ADMS_FIPS2024))
+
+// The following 'legacy' defines are used as default 'supported bit masks'
+// for older devices that do not have native bit masks for that purpose.
+// Note: If supported bits are not present, the import of these bits are
+// skipped and the default values will be kept.
+#define XCP__ADMP_SUP_LEGACY \
+ (XCP_ADMP_WK_IMPORT | \
+ XCP_ADMP_WK_EXPORT | \
+ XCP_ADMP_WK_1PART | \
+ XCP_ADMP_WK_RANDOM | \
+ XCP_ADMP_1SIGN | \
+ XCP_ADMP_CP_1SIGN | \
+ XCP_ADMP_ZERO_1SIGN | \
+ XCP_ADMP_NO_DOMAIN_IMPRINT | \
+ XCP_ADMP_STATE_IMPORT | \
+ XCP_ADMP_STATE_EXPORT | \
+ XCP_ADMP_STATE_1PART | \
+ XCP_ADMP_CHG_WK_IMPORT | \
+ XCP_ADMP_CHG_WK_EXPORT | \
+ XCP_ADMP_CHG_WK_1PART | \
+ XCP_ADMP_CHG_WK_RANDOM | \
+ XCP_ADMP_CHG_SIGN_THR | \
+ XCP_ADMP_CHG_REVOKE_THR | \
+ XCP_ADMP_CHG_1SIGN | \
+ XCP_ADMP_CHG_CP_1SIGN | \
+ XCP_ADMP_CHG_ZERO_1SIGN | \
+ XCP_ADMP_CHG_ST_IMPORT | \
+ XCP_ADMP_CHG_ST_EXPORT | \
+ XCP_ADMP_CHG_ST_1PART)
+
+#define XCP__ADMM_SUP_LEGACY \
+ (XCP_ADMM_AUTHENTICATED | \
+ XCP_ADMM_EXTWNG | \
+ XCP_ADMM_WKCLEAN_EXTWNG | \
+ XCP_ADMM_BATT_LOW | \
+ XCP_ADMM_API_ACTIVE)
+
+#define XCP_ADMS__ALL_LEGACY \
+ (XCP_ADMS_FIPS2009 | \
+ XCP_ADMS_BSI2009 | \
+ XCP_ADMS_FIPS2011 | \
+ XCP_ADMS_BSI2011 | \
XCP_ADMS_BSICC2017)
+#define XCP__ADMP_SUP_EXT01_LEGACY (0)
+
// has compliance any BSI mode
-#define XCP_ADMS_IS_BSI(mode) (!!(mode & (XCP_ADMS_BSI2009 | \
- XCP_ADMS_BSI2011 | \
- XCP_ADMS_BSICC2017 )) )
+#define XCP_ADMS_IS_BSI(mode) (!!((mode) & (XCP_ADMS_BSI2009 | \
+ XCP_ADMS_BSI2011 | \
+ XCP_ADMS_BSICC2017 )) )
// mask of supported import keys
// 3k and 4k RSA are not supported
#define XCP_ADM_IMPEXP_KEYS__MASK \
@@ -1870,7 +1912,8 @@ typedef enum {
(1 << XCP_IMPRKEY_EC_P521) | \
(1 << XCP_IMPRKEY_EC_BP256r) | \
(1 << XCP_IMPRKEY_EC_BP320r) | \
- (1 << XCP_IMPRKEY_EC_BP512r))
+ (1 << XCP_IMPRKEY_EC_BP512r) | \
+ (1 << XCP_IMPRKEY_EC_P521_TKE))
/*--- audit chains -------------------------------------------------------*/
@@ -1922,50 +1965,55 @@ typedef enum {
/*--- state serialization ------------------------------------------------*/
typedef enum {
- XCP_STSTYPE_SECTIONCOUNT = 1, // section count +file hash
- XCP_STSTYPE_DOMAINIDX_MAX = 2, // largest index +total nr of domains
- XCP_STSTYPE_DOMAINS_MASK = 3, // bitmask of included domains
- XCP_STSTYPE_SERIALNR = 4,
- XCP_STSTYPE_CREATE_TIME = 5, // file date/time (UTC)
- XCP_STSTYPE_FCV = 6, // public parts of originating FCV
- XCP_STSTYPE_CARD_QUERY = 7, // card state structure (xcp_info)
- XCP_STSTYPE_CARD_ADM_SKIS = 8, // card admin SKIs, packed
- XCP_STSTYPE_CARD_ADM_CERTS = 9, // card admin certificates, packed
- XCP_STSTYPE_DOM_ADM_SKIS = 10, // domain admin SKIs, packed
- XCP_STSTYPE_DOM_ADM_CERTS = 11, // domain admin certificates, packed
- XCP_STSTYPE_DOM_QUERY = 12, // domain state structure (xcp_info)
- XCP_STSTYPE_KPH_SKIS = 13, // count and SKIs of targeted KPHs
- XCP_STSTYPE_CARD_ATTRS = 14, // card attributes
- XCP_STSTYPE_DOM_ATTRS = 15, // domain attributes
- XCP_STSTYPE_CARD_TRANSCTR = 16, // card transaction counter
- XCP_STSTYPE_DOM_TRANSCTR = 17, // domain transaction counter
- XCP_STSTYPE_WK_ENCR_ALG = 18,
- XCP_STSTYPE_WK_ENCR_DATA = 19,
- XCP_STSTYPE_SIG_CERT_COUNT = 20,
- XCP_STSTYPE_SIG_CERTS = 21,
- XCP_STSTYPE_FILE_SIG = 22,
- XCP_STSTYPE_DOM_CPS = 23, // full set of control points
- XCP_STSTYPE_STATE_SALT = 24,
- XCP_STSTYPE_KEYPART = 25, // encrypted keypart (RecipientInfo)
- XCP_STSTYPE_KEYPART_SIG = 26, // signature on encrypted keypart
- XCP_STSTYPE_KEYPART_COUNT = 27, // total number of keyparts
- XCP_STSTYPE_KEYPART_LIMIT = 28, // number of keyparts needed to
- // restore
- XCP_STSTYPE_KEYPART_CERT = 29, // certificate of keypart holder
- XCP_STSTYPE_CERT_AUTH = 30, // certificate authority issuing
- // some of the certificates. This
- // field contains host-supplied data
- // and it is ignored by EP11 itself.
- XCP_STSTYPE_STATE_SCOPE = 31, // restriction on contents of full
- // state structure
- XCP_STSTYPE_MULTIIMPORT_MASK
- = 32, // import only: designate import
- // request to be replicated into
- // multiple recipient domains
- XCP_STSTYPE_CPS_MASK = 33, // bitmask of all CPs supported
- // by the exporting module
-
- XCP_STSTYPE_MAX = XCP_STSTYPE_CPS_MASK
+ XCP_STSTYPE_SECTIONCOUNT = 1, // section count +file hash
+ XCP_STSTYPE_DOMAINIDX_MAX = 2, // largest index +total nr of doms
+ XCP_STSTYPE_DOMAINS_MASK = 3, // bitmask of included domains
+ XCP_STSTYPE_SERIALNR = 4,
+ XCP_STSTYPE_CREATE_TIME = 5, // file date/time (UTC)
+ XCP_STSTYPE_FCV = 6, // public parts of originating FCV
+ XCP_STSTYPE_CARD_QUERY = 7, // V0 card state struct (xcp_info)
+ XCP_STSTYPE_CARD_ADM_SKIS = 8, // card admin SKIs, packed
+ XCP_STSTYPE_CARD_ADM_CERTS = 9, // card admin certificates, packed
+ XCP_STSTYPE_DOM_ADM_SKIS = 10, // domain admin SKIs, packed
+ XCP_STSTYPE_DOM_ADM_CERTS = 11, // domain admin certs, packed
+ XCP_STSTYPE_DOM_QUERY = 12, // domain state struct (xcp_info)
+ XCP_STSTYPE_KPH_SKIS = 13, // count and SKIs of targeted KPHs
+ XCP_STSTYPE_CARD_ATTRS = 14, // card attributes
+ XCP_STSTYPE_DOM_ATTRS = 15, // domain attributes
+ XCP_STSTYPE_CARD_TRANSCTR = 16, // card transaction counter
+ XCP_STSTYPE_DOM_TRANSCTR = 17, // domain transaction counter
+ XCP_STSTYPE_WK_ENCR_ALG = 18,
+ XCP_STSTYPE_WK_ENCR_DATA = 19,
+ XCP_STSTYPE_SIG_CERT_COUNT = 20,
+ XCP_STSTYPE_SIG_CERTS = 21,
+ XCP_STSTYPE_FILE_SIG = 22,
+ XCP_STSTYPE_DOM_CPS = 23, // full set of control points
+ XCP_STSTYPE_STATE_SALT = 24,
+ XCP_STSTYPE_KEYPART = 25, // encrypted keypart (RecipientInfo)
+ XCP_STSTYPE_KEYPART_SIG = 26, // signature on encrypted keypart
+ XCP_STSTYPE_KEYPART_COUNT = 27, // total number of keyparts
+ XCP_STSTYPE_KEYPART_LIMIT = 28, // number of keyparts needed to
+ // restore
+ XCP_STSTYPE_KEYPART_CERT = 29, // certificate of keypart holder
+ XCP_STSTYPE_CERT_AUTH = 30, // certificate authority issuing
+ // some of the certificates. This
+ // field contains host-supplied data
+ // and it is ignored by EP11 itself.
+ XCP_STSTYPE_STATE_SCOPE = 31, // restriction on contents of full
+ // state structure
+ XCP_STSTYPE_MULTIIMPORT_MASK = 32, // import only: designate import
+ // request to be replicated into
+ // multiple recipient domains
+ XCP_STSTYPE_CPS_MASK = 33, // bitmask of all CPs supported
+ // by the exporting module
+ XCP_STSTYPE_CARD_QUERY_V1 = 34, // V1 card state struct (xcp_info)
+ XCP_STSTYPE_CARD_QUERY_V2 = 35, // V2 card state struct (xcp_info)
+ XCP_STSTYPE_CARD_EXTADM_SKIS = 36, // ext. card admin SKIs, packed
+ XCP_STSTYPE_CARD_EXTADM_CERTS = 37, // ext. card admin certs, packed
+ XCP_STSTYPE_DOM_EXTADM_SKIS = 38, // ext. dom admin SKIs, packed
+ XCP_STSTYPE_DOM_EXTADM_CERTS = 39, // ext. dom admin certs, packed
+
+ XCP_STSTYPE_MAX = XCP_STSTYPE_DOM_EXTADM_CERTS
} XCP_StateSection_t;
typedef enum {
@@ -1991,7 +2039,11 @@ typedef enum {
// not return KPH certificates
XCP_STWK_KP_NO_OA_CHAIN = 8, // keypart section restricted to
// not return OA certificate chain
- XCP_STDATA_MAX = ((XCP_STWK_KP_NO_OA_CHAIN *2) -1)
+ XCP_STDATA_NQS = 0x20,// allow use of non-quantum-safe
+ // algorithms in KP export/signature
+ XCP_STDATA_QS = 0x40,// allow use of quantum-safe
+ // algorithms in KP export/signature
+ XCP_STDATA_MAX = ((XCP_STDATA_QS *2) -1)
} XCP_StateType_t;
// type || identifier prefixes
@@ -2124,10 +2176,6 @@ typedef enum {
#define XCP_EC_MAX_ID_BYTES 11 /* fits all EC names/OIDs */
-// Dilithium related OIDs
-#define XCP_PQC_DILITHIUM_65_NAME "\x6\xB\x2B\x6\x1\x4\x1\x2\x82\xB\x1\x6\x5"
-#define XCP_PQC_DILITHIUM_65_NAME_BYTES 13
-
/*------------------------------------*/
typedef enum {
XCP_EC_C_NIST_P192 = 1, /* NIST, FP curves */
@@ -2158,6 +2206,7 @@ typedef enum {
XCP_EC_C_ED25519 = 26, /* ed25519, EDDSA */
+ XCP_EC_C_MAX = 27 /* last possible value */
} XCP_ECcurve_t;
@@ -2175,6 +2224,56 @@ typedef enum {
} XCP_ECCurveGrp_t;
+/*--- PQC algorithms ------------------------------------------------------*/
+
+// Dilithium related OIDs
+// Round 2 Dilithium-3 (5-4)
+#define XCP_PQC_DILITHIUM_R2_54 "\x6\xb\x2b\x6\x1\x4\x1\x2\x82\xb\x1\x5\x4"
+#define XCP_PQC_DILITHIUM_R2_54_BYTES 13
+// Round 2 Dilithium-4 (6-5)
+#define XCP_PQC_DILITHIUM_R2_65 "\x6\xb\x2b\x6\x1\x4\x1\x2\x82\xb\x1\x6\x5"
+#define XCP_PQC_DILITHIUM_R2_65_BYTES 13
+// Round 2 Dilithium-5 (8-7)
+#define XCP_PQC_DILITHIUM_R2_87 "\x6\xb\x2b\x6\x1\x4\x1\x2\x82\xb\x1\x8\x7"
+#define XCP_PQC_DILITHIUM_R2_87_BYTES 13
+// Round 3 Dilithium-2 (4-4)
+#define XCP_PQC_DILITHIUM_R3_44 "\x6\xb\x2b\x6\x1\x4\x1\x2\x82\xb\x7\x4\x4"
+#define XCP_PQC_DILITHIUM_R3_44_BYTES 13
+// Round 3 Dilithium-3 (6-5)
+#define XCP_PQC_DILITHIUM_R3_65 "\x6\xb\x2b\x6\x1\x4\x1\x2\x82\xb\x7\x6\x5"
+#define XCP_PQC_DILITHIUM_R3_65_BYTES 13
+// Round 3 Dilithium-5 (8-7)
+#define XCP_PQC_DILITHIUM_R3_87 "\x6\xb\x2b\x6\x1\x4\x1\x2\x82\xb\x7\x8\x7"
+#define XCP_PQC_DILITHIUM_R3_87_BYTES 13
+
+// Round 2 Kyber 512
+#define XCP_PQC_KYBER_R2_512 "\x6\x9\x2B\x6\x1\x4\x1\x2\x82\xB\x5"
+#define XCP_PQC_KYBER_R2_512_BYTES 11
+
+// Round 2 Kyber 768
+#define XCP_PQC_KYBER_R2_768 "\x6\xB\x2B\x6\x1\x4\x1\x2\x82\xB\x5\x3\x3"
+#define XCP_PQC_KYBER_R2_768_BYTES 13
+
+// Round 2 Kyber 1024
+#define XCP_PQC_KYBER_R2_1024 "\x6\xB\x2B\x6\x1\x4\x1\x2\x82\xB\x5\x4\x4"
+#define XCP_PQC_KYBER_R2_1024_BYTES 13
+
+/*------------------------------------*/
+typedef enum {
+ XCP_PQC_S_DILITHIUM_R2_54 = 1, /* Round-2 Dilithium */
+ XCP_PQC_S_DILITHIUM_R2_65 = 2,
+ XCP_PQC_S_DILITHIUM_R2_87 = 3,
+ XCP_PQC_S_DILITHIUM_R3_44 = 4, /* Round-3 Dilithium */
+ XCP_PQC_S_DILITHIUM_R3_65 = 5,
+ XCP_PQC_S_DILITHIUM_R3_87 = 6,
+ XCP_PQC_S_KYBER_R2_512 = 7, /* Round-2 Kyber */
+ XCP_PQC_S_KYBER_R2_768 = 8,
+ XCP_PQC_S_KYBER_R2_1024 = 9,
+
+ XCP_PQC_MAX = XCP_PQC_S_KYBER_R2_1024,
+} XCP_PQCStrength_t;
+
+
// binary encoding of function/version query
// SEQUENCE { OCTET STRING (0) }
// module responds with API version and build ID
@@ -2343,12 +2442,15 @@ typedef enum {
XCP_DEV_FLIP_ERRORSTATE = 68, // explicitly flip the setting of the
// error state of the module
XCP_DEV_AESKW = 69,
- XCP_DEV_MAX_INDEX = XCP_DEV_AESKW
+ XCP_DEV_UNIT_TEST = 72, // run unit tests on module
+
+
+ XCP_DEV_MAX_INDEX = XCP_DEV_UNIT_TEST
} XCP_DEVcmd_t;
//
// upper limit on additional data bytes, for SYS-TEST commands with aux. data
// (arbitrary limit, commands may restict further)
-#define XCP_DEV_MAX_DATABYTES ((size_t) 4096)
+#define XCP_DEV_MAX_DATABYTES ((size_t) 64000)
//
// iteration-count limit applies to any iterative call
// driver[timeout] may interfere; dev-only feature is not otherwise restricted
@@ -2412,23 +2514,207 @@ typedef enum {
#define CKG_IBM_MGF1_SHA3_384 (CKG_VENDOR_DEFINED +3)
#define CKG_IBM_MGF1_SHA3_512 (CKG_VENDOR_DEFINED +4)
+#if !defined(CKD_VENDOR_DEFINED)
+#define CKD_VENDOR_DEFINED 0x80000000UL
+#endif
+#define CKD_IBM_HYBRID_NULL (CKD_VENDOR_DEFINED + 0x00000001UL)
+#define CKD_IBM_HYBRID_SHA1_KDF (CKD_VENDOR_DEFINED + 0x00000002UL)
+#define CKD_IBM_HYBRID_SHA224_KDF (CKD_VENDOR_DEFINED + 0x00000003UL)
+#define CKD_IBM_HYBRID_SHA256_KDF (CKD_VENDOR_DEFINED + 0x00000004UL)
+#define CKD_IBM_HYBRID_SHA384_KDF (CKD_VENDOR_DEFINED + 0x00000005UL)
+#define CKD_IBM_HYBRID_SHA512_KDF (CKD_VENDOR_DEFINED + 0x00000006UL)
-typedef uint64_t target_t;
-
-#define XCP_TGT_INIT ~0UL
+#define XCP_MODEL_CEX4P 4
+#define XCP_MODEL_CEX5P 5
+#define XCP_MODEL_CEX6P 6
+#define XCP_MODEL_CEX7P 7
+#define XCP_MODEL_CEX8P 8
-#define XCP_TGT_FMT "x%016" PRIx64
+/*--------------------------------------------------------------------------*/
+// max value for target groups
+#define XCP_MAX_GRPIDX 1024u
-// initializes the library
-int m_init(void);
-// shutting down the library
-int m_shutdown(void);
+//
+// macros for setting/checking and removing domains from (tgt.mgmt) domain mask
+#define XCPTGTMASK_SET_DOM(mask, domain) \
+ ((mask)[((domain)/8)] |= (1 << (7-(domain)%8)))
+#define XCPTGTMASK_DOM_IS_SET(mask, domain) \
+ ((mask)[((domain)/8)] & (1 << (7-(domain)%8)))
+#define XCPTGTMASK_CLR_DOM(mask, domain) \
+ ((mask)[((domain)/8)] &= ~(1 << (7-(domain)%8)))
+
+
+/* flags that can be set for the target tokens
+ *
+ * This flags are domain specific and are therefore called domain flags
+ *
+ * start of flags is >16 Bit. Max value for domains is 0xFF. Should be enough
+ * room for extensions
+ */
+#define XCP_TGTFL_WCAP 0x10000000 /* Capture wire request in output buffer
+ * without sending it to the module
+ */
+#define XCP_TGTFL_WCAP_SQ 0x20000000 /* Size query: Return size of request in
+ * output buffer length field
+ */
+#define XCP_TGTFL_SET_SCMD 0x40000000 /* Protected key special command: Set the
+ * special command flag in the CPRB
+ * header
+ */
+#define XCP_TGTFL_API_CHKD 0x80000000 /* supported API version of modules in
+ * target (group) has been checked
+ */
+
+#define XCP_TGTFL_NO_LOCK 0x01000000 /* target token ignores sequential locks
+ * for target probing
+ */
+#define XCP_TGTFL_CHK_ATTR 0x02000000 /* reject unknown attribute in attribute
+ * templates with
+ * CKR_TEMPLATE_INCONSISTENT. Default is
+ * to ignore unknown attributes.
+ */
+#define XCP_TGTFL_SET_ACMD 0x04000000 /* add CPRB admin flag to CPRB header */
+
+#define XCP_TGTFL_NO_SPLIT 0x08000000 /* enforce single-shot requests */
+
+//--------------------------------------
+// socket use only
+#define XCP_MAXCONNECTIONS 64 /* max value for active connections */
+#define XCP_MAX_PORT 0xffff
+
+// hostname and port value fore one module
+typedef struct XCP_ModuleSocket {
+ char host[ MAX_FNAME_CHARS +1 ];
+ uint32_t port;
+} *XCP_ModuleSocket_t ;
+
+
+//--------------------------------------
+// diagnostics use only
+typedef struct XCP_DomainPerf {
+ /* perf value of last request per domain
+ *
+ * At the moment unused
+ * */
+ unsigned int lastperf[ 256 ];
+} *XCP_DomainPerf_t;
+
+
+// current version of XCP_Module structure; host code SHOULD interact with
+// future/past versions, MUST be set by caller before using m_add_module()
+// valid versions are all >0
+#define XCP_MOD_VERSION 2
+//--------------------------------------
+// subsequent communications with a module MAY skip infrastructure-specific
+// fields, such as a query not reporting device handles etc., even if they
+// have been supplied originally when the module has been registered.
+//
+typedef struct XCP_Module {
+ uint32_t version; /* >0 for supported API versions */
+
+ uint64_t flags; /* see XCP_Module_Flags */
+
+ uint32_t domains; /* max# addressable under this module;
+ * cached from OS
+ *
+ * when callers set domains to 0, the library
+ * returns the module-claimed domain count.
+ */
+
+ unsigned char domainmask[ 256 /8 ];
+ /* higher domain# through future flags (none
+ * currently defined) which would add things
+ * like 'FLAG_256_1023' etc. at the same time,
+ * we would add domainmask2[] etc.
+ * corresponding new fields.
+ *
+ * new fields would then store mask for
+ * domains 256+ etc.
+ *
+ * domain #0 is bit x80 of 1st byte,
+ * #255 is bit 0x01 of last byte.
+ */
+
+ // when a domainmask is supplied, with bits set beyond
+ // what the module supports, the bitmask is trimmed to
+ // the supported range, but this is NOT reported as an
+ // error, unless XCP_MFL_STRICT is also supplied.
+ //
+ // without XCP_MFL_STRICT, callers are expected to check
+ // at least the returned domain count.
+
+ /* used only when flags includes XCP_MFL_SOCKET */
+ struct XCP_ModuleSocket socket;
+
+ /* used when system exposes modules through an
+ * array of transparent pipes, or similar abstraction
+ * (such as mainframe AP Queues, or other Linux
+ * 'device-minor' numbers etc.). Interpretation
+ * is platform-dependent.
+ *
+ * used only when flags includes XCP_MFL_MODULE
+ */
+ uint32_t module_nr;
+
+ /* used by systems which associate devices with
+ * device handles/structs/etc. persistent state.
+ * opaque pointer, usually a const pointer to
+ * such aux structs, MAY be stored here.
+ *
+ * interpretation is platform-dependent.
+ * used only when flags includes XCP_MFL_MHANDLE
+ */
+ void *mhandle;
+ /* diagnostics use only, when XCP_MFL_PERF is set */
+ struct XCP_DomainPerf perf;
+ //----- end of v1 fields -------------------------------------------
+
+ uint32_t api; /* module api version*/
+ //----- end of v2 fields -------------------------------------------
+} *XCP_Module_t ;
+
+typedef enum {
+ XCP_MFL_SOCKET = 1, /* backend is socket-attached */
+ XCP_MFL_MODULE = 2, /* backends identified in
+ array-of-modules */
+ XCP_MFL_MHANDLE = 4, /* backends uses 'module handle' field */
+ XCP_MFL_PERF = 8, /* performance statistics collected
+ * for this module, see .perf
+ */
+ XCP_MFL_VIRTUAL = 0x10, /* queried 'target' is a load-balancer,
+ * other other group.
+ */
+ XCP_MFL_STRICT = 0x20, /* enable aggressive error checking,
+ * see field descriptions for effect
+ */
+ XCP_MFL_PROBE = 0x40, /* send api query to module, to check if
+ * target(s) can be used
+ */
+ XCP_MFL_ALW_TGT_ADD = 0x80, /* Allows it to use a target in any
+ * functional and admin call without
+ * adding it beforehand with
+ * m_add_module()
+ */
+ XCP_MFL_MAX = 0xff
+} XCP_Module_Flags;
+
+typedef uint64_t target_t;
+
+#define XCP_TGT_INIT ~0UL
+
+#define XCP_TGT_FMT "x%016" PRIx64
int m_add_module(XCP_Module_t module, target_t *target) ;
int m_rm_module(XCP_Module_t module, target_t target) ;
+CK_RV m_admin (unsigned char *response1, size_t *r1len,
+ unsigned char *response2, size_t *r2len,
+ const unsigned char *cmd, size_t clen,
+ const unsigned char *sigs, size_t slen,
+ target_t target) ;
+
/*----------------------------------------------------------------------
* CK_... type arguments correspond to the original PKCS#11 call's
* arguments. Standard types mean PKCS#11 objects (session, token etc.)
@@ -2442,11 +2728,31 @@ int m_rm_module(XCP_Module_t module, target_t target) ;
* For certain operations, such as _GenerateKey, there are no real
* PKCS#11 type parameters at this level.
*/
+
+
+CK_RV m_Login ( CK_UTF8CHAR_PTR pin, CK_ULONG pinlen,
+ const unsigned char *nonce, size_t nlen,
+ unsigned char *pinblob, size_t *pinbloblen,
+ target_t target) ;
+CK_RV m_Logout ( const unsigned char *pin, size_t len, target_t target) ;
+
+CK_RV m_LoginExtended( CK_UTF8CHAR_PTR pin, CK_ULONG pinlen,
+ const unsigned char *nonce, size_t nlen,
+ const unsigned char *xstruct, size_t xslen,
+ unsigned char *pinblob, size_t *pinbloblen,
+ target_t target) ;
+
+CK_RV m_LogoutExtended( CK_UTF8CHAR_PTR pin, CK_ULONG pinlen,
+ const unsigned char *nonce, size_t nlen,
+ const unsigned char *xstruct, size_t xslen,
+ target_t target) ;
+
CK_RV m_GenerateRandom (CK_BYTE_PTR rnd, CK_ULONG len, target_t target) ;
/**/
/* note: external seeding not supported */
CK_RV m_SeedRandom (CK_BYTE_PTR pSeed, CK_ULONG ulSeedLen,
target_t target) ;
+
CK_RV m_DigestInit (unsigned char *state, size_t *len,
const CK_MECHANISM_PTR pmech,
target_t target) ;
@@ -2469,6 +2775,73 @@ CK_RV m_DigestSingle (CK_MECHANISM_PTR pmech,
CK_BYTE_PTR digest, CK_ULONG_PTR dlen,
target_t target) ;
+CK_RV m_GenerateKey (CK_MECHANISM_PTR pmech,
+ CK_ATTRIBUTE_PTR ptempl, CK_ULONG templcount,
+ const unsigned char *pin, size_t pinlen,
+ unsigned char *key, size_t *klen,
+ unsigned char *csum, size_t *clen,
+ target_t target) ;
+/**/
+CK_RV m_GenerateKeyPair (CK_MECHANISM_PTR pmech,
+ CK_ATTRIBUTE_PTR ppublic, CK_ULONG pubattrs,
+ CK_ATTRIBUTE_PTR pprivate, CK_ULONG prvattrs,
+ const unsigned char *pin, size_t pinlen,
+ unsigned char *key, size_t *klen,
+ unsigned char *pubkey, size_t *pklen,
+ target_t target) ;
+
+/* mackey is NULL for PKCS#11 formats, not for authenticated ones */
+CK_RV m_WrapKey (const unsigned char *key, size_t keylen,
+ const unsigned char *kek, size_t keklen,
+ const unsigned char *mackey, size_t mklen,
+ const CK_MECHANISM_PTR pmech,
+ CK_BYTE_PTR wrapped, CK_ULONG_PTR wlen,
+ target_t target) ;
+/**/
+/* mackey is NULL for PKCS#11 formats, not for authenticated ones */
+CK_RV m_UnwrapKey (const CK_BYTE_PTR wrapped, CK_ULONG wlen,
+ const unsigned char *kek, size_t keklen,
+ const unsigned char *mackey, size_t mklen,
+ const unsigned char *pin, size_t pinlen,
+ const CK_MECHANISM_PTR uwmech,
+ const CK_ATTRIBUTE_PTR ptempl, CK_ULONG pcount,
+ unsigned char *unwrapped, size_t *uwlen,
+ CK_BYTE_PTR csum, CK_ULONG *cslen,
+ target_t target) ;
+
+CK_RV m_DeriveKey ( CK_MECHANISM_PTR pderivemech,
+ CK_ATTRIBUTE_PTR ptempl, CK_ULONG templcount,
+ const unsigned char *basekey, size_t bklen,
+ const unsigned char *data, size_t dlen,
+ const unsigned char *pin, size_t pinlen,
+ unsigned char *newkey, size_t *nklen,
+ unsigned char *csum, size_t *cslen,
+ target_t target) ;
+
+CK_RV m_GetAttributeValue (const unsigned char *obj, size_t olen,
+ CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount,
+ target_t target) ;
+CK_RV m_SetAttributeValue (unsigned char *obj, size_t olen,
+ CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount,
+ target_t target) ;
+
+/**/
+CK_RV m_GetMechanismList (CK_SLOT_ID slot,
+ CK_MECHANISM_TYPE_PTR mechs,
+ CK_ULONG_PTR count,
+ target_t target) ;
+CK_RV m_GetMechanismInfo (CK_SLOT_ID slot,
+ CK_MECHANISM_TYPE mech,
+ CK_MECHANISM_INFO_PTR pmechinfo,
+ target_t target) ;
+
+CK_RV m_get_xcp_info (CK_VOID_PTR pinfo, CK_ULONG_PTR infbytes,
+ unsigned int query,
+ unsigned int subquery,
+ target_t target) ;
+
+// see also: CK_IBM_XCPQUERY_t
+
CK_RV m_EncryptInit (unsigned char *state, size_t *slen,
CK_MECHANISM_PTR pmech,
const unsigned char *key, size_t klen,
@@ -2516,21 +2889,6 @@ CK_RV m_DecryptSingle (const unsigned char *key, size_t klen,
CK_BYTE_PTR plain, CK_ULONG_PTR plen,
target_t target) ;
-CK_RV m_GenerateKey (CK_MECHANISM_PTR pmech,
- CK_ATTRIBUTE_PTR ptempl, CK_ULONG templcount,
- const unsigned char *pin, size_t pinlen,
- unsigned char *key, size_t *klen,
- unsigned char *csum, size_t *clen,
- target_t target) ;
-/**/
-CK_RV m_GenerateKeyPair (CK_MECHANISM_PTR pmech,
- CK_ATTRIBUTE_PTR ppublic, CK_ULONG pubattrs,
- CK_ATTRIBUTE_PTR pprivate, CK_ULONG prvattrs,
- const unsigned char *pin, size_t pinlen,
- unsigned char *key, size_t *klen,
- unsigned char *pubkey, size_t *pklen,
- target_t target) ;
-
CK_RV m_SignInit (unsigned char *state, size_t *slen,
CK_MECHANISM_PTR alg,
const unsigned char *key, size_t klen,
@@ -2574,72 +2932,6 @@ CK_RV m_VerifySingle (const unsigned char *key, size_t klen,
CK_BYTE_PTR sig, CK_ULONG slen,
target_t target) ;
-/* mackey is NULL for PKCS#11 formats, not for authenticated ones */
-CK_RV m_WrapKey (const unsigned char *key, size_t keylen,
- const unsigned char *kek, size_t keklen,
- const unsigned char *mackey, size_t mklen,
- const CK_MECHANISM_PTR pmech,
- CK_BYTE_PTR wrapped, CK_ULONG_PTR wlen,
- target_t target) ;
-/**/
-/* mackey is NULL for PKCS#11 formats, not for authenticated ones */
-CK_RV m_UnwrapKey (const CK_BYTE_PTR wrapped, CK_ULONG wlen,
- const unsigned char *kek, size_t keklen,
- const unsigned char *mackey, size_t mklen,
- const unsigned char *pin, size_t pinlen,
- const CK_MECHANISM_PTR uwmech,
- const CK_ATTRIBUTE_PTR ptempl, CK_ULONG pcount,
- unsigned char *unwrapped, size_t *uwlen,
- CK_BYTE_PTR csum, CK_ULONG *cslen,
- target_t target) ;
-
-CK_RV m_DeriveKey ( CK_MECHANISM_PTR pderivemech,
- CK_ATTRIBUTE_PTR ptempl, CK_ULONG templcount,
- const unsigned char *basekey, size_t bklen,
- const unsigned char *data, size_t dlen,
- const unsigned char *pin, size_t pinlen,
- unsigned char *newkey, size_t *nklen,
- unsigned char *csum, size_t *cslen,
- target_t target) ;
-
-/**/
-CK_RV m_GetMechanismList (CK_SLOT_ID slot,
- CK_MECHANISM_TYPE_PTR mechs,
- CK_ULONG_PTR count,
- target_t target) ;
-CK_RV m_GetMechanismInfo (CK_SLOT_ID slot,
- CK_MECHANISM_TYPE mech,
- CK_MECHANISM_INFO_PTR pmechinfo,
- target_t target) ;
-
-CK_RV m_GetAttributeValue (const unsigned char *obj, size_t olen,
- CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount,
- target_t target) ;
-CK_RV m_SetAttributeValue (unsigned char *obj, size_t olen,
- CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount,
- target_t target) ;
-
-
-CK_RV m_Login ( CK_UTF8CHAR_PTR pin, CK_ULONG pinlen,
- const unsigned char *nonce, size_t nlen,
- unsigned char *pinblob, size_t *pinbloblen,
- target_t target) ;
-CK_RV m_Logout ( const unsigned char *pin, size_t len, target_t target) ;
-
-CK_RV m_admin (unsigned char *response1, size_t *r1len,
- unsigned char *response2, size_t *r2len,
- const unsigned char *cmd, size_t clen,
- const unsigned char *sigs, size_t slen,
- target_t target) ;
-
-CK_RV m_get_xcp_info (CK_VOID_PTR pinfo, CK_ULONG_PTR infbytes,
- unsigned int query,
- unsigned int subquery,
- target_t target) ;
-
-// see also: CK_IBM_XCPQUERY_t
-
-
// m_wire() by default removes transport headers of responses (CPRB header etc.)
// setting to prevent stripping:
//
@@ -2661,17 +2953,20 @@ CK_RV m_wire (unsigned char *rsp, size_t *rsplen, CK_RV *irv,
#define XCP_W_NO_SEND_CPRB 1 /* data already includes request header */
#define XCP_W_NO_RECV_CPRB 2 /* leave transport header in response */
+// initializes the library
+int m_init(void);
+// shutting down the library
+int m_shutdown(void);
-/*-- build identification ------------------------------------------------*/
-#define XCP_BUILD_ID 0x9c14a5e6
-#define XCP_BUILD_DATE 0x20220610 /* UTC */
-#define XCP_BUILD_TIME 0x123354 /* UTC */
-/*--------------------------------------------------------------------------*/
-/*--------------------------------------------------------------------------*/
+/*-- build identification ------------------------------------------------*/
+#define XCP_BUILD_ID 0xf1d34cc2
+#define XCP_BUILD_DATE 0x20221214 /* UTC */
+#define XCP_BUILD_TIME 0x094523 /* UTC */
+/*--------------------------------------------------------------------------*/
#define __XCP_REASONCODES_H__ 1
@@ -2823,14 +3118,10 @@ typedef enum {
} XCP_ReasonCode_t ;
-
-
-#if ! defined(__transport_fns_h__)
-#define __transport_fns_h__
-
/* function identifiers must be consecutive, between: */
#define __MIN_MOD_FNID 1
-#define __MAX_MOD_FNID 43
+#define __MAX_MOD_FNID 42
+/* selectively disabled functions within that range reported separately */
#define __FNID_Login 1
#define __FNID_Logout 2
@@ -2938,8 +3229,6 @@ typedef enum {
#define __HOST2MOD_DATAPRM 9
#define __MOD2HOST_DATAPRM 2
-#endif /* n defined(__transport_fns_h__) */
-
#endif /* n defined(XCP_H__) */
diff --git a/usr/lib/ep11_stdll/ep11adm.h b/usr/lib/ep11_stdll/ep11adm.h
index ecb524d5..0cd50a65 100644
--- a/usr/lib/ep11_stdll/ep11adm.h
+++ b/usr/lib/ep11_stdll/ep11adm.h
@@ -25,34 +25,6 @@
#error "We need <ep11.h> types, please include before this file."
#endif
-// these numbers apply to current version, subject to change
-// Please note that this defines are DEPRECATED. Please use their XCP_*
-// counterpart in ep11.h
-//
-#if !defined(EP11_SERIALNR_CHARS)
-#define EP11_SERIALNR_CHARS XCP_SERIALNR_CHARS
-#endif
-
-#if !defined(EP11_KEYCSUM_BYTES)
-/* full size of verific. pattern */
-#define EP11_KEYCSUM_BYTES XCP_KEYCSUM_BYTES
-#endif
-
-#if !defined(EP11_ADMCTR_BYTES)
-/* admin transaction ctrs */
-#define EP11_ADMCTR_BYTES XCP_ADMCTR_BYTES
-#endif
-
-#if !defined(EP11_ADM_REENCRYPT)
-/* transform blobs to next WK */
-#define EP11_ADM_REENCRYPT XCP_ADM_REENCRYPT
-#endif
-
-#if !defined(CK_IBM_EP11Q_DOMAIN)
-/* list domain's WK hashes */
-#define CK_IBM_EP11Q_DOMAIN CK_IBM_XCPQ_DOMAIN
-#endif
-// end of DEPRECATED defines
//-------------------------------------
// flags common to all functions that have a flag parameter
@@ -100,13 +72,22 @@
#define DOMAIN_MASK_LENGTH XCP_DOMAINS/8 // space for 256 domains
-
+//-------------------------------------
+// Key-Part-Holder template
+// contain credentials of a key-part holder. Those credentials
+// can be file based and/or smart card based references.
struct KPH {
- const unsigned char *cert;
- size_t clen;
- const char *id;
- const char *pw;
- const char *kpfname;
+ const unsigned char *cert; // certificate
+ size_t clen; // certificate length
+ const char *id; // private key
+ const char *pw; // private key passphrase
+ const char *kpfname; // filename of the key-part
+ char scard; // indicates a smart card user
+ char ski_id; // subject key identifier ID
+ int rdr_id; // smart card reader number
+ char kp_id; // key-part ID
+ uint64_t sigmech; // signature mechenism
+ const char *padmode; // padding mode
} ;
@@ -159,30 +140,6 @@ typedef struct XCPadmresp {
#define XCP_ADMRESP_INIT0 { 0,0,0, {0},{0},{0}, {0}, CKR_OK, 0, NULL,0, }
-// ep11_admresp_t is DEPRECATED. Please use XCPadmresp_t directly
-typedef struct ep11_admresp {
- uint32_t fn;
- uint32_t domain;
- uint32_t domainInst;
-
- /* module ID || module instance */
- unsigned char module[ EP11_SERIALNR_CHARS + EP11_SERIALNR_CHARS ];
- unsigned char modNr[ EP11_SERIALNR_CHARS ];
- unsigned char modInst[ EP11_SERIALNR_CHARS ];
-
- unsigned char tctr[ EP11_ADMCTR_BYTES ]; /* transaction counter */
-
- CK_RV rv;
- uint32_t reason;
-
- // points to original response; NULL if no payload
- // make sure it's copied if used after releasing response block
- //
- const unsigned char *payload;
- size_t pllen;
-} *ep11_admresp_t;
-
-
//-------------------------------------
// listing of CP modes with their respective sets of control points that are
// either required or prohibited
@@ -249,9 +206,39 @@ static const struct {
XCP_CPB_ALG_NBSI2011, XCP_CPB_ALG_DH,
XCP_CPB_DERIVE },
},
+ { XCP_ADMS_FIPS2021, "fips2021",
+ 15,
+ { XCP_CPB_ALG_NFIPS2011, XCP_CPB_KEYSZ_80BIT,
+ XCP_CPB_KEYSZ_RSA65536,
+ XCP_CPB_ALG_NFIPS2021, XCP_CPB_ALG_EC_25519,
+ XCP_CPB_ALG_PQC, XCP_CPB_BTC,
+ XCP_CPB_ECDSA_OTHER, XCP_CPB_ALLOW_NONSESSION,
+ XCP_CPB_ALG_EC_SECGCRV, XCP_CPB_ALG_EC_BPOOLCRV,
+ XCP_CPB_COMPAT_LEGACY_SHA3, XCP_CPB_DSA_PARAMETER_GEN,
+ XCP_CPB_WRAP_ASYMM, XCP_CPB_UNWRAP_ASYMM
+ },
+ 0,
+ { },
+ },
+ { XCP_ADMS_FIPS2024, "fips2024",
+ 16,
+ { XCP_CPB_ALG_NFIPS2011, XCP_CPB_KEYSZ_80BIT,
+ XCP_CPB_KEYSZ_RSA65536,
+ XCP_CPB_ALG_NFIPS2021, XCP_CPB_ALG_EC_25519,
+ XCP_CPB_ALG_PQC, XCP_CPB_BTC,
+ XCP_CPB_ECDSA_OTHER, XCP_CPB_ALLOW_NONSESSION,
+ XCP_CPB_ALG_EC_SECGCRV, XCP_CPB_ALG_EC_BPOOLCRV,
+ XCP_CPB_ALG_NFIPS2024, XCP_CPB_COMPAT_LEGACY_SHA3,
+ XCP_CPB_DSA_PARAMETER_GEN, XCP_CPB_WRAP_ASYMM,
+ XCP_CPB_UNWRAP_ASYMM
+ },
+ 0,
+ { },
+ // XCP_ADMS_ADM_FIPS2021 is not reported here as it is not set with
+ // control points
+ }
} ;
-
//-------------------------------------
// Structure to collect all relevant data for state export/import
//
@@ -351,21 +338,12 @@ long xcpa_certreplace(unsigned char *blk, size_t blen,
//-------------------------------------
-// xcpa_query_wk queries the hash of the current/next WK for the given target
-// xcpa_query_wk without the feature define EP11ADM_V2 can only query the hash
-// of the current WK. Latter version is deprecated and will be removed with the
-// next major release
+// Queries the current/next WK for the given target
//
-// Parameter description:
-// wk pointer to the output buffer, contains current/next WK hash after
-// call
-// wlen needs to be set to the size of the output buffer
-// type CK_IBM_DOM_CURR_WK or CK_IBM_DOM_NEXT_WK (only available with
-// EP11ADM_V2 defined)
-// target a single target set up with m_add_module
+// WK Hash is returned in (*wk, wlen) on success if wk is not NULL
//
// returns >0 (bytecount) if present
-// 0 if valid but no current/next WK
+// 0 if valid but no current WK
// <0 if anything failed
//
// Possible error return codes:
@@ -375,14 +353,7 @@ long xcpa_certreplace(unsigned char *blk, size_t blen,
//
// Uses xcpa_queryblock() - See function header for possible return codes
//
-#if defined(EP11ADM_V2)
-__asm__(".symver xcpa_query_wk, xcpa_query_wk@EP11ADM_V2");
-long xcpa_query_wk(unsigned char *wk, size_t wlen, int type,
- target_t target) ;
-#else
-long xcpa_query_wk(unsigned char *wk, size_t wlen, target_t target)
- __attribute__ ((deprecated));
-#endif
+long xcpa_query_wk(unsigned char *wk, size_t wlen, int type, target_t target) ;
//-------------------------------------
@@ -681,12 +652,13 @@ long xcpa_set_cps(target_t target,
//-------------------------------------
// get compliance mode from CP set (see ep11_cpt_modes[] for possible compliance
// modes)
+// can not check for administrative compliance modes
//
// cps CP set of XCP_CP_BYTES length, see xcpa_query_cps
//
// returns >0 compliance mode (see XCP_ADMS_...)
//
-// does not verify CP set!
+// does not verify CP set
//
uint32_t xcpa_cps2compliance(const unsigned char *cps /* XCP_CP_BYTES */) ;
@@ -823,7 +795,10 @@ typedef struct Encrdkey {
// EC only: RSA recipients must keep these lengths 0
//
// largest supported curve: P-521
-
+ unsigned char srcprivate[ 66 ]; /* private key (PKCS#8) */
+ size_t sprivlen; /* priv. key byte count */
+ unsigned char *oid; /* EC curve OID */
+ size_t olen; /* EC curve OID length */
unsigned char srcpublic[ 1+66+66 ]; /* originator public point */
size_t splen; /* pub. point bytecount */
@@ -840,18 +815,10 @@ typedef struct Encrdkey {
int ktype; /* one of the wire-specified types */
CK_MECHANISM *alg; /* currently, ignored */
+ unsigned char wrap_alg[25]; /* AES Key Wrap algorithm OID */
// largest supported importer type: 4096-bit RSA
unsigned char raw[ 4096/8 ]; /* actual encrypted bytes */
size_t rlen;
-
-#if defined(EP11ADM_V2)
- unsigned char srcprivate[ 66 ]; /* private key (PKCS#8) */
- size_t sprivlen; /* priv. key byte count */
- unsigned char *oid; /* EC curve OID */
- size_t olen; /* EC curve OID length */
-
- unsigned char wrap_alg[25]; /* AES Key Wrap algorithm OID */
-#endif
} *Encrdkey_t;
@@ -893,9 +860,6 @@ long xcp_rcptinfo_sharedinfo(unsigned char *sinfo, size_t slen,
// creates RecipientInfo ASN.1 sequence (asn) from encr structure following RFC
// 3852 for RSA and RFC 5753 for EC
//
-// uses encr->wrap_alg if EP11ADM_V2 defined. Otherwise assumes aes256-wrap is
-// used for EC
-//
// verifies if a known importer key is used and if the SPKI does match
// the importer key type
//
@@ -907,9 +871,10 @@ long xcp_rcptinfo_sharedinfo(unsigned char *sinfo, size_t slen,
// XCP_ADMERR_RI_IMPR_INVALID: if the importer type or the key import structure
// encr is not supported / invalid
//
-long xcp_rcptinfo(unsigned char *asn, size_t alen,
- const struct Encrdkey *encr,
- const CK_MECHANISM *encrmech) ;
+long xcp_rcptinfo (unsigned char *asn, size_t alen,
+ const struct Encrdkey *encr,
+ const CK_MECHANISM *encrmech) ;
+
//-------------------------------------
// reads ASN.1 formatted RecipientInfo (asn) and turns it into rinfo structure
@@ -990,12 +955,8 @@ long xcpa_import_keypart (unsigned char *out, size_t olen,
// XCP_ADMERR_RI_IMPR_INVALID: importer key type invalid / unsupported or does
// not match SPKI
//
-// uses xcp_rcptinfo and xcpa_cmdblock() - see function header for more return
-// codes and EP11AMD_V2 specific changes
+// uses xcpa_cmdblock() - see function header for more return codes
//
-#if defined(EP11ADM_V2)
-__asm__(".symver xcpa_import_cmdblock, xcpa_import_cmdblock@EP11ADM_V2");
-#endif
long xcpa_import_cmdblock (unsigned char *out, size_t olen,
const struct Encrdkey *key,
const struct XCPadmresp *minf,
@@ -1164,19 +1125,10 @@ long xcpa_fill_export_req(unsigned char *asn, size_t alen,
// Constructs key part file with ASN.1 envelope
// writes output to (*reqprep, reqpreplen)
//
-// default version:
-// statesave contains the target domain mask
-// kphs keypart holder certificates
-// ekps contains re-encrypted keyparts
-// kcnt number of kphs
-// reqprep output buffer
-// reqpreplen output length
-//
-// with EP11ADM_V2 feature define active:
// domainmask target domain mask
// kphs keypart holder certificates
-// ekps contains re-encrypted keyparts
// kcnt number of kphs
+// ekps contains re-encrypted keyparts
// reqprep output buffer
// reqpreplen output length
// headerinfo set to 0 if no header info requested
@@ -1184,9 +1136,6 @@ long xcpa_fill_export_req(unsigned char *asn, size_t alen,
//
// returns 0 if successful
// <0 if something fails
-#if defined(EP11ADM_V2)
-__asm__(".symver xcpa_construct_keypart_file, "
- "xcpa_construct_keypart_file@EP11ADM_V2");
long xcpa_construct_keypart_file(unsigned char *domainmask,
const struct KPH *kphs,
const struct Encrdkey *ekps,
@@ -1194,15 +1143,7 @@ long xcpa_construct_keypart_file(unsigned char *domainmask,
unsigned char *reqprep,
size_t *reqpreplen,
unsigned int headerinfo);
-#else
-long xcpa_construct_keypart_file(struct STATESAVE *statesave,
- const struct KPH *kphs,
- const struct Encrdkey *ekps,
- unsigned int kcnt,
- unsigned char *reqprep,
- size_t *reqpreplen)
- __attribute__((deprecated));
-#endif
+
//-------------------------------------
// Enable export WK permission
@@ -1254,17 +1195,6 @@ long xcpa_enable_import_state(target_t target,
// Export the domain WK of the given target
// writes output to (*resp, resplen)
//
-// default version:
-// target addresses target module/domain
-// keyparts pointer to the encrypted keyparts
-// keypartlen length of encrypted keyparts
-// request pointer to the export request data
-// requestlen length of request data
-// sign_cb provide the callback for generating signatures
-// may be NULL if no signatures required
-// signopts number of signatures requested
-//
-// with EP11ADM_V2 feature define active:
// target addresses target module/domain
// wktype indicates either current or next WK
// keyparts pointer to the encrypted keyparts
@@ -1274,20 +1204,11 @@ long xcpa_enable_import_state(target_t target,
// sign_cb provide the callback for generating signatures
// may be NULL if no signatures required
// signopts number of signatures requested
-//
-#if defined(EP11ADM_V2)
-__asm__(".symver xcpa_export_wk, xcpa_export_wk@EP11ADM_V2");
long xcpa_export_wk(target_t target, int wktype,
unsigned char *keyparts, size_t *keypartlen,
const unsigned char *request, size_t requestlen,
xcpa_admin_signs_cb_t sign_cb, const void *signopts);
-#else
-long xcpa_export_wk(target_t target,
- unsigned char *keyparts, size_t *keypartlen,
- const unsigned char *request, size_t requestlen,
- xcpa_admin_signs_cb_t sign_cb, const void *signopts)
- __attribute__((deprecated));
-#endif
+
//-------------------------------------
// Export the state of the given target
@@ -1337,11 +1258,6 @@ long xcpa_import_wk_rcptinfo(target_t target,
// sign_cb provide the callback for generating signatures
// may be NULL if no signatures required
// signopts number of signatures requested
-//
-// uses xcp_rcptinfo and is therefore dependent on EP11ADM_V2
-#if defined(EP11ADM_V2)
-__asm__(".symver xcpa_import_wk, xcpa_import_wk@EP11ADM_V2");
-#endif
long xcpa_import_wk(target_t target, const struct Encrdkey *ekps,
unsigned int kcnt, const unsigned char *wkvp,
xcpa_admin_signs_cb_t sign_cb, const void *signopts);
@@ -1436,11 +1352,11 @@ long xcpa_gen_random_wk(target_t target, unsigned char *wkvp,
// XCP_ADMERR_SI_OID_MECH_MISMATCH: mismatch between signature and hash
// mechanism
//
-long xcp_signerinfo(unsigned char *asn, size_t alen,
- const unsigned char *ski, size_t skilen, /* signer */
- const unsigned char *sig, size_t siglen,
- const CK_MECHANISM *sigmech,
- const CK_MECHANISM *hashmech) ;
+long xcp_signerinfo (unsigned char *asn, size_t alen,
+ const unsigned char *ski, size_t skilen, /* signer */
+ const unsigned char *sig, size_t siglen,
+ const CK_MECHANISM *sigmech,
+ const CK_MECHANISM *hashmech) ;
//-------------------------------------
@@ -1461,13 +1377,13 @@ long xcp_signerinfo(unsigned char *asn, size_t alen,
//
// no length checks on signature or SKI, other than checking both for non-empty
//
-long xcp_signerinfo_read(const unsigned char *sinfo, size_t silen,
- const unsigned char **ski, size_t *skilen,
- const unsigned char **sig, size_t *siglen,
- const unsigned char **hoid, size_t *hoidlen,
- const unsigned char **soid, size_t *soidlen,
- CK_MECHANISM *signmech,
- CK_MECHANISM *hashmech) ;
+long xcp_signerinfo_read (const unsigned char *sinfo, size_t silen,
+ const unsigned char **ski, size_t *skilen,
+ const unsigned char **sig, size_t *siglen,
+ const unsigned char **hoid, size_t *hoidlen,
+ const unsigned char **soid, size_t *soidlen,
+ CK_MECHANISM *signmech,
+ CK_MECHANISM *hashmech) ;
//-------------------------------------
@@ -1488,57 +1404,10 @@ long xcp_signerinfo_read(const unsigned char *sinfo, size_t silen,
//
// note: we do not verify other details of SPKI; caller must do so
//
-long xcp_spki2pubkey(const unsigned char **bitstr,
- const unsigned char *spki, size_t slen) ;
-
-
-
-//----------------------------------------------------------------------
-// The following functions are DEPRECTATED!
-// for return values see their xcpa_* counterpart
+long xcp_spki2pubkey (const unsigned char **bitstr,
+ const unsigned char *spki, size_t slen) ;
-/*----------------------------------------------------------------------
- * build a command block to (blk,blen), querying 'fn'
- * (payload,plen) copied to query block if non-NULL
- *
- * returns written bytecount; size query if blk is NULL
- * *minf used for module ID and transaction counter
- * ignored for commands where those fields are ignored
- */
-long ep11a_cmdblock(unsigned char *blk, size_t blen,
- unsigned int fn,
- const struct ep11_admresp *minf,
- const unsigned char *tctr, /* EP11_ADMCTR_BYTES */
- const unsigned char *payload, size_t plen)
- __attribute__ ((deprecated)) ;
-
-
-/*----------------------------------------------------------------------
- * returns <0 if response is malformed, or contents invalid
- *
- * parse embedded return value from response, writes to *rv if non-NULL
- * (outside envelope always reports CKR_OK, unless infrastructure
- * failed)
- */
-long ep11a_internal_rv(const unsigned char *rsp, size_t rlen,
- struct ep11_admresp *rspblk, CK_RV *rv)
- __attribute__ ((deprecated)) ;
-
-
-/*----------------------------------------------------------------------
- * in: [0] query type
- * out: [0] packed info structure
- *
- * outputs are fixed size, except CK_IBM_XCPQ_DOMAINS, which returns a
- * list therefore, infbytes is ignored by other types (we still check
- * if present)
- */
-CK_RV m_get_ep11_info(CK_VOID_PTR pinfo, CK_ULONG_PTR infbytes,
- unsigned int query,
- unsigned int subquery,
- target_t target)
- __attribute__ ((deprecated)) ;
/*
@@ -1548,7 +1417,7 @@ CK_RV m_get_ep11_info(CK_VOID_PTR pinfo, CK_ULONG_PTR infbytes,
* mask pointer to an 32 byte array that represents our domain mask
* masksize bit-length of the mask
*/
-int xcp_args2mask(char *args, unsigned char *mask, int masksize) ;
+int xcp_args2mask(char *args, unsigned char *mask, int masksize);
/*
@@ -1602,6 +1471,10 @@ long xcpa_write_full_file(target_t target,
unsigned int fileid, unsigned int block);
+long xcpa_remove_file(target_t target, unsigned int fileid,
+ xcpa_admin_signs_cb_t sign_cb, const void *signopts);
+
+
/* brute-force section parser: enumerate all encrypted-KP sections
*
* returns >0 offset of full OCTET STRING T+L+V section
@@ -1627,5 +1500,15 @@ long xcpa_kps_retrieve_rcptinfo(struct Recipient_info *rcpti,
const unsigned char *kpexport,
size_t kplen);
+
+/*
+ * report domain compliance
+ *
+ * returns compliance bitmask if successful and 0 if anything failed
+ * (as zero is invalid as we always have a default compliance active)
+ *
+ */
+uint64_t get_dom_compl(target_t target);
+
#endif /* !defined(__xcpadm_h__) */
--
2.16.2.windows.1