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

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

?? ds8007.c

?? dallas公司的ds8007芯片源代碼。絕對好用。可以兼容tda8007.
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*---------------------------------------------------------------------------
 *  Copyright (C) 2004 Dallas Semiconductor Corporation, All Rights Reserved.
 * 
 *  Permission is hereby granted, free of charge, to any person obtaining a
 *  copy of this software and associated documentation files (the "Software"),
 *  to deal in the Software without restriction, including without limitation
 *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
 *  and/or sell copies of the Software, and to permit persons to whom the
 *  Software is furnished to do so, subject to the following conditions:
 * 
 *  The above copyright notice and this permission notice shall be included
 *  in all copies or substantial portions of the Software.
 * 
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 *  MERCHANTABILITY,  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 *  IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES
 *  OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 *  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 *  OTHER DEALINGS IN THE SOFTWARE.
 * 
 *  Except as contained in this notice, the name of Dallas Semiconductor
 *  shall not be used except as stated in the Dallas Semiconductor
 *  Branding Policy.
 * ---------------------------------------------------------------------------
 */
/** 
 * \file ds8007.c
 * \brief Interface library for Dallas Semiconductor's DS8007 smartcard interface chip
 *
 * This library contains routines required to communicate with smartcards
 * via an DS8007 while conforming to:
 * ISO 7816
 * EMV 4.1
 *
 */

#include <stdio.h>
#include <string.h>

#include <reg5000.h>
#include <absacc.h>
#include "DS8007.h"

#define DEBUG 1

void clearATRstruct(struct ATR*);
int16_t dssc_ATRsequence(uint8_t);

uint8_t workingBuffer[512];
uint8_t ATRLength[CARD_SLOTS];
struct ATR lastATR[CARD_SLOTS];
uint8_t TMode[CARD_SLOTS];		// T=0 or T=1
uint32_t WWT[CARD_SLOTS];		// Work wait time
uint32_t CWT[CARD_SLOTS];		// Character wait time
uint32_t BWT[CARD_SLOTS];		// Block wait time
uint8_t EDCtype[CARD_SLOTS];
uint8_t NAD[CARD_SLOTS];		// Node address byte to use when communicating in T=1
uint8_t IFSC[CARD_SLOTS];		// Maximum segment length when sending to card in T=1
uint8_t currentSlot = 0;

/*
Dump formatted contents of ATR struct
*/
void dumpATRStruct(struct ATR myatr)
{
	int i;
  	printf("ATR\n");
	printf("TS: %02bx\n",(uint8_t)myatr.TS);
  	printf("T0: %02bx\n",(uint8_t)myatr.T0);
	for (i = 1;i < 8;i++)
	{
		if (myatr.TA[i] != -1)
			printf("TA%d: %02bx\n",i,(uint8_t)myatr.TA[i]);
		if (myatr.TB[i] != -1)
			printf("TB%d: %02bx\n",i,(uint8_t)myatr.TB[i]);
		if (myatr.TC[i] != -1)
			printf("TC%d: %02bx\n",i,(uint8_t)myatr.TC[i]);
		if (myatr.TD[i] != -1)
			printf("TD%d: %02bx\n",i,(uint8_t)myatr.TD[i]);
	}
	for (i = 0;i < myatr.HistoricalLength;i++)
	{
    	printf("%02bx ",myatr.Historical[i]);
	}
  	printf("\n");
	if (myatr.TCK != -1)
		printf("TCK: %02bx\n",(uint8_t)myatr.TCK);

}

/*
Used to clear the ATR struct before card power up.
*/
void clearATRStruct(struct ATR *myatr)
{
	memset(myatr,0xFF,sizeof(struct ATR));
	myatr->HistoricalLength = 0;
}

/* 
CCITT CRC 16
X^16+X^12+X^5+1
Be sure to use 0xFFFF as initial crc value.
*/
uint16_t update_crc(uint8_t value, uint16_t crc)
{
	int i;

  	uint16_t newval = value << 8;

	for (i = 0;i < 8;i++)
	{
		if ((crc ^ newval) & 0x8000)
		{
			crc <<= 1;
			crc ^= 0x1021;
		}
		else
		{
			crc <<= 1;
		}
		newval <<= 1;
	}
	return crc;
}

