diff --git a/crypto/constant_time_test.c b/crypto/constant_time_test.c
new file mode 100644
index 0000000..bc127c1
--- /dev/null
+++ b/crypto/constant_time_test.c
@@ -0,0 +1,307 @@
+/*
+ * Utilities for constant-time cryptography.
+ *
+ * Author: Emilia Kasper (emilia@openssl.org)
+ * Based on previous work by Bodo Moeller, Emilia Kasper, Adam Langley
+ * (Google).
+ * ====================================================================
+ * Copyright (c) 2014 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include "internal.h"
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+
+static const unsigned int CONSTTIME_TRUE = (unsigned)(~0);
+static const unsigned int CONSTTIME_FALSE = 0;
+static const uint8_t CONSTTIME_TRUE_8 = 0xff;
+static const uint8_t CONSTTIME_FALSE_8 = 0;
+
+static int test_binary_op(unsigned int (*op)(unsigned int a, unsigned int b),
+                          const char* op_name, unsigned int a, unsigned int b,
+                          int is_true) {
+  unsigned c = op(a, b);
+  if (is_true && c != CONSTTIME_TRUE) {
+    fprintf(stderr,
+            "Test failed for %s(%du, %du): expected %du (TRUE), got %du\n",
+            op_name, a, b, CONSTTIME_TRUE, c);
+    return 1;
+  } else if (!is_true && c != CONSTTIME_FALSE) {
+    fprintf(stderr,
+            "Test failed for  %s(%du, %du): expected %du (FALSE), got %du\n",
+            op_name, a, b, CONSTTIME_FALSE, c);
+    return 1;
+  }
+  return 0;
+}
+
+static int test_binary_op_8(uint8_t (*op)(unsigned int a, unsigned int b),
+                            const char* op_name, unsigned int a, unsigned int b,
+                            int is_true) {
+  uint8_t c = op(a, b);
+  if (is_true && c != CONSTTIME_TRUE_8) {
+    fprintf(stderr,
+            "Test failed for %s(%du, %du): expected %u (TRUE), got %u\n",
+            op_name, a, b, CONSTTIME_TRUE_8, c);
+    return 1;
+  } else if (!is_true && c != CONSTTIME_FALSE_8) {
+    fprintf(stderr,
+            "Test failed for  %s(%du, %du): expected %u (FALSE), got %u\n",
+            op_name, a, b, CONSTTIME_FALSE_8, c);
+    return 1;
+  }
+  return 0;
+}
+
+static int test_is_zero(unsigned int a) {
+  unsigned int c = constant_time_is_zero(a);
+  if (a == 0 && c != CONSTTIME_TRUE) {
+    fprintf(stderr,
+            "Test failed for constant_time_is_zero(%du): expected %du (TRUE), "
+            "got %du\n",
+            a, CONSTTIME_TRUE, c);
+    return 1;
+  } else if (a != 0 && c != CONSTTIME_FALSE) {
+    fprintf(stderr,
+            "Test failed for constant_time_is_zero(%du): expected %du (FALSE), "
+            "got %du\n",
+            a, CONSTTIME_FALSE, c);
+    return 1;
+  }
+  return 0;
+}
+
+static int test_is_zero_8(unsigned int a) {
+  uint8_t c = constant_time_is_zero_8(a);
+  if (a == 0 && c != CONSTTIME_TRUE_8) {
+    fprintf(stderr,
+            "Test failed for constant_time_is_zero(%du): expected %u (TRUE), "
+            "got %u\n",
+            a, CONSTTIME_TRUE_8, c);
+    return 1;
+  } else if (a != 0 && c != CONSTTIME_FALSE) {
+    fprintf(stderr,
+            "Test failed for constant_time_is_zero(%du): expected %u (FALSE), "
+            "got %u\n",
+            a, CONSTTIME_FALSE_8, c);
+    return 1;
+  }
+  return 0;
+}
+
+static int test_select(unsigned int a, unsigned int b) {
+  unsigned int selected = constant_time_select(CONSTTIME_TRUE, a, b);
+  if (selected != a) {
+    fprintf(stderr,
+            "Test failed for constant_time_select(%du, %du,"
+            "%du): expected %du(first value), got %du\n",
+            CONSTTIME_TRUE, a, b, a, selected);
+    return 1;
+  }
+  selected = constant_time_select(CONSTTIME_FALSE, a, b);
+  if (selected != b) {
+    fprintf(stderr,
+            "Test failed for constant_time_select(%du, %du,"
+            "%du): expected %du(second value), got %du\n",
+            CONSTTIME_FALSE, a, b, b, selected);
+    return 1;
+  }
+  return 0;
+}
+
+static int test_select_8(uint8_t a, uint8_t b) {
+  uint8_t selected = constant_time_select_8(CONSTTIME_TRUE_8, a, b);
+  if (selected != a) {
+    fprintf(stderr,
+            "Test failed for constant_time_select(%u, %u,"
+            "%u): expected %u(first value), got %u\n",
+            CONSTTIME_TRUE, a, b, a, selected);
+    return 1;
+  }
+  selected = constant_time_select_8(CONSTTIME_FALSE_8, a, b);
+  if (selected != b) {
+    fprintf(stderr,
+            "Test failed for constant_time_select(%u, %u,"
+            "%u): expected %u(second value), got %u\n",
+            CONSTTIME_FALSE, a, b, b, selected);
+    return 1;
+  }
+  return 0;
+}
+
+static int test_select_int(int a, int b) {
+  int selected = constant_time_select_int(CONSTTIME_TRUE, a, b);
+  if (selected != a) {
+    fprintf(stderr,
+            "Test failed for constant_time_select(%du, %d,"
+            "%d): expected %d(first value), got %d\n",
+            CONSTTIME_TRUE, a, b, a, selected);
+    return 1;
+  }
+  selected = constant_time_select_int(CONSTTIME_FALSE, a, b);
+  if (selected != b) {
+    fprintf(stderr,
+            "Test failed for constant_time_select(%du, %d,"
+            "%d): expected %d(second value), got %d\n",
+            CONSTTIME_FALSE, a, b, b, selected);
+    return 1;
+  }
+  return 0;
+}
+
+static int test_eq_int(int a, int b) {
+  unsigned int equal = constant_time_eq_int(a, b);
+  if (a == b && equal != CONSTTIME_TRUE) {
+    fprintf(stderr,
+            "Test failed for constant_time_eq_int(%d, %d): expected %du(TRUE), "
+            "got %du\n",
+            a, b, CONSTTIME_TRUE, equal);
+    return 1;
+  } else if (a != b && equal != CONSTTIME_FALSE) {
+    fprintf(stderr,
+            "Test failed for constant_time_eq_int(%d, %d): expected "
+            "%du(FALSE), got %du\n",
+            a, b, CONSTTIME_FALSE, equal);
+    return 1;
+  }
+  return 0;
+}
+
+static int test_eq_int_8(int a, int b) {
+  uint8_t equal = constant_time_eq_int_8(a, b);
+  if (a == b && equal != CONSTTIME_TRUE_8) {
+    fprintf(stderr,
+            "Test failed for constant_time_eq_int_8(%d, %d): expected "
+            "%u(TRUE), got %u\n",
+            a, b, CONSTTIME_TRUE_8, equal);
+    return 1;
+  } else if (a != b && equal != CONSTTIME_FALSE_8) {
+    fprintf(stderr,
+            "Test failed for constant_time_eq_int_8(%d, %d): expected "
+            "%u(FALSE), got %u\n",
+            a, b, CONSTTIME_FALSE_8, equal);
+    return 1;
+  }
+  return 0;
+}
+
+static unsigned int test_values[] = {0, 1, 1024, 12345, 32000, UINT_MAX / 2 - 1,
+                                     UINT_MAX / 2, UINT_MAX / 2 + 1,
+                                     UINT_MAX - 1, UINT_MAX};
+
+static uint8_t test_values_8[] = {0, 1, 2, 20, 32, 127, 128, 129, 255};
+
+static int signed_test_values[] = {
+    0,     1,      -1,      1024,    -1024,       12345,      -12345,
+    32000, -32000, INT_MAX, INT_MIN, INT_MAX - 1, INT_MIN + 1};
+
+int main(int argc, char* argv[]) {
+  unsigned int a, b, i, j;
+  int c, d;
+  uint8_t e, f;
+  int num_failed = 0, num_all = 0;
+  fprintf(stdout, "Testing constant time operations...\n");
+
+  for (i = 0; i < sizeof(test_values) / sizeof(int); ++i) {
+    a = test_values[i];
+    num_failed += test_is_zero(a);
+    num_failed += test_is_zero_8(a);
+    num_all += 2;
+    for (j = 0; j < sizeof(test_values) / sizeof(int); ++j) {
+      b = test_values[j];
+      num_failed +=
+          test_binary_op(&constant_time_lt, "constant_time_lt", a, b, a < b);
+      num_failed += test_binary_op_8(&constant_time_lt_8, "constant_time_lt_8",
+                                     a, b, a < b);
+      num_failed +=
+          test_binary_op(&constant_time_lt, "constant_time_lt_8", b, a, b < a);
+      num_failed += test_binary_op_8(&constant_time_lt_8, "constant_time_lt_8",
+                                     b, a, b < a);
+      num_failed +=
+          test_binary_op(&constant_time_ge, "constant_time_ge", a, b, a >= b);
+      num_failed += test_binary_op_8(&constant_time_ge_8, "constant_time_ge_8",
+                                     a, b, a >= b);
+      num_failed +=
+          test_binary_op(&constant_time_ge, "constant_time_ge", b, a, b >= a);
+      num_failed += test_binary_op_8(&constant_time_ge_8, "constant_time_ge_8",
+                                     b, a, b >= a);
+      num_failed +=
+          test_binary_op(&constant_time_eq, "constant_time_eq", a, b, a == b);
+      num_failed += test_binary_op_8(&constant_time_eq_8, "constant_time_eq_8",
+                                     a, b, a == b);
+      num_failed +=
+          test_binary_op(&constant_time_eq, "constant_time_eq", b, a, b == a);
+      num_failed += test_binary_op_8(&constant_time_eq_8, "constant_time_eq_8",
+                                     b, a, b == a);
+      num_failed += test_select(a, b);
+      num_all += 13;
+    }
+  }
+
+  for (i = 0; i < sizeof(signed_test_values) / sizeof(int); ++i) {
+    c = signed_test_values[i];
+    for (j = 0; j < sizeof(signed_test_values) / sizeof(int); ++j) {
+      d = signed_test_values[j];
+      num_failed += test_select_int(c, d);
+      num_failed += test_eq_int(c, d);
+      num_failed += test_eq_int_8(c, d);
+      num_all += 3;
+    }
+  }
+
+  for (i = 0; i < sizeof(test_values_8); ++i) {
+    e = test_values_8[i];
+    for (j = 0; j < sizeof(test_values_8); ++j) {
+      f = test_values_8[j];
+      num_failed += test_select_8(e, f);
+      num_all += 1;
+    }
+  }
+
+  if (!num_failed) {
+    fprintf(stdout, "ok (ran %d tests)\n", num_all);
+    fprintf(stdout, "PASS\n");
+    return EXIT_SUCCESS;
+  } else {
+    fprintf(stdout, "%d of %d tests failed!\n", num_failed, num_all);
+    return EXIT_FAILURE;
+  }
+}
diff --git a/crypto/internal.h b/crypto/internal.h
index e32f460..5b980d8 100644
--- a/crypto/internal.h
+++ b/crypto/internal.h
@@ -172,21 +172,45 @@
  * c = constant_time_select(lt, a, b); */
 
 /* constant_time_msb returns the given value with the MSB copied to all the
- * other bits. Uses the fact that arithmetic shift shifts-in the sign bit.
- * However, this is not ensured by the C standard so you may need to replace
- * this with something else on odd CPUs. */
+ * other bits. */
 static inline unsigned int constant_time_msb(unsigned int a) {
   return (unsigned int)((int)(a) >> (sizeof(int) * 8 - 1));
 }
 
 /* constant_time_lt returns 0xff..f if a < b and 0 otherwise. */
 static inline unsigned int constant_time_lt(unsigned int a, unsigned int b) {
-  unsigned int lt;
-  /* Case 1: msb(a) == msb(b). a < b iff the MSB of a - b is set.*/
-  lt = ~(a ^ b) & (a - b);
-  /* Case 2: msb(a) != msb(b). a < b iff the MSB of b is set. */
-  lt |= ~a & b;
-  return constant_time_msb(lt);
+  /* Consider the two cases of the problem:
+   *   msb(a) == msb(b): a < b iff the MSB of a - b is set.
+   *   msb(a) != msb(b): a < b iff the MSB of b is set.
+   *
+   * If msb(a) == msb(b) then the following evaluates as:
+   *   msb(a^((a^b)|((a-b)^a))) ==
+   *   msb(a^((a-b) ^ a))       ==   (because msb(a^b) == 0)
+   *   msb(a^a^(a-b))           ==   (rearranging)
+   *   msb(a-b)                      (because ∀x. x^x == 0)
+   *
+   * Else, if msb(a) != msb(b) then the following evaluates as:
+   *   msb(a^((a^b)|((a-b)^a))) ==
+   *   msb(a^(𝟙 | ((a-b)^a)))   ==   (because msb(a^b) == 1 and 𝟙
+   *                                  represents a value s.t. msb(𝟙) = 1)
+   *   msb(a^𝟙)                 ==   (because ORing with 1 results in 1)
+   *   msb(b)
+   *
+   *
+   * Here is an SMT-LIB verification of this formula:
+   *
+   * (define-fun lt ((a (_ BitVec 32)) (b (_ BitVec 32))) (_ BitVec 32)
+   *   (bvxor a (bvor (bvxor a b) (bvxor (bvsub a b) a)))
+   * )
+   *
+   * (declare-fun a () (_ BitVec 32))
+   * (declare-fun b () (_ BitVec 32))
+   *
+   * (assert (not (= (= #x00000001 (bvlshr (lt a b) #x0000001f)) (bvult a b))))
+   * (check-sat)
+   * (get-model)
+   */
+  return constant_time_msb(a^((a^b)|((a-b)^a)));
 }
 
 /* constant_time_lt_8 acts like |constant_time_lt| but returns an 8-bit mask. */
