📄 mschapv2.c
字号:
char *AuthenticatorResponse){ char PasswordHash[16]; char PasswordHashHash[16]; EVP_MD_CTX context; int Digest_len; char Digest[20]; char Challenge[8]; char Magic1[39] = {0x4D, 0x61, 0x67, 0x69, 0x63, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x63, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x74}; char Magic2[41] = {0x50, 0x61, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x20, 0x69, 0x74, 0x20, 0x64, 0x6F, 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6E, 0x20, 0x6F, 0x6E, 0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E}; if ((!Password) || (!NTResponse) || (!PeerChallenge) || (!AuthenticatorChallenge) || (!UserName) || (!AuthenticatorResponse)) { debug_printf(DEBUG_NORMAL, "Invalid parameter passed in to GenerateAuthenticatorResponse()!\n"); return; } NtPasswordHash(Password, (char *)&PasswordHash); HashNtPasswordHash((char *)&PasswordHash, (char *)&PasswordHashHash); EVP_DigestInit(&context, EVP_sha1()); EVP_DigestUpdate(&context, &PasswordHashHash, 16); EVP_DigestUpdate(&context, NTResponse, 24); EVP_DigestUpdate(&context, Magic1, 39); EVP_DigestFinal(&context, (char *)&Digest, &Digest_len); ChallengeHash(PeerChallenge, AuthenticatorChallenge, UserName, Challenge); EVP_DigestInit(&context, EVP_sha1()); EVP_DigestUpdate(&context, &Digest, 20); EVP_DigestUpdate(&context, &Challenge, 8); EVP_DigestUpdate(&context, Magic2, 41); EVP_DigestFinal(&context, (char *)&Digest, &Digest_len); memcpy(AuthenticatorResponse, &Digest, Digest_len);}void CheckAuthenticatorResponse(char *Password, char *NtResponse, char *PeerChallenge, char *AuthenticatorChallenge, char *UserName, char *ReceivedResponse, int *ResponseOK){ char MyResponse[20], procResp[20]; if ((!Password) || (!NtResponse) || (!PeerChallenge) || (!AuthenticatorChallenge) || (!UserName) || (!ReceivedResponse) || (!ResponseOK)) { debug_printf(DEBUG_NORMAL, "Invalid parameters passed in to CheckAuthenticatorResponse()!\n"); return; } GenerateAuthenticatorResponse(Password, NtResponse, PeerChallenge, AuthenticatorChallenge, UserName, (char *)&MyResponse); process_hex(ReceivedResponse, strlen(ReceivedResponse), (char *)&procResp); 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 ((!Challenge) || (!PasswordHash) || (!Response)) { debug_printf(DEBUG_NORMAL, "Invalid parameters passed in to ChallengeResponse()!\n"); return; } des_encrypt(Challenge, PasswordHash, Response); des_encrypt(Challenge, PasswordHash + 7, Response+8); zpwd[0] = PasswordHash[14]; zpwd[1] = PasswordHash[15]; memset(zpwd + 2, 0, 5); des_encrypt(Challenge, zpwd, Response+16);}void NtChallengeResponse(char *Challenge, char *Password, char *Response){ char password_hash[16]; if ((!Challenge) || (!Password) || (!Response)) { debug_printf(DEBUG_NORMAL, "Invalid parameters passed in to NtChallengeResponse()!\n"); return; } NtPasswordHash(Password, (char *)&password_hash); ChallengeResponse(Challenge, (char *)&password_hash, Response);}void GenerateNTResponse(char *AuthenticatorChallenge, char *PeerChallenge, char *UserName, char *Password, char *Response){ char Challenge[8], PasswordHash[16]; if ((!AuthenticatorChallenge) || (!PeerChallenge) || (!UserName) || (!Password) || (!Response)) { debug_printf(DEBUG_NORMAL, "Invalid parameters passed in to GenerateNTResponse()!\n"); return; } ChallengeHash(PeerChallenge, AuthenticatorChallenge, UserName, (char *)&Challenge); debug_printf(DEBUG_AUTHTYPES, "PeerChallenge : "); debug_hex_printf(DEBUG_AUTHTYPES, PeerChallenge, 8); debug_printf(DEBUG_AUTHTYPES, "AuthenticatorChallenge : "); debug_hex_printf(DEBUG_AUTHTYPES, AuthenticatorChallenge, 8); debug_printf(DEBUG_AUTHTYPES, "Username : %s\n",UserName); debug_printf(DEBUG_AUTHTYPES, "Challenge : "); debug_hex_printf(DEBUG_AUTHTYPES, Challenge, 8); NtPasswordHash(Password, (char *)&PasswordHash); debug_printf(DEBUG_AUTHTYPES, "PasswordHash : "); debug_hex_printf(DEBUG_AUTHTYPES, PasswordHash, 16); ChallengeResponse(Challenge, (char *)&PasswordHash, Response); debug_printf(DEBUG_AUTHTYPES, "Response : "); debug_hex_printf(DEBUG_AUTHTYPES, 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 ((!PasswordHashHash) || (!NTResponse) || (!MasterKey)) { debug_printf(DEBUG_NORMAL, "Invalid parameters passed in to GetMasterKey()!\n"); return; } bzero(&Digest, 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, (char *)&Digest, &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 ((!PasswordHashHash) || (!APC) || (!APR) || (!PC) || (!PR) || (!MasterKey)) { debug_printf(DEBUG_NORMAL, "Invalid data passed in to GetMasterLEAPKey()!\n"); return; } bzero(&Digest, 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, (char *)&Digest, &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 ((!MasterKey) || (!SessionKey)) { debug_printf(DEBUG_NORMAL, "Invalid parameters passed in to GetAsymetricStartKey()!\n"); return; } bzero(&Digest, 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, (char *)&Digest, &retLen); memcpy(SessionKey, &Digest, SessionKeyLength);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -