]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
[master] added isc_safe_memcmp()
authorEvan Hunt <each@isc.org>
Tue, 9 Jul 2013 18:47:16 +0000 (11:47 -0700)
committerEvan Hunt <each@isc.org>
Tue, 9 Jul 2013 18:47:16 +0000 (11:47 -0700)
3611. [bug] Improved resistance to a theoretical authentication
attack based on differential timing.  [RT #33939]

16 files changed:
CHANGES
configure
configure.in
lib/dns/hmac_link.c
lib/isc/Makefile.in
lib/isc/hmacmd5.c
lib/isc/hmacsha.c
lib/isc/include/isc/Makefile.in
lib/isc/include/isc/safe.h [new file with mode: 0644]
lib/isc/safe.c [new file with mode: 0644]
lib/isc/tests/Makefile.in
lib/isc/tests/safe_test.c [new file with mode: 0644]
lib/isc/win32/libisc.def
lib/isc/win32/libisc.dsp
lib/isc/win32/libisc.mak
lib/isccc/cc.c

diff --git a/CHANGES b/CHANGES
index 72edfc5429702771561bd1a941275df8370c2961..3096bc5de52e32d11d73c4beb312544468d9172a 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3611.  [bug]           Improved resistance to a theoretical authentication
+                       attack based on differential timing.  [RT #33939]
+
 3610.  [cleanup]       win32: Some executables had been omitted from the
                        installer. [RT #34116]
 
index ee0982c6b3ec4daeb9998c2f9e0818c8de5e2ca9..29c5e245cca72b8da0448097f32dd1c58b8524aa 100755 (executable)
--- a/configure
+++ b/configure
@@ -1344,6 +1344,7 @@ PERL
 ETAGS
 LN
 ARFLAGS
+CCNOOPT
 CCOPT
 STD_CWARNINGS
 STD_CDEFINES
@@ -11830,6 +11831,7 @@ fi
 
 
 
+
 # Warn if the user specified libbind, which is now deprecated
 # Check whether --enable-libbind was given.
 if test "${enable_libbind+set}" = set; then :
@@ -12910,6 +12912,13 @@ case "$host" in
          ;;
 esac
 
+#
+# CCNOOPT defaults to -O0 on gcc and disables optimization when is last
+#
+if test "X$CCNOOPT" = "X" -a "X$GCC" = "Xyes"; then
+       CCNOOPT="-O0"
+fi
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
 $as_echo_n "checking for ANSI C header files... " >&6; }
 if ${ac_cv_header_stdc+:} false; then :
@@ -15625,11 +15634,13 @@ then
                *-freebsd*)
                        CC="$CC -pthread"
                        CCOPT="$CCOPT -pthread"
+                       CCNOOPT="$CCNOOPT -pthread"
                        STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
                        ;;
                *-openbsd*)
                        CC="$CC -pthread"
                        CCOPT="$CCOPT -pthread"
+                       CCNOOPT="$CCNOOPT -pthread"
                        ;;
                *-solaris*)
                        LIBS="$LIBS -lthread"
@@ -15643,10 +15654,12 @@ then
                *-dec-osf*)
                        CC="$CC -pthread"
                        CCOPT="$CCOPT -pthread"
+                       CCNOOPT="$CCNOOPT -pthread"
                        ;;
                *-solaris*)
                        CC="$CC -mt"
                        CCOPT="$CCOPT -mt"
+                       CCNOOPT="$CCNOOPT -mt"
                        ;;
                *-ibm-aix*)
                        STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
@@ -15654,10 +15667,12 @@ then
                *-sco-sysv*uw*|*-*-sysv*UnixWare*)
                        CC="$CC -Kthread"
                        CCOPT="$CCOPT -Kthread"
+                       CCNOOPT="$CCNOOPT -Kthread"
                        ;;
                *-*-sysv*OpenUNIX*)
                        CC="$CC -Kpthread"
                        CCOPT="$CCOPT -Kpthread"
