diff --git b/crypto_aead/try.c a/crypto_aead/try.c
index 1cf6481..2e4f6ca 100644
--- b/crypto_aead/try.c
+++ a/crypto_aead/try.c
@@ -16,12 +16,20 @@ const char *primitiveimplementation = crypto_aead_IMPLEMENTATION;
 #else
 #define MAXTEST_BYTES 4096
 #endif
+
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 64
 #else
 #define LOOPS 512
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *k;
 static unsigned char *s;
 static unsigned char *p;
@@ -88,6 +96,18 @@ void doit(void)
   crypto_aead_decrypt(t,&tlen,r,c,clen,a,TUNE_BYTES,p,k);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(k, klen);
+  poison(s, slen);
+  crypto_aead_encrypt(c,&clen,m,TUNE_BYTES,a,TUNE_BYTES,s,p,k);
+
+  unpoison(c, clen);
+  crypto_aead_decrypt(t,&tlen,r,c,clen,a,TUNE_BYTES,p,k);
+}
+#endif
+
 void test(void)
 {
   unsigned long long loop;
diff --git b/crypto_auth/try.c a/crypto_auth/try.c
index 125c404..0dea5d8 100644
--- b/crypto_auth/try.c
+++ a/crypto_auth/try.c
@@ -16,12 +16,20 @@ const char *primitiveimplementation = crypto_auth_IMPLEMENTATION;
 #else
 #define MAXTEST_BYTES 4096
 #endif
+
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 4096
 #else
 #define LOOPS 32768
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *h;
 static unsigned char *m;
 static unsigned char *k;
@@ -61,6 +69,17 @@ void doit(void)
   crypto_auth_verify(h,m,TUNE_BYTES,k);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(k, klen);
+  crypto_auth(h,m,TUNE_BYTES,k);
+  unpoison(k, klen);
+  unpoison(h, hlen);
+  crypto_auth_verify(h,m,TUNE_BYTES,k);
+}
+#endif
+
 void test(void)
 {
   unsigned long long loop;
diff --git b/crypto_box/try.c a/crypto_box/try.c
index 023b92b..46eb407 100644
--- b/crypto_box/try.c
+++ a/crypto_box/try.c
@@ -17,12 +17,20 @@ const char *primitiveimplementation = crypto_box_IMPLEMENTATION;
 #else
 #define MAXTEST_BYTES 4096
 #endif
+
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 512
 #else
 #define LOOPS 4096
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *a;
 static unsigned char *b;
 static unsigned char *y;
@@ -111,6 +119,18 @@ void doit(void)
   crypto_box_open(t,c,TUNE_BYTES + crypto_box_ZEROBYTES,n,z,a);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(a, alen);
+  poison(b, blen);
+  poison(n, nlen);
+  crypto_box(c,m,TUNE_BYTES + crypto_box_ZEROBYTES,n,y,b);
+  unpoison(c, clen);
+  crypto_box_open(t,c,TUNE_BYTES + crypto_box_ZEROBYTES,n,z,a);
+}
+#endif
+
 void test(void)
 {
   unsigned long long j;
diff --git b/crypto_core/try.c a/crypto_core/try.c
index be424b1..87802ed 100644
--- b/crypto_core/try.c
+++ a/crypto_core/try.c
@@ -10,12 +10,19 @@
 
 const char *primitiveimplementation = crypto_core_IMPLEMENTATION;
 
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 512
 #else
 #define LOOPS 4096
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *h;
 static unsigned char *n;
 static unsigned char *k;
@@ -59,6 +66,14 @@ void doit(void)
   crypto_core(h,n,k,c);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(k, klen);
+  return doit();
+}
+#endif
+
 void test(void)
 {
   unsigned long long loop;
diff --git b/crypto_dh/try.c a/crypto_dh/try.c
index cacbd4e..8877443 100644
--- b/crypto_dh/try.c
+++ a/crypto_dh/try.c
@@ -10,12 +10,19 @@
 
 const char *primitiveimplementation = crypto_dh_IMPLEMENTATION;
 
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 64
 #else
 #define LOOPS 512
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *a;
 static unsigned char *b;
 static unsigned char *c;
@@ -75,7 +82,23 @@ void doit(void)
   crypto_dh_keypair(d,b);
   crypto_dh(e,d,a);
   crypto_dh(f,c,b);
+
+}
+
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(a, alen);
+  poison(b, blen);
+  crypto_dh_keypair(c,a);
+  crypto_dh_keypair(d,b);
+  unpoison(c, clen);
+  unpoison(d, dlen);
+  crypto_dh(e,d,a);
+  crypto_dh(f,c,b);
+
 }
