Example usage for org.bouncycastle.asn1 ASN1EncodableVector ASN1EncodableVector

List of usage examples for org.bouncycastle.asn1 ASN1EncodableVector ASN1EncodableVector

Introduction

In this page you can find the example usage for org.bouncycastle.asn1 ASN1EncodableVector ASN1EncodableVector.

Prototype

public ASN1EncodableVector() 

Source Link

Usage

From source file:es.gob.afirma.signers.multi.cades.CAdESCounterSignerEnveloped.java

License:Open Source License

/** Método que contrafirma el arbol completo de forma recursiva, todos
 * los dodos creando un nuevo contraSigner.<br>
 * @param signerInfosRaiz/*from  w ww . jav  a 2 s .c  o m*/
 *        Nodo ra&iacute; que contiene todos los signerInfos que se
 *        deben firmar.
 * @param parameters
 *        Par&aacute;metros necesarios para firmar un determinado
 *        SignerInfo
 * @param key Clave privada a usar para firmar.
 * @param certChain Cadena de certificados del firmante.
 * @param contentDescription Descripci&oacute;n textual del tipo de contenido firmado.
 * @param ctis Indicaciones sobre los tipos de compromisos adquiridos con la firma.
 * @param csm Metadatos sobre el firmante.
 * @return El SignerInfo ra&iacute;z con todos sus nodos Contrafirmados.
 * @throws NoSuchAlgorithmException Si no se soporta alguno de los algoritmos necesarios.
 * @throws java.io.IOException Cuando hay errores de entrada / salida
 * @throws CertificateException Cuando hay problemas con los certificados proporcionados.
 * @throws AOException En caso de cualquier otro tipo de error */
private ASN1EncodableVector counterTree(final ASN1Set signerInfosRaiz,
        final P7ContentSignerParameters parameters, final PrivateKey key,
        final java.security.cert.Certificate[] certChain, final String contentDescription,
        final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm)
        throws NoSuchAlgorithmException, IOException, CertificateException, AOException {
    final ASN1EncodableVector counterSigners = new ASN1EncodableVector();

    for (int i = 0; i < signerInfosRaiz.size(); i++) {
        final SignerInfo si = SignerInfo.getInstance(signerInfosRaiz.getObjectAt(i));
        counterSigners.add(getCounterSignerInfo(si, parameters, key, certChain, contentDescription, ctis, csm));
    }

    return counterSigners;
}

From source file:es.gob.afirma.signers.multi.cades.CAdESCounterSignerEnveloped.java

License:Open Source License

/** M&eacute;todo que contrafirma las hojas del arbol completo de forma
 * recursiva, todos los dodos creando un nuevo contraSigner.<br>
 * @param signerInfosRaiz/*www . ja  va2s  .  co  m*/
 *        Nodo ra&iacute; que contiene todos los signerInfos que se
 *        deben firmar.
 * @param parameters
 *        Par&aacute;metros necesarios para firmar un determinado
 *        SignerInfo hoja.
 * @param key Clave privada a usar para firmar.
 * @param certChain Cadena de certificados del firmante.
 * @param contentDescription Descripci&oacute;n textual del tipo de contenido firmado.
 * @param ctis Indicaciones sobre los tipos de compromisos adquiridos con la firma.
 * @param csm Metadatos sobre el firmante.
 * @return El SignerInfo ra&iacute;z con todos sus nodos Contrafirmados.
 * @throws NoSuchAlgorithmException Si no se soporta alguno de los algoritmos necesarios.
 * @throws java.io.IOException Cuando hay errores de entrada / salida
 * @throws CertificateException Cuando hay problemas con los certificados proporcionados.
 * @throws AOException En caso de cualquier otro tipo de error */
private ASN1EncodableVector counterLeaf(final ASN1Set signerInfosRaiz,
        final P7ContentSignerParameters parameters, final PrivateKey key,
        final java.security.cert.Certificate[] certChain, final String contentDescription,
        final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm)
        throws NoSuchAlgorithmException, IOException, CertificateException, AOException {
    final ASN1EncodableVector counterSigners = new ASN1EncodableVector();

    for (int i = 0; i < signerInfosRaiz.size(); i++) {
        final SignerInfo si = SignerInfo.getInstance(signerInfosRaiz.getObjectAt(i));
        counterSigners
                .add(getCounterLeafSignerInfo(si, parameters, key, certChain, contentDescription, ctis, csm));
    }

    return counterSigners;
}

From source file:es.gob.afirma.signers.multi.cades.CAdESCounterSignerEnveloped.java

License:Open Source License

