/* DigiDoc4J library * * This software is released under either the GNU Library General Public * License (see LICENSE.LGPL). * * Note that the only valid version of the LGPL license as far as this * project is concerned is the original GNU Library General Public License * Version 2.1, February 1999 */ package org.digidoc4j.impl.bdoc.xades; import org.apache.commons.lang.StringUtils; import org.digidoc4j.impl.bdoc.xades.validation.XadesSignatureValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import eu.europa.esig.dss.SignatureLevel; import eu.europa.esig.dss.x509.SignaturePolicy; import eu.europa.esig.dss.xades.validation.XAdESSignature; public class XadesSignatureParser { private final static Logger logger = LoggerFactory.getLogger(XadesSignatureParser.class); public XadesSignature parse(XadesValidationReportGenerator xadesReportGenerator) { logger.debug("Parsing XAdES signature"); XAdESSignature xAdESSignature = xadesReportGenerator.openDssSignature(); SignatureLevel signatureLevel = xAdESSignature.getDataFoundUpToLevel(); logger.debug("Signature profile is " + signatureLevel); if(isEpesSignature(signatureLevel, xAdESSignature)) { logger.debug("Using EPES signature"); return new EpesSignature(xadesReportGenerator); } if(isBesSignature(signatureLevel)) { logger.debug("Using BES signature"); return new BesSignature(xadesReportGenerator); } if(isTimeMarkSignature(xAdESSignature)) { logger.debug("Using Time Mark signature"); return new TimemarkSignature(xadesReportGenerator); } if (isTimestampArchiveSignature(signatureLevel)) { logger.debug("Using Time Stamp Archive signature"); return new TimestampArchiveSignature(xadesReportGenerator); } logger.debug("Using Timestamp signature"); return new TimestampSignature(xadesReportGenerator); } private boolean isEpesSignature(SignatureLevel signatureLevel, XAdESSignature xAdESSignature) { return isBesSignature(signatureLevel) && containsPolicyId(xAdESSignature); } private boolean isBesSignature(SignatureLevel signatureLevel) { return signatureLevel == SignatureLevel.XAdES_BASELINE_B; } private boolean isTimestampArchiveSignature(SignatureLevel signatureLevel) { return signatureLevel == SignatureLevel.XAdES_BASELINE_LTA || signatureLevel == SignatureLevel.XAdES_A; } private boolean containsPolicyId(XAdESSignature xAdESSignature) { SignaturePolicy policyId = xAdESSignature.getPolicyId(); if (policyId == null) { return false; } return StringUtils.isNotBlank(policyId.getIdentifier()); } private boolean isTimeMarkSignature(XAdESSignature xAdESSignature) { if (!containsPolicyId(xAdESSignature)) { return false; } SignaturePolicy policyId = xAdESSignature.getPolicyId(); String identifier = StringUtils.trim(policyId.getIdentifier()); return StringUtils.equals(XadesSignatureValidator.TM_POLICY, identifier); } }