]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/shared/gcrypt-util.c
Add SPDX license identifiers to source files under the LGPL
[thirdparty/systemd.git] / src / shared / gcrypt-util.c
index 3bbc161ef211bf6d697f9e01aa23bb59d9bfb6e4..1bfb776725ccfd35f5e1dfcd4e1c20501ad916d9 100644 (file)
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
 
 /***
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#if HAVE_GCRYPT
 #include <gcrypt.h>
 
-#include "hexdecoct.h"
 #include "gcrypt-util.h"
+#include "hexdecoct.h"
 
 void initialize_libgcrypt(bool secmem) {
         const char *p;
@@ -32,9 +34,39 @@ void initialize_libgcrypt(bool secmem) {
         p = gcry_check_version("1.4.5");
         assert(p);
 
-        /* Turn off "secmem". Clients which whish to make use of this
+        /* Turn off "secmem". Clients which wish to make use of this
          * feature should initialize the library manually */
         if (!secmem)
                 gcry_control(GCRYCTL_DISABLE_SECMEM);
         gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
 }
+
+int string_hashsum(const char *s, size_t len, int md_algorithm, char **out) {
+        gcry_md_hd_t md = NULL;
+        size_t hash_size;
+        void *hash;
+        char *enc;
+
+        initialize_libgcrypt(false);
+
+        hash_size = gcry_md_get_algo_dlen(md_algorithm);
+        assert(hash_size > 0);
+
+        gcry_md_open(&md, md_algorithm, 0);
+        if (!md)
+                return -EIO;
+
+        gcry_md_write(md, s, len);
+
+        hash = gcry_md_read(md, 0);
+        if (!hash)
+                return -EIO;
+
+        enc = hexmem(hash, hash_size);
+        if (!enc)
+                return -ENOMEM;
+
+        *out = enc;
+        return 0;
+}
+#endif