List of usage examples for org.bouncycastle.asn1 DEROctetString DEROctetString
public DEROctetString(ASN1Encodable obj) throws IOException
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ñ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étodo que genera la parte que contiene la informació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án dentro * del archivo de firma. * @return Los atributos firmados de la firma. * @throws java.security.NoSuchAlgorithmException Cuando el JRE no soporta algú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)); }