Annotation of truecrypt/boot/windows/decompressor.c, revision 1.1

1.1     ! root        1: /*
        !             2:   puff.c
        !             3:   Copyright (C) 2002-2004 Mark Adler, all rights reserved
        !             4:   version 1.8, 9 Jan 2004
        !             5: 
        !             6:   This software is provided 'as-is', without any express or implied
        !             7:   warranty.  In no event will the author be held liable for any damages
        !             8:   arising from the use of this software.
        !             9: 
        !            10:   Permission is granted to anyone to use this software for any purpose,
        !            11:   including commercial applications, and to alter it and redistribute it
        !            12:   freely, subject to the following restrictions:
        !            13: 
        !            14:   1. The origin of this software must not be misrepresented; you must not
        !            15:      claim that you wrote the original software. If you use this software
        !            16:      in a product, an acknowledgment in the product documentation would be
        !            17:      appreciated but is not required.
        !            18:   2. Altered source versions must be plainly marked as such, and must not be
        !            19:      misrepresented as being the original software.
        !            20:   3. This notice may not be removed or altered from any source distribution.
        !            21: 
        !            22:   Mark Adler    [email protected]
        !            23: */
        !            24: 
        !            25: /* Adapted by TrueCrypt Foundation */
        !            26: 
        !            27: 
        !            28: #define local static            /* for local function definitions */
        !            29: #define NIL ((unsigned char *)0)        /* for no output option */
        !            30: 
        !            31: /*
        !            32:  * Maximums for allocations and loops.  It is not useful to change these --
        !            33:  * they are fixed by the deflate format.
        !            34:  */
        !            35: #define MAXBITS 15              /* maximum bits in a code */
        !            36: #define MAXLCODES 286           /* maximum number of literal/length codes */
        !            37: #define MAXDCODES 30            /* maximum number of distance codes */
        !            38: #define MAXCODES (MAXLCODES+MAXDCODES)  /* maximum codes lengths to read */
        !            39: #define FIXLCODES 288           /* number of fixed literal/length codes */
        !            40: 
        !            41: /* input and output state */
        !            42: struct state {
        !            43:     /* output state */
        !            44:     unsigned char *out;         /* output buffer */
        !            45:     unsigned int outlen;       /* available space at out */
        !            46:     unsigned int outcnt;       /* bytes written to out so far */
        !            47: 
        !            48:     /* input state */
        !            49:     unsigned char *in;          /* input buffer */
        !            50:     unsigned int incnt;        /* bytes read so far */
        !            51:     int bitbuf;                 /* bit buffer */
        !            52:     int bitcnt;                 /* number of bits in bit buffer */
        !            53: };
        !            54: 
        !            55: 
        !            56: local int bits(struct state *s, int need)
        !            57: {
        !            58:     long val;           /* bit accumulator (can use up to 20 bits) */
        !            59: 
        !            60:     /* load at least need bits into val */
        !            61:     val = s->bitbuf;
        !            62:     while (s->bitcnt < need) {
        !            63:         val |= (long)(s->in[s->incnt++]) << s->bitcnt;  /* load eight bits */
        !            64:         s->bitcnt += 8;
        !            65:     }
        !            66: 
        !            67:     /* drop need bits and update buffer, always zero to seven bits left */
        !            68:     s->bitbuf = (int)(val >> need);
        !            69:     s->bitcnt -= need;
        !            70: 
        !            71:     /* return need bits, zeroing the bits above that */
        !            72:     return (int)(val & ((1L << need) - 1));
        !            73: }
        !            74: 
        !            75: 
        !            76: local int stored(struct state *s)
        !            77: {
        !            78:     unsigned len;       /* length of stored block */
        !            79: 
        !            80:     /* discard leftover bits from current byte (assumes s->bitcnt < 8) */
        !            81:     s->bitbuf = 0;
        !            82:     s->bitcnt = 0;
        !            83: 
        !            84:     /* get length and check against its one's complement */
        !            85:     len = s->in[s->incnt++];
        !            86:     len |= s->in[s->incnt++] << 8;
        !            87:     if (s->in[s->incnt++] != (~len & 0xff) ||
        !            88:         s->in[s->incnt++] != ((~len >> 8) & 0xff))
        !            89:         return -2;                              /* didn't match complement! */
        !            90: 
        !            91:     /* copy len bytes from in to out */
        !            92:     if (s->out != NIL) {
        !            93:         if (s->outcnt + len > s->outlen)
        !            94:             return 1;                           /* not enough output space */
        !            95:         while (len--)
        !            96:             s->out[s->outcnt++] = s->in[s->incnt++];
        !            97:     }
        !            98:     else {                                      /* just scanning */
        !            99:         s->outcnt += len;
        !           100:         s->incnt += len;
        !           101:     }
        !           102: 
        !           103:     /* done with a valid stored block */
        !           104:     return 0;
        !           105: }
        !           106: 
        !           107: 
        !           108: struct huffman {
        !           109:     short *count;       /* number of symbols of each length */
        !           110:     short *symbol;      /* canonically ordered symbols */
        !           111: };
        !           112: 
        !           113: 
        !           114: #ifdef SLOW
        !           115: local int decode(struct state *s, struct huffman *h)
        !           116: {
        !           117:     int len;            /* current number of bits in code */
        !           118:     int code;           /* len bits being decoded */
        !           119:     int first;          /* first code of length len */
        !           120:     int count;          /* number of codes of length len */
        !           121:     int index;          /* index of first code of length len in symbol table */
        !           122: 
        !           123:     code = first = index = 0;
        !           124:     for (len = 1; len <= MAXBITS; len++) {
        !           125:         code |= bits(s, 1);             /* get next bit */
        !           126:         count = h->count[len];
        !           127:         if (code < first + count)       /* if length len, return symbol */
        !           128:             return h->symbol[index + (code - first)];
        !           129:         index += count;                 /* else update for next length */
        !           130:         first += count;
        !           131:         first <<= 1;
        !           132:         code <<= 1;
        !           133:     }
        !           134:     return -9;                          /* ran out of codes */
        !           135: }
        !           136: 
        !           137: /*
        !           138:  * A faster version of decode() for real applications of this code.   It's not
        !           139:  * as readable, but it makes puff() twice as fast.  And it only makes the code
        !           140:  * a few percent larger.
        !           141:  */
        !           142: #else /* !SLOW */
        !           143: local int decode(struct state *s, struct huffman *h)
        !           144: {
        !           145:     int len;            /* current number of bits in code */
        !           146:     int code;           /* len bits being decoded */
        !           147:     int first;          /* first code of length len */
        !           148:     int count;          /* number of codes of length len */
        !           149:     int index;          /* index of first code of length len in symbol table */
        !           150:     int bitbuf;         /* bits from stream */
        !           151:     int left;           /* bits left in next or left to process */
        !           152:     short *next;        /* next number of codes */
        !           153: 
        !           154:     bitbuf = s->bitbuf;
        !           155:     left = s->bitcnt;
        !           156:     code = first = index = 0;
        !           157:     len = 1;
        !           158:     next = h->count + 1;
        !           159:     while (1) {
        !           160:         while (left--) {
        !           161:             code |= bitbuf & 1;
        !           162:             bitbuf >>= 1;
        !           163:             count = *next++;
        !           164:             if (code < first + count) { /* if length len, return symbol */
        !           165:                 s->bitbuf = bitbuf;
        !           166:                 s->bitcnt = (s->bitcnt - len) & 7;
        !           167:                 return h->symbol[index + (code - first)];
        !           168:             }
        !           169:             index += count;             /* else update for next length */
        !           170:             first += count;
        !           171:             first <<= 1;
        !           172:             code <<= 1;
        !           173:             len++;
        !           174:         }
        !           175:         left = (MAXBITS+1) - len;
        !           176:         if (left == 0) break;
        !           177:         bitbuf = s->in[s->incnt++];
        !           178:         if (left > 8) left = 8;
        !           179:     }
        !           180:     return -9;                          /* ran out of codes */
        !           181: }
        !           182: #endif /* SLOW */
        !           183: 
        !           184: 
        !           185: local int construct(struct huffman *h, short *length, int n)
        !           186: {
        !           187:     int symbol;         /* current symbol when stepping through length[] */
        !           188:     int len;            /* current length when stepping through h->count[] */
        !           189:     int left;           /* number of possible codes left of current length */
        !           190:     short offs[MAXBITS+1];      /* offsets in symbol table for each length */
        !           191: 
        !           192:     /* count number of codes of each length */
        !           193:     for (len = 0; len <= MAXBITS; len++)
        !           194:         h->count[len] = 0;
        !           195:     for (symbol = 0; symbol < n; symbol++)
        !           196:         (h->count[length[symbol]])++;   /* assumes lengths are within bounds */
        !           197:     if (h->count[0] == n)               /* no codes! */
        !           198:         return 0;                       /* complete, but decode() will fail */
        !           199: 
        !           200:     /* check for an over-subscribed or incomplete set of lengths */
        !           201:     left = 1;                           /* one possible code of zero length */
        !           202:     for (len = 1; len <= MAXBITS; len++) {
        !           203:         left <<= 1;                     /* one more bit, double codes left */
        !           204:         left -= h->count[len];          /* deduct count from possible codes */
        !           205:         if (left < 0) return left;      /* over-subscribed--return negative */
        !           206:     }                                   /* left > 0 means incomplete */
        !           207: 
        !           208:     /* generate offsets into symbol table for each length for sorting */
        !           209:     offs[1] = 0;
        !           210:     for (len = 1; len < MAXBITS; len++)
        !           211:         offs[len + 1] = offs[len] + h->count[len];
        !           212: 
        !           213:     /*
        !           214:      * put symbols in table sorted by length, by symbol order within each
        !           215:      * length
        !           216:      */
        !           217:     for (symbol = 0; symbol < n; symbol++)
        !           218:         if (length[symbol] != 0)
        !           219:             h->symbol[offs[length[symbol]]++] = symbol;
        !           220: 
        !           221:     /* return zero for complete set, positive for incomplete set */
        !           222:     return left;
        !           223: }
        !           224: 
        !           225: 
        !           226: local int codes(struct state *s,
        !           227:                 struct huffman *lencode,
        !           228:                 struct huffman *distcode)
        !           229: {
        !           230:     int symbol;         /* decoded symbol */
        !           231:     int len;            /* length for copy */
        !           232:     unsigned dist;      /* distance for copy */
        !           233:     static const short lens[29] = { /* Size base for length codes 257..285 */
        !           234:         3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
        !           235:         35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258};
        !           236:     static const short lext[29] = { /* Extra bits for length codes 257..285 */
        !           237:         0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
        !           238:         3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0};
        !           239:     static const short dists[30] = { /* Offset base for distance codes 0..29 */
        !           240:         1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
        !           241:         257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
        !           242:         8193, 12289, 16385, 24577};
        !           243:     static const short dext[30] = { /* Extra bits for distance codes 0..29 */
        !           244:         0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
        !           245:         7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
        !           246:         12, 12, 13, 13};
        !           247: 
        !           248:     /* decode literals and length/distance pairs */
        !           249:     do {
        !           250:         symbol = decode(s, lencode);
        !           251:         if (symbol < 0) return symbol;  /* invalid symbol */
        !           252:         if (symbol < 256) {             /* literal: symbol is the byte */
        !           253:             /* write out the literal */
        !           254:             if (s->out != NIL) {
        !           255:                 if (s->outcnt == s->outlen) return 1;
        !           256:                 s->out[s->outcnt] = symbol;
        !           257:             }
        !           258:             s->outcnt++;
        !           259:         }
        !           260:         else if (symbol > 256) {        /* length */
        !           261:             /* get and compute length */
        !           262:             symbol -= 257;
        !           263:             if (symbol >= 29) return -9;        /* invalid fixed code */
        !           264:             len = lens[symbol] + bits(s, lext[symbol]);
        !           265: 
        !           266:             /* get and check distance */
        !           267:             symbol = decode(s, distcode);
        !           268:             if (symbol < 0) return symbol;      /* invalid symbol */
        !           269:             dist = dists[symbol] + bits(s, dext[symbol]);
        !           270:             if (dist > s->outcnt)
        !           271:                 return -10;     /* distance too far back */
        !           272: 
        !           273:             /* copy length bytes from distance bytes back */
        !           274:             if (s->out != NIL) {
        !           275:                 if (s->outcnt + len > s->outlen) return 1;
        !           276:                 while (len--) {
        !           277:                     s->out[s->outcnt] = s->out[s->outcnt - dist];
        !           278:                     s->outcnt++;
        !           279:                 }
        !           280:             }
        !           281:             else
        !           282:                 s->outcnt += len;
        !           283:         }
        !           284:     } while (symbol != 256);            /* end of block symbol */
        !           285: 
        !           286:     /* done with a valid fixed or dynamic block */
        !           287:     return 0;
        !           288: }
        !           289: 
        !           290: 
        !           291: local int fixed(struct state *s)
        !           292: {
        !           293:     static int virgin = 1;
        !           294:     static short lencnt[MAXBITS+1], lensym[FIXLCODES];
        !           295:     static short distcnt[MAXBITS+1], distsym[MAXDCODES];
        !           296:     static struct huffman lencode = {lencnt, lensym};
        !           297:     static struct huffman distcode = {distcnt, distsym};
        !           298: 
        !           299:     /* build fixed huffman tables if first call (may not be thread safe) */
        !           300:     if (virgin) {
        !           301:         int symbol;
        !           302:         short lengths[FIXLCODES];
        !           303: 
        !           304:         /* literal/length table */
        !           305:         for (symbol = 0; symbol < 144; symbol++)
        !           306:             lengths[symbol] = 8;
        !           307:         for (; symbol < 256; symbol++)
        !           308:             lengths[symbol] = 9;
        !           309:         for (; symbol < 280; symbol++)
        !           310:             lengths[symbol] = 7;
        !           311:         for (; symbol < FIXLCODES; symbol++)
        !           312:             lengths[symbol] = 8;
        !           313:         construct(&lencode, lengths, FIXLCODES);
        !           314: 
        !           315:         /* distance table */
        !           316:         for (symbol = 0; symbol < MAXDCODES; symbol++)
        !           317:             lengths[symbol] = 5;
        !           318:         construct(&distcode, lengths, MAXDCODES);
        !           319: 
        !           320:         /* do this just once */
        !           321:         virgin = 0;
        !           322:     }
        !           323: 
        !           324:     /* decode data until end-of-block code */
        !           325:     return codes(s, &lencode, &distcode);
        !           326: }
        !           327: 
        !           328: 
        !           329: local int dynamic(struct state *s)
        !           330: {
        !           331:     int nlen, ndist, ncode;             /* number of lengths in descriptor */
        !           332:     int index;                          /* index of lengths[] */
        !           333:     int err;                            /* construct() return value */
        !           334:     short lengths[MAXCODES];            /* descriptor code lengths */
        !           335:     short lencnt[MAXBITS+1], lensym[MAXLCODES];         /* lencode memory */
        !           336:     short distcnt[MAXBITS+1], distsym[MAXDCODES];       /* distcode memory */
        !           337:     struct huffman lencode = {lencnt, lensym};          /* length code */
        !           338:     struct huffman distcode = {distcnt, distsym};       /* distance code */
        !           339:     static const short order[19] =      /* permutation of code length codes */
        !           340:         {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
        !           341: 
        !           342:     /* get number of lengths in each table, check lengths */
        !           343:     nlen = bits(s, 5) + 257;
        !           344:     ndist = bits(s, 5) + 1;
        !           345:     ncode = bits(s, 4) + 4;
        !           346:     if (nlen > MAXLCODES || ndist > MAXDCODES)
        !           347:         return -3;                      /* bad counts */
        !           348: 
        !           349:     /* read code length code lengths (really), missing lengths are zero */
        !           350:     for (index = 0; index < ncode; index++)
        !           351:         lengths[order[index]] = bits(s, 3);
        !           352:     for (; index < 19; index++)
        !           353:         lengths[order[index]] = 0;
        !           354: 
        !           355:     /* build huffman table for code lengths codes (use lencode temporarily) */
        !           356:     err = construct(&lencode, lengths, 19);
        !           357:     if (err != 0) return -4;            /* require complete code set here */
        !           358: 
        !           359:     /* read length/literal and distance code length tables */
        !           360:     index = 0;
        !           361:     while (index < nlen + ndist) {
        !           362:         int symbol;             /* decoded value */
        !           363:         int len;                /* last length to repeat */
        !           364: 
        !           365:         symbol = decode(s, &lencode);
        !           366:         if (symbol < 16)                /* length in 0..15 */
        !           367:             lengths[index++] = symbol;
        !           368:         else {                          /* repeat instruction */
        !           369:             len = 0;                    /* assume repeating zeros */
        !           370:             if (symbol == 16) {         /* repeat last length 3..6 times */
        !           371:                 if (index == 0) return -5;      /* no last length! */
        !           372:                 len = lengths[index - 1];       /* last length */
        !           373:                 symbol = 3 + bits(s, 2);
        !           374:             }
        !           375:             else if (symbol == 17)      /* repeat zero 3..10 times */
        !           376:                 symbol = 3 + bits(s, 3);
        !           377:             else                        /* == 18, repeat zero 11..138 times */
        !           378:                 symbol = 11 + bits(s, 7);
        !           379:             if (index + symbol > nlen + ndist)
        !           380:                 return -6;              /* too many lengths! */
        !           381:             while (symbol--)            /* repeat last or zero symbol times */
        !           382:                 lengths[index++] = len;
        !           383:         }
        !           384:     }
        !           385: 
        !           386:     /* build huffman table for literal/length codes */
        !           387:     err = construct(&lencode, lengths, nlen);
        !           388:     if (err < 0 || (err > 0 && nlen - lencode.count[0] != 1))
        !           389:         return -7;      /* only allow incomplete codes if just one code */
        !           390: 
        !           391:     /* build huffman table for distance codes */
        !           392:     err = construct(&distcode, lengths + nlen, ndist);
        !           393:     if (err < 0 || (err > 0 && ndist - distcode.count[0] != 1))
        !           394:         return -8;      /* only allow incomplete codes if just one code */
        !           395: 
        !           396:     /* decode data until end-of-block code */
        !           397:     return codes(s, &lencode, &distcode);
        !           398: }
        !           399: 
        !           400: 
        !           401: void _acrtused () { }
        !           402: 
        !           403: // Decompress deflated data
        !           404: int far main (
        !           405:          unsigned char *dest,         /* pointer to destination pointer */
        !           406:          unsigned int destlen,        /* amount of output space */
        !           407:          unsigned char *source)       /* pointer to source data pointer */
        !           408: {
        !           409:     struct state s;             /* input/output state */
        !           410:     int last, type;             /* block information */
        !           411:     int err;                    /* return value */
        !           412: 
        !           413:     /* initialize output state */
        !           414:     s.out = dest;
        !           415:     s.outlen = destlen;                /* ignored if dest is NIL */
        !           416:     s.outcnt = 0;
        !           417: 
        !           418:     /* initialize input state */
        !           419:     s.in = source;
        !           420:     s.incnt = 0;
        !           421:     s.bitbuf = 0;
        !           422:     s.bitcnt = 0;
        !           423: 
        !           424:        /* process blocks until last block or error */
        !           425:        do {
        !           426:                last = bits(&s, 1);         /* one if last block */
        !           427:                type = bits(&s, 2);         /* block type 0..3 */
        !           428:                err = type == 0 ? stored(&s) :
        !           429:                        (type == 1 ? fixed(&s) :
        !           430:                        (type == 2 ? dynamic(&s) :
        !           431:                        -1));               /* type == 3, invalid */
        !           432:                if (err != 0) break;        /* return with error */
        !           433:        } while (!last);
        !           434: 
        !           435:        return err;
        !           436: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.