Example usage for org.bouncycastle.asn1 BEROctetString BEROctetString

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

Introduction

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

Prototype

public BEROctetString(ASN1OctetString[] octs) 

Source Link

Document

Multiple ASN1OctetString data blocks are input, the result is constructed form.

Usage

From source file:es.gob.afirma.envelopers.cms.CMSAuthenticatedData.java

License:Open Source License

/** Genera una estructura PKCS#7 <code>AuthenticatedData</code>.
 * @param parameters Par&aacute;metros necesarios que contienen tanto la firma del
 *                    archivo a firmar como los datos del firmante.
 * @param signerCertChain Cadena de certificados del firmante.
 * @param autenticationAlgorithm Algoritmo para los codigos de autenticaci&oacute;n MAC
 * @param config Configuraci&oacute;n del algoritmo para firmar
 * @param certDest Certificado del destino al cual va dirigido la firma.
 * @param dataType Identifica el tipo del contenido a firmar.
 * @param applyTimestamp Si se aplica el Timestamp o no.
 * @param atrib Atributos firmados opcionales.
 * @param uatrib Atributos no autenticados firmados opcionales.
 * @param keySize Tama&ntilde;o de la clave AES.
 * @return Firma de tipo AuthenticatedData.
 * @throws IOException Si ocurre alg&uacute;n problema leyendo o escribiendo los
 *                     datos//from  w  w w  .j  a v  a  2  s . co m
 * @throws CertificateEncodingException Si se produce alguna excepci&oacute;n con los certificados de
 *                                      firma.
 * @throws NoSuchAlgorithmException Si no se encuentra un algoritmo v&aacute;lido.
 * @throws InvalidKeyException Cuando hay problemas de adecuaci&oacute;n de la clave.
 * @throws BadPaddingException Cuando hay problemas con un relleno de datos.
 * @throws IllegalBlockSizeException Cuando hay problemas internos con los tama&ntilde;os de bloque de cifrado.
 * @throws InvalidAlgorithmParameterException Si no se soporta un par&aacute;metro necesario para un algoritmo.
 * @throws NoSuchPaddingException Cuando no se soporta un tipo de relleno necesario. */
static byte[] genAuthenticatedData(final P7ContentSignerParameters parameters,
        final X509Certificate[] signerCertChain, final String autenticationAlgorithm,
        final AOCipherConfig config, final X509Certificate[] certDest, final String dataType,
        final boolean applyTimestamp, final Map<String, byte[]> atrib, final Map<String, byte[]> uatrib,
        final Integer keySize) throws IOException, CertificateEncodingException, NoSuchAlgorithmException,
        InvalidKeyException, NoSuchPaddingException, InvalidAlgorithmParameterException,
        IllegalBlockSizeException, BadPaddingException {

    final SecretKey cipherKey = Utils.initEnvelopedData(config, keySize);

    // Ya que el contenido puede ser grande, lo recuperamos solo una vez
    final byte[] content2 = parameters.getContent();

    // 1. ORIGINATORINFO
    // obtenemos la lista de certificados
    final ASN1Set certificates = Utils.fetchCertificatesList(signerCertChain);
    ASN1Set certrevlist = null;

    OriginatorInfo origInfo = null;
    if (signerCertChain.length != 0) {
        // introducimos una lista vacia en los CRL ya que no podemos
        // modificar el codigo de bc.
        final List<ASN1Encodable> crl = new ArrayList<ASN1Encodable>();
        certrevlist = SigUtils.createBerSetFromList(crl);
        origInfo = new OriginatorInfo(certificates, certrevlist);
    }

    // 2. RECIPIENTINFOS
    final Info infos = Utils.initVariables(content2, config, certDest, cipherKey);

    // 3. MACALGORITHM
    final AlgorithmIdentifier macAlgorithm = SigUtils.makeAlgId(config.getAlgorithm().getOid());

    // 4. DIGESTALGORITMIDENTIFIER
    final String digestAlgorithm = AOSignConstants.getDigestAlgorithmName(parameters.getSignatureAlgorithm());
    final AlgorithmIdentifier digAlgId = SigUtils.makeAlgId(AOAlgorithmID.getOID(digestAlgorithm));

    // 5. ENCAPSULATEDCONTENTINFO

    // si se introduce el contenido o no

    ContentInfo encInfo = null;
    final ASN1ObjectIdentifier contentTypeOID = new ASN1ObjectIdentifier(dataType);
    final ByteArrayOutputStream bOut = new ByteArrayOutputStream();
    final CMSProcessable msg = new CMSProcessableByteArray(content2);
    try {
        msg.write(bOut);
    } catch (final CMSException ex) {
        throw new IOException("Error en la escritura del procesable CMS: " + ex, ex); //$NON-NLS-1$
    }
    encInfo = new ContentInfo(contentTypeOID, new BEROctetString(bOut.toByteArray()));

    // 6. ATRIBUTOS FIRMADOS
    ASN1Set authAttr = null;
    authAttr = generateSignedAtt(signerCertChain[0], digestAlgorithm, content2, dataType, applyTimestamp,
            atrib);

    // 7. MAC
    final byte[] mac = Utils.genMac(autenticationAlgorithm, authAttr.getEncoded(ASN1Encoding.DER), cipherKey);

    // 8. ATRIBUTOS NO FIRMADOS.

    ASN1Set unAuthAttr = null;
    unAuthAttr = Utils.generateUnsignedAtt(uatrib);

    // construimos el Authenticated data y lo devolvemos
    return new ContentInfo(PKCSObjectIdentifiers.id_ct_authData, new AuthenticatedData(origInfo, // OriginatorInfo
            new DERSet(infos.getRecipientInfos()), // ASN1Set
            macAlgorithm, // macAlgorithm
            digAlgId, // AlgorithmIdentifier
            encInfo, // ContentInfo
            authAttr, // ASN1Set
            new DEROctetString(mac), // ASN1OctetString
            unAuthAttr // ASN1Set
    )).getEncoded(ASN1Encoding.DER);

}

