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.envelopers.cms.CounterSignerEnveloped.java

License:Open Source License

/** Realiza la firma usando los atributos del firmante.
 * @param signatureAlgorithm/*from   w  w  w.ja  v a2  s  . c  o m*/
 *        Algoritmo para la firma
 * @param keyEntry
 *        Clave para firmar.
 * @return Firma de los atributos.
 * @throws NoSuchAlgorithmException Cuando el JRE no soporta algún algoritmo necesario.
 * @throws IOException Cuando hay problemas de entrada / salida.
 * @throws InvalidKeyException Cuando hay problemas de adecuación de la clave.
 * @throws SignatureException Cuando ocurren problemas en la firma PKCS#1. */
private ASN1OctetString firma(final String signatureAlgorithm, final PrivateKeyEntry keyEntry)
        throws NoSuchAlgorithmException, IOException, InvalidKeyException, SignatureException {

    final Signature sig = Signature.getInstance(signatureAlgorithm);

    // Indicar clave privada para la firma
    sig.initSign(keyEntry.getPrivateKey());

    // Actualizamos la configuracion de firma
    sig.update(this.signedAttr2.getEncoded(ASN1Encoding.DER));

    // firmamos y devolvemos
    return new DEROctetString(sig.sign());

}

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

License:Open Source License

/**
 * Crea la estructura interna para el ensobrado de datos.
 * @param data Datos que se desean ensobrar.
 * @param config Configración para el cifrado.
 * @param certDest Certificados de los destinatarios del sobre.
 * @param cipherKey Clave para la identificación del remitente..
 * @return Objeto con la información para la generación del sobre.
 * @throws IOException Si ocurre algún problema leyendo o escribiendo los
 *         datos.//  ww  w . jav  a2s  .  c o  m
 * @throws CertificateEncodingException Si se produce alguna excepción
 *         con los certificados de los usuarios.
 * @throws IllegalBlockSizeException Cuando hay problemas internos con los tamaños de bloque de cifrado.
 * @throws InvalidAlgorithmParameterException Si no se soporta un parámetro necesario para un algoritmo.
 * @throws NoSuchPaddingException Cuando no se soporta un tipo de relleno necesario.
 * @throws NoSuchAlgorithmException Cuando el JRE no soporta algún algoritmo necesario.
 * @throws InvalidKeyException Cuando hay problemas de adecuación de la clave.
 * @throws BadPaddingException Cuando hay problemas con un relleno de datos. */
static Info initVariables(final byte[] data, final AOCipherConfig config, final X509Certificate[] certDest,
        final SecretKey cipherKey) throws CertificateEncodingException, IOException, InvalidKeyException,
        NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException,
        IllegalBlockSizeException, BadPaddingException {

    // Reiniciamos las dos variables
    final Info infos = new Info();

    final ASN1EncodableVector recipientInfos = new ASN1EncodableVector();

    for (final X509Certificate element : certDest) {

        final TBSCertificateStructure tbs = TBSCertificateStructure
                .getInstance(ASN1Primitive.fromByteArray(element.getTBSCertificate()));

        // creamos el recipiente con los datos del destinatario.
        final KeyTransRecipientInfo keyTransRecipientInfo = new KeyTransRecipientInfo(
                // Creamos el recipientInfo
                new RecipientIdentifier(
                        // Obtenemos el issuer & serial number
                        new IssuerAndSerialNumber(X500Name.getInstance(tbs.getIssuer()),
                                tbs.getSerialNumber().getValue())),
                // obtenemos el algoritmo de cifrado (RSA / DSA).
                tbs.getSubjectPublicKeyInfo().getAlgorithm(), new DEROctetString(cipherKey(
                        // Obtenemos la clave publica
                        element.getPublicKey(), cipherKey)));

        // Lo anadimos al recipiente de destinatarios.
        recipientInfos.add(new RecipientInfo(keyTransRecipientInfo));
    }

    // 3. ENCRIPTEDCONTENTINFO
    infos.setEncInfo(getEncryptedContentInfo(data, config, cipherKey));

    infos.setRecipientInfos(recipientInfos);

    return infos;
}

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

License:Open Source License

/** Obtiene el contenido de un archivo encriptado.
 * @param file Archivo con los datos//from w w  w .  jav a2s.c  o m
 * @param config Configuracion de cifrado
 * @param params Parametros
 * @param cipher Encriptador
 * @return Contenido de un archivo encriptado.
 * @throws BadPaddingException Cuando hay problemas con un relleno de datos.
 * @throws IOException Cuando hay problemas con el tratamiento de datos.
 * @throws IllegalBlockSizeException Cuando hay problemas internos con los tamaños de bloque de cifrado. */