/** M&eacute;todo que contrafirma un nodo determinado del arbol buscandolo de
 * forma recursiva.<br>/*from  w  w  w .  j  a  v a  2s  . c o m*/
 * @param sd <code>SignedAndEnvelopedData</code> que contiene el Nodo ra&iacute;z.
 * @param parameters Par&aacute;metros necesarios para firmar un determinado
 *        <code>SignerInfo</code> hoja.
 * @param key Clave privada a usar para firmar.
 * @param certChain Cadena de certificados del firmante.
 * @param contentDescription Descripci&oacute;n textual del tipo de contenido firmado.
 * @param nodo Nodo signerInfo a firmar.
 * @param ctis Indicaciones sobre los tipos de compromisos adquiridos con la firma.
 * @param csm Metadatos sobre el firmante.
 * @return El SignerInfo ra&iacute;z con todos sus nodos Contrafirmados.
 * @throws NoSuchAlgorithmException Si no se soporta alguno de los algoritmos necesarios.
 * @throws java.io.IOException Cuando hay errores de entrada / salida
 * @throws CertificateException Cuando hay problemas con los certificados proporcionados.
 * @throws AOException En caso de cualquier otro tipo de error */
private ASN1EncodableVector counterNode(final SignedAndEnvelopedData sd,
        final P7ContentSignerParameters parameters, final PrivateKey key,
        final java.security.cert.Certificate[] certChain, final String contentDescription, final int nodo,
        final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm)
        throws NoSuchAlgorithmException, IOException, CertificateException, AOException {
    final ASN1Set signerInfosRaiz = sd.getSignerInfos();

    final ASN1EncodableVector counterSigners = new ASN1EncodableVector();
    ASN1Set auxSignerRaiz;

    auxSignerRaiz = signerInfosRaiz;
    this.actualIndex = 0;

    for (int i = 0; i < auxSignerRaiz.size(); i++) {
        final ASN1Sequence atribute = (ASN1Sequence) auxSignerRaiz.getObjectAt(i);
        final SignerInfo si = SignerInfo.getInstance(atribute);
        SignerInfo counterSigner = null;
        if (this.actualIndex == nodo) {
            counterSigner = getCounterNodeSignerInfo(si, parameters, key, certChain, contentDescription, ctis,
                    csm);
        } else {
            if (this.actualIndex != nodo) {
                counterSigner = getCounterNodeSignerInfo(si, parameters, key, certChain, contentDescription,
                        nodo, ctis, csm);
            }
        }
        this.actualIndex++;
        counterSigners.add(counterSigner);
    }

    return counterSigners;

}

From source file:es.gob.afirma.signers.multi.cades.CAdESCounterSignerEnveloped.java

License:Open Source License

/** M&eacute;todo utilizado por la firma del &eacute;rbol para obtener la
 * contrafirma de los signerInfo de forma recursiva.<br>
 * @param signerInfo/*w w w  .jav a  2  s.  c  o  m*/
 *        Nodo ra&iacute; que contiene todos los signerInfos que se
 *        deben firmar.
 * @param parameters
 *        Par&aacute;metros necesarios para firmar un determinado
 *        SignerInfo hoja.
 * @param key Clave privada a usar para firmar.
 * @param certChain Cadena de certificados del firmante.
 * @param contentDescription Descripci&oacute;n textual del tipo de contenido firmado.
 * @param ctis Indicaciones sobre los tipos de compromisos adquiridos con la firma.
 * @param csm Metadatos sobre el firmante.
 * @return El SignerInfo ra&iacute;z parcial con todos sus nodos
 *         Contrafirmados.
 * @throws NoSuchAlgorithmException Si no se soporta alguno de los algoritmos necesarios.
 * @throws IOException Cuando hay errores de entrada / salida
 * @throws CertificateException Cuando hay problemas con los certificados proporcionados.
 * @throws AOException En caso de cualquier otro tipo de error */
