Example usage for org.bouncycastle.asn1.cms SignerInfo getEncryptedDigest

List of usage examples for org.bouncycastle.asn1.cms SignerInfo getEncryptedDigest

Introduction

In this page you can find the example usage for org.bouncycastle.asn1.cms SignerInfo getEncryptedDigest.

Prototype

public ASN1OctetString getEncryptedDigest() 

Source Link

Usage

From source file:es.gob.afirma.signers.cms.CounterSigner.java

License:Open Source License

/** Método que genera un signerInfo específico utilizando los
 * datos necesarios para crearlo. Se utiliza siempre que no se sabe cual es
 * el signerInfo que se debe firmar./*from   w  w w  .  j a  v  a  2 s. c  o m*/
 * @param parameters Parámetros necesarios para firmar un determinado
 *                   <code>SignerInfo</code> hoja.
 * @param si <code>SignerInfo</code> del que se debe recoger la informaci&oacute;n para
 *           realizar la contrafirma espec&iacute;fica.
 * @param key Clave privada a usar para firmar.
 * @param certChain Cadena de certificados del firmante.
 * @return <code>SignerInfo</code> contrafirmado.
 * @throws java.security.NoSuchAlgorithmException Cuando el JRE no soporta alg&uacute;n algoritmo necesario.
 * @throws java.io.IOException Si hay errores en la lectura de datos.
 * @throws java.security.cert.CertificateException Si hay problemas en el tratamiento de los certificados. */
private SignerInfo unsignedAtributte(final P7ContentSignerParameters parameters, final SignerInfo si,
        final PrivateKey key, final java.security.cert.Certificate[] certChain)
        throws NoSuchAlgorithmException, IOException, CertificateException {
    // // UNAUTHENTICATEDATTRIBUTES

    // buscamos que timo de algoritmo es y lo codificamos con su OID
    final String signatureAlgorithm = parameters.getSignatureAlgorithm();
    final String digestAlgorithm = AOSignConstants.getDigestAlgorithmName(signatureAlgorithm);

    // ATRIBUTOS FINALES

    final ASN1Set signedAttr = generateSignerInfo((X509Certificate) certChain[0], digestAlgorithm,
            si.getEncryptedDigest().getOctets());
    final ASN1Set unsignedAttr = generateUnsignerInfo();

    // 5. SIGNERINFO
    // raiz de la secuencia de SignerInfo
    final TBSCertificateStructure tbs = TBSCertificateStructure
            .getInstance(ASN1Primitive.fromByteArray(((X509Certificate) certChain[0]).getTBSCertificate()));
    final IssuerAndSerialNumber encSid = new IssuerAndSerialNumber(X500Name.getInstance(tbs.getIssuer()),
            tbs.getSerialNumber().getValue());
    final SignerIdentifier identifier = new SignerIdentifier(encSid);

    // AlgorithmIdentifier
    final AlgorithmIdentifier digAlgId = SigUtils.makeAlgId(AOAlgorithmID.getOID(digestAlgorithm));

    // // FIN ATRIBUTOS

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

    final ASN1OctetString sign2;
    try {
        sign2 = firma(signatureAlgorithm, key);
    } catch (final Exception ex) {
        throw new IOException("Error realizando la firma: " + ex, ex); //$NON-NLS-1$
    }

    return new SignerInfo(identifier, digAlgId, signedAttr, encAlgId, sign2, unsignedAttr);

}

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

License:Open Source License