From source file:es.gob.afirma.envelopers.cms.CMSCompressedData.java

License:Open Source License

/** Obtiene un tipo CompressedData.
 * @param data//from w  w w.  j  ava2  s .c  om
 *        Datos a comprimir
 * @return Tipo CompressedData.
 * @throws IOException En caso de error en la lectura o tratamiento de datos */
static byte[] genCompressedData(final byte[] data) throws IOException {

    // Algoritmo de compresion
    final AlgorithmIdentifier comAlgId = new AlgorithmIdentifier(new ASN1ObjectIdentifier(ZLIB));

    // Se comprimen los datos
    final byte[] compressed = BinaryUtils.compress(data);

    final ASN1OctetString comOcts = new BEROctetString(compressed);

    // Contenido comprimido
    final ContentInfo comContent = new ContentInfo(CMSObjectIdentifiers.data, comOcts);

    return new ContentInfo(CMSObjectIdentifiers.compressedData, new CompressedData(comAlgId, comContent))
            .getEncoded(ASN1Encoding.DER);

}

From source file:es.gob.afirma.signers.cades.CAdESTriPhaseSigner.java

License:Open Source License

/** Realiza una firma CAdES completa.
 * @param digestAlgorithmName Algoritmo de huella digital
 * @param content Datos a firmar (usar <code>null</code> si no se desean a&ntilde;adir a la firma)
 * @param signerCertificateChain Cadena de certificados del firmante
 * @param signature Firma PKCS#1 v1.5 de los atributos firmados
 * @param signedAttributes Atributos firmados (prefirma)
 * @return Firma CAdES completa/*from  w  ww .  java  2 s  .c  o m*/
 * @throws AOException Cuando se produce cualquier error durante el proceso.
 */
public static byte[] postSign(final String digestAlgorithmName, final byte[] content,
        final X509Certificate[] signerCertificateChain, final byte[] signature, final byte[] signedAttributes)
        throws AOException {

    if (signerCertificateChain == null || signerCertificateChain.length == 0) {
        throw new IllegalArgumentException("La cadena de certificados debe contener al menos una entrada"); //$NON-NLS-1$
    }

    final TBSCertificateStructure tbsCertificateStructure;
    try {
        tbsCertificateStructure = TBSCertificateStructure
                .getInstance(ASN1Primitive.fromByteArray(signerCertificateChain[0].getTBSCertificate()));
    } catch (final Exception e) {
        throw new AOException("No se ha podido crear la estructura de certificados", e); //$NON-NLS-1$
    }

    final SignerIdentifier signerIdentifier = new SignerIdentifier(
            new IssuerAndSerialNumber(X500Name.getInstance(tbsCertificateStructure.getIssuer()),
                    tbsCertificateStructure.getSerialNumber().getValue()));

    // Algoritmo de huella digital
    final AlgorithmIdentifier digestAlgorithmOID;
    try {
        digestAlgorithmOID = SigUtils.makeAlgId(AOAlgorithmID.getOID(digestAlgorithmName));
    } catch (final Exception e) {
        throw new AOException("Error obteniendo el OID en ASN.1 del algoritmo de huella digital", e); //$NON-NLS-1$
    }

    // EncryptionAlgorithm
    final AlgorithmIdentifier keyAlgorithmIdentifier;
    try {
        keyAlgorithmIdentifier = SigUtils.makeAlgId(AOAlgorithmID.getOID("RSA")); //$NON-NLS-1$
    } catch (final Exception e) {
        throw new AOException("Error al codificar el algoritmo de cifrado", e); //$NON-NLS-1$
    }

    // Firma PKCS#1 codificada
    final ASN1OctetString encodedPKCS1Signature = new DEROctetString(signature);

    // Atributos firmados
    final ASN1Set asn1SignedAttributes;
    try {
        asn1SignedAttributes = (ASN1Set) ASN1Primitive.fromByteArray(signedAttributes);
    } catch (final IOException e) {
        throw new AOException("Error en la inclusion de la recuperacion de los SignedAttibutes", e); //$NON-NLS-1$
    }

    // SignerInfo
    final ASN1EncodableVector signerInfo = new ASN1EncodableVector();
    signerInfo.add(new SignerInfo(signerIdentifier, digestAlgorithmOID, asn1SignedAttributes,
            keyAlgorithmIdentifier, encodedPKCS1Signature, null));

    // ContentInfo
    final ContentInfo contentInfo;
    if (content != null) {
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        final CMSProcessable msg = new CMSProcessableByteArray(content);
        try {
            msg.write(baos);
        } catch (final Exception e) {
            throw new AOException("Error en la escritura del contenido implicito en el ContentInfo", e); //$NON-NLS-1$
        }
        contentInfo = new ContentInfo(new ASN1ObjectIdentifier(PKCSObjectIdentifiers.data.getId()),
                new BEROctetString(baos.toByteArray()));
    } else {
        contentInfo = new ContentInfo(new ASN1ObjectIdentifier(PKCSObjectIdentifiers.data.getId()), null);
    }

    // Certificados
    final List<ASN1Encodable> ce = new ArrayList<ASN1Encodable>();
    for (final X509Certificate cert : signerCertificateChain) {
        try {
            ce.add(Certificate.getInstance(ASN1Primitive.fromByteArray(cert.getEncoded())));
        } catch (final Exception e) {
            Logger.getLogger("es.gob.afirma").severe( //$NON-NLS-1$
                    "Error insertando el certificado '" + AOUtil.getCN(cert) + "' en la cadena de confianza"); //$NON-NLS-1$ //$NON-NLS-2$
        }
    }
    final ASN1Set certificates = SigUtils.createBerSetFromList(ce);

    // Algoritmos de huella digital
    final ASN1EncodableVector digestAlgorithms = new ASN1EncodableVector();
    digestAlgorithms.add(digestAlgorithmOID);

    try {
        return new ContentInfo(PKCSObjectIdentifiers.signedData, new SignedData(new DERSet(digestAlgorithms),
                contentInfo, certificates, null, new DERSet(signerInfo))).getEncoded(ASN1Encoding.DER);
    } catch (final IOException e) {
        throw new AOException("Error creando el ContentInfo de CAdES: " + e, e); //$NON-NLS-1$
    }

}

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

License:Open Source License

