diff options
author | Werner Koch <wk@gnupg.org> | 2013-09-06 19:58:50 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2013-09-07 10:16:45 +0200 |
commit | 1bd2c67aa55b40589654d3fa5dea05cf1ed7dc5f (patch) | |
tree | b9d3fdf529b9696b9f23707bf5fee958269628f5 | |
parent | 4e4440153258e2f0dfdcaa8443820af06984ecb1 (diff) | |
download | libgcrypt-1bd2c67aa55b40589654d3fa5dea05cf1ed7dc5f.tar.gz |
mpi: Add functions to manipulate the sign.
* src/gcrypt.h.in (gcry_mpi_is_neg): New.
(gcry_mpi_neg, gcry_mpi_abs): New.
* mpi/mpiutil.c (_gcry_mpi_is_neg): New.
(_gcry_mpi_neg, _gcry_mpi_abs): New.
* src/visibility.c, src/visibility.h: Add wrappers.
* src/libgcrypt.def, src/libgcrypt.vers: Export them.
* src/mpi.h (mpi_is_neg): New. Rename old macro to mpi_has_sign.
* mpi/mpi-mod.c (_gcry_mpi_mod_barrett): Use mpi_has_sign.
* mpi/mpi-mpow.c (calc_barrett): Ditto.
* cipher/primegen.c (_gcry_derive_x931_prime): Ditto
* cipher/rsa.c (secret): Ditto.
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | cipher/primegen.c | 2 | ||||
-rw-r--r-- | cipher/rsa.c | 2 | ||||
-rw-r--r-- | doc/gcrypt.texi | 18 | ||||
-rw-r--r-- | mpi/ec.c | 2 | ||||
-rw-r--r-- | mpi/mpi-mod.c | 2 | ||||
-rw-r--r-- | mpi/mpi-mpow.c | 2 | ||||
-rw-r--r-- | mpi/mpiutil.c | 39 | ||||
-rw-r--r-- | src/gcrypt.h.in | 14 | ||||
-rw-r--r-- | src/libgcrypt.def | 6 | ||||
-rw-r--r-- | src/libgcrypt.vers | 3 | ||||
-rw-r--r-- | src/mpi.h | 5 | ||||
-rw-r--r-- | src/visibility.c | 18 | ||||
-rw-r--r-- | src/visibility.h | 3 |
14 files changed, 112 insertions, 8 deletions
@@ -46,6 +46,9 @@ Noteworthy changes in version 1.6.0 (unreleased) GCRY_RNG_TYPE_STANDARD NEW. GCRY_RNG_TYPE_FIPS NEW. GCRY_RNG_TYPE_SYSTEM NEW. + gcry_mpi_is_neg NEW. + gcry_mpi_neg NEW. + gcry_mpi_abs NEW. gcry_mpi_snatch NEW. gcry_mpi_point_t NEW. gcry_mpi_point_new NEW. @@ -65,6 +68,7 @@ Noteworthy changes in version 1.6.0 (unreleased) gcry_mpi_ec_dup NEW. gcry_mpi_ec_add NEW. gcry_mpi_ec_mul NEW. + gcry_mpi_ec_curve_point NEW. GCRYMPI_FLAG_IMMUTABLE NEW. GCRYMPI_FLAG_CONST NEW. GCRYMPI_CONST_ONE NEW. diff --git a/cipher/primegen.c b/cipher/primegen.c index d0cf20c1..3610ae7e 100644 --- a/cipher/primegen.c +++ b/cipher/primegen.c @@ -1351,7 +1351,7 @@ _gcry_derive_x931_prime (const gcry_mpi_t xp, mpi_sub (r1, r1, tmp); /* Fixup a negative value. */ - if (mpi_is_neg (r1)) + if (mpi_has_sign (r1)) mpi_add (r1, r1, p1p2); /* yp0 = xp + (r1 - xp mod p1*p2) */ diff --git a/cipher/rsa.c b/cipher/rsa.c index bb22d059..8d17129c 100644 --- a/cipher/rsa.c +++ b/cipher/rsa.c @@ -722,7 +722,7 @@ secret (gcry_mpi_t output, gcry_mpi_t input, RSA_secret_key *skey ) mpi_powm( m2, input, h, skey->q ); /* h = u * ( m2 - m1 ) mod q */ mpi_sub( h, m2, m1 ); - if ( mpi_is_neg( h ) ) + if ( mpi_has_sign ( h ) ) mpi_add ( h, h, skey->q ); mpi_mulm( h, skey->u, h, skey->q ); /* m = m2 + h * p */ diff --git a/doc/gcrypt.texi b/doc/gcrypt.texi index 4c8cdb15..ba9bb02a 100644 --- a/doc/gcrypt.texi +++ b/doc/gcrypt.texi @@ -2424,7 +2424,7 @@ For the EdDSA algorithm (cf. Ed25515) the required input parameters are: @example (data (flags eddsa) - (hash-algo sha-512) + (hash-algo sha512) (value @var{message})) @end example @@ -3763,6 +3763,17 @@ Set @var{u} into @var{w} and release @var{u}. If @var{w} is @code{NULL} only @var{u} will be released. @end deftypefun +@deftypefun void gcry_mpi_neg (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t @var{u}}) + +Set the sign of @var{w} to the negative of @var{u}. +@end deftypefun + +@deftypefun void gcry_mpi_abs (@w{gcry_mpi_t @var{w}}) + +Clear the sign of @var{w}. +@end deftypefun + + @node MPI formats @section MPI formats @@ -3949,6 +3960,11 @@ integer @var{v} returning 0 for equality, a positive value for @var{u} > @var{v} and a negative for @var{u} < @var{v}. @end deftypefun +@deftypefun int gcry_mpi_is_neg (@w{const gcry_mpi_t @var{a}}) + +Return 1 if @var{a} is less than zero; return 0 if zero or positive. +@end deftypefun + @node Bit manipulations @section Bit manipulations @@ -1025,7 +1025,7 @@ _gcry_mpi_ec_mul_point (mpi_point_t result, k = mpi_copy (scalar); yy = mpi_copy (point->y); - if ( mpi_is_neg (k) ) + if ( mpi_has_sign (k) ) { k->sign = 0; ec_invm (yy, yy, ctx); diff --git a/mpi/mpi-mod.c b/mpi/mpi-mod.c index 7ebfe6dc..795826e7 100644 --- a/mpi/mpi-mod.c +++ b/mpi/mpi-mod.c @@ -157,7 +157,7 @@ _gcry_mpi_mod_barrett (gcry_mpi_t r, gcry_mpi_t x, mpi_barrett_t ctx) r2->nlimbs = k+1; mpi_sub ( r, r1, r2 ); - if ( mpi_is_neg( r ) ) + if ( mpi_has_sign ( r ) ) { if (!ctx->r3) { diff --git a/mpi/mpi-mpow.c b/mpi/mpi-mpow.c index ca5b3f18..ec677fe9 100644 --- a/mpi/mpi-mpow.c +++ b/mpi/mpi-mpow.c @@ -204,7 +204,7 @@ calc_barrett( gcry_mpi_t r, gcry_mpi_t x, gcry_mpi_t m, gcry_mpi_t y, int k, gcr r2->nlimbs = k+1; mpi_sub( r, r1, r2 ); - if( mpi_is_neg( r ) ) { + if( mpi_has_sign (r) ) { gcry_mpi_t tmp; tmp = mpi_alloc( k + 2 ); diff --git a/mpi/mpiutil.c b/mpi/mpiutil.c index a65d2361..433dda6b 100644 --- a/mpi/mpiutil.c +++ b/mpi/mpiutil.c @@ -324,6 +324,45 @@ gcry_mpi_copy( gcry_mpi_t a ) } +/* Return true if A is negative. */ +int +_gcry_mpi_is_neg (gcry_mpi_t a) +{ + if (a->sign && _gcry_mpi_cmp_ui (a, 0)) + return 1; + else + return 0; +} + + +/* W = - U */ +void +_gcry_mpi_neg (gcry_mpi_t w, gcry_mpi_t u) +{ + if (mpi_is_immutable (w)) + { + mpi_immutable_failed (); + return; + } + + w->sign = !u->sign; +} + + +/* W = [W] */ +void +_gcry_mpi_abs (gcry_mpi_t w) +{ + if (mpi_is_immutable (w)) + { + mpi_immutable_failed (); + return; + } + + w->sign = 0; +} + + /**************** * This function allocates an MPI which is optimized to hold * a value as large as the one given in the argument and allocates it diff --git a/src/gcrypt.h.in b/src/gcrypt.h.in index 06d66639..71c50abf 100644 --- a/src/gcrypt.h.in +++ b/src/gcrypt.h.in @@ -508,6 +508,15 @@ 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); +/* Return 1 if A is negative; 0 if zero or positive. */ +int gcry_mpi_is_neg (gcry_mpi_t a); + +/* W = - U */ +void gcry_mpi_neg (gcry_mpi_t w, gcry_mpi_t u); + +/* W = [W] */ +void gcry_mpi_abs (gcry_mpi_t w); + /* Compare the big integer number U and V returning 0 for equality, a positive value for U > V and a negative for U < V. */ int gcry_mpi_cmp (const gcry_mpi_t u, const gcry_mpi_t v); @@ -661,6 +670,8 @@ void gcry_mpi_ec_add (gcry_mpi_point_t w, void gcry_mpi_ec_mul (gcry_mpi_point_t w, gcry_mpi_t n, gcry_mpi_point_t u, gcry_ctx_t ctx); +/* Return true if POINT is on the curve described by CTX. */ +int gcry_mpi_ec_curve_point (gcry_mpi_point_t w, gcry_ctx_t ctx); /* Return the number of bits required to represent A. */ unsigned int gcry_mpi_get_nbits (gcry_mpi_t a); @@ -728,8 +739,11 @@ gcry_mpi_t _gcry_mpi_get_const (int no); #define mpi_snatch( w, u) gcry_mpi_snatch( (w), (u) ) #define mpi_set( w, u) gcry_mpi_set( (w), (u) ) #define mpi_set_ui( w, u) gcry_mpi_set_ui( (w), (u) ) +#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) ) #define mpi_cmp_ui( u, v ) gcry_mpi_cmp_ui( (u), (v) ) +#define mpi_is_neg( a ) gcry_mpi_is_new ((a)) #define mpi_add_ui(w,u,v) gcry_mpi_add_ui((w),(u),(v)) #define mpi_add(w,u,v) gcry_mpi_add ((w),(u),(v)) diff --git a/src/libgcrypt.def b/src/libgcrypt.def index f275ae91..9539d39a 100644 --- a/src/libgcrypt.def +++ b/src/libgcrypt.def @@ -239,5 +239,11 @@ EXPORTS gcry_sexp_nth_buffer @214 + gcry_mpi_ec_curve_point @215 + + gcry_mpi_is_neg @216 + gcry_mpi_neg @217 + gcry_mpi_abs @218 + ;; end of file with public symbols for Windows. diff --git a/src/libgcrypt.vers b/src/libgcrypt.vers index 473ee68d..9bb7ae2c 100644 --- a/src/libgcrypt.vers +++ b/src/libgcrypt.vers @@ -77,6 +77,7 @@ GCRYPT_1.6 { gcry_sexp_sprint; gcry_sexp_sscan; gcry_sexp_vlist; gcry_sexp_nth_string; + gcry_mpi_is_neg; gcry_mpi_neg; gcry_mpi_abs; gcry_mpi_add; gcry_mpi_add_ui; gcry_mpi_addm; gcry_mpi_aprint; gcry_mpi_clear_bit; gcry_mpi_clear_flag; gcry_mpi_clear_highbit; gcry_mpi_cmp; gcry_mpi_cmp_ui; gcry_mpi_copy; gcry_mpi_div; @@ -96,7 +97,7 @@ GCRYPT_1.6 { gcry_mpi_ec_get_mpi; gcry_mpi_ec_get_point; gcry_mpi_ec_set_mpi; gcry_mpi_ec_set_point; gcry_mpi_ec_get_affine; - gcry_mpi_ec_dup; gcry_mpi_ec_add; gcry_mpi_ec_mul; + gcry_mpi_ec_dup; gcry_mpi_ec_add; gcry_mpi_ec_mul; gcry_mpi_ec_curve_point; _gcry_mpi_get_const; @@ -78,7 +78,7 @@ struct gcry_mpi #define MPI_NULL NULL #define mpi_get_nlimbs(a) ((a)->nlimbs) -#define mpi_is_neg(a) ((a)->sign) +#define mpi_has_sign(a) ((a)->sign) /*-- mpiutil.c --*/ @@ -134,6 +134,9 @@ void _gcry_mpi_m_check( gcry_mpi_t a ); void _gcry_mpi_swap( gcry_mpi_t a, gcry_mpi_t b); gcry_mpi_t _gcry_mpi_new (unsigned int nbits); gcry_mpi_t _gcry_mpi_snew (unsigned int nbits); +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); /* Constants used to return constant MPIs. See _gcry_mpi_init if you want to add more constants. */ diff --git a/src/visibility.c b/src/visibility.c index bb51d58e..0e244117 100644 --- a/src/visibility.c +++ b/src/visibility.c @@ -293,6 +293,24 @@ gcry_mpi_swap (gcry_mpi_t a, gcry_mpi_t b) } int +gcry_mpi_is_neg (gcry_mpi_t a) +{ + return _gcry_mpi_is_neg (a); +} + +void +gcry_mpi_neg (gcry_mpi_t w, gcry_mpi_t u) +{ + _gcry_mpi_neg (w, u); +} + +void +gcry_mpi_abs (gcry_mpi_t w) +{ + _gcry_mpi_abs (w); +} + +int gcry_mpi_cmp (const gcry_mpi_t u, const gcry_mpi_t v) { return _gcry_mpi_cmp (u, v); diff --git a/src/visibility.h b/src/visibility.h index 54da016f..a6cb3dcf 100644 --- a/src/visibility.h +++ b/src/visibility.h @@ -536,6 +536,7 @@ MARK_VISIBLE (gcry_sexp_sprint) MARK_VISIBLE (gcry_sexp_sscan) MARK_VISIBLE (gcry_sexp_vlist) +MARK_VISIBLEX(gcry_mpi_abs) MARK_VISIBLE (gcry_mpi_add) MARK_VISIBLE (gcry_mpi_add_ui) MARK_VISIBLE (gcry_mpi_addm) @@ -561,12 +562,14 @@ MARK_VISIBLE (gcry_mpi_gcd) MARK_VISIBLE (gcry_mpi_get_flag) MARK_VISIBLE (gcry_mpi_get_nbits) MARK_VISIBLE (gcry_mpi_get_opaque) +MARK_VISIBLEX(gcry_mpi_is_neg) MARK_VISIBLE (gcry_mpi_invm) MARK_VISIBLE (gcry_mpi_mod) MARK_VISIBLE (gcry_mpi_mul) MARK_VISIBLE (gcry_mpi_mul_2exp) MARK_VISIBLE (gcry_mpi_mul_ui) MARK_VISIBLE (gcry_mpi_mulm) +MARK_VISIBLEX(gcry_mpi_neg) MARK_VISIBLE (gcry_mpi_new) MARK_VISIBLE (gcry_mpi_point_get) MARK_VISIBLE (gcry_mpi_point_new) |