/* * 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 es.uji.security.crypto.openxades.digidoc; import java.io.Serializable; import java.util.ArrayList; import java.math.BigInteger; import java.security.cert.X509Certificate; import es.uji.security.crypto.openxades.digidoc.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 { /** 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; } /** * 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); ArrayList a = cid.validate(); if (a.size() > 0) errs.addAll(a); } return errs; } /** * Converts the CompleteCertificateRefs to XML form * * @return XML representation of CompleteCertificateRefs */ public byte[] toXML() throws DigiDocException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { bos.write(ConvertUtils.str2data("<CompleteCertificateRefs>")); if (m_unsignedProps.getSignature().getSignedDoc().getVersion().equals( SignedDoc.VERSION_1_3) || m_unsignedProps.getSignature().getSignedDoc().getVersion().equals( SignedDoc.VERSION_1_4)) { bos.write(ConvertUtils.str2data("<CertRefs>\n")); } for (int i = 0; i < countCertIDs(); i++) { CertID cid = getCertID(i); if (cid.getType() != CertID.CERTID_TYPE_SIGNER) { bos.write(cid.toXML()); bos.write(ConvertUtils.str2data("\n")); } } if (m_unsignedProps.getSignature().getSignedDoc().getVersion().equals( SignedDoc.VERSION_1_3) || m_unsignedProps.getSignature().getSignedDoc().getVersion().equals( SignedDoc.VERSION_1_4)) { bos.write(ConvertUtils.str2data("</CertRefs>")); } bos.write(ConvertUtils.str2data("</CompleteCertificateRefs>")); } catch (IOException ex) { DigiDocException.handleException(ex, DigiDocException.ERR_XML_CONVERT); } return bos.toByteArray(); } /** * Returns the stringified form of CompleteCertificateRefs * * @return CompleteCertificateRefs string representation */ public String toString() { String str = null; try { str = new String(toXML()); } catch (Exception ex) { } return str; } }