public AesDecoderStream(Stream input, byte[] info, IPasswordProvider pass, long limit)
        {
            mStream = input;
            mLimit = limit;

            // The 7z AES encoder/decoder classes do not perform padding, instead they require the input stream to provide a multiple of 16 bytes.
            // If the exception below is thrown this means the 7z file is either corrupt or a newer 7z version has been published and we haven't updated yet.
            if (((uint)input.Length & 15) != 0)
                throw new NotSupportedException("7z requires AES streams to be properly padded.");

            int numCyclesPower;
            byte[] salt, seed;
            Init(info, out numCyclesPower, out salt, out seed);

            byte[] password = Encoding.Unicode.GetBytes(pass.CryptoGetTextPassword());
            byte[] key = InitKey(numCyclesPower, salt, password);

            using (var aes = Aes.Create())
            {
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.None;
                mDecoder = aes.CreateDecryptor(key, seed);
            }

            mBuffer = new byte[4 << 10];
        }
 /// <summary>
 /// Public ctor
 /// </summary>
 /// <param name="m">The model to operate on</param>
 /// <param name="passProvider">Pass provider</param>
 /// <param name="usersPerPage">Number of visible user records per page</param>
 public MainWindowController(MainWindowModel m, IPasswordProvider passProvider, int usersPerPage)
 {
     model = m;
     passwordProvider = passProvider;
     cts = new CancellationTokenSource();
     MaxVisibleUsers = usersPerPage;
 }
Example #3
0
        public AesDecoderStream(Stream input, byte[] info, IPasswordProvider pass, long limit)
        {
            if (pass.CryptoGetTextPassword() == null)
            {
                throw new SharpCompress.Common.CryptographicException("Encrypted 7Zip archive has no password specified.");
            }

            mStream = input;
            mLimit  = limit;

            if (((uint)input.Length & 15) != 0)
            {
                throw new NotSupportedException("AES decoder does not support padding.");
            }

            Init(info, out int numCyclesPower, out byte[] salt, out byte[] seed);

            byte[] password = Encoding.Unicode.GetBytes(pass.CryptoGetTextPassword());
            byte[]? key = InitKey(numCyclesPower, salt, password);
            if (key == null)
            {
                throw new InvalidOperationException("Initialized with null key");
            }

            using (var aes = Aes.Create())
            {
                aes.Mode    = CipherMode.CBC;
                aes.Padding = PaddingMode.None;
                mDecoder    = aes.CreateDecryptor(key, seed);
            }

            mBuffer = new byte[4 << 10];
        }
        internal static Stream CreateDecoderStream(Stream inStream, long startPos, long[] packSizes, CFolder folderInfo,
                                                   IPasswordProvider pass)
        {
            if (!folderInfo.CheckStructure())
            {
                throw new NotSupportedException("Unsupported stream binding structure.");
            }

            // We have multiple views into the same stream which will be used by several threads - need to sync those.
            object sync = new object();

            Stream[] inStreams = new Stream[folderInfo.PackStreams.Count];
            for (int j = 0; j < folderInfo.PackStreams.Count; j++)
            {
                inStreams[j] = new SyncStreamView(sync, inStream, startPos, packSizes[j]);
                startPos    += packSizes[j];
            }

            Stream[] outStreams = new Stream[folderInfo.UnpackSizes.Count];

            int primaryCoderIndex, primaryOutStreamIndex;

            FindPrimaryOutStreamIndex(folderInfo, out primaryCoderIndex, out primaryOutStreamIndex);
            return(CreateDecoderStream(inStreams, packSizes, outStreams, folderInfo, primaryCoderIndex, pass));
        }
        internal static Stream CreateDecoderStream(CMethodId id, Stream[] inStreams, byte[] info, IPasswordProvider pass, long limit)
        {
            switch (id.Id)
            {
                case 0L:
                    if (info != null)
                    {
                        throw new NotSupportedException();
                    }
                    return Enumerable.Single<Stream>(inStreams);

                case 0x21L:
                case 0x30101L:
                    return new LzmaStream(info, Enumerable.Single<Stream>(inStreams), -1L, limit);

                case 0x3030103L:
                    return new BCJFilter(false, Enumerable.Single<Stream>(inStreams));

                case 0x303011bL:
                    return new Bcj2DecoderStream(inStreams, info, limit);

                case 0x30401L:
                    return new PpmdStream(new PpmdProperties(info), Enumerable.Single<Stream>(inStreams), false);

                case 0x40202L:
                    return new BZip2Stream(Enumerable.Single<Stream>(inStreams), CompressionMode.Decompress, true, false);
            }
            throw new NotSupportedException();
        }
Example #6
0
 public SingleSignOnSessionRepository(IClientFactory clientFactory, ISettingsLoadService settingsLoadService,
                                      IPasswordProvider passwordProvider)
 {
     _clientFactory       = clientFactory;
     _settingsLoadService = settingsLoadService;
     _passwordProvider    = passwordProvider;
 }
 public PasswordCracker(IPasswordProvider passwordProvider, Dictionary <string, bool> passwordsToCrack, SyncQueue <HashedPassword> crackedPasswords, Mutex mutex)
 {
     _passwordProvider = passwordProvider;
     _passwordsToCrack = passwordsToCrack;
     _crackedPasswords = crackedPasswords;
     _mutex            = mutex;
 }
Example #8
0
        public void LogInButton(IPasswordProvider passwordProvider, string idInput)
        {
            if (UserVerification == "Signatur")
            {
                EmployeeModel loggedInEmployee = Employee.GetLoggedInEmployee(idInput, passwordProvider.Password, Services);
                if (loggedInEmployee != null)
                {
                    manager.ShowWindow(new LoggedInEmployeeViewModel(Services, loggedInEmployee), null, null);
                    TryClose();
                }
                else
                {
                    MessageBox.Show("Signatur eller lösenord stämmer inte");
                }
            }
            else if (UserVerification == "Email")
            {
                AlumnModel loggedInAlumn = Alumn.GetLoggedInAlumn(idInput, passwordProvider.Password, Services);
                if (loggedInAlumn != null)
                {
                    manager.ShowWindow(new LoggedInAlumnViewModel(Services, loggedInAlumn), null, null);
                    TryClose();
                }
                else
                {
                    MessageBox.Show("Email eller lösenord stämmer inte");
                }
            }

            else
            {
                MessageBox.Show("Du har inte valt alumn eller personal");
            }
        }
Example #9
0
 internal static Stream CreateDecoderStream(CMethodId id, Stream[] inStreams, byte[] info, IPasswordProvider pass,
                                            long limit)
 {
     switch (id.Id)
     {
         case k_Copy:
             if (info != null)
                 throw new NotSupportedException();
             return inStreams.Single();
         case k_LZMA:
         case k_LZMA2:
             return new LzmaStream(info, inStreams.Single(), -1, limit);
     #if !NO_CRYPTO
         case CMethodId.kAESId:
             return new AesDecoderStream(inStreams.Single(), info, pass, limit);
     #endif
         case k_BCJ:
             return new BCJFilter(false, inStreams.Single());
         case k_BCJ2:
             return new Bcj2DecoderStream(inStreams, info, limit);
         case k_BZip2:
             return new BZip2Stream(inStreams.Single(), CompressionMode.Decompress, true);
         case k_PPMD:
             return new PpmdStream(new PpmdProperties(info), inStreams.Single(), false);
         default:
             throw new NotSupportedException();
     }
 }
Example #10
0
        public UserModule(IUserStore userStore, IUserValidator userValidator, IPasswordProvider passwordProvider) : base()
        {
            _userStore        = userStore;
            _userValidator    = userValidator;
            _passwordProvider = passwordProvider;

            Get[Actions.User.Default] = (x) =>
            {
                AddScript(Scripts.UserView);
                return(Default());
            };
            Get[Actions.User.List] = (x) =>
            {
                this.RequiresClaims(new[] { Claims.UserList });
                return(List());
            };
            Post[Actions.User.ChangePassword] = (x) =>
            {
                return(ChangePassword());
            };
            Post[Actions.User.Save] = (x) =>
            {
                this.RequiresClaims(new[] { Claims.UserAdd });
                return(Save());
            };
        }
Example #11
0
 public AccountUnlocker(IKeyStoreConfig config, IWallet wallet, ILogManager logManager, IPasswordProvider passwordProvider)
 {
     _config           = config ?? throw new ArgumentNullException(nameof(config));
     _wallet           = wallet ?? throw new ArgumentNullException(nameof(wallet));
     _logger           = logManager?.GetClassLogger <AccountUnlocker>() ?? throw new ArgumentNullException(nameof(logManager));
     _passwordProvider = passwordProvider ?? throw new ArgumentNullException(nameof(passwordProvider));
 }