/** Constructor de la clase. Se crea una cofirma a partir de los datos del
 * firmante, el archivo que se firma y del archivo que contiene las firmas.
 * @param parameters par&aacute;metros necesarios que contienen tanto la firma del
 *                   archivo a firmar como los datos del firmante.
 * @param sign Archivo que contiene las firmas.
 * @param omitContent Si se omite el contenido o no, es decir,si se hace de forma
 *                    Expl&iacute;cita o Impl&iacute;cita.
 * @param dataType Identifica el tipo del contenido a firmar.
 * @param key Clave privada del firmante.
 * @param certChain Cadena de certificados del firmante
 * @param atrib Atributos firmados opcionales.
 * @param uatrib Atributos no autenticados firmados opcionales.
 * @param messageDigest Hash a aplicar en la firma.
 * @return El archivo de firmas con la nueva firma.
 * @throws java.io.IOException Si ocurre alg&uacute;n problema leyendo o escribiendo los datos
 * @throws java.security.NoSuchAlgorithmException
 *         Si no se soporta alguno de los algoritmos de firma o huella digital
 * @throws java.security.cert.CertificateException Si se produce alguna excepci&oacute;n con
 *                                                 los certificados de firma. */
byte[] coSigner(final P7ContentSignerParameters parameters, final byte[] sign, final boolean omitContent,
        final String dataType, final PrivateKey key, final java.security.cert.Certificate[] certChain,
        final Map<String, byte[]> atrib, final Map<String, byte[]> uatrib, final byte[] messageDigest)
        throws IOException, NoSuchAlgorithmException, CertificateException {

    // LEEMOS EL FICHERO QUE NOS INTRODUCEN
    final ASN1InputStream is = new ASN1InputStream(sign);
    final ASN1Sequence dsq = (ASN1Sequence) is.readObject();
    is.close();//  www .ja  v  a 2 s  . co m
    final Enumeration<?> e = dsq.getObjects();
    // Elementos que contienen los elementos OID SignedData
    e.nextElement();
    // Contenido de SignedData
    final ASN1TaggedObject doj = (ASN1TaggedObject) e.nextElement();
    final ASN1Sequence contentSignedData = (ASN1Sequence) doj.getObject();// contenido
    // del
    // SignedData

    final SignedData sd = SignedData.getInstance(contentSignedData);

    // 3. CONTENTINFO
    // si se introduce el contenido o no
    ContentInfo encInfo = null;
    final ASN1ObjectIdentifier contentTypeOID = new ASN1ObjectIdentifier(dataType);

    // Ya que el contenido puede ser grande, lo recuperamos solo una vez
    byte[] content2 = null;

    if (!omitContent) {
        final ByteArrayOutputStream bOut = new ByteArrayOutputStream();
        content2 = parameters.getContent();
        final CMSProcessable msg = new CMSProcessableByteArray(content2);
        try {
            msg.write(bOut);
        } catch (final Exception ex) {
            throw new IOException("Error en la escritura del procesable CMS: " + ex, ex); //$NON-NLS-1$
        }
        encInfo = new ContentInfo(contentTypeOID, new BEROctetString(bOut.toByteArray()));
    } else {
        encInfo = new ContentInfo(contentTypeOID, null);
    }

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

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

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

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

    // buscamos que timo de algoritmo es y lo codificamos con su OID

    final String signatureAlgorithm = parameters.getSignatureAlgorithm();
    final String digestAlgorithm = AOSignConstants.getDigestAlgorithmName(signatureAlgorithm);
    final AlgorithmIdentifier digAlgId = SigUtils.makeAlgId(AOAlgorithmID.getOID(digestAlgorithm));

    // Identificador del firmante ISSUER AND SERIAL-NUMBER
    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);

    // // ATRIBUTOS

    // atributos firmados
    ASN1Set signedAttr = null;
    if (messageDigest == null) {
        signedAttr = generateSignerInfo(digestAlgorithm, content2 != null ? content2 : parameters.getContent(),
                dataType, atrib);
    } else {
        signedAttr = generateSignerInfoFromHash((X509Certificate) certChain[0], messageDigest, dataType, atrib);
    }

    // atributos no firmados.
    final ASN1Set unSignedAttr = generateUnsignerInfo(uatrib);

    // // FIN ATRIBUTOS

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

    // 5. 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++) {
        final SignerInfo si = SignerInfo.getInstance(signerInfosSd.getObjectAt(i));
        signerInfos.add(si);
    }

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

    // Creamos los signerInfos del SignedData
    signerInfos.add(new SignerInfo(identifier, digAlgId, signedAttr, encAlgId, sign2, unSignedAttr// null //unsignedAttr
    ));

    // construimos el Signed Data y lo devolvemos
    return new ContentInfo(PKCSObjectIdentifiers.signedData,
            new SignedData(sd.getDigestAlgorithms(), encInfo, certificates, null, new DERSet(signerInfos)// unsignedAttr
            )).getEncoded(ASN1Encoding.DER);

}

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

