色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于mbedTLS在Apollo3 MCU上實現AES-256加解密算法

潤欣科技Fortune ? 2019-12-06 21:57 ? 次閱讀

上海潤欣科技股份有限公司創研社


最近有客戶咨詢,希望能夠在剛完成設計的Apollo3產品上增強加密功能,主要是為了防止破解者非法克隆產品。客戶同時又提到Apollo3芯片資料上有寫到支持AES-128硬件加密模塊,還有唯一UID號碼,看看能不能把這兩塊利用起來,做“一機一密”的硬件保護。UID好處理,Apollo3將64位的全球唯一ID號(Unique Chip ID)存放在固定的地址上,直接讀取就好了。然而,Apollo3芯片手冊上僅僅介紹了Apollo3支持硬件AES-128硬件加密特性,但再也找不到更多相關的信息,官方提供的SDK里面也沒有AES的任何實現代碼。既然客戶提出了需求,我們就要想辦法實現。芯片自帶的硬件AES暫時無從下手,那么我們先來看看軟件AES算法如何?


首先,我們還是先來了解一下什么是AES吧


AES,全稱是The Advanced Encryption Standard,翻譯成中文是:高級加密標準,但我們一般還是習慣讀作AES。AES是一種對稱密鑰算法,用于數據的加密和解密。在密碼學中AES又稱作Rijndael加密算法,是美國聯邦政府采用的一種區塊加密標準。AES是由美國國家研究院標準與技術(NIST)從2001年開始建立的一套數字加密標準,發布于FIPS PUB 197,并在2002年5月26日成為有效的標準。2006年,高級加密標準已然成為對稱密鑰加密中最流行的算法之一。AES取代了原先的數據加密標準(DES),已經被多方分析且廣為全世界所使用。AES使用128位固定大小的數據塊作為分組數據加密和解密數據,即明文分組的長度固定為128位或16字節。AES可以使用128、192 和 256 位密鑰,根據密鑰長度不同,AES可分為AES-128,AES-192和AES-256。


AES加解密算法是基于置換和代替的。置換是指數據的重新排列,而代替是用一個單元數據替換另一個。AES使用了如下幾種不同的技術來實現置換和替換。


字節替代(SubBytes):


通過非線性的替換函數,用查找表的方式把分組的字節矩陣中的每個字節用同一個S-BOX替換成另外一個字節。


行移位(ShiftRows):


一個簡單的位置交換。將矩陣中的每個橫列進行循環式移位。


列混淆(MixColumns):


列混淆其實就是對一個狀態的每一列去乘一個矩陣,其中乘法是在有限域GF(2^8)內進行的,不可約多項式為x^8+x^4+x^3+x+1。如下圖1所示。為了充分混合矩陣中各個直行的操作。這個步驟使用線性轉換來混合每列的四個字節。


1575600432732133.png

圖1列混淆(MixColumns)


注意,最后一個加密循環中省略MixColumns步驟,而以另一個AddRoundKey取代。


輪密鑰加(AddRoundKey):


當前分組矩陣中的每一個字節和該次輪密鑰(round key)進行按位異或運算。輪密鑰是通過Key Schedule過程從密碼密鑰中得到的,輪密鑰長度等于分組長度。

密鑰的長度不同,加密輪數也不同,如下圖2所示:


1575600443467887.png

圖2 不同長度密鑰的AES加密輪數


如下圖3所示是AES-128的加密的流程:


1575600466378487.png

圖3 AES-128的加密的流程示意圖


對AES算法原理及實現過程感興趣的同學,可以上網搜索更多關于AES的資料,這里不再詳述算法實現流程,重點討論怎么把AES這套算法在Apollo3 MCU上跑起來。


要實現AES算法,我了解到mbedTLS有成熟的AES加密算法庫支持,那么讓我們再來看看什么是mbedTLS吧。


mbedTLS,前身是PolarSSL,不管是arm掏錢買的,還是人家PolarSSL大方送的,總之,PolarSSL現在已經屬于arm的資產了,而且arm官宣PolarSSL是arm的一部分了,還給改了個洋氣的名字叫mbedTLS。官方網頁置頂處赫然寫著醒目的標題:PolarSSL is now part of arm Official announcement and rebranded as Mbed TLS。arm mbedTLS官方網站鏈接是:https://tls.mbed.org/。如下圖4。


