Changeset 4991 for trunk/security
- Timestamp:
- 08/26/11 13:45:47 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/security/classes/funcoes_auxiliares.php
r3991 r4991 1 1 <?php 2 2 // Conjunto de funcoes de apoio as Classes de tratamento do certificado digital. 3 3 4 4 function pega_path($chaves,$linha) 5 5 { … … 33 33 return $ret; 34 34 } 35 35 36 36 function ler_certificados_CAS($path,$flag=false) 37 37 { … … 98 98 return $aux_xml; 99 99 } 100 101 102 function data_hora ($valor) 100 101 102 function data_hora ($valor) 103 103 { 104 104 $year = substr($valor, 0, 2); … … 123 123 $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'; 124 124 $aux = $GLOBALS['dirtemp'].'/'.$N;; 125 array_push($tab_arqs ,$aux); 126 return $aux; 125 array_push($tab_arqs ,$aux); 126 return $aux; 127 127 } 128 128 … … 138 138 return $ret; 139 139 } 140 141 140 141 142 142 function deleta_arquivos_temporarios($tab_arqs) 143 143 { 144 144 foreach($tab_arqs as $arquivo ) 145 { 145 { 146 146 if(file_exists($arquivo)) 147 147 { 148 148 unlink($arquivo); 149 149 } 150 } 150 } 151 151 } 152 152 … … 174 174 function print_hex($value) 175 175 { 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'); 177 177 for($A=0;$A<strlen($value);$A++) 178 178 { … … 193 193 # Testa se tamanho menor/igual a 127 bytes.. 194 194 # Neste caso $len ja he o tamanho do conteudo 195 if ($len & 0x80) 195 if ($len & 0x80) 196 196 { 197 197 # Testa se tamanho indefinido (nao deve ocorrer em uma codificação DER. … … 202 202 $bytes = 0; 203 203 } 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.... 207 207 $bytes = $len & 0x0f; 208 208 $len = 0; 209 for ($i = 0; $i < $bytes; $i++) 209 for ($i = 0; $i < $bytes; $i++) 210 210 { 211 211 $len = ($len << 8) | ord($data[$i + 2]); … … 214 214 } 215 215 } 216 216 217 217 function xBase128($ab,$q,$flag ) 218 218 { 219 $abc = $ab; 219 $abc = $ab; 220 220 if( $q > 127 ) 221 221 { … … 265 265 return $value; 266 266 } 267 268 269 267 268 269 270 270 function Crl_parseASN($data,$context_especific = false) 271 { 271 { 272 272 // Tabela de OIDs . 273 273 $_oids = array( … … 299 299 '1.2.840.10040.4.3' => 'id-dsa-with-sha-1', 300 300 '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', 302 302 '1.3.6.1.5.5.7.2.1' => 'id_certificatePolicies', 303 303 '2.16.840.1.113730.1.1' => 'netscape-cert-type', … … 309 309 '2.16.840.1.113730.1.12' => 'netscape-ssl-server-name', 310 310 '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', 313 313 '2.16.76.1.2.1.16' => 'Certification Practice Statement pointer', 314 314 '2.16.76.1.3.1' => 'Dados do cert parte 1', … … 1141 1141 1142 1142 $result = array(); 1143 1144 while (strlen($data) > 1) 1143 1144 while (strlen($data) > 1) 1145 1145 { 1146 1146 $class = ord($data[0]); 1147 switch ($class) 1147 switch ($class) 1148 1148 { 1149 1149 case 0x30: … … 1155 1155 $data = substr($data, 2 + $bytes + $len); 1156 1156 $values = Crl_parseASN($sequence_data); 1157 if (!is_array($values) || is_string($values[0])) 1157 if (!is_array($values) || is_string($values[0])) 1158 1158 { 1159 1159 $values = array($values); … … 1178 1178 $result[] = array('boolean (1)' , $boolean_value); 1179 1179 break; 1180 1180 1181 1181 case 0x02: 1182 1182 // Integer type … … 1197 1197 { 1198 1198 $value = 0; 1199 if ($len <= 4) 1199 if ($len <= 4) 1200 1200 { 1201 1201 // Method works fine for small integers 1202 for ($i = 0; $i < strlen($integer_data); $i++) 1202 for ($i = 0; $i < strlen($integer_data); $i++) 1203 1203 { 1204 1204 $value = ($value << 8) | ord($integer_data[$i]); 1205 1205 } 1206 } 1207 else 1206 } 1207 else 1208 1208 { 1209 // Method works for arbitrary length integers 1210 if (extension_loaded('bcmath')) 1209 // Method works for arbitrary length integers 1210 if (extension_loaded('bcmath')) 1211 1211 { 1212 for ($i = 0; $i < strlen($integer_data); $i++) 1212 for ($i = 0; $i < strlen($integer_data); $i++) 1213 1213 { 1214 1214 $value = bcadd(bcmul($value, 256), ord($integer_data[$i])); 1215 1215 } 1216 } 1217 else 1216 } 1217 else 1218 1218 { 1219 1219 $value = -1; … … 1236 1236 1237 1237 case 0x04: 1238 // Octetstring type 1238 // Octetstring type 1239 1239 $len = ord($data[1]); 1240 1240 $bytes = 0; … … 1248 1248 else 1249 1249 { 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 1254 1261 case 0x0C: 1255 1262 // UTF8 STRING … … 1290 1297 $value = 0; 1291 1298 $i = 1; 1292 while ($i < strlen($oid_data)) 1299 while ($i < strlen($oid_data)) 1293 1300 { 1294 1301 $value = $value << 7; 1295 1302 $value = $value | (ord($oid_data[$i]) & 0x7f); 1296 1303 1297 if (!(ord($oid_data[$i]) & 0x80)) 1304 if (!(ord($oid_data[$i]) & 0x80)) 1298 1305 { 1299 1306 $plain .= '.' . $value; … … 1303 1310 } 1304 1311 1305 if (isset($_oids[$plain])) 1312 if (isset($_oids[$plain])) 1306 1313 { 1307 1314 $result[] = array('oid(' . $len . '): ' . $plain, $_oids[$plain]); 1308 } 1309 else 1315 } 1316 else 1310 1317 { 1311 1318 $result[] = array('oid(' . $len . '): ' . $plain, $plain); … … 1322 1329 $result[] = array('IA5 String (' . $len . ')' , $string_data); 1323 1330 break; 1324 1331 1325 1332 case 0x12: 1326 1333 case 0x14: 1327 case 0x15: 1328 case 0x81: 1334 case 0x15: 1335 case 0x81: 1329 1336 // Character string type 1330 1337 $len = ord($data[1]); … … 1338 1345 case 0x80: 1339 1346 // Character string type 1340 $len = ord($data[1]);1347 $len = strlen($data)-2; 1341 1348 $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); 1344 1352 $data = substr($data, 2 + $bytes + $len); 1345 1353 $result[] = array('string (' . $len . ')' , print_hex($string_data)); 1346 1354 break; 1347 1355 1348 1356 case 0x13: 1349 1357 case 0x86: … … 1375 1383 $data = substr($data, 2 + $bytes + $len); 1376 1384 $result[] = array('extension : X509v3 extensions (' . $len . ')' , array(Crl_parseASN($sequence_data))); 1377 //$result[] = Crl_parseASN($sequence_data);1378 1385 break; 1379 1386 … … 1388 1395 $result[] = array('Context Especific (' . $len . ')' , array(Crl_parseASN($extension_data,true))); 1389 1396 break; 1390 1397 1391 1398 case 0xa3: 1392 1399 // Extensions … … 1413 1420 default: 1414 1421 // 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 = ''; 1418 1424 break; 1419 1425 } … … 1423 1429 1424 1430 } 1425 1426 function openssl_to_timestamp ($in) 1431 1432 function openssl_to_timestamp ($in) 1427 1433 { 1428 1434 $year = substr($in, 0, 4); /* NOTE: Yes, this returns a two digit year */ … … 1432 1438 $min = substr($in, 10, 2); 1433 1439 $sec = substr($in, 12, 2); 1434 1440 1435 1441 return gmmktime($hour, $min, $sec, $month, $day, $year); 1436 1442 } … … 1438 1444 #============================================================================================ 1439 1445 # Transforma o certificado do formato PEM para o formato DER ... 1440 function pem2der($pem_data) 1446 function pem2der($pem_data) 1441 1447 { 1442 1448 $begin = "CERTIFICATE-----"; 1443 1449 $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)); 1445 1451 $pem_data = substr($pem_data, 0, strpos($pem_data, $end)); 1446 1452 $der = base64_decode($pem_data); … … 1451 1457 function testa_p7m($msg) 1452 1458 { 1453 // oids pesquisadas: 1459 // oids pesquisadas: 1454 1460 // 1.2.840.113549.1.7.2 assinatura digital 1455 1461 // 1.2.840.113549.1.7.3 envelopeddata … … 1464 1470 return 'signature' ; 1465 1471 } 1466 $oid_hexa = OIDtoHex('1.2.840.113549.1.7.3'); 1472 $oid_hexa = OIDtoHex('1.2.840.113549.1.7.3'); 1467 1473 $partes = explode($oid_hexa,$p7m_formato_der); // Faz o split pela oid... 1468 1474 if(count($partes)>1) 1469 1475 { 1470 1476 return 'cipher' ; 1471 } 1477 } 1472 1478 return 'normal'; 1473 1479 } … … 1501 1507 { 1502 1508 $xcv = $xcv2; 1503 $data = $xcv . $oid_hexa . $partes[$i]; // reconstroi a sequencia..... 1509 $data = $xcv . $oid_hexa . $partes[$i]; // reconstroi a sequencia..... 1504 1510 $ret = parse_sequence($data); 1505 1511 … … 1513 1519 { 1514 1520 $xcv = $xcv3; 1515 $data = $xcv . $oid_hexa . $partes[$i]; // reconstroi a sequencia..... 1521 $data = $xcv . $oid_hexa . $partes[$i]; // reconstroi a sequencia..... 1516 1522 $ret = parse_sequence($data); 1517 1523 if($ret[0] != '') … … 1524 1530 { 1525 1531 $xcv = $xcv4; 1526 $data = $xcv . $oid_hexa . $partes[$i]; // reconstroi a sequencia..... 1532 $data = $xcv . $oid_hexa . $partes[$i]; // reconstroi a sequencia..... 1527 1533 $ret = parse_sequence($data); 1528 1534 if($ret[0] != '') … … 1530 1536 $retr[] = $ret; 1531 1537 continue; 1532 } 1533 } 1534 } 1538 } 1539 } 1540 } 1535 1541 } 1536 1542 return $retr; … … 1544 1550 // 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.. 1545 1551 // 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 1547 1553 // 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 // 1550 1556 // OID para logon no NT: 1.3.6.1.4.1.311.20.2.3 1551 1557 // … … 1561 1567 '3'=>array('NIS',11), 1562 1568 '4'=>array('RG',15), 1563 '5'=>array('ORGAOUF',6)), 1569 '5'=>array('ORGAOUF',6)), 1564 1570 '2.16.76.1.3.5' => array('1'=>array('TITULO',12), 1565 1571 '2'=>array('ZONA',3), 1566 1572 '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)), 1570 1576 '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(); 1574 1580 $esta_oid = $oids[$oid]; 1575 1581 $p = 0; … … 1584 1590 { 1585 1591 $tamanho = $esta_oid[$i][1]; 1586 } 1592 } 1587 1593 $resultado[$oid][$esta_oid[$i][0]] = substr($valor,$p,$tamanho); 1588 1594 // A linha logo abaixo he para manter compatibilidade com versoes anteriores... Sera desativada assim que possivel... … … 1592 1598 1593 1599 return $resultado; 1594 } 1595 1596 1600 } 1601 1602 1597 1603 function subjectAltName($xx, $certificado_digital_formato_der) 1598 1604 { … … 1630 1636 } 1631 1637 1632 1638 1633 1639 function CRLDistributionPointsxx($xx, $certificado_digital_formato_der) 1634 1640 { … … 1638 1644 echo '</pre><br/><br/>'; 1639 1645 exit(); 1640 1641 1646 1647 1642 1648 $i=1; 1643 1649 if(substr($AUX[0][1][0],0,7) == 'boolean') … … 1647 1653 $AUX1 = $AUX[0][$i][1][1][0]; 1648 1654 // 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 } 1651 1657 1652 1658 function CRLDistributionPoints($xx, $certificado_digital_formato_der) … … 1673 1679 } 1674 1680 } 1675 1681 1676 1682 // Se $ret esta vazio tenta obter crls em outra estrutura(outro layout). 1677 1683 if(count($ret) == 0) … … 1689 1695 } 1690 1696 } 1691 1697 1692 1698 return array('CRLDISTRIBUTIONPOINTS' => $ret); 1693 } 1694 1695 1699 } 1700 1701 1696 1702 function SERIALNUMBER($cert_data,$KK) 1697 1703 { … … 1701 1707 $dados['SERIALNUMBER'] = $cert_data[1][0][1][$KK][1]; 1702 1708 } 1703 return $dados; 1704 } 1705 1709 return $dados; 1710 } 1711 1706 1712 function SUBJECT($cert_data,$KK) 1707 1713 { … … 1714 1720 $AUX = explode(':',$dados['SUBJECT']['CN']); 1715 1721 $dados['NOME'] = $AUX[0]; 1716 return $dados; 1717 } 1718 1719 function ISSUER($cert_data,$KK) 1720 { 1721 $dados = array(); 1722 return $dados; 1723 } 1724 1725 function ISSUER($cert_data,$KK) 1726 { 1727 $dados = array(); 1722 1728 $dados['EMISSOR_CAMINHO_COMPLETO'] = array(); 1723 1729 1724 1730 foreach($cert_data[1][0][1][$KK][1] as $AUX2) 1725 1731 { … … 1727 1733 } 1728 1734 $dados['EMISSOR'] = $dados['EMISSOR_CAMINHO_COMPLETO']['CN']; 1729 return $dados; 1730 } 1731 1732 1735 return $dados; 1736 } 1737 1738 1733 1739 function BEFOREAFTER($cert_data,$KK) 1734 1740 { … … 1744 1750 { 1745 1751 $dados['EXPIRADO'] = false; 1746 } 1747 return $dados; 1748 } 1752 } 1753 return $dados; 1754 } 1749 1755 1750 1756 … … 1767 1773 $dados['AUTHORITYKEYIDENTIFIER'] = "auto-assinado"; 1768 1774 } 1769 return $dados; 1770 } 1771 1775 return $dados; 1776 } 1777 1772 1778 function KEYUSAGE($xx, $certificado_digital_formato_der) 1773 1779 { 1774 $KeyUsage= array( 0x80 => 'digitalSignature', 1780 $KeyUsage= array( 0x80 => 'digitalSignature', 1775 1781 0x40 => 'nonRepudiation', 1776 1782 0x20 => 'keyEncipherment', … … 1795 1801 } 1796 1802 } 1797 } 1798 return $dados; 1803 } 1804 return $dados; 1799 1805 } 1800 1806 … … 1815 1821 } 1816 1822 } 1817 return $dados; 1818 } 1819 1823 return $dados; 1824 } 1825 1820 1826 function BASICCONSTRAINTS($xx, $certificado_digital_formato_der) 1821 1827 { … … 1829 1835 } 1830 1836 } 1831 return $dados; 1832 } 1833 1837 return $dados; 1838 } 1839 1834 1840 function recupera_dados_do_ceritificado_digital($certificado_digital_formato_pem) 1835 1841 { 1836 1842 $cert_der = pem2der($certificado_digital_formato_pem); 1837 1843 1838 1844 $funcoes = array(SERIALNUMBER => 1, 1839 1845 ISSUER => 3, … … 1846 1852 CRLDistributionPoints => $cert_der, 1847 1853 subjectAltName => $cert_der); 1848 1854 1849 1855 $dados=array(); 1850 1856 1851 1857 $cert_data = Crl_parseASN( $cert_der); 1852 1858 1853 1859 foreach($funcoes as $funcao => $parametro) 1854 1860 { … … 1863 1869 } 1864 1870 } 1865 return $dados; 1871 return $dados; 1866 1872 } 1867 1873
Note: See TracChangeset
for help on using the changeset viewer.