+#endif
 
 void test(void)
 {
diff --git b/crypto_encrypt/try.c a/crypto_encrypt/try.c
index 9e9e596..0946e05 100644
--- b/crypto_encrypt/try.c
+++ a/crypto_encrypt/try.c
@@ -17,12 +17,20 @@ const char *primitiveimplementation = crypto_encrypt_IMPLEMENTATION;
 #else
 #define MAXTEST_BYTES 4096
 #endif
+
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 8
 #else
 #define LOOPS 64
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *p;
 static unsigned char *s;
 static unsigned char *m;
@@ -79,6 +87,15 @@ void doit(void)
   crypto_encrypt_open(t,&tlen,c,clen,s);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  crypto_encrypt(c,&clen,m,mlen,p);
+  poison(s, slen);
+  crypto_encrypt_open(t,&tlen,c,clen,s);
+}
+#endif
+
 void test(void)
 {
   unsigned long long loop;
diff --git b/crypto_hash/try.c a/crypto_hash/try.c
index 7d59887..7f814fb 100644
--- b/crypto_hash/try.c
+++ a/crypto_hash/try.c
@@ -16,12 +16,20 @@ const char *primitiveimplementation = crypto_hash_IMPLEMENTATION;
 #else
 #define MAXTEST_BYTES 4096
 #endif
+
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 64
 #else
 #define LOOPS 512
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *h;
 static unsigned char *m;
 static unsigned char *h2;
@@ -54,6 +62,14 @@ void doit(void)
   crypto_hash(h,m,TUNE_BYTES);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(m, TUNE_BYTES);
+  return doit();
+}
+#endif
+
 void test(void)
 {
   unsigned long long loop;
diff --git b/crypto_hashblocks/try.c a/crypto_hashblocks/try.c
index 41b6819..c79a2ea 100644
--- b/crypto_hashblocks/try.c
+++ a/crypto_hashblocks/try.c
@@ -16,12 +16,20 @@ const char *primitiveimplementation = crypto_hashblocks_IMPLEMENTATION;
 #else
 #define MAXTEST_BYTES 4096
 #endif
+
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 4096
 #else
 #define LOOPS 32768
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *h;
 static unsigned char *m;
 static unsigned char *h2;
@@ -54,6 +62,14 @@ void doit(void)
   crypto_hashblocks(h,m,TUNE_BYTES);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(m, TUNE_BYTES);
+  return doit();
+}
+#endif
+
 void test(void)
 {
   unsigned long long loop;
diff --git b/crypto_kem/try.c a/crypto_kem/try.c
index dad6e52..4f14a1b 100644
--- b/crypto_kem/try.c
+++ a/crypto_kem/try.c
@@ -16,12 +16,20 @@ const char *primitiveimplementation = crypto_kem_IMPLEMENTATION;
 #else
 #define MAXTEST_BYTES 4096
 #endif
+
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 8
 #else
 #define LOOPS 64
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *p;
 static unsigned char *s;
 static unsigned char *k;
@@ -78,6 +86,17 @@ void doit(void)
   crypto_kem_dec(t,c,s);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(k, klen);
+  poison(s, slen);
+  crypto_kem_enc(c,k,p);
+  unpoison(c, clen);
+  crypto_kem_dec(t,c,s);
+}
+#endif
+
 void test(void)
 {
   unsigned long long loop;
diff --git b/crypto_onetimeauth/try.c a/crypto_onetimeauth/try.c
index b23eedc..0a78b5b 100644
--- b/crypto_onetimeauth/try.c
+++ a/crypto_onetimeauth/try.c
@@ -16,12 +16,20 @@ const char *primitiveimplementation = crypto_onetimeauth_IMPLEMENTATION;
 #else
 #define MAXTEST_BYTES 4096
 #endif
+
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 4096
 #else
 #define LOOPS 32768
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *h;
 static unsigned char *m;
 static unsigned char *k;
@@ -61,6 +69,18 @@ void doit(void)
   crypto_onetimeauth_verify(h,m,TUNE_BYTES,k);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(k, klen);
+  crypto_onetimeauth(h,m,TUNE_BYTES,k);
+
+  unpoison(k, klen);
+  unpoison(h, hlen);
+  crypto_onetimeauth_verify(h,m,TUNE_BYTES,k);
+}
+#endif
+
 void test(void)
 {
   unsigned long long loop;
diff --git b/crypto_rng/try.c a/crypto_rng/try.c
index 9676552..f28c748 100644
--- b/crypto_rng/try.c
+++ a/crypto_rng/try.c
@@ -16,12 +16,20 @@ const char *primitiveimplementation = crypto_rng_IMPLEMENTATION;
 #else
 #define MAXTEST_BYTES 4096
 #endif
+
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 64
 #else
 #define LOOPS 512
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *k;
 static unsigned char *r;
 static unsigned char *n;
@@ -61,6 +69,15 @@ void doit(void)
   crypto_rng(r,n,k);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(k, klen);
+  poison(n, nlen);
+  return doit();
+}
+#endif
+
 void test(void)
 {
   unsigned long long loop;
diff --git b/crypto_scalarmult/try.c a/crypto_scalarmult/try.c
index 7ff4c1e..14867d2 100644
--- b/crypto_scalarmult/try.c
+++ a/crypto_scalarmult/try.c
@@ -11,12 +11,18 @@
 
 const char *primitiveimplementation = crypto_scalarmult_IMPLEMENTATION;
 
+#ifdef TIMECOP
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 64
 #else
 #define LOOPS 512
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *a;
 static unsigned char *b;
 static unsigned char *c;
@@ -77,6 +83,13 @@ void doit(void)
   crypto_scalarmult(f,b,c);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  return doit();
+}
+#endif
+
 void test(void)
 {
   unsigned long long loop;
diff --git b/crypto_secretbox/try.c a/crypto_secretbox/try.c
index f9f3d6b..ed65835 100644
--- b/crypto_secretbox/try.c
+++ a/crypto_secretbox/try.c
@@ -16,12 +16,20 @@ const char *primitiveimplementation = crypto_secretbox_IMPLEMENTATION;
 #else
 #define MAXTEST_BYTES 4096
 #endif
+
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 4096
 #else
 #define LOOPS 32768
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *k;
 static unsigned char *n;
 static unsigned char *m;
@@ -71,6 +79,19 @@ void doit(void)
   crypto_secretbox_open(t,c,TUNE_BYTES + crypto_secretbox_ZEROBYTES,n,k);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(k, klen);
+  poison(n, nlen);
+  crypto_secretbox(c,m,TUNE_BYTES + crypto_secretbox_ZEROBYTES,n,k);
+  unpoison(k, klen);
+  unpoison(n, nlen);
+  unpoison(c, clen);
+  crypto_secretbox_open(t,c,TUNE_BYTES + crypto_secretbox_ZEROBYTES,n,k);
+}
+#endif
+
 void test(void)
 {
   unsigned long long j;
diff --git b/crypto_sign/try.c a/crypto_sign/try.c
index 22b4d66..59df017 100644
--- b/crypto_sign/try.c
+++ a/crypto_sign/try.c
@@ -8,6 +8,9 @@
 #include "crypto_sign.h"
 #include "try.h"
 #include "randombytes.h"
+#ifdef TIMECOP
+#include "poison.h"
+#endif
 
 const char *primitiveimplementation = crypto_sign_IMPLEMENTATION;
 
@@ -17,12 +20,19 @@ const char *primitiveimplementation = crypto_sign_IMPLEMENTATION;
 #else
 #define MAXTEST_BYTES 4096
 #endif
+
+#ifdef TIMECOP
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 8
 #else
 #define LOOPS 64
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *p;
 static unsigned char *s;
 static unsigned char *m;
@@ -79,6 +89,17 @@ void doit(void)
   crypto_sign_open(t,&tlen,c,clen,p);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(s, crypto_sign_SECRETKEYBYTES);
+  crypto_sign(c,&clen,m,mlen,s);
+  unpoison(p, crypto_sign_PUBLICKEYBYTES);
+  unpoison(c, clen);
+  crypto_sign_open(t,&tlen,c,clen,p);
+}
+#endif
+
 void test(void)
 {
   unsigned long long loop;
diff --git b/crypto_sort/try.c a/crypto_sort/try.c
index 6f52dee..3b410eb 100644
--- b/crypto_sort/try.c
+++ a/crypto_sort/try.c
@@ -16,12 +16,20 @@ const char *primitiveimplementation = crypto_sort_IMPLEMENTATION;
 #else
 #define MAXTEST 4096
 #endif
+
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 1024
 #else
 #define LOOPS 4096
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *x;
 static unsigned char *y;
 static unsigned char *x2;
@@ -55,6 +63,15 @@ void doit(void)
   crypto_sort(x,TUNE);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  memcpy(x,y,crypto_sort_BYTES * TUNE);
+  poison(x, crypto_sort_BYTES * TUNE);
+  crypto_sort(x,TUNE);
+}
+#endif
+
 void test(void)
 {
   long long loop,bytes;
diff --git b/crypto_stream/try.c a/crypto_stream/try.c
index b5b0c50..ac526a4 100644
--- b/crypto_stream/try.c
+++ a/crypto_stream/try.c
@@ -16,12 +16,20 @@ const char *primitiveimplementation = crypto_stream_IMPLEMENTATION;
 #else
 #define MAXTEST_BYTES 4096
 #endif
+
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 512
 #else
 #define LOOPS 4096
 #endif
 
+#endif // ifdef TIMECOP
+
 static unsigned char *k;
 static unsigned char *n;
 static unsigned char *m;
@@ -70,6 +78,15 @@ void doit(void)
   crypto_stream_xor(c,m,TUNE_BYTES,n,k);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(k, klen);
+  poison(n, nlen);
+  return doit();
+}
+#endif
+
 void test(void)
 {
   unsigned long long j;
diff --git b/crypto_verify/try.c a/crypto_verify/try.c
index 278f924..abbe4e4 100644
--- b/crypto_verify/try.c
+++ a/crypto_verify/try.c
@@ -8,12 +8,19 @@
 #include "kernelrandombytes.h"
 #include "try.h"
 
+#ifdef TIMECOP
+#include "poison.h"
+#define LOOPS 1
+#else // not TIMECOP
+
 #ifdef SMALL
 #define LOOPS 10000
 #else
 #define LOOPS 1000000
 #endif
 
+#endif // ifdef TIMECOP
+
 const char *primitiveimplementation = crypto_verify_IMPLEMENTATION;
 
 static unsigned char *x;
@@ -38,6 +45,17 @@ void doit(void)
   crypto_verify(x,y);
 }
 
