Changeset 37742
- Timestamp:
- 07/06/16 23:30:37 (8 years ago)
- Location:
- titan/titan
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
titan/titan/ca.h
r37741 r37742 761 761 { 762 762 case 0x01: ci_ccmgr_cc_open_cnf(dvbnode, sessionnr); break; 763 case 0x03: ci_ccmgr_cc_data_req(dvbnode, sessionnr, ( constuint8_t*)data, len); break;764 // case 0x05: ci_ccmgr_cc_sync_req(); break;765 // case 0x07: ci_ccmgr_cc_sac_data_req(dvbnode, sessionnr, (constuint8_t*)data, len); break;766 // case 0x09: ci_ccmgr_cc_sac_sync_req(dvbnode, sessionnr, (constuint8_t*)data, len); break;763 case 0x03: ci_ccmgr_cc_data_req(dvbnode, sessionnr, (uint8_t*)data, len); break; 764 case 0x05: ci_ccmgr_cc_sync_req(dvbnode, sessionnr); break; 765 case 0x07: ci_ccmgr_cc_sac_data_req(dvbnode, sessionnr, (uint8_t*)data, len); break; 766 case 0x09: ci_ccmgr_cc_sac_sync_req(dvbnode, sessionnr, (uint8_t*)data, len); break; 767 767 default: 768 768 debug(620, "unknown APDU tag 9F 80 %02x\n", tag[2]); … … 3757 3757 3758 3758 //bool eDVBCIContentControlManagerSession::ci_ccmgr_cc_data_req(tSlot *tslot, const uint8_t *data, unsigned int len) 3759 int ci_ccmgr_cc_data_req(struct dvbdev* dvbnode, int sessionnr, constuint8_t *data, unsigned int len)3759 int ci_ccmgr_cc_data_req(struct dvbdev* dvbnode, int sessionnr, uint8_t *data, unsigned int len) 3760 3760 { 3761 3761 // struct cc_ctrl_data *cc_data = (struct cc_ctrl_data*)(tslot->private_data); … … 3801 3801 } 3802 3802 3803 void ci_ccmgr_cc_sync_req(struct dvbdev* dvbnode, int sessionnr) 3804 { 3805 uint8_t tag[3] = { 0x9f, 0x90, 0x06 }; 3806 uint8_t sync_req_status = 0x00; /* OK */ 3807 3808 printf("%s -> %s\n", FILENAME, __FUNCTION__); 3809 sendAPDU(dvbnode, sessionnr, tag, &sync_req_status, 1); 3810 } 3811 3812 //bool eDVBCIContentControlManagerSession::ci_ccmgr_cc_sac_data_req(tSlot *tslot, const uint8_t *data, unsigned int len) 3813 int ci_ccmgr_cc_sac_data_req(struct dvbdev* dvbnode, int sessionnr, uint8_t *data, unsigned int len) 3814 { 3815 // struct cc_ctrl_data *cc_data = (struct cc_ctrl_data*)(tslot->private_data); 3816 struct cc_ctrl_data *cc_data = (struct cc_ctrl_data*)(dvbnode->caslot->private_data); 3817 uint8_t data_cnf_tag[3] = { 0x9f, 0x90, 0x08 }; 3818 uint8_t dest[2048]; 3819 uint8_t tmp[len]; 3820 int id_bitmask, dt_nr; 3821 unsigned int serial; 3822 int answ_len; 3823 int pos = 0; 3824 unsigned int rp = 0; 3825 printf("%s -> %s\n", FILENAME, __FUNCTION__); 3826 3827 if (len < 10) 3828 return 0; 3829 3830 memcpy(tmp, data, 8); 3831 sac_crypt(&tmp[8], &data[8], len - 8, cc_data->sek, AES_DECRYPT); 3832 data = tmp; 3833 #if y_debug 3834 printf("decryted > "); 3835 for (unsigned int i = 0; i < len; i++) 3836 printf("%02x ", data[i]); 3837 printf("\n"); 3803 3838 #endif 3839 if (!sac_check_auth(data, len, cc_data->sak)) { 3840 fprintf(stderr, "check_auth of message failed\n"); 3841 return 0; 3842 } 3843 3844 serial = UINT32(&data[rp], 4); 3845 3846 /* skip serial & header */ 3847 rp += 8; 3848 3849 id_bitmask = data[rp++]; 3850 3851 /* handle data loop */ 3852 dt_nr = data[rp++]; 3853 rp += data_get_loop(cc_data, &data[rp], len - rp, dt_nr); 3854 3855 if (len < rp + 1) 3856 return 0; 3857 3858 dt_nr = data[rp++]; 3859 3860 /* create answer */ 3861 pos += BYTE32(&dest[pos], serial); 3862 pos += BYTE32(&dest[pos], 0x01000000); 3863 3864 dest[pos++] = id_bitmask; 3865 dest[pos++] = dt_nr; /* dt_nbr */ 3866 3867 answ_len = data_req_loop(cc_data, &dest[pos], &data[rp], len - rp, dt_nr); 3868 if (answ_len <= 0) { 3869 fprintf(stderr, "cannot req data\n"); 3870 return 0; 3871 } 3872 pos += answ_len; 3873 3874 return ci_ccmgr_cc_sac_send(dvbnode, sessionnr, data_cnf_tag, dest, pos); 3875 } 3876 3877 //bool eDVBCIContentControlManagerSession::ci_ccmgr_cc_sac_send(tSlot *tslot, const uint8_t *tag, uint8_t *data, unsigned int pos) 3878 int ci_ccmgr_cc_sac_send(struct dvbdev* dvbnode, int sessionnr, uint8_t *tag, uint8_t *data, unsigned int pos) 3879 { 3880 // struct cc_ctrl_data *cc_data = (struct cc_ctrl_data*)(tslot->private_data); 3881 struct cc_ctrl_data *cc_data = (struct cc_ctrl_data*)(dvbnode->caslot->private_data); 3882 3883 printf("%s -> %s (%02X%02X%02X) \n", FILENAME, __FUNCTION__, tag[0], tag[1], tag[2]); 3884 3885 if (pos < 8) 3886 return 0; 3887 3888 pos += add_padding(&data[pos], pos - 8, 16); 3889 BYTE16(&data[6], pos - 8); /* len in header */ 3890 3891 pos += sac_gen_auth(&data[pos], data, pos, cc_data->sak); 3892 #if y_debug 3893 printf("Data for encrypt > "); 3894 for (unsigned int i = 0; i < pos; i++) 3895 printf("%02x ", data[i]); 3896 printf("\n"); 3897 #endif 3898 sac_crypt(&data[8], &data[8], pos - 8, cc_data->sek, AES_ENCRYPT); 3899 3900 // sendAPDU(tag, data, pos); 3901 sendAPDU(dvbnode, sessionnr, tag, data, pos); 3902 3903 return 1; 3904 } 3905 3906 //void eDVBCIContentControlManagerSession::ci_ccmgr_cc_sac_sync_req(tSlot *tslot, const uint8_t *data, unsigned int len) 3907 void ci_ccmgr_cc_sac_sync_req(struct dvbdev* dvbnode, int sessionnr, uint8_t *data, unsigned int len) 3908 { 3909 uint8_t sync_cnf_tag[3] = { 0x9f, 0x90, 0x10 }; 3910 uint8_t dest[64]; 3911 unsigned int serial; 3912 int pos = 0; 3913 3914 printf("%s -> %s\n", FILENAME, __FUNCTION__); 3915 #if y_debug 3916 hexdump(data, len); 3917 #endif 3918 serial = UINT32(data, 4); 3919 3920 pos += BYTE32(&dest[pos], serial); 3921 pos += BYTE32(&dest[pos], 0x01000000); 3922 3923 /* status OK */ 3924 dest[pos++] = 0; 3925 3926 ci_ccmgr_cc_sac_send(dvbnode, sessionnr, sync_cnf_tag, dest, pos); 3927 // tslot->ccmgr_ready = true; 3928 dvbnode->caslot->ccmgr_ready = 1; 3929 } 3930 3931 #endif -
titan/titan/header.h
r37740 r37742 68 68 void ci_ccmgr_cc_open_cnf(struct dvbdev* dvbnode, int sessionnr); 69 69 int ci_ccmgr_cc_data_initialize(struct dvbdev* dvbnode); 70 int ci_ccmgr_cc_data_req(struct dvbdev* dvbnode, int sessionnr, const uint8_t *data, unsigned int len); 70 int ci_ccmgr_cc_data_req(struct dvbdev* dvbnode, int sessionnr, uint8_t *data, unsigned int len); 71 void ci_ccmgr_cc_sync_req(struct dvbdev* dvbnode, int sessionnr); 72 int ci_ccmgr_cc_sac_data_req(struct dvbdev* dvbnode, int sessionnr, uint8_t *data, unsigned int len); 73 int ci_ccmgr_cc_sac_send(struct dvbdev* dvbnode, int sessionnr, uint8_t *tag, uint8_t *data, unsigned int pos); 74 void ci_ccmgr_cc_sac_sync_req(struct dvbdev* dvbnode, int sessionnr, uint8_t *data, unsigned int len); 71 75 72 76 #endif -
titan/titan/struct.h
r37741 r37742 117 117 #endif 118 118 119 #define DRIVER "Wed Jul 6 2 2:41:04CEST 2016"119 #define DRIVER "Wed Jul 6 23:22:20 CEST 2016" 120 120 #define OVERSION "1.76" 121 121 #define PROGNAME "titan" … … 541 541 unsigned char scrambled; 542 542 void *private_data; 543 int ccmgr_ready; 543 544 #endif 544 545 };
Note: See TracChangeset
for help on using the changeset viewer.