亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fenxi_tpdu_t0_v2.cpp

?? 分析機頂盒與智能卡通信的串口數據解析TPDU
?? CPP
字號:
/*********************************分析機頂盒與智能卡通信的串口數據解析TPDU*******************************/ 

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;


/*********************************錯誤碼定義*******************************/ 

#define SUCCESS			0x00 
#define ERR_GET_TPDU	0x01
#define ERR_GET_SW1		0x02
#define ERR_GET_SW2		0x03
#define ERR_GET_GTR		0x04
#define ERR_CHK_GTR		0x05
#define ERR_SEND_TPDU_AGAIN 0x06
#define ERR_CHK_TPDU_AGAIN	0x07
#define ERR_SW1_SW2		0x08
#define ERR_READ_BYTES	0x09
#define ERR_UNKNOWN_9XXX 0x0A
#define ERR_UNKNOWN_90XX 0x0B
#define ERR_UNKNOWN_6XXX	0x0C
#define ERR_NOT_6X_OR_9X	0x0D
#define ERR_SEND_BYTES	0x0E

#define ERR_TS		0x7F
#define ERR_T0		0x80
#define ERR_TA1		0x81	
#define ERR_TA2		0x82
#define ERR_TA3		0x83
#define ERR_TB1		0x84
#define ERR_TB2		0x85
#define ERR_TB3		0x86
#define ERR_TC1		0x87
#define ERR_TC2		0x88
#define ERR_TC3		0x89
#define ERR_TD1		0x8A
#define ERR_TD2		0x8B
#define ERR_TD3		0x8C
#define ERR_HIS		0x8D
#define ERR_UNKNOWN_T_Type	0x8E	

/**********************數據結構定義*******************************/ 
typedef unsigned char uchar;
typedef unsigned char SW;

typedef struct str_TPDU {
	uchar CLA;
	uchar INS;
	uchar P1;
	uchar P2;
	uchar P3;
} TPDU;

typedef struct str_INPUTDATA
{	
	uchar len; 
	uchar buf[256];
} INPUTDATA;


typedef struct str_ATR {
       uchar TS;
       uchar T0;
       uchar TA1, TA2, TA3;
       uchar TB1, TB2, TB3;
       uchar TC1, TC2, TC3;
       uchar TD1, TD2, TD3;
       uchar his[15];
      // uchar TCK;
} ATR;

typedef enum en_Condition {
	TYPE1=1, TYPE2, TYPE3, TYPE4
	} e_Condition;

/**********************全局變量聲明*******************************/
char strFileIn[256];
char strFileOut[256];
FILE *g_fpin;
FILE *g_fpout;
TPDU g_tpdu;
ATR	 g_atr;
INPUTDATA g_inputData;
SW g_sw1, g_sw2;
int g_last_errno;
int g_cnt_tpdu;
int g_apdu_cnt;
int g_not_done;
int g_Lc;
int g_Le;
int g_cond_type;
bool g_bshow = 0;



/**********************函數聲明 *******************************/ 
int getATR(); //抓取一個ATR 

void outputATR(); // 輸出一個ATR 

int mainProc(); //處理一個APDU命令響應對 

bool getTPDU(void); // 抓取一個C-TPDU 

bool getSW1(); // 抓取SW1 

bool getSW2(); // 抓取SW2 

bool readBytes(int num); //抓取入卡或出卡數據 

void install();	//初始化函數 


inline bool checkGTR() {return (g_tpdu.CLA==0x00 && g_tpdu.INS==0xC0 && g_tpdu.P1==0x00 
			&&g_tpdu.P2==0x00) ; } // 檢查是否為Get Response 命令 

inline bool checkSend_TPDU_Again(const TPDU &tmp) 
{ return (tmp.CLA==g_tpdu.CLA && tmp.INS==g_tpdu.INS && tmp.P1==g_tpdu.P1 
			&& tmp.P2==g_tpdu.P2 && tmp.P3==g_sw2) ; } //檢查重發命令 

