Exemplo n.º 1
0
        /// <summary>
        ///     Initializes a new instance of a stream multiplexer.
        /// </summary>
        /// <param name="writing">If set to <c>true</c>, writing a multiplexed stream.</param>
        /// <param name="multiplexedStream">
        ///     Stream being written to (destination; multiplexing) or read from (source;
        ///     demultiplexing).
        /// </param>
        /// <param name="payloadItems">Payload items to write.</param>
        /// <param name="itemPreKeys">Pre-keys for items (indexed by item identifiers).</param>
        /// <param name="config">Configuration of stream selection and padding scheme.</param>
        public FrameshiftPayloadMux(bool writing, Stream multiplexedStream, IReadOnlyList <PayloadItem> payloadItems,
                                    IReadOnlyDictionary <Guid, byte[]> itemPreKeys, PayloadConfiguration config)
            : base(writing, multiplexedStream, payloadItems, itemPreKeys, config)
        {
            var frameshiftConfig =
                config.SchemeConfiguration.DeserialiseDto <RangeConfiguration>();

            if (frameshiftConfig.Minimum < MinimumPaddingLength)
            {
                throw new ArgumentOutOfRangeException("config",
                                                      "Minimum padding length is below specification minimum.");
            }
            if (frameshiftConfig.Maximum < MaximumPaddingLength)
            {
                throw new ArgumentOutOfRangeException("config",
                                                      "Maximum padding length is above specification maximum.");
            }

            _minPadding  = frameshiftConfig.Minimum;
            _maxPadding  = frameshiftConfig.Maximum;
            _paddingMode = _minPadding == _maxPadding
                ? FrameshiftPaddingMode.FixedLength
                : FrameshiftPaddingMode.VariableLength;
            _paddingBuffer = new byte[_maxPadding];
        }
        public static PayloadConfiguration CreateFrameshiftPrecomputedVariable(int items, int?minPadding = null,
                                                                               int?maxPadding            = null)
        {
            if (items < 1)
            {
                throw new ArgumentOutOfRangeException("items");
            }
            CheckFrameshiftArgumentsValid(minPadding, maxPadding);

            int min = minPadding ?? FrameshiftPayloadMux.MinimumPaddingLength;
            int max = maxPadding ?? FrameshiftPayloadMux.MaximumPaddingLength;

            byte[] entropy = GeneratePreallocatedEntropy(PayloadLayoutScheme.Frameshift, items, min, max);

            var config = new PayloadConfiguration {
                SchemeName          = PayloadLayoutScheme.Frameshift.ToString(),
                SchemeConfiguration = new RangeConfiguration {
                    Minimum = min,
                    Maximum = max
                }.SerialiseDto(),
                EntropyScheme     = PayloadMuxEntropyScheme.Preallocation,
                EntropySchemeData = entropy
            };

            return(config);
        }
        public static PayloadConfiguration CreateSimple(CsPseudorandomNumberGenerator csprngEnum)
        {
            var config = new PayloadConfiguration {
                SchemeName        = PayloadLayoutScheme.Simple.ToString(),
                EntropyScheme     = PayloadMuxEntropyScheme.StreamCipherCsprng,
                EntropySchemeData = CsPrngFactory.CreateStreamCipherCsprngConfiguration(csprngEnum).SerialiseDto()
            };

            return(config);
        }
