See ChangeLog: Mon Jan 24 22:24:38 CET 2000 Werner Koch
[gnupg.git] / mpi / mpi-bit.c
index 227a929..b79505f 100644 (file)
@@ -1,5 +1,5 @@
 /* mpi-bit.c  -  MPI bit level fucntions
- *     Copyright (C) 1998 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 1999 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -55,7 +55,7 @@ __clz_tab[] =
 void
 mpi_normalize( MPI a )
 {
-    if( mpi_is_protected(a) )
+    if( mpi_is_opaque(a) )
        return;
 
     for( ; a->nlimbs && !a->d[a->nlimbs-1]; a->nlimbs-- )
@@ -67,16 +67,13 @@ mpi_normalize( MPI a )
 /****************
  * Return the number of bits in A.
  */
-unsigned
+unsigned int
 mpi_get_nbits( MPI a )
 {
     unsigned n;
 
-    if( mpi_is_protected(a) ) {
-       n = mpi_get_nbit_info(a);
-       if( !n )
-           n = a->nlimbs * BITS_PER_MPI_LIMB;
-       return n;
+    if( mpi_is_opaque(a) ) {
+       return a->sign; /* which holds the number of bits */
     }
 
     mpi_normalize( a );
@@ -93,6 +90,11 @@ mpi_get_nbits( MPI a )
     return n;
 }
 
+unsigned int
+gcry_mpi_get_nbits( MPI a )
+{
+    return mpi_get_nbits( a );
+}
 
 /****************
  * Test whether bit N is set.
@@ -212,3 +214,51 @@ mpi_rshift( MPI x, MPI a, unsigned n )
     x->nlimbs = xsize;
 }
 
+
+/****************
+ * Shift A by COUNT limbs to the left
+ * This is used only within the MPI library
+ */
+void
+mpi_lshift_limbs( MPI a, unsigned int count )
+{
+    mpi_ptr_t ap = a->d;
+    int n = a->nlimbs;
+    int i;
+
+    if( !count || !n )
+       return;
+
+    RESIZE_IF_NEEDED( a, n+count );
+
+    for( i = n-1; i >= 0; i-- )
+       ap[i+count] = ap[i];
+    for(i=0; i < count; i++ )
+       ap[i] = 0;
+    a->nlimbs += count;
+}
+
+
+/****************
+ * Shift A by COUNT limbs to the right
+ * This is used only within the MPI library
+ */
+void
+mpi_rshift_limbs( MPI a, unsigned int count )
+{
+    mpi_ptr_t ap = a->d;
+    mpi_size_t n = a->nlimbs;
+    unsigned int i;
+
+    if( count >= n ) {
+       a->nlimbs = 0;
+       return;
+    }
+
+    for( i = 0; i < n - count; i++ )
+       ap[i] = ap[i+count];
+    ap[i] = 0;
+    a->nlimbs -= count;
+}
+
+