SASC-NG
DVBSoftCAM

parse.h

Go to the documentation of this file.
00001 /*
00002  * Softcam plugin to VDR (C++)
00003  *
00004  * This code is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU General Public License
00006  * as published by the Free Software Foundation; either version 2
00007  * of the License, or (at your option) any later version.
00008  *
00009  * This code is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  * GNU General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU General Public License
00015  * along with this program; if not, write to the Free Software
00016  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00017  * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
00018  */
00019 
00020 #ifndef ___PARSE_H
00021 #define ___PARSE_H
00022 
00023 #include "misc.h"
00024 
00025 // ----------------------------------------------------------------
00026 
00027 class cAssSct : public cSimpleItem {
00028 private:
00029   const unsigned char *data;
00030 public:
00031   cAssSct(const unsigned char *Data);
00032   const unsigned char *Data(void) const { return data; }
00033   };
00034 
00035 class cAssembleData : private cSimpleList<cAssSct> {
00036 private:
00037   const unsigned char *data;
00038   cAssSct *curr;
00039 public:
00040   cAssembleData(const unsigned char *Data);
00041   void SetAssembled(const unsigned char *Data);
00042   const unsigned char *Assembled(void);
00043   const unsigned char *Data(void) const { return data; }
00044   };
00045 
00046 class cProvider : public cSimpleItem {
00047 public:
00048   virtual bool MatchID(const unsigned char *data)=0;
00049   virtual bool MatchEMM(const unsigned char *data)=0;
00050   virtual unsigned long long ProvId(void)=0;
00051   virtual int UpdateType(const unsigned char *data) { return 2; }
00052   virtual int Assemble(cAssembleData *ad) { return 0; }
00053   };
00054 
00055 class cProviders : public cSimpleList<cProvider> {
00056 public:
00057   void AddProv(cProvider *p);
00058   cProvider *FindProv(const unsigned char *data);
00059   cProvider *MatchProv(const unsigned char *data);
00060   };  
00061 
00062 class cCard {
00063 public:
00064   virtual ~cCard() {}
00065   virtual bool MatchEMM(const unsigned char *data)=0;
00066   virtual int UpdateType(const unsigned char *data) { return 3; }
00067   virtual int Assemble(cAssembleData *ad) { return 0; }
00068   };
00069 
00070 class cIdSet : public cProviders {
00071 protected:
00072   cCard *card;
00073 public:
00074   cIdSet(void);
00075   ~cIdSet();
00076   void SetCard(cCard *c);
00077   void ResetIdSet(void);
00078   bool MatchEMM(const unsigned char *data);
00079   bool MatchAndAssemble(cAssembleData *ad, int *updtype, cProvider **p);
00080   };
00081 
00082 // -- IRDETO ------------------------------------------------------
00083 
00084 class cProviderIrdeto : public cProvider {
00085 public:
00086   unsigned char provBase;
00087   unsigned char provId[3];
00088   //
00089   cProviderIrdeto(void) {}
00090   cProviderIrdeto(unsigned char pb, const unsigned char *pi);
00091   virtual bool MatchID(const unsigned char *data);
00092   virtual bool MatchEMM(const unsigned char *data);
00093   virtual unsigned long long ProvId(void);
00094   };
00095 
00096 class cCardIrdeto : public cCard {
00097 public:
00098   unsigned char hexBase;
00099   unsigned char hexSer[3];
00100   //
00101   cCardIrdeto(void) {}
00102   cCardIrdeto(unsigned char hb, const unsigned char *hs);
00103   virtual bool MatchEMM(const unsigned char *data);
00104   virtual int UpdateType(const unsigned char *data);
00105   };
00106 
00107 class cParseIrdeto {
00108 public:
00109   static unsigned int AddrLen(const unsigned char *data);
00110   static unsigned int AddrBase(const unsigned char *data);
00111   };
00112 
00113 // -- SECA --------------------------------------------------------
00114 
00115 struct SecaCmd {
00116   unsigned char tid;
00117   unsigned char cmdLen1;
00118   unsigned char cmdLen2;
00119   };
00120 
00121 struct SecaEcm {
00122   struct SecaCmd cmd;
00123   unsigned char id[2];
00124   unsigned char unknown;
00125   unsigned char sm;
00126   unsigned char keyNr;
00127   };
00128 
00129 struct SecaEmmShared {
00130   struct SecaCmd cmd;
00131   unsigned char id[2];
00132   unsigned char sa[3];
00133   unsigned char sm;
00134   unsigned char keyNr;
00135   };
00136       
00137 struct SecaEmmUnique {
00138   struct SecaCmd cmd;
00139   unsigned char ua[6];
00140   unsigned char id[2];
00141   unsigned char sm;
00142   unsigned char keyNr;
00143   };
00144 
00145 #define TID(x) (((struct SecaCmd *)(x))->tid)
00146 #define SA(x)  (((struct SecaEmmShared *)(x))->sa)
00147 #define SID(x) (((struct SecaEmmShared *)(x))->id)
00148 #define UA(x)  (((struct SecaEmmUnique *)(x))->ua)
00149 #define UID(x) (((struct SecaEmmUnique *)(x))->id)
00150 
00151 class cProviderSeca : public cProvider {
00152 public:
00153   unsigned char provId[2];
00154   unsigned char sa[3];
00155   //
00156   cProviderSeca(void) {}
00157   cProviderSeca(const unsigned char *pi, const unsigned char *s);
00158   virtual bool MatchID(const unsigned char *data);
00159   virtual bool MatchEMM(const unsigned char *data);
00160   virtual unsigned long long ProvId(void);
00161   };
00162 
00163 class cCardSeca : public cCard {
00164 public:
00165   unsigned char ua[6];
00166   //
00167   cCardSeca(void) {}
00168   cCardSeca(const unsigned char *u);
00169   virtual bool MatchEMM(const unsigned char *data);
00170   };
00171 
00172 class cParseSeca {
00173 public:
00174   static int CmdLen(const unsigned char *data);
00175   static int Payload(const unsigned char *data, const unsigned char **payload);
00176   static int SysMode(const unsigned char *data);
00177   static int KeyNr(const unsigned char *data);
00178   static const unsigned char *ProvIdPtr(const unsigned char *data);
00179   static int ProvId(const unsigned char *data);
00180   };
00181 
00182 // -- VIACCESS -----------------------------------------------------
00183 
00184 class cProviderViaccess : public cProvider {
00185 private:
00186   unsigned char *sharedEmm;
00187   int sharedLen, sharedToggle;
00188 public:
00189   unsigned char ident[3];
00190   unsigned char sa[4];
00191   //
00192   cProviderViaccess(void);
00193   cProviderViaccess(const unsigned char *id, const unsigned char *s);
00194   virtual ~cProviderViaccess();
00195   virtual bool MatchID(const unsigned char *data);
00196   virtual bool MatchEMM(const unsigned char *data);
00197   virtual unsigned long long ProvId(void);
00198   virtual int UpdateType(const unsigned char *data);
00199   virtual int Assemble(cAssembleData *ad);
00200   };
00201 
00202 class cCardViaccess : public cCard {
00203 public:
00204   unsigned char ua[5];
00205   //
00206   cCardViaccess(void) {}
00207   cCardViaccess(const unsigned char *u);
00208   virtual bool MatchEMM(const unsigned char *data);
00209   };
00210 
00211 class cParseViaccess {
00212 public:
00213   static const unsigned char *PayloadStart(const unsigned char *data);
00214   static const unsigned char *NanoStart(const unsigned char *data);
00215   static const unsigned char *CheckNano90(const unsigned char *data);
00216   static const unsigned char *CheckNano90FromNano(const unsigned char *data);
00217   static int KeyNr(const unsigned char *data);
00218   static int KeyNrFromNano(const unsigned char *data);
00219   static const unsigned char *ProvIdPtr(const unsigned char *data);
00220   static int ProvId(const unsigned char *data);
00221   };
00222 
00223 // -- NAGRA 2 ------------------------------------------------------
00224 
00225 class cCardNagra2 : public cCard {
00226 public:
00227   unsigned char addr[4];
00228   //
00229   cCardNagra2(const unsigned char *a);
00230   virtual bool MatchEMM(const unsigned char *data);
00231   virtual int UpdateType(const unsigned char *data);
00232   };
00233 
00234 // -- CONAX --------------------------------------------------------
00235 
00236 class cProviderConax : public cProvider {
00237 public:
00238   unsigned char addr[7];
00239   //
00240   cProviderConax(const unsigned char *a);
00241   virtual bool MatchID(const unsigned char *data);
00242   virtual bool MatchEMM(const unsigned char *data);
00243   virtual unsigned long long ProvId(void);
00244   };
00245 
00246 class cCardConax : public cCard {
00247 public:
00248   unsigned char addr[7];
00249   //
00250   cCardConax(const unsigned char *a);
00251   virtual bool MatchEMM(const unsigned char *data);
00252   };
00253 
00254 // -- CRYPTOWORKS --------------------------------------------------
00255 
00256 class cProviderCryptoworks : public cProvider {
00257 public:
00258   unsigned char addr[5];
00259   //
00260   cProviderCryptoworks(const unsigned char *a);
00261   virtual bool MatchID(const unsigned char *data);
00262   virtual bool MatchEMM(const unsigned char *data);
00263   virtual unsigned long long ProvId(void);
00264   };
00265 
00266 class cCardCryptoworks : public cCard {
00267 private:
00268   unsigned char *sharedEmm;
00269   int sharedLen, globalToggle;
00270   unsigned int globalCrc;
00271 public:
00272   unsigned char addr[5];
00273   //
00274   cCardCryptoworks(const unsigned char *a);
00275   virtual ~cCardCryptoworks();
00276   virtual bool MatchEMM(const unsigned char *data);
00277   virtual int UpdateType(const unsigned char *data);
00278   virtual int Assemble(cAssembleData *ad);
00279   };
00280 
00281 // -- NDS -----------------------------------------------------------
00282 
00283 class cProviderNDS : public cProvider {
00284 public:
00285   unsigned char sa[4];
00286   //
00287   cProviderNDS(const unsigned char *s);
00288   virtual bool MatchID(const unsigned char *data);
00289   virtual bool MatchEMM(const unsigned char *data);
00290   virtual unsigned long long ProvId(void);
00291   virtual int Assemble(cAssembleData *ad);
00292   };
00293 
00294 class cCardNDS : public cCard {
00295 public:
00296   unsigned char ua[4];
00297   //
00298   cCardNDS(const unsigned char *u);
00299   virtual bool MatchEMM(const unsigned char *data);
00300   virtual int Assemble(cAssembleData *ad);
00301   };
00302 
00303 class cParseNDS {
00304 public:
00305   static unsigned int NumAddr(const unsigned char *data);
00306   static int AddrMode(const unsigned char *data);
00307   static bool IsSA(const unsigned char *data);
00308   static bool HasAddr(const unsigned char *data, const unsigned char *a);
00309   static const unsigned char *PayloadStart(const unsigned char *data, const unsigned char *a);
00310   static int PayloadSize(const unsigned char *data, const unsigned char *a);
00311   static int Assemble(cAssembleData *ad, const unsigned char *a);
00312   };
00313 
00314 #endif //___PARSE_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines