diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-11-26 15:25:10 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-11-26 15:25:10 +0100 |
commit | 254031cf7020f1b185c6d0af89c653a271e0ed01 (patch) | |
tree | 9d8b55c3639a7c137ca6cd135a81b5f395d5f860 /sys/src/libsec/port/tsmemcmp.c | |
parent | 90695e2eb24430a984e76afb6aaf1c10e2d4809e (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.c | 26 |
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; +} |