libclamav/unzip.h
50593e02
 /*
c442ca9c
  *  Copyright (C) 2013-2019 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
  *  Copyright (C) 2007-2013 Sourcefire, Inc.
2023340a
  *
  *  Authors: Alberto Wu
50593e02
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
  *  published by the Free Software Foundation.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  *  MA 02110-1301, USA.
  */
 
 #ifndef __UNZIP_H
 #define __UNZIP_H
 
 #if HAVE_CONFIG_H
 #include "clamav-config.h"
 #endif
 
c8c80ddf
 #include "others.h"
 
d39cb658
 typedef int (*zip_cb)(int fd, const char *filepath, cli_ctx *ctx);
23509742
 #define zip_scan_cb cli_magic_scandesc
 
c8c80ddf
 #define MAX_ZIP_REQUESTS 10
 struct zip_requests {
     const char *names[MAX_ZIP_REQUESTS];
     size_t namelens[MAX_ZIP_REQUESTS];
     int namecnt;
 
     uint32_t loff;
     int found, match;
 };
 
bd7f7684
 int cli_unzip(cli_ctx *);
23509742
 int cli_unzip_single_internal(cli_ctx *, off_t, zip_cb);
c8c80ddf
 int unzip_single_internal(cli_ctx *, off_t, zip_cb);
2d5dbc37
 int cli_unzip_single(cli_ctx *, off_t);
c8c80ddf
 
 int unzip_search_add(struct zip_requests *, const char *, size_t);
 int unzip_search(cli_ctx *, fmap_t *, struct zip_requests *);
 int unzip_search_single(cli_ctx *, const char *, size_t, uint32_t *);
 
50593e02
 
 #ifdef UNZIP_PRIVATE
 #define F_ENCR  (1<<0)
 #define F_ALGO1 (1<<1)
 #define F_ALGO2 (1<<2)
 #define F_USEDD (1<<3)
 #define F_RSVD1 (1<<4)
 #define F_PATCH (1<<5)
 #define F_STRNG (1<<6)
 #define F_UNUS1 (1<<7)
 #define F_UNUS2 (1<<8)
 #define F_UNUS3 (1<<9)
 #define F_UNUS4 (1<<10)
 #define F_UTF8  (1<<11)
 #define F_RSVD2 (1<<12)
 #define F_MSKED (1<<13)
 #define F_RSVD3 (1<<14)
 #define F_RSVD4 (1<<15)
 
 enum ALGO {
   ALG_STORED,
   ALG_SHRUNK,
   ALG_REDUCE1,
   ALG_REDUCE2,
   ALG_REDUCE3,
   ALG_REDUCE4,
   ALG_IMPLODE,
   ALG_TOKENZD,
   ALG_DEFLATE,
   ALG_DEFLATE64,
   ALG_OLDTERSE,
   ALG_RSVD1,
   ALG_BZIP2,
   ALG_RSVD2,
   ALG_LZMA,
   ALG_RSVD3,
   ALG_RSVD4,
   ALG_RSVD5,
   ALG_NEWTERSE,
   ALG_LZ77,
   ALG_WAVPACK = 97,
   ALG_PPMD
 };
 
 
 /* struct LH { */
 /*   uint32_t magic; */
 /*   uint16_t version; */
 /*   uint16_t flags; */
 /*   uint16_t method; */
 /*   uint32_t mtime; */
 /*   uint32_t crc32; */
 /*   uint32_t csize; */
 /*   uint32_t usize; */
 /*   uint16_t flen; */
 /*   uint16_t elen; */
 /*   char fname[flen] */
 /*   char extra[elen] */
 /* } __attribute__((packed)); */
 
 #define LH_magic	((uint32_t)cli_readint32((uint8_t *)(lh)+0))
 #define LH_version	((uint16_t)cli_readint16((uint8_t *)(lh)+4))
 #define LH_flags	((uint16_t)cli_readint16((uint8_t *)(lh)+6))
 #define LH_method	((uint16_t)cli_readint16((uint8_t *)(lh)+8))
 #define LH_mtime	((uint32_t)cli_readint32((uint8_t *)(lh)+10))
 #define LH_crc32	((uint32_t)cli_readint32((uint8_t *)(lh)+14))
 #define LH_csize	((uint32_t)cli_readint32((uint8_t *)(lh)+18))
 #define LH_usize	((uint32_t)cli_readint32((uint8_t *)(lh)+22))
 #define LH_flen 	((uint16_t)cli_readint16((uint8_t *)(lh)+26))
 #define LH_elen 	((uint16_t)cli_readint16((uint8_t *)(lh)+28))
 #define SIZEOF_LH 30
 
 /* struct CH { */
 /*   uint32_t magic; */
 /*   uint16_t vermade; */
 /*   uint16_t verneed; */
 /*   uint16_t flags; */
 /*   uint16_t method; */
 /*   uint32_t mtime; */
 /*   uint32_t crc32; */
 /*   uint32_t csize; */
 /*   uint32_t usize; */
 /*   uint16_t flen; */
 /*   uint16_t elen; */
 /*   uint16_t clen; */
 /*   uint16_t dsk; */
 /*   uint16_t iattrib; */
 /*   uint32_t eattrib; */
 /*   uint32_t off; */
 /*   char fname[flen] */
 /*   char extra[elen] */
 /*   char comment[clen] */
 /* } __attribute__((packed)); */
 
 #define CH_magic	((uint32_t)cli_readint32((uint8_t *)(ch)+0))
 #define CH_vermade	((uint16_t)cli_readint16((uint8_t *)(ch)+4))
 #define CH_verneed	((uint16_t)cli_readint16((uint8_t *)(ch)+6))
 #define CH_flags	((uint16_t)cli_readint16((uint8_t *)(ch)+8))
 #define CH_method	((uint16_t)cli_readint16((uint8_t *)(ch)+10))
 #define CH_mtime	((uint32_t)cli_readint32((uint8_t *)(ch)+12))
 #define CH_crc32	((uint32_t)cli_readint32((uint8_t *)(ch)+16))
 #define CH_csize	((uint32_t)cli_readint32((uint8_t *)(ch)+20))
 #define CH_usize	((uint32_t)cli_readint32((uint8_t *)(ch)+24))
 #define CH_flen 	((uint16_t)cli_readint16((uint8_t *)(ch)+28))
 #define CH_elen 	((uint16_t)cli_readint16((uint8_t *)(ch)+30))
 #define CH_clen 	((uint16_t)cli_readint16((uint8_t *)(ch)+32))
 #define CH_dsk  	((uint16_t)cli_readint16((uint8_t *)(ch)+34))
 #define CH_iattrib	((uint16_t)cli_readint16((uint8_t *)(ch)+36))
 #define CH_eattrib	((uint32_t)cli_readint32((uint8_t *)(ch)+38))
 #define CH_off  	((uint32_t)cli_readint32((uint8_t *)(ch)+42))
 #define SIZEOF_CH 46
a60ec799
 
 #define SIZEOF_EH 12
50593e02
 #endif /* UNZIP_PRIVATE */
 
 #endif /* __UNZIP_H */