Example usage for org.bouncycastle.cms SignerInformation getSID

List of usage examples for org.bouncycastle.cms SignerInformation getSID

Introduction

In this page you can find the example usage for org.bouncycastle.cms SignerInformation getSID.

Prototype

public SignerId getSID() 

Source Link

Usage

From source file:org.bitrepository.protocol.security.CertificateIDTest.java

License:Open Source License

@Test(groups = { "regressiontest" })
public void positiveCertificateIdentificationTest() throws Exception {
    addDescription("Tests that a certificate can be identified based on the correct signature.");
    addStep("Create CertificateID object based on the certificate used to sign the data",
            "CertificateID object not null");
    Security.addProvider(new BouncyCastleProvider());

    ByteArrayInputStream bs = new ByteArrayInputStream(SecurityTestConstants.getPositiveCertificate()
            .getBytes(SecurityModuleConstants.defaultEncodingType));
    X509Certificate myCertificate = (X509Certificate) CertificateFactory
            .getInstance(SecurityModuleConstants.CertificateType).generateCertificate(bs);
    CertificateID certificateIDfromCertificate = new CertificateID(myCertificate.getIssuerX500Principal(),
            myCertificate.getSerialNumber());

    addStep("Create CertificateID object based on signature", "Certificate object not null");
    byte[] decodeSig = Base64.decode(SecurityTestConstants.getSignature().getBytes());
    CMSSignedData s = new CMSSignedData(
            new CMSProcessableByteArray(
                    SecurityTestConstants.getTestData().getBytes(SecurityModuleConstants.defaultEncodingType)),
            decodeSig);//www .ja  v  a2  s . c o m
    SignerInformation signer = (SignerInformation) s.getSignerInfos().getSigners().iterator().next();
    CertificateID certificateIDfromSignature = new CertificateID(signer.getSID().getIssuer(),
            signer.getSID().getSerialNumber());

    addStep("Assert that the two CertificateID objects are equal", "Assert succeeds");
    Assert.assertEquals(certificateIDfromCertificate, certificateIDfromSignature);
}

From source file:org.bitrepository.protocol.security.CertificateIDTest.java

License:Open Source License

@Test(groups = { "regressiontest" })
public void negativeCertificateIdentificationTest() throws Exception {
    addDescription("Tests that a certificate is not identified based on a incorrect signature.");
    addStep("Create CertificateID object based on a certificate not used for signing the data",
            "CertificateID object not null");
    Security.addProvider(new BouncyCastleProvider());

    ByteArrayInputStream bs = new ByteArrayInputStream(SecurityTestConstants.getNegativeCertificate()
            .getBytes(SecurityModuleConstants.defaultEncodingType));
    X509Certificate myCertificate = (X509Certificate) CertificateFactory
            .getInstance(SecurityModuleConstants.CertificateType).generateCertificate(bs);
    CertificateID certificateIDfromCertificate = new CertificateID(myCertificate.getIssuerX500Principal(),
            myCertificate.getSerialNumber());

    addStep("Create CertificateID object based on signature", "Certificate object not null");
    byte[] decodeSig = Base64.decode(SecurityTestConstants.getSignature().getBytes());
    CMSSignedData s = new CMSSignedData(
            new CMSProcessableByteArray(
                    SecurityTestConstants.getTestData().getBytes(SecurityModuleConstants.defaultEncodingType)),
            decodeSig);/*from  www. j a v  a 2 s  . c  o m*/
    SignerInformation signer = (SignerInformation) s.getSignerInfos().getSigners().iterator().next();
    CertificateID certificateIDfromSignature = new CertificateID(signer.getSID().getIssuer(),
            signer.getSID().getSerialNumber());

    addStep("Assert that the two CertificateID objects are equal", "Assert succeeds");
    Assert.assertNotSame((Object) certificateIDfromCertificate, (Object) certificateIDfromSignature);
}

From source file:org.bitrepository.protocol.security.PermissionStoreTest.java

