我有带时间戳的文件test.pdf.p7m.tsd.tsd。
我需要按照以下步骤提取所有嵌入文件:
我找到了针对操作3-> 4的解决方案,但是我发现打开tsd文件以使操作1-> 2 e 2-> 3
遇到了一些问题这是我用来从带有时间戳的(* .tsd)文件中检索内容的代码段:
/**
* Extract original document from a TSD timestamped document.
* @param tsdIS
* @return
* @throws IOException
*/
public InputStream getTimeStampedContent(final InputStream tsdIS) throws IOException {
try {
final ASN1StreamParser asn1SP = new ASN1StreamParser(tsdIS);
final ASN1SequenceParser contentInfoSeq = (ASN1SequenceParser) asn1SP.readObject();
org.bouncycastle.asn1.cms.TimeStampedDataParser tsdParser = org.bouncycastle.asn1.cms.TimeStampedDataParser.getInstance(tsdIS);
return new BufferedInputStream(tsdParser.getContent().getOctetStream());
} catch (final Exception e) {
logger.error(e.getMessage(),e);
}
}
但是我必须对bouncycastle库做些错误,因为我从方法中获取的字节例如“ test.pdf.p7m”不是有效的Pcks7文件,但是如果我从“ test.pdf.p7m”开始“我可以恰好提取pdf。
这里是从p7m中提取内容的代码:
/**
* Extract original document from a PKCS#7 signed document.
*/
@Override
public InputStream getSignedContent(final InputStream istream) throws IOException {
CMSSignedDataParser sdp;
try {
sdp = new CMSSignedDataParser(
new JcaDigestCalculatorProviderBuilder().setProvider("BC")
.build(), istream);
} catch (final CMSException e) {
final IOException e1 = new IOException("Error parsing PKCS7 content");
e1.initCause(e);
throw e1;
} catch (OperatorCreationException e) {
final IOException e1 = new IOException("Error initializing PKCS7 decoder.");
e1.initCause(e);
throw e1;
}
final CMSTypedStream ts = sdp.getSignedContent();
return ts.getContentStream();
}
我无法提供有关tsd文件如何创建的任何信息,但是可以通过商业工具进行验证,因此tsd文件的构建良好。