License:Open Source License

/** Genera una firma digital usando el sistema conocido como
 * <code>SignedData</code> y que podr&aacute; ser con el contenido del fichero codificado
 * o s&oacute;lo como referencia del fichero.
 * @param parameters Par&aacute;metros necesarios para obtener los datos de
 *                   <code>SignedData</code>.
 * @param omitContent Par&aacute;metro que indica si en la firma va el contenido del
 *                    fichero o s&oacute;lo va de forma referenciada.
 * @param applyTimestamp Si se aplica la marca de tiempo o no.
 * @param dataType Identifica el tipo del contenido a firmar.
 * @param key Clave privada del firmante.
 * @param certChain Cadena de certificados del firmante.
 * @param atrib Atributos firmados opcionales.
 * @param uatrib Atributos no autenticados firmados opcionales.
 * @param messageDigest Huella digital a aplicar en la firma.
 * @return La firma generada codificada.
 * @throws java.security.NoSuchAlgorithmException Si no se soporta alguno de los algoritmos de firma o huella
 *                                                digital
 * @throws java.security.cert.CertificateException Si se produce alguna excepci&oacute;n con los certificados de
 *                                                 firma.
 * @throws java.io.IOException Cuando ocurre un error durante el proceso de descifrado
 *                             (formato o clave incorrecto,...)
 * @throws AOException Cuando ocurre un error durante el proceso de descifrado
 *                     (formato o clave incorrecto,...) */
byte[] generateSignedData(final P7ContentSignerParameters parameters, final boolean omitContent,
        final boolean applyTimestamp, final String dataType, final PrivateKey key,
        final java.security.cert.Certificate[] certChain, final Map<String, byte[]> atrib,
        final Map<String, byte[]> uatrib, final byte[] messageDigest)
        throws NoSuchAlgorithmException, CertificateException, IOException, AOException {

    if (parameters == null) {
        throw new IllegalArgumentException("Los parametros no pueden ser nulos"); //$NON-NLS-1$
    }/*from   w  w w . j  ava 2  s  .c o m*/

    // 1. VERSION
    // la version se mete en el constructor del signedData y es 1

    // 2. DIGESTALGORITM
    // buscamos que timo de algoritmo es y lo codificamos con su OID

    final ASN1EncodableVector digestAlgs = new ASN1EncodableVector();
    final String signatureAlgorithm = parameters.getSignatureAlgorithm();
    final String digestAlgorithm = AOSignConstants.getDigestAlgorithmName(signatureAlgorithm);
    final AlgorithmIdentifier digAlgId = SigUtils.makeAlgId(AOAlgorithmID.getOID(digestAlgorithm));

    digestAlgs.add(digAlgId);

    // 3. CONTENTINFO
    // si se introduce el contenido o no

    ContentInfo encInfo;
    final ASN1ObjectIdentifier contentTypeOID = new ASN1ObjectIdentifier(dataType);

    // Ya que el contenido puede ser grande, lo recuperamos solo una vez
    byte[] content2 = null;

    if (!omitContent) {
        final ByteArrayOutputStream bOut = new ByteArrayOutputStream();
        content2 = parameters.getContent();
        final CMSProcessable msg = new CMSProcessableByteArray(content2);
        try {
            msg.write(bOut);
        } catch (final Exception ex) {
            throw new IOException("Error en la escritura del procesable CMS: " + ex, ex); //$NON-NLS-1$
        }
        encInfo = new ContentInfo(contentTypeOID, new BEROctetString(bOut.toByteArray()));
    } else {
        encInfo = new ContentInfo(contentTypeOID, null);
    }

    // 4. CERTIFICADOS
    // obtenemos la lista de certificados

    ASN1Set certificates = null;

    if (certChain.length != 0) {
        final List<ASN1Encodable> ce = new ArrayList<ASN1Encodable>();
        for (final java.security.cert.Certificate element : certChain) {
            ce.add(Certificate.getInstance(ASN1Primitive.fromByteArray(element.getEncoded())));
        }
        certificates = SigUtils.createBerSetFromList(ce);
    }

    final ASN1Set certrevlist = null;

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

    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);

    // // ATRIBUTOS

    // ATRIBUTOS FIRMADOS
    final ASN1Set signedAttr = generateSignedInfo(digestAlgorithm,
            content2 != null ? content2 : parameters.getContent(), dataType, applyTimestamp, atrib,
            messageDigest);

    // ATRIBUTOS NO FIRMADOS.

    final ASN1Set unSignedAttr = generateUnsignedInfo(uatrib);

    // // FIN ATRIBUTOS

    // digEncryptionAlgorithm
    final AlgorithmIdentifier encAlgId;
    try {
        encAlgId = SigUtils.makeAlgId(AOAlgorithmID.getOID("RSA")); //$NON-NLS-1$
    } catch (final Exception e) {
        throw new IOException("Error de codificacion: " + e, e); //$NON-NLS-1$
    }

    final ASN1OctetString sign2 = firma(signatureAlgorithm, key);
    signerInfos.add(new SignerInfo(identifier, digAlgId, signedAttr, encAlgId, sign2, unSignedAttr// null //unsignedAttr
    ));

    // construimos el Signed Data y lo devolvemos
    return new ContentInfo(PKCSObjectIdentifiers.signedData,
            new SignedData(new DERSet(digestAlgs), encInfo, certificates, certrevlist, new DERSet(signerInfos)))
                    .getEncoded(ASN1Encoding.DER);

}

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

