public Rc4RandomGenerator(IBuffer key) { if (key == null) throw new ArgumentNullException("key"); _state = new byte[256]; var keyLength = key.Length; for (uint w = 0; w < 256; ++w) _state[w] = (byte)w; unchecked { byte j = 0; uint keyIndex = 0; for (uint w = 0; w < 256; ++w) // Key setup { j += (byte)(_state[w] + key.GetByte(keyIndex)); var temp = _state[0]; _state[0] = _state[j]; _state[j] = temp; ++keyIndex; if (keyIndex >= keyLength) keyIndex = 0; } } GetRandomBytes(512); }
/// <summary> /// Parse the headers fields. /// </summary> /// <param name="input">The input stream.</param> /// <param name="buffer">The header bytes reader.</param> /// <returns>The file headers.</returns> private static async Task<FileHeaders> GetHeaders( IInputStream input, IBuffer buffer) { var result = new FileHeaders(); while (true) { buffer = await input.ReadAsync(buffer, 3); var field = (HeaderFields)buffer.GetByte(0); var size = BitConverter.ToUInt16(buffer.ToArray(1, 2), 0); if (size > 0) buffer = await input.ReadAsync(buffer, size); switch (field) { case HeaderFields.EndOfHeader: return result; case HeaderFields.CompressionFlags: result.UseGZip = buffer.GetByte(0) == 1; break; case HeaderFields.EncryptionIV: result.EncryptionIV = buffer .ToArray().AsBuffer(); break; case HeaderFields.MasterSeed: result.MasterSeed = buffer .ToArray().AsBuffer(); break; case HeaderFields.StreamStartBytes: result.StartBytes = buffer .ToArray().AsBuffer(); break; case HeaderFields.TransformSeed: result.TransformSeed = buffer .ToArray().AsBuffer(); break; case HeaderFields.TransformRounds: result.TransformRounds = BitConverter.ToUInt64( buffer.ToArray(), 0); break; case HeaderFields.ProtectedStreamKey: result.ProtectedStreamKey = buffer .ToArray().AsBuffer(); break; case HeaderFields.InnerRandomStreamID: result.RandomAlgorithm = (CrsAlgorithm) BitConverter.ToUInt32(buffer.ToArray(), 0); break; } } }