public static byte[] EncryptOuterContainer(OuterContainer outerContainer, InnerContainer innerContainer, byte[] key) { XmlDocument outerContainerXml = SerializeOuterContainer(outerContainer); XmlDocument innerContainerXml = SerializeInnerContainer(innerContainer); XmlElement encryptedDataPlaceholder = outerContainerXml.GetElementsByTagName("EncryptedDataPlaceholder")[0] as XmlElement; XmlElement plaintextInnerContainer = innerContainerXml.GetElementsByTagName("InnerContainer")[0] as XmlElement; EncryptedData encryptedData = new EncryptedData(); encryptedData.Type = EncryptedXml.XmlEncElementUrl; encryptedData.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES256Url); EncryptedXml encryptedXml = new EncryptedXml(); using (AesCryptoServiceProvider aesCsp = new AesCryptoServiceProvider()) { aesCsp.KeySize = 256; // critical security parameter aesCsp.Key = key; // critical security parameter aesCsp.Mode = CipherMode.CBC; // critical security parameter aesCsp.GenerateIV(); // critical security parameter encryptedData.CipherData.CipherValue = encryptedXml.EncryptData(plaintextInnerContainer, aesCsp, false); } EncryptedXml.ReplaceElement(encryptedDataPlaceholder, encryptedData, false); byte[] outerContainerBytes = Encoding.UTF8.GetBytes(outerContainerXml.OuterXml); byte[] fileBytes = Shared.Utility.Compress(outerContainerBytes); return(fileBytes); }
public static InnerContainer CreateInnerContainer() { InnerContainer innerContainer = new InnerContainer(); innerContainer.Version = "1.0"; innerContainer.Keys = new ObservableCollection <KeyItem>(); innerContainer.NextKeyNumber = 1; innerContainer.Groups = new ObservableCollection <GroupItem>(); innerContainer.NextGroupNumber = 1; return(innerContainer); }
public static XmlDocument SerializeInnerContainer(InnerContainer innerContainer) { XmlDocument doc = new XmlDocument(); XmlDeclaration xmlDeclaration = doc.CreateXmlDeclaration("1.0", "UTF-8", null); doc.InsertBefore(xmlDeclaration, doc.DocumentElement); XPathNavigator nav = doc.CreateNavigator(); using (XmlWriter w = nav.AppendChild()) { XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add(string.Empty, string.Empty); // remove xsd and xsi attributes XmlSerializer s = new XmlSerializer(typeof(InnerContainer)); s.Serialize(w, innerContainer, ns); } return(doc); }