List of usage examples for org.bouncycastle.asn1 ASN1EncodableVector ASN1EncodableVector
public ASN1EncodableVector()
From source file:es.gob.afirma.signers.cms.CounterSigner.java
License:Open Source License
/** Método utilizado por la firma de una hoja del érbol para * obtener la contrafirma de los signerInfo de una determinada hoja de forma * recursiva.//w w w . j a va 2 s . c om * @param signerInfo Nodo raí que contiene todos los signerInfos que se * deben firmar. * @param parameters Parámetros necesarios para firmar un determinado * <code>SignerInfo</code> hoja. * @param key Clave privada a usar para firmar. * @param certChain Cadena de certificados del firmante. * @return El SignerInfo raíz parcial con todos sus nodos * Contrafirmados. * @throws java.security.NoSuchAlgorithmException Cuando el JRE no soporta algún algoritmo necesario. * @throws java.io.IOException Si hay errores en la lectura de datos. * @throws java.security.cert.CertificateException Si hay problemas en el tratamiento de los certificados. * @throws AOException Si ocurre cualquier otro problema durante el proceso. */ private SignerInfo getCounterLeafUnsignedAtributes(final SignerInfo signerInfo, final P7ContentSignerParameters parameters, final PrivateKey key, final java.security.cert.Certificate[] certChain) throws NoSuchAlgorithmException, IOException, CertificateException, AOException { final List<Object> attributes = new ArrayList<Object>(); final ASN1EncodableVector signerInfosU = new ASN1EncodableVector(); final ASN1EncodableVector signerInfosU2 = new ASN1EncodableVector(); SignerInfo counterSigner = null; if (signerInfo.getUnauthenticatedAttributes() != null) { final Enumeration<?> eAtributes = signerInfo.getUnauthenticatedAttributes().getObjects(); while (eAtributes.hasMoreElements()) { final Attribute data = Attribute.getInstance(eAtributes.nextElement()); if (!data.getAttrType().equals(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken)) { final ASN1Set setInto = data.getAttrValues(); final Enumeration<?> eAtributesData = setInto.getObjects(); while (eAtributesData.hasMoreElements()) { final Object obj = eAtributesData.nextElement(); if (obj instanceof ASN1Sequence) { final SignerInfo si = SignerInfo.getInstance(obj); final SignerInfo obtained = getCounterLeafUnsignedAtributes(si, parameters, key, certChain); signerInfosU.add(obtained); } else { attributes.add(obj); } } } else { signerInfosU.add(data); } } // FIRMA DE CADA UNO DE LOS HIJOS ASN1Set a1; final ASN1EncodableVector contexExpecific = new ASN1EncodableVector(); if (signerInfosU.size() > 1) { for (int i = 0; i < signerInfosU.size(); i++) { if (signerInfosU.get(i) instanceof Attribute) { contexExpecific.add(signerInfosU.get(i)); } else { contexExpecific.add( new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(i)))); } } a1 = SigUtils.getAttributeSet(new AttributeTable(contexExpecific)); counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(), signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(), signerInfo.getEncryptedDigest(), a1 // unsignedAttr ); } else { if (signerInfosU.size() == 1) { if (signerInfosU.get(0) instanceof Attribute) { // anadimos el que hay contexExpecific.add(signerInfosU.get(0)); // creamos el de la contrafirma. signerInfosU2.add(unsignedAtributte(parameters, signerInfo, key, certChain)); final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2)); contexExpecific.add(uAtrib); } else { contexExpecific.add( new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(0)))); } a1 = SigUtils.getAttributeSet(new AttributeTable(contexExpecific)); counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(), signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(), signerInfo.getEncryptedDigest(), a1 // unsignedAttr ); } else { final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU)); counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(), signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(), signerInfo.getEncryptedDigest(), generateUnsignerInfoFromCounter(uAtrib) // unsignedAttr ); } } } else { signerInfosU2.add(unsignedAtributte(parameters, signerInfo, key, certChain)); final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2)); counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(), signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(), signerInfo.getEncryptedDigest(), new DERSet(uAtrib) // unsignedAttr ); } return counterSigner; }
From source file:es.gob.afirma.signers.cms.CounterSigner.java
License:Open Source License
/** Método utilizado por la firma de un nodo del érbol para * obtener la contrafirma de los signerInfo Sin ser recursivo. Esto es por * el caso especial de que puede ser el nodo raiz el nodo a firmar, por lo * que no sería necesario usar la recursividad. * @param signerInfo Nodo raí que contiene todos los signerInfos que se * deben firmar.//from w ww . j a va 2 s.co m * @param parameters Parámetros necesarios para firmar un determinado * <code>SignerInfo</code> hoja. * @param key Clave privada a usar para firmar. * @param certChain Cadena de certificados del firmante. * @return El SignerInfo raíz parcial con todos sus nodos * Contrafirmados. * @throws java.security.NoSuchAlgorithmException Cuando el JRE no soporta algún algoritmo necesario. * @throws java.io.IOException Si hay errores en la lectura de datos. * @throws java.security.cert.CertificateException Si hay problemas en el tratamiento de los certificados. */ private SignerInfo getCounterNodeUnsignedAtributes(final SignerInfo signerInfo, final P7ContentSignerParameters parameters, final PrivateKey key, final java.security.cert.Certificate[] certChain) throws NoSuchAlgorithmException, IOException, CertificateException { final List<Object> attributes = new ArrayList<Object>(); final ASN1EncodableVector signerInfosU = new ASN1EncodableVector(); final ASN1EncodableVector signerInfosU2 = new ASN1EncodableVector(); SignerInfo counterSigner = null; if (signerInfo.getUnauthenticatedAttributes() != null) { final Enumeration<?> eAtributes = signerInfo.getUnauthenticatedAttributes().getObjects(); while (eAtributes.hasMoreElements()) { final Attribute data = Attribute.getInstance(eAtributes.nextElement()); if (!data.getAttrType().equals(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken)) { final ASN1Set setInto = data.getAttrValues(); final Enumeration<?> eAtributesData = setInto.getObjects(); while (eAtributesData.hasMoreElements()) { final Object obj = eAtributesData.nextElement(); if (obj instanceof ASN1Sequence) { signerInfosU.add(SignerInfo.getInstance(obj)); } else { attributes.add(obj); } } } else { signerInfosU.add(data); } } // FIRMA DEL NODO ACTUAL signerInfosU.add(unsignedAtributte(parameters, signerInfo, key, certChain)); // FIRMA DE CADA UNO DE LOS HIJOS ASN1Set a1; final ASN1EncodableVector contexExpecific = new ASN1EncodableVector(); if (signerInfosU.size() > 1) { for (int i = 0; i < signerInfosU.size(); i++) { if (signerInfosU.get(i) instanceof Attribute) { contexExpecific.add(signerInfosU.get(i)); } else { contexExpecific.add( new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(i)))); } } a1 = SigUtils.getAttributeSet(new AttributeTable(contexExpecific)); counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(), signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(), signerInfo.getEncryptedDigest(), a1 // unsignedAttr ); } else { if (signerInfosU.size() == 1) { if (signerInfosU.get(0) instanceof Attribute) { // anadimos el que hay contexExpecific.add(signerInfosU.get(0)); // creamos el de la contrafirma. signerInfosU2.add(unsignedAtributte(parameters, signerInfo, key, certChain)); final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2)); contexExpecific.add(uAtrib); } else { contexExpecific.add( new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(0)))); } a1 = SigUtils.getAttributeSet(new AttributeTable(contexExpecific)); counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(), signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(), signerInfo.getEncryptedDigest(), a1 // unsignedAttr ); } else { final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU)); counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(), signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(), signerInfo.getEncryptedDigest(), generateUnsignerInfoFromCounter(uAtrib) // unsignedAttr ); } } } else { signerInfosU2.add(unsignedAtributte(parameters, signerInfo, key, certChain)); final Attribute uAtrib = new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU2)); counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(), signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(), signerInfo.getEncryptedDigest(), new DERSet(uAtrib) // unsignedAttr ); } return counterSigner; }
From source file:es.gob.afirma.signers.cms.CounterSigner.java
License:Open Source License
/** Método utilizado por la firma de un nodo del érbol para * obtener la contrafirma de los signerInfo buscando el nodo de forma * recursiva./*from ww w . j av a2 s.c o m*/ * @param signerInfo Nodo raí que contiene todos los signerInfos que se * deben firmar. * @param parameters Parámetros necesarios para firmar un determinado * <code>SignerInfo</code> hoja. * @param key Clave privada a usar para firmar. * @param certChain Cadena de certificados del firmante. * @param node Nodo específico a firmar. * @return El <code>SignerInfo</code> raíz parcial con todos sus nodos * Contrafirmados. * @throws java.security.NoSuchAlgorithmException Cuando el JRE no soporta algún algoritmo necesario. * @throws java.io.IOException Si hay errores en la lectura de datos. * @throws java.security.cert.CertificateException Si hay problemas en el tratamiento de los certificados. * @throws AOException Si ocurre cualquier otro problema durante el proceso. */ private SignerInfo getCounterNodeUnsignedAtributes(final SignerInfo signerInfo, final P7ContentSignerParameters parameters, final PrivateKey key, final java.security.cert.Certificate[] certChain, final int node) throws NoSuchAlgorithmException, IOException, CertificateException, AOException { final List<Object> attributes = new ArrayList<Object>(); final ASN1EncodableVector signerInfosU = new ASN1EncodableVector(); SignerInfo counterSigner = null; if (signerInfo.getUnauthenticatedAttributes() != null) { final Enumeration<?> eAtributes = signerInfo.getUnauthenticatedAttributes().getObjects(); while (eAtributes.hasMoreElements()) { final Attribute data = Attribute.getInstance(eAtributes.nextElement()); if (!data.getAttrType().equals(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken)) { final ASN1Set setInto = data.getAttrValues(); final Enumeration<?> eAtributesData = setInto.getObjects(); while (eAtributesData.hasMoreElements()) { final Object obj = eAtributesData.nextElement(); if (obj instanceof ASN1Sequence) { final ASN1Sequence atrib = (ASN1Sequence) obj; final SignerInfo si = SignerInfo.getInstance(atrib); this.actualIndex++; if (this.actualIndex != node) { if (this.actualIndex < node) { signerInfosU.add( getCounterNodeUnsignedAtributes(si, parameters, key, certChain, node)); } else { signerInfosU.add(si); } } else { signerInfosU.add(getCounterNodeUnsignedAtributes(si, parameters, key, certChain)); } } else { attributes.add(obj); } } } else { signerInfosU.add(data); } } // FIRMA DE CADA UNO DE LOS HIJOS ASN1Set a1; final ASN1EncodableVector contexExpecific = new ASN1EncodableVector(); if (signerInfosU.size() > 1) { for (int i = 0; i < signerInfosU.size(); i++) { if (signerInfosU.get(i) instanceof Attribute) { contexExpecific.add(signerInfosU.get(i)); } else { contexExpecific.add( new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(i)))); } } a1 = SigUtils.getAttributeSet(new AttributeTable(contexExpecific)); counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(), signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(), signerInfo.getEncryptedDigest(), a1 // unsignedAttr ); } else { if (signerInfosU.size() == 1) { if (signerInfosU.get(0) instanceof Attribute) { // anadimos el que hay contexExpecific.add(signerInfosU.get(0)); // creamos el de la contrafirma. } else { contexExpecific.add( new Attribute(CMSAttributes.counterSignature, new DERSet(signerInfosU.get(0)))); } a1 = SigUtils.getAttributeSet(new AttributeTable(contexExpecific)); counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(), signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(), signerInfo.getEncryptedDigest(), a1 // unsignedAttr ); } } } else { counterSigner = new SignerInfo(signerInfo.getSID(), signerInfo.getDigestAlgorithm(), signerInfo.getAuthenticatedAttributes(), signerInfo.getDigestEncryptionAlgorithm(), signerInfo.getEncryptedDigest(), null // unsignedAttr ); } return counterSigner; }
From source file:es.gob.afirma.signers.cms.CounterSigner.java
License:Open Source License
/** Genera la parte que contiene la información del * Usuario. Se generan los atributos que se necesitan para generar la * firma./*from w w w. j a va 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ú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.GenSignedData.java
License:Open Source License
/** Genera una firma digital usando el sistema conocido como * <code>SignedData</code> y que podrá ser con el contenido del fichero codificado * o sólo como referencia del fichero. * @param parameters Parámetros necesarios para obtener los datos de * <code>SignedData</code>. * @param omitContent Parámetro que indica si en la firma va el contenido del * fichero o sólo va de forma referenciada. * @param applyTimestamp Si se aplica la marca de tiempo o no. * @param dataType Identifica el tipo del contenido a firmar. * @param key Clave privada del firmante. * @param certChain Cadena de certificados del firmante. * @param atrib Atributos firmados opcionales. * @param uatrib Atributos no autenticados firmados opcionales. * @param messageDigest Huella digital a aplicar en la firma. * @return La firma generada codificada. * @throws java.security.NoSuchAlgorithmException Si no se soporta alguno de los algoritmos de firma o huella * digital * @throws java.security.cert.CertificateException Si se produce alguna excepción con los certificados de * firma. * @throws java.io.IOException Cuando ocurre un error durante el proceso de descifrado * (formato o clave incorrecto,...) * @throws AOException Cuando ocurre un error durante el proceso de descifrado * (formato o clave incorrecto,...) */ byte[] generateSignedData(final P7ContentSignerParameters parameters, final boolean omitContent, final boolean applyTimestamp, final String dataType, final PrivateKey key, final java.security.cert.Certificate[] certChain, final Map<String, byte[]> atrib, final Map<String, byte[]> uatrib, final byte[] messageDigest) throws NoSuchAlgorithmException, CertificateException, IOException, AOException { if (parameters == null) { throw new IllegalArgumentException("Los parametros no pueden ser nulos"); //$NON-NLS-1$ }/*w w w. ja v a2 s . c om*/ // 1. VERSION // la version se mete en el constructor del signedData y es 1 // 2. DIGESTALGORITM // buscamos que timo de algoritmo es y lo codificamos con su OID final ASN1EncodableVector digestAlgs = new ASN1EncodableVector(); final String signatureAlgorithm = parameters.getSignatureAlgorithm(); final String digestAlgorithm = AOSignConstants.getDigestAlgorithmName(signatureAlgorithm); final AlgorithmIdentifier digAlgId = SigUtils.makeAlgId(AOAlgorithmID.getOID(digestAlgorithm)); digestAlgs.add(digAlgId); // 3. CONTENTINFO // si se introduce el contenido o no ContentInfo encInfo; final ASN1ObjectIdentifier contentTypeOID = new ASN1ObjectIdentifier(dataType); // Ya que el contenido puede ser grande, lo recuperamos solo una vez byte[] content2 = null; if (!omitContent) { final ByteArrayOutputStream bOut = new ByteArrayOutputStream(); content2 = parameters.getContent(); final CMSProcessable msg = new CMSProcessableByteArray(content2); try { msg.write(bOut); } catch (final Exception ex) { throw new IOException("Error en la escritura del procesable CMS: " + ex, ex); //$NON-NLS-1$ } encInfo = new ContentInfo(contentTypeOID, new BEROctetString(bOut.toByteArray())); } else { encInfo = new ContentInfo(contentTypeOID, null); } // 4. CERTIFICADOS // obtenemos la lista de certificados ASN1Set certificates = null; if (certChain.length != 0) { final List<ASN1Encodable> ce = new ArrayList<ASN1Encodable>(); for (final java.security.cert.Certificate element : certChain) { ce.add(Certificate.getInstance(ASN1Primitive.fromByteArray(element.getEncoded()))); } certificates = SigUtils.createBerSetFromList(ce); } final ASN1Set certrevlist = null; // 5. SIGNERINFO // raiz de la secuencia de SignerInfo final ASN1EncodableVector signerInfos = new ASN1EncodableVector(); final TBSCertificateStructure tbs = TBSCertificateStructure .getInstance(ASN1Primitive.fromByteArray(((X509Certificate) certChain[0]).getTBSCertificate())); final IssuerAndSerialNumber encSid = new IssuerAndSerialNumber(X500Name.getInstance(tbs.getIssuer()), tbs.getSerialNumber().getValue()); final SignerIdentifier identifier = new SignerIdentifier(encSid); // // ATRIBUTOS // ATRIBUTOS FIRMADOS final ASN1Set signedAttr = generateSignedInfo(digestAlgorithm, content2 != null ? content2 : parameters.getContent(), dataType, applyTimestamp, atrib, messageDigest); // ATRIBUTOS NO FIRMADOS. final ASN1Set unSignedAttr = generateUnsignedInfo(uatrib); // // FIN ATRIBUTOS // digEncryptionAlgorithm final AlgorithmIdentifier encAlgId; try { encAlgId = SigUtils.makeAlgId(AOAlgorithmID.getOID("RSA")); //$NON-NLS-1$ } catch (final Exception e) { throw new IOException("Error de codificacion: " + e, e); //$NON-NLS-1$ } final ASN1OctetString sign2 = firma(signatureAlgorithm, key); signerInfos.add(new SignerInfo(identifier, digAlgId, signedAttr, encAlgId, sign2, unSignedAttr// null //unsignedAttr )); // construimos el Signed Data y lo devolvemos return new ContentInfo(PKCSObjectIdentifiers.signedData, new SignedData(new DERSet(digestAlgs), encInfo, certificates, certrevlist, new DERSet(signerInfos))) .getEncoded(ASN1Encoding.DER); }
From source file:es.gob.afirma.signers.cms.GenSignedData.java
License:Open Source License
/** Genera los atributos firmados. * @param digestAlgorithm Algoritmo Firmado. * @param datos Datos firmados.//from w w w . j a va 2 s . c o m * @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á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ú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
/** Método que genera la parte que contiene la información del * Usuario. Se generan los atributos no firmados. * @param uatrib// www . j a va 2s. c o m * Lista de atributos no firmados que se insertarán dentro * del archivo de firma. * @return Los atributos no firmados de la firma. */ private static ASN1Set generateUnsignedInfo(final Map<String, byte[]> uatrib) { // // ATRIBUTOS // authenticatedAttributes final ASN1EncodableVector contexExpecific = new ASN1EncodableVector(); // agregamos la lista de atributos a mayores. if (uatrib.size() != 0) { final Iterator<Map.Entry<String, byte[]>> it = uatrib.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()))))); } } else { return null; } return SigUtils.getAttributeSet(new AttributeTable(contexExpecific)); }
From source file:es.gob.afirma.signers.multi.cades.CAdESCoSigner.java
License:Open Source License
/** Se crea una cofirma a partir de los datos del firmante, el archivo * que se firma y el archivo que contiene las firmas. * @param parameters//from w w w. j av a 2 s . co m * Parámetros necesarios que contienen tanto la firma del * archivo a firmar como los datos del firmante. * @param signature * Archivo que contiene las firmas. * @param omitContent * Si se omite el contenido o no, es decir,si se hace de forma * Explícita o Implícita. * @param policy Política de firma * @param signingCertificateV2 * <code>true</code> si se desea usar la versión 2 del * atributo <i>Signing Certificate</i> <code>false</code> para * usar la versión 1 * @param key Clave privada usada para firmar. * @param certChain Cadena de certificados del firmante. * @param messageDigest * Hash específico para una firma. * @param contentType Tipo de contenido definido por su OID. * @param contentDescription Descripció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ú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ón con los certificados de * firma.*/ byte[] coSigner(final P7ContentSignerParameters parameters, final byte[] signature, final boolean omitContent, final AdESPolicy policy, final boolean signingCertificateV2, final PrivateKey key, final java.security.cert.Certificate[] certChain, final byte[] messageDigest, final String contentType, final String contentDescription, final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm) throws IOException, NoSuchAlgorithmException, CertificateException { // LEEMOS EL FICHERO QUE NOS INTRODUCEN final ASN1InputStream is = new ASN1InputStream(signature); final ASN1Sequence dsq = (ASN1Sequence) is.readObject(); is.close(); final Enumeration<?> e = dsq.getObjects(); // Elementos que contienen los elementos OID SignedData e.nextElement(); // Contenido de SignedData final ASN1TaggedObject doj = (ASN1TaggedObject) e.nextElement(); final ASN1Sequence contentSignedData = (ASN1Sequence) doj.getObject(); // contenido del SignedData final SignedData sd = SignedData.getInstance(contentSignedData); // 3. CONTENTINFO // si se introduce el contenido o no ContentInfo encInfo = null; final ASN1ObjectIdentifier contentTypeOID = new ASN1ObjectIdentifier(PKCSObjectIdentifiers.data.getId()); // Ya que el contenido puede ser grande, lo recuperamos solo una vez porque se clona // al recuperarlo byte[] content2 = null; if (!omitContent) { final ByteArrayOutputStream bOut = new ByteArrayOutputStream(); content2 = parameters.getContent(); final CMSProcessable msg = new CMSProcessableByteArray(content2); try { msg.write(bOut); } catch (final CMSException ex) { throw new IOException("Error en la escritura del procesable CMS: " + ex, ex); //$NON-NLS-1$ } encInfo = new ContentInfo(contentTypeOID, new BEROctetString(bOut.toByteArray())); } else { encInfo = new ContentInfo(contentTypeOID, null); } // 4. CERTIFICADOS // obtenemos la lista de certificados ASN1Set certificates = null; final ASN1Set certificatesSigned = sd.getCertificates(); final ASN1EncodableVector vCertsSig = new ASN1EncodableVector(); final Enumeration<?> certs = certificatesSigned.getObjects(); // COGEMOS LOS CERTIFICADOS EXISTENTES EN EL FICHERO while (certs.hasMoreElements()) { vCertsSig.add((ASN1Encodable) certs.nextElement()); } if (certChain.length != 0) { final List<ASN1Encodable> ce = new ArrayList<ASN1Encodable>(); for (final java.security.cert.Certificate element : certChain) { ce.add(Certificate.getInstance(ASN1Primitive.fromByteArray(element.getEncoded()))); } certificates = SigUtils.fillRestCerts(ce, vCertsSig); } // buscamos que tipo de algoritmo es y lo codificamos con su OID final String signatureAlgorithm = parameters.getSignatureAlgorithm(); final String digestAlgorithm = AOSignConstants.getDigestAlgorithmName(signatureAlgorithm); final AlgorithmIdentifier digAlgId = SigUtils .makeAlgId(AOAlgorithmID.getOID(AOSignConstants.getDigestAlgorithmName(signatureAlgorithm))); // Identificador del firmante ISSUER AND SERIAL-NUMBER final TBSCertificateStructure tbs = TBSCertificateStructure .getInstance(ASN1Primitive.fromByteArray(((X509Certificate) certChain[0]).getTBSCertificate())); final IssuerAndSerialNumber encSid = new IssuerAndSerialNumber(X500Name.getInstance(tbs.getIssuer()), tbs.getSerialNumber().getValue()); final SignerIdentifier identifier = new SignerIdentifier(encSid); // // ATRIBUTOS ASN1Set signedAttr = null; if (messageDigest == null) { final ASN1EncodableVector contextExpecific = CAdESUtils.generateSignerInfo(certChain[0], digestAlgorithm, content2 != null ? content2 : parameters.getContent(), policy, signingCertificateV2, null, new Date(), false, contentType, contentDescription, ctis, csm); this.signedAttr2 = SigUtils.getAttributeSet(new AttributeTable(contextExpecific)); signedAttr = SigUtils.getAttributeSet(new AttributeTable(contextExpecific)); } else { final ASN1EncodableVector contextExpecific = CAdESUtils.generateSignerInfo(certChain[0], digestAlgorithm, null, policy, signingCertificateV2, messageDigest, new Date(), false, contentType, contentDescription, ctis, csm); this.signedAttr2 = SigUtils.getAttributeSet(new AttributeTable(contextExpecific)); signedAttr = SigUtils.getAttributeSet(new AttributeTable(contextExpecific)); } // digEncryptionAlgorithm final AlgorithmIdentifier encAlgId = SigUtils.makeAlgId(AOAlgorithmID.getOID("RSA")); //$NON-NLS-1$ // 5. SIGNERINFO // raiz de la secuencia de SignerInfo // Obtenemos los signerInfos del SignedData final ASN1Set signerInfosSd = sd.getSignerInfos(); // introducimos los SignerInfos Existentes final ASN1EncodableVector signerInfos = new ASN1EncodableVector(); // introducimos el nuevo SignerInfo del firmante actual. for (int i = 0; i < signerInfosSd.size(); i++) { signerInfos.add(SignerInfo.getInstance(signerInfosSd.getObjectAt(i))); } final ASN1OctetString sign2; try { sign2 = firma(signatureAlgorithm, key, certChain); } catch (final AOException ex) { throw new IOException("Error al realizar la firma: " + ex, ex); //$NON-NLS-1$ } // Creamos los signerInfos del SignedData signerInfos.add(new SignerInfo(identifier, digAlgId, signedAttr, encAlgId, sign2, null)); // construimos el Signed Data y lo devolvemos return new ContentInfo(PKCSObjectIdentifiers.signedData, new SignedData(sd.getDigestAlgorithms(), encInfo, certificates, null, // CRLS no usado new DERSet(signerInfos)// unsignedAttr )).getEncoded(ASN1Encoding.DER); }
From source file:es.gob.afirma.signers.multi.cades.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ítica de firma * @param signingCertificateV2//from w w w .j a v a 2 s. c o m * <code>true</code> si se desea usar la versión 2 del * atributo <i>Signing Certificate</i> <code>false</code> para * usar la versión 1 * @param key Clave privada usada para firmar. * @param certChain Cadena de certificados del firmante. * @param md Huella digital específica para una firma. * @param contentType Tipo de contenido definido por su OID. * @param contentDescription Descripció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ú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ó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, el archivo que se * firma y del archivo que contiene las firmas. * @param parameters Parámetros necesarios que contienen tanto la firma del * archivo a firmar como los datos del firmante. * @param sign Archivo que contiene las firmas. * @param policy Política de firma * @param signingCertificateV2/* www. j a v a 2s. c om*/ * <code>true</code> si se desea usar la versión 2 del * atributo <i>Signing Certificate</i> <code>false</code> para * usar la versión 1 * @param key Clave privada usada para firmar. * @param certChain Cadena de certificados del firmante. * @param messageDigest Hash específico para una firma. * @param contentType Tipo de contenido definido por su OID. * @param contentDescription Descripció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ú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ón con los certificados de firma. */ byte[] coSigner(final P7ContentSignerParameters parameters, final byte[] sign, final AdESPolicy policy, final boolean signingCertificateV2, final PrivateKey key, final java.security.cert.Certificate[] certChain, final byte[] messageDigest, final String contentType, final String contentDescription, final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm) throws IOException, NoSuchAlgorithmException, CertificateException { // LEEMOS EL FICHERO QUE NOS INTRODUCEN final ASN1InputStream is = new ASN1InputStream(sign); 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 (certChain.length != 0) { final List<ASN1Encodable> ce = new ArrayList<ASN1Encodable>(); for (final java.security.cert.Certificate element : certChain) { ce.add(Certificate.getInstance(ASN1Primitive.fromByteArray(element.getEncoded()))); } certificates = SigUtils.fillRestCerts(ce, vCertsSig); } // buscamos que timo de algoritmo es y lo codificamos con su OID final String signatureAlgorithm = parameters.getSignatureAlgorithm(); final String digestAlgorithm = AOSignConstants.getDigestAlgorithmName(signatureAlgorithm); final AlgorithmIdentifier digAlgId = SigUtils.makeAlgId(AOAlgorithmID.getOID(digestAlgorithm)); // Identificador del firmante ISSUER AND SERIAL-NUMBER final TBSCertificateStructure tbs = TBSCertificateStructure .getInstance(ASN1Primitive.fromByteArray(((X509Certificate) certChain[0]).getTBSCertificate())); final IssuerAndSerialNumber encSid = new IssuerAndSerialNumber(X500Name.getInstance(tbs.getIssuer()), tbs.getSerialNumber().getValue()); final SignerIdentifier identifier = new SignerIdentifier(encSid); // // ATRIBUTOS ASN1Set signedAttr = null; if (messageDigest == null) { final ASN1EncodableVector contextExpecific = CAdESUtils.generateSignerInfo(certChain[0], digestAlgorithm, parameters.getContent(), policy, signingCertificateV2, null, new Date(), false, contentType, contentDescription, ctis, csm); this.signedAttr2 = SigUtils.getAttributeSet(new AttributeTable(contextExpecific)); signedAttr = SigUtils.getAttributeSet(new AttributeTable(contextExpecific)); } else { final ASN1EncodableVector contextExpecific = CAdESUtils.generateSignerInfo(certChain[0], digestAlgorithm, null, policy, signingCertificateV2, messageDigest, new Date(), false, contentType, contentDescription, ctis, csm); this.signedAttr2 = SigUtils.getAttributeSet(new AttributeTable(contextExpecific)); signedAttr = SigUtils.getAttributeSet(new AttributeTable(contextExpecific)); } // digEncryptionAlgorithm final AlgorithmIdentifier encAlgId = SigUtils.makeAlgId(AOAlgorithmID.getOID("RSA")); //$NON-NLS-1$ // 5. SIGNERINFO // raiz de la secuencia de SignerInfo // Obtenemos los signerInfos del SignedAndEnvelopedData final ASN1Set signerInfosSd = sd.getSignerInfos(); // introducimos los SignerInfos Existentes final ASN1EncodableVector signerInfos = new ASN1EncodableVector(); // introducimos el nuevo SignerInfo del firmante actual. for (int i = 0; i < signerInfosSd.size(); i++) { final SignerInfo si = SignerInfo.getInstance(signerInfosSd.getObjectAt(i)); signerInfos.add(si); } final ASN1OctetString sign2; try { sign2 = firma(signatureAlgorithm, key, 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); }