private SignerInfo getCounterSignerInfo(final SignerInfo signerInfo, final P7ContentSignerParameters parameters,
        final PrivateKey key, final java.security.cert.Certificate[] certChain, final String contentDescription,
        final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm)
        throws NoSuchAlgorithmException, IOException, CertificateException, AOException {
    final ASN1EncodableVector signerInfosU = new ASN1EncodableVector();
    final ASN1EncodableVector signerInfosU2 = new ASN1EncodableVector();
    SignerInfo counterSigner = null;
    if (signerInfo.getUnauthenticatedAttributes() != null) {
        final Enumeration<?> eAtributes = signerInfo.getUnauthenticatedAttributes().getObjects();

        while (eAtributes.hasMoreElements()) {
            final Attribute data = Attribute.getInstance(eAtributes.nextElement());
            if (!data.getAttrType().equals(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken)) {
                final ASN1Set setInto = data.getAttrValues();
                final Enumeration<?> eAtributesData = setInto.getObjects();
                while (eAtributesData.hasMoreElements()) {
                    final SignerInfo si = SignerInfo.getInstance(eAtributesData.nextElement());
                    signerInfosU.add(getCounterSignerInfo(si, parameters, key, certChain, contentDescription,
                            ctis, csm));
                }
            } else {
                signerInfosU.add(data);
            }

        }
        // FIRMA DEL NODO ACTUAL
        counterSigner = generateSignerInfo(parameters, signerInfo, key, certChain, contentDescription, ctis,
                csm);
        signerInfosU.add(counterSigner);

        // FIRMA DE CADA UNO DE LOS HIJOS
        ASN1Set a1;
        final ASN1EncodableVector contexExpecific = new ASN1EncodableVector();
        if (signerInfosU.size() > 1) {
            for (int i = 0; i < signerInfosU.size(); i++) {
                if (signerInfosU.get(i) instanceof Attribute) {
                    contexExpecific.add(signerInfosU.get(i));
                } else {
                    contexExpecific.add(
                            new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(i))));
                }
            }
            a1 = SigUtils.getAttributeSet(new AttributeTable(contexExpecific));
            counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                    signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                    signerInfo.getEncryptedDigest(), a1 // unsignedAttr
            );

        } else {
            if (signerInfosU.size() == 1) {
                if (signerInfosU.get(0) instanceof Attribute) {
                    // anadimos el que hay
                    contexExpecific.add(signerInfosU.get(0));
                    // creamos el de la contrafirma.
                    signerInfosU2.add(generateSignerInfo(parameters, signerInfo, key, certChain,
                            contentDescription, ctis, csm));
                    contexExpecific
                            .add(new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2)));
                } else {
                    contexExpecific.add(
                            new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(0))));
                }
                a1 = SigUtils.getAttributeSet(new AttributeTable(contexExpecific));
                counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                        signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                        signerInfo.getEncryptedDigest(), a1 // unsignedAttr
                );
            } else {
                final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature,
                        new DERSet(signerInfosU));
                counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                        signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                        signerInfo.getEncryptedDigest(), new DERSet(uAtrib) // unsignedAttr
                );
            }
        }

    } else {
        signerInfosU2
                .add(generateSignerInfo(parameters, signerInfo, key, certChain, contentDescription, ctis, csm));
        counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                signerInfo.getEncryptedDigest(),
                new DERSet(new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2))) // unsignedAttr
        );
    }
    return counterSigner;
}

From source file:es.gob.afirma.signers.multi.cades.CAdESCounterSignerEnveloped.java

License:Open Source License

/** M&eacute;todo utilizado por la firma de una hoja del &eacute;rbol para
 * obtener la contrafirma de los signerInfo de una determinada hoja de forma
 * recursiva.<br>/* w  ww.  j a va 2s.  c  o m*/
 * @param signerInfo
 *        Nodo ra&iacute; que contiene todos los signerInfos que se
 *        deben firmar.
 * @param parameters
 *        Par&aacute;metros necesarios para firmar un determinado
 *        SignerInfo hoja.
 * @param key Clave privada a usar para firmar.
 * @param certChain Cadena de certificados del firmante.
 * @param contentDescription Descripci&oacute;n textual del tipo de contenido firmado.
 * @param ctis Indicaciones sobre los tipos de compromisos adquiridos con la firma.
 * @param csm Metadatos sobre el firmante.
 * @return El SignerInfo ra&iacute;z parcial con todos sus nodos
 *         Contrafirmados.
 * @throws NoSuchAlgorithmException Si no se soporta alguno de los algoritmos necesarios.
 * @throws java.io.IOException Cuando hay errores de entrada / salida
 * @throws CertificateException Cuando hay problemas con los certificados proporcionados.
 * @throws AOException En caso de cualquier otro tipo de error */
