Example usage for org.bouncycastle.asn1 DEROctetString getOctets

List of usage examples for org.bouncycastle.asn1 DEROctetString getOctets

Introduction

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

Prototype

public byte[] getOctets() 

Source Link

Document

Return the content of the OCTET STRING as a byte array.

Usage

From source file:ec.rubrica.cert.CertUtils.java

License:Open Source License

public static String getExtensionValue(X509Certificate certificate, String oid) throws IOException {
    String decoded = null;//w w  w .  j  a  v a2s.  c  o  m
    byte[] extensionValue = certificate.getExtensionValue(oid);

    if (extensionValue != null) {
        ASN1Primitive derObject = toDERObject(extensionValue);
        if (derObject instanceof DEROctetString) {
            DEROctetString derOctetString = (DEROctetString) derObject;
            derObject = toDERObject(derOctetString.getOctets());
            if (derObject instanceof ASN1String) {
                ASN1String s = (ASN1String) derObject;
                decoded = s.getString();
            }
        }
    }
    return decoded;
}

From source file:ee.ria.xroad.common.util.CertUtils.java

License:Open Source License

/**
 * @param subject certificate from which to get the OCSP responder URI
 * @return OCSP responder URI from given certificate.
 * @throws IOException if an I/O error occurred
 */// w  w w  .j  a v a 2s.c  o m
public static String getOcspResponderUriFromCert(X509Certificate subject) throws IOException {
    final byte[] extensionValue = subject.getExtensionValue(Extension.authorityInfoAccess.toString());

    if (extensionValue != null) {
        ASN1Primitive derObject = toDERObject(extensionValue);

        if (derObject instanceof DEROctetString) {
            DEROctetString derOctetString = (DEROctetString) derObject;
            derObject = toDERObject(derOctetString.getOctets());

            AuthorityInformationAccess authorityInformationAccess = AuthorityInformationAccess
                    .getInstance(derObject);
            AccessDescription[] descriptions = authorityInformationAccess.getAccessDescriptions();

            for (AccessDescription desc : descriptions) {
                if (desc.getAccessMethod().equals(AccessDescription.id_ad_ocsp)) {
                    GeneralName generalName = desc.getAccessLocation();

                    return generalName.getName().toString();
                }
            }
        }
    }

    return null;
}

From source file:ee.sk.digidoc.factory.BouncyCastleNotaryFactory.java

License:Open Source License

/**
 * Finds notary cert by responder-id field in basic ocsp response
 * @param basResp basic ocsp response/*ww w .  j  a v  a 2 s. co  m*/
 * @return notary cert or null if not found
 */
private X509Certificate findNotaryCertByResponderId(BasicOCSPResp basResp) {
    if (basResp != null) {
        ResponderID respid = basResp.getResponderId().toASN1Object();
        Object o = ((DERTaggedObject) respid.toASN1Object()).getObject();
        System.out.println("resp-id-test: " + o.toString());
        if (o instanceof ASN1Sequence) {
            X509Name name = new X509Name((ASN1Sequence) o);
            String dn = name.toString();
            String cn = SignedDoc.getCommonName(dn);
            System.out.println("Find notary for: " + dn + " -> " + cn);
            return getNotaryCert(cn, null);
        } else if (o instanceof DEROctetString) {
            DEROctetString dHash = (DEROctetString) o;
            byte[] cHash = null;
            byte[] cHash2 = null;
            byte[] cHash3 = null;
            try {
                cHash = dHash.getOctets();
                cHash2 = dHash.getDEREncoded();
                cHash3 = dHash.getEncoded();
            } catch (Exception ex) {
                m_logger.error("Error: " + ex);
            }
            System.out.println("Find notary for octects: " + Base64Util.encode(cHash) + " len: " + cHash.length
                    + " hex: " + SignedDoc.bin2hex(cHash) + " der: " + Base64Util.encode(cHash2) + " len: "
                    + cHash2.length + " enc: " + Base64Util.encode(cHash3) + " len: " + cHash3.length);
            return findNotaryCertByKeyHash(cHash);
        } else {
            return null;
        }
    } else
        return null;
}

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

License:Open Source License

/** Método que extrae el contenido de un tipo CompressedData.
 * @param data//from   w  w w  .j  av a2s .c  o m
 *        El tipo CompressedData.
 * @return El contenido del envoltorio.
 * @throws IOException
 *         Se produce cuando hay un error de lectura de datos. */
