Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

384 lines
7.3 KiB

#ifndef _IIS_DIGESTPROVIDER_HXX_
#define _IIS_DIGESTPROVIDER_HXX_
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name :
iisdigestprovider.hxx
Abstract:
IIS Digest authentication provider
- version of Digest auth as implemented by IIS5 and IIS5.1
Author:
Jaroslad - based on code from md5filt 10-Nov-2000
Environment:
Win32 - User Mode
Project:
ULW3.DLL
--*/
//
// Constants
//
//# of random bytes at beginning of nonce
#define RANDOM_SIZE 8
//size of timestamp in nonce
#define TIMESTAMP_SIZE 12
//MD5 hash size
#define MD5_HASH_SIZE 16
#define NONCE_SIZE ( 2*RANDOM_SIZE + TIMESTAMP_SIZE + 2*MD5_HASH_SIZE )
#define NONCE_GRANULARITY 512
#define DIGEST_AUTH "Digest"
#define QOP_AUTH "auth"
#define VALUE_NONE "none"
// based on RFC2617 NC is defined as 8LHEX
#define SIZE_OF_NC 8
//
// Class definitions
//
#define IIS_DIGEST_CONN_CONTEXT_SIGNATURE CREATE_SIGNATURE( 'DIGC' )
#define IIS_DIGEST_CONN_CONTEXT_SIGNATURE_FREED CREATE_SIGNATURE( 'digX' )
class IIS_DIGEST_CONN_CONTEXT: public CONNECTION_AUTH_CONTEXT
{
public:
IIS_DIGEST_CONN_CONTEXT(
VOID
):
_fStale ( FALSE ),
_tLastNonce ( 0 ),
_straNonce ( __szNonce, sizeof(__szNonce))
{
SetSignature( IIS_DIGEST_CONN_CONTEXT_SIGNATURE );
}
virtual ~IIS_DIGEST_CONN_CONTEXT(
VOID
)
{
DBG_ASSERT( CheckSignature() );
SetSignature( IIS_DIGEST_CONN_CONTEXT_SIGNATURE_FREED );
}
BOOL
CheckSignature(
VOID
)
{ return( QuerySignature() == IIS_DIGEST_CONN_CONTEXT_SIGNATURE ); }
VOID *
operator new(
size_t size
)
{
DBG_ASSERT( size == sizeof( IIS_DIGEST_CONN_CONTEXT ) );
DBG_ASSERT( sm_pachIISDIGESTConnContext != NULL );
return sm_pachIISDIGESTConnContext->Alloc();
}
VOID
operator delete(
VOID * pDIGESTConnContext
)
{
DBG_ASSERT( pDIGESTConnContext != NULL );
DBG_ASSERT( sm_pachIISDIGESTConnContext != NULL );
DBG_REQUIRE( sm_pachIISDIGESTConnContext->Free( pDIGESTConnContext ) );
}
BOOL
Cleanup(
VOID
)
{
delete this;
return TRUE;
}
static
HRESULT
Initialize(
VOID
);
static
VOID
Terminate(
VOID
);
VOID
SetStale(
IN BOOL fStale
)
{
_fStale = fStale;
}
BOOL
QueryStale(
VOID
)
{
return _fStale;
}
STRA&
QueryNonce(
VOID
)
{
return _straNonce;
}
static
HRESULT
HashData(
IN BUFFER& buffData,
OUT BUFFER& buffHash
);
static
BOOL
IsExpiredNonce(
IN STRA& strRequestNonce,
IN STRA& strPresentNonce
);
static
BOOL
IsWellFormedNonce(
IN STRA& strNonce
);
HRESULT
GenerateNonce(
VOID
);
static
BOOL
IIS_DIGEST_CONN_CONTEXT::ParseForName(
IN PSTR pszStr,
IN PSTR * pNameTable,
IN UINT cNameTable,
OUT PSTR * pValueTable
);
private:
DWORD _dwSignature;
// Is the nonce value stale
BOOL _fStale;
DWORD _tLastNonce;
// buffer for _straNonce
CHAR __szNonce[ NONCE_SIZE ];
STRA _straNonce;
static const PCHAR _pszSecret;
static const DWORD _cchSecret;
static HCRYPTPROV sm_hCryptProv;
static ALLOC_CACHE_HANDLER * sm_pachIISDIGESTConnContext;
};
class IIS_DIGEST_AUTH_PROVIDER : public AUTH_PROVIDER
{
public:
IIS_DIGEST_AUTH_PROVIDER(
VOID
)
{
}
virtual ~IIS_DIGEST_AUTH_PROVIDER(
VOID
)
{
}
HRESULT
Initialize(
DWORD dwInternalId
);
VOID
Terminate(
VOID
);
HRESULT
DoesApply(
IN W3_MAIN_CONTEXT * pMainContext,
OUT BOOL * pfApplies
);
HRESULT
DoAuthenticate(
IN W3_MAIN_CONTEXT * pMainContext,
OUT BOOL * pfFilterFinished
);
HRESULT
OnAccessDenied(
IN W3_MAIN_CONTEXT * pMainContext
);
HRESULT
SetDigestHeader(
IN W3_MAIN_CONTEXT * pMainContext,
IN IIS_DIGEST_CONN_CONTEXT * pDigestConnContext
);
DWORD
QueryAuthType(
VOID
)
{
return MD_AUTH_MD5;
}
static
HRESULT
GetDigestConnContext(
IN W3_MAIN_CONTEXT * pMainContext,
OUT IIS_DIGEST_CONN_CONTEXT ** ppDigestConnContext
);
static
HRESULT
GetLanGroupDomainName(
OUT STRA& straDomain
);
static
HRESULT
BreakUserAndDomain(
IN PCHAR pszFullName,
OUT STRA& straDomainName,
OUT STRA& straUserName
);
static
STRA&
QueryComputerDomain(
VOID
)
{
DBG_ASSERT( sm_pstraComputerDomain != NULL );
return *sm_pstraComputerDomain;
}
private:
static STRA * sm_pstraComputerDomain;
};
class IIS_DIGEST_USER_CONTEXT : public W3_USER_CONTEXT
{
public:
IIS_DIGEST_USER_CONTEXT(
AUTH_PROVIDER * pProvider
):
W3_USER_CONTEXT( pProvider ),
_hImpersonationToken( NULL ),
_hPrimaryToken( NULL )
{
}
virtual ~IIS_DIGEST_USER_CONTEXT(
VOID
)
{
if ( _hImpersonationToken != NULL )
{
CloseHandle( _hImpersonationToken );
_hImpersonationToken = NULL;
}
if ( _hPrimaryToken != NULL )
{
CloseHandle( _hPrimaryToken );
_hPrimaryToken = NULL;
}
}
HRESULT
Create(
IN HANDLE hImpersonationToken,
IN PSTR pszUserName
);
WCHAR *
QueryUserName(
VOID
)
{
return _strUserName.QueryStr();
}
WCHAR *
QueryRemoteUserName(
VOID
)
{
return _strUserName.QueryStr();
}
WCHAR *
QueryPassword(
VOID
)
{
return L"";
}
DWORD
QueryAuthType(
VOID
)
{
return MD_AUTH_MD5;
}
HANDLE
QueryImpersonationToken(
VOID
)
{
DBG_ASSERT( _hImpersonationToken != NULL );
return _hImpersonationToken;
}
HANDLE
QueryPrimaryToken(
VOID
);
private:
HANDLE _hImpersonationToken;
HANDLE _hPrimaryToken;
STRU _strUserName;
};
#endif