/** Obtiene la contrafirma de los signerInfo de forma recursiva.<br>
 * @param signerInfo/* w  ww  .  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 policy Pol&iacute;tica de firma.
 * @param signingCertificateV2 <code>true</code> si se desea usar <i>SigningCertificateV2</i>, <code>false</code>
 *        para usar <i>SigningCertificateV1</i>.
 * @param ctis Indicaciones sobre los tipos de compromisos adquiridos con la firma.
 * @param csm Metadatos sobre el firmante.
 * @return <i>SignerInfo</i> 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 getCounterSignerInfo(final SignerInfo signerInfo, final P7ContentSignerParameters parameters,
        final PrivateKey key, final java.security.cert.Certificate[] certChain, final String contentDescription,
        final AdESPolicy policy, final boolean signingCertificateV2,
        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,
                            policy, signingCertificateV2, ctis, csm));
                }
            } else {
                signerInfosU.add(data);
            }

        }
        // FIRMA DEL NODO ACTUAL
        counterSigner = generateSignerInfo(parameters.getSignatureAlgorithm(), signerInfo, key, certChain,
                contentDescription, policy, signingCertificateV2, 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.getSignatureAlgorithm(), signerInfo, key,
                            certChain, contentDescription, policy, signingCertificateV2, 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))));
                }
                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.getSignatureAlgorithm(), signerInfo, key, certChain,
                contentDescription, policy, signingCertificateV2, ctis, csm));
        final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2));
        counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                signerInfo.getEncryptedDigest(), new DERSet(uAtrib) // unsignedAttr
        );

    }
    return counterSigner;
}

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

License:Open Source License

/** Obtiene la contrafirma de los signerInfo de una determinada hoja de forma
 * recursiva.<br>/*from w  ww  .  j a va 2  s . 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 policy Pol&iacute;tica de firma.
 * @param signingCertificateV2 <code>true</code> si se desea usar <i>SigningCertificateV2</i>, <code>false</code>
 *        para usar <i>SigningCertificateV1</i>.
 * @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 getLeafSignerInfo(final SignerInfo signerInfo, final P7ContentSignerParameters parameters,
        final PrivateKey key, final java.security.cert.Certificate[] certChain, final String contentDescription,
        final AdESPolicy policy, final boolean signingCertificateV2,
        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(getLeafSignerInfo(si, parameters, key, certChain, contentDescription,
                            policy, signingCertificateV2, 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 {
            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.getSignatureAlgorithm(), signerInfo, key,
                            certChain, contentDescription, policy, signingCertificateV2, 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))));
                }
                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.getSignatureAlgorithm(), signerInfo, key, certChain,
                contentDescription, policy, signingCertificateV2, ctis, csm));
        final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2));
        counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                signerInfo.getEncryptedDigest(), new DERSet(uAtrib) // unsignedAttr
        );

    }
    return counterSigner;
}

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

License:Open Source License

/** Obtiene 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  w  ww. j av 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 policy Pol&iacute;tica de firma.
 * @param signingCertificateV2 <code>true</code> si se desea usar <i>SigningCertificateV2</i>, <code>false</code>
 *        para usar <i>SigningCertificateV1</i>.
 * @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. */
private SignerInfo getNodeSignerInfo(final SignerInfo signerInfo, final P7ContentSignerParameters parameters,
        final PrivateKey key, final java.security.cert.Certificate[] certChain, final String contentDescription,
        final AdESPolicy policy, final boolean signingCertificateV2,
        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<?> 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()) {
                    signerInfosU.add(SignerInfo.getInstance(eAtributesData.nextElement()));
                }
            } else {
                signerInfosU.add(data);
            }

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

        // 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.getSignatureAlgorithm(), signerInfo, key,
                            certChain, contentDescription, policy, signingCertificateV2, 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))));
                }
                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.getSignatureAlgorithm(), signerInfo, key, certChain,
                contentDescription, policy, signingCertificateV2, ctis, csm));
        final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2));
        counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                signerInfo.getEncryptedDigest(), new DERSet(uAtrib) // unsignedAttr
        );
    }
    return counterSigner;
}

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

License:Open Source License

