Blame SOURCES/bacula-use-crypto-from-openssl.patch

df1dee
Author: Vaclav Dolezal <vdolezal@redhat.com>
df1dee
Date:   Mon Aug 12 14:51:39 2019 +0200
df1dee
df1dee
    Use functions from OpenSSL for HMAC, MD5 and random bytes
df1dee
df1dee
diff -up bacula-11.0.1/src/dird/dird_conf.c.orig bacula-11.0.1/src/dird/dird_conf.c
df1dee
--- bacula-11.0.1/src/dird/dird_conf.c.orig	2021-02-05 22:23:44.000000000 +0100
df1dee
+++ bacula-11.0.1/src/dird/dird_conf.c	2022-02-11 19:43:38.870718113 +0100
df1dee
@@ -43,6 +43,10 @@
df1dee
 #include "bacula.h"
df1dee
 #include "dird.h"
df1dee
 
df1dee
+#if HAVE_OPENSSL
df1dee
+# include <openssl/evp.h>
df1dee
+#endif
df1dee
+
df1dee
 /* Define the first and last resource ID record
df1dee
  * types. Note, these should be unique for each
df1dee
  * daemon though not a requirement.
df1dee
@@ -1783,6 +1787,11 @@ void free_resource(RES *rres, int type)
df1dee
          free(res->res_fs.exclude_items);
df1dee
       }
df1dee
       res->res_fs.num_excludes = 0;
df1dee
+#if HAVE_OPENSSL
df1dee
+      EVP_MD_CTX_free(res->res_fs.md5c);
df1dee
+      res->res_fs.md5c = NULL;
df1dee
+      res->res_fs.have_MD5 = false;
df1dee
+#endif
df1dee
       break;
df1dee
    case R_POOL:
df1dee
       if (res->res_pool.pool_type) {
df1dee
diff -up bacula-11.0.1/src/dird/dird_conf.h.orig bacula-11.0.1/src/dird/dird_conf.h
df1dee
--- bacula-11.0.1/src/dird/dird_conf.h.orig	2021-02-05 22:23:44.000000000 +0100
df1dee
+++ bacula-11.0.1/src/dird/dird_conf.h	2022-02-11 19:43:38.870718113 +0100
df1dee
@@ -25,6 +25,10 @@
df1dee
 
df1dee
 /* NOTE:  #includes at the end of this file */
df1dee
 
df1dee
+#if HAVE_OPENSSL
df1dee
+# include <openssl/evp.h>
df1dee
+#endif
df1dee
+
df1dee
 /*
df1dee
  * Resource codes -- they must be sequential for indexing
df1dee
  */
df1dee
@@ -608,7 +612,11 @@ public:
df1dee
    INCEXE **exclude_items;
df1dee
    int32_t num_excludes;
df1dee
    bool have_MD5;                     /* set if MD5 initialized */
df1dee
+#if HAVE_OPENSSL
df1dee
+   EVP_MD_CTX *md5c;                  /* MD5 of include/exclude */
df1dee
+#else
df1dee
    struct MD5Context md5c;            /* MD5 of include/exclude */
df1dee
+#endif
df1dee
    char MD5[30];                      /* base 64 representation of MD5 */
df1dee
    bool ignore_fs_changes;            /* Don't force Full if FS changed */
df1dee
    bool enable_vss;                   /* Enable Volume Shadow Copy */
df1dee
diff -up bacula-11.0.1/src/dird/inc_conf.c.orig bacula-11.0.1/src/dird/inc_conf.c
df1dee
--- bacula-11.0.1/src/dird/inc_conf.c.orig	2021-02-05 22:23:44.000000000 +0100
df1dee
+++ bacula-11.0.1/src/dird/inc_conf.c	2022-02-11 19:43:38.870718113 +0100
df1dee
@@ -32,6 +32,10 @@
df1dee
 #include <regex.h>
df1dee
 #endif
df1dee
 
df1dee
+#if HAVE_OPENSSL
df1dee
+# include <openssl/evp.h>
df1dee
+#endif
df1dee
+
df1dee
 /* Forward referenced subroutines */
df1dee
 
df1dee
 void store_inc(LEX *lc, RES_ITEM *item, int index, int pass);
