/*
 * TestEasySendReceivePublicEncrypt.java
 *
 * Created on 16 November 2005, 11:13
 *
 */
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Vector;
import javax.crypto.*;
/**
 *
 * @author Nicholas O'Shea
 */
public class TestEasySendReceivePublicEncrypt extends KeyGenerationClass {
    public static void main(String[] args) {      
        Network net = new Network();
        A a = new A(net);
        net.register("A", a);
        B b = new B(net);
        net.register("B", b);
        
        b.start();
        a.start();
    }
}

class A extends ComClass {
    Network net;
    
    
    public A (Network net){
        this.net = net;
    }
    
    public void  run(){
        Vector v = new Vector();
        KeyPair keyPair = generateKeyPair(1024);
        PublicKey keyPublic = keyPair.getPublic();
        PrivateKey keyPrivate = keyPair.getPrivate();
        registerKey(keyPublic, "K+");
        registerKey(keyPrivate, "K-");
        v.add(sendKey(keyPublic));
        
        
        net.send(this, "B", v);
        


    }
    
    public void processIncoming(Vector<String> v){
        switch (receivedNum) {
            case 0 :
                assert (check(v.elementAt(0), "B"));
                assert (check(v.elementAt(1), "A"));
                String msgToBeDecoded = v.elementAt(2);
                PrivateKey key = (PrivateKey) keys.get("K-");
                Vector<String> decode = decrypt(msgToBeDecoded, key, "a", "b");
                String msg = decode.elementAt(0);
                
                theLogger.info(msgToBeDecoded);
                theLogger.info(msg);
        }
    }
    
}
class B extends ComClass {
    Network net;
    
    
    public B (Network net){
        this.net = net;
    }
    
    public void processIncoming(Vector<String> v){
        switch (receivedNum) {
            case 0 :
                assert (check(v.elementAt(0), "A"));
                assert (check(v.elementAt(1), "B"));
                
                PublicKey key = receivePublicKey(v.elementAt(2));
                registerKey(key, "K");
                
                Vector vMsg = new Vector();
                Vector vEnc = new Vector();
                String message = generateMessage("this is the message");
                vEnc.add(message);
                vMsg.add(encrypt(vEnc, key, "b", "a"));
                net.send(this, "A", vMsg);
       }
    }
    
}