inline bool EQ(const uchar a, const uchar b) { return (a==b); } //判斷兩個一字節數是否相等 

inline uchar High4(const uchar c) {return (c >> 4); } //返回高四位 

inline uchar Low4(const uchar c) {return (c&0x0f); } // 返回第四位 

inline bool isGetResponse() { return checkGTR(); } //判斷是否為 Get Response 命令  

bool findFirst9000()
{
	while(true)
	{
		if(fscanf(g_fpin, "%x", &g_sw1) == EOF) return false;
		if(EQ(g_sw1,0x90))
		{
			if(fscanf(g_fpin, "%x", &g_sw2) == EOF) return false;
			if(EQ(g_sw2, 0x00)) break;
			else fprintf(g_fpout, " %02X", g_sw2);
		}
		else fprintf(g_fpout, " %02X", g_sw1);
	}
	
	fprintf(g_fpout, "\nReturn code [SW1 SW2]:\n%02X %02X\n", g_sw1, g_sw2);
	
	return true;
	
}
 
int main()
{
	install();
	
	//read input file
	do
	{
		puts("Please input File Name:");
		
	} while(gets(strFileIn)==NULL || strlen(strFileIn) == 0);
	
	sprintf(strFileOut, "%s.out", strFileIn);
	
	if(!(g_fpin=fopen(strFileIn, "r"))) puts("Open File to read error");
	if(!(g_fpout=fopen(strFileOut, "w"))) puts("Open File to write error");
	
	
	//set ATR times in apperence.
	uchar ttt;
	puts("ATR times:");
	scanf("%d", &ttt);
	if(ttt-- > 0 ) g_last_errno = getATR();
	
	if(g_last_errno != SUCCESS) goto end;
	
	// print ATR 
	outputATR(); 
	
	fputs("\n--------Below Pakcet(Not Done):-------\n", g_fpout);
	if(!findFirst9000()) goto end;
	g_not_done++;
	
	//T != 0
	if(EQ(High4(g_atr.T0),0xE))// T = 1
	{	
			// deal with T = 1 half work tansport protocal
			puts("Deal with T = 1 half work tansport protocal");
			g_last_errno = ERR_UNKNOWN_T_Type;
			goto end;
	}
	
	// T = 0
	while(true) 
	{		
			fprintf(stdout, "APDU %d\n", ++g_apdu_cnt);
	
			g_last_errno = mainProc();
			
			if(g_last_errno != ERR_GET_TPDU)
			{
				fprintf(g_fpout, "Return code [SW1 SW2]:\n%02X %02X\n", g_sw1, g_sw2);
			}
			else 
			{
				fprintf(g_fpout, "EOF\n");
			}
			
			fprintf(g_fpout, "\n\n\n\n");
			
			if(g_last_errno == ERR_READ_BYTES || g_last_errno == ERR_SEND_BYTES) break; 
			if(g_last_errno != SUCCESS && g_last_errno == ERR_GET_TPDU) break;
			
			if(g_last_errno == ERR_NOT_6X_OR_9X)
			{
				g_not_done++;
				fputs("\n--------Below Pakcet(Not Done):-------\n", g_fpout);
				if(!findFirst9000()) goto end;
			}
			
	}
	
end:	
	//print last error
	fprintf(g_fpout, "\nLast errno: %02X\n", g_last_errno);
	
	fprintf(g_fpout, "\nTotal Done Packet: %d\nNot Done Packet: %d\n", g_apdu_cnt, g_not_done);
	
	// close file
	fclose(g_fpin);
	fclose(g_fpout);
	
	system("pause");
	
	return true;
	
}


/*****************************  function: install() ***********************************/