private SignerInfo getCounterLeafSignerInfo(final SignerInfo signerInfo,
        final P7ContentSignerParameters parameters, final PrivateKey key,
        final java.security.cert.Certificate[] certChain, final String contentDescription,
        final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm)
        throws NoSuchAlgorithmException, IOException, CertificateException, AOException {
    final ASN1EncodableVector signerInfosU = new ASN1EncodableVector();
    final ASN1EncodableVector signerInfosU2 = new ASN1EncodableVector();
    SignerInfo counterSigner = null;
    if (signerInfo.getUnauthenticatedAttributes() != null) {
        final Enumeration<?> eAttributes = signerInfo.getUnauthenticatedAttributes().getObjects();

        while (eAttributes.hasMoreElements()) {
            final Attribute data = Attribute.getInstance(eAttributes.nextElement());
            if (!data.getAttrType().equals(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken)) {
                final ASN1Set setInto = data.getAttrValues();
                final Enumeration<?> eAtributesData = setInto.getObjects();
                while (eAtributesData.hasMoreElements()) {
                    final SignerInfo si = SignerInfo.getInstance(eAtributesData.nextElement());
                    signerInfosU.add(getCounterLeafSignerInfo(si, parameters, key, certChain,
                            contentDescription, ctis, csm));
                }
            } else {
                signerInfosU.add(data);
            }

        }
        // FIRMA DE CADA UNO DE LOS HIJOS
        ASN1Set a1;
        final ASN1EncodableVector contexExpecific = new ASN1EncodableVector();
        if (signerInfosU.size() > 1) {
            for (int i = 0; i < signerInfosU.size(); i++) {
                if (signerInfosU.get(i) instanceof Attribute) {
                    contexExpecific.add(signerInfosU.get(i));
                } else {
                    contexExpecific.add(
                            new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(i))));
                }
            }
            a1 = SigUtils.getAttributeSet(new AttributeTable(contexExpecific));
            counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                    signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                    signerInfo.getEncryptedDigest(), a1 // unsignedAttr
            );

        } else {
            counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                    signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                    signerInfo.getEncryptedDigest(),
                    new DERSet(new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU))) // unsignedAttr
            );

        }
    } else {
        signerInfosU2
                .add(generateSignerInfo(parameters, signerInfo, key, certChain, contentDescription, ctis, csm));
        counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                signerInfo.getEncryptedDigest(),
                new DERSet(new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2))) // unsignedAttr
        );

    }
    return counterSigner;
}

From source file:es.gob.afirma.signers.multi.cades.CAdESCounterSignerEnveloped.java

License:Open Source License

/** M&eacute;todo utilizado por la firma de un nodo del &eacute;rbol para
 * obtener la contrafirma de los signerInfo Sin ser recursivo. Esto es por
 * el caso especial de que puede ser el nodo raiz el nodo a firmar, por lo
 * que no ser&iacute;a necesario usar la recursividad.<br>
 * @param signerInfo/*from ww w. j a v a2 s . c  o  m*/
 *        Nodo ra&iacute; que contiene todos los signerInfos que se
 *        deben firmar.
 * @param parameters
 *        Par&aacute;metros necesarios para firmar un determinado
 *        SignerInfo hoja.
 * @param key Clave privada a usar para firmar.
 * @param certChain Cadena de certificados del firmante.
 * @param contentDescription Descripci&oacute;n textual del tipo de contenido firmado.
 * @param ctis Indicaciones sobre los tipos de compromisos adquiridos con la firma.
 * @param csm Metadatos sobre el firmante.
 * @return El SignerInfo ra&iacute;z parcial con todos sus nodos
 *         Contrafirmados.
 * @throws NoSuchAlgorithmException Si no se soporta alguno de los algoritmos necesarios.
 * @throws IOException Cuando hay errores en el tratamiento de los datos.
 * @throws CertificateException Cuando hay problemas con los certificados proporcionados. */