1575600482488850.png

圖4 mbedTLS官方網站


mbedTLS前世今生了解清楚了,我們還是回到正題,看看mbedTLS是什么,有哪些功能。


mbedTLS是TLS和SSL協議的實現,并且需要相應的加密算法和支持代碼。mbed TLS在Apache2.0許可證或GPL2.0許可證下作為開放源碼提供。Apache2.0許可證允許您在開放源碼和封閉源碼項目中使用mbed TLS。寬松的開源許可證,說白了,就是鼓勵大家用起來,用開來(當然,最好是希望你用在arm自家的內核MCU上。^_^)。網站宣傳mbed TLS的兩大特點:Easy to use and Easy to get(容易使用,容易獲得)。


mbedTLS核心SSL 庫代碼是使用完全符合ANSI-C和MISRA-C的C語言編寫。mbedTLS實現了SSL模塊,基本加密功能并提供各種實用功能,如大家常見的AES, DES, RSA, SHA,MD5等都已經完整實現了。與OpenSSL和其他TLS的實現不同,mbed TLS的設計目標是作為適合小型嵌入式設備來使用的,其最小的完整的TLS堆棧只需要60KB的Flash程序空間和64KB的RAM。它也是高度模塊化的:每個組件,如加密函數,是可以獨立于框架的其余部分使用。


介紹完AES及mbedTLS的基本概念之后,下面我們就開始動手干活了。


客戶使用的IDE是KEIL MDK,假設我們已經打開了Apollo3 SDK里面自帶的演示例程或者客戶自己的項目工程,我們就開始一步一步詳細介紹在Apollo3平臺上如何實現AES加解密算法。

1、安裝mbedTLS Pack


點擊KEIL MDK菜單上的Pack Installer圖標,如下圖5截圖紅框所示,加載Pack Installer,界面如下圖6所示。


1575600517256841.png

圖5 KEIL MDK界面上的Pack Installer圖標


1575600542213712.png

圖6Pack Installer界面


在設備廠家ARM目錄下找到ARM::mbedTLS,圖6顯示我已經安裝好了最新的v1.6.0版本;如果沒有安裝,點擊Install安裝,或者點擊Update將版本升級到最新的v1.6.0版本。

2、加載mbedTLS組件到我們的工程中


點擊KEIL MDK菜單上的Manage Run-Time Environment圖標,如下圖7截圖紅框所示,加載Manage Run-Time Environment,界面如下圖8所示。


1575600570580613.png

圖7 KEIL MDK界面上Manage Run-Time

Environment圖標


1575600581792035.png

圖8Manage Run-Time Environment界面


Manage Run-Time Environment的這個界面上面找到Security,勾選mbedTLS,點擊OK按鈕退出。


這個時候,我們在KEIL MDK項目工程目錄下就能看到多了一個Security組件及其源代碼列表,如下圖9所示。


1575600594817295.png

圖9 添加Security組件到項目工程中


3、添加頭文件到代碼里,并修改mbedTLS_config.h文件


在需調用mbedTLS的AES API的代碼里添加如下頭文件:


#include "mbedtls/entropy.h"

#include "mbedtls/ctr_drbg.h"

#include "mbedtls/aes.h"


根據自己需要使用到的功能,修改mbedTLS_config.h文件,比如我這里需要用到AES,那么就需要打開相應的宏定義就好了。對于AES的ECB和CBC加解密,打開如下的這幾個宏定義:


#define MBEDTLS_AES_ROM_TABLES

#define MBEDTLS_CIPHER_MODE_CBC

#define MBEDTLS_AES_C

#define MBEDTLS_CIPHER_PADDING_PKCS7

#define MBEDTLS_NO_PLATFORM_ENTROPY

#define MBEDTLS_CTR_DRBG_C

#define MBEDTLS_ENTROPY_C

#define MBEDTLS_SHA256_C


4、AES加密解密相關API介紹


根據需要我們大致經常會用到AES的兩種加密模式ECB和CBC。


ECB:就是把數據塊進行加密,每16字節為一塊,依次進行加密,直到完成,長度不足的補0。