License:Open Source License

@Test(groups = { "regressiontest" })
public void positiveCertificateRetrievalTest() throws Exception {
    addDescription("Tests that a certificate can be retrieved based on the correct signerId.");
    addStep("Create signer to lookup certificate", "No exceptions");
    byte[] decodeSig = Base64
            .decode(SecurityTestConstants.getSignature().getBytes(SecurityModuleConstants.defaultEncodingType));
    CMSSignedData s = new CMSSignedData(
            new CMSProcessableByteArray(
                    SecurityTestConstants.getTestData().getBytes(SecurityModuleConstants.defaultEncodingType)),
            decodeSig);/*www  .j a v  a  2s  .co m*/
    SignerInformation signer = (SignerInformation) s.getSignerInfos().getSigners().iterator().next();
    addStep("Lookup certificate based on signerId", "No exceptions");
    X509Certificate certificateFromStore = permissionStore.getCertificate(signer.getSID());
    ByteArrayInputStream bs = new ByteArrayInputStream(SecurityTestConstants.getPositiveCertificate()
            .getBytes(SecurityModuleConstants.defaultEncodingType));
    X509Certificate positiveCertificate = (X509Certificate) CertificateFactory
            .getInstance(SecurityModuleConstants.CertificateType).generateCertificate(bs);
    assertEquals(positiveCertificate, certificateFromStore);
}

From source file:org.bitrepository.protocol.security.PermissionStoreTest.java

License:Open Source License

@Test(groups = { "regressiontest" })
public void negativeCertificateRetrievalTest() throws Exception {
    addDescription("Tests that a certificate cannot be retrieved based on the wrong signerId.");
    addStep("Create signer and modify its ID so lookup will fail", "No exceptions");
    byte[] decodeSig = Base64
            .decode(SecurityTestConstants.getSignature().getBytes(SecurityModuleConstants.defaultEncodingType));
    CMSSignedData s = new CMSSignedData(
            new CMSProcessableByteArray(
                    SecurityTestConstants.getTestData().getBytes(SecurityModuleConstants.defaultEncodingType)),
            decodeSig);//from  www.  j  a  va 2  s. c om
    SignerInformation signer = (SignerInformation) s.getSignerInfos().getSigners().iterator().next();
    SignerId signerId = signer.getSID();
    BigInteger serial = signerId.getSerialNumber();
    serial.add(new BigInteger("2"));
    signerId = new SignerId(signerId.getIssuer(), serial);
    addStep("Lookup certificate based on signerId", "No exceptions");
    X509Certificate certificateFromStore = permissionStore.getCertificate(signerId);
    ByteArrayInputStream bs = new ByteArrayInputStream(SecurityTestConstants.getPositiveCertificate()
            .getBytes(SecurityModuleConstants.defaultEncodingType));
    X509Certificate positiveCertificate = (X509Certificate) CertificateFactory
            .getInstance(SecurityModuleConstants.CertificateType).generateCertificate(bs);
    assertEquals(positiveCertificate, certificateFromStore);
}

From source file:org.bitrepository.protocol.security.PermissionStoreTest.java

License:Open Source License

@Test(groups = { "regressiontest" })
public void certificateFingerprintTest() throws Exception {
    addDescription("Tests that a certificate fingerprint can correctly be retrived for a signer.");
    addFixture("Create signer to lookup fingerprint");
    byte[] decodeSig = Base64
            .decode(SecurityTestConstants.getSignature().getBytes(SecurityModuleConstants.defaultEncodingType));
    CMSSignedData s = new CMSSignedData(
            new CMSProcessableByteArray(
                    SecurityTestConstants.getTestData().getBytes(SecurityModuleConstants.defaultEncodingType)),
            decodeSig);/*from   w  w  w.j a v a2s .c o  m*/
    SignerInformation signer = (SignerInformation) s.getSignerInfos().getSigners().iterator().next();

    addStep("Lookup fingerprint based on signerId", "The correct finger print should be returned with openssl"
            + "used to generate reference finger print");
    String certificateFingerprintFromStore = permissionStore.getCertificateFingerprint(signer.getSID());
    String referenceCertificateFingerprint = "68:21:C4:C2:B9:AE:9F:AE:A1:F1:F9:93:35:3C:9F:C4:63:CC:92:59";
    assertEquals(referenceCertificateFingerprint.toLowerCase().replaceAll(":", ""),
            certificateFingerprintFromStore);
}

