Ignore:
Timestamp:
04/05/09 01:37:35 (12 years ago)
Author:
smurzch2
Message:

Cryptoworks patch from the 0.9e Community Edition

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/reader-cryptoworks.c

    r8 r39  
    158158}
    159159
     160int cryptoworks_send_pin(void)
     161{
     162  unsigned char insPIN[] = { 0xA4, 0x20, 0x00, 0x00, 0x04, 0x00,0x00,0x00,0x00 }; //Verify PIN 
     163 
     164  if(reader[ridx].pincode[0] && (reader[ridx].pincode[0]&0xF0)==0x30)
     165  {
     166      memcpy(insPIN+5,reader[ridx].pincode,4);
     167   
     168      write_cmd(insPIN, insPIN+5);
     169      cs_ri_log("[cryptoworks]-sending pincode to card"); 
     170      if((cta_res[0]==0x98)&&(cta_res[1]==0x04)) cs_ri_log("[cryptoworks]-bad pincode");
     171         
     172      return(1);
     173  }
     174 
     175  return(0);
     176}
     177
     178int cryptoworks_disbale_pin(void)
     179{
     180  unsigned char insPIN[] = { 0xA4, 0x26, 0x00, 0x00, 0x04, 0x00,0x00,0x00,0x00 }; //disable PIN 
     181 
     182  if(reader[ridx].pincode[0] && (reader[ridx].pincode[0]&0xF0)==0x30)
     183  {
     184      memcpy(insPIN+5,reader[ridx].pincode,4);
     185   
     186      write_cmd(insPIN, insPIN+5);
     187      cs_ri_log("[cryptoworks]-disable pincode to card");
     188      if((cta_res[0]==0x98)&&(cta_res[1]==0x04)) cs_ri_log("[cryptoworks]-bad pincode");
     189      return(1);
     190  }
     191 
     192  return(0);
     193}
     194
    160195int cryptoworks_card_init(uchar *atr, int atrsize)
    161196{
     
    200235  if (read_record(0x80)>=7)     // read serial
    201236    memcpy(reader[ridx].hexserial, cta_res+2, 5);
    202   cs_ri_log("type: cryptoworks, caid: %04X, serial: %llu",
    203             reader[ridx].caid[0], b2ll(5, reader[ridx].hexserial));
     237  cs_ri_log("type: cryptoworks, caid: %04X, ascii serial: %llu, hex serial: %s",
     238            reader[ridx].caid[0], b2ll(5, reader[ridx].hexserial),cs_hexdump(0, reader[ridx].hexserial, 5));
    204239
    205240  if (read_record(0x9E)>=66)    // read ISK
     
    252287  cs_ri_log("providers: %d (%s)", reader[ridx].nprov, ptxt+1);
    253288  cs_log("ready for requests");
     289 
     290  cryptoworks_disbale_pin(); //by KrazyIvan
     291   
    254292  return(1);
    255293}
     
    433471int cryptoworks_do_emm(EMM_PACKET *ep)
    434472{
     473  uchar insEMM_GA[] = {0xA4, 0x44, 0x00, 0x00, 0x00};
     474  uchar insEMM_SA[] = {0xA4, 0x48, 0x00, 0x00, 0x00};
     475  uchar insEMM_UA[] = {0xA4, 0x42, 0x00, 0x00, 0x00};
    435476  int rc=0;
    436477  uchar *emm=ep->emm;
    437 
     478 
     479  /* this original   
    438480  if ((emm[0]==0x8f) && (emm[3]==0xa4))     // emm via camd3.5x
    439   {
     481  {   
    440482    ep->type=emm[4];
    441483    write_cmd(emm+3, emm+3+CMD_LEN);
     
    443485      rc=1;
    444486  }
     487  */
     488   
     489  //by KrazyIvan
     490  ep->type=emm[0];
     491  //cs_log("EMM Dump:..: %s",cs_hexdump(1, emm, emm[2]));
     492  switch(emm[0])
     493  {
     494     // emm via camd3.5x
     495     case 0x8F:           
     496          if(emm[3]==0xA4)
     497          {         
     498            ep->type=emm[4];
     499            //cs_log("EMM Dump: CMD: %s", cs_hexdump(1, emm+3, 5));
     500             //cs_log("EMM Dump: DATA: %s",cs_hexdump(1, emm+8, emm[7]));
     501            write_cmd(emm+3, emm+3+CMD_LEN);
     502            rc=((cta_res[0]==0x90)&&(cta_res[1]==0x00));   
     503          }
     504        break;
     505
     506     //GA       
     507     case 0x88:
     508     case 0x89:
     509          if(emm[3]==0xA9 && emm[4]==0xFF && emm[8]==0x83 && emm[9]==0x01)
     510          {
     511                ep->type=insEMM_GA[1];
     512                insEMM_GA[4]=ep->emm[2]-2;
     513                //cs_log("EMM Dump: CMD: %s", cs_hexdump(1, insEMM_GA, 5));
     514                //cs_log("EMM Dump: DATA: %s",cs_hexdump(1, emm+5, insEMM_GA[4]));             
     515                //cs_log("EMM Dump: IF: %02X == %02X",emm[7],(insEMM_GA[4]-3));                                 
     516               
     517                if(emm[7]==insEMM_GA[4]-3)
     518                {
     519                    write_cmd(insEMM_GA, emm+5);
     520                    rc=((cta_res[0]==0x90)&&(cta_res[1]==0x00));                   
     521                }
     522          }
     523        break;
     524     
     525     //SA
     526     case 0x84:
     527          if(emm[3]==0xA9 && emm[4]==0xFF && emm[12]==0x80 && emm[13]==0x04)
     528          {
     529                ep->type=insEMM_SA[1];
     530                insEMM_SA[4]=ep->emm[2]-6;
     531                //cs_log("EMM Dump: CMD: %s", cs_hexdump(1, insEMM_SA, 5));
     532                //cs_log("EMM Dump: DATA: %s",cs_hexdump(1, emm+9, insEMM_SA[4]));             
     533                //cs_log("EMM Dump: IF: %02X == %02X",emm[11],(insEMM_SA[4]-3));                               
     534               
     535                if(emm[11]==insEMM_SA[4]-3)
     536                {
     537                    write_cmd(insEMM_SA, emm+9);
     538                    rc=((cta_res[0]==0x90)&&(cta_res[1]==0x00));                   
     539                }
     540          }
     541        break;
     542     
     543     //UA       
     544     case 0x82:
     545        if(emm[3]==0xA9 && emm[4]==0xFF && emm[13]==0x80 && emm[14]==0x05)
     546        {
     547            ep->type=insEMM_UA[1];
     548            insEMM_UA[4]=ep->emm[2]-7;
     549            //cs_log("EMM Dump: CMD: %s", cs_hexdump(1, insEMM_UA, 5));
     550            //cs_log("EMM Dump: DATA: %s",cs_hexdump(1, emm+10, insEMM_UA[4]));                 
     551            //cs_log("EMM Dump: IF: %02X == %02X",emm[12],(insEMM_UA[4]-3));                               
     552           
     553            if(emm[12]==insEMM_UA[4]-3)
     554            {
     555                //cryptoworks_send_pin(); //?? may be
     556                write_cmd(insEMM_UA, emm+10);
     557                rc=((cta_res[0]==0x90)&&(cta_res[1]==0x00));                   
     558            }
     559        }           
     560        break;     
     561  }
     562
    445563  return(rc);
    446564}
     
    484602      }
    485603    }
     604    //================================================================================
     605    //by KrazyIvan
     606    select_file(0x0f, 0x00);        // select provider channel
     607    write_cmd(insA21, insA21+5);
     608    if (cta_res[0]==0x9f)
     609    {
     610      insB2[4]=cta_res[1];
     611      for(insB2[3]=0; (cta_res[0]!=0x94)||(cta_res[1]!=0x2); insB2[3]=1)
     612      {
     613        read_cmd(insB2, NULL);      // read chid
     614        if (cta_res[0]!=0x94)
     615        {
     616          char ds[16], de[16];
     617          chid_date(cta_res+28, ds, sizeof(ds)-1);
     618          chid_date(cta_res+30, de, sizeof(de)-1);
     619          cta_res[27]=0;
     620          cs_ri_log("chid: %02X%02X, date: %s - %s, name: %s",
     621                    cta_res[6], cta_res[7], ds, de, trim(cta_res+10));
     622        }
     623      }
     624    }
     625    //================================================================================
     626   
    486627  }
    487628  return(1);
Note: See TracChangeset for help on using the changeset viewer.