private void validateContainer(List<InMemoryDocument> documents) { documents.removeIf(d -> d.getName().equals(META_INF_FOLDER)); long dataFileCount = documents.stream() .filter(d -> !d.getName().startsWith(META_INF_FOLDER)) .filter(d -> !d.getName().endsWith(MIME_TYPE)).count(); long timeStampCount = documents.stream() .filter(d -> d.getName().startsWith(META_INF_FOLDER)) .filter(d -> d.getName().toUpperCase().endsWith(TIMESTAMP_FILE)).count(); long signatureFileCount = documents.stream() .filter(d -> d.getName().startsWith(META_INF_FOLDER)) .filter(d -> getFileFromFullPath(d.getName().toUpperCase()).equals(SIGNATURE_FILE_EXTENSION_P7S) || getFileFromFullPath(d.getName().toUpperCase()).equals(SIGNATURE_FILE_EXTENSION_XML) || getFileFromFullPath(d.getName().toUpperCase()).equals(EVIDENCE_RECORD_FILE_EXTENSION_ERS) || getFileFromFullPath(d.getName().toUpperCase()).equals(EVIDENCE_RECORD_FILE_EXTENSION_XML)).count(); if (dataFileCount != 1 || timeStampCount != 1 || signatureFileCount > 0) { throw new DocumentRequirementsException(); } }
private TimeStampToken getTimeStamp(List<InMemoryDocument> documents) { try { CMSSignedData cms = new CMSSignedData(documents.stream() .filter(d -> d.getName().toUpperCase().endsWith(TIMESTAMP_FILE)).findAny().orElseThrow(IllegalArgumentException::new).getBytes()); return new TimeStampToken(cms); } catch (CMSException | TSPException | IOException e) { throw new MalformedDocumentException(e); } }
private List<Error> validateTimeStamp(List<InMemoryDocument> documents, TimeStampToken timeStampToken) { List<Error> errors = new ArrayList<>(); boolean isSignatureValid = isSignatureValid(timeStampToken); if (!isSignatureValid) { errors.add(mapError("Signature not intact")); } byte[] dataFile = documents.stream() .filter(d -> !d.getName().startsWith(META_INF_FOLDER)) .filter(d -> !d.getName().endsWith(MIME_TYPE)).findAny().orElseThrow(IllegalArgumentException::new).getBytes(); boolean isMessageImprintsValid = isMessageImprintsValid(dataFile, timeStampToken); if (isSignatureValid && !isMessageImprintsValid) { errors.add(mapError("Signature not intact")); } boolean isVersionValid = isVersionValid(timeStampToken); if (!isVersionValid) { errors.add(mapError("TST version not supported")); } return errors; }
private ProxyDocument generateDataFileProxyDocument(ProxyDocument proxyDocument) { ProxyDocument dataFileDocument = new ProxyDocument(); InMemoryDocument inMemoryDocument = getDataFile(proxyDocument.getBytes()); dataFileDocument.setName(inMemoryDocument.getName()); dataFileDocument.setSignaturePolicy(proxyDocument.getSignaturePolicy()); dataFileDocument.setBytes(inMemoryDocument.getBytes()); return dataFileDocument; }