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

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

?? stun_auth.c

?? 一個開源的sip源代碼
?? C
字號:
/* $Id: stun_auth.c 1312 2007-05-29 00:42:13Z bennylp $ */
/* 
 * Copyright (C) 2003-2005 Benny Prijono <benny@prijono.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */
#include <pjnath/stun_auth.h>
#include <pjnath/errno.h>
#include <pjlib-util/hmac_sha1.h>
#include <pjlib-util/sha1.h>
#include <pj/assert.h>
#include <pj/log.h>
#include <pj/string.h>

#define THIS_FILE   "stun_auth.c"

/* Duplicate credential */
PJ_DEF(void) pj_stun_auth_cred_dup( pj_pool_t *pool,
				      pj_stun_auth_cred *dst,
				      const pj_stun_auth_cred *src)
{
    dst->type = src->type;

    switch (src->type) {
    case PJ_STUN_AUTH_CRED_STATIC:
	pj_strdup(pool, &dst->data.static_cred.realm,
			&src->data.static_cred.realm);
	pj_strdup(pool, &dst->data.static_cred.username,
			&src->data.static_cred.username);
	dst->data.static_cred.data_type = src->data.static_cred.data_type;
	pj_strdup(pool, &dst->data.static_cred.data,
			&src->data.static_cred.data);
	pj_strdup(pool, &dst->data.static_cred.nonce,
			&src->data.static_cred.nonce);
	break;
    case PJ_STUN_AUTH_CRED_DYNAMIC:
	pj_memcpy(&dst->data.dyn_cred, &src->data.dyn_cred, 
		  sizeof(src->data.dyn_cred));
	break;
    }
}


PJ_INLINE(pj_uint16_t) GET_VAL16(const pj_uint8_t *pdu, unsigned pos)
{
    return (pj_uint16_t) ((pdu[pos] << 8) + pdu[pos+1]);
}


/* Send 401 response */
static pj_status_t create_challenge(pj_pool_t *pool,
				    const pj_stun_msg *msg,
				    int err_code,
				    const pj_str_t *err_msg,
				    const pj_str_t *realm,
				    const pj_str_t *nonce,
				    pj_stun_msg **p_response)
{
    pj_stun_msg *response;
    pj_str_t tmp_nonce;
    pj_status_t rc;

    rc = pj_stun_msg_create_response(pool, msg, 
				     err_code,  err_msg, &response);
    if (rc != PJ_SUCCESS)
	return rc;


    if (realm && realm->slen) {
	rc = pj_stun_msg_add_string_attr(pool, response,
					 PJ_STUN_ATTR_REALM, 
					 realm);
	if (rc != PJ_SUCCESS)
	    return rc;

	/* long term must include nonce */
	if (!nonce || nonce->slen == 0) {
	    tmp_nonce = pj_str("pjstun");
	    nonce = &tmp_nonce;
	}
    }

    if (nonce && nonce->slen) {
	rc = pj_stun_msg_add_string_attr(pool, response,
					 PJ_STUN_ATTR_NONCE, 
					 nonce);
	if (rc != PJ_SUCCESS)
	    return rc;
    }

    *p_response = response;

    return PJ_SUCCESS;
}


