From 2e1e8d27892e64eb6446a94333fd88c6a454b781 Mon Sep 17 00:00:00 2001 From: Marco Oliverio Date: Mon, 25 Jul 2022 17:48:26 +0200 Subject: [PATCH] misc.c: introduce ctMaskCopy() --- wolfcrypt/src/misc.c | 11 +++++++++++ wolfssl/wolfcrypt/misc.h | 2 ++ 2 files changed, 13 insertions(+) diff --git a/wolfcrypt/src/misc.c b/wolfcrypt/src/misc.c index da2778ea9..7d534ffde 100644 --- a/wolfcrypt/src/misc.c +++ b/wolfcrypt/src/misc.c @@ -544,6 +544,17 @@ WC_STATIC WC_INLINE byte ctSetLTE(int a, int b) { return (byte)(((word32)a - b - 1) >> 31); } + +/* Constant time - copy size bytes from left to dst if mask is set, size bytes + * from right to dst if mask is not set */ +WC_STATIC WC_INLINE void ctMaskCopy(byte m, byte* dst, byte* left, byte* right, + word16 size) +{ + int i; + for (i = 0; i < size; ++i) + dst[i] = ctMaskSel(m, left[i], right[i]); +} + #endif #if defined(WOLFSSL_W64_WRAPPER) diff --git a/wolfssl/wolfcrypt/misc.h b/wolfssl/wolfcrypt/misc.h index 03312bfcc..d0231e5ff 100644 --- a/wolfssl/wolfcrypt/misc.h +++ b/wolfssl/wolfcrypt/misc.h @@ -126,6 +126,8 @@ WOLFSSL_LOCAL byte ctMaskNotEq(int a, int b); WOLFSSL_LOCAL byte ctMaskSel(byte m, byte a, byte b); WOLFSSL_LOCAL int ctMaskSelInt(byte m, int a, int b); WOLFSSL_LOCAL byte ctSetLTE(int a, int b); +WOLFSSL_LOCAL void ctMaskCopy(byte m, byte* dst, byte* left, byte* right, + word16 size); #endif /* NO_INLINE */