Browse Source

add generic `test_process_dir()`

Steffen Jaeckel 7 years ago
parent
commit
0011f7f927
4 changed files with 117 additions and 136 deletions
  1. 82 0
      tests/common.c
  2. 10 0
      tests/common.h
  3. 14 64
      tests/der_test.c
  4. 11 72
      tests/rsa_test.c

+ 82 - 0
tests/common.c

@@ -70,6 +70,88 @@ int do_compare_testvector(const void* is, const unsigned long is_len, const void
    }
 }
 
+
+#ifdef LTC_TEST_READDIR
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+static off_t fsize(const char *filename)
+{
+   struct stat st;
+
+   if (stat(filename, &st) == 0) return st.st_size;
+
+   return -1;
+}
+
+int test_process_dir(const char *path, void *ctx, dir_iter_cb process, dir_cleanup_cb cleanup, const char *test)
+{
+   DIR *d = opendir(path);
+   struct dirent *de;
+   char fname[PATH_MAX];
+   void* buf = NULL;
+   FILE *f = NULL;
+   off_t fsz;
+   unsigned long sz;
+   int err = CRYPT_FILE_NOTFOUND;
+   if (d == NULL)
+      return CRYPT_FILE_NOTFOUND;
+   while((de = readdir(d)) != NULL) {
+      fname[0] = '\0';
+      if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
+         continue;
+      strcat(fname, path);
+      strcat(fname, "/");
+      strcat(fname, de->d_name);
+      fsz = fsize(fname);
+      if (fsz == -1) {
+         err = CRYPT_FILE_NOTFOUND;
+         break;
+      }
+#if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 1
+      fprintf(stderr, "%s: Try to process %s\n", test, fname);
+#endif
+      f = fopen(fname, "rb");
+      sz = fsz;
+      buf = XMALLOC(fsz);
+      if (fread(buf, 1, sz, f) != sz) {
+         err = CRYPT_ERROR;
+         break;
+      }
+
+      err = process(buf, sz, ctx);
+      if (err == CRYPT_NOP) {
+#if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 1
+         fprintf(stderr, "%s: Skip: %s\n", test, fname);
+#endif
+         break;
+      } else if (err != CRYPT_OK) {
+#if defined(LTC_TEST_DBG)
+         fprintf(stderr, "%s: Test %s failed (cause: %s).\n\n", test, fname, error_to_string(err));
+#else
+         LTC_UNUSED_PARAM(test);
+#endif
+         break;
+      }
+      if ((err != CRYPT_NOP) && (cleanup != NULL)) {
+         cleanup(ctx);
+      }
+
+      XFREE(buf);
+      buf = NULL;
+      fclose(f);
+      f = NULL;
+   }
+   if (buf != NULL) XFREE(buf);
+   if (f != NULL) fclose(f);
+   closedir(d);
+   return err;
+}
+#endif
+
+
 prng_state yarrow_prng;
 
 /* ref:         $Format:%D$ */

+ 10 - 0
tests/common.h

@@ -23,6 +23,16 @@ extern prng_state yarrow_prng;
 #define SHOULD_FAIL(x) do { run_cmd((x) != CRYPT_OK ? CRYPT_OK : CRYPT_FAIL_TESTVECTOR, __LINE__, __FILE__, #x, NULL); } while (0)
 #endif
 
+
+#if !((defined(_WIN32) || defined(_WIN32_WCE)) && !defined(__GNUC__))
+#define LTC_TEST_READDIR
+
+typedef int (*dir_iter_cb)(const void *d, unsigned long l, void* ctx);
+typedef void (*dir_cleanup_cb)(void* ctx);
+
+int test_process_dir(const char *path, void *ctx, dir_iter_cb iter, dir_cleanup_cb cleanup, const char *test);
+#endif
+
 void run_cmd(int res, int line, const char *file, const char *cmd, const char *algorithm);
 
 void print_hex(const char* what, const void* v, const unsigned long l);

+ 14 - 64
tests/der_test.c

@@ -1300,72 +1300,19 @@ static void der_Xcode_test(void)
    mp_clear(mpinteger);
 }
 
