|
SASC-NG
DVBSoftCAM
|
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