📄 mschapv2.c
字号:
int i = 0;
if (!xsup_assert((Password != NULL), "Password != NULL", FALSE))
return;
if (!xsup_assert((NtResponse != NULL), "NtResponse != NULL", FALSE))
return;
if (!xsup_assert((PeerChallenge != NULL), "PeerChallenge != NULL", FALSE))
return;
if (!xsup_assert((AuthenticatorChallenge != NULL),
"AuthenticatorChallenge != NULL", FALSE))
return;
if (!xsup_assert((UserName != NULL), "UserName != NULL", FALSE))
return;
if (!xsup_assert((ReceivedResponse != NULL), "ReceivedResponse != NULL",
FALSE)) return;
if (!xsup_assert((ResponseOK != NULL), "ResponseOK != NULL", FALSE))
return;
GenerateAuthenticatorResponse(Password, NtResponse, PeerChallenge,
AuthenticatorChallenge, UserName,
(char *)&MyResponse, nthash);
while ((i < strlen(ReceivedResponse)) && (ReceivedResponse[i] != 0x20))
i++;
stripped = Malloc(i+1);
if (stripped == NULL)
{
ipc_events_malloc_failed(NULL);
*ResponseOK = FALSE;
return;
}
memcpy(stripped, ReceivedResponse, i);
stripped[i] = 0x00;
process_hex(stripped, strlen(stripped), (char *)&procResp);
FREE(stripped);
stripped = NULL;
if (memcmp((char *)&MyResponse, (char *)&procResp, 20) == 0)
{
*ResponseOK = 1;
} else {
*ResponseOK = 0;
}
}
// Take from hostap code by Jouni Malinen, and modified to work with
// XSupplicant.
void ChallengeResponse(char *Challenge, char *PasswordHash, char *Response)
{
uint8_t zpwd[7];
if (!xsup_assert((Challenge != NULL), "Challenge != NULL", FALSE))
return;
if (!xsup_assert((PasswordHash != NULL), "PasswordHash != NULL", FALSE))
return;
if (!xsup_assert((Response != NULL), "Response != NULL", FALSE))
return;
des_encrypt((uint8_t *) Challenge, (uint8_t *) PasswordHash, (uint8_t *) Response);
des_encrypt((uint8_t *) Challenge, (uint8_t *) PasswordHash + 7, (uint8_t *) Response+8);
zpwd[0] = PasswordHash[14];
zpwd[1] = PasswordHash[15];
memset(zpwd + 2, 0, 5);
des_encrypt((uint8_t *) Challenge, zpwd, (uint8_t *) Response+16);
}
void NtChallengeResponse(char *Challenge, char *Password, char *Response,
int nthash)
{
char password_hash[16];
if (!xsup_assert((Challenge != NULL), "Challenge != NULL", FALSE))
return;
if (!xsup_assert((Password != NULL), "Password != NULL", FALSE))
return;
if (!xsup_assert((Response != NULL), "Response != NULL", FALSE))
return;
if (nthash == 0)
{
NtPasswordHash(Password, (char *)&password_hash);
} else {
process_hex(Password, strlen(Password), (char *)&password_hash);
}
ChallengeResponse(Challenge, (char *)&password_hash, Response);
}
void GenerateNTResponse(char *AuthenticatorChallenge, char *PeerChallenge,
char *UserName, char *Password, char *Response,
int nthash)
{
char Challenge[8], PasswordHash[16];
if (!xsup_assert((AuthenticatorChallenge != NULL),
"AuthenticatorChallenge != NULL", FALSE))
return;
if (!xsup_assert((PeerChallenge != NULL), "PeerChallenge != NULL", FALSE))
return;
if (!xsup_assert((UserName != NULL), "UserName != NULL", FALSE))
return;
if (!xsup_assert((Password != NULL), "Password != NULL", FALSE))
return;
if (!xsup_assert((Response != NULL), "Response != NULL", FALSE))
return;
ChallengeHash(PeerChallenge, AuthenticatorChallenge, UserName, (char *)&Challenge);
debug_printf(DEBUG_AUTHTYPES, "PeerChallenge : ");
debug_hex_printf(DEBUG_AUTHTYPES, (uint8_t *) PeerChallenge, 8);
debug_printf(DEBUG_AUTHTYPES, "AuthenticatorChallenge : ");
debug_hex_printf(DEBUG_AUTHTYPES, (uint8_t *) AuthenticatorChallenge, 8);
debug_printf(DEBUG_AUTHTYPES, "Username : %s\n",UserName);
debug_printf(DEBUG_AUTHTYPES, "Challenge : ");
debug_hex_printf(DEBUG_AUTHTYPES, (uint8_t *) Challenge, 8);
if (nthash == 0)
{
NtPasswordHash(Password, (char *)&PasswordHash);
} else {
process_hex(Password, strlen(Password), (char *)&PasswordHash);
}
debug_printf(DEBUG_AUTHTYPES, "PasswordHash : ");
debug_hex_printf(DEBUG_AUTHTYPES, (uint8_t *) PasswordHash, 16);
ChallengeResponse(Challenge, (char *)&PasswordHash, Response);
debug_printf(DEBUG_AUTHTYPES, "Response : ");
debug_hex_printf(DEBUG_AUTHTYPES, (uint8_t *) Response, 24);
}
void GetMasterKey(char *PasswordHashHash, char *NTResponse, char *MasterKey)
{
EVP_MD_CTX cntx;
char Digest[20];
int retLen;
char Magic1[27] =
{0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74,
0x68, 0x65, 0x20, 0x4d, 0x50, 0x50, 0x45, 0x20, 0x4d,
0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4b, 0x65, 0x79};
if (!xsup_assert((PasswordHashHash != NULL), "PasswordHashHash != NULL",
FALSE))
return;
if (!xsup_assert((NTResponse != NULL), "NTResponse != NULL", FALSE))
return;
if (!xsup_assert((MasterKey != NULL), "MasterKey != NULL", FALSE))
return;
memset(&Digest, 0x00, 20);
EVP_DigestInit(&cntx, EVP_sha1());
EVP_DigestUpdate(&cntx, PasswordHashHash, 16);
EVP_DigestUpdate(&cntx, NTResponse, 24);
EVP_DigestUpdate(&cntx, (char *)&Magic1, 27);
EVP_DigestFinal(&cntx, (uint8_t *)&Digest, (unsigned int *) &retLen);
memcpy(MasterKey, &Digest, 16);
}
void GetMasterLEAPKey(char *PasswordHashHash, char *APC, char *APR, char *PC, char *PR, char *MasterKey)
{
EVP_MD_CTX cntx;
char Digest[20];
int retLen;
if (!xsup_assert((PasswordHashHash != NULL), "PasswordHashHash != NULL",
FALSE))
return;
if (!xsup_assert((APC != NULL), "APC != NULL", FALSE))
return;
if (!xsup_assert((APR != NULL), "APR != NULL", FALSE))
return;
if (!xsup_assert((PC != NULL), "PC != NULL", FALSE))
return;
if (!xsup_assert((PR != NULL), "PR != NULL", FALSE))
return;
if (!xsup_assert((MasterKey != NULL), "MasterKey != NULL", FALSE))
return;
memset(&Digest, 0x00, 20);
EVP_DigestInit(&cntx, EVP_md5());
EVP_DigestUpdate(&cntx, PasswordHashHash, 16);
EVP_DigestUpdate(&cntx, APC, 8);
EVP_DigestUpdate(&cntx, APR, 24);
EVP_DigestUpdate(&cntx, PC, 8);
EVP_DigestUpdate(&cntx, PR, 24);
EVP_DigestFinal(&cntx, (uint8_t *)&Digest, (unsigned int *) &retLen);
memcpy(MasterKey, &Digest, 16);
}
void GetAsymetricStartKey(char *MasterKey, char *SessionKey,
int SessionKeyLength, int IsSend, int IsServer)
{
EVP_MD_CTX cntx;
char Digest[20];
char Magic[84];
int retLen;
char Magic2[84] =
{0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69,
0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20,
0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x79,
0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65,
0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20,
0x6b, 0x65, 0x79, 0x2e};
char Magic3[84] =
{0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69,
0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20,
0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20,
0x6b, 0x65, 0x79, 0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68,
0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73,
0x69, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73,
0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20,
0x6b, 0x65, 0x79, 0x2e};
char SHSpad1[40] =
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
char SHSpad2[40] =
{0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2};
if (!xsup_assert((MasterKey != NULL), "MasterKey != NULL", FALSE))
return;
if (!xsup_assert((SessionKey != NULL), "SessionKey != NULL", FALSE))
return;
memset(&Digest, 0x00, 20);
if (IsSend) {
if (IsServer) {
memcpy(&Magic, &Magic3, 84);
} else {
memcpy(&Magic, &Magic2, 84);
}
} else {
if (IsServer) {
memcpy(&Magic, &Magic2, 84);
} else {
memcpy(&Magic, &Magic3, 84);
}
}
EVP_DigestInit(&cntx, EVP_sha1());
EVP_DigestUpdate(&cntx, MasterKey, 16);
EVP_DigestUpdate(&cntx, SHSpad1, 40);
EVP_DigestUpdate(&cntx, (char *)&Magic, 84);
EVP_DigestUpdate(&cntx, SHSpad2, 40);
EVP_DigestFinal(&cntx, (uint8_t *)&Digest, (unsigned int *)&retLen);
memcpy(SessionKey, &Digest, SessionKeyLength);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -