diff --git a/test/ct.cpp b/test/ct.cpp index 02ce9d13..30b0e760 100644 --- a/test/ct.cpp +++ b/test/ct.cpp @@ -83,3 +83,30 @@ TEST(ConstantTime, CtCheck_memcmp) { ct_purify(&ret, 1); ASSERT_EQ(ret,1); } + +TEST(ConstantTime, CtCheck_memcmp_chained) { + unsigned char a[16], b[16], c[16], d[16]; + memset(a, 42, sizeof(a)); + memset(b, 42, sizeof(b)); + memset(d, 42, sizeof(b)); + memset(c, 41, sizeof(c)); + uint8_t ret; + + ct_poison(a, 16); + + ct_expect_umr(); + // obviously must generate UMR if if first check fails + // and second is not done + ret = (ct_memcmp(a,c,16)==0) && (ct_memcmp(a,b,16)==0); + ct_require_umr(); + ct_purify(&ret, 1); + ASSERT_EQ(ret,0); + + ct_expect_umr(); + // it's still UMR even if both checks are OK + ret = (ct_memcmp(a,d,16)==0) && (ct_memcmp(a,b,16)==0); + ct_require_umr(); + + ct_purify(&ret, 1); + ASSERT_EQ(ret,1); +}