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

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

Introduction

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

Prototype

public SignerInfo(SignerIdentifier sid, AlgorithmIdentifier digAlgorithm, Attributes authenticatedAttributes,
        AlgorithmIdentifier digEncryptionAlgorithm, ASN1OctetString encryptedDigest,
        Attributes unauthenticatedAttributes) 

Source Link

Usage

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

License:Open Source License

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

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

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

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

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

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

License:Open Source License

/** M&eacute;todo utilizado por la firma de un nodo del &eacute;rbol para
 * obtener la contrafirma de los signerInfo buscando el nodo de forma
 * recursiva.<br>//from   ww w . j ava 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;
}

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

License:Open Source License

/** M&eacute;todo que 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 www  . j a  v  a  2s .co  m
 * @param parameters Par&aacute;metros necesarios para firmar un determinado
 *                   <i>SignerInfo</i> hoja.
 * @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 ctis Indicaciones sobre los tipos de compromisos adquiridos con la firma.
 * @param csm Metadatos sobre el firmante.
 * @return El signerInfo contrafirmado.
 * @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 generateSignerInfo(final P7ContentSignerParameters parameters, final SignerInfo si,
        final PrivateKey key, final java.security.cert.Certificate[] certChain, final String contentDescription,
        final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm)
        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);

    final ASN1EncodableVector contextExcepcific = CAdESUtils.generateSignerInfo(certChain[0], digestAlgorithm,
            si.getEncryptedDigest().getOctets(), getGlobalPolicy(), isGlobalSigningCertificateV2(), null,
            new Date(), false, null, // En contrafirmas no se pone el ContentType
            contentDescription, ctis, csm);
    this.signedAttr2 = SigUtils.getAttributeSet(new AttributeTable(contextExcepcific));

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

    // 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, certChain);
    } catch (final AOException ex) {
        throw new IOException("Error al realizar la firma electronica: " + ex, ex); //$NON-NLS-1$
    }

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

}

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

License:Open Source License

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

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

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

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

    // CERTIFICADOS
    // Obtenemos la lista de certificados

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

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

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

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

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

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

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

    final ContentInfo encInfo = getContentInfoFromContent(content);

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

}

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

License:Open Source License

/** 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.</br>
 * @param parameters Par&aacute;metros necesarios para firmar un determinado SignerInfo hoja.
 * @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 contentType Tipo de contenido definido por su OID.
 * @param contentDescription Descripci&oacute;n textual del tipo de contenido firmado.
 * @return SignerInfo contrafirmado.//www  .  j  a  v a2s .c  om
 * @throws java.security.NoSuchAlgorithmException
 * @throws java.io.IOException
 * @throws java.security.cert.CertificateException */
