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