+#ifdef TIMECOP
+void timecop_doit(void)
+{
+  poison(x, crypto_verify_BYTES);
+  poison(y, crypto_verify_BYTES);
+  doit();
+  unpoison(x, crypto_verify_BYTES);
+  unpoison(y, crypto_verify_BYTES);
+}
+#endif
+
 static void check(void)
 {
   int r = crypto_verify(x,y);
diff --git b/do-part a/do-part
index 0e73a9d..34b39f8 100755
--- b/do-part
+++ a/do-part
@@ -443,6 +443,9 @@ do
 	    okar-$abi cr "$op.a" *.o || continue
 	    ranlib "$op.a"
 
+            if [ -z ${SUPERCOP_SKIP_MEASUREMENTS} ]
+            then
+
 	    killafter 300 \
 	    $compiler -DSUPERCOP -DSMALL \
 	      -I. -I"$include" -I"$include/$abi" \
@@ -516,6 +519,52 @@ do
 	    [ "x$expectedchecksumbig" = "x" ] && checksumok=unknown
 	    echo "$version $shorthostname $abi $startdate $o $p try $checksumsmall/$checksumbig $checksumok $cycles $checksumcycles $cyclespersecond $impl $compilerword" >&5
 
+            fi
+
+            # If valgrind is present, check for timing leaks
+	    if [ -n `which valgrind` -a -z ${SUPERCOP_SKIP_VALGRIND} ]
+	    then
+	       ok=1
+	       # Compile and link the program that tests whether the
+	       # implementation shows non-constant-time behaviour.
+	       killafter 300 \
+	                 $compiler -DSUPERCOP -DTIMECOP \
+	                 -I. -I"$include" -I"$include/$abi" \
+	                 -o try try.$language try-anything.$language \
+	                 "$op.a" $trylibs >../errors 2>&1 || ok=0
+	       cat ../errors \
+	           | while read err
+	             do
+	                 echo "$version $shorthostname $abi $startdate $o $p fromcompiler $implementationdir $compilerword try.$language $err" >&5
+	             done
+	       [ "$ok" = 1 ] || continue
+
+	       # Run the try program through valgrind
+	       if sh -c 'killafter 360 valgrind --tool=memcheck --error-exitcode=99 --track-origins=yes ./try || exit $?' >../outputs 2>../errors
+	       then
+	           echo "$version $shorthostname $abi $startdate $o $p valgrind_pass $implementationdir $compilerword $?" >&5
+	       else
+	           # Only flag those runs as fails that contain the string
+	           # 'client request'. There is no way to tell Valgrind to only
+	           # search for errors that are rooted in client requests.
+	           if [ $? -eq "99" ] && `grep -q "client request" ../outputs ../errors`
+	           then
+	               word=valgrind_fail
+	           else
+	               word=valgrind_error
+	           fi
+	           echo "$version $shorthostname $abi $startdate $o $p $word $implementationdir $compilerword error $?" >&5
+	           cat ../outputs ../errors \
+	               | while read err
+	                 do
+	                     echo "$version $shorthostname $abi $startdate $o $p $word $implementationdir $compilerword $err" >&5
+	                 done
+	       fi
+            fi
+
+            if [ -z ${SUPERCOP_SKIP_MEASUREMENTS} ]
+            then
+
 	    [ -s ../bestc/median ] && [ `cat ../bestc/median` -le $cycles ] && continue
 
 	    killafter 3600 \
@@ -545,6 +594,9 @@ do
 	      cp -p "$o.h" "../$b/$o.h"
 	      cp -p measure ../$b/measure
 	    done
+
+            fi
+
 	  done
 	)
       done
