Changeset 37742


Ignore:
Timestamp:
07/06/16 23:30:37 (8 years ago)
Author:
obi
Message:

next step c* init working

Location:
titan/titan
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • titan/titan/ca.h

    r37741 r37742  
    761761                {
    762762                        case 0x01: ci_ccmgr_cc_open_cnf(dvbnode, sessionnr); break;
    763                         case 0x03: ci_ccmgr_cc_data_req(dvbnode, sessionnr, (const uint8_t*)data, len); break;
    764 //                      case 0x05: ci_ccmgr_cc_sync_req(); break;
    765 //                      case 0x07: ci_ccmgr_cc_sac_data_req(dvbnode, sessionnr, (const uint8_t*)data, len); break;
    766 //                      case 0x09: ci_ccmgr_cc_sac_sync_req(dvbnode, sessionnr, (const uint8_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;
    767767                        default:
    768768                                debug(620, "unknown APDU tag 9F 80 %02x\n", tag[2]);
     
    37573757
    37583758//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, const uint8_t *data, unsigned int len)
     3759int ci_ccmgr_cc_data_req(struct dvbdev* dvbnode, int sessionnr, uint8_t *data, unsigned int len)
    37603760{
    37613761//      struct cc_ctrl_data *cc_data = (struct cc_ctrl_data*)(tslot->private_data);
     
    38013801}
    38023802
     3803void 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)
     3813int 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");
    38033838#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)
     3878int 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)
     3907void 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  
    6868void ci_ccmgr_cc_open_cnf(struct dvbdev* dvbnode, int sessionnr);
    6969int 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);
     70int ci_ccmgr_cc_data_req(struct dvbdev* dvbnode, int sessionnr, uint8_t *data, unsigned int len);
     71void ci_ccmgr_cc_sync_req(struct dvbdev* dvbnode, int sessionnr);
     72int ci_ccmgr_cc_sac_data_req(struct dvbdev* dvbnode, int sessionnr, uint8_t *data, unsigned int len);
     73int ci_ccmgr_cc_sac_send(struct dvbdev* dvbnode, int sessionnr, uint8_t *tag, uint8_t *data, unsigned int pos);
     74void ci_ccmgr_cc_sac_sync_req(struct dvbdev* dvbnode, int sessionnr, uint8_t *data, unsigned int len);
    7175
    7276#endif
  • titan/titan/struct.h

    r37741 r37742  
    117117#endif
    118118
    119 #define DRIVER "Wed Jul  6 22:41:04 CEST 2016"
     119#define DRIVER "Wed Jul  6 23:22:20 CEST 2016"
    120120#define OVERSION "1.76"
    121121#define PROGNAME "titan"
     
    541541        unsigned char scrambled;
    542542        void *private_data;
     543        int ccmgr_ready;
    543544#endif
    544545};
Note: See TracChangeset for help on using the changeset viewer.