CBC:cipher block chaining,是一種循環模式,前一個分組的密文和當前分組的明文異或后再加密,這樣做的目的也是為了增強破解難度。


AES-ECB加解密算法API:

/**

* \brief This function performs an AES single-block encryption or

* decryption operation.

*

* It performs the operation defined in the \p mode parameter

* (encrypt or decrypt), on the input data buffer defined in

* the \p input parameter.

*

*mbedtls_aes_init(), and either mbedtls_aes_setkey_enc() or

* mbedtls_aes_setkey_dec() must be called before the first

* call to this API with the same context.

*

* \param ctx The AES context to use for encryption or decryption.

* It must be initialized and bound to a key.

* \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or

* #MBEDTLS_AES_DECRYPT.

* \param input The buffer holding the input data.

* It must be readable and at least \c 16 Bytes long.

* \param output The buffer where the output data will be written.

* It must be writeable and at least \c 16 Bytes long.


* \return \c 0 on success.

*/

int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,

int mode,

const unsigned char input[16],

unsigned char output[16] );


AES-CBC加解密算法API:


/**

* \brief This function performs an AES-CBC encryption or decryption operation

* on full blocks.

*

* It performs the operation defined in the \p mode

* parameter (encrypt/decrypt), on the input data buffer defined in

* the \p input parameter.

*

* It can be called as many times as needed, until all the input

* data is processed. mbedtls_aes_init(), and either

* mbedtls_aes_setkey_enc() or mbedtls_aes_setkey_dec() must be called

* before the first call to this API with the same context.

*

* \note This function operates on full blocks, that is, the input size

* must be a multiple of the AES block size of \c 16 Bytes.

*

* \note Upon exit, the content of the IV is updated so that you can

* call the same function again on the next

* block(s) of data and get the same result as if it was

* encrypted in one call. This allows a "streaming" usage.

* If you need to retain the contents of the IV, you should

* either save it manually or use the cipher module instead.

*

*

* \param ctx The AES context to use for encryption or decryption.

* It must be initialized and bound to a key.

* \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or

* #MBEDTLS_AES_DECRYPT.

* \param length The length of the input data in Bytes. This must be a

* multiple of the block size (\c 16 Bytes).

* \param iv Initialization vector (updated after use).

* It must be a readable and writeable buffer of \c 16 Bytes.

* \param input The buffer holding the input data.

* It must be readable and of size \p length Bytes.

* \param output The buffer holding the output data.

* It must be writeable and of size \p length Bytes.

*

* \return \c 0 on success.

* \return #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH

* on failure.

*/

int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,

int mode,

size_t length,

unsigned char iv[16],

const unsigned char *input,

unsigned char *output );


聲明一個結構體類型,成員分別存放AES的參數,如加密輪數,輪密鑰指針,生成輪密鑰的緩沖區等。


/**

* \brief The AES context-type definition.

*/

typedef struct mbedtls_aes_context

{

int nr; /*!< The number of rounds. */

uint32_t *rk; /*!< AES round keys. */

uint32_t buf[68]; /*!< Unaligned data buffer. This buffer can

hold 32 extra Bytes, which can be used for

one of the following purposes:

  • Alignment if VIA padlock is

used.

  • Simplifying key expansion in the 256-bit

case by generating an extra round key.

*/

}mbedtls_aes_context;


結構體初始化函數:


/**

* \brief This function initializes the specified AES context.

*

* It must be the first API called before using

* the context.

*

* \param ctx The AES context to initialize. This must not be \c NULL.

*/

void mbedtls_aes_init( mbedtls_aes_context *ctx );


AES-128 CBC加密參考代碼:

mbedtls_aes_context aes_ctx;

// 初始化結構體

mbedtls_aes_init( &aes_ctx );

// 設置解密密鑰

mbedtls_aes_setkey_dec(&aes_ctx, key, 128);

// AES-128 CBC加密

mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT, 64, iv, plain, cipher);


AES-128 CBC解密參考代碼:

mbedtls_aes_context aes_ctx;

// 初始化結構體

mbedtls_aes_init( &aes_ctx );

// 設置解密密鑰

