Index: /trunk/security/classes/funcoes_auxiliares.php
===================================================================
--- /trunk/security/classes/funcoes_auxiliares.php	(revision 3991)
+++ /trunk/security/classes/funcoes_auxiliares.php	(revision 4991)
@@ -1,5 +1,5 @@
 <?php
 //  Conjunto de funcoes de apoio as Classes de tratamento do certificado digital.
-	
+
 		function pega_path($chaves,$linha)
 		{
@@ -33,5 +33,5 @@
 			return $ret;
 		}
-	
+
 	function ler_certificados_CAS($path,$flag=false)
             {
@@ -98,7 +98,7 @@
                     return  $aux_xml;
 		}
-		
-		
-	function data_hora ($valor) 
+
+
+	function data_hora ($valor)
 	{
 		$year  = substr($valor, 0, 2);
@@ -123,6 +123,6 @@
 		$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';
 		$aux = $GLOBALS['dirtemp'].'/'.$N;;
-	        array_push($tab_arqs ,$aux); 
-		return  $aux;		
+	        array_push($tab_arqs ,$aux);
+		return  $aux;
 	}
 
@@ -138,15 +138,15 @@
 			return $ret;
 	}
-	
-	
+
+
 	function deleta_arquivos_temporarios($tab_arqs)
 	{
 		foreach($tab_arqs as $arquivo )
-			{ 
+			{
 				if(file_exists($arquivo))
 					{
 						unlink($arquivo);
 					}
-			}	
+			}
 	}
 
