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

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

Introduction

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

Prototype

public AlgorithmIdentifier getDigestEncryptionAlgorithm() 

Source Link

Usage

From source file:com.guardtime.asn1.Asn1Util.java

License:Apache License

/**
 * Extends the given content info with data from the given certification
 * token./*  w w w . java  2 s. c o  m*/
 *
 * @param contentInfo
 *            the original timestamp encoded in a CMS {@code ContentInfo}
 *            structure.
 * @param certToken
 *            the {@code CertToken} from the GuardTime online verification
 *            service.
 * @return updated (extended) timestamp encoded in a new CMS
 *         {@code ContentInfo} structure.
 */
static org.bouncycastle.asn1.cms.ContentInfo extend(org.bouncycastle.asn1.cms.ContentInfo contentInfo,
        Asn1CertToken certToken) throws Asn1FormatException {
    ASN1EncodableVector v;

    // Extract signed data
    ASN1Encodable asn1SignedData = contentInfo.getContent();
    org.bouncycastle.asn1.cms.SignedData content = org.bouncycastle.asn1.cms.SignedData
            .getInstance(asn1SignedData);

    // Extract signer info
    ASN1Encodable asn1SignerInfo = content.getSignerInfos().getObjectAt(0);
    org.bouncycastle.asn1.cms.SignerInfo signerInfo = org.bouncycastle.asn1.cms.SignerInfo
            .getInstance(asn1SignerInfo);

    // Extract time signature
    ASN1Primitive asn1TimeSignature = null;
    try {
        asn1TimeSignature = ASN1Primitive.fromByteArray(signerInfo.getEncryptedDigest().getOctets());
    } catch (IOException e) {
        throw new Asn1FormatException("time signature has invalid format");
    }
    Asn1TimeSignature timeSignature = Asn1TimeSignature.getInstance(asn1TimeSignature);

    // Extend TimeSignature
    v = new ASN1EncodableVector();
    v.add(timeSignature.getLocation());
    v.add(certToken.getHistory());
    v.add(certToken.getPublishedData());
    // Skip PK signature <- updated
    v.add(new DERTaggedObject(false, 1, certToken.getPubReference()));
    timeSignature = Asn1TimeSignature.getInstance(new DERSequence(v));

    // Extend SignerInfo
    v = new ASN1EncodableVector();
    v.add(signerInfo.getVersion());
    v.add(signerInfo.getSID());
    v.add(signerInfo.getDigestAlgorithm());

    ASN1Set signedAttrs = signerInfo.getAuthenticatedAttributes();
    if (signedAttrs != null) {
        v.add(new DERTaggedObject(false, 0, signedAttrs));
    }

    v.add(signerInfo.getDigestEncryptionAlgorithm());
    try {
        v.add(new DEROctetString(timeSignature)); // <- updated
    } catch (IOException e) {
        throw new Asn1FormatException(e);
    }

    ASN1Set unsignedAttrs = signerInfo.getUnauthenticatedAttributes();
    if (unsignedAttrs != null) {
        v.add(new DERTaggedObject(false, 1, unsignedAttrs));
    }

    signerInfo = org.bouncycastle.asn1.cms.SignerInfo.getInstance(new DERSequence(v));

    // Extend SignedData
    v = new ASN1EncodableVector();
    v.add(content.getVersion());
    v.add(content.getDigestAlgorithms());
    v.add(content.getEncapContentInfo());
    // Skipping certificates <- updated
    // Skipping CRLs <- updated
    v.add(new DERSet(signerInfo)); // <- updated
    content = org.bouncycastle.asn1.cms.SignedData.getInstance(new DERSequence(v));

    // Extend ContentInfo
    v = new ASN1EncodableVector();
    v.add(contentInfo.getContentType());
    v.add(new DERTaggedObject(true, 0, content)); // <- updated
    contentInfo = org.bouncycastle.asn1.cms.ContentInfo.getInstance(new DERSequence(v));

    return contentInfo;
}

