Example usage for org.bouncycastle.asn1 DEROctetString DEROctetString

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

Introduction

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

Prototype

public DEROctetString(ASN1Encodable obj) throws IOException 

Source Link

Document

Constructor from the encoding of an ASN.1 object.

Usage

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

License:Open Source License

/** Método que genera la parte que contiene la información del
 * Usuario. Se generan los atributos que se necesitan para generar la firma.
 * En este caso se introduce el hash directamente.
 * @param cert Certificado necesario para la firma.
 * @param datos Datos firmados./*from w ww  .j  a v  a  2s  .co  m*/
 * @param dataType Identifica el tipo del contenido a firmar.
 * @param atrib Lista de atributos firmados que se insertarán dentro
 *              del archivo de firma.
 * @return Atributos firmados de la firma. */
private ASN1Set generateSignerInfoFromHash(final X509Certificate cert, final byte[] datos,
        final String dataType, final Map<String, byte[]> atrib) {

    // // ATRIBUTOS

    // authenticatedAttributes
    final ASN1EncodableVector contexExpecific = new ASN1EncodableVector();

    // tipo de contenido
    contexExpecific
            .add(new Attribute(CMSAttributes.contentType, new DERSet(new ASN1ObjectIdentifier(dataType))));

    // fecha de firma
    contexExpecific.add(new Attribute(CMSAttributes.signingTime, new DERSet(new ASN1UTCTime(new Date()))));

    // MessageDigest
    contexExpecific.add(new Attribute(CMSAttributes.messageDigest, new DERSet(new DEROctetString(datos))));

    // Serial Number
    contexExpecific.add(new Attribute(RFC4519Style.serialNumber,
            new DERSet(new DERPrintableString(cert.getSerialNumber().toString()))));

    // agregamos la lista de atributos a mayores.
    if (atrib.size() != 0) {
        final Iterator<Map.Entry<String, byte[]>> it = atrib.entrySet().iterator();
        while (it.hasNext()) {
            final Map.Entry<String, byte[]> e = it.next();
            contexExpecific.add(new Attribute(
                    // el oid
                    new ASN1ObjectIdentifier(e.getKey().toString()),
                    // el array de bytes en formato string
                    new DERSet(new DERPrintableString(new String(e.getValue())))));
        }
    }

    this.signedAttr2 = SigUtils.getAttributeSet(new AttributeTable(contexExpecific));

    return SigUtils.getAttributeSet(new AttributeTable(contexExpecific));

}

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

License:Open Source License

/** Realiza la firma usando los atributos del firmante.
 * @param signatureAlgorithm Algoritmo para la firma.
 * @param key Clave para firmar.//from w  w  w . j  a  v a2  s  .c o  m
 * @return Firma de los atributos.
 * @throws AOException Cuando ocurre cualquier problema durante el proceso */
private ASN1OctetString firma(final String signatureAlgorithm, final PrivateKey key) throws AOException {

    final Signature sig;
    try {
        sig = Signature.getInstance(signatureAlgorithm);
    } catch (final Exception e) {
        throw new AOException("Error obteniendo la clase de firma para el algoritmo " + signatureAlgorithm, e); //$NON-NLS-1$
    }

    final byte[] tmp;
    try {
        tmp = this.signedAttr2.getEncoded(ASN1Encoding.DER);
    } catch (final IOException ex) {
        throw new AOException("Error obteniendo los atributos firmados", ex); //$NON-NLS-1$
    }

    // Indicar clave privada para la firma
    try {
        sig.initSign(key);
    } catch (final Exception e) {
        throw new AOException("Error al inicializar la firma con la clave privada", e); //$NON-NLS-1$
    }

    // Actualizamos la configuracion de firma
    try {
        sig.update(tmp);
    } catch (final SignatureException e) {
        throw new AOException("Error al configurar la informacion de firma", e); //$NON-NLS-1$
    }

    // firmamos.
    final byte[] realSig;
    try {
        realSig = sig.sign();
    } catch (final Exception e) {
        throw new AOException("Error durante el proceso de firma", e); //$NON-NLS-1$
    }

    return new DEROctetString(realSig);

}

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