@@ -174,5 +174,5 @@
        	function print_hex($value)
 	{
-		$tab_val = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); 
+		$tab_val = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
 		for($A=0;$A<strlen($value);$A++)
 			{
@@ -193,5 +193,5 @@
 		# Testa se tamanho menor/igual a 127 bytes..
 		# Neste caso $len  ja he o tamanho do conteudo
-		if ($len & 0x80) 
+		if ($len & 0x80)
 			{
 				# Testa se tamanho indefinido (nao deve ocorrer em uma codificação DER.
@@ -202,10 +202,10 @@
 						$bytes = 0;
 					}
-				else					
-					{
-						# he tamanho definido. diz quantos bytes formam o tamanho.... 
+				else
+					{
+						# he tamanho definido. diz quantos bytes formam o tamanho....
 						$bytes = $len & 0x0f;
 						$len = 0;
-						for ($i = 0; $i < $bytes; $i++) 
+						for ($i = 0; $i < $bytes; $i++)
 							{
 								$len = ($len << 8) | ord($data[$i + 2]);
@@ -214,8 +214,8 @@
 			}
 	}
-	
+
 	function xBase128($ab,$q,$flag )
 	{
-		$abc = $ab; 
+		$abc = $ab;
 		if( $q > 127 )
 			{
@@ -265,9 +265,9 @@
 		return $value;
 	}
-	
-	
-	
+
+
+
         function Crl_parseASN($data,$context_especific = false)
-	{  
+	{
         // Tabela de OIDs .
                	$_oids = array(
@@ -299,5 +299,5 @@
 			'1.2.840.10040.4.3' => 'id-dsa-with-sha-1',
 			'1.3.6.1.5.5.7.3.2' => 'id_kp_clientAuth',
-			'1.3.6.1.5.5.7.3.4' => 'id_kp_securityemail',	
+			'1.3.6.1.5.5.7.3.4' => 'id_kp_securityemail',
 			'1.3.6.1.5.5.7.2.1' => 'id_certificatePolicies',
 			'2.16.840.1.113730.1.1' => 'netscape-cert-type',
@@ -309,6 +309,6 @@
 			'2.16.840.1.113730.1.12' => 'netscape-ssl-server-name',
 			'2.16.840.1.113730.1.13' => 'netscape-comment',
-			'2.16.76.1.2.1' => 'A1',	
-			'2.16.76.1.2.3' => 'A3',	
+			'2.16.76.1.2.1' => 'A1',
+			'2.16.76.1.2.3' => 'A3',
 			'2.16.76.1.2.1.16' => 'Certification Practice Statement pointer',
 			'2.16.76.1.3.1' => 'Dados do cert parte 1',
@@ -1141,9 +1141,9 @@
 
 		$result = array();
-		
-		while (strlen($data) > 1) 
+
+		while (strlen($data) > 1)
 		{
 			$class = ord($data[0]);
-			switch ($class) 
+			switch ($class)
 			{
 				case 0x30:
@@ -1155,5 +1155,5 @@
 					$data = substr($data, 2 + $bytes + $len);
 					$values = Crl_parseASN($sequence_data);
-					if (!is_array($values) || is_string($values[0])) 
+					if (!is_array($values) || is_string($values[0]))
 					{
 						$values = array($values);
@@ -1178,5 +1178,5 @@
 					$result[] = array('boolean (1)' , $boolean_value);
 					break;
-				
+
 				case 0x02:
 					// Integer type
@@ -1197,23 +1197,23 @@
 					{
 						$value = 0;
-						if ($len <= 4) 
+						if ($len <= 4)
 						{
 							// Method works fine for small integers
-							for ($i = 0; $i < strlen($integer_data); $i++) 
+							for ($i = 0; $i < strlen($integer_data); $i++)
 							{
 								$value = ($value << 8) | ord($integer_data[$i]);
 							}
-						} 
-						else 
+						}
+						else
 						{
-							// Method works for arbitrary length integers 
-							if (extension_loaded('bcmath')) 
+							// Method works for arbitrary length integers
+							if (extension_loaded('bcmath'))
 							{
-								for ($i = 0; $i < strlen($integer_data); $i++) 
+								for ($i = 0; $i < strlen($integer_data); $i++)
 								{
 									$value = bcadd(bcmul($value, 256), ord($integer_data[$i]));
 								}
-							} 
-							else 
+							}
+							else
 							{
 								$value = -1;
@@ -1236,5 +1236,5 @@
 
 				case 0x04:
-					// Octetstring type 
+					// Octetstring type
 					$len = ord($data[1]);
 					$bytes = 0;
@@ -1248,8 +1248,15 @@
 					else
 					{
-						$result[] = array('octet string (' . $len . ')' , Crl_parseASN($octectstring_data));
-					}
-					break;
-					
+						$aux = array('octet string (' . $len . ')' , Crl_parseASN($octectstring_data));
+                                                $aux_r = @substr($aux[1],0,7);
+                                                if($aux_r == 'UNKNOWN')
+                                                {
+                                                    $aux = array('octet string (' . $len . ')' , print_hex($octectstring_data));
+                                                }
+                                                $result[]=$aux;
+					}
+
+					break;
+
 				case 0x0C:
 					// UTF8 STRING
@@ -1290,10 +1297,10 @@
 					$value = 0;
 					$i = 1;
-					while ($i < strlen($oid_data)) 
+					while ($i < strlen($oid_data))
 					{
 						$value = $value << 7;
 						$value = $value | (ord($oid_data[$i]) & 0x7f);
 
-						if (!(ord($oid_data[$i]) & 0x80)) 
+						if (!(ord($oid_data[$i]) & 0x80))
 						{
 							$plain .= '.' . $value;
@@ -1303,9 +1310,9 @@
 					}
 
-					if (isset($_oids[$plain])) 
+					if (isset($_oids[$plain]))
 					{
 						$result[] =  array('oid(' . $len . '): '  . $plain, $_oids[$plain]);
-					} 
-					else 
+					}
+					else
 					{
 						$result[] = array('oid(' . $len . '): '  . $plain, $plain);
@@ -1322,9 +1329,9 @@
 					$result[] = array('IA5 String (' . $len . ')'  , $string_data);
 					break;
-					
+
 				case 0x12:
 				case 0x14:
-				case 0x15:	
-				case 0x81:			
+				case 0x15:
+				case 0x81:
 					// Character string type
 					$len = ord($data[1]);
@@ -1338,12 +1345,13 @@
 				case 0x80:
 					// Character string type
-					$len = ord($data[1]);
+					$len = strlen($data)-2;
 					$bytes = 0;
-					get_length(&$len,&$bytes,$data);
-					$string_data = substr($data, 2 + $bytes, $len);
+					//get_length(&$len,&$bytes,$data);
+                                        $data_aux = $data;
+					$string_data = substr($data, strlen($data)-20);
 					$data = substr($data, 2 + $bytes + $len);
 					$result[] = array('string (' . $len . ')'  , print_hex($string_data));
 					break;
-					
+
 				case 0x13:
 				case 0x86:
@@ -1375,5 +1383,4 @@
 					$data = substr($data, 2 + $bytes + $len);
 					$result[] = array('extension : X509v3 extensions (' . $len . ')'  , array(Crl_parseASN($sequence_data)));
-					//$result[] = Crl_parseASN($sequence_data);
 					break;
 
@@ -1388,5 +1395,5 @@
 					$result[] = array('Context Especific (' . $len . ')' , array(Crl_parseASN($extension_data,true)));
 					break;
-					
+
 				case 0xa3:
 					// Extensions
@@ -1413,7 +1420,6 @@
 				default:
 					// Unknown
-					$result[] = 'UNKNOWN' .  $data;;
-					//file_put_contents('/opt/lampp/htdocs/seguranca/temp/arquivo_desconhecido.txt',$data);
-					$data = '';
+					$result[] = 'UNKNOWN' .  $data;
+                                        $data = '';
 					break;
 			}
@@ -1423,6 +1429,6 @@
 
    }
-   
-   function openssl_to_timestamp ($in) 
+
+   function openssl_to_timestamp ($in)
    {
 	$year  = substr($in, 0, 4); /* NOTE: Yes, this returns a two digit year */
@@ -1432,5 +1438,5 @@
         $min   = substr($in, 10, 2);
         $sec   = substr($in, 12, 2);
-    
+
         return gmmktime($hour, $min, $sec, $month, $day, $year);
 	}
@@ -1438,9 +1444,9 @@
 #============================================================================================
 # Transforma o certificado do formato PEM para o formato DER ...
-function pem2der($pem_data) 
+function pem2der($pem_data)
 	{
 		$begin = "CERTIFICATE-----";
 		$end   = "-----END";
-		$pem_data = substr($pem_data, strpos($pem_data, $begin)+strlen($begin));    
+		$pem_data = substr($pem_data, strpos($pem_data, $begin)+strlen($begin));
 		$pem_data = substr($pem_data, 0, strpos($pem_data, $end));
 		$der = base64_decode($pem_data);
@@ -1451,5 +1457,5 @@
 function testa_p7m($msg)
 	{
-		// oids pesquisadas: 
+		// oids pesquisadas:
 		//                                1.2.840.113549.1.7.2     assinatura digital
 		//                                 1.2.840.113549.1.7.3     envelopeddata
@@ -1464,10 +1470,10 @@
 					return 'signature' ;
 			}
-		$oid_hexa = OIDtoHex('1.2.840.113549.1.7.3');  
+		$oid_hexa = OIDtoHex('1.2.840.113549.1.7.3');
 		$partes = explode($oid_hexa,$p7m_formato_der);    // Faz o split pela oid...
 		if(count($partes)>1)
 			{
 					return 'cipher' ;
-			}			
+			}
 		return 'normal';
 	}
@@ -1501,5 +1507,5 @@
 							{
 								$xcv = $xcv2;
-								$data = $xcv . $oid_hexa . $partes[$i];           // reconstroi a sequencia.....	
+								$data = $xcv . $oid_hexa . $partes[$i];           // reconstroi a sequencia.....
 								$ret = parse_sequence($data);
 
@@ -1513,5 +1519,5 @@
 							{
 								$xcv = $xcv3;
-								$data = $xcv . $oid_hexa . $partes[$i];           // reconstroi a sequencia.....	
+								$data = $xcv . $oid_hexa . $partes[$i];           // reconstroi a sequencia.....
 								$ret = parse_sequence($data);
 								if($ret[0] != '')
@@ -1524,5 +1530,5 @@
 							{
 								$xcv = $xcv4;
-								$data = $xcv . $oid_hexa . $partes[$i];           // reconstroi a sequencia.....	
+								$data = $xcv . $oid_hexa . $partes[$i];           // reconstroi a sequencia.....
 								$ret = parse_sequence($data);
 								if($ret[0] != '')
@@ -1530,7 +1536,7 @@
 										$retr[] = $ret;
 										continue;
-									}										
-							}							
-					} 
+									}
+							}
+					}
 			}
 		return $retr;
@@ -1544,8 +1550,8 @@
 		//  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..
 		//
-		//  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 
+		//  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
 		//
-		//  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 
-		//	
+		//  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
+		//
 		//  OID  para logon no NT:  1.3.6.1.4.1.311.20.2.3
 		//
@@ -1561,15 +1567,15 @@
 							       '3'=>array('NIS',11),
 							       '4'=>array('RG',15),
-							       '5'=>array('ORGAOUF',6)),	
+							       '5'=>array('ORGAOUF',6)),
 				     '2.16.76.1.3.5' => array('1'=>array('TITULO',12),
 				                              '2'=>array('ZONA',3),
 							      '3'=>array('SECAO',4),
-							      '4'=>array('TITULO_CIDADE_UF',0)),	
-				     '2.16.76.1.3.6' => array('1'=>array('CADINSS',12)),							      
-				     '2.16.76.1.3.7' => array('1'=>array('CEI',12)),								       
+							      '4'=>array('TITULO_CIDADE_UF',0)),
+				     '2.16.76.1.3.6' => array('1'=>array('CADINSS',12)),
+				     '2.16.76.1.3.7' => array('1'=>array('CEI',12)),
 				     '2.16.76.1.3.8' => array('1'=>array('NOMEEMPRESARIAL',0)),
