123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- <?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;
- }
- }
- }
- ?>
|