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 }