package criptografia.protocolos;import java.security.*;
import java.security.cert.*;
import java.security.spec.*;
import java.security.interfaces.*;
import javax.crypto.*;
import java.io.*;
import java.util.*;
import java.math.*;
import java.net.*;import iaik.asn1.structures.Name;
import iaik.asn1.structures.AlgorithmID;
import iaik.asn1.ObjectID;public class CA {    public static void main(String args[]) throws Exception { // Verificar se os parametros est correctos
if (args.length == 5) {
    
    // Requisitar uma keystore do tipo JKS
    KeyStore ks = KeyStore.getInstance("JKS");

    // Carregar a keystore a partir do ficheiro especificado     FileInputStream fis = new FileInputStream(args[0]);
    ks.load(fis,args[1].toCharArray());
    fis.close();     // Obter o certificado do issuer
    java.security.cert.Certificate[] issuerChain = ks.getCertificateChain(args[2]);
    X509Certificate issuer = (X509Certificate)issuerChain[0];     // Obter chave p lica do issuer e par etros comuns
    DSAPublicKey caPublicKey = (DSAPublicKey) issuer.getPublicKey();
    BigInteger p = caPublicKey.getParams().getP();
    BigInteger q = caPublicKey.getParams().getQ();
    BigInteger g = caPublicKey.getParams().getG();     // Obter chave privada do issuer
    PrivateKey chave = (PrivateKey) ks.getKey(args[2],args[3].toCharArray());     // Criar um server socket na porta parametrizada
    ServerSocket ss = new ServerSocket(Integer.parseInt(args[4]));     while (true) { System.out.println("Estou ?espera na porta "+args[4]);
    
// Ficar ?espera de uma comunica o
Socket s = ss.accept();
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
ObjectInputStream in = new ObjectInputStream(s.getInputStream()); // Enviar par etros comuns da comunidade
out.writeObject(p);
out.writeObject(q);
out.writeObject(g); // Construir um certificado para o subject

// Temos que usar os certificados do provider IAIK
// porque na JCA n ?poss el criar

iaik.x509.X509Certificate cert = new iaik.x509.X509Certificate();
// Este n ero de sie aleatio n faz muito sentido...
cert.setSerialNumber(new BigInteger(32, new Random()));

// Definir o DN do issuer
cert.setIssuerDN(converte(issuer.getSubjectDN().getName()));     
// Definir o DN do subject
String subjectDN = (String) in.readObject();
System.out.println("Vou emitir um certificado para "+subjectDN);
cert.setSubjectDN(converte(subjectDN));

// Definir a chave plica do subject
PublicKey subjectPK = (PublicKey) in.readObject();
cert.setPublicKey(subjectPK);

// Definir prazo de validade do certificado
GregorianCalendar data = (GregorianCalendar) Calendar.getInstance();
cert.setValidNotBefore(data.getTime());
data.add(Calendar.MONTH, 6);
cert.setValidNotAfter(data.getTime());

// Assinar o certificado
cert.sign(AlgorithmID.dsa,chave);
    
// Imprimir o conteudo do certificado
System.out.println(cert.toString(true)); // Enviar o certificado ao subject
out.writeObject(cert.getEncoded());     }
} else {
    System.out.println("Modo de utiliza玢o: java CA <keystore> <password> <issuer> <keypass> <porta>");
}
    }    // M閠odo auxiliar utilizado para converter uma string com um DN
    // numa inst钞cia de iaik.asn1.structures.Name    private static Name converte(String aux) {
Name res = new Name();
int i, f;
i=aux.indexOf("C=");
f=aux.indexOf(",",i);
if (f==-1) f=aux.length();
String c = aux.substring(i+2,f);
i=aux.indexOf("ST=");
f=aux.indexOf(",",i);
if (f==-1) f=aux.length();
String st = aux.substring(i+3,f);
i=aux.indexOf("L=");
f=aux.indexOf(",",i);
if (f==-1) f=aux.length();
String l = aux.substring(i+2,f);
i=aux.indexOf("O=");
f=aux.indexOf(",",i);
if (f==-1) f=aux.length();
String o = aux.substring(i+2,f);
i=aux.indexOf("OU=");
f=aux.indexOf(",",i);
if (f==-1) f=aux.length();
String ou = aux.substring(i+3,f);
i=aux.indexOf("CN=");
f=aux.indexOf(",",i);
if (f==-1) f=aux.length();
String cn = aux.substring(i+3,f);
res.addRDN(ObjectID.country, c);
res.addRDN(ObjectID.stateOrProvince, st);
res.addRDN(ObjectID.locality, l);
res.addRDN(ObjectID.organization, o);
res.addRDN(ObjectID.organizationalUnit, ou);
res.addRDN(ObjectID.commonName, cn);
return res;
    }}
------------------------------------------------------------------
[email protected]
------------------------------------------------------------------