/* Verify credential in the request */
PJ_DEF(pj_status_t) pj_stun_authenticate_request(const pj_uint8_t *pkt,
					         unsigned pkt_len,
					         const pj_stun_msg *msg,
					         pj_stun_auth_cred *cred,
					         pj_pool_t *pool,
					         pj_stun_msg **p_response)
{
    pj_str_t realm, nonce, password;
    const pj_stun_msgint_attr *amsgi;
    unsigned amsgi_pos;
    const pj_stun_username_attr *auser;
    pj_bool_t username_ok;
    const pj_stun_realm_attr *arealm;
    const pj_stun_realm_attr *anonce;
    pj_hmac_sha1_context ctx;
    pj_uint8_t digest[PJ_SHA1_DIGEST_SIZE];
    pj_str_t key;
    pj_status_t status;

    /* msg and credential MUST be specified */
    PJ_ASSERT_RETURN(pkt && pkt_len && msg && cred, PJ_EINVAL);

    /* If p_response is specified, pool MUST be specified. */
    PJ_ASSERT_RETURN(!p_response || pool, PJ_EINVAL);

    if (p_response)
	*p_response = NULL;

    if (!PJ_STUN_IS_REQUEST(msg->hdr.type))
	p_response = NULL;

    /* Get realm and nonce */
    realm.slen = nonce.slen = 0;
    if (cred->type == PJ_STUN_AUTH_CRED_STATIC) {
	realm = cred->data.static_cred.realm;
	nonce = cred->data.static_cred.nonce;
    } else if (cred->type == PJ_STUN_AUTH_CRED_DYNAMIC) {
	status = cred->data.dyn_cred.get_auth(cred->data.dyn_cred.user_data,
					      pool, &realm, &nonce);
	if (status != PJ_SUCCESS)
	    return status;
    } else {
	pj_assert(!"Unexpected");
	return PJ_EBUG;
    }

    /* First check that MESSAGE-INTEGRITY is present */
    amsgi = (const pj_stun_msgint_attr*)
	    pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_MESSAGE_INTEGRITY, 0);
    if (amsgi == NULL) {
	if (p_response) {
	    create_challenge(pool, msg, PJ_STUN_SC_UNAUTHORIZED, NULL,
			     &realm, &nonce, p_response);
	}
	return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_INTEGRITY_CHECK_FAILURE);
    }

    /* Next check that USERNAME is present */
    auser = (const pj_stun_username_attr*)
	    pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_USERNAME, 0);
    if (auser == NULL) {
	if (p_response) {
	    create_challenge(pool, msg, PJ_STUN_SC_MISSING_USERNAME, NULL,
			     &realm, &nonce, p_response);
	}
	return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_MISSING_USERNAME);
    }

    /* Get REALM, if any */
    arealm = (const pj_stun_realm_attr*)
	     pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_REALM, 0);

    /* Check if username match */
    if (cred->type == PJ_STUN_AUTH_CRED_STATIC) {
	username_ok = !pj_strcmp(&auser->value, 
				 &cred->data.static_cred.username);
	password = cred->data.static_cred.data;
    } else if (cred->type == PJ_STUN_AUTH_CRED_DYNAMIC) {
	int data_type = 0;
	pj_status_t rc;
	rc = cred->data.dyn_cred.get_password(msg, 
					      cred->data.dyn_cred.user_data,
					      (arealm?&arealm->value:NULL),
					      &auser->value, pool,
					      &data_type, &password);
	username_ok = (rc == PJ_SUCCESS);
    } else {
	username_ok = PJ_TRUE;
	password.slen = 0;
    }

    if (!username_ok) {
	/* Username mismatch */
	if (p_response) {
	    create_challenge(pool, msg, PJ_STUN_SC_UNKNOWN_USERNAME, NULL,
			     &realm, &nonce, p_response);
	}
	return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_UNKNOWN_USERNAME);
    }


    /* Get NONCE attribute */
    anonce = (pj_stun_nonce_attr*)
	     pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_NONCE, 0);

    /* Check for long term/short term requirements. */
    if (realm.slen != 0 && arealm == NULL) {
	/* Long term credential is required and REALM is not present */
	if (p_response) {
	    create_challenge(pool, msg, PJ_STUN_SC_MISSING_REALM, NULL,
			     &realm, &nonce, p_response);
	}
	return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_MISSING_REALM);

    } else if (realm.slen != 0 && arealm != NULL) {
	/* We want long term, and REALM is present */

	/* NONCE must be present. */
	if (anonce == NULL && nonce.slen) {
	    if (p_response) {
		create_challenge(pool, msg, PJ_STUN_SC_MISSING_NONCE, 
				 NULL, &realm, &nonce, p_response);
	    }
	    return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_MISSING_NONCE);
	}

	/* Verify REALM matches */
	if (pj_stricmp(&arealm->value, &realm)) {
	    /* REALM doesn't match */
	    if (p_response) {
		create_challenge(pool, msg, PJ_STUN_SC_MISSING_REALM, 
				 NULL, &realm, &nonce, p_response);
	    }
	    return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_MISSING_REALM);
	}

	/* Valid case, will validate the message integrity later */

    } else if (realm.slen == 0 && arealm != NULL) {
	/* We want to use short term credential, but client uses long
	 * term credential. The draft doesn't mention anything about
	 * switching between long term and short term.
	 */
	
	/* For now just accept the credential, anyway it will probably
	 * cause wrong message integrity value later.
	 */
    } else if (realm.slen==0 && arealm == NULL) {
	/* Short term authentication is wanted, and one is supplied */

	/* Application MAY request NONCE to be supplied */
	if (nonce.slen != 0) {
	    if (p_response) {
		create_challenge(pool, msg, PJ_STUN_SC_MISSING_NONCE, 
				 NULL, &realm, &nonce, p_response);
	    }
	    return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_MISSING_NONCE);
	}
    }

    /* If NONCE is present, validate it */
    if (anonce) {
	pj_bool_t ok;

	if (cred->type == PJ_STUN_AUTH_CRED_DYNAMIC &&
	    cred->data.dyn_cred.verify_nonce != NULL) 
	{
	    ok=cred->data.dyn_cred.verify_nonce(msg, 
						cred->data.dyn_cred.user_data,
						(arealm?&arealm->value:NULL),
						&auser->value,
						&anonce->value);
	} else if (cred->type == PJ_STUN_AUTH_CRED_DYNAMIC) {
	    ok = PJ_TRUE;
	} else {
	    if (nonce.slen) {
		ok = !pj_strcmp(&anonce->value, &nonce);
	    } else {
		ok = PJ_TRUE;
	    }
	}

	if (!ok) {
	    if (p_response) {
		create_challenge(pool, msg, PJ_STUN_SC_STALE_NONCE, 
				 NULL, &realm, &nonce, p_response);
	    }
	    return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_MISSING_NONCE);
	}
    }

    /* Get the position of MESSAGE-INTEGRITY in the packet */
    amsgi_pos = 20+msg->hdr.length-24;
    if (GET_VAL16(pkt, amsgi_pos) == PJ_STUN_ATTR_MESSAGE_INTEGRITY) {
	/* Found MESSAGE-INTEGRITY as the last attribute */
    } else {
	amsgi_pos = 0;
    }
    
    if (amsgi_pos==0) {
	amsgi_pos = 20+msg->hdr.length-8-24;
	if (GET_VAL16(pkt, amsgi_pos) == PJ_STUN_ATTR_MESSAGE_INTEGRITY) {
	    /* Found MESSAGE-INTEGRITY before FINGERPRINT */
	} else {
	    amsgi_pos = 0;
	}
    }

    if (amsgi_pos==0) {
	pj_assert(!"Unable to find MESSAGE-INTEGRITY in the message!");
	return PJ_EBUG;
    }

    /* Calculate key */
    pj_stun_create_key(pool, &key, &realm, &auser->value, &password);

    /* Now calculate HMAC of the message, adding zero padding if necessary
     * to make the input 64 bytes aligned.
     */
    pj_hmac_sha1_init(&ctx, (pj_uint8_t*)key.ptr, key.slen);
    pj_hmac_sha1_update(&ctx, pkt, amsgi_pos);
    if (amsgi_pos & 63) {
	pj_uint8_t zeroes[64];
	pj_bzero(zeroes, sizeof(zeroes));
	pj_hmac_sha1_update(&ctx, zeroes, 64-(amsgi_pos & 63));
    }
    pj_hmac_sha1_final(&ctx, digest);

    /* Compare HMACs */
    if (pj_memcmp(amsgi->hmac, digest, 20)) {
	/* HMAC value mismatch */
	if (p_response) {
	    create_challenge(pool, msg, PJ_STUN_SC_INTEGRITY_CHECK_FAILURE,
			     NULL, &realm, &nonce, p_response);
	}
	return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_INTEGRITY_CHECK_FAILURE);
    }

    /* Everything looks okay! */
    return PJ_SUCCESS;
}


