2017-02-08 30 views
0

Я использовал BouncyCastle для проверки подписи и извлечения информации из файла «.p7m» (исходное содержимое, подписчик и т. Д.).timestamptoken validate java bouncycastle

Теперь мне нужно проверить и извлечь информацию из TimeStamp в том же файле «.p7m».

Как я могу проверить TimeStampToken? Я написал этот код, который хорошо подходит для Подписи, но не проверяет TimeStamp. Я передал переменную «cert» методу build() для проверки подписи и TimeStampToken. Для подписи это нормально, но для TimeStamp он не работает :(

Где ошибаюсь? Заранее спасибо.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.security.Security; 
import java.util.Collection; 
import java.util.Iterator; 

import org.bouncycastle.asn1.ASN1Encodable; 
import org.bouncycastle.asn1.cms.Attribute; 
import org.bouncycastle.asn1.cms.AttributeTable; 
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; 
import org.bouncycastle.cert.X509CertificateHolder; 
import org.bouncycastle.cms.CMSException; 
import org.bouncycastle.cms.CMSProcessable; 
import org.bouncycastle.cms.CMSSignedData; 
import org.bouncycastle.cms.CMSSignedDataParser; 
import org.bouncycastle.cms.SignerInformation; 
import org.bouncycastle.cms.SignerInformationStore; 
import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoVerifierBuilder; 
import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder; 
import org.bouncycastle.tsp.TimeStampToken; 
import org.bouncycastle.util.Store; 

public class Launcher3 { 

    public static void main(String[] args) throws Exception { 

     File myFile=new File("D:\\fdr\\bouncycastle\\New Text Document.txt.p7m"); 
     byte[] bytesArray = readContentIntoByteArray(myFile); 

     FileOutputStream fos = new FileOutputStream("D:\\fdr\\bouncycastle\\New Text Document.txt"); 
     byte[] bytesArrayOriginalFile=getData(bytesArray); 
     fos.write(bytesArrayOriginalFile); 
     fos.close(); 

     verifySign(bytesArray); 

    } 

    static public void verifySign(byte[] signedData) throws Exception { 
      Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

      CMSSignedDataParser  sp = new CMSSignedDataParser(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build(), signedData); 

      sp.getSignedContent().drain(); 

      Store     certStore = sp.getCertificates(); 
      SignerInformationStore signers = sp.getSignerInfos(); 

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

      while (it.hasNext()) 
      { 
       SignerInformation signer = (SignerInformation)it.next(); 
       Collection   certCollection = certStore.getMatches(signer.getSID()); 
       Iterator  certIt = certCollection.iterator(); 
       X509CertificateHolder cert = (X509CertificateHolder)certIt.next(); 

       System.out.println("info 1: "+cert.getIssuer()); 
       System.out.println("info 2: "+cert.getSubject()); 
       System.out.println("date from: "+cert.getNotBefore()); 
       System.out.println("date to: "+cert.getNotAfter()); 
       System.out.println("Serial n. "+cert.getSerialNumber()); 
       System.out.println("verify returns: " + signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert))); 
       // --------------------------------------------------------------------------------------------------------------------^ 
       // LOOK AT HERE: it works! 

       AttributeTable  attrs = signer.getUnsignedAttributes(); 
       Attribute   att = attrs.get(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken); 
       ASN1Encodable  dob = att.getAttrValues().getObjectAt(0); 
       byte[] encodedTsp = dob.toASN1Primitive().getEncoded(); 

       TimeStampToken result = null; 

       if(encodedTsp!=null) { 
        CMSSignedData cms = new CMSSignedData(encodedTsp); 
        result = new TimeStampToken(cms); 

       System.out.println("timestamp: "+result.getTimeStampInfo().getGenTime()); 
       System.out.println("serial n. "+result.getTimeStampInfo().getSerialNumber()); 
       System.out.println("tsa: "+result.getTimeStampInfo().getTsa()); 
       System.out.println("policy: "+result.getTimeStampInfo().getPolicy()); 

       result.validate(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert)); 
       // ------------------------------------------------------------------------------^ 
       // LOOK AT HERE: it doesn't work! 

       } 
      } 
    } 

    static public byte[] getData(final byte[] p7bytes) throws CMSException, IOException { 
     CMSSignedData signedData = new CMSSignedData(p7bytes); 
     CMSProcessable signedContent = signedData.getSignedContent(); 

     return (byte[])signedContent.getContent(); 

     } 

     private static byte[] readContentIntoByteArray(File file) 
     { 
      FileInputStream fileInputStream = null; 
      byte[] bFile = new byte[(int) file.length()]; 
      try 
      { 
      fileInputStream = new FileInputStream(file); 
      fileInputStream.read(bFile); 
      fileInputStream.close(); 
      } 
      catch (Exception e) 
      { 
      e.printStackTrace(); 
      } 
      return bFile; 
     } 

} 
+0

что «это не работает» значит ли это бросать исключение – Egl

+0

к сожалению, проблема в том, что я проверил неправильный сертификат и Ошибка: 'Исключение в потоке" main "org.bouncycastle.tsp.TSPValidationExce ption: hash сертификата не совпадает с хешем certID. '. Я решил! – albaserver

ответ

0

Я решил сам (и я так счастлива). Мне нужно найти сертификат timestamptoken таким образом:?

Store storeTt = result.getCertificates(); 
Collection collTt = storeTt.getMatches(result.getSID()); 
Iterator certIt2 = collTt.iterator(); 
X509CertificateHolder cert2 = (X509CertificateHolder)certIt2.next(); 

System.out.println("timestamp's verify: "+result.isSignatureValid(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert2))); 
result.validate(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert2));