Esempio n. 1
0
        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());
            }
        }