summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2013-09-06 19:58:50 +0200
committerWerner Koch <wk@gnupg.org>2013-09-07 10:16:45 +0200
commit1bd2c67aa55b40589654d3fa5dea05cf1ed7dc5f (patch)
treeb9d3fdf529b9696b9f23707bf5fee958269628f5
parent4e4440153258e2f0dfdcaa8443820af06984ecb1 (diff)
downloadlibgcrypt-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--NEWS4
-rw-r--r--cipher/primegen.c2
-rw-r--r--cipher/rsa.c2
-rw-r--r--doc/gcrypt.texi18
-rw-r--r--mpi/ec.c2
-rw-r--r--mpi/mpi-mod.c2
-rw-r--r--mpi/mpi-mpow.c2
-rw-r--r--mpi/mpiutil.c39
-rw-r--r--src/gcrypt.h.in14
-rw-r--r--src/libgcrypt.def6
-rw-r--r--src/libgcrypt.vers3
-rw-r--r--src/mpi.h5
-rw-r--r--src/visibility.c18
-rw-r--r--src/visibility.h3
14 files changed, 112 insertions, 8 deletions
diff --git a/NEWS b/NEWS
index ee737f97..e4fe1eb0 100644
--- a/NEWS
+++ b/NEWS
@@ -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
diff --git a/mpi/ec.c b/mpi/ec.c
index 54fa0286..478416fa 100644
--- a/mpi/ec.c
+++ b/mpi/ec.c
@@ -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;
diff --git a/src/mpi.h b/src/mpi.h
index 0114dba7..09ba7170 100644
--- a/src/mpi.h
+++ b/src/mpi.h
@@ -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)