⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap.cpp

📁 基于单片机的 snmp协议解析的一些原代码 给有用的 同行
💻 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 + -