public F2B.FirewallConditions Conditions() { F2B.FirewallConditions conds = new F2B.FirewallConditions(); byte[] data = stream.ToArray(); int pos = DataSize[F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_EXPIRATION]; while (pos < data.Length) { int size = 0; DataSize.TryGetValue((F2B_FWDATA_TYPE0_ENUM)data[pos], out size); // this is not necessary because we validate input data //if (size == 0) //{ // // undefined size or unknown type // throw new InvalidDataException("Unknown FwData type or size: " + data[pos]); //} // //if (!(data.Length >= pos + size)) //{ // // Truncated data?! // throw new InvalidDataException("Truncated FwData data with type: " + data[pos]); //} // Create new firewall rule switch ((F2B_FWDATA_TYPE0_ENUM)data[pos]) { case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_EXPIRATION: throw new InvalidDataException("More expiration records in FwData"); //expiration = IPAddress.NetworkToHostOrder(BitConverter.ToInt64(data, pos + 1)); //break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv4: case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv4_AND_PREFIX: byte[] baddr4 = new byte[4]; Array.Copy(data, pos + 1, baddr4, 0, 4); if ((F2B_FWDATA_TYPE0_ENUM)data[pos] == F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv4) { conds.Add(new IPAddress(baddr4)); } else { conds.Add(new IPAddress(baddr4), data[pos + 1 + 4]); } break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv4_RANGE: byte[] baddrLow4 = new byte[4]; byte[] baddrHigh4 = new byte[4]; Array.Copy(data, pos + 1, baddrLow4, 0, 4); Array.Copy(data, pos + 1 + 4, baddrHigh4, 0, 4); conds.Add(new IPAddress(baddrLow4), new IPAddress(baddrHigh4)); break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv6: case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv6_AND_PREFIX: byte[] baddr6 = new byte[16]; Array.Copy(data, pos + 1, baddr6, 0, 16); if ((F2B_FWDATA_TYPE0_ENUM)data[pos] == F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv6) { conds.Add(new IPAddress(baddr6)); } else { conds.Add(new IPAddress(baddr6), data[pos + 1 + 16]); } break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv6_RANGE: byte[] baddrLow6 = new byte[16]; byte[] baddrHigh6 = new byte[16]; Array.Copy(data, pos + 1, baddrLow6, 0, 16); Array.Copy(data, pos + 1 + 4, baddrHigh6, 0, 16); conds.Add(new IPAddress(baddrLow6), new IPAddress(baddrHigh6)); break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_PORT: conds.Add(IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, pos + 1))); break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_PORT_RANGE: conds.Add(IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, pos + 1)), IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, pos + 1 + 2))); break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_PROTOCOL: conds.Add((ProtocolType)data[pos + 1]); break; default: throw new InvalidDataException("Unknown FwData type: " + data[pos]); //break; } pos += size; } return(conds); }
public F2B.FirewallConditions Conditions() { F2B.FirewallConditions conds = new F2B.FirewallConditions(); byte[] data = stream.ToArray(); int pos = DataSize[F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_EXPIRATION]; while (pos < data.Length) { int size = 0; DataSize.TryGetValue((F2B_FWDATA_TYPE0_ENUM)data[pos], out size); // this is not necessary because we validate input data //if (size == 0) //{ // // undefined size or unknown type // throw new InvalidDataException("Unknown FwData type or size: " + data[pos]); //} // //if (!(data.Length >= pos + size)) //{ // // Truncated data?! // throw new InvalidDataException("Truncated FwData data with type: " + data[pos]); //} // Create new firewall rule switch ((F2B_FWDATA_TYPE0_ENUM)data[pos]) { case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_EXPIRATION: throw new InvalidDataException("More expiration records in FwData"); //expiration = IPAddress.NetworkToHostOrder(BitConverter.ToInt64(data, pos + 1)); //break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv4: case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv4_AND_PREFIX: byte[] baddr4 = new byte[4]; Array.Copy(data, pos + 1, baddr4, 0, 4); if ((F2B_FWDATA_TYPE0_ENUM)data[pos] == F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv4) conds.Add(new IPAddress(baddr4)); else conds.Add(new IPAddress(baddr4), data[pos + 1 + 4]); break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv4_RANGE: byte[] baddrLow4 = new byte[4]; byte[] baddrHigh4 = new byte[4]; Array.Copy(data, pos + 1, baddrLow4, 0, 4); Array.Copy(data, pos + 1 + 4, baddrHigh4, 0, 4); conds.Add(new IPAddress(baddrLow4), new IPAddress(baddrHigh4)); break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv6: case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv6_AND_PREFIX: byte[] baddr6 = new byte[16]; Array.Copy(data, pos + 1, baddr6, 0, 16); if ((F2B_FWDATA_TYPE0_ENUM)data[pos] == F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv6) conds.Add(new IPAddress(baddr6)); else conds.Add(new IPAddress(baddr6), data[pos + 1 + 4]); break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_IPv6_RANGE: byte[] baddrLow6 = new byte[16]; byte[] baddrHigh6 = new byte[16]; Array.Copy(data, pos + 1, baddrLow6, 0, 16); Array.Copy(data, pos + 1 + 4, baddrHigh6, 0, 16); conds.Add(new IPAddress(baddrLow6), new IPAddress(baddrHigh6)); break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_PORT: conds.Add(IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, pos + 1))); break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_PORT_RANGE: conds.Add(IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, pos + 1)), IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, pos + 1 + 2))); break; case F2B_FWDATA_TYPE0_ENUM.F2B_FWDATA_PROTOCOL: conds.Add((ProtocolType)data[pos + 1]); break; default: throw new InvalidDataException("Unknown FwData type: " + data[pos]); //break; } pos += size; } return conds; }