summaryrefslogtreecommitdiffstats
path: root/libmariadb/include/ma_crypt.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 18:07:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 18:07:14 +0000
commita175314c3e5827eb193872241446f2f8f5c9d33c (patch)
treecd3d60ca99ae00829c52a6ca79150a5b6e62528b /libmariadb/include/ma_crypt.h
parentInitial commit. (diff)
downloadmariadb-10.5-upstream.tar.xz
mariadb-10.5-upstream.zip
Adding upstream version 1:10.5.12.upstream/1%10.5.12upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'libmariadb/include/ma_crypt.h')
-rw-r--r--libmariadb/include/ma_crypt.h166
1 files changed, 166 insertions, 0 deletions
diff --git a/libmariadb/include/ma_crypt.h b/libmariadb/include/ma_crypt.h
new file mode 100644
index 00000000..cf73359e
--- /dev/null
+++ b/libmariadb/include/ma_crypt.h
@@ -0,0 +1,166 @@
+/*
+ Copyright (C) 2018 MariaDB Corporation AB
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not see <http://www.gnu.org/licenses>
+ or write to the Free Software Foundation, Inc.,
+ 51 Franklin St., Fifth Floor, Boston, MA 02110, USA
+*/
+
+#ifndef _ma_hash_h_
+#define _ma_hash_h_
+
+#include <stddef.h>
+#include <stdarg.h>
+
+/*! Hash algorithms */
+#define MA_HASH_MD5 1
+#define MA_HASH_SHA1 2
+#define MA_HASH_SHA224 3
+#define MA_HASH_SHA256 4
+#define MA_HASH_SHA384 5
+#define MA_HASH_SHA512 6
+#define MA_HASH_RIPEMD160 7
+
+/*! Hash digest sizes */
+#define MA_MD5_HASH_SIZE 16
+#define MA_SHA1_HASH_SIZE 20
+#define MA_SHA224_HASH_SIZE 28
+#define MA_SHA256_HASH_SIZE 32
+#define MA_SHA384_HASH_SIZE 48
+#define MA_SHA512_HASH_SIZE 64
+#define MA_RIPEMD160_HASH_SIZE 20
+
+#define MA_MAX_HASH_SIZE 64
+/** \typedef MRL hash context */
+
+#if defined(_WIN32)
+#include <windows.h>
+#include <bcrypt.h>
+typedef struct {
+ char free_me;
+ BCRYPT_ALG_HANDLE hAlg;
+ BCRYPT_HASH_HANDLE hHash;
+ PBYTE hashObject;
+ DWORD digest_len;
+} MA_HASH_CTX;
+#elif defined(HAVE_OPENSSL)
+typedef void MA_HASH_CTX;
+#elif defined(HAVE_GNUTLS)
+typedef struct {
+ void *ctx;
+ const struct nettle_hash *hash;
+} MA_HASH_CTX;
+#endif
+
+/**
+ @brief acquire and initialize new hash context
+
+ @param[in] algorithm hash algorithm
+ @param[in] ctx pointer to a crypto context
+
+ @return hash context on success, NULL on error
+*/
+MA_HASH_CTX *ma_hash_new(unsigned int algorithm, MA_HASH_CTX *ctx);
+
+/**
+ @brief release and deinitializes a hash context
+
+ @param[in] hash context
+
+ @return void
+*/
+void ma_hash_free(MA_HASH_CTX *ctx);
+
+/**
+ @brief hashes len bytes of data into the hash context.
+ This function can be called several times on same context to
+ hash additional data.
+
+ @param[in] ctx hash context
+ @param[in] buffer data buffer
+ @param[in] len size of buffer
+
+ @return void
+*/
+void ma_hash_input(MA_HASH_CTX *ctx,
+ const unsigned char *buffer,
+ size_t len);
+
+/**
+ @brief retrieves the hash value from hash context
+
+ @param[in] ctx hash context
+ @param[out] digest digest containing hash value
+
+ @return void
+ */
+void ma_hash_result(MA_HASH_CTX *ctx, unsigned char *digest);
+
+
+/**
+ @brief returns digest size for a given hash algorithm
+
+ @param[in] hash algorithm
+
+ @returns digest size or 0 on error
+*/
+static inline size_t ma_hash_digest_size(unsigned int hash_alg)
+{
+ switch(hash_alg) {
+ case MA_HASH_MD5:
+ return MA_MD5_HASH_SIZE;
+ case MA_HASH_SHA1:
+ return MA_SHA1_HASH_SIZE;
+ case MA_HASH_SHA224:
+ return MA_SHA224_HASH_SIZE;
+ case MA_HASH_SHA256:
+ return MA_SHA256_HASH_SIZE;
+ case MA_HASH_SHA384:
+ return MA_SHA384_HASH_SIZE;
+ case MA_HASH_SHA512:
+ return MA_SHA512_HASH_SIZE;
+ case MA_HASH_RIPEMD160:
+ return MA_RIPEMD160_HASH_SIZE;
+ default:
+ return 0;
+ }
+}
+
+/**
+ @brief function to compute hash from buffer.
+
+ @param[in] hash_alg hash algorithm
+ @param[in] buffer buffer
+ @param[in] buffer_leng length of buffer
+ @param[out] digest computed hash digest
+
+ @return void
+*/
+static inline void ma_hash(unsigned int algorithm,
+ const unsigned char *buffer,
+ size_t buffer_length,
+ unsigned char *digest)
+{
+ MA_HASH_CTX *ctx= NULL;
+#ifdef _WIN32
+ MA_HASH_CTX dctx;
+ ctx= &dctx;
+#endif
+ ctx= ma_hash_new(algorithm, ctx);
+ ma_hash_input(ctx, buffer, buffer_length);
+ ma_hash_result(ctx, digest);
+ ma_hash_free(ctx);
+}
+
+#endif /* _ma_hash_h_ */