You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by "Diego Rodrigues Azevedo (JIRA)" <ji...@apache.org> on 2016/02/11 19:21:19 UTC

[jira] [Updated] (PDFBOX-3230) Can't cast CosObject to CosStream when it is a Stream

     [ https://issues.apache.org/jira/browse/PDFBOX-3230?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Diego Rodrigues Azevedo updated PDFBOX-3230:
--------------------------------------------
    Attachment: TestFile-assinado.pdf

This is a signed PDF, with a DSS dictionary and DocumentTimeStamp to protect the DSS.

> Can't cast CosObject to CosStream when it is a Stream
> -----------------------------------------------------
>
>                 Key: PDFBOX-3230
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-3230
>             Project: PDFBox
>          Issue Type: Bug
>    Affects Versions: 2.0.0
>         Environment: Windows 8.1, Java 8 u60, maven 3.2.2, PDFBOX 2.0.0-RC3
>            Reporter: Diego Rodrigues Azevedo
>         Attachments: TestFile-assinado.pdf
>
>
> Problem:
> When using digital signatures, one can add a DSS dictionary, referencing Certificates, CRLs, OCSPs... saved as Streams (CosStream) in the PDF.
> So, I signed my PDF with a DSS dictionary, and I want to re-sign it, checking if any one of the streams is already there (same certificate chain, maybe same CRLs (if the first signature wasn't made long ago)...)
> How do I do this? I get the latest DSS dictionary and iterate over the COSArray, knowing the elements must be CosStreams. But then I get a ClassCastException, saying CosObject cannot be cast to CosStream. When I check that CosObject in notepad, I can check it is a CosStream
> Code (proof of concept): 
> <code>
> private COSStream createStramIfNotExists(byte[] stream, String dssEntry)
> 			throws IOException {
> 		COSArray things = (COSArray) this.dictionary
> 				.getDictionaryObject(dssEntry);
> 		
> 		ByteArrayOutputStream out = null;
> 		for (COSBase thing : things) {
> 			InputStream input = null;
> 			byte[] aux = null;
> 			try {
> 				System.out.println(thing);
> 				out = new ByteArrayOutputStream();
> 				input = ((COSStream) thing.getCOSObject()).createInputStream();
> 				IOUtils.copy(input, out);
> 				aux = out.toByteArray();
> 			} catch (IOException e) {
> 				e.printStackTrace();
> 			} finally {
> 				IOUtils.closeQuietly(input);
> 				IOUtils.closeQuietly(out);
> 			}
> 			if (Arrays.areEqual(stream, aux)) {
> 				return (COSStream) thing;
> 			}
> 		}
> 		COSStream cosStream = new COSStream();
> 		OutputStream out1 = cosStream.createOutputStream();
> 		out1.write(stream);
> 		out1.close();
> 		
> 		return cosStream;
> 	}
> </code>
> That sysout prints "COSObject{170, 0}" in the PDF attached when my DSS entry is "Certs", and throws the exception on line "input = ((COSStream) thing.getCOSObject()).createInputStream();"
> But if you open the PDF on notepad++ or similar, you'll see that object 170 (170 0 obj) is a stream.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: dev-help@pdfbox.apache.org