Changeset 5152 for branches/2.3/security


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

Ticket #2165 - Erro ao enviar mensagens assinadas digitalmente.

Location:
branches/2.3/security
Files:
2 added
4 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 
  • branches/2.3/security/ExpressoCert/src/br/gov/serpro/setup/Setup.java

    r3394 r5152  
    4545        for (String[] parameter : getParameterInfo()) { 
    4646            String parameterName = parameter[0]; 
    47             String parameterValue; 
     47            String parameterValue = null; 
    4848 
    49             parameterValue = this.currentApplet.getParameter(parameterName); 
     49            if (this.currentApplet != null){ 
     50                parameterValue = this.currentApplet.getParameter(parameterName); 
     51            } 
    5052 
    5153            System.out.println("parameter: "+parameterName+" value: "+parameterValue); 
     
    7678        currentLocale = this.buildLocale(parameters.getProperty("locale")); 
    7779        langResources = new HashMap<String, ResourceBundle>(2); 
    78         langResources.put("ExpressoCertMessages", ResourceBundle.getBundle("ExpressoCertMessages", currentLocale)); 
     80        langResources.put("ExpressoCertMessages", ResourceBundle.getBundle("br.gov.serpro.i18n.ExpressoCertMessages", currentLocale)); 
    7981 
     82    } 
     83 
     84    public boolean setParameter(String parameter, String value){ 
     85 
     86        if (parameter != null && value != null){ 
     87 
     88            if (parameter.equals("debug") || parameter.equals("token") || parameter.equals("locale")){ 
     89                this.parameters.setProperty(parameter, value); 
     90                return true; 
     91            } 
     92        } 
     93 
     94        return false; 
    8095    } 
    8196 
  • branches/2.3/security/ExpressoCert/src/br/gov/serpro/util/Base64Utils.java

    r1174 r5152  
    131131    } 
    132132 
    133     public static String der2pem(byte[] der){ 
    134133 
    135         int begin = 0; 
    136         int lineSize = 64; 
    137         int end = lineSize; 
     134    public static String der2pem(byte[] der, boolean isCert){ 
     135 
     136        int begin = 0; 
     137        int lineSize = isCert ? 64 : 76; 
     138        int end = lineSize; 
    138139        int bytesWriten = 0; 
    139140 
     141        String CRLF = "\r\n"; 
     142        String base64encoded = Base64Utils.base64Encode(der); 
     143        StringBuilder sb = new StringBuilder(); 
    140144 
    141         String LF = "\n"; 
    142         String beginCertificate = "-----BEGIN CERTIFICATE-----" +LF; 
    143         String endCertificate = "-----END CERTIFICATE-----"; 
     145        String beginCertificate = "-----BEGIN CERTIFICATE-----" +CRLF; 
     146        String endCertificate = "-----END CERTIFICATE-----"; 
    144147 
    145         String base64encoded = Base64Utils.base64Encode(der); 
    146  
    147         StringBuilder sb = new StringBuilder(); 
    148         sb.append(beginCertificate); 
    149  
     148        if (isCert){ 
     149            sb.append(beginCertificate); 
     150        } 
    150151 
    151152        do { 
     
    156157 
    157158                String subs = base64encoded.substring(begin, end); 
    158                 sb.append(subs + LF); 
     159                sb.append(subs + CRLF); 
    159160                bytesWriten += end - begin; 
    160161                begin = end; 
     
    163164        } while (bytesWriten != base64encoded.length()); 
    164165 
    165         sb.append(endCertificate); 
     166        if (isCert){ 
     167            sb.append(endCertificate); 
     168        } 
    166169 
    167170        return sb.toString(); 
    168171 
     172    } 
    169173 
     174    public static String der2pem(byte[] der){ 
     175        return Base64Utils.der2pem(der, false); 
    170176    } 
    171177 
Note: See TracChangeset for help on using the changeset viewer.