private byte[] GenXML() { using (var stream = new MemoryStream()) { using (var writer = new XmlTextWriter(stream, Encoding.UTF8)) { writer.Formatting = Formatting.Indented; writer.WriteStartDocument(); { writer.WriteStartElement("ContentMeta"); { writer.WriteStartElement("Type"); writer.WriteString(Type.ToString()); writer.WriteEndElement(); writer.WriteStartElement("Id"); writer.WriteString("0x" + TitleID.ToHexString()); writer.WriteEndElement(); writer.WriteStartElement("Version"); writer.WriteString(Version.ToString()); writer.WriteEndElement(); writer.WriteStartElement("RequiredDownloadSystemVersion"); writer.WriteString(DLSystemVersion.ToString()); writer.WriteEndElement(); var entries = Parse(); foreach (var entry in entries) { writer.WriteStartElement("Content"); { writer.WriteStartElement("Type"); writer.WriteString(entry.Type.ToString()); writer.WriteEndElement(); writer.WriteStartElement("Id"); writer.WriteString(entry.ID.ToHexString()); writer.WriteEndElement(); writer.WriteStartElement("Size"); writer.WriteString(entry.Size.ToString()); writer.WriteEndElement(); writer.WriteStartElement("Hash"); writer.WriteString(entry.Hash.ToHexString()); writer.WriteEndElement(); writer.WriteStartElement("KeyGeneration"); writer.WriteString(MKeyRev.ToString()); writer.WriteEndElement(); } writer.WriteEndElement(); } writer.WriteStartElement("Content"); { writer.WriteStartElement("Type"); writer.WriteString(ncaTypes.Meta.ToString()); writer.WriteEndElement(); CnmtFileData = File.ReadAllBytes(Path); var hash = SHA256.Create().ComputeHash(CnmtFileData); CnmtFileName = hash.Take(16).ToArray().ToHexString() + ".cnmt.nca"; XmlFileName = hash.Take(16).ToArray().ToHexString() + ".cnmt.xml"; writer.WriteStartElement("Id"); writer.WriteString(hash.Take(16).ToArray().ToHexString()); writer.WriteEndElement(); writer.WriteStartElement("Size"); writer.WriteString(CnmtFileData.Length.ToString()); writer.WriteEndElement(); writer.WriteStartElement("Hash"); writer.WriteString(hash.ToHexString()); writer.WriteEndElement(); writer.WriteStartElement("KeyGeneration"); writer.WriteString(MKeyRev.ToString()); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteStartElement("Digest"); writer.WriteString(Digest.ToHexString()); writer.WriteEndElement(); writer.WriteStartElement("KeyGenerationMin"); writer.WriteString(MKeyRev.ToString()); writer.WriteEndElement(); writer.WriteStartElement("RequiredSystemVersion"); writer.WriteString(SystemVersion.ToString()); writer.WriteEndElement(); writer.WriteStartElement("PatchId"); { var id = TitleID[6] << 8 | TitleID[7]; id &= 0x1FFF; var patchID = "0x" + TitleID.ToHexString().Substring(0, 13) + (id == 0x800 ? "000" : "800"); writer.WriteString(patchID); } writer.WriteEndElement(); } writer.WriteEndElement(); } writer.WriteEndDocument(); } var output = Encoding.UTF8.GetString(stream.GetBuffer()); var index = output.IndexOf("\0", StringComparison.Ordinal); if (index > 0) { output = output.Substring(0, index); } return(Encoding.UTF8.GetBytes(output).Skip(3).ToArray()); } }