2006-09-20 17:58:27 +04:00
/*
* include / asm - s390 / zcrypt . h
*
2006-09-20 17:58:36 +04:00
* zcrypt 2.1 .0 ( user - visible header )
2006-09-20 17:58:27 +04:00
*
* Copyright ( C ) 2001 , 2006 IBM Corporation
* Author ( s ) : Robert Burroughs
* Eric Rossman ( edrossma @ us . ibm . com )
*
* Hotplug & misc device support : Jochen Roehrig ( roehrig @ de . ibm . com )
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# ifndef __ASM_S390_ZCRYPT_H
# define __ASM_S390_ZCRYPT_H
# define ZCRYPT_VERSION 2
# define ZCRYPT_RELEASE 1
# define ZCRYPT_VARIANT 0
# include <linux/ioctl.h>
# include <linux/compiler.h>
/**
* struct ica_rsa_modexpo
*
* Requirements :
* - outputdatalength is at least as large as inputdatalength .
* - All key parts are right justified in their fields , padded on
* the left with zeroes .
* - length ( b_key ) = inputdatalength
* - length ( n_modulus ) = inputdatalength
*/
struct ica_rsa_modexpo {
char __user * inputdata ;
unsigned int inputdatalength ;
char __user * outputdata ;
unsigned int outputdatalength ;
char __user * b_key ;
char __user * n_modulus ;
} ;
/**
* struct ica_rsa_modexpo_crt
*
* Requirements :
* - inputdatalength is even .
* - outputdatalength is at least as large as inputdatalength .
* - All key parts are right justified in their fields , padded on
* the left with zeroes .
* - length ( bp_key ) = inputdatalength / 2 + 8
* - length ( bq_key ) = inputdatalength / 2
* - length ( np_key ) = inputdatalength / 2 + 8
* - length ( nq_key ) = inputdatalength / 2
* - length ( u_mult_inv ) = inputdatalength / 2 + 8
*/
struct ica_rsa_modexpo_crt {
char __user * inputdata ;
unsigned int inputdatalength ;
char __user * outputdata ;
unsigned int outputdatalength ;
char __user * bp_key ;
char __user * bq_key ;
char __user * np_prime ;
char __user * nq_prime ;
char __user * u_mult_inv ;
} ;
2006-09-20 17:58:36 +04:00
/**
* CPRBX
* Note that all shorts and ints are big - endian .
* All pointer fields are 16 bytes long , and mean nothing .
*
* A request CPRB is followed by a request_parameter_block .
*
* The request ( or reply ) parameter block is organized thus :
* function code
* VUD block
* key block
*/
2007-10-12 18:11:28 +04:00
struct CPRBX {
2006-09-20 17:58:36 +04:00
unsigned short cprb_len ; /* CPRB length 220 */
unsigned char cprb_ver_id ; /* CPRB version id. 0x02 */
unsigned char pad_000 [ 3 ] ; /* Alignment pad bytes */
unsigned char func_id [ 2 ] ; /* function id 0x5432 */
unsigned char cprb_flags [ 4 ] ; /* Flags */
unsigned int req_parml ; /* request parameter buffer len */
unsigned int req_datal ; /* request data buffer */
unsigned int rpl_msgbl ; /* reply message block length */
unsigned int rpld_parml ; /* replied parameter block len */
unsigned int rpl_datal ; /* reply data block len */
unsigned int rpld_datal ; /* replied data block len */
unsigned int req_extbl ; /* request extension block len */
unsigned char pad_001 [ 4 ] ; /* reserved */
unsigned int rpld_extbl ; /* replied extension block len */
unsigned char padx000 [ 16 - sizeof ( char * ) ] ;
unsigned char * req_parmb ; /* request parm block 'address' */
unsigned char padx001 [ 16 - sizeof ( char * ) ] ;
unsigned char * req_datab ; /* request data block 'address' */
unsigned char padx002 [ 16 - sizeof ( char * ) ] ;
unsigned char * rpl_parmb ; /* reply parm block 'address' */
unsigned char padx003 [ 16 - sizeof ( char * ) ] ;
unsigned char * rpl_datab ; /* reply data block 'address' */
unsigned char padx004 [ 16 - sizeof ( char * ) ] ;
unsigned char * req_extb ; /* request extension block 'addr'*/
unsigned char padx005 [ 16 - sizeof ( char * ) ] ;
2008-01-26 16:11:19 +03:00
unsigned char * rpl_extb ; /* reply extension block 'address'*/
2006-09-20 17:58:36 +04:00
unsigned short ccp_rtcode ; /* server return code */
unsigned short ccp_rscode ; /* server reason code */
unsigned int mac_data_len ; /* Mac Data Length */
unsigned char logon_id [ 8 ] ; /* Logon Identifier */
unsigned char mac_value [ 8 ] ; /* Mac Value */
unsigned char mac_content_flgs ; /* Mac content flag byte */
unsigned char pad_002 ; /* Alignment */
unsigned short domain ; /* Domain */
unsigned char usage_domain [ 4 ] ; /* Usage domain */
unsigned char cntrl_domain [ 4 ] ; /* Control domain */
unsigned char S390enf_mask [ 4 ] ; /* S/390 enforcement mask */
unsigned char pad_004 [ 36 ] ; /* reserved */
2007-10-12 18:11:28 +04:00
} __attribute__ ( ( packed ) ) ;
2006-09-20 17:58:36 +04:00
/**
* xcRB
*/
struct ica_xcRB {
unsigned short agent_ID ;
unsigned int user_defined ;
unsigned short request_ID ;
unsigned int request_control_blk_length ;
unsigned char padding1 [ 16 - sizeof ( char * ) ] ;
char __user * request_control_blk_addr ;
unsigned int request_data_length ;
char padding2 [ 16 - sizeof ( char * ) ] ;
char __user * request_data_address ;
unsigned int reply_control_blk_length ;
char padding3 [ 16 - sizeof ( char * ) ] ;
char __user * reply_control_blk_addr ;
unsigned int reply_data_length ;
char padding4 [ 16 - sizeof ( char * ) ] ;
char __user * reply_data_addr ;
unsigned short priority_window ;
unsigned int status ;
} __attribute__ ( ( packed ) ) ;
# define AUTOSELECT ((unsigned int)0xFFFFFFFF)
2006-09-20 17:58:27 +04:00
# define ZCRYPT_IOCTL_MAGIC 'z'
/**
* Interface notes :
*
* The ioctl ( ) s which are implemented ( along with relevant details )
* are :
*
* ICARSAMODEXPO
* Perform an RSA operation using a Modulus - Exponent pair
* This takes an ica_rsa_modexpo struct as its arg .
*
* NOTE : please refer to the comments preceding this structure
* for the implementation details for the contents of the
* block
*
* ICARSACRT
* Perform an RSA operation using a Chinese - Remainder Theorem key
* This takes an ica_rsa_modexpo_crt struct as its arg .
*
* NOTE : please refer to the comments preceding this structure
* for the implementation details for the contents of the
* block
*
2006-12-04 17:40:00 +03:00
* ZSECSENDCPRB
* Send an arbitrary CPRB to a crypto card .
2006-09-20 17:58:27 +04:00
*
* Z90STAT_STATUS_MASK
* Return an 64 element array of unsigned chars for the status of
* all devices .
* 0x01 : PCICA
* 0x02 : PCICC
* 0x03 : PCIXCC_MCL2
* 0x04 : PCIXCC_MCL3
* 0x05 : CEX2C
* 0x06 : CEX2A
* 0x0d : device is disabled via the proc filesystem
*
* Z90STAT_QDEPTH_MASK
* Return an 64 element array of unsigned chars for the queue
* depth of all devices .
*
* Z90STAT_PERDEV_REQCNT
* Return an 64 element array of unsigned integers for the number
* of successfully completed requests per device since the device
* was detected and made available .
*
2006-12-04 17:40:00 +03:00
* Z90STAT_REQUESTQ_COUNT
* Return an integer count of the number of entries waiting to be
* sent to a device .
*
* Z90STAT_PENDINGQ_COUNT
* Return an integer count of the number of entries sent to all
* devices awaiting the reply .
*
* Z90STAT_TOTALOPEN_COUNT
* Return an integer count of the number of open file handles .
*
* Z90STAT_DOMAIN_INDEX
* Return the integer value of the Cryptographic Domain .
*
* The following ioctls are deprecated and should be no longer used :
*
* Z90STAT_TOTALCOUNT
* Return an integer count of all device types together .
*
* Z90STAT_PCICACOUNT
* Return an integer count of all PCICAs .
*
* Z90STAT_PCICCCOUNT
* Return an integer count of all PCICCs .
*
* Z90STAT_PCIXCCMCL2COUNT
* Return an integer count of all MCL2 PCIXCCs .
*
* Z90STAT_PCIXCCMCL3COUNT
* Return an integer count of all MCL3 PCIXCCs .
*
* Z90STAT_CEX2CCOUNT
* Return an integer count of all CEX2Cs .
*
* Z90STAT_CEX2ACOUNT
* Return an integer count of all CEX2As .
*
* ICAZ90STATUS
2006-09-20 17:58:27 +04:00
* Return some device driver status in a ica_z90_status struct
* This takes an ica_z90_status struct as its arg .
*
2006-12-04 17:40:00 +03:00
* Z90STAT_PCIXCCCOUNT
2006-09-20 17:58:27 +04:00
* Return an integer count of all PCIXCCs ( MCL2 + MCL3 ) .
* This is DEPRECATED now that MCL3 PCIXCCs are treated differently from
* MCL2 PCIXCCs .
*/
/**
* Supported ioctl calls
*/
# define ICARSAMODEXPO _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x05, 0)
# define ICARSACRT _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x06, 0)
2006-09-20 17:58:36 +04:00
# define ZSECSENDCPRB _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x81, 0)
2006-09-20 17:58:27 +04:00
/* New status calls */
# define Z90STAT_TOTALCOUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x40, int)
# define Z90STAT_PCICACOUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x41, int)
# define Z90STAT_PCICCCOUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x42, int)
# define Z90STAT_PCIXCCMCL2COUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x4b, int)
# define Z90STAT_PCIXCCMCL3COUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x4c, int)
# define Z90STAT_CEX2CCOUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x4d, int)
# define Z90STAT_CEX2ACOUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x4e, int)
# define Z90STAT_REQUESTQ_COUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x44, int)
# define Z90STAT_PENDINGQ_COUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x45, int)
# define Z90STAT_TOTALOPEN_COUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x46, int)
# define Z90STAT_DOMAIN_INDEX _IOR(ZCRYPT_IOCTL_MAGIC, 0x47, int)
# define Z90STAT_STATUS_MASK _IOR(ZCRYPT_IOCTL_MAGIC, 0x48, char[64])
# define Z90STAT_QDEPTH_MASK _IOR(ZCRYPT_IOCTL_MAGIC, 0x49, char[64])
# define Z90STAT_PERDEV_REQCNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x4a, int[64])
# endif /* __ASM_S390_ZCRYPT_H */