Example #12
0
        public AesDecoderStream(Stream input, byte[] info, IPasswordProvider pass, long limit)
        {
            mStream = input;
            mLimit  = limit;

            if (((uint)input.Length & 15) != 0)
            {
                throw new NotSupportedException("AES decoder does not support padding.");
            }

            int numCyclesPower;

            byte[] salt, seed;
            Init(info, out numCyclesPower, out salt, out seed);

            byte[] password = Encoding.Unicode.GetBytes(pass.CryptoGetTextPassword());
            byte[] key      = InitKey(numCyclesPower, salt, password);

            using (var aes = Aes.Create())
            {
                aes.Mode    = CipherMode.CBC;
                aes.Padding = PaddingMode.None;
                mDecoder    = aes.CreateDecryptor(key, seed);
            }

            mBuffer = new byte[4 << 10];
        }
Example #13
0
        public LoginModule(IUserStore userStore, IPasswordProvider passwordProvider)
        {
            _userStore        = userStore;
            _passwordProvider = passwordProvider;

            Get["/"] = x =>
            {
                return(this.Response.AsRedirect(Actions.Login.Default));
            };

            Get[Actions.Login.Default] = x =>
            {
                AddScript(Scripts.LoginView);
                return(this.LoginGet());
            };

            Post[Actions.Login.Default] = x =>
            {
                return(LoginPost());
            };

            Get[Actions.Login.Logout] = x =>
            {
                return(this.Logout(Actions.Login.Default));
            };
        }
Example #14
0
        public AesDecoderStream(Stream input, byte[] info, IPasswordProvider pass, long limit)
        {
            mStream = input;
            mLimit  = limit;

            // The 7z AES encoder/decoder classes do not perform padding, instead they require the input stream to provide a multiple of 16 bytes.
            // If the exception below is thrown this means the 7z file is either corrupt or a newer 7z version has been published and we haven't updated yet.
            if (((uint)input.Length & 15) != 0)
            {
                throw new NotSupportedException("7z requires AES streams to be properly padded.");
            }

            int numCyclesPower;

            byte[] salt, seed;
            Init(info, out numCyclesPower, out salt, out seed);

            byte[] password = Encoding.Unicode.GetBytes(pass.CryptoGetTextPassword());
            byte[] key      = InitKey(numCyclesPower, salt, password);

            using (var aes = Aes.Create())
            {
                aes.Mode    = CipherMode.CBC;
                aes.Padding = PaddingMode.None;
                mDecoder    = aes.CreateDecryptor(key, seed);
            }

            mBuffer = new byte[4 << 10];
        }
