1 #define MODULE_LOG_PREFIX "cccam"
7 #include "cscrypt/md5.h"
8 #include "cscrypt/sha1.h"
9 #include "module-cacheex.h"
10 #include "module-cccam.h"
11 #include "module-cccam-data.h"
12 #include "module-cccam-cacheex.h"
13 #include "module-cccshare.h"
14 #include "oscam-chk.h"
15 #include "oscam-cache.h"
16 #include "oscam-client.h"
17 #include "oscam-ecm.h"
18 #include "oscam-emm.h"
19 #include "oscam-failban.h"
20 #include "oscam-garbage.h"
21 #include "oscam-lock.h"
22 #include "oscam-net.h"
23 #include "oscam-reader.h"
24 #include "oscam-string.h"
25 #include "oscam-time.h"
26 #include "oscam-work.h"
28 // Mode names for CMD_05 command
29 static const char *cmd05_mode_name
[] = { "UNKNOWN", "PLAIN", "AES", "CC_CRYPT", "RC4", "LEN=0" };
31 // Mode names for CMD_0C command
32 static const char *cmd0c_mode_name
[] = { "NONE", "RC6", "RC4", "CC_CRYPT", "AES", "IDEA" };
34 uint8_t cc_node_id
[8];
36 int32_t cc_cli_connect(struct s_client
*cl
);
37 int32_t cc_send_pending_emms(struct s_client
*cl
);
39 #define getprefix() (!cl ? "" : (!cl->cc ? "" : (((struct cc_data *)(cl->cc))->prefix)))
41 void cc_init_crypt(struct cc_crypt_block
*block
, uint8_t *key
, int32_t len
)
46 for(i
= 0; i
< 256; i
++)
48 block
->keytable
[i
] = i
;
51 for(i
= 0; i
< 256; i
++)
53 j
+= key
[i
% len
] + block
->keytable
[i
];
54 SWAPC(&block
->keytable
[i
], &block
->keytable
[j
]);
62 void cc_crypt(struct cc_crypt_block
*block
, uint8_t *data
, int32_t len
, cc_crypt_mode_t mode
)
67 for(i
= 0; i
< len
; i
++)
70 block
->sum
+= block
->keytable
[block
->counter
];
71 SWAPC(&block
->keytable
[block
->counter
], &block
->keytable
[block
->sum
]);
74 data
[i
] = z
^ block
->keytable
[(block
->keytable
[block
->counter
] + block
->keytable
[block
->sum
]) & 0xff];
75 data
[i
] ^= block
->state
;
82 block
->state
= block
->state
^ z
;
86 void cc_rc4_crypt(struct cc_crypt_block
*block
, uint8_t *data
, int32_t len
, cc_crypt_mode_t mode
)
91 for(i
= 0; i
< len
; i
++)
94 block
->sum
+= block
->keytable
[block
->counter
];
95 SWAPC(&block
->keytable
[block
->counter
], &block
->keytable
[block
->sum
]);
98 data
[i
] = z
^ block
->keytable
[(block
->keytable
[block
->counter
] + block
->keytable
[block
->sum
]) & 0xff];
105 block
->state
= block
->state
^ z
;
109 void cc_xor(uint8_t *buf
)
111 const char cccam
[] = "CCcam";
114 for(i
= 0; i
< 8; i
++)
116 buf
[8 + i
] = i
* buf
[i
];
125 void cc_cw_crypt(struct s_client
*cl
, uint8_t *cws
, uint32_t cardid
)
127 struct cc_data
*cc
= cl
->cc
;
133 if (!cs_malloc(&nod
, 8))
142 nod
[i
] = cc
->node_id
[7-i
];
146 nod
[i
] = cc
->peer_node_id
[7-i
];
156 n
= (nod
[i
>>1]>>4) | (nod
[(i
>>1)+1]<<4);
176 cws
[i
] = ((cardid
>> (2 * i
)) ^ tmp
) & 0xff;
182 /** swap endianness (int) */
183 static void SwapLBi(uint8_t *buff
, int32_t len
)
185 #if __BYTE_ORDER != __BIG_ENDIAN
192 for(i
= 0; i
< len
/ 4; i
++)
194 memcpy(swap
, buff
, 4);
203 void cc_crypt_cmd0c(struct s_client
*cl
, uint8_t *buf
, int32_t len
)
205 struct cc_data
*cc
= cl
->cc
;
208 if(!cs_malloc(&out
, len
))
213 switch(cc
->cmd0c_mode
)
215 case MODE_CMD_0x0C_NONE
: // none additional encryption
217 memcpy(out
, buf
, len
);
221 case MODE_CMD_0x0C_RC6
: // RC6
223 // buf may be unaligned,
224 // so we use malloc() memory for the uint32_t* cast
228 if(!cs_malloc(&tmp
, len
))
233 memcpy(tmp
, buf
, len
);
236 for(i
= 0; i
< len
/ 16; i
++)
238 rc6_block_decrypt((uint32_t *)(tmp
+ i
* 16), (uint32_t *)(out
+ i
* 16), 1, cc
->cmd0c_RC6_cryptkey
);
246 case MODE_CMD_0x0C_RC4
: // RC4
248 cc_rc4_crypt(&cc
->cmd0c_cryptkey
, buf
, len
, ENCRYPT
);
249 memcpy(out
, buf
, len
);
253 case MODE_CMD_0x0C_CC_CRYPT
: // cc_crypt
255 cc_crypt(&cc
->cmd0c_cryptkey
, buf
, len
, DECRYPT
);
256 memcpy(out
, buf
, len
);
260 case MODE_CMD_0x0C_AES
: // AES
263 for(i
= 0; i
< len
/ 16; i
++)
265 AES_decrypt((uint8_t *)buf
+ i
* 16, (uint8_t *)out
+ i
* 16, &cc
->cmd0c_AES_key
);
270 case MODE_CMD_0x0C_IDEA
: // IDEA
277 idea_ecb_encrypt(buf
+ i
, out
+ i
, &cc
->cmd0c_IDEA_dkey
);
284 for(j
= 0; j
< 8; j
++)
286 out
[j
+ i
] ^= buf
[j
+ i
- 8];
294 memcpy(buf
, out
, len
);
298 void set_cmd0c_cryptkey(struct s_client
*cl
, uint8_t *key
, uint8_t len
)
300 struct cc_data
*cc
= cl
->cc
;
303 memset(&key_buf
, 0, sizeof(key_buf
));
310 memcpy(key_buf
, key
, len
);
312 switch(cc
->cmd0c_mode
)
314 case MODE_CMD_0x0C_NONE
: // NONE
319 case MODE_CMD_0x0C_RC6
: // RC6
321 rc6_key_setup(key_buf
, 32, cc
->cmd0c_RC6_cryptkey
);
325 case MODE_CMD_0x0C_RC4
: // RC4
326 case MODE_CMD_0x0C_CC_CRYPT
: // CC_CRYPT
328 cc_init_crypt(&cc
->cmd0c_cryptkey
, key_buf
, 32);
332 case MODE_CMD_0x0C_AES
: // AES
334 memset(&cc
->cmd0c_AES_key
, 0, sizeof(cc
->cmd0c_AES_key
));
335 AES_set_decrypt_key((uint8_t *)key_buf
, 256, &cc
->cmd0c_AES_key
);
339 case MODE_CMD_0x0C_IDEA
: // IDEA
341 uint8_t key_buf_idea
[16];
342 memcpy(key_buf_idea
, key_buf
, 16);
343 IDEA_KEY_SCHEDULE ekey
;
345 idea_set_encrypt_key(key_buf_idea
, &ekey
);
346 idea_set_decrypt_key(&ekey
, &cc
->cmd0c_IDEA_dkey
);
352 int32_t sid_eq(struct cc_srvid
*srvid1
, struct cc_srvid
*srvid2
)
354 return (srvid1
->sid
== srvid2
->sid
&& (srvid1
->chid
== srvid2
->chid
|| !srvid1
->chid
|| !srvid2
->chid
)
355 && (srvid1
->ecmlen
== srvid2
->ecmlen
|| !srvid1
->ecmlen
|| !srvid2
->ecmlen
));
358 int32_t sid_eq_nb(struct cc_srvid
*srvid1
, struct cc_srvid_block
*srvid2
)
360 return sid_eq(srvid1
, (struct cc_srvid
*)srvid2
);
363 int32_t sid_eq_bb(struct cc_srvid_block
*srvid1
, struct cc_srvid_block
*srvid2
)
365 return (srvid1
->sid
== srvid2
->sid
&& (srvid1
->chid
== srvid2
->chid
|| !srvid1
->chid
|| !srvid2
->chid
)
366 && (srvid1
->ecmlen
== srvid2
->ecmlen
|| !srvid1
->ecmlen
|| !srvid2
->ecmlen
)
367 && (srvid1
->blocked_till
== srvid2
->blocked_till
|| !srvid1
->blocked_till
|| !srvid2
->blocked_till
));
370 struct cc_srvid_block
*is_sid_blocked(struct cc_card
*card
, struct cc_srvid
*srvid_blocked
)
372 LL_ITER it
= ll_iter_create(card
->badsids
);
373 struct cc_srvid_block
*srvid
;
375 while((srvid
= ll_iter_next(&it
)))
377 if(sid_eq_nb(srvid_blocked
, srvid
))
385 uint32_t has_perm_blocked_sid(struct cc_card
*card
)
387 LL_ITER it
= ll_iter_create(card
->badsids
);
388 struct cc_srvid_block
*srvid
;
390 while((srvid
= ll_iter_next(&it
)))
392 if(srvid
->blocked_till
== 0)
397 return srvid
!= NULL
;
400 struct cc_srvid
*is_good_sid(struct cc_card
*card
, struct cc_srvid
*srvid_good
)
402 LL_ITER it
= ll_iter_create(card
->goodsids
);
403 struct cc_srvid
*srvid
;
405 while((srvid
= ll_iter_next(&it
)))
407 if(sid_eq(srvid
, srvid_good
))
415 #define BLOCKING_SECONDS 10
417 void add_sid_block(struct cc_card
*card
, struct cc_srvid
*srvid_blocked
, bool temporary
)
419 if(is_sid_blocked(card
, srvid_blocked
))
424 struct cc_srvid_block
*srvid
;
425 if(!cs_malloc(&srvid
, sizeof(struct cc_srvid_block
)))
429 memcpy(srvid
, srvid_blocked
, sizeof(struct cc_srvid
));
433 srvid
->blocked_till
= time(NULL
) + BLOCKING_SECONDS
;
436 ll_append(card
->badsids
, srvid
);
437 cs_log_dbg(D_READER
, "added sid block %04X(CHID %04X, length %d) for card %08x",
438 srvid_blocked
->sid
, srvid_blocked
->chid
, srvid_blocked
->ecmlen
, card
->id
);
441 void remove_sid_block(struct cc_card
*card
, struct cc_srvid
*srvid_blocked
)
443 LL_ITER it
= ll_iter_create(card
->badsids
);
444 struct cc_srvid_block
*srvid
;
446 while((srvid
= ll_iter_next(&it
)))
448 if(sid_eq_nb(srvid_blocked
, srvid
))
450 ll_iter_remove_data(&it
);
454 cs_log_dbg(D_READER
, "removed sid block %04X(CHID %04X, length %d) for card %08x",
455 srvid_blocked
->sid
, srvid_blocked
->chid
, srvid_blocked
->ecmlen
, card
->id
);
458 void add_good_sid(struct cc_card
*card
, struct cc_srvid
*srvid_good
)
460 if(is_good_sid(card
, srvid_good
))
465 remove_sid_block(card
, srvid_good
);
466 struct cc_srvid
*srvid
;
468 if(!cs_malloc(&srvid
, sizeof(struct cc_srvid
)))
473 memcpy(srvid
, srvid_good
, sizeof(struct cc_srvid
));
474 ll_append(card
->goodsids
, srvid
);
476 cs_log_dbg(D_READER
, "added good sid %04X(%d) for card %08x",
477 srvid_good
->sid
, srvid_good
->ecmlen
, card
->id
);
480 void remove_good_sid(struct cc_card
*card
, struct cc_srvid
*srvid_good
)
482 LL_ITER it
= ll_iter_create(card
->goodsids
);
483 struct cc_srvid
*srvid
;
485 while((srvid
= ll_iter_next(&it
)))
487 if(sid_eq(srvid
, srvid_good
))
489 ll_iter_remove_data(&it
);
493 cs_log_dbg(D_READER
, "removed good sid %04X(%d) for card %08x",
494 srvid_good
->sid
, srvid_good
->ecmlen
, card
->id
);
499 * clears and frees values for reinit
501 void cc_cli_close(struct s_client
*cl
, int32_t call_conclose
)
503 struct s_reader
*rdr
= cl
->reader
;
504 struct cc_data
*cc
= cl
->cc
;
513 rdr
->tcp_connected
= 0;
518 rdr
->card_status
= NO_CARD
;
523 rdr
->last_s
= rdr
->last_g
= 0;
531 if(call_conclose
) // clears also pending ecms!
533 network_tcp_connection_close(rdr
, "close");
546 cc
->just_logged_in
= 0;
549 struct cc_extended_ecm_idx
*add_extended_ecm_idx(struct s_client
*cl
, uint8_t send_idx
, uint16_t ecm_idx
,
550 struct cc_card
*card
, struct cc_srvid srvid
, int8_t free_card
)
552 struct cc_data
*cc
= cl
->cc
;
553 struct cc_extended_ecm_idx
*eei
;
555 if(!cs_malloc(&eei
, sizeof(struct cc_extended_ecm_idx
)))
560 eei
->send_idx
= send_idx
;
561 eei
->ecm_idx
= ecm_idx
;
563 eei
->cccam_id
= card
->id
;
565 eei
->free_card
= free_card
;
567 ll_append(cc
->extended_ecm_idx
, eei
);
568 //cs_log_dbg(D_TRACE, "%s add extended ecm-idx: %d:%d", getprefix(), send_idx, ecm_idx);
572 struct cc_extended_ecm_idx
*get_extended_ecm_idx(struct s_client
*cl
, uint8_t send_idx
, int32_t remove_item
)
574 struct cc_data
*cc
= cl
->cc
;
575 struct cc_extended_ecm_idx
*eei
;
576 LL_ITER it
= ll_iter_create(cc
->extended_ecm_idx
);
578 while((eei
= ll_iter_next(&it
)))
580 if(eei
->send_idx
== send_idx
)
587 //cs_log_dbg(D_TRACE, "%s get by send-idx: %d FOUND: %d", getprefix(), send_idx, eei->ecm_idx);
595 cs_log_dbg(cl
->typ
== 'c' ? D_CLIENT
: D_READER
, "%s get by send-idx: %d NOT FOUND", getprefix(), send_idx
);
602 struct cc_extended_ecm_idx
*get_extended_ecm_idx_by_idx(struct s_client
*cl
, uint16_t ecm_idx
, int32_t remove_item
)
604 struct cc_data
*cc
= cl
->cc
;
605 struct cc_extended_ecm_idx
*eei
;
606 LL_ITER it
= ll_iter_create(cc
->extended_ecm_idx
);
608 while((eei
= ll_iter_next(&it
)))
610 if(eei
->ecm_idx
== ecm_idx
)
617 //cs_log_dbg(D_TRACE, "%s get by ecm-idx: %d FOUND: %d", getprefix(), ecm_idx, eei->send_idx);
625 cs_log_dbg(cl
->typ
== 'c' ? D_CLIENT
: D_READER
, "%s get by ecm-idx: %d NOT FOUND", getprefix(), ecm_idx
);
632 void cc_reset_pending(struct s_client
*cl
, int32_t ecm_idx
)
636 for(i
= 0; i
< cfg
.max_pending
; i
++)
638 if(cl
->ecmtask
[i
].idx
== ecm_idx
&& cl
->ecmtask
[i
].rc
== E_ALREADY_SENT
)
640 cl
->ecmtask
[i
].rc
= E_UNHANDLED
; // Mark unused
645 void free_extended_ecm_idx_by_card(struct s_client
*cl
, struct cc_card
*card
, int8_t null_only
)
647 struct cc_data
*cc
= cl
->cc
;
648 struct cc_extended_ecm_idx
*eei
;
649 LL_ITER it
= ll_iter_create(cc
->extended_ecm_idx
);
651 while((eei
= ll_iter_next(&it
)))
653 if(eei
->card
== card
)
657 cc_reset_pending(cl
, eei
->ecm_idx
);
662 ll_iter_remove_data(&it
);
676 void free_extended_ecm_idx(struct cc_data
*cc
)
678 struct cc_extended_ecm_idx
*eei
;
679 LL_ITER it
= ll_iter_create(cc
->extended_ecm_idx
);
681 while((eei
= ll_iter_next(&it
)))
687 ll_iter_remove_data(&it
);
691 int32_t cc_recv_to(struct s_client
*cl
, uint8_t *buf
, int32_t len
)
699 pfd
.events
= POLLIN
| POLLPRI
;
701 rc
= poll(&pfd
, 1, cfg
.cc_recv_timeout
);
710 return -1; // error!!
715 if(pfd
.revents
& POLLHUP
)
717 return -1; // hangup = error!!
726 return -2; // timeout!!
729 return cs_recv(cl
->udp_fd
, buf
, len
, MSG_WAITALL
);
734 * closes the connection and reopens it.
736 static int8_t cc_cycle_connection(struct s_client
*cl
)
743 cs_log_dbg(D_TRACE
, "%s unlocked-cycleconnection! timeout %d ms", getprefix(), cl
->reader
->cc_reconnect
);
749 return cl
->reader
->tcp_connected
;
756 int32_t cc_msg_recv(struct s_client
*cl
, uint8_t *buf
, int32_t maxlen
)
758 struct s_reader
*rdr
= (cl
->typ
== 'c') ? NULL
: cl
->reader
;
761 struct cc_data
*cc
= cl
->cc
;
762 int32_t handle
= cl
->udp_fd
;
764 if(handle
<= 0 || maxlen
< 4)
774 cs_writelock(__func__
, &cc
->lockcmd
);
778 cs_writeunlock(__func__
, &cc
->lockcmd
);
782 len
= cs_recv(handle
, buf
, 4, MSG_WAITALL
);
784 if(len
!= 4) // invalid header length read
788 cs_log_dbg(cl
->typ
== 'c' ? D_CLIENT
: D_READER
, "%s disconnected by remote server", getprefix());
792 cs_log_dbg(cl
->typ
== 'c' ? D_CLIENT
: D_READER
, "%s invalid header length (expected 4, read %d)",
796 cs_writeunlock(__func__
, &cc
->lockcmd
);
800 cc_crypt(&cc
->block
[DECRYPT
], buf
, 4, DECRYPT
);
801 //cs_log_dump_dbg(D_CLIENT, buf, 4, "cccam: decrypted header:");
805 int32_t size
= (buf
[2] << 8) | buf
[3];
806 if(size
) // check if any data is expected in msg
810 cs_writeunlock(__func__
, &cc
->lockcmd
);
811 cs_log_dbg(cl
->typ
== 'c' ? D_CLIENT
: D_READER
, "%s message too big (size=%d max=%d)",
812 getprefix(), size
, maxlen
);
816 len
= cs_recv(handle
, buf
+ 4, size
, MSG_WAITALL
);
818 if(rdr
&& (buf
[1] == MSG_CW_ECM
819 #ifdef CS_CACHEEX_AIO
820 || buf
[1] == MSG_CW_ECM_LGF
824 rdr
->last_g
= time(NULL
);
829 cs_writeunlock(__func__
, &cc
->lockcmd
);
833 cs_log_dbg(cl
->typ
== 'c' ? D_CLIENT
: D_READER
, "%s disconnected by remote", getprefix());
837 cs_log_dbg(cl
->typ
== 'c' ? D_CLIENT
: D_READER
, "%s invalid message length read (expected %d, read %d)",
838 getprefix(), size
, len
);
843 cc_crypt(&cc
->block
[DECRYPT
], buf
+ 4, len
, DECRYPT
);
847 cs_writeunlock(__func__
, &cc
->lockcmd
);
849 //cs_log_dump_dbg(cl->typ=='c'?D_CLIENT:D_READER, buf, len, "cccam: full decrypted msg, len=%d:", len);
858 int32_t cc_cmd_send(struct s_client
*cl
, uint8_t *buf
, int32_t len
, cc_msg_type_t cmd
)
860 if(!cl
->udp_fd
) // disconnected
865 struct s_reader
*rdr
= (cl
->typ
== 'c') ? NULL
: cl
->reader
;
868 struct cc_data
*cc
= cl
->cc
;
870 if(!cl
->cc
|| cl
->kill
)
875 cs_writelock(__func__
, &cc
->lockcmd
);
877 if(!cl
->cc
|| cl
->kill
)
879 cs_writeunlock(__func__
, &cc
->lockcmd
);
884 if(!cs_malloc(&netbuf
, len
+ 4))
886 cs_writeunlock(__func__
, &cc
->lockcmd
);
890 if(cmd
== MSG_NO_HEADER
)
892 memcpy(netbuf
, buf
, len
);
896 // build command message
897 netbuf
[0] = cc
->g_flag
; // flags?
898 netbuf
[1] = cmd
& 0xff;
899 netbuf
[2] = len
>> 8;
900 netbuf
[3] = len
& 0xff;
904 memcpy(netbuf
+ 4, buf
, len
);
909 cs_log_dump_dbg(D_CLIENT
, netbuf
, len
, "cccam: send:");
910 cc_crypt(&cc
->block
[ENCRYPT
], netbuf
, len
, ENCRYPT
);
912 n
= send(cl
->udp_fd
, netbuf
, len
, 0);
914 cs_writeunlock(__func__
, &cc
->lockcmd
);
926 cs_disconnect_client(cl
);
934 #define CC_DEFAULT_VERSION 9
935 #define CC_VERSIONS 10
936 static char *version
[CC_VERSIONS
] = { "2.0.11", "2.1.1", "2.1.2", "2.1.3", "2.1.4", "2.2.0", "2.2.1", "2.3.0", "2.3.1", "2.3.2"};
937 static char *build
[CC_VERSIONS
] = { "2892", "2971", "3094", "3165", "3191", "3290", "3316", "3367", "9d508a", "4000"};
938 static char extcompat
[CC_VERSIONS
] = { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}; // Supporting new card format starting with 2.2.0
942 * checks the cccam-version in the configuration
944 void cc_check_version(char *cc_version
, char *cc_build
)
947 for(i
= 0; i
< CC_VERSIONS
; i
++)
949 if(!memcmp(cc_version
, version
[i
], cs_strlen(version
[i
])))
951 memcpy(cc_build
, build
[i
], cs_strlen(build
[i
]) + 1);
952 cs_log_dbg(D_CLIENT
, "cccam: auto build set for version: %s build: %s", cc_version
, cc_build
);
957 memcpy(cc_version
, version
[CC_DEFAULT_VERSION
], cs_strlen(version
[CC_DEFAULT_VERSION
]));
958 memcpy(cc_build
, build
[CC_DEFAULT_VERSION
], cs_strlen(build
[CC_DEFAULT_VERSION
]));
960 cs_log_dbg(D_CLIENT
, "cccam: auto version set: %s build: %s", cc_version
, cc_build
);
965 int32_t check_cccam_compat(struct cc_data
*cc
)
969 for(i
= 0; i
< CC_VERSIONS
; i
++)
971 if(!strcmp(cfg
.cc_version
, version
[i
]))
983 for(i
= 0; i
< CC_VERSIONS
; i
++)
985 if(!strcmp(cc
->remote_version
, version
[i
]))
997 * sends own version information to the CCCam server
999 int32_t cc_send_cli_data(struct s_client
*cl
)
1001 struct s_reader
*rdr
= cl
->reader
;
1002 struct cc_data
*cc
= cl
->cc
;
1003 const int32_t size
= 20 + 8 + 6 + 26 + 4 + 28 + 1;
1006 cs_log_dbg(D_READER
, "cccam: send client data");
1008 memcpy(cc
->node_id
, cc_node_id
, sizeof(cc_node_id
));
1010 memcpy(buf
, rdr
->r_usr
, sizeof(rdr
->r_usr
));
1011 memcpy(buf
+ 20, cc
->node_id
, 8);
1012 buf
[28] = rdr
->cc_want_emu
; // <-- Client wants to have EMUs, 0 - NO; 1 - YES
1013 memcpy(buf
+ 29, rdr
->cc_version
, sizeof(rdr
->cc_version
)); // cccam version (ascii)
1014 memcpy(buf
+ 61, rdr
->cc_build
, sizeof(rdr
->cc_build
)); // build number (ascii)
1016 // multics seed already detected, now send multics 'WHO' for getting and confirming multics server
1017 if(cc
->multics_mode
== 1)
1019 memcpy(buf
+ 57, "W", 1);
1020 memcpy(buf
+ 58, "H", 1);
1021 memcpy(buf
+ 59, "O", 1);
1024 cs_log_dbg(D_READER
, "%s sending own version: %s, build: %s", getprefix(), rdr
->cc_version
, rdr
->cc_build
);
1026 return cc_cmd_send(cl
, buf
, size
, MSG_CLI_DATA
);
1031 * sends version information to the client
1033 int32_t cc_send_srv_data(struct s_client
*cl
)
1035 struct cc_data
*cc
= cl
->cc
;
1037 cs_log_dbg(D_CLIENT
, "cccam: send server data");
1039 memcpy(cc
->node_id
, cc_node_id
, sizeof(cc_node_id
));
1042 memset(buf
, 0, 0x48);
1044 int32_t stealth
= cl
->account
->cccstealth
;
1047 stealth
= cfg
.cc_stealth
;
1055 memcpy(buf
, cc
->node_id
, 8);
1057 char cc_build
[7], tmp_dbg
[17];
1058 memset(cc_build
, 0, sizeof(cc_build
));
1059 cc_check_version((char *) cfg
.cc_version
, cc_build
);
1060 memcpy(buf
+ 8, cfg
.cc_version
, sizeof(cfg
.cc_version
)); // cccam version (ascii)
1061 memcpy(buf
+ 40, cc_build
, sizeof(cc_build
)); // build number (ascii)
1063 cs_log_dbg(D_CLIENT
, "%s version: %s, build: %s nodeid: %s", getprefix(),
1064 cfg
.cc_version
, cc_build
, cs_hexdump(0, cc
->peer_node_id
, 8, tmp_dbg
, sizeof(tmp_dbg
)));
1066 return cc_cmd_send(cl
, buf
, 0x48, MSG_SRV_DATA
);
1069 int32_t loop_check(uint8_t *myid
, struct s_client
*cl
)
1076 struct cc_data
*cc
= cl
->cc
;
1082 return !memcmp(myid
, cc
->peer_node_id
, sizeof(cc
->peer_node_id
)); // same nodeid? ignore
1087 * retrieves the next waiting ecm request
1089 int32_t cc_get_nxt_ecm(struct s_client
*cl
)
1091 struct cc_data
*cc
= cl
->cc
;
1092 ECM_REQUEST
*er
, *ern
= NULL
;
1093 int32_t n
, i
, pending
= 0;
1097 int32_t diff
= (int32_t)cfg
.ctimeout
+ 500;
1100 for(i
= 0; i
< cfg
.max_pending
; i
++)
1102 er
= &cl
->ecmtask
[i
];
1103 if((comp_timeb(&t
, &er
->tps
) >= diff
) && (er
->rc
>= E_NOCARD
)) // drop timeouts
1105 write_ecm_answer(cl
->reader
, er
, E_TIMEOUT
, 0, NULL
, NULL
, 0, NULL
);
1108 else if(er
->rc
>= E_NOCARD
&& er
->rc
<= E_UNHANDLED
) // stil active and waiting
1111 if(loop_check(cc
->peer_node_id
, er
->client
))
1113 cs_log_dbg(D_READER
, "%s ecm loop detected! client %s (%8lX)",
1114 getprefix(), er
->client
->account
->usr
, (unsigned long)er
->client
->thread
);
1115 write_ecm_answer(cl
->reader
, er
, E_NOTFOUND
, E2_CCCAM_LOOP
, NULL
, NULL
, 0, NULL
);
1119 // search for the ecm with the lowest time, this should be the next to go
1120 if(n
< 0 || (ern
->tps
.time
- er
->tps
.time
< 0))
1122 // check for already pending:
1123 if(cc
&& cc
->extended_mode
)
1128 for(found
= j
= 0; j
< cfg
.max_pending
; j
++)
1130 erx
= &cl
->ecmtask
[j
];
1131 if(i
!= j
&& erx
->rc
== E_ALREADY_SENT
1132 && er
->caid
== erx
->caid
&& er
->ecmd5
== erx
->ecmd5
)
1155 cl
->pending
= pending
;
1160 * sends the secret cmd05 answer to the server
1162 int32_t send_cmd05_answer(struct s_client
*cl
)
1164 struct cc_data
*cc
= cl
->cc
;
1165 if(!cc
->cmd05_active
|| cc
->ecm_busy
) // exit if not in cmd05 or waiting for ECM answer
1171 if(cc
->cmd05_active
)
1176 uint8_t *data
= cc
->cmd05_data
;
1177 cc_cmd05_mode cmd05_mode
= MODE_UNKNOWN
;
1179 // by Project: Keynation
1180 switch(cc
->cmd05_data_len
)
1182 case 0: // payload 0, return with payload 0!
1184 cc_cmd_send(cl
, NULL
, 0, MSG_CMD_05
);
1185 cmd05_mode
= MODE_LEN0
;
1191 cmd05_mode
= cc
->cmd05_mode
;
1194 case MODE_PLAIN
: // send plain unencrypted back
1196 cc_cmd_send(cl
, data
, 256, MSG_CMD_05
);
1200 case MODE_AES
: // encrypt with received aes128 key
1206 memcpy(aeskey
, cc
->cmd05_aeskey
, 16);
1207 memset(&key
, 0, sizeof(key
));
1209 AES_set_encrypt_key((uint8_t *) &aeskey
, 128, &key
);
1212 for(i
= 0; i
< 256; i
+= 16)
1214 AES_encrypt((uint8_t *)data
+ i
, (uint8_t *) &out
+ i
, &key
);
1217 cc_cmd_send(cl
, out
, 256, MSG_CMD_05
);
1221 case MODE_CC_CRYPT
: // encrypt with cc_crypt
1223 cc_crypt(&cc
->cmd05_cryptkey
, data
, 256, ENCRYPT
);
1224 cc_cmd_send(cl
, data
, 256, MSG_CMD_05
);
1228 case MODE_RC4_CRYPT
: // special xor crypt
1230 cc_rc4_crypt(&cc
->cmd05_cryptkey
, data
, 256, DECRYPT
);
1231 cc_cmd_send(cl
, data
, 256, MSG_CMD_05
);
1236 cmd05_mode
= MODE_UNKNOWN
;
1242 cmd05_mode
= MODE_UNKNOWN
;
1245 // unhandled types always needs cycle connection after 50 ECMs!
1246 if(cmd05_mode
== MODE_UNKNOWN
)
1248 cc_cmd_send(cl
, NULL
, 0, MSG_CMD_05
);
1249 if(!cc
->max_ecms
) // max_ecms already set?
1252 cc
->ecm_counter
= 0;
1256 cs_log_dbg(D_READER
, "%s sending CMD_05 back! MODE: %s len=%d",
1257 getprefix(), cmd05_mode_name
[cmd05_mode
], cc
->cmd05_data_len
);
1263 int32_t get_UA_ofs(uint16_t caid
)
1268 case 0x05: // VIACCESS
1269 case 0x0D: // CRYPTOWORKS
1272 case 0x4B: // TONGFANG
1273 case 0x09: // VIDEOGUARD
1277 case 0x00: // SECAMANAGMENT
1278 case 0x17: // BETACRYPT
1279 case 0x06: // IRDETO
1287 int32_t UA_len(uint8_t *ua
)
1291 for(i
= 0; i
< 8; i
++)
1300 void UA_left(uint8_t *in
, uint8_t *out
, int32_t ofs
)
1303 memcpy(out
, in
+ ofs
, 8 - ofs
);
1306 void UA_right(uint8_t *in
, uint8_t *out
, int32_t len
)
1312 memcpy(out
+ ofs
, in
, len
);
1325 * cccam uses UA right justified
1327 void cc_UA_oscam2cccam(uint8_t *in
, uint8_t *out
, uint16_t caid
)
1335 // case 0x17: //IRDETO/Betacrypt:
1336 // //oscam: AA BB CC DD 00 00 00 00
1337 // //cccam: 00 00 00 00 DD AA BB CC
1338 // out[4] = in[3]; //Hexbase
1344 // //Place here your own adjustments!
1347 if(caid_is_bulcrypt(caid
))
1356 hexserial_to_newcamd(in
, tmp
+ 2, caid
);
1357 UA_right(tmp
, out
, 8);
1361 * oscam has a special format, depends on offset or type:
1363 void cc_UA_cccam2oscam(uint8_t *in
, uint8_t *out
, uint16_t caid
)
1371 // case 0x17: //IRDETO/Betacrypt:
1372 // //cccam: 00 00 00 00 DD AA BB CC
1373 // //oscam: AA BB CC DD 00 00 00 00
1377 // out[3] = in[4]; //Hexbase
1380 // //Place here your own adjustments!
1383 if(caid_is_bulcrypt(caid
))
1392 int32_t ofs
= get_UA_ofs(caid
);
1393 UA_left(in
, tmp
, ofs
);
1394 newcamd_to_hexserial(tmp
, out
, caid
);
1397 void cc_SA_oscam2cccam(uint8_t *in
, uint8_t *out
)
1402 void cc_SA_cccam2oscam(uint8_t *in
, uint8_t *out
)
1407 int32_t cc_UA_valid(uint8_t *ua
)
1411 for(i
= 0; i
< 8; i
++)
1423 * Updates AU Data: UA (Unique ID / Hexserial) und SA (Shared ID - Provider)
1425 void set_au_data(struct s_client
*cl
, struct s_reader
*rdr
, struct cc_card
*card
, ECM_REQUEST
*cur_er
)
1427 if(rdr
->audisabled
|| !cc_UA_valid(card
->hexserial
))
1432 struct cc_data
*cc
= cl
->cc
;
1434 cc
->last_emm_card
= card
;
1436 cc_UA_cccam2oscam(card
->hexserial
, rdr
->hexserial
, rdr
->caid
);
1438 cs_log_dbg(D_EMM
, "%s au info: caid %04X UA: %s", getprefix(), card
->caid
,
1439 cs_hexdump(0, rdr
->hexserial
, 8, tmp_dbg
, sizeof(tmp_dbg
)));
1442 LL_ITER it2
= ll_iter_create(card
->providers
);
1443 struct cc_provider
*provider
;
1446 while((provider
= ll_iter_next(&it2
)))
1448 if(!cur_er
|| provider
->prov
== cur_er
->prid
|| !provider
->prov
|| !cur_er
->prid
)
1450 rdr
->prid
[p
][0] = provider
->prov
>> 24;
1451 rdr
->prid
[p
][1] = provider
->prov
>> 16;
1452 rdr
->prid
[p
][2] = provider
->prov
>> 8;
1453 rdr
->prid
[p
][3] = provider
->prov
& 0xFF;
1454 cc_SA_cccam2oscam(provider
->sa
, rdr
->sa
[p
]);
1456 cs_log_dbg(D_EMM
, "%s au info: provider: %06X:%02X%02X%02X%02X", getprefix(),
1457 provider
->prov
, provider
->sa
[0], provider
->sa
[1], provider
->sa
[2], provider
->sa
[3]);
1468 if(!rdr
->nprov
) // No Providers? Add null-provider
1470 memset(rdr
->prid
[0], 0, sizeof(rdr
->prid
[0]));
1474 rdr
->caid
= card
->caid
;
1477 rdr
->auprovid
= cur_er
->prid
;
1481 int32_t same_first_node(struct cc_card
*card1
, struct cc_card
*card2
)
1483 uint8_t *node1
= ll_has_elements(card1
->remote_nodes
);
1484 uint8_t *node2
= ll_has_elements(card2
->remote_nodes
);
1486 if(!node1
&& !node2
)
1488 return 1; // both NULL, same!
1491 if(!node1
|| !node2
)
1493 return 0; // one NULL, not same!
1496 return !memcmp(node1
, node2
, 8); // same?
1499 int32_t same_card2(struct cc_card
*card1
, struct cc_card
*card2
, int8_t compare_grp
)
1501 return (card1
->caid
== card2
->caid
&&
1502 card1
->card_type
== card2
->card_type
&&
1503 card1
->sidtab
== card2
->sidtab
&&
1504 (!compare_grp
|| card1
->grp
== card2
->grp
) &&
1505 !memcmp(card1
->hexserial
, card2
->hexserial
, sizeof(card1
->hexserial
)));
1508 int32_t same_card(struct cc_card
*card1
, struct cc_card
*card2
)
1510 return (card1
->remote_id
== card2
->remote_id
&&
1511 same_card2(card1
, card2
, 1) &&
1512 same_first_node(card1
, card2
));
1515 struct cc_card
*get_matching_card(struct s_client
*cl
, ECM_REQUEST
*cur_er
, int8_t chk_only
)
1517 struct cc_data
*cc
= cl
->cc
;
1518 struct s_reader
*rdr
= cl
->reader
;
1520 if(cl
->kill
|| !rdr
|| !cc
)
1525 struct cc_srvid cur_srvid
;
1526 cur_srvid
.sid
= cur_er
->srvid
;
1527 cur_srvid
.chid
= cur_er
->chid
;
1528 cur_srvid
.ecmlen
= cur_er
->ecmlen
;
1530 int32_t best_rating
= MIN_RATING
- 1, rating
;
1532 LL_ITER it
= ll_iter_create(cc
->cards
);
1533 struct cc_card
*card
= NULL
, *ncard
, *xcard
= NULL
;
1535 while((ncard
= ll_iter_next(&it
)))
1538 if(config_enabled(WITH_LB
))
1540 // accept beta card when beta-tunnel is on
1541 lb_match
= chk_only
&& cfg
.lb_mode
&& cfg
.lb_auto_betatunnel
&&
1542 ((caid_is_nagra(cur_er
->caid
) && caid_is_betacrypt(ncard
->caid
) && cfg
.lb_auto_betatunnel_mode
<= 3) ||
1543 (caid_is_betacrypt(cur_er
->caid
) && caid_is_nagra(ncard
->caid
) && cfg
.lb_auto_betatunnel_mode
>= 1));
1546 if((ncard
->caid
== cur_er
->caid
// caid matches
1547 || (rdr
->cc_want_emu
&& (ncard
->caid
== (cur_er
->caid
& 0xFF00))))
1548 || lb_match
) // or system matches if caid ends with 00 (needed for wantemu)
1550 int32_t goodSidCount
= ll_count(ncard
->goodsids
);
1551 int32_t badSidCount
= ll_count(ncard
->badsids
);
1552 struct cc_srvid
*good_sid
;
1553 struct cc_srvid_block
*blocked_sid
;
1555 if(goodSidCount
&& !badSidCount
) // only good sids -> check if sid is good
1557 good_sid
= is_good_sid(ncard
, &cur_srvid
);
1563 else if(!goodSidCount
&& badSidCount
) // only bad sids -> check if sid is bad
1565 blocked_sid
= is_sid_blocked(ncard
, &cur_srvid
);
1566 if(blocked_sid
&& (!chk_only
|| blocked_sid
->blocked_till
== 0))
1571 else if(goodSidCount
&& badSidCount
) // bad and good sids -> check not blocked and good
1573 blocked_sid
= is_sid_blocked(ncard
, &cur_srvid
);
1574 good_sid
= is_good_sid(ncard
, &cur_srvid
);
1576 if(blocked_sid
&& (!chk_only
|| blocked_sid
->blocked_till
== 0))
1587 if(!(rdr
->cc_want_emu
) && caid_is_nagra(ncard
->caid
) && (!xcard
|| ncard
->hop
< xcard
->hop
))
1589 xcard
= ncard
; // remember card (D+ / 1810 fix) if request has no provider, but card has
1592 rating
= ncard
->rating
- ncard
->hop
* HOP_RATING
;
1593 if(rating
< MIN_RATING
)
1595 rating
= MIN_RATING
;
1597 else if(rating
> MAX_RATING
)
1599 rating
= MAX_RATING
;
1602 if(!ll_count(ncard
->providers
)) // card has no providers:
1604 if(rating
> best_rating
)
1608 best_rating
= rating
; // ncard has been matched
1612 else // card has providers
1614 LL_ITER it2
= ll_iter_create(ncard
->providers
);
1615 struct cc_provider
*provider
;
1617 while((provider
= ll_iter_next(&it2
)))
1619 if(!cur_er
->prid
|| (provider
->prov
== cur_er
->prid
)) // provid matches
1621 if(rating
> best_rating
)
1625 best_rating
= rating
; // ncard has been matched
1635 card
= xcard
; // 18xx: if request has no provider and we have no card, we try this card
1641 // reopen all blocked sids for this srvid
1642 static void reopen_sids(struct cc_data
*cc
, int8_t ignore_time
, ECM_REQUEST
*cur_er
, struct cc_srvid
*cur_srvid
)
1644 time_t utime
= time(NULL
);
1645 struct cc_card
*card
;
1646 LL_ITER it
= ll_iter_create(cc
->cards
);
1648 while((card
= ll_iter_next(&it
)))
1650 if(card
->caid
== cur_er
->caid
) // caid matches
1652 LL_ITER it2
= ll_iter_create(card
->badsids
);
1653 struct cc_srvid_block
*srvid
;
1655 while((srvid
= ll_iter_next(&it2
)))
1657 if(srvid
->blocked_till
> 0 && sid_eq((struct cc_srvid
*)srvid
, cur_srvid
))
1659 if(ignore_time
|| srvid
->blocked_till
<= utime
)
1661 ll_iter_remove_data(&it2
);
1669 static int8_t cc_request_timeout(struct s_client
*cl
)
1671 struct s_reader
*rdr
= cl
->reader
;
1672 struct cc_data
*cc
= cl
->cc
;
1673 struct timeb timeout
;
1674 struct timeb cur_time
;
1676 if(!cc
|| !cc
->ecm_busy
)
1681 cs_ftime(&cur_time
);
1683 timeout
= cc
->ecm_time
;
1684 int32_t tt
= rdr
->cc_reconnect
;
1688 tt
= DEFAULT_CC_RECONNECT
;
1691 add_ms_to_timeb(&timeout
, tt
);
1693 return (comp_timeb(&cur_time
, &timeout
) >= 0);
1698 * sends a ecm request to the connected CCCam Server
1700 int32_t cc_send_ecm(struct s_client
*cl
, ECM_REQUEST
*er
)
1702 struct s_reader
*rdr
= cl
->reader
;
1704 //cs_log_dbg(D_TRACE, "%s cc_send_ecm", getprefix());
1705 if(!rdr
->tcp_connected
)
1711 struct cc_data
*cc
= cl
->cc
;
1712 struct cc_card
*card
= NULL
;
1714 ECM_REQUEST
*cur_er
;
1715 struct timeb cur_time
;
1716 cs_ftime(&cur_time
);
1718 if(!cc
|| (cl
->pfd
< 1) || !rdr
->tcp_connected
)
1722 cs_log_dbg(D_READER
, "%s server not init! ccinit=%d pfd=%d", rdr
->label
, cc
? 1 : 0, cl
->pfd
);
1723 write_ecm_answer(rdr
, er
, E_NOTFOUND
, E2_CCCAM_NOCARD
, NULL
, NULL
, 0, NULL
);
1729 if(rdr
->tcp_connected
!= 2)
1731 cs_log_dbg(D_READER
, "%s Waiting for CARDS", getprefix());
1735 // No Card? Waiting for shares
1736 if(!ll_has_elements(cc
->cards
))
1738 cs_log_dbg(D_READER
, "%s NO CARDS!", getprefix());
1742 cc
->just_logged_in
= 0;
1744 if(!cc
->extended_mode
)
1746 // Without extended mode, only one ecm at a time could be send
1747 // this is a limitation of "O" CCCam
1748 if(cc
->ecm_busy
> 0) // Unlock by NOK or ECM ACK
1750 cs_log_dbg(D_READER
, "%s ecm trylock: ecm busy, retrying later after msg-receive", getprefix());
1752 if(!cc_request_timeout(cl
))
1754 return 0; // pending send...
1757 if(!cc_cycle_connection(cl
))
1764 cs_log_dbg(D_READER
, "cccam: ecm trylock: got lock");
1767 int32_t processed_ecms
= 0;
1771 cc
->ecm_time
= cur_time
;
1773 // Search next ECM to send
1774 if((n
= cc_get_nxt_ecm(cl
)) < 0)
1776 if(!cc
->extended_mode
)
1781 cs_log_dbg(D_READER
, "%s no ecm pending!", getprefix());
1783 if(!cc_send_pending_emms(cl
))
1785 send_cmd05_answer(cl
);
1788 return 0; // no queued ecms
1791 cur_er
= &cl
->ecmtask
[n
];
1792 cur_er
->rc
= E_ALREADY_SENT
; // mark ECM as already send
1793 cs_log_dbg(D_READER
, "cccam: ecm-task %d", cur_er
->idx
);
1795 // sleepsend support
1796 static const char *typtext
[] = { "ok", "invalid", "sleeping" };
1798 if(cc
->sleepsend
&& cl
->stopped
)
1800 if(cur_er
->srvid
== cl
->lastsrvid
&& cur_er
->caid
== cl
->lastcaid
&& cur_er
->pid
== cl
->lastpid
)
1802 cs_log("%s is stopped - requested by server (%s)", cl
->reader
->label
, typtext
[cl
->stopped
]);
1804 if(!cc
->extended_mode
)
1809 write_ecm_answer(rdr
, cur_er
, E_STOPPED
, 0, NULL
, NULL
, 0, NULL
);
1818 cl
->lastsrvid
= cur_er
->srvid
;
1819 cl
->lastcaid
= cur_er
->caid
;
1820 cl
->lastpid
= cur_er
->pid
;
1821 // sleepsend support end
1823 struct cc_srvid cur_srvid
;
1824 cur_srvid
.sid
= cur_er
->srvid
;
1825 cur_srvid
.chid
= cur_er
->chid
;
1826 cur_srvid
.ecmlen
= cur_er
->ecmlen
;
1828 cs_readlock(__func__
, &cc
->cards_busy
);
1831 if(cfg
.cc_forward_origin_card
&& cur_er
->origin_reader
== rdr
&& cur_er
->origin_card
)
1833 it
= ll_iter_create(cc
->cards
);
1834 struct cc_card
*ncard
;
1836 while((ncard
= ll_iter_next(&it
)))
1838 if(ncard
== cur_er
->origin_card
) // Search the origin card
1840 card
= ncard
; // found it, use it!
1848 reopen_sids(cc
, 0, cur_er
, &cur_srvid
);
1849 card
= get_matching_card(cl
, cur_er
, 0);
1852 if(!card
&& has_srvid(rdr
->client
, cur_er
))
1854 reopen_sids(cc
, 1, cur_er
, &cur_srvid
);
1855 card
= get_matching_card(cl
, cur_er
, 0);
1861 if(!cs_malloc(&ecmbuf
, cur_er
->ecmlen
+ 13))
1863 cs_readunlock(__func__
, &cc
->cards_busy
);
1867 // build ecm message
1868 ecmbuf
[0] = cur_er
->caid
>> 8;
1869 ecmbuf
[1] = cur_er
->caid
& 0xff;
1870 ecmbuf
[2] = cur_er
->prid
>> 24;
1871 ecmbuf
[3] = cur_er
->prid
>> 16;
1872 ecmbuf
[4] = cur_er
->prid
>> 8;
1873 ecmbuf
[5] = cur_er
->prid
& 0xff;
1874 ecmbuf
[6] = card
->id
>> 24;
1875 ecmbuf
[7] = card
->id
>> 16;
1876 ecmbuf
[8] = card
->id
>> 8;
1877 ecmbuf
[9] = card
->id
& 0xff;
1878 ecmbuf
[10] = cur_er
->srvid
>> 8;
1879 ecmbuf
[11] = cur_er
->srvid
& 0xff;
1880 ecmbuf
[12] = cur_er
->ecmlen
& 0xff;
1881 memcpy(ecmbuf
+ 13, cur_er
->ecm
, cur_er
->ecmlen
);
1883 uint8_t send_idx
= 1;
1884 if(cc
->extended_mode
)
1886 cc
->server_ecm_idx
++;
1888 if(cc
->server_ecm_idx
>= 256)
1890 cc
->server_ecm_idx
= 1;
1893 cc
->g_flag
= cc
->server_ecm_idx
; // Flag is used as index!
1894 send_idx
= cc
->g_flag
;
1897 struct cc_extended_ecm_idx
*eei
= get_extended_ecm_idx(cl
, send_idx
, 0);
1900 eei
->ecm_idx
= cur_er
->idx
;
1902 eei
->cccam_id
= card
->id
;
1903 eei
->srvid
= cur_srvid
;
1907 eei
= add_extended_ecm_idx(cl
, send_idx
, cur_er
->idx
, card
, cur_srvid
, 0);
1911 cs_readunlock(__func__
, &cc
->cards_busy
);
1915 eei
->tps
= cur_er
->tps
;
1917 rdr
->currenthops
= card
->hop
;
1918 rdr
->card_status
= CARD_INSERTED
;
1920 cs_log_dbg( D_READER
, "%s sending ecm for sid %04X(%d) to card %08x, hop %d, ecmtask %d",
1921 getprefix(), cur_er
->srvid
, cur_er
->ecmlen
, card
->id
, card
->hop
, cur_er
->idx
);
1923 cl
->reader
->last_s
= time(NULL
);
1924 cc_cmd_send(cl
, ecmbuf
, cur_er
->ecmlen
+ 13, MSG_CW_ECM
); // send ecm
1929 set_au_data(cl
, rdr
, card
, cur_er
);
1930 cs_readunlock(__func__
, &cc
->cards_busy
);
1933 if(cc
->extended_mode
)
1935 continue; // process next pending ecm!
1942 // When connecting, it could happen than ecm requests come before all cards are received.
1943 // So if the last Message was a MSG_NEW_CARD, this "card receiving" is not already done
1944 // if this happens, we do not autoblock it and do not set rc status
1945 // So fallback could resolve it
1946 if(cc
->last_msg
!= MSG_NEW_CARD
&& cc
->last_msg
!= MSG_NEW_CARD_SIDINFO
1947 && cc
->last_msg
!= MSG_CARD_REMOVED
&& !cc
->just_logged_in
)
1949 cs_log_dbg(D_READER
, "%s no suitable card on server", getprefix());
1951 write_ecm_answer(rdr
, cur_er
, E_NOTFOUND
, E2_CCCAM_NOCARD
, NULL
, NULL
, 0, NULL
);
1956 rdr
->last_s
= rdr
->last_g
;
1958 reopen_sids(cc
, 0, cur_er
, &cur_srvid
);
1962 // We didn't find a card and the last message was MSG_CARD_REMOVED,
1963 // so we wait for a new card and process die ecm later
1964 cur_er
->rc
= E_WAITING
; // mark as waiting
1968 cs_readunlock(__func__
, &cc
->cards_busy
);
1970 // process next pending ecm!
1972 while(cc
->extended_mode
|| processed_ecms
== 0);
1974 // Now mark all waiting as unprocessed
1976 for(i
= 0; i
< cfg
.max_pending
; i
++)
1978 er
= &cl
->ecmtask
[i
];
1979 if(er
->rc
== E_WAITING
)
1981 er
->rc
= E_UNHANDLED
;
1985 if(!cc
->extended_mode
)
1993 /*int32_t cc_abort_user_ecms()
1997 struct cc_data *cc = rdr->cc;
1999 t = time((time_t *)0);
2000 for(i = 1, n = 1; i < cfg.max_pending; i++)
2002 if((t-cl->ecmtask[i].tps.time > ((cfg.ctimeout + 500) / 1000) + 1) && (cl->ecmtask[i].rc >= 10)) // drop timeouts
2004 cl->ecmtask[i].rc=0;
2007 int32_t td = abs(comp_timeb(&ecmtask[i].tps, &cc->found->tps);
2008 if(ecmtask[i].rc >= 10 && ecmtask[i].cidx == cc->found->cidx && &ecmtask[i] != cc->found)
2010 cs_log("aborting idx:%d caid:%04x client:%d timedelta:%d",ecmtask[i].idx,ecmtask[i].caid,ecmtask[i].cidx,td);
2012 ecmtask[i].rcEx = 7;
2013 write_ecm_answer(rdr, fd_c2m, &ecmtask[i], 0, NULL);
2019 int32_t cc_send_pending_emms(struct s_client
*cl
)
2021 struct cc_data
*cc
= cl
->cc
;
2027 LL_ITER it
= ll_iter_create(cc
->pending_emms
);
2031 if((emmbuf
= ll_iter_next(&it
)))
2033 if(!cc
->extended_mode
)
2035 if(cc
->ecm_busy
> 0) // Unlock by NOK or ECM ACK
2037 return 0; // send later with cc_send_ecm
2042 // Support for emmsize > 256 bytes
2043 size
= (emmbuf
[11] | (emmbuf
[2] << 8)) + 12;
2046 cc
->just_logged_in
= 0;
2047 cs_ftime(&cc
->ecm_time
);
2049 cs_log_dbg(D_EMM
, "%s emm send for card %08X", getprefix(), b2i(4, emmbuf
+ 7));
2051 cc_cmd_send(cl
, emmbuf
, size
, MSG_EMM_ACK
); // send emm
2052 cl
->last
= time(NULL
);
2053 cl
->reader
->last_g
= time(NULL
);
2054 cl
->reader
->last_s
= time(NULL
);
2056 ll_iter_remove_data(&it
);
2064 * find card by hexserial
2066 struct cc_card
*get_card_by_hexserial(struct s_client
*cl
, uint8_t *hexserial
, uint16_t caid
)
2068 struct cc_data
*cc
= cl
->cc
;
2069 LL_ITER it
= ll_iter_create(cc
->cards
);
2070 struct cc_card
*card
;
2072 while((card
= ll_iter_next(&it
)))
2074 if(card
->caid
== caid
&& memcmp(card
->hexserial
, hexserial
, 8) == 0) // found it!
2085 * Copied from http://85.17.209.13:6100/file/8ec3c0c5d257/systems/cardclient/cccam2.c
2088 int32_t cc_send_emm(EMM_PACKET
*ep
)
2090 struct s_client
*cl
= cur_client();
2091 struct s_reader
*rdr
= cl
->reader
;
2093 if(!rdr
->tcp_connected
)
2098 struct cc_data
*cc
= cl
->cc
;
2100 if(!cc
|| (cl
->pfd
< 1) || !rdr
->tcp_connected
)
2102 cs_log_dbg(D_READER
, "%s server not init! ccinit=%d pfd=%d", getprefix(), cc
? 1 : 0, cl
->pfd
);
2108 cs_log_dbg(D_READER
, "%s au is disabled", getprefix());
2112 uint16_t caid
= b2i(2, ep
->caid
);
2114 // Last used card is first card of current_cards
2115 cs_readlock(__func__
, &cc
->cards_busy
);
2117 struct cc_card
*emm_card
= cc
->last_emm_card
;
2124 cc_UA_oscam2cccam(ep
->hexserial
, hs
, caid
);
2126 cs_log_dbg(D_EMM
, "%s au info: searching card for caid %04X oscam-UA: %s",
2127 getprefix(), b2i(2, ep
->caid
), cs_hexdump(0, ep
->hexserial
, 8, tmp_dbg
, sizeof(tmp_dbg
)));
2129 cs_log_dbg(D_EMM
, "%s au info: searching card for caid %04X cccam-UA: %s",
2130 getprefix(), b2i(2, ep
->caid
), cs_hexdump(0, hs
, 8, tmp_dbg
, sizeof(tmp_dbg
)));
2132 emm_card
= get_card_by_hexserial(cl
, hs
, caid
);
2135 if(!emm_card
) // Card for emm not found!
2137 cs_log_dbg(D_EMM
, "%s emm for client %8lX not possible, no card found!",
2138 getprefix(), (unsigned long)ep
->client
->thread
);
2140 cs_readunlock(__func__
, &cc
->cards_busy
);
2144 cs_log_dbg(D_EMM
, "%s emm received for client %8lX caid %04X for card %08X",
2145 getprefix(), (unsigned long)ep
->client
->thread
, caid
, emm_card
->id
);
2147 int32_t size
= ep
->emmlen
+ 12;
2150 if(!cs_malloc(&emmbuf
, size
))
2152 cs_readunlock(__func__
, &cc
->cards_busy
);
2156 // build ecm message
2157 emmbuf
[0] = ep
->caid
[0];
2158 emmbuf
[1] = ep
->caid
[1];
2159 emmbuf
[2] = ep
->emmlen
>> 8; // Support for emm len > 256 bytes
2160 emmbuf
[3] = ep
->provid
[0];
2161 emmbuf
[4] = ep
->provid
[1];
2162 emmbuf
[5] = ep
->provid
[2];
2163 emmbuf
[6] = ep
->provid
[3];
2164 emmbuf
[7] = emm_card
->id
>> 24;
2165 emmbuf
[8] = emm_card
->id
>> 16;
2166 emmbuf
[9] = emm_card
->id
>> 8;
2167 emmbuf
[10] = emm_card
->id
& 0xff;
2168 emmbuf
[11] = ep
->emmlen
& 0xff;
2169 memcpy(emmbuf
+ 12, ep
->emm
, ep
->emmlen
);
2171 cs_readunlock(__func__
, &cc
->cards_busy
);
2173 ll_append(cc
->pending_emms
, emmbuf
);
2174 cc_send_pending_emms(cl
);
2179 void cc_free_card(struct cc_card
*card
)
2186 ll_destroy_data(&card
->providers
);
2187 ll_destroy_data(&card
->badsids
);
2188 ll_destroy_data(&card
->goodsids
);
2189 ll_destroy_data(&card
->remote_nodes
);
2194 struct cc_card
*cc_get_card_by_id(uint32_t card_id
, LLIST
*cards
)
2201 LL_ITER it
= ll_iter_create(cards
);
2202 struct cc_card
*card
;
2204 while((card
= ll_iter_next(&it
)))
2206 if(card
->id
== card_id
)
2215 void cc_free_cardlist(LLIST
*card_list
, int32_t destroy_list
)
2219 LL_ITER it
= ll_iter_create(card_list
);
2220 struct cc_card
*card
;
2222 while((card
= ll_iter_next_remove(&it
)))
2229 ll_destroy(&card_list
);
2235 * Clears and free the cc datas
2237 void cc_free(struct s_client
*cl
)
2239 struct cc_data
*cc
= cl
->cc
;
2247 cs_writelock(__func__
, &cc
->lockcmd
);
2249 cs_log_dbg(D_TRACE
, "exit cccam1/3");
2250 cc_free_cardlist(cc
->cards
, 1);
2251 ll_destroy_data(&cc
->pending_emms
);
2252 free_extended_ecm_idx(cc
);
2253 ll_destroy_data(&cc
->extended_ecm_idx
);
2255 cs_writeunlock(__func__
, &cc
->lockcmd
);
2257 cs_log_dbg(D_TRACE
, "exit cccam2/3");
2259 add_garbage(cc
->prefix
);
2262 cs_log_dbg(D_TRACE
, "exit cccam3/3");
2265 int32_t is_null_dcw(uint8_t *dcw
)
2268 for(i
= 0; i
< 15; i
++)
2274 /*int32_t is_dcw_corrupted(uint8_t *dcw)
2279 for(i = 0; i < 16; i += 4)
2281 c = (dcw[i] + dcw[i + 1] + dcw[i + 2]) & 0xFF;
2292 int32_t check_extended_mode(struct s_client
*cl
, char *msg
)
2294 // Extended mode: if PARTNER String is ending with [PARAM], extended mode is activated
2295 // For future compatibilty the syntax should be compatible with
2296 // [PARAM1,PARAM2...PARAMn]
2298 // EXT: Extended ECM Mode: Multiple ECMs could be send and received
2299 // ECMs are numbered, Flag (byte[0] is the index
2301 // SID: Exchange of good sids/bad sids activated (like cccam 2.2.x)
2302 // card exchange command MSG_NEW_CARD_SIDINFO instead MSG_NEW_CARD is used
2304 // SLP: Sleepsend supported, like camd35
2307 struct cc_data
*cc
= cl
->cc
;
2308 char *saveptr1
= NULL
;
2309 int32_t has_param
= 0;
2310 char *p
= strtok_r(msg
, "[", &saveptr1
);
2314 p
= strtok_r(NULL
, ",]", &saveptr1
);
2315 if(p
&& strncmp(p
, "EXT", 3) == 0)
2317 cc
->extended_mode
= 1;
2318 cs_log_dbg(D_CLIENT
, "%s extended ECM mode", getprefix());
2321 else if(p
&& strncmp(p
, "SID", 3) == 0)
2324 cs_log_dbg(D_CLIENT
, "%s extra SID mode", getprefix());
2327 else if(p
&& strncmp(p
, "SLP", 3) == 0)
2330 cs_log_dbg(D_CLIENT
, "%s sleepsend", getprefix());
2333 #ifdef CS_CACHEEX_AIO
2334 else if(p
&& strncmp(p
, "LGF", 3) == 0)
2336 cc
->extended_lg_flagged_cws
= 1;
2337 cs_log_dbg(D_CLIENT
, "%s lg-flagged CWs", getprefix());
2347 struct s_client
*cl
= cur_client();
2348 struct s_reader
*rdr
= cl
->reader
;
2349 struct cc_data
*cc
= cl
->cc
;
2353 cc_cli_close(cl
, 0);
2356 if(rdr
&& !rdr
->tcp_connected
&& (rdr
->cc_keepalive
|| (rdr
->tcp_ito
== -1 && (rdr
->last_s
!= 0 || rdr
->last_g
!= 0))))
2361 if(!rdr
|| !rdr
->tcp_connected
|| !cl
|| !cc
)
2366 time_t now
= time(NULL
);
2368 if(rdr
->cc_keepalive
)
2370 #ifdef CS_CACHEEX_AIO
2371 if(!cl
->cacheex_aio_checked
&& ((cl
->account
&& cl
->account
->cacheex
.mode
> 0) || (cl
->reader
&& cl
->reader
->cacheex
.mode
> 0)))
2373 cc_cacheex_feature_request(cl
);
2374 cl
->cacheex_aio_checked
= 1;
2377 if(cc_cmd_send(cl
, NULL
, 0, MSG_KEEPALIVE
) > 0)
2379 cs_log_dbg(D_READER
, "cccam: keepalive");
2388 cl
->reader
->last_s
= now
;
2389 cl
->reader
->last_g
= now
;
2396 //cs_log("last_s - now = %d, last_g - now = %d, tcp_ito=%d",
2397 // abs(rdr->last_s - now), abs(rdr->last_g - now), rdr->tcp_ito);
2399 // check inactivity timeout
2400 if(rdr
->tcp_ito
> 0)
2402 // inactivity timeout is entered in seconds in webif!
2403 if((llabs(rdr
->last_s
- now
) > rdr
->tcp_ito
) && (llabs(rdr
->last_g
- now
) > rdr
->tcp_ito
))
2405 rdr_log_dbg(rdr
, D_READER
, "inactive_timeout, close connection (fd=%d)", rdr
->client
->pfd
);
2406 network_tcp_connection_close(rdr
, "inactivity");
2411 // check read timeout
2412 int32_t rto
= llabs(rdr
->last_g
- now
);
2413 //cs_log("last_g - now = %d, rto=%d", rto, rdr->tcp_rto);
2415 // this is also entered in seconds, actually its an receive timeout!
2416 if(rto
> (rdr
->tcp_rto
) && (rdr
->last_g
!= 0 || rdr
->last_s
!= 0) && rdr
->last_s
!= rdr
->last_g
)
2418 rdr_log_dbg(rdr
, D_READER
, "read timeout, close connection (fd=%d)", rdr
->client
->pfd
);
2419 network_tcp_connection_close(rdr
, "rto");
2425 struct cc_card
*read_card(uint8_t *buf
, int32_t buflen
, int32_t ext
)
2427 struct cc_card
*card
;
2428 int16_t nprov
, nassign
= 0, nreject
= 0;
2429 int32_t offset
= 21;
2436 if(!cs_malloc(&card
, sizeof(struct cc_card
)))
2441 card
->providers
= ll_create("providers");
2442 card
->badsids
= ll_create("badsids");
2443 card
->goodsids
= ll_create("goodsids");
2444 card
->remote_nodes
= ll_create("remote_nodes");
2445 card
->id
= b2i(4, buf
);
2446 card
->remote_id
= b2i(4, buf
+ 4);
2447 card
->caid
= b2i(2, buf
+ 8);
2448 card
->hop
= buf
[10];
2449 card
->reshare
= buf
[11];
2451 card
->card_type
= CT_REMOTECARD
;
2452 memcpy(card
->hexserial
, buf
+ 12, 8); // HEXSERIAL!!
2454 //cs_log_dbg(D_CLIENT, "cccam: card %08x added, caid %04X, hop %d, key %s, count %d", card->id, card->caid,
2455 // card->hop, cs_hexdump(0, card->hexserial, 8, tmp_dbg, sizeof(tmp_dbg)), ll_count(cc->cards));
2473 if(buflen
< (offset
+ (nprov
* 7)))
2480 for(i
= 0; i
< nprov
; i
++) // providers
2482 struct cc_provider
*prov
;
2483 if(!cs_malloc(&prov
, sizeof(struct cc_provider
)))
2488 prov
->prov
= b2i(3, buf
+ offset
);
2489 if(prov
->prov
== 0xFFFFFF && caid_is_betacrypt(card
->caid
))
2494 memcpy(prov
->sa
, buf
+ offset
+ 3, 4);
2495 //cs_log_dbg(D_CLIENT, " prov %d, %06x, sa %08x", i + 1, prov->prov, b2i(4, prov->sa));
2497 ll_append(card
->providers
, prov
);
2503 if(buflen
< (offset
+ (nassign
* 2) + (nreject
* 2)))
2509 for(i
= 0; i
< nassign
; i
++)
2511 uint16_t sid
= b2i(2, buf
+ offset
);
2512 //cs_log_dbg(D_CLIENT, " assigned sid = %04X, added to good sid list", sid);
2514 struct cc_srvid
*srvid
;
2515 if(!cs_malloc(&srvid
, sizeof(struct cc_srvid
)))
2523 ll_append(card
->goodsids
, srvid
);
2527 for(i
= 0; i
< nreject
; i
++)
2529 uint16_t sid
= b2i(2, buf
+ offset
);
2530 //cs_log_dbg(D_CLIENT, " rejected sid = %04X, added to sid block list", sid);
2532 struct cc_srvid_block
*srvid
;
2533 if(!cs_malloc(&srvid
, sizeof(struct cc_srvid_block
)))
2541 srvid
->blocked_till
= 0;
2542 ll_append(card
->badsids
, srvid
);
2547 if(buflen
< (offset
+ 1))
2552 int16_t remote_count
= buf
[offset
];
2555 if(buflen
< (offset
+ (remote_count
* 8)))
2561 for(i
= 0; i
< remote_count
; i
++)
2563 uint8_t *remote_node
;
2564 if(!cs_malloc(&remote_node
, 8))
2569 memcpy(remote_node
, buf
+ offset
, 8);
2570 ll_append(card
->remote_nodes
, remote_node
);
2577 void cc_card_removed(struct s_client
*cl
, uint32_t shareid
)
2579 struct cc_data
*cc
= cl
->cc
;
2580 struct cc_card
*card
;
2581 LL_ITER it
= ll_iter_create(cc
->cards
);
2583 while((card
= ll_iter_next(&it
)))
2585 if(card
->id
== shareid
) // && card->sub_id == b2i (3, buf + 9)) {
2587 //cs_log_dbg(D_CLIENT, "cccam: card %08x removed, caid %04X, count %d",
2588 // card->id, card->caid, ll_count(cc->cards));
2590 ll_iter_remove(&it
);
2591 if(cc
->last_emm_card
== card
)
2593 cc
->last_emm_card
= NULL
;
2594 cs_log_dbg(D_READER
, "%s current card %08x removed!", getprefix(), card
->id
);
2597 free_extended_ecm_idx_by_card(cl
, card
, 1);
2603 else if(card
->hop
== 2)
2612 if(card
->reshare
== 0)
2616 else if(card
->reshare
== 1)
2620 else if(card
->reshare
== 2)
2629 cs_log_dbg(D_TRACE
, "%s card removed: id %8X remoteid %8X caid %4X hop %d reshare %d originid %8X cardtype %d",
2630 getprefix(), card
->id
, card
->remote_id
, card
->caid
, card
->hop
, card
->reshare
, card
->origin_id
, card
->card_type
);
2633 cc
->card_removed_count
++;
2639 void move_card_to_end(struct s_client
*cl
, struct cc_card
*card_to_move
)
2641 struct cc_data
*cc
= cl
->cc
;
2642 LL_ITER it
= ll_iter_create(cc
->cards
);
2643 struct cc_card
*card
;
2645 while((card
= ll_iter_next(&it
)))
2647 if(card
== card_to_move
)
2649 ll_iter_remove(&it
);
2656 cs_log_dbg(D_READER
, "%s Moving card %08X to the end...", getprefix(), card_to_move
->id
);
2657 free_extended_ecm_idx_by_card(cl
, card
, 0);
2658 ll_append(cc
->cards
, card_to_move
);
2662 /*void fix_dcw(uint8_t *dcw)
2666 for(i = 0; i < 16; i += 4)
2668 dcw[i + 3] = (dcw[i] + dcw[i + 1] + dcw[i + 2]) & 0xFF;
2672 void addParam(char *param
, size_t param_sz
, char *value
)
2675 cs_log("ERROR! Sizeof param is zero!");
2679 if (param
&& value
) {
2680 if ((cs_strlen(param
) + cs_strlen(value
) + 1) < param_sz
) {
2681 if (cs_strlen(param
) < 4) {
2682 cs_strncat(param
, value
, param_sz
);
2685 cs_strncat(param
, ",", param_sz
);
2686 cs_strncat(param
, value
, param_sz
);
2690 cs_log("ERROR! Buffer overflow in addParam!");
2694 cs_log("ERROR! Booth param and value pointer NULL!");
2698 static void chk_peer_node_for_oscam(struct cc_data
*cc
)
2700 if(!cc
->is_oscam_cccam
) // Allready discovered oscam-cccam
2702 uint16_t sum
= 0x1234;
2703 uint16_t recv_sum
= (cc
->peer_node_id
[6] << 8) | cc
->peer_node_id
[7];
2706 for(i
= 0; i
< 6; i
++)
2708 sum
+= cc
->peer_node_id
[i
];
2711 // Create special data to detect oscam-cccam
2712 cc
->is_oscam_cccam
= sum
== recv_sum
;
2716 #ifdef MODULE_CCCSHARE
2717 static void cc_s_idle(struct s_client
*cl
)
2719 cs_log_dbg(D_TRACE
, "ccc idle %s", username(cl
));
2720 if(cfg
.cc_keep_connected
)
2722 #ifdef CS_CACHEEX_AIO
2723 if(!cl
->cacheex_aio_checked
&& ((cl
->account
&& cl
->account
->cacheex
.mode
> 0) || (cl
->reader
&& cl
->reader
->cacheex
.mode
> 0)))
2725 cc_cacheex_feature_request(cl
);
2726 cl
->cacheex_aio_checked
= 1;
2729 cc_cmd_send(cl
, NULL
, 0, MSG_KEEPALIVE
);
2730 cl
->last
= time(NULL
);
2734 cs_log_dbg(D_CLIENT
, "%s keepalive after maxidle is reached", getprefix());
2735 cs_disconnect_client(cl
);
2740 int32_t cc_parse_msg(struct s_client
*cl
, uint8_t *buf
, int32_t l
)
2742 struct s_reader
*rdr
= (cl
->typ
== 'c') ? NULL
: cl
->reader
;
2743 int32_t ret
= buf
[1];
2744 struct cc_data
*cc
= cl
->cc
;
2752 cs_log_dbg(cl
->typ
== 'c' ? D_CLIENT
: D_READER
, "%s parse_msg=%d", getprefix(), buf
[1]);
2754 uint8_t *data
= buf
+ 4;
2761 memcpy(&cc
->receive_buffer
, data
, l
- 4);
2762 cc
->last_msg
= buf
[1];
2768 cs_log_dbg(D_CLIENT
, "cccam: client data ack");
2775 cs_log_dbg(D_READER
, "%s MSG_SRV_DATA (payload=%d, hex=%02X)", getprefix(), l
, l
);
2776 data
= cc
->receive_buffer
;
2778 if(l
== 0x48) // 72 bytes: normal server data
2780 cs_writelock(__func__
, &cc
->cards_busy
);
2782 cc_free_cardlist(cc
->cards
, 0);
2783 free_extended_ecm_idx(cc
);
2784 cc
->last_emm_card
= NULL
;
2788 cc
->num_reshare0
= 0;
2789 cc
->num_reshare1
= 0;
2790 cc
->num_reshare2
= 0;
2791 cc
->num_resharex
= 0;
2793 memcpy(cc
->peer_node_id
, data
, 8);
2794 memcpy(cc
->peer_version
, data
+ 8, 8);
2796 memcpy(cc
->cmd0b_aeskey
, cc
->peer_node_id
, 8);
2797 memcpy(cc
->cmd0b_aeskey
+ 8, cc
->peer_version
, 8);
2799 cs_strncpy(cc
->remote_version
, (char *)data
+ 8, sizeof(cc
->remote_version
));
2800 cs_strncpy(cc
->remote_build
, (char *)data
+ 40, sizeof(cc
->remote_build
));
2801 cc
->remote_build_nr
= atoi(cc
->remote_build
);
2803 // multics server response
2804 if(data
[33] == 'M' && data
[34] == 'C' && data
[35] == 'S')
2806 cc
->multics_mode
= 2; // multics server finaly confirmed.
2807 cc
->multics_version
[0] = data
[37];
2808 cc
->multics_version
[1] = data
[38];
2809 cs_log_dbg(D_READER
, "multics detected: %s!", getprefix());
2812 cs_writeunlock(__func__
, &cc
->cards_busy
);
2814 cs_log_dbg(D_READER
, "%s remote server %s running v%s (%s)", getprefix(), cs_hexdump(0,
2815 cc
->peer_node_id
, 8, tmp_dbg
, sizeof(tmp_dbg
)), cc
->remote_version
, cc
->remote_build
);
2817 chk_peer_node_for_oscam(cc
);
2818 // Trick: when discovered partner is an Oscam Client, then we send him our version string:
2819 if(cc
->is_oscam_cccam
)
2822 #ifdef CS_CACHEEX_AIO
2823 snprintf((char *)token
, sizeof(token
), "PARTNER: OSCam v%s, build r%s (%s) [EXT,SID,SLP,LGF]",
2825 snprintf((char *)token
, sizeof(token
), "PARTNER: OSCam v%s, build r%s (%s) [EXT,SID,SLP]",
2827 CS_VERSION
, CS_SVN_VERSION
, CS_TARGET
);
2829 cc_cmd_send(cl
, token
, cs_strlen((char *)token
) + 1, MSG_CW_NOK1
);
2832 cc
->cmd05_mode
= MODE_PLAIN
;
2834 // Keyoffset is payload-size:
2837 else if(l
>= 0x00 && l
<= 0x0F)
2839 cs_writelock(__func__
, &cc
->cards_busy
);
2840 cc
->cmd05_offset
= l
;
2841 cs_writeunlock(__func__
, &cc
->cards_busy
);
2843 // 16..43 bytes: RC4 encryption
2846 else if((l
>= 0x10 && l
<= 0x1f) || (l
>= 0x24 && l
<= 0x2b))
2848 cs_writelock(__func__
, &cc
->cards_busy
);
2849 cc_init_crypt(&cc
->cmd05_cryptkey
, data
, l
);
2850 cc
->cmd05_mode
= MODE_RC4_CRYPT
;
2851 cs_writeunlock(__func__
, &cc
->cards_busy
);
2853 // 32 bytes: set AES128 key for CMD_05, Key=16 bytes offset keyoffset
2858 cs_writelock(__func__
, &cc
->cards_busy
);
2859 memcpy(cc
->cmd05_aeskey
, data
+ cc
->cmd05_offset
, 16);
2860 cc
->cmd05_mode
= MODE_AES
;
2861 cs_writeunlock(__func__
, &cc
->cards_busy
);
2863 // 33 bytes: xor-algo mit payload-bytes, offset keyoffset
2868 cs_writelock(__func__
, &cc
->cards_busy
);
2869 cc_init_crypt(&cc
->cmd05_cryptkey
, data
+ cc
->cmd05_offset
, l
);
2870 cc
->cmd05_mode
= MODE_CC_CRYPT
;
2871 cs_writeunlock(__func__
, &cc
->cards_busy
);
2873 // 34 bytes: cmd_05 plain back
2878 cs_writelock(__func__
, &cc
->cards_busy
);
2879 cc
->cmd05_mode
= MODE_PLAIN
;
2880 cs_writeunlock(__func__
, &cc
->cards_busy
);
2882 // 35 bytes: Unknown!! 2 256 byte keys exchange
2887 cs_writelock(__func__
, &cc
->cards_busy
);
2888 cc
->cmd05_mode
= MODE_UNKNOWN
;
2889 cs_writeunlock(__func__
, &cc
->cards_busy
);
2890 cc_cycle_connection(cl
);
2892 // 44 bytes: set aes128 key, Key=16 bytes [Offset=len(password)]
2897 cs_writelock(__func__
, &cc
->cards_busy
);
2898 memcpy(cc
->cmd05_aeskey
, data
+ cs_strlen(rdr
->r_pwd
), 16);
2899 cc
->cmd05_mode
= MODE_AES
;
2900 cs_writeunlock(__func__
, &cc
->cards_busy
);
2902 // 45 bytes: set aes128 key, Key=16 bytes [Offset=len(username)]
2907 cs_writelock(__func__
, &cc
->cards_busy
);
2908 memcpy(cc
->cmd05_aeskey
, data
+ cs_strlen(rdr
->r_usr
), 16);
2909 cc
->cmd05_mode
= MODE_AES
;
2910 cs_writeunlock(__func__
, &cc
->cards_busy
);
2917 cs_log_dbg(D_READER
, "%s received improper MSG_SRV_DATA! No change to current mode, mode=%d",
2918 getprefix(), cc
->cmd05_mode
);
2922 cs_log_dbg(D_READER
, "%s MSG_SRV_DATA MODE=%s, len=%d", getprefix(), cmd05_mode_name
[cc
->cmd05_mode
], l
);
2926 case MSG_NEW_CARD_SIDINFO
:
2934 uint16_t caid
= b2i(2, buf
+ 12);
2936 // filter caid == 0 and maxhop
2937 if(!caid
|| buf
[14] >= rdr
->cc_maxhops
+ 1)
2943 if(buf
[15] < rdr
->cc_mindown
)
2949 if(!chk_ctab(caid
, &rdr
->ctab
))
2954 rdr
->tcp_connected
= 2; // we have card
2955 rdr
->card_status
= CARD_INSERTED
;
2957 cs_writelock(__func__
, &cc
->cards_busy
);
2958 struct cc_card
*card
= read_card(data
, l
- 4, buf
[1] == MSG_NEW_CARD_SIDINFO
);
2962 cs_writeunlock(__func__
, &cc
->cards_busy
);
2966 card
->origin_reader
= rdr
;
2967 card
->origin_id
= card
->id
;
2968 card
->grp
= rdr
->grp
;
2969 card
->rdr_reshare
= rdr
->cc_reshare
> -1 ? rdr
->cc_reshare
: cfg
.cc_reshare
;
2971 // Check if this card is from us
2972 LL_ITER it
= ll_iter_create(card
->remote_nodes
);
2975 while((node_id
= ll_iter_next(&it
)))
2977 if(memcmp(node_id
, cc_node_id
, sizeof(cc_node_id
)) == 0) // this card is from us!
2979 cs_log_dbg(D_READER
, "filtered card because of recursive nodeid: id=%08X, caid=%04X", card
->id
, card
->caid
);
2986 #ifdef MODULE_CCCSHARE
2987 // Check Ident filter
2990 if(!chk_ident(&rdr
->ftab
, card
))
2999 // Check if we already have this card
3000 it
= ll_iter_create(cc
->cards
);
3001 struct cc_card
*old_card
;
3003 while((old_card
= ll_iter_next(&it
)))
3005 // We already have this card, delete it
3006 if(old_card
->id
== card
->id
|| same_card(old_card
, card
))
3016 card
->card_type
= CT_REMOTECARD
;
3017 ll_append(cc
->cards
, card
);
3018 set_au_data(cl
, rdr
, card
, NULL
);
3019 cc
->card_added_count
++;
3026 else if(card
->hop
== 2)
3035 if(card
->reshare
== 0)
3039 else if(card
->reshare
== 1)
3043 else if(card
->reshare
== 2)
3052 cs_log_dbg(D_TRACE
, "%s card added: id %8X remoteid %8X caid %4X hop %d reshare %d originid %8X cardtype %d",
3053 getprefix(), card
->id
, card
->remote_id
, card
->caid
, card
->hop
, card
->reshare
, card
->origin_id
, card
->card_type
);
3057 cs_writeunlock(__func__
, &cc
->cards_busy
);
3059 #ifdef MODULE_CCCSHARE
3060 cccam_refresh_share();
3065 case MSG_CARD_REMOVED
:
3072 cs_writelock(__func__
, &cc
->cards_busy
);
3073 cc_card_removed(cl
, b2i(4, buf
+ 4));
3074 cs_writeunlock(__func__
, &cc
->cards_busy
);
3080 // Server sends SLEEPSEND
3086 if(!cfg
.c35_suppresscmd08
)
3090 cl
->stopped
= 2; // server says sleep
3091 //rdr->card_status = NO_CARD;
3095 if(config_enabled(WITH_LB
) && !cfg
.lb_mode
)
3097 cl
->stopped
= 1; // server says invalid
3099 rdr
->card_status
= CARD_FAILURE
;
3103 } /* fallthrough */ // NO BREAK!! NOK Handling needed!
3115 // Received NOK with payload
3116 char *msg
= (char *) buf
+ 4;
3118 // Check for PARTNER connection
3119 if((l
>= (4 + 8)) && strncmp(msg
, "PARTNER:", 8) == 0)
3121 // When Data starts with "PARTNER:" we have an Oscam-cccam-compatible client/server!
3123 cs_strncpy(cc
->remote_oscam
, msg
+ 9, sizeof(cc
->remote_oscam
));
3124 int32_t has_param
= check_extended_mode(cl
, msg
);
3126 if(!cc
->is_oscam_cccam
)
3128 cc
->is_oscam_cccam
= 1;
3130 // send params back. At the moment there is only "EXT"
3138 cs_strncpy(param
, " [", sizeof(param
));
3140 if(cc
->extended_mode
)
3142 addParam(param
, sizeof(param
), "EXT");
3147 addParam(param
, sizeof(param
), "SID");
3152 addParam(param
, sizeof(param
), "SLP");
3155 #ifdef CS_CACHEEX_AIO
3156 if(cc
->extended_lg_flagged_cws
)
3158 addParam(param
, sizeof(param
), "LGF");
3161 if (!cs_strncat(param
, "]", sizeof(param
))) {
3162 cs_log("BUG!!, Adding ']' didn't succed!");
3167 snprintf((char *)token
, sizeof(token
), "PARTNER: OSCam v%s, build r%s (%s)%s",
3168 CS_VERSION
, CS_SVN_VERSION
, CS_TARGET
, param
);
3170 cc_cmd_send(cl
, token
, cs_strlen((char *)token
) + 1, MSG_CW_NOK1
);
3175 size_t msg_size
= l
- 4;
3176 char last_char
= msg
[msg_size
- 1];
3178 if(last_char
== 0) // verify if the payload is a null terminated string
3180 if(cs_realloc(&cc
->nok_message
, msg_size
))
3182 memcpy(cc
->nok_message
, msg
, msg_size
);
3187 NULLFREE(cc
->nok_message
);
3201 cc
->recv_ecmtask
= -1;
3203 if(cc
->just_logged_in
) // reader restart needed
3208 cs_readlock(__func__
, &cc
->cards_busy
);
3210 struct cc_extended_ecm_idx
*eei
= get_extended_ecm_idx(cl
, cc
->extended_mode
? cc
->g_flag
: 1, 1);
3213 cs_log_dbg(D_READER
, "%s received extended ecm NOK id %d but not found!", getprefix(), cc
->g_flag
);
3217 uint16_t ecm_idx
= eei
->ecm_idx
;
3218 cc
->recv_ecmtask
= ecm_idx
;
3219 struct cc_card
*card
= eei
->card
;
3220 //uint32_t cccam_id = eei->cccam_id;
3221 struct cc_srvid srvid
= eei
->srvid
;
3225 int64_t cwlastresptime
= comp_timeb(&tpe
, &eei
->tps
);
3231 if(buf
[1] == MSG_CW_NOK1
) // MSG_CW_NOK1: share no more available
3233 cs_log_dbg(D_TRACE
, "NOK1: share temporarily not available %d %04X ecm %d %d!",
3234 card
->id
, card
->caid
, eei
->send_idx
, eei
->ecm_idx
);
3237 for(j
= 0; j
< cfg
.max_pending
; j
++)
3239 if(cl
->ecmtask
[j
].idx
== ecm_idx
&& cl
->ecmtask
[j
].rc
== E_ALREADY_SENT
)
3241 ECM_REQUEST
*er
= &cl
->ecmtask
[j
];
3244 write_ecm_answer(rdr
, er
, E_NOTFOUND
, 0, NULL
, NULL
, 0, NULL
);
3249 else if(cc
->cmd05NOK
) // else MSG_CW_NOK2: can't decode
3251 move_card_to_end(cl
, card
);
3252 if(cwlastresptime
< 5000)
3254 add_sid_block(card
, &srvid
, true);
3258 if(card
->rating
<= MIN_RATING
)
3260 add_sid_block(card
, &srvid
, true);
3268 else if(cacheex_get_rdr_mode(rdr
) != 1)
3270 if(!is_good_sid(card
, &srvid
))
3272 move_card_to_end(cl
, card
);
3273 if(cwlastresptime
< 5000)
3275 add_sid_block(card
, &srvid
, true);
3279 if(card
->rating
<= MIN_RATING
)
3281 add_sid_block(card
, &srvid
, true);
3291 move_card_to_end(cl
, card
);
3292 add_sid_block(card
, &srvid
, true);
3295 if(card
->rating
< MIN_RATING
)
3297 card
->rating
= MIN_RATING
;
3300 if(cfg
.cc_forward_origin_card
&& card
->origin_reader
== rdr
)
3302 // this card is from us but it can't decode this ecm
3303 // also origin card is only set on cccam clients
3304 // so wie send back the nok to the client
3305 cs_log_dbg(D_TRACE
, "%s forward card: %s", getprefix(), (buf
[1] == MSG_CW_NOK1
) ? "NOK1" : "NOK2");
3312 cs_log_dbg(D_READER
, "%s NOK: NO CARD!", getprefix());
3316 // A "NOK" in extended mode means, NOTHING found,
3317 // regardless of the requested card. So do not retry
3318 if(cc
->extended_mode
)
3326 cc_reset_pending(cl
, ecm_idx
);
3331 for(i
= 0; i
< cfg
.max_pending
; i
++)
3333 if(cl
->ecmtask
[i
].idx
== ecm_idx
&& cl
->ecmtask
[i
].rc
== E_ALREADY_SENT
)
3335 cs_log_dbg(D_TRACE
, "%s ext NOK %s", getprefix(), (buf
[1] == MSG_CW_NOK1
) ? "NOK1" : "NOK2");
3336 ECM_REQUEST
*er
= &cl
->ecmtask
[i
];
3339 write_ecm_answer(rdr
, er
, E_NOTFOUND
, 0, NULL
, NULL
, 0, NULL
);
3346 cs_readunlock(__func__
, &cc
->cards_busy
);
3348 if(!cc
->extended_mode
)
3353 cc_send_ecm(cl
, NULL
);
3357 case MSG_CACHE_PUSH
:
3361 cc_cacheex_push_in(cl
, data
);
3366 case MSG_CACHE_FILTER
:
3370 cc_cacheex_filter_in(cl
, data
);
3374 #ifdef CS_CACHEEX_AIO
3375 case MSG_CACHE_FEATURE_EXCHANGE
:
3379 cc_cacheex_feature_request_reply(cl
);
3384 case MSG_CACHE_FEATURE_EXCHANGE_REPLY
:
3388 cc_cacheex_feature_request_save(cl
, data
);
3393 case MSG_CACHE_FEATURE_TRIGGER
:
3397 cc_cacheex_feature_trigger_in(cl
, data
);
3402 case MSG_CW_ECM_LGF
:
3406 cc
->just_logged_in
= 0;
3407 if(cl
->typ
== 'c') // SERVER:
3409 #define CCMSG_HEADER_LEN 17
3411 struct cc_card
*server_card
;
3413 if(l
< CCMSG_HEADER_LEN
)
3418 if(!cs_malloc(&server_card
, sizeof(struct cc_card
)))
3423 server_card
->id
= buf
[10] << 24 | buf
[11] << 16 | buf
[12] << 8 | buf
[13];
3424 server_card
->caid
= b2i(2, data
);
3426 if((er
= get_ecmtask()) && l
> CCMSG_HEADER_LEN
&& MAX_ECM_SIZE
> l
- CCMSG_HEADER_LEN
)
3428 er
->caid
= b2i(2, buf
+ 4);
3429 er
->prid
= b2i(4, buf
+ 6);
3430 er
->srvid
= b2i(2, buf
+ 14);
3431 er
->ecmlen
= l
- CCMSG_HEADER_LEN
;
3432 memcpy(er
->ecm
, buf
+ CCMSG_HEADER_LEN
, er
->ecmlen
);
3433 cc
->server_ecm_pending
++;
3434 er
->idx
= ++cc
->server_ecm_idx
;
3436 #ifdef MODULE_CCCSHARE
3437 if(cfg
.cc_forward_origin_card
) // search my shares for this card:
3439 cs_log_dbg(D_TRACE
, "%s forward card: %04X:%04x search share %d", getprefix(),
3440 er
->caid
, er
->srvid
, server_card
->id
);
3442 LLIST
**sharelist
= get_and_lock_sharelist();
3443 LL_ITER itr
= ll_iter_create(get_cardlist(er
->caid
, sharelist
));
3444 struct cc_card
*card
;
3445 struct cc_card
*rcard
= NULL
;
3447 while((card
= ll_iter_next(&itr
)))
3449 if(card
->id
== server_card
->id
) // found it
3455 cs_log_dbg(D_TRACE
, "%s forward card: share %d found: %d", getprefix(), server_card
->id
, card
? 1 : 0);
3457 struct s_reader
*ordr
= NULL
;
3459 if(card
&& card
->origin_reader
) // found own card, now search reader card
3461 // Search reader in list, because it is maybe offline?
3462 for(ordr
= first_active_reader
; ordr
; ordr
= ordr
->next
)
3464 if(ordr
== card
->origin_reader
)
3472 cs_log_dbg(D_TRACE
, "%s origin reader not found!", getprefix());
3476 cs_log_dbg(D_TRACE
, "%s forward card: share %d origin reader %s origin id %d",
3477 getprefix(), card
->id
, ordr
->label
, card
->origin_id
);
3479 struct s_client
*cl2
= ordr
->client
;
3480 if(card
->origin_id
&& cl2
&& cl2
->cc
) // only if we have a origin from a cccam reader
3482 struct cc_data
*rcc
= cl2
->cc
;
3486 itr
= ll_iter_create(rcc
->cards
);
3487 while((rcard
= ll_iter_next(&itr
)))
3489 if(rcard
->id
== card
->origin_id
) // found it!
3501 er
->origin_reader
= ordr
;
3504 er
->origin_card
= rcard
;
3507 cs_log_dbg(D_TRACE
, "%s forward card: share %d not found!", getprefix(), server_card
->id
);
3508 er
->rc
= E_NOTFOUND
;
3509 er
->rcEx
= E2_CCCAM_NOK1
; // share not found!
3513 cs_log_dbg(D_TRACE
, "%s forward card: share %d forwarded to %s origin as id %d",
3514 getprefix(), card
->id
, ordr
->label
, rcard
->id
);
3519 cs_log_dbg(D_CLIENT
, "%s ECM request from client: caid %04x srvid %04x(%d) prid %06x",
3520 getprefix(), er
->caid
, er
->srvid
, er
->ecmlen
, er
->prid
);
3522 struct cc_srvid srvid
;
3523 srvid
.sid
= er
->srvid
;
3524 srvid
.chid
= er
->chid
;
3525 srvid
.ecmlen
= er
->ecmlen
;
3526 add_extended_ecm_idx(cl
, cc
->extended_mode
? cc
->g_flag
: 1, er
->idx
, server_card
, srvid
, 1);
3533 cs_log_dbg(D_CLIENT
, "%s NO ECMTASK!!!! l=%d", getprefix(), l
);
3534 NULLFREE(server_card
);
3545 cs_readlock(__func__
, &cc
->cards_busy
);
3546 cc
->recv_ecmtask
= -1;
3548 struct cc_extended_ecm_idx
*eei
= get_extended_ecm_idx(cl
, cc
->extended_mode
? cc
->g_flag
: 1, 1);
3551 cs_log_dbg(D_READER
, "%s received extended ecm id %d but not found!", getprefix(), cc
->g_flag
);
3553 if(!cc
->extended_mode
)
3555 cc_cli_close(cl
, 0);
3560 uint16_t ecm_idx
= eei
->ecm_idx
;
3561 cc
->recv_ecmtask
= ecm_idx
;
3562 struct cc_card
*card
= eei
->card
;
3563 uint32_t cccam_id
= eei
->cccam_id
;
3564 struct cc_srvid srvid
= eei
->srvid
;
3569 if(!cc
->extended_mode
)
3571 cc_cw_crypt(cl
, buf
+ 4, card
->id
);
3572 cc_crypt_cmd0c(cl
, buf
+ 4, 16);
3575 memcpy(cc
->dcw
, buf
+ 4, 16);
3578 if(!cc
->extended_mode
) // additional crypto step
3580 cc_crypt(&cc
->block
[DECRYPT
], buf
+ 4, l
- 4, ENCRYPT
);
3583 if(is_null_dcw(cc
->dcw
))
3585 cs_log_dbg(D_READER
, "%s null dcw received! sid=%04X(%d)", getprefix(), srvid
.sid
, srvid
.ecmlen
);
3586 move_card_to_end(cl
, card
);
3587 add_sid_block(card
, &srvid
, true);
3589 cc_reset_pending(cl
, ecm_idx
);
3590 buf
[1] = MSG_CW_NOK2
; // So it's really handled like a nok!
3594 cs_log_dbg(D_READER
, "%s cws: %d %s", getprefix(), ecm_idx
,
3595 cs_hexdump(0, cc
->dcw
, 16, tmp_dbg
, sizeof(tmp_dbg
)));
3597 // check response time, if > fallbacktime, switch cards!
3600 int64_t cwlastresptime
= comp_timeb(&tpe
, &cc
->ecm_time
);
3602 if(cwlastresptime
> get_fallbacktimeout(card
->caid
) && !cc
->extended_mode
)
3604 cs_log_dbg(D_READER
, "%s card %04X is too slow, moving to the end...", getprefix(), card
->id
);
3605 move_card_to_end(cl
, card
);
3608 if(card
->rating
< MIN_RATING
)
3610 card
->rating
= MIN_RATING
;
3616 if(card
->rating
> MAX_RATING
)
3618 card
->rating
= MAX_RATING
;
3626 cs_log_dbg(D_READER
, "%s warning: ECM-CWS respond by CCCam server without current card!", getprefix());
3628 if(!cc
->extended_mode
)
3630 cc_cw_crypt(cl
, buf
+ 4, cccam_id
);
3631 cc_crypt_cmd0c(cl
, buf
+ 4, 16);
3633 memcpy(cc
->dcw
, buf
+ 4, 16);
3636 if(!cc
->extended_mode
) // additional crypto step
3638 cc_crypt(&cc
->block
[DECRYPT
], buf
+ 4, l
- 4, ENCRYPT
);
3641 cs_log_dbg(D_READER
, "%s cws: %d %s", getprefix(), ecm_idx
,
3642 cs_hexdump(0, cc
->dcw
, 16, tmp_dbg
, sizeof(tmp_dbg
)));
3645 cs_readunlock(__func__
, &cc
->cards_busy
);
3647 if(!cc
->extended_mode
)
3652 //cc_abort_user_ecms();
3653 cc_send_ecm(cl
, NULL
);
3665 #ifdef CS_CACHEEX_AIO
3666 if(!cl
->cacheex_aio_checked
&& ((cl
->account
&& cl
->account
->cacheex
.mode
> 0) || (cl
->reader
&& cl
->reader
->cacheex
.mode
> 0)))
3668 cc_cacheex_feature_request(cl
);
3669 cl
->cacheex_aio_checked
= 1;
3674 cl
->last
= time(NULL
);
3677 if(rdr
&& rdr
->cc_keepalive
)
3679 rdr
->last_g
= time(NULL
);
3680 rdr
->last_s
= time(NULL
);
3681 rdr_log_dbg(rdr
, D_READER
, "%s: receive keepalive", __func__
);
3684 cc
->just_logged_in
= 0;
3692 cc
->just_logged_in
= 0;
3693 l
= l
- 4; // Header Length = 4 bytes
3699 cs_log_dbg(D_READER
, "%s MSG_CMD_05 recvd, payload length=%d mode=%d",
3700 getprefix(), l
, cc
->cmd05_mode
);
3702 cc
->cmd05_active
= 1;
3703 cc
->cmd05_data_len
= l
;
3704 memcpy(&cc
->cmd05_data
, buf
+ 4, l
);
3706 if(!cc
->ecm_busy
&& ll_has_elements(cc
->cards
))
3708 send_cmd05_answer(cl
);
3721 // by Project: Keynation
3722 cs_log_dbg(D_READER
, "%s MSG_CMD_0B received (payload=%d)!", getprefix(), l
- 4);
3728 memcpy(aeskey
, cc
->cmd0b_aeskey
, 16);
3729 memset(&key
, 0, sizeof(key
));
3731 //cs_log_dump_dbg(D_READER, aeskey, 16, "%s CMD_0B AES key:", getprefix());
3732 //cs_log_dump_dbg(D_READER, data, 16, "%s CMD_0B received data:", getprefix());
3734 AES_set_encrypt_key((uint8_t *)&aeskey
, 128, &key
);
3735 AES_encrypt((uint8_t *)data
, (uint8_t *)&out
, &key
);
3737 cs_log_dbg(D_TRACE
, "%s sending CMD_0B! ", getprefix());
3738 //cs_log_dump_dbg(D_READER, out, 16, "%s CMD_0B out:", getprefix());
3739 cc_cmd_send(cl
, out
, 16, MSG_CMD_0B
);
3743 case MSG_CMD_0C
: // New CCCAM 2.2.0 Server/Client fake check!
3745 int32_t len
= l
- 4;
3751 if(cl
->typ
== 'c') // Only im comming from "client"
3753 cs_log_dbg(D_CLIENT
, "%s MSG_CMD_0C received (payload=%d)!", getprefix(), len
);
3755 uint8_t bytes
[0x20];
3756 if(len
< 0x20) // if less then 0x20 bytes, clear others
3758 memset(data
+ len
, 0, 0x20 - len
);
3761 // change first 0x10 bytes to the second
3762 memcpy(bytes
, data
+ 0x10, 0x10);
3763 memcpy(bytes
+ 0x10, data
, 0x10);
3767 for(i
= 0; i
< 0x20; i
++)
3769 bytes
[i
] ^= (data
[i
] & 0x7F);
3772 // key is now the 16bit hash of md5
3773 uint8_t md5hash
[0x10];
3774 MD5(data
, 0x20, md5hash
);
3775 memcpy(bytes
, md5hash
, 0x10);
3777 cs_log_dbg(D_CLIENT
, "%s sending CMD_0C! ", getprefix());
3778 //cs_log_dump_dbg(D_CLIENT, bytes, 0x20, "%s CMD_0C out:", getprefix());
3779 cc_cmd_send(cl
, bytes
, 0x20, MSG_CMD_0C
);
3783 // by Project: Keynation + Oscam team
3784 cc_crypt_cmd0c(cl
, data
, len
);
3786 uint8_t CMD_0x0C_Command
= data
[0];
3788 switch(CMD_0x0C_Command
)
3792 cc
->cmd0c_mode
= MODE_CMD_0x0C_RC6
;
3798 cc
->cmd0c_mode
= MODE_CMD_0x0C_RC4
;
3804 cc
->cmd0c_mode
= MODE_CMD_0x0C_CC_CRYPT
;
3810 cc
->cmd0c_mode
= MODE_CMD_0x0C_AES
;
3816 cc
->cmd0c_mode
= MODE_CMD_0x0C_IDEA
;
3822 cc
->cmd0c_mode
= MODE_CMD_0x0C_NONE
;
3826 set_cmd0c_cryptkey(cl
, data
, len
);
3828 cs_log_dbg(D_READER
, "%s received MSG_CMD_0C from server! CMD_0x0C_CMD=%d, MODE=%s",
3829 getprefix(), CMD_0x0C_Command
, cmd0c_mode_name
[cc
->cmd0c_mode
]);
3834 case MSG_CMD_0D
: // key update for the active cmd0x0c algo
3836 int32_t len
= l
- 4;
3842 if(cc
->cmd0c_mode
== MODE_CMD_0x0C_NONE
)
3847 cc_crypt_cmd0c(cl
, data
, len
);
3848 set_cmd0c_cryptkey(cl
, data
, len
);
3850 cs_log_dbg(D_READER
, "%s received MSG_CMD_0D from server! MODE=%s",
3851 getprefix(), cmd0c_mode_name
[cc
->cmd0c_mode
]);
3862 cs_log_dbg(D_READER
, "cccam 2.2.x commands not implemented: 0x%02X", buf
[1]);
3864 // Unkwon commands... need workout algo
3865 if(cl
->typ
== 'c') // client connection
3867 //switching to an oder version and then disconnect...
3868 cs_strncpy(cfg
.cc_version
, version
[0], sizeof(cfg
.cc_version
));
3871 else // reader connection
3873 cs_strncpy(cl
->reader
->cc_version
, version
[0], sizeof(cl
->reader
->cc_version
));
3874 cs_strncpy(cl
->reader
->cc_build
, build
[0], sizeof(cl
->reader
->cc_build
));
3875 cc_cycle_connection(cl
);
3882 cc
->just_logged_in
= 0;
3883 if(cl
->typ
== 'c') // EMM Request received
3885 cc_cmd_send(cl
, NULL
, 0, MSG_EMM_ACK
); // Send back ACK
3892 cs_log_dbg(D_EMM
, "%s EMM Request received!", getprefix());
3894 if(!ll_count(cl
->aureader_list
))
3896 cs_log_dbg( D_EMM
, "%s EMM Request discarded because au is not assigned to an reader!", getprefix());
3901 if(!cs_malloc(&emm
, sizeof(EMM_PACKET
)))
3906 emm
->caid
[0] = buf
[4];
3907 emm
->caid
[1] = buf
[5];
3908 emm
->provid
[0] = buf
[7];
3909 emm
->provid
[1] = buf
[8];
3910 emm
->provid
[2] = buf
[9];
3911 emm
->provid
[3] = buf
[10];
3912 //emm->hexserial[0] = buf[11];
3913 //emm->hexserial[1] = buf[12];
3914 //emm->hexserial[2] = buf[13];
3915 //emm->hexserial[3] = buf[14];
3919 emm
->emmlen
= buf
[15];
3923 emm
->emmlen
= MIN(l
- 16, (int32_t)sizeof(emm
->emm
));
3926 if(emm
->emmlen
< 0 || emm
->emmlen
> MAX_EMM_SIZE
|| emm
->emmlen
+ 16 > l
)
3932 memcpy(emm
->emm
, buf
+ 16, emm
->emmlen
);
3933 //emm->type = UNKNOWN;
3934 //emm->cidx = cs_idx;
3938 else // Our EMM Request Ack!
3940 cs_log_dbg(D_EMM
, "%s EMM ACK!", getprefix());
3941 if(!cc
->extended_mode
)
3945 cc_send_ecm(cl
, NULL
);
3952 //cs_log_dump_dbg(D_CLIENT, buf, l, "%s unhandled msg: %d len=%d", getprefix(), buf[1], l);
3957 if(cc
->max_ecms
&& (cc
->ecm_counter
> cc
->max_ecms
))
3959 cs_log_dbg(D_READER
, "%s max ecms (%d) reached, cycle connection!", getprefix(), cc
->max_ecms
);
3960 cc_cycle_connection(cl
);
3966 * Reader: write dcw to receive
3968 int32_t cc_recv_chk(struct s_client
*cl
, uint8_t *dcw
, int32_t *rc
, uint8_t *buf
, int32_t UNUSED(n
))
3970 struct cc_data
*cc
= cl
->cc
;
3972 if(buf
[1] == MSG_CW_ECM
3973 #ifdef CS_CACHEEX_AIO
3974 || buf
[1] == MSG_CW_ECM_LGF
3978 memcpy(dcw
, cc
->dcw
, 16);
3979 //cs_log_dbg(D_CLIENT, "cccam: recv chk - MSG_CW %d - %s", cc->recv_ecmtask,
3980 // cs_hexdump(0, dcw, 16, tmp_dbg, sizeof(tmp_dbg)));
3982 #ifdef CS_CACHEEX_AIO
3983 if(buf
[1] == MSG_CW_ECM_LGF
)
3986 return (cc
->recv_ecmtask
);
3988 else if((buf
[1] == (MSG_CW_NOK1
)) || (buf
[1] == (MSG_CW_NOK2
)))
3991 //if(cc->is_oscam_cccam)
3992 if(cfg
.cc_forward_origin_card
)
3994 return (cc
->recv_ecmtask
);
4005 //int32_t is_softfail(int32_t rc)
4007 // //see oscam.c send_dcw() for a full list
4010 // case 5: // 5 = timeout
4011 // case 6: // 6 = sleeping
4012 // case 7: // 7 = fake
4013 // case 10: // 10 = no card
4014 // case 11: // 11 = expdate
4015 // case 12: // 12 = disabled
4016 // case 13: // 13 = stopped
4017 // case 14: // 100 = unhandled
4024 * Server: send DCW to client
4026 void cc_send_dcw(struct s_client
*cl
, ECM_REQUEST
*er
)
4029 struct cc_data
*cc
= cl
->cc
;
4031 memset(buf
, 0, sizeof(buf
));
4033 struct cc_extended_ecm_idx
*eei
= get_extended_ecm_idx_by_idx(cl
, er
->idx
, 1);
4035 if(er
->rc
< E_NOTFOUND
&& eei
) // found
4037 memcpy(buf
, er
->cw
, sizeof(buf
));
4039 //cs_log_dbg(D_TRACE, "%s send cw: %s cpti: %d", getprefix(),
4040 // cs_hexdump(0, buf, 16, tmp_dbg, sizeof(tmp_dbg)), er->cpti);
4042 if(!cc
->extended_mode
)
4044 cc_cw_crypt(cl
, buf
, eei
->cccam_id
);
4048 cc
->g_flag
= eei
->send_idx
;
4051 #ifdef CS_CACHEEX_AIO
4053 if(cc
->extended_lg_flagged_cws
&& (er
->localgenerated
|| (er
->selected_reader
&& !is_network_reader(er
->selected_reader
))))
4055 cc_cmd_send(cl
, buf
, 16, MSG_CW_ECM_LGF
);
4060 cc_cmd_send(cl
, buf
, 16, MSG_CW_ECM
);
4061 #ifdef CS_CACHEEX_AIO
4065 if(!cc
->extended_mode
)
4067 cc_crypt(&cc
->block
[ENCRYPT
], buf
, 16, ENCRYPT
); // additional crypto step
4072 //cs_log_dbg(D_TRACE, "%s send cw: NOK cpti: %d", getprefix(), er->cpti);
4074 if(eei
&& cc
->extended_mode
)
4076 cc
->g_flag
= eei
->send_idx
;
4079 int32_t nok
, bufsize
= 0;
4080 if(cc
->sleepsend
&& er
->rc
== E_STOPPED
)
4082 buf
[0] = cl
->c35_sleepsend
;
4084 nok
= MSG_SLEEPSEND
;
4086 else if(!eei
|| !eei
->card
)
4088 nok
= MSG_CW_NOK1
; // share no more available
4092 if(cfg
.cc_forward_origin_card
&& er
->origin_card
== eei
->card
)
4094 nok
= (er
->rcEx
== E2_CCCAM_NOK1
) ? MSG_CW_NOK1
: MSG_CW_NOK2
;
4098 nok
= MSG_CW_NOK2
; // can't decode
4101 cc_cmd_send(cl
, buf
, bufsize
, nok
);
4103 cc
->server_ecm_pending
--;
4107 NULLFREE(eei
->card
);
4112 int32_t cc_recv(struct s_client
*cl
, uint8_t *buf
, int32_t l
)
4115 struct s_reader
*rdr
= (cl
->typ
== 'c') ? NULL
: cl
->reader
;
4117 if(buf
== NULL
|| l
<= 0)
4122 n
= cc_msg_recv(cl
, buf
, l
); // recv and decrypt msg
4123 //cs_log_dump_dbg(D_CLIENT, buf, n, "cccam: received %d bytes from %s", n, remote_txt());
4127 struct cc_data
*cc
= cl
->cc
;
4128 if(cc
&& cc
->nok_message
)
4130 cs_log_dbg(D_CLIENT
, "%s connection closed by %s. n=%d, Reason: %s",
4131 getprefix(), remote_txt(), n
, cc
->nok_message
);
4135 cs_log_dbg(D_CLIENT
, "%s connection closed by %s, n=%d.", getprefix(), remote_txt(), n
);
4138 cc_cli_close(cl
, 1);
4142 //cs_writelock(__func__, &cc->cards_busy); maybe uninitialized
4143 cs_disconnect_client(cl
);
4144 //cs_writeunlock(__func__, &cc->cards_busy);
4156 cs_log("%s packet is too small (%d bytes)", getprefix(), n
);
4159 else if(n
> CC_MAXMSGSIZE
)
4161 cs_log("%s packet is too big (%d bytes, max: %d)", getprefix(), n
, CC_MAXMSGSIZE
);
4166 // parse it and write it back, if we have received something of value
4167 n
= cc_parse_msg(cl
, buf
, n
);
4168 if(n
== MSG_CW_ECM
|| n
== MSG_EMM_ACK
4169 #ifdef CS_CACHEEX_AIO
4170 || n
== MSG_CW_ECM_LGF
4174 cl
->last
= time(NULL
); // last client action is now
4177 rdr
->last_g
= time(NULL
); // last reader receive is now
4186 cc_cli_close(cl
, 1);
4193 void cc_init_locks(struct cc_data
*cc
)
4195 cs_lock_create(__func__
, &cc
->lockcmd
, "lockcmd", 5000);
4196 cs_lock_create(__func__
, &cc
->cards_busy
, "cards_busy", 10000);
4199 #ifdef MODULE_CCCSHARE
4201 * Starting readers to get cards
4203 int32_t cc_srv_wakeup_readers(struct s_client
*cl
)
4206 struct s_reader
*rdr
;
4207 struct s_client
*client
;
4209 for(rdr
= first_active_reader
; rdr
; rdr
= rdr
->next
)
4211 if(rdr
->typ
!= R_CCCAM
)
4216 if(rdr
->tcp_connected
== 2)
4221 if(!(rdr
->grp
& cl
->grp
))
4226 // if reader has keepalive but is NOT connected,
4227 // reader can't connect. so don't ask him
4228 if(rdr
->cc_keepalive
)
4233 // reader is in shutdown
4234 if((client
= rdr
->client
) == NULL
|| (client
->cc
) == NULL
|| client
->kill
)
4239 // reader cannot be waked up currently because its blocked
4240 if(is_connect_blocked(rdr
))
4245 // This wakeups the reader:
4246 add_job(rdr
->client
, ACTION_READER_CARDINFO
, NULL
, 0);
4253 int32_t cc_srv_connect(struct s_client
*cl
)
4255 int32_t i
, ccversion_pos
, ccbuild_pos
;
4256 int32_t no_delay
= 1;
4258 char usr
[21], pwd
[65], tmp_dbg
[17];
4259 struct s_auth
*account
;
4262 if(!cs_malloc(&cc
, sizeof(struct cc_data
)))
4267 memset(usr
, 0, sizeof(usr
));
4268 memset(pwd
, 0, sizeof(pwd
));
4270 // init internals data struct
4272 cc
->extended_ecm_idx
= ll_create("extended_ecm_idx");
4275 uint8_t *buf
= cc
->send_buffer
;
4277 cc
->server_ecm_pending
= 0;
4278 cc
->extended_mode
= 0;
4281 int32_t keep_alive
= 1;
4282 setsockopt(cl
->udp_fd
, SOL_SOCKET
, SO_KEEPALIVE
, (void *)&keep_alive
, sizeof(keep_alive
));
4284 // Create checksum for "O" cccam
4285 get_random_bytes(data
, 12);
4286 for(i
= 0; i
< 4; i
++)
4288 data
[12 + i
] = (data
[i
] + data
[4 + i
] + data
[8 + i
]) & 0xff;
4291 cs_log_dbg(D_TRACE
, "send ccc checksum");
4293 send(cl
->udp_fd
, data
, 16, 0);
4295 cc_xor(data
); // XOR init bytes with 'CCcam'
4299 SHA1_Update(&ctx
, data
, 16);
4300 SHA1_Final(buf
, &ctx
);
4302 cc_init_crypt(&cc
->block
[ENCRYPT
], buf
, 20);
4303 cc_crypt(&cc
->block
[ENCRYPT
], data
, 16, DECRYPT
);
4304 cc_init_crypt(&cc
->block
[DECRYPT
], data
, 16);
4305 cc_crypt(&cc
->block
[DECRYPT
], buf
, 20, DECRYPT
);
4307 cs_log_dbg(D_TRACE
, "receive ccc checksum");
4309 if(cc_recv_to(cl
, buf
, 20) == 20)
4311 //cs_log_dump_dbg(D_CLIENT, buf, 20, "cccam: recv:");
4312 cc_crypt(&cc
->block
[DECRYPT
], buf
, 20, DECRYPT
);
4313 //cs_log_dump_dbg(D_CLIENT, buf, 20, "cccam: hash:");
4321 memset(buf
, 0, CC_MAXMSGSIZE
);
4322 i
= cc_recv_to(cl
, buf
, 20);
4323 if(i
< 0) // errors during receive!
4330 cc_crypt(&cc
->block
[DECRYPT
], buf
, 20, DECRYPT
);
4331 cs_strncpy(usr
, (char *)buf
, sizeof(usr
));
4333 // test for non printable characters
4334 for(i
= 0; i
< 20; i
++)
4336 if(usr
[i
] > 0 && usr
[i
] < 0x20) // found non printable char
4338 cs_log("illegal username received");
4342 //cs_log_dump_dbg(D_CLIENT, buf, 20, "cccam: username '%s':", usr);
4346 cs_add_violation(cl
, NULL
);
4349 cs_log_dbg(D_TRACE
, "ccc username received %s", usr
);
4353 // CCCam only supports len=20 usr/pass. So we could have
4354 // more than one user that matches the first 20 chars.
4356 // receive password-CCCam encrypted Hash:
4357 i
= cc_recv_to(cl
, buf
, 6);
4359 if(i
< 0) // errors during receive!
4364 if(i
!= 6) // received invalid password length
4366 cs_add_violation(cl
, usr
);
4370 cs_log_dbg(D_TRACE
, "ccc passwdhash received %s", usr
);
4372 account
= cfg
.account
;
4373 struct cc_crypt_block
*save_block
;
4374 if(!cs_malloc(&save_block
, sizeof(struct cc_crypt_block
)))
4379 memcpy(save_block
, cc
->block
, sizeof(struct cc_crypt_block
));
4386 if(strncmp(usr
, account
->usr
, 20) == 0)
4388 memset(pwd
, 0, sizeof(pwd
));
4389 cs_strncpy(pwd
, account
->pwd
, sizeof(pwd
));
4393 account
= account
->next
;
4401 // receive passwd / 'CCcam'
4402 memcpy(cc
->block
, save_block
, sizeof(struct cc_crypt_block
));
4403 cc_crypt(&cc
->block
[DECRYPT
], (uint8_t *) pwd
, cs_strlen(pwd
), ENCRYPT
);
4404 cc_crypt(&cc
->block
[DECRYPT
], buf
, 6, DECRYPT
);
4406 // illegal buf-bytes could kill the logger!
4407 //cs_log_dump_dbg(D_CLIENT, buf, 6, "cccam: pwd check '%s':", buf);
4409 if(memcmp(buf
, "CCcam\0", 6) == 0) // Password Hash OK!
4411 break; // account is set
4414 account
= account
->next
;
4416 NULLFREE(save_block
);
4418 // cs_auth_client returns 0 if account is valid/active/accessible
4419 if(cs_auth_client(cl
, account
, NULL
))
4423 cs_log("account '%s' not found!", usr
);
4427 cs_log("password for '%s' invalid!", usr
);
4430 cs_add_violation(cl
, usr
);
4436 cs_log("account '%s' duplicate login, disconnect!", usr
);
4442 cs_log("account '%s' disabled, blocking+disconnect!", usr
);
4443 cs_add_violation(cl
, usr
);
4447 if(account
->cccmaxhops
< -1)
4449 cs_log("account '%s' has cccmaxhops < -1, cccam can't handle this, disconnect!", usr
);
4453 cs_log_dbg(D_TRACE
, "ccc user authenticated %s", usr
);
4455 if(account
->cccmaxhops
== -1)
4457 cs_log("account '%s' has cccmaxhops = -1: user will not see any card!", usr
);
4460 if(!cs_malloc(&cc
->prefix
, cs_strlen(cl
->account
->usr
) + 20))
4464 snprintf(cc
->prefix
, cs_strlen(cl
->account
->usr
) + 20, "cccam(s) %s:", cl
->account
->usr
);
4467 if(cl
->account
->cacheex
.mode
< 2)
4469 if(cl
->tcp_nodelay
== 0)
4471 setsockopt(cl
->udp_fd
, IPPROTO_TCP
, TCP_NODELAY
, (void *)&no_delay
, sizeof(no_delay
));
4472 cl
->tcp_nodelay
= 1;
4475 // Starting readers to get cards
4476 cc_srv_wakeup_readers(cl
);
4480 memcpy(buf
, "CCcam\0", 6);
4481 cs_log_dump_dbg(D_CLIENT
, buf
, 20, "cccam: send ack:");
4482 cc_crypt(&cc
->block
[ENCRYPT
], buf
, 20, ENCRYPT
);
4483 send(cl
->pfd
, buf
, 20, 0);
4486 memset(buf
, 0, CC_MAXMSGSIZE
);
4487 i
= cc_msg_recv(cl
, buf
, CC_MAXMSGSIZE
- 1);
4493 cs_log_dump_dbg(D_CLIENT
, buf
, i
, "cccam: cli data:");
4497 cs_log_dbg(D_CLIENT
, "cccam: cli data too small");
4501 memcpy(cc
->peer_node_id
, buf
+ 24, 8);
4502 //chk_peer_node_for_oscam(cc);
4505 while(ccversion_pos
+ 1 < i
&& ccversion_pos
< 33 + 5 && buf
[ccversion_pos
] == 0)
4511 while(ccbuild_pos
+ 1 < i
&& ccbuild_pos
< 65 + 5 && buf
[ccbuild_pos
] == 0)
4516 cs_strncpy(cc
->remote_version
, (char *)buf
+ ccversion_pos
, sizeof(cc
->remote_version
));
4517 cs_strncpy(cc
->remote_build
, (char *)buf
+ ccbuild_pos
, sizeof(cc
->remote_build
));
4519 cs_log_dbg(D_CLIENT
, "%s client '%s' (%s) running v%s (%s)", getprefix(), buf
+ 4,
4520 cs_hexdump(0, cc
->peer_node_id
, 8, tmp_dbg
, sizeof(tmp_dbg
)), cc
->remote_version
, cc
->remote_build
);
4522 // send cli data ack
4523 cc_cmd_send(cl
, NULL
, 0, MSG_CLI_DATA
);
4525 cs_log_dbg(D_TRACE
, "ccc send srv_data %s", usr
);
4526 if(cc_send_srv_data(cl
) < 0)
4531 cc
->cccam220
= check_cccam_compat(cc
);
4532 cc
->just_logged_in
= 1;
4534 // Wait for Partner detection (NOK1 with data) before reporting cards
4535 // When Partner is detected, cccam220=1 is set. then we can report extended card data
4536 i
= process_input(buf
, CC_MAXMSGSIZE
, 1);
4538 if(i
<= 0 && i
!= -9) // disconnected
4545 cs_log_dbg(D_CLIENT
, "%s extended sid mode activated", getprefix());
4549 cs_log_dbg(D_CLIENT
, "%s 2.1.x compatibility mode", getprefix());
4552 cs_log_dbg(D_TRACE
, "ccc send cards %s", usr
);
4554 if(!cc_srv_report_cards(cl
))
4558 cs_ftime(&cc
->ecm_time
);
4560 // some clients, e.g. mgcamd, do not support keepalive. So if not answered, keep
4561 // connection check for client timeout. If timeout occurs try to send keepalive
4562 cs_log_dbg(D_TRACE
, "ccc connected and waiting for data %s", usr
);
4566 void cc_srv_init2(struct s_client
*cl
)
4568 if(!cl
->init_done
&& !cl
->kill
)
4570 if(IP_ISSET(cl
->ip
))
4572 cs_log_dbg(D_CLIENT
, "cccam: new connection from %s", cs_inet_ntoa(cl
->ip
));
4575 cl
->pfd
= cl
->udp_fd
;
4577 if((ret
= cc_srv_connect(cl
)) < 0)
4581 cs_log_dbg(D_CLIENT
, "cccam: failed errno: %d (%s)", errno
, strerror(errno
));
4585 cs_log_dbg(D_CLIENT
, "cccam: failed ret: %d", ret
);
4587 cs_disconnect_client(cl
);
4592 cc_cacheex_filter_out(cl
);
4593 #ifdef CS_CACHEEX_AIO
4594 if((cl
->account
&& cl
->account
->cacheex
.mode
> 0) || (cl
->reader
&& cl
->reader
->cacheex
.mode
> 0))
4595 cc_cacheex_feature_request(cl
);
4602 void *cc_srv_init(struct s_client
*cl
, uint8_t *UNUSED(mbuf
), int32_t UNUSED(len
))
4609 int32_t cc_cli_connect(struct s_client
*cl
)
4611 struct s_reader
*rdr
= cl
->reader
;
4612 struct cc_data
*cc
= cl
->cc
;
4613 rdr
->card_status
= CARD_FAILURE
;
4618 // init internals data struct
4619 if(!cs_malloc(&cc
, sizeof(struct cc_data
)))
4625 cc
->cards
= ll_create("cards");
4627 cc
->pending_emms
= ll_create("pending_emms");
4628 cc
->extended_ecm_idx
= ll_create("extended_ecm_idx");
4632 cc_free_cardlist(cc
->cards
, 0);
4633 free_extended_ecm_idx(cc
);
4638 if(!cs_malloc(&cc
->prefix
, cs_strlen(cl
->reader
->label
) + 20))
4643 snprintf(cc
->prefix
, cs_strlen(cl
->reader
->label
) + 20, "cccam(r) %s:", cl
->reader
->label
);
4647 uint8_t hash
[SHA_DIGEST_LENGTH
];
4648 uint8_t *buf
= cc
->send_buffer
;
4651 // check cred config
4652 if(rdr
->device
[0] == 0 || rdr
->r_pwd
[0] == 0 || rdr
->r_usr
[0] == 0 || rdr
->r_port
== 0)
4654 cs_log("%s configuration error!", rdr
->label
);
4659 handle
= network_tcp_connection_open(rdr
);
4662 cs_log_dbg(D_READER
, "%s network connect error!", rdr
->label
);
4666 if(errno
== EISCONN
)
4668 cc_cli_close(cl
, 0);
4673 int32_t no_delay
= 1;
4674 if(cacheex_get_rdr_mode(rdr
) < 2)
4676 setsockopt(cl
->udp_fd
, IPPROTO_TCP
, TCP_NODELAY
, (void *)&no_delay
, sizeof(no_delay
));
4680 if((n
= cc_recv_to(cl
, data
, 16)) != 16)
4684 cs_log("init error from reader %s", rdr
->label
);
4688 cs_log("%s server returned %d instead of 16 bytes as init seed (errno=%d %s)",
4689 rdr
->label
, n
, errno
, strerror(errno
));
4692 cc_cli_close(cl
, 0);
4697 cc
->ecm_counter
= 0;
4699 cc
->cmd05_mode
= MODE_UNKNOWN
;
4700 cc
->cmd05_offset
= 0;
4701 cc
->cmd05_active
= 0;
4702 cc
->cmd05_data_len
= 0;
4703 cc
->extended_mode
= 0;
4704 cc
->last_emm_card
= NULL
;
4708 cc
->num_reshare0
= 0;
4709 cc
->num_reshare1
= 0;
4710 cc
->num_reshare2
= 0;
4711 cc
->num_resharex
= 0;
4712 memset(&cc
->cmd05_data
, 0, sizeof(cc
->cmd05_data
));
4713 memset(&cc
->receive_buffer
, 0, sizeof(cc
->receive_buffer
));
4714 NULLFREE(cc
->nok_message
);
4715 cc
->cmd0c_mode
= MODE_CMD_0x0C_NONE
;
4717 cs_log_dump_dbg(D_CLIENT
, data
, 16, "cccam: server init seed:");
4719 uint16_t sum
= 0x1234;
4720 uint16_t recv_sum
= (data
[14] << 8) | data
[15];
4723 for(i
= 0; i
< 14; i
++)
4728 // create special data to detect oscam-cccam
4729 cc
->is_oscam_cccam
= sum
== recv_sum
;
4731 // detect multics seed
4732 uint8_t a
= (data
[0] ^ 'M') + data
[1] + data
[2];
4733 uint8_t b
= data
[4] + (data
[5] ^ 'C') + data
[6];
4734 uint8_t c
= data
[8] + data
[9] + (data
[10] ^ 'S');
4736 if((a
== data
[3]) && (b
== data
[7]) && (c
== data
[11]))
4738 cc
->multics_mode
= 1; // detected multics seed
4739 cs_log_dbg(D_READER
, "multics seed detected: %s", rdr
->label
);
4742 cc_xor(data
); // XOR init bytes with 'CCcam'
4746 SHA1_Update(&ctx
, data
, 16);
4747 SHA1_Final(hash
, &ctx
);
4749 cs_log_dump_dbg(D_CLIENT
, hash
, sizeof(hash
), "cccam: sha1 hash:");
4751 // initialisate crypto states
4752 cc_init_crypt(&cc
->block
[DECRYPT
], hash
, 20);
4753 cc_crypt(&cc
->block
[DECRYPT
], data
, 16, DECRYPT
);
4754 cc_init_crypt(&cc
->block
[ENCRYPT
], data
, 16);
4755 cc_crypt(&cc
->block
[ENCRYPT
], hash
, 20, DECRYPT
);
4757 cc_cmd_send(cl
, hash
, 20, MSG_NO_HEADER
); // send crypted hash to server
4759 memset(buf
, 0, CC_MAXMSGSIZE
);
4760 memcpy(buf
, rdr
->r_usr
, cs_strlen(rdr
->r_usr
));
4761 cs_log_dump_dbg(D_CLIENT
, buf
, 20, "cccam: username '%s':", buf
);
4762 cc_cmd_send(cl
, buf
, 20, MSG_NO_HEADER
); // send usr '0' padded -> 20 bytes
4764 memset(buf
, 0, CC_MAXMSGSIZE
);
4765 memset(pwd
, 0, sizeof(pwd
));
4767 //cs_log_dbg(D_CLIENT, "cccam: 'CCcam' xor");
4768 memcpy(buf
, "CCcam", 5);
4769 cs_strncpy(pwd
, rdr
->r_pwd
, sizeof(pwd
));
4770 cc_crypt(&cc
->block
[ENCRYPT
], (uint8_t *)pwd
, cs_strlen(pwd
), ENCRYPT
);
4771 cc_cmd_send(cl
, buf
, 6, MSG_NO_HEADER
); // send 'CCcam' xor w/ pwd
4773 if((cc_recv_to(cl
, data
, 20)) != 20)
4775 cs_log("%s login failed, usr/pwd invalid", getprefix());
4776 cc_cli_close(cl
, 0);
4781 cc_crypt(&cc
->block
[DECRYPT
], data
, 20, DECRYPT
);
4782 cs_log_dump_dbg(D_CLIENT
, data
, 20, "cccam: login data");
4784 if(memcmp(data
, buf
, 5)) // check server response
4786 cs_log("%s login failed, usr/pwd invalid", getprefix());
4787 cc_cli_close(cl
, 0);
4793 cs_log_dbg(D_READER
, "%s login succeeded", getprefix());
4796 cs_log_dbg(D_READER
, "cccam: last_s=%ld, last_g=%ld", rdr
->last_s
, rdr
->last_g
);
4798 cl
->pfd
= cl
->udp_fd
;
4799 cs_log_dbg(D_READER
, "cccam: pfd=%d", cl
->pfd
);
4801 if(cc_send_cli_data(cl
) <= 0)
4803 cs_log("%s login failed, could not send client data", getprefix());
4804 cc_cli_close(cl
, 0);
4811 rdr
->caid
= rdr
->ftab
.filts
[0].caid
;
4812 rdr
->nprov
= rdr
->ftab
.filts
[0].nprids
;
4814 for(n
= 0; n
< rdr
->nprov
; n
++)
4816 rdr
->prid
[n
][0] = rdr
->ftab
.filts
[0].prids
[n
] >> 24;
4817 rdr
->prid
[n
][1] = rdr
->ftab
.filts
[0].prids
[n
] >> 16;
4818 rdr
->prid
[n
][2] = rdr
->ftab
.filts
[0].prids
[n
] >> 8;
4819 rdr
->prid
[n
][3] = rdr
->ftab
.filts
[0].prids
[n
] & 0xff;
4823 rdr
->card_status
= CARD_NEED_INIT
;
4824 rdr
->last_g
= rdr
->last_s
= time((time_t *) 0);
4825 rdr
->tcp_connected
= 1;
4827 cc
->just_logged_in
= 1;
4831 #ifdef CS_CACHEEX_AIO
4832 if(cacheex_get_rdr_mode(rdr
) > 0)
4836 cc_cacheex_filter_out(cl
);
4838 #ifdef CS_CACHEEX_AIO
4839 cc_cacheex_feature_request(cl
);
4846 int32_t cc_cli_init_int(struct s_client
*cl
)
4848 struct s_reader
*rdr
= cl
->reader
;
4850 if(rdr
->tcp_connected
)
4855 if(rdr
->tcp_ito
< 15 && rdr
->tcp_ito
!=-1)
4860 if(rdr
->cc_maxhops
< 0)
4862 rdr
->cc_maxhops
= DEFAULT_CC_MAXHOPS
;
4865 if(rdr
->tcp_rto
< 1) // timeout to 30s
4870 cs_log_dbg(D_READER
, "cccam: inactivity timeout: %d seconds, receive timeout: %d seconds",
4871 rdr
->tcp_ito
, rdr
->tcp_rto
);
4873 cc_check_version(rdr
->cc_version
, rdr
->cc_build
);
4875 cs_log_dbg(D_READER
, "proxy reader: %s (%s:%d) cccam v%s build %s, maxhops: %d",
4876 rdr
->label
, rdr
->device
, rdr
->r_port
, rdr
->cc_version
, rdr
->cc_build
, rdr
->cc_maxhops
);
4881 int32_t cc_cli_init(struct s_client
*cl
)
4883 struct s_reader
*reader
= cl
->reader
;
4884 int32_t res
= cc_cli_init_int(cl
); // Create socket
4886 if(res
== 0 && reader
&& (reader
->cc_keepalive
|| !cl
->cc
) && !reader
->tcp_connected
)
4888 cc_cli_connect(cl
); // connect to remote server
4890 //while(!reader->tcp_connected && reader->cc_keepalive && cfg.reader_restart_seconds > 0)
4892 // if((cc && cc->mode == CCCAM_MODE_SHUTDOWN))
4897 // if(!reader->tcp_connected)
4899 // cc_cli_close(cl, 0);
4900 // res = cc_cli_init_int(cl);
4907 // cs_log_dbg(D_READER, "%s restarting reader in %d seconds", reader->label, cfg.reader_restart_seconds);
4908 // cs_sleepms(cfg.reader_restart_seconds*1000);
4909 // cs_log_dbg(D_READER, "%s restarting reader...", reader->label);
4910 // cc_cli_connect(cl);
4917 * return 1 if we are able to send requests:
4919 int32_t cc_available(struct s_reader
*rdr
, int32_t checktype
, ECM_REQUEST
*er
)
4921 if(!rdr
|| !rdr
->client
)
4926 struct s_client
*cl
= rdr
->client
;
4932 struct cc_data
*cc
= cl
->cc
;
4933 if(er
&& cc
&& rdr
->tcp_connected
)
4935 struct cc_card
*card
= get_matching_card(cl
, er
, 1);
4941 //cs_log_dbg(D_TRACE, "checking reader %s availibility", rdr->label);
4943 if(!cc
|| rdr
->tcp_connected
!= 2)
4946 // 1. Keepalive ON but not connected: Do NOT send requests,
4947 // because we can't connect - problem of full running pipes
4948 // 2. Keepalive OFF but not connected: Send requests to connect
4949 // pipe won't run full, because we are reading from pipe to
4950 // get the ecm request
4952 if(rdr
->cc_keepalive
)
4958 //if(er && er->ecmlen > 255 && cc && !cc->extended_mode && (cc->remote_build_nr < 3367))
4960 // return 0; // remote does not support large ecms!
4963 if(checktype
== AVAIL_CHECK_LOADBALANCE
&& cc
&& cc
->ecm_busy
)
4965 if(cc_request_timeout(cl
))
4967 cc_cycle_connection(cl
);
4970 if(!rdr
->tcp_connected
|| cc
->ecm_busy
)
4972 cs_log_dbg(D_TRACE
, "checking reader %s availibility=0 (unavail)", rdr
->label
);
4973 return 0; // We are processing EMMs/ECMs
4983 void cc_card_info(void)
4985 struct s_client
*cl
= cur_client();
4986 struct s_reader
*rdr
= cl
->reader
;
4988 if(rdr
&& !rdr
->tcp_connected
)
4994 void cc_cleanup(struct s_client
*cl
)
4998 cc_cli_close(cl
, 1); // we need to close open fd's
5003 void cc_update_nodeid(void)
5005 if(array_has_nonzero_byte(cfg
.cc_fixed_nodeid
, sizeof(cfg
.cc_fixed_nodeid
)))
5007 memcpy(cc_node_id
, cfg
.cc_fixed_nodeid
, 8);
5011 // Partner Detection
5012 uint16_t sum
= 0x1234; // This is our checksum
5014 get_random_bytes(cc_node_id
, 4);
5016 for(i
= 0; i
< 4; i
++)
5018 sum
+= cc_node_id
[i
];
5022 cc_node_id
[4] = 0x10; // (Oscam 0x10, vPlugServer 0x11, Hadu 0x12, ...)
5023 sum
+= cc_node_id
[4];
5025 // generate checksum for Partner ID:
5026 cc_node_id
[5] = 0xAA;
5028 for(i
= 0; i
< 5; i
++)
5030 cc_node_id
[5] ^= cc_node_id
[i
];
5032 sum
+= cc_node_id
[5];
5034 cc_node_id
[6] = sum
>> 8;
5035 cc_node_id
[7] = sum
& 0xff;
5037 memcpy(cfg
.cc_fixed_nodeid
, cc_node_id
, 8);
5040 bool cccam_forward_origin_card(ECM_REQUEST
*er
)
5042 if(cfg
.cc_forward_origin_card
&& er
->origin_card
)
5044 struct cc_card
*card
= er
->origin_card
;
5045 struct s_ecm_answer
*eab
= NULL
;
5046 struct s_ecm_answer
*ea
;
5048 for(ea
= er
->matching_rdr
; ea
; ea
= ea
->next
)
5050 ea
->status
&= ~(READER_ACTIVE
| READER_FALLBACK
);
5051 if(card
->origin_reader
== ea
->reader
)
5059 cs_log_dbg(D_LB
, "loadbalancer: forward card: forced by card %d to reader %s",
5060 card
->id
, eab
->reader
->label
);
5062 eab
->status
|= READER_ACTIVE
;
5070 bool cccam_snprintf_cards_stat(struct s_client
*cl
, char *emmtext
, size_t emmtext_sz
)
5072 struct cc_data
*rcc
= cl
->cc
;
5075 LLIST
*cards
= rcc
->cards
;
5078 int32_t ncards
= ll_count(cards
);
5079 int32_t locals
= rcc
->num_hop1
;
5080 snprintf(emmtext
, emmtext_sz
, " %3d/%3d card%s", locals
, ncards
, ncards
> 1 ? "s " : " ");
5087 bool cccam_client_extended_mode(struct s_client
*cl
)
5089 return cl
&& cl
->cc
&& ((struct cc_data
*)cl
->cc
)->extended_mode
;
5092 bool cccam_client_multics_mode(struct s_client
*cl
)
5094 return cl
&& cl
->cc
&& ((struct cc_data
*)cl
->cc
)->multics_mode
== 2;
5097 void module_cccam(struct s_module
*ph
)
5100 ph
->type
= MOD_CONN_TCP
;
5101 ph
->large_ecm_support
= 1;
5102 ph
->listenertype
= LIS_CCCAM
;
5105 ph
->cleanup
= cc_cleanup
;
5107 ph
->c_init
= cc_cli_init
;
5108 ph
->c_idle
= cc_idle
;
5109 ph
->c_recv_chk
= cc_recv_chk
;
5110 ph
->c_send_ecm
= cc_send_ecm
;
5111 ph
->c_send_emm
= cc_send_emm
;
5112 #ifdef MODULE_CCCSHARE
5113 IP_ASSIGN(ph
->s_ip
, cfg
.cc_srvip
);
5114 ph
->s_handler
= cc_srv_init
;
5115 ph
->s_init
= cc_srv_init2
;
5116 ph
->s_idle
= cc_s_idle
;
5117 ph
->send_dcw
= cc_send_dcw
;
5119 ph
->c_available
= cc_available
;
5120 ph
->c_card_info
= cc_card_info
;
5121 cc_cacheex_module_init(ph
);
5124 #ifdef MODULE_CCCSHARE
5126 for(i
= 0; i
< CS_MAXPORTS
; i
++)
5132 ph
->ptab
.ports
[i
].s_port
= cfg
.cc_port
[i
];