-#if !((defined(_WIN32) || defined(_WIN32_WCE)) && !defined(__GNUC__))
-
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <dirent.h>
-
-static off_t fsize(const char *filename)
+#ifdef LTC_TEST_READDIR
+int _der_decode_sequence_flexi(const void *in, unsigned long inlen, void* ctx)
 {
-   struct stat st;
-
-   if (stat(filename, &st) == 0) return st.st_size;
-
-   return -1;
-}
-
-static void der_asn1_test(void)
-{
-   DIR *d = opendir("tests/asn1");
-   struct dirent *de;
-   char fname[PATH_MAX];
-   void* buf = NULL;
-   FILE *f = NULL;
-   off_t fsz;
-   unsigned long sz;
-   ltc_asn1_list *list;
-   int err;
-   if (d == NULL)
-      return;
-   while((de = readdir(d)) != NULL) {
-      fname[0] = '\0';
-      if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
-         continue;
-      strcat(fname, "tests/asn1/");
-      strcat(fname, de->d_name);
-      fsz = fsize(fname);
-      if (fsz == -1)
-         break;
-#if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 1
-      fprintf(stderr, "Try to decode %s\n", fname);
-#endif
-      f = fopen(fname, "rb");
-      sz = fsz;
-      buf = XMALLOC(fsz);
-      if (fread(buf, 1, sz, f) != sz)
-         break;
-
-      if ((err = der_decode_sequence_flexi(buf, &sz, &list)) == CRYPT_OK) {
+   ltc_asn1_list** list = ctx;
+   if (der_decode_sequence_flexi(in, &inlen, list) == CRYPT_OK) {
 #ifdef LTC_DER_TESTS_PRINT_FLEXI
-         fprintf(stderr, "\n\n");
-         _der_tests_print_flexi(list, 0);
-         fprintf(stderr, "\n\n");
-#endif
-         der_sequence_free(list);
-      } else {
-#if defined(LTC_TEST_DBG)
-         fprintf(stderr, "Could not decode %s: %s\n\n", fname, error_to_string(err));
+      fprintf(stderr, "\n\n");
+      _der_tests_print_flexi(*list, 0);
+      fprintf(stderr, "\n\n");
 #endif
-      }
-      XFREE(buf);
-      buf = NULL;
-      fclose(f);
-      f = NULL;
+      der_sequence_free(*list);
    }
-   if (buf != NULL) XFREE(buf);
-   if (f != NULL) fclose(f);
-   closedir(d);
+   return CRYPT_OK;
 }
 #endif
 
@@ -1620,6 +1567,9 @@ int der_test(void)
 
    unsigned char utf8_buf[32];
    wchar_t utf8_out[32];
+#ifdef LTC_TEST_READDIR
+   ltc_asn1_list *list;
+#endif
 
    if (ltc_mp.name == NULL) return CRYPT_NOP;
 
@@ -1627,8 +1577,8 @@ int der_test(void)
 
    der_Xcode_test();
 
-#if !((defined(_WIN32) || defined(_WIN32_WCE)) && !defined(__GNUC__))
-   der_asn1_test();
+#ifdef LTC_TEST_READDIR
+   DO(test_process_dir("tests/asn1", &list, _der_decode_sequence_flexi, NULL, "DER ASN.1 special cases"));
 #endif
 
    der_custom_test();

+ 11 - 72
tests/rsa_test.c

@@ -329,80 +329,19 @@ static int _rsa_issue_301(int prng_idx)
    return CRYPT_OK;
 }
 
-#if !((defined(_WIN32) || defined(_WIN32_WCE)) && !defined(__GNUC__))
-
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <dirent.h>
-
-static off_t fsize(const char *filename)
-{
-   struct stat st;
-
-   if (stat(filename, &st) == 0) return st.st_size;
-
-   return -1;
-}
-
-static int _rsa_size_test(void)
+#ifdef LTC_TEST_READDIR
+static int _rsa_import_x509(const void *in, unsigned long inlen, void *key)
 {
-   DIR *d = opendir("tests/rsa");
-   struct dirent *de;
-   char fname[PATH_MAX];
-   void* buf = NULL;
-   FILE *f = NULL;
-   off_t fsz;
-   unsigned long sz;
-   int err = CRYPT_FILE_NOTFOUND;
-   rsa_key k;
-   if (d == NULL)
-      return CRYPT_FILE_NOTFOUND;
-   while((de = readdir(d)) != NULL) {
-      fname[0] = '\0';
-      if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
-         continue;
-      strcat(fname, "tests/rsa/");
-      strcat(fname, de->d_name);
-      fsz = fsize(fname);
-      if (fsz == -1)
-         break;
-      /* here we use the filesize as indicator for the rsa size
-       * that would fail to import for tfm because it's fixed-size
-       */
-      if ((strcmp(ltc_mp.name, "TomsFastMath") == 0) && (fsz > 2048)) {
-#if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 1
-         fprintf(stderr, "TomsFastMath skip: %s\n", fname);
-#endif
-         continue;
-      }
+   /* here we use the filesize as indicator for the rsa size
+    * that would fail to import for tfm because it's fixed-size
+    */
+   if ((strcmp(ltc_mp.name, "TomsFastMath") == 0) && (inlen > 2048)) {
 #if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 1
-      fprintf(stderr, "Try to import %s\n", fname);
+      fprintf(stderr, "Skipping testcase because of TomsFastMath\n");
 #endif
-      f = fopen(fname, "rb");
-      sz = fsz;
-      buf = XMALLOC(fsz);
-      if (fread(buf, 1, sz, f) != sz) {
-         err = CRYPT_ERROR;
-         break;
-      }
-
-      if ((err = rsa_import_x509(buf, sz, &k)) == CRYPT_OK) {
-         rsa_free(&k);
-      } else {
-#if defined(LTC_TEST_DBG)
-         fprintf(stderr, "Could not import RSA key of %s: %s\n\n", fname, error_to_string(err));
-#endif
-         break;
-      }
-      XFREE(buf);
-      buf = NULL;
-      fclose(f);
-      f = NULL;
+      return CRYPT_NOP;
    }
-   if (buf != NULL) XFREE(buf);
-   if (f != NULL) fclose(f);
-   closedir(d);
-   return err;
+   return rsa_import_x509(in, inlen, key);
 }
 #endif
 
@@ -431,8 +370,8 @@ int rsa_test(void)
       return 1;
    }
 
-#if !((defined(_WIN32) || defined(_WIN32_WCE)) && !defined(__GNUC__))
-   DO(_rsa_size_test());
+#ifdef LTC_TEST_READDIR
+   DO(test_process_dir("tests/rsa", &key, _rsa_import_x509, (dir_cleanup_cb)rsa_free, "rsa_test"));
 #endif
 
    DO(_rsa_issue_301(prng_idx));