omnizip 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +32 -0
- data/.rubocop_todo.yml +754 -0
- data/COPYING +502 -0
- data/Gemfile +17 -0
- data/LICENSE +12 -0
- data/README.adoc +1045 -0
- data/Rakefile +12 -0
- data/benchmark/README.md +260 -0
- data/benchmark/benchmark_suite.rb +125 -0
- data/benchmark/compression_bench.rb +181 -0
- data/benchmark/filter_bench.rb +180 -0
- data/benchmark/models/benchmark_result.rb +59 -0
- data/benchmark/models/comparison_result.rb +69 -0
- data/benchmark/profile_suite.rb +167 -0
- data/benchmark/reporter.rb +150 -0
- data/benchmark/run_benchmarks.rb +66 -0
- data/benchmark/test_data.rb +137 -0
- data/config/formats/rar3_spec.yml +91 -0
- data/config/formats/rar5_spec.yml +102 -0
- data/docs/.github/workflows/docs.yml +142 -0
- data/docs/.gitignore +21 -0
- data/docs/.lychee.toml +67 -0
- data/docs/Gemfile +13 -0
- data/docs/RAR_WRITE_SUPPORT.md +26 -0
- data/docs/README.md +101 -0
- data/docs/_config.yml +112 -0
- data/docs/assets/logo.svg +1 -0
- data/docs/assets/omnizip-logo.pdf +1540 -11
- data/docs/comparison/feature-matrix.adoc +694 -0
- data/docs/comparison/index.adoc +113 -0
- data/docs/comparison/vs-7zip.adoc +309 -0
- data/docs/comparison/vs-peazip.adoc +77 -0
- data/docs/comparison/vs-rubyzip.adoc +342 -0
- data/docs/comparison/vs-winrar.adoc +100 -0
- data/docs/compatibility.adoc +579 -0
- data/docs/concepts/index.adoc +129 -0
- data/docs/developer/architecture.adoc +256 -0
- data/docs/developer/contributing.adoc +158 -0
- data/docs/developer/index.adoc +25 -0
- data/docs/developer/testing.adoc +212 -0
- data/docs/getting-started/basic-usage.adoc +271 -0
- data/docs/getting-started/index.adoc +42 -0
- data/docs/getting-started/installation.adoc +138 -0
- data/docs/getting-started/quick-start.adoc +185 -0
- data/docs/getting-started/your-first-archive.adoc +218 -0
- data/docs/guides/advanced-features/encryption.adoc +300 -0
- data/docs/guides/advanced-features/index.adoc +49 -0
- data/docs/guides/advanced-features/parallel-processing.adoc +246 -0
- data/docs/guides/advanced-features/progress-tracking.adoc +320 -0
- data/docs/guides/advanced-features/streaming.adoc +212 -0
- data/docs/guides/archive-formats/gzip-format.adoc +107 -0
- data/docs/guides/archive-formats/index.adoc +130 -0
- data/docs/guides/archive-formats/rar-format.adoc +104 -0
- data/docs/guides/archive-formats/rar5.adoc +521 -0
- data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
- data/docs/guides/archive-formats/tar-format.adoc +106 -0
- data/docs/guides/archive-formats/xz-format.adoc +118 -0
- data/docs/guides/archive-formats/zip-format.adoc +35 -0
- data/docs/guides/compression-algorithms/bzip2.adoc +113 -0
- data/docs/guides/compression-algorithms/deflate.adoc +319 -0
- data/docs/guides/compression-algorithms/index.adoc +190 -0
- data/docs/guides/compression-algorithms/lzma.adoc +398 -0
- data/docs/guides/compression-algorithms/lzma2.adoc +327 -0
- data/docs/guides/compression-algorithms/ppmd.adoc +316 -0
- data/docs/guides/compression-algorithms/zstandard.adoc +361 -0
- data/docs/guides/creating-archives.adoc +354 -0
- data/docs/guides/extracting-archives.adoc +53 -0
- data/docs/guides/format-conversion.adoc +64 -0
- data/docs/guides/index.adoc +49 -0
- data/docs/guides/migration-rubyzip.adoc +217 -0
- data/docs/guides/parity-archives.adoc +605 -0
- data/docs/guides/performance-tuning.adoc +88 -0
- data/docs/index.adoc +218 -0
- data/docs/lychee.toml +67 -0
- data/docs/reference/api/overview.adoc +188 -0
- data/docs/reference/cli/compress-command.adoc +114 -0
- data/docs/reference/cli/overview.adoc +140 -0
- data/docs/reference/index.adoc +26 -0
- data/docs/resources/faq.adoc +185 -0
- data/docs/resources/quick-reference.adoc +222 -0
- data/docs/troubleshooting/index.adoc +208 -0
- data/examples/api_comparison.rb +205 -0
- data/examples/deflate64_example.rb +96 -0
- data/examples/par2_demo.rb +121 -0
- data/examples/quick_start_native.rb +150 -0
- data/examples/quick_start_rubyzip.rb +115 -0
- data/examples/rubyzip_compatibility_demo.rb +194 -0
- data/exe/omnizip +27 -0
- data/lib/omnizip/algorithm.rb +130 -0
- data/lib/omnizip/algorithm_registry.rb +86 -0
- data/lib/omnizip/algorithms/.keep +0 -0
- data/lib/omnizip/algorithms/bzip2/bwt.rb +225 -0
- data/lib/omnizip/algorithms/bzip2/decoder.rb +193 -0
- data/lib/omnizip/algorithms/bzip2/encoder.rb +237 -0
- data/lib/omnizip/algorithms/bzip2/huffman.rb +206 -0
- data/lib/omnizip/algorithms/bzip2/mtf.rb +101 -0
- data/lib/omnizip/algorithms/bzip2/rle.rb +151 -0
- data/lib/omnizip/algorithms/bzip2.rb +130 -0
- data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
- data/lib/omnizip/algorithms/deflate/decoder.rb +38 -0
- data/lib/omnizip/algorithms/deflate/encoder.rb +46 -0
- data/lib/omnizip/algorithms/deflate.rb +128 -0
- data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
- data/lib/omnizip/algorithms/deflate64/decoder.rb +153 -0
- data/lib/omnizip/algorithms/deflate64/encoder.rb +98 -0
- data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +354 -0
- data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +142 -0
- data/lib/omnizip/algorithms/deflate64.rb +109 -0
- data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
- data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
- data/lib/omnizip/algorithms/lzma/decoder.rb +148 -0
- data/lib/omnizip/algorithms/lzma/dictionary.rb +69 -0
- data/lib/omnizip/algorithms/lzma/distance_coder.rb +415 -0
- data/lib/omnizip/algorithms/lzma/encoder.rb +142 -0
- data/lib/omnizip/algorithms/lzma/length_coder.rb +260 -0
- data/lib/omnizip/algorithms/lzma/literal_decoder.rb +320 -0
- data/lib/omnizip/algorithms/lzma/literal_encoder.rb +210 -0
- data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +341 -0
- data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +192 -0
- data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
- data/lib/omnizip/algorithms/lzma/match.rb +32 -0
- data/lib/omnizip/algorithms/lzma/match_finder.rb +205 -0
- data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
- data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +88 -0
- data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +130 -0
- data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
- data/lib/omnizip/algorithms/lzma/range_coder.rb +85 -0
- data/lib/omnizip/algorithms/lzma/range_decoder.rb +434 -0
- data/lib/omnizip/algorithms/lzma/range_encoder.rb +194 -0
- data/lib/omnizip/algorithms/lzma/state.rb +127 -0
- data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +325 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder.rb +426 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +645 -0
- data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +227 -0
- data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +169 -0
- data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +261 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +331 -0
- data/lib/omnizip/algorithms/lzma/xz_state.rb +116 -0
- data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +2055 -0
- data/lib/omnizip/algorithms/lzma.rb +238 -0
- data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +182 -0
- data/lib/omnizip/algorithms/lzma2/constants.rb +41 -0
- data/lib/omnizip/algorithms/lzma2/encoder.rb +147 -0
- data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +161 -0
- data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
- data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +127 -0
- data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
- data/lib/omnizip/algorithms/lzma2.rb +141 -0
- data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
- data/lib/omnizip/algorithms/ppmd7/context.rb +154 -0
- data/lib/omnizip/algorithms/ppmd7/decoder.rb +126 -0
- data/lib/omnizip/algorithms/ppmd7/encoder.rb +163 -0
- data/lib/omnizip/algorithms/ppmd7/model.rb +248 -0
- data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
- data/lib/omnizip/algorithms/ppmd7.rb +116 -0
- data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
- data/lib/omnizip/algorithms/ppmd8/context.rb +34 -0
- data/lib/omnizip/algorithms/ppmd8/decoder.rb +107 -0
- data/lib/omnizip/algorithms/ppmd8/encoder.rb +138 -0
- data/lib/omnizip/algorithms/ppmd8/model.rb +250 -0
- data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
- data/lib/omnizip/algorithms/ppmd8.rb +82 -0
- data/lib/omnizip/algorithms/ppmd_base.rb +138 -0
- data/lib/omnizip/algorithms/sevenzip_lzma2.rb +123 -0
- data/lib/omnizip/algorithms/xz_lzma2.rb +118 -0
- data/lib/omnizip/algorithms/zstandard/constants.rb +25 -0
- data/lib/omnizip/algorithms/zstandard/decoder.rb +46 -0
- data/lib/omnizip/algorithms/zstandard/encoder.rb +51 -0
- data/lib/omnizip/algorithms/zstandard.rb +138 -0
- data/lib/omnizip/buffer/memory_archive.rb +251 -0
- data/lib/omnizip/buffer/memory_extractor.rb +224 -0
- data/lib/omnizip/buffer.rb +176 -0
- data/lib/omnizip/checksum_registry.rb +114 -0
- data/lib/omnizip/checksums/crc32.rb +100 -0
- data/lib/omnizip/checksums/crc64.rb +101 -0
- data/lib/omnizip/checksums/crc_base.rb +158 -0
- data/lib/omnizip/checksums/verifier.rb +131 -0
- data/lib/omnizip/chunked/memory_manager.rb +194 -0
- data/lib/omnizip/chunked/reader.rb +78 -0
- data/lib/omnizip/chunked/writer.rb +120 -0
- data/lib/omnizip/chunked.rb +129 -0
- data/lib/omnizip/cli/output_formatter.rb +104 -0
- data/lib/omnizip/cli.rb +572 -0
- data/lib/omnizip/commands/.keep +0 -0
- data/lib/omnizip/commands/archive_create_command.rb +427 -0
- data/lib/omnizip/commands/archive_extract_command.rb +272 -0
- data/lib/omnizip/commands/archive_list_command.rb +218 -0
- data/lib/omnizip/commands/archive_repair_command.rb +131 -0
- data/lib/omnizip/commands/archive_verify_command.rb +117 -0
- data/lib/omnizip/commands/compress_command.rb +117 -0
- data/lib/omnizip/commands/decompress_command.rb +120 -0
- data/lib/omnizip/commands/list_command.rb +53 -0
- data/lib/omnizip/commands/metadata_command.rb +153 -0
- data/lib/omnizip/commands/parity_create_command.rb +122 -0
- data/lib/omnizip/commands/parity_repair_command.rb +122 -0
- data/lib/omnizip/commands/parity_verify_command.rb +124 -0
- data/lib/omnizip/commands/profile_list_command.rb +56 -0
- data/lib/omnizip/commands/profile_show_command.rb +44 -0
- data/lib/omnizip/convenience.rb +359 -0
- data/lib/omnizip/converter/conversion_registry.rb +49 -0
- data/lib/omnizip/converter/conversion_strategy.rb +121 -0
- data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +97 -0
- data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +112 -0
- data/lib/omnizip/converter.rb +105 -0
- data/lib/omnizip/crypto/aes256/cipher.rb +100 -0
- data/lib/omnizip/crypto/aes256/constants.rb +28 -0
- data/lib/omnizip/crypto/aes256/key_derivation.rb +101 -0
- data/lib/omnizip/crypto/aes256.rb +102 -0
- data/lib/omnizip/error.rb +106 -0
- data/lib/omnizip/eta/exponential_smoothing_estimator.rb +98 -0
- data/lib/omnizip/eta/moving_average_estimator.rb +99 -0
- data/lib/omnizip/eta/rate_calculator.rb +104 -0
- data/lib/omnizip/eta/sample_history.rb +143 -0
- data/lib/omnizip/eta/time_estimator.rb +106 -0
- data/lib/omnizip/eta.rb +63 -0
- data/lib/omnizip/extraction/filter_chain.rb +177 -0
- data/lib/omnizip/extraction/glob_pattern.rb +140 -0
- data/lib/omnizip/extraction/pattern_matcher.rb +70 -0
- data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
- data/lib/omnizip/extraction/regex_pattern.rb +50 -0
- data/lib/omnizip/extraction/selective_extractor.rb +240 -0
- data/lib/omnizip/extraction.rb +111 -0
- data/lib/omnizip/file_type/mime_classifier.rb +144 -0
- data/lib/omnizip/file_type.rb +113 -0
- data/lib/omnizip/filter.rb +139 -0
- data/lib/omnizip/filter_pipeline.rb +108 -0
- data/lib/omnizip/filter_registry.rb +166 -0
- data/lib/omnizip/filters/bcj.rb +279 -0
- data/lib/omnizip/filters/bcj2/constants.rb +53 -0
- data/lib/omnizip/filters/bcj2/decoder.rb +200 -0
- data/lib/omnizip/filters/bcj2/encoder.rb +61 -0
- data/lib/omnizip/filters/bcj2/stream_data.rb +93 -0
- data/lib/omnizip/filters/bcj2.rb +99 -0
- data/lib/omnizip/filters/bcj_arm.rb +176 -0
- data/lib/omnizip/filters/bcj_arm64.rb +244 -0
- data/lib/omnizip/filters/bcj_ia64.rb +196 -0
- data/lib/omnizip/filters/bcj_ppc.rb +190 -0
- data/lib/omnizip/filters/bcj_sparc.rb +176 -0
- data/lib/omnizip/filters/bcj_x86.rb +193 -0
- data/lib/omnizip/filters/delta.rb +196 -0
- data/lib/omnizip/filters/filter_base.rb +72 -0
- data/lib/omnizip/filters/registry.rb +123 -0
- data/lib/omnizip/filters/xz_delta.rb +258 -0
- data/lib/omnizip/format_detector.rb +162 -0
- data/lib/omnizip/format_registry.rb +59 -0
- data/lib/omnizip/formats/.keep +0 -0
- data/lib/omnizip/formats/bzip2_file.rb +172 -0
- data/lib/omnizip/formats/cpio/constants.rb +55 -0
- data/lib/omnizip/formats/cpio/entry.rb +385 -0
- data/lib/omnizip/formats/cpio/reader.rb +196 -0
- data/lib/omnizip/formats/cpio/writer.rb +234 -0
- data/lib/omnizip/formats/cpio.rb +140 -0
- data/lib/omnizip/formats/format_spec_loader.rb +230 -0
- data/lib/omnizip/formats/gzip.rb +238 -0
- data/lib/omnizip/formats/iso/directory_builder.rb +297 -0
- data/lib/omnizip/formats/iso/directory_record.rb +152 -0
- data/lib/omnizip/formats/iso/joliet.rb +204 -0
- data/lib/omnizip/formats/iso/path_table.rb +125 -0
- data/lib/omnizip/formats/iso/reader.rb +197 -0
- data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
- data/lib/omnizip/formats/iso/volume_builder.rb +320 -0
- data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
- data/lib/omnizip/formats/iso/writer.rb +530 -0
- data/lib/omnizip/formats/iso.rb +140 -0
- data/lib/omnizip/formats/lzip.rb +175 -0
- data/lib/omnizip/formats/lzma_alone.rb +171 -0
- data/lib/omnizip/formats/rar/archive_repairer.rb +243 -0
- data/lib/omnizip/formats/rar/archive_verifier.rb +195 -0
- data/lib/omnizip/formats/rar/block_parser.rb +243 -0
- data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
- data/lib/omnizip/formats/rar/compression/dispatcher.rb +217 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +216 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +158 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
- data/lib/omnizip/formats/rar/compression/ppmd/context.rb +105 -0
- data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +219 -0
- data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +262 -0
- data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
- data/lib/omnizip/formats/rar/constants.rb +82 -0
- data/lib/omnizip/formats/rar/decompressor.rb +238 -0
- data/lib/omnizip/formats/rar/external_writer.rb +312 -0
- data/lib/omnizip/formats/rar/header.rb +192 -0
- data/lib/omnizip/formats/rar/license_validator.rb +109 -0
- data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
- data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
- data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
- data/lib/omnizip/formats/rar/parity_handler.rb +292 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +202 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +578 -0
- data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
- data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
- data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +166 -0
- data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/header.rb +187 -0
- data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +264 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +194 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +109 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +142 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
- data/lib/omnizip/formats/rar/rar5/vint.rb +65 -0
- data/lib/omnizip/formats/rar/rar5/writer.rb +466 -0
- data/lib/omnizip/formats/rar/rar_format_base.rb +241 -0
- data/lib/omnizip/formats/rar/reader.rb +366 -0
- data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
- data/lib/omnizip/formats/rar/volume_manager.rb +168 -0
- data/lib/omnizip/formats/rar/writer.rb +431 -0
- data/lib/omnizip/formats/rar.rb +205 -0
- data/lib/omnizip/formats/rar3/compressor.rb +73 -0
- data/lib/omnizip/formats/rar3/decompressor.rb +66 -0
- data/lib/omnizip/formats/rar3/reader.rb +386 -0
- data/lib/omnizip/formats/rar3/writer.rb +219 -0
- data/lib/omnizip/formats/rar5/compressor.rb +73 -0
- data/lib/omnizip/formats/rar5/decompressor.rb +66 -0
- data/lib/omnizip/formats/rar5/reader.rb +342 -0
- data/lib/omnizip/formats/rar5/writer.rb +214 -0
- data/lib/omnizip/formats/seven_zip/coder_chain.rb +150 -0
- data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
- data/lib/omnizip/formats/seven_zip/encoded_header.rb +114 -0
- data/lib/omnizip/formats/seven_zip/encrypted_header.rb +142 -0
- data/lib/omnizip/formats/seven_zip/file_collector.rb +144 -0
- data/lib/omnizip/formats/seven_zip/header.rb +106 -0
- data/lib/omnizip/formats/seven_zip/header_encryptor.rb +134 -0
- data/lib/omnizip/formats/seven_zip/header_writer.rb +466 -0
- data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
- data/lib/omnizip/formats/seven_zip/models/file_entry.rb +58 -0
- data/lib/omnizip/formats/seven_zip/models/folder.rb +69 -0
- data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
- data/lib/omnizip/formats/seven_zip/parser.rb +660 -0
- data/lib/omnizip/formats/seven_zip/reader.rb +458 -0
- data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +632 -0
- data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +315 -0
- data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
- data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +162 -0
- data/lib/omnizip/formats/seven_zip/writer.rb +740 -0
- data/lib/omnizip/formats/seven_zip.rb +93 -0
- data/lib/omnizip/formats/tar/constants.rb +73 -0
- data/lib/omnizip/formats/tar/entry.rb +94 -0
- data/lib/omnizip/formats/tar/header.rb +168 -0
- data/lib/omnizip/formats/tar/reader.rb +121 -0
- data/lib/omnizip/formats/tar/writer.rb +216 -0
- data/lib/omnizip/formats/tar.rb +84 -0
- data/lib/omnizip/formats/xz/reader.rb +116 -0
- data/lib/omnizip/formats/xz.rb +237 -0
- data/lib/omnizip/formats/xz_impl/block_decoder.rb +754 -0
- data/lib/omnizip/formats/xz_impl/block_encoder.rb +306 -0
- data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
- data/lib/omnizip/formats/xz_impl/block_header_parser.rb +186 -0
- data/lib/omnizip/formats/xz_impl/constants.rb +49 -0
- data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
- data/lib/omnizip/formats/xz_impl/index_encoder.rb +122 -0
- data/lib/omnizip/formats/xz_impl/stream_decoder.rb +468 -0
- data/lib/omnizip/formats/xz_impl/stream_encoder.rb +99 -0
- data/lib/omnizip/formats/xz_impl/stream_footer.rb +81 -0
- data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +117 -0
- data/lib/omnizip/formats/xz_impl/stream_header.rb +55 -0
- data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +108 -0
- data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
- data/lib/omnizip/formats/xz_impl/writer.rb +421 -0
- data/lib/omnizip/formats/zip/central_directory_header.rb +195 -0
- data/lib/omnizip/formats/zip/constants.rb +69 -0
- data/lib/omnizip/formats/zip/end_of_central_directory.rb +133 -0
- data/lib/omnizip/formats/zip/local_file_header.rb +138 -0
- data/lib/omnizip/formats/zip/reader.rb +250 -0
- data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
- data/lib/omnizip/formats/zip/writer.rb +375 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +104 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +66 -0
- data/lib/omnizip/formats/zip/zip64_extra_field.rb +114 -0
- data/lib/omnizip/formats/zip.rb +50 -0
- data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
- data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
- data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
- data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
- data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
- data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +421 -0
- data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +465 -0
- data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +288 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +200 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +197 -0
- data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +141 -0
- data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +519 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +723 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +750 -0
- data/lib/omnizip/io/buffered_input.rb +146 -0
- data/lib/omnizip/io/buffered_output.rb +105 -0
- data/lib/omnizip/io/stream_manager.rb +115 -0
- data/lib/omnizip/link_handler/hard_link.rb +79 -0
- data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
- data/lib/omnizip/link_handler.rb +124 -0
- data/lib/omnizip/metadata/archive_metadata.rb +114 -0
- data/lib/omnizip/metadata/entry_metadata.rb +146 -0
- data/lib/omnizip/metadata/metadata_editor.rb +171 -0
- data/lib/omnizip/metadata/metadata_registry.rb +64 -0
- data/lib/omnizip/metadata/metadata_validator.rb +99 -0
- data/lib/omnizip/metadata.rb +57 -0
- data/lib/omnizip/models/.keep +0 -0
- data/lib/omnizip/models/algorithm_metadata.rb +73 -0
- data/lib/omnizip/models/compression_options.rb +71 -0
- data/lib/omnizip/models/conversion_options.rb +87 -0
- data/lib/omnizip/models/conversion_result.rb +135 -0
- data/lib/omnizip/models/eta_result.rb +46 -0
- data/lib/omnizip/models/extraction_rule.rb +115 -0
- data/lib/omnizip/models/filter_chain.rb +144 -0
- data/lib/omnizip/models/filter_config.rb +183 -0
- data/lib/omnizip/models/match_result.rb +124 -0
- data/lib/omnizip/models/optimization_suggestion.rb +91 -0
- data/lib/omnizip/models/parallel_options.rb +104 -0
- data/lib/omnizip/models/performance_result.rb +79 -0
- data/lib/omnizip/models/profile_report.rb +82 -0
- data/lib/omnizip/models/progress_options.rb +38 -0
- data/lib/omnizip/models/split_options.rb +116 -0
- data/lib/omnizip/optimization_registry.rb +81 -0
- data/lib/omnizip/parallel/job_queue.rb +209 -0
- data/lib/omnizip/parallel/job_scheduler.rb +203 -0
- data/lib/omnizip/parallel/parallel_compressor.rb +347 -0
- data/lib/omnizip/parallel/parallel_extractor.rb +329 -0
- data/lib/omnizip/parallel/worker_pool.rb +223 -0
- data/lib/omnizip/parallel.rb +149 -0
- data/lib/omnizip/parity/chunked_block_processor.rb +196 -0
- data/lib/omnizip/parity/galois16.rb +145 -0
- data/lib/omnizip/parity/models/creator_packet.rb +73 -0
- data/lib/omnizip/parity/models/file_description_packet.rb +133 -0
- data/lib/omnizip/parity/models/ifsc_packet.rb +123 -0
- data/lib/omnizip/parity/models/main_packet.rb +128 -0
- data/lib/omnizip/parity/models/packet.rb +156 -0
- data/lib/omnizip/parity/models/packet_registry.rb +109 -0
- data/lib/omnizip/parity/models/recovery_slice_packet.rb +78 -0
- data/lib/omnizip/parity/par2_creator.rb +531 -0
- data/lib/omnizip/parity/par2_repairer.rb +407 -0
- data/lib/omnizip/parity/par2_verifier.rb +364 -0
- data/lib/omnizip/parity/par2cmdline_algorithm.rb +110 -0
- data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
- data/lib/omnizip/parity/reed_solomon_decoder.rb +266 -0
- data/lib/omnizip/parity/reed_solomon_encoder.rb +111 -0
- data/lib/omnizip/parity/reed_solomon_matrix.rb +342 -0
- data/lib/omnizip/parity.rb +186 -0
- data/lib/omnizip/password/encryption_registry.rb +65 -0
- data/lib/omnizip/password/encryption_strategy.rb +96 -0
- data/lib/omnizip/password/password_validator.rb +129 -0
- data/lib/omnizip/password/winzip_aes_strategy.rb +192 -0
- data/lib/omnizip/password/zip_crypto_strategy.rb +141 -0
- data/lib/omnizip/password.rb +87 -0
- data/lib/omnizip/pipe/stream_compressor.rb +124 -0
- data/lib/omnizip/pipe/stream_decompressor.rb +174 -0
- data/lib/omnizip/pipe.rb +121 -0
- data/lib/omnizip/platform/ntfs_streams.rb +201 -0
- data/lib/omnizip/platform.rb +189 -0
- data/lib/omnizip/profile/archive_profile.rb +39 -0
- data/lib/omnizip/profile/balanced_profile.rb +33 -0
- data/lib/omnizip/profile/binary_profile.rb +36 -0
- data/lib/omnizip/profile/compression_profile.rb +158 -0
- data/lib/omnizip/profile/custom_profile.rb +157 -0
- data/lib/omnizip/profile/fast_profile.rb +33 -0
- data/lib/omnizip/profile/maximum_profile.rb +33 -0
- data/lib/omnizip/profile/profile_detector.rb +110 -0
- data/lib/omnizip/profile/profile_registry.rb +161 -0
- data/lib/omnizip/profile/text_profile.rb +36 -0
- data/lib/omnizip/profile.rb +190 -0
- data/lib/omnizip/profiler/memory_profiler.rb +66 -0
- data/lib/omnizip/profiler/method_profiler.rb +49 -0
- data/lib/omnizip/profiler/report_generator.rb +169 -0
- data/lib/omnizip/profiler.rb +204 -0
- data/lib/omnizip/progress/callback_reporter.rb +36 -0
- data/lib/omnizip/progress/console_reporter.rb +62 -0
- data/lib/omnizip/progress/log_reporter.rb +91 -0
- data/lib/omnizip/progress/operation_progress.rb +118 -0
- data/lib/omnizip/progress/progress_bar.rb +156 -0
- data/lib/omnizip/progress/progress_reporter.rb +40 -0
- data/lib/omnizip/progress/progress_tracker.rb +190 -0
- data/lib/omnizip/progress/silent_reporter.rb +24 -0
- data/lib/omnizip/progress.rb +127 -0
- data/lib/omnizip/rubyzip_compat.rb +63 -0
- data/lib/omnizip/temp/safe_extract.rb +168 -0
- data/lib/omnizip/temp/temp_file.rb +124 -0
- data/lib/omnizip/temp/temp_file_pool.rb +109 -0
- data/lib/omnizip/temp.rb +181 -0
- data/lib/omnizip/version.rb +5 -0
- data/lib/omnizip/zip/entry.rb +156 -0
- data/lib/omnizip/zip/file.rb +485 -0
- data/lib/omnizip/zip/input_stream.rb +273 -0
- data/lib/omnizip/zip/output_stream.rb +324 -0
- data/lib/omnizip.rb +156 -0
- data/readme-docs/advanced-features.adoc +515 -0
- data/readme-docs/api-usage.adoc +444 -0
- data/readme-docs/architecture.adoc +449 -0
- data/readme-docs/archive-formats.adoc +479 -0
- data/readme-docs/cli-usage.adoc +222 -0
- data/readme-docs/compression-algorithms.adoc +442 -0
- data/readme-docs/compression-profiles.adoc +247 -0
- data/readme-docs/encryption-checksums.adoc +328 -0
- data/readme-docs/format-converter.adoc +325 -0
- data/readme-docs/installation.adoc +228 -0
- data/readme-docs/par2-archives.adoc +608 -0
- data/readme-docs/performance-profiler.adoc +389 -0
- data/readme-docs/preprocessing-filters.adoc +280 -0
- data/xz-file-format-1.2.1.txt +1174 -0
- metadata +617 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
= Encryption & Checksums Guide
|
|
2
|
+
:toc:
|
|
3
|
+
:toclevels: 3
|
|
4
|
+
|
|
5
|
+
== Purpose
|
|
6
|
+
|
|
7
|
+
This document covers encryption and checksum features in Omnizip for securing archives and verifying data integrity.
|
|
8
|
+
|
|
9
|
+
== AES-256 Encryption
|
|
10
|
+
|
|
11
|
+
=== General
|
|
12
|
+
|
|
13
|
+
Omnizip provides password-protected archive encryption using AES-256-CBC with SHA-256 key derivation. This ensures strong security for sensitive data in archives.
|
|
14
|
+
|
|
15
|
+
=== How It Works
|
|
16
|
+
|
|
17
|
+
. **Key Derivation:** Password is hashed using SHA-256 to create encryption key
|
|
18
|
+
. **Encryption:** Data is encrypted using AES-256 in CBC (Cipher Block Chaining) mode
|
|
19
|
+
. **Initialization Vector (IV):** Random IV is generated for each archive
|
|
20
|
+
. **Storage:** Encrypted data and IV are stored in archive metadata
|
|
21
|
+
|
|
22
|
+
=== Security Features
|
|
23
|
+
|
|
24
|
+
* **AES-256:** Industry-standard strong encryption (256-bit key)
|
|
25
|
+
* **CBC Mode:** Cipher Block Chaining prevents pattern analysis
|
|
26
|
+
* **SHA-256:** Secure hash function for key derivation
|
|
27
|
+
* **Random IV:** Each archive has unique initialization vector
|
|
28
|
+
* **Salt:** Password is salted before hashing (prevents rainbow tables)
|
|
29
|
+
|
|
30
|
+
=== Usage with .7z Archives
|
|
31
|
+
|
|
32
|
+
[source,ruby]
|
|
33
|
+
----
|
|
34
|
+
# Create encrypted archive
|
|
35
|
+
writer = Omnizip::Formats::SevenZip::Writer.new(
|
|
36
|
+
'secure_archive.7z',
|
|
37
|
+
password: "my_secure_password"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
writer.add_file('sensitive_document.pdf')
|
|
41
|
+
writer.add_file('confidential_data.xlsx')
|
|
42
|
+
writer.close
|
|
43
|
+
|
|
44
|
+
# Extract encrypted archive
|
|
45
|
+
reader = Omnizip::Formats::SevenZip::Reader.new(
|
|
46
|
+
'secure_archive.7z',
|
|
47
|
+
password: "my_secure_password"
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
reader.extract_all('output/')
|
|
51
|
+
reader.close
|
|
52
|
+
----
|
|
53
|
+
|
|
54
|
+
=== Password Strength Recommendations
|
|
55
|
+
|
|
56
|
+
**Weak (avoid):**
|
|
57
|
+
* Single words
|
|
58
|
+
* Common passwords
|
|
59
|
+
* < 8 characters
|
|
60
|
+
* No special characters
|
|
61
|
+
|
|
62
|
+
**Strong (recommended):**
|
|
63
|
+
* 12+ characters
|
|
64
|
+
* Mix of uppercase, lowercase, numbers, symbols
|
|
65
|
+
* Not based on dictionary words
|
|
66
|
+
* Unique for each archive
|
|
67
|
+
|
|
68
|
+
**Example strong passwords:**
|
|
69
|
+
* `mK9$pL2#nQ5@vR8!`
|
|
70
|
+
* `Correct-Horse-Battery-Staple-2024`
|
|
71
|
+
* `Th1s!sMyS3cur3P@ssw0rd`
|
|
72
|
+
|
|
73
|
+
=== Security Considerations
|
|
74
|
+
|
|
75
|
+
**What encryption protects:**
|
|
76
|
+
* File contents from unauthorized access
|
|
77
|
+
* Archive contents from modification
|
|
78
|
+
* Data confidentiality during storage/transfer
|
|
79
|
+
|
|
80
|
+
**What encryption does NOT protect:**
|
|
81
|
+
* File names (visible in archive)
|
|
82
|
+
* File sizes (visible in archive)
|
|
83
|
+
* Directory structure (visible in archive)
|
|
84
|
+
* Metadata (creation dates, etc.)
|
|
85
|
+
|
|
86
|
+
**Important notes:**
|
|
87
|
+
* Store passwords securely (password managers recommended)
|
|
88
|
+
* Lost passwords cannot be recovered
|
|
89
|
+
* Stronger passwords require more time to crack
|
|
90
|
+
* Consider using key files for additional security
|
|
91
|
+
|
|
92
|
+
=== Performance Impact
|
|
93
|
+
|
|
94
|
+
Encryption adds minimal overhead:
|
|
95
|
+
|
|
96
|
+
* **Encryption:** ~5-10% slower than unencrypted
|
|
97
|
+
* **Decryption:** ~5-10% slower than unencrypted
|
|
98
|
+
* **Memory:** No significant increase
|
|
99
|
+
|
|
100
|
+
The security benefits far outweigh the small performance cost.
|
|
101
|
+
|
|
102
|
+
== CRC32 Checksums
|
|
103
|
+
|
|
104
|
+
=== General
|
|
105
|
+
|
|
106
|
+
CRC32 (Cyclic Redundancy Check 32-bit) provides fast integrity verification for compressed data. It detects accidental corruption but is not cryptographically secure.
|
|
107
|
+
|
|
108
|
+
=== Characteristics
|
|
109
|
+
|
|
110
|
+
* **Size:** 32-bit (4 bytes)
|
|
111
|
+
* **Speed:** Very fast
|
|
112
|
+
* **Collision resistance:** Moderate
|
|
113
|
+
* **Use case:** Detect accidental corruption
|
|
114
|
+
|
|
115
|
+
=== Usage
|
|
116
|
+
|
|
117
|
+
[source,ruby]
|
|
118
|
+
----
|
|
119
|
+
# Calculate CRC32 of data
|
|
120
|
+
data = File.binread('file.txt')
|
|
121
|
+
crc32 = Omnizip::ChecksumRegistry.get(:crc32).calculate(data)
|
|
122
|
+
|
|
123
|
+
puts "CRC32: #{crc32.to_s(16).upcase}" # Hexadecimal format
|
|
124
|
+
----
|
|
125
|
+
|
|
126
|
+
=== When to Use CRC32
|
|
127
|
+
|
|
128
|
+
**Good for:**
|
|
129
|
+
* ZIP archives (standard checksum)
|
|
130
|
+
* Quick integrity checks
|
|
131
|
+
* Detecting transmission errors
|
|
132
|
+
* Low-overhead verification
|
|
133
|
+
|
|
134
|
+
**Not suitable for:**
|
|
135
|
+
* Security-critical applications
|
|
136
|
+
* Detecting intentional tampering
|
|
137
|
+
* Cryptographic purposes
|
|
138
|
+
|
|
139
|
+
== CRC64 Checksums
|
|
140
|
+
|
|
141
|
+
=== General
|
|
142
|
+
|
|
143
|
+
CRC64 (Cyclic Redundancy Check 64-bit) provides stronger integrity verification than CRC32 with very low collision probability. Used in .7z archives for reliable data verification.
|
|
144
|
+
|
|
145
|
+
=== Characteristics
|
|
146
|
+
|
|
147
|
+
* **Size:** 64-bit (8 bytes)
|
|
148
|
+
* **Speed:** Very fast
|
|
149
|
+
* **Collision resistance:** Very high
|
|
150
|
+
* **Use case:** Reliable corruption detection
|
|
151
|
+
|
|
152
|
+
=== Usage
|
|
153
|
+
|
|
154
|
+
[source,ruby]
|
|
155
|
+
----
|
|
156
|
+
# Calculate CRC64 of data
|
|
157
|
+
data = File.binread('large_file.dat')
|
|
158
|
+
crc64 = Omnizip::ChecksumRegistry.get(:crc64).calculate(data)
|
|
159
|
+
|
|
160
|
+
puts "CRC64: #{crc64.to_s(16).upcase}"
|
|
161
|
+
----
|
|
162
|
+
|
|
163
|
+
=== When to Use CRC64
|
|
164
|
+
|
|
165
|
+
**Good for:**
|
|
166
|
+
* .7z archives (standard checksum)
|
|
167
|
+
* Large files (> 4GB)
|
|
168
|
+
* High-reliability verification
|
|
169
|
+
* Minimal collision risk needed
|
|
170
|
+
|
|
171
|
+
**Advantages over CRC32:**
|
|
172
|
+
* Much lower collision probability
|
|
173
|
+
* Better for large datasets
|
|
174
|
+
* More reliable for critical data
|
|
175
|
+
|
|
176
|
+
## Checksum Comparison
|
|
177
|
+
|
|
178
|
+
[cols="20,20,20,20,20",options="header"]
|
|
179
|
+
|===
|
|
180
|
+
|Feature |CRC32 |CRC64 |MD5 |SHA-256
|
|
181
|
+
|
|
182
|
+
|Size
|
|
183
|
+
|4 bytes
|
|
184
|
+
|8 bytes
|
|
185
|
+
|16 bytes
|
|
186
|
+
|32 bytes
|
|
187
|
+
|
|
188
|
+
|Speed
|
|
189
|
+
|⭐⭐⭐⭐⭐
|
|
190
|
+
|⭐⭐⭐⭐⭐
|
|
191
|
+
|⭐⭐⭐⭐
|
|
192
|
+
|⭐⭐⭐
|
|
193
|
+
|
|
194
|
+
|Collision Resistance
|
|
195
|
+
|⭐⭐
|
|
196
|
+
|⭐⭐⭐⭐
|
|
197
|
+
|⭐⭐⭐
|
|
198
|
+
|⭐⭐⭐⭐⭐
|
|
199
|
+
|
|
200
|
+
|Cryptographic Security
|
|
201
|
+
|❌ No
|
|
202
|
+
|❌ No
|
|
203
|
+
|⚠️ Weak
|
|
204
|
+
|✅ Yes
|
|
205
|
+
|
|
206
|
+
|Best Use Case
|
|
207
|
+
|ZIP archives
|
|
208
|
+
|.7z archives
|
|
209
|
+
|Legacy systems
|
|
210
|
+
|Security-critical
|
|
211
|
+
|===
|
|
212
|
+
|
|
213
|
+
**Note:** MD5 and SHA-256 are not currently implemented in Omnizip core, but can be added if needed.
|
|
214
|
+
|
|
215
|
+
== Archive Integrity Verification
|
|
216
|
+
|
|
217
|
+
=== Automatic Verification
|
|
218
|
+
|
|
219
|
+
Omnizip automatically verifies checksums during extraction:
|
|
220
|
+
|
|
221
|
+
[source,ruby]
|
|
222
|
+
----
|
|
223
|
+
# Extraction automatically verifies checksums
|
|
224
|
+
reader = Omnizip::Formats::SevenZip::Reader.new('archive.7z')
|
|
225
|
+
|
|
226
|
+
begin
|
|
227
|
+
reader.extract_all('output/')
|
|
228
|
+
puts "✓ All files verified successfully"
|
|
229
|
+
rescue Omnizip::ChecksumMismatchError => e
|
|
230
|
+
puts "✗ Checksum verification failed: #{e.message}"
|
|
231
|
+
puts "File may be corrupted: #{e.filename}"
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
reader.close
|
|
235
|
+
----
|
|
236
|
+
|
|
237
|
+
=== Manual Verification
|
|
238
|
+
|
|
239
|
+
You can manually verify checksums without extraction:
|
|
240
|
+
|
|
241
|
+
[source,ruby]
|
|
242
|
+
----
|
|
243
|
+
# Verify archive integrity without extracting
|
|
244
|
+
reader = Omnizip::Formats::SevenZip::Reader.new('archive.7z')
|
|
245
|
+
|
|
246
|
+
reader.entries.each do |entry|
|
|
247
|
+
# Get stored checksum
|
|
248
|
+
stored_crc = entry.crc
|
|
249
|
+
|
|
250
|
+
# Read and calculate actual checksum
|
|
251
|
+
data = reader.read_entry_data(entry)
|
|
252
|
+
calculated_crc = Omnizip::ChecksumRegistry.get(:crc64).calculate(data)
|
|
253
|
+
|
|
254
|
+
if stored_crc == calculated_crc
|
|
255
|
+
puts "✓ #{entry.name}: OK"
|
|
256
|
+
else
|
|
257
|
+
puts "✗ #{entry.name}: CORRUPTED"
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
reader.close
|
|
262
|
+
----
|
|
263
|
+
|
|
264
|
+
== Combined Security: Encryption + Checksums
|
|
265
|
+
|
|
266
|
+
Omnizip uses both encryption and checksums for maximum security and integrity:
|
|
267
|
+
|
|
268
|
+
[source,ruby]
|
|
269
|
+
----
|
|
270
|
+
# Create secure archive with both encryption and checksums
|
|
271
|
+
writer = Omnizip::Formats::SevenZip::Writer.new(
|
|
272
|
+
'secure_archive.7z',
|
|
273
|
+
password: "strong_password_here",
|
|
274
|
+
checksum: :crc64 # Default, can be explicit
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
writer.add_file('important_data.xlsx')
|
|
278
|
+
writer.close
|
|
279
|
+
|
|
280
|
+
# Extraction verifies both encryption and checksums
|
|
281
|
+
reader = Omnizip::Formats::SevenZip::Reader.new(
|
|
282
|
+
'secure_archive.7z',
|
|
283
|
+
password: "strong_password_here"
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
begin
|
|
287
|
+
reader.extract_all('output/')
|
|
288
|
+
puts "✓ Password correct, checksums valid, data intact"
|
|
289
|
+
rescue Omnizip::WrongPasswordError
|
|
290
|
+
puts "✗ Incorrect password"
|
|
291
|
+
rescue Omnizip::ChecksumMismatchError
|
|
292
|
+
puts "✗ Data corrupted (password correct but checksum failed)"
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
reader.close
|
|
296
|
+
----
|
|
297
|
+
|
|
298
|
+
== Best Practices
|
|
299
|
+
|
|
300
|
+
=== For Security
|
|
301
|
+
|
|
302
|
+
. **Use strong passwords** (12+ characters, mixed case, numbers, symbols)
|
|
303
|
+
. **Don't reuse passwords** across different archives
|
|
304
|
+
. **Store passwords securely** (password manager recommended)
|
|
305
|
+
. **Use AES-256** for sensitive data
|
|
306
|
+
. **Combine with file permissions** for defense in depth
|
|
307
|
+
|
|
308
|
+
=== For Data Integrity
|
|
309
|
+
|
|
310
|
+
. **Always verify checksums** during extraction
|
|
311
|
+
. **Use CRC64** for large or critical files
|
|
312
|
+
. **Test archives** after creation
|
|
313
|
+
. **Keep backup copies** of important archives
|
|
314
|
+
. **Verify archives periodically** (detect bit rot)
|
|
315
|
+
|
|
316
|
+
=== For Performance
|
|
317
|
+
|
|
318
|
+
. **Encryption overhead is minimal** (~5-10%) - always use for sensitive data
|
|
319
|
+
. **CRC64 is very fast** - overhead is negligible
|
|
320
|
+
. **Larger files benefit more** from CRC64 over CRC32
|
|
321
|
+
. **Consider compression level** before encryption for best balance
|
|
322
|
+
|
|
323
|
+
== See Also
|
|
324
|
+
|
|
325
|
+
* link:archive-formats.adoc[Archive Formats]
|
|
326
|
+
* link:api-usage.adoc[Library API Usage]
|
|
327
|
+
* link:par2-archives.adoc[PAR2 Error Correction]
|
|
328
|
+
* link:../README.adoc[Main README]
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
= Format Converter
|
|
2
|
+
:toc:
|
|
3
|
+
:toclevels: 3
|
|
4
|
+
|
|
5
|
+
== Purpose
|
|
6
|
+
|
|
7
|
+
The Format Converter provides seamless conversion between different archive formats, preserving metadata and allowing batch processing operations.
|
|
8
|
+
|
|
9
|
+
== Supported Conversions
|
|
10
|
+
|
|
11
|
+
[cols="30,30,40",options="header"]
|
|
12
|
+
|===
|
|
13
|
+
|Source Format |Target Format |Status
|
|
14
|
+
|
|
15
|
+
|ZIP
|
|
16
|
+
|7z
|
|
17
|
+
|✅ Full support
|
|
18
|
+
|
|
19
|
+
|7z
|
|
20
|
+
|ZIP
|
|
21
|
+
|✅ Full support
|
|
22
|
+
|
|
23
|
+
|RAR
|
|
24
|
+
|ZIP/7z
|
|
25
|
+
|🔵 Via extract + re-compress
|
|
26
|
+
|
|
27
|
+
|TAR
|
|
28
|
+
|ZIP/7z
|
|
29
|
+
|🔵 Via extract + re-compress
|
|
30
|
+
|===
|
|
31
|
+
|
|
32
|
+
== Basic Conversion
|
|
33
|
+
|
|
34
|
+
=== Single File Conversion
|
|
35
|
+
|
|
36
|
+
[source,ruby]
|
|
37
|
+
----
|
|
38
|
+
# Convert ZIP to 7z
|
|
39
|
+
Omnizip::Converter.convert('archive.zip', 'archive.7z')
|
|
40
|
+
|
|
41
|
+
# Convert 7z to ZIP
|
|
42
|
+
Omnizip::Converter.convert('archive.7z', 'archive.zip')
|
|
43
|
+
----
|
|
44
|
+
|
|
45
|
+
=== With Options
|
|
46
|
+
|
|
47
|
+
[source,ruby]
|
|
48
|
+
----
|
|
49
|
+
# Convert with compression settings
|
|
50
|
+
Omnizip::Converter.convert('source.zip', 'target.7z',
|
|
51
|
+
algorithm: :lzma2,
|
|
52
|
+
level: 9,
|
|
53
|
+
solid: true
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# Convert and delete source
|
|
57
|
+
Omnizip::Converter.convert('source.zip', 'target.7z',
|
|
58
|
+
delete_source: true
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# Convert with progress tracking
|
|
62
|
+
Omnizip::Converter.convert('large.zip', 'large.7z',
|
|
63
|
+
progress: ->(pct) { puts "Progress: #{pct}%" }
|
|
64
|
+
)
|
|
65
|
+
----
|
|
66
|
+
|
|
67
|
+
== Batch Conversion
|
|
68
|
+
|
|
69
|
+
=== Convert Multiple Archives
|
|
70
|
+
|
|
71
|
+
[source,ruby]
|
|
72
|
+
----
|
|
73
|
+
# Batch convert all ZIP files to 7z
|
|
74
|
+
sources = Dir.glob('backups/*.zip')
|
|
75
|
+
|
|
76
|
+
Omnizip::Converter.batch_convert(
|
|
77
|
+
sources,
|
|
78
|
+
target_format: :seven_zip,
|
|
79
|
+
level: 9
|
|
80
|
+
) do |result|
|
|
81
|
+
puts "Converted: #{result.source} -> #{result.target}"
|
|
82
|
+
puts " Time: #{result.duration}s"
|
|
83
|
+
puts " Original: #{result.source_size} bytes"
|
|
84
|
+
puts " Converted: #{result.target_size} bytes"
|
|
85
|
+
puts " Savings: #{result.compression_improvement}%"
|
|
86
|
+
end
|
|
87
|
+
----
|
|
88
|
+
|
|
89
|
+
== Conversion Strategies
|
|
90
|
+
|
|
91
|
+
=== ZIP to 7z Strategy
|
|
92
|
+
|
|
93
|
+
Converts ZIP archives to 7z format with better compression:
|
|
94
|
+
|
|
95
|
+
[source,ruby]
|
|
96
|
+
----
|
|
97
|
+
strategy = Omnizip::Converter::ZipToSevenZipStrategy.new(
|
|
98
|
+
'source.zip',
|
|
99
|
+
'target.7z',
|
|
100
|
+
algorithm: :lzma2,
|
|
101
|
+
level: 9,
|
|
102
|
+
solid: true
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
result = strategy.convert
|
|
106
|
+
puts "Compression improved by #{result.compression_improvement}%"
|
|
107
|
+
----
|
|
108
|
+
|
|
109
|
+
=== 7z to ZIP Strategy
|
|
110
|
+
|
|
111
|
+
Converts 7z archives to ZIP for better compatibility:
|
|
112
|
+
|
|
113
|
+
[source,ruby]
|
|
114
|
+
----
|
|
115
|
+
strategy = Omnizip::Converter::SevenZipToZipStrategy.new(
|
|
116
|
+
'source.7z',
|
|
117
|
+
'target.zip',
|
|
118
|
+
algorithm: :deflate,
|
|
119
|
+
level: 6
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
result = strategy.convert
|
|
123
|
+
----
|
|
124
|
+
|
|
125
|
+
== Conversion Options
|
|
126
|
+
|
|
127
|
+
=== Available Options
|
|
128
|
+
|
|
129
|
+
[source,ruby]
|
|
130
|
+
----
|
|
131
|
+
options = Omnizip::Models::ConversionOptions.new(
|
|
132
|
+
# Target compression settings
|
|
133
|
+
algorithm: :lzma2, # Compression algorithm
|
|
134
|
+
level: 9, # Compression level (1-9)
|
|
135
|
+
solid: true, # Solid compression (7z only)
|
|
136
|
+
|
|
137
|
+
# Filters
|
|
138
|
+
filter: :bcj_x86, # Preprocessing filter
|
|
139
|
+
|
|
140
|
+
# Behavior options
|
|
141
|
+
delete_source: false, # Delete source after conversion
|
|
142
|
+
overwrite: false, # Overwrite existing target
|
|
143
|
+
preserve_timestamps: true, # Keep original timestamps
|
|
144
|
+
|
|
145
|
+
# Progress tracking
|
|
146
|
+
progress: nil # Progress callback
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
Omnizip::Converter.convert_with_options('source.zip', 'target.7z', options)
|
|
150
|
+
----
|
|
151
|
+
|
|
152
|
+
== Conversion Results
|
|
153
|
+
|
|
154
|
+
=== Result Object
|
|
155
|
+
|
|
156
|
+
Each conversion returns a result object with detailed information:
|
|
157
|
+
|
|
158
|
+
[source,ruby]
|
|
159
|
+
----
|
|
160
|
+
result = Omnizip::Converter.convert('archive.zip', 'archive.7z')
|
|
161
|
+
|
|
162
|
+
# Conversion details
|
|
163
|
+
result.success? # => true/false
|
|
164
|
+
result.source # => 'archive.zip'
|
|
165
|
+
result.target # => 'archive.7z'
|
|
166
|
+
result.duration # => 2.5 (seconds)
|
|
167
|
+
|
|
168
|
+
# Size information
|
|
169
|
+
result.source_size # => 1048576 (bytes)
|
|
170
|
+
result.target_size # => 524288 (bytes)
|
|
171
|
+
result.compression_improvement # => 50.0 (%)
|
|
172
|
+
|
|
173
|
+
# Files processed
|
|
174
|
+
result.files_processed # => 42
|
|
175
|
+
result.files_failed # => 0
|
|
176
|
+
|
|
177
|
+
# Error information (if failed)
|
|
178
|
+
result.error_message # => nil or error string
|
|
179
|
+
----
|
|
180
|
+
|
|
181
|
+
== Examples
|
|
182
|
+
|
|
183
|
+
=== Example 1: Optimize Storage with 7z
|
|
184
|
+
|
|
185
|
+
[source,ruby]
|
|
186
|
+
----
|
|
187
|
+
# Convert all ZIP backups to 7z for better compression
|
|
188
|
+
def optimize_backups(backup_dir)
|
|
189
|
+
zip_files = Dir.glob("#{backup_dir}/*.zip")
|
|
190
|
+
total_saved = 0
|
|
191
|
+
|
|
192
|
+
zip_files.each do |zip_file|
|
|
193
|
+
sevenz_file = zip_file.sub('.zip', '.7z')
|
|
194
|
+
|
|
195
|
+
result = Omnizip::Converter.convert(zip_file, sevenz_file,
|
|
196
|
+
algorithm: :lzma2,
|
|
197
|
+
level: 9,
|
|
198
|
+
solid: true,
|
|
199
|
+
delete_source: true
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
saved = result.source_size - result.target_size
|
|
203
|
+
total_saved += saved
|
|
204
|
+
|
|
205
|
+
puts "#{File.basename(zip_file)}: saved #{saved / 1024}KB"
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
puts "\nTotal space saved: #{total_saved / (1024 * 1024)}MB"
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
optimize_backups('backups/')
|
|
212
|
+
----
|
|
213
|
+
|
|
214
|
+
=== Example 2: Convert to ZIP for Compatibility
|
|
215
|
+
|
|
216
|
+
[source,ruby]
|
|
217
|
+
----
|
|
218
|
+
# Convert 7z archives to ZIP for compatibility with other systems
|
|
219
|
+
def convert_for_compatibility(source_dir, target_dir)
|
|
220
|
+
FileUtils.mkdir_p(target_dir)
|
|
221
|
+
|
|
222
|
+
Dir.glob("#{source_dir}/*.7z").each do |sevenz_file|
|
|
223
|
+
basename = File.basename(sevenz_file, '.7z')
|
|
224
|
+
zip_file = File.join(target_dir, "#{basename}.zip")
|
|
225
|
+
|
|
226
|
+
puts "Converting: #{basename}"
|
|
227
|
+
result = Omnizip::Converter.convert(sevenz_file, zip_file,
|
|
228
|
+
algorithm: :deflate,
|
|
229
|
+
level: 6
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
if result.success?
|
|
233
|
+
puts " ✓ Success (#{result.files_processed} files)"
|
|
234
|
+
else
|
|
235
|
+
puts " ✗ Failed: #{result.error_message}"
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
convert_for_compatibility('internal/', 'external/')
|
|
241
|
+
----
|
|
242
|
+
|
|
243
|
+
=== Example 3: Smart Conversion with Analysis
|
|
244
|
+
|
|
245
|
+
[source,ruby]
|
|
246
|
+
----
|
|
247
|
+
# Analyze and convert only if beneficial
|
|
248
|
+
def smart_convert(source_file)
|
|
249
|
+
target_file = source_file.sub(/\.(zip|7z)$/, '.optimized.7z')
|
|
250
|
+
|
|
251
|
+
# Try conversion with maximum compression
|
|
252
|
+
result = Omnizip::Converter.convert(source_file, target_file,
|
|
253
|
+
algorithm: :lzma2,
|
|
254
|
+
level: 9,
|
|
255
|
+
solid: true
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
# Keep conversion only if it saves significant space
|
|
259
|
+
improvement = result.compression_improvement
|
|
260
|
+
|
|
261
|
+
if improvement > 10.0
|
|
262
|
+
# Good savings, delete source
|
|
263
|
+
File.delete(source_file)
|
|
264
|
+
File.rename(target_file, source_file.sub(/\.(zip|7z)$/, '.7z'))
|
|
265
|
+
puts "Optimized: #{improvement.round(1)}% savings"
|
|
266
|
+
else
|
|
267
|
+
# Not worth it, delete converted file
|
|
268
|
+
File.delete(target_file)
|
|
269
|
+
puts "Skipped: only #{improvement.round(1)}% improvement"
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
----
|
|
273
|
+
|
|
274
|
+
== Checking Conversion Support
|
|
275
|
+
|
|
276
|
+
[source,ruby]
|
|
277
|
+
----
|
|
278
|
+
# Check if conversion is supported
|
|
279
|
+
if Omnizip::Converter.supported?('archive.zip', 'archive.7z')
|
|
280
|
+
puts "ZIP to 7z conversion is supported"
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
# List available strategies
|
|
284
|
+
Omnizip::Converter.strategies.each do |strategy_class|
|
|
285
|
+
puts strategy_class.name
|
|
286
|
+
end
|
|
287
|
+
----
|
|
288
|
+
|
|
289
|
+
== Performance Considerations
|
|
290
|
+
|
|
291
|
+
=== Conversion Speed
|
|
292
|
+
|
|
293
|
+
[cols="30,30,40",options="header"]
|
|
294
|
+
|===
|
|
295
|
+
|Conversion |Speed |Notes
|
|
296
|
+
|
|
297
|
+
|ZIP → 7z (LZMA2)
|
|
298
|
+
|Slow
|
|
299
|
+
|10-15x slower than ZIP extraction alone
|
|
300
|
+
|
|
301
|
+
|7z → ZIP (Deflate)
|
|
302
|
+
|Medium
|
|
303
|
+
|Faster due to simpler Deflate compression
|
|
304
|
+
|
|
305
|
+
|With solid compression
|
|
306
|
+
|Very Slow
|
|
307
|
+
|Solid mode requires recompression of entire archive
|
|
308
|
+
|
|
309
|
+
|With Store (no compression)
|
|
310
|
+
|Fast
|
|
311
|
+
|Just format conversion, minimal processing
|
|
312
|
+
|===
|
|
313
|
+
|
|
314
|
+
=== Memory Usage
|
|
315
|
+
|
|
316
|
+
- **Streaming mode**: Processes files one at a time (lower memory)
|
|
317
|
+
- **Batch mode**: May load multiple files in memory
|
|
318
|
+
- **Large archives**: Consider chunked processing for >1GB archives
|
|
319
|
+
|
|
320
|
+
== See Also
|
|
321
|
+
|
|
322
|
+
* link:../README.adoc#seven-zip-format[7z Format Documentation]
|
|
323
|
+
* link:../README.adoc#zip-format[ZIP Format Documentation]
|
|
324
|
+
* link:compression-profiles.adoc[Compression Profiles]
|
|
325
|
+
* link:performance-profiler.adoc[Performance Profiler]
|