mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
Extract the minor version and modification level separately. Previously only the modification level has been extracted, and was reported as minor version. Currently no one is checking the minor version or modification level, so it does not hurt. But maybe in the future one will check, so report it correctly. Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com> Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
181 lines
4.7 KiB
C
181 lines
4.7 KiB
C
/*
|
|
* zkey - Generate, re-encipher, and validate secure keys
|
|
*
|
|
* This header file defines the interface to the EP11 host library.
|
|
*
|
|
* Copyright IBM Corp. 2019
|
|
*
|
|
* s390-tools is free software; you can redistribute it and/or modify
|
|
* it under the terms of the MIT license. See LICENSE for details.
|
|
*/
|
|
|
|
#ifndef EP11_H
|
|
#define EP11_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "lib/zt_common.h"
|
|
|
|
/* EP11 definitions */
|
|
|
|
typedef uint64_t target_t;
|
|
typedef unsigned long int CK_ULONG;
|
|
typedef CK_ULONG CK_RV;
|
|
typedef unsigned char CK_BYTE;
|
|
typedef CK_BYTE CK_CHAR;
|
|
typedef CK_ULONG *CK_ULONG_PTR;
|
|
typedef void *CK_VOID_PTR;
|
|
|
|
typedef struct XCP_ModuleSocket {
|
|
char host[256 + 1];
|
|
uint32_t port;
|
|
} *XCP_ModuleSocket_t;
|
|
|
|
typedef struct XCP_DomainPerf {
|
|
unsigned int lastperf[256];
|
|
} *XCP_DomainPerf_t;
|
|
|
|
typedef struct XCP_Module {
|
|
uint32_t version;
|
|
uint64_t flags;
|
|
uint32_t domains;
|
|
unsigned char domainmask[256 / 8];
|
|
struct XCP_ModuleSocket socket;
|
|
uint32_t module_nr;
|
|
void *mhandle;
|
|
struct XCP_DomainPerf perf;
|
|
/* ----- end of v1 fields ----- */
|
|
uint32_t api;
|
|
/* ----- end of v2 fields ----- */
|
|
} *XCP_Module_t;
|
|
|
|
typedef enum {
|
|
XCP_MFL_SOCKET = 1,
|
|
XCP_MFL_MODULE = 2,
|
|
XCP_MFL_MHANDLE = 4,
|
|
XCP_MFL_PERF = 8,
|
|
XCP_MFL_VIRTUAL = 0x10,
|
|
XCP_MFL_STRICT = 0x20,
|
|
XCP_MFL_PROBE = 0x40,
|
|
XCP_MFL_ALW_TGT_ADD = 0x80,
|
|
XCP_MFL_MAX = 0xff
|
|
} XCP_Module_Flags;
|
|
|
|
#define XCP_MOD_VERSION_1 1
|
|
#define XCP_MOD_VERSION_2 2
|
|
#define XCP_TGT_INIT ~0UL
|
|
|
|
#define XCPTGTMASK_SET_DOM(mask, domain) \
|
|
mask[((domain)/8)] |= (1 << (7-(domain)%8))
|
|
|
|
#define XCP_SERIALNR_CHARS 8
|
|
#define XCP_ADMCTR_BYTES ((size_t) (128/8))
|
|
#define XCP_KEYCSUM_BYTES (256/8)
|
|
|
|
#define XCP_ADM_REENCRYPT 25 /* transform blobs to next WK */
|
|
|
|
#define MAX_BLOBSIZE 8192
|
|
|
|
#define CKR_VENDOR_DEFINED 0x80000000
|
|
#define CKR_IBM_WKID_MISMATCH CKR_VENDOR_DEFINED + 0x10001
|
|
|
|
typedef struct XCPadmresp {
|
|
uint32_t fn;
|
|
uint32_t domain;
|
|
uint32_t domainInst;
|
|
|
|
/* module ID || module instance */
|
|
unsigned char module[XCP_SERIALNR_CHARS + XCP_SERIALNR_CHARS];
|
|
unsigned char modNr[XCP_SERIALNR_CHARS];
|
|
unsigned char modInst[XCP_SERIALNR_CHARS];
|
|
|
|
unsigned char tctr[XCP_ADMCTR_BYTES]; /* transaction counter */
|
|
|
|
CK_RV rv;
|
|
uint32_t reason;
|
|
|
|
const unsigned char *payload;
|
|
size_t pllen;
|
|
} *XCPadmresp_t;
|
|
|
|
typedef struct CK_IBM_DOMAIN_INFO {
|
|
CK_ULONG domain;
|
|
CK_BYTE wk[XCP_KEYCSUM_BYTES];
|
|
CK_BYTE nextwk[XCP_KEYCSUM_BYTES];
|
|
CK_ULONG flags;
|
|
CK_BYTE mode[8];
|
|
} CK_IBM_DOMAIN_INFO;
|
|
|
|
#define CK_IBM_DOM_COMMITTED_NWK 8
|
|
|
|
#define CK_IBM_XCPHQ_VERSION 0xff000001
|
|
#define CK_IBM_XCPQ_DOMAIN 3
|
|
|
|
#define MAX_APQN 256
|
|
|
|
typedef struct {
|
|
short format;
|
|
short length;
|
|
short apqns[2 * MAX_APQN];
|
|
} __packed ep11_target_t;
|
|
|
|
#define CKR_OK 0x00000000
|
|
|
|
typedef int (*m_init_t) (void);
|
|
typedef int (*m_add_module_t) (XCP_Module_t module, target_t *target);
|
|
typedef int (*m_rm_module_t) (XCP_Module_t module, target_t target);
|
|
typedef CK_RV (*m_get_xcp_info_t)(CK_VOID_PTR pinfo, CK_ULONG_PTR infbytes,
|
|
unsigned int query, unsigned int subquery,
|
|
target_t target);
|
|
typedef unsigned long int (*m_admin_t)(unsigned char *resp1, size_t *r1len,
|
|
unsigned char *resp2, size_t *r2len,
|
|
const unsigned char *cmd, size_t clen,
|
|
const unsigned char *sigs, size_t slen,
|
|
target_t target);
|
|
typedef long (*xcpa_cmdblock_t)(unsigned char *blk, size_t blen,
|
|
unsigned int fn, const struct XCPadmresp *minf,
|
|
const unsigned char *tctr,
|
|
const unsigned char *payload, size_t plen);
|
|
typedef long (*xcpa_internal_rv_t)(const unsigned char *rsp, size_t rlen,
|
|
struct XCPadmresp *rspblk, CK_RV *rv);
|
|
|
|
struct ep11_version {
|
|
unsigned int major;
|
|
unsigned int minor;
|
|
unsigned int modification;
|
|
};
|
|
|
|
struct ep11_lib {
|
|
void *lib_ep11;
|
|
m_init_t dll_m_init;
|
|
m_add_module_t dll_m_add_module;
|
|
m_rm_module_t dll_m_rm_module;
|
|
m_get_xcp_info_t dll_m_get_xcp_info;
|
|
m_admin_t dll_m_admin;
|
|
xcpa_cmdblock_t dll_xcpa_cmdblock;
|
|
xcpa_internal_rv_t dll_xcpa_internal_rv;
|
|
struct ep11_version version;
|
|
};
|
|
|
|
int load_ep11_library(struct ep11_lib *ep11, bool verbose);
|
|
|
|
int get_ep11_target_for_apqn(struct ep11_lib *ep11, unsigned int card,
|
|
unsigned int domain, target_t *target,
|
|
bool verbose);
|
|
|
|
void free_ep11_target_for_apqn(struct ep11_lib *ep11, target_t target);
|
|
|
|
#define FLAG_SEL_EP11_MATCH_CUR_MKVP 0x01
|
|
#define FLAG_SEL_EP11_NEW_MUST_BE_SET 0x80
|
|
|
|
int select_ep11_apqn_by_mkvp(struct ep11_lib *ep11, u8 *mkvp,
|
|
const char *apqns, unsigned int flags,
|
|
target_t *target, unsigned int *card,
|
|
unsigned int *domain, bool verbose);
|
|
|
|
int reencipher_ep11_key(struct ep11_lib *ep11, target_t target,
|
|
unsigned int card, unsigned int domain, u8 *secure_key,
|
|
unsigned int secure_key_size, bool verbose);
|
|
|
|
#endif
|