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