zcrypt.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
  2. /*
  3. * include/asm-s390/zcrypt.h
  4. *
  5. * zcrypt 2.1.0 (user-visible header)
  6. *
  7. * Copyright IBM Corp. 2001, 2006
  8. * Author(s): Robert Burroughs
  9. * Eric Rossman (edrossma@us.ibm.com)
  10. *
  11. * Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
  12. */
  13. #ifndef __ASM_S390_ZCRYPT_H
  14. #define __ASM_S390_ZCRYPT_H
  15. #define ZCRYPT_VERSION 2
  16. #define ZCRYPT_RELEASE 1
  17. #define ZCRYPT_VARIANT 1
  18. #include <linux/ioctl.h>
  19. #include <linux/compiler.h>
  20. /**
  21. * struct ica_rsa_modexpo
  22. *
  23. * Requirements:
  24. * - outputdatalength is at least as large as inputdatalength.
  25. * - All key parts are right justified in their fields, padded on
  26. * the left with zeroes.
  27. * - length(b_key) = inputdatalength
  28. * - length(n_modulus) = inputdatalength
  29. */
  30. struct ica_rsa_modexpo {
  31. char __user *inputdata;
  32. unsigned int inputdatalength;
  33. char __user *outputdata;
  34. unsigned int outputdatalength;
  35. char __user *b_key;
  36. char __user *n_modulus;
  37. };
  38. /**
  39. * struct ica_rsa_modexpo_crt
  40. *
  41. * Requirements:
  42. * - inputdatalength is even.
  43. * - outputdatalength is at least as large as inputdatalength.
  44. * - All key parts are right justified in their fields, padded on
  45. * the left with zeroes.
  46. * - length(bp_key) = inputdatalength/2 + 8
  47. * - length(bq_key) = inputdatalength/2
  48. * - length(np_key) = inputdatalength/2 + 8
  49. * - length(nq_key) = inputdatalength/2
  50. * - length(u_mult_inv) = inputdatalength/2 + 8
  51. */
  52. struct ica_rsa_modexpo_crt {
  53. char __user *inputdata;
  54. unsigned int inputdatalength;
  55. char __user *outputdata;
  56. unsigned int outputdatalength;
  57. char __user *bp_key;
  58. char __user *bq_key;
  59. char __user *np_prime;
  60. char __user *nq_prime;
  61. char __user *u_mult_inv;
  62. };
  63. /**
  64. * CPRBX
  65. * Note that all shorts and ints are big-endian.
  66. * All pointer fields are 16 bytes long, and mean nothing.
  67. *
  68. * A request CPRB is followed by a request_parameter_block.
  69. *
  70. * The request (or reply) parameter block is organized thus:
  71. * function code
  72. * VUD block
  73. * key block
  74. */
  75. struct CPRBX {
  76. unsigned short cprb_len; /* CPRB length 220 */
  77. unsigned char cprb_ver_id; /* CPRB version id. 0x02 */
  78. unsigned char pad_000[3]; /* Alignment pad bytes */
  79. unsigned char func_id[2]; /* function id 0x5432 */
  80. unsigned char cprb_flags[4]; /* Flags */
  81. unsigned int req_parml; /* request parameter buffer len */
  82. unsigned int req_datal; /* request data buffer */
  83. unsigned int rpl_msgbl; /* reply message block length */
  84. unsigned int rpld_parml; /* replied parameter block len */
  85. unsigned int rpl_datal; /* reply data block len */
  86. unsigned int rpld_datal; /* replied data block len */
  87. unsigned int req_extbl; /* request extension block len */
  88. unsigned char pad_001[4]; /* reserved */
  89. unsigned int rpld_extbl; /* replied extension block len */
  90. unsigned char padx000[16 - sizeof(char *)];
  91. unsigned char *req_parmb; /* request parm block 'address' */
  92. unsigned char padx001[16 - sizeof(char *)];
  93. unsigned char *req_datab; /* request data block 'address' */
  94. unsigned char padx002[16 - sizeof(char *)];
  95. unsigned char *rpl_parmb; /* reply parm block 'address' */
  96. unsigned char padx003[16 - sizeof(char *)];
  97. unsigned char *rpl_datab; /* reply data block 'address' */
  98. unsigned char padx004[16 - sizeof(char *)];
  99. unsigned char *req_extb; /* request extension block 'addr'*/
  100. unsigned char padx005[16 - sizeof(char *)];
  101. unsigned char *rpl_extb; /* reply extension block 'address'*/
  102. unsigned short ccp_rtcode; /* server return code */
  103. unsigned short ccp_rscode; /* server reason code */
  104. unsigned int mac_data_len; /* Mac Data Length */
  105. unsigned char logon_id[8]; /* Logon Identifier */
  106. unsigned char mac_value[8]; /* Mac Value */
  107. unsigned char mac_content_flgs;/* Mac content flag byte */
  108. unsigned char pad_002; /* Alignment */
  109. unsigned short domain; /* Domain */
  110. unsigned char usage_domain[4];/* Usage domain */
  111. unsigned char cntrl_domain[4];/* Control domain */
  112. unsigned char S390enf_mask[4];/* S/390 enforcement mask */
  113. unsigned char pad_004[36]; /* reserved */
  114. } __attribute__((packed));
  115. /**
  116. * xcRB
  117. */
  118. struct ica_xcRB {
  119. unsigned short agent_ID;
  120. unsigned int user_defined;
  121. unsigned short request_ID;
  122. unsigned int request_control_blk_length;
  123. unsigned char padding1[16 - sizeof(char *)];
  124. char __user *request_control_blk_addr;
  125. unsigned int request_data_length;
  126. char padding2[16 - sizeof(char *)];
  127. char __user *request_data_address;
  128. unsigned int reply_control_blk_length;
  129. char padding3[16 - sizeof(char *)];
  130. char __user *reply_control_blk_addr;
  131. unsigned int reply_data_length;
  132. char padding4[16 - sizeof(char *)];
  133. char __user *reply_data_addr;
  134. unsigned short priority_window;
  135. unsigned int status;
  136. } __attribute__((packed));
  137. /**
  138. * struct ep11_cprb - EP11 connectivity programming request block
  139. * @cprb_len: CPRB header length [0x0020]
  140. * @cprb_ver_id: CPRB version id. [0x04]
  141. * @pad_000: Alignment pad bytes
  142. * @flags: Admin bit [0x80], Special bit [0x20]
  143. * @func_id: Function id / subtype [0x5434] "T4"
  144. * @source_id: Source id [originator id]
  145. * @target_id: Target id [usage/ctrl domain id]
  146. * @ret_code: Return code
  147. * @reserved1: Reserved
  148. * @reserved2: Reserved
  149. * @payload_len: Payload length
  150. */
  151. struct ep11_cprb {
  152. uint16_t cprb_len;
  153. unsigned char cprb_ver_id;
  154. unsigned char pad_000[2];
  155. unsigned char flags;
  156. unsigned char func_id[2];
  157. uint32_t source_id;
  158. uint32_t target_id;
  159. uint32_t ret_code;
  160. uint32_t reserved1;
  161. uint32_t reserved2;
  162. uint32_t payload_len;
  163. } __attribute__((packed));
  164. /**
  165. * struct ep11_target_dev - EP11 target device list
  166. * @ap_id: AP device id
  167. * @dom_id: Usage domain id
  168. */
  169. struct ep11_target_dev {
  170. uint16_t ap_id;
  171. uint16_t dom_id;
  172. };
  173. /**
  174. * struct ep11_urb - EP11 user request block
  175. * @targets_num: Number of target adapters
  176. * @targets: Addr to target adapter list
  177. * @weight: Level of request priority
  178. * @req_no: Request id/number
  179. * @req_len: Request length
  180. * @req: Addr to request block
  181. * @resp_len: Response length
  182. * @resp: Addr to response block
  183. */
  184. struct ep11_urb {
  185. uint16_t targets_num;
  186. uint64_t targets;
  187. uint64_t weight;
  188. uint64_t req_no;
  189. uint64_t req_len;
  190. uint64_t req;
  191. uint64_t resp_len;
  192. uint64_t resp;
  193. } __attribute__((packed));
  194. /**
  195. * struct zcrypt_device_status_ext
  196. * @hwtype: raw hardware type
  197. * @qid: 8 bit device index, 8 bit domain
  198. * @functions: AP device function bit field 'abcdef'
  199. * a, b, c = reserved
  200. * d = CCA coprocessor
  201. * e = Accelerator
  202. * f = EP11 coprocessor
  203. * @online online status
  204. * @reserved reserved
  205. */
  206. struct zcrypt_device_status_ext {
  207. unsigned int hwtype:8;
  208. unsigned int qid:16;
  209. unsigned int online:1;
  210. unsigned int functions:6;
  211. unsigned int reserved:1;
  212. };
  213. #define MAX_ZDEV_CARDIDS_EXT 256
  214. #define MAX_ZDEV_DOMAINS_EXT 256
  215. /* Maximum number of zcrypt devices */
  216. #define MAX_ZDEV_ENTRIES_EXT (MAX_ZDEV_CARDIDS_EXT * MAX_ZDEV_DOMAINS_EXT)
  217. /* Device matrix of all zcrypt devices */
  218. struct zcrypt_device_matrix_ext {
  219. struct zcrypt_device_status_ext device[MAX_ZDEV_ENTRIES_EXT];
  220. };
  221. #define AUTOSELECT 0xFFFFFFFF
  222. #define ZCRYPT_IOCTL_MAGIC 'z'
  223. /**
  224. * Interface notes:
  225. *
  226. * The ioctl()s which are implemented (along with relevant details)
  227. * are:
  228. *
  229. * ICARSAMODEXPO
  230. * Perform an RSA operation using a Modulus-Exponent pair
  231. * This takes an ica_rsa_modexpo struct as its arg.
  232. *
  233. * NOTE: please refer to the comments preceding this structure
  234. * for the implementation details for the contents of the
  235. * block
  236. *
  237. * ICARSACRT
  238. * Perform an RSA operation using a Chinese-Remainder Theorem key
  239. * This takes an ica_rsa_modexpo_crt struct as its arg.
  240. *
  241. * NOTE: please refer to the comments preceding this structure
  242. * for the implementation details for the contents of the
  243. * block
  244. *
  245. * ZSECSENDCPRB
  246. * Send an arbitrary CPRB to a crypto card.
  247. *
  248. * ZSENDEP11CPRB
  249. * Send an arbitrary EP11 CPRB to an EP11 coprocessor crypto card.
  250. *
  251. * ZCRYPT_DEVICE_STATUS
  252. * The given struct zcrypt_device_matrix_ext is updated with
  253. * status information for each currently known apqn.
  254. *
  255. * ZCRYPT_STATUS_MASK
  256. * Return an MAX_ZDEV_CARDIDS_EXT element array of unsigned chars for the
  257. * status of all devices.
  258. * 0x01: PCICA
  259. * 0x02: PCICC
  260. * 0x03: PCIXCC_MCL2
  261. * 0x04: PCIXCC_MCL3
  262. * 0x05: CEX2C
  263. * 0x06: CEX2A
  264. * 0x07: CEX3C
  265. * 0x08: CEX3A
  266. * 0x0a: CEX4
  267. * 0x0b: CEX5
  268. * 0x0c: CEX6
  269. * 0x0d: device is disabled
  270. *
  271. * ZCRYPT_QDEPTH_MASK
  272. * Return an MAX_ZDEV_CARDIDS_EXT element array of unsigned chars for the
  273. * queue depth of all devices.
  274. *
  275. * ZCRYPT_PERDEV_REQCNT
  276. * Return an MAX_ZDEV_CARDIDS_EXT element array of unsigned integers for
  277. * the number of successfully completed requests per device since the
  278. * device was detected and made available.
  279. *
  280. */
  281. /**
  282. * Supported ioctl calls
  283. */
  284. #define ICARSAMODEXPO _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x05, 0)
  285. #define ICARSACRT _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x06, 0)
  286. #define ZSECSENDCPRB _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x81, 0)
  287. #define ZSENDEP11CPRB _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x04, 0)
  288. #define ZCRYPT_DEVICE_STATUS _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x5f, 0)
  289. #define ZCRYPT_STATUS_MASK _IOR(ZCRYPT_IOCTL_MAGIC, 0x58, char[MAX_ZDEV_CARDIDS_EXT])
  290. #define ZCRYPT_QDEPTH_MASK _IOR(ZCRYPT_IOCTL_MAGIC, 0x59, char[MAX_ZDEV_CARDIDS_EXT])
  291. #define ZCRYPT_PERDEV_REQCNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x5a, int[MAX_ZDEV_CARDIDS_EXT])
  292. /*
  293. * Only deprecated defines, structs and ioctls below this line.
  294. */
  295. /* Deprecated: use MAX_ZDEV_CARDIDS_EXT */
  296. #define MAX_ZDEV_CARDIDS 64
  297. /* Deprecated: use MAX_ZDEV_DOMAINS_EXT */
  298. #define MAX_ZDEV_DOMAINS 256
  299. /* Deprecated: use MAX_ZDEV_ENTRIES_EXT */
  300. #define MAX_ZDEV_ENTRIES (MAX_ZDEV_CARDIDS * MAX_ZDEV_DOMAINS)
  301. /* Deprecated: use struct zcrypt_device_status_ext */
  302. struct zcrypt_device_status {
  303. unsigned int hwtype:8;
  304. unsigned int qid:14;
  305. unsigned int online:1;
  306. unsigned int functions:6;
  307. unsigned int reserved:3;
  308. };
  309. /* Deprecated: use struct zcrypt_device_matrix_ext */
  310. struct zcrypt_device_matrix {
  311. struct zcrypt_device_status device[MAX_ZDEV_ENTRIES];
  312. };
  313. /* Deprecated: use ZCRYPT_DEVICE_STATUS */
  314. #define ZDEVICESTATUS _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x4f, 0)
  315. /* Deprecated: use ZCRYPT_STATUS_MASK */
  316. #define Z90STAT_STATUS_MASK _IOR(ZCRYPT_IOCTL_MAGIC, 0x48, char[64])
  317. /* Deprecated: use ZCRYPT_QDEPTH_MASK */
  318. #define Z90STAT_QDEPTH_MASK _IOR(ZCRYPT_IOCTL_MAGIC, 0x49, char[64])
  319. /* Deprecated: use ZCRYPT_PERDEV_REQCNT */
  320. #define Z90STAT_PERDEV_REQCNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x4a, int[64])
  321. /* Deprecated: use sysfs to query these values */
  322. #define Z90STAT_REQUESTQ_COUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x44, int)
  323. #define Z90STAT_PENDINGQ_COUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x45, int)
  324. #define Z90STAT_TOTALOPEN_COUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x46, int)
  325. #define Z90STAT_DOMAIN_INDEX _IOR(ZCRYPT_IOCTL_MAGIC, 0x47, int)
  326. /*
  327. * The ioctl number ranges 0x40 - 0x42 and 0x4b - 0x4e had been used in the
  328. * past, don't assign new ioctls for these.
  329. */
  330. #endif /* __ASM_S390_ZCRYPT_H */