License:Open Source License

/** Se crea una cofirma a partir de los datos del firmante, el archivo
 * que se firma y el archivo que contiene las firmas.
 * @param parameters/*w  ww  .j  av a  2  s  .c o m*/
 *        Par&aacute;metros necesarios que contienen tanto la firma del
 *        archivo a firmar como los datos del firmante.
 * @param signature
 *        Archivo que contiene las firmas.
 * @param omitContent
 *        Si se omite el contenido o no, es decir,si se hace de forma
 *        Expl&iacute;cita o Impl&iacute;cita.
 * @param policy Pol&iacute;tica de firma
 * @param signingCertificateV2
 *        <code>true</code> si se desea usar la versi&oacute;n 2 del
 *        atributo <i>Signing Certificate</i> <code>false</code> para
 *        usar la versi&oacute;n 1
 * @param key Clave privada usada para firmar.
 * @param certChain Cadena de certificados del firmante.
 * @param messageDigest
 *        Hash espec&iacute;fico para una firma.
 * @param contentType Tipo de contenido definido por su OID.
 * @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 archivo de firmas con la nueva firma.
 * @throws IOException Si ocurre alg&uacute;n problema leyendo o escribiendo los datos
 * @throws NoSuchAlgorithmException Si no se soporta alguno de los algoritmos de firma o huella
 *                                  digital
 * @throws CertificateException Si se produce alguna excepci&oacute;n con los certificados de
 *                              firma.*/
