Changeset 4947 for branches/2.3/security


Ignore:
Timestamp:
08/18/11 09:49:02 (13 years ago)
Author:
rafaelraymundo
Message:

Ticket #2226 - Falha ao tratar certificados digitais das CA's no módulo "Administrador".

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.3/security/classes/funcoes_auxiliares.php

    r3991 r4947  
    11<?php 
    22//  Conjunto de funcoes de apoio as Classes de tratamento do certificado digital. 
    3          
     3 
    44                function pega_path($chaves,$linha) 
    55                { 
     
    3333                        return $ret; 
    3434                } 
    35          
     35 
    3636        function ler_certificados_CAS($path,$flag=false) 
    3737            { 
     
    9898                    return  $aux_xml; 
    9999                } 
    100                  
    101                  
    102         function data_hora ($valor)  
     100 
     101 
     102        function data_hora ($valor) 
    103103        { 
    104104                $year  = substr($valor, 0, 2); 
     
    123123                $N = $lista[rand(0,count($lista)-1)].date('U').$lista[rand(0,count($lista)-1)].RAND(12345,9999999999).$lista[rand(0,count($lista)-1)].$lista[rand(0,count($lista)-1)].RAND(12345,9999999999).'.tmp'; 
    124124                $aux = $GLOBALS['dirtemp'].'/'.$N;; 
    125                 array_push($tab_arqs ,$aux);  
    126                 return  $aux;            
     125                array_push($tab_arqs ,$aux); 
     126                return  $aux; 
    127127        } 
    128128 
     
    138138                        return $ret; 
    139139        } 
    140          
    141          
     140 
     141 
    142142        function deleta_arquivos_temporarios($tab_arqs) 
    143143        { 
    144144                foreach($tab_arqs as $arquivo ) 
    145                         {  
     145                        { 
    146146                                if(file_exists($arquivo)) 
    147147                                        { 
    148148                                                unlink($arquivo); 
    149149                                        } 
    150                         }        
     150                        } 
    151151        } 
    152152 
     
    174174        function print_hex($value) 
    175175        { 
    176                 $tab_val = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');  
     176                $tab_val = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); 
    177177                for($A=0;$A<strlen($value);$A++) 
    178178                        { 
     
    193193                # Testa se tamanho menor/igual a 127 bytes.. 
    194194                # Neste caso $len  ja he o tamanho do conteudo 
    195                 if ($len & 0x80)  
     195                if ($len & 0x80) 
    196196                        { 
    197197                                # Testa se tamanho indefinido (nao deve ocorrer em uma codificação DER. 
     
    202202                                                $bytes = 0; 
    203203                                        } 
    204                                 else                                     
    205                                         { 
    206                                                 # he tamanho definido. diz quantos bytes formam o tamanho....  
     204                                else 
     205                                        { 
     206                                                # he tamanho definido. diz quantos bytes formam o tamanho.... 
    207207                                                $bytes = $len & 0x0f; 
    208208                                                $len = 0; 
    209                                                 for ($i = 0; $i < $bytes; $i++)  
     209                                                for ($i = 0; $i < $bytes; $i++) 
    210210                                                        { 
    211211                                                                $len = ($len << 8) | ord($data[$i + 2]); 
     
    214214                        } 
    215215        } 
    216          
     216 
    217217        function xBase128($ab,$q,$flag ) 
    218218        { 
    219                 $abc = $ab;  
     219                $abc = $ab; 
    220220                if( $q > 127 ) 
    221221                        { 
     
    265265                return $value; 
    266266        } 
    267          
    268          
    269          
     267 
     268 
     269 
    270270        function Crl_parseASN($data,$context_especific = false) 
    271         {   
     271        { 
    272272        // Tabela de OIDs . 
    273273                $_oids = array( 
     
    299299                        '1.2.840.10040.4.3' => 'id-dsa-with-sha-1', 
    300300                        '1.3.6.1.5.5.7.3.2' => 'id_kp_clientAuth', 
    301                         '1.3.6.1.5.5.7.3.4' => 'id_kp_securityemail',    
     301                        '1.3.6.1.5.5.7.3.4' => 'id_kp_securityemail', 
    302302                        '1.3.6.1.5.5.7.2.1' => 'id_certificatePolicies', 
    303303                        '2.16.840.1.113730.1.1' => 'netscape-cert-type', 
     
    309309                        '2.16.840.1.113730.1.12' => 'netscape-ssl-server-name', 
    310310                        '2.16.840.1.113730.1.13' => 'netscape-comment', 
    311                         '2.16.76.1.2.1' => 'A1',         
    312                         '2.16.76.1.2.3' => 'A3',         
     311                        '2.16.76.1.2.1' => 'A1', 
     312                        '2.16.76.1.2.3' => 'A3', 
    313313                        '2.16.76.1.2.1.16' => 'Certification Practice Statement pointer', 
    314314                        '2.16.76.1.3.1' => 'Dados do cert parte 1', 
     
    11411141 
    11421142                $result = array(); 
    1143                  
    1144                 while (strlen($data) > 1)  
     1143 
     1144                while (strlen($data) > 1) 
    11451145                { 
    11461146                        $class = ord($data[0]); 
    1147                         switch ($class)  
     1147                        switch ($class) 
    11481148                        { 
    11491149                                case 0x30: 
     
    11551155                                        $data = substr($data, 2 + $bytes + $len); 
    11561156                                        $values = Crl_parseASN($sequence_data); 
    1157                                         if (!is_array($values) || is_string($values[0]))  
     1157                                        if (!is_array($values) || is_string($values[0])) 
    11581158                                        { 
    11591159                                                $values = array($values); 
     
    11781178                                        $result[] = array('boolean (1)' , $boolean_value); 
    11791179                                        break; 
    1180                                  
     1180 
    11811181                                case 0x02: 
    11821182                                        // Integer type 
     
    11971197                                        { 
    11981198                                                $value = 0; 
    1199                                                 if ($len <= 4)  
     1199                                                if ($len <= 4) 
    12001200                                                { 
    12011201                                                        // Method works fine for small integers 
    1202                                                         for ($i = 0; $i < strlen($integer_data); $i++)  
     1202                                                        for ($i = 0; $i < strlen($integer_data); $i++) 
    12031203                                                        { 
    12041204                                                                $value = ($value << 8) | ord($integer_data[$i]); 
    12051205                                                        } 
    1206                                                 }  
    1207                                                 else  
     1206                                                } 
     1207                                                else 
    12081208                                                { 
    1209                                                         // Method works for arbitrary length integers  
    1210                                                         if (extension_loaded('bcmath'))  
     1209                                                        // Method works for arbitrary length integers 
     1210                                                        if (extension_loaded('bcmath')) 
    12111211                                                        { 
    1212                                                                 for ($i = 0; $i < strlen($integer_data); $i++)  
     1212                                                                for ($i = 0; $i < strlen($integer_data); $i++) 
    12131213                                                                { 
    12141214                                                                        $value = bcadd(bcmul($value, 256), ord($integer_data[$i])); 
    12151215                                                                } 
    1216                                                         }  
    1217                                                         else  
     1216                                                        } 
     1217                                                        else 
    12181218                                                        { 
    12191219                                                                $value = -1; 
     
    12361236 
    12371237                                case 0x04: 
    1238                                         // Octetstring type  
     1238                                        // Octetstring type 
    12391239                                        $len = ord($data[1]); 
    12401240                                        $bytes = 0; 
     
    12481248                                        else 
    12491249                                        { 
    1250                                                 $result[] = array('octet string (' . $len . ')' , Crl_parseASN($octectstring_data)); 
    1251                                         } 
    1252                                         break; 
    1253                                          
     1250                                                $aux = array('octet string (' . $len . ')' , Crl_parseASN($octectstring_data)); 
     1251                                                $aux_r = @substr($aux[1],0,7); 
     1252                                                if($aux_r == 'UNKNOWN') 
     1253                                                { 
     1254                                                    $aux = array('octet string (' . $len . ')' , print_hex($octectstring_data)); 
     1255                                                } 
     1256                                                $result[]=$aux; 
     1257                                        } 
     1258 
     1259                                        break; 
     1260 
    12541261                                case 0x0C: 
    12551262                                        // UTF8 STRING 
     
    12901297                                        $value = 0; 
    12911298                                        $i = 1; 
    1292                                         while ($i < strlen($oid_data))  
     1299                                        while ($i < strlen($oid_data)) 
    12931300                                        { 
    12941301                                                $value = $value << 7; 
    12951302                                                $value = $value | (ord($oid_data[$i]) & 0x7f); 
    12961303 
    1297                                                 if (!(ord($oid_data[$i]) & 0x80))  
     1304                                                if (!(ord($oid_data[$i]) & 0x80)) 
    12981305                                                { 
    12991306                                                        $plain .= '.' . $value; 
     
    13031310                                        } 
    13041311 
    1305                                         if (isset($_oids[$plain]))  
     1312                                        if (isset($_oids[$plain])) 
    13061313                                        { 
    13071314                                                $result[] =  array('oid(' . $len . '): '  . $plain, $_oids[$plain]); 
    1308                                         }  
    1309                                         else  
     1315                                        } 
     1316                                        else 
    13101317                                        { 
    13111318                                                $result[] = array('oid(' . $len . '): '  . $plain, $plain); 
     
    13221329                                        $result[] = array('IA5 String (' . $len . ')'  , $string_data); 
    13231330                                        break; 
    1324                                          
     1331 
    13251332                                case 0x12: 
    13261333                                case 0x14: 
    1327                                 case 0x15:       
    1328                                 case 0x81:                       
     1334                                case 0x15: 
     1335                                case 0x81: 
    13291336                                        // Character string type 
    13301337                                        $len = ord($data[1]); 
     
    13381345                                case 0x80: 
    13391346                                        // Character string type 
    1340                                         $len = ord($data[1]); 
     1347                                        $len = strlen($data)-2; 
    13411348                                        $bytes = 0; 
    1342                                         get_length(&$len,&$bytes,$data); 
    1343                                         $string_data = substr($data, 2 + $bytes, $len); 
     1349                                        //get_length(&$len,&$bytes,$data); 
     1350                                        $data_aux = $data; 
     1351                                        $string_data = substr($data, strlen($data)-20); 
    13441352                                        $data = substr($data, 2 + $bytes + $len); 
    13451353                                        $result[] = array('string (' . $len . ')'  , print_hex($string_data)); 
    13461354                                        break; 
    1347                                          
     1355 
    13481356                                case 0x13: 
    13491357                                case 0x86: 
     
    13751383                                        $data = substr($data, 2 + $bytes + $len); 
    13761384                                        $result[] = array('extension : X509v3 extensions (' . $len . ')'  , array(Crl_parseASN($sequence_data))); 
    1377                                         //$result[] = Crl_parseASN($sequence_data); 
    13781385                                        break; 
    13791386 
     
    13881395                                        $result[] = array('Context Especific (' . $len . ')' , array(Crl_parseASN($extension_data,true))); 
    13891396                                        break; 
    1390                                          
     1397 
    13911398                                case 0xa3: 
    13921399                                        // Extensions 
     
    14131420                                default: 
    14141421                                        // Unknown 
    1415                                         $result[] = 'UNKNOWN' .  $data;; 
    1416                                         //file_put_contents('/opt/lampp/htdocs/seguranca/temp/arquivo_desconhecido.txt',$data); 
    1417                                         $data = ''; 
     1422                                        $result[] = 'UNKNOWN' .  $data; 
     1423                                        $data = ''; 
    14181424                                        break; 
    14191425                        } 
     
    14231429 
    14241430   } 
    1425     
    1426    function openssl_to_timestamp ($in)  
     1431 
     1432   function openssl_to_timestamp ($in) 
    14271433   { 
    14281434        $year  = substr($in, 0, 4); /* NOTE: Yes, this returns a two digit year */ 
     
    14321438        $min   = substr($in, 10, 2); 
    14331439        $sec   = substr($in, 12, 2); 
    1434      
     1440 
    14351441        return gmmktime($hour, $min, $sec, $month, $day, $year); 
    14361442        } 
     
    14381444#============================================================================================ 
    14391445# Transforma o certificado do formato PEM para o formato DER ... 
    1440 function pem2der($pem_data)  
     1446function pem2der($pem_data) 
    14411447        { 
    14421448                $begin = "CERTIFICATE-----"; 
    14431449                $end   = "-----END"; 
    1444                 $pem_data = substr($pem_data, strpos($pem_data, $begin)+strlen($begin));     
     1450                $pem_data = substr($pem_data, strpos($pem_data, $begin)+strlen($begin)); 
    14451451                $pem_data = substr($pem_data, 0, strpos($pem_data, $end)); 
    14461452                $der = base64_decode($pem_data); 
     
    14511457function testa_p7m($msg) 
    14521458        { 
    1453                 // oids pesquisadas:  
     1459                // oids pesquisadas: 
    14541460                //                                1.2.840.113549.1.7.2     assinatura digital 
    14551461                //                                 1.2.840.113549.1.7.3     envelopeddata 
     
    14641470                                        return 'signature' ; 
    14651471                        } 
    1466                 $oid_hexa = OIDtoHex('1.2.840.113549.1.7.3');   
     1472                $oid_hexa = OIDtoHex('1.2.840.113549.1.7.3'); 
    14671473                $partes = explode($oid_hexa,$p7m_formato_der);    // Faz o split pela oid... 
    14681474                if(count($partes)>1) 
    14691475                        { 
    14701476                                        return 'cipher' ; 
    1471                         }                        
     1477                        } 
    14721478                return 'normal'; 
    14731479        } 
     
    15011507                                                        { 
    15021508                                                                $xcv = $xcv2; 
    1503                                                                 $data = $xcv . $oid_hexa . $partes[$i];           // reconstroi a sequencia.....         
     1509                                                                $data = $xcv . $oid_hexa . $partes[$i];           // reconstroi a sequencia..... 
    15041510                                                                $ret = parse_sequence($data); 
    15051511 
     
    15131519                                                        { 
    15141520                                                                $xcv = $xcv3; 
    1515                                                                 $data = $xcv . $oid_hexa . $partes[$i];           // reconstroi a sequencia.....         
     1521                                                                $data = $xcv . $oid_hexa . $partes[$i];           // reconstroi a sequencia..... 
    15161522                                                                $ret = parse_sequence($data); 
    15171523                                                                if($ret[0] != '') 
     
    15241530                                                        { 
    15251531                                                                $xcv = $xcv4; 
    1526                                                                 $data = $xcv . $oid_hexa . $partes[$i];           // reconstroi a sequencia.....         
     1532                                                                $data = $xcv . $oid_hexa . $partes[$i];           // reconstroi a sequencia..... 
    15271533                                                                $ret = parse_sequence($data); 
    15281534                                                                if($ret[0] != '') 
     
    15301536                                                                                $retr[] = $ret; 
    15311537                                                                                continue; 
    1532                                                                         }                                                                                
    1533                                                         }                                                        
    1534                                         }  
     1538                                                                        } 
     1539                                                        } 
     1540                                        } 
    15351541                        } 
    15361542                return $retr; 
     
    15441550                //  OID's PESSOA FISICA = 2.16.76.1.3.1 ,  2.16.76.1.3.6 ,  2.16.76.1.3.5 ,  2.16.76.1.4.n ... as 2.16.1.4.n não são obrigatórias e ão sao tratadas.. 
    15451551                // 
    1546                 //  OID's PESSOA JURIDICA = 2.16.76.1.3.4 ,  2.16.76.1.3.2 , 2.16.76.1.3.3 , 2.16.76.1.3.7  
     1552                //  OID's PESSOA JURIDICA = 2.16.76.1.3.4 ,  2.16.76.1.3.2 , 2.16.76.1.3.3 , 2.16.76.1.3.7 
    15471553                // 
    1548                 //  OID's EQUIPAMENTO/APLICAÇÃO = 2.16.76.1.3.8 ,  2.16.76.1.3.3 , 2.16.76.1.3.2 , 2.16.76.1.3.4  
    1549                 //       
     1554                //  OID's EQUIPAMENTO/APLICAÇÃO = 2.16.76.1.3.8 ,  2.16.76.1.3.3 , 2.16.76.1.3.2 , 2.16.76.1.3.4 
     1555                // 
    15501556                //  OID  para logon no NT:  1.3.6.1.4.1.311.20.2.3 
    15511557                // 
     
    15611567                                                               '3'=>array('NIS',11), 
    15621568                                                               '4'=>array('RG',15), 
    1563                                                                '5'=>array('ORGAOUF',6)),         
     1569                                                               '5'=>array('ORGAOUF',6)), 
    15641570                                     '2.16.76.1.3.5' => array('1'=>array('TITULO',12), 
    15651571                                                              '2'=>array('ZONA',3), 
    15661572                                                              '3'=>array('SECAO',4), 
    1567                                                               '4'=>array('TITULO_CIDADE_UF',0)),         
    1568                                      '2.16.76.1.3.6' => array('1'=>array('CADINSS',12)),                                                               
    1569                                      '2.16.76.1.3.7' => array('1'=>array('CEI',12)),                                                                    
     1573                                                              '4'=>array('TITULO_CIDADE_UF',0)), 
     1574                                     '2.16.76.1.3.6' => array('1'=>array('CADINSS',12)), 
     1575                                     '2.16.76.1.3.7' => array('1'=>array('CEI',12)), 
    15701576                                     '2.16.76.1.3.8' => array('1'=>array('NOMEEMPRESARIAL',0)), 
    1571                                      '1.3.6.1.4.1.311.20.2.3' => array('1'=>array('NTNOMEPRINCIPAL',0)));                                     
    1572                                       
    1573                 $resultado = array();  
     1577                                     '1.3.6.1.4.1.311.20.2.3' => array('1'=>array('NTNOMEPRINCIPAL',0))); 
     1578 
     1579                $resultado = array(); 
    15741580                $esta_oid = $oids[$oid]; 
    15751581                $p = 0; 
     
    15841590                                        { 
    15851591                                                $tamanho = $esta_oid[$i][1]; 
    1586                                         }  
     1592                                        } 
    15871593                                $resultado[$oid][$esta_oid[$i][0]] = substr($valor,$p,$tamanho); 
    15881594                                // A linha logo abaixo he para manter compatibilidade com versoes anteriores... Sera desativada assim que possivel... 
     
    15921598 
    15931599                return $resultado; 
    1594         }   
    1595  
    1596          
     1600        } 
     1601 
     1602 
    15971603function subjectAltName($xx, $certificado_digital_formato_der) 
    15981604        { 
     
    16301636        } 
    16311637 
    1632          
     1638 
    16331639function CRLDistributionPointsxx($xx, $certificado_digital_formato_der) 
    16341640        { 
     
    16381644                echo '</pre><br/><br/>'; 
    16391645                exit(); 
    1640                  
    1641                  
     1646 
     1647 
    16421648                $i=1; 
    16431649                if(substr($AUX[0][1][0],0,7) == 'boolean') 
     
    16471653                $AUX1 = $AUX[0][$i][1][1][0]; 
    16481654                // Pode existir mais de uma crl, mas vamos considerar apenas a primeira..... 
    1649                 return array('CRLDISTRIBUTIONPOINTS' => $AUX1[1][0][1][0][1][0][1]);             
    1650         }        
     1655                return array('CRLDISTRIBUTIONPOINTS' => $AUX1[1][0][1][0][1][0][1]); 
     1656        } 
    16511657 
    16521658function CRLDistributionPoints($xx, $certificado_digital_formato_der) 
     
    16731679                                          } 
    16741680                        } 
    1675                  
     1681 
    16761682                // Se $ret esta vazio tenta obter crls em outra estrutura(outro layout). 
    16771683                if(count($ret) == 0) 
     
    16891695                                          } 
    16901696                        } 
    1691                          
     1697 
    16921698                return array('CRLDISTRIBUTIONPOINTS' => $ret); 
    1693         }        
    1694  
    1695          
     1699        } 
     1700 
     1701 
    16961702function SERIALNUMBER($cert_data,$KK) 
    16971703        { 
     
    17011707                                $dados['SERIALNUMBER'] = $cert_data[1][0][1][$KK][1]; 
    17021708                        } 
    1703                 return $dados;                   
    1704         } 
    1705          
     1709                return $dados; 
     1710        } 
     1711 
    17061712function SUBJECT($cert_data,$KK) 
    17071713        { 
     
    17141720                        $AUX = explode(':',$dados['SUBJECT']['CN']); 
    17151721                $dados['NOME'] = $AUX[0]; 
    1716                 return $dados;                   
    1717         } 
    1718                  
    1719 function ISSUER($cert_data,$KK)          
    1720         { 
    1721                 $dados = array();        
     1722                return $dados; 
     1723        } 
     1724 
     1725function ISSUER($cert_data,$KK) 
     1726        { 
     1727                $dados = array(); 
    17221728                $dados['EMISSOR_CAMINHO_COMPLETO']  = array(); 
    1723                  
     1729 
    17241730                foreach($cert_data[1][0][1][$KK][1] as $AUX2) 
    17251731                        { 
     
    17271733                        } 
    17281734                $dados['EMISSOR'] = $dados['EMISSOR_CAMINHO_COMPLETO']['CN']; 
    1729                 return $dados;   
    1730         }                
    1731  
    1732          
     1735                return $dados; 
     1736        } 
     1737 
     1738 
    17331739function BEFOREAFTER($cert_data,$KK) 
    17341740        { 
     
    17441750                        { 
    17451751                                $dados['EXPIRADO'] = false; 
    1746                         }        
    1747                 return $dados;           
    1748                 }        
     1752                        } 
     1753                return $dados; 
     1754                } 
    17491755 
    17501756 
     
    17671773                                $dados['AUTHORITYKEYIDENTIFIER'] = "auto-assinado"; 
    17681774                        } 
    1769                 return $dados;                   
    1770         } 
    1771          
     1775                return $dados; 
     1776        } 
     1777 
    17721778function KEYUSAGE($xx, $certificado_digital_formato_der) 
    17731779        { 
    1774                 $KeyUsage= array( 0x80 => 'digitalSignature',  
     1780                $KeyUsage= array( 0x80 => 'digitalSignature', 
    17751781                              0x40 => 'nonRepudiation', 
    17761782                              0x20 => 'keyEncipherment', 
     
    17951801                                                        } 
    17961802                                        } 
    1797                         }        
    1798                 return $dados;                   
     1803                        } 
     1804                return $dados; 
    17991805        } 
    18001806 
     
    18151821                                } 
    18161822                        } 
    1817                 return $dados;                   
    1818         } 
    1819          
     1823                return $dados; 
     1824        } 
     1825 
    18201826function BASICCONSTRAINTS($xx, $certificado_digital_formato_der) 
    18211827        { 
     
    18291835                                        } 
    18301836                        } 
    1831                 return $dados;                   
    1832         } 
    1833          
     1837                return $dados; 
     1838        } 
     1839 
    18341840function recupera_dados_do_ceritificado_digital($certificado_digital_formato_pem) 
    18351841        { 
    18361842                $cert_der =  pem2der($certificado_digital_formato_pem); 
    1837                  
     1843 
    18381844                $funcoes = array(SERIALNUMBER => 1, 
    18391845                                        ISSUER => 3, 
     
    18461852                                        CRLDistributionPoints =>  $cert_der, 
    18471853                                        subjectAltName => $cert_der); 
    1848                             
     1854 
    18491855                $dados=array(); 
    1850                  
     1856 
    18511857                $cert_data = Crl_parseASN( $cert_der); 
    1852                  
     1858 
    18531859                foreach($funcoes as $funcao => $parametro) 
    18541860                        { 
     
    18631869                                        } 
    18641870                        } 
    1865                 return $dados;           
     1871                return $dados; 
    18661872        } 
    18671873 
Note: See TracChangeset for help on using the changeset viewer.