private SignerInfo getCounterNodeSignerInfo(final SignerInfo signerInfo,
        final P7ContentSignerParameters parameters, final PrivateKey key,
        final java.security.cert.Certificate[] certChain, final String contentDescription,
        final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm)
        throws NoSuchAlgorithmException, IOException, CertificateException {
    final ASN1EncodableVector signerInfosU = new ASN1EncodableVector();
    final ASN1EncodableVector signerInfosU2 = new ASN1EncodableVector();
    SignerInfo counterSigner = null;
    if (signerInfo.getUnauthenticatedAttributes() != null) {
        final Enumeration<?> eAttributes = signerInfo.getUnauthenticatedAttributes().getObjects();
        while (eAttributes.hasMoreElements()) {
            final Attribute data = Attribute.getInstance(eAttributes.nextElement());
            if (!data.getAttrType().equals(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken)) {
                final ASN1Set setInto = data.getAttrValues();
                final Enumeration<?> eAtributesData = setInto.getObjects();
                while (eAtributesData.hasMoreElements()) {
                    signerInfosU.add(SignerInfo.getInstance(eAtributesData.nextElement()));
                }
            } else {
                signerInfosU.add(data);
            }

        }
        // FIRMA DEL NODO ACTUAL
        signerInfosU
                .add(generateSignerInfo(parameters, signerInfo, key, certChain, contentDescription, ctis, csm));

        // FIRMA DE CADA UNO DE LOS HIJOS
        final ASN1EncodableVector contexExpecific = new ASN1EncodableVector();
        if (signerInfosU.size() > 1) {
            for (int i = 0; i < signerInfosU.size(); i++) {
                if (signerInfosU.get(i) instanceof Attribute) {
                    contexExpecific.add(signerInfosU.get(i));
                } else {
                    contexExpecific.add(
                            new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(i))));
                }
            }
            counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                    signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                    signerInfo.getEncryptedDigest(),
                    SigUtils.getAttributeSet(new AttributeTable(contexExpecific)) // unsignedAttr
            );

        } else {
            if (signerInfosU.size() == 1) {
                if (signerInfosU.get(0) instanceof Attribute) {
                    // anadimos el que hay
                    contexExpecific.add(signerInfosU.get(0));
                    // creamos el de la contrafirma.
                    signerInfosU2.add(generateSignerInfo(parameters, signerInfo, key, certChain,
                            contentDescription, ctis, csm));
                    final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature,
                            new DERSet(signerInfosU2));
                    contexExpecific.add(uAtrib);

                } else {
                    contexExpecific.add(
                            new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(0))));
                }
                counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                        signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                        signerInfo.getEncryptedDigest(),
                        SigUtils.getAttributeSet(new AttributeTable(contexExpecific)) // unsignedAttr
                );
            } else {
                counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                        signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                        signerInfo.getEncryptedDigest(),
                        new DERSet(new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU))) // unsignedAttr
                );
            }
        }
    } else {
        signerInfosU2
                .add(generateSignerInfo(parameters, signerInfo, key, certChain, contentDescription, ctis, csm));
        counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                signerInfo.getEncryptedDigest(),
                new DERSet(new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2))) // unsignedAttr
        );
    }
    return counterSigner;
}

From source file:es.gob.afirma.signers.multi.cades.CAdESCounterSignerEnveloped.java

License:Open Source License

/** M&eacute;todo utilizado por la firma de un nodo del &eacute;rbol para
 * obtener la contrafirma de los signerInfo buscando el nodo de forma
 * recursiva.<br>/*from   ww  w .  j  a  v a2 s .  c  om*/
 * @param signerInfo
 *        Nodo ra&iacute; que contiene todos los signerInfos que se
 *        deben firmar.
 * @param parameters
 *        Par&aacute;metros necesarios para firmar un determinado
 *        SignerInfo hoja.
 * @param key Clave privada a usar para firmar
 * @param certChain Cadena de certificados del firmante.
 * @param contentDescription
 *         Descripci&oacute;n textual del tipo de contenido firmado.
 * @param node Nodo espec&iacute;fico a firmar.
 * @param ctis Indicaciones sobre los tipos de compromisos adquiridos con la firma.
 * @param csm Metadatos sobre el firmante.
 * @return El SignerInfo ra&iacute;z parcial con todos sus nodos
 *         Contrafirmados.
 * @throws NoSuchAlgorithmException Si no se soporta alguno de los algoritmos necesarios.
 * @throws IOException Cuando hay errores en el tratamiento de los datos.
 * @throws CertificateException Cuando hay problemas con los certificados proporcionados.
 * @throws AOException En caso de cualquier otro tipo de error */
