/* * CompleteCertificateRefs.java * PROJECT: JDigiDoc * DESCRIPTION: Digi Doc functions for creating * and reading signed documents. * AUTHOR: Veiko Sinivee, S|E|B IT Partner Estonia *================================================== * Copyright (C) AS Sertifitseerimiskeskus * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * GNU Lesser General Public Licence is available at * http://www.gnu.org/copyleft/lesser.html *================================================== */ package ee.sk.digidoc; import java.io.Serializable; import java.util.ArrayList; import java.math.BigInteger; import java.security.cert.X509Certificate; import ee.sk.utils.ConvertUtils; import java.io.ByteArrayOutputStream; import java.io.IOException; /** * Models the ETSI CompleteCertificateRefs * element * @author Veiko Sinivee * @version 1.0 */ public class CompleteCertificateRefs implements Serializable { private static final long serialVersionUID = 1L; /** parent object - UnsignedProperties ref */ private UnsignedProperties m_unsignedProps; /** * Creates new CompleteCertificateRefs * and initializes everything to null */ public CompleteCertificateRefs() { m_unsignedProps = null; } /** * Creates new CompleteCertificateRefs. * Rerouted to set those values on responders certid. * @param certId OCSP responders cert id (in XML) * @param digAlg OCSP responders certs digest algorithm id/uri * @param digest OCSP responders certs digest * @param serial OCSP responders certs issuers serial number * @throws DigiDocException for validation errors */ public CompleteCertificateRefs(String certId, String digAlg, byte[] digest, BigInteger serial) throws DigiDocException { CertID cid = new CertID(certId, digAlg, digest, serial, null, CertID.CERTID_TYPE_RESPONDER); addCertID(cid); m_unsignedProps = null; } /** * Creates new CompleteCertificateRefs by using * default values for id and responders cert * Rerouted to set those values on responders certid. * @param sig Signature object * @param respCert OCSP responders cert * @throws DigiDocException for validation errors */ public CompleteCertificateRefs(Signature sig, X509Certificate respCert) throws DigiDocException { CertID cid = new CertID(sig, respCert, CertID.CERTID_TYPE_RESPONDER); sig.addCertID(cid); } /** * return the count of CertID objects * @return count of CertID objects */ public int countCertIDs() { return m_unsignedProps.getSignature().countCertIDs(); } /** * Adds a new CertID object * @param cid new object to be added */ public void addCertID(CertID cid) { m_unsignedProps.getSignature().addCertID(cid); } /** * Retrieves CertID element with the desired index * @param idx CertID index * @return CertID element or null if not found */ public CertID getCertID(int idx) { return m_unsignedProps.getSignature().getCertID(idx); } /** * Retrieves the last CertID element * @return CertID element or null if not found */ public CertID getLastCertId() { return m_unsignedProps.getSignature().getLastCertId(); } /** * Retrieves CertID element with the desired type * @param type CertID type * @return CertID element or null if not found */ public CertID getCertIdOfType(int type) { return m_unsignedProps.getSignature().getCertIdOfType(type); } /** * Retrieves CertID element with the desired type. * If not found creates a new one with this type. * @param type CertID type * @return CertID element * @throws DigiDocException for validation errors */ public CertID getOrCreateCertIdOfType(int type) throws DigiDocException { return m_unsignedProps.getSignature().getOrCreateCertIdOfType(type); } /** * Accessor for UnsignedProperties attribute * @return value of UnsignedProperties attribute */ public UnsignedProperties getUnsignedProperties() { return m_unsignedProps; } /** * Mutator for UnsignedProperties attribute * @param uprops value of UnsignedProperties attribute */ public void setUnsignedProperties(UnsignedProperties uprops) { m_unsignedProps = uprops; } /** * Accessor for certId attribute * Rerouted to get this attribute from CertID sublement. * @return value of certId attribute */ public String getCertId() { CertID cid = getCertIdOfType(CertID.CERTID_TYPE_RESPONDER); if(cid != null) return cid.getId(); else return null; } /** * Mutator for certId attribute. * Rerouted to set this attribute on CertID sublement. * @param str new value for certId attribute * @throws DigiDocException for validation errors */ public void setCertId(String str) throws DigiDocException { CertID cid = getOrCreateCertIdOfType(CertID.CERTID_TYPE_RESPONDER); cid.setId(str); } /** * Accessor for certDigestAlgorithm attribute * Rerouted to get this attribute from CertID sublement. * @return value of certDigestAlgorithm attribute */ public String getCertDigestAlgorithm() { CertID cid = getCertIdOfType(CertID.CERTID_TYPE_RESPONDER); if(cid != null) return cid.getDigestAlgorithm(); else return null; } /** * Mutator for certDigestAlgorithm attribute. * Rerouted to set this attribute on CertID sublement. * @param str new value for certDigestAlgorithm attribute * @throws DigiDocException for validation errors */ public void setCertDigestAlgorithm(String str) throws DigiDocException { CertID cid = getOrCreateCertIdOfType(CertID.CERTID_TYPE_RESPONDER); cid.setDigestAlgorithm(str); } /** * Accessor for certDigestValue attribute * Rerouted to get this attribute from CertID sublement. * @return value of certDigestValue attribute */ public byte[] getCertDigestValue() { CertID cid = getCertIdOfType(CertID.CERTID_TYPE_RESPONDER); if(cid != null) return cid.getDigestValue(); else return null; } /** * Mutator for certDigestValue attribute. * Rerouted to set this attribute on CertID sublement. * @param data new value for certDigestValue attribute * @throws DigiDocException for validation errors */ public void setCertDigestValue(byte[] data) throws DigiDocException { CertID cid = getOrCreateCertIdOfType(CertID.CERTID_TYPE_RESPONDER); cid.setDigestValue(data); } /** * Accessor for certSerial attribute. * Rerouted to get this attribute from CertID sublement. * @return value of certSerial attribute */ public BigInteger getCertSerial() { CertID cid = getCertIdOfType(CertID.CERTID_TYPE_RESPONDER); if(cid != null) return cid.getSerial(); else return null; } public String getCertIssuer() { CertID cid = getCertIdOfType(CertID.CERTID_TYPE_RESPONDER); if(cid != null) return cid.getIssuer(); else return null; } /** * Mutator for certSerial attribute. * Rerouted to set this attribute on CertID sublement. * @param str new value for certSerial attribute * @throws DigiDocException for validation errors */ public void setCertSerial(BigInteger i) throws DigiDocException { CertID cid = getOrCreateCertIdOfType(CertID.CERTID_TYPE_RESPONDER); cid.setSerial(i); } /** * Helper method to validate the whole * CompleteCertificateRefs object * @return a possibly empty list of DigiDocException objects */ public ArrayList validate() { ArrayList errs = new ArrayList(); for(int i = 0; i < countCertIDs(); i++) { CertID cid = getCertID(i); if(cid != null) { ArrayList a = cid.validate(); if(a.size() > 0) errs.addAll(a); } } return errs; } }