12
12
#include <sys/types.h>
13
13
#include <dirent.h>
14
14
#include <sys/mman.h>
16
#include <openssl/ssl.h>
17
#include <openssl/err.h>
18
#include "libclamav/crypto.h"
15
20
#include "../libclamav/clamav.h"
16
21
#include "../libclamav/others.h"
17
22
#include "../libclamav/matcher.h"
18
23
#include "../libclamav/version.h"
19
24
#include "../libclamav/dsig.h"
20
#include "../libclamav/sha256.h"
25
#include "../libclamav/fpu.h"
21
26
#include "checks.h"
28
static int fpu_words = FPU_ENDIAN_INITME;
29
#define NO_FPU_ENDIAN (fpu_words == FPU_ENDIAN_UNKNOWN)
30
#define EA06_SCAN strstr(file, "clam.ea06.exe")
31
#define FALSE_NEGATIVE (EA06_SCAN && NO_FPU_ENDIAN)
23
33
/* extern void cl_free(struct cl_engine *engine); */
24
34
START_TEST (test_cl_free)
164
174
ret = cl_scandesc(fd, &virname, &scanned, g_engine, CL_SCAN_STDOPT);
165
175
cli_dbgmsg("scan end (scandesc) %s\n", file);
167
fail_unless_fmt(ret == CL_VIRUS, "cl_scandesc failed for %s: %s", file, cl_strerror(ret));
168
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname);
177
if (!FALSE_NEGATIVE) {
178
fail_unless_fmt(ret == CL_VIRUS, "cl_scandesc failed for %s: %s", file, cl_strerror(ret));
179
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname);
182
194
int fd = get_test_file(_i, file, sizeof(file), &size);
183
195
cli_dbgmsg("scanning (scandesc) %s\n", file);
184
196
ret = cl_scandesc(fd, virpp, &scanned, g_engine, CL_SCAN_ALLMATCHES+CL_SCAN_STDOPT);
185
virpp = (const char **)*virpp; /* allscan api hack */
186
198
cli_dbgmsg("scan end (scandesc) %s\n", file);
188
fail_unless_fmt(ret == CL_VIRUS, "cl_scandesc_allscan failed for %s: %s", file, cl_strerror(ret));
189
fail_unless_fmt(*virpp && !strcmp(*virpp, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", *virpp);
200
if (!FALSE_NEGATIVE) {
201
fail_unless_fmt(ret == CL_VIRUS, "cl_scandesc_allscan failed for %s: %s", file, cl_strerror(ret));
202
virpp = (const char **)*virpp; /* allscan api hack */
203
fail_unless_fmt(*virpp && !strcmp(*virpp, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", *virpp);
208
223
ret = cl_scanfile(file, &virname, &scanned, g_engine, CL_SCAN_STDOPT);
209
224
cli_dbgmsg("scan end (scanfile) %s\n", file);
211
fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile failed for %s: %s", file, cl_strerror(ret));
212
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname);
226
if (!FALSE_NEGATIVE) {
227
fail_unless_fmt(ret == CL_VIRUS , "cl_scanfile failed for %s: %s", file, cl_strerror(ret));
228
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname);
228
245
cli_dbgmsg("scanning (scanfile_allscan) %s\n", file);
229
246
ret = cl_scanfile(file, virpp, &scanned, g_engine, CL_SCAN_ALLMATCHES+CL_SCAN_STDOPT);
230
virpp = (const char **)*virpp; /* allscan api hack */
231
247
cli_dbgmsg("scan end (scanfile_allscan) %s\n", file);
233
fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile_allscan failed for %s: %s", file, cl_strerror(ret));
234
fail_unless_fmt(*virpp && !strcmp(*virpp, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", *virpp);
249
if (!FALSE_NEGATIVE) {
250
fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile_allscan failed for %s: %s", file, cl_strerror(ret));
251
virpp = (const char **)*virpp; /* allscan api hack */
252
fail_unless_fmt(*virpp && !strcmp(*virpp, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", *virpp);
252
271
ret = cl_scanfile_callback(file, &virname, &scanned, g_engine, CL_SCAN_STDOPT, NULL);
253
272
cli_dbgmsg("scan end (scanfile_cb) %s\n", file);
255
fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile_cb failed for %s: %s", file, cl_strerror(ret));
256
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname);
274
if (!FALSE_NEGATIVE) {
275
fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile_cb failed for %s: %s", file, cl_strerror(ret));
276
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname);
272
293
cli_dbgmsg("scanning (scanfile_cb_allscan) %s\n", file);
273
294
/* TODO: test callbacks */
274
295
ret = cl_scanfile_callback(file, virpp, &scanned, g_engine, CL_SCAN_ALLMATCHES+CL_SCAN_STDOPT, NULL);
275
virpp = (const char **)*virpp; /* allscan api hack */
276
296
cli_dbgmsg("scan end (scanfile_cb_allscan) %s\n", file);
278
fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile_cb_allscan failed for %s: %s", file, cl_strerror(ret));
279
fail_unless_fmt(*virpp && !strcmp(*virpp, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", *virpp);
298
if (!FALSE_NEGATIVE) {
299
fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile_cb_allscan failed for %s: %s", file, cl_strerror(ret));
300
virpp = (const char **)*virpp; /* allscan api hack */
301
fail_unless_fmt(*virpp && !strcmp(*virpp, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", *virpp);
296
319
ret = cl_scandesc_callback(fd, &virname, &scanned, g_engine, CL_SCAN_STDOPT, NULL);
297
320
cli_dbgmsg("scan end (scandesc_cb) %s\n", file);
299
fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile failed for %s: %s", file, cl_strerror(ret));
300
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname);
322
if (!FALSE_NEGATIVE) {
323
fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile failed for %s: %s", file, cl_strerror(ret));
324
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname);
316
341
cli_dbgmsg("scanning (scandesc_cb_allscan) %s\n", file);
317
342
/* TODO: test callbacks */
318
343
ret = cl_scandesc_callback(fd, virpp, &scanned, g_engine, CL_SCAN_ALLMATCHES+CL_SCAN_STDOPT, NULL);
319
virpp = (const char **)*virpp; /* allscan api hack */
320
344
cli_dbgmsg("scan end (scandesc_cb_allscan) %s\n", file);
322
fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile_allscan failed for %s: %s", file, cl_strerror(ret));
323
fail_unless_fmt(*virpp && !strcmp(*virpp, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", *virpp);
346
if (!FALSE_NEGATIVE) {
347
fail_unless_fmt(ret == CL_VIRUS, "cl_scanfile_allscan failed for %s: %s", file, cl_strerror(ret));
348
virpp = (const char **)*virpp; /* allscan api hack */
349
fail_unless_fmt(*virpp && !strcmp(*virpp, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", *virpp);
355
382
static char **testfiles = NULL;
356
383
static unsigned testfiles_n = 0;
385
static const int expected_testfiles = 48;
387
static unsigned skip_files(void)
389
unsigned skipped = 0;
391
/* skip .rar files if unrar is disabled */
392
const char *s = getenv("unrar_disabled");
393
if (s && !strcmp(s, "1")) {
397
/* skip .bz2 files if bzip is disabled */
359
static const int expected_testfiles = 48;
361
static const int expected_testfiles = 46;
364
static unsigned skip_unrar_files(void)
366
const char *s = getenv("unrar_disabled");
374
/* number of .rar files we skipp */
403
/* skip [placeholder] files if xml is disabled */
378
412
static void init_testfiles(void)
380
414
struct dirent *dirent;
381
int expect = expected_testfiles;
416
int expect = expected_testfiles;
384
418
DIR *d = opendir(OBJDIR"/../test");
385
419
fail_unless(!!d, "opendir");
390
424
while ((dirent = readdir(d))) {
391
425
if (strncmp(dirent->d_name, "clam", 4))
393
if (strstr(dirent->d_name, ".rar") && skip_unrar_files()) {
394
cli_dbgmsg("skipping (no unrar) %s\n", dirent->d_name);
398
428
testfiles = cli_realloc(testfiles, i*sizeof(*testfiles));
399
429
fail_unless(!!testfiles, "cli_realloc");
400
430
testfiles[i-1] = strdup(dirent->d_name);
403
expect -= skip_unrar_files();
433
if (get_fpu_endian() == FPU_ENDIAN_UNKNOWN)
435
expect -= skip_files();
404
436
fail_unless_fmt(testfiles_n == expect, "testfiles: %d != %d", testfiles_n, expect);
449
fail_unless(i < testfiles_n);
481
fail_unless(i < testfiles_n, "%i < %i %s", i, testfiles_n, file);
450
482
snprintf(file, fsize, OBJDIR"/../test/%s", testfiles[i]);
452
484
fd = open(file, O_RDONLY);
480
512
ret = cl_scanmap_callback(map, &virname, &scanned, g_engine, CL_SCAN_STDOPT, NULL);
481
513
cli_dbgmsg("scan end (handle) %s\n", file);
483
fail_unless_fmt(ret == CL_VIRUS, "cl_scanmap_callback failed for %s: %s", file, cl_strerror(ret));
484
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname);
515
if (!FALSE_NEGATIVE) {
516
fail_unless_fmt(ret == CL_VIRUS, "cl_scanmap_callback failed for %s: %s", file, cl_strerror(ret));
517
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", virname);
499
533
int fd = get_test_file(_i, file, sizeof(file), &size);
500
534
/* intentionally use different way than scanners.c for testing */
501
535
map = cl_fmap_open_handle(&fd, 0, size, pread_cb, 1);
502
fail_unless(!!map, "cl_fmap_open_handle");
536
fail_unless(!!map, "cl_fmap_open_handle %s");
504
538
cli_dbgmsg("scanning (handle) allscan %s\n", file);
505
539
ret = cl_scanmap_callback(map, virpp, &scanned, g_engine, CL_SCAN_ALLMATCHES+CL_SCAN_STDOPT, NULL);
506
virpp = (const char **)*virpp; /* allscan api hack */
507
540
cli_dbgmsg("scan end (handle) allscan %s\n", file);
509
fail_unless_fmt(ret == CL_VIRUS, "cl_scanmap_callback_allscan failed for %s: %s", file, cl_strerror(ret));
510
fail_unless_fmt(*virpp && !strcmp(*virpp, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", *virpp);
542
if (!FALSE_NEGATIVE) {
543
fail_unless_fmt(ret == CL_VIRUS, "cl_scanmap_callback_allscan failed for %s: %s", file, cl_strerror(ret));
544
virpp = (const char **)*virpp; /* allscan api hack */
545
fail_unless_fmt(*virpp && !strcmp(*virpp, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s", *virpp);
535
571
cli_dbgmsg("scanning (mem) %s\n", file);
536
572
ret = cl_scanmap_callback(map, &virname, &scanned, g_engine, CL_SCAN_STDOPT, NULL);
537
573
cli_dbgmsg("scan end (mem) %s\n", file);
538
fail_unless_fmt(ret == CL_VIRUS, "cl_scanmap_callback failed for %s: %s", file, cl_strerror(ret));
539
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s for %s", virname, file);
574
if (!FALSE_NEGATIVE) {
575
fail_unless_fmt(ret == CL_VIRUS, "cl_scanmap_callback failed for %s: %s", file, cl_strerror(ret));
576
fail_unless_fmt(virname && !strcmp(virname, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s for %s", virname, file);
541
579
cl_fmap_close(map);
563
601
/* intentionally use different way than scanners.c for testing */
564
602
map = cl_fmap_open_memory(mem, size);
565
fail_unless(!!map, "cl_fmap_open_mem");
603
fail_unless(!!map, "cl_fmap_open_mem %s");
567
605
cli_dbgmsg("scanning (mem) allscan %s\n", file);
568
606
ret = cl_scanmap_callback(map, virpp, &scanned, g_engine, CL_SCAN_ALLMATCHES+CL_SCAN_STDOPT, NULL);
569
virpp = (const char **)*virpp; /* allscan api hack */
570
607
cli_dbgmsg("scan end (mem) allscan %s\n", file);
571
fail_unless_fmt(ret == CL_VIRUS, "cl_scanmap_callback failed for %s: %s", file, cl_strerror(ret));
572
fail_unless_fmt(*virpp && !strcmp(*virpp, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s for %s", *virpp, file);
608
if (!FALSE_NEGATIVE) {
609
fail_unless_fmt(ret == CL_VIRUS, "cl_scanmap_callback failed for %s: %s", file, cl_strerror(ret));
610
virpp = (const char **)*virpp; /* allscan api hack */
611
fail_unless_fmt(*virpp && !strcmp(*virpp, "ClamAV-Test-File.UNOFFICIAL"), "virusname: %s for %s", *virpp, file);
574
615
cl_fmap_close(map);
576
616
munmap(mem, size);
581
621
static Suite *test_cl_suite(void)
583
int expect = expected_testfiles;
585
623
Suite *s = suite_create("cl_api");
586
624
TCase *tc_cl = tcase_create("cl_dup");
587
625
TCase *tc_cl_scan = tcase_create("cl_scan");
626
int expect = expected_testfiles;
588
627
suite_add_tcase (s, tc_cl);
589
628
tcase_add_test(tc_cl, test_cl_free);
590
629
tcase_add_test(tc_cl, test_cl_dup);
607
646
suite_add_tcase(s, tc_cl_scan);
608
647
tcase_add_checked_fixture (tc_cl_scan, engine_setup, engine_teardown);
609
648
#ifdef CHECK_HAVE_LOOPS
610
expect -= skip_unrar_files();
649
if (get_fpu_endian() == FPU_ENDIAN_UNKNOWN)
651
expect -= skip_files();
612
652
tcase_add_loop_test(tc_cl_scan, test_cl_scandesc, 0, expect);
613
653
tcase_add_loop_test(tc_cl_scan, test_cl_scandesc_allscan, 0, expect);
614
654
tcase_add_loop_test(tc_cl_scan, test_cl_scanfile, 0, expect);
778
818
START_TEST (test_sha256)
781
821
uint8_t hsha256[SHA256_HASH_SIZE];
782
822
uint8_t buf[1000];
785
825
memset (buf, 0x61, sizeof (buf));
787
sha256_init (&sha256);
788
sha256_update (&sha256, tv1, sizeof (tv1));
789
sha256_final (&sha256, hsha256);
827
cl_sha256(tv1, sizeof(tv1), hsha256, NULL);
790
828
fail_unless(!memcmp (hsha256, res256[0], sizeof (hsha256)), "sha256 test vector #1 failed");
792
sha256_init (&sha256);
793
sha256_update (&sha256, tv2, sizeof (tv2));
794
sha256_final (&sha256, hsha256);
830
cl_sha256(tv2, sizeof(tv2), hsha256, NULL);
795
831
fail_unless(!memcmp (hsha256, res256[1], sizeof (hsha256)), "sha256 test vector #2 failed");
797
sha256_init (&sha256);
833
sha256 = cl_hash_init("sha256");
834
fail_unless(sha256 != NULL, "Could not create EVP_MD_CTX for sha256");
798
836
for (i = 0; i < 1000; i++)
799
sha256_update (&sha256, buf, sizeof (buf));
800
sha256_final (&sha256, hsha256);
837
cl_update_hash (sha256, buf, sizeof (buf));
838
cl_finish_hash(sha256, hsha256);
801
839
fail_unless(!memcmp (hsha256, res256[2], sizeof (hsha256)), "sha256 test vector #3 failed");