static byte[] getContentCompressedData(final byte[] data) throws IOException {
    final ASN1Sequence contentEnvelopedData = Utils.fetchWrappedData(data);
    final CompressedData compressed = CompressedData.getInstance(contentEnvelopedData);
    final DEROctetString dos = (DEROctetString) compressed.getEncapContentInfo().getContent();

    return BinaryUtils.uncompress(dos.getOctets());

}

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

License:Open Source License

/** Constructor de la clase. Se crea una cofirma a partir de los datos del
 * firmante y el archivo que se firma./*  ww  w.  j  a va2  s .c o m*/
 * @param signatureAlgorithm
 *        Algoritmo para la firma
 * @param signerCertificateChain
 *        Cadena de certificados para la construccion de los parametros
 *        de firma.
 * @param sign
 *        Archivo que contiene las firmas.
 * @param dataType
 *        Identifica el tipo del contenido a firmar.
 * @param keyEntry
 *        Clave privada del firmante.
 * @param atrib
 *        Atributos firmados adicionales.
 * @param uatrib
 *        Atributos no firmados adicionales.
 * @param messageDigest
 *        Hash a aplicar en la firma.
 * @return El archivo de firmas con la nueva firma.
 * @throws java.io.IOException
 *         Si ocurre algú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ón con los certificados de
 *         firma. */