From source file:es.gob.afirma.envelopers.cms.CounterSignerEnveloped.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 Nodo ra&iacute; que contiene todos los signerInfos que se
 *                   deben firmar.//from  ww w  . ja  va  2s .co  m
 * @param parameters Par&aacute;metros necesarios para firmar un determinado
 *                   <code>SignerInfo</code> hoja.
 * @param cert Certificado de firma.
 * @param keyEntry Clave privada a usar para firmar.
 * @return El <code>SignerInfo</code> ra&iacute;z parcial con todos sus nodos
 *         Contrafirmados.
 * @throws java.security.NoSuchAlgorithmException Si el JRE no soporta alg&uacute;n algoritmo necesario
 * @throws java.io.IOException Cuando hay problemas de entrada / salida.
 * @throws CertificateException Caundo hay problemas relacionados con los certificados X.509.
 * @throws InvalidKeyException Cuando la clave proporcionada no es v&aacute;lida.
 * @throws SignatureException Cuando ocurren problando hay problemas de adecuaci&oacute;n de la clave. */
private SignerInfo getCounterUnsignedAtributes(final SignerInfo signerInfo,
        final P7ContentSignerParameters parameters, final X509Certificate cert, final PrivateKeyEntry keyEntry)
        throws NoSuchAlgorithmException, IOException, CertificateException, InvalidKeyException,
        SignatureException {
    final List<Object> attributes = new ArrayList<Object>();
    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 Object obj = eAtributesData.nextElement();
                    if (obj instanceof ASN1Sequence) {
                        final ASN1Sequence atrib = (ASN1Sequence) obj;
                        final SignerInfo si = SignerInfo.getInstance(atrib);
                        final SignerInfo obtained = getCounterUnsignedAtributes(si, parameters, cert, keyEntry);
                        signerInfosU.add(obtained);
                    } else {
                        attributes.add(obj);
                    }
                }
            } else {
                signerInfosU.add(data);
            }
        }
        // FIRMA DEL NODO ACTUAL
        counterSigner = unsignedAtributte(parameters, cert, signerInfo, keyEntry);
        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
            );

            // introducido este else pero es sospechoso que no estuviera
            // antes de este ultimo cambio.
        } 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(unsignedAtributte(parameters, cert, signerInfo, keyEntry));
                    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(), generateUnsignerInfoFromCounter(uAtrib) // unsignedAttr
                );
            }
        }
    } else {
        signerInfosU2.add(unsignedAtributte(parameters, cert, signerInfo, keyEntry));
        final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2));
        counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                signerInfo.getEncryptedDigest(), generateUnsignerInfoFromCounter(uAtrib) // unsignedAttr
        );

    }
    return counterSigner;
}

From source file:es.gob.afirma.envelopers.cms.CounterSignerEnveloped.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./*from w  w  w  .j ava2 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 cert
 *        Certificado de firma.
 * @param keyEntry
 *        Clave privada a usar para firmar
 * @return El SignerInfo ra&iacute;z parcial con todos sus nodos
 *         Contrafirmados.
 * @throws java.security.NoSuchAlgorithmException Si el JRE no soporta alg&uacute;n algoritmo necesario
 * @throws java.io.IOException Cuando hay problemas de entrada / salida.
 * @throws java.security.cert.CertificateException Cuando hay problemas relacionados con los certificados X.509.
 * @throws SignatureException Cuando ocurren problemas en la firma PKCS#1.
 * @throws InvalidKeyException Cuando hay problemas de adecuaci&oacute;n de la clave. */
