Ejemplo n.º 1
0
        public static void PackSng(Stream input, Stream output, Platform platform)
        {
            EndianBitConverter conv = platform.GetBitConverter;
            Int32 platformHeader    = 3;

            if (conv == EndianBitConverter.Big)
            {
                platformHeader = 1;
            }

            using (var w = new EndianBinaryWriter(conv, output))
                using (var zData = new MemoryStream())
                    using (var plain = new MemoryStream())
                        using (var encrypted = new MemoryStream())
                            using (var encw = new EndianBinaryWriter(conv, plain))
                            {
                                w.Write((Int32)0x4A);
                                w.Write(platformHeader);

                                // pack with zlib
                                RijndaelEncryptor.Zip(input, zData, input.Length);

                                if (platformHeader == 3)
                                {
                                    // write size of uncompressed data and packed data itself | already there
                                    encw.Write((Int32)input.Length);
                                    encw.Write(zData.ToArray());
                                    encw.Flush();

                                    // choose key
                                    byte[] key;
                                    switch (platform.platform)
                                    {
                                    case GamePlatform.Mac:
                                        key = RijndaelEncryptor.SngKeyMac;
                                        break;

                                    default: //PC
                                        key = RijndaelEncryptor.SngKeyPC;
                                        break;
                                    }
                                    // encrypt (writes 16B IV and encrypted data)
                                    plain.Position = 0;
                                    RijndaelEncryptor.EncryptSngData(plain, encrypted, key);
                                    w.Write(encrypted.ToArray());
                                    // append zero signature
                                    w.Write(new Byte[56]);
                                }
                                else
                                {
                                    // unencrypted and unsigned
                                    w.Write((Int32)input.Length);
                                    w.Write(zData.ToArray());
                                }

                                output.Flush();
                            }
        }
Ejemplo n.º 2
0
        public static void PackSng(Stream input, Stream output, Platform platform)
        {
            EndianBitConverter conv;
            Int32 platformHeader;

            switch (platform.platform)
            {
            case GamePlatform.Pc:
            case GamePlatform.Mac:
                // Desktop
                conv           = EndianBitConverter.Little;
                platformHeader = 3;
                break;

            case GamePlatform.XBox360:
            case GamePlatform.PS3:
                // Console
                conv           = EndianBitConverter.Big;
                platformHeader = 1;
                break;

            default:
                conv           = EndianBitConverter.Little;
                platformHeader = 3;
                break;
            }

            using (EndianBinaryWriter w = new EndianBinaryWriter(conv, output)) {
                w.Write((Int32)0x4A);
                w.Write(platformHeader);

                byte[] inputChartData = null;
                using (var mStream = new MemoryStream())
                {
                    input.CopyTo(mStream);
                    inputChartData = mStream.ToArray();
                }

                // pack with zlib
                MemoryStream  zData = new MemoryStream();
                ZOutputStream zOut  = new ZOutputStream(zData, zlib.zlibConst.Z_BEST_COMPRESSION);
                zOut.Write(inputChartData, 0, inputChartData.Length);
                zOut.finish();
                byte[] packed = zData.ToArray();

                if (platformHeader == 3)
                {
                    MemoryStream encrypted = new MemoryStream();
                    MemoryStream plain     = new MemoryStream();
                    var          encw      = new EndianBinaryWriter(conv, plain);
                    // write size of uncompressed data and packed data itself
                    encw.Write((Int32)inputChartData.Length);
                    encw.Write(packed);
                    encw.Flush();
                    MemoryStream inputPlainStream = new MemoryStream(plain.ToArray());

                    // choose key
                    byte[] key;
                    switch (platform.platform)
                    {
                    case GamePlatform.Mac:
                        key = RijndaelEncryptor.SngKeyMac;
                        break;

                    default:     //PC
                        key = RijndaelEncryptor.SngKeyPC;
                        break;
                    }

                    // encrypt (writes 16B IV and encrypted data)
                    RijndaelEncryptor.EncryptSngData(inputPlainStream, encrypted, key);
                    w.Write(encrypted.ToArray());
                    // append zero signature
                    w.Write(new Byte[56]);
                }
                else
                {
                    // unencrypted and unsigned
                    w.Write((Int32)inputChartData.Length);
                    w.Write(packed);
                }

                output.Flush();
            }
        }