예제 #1
0
        public static byte[] XTS(byte[] Key1, byte[] Key2, int SectorSize, byte[] Data, ulong Sector, bool Encrypt)
        {
            byte[]             TransformedBytes, BlockData;
            Xts                XTS128 = XtsAes128.Create(Key1, Key2);
            int                Blocks;
            var                MemStrm = new MemoryStream();
            var                Writer  = new BinaryWriter(MemStrm);
            XtsCryptoTransform CryptoTransform;

            if (Encrypt)
            {
                CryptoTransform = XTS128.CreateEncryptor();
            }
            else
            {
                CryptoTransform = XTS128.CreateDecryptor();
            }
            BlockData = new byte[SectorSize];
            Blocks    = Data.Length / SectorSize;
            for (int i = 0; i < Blocks; i++)
            {
                CryptoTransform.TransformBlock(Data, i * SectorSize, SectorSize, BlockData, 0, Sector++);
                Writer.Write(BlockData);
            }
            TransformedBytes = MemStrm.ToArray();
            return(TransformedBytes);
        }
예제 #2
0
파일: Nand.cs 프로젝트: robwilkes/LibHac
        public Stream OpenProdInfo()
        {
            SparseStream encStream = ProdInfo.Open();
            Xts          xts       = XtsAes128.Create(Keyset.BisKeys[0]);
            var          decStream = new RandomAccessSectorStream(new XtsSectorStream(encStream, xts, 0x4000, 0), true);

            return(decStream);
        }
예제 #3
0
파일: Nand.cs 프로젝트: robwilkes/LibHac
        public NandPartition OpenUserPartition()
        {
            SparseStream encStream = User.Open();
            Xts          xts       = XtsAes128.Create(Keyset.BisKeys[3]);
            var          decStream = new RandomAccessSectorStream(new XtsSectorStream(encStream, xts, 0x4000, 0), true);
            var          fat       = new FatFileSystem(decStream, Ownership.None);

            return(new NandPartition(fat));
        }
예제 #4
0
        public Nax0(Keyset keyset, Stream stream, string sdPath, bool keepOpen)
        {
            stream.Position = 0;
            KeepOpen        = keepOpen;
            ReadHeader(stream);
            DeriveKeys(keyset, sdPath, stream);

            stream.Position = 0x4000;
            Xts xts = XtsAes128.Create(Keys[0], Keys[1]);

            Stream = new RandomAccessSectorStream(new XtsSectorStream(stream, xts, 0x4000, 0x4000), keepOpen);
        }
예제 #5
0
        public static byte[] XTS128(byte[] block, byte[] key, int block_size, bool _nin_tweak = false, int section_id = 0)
        {
            var result = new byte[block.Length];

            var xts = XtsAes128.Create(key, _nin_tweak);

            using (var transform = xts.CreateDecryptor())
            {
                for (int i = 0; i < block.Length / block_size; i++)
                {
                    transform.TransformBlock(block, i * block_size, block_size, result, i * block_size, Convert.ToUInt64(section_id++));
                }
            }

            return(result);
        }
예제 #6
0
        // Thanks, Falo!
        public static byte[] AES_XTS(byte[] Key1, byte[] Key2, int SectorSize, byte[] Data, ulong Sector)
        {
            byte[] BlockData;
            Xts    XTS128 = XtsAes128.Create(Key1, Key2, true);
            int    Blocks;
            var    MemStrm         = new MemoryStream();
            var    Writer          = new BinaryWriter(MemStrm);
            var    CryptoTransform = XTS128.CreateEncryptor();

            BlockData = new byte[SectorSize];
            Blocks    = Data.Length / SectorSize;
            for (int i = 0; i < Blocks; i++)
            {
                CryptoTransform.TransformBlock(Data, i * SectorSize, SectorSize, BlockData, 0, Sector++);
                Writer.Write(BlockData);
            }
            return(MemStrm.ToArray());
        }
예제 #7
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);
 }
예제 #8
0
파일: Util.cs 프로젝트: xuhom/XCI-Organizer
        /* 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);
        }