Changeset 4022


Ignore:
Timestamp:
11/30/10 13:47:27 (10 years ago)
Author:
cogsi
Message:

cccam cipher fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/module-cccam.c

    r4021 r4022  
    108108}
    109109
    110 void cc_cw_crypt_cmd0c(struct s_client *cl, uint8 *cws) {
     110void cc_crypt_cmd0c(struct s_client *cl, uint8 *buf, int len) {
    111111    struct cc_data *cc = cl->cc;
    112     uint8 out[16];
     112    uint8 *out = malloc(len);
    113113
    114114    switch (cc->cmd0c_mode) {
    115115        case MODE_CMD_0x0C_NONE: { // none additional encryption
     116            memcpy(out, buf, len);
    116117            break;
    117118        }
    118119        case MODE_CMD_0x0C_RC6 : { //RC6           
    119             rc6_block_decrypt((unsigned int *) cws,
    120                 (unsigned int *) &out, cc->cmd0c_RC6_cryptkey);
    121             memcpy(cws, &out, 16);
     120            //rc6_block_decrypt(buf, out, cc->cmd0c_RC6_cryptkey); // TODO RC6
    122121            break;
    123122        }
    124123        case MODE_CMD_0x0C_RC4: { // RC4
    125             cc_rc4_crypt(&cc->cmd0c_cryptkey, cws, 16, ENCRYPT);
     124            cc_rc4_crypt(&cc->cmd0c_cryptkey, buf, len, ENCRYPT);
     125            memcpy(out, buf, len);
    126126            break;
    127127        }
    128128        case MODE_CMD_0x0C_CC_CRYPT: { // cc_crypt
    129             cc_crypt(&cc->cmd0c_cryptkey, cws, 16, DECRYPT);
    130             cws[0] ^= 0xF0;
    131             cws[15] ^= 0xF0;   
     129            cc_crypt(&cc->cmd0c_cryptkey, buf, len, DECRYPT);
     130            memcpy(out, buf, len);
    132131            break;
    133132        }   
    134133        case MODE_CMD_0x0C_AES: { // AES
    135             AES_decrypt((unsigned char *) cws,
    136                 (unsigned char *) &out, &cc->cmd0c_AES_key);
    137             memcpy(cws, &out, 16);
     134            int i;
     135            for (i = 0; i<len / 16; i++)
     136                AES_decrypt((unsigned char *) buf + i * 8,
     137                        (unsigned char *) out + i * 8, &cc->cmd0c_AES_key);
    138138            break;
    139139        }
    140140        case MODE_CMD_0x0C_IDEA : { //IDEA
    141             uint8 cws_in[8];
    142141            int i;
    143142
    144             memcpy(&cws_in, cws, 8);           
    145             idea_ecb_encrypt(cws_in, out, &cc->cmd0c_IDEA_dkey);
    146             memcpy(&cws_in, cws + 8, 8);           
    147             idea_ecb_encrypt(cws_in, out + 8, &cc->cmd0c_IDEA_dkey);
    148 
    149             //final cws[8-15]:
     143            idea_ecb_encrypt(buf, out, &cc->cmd0c_IDEA_dkey);
     144            idea_ecb_encrypt(buf + 8, out + 8, &cc->cmd0c_IDEA_dkey);
     145
    150146            for (i = 8; i < 16; i++)
    151                 out[i] ^= cws[i-8];
    152 
    153             memcpy(cws, &out, 16);
     147                out[i] ^= buf[i-8];
     148
    154149            break;
    155         }       
    156     }       
     150        }
     151    }
     152    memcpy(buf, out, len);
     153    free(out);
    157154}
    158155
     
    21352132                    if (!cc->extended_mode) {
    21362133                        cc_cw_crypt(cl, buf + 4, card->id);
    2137                         cc_cw_crypt_cmd0c(cl, buf + 4);
     2134                        cc_crypt_cmd0c(cl, buf + 4, 16);
    21382135                    }
    21392136
     
    22792276        else //reader
    22802277        {           
    2281             // by Project:Keynation
     2278            // by Project:Keynation + Oscam team
     2279            cc_crypt_cmd0c(cl, data, len);
     2280
    22822281            uint8 CMD_0x0C_Command = data[0];
    22832282
Note: See TracChangeset for help on using the changeset viewer.