private SignerInfo getCounterNodeSignerInfo(final SignerInfo signerInfo,
        final P7ContentSignerParameters parameters, final PrivateKey key,
        final java.security.cert.Certificate[] certChain, final String contentDescription, final int node,
        final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm)
        throws NoSuchAlgorithmException, IOException, CertificateException, AOException {
    final ASN1EncodableVector signerInfosU = new ASN1EncodableVector();
    SignerInfo counterSigner = null;
    if (signerInfo.getUnauthenticatedAttributes() != null) {
        final Enumeration<?> eAtributes = signerInfo.getUnauthenticatedAttributes().getObjects();
        while (eAtributes.hasMoreElements()) {
            final Attribute data = Attribute.getInstance(eAtributes.nextElement());
            if (!data.getAttrType().equals(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken)) {
                final Enumeration<?> eAtributesData = data.getAttrValues().getObjects();
                while (eAtributesData.hasMoreElements()) {
                    final ASN1Sequence atrib = (ASN1Sequence) eAtributesData.nextElement();
                    final SignerInfo si = SignerInfo.getInstance(atrib);
                    this.actualIndex++;
                    if (this.actualIndex != node) {
                        if (this.actualIndex < node) {
                            signerInfosU.add(getCounterNodeSignerInfo(si, parameters, key, certChain,
                                    contentDescription, node, ctis, csm));
                        } else {
                            signerInfosU.add(si);
                        }
                    } else {
                        signerInfosU.add(getCounterNodeSignerInfo(si, parameters, key, certChain,
                                contentDescription, ctis, csm));
                    }
                }
            } else {
                signerInfosU.add(data);
            }

        }
        // FIRMA DE CADA UNO DE LOS HIJOS
        final ASN1EncodableVector contexExpecific = new ASN1EncodableVector();
        if (signerInfosU.size() > 1) {
            for (int i = 0; i < signerInfosU.size(); i++) {
                if (signerInfosU.get(i) instanceof Attribute) {
                    contexExpecific.add(signerInfosU.get(i));
                } else {
                    contexExpecific.add(
                            new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(i))));
                }
            }
            counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                    signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                    signerInfo.getEncryptedDigest(),
                    SigUtils.getAttributeSet(new AttributeTable(contexExpecific)) // unsignedAttr
            );

        } else {
            if (signerInfosU.size() == 1) {
                if (signerInfosU.get(0) instanceof Attribute) {
                    // anadimos el que hay
                    contexExpecific.add(signerInfosU.get(0));

                } else {
                    contexExpecific.add(
                            new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(0))));
                }
                counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                        signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                        signerInfo.getEncryptedDigest(),
                        SigUtils.getAttributeSet(new AttributeTable(contexExpecific)) // unsignedAttr
                );
            } else {
                counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                        signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                        signerInfo.getEncryptedDigest(),
                        new DERSet(new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU))) // unsignedAttr
                );
            }
        }
    } else {
        counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                signerInfo.getEncryptedDigest(), null // unsignedAttr
        );

    }
    return counterSigner;
}

From source file:es.gob.afirma.signers.multi.cades.CAdESTriPhaseCoSigner.java

License:Open Source License

/** Realiza una post-cofirma CAdES.
 * @param pkcs1sign Firma PKCS#1 de la pre-cofirma (de los SignedAttributes)
 * @param preCoSign Pre-cofirma CAdES (SignedAttributes)
 * @param content Contenido a post-cofirmar (indicar null si se desea omitir su inclusi&oacute;n en la firma)
 * @param signatureAlgorithm Algoritmo de firma
 * @param signerCertificateChain Cadena de certificados del firmante
 * @param sign Firma donde insertar la cofirma
 * @return Cofirma CAdES/*from   w w  w .j av a2  s . c om*/
 * @throws IOException Cuando ocurren problemas de entrada / salida
 * @throws CertificateEncodingException Si alguno de los certificados proporcionados tienen problemas de formatos */
