diff options
Diffstat (limited to 'lib/liboqs/src/kem/kyber/pqcrystals-kyber_kyber768_ref/verify.c')
-rw-r--r-- | lib/liboqs/src/kem/kyber/pqcrystals-kyber_kyber768_ref/verify.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/liboqs/src/kem/kyber/pqcrystals-kyber_kyber768_ref/verify.c b/lib/liboqs/src/kem/kyber/pqcrystals-kyber_kyber768_ref/verify.c new file mode 100644 index 000000000..ed4a6541f --- /dev/null +++ b/lib/liboqs/src/kem/kyber/pqcrystals-kyber_kyber768_ref/verify.c @@ -0,0 +1,47 @@ +#include <stddef.h> +#include <stdint.h> +#include "verify.h" + +/************************************************* +* Name: verify +* +* Description: Compare two arrays for equality in constant time. +* +* Arguments: const uint8_t *a: pointer to first byte array +* const uint8_t *b: pointer to second byte array +* size_t len: length of the byte arrays +* +* Returns 0 if the byte arrays are equal, 1 otherwise +**************************************************/ +int verify(const uint8_t *a, const uint8_t *b, size_t len) +{ + size_t i; + uint8_t r = 0; + + for(i=0;i<len;i++) + r |= a[i] ^ b[i]; + + return (-(uint64_t)r) >> 63; +} + +/************************************************* +* Name: cmov +* +* Description: Copy len bytes from x to r if b is 1; +* don't modify x if b is 0. Requires b to be in {0,1}; +* assumes two's complement representation of negative integers. +* Runs in constant time. +* +* Arguments: uint8_t *r: pointer to output byte array +* const uint8_t *x: pointer to input byte array +* size_t len: Amount of bytes to be copied +* uint8_t b: Condition bit; has to be in {0,1} +**************************************************/ +void cmov(uint8_t *r, const uint8_t *x, size_t len, uint8_t b) +{ + size_t i; + + b = -b; + for(i=0;i<len;i++) + r[i] ^= b & (r[i] ^ x[i]); +} |