Example #1
0
        public static Keys Decode(Stream inStream)
        {
            int length;

            using (BinReader r = new BinReader(inStream))
            {
                length = r.ReadInt32();
            }

            if (length == 0)
                return EmptyKeys;

            try
            {
                Keys keys = new Keys();

                for (; length > 0; length--)
                {
                    using (BinReader r = new BinReader(inStream))
                    {
                        KeyScheme scheme = KeyScheme.SchemeFor(r.ReadInt32());
                        int keySetCount = r.ReadInt32();

                        if (scheme.IsDual())
                        {
                            if (keySetCount != 2)
                                throw new ProtocolCodecException("Dual key scheme with " + keySetCount + " key sets");

                            DualKeySet keyset = keys.NewKeysetFor((DualKeyScheme)scheme);

                            DecodeKeys(inStream, keyset.ProducerKeys);
                            DecodeKeys(inStream, keyset.ConsumerKeys);
                        }
                        else
                        {
                            if (keySetCount != 1)
                                throw new ProtocolCodecException
                                  ("Single key scheme with " + keySetCount + " key sets");

                            DecodeKeys(inStream, keys.NewKeysetFor((SingleKeyScheme)scheme));
                        }
                    }
                }

                return keys;
            }
            catch (ArgumentException ex)
            {
                // most likely an invalid KeyScheme ID
                throw new ProtocolCodecException("Could not decode keys.", ex);
            }
        }