byte[] coSigner(final P7ContentSignerParameters parameters, final byte[] signature, final boolean omitContent,
        final AdESPolicy policy, final boolean signingCertificateV2, final PrivateKey key,
        final java.security.cert.Certificate[] certChain, final byte[] messageDigest, final String contentType,
        final String contentDescription, final List<CommitmentTypeIndicationBean> ctis,
        final CAdESSignerMetadata csm) throws IOException, NoSuchAlgorithmException, CertificateException {
    // LEEMOS EL FICHERO QUE NOS INTRODUCEN
    final ASN1InputStream is = new ASN1InputStream(signature);
    final ASN1Sequence dsq = (ASN1Sequence) is.readObject();
    is.close();
    final Enumeration<?> e = dsq.getObjects();
    // Elementos que contienen los elementos OID SignedData
    e.nextElement();
    // Contenido de SignedData
    final ASN1TaggedObject doj = (ASN1TaggedObject) e.nextElement();
    final ASN1Sequence contentSignedData = (ASN1Sequence) doj.getObject(); // contenido del SignedData

    final SignedData sd = SignedData.getInstance(contentSignedData);

    // 3. CONTENTINFO
    // si se introduce el contenido o no
    ContentInfo encInfo = null;
    final ASN1ObjectIdentifier contentTypeOID = new ASN1ObjectIdentifier(PKCSObjectIdentifiers.data.getId());

    // Ya que el contenido puede ser grande, lo recuperamos solo una vez porque se clona
    // al recuperarlo
    byte[] content2 = null;

    if (!omitContent) {
        final ByteArrayOutputStream bOut = new ByteArrayOutputStream();
        content2 = parameters.getContent();
        final CMSProcessable msg = new CMSProcessableByteArray(content2);
        try {
            msg.write(bOut);
        } catch (final CMSException ex) {
            throw new IOException("Error en la escritura del procesable CMS: " + ex, ex); //$NON-NLS-1$
        }
        encInfo = new ContentInfo(contentTypeOID, new BEROctetString(bOut.toByteArray()));
    } else {
        encInfo = new ContentInfo(contentTypeOID, null);
    }

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

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

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

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

    // buscamos que tipo de algoritmo es y lo codificamos con su OID
    final String signatureAlgorithm = parameters.getSignatureAlgorithm();
    final String digestAlgorithm = AOSignConstants.getDigestAlgorithmName(signatureAlgorithm);
    final AlgorithmIdentifier digAlgId = SigUtils
            .makeAlgId(AOAlgorithmID.getOID(AOSignConstants.getDigestAlgorithmName(signatureAlgorithm)));

    // Identificador del firmante ISSUER AND SERIAL-NUMBER
    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);

    // // ATRIBUTOS

    ASN1Set signedAttr = null;
    if (messageDigest == null) {
        final ASN1EncodableVector contextExpecific = CAdESUtils.generateSignerInfo(certChain[0],
                digestAlgorithm, content2 != null ? content2 : parameters.getContent(), policy,
                signingCertificateV2, null, new Date(), false, contentType, contentDescription, ctis, csm);
        this.signedAttr2 = SigUtils.getAttributeSet(new AttributeTable(contextExpecific));
        signedAttr = SigUtils.getAttributeSet(new AttributeTable(contextExpecific));
    } else {
        final ASN1EncodableVector contextExpecific = CAdESUtils.generateSignerInfo(certChain[0],
                digestAlgorithm, null, policy, signingCertificateV2, messageDigest, new Date(), false,
                contentType, contentDescription, ctis, csm);
        this.signedAttr2 = SigUtils.getAttributeSet(new AttributeTable(contextExpecific));
        signedAttr = SigUtils.getAttributeSet(new AttributeTable(contextExpecific));
    }

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

    // 5. 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)));
    }

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

    // Creamos los signerInfos del SignedData
    signerInfos.add(new SignerInfo(identifier, digAlgId, signedAttr, encAlgId, sign2, null));

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

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

License:Open Source License

private static ContentInfo getContentInfoFromContent(final byte[] content) throws IOException {
    // Ya que el contenido puede ser grande, lo recuperamos solo una vez
    final ASN1ObjectIdentifier contentTypeOID = new ASN1ObjectIdentifier(PKCSObjectIdentifiers.data.getId());
    // si se introduce el contenido o no
    if (content != null) {
        final ByteArrayOutputStream bOut = new ByteArrayOutputStream();
        final CMSProcessable msg = new CMSProcessableByteArray(content);
        try {// ww  w  . j a  v  a  2 s  .co m
            msg.write(bOut);
        } catch (final CMSException ex) {
            throw new IOException("Error en la escritura del procesable CMS: " + ex, ex); //$NON-NLS-1$
        }
        return new ContentInfo(contentTypeOID, new BEROctetString(bOut.toByteArray()));
    }
    return new ContentInfo(contentTypeOID, null);
}

From source file:net.jsign.asn1.authenticode.AuthenticodeTimeStampRequest.java

License:Apache License

public AuthenticodeTimeStampRequest(byte[] digest) {
    contenInfo = new ContentInfo(PKCSObjectIdentifiers.data, new BEROctetString(digest));
}