df1dee
@@ -390,7 +394,17 @@ static void store_newinc(LEX *lc, RES_IT
df1dee
    bool options;
df1dee
 
df1dee
    if (!res_all.res_fs.have_MD5) {
df1dee
+#if HAVE_OPENSSL
df1dee
+      res_all.res_fs.md5c = EVP_MD_CTX_new();
df1dee
+      if (!res_all.res_fs.md5c
df1dee
+         || !EVP_DigestInit_ex(res_all.res_fs.md5c, EVP_md5(), NULL)
df1dee
+      ) {
df1dee
+         Emsg1(M_ERROR_TERM, 0, "MD5 computation failed: %s\n",
df1dee
+               ERR_reason_error_string(ERR_peek_last_error()));
df1dee
+      }
df1dee
+#else
df1dee
       MD5Init(&res_all.res_fs.md5c);
df1dee
+#endif
df1dee
       res_all.res_fs.have_MD5 = true;
df1dee
    }
df1dee
    bmemset(&res_incexe, 0, sizeof(INCEXE));
df1dee
@@ -656,7 +670,13 @@ static void store_fname(LEX *lc, RES_ITE
df1dee
          }
df1dee
       case T_QUOTED_STRING:
df1dee
          if (res_all.res_fs.have_MD5) {
df1dee
+#if HAVE_OPENSSL
df1dee
+            if (!EVP_DigestUpdate(res_all.res_fs.md5c, (void *)lc->str, (size_t) lc->str_len))
df1dee
+               Emsg1(M_ERROR_TERM, 0, "MD5 computation failed: %s\n",
df1dee
+                     ERR_reason_error_string(ERR_peek_last_error()));
df1dee
+#else
df1dee
             MD5Update(&res_all.res_fs.md5c, (unsigned char *)lc->str, lc->str_len);
df1dee
+#endif
df1dee
          }
df1dee
          incexe = &res_incexe;
df1dee
          if (incexe->name_list.size() == 0) {
df1dee
@@ -699,7 +719,13 @@ static void store_plugin_name(LEX *lc, R
df1dee
          }
df1dee
       case T_QUOTED_STRING:
df1dee
          if (res_all.res_fs.have_MD5) {
df1dee
+#if HAVE_OPENSSL
df1dee
+            if (!EVP_DigestUpdate(res_all.res_fs.md5c, (void *)lc->str, (size_t) lc->str_len))
df1dee
+               Emsg1(M_ERROR_TERM, 0, "MD5 computation failed: %s\n",
df1dee
+                     ERR_reason_error_string(ERR_peek_last_error()));
df1dee
+#else
df1dee
             MD5Update(&res_all.res_fs.md5c, (unsigned char *)lc->str, lc->str_len);
df1dee
+#endif
df1dee
          }
df1dee
          incexe = &res_incexe;
df1dee
          if (incexe->plugin_list.size() == 0) {
df1dee
diff -up bacula-11.0.1/src/dird/job.c.orig bacula-11.0.1/src/dird/job.c
df1dee
--- bacula-11.0.1/src/dird/job.c.orig	2021-02-05 22:23:44.000000000 +0100
df1dee
+++ bacula-11.0.1/src/dird/job.c	2022-02-11 19:43:38.871718095 +0100
df1dee
@@ -27,6 +27,10 @@
df1dee
 #include "bacula.h"
df1dee
 #include "dird.h"
df1dee
 
df1dee
+#if HAVE_OPENSSL
df1dee
+# include <openssl/evp.h>
df1dee
+#endif
df1dee
+
df1dee
 /* Forward referenced subroutines */
df1dee
 static void *job_thread(void *arg);
df1dee
 static void job_monitor_watchdog(watchdog_t *self);
df1dee
@@ -1342,10 +1346,27 @@ bool get_or_create_fileset_record(JCR *j
df1dee
    memset(&fsr, 0, sizeof(FILESET_DBR));
df1dee
    bstrncpy(fsr.FileSet, jcr->fileset->hdr.name, sizeof(fsr.FileSet));
df1dee
    if (jcr->fileset->have_MD5) {
df1dee
+#if HAVE_OPENSSL
df1dee
+      EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
df1dee
+      if (!mdctx)
df1dee
+         Emsg1(M_ERROR_TERM, 0, "MD5 computation failed: %s\n",
df1dee
+               ERR_reason_error_string(ERR_peek_last_error()));
df1dee
+#else
df1dee
       struct MD5Context md5c;
df1dee
+#endif
df1dee
       unsigned char digest[MD5HashSize];
df1dee
+#if HAVE_OPENSSL
df1dee
+      if (!EVP_MD_CTX_copy_ex(mdctx, jcr->fileset->md5c)
df1dee
+         || !EVP_DigestFinal_ex(mdctx, digest, NULL)
df1dee
+      ) {
df1dee
+         Emsg1(M_ERROR_TERM, 0, "MD5 computation failed: %s\n",
df1dee
+               ERR_reason_error_string(ERR_peek_last_error()));
df1dee
+      }
df1dee
+      EVP_MD_CTX_free(mdctx);
df1dee
+#else
df1dee
       memcpy(&md5c, &jcr->fileset->md5c, sizeof(md5c));
df1dee
       MD5Final(digest, &md5c);
df1dee
+#endif
df1dee
       /*
df1dee
        * Keep the flag (last arg) set to false otherwise old FileSets will
df1dee
        * get new MD5 sums and the user will get Full backups on everything
df1dee
diff -up bacula-11.0.1/src/lib/hmac.c.orig bacula-11.0.1/src/lib/hmac.c
df1dee
--- bacula-11.0.1/src/lib/hmac.c.orig	2021-02-05 22:23:44.000000000 +0100
df1dee
+++ bacula-11.0.1/src/lib/hmac.c	2022-02-11 19:43:38.871718095 +0100
df1dee
@@ -26,6 +26,10 @@
df1dee
  */
df1dee
 #include "bacula.h"
df1dee
 
df1dee
+#if HAVE_OPENSSL
df1dee
+# include <openssl/hmac.h>
df1dee
+#endif
df1dee
+
df1dee
 #define PAD_LEN 64           /* PAD length */
df1dee
 #define SIG_LEN MD5HashSize  /* MD5 digest length */
df1dee
 
df1dee
@@ -36,6 +40,19 @@ hmac_md5(
df1dee
     uint8_t*  key,             /* pointer to authentication key */
df1dee
     int   key_len,             /* length of authentication key */
df1dee
     uint8_t  *hmac)            /* returned hmac-md5 */
df1dee
+#if HAVE_OPENSSL
df1dee
+{
df1dee
+    if (!HMAC(
df1dee
+        EVP_md5(),
df1dee
+        key, key_len,
df1dee
+        text, text_len,
df1dee
+        hmac, NULL
df1dee
+    )) {
df1dee
+        Emsg0(M_ERROR_TERM, 0, "HMAC computation failed\n");
df1dee
+    }
df1dee
+
df1dee
+}
df1dee
+#else
df1dee
 {
df1dee
    MD5Context md5c;
df1dee
    uint8_t k_ipad[PAD_LEN];    /* inner padding - key XORd with ipad */
df1dee
@@ -90,6 +107,7 @@ hmac_md5(
df1dee
    MD5Update(&md5c, hmac, SIG_LEN);   /* hash inner hash */
df1dee
    MD5Final(hmac, &md5c);             /* store results */
df1dee
 }
df1dee
+#endif
df1dee
 /*
df1dee
 Test Vectors (Trailing '\0' of a character string not included in test):
df1dee
 
df1dee
diff -up bacula-11.0.1/src/lib/parse_conf.c.orig bacula-11.0.1/src/lib/parse_conf.c
df1dee
--- bacula-11.0.1/src/lib/parse_conf.c.orig	2021-02-05 22:23:44.000000000 +0100
df1dee
+++ bacula-11.0.1/src/lib/parse_conf.c	2022-02-11 19:43:38.871718095 +0100
df1dee
@@ -59,6 +59,10 @@
df1dee
 #define MAX_PATH  1024
df1dee
 #endif
df1dee
 
df1dee
+#if HAVE_OPENSSL
df1dee
+# include <openssl/evp.h>
df1dee
+#endif
df1dee
+
df1dee
 /*
df1dee
  * Define the Union of all the common resource structure definitions.
df1dee
  */
df1dee
@@ -588,7 +592,11 @@ void store_dir(LEX *lc, RES_ITEM *item,
df1dee
 void store_password(LEX *lc, RES_ITEM *item, int index, int pass)
df1dee
 {
df1dee
    unsigned int i, j;
df1dee
+#if HAVE_OPENSSL
df1dee
+   EVP_MD_CTX *mdctx = NULL;
df1dee
+#else
df1dee
    struct MD5Context md5c;
df1dee
+#endif
df1dee
    unsigned char digest[CRYPTO_DIGEST_MD5_SIZE];
df1dee
    char sig[100];
df1dee
 
df1dee
@@ -598,9 +606,21 @@ void store_password(LEX *lc, RES_ITEM *i
df1dee
    } else {
df1dee
       lex_get_token(lc, T_STRING);
df1dee
       if (pass == 1) {
df1dee
+#if HAVE_OPENSSL
df1dee
+         mdctx = EVP_MD_CTX_new();
df1dee
+         if (!mdctx
df1dee
+            || !EVP_DigestInit_ex(mdctx, EVP_md5(), NULL)
df1dee
+            || !EVP_DigestUpdate(mdctx, (const void *) lc->str, (size_t) lc->str_len)
df1dee
+            || !EVP_DigestFinal_ex(mdctx, digest, NULL)
df1dee
+         ) {
df1dee
+            Emsg1(M_ERROR_TERM, 0, "MD5 computation failed: %s\n",
df1dee
+                  ERR_reason_error_string(ERR_peek_last_error()));
df1dee
+         }
df1dee
+#else
df1dee
          MD5Init(&md5c);
df1dee
          MD5Update(&md5c, (unsigned char *) (lc->str), lc->str_len);
df1dee
          MD5Final(digest, &md5c);
df1dee
+#endif
df1dee
          for (i = j = 0; i < sizeof(digest); i++) {
df1dee
             sprintf(&sig[j], "%02x", digest[i]);
df1dee
             j += 2;
df1dee
diff -up bacula-11.0.1/src/lib/util.c.orig bacula-11.0.1/src/lib/util.c
df1dee
--- bacula-11.0.1/src/lib/util.c.orig	2021-02-05 22:23:44.000000000 +0100
df1dee
+++ bacula-11.0.1/src/lib/util.c	2022-02-11 19:43:38.872718077 +0100
df1dee
@@ -707,6 +707,35 @@ int do_shell_expansion(char *name, int n
df1dee
     from SpeakFreely by John Walker */
df1dee
 
df1dee
 void make_session_key(char *key, char *seed, int mode)
df1dee
+#if HAVE_OPENSSL
df1dee
+{
df1dee
+   int j, k;
df1dee
+   unsigned char buf[16];
df1dee
+
df1dee
+   (void) seed;
df1dee
+
df1dee
+   if (!RAND_bytes(buf, sizeof(buf)))
df1dee
+       Emsg1(M_ERROR_TERM, 0, "Random bytes generation failed: %s\n",
df1dee
+             ERR_reason_error_string(ERR_peek_last_error()));
df1dee
+
df1dee
+   if (mode) {
df1dee
+     for (j = k = 0; j < 16; j++) {
df1dee
+        unsigned char rb = buf[j];
df1dee
+
df1dee
+#define Rad16(x) ((x) + 'A')
df1dee
+        key[k++] = Rad16((rb >> 4) & 0xF);
df1dee
+        key[k++] = Rad16(rb & 0xF);
df1dee
+#undef Rad16
df1dee
+        if (j & 1) {
df1dee
+           key[k++] = '-';
df1dee
+        }
df1dee
+     }
df1dee
+     key[--k] = 0;
df1dee
+   } else {
df1dee
+      memcpy(key, buf, sizeof(buf));
df1dee
+   }
df1dee
+}
df1dee
+#else
df1dee
 {
df1dee
    int j, k;
df1dee
    struct MD5Context md5c;
df1dee
@@ -790,6 +819,7 @@ void make_session_key(char *key, char *s
df1dee
    }
df1dee
 }
df1dee
 #undef nextrand
df1dee
+#endif
df1dee
 
df1dee
 void encode_session_key(char *encode, char *session, char *key, int maxlen)
df1dee
 {