byte[] coSigner(final String signatureAlgorithm, final X509Certificate[] signerCertificateChain,
        final byte[] sign, final String dataType, final PrivateKeyEntry keyEntry,
        final Map<String, byte[]> atrib, final Map<String, byte[]> uatrib, final byte[] messageDigest)
        throws IOException, NoSuchAlgorithmException, CertificateException {

    final ASN1InputStream is = new ASN1InputStream(sign);

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

    final SignedAndEnvelopedData sd = new SignedAndEnvelopedData(contentSignedData);

    byte[] md = messageDigest != null ? messageDigest.clone() : 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 (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);
    }

    // buscamos que tipo de algoritmo es y lo codificamos con su OID
    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(signerCertificateChain[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;

    // 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 signedAndEnvelopedData
    final ASN1Set signerInfosSd = sd.getSignerInfos();

    // introducimos los SignerInfos Existentes
    final ASN1EncodableVector signerInfos = new ASN1EncodableVector();
    // introducimos el nuevo SignerInfo del firmante actual.

    // Secuencia:
    // 1.- Si cofirmamos sin datos en el mismo algoritmo de hash que la firma
    //     original sacamos el messagedigest de la firma previa.
    // 2.- Si no es el mismo algoritmo, miramos si nos ha llegado un messagedigest
    //     como parametro del metodo, que quiere decir que se ha calculado externamente
    //     (en el fondo sera que no se ha sobreescrito el parametro, con lo que
    //     si llego != null, seguira siendo != null)
    // 3.- Si no es ninguno de los dos casos, no podemos firmar
    for (int i = 0; i < signerInfosSd.size(); i++) {
        final SignerInfo si = SignerInfo.getInstance(signerInfosSd.getObjectAt(i));
        final AlgorithmIdentifier algHash = si.getDigestAlgorithm();
        // Solo si coninciden los algos puedo sacar el hash de dentro
        if (algHash.getAlgorithm().toString().equals(AOAlgorithmID.getOID(digestAlgorithm))) {
            final ASN1Set signedAttrib = si.getAuthenticatedAttributes();
            for (int s = 0; s < signedAttrib.size(); s++) {
                final ASN1Sequence elemento = (ASN1Sequence) signedAttrib.getObjectAt(s);
                final ASN1ObjectIdentifier oids = (ASN1ObjectIdentifier) elemento.getObjectAt(0);
                if (CMSAttributes.messageDigest.getId().toString().equals(oids.toString())) {
                    final DERSet derSetHash = (DERSet) elemento.getObjectAt(1);
                    final DEROctetString derHash = (DEROctetString) derSetHash.getObjectAt(0);
                    md = derHash.getOctets();
                }
            }
        }
        signerInfos.add(si);
    }

    // En este caso no puedo usar un hash de fuera, ya que no me han
    // pasado datos ni huellas digitales, solo un fichero de firma
    if (md == null) {
        throw new IllegalStateException("No se puede crear la firma ya que no se ha encontrado un hash valido"); //$NON-NLS-1$
    }

    signedAttr = generateSignerInfoFromHash(signerCertificateChain[0], messageDigest, dataType, atrib);

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

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

    // construimos el Signed Data y lo devolvemos
    return new ContentInfo(PKCSObjectIdentifiers.signedAndEnvelopedData,
            new SignedAndEnvelopedData(sd.getRecipientInfos(), sd.getDigestAlgorithms(),
                    sd.getEncryptedContentInfo(), certificates, null, new DERSet(signerInfos)// unsignedAttr
            )).getEncoded(ASN1Encoding.DER);

}

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 y el archivo que se firma.//w w  w.  ja v a2 s.  co m
 * @param signatureAlgorithm Algoritmo para la firma
 * @param signerCertificateChain Cadena de certificados para la construccion de los parametros
 *                               de firma.
 * @param sign Archivo que contiene las firmas.
 * @param dataType Identifica el tipo del contenido a firmar.
 * @param key Clave privada del firmante.
 * @param atrib Atributos firmados adicionales.
 * @param uatrib Atributos no firmados adicionales.
 * @param digest 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.
 * @throws ContainsNoDataException Cuando la firma no contiene los datos
 *                                 ni fue generada con el mismo algoritmo de firma. */
byte[] coSigner(final String signatureAlgorithm, final X509Certificate[] signerCertificateChain,
        final byte[] sign, final String dataType, final PrivateKey key, final Map<String, byte[]> atrib,
        final Map<String, byte[]> uatrib, final byte[] digest)
        throws IOException, NoSuchAlgorithmException, CertificateException, ContainsNoDataException {

    byte[] messageDigest = digest != null ? digest.clone() : null;

    // LEEMOS EL FICHERO QUE NOS INTRODUCEN
    final ASN1InputStream is = new ASN1InputStream(sign);
    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
    final ContentInfo encInfo = sd.getEncapContentInfo();

    final DEROctetString contenido = (DEROctetString) encInfo.getContent();
    byte[] contenidoDatos = null;
    if (contenido != null) {
        contenidoDatos = AOUtil.getDataFromInputStream(contenido.getOctetStream());
    }

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

    // buscamos que tipo de algoritmo es y lo codificamos con su OID
    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(signerCertificateChain[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;

    // 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.

    // Secuencia:
    // 1.- Si cofirmamos sin datos en el mismo algoritmo de hash que la
    // firma
    // original sacamos el messagedigest de la firma previa.
    // 2.- Si no es el mismo algoritmo, miramos si nos ha llegado un
    // messagedigest
    // como parametro del metodo, que quiere decir que se ha calculado
    // externamente
    // (en el fondo sera que no se ha sobreescrito el parametro, con lo que
    // si llego
    // != null, seguira siendo != null)
    // 3.- Si no es ninguno de los dos casos, no podemos firmar
    for (int i = 0; i < signerInfosSd.size(); i++) {
        final SignerInfo si = SignerInfo.getInstance(signerInfosSd.getObjectAt(i));
        final AlgorithmIdentifier algHash = si.getDigestAlgorithm();
        // Solo si coninciden los algos puedo sacar el hash de dentro
        if (algHash.getAlgorithm().toString().equals(AOAlgorithmID.getOID(digestAlgorithm))) {
            final ASN1Set signedAttrib = si.getAuthenticatedAttributes();
            for (int s = 0; s < signedAttrib.size(); s++) {
                final ASN1Sequence elemento = (ASN1Sequence) signedAttrib.getObjectAt(s);
                final ASN1ObjectIdentifier oids = (ASN1ObjectIdentifier) elemento.getObjectAt(0);
                if (CMSAttributes.messageDigest.getId().toString().equals(oids.toString())) {
                    final DERSet derSetHash = (DERSet) elemento.getObjectAt(1);
                    final DEROctetString derHash = (DEROctetString) derSetHash.getObjectAt(0);
                    messageDigest = derHash.getOctets();
                }
            }
        }
        signerInfos.add(si);
    }

    // atributos firmados
    if (contenidoDatos != null) {
        signedAttr = generateSignerInfo(digestAlgorithm, contenidoDatos, dataType, atrib);
    } else if (messageDigest != null) {
        signedAttr = generateSignerInfoFromHash(signerCertificateChain[0], messageDigest, dataType, atrib);
    } else {
        // En este caso no puedo usar un hash de fuera, ya que no me han
        // pasado datos ni
        // huellas digitales, solo un fichero de firma
        throw new ContainsNoDataException(
                "No se puede crear la cofirma ya que no se han encontrado ni los datos firmados ni una huella digital compatible con el algoritmo de firma"); //$NON-NLS-1$
    }

    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.multi.cades.CAdESCoSigner.java

License:Open Source License

/** Constructor de la clase. Se crea una cofirma a partir de los datos del
 * firmante y del archivo que contiene las firmas.
 * @param signatureAlgorithm Algoritmo para la firma
 * @param signerCertificateChain Cadena de certificados para la construccion de los parametros de firma.
 * @param signature Archivo que contiene las firmas.
 * @param policy Pol&iacute;tica de firma
 * @param signingCertificateV2//from w  w w .  j av a 2  s  .c o  m
 *        <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 md Huella digital espec&iacute;fica 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 java.io.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.
 * @throws ContainsNoDataException Cuando la firma no contiene los datos ni fue generada con el mismo
 *                                 algoritmo de firma. */
byte[] coSigner(final String signatureAlgorithm, final X509Certificate[] signerCertificateChain,
        final InputStream signature, final AdESPolicy policy, final boolean signingCertificateV2,
        final PrivateKey key, final java.security.cert.Certificate[] certChain, final byte[] md,
        final String contentType, final String contentDescription,
        final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm)
        throws IOException, NoSuchAlgorithmException, CertificateException, ContainsNoDataException {
    // 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
    final ContentInfo encInfo = sd.getEncapContentInfo();

    final DEROctetString contenido = (DEROctetString) encInfo.getContent();
    byte[] contenidoDatos = null;
    if (contenido != null) {
        contenidoDatos = AOUtil.getDataFromInputStream(contenido.getOctetStream());
    }

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

    // buscamos que timo de algoritmo es y lo codificamos con su OID
    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(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$

    // 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.

    byte[] messageDigest = md != null ? md.clone() : null;

    for (int i = 0; i < signerInfosSd.size(); i++) {
        final SignerInfo si = SignerInfo.getInstance(signerInfosSd.getObjectAt(i));
        final AlgorithmIdentifier algHash = si.getDigestAlgorithm();
        if (algHash.getAlgorithm().toString().equals(AOAlgorithmID.getOID(digestAlgorithm))) {
            final ASN1Set signedAttrib = si.getAuthenticatedAttributes();
            for (int s = 0; s < signedAttrib.size(); s++) {
                final ASN1Sequence elemento = (ASN1Sequence) signedAttrib.getObjectAt(s);
                final ASN1ObjectIdentifier oids = (ASN1ObjectIdentifier) elemento.getObjectAt(0);
                if (CMSAttributes.messageDigest.getId().equals(oids.toString())) {
                    final DERSet derSetHash = (DERSet) elemento.getObjectAt(1);
                    final DEROctetString derHash = (DEROctetString) derSetHash.getObjectAt(0);
                    messageDigest = derHash.getOctets();
                }
            }
        }

        signerInfos.add(si);
    }

    // // ATRIBUTOS

    ASN1Set signedAttr;
    // atributos firmados
    if (contenidoDatos != null) {
        final ASN1EncodableVector contextExpecific = CAdESUtils.generateSignerInfo(signerCertificateChain[0],
                digestAlgorithm, contenidoDatos, policy, signingCertificateV2, null, // MessageDigest
                new Date(), false, contentType, contentDescription, ctis, csm);
        this.signedAttr2 = SigUtils.getAttributeSet(new AttributeTable(contextExpecific));
        signedAttr = SigUtils.getAttributeSet(new AttributeTable(contextExpecific));
    } else if (messageDigest != null) {
        final ASN1EncodableVector contextExpecific = CAdESUtils.generateSignerInfo(signerCertificateChain[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));
    } else {
        throw new ContainsNoDataException(
                "No se puede crear la cofirma ya que no se han encontrado ni los datos firmados ni una huella digital compatible con el algoritmo de firma"); //$NON-NLS-1$
    }

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

    // 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.CAdESCoSignerEnveloped.java

License:Open Source License

/** Se crea una cofirma a partir de los datos del firmante y del archivo que
 * contiene las firmas.//from  www .  ja v  a 2s.com
 * @param signatureAlgorithm
 *        Algoritmo para la firma
 * @param signerCertificateChain
 *        Cadena de certificados para la construccion de los parametros
 *        de firma.
 * @param data Archivo que contiene las firmas.
 * @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 md Huella digital espec&iacute;fica 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 java.security.cert.CertificateException
 *         Si se produce alguna excepci&oacute;n con los certificados de
 *         firma. */
byte[] coSigner(final String signatureAlgorithm, final X509Certificate[] signerCertificateChain,
        final InputStream data, final AdESPolicy policy, final boolean signingCertificateV2,
        final PrivateKey key, final java.security.cert.Certificate[] certChain, final byte[] md,
        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(data);
    final ASN1Sequence dsq = (ASN1Sequence) is.readObject();
    is.close();
    final Enumeration<?> e = dsq.getObjects();
    // Elementos que contienen los elementos OID SignedAndEnvelopedData
    e.nextElement();
    // Contenido de SignedAndEnvelopedData
    final ASN1TaggedObject doj = (ASN1TaggedObject) e.nextElement();
    final ASN1Sequence contentSignedData = (ASN1Sequence) doj.getObject();// contenido
    // del
    // SignedData

    final SignedAndEnvelopedData sd = new SignedAndEnvelopedData(contentSignedData);

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

    // buscamos que timo de algoritmo es y lo codificamos con su OID
    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(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$

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

    // introducimos los SignerInfos Existentes
    final ASN1EncodableVector signerInfos = new ASN1EncodableVector();
    // introducimos el nuevo SignerInfo del firmante actual.

    byte[] messageDigest = md != null ? md.clone() : null;

    for (int i = 0; i < signerInfosSd.size(); i++) {
        final SignerInfo si = SignerInfo.getInstance(signerInfosSd.getObjectAt(i));
        final AlgorithmIdentifier algHash = si.getDigestAlgorithm();
        if (algHash.getAlgorithm().toString().equals(AOAlgorithmID.getOID(digestAlgorithm))) {
            final ASN1Set signedAttrib = si.getAuthenticatedAttributes();
            for (int s = 0; s < signedAttrib.size(); s++) {
                final ASN1Sequence elemento = (ASN1Sequence) signedAttrib.getObjectAt(s);
                final ASN1ObjectIdentifier oids = (ASN1ObjectIdentifier) elemento.getObjectAt(0);
                if (CMSAttributes.messageDigest.getId().toString().equals(oids.toString())) {
                    final DERSet derSetHash = (DERSet) elemento.getObjectAt(1);
                    final DEROctetString derHash = (DEROctetString) derSetHash.getObjectAt(0);
                    messageDigest = derHash.getOctets();
                }
            }
        }
        signerInfos.add(si);
    }

    // // ATRIBUTOS

    ASN1Set signedAttr = null;
    // atributos firmados
    if (messageDigest != null) {
        final ASN1EncodableVector contextExpecific = CAdESUtils.generateSignerInfo(signerCertificateChain[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));
    } else {
        throw new IllegalStateException(
                "No se puede crear la firma ya que no se ha encontrado un message digest valido"); //$NON-NLS-1$
    }

    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 SignedAndEnvelopedData
    signerInfos.add(new SignerInfo(identifier, digAlgId, signedAttr, encAlgId, sign2, null // unsignedAttr
    ));

    // construimos el Signed Data y lo devolvemos
    return new ContentInfo(PKCSObjectIdentifiers.signedAndEnvelopedData,
            new SignedAndEnvelopedData(sd.getRecipientInfos(), sd.getDigestAlgorithms(),
                    sd.getEncryptedContentInfo(), certificates, null, new DERSet(signerInfos)// unsignedAttr
            )).getEncoded(ASN1Encoding.DER);

}

From source file:es.gob.afirma.signers.pkcs7.ObtainContentSignedData.java

License:Open Source License

/** M&eacute;todo que obtiene la huella digital de los datos firmados en una firma CMS/CAdES.
 * La huella se obtenida estar&aacute; generada con el algoritmo de huella indicado, si este
 * algoritmo es el que se utiliz&oacute; en alguna de las operaci&oacute;nes de firma con la
 * que se gener&oacute; esta firma. Si no se utiliz&oacute; este algoritmo, se devuelve
 * {@code null}.//from w  ww.  j  a  va 2s  .  c o m
 * @param signature Firma de la que obtener la huella digital.
 * @param digestAlgorithm Algoritmo con el que se gener&oacute; la huella digital que buscamos.
 * @return La huella digital de los datos firmados generada con el algoritmo indicado, o
 * {@code null} si esta no se encuentra en la firma.
 * @throws IOException Si no se pueden leer los datos */
public static byte[] obtainMessageDigest(final byte[] signature, final String digestAlgorithm)
        throws IOException {

    // 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 Data
    final ASN1ObjectIdentifier doi = (ASN1ObjectIdentifier) e.nextElement();

    // Comprobamos que sea una firma
    if (!doi.equals(PKCSObjectIdentifiers.signedData)) {
        LOGGER.warning("No se puede obtener el contenido de esta firma."); //$NON-NLS-1$
        return null;
    }

    // Contenido a obtener informacion
    final ASN1TaggedObject doj = (ASN1TaggedObject) e.nextElement();
    final SignedData sd = SignedData.getInstance(doj.getObject());
    final ASN1Set signerInfosSd = sd.getSignerInfos();

    byte[] messageDigest = null;

    for (int i = 0; i < signerInfosSd.size(); i++) {
        final SignerInfo si = SignerInfo.getInstance(signerInfosSd.getObjectAt(i));
        final AlgorithmIdentifier algHash = si.getDigestAlgorithm();
        if (algHash.getAlgorithm().toString().equals(AOAlgorithmID.getOID(digestAlgorithm))) {
            final ASN1Set signedAttrib = si.getAuthenticatedAttributes();
            for (int s = 0; s < signedAttrib.size(); s++) {
                final ASN1Sequence elemento = (ASN1Sequence) signedAttrib.getObjectAt(s);
                final ASN1ObjectIdentifier oids = (ASN1ObjectIdentifier) elemento.getObjectAt(0);
                if (CMSAttributes.messageDigest.getId().equals(oids.toString())) {
                    final DERSet derSetHash = (DERSet) elemento.getObjectAt(1);
                    final DEROctetString derHash = (DEROctetString) derSetHash.getObjectAt(0);
                    messageDigest = derHash.getOctets();
                    break;
                }
            }
            if (messageDigest != null) {
                break;
            }
        }
    }
    if (messageDigest == null) {
        LOGGER.warning("No se ha encontrado en la firma una huella digital generada con el algoritmo: " //$NON-NLS-1$
                + digestAlgorithm);
    }
    return messageDigest;
}

From source file:es.uji.security.crypto.pdf.PdfPKCS7TSA.java

License:Mozilla Public License

private void findOcsp(ASN1Sequence seq) throws IOException {
    basicResp = null;//from  w w w. j  av a2  s.  c  om
    boolean ret = false;
    while (true) {
        if ((seq.getObjectAt(0) instanceof DERObjectIdentifier) && ((DERObjectIdentifier) seq.getObjectAt(0))
                .getId().equals(OCSPObjectIdentifiers.id_pkix_ocsp_basic.getId())) {
            break;
        }
        ret = true;
        for (int k = 0; k < seq.size(); ++k) {
            if (seq.getObjectAt(k) instanceof ASN1Sequence) {
                seq = (ASN1Sequence) seq.getObjectAt(0);
                ret = false;
                break;
            }
            if (seq.getObjectAt(k) instanceof ASN1TaggedObject) {
                ASN1TaggedObject tag = (ASN1TaggedObject) seq.getObjectAt(k);
                if (tag.getObject() instanceof ASN1Sequence) {
                    seq = (ASN1Sequence) tag.getObject();
                    ret = false;
                    break;
                } else
                    return;
            }
        }
        if (ret)
            return;
    }
    DEROctetString os = (DEROctetString) seq.getObjectAt(1);
    ASN1InputStream inp = new ASN1InputStream(os.getOctets());
    BasicOCSPResponse resp = BasicOCSPResponse.getInstance(inp.readObject());
    basicResp = new BasicOCSPResp(resp);
}