aboutsummaryrefslogtreecommitdiff
path: root/openssl/crypto/bn/bn_lib.c
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2014-04-14 23:45:39 +0200
committermarha <marha@users.sourceforge.net>2014-04-14 23:45:39 +0200
commit7c21629fbeb51b65fd0625bb36d888587d62fd89 (patch)
tree425433df36d64f529d2222de2d1680e0b0abca3f /openssl/crypto/bn/bn_lib.c
parent0bd141efd4832e01c8b269b8566dd5749e30ed55 (diff)
parent242d48135a12fc9167430f391ba0d27d9ad44c6b (diff)
downloadvcxsrv-7c21629fbeb51b65fd0625bb36d888587d62fd89.tar.gz
vcxsrv-7c21629fbeb51b65fd0625bb36d888587d62fd89.tar.bz2
vcxsrv-7c21629fbeb51b65fd0625bb36d888587d62fd89.zip
Merge remote-tracking branch 'origin/released'
Conflicts: openssl/Configure openssl/Makefile openssl/util/pl/VC-32.pl
Diffstat (limited to 'openssl/crypto/bn/bn_lib.c')
-rw-r--r--openssl/crypto/bn/bn_lib.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/openssl/crypto/bn/bn_lib.c b/openssl/crypto/bn/bn_lib.c
index 7a5676de6..5461e6ee7 100644
--- a/openssl/crypto/bn/bn_lib.c
+++ b/openssl/crypto/bn/bn_lib.c
@@ -824,3 +824,55 @@ int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b,
}
return bn_cmp_words(a,b,cl);
}
+
+/*
+ * Constant-time conditional swap of a and b.
+ * a and b are swapped if condition is not 0. The code assumes that at most one bit of condition is set.
+ * nwords is the number of words to swap. The code assumes that at least nwords are allocated in both a and b,
+ * and that no more than nwords are used by either a or b.
+ * a and b cannot be the same number
+ */
+void BN_consttime_swap(BN_ULONG condition, BIGNUM *a, BIGNUM *b, int nwords)
+ {
+ BN_ULONG t;
+ int i;
+
+ bn_wcheck_size(a, nwords);
+ bn_wcheck_size(b, nwords);
+
+ assert(a != b);
+ assert((condition & (condition - 1)) == 0);
+ assert(sizeof(BN_ULONG) >= sizeof(int));
+
+ condition = ((condition - 1) >> (BN_BITS2 - 1)) - 1;
+
+ t = (a->top^b->top) & condition;
+ a->top ^= t;
+ b->top ^= t;
+
+#define BN_CONSTTIME_SWAP(ind) \
+ do { \
+ t = (a->d[ind] ^ b->d[ind]) & condition; \
+ a->d[ind] ^= t; \
+ b->d[ind] ^= t; \
+ } while (0)
+
+
+ switch (nwords) {
+ default:
+ for (i = 10; i < nwords; i++)
+ BN_CONSTTIME_SWAP(i);
+ /* Fallthrough */
+ case 10: BN_CONSTTIME_SWAP(9); /* Fallthrough */
+ case 9: BN_CONSTTIME_SWAP(8); /* Fallthrough */
+ case 8: BN_CONSTTIME_SWAP(7); /* Fallthrough */
+ case 7: BN_CONSTTIME_SWAP(6); /* Fallthrough */
+ case 6: BN_CONSTTIME_SWAP(5); /* Fallthrough */
+ case 5: BN_CONSTTIME_SWAP(4); /* Fallthrough */
+ case 4: BN_CONSTTIME_SWAP(3); /* Fallthrough */
+ case 3: BN_CONSTTIME_SWAP(2); /* Fallthrough */
+ case 2: BN_CONSTTIME_SWAP(1); /* Fallthrough */
+ case 1: BN_CONSTTIME_SWAP(0);
+ }
+#undef BN_CONSTTIME_SWAP
+}