Ejemplo n.º 1
0
        public void WriteTest3()
        {
            var expected = new byte[0x40];

            expected[0x35] = 0x02;
            expected[0x36] = 0x02;
            Encrypt(expected, new byte[0x10]);

            var content = new byte[0x30];

            Encrypt(content, new byte[0x10]);
            var ms = new MemoryStream();

            ms.Write(content, 0, 0x30);
            ms.Position = 0;
            var xts = new XtsStream(ms, new byte[0x20], new byte[0x10], true, false, 0x20);

            xts.Position = 0x35;
            xts.Write(new byte[] { 0x02, 0x02 }, 0, 2);
            xts.Flush();

            Assert.AreEqual(0x40, xts.Length);
            Assert.IsTrue(ms.ToArray().SequenceEqual(expected));
            Assert.AreEqual(0x40, xts.Position);
            Assert.AreEqual(0, ms.Position);
        }
Ejemplo n.º 2
0
        public void ReadTest1()
        {
            var key      = new byte[32];
            var final    = new byte[] { 0x3a, 0x18, 0xda, 0xa2, 0xca, 0x3b, 0x3a, 0x64, 0x58, 0xe5, 0xaf, 0xac, 0xbc, 0x48, 0x95, 0x8e };
            var ms       = new MemoryStream(final);
            var xts      = new XtsStream(ms, key, new byte[16], true, false, 0x30);
            var result   = new byte[16];
            var expected = new byte[16];

            expected[0xf] = 0x01;

            xts.Read(result, 0, 16);

            Assert.IsTrue(result.SequenceEqual(expected));
            Assert.AreEqual(16, xts.Position);
            Assert.AreEqual(0, ms.Position);
        }
Ejemplo n.º 3
0
 public static byte[] DecryptNCAHeader(string selectedFile, long offset)
 {
     byte[] array = new byte[3072];
     if (File.Exists(selectedFile))
     {
         FileStream fileStream = new FileStream(selectedFile, FileMode.Open, FileAccess.Read);
         fileStream.Position = offset;
         fileStream.Read(array, 0, 3072);
         File.WriteAllBytes(selectedFile + ".tmp", array);
         Xts xts = XtsAes128.Create(Form1.NcaHeaderEncryptionKey1_Prod, Form1.NcaHeaderEncryptionKey2_Prod);
         using (BinaryReader binaryReader = new BinaryReader(File.OpenRead(selectedFile + ".tmp"))) {
             using (XtsStream xtsStream = new XtsStream(binaryReader.BaseStream, xts, 512)) {
                 xtsStream.Read(array, 0, 3072);
             }
         }
         File.Delete(selectedFile + ".tmp");
         fileStream.Close();
     }
     return(array);
 }
Ejemplo n.º 4
0
        /* Switched to MemoryStream and simplified code
         * No idea if anything broke
         */
        public static byte[] DecryptNCAHeader(string selectedFile, long offset)
        {
            byte[] array = new byte[3072];
            if (File.Exists(selectedFile))
            {
                using (var stream = new MemoryStream()) {
                    FileStream fs = new FileStream(selectedFile, FileMode.Open, FileAccess.Read);
                    fs.Position = offset;
                    fs.Read(array, 0, 3072);
                    fs.Close();

                    stream.Write(array, 0, array.Length);
                    stream.Position = 0;

                    Xts xts = XtsAes128.Create(Form1.NcaHeaderEncryptionKey1_Prod, Form1.NcaHeaderEncryptionKey2_Prod);
                    using (XtsStream xtsStream = new XtsStream(stream, xts, 512)) {
                        xtsStream.Read(array, 0, 3072);
                    }
                }
            }
            return(array);
        }
Ejemplo n.º 5
0
        public void ReadTest2()
        {
            var toEncrypt = new byte[0x10];
            var sectorId  = new byte[0x10];

            sectorId[0xf] = 0x01;
            Encrypt(toEncrypt, sectorId);

            var content = new byte[0x30];

            Array.Copy(toEncrypt, 0, content, 0x20, 0x10);
            var ms       = new MemoryStream(content);
            var xts      = new XtsStream(ms, new byte[32], new byte[16], true, false, 0x20);
            var result   = new byte[16];
            var expected = new byte[16];

            xts.Position = 32;
            xts.Read(result, 0, 16);

            Assert.IsTrue(result.SequenceEqual(expected));
            Assert.AreEqual(48, xts.Position);
            Assert.AreEqual(0, ms.Position);
        }
Ejemplo n.º 6
0
        private void IdentifyInformation(Stream nca)
        {
            var bkPos = nca.Position;

            nca.Position = 0x200;
            var magic = new byte[4];

            nca.Read(magic, 0, 4);
            nca.Position = bkPos;

            var header = nca;

            if (!Enum.TryParse <NcaVersion>(Encoding.ASCII.GetString(magic), out var ver))
            {
                var xts = new XtsStream(nca, _keyStorage.HeaderKey, new byte[0x10], true, false, NcaConstants.MediaSize)
                {
                    Position = 0x200
                };
                xts.Read(magic, 0, 4);

                if (!Enum.TryParse(Encoding.ASCII.GetString(magic), out ver))
                {
                    throw new InvalidOperationException("No valid Nca.");
                }

                header = new NcaHeaderStream(nca, ver, _keyStorage.HeaderKey);
            }

            NcaVersion = ver;

            IdentifyMasterKeyRevision(header);
            IdentifyEncryptedKeyArea(header);
            IdentifyEncryptedTitleKey(header);
            IdentifyTitleId(header);
            IdentifyBodySections(header);
            header.Position = 0;
        }
Ejemplo n.º 7
0
        private Task <bool> DoCipher(Stream input, Stream output, IProgress <ProgressReport> progress, bool decrypt)
        {
            var key = OnRequestKey("AES256 XTS Key", 64, out var error);

            if (key == null)
            {
                return(Task.Factory.StartNew(() =>
                {
                    progress.Report(new ProgressReport {
                        Percentage = 0, Message = error
                    });
                    return false;
                }));
            }

            var sectorSize = OnRequestNumber("AES256 XTS SectorSize", 512, out error);

            if (!string.IsNullOrEmpty(error))
            {
                return(Task.Factory.StartNew(() =>
                {
                    progress.Report(new ProgressReport
                    {
                        Percentage = 0,
                        Message = error
                    });
                    return false;
                }));
            }

            return(Task.Factory.StartNew(() =>
            {
                progress.Report(new ProgressReport {
                    Percentage = 0, Message = decrypt ? "Decryption..." : "Encryption..."
                });

                using (var xts = new XtsStream(decrypt ? input : output, key, new byte[32], true, true, (int)sectorSize))
                {
                    var buffer = new byte[0x10000];
                    var totalLength = decrypt ? xts.Length : input.Length;
                    while (xts.Position < totalLength)
                    {
                        var length = (int)Math.Min(0x10000, totalLength - xts.Position);

                        if (decrypt)
                        {
                            xts.Read(buffer, 0, length);
                            output.Write(buffer, 0, length);
                        }
                        else
                        {
                            input.Read(buffer, 0, length);
                            xts.Write(buffer, 0, length);
                        }

                        progress.Report(new ProgressReport {
                            Percentage = (double)xts.Position / totalLength * 100, Message = decrypt ? "Decryption..." : "Encryption...",
                        });
                    }
                }

                progress.Report(new ProgressReport {
                    Percentage = 100, Message = decrypt ? "Decryption finished." : "Encryption finished."
                });

                return true;
            }));
        }