]> www.vanbest.org Git - sasc-ng.git/commitdiff
added fr4nK10's NDS-EMM parse patch
authorleslie <unknown>
Thu, 7 Oct 2010 15:51:15 +0000 (17:51 +0200)
committerleslie <unknown>
Thu, 7 Oct 2010 15:51:15 +0000 (17:51 +0200)
parse.c
parse.h
systems/sc-videoguard2/sc-videoguard2.c

diff --git a/parse.c b/parse.c
index 88ba63c06a6f28923538965bf820f92de0474dc8..40d698ed2ebf762d182151a955529af7aceb0d08 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -746,26 +746,44 @@ bool cParseNDS::HasAddr(const unsigned char *data, const unsigned char *a)
   return false;
 }
 
-const unsigned char *cParseNDS::PayloadStart(const unsigned char *data)
+const unsigned char *cParseNDS::PayloadStart(const unsigned char *data, const unsigned char *a)
 {
-  //return &data[4 + NumAddr(data)*4 + 2];
   if(AddrMode(data)==0) return &data[4];
-  else                  return &data[4+NumAddr(data)*4];
+  else {
+    int l;
+    for(l=NumAddr(data)-1; l>=0; l--) {
+      if(!memcmp(&data[l*4+4],a,AddrMode(data)+1)) break;
+      }
+    const unsigned char *pl;
+    pl=&data[4+NumAddr(data)*4];  // skip address list
+    pl+=2;                        // skip 00 00 separator
+    while(l--) {
+      pl++;                       // skip the 1st bitmap len
+      pl+=2+pl[1];                // skip IRD-EMM part, 02 00 or 02 06 xx aabbccdd yy
+      pl+=1+*pl;                  // skip sub-EMM payload
+      if (*pl == 0x00) pl++;      // skip sub-EMM separator
+      }
+    pl++;                         // skip the 1st bitmap len
+    return pl;
+    }
 }
 
-int cParseNDS::PayloadSize(const unsigned char *data)
+int cParseNDS::PayloadSize(const unsigned char *data, const unsigned char *a)
 {
-  //return emm[2]+emm[3]+4-1+5;
   int l=SCT_LEN(data);
   if(AddrMode(data)==0) return l-(4);
-  else                  return l-(4+NumAddr(data)*4);
+  else {
+    const unsigned char *pl=cParseNDS::PayloadStart(data,a); //points to 02 xx yy
+    pl+=2+pl[1];
+    return *pl;
+    }
 }
 
 int cParseNDS::Assemble(cAssembleData *ad, const unsigned char *a)
 {
   const unsigned char *data=ad->Data();
-  int len=cParseNDS::PayloadSize(data);
-  const unsigned char *pl=cParseNDS::PayloadStart(data);
+  int len=cParseNDS::PayloadSize(data,a);
+  const unsigned char *pl=cParseNDS::PayloadStart(data,a);
   switch(cParseNDS::AddrMode(data)) {
     case 0:
      {
@@ -796,12 +814,13 @@ int cParseNDS::Assemble(cAssembleData *ad, const unsigned char *a)
     case 2:
     case 3:
       {
-      unsigned char *ass=(unsigned char *)malloc(len+8); if(!ass) return -1; // ignore
+      unsigned char *ass=(unsigned char *)malloc(len+4+2+8); if(!ass) return -1; // ignore
       ass[0]=data[0];
-      ass[3]=data[3]&0x0F;
+      ass[3]=data[3]&0xCF;
       memcpy(&ass[4],a,4);
-      memcpy(&ass[8],pl,len);
-      SetSctLen(ass,len+5);
+      memset(&ass[8],0,2);
+      memcpy(&ass[10],pl-1,len+4);
+      SetSctLen(ass,len+4+2+5);
       ad->SetAssembled(ass);
       return 1; // assembled
       }
diff --git a/parse.h b/parse.h
index 125c01dc99fe1c5c4d234c44d164c742d57ff7c4..ae068ab1fb2fdc765f22cc2e8e1f0592ad40ef0c 100644 (file)
--- a/parse.h
+++ b/parse.h
@@ -306,8 +306,8 @@ public:
   static int AddrMode(const unsigned char *data);
   static bool IsSA(const unsigned char *data);
   static bool HasAddr(const unsigned char *data, const unsigned char *a);
-  static const unsigned char *PayloadStart(const unsigned char *data);
-  static int PayloadSize(const unsigned char *data);
+  static const unsigned char *PayloadStart(const unsigned char *data, const unsigned char *a);
+  static int PayloadSize(const unsigned char *data, const unsigned char *a);
   static int Assemble(cAssembleData *ad, const unsigned char *a);
   };
 
index 03be152280986523ca05d4173941881ebb44b816..450a0cad6ec0d6d8ba4c409caa2865ddb58bf515 100644 (file)
@@ -674,7 +674,7 @@ bool cSmartCardVideoGuard2::Update(int pid, int caid, const unsigned char *data)
 {
   static unsigned char ins42[5] = { 0xD1,0x42,0x00,0x00,0xFF }; 
   if(MatchEMM(data)) {
-    const unsigned char *payloaddata=cParseNDS::PayloadStart(data); //points to 02 xx yy
+    const unsigned char *payloaddata=cParseNDS::PayloadStart(data,cardID); //points to 02 xx yy
     int lenEMM;
     switch(payloaddata[0]) {
       case 2: