Changeset 5152 for branches/2.3/security/ExpressoCert/src/br/gov/serpro/cert/DigitalCertificate.java
- Timestamp:
- 11/04/11 16:50:31 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.3/security/ExpressoCert/src/br/gov/serpro/cert/DigitalCertificate.java
r5024 r5152 31 31 import java.util.Properties; 32 32 33 import java.util.logging.Level; 34 import java.util.logging.Logger; 33 35 import javax.crypto.Cipher; 34 36 import javax.mail.Message; … … 55 57 import br.gov.serpro.ui.DialogBuilder; 56 58 import br.gov.serpro.util.Base64Utils; 59 import java.io.BufferedInputStream; 60 import java.io.BufferedReader; 61 import java.io.InputStreamReader; 57 62 import java.io.OutputStream; 58 63 import java.io.OutputStreamWriter; 64 import java.io.StringReader; 59 65 import java.security.AlgorithmParameters; 60 66 import java.security.cert.CertificateEncodingException; … … 65 71 import javax.activation.MailcapCommandMap; 66 72 import javax.mail.internet.ContentType; 73 import javax.mail.internet.HeaderTokenizer; 67 74 import javax.mail.internet.MimeUtility; 68 75 import javax.mail.internet.PreencodedMimeBodyPart; … … 337 344 } 338 345 346 static public String verifyP7S(MimeMessage body){ 347 try { 348 349 MimeMultipart mm = (MimeMultipart) body.getContent(); 350 externalLoop:for (int i = mm.getCount() - 1; i >= 0 ; i--){ 351 MimeBodyPart mbp = (MimeBodyPart) mm.getBodyPart(i); 352 if (mbp.getContentType().contains("application/pkcs7-signature")){ 353 String[] contentTypeArray = body.getHeader("Content-Type"); 354 HeaderTokenizer hTokenizer = new HeaderTokenizer(contentTypeArray[0]); 355 356 String boundary = ""; 357 HeaderTokenizer.Token t = hTokenizer.next(); 358 for (; t.getType() != HeaderTokenizer.Token.EOF; t = hTokenizer.next()){ 359 if (t.getType() == HeaderTokenizer.Token.ATOM && t.getValue().equalsIgnoreCase("boundary=")){ 360 break; 361 } 362 } 363 t = hTokenizer.next(); 364 if (t.getType() == HeaderTokenizer.Token.QUOTEDSTRING){ 365 boundary = t.getValue(); 366 } 367 368 InputStreamReader rawStreamReader = new InputStreamReader(mbp.getRawInputStream(), "iso-8859-1"); 369 370 StringBuilder signature = new StringBuilder(256); 371 while (rawStreamReader.ready()){ 372 char[] buffer = new char[256]; 373 rawStreamReader.read(buffer); 374 signature.append(buffer); 375 } 376 377 String[] array = signature.toString().split("\\r\\n|(?<!\\r)\\n"); 378 379 boolean badFormat = false; 380 for (int j = 0; j < array.length; j++){ 381 if (array[j].length() > array[0].length()){ 382 badFormat = true; 383 break; 384 } 385 } 386 387 signature = null; 388 array = null; 389 390 if (badFormat){ 391 BufferedInputStream parsedIS = new BufferedInputStream(mbp.getInputStream()); 392 ByteArrayOutputStream baos = new ByteArrayOutputStream(parsedIS.available()); 393 394 while (parsedIS.available() > 0){ 395 byte[] buffer = new byte[parsedIS.available()]; 396 parsedIS.read(buffer); 397 baos.write(buffer); 398 } 399 400 Enumeration headers = headers = mbp.getAllHeaderLines(); 401 String headersString = ""; 402 while (headers.hasMoreElements()){ 403 String header = (String) headers.nextElement(); 404 System.out.println("header: "+header); 405 headersString += header+"\r\n"; 406 } 407 408 String base64Encoded = Base64Utils.der2pem(baos.toByteArray(), false); 409 410 mm.removeBodyPart(i); 411 body.saveChanges(); 412 413 ByteArrayOutputStream oStream = new ByteArrayOutputStream(); 414 415 oStream = new ByteArrayOutputStream(); 416 body.writeTo(oStream); 417 418 BufferedReader reader = new BufferedReader(new StringReader(oStream.toString())); 419 OutputStream os = new ByteArrayOutputStream(); 420 421 String line = ""; 422 while ((line = reader.readLine()) != null ){ 423 if (!line.equals("--"+boundary+"--")){ 424 os.write((line+"\r\n").getBytes("iso-8859-1")); 425 } 426 } 427 428 return os.toString() 429 +"--"+boundary+"\r\n"+headersString 430 +"\r\n"+base64Encoded 431 +"--"+boundary+"--\r\n"; 432 433 } 434 435 break externalLoop; 436 } 437 } 438 439 } catch (IOException ex) { 440 Logger.getLogger(DigitalCertificate.class.getName()).log(Level.SEVERE, null, ex); 441 } catch (MessagingException ex) { 442 Logger.getLogger(DigitalCertificate.class.getName()).log(Level.SEVERE, null, ex); 443 } catch (ClassCastException ex) { 444 Logger.getLogger(DigitalCertificate.class.getName()).log(Level.SEVERE, null, ex); 445 } 446 447 return null; 448 } 449 339 450 /** 340 451 * Usado para assinar digitalmente um e-mail. … … 506 617 body.saveChanges(); 507 618 508 619 ByteArrayOutputStream oStream = new ByteArrayOutputStream(); 509 620 510 621 oStream = new ByteArrayOutputStream(); 511 body.writeTo(oStream); 512 513 body = null; 514 return oStream.toString("iso-8859-1"); 515 622 body.writeTo(oStream); 623 624 String verified = DigitalCertificate.verifyP7S(body); 625 body = null; 626 627 if (verified != null){ 628 return verified; 629 } else { 630 return oStream.toString("iso-8859-1"); 631 } 516 632 } 517 633
Note: See TracChangeset
for help on using the changeset viewer.