From source file:org.cryptoworkshop.ximix.client.verify.SignedDataVerifier.java

License:Apache License

/**
 * Verify the passed in CMS signed data, return false on failure.
 *
 * @param cmsData a CMSSignedData object.
 * @return true if signature checks out, false if there is a problem with the signature or the path to its verifying certificate.
 *//*from  w  ww. j  ava 2 s  . com*/
public boolean signatureVerified(CMSSignedData cmsData) {
    Store certs = cmsData.getCertificates();
    SignerInformationStore signers = cmsData.getSignerInfos();

    Collection c = signers.getSigners();
    Iterator it = c.iterator();

    SignerInformation signer = (SignerInformation) it.next();

    try {
        PKIXCertPathBuilderResult result = checkCertPath(signer.getSID(), certs);

        X509Certificate cert = (X509Certificate) result.getCertPath().getCertificates().get(0);

        return signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert));
    } catch (Exception e) {
        return false;
    }
}

From source file:org.cryptoworkshop.ximix.client.verify.SignedDataVerifier.java

License:Apache License

/**
 * Verify the passed in CMS signed data, return false on failure.
 * <p>//from ww w  .j  a v a2s  .c o  m
 * Note: this method assumes the parser has been freshly created and its content not read or drained.
 * </p>
 *
 * @param cmsParser a CMSSignedData object.
 * @return true if signature checks out, false if there is a problem with the signature or the path to its verifying certificate.
 */
public boolean signatureVerified(CMSSignedDataParser cmsParser) throws IOException, CMSException {
    cmsParser.getSignedContent().drain();

    Store certs = cmsParser.getCertificates();
    SignerInformationStore signers = cmsParser.getSignerInfos();

    Collection c = signers.getSigners();
    Iterator it = c.iterator();

    SignerInformation signer = (SignerInformation) it.next();

    try {
        PKIXCertPathBuilderResult result = checkCertPath(signer.getSID(), certs);

        X509Certificate cert = (X509Certificate) result.getCertPath().getCertificates().get(0);

        return signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert));
    } catch (Exception e) {
        // TODO: logging?
        return false;
    }
}

From source file:org.demoiselle.signer.policy.impl.cades.pkcs7.impl.CAdESChecker.java

License:Open Source License

/**
 * Validation is done only on digital signatures with a single signer. Valid
 * only with content of type DATA.: OID ContentType 1.2.840.113549.1.9.3 =
 * OID Data 1.2.840.113549.1.7.1//from  w w w  .jav a  2s .co m
 *
 * @param content Is only necessary to inform if the PKCS7 package is NOT
 *        ATTACHED type. If it is of type attached, this parameter will be
 *        replaced by the contents of the PKCS7 package.
 * @param signedData Value in bytes of the PKCS7 package, such as the
 *        contents of a ".p7s" file. It is not only signature as in the
 *        case of PKCS1.
 */
// TODO: Implementar validao de co-assinaturas