private SignerInfo generateSignerInfo(final String signatureAlgorithm, final SignerInfo si,
        final java.security.cert.Certificate[] certChain, final String contentType,
        final String contentDescription, final AdESPolicy policy, final boolean signingCertificateV2)
        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((X509Certificate) certChain[0],
            digestAlgorithm, si.getEncryptedDigest().getOctets(), policy, signingCertificateV2, null,
            new Date(), false, contentType, contentDescription);

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

    // Anadimos los SignedAttributes a la lista en la posicion adecuada
    this.signedDatas.add(this.counterIndex, signedAttr.getEncoded(ASN1Encoding.DER));
    // Obtenemos el sustituto del PKCS#1, relleno con el numero de contrafirma
    final ASN1OctetString sign2 = new DEROctetString(firma());
    // Incrementamos el indice de contrafirmas
    this.counterIndex = this.counterIndex + 1;

    if (this.counterIndex > 9) {
        throw new UnsupportedOperationException("No se soportan mas de 10 contrafirmas en una misma firma"); //$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:it.trento.comune.j4sign.cms.ExternalSignatureSignerInfoGenerator.java

License:Open Source License

/**
 * Generates the SignerInfo CMS structure information for a single signer.
 * This method has to be called after setting {@link #cert}
 * {@link #signedBytes}.//from www  .j a  va  2 s  .c  om
 * 
 * @return the <code>org.bouncycastle.asn1.cms.SignerInfo</code> object for
 *         a signer.
 * @throws CertificateEncodingException
 * @throws IOException
 */
SignerInfo generate() throws CertificateEncodingException, IOException {

    AlgorithmIdentifier digAlgId = null;
    AlgorithmIdentifier encAlgId = null;

    digAlgId = new AlgorithmIdentifier(new DERObjectIdentifier(this.getDigestAlgOID()), new DERNull());

    if (this.getEncryptionAlgOID().equals(CMSSignedDataGenerator.ENCRYPTION_DSA)) {
        encAlgId = new AlgorithmIdentifier(new DERObjectIdentifier(this.getEncryptionAlgOID()));
    } else {
        encAlgId = new AlgorithmIdentifier(new DERObjectIdentifier(this.getEncryptionAlgOID()), new DERNull());
    }

    ASN1OctetString encDigest = new DEROctetString(this.signedBytes);

    X509Certificate cert = this.getCertificate();
    ByteArrayInputStream bIn = new ByteArrayInputStream(cert.getTBSCertificate());
    ASN1InputStream aIn = new ASN1InputStream(bIn);
    TBSCertificateStructure tbs = TBSCertificateStructure.getInstance(aIn.readObject());
    IssuerAndSerialNumber encSid = new IssuerAndSerialNumber(tbs.getIssuer(), cert.getSerialNumber());

    return new SignerInfo(new SignerIdentifier(encSid), digAlgId, signedAttr, encAlgId, encDigest,
            unsignedAttr);
}

From source file:org.jmrtd.lds.SignedDataUtil.java

License:Open Source License

public static SignerInfo createSignerInfo(String digestAlgorithm, String digestEncryptionAlgorithm,
        String contentTypeOID, ContentInfo contentInfo, byte[] encryptedDigest,
        X509Certificate docSigningCertificate) throws NoSuchAlgorithmException {
    /* Get the issuer name (CN, O, OU, C) from the cert and put it in a SignerIdentifier struct. */
    X500Principal docSignerPrincipal = ((X509Certificate) docSigningCertificate).getIssuerX500Principal();
    X500Name docSignerName = new X500Name(docSignerPrincipal.getName(X500Principal.RFC2253));
    BigInteger serial = ((X509Certificate) docSigningCertificate).getSerialNumber();
    SignerIdentifier sid = new SignerIdentifier(new IssuerAndSerialNumber(docSignerName, serial));

    AlgorithmIdentifier digestAlgorithmObject = new AlgorithmIdentifier(
            new ASN1ObjectIdentifier(SignedDataUtil.lookupOIDByMnemonic(digestAlgorithm)));
    AlgorithmIdentifier digestEncryptionAlgorithmObject = new AlgorithmIdentifier(
            new ASN1ObjectIdentifier(SignedDataUtil.lookupOIDByMnemonic(digestEncryptionAlgorithm)));

    ASN1Set authenticatedAttributes = createAuthenticatedAttributes(digestAlgorithm, contentTypeOID,
            contentInfo); // struct containing the hash of content
    ASN1OctetString encryptedDigestObject = new DEROctetString(encryptedDigest); // this is the signature
    ASN1Set unAuthenticatedAttributes = null; // should be empty set?
    return new SignerInfo(sid, digestAlgorithmObject, authenticatedAttributes, digestEncryptionAlgorithmObject,
            encryptedDigestObject, unAuthenticatedAttributes);
}

From source file:org.signserver.module.mrtdsodsigner.jmrtd.SODFile.java

License:Open Source License

private static SignerInfo createSignerInfo(String digestAlgorithm, String digestEncryptionAlgorithm,
        ASN1Encodable digestEncryptionAlgorithmParams, byte[] content, byte[] encryptedDigest,
        X509Certificate docSigningCertificate) throws NoSuchAlgorithmException, CertificateEncodingException {
    /* Get the issuer name (CN, O, OU, C) from the cert and put it in a SignerIdentifier struct. */
    BigInteger serial = ((X509Certificate) docSigningCertificate).getSerialNumber();
    IssuerAndSerialNumber iasn = new IssuerAndSerialNumber(JcaX500NameUtil.getIssuer(docSigningCertificate),
            serial);//from  www.j  a  va  2s  .  c o  m
    SignerIdentifier sid = new SignerIdentifier(iasn);
    AlgorithmIdentifier digestAlgorithmObject = new AlgorithmIdentifier(lookupOIDByMnemonic(digestAlgorithm));
    final AlgorithmIdentifier digestEncryptionAlgorithmObject;
    if (digestEncryptionAlgorithmParams == null) {
        digestEncryptionAlgorithmObject = new AlgorithmIdentifier(
                lookupOIDByMnemonic(digestEncryptionAlgorithm));
    } else {
        digestEncryptionAlgorithmObject = new AlgorithmIdentifier(
                lookupOIDByMnemonic(digestEncryptionAlgorithm), digestEncryptionAlgorithmParams);
    }

    ASN1Set authenticatedAttributes = createAuthenticatedAttributes(digestAlgorithm, content); // struct containing the hash of content
    ASN1OctetString encryptedDigestObject = new DEROctetString(encryptedDigest); // this is the signature
    ASN1Set unAuthenticatedAttributes = null; // should be empty set?
    return new SignerInfo(sid, digestAlgorithmObject, authenticatedAttributes, digestEncryptionAlgorithmObject,
            encryptedDigestObject, unAuthenticatedAttributes);
}

From source file:passwdmanager.hig.no.lds.DG_SOD.java

private static SignerInfo createSignerInfo(String digestAlgorithm, String digestEncryptionAlgorithm,
        byte[] content, byte[] encryptedDigest, X509Certificate docSigningCertificate)
        throws NoSuchAlgorithmException {
    /*/* w  ww .j a  v a2 s  . com*/
     * Get the issuer name (CN, O, OU, C) from the cert and put it in a
     * SignerIdentifier struct.
     */
    X500Principal docSignerPrincipal = ((X509Certificate) docSigningCertificate).getIssuerX500Principal();
    X509Name docSignerName = new X509Name(true, docSignerPrincipal.getName()); // RFC 2253 format
    BigInteger serial = ((X509Certificate) docSigningCertificate).getSerialNumber();
    SignerIdentifier sid = new SignerIdentifier(new IssuerAndSerialNumber(docSignerName, serial));

    AlgorithmIdentifier digestAlgorithmObject = new AlgorithmIdentifier(lookupOIDByMnemonic(digestAlgorithm),
            new DERNull());
    AlgorithmIdentifier digestEncryptionAlgorithmObject = new AlgorithmIdentifier(
            lookupOIDByMnemonic(digestEncryptionAlgorithm), new DERNull());

    ASN1Set authenticatedAttributes = createAuthenticatedAttributes(digestAlgorithm, content); // struct containing the hash of
    // content
    ASN1OctetString encryptedDigestObject = new DEROctetString(encryptedDigest); // this is the signature
    ASN1Set unAuthenticatedAttributes = null; // should be empty set?
    return new SignerInfo(sid, digestAlgorithmObject, authenticatedAttributes, digestEncryptionAlgorithmObject,
            encryptedDigestObject, unAuthenticatedAttributes);
}