2010-02-08 8 views
0

BouncyCastle을 사용하여 데이터에 서명하고 봉투하는 응용 프로그램을 작성하고 있습니다.CMSSignedDataStreamGenerator 해시가 일치하지 않습니다.

대용량 파일에 서명해야하므로 CMSSignedDataGenerator (작은 파일에도 잘 적용됨) 대신 CMSSignedDataStreamGenerator을 사용했습니다. 서명 된 파일이 생성되고 있지만 SHA1 해시가 원본 파일과 일치하지 않습니다. 당신이 나를 도울 수?

Here`s 코드 :

try { 

     int buff = 16384; 
     byte[] buffer = new byte[buff]; 
     int unitsize = 0; 
     long read = 0; 
     long offset = file.length(); 
     FileInputStream is = new FileInputStream(file); 
     FileOutputStream bOut = new FileOutputStream("teste.p7s"); 
     Certificate cert = keyStore.getCertificate(alias); 
     PrivateKey key = (PrivateKey) keyStore.getKey(alias, null); 
     Certificate[] chain = keyStore.getCertificateChain(alias); 
     CertStore certStore = CertStore.getInstance("Collection",new CollectionCertStoreParameters(Arrays.asList(chain))); 
     CMSSignedDataStreamGenerator gen = new CMSSignedDataStreamGenerator(); 
     gen.addSigner(key, (X509Certificate) cert, CMSSignedDataGenerator.DIGEST_SHA1, "SunPKCS11-iKey2032"); 
     gen.addCertificatesAndCRLs(certStore); 
     OutputStream sigOut = gen.open(bOut,true); 

     while (read < offset) { 
      unitsize = (int) (((offset - read) >= buff) ? buff : (offset - read)); 
      is.read(buffer, 0, unitsize); 
      sigOut.write(buffer); 
      read += unitsize; 
     } 
     sigOut.close(); 
     bOut.close(); 
     is.close(); 

나는 내가 잘못 알고하지 않습니다.

+0

가 작동하는 것 같다. 나는 그것이 마지막 버퍼 반복에서 0이나 null을 처리하고 있다고 생각한다. 그것을 고칠 수있는 다른 방법이 있습니까? – Paulo

답변

1

한 가지 문제는

is.read(buffer, 0, unitsize); 

FileInputStream.read

만 사이 unitsize 바이트를 읽을 보장 라인입니다.

내가 라스무스 페이버에 동의

int actuallyRead = is.read(buffer, 0, unitsize); 
sigOut.write(buffer, 0, actuallyRead); 
read += actuallyRead; 
2

를 작성하십시오, 읽기/쓰기 루프는 사기입니다.

이 교체 :

while (read < offset) { 
    unitsize = (int) (((offset - read) >= buff) ? buff : (offset - read)); 
    is.read(buffer, 0, unitsize); 
    sigOut.write(buffer); 
    read += unitsize; 
} 

과 : 1

버퍼를 설정
org.bouncycastle.util.io.Streams.pipeAll(is, sigOut); 
관련 문제