private static bool TryGetEncryptedPackage(Stream fileStream, CompoundDocument document, string password, out Stream stream)
        {
            var encryptedPackage = document.FindEntry(DirectoryEntryEncryptedPackage);
            var encryptionInfo   = document.FindEntry(DirectoryEntryEncryptionInfo);

            if (encryptedPackage == null || encryptionInfo == null)
            {
                stream = null;
                return(false);
            }

            var infoBytes  = document.ReadStream(fileStream, encryptionInfo.StreamFirstSector, (int)encryptionInfo.StreamSize, encryptionInfo.IsEntryMiniStream);
            var encryption = EncryptionInfo.Create(infoBytes);

            if (encryption.VerifyPassword("VelvetSweatshop"))
            {
                // Magic password used for write-protected workbooks
                password = "******";
            }
            else if (password == null || !encryption.VerifyPassword(password))
            {
                throw new InvalidPasswordException(Errors.ErrorInvalidPassword);
            }

            var secretKey     = encryption.GenerateSecretKey(password);
            var packageStream = document.CreateStream(fileStream, encryptedPackage.StreamFirstSector, (int)encryptedPackage.StreamSize, encryptedPackage.IsEntryMiniStream);

            stream = encryption.CreateEncryptedPackageStream(packageStream, secretKey);
            return(true);
        }
        internal XlsBiffFilePass(byte[] bytes, uint offset, int biffVersion)
            : base(bytes, offset)
        {
            if (biffVersion >= 2 && biffVersion <= 5)
            {
                // Cipher = EncryptionType.XOR;
                var encryptionKey = ReadUInt16(0);
                var hashValue     = ReadUInt16(2);
                EncryptionInfo = EncryptionInfo.Create(encryptionKey, hashValue);
            }
            else
            {
                ushort type = ReadUInt16(0);

                if (type == 0)
                {
                    var encryptionKey = ReadUInt16(2);
                    var hashValue     = ReadUInt16(4);
                    EncryptionInfo = EncryptionInfo.Create(encryptionKey, hashValue);
                }
                else if (type == 1)
                {
                    var encryptionInfo = new byte[bytes.Length - 6]; // 6 = 4 + 2 = biffVersion header + filepass enryptiontype
                    Array.Copy(bytes, 6, encryptionInfo, 0, bytes.Length - 6);
                    EncryptionInfo = EncryptionInfo.Create(encryptionInfo);
                }
                else
                {
                    throw new NotSupportedException("Unknown encryption type: " + type);
                }
            }
        }