package bingo.game;
import java.security.*;
import bingo.shared.*;
class NotaryPublic {
private PrivateKey priv = null;
private PublicKey pub = null;
NotaryPublic() {
KeyPair pair = null;
try {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
keyGen.initialize(1024, new SecureRandom());
pair = keyGen.generateKeyPair();
} catch (Exception e) {
ErrorMessages.error("Cannot sign cards. Continuing anyway.");
}
priv = pair.getPrivate();
pub = pair.getPublic();
}
void signTheCard(Card c, int gameNumber) throws NoSuchAlgorithmException,
InvalidKeyException,
SignatureException {
Signature dsa = Signature.getInstance("SHA/DSA");
byte[] values = new byte[Card.SIZE*Card.SIZE+1];
dsa.initSign(priv);
for (int i = 0; i < Card.SIZE; i++)
for (int j = 0; j < Card.SIZE; j ++)
values[Card.SIZE*i + j] = (byte)c.boardValues[i][j].number;
values[values.length-1] = (byte)gameNumber;
dsa.update(values);
c.setSignature(dsa.sign());
}
boolean verifyTheSignature(Card c, int gameNumber) {
try {
Signature dsa = Signature.getInstance("SHA/DSA");
byte[] values = new byte[Card.SIZE*Card.SIZE+1];
dsa.initVerify(pub);
for (int i = 0; i < Card.SIZE; i ++)
for (int j = 0; j < Card.SIZE; j ++)
values[Card.SIZE*i + j] = (byte)c.boardValues[i][j].number;
values[values.length-1] = (byte)gameNumber;
dsa.update(values);
return dsa.verify(c.getSignature());
} catch (Exception e) {
return false;
}
}
}
|