License:Open Source License

/** Genera la parte que contiene la informaci&oacute;n del
 * Usuario. Se generan los atributos que se necesitan para generar la
 * firma./*from  w  w w  .j av  a 2  s .c  o m*/
 * @param cert Certificado necesario para la firma.
 * @param digestAlgorithm Algoritmo Firmado.
 * @param datos Datos firmados.
 * @return Los datos necesarios para generar la firma referente a los datos
 *         del usuario.
 * @throws java.security.NoSuchAlgorithmException Cuando el JRE no soporta alg&uacute;n algoritmo necesario. */
private ASN1Set generateSignerInfo(final X509Certificate cert, final String digestAlgorithm, final byte[] datos)
        throws NoSuchAlgorithmException {
    // // ATRIBUTOS

    // authenticatedAttributes
    final ASN1EncodableVector contexExpecific = new ASN1EncodableVector();

    // Las Contrafirmas CMS no tienen ContentType

    // fecha de firma
    contexExpecific.add(new Attribute(CMSAttributes.signingTime, new DERSet(new ASN1UTCTime(new Date()))));

    // MessageDigest
    contexExpecific.add(new Attribute(CMSAttributes.messageDigest, new DERSet(new DEROctetString(MessageDigest
            .getInstance(AOSignConstants.getDigestAlgorithmName(digestAlgorithm)).digest(datos)))));

    // Serial Number
    contexExpecific.add(new Attribute(RFC4519Style.serialNumber,
            new DERSet(new DERPrintableString(cert.getSerialNumber().toString()))));

    // agregamos la lista de atributos a mayores.
    if (this.atrib2.size() != 0) {
        final Iterator<Map.Entry<String, byte[]>> it = this.atrib2.entrySet().iterator();
        while (it.hasNext()) {
            final Map.Entry<String, byte[]> e = it.next();
            contexExpecific.add(new Attribute(new ASN1ObjectIdentifier(e.getKey().toString()), // el oid
                    new DERSet(new DERPrintableString(new String(e.getValue()))))); // el array de bytes en formato string
        }
    }

    this.signedAttr2 = SigUtils.getAttributeSet(new AttributeTable(contexExpecific));

    return SigUtils.getAttributeSet(new AttributeTable(contexExpecific));

}

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

License:Open Source License

/** Realiza la firma usando los atributos del firmante.
 * @param signatureAlgorithm Algoritmo para la firma.
 * @param key Clave para firmar.//from  w  w w.j  a v a 2 s .c o  m
 * @return Firma de los atributos.
 * @throws AOException EN caso de cualquier error durante el proceso */
private ASN1OctetString firma(final String signatureAlgorithm, final PrivateKey key) throws AOException {

    final Signature sig;
    try {
        sig = Signature.getInstance(signatureAlgorithm);
    } catch (final Exception e) {
        throw new AOException("Error obteniendo la clase de firma para el algoritmo " + signatureAlgorithm, e); //$NON-NLS-1$
    }

    final byte[] tmp;
    try {
        tmp = this.signedAttr2.getEncoded(ASN1Encoding.DER);
    } catch (final IOException ex) {
        throw new AOException("Error obteniendo los datos a firmar", ex); //$NON-NLS-1$
    }

    // Indicar clave privada para la firma
    try {
        sig.initSign(key);
    } catch (final Exception e) {
        throw new AOException("Error al inicializar la firma con la clave privada", e); //$NON-NLS-1$
    }

    // Actualizamos la configuracion de firma
    try {
        sig.update(tmp);
    } catch (final SignatureException e) {
        throw new AOException("Error al configurar la informacion de firma", e); //$NON-NLS-1$
    }

    // firmamos.
    final byte[] realSig;
    try {
        realSig = sig.sign();
    } catch (final Exception e) {
        throw new AOException("Error durante el proceso de firma", e); //$NON-NLS-1$
    }

    return new DEROctetString(realSig);

}

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

