1 /* 2 * linux/drivers/s390/crypto/zcrypt_cex2a.h 3 * 4 * zcrypt 2.1.0 5 * 6 * Copyright (C) 2001, 2006 IBM Corporation 7 * Author(s): Robert Burroughs 8 * Eric Rossman (edrossma@us.ibm.com) 9 * 10 * Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com) 11 * Major cleanup & driver split: Martin Schwidefsky <schwidefsky@de.ibm.com> 12 * 13 * This program is free software; you can redistribute it and/or modify 14 * it under the terms of the GNU General Public License as published by 15 * the Free Software Foundation; either version 2, or (at your option) 16 * any later version. 17 * 18 * This program is distributed in the hope that it will be useful, 19 * but WITHOUT ANY WARRANTY; without even the implied warranty of 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21 * GNU General Public License for more details. 22 * 23 * You should have received a copy of the GNU General Public License 24 * along with this program; if not, write to the Free Software 25 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 26 */ 27 28 #ifndef _ZCRYPT_CEX2A_H_ 29 #define _ZCRYPT_CEX2A_H_ 30 31 /** 32 * The type 50 message family is associated with a CEX2A card. 33 * 34 * The four members of the family are described below. 35 * 36 * Note that all unsigned char arrays are right-justified and left-padded 37 * with zeroes. 38 * 39 * Note that all reserved fields must be zeroes. 40 */ 41 struct type50_hdr { 42 unsigned char reserved1; 43 unsigned char msg_type_code; /* 0x50 */ 44 unsigned short msg_len; 45 unsigned char reserved2; 46 unsigned char ignored; 47 unsigned short reserved3; 48 } __attribute__((packed)); 49 50 #define TYPE50_TYPE_CODE 0x50 51 52 #define TYPE50_MEB1_FMT 0x0001 53 #define TYPE50_MEB2_FMT 0x0002 54 #define TYPE50_MEB3_FMT 0x0003 55 #define TYPE50_CRB1_FMT 0x0011 56 #define TYPE50_CRB2_FMT 0x0012 57 #define TYPE50_CRB3_FMT 0x0013 58 59 /* Mod-Exp, with a small modulus */ 60 struct type50_meb1_msg { 61 struct type50_hdr header; 62 unsigned short keyblock_type; /* 0x0001 */ 63 unsigned char reserved[6]; 64 unsigned char exponent[128]; 65 unsigned char modulus[128]; 66 unsigned char message[128]; 67 } __attribute__((packed)); 68 69 /* Mod-Exp, with a large modulus */ 70 struct type50_meb2_msg { 71 struct type50_hdr header; 72 unsigned short keyblock_type; /* 0x0002 */ 73 unsigned char reserved[6]; 74 unsigned char exponent[256]; 75 unsigned char modulus[256]; 76 unsigned char message[256]; 77 } __attribute__((packed)); 78 79 /* Mod-Exp, with a larger modulus */ 80 struct type50_meb3_msg { 81 struct type50_hdr header; 82 unsigned short keyblock_type; /* 0x0003 */ 83 unsigned char reserved[6]; 84 unsigned char exponent[512]; 85 unsigned char modulus[512]; 86 unsigned char message[512]; 87 } __attribute__((packed)); 88 89 /* CRT, with a small modulus */ 90 struct type50_crb1_msg { 91 struct type50_hdr header; 92 unsigned short keyblock_type; /* 0x0011 */ 93 unsigned char reserved[6]; 94 unsigned char p[64]; 95 unsigned char q[64]; 96 unsigned char dp[64]; 97 unsigned char dq[64]; 98 unsigned char u[64]; 99 unsigned char message[128]; 100 } __attribute__((packed)); 101 102 /* CRT, with a large modulus */ 103 struct type50_crb2_msg { 104 struct type50_hdr header; 105 unsigned short keyblock_type; /* 0x0012 */ 106 unsigned char reserved[6]; 107 unsigned char p[128]; 108 unsigned char q[128]; 109 unsigned char dp[128]; 110 unsigned char dq[128]; 111 unsigned char u[128]; 112 unsigned char message[256]; 113 } __attribute__((packed)); 114 115 /* CRT, with a larger modulus */ 116 struct type50_crb3_msg { 117 struct type50_hdr header; 118 unsigned short keyblock_type; /* 0x0013 */ 119 unsigned char reserved[6]; 120 unsigned char p[256]; 121 unsigned char q[256]; 122 unsigned char dp[256]; 123 unsigned char dq[256]; 124 unsigned char u[256]; 125 unsigned char message[512]; 126 } __attribute__((packed)); 127 128 /** 129 * The type 80 response family is associated with a CEX2A card. 130 * 131 * Note that all unsigned char arrays are right-justified and left-padded 132 * with zeroes. 133 * 134 * Note that all reserved fields must be zeroes. 135 */ 136 137 #define TYPE80_RSP_CODE 0x80 138 139 struct type80_hdr { 140 unsigned char reserved1; 141 unsigned char type; /* 0x80 */ 142 unsigned short len; 143 unsigned char code; /* 0x00 */ 144 unsigned char reserved2[3]; 145 unsigned char reserved3[8]; 146 } __attribute__((packed)); 147 148 int zcrypt_cex2a_init(void); 149 void zcrypt_cex2a_exit(void); 150 151 #endif /* _ZCRYPT_CEX2A_H_ */ 152