Ejemplo n.º 1
0
        public static byte[] UnscrambledPayload(this SPCMessage message, RSAParameters parameters)
        {
            ArgumentThrow.IfNull(message, $"Invalid {typeof(SPCMessage).Name} to unscramble. Message can not be null.", nameof(message));
            ArgumentThrow.IfNull(parameters, $"Invalid {typeof(SPCMessage).Name} to unscramble. {typeof(RSAParameters).Name} can not be null.", nameof(parameters));

            using (var rsa = RSA.Create())
                using (var aes = Aes.Create())
                {
                    rsa.ImportParameters(parameters);

                    aes.IV      = message.IV;
                    aes.Key     = rsa.Decrypt(message.Key, RSAEncryptionPadding.OaepSHA1);
                    aes.Mode    = CipherMode.CBC;
                    aes.Padding = PaddingMode.None;

                    using (var decryptor = aes.CreateDecryptor())
                        using (var memoryStream = new MemoryStream())
                            using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Write))
                            {
                                cryptoStream.Write(message.ContentPayload);

                                return(memoryStream.ToArray());
                            }
                }
        }
Ejemplo n.º 2
0
        internal DFunction(byte[]  ask, bool encryption = true)
        {
            ArgumentThrow.IfLengthNot(ask, 16, "Only 16-bytes ASKs are valid.", nameof(ask));

            this.ASK        = ask;
            this.encryption = encryption;
        }
Ejemplo n.º 3
0
        public FPExtractor(FPProvider provider)
        {
            ArgumentThrow.IfNull(provider, "Unable to create inspector. Provider can not be null.", nameof(provider));

            this.Providers = new List <FPProvider>()
            {
                provider
            };
        }
Ejemplo n.º 4
0
        internal static byte[] ToBuffer(IEnumerable <TLLVSlab> slabs)
        {
            ArgumentThrow.IfNull(slabs, $"Invalid slabs to serialize. Slab list can not be null.", nameof(slabs));

            var memory = new MemoryStream();

            foreach (var slab in slabs)
            {
                memory.Write(slab.Binary);
            }
            return(memory.ToArray());
        }
Ejemplo n.º 5
0
        public FPServer(FPProvider provider, IContentKeyLocator locator)
        {
            ArgumentThrow.IfNull(provider, "Unable to create server. Provider can not be null.", nameof(provider));
            ArgumentThrow.IfNull(locator, "Unable to create server. Key locator can not be null.", nameof(locator));

            this.Providers = new List <FPProvider>()
            {
                provider
            };
            this.Locator = locator;

            this.LicenseDuration = 3600;
        }
Ejemplo n.º 6
0
        internal static IEnumerable <TLLVSlab> FromBuffer(byte[] buffer)
        {
            ArgumentThrow.IfNull(buffer, $"Invalid buffer to parse slabs. Buffer can not be null.", nameof(buffer));

            var memory = new ReadOnlyMemory <byte>(buffer);

            IList <TLLVSlab> slabs = new List <TLLVSlab>();

            while (memory.Length > 0)
            {
                var slab = new TLLVSlab(memory);
                slabs.Add(slab);
                memory = memory.Slice((int)slab.Length);
            }
            return(slabs);
        }
Ejemplo n.º 7
0
        public static byte[] UnscrambledParcel(this SKR1Payload payload, byte[] key)
        {
            ArgumentThrow.IfNull(payload, $"Invalid {typeof(SKR1Payload).Name} to unscramble. Payload can not be null.", nameof(payload));
            ArgumentThrow.IfLengthNot(key, 16, "Invalid key to unscramble. Key buffer should be 16 bytes.", nameof(key));

            using (var aes = Aes.Create())
            {
                aes.IV      = payload.IV;
                aes.Key     = key;
                aes.Mode    = CipherMode.CBC;
                aes.Padding = PaddingMode.None;

                using (var decryptor = aes.CreateDecryptor())
                    using (var memoryStream = new MemoryStream())
                        using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Write))
                        {
                            cryptoStream.Write(payload.Parcel);

                            return(memoryStream.ToArray());
                        }
            }
        }