Exemplo n.º 4
0
        /// <summary>
        ///     Initializes a new instance of a payload multiplexer.
        /// </summary>
        /// <param name="writing">If set to <c>true</c>, writing a multiplexed stream (payload); otherwise, reading.</param>
        /// <param name="multiplexedStream">
        ///     Stream being written to (destination; multiplexing) or read from (source;
        ///     demultiplexing).
        /// </param>
        /// <param name="payloadItems">Payload items to write.</param>
        /// <param name="itemPreKeys">Pre-keys for items (indexed by item identifiers).</param>
        /// <param name="config">Configuration of stream selection.</param>
        public SimplePayloadMux(bool writing, Stream multiplexedStream, IReadOnlyList <PayloadItem> payloadItems,
                                IReadOnlyDictionary <Guid, byte[]> itemPreKeys, PayloadConfiguration config)
            : base(writing, multiplexedStream, payloadItems, itemPreKeys)
        {
            if (config == null)
            {
                throw new ArgumentNullException("config");
            }

            EntropySource = new MuxEntropySourceFacade(writing, config);
        }
        public static PayloadConfiguration CreateSimplePreallocated(int items)
        {
            byte[] entropy = GeneratePreallocatedEntropy(PayloadLayoutScheme.Simple, items, -1, -1);

            var config = new PayloadConfiguration {
                SchemeName        = PayloadLayoutScheme.Simple.ToString(),
                EntropyScheme     = PayloadMuxEntropyScheme.Preallocation,
                EntropySchemeData = entropy
            };

            return(config);
        }
        public static PayloadConfiguration CreateFabricVariable(CsPseudorandomNumberGenerator csprngEnum, int?minStripe = null,
                                                                int?maxStripe = null)
        {
            CheckFabricArgumentsValid(minStripe, maxStripe);

            var config = new PayloadConfiguration {
                SchemeName          = PayloadLayoutScheme.Fabric.ToString(),
                SchemeConfiguration = new RangeConfiguration {
                    Minimum = (minStripe == null ? FabricPayloadMux.MinimumStripeLength : minStripe.Value),
                    Maximum = (maxStripe == null ? FabricPayloadMux.MaximumStripeLength : maxStripe.Value)
                }.SerialiseDto(),
                EntropyScheme     = PayloadMuxEntropyScheme.StreamCipherCsprng,
                EntropySchemeData = CsPrngFactory.CreateStreamCipherCsprngConfiguration(csprngEnum).SerialiseDto()
            };

            return(config);
        }
        public static PayloadConfiguration CreateFrameshiftFixed(CsPseudorandomNumberGenerator csprngEnum, int?paddingSize = null)
        {
            int fixedSize = paddingSize == null ? FrameshiftPayloadMux.DefaultFixedPaddingLength : paddingSize.Value;

            if (fixedSize.IsBetween(FrameshiftPayloadMux.MinimumPaddingLength, FrameshiftPayloadMux.MaximumPaddingLength) == false)
            {
                throw new ArgumentOutOfRangeException("paddingSize", "Padding size not within specification.");
            }

            var config = new PayloadConfiguration {
                SchemeName          = PayloadLayoutScheme.Frameshift.ToString(),
                SchemeConfiguration = new RangeConfiguration {
                    Minimum = fixedSize,
                    Maximum = fixedSize,
                }.SerialiseDto(),
                EntropyScheme     = PayloadMuxEntropyScheme.StreamCipherCsprng,
                EntropySchemeData = CsPrngFactory.CreateStreamCipherCsprngConfiguration(csprngEnum).SerialiseDto()
            };

            return(config);
        }
Exemplo n.º 8
0
        /// <summary>
        ///     Initializes a new instance of a payload multiplexer.
        /// </summary>
        /// <param name="writing">If set to <c>true</c>, writing a multiplexed stream.</param>
        /// <param name="multiplexedStream">
        ///     Stream being written to (destination; multiplexing) or read from (source;
        ///     demultiplexing).
        /// </param>
        /// <param name="payloadItems">Payload items to write.</param>
        /// <param name="itemPreKeys">Pre-keys for items (indexed by item identifiers).</param>
        /// <param name="config">Configuration of stream selection and stripe scheme.</param>
        /// <exception cref="ArgumentOutOfRangeException">Stripe size not within specification range.</exception>
        public FabricPayloadMux(bool writing, Stream multiplexedStream, IReadOnlyList <PayloadItem> payloadItems,
                                IReadOnlyDictionary <Guid, byte[]> itemPreKeys, PayloadConfiguration config)
            : base(writing, multiplexedStream, payloadItems, itemPreKeys, config)
        {
            var fabricConfig = config.SchemeConfiguration.DeserialiseDto <RangeConfiguration>();

            if (fabricConfig.Minimum < MinimumStripeLength)
            {
                throw new ArgumentOutOfRangeException("config",
                                                      "Minimum stripe length is below specification minimum.");
            }
            if (fabricConfig.Maximum > MaximumStripeLength)
            {
                throw new ArgumentOutOfRangeException("config",
                                                      "Maximum stripe length is above specification minimum.");
            }

            _minStripe  = fabricConfig.Minimum;
            _maxStripe  = fabricConfig.Maximum;
            _stripeMode = _minStripe == _maxStripe ? FabricStripeMode.FixedLength : FabricStripeMode.VariableLength;
        }
