181 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * Introduces the notion of an Attribute Provider that attests and signs
 | |
|  * attributes
 | |
|  * Uses OpenID Signed Assertions(Sxip draft) for attesting attributes
 | |
|  * PHP versions 4 and 5
 | |
|  *
 | |
|  * LICENSE: See the COPYING file included in this distribution.
 | |
|  *
 | |
|  * @package OpenID
 | |
|  * @author Santosh Subramanian <subrasan@cs.sunysb.edu>
 | |
|  * @author Shishir Randive <srandive@cs.sunysb.edu>
 | |
|  * Stony Brook University.
 | |
|  *
 | |
|  */
 | |
| require_once 'Auth/OpenID/SAML.php';
 | |
| /**
 | |
|  * The Attribute_Provider class which signs the attribute,value pair 
 | |
|  * for a given openid.
 | |
|  */
 | |
| class Attribute_Provider
 | |
| {
 | |
|    private $public_key_certificate=null;
 | |
|    private $private_key=null;
 | |
|    private $authenticatedUser=null;
 | |
|    private $notBefore=null;
 | |
|    private $notOnOrAfter=null;
 | |
|    private $rsadsa=null;
 | |
|    private $acsURI=null;
 | |
|    private $attribute=null;
 | |
|    private $value=null;
 | |
|    private $assertionTemplate=null;
 | |
|    /**
 | |
|     * Creates an Attribute_Provider object initialized with startup values.
 | |
|     * @param string $public_key_certificate - The public key certificate 
 | |
| 	of the signer.
 | |
|     * @param string $private_key - The private key of the signer.
 | |
|     * @param string $notBefore - Certificate validity time 
 | |
|     * @param string $notOnOrAfter - Certificate validity time
 | |
|     * @param string $rsadsa - Choice of the algorithm (RSA/DSA)
 | |
|     * @param string $acsURI - URI of the signer.
 | |
|     * @param string $assertionTemplate - SAML template used for assertion
 | |
|     */
 | |
|    function Attribute_Provider($public_key_certificate,$private_key,$notBefore,$notOnOrAfter,$rsadsa,$acsURI,
 | |
|                                $assertionTemplate)
 | |
|    {
 | |
|       $this->public_key_certificate=$public_key_certificate;
 | |
|            $this->private_key=$private_key;
 | |
|       $this->notBefore=$notBefore;
 | |
|       $this->notOnOrAfter=$notOnOrAfter;
 | |
|       $this->rsadsa=$rsadsa;
 | |
|       $this->acsURI=$acsURI;
 | |
|       $this->assertionTemplate=$assertionTemplate;
 | |
|    }
 | |
|    /**
 | |
|     * Create the signed assertion.
 | |
|     * @param string $openid - Openid of the entity being asserted.
 | |
|     * @param string $attribute - The attribute name being asserted.
 | |
|     * @param string $value - The attribute value being asserted.
 | |
|     */
 | |
|    function sign($openid,$attribute,$value)
 | |
|    {
 | |
|       $samlObj = new SAML();
 | |
|       $responseXmlString = $samlObj->createSamlAssertion($openid, 
 | |
|                                                          $this->notBefore, 
 | |
|                                                          $this->notOnOrAfter, 
 | |
|                                                          $this->rsadsa,
 | |
|                                                          $this->acsURI,
 | |
|                                                          $attribute,
 | |
|                                                          sha1($value),
 | |
|                                                       $this->assertionTemplate);
 | |
|       $signedAssertion=$samlObj->signAssertion($responseXmlString,
 | |
|                                                $this->private_key,
 | |
|                                                $this->public_key_certificate);
 | |
|       return $signedAssertion;
 | |
|    }
 | |
| }
 | |
| /**
 | |
|  * The Attribute_Verifier class which verifies the signed assertion at the Relying party.
 | |
|  */
 | |
| class Attribute_Verifier
 | |
