Signed-off-by: Dmitry Eremin-Solenikov <[email protected]>
---
 macros.h | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 66 insertions(+)

diff --git a/macros.h b/macros.h
index 990d32ee3b36..615f06c4c7de 100644
--- a/macros.h
+++ b/macros.h
@@ -215,6 +215,45 @@ do {                                               \
     ;                                                                  \
   } while (0)
 
+/* Takes the compression function f as argument. NOTE: also clobbers
+   length and data. */
+#define MD_BLOCK_UPDATE(state, bctx, bsize, length, data, f, incr)     \
+  do {                                                                 \
+    if ((bctx)->index)                                                 \
+      {                                                                        
\
+       /* Try to fill partial block */                                 \
+       unsigned __md_left = bsize - (bctx)->index;     \
+       if ((length) < __md_left)                                       \
+         {                                                             \
+           memcpy((bctx)->buffer + (bctx)->index, (data), (length));   \
+           (bctx)->index += (length);                                  \
+           goto __md_done; /* Finished */                              \
+         }                                                             \
+       else                                                            \
+         {                                                             \
+           memcpy((bctx)->buffer + (bctx)->index, (data), __md_left);  \
+                                                                       \
+           f((state), (bctx)->buffer);                                 \
+           (incr);                                                     \
+                                                                       \
+           (data) += __md_left;                                        \
+           (length) -= __md_left;                                      \
+         }                                                             \
+      }                                                                        
\
+    while ((length) >= bsize)                          \
+      {                                                                        
\
+       f((state), (data));                                             \
+       (incr);                                                         \
+                                                                       \
+       (data) += bsize;                                \
+       (length) -= bsize;                              \
+      }                                                                        
\
+    memcpy ((bctx)->buffer, (data), (length));                         \
+    (bctx)->index = (length);                                          \
+  __md_done:                                                           \
+    ;                                                                  \
+  } while (0)
+
 /* Pads the block to a block boundary with the bit pattern 1 0*,
    leaving size octets for the length field at the end. If needed,
    compresses the block and starts a new one. */
@@ -242,4 +281,31 @@ do {                                               \
                                                                        \
   } while (0)
 
+/* Pads the block to a block boundary with the bit pattern 1 0*,
+   leaving size octets for the length field at the end. If needed,
+   compresses the block and starts a new one. */
+#define MD_BLOCK_PAD(sctx, bctx, bsize, size, f)                       \
+  do {                                                                 \
+    unsigned __md_i;                                                   \
+    __md_i = (bctx)->index;                                            \
+                                                                       \
+    /* Set the first char of padding to 0x80. This is safe since there \
+       is always at least one byte free */                             \
+                                                                       \
+    assert(__md_i < bsize);                            \
+    (bctx)->buffer[__md_i++] = 0x80;                                   \
+                                                                       \
+    if (__md_i > (bsize - (size)))                     \
+      { /* No room for length in this block. Process it and            \
+          pad with another one */                                      \
+       memset((bctx)->buffer + __md_i, 0, bsize - __md_i); \
+                                                                       \
+       f((sctx), (bctx)->buffer);                                              
\
+       __md_i = 0;                                                     \
+      }                                                                        
\
+    memset((bctx)->buffer + __md_i, 0,                                 \
+          bsize - (size) - __md_i);                    \
+                                                                       \
+  } while (0)
+
 #endif /* NETTLE_MACROS_H_INCLUDED */
-- 
2.20.1

_______________________________________________
nettle-bugs mailing list
[email protected]
http://lists.lysator.liu.se/mailman/listinfo/nettle-bugs

Reply via email to