/*
Read a byte from the UART or timeout after BWT (T=1), CWT (T=1) or WWT (T=0).
*/
int16_t readByte()
{
	uint8_t val;
	uint32_t timeout;

	while(!(dssc_readregister(MSR) & MSR_TBE_RBF_MASK))
	{
		val = dssc_readregister(USR);
		if (val & USR_PE_MASK)
		{
      		return ERR_RECEIVE_PARITY;
		}
		if (val & (USR_TOL3_MASK|USR_TOL2_MASK|USR_TOL1_MASK))
		{
			return ERR_RECEIVE_TIMEOUT;
		}
	}

	// Read and store byte
	val = dssc_readregister(URR);

	if (TMode[currentSlot] == 0)
		timeout = WWT[currentSlot];  // Use WWT for T=0
	else
		timeout = CWT[currentSlot];  // Use CWT for T=1

	// Set up timer for 24 bit timer, start immediately
	dssc_writeregister(TOC,0x00);
	dssc_writeregister(TOR3,timeout >> 16);
	dssc_writeregister(TOR2,timeout >> 8);
	dssc_writeregister(TOR1,timeout);
	dssc_writeregister(TOC,0x68);

	return val;
}

/*
Write a byte and leave the DS8007 in transmit mode
*/
void writeByte(uint8_t onebyte)
{
	uint8_t val;
	val = dssc_readregister(UCR1);
	// set T bit
	dssc_writeregister(UCR1,val | UCR1_T_R_MASK);
	dssc_writeregister(UTR,onebyte);
	// wait for byte to go out
	while (!(dssc_readregister(USR) & USR_TBE_RBF_MASK));
}

/*
Write a byte and put the DS8007 in receive mode
*/
void writeLastByte(uint8_t onebyte)
{
	uint8_t val;
	uint32_t timeout;

  	if (TMode[currentSlot] == 0)
		timeout = WWT[currentSlot];  // Use WWT for T=0
	else
		timeout = BWT[currentSlot];  // Use BWT for T=1

	// Set up timer for 24 bit timer, edge trigger start
  	dssc_writeregister(TOC,0x00);
	dssc_writeregister(TOR3,timeout >> 16);
	dssc_writeregister(TOR2,timeout >> 8);
	dssc_writeregister(TOR1,timeout);
	dssc_writeregister(TOC,0x7C);

	val = dssc_readregister(UCR1);
	// set LCT and T bit
	dssc_writeregister(UCR1,val | (UCR1_T_R_MASK|UCR1_LCT_MASK));
	dssc_writeregister(UTR,onebyte);
	// wait for byte to go out
	while (!(dssc_readregister(USR) & USR_TBE_RBF_MASK));
}

/*
Generate Error Data Check value depending on EDC type
*/
uint16_t generateEDC(uint8_t type,uint8_t onebyte,uint16_t value)
{
	if (type == EDC_TYPE_LRC)
	{
		return (value ^ onebyte);
	}
	else // type = CRC
	{
		return update_crc(onebyte,value);
	}
}

/*
Send a T=1 formatted block.
Formats T=1 packet from raw input data.  Length must already be
within the requirements of the destination smart card.
*/
void sendBlock(uint8_t NAD,uint8_t PCB,int16_t length,uint8_t *buffer,uint8_t type)
{
	int i;
	uint16_t EDC;

	if (type == EDC_TYPE_LRC)
	{
		EDC = 0;
	}
	else // type = CRC
	{
		EDC = 0xFFFF;
	}

	writeByte(NAD);
	EDC = generateEDC(type,NAD,EDC);
	writeByte(PCB);
	EDC = generateEDC(type,PCB,EDC);
	writeByte(length);
	EDC = generateEDC(type,length,EDC);
	for (i=0;i<length;i++)
	{
		writeByte(buffer[i]);
		EDC = generateEDC(type,buffer[i],EDC);
	}

	if (type == EDC_TYPE_LRC)
	{
		writeLastByte(EDC);
	}
	else // type = CRC
	{
		writeByte(EDC);
	    writeLastByte(EDC>>8);
	}
}

