0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef _ZCRYPT_MSGTYPE6_H_
0013 #define _ZCRYPT_MSGTYPE6_H_
0014
0015 #include <asm/zcrypt.h>
0016
0017 #define MSGTYPE06_NAME "zcrypt_msgtype6"
0018 #define MSGTYPE06_VARIANT_DEFAULT 0
0019 #define MSGTYPE06_VARIANT_NORNG 1
0020 #define MSGTYPE06_VARIANT_EP11 2
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 struct type6_hdr {
0031 unsigned char reserved1;
0032 unsigned char type;
0033 unsigned char reserved2[2];
0034 unsigned char right[4];
0035 unsigned char reserved3[2];
0036 unsigned char reserved4[2];
0037 unsigned char apfs[4];
0038 unsigned int offset1;
0039 unsigned int offset2;
0040 unsigned int offset3;
0041 unsigned int offset4;
0042 unsigned char agent_id[16];
0043
0044 unsigned char rqid[2];
0045 unsigned char reserved5[2];
0046 unsigned char function_code[2];
0047 unsigned char reserved6[2];
0048 unsigned int tocardlen1;
0049 unsigned int tocardlen2;
0050 unsigned int tocardlen3;
0051 unsigned int tocardlen4;
0052 unsigned int fromcardlen1;
0053 unsigned int fromcardlen2;
0054 unsigned int fromcardlen3;
0055 unsigned int fromcardlen4;
0056 } __packed;
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071 struct type86_hdr {
0072 unsigned char reserved1;
0073 unsigned char type;
0074 unsigned char format;
0075 unsigned char reserved2;
0076 unsigned char reply_code;
0077 unsigned char reserved3[3];
0078 } __packed;
0079
0080 #define TYPE86_RSP_CODE 0x86
0081 #define TYPE87_RSP_CODE 0x87
0082 #define TYPE86_FMT2 0x02
0083
0084 struct type86_fmt2_ext {
0085 unsigned char reserved[4];
0086 unsigned char apfs[4];
0087 unsigned int count1;
0088 unsigned int offset1;
0089 unsigned int count2;
0090 unsigned int offset2;
0091 unsigned int count3;
0092 unsigned int offset3;
0093 unsigned int count4;
0094 unsigned int offset4;
0095 } __packed;
0096
0097 int prep_cca_ap_msg(bool userspace, struct ica_xcRB *xcrb,
0098 struct ap_message *ap_msg,
0099 unsigned int *fc, unsigned short **dom);
0100 int prep_ep11_ap_msg(bool userspace, struct ep11_urb *xcrb,
0101 struct ap_message *ap_msg,
0102 unsigned int *fc, unsigned int *dom);
0103 int prep_rng_ap_msg(struct ap_message *ap_msg,
0104 int *fc, unsigned int *dom);
0105
0106 #define LOW 10
0107 #define MEDIUM 100
0108 #define HIGH 500
0109
0110 int speed_idx_cca(int);
0111 int speed_idx_ep11(int);
0112
0113
0114
0115
0116
0117
0118
0119 static inline void rng_type6cprb_msgx(struct ap_message *ap_msg,
0120 unsigned int random_number_length,
0121 unsigned int *domain)
0122 {
0123 struct {
0124 struct type6_hdr hdr;
0125 struct CPRBX cprbx;
0126 char function_code[2];
0127 short int rule_length;
0128 char rule[8];
0129 short int verb_length;
0130 short int key_length;
0131 } __packed * msg = ap_msg->msg;
0132 static struct type6_hdr static_type6_hdrX = {
0133 .type = 0x06,
0134 .offset1 = 0x00000058,
0135 .agent_id = {'C', 'A'},
0136 .function_code = {'R', 'L'},
0137 .tocardlen1 = sizeof(*msg) - sizeof(msg->hdr),
0138 .fromcardlen1 = sizeof(*msg) - sizeof(msg->hdr),
0139 };
0140 static struct CPRBX local_cprbx = {
0141 .cprb_len = 0x00dc,
0142 .cprb_ver_id = 0x02,
0143 .func_id = {0x54, 0x32},
0144 .req_parml = sizeof(*msg) - sizeof(msg->hdr) -
0145 sizeof(msg->cprbx),
0146 .rpl_msgbl = sizeof(*msg) - sizeof(msg->hdr),
0147 };
0148
0149 msg->hdr = static_type6_hdrX;
0150 msg->hdr.fromcardlen2 = random_number_length;
0151 msg->cprbx = local_cprbx;
0152 msg->cprbx.rpl_datal = random_number_length;
0153 memcpy(msg->function_code, msg->hdr.function_code, 0x02);
0154 msg->rule_length = 0x0a;
0155 memcpy(msg->rule, "RANDOM ", 8);
0156 msg->verb_length = 0x02;
0157 msg->key_length = 0x02;
0158 ap_msg->len = sizeof(*msg);
0159 *domain = (unsigned short)msg->cprbx.domain;
0160 }
0161
0162 void zcrypt_msgtype6_init(void);
0163 void zcrypt_msgtype6_exit(void);
0164
0165 #endif