public boolean check(byte[] content, byte[] signedData) throws SignerException {
    Security.addProvider(new BouncyCastleProvider());
    CMSSignedData cmsSignedData = null;
    try {
        if (content == null) {
            if (this.checkHash) {
                cmsSignedData = new CMSSignedData(this.hashes, signedData);
                this.checkHash = false;
            } else {
                cmsSignedData = new CMSSignedData(signedData);
            }

        } else {
            if (this.getAttached(signedData, false) != null) {
                cmsSignedData = new CMSSignedData(signedData);
            } else {
                cmsSignedData = new CMSSignedData(new CMSProcessableByteArray(content), signedData);
            }

        }
    } catch (CMSException ex) {
        throw new SignerException(cadesMessagesBundle.getString("error.invalid.bytes.pkcs7"), ex);
    }

    // Quantidade inicial de assinaturas validadas
    int verified = 0;

    Store<?> certStore = cmsSignedData.getCertificates();
    SignerInformationStore signers = cmsSignedData.getSignerInfos();
    Iterator<?> it = signers.getSigners().iterator();

    // Realizao da verificao bsica de todas as assinaturas
    while (it.hasNext()) {
        SignatureInformations signatureInfo = new SignatureInformations();
        try {
            SignerInformation signerInfo = (SignerInformation) it.next();
            SignerInformationStore signerInfoStore = signerInfo.getCounterSignatures();

            logger.info("Foi(ram) encontrada(s) " + signerInfoStore.size() + " contra-assinatura(s).");

            @SuppressWarnings("unchecked")
            Collection<?> certCollection = certStore.getMatches(signerInfo.getSID());

            Iterator<?> certIt = certCollection.iterator();
            X509CertificateHolder certificateHolder = (X509CertificateHolder) certIt.next();

            X509Certificate varCert = new JcaX509CertificateConverter().getCertificate(certificateHolder);

            CRLValidator cV = new CRLValidator();
            try {
                cV.validate(varCert);
            } catch (CertificateValidatorCRLException cvce) {
                signatureInfo.getValidatorErrors().add(cvce.getMessage());
                logger.info(cvce.getMessage());
            } catch (CertificateRevocationException cre) {
                signatureInfo.getValidatorErrors().add(cre.getMessage());
                logger.info("certificado revogado");
            }

            PeriodValidator pV = new PeriodValidator();
            try {
                pV.validate(varCert);

            } catch (CertificateValidatorException cve) {
                signatureInfo.getValidatorErrors().add(cve.getMessage());
            }

            if (signerInfo.verify(
                    new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(certificateHolder))) {
                verified++;
                logger.info(cadesMessagesBundle.getString("info.signature.valid.seq", verified));
            }

            // recupera atributos assinados
            logger.info(cadesMessagesBundle.getString("info.signed.attribute"));
            String varOIDPolicy = PKCSObjectIdentifiers.id_aa_ets_sigPolicyId.getId();
            AttributeTable signedAttributes = signerInfo.getSignedAttributes();
            if ((signedAttributes == null) || (signedAttributes != null && signedAttributes.size() == 0)) {
                signatureInfo.getValidatorErrors()
                        .add(cadesMessagesBundle.getString("error.signed.attribute.table.not.found"));
                logger.info(cadesMessagesBundle.getString("error.signed.attribute.table.not.found"));
                //throw new SignerException(cadesMessagesBundle.getString("error.signed.attribute.table.not.found"));
            } else {
                //Validando atributos assinados de acordo com a politica
                Attribute idSigningPolicy = null;
                idSigningPolicy = signedAttributes.get(new ASN1ObjectIdentifier(varOIDPolicy));
                if (idSigningPolicy == null) {
                    signatureInfo.getValidatorErrors().add(
                            cadesMessagesBundle.getString("error.pcks7.attribute.not.found", varOIDPolicy));
                } else {
                    for (Enumeration<?> p = idSigningPolicy.getAttrValues().getObjects(); p
                            .hasMoreElements();) {
                        String policyOnSignature = p.nextElement().toString();
                        for (PolicyFactory.Policies pv : PolicyFactory.Policies.values()) {
                            if (policyOnSignature.contains(pv.getUrl())) {
                                setSignaturePolicy(pv);
                                break;
                            }
                        }
                    }
                }
            }
            Date dataHora = null;
            if (signedAttributes != null) {
                // Valida o atributo ContentType
                Attribute attributeContentType = signedAttributes.get(CMSAttributes.contentType);
                if (attributeContentType == null) {
                    signatureInfo.getValidatorErrors().add(
                            cadesMessagesBundle.getString("error.pcks7.attribute.not.found", "ContentType"));
                    //throw new SignerException(cadesMessagesBundle.getString("error.pcks7.attribute.not.found", "ContentType"));
                    logger.info(
                            cadesMessagesBundle.getString("error.pcks7.attribute.not.found", "ContentType"));
                }

                if (!attributeContentType.getAttrValues().getObjectAt(0).equals(ContentInfo.data)) {
                    signatureInfo.getValidatorErrors()
                            .add(cadesMessagesBundle.getString("error.content.not.data"));
                    //throw new SignerException(cadesMessagesBundle.getString("error.content.not.data"));
                    logger.info(cadesMessagesBundle.getString("error.content.not.data"));
                }

                // Validando o atributo MessageDigest
                Attribute attributeMessageDigest = signedAttributes.get(CMSAttributes.messageDigest);
                if (attributeMessageDigest == null) {
                    throw new SignerException(
                            cadesMessagesBundle.getString("error.pcks7.attribute.not.found", "MessageDigest"));
                }
                // Mostra data e  hora da assinatura, no  carimbo de tempo
                Attribute timeAttribute = signedAttributes.get(CMSAttributes.signingTime);

                if (timeAttribute != null) {
                    dataHora = (((ASN1UTCTime) timeAttribute.getAttrValues().getObjectAt(0)).getDate());
                    logger.info(cadesMessagesBundle.getString("info.date.utc", dataHora));
                } else {
                    logger.info(cadesMessagesBundle.getString("info.date.utc", "N/D"));
                }

            }

            if (signaturePolicy == null) {
                signatureInfo.getValidatorErrors().add(
                        cadesMessagesBundle.getString("error.policy.on.component.not.found", varOIDPolicy));
                logger.info(cadesMessagesBundle.getString("error.policy.on.component.not.found"));
            } else {
                if (signaturePolicy.getSignPolicyInfo().getSignatureValidationPolicy().getCommonRules()
                        .getSignerAndVeriferRules().getSignerRules().getMandatedSignedAttr()
                        .getObjectIdentifiers() != null) {
                    for (ObjectIdentifier objectIdentifier : signaturePolicy.getSignPolicyInfo()
                            .getSignatureValidationPolicy().getCommonRules().getSignerAndVeriferRules()
                            .getSignerRules().getMandatedSignedAttr().getObjectIdentifiers()) {
                        String oi = objectIdentifier.getValue();
                        Attribute signedAtt = signedAttributes.get(new ASN1ObjectIdentifier(oi));
                        logger.info(oi);
                        if (signedAtt == null) {
                            signatureInfo.getValidatorErrors().add(cadesMessagesBundle.getString(
                                    "error.signed.attribute.not.found", oi,
                                    signaturePolicy.getSignPolicyInfo().getSignPolicyIdentifier().getValue()));
                        }
                    }
                }
            }

            // recupera os atributos NO assinados
            logger.info(cadesMessagesBundle.getString("info.unsigned.attribute"));
            AttributeTable unsignedAttributes = signerInfo.getUnsignedAttributes();
            if ((unsignedAttributes == null)
                    || (unsignedAttributes != null && unsignedAttributes.size() == 0)) {
                // Apenas info pois a RB no tem atributos no assinados
                logger.info(cadesMessagesBundle.getString("error.unsigned.attribute.table.not.found"));
            }
            if (signaturePolicy != null) {
                // Validando atributos NO assinados de acordo com a politica
                if (signaturePolicy.getSignPolicyInfo().getSignatureValidationPolicy().getCommonRules()
                        .getSignerAndVeriferRules().getSignerRules().getMandatedUnsignedAttr()
                        .getObjectIdentifiers() != null) {
                    for (ObjectIdentifier objectIdentifier : signaturePolicy.getSignPolicyInfo()
                            .getSignatureValidationPolicy().getCommonRules().getSignerAndVeriferRules()
                            .getSignerRules().getMandatedUnsignedAttr().getObjectIdentifiers()) {
                        String oi = objectIdentifier.getValue();
                        Attribute unSignedAtt = unsignedAttributes.get(new ASN1ObjectIdentifier(oi));
                        logger.info(oi);
                        if (unSignedAtt == null) {
                            signatureInfo.getValidatorErrors().add(cadesMessagesBundle.getString(
                                    "error.unsigned.attribute.not.found", oi,
                                    signaturePolicy.getSignPolicyInfo().getSignPolicyIdentifier().getValue()));
                        }
                        if (oi.equalsIgnoreCase(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken.getId())) {
                            //Verificando timeStamp
                            try {
                                byte[] varSignature = signerInfo.getSignature();
                                Timestamp varTimeStampSigner = validateTimestamp(unSignedAtt, varSignature);
                                signatureInfo.setTimeStampSigner(varTimeStampSigner);
                            } catch (Exception ex) {
                                signatureInfo.getValidatorErrors().add(ex.getMessage());
                                // nas assinaturas feitas na applet o unsignedAttributes.get gera exceo.                  
                            }
                        }
                        if (oi.equalsIgnoreCase("1.2.840.113549.1.9.16.2.25")) {
                            logger.info("++++++++++  EscTimeStamp ++++++++++++");
                        }
                    }
                }
            }

            LinkedList<X509Certificate> varChain = (LinkedList<X509Certificate>) CAManager.getInstance()
                    .getCertificateChain(varCert);
            if (varChain.size() < 3) {
                signatureInfo.getValidatorErrors()
                        .add(cadesMessagesBundle.getString("error.no.ca", varCert.getIssuerDN()));
                logger.info(cadesMessagesBundle.getString("error.no.ca", varCert.getIssuerDN()));
            }
            signatureInfo.setSignDate(dataHora);
            signatureInfo.setChain(varChain);
            signatureInfo.setSignaturePolicy(signaturePolicy);
            this.getSignaturesInfo().add(signatureInfo);

        } catch (OperatorCreationException | java.security.cert.CertificateException ex) {
            signatureInfo.getValidatorErrors().add(ex.getMessage());
            logger.info(ex.getMessage());
        } catch (CMSException ex) {
            // When file is mismatch with sign
            if (ex instanceof CMSSignerDigestMismatchException) {
                signatureInfo.getValidatorErrors()
                        .add(cadesMessagesBundle.getString("error.signature.mismatch"));
                logger.info(cadesMessagesBundle.getString("error.signature.mismatch"));
                throw new SignerException(cadesMessagesBundle.getString("error.signature.mismatch"), ex);
            } else {
                signatureInfo.getValidatorErrors()
                        .add(cadesMessagesBundle.getString("error.signature.invalid"));
                logger.info(cadesMessagesBundle.getString("error.signature.invalid"));
                throw new SignerException(cadesMessagesBundle.getString("error.signature.invalid"), ex);
            }
        } catch (ParseException e) {
            signatureInfo.getValidatorErrors().add(e.getMessage());
            logger.info(e.getMessage());
        }
    }
    logger.info(cadesMessagesBundle.getString("info.signature.verified", verified));
    // TODO Efetuar o parsing da estrutura CMS
    return true;
}