/*
Receive a T=1 formatted block.
This does a raw receive, it does not check sequence numbers.
*/
int16_t receiveBlock(uint8_t *rNAD,uint8_t *rPCB,uint8_t *rLEN,uint8_t *buffer,uint8_t type)
{
	int16_t retval;
	int16_t index = 0;
	uint16_t EDC;
	int16_t i;
	uint8_t expectedLength;

  	// Get NAD, PCB, and Length
	retval = readByte();
	if (retval < 0) return retval;
	*rNAD = retval;
	retval = readByte();
	if (retval < 0) return retval;
	*rPCB = retval;
	retval = readByte();
	if (retval < 0) return retval;
	*rLEN = retval;


	// Add one to length for LRC
	expectedLength = *rLEN+1;
	// Add additional byte if using CRC
	if (type == EDC_TYPE_CRC)
		expectedLength++;

	// Get all data bytes plus EDC (1 or 2 bytes at end)
	for (i = 0;i < expectedLength;i++)
	{
		retval = readByte();
		if (retval < 0)
		{
			return retval;
		}
		buffer[index++] = retval;
	}

	// Check the LRC or CRC
	if (type == EDC_TYPE_LRC)
	{
		EDC = 0;
		EDC = generateEDC(EDC_TYPE_LRC,*rNAD,EDC);
		EDC = generateEDC(EDC_TYPE_LRC,*rPCB,EDC);
		EDC = generateEDC(EDC_TYPE_LRC,*rLEN,EDC);
		for (i = 0;i < index;i++)
		{
			EDC = generateEDC(EDC_TYPE_LRC,buffer[i],EDC);
		}
		if (EDC != 0)
		{
			return ERR_RECEIVE_LRC;
		}
	}
	else // EDC is CRC
	{
		EDC = 0xFFFF;
		EDC = generateEDC(EDC_TYPE_LRC,*rNAD,EDC);
		EDC = generateEDC(EDC_TYPE_LRC,*rPCB,EDC);
		EDC = generateEDC(EDC_TYPE_LRC,*rLEN,EDC);
		for (i = 0;i < (index-2);i++)
		{
			EDC = generateEDC(EDC_TYPE_CRC,buffer[i],EDC);
		}
    
		if (((EDC >> 8) != buffer[index-2]) ||
			((EDC & 0xFF) != buffer[index-1]))
	    {
			return ERR_RECEIVE_CRC;
		}
	}
	return *rLEN;
}

/*
Send an S block for setting IFSD (card terminal buffer size)
*/
int16_t dssc_sendsblockIFSD(uint8_t IFSD)
{
	uint8_t buffer[1];
	uint8_t rNAD,rPCB,rLEN;
	uint8_t rbuffer[100];

	buffer[0] = IFSD;
	sendBlock(0,0xC1,1,buffer,EDCtype[currentSlot]);
	receiveBlock(&rNAD,&rPCB,&rLEN,rbuffer,EDCtype[currentSlot]);

	// If we do not get a confirmation response, fail.
	if ((rPCB == 0xE1) && (rLEN == 1) && (rbuffer[0] == IFSD))
		return 0;
	else
		return ERR_SETIFSD_FAILURE;
}

/*
Set Node address info for this card
*/
void dssc_setNAD(uint8_t value)
{
	NAD[currentSlot] = value;
}

/*
Send a message using T=1 protocol
*/
int16_t dssc_sendAPDUT1(uint8_t *buffer,int16_t length,uint8_t *rbuffer)
{
	int16_t maxSegLength = IFSC[currentSlot];  // Set by ATR (TA3), or default to 0x20
	int16_t retval;
	uint8_t sequenceNumber = 0;
	uint8_t rNAD,rPCB,rLEN;
	uint8_t tempbuffer[512];

	while (length > maxSegLength)
	{
		// Send block with chaining mode, current sequence number, and maximum length.
		sendBlock(NAD[currentSlot],sequenceNumber|0x20,maxSegLength,buffer,EDCtype[currentSlot]);
		retval = receiveBlock(&rNAD,&rPCB,&rLEN,tempbuffer,EDCtype[currentSlot]);
		if (retval < 0) return retval;
		// Check for bad sequence number return
		if ((rPCB ^ ((sequenceNumber>>2) ^ 0x10)) != 0x80)
		{
			return ERR_RECEIVE_SEQUENCENUM;
		}
		sequenceNumber ^= 0x40;
		buffer += maxSegLength;
		length -= maxSegLength;
	}

	// Send last (or only) block.  Then, we can wait for the receive side.
	sendBlock(NAD[currentSlot],sequenceNumber,length,buffer,EDCtype[currentSlot]);

	retval = receiveBlock(&rNAD,&rPCB,&rLEN,tempbuffer,EDCtype[currentSlot]);
	if (retval < 0) return retval;

	memcpy(rbuffer,tempbuffer,rLEN);

	return retval;
}