@@ -196,12 +220,7 @@
 
 /* constant_time_gt returns 0xff..f if a >= b and 0 otherwise. */
 static inline unsigned int constant_time_ge(unsigned int a, unsigned int b) {
-  unsigned int ge;
-  /* Case 1: msb(a) == msb(b). a >= b iff the MSB of a - b is not set.*/
-  ge = ~((a ^ b) | (a - b));
-  /* Case 2: msb(a) != msb(b). a >= b iff the MSB of a is set. */
-  ge |= a & ~b;
-  return constant_time_msb(ge);
+  return ~constant_time_lt(a, b);
 }
 
 /* constant_time_ge_8 acts like |constant_time_ge| but returns an 8-bit mask. */
@@ -211,6 +230,18 @@
 
 /* constant_time_is_zero returns 0xff..f if a == 0 and 0 otherwise. */
 static inline unsigned int constant_time_is_zero(unsigned int a) {
+  /* Here is an SMT-LIB verification of this formula:
+   *
+   * (define-fun is_zero ((a (_ BitVec 32))) (_ BitVec 32)
+   *   (bvand (bvnot a) (bvsub a #x00000001))
+   * )
+   *
+   * (declare-fun a () (_ BitVec 32))
+   *
+   * (assert (not (= (= #x00000001 (bvlshr (is_zero a) #x0000001f)) (= a #x00000000))))
+   * (check-sat)
+   * (get-model)
+   */
   return constant_time_msb(~a & (a - 1));
 }
 
diff --git a/util/all_tests.sh b/util/all_tests.sh
index 9a719c3..55588f0 100644
--- a/util/all_tests.sh
+++ b/util/all_tests.sh
@@ -31,6 +31,7 @@
 ./crypto/cipher/aead_test chacha20-poly1305 $SRC/crypto/cipher/chacha20_poly1305_tests.txt
 ./crypto/cipher/aead_test rc4-md5 $SRC/crypto/cipher/rc4_md5_tests.txt
 ./crypto/cipher/cipher_test $SRC/crypto/cipher/cipher_test.txt
+./crypto/constant_time_test
 ./crypto/dh/dh_test
 ./crypto/digest/digest_test
 ./crypto/dsa/dsa_test
