www.pudn.com > openh323-v1_15_1-src.zip > h235auth.h
/* * h235auth.h * * H.235 authorisation PDU's * * Open H323 Library * * Copyright (c) 1998-2001 Equivalence Pty. Ltd. * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Original Code is Open H323 Library. * * The Initial Developer of the Original Code is Equivalence Pty. Ltd. * * Contributor(s): Fürbass Franz* * $Log: h235auth.h,v $ * Revision 1.16 2004/05/13 02:26:13 dereksmithies * Fixes so make docs does not generate warning messages about brackets. * * Revision 1.15 2003/04/30 00:28:50 robertj * Redesigned the alternate credentials in ARQ system as old implementation * was fraught with concurrency issues, most importantly it can cause false * detection of replay attacks taking out an endpoint completely. * * Revision 1.14 2003/04/01 04:47:48 robertj * Abstracted H.225 RAS transaction processing (RIP and secondary thread) in * server environment for use by H.501 peer elements. * * Revision 1.13 2003/02/25 06:48:14 robertj * More work on PDU transaction abstraction. * * Revision 1.12 2003/02/11 04:43:22 robertj * Fixed use of asymmetrical authentication schemes such as MD5. * * Revision 1.11 2003/02/01 13:31:14 robertj * Changes to support CAT authentication in RAS. * * Revision 1.10 2003/01/08 04:40:31 robertj * Added more debug tracing for H.235 authenticators. * * Revision 1.9 2002/09/16 01:14:15 robertj * Added #define so can select if #pragma interface/implementation is used on * platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan. * * Revision 1.8 2002/09/03 06:19:36 robertj * Normalised the multi-include header prevention ifdef/define symbol. * * Revision 1.7 2002/08/05 10:03:47 robertj * Cosmetic changes to normalise the usage of pragma interface/implementation. * * Revision 1.6 2002/08/05 05:17:37 robertj * Fairly major modifications to support different authentication credentials * in ARQ to the logged in ones on RRQ. For both client and server. * Various other H.235 authentication bugs and anomalies fixed on the way. * * Revision 1.5 2002/05/17 03:39:28 robertj * Fixed problems with H.235 authentication on RAS for server and client. * * Revision 1.4 2001/12/06 06:44:42 robertj * Removed "Win32 SSL xxx" build configurations in favour of system * environment variables to select optional libraries. * * Revision 1.3 2001/09/14 00:13:37 robertj * Fixed problem with some athenticators needing extra conditions to be * "active", so make IsActive() virtual and add localId to H235AuthSimpleMD5 * * Revision 1.2 2001/09/13 01:15:18 robertj * Added flag to H235Authenticator to determine if gkid and epid is to be * automatically set as the crypto token remote id and local id. * * Revision 1.1 2001/08/10 11:03:49 robertj * Major changes to H.235 support in RAS to support server. * */ #ifndef __OPAL_H235AUTH_H #define __OPAL_H235AUTH_H #ifdef P_USE_PRAGMA #pragma interface #endif class H323TransactionPDU; class H225_CryptoH323Token; class H225_ArrayOf_AuthenticationMechanism; class H225_ArrayOf_PASN_ObjectId; class H235_ClearToken; class H235_AuthenticationMechanism; class PASN_ObjectId; class PASN_Sequence; class PASN_Array; /** This abtract class embodies an H.235 authentication mechanism. NOTE: descendants must have a Clone() function for correct operation. */ class H235Authenticator : public PObject { PCLASSINFO(H235Authenticator, PObject); public: H235Authenticator(); virtual void PrintOn( ostream & strm ) const; virtual const char * GetName() const = 0; virtual BOOL PrepareTokens( PASN_Array & clearTokens, PASN_Array & cryptoTokens ); virtual H235_ClearToken * CreateClearToken(); virtual H225_CryptoH323Token * CreateCryptoToken(); virtual BOOL Finalise( PBYTEArray & rawPDU ); enum ValidationResult { e_OK = 0, /// Security parameters and Msg are ok, no security attacks e_Absent, /// Security parameters are expected but absent e_Error, /// Security parameters are present but incorrect e_InvalidTime,/// Security parameters indicate peer has bad real time clock e_BadPassword,/// Security parameters indicate bad password in token e_ReplyAttack,/// Security parameters indicate an attack was made e_Disabled /// Security is disabled by local system }; virtual ValidationResult ValidateTokens( const PASN_Array & clearTokens, const PASN_Array & cryptoTokens, const PBYTEArray & rawPDU ); virtual ValidationResult ValidateClearToken( const H235_ClearToken & clearToken ); virtual ValidationResult ValidateCryptoToken( const H225_CryptoH323Token & cryptoToken, const PBYTEArray & rawPDU ); virtual BOOL IsCapability( const H235_AuthenticationMechanism & mechansim, const PASN_ObjectId & algorithmOID ) = 0; virtual BOOL SetCapability( H225_ArrayOf_AuthenticationMechanism & mechansims, H225_ArrayOf_PASN_ObjectId & algorithmOIDs ) = 0; virtual BOOL UseGkAndEpIdentifiers() const; virtual BOOL IsSecuredPDU( unsigned rasPDU, BOOL received ) const; virtual BOOL IsActive() const; void Enable( BOOL enab = TRUE ) { enabled = enab; } void Disable() { enabled = FALSE; } const PString & GetRemoteId() const { return remoteId; } void SetRemoteId(const PString & id) { remoteId = id; } const PString & GetLocalId() const { return localId; } void SetLocalId(const PString & id) { localId = id; } const PString & GetPassword() const { return password; } void SetPassword(const PString & pw) { password = pw; } protected: BOOL AddCapability( unsigned mechanism, const PString & oid, H225_ArrayOf_AuthenticationMechanism & mechansims, H225_ArrayOf_PASN_ObjectId & algorithmOIDs ); BOOL enabled; PString remoteId; // ID of remote entity PString localId; // ID of local entity PString password; // shared secret unsigned sentRandomSequenceNumber; unsigned lastRandomSequenceNumber; unsigned lastTimestamp; int timestampGracePeriod; PMutex mutex; }; PDECLARE_LIST(H235Authenticators, H235Authenticator) #ifdef DOC_PLUS_PLUS { #endif public: void PreparePDU( H323TransactionPDU & pdu, PASN_Array & clearTokens, unsigned clearOptionalField, PASN_Array & cryptoTokens, unsigned cryptoOptionalField ) const; H235Authenticator::ValidationResult ValidatePDU( const H323TransactionPDU & pdu, const PASN_Array & clearTokens, unsigned clearOptionalField, const PASN_Array & cryptoTokens, unsigned cryptoOptionalField, const PBYTEArray & rawPDU ) const; }; /** This class embodies a simple MD5 based authentication. The users password is concatenated with the 4 byte timestamp and 4 byte random fields and an MD5 generated and sent/verified */ class H235AuthSimpleMD5 : public H235Authenticator { PCLASSINFO(H235AuthSimpleMD5, H235Authenticator); public: H235AuthSimpleMD5(); PObject * Clone() const; virtual const char * GetName() const; virtual H225_CryptoH323Token * CreateCryptoToken(); virtual ValidationResult ValidateCryptoToken( const H225_CryptoH323Token & cryptoToken, const PBYTEArray & rawPDU ); virtual BOOL IsCapability( const H235_AuthenticationMechanism & mechansim, const PASN_ObjectId & algorithmOID ); virtual BOOL SetCapability( H225_ArrayOf_AuthenticationMechanism & mechansim, H225_ArrayOf_PASN_ObjectId & algorithmOIDs ); virtual BOOL IsSecuredPDU( unsigned rasPDU, BOOL received ) const; }; /** This class embodies a RADIUS compatible based authentication (aka Cisco Access Token or CAT). The users password is concatenated with the 4 byte timestamp and 1 byte random fields and an MD5 generated and sent/verified via the challenge field. */ class H235AuthCAT : public H235Authenticator { PCLASSINFO(H235AuthCAT, H235Authenticator); public: H235AuthCAT(); PObject * Clone() const; virtual const char * GetName() const; virtual H235_ClearToken * CreateClearToken(); virtual ValidationResult ValidateClearToken( const H235_ClearToken & clearToken ); virtual BOOL IsCapability( const H235_AuthenticationMechanism & mechansim, const PASN_ObjectId & algorithmOID ); virtual BOOL SetCapability( H225_ArrayOf_AuthenticationMechanism & mechansim, H225_ArrayOf_PASN_ObjectId & algorithmOIDs ); virtual BOOL IsSecuredPDU( unsigned rasPDU, BOOL received ) const; }; #if P_SSL /** This class embodies the H.235 "base line Procedure 1" from Annex D. */ class H235AuthProcedure1 : public H235Authenticator { PCLASSINFO(H235AuthProcedure1, H235Authenticator); public: H235AuthProcedure1(); PObject * Clone() const; virtual const char * GetName() const; virtual H225_CryptoH323Token * CreateCryptoToken(); virtual BOOL Finalise( PBYTEArray & rawPDU ); virtual ValidationResult ValidateCryptoToken( const H225_CryptoH323Token & cryptoToken, const PBYTEArray & rawPDU ); virtual BOOL IsCapability( const H235_AuthenticationMechanism & mechansim, const PASN_ObjectId & algorithmOID ); virtual BOOL SetCapability( H225_ArrayOf_AuthenticationMechanism & mechansim, H225_ArrayOf_PASN_ObjectId & algorithmOIDs ); virtual BOOL UseGkAndEpIdentifiers() const; }; #endif #endif //__OPAL_H235AUTH_H /////////////////////////////////////////////////////////////////////////////