-				     '1.3.6.1.4.1.311.20.2.3' => array('1'=>array('NTNOMEPRINCIPAL',0)));				     
-				     
-		$resultado = array(); 
+				     '1.3.6.1.4.1.311.20.2.3' => array('1'=>array('NTNOMEPRINCIPAL',0)));
+
+		$resultado = array();
 		$esta_oid = $oids[$oid];
 		$p = 0;
@@ -1584,5 +1590,5 @@
 					{
 						$tamanho = $esta_oid[$i][1];
-					} 
+					}
 				$resultado[$oid][$esta_oid[$i][0]] = substr($valor,$p,$tamanho);
 				// A linha logo abaixo he para manter compatibilidade com versoes anteriores... Sera desativada assim que possivel...
@@ -1592,7 +1598,7 @@
 
 		return $resultado;
-	}  
-
-	
+	}
+
+
 function subjectAltName($xx, $certificado_digital_formato_der)
 	{
@@ -1630,5 +1636,5 @@
 	}
 
-	
+
 function CRLDistributionPointsxx($xx, $certificado_digital_formato_der)
 	{
@@ -1638,6 +1644,6 @@
 		echo '</pre><br/><br/>';
 		exit();
-		
-		
+
+
 		$i=1;
 		if(substr($AUX[0][1][0],0,7) == 'boolean')
@@ -1647,6 +1653,6 @@
 		$AUX1 = $AUX[0][$i][1][1][0];
 		// Pode existir mais de uma crl, mas vamos considerar apenas a primeira.....
-		return array('CRLDISTRIBUTIONPOINTS' => $AUX1[1][0][1][0][1][0][1]);		
-	}	
+		return array('CRLDISTRIBUTIONPOINTS' => $AUX1[1][0][1][0][1][0][1]);
+	}
 
 function CRLDistributionPoints($xx, $certificado_digital_formato_der)
