如何打开带有时间戳的文件.tsd以使用bouncycastle恢复嵌入的带有时间戳的文件

时间:2018-10-11 13:55:25

标签: java bouncycastle trusted-timestamp

我有带时间戳的文件test.pdf.p7m.tsd.tsd。

我需要按照以下步骤提取所有嵌入文件:

  1. test.pdf.p7m.tsd.tsd
  2. test.pdf.p7m.tsd
  3. test.pdf.p7m
  4. test.pdf

我找到了针对操作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文件的构建良好。

0 个答案:

没有答案