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

📄 authpage.cpp

📁 agsm a gsm sim manager for browsing, managing, and manipulating the phonebook,SMS on the SIM card. I
💻 CPP
字号:
// AuthPage.cpp : implementation file
//

#include "stdafx.h"
#include "agsm2.h"
#include "AuthPage.h"
#include "PcScCtrl.h"
#include "agsm2Dlg.h"
#include "Helper.h"
#include "ref/aka.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGsmAuthPage property page

IMPLEMENT_DYNCREATE(CGsmAuthPage, CPropertyPage)

CGsmAuthPage::CGsmAuthPage() : CPropertyPage(CGsmAuthPage::IDD)
{
	//{{AFX_DATA_INIT(CGsmAuthPage)
	m_editIMSI = _T("");
	m_Rand = _T("");
	m_SRES = _T("");
	m_Kc = _T("");
	//}}AFX_DATA_INIT
}

CGsmAuthPage::~CGsmAuthPage()
{
}

void CGsmAuthPage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGsmAuthPage)
	DDX_Text(pDX, IDC_IMSI, m_editIMSI);
	DDX_Text(pDX, IDC_EDIT_RAND, m_Rand);
	DDX_Text(pDX, IDC_EDIT_SRES, m_SRES);
	DDX_Text(pDX, IDC_EDIT_KC, m_Kc);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CGsmAuthPage, CPropertyPage)
	//{{AFX_MSG_MAP(CGsmAuthPage)
	ON_BN_CLICKED(IDC_ReadIMSI, OnReadIMSI)
	ON_BN_CLICKED(IDC_GUID_GEN, OnGuidGen)
	ON_BN_CLICKED(IDC_BUTTON_RUN_GSM_ALGORITHM, OnButtonRunGsmAlgorithm)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGsmAuthPage message handlers
void CGsmAuthPage::OnGuidGen() 
{
	// TODO: Add your control notification handler code here
	// create random GUID
	m_guid = GUID_NULL;
	::CoCreateGuid(&m_guid);
	if (m_guid == GUID_NULL)
	{
		AfxMessageBox("Unable to create new GUID.");
		return;
	}
	CString str;
	str.Format("%08lX%04X%04x%02X%02X%02X%02X%02X%02X%02X%02X",
					m_guid.Data1, m_guid.Data2, m_guid.Data3,
					m_guid.Data4[0], m_guid.Data4[1], m_guid.Data4[2], m_guid.Data4[3],
					m_guid.Data4[4], m_guid.Data4[5], m_guid.Data4[6], m_guid.Data4[7]);
	TRACE(str);
	m_Rand = str;
	UpdateData(FALSE);

}

void CGsmAuthPage::OnButtonRunGsmAlgorithm() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	if(m_Rand.IsEmpty())
	{
		AfxMessageBox("Random must be format like this:\r\n{584A529C-3131-4f75-8EDC-F13CC14D4EC8}");
		return;
	}
	UCHAR RAND[20];
	int ret = sscanf(m_Rand,"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02x%02x",
					&RAND[0], &RAND[1], &RAND[2],&RAND[3],
					&RAND[4], &RAND[5], &RAND[6],&RAND[7],
					&RAND[8], &RAND[9], &RAND[10],&RAND[11],
					&RAND[12], &RAND[13], &RAND[14],&RAND[15]);

    if(ret != 16)
	{
		AfxMessageBox("Random must be 16 Byte(Hex)");
		return;
	}

	CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
	BYTE SRESKc[256];
	RESAPDU resApdu;
	resApdu.data = SRESKc;
	resApdu.len = 256;
	try{
		ScReader.m_bGetRes = FALSE;
		ScReader.Select(0x3f00,resApdu);
		ScReader.Select(0x7f20,resApdu);
		ScReader.m_bGetRes = TRUE;
		ScReader.RunGsmAlgorithm((LPBYTE)&RAND[0],16,resApdu);
	}catch(LONG e)
	{
		if((e & 0xfffff000) == 0x6000 || (e & 0xfffff000) == 0x9000)
			AfxMessageBox(ScReader.FormatErrMsg(e));
		else
			Helper::ShowLastError(e);
	}
	CString SRES,Kc;
	SRES.Format("%02X%02x%02x%02x",
				SRESKc[0],SRESKc[1],SRESKc[2],SRESKc[3]);
	Kc.Format("%02X%02x%02x%02x%02X%02x%02x%02x",
				SRESKc[4],SRESKc[5],SRESKc[6],SRESKc[7],
				SRESKc[8],SRESKc[9],SRESKc[10],SRESKc[11]);
	m_SRES = (LPCTSTR)SRES;
	m_Kc = (LPCTSTR)Kc;
	UpdateData(FALSE);
}

