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