ClamAV  1.4.3
ClamAV open source email, web, and end-point anti-virus toolkit.
clamav.h
1 /*
2  * Copyright (C) 2013-2024 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
3  * Copyright (C) 2007-2013 Sourcefire, Inc.
4  *
5  * Authors: Tomasz Kojm
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  * MA 02110-1301, USA.
20  */
21 
22 #ifndef __CLAMAV_H
23 #define __CLAMAV_H
24 
25 #ifdef _WIN32
26 #ifndef OWN_WINSOCK
27 #include <winsock2.h>
28 #endif
29 #endif
30 
31 #include <openssl/ssl.h>
32 #include <openssl/err.h>
33 
34 /* Certain OSs already use 64bit variables in their stat struct */
35 #if (!defined(__FreeBSD__) && !defined(__APPLE__))
36 #define STAT64_OK 1
37 #else
38 #define STAT64_OK 0
39 #endif
40 
41 #if defined(HAVE_STAT64) && STAT64_OK
42 
43 #include <unistd.h>
44 
45 #define STATBUF struct stat64
46 #define CLAMSTAT stat64
47 #define LSTAT lstat64
48 #define FSTAT fstat64
49 #define safe_open(a, b) open(a, b | O_LARGEFILE)
50 
51 #else
52 
53 #define STATBUF struct stat
54 #define CLAMSTAT stat
55 #define LSTAT lstat
56 #define FSTAT fstat
57 /* Nothing is safe in windows, not even open, safe_open defined under /win32 */
58 #ifndef _WIN32
59 #define safe_open open
60 #endif
61 
62 #endif
63 
64 #define UNUSEDPARAM(x) (void)(x)
65 
66 #include <sys/types.h>
67 #include <sys/stat.h>
68 #include <stdbool.h>
69 
70 #include "clamav-types.h"
71 #include "clamav-version.h"
72 
73 #ifdef __cplusplus
74 extern "C" {
75 #endif
76 
77 #define CL_COUNT_PRECISION 4096
78 
79 /* return codes */
80 typedef enum cl_error_t {
81  /* libclamav specific */
82  CL_CLEAN = 0,
83  CL_SUCCESS = 0,
84  CL_VIRUS,
85  CL_ENULLARG,
86  CL_EARG,
87  CL_EMALFDB,
88  CL_ECVD,
89  CL_EVERIFY,
90  CL_EUNPACK,
91 
92  /* I/O and memory errors */
93  CL_EOPEN,
94  CL_ECREAT,
95  CL_EUNLINK,
96  CL_ESTAT,
97  CL_EREAD,
98  CL_ESEEK,
99  CL_EWRITE,
100  CL_EDUP,
101  CL_EACCES,
102  CL_ETMPFILE,
103  CL_ETMPDIR,
104  CL_EMAP,
105  CL_EMEM,
106  CL_ETIMEOUT,
107 
108  /* internal (not reported outside libclamav) */
109  CL_BREAK,
110  CL_EMAXREC,
111  CL_EMAXSIZE,
112  CL_EMAXFILES,
113  CL_EFORMAT,
114  CL_EPARSE,
115  CL_EBYTECODE, /* may be reported in testmode */
116  CL_EBYTECODE_TESTFAIL, /* may be reported in testmode */
117 
118  /* c4w error codes */
119  CL_ELOCK,
120  CL_EBUSY,
121  CL_ESTATE,
122 
123  CL_VERIFIED, /* The binary has been deemed trusted */
124  CL_ERROR, /* Unspecified / generic error */
125 
126  /* no error codes below this line please */
127  CL_ELAST_ERROR
128 } cl_error_t;
129 
130 /* db options */
131 // clang-format off
132 #define CL_DB_PHISHING 0x2
133 #define CL_DB_PHISHING_URLS 0x8
134 #define CL_DB_PUA 0x10
135 #define CL_DB_CVDNOTMP 0x20 /* obsolete */
136 #define CL_DB_OFFICIAL 0x40 /* internal */
137 #define CL_DB_PUA_MODE 0x80
138 #define CL_DB_PUA_INCLUDE 0x100
139 #define CL_DB_PUA_EXCLUDE 0x200
140 #define CL_DB_COMPILED 0x400 /* internal */
141 #define CL_DB_DIRECTORY 0x800 /* internal */
142 #define CL_DB_OFFICIAL_ONLY 0x1000
143 #define CL_DB_BYTECODE 0x2000
144 #define CL_DB_SIGNED 0x4000 /* internal */
145 #define CL_DB_BYTECODE_UNSIGNED 0x8000 /* Caution: You should never run bytecode signatures from untrusted sources. Doing so may result in arbitrary code execution. */
146 #define CL_DB_UNSIGNED 0x10000 /* internal */
147 #define CL_DB_BYTECODE_STATS 0x20000
148 #define CL_DB_ENHANCED 0x40000
149 #define CL_DB_PCRE_STATS 0x80000
150 #define CL_DB_YARA_EXCLUDE 0x100000
151 #define CL_DB_YARA_ONLY 0x200000
152 
153 /* recommended db settings */
154 #define CL_DB_STDOPT (CL_DB_PHISHING | CL_DB_PHISHING_URLS | CL_DB_BYTECODE)
155 
156 /*** scan options ***/
158  uint32_t general;
159  uint32_t parse;
160  uint32_t heuristic;
161  uint32_t mail;
162  uint32_t dev;
163 };
164 
165 /* general */
166 #define CL_SCAN_GENERAL_ALLMATCHES 0x1 /* scan in all-match mode */
167 #define CL_SCAN_GENERAL_COLLECT_METADATA 0x2 /* collect metadata (--gen-json) */
168 #define CL_SCAN_GENERAL_HEURISTICS 0x4 /* option to enable heuristic alerts */
169 #define CL_SCAN_GENERAL_HEURISTIC_PRECEDENCE 0x8 /* allow heuristic match to take precedence. */
170 #define CL_SCAN_GENERAL_UNPRIVILEGED 0x10 /* scanner will not have read access to files. */
171 
172 /* parsing capabilities options */
173 #define CL_SCAN_PARSE_ARCHIVE 0x1
174 #define CL_SCAN_PARSE_ELF 0x2
175 #define CL_SCAN_PARSE_PDF 0x4
176 #define CL_SCAN_PARSE_SWF 0x8
177 #define CL_SCAN_PARSE_HWP3 0x10
178 #define CL_SCAN_PARSE_XMLDOCS 0x20
179 #define CL_SCAN_PARSE_MAIL 0x40
180 #define CL_SCAN_PARSE_OLE2 0x80
181 #define CL_SCAN_PARSE_HTML 0x100
182 #define CL_SCAN_PARSE_PE 0x200
183 #define CL_SCAN_PARSE_ONENOTE 0x400
184 #define CL_SCAN_PARSE_IMAGE 0x800 /* option to enable/disable parsing images (graphics) */
185 #define CL_SCAN_PARSE_IMAGE_FUZZY_HASH 0x1000 /* option to enable/disable image fuzzy hash calculation. */
186 
187 /* heuristic alerting options */
188 #define CL_SCAN_HEURISTIC_BROKEN 0x2 /* alert on broken PE and broken ELF files */
189 #define CL_SCAN_HEURISTIC_EXCEEDS_MAX 0x4 /* alert when files exceed scan limits (filesize, max scansize, or max recursion depth) */
190 #define CL_SCAN_HEURISTIC_PHISHING_SSL_MISMATCH 0x8 /* alert on SSL mismatches */
191 #define CL_SCAN_HEURISTIC_PHISHING_CLOAK 0x10 /* alert on cloaked URLs in emails */
192 #define CL_SCAN_HEURISTIC_MACROS 0x20 /* alert on OLE2 files containing macros */
193 #define CL_SCAN_HEURISTIC_ENCRYPTED_ARCHIVE 0x40 /* alert if archive is encrypted (rar, zip, etc) */
194 #define CL_SCAN_HEURISTIC_ENCRYPTED_DOC 0x80 /* alert if a document is encrypted (pdf, docx, etc) */
195 #define CL_SCAN_HEURISTIC_PARTITION_INTXN 0x100 /* alert if partition table size doesn't make sense */
196 #define CL_SCAN_HEURISTIC_STRUCTURED 0x200 /* data loss prevention options, i.e. alert when detecting personal information */
197 #define CL_SCAN_HEURISTIC_STRUCTURED_SSN_NORMAL 0x400 /* alert when detecting social security numbers */
198 #define CL_SCAN_HEURISTIC_STRUCTURED_SSN_STRIPPED 0x800 /* alert when detecting stripped social security numbers */
199 #define CL_SCAN_HEURISTIC_STRUCTURED_CC 0x1000 /* alert when detecting credit card numbers */
200 #define CL_SCAN_HEURISTIC_BROKEN_MEDIA 0x2000 /* alert if a file does not match the identified file format, works with JPEG, TIFF, GIF, PNG */
201 
202 /* mail scanning options */
203 #define CL_SCAN_MAIL_PARTIAL_MESSAGE 0x1
204 
205 /* dev options */
206 #define CL_SCAN_DEV_COLLECT_SHA 0x1 /* Enables hash output in sha-collect builds - for internal use only */
207 #define CL_SCAN_DEV_COLLECT_PERFORMANCE_INFO 0x2 /* collect performance timings */
208 
209 /* cl_countsigs options */
210 #define CL_COUNTSIGS_OFFICIAL 0x1
211 #define CL_COUNTSIGS_UNOFFICIAL 0x2
212 #define CL_COUNTSIGS_ALL (CL_COUNTSIGS_OFFICIAL | CL_COUNTSIGS_UNOFFICIAL)
213 
214 /* For the new engine_options bit field in the engine */
215 #define ENGINE_OPTIONS_NONE 0x0
216 #define ENGINE_OPTIONS_DISABLE_CACHE 0x1
217 #define ENGINE_OPTIONS_FORCE_TO_DISK 0x2
218 #define ENGINE_OPTIONS_DISABLE_PE_STATS 0x4
219 #define ENGINE_OPTIONS_DISABLE_PE_CERTS 0x8
220 #define ENGINE_OPTIONS_PE_DUMPCERTS 0x10
221 // clang-format on
222 
223 struct cl_engine;
224 struct cl_settings;
225 
226 /* ----------------------------------------------------------------------------
227  * Enable global libclamav features.
228  */
229 
233 extern void cl_debug(void);
234 
240 extern void cl_always_gen_section_hash(void);
241 
242 /* ----------------------------------------------------------------------------
243  * Scan engine functions.
244  */
245 
254 int cl_initialize_crypto(void);
255 
262 void cl_cleanup_crypto(void);
263 
264 #define CL_INIT_DEFAULT 0x0
271 extern cl_error_t cl_init(unsigned int initoptions);
272 
280 extern struct cl_engine *cl_engine_new(void);
281 
282 enum cl_engine_field {
283  CL_ENGINE_MAX_SCANSIZE, /* uint64_t */
284  CL_ENGINE_MAX_FILESIZE, /* uint64_t */
285  CL_ENGINE_MAX_RECURSION, /* uint32_t */
286  CL_ENGINE_MAX_FILES, /* uint32_t */
287  CL_ENGINE_MIN_CC_COUNT, /* uint32_t */
288  CL_ENGINE_MIN_SSN_COUNT, /* uint32_t */
289  CL_ENGINE_PUA_CATEGORIES, /* (char *) */
290  CL_ENGINE_DB_OPTIONS, /* uint32_t */
291  CL_ENGINE_DB_VERSION, /* uint32_t */
292  CL_ENGINE_DB_TIME, /* time_t */
293  CL_ENGINE_AC_ONLY, /* uint32_t */
294  CL_ENGINE_AC_MINDEPTH, /* uint32_t */
295  CL_ENGINE_AC_MAXDEPTH, /* uint32_t */
296  CL_ENGINE_TMPDIR, /* (char *) */
297  CL_ENGINE_KEEPTMP, /* uint32_t */
298  CL_ENGINE_BYTECODE_SECURITY, /* uint32_t */
299  CL_ENGINE_BYTECODE_TIMEOUT, /* uint32_t */
300  CL_ENGINE_BYTECODE_MODE, /* uint32_t */
301  CL_ENGINE_MAX_EMBEDDEDPE, /* uint64_t */
302  CL_ENGINE_MAX_HTMLNORMALIZE, /* uint64_t */
303  CL_ENGINE_MAX_HTMLNOTAGS, /* uint64_t */
304  CL_ENGINE_MAX_SCRIPTNORMALIZE, /* uint64_t */
305  CL_ENGINE_MAX_ZIPTYPERCG, /* uint64_t */
306  CL_ENGINE_FORCETODISK, /* uint32_t */
307  CL_ENGINE_CACHE_SIZE, /* uint32_t */
308  CL_ENGINE_DISABLE_CACHE, /* uint32_t */
309  CL_ENGINE_DISABLE_PE_STATS, /* uint32_t */
310  CL_ENGINE_STATS_TIMEOUT, /* uint32_t */
311  CL_ENGINE_MAX_PARTITIONS, /* uint32_t */
312  CL_ENGINE_MAX_ICONSPE, /* uint32_t */
313  CL_ENGINE_MAX_RECHWP3, /* uint32_t */
314  CL_ENGINE_MAX_SCANTIME, /* uint32_t */
315  CL_ENGINE_PCRE_MATCH_LIMIT, /* uint64_t */
316  CL_ENGINE_PCRE_RECMATCH_LIMIT, /* uint64_t */
317  CL_ENGINE_PCRE_MAX_FILESIZE, /* uint64_t */
318  CL_ENGINE_DISABLE_PE_CERTS, /* uint32_t */
319  CL_ENGINE_PE_DUMPCERTS, /* uint32_t */
320 };
321 
322 enum bytecode_security {
323  CL_BYTECODE_TRUST_ALL = 0, /* obsolete */
324  CL_BYTECODE_TRUST_SIGNED, /* default */
325  CL_BYTECODE_TRUST_NOTHING /* paranoid setting */
326 };
327 
328 enum bytecode_mode {
329  CL_BYTECODE_MODE_AUTO = 0, /* JIT if possible, fallback to interpreter */
330  CL_BYTECODE_MODE_JIT, /* force JIT */
331  CL_BYTECODE_MODE_INTERPRETER, /* force interpreter */
332  CL_BYTECODE_MODE_TEST, /* both JIT and interpreter, compare results, all failures are fatal */
333  CL_BYTECODE_MODE_OFF /* for query only, not settable */
334 };
335 
337  unsigned char md5[16];
338  size_t len;
339 };
340 
341 typedef struct cli_stats_sections {
342  size_t nsections;
343  struct cli_section_hash *sections;
345 
358 extern cl_error_t cl_engine_set_num(struct cl_engine *engine, enum cl_engine_field field, long long num);
359 
368 extern long long cl_engine_get_num(const struct cl_engine *engine, enum cl_engine_field field, int *err);
369 
386 extern cl_error_t cl_engine_set_str(struct cl_engine *engine, enum cl_engine_field field, const char *str);
387 
396 extern const char *cl_engine_get_str(const struct cl_engine *engine, enum cl_engine_field field, int *err);
397 
406 extern struct cl_settings *cl_engine_settings_copy(const struct cl_engine *engine);
407 
418 extern cl_error_t cl_engine_settings_apply(struct cl_engine *engine, const struct cl_settings *settings);
419 
427 extern cl_error_t cl_engine_settings_free(struct cl_settings *settings);
428 
439 extern cl_error_t cl_engine_compile(struct cl_engine *engine);
440 
453 extern cl_error_t cl_engine_addref(struct cl_engine *engine);
454 
465 extern cl_error_t cl_engine_free(struct cl_engine *engine);
466 
467 /* ----------------------------------------------------------------------------
468  * Callback function type definitions.
469  */
470 
485 typedef cl_error_t (*clcb_pre_cache)(int fd, const char *type, void *context);
494 extern void cl_engine_set_clcb_pre_cache(struct cl_engine *engine, clcb_pre_cache callback);
495 
496 /*
497  * Attributes of each layer in scan.
498  */
499 #define LAYER_ATTRIBUTES_NONE 0x0
500 #define LAYER_ATTRIBUTES_NORMALIZED 0x1
501 #define LAYER_ATTRIBUTES_DECRYPTED 0x2
526 typedef cl_error_t (*clcb_file_inspection)(int fd, const char *type, const char **ancestors, size_t parent_file_size,
527  const char *file_name, size_t file_size, const char *file_buffer,
528  uint32_t recursion_level, uint32_t layer_attributes, void *context);
540 extern void cl_engine_set_clcb_file_inspection(struct cl_engine *engine, clcb_file_inspection callback);
541 
557 typedef cl_error_t (*clcb_pre_scan)(int fd, const char *type, void *context);
566 extern void cl_engine_set_clcb_pre_scan(struct cl_engine *engine, clcb_pre_scan callback);
567 
584 typedef cl_error_t (*clcb_post_scan)(int fd, int result, const char *virname, void *context);
593 extern void cl_engine_set_clcb_post_scan(struct cl_engine *engine, clcb_post_scan callback);
594 
609 typedef void (*clcb_virus_found)(int fd, const char *virname, void *context);
618 extern void cl_engine_set_clcb_virus_found(struct cl_engine *engine, clcb_virus_found callback);
619 
636 typedef int (*clcb_sigload)(const char *type, const char *name, unsigned int custom, void *context);
646 extern void cl_engine_set_clcb_sigload(struct cl_engine *engine, clcb_sigload callback, void *context);
647 
648 enum cl_msg {
649  /* leave room for more message levels in the future */
650  CL_MSG_INFO_VERBOSE = 32, /* verbose */
651  CL_MSG_WARN = 64, /* LibClamAV WARNING: */
652  CL_MSG_ERROR = 128 /* LibClamAV ERROR: */
653 };
654 
669 typedef cl_error_t (*clcb_progress)(size_t total_items, size_t now_completed, void *context);
670 
681 extern void cl_engine_set_clcb_sigload_progress(struct cl_engine *engine, clcb_progress callback, void *context);
682 
697 extern void cl_engine_set_clcb_engine_compile_progress(struct cl_engine *engine, clcb_progress callback, void *context);
698 
713 extern void cl_engine_set_clcb_engine_free_progress(struct cl_engine *engine, clcb_progress callback, void *context);
714 
738 typedef void (*clcb_msg)(enum cl_msg severity, const char *fullmsg, const char *msg, void *context);
744 extern void cl_set_clcb_msg(clcb_msg callback);
745 
758 typedef void (*clcb_hash)(int fd, unsigned long long size, const unsigned char *md5, const char *virname, void *context);
767 extern void cl_engine_set_clcb_hash(struct cl_engine *engine, clcb_hash callback);
768 
788 typedef cl_error_t (*clcb_meta)(const char *container_type, unsigned long fsize_container, const char *filename,
789  unsigned long fsize_real, int is_encrypted, unsigned int filepos_container, void *context);
798 extern void cl_engine_set_clcb_meta(struct cl_engine *engine, clcb_meta callback);
799 
810 typedef int (*clcb_file_props)(const char *j_propstr, int rc, void *cbdata);
819 extern void cl_engine_set_clcb_file_props(struct cl_engine *engine, clcb_file_props callback);
820 
830 typedef int (*clcb_generic_data)(const unsigned char *const data, const size_t data_len, void *cbdata);
831 
840 extern void cl_engine_set_clcb_vba(struct cl_engine *engine, clcb_generic_data callback);
841 
842 /* ----------------------------------------------------------------------------
843  * Statistics/telemetry gathering callbacks.
844  *
845  * The statistics callback functions may be used to implement a telemetry
846  * gathering feature.
847  *
848  * The structure definition for `cbdata` is entirely up to the caller, as are
849  * the implementations of each of the callback functions defined below.
850  */
851 
863 extern void cl_engine_set_stats_set_cbdata(struct cl_engine *engine, void *cbdata);
864 
874 typedef void (*clcb_stats_add_sample)(const char *virname, const unsigned char *md5, size_t size, stats_section_t *sections, void *cbdata);
883 extern void cl_engine_set_clcb_stats_add_sample(struct cl_engine *engine, clcb_stats_add_sample callback);
884 
893 typedef void (*clcb_stats_remove_sample)(const char *virname, const unsigned char *md5, size_t size, void *cbdata);
902 extern void cl_engine_set_clcb_stats_remove_sample(struct cl_engine *engine, clcb_stats_remove_sample callback);
903 
912 typedef void (*clcb_stats_decrement_count)(const char *virname, const unsigned char *md5, size_t size, void *cbdata);
921 extern void cl_engine_set_clcb_stats_decrement_count(struct cl_engine *engine, clcb_stats_decrement_count callback);
922 
929 typedef void (*clcb_stats_submit)(struct cl_engine *engine, void *cbdata);
938 extern void cl_engine_set_clcb_stats_submit(struct cl_engine *engine, clcb_stats_submit callback);
939 
946 typedef void (*clcb_stats_flush)(struct cl_engine *engine, void *cbdata);
955 extern void cl_engine_set_clcb_stats_flush(struct cl_engine *engine, clcb_stats_flush callback);
956 
962 typedef size_t (*clcb_stats_get_num)(void *cbdata);
971 extern void cl_engine_set_clcb_stats_get_num(struct cl_engine *engine, clcb_stats_get_num callback);
972 
978 typedef size_t (*clcb_stats_get_size)(void *cbdata);
987 extern void cl_engine_set_clcb_stats_get_size(struct cl_engine *engine, clcb_stats_get_size callback);
988 
994 typedef char *(*clcb_stats_get_hostid)(void *cbdata);
1003 extern void cl_engine_set_clcb_stats_get_hostid(struct cl_engine *engine, clcb_stats_get_hostid callback);
1004 
1010 extern void cl_engine_stats_enable(struct cl_engine *engine);
1011 
1012 /* ----------------------------------------------------------------------------
1013  * File scanning.
1014  */
1015 
1027 extern cl_error_t cl_scandesc(int desc, const char *filename, const char **virname, unsigned long int *scanned, const struct cl_engine *engine, struct cl_scan_options *scanoptions);
1028 
1043 extern cl_error_t cl_scandesc_callback(int desc, const char *filename, const char **virname, unsigned long int *scanned, const struct cl_engine *engine, struct cl_scan_options *scanoptions, void *context);
1044 
1055 extern cl_error_t cl_scanfile(const char *filename, const char **virname, unsigned long int *scanned, const struct cl_engine *engine, struct cl_scan_options *scanoptions);
1056 
1070 extern cl_error_t cl_scanfile_callback(const char *filename, const char **virname, unsigned long int *scanned, const struct cl_engine *engine, struct cl_scan_options *scanoptions, void *context);
1071 
1072 /* ----------------------------------------------------------------------------
1073  * Database handling.
1074  */
1075 
1085 extern cl_error_t cl_load(const char *path, struct cl_engine *engine, unsigned int *signo, unsigned int dboptions);
1086 
1092 extern const char *cl_retdbdir(void);
1093 
1094 /* ----------------------------------------------------------------------------
1095  * CVD / database functions
1096  */
1097 
1098 struct cl_cvd { /* field no. */
1099  char *time; /* 2 */
1100  unsigned int version; /* 3 */
1101  unsigned int sigs; /* 4 */
1102  unsigned int fl; /* 5 */
1103  /* padding */
1104  char *md5; /* 6 */
1105  char *dsig; /* 7 */
1106  char *builder; /* 8 */
1107  unsigned int stime; /* 9 */
1108 };
1109 
1118 extern struct cl_cvd *cl_cvdhead(const char *file);
1119 
1131 extern struct cl_cvd *cl_cvdparse(const char *head);
1132 
1139 extern cl_error_t cl_cvdverify(const char *file);
1140 
1146 extern void cl_cvdfree(struct cl_cvd *cvd);
1147 
1158 extern cl_error_t cl_cvdunpack(const char *file, const char *dir, bool dont_verify);
1159 
1170 extern cl_error_t cl_cvdgetage(const char *path, time_t *age_seconds);
1171 
1172 /* ----------------------------------------------------------------------------
1173  * DB directory stat functions.
1174  * Use these functions to watch for database changes.
1175  */
1176 
1177 struct cl_stat {
1178  char *dir;
1179  STATBUF *stattab;
1180  char **statdname;
1181  unsigned int entries;
1182 };
1183 
1193 extern cl_error_t cl_statinidir(const char *dirname, struct cl_stat *dbstat);
1194 
1202 extern int cl_statchkdir(const struct cl_stat *dbstat);
1203 
1211 extern cl_error_t cl_statfree(struct cl_stat *dbstat);
1212 
1221 extern cl_error_t cl_countsigs(const char *path, unsigned int countoptions, unsigned int *sigs);
1222 
1223 /* ----------------------------------------------------------------------------
1224  * Software versions.
1225  */
1226 
1232 extern unsigned int cl_retflevel(void);
1233 
1241 extern const char *cl_retver(void);
1242 
1243 /* ----------------------------------------------------------------------------
1244  * Others.
1245  */
1246 extern const char *cl_strerror(cl_error_t clerror);
1247 
1248 /* ----------------------------------------------------------------------------
1249  * Custom data scanning.
1250  */
1251 struct cl_fmap;
1252 typedef struct cl_fmap cl_fmap_t;
1253 
1276 typedef off_t (*clcb_pread)(void *handle, void *buf, size_t count, off_t offset);
1277 
1295 extern cl_fmap_t *cl_fmap_open_handle(void *handle, size_t offset, size_t len,
1296  clcb_pread pread_cb, int use_aging);
1297 
1310 extern cl_fmap_t *cl_fmap_open_memory(const void *start, size_t len);
1311 
1320 extern void cl_fmap_close(cl_fmap_t *);
1321 
1339 extern cl_error_t cl_scanmap_callback(cl_fmap_t *map, const char *filename, const char **virname, unsigned long int *scanned, const struct cl_engine *engine, struct cl_scan_options *scanoptions, void *context);
1340 
1341 /* ----------------------------------------------------------------------------
1342  * Crypto/hashing functions
1343  */
1344 #define MD5_HASH_SIZE 16
1345 #define SHA1_HASH_SIZE 20
1346 #define SHA256_HASH_SIZE 32
1347 #define SHA384_HASH_SIZE 48
1348 #define SHA512_HASH_SIZE 64
1349 
1360 unsigned char *cl_hash_data(const char *alg, const void *buf, size_t len, unsigned char *obuf, unsigned int *olen);
1361 
1370 unsigned char *cl_hash_file_fd_ctx(EVP_MD_CTX *ctx, int fd, unsigned int *olen);
1371 
1380 unsigned char *cl_hash_file_fd(int fd, const char *alg, unsigned int *olen);
1381 
1390 unsigned char *cl_hash_file_fp(FILE *fp, const char *alg, unsigned int *olen);
1391 
1401 unsigned char *cl_sha256(const void *buf, size_t len, unsigned char *obuf, unsigned int *olen);
1402 
1412 unsigned char *cl_sha384(const void *buf, size_t len, unsigned char *obuf, unsigned int *olen);
1413 
1423 unsigned char *cl_sha512(const void *buf, size_t len, unsigned char *obuf, unsigned int *olen);
1424 
1434 unsigned char *cl_sha1(const void *buf, size_t len, unsigned char *obuf, unsigned int *olen);
1435 
1448 int cl_verify_signature(EVP_PKEY *pkey, const char *alg, unsigned char *sig, unsigned int siglen, unsigned char *data, size_t datalen, int decode);
1449 
1460 int cl_verify_signature_hash(EVP_PKEY *pkey, const char *alg, unsigned char *sig, unsigned int siglen, unsigned char *digest);
1461 
1472 int cl_verify_signature_fd(EVP_PKEY *pkey, const char *alg, unsigned char *sig, unsigned int siglen, int fd);
1473 
1484 int cl_verify_signature_hash_x509_keyfile(char *x509path, const char *alg, unsigned char *sig, unsigned int siglen, unsigned char *digest);
1485 
1496 int cl_verify_signature_fd_x509_keyfile(char *x509path, const char *alg, unsigned char *sig, unsigned int siglen, int fd);
1497 
1510 int cl_verify_signature_x509_keyfile(char *x509path, const char *alg, unsigned char *sig, unsigned int siglen, unsigned char *data, size_t datalen, int decode);
1511 
1522 int cl_verify_signature_hash_x509(X509 *x509, const char *alg, unsigned char *sig, unsigned int siglen, unsigned char *digest);
1523 
1534 int cl_verify_signature_fd_x509(X509 *x509, const char *alg, unsigned char *sig, unsigned int siglen, int fd);
1535 
1548 int cl_verify_signature_x509(X509 *x509, const char *alg, unsigned char *sig, unsigned int siglen, unsigned char *data, size_t datalen, int decode);
1549 
1557 X509 *cl_get_x509_from_mem(void *data, unsigned int len);
1558 
1566 int cl_validate_certificate_chain_ts_dir(char *tsdir, char *certpath);
1567 
1576 int cl_validate_certificate_chain(char **authorities, char *crlpath, char *certpath);
1577 
1583 X509 *cl_load_cert(const char *certpath);
1584 
1591 struct tm *cl_ASN1_GetTimeT(ASN1_TIME *timeobj);
1592 
1599 X509_CRL *cl_load_crl(const char *timeobj);
1600 
1611 unsigned char *cl_sign_data_keyfile(char *keypath, const char *alg, unsigned char *hash, unsigned int *olen, int encode);
1612 
1623 unsigned char *cl_sign_data(EVP_PKEY *pkey, const char *alg, unsigned char *hash, unsigned int *olen, int encode);
1624 
1635 unsigned char *cl_sign_file_fd(int fd, EVP_PKEY *pkey, const char *alg, unsigned int *olen, int encode);
1636 
1647 unsigned char *cl_sign_file_fp(FILE *fp, EVP_PKEY *pkey, const char *alg, unsigned int *olen, int encode);
1648 
1655 EVP_PKEY *cl_get_pkey_file(char *keypath);
1656 
1657 void *cl_hash_init(const char *alg);
1658 int cl_update_hash(void *ctx, const void *data, size_t sz);
1659 int cl_finish_hash(void *ctx, void *buf);
1660 void cl_hash_destroy(void *ctx);
1661 
1662 #ifdef __cplusplus
1663 }
1664 #endif
1665 
1666 #endif /* __CLAMAV_H */
Definition: clamav.h:1098
Definition: clamav.h:157
Definition: clamav.h:1177
Definition: clamav.h:336
Definition: clamav.h:341