public static byte[] postCoSign(final byte[] pkcs1sign, final byte[] preCoSign, final byte[] content,
        final String signatureAlgorithm, final X509Certificate[] signerCertificateChain, final byte[] sign)
        throws IOException, CertificateEncodingException {
    // Firma en ASN.1
    final ASN1OctetString asn1sign = new DEROctetString(pkcs1sign);

    // Identificador del firmante ISSUER AND SERIAL-NUMBER
    final TBSCertificateStructure tbs = TBSCertificateStructure
            .getInstance(ASN1Primitive.fromByteArray(signerCertificateChain[0].getTBSCertificate()));
    final IssuerAndSerialNumber encSid = new IssuerAndSerialNumber(X500Name.getInstance(tbs.getIssuer()),
            tbs.getSerialNumber().getValue());
    final SignerIdentifier identifier = new SignerIdentifier(encSid);

    // digEncryptionAlgorithm
    final AlgorithmIdentifier encAlgId = SigUtils.makeAlgId(AOAlgorithmID.getOID("RSA")); //$NON-NLS-1$
    final AlgorithmIdentifier digAlgId = SigUtils
            .makeAlgId(AOAlgorithmID.getOID(AOSignConstants.getDigestAlgorithmName(signatureAlgorithm)));

    final ASN1Sequence contentSignedData = getContentSignedData(sign);
    final SignedData sd = SignedData.getInstance(contentSignedData);

    // CERTIFICADOS
    // Obtenemos la lista de certificados

    final ASN1Set certificatesSigned = sd.getCertificates();
    final Enumeration<?> certs = certificatesSigned.getObjects();
    final ASN1EncodableVector vCertsSig = new ASN1EncodableVector();

    // COGEMOS LOS CERTIFICADOS EXISTENTES EN EL FICHERO
    while (certs.hasMoreElements()) {
        vCertsSig.add((ASN1Encodable) certs.nextElement());
    }

    ASN1Set certificates = null;
    if (signerCertificateChain.length != 0) {
        final List<ASN1Encodable> ce = new ArrayList<ASN1Encodable>();
        for (final X509Certificate element : signerCertificateChain) {
            ce.add(Certificate.getInstance(ASN1Primitive.fromByteArray(element.getEncoded())));
        }
        certificates = SigUtils.fillRestCerts(ce, vCertsSig);
    }

    // SIGNERINFO
    // raiz de la secuencia de SignerInfo
    // Obtenemos los signerInfos del SignedData
    final ASN1Set signerInfosSd = sd.getSignerInfos();

    // introducimos los SignerInfos Existentes
    final ASN1EncodableVector signerInfos = new ASN1EncodableVector();

    // introducimos el nuevo SignerInfo del firmante actual.
    for (int i = 0; i < signerInfosSd.size(); i++) {
        signerInfos.add(SignerInfo.getInstance(signerInfosSd.getObjectAt(i)));
    }

    // Creamos los signerInfos del SignedData
    signerInfos
            .add(new SignerInfo(identifier, digAlgId, ASN1Set.getInstance(preCoSign), encAlgId, asn1sign, null // unsignedAttr
    ));

    final ContentInfo encInfo = getContentInfoFromContent(content);

    // Construimos el Signed Data y lo devolvemos
    return new ContentInfo(PKCSObjectIdentifiers.signedData,
            new SignedData(sd.getDigestAlgorithms(), encInfo, certificates, (ASN1Set) null, // CRLS no usado
                    new DERSet(signerInfos) // UnsignedAttr
            )).getEncoded(ASN1Encoding.DER);

}

From source file:es.gob.afirma.signers.multi.cades.CAdESTriPhaseCounterSigner.java

License:Open Source License

/** Crea una contrafirma a partir de los datos
 * del firmante, el archivo que se firma y del archivo que contiene las
 * firmas.<br>/*from www  .j  a v a  2  s  . c om*/
 * @param parameters
 *        par&aacute;metros necesarios que contienen tanto la firma del
 *        archivo a firmar como los datos del firmante.
 * @param data
 *        Archivo que contiene las firmas.
 * @param targetType
 *        Lo que se quiere firmar. Puede ser el &aacute;rbol completo,
 *        las hojas, un nodo determinado o unos determinados firmantes.
 * @param key Clave privada a usar para firmar.
 * @param certChain Cadena de certificados del firmante
 * @param policy Pol&iacute;tica de firma
 * @param signingCertificateV2
 *        <code>true</code> si se desea usar la versi&oacute;n 2 del
 *        atributo <i>Signing Certificate</i> <code>false</code> para
 *        usar la versi&oacute;n 1
 * @param contentType
 *         Tipo de contenido definido por su OID.
 * @param contentDescription
 *         Descripci&oacute;n textual del tipo de contenido firmado.
 * @return El archivo de firmas con la nueva firma.
 * @throws java.io.IOException
 *         Excepci&oacute;n cuando se produce algun error con lectura
 *         escritura de ficheros.
 * @throws java.security.NoSuchAlgorithmException
 *         Excepci&oacute;n cuando no se encuentra el algoritmo de
 *         firma.
 * @throws java.security.cert.CertificateException
 *         Si se produce alguna excepci&oacute;n con los certificados de
 *         firma.
 * @throws AOException
 *         Cuando ocurre alguno error con contemplado por las otras
 *         excepciones declaradas */
