Changeset 37 for trunk/reader-conax.c
- Timestamp:
- 04/05/09 01:37:15 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/reader-conax.c
r8 r37 69 69 int i, j, n; 70 70 uchar atr_0b00[] = { '0', 'B', '0', '0' }; 71 uchar ins26[] = {0xDD, 0x26, 0x00, 0x00, 0x03, 0x10, 0x01, 0x01}; 72 // uchar ins82[] = {0xDD, 0x82, 0x00, 0x00, 0x14, 0x11, 0x12, 0x01, 0xB0, 0x0F, 0xFF, 0xFF, 0xDD, 0x00, 0x00, 0x09, 0x04, 0x0B, 0x00, 0xE0, 0x30, 0x1B, 0x64, 0x3D, 0xFE}; 73 uchar ins82[]= {0xDD, 0x82, 0x00, 0x00, 0x10, 0x11, 0x0e, 0x01, 0xb0, 0x0f, 0xff, 0xff, 0xc5, 0x00, 0x00, 0x09, 0x04, 0x0b, 0x00, 0xe0, 0x30}; 71 uchar ins26[] = {0xDD, 0x26, 0x00, 0x00, 0x03, 0x10, 0x01, 0x40}; 72 uchar ins82[] = {0xDD, 0x82, 0x00, 0x00, 0x11, 0x11, 0x0f, 0x01, 0xb0, 0x0f, 0xff, \ 73 0xff, 0xfb, 0x00, 0x00, 0x09, 0x04, 0x0b, 0x00, 0xe0, 0x30, 0x2b }; 74 74 75 uchar cardver=0; 75 76 … … 89 90 90 91 if ((n=read_record(ins82, ins82+5))<0) return(0); // read serial 92 91 93 for (j=0, i=2; i<n; i+=cta_res[i+1]+2) 92 94 switch(cta_res[i]) 93 95 { 94 case 0x23: if (!j) memcpy(reader[ridx].hexserial, &cta_res[i+3], 6); 96 97 case 0x09: 98 reader[ridx].prid[j][0]=0x00; 99 reader[ridx].prid[j][1]=0x00; 100 reader[ridx].prid[j][2]=cta_res[i+4]; 101 reader[ridx].prid[j][3]=cta_res[i+5]; 102 103 break; 104 case 0x23: 105 if ( cta_res[i+5] != 0x00) 106 { 107 memcpy(reader[ridx].hexserial, &cta_res[i+3], 6); 108 }else{ 109 110 memcpy(reader[ridx].sa[j], &cta_res[i+5], 4); 95 111 j++; 96 } 112 } 113 break; 114 } 115 116 117 118 reader[ridx].nprov = j; 119 120 97 121 98 122 cs_ri_log("type: conax, caid: %04X, serial: %llu, card: v%d", 99 123 reader[ridx].caid[0], b2ll(6, reader[ridx].hexserial), cardver); 124 cs_ri_log("Conax-Provider:%d", reader[ridx].nprov); 125 126 for (j=0; j<reader[ridx].nprov; j++) 127 { 128 cs_ri_log("Provider:%d Provider-Id:%06X", j+1, b2ll(4, reader[ridx].prid[j])); 129 cs_ri_log("Provider:%d SharedAddress:%08X", j+1, b2ll(4, reader[ridx].sa[j])); 130 } 131 100 132 cs_log("ready for requests"); 101 133 return(1); 102 134 } 103 135 136 int conax_send_pin(void) 137 { 138 unsigned char insPIN[] = { 0xDD,0xC8,0x00,0x00,0x07,0x1D,0x05,0x01,0x00,0x00,0x00,0x00 }; //letzte vier ist der Pin-Code 139 memcpy(insPIN+8,reader[ridx].pincode,4); 140 141 write_cmd(insPIN, insPIN+5); 142 cs_ri_log("[conax]-sending pincode to card"); 143 144 return(1); 145 } 146 147 104 148 int conax_do_ecm(ECM_REQUEST *er) 105 149 { 106 int i, n, rc=0; 107 unsigned char insA2[] = { 0xDD,0xA2,0x00,0x00,0x00 }; 108 unsigned char insCA[] = { 0xDD,0xCA,0x00,0x00,0x00 }; 150 int i,j,n, rc=0; 151 unsigned char insA2[] = { 0xDD,0xA2,0x00,0x00,0x00 }; 152 unsigned char insCA[] = { 0xDD,0xCA,0x00,0x00,0x00 }; 153 109 154 unsigned char buf[256]; 110 155 111 156 if ((n=CheckSctLen(er->ecm, 3))<0) 112 157 return(0); 158 113 159 buf[0]=0x14; 114 160 buf[1]=n+1; 115 161 buf[2]=0; 162 116 163 memcpy(buf+3, er->ecm, n); 117 164 insA2[4]=n+3; 118 write_cmd(insA2, buf); 119 while ((cta_res[cta_lr-2]==0x98) && 165 166 write_cmd(insA2, buf); // write Header + ECM 167 168 while ((cta_res[cta_lr-2]==0x98) && // Antwort 120 169 ((insCA[4]=cta_res[cta_lr-1])>0) && (insCA[4]!=0xFF)) 121 170 { 122 read_cmd(insCA, NULL); 171 read_cmd(insCA, NULL); //Codeword auslesen 172 123 173 if ((cta_res[cta_lr-2]==0x98) || 124 ((cta_res[cta_lr-2]==0x90) && (!cta_res[cta_lr-1])))174 ((cta_res[cta_lr-2]==0x90) )) 125 175 { 126 176 for(i=0; i<cta_lr-2; i+=cta_res[i+1]+2) 127 if ((cta_res[i]==0x25) && // access: is cw 128 (cta_res[i+1]>=0xD) && // 0xD: 5 header + 8 cw 129 !((n=cta_res[i+4])&0xFE)) // cw idx must be 0 or 1 130 { 131 rc|=(1<<n); 132 memcpy(er->cw+(n<<3), cta_res+i+7, 8); 133 } 134 } 135 } 136 return(rc==3); 177 178 switch (cta_res[i]) 179 { 180 case 0x25: 181 if ( (cta_res[i+1]>=0xD) && !((n=cta_res[i+4])&0xFE) ) 182 { 183 rc|=(1<<n); 184 memcpy(er->cw+(n<<3), cta_res+i+7, 8); 185 } 186 break; 187 case 0x31: 188 if ( (cta_res[i+1]==0x02 && cta_res[i+2]==0x00 && cta_res[i+3]==0x00) || \ 189 (cta_res[i+1]==0x02 && cta_res[i+2]==0x40 && cta_res[i+3]==0x00) ) 190 break; 191 else if (strcmp(reader[ridx].pincode, "none")) 192 { 193 conax_send_pin(); 194 write_cmd(insA2, buf); // write Header + ECM 195 while ((cta_res[cta_lr-2]==0x98) && // Antwort 196 ((insCA[4]=cta_res[cta_lr-1])>0) && (insCA[4]!=0xFF)) 197 { 198 read_cmd(insCA, NULL); //Codeword auslesen 199 if ((cta_res[cta_lr-2]==0x98) || 200 ((cta_res[cta_lr-2]==0x90) && (!cta_res[cta_lr-1]))) 201 { 202 203 for(j=0;j<cta_lr-2; j+=cta_res[j+1]+2) 204 if ((cta_res[j]==0x25) && // access: is cw 205 (cta_res[j+1]>=0xD) && // 0xD: 5 header + 8 cw 206 !((n=cta_res[j+4])&0xFE)) // cw idx must be 0 or 1 207 { 208 rc|=(1<<n); 209 memcpy(er->cw+(n<<3), cta_res+j+7, 8); 210 } 211 } 212 } 213 214 } 215 break; 216 217 } 218 219 220 221 } 222 } 223 return(rc==3); 137 224 } 138 225 139 226 int conax_do_emm(EMM_PACKET *ep) 140 227 { 228 /* by KrazyIvan 229 * EMM with lenght 83 and 85, is the same as ECM and PPV. 230 * EMM with lenght AA and A8 (keyupdate). 231 * 82 70 82 00 00 00 00 2c 86 52 70 79 64 10 16 bc 232 * */ 233 234 235 unsigned char insEMM[] = { 0xDD,0x84,0x00,0x00,0x00 }; 236 unsigned char buf[255]; 141 237 int rc=0; 238 239 int l=ep->emm[2]; 240 ep->type=l+3; 241 242 insEMM[4]=l+5; 243 buf[0]=0x12; 244 buf[1]=l+3; 245 memcpy(buf+2, ep->emm, buf[1]); 246 write_cmd(insEMM, buf); 247 248 rc=((cta_res[0]==0x90)&&(cta_res[1]==0x00)); 249 142 250 return(rc); 251 143 252 } 144 253 … … 151 260 uchar ins26[] = {0xDD, 0x26, 0x00, 0x00, 0x03, 0x1C, 0x01, 0x01}; 152 261 uchar insCA[] = {0xDD, 0xCA, 0x00, 0x00, 0x00}; 153 char *txt[] = { " provider", "ppvevent" };262 char *txt[] = { "Package", "PPV-Event" }; 154 263 uchar *cmd[] = { insC6, ins26 }; 155 264
Note:
See TracChangeset
for help on using the changeset viewer.