+                       CCNOOPT="$CCNOOPT -Kpthread"
                        ;;
                esac
        fi
@@ -16197,6 +16212,7 @@ else
        *-dec-osf*)
                CC="$CC -std"
                CCOPT="$CCOPT -std"
+               CCNOOPT="$CCNOOPT -std"
                MKDEPCC="$CC"
                ;;
        *-hp-hpux*)
@@ -16215,6 +16231,7 @@ else
                        ;;
                esac
                CCOPT="$CCOPT -Ae -z"
+               CCNOOPT="$CCNOOPT -Ae -z"
                LDFLAGS="-Wl,+vnocompatwarnings $LDFLAGS"
                MKDEPPROG='cc -Ae -E -Wp,-M >/dev/null 2>>$TMP'
                ;;
index 62ba467ba7a2cff3360df3774b003f8174f8c21b..447930599d49f8a48eea347f6fb9ad8965197305 100644 (file)
@@ -50,6 +50,7 @@ AC_SUBST(STD_CINCLUDES)
 AC_SUBST(STD_CDEFINES)
 AC_SUBST(STD_CWARNINGS)
 AC_SUBST(CCOPT)
+AC_SUBST(CCNOOPT)
 
 # Warn if the user specified libbind, which is now deprecated
 AC_ARG_ENABLE(libbind, [  --enable-libbind       deprecated])
@@ -355,6 +356,13 @@ case "$host" in
          ;;
 esac
 
+#
+# CCNOOPT defaults to -O0 on gcc and disables optimization when is last
+#
+if test "X$CCNOOPT" = "X" -a "X$GCC" = "Xyes"; then
+       CCNOOPT="-O0"
+fi
+
 AC_HEADER_STDC
 
 AC_CHECK_HEADERS(fcntl.h regex.h sys/time.h unistd.h sys/mman.h sys/sockio.h sys/select.h sys/param.h sys/sysctl.h net/if6.h,,,
@@ -1307,11 +1315,13 @@ then
                *-freebsd*)
                        CC="$CC -pthread"
                        CCOPT="$CCOPT -pthread"
+                       CCNOOPT="$CCNOOPT -pthread"
                        STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
                        ;;
                *-openbsd*)
                        CC="$CC -pthread"
                        CCOPT="$CCOPT -pthread"
+                       CCNOOPT="$CCNOOPT -pthread"
                        ;;
                *-solaris*)
                        LIBS="$LIBS -lthread"
@@ -1325,10 +1335,12 @@ then
                *-dec-osf*)
                        CC="$CC -pthread"
                        CCOPT="$CCOPT -pthread"
+                       CCNOOPT="$CCNOOPT -pthread"
                        ;;
                *-solaris*)
                        CC="$CC -mt"
                        CCOPT="$CCOPT -mt"
+                       CCNOOPT="$CCNOOPT -mt"
                        ;;
                *-ibm-aix*)
                        STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
@@ -1336,10 +1348,12 @@ then
                *-sco-sysv*uw*|*-*-sysv*UnixWare*)
                        CC="$CC -Kthread"
                        CCOPT="$CCOPT -Kthread"
+                       CCNOOPT="$CCNOOPT -Kthread"
                        ;;
                *-*-sysv*OpenUNIX*)
                        CC="$CC -Kpthread"
                        CCOPT="$CCOPT -Kpthread"
+                       CCNOOPT="$CCNOOPT -Kpthread"
                        ;;
                esac
        fi
@@ -1591,6 +1605,7 @@ else
        *-dec-osf*)
                CC="$CC -std"
                CCOPT="$CCOPT -std"
+               CCNOOPT="$CCNOOPT -std"
                MKDEPCC="$CC"
                ;;
        *-hp-hpux*)
@@ -1609,6 +1624,7 @@ else
                        ;;
                esac
                CCOPT="$CCOPT -Ae -z"
+               CCNOOPT="$CCNOOPT -Ae -z"
                LDFLAGS="-Wl,+vnocompatwarnings $LDFLAGS"
                MKDEPPROG='cc -Ae -E -Wp,-M >/dev/null 2>>$TMP'
                ;;
index 256abb6eb475e24b6b005d6347070d251c1c1b0a..959e049be3ffa0041b52ff2f9495aeac160c054e 100644 (file)
@@ -42,6 +42,7 @@
 #include <isc/md5.h>
 #include <isc/sha1.h>
 #include <isc/mem.h>
+#include <isc/safe.h>
 #include <isc/string.h>
 #include <isc/util.h>
 
@@ -138,7 +139,7 @@ hmacmd5_compare(const dst_key_t *key1, const dst_key_t *key2) {
        else if (hkey1 == NULL || hkey2 == NULL)
                return (ISC_FALSE);
 
-       if (memcmp(hkey1->key, hkey2->key, ISC_SHA1_BLOCK_LENGTH) == 0)
+       if (isc_safe_memcmp(hkey1->key, hkey2->key, ISC_SHA1_BLOCK_LENGTH))
                return (ISC_TRUE);
        else
                return (ISC_FALSE);
@@ -415,7 +416,7 @@ hmacsha1_compare(const dst_key_t *key1, const dst_key_t *key2) {
        else if (hkey1 == NULL || hkey2 == NULL)
                return (ISC_FALSE);
 
-       if (memcmp(hkey1->key, hkey2->key, ISC_SHA1_BLOCK_LENGTH) == 0)
+       if (isc_safe_memcmp(hkey1->key, hkey2->key, ISC_SHA1_BLOCK_LENGTH))
                return (ISC_TRUE);
        else
                return (ISC_FALSE);
@@ -692,7 +693,7 @@ hmacsha224_compare(const dst_key_t *key1, const dst_key_t *key2) {
        else if (hkey1 == NULL || hkey2 == NULL)
                return (ISC_FALSE);
 
-       if (memcmp(hkey1->key, hkey2->key, ISC_SHA224_BLOCK_LENGTH) == 0)
+       if (isc_safe_memcmp(hkey1->key, hkey2->key, ISC_SHA224_BLOCK_LENGTH))
                return (ISC_TRUE);
        else
                return (ISC_FALSE);
@@ -971,7 +972,7 @@ hmacsha256_compare(const dst_key_t *key1, const dst_key_t *key2) {
        else if (hkey1 == NULL || hkey2 == NULL)
                return (ISC_FALSE);
 
-       if (memcmp(hkey1->key, hkey2->key, ISC_SHA256_BLOCK_LENGTH) == 0)
+       if (isc_safe_memcmp(hkey1->key, hkey2->key, ISC_SHA256_BLOCK_LENGTH))
                return (ISC_TRUE);
        else
                return (ISC_FALSE);
@@ -1250,7 +1251,7 @@ hmacsha384_compare(const dst_key_t *key1, const dst_key_t *key2) {
        else if (hkey1 == NULL || hkey2 == NULL)
                return (ISC_FALSE);
 
-       if (memcmp(hkey1->key, hkey2->key, ISC_SHA384_BLOCK_LENGTH) == 0)
+       if (isc_safe_memcmp(hkey1->key, hkey2->key, ISC_SHA384_BLOCK_LENGTH))
                return (ISC_TRUE);
        else
                return (ISC_FALSE);
@@ -1529,7 +1530,7 @@ hmacsha512_compare(const dst_key_t *key1, const dst_key_t *key2) {
        else if (hkey1 == NULL || hkey2 == NULL)
                return (ISC_FALSE);
 
-       if (memcmp(hkey1->key, hkey2->key, ISC_SHA512_BLOCK_LENGTH) == 0)
+       if (isc_safe_memcmp(hkey1->key, hkey2->key, ISC_SHA512_BLOCK_LENGTH))
                return (ISC_TRUE);
        else
                return (ISC_FALSE);
index 7dff06cc7d07dda0333cab0dbe6a84cb11490c72..31aef10b0839ac7a900fa51e0055fd2818b1992f 100644 (file)
@@ -62,7 +62,7 @@ OBJS =                @ISC_EXTRA_OBJS@ \
                parseint.@O@ portset.@O@ quota.@O@ radix.@O@ random.@O@ \
                ratelimiter.@O@ refcount.@O@ region.@O@ regex.@O@ result.@O@ \
                rwlock.@O@ \
-               serial.@O@ sha1.@O@ sha2.@O@ sockaddr.@O@ stats.@O@ \
+               safe.@O@ serial.@O@ sha1.@O@ sha2.@O@ sockaddr.@O@ stats.@O@ \
                string.@O@ strtoul.@O@ symtab.@O@ task.@O@ taskpool.@O@ \
                timer.@O@ version.@O@ ${UNIXOBJS} ${NLSOBJS} ${THREADOBJS}
 SYMTBLOBJS =   backtrace-emptytbl.@O@
@@ -78,8 +78,9 @@ SRCS =                @ISC_EXTRA_SRCS@ \
                netaddr.c netscope.c pool.c ondestroy.c \
                parseint.c portset.c quota.c radix.c random.c \
                ratelimiter.c refcount.c region.c regex.c result.c rwlock.c \
-               serial.c sha1.c sha2.c sockaddr.c stats.c string.c strtoul.c \
-               symtab.c symtbl-empty.c task.c taskpool.c timer.c version.c
+               safe.c serial.c sha1.c sha2.c sockaddr.c stats.c string.c \
+               strtoul.c symtab.c symtbl-empty.c task.c taskpool.c timer.c \
+               version.c
 
 LIBS =         @LIBS@
 
@@ -93,6 +94,10 @@ TESTDIRS =   @UNITTESTS@
 
 @BIND9_MAKE_RULES@
 
+safe.@O@: safe.c
+       ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} @CCNOOPT@ \
+               -c ${srcdir}/safe.c
+
 version.@O@: version.c
        ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
                -DVERSION=\"${VERSION}\" \
index 6abe6e27df8e37010db04872efac0fcf5c290898..4850e74c2a372ee42219f35a251a0aa198ac1ddb 100644 (file)
@@ -28,6 +28,7 @@
 #include <isc/hmacmd5.h>
 #include <isc/md5.h>
 #include <isc/platform.h>
+#include <isc/safe.h>
 #include <isc/string.h>
 #include <isc/types.h>
 #include <isc/util.h>
@@ -145,5 +146,5 @@ isc_hmacmd5_verify2(isc_hmacmd5_t *ctx, unsigned char *digest, size_t len) {
 
        REQUIRE(len <= ISC_MD5_DIGESTLENGTH);
        isc_hmacmd5_sign(ctx, newdigest);
-       return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+       return (isc_safe_memcmp(digest, newdigest, len));
 }
index d7b9f1897eb0ebc4e571c2e7cf9558818dd4cf3c..7b588f9a1ea99cc8d5661885e8eea6e78c87c88d 100644 (file)
@@ -27,6 +27,7 @@
 #include <isc/assertions.h>
 #include <isc/hmacsha.h>
 #include <isc/platform.h>
+#include <isc/safe.h>
 #include <isc/sha1.h>
 #include <isc/sha2.h>
 #include <isc/string.h>
@@ -538,7 +539,7 @@ isc_hmacsha1_verify(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len) {
 
        REQUIRE(len <= ISC_SHA1_DIGESTLENGTH);
        isc_hmacsha1_sign(ctx, newdigest, ISC_SHA1_DIGESTLENGTH);
-       return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+       return (isc_safe_memcmp(digest, newdigest, len));
 }
 
 /*
@@ -551,7 +552,7 @@ isc_hmacsha224_verify(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len)
 
        REQUIRE(len <= ISC_SHA224_DIGESTLENGTH);
        isc_hmacsha224_sign(ctx, newdigest, ISC_SHA224_DIGESTLENGTH);
-       return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+       return (isc_safe_memcmp(digest, newdigest, len));
 }
 
 /*
@@ -564,7 +565,7 @@ isc_hmacsha256_verify(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len)
 
        REQUIRE(len <= ISC_SHA256_DIGESTLENGTH);
        isc_hmacsha256_sign(ctx, newdigest, ISC_SHA256_DIGESTLENGTH);
-       return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+       return (isc_safe_memcmp(digest, newdigest, len));
 }
 
 /*
@@ -577,7 +578,7 @@ isc_hmacsha384_verify(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len)
 
        REQUIRE(len <= ISC_SHA384_DIGESTLENGTH);
        isc_hmacsha384_sign(ctx, newdigest, ISC_SHA384_DIGESTLENGTH);
-       return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+       return (isc_safe_memcmp(digest, newdigest, len));
 }
 
 /*
@@ -590,5 +591,5 @@ isc_hmacsha512_verify(isc_hmacsha512_t *ctx, unsigned char *digest, size_t len)
 
        REQUIRE(len <= ISC_SHA512_DIGESTLENGTH);
        isc_hmacsha512_sign(ctx, newdigest, ISC_SHA512_DIGESTLENGTH);
-       return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+       return (isc_safe_memcmp(digest, newdigest, len));
 }
index e1eace28c5e3dc74cda7c9cb08ee0a66bb156f2a..e06b9c92408eddbc29d72a5fd9be9b654f546575 100644 (file)
@@ -37,7 +37,7 @@ HEADERS =     app.h assertions.h base64.h bind9.h bitstring.h boolean.h \
                namespace.h netaddr.h ondestroy.h os.h parseint.h \
                print.h quota.h radix.h random.h ratelimiter.h \
                refcount.h regex.h region.h resource.h \
-               result.h resultclass.h rwlock.h serial.h sha1.h sha2.h \
+               result.h resultclass.h rwlock.h safe.h serial.h sha1.h sha2.h \
                sockaddr.h socket.h stdio.h stdlib.h string.h \
                symtab.h \
                task.h taskpool.h timer.h types.h util.h version.h \
diff --git a/lib/isc/include/isc/safe.h b/lib/isc/include/isc/safe.h
new file mode 100644 (file)
index 0000000..89d56de
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2013  Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id$ */
+
+#ifndef ISC_SAFE_H
+#define ISC_SAFE_H 1
+
+/*! \file isc/safe.h */
+
+#include <isc/types.h>
+
+ISC_LANG_BEGINDECLS
+
+isc_boolean_t
+isc_safe_memcmp(const void *s1, const void *s2, size_t n);
+/*%<
+ * Clone of libc memcmp() safe to differential timing attacks.
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif /* ISC_SAFE_H */
diff --git a/lib/isc/safe.c b/lib/isc/safe.c
new file mode 100644 (file)
index 0000000..3f005d3
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2013  Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id$ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <isc/safe.h>
+#include <isc/util.h>
+
+#ifdef _MSC_VER
+#pragma optimize("", off)
+#endif
+
+isc_boolean_t
+isc_safe_memcmp(const void *s1, const void *s2, size_t n) {
+       isc_uint8_t acc = 0;
+
+       if (n != 0) {
+               const isc_uint8_t *p1 = s1, *p2 = s2;
+
+               do {
+                       acc |= *p1++ ^ *p2++;
+               } while (--n != 0);
+       }
+       return (ISC_TF(acc == 0));
+}
index cc5dca0ee40cde234360fd0dbd5b62b83d32bb9d..4d4328942fb2211604408ab0b775dd5d41f6563e 100644 (file)
@@ -37,13 +37,14 @@ LIBS =              @LIBS@ @ATFLIBS@
 OBJS =         isctest.@O@
 SRCS =         isctest.c taskpool_test.c socket_test.c hash_test.c \
                sockaddr_test.c symtab_test.c task_test.c queue_test.c \
-               parse_test.c pool_test.c regex_test.c socket_test.c
+               parse_test.c pool_test.c regex_test.c socket_test.c \
+               safe_test.c
 
 SUBDIRS =
 TARGETS =      taskpool_test@EXEEXT@ socket_test@EXEEXT@ hash_test@EXEEXT@ \
                sockaddr_test@EXEEXT@ symtab_test@EXEEXT@ task_test@EXEEXT@ \
                queue_test@EXEEXT@ parse_test@EXEEXT@ pool_test@EXEEXT@ \
-               regex_test@EXEEXT@ socket_test@EXEEXT@
+               regex_test@EXEEXT@ socket_test@EXEEXT@ safe_test@EXEEXT@
 
 @BIND9_MAKE_RULES@
 
@@ -87,6 +88,10 @@ regex_test@EXEEXT@: regex_test.@O@ ${ISCDEPLIBS}
        ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
                        regex_test.@O@ ${ISCLIBS} ${LIBS}
 
+safe_test@EXEEXT@: safe_test.@O@ ${ISCDEPLIBS}
+       ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+                       safe_test.@O@ ${ISCLIBS} ${LIBS}
+
 unit::
        sh ${top_srcdir}/unit/unittest.sh
 
diff --git a/lib/isc/tests/safe_test.c b/lib/isc/tests/safe_test.c
new file mode 100644 (file)
index 0000000..7b7ac39
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2013  Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id$ */
+
+/* ! \file */
+
+#include <config.h>
+
+#include <atf-c.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include <isc/safe.h>
+#include <isc/util.h>
+
+ATF_TC(isc_safe_memcmp);
+ATF_TC_HEAD(isc_safe_memcmp, tc) {
+       atf_tc_set_md_var(tc, "descr", "safe memcmp()");
+}
+ATF_TC_BODY(isc_safe_memcmp, tc) {
+       UNUSED(tc);
+
+       ATF_CHECK(isc_safe_memcmp("test", "test", 4));
+       ATF_CHECK(!isc_safe_memcmp("test", "tesc", 4));
+       ATF_CHECK(isc_safe_memcmp("\x00\x00\x00\x00", "\x00\x00\x00\x00", 4));
+       ATF_CHECK(!isc_safe_memcmp("\x00\x00\x00\x00", "\x00\x00\x00\x01", 4));
+       ATF_CHECK(!isc_safe_memcmp("\x00\x00\x00\x02", "\x00\x00\x00\x00", 4));
+}
+
+/*
+ * Main
+ */
+ATF_TP_ADD_TCS(tp) {
+       ATF_TP_ADD_TC(tp, isc_safe_memcmp);
+       return (atf_no_error());
+}
+
index 7f3cb62e18625aef7491febae642156a5d561663..5cfd7448441a1ab06f0ef4a4da024086add3f8ba 100644 (file)
@@ -449,6 +449,7 @@ isc_rwlock_lock
 isc_rwlock_trylock
 isc_rwlock_tryupgrade
 isc_rwlock_unlock
+isc_safe_memcmp
 isc_serial_eq
 isc_serial_ge
 isc_serial_gt
index 9ba26e49cb856c69bfb7c43db802bccac09715f8..871f97dfb4833955d2ed3db30d755e0ca51d8785 100644 (file)
@@ -495,6 +495,10 @@ SOURCE=..\include\isc\rwlock.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\include\isc\safe.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\include\isc\serial.h
 # End Source File
 # Begin Source File
@@ -775,6 +779,10 @@ SOURCE=..\rwlock.c
 # End Source File
 # Begin Source File
 
+SOURCE=..\safe.c
+# End Source File
+# Begin Source File
+
 SOURCE=..\serial.c
 # End Source File
 # Begin Source File
index 526cf6c14576dcf811cd2a7b7942c72b0cfc619a..a86c7b9142c5951cddce7747929655417203f1c7 100644 (file)
@@ -176,6 +176,7 @@ CLEAN :
        -@erase "$(INTDIR)\resource.obj"
        -@erase "$(INTDIR)\result.obj"
        -@erase "$(INTDIR)\rwlock.obj"
+       -@erase "$(INTDIR)\safe.obj"
        -@erase "$(INTDIR)\serial.obj"
        -@erase "$(INTDIR)\sha1.obj"
        -@erase "$(INTDIR)\sha2.obj"
@@ -281,6 +282,7 @@ LINK32_OBJS= \
        "$(INTDIR)\refcount.obj" \
        "$(INTDIR)\result.obj" \
        "$(INTDIR)\rwlock.obj" \
+       "$(INTDIR)\safe.obj" \
        "$(INTDIR)\serial.obj" \
        "$(INTDIR)\sha1.obj" \
        "$(INTDIR)\sha2.obj" \
@@ -439,6 +441,8 @@ CLEAN :
        -@erase "$(INTDIR)\result.sbr"
        -@erase "$(INTDIR)\rwlock.obj"
        -@erase "$(INTDIR)\rwlock.sbr"
+       -@erase "$(INTDIR)\safe.obj"
+       -@erase "$(INTDIR)\safe.sbr"
        -@erase "$(INTDIR)\serial.obj"
        -@erase "$(INTDIR)\serial.sbr"
        -@erase "$(INTDIR)\sha1.obj"
@@ -562,6 +566,7 @@ BSC32_SBRS= \
        "$(INTDIR)\refcount.sbr" \
        "$(INTDIR)\result.sbr" \
        "$(INTDIR)\rwlock.sbr" \
+       "$(INTDIR)\safe.sbr" \
        "$(INTDIR)\serial.sbr" \
        "$(INTDIR)\sha1.sbr" \
        "$(INTDIR)\sha2.sbr" \
@@ -654,6 +659,7 @@ LINK32_OBJS= \
        "$(INTDIR)\refcount.obj" \
        "$(INTDIR)\result.obj" \
        "$(INTDIR)\rwlock.obj" \
+       "$(INTDIR)\safe.obj" \
        "$(INTDIR)\serial.obj" \
        "$(INTDIR)\sha1.obj" \
        "$(INTDIR)\sha2.obj" \
@@ -1947,6 +1953,24 @@ SOURCE=..\rwlock.c
        $(CPP) $(CPP_PROJ) $(SOURCE)
 
 
+!ENDIF 
+
+SOURCE=..\safe.c
+
+!IF  "$(CFG)" == "libisc - Win32 Release"
+
+
+"$(INTDIR)\safe.obj" : $(SOURCE) "$(INTDIR)"
+       $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "libisc - Win32 Debug"
+
+
+"$(INTDIR)\safe.obj"   "$(INTDIR)\safe.sbr" : $(SOURCE) "$(INTDIR)"
+       $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
 !ENDIF 
 
 SOURCE=..\serial.c
index 1b970cec47e41aa78591057835bbc7fea51f6535..912573b1c59296a6ed5fa98b4ba73b06cb7c251b 100644 (file)
@@ -43,6 +43,7 @@
 #include <isc/hmacmd5.h>
 #include <isc/hmacsha.h>
 #include <isc/print.h>
+#include <isc/safe.h>
 #include <isc/stdlib.h>
 
 #include <isccc/alist.h>
@@ -485,7 +486,7 @@ verify(isccc_sexpr_t *alist, unsigned char *data, unsigned int length,
                unsigned char *value;
 
                value = (unsigned char *) isccc_sexpr_tostring(hmac);
-               if (memcmp(value, digestb64, HMD5_LENGTH) != 0)
+               if (!isc_safe_memcmp(value, digestb64, HMD5_LENGTH))
                        return (ISCCC_R_BADAUTH);
        } else {
                unsigned char *value;
@@ -494,7 +495,7 @@ verify(isccc_sexpr_t *alist, unsigned char *data, unsigned int length,
                value = (unsigned char *) isccc_sexpr_tostring(hmac);
                GET8(valalg, value);
                if ((valalg != algorithm) ||
-                   (memcmp(value, digestb64, HSHA_LENGTH) != 0))
+                   (!isc_safe_memcmp(value, digestb64, HSHA_LENGTH)))
                        return (ISCCC_R_BADAUTH);
        }