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