void CGsmAuthPage::OnReadIMSI() 
{
	// TODO: Add your control notification handler code here
	BYTE ResData[255];
	RESAPDU resApdu;
	resApdu.data = ResData;
	resApdu.len = sizeof(ResData);
	CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;

	try{
		ScReader.m_bGetRes = FALSE;
		ScReader.Select(0x3f00,resApdu);
		resApdu.len = sizeof(ResData);
		ScReader.Select(0x7f20,resApdu);
		resApdu.len = sizeof(ResData);
		ScReader.Select(0x6f07,resApdu);
		ScReader.m_bGetRes = TRUE;
	
		resApdu.len = 9 + 2;
		ScReader.ReadBinary(0,0,resApdu);
		CString str = Helper::BcdToAscii(ResData+1, ResData[0]);
		str.Delete(0);
		m_editIMSI = str;
		UpdateData(FALSE);
	}catch(LONG e)
	{
		if((e & 0xfffff000) == 0x6000 || (e & 0xfffff000) == 0x9000)
			AfxMessageBox(ScReader.FormatErrMsg(e));
		else
			Helper::ShowLastError(e);
	}
	
}

/////////////////////////////////////////////////////////////////////////////
// C3GPPAuthPage property page

IMPLEMENT_DYNCREATE(C3GPPAuthPage, CPropertyPage)

C3GPPAuthPage::C3GPPAuthPage() : CPropertyPage(C3GPPAuthPage::IDD)
{
	//{{AFX_DATA_INIT(C3GPPAuthPage)
	m_editIMSI = _T("");
	m_Rand = _T("");
	m_CK = _T("");
	m_IK = _T("");
	m_RES = _T("");
	m_useBuiltInAKA = FALSE;
	m_sqn = _T("");
	//}}AFX_DATA_INIT
}

C3GPPAuthPage::~C3GPPAuthPage()
{
}

void C3GPPAuthPage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(C3GPPAuthPage)
	DDX_Control(pDX, IDC_BUTTON_RUN_3GPP_AKA, m_RunAKA);
	DDX_Control(pDX, IDC_CHECK_USE_BUILTIN, m_useBuiltIn);
	DDX_Text(pDX, IDC_IMSI, m_editIMSI);
	DDX_Text(pDX, IDC_EDIT_RAND, m_Rand);
	DDV_MaxChars(pDX, m_Rand, 32);
	DDX_Text(pDX, IDC_EDIT_CK, m_CK);
	DDV_MaxChars(pDX, m_CK, 32);
	DDX_Text(pDX, IDC_EDIT_IK, m_IK);
	DDV_MaxChars(pDX, m_IK, 32);
	DDX_Text(pDX, IDC_EDIT_RES, m_RES);
	DDV_MaxChars(pDX, m_RES, 32);
	DDX_Check(pDX, IDC_CHECK_USE_BUILTIN, m_useBuiltInAKA);
	DDX_Text(pDX, IDC_EDIT_SQN, m_sqn);
	DDV_MaxChars(pDX, m_sqn, 12);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(C3GPPAuthPage, CPropertyPage)
	//{{AFX_MSG_MAP(C3GPPAuthPage)
	ON_BN_CLICKED(IDC_ReadIMSI, OnReadIMSI)
	ON_BN_CLICKED(IDC_GUID_GEN, OnGuidGen)
	ON_BN_CLICKED(IDC_BUTTON_RUN_3GPP_AKA, OnButtonRun3gppAka)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// C3GPPAuthPage message handlers



void C3GPPAuthPage::OnReadIMSI() 
{
	// TODO: Add your control notification handler code here
	BYTE ResData[255];
	RESAPDU resApdu;
	resApdu.data = ResData;
	resApdu.len = sizeof(ResData);
	CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;

	try{
		ScReader.m_bGetRes = FALSE;
		ScReader.Select(0x3f00,resApdu);
		resApdu.len = sizeof(ResData);
		ScReader.Select(0x7f20,resApdu);
		resApdu.len = sizeof(ResData);
		ScReader.Select(0x6f07,resApdu);
		ScReader.m_bGetRes = TRUE;
	
		resApdu.len = 9 + 2;
		ScReader.ReadBinary(0,0,resApdu);
		CString str = Helper::BcdToAscii(ResData+1, ResData[0]);
		str.Delete(0);
		m_editIMSI = str;
		UpdateData(FALSE);
	}catch(LONG e)
	{
		if((e & 0xfffff000) == 0x6000 || (e & 0xfffff000) == 0x9000)
			AfxMessageBox(ScReader.FormatErrMsg(e));
		else
			Helper::ShowLastError(e);
	}
	
}
static uchar K[]={0xad,0x1b,0x5a,0x15,0x9b,0xe8,0x6b,0x2c,
					0xa6,0x6c,0x7a,0xe4,0x0b,0xba,0x9b,0x9d};
static uchar seed[]={0xb0,0xab,0xb9,0x9d,0x6a,0xc6,0xa7,0x4e,
					 0xb9,0x8e,0xb6,0xc2,0xda,0xb1,0xa5,0x51};
static uchar Fmk[L_FMK] = { 'A', 'H', 'A', 'G' };
static uchar AMF[2] = {0,1};
static uchar SQNhe[L_SQN]={0x00,0x00,0x00,0x00,0x00,0x00};
static uchar fi0=0x41;
static uchar fi1=0x42;
static uchar fi1star=0x43;
static uchar fi2=0x44;
static uchar fi3=0x45;
static uchar fi4=0x46;
static uchar fi5=0x47;
static uchar fi5star=0x48;
static uchar RAND[L_RAND];

