partial DSA support
[gnupg.git] / include / mpi.h
index cf36232..87bb053 100644 (file)
 #define DBG_MPI     mpi_debug_mode
 int mpi_debug_mode;
 
-#if defined(__i386__)
-  #define BITS_PER_MPI_LIMB  32
-  #define BYTES_PER_MPI_LIMB  4
-  #define BYTES_PER_MPI_LIMB2 8
-  typedef unsigned long int mpi_limb_t;
-  typedef   signed long int mpi_limb_signed_t;
-#else
-  #error add definions for this machine here
-#endif
+#define BITS_PER_MPI_LIMB    (8*SIZEOF_UNSIGNED_LONG)
+#define BYTES_PER_MPI_LIMB   SIZEOF_UNSIGNED_LONG
+typedef unsigned long int mpi_limb_t;
+typedef   signed long int mpi_limb_signed_t;
 
 typedef struct mpi_struct {
     int alloced;    /* array size (# of allocated limbs) */
     int nlimbs;     /* number of valid limbs */
+    int nbits;     /* the real number of valid bits (info only) */
     int sign;      /* indicates a negative number */
-    int secure;     /* array mut be allocated in secure memory space */
+    int secure;     /* array must be allocated in secure memory space */
     mpi_limb_t *d;  /* array with the limbs */
 } *MPI;
 
 #define MPI_NULL NULL
 
-#define mpi_get_nlimbs(a) ((a)->nlimbs)
-#define mpi_is_neg(a)    ((a)->sign)
+#define mpi_get_nlimbs(a)     ((a)->nlimbs)
+#define mpi_is_neg(a)        ((a)->sign)
 
 /*-- mpiutil.c --*/
 
@@ -82,6 +78,8 @@ typedef struct mpi_struct {
   void mpi_resize( MPI a, unsigned nlimbs );
   MPI  mpi_copy( MPI a );
 #endif
+#define mpi_is_secure(a) ((a) && (a)->secure)
+void mpi_set_secure( MPI a );
 void mpi_clear( MPI a );
 void mpi_set( MPI w, MPI u);
 void mpi_set_ui( MPI w, ulong u);
@@ -90,23 +88,18 @@ void mpi_m_check( MPI a );
 void mpi_swap( MPI a, MPI b);
 
 /*-- mpicoder.c --*/
-int mpi_encode( IOBUF out, MPI a );
-int mpi_encode_csum( IOBUF out, MPI a, u16 *csum );
-int mpi_write( IOBUF out, byte *a);
-int mpi_write_csum( IOBUF out, byte *a, u16 *csum);
+int mpi_write( IOBUF out, MPI a );
 #ifdef M_DEBUG
-  #define mpi_decode(a,b)   mpi_debug_decode((a),(b),  M_DBGINFO( __LINE__ ) )
-  #define mpi_decode_buffer(a)  mpi_debug_decode_buffer((a), M_DBGINFO( __LINE__ ) )
-  MPI mpi_debug_decode(IOBUF inp, unsigned *nread, const char *info);
-  MPI mpi_debug_decode_buffer(byte *buffer, const char *info );
+  #define mpi_read(a,b,c)   mpi_debug_read((a),(b),(c),  M_DBGINFO( __LINE__ ) )
+  MPI mpi_debug_read(IOBUF inp, unsigned *nread, int secure, const char *info);
 #else
-  MPI mpi_decode(IOBUF inp, unsigned *nread);
-  MPI mpi_decode_buffer(byte *buffer );
+  MPI mpi_read(IOBUF inp, unsigned *nread, int secure);
 #endif
-byte *mpi_read(IOBUF inp, unsigned *ret_nread);
 int mpi_fromstr(MPI val, const char *str);
 int mpi_print( FILE *fp, MPI a, int mode );
 u32 mpi_get_keyid( MPI a, u32 *keyid );
+byte *mpi_get_buffer( MPI a, unsigned *nbytes, int *sign );
+void  mpi_set_buffer( MPI a, const byte *buffer, unsigned nbytes, int sign );
 
 /*-- mpi-add.c --*/
 void mpi_add_ui(MPI w, MPI u, ulong v );
@@ -139,6 +132,9 @@ int mpi_gcd( MPI g, MPI a, MPI b );
 void mpi_pow( MPI w, MPI u, MPI v);
 void mpi_powm( MPI res, MPI base, MPI exp, MPI mod);
 
+/*-- mpi-mpow.c --*/
+void mpi_mulpowm( MPI res, MPI *basearray, MPI *exparray, MPI mod);
+
 /*-- mpi-cmp.c --*/
 int mpi_cmp_ui( MPI u, ulong v );
 int mpi_cmp( MPI u, MPI v );
@@ -152,6 +148,7 @@ unsigned mpi_trailing_zeros( MPI a );
 unsigned mpi_get_nbits( MPI a );
 int  mpi_test_bit( MPI a, unsigned n );
 void mpi_set_bit( MPI a, unsigned n );
+void mpi_set_highbit( MPI a, unsigned n );
 void mpi_clear_bit( MPI a, unsigned n );
 void mpi_set_bytes( MPI a, unsigned nbits, byte (*fnc)(int), int opaque );
 void mpi_rshift( MPI x, MPI a, unsigned n );