org.logi.crypto
Class Crypto

java.lang.Object
  |
  +--org.logi.crypto.Crypto
Direct Known Subclasses:
CipherStream, DecryptMode, org.logi.crypto.protocols.DHEKEKeyEx, DHKeyEx, EncryptedKeyEx, EncryptMode, Fingerprint, HashState, K, KeyPair, KeyRecord, KeyRing, Producer, QRAuth, SendHashKeyEx, Signature, TestCDS, TestCliSer, TestIterate, TestKey, TestMode, TestRandom, TestSign

public abstract class Crypto
extends java.lang.Object

This class contains numerous static and final utility functions along with global variables for the logi.crypto package.

Author:
Logi Ragnarsson (logir@logi.org)

Field Summary
static char[] BIT
          The binary digits "0" and "1".
static java.lang.String[] cdsPath
          The array of names of packages that are searched for classes mentioned in a CDS.
static byte[] EMPTY_ARRAY
          An empty byte array.
static java.math.BigInteger FOUR
          The constant four.
static KeySource keySource
          The object used to store and retrieve keys.
static char[] NIBBLE
          The hexadecimal digits "0" through "f".
static java.math.BigInteger ONE
          The constant one.
static int primeCertainty
          We allow a chance of 0.5**primeCertainty chance that given a composite number, the primaility check will say it is a prime.
static java.util.Random random
          This is the default random generator used by various Crypto classes.
static java.math.BigInteger TWO
          The constant two.
static java.math.BigInteger ZERO
          The constant zero.
 
Constructor Summary
Crypto()
           
 
Method Summary
static java.lang.String binString(int a)
          Convert an int to a string of binary digits.
static java.lang.String binString(long a)
          Convert a long to a string of binary digits.
static boolean equal(byte[] a, byte[] b)
          Return true iff two array contain the same bytes.
static boolean equalRelaxed(byte[] a, byte[] b)
          Return true iff two arrays contain the same bytes, discounting any zero bytes from the front of the arrays.
static boolean equalSub(byte[] a, int i, byte[] b, int j, int length)
          Return true iff a sub-array of two arrays contain the same bytes.
static byte fromHexNibble(char n)
          Convert a hexadecimal digit to a byte.
static byte[] fromHexString(java.lang.String hex)
          Convert a string of hexadecimal digits to a byte array.
static java.lang.Object fromString(java.io.Reader cds)
          Parse the given Cipher Description String (CDS).
static java.lang.Object fromString(java.lang.String cds)
          Parse the given Cipher Description String (CDS).
static java.lang.String hexString(byte a)
          Convert a byte to a string of hexadecimal digits.
static java.lang.String hexString(byte[] buf)
          Convert a byte array to a string of hexadecimal digits.
static java.lang.String hexString(byte[] buf, int i, int length)
          Convert a byte array to a string of hexadecimal digits.
static java.lang.String hexString(int a)
          Convert an int to a string of hexadecimal digits.
static java.lang.String hexString(long a)
          Convert a long to a string of hexadecimal digits.
static void initRandom()
          Initialize the logi.crypto library.
static void initRandom(java.util.Random r)
          Initialize the logi.crypto library.
static java.lang.Class makeClass(java.lang.String name)
          Create a Class object for the named class.
static int makeInt(byte[] buf, int i, int length)
          Convert a byte array to an int.
static long makeLong(byte[] buf, int i, int length)
          Convert a byte array to a long.
static CipherKey makeSessionKey(java.lang.String keyType, byte[] bits)
          Convert a byte array to a CipherKey.
static int pastSpace(java.io.Reader r)
          Read characters from a Reader until a non-space character is reached and return that character.
static int pickBits(int a, byte[] bits)
          Construct an int by picking bits from another int.
static long pickBits(long a, byte[] bits)
          Construct an long by picking bits from another long.