Example #15
0
 public BasePasswordProvider OrReadFromFile(string fileName)
 {
     AlternativeProvider = new FilePasswordProvider()
     {
         FileName = fileName
     };
     return(this);
 }
        public void UserStoreTest_SetUp()
        {
            _fileWrap         = Substitute.For <IFileWrap>();
            _dirWrap          = Substitute.For <IDirectoryWrap>();
            _passwordProvider = Substitute.For <IPasswordProvider>();

            _userStore = new UserStore(_path, _fileWrap, _dirWrap, _passwordProvider);
        }
        public void CreateUserCommandTest_SetUp()
        {
            _dbContext        = Substitute.For <IDbContext>();
            _userValidator    = Substitute.For <IUserValidator>();
            _passwordProvider = Substitute.For <IPasswordProvider>();

            _createUserCommand = new CreateUserCommand(_dbContext, _userValidator, _passwordProvider);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="WsseRequestInterceptor"/> class.
 /// </summary>
 /// <param name="provider">The provider.</param>
 /// <param name="realm">The realm.</param>
 /// <param name="timestampRangevalidator">The timestamp rangevalidator.</param>
 /// <param name="nonceStore">The nonce store.</param>
 public WsseRequestInterceptor(IPasswordProvider provider, string realm, ITimestampRangeValidator timestampRangevalidator, INonceStore nonceStore)
     : base(false)
 {
     TimestampRangeValidator = timestampRangevalidator;
     NonceStore = nonceStore;
     Provider = provider;
     Realm = realm;
 }
        public void UpdateUserPasswordCommandTest_SetUp()
        {
            _dbContext        = Substitute.For <IDbContext>();
            _userRepo         = Substitute.For <IUserRepository>();
            _passwordProvider = Substitute.For <IPasswordProvider>();

            _updateUserPasswordCommand = new UpdateUserPasswordCommand(_dbContext, _userRepo, _passwordProvider);
        }
Example #20
0
 public TokenValidationServiceTests()
 {
     _handler          = new JwtSecurityTokenHandler();
     _tokenGenerator   = new TokenGenerator();
     _passwordProvider = new PasswordProvider();
     _ttl       = new TimeSpan(0, 0, TtlSeconds);
     _clockSkew = new TimeSpan(0, 0, 30);
     _fixture   = new Fixture();
 }
Example #21
0
        public static string Decrypt(IPasswordProvider psw, string path)
        {
            var data = VocabularyProviderFactory.CreateProvider(psw.RawPassword);

            using (var reader = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                return(Decrypt(data, reader));
            }
        }
Example #22
0
 internal CryptoManager(
     SymmetricAlgorithm symmetricAlgorithm, 
     HashAlgorithm hashAlgorithm,
     IPasswordProvider passwordProvider)
 {
     _symmetricAlgorithm = symmetricAlgorithm;
     _hashAlgorithm = hashAlgorithm;
     _passwordProvider = passwordProvider;
 }
Example #23
0
        public static void Encrypt(IPasswordProvider psw, string what, string where)
        {
            var data = VocabularyProviderFactory.CreateProvider(psw.RawPassword);

            using (var writer = new FileStream(where, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
            {
                Encrypt(data, what, writer);
            }
        }
Example #24
0
 public UserStore(string filePath, IFileWrap fileWrap, IDirectoryWrap dirWrap, IPasswordProvider passwordProvider)
 {
     this.FilePath     = filePath;
     _fileWrap         = fileWrap;
     _dirWrap          = dirWrap;
     _passwordProvider = passwordProvider;
     this.Users        = new List <UserModel>();
     this.Connections  = new List <ConnectionModel>();
 }
        internal Stream GetFolderStream(Stream stream, CFolder folder, IPasswordProvider pw)
        {
            int packStreamIndex = folder.FirstPackStreamId;
            long folderStartPackPos = GetFolderStreamPos(folder, 0);
            List<long> packSizes = new List<long>();
            for (int j = 0; j < folder.PackStreams.Count; j++)
                packSizes.Add(PackSizes[packStreamIndex + j]);

            return DecoderStreamHelper.CreateDecoderStream(stream, folderStartPackPos, packSizes.ToArray(), folder, pw);
        }
 public AuthService(IRoDataProvider dataProvider,
                    IAsyncHelpers asyncHelpers,
                    ITokenProvider tokenProvider,
                    IPasswordProvider passwordProvider)
 {
     _dataProvider     = dataProvider ?? throw new ArgumentNullException(nameof(dataProvider));
     _asyncHelpers     = asyncHelpers ?? throw new ArgumentNullException(nameof(asyncHelpers));
     _tokenProvider    = tokenProvider ?? throw new ArgumentNullException(nameof(tokenProvider));
     _passwordProvider = passwordProvider ?? throw new ArgumentNullException(nameof(passwordProvider));
 }
Example #27
0
        public BasePasswordProvider OrReadFromConsole(string message)
        {
            var consoleUtils = new ConsoleUtils(new ConsoleWrapper());

            AlternativeProvider = new ConsolePasswordProvider(consoleUtils)
            {
                Message = message
            };
            return(this);
        }
        public void UserModuleTest_SetUp()
        {
            _userStore        = Substitute.For <IUserStore>();
            _userValidator    = Substitute.For <IUserValidator>();
            _passwordProvider = Substitute.For <IPasswordProvider>();

            Mapper.Initialize((cfg) =>
            {
                cfg.CreateMap <UserViewModel, UserModel>();
            });
        }
Example #29
0
 public AuthService(IRepositoryFactory repositoryFactory, IUnitOfWork unitOfWork,
                    IMapper mapper, ITokenProvider tokenProvider, IPasswordProvider passwordProvider,
                    IConfiguration configuration)
 {
     _repositoryFactory = repositoryFactory ?? throw new ArgumentNullException(nameof(repositoryFactory));
     _unitOfWork        = unitOfWork ?? throw new ArgumentNullException(nameof(unitOfWork));
     _mapper            = mapper ?? throw new ArgumentNullException(nameof(mapper));
     _tokenProvider     = tokenProvider ?? throw new ArgumentNullException(nameof(tokenProvider));
     _passwordProvider  = passwordProvider ?? throw new ArgumentNullException(nameof(passwordProvider));
     _configuration     = configuration ?? throw new ArgumentNullException(nameof(configuration));
 }
 private static Stream CreateDecoderStream(Stream[] packStreams, long[] packSizes, Stream[] outStreams, CFolder folderInfo, int coderIndex, IPasswordProvider pass)
 {
     int num2;
     CCoderInfo info = folderInfo.Coders[coderIndex];
     if (info.NumOutStreams != 1)
     {
         throw new NotSupportedException("Multiple output streams are not supported.");
     }
     int inStreamIndex = 0;
     for (num2 = 0; num2 < coderIndex; num2++)
     {
         inStreamIndex += folderInfo.Coders[num2].NumInStreams;
     }
     int num3 = 0;
     for (num2 = 0; num2 < coderIndex; num2++)
     {
         num3 += folderInfo.Coders[num2].NumOutStreams;
     }
     Stream[] inStreams = new Stream[info.NumInStreams];
     num2 = 0;
     while (num2 < inStreams.Length)
     {
         int num4 = folderInfo.FindBindPairForInStream(inStreamIndex);
         if (num4 >= 0)
         {
             int outIndex = folderInfo.BindPairs[num4].OutIndex;
             if (outStreams[outIndex] != null)
             {
                 throw new NotSupportedException("Overlapping stream bindings are not supported.");
             }
             int num6 = FindCoderIndexForOutStreamIndex(folderInfo, outIndex);
             inStreams[num2] = CreateDecoderStream(packStreams, packSizes, outStreams, folderInfo, num6, pass);
             if (outStreams[outIndex] != null)
             {
                 throw new NotSupportedException("Overlapping stream bindings are not supported.");
             }
             outStreams[outIndex] = inStreams[num2];
         }
         else
         {
             int index = folderInfo.FindPackStreamArrayIndex(inStreamIndex);
             if (index < 0)
             {
                 throw new NotSupportedException("Could not find input stream binding.");
             }
             inStreams[num2] = packStreams[index];
         }
         num2++;
         inStreamIndex++;
     }
     long limit = folderInfo.UnpackSizes[num3];
     return DecoderRegistry.CreateDecoderStream(info.MethodId, inStreams, info.Props, pass, limit);
 }
        public void ConstructorShouldFailWhenPasswordProviderIsNull()
        {
            // Arrange
            var userFinder = new Mock <IUserFinder>().Object;
            IPasswordProvider passwordProvider = null;

            // Act
            Action ctor = () => { new LoginQueryHandler(userFinder, passwordProvider); };

            // Assert
            ctor.Should().Throw <ArgumentNullException>();
        }
Example #32
0
 public SessionController(ILogger <SessionController> logger,
                          IUserRepository userRepository,
                          IJwtAuth jwtAuth,
                          IPasswordProvider passwordProvider,
                          IOAuth oauth)
 {
     _logger           = logger;
     _userRepository   = userRepository;
     _jwtAuth          = jwtAuth;
     _passwordProvider = passwordProvider;
     _oauth            = oauth;
 }
Example #33
0
 public CreateCommandHandler(IUserRepository userRepository,
                             IIdentifierProvider identifierProvider,
                             IVersionProvider versionProvider,
                             IPasswordProvider passwordProvider,
                             IPublishIntegrationEventsService publishIntegrationEventsService)
 {
     _userRepository     = userRepository ?? throw Error.ArgumentNull(nameof(userRepository));
     _identifierProvider = identifierProvider ?? throw Error.ArgumentNull(nameof(identifierProvider));
     _versionProvider    = versionProvider ?? throw Error.ArgumentNull(nameof(versionProvider));
     _passwordProvider   = passwordProvider ?? throw Error.ArgumentNull(nameof(passwordProvider));
     _publishIntegrationEventsService = publishIntegrationEventsService;
 }
        internal Stream GetFolderStream(Stream stream, CFolder folder, IPasswordProvider pw)
        {
            int         firstPackStreamId = folder.FirstPackStreamId;
            long        folderStreamPos   = this.GetFolderStreamPos(folder, 0);
            List <long> list = new List <long>();

            for (int i = 0; i < folder.PackStreams.Count; i++)
            {
                list.Add(this.PackSizes[firstPackStreamId + i]);
            }
            return(DecoderStreamHelper.CreateDecoderStream(stream, folderStreamPos, list.ToArray(), folder, pw));
        }
        public void UserModuleTest_SetUp()
        {
            _userStore        = Substitute.For <IUserStore>();
            _userValidator    = Substitute.For <IUserValidator>();
            _passwordProvider = Substitute.For <IPasswordProvider>();

            var config = new MapperConfiguration(cfg => {
                cfg.CreateMap <UserViewModel, UserModel>();
            });

            _mapper = config.CreateMapper();
        }
 public ComputerController(IAuthorizationService authorizationService, ILogger <ComputerController> logger, IDirectory directory,
                           IAuditEventProcessor reporting, IRateLimiter rateLimiter, IOptionsSnapshot <UserInterfaceOptions> userInterfaceSettings, IAuthenticationProvider authenticationProvider, IPasswordProvider passwordProvider, IJitAccessProvider jitAccessProvider)
 {
     this.authorizationService = authorizationService;
     this.logger                 = logger;
     this.directory              = directory;
     this.reporting              = reporting;
     this.rateLimiter            = rateLimiter;
     this.userInterfaceSettings  = userInterfaceSettings.Value;
     this.authenticationProvider = authenticationProvider;
     this.passwordProvider       = passwordProvider;
     this.jitAccessProvider      = jitAccessProvider;
 }
Example #37
0
        private void getPasswordProvider()
        {
            string pp = (string)Registry.GetValue(CONNECTION_MANAGER_REGSITRY_KEY, PASSWORD_PROVIDER, "");

            if (pp.Length == 0)
            {
                passwordProvider = new DefaultRegistryReadPasswordProvider();
                return;
            }
            Assembly a = Assembly.Load(new AssemblyName("SpineTools"));

            passwordProvider = (IPasswordProvider)a.CreateInstance(pp);
        }
 public SingleSignOnSessionRepository(
     IClientFactory clientFactory,
     ISettingsLoadService settingsLoadService,
     IPasswordProvider passwordProvider,
     ITrustInvalidSslQuestion invalidSslQuestion,
     IServerCertificateValidator serverCertificateValidator)
 {
     _clientFactory              = clientFactory;
     _settingsLoadService        = settingsLoadService;
     _passwordProvider           = passwordProvider;
     _invalidSslQuestion         = invalidSslQuestion;
     _serverCertificateValidator = serverCertificateValidator;
 }
 internal static Stream CreateDecoderStream(Stream inStream, long startPos, long[] packSizes, CFolder folderInfo, IPasswordProvider pass)
 {
     int num2;
     int num3;
     if (!folderInfo.CheckStructure())
     {
         throw new NotSupportedException("Unsupported stream binding structure.");
     }
     Stream[] packStreams = new Stream[folderInfo.PackStreams.Count];
     for (int i = 0; i < folderInfo.PackStreams.Count; i++)
     {
         packStreams[i] = new ReadOnlySubStream(inStream, new long?(startPos), packSizes[i]);
         startPos += packSizes[i];
     }
     Stream[] outStreams = new Stream[folderInfo.UnpackSizes.Count];
     FindPrimaryOutStreamIndex(folderInfo, out num2, out num3);
     return CreateDecoderStream(packStreams, packSizes, outStreams, folderInfo, num2, pass);
 }
        internal static Stream CreateDecoderStream(Stream inStream, long startPos, long[] packSizes, CFolder folderInfo,
            IPasswordProvider pass)
        {
            if (!folderInfo.CheckStructure())
                throw new NotSupportedException("Unsupported stream binding structure.");

            Stream[] inStreams = new Stream[folderInfo.PackStreams.Count];
            for (int j = 0; j < folderInfo.PackStreams.Count; j++)
            {
                inStreams[j] = new ReadOnlySubStream(inStream, startPos, packSizes[j]);
                startPos += packSizes[j];
            }

            Stream[] outStreams = new Stream[folderInfo.UnpackSizes.Count];

            int primaryCoderIndex, primaryOutStreamIndex;
            FindPrimaryOutStreamIndex(folderInfo, out primaryCoderIndex, out primaryOutStreamIndex);
            return CreateDecoderStream(inStreams, packSizes, outStreams, folderInfo, primaryCoderIndex, pass);
        }
        internal static Stream CreateDecoderStream(Stream inStream, long startPos, long[] packSizes, CFolder folderInfo,
            IPasswordProvider pass)
        {
            if (!folderInfo.CheckStructure())
                throw new NotSupportedException("Unsupported stream binding structure.");

            // We have multiple views into the same stream which will be used by several threads - need to sync those.
            object sync = new object();
            Stream[] inStreams = new Stream[folderInfo.PackStreams.Count];
            for (int j = 0; j < folderInfo.PackStreams.Count; j++)
            {
                inStreams[j] = new SyncStreamView(sync, inStream, startPos, packSizes[j]);
                startPos += packSizes[j];
            }

            Stream[] outStreams = new Stream[folderInfo.UnpackSizes.Count];

            int primaryCoderIndex, primaryOutStreamIndex;
            FindPrimaryOutStreamIndex(folderInfo, out primaryCoderIndex, out primaryOutStreamIndex);
            return CreateDecoderStream(inStreams, packSizes, outStreams, folderInfo, primaryCoderIndex, pass);
        }
Example #42
0
 internal static Stream CreateDecoderStream(CMethodId id, Stream[] inStreams, byte[] info, IPasswordProvider pass, long limit)
 {
     switch (id.Id)
     {
         case k_Copy:
             if (info != null)
                 throw new NotSupportedException();
             return inStreams.Single();
         case k_LZMA:
             return new LzmaDecoderStream(inStreams.Single(), info, limit);
         case k_LZMA2:
             return new Lzma2DecoderStream(inStreams.Single(), info.Single(), limit);
         case CMethodId.kAESId:
             return new AesDecoderStream(inStreams.Single(), info, pass, limit);
         case k_BCJ:
             return new BcjDecoderStream(inStreams.Single(), info, limit);
         case k_BCJ2:
             return new Bcj2DecoderStream(inStreams, info, limit);
         default:
             throw new NotSupportedException();
     }
 }
 public AesDecoderStream(Stream input, byte[] info, IPasswordProvider pass, long limit)
 {
     int num;
     byte[] buffer;
     byte[] buffer2;
     this.mStream = input;
     this.mLimit = limit;
     if ((((uint) input.Length) & 15) != 0)
     {
         throw new NotSupportedException("AES decoder does not support padding.");
     }
     this.Init(info, out num, out buffer, out buffer2);
     byte[] bytes = Encoding.Unicode.GetBytes(pass.CryptoGetTextPassword());
     byte[] rgbKey = this.InitKey(num, buffer, bytes);
     using (Rijndael rijndael = Rijndael.Create())
     {
         rijndael.Mode = CipherMode.CBC;
         rijndael.Padding = PaddingMode.None;
         this.mDecoder = rijndael.CreateDecryptor(rgbKey, buffer2);
     }
     this.mBuffer = new byte[0x1000];
 }
        public AesDecoderStream(Stream input, byte[] info, IPasswordProvider pass, long limit)
        {
            mStream = input;
            mLimit = limit;

            if (((uint) input.Length & 15) != 0)
                throw new NotSupportedException("AES decoder does not support padding.");

            int numCyclesPower;
            byte[] salt, seed;
            Init(info, out numCyclesPower, out salt, out seed);

            byte[] password = Encoding.Unicode.GetBytes(pass.CryptoGetTextPassword());
            byte[] key = InitKey(numCyclesPower, salt, password);

            using (var aes = Aes.Create())
            {
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.None;
                mDecoder = aes.CreateDecryptor(key, seed);
            }

            mBuffer = new byte[4 << 10];
        }
Example #45
0
        public ArchiveDatabase ReadDatabase(IPasswordProvider pass)
        {
            var db = new ArchiveDatabase();
            db.Clear();

            db.MajorVersion = _header[6];
            db.MinorVersion = _header[7];

            if (db.MajorVersion != 0)
                throw new InvalidOperationException();

            uint crcFromArchive = DataReader.Get32(_header, 8);
            long nextHeaderOffset = (long)DataReader.Get64(_header, 0xC);
            long nextHeaderSize = (long)DataReader.Get64(_header, 0x14);
            uint nextHeaderCrc = DataReader.Get32(_header, 0x1C);

            uint crc = CRC.kInitCRC;
            crc = CRC.Update(crc, nextHeaderOffset);
            crc = CRC.Update(crc, nextHeaderSize);
            crc = CRC.Update(crc, nextHeaderCrc);
            crc = CRC.Finish(crc);

            if (crc != crcFromArchive)
                throw new InvalidOperationException();

            db.StartPositionAfterHeader = _streamOrigin + 0x20;

            // empty header is ok
            if (nextHeaderSize == 0)
            {
                db.Fill();
                return db;
            }

            if (nextHeaderOffset < 0 || nextHeaderSize < 0 || nextHeaderSize > Int32.MaxValue)
                throw new InvalidOperationException();

            if (nextHeaderOffset > _streamEnding - db.StartPositionAfterHeader)
                throw new IndexOutOfRangeException();

            _stream.Seek(nextHeaderOffset, SeekOrigin.Current);

            byte[] header = new byte[nextHeaderSize];
            _stream.ReadExact(header, 0, header.Length);

            if (CRC.Finish(CRC.Update(CRC.kInitCRC, header, 0, header.Length)) != nextHeaderCrc)
                throw new InvalidOperationException();

            using (CStreamSwitch streamSwitch = new CStreamSwitch())
            {
                streamSwitch.Set(this, header);

                BlockType? type = ReadId();
                if (type != BlockType.Header)
                {
                    if (type != BlockType.EncodedHeader)
                        throw new InvalidOperationException();

                    var dataVector = ReadAndDecodePackedStreams(db.StartPositionAfterHeader, pass);

                    // compressed header without content is odd but ok
                    if (dataVector.Count == 0)
                    {
                        db.Fill();
                        return db;
                    }

                    if (dataVector.Count != 1)
                        throw new InvalidOperationException();

                    streamSwitch.Set(this, dataVector[0]);

                    if (ReadId() != BlockType.Header)
                        throw new InvalidOperationException();
                }

                ReadHeader(db, pass);
            }
            db.Fill();
            return db;
        }
Example #46
0
        public Stream OpenStream(ArchiveDatabase _db, int fileIndex, IPasswordProvider pw)
        {
            int folderIndex = _db.FileIndexToFolderIndexMap[fileIndex];
            int numFilesInFolder = _db.NumUnpackStreamsVector[folderIndex];
            int firstFileIndex = _db.FolderStartFileIndex[folderIndex];
            if (firstFileIndex > fileIndex || fileIndex - firstFileIndex >= numFilesInFolder)
                throw new InvalidOperationException();

            int skipCount = fileIndex - firstFileIndex;
            long skipSize = 0;
            for (int i = 0; i < skipCount; i++)
                skipSize += _db.Files[firstFileIndex + i].Size;

            Stream s = GetCachedDecoderStream(_db, folderIndex, pw);
            s.Position = skipSize;
            return new ReadOnlySubStream(s, _db.Files[fileIndex].Size);
        }
        private static Stream CreateDecoderStream(Stream[] packStreams, long[] packSizes, Stream[] outStreams,
            CFolder folderInfo, int coderIndex, IPasswordProvider pass)
        {
            var coderInfo = folderInfo.Coders[coderIndex];
            if (coderInfo.NumOutStreams != 1)
                throw new NotSupportedException("Multiple output streams are not supported.");

            int inStreamId = 0;
            for (int i = 0; i < coderIndex; i++)
                inStreamId += folderInfo.Coders[i].NumInStreams;

            int outStreamId = 0;
            for (int i = 0; i < coderIndex; i++)
                outStreamId += folderInfo.Coders[i].NumOutStreams;

            Stream[] inStreams = new Stream[coderInfo.NumInStreams];

            for (int i = 0; i < inStreams.Length; i++, inStreamId++)
            {
                int bindPairIndex = folderInfo.FindBindPairForInStream(inStreamId);
                if (bindPairIndex >= 0)
                {
                    int pairedOutIndex = folderInfo.BindPairs[bindPairIndex].OutIndex;

                    if (outStreams[pairedOutIndex] != null)
                        throw new NotSupportedException("Overlapping stream bindings are not supported.");

                    int otherCoderIndex = FindCoderIndexForOutStreamIndex(folderInfo, pairedOutIndex);
                    inStreams[i] = CreateDecoderStream(packStreams, packSizes, outStreams, folderInfo, otherCoderIndex,
                                                       pass);
                    //inStreamSizes[i] = folderInfo.UnpackSizes[pairedOutIndex];

                    if (outStreams[pairedOutIndex] != null)
                        throw new NotSupportedException("Overlapping stream bindings are not supported.");

                    outStreams[pairedOutIndex] = inStreams[i];
                }
                else
                {
                    int index = folderInfo.FindPackStreamArrayIndex(inStreamId);
                    if (index < 0)
                        throw new NotSupportedException("Could not find input stream binding.");

                    inStreams[i] = packStreams[index];
                    //inStreamSizes[i] = packSizes[index];
                }
            }

            long unpackSize = folderInfo.UnpackSizes[outStreamId];
            return DecoderRegistry.CreateDecoderStream(coderInfo.MethodId, inStreams, coderInfo.Props, pass, unpackSize);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="WsseRequestInterceptor"/> class.
 /// </summary>
 /// <param name="provider">The provider.</param>
 /// <param name="realm">The realm.</param>
 public WsseRequestInterceptor(IPasswordProvider provider, string realm)
     : this(provider, realm, new DefaultTimestampRangeValidator(), new InMemoryNonceStore())
 {
 }
Example #49
0
        private List<byte[]> ReadAndDecodePackedStreams(long baseOffset, IPasswordProvider pass)
        {
            #if DEBUG
            Log.WriteLine("-- ReadAndDecodePackedStreams --");
            Log.PushIndent();
            #endif
            try
            {
                long dataStartPos;
                List<long> packSizes;
                List<uint?> packCRCs;
                List<CFolder> folders;
                List<int> numUnpackStreamsInFolders;
                List<long> unpackSizes;
                List<uint?> digests;

                ReadStreamsInfo(null,
                                out dataStartPos,
                                out packSizes,
                                out packCRCs,
                                out folders,
                                out numUnpackStreamsInFolders,
                                out unpackSizes,
                                out digests);

                dataStartPos += baseOffset;

                var dataVector = new List<byte[]>(folders.Count);
                int packIndex = 0;
                foreach (var folder in folders)
                {
                    long oldDataStartPos = dataStartPos;
                    long[] myPackSizes = new long[folder.PackStreams.Count];
                    for (int i = 0; i < myPackSizes.Length; i++)
                    {
                        long packSize = packSizes[packIndex + i];
                        myPackSizes[i] = packSize;
                        dataStartPos += packSize;
                    }

                    var outStream = DecoderStreamHelper.CreateDecoderStream(_stream, oldDataStartPos, myPackSizes,
                                                                            folder, pass);

                    int unpackSize = checked((int)folder.GetUnpackSize());
                    byte[] data = new byte[unpackSize];
                    outStream.ReadExact(data, 0, data.Length);
                    if (outStream.ReadByte() >= 0)
                        throw new InvalidOperationException("Decoded stream is longer than expected.");
                    dataVector.Add(data);

                    if (folder.UnpackCRCDefined)
                        if (CRC.Finish(CRC.Update(CRC.kInitCRC, data, 0, unpackSize)) != folder.UnpackCRC)
                            throw new InvalidOperationException("Decoded stream does not match expected CRC.");
                }
                return dataVector;
            }
            finally
            {
            #if DEBUG
                Log.PopIndent();
            #endif
            }
        }
Example #50
0
 private List<byte[]> ReadAndDecodePackedStreams(long baseOffset, IPasswordProvider pass)
 {
     List<byte[]> list8;
     SharpCompress.Compressor.LZMA.Log.WriteLine("-- ReadAndDecodePackedStreams --");
     SharpCompress.Compressor.LZMA.Log.PushIndent("  ");
     try
     {
         long num;
         List<long> list;
         List<uint?> list2;
         List<CFolder> list3;
         List<int> list4;
         List<long> list5;
         List<uint?> list6;
         this.ReadStreamsInfo(null, out num, out list, out list2, out list3, out list4, out list5, out list6);
         num += baseOffset;
         List<byte[]> list7 = new List<byte[]>(list3.Count);
         int num2 = 0;
         foreach (CFolder folder in list3)
         {
             long startPos = num;
             long[] packSizes = new long[folder.PackStreams.Count];
             for (int i = 0; i < packSizes.Length; i++)
             {
                 long num5 = list[num2 + i];
                 packSizes[i] = num5;
                 num += num5;
             }
             Stream stream = DecoderStreamHelper.CreateDecoderStream(this._stream, startPos, packSizes, folder, pass);
             int unpackSize = (int) folder.GetUnpackSize();
             byte[] buffer = new byte[unpackSize];
             Utils.ReadExact(stream, buffer, 0, buffer.Length);
             if (stream.ReadByte() >= 0)
             {
                 throw new InvalidOperationException("Decoded stream is longer than expected.");
             }
             list7.Add(buffer);
             if (folder.UnpackCRCDefined)
             {
                 uint num7 = CRC.Finish(CRC.Update(uint.MaxValue, buffer, 0, unpackSize));
                 if (num7 != folder.UnpackCRC)
                 {
                     throw new InvalidOperationException("Decoded stream does not match expected CRC.");
                 }
             }
         }
         list8 = list7;
     }
     finally
     {
         SharpCompress.Compressor.LZMA.Log.PopIndent();
     }
     return list8;
 }
Example #51
0
 public void Extract(ArchiveDatabase _db, int[] indices, IPasswordProvider pw)
 {
     int count;
     bool flag = indices == null;
     if (flag)
     {
         count = _db.Files.Count;
     }
     else
     {
         count = indices.Length;
     }
     if (count != 0)
     {
         int folderIndex;
         int num5;
         List<CExtractFolderInfo> source = new List<CExtractFolderInfo>();
         for (int i = 0; i < count; i++)
         {
             int fileIndex = flag ? i : indices[i];
             folderIndex = _db.FileIndexToFolderIndexMap[fileIndex];
             if (folderIndex == -1)
             {
                 source.Add(new CExtractFolderInfo(fileIndex, -1));
             }
             else
             {
                 if ((source.Count == 0) || (folderIndex != Enumerable.Last<CExtractFolderInfo>(source).FolderIndex))
                 {
                     source.Add(new CExtractFolderInfo(-1, folderIndex));
                 }
                 CExtractFolderInfo info = Enumerable.Last<CExtractFolderInfo>(source);
                 num5 = _db.FolderStartFileIndex[folderIndex];
                 for (int j = info.ExtractStatuses.Count; j <= (fileIndex - num5); j++)
                 {
                     info.ExtractStatuses.Add(j == (fileIndex - num5));
                 }
             }
         }
         foreach (CExtractFolderInfo info in source)
         {
             int num10;
             bool flag2;
             if (info.FileIndex != -1)
             {
                 num5 = info.FileIndex;
             }
             else
             {
                 num5 = _db.FolderStartFileIndex[info.FolderIndex];
             }
             FolderUnpackStream stream = new FolderUnpackStream(_db, 0, num5, info.ExtractStatuses);
             if (info.FileIndex != -1)
             {
                 continue;
             }
             folderIndex = info.FolderIndex;
             CFolder folder = _db.Folders[folderIndex];
             int firstPackStreamId = _db.Folders[folderIndex].FirstPackStreamId;
             long folderStreamPos = _db.GetFolderStreamPos(folder, 0);
             List<long> list2 = new List<long>();
             for (int k = 0; k < folder.PackStreams.Count; k++)
             {
                 list2.Add(_db.PackSizes[firstPackStreamId + k]);
             }
             Stream stream2 = DecoderStreamHelper.CreateDecoderStream(this._stream, folderStreamPos, list2.ToArray(), folder, pw);
             byte[] buffer = new byte[0x1000];
             goto Label_0252;
         Label_0223:
             num10 = stream2.Read(buffer, 0, buffer.Length);
             if (num10 == 0)
             {
                 continue;
             }
             stream.Write(buffer, 0, num10);
         Label_0252:
             flag2 = true;
             goto Label_0223;
         }
     }
 }
Example #52
0
        private void ReadHeader(ArchiveDatabase db, IPasswordProvider getTextPassword)
        {
            Action<int, uint?> action = null;
            Action<int, long?> action2 = null;
            Action<int, DateTime?> action3 = null;
            Action<int, DateTime?> action4 = null;
            Action<int, DateTime?> action5 = null;
            SharpCompress.Compressor.LZMA.Log.WriteLine("-- ReadHeader --");
            SharpCompress.Compressor.LZMA.Log.PushIndent("  ");
            try
            {
                List<long> list2;
                List<uint?> list3;
                int num;
                long num6;
                int num7;
                bool flag2;
                BlockType? nullable = this.ReadId();
                if (((BlockType) nullable) == BlockType.ArchiveProperties)
                {
                    this.ReadArchiveProperties();
                    nullable = this.ReadId();
                }
                List<byte[]> dataVector = null;
                if (((BlockType) nullable) == BlockType.AdditionalStreamsInfo)
                {
                    dataVector = this.ReadAndDecodePackedStreams(db.StartPositionAfterHeader, getTextPassword);
                    nullable = this.ReadId();
                }
                if (((BlockType) nullable) == BlockType.MainStreamsInfo)
                {
                    this.ReadStreamsInfo(dataVector, out db.DataStartPosition, out db.PackSizes, out db.PackCRCs, out db.Folders, out db.NumUnpackStreamsVector, out list2, out list3);
                    db.DataStartPosition += db.StartPositionAfterHeader;
                    nullable = this.ReadId();
                }
                else
                {
                    list2 = new List<long>(db.Folders.Count);
                    list3 = new List<uint?>(db.Folders.Count);
                    db.NumUnpackStreamsVector = new List<int>(db.Folders.Count);
                    for (num = 0; num < db.Folders.Count; num++)
                    {
                        CFolder folder = db.Folders[num];
                        list2.Add(folder.GetUnpackSize());
                        list3.Add(folder.UnpackCRC);
                        db.NumUnpackStreamsVector.Add(1);
                    }
                }
                db.Files.Clear();
                if (((BlockType) nullable) == BlockType.End)
                {
                    return;
                }
                if (((BlockType) nullable) != BlockType.FilesInfo)
                {
                    throw new InvalidOperationException();
                }
                int capacity = this.ReadNum();
                SharpCompress.Compressor.LZMA.Log.WriteLine("NumFiles: " + capacity);
                db.Files = new List<CFileItem>(capacity);
                num = 0;
                while (num < capacity)
                {
                    db.Files.Add(new CFileItem());
                    num++;
                }
                BitVector vector = new BitVector(capacity);
                BitVector vector2 = null;
                BitVector vector3 = null;
                int length = 0;
                goto Label_06FC;
            Label_02DA:
                nullable = this.ReadId();
                if (((BlockType) nullable) == BlockType.End)
                {
                    goto Label_0704;
                }
                long size = (long) this.ReadNumber();
                int offset = this._currentReader.Offset;
                BlockType valueOrDefault = nullable.GetValueOrDefault();
                if (nullable.HasValue)
                {
                    switch (valueOrDefault)
                    {
                        case BlockType.EmptyStream:
                            vector = this.ReadBitVector(capacity);
                            SharpCompress.Compressor.LZMA.Log.Write("EmptyStream: ");
                            num = 0;
                            goto Label_04AD;

                        case BlockType.EmptyFile:
                            vector2 = this.ReadBitVector(length);
                            SharpCompress.Compressor.LZMA.Log.Write("EmptyFile: ");
                            num = 0;
                            goto Label_0519;

                        case BlockType.Anti:
                            vector3 = this.ReadBitVector(length);
                            SharpCompress.Compressor.LZMA.Log.Write("Anti: ");
                            num = 0;
                            goto Label_056E;

                        case BlockType.Name:
                            goto Label_0370;

                        case BlockType.CTime:
                            goto Label_05BC;

                        case BlockType.ATime:
                            goto Label_05F3;

                        case BlockType.MTime:
                            goto Label_062A;

                        case BlockType.WinAttributes:
                            goto Label_0420;

                        case BlockType.StartPos:
                            goto Label_0585;

                        case BlockType.Dummy:
                            SharpCompress.Compressor.LZMA.Log.Write("Dummy: " + size);
                            num6 = 0L;
                            goto Label_0697;
                    }
                }
                goto Label_06A5;
            Label_0370:
                using (CStreamSwitch switch2 = new CStreamSwitch())
                {
                    switch2.Set(this, dataVector);
                    SharpCompress.Compressor.LZMA.Log.Write("FileNames:");
                    num = 0;
                    while (num < db.Files.Count)
                    {
                        db.Files[num].Name = this._currentReader.ReadString();
                        SharpCompress.Compressor.LZMA.Log.Write("  " + db.Files[num].Name);
                        num++;
                    }
                    SharpCompress.Compressor.LZMA.Log.WriteLine();
                }
                goto Label_06B0;
            Label_0420:
                SharpCompress.Compressor.LZMA.Log.Write("WinAttributes:");
                if (action == null)
                {
                    action = delegate (int i, uint? attr) {
                        db.Files[i].Attrib = attr;
                        SharpCompress.Compressor.LZMA.Log.Write("  " + (attr.HasValue ? attr.Value.ToString("x8") : "n/a"));
                    };
                }
                this.ReadAttributeVector(dataVector, capacity, action);
                SharpCompress.Compressor.LZMA.Log.WriteLine();
                goto Label_06B0;
            Label_0471:
                if (vector[num])
                {
                    SharpCompress.Compressor.LZMA.Log.Write("x");
                    length++;
                }
                else
                {
                    SharpCompress.Compressor.LZMA.Log.Write(".");
                }
                num++;
            Label_04AD:
                if (num < vector.Length)
                {
                    goto Label_0471;
                }
                SharpCompress.Compressor.LZMA.Log.WriteLine();
                vector2 = new BitVector(length);
                vector3 = new BitVector(length);
                goto Label_06B0;
            Label_04F5:
                SharpCompress.Compressor.LZMA.Log.Write(vector2[num] ? "x" : ".");
                num++;
            Label_0519:
                if (num < length)
                {
                    goto Label_04F5;
                }
                SharpCompress.Compressor.LZMA.Log.WriteLine();
                goto Label_06B0;
            Label_054A:
                SharpCompress.Compressor.LZMA.Log.Write(vector3[num] ? "x" : ".");
                num++;
            Label_056E:
                if (num < length)
                {
                    goto Label_054A;
                }
                SharpCompress.Compressor.LZMA.Log.WriteLine();
                goto Label_06B0;
            Label_0585:
                SharpCompress.Compressor.LZMA.Log.Write("StartPos:");
                if (action2 == null)
                {
                    action2 = delegate (int i, long? startPos) {
                        db.Files[i].StartPos = startPos;
                        SharpCompress.Compressor.LZMA.Log.Write("  " + (startPos.HasValue ? startPos.Value.ToString() : "n/a"));
                    };
                }
                this.ReadNumberVector(dataVector, capacity, action2);
                SharpCompress.Compressor.LZMA.Log.WriteLine();
                goto Label_06B0;
            Label_05BC:
                SharpCompress.Compressor.LZMA.Log.Write("CTime:");
                if (action3 == null)
                {
                    action3 = delegate (int i, DateTime? time) {
                        db.Files[i].CTime = time;
                        SharpCompress.Compressor.LZMA.Log.Write("  " + (time.HasValue ? time.Value.ToString() : "n/a"));
                    };
                }
                this.ReadDateTimeVector(dataVector, capacity, action3);
                SharpCompress.Compressor.LZMA.Log.WriteLine();
                goto Label_06B0;
            Label_05F3:
                SharpCompress.Compressor.LZMA.Log.Write("ATime:");
                if (action4 == null)
                {
                    action4 = delegate (int i, DateTime? time) {
                        db.Files[i].ATime = time;
                        SharpCompress.Compressor.LZMA.Log.Write("  " + (time.HasValue ? time.Value.ToString() : "n/a"));
                    };
                }
                this.ReadDateTimeVector(dataVector, capacity, action4);
                SharpCompress.Compressor.LZMA.Log.WriteLine();
                goto Label_06B0;
            Label_062A:
                SharpCompress.Compressor.LZMA.Log.Write("MTime:");
                if (action5 == null)
                {
                    action5 = delegate (int i, DateTime? time) {
                        db.Files[i].MTime = time;
                        SharpCompress.Compressor.LZMA.Log.Write("  " + (time.HasValue ? time.Value.ToString() : "n/a"));
                    };
                }
                this.ReadDateTimeVector(dataVector, capacity, action5);
                SharpCompress.Compressor.LZMA.Log.WriteLine();
                goto Label_06B0;
            Label_067B:
                if (this.ReadByte() != 0)
                {
                    throw new InvalidOperationException();
                }
                num6 += 1L;
            Label_0697:
                if (num6 < size)
                {
                    goto Label_067B;
                }
                goto Label_06B0;
            Label_06A5:
                this.SkipData(size);
            Label_06B0:
                if (((db.MajorVersion > 0) || (db.MinorVersion > 2)) && ((this._currentReader.Offset - offset) != size))
                {
                    throw new InvalidOperationException();
                }
            Label_06FC:
                flag2 = true;
                goto Label_02DA;
            Label_0704:
                num7 = 0;
                int num8 = 0;
                for (num = 0; num < capacity; num++)
                {
                    CFileItem item = db.Files[num];
                    item.HasStream = !vector[num];
                    if (item.HasStream)
                    {
                        item.IsDir = false;
                        item.IsAnti = false;
                        item.Size = list2[num8];
                        item.Crc = list3[num8];
                        num8++;
                    }
                    else
                    {
                        item.IsDir = !vector2[num7];
                        item.IsAnti = vector3[num7];
                        num7++;
                        item.Size = 0L;
                        item.Crc = null;
                    }
                }
            }
            finally
            {
                SharpCompress.Compressor.LZMA.Log.PopIndent();
            }
        }
Example #53
0
 public static ICryptoManager Create(SymmetricAlgorithm symmetricAlgorithm, HashAlgorithm hashAlgorithm, IPasswordProvider passwordProvider)
 {
     return new CryptoManager(symmetricAlgorithm, hashAlgorithm, passwordProvider);
 }
Example #54
0
        private Stream GetCachedDecoderStream(ArchiveDatabase _db, int folderIndex, IPasswordProvider pw)
        {
            Stream s;
            if (!_cachedStreams.TryGetValue(folderIndex, out s))
            {
                CFolder folderInfo = _db.Folders[folderIndex];
                int packStreamIndex = _db.Folders[folderIndex].FirstPackStreamId;
                long folderStartPackPos = _db.GetFolderStreamPos(folderInfo, 0);
                List<long> packSizes = new List<long>();
                for (int j = 0; j < folderInfo.PackStreams.Count; j++)
                    packSizes.Add(_db.PackSizes[packStreamIndex + j]);

                s = DecoderStreamHelper.CreateDecoderStream(_stream, folderStartPackPos, packSizes.ToArray(), folderInfo,
                                                            pw);
                _cachedStreams.Add(folderIndex, s);
            }
            return s;
        }
Example #55
0
        public void Extract(ArchiveDatabase _db, int[] indices, IPasswordProvider pw)
        {
            int numItems;
            bool allFilesMode = (indices == null);
            if (allFilesMode)
                numItems = _db.Files.Count;
            else
                numItems = indices.Length;

            if (numItems == 0)
                return;

            List<CExtractFolderInfo> extractFolderInfoVector = new List<CExtractFolderInfo>();
            for (int i = 0; i < numItems; i++)
            {
                int fileIndex = allFilesMode ? i : indices[i];

                int folderIndex = _db.FileIndexToFolderIndexMap[fileIndex];
                if (folderIndex == -1)
                {
                    extractFolderInfoVector.Add(new CExtractFolderInfo(fileIndex, -1));
                    continue;
                }

                if (extractFolderInfoVector.Count == 0 || folderIndex != extractFolderInfoVector.Last().FolderIndex)
                    extractFolderInfoVector.Add(new CExtractFolderInfo(-1, folderIndex));

                CExtractFolderInfo efi = extractFolderInfoVector.Last();

                int startIndex = _db.FolderStartFileIndex[folderIndex];
                for (int index = efi.ExtractStatuses.Count; index <= fileIndex - startIndex; index++)
                    efi.ExtractStatuses.Add(index == fileIndex - startIndex);
            }

            foreach (CExtractFolderInfo efi in extractFolderInfoVector)
            {
                int startIndex;
                if (efi.FileIndex != -1)
                    startIndex = efi.FileIndex;
                else
                    startIndex = _db.FolderStartFileIndex[efi.FolderIndex];

                var outStream = new FolderUnpackStream(_db, 0, startIndex, efi.ExtractStatuses);

                if (efi.FileIndex != -1)
                    continue;

                int folderIndex = efi.FolderIndex;
                CFolder folderInfo = _db.Folders[folderIndex];

                int packStreamIndex = _db.Folders[folderIndex].FirstPackStreamId;
                long folderStartPackPos = _db.GetFolderStreamPos(folderInfo, 0);

                List<long> packSizes = new List<long>();
                for (int j = 0; j < folderInfo.PackStreams.Count; j++)
                    packSizes.Add(_db.PackSizes[packStreamIndex + j]);

                // TODO: If the decoding fails the last file may be extracted incompletely. Delete it?

                Stream s = DecoderStreamHelper.CreateDecoderStream(_stream, folderStartPackPos, packSizes.ToArray(),
                                                                   folderInfo, pw);
                byte[] buffer = new byte[4 << 10];
                for (; ; )
                {
                    int processed = s.Read(buffer, 0, buffer.Length);
                    if (processed == 0)
                        break;
                    outStream.Write(buffer, 0, processed);
                }
            }
        }
Example #56
0
 private Stream GetCachedDecoderStream(ArchiveDatabase _db, int folderIndex, IPasswordProvider pw)
 {
     Stream stream;
     if (!this._cachedStreams.TryGetValue(folderIndex, out stream))
     {
         CFolder folder = _db.Folders[folderIndex];
         int firstPackStreamId = _db.Folders[folderIndex].FirstPackStreamId;
         long folderStreamPos = _db.GetFolderStreamPos(folder, 0);
         List<long> list = new List<long>();
         for (int i = 0; i < folder.PackStreams.Count; i++)
         {
             list.Add(_db.PackSizes[firstPackStreamId + i]);
         }
         stream = DecoderStreamHelper.CreateDecoderStream(this._stream, folderStreamPos, list.ToArray(), folder, pw);
         this._cachedStreams.Add(folderIndex, stream);
     }
     return stream;
 }
Example #57
0
        private void ReadHeader(ArchiveDatabase db, IPasswordProvider getTextPassword)
        {
            #if DEBUG
            Log.WriteLine("-- ReadHeader --");
            Log.PushIndent();
            #endif
            try
            {
                BlockType? type = ReadId();

                if (type == BlockType.ArchiveProperties)
                {
                    ReadArchiveProperties();
                    type = ReadId();
                }

                List<byte[]> dataVector = null;
                if (type == BlockType.AdditionalStreamsInfo)
                {
                    dataVector = ReadAndDecodePackedStreams(db.StartPositionAfterHeader, getTextPassword);
                    type = ReadId();
                }

                List<long> unpackSizes;
                List<uint?> digests;

                if (type == BlockType.MainStreamsInfo)
                {
                    ReadStreamsInfo(dataVector,
                                    out db.DataStartPosition,
                                    out db.PackSizes,
                                    out db.PackCRCs,
                                    out db.Folders,
                                    out db.NumUnpackStreamsVector,
                                    out unpackSizes,
                                    out digests);

                    db.DataStartPosition += db.StartPositionAfterHeader;
                    type = ReadId();
                }
                else
                {
                    unpackSizes = new List<long>(db.Folders.Count);
                    digests = new List<uint?>(db.Folders.Count);
                    db.NumUnpackStreamsVector = new List<int>(db.Folders.Count);
                    for (int i = 0; i < db.Folders.Count; i++)
                    {
                        var folder = db.Folders[i];
                        unpackSizes.Add(folder.GetUnpackSize());
                        digests.Add(folder.UnpackCRC);
                        db.NumUnpackStreamsVector.Add(1);
                    }
                }

                db.Files.Clear();

                if (type == BlockType.End)
                    return;

                if (type != BlockType.FilesInfo)
                    throw new InvalidOperationException();

                int numFiles = ReadNum();
            #if DEBUG
                Log.WriteLine("NumFiles: " + numFiles);
            #endif
                db.Files = new List<CFileItem>(numFiles);
                for (int i = 0; i < numFiles; i++)
                    db.Files.Add(new CFileItem());

                BitVector emptyStreamVector = new BitVector(numFiles);
                BitVector emptyFileVector = null;
                BitVector antiFileVector = null;
                int numEmptyStreams = 0;

                for (; ; )
                {
                    type = ReadId();
                    if (type == BlockType.End)
                        break;

                    long size = checked((long)ReadNumber()); // TODO: throw invalid data on negative
                    int oldPos = _currentReader.Offset;
                    switch (type)
                    {
                        case BlockType.Name:
                            using (var streamSwitch = new CStreamSwitch())
                            {
                                streamSwitch.Set(this, dataVector);
            #if DEBUG
                                Log.Write("FileNames:");
            #endif
                                for (int i = 0; i < db.Files.Count; i++)
                                {
                                    db.Files[i].Name = _currentReader.ReadString();
            #if DEBUG
                                    Log.Write("  " + db.Files[i].Name);
            #endif
                                }
            #if DEBUG
                                Log.WriteLine();
            #endif
                            }
                            break;
                        case BlockType.WinAttributes:
            #if DEBUG
                            Log.Write("WinAttributes:");
            #endif
                            ReadAttributeVector(dataVector, numFiles, delegate(int i, uint? attr)
                                                                          {
                                                                              db.Files[i].Attrib = attr;
            #if DEBUG
                                                                              Log.Write("  " + (attr.HasValue ? attr.Value.ToString("x8") : "n/a"));
            #endif
                                                                          });
            #if DEBUG
                            Log.WriteLine();
            #endif
                            break;
                        case BlockType.EmptyStream:
                            emptyStreamVector = ReadBitVector(numFiles);
            #if DEBUG

                            Log.Write("EmptyStream: ");
            #endif
                            for (int i = 0; i < emptyStreamVector.Length; i++)
                            {
                                if (emptyStreamVector[i])
                                {
            #if DEBUG
                                    Log.Write("x");
            #endif
                                    numEmptyStreams++;
                                }
                                else
                                {
            #if DEBUG
                                    Log.Write(".");
            #endif
                                }
                            }
            #if DEBUG
                            Log.WriteLine();
            #endif

                            emptyFileVector = new BitVector(numEmptyStreams);
                            antiFileVector = new BitVector(numEmptyStreams);
                            break;
                        case BlockType.EmptyFile:
                            emptyFileVector = ReadBitVector(numEmptyStreams);
            #if DEBUG
                            Log.Write("EmptyFile: ");
                            for (int i = 0; i < numEmptyStreams; i++)
                                Log.Write(emptyFileVector[i] ? "x" : ".");
                            Log.WriteLine();
            #endif
                            break;
                        case BlockType.Anti:
                            antiFileVector = ReadBitVector(numEmptyStreams);
            #if DEBUG
                            Log.Write("Anti: ");
                            for (int i = 0; i < numEmptyStreams; i++)
                                Log.Write(antiFileVector[i] ? "x" : ".");
                            Log.WriteLine();
            #endif
                            break;
                        case BlockType.StartPos:
            #if DEBUG
                            Log.Write("StartPos:");
            #endif
                            ReadNumberVector(dataVector, numFiles, delegate(int i, long? startPos)
                                                                       {
                                                                           db.Files[i].StartPos = startPos;
            #if DEBUG
                                                                           Log.Write("  " + (startPos.HasValue ? startPos.Value.ToString() : "n/a"));
            #endif
                                                                       });
            #if DEBUG
                            Log.WriteLine();
            #endif
                            break;
                        case BlockType.CTime:
            #if DEBUG
                            Log.Write("CTime:");
            #endif
                            ReadDateTimeVector(dataVector, numFiles, delegate(int i, DateTime? time)
                                                                         {
                                                                             db.Files[i].CTime = time;
            #if DEBUG
                                                                             Log.Write("  " + (time.HasValue ? time.Value.ToString() : "n/a"));
            #endif
                                                                         });
            #if DEBUG
                            Log.WriteLine();
            #endif
                            break;
                        case BlockType.ATime:
            #if DEBUG
                            Log.Write("ATime:");
            #endif
                            ReadDateTimeVector(dataVector, numFiles, delegate(int i, DateTime? time)
                                                                         {
                                                                             db.Files[i].ATime = time;
            #if DEBUG
                                                                             Log.Write("  " + (time.HasValue ? time.Value.ToString() : "n/a"));
            #endif
                                                                         });
            #if DEBUG
                            Log.WriteLine();
            #endif
                            break;
                        case BlockType.MTime:
            #if DEBUG
                            Log.Write("MTime:");
            #endif
                            ReadDateTimeVector(dataVector, numFiles, delegate(int i, DateTime? time)
                                                                         {
                                                                             db.Files[i].MTime = time;
            #if DEBUG
                                                                             Log.Write("  " + (time.HasValue ? time.Value.ToString() : "n/a"));
            #endif
                                                                         });
            #if DEBUG
                            Log.WriteLine();
            #endif
                            break;
                        case BlockType.Dummy:
            #if DEBUG
                            Log.Write("Dummy: " + size);
            #endif
                            for (long j = 0; j < size; j++)
                                if (ReadByte() != 0)
                                    throw new InvalidOperationException();
                            break;
                        default:
                            SkipData(size);
                            break;
                    }

                    // since 0.3 record sizes must be correct
                    bool checkRecordsSize = (db.MajorVersion > 0 || db.MinorVersion > 2);
                    if (checkRecordsSize && _currentReader.Offset - oldPos != size)
                        throw new InvalidOperationException();
                }

                int emptyFileIndex = 0;
                int sizeIndex = 0;
                for (int i = 0; i < numFiles; i++)
                {
                    CFileItem file = db.Files[i];
                    file.HasStream = !emptyStreamVector[i];
                    if (file.HasStream)
                    {
                        file.IsDir = false;
                        file.IsAnti = false;
                        file.Size = unpackSizes[sizeIndex];
                        file.Crc = digests[sizeIndex];
                        sizeIndex++;
                    }
                    else
                    {
                        file.IsDir = !emptyFileVector[emptyFileIndex];
                        file.IsAnti = antiFileVector[emptyFileIndex];
                        emptyFileIndex++;
                        file.Size = 0;
                        file.Crc = null;
                    }
                }
            }
            finally
            {
            #if DEBUG
                Log.PopIndent();
            #endif
            }
        }
Example #58
0
 public ArchiveDatabase ReadDatabase(IPasswordProvider pass)
 {
     ArchiveDatabase db = new ArchiveDatabase();
     db.Clear();
     db.MajorVersion = this._header[6];
     db.MinorVersion = this._header[7];
     if (db.MajorVersion != 0)
     {
         throw new InvalidOperationException();
     }
     uint num = DataReader.Get32(this._header, 8);
     long num2 = (long) DataReader.Get64(this._header, 12);
     long num3 = (long) DataReader.Get64(this._header, 20);
     uint num4 = DataReader.Get32(this._header, 0x1c);
     uint maxValue = uint.MaxValue;
     if (CRC.Finish(CRC.Update(CRC.Update(CRC.Update(maxValue, num2), num3), num4)) != num)
     {
         throw new InvalidOperationException();
     }
     db.StartPositionAfterHeader = this._streamOrigin + 0x20L;
     if (num3 == 0L)
     {
         db.Fill();
         return db;
     }
     if (((num2 < 0L) || (num3 < 0L)) || (num3 > 0x7fffffffL))
     {
         throw new InvalidOperationException();
     }
     if (num2 > (this._streamEnding - db.StartPositionAfterHeader))
     {
         throw new IndexOutOfRangeException();
     }
     this._stream.Seek(num2, SeekOrigin.Current);
     byte[] buffer = new byte[num3];
     Utils.ReadExact(this._stream, buffer, 0, buffer.Length);
     if (CRC.Finish(CRC.Update(uint.MaxValue, buffer, 0, buffer.Length)) != num4)
     {
         throw new InvalidOperationException();
     }
     using (CStreamSwitch switch2 = new CStreamSwitch())
     {
         switch2.Set(this, buffer);
         BlockType? nullable = this.ReadId();
         if (((BlockType) nullable) != BlockType.Header)
         {
             if (((BlockType) nullable) != BlockType.EncodedHeader)
             {
                 throw new InvalidOperationException();
             }
             List<byte[]> list = this.ReadAndDecodePackedStreams(db.StartPositionAfterHeader, pass);
             if (list.Count == 0)
             {
                 db.Fill();
                 return db;
             }
             if (list.Count != 1)
             {
                 throw new InvalidOperationException();
             }
             switch2.Set(this, list[0]);
             if (((BlockType) this.ReadId()) != BlockType.Header)
             {
                 throw new InvalidOperationException();
             }
         }
         this.ReadHeader(db, pass);
     }
     db.Fill();
     return db;
 }
Example #59
0
 public Stream OpenStream(ArchiveDatabase _db, int fileIndex, IPasswordProvider pw)
 {
     int folderIndex = _db.FileIndexToFolderIndexMap[fileIndex];
     int num2 = _db.NumUnpackStreamsVector[folderIndex];
     int num3 = _db.FolderStartFileIndex[folderIndex];
     if ((num3 > fileIndex) || ((fileIndex - num3) >= num2))
     {
         throw new InvalidOperationException();
     }
     int num4 = fileIndex - num3;
     long num5 = 0L;
     for (int i = 0; i < num4; i++)
     {
         num5 += _db.Files[num3 + i].Size;
     }
     Stream stream = this.GetCachedDecoderStream(_db, folderIndex, pw);
     stream.Position = num5;
     return new ReadOnlySubStream(stream, _db.Files[fileIndex].Size);
 }
 public SecureHashingManager(HMAC secureHashAlgorithm, IPasswordProvider passwordProvider)
 {
     _passwordProvider = passwordProvider;
     _secureHashAlgorithm = secureHashAlgorithm;
 }