/*
Send a message using T=0 protocol
*/
int16_t dssc_sendAPDUT0(uint8_t *buffer,int16_t length,uint8_t *rbuffer)
{
	int index;
	int16_t rindex = 0;
	uint8_t val;
	uint8_t INS = buffer[1];
	int retval;

	// Write 5 byte command header
	for (index = 0;index < 4;)
		writeByte(buffer[index++]);
	writeLastByte(buffer[index++]);

	while (1)
	{
    	// Get procedure byte
		retval = readByte();
		if (retval < 0)
		{
			return retval;
		}
		val = retval;

		if ((val & 0xFE) == INS)
		{
			// ACK, send/receive all remaining bytes
			if (index < length)
			{
				for (;index < (length-1);index++)
				writeByte(buffer[index]);
				if (index < length)
					writeLastByte(buffer[index++]);
				// NOTE: Does not support VPP state change
			}
			else
			{
				// Read bytes up to Lc/P3 + 2
				rindex = 0;
				while ( (rindex < (buffer[4] + 2)) && ((retval = readByte()) >= 0) )
				{
					rbuffer[rindex++] = retval;
				}
				// return any error.
				if (retval < 0)
					return retval;
				break;
			}
		}
    	else if ((val & 0xFE) == ~INS)
		{
      		if (index < length)
      		{
        		// ACK, send/receive one remaining byte
        		if (index < length)
          			writeLastByte(buffer[index++]);
        		// NOTE: Does not support VPP state change
      		}
      		else
      		{
				// Read one byte or timeout????
        		retval = readByte();
        		if (retval < 0)
        		{
          			// If we get anything other than a timeout, return the error.
          			if (retval != ERR_RECEIVE_TIMEOUT)
            			return retval;
          			break;
        		}
        		else
          		rbuffer[rindex++] = retval;
      		}
    	}
    	else if (val == 0x60)
    	{
      	// NULL
    	}
    	else if (((val & 0xF0) == 0x60) || ((val & 0xF0) == 0x90))
    	{
      		// SW1, get SW2
      		rbuffer[rindex++]=val;
      		val = readByte();
      		if (retval < 0) return retval;
      		rbuffer[rindex++]=val;
      		break;
    	}

	}

  	return rindex;
}

/*
Send a message using T=0 or T=1 protocol
*/
int16_t dssc_sendAPDU(uint8_t *buffer,int16_t length,uint8_t *rbuffer)
{
	switch (TMode[currentSlot])
  	{
    	case 0:
      		return dssc_sendAPDUT0(buffer,length,rbuffer);
      		break;
    	case 1:
      		return dssc_sendAPDUT1(buffer,length,rbuffer);
      		break;
    	default:
      		return ERR_PROTOCOL_UNSUPPORTED;
      		break;
  	}
}

int16_t dssc_warmreset(uint8_t mode)
{
	uint8_t val;

  	// Check for power status
  	val = dssc_readregister(PCR);
  	if (!(val & PCR_START_MASK))
		return ERR_POWERUP_VOLTAGE_INVALID;

	// Apply reset
  	val = dssc_readregister(PCR);
	dssc_writeregister(PCR,val & ~PCR_RSTIN_MASK);

	// Call common getATR routine
	return dssc_ATRsequence(mode);
}