void C3GPPAuthPage::OnGuidGen() 
{
	// TODO: Add your control notification handler code here
	f0(seed,fi0,Fmk,RAND);
	f0(seed,fi0,Fmk,&RAND[L_RAND/2]);

	char str[L_RAND*2+1];
	char *buf = str;
	int i;
	for(i=0; i<L_RAND; i++)
		buf += sprintf(buf,"%02x",RAND[i]);
	*buf = 0;
	TRACE(str);
	m_Rand = str;

	i = 5;
	while(SQNhe[i] == 0xff && i)
	{
		SQNhe[i--]++;
	}
	SQNhe[i]++;
	buf = str;
	for(i=0; i<6; i++)
		buf += sprintf(buf,"%02x",SQNhe[i]);
	*buf = 0;
	m_sqn = str;

	UpdateData(FALSE);
}

#define USIM_CMD_RUN_UMTS_ALG		0x00, 0x88, 0x00, 0x81, 0x22

void C3GPPAuthPage::OnButtonRun3gppAka() 
{
	// TODO: Add your control notification handler code here

	uchar MACA[L_MACA];
	uchar AK[L_AK];
	uchar AUTN[16];

	f1(K,fi1,RAND,Fmk,SQNhe,AMF,MACA);
	f5(K,fi5,RAND,Fmk,AK);
	int i;
	for(i=0; i<L_AK; i++)
	{
		AUTN[i] = AK[i] ^ SQNhe[i];	
	}
	AUTN[L_AK] = AMF[0];
	AUTN[L_AK+1] = AMF[1];
	for(i=0; i<L_MACA; i++)
	{
		AUTN[8+i] = MACA[i];
	}

	UCHAR cmd[1 + 5 + 1 + L_RAND + 1 + 16] = { PC_to_RDR_RunBuiltInFunctions,USIM_CMD_RUN_UMTS_ALG };
	cmd[1+5] = L_RAND;
	memcpy(cmd + 7, RAND, L_RAND);
	cmd[7 + L_RAND] = 16;
	memcpy(cmd + 7 + L_RAND + 1, AUTN, 16);

	UCHAR Res[64];
	DWORD ret;
	CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
	LONG lResult = ScReader.SCardControl(IOCTL_USCR_CCID,
						cmd,sizeof(cmd),Res,64,&ret);
	if(lResult == 0)
	{
		char str[256];
		if(ret == 2)
		{
			AfxMessageBox(ScReader.FormatErrMsg(Res));
		}else if(ret == 16 && Res[0] == 0xdc && Res[1] == 14)
		{//Recv AUTS
			//verify MAC
			f5star(K,fi5star,RAND,Fmk,AK);
			uchar SQNms[L_SQN];
			int i;
			uchar *p = Res+2;
			for(i=0; i<L_AK; i++)
			{
				SQNms[i] = AK[i] ^ *p++;	
			}
			f1star(K,fi1star,RAND,Fmk,SQNms,AMF,MACA);
			if(!memcmp(MACA,p,8))
			{//MAC == XMAC
				//reset SQNhe to SQNms
				for(i=0; i<L_SQN; i++)
					SQNhe[i] = SQNms[i];
				CString cstr;
				cstr.Format("Receive Synchronisation failure indication,\n"
							"Reset SQN to:%02x%02x%02x%02x%02x%02x,Please try again.",
							SQNhe[0],SQNhe[1],SQNhe[2],SQNhe[3],SQNhe[4],SQNhe[5]);
				AfxMessageBox(cstr);
				OnGuidGen();
			}else{
				AfxMessageBox("Synchronisation failure indication is invalid!");
			}
		}else if(ret >= 44 && Res[0] == 0xdb)
		{
			char *s = str;
			uchar *p = Res+2;
			for(i=0; i<Res[1]; i++)
				s += sprintf(s,"%02x",*p++);
			*s = 0;
			m_RES = str;

			s = str;
			uchar CK_len = *p++;
			for(i=0; i<CK_len; i++)
				s += sprintf(s,"%02x",*p++);
			m_CK = str;
			
			s = str;
			uchar IK_len = *p++;
			for(i=0; i<IK_len; i++)
				s += sprintf(s,"%02x",*p++);
			m_IK = str;
			UpdateData(FALSE);
		}
	}else{
		Helper::ShowLastError(lResult);
	}
}

BOOL C3GPPAuthPage::OnSetActive() 
{
	// TODO: Add your specialized code here and/or call the base class

	CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
	int n = ScReader.m_asReaderNames.GetSize();
	if(n <=0 )
		return TRUE;
	if(strstr(ScReader.m_asReaderNames[ScReader.GetCurReader()],"ED11"))
	{
		m_useBuiltIn.EnableWindow();
		m_useBuiltInAKA = TRUE;
		m_RunAKA.EnableWindow();
		UpdateData(FALSE);
	}else{
		m_useBuiltIn.EnableWindow(FALSE);
		m_RunAKA.EnableWindow(FALSE);
	}

	return CPropertyPage::OnSetActive();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -