Example usage for org.bouncycastle.asn1 ASN1EncodableVector add

List of usage examples for org.bouncycastle.asn1 ASN1EncodableVector add

Introduction

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

Prototype

public void add(ASN1Encodable element) 

Source Link

Usage

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
                .add(new Attribute(CMSAttributes.contentType, new DERSet(new ASN1ObjectIdentifier(dataType))));
    }//from   w  w  w.ja  v a2 s.  c  o  m

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

/** Método que genera la parte que contiene la información del
 * Usuario. Se generan los atributos no firmados.
 * @param uatrib/*w  ww. j av a2s.c om*/
 *        Lista de atributos no firmados que se insertarán dentro
 *        del archivo de firma.
 * @return Los atributos no firmados de la firma. */
static ASN1Set generateUnsignedAtt(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.envelopers.cms.Utils.java

License:Open Source License

static OriginatorInfo checkCertificates(final X509Certificate[] signerCertificateChain, final ASN1Set certs)
        throws IOException, CertificateEncodingException {
    OriginatorInfo origInfo = null;/*from  w ww. ja  v a 2s .  c  o  m*/
    // Si no hay certificados, se deja como esta.
    if (signerCertificateChain.length != 0) {
        // no tiene remitentes
        if (certs == null) {
            ASN1Set certificates = null;
            final ASN1Set certrevlist = null;
            final List<ASN1Encodable> ce = new ArrayList<ASN1Encodable>();
            for (final X509Certificate element : signerCertificateChain) {
                if (element != null) {
                    ce.add(Certificate.getInstance(ASN1Primitive.fromByteArray(element.getEncoded())));
                }
            }
            // se introducen la nueva cadena de certificados.
            if (ce.size() != 0) {
                certificates = SigUtils.createBerSetFromList(ce);
                origInfo = new OriginatorInfo(certificates, certrevlist);
            }
        }
        // tiene remitentes
        else {
            // Se obtienen los certificados que tenia la firma.
            final ASN1EncodableVector v = new ASN1EncodableVector();
            if (certs.getObjectAt(0) instanceof DERSequence) {
                final ASN1EncodableVector subv = new ASN1EncodableVector();
                for (int i = 0; i < certs.size(); i++) {
                    subv.add(certs.getObjectAt(i));
                }
                v.add(new BERSet(subv));
            } else {
                for (int i = 0; i < certs.size(); i++) {
                    v.add(certs.getObjectAt(i));
                }
            }

            ASN1Set certificates = null;
            final ASN1Set certrevlist = new BERSet(new ASN1EncodableVector());
            final List<ASN1Encodable> ce = new ArrayList<ASN1Encodable>();
            for (final X509Certificate element : signerCertificateChain) {
                if (element != null) {
                    ce.add(Certificate.getInstance(ASN1Primitive.fromByteArray(element.getEncoded())));
                }
            }
            // se introducen la nueva cadena de certificados.
            if (ce.size() != 0) {
                certificates = SigUtils.createBerSetFromList(ce);
                v.add(certificates);
                origInfo = new OriginatorInfo(new BERSet(v), certrevlist);
            }
        }
    }
    return origInfo;
}

From source file:es.gob.afirma.envelopers.cms.Utils.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.
 * @param digestAlgorithm Identifica el algoritmo utilizado firmado.
 * @param datos Datos firmados.//  w  ww. j  a va  2s .co  m
 * @param dataType Identifica el tipo del contenido a firmar.
 * @param uatrib Conjunto de atributos no 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. */
static ASN1Set generateSignerInfo(final String digestAlgorithm, final byte[] datos, final String dataType,
        final Map<String, byte[]> uatrib) throws NoSuchAlgorithmException {

    // // ATRIBUTOS

    // authenticatedAttributes
    final ASN1EncodableVector contexExpecific = Utils.initContexExpecific(digestAlgorithm, datos, dataType,
            null);

    // agregamos la lista de atributos a mayores.
    if (uatrib.size() != 0) {
        final Iterator<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.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//from   ww  w  .j  av  a  2s  .c o  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

/** Genera una estructura <i>SigningCertificateV2</i> seg&uacute;n RFC 5035:
 *
 * <pre>/*from  w ww  .  j  a v a2s .co m*/
 * id-aa-signingCertificate OBJECT IDENTIFIER ::= { iso(1)
 *      member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9)
 *      smime(16) id-aa(2) 12
 * }
 *
 * SigningCertificate ::=  SEQUENCE {
 *      certs        SEQUENCE OF ESSCertID,
 *      policies     SEQUENCE OF PolicyInformation OPTIONAL
 * }
 * </pre>
 *
 * @param cert Certificado del firmante
 * @param digestAlgorithmName Nombre del algoritmo de huella digital a usar
 * @param policy Pol&iacute;tica de firma
 * @return Estructura <i>SigningCertificate</i> seg&uacute;n RFC 5035
 * @throws CertificateEncodingException Si el certificado proporcionado no es v&aacute;lido
 * @throws NoSuchAlgorithmException Si no se soporta el algoritmo de huella indicado */
private static Attribute getSigningCertificateV1(final X509Certificate cert, final String digestAlgorithmName,
        final AdESPolicy policy) throws CertificateEncodingException, NoSuchAlgorithmException {

    // INICIO SINGNING CERTIFICATE

    /** IssuerSerial ::= SEQUENCE { issuer GeneralNames, serialNumber
     * CertificateSerialNumber } */

    final GeneralName gn = new GeneralName(X500Name.getInstance(cert.getIssuerX500Principal().getEncoded()));
    final GeneralNames gns = new GeneralNames(gn);

    final IssuerSerial isuerSerial = new IssuerSerial(gns, cert.getSerialNumber());

    /** ESSCertID ::= SEQUENCE { certHash Hash, issuerSerial IssuerSerial
     * OPTIONAL }
     * Hash ::= OCTET STRING -- SHA1 hash of entire certificate */
    final byte[] certHash = MessageDigest.getInstance(digestAlgorithmName).digest(cert.getEncoded());
    final ESSCertID essCertID = new ESSCertID(certHash, isuerSerial);

    /** PolicyInformation ::= SEQUENCE { policyIdentifier CertPolicyId,
     * policyQualifiers SEQUENCE SIZE (1..MAX) OF PolicyQualifierInfo
     * OPTIONAL }
     * CertPolicyId ::= OBJECT IDENTIFIER
     * PolicyQualifierInfo ::= SEQUENCE { policyQualifierId
     * PolicyQualifierId, qualifier ANY DEFINED BY policyQualifierId } */

    final SigningCertificate scv;
    if (policy != null && policy.getPolicyIdentifier() != null) {

        /** SigningCertificateV2 ::= SEQUENCE {
         *    certs SEQUENCE OF ESSCertIDv2,
         *    policies SEQUENCE OF PolicyInformation OPTIONAL
         *  } */

        /*
         * HAY QUE HACER UN SEQUENCE, YA QUE EL CONSTRUCTOR DE BOUNCY
         * CASTLE NO TIENE DICHO CONSTRUCTOR.
         */
        final ASN1EncodableVector v = new ASN1EncodableVector();
        v.add(new DERSequence(essCertID));
        v.add(new DERSequence(getPolicyInformation(policy)));
        scv = SigningCertificate.getInstance(new DERSequence(v)); // con politica
    } else {
        scv = new SigningCertificate(essCertID); // Sin politica
    }

    /** id-aa-signingCertificate OBJECT IDENTIFIER ::= {
     *    iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) smime(16) id-aa(2) 12
     *  } */

    return new Attribute(PKCSObjectIdentifiers.id_aa_signingCertificate, new DERSet(scv));
}

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

License:Open Source License

private static Attribute getSigPolicyId(final String digestAlgorithmName, final AdESPolicy policy)
        throws IOException {

    /** SigPolicyId ::= OBJECT IDENTIFIER Politica de firma. */

    final ASN1ObjectIdentifier doiSigPolicyId = new ASN1ObjectIdentifier(
            policy.getPolicyIdentifier().toLowerCase(Locale.US).replace("urn:oid:", "") //$NON-NLS-1$ //$NON-NLS-2$
    );/*w ww.j  a v a 2 s  .c  o  m*/

    /**  OtherHashAlgAndValue ::= SEQUENCE {
     *     hashAlgorithm    AlgorithmIdentifier,
     *     hashValue        OCTET STRING
     *   } */

    // Algoritmo para el hash
    final AlgorithmIdentifier hashid;
    // Si tenemos algoritmo de calculo de hash, lo ponemos
    if (policy.getPolicyIdentifierHashAlgorithm() != null) {
        hashid = SigUtils.makeAlgId(AOAlgorithmID
                .getOID(AOSignConstants.getDigestAlgorithmName(policy.getPolicyIdentifierHashAlgorithm())));
    }
    // Si no tenemos, ponemos el algoritmo de firma.
    else {
        hashid = SigUtils.makeAlgId(AOAlgorithmID.getOID(digestAlgorithmName));
    }

    // Huella del documento
    final byte[] hashed;
    if (policy.getPolicyIdentifierHash() != null) {
        hashed = Base64.decode(policy.getPolicyIdentifierHash());
    } else {
        hashed = new byte[] { 0 };
    }

    final DigestInfo otherHashAlgAndValue = new DigestInfo(hashid, hashed);

    /** AOSigPolicyQualifierInfo ::= SEQUENCE {
     *       SigPolicyQualifierId  SigPolicyQualifierId,
     *       SigQualifier          ANY DEFINED BY policyQualifierId
     *  } */

    AOSigPolicyQualifierInfo spqInfo = null;
    if (policy.getPolicyQualifier() != null) {
        spqInfo = new AOSigPolicyQualifierInfo(policy.getPolicyQualifier().toString());
    }

    /** SignaturePolicyId ::= SEQUENCE {
     *    sigPolicyId           SigPolicyId,
     *    sigPolicyHash         SigPolicyHash,
     *    sigPolicyQualifiers   SEQUENCE SIZE (1..MAX) OF AOSigPolicyQualifierInfo OPTIONAL
     *  } */

    final ASN1EncodableVector v = new ASN1EncodableVector();
    // sigPolicyId
    v.add(doiSigPolicyId);
    // sigPolicyHash
    v.add(otherHashAlgAndValue.toASN1Primitive()); // como sequence
    // sigPolicyQualifiers
    if (spqInfo != null) {
        v.add(new DERSequence(spqInfo.toASN1Primitive()));
    }

    final DERSequence ds = new DERSequence(v);

    return new Attribute(PKCSObjectIdentifiers.id_aa_ets_sigPolicyId, new DERSet(ds.toASN1Primitive()));

}

From source file:es.gob.afirma.signers.cades.CAdESUtils.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.
 *
 * <pre>//from  w w w  . j  ava  2s .  co m
 * SignerInfo ::= SEQUENCE {
 *   version CMSVersion,
 *   sid SignerIdentifier,
 *   digestAlgorithm DigestAlgorithmIdentifier,
 *   signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
 *   signatureAlgorithm SignatureAlgorithmIdentifier,
 *   signature SignatureValue,
 *   unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL
 * }
 *
 * SignerIdentifier ::= CHOICE {
 *   issuerAndSerialNumber IssuerAndSerialNumber,
 *   subjectKeyIdentifier [0] SubjectKeyIdentifier
 * }
 *
 * SignedAttributes ::= SET SIZE (1..MAX) OF Attribute
 *
 * UnsignedAttributes ::= SET SIZE (1..MAX) OF Attribute
 *
 * Attribute ::= SEQUENCE {
 *   attrType OBJECT IDENTIFIER,
 *   attrValues SET OF AttributeValue
 * }
 *
 * AttributeValue ::= ANY
 *
 * SignatureValue ::= OCTET STRING
 * </pre>
 *
 * @param cert Certificado del firmante
 * @param digestAlgorithmName Nombre del algoritmo de huella digital a usar
 * @param data Datos firmados
 * @param policy Pol&iacute;tica de firma
 * @param signingCertificateV2 {@code true} para utilizar la versi&oacute;n 2 del campo
 *                             signingCertificate, {@code false} para utilizar la versi&oacute;n 1.
 * @param dataDigest Huella digital de los datos firmados
 * @param signDate Fecha de la firma (debe establecerse externamente para evitar desincronismos en la firma trif&aacute;sica)
 * @param padesMode <code>true</code> para generar una firma CAdES compatible PAdES, <code>false</code> para generar una firma CAdES normal
 * @param contentType Tipo de contenido definido por su OID.
 * @param contentDescription Descripci&oacute;n textual del tipo de contenido firmado.
 * @param ctis Lista de compromisos adquiridos con esta firma
 * @param csm Metadatos sobre el firmante
 * @return Los datos necesarios para generar la firma referente a los datos del usuario.
 * @throws java.security.NoSuchAlgorithmException Cuando se introduce un algoritmo no v&aacute;lido.
 * @throws java.io.IOException Cuando se produce un error de entrada/salida.
 * @throws CertificateEncodingException Error de codificaci&oacute;n en el certificado. */
public static ASN1EncodableVector generateSignerInfo(final Certificate cert, final String digestAlgorithmName,
        final byte[] data, final AdESPolicy policy, final boolean signingCertificateV2, final byte[] dataDigest,
        final Date signDate, final boolean padesMode, final String contentType, final String contentDescription,
        final List<CommitmentTypeIndicationBean> ctis, final CAdESSignerMetadata csm)
        throws NoSuchAlgorithmException, IOException, CertificateEncodingException {
    // // ATRIBUTOS

    // authenticatedAttributes (http://tools.ietf.org/html/rfc3852#section-11)
    final ASN1EncodableVector contexExpecific = initContexExpecific(digestAlgorithmName, data, dataDigest,
            signDate, padesMode);

    if (signingCertificateV2) {
        contexExpecific.add(getSigningCertificateV2((X509Certificate) cert, digestAlgorithmName, policy));
    } else {
        contexExpecific.add(getSigningCertificateV1((X509Certificate) cert, digestAlgorithmName, policy));
    }

    // SIGPOLICYID ATTRIBUTE

    if (policy != null && policy.getPolicyIdentifier() != null) {
        contexExpecific.add(getSigPolicyId(digestAlgorithmName, policy));
    }

    /** Secuencia con el tipo de contenido firmado. No se agrega en firmas PAdES.
     *
     * ContentHints ::= SEQUENCE {
     *     contentDescription UTF8String (SIZE (1..MAX)) OPTIONAL,
     *     contentType ContentType
     * } */

    if (contentType != null && !padesMode) {
        final ContentHints contentHints;
        if (contentDescription != null) {
            contentHints = new ContentHints(new ASN1ObjectIdentifier(contentType),
                    new DERUTF8String(contentDescription));
        } else {
            contentHints = new ContentHints(new ASN1ObjectIdentifier(contentType));
        }
        contexExpecific.add(new Attribute(PKCSObjectIdentifiers.id_aa_contentHint,
                new DERSet(contentHints.toASN1Primitive())));
    }

    // Atributos adicionales segun seccion 5.11 de RFC 5126

    // commitment-type-indication
    if (ctis != null && ctis.size() > 0) {
        for (final CommitmentTypeIndicationBean ctib : ctis) {
            contexExpecific.add(new Attribute(PKCSObjectIdentifiers.id_aa_ets_commitmentType, new DERSet(
                    CommitmentTypeIndicationsHelper.generateCommitmentTypeIndication(ctib).toASN1Primitive())));
        }
    }

    // id-aa-ets-signerLocation
    if (csm != null && CAdESSignerMetadataHelper.getSignerLocation(csm.getSignerLocation()) != null) {
        contexExpecific.add(new Attribute(PKCSObjectIdentifiers.id_aa_ets_signerLocation,
                new DERSet(CAdESSignerMetadataHelper.getSignerLocation(csm.getSignerLocation()))));
    }

    return contexExpecific;
}

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

License:Open Source License

/** Obtiene un <i>PolicyInformation</i> a partir de los datos de la pol&iacute;tica.
 * Sirve para los datos de SigningCertificate y SigningCertificateV2. Tiene que llevar algunos
 * datos de la pol&iacute;tica.//from ww w.  j a  va  2 s .  c  o  m
 *
 * <pre>
 * PolicyInformation ::= SEQUENCE {
 *       policyIdentifier   CertPolicyId,
 *       policyQualifiers   SEQUENCE SIZE (1..MAX) OF PolicyQualifierInfo OPTIONAL
 * }
 *
 * CertPolicyId ::= OBJECT IDENTIFIER
 *
 * PolicyQualifierInfo ::= SEQUENCE {
 *      policyQualifierId  PolicyQualifierId,
 *      qualifier          ANY DEFINED BY policyQualifierId
 * }
 *
 * -- policyQualifierIds for Internet policy qualifiers
 *
 * id-qt          OBJECT IDENTIFIER ::=  { id-pkix 2 }
 * id-qt-cps      OBJECT IDENTIFIER ::=  { id-qt 1 }
 * id-qt-unotice  OBJECT IDENTIFIER ::=  { id-qt 2 }
 *
 * PolicyQualifierId ::= OBJECT IDENTIFIER ( id-qt-cps | id-qt-unotice )
 *
 * Qualifier ::= CHOICE {
 *      cPSuri           CPSuri,
 *      userNotice       UserNotice
 * }
 *
 * CPSuri ::= IA5String
 *
 * UserNotice ::= SEQUENCE {
 *      noticeRef        NoticeReference OPTIONAL,
 *      explicitText     DisplayText OPTIONAL
 * }
 *
 * NoticeReference ::= SEQUENCE {
 *      organization     DisplayText,
 *      noticeNumbers    SEQUENCE OF INTEGER
 * }
 *
 * DisplayText ::= CHOICE {
 *      ia5String        IA5String      (SIZE (1..200)),
 *      visibleString    VisibleString  (SIZE (1..200)),
 *      bmpString        BMPString      (SIZE (1..200)),
 *      utf8String       UTF8String     (SIZE (1..200))
 * }
 * </pre>
 *
 * @param policy    Pol&iacute;tica de la firma.
 * @return          Estructura con la pol&iacute;tica preparada para insertarla en la firma. */
private static PolicyInformation[] getPolicyInformation(final AdESPolicy policy) {

    if (policy == null) {
        throw new IllegalArgumentException("La politica de firma no puede ser nula en este punto"); //$NON-NLS-1$
    }

    /** PolicyQualifierInfo ::= SEQUENCE {
     *          policyQualifierId  PolicyQualifierId,
     *          qualifier          ANY DEFINED BY policyQualifierId
     *  } */

    final PolicyQualifierId pqid = PolicyQualifierId.id_qt_cps;
    DERIA5String uri = null;

    if (policy.getPolicyQualifier() != null && !policy.getPolicyQualifier().equals("")) { //$NON-NLS-1$
        uri = new DERIA5String(policy.getPolicyQualifier().toString());
    }

    final ASN1EncodableVector v = new ASN1EncodableVector();
    PolicyQualifierInfo pqi = null;
    if (uri != null) {
        v.add(pqid);
        v.add(uri);
        pqi = PolicyQualifierInfo.getInstance(new DERSequence(v));
    }

    /** PolicyInformation ::= SEQUENCE {
     *     policyIdentifier   CertPolicyId,
     *     policyQualifiers   SEQUENCE SIZE (1..MAX) OF PolicyQualifierInfo OPTIONAL
     *  } */

    if (policy.getPolicyQualifier() == null || pqi == null) {
        return new PolicyInformation[] { new PolicyInformation(new ASN1ObjectIdentifier(
                policy.getPolicyIdentifier().toLowerCase(Locale.US).replace("urn:oid:", "") //$NON-NLS-1$ //$NON-NLS-2$
                )) };
    }

    return new PolicyInformation[] { new PolicyInformation(
            new ASN1ObjectIdentifier(policy.getPolicyIdentifier().toLowerCase(Locale.US).replace("urn:oid:", "") //$NON-NLS-1$ //$NON-NLS-2$
            ), new DERSequence(pqi)) };

}

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  va2s  .c  o  m*/

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

    return contexExpecific;
}