1*3b35e7eeSXin LI /* SPDX-License-Identifier: 0BSD */ 2*3b35e7eeSXin LI 381ad8388SMartin Matuska /** 481ad8388SMartin Matuska * \file lzma/stream_flags.h 581ad8388SMartin Matuska * \brief .xz Stream Header and Stream Footer encoder and decoder 6c917796cSXin LI * \note Never include this file directly. Use <lzma.h> instead. 781ad8388SMartin Matuska */ 881ad8388SMartin Matuska 981ad8388SMartin Matuska /* 1081ad8388SMartin Matuska * Author: Lasse Collin 1181ad8388SMartin Matuska */ 1281ad8388SMartin Matuska 1381ad8388SMartin Matuska #ifndef LZMA_H_INTERNAL 1481ad8388SMartin Matuska # error Never include this file directly. Use <lzma.h> instead. 1581ad8388SMartin Matuska #endif 1681ad8388SMartin Matuska 1781ad8388SMartin Matuska 1881ad8388SMartin Matuska /** 1981ad8388SMartin Matuska * \brief Size of Stream Header and Stream Footer 2081ad8388SMartin Matuska * 2181ad8388SMartin Matuska * Stream Header and Stream Footer have the same size and they are not 2281ad8388SMartin Matuska * going to change even if a newer version of the .xz file format is 2381ad8388SMartin Matuska * developed in future. 2481ad8388SMartin Matuska */ 2581ad8388SMartin Matuska #define LZMA_STREAM_HEADER_SIZE 12 2681ad8388SMartin Matuska 2781ad8388SMartin Matuska 2881ad8388SMartin Matuska /** 2981ad8388SMartin Matuska * \brief Options for encoding/decoding Stream Header and Stream Footer 3081ad8388SMartin Matuska */ 3181ad8388SMartin Matuska typedef struct { 3281ad8388SMartin Matuska /** 3381ad8388SMartin Matuska * \brief Stream Flags format version 3481ad8388SMartin Matuska * 3581ad8388SMartin Matuska * To prevent API and ABI breakages if new features are needed in 3681ad8388SMartin Matuska * Stream Header or Stream Footer, a version number is used to 37c917796cSXin LI * indicate which members in this structure are in use. For now, 3881ad8388SMartin Matuska * version must always be zero. With non-zero version, the 3981ad8388SMartin Matuska * lzma_stream_header_encode() and lzma_stream_footer_encode() 4081ad8388SMartin Matuska * will return LZMA_OPTIONS_ERROR. 4181ad8388SMartin Matuska * 4281ad8388SMartin Matuska * lzma_stream_header_decode() and lzma_stream_footer_decode() 4381ad8388SMartin Matuska * will always set this to the lowest value that supports all the 4481ad8388SMartin Matuska * features indicated by the Stream Flags field. The application 4581ad8388SMartin Matuska * must check that the version number set by the decoding functions 4681ad8388SMartin Matuska * is supported by the application. Otherwise it is possible that 4781ad8388SMartin Matuska * the application will decode the Stream incorrectly. 4881ad8388SMartin Matuska */ 4981ad8388SMartin Matuska uint32_t version; 5081ad8388SMartin Matuska 5181ad8388SMartin Matuska /** 5281ad8388SMartin Matuska * \brief Backward Size 5381ad8388SMartin Matuska * 5481ad8388SMartin Matuska * Backward Size must be a multiple of four bytes. In this Stream 5581ad8388SMartin Matuska * format version, Backward Size is the size of the Index field. 5681ad8388SMartin Matuska * 5781ad8388SMartin Matuska * Backward Size isn't actually part of the Stream Flags field, but 5881ad8388SMartin Matuska * it is convenient to include in this structure anyway. Backward 5981ad8388SMartin Matuska * Size is present only in the Stream Footer. There is no need to 6081ad8388SMartin Matuska * initialize backward_size when encoding Stream Header. 6181ad8388SMartin Matuska * 6281ad8388SMartin Matuska * lzma_stream_header_decode() always sets backward_size to 6381ad8388SMartin Matuska * LZMA_VLI_UNKNOWN so that it is convenient to use 6481ad8388SMartin Matuska * lzma_stream_flags_compare() when both Stream Header and Stream 6581ad8388SMartin Matuska * Footer have been decoded. 6681ad8388SMartin Matuska */ 6781ad8388SMartin Matuska lzma_vli backward_size; 68c917796cSXin LI 69c917796cSXin LI /** 70c917796cSXin LI * \brief Minimum value for lzma_stream_flags.backward_size 71c917796cSXin LI */ 7281ad8388SMartin Matuska # define LZMA_BACKWARD_SIZE_MIN 4 73c917796cSXin LI 74c917796cSXin LI /** 75c917796cSXin LI * \brief Maximum value for lzma_stream_flags.backward_size 76c917796cSXin LI */ 7781ad8388SMartin Matuska # define LZMA_BACKWARD_SIZE_MAX (LZMA_VLI_C(1) << 34) 7881ad8388SMartin Matuska 7981ad8388SMartin Matuska /** 8081ad8388SMartin Matuska * \brief Check ID 8181ad8388SMartin Matuska * 8281ad8388SMartin Matuska * This indicates the type of the integrity check calculated from 8381ad8388SMartin Matuska * uncompressed data. 8481ad8388SMartin Matuska */ 8581ad8388SMartin Matuska lzma_check check; 8681ad8388SMartin Matuska 8781ad8388SMartin Matuska /* 8881ad8388SMartin Matuska * Reserved space to allow possible future extensions without 8981ad8388SMartin Matuska * breaking the ABI. You should not touch these, because the 9081ad8388SMartin Matuska * names of these variables may change. 9181ad8388SMartin Matuska * 9281ad8388SMartin Matuska * (We will never be able to use all of these since Stream Flags 9381ad8388SMartin Matuska * is just two bytes plus Backward Size of four bytes. But it's 9481ad8388SMartin Matuska * nice to have the proper types when they are needed.) 9581ad8388SMartin Matuska */ 96c917796cSXin LI 97c917796cSXin LI /** \private Reserved member. */ 9881ad8388SMartin Matuska lzma_reserved_enum reserved_enum1; 99c917796cSXin LI 100c917796cSXin LI /** \private Reserved member. */ 10181ad8388SMartin Matuska lzma_reserved_enum reserved_enum2; 102c917796cSXin LI 103c917796cSXin LI /** \private Reserved member. */ 10481ad8388SMartin Matuska lzma_reserved_enum reserved_enum3; 105c917796cSXin LI 106c917796cSXin LI /** \private Reserved member. */ 10781ad8388SMartin Matuska lzma_reserved_enum reserved_enum4; 108c917796cSXin LI 109c917796cSXin LI /** \private Reserved member. */ 11081ad8388SMartin Matuska lzma_bool reserved_bool1; 111c917796cSXin LI 112c917796cSXin LI /** \private Reserved member. */ 11381ad8388SMartin Matuska lzma_bool reserved_bool2; 114c917796cSXin LI 115c917796cSXin LI /** \private Reserved member. */ 11681ad8388SMartin Matuska lzma_bool reserved_bool3; 117c917796cSXin LI 118c917796cSXin LI /** \private Reserved member. */ 11981ad8388SMartin Matuska lzma_bool reserved_bool4; 120c917796cSXin LI 121c917796cSXin LI /** \private Reserved member. */ 12281ad8388SMartin Matuska lzma_bool reserved_bool5; 123c917796cSXin LI 124c917796cSXin LI /** \private Reserved member. */ 12581ad8388SMartin Matuska lzma_bool reserved_bool6; 126c917796cSXin LI 127c917796cSXin LI /** \private Reserved member. */ 12881ad8388SMartin Matuska lzma_bool reserved_bool7; 129c917796cSXin LI 130c917796cSXin LI /** \private Reserved member. */ 13181ad8388SMartin Matuska lzma_bool reserved_bool8; 132c917796cSXin LI 133c917796cSXin LI /** \private Reserved member. */ 13481ad8388SMartin Matuska uint32_t reserved_int1; 135c917796cSXin LI 136c917796cSXin LI /** \private Reserved member. */ 13781ad8388SMartin Matuska uint32_t reserved_int2; 13881ad8388SMartin Matuska 13981ad8388SMartin Matuska } lzma_stream_flags; 14081ad8388SMartin Matuska 14181ad8388SMartin Matuska 14281ad8388SMartin Matuska /** 14381ad8388SMartin Matuska * \brief Encode Stream Header 14481ad8388SMartin Matuska * 14581ad8388SMartin Matuska * \param options Stream Header options to be encoded. 14681ad8388SMartin Matuska * options->backward_size is ignored and doesn't 14781ad8388SMartin Matuska * need to be initialized. 148c917796cSXin LI * \param[out] out Beginning of the output buffer of 14981ad8388SMartin Matuska * LZMA_STREAM_HEADER_SIZE bytes. 15081ad8388SMartin Matuska * 151c917796cSXin LI * \return Possible lzma_ret values: 152c917796cSXin LI * - LZMA_OK: Encoding was successful. 15381ad8388SMartin Matuska * - LZMA_OPTIONS_ERROR: options->version is not supported by 15481ad8388SMartin Matuska * this liblzma version. 15581ad8388SMartin Matuska * - LZMA_PROG_ERROR: Invalid options. 15681ad8388SMartin Matuska */ 15781ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_stream_header_encode( 15881ad8388SMartin Matuska const lzma_stream_flags *options, uint8_t *out) 15981ad8388SMartin Matuska lzma_nothrow lzma_attr_warn_unused_result; 16081ad8388SMartin Matuska 16181ad8388SMartin Matuska 16281ad8388SMartin Matuska /** 16381ad8388SMartin Matuska * \brief Encode Stream Footer 16481ad8388SMartin Matuska * 16581ad8388SMartin Matuska * \param options Stream Footer options to be encoded. 166c917796cSXin LI * \param[out] out Beginning of the output buffer of 16781ad8388SMartin Matuska * LZMA_STREAM_HEADER_SIZE bytes. 16881ad8388SMartin Matuska * 169c917796cSXin LI * \return Possible lzma_ret values: 170c917796cSXin LI * - LZMA_OK: Encoding was successful. 17181ad8388SMartin Matuska * - LZMA_OPTIONS_ERROR: options->version is not supported by 17281ad8388SMartin Matuska * this liblzma version. 17381ad8388SMartin Matuska * - LZMA_PROG_ERROR: Invalid options. 17481ad8388SMartin Matuska */ 17581ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_stream_footer_encode( 17681ad8388SMartin Matuska const lzma_stream_flags *options, uint8_t *out) 17781ad8388SMartin Matuska lzma_nothrow lzma_attr_warn_unused_result; 17881ad8388SMartin Matuska 17981ad8388SMartin Matuska 18081ad8388SMartin Matuska /** 18181ad8388SMartin Matuska * \brief Decode Stream Header 18281ad8388SMartin Matuska * 18381ad8388SMartin Matuska * options->backward_size is always set to LZMA_VLI_UNKNOWN. This is to 18481ad8388SMartin Matuska * help comparing Stream Flags from Stream Header and Stream Footer with 18581ad8388SMartin Matuska * lzma_stream_flags_compare(). 18681ad8388SMartin Matuska * 187c917796cSXin LI * \note When decoding .xz files that contain multiple Streams, it may 188c917796cSXin LI * make sense to print "file format not recognized" only if 189c917796cSXin LI * decoding of the Stream Header of the \a first Stream gives 190c917796cSXin LI * LZMA_FORMAT_ERROR. If non-first Stream Header gives 191c917796cSXin LI * LZMA_FORMAT_ERROR, the message used for LZMA_DATA_ERROR is 192c917796cSXin LI * probably more appropriate. 193c917796cSXin LI * For example, the Stream decoder in liblzma uses 194c917796cSXin LI * LZMA_DATA_ERROR if LZMA_FORMAT_ERROR is returned by 195c917796cSXin LI * lzma_stream_header_decode() when decoding non-first Stream. 196c917796cSXin LI * 197c917796cSXin LI * \param[out] options Target for the decoded Stream Header options. 198c917796cSXin LI * \param in Beginning of the input buffer of 199c917796cSXin LI * LZMA_STREAM_HEADER_SIZE bytes. 200c917796cSXin LI * 201c917796cSXin LI * 202c917796cSXin LI * \return Possible lzma_ret values: 203c917796cSXin LI * - LZMA_OK: Decoding was successful. 20481ad8388SMartin Matuska * - LZMA_FORMAT_ERROR: Magic bytes don't match, thus the given 20581ad8388SMartin Matuska * buffer cannot be Stream Header. 20681ad8388SMartin Matuska * - LZMA_DATA_ERROR: CRC32 doesn't match, thus the header 20781ad8388SMartin Matuska * is corrupt. 20881ad8388SMartin Matuska * - LZMA_OPTIONS_ERROR: Unsupported options are present 20981ad8388SMartin Matuska * in the header. 21081ad8388SMartin Matuska */ 21181ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_stream_header_decode( 21281ad8388SMartin Matuska lzma_stream_flags *options, const uint8_t *in) 21381ad8388SMartin Matuska lzma_nothrow lzma_attr_warn_unused_result; 21481ad8388SMartin Matuska 21581ad8388SMartin Matuska 21681ad8388SMartin Matuska /** 21781ad8388SMartin Matuska * \brief Decode Stream Footer 21881ad8388SMartin Matuska * 219c917796cSXin LI * \note If Stream Header was already decoded successfully, but 220c917796cSXin LI * decoding Stream Footer returns LZMA_FORMAT_ERROR, the 221c917796cSXin LI * application should probably report some other error message 222c917796cSXin LI * than "file format not recognized". The file likely 223c917796cSXin LI * is corrupt (possibly truncated). The Stream decoder in liblzma 224c917796cSXin LI * uses LZMA_DATA_ERROR in this situation. 225c917796cSXin LI * 226c917796cSXin LI * \param[out] options Target for the decoded Stream Footer options. 22781ad8388SMartin Matuska * \param in Beginning of the input buffer of 22881ad8388SMartin Matuska * LZMA_STREAM_HEADER_SIZE bytes. 22981ad8388SMartin Matuska * 230c917796cSXin LI * \return Possible lzma_ret values: 231c917796cSXin LI * - LZMA_OK: Decoding was successful. 23281ad8388SMartin Matuska * - LZMA_FORMAT_ERROR: Magic bytes don't match, thus the given 23381ad8388SMartin Matuska * buffer cannot be Stream Footer. 23481ad8388SMartin Matuska * - LZMA_DATA_ERROR: CRC32 doesn't match, thus the Stream Footer 23581ad8388SMartin Matuska * is corrupt. 23681ad8388SMartin Matuska * - LZMA_OPTIONS_ERROR: Unsupported options are present 23781ad8388SMartin Matuska * in Stream Footer. 23881ad8388SMartin Matuska */ 23981ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_stream_footer_decode( 24081ad8388SMartin Matuska lzma_stream_flags *options, const uint8_t *in) 24181ad8388SMartin Matuska lzma_nothrow lzma_attr_warn_unused_result; 24281ad8388SMartin Matuska 24381ad8388SMartin Matuska 24481ad8388SMartin Matuska /** 24581ad8388SMartin Matuska * \brief Compare two lzma_stream_flags structures 24681ad8388SMartin Matuska * 24781ad8388SMartin Matuska * backward_size values are compared only if both are not 24881ad8388SMartin Matuska * LZMA_VLI_UNKNOWN. 24981ad8388SMartin Matuska * 250c917796cSXin LI * \param a Pointer to lzma_stream_flags structure 251c917796cSXin LI * \param b Pointer to lzma_stream_flags structure 252c917796cSXin LI * 253c917796cSXin LI * \return Possible lzma_ret values: 254c917796cSXin LI * - LZMA_OK: Both are equal. If either had backward_size set 25581ad8388SMartin Matuska * to LZMA_VLI_UNKNOWN, backward_size values were not 25681ad8388SMartin Matuska * compared or validated. 25781ad8388SMartin Matuska * - LZMA_DATA_ERROR: The structures differ. 25881ad8388SMartin Matuska * - LZMA_OPTIONS_ERROR: version in either structure is greater 25981ad8388SMartin Matuska * than the maximum supported version (currently zero). 26081ad8388SMartin Matuska * - LZMA_PROG_ERROR: Invalid value, e.g. invalid check or 26181ad8388SMartin Matuska * backward_size. 26281ad8388SMartin Matuska */ 26381ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_stream_flags_compare( 26481ad8388SMartin Matuska const lzma_stream_flags *a, const lzma_stream_flags *b) 26581ad8388SMartin Matuska lzma_nothrow lzma_attr_pure; 266