diff options
Diffstat (limited to 'src/lib/libcrypto/bn/bn_lib.c')
| -rw-r--r-- | src/lib/libcrypto/bn/bn_lib.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/lib/libcrypto/bn/bn_lib.c b/src/lib/libcrypto/bn/bn_lib.c index 7a5676de69..5461e6ee7d 100644 --- a/src/lib/libcrypto/bn/bn_lib.c +++ b/src/lib/libcrypto/bn/bn_lib.c | |||
| @@ -824,3 +824,55 @@ int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b, | |||
| 824 | } | 824 | } |
| 825 | return bn_cmp_words(a,b,cl); | 825 | return bn_cmp_words(a,b,cl); |
| 826 | } | 826 | } |
| 827 | |||
| 828 | /* | ||
| 829 | * Constant-time conditional swap of a and b. | ||
| 830 | * a and b are swapped if condition is not 0. The code assumes that at most one bit of condition is set. | ||
| 831 | * nwords is the number of words to swap. The code assumes that at least nwords are allocated in both a and b, | ||
| 832 | * and that no more than nwords are used by either a or b. | ||
| 833 | * a and b cannot be the same number | ||
| 834 | */ | ||
| 835 | void BN_consttime_swap(BN_ULONG condition, BIGNUM *a, BIGNUM *b, int nwords) | ||
| 836 | { | ||
| 837 | BN_ULONG t; | ||
| 838 | int i; | ||
| 839 | |||
| 840 | bn_wcheck_size(a, nwords); | ||
| 841 | bn_wcheck_size(b, nwords); | ||
| 842 | |||
| 843 | assert(a != b); | ||
| 844 | assert((condition & (condition - 1)) == 0); | ||
| 845 | assert(sizeof(BN_ULONG) >= sizeof(int)); | ||
| 846 | |||
| 847 | condition = ((condition - 1) >> (BN_BITS2 - 1)) - 1; | ||
| 848 | |||
| 849 | t = (a->top^b->top) & condition; | ||
| 850 | a->top ^= t; | ||
| 851 | b->top ^= t; | ||
| 852 | |||
| 853 | #define BN_CONSTTIME_SWAP(ind) \ | ||
| 854 | do { \ | ||
| 855 | t = (a->d[ind] ^ b->d[ind]) & condition; \ | ||
| 856 | a->d[ind] ^= t; \ | ||
| 857 | b->d[ind] ^= t; \ | ||
| 858 | } while (0) | ||
| 859 | |||
| 860 | |||
| 861 | switch (nwords) { | ||
| 862 | default: | ||
| 863 | for (i = 10; i < nwords; i++) | ||
| 864 | BN_CONSTTIME_SWAP(i); | ||
| 865 | /* Fallthrough */ | ||
| 866 | case 10: BN_CONSTTIME_SWAP(9); /* Fallthrough */ | ||
| 867 | case 9: BN_CONSTTIME_SWAP(8); /* Fallthrough */ | ||
| 868 | case 8: BN_CONSTTIME_SWAP(7); /* Fallthrough */ | ||
| 869 | case 7: BN_CONSTTIME_SWAP(6); /* Fallthrough */ | ||
| 870 | case 6: BN_CONSTTIME_SWAP(5); /* Fallthrough */ | ||
| 871 | case 5: BN_CONSTTIME_SWAP(4); /* Fallthrough */ | ||
| 872 | case 4: BN_CONSTTIME_SWAP(3); /* Fallthrough */ | ||
| 873 | case 3: BN_CONSTTIME_SWAP(2); /* Fallthrough */ | ||
| 874 | case 2: BN_CONSTTIME_SWAP(1); /* Fallthrough */ | ||
| 875 | case 1: BN_CONSTTIME_SWAP(0); | ||
| 876 | } | ||
| 877 | #undef BN_CONSTTIME_SWAP | ||
| 878 | } | ||