public CAdESPreCounterSignResult preCounterSign(final P7ContentSignerParameters parameters, final byte[] data,
        final CounterSignTarget targetType, final PrivateKey key,
        final java.security.cert.Certificate[] certChain, final AdESPolicy policy,
        final boolean signingCertificateV2, final String contentType, final String contentDescription)
        throws IOException, NoSuchAlgorithmException, CertificateException, AOException {

    // Inicializamos el contador global y la lista de SignedDatas
    this.counterIndex = 0;
    this.signedDatas = new ArrayList<byte[]>();

    // LEEMOS EL FICHERO QUE NOS INTRODUCEN
    final ASN1InputStream is = new ASN1InputStream(data);
    final ASN1Sequence dsq = (ASN1Sequence) is.readObject();
    is.close();
    final Enumeration<?> e = dsq.getObjects();
    // Elementos que contienen los elementos OID SignedData
    e.nextElement();
    // Contenido de SignedData
    final ASN1TaggedObject doj = (ASN1TaggedObject) e.nextElement();
    final ASN1Sequence contentSignedData = (ASN1Sequence) doj.getObject();

    final SignedData sd = SignedData.getInstance(contentSignedData);

    // Obtenemos los signerInfos del SignedData
    final ASN1Set signerInfosSd = sd.getSignerInfos();

    // 4. CERTIFICADOS
    // obtenemos la lista de certificados
    ASN1Set certificates = null;

    final ASN1Set certificatesSigned = sd.getCertificates();
    final ASN1EncodableVector vCertsSig = new ASN1EncodableVector();
    final Enumeration<?> certs = certificatesSigned.getObjects();

    // COGEMOS LOS CERTIFICADOS EXISTENTES EN EL FICHERO
    while (certs.hasMoreElements()) {
        vCertsSig.add((ASN1Encodable) certs.nextElement());
    }
    // e introducimos los del firmante actual.
    if (certChain.length != 0) {
        final List<ASN1Encodable> ce = new ArrayList<ASN1Encodable>();
        for (final java.security.cert.Certificate element : certChain) {
            ce.add(Certificate.getInstance(ASN1Primitive.fromByteArray(element.getEncoded())));
        }
        certificates = SigUtils.fillRestCerts(ce, vCertsSig);
    }

    // CRLS no usado
    final ASN1Set certrevlist = null;

    // 5. SIGNERINFO
    // raiz de la secuencia de SignerInfo
    ASN1EncodableVector signerInfos = new ASN1EncodableVector();

    // FIRMA EN ARBOL
    if (CounterSignTarget.TREE.equals(targetType)) {
        signerInfos = counterTree(signerInfosSd, parameters, key, certChain, contentType, contentDescription,
                policy, signingCertificateV2);
    }
    // FIRMA DE LAS HOJAS
    else if (CounterSignTarget.LEAFS.equals(targetType)) {
        signerInfos = counterLeaf(signerInfosSd, parameters, key, certChain, contentType, contentDescription,
                policy, signingCertificateV2);
    } else {
        throw new IllegalArgumentException("Modo de contrafirma no soportado: " + targetType); //$NON-NLS-1$
    }

    // construimos el Signed Data y lo devolvemos dentro del resultado
    return new CAdESPreCounterSignResult(
            new ContentInfo(PKCSObjectIdentifiers.signedData,
                    new SignedData(sd.getDigestAlgorithms(), sd.getEncapContentInfo(), certificates,
                            certrevlist, new DERSet(signerInfos))).getEncoded(ASN1Encoding.DER),
            this.signedDatas);
}

From source file:es.gob.afirma.signers.multi.cades.CAdESTriPhaseCounterSigner.java

License:Open Source License

/** Contrafirma el &aacute;rbol completo de forma recursiva, todos
 * los nodos creando un nuevo contraSigner.<br>
 * @param signerInfosRaiz/*from  w  ww . jav a2  s.  c  o  m*/
 *        Nodo ra&iacute; que contiene todos los signerInfos que se
 *        deben firmar.
 * @param parameters
 *        Par&aacute;metros necesarios para firmar un determinado
 *        SignerInfo
 * @param key Clave privada a usar para firmar
 * @param contentType
 *         Tipo de contenido definido por su OID.
 * @param contentDescription
 *         Descripci&oacute;n textual del tipo de contenido firmado.
 * @return El SignerInfo ra&iacute;z con todos sus nodos Contrafirmados.
 * @throws java.security.NoSuchAlgorithmException
 * @throws java.io.IOException
 * @throws java.security.cert.CertificateException
 * @throws es.map.es.map.afirma.exceptions.AOException */
private ASN1EncodableVector counterTree(final ASN1Set signerInfosRaiz,
        final P7ContentSignerParameters parameters, final PrivateKey key,
        final java.security.cert.Certificate[] certChain, final String contentType,
        final String contentDescription, final AdESPolicy policy, final boolean signingCertificateV2)
        throws NoSuchAlgorithmException, IOException, CertificateException, AOException {

    final ASN1EncodableVector counterSigners = new ASN1EncodableVector();
    for (int i = 0; i < signerInfosRaiz.size(); i++) {
        final SignerInfo si = new SignerInfo((ASN1Sequence) signerInfosRaiz.getObjectAt(i));
        counterSigners.add(getCounterSignerInfo(si, parameters, key, certChain, contentType, contentDescription,
                policy, signingCertificateV2));
    }
    return counterSigners;
}