mbedtls_aes_setkey_dec(&aes_ctx, key, 128);

// AES-128 CBC解密

mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_DECRYPT, 64, iv, cipher, dec_plain);


至此,在Apollo3 MCU上實現AES算法的步驟已經全部完成。


看看,基于mbedTLS在Apollo3 MCU上實現MCU算法是不是特別簡單、易用?那么回到客戶的問題,我們如何利用芯片唯一ID結合AES加密算法來做點加密呢。


1、 讀取芯片UID


通過閱讀Apollo3 MCU芯片Datasheet,我們知道64位全球唯一ID號(Unique Chip ID)連續存放在固定的地址上,起始地址為:0x40020004。這個唯一ID號每片芯片都不同的。如下圖10所示。



1575600658526715.png

圖10 Apollo3 芯片Unique Chip ID


讀取UID的代碼很簡單:

uint32_t uid0, uid1;

uid0 = (*((uint32_t *)0x40020004));

uid1 = (*((uint32_t *)0x40020008));


2、 利用芯片UID構造AES明文序列和密鑰


我們把uid0和uid1做異或得到一個常數,利用這個常數來構造AES加密的明文序列和密鑰。參考代碼如下:


uint32_t i;

uint32_t seed;

unsigned int temp;

unsigned char _aKey[32];

unsigned char _aPlaintext[256];

unsigned char _aCipher[256]={0};

unsigned char _aIV[16] = {0};


seed = uid0 ^ uid1;


// _aPlaintext[256]

i = 0;

do

{

_aPlaintext[i] = (unsigned char)((seed + i)^0x5A5A5A5A5A);

++i;

}while ( i < 256 );??????????????????????????


// _aKey[32]

i = 0;

do

{

temp = seed >> i;

*(_aKey+i) = (unsigned char)(temp ^ 0xA5A5A5A5A5);

i++;

}while ( i < 32 );


3、 AES加密生成產品特征碼


最后,對上述生成的明文序列_aPlaintext[256]和密鑰_aKey[32]執行AES-256 CBC加密算法,并將密文結果_aCipher[256]做CRC32運算,參考代碼如下:


mbedtls_aes_init( &aes_ctx );

mbedtls_aes_setkey_enc(&aes_ctx, _aKey, 256);

mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT, 256, _aIV, _aPlaintext, _aCipher);

return CalcCRC32(_aCipher, 256, 0);


最終得到4字節的結果我們將其看作是產品的唯一特征碼,真正做到一機一密,可以用它來驗證原裝產品,也可以防止非法破解和克隆產品。我們可以將這個特征碼存放到用戶指定的Flash區域或者INFO里面,上電后根據上述流程做AES加密算法后,結果與存儲在芯片的特征碼做比對,只有原裝產品才允許運行代碼,有效杜絕產品被非法克隆的風險。



在其他IDE環境下加載并使用mbedTLS組件


如果說你偏好的IDE不是Keil MDK,那么也沒有關系,畢竟mbedTLS的源代碼還是非常容易獲取的,你可以從arm/TLS官網:https://tls.mbed.org/直接下載,點擊下面的圖標也可以直接下載哦。


另外,還有一種方法。


arm官方Github賬號上Git完整源代碼:git clone https://github.com/ARMmbed/mbedtls.git,當然,以后你也可以不定期地git pull,申請到最新的版本更新,下載和更新都非常的方便。將mbedTLS源碼(library文件夾下)全部添加到你的工程里面,并在你要調用mbedTLS API的代碼里面添加相應的頭文件,配置一下mbedTLS_config.h頭文件里面的宏定義就可以正常使用了。mbedTLS API的調用方法和Keil MDK里面完全一樣,畢竟mbedTLS是用純C語言編寫的,不存在移植的問題。


后記


也許大家還想知道添加mbedTLS AES加密算法到項目里面會占用多少Flash和SRAM空間。我們拿數據說話吧,經過對比加入AES前后產生的map文件得知,項目中加入AES-256 CBC加解密算法代碼的部分占用Flash 11.63KB, SRAM 0KB(armcc編譯器優化 Level0(-O0)),對MCU的存儲資源占用較少,對整個系統的影響很小。