void install()
{
	memset((ATR*)&g_atr, 0, sizeof(g_atr));
	memset((TPDU*)&g_tpdu, 0, sizeof(g_tpdu));
	memset((INPUTDATA*)&g_inputData, 0, sizeof(g_inputData));
	g_apdu_cnt = 0;
	memset(strFileIn, 0, sizeof(strFileIn));
	memset(strFileOut, 0, sizeof(strFileOut));
	g_fpin = stdin;
	g_fpout = stdout;
	g_sw1 = g_sw2 = 0;
	g_last_errno = SUCCESS;
	g_apdu_cnt = g_cnt_tpdu = 0;
	g_Lc = g_Le = 0;
	g_cond_type = 0;
	g_not_done = 0;
}


/*****************************  function: getATR() ***********************************/
int getATR()
{
	//初始化g_atr為00
	memset(&g_atr, 0, sizeof(g_atr));
	// get TS
	int ch = 0x00;
    while(fscanf(g_fpin, "%X", &ch)!= EOF && ch!=0x3B && ch!=0x3F)
		fprintf(g_fpout, " %02X", ch);
   
   	g_atr.TS = ch;
    if(g_atr.TS!=0x3B && g_atr.TS!=0x3F) return ERR_TS; 
          
	// get T0          
    if(fscanf(g_fpin, "%X", &g_atr.T0) == EOF) return ERR_T0;
					
	// get TA1--TD1
	if(g_atr.T0&0x80 && fscanf(g_fpin, "%X", &g_atr.TA1) == EOF) return ERR_TA1;
	if(g_atr.T0&0x40 && fscanf(g_fpin, "%X", &g_atr.TB1) == EOF) return ERR_TB1;
	if(g_atr.T0&0x20 && fscanf(g_fpin, "%X", &g_atr.TC1) == EOF) return ERR_TC1;
	if(g_atr.T0&0x10 && fscanf(g_fpin, "%X", &g_atr.TD1) == EOF) return ERR_TD1;
					
	if(g_atr.TD1 == 0) goto readHistoryBytes;
					
	// get TA2--TD2
	if(g_atr.TD1&0x80 && fscanf(g_fpin, "%X", &g_atr.TA2) == EOF) return ERR_TA2;
	if(g_atr.TD1&0x40 && fscanf(g_fpin, "%X", &g_atr.TB2) == EOF) return ERR_TB2;
	if(g_atr.TD1&0x20 && fscanf(g_fpin, "%X", &g_atr.TC2) == EOF) return ERR_TC2;
	if(g_atr.TD1&0x10 && fscanf(g_fpin, "%X", &g_atr.TD2) == EOF) return ERR_TD2;
					
	if(g_atr.TD2 == 0) goto readHistoryBytes;
					
	// get TA2--TD2
	if(g_atr.TD2&0x80 && fscanf(g_fpin, "%X", &g_atr.TA3) == EOF) return ERR_TA3;
	if(g_atr.TD2&0x40 && fscanf(g_fpin, "%X", &g_atr.TB3) == EOF) return ERR_TB3;
	if(g_atr.TD2&0x20 && fscanf(g_fpin, "%X", &g_atr.TC3) == EOF) return ERR_TC3;
	if(g_atr.TD2&0x10 && fscanf(g_fpin, "%X", &g_atr.TD3) == EOF) return ERR_TD3;
	
readHistoryBytes:					
	//read History Bytes
	int g_TPDU_cnt = g_atr.T0&0x0f;
	int i = 0;
	while(i < g_TPDU_cnt && fscanf(g_fpin, "%X", &g_atr.his[i++])!=EOF) ;
					
	if(i != g_TPDU_cnt ) return ERR_HIS;		
	
	return SUCCESS;
}