int16_t dssc_powerup(uint8_t mode, uint8_t voltage)
{
	uint8_t val;

	// Compile time setting of operating crystal frequency
#if ((CRYSTAL_FREQUENCY_8007 >= 1000000L) && (CRYSTAL_FREQUENCY_8007 <= 5000000L))
	// Set smartcard clock to 1/1 crystal
  	dssc_writeregister(CCR,0x00);
#elif ((CRYSTAL_FREQUENCY_8007 >= 2000000L) && (CRYSTAL_FREQUENCY_8007 <= 10000000L))
	// Set smartcard clock to 1/2 crystal
	dssc_writeregister(CCR,0x01);
#elif ((CRYSTAL_FREQUENCY_8007 >= 4000000L) && (CRYSTAL_FREQUENCY_8007 <= 20000000L))
	// Set smartcard clock to 1/4 crystal
	dssc_writeregister(CCR,0x02);
#elif ((CRYSTAL_FREQUENCY_8007 >= 8000000L) && (CRYSTAL_FREQUENCY_8007 <= 40000000L))
	// Set smartcard clock to 1/8 crystal
  	dssc_writeregister(CCR,0x03);
#else
	// Set smartcard clock to 1/2 internal oscillator (about 1.44MHz)
  	// NOTE: Can only change CCR.2 when shifting to internal oscillator
	dssc_writeregister(CCR,0x01);
  	dssc_writeregister(CCR,0x05);
	// Wait for internal oscillator to engage (check the MSR.CLKSW bit on page 18)

	do
	{
		val = dssc_readregister(MSR);
	}
	while (!(val & MSR_CLKSW_MASK));
#endif

	// Set the power supply voltage
	val = dssc_readregister(PCR);
	// Clear 1.8V and 3V bits
	dssc_writeregister(PCR,val & ~(PCR_3V_5V_MASK|PCR_1V8_MASK));
	switch(voltage)
	{
	case POWERUP_5V:
		// Do nothing
		break;
    case POWERUP_3V:
		val = dssc_readregister(PCR);
		// Set 3V bit
		dssc_writeregister(PCR,val | PCR_3V_5V_MASK);
		break;
	case POWERUP_1p8V:
		val = dssc_readregister(PCR);
		// Set 1.8V bit
		dssc_writeregister(PCR,val | PCR_1V8_MASK);
		break;
	default:
		return ERR_POWERUP_VOLTAGE_INVALID;
		break;
  	}

	// Apply reset
	val = dssc_readregister(PCR);
  	dssc_writeregister(PCR,val & ~PCR_RSTIN_MASK);

	val = dssc_readregister(HSR);
	do
	{
		// Power the card, RST low, C4 and C8 high
		val = dssc_readregister(PCR);
		dssc_writeregister(PCR,val | (PCR_C8_MASK|PCR_C4_MASK|PCR_START_MASK));
		val = dssc_readregister(HSR);
	    if (val & (HSR_PRTL2_MASK|HSR_PRTL1_MASK|HSR_PRL2_MASK|HSR_PRL1_MASK|HSR_PTL_MASK))
    	{
			dssc_powerdown();
			return ERR_POWERUP_INTERRUPTED;
	    }
		val = dssc_readregister(PCR);

	}
	while (!(val & PCR_START_MASK));

	//return 1;

	// Call common getATR routine
	return dssc_ATRsequence(mode);
}

int16_t dssc_ATRsequence(uint8_t mode)
{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区二区动态图| bt欧美亚洲午夜电影天堂| 欧美人妖巨大在线| 亚洲mv在线观看| 欧美日韩1234| 麻豆一区二区在线| 久久久久久久综合| av不卡在线观看| 成人91在线观看| 伊人色综合久久天天| 在线视频中文字幕一区二区| 性久久久久久久久久久久| 91麻豆精品国产综合久久久久久| 免费在线观看一区二区三区| 精品国产免费久久 | 日韩专区一卡二卡| 欧美一区二区三区在线看| 九九精品视频在线看| 亚洲国产成人一区二区三区| 日本电影欧美片| 麻豆国产欧美日韩综合精品二区 | 欧美午夜一区二区三区| 日韩精品乱码av一区二区| 2019国产精品| 一本色道久久加勒比精品 | 亚洲欧美另类小说| 欧美一级日韩一级| 成人黄色片在线观看| 亚洲国产美女搞黄色| 亚洲精品在线观看视频| 成人午夜精品在线| 午夜精品免费在线| 亚洲国产电影在线观看| 56国语精品自产拍在线观看| 国产成人综合在线观看| 亚洲国产精品天堂| 国产视频一区在线播放| 欧美色综合天天久久综合精品| 国产美女一区二区三区| 亚洲一二三专区| 国产亚洲视频系列| 91精品国产91热久久久做人人| 成人av免费观看| 久久99精品国产麻豆不卡| 亚洲精品国产a久久久久久 | 99re热这里只有精品视频| 六月婷婷色综合| 亚洲资源在线观看| 一区视频在线播放| 精品捆绑美女sm三区| 欧美日本精品一区二区三区| 99精品国产视频| 国产99久久久精品| 国产一区二区三区日韩| 日韩av一二三| 亚洲午夜精品一区二区三区他趣| 综合网在线视频| 国产日韩成人精品| 久久久久久久一区| 亚洲精品一区二区三区四区高清 | 久久精品男人天堂av| 欧美一区二区三区男人的天堂| 欧美在线不卡视频| 99re亚洲国产精品| 91亚洲国产成人精品一区二三| 国产精品一区二区三区网站| 精品一区二区在线看| 日韩电影在线观看电影| 亚洲va韩国va欧美va| 亚洲国产精品欧美一二99| 亚洲日本一区二区三区| 中文幕一区二区三区久久蜜桃| 久久久久高清精品| 国产喷白浆一区二区三区| 久久久久久一二三区| 久久午夜电影网| 久久品道一品道久久精品| 久久久国产精品午夜一区ai换脸| 欧美精品一区二区三| 欧美精品一区二区在线播放| 久久久噜噜噜久久中文字幕色伊伊| 精品国产乱码久久久久久久久| 精品处破学生在线二十三| 久久亚洲影视婷婷| 久久久精品中文字幕麻豆发布| 日本一区二区成人| 亚洲视频资源在线| 一区二区三区精品视频| 亚洲妇女屁股眼交7| 首页国产丝袜综合| 亚洲激情图片qvod| 亚洲第一av色| 国内精品免费**视频| 国产一区二区三区不卡在线观看| 成人午夜激情影院| 在线欧美一区二区| 91麻豆精品国产91久久久资源速度| 日韩午夜中文字幕| 精品第一国产综合精品aⅴ| 亚洲国产精品成人综合色在线婷婷 | 视频在线在亚洲| 国产一本一道久久香蕉| 91首页免费视频| 欧美裸体一区二区三区| 日韩欧美的一区二区| 国产午夜久久久久| 亚洲男人的天堂在线aⅴ视频| 天堂在线亚洲视频| 国产电影一区在线| 欧美午夜理伦三级在线观看| 91精品国产91久久久久久最新毛片 | 亚洲高清在线视频| 国产在线精品一区二区不卡了 | 国产欧美日韩卡一| 伊人开心综合网| 久久精品国产一区二区三| 不卡大黄网站免费看| 精品国产亚洲一区二区三区在线观看| 久久综合狠狠综合久久综合88| 亚洲欧美日韩一区| 国内偷窥港台综合视频在线播放| 91小视频免费观看| 久久综合九色综合欧美亚洲| 一区二区三区在线观看网站| 久久机这里只有精品| 91香蕉视频黄| 久久嫩草精品久久久精品| 亚洲黄色小视频| 国产suv一区二区三区88区| 欧美电影影音先锋| 中文字幕一区二区三区不卡| 开心九九激情九九欧美日韩精美视频电影 | 国产精品乱人伦中文| 日韩中文字幕亚洲一区二区va在线| 粉嫩av一区二区三区在线播放| 欧美精品高清视频| 亚洲丝袜制服诱惑| 国产高清不卡一区二区| 欧美人妇做爰xxxⅹ性高电影| 综合激情网...| 国产成人av网站| 欧美电影免费观看高清完整版 | 国产在线一区二区| 欧美日韩午夜在线| 最新成人av在线| 国产成人综合在线观看| 日韩精品专区在线影院观看| 亚洲 欧美综合在线网络| 色综合久久综合网97色综合 | 久久蜜桃一区二区| 久久99久久99| 91精品国产高清一区二区三区蜜臀| 亚洲综合色噜噜狠狠| 91亚洲精品一区二区乱码| 欧美高清在线一区二区| 国产成a人亚洲精| 国产午夜精品一区二区三区视频| 蜜臀va亚洲va欧美va天堂| 欧美另类videos死尸| 亚洲综合久久久久| 91丨九色丨国产丨porny| 国产精品乱子久久久久| 成人蜜臀av电影| 中文字幕不卡三区| 成人av电影在线| 国产精品午夜在线| av福利精品导航| 亚洲伦理在线精品| 色域天天综合网| 亚洲一区av在线| 91精品在线一区二区| 日韩不卡一区二区| 91精品国产黑色紧身裤美女| 奇米精品一区二区三区在线观看 | 日韩一区二区免费高清| 免费久久99精品国产| 日韩一区二区麻豆国产| 精品一区二区三区香蕉蜜桃| 精品成人在线观看| 成人免费毛片高清视频| 亚洲色图制服丝袜| 欧美在线不卡视频| 日韩高清在线一区| 精品国产乱码久久久久久久| 国产福利一区在线观看| 中文字幕一区二区不卡| 色综合天天视频在线观看| 亚洲一区二区三区精品在线| 337p亚洲精品色噜噜狠狠| 精品亚洲成a人在线观看 | ㊣最新国产の精品bt伙计久久| 色噜噜狠狠一区二区三区果冻| 日日夜夜精品视频天天综合网| 精品成人佐山爱一区二区| 国产xxx精品视频大全| 亚洲精品视频一区| 制服丝袜日韩国产| 国产成人精品免费在线| 亚洲精品视频在线看| 欧美成人精品3d动漫h|