private SignerInfo getCounterLeafUnsignedAtributes(final SignerInfo signerInfo,
        final P7ContentSignerParameters parameters, final X509Certificate cert, final PrivateKeyEntry keyEntry)
        throws NoSuchAlgorithmException, IOException, CertificateException, InvalidKeyException,
        SignatureException {

    final List<Object> attributes = new ArrayList<Object>();
    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 Object obj = eAtributesData.nextElement();
                    if (obj instanceof ASN1Sequence) {
                        signerInfosU.add(getCounterLeafUnsignedAtributes(SignerInfo.getInstance(obj),
                                parameters, cert, keyEntry));
                    } else {
                        attributes.add(obj);
                    }
                }
            } 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(unsignedAtributte(parameters, cert, signerInfo, keyEntry));
                    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(), generateUnsignerInfoFromCounter(uAtrib) // unsignedAttr
                );
            }

        }
    } else {
        signerInfosU2.add(unsignedAtributte(parameters, cert, signerInfo, keyEntry));
        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.envelopers.cms.CounterSignerEnveloped.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.
 * @param signerInfo// w  ww.j a v  a2s  .  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 cert
 *        Certificado de firma.
 * @param keyEntry
 *        Clave privada a usar para firmar
 * @return El SignerInfo ra&iacute;z parcial con todos sus nodos
 *         Contrafirmados.
 * @throws java.security.NoSuchAlgorithmException Si el JRE no soporta alg&uacute;n algoritmo necesario
 * @throws java.io.IOException Cuando hay problemas de entrada / salida.
 * @throws java.security.cert.CertificateException Cuando hay problemas relacionados con los certificados X.509.
 * @throws SignatureException Cuando ocurren problemas en la firma PKCS#1.
 * @throws InvalidKeyException Cuando hay problemas de adecuaci&oacute;n de la clave. */
private SignerInfo getCounterNodeUnsignedAtributes(final SignerInfo signerInfo,
        final P7ContentSignerParameters parameters, final X509Certificate cert, final PrivateKeyEntry keyEntry)
        throws NoSuchAlgorithmException, IOException, CertificateException, InvalidKeyException,
        SignatureException {

    final List<Object> attributes = new ArrayList<Object>();
    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 Object obj = eAtributesData.nextElement();
                    if (obj instanceof ASN1Sequence) {
                        signerInfosU.add(SignerInfo.getInstance(obj));
                    } else {
                        attributes.add(obj);
                    }
                }
            } else {
                signerInfosU.add(data);
            }
        }
        // FIRMA DEL NODO ACTUAL
        signerInfosU.add(unsignedAtributte(parameters, cert, signerInfo, keyEntry));

        // 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(unsignedAtributte(parameters, cert, signerInfo, keyEntry));
                    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(), generateUnsignerInfoFromCounter(uAtrib) // unsignedAttr
                );
            }

        }
    } else {
        signerInfosU2.add(unsignedAtributte(parameters, cert, signerInfo, keyEntry));
        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.envelopers.cms.CounterSignerEnveloped.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./*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 cert
 *        Certificado de firma.
 * @param keyEntry
 *        Clave privada a usar para firmar
 * @param node
 *        Nodo espec&iacute;fico a firmar.
 * @return El SignerInfo ra&iacute;z parcial con todos sus nodos
 *         Contrafirmados.
 * @throws java.security.NoSuchAlgorithmException Cuando el JRE no soporta alg&uacute;n algoritmo necesario.
 * @throws java.io.IOException Cuando hay problemas de entrada / salida.
 * @throws java.security.cert.CertificateException Cuando hay problemas relacionados con los certificados X.509.
 * @throws SignatureException Cuando ocurren problemas en la firma PKCS#1.
 * @throws InvalidKeyException Cuando hay problemas de adecuaci&oacute;n de la clave. */
private SignerInfo getCounterNodeUnsignedAtributes(final SignerInfo signerInfo,
        final P7ContentSignerParameters parameters, final X509Certificate cert, final PrivateKeyEntry keyEntry,
        final int node) throws NoSuchAlgorithmException, IOException, CertificateException, InvalidKeyException,
        SignatureException {

    final List<Object> attributes = new ArrayList<Object>();
    final ASN1EncodableVector signerInfosU = new ASN1EncodableVector();
    SignerInfo counterSigner = null;
    SignerInfo counterSigner2 = 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 Object obj = eAtributesData.nextElement();
                    if (obj instanceof ASN1Sequence) {
                        final ASN1Sequence atrib = (ASN1Sequence) obj;
                        final SignerInfo si = SignerInfo.getInstance(atrib);
                        this.actualIndex++;
                        if (this.actualIndex != node) {
                            if (this.actualIndex < node) {
                                counterSigner2 = getCounterNodeUnsignedAtributes(si, parameters, cert, keyEntry,
                                        node);
                                signerInfosU.add(counterSigner2);
                            } else {
                                signerInfosU.add(si);
                            }
                        } else {
                            final SignerInfo obtained = getCounterNodeUnsignedAtributes(si, parameters, cert,
                                    keyEntry);
                            signerInfosU.add(obtained);
                        }
                    } else {
                        attributes.add(obj);
                    }
                }
            } 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.

                } 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 {

        counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                signerInfo.getEncryptedDigest(), null // unsignedAttr
        );

    }
    return counterSigner;
}