| {
 | |
|    /**
 | |
|     * The certificate the Relying party trusts.
 | |
|    */
 | |
|    private $rootcert;
 | |
|    /**
 | |
|     * This function loads the public key certificate that the relying party trusts.
 | |
|     * @param string $cert - Trusted public key certificate.
 | |
|     */
 | |
|    function load_trusted_root_cert($cert)
 | |
|    {
 | |
|       $this->rootcert=$cert;
 | |
|    }
 | |
|    /**
 | |
|     * Verifies the certificate given the SAML document.
 | |
|     * @param string - signed SAML assertion
 | |
|     * return @boolean - true if verification is successful, false if unsuccessful.
 | |
|    */
 | |
|    function verify($responseXmlString)
 | |
|    {
 | |
|       $samlObj = new SAML();
 | |
|       $ret = $samlObj->verifyAssertion($responseXmlString,$this->rootcert);
 | |
|       return $ret;
 | |
|    }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * This is a Store Request creating class at the Attribute Provider.
 | |
|  */
 | |
| class AP_OP_StoreRequest
 | |
| {
 | |
|    /**
 | |
|     * Creates store request and adds it as an extension to AuthRequest object 
 | |
|       passed to it.
 | |
|     * @param &Auth_OpenID_AuthRequest &$auth_request - A reference to 
 | |
|       the AuthRequest object.
 | |
|     * @param &Attribute_Provider &$attributeProvider - A reference to the  
 | |
|       Attribute Provider object.
 | |
|     * @param string $attribute - The attribute name being asserted.
 | |
|     * @param string $value - The attribute value being asserted.
 | |
|     * @param string $openid - Openid of the entity being asserted.
 | |
|     * @return &Auth_OpenID_AuthRequest - Auth_OpenID_AuthRequest object 
 | |
|                                    returned with StoreRequest extension.
 | |
|    */
 | |
|    static function createStoreRequest(&$auth_request,&$attributeProvider,
 | |
|                                                $attribute,$value,$openid)
 | |
|    {
 | |
|       if(!$auth_request){
 | |
|          return null;
 | |
|       }
 | |
|       $signedAssertion=$attributeProvider->sign($openid,$attribute,$value);
 | |
|       $store_request=new Auth_OpenID_AX_StoreRequest;
 | |
|       $store_request->addValue($attribute,base64_encode($value));
 | |
|       $store_request->addValue($attribute.'/signature',
 | |
|                                            base64_encode($signedAssertion));
 | |
|       if($store_request) {
 | |
|          $auth_request->addExtension($store_request);
 | |
|          return $auth_request;
 | |
|       }
 | |
|    }
 | |
| }
 | |
| 
 | |
| /*
 | |
|  *This is implemented at the RP Takes care of getting the attribute from the 
 | |
|  *AX_Fetch_Response object and verifying it.
 | |
|  */
 | |
| class RP_OP_Verify
 | |
| {
 | |
|    /**
 | |
|     * Verifies a given signed assertion.
 | |
|     * @param &Attribute_Verifier &$attributeVerifier - An instance of the class 
 | |
|                                             passed for the verification.
 | |
|     * @param Auth_OpenID_Response - Response object for extraction.
 | |
|     * @return boolean - true if successful, false if verification fails.
 | |
|     */
 | |
|    function verifyAssertion(&$attributeVerifier,$response)
 | |
|    {
 | |
|       $ax_resp=Auth_OpenID_AX_FetchResponse::fromSuccessResponse($response);
 | |
|       if($ax_resp instanceof Auth_OpenID_AX_FetchResponse){
 | |
|          $ax_args=$ax_resp->getExtensionArgs();
 | |
|          if($ax_args) {
 | |
|             $value=base64_decode($ax_args['value.ext1.1']);
 | |
|             if($attributeVerifier->verify($value)){
 | |
|                return base64_decode($ax_args['value.ext0.1']);
 | |
|             } else {
 | |
|                return null;
 | |
|             }
 | |
|          } else {
 | |
|             return null;
 | |
|          }
 | |
|       } else {
 | |
|          return null;
 | |
|       }
 | |
|    }
 | |
| }
 | |
| 
 | |
| 
 | |
| ?>
 |