summaryrefslogtreecommitdiff
path: root/sys/src/libsec/port/tsmemcmp.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-11-26 15:25:10 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2015-11-26 15:25:10 +0100
commit254031cf7020f1b185c6d0af89c653a271e0ed01 (patch)
tree9d8b55c3639a7c137ca6cd135a81b5f395d5f860 /sys/src/libsec/port/tsmemcmp.c
parent90695e2eb24430a984e76afb6aaf1c10e2d4809e (diff)
libsec: add chacha20 poly1305 aead, allow 64 bit iv's for chacha, add tsmemcmp()
chacha20 comes in two variants: ietf rfc7539, using 96 bit iv and 32 bit counter and draft-agl-tls-chacha20poly1305 using 64 bit iv and a 64 bit counter. so setupChachastate() now takes a ivlen argument which sets the mode. add ccpoly_encrypt()/ccpoly_decrypt() routines. to implement timing safe ccpoly_decrypt(), a constant time memcmp was needed, so adding tsmemcmp() to libsec.
Diffstat (limited to 'sys/src/libsec/port/tsmemcmp.c')
-rw-r--r--sys/src/libsec/port/tsmemcmp.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/sys/src/libsec/port/tsmemcmp.c b/sys/src/libsec/port/tsmemcmp.c
new file mode 100644
index 000000000..6cc75377d
--- /dev/null
+++ b/sys/src/libsec/port/tsmemcmp.c
@@ -0,0 +1,26 @@
+#include <u.h>
+#include <libc.h>
+#include <libsec.h>
+
+/*
+ * timing safe memcmp()
+ */
+int
+tsmemcmp(void *a1, void *a2, ulong n)
+{
+ int lt, gt, c1, c2, r, m;
+ uchar *s1, *s2;
+
+ r = m = 0;
+ s1 = a1;
+ s2 = a2;
+ while(n--){
+ c1 = *s1++;
+ c2 = *s2++;
+ lt = (c1 - c2) >> 8;
+ gt = (c2 - c1) >> 8;
+ r |= (lt - gt) & ~m;
+ m |= lt | gt;
+ }
+ return r;
+}