Add support for using OpenSSL for checksums
authorJonathan Dieter <jdieter@gmail.com>
Tue, 3 Jul 2018 11:15:52 +0000 (14:15 +0300)
committerJonathan Dieter <jdieter@gmail.com>
Tue, 3 Jul 2018 11:15:52 +0000 (14:15 +0300)
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
meson.build
meson_options.txt
src/lib/hash/hash.c
src/lib/hash/meson.build
src/lib/meson.build
test/meson.build

index 128c8a4dc12dccdb09f010d5a89ebe765277c3a8..50657688bbbbc68da81c65443a291ca5491b7749 100644 (file)
@@ -14,10 +14,30 @@ if use_zstd == 'auto' or use_zstd == 'yes'
     if zstd_dep.found()
         add_project_arguments('-DZCHUNK_ZSTD', language : 'c')
         use_zstd = 'yes'
+    else
+        use_zstd = 'no'
     endif
 endif
+
 curl_dep = dependency('libcurl', required:true)
 
+use_openssl = get_option('with-openssl')
+openssl_dep = []
+if use_openssl == 'yes'
+    openssl_required = true
+else
+    openssl_required = false
+endif
+if use_openssl == 'auto' or use_openssl == 'yes'
+    openssl_dep = dependency('openssl', required:openssl_required)
+    if openssl_dep.found()
+        add_project_arguments('-DZCHUNK_OPENSSL', language : 'c')
+        use_openssl = 'yes'
+    else
+        use_openssl = 'no'
+    endif
+endif
+
 inc = include_directories('include')
 
 subdir('include')
index 6dc1a6ddf49f7d893c65755796b700fdd2df72fc..67cdd4f8fa08fe284196b88559609887fb292a38 100644 (file)
@@ -1 +1,2 @@
 option('with-zstd', type : 'combo', choices : ['yes', 'no', 'auto'], value : 'auto')
+option('with-openssl', type : 'combo', choices : ['yes', 'no', 'auto'], value : 'auto')
index cf4047e173fb1e367b4e62c55fd13715a00f8d36..029b09eaf3adce6e137ed81b77eebb273c85ec6f 100644 (file)
 #include <zck.h>
 
 #include "zck_private.h"
+
+/***** If we're not using OpenSSL, use bundled sha libraries *****/
+#ifndef ZCHUNK_OPENSSL
 #include "sha1/sha1.h"
 #include "sha2/sha2.h"
+#define SHA256_CTX sha256_ctx
+#define SHA256_Init sha256_init
+#define SHA256_Update sha256_update
+static void SHA256_Final(unsigned char *md, SHA256_CTX *c) {
+    sha256_final(c, md);
+}
+/***** If we are using OpenSSL, set the defines accordingly *****/
+#else
+#include <openssl/sha.h>
+#define SHA256_DIGEST_SIZE SHA256_DIGEST_LENGTH
+#define SHA1_DIGEST_LENGTH SHA_DIGEST_LENGTH
+#define sha1_byte void
+#endif
 
 #define VALIDATE(f)     if(!f) { \
                             zck_log(ZCK_LOG_ERROR, "zckCtx not initialized\n"); \
@@ -201,11 +217,11 @@ int hash_init(zckHash *hash, zckHashType *hash_type) {
             return True;
         }else if(hash_type->type == ZCK_HASH_SHA256) {
             zck_log(ZCK_LOG_DDEBUG, "Initializing SHA-256 hash\n");
-            hash->ctx = zmalloc(sizeof(sha256_ctx));
+            hash->ctx = zmalloc(sizeof(SHA256_CTX));
             hash->type = hash_type;
             if(hash->ctx == NULL)
                 return False;
-            sha256_init((sha256_ctx *) hash->ctx);
+            SHA256_Init((SHA256_CTX *) hash->ctx);
             return True;
         }
         zck_log(ZCK_LOG_ERROR, "Unsupported hash type: %i\n", hash_type->type);
@@ -233,7 +249,7 @@ int hash_update(zckHash *hash, const char *message, const size_t size) {
             SHA1_Update((SHA_CTX *)hash->ctx, (const sha1_byte *)message, size);
             return True;
         } else if(hash->type->type == ZCK_HASH_SHA256) {
-            sha256_update((sha256_ctx *)hash->ctx, (const unsigned char *)message, size);
+            SHA256_Update((SHA256_CTX *)hash->ctx, (const unsigned char *)message, size);
             return True;
         }
         zck_log(ZCK_LOG_ERROR, "Unsupported hash type: %i\n", hash->type);
@@ -252,7 +268,7 @@ char *hash_finalize(zckHash *hash) {
             return (char *)digest;
         } else if(hash->type->type == ZCK_HASH_SHA256) {
             unsigned char *digest = zmalloc(hash->type->digest_size);
-            sha256_final((sha256_ctx *)hash->ctx, digest);
+            SHA256_Final(digest, (SHA256_CTX *)hash->ctx);
             hash_close(hash);
             return (char *)digest;
         }
index 661e94a7e6ce1d9ed8fe725afa912ea8da4b362e..999d85db15c24e5ec2232c17294e3e29dd6b0000 100644 (file)
@@ -1,3 +1,5 @@
 lib_sources += files('hash.c')
-subdir('sha1')
-subdir('sha2')
+if use_openssl == 'no'
+    subdir('sha1')
+    subdir('sha2')
+endif
index 1acaf8de1c7a11eea3d93b3c2ea7a96e4f6cb870..df18c4b72c06ee1f4670a85f5f1df998a1164e27 100644 (file)
@@ -8,7 +8,7 @@ lib_sources += files('zck.c', 'header.c', 'io.c', 'log.c', 'compint.c')
 zcklib = shared_library('zck',
                         lib_sources,
                         include_directories: inc,
-                        dependencies: [zstd_dep],
+                        dependencies: [zstd_dep, openssl_dep],
                         install: true,
                         version: meson.project_version(),
                         soversion: so_version)
index 58c81074c06a3c2d645cad1a7b200008278fbd85..50a1914a365f079f5843318d9521e157cdfb8e0b 100644 (file)
@@ -1,7 +1,7 @@
 util_sources = []
 subdir('lib')
 incdir = include_directories(['lib', '../src/lib', '../include'])
-empty = executable('empty', ['empty.c'] + util_sources, include_directories: incdir, dependencies: [zstd_dep, curl_dep])
+empty = executable('empty', ['empty.c'] + util_sources, include_directories: incdir, dependencies: [zstd_dep, curl_dep, openssl_dep])
 file_path = join_paths(meson.source_root(), 'test/files')
 
 test('create and validate empty zchunk file', empty)