From source file:es.gob.afirma.signers.cms.CounterSigner.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 Nodo ra&iacute; que contiene todos los signerInfos que se
 *                   deben firmar.//from   w w  w .  ja  v  a2  s .c  o  m
 * @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.
 * @return El SignerInfo ra&iacute;z parcial con todos sus nodos contrafirmados.
 * @throws java.security.NoSuchAlgorithmException Si el JRE no soporta alg&uacute;n algoritmo necesario
 * @throws java.io.IOException SI hay problemas en la lectura de datos
 * @throws java.security.cert.CertificateException Si hay problemas en el tratamiento de los certificados
 * @throws AOException EN caso de cualquier otro error */
private SignerInfo getCounterUnsignedAtributes(final SignerInfo signerInfo,
        final P7ContentSignerParameters parameters, final PrivateKey key,
        final java.security.cert.Certificate[] certChain)
        throws NoSuchAlgorithmException, IOException, CertificateException, AOException {

    final List<Object> attributes = new ArrayList<Object>();
    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 Object obj = eAtributesData.nextElement();
                    if (obj instanceof ASN1Sequence) {
                        final ASN1Sequence atrib = (ASN1Sequence) obj;
                        final SignerInfo si = SignerInfo.getInstance(atrib);

                        final SignerInfo obtained = getCounterUnsignedAtributes(si, parameters, key, certChain);
                        signerInfosU.add(obtained);
                    } else {
                        attributes.add(obj);
                    }
                }
            } else {
                signerInfosU.add(data);
            }
        }
        // FIRMA DEL NODO ACTUAL
        counterSigner = unsignedAtributte(parameters, signerInfo, key, certChain);
        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
            );

            // introducido este else pero es sospechoso que no estuviera
            // antes de este ultimo cambio.
        } 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(unsignedAtributte(parameters, signerInfo, key, certChain));
                    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(), generateUnsignerInfoFromCounter(uAtrib) // unsignedAttr
                );
            }
        }
    } else {
        signerInfosU2.add(unsignedAtributte(parameters, signerInfo, key, certChain));
        final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2));
        counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(),
                signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(),
                signerInfo.getEncryptedDigest(), generateUnsignerInfoFromCounter(uAtrib) // unsignedAttr
        );

    }
    return counterSigner;
}

From source file:es.gob.afirma.signers.cms.CounterSigner.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./*  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
 *                   <code>SignerInfo</code> hoja.
 * @param key Clave privada a usar para firmar.
 * @param certChain Cadena de certificados del firmante.
 * @return El SignerInfo ra&iacute;z parcial con todos sus nodos
 *         Contrafirmados.
 * @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.
 * @throws AOException Si ocurre cualquier otro problema durante el proceso. */