/** Obtiene la contrafirma de los signerInfo buscando el nodo de forma
 * recursiva.<br>/*from  ww  w  .  j a va  2  s.  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 node Nodo espec&iacute;fico a firmar.
 * @param contentDescription Descripci&oacute;n textual del tipo de contenido firmado.
 * @param policy Pol&iacute;tica de firma.
 * @param signingCertificateV2 <code>true</code> si se desea usar <i>SigningCertificateV2</i>, <code>false</code>
 *        para usar <i>SigningCertificateV1</i>.
 * @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 getNodeSignerInfo(final SignerInfo signerInfo, final P7ContentSignerParameters parameters,
        final PrivateKey key, final java.security.cert.Certificate[] certChain, final String contentDescription,
        final int node, final AdESPolicy policy, final boolean signingCertificateV2,
        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 ASN1Set setInto = data.getAttrValues();
                final Enumeration<?> eAtributesData = setInto.getObjects();
                while (eAtributesData.hasMoreElements()) {
                    final SignerInfo si = SignerInfo.getInstance(eAtributesData.nextElement());
                    this.actualIndex++;
                    if (this.actualIndex != node) {
                        if (this.actualIndex < node) {
                            signerInfosU.add(getNodeSignerInfo(si, parameters, key, certChain,
                                    contentDescription, node, policy, signingCertificateV2, ctis, csm));
                        } else {
                            signerInfosU.add(si);
                        }
                    } else {
                        final SignerInfo obtained = getNodeSignerInfo(si, parameters, key, certChain,
                                contentDescription, policy, signingCertificateV2, ctis, csm);
                        signerInfosU.add(obtained);
                    }
                }
            } else {
                signerInfosU.add(data);
            }

        }
        // FIRMA DE CADA UNO DE LOS HIJOS
        final 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));

                } 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 {
        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.CAdESCounterSigner.java

License:Open Source License

/** Genera un signerInfo espec&iacute;fico utilizando los
 * datos necesarios para crearlo. Se utiliza siempre que no se sabe cual es
 * el signerInfo que se debe firmar./*from   w  w  w .  ja  v  a  2  s .  com*/
 * @param signatureAlgorithm Algoritmo de firma a usar.
 * @param si SignerInfo del que se debe recoger la informaci&oacute;n para
 *           realizar la contrafirma espec&iacute;fica.
 * @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 policy Pol&iacute;tica de firma.
 * @param signingCertificateV2 <code>true</code> si se desea usar <i>SigningCertificateV2</i>, <code>false</code>
 *        para usar <i>SigningCertificateV1</i>.
 * @param ctis Indicaciones sobre los tipos de compromisos adquiridos con la firma.
 * @param csm Metadatos sobre el firmante.
 * @return <i>SignerInfo</i> contrafirmado.
 * @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. */
private SignerInfo generateSignerInfo(final String signatureAlgorithm, final SignerInfo si,
        final PrivateKey key, final java.security.cert.Certificate[] certChain, final String contentDescription,
        final AdESPolicy policy, final boolean signingCertificateV2,
        final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm)
        throws NoSuchAlgorithmException, IOException, CertificateException {
    // buscamos que timo de algoritmo es y lo codificamos con su OID
    final String digestAlgorithm = AOSignConstants.getDigestAlgorithmName(signatureAlgorithm);

    // authenticatedAttributes
    final ASN1EncodableVector contextExcepcific = CAdESUtils.generateSignerInfo(certChain[0], digestAlgorithm,
            si.getEncryptedDigest().getOctets(), policy, signingCertificateV2, null,
            this.date != null ? this.date : new Date(), // Usamos fecha y hora actual nueva si no se nos ha indicado otra distinta
            false, null, // En contrafirma el ContentType no se pone
            contentDescription, ctis, csm);

    final ASN1Set signedAttr = SigUtils.getAttributeSet(new AttributeTable(contextExcepcific));

    final ASN1OctetString sign2;
    try {
        sign2 = new DEROctetString(
                pkcs1Sign(signedAttr.getEncoded(ASN1Encoding.DER), signatureAlgorithm, key, certChain));
    } catch (final AOException ex) {
        throw new IOException("Error al realizar la firma: " + ex, ex); //$NON-NLS-1$
    }

    // AlgorithmIdentifier
    final AlgorithmIdentifier digAlgId = SigUtils.makeAlgId(AOAlgorithmID.getOID(digestAlgorithm));

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

    // 5. SIGNERINFO
    // raiz de la secuencia de SignerInfo
    final TBSCertificateStructure tbs = TBSCertificateStructure
            .getInstance(ASN1Primitive.fromByteArray(((X509Certificate) certChain[0]).getTBSCertificate()));
    final IssuerAndSerialNumber encSid = new IssuerAndSerialNumber(X500Name.getInstance(tbs.getIssuer()),
            tbs.getSerialNumber().getValue());
    final SignerIdentifier identifier = new SignerIdentifier(encSid);

    // UNAUTHENTICATEDATTRIBUTES
    final ASN1Set unsignedAttr = SigUtils.getAttributeSet(new AttributeTable(contextExcepcific));

    return new SignerInfo(identifier, digAlgId, unsignedAttr, encAlgId, sign2, null);

}

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/* www. jav a  2  s. 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 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 .ja va  2  s  .  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  w  w w .  j  av a2  s.  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 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  w w  w.  j  av  a  2  s. 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 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;
}