/*
 * Copyright (c) 1995-1997 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for NON-COMMERCIAL purposes and without
 * fee is hereby granted provided that this copyright notice
 * appears in all copies. Please refer to the file "copyright.html"
 * for further important copyright and licensing information.
 *
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 */
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;
        }
    }
}