static int readBlock(java.io.InputStream in, byte[] buf, int i, int len)
          Reads a number of bytes, blocking until they are all available.
static int readInt(java.io.InputStream in)
          Read an int from an InputStream in bigendian order.
static void writeBytes(int a, byte[] dest, int i, int length)
          Write an int to a byte array.
static void writeBytes(long a, byte[] dest, int i, int length)
          Write a long to a byte array.
static void writeInt(java.io.OutputStream out, int x)
          Write an int to an OutputStream in bigendian order.
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

random

public static java.util.Random random
This is the default random generator used by various Crypto classes. It should be a cryptographically secure random number generator, preferably without any period, which rules out all generators based on iterated functions, such as java.util.Random.

primeCertainty

public static int primeCertainty
We allow a chance of 0.5**primeCertainty chance that given a composite number, the primaility check will say it is a prime. For complicated reasons, the actual chance of generating a false prime is much lower.

ZERO

public static final java.math.BigInteger ZERO
The constant zero.

ONE

public static final java.math.BigInteger ONE
The constant one.

TWO

public static final java.math.BigInteger TWO
The constant two.

FOUR

public static final java.math.BigInteger FOUR
The constant four.

EMPTY_ARRAY

public static final byte[] EMPTY_ARRAY
An empty byte array.

keySource

public static KeySource keySource
The object used to store and retrieve keys. It is used by the lookup(fingerprint) CDS.

NIBBLE

public static char[] NIBBLE
The hexadecimal digits "0" through "f".

BIT

public static char[] BIT
The binary digits "0" and "1".

cdsPath

public static java.lang.String[] cdsPath
The array of names of packages that are searched for classes mentioned in a CDS.
Constructor Detail

Crypto

public Crypto()
Method Detail

initRandom

public static void initRandom(java.util.Random r)
Initialize the logi.crypto library. One of the initRandom methods must be called before the library is asked to do anything requiering random numbers.

The random number generator used by various parts of the logi.crypto library will be set to be the object specified in the r parameter.

See Also:
RandomMD5, RandomFromStream

initRandom

public static void initRandom()
Initialize the logi.crypto library. One of the initRandom methods must be called before the library is asked to do anything requiering random numbers.

This method will not do anything if one of the initRandom methods has been called previously.

The default random number generator will be used. If the file /dev/urandom can be read, this is an instance of the RandomFromStream class which reads that file. Otherwise an instance of the RandomMD5 class is used.

See Also:
RandomMD5, RandomFromStream

makeLong

public static final long makeLong(byte[] buf,
                                  int i,
                                  int length)
Convert a byte array to a long. Bits are collected from buf[i..i+length-1].

makeInt

public static final int makeInt(byte[] buf,
                                int i,
                                int length)
Convert a byte array to an int. Bits are collected from buf[i..i+length-1].

writeBytes

public static final void writeBytes(long a,
                                    byte[] dest,
                                    int i,
                                    int length)
Write a long to a byte array. Bits from a are written to dest[i..i+length-1].

writeBytes

public static final void writeBytes(int a,
                                    byte[] dest,
                                    int i,
                                    int length)
Write an int to a byte array. Bits from a are written to dest[i..i+length-1].

pickBits

public static final int pickBits(int a,
                                 byte[] bits)
Construct an int by picking bits from another int. The number in bits[i] is the index of the bit within a that should be put at index i in the result.

The most-significant bit is number 0.


pickBits

public static final long pickBits(long a,
                                  byte[] bits)
Construct an long by picking bits from another long. The number in bits[i] is the index of the bit within a that should be put at index i in the result.

The most-significant bit is number 0.


hexString

public static final java.lang.String hexString(byte[] buf)
Convert a byte array to a string of hexadecimal digits.

hexString

public static final java.lang.String hexString(byte[] buf,
                                               int i,
                                               int length)
Convert a byte array to a string of hexadecimal digits. The bytes buf[i..i+length-1] are used.

hexString

