radegast not able to carry long ECM tntsat
= Revision last SVN 8742
= Issue Description Radegast protocol not compatible with long ECM TNTsat
= When the issue occurs if you want to get an answer from an Atlas HD100 with a TNTsat card inside.
= How the issue is reproducable everytime (from a post of alg01 in the streamboard thanks to him)
here an example of an ECM tntsat 80 71 27 01 80 2F 90 07 03 0B 00 09 05 67 01 E2 03 42 C3 00 E2 03 42 C3 FE EA 10 85 FB 51 D4 F0 94 22 57 72 8B D4 67 23 C9 D9 F5 F0 08 CF F2 A1 3E B4 94 47 B5 80 2F 90 07 03 0B 00 08 06 15 01 E2 03 42 C3 00 E2 03 42 C3 FE EA 10 3A F3 1F F5 08 0A 93 50 09 1B 2B 15 FC 2D 28 F4 F0 08 8F 6C B7 86 FA 33 66 30 80 2F 90 07 03 0B 00 08 07 01 00 E2 03 42 C3 00 E2 03 42 C3 FE EA 10 16 F1 E4 65 5C 3F 05 D7 9E C3 9C E3 EA D6 A9 C6 F0 08 6A 09 1E 3D 1B 47 22 81 80 2F 90 07 03 0B 00 08 07 01 01 E2 03 42 C3 00 E2 03 42 C3 FE EA 10 3D 1F C5 B6 3A 58 C2 74 01 A3 68 88 70 0C 3C B7 F0 08 29 A1 F1 52 A6 63 1A 2C 80 2F 90 07 03 0B 00 08 06 15 00 E2 03 42 C3 00 E2 03 42 C3 FE EA 10 F1 6B 03 6C 3F 9D 43 6F 74 6B D3 B3 30 61 02 6F F0 08 E9 40 41 AB 9D F4 A1 39 80 2F 90 07 03 0B 00 09 05 67 00 E2 03 42 C3 00 E2 03 42 C3 FE EA 10 2B C1 3D AA B5 03 AD 78 28 76 20 32 01 91 A3 CE F0 08 0C 3C CE 85 2A 40 FF 04
What has been done is before to send the request via radegast,we modifiy the ECM so that it could be recognized by the card and also to reduce its size to be less than 256 bytes but without cut
quote:
80 71 27 01 80 2F 90 07 03 0B 00 09 05 67 01 E2 03 42 C3 00 E2 03 42 C3 FE EA 10 85 FB 51 D4 F0 94 22 57 72 8B D4 67 23 C9 D9 F5 F0 08 CF F2 A1 3E B4 94 47 B5 //removed because CWsSwap flag == 1 80 2F 90 07 03 0B 00 08 06 15 01 E2 03 42 C3 00 E2 03 42 C3 FE EA 10 3A F3 1F F5 08 0A 93 50 09 1B 2B 15 FC 2D 28 F4 F0 08 8F 6C B7 86 FA 33 66 30 //removed because CWsSwap flag == 1 80 2F 90 07 03 0B 00 08 07 01 00 E2 03 42 C3 00 E2 03 42 C3 FE EA 10 16 F1 E4 65 5C 3F 05 D7 9E C3 9C E3 EA D6 A9 C6 F0 08 6A 09 1E 3D 1B 47 22 81 80 2F 90 07 03 0B 00 08 07 01 01 E2 03 42 C3 00 E2 03 42 C3 FE EA 10 3D 1F C5 B6 3A 58 C2 74 01 A3 68 88 70 0C 3C B7 F0 08 29 A1 F1 52 A6 63 1A 2C //removed CWsSwap flag == 1 80 2F 90 07 03 0B 00 08 06 15 00 E2 03 42 C3 00 E2 03 42 C3 FE EA 10 F1 6B 03 6C 3F 9D 43 6F 74 6B D3 B3 30 61 02 6F F0 08 E9 40 41 AB 9D F4 A1 39 80 2F 90 07 03 0B 00 09 05 67 00 E2 03 42 C3 00 E2 03 42 C3 FE EA 10 2B C1 3D AA B5 03 AD 78 28 76 20 32 01 91 A3 CE F0 08 0C 3C CE 85 2A 40 FF 04
In red,it is the CWsSwap flag.We decided to remove the subECM when CWsSwap flag = 1 using this simple piece of software code:
int k, pos;
uint8_t* SubECMp;
if( ECMp[4]==0x80 )
{
memcpy(ECM, ECMp, 4);
ECM[1] = 0x70;
ECM[2] = 0x01;
pos = 0x04;
k = 4;
while(k<Len)
{
SubECMp = (uint8_t *)&ECMp[k];
if( (pos+SubECMp[1]+2)>0xE0 )
{
break;
}
if (SubECMp[2]==0xD2)
{
if( SubECMp[0x0E] == 0x00 )
{
memcpy(ECM+pos, SubECMp, SubECMp[1]+2);
ECM[2] += SubECMp[1]+2;
pos += SubECMp[1]+2;
}
}
else if ( (SubECMp[2]==0x90 || SubECMp[2]==0x40) && SubECMp[3]==0x07 )
{
if( SubECMp[0x0A] == 0x00 )
{
memcpy(ECM+pos, SubECMp, SubECMp[1]+2);
ECM[2] += SubECMp[1]+2;
pos += SubECMp[1]+2;
}
}
k += SubECMp[1] + 2;
}
Len = ECM[2]+3;
}
where ECM is the same type as ECMp.ECMp is the original ECM and Len its lenght (original).When this routine is applied the result is in ECM [] and the lenght will have change and found in Len