Ignore:
Timestamp:
11/04/11 16:50:31 (12 years ago)
Author:
rafaelraymundo
Message:

Ticket #2165 - Erro ao enviar mensagens assinadas digitalmente.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.3/security/ExpressoCert/src/br/gov/serpro/cert/DigitalCertificate.java

    r5024 r5152  
    3131import java.util.Properties; 
    3232 
     33import java.util.logging.Level; 
     34import java.util.logging.Logger; 
    3335import javax.crypto.Cipher; 
    3436import javax.mail.Message; 
     
    5557import br.gov.serpro.ui.DialogBuilder; 
    5658import br.gov.serpro.util.Base64Utils; 
     59import java.io.BufferedInputStream; 
     60import java.io.BufferedReader; 
     61import java.io.InputStreamReader; 
    5762import java.io.OutputStream; 
    5863import java.io.OutputStreamWriter; 
     64import java.io.StringReader; 
    5965import java.security.AlgorithmParameters; 
    6066import java.security.cert.CertificateEncodingException; 
     
    6571import javax.activation.MailcapCommandMap; 
    6672import javax.mail.internet.ContentType; 
     73import javax.mail.internet.HeaderTokenizer; 
    6774import javax.mail.internet.MimeUtility; 
    6875import javax.mail.internet.PreencodedMimeBodyPart; 
     
    337344    } 
    338345 
     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 
    339450    /** 
    340451     * Usado para assinar digitalmente um e-mail. 
     
    506617        body.saveChanges(); 
    507618 
    508         ByteArrayOutputStream oStream = new ByteArrayOutputStream(); 
     619        ByteArrayOutputStream oStream = new ByteArrayOutputStream(); 
    509620 
    510621        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        } 
    516632    } 
    517633 
Note: See TracChangeset for help on using the changeset viewer.