License:Open Source License

/** Genera los atributos firmados.
 * @param digestAlgorithm Algoritmo Firmado.
 * @param datos Datos firmados./*from ww  w .  j a  v  a 2s.com*/
 * @param dataType Identifica el tipo del contenido a firmar.
 * @param timestamp Introducir el momento de la firma como atributo firmado (no confundir con un sello de tiempo reconocido)
 * @param atrib Lista de atributos firmados que se insertar&aacute;n dentro
 *              del archivo de firma.
 * @param messageDigest Huella digital.
 * @return Los atributos firmados de la firma.
 * @throws java.security.NoSuchAlgorithmException Cuando el JRE no soporta alg&uacute;n algoritmo necesario. */
private ASN1Set generateSignedInfo(final String digestAlgorithm, final byte[] datos, final String dataType,
        final boolean timestamp, final Map<String, byte[]> atrib, final byte[] messageDigest)
        throws NoSuchAlgorithmException {
    // // ATRIBUTOS

    // authenticatedAttributes
    final ASN1EncodableVector contexExpecific = new ASN1EncodableVector();

    // tipo de contenido
    contexExpecific
            .add(new Attribute(CMSAttributes.contentType, new DERSet(new ASN1ObjectIdentifier(dataType))));

    // fecha de firma
    if (timestamp) {
        contexExpecific.add(new Attribute(CMSAttributes.signingTime, new DERSet(new ASN1UTCTime(new Date()))));
    }

    // Si nos viene el hash de fuera no lo calculamos
    final byte[] md;
    if (messageDigest == null || messageDigest.length < 1) {
        md = MessageDigest.getInstance(AOSignConstants.getDigestAlgorithmName(digestAlgorithm)).digest(datos);
    } else {
        md = messageDigest;
    }

    // MessageDigest
    contexExpecific.add(new Attribute(CMSAttributes.messageDigest, new DERSet(new DEROctetString(md.clone()))));

    // agregamos la lista de atributos a mayores.
    if (atrib.size() != 0) {

        final Iterator<Map.Entry<String, byte[]>> it = atrib.entrySet().iterator();
        while (it.hasNext()) {
            final Map.Entry<String, byte[]> e = it.next();
            contexExpecific.add(new Attribute(new ASN1ObjectIdentifier(e.getKey()), // el oid
                    new DERSet(new DERPrintableString(new String(e.getValue()))) // el array de bytes en formato string
            ));
        }

    }

    this.signedAttr2 = SigUtils.getAttributeSet(new AttributeTable(contexExpecific));

    return SigUtils.getAttributeSet(new AttributeTable(contexExpecific));

}

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

License:Open Source License

/** Realiza la firma usando los atributos del firmante.
 * @param signatureAlgorithm Algoritmo para la firma.
 * @param key Clave para firmar.//  w  w  w.  j a  va  2 s  .c  om
 * @return Firma de los atributos.
 * @throws AOException Si ocurre cualquier problema durante el proceso */
private ASN1OctetString firma(final String signatureAlgorithm, final PrivateKey key) throws AOException {

    final Signature sig;
    try {
        sig = Signature.getInstance(signatureAlgorithm);
    } catch (final Exception e) {
        throw new AOException("Error obteniendo la clase de firma para el algoritmo " + signatureAlgorithm, e); //$NON-NLS-1$
    }

    // Indicar clave privada para la firma
    try {
        sig.initSign(key);
    } catch (final Exception e) {
        throw new AOException("Error al inicializar la firma con la clave privada", e); //$NON-NLS-1$
    }

    // Actualizamos la configuracion de firma
    try {
        sig.update(this.signedAttr2.getEncoded(ASN1Encoding.DER));
    } catch (final Exception e) {
        throw new AOException("Error al configurar la informacion de firma o al obtener los atributos a firmar", //$NON-NLS-1$
                e);
    }

    // firmamos.
    final byte[] realSig;
    try {
        realSig = sig.sign();
    } catch (final Exception e) {
        throw new AOException("Error durante el proceso de firma", e); //$NON-NLS-1$
    }

    return new DEROctetString(realSig);

}

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

