Esempio n. 1
0
 public Aes128()
 {
     _EvenAes           = new AesBase();
     _OddAes            = new AesBase();
     _Cluster           = new IntPtr[_MaxPacketsAtOnce + 1];
     _CurrentBatchIndex = 0;
 }
Esempio n. 2
0
        private void DescrambleBatch(IntPtr[] cluster)
        {
            byte[] packetBuffer = new byte[188];
            int    adapt;
            int    scram;
            int    plPtr;

            int     dStart; // Daten start
            int     dLen;   // Daten Länge.
            AesBase aes = null;

            for (int i = 0; i < cluster.Length; i++)
            {
                if (cluster[i] == IntPtr.Zero)
                {
                    break;
                }

                dStart = 4;

                // sind hier im Managed, heißt also kopieren in byte[] und wieder zurück. später performantere Lösung finden,
                // z.B. native DLL
                Marshal.Copy(cluster[i], packetBuffer, 0, packetBuffer.Length);

                scram = packetBuffer[3] & 0xc0; // 0 = unscrambled, 0x80 = even CW, 0xc0 = odd cw, 0x40 = ?
                adapt = packetBuffer[3] & 0x30; // 0 = invalid, 1 = payload only, 2 = a. only, 3 = a folow pl
                plPtr = packetBuffer[4];        // wenn Adaptionfield vorhanden Pointer auf Payload-Beginn (Adaption-Field Länge ohne Ptr selbst)

                if (scram == 0)                 // nicht verschlüsselt.
                {
                    continue;
                }
                // Normalerweise hier auch Check ob PES Level Descrambling an dieser Stelle.
                // Allerdings sieht der Standard vor, dass PES Level scrambling nicht in
                // "Consumer Electronic applications" verwendet werden soll,
                // daher wird das erstmal nicht implementiert.
                // ETSI TS 103 127 V1.1.1 (2013-05) 6.2.2 Letzter Satz.

                if (scram == 0x80) // even
                {
                    aes = _EvenAes;
                }
                else if (scram == 0xc0) // odd
                {
                    aes = _OddAes;
                } // else 0x40 unbekannt

                if (aes == null || !aes.CanDescramble)
                {
                    continue;
                }

                if (adapt == 0x20) // nur adaptionfield-Packet.
                {
                    continue;
                }

                if (adapt == 0x30) // Adaption field vorhanden, zusammen mit Payload.
                {
                    dStart += 1 + plPtr;
                }

                dLen = (188 - dStart) & 0xf0; // verschlüsselte Länge ist vielfaches von 16, also & ~0x0f;

                if (dLen > 0)
                {
                    aes.Decrypt(packetBuffer, dStart, dLen);
                }

                // Daten zurückkopieren:
                Marshal.Copy(packetBuffer, dStart, cluster[i] + dStart, dLen);
                Marshal.WriteByte(cluster[i], 3, (byte)(packetBuffer[3] & 0x3f)); // scrambled Flag entfernen.
            }
        }