Added CRC check of the CAT in cCaPidReceiver::Receive()

This commit is contained in:
Klaus Schmidinger 2020-06-27 10:05:56 +02:00
parent 488a13543e
commit 848c65fe4f
3 changed files with 39 additions and 31 deletions

View File

@ -3611,6 +3611,7 @@ Helmut Binder <cco@aon.at>
for changing the country code in the generated ParentalRatingDescriptor from 'DEU' to
'902' to make it valid for all countries
for adjusting device selection in GetDeviceForTransponder() to that in GetDevice()
for adding CRC check of the CAT in cCaPidReceiver::Receive()
Ulrich Eckhardt <uli@uli-eckhardt.de>
for reporting a problem with shutdown after user inactivity in case a plugin is

View File

@ -9490,3 +9490,4 @@ Video Disk Recorder Revision History
to Helmut Binder).
- Now adding CPPFLAGS to CXXFLAGS to allow extra preprocessor flags to be given when
doing make (suggested by Tobisa Grimm).
- Added CRC check of the CAT in cCaPidReceiver::Receive() (thanks to Helmut Binder).

68
ci.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: ci.c 4.28 2020/06/16 14:33:32 kls Exp $
* $Id: ci.c 4.29 2020/06/27 10:05:56 kls Exp $
*/
#include "ci.h"
@ -230,38 +230,44 @@ void cCaPidReceiver::Receive(const uchar *Data, int Length)
}
}
if (p) {
DelEmmPids();
for (int i = 0; i < length - 4; i++) { // -4 = checksum
if (p[i] == 0x09) {
int CaId = int(p[i + 2] << 8) | p[i + 3];
int EmmPid = Peek13(p + i + 4);
AddEmmPid(EmmPid);
if (MtdCamSlot)
MtdMapPid(const_cast<uchar *>(p + i + 4), MtdCamSlot->MtdMapper());
switch (CaId >> 8) {
case 0x01: for (int j = i + 7; j < p[i + 1] + 2; j += 4) {
EmmPid = Peek13(p + j);
AddEmmPid(EmmPid);
if (MtdCamSlot)
MtdMapPid(const_cast<uchar *>(p + j), MtdCamSlot->MtdMapper());
}
break;
}
i += p[i + 1] + 2 - 1; // -1 to compensate for the loop increment
if (!SI::CRC32::crc32((const char *)p - 8, length + 8, 0xFFFFFFFF)) { // <TableIdCAT,....,crc32>
DelEmmPids();
for (int i = 0; i < length - 4; i++) { // -4 = checksum
if (p[i] == 0x09) {
int CaId = int(p[i + 2] << 8) | p[i + 3];
int EmmPid = Peek13(p + i + 4);
AddEmmPid(EmmPid);
if (MtdCamSlot)
MtdMapPid(const_cast<uchar *>(p + i + 4), MtdCamSlot->MtdMapper());
switch (CaId >> 8) {
case 0x01: for (int j = i + 7; j < p[i + 1] + 2; j += 4) {
EmmPid = Peek13(p + j);
AddEmmPid(EmmPid);
if (MtdCamSlot)
MtdMapPid(const_cast<uchar *>(p + j), MtdCamSlot->MtdMapper());
}
break;
}
i += p[i + 1] + 2 - 1; // -1 to compensate for the loop increment
}
}
}
if (MtdCamSlot) {
if (!bufp && length) {
// update crc32 - but only single packet CAT is handled for now:
uint32_t crc = SI::CRC32::crc32((const char *)p - 8, length + 8 - 4, 0xFFFFFFFF); // <TableIdCAT....>[crc32]
uchar *c = const_cast<uchar *>(p + length - 4);
*c++ = crc >> 24;
*c++ = crc >> 16;
*c++ = crc >> 8;
*c++ = crc;
if (MtdCamSlot) {
if (!bufp && length) {
// update crc32 - but only single packet CAT is handled for now:
uint32_t crc = SI::CRC32::crc32((const char *)p - 8, length + 8 - 4, 0xFFFFFFFF); // <TableIdCAT....>[crc32]
uchar *c = const_cast<uchar *>(p + length - 4);
*c++ = crc >> 24;
*c++ = crc >> 16;
*c++ = crc >> 8;
*c++ = crc;
}
memcpy(mtdCatBuffer, Data, TS_SIZE);
MtdCamSlot->PutCat(mtdCatBuffer, TS_SIZE);
}
memcpy(mtdCatBuffer, Data, TS_SIZE);
MtdCamSlot->PutCat(mtdCatBuffer, TS_SIZE);
}
else {
esyslog("ERROR: wrong checksum in CAT");
catVersion = -1;
}
p = NULL;
bufp = NULL;