Add string-hashing interface
authorJeremy Harris <jgh146exb@wizmail.org>
Wed, 13 Apr 2022 14:37:56 +0000 (15:37 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Fri, 15 Apr 2022 10:18:33 +0000 (11:18 +0100)
src/src/arc.c
src/src/expand.c
src/src/hash.c
src/src/hash.h
src/src/pdkim/pdkim.c
src/src/tls.c

index a9523890dca0775be911cc5c62a80f96d583f1c7..6c7891a6decd3d9fa2ce03956480bf61664af499 100644 (file)
@@ -569,7 +569,7 @@ while ((hn = string_nextinlist(&headernames, &sep, NULL, 0)))
 
       len = Ustrlen(s);
       DEBUG(D_acl) pdkim_quoteprint(s, len);
-      exim_sha_update(&hhash_ctx, s, Ustrlen(s));
+      exim_sha_update_string(&hhash_ctx, s);
       r->used = TRUE;
       break;
       }
index 12edd195caf222e82d396389d00875e52d40e072..1f6b933bfe4907fd14e692ea9597731f9be4d01b 100644 (file)
@@ -7273,7 +7273,7 @@ NOT_ITEM: ;
            goto EXPAND_FAILED;
            }
 
-         exim_sha_update(&h, sub, Ustrlen(sub));
+         exim_sha_update_string(&h, sub);
          exim_sha_finish(&h, &b);
          while (b.len-- > 0)
            yield = string_fmt_append(yield, "%02X", *b.data++);
@@ -7301,7 +7301,7 @@ NOT_ITEM: ;
          goto EXPAND_FAILED;
          }
 
-       exim_sha_update(&h, sub, Ustrlen(sub));
+       exim_sha_update_string(&h, sub);
        exim_sha_finish(&h, &b);
        while (b.len-- > 0)
          yield = string_fmt_append(yield, "%02X", *b.data++);
index b5323b69c2496f21dc64e48a63b9262ad8369e96..85e10d5d515fcad1b143a125042b6b0a70de07a8 100644 (file)
@@ -29,6 +29,7 @@ sha1;
 
 /******************************************************************************/
 #ifdef SHA_OPENSSL
+# define HAVE_PARTIAL_SHA
 
 BOOL
 exim_sha_init(hctx * h, hashmethod m)
@@ -146,6 +147,7 @@ EVP_MD_CTX_free(h->u.mctx);
 
 
 #elif defined(SHA_GNUTLS)
+# define HAVE_PARTIAL_SHA
 /******************************************************************************/
 
 BOOL
@@ -186,6 +188,7 @@ gnutls_hash_output(h->sha, b->data);
 
 
 #elif defined(SHA_GCRYPT)
+# define HAVE_PARTIAL_SHA
 /******************************************************************************/
 
 BOOL
@@ -224,6 +227,7 @@ memcpy(b->data, gcry_md_read(h->sha, 0), h->hashlen);
 
 
 #elif defined(SHA_POLARSSL)
+# define HAVE_PARTIAL_SHA
 /******************************************************************************/
 
 BOOL
@@ -432,9 +436,7 @@ if (length > 55)
   memset(work, 0, 56);
   }
 else
-  {
   memset(work+length+1, 0, 55-length);
-  }
 
 /* The final 8 bytes of the final chunk are a 64-bit representation of the
 length of the input string *bits*, before padding, high order word first, and
@@ -556,6 +558,14 @@ memcpy(digest, b.data, 20);
 
 
 
+#ifdef HAVE_PARTIAL_SHA
+# undef HAVE_PARTIAL_SHA
+void
+exim_sha_update_string(hctx * h, const uschar * s)
+{
+if (s) exim_sha_update(h, s, Ustrlen(s));
+}
+#endif
 
 
 
@@ -565,7 +575,7 @@ memcpy(digest, b.data, 20);
 **************************************************
 *************************************************/
 
-# ifdef STAND_ALONE
+#ifdef STAND_ALONE
 
 /* Test values. The first 128 may contain binary zeros and have increasing
 length. */
@@ -880,6 +890,6 @@ printf("Computed:  %s\n", s);
 if (strcmp(s, atest) != 0) printf("*** No match ***\n");
 
 }
