7277 lines
211 KiB
Diff
7277 lines
211 KiB
Diff
From 4f1cab99673dc0410bbbb6fc233018ed884b1a54 Mon Sep 17 00:00:00 2001
|
|
From: huangduirong <huangduirong@huawei.com>
|
|
Date: Mon, 11 Dec 2023 23:26:43 +0800
|
|
Subject: [PATCH] add lzma-sdk and uadk include file
|
|
|
|
---
|
|
src/lzma-sdk/C/7z.h | 204 ++++++++++
|
|
src/lzma-sdk/C/7zAlloc.h | 19 +
|
|
src/lzma-sdk/C/7zBuf.h | 35 ++
|
|
src/lzma-sdk/C/7zCrc.h | 25 ++
|
|
src/lzma-sdk/C/7zFile.h | 91 +++++
|
|
src/lzma-sdk/C/7zTypes.h | 529 +++++++++++++++++++++++++
|
|
src/lzma-sdk/C/7zVersion.h | 27 ++
|
|
src/lzma-sdk/C/Aes.h | 60 +++
|
|
src/lzma-sdk/C/Alloc.h | 58 +++
|
|
src/lzma-sdk/C/Bcj2.h | 146 +++++++
|
|
src/lzma-sdk/C/Bra.h | 64 +++
|
|
src/lzma-sdk/C/Compiler.h | 43 ++
|
|
src/lzma-sdk/C/CpuArch.h | 442 +++++++++++++++++++++
|
|
src/lzma-sdk/C/Delta.h | 19 +
|
|
src/lzma-sdk/C/DllSecur.h | 20 +
|
|
src/lzma-sdk/C/LzFind.h | 136 +++++++
|
|
src/lzma-sdk/C/LzFindMt.h | 109 +++++
|
|
src/lzma-sdk/C/LzHash.h | 34 ++
|
|
src/lzma-sdk/C/Lzma2Dec.h | 120 ++++++
|
|
src/lzma-sdk/C/Lzma2DecMt.h | 79 ++++
|
|
src/lzma-sdk/C/Lzma2Enc.h | 55 +++
|
|
src/lzma-sdk/C/Lzma86.h | 111 ++++++
|
|
src/lzma-sdk/C/LzmaDec.h | 236 +++++++++++
|
|
src/lzma-sdk/C/LzmaEnc.h | 78 ++++
|
|
src/lzma-sdk/C/LzmaLib.h | 138 +++++++
|
|
src/lzma-sdk/C/MtCoder.h | 141 +++++++
|
|
src/lzma-sdk/C/MtDec.h | 202 ++++++++++
|
|
src/lzma-sdk/C/Ppmd.h | 167 ++++++++
|
|
src/lzma-sdk/C/Ppmd7.h | 181 +++++++++
|
|
src/lzma-sdk/C/Precomp.h | 10 +
|
|
src/lzma-sdk/C/RotateDefs.h | 30 ++
|
|
src/lzma-sdk/C/Sha256.h | 76 ++++
|
|
src/lzma-sdk/C/Sort.h | 18 +
|
|
src/lzma-sdk/C/Threads.h | 232 +++++++++++
|
|
src/lzma-sdk/C/Util/7z/Precomp.h | 10 +
|
|
src/lzma-sdk/C/Util/SfxSetup/Precomp.h | 10 +
|
|
src/lzma-sdk/C/Xz.h | 517 ++++++++++++++++++++++++
|
|
src/lzma-sdk/C/XzCrc64.h | 26 ++
|
|
src/lzma-sdk/C/XzEnc.h | 60 +++
|
|
src/uadk/v1/uacce.h | 86 ++++
|
|
src/uadk/v1/wd.h | 214 ++++++++++
|
|
src/uadk/v1/wd_adapter.h | 75 ++++
|
|
src/uadk/v1/wd_aead.h | 213 ++++++++++
|
|
src/uadk/v1/wd_bmm.h | 50 +++
|
|
src/uadk/v1/wd_cipher.h | 166 ++++++++
|
|
src/uadk/v1/wd_comp.h | 256 ++++++++++++
|
|
src/uadk/v1/wd_dh.h | 91 +++++
|
|
src/uadk/v1/wd_digest.h | 168 ++++++++
|
|
src/uadk/v1/wd_ecc.h | 273 +++++++++++++
|
|
src/uadk/v1/wd_rng.h | 76 ++++
|
|
src/uadk/v1/wd_rsa.h | 148 +++++++
|
|
src/uadk/v1/wd_sgl.h | 74 ++++
|
|
src/uadk/v1/wd_util.h | 393 ++++++++++++++++++
|
|
53 files changed, 6841 insertions(+)
|
|
create mode 100644 src/lzma-sdk/C/7z.h
|
|
create mode 100644 src/lzma-sdk/C/7zAlloc.h
|
|
create mode 100644 src/lzma-sdk/C/7zBuf.h
|
|
create mode 100644 src/lzma-sdk/C/7zCrc.h
|
|
create mode 100644 src/lzma-sdk/C/7zFile.h
|
|
create mode 100644 src/lzma-sdk/C/7zTypes.h
|
|
create mode 100644 src/lzma-sdk/C/7zVersion.h
|
|
create mode 100644 src/lzma-sdk/C/Aes.h
|
|
create mode 100644 src/lzma-sdk/C/Alloc.h
|
|
create mode 100644 src/lzma-sdk/C/Bcj2.h
|
|
create mode 100644 src/lzma-sdk/C/Bra.h
|
|
create mode 100644 src/lzma-sdk/C/Compiler.h
|
|
create mode 100644 src/lzma-sdk/C/CpuArch.h
|
|
create mode 100644 src/lzma-sdk/C/Delta.h
|
|
create mode 100644 src/lzma-sdk/C/DllSecur.h
|
|
create mode 100644 src/lzma-sdk/C/LzFind.h
|
|
create mode 100644 src/lzma-sdk/C/LzFindMt.h
|
|
create mode 100644 src/lzma-sdk/C/LzHash.h
|
|
create mode 100644 src/lzma-sdk/C/Lzma2Dec.h
|
|
create mode 100644 src/lzma-sdk/C/Lzma2DecMt.h
|
|
create mode 100644 src/lzma-sdk/C/Lzma2Enc.h
|
|
create mode 100644 src/lzma-sdk/C/Lzma86.h
|
|
create mode 100644 src/lzma-sdk/C/LzmaDec.h
|
|
create mode 100644 src/lzma-sdk/C/LzmaEnc.h
|
|
create mode 100644 src/lzma-sdk/C/LzmaLib.h
|
|
create mode 100644 src/lzma-sdk/C/MtCoder.h
|
|
create mode 100644 src/lzma-sdk/C/MtDec.h
|
|
create mode 100644 src/lzma-sdk/C/Ppmd.h
|
|
create mode 100644 src/lzma-sdk/C/Ppmd7.h
|
|
create mode 100644 src/lzma-sdk/C/Precomp.h
|
|
create mode 100644 src/lzma-sdk/C/RotateDefs.h
|
|
create mode 100644 src/lzma-sdk/C/Sha256.h
|
|
create mode 100644 src/lzma-sdk/C/Sort.h
|
|
create mode 100644 src/lzma-sdk/C/Threads.h
|
|
create mode 100644 src/lzma-sdk/C/Util/7z/Precomp.h
|
|
create mode 100644 src/lzma-sdk/C/Util/SfxSetup/Precomp.h
|
|
create mode 100644 src/lzma-sdk/C/Xz.h
|
|
create mode 100644 src/lzma-sdk/C/XzCrc64.h
|
|
create mode 100644 src/lzma-sdk/C/XzEnc.h
|
|
create mode 100644 src/uadk/v1/uacce.h
|
|
create mode 100644 src/uadk/v1/wd.h
|
|
create mode 100644 src/uadk/v1/wd_adapter.h
|
|
create mode 100644 src/uadk/v1/wd_aead.h
|
|
create mode 100644 src/uadk/v1/wd_bmm.h
|
|
create mode 100644 src/uadk/v1/wd_cipher.h
|
|
create mode 100644 src/uadk/v1/wd_comp.h
|
|
create mode 100644 src/uadk/v1/wd_dh.h
|
|
create mode 100644 src/uadk/v1/wd_digest.h
|
|
create mode 100644 src/uadk/v1/wd_ecc.h
|
|
create mode 100644 src/uadk/v1/wd_rng.h
|
|
create mode 100644 src/uadk/v1/wd_rsa.h
|
|
create mode 100644 src/uadk/v1/wd_sgl.h
|
|
create mode 100644 src/uadk/v1/wd_util.h
|
|
|
|
diff --git a/src/lzma-sdk/C/7z.h b/src/lzma-sdk/C/7z.h
|
|
new file mode 100644
|
|
index 0000000..969523c
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/7z.h
|
|
@@ -0,0 +1,204 @@
|
|
+/* 7z.h -- 7z interface
|
|
+2018-07-02 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_H
|
|
+#define __7Z_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#define k7zStartHeaderSize 0x20
|
|
+#define k7zSignatureSize 6
|
|
+
|
|
+extern const Byte k7zSignature[k7zSignatureSize];
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ const Byte *Data;
|
|
+ size_t Size;
|
|
+} CSzData;
|
|
+
|
|
+/* CSzCoderInfo & CSzFolder support only default methods */
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ size_t PropsOffset;
|
|
+ UInt32 MethodID;
|
|
+ Byte NumStreams;
|
|
+ Byte PropsSize;
|
|
+} CSzCoderInfo;
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ UInt32 InIndex;
|
|
+ UInt32 OutIndex;
|
|
+} CSzBond;
|
|
+
|
|
+#define SZ_NUM_CODERS_IN_FOLDER_MAX 4
|
|
+#define SZ_NUM_BONDS_IN_FOLDER_MAX 3
|
|
+#define SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX 4
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ UInt32 NumCoders;
|
|
+ UInt32 NumBonds;
|
|
+ UInt32 NumPackStreams;
|
|
+ UInt32 UnpackStream;
|
|
+ UInt32 PackStreams[SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX];
|
|
+ CSzBond Bonds[SZ_NUM_BONDS_IN_FOLDER_MAX];
|
|
+ CSzCoderInfo Coders[SZ_NUM_CODERS_IN_FOLDER_MAX];
|
|
+} CSzFolder;
|
|
+
|
|
+
|
|
+SRes SzGetNextFolderItem(CSzFolder *f, CSzData *sd);
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ UInt32 Low;
|
|
+ UInt32 High;
|
|
+} CNtfsFileTime;
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ Byte *Defs; /* MSB 0 bit numbering */
|
|
+ UInt32 *Vals;
|
|
+} CSzBitUi32s;
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ Byte *Defs; /* MSB 0 bit numbering */
|
|
+ // UInt64 *Vals;
|
|
+ CNtfsFileTime *Vals;
|
|
+} CSzBitUi64s;
|
|
+
|
|
+#define SzBitArray_Check(p, i) (((p)[(i) >> 3] & (0x80 >> ((i) & 7))) != 0)
|
|
+
|
|
+#define SzBitWithVals_Check(p, i) ((p)->Defs && ((p)->Defs[(i) >> 3] & (0x80 >> ((i) & 7))) != 0)
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ UInt32 NumPackStreams;
|
|
+ UInt32 NumFolders;
|
|
+
|
|
+ UInt64 *PackPositions; // NumPackStreams + 1
|
|
+ CSzBitUi32s FolderCRCs; // NumFolders
|
|
+
|
|
+ size_t *FoCodersOffsets; // NumFolders + 1
|
|
+ UInt32 *FoStartPackStreamIndex; // NumFolders + 1
|
|
+ UInt32 *FoToCoderUnpackSizes; // NumFolders + 1
|
|
+ Byte *FoToMainUnpackSizeIndex; // NumFolders
|
|
+ UInt64 *CoderUnpackSizes; // for all coders in all folders
|
|
+
|
|
+ Byte *CodersData;
|
|
+
|
|
+ UInt64 RangeLimit;
|
|
+} CSzAr;
|
|
+
|
|
+UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex);
|
|
+
|
|
+SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex,
|
|
+ ILookInStream *stream, UInt64 startPos,
|
|
+ Byte *outBuffer, size_t outSize,
|
|
+ ISzAllocPtr allocMain);
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ CSzAr db;
|
|
+
|
|
+ UInt64 startPosAfterHeader;
|
|
+ UInt64 dataPos;
|
|
+
|
|
+ UInt32 NumFiles;
|
|
+
|
|
+ UInt64 *UnpackPositions; // NumFiles + 1
|
|
+ // Byte *IsEmptyFiles;
|
|
+ Byte *IsDirs;
|
|
+ CSzBitUi32s CRCs;
|
|
+
|
|
+ CSzBitUi32s Attribs;
|
|
+ // CSzBitUi32s Parents;
|
|
+ CSzBitUi64s MTime;
|
|
+ CSzBitUi64s CTime;
|
|
+
|
|
+ UInt32 *FolderToFile; // NumFolders + 1
|
|
+ UInt32 *FileToFolder; // NumFiles
|
|
+
|
|
+ size_t *FileNameOffsets; /* in 2-byte steps */
|
|
+ Byte *FileNames; /* UTF-16-LE */
|
|
+} CSzArEx;
|
|
+
|
|
+#define SzArEx_IsDir(p, i) (SzBitArray_Check((p)->IsDirs, i))
|
|
+
|
|
+#define SzArEx_GetFileSize(p, i) ((p)->UnpackPositions[(i) + 1] - (p)->UnpackPositions[i])
|
|
+
|
|
+void SzArEx_Init(CSzArEx *p);
|
|
+void SzArEx_Free(CSzArEx *p, ISzAllocPtr alloc);
|
|
+UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder);
|
|
+int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize);
|
|
+
|
|
+/*
|
|
+if dest == NULL, the return value specifies the required size of the buffer,
|
|
+ in 16-bit characters, including the null-terminating character.
|
|
+if dest != NULL, the return value specifies the number of 16-bit characters that
|
|
+ are written to the dest, including the null-terminating character. */
|
|
+
|
|
+size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest);
|
|
+
|
|
+/*
|
|
+size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex);
|
|
+UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest);
|
|
+*/
|
|
+
|
|
+
|
|
+
|
|
+/*
|
|
+ SzArEx_Extract extracts file from archive
|
|
+
|
|
+ *outBuffer must be 0 before first call for each new archive.
|
|
+
|
|
+ Extracting cache:
|
|
+ If you need to decompress more than one file, you can send
|
|
+ these values from previous call:
|
|
+ *blockIndex,
|
|
+ *outBuffer,
|
|
+ *outBufferSize
|
|
+ You can consider "*outBuffer" as cache of solid block. If your archive is solid,
|
|
+ it will increase decompression speed.
|
|
+
|
|
+ If you use external function, you can declare these 3 cache variables
|
|
+ (blockIndex, outBuffer, outBufferSize) as static in that external function.
|
|
+
|
|
+ Free *outBuffer and set *outBuffer to 0, if you want to flush cache.
|
|
+*/
|
|
+
|
|
+SRes SzArEx_Extract(
|
|
+ const CSzArEx *db,
|
|
+ ILookInStream *inStream,
|
|
+ UInt32 fileIndex, /* index of file */
|
|
+ UInt32 *blockIndex, /* index of solid block */
|
|
+ Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */
|
|
+ size_t *outBufferSize, /* buffer size for output buffer */
|
|
+ size_t *offset, /* offset of stream for required file in *outBuffer */
|
|
+ size_t *outSizeProcessed, /* size of file in *outBuffer */
|
|
+ ISzAllocPtr allocMain,
|
|
+ ISzAllocPtr allocTemp);
|
|
+
|
|
+
|
|
+/*
|
|
+SzArEx_Open Errors:
|
|
+SZ_ERROR_NO_ARCHIVE
|
|
+SZ_ERROR_ARCHIVE
|
|
+SZ_ERROR_UNSUPPORTED
|
|
+SZ_ERROR_MEM
|
|
+SZ_ERROR_CRC
|
|
+SZ_ERROR_INPUT_EOF
|
|
+SZ_ERROR_FAIL
|
|
+*/
|
|
+
|
|
+SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream,
|
|
+ ISzAllocPtr allocMain, ISzAllocPtr allocTemp);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/7zAlloc.h b/src/lzma-sdk/C/7zAlloc.h
|
|
new file mode 100644
|
|
index 0000000..c0f89d7
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/7zAlloc.h
|
|
@@ -0,0 +1,19 @@
|
|
+/* 7zAlloc.h -- Allocation functions
|
|
+2017-04-03 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_ALLOC_H
|
|
+#define __7Z_ALLOC_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+void *SzAlloc(ISzAllocPtr p, size_t size);
|
|
+void SzFree(ISzAllocPtr p, void *address);
|
|
+
|
|
+void *SzAllocTemp(ISzAllocPtr p, size_t size);
|
|
+void SzFreeTemp(ISzAllocPtr p, void *address);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/7zBuf.h b/src/lzma-sdk/C/7zBuf.h
|
|
new file mode 100644
|
|
index 0000000..5942d6e
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/7zBuf.h
|
|
@@ -0,0 +1,35 @@
|
|
+/* 7zBuf.h -- Byte Buffer
|
|
+2017-04-03 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_BUF_H
|
|
+#define __7Z_BUF_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ Byte *data;
|
|
+ size_t size;
|
|
+} CBuf;
|
|
+
|
|
+void Buf_Init(CBuf *p);
|
|
+int Buf_Create(CBuf *p, size_t size, ISzAllocPtr alloc);
|
|
+void Buf_Free(CBuf *p, ISzAllocPtr alloc);
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ Byte *data;
|
|
+ size_t size;
|
|
+ size_t pos;
|
|
+} CDynBuf;
|
|
+
|
|
+void DynBuf_Construct(CDynBuf *p);
|
|
+void DynBuf_SeekToBeg(CDynBuf *p);
|
|
+int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAllocPtr alloc);
|
|
+void DynBuf_Free(CDynBuf *p, ISzAllocPtr alloc);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/7zCrc.h b/src/lzma-sdk/C/7zCrc.h
|
|
new file mode 100644
|
|
index 0000000..3b04594
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/7zCrc.h
|
|
@@ -0,0 +1,25 @@
|
|
+/* 7zCrc.h -- CRC32 calculation
|
|
+2013-01-18 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_CRC_H
|
|
+#define __7Z_CRC_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+extern UInt32 g_CrcTable[];
|
|
+
|
|
+/* Call CrcGenerateTable one time before other CRC functions */
|
|
+void MY_FAST_CALL CrcGenerateTable(void);
|
|
+
|
|
+#define CRC_INIT_VAL 0xFFFFFFFF
|
|
+#define CRC_GET_DIGEST(crc) ((crc) ^ CRC_INIT_VAL)
|
|
+#define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))
|
|
+
|
|
+UInt32 MY_FAST_CALL CrcUpdate(UInt32 crc, const void *data, size_t size);
|
|
+UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/7zFile.h b/src/lzma-sdk/C/7zFile.h
|
|
new file mode 100644
|
|
index 0000000..c7a30fc
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/7zFile.h
|
|
@@ -0,0 +1,91 @@
|
|
+/* 7zFile.h -- File IO
|
|
+2021-02-15 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_FILE_H
|
|
+#define __7Z_FILE_H
|
|
+
|
|
+#ifdef _WIN32
|
|
+#define USE_WINDOWS_FILE
|
|
+// #include <windows.h>
|
|
+#endif
|
|
+
|
|
+#ifdef USE_WINDOWS_FILE
|
|
+#include <windows.h>
|
|
+#else
|
|
+// note: USE_FOPEN mode is limited to 32-bit file size
|
|
+// #define USE_FOPEN
|
|
+// #include <stdio.h>
|
|
+#endif
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+/* ---------- File ---------- */
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ #ifdef USE_WINDOWS_FILE
|
|
+ HANDLE handle;
|
|
+ #elif defined(USE_FOPEN)
|
|
+ FILE *file;
|
|
+ #else
|
|
+ int fd;
|
|
+ #endif
|
|
+} CSzFile;
|
|
+
|
|
+void File_Construct(CSzFile *p);
|
|
+#if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE)
|
|
+WRes InFile_Open(CSzFile *p, const char *name);
|
|
+WRes OutFile_Open(CSzFile *p, const char *name);
|
|
+#endif
|
|
+#ifdef USE_WINDOWS_FILE
|
|
+WRes InFile_OpenW(CSzFile *p, const WCHAR *name);
|
|
+WRes OutFile_OpenW(CSzFile *p, const WCHAR *name);
|
|
+#endif
|
|
+WRes File_Close(CSzFile *p);
|
|
+
|
|
+/* reads max(*size, remain file's size) bytes */
|
|
+WRes File_Read(CSzFile *p, void *data, size_t *size);
|
|
+
|
|
+/* writes *size bytes */
|
|
+WRes File_Write(CSzFile *p, const void *data, size_t *size);
|
|
+
|
|
+WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin);
|
|
+WRes File_GetLength(CSzFile *p, UInt64 *length);
|
|
+
|
|
+
|
|
+/* ---------- FileInStream ---------- */
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ ISeqInStream vt;
|
|
+ CSzFile file;
|
|
+ WRes wres;
|
|
+} CFileSeqInStream;
|
|
+
|
|
+void FileSeqInStream_CreateVTable(CFileSeqInStream *p);
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ ISeekInStream vt;
|
|
+ CSzFile file;
|
|
+ WRes wres;
|
|
+} CFileInStream;
|
|
+
|
|
+void FileInStream_CreateVTable(CFileInStream *p);
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ ISeqOutStream vt;
|
|
+ CSzFile file;
|
|
+ WRes wres;
|
|
+} CFileOutStream;
|
|
+
|
|
+void FileOutStream_CreateVTable(CFileOutStream *p);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/7zTypes.h b/src/lzma-sdk/C/7zTypes.h
|
|
new file mode 100644
|
|
index 0000000..763d3a9
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/7zTypes.h
|
|
@@ -0,0 +1,529 @@
|
|
+/* 7zTypes.h -- Basic types
|
|
+2022-04-01 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_TYPES_H
|
|
+#define __7Z_TYPES_H
|
|
+
|
|
+#ifdef _WIN32
|
|
+/* #include <windows.h> */
|
|
+#else
|
|
+#include <errno.h>
|
|
+#endif
|
|
+
|
|
+#include <stddef.h>
|
|
+
|
|
+#ifndef EXTERN_C_BEGIN
|
|
+#ifdef __cplusplus
|
|
+#define EXTERN_C_BEGIN extern "C" {
|
|
+#define EXTERN_C_END }
|
|
+#else
|
|
+#define EXTERN_C_BEGIN
|
|
+#define EXTERN_C_END
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#define SZ_OK 0
|
|
+
|
|
+#define SZ_ERROR_DATA 1
|
|
+#define SZ_ERROR_MEM 2
|
|
+#define SZ_ERROR_CRC 3
|
|
+#define SZ_ERROR_UNSUPPORTED 4
|
|
+#define SZ_ERROR_PARAM 5
|
|
+#define SZ_ERROR_INPUT_EOF 6
|
|
+#define SZ_ERROR_OUTPUT_EOF 7
|
|
+#define SZ_ERROR_READ 8
|
|
+#define SZ_ERROR_WRITE 9
|
|
+#define SZ_ERROR_PROGRESS 10
|
|
+#define SZ_ERROR_FAIL 11
|
|
+#define SZ_ERROR_THREAD 12
|
|
+
|
|
+#define SZ_ERROR_ARCHIVE 16
|
|
+#define SZ_ERROR_NO_ARCHIVE 17
|
|
+
|
|
+typedef int SRes;
|
|
+
|
|
+
|
|
+#ifdef _MSC_VER
|
|
+ #if _MSC_VER > 1200
|
|
+ #define MY_ALIGN(n) __declspec(align(n))
|
|
+ #else
|
|
+ #define MY_ALIGN(n)
|
|
+ #endif
|
|
+#else
|
|
+ #define MY_ALIGN(n) __attribute__ ((aligned(n)))
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifdef _WIN32
|
|
+
|
|
+/* typedef DWORD WRes; */
|
|
+typedef unsigned WRes;
|
|
+#define MY_SRes_HRESULT_FROM_WRes(x) HRESULT_FROM_WIN32(x)
|
|
+
|
|
+// #define MY_HRES_ERROR__INTERNAL_ERROR MY_SRes_HRESULT_FROM_WRes(ERROR_INTERNAL_ERROR)
|
|
+
|
|
+#else // _WIN32
|
|
+
|
|
+// #define ENV_HAVE_LSTAT
|
|
+typedef int WRes;
|
|
+
|
|
+// (FACILITY_ERRNO = 0x800) is 7zip's FACILITY constant to represent (errno) errors in HRESULT
|
|
+#define MY__FACILITY_ERRNO 0x800
|
|
+#define MY__FACILITY_WIN32 7
|
|
+#define MY__FACILITY__WRes MY__FACILITY_ERRNO
|
|
+
|
|
+#define MY_HRESULT_FROM_errno_CONST_ERROR(x) ((HRESULT)( \
|
|
+ ( (HRESULT)(x) & 0x0000FFFF) \
|
|
+ | (MY__FACILITY__WRes << 16) \
|
|
+ | (HRESULT)0x80000000 ))
|
|
+
|
|
+#define MY_SRes_HRESULT_FROM_WRes(x) \
|
|
+ ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : MY_HRESULT_FROM_errno_CONST_ERROR(x))
|
|
+
|
|
+// we call macro HRESULT_FROM_WIN32 for system errors (WRes) that are (errno)
|
|
+#define HRESULT_FROM_WIN32(x) MY_SRes_HRESULT_FROM_WRes(x)
|
|
+
|
|
+/*
|
|
+#define ERROR_FILE_NOT_FOUND 2L
|
|
+#define ERROR_ACCESS_DENIED 5L
|
|
+#define ERROR_NO_MORE_FILES 18L
|
|
+#define ERROR_LOCK_VIOLATION 33L
|
|
+#define ERROR_FILE_EXISTS 80L
|
|
+#define ERROR_DISK_FULL 112L
|
|
+#define ERROR_NEGATIVE_SEEK 131L
|
|
+#define ERROR_ALREADY_EXISTS 183L
|
|
+#define ERROR_DIRECTORY 267L
|
|
+#define ERROR_TOO_MANY_POSTS 298L
|
|
+
|
|
+#define ERROR_INTERNAL_ERROR 1359L
|
|
+#define ERROR_INVALID_REPARSE_DATA 4392L
|
|
+#define ERROR_REPARSE_TAG_INVALID 4393L
|
|
+#define ERROR_REPARSE_TAG_MISMATCH 4394L
|
|
+*/
|
|
+
|
|
+// we use errno equivalents for some WIN32 errors:
|
|
+
|
|
+#define ERROR_INVALID_PARAMETER EINVAL
|
|
+#define ERROR_INVALID_FUNCTION EINVAL
|
|
+#define ERROR_ALREADY_EXISTS EEXIST
|
|
+#define ERROR_FILE_EXISTS EEXIST
|
|
+#define ERROR_PATH_NOT_FOUND ENOENT
|
|
+#define ERROR_FILE_NOT_FOUND ENOENT
|
|
+#define ERROR_DISK_FULL ENOSPC
|
|
+// #define ERROR_INVALID_HANDLE EBADF
|
|
+
|
|
+// we use FACILITY_WIN32 for errors that has no errno equivalent
|
|
+// Too many posts were made to a semaphore.
|
|
+#define ERROR_TOO_MANY_POSTS ((HRESULT)0x8007012AL)
|
|
+#define ERROR_INVALID_REPARSE_DATA ((HRESULT)0x80071128L)
|
|
+#define ERROR_REPARSE_TAG_INVALID ((HRESULT)0x80071129L)
|
|
+
|
|
+// if (MY__FACILITY__WRes != FACILITY_WIN32),
|
|
+// we use FACILITY_WIN32 for COM errors:
|
|
+#define E_OUTOFMEMORY ((HRESULT)0x8007000EL)
|
|
+#define E_INVALIDARG ((HRESULT)0x80070057L)
|
|
+#define MY__E_ERROR_NEGATIVE_SEEK ((HRESULT)0x80070083L)
|
|
+
|
|
+/*
|
|
+// we can use FACILITY_ERRNO for some COM errors, that have errno equivalents:
|
|
+#define E_OUTOFMEMORY MY_HRESULT_FROM_errno_CONST_ERROR(ENOMEM)
|
|
+#define E_INVALIDARG MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL)
|
|
+#define MY__E_ERROR_NEGATIVE_SEEK MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL)
|
|
+*/
|
|
+
|
|
+#define TEXT(quote) quote
|
|
+
|
|
+#define FILE_ATTRIBUTE_READONLY 0x0001
|
|
+#define FILE_ATTRIBUTE_HIDDEN 0x0002
|
|
+#define FILE_ATTRIBUTE_SYSTEM 0x0004
|
|
+#define FILE_ATTRIBUTE_DIRECTORY 0x0010
|
|
+#define FILE_ATTRIBUTE_ARCHIVE 0x0020
|
|
+#define FILE_ATTRIBUTE_DEVICE 0x0040
|
|
+#define FILE_ATTRIBUTE_NORMAL 0x0080
|
|
+#define FILE_ATTRIBUTE_TEMPORARY 0x0100
|
|
+#define FILE_ATTRIBUTE_SPARSE_FILE 0x0200
|
|
+#define FILE_ATTRIBUTE_REPARSE_POINT 0x0400
|
|
+#define FILE_ATTRIBUTE_COMPRESSED 0x0800
|
|
+#define FILE_ATTRIBUTE_OFFLINE 0x1000
|
|
+#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x2000
|
|
+#define FILE_ATTRIBUTE_ENCRYPTED 0x4000
|
|
+
|
|
+#define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 /* trick for Unix */
|
|
+
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifndef RINOK
|
|
+#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
|
|
+#endif
|
|
+
|
|
+#ifndef RINOK_WRes
|
|
+#define RINOK_WRes(x) { WRes __result__ = (x); if (__result__ != 0) return __result__; }
|
|
+#endif
|
|
+
|
|
+typedef unsigned char Byte;
|
|
+typedef short Int16;
|
|
+typedef unsigned short UInt16;
|
|
+
|
|
+#ifdef _LZMA_UINT32_IS_ULONG
|
|
+typedef long Int32;
|
|
+typedef unsigned long UInt32;
|
|
+#else
|
|
+typedef int Int32;
|
|
+typedef unsigned int UInt32;
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifndef _WIN32
|
|
+
|
|
+typedef int INT;
|
|
+typedef Int32 INT32;
|
|
+typedef unsigned int UINT;
|
|
+typedef UInt32 UINT32;
|
|
+typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit for _WIN32 compatibility
|
|
+typedef UINT32 ULONG;
|
|
+
|
|
+#undef DWORD
|
|
+typedef UINT32 DWORD;
|
|
+
|
|
+#define VOID void
|
|
+
|
|
+#define HRESULT LONG
|
|
+
|
|
+typedef void *LPVOID;
|
|
+// typedef void VOID;
|
|
+// typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
|
|
+// gcc / clang on Unix : sizeof(long==sizeof(void*) in 32 or 64 bits)
|
|
+typedef long INT_PTR;
|
|
+typedef unsigned long UINT_PTR;
|
|
+typedef long LONG_PTR;
|
|
+typedef unsigned long DWORD_PTR;
|
|
+
|
|
+typedef size_t SIZE_T;
|
|
+
|
|
+#endif // _WIN32
|
|
+
|
|
+
|
|
+#define MY_HRES_ERROR__INTERNAL_ERROR ((HRESULT)0x8007054FL)
|
|
+
|
|
+
|
|
+#ifdef _SZ_NO_INT_64
|
|
+
|
|
+/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
|
|
+ NOTES: Some code will work incorrectly in that case! */
|
|
+
|
|
+typedef long Int64;
|
|
+typedef unsigned long UInt64;
|
|
+
|
|
+#else
|
|
+
|
|
+#if defined(_MSC_VER) || defined(__BORLANDC__)
|
|
+typedef __int64 Int64;
|
|
+typedef unsigned __int64 UInt64;
|
|
+#define UINT64_CONST(n) n
|
|
+#else
|
|
+typedef long long int Int64;
|
|
+typedef unsigned long long int UInt64;
|
|
+#define UINT64_CONST(n) n ## ULL
|
|
+#endif
|
|
+
|
|
+#endif
|
|
+
|
|
+#ifdef _LZMA_NO_SYSTEM_SIZE_T
|
|
+typedef UInt32 SizeT;
|
|
+#else
|
|
+typedef size_t SizeT;
|
|
+#endif
|
|
+
|
|
+typedef int BoolInt;
|
|
+/* typedef BoolInt Bool; */
|
|
+#define True 1
|
|
+#define False 0
|
|
+
|
|
+
|
|
+#ifdef _WIN32
|
|
+#define MY_STD_CALL __stdcall
|
|
+#else
|
|
+#define MY_STD_CALL
|
|
+#endif
|
|
+
|
|
+#ifdef _MSC_VER
|
|
+
|
|
+#if _MSC_VER >= 1300
|
|
+#define MY_NO_INLINE __declspec(noinline)
|
|
+#else
|
|
+#define MY_NO_INLINE
|
|
+#endif
|
|
+
|
|
+#define MY_FORCE_INLINE __forceinline
|
|
+
|
|
+#define MY_CDECL __cdecl
|
|
+#define MY_FAST_CALL __fastcall
|
|
+
|
|
+#else // _MSC_VER
|
|
+
|
|
+#if (defined(__GNUC__) && (__GNUC__ >= 4)) \
|
|
+ || (defined(__clang__) && (__clang_major__ >= 4)) \
|
|
+ || defined(__INTEL_COMPILER) \
|
|
+ || defined(__xlC__)
|
|
+#define MY_NO_INLINE __attribute__((noinline))
|
|
+// #define MY_FORCE_INLINE __attribute__((always_inline)) inline
|
|
+#else
|
|
+#define MY_NO_INLINE
|
|
+#endif
|
|
+
|
|
+#define MY_FORCE_INLINE
|
|
+
|
|
+
|
|
+#define MY_CDECL
|
|
+
|
|
+#if defined(_M_IX86) \
|
|
+ || defined(__i386__)
|
|
+// #define MY_FAST_CALL __attribute__((fastcall))
|
|
+// #define MY_FAST_CALL __attribute__((cdecl))
|
|
+#define MY_FAST_CALL
|
|
+#elif defined(MY_CPU_AMD64)
|
|
+// #define MY_FAST_CALL __attribute__((ms_abi))
|
|
+#define MY_FAST_CALL
|
|
+#else
|
|
+#define MY_FAST_CALL
|
|
+#endif
|
|
+
|
|
+#endif // _MSC_VER
|
|
+
|
|
+
|
|
+/* The following interfaces use first parameter as pointer to structure */
|
|
+
|
|
+typedef struct IByteIn IByteIn;
|
|
+struct IByteIn
|
|
+{
|
|
+ Byte (*Read)(const IByteIn *p); /* reads one byte, returns 0 in case of EOF or error */
|
|
+};
|
|
+#define IByteIn_Read(p) (p)->Read(p)
|
|
+
|
|
+
|
|
+typedef struct IByteOut IByteOut;
|
|
+struct IByteOut
|
|
+{
|
|
+ void (*Write)(const IByteOut *p, Byte b);
|
|
+};
|
|
+#define IByteOut_Write(p, b) (p)->Write(p, b)
|
|
+
|
|
+
|
|
+typedef struct ISeqInStream ISeqInStream;
|
|
+struct ISeqInStream
|
|
+{
|
|
+ SRes (*Read)(const ISeqInStream *p, void *buf, size_t *size);
|
|
+ /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
|
|
+ (output(*size) < input(*size)) is allowed */
|
|
+};
|
|
+#define ISeqInStream_Read(p, buf, size) (p)->Read(p, buf, size)
|
|
+
|
|
+/* it can return SZ_ERROR_INPUT_EOF */
|
|
+SRes SeqInStream_Read(const ISeqInStream *stream, void *buf, size_t size);
|
|
+SRes SeqInStream_Read2(const ISeqInStream *stream, void *buf, size_t size, SRes errorType);
|
|
+SRes SeqInStream_ReadByte(const ISeqInStream *stream, Byte *buf);
|
|
+
|
|
+
|
|
+typedef struct ISeqOutStream ISeqOutStream;
|
|
+struct ISeqOutStream
|
|
+{
|
|
+ size_t (*Write)(const ISeqOutStream *p, const void *buf, size_t size);
|
|
+ /* Returns: result - the number of actually written bytes.
|
|
+ (result < size) means error */
|
|
+};
|
|
+#define ISeqOutStream_Write(p, buf, size) (p)->Write(p, buf, size)
|
|
+
|
|
+typedef enum
|
|
+{
|
|
+ SZ_SEEK_SET = 0,
|
|
+ SZ_SEEK_CUR = 1,
|
|
+ SZ_SEEK_END = 2
|
|
+} ESzSeek;
|
|
+
|
|
+
|
|
+typedef struct ISeekInStream ISeekInStream;
|
|
+struct ISeekInStream
|
|
+{
|
|
+ SRes (*Read)(const ISeekInStream *p, void *buf, size_t *size); /* same as ISeqInStream::Read */
|
|
+ SRes (*Seek)(const ISeekInStream *p, Int64 *pos, ESzSeek origin);
|
|
+};
|
|
+#define ISeekInStream_Read(p, buf, size) (p)->Read(p, buf, size)
|
|
+#define ISeekInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin)
|
|
+
|
|
+
|
|
+typedef struct ILookInStream ILookInStream;
|
|
+struct ILookInStream
|
|
+{
|
|
+ SRes (*Look)(const ILookInStream *p, const void **buf, size_t *size);
|
|
+ /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
|
|
+ (output(*size) > input(*size)) is not allowed
|
|
+ (output(*size) < input(*size)) is allowed */
|
|
+ SRes (*Skip)(const ILookInStream *p, size_t offset);
|
|
+ /* offset must be <= output(*size) of Look */
|
|
+
|
|
+ SRes (*Read)(const ILookInStream *p, void *buf, size_t *size);
|
|
+ /* reads directly (without buffer). It's same as ISeqInStream::Read */
|
|
+ SRes (*Seek)(const ILookInStream *p, Int64 *pos, ESzSeek origin);
|
|
+};
|
|
+
|
|
+#define ILookInStream_Look(p, buf, size) (p)->Look(p, buf, size)
|
|
+#define ILookInStream_Skip(p, offset) (p)->Skip(p, offset)
|
|
+#define ILookInStream_Read(p, buf, size) (p)->Read(p, buf, size)
|
|
+#define ILookInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin)
|
|
+
|
|
+
|
|
+SRes LookInStream_LookRead(const ILookInStream *stream, void *buf, size_t *size);
|
|
+SRes LookInStream_SeekTo(const ILookInStream *stream, UInt64 offset);
|
|
+
|
|
+/* reads via ILookInStream::Read */
|
|
+SRes LookInStream_Read2(const ILookInStream *stream, void *buf, size_t size, SRes errorType);
|
|
+SRes LookInStream_Read(const ILookInStream *stream, void *buf, size_t size);
|
|
+
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ ILookInStream vt;
|
|
+ const ISeekInStream *realStream;
|
|
+
|
|
+ size_t pos;
|
|
+ size_t size; /* it's data size */
|
|
+
|
|
+ /* the following variables must be set outside */
|
|
+ Byte *buf;
|
|
+ size_t bufSize;
|
|
+} CLookToRead2;
|
|
+
|
|
+void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead);
|
|
+
|
|
+#define LookToRead2_Init(p) { (p)->pos = (p)->size = 0; }
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ ISeqInStream vt;
|
|
+ const ILookInStream *realStream;
|
|
+} CSecToLook;
|
|
+
|
|
+void SecToLook_CreateVTable(CSecToLook *p);
|
|
+
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ ISeqInStream vt;
|
|
+ const ILookInStream *realStream;
|
|
+} CSecToRead;
|
|
+
|
|
+void SecToRead_CreateVTable(CSecToRead *p);
|
|
+
|
|
+
|
|
+typedef struct ICompressProgress ICompressProgress;
|
|
+
|
|
+struct ICompressProgress
|
|
+{
|
|
+ SRes (*Progress)(const ICompressProgress *p, UInt64 inSize, UInt64 outSize);
|
|
+ /* Returns: result. (result != SZ_OK) means break.
|
|
+ Value (UInt64)(Int64)-1 for size means unknown value. */
|
|
+};
|
|
+#define ICompressProgress_Progress(p, inSize, outSize) (p)->Progress(p, inSize, outSize)
|
|
+
|
|
+
|
|
+
|
|
+typedef struct ISzAlloc ISzAlloc;
|
|
+typedef const ISzAlloc * ISzAllocPtr;
|
|
+
|
|
+struct ISzAlloc
|
|
+{
|
|
+ void *(*Alloc)(ISzAllocPtr p, size_t size);
|
|
+ void (*Free)(ISzAllocPtr p, void *address); /* address can be 0 */
|
|
+};
|
|
+
|
|
+#define ISzAlloc_Alloc(p, size) (p)->Alloc(p, size)
|
|
+#define ISzAlloc_Free(p, a) (p)->Free(p, a)
|
|
+
|
|
+/* deprecated */
|
|
+#define IAlloc_Alloc(p, size) ISzAlloc_Alloc(p, size)
|
|
+#define IAlloc_Free(p, a) ISzAlloc_Free(p, a)
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+#ifndef MY_offsetof
|
|
+ #ifdef offsetof
|
|
+ #define MY_offsetof(type, m) offsetof(type, m)
|
|
+ /*
|
|
+ #define MY_offsetof(type, m) FIELD_OFFSET(type, m)
|
|
+ */
|
|
+ #else
|
|
+ #define MY_offsetof(type, m) ((size_t)&(((type *)0)->m))
|
|
+ #endif
|
|
+#endif
|
|
+
|
|
+
|
|
+
|
|
+#ifndef MY_container_of
|
|
+
|
|
+/*
|
|
+#define MY_container_of(ptr, type, m) container_of(ptr, type, m)
|
|
+#define MY_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m)
|
|
+#define MY_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m)))
|
|
+#define MY_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m))))
|
|
+*/
|
|
+
|
|
+/*
|
|
+ GCC shows warning: "perhaps the 'offsetof' macro was used incorrectly"
|
|
+ GCC 3.4.4 : classes with constructor
|
|
+ GCC 4.8.1 : classes with non-public variable members"
|
|
+*/
|
|
+
|
|
+#define MY_container_of(ptr, type, m) ((type *)(void *)((char *)(void *)(1 ? (ptr) : &((type *)0)->m) - MY_offsetof(type, m)))
|
|
+
|
|
+#endif
|
|
+
|
|
+#define CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(void *)(ptr))
|
|
+
|
|
+/*
|
|
+#define CONTAINER_FROM_VTBL(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m)
|
|
+*/
|
|
+#define CONTAINER_FROM_VTBL(ptr, type, m) MY_container_of(ptr, type, m)
|
|
+
|
|
+#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m)
|
|
+/*
|
|
+#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL(ptr, type, m)
|
|
+*/
|
|
+
|
|
+
|
|
+#define MY_memset_0_ARRAY(a) memset((a), 0, sizeof(a))
|
|
+
|
|
+#ifdef _WIN32
|
|
+
|
|
+#define CHAR_PATH_SEPARATOR '\\'
|
|
+#define WCHAR_PATH_SEPARATOR L'\\'
|
|
+#define STRING_PATH_SEPARATOR "\\"
|
|
+#define WSTRING_PATH_SEPARATOR L"\\"
|
|
+
|
|
+#else
|
|
+
|
|
+#define CHAR_PATH_SEPARATOR '/'
|
|
+#define WCHAR_PATH_SEPARATOR L'/'
|
|
+#define STRING_PATH_SEPARATOR "/"
|
|
+#define WSTRING_PATH_SEPARATOR L"/"
|
|
+
|
|
+#endif
|
|
+
|
|
+#define k_PropVar_TimePrec_0 0
|
|
+#define k_PropVar_TimePrec_Unix 1
|
|
+#define k_PropVar_TimePrec_DOS 2
|
|
+#define k_PropVar_TimePrec_HighPrec 3
|
|
+#define k_PropVar_TimePrec_Base 16
|
|
+#define k_PropVar_TimePrec_100ns (k_PropVar_TimePrec_Base + 7)
|
|
+#define k_PropVar_TimePrec_1ns (k_PropVar_TimePrec_Base + 9)
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/7zVersion.h b/src/lzma-sdk/C/7zVersion.h
|
|
new file mode 100644
|
|
index 0000000..345b5b5
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/7zVersion.h
|
|
@@ -0,0 +1,27 @@
|
|
+#define MY_VER_MAJOR 22
|
|
+#define MY_VER_MINOR 00
|
|
+#define MY_VER_BUILD 0
|
|
+#define MY_VERSION_NUMBERS "22.00"
|
|
+#define MY_VERSION MY_VERSION_NUMBERS
|
|
+
|
|
+#ifdef MY_CPU_NAME
|
|
+ #define MY_VERSION_CPU MY_VERSION " (" MY_CPU_NAME ")"
|
|
+#else
|
|
+ #define MY_VERSION_CPU MY_VERSION
|
|
+#endif
|
|
+
|
|
+#define MY_DATE "2022-06-15"
|
|
+#undef MY_COPYRIGHT
|
|
+#undef MY_VERSION_COPYRIGHT_DATE
|
|
+#define MY_AUTHOR_NAME "Igor Pavlov"
|
|
+#define MY_COPYRIGHT_PD "Igor Pavlov : Public domain"
|
|
+#define MY_COPYRIGHT_CR "Copyright (c) 1999-2022 Igor Pavlov"
|
|
+
|
|
+#ifdef USE_COPYRIGHT_CR
|
|
+ #define MY_COPYRIGHT MY_COPYRIGHT_CR
|
|
+#else
|
|
+ #define MY_COPYRIGHT MY_COPYRIGHT_PD
|
|
+#endif
|
|
+
|
|
+#define MY_COPYRIGHT_DATE MY_COPYRIGHT " : " MY_DATE
|
|
+#define MY_VERSION_COPYRIGHT_DATE MY_VERSION_CPU " : " MY_COPYRIGHT " : " MY_DATE
|
|
diff --git a/src/lzma-sdk/C/Aes.h b/src/lzma-sdk/C/Aes.h
|
|
new file mode 100644
|
|
index 0000000..602e25e
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Aes.h
|
|
@@ -0,0 +1,60 @@
|
|
+/* Aes.h -- AES encryption / decryption
|
|
+2018-04-28 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __AES_H
|
|
+#define __AES_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#define AES_BLOCK_SIZE 16
|
|
+
|
|
+/* Call AesGenTables one time before other AES functions */
|
|
+void AesGenTables(void);
|
|
+
|
|
+/* UInt32 pointers must be 16-byte aligned */
|
|
+
|
|
+/* 16-byte (4 * 32-bit words) blocks: 1 (IV) + 1 (keyMode) + 15 (AES-256 roundKeys) */
|
|
+#define AES_NUM_IVMRK_WORDS ((1 + 1 + 15) * 4)
|
|
+
|
|
+/* aes - 16-byte aligned pointer to keyMode+roundKeys sequence */
|
|
+/* keySize = 16 or 24 or 32 (bytes) */
|
|
+typedef void (MY_FAST_CALL *AES_SET_KEY_FUNC)(UInt32 *aes, const Byte *key, unsigned keySize);
|
|
+void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *aes, const Byte *key, unsigned keySize);
|
|
+void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *aes, const Byte *key, unsigned keySize);
|
|
+
|
|
+/* ivAes - 16-byte aligned pointer to iv+keyMode+roundKeys sequence: UInt32[AES_NUM_IVMRK_WORDS] */
|
|
+void AesCbc_Init(UInt32 *ivAes, const Byte *iv); /* iv size is AES_BLOCK_SIZE */
|
|
+
|
|
+/* data - 16-byte aligned pointer to data */
|
|
+/* numBlocks - the number of 16-byte blocks in data array */
|
|
+typedef void (MY_FAST_CALL *AES_CODE_FUNC)(UInt32 *ivAes, Byte *data, size_t numBlocks);
|
|
+
|
|
+extern AES_CODE_FUNC g_AesCbc_Decode;
|
|
+#ifndef _SFX
|
|
+extern AES_CODE_FUNC g_AesCbc_Encode;
|
|
+extern AES_CODE_FUNC g_AesCtr_Code;
|
|
+#define k_Aes_SupportedFunctions_HW (1 << 2)
|
|
+#define k_Aes_SupportedFunctions_HW_256 (1 << 3)
|
|
+extern UInt32 g_Aes_SupportedFunctions_Flags;
|
|
+#endif
|
|
+
|
|
+
|
|
+#define DECLARE__AES_CODE_FUNC(funcName) \
|
|
+ void MY_FAST_CALL funcName(UInt32 *ivAes, Byte *data, size_t numBlocks);
|
|
+
|
|
+DECLARE__AES_CODE_FUNC (AesCbc_Encode)
|
|
+DECLARE__AES_CODE_FUNC (AesCbc_Decode)
|
|
+DECLARE__AES_CODE_FUNC (AesCtr_Code)
|
|
+
|
|
+DECLARE__AES_CODE_FUNC (AesCbc_Encode_HW)
|
|
+DECLARE__AES_CODE_FUNC (AesCbc_Decode_HW)
|
|
+DECLARE__AES_CODE_FUNC (AesCtr_Code_HW)
|
|
+
|
|
+DECLARE__AES_CODE_FUNC (AesCbc_Decode_HW_256)
|
|
+DECLARE__AES_CODE_FUNC (AesCtr_Code_HW_256)
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Alloc.h b/src/lzma-sdk/C/Alloc.h
|
|
new file mode 100644
|
|
index 0000000..59de107
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Alloc.h
|
|
@@ -0,0 +1,58 @@
|
|
+/* Alloc.h -- Memory allocation functions
|
|
+2021-07-13 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __COMMON_ALLOC_H
|
|
+#define __COMMON_ALLOC_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+void *MyAlloc(size_t size);
|
|
+void MyFree(void *address);
|
|
+
|
|
+#ifdef _WIN32
|
|
+
|
|
+void SetLargePageSize(void);
|
|
+
|
|
+void *MidAlloc(size_t size);
|
|
+void MidFree(void *address);
|
|
+void *BigAlloc(size_t size);
|
|
+void BigFree(void *address);
|
|
+
|
|
+#else
|
|
+
|
|
+#define MidAlloc(size) MyAlloc(size)
|
|
+#define MidFree(address) MyFree(address)
|
|
+#define BigAlloc(size) MyAlloc(size)
|
|
+#define BigFree(address) MyFree(address)
|
|
+
|
|
+#endif
|
|
+
|
|
+extern const ISzAlloc g_Alloc;
|
|
+
|
|
+#ifdef _WIN32
|
|
+extern const ISzAlloc g_BigAlloc;
|
|
+extern const ISzAlloc g_MidAlloc;
|
|
+#else
|
|
+#define g_BigAlloc g_AlignedAlloc
|
|
+#define g_MidAlloc g_AlignedAlloc
|
|
+#endif
|
|
+
|
|
+extern const ISzAlloc g_AlignedAlloc;
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ ISzAlloc vt;
|
|
+ ISzAllocPtr baseAlloc;
|
|
+ unsigned numAlignBits; /* ((1 << numAlignBits) >= sizeof(void *)) */
|
|
+ size_t offset; /* (offset == (k * sizeof(void *)) && offset < (1 << numAlignBits) */
|
|
+} CAlignOffsetAlloc;
|
|
+
|
|
+void AlignOffsetAlloc_CreateVTable(CAlignOffsetAlloc *p);
|
|
+
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Bcj2.h b/src/lzma-sdk/C/Bcj2.h
|
|
new file mode 100644
|
|
index 0000000..68893d2
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Bcj2.h
|
|
@@ -0,0 +1,146 @@
|
|
+/* Bcj2.h -- BCJ2 Converter for x86 code
|
|
+2014-11-10 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __BCJ2_H
|
|
+#define __BCJ2_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#define BCJ2_NUM_STREAMS 4
|
|
+
|
|
+enum
|
|
+{
|
|
+ BCJ2_STREAM_MAIN,
|
|
+ BCJ2_STREAM_CALL,
|
|
+ BCJ2_STREAM_JUMP,
|
|
+ BCJ2_STREAM_RC
|
|
+};
|
|
+
|
|
+enum
|
|
+{
|
|
+ BCJ2_DEC_STATE_ORIG_0 = BCJ2_NUM_STREAMS,
|
|
+ BCJ2_DEC_STATE_ORIG_1,
|
|
+ BCJ2_DEC_STATE_ORIG_2,
|
|
+ BCJ2_DEC_STATE_ORIG_3,
|
|
+
|
|
+ BCJ2_DEC_STATE_ORIG,
|
|
+ BCJ2_DEC_STATE_OK
|
|
+};
|
|
+
|
|
+enum
|
|
+{
|
|
+ BCJ2_ENC_STATE_ORIG = BCJ2_NUM_STREAMS,
|
|
+ BCJ2_ENC_STATE_OK
|
|
+};
|
|
+
|
|
+
|
|
+#define BCJ2_IS_32BIT_STREAM(s) ((s) == BCJ2_STREAM_CALL || (s) == BCJ2_STREAM_JUMP)
|
|
+
|
|
+/*
|
|
+CBcj2Dec / CBcj2Enc
|
|
+bufs sizes:
|
|
+ BUF_SIZE(n) = lims[n] - bufs[n]
|
|
+bufs sizes for BCJ2_STREAM_CALL and BCJ2_STREAM_JUMP must be mutliply of 4:
|
|
+ (BUF_SIZE(BCJ2_STREAM_CALL) & 3) == 0
|
|
+ (BUF_SIZE(BCJ2_STREAM_JUMP) & 3) == 0
|
|
+*/
|
|
+
|
|
+/*
|
|
+CBcj2Dec:
|
|
+dest is allowed to overlap with bufs[BCJ2_STREAM_MAIN], with the following conditions:
|
|
+ bufs[BCJ2_STREAM_MAIN] >= dest &&
|
|
+ bufs[BCJ2_STREAM_MAIN] - dest >= tempReserv +
|
|
+ BUF_SIZE(BCJ2_STREAM_CALL) +
|
|
+ BUF_SIZE(BCJ2_STREAM_JUMP)
|
|
+ tempReserv = 0 : for first call of Bcj2Dec_Decode
|
|
+ tempReserv = 4 : for any other calls of Bcj2Dec_Decode
|
|
+ overlap with offset = 1 is not allowed
|
|
+*/
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ const Byte *bufs[BCJ2_NUM_STREAMS];
|
|
+ const Byte *lims[BCJ2_NUM_STREAMS];
|
|
+ Byte *dest;
|
|
+ const Byte *destLim;
|
|
+
|
|
+ unsigned state; /* BCJ2_STREAM_MAIN has more priority than BCJ2_STATE_ORIG */
|
|
+
|
|
+ UInt32 ip;
|
|
+ Byte temp[4];
|
|
+ UInt32 range;
|
|
+ UInt32 code;
|
|
+ UInt16 probs[2 + 256];
|
|
+} CBcj2Dec;
|
|
+
|
|
+void Bcj2Dec_Init(CBcj2Dec *p);
|
|
+
|
|
+/* Returns: SZ_OK or SZ_ERROR_DATA */
|
|
+SRes Bcj2Dec_Decode(CBcj2Dec *p);
|
|
+
|
|
+#define Bcj2Dec_IsFinished(_p_) ((_p_)->code == 0)
|
|
+
|
|
+
|
|
+
|
|
+typedef enum
|
|
+{
|
|
+ BCJ2_ENC_FINISH_MODE_CONTINUE,
|
|
+ BCJ2_ENC_FINISH_MODE_END_BLOCK,
|
|
+ BCJ2_ENC_FINISH_MODE_END_STREAM
|
|
+} EBcj2Enc_FinishMode;
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ Byte *bufs[BCJ2_NUM_STREAMS];
|
|
+ const Byte *lims[BCJ2_NUM_STREAMS];
|
|
+ const Byte *src;
|
|
+ const Byte *srcLim;
|
|
+
|
|
+ unsigned state;
|
|
+ EBcj2Enc_FinishMode finishMode;
|
|
+
|
|
+ Byte prevByte;
|
|
+
|
|
+ Byte cache;
|
|
+ UInt32 range;
|
|
+ UInt64 low;
|
|
+ UInt64 cacheSize;
|
|
+
|
|
+ UInt32 ip;
|
|
+
|
|
+ /* 32-bit ralative offset in JUMP/CALL commands is
|
|
+ - (mod 4 GB) in 32-bit mode
|
|
+ - signed Int32 in 64-bit mode
|
|
+ We use (mod 4 GB) check for fileSize.
|
|
+ Use fileSize up to 2 GB, if you want to support 32-bit and 64-bit code conversion. */
|
|
+ UInt32 fileIp;
|
|
+ UInt32 fileSize; /* (fileSize <= ((UInt32)1 << 31)), 0 means no_limit */
|
|
+ UInt32 relatLimit; /* (relatLimit <= ((UInt32)1 << 31)), 0 means desable_conversion */
|
|
+
|
|
+ UInt32 tempTarget;
|
|
+ unsigned tempPos;
|
|
+ Byte temp[4 * 2];
|
|
+
|
|
+ unsigned flushPos;
|
|
+
|
|
+ UInt16 probs[2 + 256];
|
|
+} CBcj2Enc;
|
|
+
|
|
+void Bcj2Enc_Init(CBcj2Enc *p);
|
|
+void Bcj2Enc_Encode(CBcj2Enc *p);
|
|
+
|
|
+#define Bcj2Enc_Get_InputData_Size(p) ((SizeT)((p)->srcLim - (p)->src) + (p)->tempPos)
|
|
+#define Bcj2Enc_IsFinished(p) ((p)->flushPos == 5)
|
|
+
|
|
+
|
|
+#define BCJ2_RELAT_LIMIT_NUM_BITS 26
|
|
+#define BCJ2_RELAT_LIMIT ((UInt32)1 << BCJ2_RELAT_LIMIT_NUM_BITS)
|
|
+
|
|
+/* limit for CBcj2Enc::fileSize variable */
|
|
+#define BCJ2_FileSize_MAX ((UInt32)1 << 31)
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Bra.h b/src/lzma-sdk/C/Bra.h
|
|
new file mode 100644
|
|
index 0000000..aba8dce
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Bra.h
|
|
@@ -0,0 +1,64 @@
|
|
+/* Bra.h -- Branch converters for executables
|
|
+2013-01-18 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __BRA_H
|
|
+#define __BRA_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+/*
|
|
+These functions convert relative addresses to absolute addresses
|
|
+in CALL instructions to increase the compression ratio.
|
|
+
|
|
+ In:
|
|
+ data - data buffer
|
|
+ size - size of data
|
|
+ ip - current virtual Instruction Pinter (IP) value
|
|
+ state - state variable for x86 converter
|
|
+ encoding - 0 (for decoding), 1 (for encoding)
|
|
+
|
|
+ Out:
|
|
+ state - state variable for x86 converter
|
|
+
|
|
+ Returns:
|
|
+ The number of processed bytes. If you call these functions with multiple calls,
|
|
+ you must start next call with first byte after block of processed bytes.
|
|
+
|
|
+ Type Endian Alignment LookAhead
|
|
+
|
|
+ x86 little 1 4
|
|
+ ARMT little 2 2
|
|
+ ARM little 4 0
|
|
+ PPC big 4 0
|
|
+ SPARC big 4 0
|
|
+ IA64 little 16 0
|
|
+
|
|
+ size must be >= Alignment + LookAhead, if it's not last block.
|
|
+ If (size < Alignment + LookAhead), converter returns 0.
|
|
+
|
|
+ Example:
|
|
+
|
|
+ UInt32 ip = 0;
|
|
+ for ()
|
|
+ {
|
|
+ ; size must be >= Alignment + LookAhead, if it's not last block
|
|
+ SizeT processed = Convert(data, size, ip, 1);
|
|
+ data += processed;
|
|
+ size -= processed;
|
|
+ ip += processed;
|
|
+ }
|
|
+*/
|
|
+
|
|
+#define x86_Convert_Init(state) { state = 0; }
|
|
+SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding);
|
|
+SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
|
|
+SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
|
|
+SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
|
|
+SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
|
|
+SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Compiler.h b/src/lzma-sdk/C/Compiler.h
|
|
new file mode 100644
|
|
index 0000000..eba3742
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Compiler.h
|
|
@@ -0,0 +1,43 @@
|
|
+/* Compiler.h
|
|
+2021-01-05 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_COMPILER_H
|
|
+#define __7Z_COMPILER_H
|
|
+
|
|
+ #ifdef __clang__
|
|
+ #pragma clang diagnostic ignored "-Wunused-private-field"
|
|
+ #endif
|
|
+
|
|
+#ifdef _MSC_VER
|
|
+
|
|
+ #ifdef UNDER_CE
|
|
+ #define RPC_NO_WINDOWS_H
|
|
+ /* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */
|
|
+ #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
|
|
+ #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int
|
|
+ #endif
|
|
+
|
|
+ #if _MSC_VER >= 1300
|
|
+ #pragma warning(disable : 4996) // This function or variable may be unsafe
|
|
+ #else
|
|
+ #pragma warning(disable : 4511) // copy constructor could not be generated
|
|
+ #pragma warning(disable : 4512) // assignment operator could not be generated
|
|
+ #pragma warning(disable : 4514) // unreferenced inline function has been removed
|
|
+ #pragma warning(disable : 4702) // unreachable code
|
|
+ #pragma warning(disable : 4710) // not inlined
|
|
+ #pragma warning(disable : 4714) // function marked as __forceinline not inlined
|
|
+ #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information
|
|
+ #endif
|
|
+
|
|
+ #ifdef __clang__
|
|
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
+ #pragma clang diagnostic ignored "-Wmicrosoft-exception-spec"
|
|
+ // #pragma clang diagnostic ignored "-Wreserved-id-macro"
|
|
+ #endif
|
|
+
|
|
+#endif
|
|
+
|
|
+#define UNUSED_VAR(x) (void)x;
|
|
+/* #define UNUSED_VAR(x) x=x; */
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/CpuArch.h b/src/lzma-sdk/C/CpuArch.h
|
|
new file mode 100644
|
|
index 0000000..b300a5a
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/CpuArch.h
|
|
@@ -0,0 +1,442 @@
|
|
+/* CpuArch.h -- CPU specific code
|
|
+2021-07-13 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __CPU_ARCH_H
|
|
+#define __CPU_ARCH_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+/*
|
|
+MY_CPU_LE means that CPU is LITTLE ENDIAN.
|
|
+MY_CPU_BE means that CPU is BIG ENDIAN.
|
|
+If MY_CPU_LE and MY_CPU_BE are not defined, we don't know about ENDIANNESS of platform.
|
|
+
|
|
+MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses.
|
|
+
|
|
+MY_CPU_64BIT means that processor can work with 64-bit registers.
|
|
+ MY_CPU_64BIT can be used to select fast code branch
|
|
+ MY_CPU_64BIT doesn't mean that (sizeof(void *) == 8)
|
|
+*/
|
|
+
|
|
+#if defined(_M_X64) \
|
|
+ || defined(_M_AMD64) \
|
|
+ || defined(__x86_64__) \
|
|
+ || defined(__AMD64__) \
|
|
+ || defined(__amd64__)
|
|
+ #define MY_CPU_AMD64
|
|
+ #ifdef __ILP32__
|
|
+ #define MY_CPU_NAME "x32"
|
|
+ #define MY_CPU_SIZEOF_POINTER 4
|
|
+ #else
|
|
+ #define MY_CPU_NAME "x64"
|
|
+ #define MY_CPU_SIZEOF_POINTER 8
|
|
+ #endif
|
|
+ #define MY_CPU_64BIT
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined(_M_IX86) \
|
|
+ || defined(__i386__)
|
|
+ #define MY_CPU_X86
|
|
+ #define MY_CPU_NAME "x86"
|
|
+ /* #define MY_CPU_32BIT */
|
|
+ #define MY_CPU_SIZEOF_POINTER 4
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined(_M_ARM64) \
|
|
+ || defined(__AARCH64EL__) \
|
|
+ || defined(__AARCH64EB__) \
|
|
+ || defined(__aarch64__)
|
|
+ #define MY_CPU_ARM64
|
|
+ #define MY_CPU_NAME "arm64"
|
|
+ #define MY_CPU_64BIT
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined(_M_ARM) \
|
|
+ || defined(_M_ARM_NT) \
|
|
+ || defined(_M_ARMT) \
|
|
+ || defined(__arm__) \
|
|
+ || defined(__thumb__) \
|
|
+ || defined(__ARMEL__) \
|
|
+ || defined(__ARMEB__) \
|
|
+ || defined(__THUMBEL__) \
|
|
+ || defined(__THUMBEB__)
|
|
+ #define MY_CPU_ARM
|
|
+
|
|
+ #if defined(__thumb__) || defined(__THUMBEL__) || defined(_M_ARMT)
|
|
+ #define MY_CPU_NAME "armt"
|
|
+ #else
|
|
+ #define MY_CPU_NAME "arm"
|
|
+ #endif
|
|
+ /* #define MY_CPU_32BIT */
|
|
+ #define MY_CPU_SIZEOF_POINTER 4
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined(_M_IA64) \
|
|
+ || defined(__ia64__)
|
|
+ #define MY_CPU_IA64
|
|
+ #define MY_CPU_NAME "ia64"
|
|
+ #define MY_CPU_64BIT
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined(__mips64) \
|
|
+ || defined(__mips64__) \
|
|
+ || (defined(__mips) && (__mips == 64 || __mips == 4 || __mips == 3))
|
|
+ #define MY_CPU_NAME "mips64"
|
|
+ #define MY_CPU_64BIT
|
|
+#elif defined(__mips__)
|
|
+ #define MY_CPU_NAME "mips"
|
|
+ /* #define MY_CPU_32BIT */
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined(__ppc64__) \
|
|
+ || defined(__powerpc64__) \
|
|
+ || defined(__ppc__) \
|
|
+ || defined(__powerpc__) \
|
|
+ || defined(__PPC__) \
|
|
+ || defined(_POWER)
|
|
+
|
|
+#if defined(__ppc64__) \
|
|
+ || defined(__powerpc64__) \
|
|
+ || defined(_LP64) \
|
|
+ || defined(__64BIT__)
|
|
+ #ifdef __ILP32__
|
|
+ #define MY_CPU_NAME "ppc64-32"
|
|
+ #define MY_CPU_SIZEOF_POINTER 4
|
|
+ #else
|
|
+ #define MY_CPU_NAME "ppc64"
|
|
+ #define MY_CPU_SIZEOF_POINTER 8
|
|
+ #endif
|
|
+ #define MY_CPU_64BIT
|
|
+#else
|
|
+ #define MY_CPU_NAME "ppc"
|
|
+ #define MY_CPU_SIZEOF_POINTER 4
|
|
+ /* #define MY_CPU_32BIT */
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined(__sparc64__)
|
|
+ #define MY_CPU_NAME "sparc64"
|
|
+ #define MY_CPU_64BIT
|
|
+#elif defined(__sparc__)
|
|
+ #define MY_CPU_NAME "sparc"
|
|
+ /* #define MY_CPU_32BIT */
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined(MY_CPU_X86) || defined(MY_CPU_AMD64)
|
|
+#define MY_CPU_X86_OR_AMD64
|
|
+#endif
|
|
+
|
|
+#if defined(MY_CPU_ARM) || defined(MY_CPU_ARM64)
|
|
+#define MY_CPU_ARM_OR_ARM64
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifdef _WIN32
|
|
+
|
|
+ #ifdef MY_CPU_ARM
|
|
+ #define MY_CPU_ARM_LE
|
|
+ #endif
|
|
+
|
|
+ #ifdef MY_CPU_ARM64
|
|
+ #define MY_CPU_ARM64_LE
|
|
+ #endif
|
|
+
|
|
+ #ifdef _M_IA64
|
|
+ #define MY_CPU_IA64_LE
|
|
+ #endif
|
|
+
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined(MY_CPU_X86_OR_AMD64) \
|
|
+ || defined(MY_CPU_ARM_LE) \
|
|
+ || defined(MY_CPU_ARM64_LE) \
|
|
+ || defined(MY_CPU_IA64_LE) \
|
|
+ || defined(__LITTLE_ENDIAN__) \
|
|
+ || defined(__ARMEL__) \
|
|
+ || defined(__THUMBEL__) \
|
|
+ || defined(__AARCH64EL__) \
|
|
+ || defined(__MIPSEL__) \
|
|
+ || defined(__MIPSEL) \
|
|
+ || defined(_MIPSEL) \
|
|
+ || defined(__BFIN__) \
|
|
+ || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
|
|
+ #define MY_CPU_LE
|
|
+#endif
|
|
+
|
|
+#if defined(__BIG_ENDIAN__) \
|
|
+ || defined(__ARMEB__) \
|
|
+ || defined(__THUMBEB__) \
|
|
+ || defined(__AARCH64EB__) \
|
|
+ || defined(__MIPSEB__) \
|
|
+ || defined(__MIPSEB) \
|
|
+ || defined(_MIPSEB) \
|
|
+ || defined(__m68k__) \
|
|
+ || defined(__s390__) \
|
|
+ || defined(__s390x__) \
|
|
+ || defined(__zarch__) \
|
|
+ || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
|
|
+ #define MY_CPU_BE
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined(MY_CPU_LE) && defined(MY_CPU_BE)
|
|
+ #error Stop_Compiling_Bad_Endian
|
|
+#endif
|
|
+
|
|
+
|
|
+#if defined(MY_CPU_32BIT) && defined(MY_CPU_64BIT)
|
|
+ #error Stop_Compiling_Bad_32_64_BIT
|
|
+#endif
|
|
+
|
|
+#ifdef __SIZEOF_POINTER__
|
|
+ #ifdef MY_CPU_SIZEOF_POINTER
|
|
+ #if MY_CPU_SIZEOF_POINTER != __SIZEOF_POINTER__
|
|
+ #error Stop_Compiling_Bad_MY_CPU_PTR_SIZE
|
|
+ #endif
|
|
+ #else
|
|
+ #define MY_CPU_SIZEOF_POINTER __SIZEOF_POINTER__
|
|
+ #endif
|
|
+#endif
|
|
+
|
|
+#if defined(MY_CPU_SIZEOF_POINTER) && (MY_CPU_SIZEOF_POINTER == 4)
|
|
+#if defined (_LP64)
|
|
+ #error Stop_Compiling_Bad_MY_CPU_PTR_SIZE
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+#ifdef _MSC_VER
|
|
+ #if _MSC_VER >= 1300
|
|
+ #define MY_CPU_pragma_pack_push_1 __pragma(pack(push, 1))
|
|
+ #define MY_CPU_pragma_pop __pragma(pack(pop))
|
|
+ #else
|
|
+ #define MY_CPU_pragma_pack_push_1
|
|
+ #define MY_CPU_pragma_pop
|
|
+ #endif
|
|
+#else
|
|
+ #ifdef __xlC__
|
|
+ #define MY_CPU_pragma_pack_push_1 _Pragma("pack(1)")
|
|
+ #define MY_CPU_pragma_pop _Pragma("pack()")
|
|
+ #else
|
|
+ #define MY_CPU_pragma_pack_push_1 _Pragma("pack(push, 1)")
|
|
+ #define MY_CPU_pragma_pop _Pragma("pack(pop)")
|
|
+ #endif
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifndef MY_CPU_NAME
|
|
+ #ifdef MY_CPU_LE
|
|
+ #define MY_CPU_NAME "LE"
|
|
+ #elif defined(MY_CPU_BE)
|
|
+ #define MY_CPU_NAME "BE"
|
|
+ #else
|
|
+ /*
|
|
+ #define MY_CPU_NAME ""
|
|
+ */
|
|
+ #endif
|
|
+#endif
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+#ifdef MY_CPU_LE
|
|
+ #if defined(MY_CPU_X86_OR_AMD64) \
|
|
+ || defined(MY_CPU_ARM64)
|
|
+ #define MY_CPU_LE_UNALIGN
|
|
+ #define MY_CPU_LE_UNALIGN_64
|
|
+ #elif defined(__ARM_FEATURE_UNALIGNED)
|
|
+ /* gcc9 for 32-bit arm can use LDRD instruction that requires 32-bit alignment.
|
|
+ So we can't use unaligned 64-bit operations. */
|
|
+ #define MY_CPU_LE_UNALIGN
|
|
+ #endif
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifdef MY_CPU_LE_UNALIGN
|
|
+
|
|
+#define GetUi16(p) (*(const UInt16 *)(const void *)(p))
|
|
+#define GetUi32(p) (*(const UInt32 *)(const void *)(p))
|
|
+#ifdef MY_CPU_LE_UNALIGN_64
|
|
+#define GetUi64(p) (*(const UInt64 *)(const void *)(p))
|
|
+#endif
|
|
+
|
|
+#define SetUi16(p, v) { *(UInt16 *)(void *)(p) = (v); }
|
|
+#define SetUi32(p, v) { *(UInt32 *)(void *)(p) = (v); }
|
|
+#ifdef MY_CPU_LE_UNALIGN_64
|
|
+#define SetUi64(p, v) { *(UInt64 *)(void *)(p) = (v); }
|
|
+#endif
|
|
+
|
|
+#else
|
|
+
|
|
+#define GetUi16(p) ( (UInt16) ( \
|
|
+ ((const Byte *)(p))[0] | \
|
|
+ ((UInt16)((const Byte *)(p))[1] << 8) ))
|
|
+
|
|
+#define GetUi32(p) ( \
|
|
+ ((const Byte *)(p))[0] | \
|
|
+ ((UInt32)((const Byte *)(p))[1] << 8) | \
|
|
+ ((UInt32)((const Byte *)(p))[2] << 16) | \
|
|
+ ((UInt32)((const Byte *)(p))[3] << 24))
|
|
+
|
|
+#define SetUi16(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \
|
|
+ _ppp_[0] = (Byte)_vvv_; \
|
|
+ _ppp_[1] = (Byte)(_vvv_ >> 8); }
|
|
+
|
|
+#define SetUi32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \
|
|
+ _ppp_[0] = (Byte)_vvv_; \
|
|
+ _ppp_[1] = (Byte)(_vvv_ >> 8); \
|
|
+ _ppp_[2] = (Byte)(_vvv_ >> 16); \
|
|
+ _ppp_[3] = (Byte)(_vvv_ >> 24); }
|
|
+
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifndef MY_CPU_LE_UNALIGN_64
|
|
+
|
|
+#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32))
|
|
+
|
|
+#define SetUi64(p, v) { Byte *_ppp2_ = (Byte *)(p); UInt64 _vvv2_ = (v); \
|
|
+ SetUi32(_ppp2_ , (UInt32)_vvv2_); \
|
|
+ SetUi32(_ppp2_ + 4, (UInt32)(_vvv2_ >> 32)); }
|
|
+
|
|
+#endif
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+#ifdef __has_builtin
|
|
+ #define MY__has_builtin(x) __has_builtin(x)
|
|
+#else
|
|
+ #define MY__has_builtin(x) 0
|
|
+#endif
|
|
+
|
|
+#if defined(MY_CPU_LE_UNALIGN) && /* defined(_WIN64) && */ defined(_MSC_VER) && (_MSC_VER >= 1300)
|
|
+
|
|
+/* Note: we use bswap instruction, that is unsupported in 386 cpu */
|
|
+
|
|
+#include <stdlib.h>
|
|
+
|
|
+#pragma intrinsic(_byteswap_ushort)
|
|
+#pragma intrinsic(_byteswap_ulong)
|
|
+#pragma intrinsic(_byteswap_uint64)
|
|
+
|
|
+/* #define GetBe16(p) _byteswap_ushort(*(const UInt16 *)(const Byte *)(p)) */
|
|
+#define GetBe32(p) _byteswap_ulong (*(const UInt32 *)(const void *)(p))
|
|
+#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const void *)(p))
|
|
+
|
|
+#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = _byteswap_ulong(v)
|
|
+
|
|
+#elif defined(MY_CPU_LE_UNALIGN) && ( \
|
|
+ (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) \
|
|
+ || (defined(__clang__) && MY__has_builtin(__builtin_bswap16)) )
|
|
+
|
|
+/* #define GetBe16(p) __builtin_bswap16(*(const UInt16 *)(const void *)(p)) */
|
|
+#define GetBe32(p) __builtin_bswap32(*(const UInt32 *)(const void *)(p))
|
|
+#define GetBe64(p) __builtin_bswap64(*(const UInt64 *)(const void *)(p))
|
|
+
|
|
+#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = __builtin_bswap32(v)
|
|
+
|
|
+#else
|
|
+
|
|
+#define GetBe32(p) ( \
|
|
+ ((UInt32)((const Byte *)(p))[0] << 24) | \
|
|
+ ((UInt32)((const Byte *)(p))[1] << 16) | \
|
|
+ ((UInt32)((const Byte *)(p))[2] << 8) | \
|
|
+ ((const Byte *)(p))[3] )
|
|
+
|
|
+#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4))
|
|
+
|
|
+#define SetBe32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \
|
|
+ _ppp_[0] = (Byte)(_vvv_ >> 24); \
|
|
+ _ppp_[1] = (Byte)(_vvv_ >> 16); \
|
|
+ _ppp_[2] = (Byte)(_vvv_ >> 8); \
|
|
+ _ppp_[3] = (Byte)_vvv_; }
|
|
+
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifndef GetBe16
|
|
+
|
|
+#define GetBe16(p) ( (UInt16) ( \
|
|
+ ((UInt16)((const Byte *)(p))[0] << 8) | \
|
|
+ ((const Byte *)(p))[1] ))
|
|
+
|
|
+#endif
|
|
+
|
|
+
|
|
+
|
|
+#ifdef MY_CPU_X86_OR_AMD64
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ UInt32 maxFunc;
|
|
+ UInt32 vendor[3];
|
|
+ UInt32 ver;
|
|
+ UInt32 b;
|
|
+ UInt32 c;
|
|
+ UInt32 d;
|
|
+} Cx86cpuid;
|
|
+
|
|
+enum
|
|
+{
|
|
+ CPU_FIRM_INTEL,
|
|
+ CPU_FIRM_AMD,
|
|
+ CPU_FIRM_VIA
|
|
+};
|
|
+
|
|
+void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d);
|
|
+
|
|
+BoolInt x86cpuid_CheckAndRead(Cx86cpuid *p);
|
|
+int x86cpuid_GetFirm(const Cx86cpuid *p);
|
|
+
|
|
+#define x86cpuid_GetFamily(ver) (((ver >> 16) & 0xFF0) | ((ver >> 8) & 0xF))
|
|
+#define x86cpuid_GetModel(ver) (((ver >> 12) & 0xF0) | ((ver >> 4) & 0xF))
|
|
+#define x86cpuid_GetStepping(ver) (ver & 0xF)
|
|
+
|
|
+BoolInt CPU_Is_InOrder(void);
|
|
+
|
|
+BoolInt CPU_IsSupported_AES(void);
|
|
+BoolInt CPU_IsSupported_AVX2(void);
|
|
+BoolInt CPU_IsSupported_VAES_AVX2(void);
|
|
+BoolInt CPU_IsSupported_SSSE3(void);
|
|
+BoolInt CPU_IsSupported_SSE41(void);
|
|
+BoolInt CPU_IsSupported_SHA(void);
|
|
+BoolInt CPU_IsSupported_PageGB(void);
|
|
+
|
|
+#elif defined(MY_CPU_ARM_OR_ARM64)
|
|
+
|
|
+BoolInt CPU_IsSupported_CRC32(void);
|
|
+BoolInt CPU_IsSupported_NEON(void);
|
|
+
|
|
+#if defined(_WIN32)
|
|
+BoolInt CPU_IsSupported_CRYPTO(void);
|
|
+#define CPU_IsSupported_SHA1 CPU_IsSupported_CRYPTO
|
|
+#define CPU_IsSupported_SHA2 CPU_IsSupported_CRYPTO
|
|
+#define CPU_IsSupported_AES CPU_IsSupported_CRYPTO
|
|
+#else
|
|
+BoolInt CPU_IsSupported_SHA1(void);
|
|
+BoolInt CPU_IsSupported_SHA2(void);
|
|
+BoolInt CPU_IsSupported_AES(void);
|
|
+#endif
|
|
+
|
|
+#endif
|
|
+
|
|
+#if defined(__APPLE__)
|
|
+int My_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize);
|
|
+int My_sysctlbyname_Get_UInt32(const char *name, UInt32 *val);
|
|
+#endif
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Delta.h b/src/lzma-sdk/C/Delta.h
|
|
new file mode 100644
|
|
index 0000000..e59d5a2
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Delta.h
|
|
@@ -0,0 +1,19 @@
|
|
+/* Delta.h -- Delta converter
|
|
+2013-01-18 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __DELTA_H
|
|
+#define __DELTA_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#define DELTA_STATE_SIZE 256
|
|
+
|
|
+void Delta_Init(Byte *state);
|
|
+void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size);
|
|
+void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/DllSecur.h b/src/lzma-sdk/C/DllSecur.h
|
|
new file mode 100644
|
|
index 0000000..0fd8070
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/DllSecur.h
|
|
@@ -0,0 +1,20 @@
|
|
+/* DllSecur.h -- DLL loading for security
|
|
+2018-02-19 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __DLL_SECUR_H
|
|
+#define __DLL_SECUR_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#ifdef _WIN32
|
|
+
|
|
+void My_SetDefaultDllDirectories(void);
|
|
+void LoadSecurityDlls(void);
|
|
+
|
|
+#endif
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/LzFind.h b/src/lzma-sdk/C/LzFind.h
|
|
new file mode 100644
|
|
index 0000000..8f9fade
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/LzFind.h
|
|
@@ -0,0 +1,136 @@
|
|
+/* LzFind.h -- Match finder for LZ algorithms
|
|
+2021-07-13 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __LZ_FIND_H
|
|
+#define __LZ_FIND_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+typedef UInt32 CLzRef;
|
|
+
|
|
+typedef struct _CMatchFinder
|
|
+{
|
|
+ Byte *buffer;
|
|
+ UInt32 pos;
|
|
+ UInt32 posLimit;
|
|
+ UInt32 streamPos; /* wrap over Zero is allowed (streamPos < pos). Use (UInt32)(streamPos - pos) */
|
|
+ UInt32 lenLimit;
|
|
+
|
|
+ UInt32 cyclicBufferPos;
|
|
+ UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */
|
|
+
|
|
+ Byte streamEndWasReached;
|
|
+ Byte btMode;
|
|
+ Byte bigHash;
|
|
+ Byte directInput;
|
|
+
|
|
+ UInt32 matchMaxLen;
|
|
+ CLzRef *hash;
|
|
+ CLzRef *son;
|
|
+ UInt32 hashMask;
|
|
+ UInt32 cutValue;
|
|
+
|
|
+ Byte *bufferBase;
|
|
+ ISeqInStream *stream;
|
|
+
|
|
+ UInt32 blockSize;
|
|
+ UInt32 keepSizeBefore;
|
|
+ UInt32 keepSizeAfter;
|
|
+
|
|
+ UInt32 numHashBytes;
|
|
+ size_t directInputRem;
|
|
+ UInt32 historySize;
|
|
+ UInt32 fixedHashSize;
|
|
+ UInt32 hashSizeSum;
|
|
+ SRes result;
|
|
+ UInt32 crc[256];
|
|
+ size_t numRefs;
|
|
+
|
|
+ UInt64 expectedDataSize;
|
|
+} CMatchFinder;
|
|
+
|
|
+#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((const Byte *)(p)->buffer)
|
|
+
|
|
+#define Inline_MatchFinder_GetNumAvailableBytes(p) ((UInt32)((p)->streamPos - (p)->pos))
|
|
+
|
|
+/*
|
|
+#define Inline_MatchFinder_IsFinishedOK(p) \
|
|
+ ((p)->streamEndWasReached \
|
|
+ && (p)->streamPos == (p)->pos \
|
|
+ && (!(p)->directInput || (p)->directInputRem == 0))
|
|
+*/
|
|
+
|
|
+int MatchFinder_NeedMove(CMatchFinder *p);
|
|
+/* Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); */
|
|
+void MatchFinder_MoveBlock(CMatchFinder *p);
|
|
+void MatchFinder_ReadIfRequired(CMatchFinder *p);
|
|
+
|
|
+void MatchFinder_Construct(CMatchFinder *p);
|
|
+
|
|
+/* Conditions:
|
|
+ historySize <= 3 GB
|
|
+ keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB
|
|
+*/
|
|
+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
|
|
+ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
|
|
+ ISzAllocPtr alloc);
|
|
+void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc);
|
|
+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems);
|
|
+// void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);
|
|
+
|
|
+/*
|
|
+#define Inline_MatchFinder_InitPos(p, val) \
|
|
+ (p)->pos = (val); \
|
|
+ (p)->streamPos = (val);
|
|
+*/
|
|
+
|
|
+#define Inline_MatchFinder_ReduceOffsets(p, subValue) \
|
|
+ (p)->pos -= (subValue); \
|
|
+ (p)->streamPos -= (subValue);
|
|
+
|
|
+
|
|
+UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,
|
|
+ size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
|
|
+ UInt32 *distances, UInt32 maxLen);
|
|
+
|
|
+/*
|
|
+Conditions:
|
|
+ Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func.
|
|
+ Mf_GetPointerToCurrentPos_Func's result must be used only before any other function
|
|
+*/
|
|
+
|
|
+typedef void (*Mf_Init_Func)(void *object);
|
|
+typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object);
|
|
+typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object);
|
|
+typedef UInt32 * (*Mf_GetMatches_Func)(void *object, UInt32 *distances);
|
|
+typedef void (*Mf_Skip_Func)(void *object, UInt32);
|
|
+
|
|
+typedef struct _IMatchFinder
|
|
+{
|
|
+ Mf_Init_Func Init;
|
|
+ Mf_GetNumAvailableBytes_Func GetNumAvailableBytes;
|
|
+ Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos;
|
|
+ Mf_GetMatches_Func GetMatches;
|
|
+ Mf_Skip_Func Skip;
|
|
+} IMatchFinder2;
|
|
+
|
|
+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder2 *vTable);
|
|
+
|
|
+void MatchFinder_Init_LowHash(CMatchFinder *p);
|
|
+void MatchFinder_Init_HighHash(CMatchFinder *p);
|
|
+void MatchFinder_Init_4(CMatchFinder *p);
|
|
+void MatchFinder_Init(CMatchFinder *p);
|
|
+
|
|
+UInt32* Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
|
|
+UInt32* Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
|
|
+
|
|
+void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
|
|
+void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
|
|
+
|
|
+void LzFindPrepare(void);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/LzFindMt.h b/src/lzma-sdk/C/LzFindMt.h
|
|
new file mode 100644
|
|
index 0000000..ee9a1b6
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/LzFindMt.h
|
|
@@ -0,0 +1,109 @@
|
|
+/* LzFindMt.h -- multithreaded Match finder for LZ algorithms
|
|
+2021-07-12 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __LZ_FIND_MT_H
|
|
+#define __LZ_FIND_MT_H
|
|
+
|
|
+#include "LzFind.h"
|
|
+#include "Threads.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+typedef struct _CMtSync
|
|
+{
|
|
+ UInt32 numProcessedBlocks;
|
|
+ CThread thread;
|
|
+ UInt64 affinity;
|
|
+
|
|
+ BoolInt wasCreated;
|
|
+ BoolInt needStart;
|
|
+ BoolInt csWasInitialized;
|
|
+ BoolInt csWasEntered;
|
|
+
|
|
+ BoolInt exit;
|
|
+ BoolInt stopWriting;
|
|
+
|
|
+ CAutoResetEvent canStart;
|
|
+ CAutoResetEvent wasStopped;
|
|
+ CSemaphore freeSemaphore;
|
|
+ CSemaphore filledSemaphore;
|
|
+ CCriticalSection cs;
|
|
+ // UInt32 numBlocks_Sent;
|
|
+} CMtSync;
|
|
+
|
|
+typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances);
|
|
+
|
|
+/* kMtCacheLineDummy must be >= size_of_CPU_cache_line */
|
|
+#define kMtCacheLineDummy 128
|
|
+
|
|
+typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos,
|
|
+ UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc);
|
|
+
|
|
+typedef struct _CMatchFinderMt
|
|
+{
|
|
+ /* LZ */
|
|
+ const Byte *pointerToCurPos;
|
|
+ UInt32 *btBuf;
|
|
+ const UInt32 *btBufPos;
|
|
+ const UInt32 *btBufPosLimit;
|
|
+ UInt32 lzPos;
|
|
+ UInt32 btNumAvailBytes;
|
|
+
|
|
+ UInt32 *hash;
|
|
+ UInt32 fixedHashSize;
|
|
+ // UInt32 hash4Mask;
|
|
+ UInt32 historySize;
|
|
+ const UInt32 *crc;
|
|
+
|
|
+ Mf_Mix_Matches MixMatchesFunc;
|
|
+ UInt32 failure_LZ_BT; // failure in BT transfered to LZ
|
|
+ // UInt32 failure_LZ_LZ; // failure in LZ tables
|
|
+ UInt32 failureBuf[1];
|
|
+ // UInt32 crc[256];
|
|
+
|
|
+ /* LZ + BT */
|
|
+ CMtSync btSync;
|
|
+ Byte btDummy[kMtCacheLineDummy];
|
|
+
|
|
+ /* BT */
|
|
+ UInt32 *hashBuf;
|
|
+ UInt32 hashBufPos;
|
|
+ UInt32 hashBufPosLimit;
|
|
+ UInt32 hashNumAvail;
|
|
+ UInt32 failure_BT;
|
|
+
|
|
+
|
|
+ CLzRef *son;
|
|
+ UInt32 matchMaxLen;
|
|
+ UInt32 numHashBytes;
|
|
+ UInt32 pos;
|
|
+ const Byte *buffer;
|
|
+ UInt32 cyclicBufferPos;
|
|
+ UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */
|
|
+ UInt32 cutValue;
|
|
+
|
|
+ /* BT + Hash */
|
|
+ CMtSync hashSync;
|
|
+ /* Byte hashDummy[kMtCacheLineDummy]; */
|
|
+
|
|
+ /* Hash */
|
|
+ Mf_GetHeads GetHeadsFunc;
|
|
+ CMatchFinder *MatchFinder;
|
|
+ // CMatchFinder MatchFinder;
|
|
+} CMatchFinderMt;
|
|
+
|
|
+// only for Mt part
|
|
+void MatchFinderMt_Construct(CMatchFinderMt *p);
|
|
+void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAllocPtr alloc);
|
|
+
|
|
+SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore,
|
|
+ UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc);
|
|
+void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder2 *vTable);
|
|
+
|
|
+/* call MatchFinderMt_InitMt() before IMatchFinder::Init() */
|
|
+SRes MatchFinderMt_InitMt(CMatchFinderMt *p);
|
|
+void MatchFinderMt_ReleaseStream(CMatchFinderMt *p);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/LzHash.h b/src/lzma-sdk/C/LzHash.h
|
|
new file mode 100644
|
|
index 0000000..a682f83
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/LzHash.h
|
|
@@ -0,0 +1,34 @@
|
|
+/* LzHash.h -- HASH functions for LZ algorithms
|
|
+2019-10-30 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __LZ_HASH_H
|
|
+#define __LZ_HASH_H
|
|
+
|
|
+/*
|
|
+ (kHash2Size >= (1 << 8)) : Required
|
|
+ (kHash3Size >= (1 << 16)) : Required
|
|
+*/
|
|
+
|
|
+#define kHash2Size (1 << 10)
|
|
+#define kHash3Size (1 << 16)
|
|
+// #define kHash4Size (1 << 20)
|
|
+
|
|
+#define kFix3HashSize (kHash2Size)
|
|
+#define kFix4HashSize (kHash2Size + kHash3Size)
|
|
+// #define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size)
|
|
+
|
|
+/*
|
|
+ We use up to 3 crc values for hash:
|
|
+ crc0
|
|
+ crc1 << Shift_1
|
|
+ crc2 << Shift_2
|
|
+ (Shift_1 = 5) and (Shift_2 = 10) is good tradeoff.
|
|
+ Small values for Shift are not good for collision rate.
|
|
+ Big value for Shift_2 increases the minimum size
|
|
+ of hash table, that will be slow for small files.
|
|
+*/
|
|
+
|
|
+#define kLzHash_CrcShift_1 5
|
|
+#define kLzHash_CrcShift_2 10
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Lzma2Dec.h b/src/lzma-sdk/C/Lzma2Dec.h
|
|
new file mode 100644
|
|
index 0000000..da50387
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Lzma2Dec.h
|
|
@@ -0,0 +1,120 @@
|
|
+/* Lzma2Dec.h -- LZMA2 Decoder
|
|
+2018-02-19 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __LZMA2_DEC_H
|
|
+#define __LZMA2_DEC_H
|
|
+
|
|
+#include "LzmaDec.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+/* ---------- State Interface ---------- */
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ unsigned state;
|
|
+ Byte control;
|
|
+ Byte needInitLevel;
|
|
+ Byte isExtraMode;
|
|
+ Byte _pad_;
|
|
+ UInt32 packSize;
|
|
+ UInt32 unpackSize;
|
|
+ CLzmaDec decoder;
|
|
+} CLzma2Dec;
|
|
+
|
|
+#define Lzma2Dec_Construct(p) LzmaDec_Construct(&(p)->decoder)
|
|
+#define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc)
|
|
+#define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc)
|
|
+
|
|
+SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc);
|
|
+SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc);
|
|
+void Lzma2Dec_Init(CLzma2Dec *p);
|
|
+
|
|
+/*
|
|
+finishMode:
|
|
+ It has meaning only if the decoding reaches output limit (*destLen or dicLimit).
|
|
+ LZMA_FINISH_ANY - use smallest number of input bytes
|
|
+ LZMA_FINISH_END - read EndOfStream marker after decoding
|
|
+
|
|
+Returns:
|
|
+ SZ_OK
|
|
+ status:
|
|
+ LZMA_STATUS_FINISHED_WITH_MARK
|
|
+ LZMA_STATUS_NOT_FINISHED
|
|
+ LZMA_STATUS_NEEDS_MORE_INPUT
|
|
+ SZ_ERROR_DATA - Data error
|
|
+*/
|
|
+
|
|
+SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit,
|
|
+ const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
|
|
+
|
|
+SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen,
|
|
+ const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
|
|
+
|
|
+
|
|
+/* ---------- LZMA2 block and chunk parsing ---------- */
|
|
+
|
|
+/*
|
|
+Lzma2Dec_Parse() parses compressed data stream up to next independent block or next chunk data.
|
|
+It can return LZMA_STATUS_* code or LZMA2_PARSE_STATUS_* code:
|
|
+ - LZMA2_PARSE_STATUS_NEW_BLOCK - there is new block, and 1 additional byte (control byte of next block header) was read from input.
|
|
+ - LZMA2_PARSE_STATUS_NEW_CHUNK - there is new chunk, and only lzma2 header of new chunk was read.
|
|
+ CLzma2Dec::unpackSize contains unpack size of that chunk
|
|
+*/
|
|
+
|
|
+typedef enum
|
|
+{
|
|
+/*
|
|
+ LZMA_STATUS_NOT_SPECIFIED // data error
|
|
+ LZMA_STATUS_FINISHED_WITH_MARK
|
|
+ LZMA_STATUS_NOT_FINISHED //
|
|
+ LZMA_STATUS_NEEDS_MORE_INPUT
|
|
+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK // unused
|
|
+*/
|
|
+ LZMA2_PARSE_STATUS_NEW_BLOCK = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + 1,
|
|
+ LZMA2_PARSE_STATUS_NEW_CHUNK
|
|
+} ELzma2ParseStatus;
|
|
+
|
|
+ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p,
|
|
+ SizeT outSize, // output size
|
|
+ const Byte *src, SizeT *srcLen,
|
|
+ int checkFinishBlock // set (checkFinishBlock = 1), if it must read full input data, if decoder.dicPos reaches blockMax position.
|
|
+ );
|
|
+
|
|
+/*
|
|
+LZMA2 parser doesn't decode LZMA chunks, so we must read
|
|
+ full input LZMA chunk to decode some part of LZMA chunk.
|
|
+
|
|
+Lzma2Dec_GetUnpackExtra() returns the value that shows
|
|
+ max possible number of output bytes that can be output by decoder
|
|
+ at current input positon.
|
|
+*/
|
|
+
|
|
+#define Lzma2Dec_GetUnpackExtra(p) ((p)->isExtraMode ? (p)->unpackSize : 0);
|
|
+
|
|
+
|
|
+/* ---------- One Call Interface ---------- */
|
|
+
|
|
+/*
|
|
+finishMode:
|
|
+ It has meaning only if the decoding reaches output limit (*destLen).
|
|
+ LZMA_FINISH_ANY - use smallest number of input bytes
|
|
+ LZMA_FINISH_END - read EndOfStream marker after decoding
|
|
+
|
|
+Returns:
|
|
+ SZ_OK
|
|
+ status:
|
|
+ LZMA_STATUS_FINISHED_WITH_MARK
|
|
+ LZMA_STATUS_NOT_FINISHED
|
|
+ SZ_ERROR_DATA - Data error
|
|
+ SZ_ERROR_MEM - Memory allocation error
|
|
+ SZ_ERROR_UNSUPPORTED - Unsupported properties
|
|
+ SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
|
|
+*/
|
|
+
|
|
+SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
|
|
+ Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAllocPtr alloc);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Lzma2DecMt.h b/src/lzma-sdk/C/Lzma2DecMt.h
|
|
new file mode 100644
|
|
index 0000000..96f89a3
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Lzma2DecMt.h
|
|
@@ -0,0 +1,79 @@
|
|
+/* Lzma2DecMt.h -- LZMA2 Decoder Multi-thread
|
|
+2018-02-17 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __LZMA2_DEC_MT_H
|
|
+#define __LZMA2_DEC_MT_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ size_t inBufSize_ST;
|
|
+ size_t outStep_ST;
|
|
+
|
|
+ #ifndef _7ZIP_ST
|
|
+ unsigned numThreads;
|
|
+ size_t inBufSize_MT;
|
|
+ size_t outBlockMax;
|
|
+ size_t inBlockMax;
|
|
+ #endif
|
|
+} CLzma2DecMtProps;
|
|
+
|
|
+/* init to single-thread mode */
|
|
+void Lzma2DecMtProps_Init(CLzma2DecMtProps *p);
|
|
+
|
|
+
|
|
+/* ---------- CLzma2DecMtHandle Interface ---------- */
|
|
+
|
|
+/* Lzma2DecMt_ * functions can return the following exit codes:
|
|
+SRes:
|
|
+ SZ_OK - OK
|
|
+ SZ_ERROR_MEM - Memory allocation error
|
|
+ SZ_ERROR_PARAM - Incorrect paramater in props
|
|
+ SZ_ERROR_WRITE - ISeqOutStream write callback error
|
|
+ // SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output
|
|
+ SZ_ERROR_PROGRESS - some break from progress callback
|
|
+ SZ_ERROR_THREAD - error in multithreading functions (only for Mt version)
|
|
+*/
|
|
+
|
|
+typedef void * CLzma2DecMtHandle;
|
|
+
|
|
+CLzma2DecMtHandle Lzma2DecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid);
|
|
+void Lzma2DecMt_Destroy(CLzma2DecMtHandle p);
|
|
+
|
|
+SRes Lzma2DecMt_Decode(CLzma2DecMtHandle p,
|
|
+ Byte prop,
|
|
+ const CLzma2DecMtProps *props,
|
|
+ ISeqOutStream *outStream,
|
|
+ const UInt64 *outDataSize, // NULL means undefined
|
|
+ int finishMode, // 0 - partial unpacking is allowed, 1 - if lzma2 stream must be finished
|
|
+ // Byte *outBuf, size_t *outBufSize,
|
|
+ ISeqInStream *inStream,
|
|
+ // const Byte *inData, size_t inDataSize,
|
|
+
|
|
+ // out variables:
|
|
+ UInt64 *inProcessed,
|
|
+ int *isMT, /* out: (*isMT == 0), if single thread decoding was used */
|
|
+
|
|
+ // UInt64 *outProcessed,
|
|
+ ICompressProgress *progress);
|
|
+
|
|
+
|
|
+/* ---------- Read from CLzma2DecMtHandle Interface ---------- */
|
|
+
|
|
+SRes Lzma2DecMt_Init(CLzma2DecMtHandle pp,
|
|
+ Byte prop,
|
|
+ const CLzma2DecMtProps *props,
|
|
+ const UInt64 *outDataSize, int finishMode,
|
|
+ ISeqInStream *inStream);
|
|
+
|
|
+SRes Lzma2DecMt_Read(CLzma2DecMtHandle pp,
|
|
+ Byte *data, size_t *outSize,
|
|
+ UInt64 *inStreamProcessed);
|
|
+
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Lzma2Enc.h b/src/lzma-sdk/C/Lzma2Enc.h
|
|
new file mode 100644
|
|
index 0000000..65f2dd1
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Lzma2Enc.h
|
|
@@ -0,0 +1,55 @@
|
|
+/* Lzma2Enc.h -- LZMA2 Encoder
|
|
+2017-07-27 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __LZMA2_ENC_H
|
|
+#define __LZMA2_ENC_H
|
|
+
|
|
+#include "LzmaEnc.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#define LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO 0
|
|
+#define LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID ((UInt64)(Int64)-1)
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ CLzmaEncProps lzmaProps;
|
|
+ UInt64 blockSize;
|
|
+ int numBlockThreads_Reduced;
|
|
+ int numBlockThreads_Max;
|
|
+ int numTotalThreads;
|
|
+} CLzma2EncProps;
|
|
+
|
|
+void Lzma2EncProps_Init(CLzma2EncProps *p);
|
|
+void Lzma2EncProps_Normalize(CLzma2EncProps *p);
|
|
+
|
|
+/* ---------- CLzmaEnc2Handle Interface ---------- */
|
|
+
|
|
+/* Lzma2Enc_* functions can return the following exit codes:
|
|
+SRes:
|
|
+ SZ_OK - OK
|
|
+ SZ_ERROR_MEM - Memory allocation error
|
|
+ SZ_ERROR_PARAM - Incorrect paramater in props
|
|
+ SZ_ERROR_WRITE - ISeqOutStream write callback error
|
|
+ SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output
|
|
+ SZ_ERROR_PROGRESS - some break from progress callback
|
|
+ SZ_ERROR_THREAD - error in multithreading functions (only for Mt version)
|
|
+*/
|
|
+
|
|
+typedef void * CLzma2EncHandle;
|
|
+
|
|
+CLzma2EncHandle Lzma2Enc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig);
|
|
+void Lzma2Enc_Destroy(CLzma2EncHandle p);
|
|
+SRes Lzma2Enc_SetProps(CLzma2EncHandle p, const CLzma2EncProps *props);
|
|
+void Lzma2Enc_SetDataSize(CLzma2EncHandle p, UInt64 expectedDataSiize);
|
|
+Byte Lzma2Enc_WriteProperties(CLzma2EncHandle p);
|
|
+SRes Lzma2Enc_Encode2(CLzma2EncHandle p,
|
|
+ ISeqOutStream *outStream,
|
|
+ Byte *outBuf, size_t *outBufSize,
|
|
+ ISeqInStream *inStream,
|
|
+ const Byte *inData, size_t inDataSize,
|
|
+ ICompressProgress *progress);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Lzma86.h b/src/lzma-sdk/C/Lzma86.h
|
|
new file mode 100644
|
|
index 0000000..83057e5
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Lzma86.h
|
|
@@ -0,0 +1,111 @@
|
|
+/* Lzma86.h -- LZMA + x86 (BCJ) Filter
|
|
+2013-01-18 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __LZMA86_H
|
|
+#define __LZMA86_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#define LZMA86_SIZE_OFFSET (1 + 5)
|
|
+#define LZMA86_HEADER_SIZE (LZMA86_SIZE_OFFSET + 8)
|
|
+
|
|
+/*
|
|
+It's an example for LZMA + x86 Filter use.
|
|
+You can use .lzma86 extension, if you write that stream to file.
|
|
+.lzma86 header adds one additional byte to standard .lzma header.
|
|
+.lzma86 header (14 bytes):
|
|
+ Offset Size Description
|
|
+ 0 1 = 0 - no filter, pure LZMA
|
|
+ = 1 - x86 filter + LZMA
|
|
+ 1 1 lc, lp and pb in encoded form
|
|
+ 2 4 dictSize (little endian)
|
|
+ 6 8 uncompressed size (little endian)
|
|
+
|
|
+
|
|
+Lzma86_Encode
|
|
+-------------
|
|
+level - compression level: 0 <= level <= 9, the default value for "level" is 5.
|
|
+
|
|
+dictSize - The dictionary size in bytes. The maximum value is
|
|
+ 128 MB = (1 << 27) bytes for 32-bit version
|
|
+ 1 GB = (1 << 30) bytes for 64-bit version
|
|
+ The default value is 16 MB = (1 << 24) bytes, for level = 5.
|
|
+ It's recommended to use the dictionary that is larger than 4 KB and
|
|
+ that can be calculated as (1 << N) or (3 << N) sizes.
|
|
+ For better compression ratio dictSize must be >= inSize.
|
|
+
|
|
+filterMode:
|
|
+ SZ_FILTER_NO - no Filter
|
|
+ SZ_FILTER_YES - x86 Filter
|
|
+ SZ_FILTER_AUTO - it tries both alternatives to select best.
|
|
+ Encoder will use 2 or 3 passes:
|
|
+ 2 passes when FILTER_NO provides better compression.
|
|
+ 3 passes when FILTER_YES provides better compression.
|
|
+
|
|
+Lzma86Encode allocates Data with MyAlloc functions.
|
|
+RAM Requirements for compressing:
|
|
+ RamSize = dictionarySize * 11.5 + 6MB + FilterBlockSize
|
|
+ filterMode FilterBlockSize
|
|
+ SZ_FILTER_NO 0
|
|
+ SZ_FILTER_YES inSize
|
|
+ SZ_FILTER_AUTO inSize
|
|
+
|
|
+
|
|
+Return code:
|
|
+ SZ_OK - OK
|
|
+ SZ_ERROR_MEM - Memory allocation error
|
|
+ SZ_ERROR_PARAM - Incorrect paramater
|
|
+ SZ_ERROR_OUTPUT_EOF - output buffer overflow
|
|
+ SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
|
|
+*/
|
|
+
|
|
+enum ESzFilterMode
|
|
+{
|
|
+ SZ_FILTER_NO,
|
|
+ SZ_FILTER_YES,
|
|
+ SZ_FILTER_AUTO
|
|
+};
|
|
+
|
|
+SRes Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen,
|
|
+ int level, UInt32 dictSize, int filterMode);
|
|
+
|
|
+
|
|
+/*
|
|
+Lzma86_GetUnpackSize:
|
|
+ In:
|
|
+ src - input data
|
|
+ srcLen - input data size
|
|
+ Out:
|
|
+ unpackSize - size of uncompressed stream
|
|
+ Return code:
|
|
+ SZ_OK - OK
|
|
+ SZ_ERROR_INPUT_EOF - Error in headers
|
|
+*/
|
|
+
|
|
+SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize);
|
|
+
|
|
+/*
|
|
+Lzma86_Decode:
|
|
+ In:
|
|
+ dest - output data
|
|
+ destLen - output data size
|
|
+ src - input data
|
|
+ srcLen - input data size
|
|
+ Out:
|
|
+ destLen - processed output size
|
|
+ srcLen - processed input size
|
|
+ Return code:
|
|
+ SZ_OK - OK
|
|
+ SZ_ERROR_DATA - Data error
|
|
+ SZ_ERROR_MEM - Memory allocation error
|
|
+ SZ_ERROR_UNSUPPORTED - unsupported file
|
|
+ SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer
|
|
+*/
|
|
+
|
|
+SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/LzmaDec.h b/src/lzma-sdk/C/LzmaDec.h
|
|
new file mode 100644
|
|
index 0000000..6194b7d
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/LzmaDec.h
|
|
@@ -0,0 +1,236 @@
|
|
+/* LzmaDec.h -- LZMA Decoder
|
|
+2020-03-19 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __LZMA_DEC_H
|
|
+#define __LZMA_DEC_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+/* #define _LZMA_PROB32 */
|
|
+/* _LZMA_PROB32 can increase the speed on some CPUs,
|
|
+ but memory usage for CLzmaDec::probs will be doubled in that case */
|
|
+
|
|
+typedef
|
|
+#ifdef _LZMA_PROB32
|
|
+ UInt32
|
|
+#else
|
|
+ UInt16
|
|
+#endif
|
|
+ CLzmaProb;
|
|
+
|
|
+
|
|
+/* ---------- LZMA Properties ---------- */
|
|
+
|
|
+#define LZMA_PROPS_SIZE 5
|
|
+
|
|
+typedef struct _CLzmaProps
|
|
+{
|
|
+ Byte lc;
|
|
+ Byte lp;
|
|
+ Byte pb;
|
|
+ Byte _pad_;
|
|
+ UInt32 dicSize;
|
|
+} CLzmaProps;
|
|
+
|
|
+/* LzmaProps_Decode - decodes properties
|
|
+Returns:
|
|
+ SZ_OK
|
|
+ SZ_ERROR_UNSUPPORTED - Unsupported properties
|
|
+*/
|
|
+
|
|
+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
|
|
+
|
|
+
|
|
+/* ---------- LZMA Decoder state ---------- */
|
|
+
|
|
+/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.
|
|
+ Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */
|
|
+
|
|
+#define LZMA_REQUIRED_INPUT_MAX 20
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ /* Don't change this structure. ASM code can use it. */
|
|
+ CLzmaProps prop;
|
|
+ CLzmaProb *probs;
|
|
+ CLzmaProb *probs_1664;
|
|
+ Byte *dic;
|
|
+ SizeT dicBufSize;
|
|
+ SizeT dicPos;
|
|
+ const Byte *buf;
|
|
+ UInt32 range;
|
|
+ UInt32 code;
|
|
+ UInt32 processedPos;
|
|
+ UInt32 checkDicSize;
|
|
+ UInt32 reps[4];
|
|
+ UInt32 state;
|
|
+ UInt32 remainLen;
|
|
+
|
|
+ UInt32 numProbs;
|
|
+ unsigned tempBufSize;
|
|
+ Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];
|
|
+} CLzmaDec;
|
|
+
|
|
+#define LzmaDec_Construct(p) { (p)->dic = NULL; (p)->probs = NULL; }
|
|
+
|
|
+void LzmaDec_Init(CLzmaDec *p);
|
|
+
|
|
+/* There are two types of LZMA streams:
|
|
+ - Stream with end mark. That end mark adds about 6 bytes to compressed size.
|
|
+ - Stream without end mark. You must know exact uncompressed size to decompress such stream. */
|
|
+
|
|
+typedef enum
|
|
+{
|
|
+ LZMA_FINISH_ANY, /* finish at any point */
|
|
+ LZMA_FINISH_END /* block must be finished at the end */
|
|
+} ELzmaFinishMode;
|
|
+
|
|
+/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!
|
|
+
|
|
+ You must use LZMA_FINISH_END, when you know that current output buffer
|
|
+ covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.
|
|
+
|
|
+ If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,
|
|
+ and output value of destLen will be less than output buffer size limit.
|
|
+ You can check status result also.
|
|
+
|
|
+ You can use multiple checks to test data integrity after full decompression:
|
|
+ 1) Check Result and "status" variable.
|
|
+ 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
|
|
+ 3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
|
|
+ You must use correct finish mode in that case. */
|
|
+
|
|
+typedef enum
|
|
+{
|
|
+ LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */
|
|
+ LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */
|
|
+ LZMA_STATUS_NOT_FINISHED, /* stream was not finished */
|
|
+ LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */
|
|
+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */
|
|
+} ELzmaStatus;
|
|
+
|
|
+/* ELzmaStatus is used only as output value for function call */
|
|
+
|
|
+
|
|
+/* ---------- Interfaces ---------- */
|
|
+
|
|
+/* There are 3 levels of interfaces:
|
|
+ 1) Dictionary Interface
|
|
+ 2) Buffer Interface
|
|
+ 3) One Call Interface
|
|
+ You can select any of these interfaces, but don't mix functions from different
|
|
+ groups for same object. */
|
|
+
|
|
+
|
|
+/* There are two variants to allocate state for Dictionary Interface:
|
|
+ 1) LzmaDec_Allocate / LzmaDec_Free
|
|
+ 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
|
|
+ You can use variant 2, if you set dictionary buffer manually.
|
|
+ For Buffer Interface you must always use variant 1.
|
|
+
|
|
+LzmaDec_Allocate* can return:
|
|
+ SZ_OK
|
|
+ SZ_ERROR_MEM - Memory allocation error
|
|
+ SZ_ERROR_UNSUPPORTED - Unsupported properties
|
|
+*/
|
|
+
|
|
+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc);
|
|
+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc);
|
|
+
|
|
+SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc);
|
|
+void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc);
|
|
+
|
|
+/* ---------- Dictionary Interface ---------- */
|
|
+
|
|
+/* You can use it, if you want to eliminate the overhead for data copying from
|
|
+ dictionary to some other external buffer.
|
|
+ You must work with CLzmaDec variables directly in this interface.
|
|
+
|
|
+ STEPS:
|
|
+ LzmaDec_Construct()
|
|
+ LzmaDec_Allocate()
|
|
+ for (each new stream)
|
|
+ {
|
|
+ LzmaDec_Init()
|
|
+ while (it needs more decompression)
|
|
+ {
|
|
+ LzmaDec_DecodeToDic()
|
|
+ use data from CLzmaDec::dic and update CLzmaDec::dicPos
|
|
+ }
|
|
+ }
|
|
+ LzmaDec_Free()
|
|
+*/
|
|
+
|
|
+/* LzmaDec_DecodeToDic
|
|
+
|
|
+ The decoding to internal dictionary buffer (CLzmaDec::dic).
|
|
+ You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
|
|
+
|
|
+finishMode:
|
|
+ It has meaning only if the decoding reaches output limit (dicLimit).
|
|
+ LZMA_FINISH_ANY - Decode just dicLimit bytes.
|
|
+ LZMA_FINISH_END - Stream must be finished after dicLimit.
|
|
+
|
|
+Returns:
|
|
+ SZ_OK
|
|
+ status:
|
|
+ LZMA_STATUS_FINISHED_WITH_MARK
|
|
+ LZMA_STATUS_NOT_FINISHED
|
|
+ LZMA_STATUS_NEEDS_MORE_INPUT
|
|
+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
|
|
+ SZ_ERROR_DATA - Data error
|
|
+ SZ_ERROR_FAIL - Some unexpected error: internal error of code, memory corruption or hardware failure
|
|
+*/
|
|
+
|
|
+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
|
|
+ const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
|
|
+
|
|
+
|
|
+/* ---------- Buffer Interface ---------- */
|
|
+
|
|
+/* It's zlib-like interface.
|
|
+ See LzmaDec_DecodeToDic description for information about STEPS and return results,
|
|
+ but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
|
|
+ to work with CLzmaDec variables manually.
|
|
+
|
|
+finishMode:
|
|
+ It has meaning only if the decoding reaches output limit (*destLen).
|
|
+ LZMA_FINISH_ANY - Decode just destLen bytes.
|
|
+ LZMA_FINISH_END - Stream must be finished after (*destLen).
|
|
+*/
|
|
+
|
|
+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
|
|
+ const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
|
|
+
|
|
+
|
|
+/* ---------- One Call Interface ---------- */
|
|
+
|
|
+/* LzmaDecode
|
|
+
|
|
+finishMode:
|
|
+ It has meaning only if the decoding reaches output limit (*destLen).
|
|
+ LZMA_FINISH_ANY - Decode just destLen bytes.
|
|
+ LZMA_FINISH_END - Stream must be finished after (*destLen).
|
|
+
|
|
+Returns:
|
|
+ SZ_OK
|
|
+ status:
|
|
+ LZMA_STATUS_FINISHED_WITH_MARK
|
|
+ LZMA_STATUS_NOT_FINISHED
|
|
+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
|
|
+ SZ_ERROR_DATA - Data error
|
|
+ SZ_ERROR_MEM - Memory allocation error
|
|
+ SZ_ERROR_UNSUPPORTED - Unsupported properties
|
|
+ SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
|
|
+ SZ_ERROR_FAIL - Some unexpected error: internal error of code, memory corruption or hardware failure
|
|
+*/
|
|
+
|
|
+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
|
|
+ const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
|
|
+ ELzmaStatus *status, ISzAllocPtr alloc);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/LzmaEnc.h b/src/lzma-sdk/C/LzmaEnc.h
|
|
new file mode 100644
|
|
index 0000000..26757ba
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/LzmaEnc.h
|
|
@@ -0,0 +1,78 @@
|
|
+/* LzmaEnc.h -- LZMA Encoder
|
|
+2019-10-30 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __LZMA_ENC_H
|
|
+#define __LZMA_ENC_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#define LZMA_PROPS_SIZE 5
|
|
+
|
|
+typedef struct _CLzmaEncProps
|
|
+{
|
|
+ int level; /* 0 <= level <= 9 */
|
|
+ UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version
|
|
+ (1 << 12) <= dictSize <= (3 << 29) for 64-bit version
|
|
+ default = (1 << 24) */
|
|
+ int lc; /* 0 <= lc <= 8, default = 3 */
|
|
+ int lp; /* 0 <= lp <= 4, default = 0 */
|
|
+ int pb; /* 0 <= pb <= 4, default = 2 */
|
|
+ int algo; /* 0 - fast, 1 - normal, default = 1 */
|
|
+ int fb; /* 5 <= fb <= 273, default = 32 */
|
|
+ int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */
|
|
+ int numHashBytes; /* 2, 3 or 4, default = 4 */
|
|
+ UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */
|
|
+ unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */
|
|
+ int numThreads; /* 1 or 2, default = 2 */
|
|
+
|
|
+ UInt64 reduceSize; /* estimated size of data that will be compressed. default = (UInt64)(Int64)-1.
|
|
+ Encoder uses this value to reduce dictionary size */
|
|
+
|
|
+ UInt64 affinity;
|
|
+} CLzmaEncProps;
|
|
+
|
|
+void LzmaEncProps_Init(CLzmaEncProps *p);
|
|
+void LzmaEncProps_Normalize(CLzmaEncProps *p);
|
|
+UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);
|
|
+
|
|
+
|
|
+/* ---------- CLzmaEncHandle Interface ---------- */
|
|
+
|
|
+/* LzmaEnc* functions can return the following exit codes:
|
|
+SRes:
|
|
+ SZ_OK - OK
|
|
+ SZ_ERROR_MEM - Memory allocation error
|
|
+ SZ_ERROR_PARAM - Incorrect paramater in props
|
|
+ SZ_ERROR_WRITE - ISeqOutStream write callback error
|
|
+ SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output
|
|
+ SZ_ERROR_PROGRESS - some break from progress callback
|
|
+ SZ_ERROR_THREAD - error in multithreading functions (only for Mt version)
|
|
+*/
|
|
+
|
|
+typedef void * CLzmaEncHandle;
|
|
+
|
|
+CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc);
|
|
+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig);
|
|
+
|
|
+SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);
|
|
+void LzmaEnc_SetDataSize(CLzmaEncHandle p, UInt64 expectedDataSiize);
|
|
+SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);
|
|
+unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle p);
|
|
+
|
|
+SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,
|
|
+ ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig);
|
|
+SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
|
|
+ int writeEndMark, ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig);
|
|
+
|
|
+
|
|
+/* ---------- One Call Interface ---------- */
|
|
+
|
|
+SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
|
|
+ const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
|
|
+ ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/LzmaLib.h b/src/lzma-sdk/C/LzmaLib.h
|
|
new file mode 100644
|
|
index 0000000..4103e22
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/LzmaLib.h
|
|
@@ -0,0 +1,138 @@
|
|
+/* LzmaLib.h -- LZMA library interface
|
|
+2021-04-03 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __LZMA_LIB_H
|
|
+#define __LZMA_LIB_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#define MY_STDAPI int MY_STD_CALL
|
|
+
|
|
+#define LZMA_PROPS_SIZE 5
|
|
+
|
|
+/*
|
|
+RAM requirements for LZMA:
|
|
+ for compression: (dictSize * 11.5 + 6 MB) + state_size
|
|
+ for decompression: dictSize + state_size
|
|
+ state_size = (4 + (1.5 << (lc + lp))) KB
|
|
+ by default (lc=3, lp=0), state_size = 16 KB.
|
|
+
|
|
+LZMA properties (5 bytes) format
|
|
+ Offset Size Description
|
|
+ 0 1 lc, lp and pb in encoded form.
|
|
+ 1 4 dictSize (little endian).
|
|
+*/
|
|
+
|
|
+/*
|
|
+LzmaCompress
|
|
+------------
|
|
+
|
|
+outPropsSize -
|
|
+ In: the pointer to the size of outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5.
|
|
+ Out: the pointer to the size of written properties in outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5.
|
|
+
|
|
+ LZMA Encoder will use defult values for any parameter, if it is
|
|
+ -1 for any from: level, loc, lp, pb, fb, numThreads
|
|
+ 0 for dictSize
|
|
+
|
|
+level - compression level: 0 <= level <= 9;
|
|
+
|
|
+ level dictSize algo fb
|
|
+ 0: 64 KB 0 32
|
|
+ 1: 256 KB 0 32
|
|
+ 2: 1 MB 0 32
|
|
+ 3: 4 MB 0 32
|
|
+ 4: 16 MB 0 32
|
|
+ 5: 16 MB 1 32
|
|
+ 6: 32 MB 1 32
|
|
+ 7: 32 MB 1 64
|
|
+ 8: 64 MB 1 64
|
|
+ 9: 64 MB 1 64
|
|
+
|
|
+ The default value for "level" is 5.
|
|
+
|
|
+ algo = 0 means fast method
|
|
+ algo = 1 means normal method
|
|
+
|
|
+dictSize - The dictionary size in bytes. The maximum value is
|
|
+ 128 MB = (1 << 27) bytes for 32-bit version
|
|
+ 1 GB = (1 << 30) bytes for 64-bit version
|
|
+ The default value is 16 MB = (1 << 24) bytes.
|
|
+ It's recommended to use the dictionary that is larger than 4 KB and
|
|
+ that can be calculated as (1 << N) or (3 << N) sizes.
|
|
+
|
|
+lc - The number of literal context bits (high bits of previous literal).
|
|
+ It can be in the range from 0 to 8. The default value is 3.
|
|
+ Sometimes lc=4 gives the gain for big files.
|
|
+
|
|
+lp - The number of literal pos bits (low bits of current position for literals).
|
|
+ It can be in the range from 0 to 4. The default value is 0.
|
|
+ The lp switch is intended for periodical data when the period is equal to 2^lp.
|
|
+ For example, for 32-bit (4 bytes) periodical data you can use lp=2. Often it's
|
|
+ better to set lc=0, if you change lp switch.
|
|
+
|
|
+pb - The number of pos bits (low bits of current position).
|
|
+ It can be in the range from 0 to 4. The default value is 2.
|
|
+ The pb switch is intended for periodical data when the period is equal 2^pb.
|
|
+
|
|
+fb - Word size (the number of fast bytes).
|
|
+ It can be in the range from 5 to 273. The default value is 32.
|
|
+ Usually, a big number gives a little bit better compression ratio and
|
|
+ slower compression process.
|
|
+
|
|
+numThreads - The number of thereads. 1 or 2. The default value is 2.
|
|
+ Fast mode (algo = 0) can use only 1 thread.
|
|
+
|
|
+In:
|
|
+ dest - output data buffer
|
|
+ destLen - output data buffer size
|
|
+ src - input data
|
|
+ srcLen - input data size
|
|
+Out:
|
|
+ destLen - processed output size
|
|
+Returns:
|
|
+ SZ_OK - OK
|
|
+ SZ_ERROR_MEM - Memory allocation error
|
|
+ SZ_ERROR_PARAM - Incorrect paramater
|
|
+ SZ_ERROR_OUTPUT_EOF - output buffer overflow
|
|
+ SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
|
|
+*/
|
|
+
|
|
+MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen,
|
|
+ unsigned char *outProps, size_t *outPropsSize, /* *outPropsSize must be = 5 */
|
|
+ int level, /* 0 <= level <= 9, default = 5 */
|
|
+ unsigned dictSize, /* default = (1 << 24) */
|
|
+ int lc, /* 0 <= lc <= 8, default = 3 */
|
|
+ int lp, /* 0 <= lp <= 4, default = 0 */
|
|
+ int pb, /* 0 <= pb <= 4, default = 2 */
|
|
+ int fb, /* 5 <= fb <= 273, default = 32 */
|
|
+ int numThreads /* 1 or 2, default = 2 */
|
|
+ );
|
|
+
|
|
+/*
|
|
+LzmaUncompress
|
|
+--------------
|
|
+In:
|
|
+ dest - output data buffer
|
|
+ destLen - output data buffer size
|
|
+ src - input data
|
|
+ srcLen - input data size
|
|
+Out:
|
|
+ destLen - processed output size
|
|
+ srcLen - processed input size
|
|
+Returns:
|
|
+ SZ_OK - OK
|
|
+ SZ_ERROR_DATA - Data error
|
|
+ SZ_ERROR_MEM - Memory allocation arror
|
|
+ SZ_ERROR_UNSUPPORTED - Unsupported properties
|
|
+ SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer (src)
|
|
+*/
|
|
+
|
|
+MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen,
|
|
+ const unsigned char *props, size_t propsSize);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/MtCoder.h b/src/lzma-sdk/C/MtCoder.h
|
|
new file mode 100644
|
|
index 0000000..603329d
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/MtCoder.h
|
|
@@ -0,0 +1,141 @@
|
|
+/* MtCoder.h -- Multi-thread Coder
|
|
+2018-07-04 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __MT_CODER_H
|
|
+#define __MT_CODER_H
|
|
+
|
|
+#include "MtDec.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+/*
|
|
+ if ( defined MTCODER__USE_WRITE_THREAD) : main thread writes all data blocks to output stream
|
|
+ if (not defined MTCODER__USE_WRITE_THREAD) : any coder thread can write data blocks to output stream
|
|
+*/
|
|
+/* #define MTCODER__USE_WRITE_THREAD */
|
|
+
|
|
+#ifndef _7ZIP_ST
|
|
+ #define MTCODER__GET_NUM_BLOCKS_FROM_THREADS(numThreads) ((numThreads) + (numThreads) / 8 + 1)
|
|
+ #define MTCODER__THREADS_MAX 64
|
|
+ #define MTCODER__BLOCKS_MAX (MTCODER__GET_NUM_BLOCKS_FROM_THREADS(MTCODER__THREADS_MAX) + 3)
|
|
+#else
|
|
+ #define MTCODER__THREADS_MAX 1
|
|
+ #define MTCODER__BLOCKS_MAX 1
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifndef _7ZIP_ST
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ ICompressProgress vt;
|
|
+ CMtProgress *mtProgress;
|
|
+ UInt64 inSize;
|
|
+ UInt64 outSize;
|
|
+} CMtProgressThunk;
|
|
+
|
|
+void MtProgressThunk_CreateVTable(CMtProgressThunk *p);
|
|
+
|
|
+#define MtProgressThunk_Init(p) { (p)->inSize = 0; (p)->outSize = 0; }
|
|
+
|
|
+
|
|
+struct _CMtCoder;
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ struct _CMtCoder *mtCoder;
|
|
+ unsigned index;
|
|
+ int stop;
|
|
+ Byte *inBuf;
|
|
+
|
|
+ CAutoResetEvent startEvent;
|
|
+ CThread thread;
|
|
+} CMtCoderThread;
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ SRes (*Code)(void *p, unsigned coderIndex, unsigned outBufIndex,
|
|
+ const Byte *src, size_t srcSize, int finished);
|
|
+ SRes (*Write)(void *p, unsigned outBufIndex);
|
|
+} IMtCoderCallback2;
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ SRes res;
|
|
+ unsigned bufIndex;
|
|
+ BoolInt finished;
|
|
+} CMtCoderBlock;
|
|
+
|
|
+
|
|
+typedef struct _CMtCoder
|
|
+{
|
|
+ /* input variables */
|
|
+
|
|
+ size_t blockSize; /* size of input block */
|
|
+ unsigned numThreadsMax;
|
|
+ UInt64 expectedDataSize;
|
|
+
|
|
+ ISeqInStream *inStream;
|
|
+ const Byte *inData;
|
|
+ size_t inDataSize;
|
|
+
|
|
+ ICompressProgress *progress;
|
|
+ ISzAllocPtr allocBig;
|
|
+
|
|
+ IMtCoderCallback2 *mtCallback;
|
|
+ void *mtCallbackObject;
|
|
+
|
|
+
|
|
+ /* internal variables */
|
|
+
|
|
+ size_t allocatedBufsSize;
|
|
+
|
|
+ CAutoResetEvent readEvent;
|
|
+ CSemaphore blocksSemaphore;
|
|
+
|
|
+ BoolInt stopReading;
|
|
+ SRes readRes;
|
|
+
|
|
+ #ifdef MTCODER__USE_WRITE_THREAD
|
|
+ CAutoResetEvent writeEvents[MTCODER__BLOCKS_MAX];
|
|
+ #else
|
|
+ CAutoResetEvent finishedEvent;
|
|
+ SRes writeRes;
|
|
+ unsigned writeIndex;
|
|
+ Byte ReadyBlocks[MTCODER__BLOCKS_MAX];
|
|
+ LONG numFinishedThreads;
|
|
+ #endif
|
|
+
|
|
+ unsigned numStartedThreadsLimit;
|
|
+ unsigned numStartedThreads;
|
|
+
|
|
+ unsigned numBlocksMax;
|
|
+ unsigned blockIndex;
|
|
+ UInt64 readProcessed;
|
|
+
|
|
+ CCriticalSection cs;
|
|
+
|
|
+ unsigned freeBlockHead;
|
|
+ unsigned freeBlockList[MTCODER__BLOCKS_MAX];
|
|
+
|
|
+ CMtProgress mtProgress;
|
|
+ CMtCoderBlock blocks[MTCODER__BLOCKS_MAX];
|
|
+ CMtCoderThread threads[MTCODER__THREADS_MAX];
|
|
+} CMtCoder;
|
|
+
|
|
+
|
|
+void MtCoder_Construct(CMtCoder *p);
|
|
+void MtCoder_Destruct(CMtCoder *p);
|
|
+SRes MtCoder_Code(CMtCoder *p);
|
|
+
|
|
+
|
|
+#endif
|
|
+
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/MtDec.h b/src/lzma-sdk/C/MtDec.h
|
|
new file mode 100644
|
|
index 0000000..7a30b6a
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/MtDec.h
|
|
@@ -0,0 +1,202 @@
|
|
+/* MtDec.h -- Multi-thread Decoder
|
|
+2020-03-05 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __MT_DEC_H
|
|
+#define __MT_DEC_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+#ifndef _7ZIP_ST
|
|
+#include "Threads.h"
|
|
+#endif
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#ifndef _7ZIP_ST
|
|
+
|
|
+#ifndef _7ZIP_ST
|
|
+ #define MTDEC__THREADS_MAX 32
|
|
+#else
|
|
+ #define MTDEC__THREADS_MAX 1
|
|
+#endif
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ ICompressProgress *progress;
|
|
+ SRes res;
|
|
+ UInt64 totalInSize;
|
|
+ UInt64 totalOutSize;
|
|
+ CCriticalSection cs;
|
|
+} CMtProgress;
|
|
+
|
|
+void MtProgress_Init(CMtProgress *p, ICompressProgress *progress);
|
|
+SRes MtProgress_Progress_ST(CMtProgress *p);
|
|
+SRes MtProgress_ProgressAdd(CMtProgress *p, UInt64 inSize, UInt64 outSize);
|
|
+SRes MtProgress_GetError(CMtProgress *p);
|
|
+void MtProgress_SetError(CMtProgress *p, SRes res);
|
|
+
|
|
+struct _CMtDec;
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ struct _CMtDec *mtDec;
|
|
+ unsigned index;
|
|
+ void *inBuf;
|
|
+
|
|
+ size_t inDataSize_Start; // size of input data in start block
|
|
+ UInt64 inDataSize; // total size of input data in all blocks
|
|
+
|
|
+ CThread thread;
|
|
+ CAutoResetEvent canRead;
|
|
+ CAutoResetEvent canWrite;
|
|
+ void *allocaPtr;
|
|
+} CMtDecThread;
|
|
+
|
|
+void MtDecThread_FreeInBufs(CMtDecThread *t);
|
|
+
|
|
+
|
|
+typedef enum
|
|
+{
|
|
+ MTDEC_PARSE_CONTINUE, // continue this block with more input data
|
|
+ MTDEC_PARSE_OVERFLOW, // MT buffers overflow, need switch to single-thread
|
|
+ MTDEC_PARSE_NEW, // new block
|
|
+ MTDEC_PARSE_END // end of block threading. But we still can return to threading after Write(&needContinue)
|
|
+} EMtDecParseState;
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ // in
|
|
+ int startCall;
|
|
+ const Byte *src;
|
|
+ size_t srcSize;
|
|
+ // in : (srcSize == 0) is allowed
|
|
+ // out : it's allowed to return less that actually was used ?
|
|
+ int srcFinished;
|
|
+
|
|
+ // out
|
|
+ EMtDecParseState state;
|
|
+ BoolInt canCreateNewThread;
|
|
+ UInt64 outPos; // check it (size_t)
|
|
+} CMtDecCallbackInfo;
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ void (*Parse)(void *p, unsigned coderIndex, CMtDecCallbackInfo *ci);
|
|
+
|
|
+ // PreCode() and Code():
|
|
+ // (SRes_return_result != SZ_OK) means stop decoding, no need another blocks
|
|
+ SRes (*PreCode)(void *p, unsigned coderIndex);
|
|
+ SRes (*Code)(void *p, unsigned coderIndex,
|
|
+ const Byte *src, size_t srcSize, int srcFinished,
|
|
+ UInt64 *inCodePos, UInt64 *outCodePos, int *stop);
|
|
+ // stop - means stop another Code calls
|
|
+
|
|
+
|
|
+ /* Write() must be called, if Parse() was called
|
|
+ set (needWrite) if
|
|
+ {
|
|
+ && (was not interrupted by progress)
|
|
+ && (was not interrupted in previous block)
|
|
+ }
|
|
+
|
|
+ out:
|
|
+ if (*needContinue), decoder still need to continue decoding with new iteration,
|
|
+ even after MTDEC_PARSE_END
|
|
+ if (*canRecode), we didn't flush current block data, so we still can decode current block later.
|
|
+ */
|
|
+ SRes (*Write)(void *p, unsigned coderIndex,
|
|
+ BoolInt needWriteToStream,
|
|
+ const Byte *src, size_t srcSize, BoolInt isCross,
|
|
+ // int srcFinished,
|
|
+ BoolInt *needContinue,
|
|
+ BoolInt *canRecode);
|
|
+
|
|
+} IMtDecCallback2;
|
|
+
|
|
+
|
|
+
|
|
+typedef struct _CMtDec
|
|
+{
|
|
+ /* input variables */
|
|
+
|
|
+ size_t inBufSize; /* size of input block */
|
|
+ unsigned numThreadsMax;
|
|
+ // size_t inBlockMax;
|
|
+ unsigned numThreadsMax_2;
|
|
+
|
|
+ ISeqInStream *inStream;
|
|
+ // const Byte *inData;
|
|
+ // size_t inDataSize;
|
|
+
|
|
+ ICompressProgress *progress;
|
|
+ ISzAllocPtr alloc;
|
|
+
|
|
+ IMtDecCallback2 *mtCallback;
|
|
+ void *mtCallbackObject;
|
|
+
|
|
+
|
|
+ /* internal variables */
|
|
+
|
|
+ size_t allocatedBufsSize;
|
|
+
|
|
+ BoolInt exitThread;
|
|
+ WRes exitThreadWRes;
|
|
+
|
|
+ UInt64 blockIndex;
|
|
+ BoolInt isAllocError;
|
|
+ BoolInt overflow;
|
|
+ SRes threadingErrorSRes;
|
|
+
|
|
+ BoolInt needContinue;
|
|
+
|
|
+ // CAutoResetEvent finishedEvent;
|
|
+
|
|
+ SRes readRes;
|
|
+ SRes codeRes;
|
|
+
|
|
+ BoolInt wasInterrupted;
|
|
+
|
|
+ unsigned numStartedThreads_Limit;
|
|
+ unsigned numStartedThreads;
|
|
+
|
|
+ Byte *crossBlock;
|
|
+ size_t crossStart;
|
|
+ size_t crossEnd;
|
|
+ UInt64 readProcessed;
|
|
+ BoolInt readWasFinished;
|
|
+ UInt64 inProcessed;
|
|
+
|
|
+ unsigned filledThreadStart;
|
|
+ unsigned numFilledThreads;
|
|
+
|
|
+ #ifndef _7ZIP_ST
|
|
+ BoolInt needInterrupt;
|
|
+ UInt64 interruptIndex;
|
|
+ CMtProgress mtProgress;
|
|
+ CMtDecThread threads[MTDEC__THREADS_MAX];
|
|
+ #endif
|
|
+} CMtDec;
|
|
+
|
|
+
|
|
+void MtDec_Construct(CMtDec *p);
|
|
+void MtDec_Destruct(CMtDec *p);
|
|
+
|
|
+/*
|
|
+MtDec_Code() returns:
|
|
+ SZ_OK - in most cases
|
|
+ MY_SRes_HRESULT_FROM_WRes(WRes_error) - in case of unexpected error in threading function
|
|
+*/
|
|
+
|
|
+SRes MtDec_Code(CMtDec *p);
|
|
+Byte *MtDec_GetCrossBuff(CMtDec *p);
|
|
+
|
|
+int MtDec_PrepareRead(CMtDec *p);
|
|
+const Byte *MtDec_Read(CMtDec *p, size_t *inLim);
|
|
+
|
|
+#endif
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Ppmd.h b/src/lzma-sdk/C/Ppmd.h
|
|
new file mode 100644
|
|
index 0000000..ee93ece
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Ppmd.h
|
|
@@ -0,0 +1,167 @@
|
|
+/* Ppmd.h -- PPMD codec common code
|
|
+2021-04-13 : Igor Pavlov : Public domain
|
|
+This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
|
|
+
|
|
+#ifndef __PPMD_H
|
|
+#define __PPMD_H
|
|
+
|
|
+#include "CpuArch.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#if defined(MY_CPU_SIZEOF_POINTER) && (MY_CPU_SIZEOF_POINTER == 4)
|
|
+/*
|
|
+ PPMD code always uses 32-bit internal fields in PPMD structures to store internal references in main block.
|
|
+ if (PPMD_32BIT is defined), the PPMD code stores internal pointers to 32-bit reference fields.
|
|
+ if (PPMD_32BIT is NOT defined), the PPMD code stores internal UInt32 offsets to reference fields.
|
|
+ if (pointer size is 64-bit), then (PPMD_32BIT) mode is not allowed,
|
|
+ if (pointer size is 32-bit), then (PPMD_32BIT) mode is optional,
|
|
+ and it's allowed to disable PPMD_32BIT mode even if pointer is 32-bit.
|
|
+ PPMD code works slightly faster in (PPMD_32BIT) mode.
|
|
+*/
|
|
+ #define PPMD_32BIT
|
|
+#endif
|
|
+
|
|
+#define PPMD_INT_BITS 7
|
|
+#define PPMD_PERIOD_BITS 7
|
|
+#define PPMD_BIN_SCALE (1 << (PPMD_INT_BITS + PPMD_PERIOD_BITS))
|
|
+
|
|
+#define PPMD_GET_MEAN_SPEC(summ, shift, round) (((summ) + (1 << ((shift) - (round)))) >> (shift))
|
|
+#define PPMD_GET_MEAN(summ) PPMD_GET_MEAN_SPEC((summ), PPMD_PERIOD_BITS, 2)
|
|
+#define PPMD_UPDATE_PROB_0(prob) ((prob) + (1 << PPMD_INT_BITS) - PPMD_GET_MEAN(prob))
|
|
+#define PPMD_UPDATE_PROB_1(prob) ((prob) - PPMD_GET_MEAN(prob))
|
|
+
|
|
+#define PPMD_N1 4
|
|
+#define PPMD_N2 4
|
|
+#define PPMD_N3 4
|
|
+#define PPMD_N4 ((128 + 3 - 1 * PPMD_N1 - 2 * PPMD_N2 - 3 * PPMD_N3) / 4)
|
|
+#define PPMD_NUM_INDEXES (PPMD_N1 + PPMD_N2 + PPMD_N3 + PPMD_N4)
|
|
+
|
|
+MY_CPU_pragma_pack_push_1
|
|
+/* Most compilers works OK here even without #pragma pack(push, 1), but some GCC compilers need it. */
|
|
+
|
|
+/* SEE-contexts for PPM-contexts with masked symbols */
|
|
+typedef struct
|
|
+{
|
|
+ UInt16 Summ; /* Freq */
|
|
+ Byte Shift; /* Speed of Freq change; low Shift is for fast change */
|
|
+ Byte Count; /* Count to next change of Shift */
|
|
+} CPpmd_See;
|
|
+
|
|
+#define Ppmd_See_Update(p) if ((p)->Shift < PPMD_PERIOD_BITS && --(p)->Count == 0) \
|
|
+ { (p)->Summ = (UInt16)((p)->Summ << 1); (p)->Count = (Byte)(3 << (p)->Shift++); }
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ Byte Symbol;
|
|
+ Byte Freq;
|
|
+ UInt16 Successor_0;
|
|
+ UInt16 Successor_1;
|
|
+} CPpmd_State;
|
|
+
|
|
+typedef struct CPpmd_State2_
|
|
+{
|
|
+ Byte Symbol;
|
|
+ Byte Freq;
|
|
+} CPpmd_State2;
|
|
+
|
|
+typedef struct CPpmd_State4_
|
|
+{
|
|
+ UInt16 Successor_0;
|
|
+ UInt16 Successor_1;
|
|
+} CPpmd_State4;
|
|
+
|
|
+MY_CPU_pragma_pop
|
|
+
|
|
+/*
|
|
+ PPMD code can write full CPpmd_State structure data to CPpmd*_Context
|
|
+ at (byte offset = 2) instead of some fields of original CPpmd*_Context structure.
|
|
+
|
|
+ If we use pointers to different types, but that point to shared
|
|
+ memory space, we can have aliasing problem (strict aliasing).
|
|
+
|
|
+ XLC compiler in -O2 mode can change the order of memory write instructions
|
|
+ in relation to read instructions, if we have use pointers to different types.
|
|
+
|
|
+ To solve that aliasing problem we use combined CPpmd*_Context structure
|
|
+ with unions that contain the fields from both structures:
|
|
+ the original CPpmd*_Context and CPpmd_State.
|
|
+ So we can access the fields from both structures via one pointer,
|
|
+ and the compiler doesn't change the order of write instructions
|
|
+ in relation to read instructions.
|
|
+
|
|
+ If we don't use memory write instructions to shared memory in
|
|
+ some local code, and we use only reading instructions (read only),
|
|
+ then probably it's safe to use pointers to different types for reading.
|
|
+*/
|
|
+
|
|
+
|
|
+
|
|
+#ifdef PPMD_32BIT
|
|
+
|
|
+ #define Ppmd_Ref_Type(type) type *
|
|
+ #define Ppmd_GetRef(p, ptr) (ptr)
|
|
+ #define Ppmd_GetPtr(p, ptr) (ptr)
|
|
+ #define Ppmd_GetPtr_Type(p, ptr, note_type) (ptr)
|
|
+
|
|
+#else
|
|
+
|
|
+ #define Ppmd_Ref_Type(type) UInt32
|
|
+ #define Ppmd_GetRef(p, ptr) ((UInt32)((Byte *)(ptr) - (p)->Base))
|
|
+ #define Ppmd_GetPtr(p, offs) ((void *)((p)->Base + (offs)))
|
|
+ #define Ppmd_GetPtr_Type(p, offs, type) ((type *)Ppmd_GetPtr(p, offs))
|
|
+
|
|
+#endif // PPMD_32BIT
|
|
+
|
|
+
|
|
+typedef Ppmd_Ref_Type(CPpmd_State) CPpmd_State_Ref;
|
|
+typedef Ppmd_Ref_Type(void) CPpmd_Void_Ref;
|
|
+typedef Ppmd_Ref_Type(Byte) CPpmd_Byte_Ref;
|
|
+
|
|
+
|
|
+/*
|
|
+#ifdef MY_CPU_LE_UNALIGN
|
|
+// the unaligned 32-bit access latency can be too large, if the data is not in L1 cache.
|
|
+#define Ppmd_GET_SUCCESSOR(p) ((CPpmd_Void_Ref)*(const UInt32 *)(const void *)&(p)->Successor_0)
|
|
+#define Ppmd_SET_SUCCESSOR(p, v) *(UInt32 *)(void *)(void *)&(p)->Successor_0 = (UInt32)(v)
|
|
+
|
|
+#else
|
|
+*/
|
|
+
|
|
+/*
|
|
+ We can write 16-bit halves to 32-bit (Successor) field in any selected order.
|
|
+ But the native order is more consistent way.
|
|
+ So we use the native order, if LE/BE order can be detected here at compile time.
|
|
+*/
|
|
+
|
|
+#ifdef MY_CPU_BE
|
|
+
|
|
+ #define Ppmd_GET_SUCCESSOR(p) \
|
|
+ ( (CPpmd_Void_Ref) (((UInt32)(p)->Successor_0 << 16) | (p)->Successor_1) )
|
|
+
|
|
+ #define Ppmd_SET_SUCCESSOR(p, v) { \
|
|
+ (p)->Successor_0 = (UInt16)(((UInt32)(v) >> 16) /* & 0xFFFF */); \
|
|
+ (p)->Successor_1 = (UInt16)((UInt32)(v) /* & 0xFFFF */); }
|
|
+
|
|
+#else
|
|
+
|
|
+ #define Ppmd_GET_SUCCESSOR(p) \
|
|
+ ( (CPpmd_Void_Ref) ((p)->Successor_0 | ((UInt32)(p)->Successor_1 << 16)) )
|
|
+
|
|
+ #define Ppmd_SET_SUCCESSOR(p, v) { \
|
|
+ (p)->Successor_0 = (UInt16)((UInt32)(v) /* & 0xFFFF */); \
|
|
+ (p)->Successor_1 = (UInt16)(((UInt32)(v) >> 16) /* & 0xFFFF */); }
|
|
+
|
|
+#endif
|
|
+
|
|
+// #endif
|
|
+
|
|
+
|
|
+#define PPMD_SetAllBitsIn256Bytes(p) \
|
|
+ { size_t z; for (z = 0; z < 256 / sizeof(p[0]); z += 8) { \
|
|
+ p[z+7] = p[z+6] = p[z+5] = p[z+4] = p[z+3] = p[z+2] = p[z+1] = p[z+0] = ~(size_t)0; }}
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Ppmd7.h b/src/lzma-sdk/C/Ppmd7.h
|
|
new file mode 100644
|
|
index 0000000..297e35f
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Ppmd7.h
|
|
@@ -0,0 +1,181 @@
|
|
+/* Ppmd7.h -- Ppmd7 (PPMdH) compression codec
|
|
+2021-04-13 : Igor Pavlov : Public domain
|
|
+This code is based on:
|
|
+ PPMd var.H (2001): Dmitry Shkarin : Public domain */
|
|
+
|
|
+
|
|
+#ifndef __PPMD7_H
|
|
+#define __PPMD7_H
|
|
+
|
|
+#include "Ppmd.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#define PPMD7_MIN_ORDER 2
|
|
+#define PPMD7_MAX_ORDER 64
|
|
+
|
|
+#define PPMD7_MIN_MEM_SIZE (1 << 11)
|
|
+#define PPMD7_MAX_MEM_SIZE (0xFFFFFFFF - 12 * 3)
|
|
+
|
|
+struct CPpmd7_Context_;
|
|
+
|
|
+typedef Ppmd_Ref_Type(struct CPpmd7_Context_) CPpmd7_Context_Ref;
|
|
+
|
|
+// MY_CPU_pragma_pack_push_1
|
|
+
|
|
+typedef struct CPpmd7_Context_
|
|
+{
|
|
+ UInt16 NumStats;
|
|
+
|
|
+
|
|
+ union
|
|
+ {
|
|
+ UInt16 SummFreq;
|
|
+ CPpmd_State2 State2;
|
|
+ } Union2;
|
|
+
|
|
+ union
|
|
+ {
|
|
+ CPpmd_State_Ref Stats;
|
|
+ CPpmd_State4 State4;
|
|
+ } Union4;
|
|
+
|
|
+ CPpmd7_Context_Ref Suffix;
|
|
+} CPpmd7_Context;
|
|
+
|
|
+// MY_CPU_pragma_pop
|
|
+
|
|
+#define Ppmd7Context_OneState(p) ((CPpmd_State *)&(p)->Union2)
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ UInt32 Range;
|
|
+ UInt32 Code;
|
|
+ UInt32 Low;
|
|
+ IByteIn *Stream;
|
|
+} CPpmd7_RangeDec;
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ UInt32 Range;
|
|
+ Byte Cache;
|
|
+ // Byte _dummy_[3];
|
|
+ UInt64 Low;
|
|
+ UInt64 CacheSize;
|
|
+ IByteOut *Stream;
|
|
+} CPpmd7z_RangeEnc;
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ CPpmd7_Context *MinContext, *MaxContext;
|
|
+ CPpmd_State *FoundState;
|
|
+ unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder, HiBitsFlag;
|
|
+ Int32 RunLength, InitRL; /* must be 32-bit at least */
|
|
+
|
|
+ UInt32 Size;
|
|
+ UInt32 GlueCount;
|
|
+ UInt32 AlignOffset;
|
|
+ Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart;
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+ union
|
|
+ {
|
|
+ CPpmd7_RangeDec dec;
|
|
+ CPpmd7z_RangeEnc enc;
|
|
+ } rc;
|
|
+
|
|
+ Byte Indx2Units[PPMD_NUM_INDEXES + 2]; // +2 for alignment
|
|
+ Byte Units2Indx[128];
|
|
+ CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES];
|
|
+
|
|
+ Byte NS2BSIndx[256], NS2Indx[256];
|
|
+ Byte ExpEscape[16];
|
|
+ CPpmd_See DummySee, See[25][16];
|
|
+ UInt16 BinSumm[128][64];
|
|
+ // int LastSymbol;
|
|
+} CPpmd7;
|
|
+
|
|
+
|
|
+void Ppmd7_Construct(CPpmd7 *p);
|
|
+BoolInt Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc);
|
|
+void Ppmd7_Free(CPpmd7 *p, ISzAllocPtr alloc);
|
|
+void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder);
|
|
+#define Ppmd7_WasAllocated(p) ((p)->Base != NULL)
|
|
+
|
|
+
|
|
+/* ---------- Internal Functions ---------- */
|
|
+
|
|
+#define Ppmd7_GetPtr(p, ptr) Ppmd_GetPtr(p, ptr)
|
|
+#define Ppmd7_GetContext(p, ptr) Ppmd_GetPtr_Type(p, ptr, CPpmd7_Context)
|
|
+#define Ppmd7_GetStats(p, ctx) Ppmd_GetPtr_Type(p, (ctx)->Union4.Stats, CPpmd_State)
|
|
+
|
|
+void Ppmd7_Update1(CPpmd7 *p);
|
|
+void Ppmd7_Update1_0(CPpmd7 *p);
|
|
+void Ppmd7_Update2(CPpmd7 *p);
|
|
+
|
|
+#define PPMD7_HiBitsFlag_3(sym) ((((unsigned)sym + 0xC0) >> (8 - 3)) & (1 << 3))
|
|
+#define PPMD7_HiBitsFlag_4(sym) ((((unsigned)sym + 0xC0) >> (8 - 4)) & (1 << 4))
|
|
+// #define PPMD7_HiBitsFlag_3(sym) ((sym) < 0x40 ? 0 : (1 << 3))
|
|
+// #define PPMD7_HiBitsFlag_4(sym) ((sym) < 0x40 ? 0 : (1 << 4))
|
|
+
|
|
+#define Ppmd7_GetBinSumm(p) \
|
|
+ &p->BinSumm[(size_t)(unsigned)Ppmd7Context_OneState(p->MinContext)->Freq - 1] \
|
|
+ [ p->PrevSuccess + ((p->RunLength >> 26) & 0x20) \
|
|
+ + p->NS2BSIndx[(size_t)Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] \
|
|
+ + PPMD7_HiBitsFlag_4(Ppmd7Context_OneState(p->MinContext)->Symbol) \
|
|
+ + (p->HiBitsFlag = PPMD7_HiBitsFlag_3(p->FoundState->Symbol)) ]
|
|
+
|
|
+CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale);
|
|
+
|
|
+
|
|
+/*
|
|
+We support two versions of Ppmd7 (PPMdH) methods that use same CPpmd7 structure:
|
|
+ 1) Ppmd7a_*: original PPMdH
|
|
+ 2) Ppmd7z_*: modified PPMdH with 7z Range Coder
|
|
+Ppmd7_*: the structures and functions that are common for both versions of PPMd7 (PPMdH)
|
|
+*/
|
|
+
|
|
+/* ---------- Decode ---------- */
|
|
+
|
|
+#define PPMD7_SYM_END (-1)
|
|
+#define PPMD7_SYM_ERROR (-2)
|
|
+
|
|
+/*
|
|
+You must set (CPpmd7::rc.dec.Stream) before Ppmd7*_RangeDec_Init()
|
|
+
|
|
+Ppmd7*_DecodeSymbol()
|
|
+out:
|
|
+ >= 0 : decoded byte
|
|
+ -1 : PPMD7_SYM_END : End of payload marker
|
|
+ -2 : PPMD7_SYM_ERROR : Data error
|
|
+*/
|
|
+
|
|
+/* Ppmd7a_* : original PPMdH */
|
|
+BoolInt Ppmd7a_RangeDec_Init(CPpmd7_RangeDec *p);
|
|
+#define Ppmd7a_RangeDec_IsFinishedOK(p) ((p)->Code == 0)
|
|
+int Ppmd7a_DecodeSymbol(CPpmd7 *p);
|
|
+
|
|
+/* Ppmd7z_* : modified PPMdH with 7z Range Coder */
|
|
+BoolInt Ppmd7z_RangeDec_Init(CPpmd7_RangeDec *p);
|
|
+#define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0)
|
|
+int Ppmd7z_DecodeSymbol(CPpmd7 *p);
|
|
+// Byte *Ppmd7z_DecodeSymbols(CPpmd7 *p, Byte *buf, const Byte *lim);
|
|
+
|
|
+
|
|
+/* ---------- Encode ---------- */
|
|
+
|
|
+void Ppmd7z_Init_RangeEnc(CPpmd7 *p);
|
|
+void Ppmd7z_Flush_RangeEnc(CPpmd7 *p);
|
|
+// void Ppmd7z_EncodeSymbol(CPpmd7 *p, int symbol);
|
|
+void Ppmd7z_EncodeSymbols(CPpmd7 *p, const Byte *buf, const Byte *lim);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Precomp.h b/src/lzma-sdk/C/Precomp.h
|
|
new file mode 100644
|
|
index 0000000..edb5814
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Precomp.h
|
|
@@ -0,0 +1,10 @@
|
|
+/* Precomp.h -- StdAfx
|
|
+2013-11-12 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_PRECOMP_H
|
|
+#define __7Z_PRECOMP_H
|
|
+
|
|
+#include "Compiler.h"
|
|
+/* #include "7zTypes.h" */
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/RotateDefs.h b/src/lzma-sdk/C/RotateDefs.h
|
|
new file mode 100644
|
|
index 0000000..6c790e7
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/RotateDefs.h
|
|
@@ -0,0 +1,30 @@
|
|
+/* RotateDefs.h -- Rotate functions
|
|
+2015-03-25 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __ROTATE_DEFS_H
|
|
+#define __ROTATE_DEFS_H
|
|
+
|
|
+#ifdef _MSC_VER
|
|
+
|
|
+#include <stdlib.h>
|
|
+
|
|
+/* don't use _rotl with MINGW. It can insert slow call to function. */
|
|
+
|
|
+/* #if (_MSC_VER >= 1200) */
|
|
+#pragma intrinsic(_rotl)
|
|
+#pragma intrinsic(_rotr)
|
|
+/* #endif */
|
|
+
|
|
+#define rotlFixed(x, n) _rotl((x), (n))
|
|
+#define rotrFixed(x, n) _rotr((x), (n))
|
|
+
|
|
+#else
|
|
+
|
|
+/* new compilers can translate these macros to fast commands. */
|
|
+
|
|
+#define rotlFixed(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
|
|
+#define rotrFixed(x, n) (((x) >> (n)) | ((x) << (32 - (n))))
|
|
+
|
|
+#endif
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Sha256.h b/src/lzma-sdk/C/Sha256.h
|
|
new file mode 100644
|
|
index 0000000..f529339
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Sha256.h
|
|
@@ -0,0 +1,76 @@
|
|
+/* Sha256.h -- SHA-256 Hash
|
|
+2021-01-01 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_SHA256_H
|
|
+#define __7Z_SHA256_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#define SHA256_NUM_BLOCK_WORDS 16
|
|
+#define SHA256_NUM_DIGEST_WORDS 8
|
|
+
|
|
+#define SHA256_BLOCK_SIZE (SHA256_NUM_BLOCK_WORDS * 4)
|
|
+#define SHA256_DIGEST_SIZE (SHA256_NUM_DIGEST_WORDS * 4)
|
|
+
|
|
+typedef void (MY_FAST_CALL *SHA256_FUNC_UPDATE_BLOCKS)(UInt32 state[8], const Byte *data, size_t numBlocks);
|
|
+
|
|
+/*
|
|
+ if (the system supports different SHA256 code implementations)
|
|
+ {
|
|
+ (CSha256::func_UpdateBlocks) will be used
|
|
+ (CSha256::func_UpdateBlocks) can be set by
|
|
+ Sha256_Init() - to default (fastest)
|
|
+ Sha256_SetFunction() - to any algo
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ (CSha256::func_UpdateBlocks) is ignored.
|
|
+ }
|
|
+*/
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ SHA256_FUNC_UPDATE_BLOCKS func_UpdateBlocks;
|
|
+ UInt64 count;
|
|
+ UInt64 __pad_2[2];
|
|
+ UInt32 state[SHA256_NUM_DIGEST_WORDS];
|
|
+
|
|
+ Byte buffer[SHA256_BLOCK_SIZE];
|
|
+} CSha256;
|
|
+
|
|
+
|
|
+#define SHA256_ALGO_DEFAULT 0
|
|
+#define SHA256_ALGO_SW 1
|
|
+#define SHA256_ALGO_HW 2
|
|
+
|
|
+/*
|
|
+Sha256_SetFunction()
|
|
+return:
|
|
+ 0 - (algo) value is not supported, and func_UpdateBlocks was not changed
|
|
+ 1 - func_UpdateBlocks was set according (algo) value.
|
|
+*/
|
|
+
|
|
+BoolInt Sha256_SetFunction(CSha256 *p, unsigned algo);
|
|
+
|
|
+void Sha256_InitState(CSha256 *p);
|
|
+void Sha256_Init(CSha256 *p);
|
|
+void Sha256_Update(CSha256 *p, const Byte *data, size_t size);
|
|
+void Sha256_Final(CSha256 *p, Byte *digest);
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+// void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks);
|
|
+
|
|
+/*
|
|
+call Sha256Prepare() once at program start.
|
|
+It prepares all supported implementations, and detects the fastest implementation.
|
|
+*/
|
|
+
|
|
+void Sha256Prepare(void);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Sort.h b/src/lzma-sdk/C/Sort.h
|
|
new file mode 100644
|
|
index 0000000..7209d78
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Sort.h
|
|
@@ -0,0 +1,18 @@
|
|
+/* Sort.h -- Sort functions
|
|
+2014-04-05 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_SORT_H
|
|
+#define __7Z_SORT_H
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+void HeapSort(UInt32 *p, size_t size);
|
|
+void HeapSort64(UInt64 *p, size_t size);
|
|
+
|
|
+/* void HeapSortRef(UInt32 *p, UInt32 *vals, size_t size); */
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Threads.h b/src/lzma-sdk/C/Threads.h
|
|
new file mode 100644
|
|
index 0000000..e9493af
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Threads.h
|
|
@@ -0,0 +1,232 @@
|
|
+/* Threads.h -- multithreading library
|
|
+2021-12-21 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_THREADS_H
|
|
+#define __7Z_THREADS_H
|
|
+
|
|
+#ifdef _WIN32
|
|
+#include <Windows.h>
|
|
+#else
|
|
+
|
|
+#if defined(__linux__)
|
|
+#if !defined(__APPLE__) && !defined(_AIX) && !defined(__ANDROID__)
|
|
+#ifndef _7ZIP_AFFINITY_DISABLE
|
|
+#define _7ZIP_AFFINITY_SUPPORTED
|
|
+// #pragma message(" ==== _7ZIP_AFFINITY_SUPPORTED")
|
|
+// #define _GNU_SOURCE
|
|
+#endif
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+#include <pthread.h>
|
|
+
|
|
+#endif
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#ifdef _WIN32
|
|
+
|
|
+WRes HandlePtr_Close(HANDLE *h);
|
|
+WRes Handle_WaitObject(HANDLE h);
|
|
+
|
|
+typedef HANDLE CThread;
|
|
+
|
|
+#define Thread_Construct(p) { *(p) = NULL; }
|
|
+#define Thread_WasCreated(p) (*(p) != NULL)
|
|
+#define Thread_Close(p) HandlePtr_Close(p)
|
|
+// #define Thread_Wait(p) Handle_WaitObject(*(p))
|
|
+
|
|
+#ifdef UNDER_CE
|
|
+ // if (USE_THREADS_CreateThread is defined), we use _beginthreadex()
|
|
+ // if (USE_THREADS_CreateThread is not definned), we use CreateThread()
|
|
+ #define USE_THREADS_CreateThread
|
|
+#endif
|
|
+
|
|
+typedef
|
|
+ #ifdef USE_THREADS_CreateThread
|
|
+ DWORD
|
|
+ #else
|
|
+ unsigned
|
|
+ #endif
|
|
+ THREAD_FUNC_RET_TYPE;
|
|
+
|
|
+typedef DWORD_PTR CAffinityMask;
|
|
+typedef DWORD_PTR CCpuSet;
|
|
+
|
|
+#define CpuSet_Zero(p) { *(p) = 0; }
|
|
+#define CpuSet_Set(p, cpu) { *(p) |= ((DWORD_PTR)1 << (cpu)); }
|
|
+
|
|
+#else // _WIN32
|
|
+
|
|
+typedef struct _CThread
|
|
+{
|
|
+ pthread_t _tid;
|
|
+ int _created;
|
|
+} CThread;
|
|
+
|
|
+#define Thread_Construct(p) { (p)->_tid = 0; (p)->_created = 0; }
|
|
+#define Thread_WasCreated(p) ((p)->_created != 0)
|
|
+WRes Thread_Close(CThread *p);
|
|
+// #define Thread_Wait Thread_Wait_Close
|
|
+
|
|
+typedef void * THREAD_FUNC_RET_TYPE;
|
|
+
|
|
+typedef UInt64 CAffinityMask;
|
|
+
|
|
+#ifdef _7ZIP_AFFINITY_SUPPORTED
|
|
+
|
|
+typedef cpu_set_t CCpuSet;
|
|
+#define CpuSet_Zero(p) CPU_ZERO(p)
|
|
+#define CpuSet_Set(p, cpu) CPU_SET(cpu, p)
|
|
+#define CpuSet_IsSet(p, cpu) CPU_ISSET(cpu, p)
|
|
+
|
|
+#else
|
|
+
|
|
+typedef UInt64 CCpuSet;
|
|
+#define CpuSet_Zero(p) { *(p) = 0; }
|
|
+#define CpuSet_Set(p, cpu) { *(p) |= ((UInt64)1 << (cpu)); }
|
|
+#define CpuSet_IsSet(p, cpu) ((*(p) & ((UInt64)1 << (cpu))) != 0)
|
|
+
|
|
+#endif
|
|
+
|
|
+
|
|
+#endif // _WIN32
|
|
+
|
|
+
|
|
+#define THREAD_FUNC_CALL_TYPE MY_STD_CALL
|
|
+
|
|
+#if defined(_WIN32) && defined(__GNUC__)
|
|
+/* GCC compiler for x86 32-bit uses the rule:
|
|
+ the stack is 16-byte aligned before CALL instruction for function calling.
|
|
+ But only root function main() contains instructions that
|
|
+ set 16-byte alignment for stack pointer. And another functions
|
|
+ just keep alignment, if it was set in some parent function.
|
|
+
|
|
+ The problem:
|
|
+ if we create new thread in MinGW (GCC) 32-bit x86 via _beginthreadex() or CreateThread(),
|
|
+ the root function of thread doesn't set 16-byte alignment.
|
|
+ And stack frames in all child functions also will be unaligned in that case.
|
|
+
|
|
+ Here we set (force_align_arg_pointer) attribute for root function of new thread.
|
|
+ Do we need (force_align_arg_pointer) also for another systems? */
|
|
+
|
|
+ #define THREAD_FUNC_ATTRIB_ALIGN_ARG __attribute__((force_align_arg_pointer))
|
|
+ // #define THREAD_FUNC_ATTRIB_ALIGN_ARG // for debug : bad alignment in SSE functions
|
|
+#else
|
|
+ #define THREAD_FUNC_ATTRIB_ALIGN_ARG
|
|
+#endif
|
|
+
|
|
+#define THREAD_FUNC_DECL THREAD_FUNC_ATTRIB_ALIGN_ARG THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE
|
|
+
|
|
+typedef THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE * THREAD_FUNC_TYPE)(void *);
|
|
+WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param);
|
|
+WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity);
|
|
+WRes Thread_Wait_Close(CThread *p);
|
|
+
|
|
+#ifdef _WIN32
|
|
+#define Thread_Create_With_CpuSet(p, func, param, cs) \
|
|
+ Thread_Create_With_Affinity(p, func, param, *cs)
|
|
+#else
|
|
+WRes Thread_Create_With_CpuSet(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, const CCpuSet *cpuSet);
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifdef _WIN32
|
|
+
|
|
+typedef HANDLE CEvent;
|
|
+typedef CEvent CAutoResetEvent;
|
|
+typedef CEvent CManualResetEvent;
|
|
+#define Event_Construct(p) *(p) = NULL
|
|
+#define Event_IsCreated(p) (*(p) != NULL)
|
|
+#define Event_Close(p) HandlePtr_Close(p)
|
|
+#define Event_Wait(p) Handle_WaitObject(*(p))
|
|
+WRes Event_Set(CEvent *p);
|
|
+WRes Event_Reset(CEvent *p);
|
|
+WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled);
|
|
+WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p);
|
|
+WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled);
|
|
+WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p);
|
|
+
|
|
+typedef HANDLE CSemaphore;
|
|
+#define Semaphore_Construct(p) *(p) = NULL
|
|
+#define Semaphore_IsCreated(p) (*(p) != NULL)
|
|
+#define Semaphore_Close(p) HandlePtr_Close(p)
|
|
+#define Semaphore_Wait(p) Handle_WaitObject(*(p))
|
|
+WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount);
|
|
+WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount);
|
|
+WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num);
|
|
+WRes Semaphore_Release1(CSemaphore *p);
|
|
+
|
|
+typedef CRITICAL_SECTION CCriticalSection;
|
|
+WRes CriticalSection_Init(CCriticalSection *p);
|
|
+#define CriticalSection_Delete(p) DeleteCriticalSection(p)
|
|
+#define CriticalSection_Enter(p) EnterCriticalSection(p)
|
|
+#define CriticalSection_Leave(p) LeaveCriticalSection(p)
|
|
+
|
|
+
|
|
+#else // _WIN32
|
|
+
|
|
+typedef struct _CEvent
|
|
+{
|
|
+ int _created;
|
|
+ int _manual_reset;
|
|
+ int _state;
|
|
+ pthread_mutex_t _mutex;
|
|
+ pthread_cond_t _cond;
|
|
+} CEvent;
|
|
+
|
|
+typedef CEvent CAutoResetEvent;
|
|
+typedef CEvent CManualResetEvent;
|
|
+
|
|
+#define Event_Construct(p) (p)->_created = 0
|
|
+#define Event_IsCreated(p) ((p)->_created)
|
|
+
|
|
+WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled);
|
|
+WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p);
|
|
+WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled);
|
|
+WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p);
|
|
+WRes Event_Set(CEvent *p);
|
|
+WRes Event_Reset(CEvent *p);
|
|
+WRes Event_Wait(CEvent *p);
|
|
+WRes Event_Close(CEvent *p);
|
|
+
|
|
+
|
|
+typedef struct _CSemaphore
|
|
+{
|
|
+ int _created;
|
|
+ UInt32 _count;
|
|
+ UInt32 _maxCount;
|
|
+ pthread_mutex_t _mutex;
|
|
+ pthread_cond_t _cond;
|
|
+} CSemaphore;
|
|
+
|
|
+#define Semaphore_Construct(p) (p)->_created = 0
|
|
+#define Semaphore_IsCreated(p) ((p)->_created)
|
|
+
|
|
+WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount);
|
|
+WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount);
|
|
+WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num);
|
|
+#define Semaphore_Release1(p) Semaphore_ReleaseN(p, 1)
|
|
+WRes Semaphore_Wait(CSemaphore *p);
|
|
+WRes Semaphore_Close(CSemaphore *p);
|
|
+
|
|
+
|
|
+typedef struct _CCriticalSection
|
|
+{
|
|
+ pthread_mutex_t _mutex;
|
|
+} CCriticalSection;
|
|
+
|
|
+WRes CriticalSection_Init(CCriticalSection *p);
|
|
+void CriticalSection_Delete(CCriticalSection *cs);
|
|
+void CriticalSection_Enter(CCriticalSection *cs);
|
|
+void CriticalSection_Leave(CCriticalSection *cs);
|
|
+
|
|
+LONG InterlockedIncrement(LONG volatile *addend);
|
|
+
|
|
+#endif // _WIN32
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Util/7z/Precomp.h b/src/lzma-sdk/C/Util/7z/Precomp.h
|
|
new file mode 100644
|
|
index 0000000..9f398d0
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Util/7z/Precomp.h
|
|
@@ -0,0 +1,10 @@
|
|
+/* Precomp.h -- StdAfx
|
|
+2013-06-16 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_PRECOMP_H
|
|
+#define __7Z_PRECOMP_H
|
|
+
|
|
+#include "../../Compiler.h"
|
|
+#include "../../7zTypes.h"
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Util/SfxSetup/Precomp.h b/src/lzma-sdk/C/Util/SfxSetup/Precomp.h
|
|
new file mode 100644
|
|
index 0000000..9f398d0
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Util/SfxSetup/Precomp.h
|
|
@@ -0,0 +1,10 @@
|
|
+/* Precomp.h -- StdAfx
|
|
+2013-06-16 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __7Z_PRECOMP_H
|
|
+#define __7Z_PRECOMP_H
|
|
+
|
|
+#include "../../Compiler.h"
|
|
+#include "../../7zTypes.h"
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/Xz.h b/src/lzma-sdk/C/Xz.h
|
|
new file mode 100644
|
|
index 0000000..cf9458e
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/Xz.h
|
|
@@ -0,0 +1,517 @@
|
|
+/* Xz.h - Xz interface
|
|
+2021-04-01 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __XZ_H
|
|
+#define __XZ_H
|
|
+
|
|
+#include "Sha256.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+#define XZ_ID_Subblock 1
|
|
+#define XZ_ID_Delta 3
|
|
+#define XZ_ID_X86 4
|
|
+#define XZ_ID_PPC 5
|
|
+#define XZ_ID_IA64 6
|
|
+#define XZ_ID_ARM 7
|
|
+#define XZ_ID_ARMT 8
|
|
+#define XZ_ID_SPARC 9
|
|
+#define XZ_ID_LZMA2 0x21
|
|
+
|
|
+unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value);
|
|
+unsigned Xz_WriteVarInt(Byte *buf, UInt64 v);
|
|
+
|
|
+/* ---------- xz block ---------- */
|
|
+
|
|
+#define XZ_BLOCK_HEADER_SIZE_MAX 1024
|
|
+
|
|
+#define XZ_NUM_FILTERS_MAX 4
|
|
+#define XZ_BF_NUM_FILTERS_MASK 3
|
|
+#define XZ_BF_PACK_SIZE (1 << 6)
|
|
+#define XZ_BF_UNPACK_SIZE (1 << 7)
|
|
+
|
|
+#define XZ_FILTER_PROPS_SIZE_MAX 20
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ UInt64 id;
|
|
+ UInt32 propsSize;
|
|
+ Byte props[XZ_FILTER_PROPS_SIZE_MAX];
|
|
+} CXzFilter;
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ UInt64 packSize;
|
|
+ UInt64 unpackSize;
|
|
+ Byte flags;
|
|
+ CXzFilter filters[XZ_NUM_FILTERS_MAX];
|
|
+} CXzBlock;
|
|
+
|
|
+#define XzBlock_GetNumFilters(p) (((unsigned)(p)->flags & XZ_BF_NUM_FILTERS_MASK) + 1)
|
|
+#define XzBlock_HasPackSize(p) (((p)->flags & XZ_BF_PACK_SIZE) != 0)
|
|
+#define XzBlock_HasUnpackSize(p) (((p)->flags & XZ_BF_UNPACK_SIZE) != 0)
|
|
+#define XzBlock_HasUnsupportedFlags(p) (((p)->flags & ~(XZ_BF_NUM_FILTERS_MASK | XZ_BF_PACK_SIZE | XZ_BF_UNPACK_SIZE)) != 0)
|
|
+
|
|
+SRes XzBlock_Parse(CXzBlock *p, const Byte *header);
|
|
+SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, BoolInt *isIndex, UInt32 *headerSizeRes);
|
|
+
|
|
+/* ---------- xz stream ---------- */
|
|
+
|
|
+#define XZ_SIG_SIZE 6
|
|
+#define XZ_FOOTER_SIG_SIZE 2
|
|
+
|
|
+extern const Byte XZ_SIG[XZ_SIG_SIZE];
|
|
+
|
|
+/*
|
|
+extern const Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE];
|
|
+*/
|
|
+
|
|
+#define XZ_FOOTER_SIG_0 'Y'
|
|
+#define XZ_FOOTER_SIG_1 'Z'
|
|
+
|
|
+#define XZ_STREAM_FLAGS_SIZE 2
|
|
+#define XZ_STREAM_CRC_SIZE 4
|
|
+
|
|
+#define XZ_STREAM_HEADER_SIZE (XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE + XZ_STREAM_CRC_SIZE)
|
|
+#define XZ_STREAM_FOOTER_SIZE (XZ_FOOTER_SIG_SIZE + XZ_STREAM_FLAGS_SIZE + XZ_STREAM_CRC_SIZE + 4)
|
|
+
|
|
+#define XZ_CHECK_MASK 0xF
|
|
+#define XZ_CHECK_NO 0
|
|
+#define XZ_CHECK_CRC32 1
|
|
+#define XZ_CHECK_CRC64 4
|
|
+#define XZ_CHECK_SHA256 10
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ unsigned mode;
|
|
+ UInt32 crc;
|
|
+ UInt64 crc64;
|
|
+ CSha256 sha;
|
|
+} CXzCheck;
|
|
+
|
|
+void XzCheck_Init(CXzCheck *p, unsigned mode);
|
|
+void XzCheck_Update(CXzCheck *p, const void *data, size_t size);
|
|
+int XzCheck_Final(CXzCheck *p, Byte *digest);
|
|
+
|
|
+typedef UInt16 CXzStreamFlags;
|
|
+
|
|
+#define XzFlags_IsSupported(f) ((f) <= XZ_CHECK_MASK)
|
|
+#define XzFlags_GetCheckType(f) ((f) & XZ_CHECK_MASK)
|
|
+#define XzFlags_HasDataCrc32(f) (Xz_GetCheckType(f) == XZ_CHECK_CRC32)
|
|
+unsigned XzFlags_GetCheckSize(CXzStreamFlags f);
|
|
+
|
|
+SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf);
|
|
+SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream);
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ UInt64 unpackSize;
|
|
+ UInt64 totalSize;
|
|
+} CXzBlockSizes;
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ CXzStreamFlags flags;
|
|
+ size_t numBlocks;
|
|
+ CXzBlockSizes *blocks;
|
|
+ UInt64 startOffset;
|
|
+} CXzStream;
|
|
+
|
|
+void Xz_Construct(CXzStream *p);
|
|
+void Xz_Free(CXzStream *p, ISzAllocPtr alloc);
|
|
+
|
|
+#define XZ_SIZE_OVERFLOW ((UInt64)(Int64)-1)
|
|
+
|
|
+UInt64 Xz_GetUnpackSize(const CXzStream *p);
|
|
+UInt64 Xz_GetPackSize(const CXzStream *p);
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ size_t num;
|
|
+ size_t numAllocated;
|
|
+ CXzStream *streams;
|
|
+} CXzs;
|
|
+
|
|
+void Xzs_Construct(CXzs *p);
|
|
+void Xzs_Free(CXzs *p, ISzAllocPtr alloc);
|
|
+SRes Xzs_ReadBackward(CXzs *p, ILookInStream *inStream, Int64 *startOffset, ICompressProgress *progress, ISzAllocPtr alloc);
|
|
+
|
|
+UInt64 Xzs_GetNumBlocks(const CXzs *p);
|
|
+UInt64 Xzs_GetUnpackSize(const CXzs *p);
|
|
+
|
|
+
|
|
+// ECoderStatus values are identical to ELzmaStatus values of LZMA2 decoder
|
|
+
|
|
+typedef enum
|
|
+{
|
|
+ CODER_STATUS_NOT_SPECIFIED, /* use main error code instead */
|
|
+ CODER_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */
|
|
+ CODER_STATUS_NOT_FINISHED, /* stream was not finished */
|
|
+ CODER_STATUS_NEEDS_MORE_INPUT /* you must provide more input bytes */
|
|
+} ECoderStatus;
|
|
+
|
|
+
|
|
+// ECoderFinishMode values are identical to ELzmaFinishMode
|
|
+
|
|
+typedef enum
|
|
+{
|
|
+ CODER_FINISH_ANY, /* finish at any point */
|
|
+ CODER_FINISH_END /* block must be finished at the end */
|
|
+} ECoderFinishMode;
|
|
+
|
|
+
|
|
+typedef struct _IStateCoder
|
|
+{
|
|
+ void *p;
|
|
+ void (*Free)(void *p, ISzAllocPtr alloc);
|
|
+ SRes (*SetProps)(void *p, const Byte *props, size_t propSize, ISzAllocPtr alloc);
|
|
+ void (*Init)(void *p);
|
|
+ SRes (*Code2)(void *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
|
|
+ int srcWasFinished, ECoderFinishMode finishMode,
|
|
+ // int *wasFinished,
|
|
+ ECoderStatus *status);
|
|
+ SizeT (*Filter)(void *p, Byte *data, SizeT size);
|
|
+} IStateCoder;
|
|
+
|
|
+
|
|
+
|
|
+#define MIXCODER_NUM_FILTERS_MAX 4
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ ISzAllocPtr alloc;
|
|
+ Byte *buf;
|
|
+ unsigned numCoders;
|
|
+
|
|
+ Byte *outBuf;
|
|
+ size_t outBufSize;
|
|
+ size_t outWritten; // is equal to lzmaDecoder.dicPos (in outBuf mode)
|
|
+ BoolInt wasFinished;
|
|
+ SRes res;
|
|
+ ECoderStatus status;
|
|
+ // BoolInt SingleBufMode;
|
|
+
|
|
+ int finished[MIXCODER_NUM_FILTERS_MAX - 1];
|
|
+ size_t pos[MIXCODER_NUM_FILTERS_MAX - 1];
|
|
+ size_t size[MIXCODER_NUM_FILTERS_MAX - 1];
|
|
+ UInt64 ids[MIXCODER_NUM_FILTERS_MAX];
|
|
+ SRes results[MIXCODER_NUM_FILTERS_MAX];
|
|
+ IStateCoder coders[MIXCODER_NUM_FILTERS_MAX];
|
|
+} CMixCoder;
|
|
+
|
|
+
|
|
+typedef enum
|
|
+{
|
|
+ XZ_STATE_STREAM_HEADER,
|
|
+ XZ_STATE_STREAM_INDEX,
|
|
+ XZ_STATE_STREAM_INDEX_CRC,
|
|
+ XZ_STATE_STREAM_FOOTER,
|
|
+ XZ_STATE_STREAM_PADDING,
|
|
+ XZ_STATE_BLOCK_HEADER,
|
|
+ XZ_STATE_BLOCK,
|
|
+ XZ_STATE_BLOCK_FOOTER
|
|
+} EXzState;
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ EXzState state;
|
|
+ UInt32 pos;
|
|
+ unsigned alignPos;
|
|
+ unsigned indexPreSize;
|
|
+
|
|
+ CXzStreamFlags streamFlags;
|
|
+
|
|
+ UInt32 blockHeaderSize;
|
|
+ UInt64 packSize;
|
|
+ UInt64 unpackSize;
|
|
+
|
|
+ UInt64 numBlocks; // number of finished blocks in current stream
|
|
+ UInt64 indexSize;
|
|
+ UInt64 indexPos;
|
|
+ UInt64 padSize;
|
|
+
|
|
+ UInt64 numStartedStreams;
|
|
+ UInt64 numFinishedStreams;
|
|
+ UInt64 numTotalBlocks;
|
|
+
|
|
+ UInt32 crc;
|
|
+ CMixCoder decoder;
|
|
+ CXzBlock block;
|
|
+ CXzCheck check;
|
|
+ CSha256 sha;
|
|
+
|
|
+ BoolInt parseMode;
|
|
+ BoolInt headerParsedOk;
|
|
+ BoolInt decodeToStreamSignature;
|
|
+ unsigned decodeOnlyOneBlock;
|
|
+
|
|
+ Byte *outBuf;
|
|
+ size_t outBufSize;
|
|
+ size_t outDataWritten; // the size of data in (outBuf) that were fully unpacked
|
|
+
|
|
+ Byte shaDigest[SHA256_DIGEST_SIZE];
|
|
+ Byte buf[XZ_BLOCK_HEADER_SIZE_MAX];
|
|
+} CXzUnpacker;
|
|
+
|
|
+/* alloc : aligned for cache line allocation is better */
|
|
+void XzUnpacker_Construct(CXzUnpacker *p, ISzAllocPtr alloc);
|
|
+void XzUnpacker_Init(CXzUnpacker *p);
|
|
+void XzUnpacker_SetOutBuf(CXzUnpacker *p, Byte *outBuf, size_t outBufSize);
|
|
+void XzUnpacker_Free(CXzUnpacker *p);
|
|
+
|
|
+/*
|
|
+ XzUnpacker
|
|
+ The sequence for decoding functions:
|
|
+ {
|
|
+ XzUnpacker_Construct()
|
|
+ [Decoding_Calls]
|
|
+ XzUnpacker_Free()
|
|
+ }
|
|
+
|
|
+ [Decoding_Calls]
|
|
+
|
|
+ There are 3 types of interfaces for [Decoding_Calls] calls:
|
|
+
|
|
+ Interface-1 : Partial output buffers:
|
|
+ {
|
|
+ XzUnpacker_Init()
|
|
+ for()
|
|
+ {
|
|
+ XzUnpacker_Code();
|
|
+ }
|
|
+ XzUnpacker_IsStreamWasFinished()
|
|
+ }
|
|
+
|
|
+ Interface-2 : Direct output buffer:
|
|
+ Use it, if you know exact size of decoded data, and you need
|
|
+ whole xz unpacked data in one output buffer.
|
|
+ xz unpacker doesn't allocate additional buffer for lzma2 dictionary in that mode.
|
|
+ {
|
|
+ XzUnpacker_Init()
|
|
+ XzUnpacker_SetOutBufMode(); // to set output buffer and size
|
|
+ for()
|
|
+ {
|
|
+ XzUnpacker_Code(); // (dest = NULL) in XzUnpacker_Code()
|
|
+ }
|
|
+ XzUnpacker_IsStreamWasFinished()
|
|
+ }
|
|
+
|
|
+ Interface-3 : Direct output buffer : One call full decoding
|
|
+ It unpacks whole input buffer to output buffer in one call.
|
|
+ It uses Interface-2 internally.
|
|
+ {
|
|
+ XzUnpacker_CodeFull()
|
|
+ XzUnpacker_IsStreamWasFinished()
|
|
+ }
|
|
+*/
|
|
+
|
|
+/*
|
|
+finishMode:
|
|
+ It has meaning only if the decoding reaches output limit (*destLen).
|
|
+ CODER_FINISH_ANY - use smallest number of input bytes
|
|
+ CODER_FINISH_END - read EndOfStream marker after decoding
|
|
+
|
|
+Returns:
|
|
+ SZ_OK
|
|
+ status:
|
|
+ CODER_STATUS_NOT_FINISHED,
|
|
+ CODER_STATUS_NEEDS_MORE_INPUT - the decoder can return it in two cases:
|
|
+ 1) it needs more input data to finish current xz stream
|
|
+ 2) xz stream was finished successfully. But the decoder supports multiple
|
|
+ concatented xz streams. So it expects more input data for new xz streams.
|
|
+ Call XzUnpacker_IsStreamWasFinished() to check that latest xz stream was finished successfully.
|
|
+
|
|
+ SZ_ERROR_MEM - Memory allocation error
|
|
+ SZ_ERROR_DATA - Data error
|
|
+ SZ_ERROR_UNSUPPORTED - Unsupported method or method properties
|
|
+ SZ_ERROR_CRC - CRC error
|
|
+ // SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
|
|
+
|
|
+ SZ_ERROR_NO_ARCHIVE - the error with xz Stream Header with one of the following reasons:
|
|
+ - xz Stream Signature failure
|
|
+ - CRC32 of xz Stream Header is failed
|
|
+ - The size of Stream padding is not multiple of four bytes.
|
|
+ It's possible to get that error, if xz stream was finished and the stream
|
|
+ contains some another data. In that case you can call XzUnpacker_GetExtraSize()
|
|
+ function to get real size of xz stream.
|
|
+*/
|
|
+
|
|
+
|
|
+SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
|
|
+ const Byte *src, SizeT *srcLen, int srcFinished,
|
|
+ ECoderFinishMode finishMode, ECoderStatus *status);
|
|
+
|
|
+SRes XzUnpacker_CodeFull(CXzUnpacker *p, Byte *dest, SizeT *destLen,
|
|
+ const Byte *src, SizeT *srcLen,
|
|
+ ECoderFinishMode finishMode, ECoderStatus *status);
|
|
+
|
|
+/*
|
|
+If you decode full xz stream(s), then you can call XzUnpacker_IsStreamWasFinished()
|
|
+after successful XzUnpacker_CodeFull() or after last call of XzUnpacker_Code().
|
|
+*/
|
|
+
|
|
+BoolInt XzUnpacker_IsStreamWasFinished(const CXzUnpacker *p);
|
|
+
|
|
+/*
|
|
+XzUnpacker_GetExtraSize() returns then number of unconfirmed bytes,
|
|
+ if it's in (XZ_STATE_STREAM_HEADER) state or in (XZ_STATE_STREAM_PADDING) state.
|
|
+These bytes can be some data after xz archive, or
|
|
+it can be start of new xz stream.
|
|
+
|
|
+Call XzUnpacker_GetExtraSize() after XzUnpacker_Code() function to detect real size of
|
|
+xz stream in two cases, if XzUnpacker_Code() returns:
|
|
+ res == SZ_OK && status == CODER_STATUS_NEEDS_MORE_INPUT
|
|
+ res == SZ_ERROR_NO_ARCHIVE
|
|
+*/
|
|
+
|
|
+UInt64 XzUnpacker_GetExtraSize(const CXzUnpacker *p);
|
|
+
|
|
+
|
|
+/*
|
|
+ for random block decoding:
|
|
+ XzUnpacker_Init();
|
|
+ set CXzUnpacker::streamFlags
|
|
+ XzUnpacker_PrepareToRandomBlockDecoding()
|
|
+ loop
|
|
+ {
|
|
+ XzUnpacker_Code()
|
|
+ XzUnpacker_IsBlockFinished()
|
|
+ }
|
|
+*/
|
|
+
|
|
+void XzUnpacker_PrepareToRandomBlockDecoding(CXzUnpacker *p);
|
|
+BoolInt XzUnpacker_IsBlockFinished(const CXzUnpacker *p);
|
|
+
|
|
+#define XzUnpacker_GetPackSizeForIndex(p) ((p)->packSize + (p)->blockHeaderSize + XzFlags_GetCheckSize((p)->streamFlags))
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+/* ---- Single-Thread and Multi-Thread xz Decoding with Input/Output Streams ---- */
|
|
+
|
|
+/*
|
|
+ if (CXzDecMtProps::numThreads > 1), the decoder can try to use
|
|
+ Multi-Threading. The decoder analyses xz block header, and if
|
|
+ there are pack size and unpack size values stored in xz block header,
|
|
+ the decoder reads compressed data of block to internal buffers,
|
|
+ and then it can start parallel decoding, if there are another blocks.
|
|
+ The decoder can switch back to Single-Thread decoding after some conditions.
|
|
+
|
|
+ The sequence of calls for xz decoding with in/out Streams:
|
|
+ {
|
|
+ XzDecMt_Create()
|
|
+ XzDecMtProps_Init(XzDecMtProps) to set default values of properties
|
|
+ // then you can change some XzDecMtProps parameters with required values
|
|
+ // here you can set the number of threads and (memUseMax) - the maximum
|
|
+ Memory usage for multithreading decoding.
|
|
+ for()
|
|
+ {
|
|
+ XzDecMt_Decode() // one call per one file
|
|
+ }
|
|
+ XzDecMt_Destroy()
|
|
+ }
|
|
+*/
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ size_t inBufSize_ST; // size of input buffer for Single-Thread decoding
|
|
+ size_t outStep_ST; // size of output buffer for Single-Thread decoding
|
|
+ BoolInt ignoreErrors; // if set to 1, the decoder can ignore some errors and it skips broken parts of data.
|
|
+
|
|
+ #ifndef _7ZIP_ST
|
|
+ unsigned numThreads; // the number of threads for Multi-Thread decoding. if (umThreads == 1) it will use Single-thread decoding
|
|
+ size_t inBufSize_MT; // size of small input data buffers for Multi-Thread decoding. Big number of such small buffers can be created
|
|
+ size_t memUseMax; // the limit of total memory usage for Multi-Thread decoding.
|
|
+ // it's recommended to set (memUseMax) manually to value that is smaller of total size of RAM in computer.
|
|
+ #endif
|
|
+} CXzDecMtProps;
|
|
+
|
|
+void XzDecMtProps_Init(CXzDecMtProps *p);
|
|
+
|
|
+
|
|
+typedef void * CXzDecMtHandle;
|
|
+
|
|
+/*
|
|
+ alloc : XzDecMt uses CAlignOffsetAlloc internally for addresses allocated by (alloc).
|
|
+ allocMid : for big allocations, aligned allocation is better
|
|
+*/
|
|
+
|
|
+CXzDecMtHandle XzDecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid);
|
|
+void XzDecMt_Destroy(CXzDecMtHandle p);
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ Byte UnpackSize_Defined;
|
|
+ Byte NumStreams_Defined;
|
|
+ Byte NumBlocks_Defined;
|
|
+
|
|
+ Byte DataAfterEnd; // there are some additional data after good xz streams, and that data is not new xz stream.
|
|
+ Byte DecodingTruncated; // Decoding was Truncated, we need only partial output data
|
|
+
|
|
+ UInt64 InSize; // pack size processed. That value doesn't include the data after
|
|
+ // end of xz stream, if that data was not correct
|
|
+ UInt64 OutSize;
|
|
+
|
|
+ UInt64 NumStreams;
|
|
+ UInt64 NumBlocks;
|
|
+
|
|
+ SRes DecodeRes; // the error code of xz streams data decoding
|
|
+ SRes ReadRes; // error code from ISeqInStream:Read()
|
|
+ SRes ProgressRes; // error code from ICompressProgress:Progress()
|
|
+
|
|
+ SRes CombinedRes; // Combined result error code that shows main rusult
|
|
+ // = S_OK, if there is no error.
|
|
+ // but check also (DataAfterEnd) that can show additional minor errors.
|
|
+
|
|
+ SRes CombinedRes_Type; // = SZ_ERROR_READ, if error from ISeqInStream
|
|
+ // = SZ_ERROR_PROGRESS, if error from ICompressProgress
|
|
+ // = SZ_ERROR_WRITE, if error from ISeqOutStream
|
|
+ // = SZ_ERROR_* codes for decoding
|
|
+} CXzStatInfo;
|
|
+
|
|
+void XzStatInfo_Clear(CXzStatInfo *p);
|
|
+
|
|
+/*
|
|
+
|
|
+XzDecMt_Decode()
|
|
+SRes: it's combined decoding result. It also is equal to stat->CombinedRes.
|
|
+
|
|
+ SZ_OK - no error
|
|
+ check also output value in (stat->DataAfterEnd)
|
|
+ that can show additional possible error
|
|
+
|
|
+ SZ_ERROR_MEM - Memory allocation error
|
|
+ SZ_ERROR_NO_ARCHIVE - is not xz archive
|
|
+ SZ_ERROR_ARCHIVE - Headers error
|
|
+ SZ_ERROR_DATA - Data Error
|
|
+ SZ_ERROR_UNSUPPORTED - Unsupported method or method properties
|
|
+ SZ_ERROR_CRC - CRC Error
|
|
+ SZ_ERROR_INPUT_EOF - it needs more input data
|
|
+ SZ_ERROR_WRITE - ISeqOutStream error
|
|
+ (SZ_ERROR_READ) - ISeqInStream errors
|
|
+ (SZ_ERROR_PROGRESS) - ICompressProgress errors
|
|
+ // SZ_ERROR_THREAD - error in multi-threading functions
|
|
+ MY_SRes_HRESULT_FROM_WRes(WRes_error) - error in multi-threading function
|
|
+*/
|
|
+
|
|
+SRes XzDecMt_Decode(CXzDecMtHandle p,
|
|
+ const CXzDecMtProps *props,
|
|
+ const UInt64 *outDataSize, // NULL means undefined
|
|
+ int finishMode, // 0 - partial unpacking is allowed, 1 - xz stream(s) must be finished
|
|
+ ISeqOutStream *outStream,
|
|
+ // Byte *outBuf, size_t *outBufSize,
|
|
+ ISeqInStream *inStream,
|
|
+ // const Byte *inData, size_t inDataSize,
|
|
+ CXzStatInfo *stat, // out: decoding results and statistics
|
|
+ int *isMT, // out: 0 means that ST (Single-Thread) version was used
|
|
+ // 1 means that MT (Multi-Thread) version was used
|
|
+ ICompressProgress *progress);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/XzCrc64.h b/src/lzma-sdk/C/XzCrc64.h
|
|
new file mode 100644
|
|
index 0000000..71b10d5
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/XzCrc64.h
|
|
@@ -0,0 +1,26 @@
|
|
+/* XzCrc64.h -- CRC64 calculation
|
|
+2013-01-18 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __XZ_CRC64_H
|
|
+#define __XZ_CRC64_H
|
|
+
|
|
+#include <stddef.h>
|
|
+
|
|
+#include "7zTypes.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+extern UInt64 g_Crc64Table[];
|
|
+
|
|
+void MY_FAST_CALL Crc64GenerateTable(void);
|
|
+
|
|
+#define CRC64_INIT_VAL UINT64_CONST(0xFFFFFFFFFFFFFFFF)
|
|
+#define CRC64_GET_DIGEST(crc) ((crc) ^ CRC64_INIT_VAL)
|
|
+#define CRC64_UPDATE_BYTE(crc, b) (g_Crc64Table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))
|
|
+
|
|
+UInt64 MY_FAST_CALL Crc64Update(UInt64 crc, const void *data, size_t size);
|
|
+UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/lzma-sdk/C/XzEnc.h b/src/lzma-sdk/C/XzEnc.h
|
|
new file mode 100644
|
|
index 0000000..529ac3f
|
|
--- /dev/null
|
|
+++ b/src/lzma-sdk/C/XzEnc.h
|
|
@@ -0,0 +1,60 @@
|
|
+/* XzEnc.h -- Xz Encode
|
|
+2017-06-27 : Igor Pavlov : Public domain */
|
|
+
|
|
+#ifndef __XZ_ENC_H
|
|
+#define __XZ_ENC_H
|
|
+
|
|
+#include "Lzma2Enc.h"
|
|
+
|
|
+#include "Xz.h"
|
|
+
|
|
+EXTERN_C_BEGIN
|
|
+
|
|
+
|
|
+#define XZ_PROPS__BLOCK_SIZE__AUTO LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO
|
|
+#define XZ_PROPS__BLOCK_SIZE__SOLID LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ UInt32 id;
|
|
+ UInt32 delta;
|
|
+ UInt32 ip;
|
|
+ int ipDefined;
|
|
+} CXzFilterProps;
|
|
+
|
|
+void XzFilterProps_Init(CXzFilterProps *p);
|
|
+
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ CLzma2EncProps lzma2Props;
|
|
+ CXzFilterProps filterProps;
|
|
+ unsigned checkId;
|
|
+ UInt64 blockSize;
|
|
+ int numBlockThreads_Reduced;
|
|
+ int numBlockThreads_Max;
|
|
+ int numTotalThreads;
|
|
+ int forceWriteSizesInHeader;
|
|
+ UInt64 reduceSize;
|
|
+} CXzProps;
|
|
+
|
|
+void XzProps_Init(CXzProps *p);
|
|
+
|
|
+
|
|
+typedef void * CXzEncHandle;
|
|
+
|
|
+CXzEncHandle XzEnc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig);
|
|
+void XzEnc_Destroy(CXzEncHandle p);
|
|
+SRes XzEnc_SetProps(CXzEncHandle p, const CXzProps *props);
|
|
+void XzEnc_SetDataSize(CXzEncHandle p, UInt64 expectedDataSiize);
|
|
+SRes XzEnc_Encode(CXzEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress);
|
|
+
|
|
+SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream,
|
|
+ const CXzProps *props, ICompressProgress *progress);
|
|
+
|
|
+SRes Xz_EncodeEmpty(ISeqOutStream *outStream);
|
|
+
|
|
+EXTERN_C_END
|
|
+
|
|
+#endif
|
|
diff --git a/src/uadk/v1/uacce.h b/src/uadk/v1/uacce.h
|
|
new file mode 100644
|
|
index 0000000..d45062e
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/uacce.h
|
|
@@ -0,0 +1,86 @@
|
|
+/*
|
|
+ * Copyright 2019 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+#ifndef _UAPI_WD_UACCE_H
|
|
+#define _UAPI_WD_UACCE_H
|
|
+
|
|
+#include <linux/types.h>
|
|
+#include <linux/ioctl.h>
|
|
+
|
|
+#define WD_UACCE_CLASS_NAME "uacce"
|
|
+
|
|
+/**
|
|
+ * WD_UACCE Device Attributes:
|
|
+ *
|
|
+ * NOIOMMU: the device has no IOMMU support
|
|
+ * can do ssva, but no map to the dev
|
|
+ * IOMMU: the device has IOMMU support
|
|
+ * PASID: the device has IOMMU which support PASID setting
|
|
+ * can do ssva, mapped to dev per process
|
|
+ * FAULT_FROM_DEV: the device has IOMMU which can do page fault request
|
|
+ * no need for ssva, should be used with PASID
|
|
+ * KMAP_DUS: map the Device user-shared space to kernel
|
|
+ * DRVMAP_DUS: Driver self-maintain its DUS
|
|
+ * SVA: full function device
|
|
+ * SHARE_DOMAIN: no PASID, can do ssva only for one process and the kernel
|
|
+ */
|
|
+#define WD_UACCE_DEV_SVA (1<<0)
|
|
+#define WD_UACCE_DEV_NOIOMMU (1<<1)
|
|
+#define WD_UACCE_DEV_PASID (1<<2)
|
|
+#define WD_UACCE_DEV_IOMMU (1<<7)
|
|
+
|
|
+/* uacce mode of the driver */
|
|
+#define WD_UACCE_MODE_NOWD_UACCE 0 /* don't use uacce */
|
|
+#define WD_UACCE_MODE_NOIOMMU 2 /* use uacce noiommu mode */
|
|
+
|
|
+#define WD_UACCE_API_VER_NOIOMMU_SUBFIX "_noiommu"
|
|
+#define WD_UACCE_QFR_NA ((unsigned long)-1)
|
|
+
|
|
+/**
|
|
+ * enum uacce_qfrt: queue file region type
|
|
+ * @WD_UACCE_QFRT_MMIO: device mmio region
|
|
+ * @WD_UACCE_QFRT_DUS: device user share region
|
|
+ * @WD_UACCE_QFRT_SS: static share memory(no-sva)
|
|
+ */
|
|
+enum uacce_qfrt {
|
|
+ WD_UACCE_QFRT_MMIO = 0, /* device mmio region */
|
|
+ WD_UACCE_QFRT_DUS, /* device user share */
|
|
+ WD_UACCE_QFRT_SS, /* static share memory */
|
|
+ WD_UACCE_QFRT_MAX,
|
|
+};
|
|
+
|
|
+#define WD_UACCE_QFRT_INVALID WD_UACCE_QFRT_MAX
|
|
+
|
|
+/* Pass DMA SS region slice size by granularity 64KB */
|
|
+#define WD_UACCE_GRAN_SIZE 0x10000ull
|
|
+#define WD_UACCE_GRAN_SHIFT 16
|
|
+#define WD_UACCE_GRAN_NUM_MASK 0xfffull
|
|
+
|
|
+/*
|
|
+ * WD_UACCE_CMD_START_Q: Start queue
|
|
+ */
|
|
+#define WD_UACCE_CMD_START_Q _IO('W', 0)
|
|
+
|
|
+/*
|
|
+ * WD_UACCE_CMD_PUT_Q:
|
|
+ * User actively stop queue and free queue resource immediately
|
|
+ * Optimization method since close fd may delay
|
|
+ */
|
|
+#define WD_UACCE_CMD_PUT_Q _IO('W', 1)
|
|
+#define WD_UACCE_CMD_SHARE_SVAS _IO('W', 2)
|
|
+#define WD_UACCE_CMD_GET_SS_DMA _IOR('W', 3, unsigned long)
|
|
+
|
|
+#endif
|
|
diff --git a/src/uadk/v1/wd.h b/src/uadk/v1/wd.h
|
|
new file mode 100644
|
|
index 0000000..1bd9669
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd.h
|
|
@@ -0,0 +1,214 @@
|
|
+/*
|
|
+ * Copyright 2018-2019 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+#ifndef __WD_H
|
|
+#define __WD_H
|
|
+
|
|
+#include <stdlib.h>
|
|
+#include <errno.h>
|
|
+#include <stdio.h>
|
|
+#include <string.h>
|
|
+#include <sys/types.h>
|
|
+#include <stdbool.h>
|
|
+#include <sys/stat.h>
|
|
+#include <fcntl.h>
|
|
+#include <stdint.h>
|
|
+#include <unistd.h>
|
|
+#include <assert.h>
|
|
+#include "uacce.h"
|
|
+
|
|
+#ifdef __cplusplus
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+#define SYS_VAL_SIZE 16
|
|
+#define PATH_STR_SIZE 256
|
|
+#define MAX_ATTR_STR_SIZE 256
|
|
+#define WD_NAME_SIZE 64
|
|
+#define WCRYPTO_MAX_BURST_NUM 16
|
|
+
|
|
+/* WD error code */
|
|
+#define WD_SUCCESS 0
|
|
+#define WD_STREAM_END 1
|
|
+#define WD_STREAM_START 2
|
|
+#define WD_EIO EIO
|
|
+#define WD_EAGAIN EAGAIN
|
|
+#define WD_ENOMEM ENOMEM
|
|
+#define WD_EACCESS EACCESS
|
|
+#define WD_EBUSY EBUSY
|
|
+#define WD_ENODEV ENODEV
|
|
+#define WD_EINVAL EINVAL
|
|
+#define WD_ETIMEDOUT ETIMEDOUT
|
|
+#define WD_ADDR_ERR 61
|
|
+#define WD_HW_EACCESS 62
|
|
+#define WD_SGL_ERR 63
|
|
+#define WD_VERIFY_ERR 64
|
|
+#define WD_OUT_EPARA 66
|
|
+#define WD_IN_EPARA 67
|
|
+#define WD_ENOPROC 68
|
|
+
|
|
+typedef void (*wcrypto_cb)(const void *msg, void *tag);
|
|
+
|
|
+typedef void (*wd_log)(const char *format, ...);
|
|
+
|
|
+struct wcrypto_cb_tag {
|
|
+ void *ctx; /* user: context or other user relatives */
|
|
+ void *tag; /* to store user tag */
|
|
+ int ctx_id; /* user id: context ID or other user identifier */
|
|
+};
|
|
+
|
|
+struct wcrypto_paras {
|
|
+ /*
|
|
+ * 0--encipher/compress .etc, 1 ---decipher/decomp .etc
|
|
+ * it not been used for HiSilicon SEC currently.
|
|
+ */
|
|
+ __u8 direction;
|
|
+ __u8 is_poll;
|
|
+
|
|
+ /* to be extended */
|
|
+};
|
|
+
|
|
+enum wd_buff_type {
|
|
+ WD_FLAT_BUF,
|
|
+ WD_SGL_BUF,
|
|
+};
|
|
+
|
|
+/* memory APIs for Algorithm Layer */
|
|
+typedef void *(*wd_alloc)(void *usr, size_t size);
|
|
+typedef void (*wd_free)(void *usr, void *va);
|
|
+
|
|
+ /* memory VA to DMA address map */
|
|
+typedef void *(*wd_map)(void *usr, void *va, size_t sz);
|
|
+typedef void (*wd_unmap)(void *usr, void *va, void *dma, size_t sz);
|
|
+typedef __u32 (*wd_bufsize)(void *usr);
|
|
+
|
|
+/* Memory from user, it is given at ctx creating. */
|
|
+struct wd_mm_br {
|
|
+ wd_alloc alloc; /* Memory allocation */
|
|
+ wd_free free; /* Memory free */
|
|
+ wd_map iova_map; /* get iova from user space VA */
|
|
+
|
|
+ /* destroy the mapping between the PA of VA and iova */
|
|
+ wd_unmap iova_unmap;
|
|
+ void *usr; /* data for the above operations */
|
|
+ wd_bufsize get_bufsize; /* optional */
|
|
+};
|
|
+
|
|
+/* Warpdrive data buffer */
|
|
+struct wd_dtb {
|
|
+ char *data; /* data/buffer start address */
|
|
+ __u32 dsize; /* data size */
|
|
+ __u32 bsize; /* buffer size */
|
|
+};
|
|
+
|
|
+enum wcrypto_type {
|
|
+ WCRYPTO_RSA,
|
|
+ WCRYPTO_DH,
|
|
+ WCRYPTO_CIPHER,
|
|
+ WCRYPTO_DIGEST,
|
|
+ WCRYPTO_COMP,
|
|
+ WCRYPTO_EC,
|
|
+ WCRYPTO_RNG,
|
|
+ WCRYPTO_ECDH,
|
|
+ WCRYPTO_X25519,
|
|
+ WCRYPTO_X448,
|
|
+ WCRYPTO_ECDSA,
|
|
+ WCRYPTO_SM2,
|
|
+ WCRYPTO_AEAD,
|
|
+ WCRYPTO_MAX_ALG
|
|
+};
|
|
+
|
|
+#ifndef true
|
|
+#define true 1
|
|
+#endif
|
|
+
|
|
+#ifndef false
|
|
+#define false 0
|
|
+#endif
|
|
+
|
|
+#ifndef WD_ERR
|
|
+#ifndef WITH_LOG_FILE
|
|
+extern wd_log log_out;
|
|
+
|
|
+#define __WD_FILENAME__ (strrchr(__FILE__, '/') ? \
|
|
+ ((char *)((uintptr_t)strrchr(__FILE__, '/') + 1)) : __FILE__)
|
|
+
|
|
+#define WD_ERR(format, args...) \
|
|
+ (log_out ? log_out("[%s, %d, %s]:"format, \
|
|
+ __WD_FILENAME__, __LINE__, __func__, ##args) : \
|
|
+ fprintf(stderr, format, ##args))
|
|
+#else
|
|
+extern FILE *flog_fd;
|
|
+#define WD_ERR(format, args...) do { \
|
|
+ if (!flog_fd) \
|
|
+ flog_fd = fopen(WITH_LOG_FILE, "a+"); \
|
|
+ if (flog_fd) \
|
|
+ fprintf(flog_fd, format, ##args); \
|
|
+ else \
|
|
+ fprintf(stderr, "log %s not exists!", \
|
|
+ WITH_LOG_FILE); \
|
|
+} while (0)
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+#define WD_CAPA_PRIV_DATA_SIZE 64
|
|
+
|
|
+/* Capabilities */
|
|
+struct wd_capa {
|
|
+ /* Algorithm name */
|
|
+ const char *alg;
|
|
+ /* throughput capability */
|
|
+ int throughput;
|
|
+ /* latency capability */
|
|
+ int latency;
|
|
+ /* other capabilities */
|
|
+ __u32 flags;
|
|
+
|
|
+ /* For algorithm parameters, now it is defined in extending notions */
|
|
+ struct wcrypto_paras priv;
|
|
+};
|
|
+
|
|
+struct wd_queue {
|
|
+ struct wd_capa capa;
|
|
+ /* if denote dev name, get its Q */
|
|
+ char dev_path[PATH_STR_SIZE];
|
|
+ /* if denote dev node mask, get its Q */
|
|
+ unsigned int node_mask;
|
|
+ /* queue private */
|
|
+ void *qinfo;
|
|
+};
|
|
+
|
|
+int wd_request_queue(struct wd_queue *q);
|
|
+void wd_release_queue(struct wd_queue *q);
|
|
+int wd_send(struct wd_queue *q, void *req);
|
|
+int wd_recv(struct wd_queue *q, void **resp);
|
|
+int wd_wait(struct wd_queue *q, __u16 ms);
|
|
+int wd_recv_sync(struct wd_queue *q, void **resp, __u16 ms);
|
|
+void *wd_reserve_memory(struct wd_queue *q, size_t size);
|
|
+int wd_share_reserved_memory(struct wd_queue *q,
|
|
+ struct wd_queue *target_q);
|
|
+int wd_get_available_dev_num(const char *algorithm);
|
|
+int wd_get_node_id(struct wd_queue *q);
|
|
+void *wd_iova_map(struct wd_queue *q, void *va, size_t sz);
|
|
+void wd_iova_unmap(struct wd_queue *q, void *va, void *dma, size_t sz);
|
|
+void *wd_dma_to_va(struct wd_queue *q, void *dma);
|
|
+int wd_register_log(wd_log log);
|
|
+
|
|
+#ifdef __cplusplus
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif
|
|
diff --git a/src/uadk/v1/wd_adapter.h b/src/uadk/v1/wd_adapter.h
|
|
new file mode 100644
|
|
index 0000000..bcceff2
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd_adapter.h
|
|
@@ -0,0 +1,75 @@
|
|
+/*
|
|
+ * Copyright 2018-2019 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+/* the common driver header define the unified interface for wd */
|
|
+#ifndef __WD_ADAPTER_H__
|
|
+#define __WD_ADAPTER_H__
|
|
+
|
|
+#include <stdio.h>
|
|
+#include <string.h>
|
|
+#include <stdlib.h>
|
|
+#include <unistd.h>
|
|
+#include <sys/mman.h>
|
|
+
|
|
+#include "wd.h"
|
|
+#include "wd_sgl.h"
|
|
+
|
|
+/* Use to describe hardware SGL, different hardware has different SGL format */
|
|
+struct hw_sgl_info {
|
|
+ __u32 sgl_sz;
|
|
+ __u32 sgl_align_sz;
|
|
+ __u32 sge_sz;
|
|
+ __u32 sge_align_sz;
|
|
+};
|
|
+
|
|
+struct wd_drv_dio_if {
|
|
+ /* vendor tag which is used to select right vendor driver */
|
|
+ char *hw_type;
|
|
+ /* user space WD queue initialize */
|
|
+ int (*open)(struct wd_queue *q);
|
|
+ /* user space WD queue uninitialize */
|
|
+ void (*close)(struct wd_queue *q);
|
|
+ /* Send WCRYPTO message to WD queue */
|
|
+ int (*send)(struct wd_queue *q, void **req, __u32 num);
|
|
+ /* Receive WCRYPTO message from WD queue */
|
|
+ int (*recv)(struct wd_queue *q, void **req, __u32 num);
|
|
+
|
|
+ /* Get hardware sgl information from WD queue */
|
|
+ int (*get_sgl_info)(struct wd_queue *q, struct hw_sgl_info *info);
|
|
+ /* Initialize hardware sgl from WD queue */
|
|
+ int (*init_sgl)(struct wd_queue *q, void *pool, struct wd_sgl *sgl);
|
|
+ /* Uninitialize hardware sgl from WD queue */
|
|
+ int (*uninit_sgl)(struct wd_queue *q, void *pool, struct wd_sgl *sgl);
|
|
+ /* Merge two hardware sgls to 'dst_sgl' from WD queue */
|
|
+ int (*sgl_merge)(struct wd_queue *q, void *pool,
|
|
+ struct wd_sgl *dst_sgl, struct wd_sgl *src_sgl);
|
|
+};
|
|
+
|
|
+int drv_open(struct wd_queue *q);
|
|
+void drv_close(struct wd_queue *q);
|
|
+int drv_send(struct wd_queue *q, void **req, __u32 num);
|
|
+int drv_recv(struct wd_queue *q, void **req, __u32 num);
|
|
+void drv_flush(struct wd_queue *q);
|
|
+void drv_free_slice(struct wd_queue *q);
|
|
+void *drv_reserve_mem(struct wd_queue *q, size_t size);
|
|
+void drv_unmap_reserve_mem(struct wd_queue *q, void *addr, size_t size);
|
|
+int drv_get_sgl_info(struct wd_queue *q, struct hw_sgl_info *info);
|
|
+int drv_init_sgl(struct wd_queue *q, void *pool, struct wd_sgl *sgl);
|
|
+int drv_uninit_sgl(struct wd_queue *q, void *pool, struct wd_sgl *sgl);
|
|
+int drv_sgl_merge(struct wd_queue *q, void *pool,
|
|
+ struct wd_sgl *dst_sgl, struct wd_sgl *src_sgl);
|
|
+
|
|
+#endif
|
|
diff --git a/src/uadk/v1/wd_aead.h b/src/uadk/v1/wd_aead.h
|
|
new file mode 100644
|
|
index 0000000..ae5697b
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd_aead.h
|
|
@@ -0,0 +1,213 @@
|
|
+/*
|
|
+ * Copyright 2019 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+#ifndef __WD_AEAD_H
|
|
+#define __WD_AEAD_H
|
|
+
|
|
+#include <stdlib.h>
|
|
+#include <errno.h>
|
|
+#include <linux/types.h>
|
|
+#include "wd.h"
|
|
+#include "wd_cipher.h"
|
|
+#include "wd_digest.h"
|
|
+
|
|
+#ifdef __cplusplus
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+enum wcrypto_aead_op_type {
|
|
+ WCRYPTO_CIPHER_ENCRYPTION_DIGEST,
|
|
+ WCRYPTO_CIPHER_DECRYPTION_DIGEST,
|
|
+ WCRYPTO_DIGEST_CIPHER_ENCRYPTION,
|
|
+ WCRYPTO_DIGEST_CIPHER_DECRYPTION,
|
|
+};
|
|
+
|
|
+enum wcrypto_aead_mac_len {
|
|
+ WCRYPTO_CCM_GCM_LEN = 16,
|
|
+ WCRYPTO_SM3_LEN = 32,
|
|
+ WCRYPTO_MD5_LEN = 16,
|
|
+ WCRYPTO_SHA1_LEN = 20,
|
|
+ WCRYPTO_SHA256_LEN = 32,
|
|
+ WCRYPTO_SHA224_LEN = 28,
|
|
+ WCRYPTO_SHA384_LEN = 48,
|
|
+ WCRYPTO_SHA512_LEN = 64,
|
|
+ WCRYPTO_SHA512_224_LEN = 28,
|
|
+ WCRYPTO_SHA512_256_LEN = 32
|
|
+};
|
|
+
|
|
+/**
|
|
+ * different contexts for different users/threads
|
|
+ * @cb: call back functions of user
|
|
+ * @calg: cipher algorithm type; denoted by enum wcrypto_cipher_alg
|
|
+ * @cmode: cipher algorithm mode; denoted by enum wcrypto_cipher_mode
|
|
+ * @dalg: digest algorithm type; denoted by enum wcrypto_digest_alg
|
|
+ * @dmode: digest algorithm mode; denoted by enum wcrypto_digest_mode
|
|
+ * @br: memory from user, it is given at ctx creating
|
|
+ * @data_fmt: denoted by enum wcrypto_buff_type
|
|
+ */
|
|
+struct wcrypto_aead_ctx_setup {
|
|
+ wcrypto_cb cb;
|
|
+ enum wcrypto_cipher_alg calg;
|
|
+ enum wcrypto_cipher_mode cmode;
|
|
+ enum wcrypto_digest_alg dalg;
|
|
+ enum wcrypto_digest_mode dmode;
|
|
+ struct wd_mm_br br;
|
|
+ __u16 data_fmt;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * operational data per I/O operation
|
|
+ * AEAD encryption input: assoc data || plaintext
|
|
+ * AEAD encryption output: assoc data || ciphertext || auth tag
|
|
+ * AEAD decryption input: assoc data || ciphertext || auth tag
|
|
+ * AEAD decryption output: assoc data || plaintext
|
|
+ * @op_type:aead operation type, denoted by enum wcrypto_aead_op_type
|
|
+ * @status:I/O operation return status
|
|
+ * @in: input data address
|
|
+ * @out:output data address
|
|
+ * @iv:initialization verctor data address
|
|
+ * @in_bytes: input data size
|
|
+ * @out_bytes:output data size
|
|
+ * @out_buf_bytes:output buffer size
|
|
+ * @iv_bytes:initialization verctor data size
|
|
+ * @assoc_size: aead associated data size
|
|
+ * @priv:reserved data field segment
|
|
+ */
|
|
+struct wcrypto_aead_op_data {
|
|
+ enum wcrypto_aead_op_type op_type;
|
|
+ int status;
|
|
+ void *in;
|
|
+ void *out;
|
|
+ void *iv;
|
|
+ __u32 in_bytes;
|
|
+ __u32 out_bytes;
|
|
+ __u32 out_buf_bytes;
|
|
+ __u16 iv_bytes;
|
|
+ __u16 assoc_size;
|
|
+ void *priv;
|
|
+};
|
|
+
|
|
+/* AEAD message format of Warpdrive */
|
|
+struct wcrypto_aead_msg {
|
|
+ __u8 alg_type:4; /* Denoted by enum wcrypto_type */
|
|
+ __u8 op_type:4; /* Denoted by enum wcrypto_aead_op_type */
|
|
+ __u8 calg:4; /* Denoted by enum wcrypto_cipher_type */
|
|
+ __u8 cmode:4; /* Denoted by enum wcrypto_cipher_mode */
|
|
+ __u8 dalg:4; /* Denoted by enum wcrypto_digest_type */
|
|
+ __u8 dmode:4; /* Denoted by enum wcrypto_digest_mode */
|
|
+ __u8 data_fmt; /* Data format, denoted by enum wcrypto_buff_type */
|
|
+ __u8 result; /* Operation result, denoted by WD error code */
|
|
+
|
|
+ __u16 ckey_bytes; /* Key bytes */
|
|
+ __u16 akey_bytes; /* Key bytes */
|
|
+ __u16 assoc_bytes; /* Input associated data bytes */
|
|
+ __u16 auth_bytes; /* Output authentication bytes */
|
|
+ __u16 iv_bytes; /* IV bytes */
|
|
+ __u32 in_bytes; /* Input data bytes */
|
|
+ __u32 out_bytes; /* Output data bytes */
|
|
+
|
|
+ __u8 *ckey; /* Input key VA pointer, should be DMA buffer */
|
|
+ __u8 *akey; /* Input authenticate key VA pointer, should be DMA buffer */
|
|
+ __u8 *iv; /* Input IV VA pointer, should be DMA buffer */
|
|
+ __u8 *aiv; /* Input auth IV VA pointer, should be DMA buffer */
|
|
+ __u8 *in; /* Input data VA pointer, should be DMA buffer */
|
|
+ __u8 *out; /* Output data VA pointer, should be DMA buffer */
|
|
+ __u64 usr_data; /* user identifier: struct wcrypto_cb_tag */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * wcrypto_create_aead_ctx() - create a aead context on the wrapdrive queue.
|
|
+ * @q: wrapdrive queue, need requested by user.
|
|
+ * @setup:setup data of user
|
|
+ */
|
|
+void *wcrypto_create_aead_ctx(struct wd_queue *q,
|
|
+ struct wcrypto_aead_ctx_setup *setup);
|
|
+
|
|
+/**
|
|
+ * wcrypto_set_aead_ckey() - set cipher key to aead context.
|
|
+ * @ctx: aead context, created by wcrypto_create_aead_ctx.
|
|
+ * @key: cipher key addr
|
|
+ * @key_len: cipher key length
|
|
+ */
|
|
+int wcrypto_set_aead_ckey(void *ctx, __u8 *key, __u16 key_len);
|
|
+
|
|
+/**
|
|
+ * wcrypto_set_aead_akey() - set authenticate key to aead context.
|
|
+ * @ctx: aead context, created by wcrypto_create_aead_ctx.
|
|
+ * @key: authenticate key addr
|
|
+ * @key_len: authenticate key length
|
|
+ */
|
|
+int wcrypto_set_aead_akey(void *ctx, __u8 *key, __u16 key_len);
|
|
+
|
|
+/**
|
|
+ * wcrypto_aead_setauthsize() - set aead authsize to aead context.
|
|
+ * @ctx: aead context, created by wcrypto_create_aead_ctx.
|
|
+ * @authsize: aead authsize
|
|
+ */
|
|
+int wcrypto_aead_setauthsize(void *ctx, __u16 authsize);
|
|
+
|
|
+/**
|
|
+ * wcrypto_aead_getauthsize() - obtain maximum authentication data size
|
|
+ * @ctx: aead context, created by wcrypto_create_aead_ctx.
|
|
+ * Return: authentication data size / tag size in bytes
|
|
+ */
|
|
+int wcrypto_aead_getauthsize(void *ctx);
|
|
+
|
|
+/**
|
|
+ * wcrypto_aead_getmaxauthsize() - obtain maximum authentication data size
|
|
+ * @ctx: aead context, created by wcrypto_create_aead_ctx.
|
|
+ * Return: max authentication data size
|
|
+ */
|
|
+int wcrypto_aead_get_maxauthsize(void *ctx);
|
|
+
|
|
+/**
|
|
+ * wcrypto_do_aead() - syn/asynchronous aead operation
|
|
+ * @ctx: context of user, created by wcrypto_create_aead_ctx.
|
|
+ * @opdata: operational data
|
|
+ * @tag: asynchronous:user_tag; synchronous:NULL.
|
|
+ */
|
|
+int wcrypto_do_aead(void *ctx, struct wcrypto_aead_op_data *opdata,
|
|
+ void *tag);
|
|
+
|
|
+/**
|
|
+ * wcrypto_burst_aead() - (a)synchronous multiple aead operations
|
|
+ * @a_ctx: context of user, created by wcrypto_create_aead_ctx.
|
|
+ * @opdata: operational data
|
|
+ * @tag: asynchronous:user_tag; synchronous:NULL.
|
|
+ * @num: operations number per calling, maximum number is WCRYPTO_MAX_BURST_NUM.
|
|
+ */
|
|
+int wcrypto_burst_aead(void *a_ctx, struct wcrypto_aead_op_data **opdata,
|
|
+ void **tag, __u32 num);
|
|
+
|
|
+/**
|
|
+ * wcrypto_aead_poll() - poll operation for asynchronous operation
|
|
+ * @q:wrapdrive queue
|
|
+ * @num:how many respondences this poll has to get, 0 means get all finishings
|
|
+ */
|
|
+int wcrypto_aead_poll(struct wd_queue *q, unsigned int num);
|
|
+
|
|
+/**
|
|
+ * wcrypto_del_aead_ctx() - free aead context
|
|
+ * @ctx: the context to be free
|
|
+ */
|
|
+void wcrypto_del_aead_ctx(void *ctx);
|
|
+
|
|
+#ifdef __cplusplus
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif
|
|
+
|
|
diff --git a/src/uadk/v1/wd_bmm.h b/src/uadk/v1/wd_bmm.h
|
|
new file mode 100644
|
|
index 0000000..88a8f9d
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd_bmm.h
|
|
@@ -0,0 +1,50 @@
|
|
+/*
|
|
+ * Copyright 2019 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+#ifndef _WD_BMM_H
|
|
+#define _WD_BMM_H
|
|
+
|
|
+#include <asm/types.h>
|
|
+#include "wd.h"
|
|
+
|
|
+#ifdef __cplusplus
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+/* Memory pool creating parameters */
|
|
+struct wd_blkpool_setup {
|
|
+ __u32 block_size; /* Block buffer size */
|
|
+ __u32 block_num; /* Block buffer number */
|
|
+ __u32 align_size; /* Block buffer starting address align size */
|
|
+ struct wd_mm_br br; /* memory from user if don't use WD memory */
|
|
+};
|
|
+
|
|
+void *wd_blkpool_create(struct wd_queue *q,
|
|
+ struct wd_blkpool_setup *setup);
|
|
+void wd_blkpool_destroy(void *pool);
|
|
+void *wd_alloc_blk(void *pool);
|
|
+void wd_free_blk(void *pool, void *blk);
|
|
+int wd_get_free_blk_num(void *pool, __u32 *free_num);
|
|
+int wd_blk_alloc_failures(void *pool, __u32 *fail_num);
|
|
+void *wd_blk_iova_map(void *pool, void *blk);
|
|
+void wd_blk_iova_unmap(void *pool, void *blk_dma, void *blk);
|
|
+__u32 wd_blksize(void *pool);
|
|
+
|
|
+#ifdef __cplusplus
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif
|
|
diff --git a/src/uadk/v1/wd_cipher.h b/src/uadk/v1/wd_cipher.h
|
|
new file mode 100644
|
|
index 0000000..591a590
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd_cipher.h
|
|
@@ -0,0 +1,166 @@
|
|
+/*
|
|
+ * Copyright 2019 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+#ifndef __WD_CIPHER_H
|
|
+#define __WD_CIPHER_H
|
|
+
|
|
+#include <stdlib.h>
|
|
+#include <errno.h>
|
|
+#include <linux/types.h>
|
|
+#include "wd.h"
|
|
+
|
|
+#ifdef __cplusplus
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+enum wcrypto_cipher_op_type {
|
|
+ WCRYPTO_CIPHER_ENCRYPTION,
|
|
+ WCRYPTO_CIPHER_DECRYPTION,
|
|
+};
|
|
+
|
|
+enum wcrypto_cipher_alg {
|
|
+ WCRYPTO_CIPHER_SM4,
|
|
+ WCRYPTO_CIPHER_AES,
|
|
+ WCRYPTO_CIPHER_DES,
|
|
+ WCRYPTO_CIPHER_3DES,
|
|
+};
|
|
+
|
|
+enum wcrypto_cipher_mode {
|
|
+ WCRYPTO_CIPHER_ECB,
|
|
+ WCRYPTO_CIPHER_CBC,
|
|
+ WCRYPTO_CIPHER_CTR,
|
|
+ WCRYPTO_CIPHER_XTS,
|
|
+ WCRYPTO_CIPHER_OFB,
|
|
+ WCRYPTO_CIPHER_CFB,
|
|
+ WCRYPTO_CIPHER_CCM,
|
|
+ WCRYPTO_CIPHER_GCM,
|
|
+};
|
|
+
|
|
+/**
|
|
+ * different contexts for different users/threads
|
|
+ * @cb: call back functions of user
|
|
+ * @alg: cipher algorithm type; denoted by enum wcrypto_cipher_alg
|
|
+ * @mode:cipher algorithm mode; denoted by enum wcrypto_cipher_mode
|
|
+ * @br: memory from user, it is given at ctx creating
|
|
+ * @data_fmt: data format, denoted by enum wcrypto_buff_type
|
|
+ */
|
|
+struct wcrypto_cipher_ctx_setup {
|
|
+ wcrypto_cb cb;
|
|
+ enum wcrypto_cipher_alg alg;
|
|
+ enum wcrypto_cipher_mode mode;
|
|
+ struct wd_mm_br br;
|
|
+ __u16 data_fmt;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * operational data per I/O operation
|
|
+ * @op_type:cipher operation type, denoted by enum wcrypto_cipher_op_type
|
|
+ * @status:I/O operation return status
|
|
+ * @in: input data address
|
|
+ * @out:output data address
|
|
+ * @iv:initialization verctor data address
|
|
+ * @in_bytes: input data size
|
|
+ * @out_bytes:output data size
|
|
+ * @iv_bytes:initialization verctor data size
|
|
+ * @priv:reserved data field segment
|
|
+ */
|
|
+struct wcrypto_cipher_op_data {
|
|
+ enum wcrypto_cipher_op_type op_type;
|
|
+ int status;
|
|
+ void *in;
|
|
+ void *out;
|
|
+ void *iv;
|
|
+ __u32 in_bytes;
|
|
+ __u32 out_bytes;
|
|
+ __u32 iv_bytes;
|
|
+ void *priv;
|
|
+};
|
|
+
|
|
+/* Cipher message format of Warpdrive */
|
|
+struct wcrypto_cipher_msg {
|
|
+ __u8 alg_type:4; /* Denoted by enum wcrypto_type */
|
|
+ __u8 alg:4; /* Denoted by enum wcrypto_cipher_alg */
|
|
+ __u8 op_type:4; /* Denoted by enum wcrypto_cipher_op_type */
|
|
+ __u8 mode:4; /* Denoted by enum wcrypto_cipher_mode */
|
|
+ __u8 data_fmt; /* Data format, denoted by enum wcrypto_buff_type */
|
|
+ __u8 result; /* Operation result, denoted by WD error code */
|
|
+
|
|
+ __u16 key_bytes; /* Key bytes */
|
|
+ __u16 iv_bytes; /* IV bytes */
|
|
+ __u32 in_bytes; /* Input data bytes */
|
|
+ __u32 out_bytes; /* Output data bytes */
|
|
+
|
|
+ __u8 *key; /* Input key VA pointer, should be DMA buffer */
|
|
+ __u8 *iv; /* Input IV VA pointer, should be DMA buffer */
|
|
+ __u8 *in; /* Input data VA pointer, should be DMA buffer */
|
|
+ __u8 *out; /* Output data VA pointer, should be DMA buffer */
|
|
+ __u64 usr_data; /* user identifier: struct wcrypto_cb_tag */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * wcrypto_create_cipher_ctx() - create a cipher context on the wrapdrive queue.
|
|
+ * @q: wrapdrive queue, need requested by user.
|
|
+ * @setup:setup data of user
|
|
+ */
|
|
+void *wcrypto_create_cipher_ctx(struct wd_queue *q,
|
|
+ struct wcrypto_cipher_ctx_setup *setup);
|
|
+
|
|
+/**
|
|
+ * wcrypto_set_cipher_key() - set cipher key to cipher context.
|
|
+ * @ctx: cipher context, created by wcrypto_create_cipher_ctx.
|
|
+ * @key: cipher key addr
|
|
+ * @key_len: cipher key length
|
|
+ */
|
|
+int wcrypto_set_cipher_key(void *ctx, __u8 *key, __u16 key_len);
|
|
+
|
|
+/**
|
|
+ * wcrypto_do_cipher() - syn/asynchronous cipher operation
|
|
+ * @ctx: context of user, created by wcrypto_create_cipher_ctx.
|
|
+ * @opdata: operational data
|
|
+ * @tag: asynchronous:user_tag; synchronous:NULL.
|
|
+ */
|
|
+int wcrypto_do_cipher(void *ctx, struct wcrypto_cipher_op_data *opdata,
|
|
+ void *tag);
|
|
+
|
|
+/**
|
|
+ * wcrypto_cipher_poll() - poll operation for asynchronous operation
|
|
+ * @q:wrapdrive queue
|
|
+ * @num:how many respondences this poll has to get, 0 means get all finishings
|
|
+ */
|
|
+int wcrypto_cipher_poll(struct wd_queue *q, unsigned int num);
|
|
+
|
|
+/**
|
|
+ * wcrypto_del_cipher_ctx() - free cipher context
|
|
+ * @ctx: the context to be free
|
|
+ */
|
|
+void wcrypto_del_cipher_ctx(void *ctx);
|
|
+
|
|
+/**
|
|
+ * wcrypto_burst_cipher() - (a)synchronous multiple cipher operations
|
|
+ * @ctx: context of user, created by wcrypto_create_cipher_ctx.
|
|
+ * @c_opdata: operational data
|
|
+ * @tag: asynchronous:user_tag; synchronous:NULL.
|
|
+ * @num: operations number per calling, maximum number is WCRYPTO_MAX_BURST_NUM.
|
|
+ */
|
|
+int wcrypto_burst_cipher(void *ctx, struct wcrypto_cipher_op_data **c_opdata,
|
|
+ void **tag, __u32 num);
|
|
+
|
|
+#ifdef __cplusplus
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif
|
|
+
|
|
diff --git a/src/uadk/v1/wd_comp.h b/src/uadk/v1/wd_comp.h
|
|
new file mode 100644
|
|
index 0000000..580b968
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd_comp.h
|
|
@@ -0,0 +1,256 @@
|
|
+/*
|
|
+ * Copyright 2019 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+#ifndef __WCRYPTO_COMP_H
|
|
+#define __WCRYPTO_COMP_H
|
|
+
|
|
+#include <stdlib.h>
|
|
+#include <errno.h>
|
|
+#include "wd.h"
|
|
+
|
|
+#ifdef __cplusplus
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+typedef unsigned char __u8;
|
|
+typedef unsigned int __u32;
|
|
+typedef unsigned long long __u64;
|
|
+
|
|
+#define ZIP_LOG(format, args...) fprintf(stderr, format, ##args)
|
|
+
|
|
+#define MAX_CTX_RSV_SIZE 65536
|
|
+
|
|
+/* now hw not support config */
|
|
+enum wcrypto_comp_level {
|
|
+ WCRYPTO_COMP_L1 = 1, /* Compression level 1 */
|
|
+ WCRYPTO_COMP_L2, /* Compression level 2 */
|
|
+ WCRYPTO_COMP_L3, /* Compression level 3 */
|
|
+ WCRYPTO_COMP_L4, /* Compression level 4 */
|
|
+ WCRYPTO_COMP_L5, /* Compression level 5 */
|
|
+ WCRYPTO_COMP_L6, /* Compression level 6 */
|
|
+ WCRYPTO_COMP_L7, /* Compression level 7 */
|
|
+ WCRYPTO_COMP_L8, /* Compression level 8 */
|
|
+ WCRYPTO_COMP_L9, /* Compression level 9 */
|
|
+};
|
|
+
|
|
+/* now hw not support config */
|
|
+enum wcrypto_comp_win_type {
|
|
+ WCRYPTO_COMP_WS_4K, /* 4k bytes window size */
|
|
+ WCRYPTO_COMP_WS_8K, /* 8k bytes window size */
|
|
+ WCRYPTO_COMP_WS_16K, /* 16k bytes window size */
|
|
+ WCRYPTO_COMP_WS_24K, /* 24k bytes window size */
|
|
+ WCRYPTO_COMP_WS_32K, /* 32k bytes window size */
|
|
+};
|
|
+
|
|
+/* Flush types */
|
|
+enum wcrypto_comp_flush_type {
|
|
+ WCRYPTO_INVALID_FLUSH,
|
|
+
|
|
+ /* output as much data as we can to improve performance */
|
|
+ WCRYPTO_NO_FLUSH,
|
|
+
|
|
+ /* output as bytes aligning or some other conditions satisfied */
|
|
+ WCRYPTO_SYNC_FLUSH,
|
|
+
|
|
+ /* indicates the end of the file/data */
|
|
+ WCRYPTO_FINISH,
|
|
+};
|
|
+
|
|
+enum wcrypto_comp_alg_type {
|
|
+ WCRYPTO_ZLIB,
|
|
+ WCRYPTO_GZIP,
|
|
+ WCRYPTO_RAW_DEFLATE,
|
|
+ WCRYPTO_LZ77_ZSTD,
|
|
+ WCRYPTO_COMP_MAX_ALG,
|
|
+};
|
|
+
|
|
+/* Operational types for COMP */
|
|
+enum wcrypto_comp_optype {
|
|
+ WCRYPTO_DEFLATE,
|
|
+ WCRYPTO_INFLATE,
|
|
+};
|
|
+
|
|
+enum wcrypto_op_result {
|
|
+ WCRYPTO_STATUS_NULL,
|
|
+ WCRYPTO_COMP_END,
|
|
+ WCRYPTO_DECOMP_END,
|
|
+ WCRYPTO_DECOMP_END_NOSPACE,
|
|
+ WCRYPTO_DECOMP_NO_CRC,
|
|
+ WCRYPTO_DECOMP_BLK_NOSTART,
|
|
+ WCRYPTO_SRC_DIF_ERR,
|
|
+ WCRYPTO_DST_DIF_ERR,
|
|
+ WCRYPTO_NEGTIVE_COMP_ERR,
|
|
+};
|
|
+
|
|
+enum wcrypto_comp_state {
|
|
+ WCRYPTO_COMP_STATELESS,
|
|
+ WCRYPTO_COMP_STATEFUL,
|
|
+};
|
|
+
|
|
+enum wcrypto_stream_status {
|
|
+ WCRYPTO_COMP_STREAM_OLD,
|
|
+ WCRYPTO_COMP_STREAM_NEW, /* indicates first packet */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * different contexts for different users/threads
|
|
+ * @cb: call back functions of user
|
|
+ * @alg_type:compressing algorithm type zlib/gzip
|
|
+ * @op_type:operational types deflate/inflate
|
|
+ * @stream_mode:stateless(block)/statefull
|
|
+ * @comp_lv: compressing level;now reserved
|
|
+ * @win_size: window size of algorithm; now reserved
|
|
+ * @data_fmt: buffer format
|
|
+ * @br: memory operations from user
|
|
+ */
|
|
+struct wcrypto_comp_ctx_setup {
|
|
+ wcrypto_cb cb;
|
|
+ __u8 alg_type;
|
|
+ __u8 op_type;
|
|
+ __u8 stream_mode;
|
|
+ __u8 comp_lv;
|
|
+ __u16 win_size;
|
|
+ __u16 data_fmt;
|
|
+ struct wd_mm_br br;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * operational out data when use zstd_lz77 in sgl format
|
|
+ * @literal:literals address when use zstd in sgl format
|
|
+ * @lit_len:avail literals size for hw when use zstd in sgl format,
|
|
+ * and avail literals is always <= (src_len + ZSTD_LIT_RSV_SIZE);
|
|
+ * @sequence:sequence address when use zstd in sgl format
|
|
+ * @seq_len:avail literals size for hw when use zstd in sgl format
|
|
+ */
|
|
+struct wcrypto_zstd_out {
|
|
+ void *literal;
|
|
+ __u32 lit_sz;
|
|
+ void *sequence;
|
|
+ __u32 seq_sz;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * operational data per I/O operation
|
|
+ * @alg_type:compressing algorithm type zlib/gzip
|
|
+ * @flush:input and output, denotes flush type or data status
|
|
+ * @stream_pos: denotes stream start
|
|
+ * @status:task status current time
|
|
+ * @in:input data address
|
|
+ * @out:output data address
|
|
+ * @in_len:input data size
|
|
+ * @avail_out:avail output size for hw
|
|
+ * @consumed:output, denotes how many bytes are consumed this time
|
|
+ * @produced:output, denotes how many bytes are produced this time
|
|
+ * @isize:gzip isize
|
|
+ * @checksum: protocol checksum
|
|
+ * @priv: private field for extend
|
|
+ */
|
|
+struct wcrypto_comp_op_data {
|
|
+ __u8 alg_type;
|
|
+ __u8 flush;
|
|
+ __u8 stream_pos;
|
|
+ __u8 status;
|
|
+ __u8 *in;
|
|
+ __u8 *out;
|
|
+ __u32 in_len;
|
|
+ __u32 avail_out;
|
|
+ __u32 consumed;
|
|
+ __u32 produced;
|
|
+ __u32 isize;
|
|
+ __u32 checksum;
|
|
+ void *priv;
|
|
+};
|
|
+
|
|
+struct wcrypto_comp_msg {
|
|
+ __u8 alg_type; /* Denoted by enum wcrypto_comp_alg_type */
|
|
+ __u8 op_type; /* Denoted by enum wcrypto_comp_op_type */
|
|
+ __u8 flush_type; /* Denoted by enum wcrypto_comp_flush_type */
|
|
+ __u8 stream_mode;/* Denoted by enum wcrypto_comp_state */
|
|
+ __u8 stream_pos; /* Denoted by enum wcrypto_stream_status */
|
|
+ __u8 comp_lv; /* Denoted by enum wcrypto_comp_level */
|
|
+ __u8 data_fmt; /* Data format, denoted by enum wd_buff_type */
|
|
+ __u8 win_size; /* Denoted by enum wcrypto_comp_win_type */
|
|
+ __u32 in_size; /* Input data bytes */
|
|
+ __u32 avail_out; /* Output buffer size */
|
|
+ __u32 in_cons; /* consumed bytes of input data */
|
|
+ __u32 produced; /* produced bytes of current operation */
|
|
+ __u8 *src; /* Input data VA, buf should be DMA-able. */
|
|
+ __u8 *dst; /* Output data VA pointer */
|
|
+ __u32 tag; /* User-defined request identifier */
|
|
+ __u32 status; /* Denoted by error code and enum wcrypto_op_result */
|
|
+ __u32 isize; /* Denoted by gzip isize */
|
|
+ __u32 checksum; /* Denoted by zlib/gzip CRC */
|
|
+ void *ctx_buf; /* Denoted HW ctx cache, for stream mode */
|
|
+ __u64 udata; /* Input user tag, identify data of stream/user */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * The output format defined by uadk and drivers should fill the format
|
|
+ * @literals_start:address of the literals data output by the hardware
|
|
+ * @sequences_start:address of the sequences data output by the hardware
|
|
+ * @lit_num:the size of literals
|
|
+ * @seq_num:the size of sequences
|
|
+ * @lit_length_overflow_cnt:the count of the literal length overflow
|
|
+ * @lit_length_overflow_pos:the position of the literal length overflow
|
|
+ * @freq:address of the frequency about sequences members
|
|
+ * @blk_type:the previous block status, 0 means an uncompressed block,
|
|
+ * 1 means a RLE block and 2 means a compressed block.
|
|
+ */
|
|
+struct wcrypto_lz77_zstd_format {
|
|
+ void *literals_start;
|
|
+ void *sequences_start;
|
|
+ __u32 lit_num;
|
|
+ __u32 seq_num;
|
|
+ __u32 lit_length_overflow_cnt;
|
|
+ __u32 lit_length_overflow_pos;
|
|
+ void *freq;
|
|
+ __u32 blk_type;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * wcrypto_create_comp_ctx() - create a compress context on the wrapdrive queue.
|
|
+ * @q: wrapdrive queue, need requested by user.
|
|
+ * @setup:setup data of user
|
|
+ */
|
|
+void *wcrypto_create_comp_ctx(struct wd_queue *q,
|
|
+ struct wcrypto_comp_ctx_setup *setup);
|
|
+
|
|
+/**
|
|
+ * wcrypto_do_comp() - syn/asynchronous compressing/decompressing operation
|
|
+ * @ctx: context of user
|
|
+ * @opdata: operational data
|
|
+ * @tag: asynchronous:user_tag; synchronous:NULL.
|
|
+ */
|
|
+int wcrypto_do_comp(void *ctx, struct wcrypto_comp_op_data *opdata, void *tag);
|
|
+
|
|
+/**
|
|
+ * wcrypto_comp_poll() - poll operation for asynchronous operation
|
|
+ * @q:wrapdrive queue
|
|
+ * @num:how many respondences this poll has to get, 0 means get all finishings
|
|
+ */
|
|
+int wcrypto_comp_poll(struct wd_queue *q, unsigned int num);
|
|
+
|
|
+/**
|
|
+ * wcrypto_del_comp_ctx() - free compress context
|
|
+ * @ctx: the context to be free
|
|
+ */
|
|
+void wcrypto_del_comp_ctx(void *ctx);
|
|
+
|
|
+#ifdef __cplusplus
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif
|
|
diff --git a/src/uadk/v1/wd_dh.h b/src/uadk/v1/wd_dh.h
|
|
new file mode 100644
|
|
index 0000000..e411830
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd_dh.h
|
|
@@ -0,0 +1,91 @@
|
|
+/*
|
|
+ * Copyright 2019 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+#ifndef __WD_DH_H
|
|
+#define __WD_DH_H
|
|
+
|
|
+#include <stdlib.h>
|
|
+#include <errno.h>
|
|
+#include "wd.h"
|
|
+
|
|
+#ifdef __cplusplus
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+enum wcrypto_dh_op_type {
|
|
+ WCRYPTO_DH_INVALID, /* invalid DH operation */
|
|
+ WCRYPTO_DH_PHASE1, /* Phase1 DH key generate */
|
|
+ WCRYPTO_DH_PHASE2 /* Phase2 DH key compute */
|
|
+};
|
|
+
|
|
+struct wcrypto_dh_ctx_setup {
|
|
+ wcrypto_cb cb; /* call back function from user */
|
|
+ __u16 data_fmt; /* data format denoted by enum wd_buff_type */
|
|
+ __u16 key_bits; /* DH key bites */
|
|
+ bool is_g2; /* is g2 mode or not */
|
|
+ struct wd_mm_br br; /* memory operations from user */
|
|
+};
|
|
+
|
|
+struct wcrypto_dh_op_data {
|
|
+ void *x_p; /* x and p, should be DMA buffer */
|
|
+
|
|
+ /* it is g, but it is PV at phase 2, should be DMA buffer */
|
|
+ void *pv;
|
|
+
|
|
+ /* phase 1&&2 output, should be DMA buffer */
|
|
+ void *pri;
|
|
+ __u16 pri_bytes; /* output bytes */
|
|
+
|
|
+ __u16 pbytes; /* p bytes */
|
|
+ __u16 xbytes; /* x bytes */
|
|
+ __u16 pvbytes; /* pv bytes */
|
|
+ enum wcrypto_dh_op_type op_type; /* operational type */
|
|
+ __u32 status; /* output status */
|
|
+};
|
|
+
|
|
+struct wcrypto_dh_msg {
|
|
+ __u8 alg_type:3; /* Denoted by enum wcrypto_type */
|
|
+ __u8 op_type:2; /* Denoted by enum wcrypto_dh_op_type */
|
|
+ __u8 data_fmt:1; /* Data format, denoted by enum wd_buff_type */
|
|
+ __u8 is_g2:2; /* g2 mode of phase 1 */
|
|
+ __u8 result; /* Data format, denoted by WD error code */
|
|
+ __u16 key_bytes; /* Key size */
|
|
+ __u8 *x_p; /* This is Xa and p data in order. Should be DMA buffer */
|
|
+ __u8 *g; /* This is PV also at phase 2. Should be DMA buffer */
|
|
+ __u8 *out; /* Result address, should be DMA buffer */
|
|
+ __u16 xbytes; /* parameter Xa size */
|
|
+ __u16 pbytes; /* parameter p size */
|
|
+ __u16 gbytes; /* parameter g size */
|
|
+ __u16 out_bytes; /* output parameter size */
|
|
+ __u64 usr_data; /* user identifier: struct wcrypto_cb_tag */
|
|
+};
|
|
+
|
|
+void *wcrypto_create_dh_ctx(struct wd_queue *q, struct wcrypto_dh_ctx_setup *setup);
|
|
+bool wcrypto_dh_is_g2(const void *ctx);
|
|
+int wcrypto_dh_key_bits(const void *ctx);
|
|
+
|
|
+/* Asynchronous/sync mode APIs of DH */
|
|
+int wcrypto_do_dh(void *ctx, struct wcrypto_dh_op_data *opdata, void *tag);
|
|
+int wcrypto_dh_poll(struct wd_queue *q, unsigned int num);
|
|
+void wcrypto_del_dh_ctx(void *ctx);
|
|
+int wcrypto_set_dh_g(void *ctx, struct wd_dtb *g);
|
|
+void wcrypto_get_dh_g(void *ctx, struct wd_dtb **g);
|
|
+
|
|
+#ifdef __cplusplus
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif
|
|
diff --git a/src/uadk/v1/wd_digest.h b/src/uadk/v1/wd_digest.h
|
|
new file mode 100644
|
|
index 0000000..6ad4c85
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd_digest.h
|
|
@@ -0,0 +1,168 @@
|
|
+/*
|
|
+ * Copyright 2019 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+#ifndef __WD_DIGEST_H
|
|
+#define __WD_DIGEST_H
|
|
+
|
|
+#include <stdlib.h>
|
|
+#include <errno.h>
|
|
+#include <linux/types.h>
|
|
+#include "wd.h"
|
|
+
|
|
+#ifdef __cplusplus
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+enum wcrypto_digest_alg {
|
|
+ WCRYPTO_SM3,
|
|
+ WCRYPTO_MD5,
|
|
+ WCRYPTO_SHA1,
|
|
+ WCRYPTO_SHA256,
|
|
+ WCRYPTO_SHA224,
|
|
+ WCRYPTO_SHA384,
|
|
+ WCRYPTO_SHA512,
|
|
+ WCRYPTO_SHA512_224,
|
|
+ WCRYPTO_SHA512_256,
|
|
+ WCRYPTO_MAX_DIGEST_TYPE,
|
|
+};
|
|
+
|
|
+enum wd_digest_mac_len {
|
|
+ WCRYPTO_DIGEST_SM3_LEN = 32,
|
|
+ WCRYPTO_DIGEST_MD5_LEN = 16,
|
|
+ WCRYPTO_DIGEST_SHA1_LEN = 20,
|
|
+ WCRYPTO_DIGEST_SHA256_LEN = 32,
|
|
+ WCRYPTO_DIGEST_SHA224_LEN = 28,
|
|
+ WCRYPTO_DIGEST_SHA384_LEN = 48,
|
|
+ WCRYPTO_DIGEST_SHA512_LEN = 64,
|
|
+ WCRYPTO_DIGEST_SHA512_224_LEN = 28,
|
|
+ WCRYPTO_DIGEST_SHA512_256_LEN = 32
|
|
+};
|
|
+
|
|
+enum wcrypto_digest_mode {
|
|
+ WCRYPTO_DIGEST_NORMAL,
|
|
+ WCRYPTO_DIGEST_HMAC,
|
|
+};
|
|
+
|
|
+/**
|
|
+ * different contexts for different users/threads
|
|
+ * @cb: call back functions of user
|
|
+ * @alg: digest algorithm type; denoted by enum wcrypto_digest_alg
|
|
+ * @mode:digest algorithm mode; denoted by enum wcrypto_digest_mode
|
|
+ * @br: memory from user, it is given at ctx creating
|
|
+ * @data_fmt: data format, denoted by enum wcrypto_buff_type
|
|
+ */
|
|
+struct wcrypto_digest_ctx_setup {
|
|
+ wcrypto_cb cb;
|
|
+ enum wcrypto_digest_alg alg;
|
|
+ enum wcrypto_digest_mode mode;
|
|
+ struct wd_mm_br br;
|
|
+ __u16 data_fmt;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * operational data per I/O operation
|
|
+ * @in: input data address
|
|
+ * @out:output data address
|
|
+ * @in_bytes: input data size
|
|
+ * @out_bytes:output data size
|
|
+ * @priv:reserved data field segment
|
|
+ * @status:I/O operation return status
|
|
+ * @has_next: is there next data block
|
|
+ */
|
|
+struct wcrypto_digest_op_data {
|
|
+ void *in;
|
|
+ void *out;
|
|
+ __u32 in_bytes;
|
|
+ __u32 out_bytes;
|
|
+ void *priv;
|
|
+ int status;
|
|
+ bool has_next;
|
|
+};
|
|
+
|
|
+/* Digest message format of Warpdrive */
|
|
+struct wcrypto_digest_msg {
|
|
+ __u8 alg_type; /* Denoted by enum wcrypto_type */
|
|
+ __u8 alg:4; /* Denoted by enum wcrypto_digest_alg */
|
|
+ __u8 has_next:1; /* is there next block data */
|
|
+ __u8 mode:3; /* Denoted by enum wcrypto_digest_mode */
|
|
+ __u8 data_fmt; /* Data format, denoted by enum wcrypto_buff_type */
|
|
+ __u8 result; /* Operation result, denoted by WD error code */
|
|
+ __u16 key_bytes; /* Key bytes */
|
|
+ __u16 iv_bytes; /* IV bytes */
|
|
+
|
|
+ __u8 *key; /* Input key VA pointer, should be DMA buffer */
|
|
+ __u8 *iv; /* Input IV VA pointer, should be DMA buffer */
|
|
+ __u8 *in; /* Input data VA pointer, should be DMA buffer */
|
|
+ __u8 *out; /* Output data VA pointer, should be DMA buffer */
|
|
+ __u32 in_bytes; /* Input data bytes */
|
|
+ __u32 out_bytes; /* Output data bytes */
|
|
+ __u64 usr_data; /* user identifier: struct wcrypto_cb_tag */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * wcrypto_create_digest_ctx() - create a digest context on the wrapdrive queue.
|
|
+ * @q: wrapdrive queue, need requested by user.
|
|
+ * @setup:setup data of user
|
|
+ */
|
|
+void *wcrypto_create_digest_ctx(struct wd_queue *q,
|
|
+ struct wcrypto_digest_ctx_setup *setup);
|
|
+
|
|
+/**
|
|
+ * wcrypto_set_digest_key() - set auth key to digest context.
|
|
+ * @ctx: digest context, created by wcrypto_create_digest_ctx.
|
|
+ * @key: auth key addr
|
|
+ * @key_len: auth key length
|
|
+ */
|
|
+int wcrypto_set_digest_key(void *ctx, __u8 *key, __u16 key_len);
|
|
+
|
|
+/**
|
|
+ * wcrypto_do_digest() - syn/asynchronous digest operation
|
|
+ * @ctx: context of user, created by wcrypto_create_digest_ctx.
|
|
+ * @opdata: operational data
|
|
+ * @tag: asynchronous:user_tag; synchronous:NULL.
|
|
+ */
|
|
+int wcrypto_do_digest(void *ctx, struct wcrypto_digest_op_data *opdata,
|
|
+ void *tag);
|
|
+
|
|
+/**
|
|
+ * wcrypto_digest_poll() - poll operation for asynchronous operation
|
|
+ * @q:wrapdrive queue
|
|
+ * @num:how many respondences this poll has to get, 0 means get all finishings
|
|
+ */
|
|
+int wcrypto_digest_poll(struct wd_queue *q, unsigned int num);
|
|
+
|
|
+/**
|
|
+ * wcrypto_del_digest_ctx() - free digest context
|
|
+ * @ctx: the context to be free
|
|
+ */
|
|
+void wcrypto_del_digest_ctx(void *ctx);
|
|
+
|
|
+/**
|
|
+ * wcrypto_burst_digest() - (a)synchronous multiple digest operations
|
|
+ * @d_ctx: context of user, created by wcrypto_create_digest_ctx.
|
|
+ * @opdata: operational data
|
|
+ * @tag: asynchronous:user_tag; synchronous:NULL.
|
|
+ * @num: operations number per calling, maximum number is WCRYPTO_MAX_BURST_NUM.
|
|
+ */
|
|
+int wcrypto_burst_digest(void *d_ctx, struct wcrypto_digest_op_data **opdata,
|
|
+ void **tag, __u32 num);
|
|
+
|
|
+#ifdef __cplusplus
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif
|
|
+
|
|
diff --git a/src/uadk/v1/wd_ecc.h b/src/uadk/v1/wd_ecc.h
|
|
new file mode 100644
|
|
index 0000000..84998ed
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd_ecc.h
|
|
@@ -0,0 +1,273 @@
|
|
+/*
|
|
+ * Copyright 2020 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+#ifndef __WD_ECC_H
|
|
+#define __WD_ECC_H
|
|
+
|
|
+#include <stdlib.h>
|
|
+#include <errno.h>
|
|
+#include <linux/types.h>
|
|
+#include "wd.h"
|
|
+
|
|
+#ifdef __cplusplus
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+typedef int (*wcrypto_rand)(char *out, size_t out_len, void *usr);
|
|
+typedef int (*wcrypto_hash)(const char *in, size_t in_len,
|
|
+ char *out, size_t out_len, void *usr);
|
|
+
|
|
+struct wcrypto_ecc_in; /* ecc input parameters */
|
|
+struct wcrypto_ecc_key; /* ecc key parameters */
|
|
+struct wcrypto_ecc_out; /* ecc output parameters */
|
|
+
|
|
+struct wcrypto_ecc_point {
|
|
+ struct wd_dtb x; /* x affine coordinates */
|
|
+ struct wd_dtb y; /* y affine coordinates */
|
|
+};
|
|
+
|
|
+/* ECC operational types */
|
|
+enum wcrypto_ecc_op_type {
|
|
+ WCRYPTO_EC_OP_INVALID, /* invalid ecc operation */
|
|
+ WCRYPTO_ECXDH_GEN_KEY, /* ECDH/X448/X25519 generate public key */
|
|
+ WCRYPTO_ECXDH_COMPUTE_KEY, /* ECDH/X448/X25519 compute share key */
|
|
+ WCRYPTO_ECDSA_SIGN, /* ECDSA sign */
|
|
+ WCRYPTO_ECDSA_VERIFY, /* ECDSA verify */
|
|
+ WCRYPTO_SM2_SIGN, /* SM2 sign */
|
|
+ WCRYPTO_SM2_VERIFY, /* SM2 verify */
|
|
+ WCRYPTO_SM2_ENCRYPT, /* SM2 encrypt */
|
|
+ WCRYPTO_SM2_DECRYPT, /* SM2 decrypt */
|
|
+ WCRYPTO_SM2_KG, /* SM2 key generate */
|
|
+ WCRYPTO_EC_OP_MAX /* max operation */
|
|
+};
|
|
+
|
|
+/* ECC operational types */
|
|
+enum wcrypto_ecc_curve_id {
|
|
+ WCRYPTO_SECP128R1 = 0x10, /* SECG 128 bit prime field */
|
|
+ WCRYPTO_SECP192K1 = 0x11, /* SECG 192 bit prime field */
|
|
+ WCRYPTO_SECP256K1 = 0x12, /* SECG 256 bit prime field */
|
|
+ WCRYPTO_BRAINPOOLP320R1 = 0x13, /* RFC5639 320 bit prime field */
|
|
+ WCRYPTO_BRAINPOOLP384R1 = 0x14, /* RFC5639 384 bit prime field */
|
|
+ WCRYPTO_SECP521R1 = 0x15, /* NIST/SECG 521 bit prime field */
|
|
+};
|
|
+
|
|
+/* ECC hash callback function types */
|
|
+enum wcrypto_ecc_hash_type {
|
|
+ WCRYPTO_HASH_SM3,
|
|
+ WCRYPTO_HASH_SHA1,
|
|
+ WCRYPTO_HASH_SHA224,
|
|
+ WCRYPTO_HASH_SHA256,
|
|
+ WCRYPTO_HASH_SHA384,
|
|
+ WCRYPTO_HASH_SHA512,
|
|
+ WCRYPTO_HASH_MD4,
|
|
+ WCRYPTO_HASH_MD5,
|
|
+ WCRYPTO_HASH_MAX
|
|
+};
|
|
+
|
|
+struct wcrypto_ecc_curve {
|
|
+ struct wd_dtb p; /* Prime field p */
|
|
+ struct wd_dtb a; /* Elliptic curve equation a parameter */
|
|
+ struct wd_dtb b; /* Elliptic curve equation b parameter */
|
|
+ struct wcrypto_ecc_point g; /* Elliptic curve G point */
|
|
+ struct wd_dtb n; /* Elliptic curve order */
|
|
+};
|
|
+
|
|
+enum wcrypto_ecc_curve_cfg_type {
|
|
+ WCRYPTO_CV_CFG_ID, /* set curve parameter by denote curve ID */
|
|
+ WCRYPTO_CV_CFG_PARAM /* set curve parameter by denote curve parameter */
|
|
+};
|
|
+
|
|
+struct wcrypto_ecc_curve_cfg {
|
|
+ __u32 type; /* denoted by enum wcrypto_ecc_curve_cfg_type */
|
|
+ union {
|
|
+ enum wcrypto_ecc_curve_id id; /* if WCRYPTO_CV_CFG_ID */
|
|
+ struct wcrypto_ecc_curve *pparam; /* if WCRYPTO_CV_CFG_PARAM */
|
|
+ } cfg;
|
|
+ __u8 resv[4]; /* reserve */
|
|
+};
|
|
+
|
|
+struct wcrypto_rand_mt {
|
|
+ wcrypto_rand cb; /* rand callback */
|
|
+ void *usr; /* user private parameter */
|
|
+};
|
|
+
|
|
+struct wcrypto_hash_mt {
|
|
+ wcrypto_hash cb; /* hash callback */
|
|
+ void *usr; /* user private parameter */
|
|
+ __u8 type; /* hash type, denoted by enum wcrypto_ecc_hash_type */
|
|
+ __u8 rsv[3]; /* reserve */
|
|
+};
|
|
+
|
|
+/* ECC context setting up input parameters from user */
|
|
+struct wcrypto_ecc_ctx_setup {
|
|
+ wcrypto_cb cb; /* call back function from user */
|
|
+ __u16 data_fmt; /* data format denoted by enum wd_buff_type */
|
|
+ __u16 key_bits; /* ECC key bits */
|
|
+ struct wcrypto_ecc_curve_cfg cv; /* curve config denoted by user */
|
|
+ struct wd_mm_br br; /* memory operations from user */
|
|
+ struct wcrypto_rand_mt rand; /* rand method from user */
|
|
+ struct wcrypto_hash_mt hash; /* hash method from user */
|
|
+};
|
|
+
|
|
+struct wcrypto_ecc_op_data {
|
|
+ enum wcrypto_ecc_op_type op_type; /* ecc operation type */
|
|
+ int status; /* ecc operation status */
|
|
+ void *in; /* ecc operation input address, should be DMA-able */
|
|
+ void *out; /* ecc operation output address, should be DMA-able */
|
|
+ __u32 in_bytes; /* ecc operation input bytes */
|
|
+ __u32 out_bytes; /* ecc operation output bytes */
|
|
+};
|
|
+
|
|
+/* ECC message format of Warpdrive */
|
|
+struct wcrypto_ecc_msg {
|
|
+ __u8 alg_type:4; /* Denoted by enum wcrypto_type */
|
|
+ __u8 op_type:4; /* Denoted by enum wcrypto_ecc_op_type */
|
|
+ __u8 curve_id:7; /* Ec curve denoted by enum wcrypto_ecc_curve_type */
|
|
+ __u8 data_fmt:1; /* Data format, denoted by enum wd_buff_type */
|
|
+ __u8 mtype; /* not used, reserve */
|
|
+ __u8 result; /* alg op error code */
|
|
+ __u16 key_bytes; /* key bytes */
|
|
+ __u16 in_bytes; /* Input data bytes */
|
|
+ __u16 out_bytes; /* Output data bytes */
|
|
+ __u8 hash_type; /* hash method denoted by enum wcrypto_ecc_hash_type */
|
|
+ __u8 *in; /* Input data VA, should be DMA buffer */
|
|
+ __u8 *out; /* Output data VA, should be DMA buffer */
|
|
+ __u8 *key; /* Input key VA, should be DMA buffer */
|
|
+ /*
|
|
+ * Input user tag, used for identify data stream/user:
|
|
+ * struct wcrypto_cb_tag
|
|
+ */
|
|
+ __u64 usr_data;
|
|
+};
|
|
+
|
|
+int wcrypto_get_ecc_key_bits(const void *ctx);
|
|
+void *wcrypto_create_ecc_ctx(struct wd_queue *q,
|
|
+ struct wcrypto_ecc_ctx_setup *setup);
|
|
+void wcrypto_del_ecc_ctx(void *ctx);
|
|
+struct wcrypto_ecc_key *wcrypto_get_ecc_key(void *ctx);
|
|
+int wcrypto_set_ecc_prikey(struct wcrypto_ecc_key *ecc_key,
|
|
+ struct wd_dtb *prikey);
|
|
+int wcrypto_get_ecc_prikey(struct wcrypto_ecc_key *ecc_key,
|
|
+ struct wd_dtb **prikey);
|
|
+int wcrypto_set_ecc_pubkey(struct wcrypto_ecc_key *ecc_key,
|
|
+ struct wcrypto_ecc_point *pubkey);
|
|
+int wcrypto_get_ecc_pubkey(struct wcrypto_ecc_key *ecc_key,
|
|
+ struct wcrypto_ecc_point **pubkey);
|
|
+void wcrypto_del_ecc_in(void *ctx, struct wcrypto_ecc_in *in);
|
|
+void wcrypto_del_ecc_out(void *ctx, struct wcrypto_ecc_out *out);
|
|
+void wcrypto_get_ecc_prikey_params(struct wcrypto_ecc_key *key,
|
|
+ struct wd_dtb **p, struct wd_dtb **a,
|
|
+ struct wd_dtb **b, struct wd_dtb **n,
|
|
+ struct wcrypto_ecc_point **g,
|
|
+ struct wd_dtb **d);
|
|
+void wcrypto_get_ecc_pubkey_params(struct wcrypto_ecc_key *key,
|
|
+ struct wd_dtb **p, struct wd_dtb **a,
|
|
+ struct wd_dtb **b, struct wd_dtb **n,
|
|
+ struct wcrypto_ecc_point **g,
|
|
+ struct wcrypto_ecc_point **pub);
|
|
+
|
|
+/* APIs For ECDH */
|
|
+void wcrypto_get_ecxdh_in_params(struct wcrypto_ecc_in *in,
|
|
+ struct wcrypto_ecc_point **pbk);
|
|
+void wcrypto_get_ecxdh_out_params(struct wcrypto_ecc_out *out,
|
|
+ struct wcrypto_ecc_point **key);
|
|
+struct wcrypto_ecc_in *wcrypto_new_ecxdh_in(void *ctx,
|
|
+ struct wcrypto_ecc_point *in);
|
|
+struct wcrypto_ecc_out *wcrypto_new_ecxdh_out(void *ctx);
|
|
+/**
|
|
+ * This is a pair of asynchronous mode ECDH/ECDSA/SM2 API as tag is not NULL,
|
|
+ * or it is synchronous mode
|
|
+ */
|
|
+int wcrypto_do_ecxdh(void *ctx, struct wcrypto_ecc_op_data *opdata, void *tag);
|
|
+int wcrypto_ecxdh_poll(struct wd_queue *q, unsigned int num);
|
|
+
|
|
+
|
|
+/* APIs For ECDSA sign/verf */
|
|
+struct wcrypto_ecc_in *wcrypto_new_ecdsa_sign_in(void *ctx,
|
|
+ struct wd_dtb *dgst,
|
|
+ struct wd_dtb *k);
|
|
+struct wcrypto_ecc_in *wcrypto_new_ecdsa_verf_in(void *ctx,
|
|
+ struct wd_dtb *dgst,
|
|
+ struct wd_dtb *r,
|
|
+ struct wd_dtb *s);
|
|
+struct wcrypto_ecc_out *wcrypto_new_ecdsa_sign_out(void *ctx);
|
|
+void wcrypto_get_ecdsa_sign_in_params(struct wcrypto_ecc_in *in,
|
|
+ struct wd_dtb **dgst,
|
|
+ struct wd_dtb **k);
|
|
+void wcrypto_get_ecdsa_verf_in_params(struct wcrypto_ecc_in *in,
|
|
+ struct wd_dtb **dgst,
|
|
+ struct wd_dtb **r,
|
|
+ struct wd_dtb **s);
|
|
+void wcrypto_get_ecdsa_sign_out_params(struct wcrypto_ecc_out *out,
|
|
+ struct wd_dtb **r,
|
|
+ struct wd_dtb **s);
|
|
+
|
|
+/**
|
|
+ * This is a pair of asynchronous mode ECDSA API as tag is not NULL,
|
|
+ * or it is synchronous mode
|
|
+ */
|
|
+int wcrypto_do_ecdsa(void *ctx, struct wcrypto_ecc_op_data *opdata, void *tag);
|
|
+int wcrypto_ecdsa_poll(struct wd_queue *q, unsigned int num);
|
|
+
|
|
+/* APIs For SM2 sign/verf/kg */
|
|
+struct wcrypto_ecc_in *wcrypto_new_sm2_sign_in(void *ctx,
|
|
+ struct wd_dtb *e,
|
|
+ struct wd_dtb *k,
|
|
+ struct wd_dtb *id,
|
|
+ __u8 is_dgst);
|
|
+struct wcrypto_ecc_in *wcrypto_new_sm2_verf_in(void *ctx,
|
|
+ struct wd_dtb *e,
|
|
+ struct wd_dtb *r,
|
|
+ struct wd_dtb *s,
|
|
+ struct wd_dtb *id,
|
|
+ __u8 is_dgst);
|
|
+struct wcrypto_ecc_out *wcrypto_new_sm2_sign_out(void *ctx);
|
|
+
|
|
+void wcrypto_get_sm2_sign_out_params(struct wcrypto_ecc_out *out,
|
|
+ struct wd_dtb **r,
|
|
+ struct wd_dtb **s);
|
|
+
|
|
+struct wcrypto_ecc_in *wcrypto_new_sm2_enc_in(void *ctx,
|
|
+ struct wd_dtb *k,
|
|
+ struct wd_dtb *plaintext);
|
|
+struct wcrypto_ecc_in *wcrypto_new_sm2_dec_in(void *ctx,
|
|
+ struct wcrypto_ecc_point *c1,
|
|
+ struct wd_dtb *c2,
|
|
+ struct wd_dtb *c3);
|
|
+struct wcrypto_ecc_out *wcrypto_new_sm2_enc_out(void *ctx, __u32 plaintext_len);
|
|
+struct wcrypto_ecc_out *wcrypto_new_sm2_dec_out(void *ctx, __u32 plaintext_len);
|
|
+struct wcrypto_ecc_out *wcrypto_new_sm2_kg_out(void *ctx);
|
|
+void wcrypto_get_sm2_kg_out_params(struct wcrypto_ecc_out *out,
|
|
+ struct wd_dtb **privkey,
|
|
+ struct wcrypto_ecc_point **pubkey);
|
|
+void wcrypto_get_sm2_enc_out_params(struct wcrypto_ecc_out *out,
|
|
+ struct wcrypto_ecc_point **c1,
|
|
+ struct wd_dtb **c2,
|
|
+ struct wd_dtb **c3);
|
|
+void wcrypto_get_sm2_dec_out_params(struct wcrypto_ecc_out *out,
|
|
+ struct wd_dtb **plaintext);
|
|
+
|
|
+
|
|
+/**
|
|
+ * This is a pair of asynchronous mode SM2 API as tag is not NULL,
|
|
+ * or it is synchronous mode
|
|
+ */
|
|
+int wcrypto_do_sm2(void *ctx, struct wcrypto_ecc_op_data *opdata, void *tag);
|
|
+int wcrypto_sm2_poll(struct wd_queue *q, unsigned int num);
|
|
+#ifdef __cplusplus
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif
|
|
diff --git a/src/uadk/v1/wd_rng.h b/src/uadk/v1/wd_rng.h
|
|
new file mode 100644
|
|
index 0000000..fcde26d
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd_rng.h
|
|
@@ -0,0 +1,76 @@
|
|
+/*
|
|
+ * Copyright 2019 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+#ifndef __WD_RNG_H
|
|
+#define __WD_RNG_H
|
|
+
|
|
+#include "wd.h"
|
|
+#include "wd_digest.h"
|
|
+#include "wd_cipher.h"
|
|
+
|
|
+#ifdef __cplusplus
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+struct wcrypto_rng_ctx_setup {
|
|
+ wcrypto_cb cb;
|
|
+ __u16 data_fmt; /* Data format, denoted by enum wd_buff_type */
|
|
+ enum wcrypto_type type; /* Please refer to the definition of enum */
|
|
+ enum wcrypto_cipher_alg calg; /* DRBG cipher algorithm */
|
|
+ enum wcrypto_cipher_mode cmode; /* DRBG cipher mode */
|
|
+ enum wcrypto_digest_alg dalg; /* DRBG digest algorithm */
|
|
+ enum wcrypto_digest_mode dmode; /* DRBG digest mode */
|
|
+};
|
|
+
|
|
+struct wcrypto_rng_msg {
|
|
+ __u8 alg_type; /* Denoted by enum wcrypto_type */
|
|
+ __u8 op_type; /* Denoted by enum wcrypto_rng_op_type */
|
|
+ __u8 data_fmt; /* Data format, denoted by enum wd_buff_type */
|
|
+ __u8 result; /* Data format, denoted by WD error code */
|
|
+ __u8 *out; /* Result address */
|
|
+ __u8 *in; /* Input address */
|
|
+ __u32 out_bytes; /* output bytes */
|
|
+ __u32 in_bytes; /* input bytes */
|
|
+ __u64 usr_tag; /* user identifier */
|
|
+};
|
|
+
|
|
+enum wcrypto_rng_op_type {
|
|
+ WCRYPTO_RNG_INVALID, /* Invalid RNG operational type */
|
|
+ WCRYPTO_DRBG_RESEED, /* seed operation */
|
|
+ WCRYPTO_DRBG_GEN, /* deterministic random number generation */
|
|
+ WCRYPTO_TRNG_GEN, /* true random number generation */
|
|
+};
|
|
+
|
|
+struct wcrypto_rng_op_data {
|
|
+ enum wcrypto_rng_op_type op_type;
|
|
+ __u32 status; /* Operation result status */
|
|
+ void *in; /* input */
|
|
+ void *out; /* output */
|
|
+ __u32 in_bytes; /* input bytes */
|
|
+ __u32 out_bytes; /* output bytes */
|
|
+};
|
|
+
|
|
+void *wcrypto_create_rng_ctx(struct wd_queue *q,
|
|
+ struct wcrypto_rng_ctx_setup *setup);
|
|
+void wcrypto_del_rng_ctx(void *ctx);
|
|
+int wcrypto_do_rng(void *ctx, struct wcrypto_rng_op_data *opdata, void *tag);
|
|
+int wcrypto_rng_poll(struct wd_queue *q, unsigned int num);
|
|
+
|
|
+#ifdef __cplusplus
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif
|
|
diff --git a/src/uadk/v1/wd_rsa.h b/src/uadk/v1/wd_rsa.h
|
|
new file mode 100644
|
|
index 0000000..480c088
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd_rsa.h
|
|
@@ -0,0 +1,148 @@
|
|
+/*
|
|
+ * Copyright 2019 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+#ifndef __WD_RSA_H
|
|
+#define __WD_RSA_H
|
|
+
|
|
+#include <stdlib.h>
|
|
+#include <errno.h>
|
|
+#include <linux/types.h>
|
|
+#include "wd.h"
|
|
+
|
|
+#ifdef __cplusplus
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+struct wcrypto_rsa_kg_in; /* rsa key generation input parameters */
|
|
+struct wcrypto_rsa_kg_out; /* rsa key generation output parameters */
|
|
+struct wcrypto_rsa_pubkey; /* rsa public key */
|
|
+struct wcrypto_rsa_prikey; /* rsa private key */
|
|
+
|
|
+/* RSA operational types */
|
|
+enum wcrypto_rsa_op_type {
|
|
+ WCRYPTO_RSA_INVALID, /* invalid rsa operation */
|
|
+ WCRYPTO_RSA_SIGN, /* RSA sign */
|
|
+ WCRYPTO_RSA_VERIFY, /* RSA verify */
|
|
+ WCRYPTO_RSA_GENKEY, /* RSA key generation */
|
|
+};
|
|
+
|
|
+/* RSA key types */
|
|
+enum wcrypto_rsa_key_type {
|
|
+ WCRYPTO_RSA_INVALID_KEY, /* invalid rsa key type */
|
|
+ WCRYPTO_RSA_PUBKEY, /* rsa public key type */
|
|
+ WCRYPTO_RSA_PRIKEY1, /* invalid rsa private common key type */
|
|
+ WCRYPTO_RSA_PRIKEY2, /* invalid rsa private CRT key type */
|
|
+};
|
|
+
|
|
+/* RSA context setting up input parameters from user */
|
|
+struct wcrypto_rsa_ctx_setup {
|
|
+ wcrypto_cb cb; /* call back function from user */
|
|
+ __u16 data_fmt; /* data format denoted by enum wd_buff_type */
|
|
+ __u16 key_bits; /* RSA key bits */
|
|
+ bool is_crt; /* CRT mode or not */
|
|
+ struct wd_mm_br br; /* memory operations from user */
|
|
+};
|
|
+
|
|
+struct wcrypto_rsa_op_data {
|
|
+ enum wcrypto_rsa_op_type op_type; /* rsa operation type */
|
|
+ int status; /* rsa operation status */
|
|
+ void *in; /* rsa operation input address, should be DMA-able */
|
|
+ void *out; /* rsa operation output address, should be DMA-able */
|
|
+ __u32 in_bytes; /* rsa operation input bytes */
|
|
+ __u32 out_bytes; /* rsa operation output bytes */
|
|
+};
|
|
+
|
|
+/* RSA message format of Warpdrive */
|
|
+struct wcrypto_rsa_msg {
|
|
+ __u8 alg_type:3; /* Denoted by enum wcrypto_type */
|
|
+ __u8 op_type:2; /* Denoted by enum wcrypto_rsa_op_type */
|
|
+ __u8 key_type:2; /* Denoted by enum wcrypto_rsa_key_type */
|
|
+ __u8 data_fmt:1; /* Data format, denoted by enum wd_buff_type */
|
|
+ __u8 result; /* Data format, denoted by WD error code */
|
|
+ __u16 in_bytes; /* Input data bytes */
|
|
+ __u16 out_bytes; /* Output data bytes */
|
|
+ __u16 key_bytes; /* Input key bytes */
|
|
+ __u8 *in; /* Input data VA, buf should be DMA buffer. */
|
|
+ __u8 *out; /* Output data VA pointer, should be DMA buffer */
|
|
+ __u8 *key; /* Input key VA pointer, should be DMA buffer */
|
|
+
|
|
+ /*
|
|
+ * Input user tag, used for identify data stream/user:
|
|
+ * struct wcrypto_cb_tag
|
|
+ */
|
|
+ __u64 usr_data;
|
|
+};
|
|
+
|
|
+bool wcrypto_rsa_is_crt(const void *ctx);
|
|
+int wcrypto_rsa_key_bits(const void *ctx);
|
|
+void *wcrypto_create_rsa_ctx(struct wd_queue *q, struct wcrypto_rsa_ctx_setup *setup);
|
|
+void wcrypto_get_rsa_pubkey(void *ctx, struct wcrypto_rsa_pubkey **pubkey);
|
|
+void wcrypto_get_rsa_prikey(void *ctx, struct wcrypto_rsa_prikey **prikey);
|
|
+int wcrypto_set_rsa_pubkey_params(void *ctx, struct wd_dtb *e, struct wd_dtb *n);
|
|
+void wcrypto_get_rsa_pubkey_params(struct wcrypto_rsa_pubkey *pbk,
|
|
+ struct wd_dtb **e, struct wd_dtb **n);
|
|
+int wcrypto_set_rsa_prikey_params(void *ctx, struct wd_dtb *d, struct wd_dtb *n);
|
|
+void wcrypto_get_rsa_prikey_params(struct wcrypto_rsa_prikey *pvk, struct wd_dtb **d,
|
|
+ struct wd_dtb **n);
|
|
+int wcrypto_set_rsa_crt_prikey_params(void *ctx, struct wd_dtb *dq,
|
|
+ struct wd_dtb *dp,
|
|
+ struct wd_dtb *qinv,
|
|
+ struct wd_dtb *q,
|
|
+ struct wd_dtb *p);
|
|
+void wcrypto_get_rsa_crt_prikey_params(struct wcrypto_rsa_prikey *pvk,
|
|
+ struct wd_dtb **dq, struct wd_dtb **dp,
|
|
+ struct wd_dtb **qinv, struct wd_dtb **q,
|
|
+ struct wd_dtb **p);
|
|
+
|
|
+/* APIs For RSA key generate */
|
|
+struct wcrypto_rsa_kg_in *wcrypto_new_kg_in(void *ctx, struct wd_dtb *e,
|
|
+ struct wd_dtb *p, struct wd_dtb *q);
|
|
+void wcrypto_del_kg_in(void *ctx, struct wcrypto_rsa_kg_in *ki);
|
|
+void wcrypto_get_rsa_kg_in_params(struct wcrypto_rsa_kg_in *kin, struct wd_dtb *e,
|
|
+ struct wd_dtb *q, struct wd_dtb *p);
|
|
+
|
|
+struct wcrypto_rsa_kg_out *wcrypto_new_kg_out(void *ctx);
|
|
+void wcrypto_del_kg_out(void *ctx, struct wcrypto_rsa_kg_out *kout);
|
|
+void wcrypto_get_rsa_kg_out_params(struct wcrypto_rsa_kg_out *kout,
|
|
+ struct wd_dtb *d,
|
|
+ struct wd_dtb *n);
|
|
+void wcrypto_get_rsa_kg_out_crt_params(struct wcrypto_rsa_kg_out *kout,
|
|
+ struct wd_dtb *qinv,
|
|
+ struct wd_dtb *dq, struct wd_dtb *dp);
|
|
+
|
|
+int wcrypto_rsa_kg_in_data(struct wcrypto_rsa_kg_in *ki, char **data);
|
|
+int wcrypto_rsa_kg_out_data(struct wcrypto_rsa_kg_out *ko, char **data);
|
|
+void wcrypto_set_rsa_kg_out_crt_psz(struct wcrypto_rsa_kg_out *kout,
|
|
+ size_t qinv_sz,
|
|
+ size_t dq_sz,
|
|
+ size_t dp_sz);
|
|
+void wcrypto_set_rsa_kg_out_psz(struct wcrypto_rsa_kg_out *kout,
|
|
+ size_t d_sz,
|
|
+ size_t n_sz);
|
|
+
|
|
+/**
|
|
+ * This is a pair of asynchronous mode RSA API as tag is not NULL,
|
|
+ * or it is synchronous mode
|
|
+ */
|
|
+int wcrypto_do_rsa(void *ctx, struct wcrypto_rsa_op_data *opdata, void *tag);
|
|
+int wcrypto_rsa_poll(struct wd_queue *q, unsigned int num);
|
|
+void wcrypto_del_rsa_ctx(void *ctx);
|
|
+
|
|
+#ifdef __cplusplus
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif
|
|
diff --git a/src/uadk/v1/wd_sgl.h b/src/uadk/v1/wd_sgl.h
|
|
new file mode 100644
|
|
index 0000000..e2e82f2
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd_sgl.h
|
|
@@ -0,0 +1,74 @@
|
|
+/*
|
|
+ * Copyright 2020 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+#ifndef _WD_SGL_H
|
|
+#define _WD_SGL_H
|
|
+
|
|
+#include <stddef.h>
|
|
+#include <asm/types.h>
|
|
+#include "wd.h"
|
|
+
|
|
+#ifdef __cplusplus
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+struct wd_sgl;
|
|
+struct wd_sglpool_setup {
|
|
+ /* Total number of SGEs with buffer slices */
|
|
+ __u32 buf_num;
|
|
+ /* memory size of entry buffer */
|
|
+ __u32 buf_size;
|
|
+ /* Fixed SGE number in the SGL of the pool */
|
|
+ __u8 sge_num_in_sgl;
|
|
+ /* Initiated buf number in the SGL of the pool, changeable */
|
|
+ __u8 buf_num_in_sgl;
|
|
+ /* Total number of sgl for entries and buffers */
|
|
+ __u16 sgl_num;
|
|
+ /* SGE data buffer starting address align size */
|
|
+ __u32 align_size;
|
|
+ /* memory from user if don't use WD memory */
|
|
+ struct wd_mm_br br;
|
|
+};
|
|
+
|
|
+void *wd_sglpool_create(struct wd_queue *q, struct wd_sglpool_setup *setup);
|
|
+void wd_sglpool_destroy(void *pool);
|
|
+struct wd_sgl *wd_alloc_sgl(void *pool, __u32 size);
|
|
+void wd_free_sgl(void *pool, struct wd_sgl *sgl);
|
|
+int wd_sgl_merge(struct wd_sgl *dst_sgl, struct wd_sgl *src_sgl);
|
|
+int wd_sgl_cp_to_pbuf(struct wd_sgl *sgl, size_t offset, void *pbuf, size_t size);
|
|
+int wd_sgl_cp_from_pbuf(struct wd_sgl *sgl, size_t offset, void *pbuf, size_t size);
|
|
+void *wd_sgl_iova_map(void *pool, struct wd_sgl *sgl, size_t sz);
|
|
+void wd_sgl_iova_unmap(void *pool, void *sgl_iova, struct wd_sgl *sgl);
|
|
+
|
|
+void *wd_get_last_sge_buf(struct wd_sgl *sgl);
|
|
+void *wd_get_first_sge_buf(struct wd_sgl *sgl);
|
|
+int wd_get_sgl_sge_num(struct wd_sgl *sgl);
|
|
+int wd_get_sgl_buf_num(struct wd_sgl *sgl);
|
|
+void *wd_get_sge_buf(struct wd_sgl *sgl, __u32 num);
|
|
+int wd_get_sgl_buf_sum(struct wd_sgl *sgl);
|
|
+int wd_get_sgl_mem_size(struct wd_sgl *sgl, size_t *size);
|
|
+int wd_get_free_sgl_num(void *pool, __u32 *free_sgl_num);
|
|
+int wd_get_free_sgl_sge_num(struct wd_sgl *sgl, __u32 *free_sgl_sge_num);
|
|
+int wd_get_free_buf_num(void *pool, __u32 *free_buf_num);
|
|
+int wd_get_sgl_datalen(struct wd_sgl *sgl, __u32 *dtsize);
|
|
+int wd_get_sge_datalen(struct wd_sgl *sgl, __u32 num, __u32 *dtsize);
|
|
+int wd_get_sgl_bufsize(struct wd_sgl *sgl, __u32 *bufsz);
|
|
+
|
|
+#ifdef __cplusplus
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif /* _WD_SGL_H */
|
|
diff --git a/src/uadk/v1/wd_util.h b/src/uadk/v1/wd_util.h
|
|
new file mode 100644
|
|
index 0000000..228493c
|
|
--- /dev/null
|
|
+++ b/src/uadk/v1/wd_util.h
|
|
@@ -0,0 +1,393 @@
|
|
+/*
|
|
+ * Copyright 2019 Huawei Technologies Co.,Ltd.All rights reserved.
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+/* the common driver header define the unified interface for wd */
|
|
+#ifndef __WD_UTIL_H__
|
|
+#define __WD_UTIL_H__
|
|
+
|
|
+#include <stdio.h>
|
|
+#include <string.h>
|
|
+#include <stdlib.h>
|
|
+#include <stdint.h>
|
|
+#include <unistd.h>
|
|
+#include <fcntl.h>
|
|
+#include <sys/stat.h>
|
|
+#include <sys/ioctl.h>
|
|
+#include <sys/mman.h>
|
|
+#include <sys/epoll.h>
|
|
+#include <sys/eventfd.h>
|
|
+#include <sys/queue.h>
|
|
+#include <linux/types.h>
|
|
+
|
|
+#include "v1/wd.h"
|
|
+#include "v1/wd_ecc.h"
|
|
+#include "v1/wd_adapter.h"
|
|
+
|
|
+#define WD_CTX_MSG_NUM 64
|
|
+#define WD_HPRE_CTX_MSG_NUM 64
|
|
+#define WD_RNG_CTX_MSG_NUM 256
|
|
+#define WD_MAX_CTX_NUM 256
|
|
+#define BYTE_BITS 8
|
|
+#define BYTE_BITS_SHIFT 3
|
|
+#define CRT_PARAMS_SZ(key_size) ((5 * (key_size)) >> 1)
|
|
+#define CRT_GEN_PARAMS_SZ(key_size) ((7 * (key_size)) >> 1)
|
|
+#define GEN_PARAMS_SZ(key_size) ((key_size) << 1)
|
|
+#define CRT_PARAM_SZ(key_size) ((key_size) >> 1)
|
|
+#define GET_NEGATIVE(val) (0 - (val))
|
|
+#define XTS_MODE_KEY_SHIFT 1
|
|
+#define AES_KEYSIZE_128 16
|
|
+#define AES_KEYSIZE_192 24
|
|
+#define AES_KEYSIZE_256 32
|
|
+#define CTX_ID_MAX_NUM 64
|
|
+#define CTX_ID_MAX_NUM_BYTES 512
|
|
+
|
|
+/* ECC */
|
|
+#define ECDH_IN_PARAM_NUM 2
|
|
+#define ECDH_OUT_PARAM_NUM 2
|
|
+#define ECC_SIGN_IN_PARAM_NUM 2
|
|
+#define ECC_SIGN_OUT_PARAM_NUM 2
|
|
+#define ECC_VERF_IN_PARAM_NUM 3
|
|
+#define ECC_PRIKEY_PARAM_NUM 7
|
|
+#define ECDH_HW_KEY_PARAM_NUM 5
|
|
+#define ECC_PUBKEY_PARAM_NUM 8
|
|
+#define SM2_KG_OUT_PARAM_NUM 3
|
|
+#define ECC_POINT_PARAM_NUM 2
|
|
+
|
|
+#define ECDH_HW_KEY_SZ(hsz) ((hsz) * ECDH_HW_KEY_PARAM_NUM)
|
|
+#define ECC_PRIKEY_SZ(hsz) ((hsz) * ECC_PRIKEY_PARAM_NUM)
|
|
+#define ECC_PUBKEY_SZ(hsz) ((hsz) * ECC_PUBKEY_PARAM_NUM)
|
|
+#define ECDH_OUT_PARAMS_SZ(hsz) ((hsz) * ECDH_OUT_PARAM_NUM)
|
|
+
|
|
+/* x25519/x448 */
|
|
+#define X_DH_OUT_PARAM_NUM 1
|
|
+#define X_DH_HW_KEY_PARAM_NUM 3
|
|
+
|
|
+#define X_DH_OUT_PARAMS_SZ(hsz) ((hsz) * X_DH_OUT_PARAM_NUM)
|
|
+#define X_DH_HW_KEY_SZ(hsz) ((hsz) * X_DH_HW_KEY_PARAM_NUM)
|
|
+#define SM2_KG_OUT_PARAMS_SZ(hsz) ((hsz) * SM2_KG_OUT_PARAM_NUM)
|
|
+#define BITS_TO_BYTES(bits) (((bits) + 7) >> 3)
|
|
+#define ECC_SIGN_IN_PARAMS_SZ(hsz) ((hsz) * ECC_SIGN_IN_PARAM_NUM)
|
|
+#define ECC_SIGN_OUT_PARAMS_SZ(hsz) ((hsz) * ECC_SIGN_OUT_PARAM_NUM)
|
|
+#define ECC_VERF_IN_PARAMS_SZ(hsz) ((hsz) * ECC_VERF_IN_PARAM_NUM)
|
|
+#define ECC_VERF_OUT_PARAMS_SZ 1
|
|
+
|
|
+/* Required compiler attributes */
|
|
+#define likely(x) __builtin_expect(!!(x), 1)
|
|
+#define unlikely(x) __builtin_expect(!!(x), 0)
|
|
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
|
+
|
|
+struct wd_lock {
|
|
+ __u8 lock;
|
|
+};
|
|
+
|
|
+struct wd_ss_region {
|
|
+ void *va;
|
|
+ unsigned long long pa;
|
|
+ size_t size;
|
|
+
|
|
+ TAILQ_ENTRY(wd_ss_region) next;
|
|
+};
|
|
+
|
|
+TAILQ_HEAD(wd_ss_region_list, wd_ss_region);
|
|
+
|
|
+struct q_info {
|
|
+ const char *hw_type;
|
|
+ int hw_type_id;
|
|
+ int ref;
|
|
+ void *priv; /* private data used by the drive layer */
|
|
+ const void *dev_info;
|
|
+ void *ss_va;
|
|
+ int fd;
|
|
+ int iommu_type;
|
|
+ struct wd_ss_region_list ss_list;
|
|
+ struct wd_ss_region_list *head;
|
|
+ unsigned int dev_flags;
|
|
+ unsigned long ss_size;
|
|
+ enum wcrypto_type atype;
|
|
+ int ctx_num;
|
|
+ struct wd_mm_br br;
|
|
+ struct wcrypto_hash_mt hash;
|
|
+ unsigned long qfrs_offset[WD_UACCE_QFRT_MAX];
|
|
+ struct wd_lock qlock;
|
|
+ __u8 ctx_id[WD_MAX_CTX_NUM];
|
|
+};
|
|
+
|
|
+struct wd_cookie_pool {
|
|
+ void *cookies;
|
|
+ __u8 *cstatus;
|
|
+ __u32 cookies_num;
|
|
+ __u32 cookies_size;
|
|
+ __u32 cid;
|
|
+};
|
|
+
|
|
+struct wd_dif_gen {
|
|
+ __u32 page_layout_gen_type:4;
|
|
+ __u32 grd_gen_type:4;
|
|
+ __u32 ver_gen_type:4;
|
|
+ __u32 app_gen_type:4;
|
|
+ __u32 ref_gen_type:4;
|
|
+ __u32 page_layout_pad_type:2;
|
|
+ __u32 reserved:10;
|
|
+};
|
|
+
|
|
+struct wd_dif_verify {
|
|
+ __u16 page_layout_pad_type:2;
|
|
+ __u16 grd_verify_type:4;
|
|
+ __u16 ref_verify_type:4;
|
|
+ __u16 reserved:6;
|
|
+};
|
|
+
|
|
+struct wd_dif_ctrl {
|
|
+ struct wd_dif_gen gen;
|
|
+ struct wd_dif_verify verify;
|
|
+ __u8 dif_comp_ctrl;
|
|
+};
|
|
+
|
|
+struct wd_dif {
|
|
+ __u64 lba;
|
|
+ __u32 priv_info;
|
|
+ __u8 ver;
|
|
+ __u8 app;
|
|
+ struct wd_dif_ctrl ctrl;
|
|
+};
|
|
+
|
|
+struct wd_sec_udata {
|
|
+ __u32 src_offset;
|
|
+ __u32 dst_offset;
|
|
+ struct wd_dif dif;
|
|
+ __u16 block_size;
|
|
+ __u16 gran_num;
|
|
+ __u16 key_bytes;
|
|
+ __u8 *key;
|
|
+};
|
|
+
|
|
+/* Digest tag format of Warpdrive */
|
|
+struct wcrypto_digest_tag {
|
|
+ struct wcrypto_cb_tag wcrypto_tag;
|
|
+ __u64 long_data_len;
|
|
+ void *priv;
|
|
+};
|
|
+
|
|
+/* Cipher tag format of Warpdrive */
|
|
+struct wcrypto_cipher_tag {
|
|
+ struct wcrypto_cb_tag wcrypto_tag;
|
|
+ void *priv;
|
|
+};
|
|
+
|
|
+/* AEAD tag format of Warpdrive */
|
|
+struct wcrypto_aead_tag {
|
|
+ struct wcrypto_cb_tag wcrypto_tag;
|
|
+ void *priv;
|
|
+};
|
|
+
|
|
+/* EC tag format of Warpdrive */
|
|
+struct wcrypto_ec_tag {
|
|
+ struct wcrypto_cb_tag wcrypto_tag;
|
|
+ __u64 tbl_addr;
|
|
+ void *priv;
|
|
+};
|
|
+
|
|
+/* COMP tag format of Warpdrive */
|
|
+struct wcrypto_comp_tag {
|
|
+ struct wcrypto_cb_tag wcrypto_tag;
|
|
+ void *priv;
|
|
+};
|
|
+
|
|
+/* ecc */
|
|
+struct wcrypto_ecc_pubkey {
|
|
+ struct wd_dtb p;
|
|
+ struct wd_dtb a;
|
|
+ struct wd_dtb b;
|
|
+ struct wd_dtb n;
|
|
+ struct wcrypto_ecc_point g;
|
|
+ struct wcrypto_ecc_point pub;
|
|
+ __u32 size;
|
|
+ void *data;
|
|
+};
|
|
+
|
|
+struct wcrypto_ecc_prikey {
|
|
+ struct wd_dtb p;
|
|
+ struct wd_dtb a;
|
|
+ struct wd_dtb d;
|
|
+ struct wd_dtb b;
|
|
+ struct wd_dtb n;
|
|
+ struct wcrypto_ecc_point g;
|
|
+ __u32 size;
|
|
+ void *data;
|
|
+};
|
|
+
|
|
+struct wcrypto_ecc_key {
|
|
+ struct wcrypto_ecc_pubkey *pubkey;
|
|
+ struct wcrypto_ecc_prikey *prikey;
|
|
+ struct wcrypto_ecc_curve *cv;
|
|
+ struct wcrypto_ecc_point *pub;
|
|
+ struct wd_dtb *d;
|
|
+};
|
|
+
|
|
+struct wcrypto_ecc_dh_in {
|
|
+ struct wcrypto_ecc_point pbk;
|
|
+};
|
|
+
|
|
+struct wcrypto_ecc_sign_in {
|
|
+ struct wd_dtb dgst; /* hash message */
|
|
+ struct wd_dtb k; /* random */
|
|
+ struct wd_dtb plaintext; /* original text before hash */
|
|
+ __u8 k_set; /* 1 - k parameter set 0 - not set */
|
|
+ __u8 dgst_set; /* 1 - dgst parameter set 0 - not set */
|
|
+};
|
|
+
|
|
+struct wcrypto_ecc_verf_in {
|
|
+ struct wd_dtb dgst; /* hash message */
|
|
+ struct wd_dtb s; /* signature s parameter */
|
|
+ struct wd_dtb r; /* signature r parameter */
|
|
+ struct wd_dtb plaintext; /* original text before hash */
|
|
+ __u8 dgst_set; /* 1 - dgst parameter set 0 - not set */
|
|
+};
|
|
+
|
|
+struct wcrypto_ecc_dh_out {
|
|
+ struct wcrypto_ecc_point out;
|
|
+};
|
|
+
|
|
+struct wcrypto_ecc_sign_out {
|
|
+ struct wd_dtb r; /* signature r parameter */
|
|
+ struct wd_dtb s; /* signature s parameter */
|
|
+};
|
|
+
|
|
+struct wcrypto_sm2_enc_in {
|
|
+ struct wd_dtb k; /* random */
|
|
+ struct wd_dtb plaintext; /* original text */
|
|
+ __u8 k_set; /* 0 - not set 1 - set */
|
|
+};
|
|
+
|
|
+struct wcrypto_sm2_enc_out {
|
|
+ struct wcrypto_ecc_point c1;
|
|
+ struct wd_dtb c2;
|
|
+ struct wd_dtb c3;
|
|
+};
|
|
+
|
|
+struct wcrypto_sm2_dec_in {
|
|
+ struct wcrypto_ecc_point c1;
|
|
+ struct wd_dtb c2;
|
|
+ struct wd_dtb c3;
|
|
+};
|
|
+
|
|
+struct wcrypto_sm2_kg_in {
|
|
+ struct wcrypto_ecc_point g;
|
|
+};
|
|
+
|
|
+struct wcrypto_sm2_dec_out {
|
|
+ struct wd_dtb plaintext;
|
|
+};
|
|
+
|
|
+struct wcrypto_sm2_kg_out {
|
|
+ struct wcrypto_ecc_point pub;
|
|
+ struct wd_dtb priv;
|
|
+};
|
|
+
|
|
+typedef union {
|
|
+ struct wcrypto_ecc_dh_in dh_in;
|
|
+ struct wcrypto_ecc_sign_in sin;
|
|
+ struct wcrypto_ecc_verf_in vin;
|
|
+ struct wcrypto_sm2_enc_in ein;
|
|
+ struct wcrypto_sm2_dec_in din;
|
|
+ struct wcrypto_sm2_kg_in kin;
|
|
+} wcrypto_ecc_in_param;
|
|
+
|
|
+typedef union {
|
|
+ struct wcrypto_ecc_dh_out dh_out;
|
|
+ struct wcrypto_ecc_sign_out sout;
|
|
+ struct wcrypto_sm2_enc_out eout;
|
|
+ struct wcrypto_sm2_dec_out dout;
|
|
+ struct wcrypto_sm2_kg_out kout;
|
|
+} wcrypto_ecc_out_param;
|
|
+
|
|
+struct wcrypto_ecc_in {
|
|
+ wcrypto_ecc_in_param param;
|
|
+ __u64 size;
|
|
+ char data[];
|
|
+};
|
|
+
|
|
+struct wcrypto_ecc_out {
|
|
+ wcrypto_ecc_out_param param;
|
|
+ __u64 size;
|
|
+ char data[];
|
|
+};
|
|
+
|
|
+#ifdef DEBUG_LOG
|
|
+#define dbg(msg, ...) fprintf(stderr, msg, ##__VA_ARGS__)
|
|
+#else
|
|
+#define dbg(msg, ...)
|
|
+#endif
|
|
+
|
|
+#ifdef DEBUG
|
|
+#define ASSERT(f) assert(f)
|
|
+#else
|
|
+#define ASSERT(f)
|
|
+#endif
|
|
+
|
|
+#if defined(__AARCH64_CMODEL_SMALL__) && __AARCH64_CMODEL_SMALL__
|
|
+#define dsb(opt) { asm volatile("dsb " #opt : : : "memory"); }
|
|
+#define rmb() dsb(ld) /* read fence */
|
|
+#define wmb() dsb(st) /* write fence */
|
|
+#define mb() dsb(sy) /* rw fence */
|
|
+#else
|
|
+#define rmb() __sync_synchronize() /* read fence */
|
|
+#define wmb() __sync_synchronize() /* write fence */
|
|
+#define mb() __sync_synchronize() /* rw fence */
|
|
+#endif
|
|
+
|
|
+static inline void wd_reg_write(void *reg_addr, uint32_t value)
|
|
+{
|
|
+ *((uint32_t *)reg_addr) = value;
|
|
+ wmb(); /* load fence */
|
|
+}
|
|
+
|
|
+static inline uint32_t wd_reg_read(void *reg_addr)
|
|
+{
|
|
+ uint32_t temp;
|
|
+
|
|
+ temp = *((uint32_t *)reg_addr);
|
|
+ rmb(); /* load fence */
|
|
+
|
|
+ return temp;
|
|
+}
|
|
+
|
|
+void wd_spinlock(struct wd_lock *lock);
|
|
+void wd_unspinlock(struct wd_lock *lock);
|
|
+void *wd_drv_mmap_qfr(struct wd_queue *q, enum uacce_qfrt qfrt, size_t size);
|
|
+void wd_drv_unmmap_qfr(struct wd_queue *q, void *addr,
|
|
+ enum uacce_qfrt qfrt, size_t size);
|
|
+void *drv_iova_map(struct wd_queue *q, void *va, size_t sz);
|
|
+void drv_iova_unmap(struct wd_queue *q, void *va, void *dma, size_t sz);
|
|
+int wd_init_cookie_pool(struct wd_cookie_pool *pool,
|
|
+ __u32 cookies_size, __u32 cookies_num);
|
|
+void wd_uninit_cookie_pool(struct wd_cookie_pool *pool);
|
|
+int wd_alloc_id(__u8 *buf, __u32 size, __u32 *id, __u32 last_id, __u32 id_max);
|
|
+void wd_free_id(__u8 *buf, __u32 size, __u32 id, __u32 id_max);
|
|
+int wd_get_cookies(struct wd_cookie_pool *pool, void **cookies, __u32 num);
|
|
+void wd_put_cookies(struct wd_cookie_pool *pool, void **cookies, __u32 num);
|
|
+const char *wd_get_drv(struct wd_queue *q);
|
|
+int wd_burst_send(struct wd_queue *q, void **req, __u32 num);
|
|
+int wd_burst_recv(struct wd_queue *q, void **resp, __u32 num);
|
|
+
|
|
+void drv_set_sgl_sge_pri(struct wd_sgl *sgl, int num, void *priv);
|
|
+void *drv_get_sgl_sge_pri(struct wd_sgl *sgl, int num);
|
|
+void drv_set_sgl_pri(struct wd_sgl *sgl, void *priv);
|
|
+void *drv_get_sgl_pri(struct wd_sgl *sgl);
|
|
+struct wd_mm_br *drv_get_br(void *pool);
|
|
+void wd_sgl_memset(struct wd_sgl *sgl, int ch);
|
|
+
|
|
+#endif
|
|
--
|
|
2.33.0
|
|
|