/src/lzma-fuzz/sdk/C/Xz.c
Line  | Count  | Source  | 
1  |  | /* Xz.c - Xz  | 
2  |  | 2017-05-12 : Igor Pavlov : Public domain */  | 
3  |  |  | 
4  |  | #include "Precomp.h"  | 
5  |  |  | 
6  |  | #include "7zCrc.h"  | 
7  |  | #include "CpuArch.h"  | 
8  |  | #include "Xz.h"  | 
9  |  | #include "XzCrc64.h"  | 
10  |  |  | 
11  |  | const Byte XZ_SIG[XZ_SIG_SIZE] = { 0xFD, '7', 'z', 'X', 'Z', 0 }; | 
12  |  | /* const Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE] = { 'Y', 'Z' }; */ | 
13  |  |  | 
14  |  | unsigned Xz_WriteVarInt(Byte *buf, UInt64 v)  | 
15  | 68.2k  | { | 
16  | 68.2k  |   unsigned i = 0;  | 
17  | 68.2k  |   do  | 
18  | 182k  |   { | 
19  | 182k  |     buf[i++] = (Byte)((v & 0x7F) | 0x80);  | 
20  | 182k  |     v >>= 7;  | 
21  | 182k  |   }  | 
22  | 182k  |   while (v != 0);  | 
23  | 68.2k  |   buf[(size_t)i - 1] &= 0x7F;  | 
24  | 68.2k  |   return i;  | 
25  | 68.2k  | }  | 
26  |  |  | 
27  |  | void Xz_Construct(CXzStream *p)  | 
28  | 0  | { | 
29  | 0  |   p->numBlocks = 0;  | 
30  | 0  |   p->blocks = NULL;  | 
31  | 0  |   p->flags = 0;  | 
32  | 0  | }  | 
33  |  |  | 
34  |  | void Xz_Free(CXzStream *p, ISzAllocPtr alloc)  | 
35  | 0  | { | 
36  | 0  |   ISzAlloc_Free(alloc, p->blocks);  | 
37  | 0  |   p->numBlocks = 0;  | 
38  | 0  |   p->blocks = NULL;  | 
39  | 0  | }  | 
40  |  |  | 
41  |  | unsigned XzFlags_GetCheckSize(CXzStreamFlags f)  | 
42  | 19.0k  | { | 
43  | 19.0k  |   unsigned t = XzFlags_GetCheckType(f);  | 
44  | 19.0k  |   return (t == 0) ? 0 : (4 << ((t - 1) / 3));  | 
45  | 19.0k  | }  | 
46  |  |  | 
47  |  | void XzCheck_Init(CXzCheck *p, unsigned mode)  | 
48  | 12.6k  | { | 
49  | 12.6k  |   p->mode = mode;  | 
50  | 12.6k  |   switch (mode)  | 
51  | 12.6k  |   { | 
52  | 8.14k  |     case XZ_CHECK_CRC32: p->crc = CRC_INIT_VAL; break;  | 
53  | 744  |     case XZ_CHECK_CRC64: p->crc64 = CRC64_INIT_VAL; break;  | 
54  | 1.22k  |     case XZ_CHECK_SHA256: Sha256_Init(&p->sha); break;  | 
55  | 12.6k  |   }  | 
56  | 12.6k  | }  | 
57  |  |  | 
58  |  | void XzCheck_Update(CXzCheck *p, const void *data, size_t size)  | 
59  | 19.7k  | { | 
60  | 19.7k  |   switch (p->mode)  | 
61  | 19.7k  |   { | 
62  | 12.5k  |     case XZ_CHECK_CRC32: p->crc = CrcUpdate(p->crc, data, size); break;  | 
63  | 1.24k  |     case XZ_CHECK_CRC64: p->crc64 = Crc64Update(p->crc64, data, size); break;  | 
64  | 1.99k  |     case XZ_CHECK_SHA256: Sha256_Update(&p->sha, (const Byte *)data, size); break;  | 
65  | 19.7k  |   }  | 
66  | 19.7k  | }  | 
67  |  |  | 
68  |  | int XzCheck_Final(CXzCheck *p, Byte *digest)  | 
69  | 12.6k  | { | 
70  | 12.6k  |   switch (p->mode)  | 
71  | 12.6k  |   { | 
72  | 8.14k  |     case XZ_CHECK_CRC32:  | 
73  | 8.14k  |       SetUi32(digest, CRC_GET_DIGEST(p->crc));  | 
74  | 8.14k  |       break;  | 
75  | 744  |     case XZ_CHECK_CRC64:  | 
76  | 744  |     { | 
77  | 744  |       int i;  | 
78  | 744  |       UInt64 v = CRC64_GET_DIGEST(p->crc64);  | 
79  | 6.69k  |       for (i = 0; i < 8; i++, v >>= 8)  | 
80  | 5.95k  |         digest[i] = (Byte)(v & 0xFF);  | 
81  | 744  |       break;  | 
82  | 0  |     }  | 
83  | 1.22k  |     case XZ_CHECK_SHA256:  | 
84  | 1.22k  |       Sha256_Final(&p->sha, digest);  | 
85  | 1.22k  |       break;  | 
86  | 2.57k  |     default:  | 
87  | 2.57k  |       return 0;  | 
88  | 12.6k  |   }  | 
89  | 10.1k  |   return 1;  | 
90  | 12.6k  | }  |