<?php 
 
/* 
* AUTHOR: Samuel Muñoz Hidalgo 
* EMAIL: [email protected] 
* LAST REVISION: 13-FEB-09 
* DESCRIPTION: Web interface for the token generator 
*/ 
 
 
//Borrowed from xlmseclibs, TEMPORAL 
function decryptMcrypt($data,$key) { 
    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_CBC,''); 
    $iv_length = mcrypt_enc_get_iv_size($td); 
 
    $iv = substr($data, 0, $iv_length); 
    $data = substr($data, $iv_length); 
 
    mcrypt_generic_init($td, $key, $iv); 
    $decrypted_data = mdecrypt_generic($td, $data); 
    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 
     
    $dataLen = strlen($decrypted_data); 
    $paddingLength = substr($decrypted_data, $dataLen - 1, 1); 
    $decrypted_data = substr($decrypted_data, 0, $dataLen - ord($paddingLength)); 
     
    return $decrypted_data; 
} 
 
 
 
//Input: self issued saml token 
//Returns ppid coded in base 64 
    function getppid($samlToken){ 
    $token = new DOMDocument(); 
    $token->loadXML($samlToken); 
    $doc = $token->documentElement; 
    return($doc->getElementsByTagname('AttributeValue')->item(0)->nodeValue); 
} 
 
 
// grab the important parts of the token request.  these are the username, 
// password, and cardid. 
 
Header('Content-Type: application/soap+xml;charset=utf-8'); 
 
$config = SimpleSAML_Configuration::getInstance(); 
SimpleSAML_Logger::debug('Tokenservice'); 
 
$token = new DOMDocument(); 
$token->loadXML($HTTP_RAW_POST_DATA); 
$doc = $token->documentElement; 
 
$cardId  =  $doc->getElementsByTagname('CardId')->item(0)->nodeValue; 
 
$authenticated = false; 
 
 
$autoconfig = $config->copyFromBase('logininfocard', 'config-login-infocard.php'); 
$ICconfig['UserCredential'] = $autoconfig->getValue('UserCredential'); 
$debugDir = $autoconfig->getValue('debugDir'); 
 
 
SimpleSAML_Logger::debug('USERCREDENTIAL: '.$ICconfig['UserCredential']); 
switch($ICconfig['UserCredential']){ 
    case "UsernamePasswordCredential": 
        $username = $doc->getElementsByTagname('Username')->item(0)->nodeValue; 
        $password = $doc->getElementsByTagname('Password')->item(0)->nodeValue; 
        if (sspmod_InfoCard_UserFunctions::validateUser(array('username'=>$username,'password'=>$password),$ICconfig['UserCredential'])){ 
            $authenticated = true; 
        } 
        break; 
    case "KerberosV5Credential": 
        break; 
    case "X509V3Credential": 
        break; 
    case "SelfIssuedCredential": 
        //Obtener clave simétrica 
        $encKey = base64_decode($doc->getElementsByTagname('CipherValue')->item(0)->nodeValue); 
        $sts_key = $autoconfig->getValue('sts_key'); 
        $privkey = openssl_pkey_get_private(file_get_contents($sts_key)); 
        $key=NULL; 
        openssl_private_decrypt($encKey,$key,$privkey,OPENSSL_PKCS1_OAEP_PADDING); 
        openssl_free_key($privkey); 
         
        //Recuperar información 
        $encSamlToken = base64_decode($doc->getElementsByTagname('CipherValue')->item(1)->nodeValue); 
        $samlToken=decryptMcrypt($encSamlToken,$key); 
        SimpleSAML_Logger::debug('$samlToken'.$samlToken); 
        $ppid=getppid($samlToken); 
        SimpleSAML_Logger::debug('PPID: '.$ppid); 
 
        if (sspmod_InfoCard_UserFunctions::validateUser(array('PPID'=>$ppid),$ICconfig['UserCredential'])){ 
            $authenticated = true; 
        } 
        break; 
    default: 
        break; 
} 
 
 
$messageid = $doc->getElementsByTagname('MessageID')->item(0)->nodeValue; 
 
if ($authenticated){ 
    $ICconfig['InfoCard'] = $autoconfig->getValue('InfoCard'); 
    $ICconfig['issuer'] =  $autoconfig->getValue('issuer'); 
    $ICconfig['sts_crt'] = $autoconfig->getValue('sts_crt'); 
    $ICconfig['sts_key'] = $autoconfig->getValue('sts_key'); 
     
    $requiredClaims = sspmod_InfoCard_Utils::extractClaims($ICconfig['InfoCard']['schema'], $doc->getElementsByTagname('ClaimType')); 
    $claimValues = sspmod_InfoCard_UserFunctions::fillClaims($username, $ICconfig['InfoCard']['requiredClaims'], $ICconfig['InfoCard']['optionalClaims'],$requiredClaims); 
     
    $response = sspmod_InfoCard_STS::createToken($claimValues,$ICconfig,$messageid); 
     
 
}else{ 
    $response = sspmod_InfoCard_STS::errorMessage('Wrong Credentials',$messageid); 
} 
 
 
Header('Content-length: '.strlen($response)+1); 
print($response); 
 
//LOG 
if ($debugDir!=null){ 
    $handle=fopen($debugDir.'/'.$messageid.'.log','w'); 
    fwrite($handle,"  ------ InfoCard simpleSAMLphp Module LOG ------\n\n"); 
    fwrite($handle,"-- TIME: ".gmdate('Y-m-d').' '.gmdate('H:i:s')."\n"); 
    fwrite($handle,"-- MESSAGE ID: ".$messageid."\n\n\n"); 
    fwrite($handle,"-- RST\n"); 
    fwrite($handle,$HTTP_RAW_POST_DATA); 
    fwrite($handle,"\n\n\n-- RSTR\n"); 
    fwrite($handle,$response); 
    fclose($handle); 
} 
 
 
?>
 
 |