再來看看AES-256 CBC的實際運行效率,我們利用ARM內核自帶的Systick Timer,對AES加密操作進行計時,看看到底消耗多少時間。參考代碼如下:


unsigned int old_primask = __get_PRIMASK();

__disable_irq();

SysTick->CTRL = 0; // Disable SysTick

SysTick->LOAD = 0xFFFFFF; // Count down from maximum value

SysTick->VAL = 0; // Clear current value to 0

SysTick->CTRL = 0x5; // Enable SysTick, and use processor clock

while (SysTick->VAL == 0); // Wait until SysTick reloaded

START_TIME = SysTick->VAL; // Read start time value


mbedtls_aes256_cbc_test();


STOP_TIME = SysTick->VAL; // Read stop time value

SysTick->CTRL = 0; // Disable SysTick

if ((SysTick->CTRL & 0x10000) == 0) // if no overflow

DURATION = START_TIME - STOP_TIME; // Calculate total cycles

else

printf ("Timer overflowed\n");

// SysTick->VAL遞減,減到0就產生了溢出,需要RELOAD

// DURATION越小說明程序執行時間越短,效率越高!

printf("DURATION of process of mbedtls_aes_cbc_test() : 0x%.8X.\n\r", DURATION);

__set_PRIMASK(old_primask);


從實驗數據得知,運行一次明文長度為256字節的AES-256 CBC加密算法耗時僅需1.2ms(Apollo3 running @ 48MHz),這對于系統來說影響也很小。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mbedTLS
    +關注

    關注

    0

    文章

    6

    瀏覽量

    582
