All pastes #350574 Raw Edit

Unnamed

public cpp v1 · immutable
·published 2007-02-11 15:38 UTC
rendered paste body
diff -ur sc-0.6.0/systems/nagra/nagra2.c sc-0.6.0-rwx/systems/nagra/nagra2.c--- sc-0.6.0/systems/nagra/nagra2.c	2007-01-13 11:04:26.000000000 +0100+++ sc-0.6.0-rwx/systems/nagra/nagra2.c	2007-02-08 16:25:52.000000000 +0100@@ -264,6 +264,7 @@   virtual void CreatePQ(const unsigned char *key, BIGNUM *p, BIGNUM *q);   bool DecryptECM(const unsigned char *in, unsigned char *out, const unsigned char *key, int len, const unsigned char *vkey, BIGNUM *m);   bool DecryptEMM(const unsigned char *in, unsigned char *out, const unsigned char *key, int len, const unsigned char *vkey, BIGNUM *m);+  void DecryptIkey(const unsigned char *desKey, unsigned char *iKey);   };  void cNagra2::CreatePQ(const unsigned char *key, BIGNUM *p, BIGNUM *q)@@ -375,6 +376,16 @@   return true; } +void cNagra2::DecryptIkey(const unsigned char *desKey, unsigned char *iKey)+{+ DES_key_schedule ks0, ks1, ks2;+ DES_set_key((DES_cblock *) &desKey[0], &ks0);+ DES_set_key((DES_cblock *) &desKey[8], &ks1);+ DES_set_key((DES_cblock *) &desKey[16], &ks2);+ DES_ecb3_encrypt((const_DES_cblock *)&iKey[0], (DES_cblock *)&iKey[0], &ks0, &ks1, &ks2, DES_DECRYPT);+ DES_ecb3_encrypt((const_DES_cblock *)&iKey[8], (DES_cblock *)&iKey[8], &ks0, &ks1, &ks2, DES_DECRYPT);+}+ // -- cSystemNagra2 ------------------------------------------------------------  class cSystemNagra2 : public cSystem, protected cNagra2 {@@ -517,8 +528,9 @@   int sigsel=(buffer[13]&0x80)>>1;   cPlainKey *pk;   cBN n;-  unsigned char ideaKey[24], vKey[16];+  unsigned char ideaKey[24], vKey[16], desKey[24];   bool hasVerifyKey=false;+  bool hasdesKey=false;   if(!(pk=keys.FindKey('N',id,MBC(N2_MAGIC,keyset+0x10+sel),96)))  {     dl(printf("logger-nagra2: missing %04x NN %.02X RSA key (96 bytes)\n",id,keyset+0x10+sel))     return;@@ -544,7 +556,11 @@     return;     }   lastEmmId=id;-+  // now get the 3DES key if present, switch id from 4001 to 4101+  if((pk=keys.FindKey('N',(emmdata[19]*256+emmdata[20]),MBC(N2_MAGIC,0x13+sel),24))) {+    pk->Get(desKey);+    hasdesKey=true;+  }   id=(emmdata[8]<<8)+emmdata[9]; #ifdef DEBUG_LOG   bool contFail=false;@@ -554,6 +570,11 @@       case 0x42: // plain Key update         if(emmdata[i+2]==0x10 && (emmdata[i+3]&0xBF)==0x06 &&            (emmdata[i+4]&0xF8)==0x08 && emmdata[i+5]==0x00 && emmdata[i+6]==0x10) {+          // decrypt 4101 keys+          if (hasdesKey) {+            id = (emmdata[19]*256+emmdata[20]); // switch the id+            DecryptIkey(desKey, &emmdata[i+7]);+          }           cSoftCAM::FoundKey();           if(keys.NewKey('N',id,(emmdata[i+3]&0x40)>>6,&emmdata[i+7],16)) cSoftCAM::NewKey();           cSoftCAM::Save();diff -ur sc-0.6.0/systems/nagra/nagra.h sc-0.6.0-rwx/systems/nagra/nagra.h--- sc-0.6.0/systems/nagra/nagra.h	2006-10-10 19:03:54.000000000 +0200+++ sc-0.6.0-rwx/systems/nagra/nagra.h	2007-02-08 16:17:36.000000000 +0100@@ -47,6 +47,7 @@ #define N2_MAGIC   0x80 #define N2_EMM_G_I 0x02 #define N2_EMM_G_R 0x12+#define N2_EMM_G_D 0x13 // 3DES #define N2_EMM_S_I 0x01 #define N2_EMM_S_R 0x11 #define N2_EMM_SEL 0x40