У меня есть файл отметки времени test.pdf.p7m.tsd.tsd.
Мне нужно извлечь все встроенные файлы, выполнив следующие действия:
- test.pdf.p7m.tsd.tsd
- test.pdf.p7m.tsd
- test.pdf.p7m
- 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 хорошо построен.