private static EncryptedContentInfo getEncryptedContentInfo(final byte[] file, final AOCipherConfig config,
        final AlgorithmParameterSpec params, final Cipher cipher)
        throws IOException, IllegalBlockSizeException, BadPaddingException {

    ASN1Encodable asn1Params;
    if (params != null) {
        final ASN1InputStream aIn = new ASN1InputStream(cipher.getParameters().getEncoded("ASN.1")); //$NON-NLS-1$
        asn1Params = aIn.readObject();
        aIn.close();
    } else {
        asn1Params = DERNull.INSTANCE;
    }

    // obtenemos el OID del algoritmo de cifrado
    final AlgorithmIdentifier encAlgId = new AlgorithmIdentifier(
            new ASN1ObjectIdentifier(config.getAlgorithm().getOid()), asn1Params);

    // Obtenemos el identificador
    final ASN1ObjectIdentifier contentType = PKCSObjectIdentifiers.encryptedData;
    return new EncryptedContentInfo(contentType, encAlgId, new DEROctetString(cipher.doFinal(file)));
}

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

License:Open Source License

/** Inicializa el contexto.
 * @param digestAlgorithm Algoritmo de huella digital.
 * @param datos Datos a firmar o envolver.
 * @param dataType Tipo de los datos a firmar o envolver.
 * @param messageDigest Huella digital de los datos a firmar o envolver.
 * @return ASN1EncodableVector Contexto codificado en ASN.1.
 * @throws NoSuchAlgorithmException Cuando el JRE no soporta algún algoritmo necesario. */
static ASN1EncodableVector initContexExpecific(final String digestAlgorithm, final byte[] datos,
        final String dataType, final byte[] messageDigest) throws NoSuchAlgorithmException {
    // authenticatedAttributes
    final ASN1EncodableVector contexExpecific = new ASN1EncodableVector();

    // tipo de contenido
    if (dataType != null) {
        contexExpecific//from w  w  w. jav  a2 s  .com
                .add(new Attribute(CMSAttributes.contentType, new DERSet(new ASN1ObjectIdentifier(dataType))));
    }

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

    // MessageDigest
    contexExpecific.add(new Attribute(CMSAttributes.messageDigest,
            new DERSet(new DEROctetString(messageDigest != null ? messageDigest
                    : MessageDigest.getInstance(digestAlgorithm).digest(datos)))));

    return contexExpecific;
}

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

License:Open Source License

/** Obtiene la estructura ASN.1 de firma usando los atributos del firmante.
 * @param signatureAlgorithm Algoritmo para la firma.
 * @param keyEntry Clave para firmar.//from   w w w  . j  a  va 2 s. c  o m
 * @param signedAttr2 Atributos firmados.
 * @return Firma de los atributos.
 * @throws NoSuchAlgorithmException Cuando el JRE no soporta algún algoritmo necesario.
 * @throws IOException Cuando hay problemas de entrada / salida.
 * @throws InvalidKeyException Cuando la clave proporcionada no es válida.
 * @throws SignatureException Cuando hay problemas con la firma PKCS#1. */
static ASN1OctetString firma(final String signatureAlgorithm, final PrivateKeyEntry keyEntry,
        final ASN1Set signedAttr2)
        throws NoSuchAlgorithmException, IOException, InvalidKeyException, SignatureException {

    final Signature sig = Signature.getInstance(signatureAlgorithm);

    final byte[] tmp = signedAttr2.getEncoded(ASN1Encoding.DER);

    // Indicar clave privada para la firma
    sig.initSign(keyEntry.getPrivateKey());

    // Actualizamos la configuracion de firma
    if (tmp != null) {
        sig.update(tmp);
    }

    // firmamos.
    final byte[] realSig = sig.sign();

    return new DEROctetString(realSig);

}

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

License:Open Source License

/** Método que verifica que es una firma de tipo "data"
 * @param data//from w  w w . ja  v  a2 s .c  o  m
 *        Datos CMS.
 * @return si es de este tipo. */
@SuppressWarnings("unused")
static boolean isCMSData(final byte[] data) {
    boolean isValid = true;
    try {
        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 Data
        final ASN1ObjectIdentifier doi = (ASN1ObjectIdentifier) e.nextElement();
        if (!doi.equals(PKCSObjectIdentifiers.data)) {
            isValid = false;
        } else {
            // Contenido de Data
            final ASN1TaggedObject doj = (ASN1TaggedObject) e.nextElement();

            /*
             * Si no es un objeto de tipo Dara se pasa al manejo de la
             * excepcion
             */
            new DEROctetString(doj.getObject());
        }
    } catch (final Exception ex) {
        isValid = false;
    }

    return isValid;
}

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/* ww  w. j  a v  a 2s  .co  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.cades.CAdESUtils.java

License:Open Source License

private static ASN1EncodableVector initContexExpecific(final String dataDigestAlgorithmName, final byte[] data,
        final byte[] dataDigest, final Date signDate, final boolean padesMode) throws NoSuchAlgorithmException {
    // authenticatedAttributes
    final ASN1EncodableVector contexExpecific = new ASN1EncodableVector();

    // ContentType es obligatorio, y debe tener siempre el valor "id-data"
    contexExpecific.add(new Attribute(CMSAttributes.contentType, new DERSet(PKCSObjectIdentifiers.data)));

    // fecha de firma, no se anade en modo PAdES, pero es obligatorio en CAdES
    if (!padesMode) {
        contexExpecific.add(new Attribute(CMSAttributes.signingTime, new DERSet(new ASN1UTCTime(signDate))));
    }//  w  ww  . j a  v a2  s.  c  o m

    // MessageDigest
    contexExpecific.add(new Attribute(CMSAttributes.messageDigest,
            new DERSet(new DEROctetString(dataDigest != null ? dataDigest
                    : MessageDigest.getInstance(dataDigestAlgorithmName).digest(data)))));

    return contexExpecific;
}

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

License:Open Source License

/** Verifica si los datos proporcionados se corresponden con una estructura de tipo <i>Data</i>.
 * @param data Datos PKCS#7/CMS/CAdES.// w w w.j  a v  a2s. c  o  m
 * @return <code>true</code> si los datos proporcionados se corresponden con una estructura de tipo <i>Data</i>,
 * <code>false</code> en caso contrario.
 * @throws IOException En caso de problemas leyendo el fichero */
@SuppressWarnings("unused")
static boolean isCAdESData(final byte[] data) throws IOException {

    // LEEMOS EL FICHERO QUE NOS INTRODUCEN
    final ASN1InputStream is = new ASN1InputStream(data);
    final Enumeration<?> e;
    try {
        e = ((ASN1Sequence) is.readObject()).getObjects();
    } catch (final ClassCastException ex) {
        // No es una secuencia
        return false;
    } finally {
        is.close();
    }

    // Elementos que contienen los elementos OID Data
    final ASN1ObjectIdentifier doi = (ASN1ObjectIdentifier) e.nextElement();
    if (!doi.equals(PKCSObjectIdentifiers.data)) {
        return false;
    }

    // Contenido de Data
    final ASN1TaggedObject doj = (ASN1TaggedObject) e.nextElement();

    try {
        /* Los valores de retorno no se usan, solo es para verificar que la
         * conversion ha sido correcta. De no ser asi, se pasaria al manejo
         * de la excepcion. */
        new DEROctetString(doj.getObject());

    } catch (final Exception ex) {
        LOGGER.info("Los datos proporcionados no son de tipo Data: " + ex); //$NON-NLS-1$
        return false;
    }

    return true;
}

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

License:Open Source License

/** M&eacute;todo que genera la parte que contiene la informaci&oacute;n del
 * Usuario. Se generan los atributos que se necesitan para generar la firma.
 * @param digestAlgorithm Algoritmo de huella digital.
 * @param datos Datos firmados./*from ww  w. jav a 2 s.c om*/
 * @param dataType Identifica el tipo del contenido a firmar.
 * @param atrib Lista de atributos firmados que se insertar&aacute;n dentro
 *              del archivo de firma.
 * @return Los atributos firmados de la firma.
 * @throws java.security.NoSuchAlgorithmException Cuando el JRE no soporta alg&uacute;n
 *                                                algoritmo necesario */
private ASN1Set generateSignerInfo(final String digestAlgorithm, final byte[] datos, final String dataType,
        final Map<String, byte[]> atrib) 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
    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 = MessageDigest.getInstance(AOSignConstants.getDigestAlgorithmName(digestAlgorithm))
            .digest(datos);

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

}