@@ -1673,5 +1679,5 @@
 					  }
 			}
-		
+
 		// Se $ret esta vazio tenta obter crls em outra estrutura(outro layout).
 		if(count($ret) == 0)
@@ -1689,9 +1695,9 @@
 					  }
 			}
-			
+
                 return array('CRLDISTRIBUTIONPOINTS' => $ret);
-	}	
-
-        
+	}
+
+
 function SERIALNUMBER($cert_data,$KK)
 	{
@@ -1701,7 +1707,7 @@
 				$dados['SERIALNUMBER'] = $cert_data[1][0][1][$KK][1];
 			}
-		return $dados;			
-	}
-	
+		return $dados;
+	}
+
 function SUBJECT($cert_data,$KK)
 	{
@@ -1714,12 +1720,12 @@
 			$AUX = explode(':',$dados['SUBJECT']['CN']);
 		$dados['NOME'] = $AUX[0];
-		return $dados;			
-	}
-		
-function ISSUER($cert_data,$KK)		
-	{
-		$dados = array();	
+		return $dados;
+	}
+
+function ISSUER($cert_data,$KK)
+	{
+		$dados = array();
 		$dados['EMISSOR_CAMINHO_COMPLETO']  = array();
-		
+
 		foreach($cert_data[1][0][1][$KK][1] as $AUX2)
 			{
@@ -1727,8 +1733,8 @@
 			}
 		$dados['EMISSOR'] = $dados['EMISSOR_CAMINHO_COMPLETO']['CN'];
-		return $dados;	
-	}		
-
-        
+		return $dados;
+	}
+
+
 function BEFOREAFTER($cert_data,$KK)
 	{
@@ -1744,7 +1750,7 @@
 			{
 				$dados['EXPIRADO'] = false;
-			}	
-		return $dados;		
-		}	
+			}
+		return $dados;
+		}
 
 
@@ -1767,10 +1773,10 @@
 				$dados['AUTHORITYKEYIDENTIFIER'] = "auto-assinado";
 			}
