summaryrefslogtreecommitdiff
path: root/md-internal.h
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2022-07-05 19:38:45 +0200
committerNiels Möller <nisse@lysator.liu.se>2022-07-05 19:38:45 +0200
commit12bb2223428be4326c580b1b1f8e9916a2839cb1 (patch)
tree951f337d7866843ec9638c39e51a1f528bcfc40c /md-internal.h
parent17bbcd3b021cca32744fc7aadee33de72c39b46b (diff)
downloadnettle-12bb2223428be4326c580b1b1f8e9916a2839cb1.tar.gz
New file md-internal.h
Diffstat (limited to 'md-internal.h')
-rw-r--r--md-internal.h57
1 files changed, 57 insertions, 0 deletions
diff --git a/md-internal.h b/md-internal.h
new file mode 100644
index 00000000..fe520c63
--- /dev/null
+++ b/md-internal.h
@@ -0,0 +1,57 @@
+/* md-internal.h
+
+ Copyright (C) 2001, 2010, 2022 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle 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
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#ifndef NETTLE_MD_INTERNAL_H_INCLUDED
+#define NETTLE_MD_INTERNAL_H_INCLUDED
+
+/* Internal helper macros for Merkle-Damgård hash functions. Assumes the context
+ structs includes the following fields:
+
+ uint8_t block[...]; // Buffer holding one block
+ unsigned int index; // Index into block
+*/
+
+#define MD_FILL_OR_RETURN(ctx, length, data) \
+ do { \
+ unsigned __md_left = sizeof((ctx)->block) - (ctx)->index; \
+ if ((length) < __md_left) \
+ { \
+ memcpy((ctx)->block + (ctx)->index, (data), (length)); \
+ (ctx)->index += (length); \
+ return; \
+ } \
+ memcpy((ctx)->block + (ctx)->index, (data), __md_left); \
+ (data) += __md_left; \
+ (length) -= __md_left; \
+ (ctx)->index = 0; \
+ } while(0)
+
+#endif /* NETTLE_MD_INTERNAL_H_INCLUDED */