/*****************************  function: outputATR() ***********************************/
void outputATR()
{
	fprintf(g_fpout,"\n-----------------------ATR-------------------------\n");
	fprintf(g_fpout,"TS:=%02X\n", g_atr.TS);
	fprintf(g_fpout,"T0:=%02X\n", g_atr.T0);
	if(g_atr.T0&0x80) fprintf(g_fpout,"TA1:=%02X\n", g_atr.TA1);
	if(g_atr.T0&0x40) fprintf(g_fpout,"TB1:=%02X\n", g_atr.TB1);
	if(g_atr.T0&0x20) fprintf(g_fpout,"TC1:=%02X\n", g_atr.TC1);
	if(g_atr.T0&0x10) fprintf(g_fpout,"TD1:=%02X\n", g_atr.TD1);
	
	if(g_atr.TD1&0x80) fprintf(g_fpout,"TA2:=%02X\n", g_atr.TA2);
	if(g_atr.TD1&0x40) fprintf(g_fpout,"TB2:=%02X\n", g_atr.TB2);
	if(g_atr.TD1&0x20) fprintf(g_fpout,"TC2:=%02X\n", g_atr.TC2);
	if(g_atr.TD1&0x10) fprintf(g_fpout,"TD2:=%02X\n", g_atr.TD2);
	
	if(g_atr.TD2&0x80) fprintf(g_fpout,"TA3:=%02X\n", g_atr.TA3);
	if(g_atr.TD2&0x40) fprintf(g_fpout,"TB3:=%02X\n", g_atr.TB3);
	if(g_atr.TD2&0x20) fprintf(g_fpout,"TC3:=%02X\n", g_atr.TC3);
	if(g_atr.TD2&0x10) fprintf(g_fpout,"TD3:=%02X\n", g_atr.TD3);
	
	int hisLen = g_atr.T0&0x0f;
	int i=0;
	fprintf(g_fpout,"History bytes:%02X\n", hisLen);
	while(i < hisLen)
	{
		fprintf(g_fpout," %02X", g_atr.his[i++]);
	}
	fprintf(g_fpout,"\n\n\n\n");
	//fprintf(g_fpout,"\nTCK:%02X\n", g_atr.TCK);
}


/*************************  function: getTPDU()   ******************************/ 
// from g_fpin read and deal then send the result to g_fpout 
// return the error no.
//功能:從文件中讀出C-TPDU and R-TPDU

bool getTPDU(void) 
{
	
	if(fscanf(g_fpin, "%X", &g_tpdu.CLA) == EOF) return false;
	if(fscanf(g_fpin, "%X", &g_tpdu.INS) == EOF) return false;
	if(fscanf(g_fpin, "%X", &g_tpdu.P1) == EOF) return false;
	if(fscanf(g_fpin, "%X", &g_tpdu.P2) == EOF) return false;
	if(fscanf(g_fpin, "%X", &g_tpdu.P3) == EOF) return false;
	
	if(g_cnt_tpdu >= 1) fprintf(g_fpout, "Return code [SW1 SW2]:\n%02X %02X\n", g_sw1, g_sw2);
	// print g_tpdu
	fprintf(g_fpout, "TPDU Header [CLA INS P1 P2 P3]:\n");
	fprintf(g_fpout, " %02X %02X %02X %02X %02X\n", g_tpdu.CLA, g_tpdu.INS, g_tpdu.P1, g_tpdu.P2, g_tpdu.P3);
	
	++g_cnt_tpdu;
	return true;
};

/*************************  function: getSW1()   ******************************/ 
//功能:從文件中讀出SW1

bool getSW1()
{
	if(fscanf(g_fpin, "%X", &g_sw1) == EOF) return false;
	
	if(g_bshow) fprintf(g_fpout, "SW1: %02X\n", g_sw1); // print sw1;
	
	return true;
}

/*************************  function: getSW2()   ******************************/ 
//功能:從文件中讀出SW2, 類似 getSW2() 

bool getSW2()
{
	if(fscanf(g_fpin, "%X", &g_sw2) == EOF) return false;
	
	if(g_bshow) fprintf(g_fpout, "SW2: %02X\n", g_sw2); // print sw2
	
	return true;
}

/*************************  function: getSW2()   ******************************/ 
//功能:從文件中讀出入卡或出卡數據 
 