Exemplo n.º 9
0
        /// <summary>
        ///     Instantiates and returns a payload I/O module implementing the mode of operation that the
        ///     instance this method was called from describes.
        /// </summary>
        /// <param name="schemeEnum">Payload layout scheme to choose the correspknding multiplexer.</param>
        /// <param name="writing">Whether the multiplexer will be multiplexing or demultiplexing.</param>
        /// <param name="multiplexedStream">Stream to multiplex/demultiplex to/from.</param>
        /// <param name="payloadItems"></param>
        /// <param name="itemPreKeys"></param>
        /// <param name="config">Configuration of the layout module/multiplexer.</param>
        /// <returns>
        ///     An module object deriving from PayloadMultiplexer.
        /// </returns>
        public static PayloadMux CreatePayloadMultiplexer(PayloadLayoutScheme schemeEnum, bool writing,
                                                          Stream multiplexedStream, List <PayloadItem> payloadItems,
                                                          IReadOnlyDictionary <Guid, byte[]> itemPreKeys,
                                                          PayloadConfiguration config)
        {
            switch (schemeEnum)
            {
            case PayloadLayoutScheme.Simple:
                return(new SimplePayloadMux(writing, multiplexedStream, payloadItems, itemPreKeys, config));

            case PayloadLayoutScheme.Frameshift:
                return(new FrameshiftPayloadMux(writing, multiplexedStream, payloadItems, itemPreKeys, config));

#if INCLUDE_FABRIC
            case PayloadLayoutScheme.Fabric:
                return(new FabricPayloadMux(writing, multiplexedStream, payloadItems, itemPreKeys, config));
#endif
            default:
                throw new ArgumentException("Scheme unsupported.", "schemeEnum");
            }
        }
Exemplo n.º 10
0
        public void Fabric_Fixed()
        {
            var inputObj = new PayloadConfiguration()
            {
                SchemeName          = PayloadLayoutScheme.Fabric.ToString(),
                SchemeConfiguration = new RangeConfiguration {
                    Minimum = FabricPayloadMux.DefaultFixedStripeLength,
                    Maximum = FabricPayloadMux.DefaultFixedStripeLength
                }.SerialiseDto(),
                EntropyScheme     = PayloadMuxEntropyScheme.StreamCipherCsprng,
                EntropySchemeData = CsPrngFactory.CreateStreamCipherCsprngConfiguration(
                    CsPseudorandomNumberGenerator.Sosemanuk).SerialiseDto <StreamCipherCsprngConfiguration>()
            };

            var stream = SerialiseToMemory(inputObj);

            stream.Seek(0, SeekOrigin.Begin);
            var outputObj = DeserialiseFromMemory <PayloadConfiguration>(stream);

            bool equal = inputObj.Equals(outputObj);

            Assert.IsTrue(equal);
        }
Exemplo n.º 11
0
        protected void DoMux(PayloadConfiguration payloadConfig, List <PayloadItem> items, List <FileInfo> files, bool outputPayload = false)
        {
            var ms = new MemoryStream();

            for (var index = 0; index < items.Count; index++)
            {
                var index1 = index;
                items[index].SetStreamBinding(() => new FileStream(files[index1].FullName, FileMode.Open));
                items[index].ExternalLength = items[index].StreamBinding.Length;
            }

            var itemPreKeys = new Dictionary <Guid, byte[]> ();

            var mux = PayloadMuxFactory.CreatePayloadMultiplexer(payloadConfig.SchemeName.ToEnum <PayloadLayoutScheme>(), true, ms,
                                                                 items, itemPreKeys, payloadConfig);

            Assert.DoesNotThrow(mux.Execute);

            Debug.Print("\n##### END OF MUXING OPERATION #####\n");

            foreach (var item in items)
            {
                item.StreamBinding.Close();
            }

            // Write out muxed payload - optional
            if (outputPayload)
            {
                if (!DestinationDirectory.Exists)
                {
                    DestinationDirectory.Create();
                }
                var path = DestinationDirectory.FullName + Path.DirectorySeparatorChar +
                           payloadConfig.SchemeName.ToLower() + IOTestBase.RawPayloadExtension;
                using (var fs = new FileStream(path, FileMode.Create)) {
                    ms.WriteTo(fs);
                }
            }

            // DEMUX

            var demuxPath = DestinationDirectory.FullName + Path.DirectorySeparatorChar + DemuxDir;

            if (!Directory.Exists(demuxPath))
            {
                Directory.CreateDirectory(demuxPath);
            }
            foreach (var payloadItem in items)
            {
                PayloadItem item = payloadItem;
                payloadItem.SetStreamBinding(() => new FileStream(demuxPath + Path.DirectorySeparatorChar + item.Path, FileMode.Create));
            }

            ms.Seek(0, SeekOrigin.Begin);
            mux = PayloadMuxFactory.CreatePayloadMultiplexer(payloadConfig.SchemeName.ToEnum <PayloadLayoutScheme>(), false, ms,
                                                             items, itemPreKeys, payloadConfig);

            Assert.DoesNotThrow(mux.Execute);

            Debug.Print("\n##### END OF DEMUXING OPERATION #####\n");

            foreach (var item in items)
            {
                item.StreamBinding.Close();
            }

            if (mux is FrameshiftPayloadMux)
            {
                Assert.Pass("Overhead: {0} bytes", ((FrameshiftPayloadMux)mux).Overhead);
            }
            else
            {
                Assert.Pass();
            }
        }