-# endif        /*STAND_ALONE*/
+#endif /*STAND_ALONE*/
 
 /* End of File */
index 5bd47acd1f14081ec64ecea688994ea869f42d8e..57ef3da823b880b8cad19240603e2396bd39e1a8 100644 (file)
@@ -77,6 +77,7 @@ typedef struct {
 
 extern BOOL     exim_sha_init(hctx *, hashmethod);
 extern void     exim_sha_update(hctx *, const uschar *a, int);
+extern void     exim_sha_update_string(hctx *, const uschar *a);
 extern void     exim_sha_finish(hctx *, blob *);
 
 #endif
index c368be438498d8a9dc8fad6874168d255495d21a..4d77233b69baeda23d693a358e17a47eedad3f2c 100644 (file)
@@ -1613,7 +1613,7 @@ for (pdkim_signature * sig = ctx->sig; sig; sig = sig->next)
          rh = pdkim_relax_header(rh, TRUE);    /* cook header for relaxed canon */
 
        /* Feed header to the hash algorithm */
-       exim_sha_update(&hhash_ctx, CUS rh, Ustrlen(rh));
+       exim_sha_update_string(&hhash_ctx, CUS rh);
 
        /* Remember headers block for signing (when the library cannot do incremental)  */
        /*XXX we could avoid doing this for all but the GnuTLS/RSA case */
@@ -1674,7 +1674,7 @@ for (pdkim_signature * sig = ctx->sig; sig; sig = sig->next)
              : string_copy(CUS hdrs->value);
 
            /* Feed header to the hash algorithm */
-           exim_sha_update(&hhash_ctx, CUS rh, Ustrlen(rh));
+           exim_sha_update_string(&hhash_ctx, CUS rh);
 
            DEBUG(D_acl) pdkim_quoteprint(rh, Ustrlen(rh));
            hdrs->tag = 1;
@@ -1715,7 +1715,7 @@ for (pdkim_signature * sig = ctx->sig; sig; sig = sig->next)
     }
 
   /* Finalize header hash */
-  exim_sha_update(&hhash_ctx, CUS sig_hdr, Ustrlen(sig_hdr));
+  exim_sha_update_string(&hhash_ctx, CUS sig_hdr);
   exim_sha_finish(&hhash_ctx, &hhash);
 
   DEBUG(D_acl)
index a988c750562e82498ca2f40542397694da8280c5..c9bc556fcb6957b9721ffaacef74086893aad52f 100644 (file)
@@ -813,19 +813,15 @@ exim_sha_init(h, HASH_SHA1);
 //  TODO: word from server EHLO resp           /* how, fer gossakes?  Add item to conn_args or tls_support? */
 
 if (conn_args->dane)
-  exim_sha_update(h, CUS &conn_args->tlsa_dnsa, sizeof(dns_answer));
-exim_sha_update(h,   conn_args->host->address, Ustrlen(conn_args->host->address));
+  exim_sha_update(h,  CUS &conn_args->tlsa_dnsa, sizeof(dns_answer));
+exim_sha_update_string(h, conn_args->host->address);
 exim_sha_update(h,   CUS &conn_args->host->port, sizeof(conn_args->host->port));
-exim_sha_update(h,   conn_args->sending_ip_address, Ustrlen(conn_args->sending_ip_address));
-if (openssl_options)
-  exim_sha_update(h, openssl_options,          Ustrlen(openssl_options));
-if (ob->tls_require_ciphers)
-  exim_sha_update(h, ob->tls_require_ciphers,  Ustrlen(ob->tls_require_ciphers));
-if (tlsp->sni)
-  exim_sha_update(h, tlsp->sni,                        Ustrlen(tlsp->sni));
+exim_sha_update_string(h, conn_args->sending_ip_address);
+exim_sha_update_string(h, openssl_options);
+exim_sha_update_string(h, ob->tls_require_ciphers);
+exim_sha_update_string(h, tlsp->sni);
 #ifdef EXIM_HAVE_ALPN
-if (ob->tls_alpn)
-  exim_sha_update(h, ob->tls_alpn,             Ustrlen(ob->tls_alpn));
+exim_sha_update_string(h, ob->tls_alpn);
 #endif
 exim_sha_finish(h, &b);
 for (g = string_get(b.len*2+1); b.len-- > 0; )