Exemple #1
0
 public Des()
 {
     // TODO: Entfernen, wenn fertig:
     LogProvider.Add(DebugLevel.Warning, cLogSection, Message.DesDescramblingNotAvail);
     _EvenDes           = new DesBase();
     _OddDes            = new DesBase();
     _Cluster           = new IntPtr[_MaxPacketsAtOnce + 1];
     _CurrentBatchIndex = 0;
 }
Exemple #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.
            DesBase des = 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;
                }

                if (scram == 0x80) // even
                {
                    des = _EvenDes;
                }
                else if (scram == 0xc0) // odd
                {
                    des = _OddDes;
                } // else 0x40 unbekannt

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

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

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

                dLen = (188 - dStart) & 0xf8; // verschlüsselte Länge ist vielfaches von 8 (64 bit), also & ~0x07;

                if (dLen > 0)
                {
                    des.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.
            }
        }