收藏 人收藏

    評論

    相關推薦

    常見的加密算法有哪些?它們各自的優勢是什么?

    在于其出色的安全性能和高效的實現方式,已成為目前最廣泛使用的加密算法之一。它能夠抵御暴力破解攻擊,且各種硬件和軟件平臺上都能實現高效的加密和解密
    的頭像 發表于 12-17 15:57 ?80次閱讀

    4G模組Air780E的LuatOS開發:關于通用加解密函數(crypto)教程!

    本次我將講解低功耗4G模組Air780E的LuatOS開發,關于通用加解密函數(crypto)教程分享給大家。我會從加解密概述、演示功能概述、硬件準備、軟件環境、API 說明等全面講述…
    的頭像 發表于 12-01 15:50 ?194次閱讀
    4G模組Air780E的LuatOS開發:關于通用<b class='flag-5'>加解密</b>函數(crypto)教程!

    關于4G模組LuatOS開發:通用加解密函數(crypto)|全攻略

    本次我要說的攻略是關于4G模組LuatOS開發的通用加解密函數,我以我常用的Air780E模組為例子供大家參考。
    的頭像 發表于 11-30 09:52 ?241次閱讀
    關于4G模組LuatOS開發:通用<b class='flag-5'>加解密</b>函數(crypto)|全攻略

    RA8D1加密引擎功能體驗和實踐

    本次實踐完成了RA8D1芯片AES密鑰封裝和芯片加解密功能驗證
    的頭像 發表于 11-23 01:01 ?320次閱讀
    RA8D1加密引擎功能體驗和實踐

    aes算法移動應用中的應用場景

    傳輸敏感數據,如個人信息、賬戶密碼、交易記錄等。AES算法能夠對這些數據進行加密,確保傳輸過程中不被竊取或篡改。例如,移動支付應用中,AES
    的頭像 發表于 11-14 15:14 ?290次閱讀

    aes加密的常見錯誤及解決方案

    的歸納以及相應的解決方案: 常見錯誤 編碼問題 : 將字節數組轉換成字符串時,如果使用了不同的編碼格式,可能會導致解密后的數據出現亂碼。 密鑰長度問題 : AES算法支持128位、1
    的頭像 發表于 11-14 15:13 ?1183次閱讀

    aes云存儲中的應用實例

    ,使用相同的密鑰進行加密和解密。它支持128、192和256位的密鑰長度,具有很高的安全性。AES加密過程包括多個輪次,每一輪包括四個步驟:SubBytes(字節替換)、ShiftRows(行移位)、MixColumns(列混淆
    的頭像 發表于 11-14 15:11 ?373次閱讀

    aes算法在數據傳輸中的應用

    AES算法由美國國家標準與技術研究院(NIST)于2001年正式采納為加密標準,它是一種基于塊的加密算法,使用128位、192位或256位的密鑰長度,對數據塊進行加密。
    的頭像 發表于 11-14 15:09 ?375次閱讀

    4G模組加解密藝術:通用函數的深度解讀

    今天是對加解密通用函數的深度解讀,我將詳細講解,建議收藏,不可錯過。
    的頭像 發表于 11-12 09:58 ?232次閱讀
    4G模組<b class='flag-5'>加解密</b>藝術:通用函數的深度解讀

    藍牙AES+RNG如何保障物聯網信息安全

    標準,主要用于保護電子數據的安全。AES 支持128、192、和256位密鑰長度,其中AES-128是最常用的一種,它使用128位(16字節)的密鑰進行加密和解密操作。
    發表于 11-08 15:38

    SITARA MCU器件上集成MbedTLS

    電子發燒友網站提供《SITARA MCU器件上集成MbedTLS.pdf》資料免費下載
    發表于 08-27 10:44 ?0次下載
    <b class='flag-5'>在</b>SITARA <b class='flag-5'>MCU</b>器件上集成<b class='flag-5'>MbedTLS</b>

    使用mbedtls連接到aws iot,無法編譯代碼的原因?

    MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 /* * Save RAM at the expense
    發表于 07-12 07:24

    基于FPGA的AES256光纖加密設計

    AES算法的硬件實現,國內外研究學者大部分是基于FPGA的硬件實現。解放軍理工大學的呂游等人研究高級加密標準俄歇算法的設計原理,并通過加密部
    發表于 06-19 19:50

    鴻蒙OS開發問題:(ArkTS)【 RSA加解密,解決中文亂碼等現象】

    RSA加解密開始構建工具類就是舉步維艱,官方文檔雖然很全,但是還是有很多小瑕疵,自己經過幾天的時間,徹底解決了中文亂碼的問題、分段加密的問題。
    的頭像 發表于 03-27 21:23 ?1755次閱讀
    鴻蒙OS開發問題:(ArkTS)【 RSA<b class='flag-5'>加解密</b>,解決中文亂碼等現象】

    基于FPGA的可編程AES加解密IP

    可編程AES加解密IP內建密鑰擴展功能,使用初始密鑰產生擴展密鑰,用于加解密過程。可編程AES加解密IP處理128-bit分組數據,并且支持
    發表于 01-09 10:49 ?492次閱讀
    基于FPGA的可編程<b class='flag-5'>AES</b><b class='flag-5'>加解密</b>IP
    主站蜘蛛池模板: 国产三级精品三级男人的天堂| 国产麻豆福利AV在线观看| 国产精品A久久777777| 精品亚洲国产熟女福利自在线 | 国产3级在线观看| 精品久久久99大香线蕉| 欧美人与动牲交XXXXBBBB免费| 午夜国产福利| 91情国产l精品国产亚洲区| 国产精品99久久久精品无码| 老司机福利在视频在ae8| 色AV色婷婷96人妻久久久| 伊人久久精品线影院| 岛国片免费在线观看| 久久人人爽人人片AV人成| 丝瓜涩涩屋黄瓜香蕉丝瓜| 中国午夜伦理片| 国产看黄网站又黄又爽又色| 暖暖视频在线观看高清...| 亚洲精品久久午夜麻豆| 把极品白丝班长啪到腿软| 久久re亚洲在线视频| 特级毛片内射WWW无码| 8050午夜二级一片| 国内久经典AAAAA片| 日韩1区1区产品乱码芒果榴莲| 伊人久久亚洲综合天堂| 国产精品大全国产精品| 欧美牲交A欧美牲交VDO| 樱桃视频高清免费观看在线播放| 国产精品999| 全免费A敌肛交毛片免费懂色AV| 伊人久久综合热青草| 国产伦精品一区二区三区免费| 欧美性xxxxxx爱| 中文字幕在线免费观看视频| 果冻传媒完整免费网站在线观看 | 成人在线观看免费视频| 噜妇插内射精品| 亚洲婷婷天堂综合国产剧情| 国产爱豆剧果冻传媒在线|