bool readBytes(int num)
{
	g_inputData.len = num;
	uchar i = 0;
	while(i++ <num)
	{
			if(fscanf(g_fpin, "%X", &g_inputData.buf[i-1]) == EOF) return false;
	}
	
	// print data
	for(i=0; i<g_inputData.len; i++) 
	{
		fprintf(g_fpout, " %02X", g_inputData.buf[i]);
		if((i+1)%16 == 0) fprintf(g_fpout, "\n");
	}
	fprintf(g_fpout, "\n");
	
	return true;
}


/***************************主功能函數 mainProc()**********************************/ 
//功能:處理一個C-APDU和R-APDU對,實際處理的是一組經過映射的C-TPDU和R-TPDU對 
int mainProc()
{
	
	g_cnt_tpdu = 0; // set 	g_cnt_tpdu = 0
	g_cond_type = 0; // set 	g_cnt_tpdu = 0
	//send g_tpdu
	
	fprintf(g_fpout, "------------APDU[No.%02d]--------------\n", g_apdu_cnt);
	
	if(!getTPDU()) return ERR_GET_TPDU; // ++g_cnt_tpdu in function getTPDU()
	
rec_sw1: 
	//get sw1		
	if(!getSW1()) return ERR_GET_SW1;
	
	
	// judge condtion type of P3 in APDU
	
	g_Lc = 0; // set g_Lc = 0
	
	if(EQ(g_cnt_tpdu, 1) && EQ(g_tpdu.P3, 0))
	{
			g_cond_type = 1|2; // type 1 or 2;
			if(EQ(High4(g_sw1), 9)) g_cond_type = 1;
			else g_cond_type = 2; // sw1=6x
	}
		
	if(EQ(g_cnt_tpdu, 1) && g_tpdu.P3 > 0)
	{
		g_cond_type = 3|4; // type 3 or 4
		g_Lc = g_tpdu.P3; // set g_Lc only in first time
	}
		
		
	//judge sw1 == INS?
	if(EQ(g_sw1, g_tpdu.INS))
	{
		// juge Lc == 0? 
		if(g_Lc == 0 || isGetResponse())
		{
			g_Le = g_tpdu.P3; // set Le = g_tpdu.P3
			
			fprintf(g_fpout, "Incoming data (0 bytes):\n-\n"); // no out card data
			
			//wait and read Le bytes data from ICC 
			fprintf(g_fpout, "Outgoing data (%02X bytes):\n", g_Le);
			
			if(!readBytes(g_Le)) return ERR_READ_BYTES;
			
			goto rec_sw1;
		
		}
		else 
		{
			// send Lc bytes data to ICC and set lc = 0
			fprintf(g_fpout, "Incoming data (%02X bytes):\n", g_Lc);
			if(!readBytes(g_Lc)) return ERR_SEND_BYTES;
			
			fprintf(g_fpout, "Outgoing data (%0 bytes):\n-\n"); // no in card data
			
			g_Lc = 0; // set g_Lc = 0
				
			
			goto rec_sw1;
			
		}
		
	}
	else 
	{
		//get sw2
		if(!getSW2()) return ERR_GET_SW2; 
		
	//	g_Le = g_sw2; // set Le
		
		if(High4(g_sw1) == 6)
		{
				//judge sw1 == 60?
				switch(Low4(g_sw1))
				{
					case 0x0:
								goto rec_sw1;
								break;
					case 0x1:
								//send "get response" cmd;
								if(!getTPDU()) return ERR_GET_GTR;
							//	if(!checkGTR()) return ERR_CHK_GTR;
								
								g_tpdu.P3 = g_sw2;
								goto rec_sw1;
								break;
								
					case 0xc:
								//send cmd agin with p3=sw2
								TPDU old_TPDU;
								old_TPDU = g_tpdu;
								if(!getTPDU()) return ERR_SEND_TPDU_AGAIN;
							//	if(!checkSend_TPDU_Again(old_TPDU)) return ERR_CHK_TPDU_AGAIN;
				
								g_tpdu.P3 = g_sw2;
								goto rec_sw1;
								break;
					default:
								fprintf(g_fpout, "\nSW1:%02X 的含義與應用無關\n", g_sw1);
								return ERR_UNKNOWN_6XXX;
								break;
				}
		}
		
		if(High4(g_sw1) == 9)
		{ 
				switch(Low4(g_sw1))
				{
					case 0x0:
								switch(g_sw2)
								{
									case 0x00:	
												return SUCCESS;
												break; 
									default:
												fprintf(g_fpout, "\nSW1:%02X, 其含義依賴于相關的應用\n", g_sw1);
												system("pause");
												return ERR_UNKNOWN_90XX;
												break;
								}
					default:
								fprintf(g_fpout, "\nSW1:%02X, 其含義依賴于相關的應用\n", g_sw1);
								return ERR_UNKNOWN_9XXX;
								break;
				}
		}
		
		// otherwise not 6 or 9
		
		fprintf(g_fpout, "\nSW1:%02X, not 6x or 9x\n", g_sw1);
		
		return ERR_NOT_6X_OR_9X;
	}
	return SUCCESS; //may never come here 
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产区在线观看成人精品| 精品国产123| 久久这里只有精品6| 亚洲国产另类av| 91在线一区二区三区| 国产日韩欧美精品电影三级在线| 亚洲va欧美va人人爽| 91美女片黄在线观看91美女| 国产精品视频观看| 国产成人综合在线播放| 欧美吻胸吃奶大尺度电影| 久久精品人人做人人爽人人| 捆绑变态av一区二区三区| 欧美午夜一区二区三区| 一区2区3区在线看| 欧美成人官网二区| 成人精品免费网站| 亚洲激情av在线| 911精品国产一区二区在线| 免费观看在线色综合| 亚洲精品一区在线观看| 99视频精品免费视频| 中文在线一区二区| 91黄色免费版| 精品一区二区三区不卡| 久久久精品国产99久久精品芒果| 国产精品白丝av| 亚洲成av人片在线观看无码| 日韩免费电影一区| 91在线观看美女| 久久99热99| 亚洲一区二区三区国产| 国产亚洲va综合人人澡精品| 91麻豆视频网站| 精品一区二区成人精品| 亚欧色一区w666天堂| 久久久高清一区二区三区| 精品视频资源站| 国产精品一二三区| 亚洲成人精品影院| 国产欧美日韩综合精品一区二区| 欧美剧在线免费观看网站| 91麻豆精品视频| 成人久久18免费网站麻豆| 麻豆成人在线观看| 日本亚洲一区二区| 蜜臀av国产精品久久久久| 天天操天天色综合| 亚洲免费伊人电影| 亚洲国产高清在线观看视频| 久久久久久久性| 久久久综合精品| 久久精品欧美一区二区三区不卡 | 男人的j进女人的j一区| 亚洲第一综合色| 亚洲成av人**亚洲成av**| 综合婷婷亚洲小说| 国产精品久久福利| 国产精品欧美久久久久无广告| 国产色婷婷亚洲99精品小说| 国产精品素人一区二区| 亚洲欧美精品午睡沙发| 亚洲另类一区二区| 日本中文字幕一区二区有限公司| 亚洲成人你懂的| 轻轻草成人在线| 精品一区在线看| 色综合久久久久综合体桃花网| 成人av网址在线| 蜜桃精品视频在线观看| 国产精品一区二区黑丝| 国内精品国产成人国产三级粉色| 老司机午夜精品| 风流少妇一区二区| 成人一区二区三区在线观看| 成人永久aaa| 色综合久久99| 欧美高清视频在线高清观看mv色露露十八 | 欧美刺激午夜性久久久久久久 | 亚洲欧美激情一区二区| 日本不卡一二三区黄网| 激情久久久久久久久久久久久久久久| 日本免费新一区视频| 狠狠色丁香久久婷婷综合_中| 日本欧美大码aⅴ在线播放| 99国产精品久久久久久久久久| 日本道在线观看一区二区| 欧美一区二区福利视频| 久久综合久久综合久久综合| 欧美国产1区2区| 一区二区在线观看av| 久久国产精品免费| 久久国内精品视频| 91免费在线看| 中文乱码免费一区二区| 亚洲电影在线播放| 色综合中文字幕| 国产亚洲精品精华液| 亚洲6080在线| 99re这里只有精品6| 精品国产区一区| 亚洲成人7777| 欧美高清dvd| 亚洲一二三四区| 色偷偷一区二区三区| 欧美精彩视频一区二区三区| 日av在线不卡| 2019国产精品| 国产伦理精品不卡| 亚洲精品日日夜夜| 国产成人午夜电影网| 国产亚洲精品bt天堂精选| 奇米影视在线99精品| 欧美人xxxx| 免费成人av在线| 欧美成人video| 久久国产婷婷国产香蕉| 91精品国产一区二区人妖| 午夜视频一区二区三区| 欧美日韩国产大片| 久久机这里只有精品| 精品国精品国产| 国产一区二三区| 国产欧美日本一区视频| 91网站黄www| 日日夜夜精品视频免费| 精品国产免费人成在线观看| 久久国产乱子精品免费女| 国产日韩欧美不卡| 欧美艳星brazzers| 老汉av免费一区二区三区| 国产精品美女久久福利网站| 91日韩精品一区| 日本v片在线高清不卡在线观看| 欧美一区二区在线播放| 国产麻豆91精品| 亚洲乱码精品一二三四区日韩在线| 欧美色倩网站大全免费| 日本网站在线观看一区二区三区 | 亚洲国产精品久久久男人的天堂| 精品国产一区二区亚洲人成毛片 | 一级精品视频在线观看宜春院| 国产精品午夜电影| 26uuu国产在线精品一区二区| 亚洲主播在线播放| 欧美一区二区网站| 91浏览器在线视频| 国内久久婷婷综合| 日韩成人一区二区三区在线观看| 国产精品三级久久久久三级| 欧美精品在线一区二区| 91亚洲大成网污www| 国产精品影音先锋| 久久99久久99| 亚洲女子a中天字幕| 亚洲日本中文字幕区| ...中文天堂在线一区| 2020国产精品| 久久久综合九色合综国产精品| 欧美日韩高清一区二区不卡| 欧美在线观看你懂的| 欧美日韩日日骚| 欧美精品欧美精品系列| 精品少妇一区二区三区日产乱码| 成人亚洲一区二区一| 麻豆成人免费电影| 加勒比av一区二区| av在线一区二区三区| 精品一区二区三区影院在线午夜| 日本亚洲一区二区| 一区二区在线观看免费 | 91麻豆国产香蕉久久精品| 99精品视频在线免费观看| 色噜噜狠狠色综合中国| 欧美色视频一区| 欧美变态tickle挠乳网站| 日韩欧美国产午夜精品| 久久精品视频一区| 一区二区三区在线视频免费观看| 久久国产精品72免费观看| 亚洲视频免费在线| 奇米影视一区二区三区| 成人综合婷婷国产精品久久蜜臀| 成人精品视频一区二区三区 | 一区二区三区精品在线观看| 夜夜操天天操亚洲| 成人av免费在线播放| 欧美一区二区在线视频| 亚洲欧美电影一区二区| 国产精品综合二区| 欧美亚日韩国产aⅴ精品中极品| 欧美日韩日日摸| 日本一区二区成人| 污片在线观看一区二区 | 国产精品久久久久久户外露出| 亚洲成在线观看| 在线免费av一区| www.日韩精品| 欧美日韩中文另类| 国产精品久久影院|