/* Determine if STUN message can be authenticated */
PJ_DEF(pj_bool_t) pj_stun_auth_valid_for_msg(const pj_stun_msg *msg)
{
    unsigned msg_type = msg->hdr.type;
    const pj_stun_errcode_attr *err_attr;

    /* STUN requests and success response can be authenticated */
    if (!PJ_STUN_IS_ERROR_RESPONSE(msg_type) && 
	!PJ_STUN_IS_INDICATION(msg_type))
    {
	return PJ_TRUE;
    }

    /* STUN Indication cannot be authenticated */
    if (PJ_STUN_IS_INDICATION(msg_type))
	return PJ_FALSE;

    /* Authentication for STUN error responses depend on the error
     * code.
     */
    err_attr = (const pj_stun_errcode_attr*)
	       pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_ERROR_CODE, 0);
    if (err_attr == NULL) {
	PJ_LOG(4,(THIS_FILE, "STUN error code attribute not present in "
			     "error response"));
	return PJ_TRUE;
    }

    switch (err_attr->err_code) {
    case PJ_STUN_SC_BAD_REQUEST:	    /* 400 (Bad Request)	    */
    case PJ_STUN_SC_UNAUTHORIZED:	    /* 401 (Unauthorized)	    */
    case PJ_STUN_SC_STALE_CREDENTIALS:	    /* 430 (Stale Credential)	    */
    case PJ_STUN_SC_MISSING_USERNAME:	    /* 432 (Missing Username)	    */
    case PJ_STUN_SC_MISSING_REALM:	    /* 434 (Missing Realm)	    */
    case PJ_STUN_SC_UNKNOWN_USERNAME:	    /* 436 (Unknown Username)	    */
    case PJ_STUN_SC_INTEGRITY_CHECK_FAILURE:/* 431 (Integrity Check Fail)   */
	return PJ_FALSE;
    default:
	return PJ_TRUE;
    }
}


