* @author Shishir Randive * 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; } } } ?>