View Javadoc

1   
2   package es.caib.signatura.api;
3   
4   
5   import java.io.InputStream;
6   import java.io.FileNotFoundException;
7   import java.io.IOException;
8   import java.io.OutputStream;
9   import java.security.UnrecoverableKeyException;
10  import java.security.cert.X509Certificate;
11  import java.util.Date;
12  import java.net.*;
13  
14  /**Interfaz que independiza las implementaciones de firma y verificación de cada entidad certificadora con una
15   * serie de métodos estándar, llevando a cabo la firma digital desacoplada (firma y documento original
16   * se mantienen por separado). Esta firma puede ser avanzada o avanzada con sello de tiempo.
17   * La firma se encapsula con la clase <code>Signature</code>.
18   * 
19   * @author Jesús Reyes (3dígits)
20   * @version 1.0
21   * @see Signature
22   */
23  public interface Signer {
24  
25  	/**
26  	 * Indica que la firma se añadirá en la parte superior del PDF.
27  	 */
28  	static final int PDF_SIGN_POSITION_TOP = 1;
29  	
30  	/**
31  	 * Indica que la firma se añadirá en la parte inferior del PDF.
32  	 */
33  	static final int PDF_SIGN_POSITION_BOTTOM = 2;
34  	
35  	/**
36  	 * Indica que la firma se añadirá en el lado izquierdo del PDF.
37  	 */
38  	static final int PDF_SIGN_POSITION_LEFT = 4;
39  	
40  	/**
41  	 * Indica que la firma se añadirá en el lado derecho del PDF.
42  	 */
43  	static final int PDF_SIGN_POSITION_RIGHT = 8;
44  
45  	/**
46  	 * Indica que no se añadirá ni código de barras ni información del firmante.
47  	 */
48  	static final int PDF_SIGN_POSITION_NONE = 0;
49  
50  	static final int PDF_SIGN_PAGE_LAST = 16;
51  	static final int PDF_SIGN_DEFAULT_SIGNATURE_APPERANCE = 32;
52  
53  
54  /**
55   * Obtiene la lista de certificados disponibles en el almacén de certificados definido por la API 
56   * de la entidad certificadora: disco duro, dispositivo USB, etc.
57   * @return lista de los nombres de certificado disponibles
58   * @throws SignatureCertNotFoundException  si no se encuentra ningún certificado disponible
59   * @throws SignaturePrivKeyException  si no se pueden obtener las claves privadas de los certificados
60   */
61  	public  String[] getCertList(String contentType) throws SignatureCertNotFoundException, SignaturePrivKeyException;
62  
63  /**
64   * Obtiene la firma digital de un documento de disco y la encapsula en un objeto
65   * <code>Signature</code> sin sello de tiempo.
66   * @param fileName nombre del fichero que se desea firmar
67   * @param certificateName nombre del certificado que se usará para firmar
68   * @param password contraseña de la clave privada del usuario
69   * @param contentType tipo MIME del documento a firmar
70   * @return {@link Signature} firma del documento
71   * @throws FileNotFoundException  si no se encuentra el fichero a firmar
72   * @throws IOException  si ha habido algún problema al abrir el fichero
73   * @throws SignatureProviderException  si no se ha podido acceder a la API del proveedor de firma electrónica
74   * @throws SignatureSignException  si ha habido algún problema en el proceso de firma
75   * @throws UnrecoverableKeyException  si la contraseña de la clave privada no es correcta
76   * @throws SignatureException
77   */
78  	public  Signature sign (String fileName, String certificateName, String password, String contentType) 
79            throws IOException, SignatureException;
80  
81  /**
82   * Obtiene la firma digital de un documento pasado como <code>InputStream</code> y la encapsula en un objeto
83   * <code>Signature</code> sin sello de tiempo.
84   * @param contentStream flujo de bytes del documento a firmar
85   * @param certificateName nombre del certificado que se usará para firmar
86   * @param password contraseña de la clave privada del usuario
87   * @param contentType tipo MIME del documento a firmar
88   * @return {@link Signature} firma del documento
89   * @throws IOException  si ha habido algún problema de comunicación al pasar el stream de bytes
90   * del documento
91   * @throws SignatureProviderException  si no se ha podido acceder a la API del proveedor de firma electrónica
92   * @throws SignatureSignException  si ha habido algún problema en el proceso de firma
93   * @throws UnrecoverableKeyException  si la contraseña de la clave privada no es correcta
94   * @throws SignatureException
95   */
96  
97    public  Signature sign (InputStream contentStream, String certificateName, String password, String contentType) 
98            throws IOException, SignatureException;
99  
100   /**
101    * Firma digitalmente de un documento PDF pasado como <code>InputStream</code> y devuelve el mismo PDF firmado
102    * y modificado de forma que, en uno de los bordes del documento que se le indique, aparezca el firmante, 
103    * la url desde la que se puede consultar el PDF y una matriz de puntos en formato PDF417 que continene 
104    * esa misma URL. 
105    * @param contentStream flujo de bytes del documento PDF a firmar
106    * @param certificateName nombre del certificado que se usará para firmar
107    * @param password contraseña de la clave privada del usuario
108    * @param contentType tipo MIME del documento a firmar
109    * @param url URL que se sobreimpresiona sobre el documento firmado
110    * @param position Posición en la que se se sobreimpresionará la url en cada una de las hojas del documento firmado. Pueden ser PDF_SIGN_POSITION_TOP,
111    * PDF_SIGN_POSITION_BOTTOM, PDF_SIGN_POSITION_RIGHT o PDF_SIGN_POSITION_LEFT 
112    * @return documento PDF firmado
113    * @throws IOException  si ha habido algún problema de comunicación al pasar el stream de bytes
114    * del documento
115    * @throws SignatureProviderException  si no se ha podido acceder a la API del proveedor de firma electrónica
116    * @throws SignatureSignException  si ha habido algún problema en el proceso de firma
117    * @throws UnrecoverableKeyException  si la contraseña de la clave privada no es correcta
118    * @throws SignatureException
119    */
120 
121     public void signPDF (InputStream contentStream, OutputStream signedStream, String certificateName, String password, String contentType, String url, int position) 
122             throws IOException, SignatureException;
123   
124   /**
125    * Firma digitalmente de un documento PDF pasado como <code>InputStream</code> y devuelve el mismo PDF firmado
126    * y modificado de forma que, en uno de los bordes del documento que se le indique, aparezca el firmante, 
127    * la url desde la que se puede consultar el PDF y una matriz de puntos en formato PDF417 que continene 
128    * esa misma URL. 
129    * @param contentStream flujo de bytes del documento PDF a firmar
130    * @param certificateName nombre del certificado que se usará para firmar
131    * @param password contraseña de la clave privada del usuario
132    * @param contentType tipo MIME del documento a firmar
133    * @param url URL que se sobreimpresiona sobre el documento firmado
134    * @param position Posición en la que se se sobreimpresionará la url en cada una de las hojas del documento firmado. Pueden ser PDF_SIGN_POSITION_TOP,
135    * PDF_SIGN_POSITION_BOTTOM, PDF_SIGN_POSITION_RIGHT o PDF_SIGN_POSITION_LEFT 
136    * @return documento PDF firmado
137    * @throws IOException  si ha habido algún problema de comunicación al pasar el stream de bytes
138    * del documento
139    * @throws SignatureProviderException  si no se ha podido acceder a la API del proveedor de firma electrónica
140    * @throws SignatureSignException  si ha habido algún problema en el proceso de firma
141    * @throws UnrecoverableKeyException  si la contraseña de la clave privada no es correcta
142    * @throws SignatureException
143    * 
144    * @deprecated
145    */
146 
147     public OutputStream signPDF (InputStream contentStream, String certificateName, String password, String contentType, String url, int position) 
148             throws IOException, SignatureException;
149   
150 /**
151  * Obtiene la firma digital de un documento de una URL y la encapsula en un objeto
152  * <code>Signature</code> sin sello de tiempo.
153  * @param url dirección URL del fichero que se desea firmar
154  * @param certificateName nombre del certificado que se usará para firmar
155  * @param password contraseña de la clave privada del usuario
156  * @param contentType tipo MIME del documento a firmar
157  * @return {@link Signature} firma del documento
158  * @throws FileNotFoundException  si no se encuentra el fichero a firmar
159  * @throws IOException  si ha habido algún problema al abrir el fichero
160  * @throws SignatureProviderException  si no se ha podido acceder a la API del proveedor de firma electrónica
161  * @throws SignatureSignException  si ha habido algún problema en el proceso de firma
162  * @throws UnrecoverableKeyException  si la contraseña de la clave privada no es correcta
163  * @throws SignatureException
164  */
165 	public  Signature sign (URL url, String certificateName, String password, String contentType) 
166           throws IOException, SignatureException;
167 
168 /**
169  * Verifica la firma digital de un documento pasado como stream de bytes a partir de la firma encapsulada
170  * en un objeto <code>Signature</code>
171  * Si la firma requiere sello de tiempo y no dispone de él, se intenta añadir el sello de tiempo
172  * @param contentStream flujo de bytes del documento original
173  * @param signatureData objeto que contiene la firma
174  * @return <code>true</code> si la verificación es correcta y <code>false</code> en caso contrario
175  * @throws SignatureProviderException  si no se ha podido acceder a la API del proveedor de firma electrónica
176  * @throws IOException  si no se ha podido acceder al fichero o si no se ha podido contactar con
177  * el servidor de sello de tiempo
178  * @throws SignatureVerifyException  si no se ha podido realizar el proceso de verificación
179  */
180 	public  boolean verifyAPosterioriTimeStamp(InputStream contentStream, Signature signatureData)
181           throws SignatureProviderException, IOException, SignatureVerifyException;
182 			
183 /**
184  * Verifica la firma digital de un documento pasado como stream de bytes a partir de la firma encapsulada
185  * en un objeto <code>Signature</code>
186  * Si la firma requiere sello de tiempo y no dispone de él, se intenta añadir el sello de tiempo
187  * @param url del documento original
188  * @param signatureData objeto que contiene la firma
189  * @return <code>true</code> si la verificación es correcta y <code>false</code> en caso contrario
190  * @throws SignatureProviderException  si no se ha podido acceder a la API del proveedor de firma electrónica
191  * @throws IOException  si no se ha podido acceder al fichero o si no se ha podido contactar con
192  * el servidor de sello de tiempo
193  * @throws SignatureVerifyException  si no se ha podido realizar el proceso de verificación
194  */
195 	
196 	public  boolean verifyAPosterioriTimeStamp(URL url, Signature signatureData)
197           throws SignatureProviderException, IOException, SignatureVerifyException;
198 			
199 /**
200  * Verifica la firma digital de un documento pasado como stream de bytes a partir de la firma encapsulada
201  * en un objeto <code>Signature</code>
202  * Si la firma requiere sello de tiempo y no dispone de él, se intenta añadir el sello de tiempo
203  * @param nombre del fichero del documento original
204  * @param signatureData objeto que contiene la firma
205  * @return <code>true</code> si la verificación es correcta y <code>false</code> en caso contrario
206  * @throws SignatureProviderException  si no se ha podido acceder a la API del proveedor de firma electrónica
207  * @throws IOException  si no se ha podido acceder al fichero o si no se ha podido contactar con
208  * el servidor de sello de tiempo
209  * @throws SignatureVerifyException  si no se ha podido realizar el proceso de verificación
210  */
211 	public  boolean verifyAPosterioriTimeStamp(String fileName, Signature signatureData)
212           throws SignatureProviderException, IOException, SignatureVerifyException;
213 			
214 /**
215  * Verifica la firma digital de un documento pasado como stream de bytes a partir de la firma encapsulada
216  * en un objeto <code>Signature</code>
217  * La verificación es independiente de si la firma llevaba o no sello de tiempo
218  * @param contentStream flujo de bytes del documento original
219  * @param signatureData objeto que contiene la firma
220  * @return <code>true</code> si la verificación es correcta y <code>false</code> en caso contrario
221  * @throws SignatureProviderException  si no se ha podido acceder a la API del proveedor de firma electrónica
222  * @throws IOException  si no se ha podido acceder al fichero o si no se ha podido contactar con
223  * el servidor de sello de tiempo
224  * @throws SignatureVerifyException  si no se ha podido realizar el proceso de verificación
225  */
226 	public  boolean verify(InputStream contentStream, Signature signatureData)
227           throws SignatureProviderException, IOException, SignatureVerifyException;
228 
229 /**
230  * Verifica la firma digital de un documento almacenado en un fichero de disco,  a partir de la firma encapsulada
231  * en un objeto <code>Signature</code>
232  * La verificación es independiente de si la firma llevaba o no sello de tiempo
233  * @param fileName nombre del fichero del documento original
234  * @param signatureData objeto que contiene la firma
235  * @return <code>true</code> si la verificación es correcta y <code>false</code> en caso contrario
236  * @throws FileNotFoundException  si no existe el fichero del documento a verificar
237  * @throws SignatureProviderException  si no se ha podido acceder a la API del proveedor de firma electrónica
238  * @throws IOException  si no se ha podido acceder al fichero o si no se ha podido contactar con
239  * el servidor de sello de tiempo
240  * @throws SignatureVerifyException si no se ha podido realizar el proceso de verificación
241  */
242   public  boolean verify(String fileName, Signature signatureData) throws 
243           FileNotFoundException, SignatureProviderException, IOException, SignatureVerifyException;
244   
245 
246 /**
247  * Verifica la firma digital de un documento de una URL a partir de la firma encapsulada
248  * en un objeto <code>Signature</code>
249  * La verificación es independiente de si la firma llevaba o no sello de tiempo
250  * @param url dirección URL del fichero del documento original
251  * @param signatureData objeto que contiene la firma
252  * @return <code>true</code> si la verificación es correcta y <code>false</code> en caso contrario
253  * @throws FileNotFoundException  si no existe el fichero del documento a verificar
254  * @throws SignatureProviderException  si no se ha podido acceder a la API del proveedor de firma electrónica
255  * @throws IOException  si no se ha podido acceder al fichero o si no se ha podido contactar con
256  * el servidor de sello de tiempo
257  * @throws SignatureVerifyException si no se ha podido realizar el proceso de verificación
258  */
259   public  boolean verify(URL url, Signature signatureData) throws 
260           SignatureProviderException, IOException, SignatureVerifyException;
261   
262   /**
263    * Obtiene el documento SMIME a partir del documento original y su firma digital
264    * @throws java.io.IOException
265    * @param smime OutputStream con el SMIME obtenido
266    * @param signature firma digital del documento 
267    * @param document InputStream con el documento que se firmó
268    */
269   
270   public void generateSMIME (InputStream document, Signature signature, OutputStream smime) throws IOException;
271   
272   
273   /**
274    * Obtiene el documento SMIME a partir del documento original y el conjunto de firmas digitales obtenidas de firmas el documento.
275    * @param document InputStream con el documento que se firmó 
276    * @param signatures firmas digital del documento 
277    * @param smime  OutputStream con el SMIME obtenido
278    * @throws IOException
279    */
280    public void generateSMIMEParalell(InputStream document, Signature[] signatures, OutputStream smime) throws IOException, SignatureException;
281   
282   /** 
283    * Obtiene la hora oficial que tendría un sello de tiempo generado en ese mismo instante
284    * 
285    * @return Hora Oficial
286  * @param certificateName nombre del certificado que se usará para firmar
287  * @param password contraseña de la clave privada del usuario
288  * @param contentType tipo MIME del documento a firmar
289  * @throws IOException
290  * @throws SignatureException
291    */
292   public Date getCurrentDate(String certificateName, String password, String contentType) throws SignatureTimestampException, SignatureException, IOException;
293 
294   /**
295    * Obtiene la versión del componente
296    * @return versionNumber
297    */
298   public String getAPIVersion ();
299   
300   
301   /**
302    * Devuelve el un SMIMEParser con el que se puede obtener información de un documento smime
303    * 
304    * @param smime el documento smime a interpretar
305    * @return El intérprete que nos permite obtener información del smime.
306    * @throws FileNotFoundException
307    * @throws InstantiationException
308    * @throws IllegalAccessException
309    * @throws IOException
310    * @throws SignatureException
311    */
312   
313   public SMIMEParser getSMIMEParser(InputStream smime) throws FileNotFoundException, InstantiationException, IllegalAccessException, IOException, SignatureException;
314   
315   /**
316    * Devuelve un objeto con información acerca del certificado.
317    * 
318    * @param certificate Certificado que se quiere parsear.
319    * @return Certificado parseado.
320    */
321   public ParsedCertificate parseCertificate(X509Certificate certificateChain);
322 
323 }