/// <summary> /// Create a volume key file using automatic key material generation. /// <para>The Key, and IV sets are generated automatically using the cipher description contained in the <see cref="VTDev.Libraries.CEXEngine.Crypto.Common.CipherDescription"/>. /// This overload creates keying material using the seed and digest engines specified with the <see cref="KeyGenerator"/> class</para> /// </summary> /// /// <param name="Key">The <see cref="VTDev.Libraries.CEXEngine.Crypto.Processing.Structure.VolumeKey">VolumeKey</see> containing the cipher and key implementation details</param> /// <param name="SeedEngine">The <see cref="VTDev.Libraries.CEXEngine.Crypto.Enumeration.SeedGenerators">Random Generator</see> used to create the stage I seed material during key generation.</param> /// <param name="HashEngine">The <see cref="VTDev.Libraries.CEXEngine.Crypto.Enumeration.Digests">Digest Engine</see> used in the stage II phase of key generation.</param> /// /// <returns>A populated VolumeKey</returns> public MemoryStream Create(VolumeKey Key, SeedGenerators SeedEngine = SeedGenerators.CSPRsg, Digests HashEngine = Digests.SHA512) { int ksize = Key.Count * (Key.Description.KeySize + Key.Description.IvSize); byte[] kdata; using (KeyGenerator keyGen = new KeyGenerator(SeedEngine, HashEngine, null)) kdata = keyGen.GetBytes(ksize); MemoryStream keyStream = new MemoryStream(); byte[] hdr = Key.ToBytes(); keyStream.Write(hdr, 0, hdr.Length); keyStream.Write(kdata, 0, kdata.Length); keyStream.Seek(0, SeekOrigin.Begin); return(keyStream); }
private void UpdateKey() { byte[] ks = m_volumeKey.ToBytes(); m_keyStream.Seek(0, SeekOrigin.Begin); m_keyStream.Write(ks, 0, ks.Length); }