Как открыть файл с меткой времени .tsd для восстановления встроенного файла с меткой времени с помощью bouncycastle - PullRequest
0 голосов
/ 11 октября 2018

У меня есть файл отметки времени 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();
}

Iне может предоставить никакой информации о том, как создается файл tsd, но его можно проверить с помощью коммерческих инструментов, поэтому файл tsd хорошо построен.

...