1a28cd43dSSascha Wildner /* 2a28cd43dSSascha Wildner * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc. 3a28cd43dSSascha Wildner * All rights reserved. 4a28cd43dSSascha Wildner * 5a28cd43dSSascha Wildner * This source code is licensed under both the BSD-style license (found in the 6a28cd43dSSascha Wildner * LICENSE file in the root directory of this source tree) and the GPLv2 (found 7a28cd43dSSascha Wildner * in the COPYING file in the root directory of this source tree). 8a28cd43dSSascha Wildner * You may select, at your option, one of the above-listed licenses. 9a28cd43dSSascha Wildner */ 10a28cd43dSSascha Wildner 11a28cd43dSSascha Wildner 12a28cd43dSSascha Wildner /* zstd_decompress_internal: 13a28cd43dSSascha Wildner * objects and definitions shared within lib/decompress modules */ 14a28cd43dSSascha Wildner 15a28cd43dSSascha Wildner #ifndef ZSTD_DECOMPRESS_INTERNAL_H 16a28cd43dSSascha Wildner #define ZSTD_DECOMPRESS_INTERNAL_H 17a28cd43dSSascha Wildner 18a28cd43dSSascha Wildner 19a28cd43dSSascha Wildner /*-******************************************************* 20a28cd43dSSascha Wildner * Dependencies 21a28cd43dSSascha Wildner *********************************************************/ 22a28cd43dSSascha Wildner #include "../common/mem.h" /* BYTE, U16, U32 */ 23a28cd43dSSascha Wildner #include "../common/zstd_internal.h" /* ZSTD_seqSymbol */ 24a28cd43dSSascha Wildner 25a28cd43dSSascha Wildner 26a28cd43dSSascha Wildner 27a28cd43dSSascha Wildner /*-******************************************************* 28a28cd43dSSascha Wildner * Constants 29a28cd43dSSascha Wildner *********************************************************/ 30a28cd43dSSascha Wildner static UNUSED_ATTR const U32 LL_base[MaxLL+1] = { 31a28cd43dSSascha Wildner 0, 1, 2, 3, 4, 5, 6, 7, 32a28cd43dSSascha Wildner 8, 9, 10, 11, 12, 13, 14, 15, 33a28cd43dSSascha Wildner 16, 18, 20, 22, 24, 28, 32, 40, 34a28cd43dSSascha Wildner 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 35a28cd43dSSascha Wildner 0x2000, 0x4000, 0x8000, 0x10000 }; 36a28cd43dSSascha Wildner 37a28cd43dSSascha Wildner static UNUSED_ATTR const U32 OF_base[MaxOff+1] = { 38a28cd43dSSascha Wildner 0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D, 39a28cd43dSSascha Wildner 0xFD, 0x1FD, 0x3FD, 0x7FD, 0xFFD, 0x1FFD, 0x3FFD, 0x7FFD, 40a28cd43dSSascha Wildner 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD, 41a28cd43dSSascha Wildner 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD }; 42a28cd43dSSascha Wildner 43a28cd43dSSascha Wildner static UNUSED_ATTR const U32 OF_bits[MaxOff+1] = { 44a28cd43dSSascha Wildner 0, 1, 2, 3, 4, 5, 6, 7, 45a28cd43dSSascha Wildner 8, 9, 10, 11, 12, 13, 14, 15, 46a28cd43dSSascha Wildner 16, 17, 18, 19, 20, 21, 22, 23, 47a28cd43dSSascha Wildner 24, 25, 26, 27, 28, 29, 30, 31 }; 48a28cd43dSSascha Wildner 49a28cd43dSSascha Wildner static UNUSED_ATTR const U32 ML_base[MaxML+1] = { 50a28cd43dSSascha Wildner 3, 4, 5, 6, 7, 8, 9, 10, 51a28cd43dSSascha Wildner 11, 12, 13, 14, 15, 16, 17, 18, 52a28cd43dSSascha Wildner 19, 20, 21, 22, 23, 24, 25, 26, 53a28cd43dSSascha Wildner 27, 28, 29, 30, 31, 32, 33, 34, 54a28cd43dSSascha Wildner 35, 37, 39, 41, 43, 47, 51, 59, 55a28cd43dSSascha Wildner 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803, 56a28cd43dSSascha Wildner 0x1003, 0x2003, 0x4003, 0x8003, 0x10003 }; 57a28cd43dSSascha Wildner 58a28cd43dSSascha Wildner 59a28cd43dSSascha Wildner /*-******************************************************* 60a28cd43dSSascha Wildner * Decompression types 61a28cd43dSSascha Wildner *********************************************************/ 62a28cd43dSSascha Wildner typedef struct { 63a28cd43dSSascha Wildner U32 fastMode; 64a28cd43dSSascha Wildner U32 tableLog; 65a28cd43dSSascha Wildner } ZSTD_seqSymbol_header; 66a28cd43dSSascha Wildner 67a28cd43dSSascha Wildner typedef struct { 68a28cd43dSSascha Wildner U16 nextState; 69a28cd43dSSascha Wildner BYTE nbAdditionalBits; 70a28cd43dSSascha Wildner BYTE nbBits; 71a28cd43dSSascha Wildner U32 baseValue; 72a28cd43dSSascha Wildner } ZSTD_seqSymbol; 73a28cd43dSSascha Wildner 74a28cd43dSSascha Wildner #define SEQSYMBOL_TABLE_SIZE(log) (1 + (1 << (log))) 75a28cd43dSSascha Wildner 76a28cd43dSSascha Wildner #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE (sizeof(S16) * (MaxSeq + 1) + (1u << MaxFSELog) + sizeof(U64)) 77a28cd43dSSascha Wildner #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32 ((ZSTD_BUILD_FSE_TABLE_WKSP_SIZE + sizeof(U32) - 1) / sizeof(U32)) 78a28cd43dSSascha Wildner 79a28cd43dSSascha Wildner typedef struct { 80a28cd43dSSascha Wildner ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)]; /* Note : Space reserved for FSE Tables */ 81a28cd43dSSascha Wildner ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)]; /* is also used as temporary workspace while building hufTable during DDict creation */ 82a28cd43dSSascha Wildner ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)]; /* and therefore must be at least HUF_DECOMPRESS_WORKSPACE_SIZE large */ 83a28cd43dSSascha Wildner HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)]; /* can accommodate HUF_decompress4X */ 84a28cd43dSSascha Wildner U32 rep[ZSTD_REP_NUM]; 85a28cd43dSSascha Wildner U32 workspace[ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32]; 86a28cd43dSSascha Wildner } ZSTD_entropyDTables_t; 87a28cd43dSSascha Wildner 88a28cd43dSSascha Wildner typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader, 89a28cd43dSSascha Wildner ZSTDds_decodeBlockHeader, ZSTDds_decompressBlock, 90a28cd43dSSascha Wildner ZSTDds_decompressLastBlock, ZSTDds_checkChecksum, 91a28cd43dSSascha Wildner ZSTDds_decodeSkippableHeader, ZSTDds_skipFrame } ZSTD_dStage; 92a28cd43dSSascha Wildner 93a28cd43dSSascha Wildner typedef enum { zdss_init=0, zdss_loadHeader, 94a28cd43dSSascha Wildner zdss_read, zdss_load, zdss_flush } ZSTD_dStreamStage; 95a28cd43dSSascha Wildner 96a28cd43dSSascha Wildner typedef enum { 97a28cd43dSSascha Wildner ZSTD_use_indefinitely = -1, /* Use the dictionary indefinitely */ 98a28cd43dSSascha Wildner ZSTD_dont_use = 0, /* Do not use the dictionary (if one exists free it) */ 99a28cd43dSSascha Wildner ZSTD_use_once = 1 /* Use the dictionary once and set to ZSTD_dont_use */ 100a28cd43dSSascha Wildner } ZSTD_dictUses_e; 101a28cd43dSSascha Wildner 102a28cd43dSSascha Wildner struct ZSTD_DCtx_s 103a28cd43dSSascha Wildner { 104a28cd43dSSascha Wildner const ZSTD_seqSymbol* LLTptr; 105a28cd43dSSascha Wildner const ZSTD_seqSymbol* MLTptr; 106a28cd43dSSascha Wildner const ZSTD_seqSymbol* OFTptr; 107a28cd43dSSascha Wildner const HUF_DTable* HUFptr; 108a28cd43dSSascha Wildner ZSTD_entropyDTables_t entropy; 109a28cd43dSSascha Wildner U32 workspace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32]; /* space needed when building huffman tables */ 110a28cd43dSSascha Wildner const void* previousDstEnd; /* detect continuity */ 111a28cd43dSSascha Wildner const void* prefixStart; /* start of current segment */ 112a28cd43dSSascha Wildner const void* virtualStart; /* virtual start of previous segment if it was just before current one */ 113a28cd43dSSascha Wildner const void* dictEnd; /* end of previous segment */ 114a28cd43dSSascha Wildner size_t expected; 115a28cd43dSSascha Wildner ZSTD_frameHeader fParams; 116a28cd43dSSascha Wildner U64 decodedSize; 117a28cd43dSSascha Wildner blockType_e bType; /* used in ZSTD_decompressContinue(), store blockType between block header decoding and block decompression stages */ 118a28cd43dSSascha Wildner ZSTD_dStage stage; 119a28cd43dSSascha Wildner U32 litEntropy; 120a28cd43dSSascha Wildner U32 fseEntropy; 121a28cd43dSSascha Wildner XXH64_state_t xxhState; 122a28cd43dSSascha Wildner size_t headerSize; 123a28cd43dSSascha Wildner ZSTD_format_e format; 124a28cd43dSSascha Wildner ZSTD_forceIgnoreChecksum_e forceIgnoreChecksum; /* User specified: if == 1, will ignore checksums in compressed frame. Default == 0 */ 125a28cd43dSSascha Wildner U32 validateChecksum; /* if == 1, will validate checksum. Is == 1 if (fParams.checksumFlag == 1) and (forceIgnoreChecksum == 0). */ 126a28cd43dSSascha Wildner const BYTE* litPtr; 127a28cd43dSSascha Wildner ZSTD_customMem customMem; 128a28cd43dSSascha Wildner size_t litSize; 129a28cd43dSSascha Wildner size_t rleSize; 130a28cd43dSSascha Wildner size_t staticSize; 131a28cd43dSSascha Wildner int bmi2; /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */ 132a28cd43dSSascha Wildner 133a28cd43dSSascha Wildner /* dictionary */ 134a28cd43dSSascha Wildner ZSTD_DDict* ddictLocal; 135a28cd43dSSascha Wildner const ZSTD_DDict* ddict; /* set by ZSTD_initDStream_usingDDict(), or ZSTD_DCtx_refDDict() */ 136a28cd43dSSascha Wildner U32 dictID; 137a28cd43dSSascha Wildner int ddictIsCold; /* if == 1 : dictionary is "new" for working context, and presumed "cold" (not in cpu cache) */ 138a28cd43dSSascha Wildner ZSTD_dictUses_e dictUses; 139a28cd43dSSascha Wildner 140a28cd43dSSascha Wildner /* streaming */ 141a28cd43dSSascha Wildner ZSTD_dStreamStage streamStage; 142a28cd43dSSascha Wildner char* inBuff; 143a28cd43dSSascha Wildner size_t inBuffSize; 144a28cd43dSSascha Wildner size_t inPos; 145a28cd43dSSascha Wildner size_t maxWindowSize; 146a28cd43dSSascha Wildner char* outBuff; 147a28cd43dSSascha Wildner size_t outBuffSize; 148a28cd43dSSascha Wildner size_t outStart; 149a28cd43dSSascha Wildner size_t outEnd; 150a28cd43dSSascha Wildner size_t lhSize; 151a28cd43dSSascha Wildner void* legacyContext; 152a28cd43dSSascha Wildner U32 previousLegacyVersion; 153a28cd43dSSascha Wildner U32 legacyVersion; 154a28cd43dSSascha Wildner U32 hostageByte; 155a28cd43dSSascha Wildner int noForwardProgress; 156a28cd43dSSascha Wildner ZSTD_bufferMode_e outBufferMode; 157a28cd43dSSascha Wildner ZSTD_outBuffer expectedOutBuffer; 158a28cd43dSSascha Wildner 159a28cd43dSSascha Wildner /* workspace */ 160a28cd43dSSascha Wildner BYTE litBuffer[ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH]; 161a28cd43dSSascha Wildner BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX]; 162a28cd43dSSascha Wildner 163a28cd43dSSascha Wildner size_t oversizedDuration; 164a28cd43dSSascha Wildner 165a28cd43dSSascha Wildner #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION 166a28cd43dSSascha Wildner void const* dictContentBeginForFuzzing; 167a28cd43dSSascha Wildner void const* dictContentEndForFuzzing; 168a28cd43dSSascha Wildner #endif 169a28cd43dSSascha Wildner }; /* typedef'd to ZSTD_DCtx within "zstd.h" */ 170a28cd43dSSascha Wildner 171a28cd43dSSascha Wildner 172a28cd43dSSascha Wildner /*-******************************************************* 173a28cd43dSSascha Wildner * Shared internal functions 174a28cd43dSSascha Wildner *********************************************************/ 175a28cd43dSSascha Wildner 176a28cd43dSSascha Wildner /*! ZSTD_loadDEntropy() : 177a28cd43dSSascha Wildner * dict : must point at beginning of a valid zstd dictionary. 178a28cd43dSSascha Wildner * @return : size of dictionary header (size of magic number + dict ID + entropy tables) */ 179a28cd43dSSascha Wildner size_t ZSTD_loadDEntropy(ZSTD_entropyDTables_t* entropy, 180a28cd43dSSascha Wildner const void* const dict, size_t const dictSize); 181a28cd43dSSascha Wildner 182a28cd43dSSascha Wildner /*! ZSTD_checkContinuity() : 183a28cd43dSSascha Wildner * check if next `dst` follows previous position, where decompression ended. 184a28cd43dSSascha Wildner * If yes, do nothing (continue on current segment). 185a28cd43dSSascha Wildner * If not, classify previous segment as "external dictionary", and start a new segment. 186a28cd43dSSascha Wildner * This function cannot fail. */ 187a28cd43dSSascha Wildner void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst); 188a28cd43dSSascha Wildner 189a28cd43dSSascha Wildner 190a28cd43dSSascha Wildner #endif /* ZSTD_DECOMPRESS_INTERNAL_H */ 191