private SignerInfo getCounterLeafUnsignedAtributes(final SignerInfo signerInfo,
        final P7ContentSignerParameters parameters, final PrivateKey key,
        final java.security.cert.Certificate[] certChain)
        throws NoSuchAlgorithmException, IOException, CertificateException, AOException {

    final List<Object> attributes = new ArrayList<Object>();
    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 Object obj = eAtributesData.nextElement();
                    if (obj instanceof ASN1Sequence) {
                        final SignerInfo si = SignerInfo.getInstance(obj);
                        final SignerInfo obtained = getCounterLeafUnsignedAtributes(si, parameters, key,
                                certChain);
                        signerInfosU.add(obtained);
                    } else {
                        attributes.add(obj);
                    }
                }
            } 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(unsignedAtributte(parameters, signerInfo, key, certChain));
                    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(), generateUnsignerInfoFromCounter(uAtrib) // unsignedAttr
                );
            }

        }
    } else {
        signerInfosU2.add(unsignedAtributte(parameters, signerInfo, key, certChain));
        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.cms.CounterSigner.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.
 * @param signerInfo Nodo ra&iacute; que contiene todos los signerInfos que se
 *                   deben firmar./*from   w  w  w.j  a  v a2  s  . c o  m*/
 * @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.
 * @return El SignerInfo ra&iacute;z parcial con todos sus nodos
 *         Contrafirmados.
 * @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 getCounterNodeUnsignedAtributes(final SignerInfo signerInfo,
        final P7ContentSignerParameters parameters, final PrivateKey key,
        final java.security.cert.Certificate[] certChain)
        throws NoSuchAlgorithmException, IOException, CertificateException {

    final List<Object> attributes = new ArrayList<Object>();
    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 Object obj = eAtributesData.nextElement();
                    if (obj instanceof ASN1Sequence) {
                        signerInfosU.add(SignerInfo.getInstance(obj));
                    } else {
                        attributes.add(obj);
                    }
                }
            } else {
                signerInfosU.add(data);
            }
        }
        // FIRMA DEL NODO ACTUAL
        signerInfosU.add(unsignedAtributte(parameters, signerInfo, key, certChain));

        // 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(unsignedAtributte(parameters, signerInfo, key, certChain));
                    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(), generateUnsignerInfoFromCounter(uAtrib) // unsignedAttr
                );
            }

        }
    } else {
        signerInfosU2.add(unsignedAtributte(parameters, signerInfo, key, certChain));
        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.cms.CounterSigner.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.//w  ww  . ja v  a 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
 *                   <code>SignerInfo</code> hoja.
 * @param key Clave privada a usar para firmar.
 * @param certChain Cadena de certificados del firmante.
 * @param node Nodo espec&iacute;fico a firmar.
 * @return El <code>SignerInfo</code> ra&iacute;z parcial con todos sus nodos
 *         Contrafirmados.
 * @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.
 * @throws AOException Si ocurre cualquier otro problema durante el proceso. */
private SignerInfo getCounterNodeUnsignedAtributes(final SignerInfo signerInfo,
        final P7ContentSignerParameters parameters, final PrivateKey key,
        final java.security.cert.Certificate[] certChain, final int node)
        throws NoSuchAlgorithmException, IOException, CertificateException, AOException {

    final List<Object> attributes = new ArrayList<Object>();
    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 Object obj = eAtributesData.nextElement();
                    if (obj instanceof ASN1Sequence) {
                        final ASN1Sequence atrib = (ASN1Sequence) obj;
                        final SignerInfo si = SignerInfo.getInstance(atrib);
                        this.actualIndex++;
                        if (this.actualIndex != node) {
                            if (this.actualIndex < node) {
                                signerInfosU.add(
                                        getCounterNodeUnsignedAtributes(si, parameters, key, certChain, node));
                            } else {
                                signerInfosU.add(si);
                            }
                        } else {
                            signerInfosU.add(getCounterNodeUnsignedAtributes(si, parameters, key, certChain));
                        }
                    } else {
                        attributes.add(obj);
                    }
                }
            } 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.

                } 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 {

        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

/** Obtiene la contrafirma de los signerInfo de forma recursiva.<br>
 * @param signerInfo/*from  www .  jav  a  2s  .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;
}