/** * Copyright (c) 2006 by Know-Center, Graz, Austria * * This software is the confidential and proprietary information of Know-Center, * Graz, Austria. You shall not disclose such Confidential Information and shall * use it only in accordance with the terms of the license agreement you entered * into with Know-Center. * * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. * * $Id: BinarySignator_1_0_0.java,v 1.1 2006/08/25 17:07:35 wprinz Exp $ */ package at.knowcenter.wag.egov.egiz.framework.signators; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.lowagie.text.pdf.PdfPTable; import at.knowcenter.wag.egov.egiz.PdfAS; import at.knowcenter.wag.egov.egiz.PdfASID; import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException; import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; import at.knowcenter.wag.egov.egiz.framework.SignResult; import at.knowcenter.wag.egov.egiz.framework.Signator; import at.knowcenter.wag.egov.egiz.framework.SignatorFactory; import at.knowcenter.wag.egov.egiz.pdf.BinarySignature; import at.knowcenter.wag.egov.egiz.pdf.IncrementalUpdateInformation; import at.knowcenter.wag.egov.egiz.pdf.ReplaceInfo; import at.knowcenter.wag.egov.egiz.pdf.StringInfo; import at.knowcenter.wag.egov.egiz.pdf.TablePos; import at.knowcenter.wag.egov.egiz.sig.SignatureFieldDefinition; import at.knowcenter.wag.egov.egiz.sig.SignatureObject; import at.knowcenter.wag.egov.egiz.sig.SignatureTypes; import at.knowcenter.wag.exactparser.ByteArrayUtils; /** * Signs the document binary. * *

* In prepareSign, an Incremental Update is created that contains the Signature * block and the egiz dictionary. For formatting the layout, variable values are * filled with placeholders. After the layout has been fixed, all variable * fields (all holes in the byte ranges) are replaced with 0. This document is * then base64 encoded and signed. *

*

* In finishSign, the variable fields (values, /Cert) are replaced with the * values according to the encoding. *

* * @author wprinz */ public class BinarySignator_1_0_0 implements Signator { /** * The Pdf-AS ID of this Signator. */ public static final PdfASID MY_ID = new PdfASID(SignatorFactory.VENDOR, SignatorFactory.TYPE_BINARY, SignatorFactory.VERSION_1_0_0); /** * Default constructor. */ public BinarySignator_1_0_0() { // Default constructor. } /** * @see at.knowcenter.wag.egov.egiz.framework.Signator#prepareSign(byte[], * String, TablePos, boolean) */ public IncrementalUpdateInformation prepareSign(byte[] pdf, String signature_type, TablePos pos, boolean has_SIG_ID) throws PresentableException { try { SignatureObject signature_object = PdfAS.createSignatureObjectFromType(signature_type); signature_object.fillValues((char) BinarySignature.LAYOUT_PLACEHOLDER, has_SIG_ID); signature_object.setKZ(MY_ID); PdfPTable pdf_table = PdfAS.createPdfPTableFromSignatureObject(signature_object); if (pos == null) { String pos_string = SettingsReader.getInstance().getSetting(SignatureTypes.SIG_OBJ + signature_type + ".pos", null); if (pos_string != null) { pos = PdfAS.parsePositionFromPosString(pos_string); pdf_table.setTotalWidth(pos.width); pdf_table.setLockedWidth(true); } else { pos = PdfAS.adjustTableAndCalculatePosition(pdf, pdf_table); } } else { pdf_table.setTotalWidth(pos.width); pdf_table.setLockedWidth(true); } List all_field_definitions = signature_object.getSignatureTypeDefinition().getFieldDefinitions(); List variable_field_definitions = new ArrayList(); for (int i = 0; i < all_field_definitions.size(); i++) { SignatureFieldDefinition sfd = (SignatureFieldDefinition) all_field_definitions.get(i); if (sfd.placeholder_length > 0) { if (sfd.field_name.equals(SignatureTypes.SIG_ID) && has_SIG_ID == false) { continue; } variable_field_definitions.add(sfd); } } IncrementalUpdateInformation iui = BinarySignature.writeIncrementalUpdate(pdf, pdf_table, pos, variable_field_definitions, all_field_definitions); String temp_string = iui.temp_ir_number + " " + iui.temp_ir_generation + " obj"; byte[] temp_bytes = temp_string.getBytes("US-ASCII"); int temp_start = ByteArrayUtils.lastIndexOf(iui.signed_pdf, temp_bytes); byte[] stream_bytes = new byte[] { '>', '>', 's', 't', 'r', 'e', 'a', 'm', 0x0A }; int stream_start = ByteArrayUtils.indexOf(iui.signed_pdf, temp_start, stream_bytes); iui.content_stream_start = stream_start + stream_bytes.length; // update the stream indices Iterator it = iui.replaces.iterator(); while (it.hasNext()) { ReplaceInfo ri = (ReplaceInfo) it.next(); Iterator sit = ri.replaces.iterator(); while (sit.hasNext()) { StringInfo si = (StringInfo) sit.next(); si.string_start += iui.content_stream_start; } } // update KZ list indices: it = iui.kz_list.iterator(); while (it.hasNext()) { StringInfo si = (StringInfo) it.next(); si.string_start += iui.content_stream_start; } BinarySignature.markByteRanges(iui); // byte [] old_signed_pdf = iui.signed_pdf; iui.signed_pdf = BinarySignature.prepareDataToSign(iui.signed_pdf, iui.byte_ranges); iui.document_text = BinarySignature.retrieveSignableTextFromData(iui.signed_pdf, iui.signed_pdf.length); // signed_pdf.length); return iui; } catch (UnsupportedEncodingException e) { e.printStackTrace(); throw new PDFDocumentException(201, e); } } /** * @see at.knowcenter.wag.egov.egiz.framework.Signator#finishSign(at.knowcenter.wag.egov.egiz.pdf.IncrementalUpdateInformation) */ public SignResult finishSign(IncrementalUpdateInformation iui) throws PresentableException { // PdfAS.prefixID(iui.signed_signature_object, PdfAS.BINARY_ID); Iterator it = iui.replaces.iterator(); while (it.hasNext()) { ReplaceInfo ri = (ReplaceInfo) it.next(); ri.value = iui.signed_signature_object.getSigValue(ri.sfd.field_name); } BinarySignature.replaceCertificate(iui); BinarySignature.replacePlaceholders(iui); SignResult sign_result = new SignResult(PdfAS.PDF_MIME_TYPE, iui.signed_pdf); return sign_result; } }