<?php
/*
* AUTHOR: Samuel Muñoz Hidalgo
* EMAIL: samuel.mh@gmail.com
* LAST REVISION: 16-DEC-08
* DESCRIPTION: some useful functions.
*/

class sspmod_InfoCard_Utils {
	
	/*
	*INPUT:  a PEM-encoded certificate
	*OUTPUT: a PEM-encoded certificate without the BEGIN and END headers
	*/
	static public function takeCert($cert) {
		$begin = "CERTIFICATE-----";
		$end = "-----END";
		$pem = file_get_contents($cert);
		$pem = substr($pem, strpos($pem, $begin)+strlen($begin));
		$pem = substr($pem, 0, strpos($pem, $end));
		return str_replace("\n", "", $pem);
	}
	
	
	/*
	*INPUT:  a XML document
	*OUTPUT: a canonicalized XML document
	*/
	static public function canonicalize($XMLdoc){
		$dom = new DOMDocument();
		$dom->loadXML($XMLdoc);
		return ($dom->C14N(true, false));
	}
	
	
	static public function thumbcert($cert){
		return base64_encode(sha1(base64_decode($cert), true));
	}
	

	/*
	*INPUT:  a x509 certificate
	*OUTPUT: Common Name or a self issued value if no input is given
	*EXTRA: The output is used as issuer
	*/
	static public function getIssuer($cert){
		if ($cert==NULL){
			return 'http://schemas.xmlsoap.org/ws/2005/05/identity/issuer/self';
		}else{
			$resource = file_get_contents($cert);
			$check_cert = openssl_x509_read($resource);
			$array = openssl_x509_parse($check_cert);
			openssl_x509_free($check_cert);
			$schema = $array['name'];
			$pattern='/.*CN=/';
			$replacement='';
			$CN=preg_replace($pattern,$replacement,$schema);
			return $CN;
		}
	}


	

	
	/*
	* INPUT: claims schema (string) and a DOMNodelist with the requested claims in uri style
	* OUTPUT: array of requested claims
	* 
	*/
	static public function extractClaims($ICschema, $nodeList){
		//Returns the Uri attribute from an attribute list
		function getUri($attrList){
			$uri = null;
			$end=false;	
			$i=0;
			do{
				if ($i > $attrList->length){
					$end = true;
				} else if (strcmp($attrList->item($i)->name,'Uri')==0){
					$end = true;
					$uri = $attrList->item($i)->value;
				} else {
					$i++;
				}
			} while (!$end);
			return $uri;
		}
	$requiredClaims = array();
	$schema = $ICschema."/claims/";
	SimpleSAML_Logger::debug("schema:   ".$schema);
	$pattern='/\//';
	$replacement='\/';
	$schema= '/'.preg_replace($pattern,$replacement,$schema).'/';
	for ($i=0;$i<($nodeList->length);$i++) {
		$replacement='';
		$uri = getUri($nodeList->item($i)->attributes);
		$claim = preg_replace($schema,$replacement,$uri);
		$requiredClaims[$i]=$claim;
		SimpleSAML_Logger::debug("uri:   ".$uri);
		SimpleSAML_Logger::debug("claim: ".$claim);
	}
	return $requiredClaims;
}


}
