📄 md5_test.cxx
字号:
/* BEGIN_COPYRIGHT *//* *//* Open Diameter: Open-source software for the Diameter and *//* Diameter related protocols *//* *//* Copyright (C) 2002-2004 Open Diameter Project *//* *//* This library is free software; you can redistribute it and/or modify *//* it under the terms of the GNU Lesser General Public License as *//* published by the Free Software Foundation; either version 2.1 of the *//* License, or (at your option) any later version. *//* *//* This library is distributed in the hope that it will be useful, *//* but WITHOUT ANY WARRANTY; without even the implied warranty of *//* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *//* Lesser General Public License for more details. *//* *//* You should have received a copy of the GNU Lesser General Public *//* License along with this library; if not, write to the Free Software *//* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *//* USA. *//* *//* In addition, when you copy and redistribute some or the entire part of *//* the source code of this software with or without modification, you *//* MUST include this copyright notice in each copy. *//* *//* If you make any changes that are appeared to be useful, please send *//* sources that include the changed part to *//* diameter-developers@lists.sourceforge.net so that we can reflect your *//* changes to one unified version of this software. *//* *//* END_COPYRIGHT */// $Id: md5_test.cxx,v 1.8 2006/03/16 17:01:52 vfajardo Exp $ // A test program for EAP API.// Written by Yoshihiro Ohba#include <iostream>#include <ace/OS.h>#include <ace/Signal.h>#include <ace/Event_Handler.h>#include <boost/shared_ptr.hpp>#include "eap.hxx"#include "eap_peerfsm.hxx"#include "eap_authfsm.hxx"#include "eap_identity.hxx"#include "eap_policy.hxx"#include "eap_method_registrar.hxx"#include "eap_fsm.hxx"#include "eap_log.hxx"#include "eap_md5.hxx"class MyPeerSwitchStateMachine;class MyStandAloneAuthSwitchStateMachine;class MyBackendAuthSwitchStateMachine;class MyPassThroughAuthSwitchStateMachine;class PeerData;class StandAloneAuthApplication;class BackendAuthApplication;class PassThroughAuthApplication;/// Task class used in this sample program.class EapTask : public AAA_Task{ public: /// Constructor. EapTask() : AAA_Task(AAA_SCHED_FIFO, "EAP") {} /// Destructor. ~EapTask() {}};/// This class defines an EAP transport. When an EAP message is sent/// to a particular entity (e.g., an entity may be peer, standalone/// authenticator, backend authenticator or passthrough authenticator/// depending on the role of the sender, Transmit() method of the/// Channel object of the receiving entity is called. Transmit()/// method can have sub-channels which is used for distinguishing different/// types of messages.class Channel { public: Channel() {} virtual ~Channel() {} virtual void Transmit(AAAMessageBlock *msg)=0; virtual void Transmit(AAAMessageBlock *msg, int subChannel)=0;};/* --------------------------------------------------------- Brief explanation on what is done in this sample program. --------------------------------------------------------- This program includes three test cases from which the program will prompt you to choose one. o Case 1 is for EAP conversation between a peer and an authenticator *without* a passthrough authenticator in between. o Case 2 is for EAP conversation between a peer and an authenticator *with* a passthrough authenticator in between. o Case 3 is similar to Case 2, except that the passthrough authenticator originates the Request/Identity on behalf of the backend authenticator. All cases completes with success after Idenity exchange and MD5-Challenge authentication method is performed. In both cases, the peer session entity will prompt you to input a username. Once the username is input, it is carried in an Response/Identity message and sent to the (backend) authenticator. In Case 2 and Case 3, passthrough authenticator will forward the response to the backend authenticator. The authenticator or passthrough authenticator will retransmit the Request/Identity message until you input the username or the number of retransmission reaches its maximum value (the maximum value is set to 3 in this program). For the latter case, the authenticator will stop its state machine and the peer will timeout and fail. Case 1: Peer Authenticator | Request/Identity | |<-----------------------| | |(input userid) | | | | Response/Identity | |----------------------->| | Request/MD5-Challenge | |<-----------------------| | Response/MD5-Challenge| |----------------------->| | | | Success | |<-----------------------|Case 2: Peer PassThough Backend Authenticator Authenticator | | Null message | | |------------------------->| | | | | | Request/Identity | | Request/Identity |<-------------------------| |<-----------------------| | | | |(input userid) | | | | | | Response/Identity | | |----------------------->| Response/Identity | | |------------------------->| | | Request/MD5-Challenge | | Request/MD5-Challenge |<-------------------------| |<-----------------------| | | Response/MD5-Challenge| | |----------------------->| Response/MD5-Challenge | | |------------------------->| | | | | | Success | | Success |<-------------------------| |<-----------------------|Case 3: Peer PassThough Backend Authenticator Authenticator | Request/Identity | | |<-----------------------| | | | |(input userid) | | | | | | Response/Identity | | |----------------------->| Response/Identity | | |------------------------->| | | Request/MD5-Challenge | | Request/MD5-Challenge |<-------------------------| |<-----------------------| | | Response/MD5-Challenge| | |----------------------->| Response/MD5-Challenge | | |------------------------->| | | | | | Success | | Success |<-------------------------| |<-----------------------| */// Class definition for authenticator identity method for my application.class MyEapAuthIdentityStateMachine : public EapAuthIdentityStateMachine{ friend class EapMethodStateMachineCreator<MyEapAuthIdentityStateMachine>;public: MyEapAuthIdentityStateMachine(EapSwitchStateMachine &s) : EapAuthIdentityStateMachine(s) {} // Reimplemented from EapAuthIdentityStateMachine. ProcessIdentityResult ProcessIdentity(std::string& identity) { std::cout << "Identity received : " << identity << std::endl; return EapAuthIdentityStateMachine::Success; }private: ~MyEapAuthIdentityStateMachine() {} };// Class definition for peer MD5-Challenge method for my application.class MyEapPeerMD5ChallengeStateMachine : public EapPeerMD5ChallengeStateMachine{ friend class EapMethodStateMachineCreator<MyEapPeerMD5ChallengeStateMachine>;public: MyEapPeerMD5ChallengeStateMachine(EapSwitchStateMachine &s) : EapPeerMD5ChallengeStateMachine(s) {} // Reimplemented from EapPeerMD5ChallengeStateMachine. void InputPassphrase() { std::string &passphrase = Passphrase(); passphrase.assign("abcd1234"); }private: ~MyEapPeerMD5ChallengeStateMachine() {} };// Class definition for authenticator MD5-Challenge method for my application.class MyEapAuthMD5ChallengeStateMachine : public EapAuthMD5ChallengeStateMachine{ friend class EapMethodStateMachineCreator<MyEapPeerMD5ChallengeStateMachine>;public: MyEapAuthMD5ChallengeStateMachine(EapSwitchStateMachine &s) : EapAuthMD5ChallengeStateMachine(s) {} // Reimplemented from EapPeerMD5ChallengeStateMachine. void InputPassphrase() { std::string &passphrase = Passphrase(); passphrase.assign("abcd1234"); }private: ~MyEapAuthMD5ChallengeStateMachine() {} };class MyPeerSwitchStateMachine: public EapPeerSwitchStateMachine{ public: MyPeerSwitchStateMachine(ACE_Reactor &r, EapJobHandle& h) : EapPeerSwitchStateMachine(r, h) {} void Send(AAAMessageBlock *b); void Success(); void Failure(); void Notification(std::string &str); void Abort(); std::string& InputIdentity(); private: std::string identity;};class MyStandAloneAuthSwitchStateMachine : public EapStandAloneAuthSwitchStateMachine{ public: MyStandAloneAuthSwitchStateMachine(ACE_Reactor &r, EapJobHandle& h) : EapStandAloneAuthSwitchStateMachine(r, h) {} void Send(AAAMessageBlock *b); void Success(AAAMessageBlock *b); void Success(); void Failure(AAAMessageBlock *b); void Failure(); void Abort(); private:};class MyBackendAuthSwitchStateMachine: public EapBackendAuthSwitchStateMachine{public: MyBackendAuthSwitchStateMachine(ACE_Reactor &r, EapJobHandle& h) : EapBackendAuthSwitchStateMachine(r, h) {} void Send(AAAMessageBlock *b); void Success(AAAMessageBlock *b); void Success(); void Failure(AAAMessageBlock *b); void Failure(); void Abort(); private:};class MyPassThroughAuthSwitchStateMachine : public EapPassThroughAuthSwitchStateMachine{ public: MyPassThroughAuthSwitchStateMachine(ACE_Reactor &r, EapJobHandle& h) : EapPassThroughAuthSwitchStateMachine(r, h) {} void Send(AAAMessageBlock *b); void Success(AAAMessageBlock *b); void Success(); void Failure(AAAMessageBlock *b); void Failure(); void Abort(); void ForwardResponse(AAAMessageBlock *b); private:};class PeerChannel : public Channel{ public: PeerChannel(MyPeerSwitchStateMachine &s) : eap(s) {} void Transmit(AAAMessageBlock *msg) { eap.Receive(msg); } void Transmit(AAAMessageBlock *msg, int) {} MyPeerSwitchStateMachine &eap;};class StandAloneAuthChannel : public Channel{ public: StandAloneAuthChannel(MyStandAloneAuthSwitchStateMachine &s) : eap(s) {} void Transmit(AAAMessageBlock *msg) { eap.Receive(msg); } void Transmit(AAAMessageBlock *msg, int) {} MyStandAloneAuthSwitchStateMachine &eap;};class BackendAuthChannel : public Channel{ public: BackendAuthChannel(MyBackendAuthSwitchStateMachine &s) : eap(s), firstMessage(true) {} void Transmit(AAAMessageBlock *msg=0) { if (firstMessage) { msg ? eap.Start(msg) : eap.Start(); firstMessage = false; } else { eap.Receive(msg); } } void Transmit(AAAMessageBlock *msg, int) {} MyBackendAuthSwitchStateMachine &eap; bool firstMessage;};class PassThroughAuthChannel : public Channel{ public: PassThroughAuthChannel(MyPassThroughAuthSwitchStateMachine& s) : eap(s) {} void Transmit(AAAMessageBlock *msg) { eap.Receive(msg); } void Transmit(AAAMessageBlock *msg, int subChannel) { switch(subChannel) { case 1: eap.AAA_Continue(msg); break; case 2: eap.AAA_Success(msg); break; case 3: eap.AAA_Failure(msg); break; } } MyPassThroughAuthSwitchStateMachine &eap;};class PeerApplication : public AAA_JobData{ public: PeerApplication(EapTask &task, ACE_Semaphore &sem) : handle(EapJobHandle(AAA_GroupedJob::Create(task.Job(), this, "peer"))), eap(boost::shared_ptr<MyPeerSwitchStateMachine> (new MyPeerSwitchStateMachine(*task.reactor(), handle))), semaphore(sem), rxChannel(PeerChannel(*eap)), txChannel(0), md5Method(EapContinuedPolicyElement(EapType(4))) { eap->Policy().InitialPolicyElement(&md5Method); semaphore.acquire(); } ~PeerApplication() {} void Start(Channel *c) { txChannel = c; eap->Start(); } PeerChannel* RxChannel() { return &rxChannel; } Channel& TxChannel() { return *txChannel; } MyPeerSwitchStateMachine& Eap() { return *eap; } ACE_Semaphore& Semaphore() { return semaphore; } private: EapJobHandle handle; boost::shared_ptr<MyPeerSwitchStateMachine> eap; ACE_Semaphore &semaphore; PeerChannel rxChannel; Channel *txChannel; EapContinuedPolicyElement md5Method;};// My application session (not used in this test program).class StandAloneAuthApplication : public AAA_JobData{ public: StandAloneAuthApplication(EapTask &task, ACE_Semaphore &sem) : handle(EapJobHandle(AAA_GroupedJob::Create(task.Job(), this, "standalone"))), eap(boost::shared_ptr<MyStandAloneAuthSwitchStateMachine> (new MyStandAloneAuthSwitchStateMachine(*task.reactor(), handle))), semaphore(sem), rxChannel(StandAloneAuthChannel(*eap)), txChannel(0), identityMethod(EapContinuedPolicyElement(EapType(1))),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -