Changeset 4012


Ignore:
Timestamp:
11/29/10 08:33:43 (10 years ago)
Author:
schlocke
Message:

cccam: added full cccam 2.2.x support !!

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/cscrypt/Makefile

    r3993 r4012  
    2323          $(LIBFILE1)(i_skey.o) \
    2424          $(LIBFILE1)(mem.o) \
    25           $(LIBFILE1)(rc6.o)
     25          $(LIBFILE1)(rc6.o) \
     26          $(LIBFILE1)(i_ecb.o)
    2627
    2728all:        $(LIBFILE1)
  • trunk/cscrypt/rc6.h

    r3999 r4012  
    2121 * w=32; and r=20.
    2222 */
    23    
     23
    2424#define rc6keylen 43
    2525
     
    3737void rc6_block_encrypt(unsigned int *pt, unsigned int *ct, unsigned int *S);
    3838void rc6_block_decrypt(unsigned int *ct, unsigned int *pt, unsigned int *S);
    39 
  • trunk/module-cccam.c

    r4004 r4012  
    66#include "reader-common.h"
    77#include <poll.h>
    8 #include "cscrypt/rc6.h"
    98
    109extern int pthread_mutexattr_settype(pthread_mutexattr_t *__attr, int __kind); //Needs extern defined???
     
    1312const char *cmd05_mode_name[] = { "UNKNOWN", "PLAIN", "AES", "CC_CRYPT", "RC4",
    1413        "LEN=0" };
     14
     15//Mode names for CMD_0C command:
     16const char *cmd0c_mode_name[] = { "NONE", "RC6", "RC4", "CC_CRYPT", "AES", "IDEA" };
    1517
    1618static uint8 cc_node_id[8];
     
    103105            tmp = ~tmp;
    104106        cws[i] = (cardid >> (2 * i)) ^ tmp;
     107    }
     108}
     109
     110void cc_cw_crypt_cmd0c(struct s_client *cl, uint8 *cws) {
     111    struct cc_data *cc = cl->cc;
     112    uint8 out[16];
     113
     114    switch (cc->cmd0c_mode) {
     115        case MODE_CMD_0x0C_NONE: { // none additional encryption
     116            break;
     117        }
     118        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);
     122            break;
     123        }
     124        case MODE_CMD_0x0C_RC4: { // RC4
     125            cc_rc4_crypt(&cc->cmd0c_cryptkey, cws, 16, ENCRYPT);
     126            break;
     127        }
     128        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;   
     132            break;
     133        }   
     134        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);
     138            break;
     139        }
     140        case MODE_CMD_0x0C_IDEA : { //IDEA
     141            uint8 cws_in[8];
     142            int i;
     143
     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]:
     150            for (i = 8; i < 16; i++)
     151                out[i] ^= cws[i-8];
     152
     153            memcpy(cws, &out, 16);
     154            break;
     155        }       
     156    }       
     157}
     158
     159void set_cmd0c_cryptkey(struct s_client *cl, uint8 *key, uint8 len) {
     160    struct cc_data *cc = cl->cc;
     161    uint8 key_buf[32];
     162
     163    memset(&key_buf, 0, sizeof(key_buf));
     164   
     165    if (len > 32)
     166        len = 32;
     167
     168    memcpy(key_buf, key, len);
     169
     170    switch (cc->cmd0c_mode) {
     171                   
     172        case MODE_CMD_0x0C_NONE : { //NONE
     173            break;
     174        }
     175            case MODE_CMD_0x0C_RC6 : { //RC6
     176            rc6_key_setup(key_buf, 32, cc->cmd0c_RC6_cryptkey);
     177            break;
     178        }                   
     179                       
     180        case MODE_CMD_0x0C_RC4:  //RC4
     181        case MODE_CMD_0x0C_CC_CRYPT: { //CC_CRYPT
     182            cc_init_crypt(&cc->cmd0c_cryptkey, key_buf, 32);
     183            break;
     184        }
     185                   
     186        case MODE_CMD_0x0C_AES: { //AES
     187            memset(&cc->cmd0c_AES_key, 0, sizeof(cc->cmd0c_AES_key));           
     188            AES_set_decrypt_key((unsigned char *) key_buf, 256, &cc->cmd0c_AES_key);               
     189            break;
     190        }   
     191                   
     192        case MODE_CMD_0x0C_IDEA : { //IDEA
     193            IDEA_KEY_SCHEDULE ekey;
     194            uint8 key_buf_IDEA[16];
     195            memcpy(&key_buf_IDEA, &key_buf, 16);
     196
     197            idea_set_encrypt_key(key_buf_IDEA, &ekey);
     198            idea_set_decrypt_key(&ekey,&cc->cmd0c_IDEA_dkey);
     199            break;
     200        }   
    105201    }
    106202}
     
    20362132
    20372133                if (card) {
    2038                     if (!cc->extended_mode)
    2039                         cc_cw_crypt(cl, buf + 4, card->id);
     2134
     2135                    if (!cc->extended_mode) {
     2136                        cc_cw_crypt(cl, buf + 4, card->id);
     2137                        cc_cw_crypt_cmd0c(cl, buf + 4);
     2138                    }
     2139
    20402140                    memcpy(cc->dcw, buf + 4, 16);
    20412141                    //fix_dcw(cc->dcw);
     
    21482248    }
    21492249
    2150     case MSG_CMD_0C: { //New CCCAM 2.2.0 Server fake check!
     2250    case MSG_CMD_0C: { //New CCCAM 2.2.0 Server/Client fake check!
    21512251        int len = l-4;
     2252
    21522253        if (cl->typ == 'c') { //Only im comming from "client"
    21532254            cs_debug_mask(D_TRACE, "%s MSG_CMD_0C received (payload=%d)!", getprefix(), len);
     
    21772278        }
    21782279        else //reader
    2179         {
    2180             cs_debug_mask(D_TRACE, "%s MSG_CMD_0C received (payload=%d)!", getprefix(), len);
    2181             cs_ddump(buf, l, "%s content: len=%d", getprefix(), l);
    2182             uint8 CMD_0x0C_CMD = data[0];
     2280        {           
     2281            // by Project:Keynation
     2282            uint8 CMD_0x0C_Command = data[0];
     2283
     2284            if (CMD_0x0C_Command > 4) {
     2285                cc->cmd0c_mode = MODE_CMD_0x0C_NONE;
     2286                break;
     2287            }
     2288
     2289            switch (CMD_0x0C_Command) {
     2290               
     2291                case 0 : { //RC6
     2292                    cc->cmd0c_mode = MODE_CMD_0x0C_RC6;
     2293                    break;
     2294                }                   
     2295                           
     2296                case 1: { //RC4
     2297                    cc->cmd0c_mode = MODE_CMD_0x0C_RC4;
     2298                    break;
     2299                }
     2300                   
     2301                case 2: { //CC_CRYPT
     2302                    cc->cmd0c_mode = MODE_CMD_0x0C_CC_CRYPT;
     2303                    break;
     2304                }       
     2305                   
     2306                case 3: { //AES
     2307                    cc->cmd0c_mode = MODE_CMD_0x0C_AES;
     2308                    break;
     2309                }   
     2310                   
     2311                case 4 : { //IDEA
     2312                    cc->cmd0c_mode = MODE_CMD_0x0C_IDEA;
     2313                    break;
     2314                }   
     2315            }   
    21832316           
    2184             cs_log("%s received MSG_CMD_0C from server! CMD_0x0C_CMD=%d, cycle connection!", getprefix(), CMD_0x0C_CMD);
    2185                        
    2186             //Unkown commands...need workout algo
    2187             if (CMD_0x0C_CMD < 5)
    2188                 cc_cli_close(cl, TRUE);
    2189                
    2190             //TODO
    2191             //    * CMD_0x0C_01
    2192             //     1. Set Mode to CMD_0x0C_01
    2193             //     2. cc_init_crypt(BlockCMD_0x0C, data) with $20 received Bytes
    2194             //     3. CW with cc_cw_crypt and cc_rc4_crypt(BlockCMD_0x0C, ENCRYPT)
    2195             //                     
    2196             //    * CMD_0x0C_02
    2197             //     1. Set Mode to CMD_0x0C_02
    2198             //     2. cc_init_crypt(BlockCMD_0x0C, data) with $20 received Bytes
    2199             //     3. CW with cc_cw_crypt and cc_crypt(BlockCMD_0x0C, DECRYPT)
    2200             //                                           
    2201                                        
    2202                                                        
     2317            cs_log("%s received MSG_CMD_0C from server! CMD_0x0C_CMD=%d, MODE=%s! Message data: %s",
     2318                getprefix(), CMD_0x0C_Command, cmd0c_mode_name[cc->cmd0c_mode], cs_hexdump(0, data, len));
     2319
     2320            set_cmd0c_cryptkey(cl, data, len);                                                                                 
    22032321        }
    22042322        break;
    22052323    }
     2324
     2325    case MSG_CMD_0D: { //key update for the active cmd0x0c algo
     2326        int len = l-4;
     2327        if (cc->cmd0c_mode == MODE_CMD_0x0C_NONE)
     2328            break;
     2329
     2330        set_cmd0c_cryptkey(cl, data, len);
     2331
     2332        cs_log("%s received MSG_CMD_0D from server! MODE=%s! Message data: %s",
     2333            getprefix(), cmd0c_mode_name[cc->cmd0c_mode], cs_hexdump(0, data, len));
     2334        break;
     2335    }
    22062336       
    2207     case MSG_CMD_0D:
    22082337    case MSG_CMD_0E: {
    22092338        cs_log("cccam 2.2.0 commands not implemented");
  • trunk/module-cccam.h

    r4004 r4012  
    99
    1010#include "module-datastruct-llist.h"
     11
     12#include "cscrypt/rc6.h"
     13#include "cscrypt/idea.h"
    1114
    1215#define CC_MAXMSGSIZE 512
     
    102105} cc_cmd05_mode;
    103106
     107typedef enum {
     108    MODE_CMD_0x0C_NONE = 0,
     109    MODE_CMD_0x0C_RC6 = 1,
     110    MODE_CMD_0x0C_RC4 = 2,
     111    MODE_CMD_0x0C_CC_CRYPT = 3,
     112    MODE_CMD_0x0C_AES = 4,
     113    MODE_CMD_0x0C_IDEA = 5,
     114} cc_cmd0c_mode;
     115
     116
    104117struct cc_extended_ecm_idx {
    105118    uint8 send_idx;
     
    129142    cc_cmd05_mode cmd05_mode;
    130143    int cmd05_offset;
     144
     145    cc_cmd0c_mode cmd0c_mode;
     146    struct cc_crypt_block cmd0c_cryptkey;
     147    RC6KEY cmd0c_RC6_cryptkey;
     148    AES_KEY cmd0c_AES_key;
     149    IDEA_KEY_SCHEDULE cmd0c_IDEA_dkey;
     150
    131151    uint8 receive_buffer[CC_MAXMSGSIZE];
    132152   
Note: See TracChangeset for help on using the changeset viewer.