?? chap.cpp
字號:
//---------------------------------------------------------------------------
#include <string>
using namespace std;
#include <vcl\vcl.h>
#pragma hdrstop
#include "chap.h"
#include "linkDefs.h"
//---------------------------------------------------------------------------
CHAP::CHAP()
{
authState = INSECURE;
}
CHAP::~CHAP()
{
}
void CHAP::SetSecret(string theSecret)
{
secret.assign(theSecret);
}
void CHAP::GetSecret(string &theSecret)
{
theSecret.assign(secret);
}
unsigned char CHAP::GetIdentifier()
{
return identifier;
}
void CHAP::SetChallengeValue() // have to set this different each time
{
long i;
long length;
challengeValue.assign("");
length=random(192) + 64;
for (i=0; i<length; i++)
{
challengeValue.append(1, (char)random(256));
}
}
void CHAP::GetChallengeValue(string &theChallengeValue)
{
long valueSize;
theChallengeValue = data;
valueSize = (long)(unsigned char)data[0];
theChallengeValue.erase(0,1); // erase value-size
// if ((long)theChallengeValue.length() > (long)valueSize)
// theChallengeValue.erase(valueSize, ((long)theChallengeValue.length()-(long)valueSize)); // erase name
if (theChallengeValue.length() > valueSize)
theChallengeValue.erase(valueSize, (theChallengeValue.length()-valueSize)); // erase name
}
void CHAP::SetName(string theName)
{
name = theName;
}
void CHAP::GetName(string &theName)
{
theName.assign(name);
}
long CHAP::DecodeCHAP()
{
return code;
}
Authenticate_State CHAP::GetAuthenticateState()
{
return authState;
}
void CHAP::FillCHAP(string &theData)
{
if (theData.length() >= 4)
{
code = theData.at(0);
identifier = theData.at(1);
length = (unsigned char) (theData.at(2)) * 256 + (unsigned char)theData.at(3);
data.assign(theData);
data.erase(0,4);
}
else
{
code = 0;
identifier = 0;
length= theData.length();
data.assign("");
}
SetPacketTime();
}
void CHAP::GetResponseValue(string &theValue)
{
theValue.assign(data.substr(1, data.length()-1));
// theValue.remove(0,1);
}
void CHAP::AssignChallenge()
{
code = PPP_CHAP_CODE_CHALLENGE;
identifier = identifierCounter++;
SetChallengeValue();
SetName("Central");
length = challengeValue.length() + 1 + name.length() + 4;
data.assign(1, challengeValue.length());
data.append(challengeValue);
data.append(name);
}
void CHAP::AssignChallengeResponse(CHAP challengeCHAPPacket)
{
string stream;
string localChallengeValue;
code = PPP_CHAP_CODE_RESPONSE;
identifier = challengeCHAPPacket.GetIdentifier();
stream.assign(1, identifier);
stream.append(secret);
challengeCHAPPacket.GetChallengeValue(localChallengeValue);
challengeValue.assign(localChallengeValue);
stream.append(challengeValue);
challengeValue=GetHash(stream.c_str(), stream.length());
SetName("CENTRAL");
length = challengeValue.length() + 1 + name.length() + 4;
data.assign(1, challengeValue.length());
data.append(challengeValue);
data.append(name);
}
void CHAP::AssignSuccess(CHAP receivedCHAP)
{
code = PPP_CHAP_CODE_SUCCESS;
identifier = receivedCHAP.GetIdentifier();
length = 4;
data.clear();
}
void CHAP::AssignFailure(CHAP receivedCHAP)
{
code = PPP_CHAP_CODE_FAILURE;
identifier = receivedCHAP.GetIdentifier();
length = 4;
data.clear();
}
long CHAP::DetermineSuccessFailure(CHAP sentCHAP)
{ // get both secrets set
string stream;
string correctValue;
string receivedValue;
string temp;
char valueSize;
stream.assign(1, sentCHAP.GetIdentifier());
stream.append(secret);
sentCHAP.GetChallengeValue(temp); // note that this temp includes the system name!!!
stream.append(temp);
correctValue=GetHash(stream.c_str(), stream.length());
receivedValue = data;
// valueSize = receivedValue[0];
// receivedLength = sentCHAP.GetLength();
receivedValue.erase(0,1); // remove Value-size field
receivedValue.erase(16, receivedValue.length()-16); // erase the rest of it; i.e. 'Name'
if (!correctValue.compare(0, correctValue.length(), receivedValue)) //CBuilder 3
return PPP_CHAP_CODE_SUCCESS;
else
return PPP_CHAP_CODE_FAILURE;
}
long CHAP::GetPacket(string &packet)
{
packet.assign(1, code);
packet.append(1, identifier);
packet.append(1, (unsigned char)(length/256));
packet.append(1, (unsigned char)(length%256));
packet.append(data);
return (packet.length());
}
void CHAP::SetPacketTime()
{
timeOfPacket = GetTickCount();
}
unsigned long CHAP::GetPacketTime()
{
return timeOfPacket;
}
long CHAP::GetLength()
{
return length;
}
string CHAP::GetHash(const char *theHash, unsigned int len)
{
MD_CTX context;
unsigned char digest[16];
string strDigest;
MDInit(&context);
MDUpdate(&context, (unsigned char *)theHash, len);
MDFinal(digest, &context);
strDigest.assign((const char *)digest, 16);
return strDigest;
}
void CHAP::Test()
{
MD_CTX context;
unsigned char digest[16];
unsigned int len = strlen("a");
unsigned char *temp;
/* temp = GetHash("a");
cout << temp;
temp = GetHash("abc");
cout << temp;
temp = GetHash("message digest");
cout << temp;
temp = GetHash("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
cout << temp;*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -