1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 *  Copyright IBM Corp. 2001, 2006
4 *  Author(s): Robert Burroughs
5 *	       Eric Rossman (edrossma@us.ibm.com)
6 *
7 *  Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
8 *  Major cleanup & driver split: Martin Schwidefsky <schwidefsky@de.ibm.com>
9 */
10
11#ifndef _ZCRYPT_CEX2A_H_
12#define _ZCRYPT_CEX2A_H_
13
14/**
15 * The type 50 message family is associated with CEXxA cards.
16 *
17 * The four members of the family are described below.
18 *
19 * Note that all unsigned char arrays are right-justified and left-padded
20 * with zeroes.
21 *
22 * Note that all reserved fields must be zeroes.
23 */
24struct type50_hdr {
25	unsigned char	reserved1;
26	unsigned char	msg_type_code;	/* 0x50 */
27	unsigned short	msg_len;
28	unsigned char	reserved2;
29	unsigned char	ignored;
30	unsigned short	reserved3;
31} __packed;
32
33#define TYPE50_TYPE_CODE	0x50
34
35#define TYPE50_MEB1_FMT		0x0001
36#define TYPE50_MEB2_FMT		0x0002
37#define TYPE50_MEB3_FMT		0x0003
38#define TYPE50_CRB1_FMT		0x0011
39#define TYPE50_CRB2_FMT		0x0012
40#define TYPE50_CRB3_FMT		0x0013
41
42/* Mod-Exp, with a small modulus */
43struct type50_meb1_msg {
44	struct type50_hdr header;
45	unsigned short	keyblock_type;	/* 0x0001 */
46	unsigned char	reserved[6];
47	unsigned char	exponent[128];
48	unsigned char	modulus[128];
49	unsigned char	message[128];
50} __packed;
51
52/* Mod-Exp, with a large modulus */
53struct type50_meb2_msg {
54	struct type50_hdr header;
55	unsigned short	keyblock_type;	/* 0x0002 */
56	unsigned char	reserved[6];
57	unsigned char	exponent[256];
58	unsigned char	modulus[256];
59	unsigned char	message[256];
60} __packed;
61
62/* Mod-Exp, with a larger modulus */
63struct type50_meb3_msg {
64	struct type50_hdr header;
65	unsigned short	keyblock_type;	/* 0x0003 */
66	unsigned char	reserved[6];
67	unsigned char	exponent[512];
68	unsigned char	modulus[512];
69	unsigned char	message[512];
70} __packed;
71
72/* CRT, with a small modulus */
73struct type50_crb1_msg {
74	struct type50_hdr header;
75	unsigned short	keyblock_type;	/* 0x0011 */
76	unsigned char	reserved[6];
77	unsigned char	p[64];
78	unsigned char	q[64];
79	unsigned char	dp[64];
80	unsigned char	dq[64];
81	unsigned char	u[64];
82	unsigned char	message[128];
83} __packed;
84
85/* CRT, with a large modulus */
86struct type50_crb2_msg {
87	struct type50_hdr header;
88	unsigned short	keyblock_type;	/* 0x0012 */
89	unsigned char	reserved[6];
90	unsigned char	p[128];
91	unsigned char	q[128];
92	unsigned char	dp[128];
93	unsigned char	dq[128];
94	unsigned char	u[128];
95	unsigned char	message[256];
96} __packed;
97
98/* CRT, with a larger modulus */
99struct type50_crb3_msg {
100	struct type50_hdr header;
101	unsigned short	keyblock_type;	/* 0x0013 */
102	unsigned char	reserved[6];
103	unsigned char	p[256];
104	unsigned char	q[256];
105	unsigned char	dp[256];
106	unsigned char	dq[256];
107	unsigned char	u[256];
108	unsigned char	message[512];
109} __packed;
110
111/**
112 * The type 80 response family is associated with a CEXxA cards.
113 *
114 * Note that all unsigned char arrays are right-justified and left-padded
115 * with zeroes.
116 *
117 * Note that all reserved fields must be zeroes.
118 */
119
120#define TYPE80_RSP_CODE 0x80
121
122struct type80_hdr {
123	unsigned char	reserved1;
124	unsigned char	type;		/* 0x80 */
125	unsigned short	len;
126	unsigned char	code;		/* 0x00 */
127	unsigned char	reserved2[3];
128	unsigned char	reserved3[8];
129} __packed;
130
131int zcrypt_cex2a_init(void);
132void zcrypt_cex2a_exit(void);
133
134#endif /* _ZCRYPT_CEX2A_H_ */
135