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; }
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. } }