From source file:org.demoiselle.signer.policy.impl.cades.pkcs7.impl.CAdESSigner.java

License:Open Source License

/**
 * Validation is done only on digital signatures with a single signer. Valid
 * only with content of type DATA.: OID ContentType 1.2.840.113549.1.9.3 =
 * OID Data 1.2.840.113549.1.7.1/*w  w  w .j av a2s. c  o  m*/
 *
 * @param content Is only necessary to inform if the PKCS7 package is NOT
 *        ATTACHED type. If it is of type attached, this parameter will be
 *        replaced by the contents of the PKCS7 package.
 * @param signedData Value in bytes of the PKCS7 package, such as the
 *        contents of a ".p7s" file. It is not only signature as in the
 *        case of PKCS1.
 * @deprecated moved to CadESChecker
 */
@SuppressWarnings("unchecked")
@Override

public boolean check(byte[] content, byte[] signedData) throws SignerException {
    Security.addProvider(new BouncyCastleProvider());
    CMSSignedData cmsSignedData = null;
    try {
        if (content == null) {
            if (this.checkHash) {
                cmsSignedData = new CMSSignedData(this.hashes, signedData);
                this.checkHash = false;
            } else {
                cmsSignedData = new CMSSignedData(signedData);
            }

        } else {
            cmsSignedData = new CMSSignedData(new CMSProcessableByteArray(content), signedData);
        }
    } catch (CMSException ex) {
        throw new SignerException(cadesMessagesBundle.getString("error.invalid.bytes.pkcs7"), ex);
    }

    // Quantidade inicial de assinaturas validadas
    int verified = 0;

    Store<?> certStore = cmsSignedData.getCertificates();
    SignerInformationStore signers = cmsSignedData.getSignerInfos();
    Iterator<?> it = signers.getSigners().iterator();

    // Realizao da verificao bsica de todas as assinaturas
    while (it.hasNext()) {
        try {
            SignerInformation signer = (SignerInformation) it.next();
            SignerInformationStore s = signer.getCounterSignatures();
            SignatureInformations si = new SignatureInformations();
            logger.info("Foi(ram) encontrada(s) " + s.size() + " contra-assinatura(s).");

            Collection<?> certCollection = certStore.getMatches(signer.getSID());

            Iterator<?> certIt = certCollection.iterator();
            X509CertificateHolder certificateHolder = (X509CertificateHolder) certIt.next();

            X509Certificate varCert = new JcaX509CertificateConverter().getCertificate(certificateHolder);
            PeriodValidator pV = new PeriodValidator();
            try {
                pV.validate(varCert);

            } catch (CertificateValidatorException cve) {
                si.getValidatorErrors().add(cve.getMessage());
            }

            CRLValidator cV = new CRLValidator();
            try {
                cV.validate(varCert);
            } catch (CertificateValidatorCRLException cvce) {
                si.getValidatorErrors().add(cvce.getMessage());
            }

            if (signer.verify(
                    new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(certificateHolder))) {
                verified++;
                logger.info(cadesMessagesBundle.getString("info.signature.valid.seq", verified));
            }

            // Realiza a verificao dos atributos assinados
            logger.info(cadesMessagesBundle.getString("info.signed.attribute"));
            AttributeTable signedAttributes = signer.getSignedAttributes();
            if ((signedAttributes == null) || (signedAttributes != null && signedAttributes.size() == 0)) {
                throw new SignerException(
                        cadesMessagesBundle.getString("error.signed.attribute.table.not.found"));
            }

            // Realiza a verificao dos atributos no assinados
            logger.info(cadesMessagesBundle.getString("info.unsigned.attribute"));
            AttributeTable unsignedAttributes = signer.getUnsignedAttributes();
            if ((unsignedAttributes == null)
                    || (unsignedAttributes != null && unsignedAttributes.size() == 0)) {
                logger.info(cadesMessagesBundle.getString("error.unsigned.attribute.table.not.found"));
            }

            // Mostra data e  hora da assinatura, no  carimbo de tempo
            Attribute signingTime = signedAttributes.get(CMSAttributes.signingTime);
            Date dataHora = null;
            if (signingTime != null) {
                dataHora = (((ASN1UTCTime) signingTime.getAttrValues().getObjectAt(0)).getDate());
                logger.info(cadesMessagesBundle.getString("info.date.utc", dataHora));
            } else {
                logger.info(cadesMessagesBundle.getString("info.date.utc", "N/D"));
            }

            logger.info(cadesMessagesBundle.getString("info.attribute.validation"));
            // Valida o atributo ContentType
            Attribute attributeContentType = signedAttributes.get(CMSAttributes.contentType);
            if (attributeContentType == null) {
                throw new SignerException(
                        cadesMessagesBundle.getString("error.pcks7.attribute.not.found", "ContentType"));
            }

            if (!attributeContentType.getAttrValues().getObjectAt(0).equals(ContentInfo.data)) {
                throw new SignerException(cadesMessagesBundle.getString("error.content.not.data"));
            }

            // Validando o atributo MessageDigest
            Attribute attributeMessageDigest = signedAttributes.get(CMSAttributes.messageDigest);
            if (attributeMessageDigest == null) {
                throw new SignerException(
                        cadesMessagesBundle.getString("error.pcks7.attribute.not.found", "MessageDigest"));
            }

            // Validando o atributo MessageDigest
            Attribute idSigningPolicy = null;
            idSigningPolicy = signedAttributes
                    .get(new ASN1ObjectIdentifier(PKCSObjectIdentifiers.id_aa_ets_sigPolicyId.getId()));
            if (idSigningPolicy == null) {
                throw new SignerException(
                        cadesMessagesBundle.getString("error.pcks7.attribute.not.found", "idSigningPolicy"));
            }

            //Verificando timeStamp
            try {
                Attribute attributeTimeStamp = null;
                attributeTimeStamp = unsignedAttributes.get(
                        new ASN1ObjectIdentifier(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken.getId()));
                if (attributeTimeStamp != null) {
                    byte[] varSignature = signer.getSignature();
                    Timestamp varTimeStampSigner = validateTimestamp(attributeTimeStamp, varSignature);
                    si.setTimeStampSigner(varTimeStampSigner);
                }
            } catch (Exception ex) {
                // nas assinaturas feitas na applet o unsignedAttributes.get gera exceo.                  
            }

            LinkedList<X509Certificate> varChain = (LinkedList<X509Certificate>) CAManager.getInstance()
                    .getCertificateChain(varCert);
            si.setSignDate(dataHora);
            si.setChain(varChain);
            si.setSignaturePolicy(signaturePolicy);
            this.getSignatureInfo().add(si);

        } catch (OperatorCreationException | java.security.cert.CertificateException ex) {
            throw new SignerException(ex);
        } catch (CMSException ex) {
            // When file is mismatch with sign
            if (ex instanceof CMSSignerDigestMismatchException)
                throw new SignerException(cadesMessagesBundle.getString("error.signature.mismatch"), ex);
            else
                throw new SignerException(cadesMessagesBundle.getString("error.signature.invalid"), ex);
        } catch (ParseException e) {
            throw new SignerException(e);
        }
    }

    logger.info(cadesMessagesBundle.getString("info.signature.verified", verified));
    // TODO Efetuar o parsing da estrutura CMS
    return true;
}

From source file:org.demoiselle.signer.policy.impl.cades.pkcs7.impl.CAdESSigner.java

License:Open Source License

private Collection<X509Certificate> getSignersCertificates(CMSSignedData previewSignerData) {
    Collection<X509Certificate> result = new HashSet<X509Certificate>();
    Store<?> certStore = previewSignerData.getCertificates();
    SignerInformationStore signers = previewSignerData.getSignerInfos();
    Iterator<?> it = signers.getSigners().iterator();
    while (it.hasNext()) {
        SignerInformation signer = (SignerInformation) it.next();
        @SuppressWarnings("unchecked")
        Collection<?> certCollection = certStore.getMatches(signer.getSID());
        Iterator<?> certIt = certCollection.iterator();
        X509CertificateHolder certificateHolder = (X509CertificateHolder) certIt.next();
        try {//w w  w  .  j  ava 2s . c om
            result.add(new JcaX509CertificateConverter().getCertificate(certificateHolder));
        } catch (CertificateException error) {
        }
    }
    return result;

}