-		return $dados;			
-	}
-	
+		return $dados;
+	}
+
 function KEYUSAGE($xx, $certificado_digital_formato_der)
 	{
-		$KeyUsage= array( 0x80 => 'digitalSignature', 
+		$KeyUsage= array( 0x80 => 'digitalSignature',
 			      0x40 => 'nonRepudiation',
                               0x20 => 'keyEncipherment',
@@ -1795,6 +1801,6 @@
 							}
 					}
-			}	
-		return $dados;			
+			}
+		return $dados;
 	}
 
@@ -1815,7 +1821,7 @@
 				}
 			}
-		return $dados;			
-	}
-	
+		return $dados;
+	}
+
 function BASICCONSTRAINTS($xx, $certificado_digital_formato_der)
 	{
@@ -1829,11 +1835,11 @@
 					}
 			}
-		return $dados;			
-	}
-	
+		return $dados;
+	}
+
 function recupera_dados_do_ceritificado_digital($certificado_digital_formato_pem)
 	{
 		$cert_der =  pem2der($certificado_digital_formato_pem);
-		
+
 		$funcoes = array(SERIALNUMBER => 1,
 					ISSUER => 3,
@@ -1846,9 +1852,9 @@
 					CRLDistributionPoints =>  $cert_der,
 					subjectAltName => $cert_der);
-			   
+
 		$dados=array();
-		
+
 		$cert_data = Crl_parseASN( $cert_der);
-		
+
 		foreach($funcoes as $funcao => $parametro)
 			{
@@ -1863,5 +1869,5 @@
 					}
 			}
-		return $dados;		
+		return $dados;
 	}
 
