/* ====================================================================
* Copyright (c) 1999, 2000 Ben Laurie. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by Ben Laurie
* for use in the Lucre project."
*
* 4. The name "Lucre" must not be used to
* endorse or promote products derived from this software without
* prior written permission.
*
* 5. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by Ben Laurie
* for use in the Lucre project."
*
* THIS SOFTWARE IS PROVIDED BY BEN LAURIE ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BEN LAURIE OR
* HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* For more information on Lucre see http://anoncvs.aldigital.co.uk/lucre/.
*
*/
package uk.co.aldigital.ben.lucre;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.math.BigInteger;
public class PublicBank {
public final static int MIN_COIN_LENGTH=16;
public final static int DIGEST_LENGTH=20; // Hmmph. Ought to be able to get this from somewhere...
BigInteger m_biGenerator;
BigInteger m_biPrime;
BigInteger m_biPublicKey; // i.e. g^k mod p
public PublicBank() {
}
public PublicBank(BigInteger generator, BigInteger prime, BigInteger publicKey) {
m_biGenerator = generator;
m_biPrime = prime;
m_biPublicKey = publicKey;
}
public PublicBank(BufferedReader reader)
throws LucreIOException, IOException {
m_biGenerator=Util.readNumber(reader,"g=");
m_biPrime=Util.readNumber(reader,"p=");
m_biPublicKey=Util.readNumber(reader,"public=");
}
public PublicBank(String szFile)
throws LucreIOException, IOException {
this(Util.newBufferedFileReader(szFile));
}
public final BigInteger getPrime() {
return m_biPrime;
}
public final BigInteger getGenerator() {
return m_biGenerator;
}
public final BigInteger getPublicKey() {
return m_biPublicKey;
}
public BigInteger getExponentGroupOrder() {
return m_biPrime.shiftRight(1);
}
public void dump(PrintStream out) {
Util.dumpNumber(out,"p= ",m_biPrime);
Util.dumpNumber(out,"g= ",m_biGenerator);
Util.dumpNumber(out,"g^k= ",m_biPublicKey);
}
public void write(PrintStream out) {
Util.dumpNumber(out,"g=",m_biGenerator);
Util.dumpNumber(out,"p=",m_biPrime);
Util.dumpNumber(out,"public=",m_biPublicKey);
}
public int getCoinLength() {
return MIN_COIN_LENGTH
+(getPrimeLength()-MIN_COIN_LENGTH)%DIGEST_LENGTH;
}
public int getPrimeLength() {
return (getPrime().bitLength()+7)/8;
}
public int getPrimeLengthBits() {
return getPrime().bitLength();
}
public boolean checkGroupMembership() {
return m_biGenerator.modPow(m_biPrime.shiftRight(1),m_biPrime)
.equals(Util.ONE);
}
public static void main(String args[])
throws IOException {
if(args.length < 1) {
System.err.println("... <public bank file>");
System.exit(1);
}
PublicBank bank=new PublicBank(Util.newBufferedFileReader(args[0]));
bank.dump(System.out);
}
public void setGenerator(BigInteger generator) {
m_biGenerator = generator;
}
public void setPrime(BigInteger prime) {
m_biPrime = prime;
}
public void setPublicKey(BigInteger publicKey) {
m_biPublicKey = publicKey;
}
};