diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2014-06-19 14:45:51 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2014-07-04 12:27:56 +0900 |
commit | 8823785c0285354425051d881a9446ecbbec329d (patch) | |
tree | 68bf0e6bf270a461e2ff9dd6cbd470b266201dac | |
parent | f88f67e08cccb60e2645743b3510ccde5f469818 (diff) | |
download | libgcrypt-8823785c0285354425051d881a9446ecbbec329d.tar.gz |
mpi_swap_conditional
-rw-r--r-- | doc/gcrypt.texi | 5 | ||||
-rw-r--r-- | mpi/mpiutil.c | 37 | ||||
-rw-r--r-- | src/gcrypt-int.h | 2 | ||||
-rw-r--r-- | src/gcrypt.h.in | 3 | ||||
-rw-r--r-- | src/libgcrypt.def | 1 | ||||
-rw-r--r-- | src/libgcrypt.vers | 2 | ||||
-rw-r--r-- | src/mpi.h | 1 | ||||
-rw-r--r-- | src/visibility.c | 6 | ||||
-rw-r--r-- | src/visibility.h | 2 |
9 files changed, 58 insertions, 1 deletions
diff --git a/doc/gcrypt.texi b/doc/gcrypt.texi index d59c0958..91d9d8fb 100644 --- a/doc/gcrypt.texi +++ b/doc/gcrypt.texi @@ -4341,6 +4341,11 @@ small values (usually up to the word size of the CPU). Swap the values of @var{a} and @var{b}. @end deftypefun +@deftypefun void gcry_mpi_swap_conditional (@w{gcry_mpi_t @var{a}}, @w{gcry_mpi_t @var{b}}, @w{unsigned long @var{sw}}) + +Swap the values of @var{a} and @var{b}, when @var{sw} is 1. +@end deftypefun + @deftypefun void gcry_mpi_snatch (@w{gcry_mpi_t @var{w}}, @ @w{const gcry_mpi_t @var{u}}) diff --git a/mpi/mpiutil.c b/mpi/mpiutil.c index fdce578e..e0afec0d 100644 --- a/mpi/mpiutil.c +++ b/mpi/mpiutil.c @@ -541,6 +541,43 @@ _gcry_mpi_swap (gcry_mpi_t a, gcry_mpi_t b) tmp = *a; *a = *b; *b = tmp; } +void +_gcry_mpi_swap_conditional (gcry_mpi_t a, gcry_mpi_t b, unsigned long swap) +{ + size_t i; + size_t nlimbs = a->nlimbs; + unsigned long mask = -(long)swap; + + if (b->alloced < a->nlimbs) + { + mpi_resize (b, a->nlimbs); + nlimbs = a->nlimbs; + } + else if (a->alloced < b->nlimbs) + { + mpi_resize (a, b->nlimbs); + nlimbs = b->nlimbs; + } + else if (b->nlimbs < a->nlimbs) + { + mpi_resize (b, a->nlimbs); + nlimbs = b->nlimbs = a->nlimbs; + } + else if (a->nlimbs < b->nlimbs) + { + mpi_resize (a, b->nlimbs); + nlimbs = a->nlimbs = b->nlimbs; + } + + for (i = 0; i < nlimbs; i++) + { + unsigned long x = mask & (a->d[i] ^ b->d[i]); + a->d[i] = a->d[i] ^ x; + b->d[i] = b->d[i] ^ x; + } +} + + gcry_mpi_t _gcry_mpi_new (unsigned int nbits) diff --git a/src/gcrypt-int.h b/src/gcrypt-int.h index 8a6df840..42b72d66 100644 --- a/src/gcrypt-int.h +++ b/src/gcrypt-int.h @@ -371,6 +371,7 @@ gcry_mpi_t _gcry_mpi_set (gcry_mpi_t w, const gcry_mpi_t u); gcry_mpi_t _gcry_mpi_set_ui (gcry_mpi_t w, unsigned long u); gcry_err_code_t _gcry_mpi_get_ui (gcry_mpi_t w, ulong *u); void _gcry_mpi_swap (gcry_mpi_t a, gcry_mpi_t b); +void _gcry_mpi_swap_conditional (gcry_mpi_t a, gcry_mpi_t b, unsigned long sw); int _gcry_mpi_is_neg (gcry_mpi_t a); void _gcry_mpi_neg (gcry_mpi_t w, gcry_mpi_t u); void _gcry_mpi_abs (gcry_mpi_t w); @@ -475,6 +476,7 @@ int _gcry_mpi_get_flag (gcry_mpi_t a, enum gcry_mpi_flag flag); #define mpi_set_ui( w, u) _gcry_mpi_set_ui( (w), (u) ) #define mpi_get_ui(a,b) _gcry_mpi_get_ui( (a), (b) ) #define mpi_swap(a,b) _gcry_mpi_swap ((a),(b)) +#define mpi_swap_conditional(a,b,sw) _gcry_mpi_swap_conditional ((a),(b),(sw)) #define mpi_abs( w ) _gcry_mpi_abs( (w) ) #define mpi_neg( w, u) _gcry_mpi_neg( (w), (u) ) #define mpi_cmp( u, v ) _gcry_mpi_cmp( (u), (v) ) diff --git a/src/gcrypt.h.in b/src/gcrypt.h.in index a5f8350a..f9bd1667 100644 --- a/src/gcrypt.h.in +++ b/src/gcrypt.h.in @@ -545,6 +545,9 @@ gcry_mpi_t gcry_mpi_set_ui (gcry_mpi_t w, unsigned long u); /* Swap the values of A and B. */ void gcry_mpi_swap (gcry_mpi_t a, gcry_mpi_t b); +/* Swap the values of A and B if SW is 1. */ +void gcry_mpi_swap_conditional (gcry_mpi_t a, gcry_mpi_t b, unsigned long sw); + /* Return 1 if A is negative; 0 if zero or positive. */ int gcry_mpi_is_neg (gcry_mpi_t a); diff --git a/src/libgcrypt.def b/src/libgcrypt.def index 57ed490e..aee85ac7 100644 --- a/src/libgcrypt.def +++ b/src/libgcrypt.def @@ -276,5 +276,6 @@ EXPORTS gcry_mac_ctl @242 gcry_mac_get_algo @243 + gcry_mpi_swap_conditional @244 ;; end of file with public symbols for Windows. diff --git a/src/libgcrypt.vers b/src/libgcrypt.vers index 7ee0541a..05408509 100644 --- a/src/libgcrypt.vers +++ b/src/libgcrypt.vers @@ -96,7 +96,7 @@ GCRYPT_1.6 { gcry_mpi_set_flag; gcry_mpi_set_highbit; gcry_mpi_set_opaque; gcry_mpi_set_opaque_copy; gcry_mpi_set_ui; gcry_mpi_snew; gcry_mpi_sub; gcry_mpi_sub_ui; - gcry_mpi_subm; gcry_mpi_swap; gcry_mpi_test_bit; + gcry_mpi_subm; gcry_mpi_swap; gcry_mpi_swap_conditional; gcry_mpi_test_bit; gcry_mpi_lshift; gcry_mpi_snatch; gcry_mpi_point_new; gcry_mpi_point_release; gcry_mpi_point_get; gcry_mpi_point_snatch_get; @@ -125,6 +125,7 @@ gcry_mpi_t _gcry_mpi_alloc_like( gcry_mpi_t a ); gcry_mpi_t _gcry_mpi_alloc_set_ui( unsigned long u); void _gcry_mpi_m_check( gcry_mpi_t a ); void _gcry_mpi_swap( gcry_mpi_t a, gcry_mpi_t b); +void _gcry_mpi_swap_conditional(gcry_mpi_t a, gcry_mpi_t b, unsigned long sw); gcry_mpi_t _gcry_mpi_new (unsigned int nbits); gcry_mpi_t _gcry_mpi_snew (unsigned int nbits); gcry_mpi_t _gcry_mpi_set_opaque_copy (gcry_mpi_t a, diff --git a/src/visibility.c b/src/visibility.c index 6ed57ca6..ec3b6445 100644 --- a/src/visibility.c +++ b/src/visibility.c @@ -319,6 +319,12 @@ gcry_mpi_swap (gcry_mpi_t a, gcry_mpi_t b) _gcry_mpi_swap (a, b); } +void +gcry_mpi_swap_conditional (gcry_mpi_t a, gcry_mpi_t b, unsigned long sw) +{ + _gcry_mpi_swap_conditional (a, b, sw); +} + int gcry_mpi_is_neg (gcry_mpi_t a) { diff --git a/src/visibility.h b/src/visibility.h index 96b52355..54767e3d 100644 --- a/src/visibility.h +++ b/src/visibility.h @@ -266,6 +266,7 @@ MARK_VISIBLEX (gcry_mpi_sub) MARK_VISIBLEX (gcry_mpi_sub_ui) MARK_VISIBLEX (gcry_mpi_subm) MARK_VISIBLEX (gcry_mpi_swap) +MARK_VISIBLEX (gcry_mpi_swap_conditional) MARK_VISIBLEX (gcry_mpi_test_bit) MARK_VISIBLEX (gcry_ctx_release) @@ -482,6 +483,7 @@ MARK_VISIBLEX (_gcry_mpi_get_const) #define gcry_mpi_sub_ui _gcry_USE_THE_UNDERSCORED_FUNCTION #define gcry_mpi_subm _gcry_USE_THE_UNDERSCORED_FUNCTION #define gcry_mpi_swap _gcry_USE_THE_UNDERSCORED_FUNCTION +#define gcry_mpi_swap_conditional _gcry_USE_THE_UNDERSCORED_FUNCTION #define gcry_mpi_test_bit _gcry_USE_THE_UNDERSCORED_FUNCTION #define gcry_mpi_abs _gcry_USE_THE_UNDERSCORED_FUNCTION |