chiark / gitweb /
memcmp: Introduce and use consttime_memeq
[secnet.git] / util.c
diff --git a/util.c b/util.c
index fff5b6d13e5e0f74544723ea4ff9e8f9013634f5..3d119874eb1c11c7d7b9e367a6bf1a2bef6c4b4b 100644 (file)
--- a/util.c
+++ b/util.c
@@ -166,6 +166,7 @@ static const char *phases[NR_PHASES]={
     "PHASE_GETOPTS",
     "PHASE_READCONFIG",
     "PHASE_SETUP",
+    "PHASE_DAEMONIZE",
     "PHASE_GETRESOURCES",
     "PHASE_DROPPRIV",
     "PHASE_RUN",
@@ -227,8 +228,9 @@ void buffer_assert_free(struct buffer_if *buffer, cstring_t file,
                        int line)
 {
     if (!buffer->free) {
-       fatal("BUF_ASSERT_FREE, %s line %d, owned by %s",
-             file,line,buffer->owner);
+       fprintf(stderr,"secnet: BUF_ASSERT_FREE, %s line %d, owned by %s",
+               file,line,buffer->owner);
+       assert(!"buffer_assert_free failure");
     }
 }
 
@@ -236,8 +238,9 @@ void buffer_assert_used(struct buffer_if *buffer, cstring_t file,
                        int line)
 {
     if (buffer->free) {
-       fatal("BUF_ASSERT_USED, %s line %d, last owned by %s",
-             file,line,buffer->owner);
+       fprintf(stderr,"secnet: BUF_ASSERT_USED, %s line %d, last owned by %s",
+               file,line,buffer->owner);
+       assert(!"buffer_assert_used failure");
     }
 }
 
@@ -268,6 +271,7 @@ void *buf_unappend(struct buffer_if *buf, int32_t amount) {
 
 void *buf_unprepend(struct buffer_if *buf, int32_t amount) {
     void *p;
+    if (buf->size < amount) return 0;
     p=buf->start;
     buf->start+=amount;
     buf->size-=amount;
@@ -299,6 +303,34 @@ void buffer_new(struct buffer_if *buf, int32_t len)
     buf->base=safe_malloc(len,"buffer_new");
 }
 
+void buffer_readonly_view(struct buffer_if *buf, const void *data, int32_t len)
+{
+    buf->free=False;
+    buf->owner="READONLY";
+    buf->flags=0;
+    buf->loc.file=NULL;
+    buf->loc.line=0;
+    buf->size=buf->len=len;
+    buf->base=buf->start=(uint8_t*)data;
+}
+
+void buffer_readonly_clone(struct buffer_if *out, const struct buffer_if *in)
+{
+    buffer_readonly_view(out,in->start,in->size);
+}
+
+void buffer_copy(struct buffer_if *dst, const struct buffer_if *src)
+{
+    if (dst->len < src->len) {
+       dst->base=realloc(dst->base,src->len);
+       if (!dst->base) fatal_perror("buffer_copy");
+       dst->len = src->len;
+    }
+    dst->start = dst->base + (src->start - src->base);
+    dst->size = src->size;
+    memcpy(dst->start, src->start, dst->size);
+}
+
 static list_t *buffer_apply(closure_t *self, struct cloc loc, dict_t *context,
                            list_t *args)
 {
@@ -349,6 +381,22 @@ static list_t *buffer_apply(closure_t *self, struct cloc loc, dict_t *context,
     return new_closure(&st->cl);
 }
 
+int consttime_memeq(const void *s1in, const void *s2in, size_t n)
+{
+    const uint8_t *s1=s1in, *s2=s2in;
+    register volatile uint8_t accumulator=0;
+
+    while (n-- > 0) {
+       accumulator |= (*s1++ ^ *s2++);
+    }
+    accumulator |= accumulator >> 4; /* constant-time             */
+    accumulator |= accumulator >> 2; /*  boolean canonicalisation */
+    accumulator |= accumulator >> 1;
+    accumulator &= 1;
+    accumulator ^= 1;
+    return accumulator;
+}
+
 void util_module(dict_t *dict)
 {
     add_closure(dict,"sysbuffer",buffer_apply);