diff --git b/include/try.h a/include/try.h
index 47db359..8197eac 100644
--- b/include/try.h
+++ a/include/try.h
@@ -8,6 +8,7 @@ extern void allocate(void);;
 extern void test(void);
 extern void predoit(void);
 extern void doit(void);
+extern void timecop_doit(void);
 
 /* provided by try-anything.c: */
 extern void fail(const char *);
diff --git b/try-anything.c a/try-anything.c
index 0734fa7..545429e 100644
--- b/try-anything.c
+++ a/try-anything.c
@@ -242,7 +242,13 @@ unsigned char *alignedcalloc(unsigned long long len)
   return x;
 }
 
+// To check for timing leaks it's sufficient to run it once.
+#ifdef TIMECOP
+#define TIMINGS 1
+#else
 #define TIMINGS 63
+#endif
+
 static long long cycles[TIMINGS + 1];
 
 void limits()
@@ -296,7 +302,11 @@ int main()
   }
   for (i = 0;i <= TIMINGS;++i) {
     cycles[i] = cpucycles();
+#ifdef TIMECOP
+    timecop_doit();
+#else
     doit();
+#endif
   }
   for (i = 0;i < TIMINGS;++i) cycles[i] = cycles[i + 1] - cycles[i];
   for (j = 0;j < TIMINGS;++j) {