/* Authenticate MESSAGE-INTEGRITY in the response */
PJ_DEF(pj_status_t) pj_stun_authenticate_response(const pj_uint8_t *pkt,
					          unsigned pkt_len,
					          const pj_stun_msg *msg,
					          const pj_str_t *key)
{
    const pj_stun_msgint_attr *amsgi;
    unsigned amsgi_pos;
    pj_hmac_sha1_context ctx;
    pj_uint8_t digest[PJ_SHA1_DIGEST_SIZE];

    PJ_ASSERT_RETURN(pkt && pkt_len && msg && key, PJ_EINVAL);

    /* First check that MESSAGE-INTEGRITY is present */
    amsgi = (const pj_stun_msgint_attr*)
	    pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_MESSAGE_INTEGRITY, 0);
    if (amsgi == NULL) {
	return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_INTEGRITY_CHECK_FAILURE);
    }


    /* Check that message length is valid */
    if (msg->hdr.length < 24) {
	return PJNATH_EINSTUNMSGLEN;
    }

    /* Get the position of MESSAGE-INTEGRITY in the packet */
    amsgi_pos = 20+msg->hdr.length-24;
    if (GET_VAL16(pkt, amsgi_pos) == PJ_STUN_ATTR_MESSAGE_INTEGRITY) {
	/* Found MESSAGE-INTEGRITY as the last attribute */
    } else {
	amsgi_pos = 0;
    }
    
    if (amsgi_pos==0) {
	/* Check that message length is valid */
	if (msg->hdr.length < 32) {
	    return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_INTEGRITY_CHECK_FAILURE);
	}

	amsgi_pos = 20+msg->hdr.length-8-24;
	if (GET_VAL16(pkt, amsgi_pos) == PJ_STUN_ATTR_MESSAGE_INTEGRITY) {
	    /* Found MESSAGE-INTEGRITY before FINGERPRINT */
	} else {
	    amsgi_pos = 0;
	}
    }

    if (amsgi_pos==0) {
	return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_INTEGRITY_CHECK_FAILURE);
    }

    /* Now calculate HMAC of the message, adding zero padding if necessary
     * to make the input 64 bytes aligned.
     */
    pj_hmac_sha1_init(&ctx, (pj_uint8_t*)key->ptr, key->slen);
    pj_hmac_sha1_update(&ctx, pkt, amsgi_pos);
    if (amsgi_pos & 0x3F) {
	pj_uint8_t zeroes[64];
	pj_bzero(zeroes, sizeof(zeroes));
	pj_hmac_sha1_update(&ctx, zeroes, 64-(amsgi_pos & 0x3F));
    }
    pj_hmac_sha1_final(&ctx, digest);

    /* Compare HMACs */
    if (pj_memcmp(amsgi->hmac, digest, 20)) {
	/* HMAC value mismatch */
	return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_INTEGRITY_CHECK_FAILURE);
    }

    /* Everything looks okay! */
    return PJ_SUCCESS;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人高清伦理免费影院在线观看| 久久综合色8888| 26uuu精品一区二区| 亚洲精品中文字幕乱码三区| 久久爱另类一区二区小说| 色噜噜久久综合| 国产欧美日韩在线| 麻豆成人在线观看| 91麻豆国产自产在线观看| 精品久久久久99| 亚洲综合免费观看高清在线观看| 国产主播一区二区| 555www色欧美视频| 亚洲一区国产视频| 91美女片黄在线观看91美女| 久久精品免费在线观看| 青青青伊人色综合久久| 欧洲另类一二三四区| 一区二区中文视频| 粉嫩绯色av一区二区在线观看| 精品捆绑美女sm三区| 亚洲成人在线免费| 欧美色图激情小说| 一区二区三区91| 色综合久久久久综合体 | 国产一区二区三区四区在线观看| 欧美日韩精品欧美日韩精品一 | 欧美韩国日本不卡| 国产乱码精品一区二区三区忘忧草| 欧美日韩一卡二卡三卡| 亚洲国产视频a| 欧美亚洲一区二区在线| 亚洲成a人在线观看| 欧美日韩精品欧美日韩精品| 亚洲二区在线观看| 欧美精品国产精品| 日韩和欧美一区二区| 欧美精品xxxxbbbb| 免费成人性网站| 久久嫩草精品久久久精品| 极品销魂美女一区二区三区| wwwwww.欧美系列| 成人永久免费视频| 成人欧美一区二区三区| 在线观看日韩精品| 日韩av午夜在线观看| 日韩欧美美女一区二区三区| 国产在线精品免费| 国产日产欧美一区| 91麻豆福利精品推荐| 亚洲最大色网站| 91精品国产综合久久精品| 久久精品av麻豆的观看方式| 精品久久久久久久久久久久久久久 | 色综合欧美在线视频区| 亚洲精选一二三| 91精品国产一区二区三区| 国产又黄又大久久| 亚洲欧美怡红院| 91美女精品福利| 免费成人深夜小野草| 欧美韩日一区二区三区四区| 色偷偷久久人人79超碰人人澡| 日韩专区中文字幕一区二区| 久久综合给合久久狠狠狠97色69| av中文字幕在线不卡| 午夜精品久久久久久久99樱桃| 精品国产伦理网| 99久久伊人网影院| 免费在线欧美视频| 亚洲色图欧美在线| 精品国产免费人成在线观看| 91浏览器在线视频| 久久国产精品99久久久久久老狼| 亚洲天堂2014| 精品1区2区在线观看| 91精品福利在线| 国产一区二区影院| 午夜精品福利一区二区三区蜜桃| 国产三区在线成人av| 欧美视频中文一区二区三区在线观看| 国产一区不卡视频| 婷婷开心久久网| 亚洲色图丝袜美腿| 久久综合五月天婷婷伊人| 欧美天堂一区二区三区| 春色校园综合激情亚洲| 免费欧美在线视频| 亚洲综合视频在线观看| 国产精品久久影院| 久久久五月婷婷| 欧美一区二区三区视频在线 | 国产老妇另类xxxxx| 亚洲图片一区二区| 综合激情网...| 日本一区二区视频在线观看| 欧美成人aa大片| 在线播放国产精品二区一二区四区 | 欧美日韩综合在线免费观看| av电影天堂一区二区在线观看| 天天综合天天综合色| 一区二区三区中文免费| 国产精品天天看| 久久精品亚洲乱码伦伦中文| 亚洲精品一区在线观看| 精品国产凹凸成av人导航| 制服丝袜一区二区三区| 91精品国产欧美一区二区成人| 在线观看日产精品| 色播五月激情综合网| 91福利社在线观看| 色综合久久中文综合久久牛| 色妹子一区二区| 色爱区综合激月婷婷| 欧美亚洲禁片免费| 欧美日韩国产在线观看| 欧美日韩不卡一区| 欧美巨大另类极品videosbest | 丝袜美腿一区二区三区| 天天色综合成人网| 三级精品在线观看| 视频一区二区三区在线| 午夜婷婷国产麻豆精品| 日韩精品1区2区3区| 久久精品国产色蜜蜜麻豆| 精品一二线国产| 国产大陆精品国产| jizz一区二区| 欧美日精品一区视频| 日韩一区二区三区高清免费看看| 精品国产一区二区三区忘忧草| 久久免费偷拍视频| 亚洲欧洲精品天堂一级| 一区二区三区在线观看网站| 亚洲不卡av一区二区三区| 天涯成人国产亚洲精品一区av| 免费不卡在线视频| 国产成人自拍高清视频在线免费播放| 国产69精品久久99不卡| 色综合网色综合| 日韩一区二区三区四区| 国产午夜精品久久久久久免费视 | 久久精子c满五个校花| 综合久久久久综合| 亚洲123区在线观看| 国内精品嫩模私拍在线| 99视频一区二区三区| 欧美三区免费完整视频在线观看| 这里只有精品视频在线观看| 国产欧美一区视频| 亚洲愉拍自拍另类高清精品| 狠狠色2019综合网| 91麻豆精品在线观看| 精品动漫一区二区三区在线观看| 国产精品灌醉下药二区| 免费不卡在线视频| 91同城在线观看| 26uuu成人网一区二区三区| 一级日本不卡的影视| 国产精品自拍三区| 欧美日韩一区不卡| 国产精品福利电影一区二区三区四区| 香蕉影视欧美成人| 国产高清视频一区| 在线播放视频一区| 亚洲三级免费观看| 国产高清成人在线| 91精品国产综合久久精品app| 国产精品久久久久aaaa| 久久99久久精品| 欧美日韩一区二区三区不卡| 中文字幕一区视频| 国产在线不卡一卡二卡三卡四卡| 在线精品亚洲一区二区不卡| 亚洲国产精品激情在线观看| 美女视频黄频大全不卡视频在线播放| 91日韩精品一区| 欧美国产激情二区三区| 极品美女销魂一区二区三区免费| 欧美日韩成人综合在线一区二区| 亚洲欧美偷拍卡通变态| 国产成人免费av在线| 精品国产凹凸成av人导航| 亚洲国产你懂的| 欧美性猛交一区二区三区精品| 亚洲欧洲精品一区二区三区| 成人免费av资源| 国产午夜亚洲精品理论片色戒| 精品在线观看免费| 欧美成人精品二区三区99精品| 日韩高清一区在线| 欧美日韩电影在线| 日韩电影一区二区三区| 欧美精品九九99久久| 日韩国产欧美在线视频| 欧美日韩亚洲综合一区| 亚洲国产精品一区二区久久恐怖片 | 成人午夜伦理影院| 国产欧美精品区一区二区三区| 麻豆91在线播放|