License:Open Source License

/** Realiza la firma usando los atributos del firmante.
 * @param signatureAlgorithm/*from  w w w.  ja  v  a  2s  .  c om*/
 *        Algoritmo para la firma
 * @param key Clave para firmar.
 * @param certChain Cadena de certificados del firmante.
 * @return Firma de los atributos.
 * @throws AOException Cuando ocurre cualquier tipo de error */
private ASN1OctetString firma(final String signatureAlgorithm, final PrivateKey key,
        final java.security.cert.Certificate[] certChain) throws AOException {

    final byte[] tmp;
    try {
        tmp = this.signedAttr2.getEncoded(ASN1Encoding.DER);
    } catch (final IOException ex) {
        throw new AOException("Error al obtener los datos a firmar", ex); //$NON-NLS-1$
    }

    return new DEROctetString(new AOPkcs1Signer().sign(tmp, signatureAlgorithm, key, certChain, null));

}

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

License:Open Source License

/** Genera un signerInfo espec&iacute;fico utilizando los
 * datos necesarios para crearlo. Se utiliza siempre que no se sabe cual es
 * el signerInfo que se debe firmar./*  w w w. j a v  a 2s  .co  m*/
 * @param signatureAlgorithm Algoritmo de firma a usar.
 * @param si SignerInfo del que se debe recoger la informaci&oacute;n para
 *           realizar la contrafirma espec&iacute;fica.
 * @param key Clave privada a usar para firmar.
 * @param certChain Cadena de certificados del firmante.
 * @param contentDescription Descripci&oacute;n textual del tipo de contenido firmado.
 * @param policy Pol&iacute;tica de firma.
 * @param signingCertificateV2 <code>true</code> si se desea usar <i>SigningCertificateV2</i>, <code>false</code>
 *        para usar <i>SigningCertificateV1</i>.
 * @param ctis Indicaciones sobre los tipos de compromisos adquiridos con la firma.
 * @param csm Metadatos sobre el firmante.
 * @return <i>SignerInfo</i> contrafirmado.
 * @throws NoSuchAlgorithmException Si no se soporta alguno de los algoritmos necesarios.
 * @throws java.io.IOException Cuando hay errores de entrada / salida
 * @throws CertificateException Cuando hay problemas con los certificados proporcionados. */
private SignerInfo generateSignerInfo(final String signatureAlgorithm, final SignerInfo si,
        final PrivateKey key, final java.security.cert.Certificate[] certChain, final String contentDescription,
        final AdESPolicy policy, final boolean signingCertificateV2,
        final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm)
        throws NoSuchAlgorithmException, IOException, CertificateException {
    // buscamos que timo de algoritmo es y lo codificamos con su OID
    final String digestAlgorithm = AOSignConstants.getDigestAlgorithmName(signatureAlgorithm);

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

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

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

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

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

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

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

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

}

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

License:Open Source License

/** Realiza la firma usando los atributos del firmante.
 * @param signatureAlgorithm Algoritmo para la firma
 * @param key Clave para firmar.//from w w  w .  j  a v a 2  s  .  c o m
 * @param certChain Cadena de certificados del firmante.
 * @return Firma de los atributos.
 * @throws AOException En caso de cualquier otro tipo de error */
private ASN1OctetString firma(final String signatureAlgorithm, final PrivateKey key,
        final java.security.cert.Certificate[] certChain) throws AOException {

    final byte[] tmp;
    try {
        tmp = this.signedAttr2.getEncoded(ASN1Encoding.DER);
    } catch (final Exception ex) {
        throw new AOException("Error obteniendo los atributos firmados: " + ex); //$NON-NLS-1$
    }

    return new DEROctetString(new AOPkcs1Signer().sign(tmp, signatureAlgorithm, key, certChain, 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/*from   ww w .  j a  v  a 2  s  .com*/
 * @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);

}