Example #1
0
  private List<PdfSignatureOrDocTimestampInfo> getSignatures(
      CertificatePool validationCertPool, byte[] originalBytes) {
    List<PdfSignatureOrDocTimestampInfo> signatures =
        new ArrayList<PdfSignatureOrDocTimestampInfo>();
    ByteArrayInputStream bais = null;
    PDDocument doc = null;
    try {

      bais = new ByteArrayInputStream(originalBytes);
      doc = PDDocument.load(bais);

      List<PDSignature> pdSignatures = doc.getSignatureDictionaries();
      if (CollectionUtils.isNotEmpty(pdSignatures)) {
        logger.debug("{} signature(s) found", pdSignatures.size());

        PdfDict catalog = new PdfBoxDict(doc.getDocumentCatalog().getCOSDictionary(), doc);
        PdfDssDict dssDictionary = PdfDssDict.extract(catalog);

        for (PDSignature signature : pdSignatures) {
          String subFilter = signature.getSubFilter();
          byte[] cms = signature.getContents(originalBytes);

          if (StringUtils.isEmpty(subFilter) || ArrayUtils.isEmpty(cms)) {
            logger.warn("Wrong signature with empty subfilter or cms.");
            continue;
          }

          byte[] signedContent = signature.getSignedContent(originalBytes);
          int[] byteRange = signature.getByteRange();

          PdfSignatureOrDocTimestampInfo signatureInfo = null;
          if (PdfBoxDocTimeStampService.SUB_FILTER_ETSI_RFC3161.getName().equals(subFilter)) {
            boolean isArchiveTimestamp = false;

            // LT or LTA
            if (dssDictionary != null) {
              // check is DSS dictionary already exist
              if (isDSSDictionaryPresentInPreviousRevision(
                  getOriginalBytes(byteRange, signedContent))) {
                isArchiveTimestamp = true;
              }
            }

            signatureInfo =
                new PdfBoxDocTimestampInfo(
                    validationCertPool,
                    signature,
                    dssDictionary,
                    cms,
                    signedContent,
                    isArchiveTimestamp);
          } else {
            signatureInfo =
                new PdfBoxSignatureInfo(
                    validationCertPool, signature, dssDictionary, cms, signedContent);
          }

          if (signatureInfo != null) {
            signatures.add(signatureInfo);
          }
        }
        Collections.sort(signatures, new PdfSignatureOrDocTimestampInfoComparator());
        linkSignatures(signatures);

        for (PdfSignatureOrDocTimestampInfo sig : signatures) {
          logger.debug(
              "Signature "
                  + sig.uniqueId()
                  + " found with byteRange "
                  + Arrays.toString(sig.getSignatureByteRange())
                  + " ("
                  + sig.getSubFilter()
                  + ")");
        }
      }

    } catch (Exception e) {
      logger.warn("Cannot analyze signatures : " + e.getMessage(), e);
    } finally {
      IOUtils.closeQuietly(bais);
      IOUtils.closeQuietly(doc);
    }

    return signatures;
  }