KEYRING-IPINT(2)                                 KEYRING-IPINT(2)

     NAME
          keyring: IPint - `infinite' precision integer utility
          functions

     SYNOPSIS
          include "keyring.m"
          keyring:= load Keyring Keyring->PATH;

          IPint: adt
          {
            iptob64:   fn(i: self ref IPint): string;
            b64toip:   fn(str: string)  : ref IPint;
            iptobytes: fn(i: self ref IPint): array of byte;
            bytestoip: fn(buf: array of byte): ref IPint;
            iptobebytes: fn(i: self ref IPint): array of byte;
            bebytestoip: fn(buf: array of byte): ref IPint;
            inttoip:   fn(i: int): ref IPint;
            iptoint:   fn(i: self ref IPint): int;
            iptostr:   fn(i: self ref IPint, base: int): string;
            strtoip:   fn(str: string, base: int): ref IPint;
            random:    fn(minbits, maxbits: int): ref IPint;
            copy:      fn(i: self ref IPint): ref IPint;
            bits:      fn(i:  self ref IPint): int;
            expmod:    fn(base: self ref IPint, exp, mod: ref IPint):ref IPint;
            add:  fn(i1: self ref IPint, i2: ref IPint): ref IPint;
            sub:  fn(i1: self ref IPint, i2: ref IPint): ref IPint;
            neg:  fn(i: self ref IPint): ref IPint;
            mul:  fn(i1: self ref IPint, i2: ref IPint): ref IPint;
            div:  fn(i1: self ref IPint, i2: ref IPint): (ref IPint, ref IPint);
            eq:   fn(i1:  self ref IPint, i2: ref IPint): int;
            cmp:  fn(i1: self ref IPint, i2: ref IPint): int;
            shl:  fn(i: self ref IPint, n: int): ref IPint;
            shr:  fn(i: self ref IPint, n: int): ref IPint;
            and:  fn(i1: self ref IPint, i2: ref IPint): ref IPint;
            ori:  fn(i1: self ref IPint, i2: ref IPint): ref IPint;
            not:  fn(i: self ref IPint): ref IPint;
            xor:  fn(i1: self ref IPint, i2: ref IPint): ref IPint;
          };

     DESCRIPTION
          IPint provides the following arbitrary-length integer manip-
          ulation functions required for cryptographic support in
          Limbo:

          i.iptob64()
               Returns a string that represents a large integer textu-
               ally in base 64 for convenient transmission over a net-
               work connection.

          b64toip(str)

     Page 1                       Plan 9            (printed 11/25/24)

     KEYRING-IPINT(2)                                 KEYRING-IPINT(2)

               Returns the IPint represented by the base-64 encoded
               str.

          i.iptobytes()
               Returns an array of bytes representing a large integer.
               The representation includes both positive and negative
               numbers.

          bytestoip(buf)
               The inverse operation of iptobytes.

          i.iptobebytes()
               Returns an array of bytes in big-endian format repre-
               senting the magnitude of a large integer; used for
               instance to pass a value to ssl(3). Only non-negative
               numbers are represented.

          bebytestoip(buf)
               The inverse operation of iptobebytes.

          inttoip(i)
               Creates a new large integer from integer i.

          i.iptoint()
               Converts a large integer i to an int; returns 0 on
               error.

          i.iptostr(base)
               Converts a large integer to a string in base base;
               returns nil on error.  Only the bases 10, 16, 32, and
               64 are supported.  Anything else defaults to 16.

          strtoip(str,base)
               Converts a string str representing a number in in base
               base to a large integer; returns nil on error.  Only
               the bases 10, 16, 32, and 64 are supported.

          random(minbits,maxbits)
               Returns a large random number with length from minbits
               to maxbits. The largest number allowed in the current
               implementation is 2^8192-1 .  The seed for the genera-
               tor is obtained by duelling clocks.

          i.copy()
               Returns a reference to the same value as i.

          i.bits()
               Returns the number of bits of precision of i.

          base.expmod(exp , mod)
               Returns (base**exp) mod mod.

     Page 2                       Plan 9            (printed 11/25/24)

     KEYRING-IPINT(2)                                 KEYRING-IPINT(2)

          i1.add(i2)
               Returns (i1+i2).

          i1.sub(i2)
               Returns (i1-i2).

          i1.mul(i2)
               Returns i1*i2.

          i1.div(i2)
               Returns (i1/i2, i1modi2).

          i1.eq(i2)
               Returns 1 if i1 and i2 are equal; 0 otherwise.

          i1.cmp(i2)
               Compares two large integers, returning 1 if i1 is
               larger, -1 if i2 is larger, and 0 if they are equal.

          i.shl(n)
               Returns i<<n

          i.shr(n)
               Returns i>>n

          i1.and(i2)
               Returns i&n, bitwise AND

          i1.ori(i2)
               Returns i|n, bitwise inclusive-OR (it is ori because
               plain or is a Limbo keyword)

          i.not()
               Returns ~i, bitwise ones-complement

          i1.xor(i2)
               Returns i^n, bitwise exclusive-OR

     Page 3                       Plan 9            (printed 11/25/24)