public static final java.lang.String hexString(long a)
Convert a long to a string of hexadecimal digits.

hexString

public static final java.lang.String hexString(int a)
Convert an int to a string of hexadecimal digits.

hexString

public static final java.lang.String hexString(byte a)
Convert a byte to a string of hexadecimal digits.

fromHexNibble

public static byte fromHexNibble(char n)
Convert a hexadecimal digit to a byte.

fromHexString

public static byte[] fromHexString(java.lang.String hex)
Convert a string of hexadecimal digits to a byte array.

binString

public static final java.lang.String binString(long a)
Convert a long to a string of binary digits.

binString

public static final java.lang.String binString(int a)
Convert an int to a string of binary digits.

equal

public static boolean equal(byte[] a,
                            byte[] b)
Return true iff two array contain the same bytes.

equalRelaxed

public static boolean equalRelaxed(byte[] a,
                                   byte[] b)
Return true iff two arrays contain the same bytes, discounting any zero bytes from the front of the arrays.

equalSub

public static boolean equalSub(byte[] a,
                               int i,
                               byte[] b,
                               int j,
                               int length)
Return true iff a sub-array of two arrays contain the same bytes. Compares a[i..i+length-1] and b[j..j+length-1].

writeInt

public static final void writeInt(java.io.OutputStream out,
                                  int x)
                           throws java.io.IOException
Write an int to an OutputStream in bigendian order.

readInt

public static final int readInt(java.io.InputStream in)
                         throws java.io.IOException
Read an int from an InputStream in bigendian order.

readBlock

public static final int readBlock(java.io.InputStream in,
                                  byte[] buf,
                                  int i,
                                  int len)
                           throws java.io.IOException
Reads a number of bytes, blocking until they are all available. Returns -1 if EOF is reached before reading len bytes, otherwise returns len. Bytes are put in buf, starting at index i.

makeClass

public static java.lang.Class makeClass(java.lang.String name)
                                 throws InvalidCDSException
Create a Class object for the named class. The class is searched for in the packages named in the CDS Path, which by default includes the appropriate logi.crypto package names.
Throws:
InvalidCDSException - if the class could not be created

makeSessionKey

public static CipherKey makeSessionKey(java.lang.String keyType,
                                       byte[] bits)
                                throws InvalidCDSException
Convert a byte array to a CipherKey. Returns a new key of type keyType, with key-material from bits.

keyType should be the name of a class which implements the CipherKey interface, such as "TriDESKey".

Throws:
InvalidCDSException - if the key could not be created

pastSpace

public static int pastSpace(java.io.Reader r)
                     throws java.io.IOException
Read characters from a Reader until a non-space character is reached and return that character.

fromString

public static java.lang.Object fromString(java.io.Reader cds)
                                   throws InvalidCDSException,
                                          java.io.IOException
Parse the given Cipher Description String (CDS).

This method can be used to parse a CDS such as that returned by the Key and Fingerprint toString() methods and return the described object.

The CDS syntax is one of:

ClassName is the name of the class to generate. By default the string "org.logi.crypto." is prepended to the class name and an instance created with the ClassName(String) constructor. See the documentation for various classes for details.

The lookup(fingerprint) CDS assumes fingerprint to be a CDS for a Fingerprint object. It then looks up the key with the specified fingerprint in keySource.

This method may throw exceptions with very long, nested explanations if an exception occurs in a sub-CDS.

Throws:
java.io.IOException - if an error occured reading characers from in
InvalidCDSException - if the CDS is in some way malformed.
See Also:
keySource

fromString

public static java.lang.Object fromString(java.lang.String cds)
                                   throws InvalidCDSException
Parse the given Cipher Description String (CDS). This method calls the fromString(Reader) method after wrapping th cds in a StringReader.
Throws:
InvalidCDSException - if the CDS is in some way malformed.


Copyright 1997-2000 Logi Ragnarsson