1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package es.accv.arangi.base.signature;
22
23 import java.lang.reflect.InvocationTargetException;
24 import java.lang.reflect.Method;
25 import java.util.ArrayList;
26 import java.util.List;
27
28 import org.apache.log4j.Logger;
29
30 import es.accv.arangi.base.ArangiObject;
31 import es.accv.arangi.base.certificate.validation.CAList;
32 import es.accv.arangi.base.certificate.validation.CertificateValidationService;
33 import es.accv.arangi.base.document.IDocument;
34 import es.accv.arangi.base.exception.certificate.NormalizeCertificateException;
35 import es.accv.arangi.base.exception.document.HashingException;
36 import es.accv.arangi.base.exception.signature.NoDocumentToSignException;
37 import es.accv.arangi.base.exception.signature.SignatureClassNotFoundException;
38 import es.accv.arangi.base.exception.signature.SignatureException;
39 import es.accv.arangi.base.util.validation.ValidationResult;
40
41
42
43
44
45
46
47 public abstract class Signature extends ArangiObject implements ISignature{
48
49
50
51
52 private static final String RECOGNIZER_METHOD_NAME = "getSignatureInstance";
53
54
55
56
57 static Logger logger = Logger.getLogger(Signature.class);
58
59
60
61
62 private static List<Class> recognizersList;
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 public static ValidationResult[] validateSignature (byte[] bSignature, List<CertificateValidationService> validationServices) throws SignatureClassNotFoundException, HashingException, SignatureException, NormalizeCertificateException, NoDocumentToSignException {
82 logger.debug("[Signature.validateSignature]::Entrada");
83
84 ISignature signature = getSignatureObject (bSignature);
85 return signature.isValid(validationServices);
86 }
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 public static ValidationResult[] validateSignature (byte[] bSignature, CAList caList) throws SignatureClassNotFoundException, HashingException, SignatureException, NormalizeCertificateException, NoDocumentToSignException {
107 logger.debug("[Signature.validateSignature]::Entrada");
108
109 ISignature signature = getSignatureObject (bSignature);
110 return signature.isValid(caList);
111 }
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133 public static ValidationResult[] validateSignature (byte[] bSignature, List<CertificateValidationService> validationServices, CAList caList) throws SignatureClassNotFoundException, HashingException, SignatureException, NormalizeCertificateException, NoDocumentToSignException {
134 logger.debug("[Signature.validateSignature]::Entrada");
135
136 ISignature signature = getSignatureObject (bSignature);
137 ValidationResult[] result = null;
138 try {
139 result = signature.isValid(caList);
140 } catch (Exception e) {
141 logger.debug("[Signature.validateSignature]::No se ha podido validar CAList, probamos con servicios de validación");
142 }
143
144 boolean validarConServicios = false;
145 if (result == null) {
146 validarConServicios = true;
147 } else {
148 for (int i = 0; i < result.length; i++) {
149 if (result[i].getResult() == ValidationResult.RESULT_CERTIFICATE_NOT_BELONGS_TRUSTED_CAS) {
150 validarConServicios = true;
151 }
152 }
153 }
154
155 if (!validarConServicios) {
156 return result;
157 } else {
158 return signature.isValid(validationServices);
159 }
160 }
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177 public static ValidationResult[] validateSignature (IDocument document, byte[] bSignature, List<CertificateValidationService> validationServices) throws SignatureClassNotFoundException, HashingException, SignatureException, NormalizeCertificateException {
178 logger.debug("[Signature.validateSignature]::Entrada");
179
180 ISignature signature = getSignatureObject (bSignature);
181 return signature.isValid(document, validationServices);
182 }
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 public static ValidationResult[] validateSignature (IDocument document, byte[] bSignature, CAList caList) throws SignatureClassNotFoundException, HashingException, SignatureException, NormalizeCertificateException {
201 logger.debug("[Signature.validateSignature]::Entrada");
202
203 ISignature signature = getSignatureObject (bSignature);
204 return signature.isValid(document, caList);
205 }
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225 public static ValidationResult[] validateSignature (IDocument document, byte[] bSignature, List<CertificateValidationService> validationServices, CAList caList) throws SignatureClassNotFoundException, HashingException, SignatureException, NormalizeCertificateException {
226 logger.debug("[Signature.validateSignature]::Entrada");
227
228 ISignature signature = getSignatureObject (bSignature);
229 try {
230 ValidationResult[] result = signature.isValid(document, caList);
231 boolean unknownCertificates = false;
232 for (int i = 0; i < result.length; i++) {
233 if (result[i].getResult() == ValidationResult.RESULT_CERTIFICATE_UNKNOWN ||
234 result[i].getResult() == ValidationResult.RESULT_CERTIFICATE_CANNOT_BE_VALIDATED) {
235 unknownCertificates = true;
236 break;
237 }
238 }
239 if (!unknownCertificates) {
240 return result;
241 }
242 } catch (Exception e) {
243 logger.debug("[Signature.validateSignature]::No se ha podido validar con CAList, probamos con servicios de validación");
244 }
245
246
247 return signature.isValid(document, validationServices);
248 }
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263 public static ValidationResult[] validateSignatureOnly (byte[] bSignature) throws SignatureClassNotFoundException, HashingException, SignatureException, NoDocumentToSignException {
264 logger.debug("[Signature.validateSignatureOnly]::Entrada");
265
266 ISignature signature = getSignatureObject (bSignature);
267 return signature.isValidSignatureOnly();
268 }
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284 public static ValidationResult[] validateSignatureOnly (IDocument document, byte[] bSignature) throws SignatureClassNotFoundException, HashingException, SignatureException, NoDocumentToSignException {
285 logger.debug("[Signature.validateSignatureOnly]::Entrada");
286
287 ISignature signature = getSignatureObject (bSignature);
288 return signature.isValidSignatureOnly(document);
289 }
290
291
292
293
294
295
296
297 public static void addRecognizerClass (Class recognizerClass) {
298 List<Class> recognizerClasses = getRecognizersList();
299 if (!recognizerClasses.contains(recognizerClass)) {
300 recognizerClasses.add(recognizerClass);
301 }
302 }
303
304
305
306
307
308
309
310
311
312 public static String getType (byte[] bSignature) throws SignatureClassNotFoundException {
313 logger.debug("[Signature.getSignatureType]::Entrada");
314
315 ISignature signature = getSignatureObject(bSignature);
316 return signature.getSignatureType();
317 }
318
319
320
321
322
323
324
325
326
327
328 public static ISignature getSignatureObject (byte[] bSignature) throws SignatureClassNotFoundException {
329 logger.debug("[Signature.getSignatureObject]::Entrada");
330
331
332 for(Class recognizerClass : getRecognizersList()) {
333 logger.debug("[Signature.getSignatureObject]::Probar con la clase: " + recognizerClass);
334 Method method;
335 try {
336 method = recognizerClass.getMethod(RECOGNIZER_METHOD_NAME,new Class[] { byte[].class });
337 } catch (SecurityException e1) {
338 logger.info("[Signature.getSignatureObject]::Excepción de seguridad al llamar al método getSignatureInstance de la clase: " + recognizerClass);
339 continue;
340 } catch (NoSuchMethodException e1) {
341 logger.info("[Signature.getSignatureObject]::El método getSignatureInstance no existe en la clase: " + recognizerClass);
342 continue;
343 }
344 try {
345 return (ISignature) method.invoke(null, new Object[] { bSignature });
346 } catch (IllegalArgumentException e) {
347 logger.info("[Signature.getSignatureObject]::El método getSignatureInstance existe pero con parámetros equivocados en la clase: " + recognizerClass);
348 continue;
349 } catch (IllegalAccessException e) {
350 logger.info("[Signature.getSignatureObject]::Acceso ilegal al llamar al método getSignatureInstance de la clase: " + recognizerClass);
351 continue;
352 } catch (InvocationTargetException e) {
353 logger.debug("[Signature.getSignatureObject]::La firma no es del tipo que trata: " + recognizerClass);
354 continue;
355 }
356 }
357
358 throw new SignatureClassNotFoundException("No se ha encontrado ninguna clase para tratar la firma");
359 }
360
361
362
363
364
365
366 private static List<Class> getRecognizersList () {
367 if (recognizersList == null) {
368
369 recognizersList = new ArrayList<Class>();
370 recognizersList.add(XAdESSignature.class);
371 recognizersList.add(BasePDFSignature.class);
372 recognizersList.add(CMSPKCS7Signature.class);
373 }
374
375 return recognizersList;
376 }
377
378 }