Ejemplo n.º 8
0
        public static byte[] ScrambledParcel(this EncryptedCKParcel parcel, byte[] key)
        {
            ArgumentThrow.IfNull(parcel, $"Invalid {typeof(EncryptedCKParcel).Name} to scramble. Parcel can not be null.", nameof(parcel));
            ArgumentThrow.IfLengthNot(key, 16, "Invalid key to scramble. Key buffer should be 16 bytes.", nameof(key));

            using (var aes = Aes.Create())
            {
                // aes.IV = null;
                aes.Key     = key;
                aes.Mode    = CipherMode.ECB;
                aes.Padding = PaddingMode.None;

                using (var encryptor = aes.CreateEncryptor())
                    using (var memoryStream = new MemoryStream())
                        using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                        {
                            cryptoStream.Write(parcel.Binary);

                            return(memoryStream.ToArray());
                        }
            }
        }
Ejemplo n.º 9
0
        public static byte[] ScrambledPayload(byte[] payload, byte[] iv, byte[] key)
        {
            ArgumentThrow.IfLengthNotMultiple(payload, 16, "Invalid payload to scramble. The buffer length should be multiple of 16.", nameof(payload));
            ArgumentThrow.IfLengthNot(iv, 16, "Invalid key to scramble. Key buffer should be 16 bytes.", nameof(iv));
            ArgumentThrow.IfLengthNot(key, 16, "Invalid key to scramble. Key buffer should be 16 bytes.", nameof(key));

            using (var aes = Aes.Create())
            {
                aes.IV      = iv;
                aes.Key     = key;
                aes.Mode    = CipherMode.CBC;
                aes.Padding = PaddingMode.None;

                using (var encryptor = aes.CreateEncryptor())
                    using (var memoryStream = new MemoryStream())
                        using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                        {
                            cryptoStream.Write(payload);

                            return(memoryStream.ToArray());
                        }
            }
        }
Ejemplo n.º 10
0
        internal byte[]  DeriveBytes(byte[] bytes)
        {
            ArgumentThrow.IfLackingBytes(bytes, 1, "Invalid derivation buffer. The buffer seems to have a length lower than 1.", nameof(bytes));
            ArgumentThrow.IfTooMuchBytes(bytes, 55, "Invalid derivation buffer. The buffer seems to have a length greater than 55.", nameof(bytes));

            var buffer = new ReadOnlyMemory <byte>(bytes);

            var memory = new Memory <byte>(new byte[64]);

            buffer.CopyTo(memory.Slice(0, buffer.Length));
            BinaryConverter.WriteUInt8(0x80).CopyTo(memory.Slice(buffer.Length, 1));

            UInt32 M1 = Enumerable.Range(0, 7).Select(i => BinaryConverter.ReadUInt32(memory.Slice(i * 4, 4), BinaryConverter.Endianess.BigEndian)).Aggregate((i, j) => i + j);

            for (int i = 0; i < ROUNDS; i++)
            {
                if ((M1 & 1) == 0)
                {
                    M1 = (3 * M1 + 1) % PRIME;
                }
                else
                {
                    M1 >>= 1;
                }
            }
            UInt32 M2 = Enumerable.Range(7, 7).Select(i => BinaryConverter.ReadUInt32(memory.Slice(i * 4, 4), BinaryConverter.Endianess.BigEndian)).Aggregate((i, j) => i + j);

            for (int i = 0; i < ROUNDS; i++)
            {
                if ((M2 & 1) == 0)
                {
                    M2 = (3 * M2 + 1) % PRIME;
                }
                else
                {
                    M2 >>= 1;
                }
            }

            BinaryConverter.WriteUInt32(M1, BinaryConverter.Endianess.LittleEndian).CopyTo(memory.Slice(56, 4));
            BinaryConverter.WriteUInt32(M2, BinaryConverter.Endianess.LittleEndian).CopyTo(memory.Slice(60, 4));

            using (var sha = SHA1.Create())
                using (var aes = Aes.Create())
                {
                    var hash = sha.ComputeHash(memory.ToArray()).Take(16).ToArray();

                    // aes.IV = new byte[16];
                    aes.Key     = this.ASK;
                    aes.Mode    = CipherMode.ECB;
                    aes.Padding = PaddingMode.None;

                    using (var encryptor = aes.CreateEncryptor())
                        using (var memoryStream = new MemoryStream())
                            using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                            {
                                cryptoStream.Write(hash);

                                return(encryption ? memoryStream.ToArray() : hash);
                            }
                }
        }