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

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

?? zdm2read.c

?? IBE是一種非對稱密碼技術
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* Copyright 2003-2006, Voltage Security, all rights reserved.
 */
 
#include "vibe.h"
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "securearchive.h"
#include "errorctx.h"
#include "vtassert.h"
#include "datanode.h"
#include "compress.h"
#include "archive.h"
#include "sacommon.h"
#include "zdm2common.h"
#include "stringutil.h"
#include "securemail.h"
#include "zdm.h"

typedef struct VoltZDM2ReadLocalCtx {
  VtSecureArchiveObject       mSecureArchive;
  VtBufferTypeInfo            mBufferTypeInfo;
  unsigned int                mMessageFormat;
  VtZDMEmailRecipientList     mPrimaryRecipientList;
  VtZDMEmailRecipientList     mCCRecipientList;
  int                         mCurrentEntryType;
  VtDataNodeObject            mInsecureAttributes;
  VtStreamObject              mInputStream;
  unsigned char               mOwnsInputStream;
  unsigned char               mReadInitCalled;
  unsigned char               mMessageUnwrapped;
  unsigned char               mEmailRecipientsInited;
  unsigned char               mSecureArchiveInited;
} VoltZDM2ReadLocalCtx;

static void VoltZDM2ReadLocalCtxDestroy(Pointer obj, Pointer ctx)
{
  VtZDMObject zdmObj = (VtZDMObject)obj;
  VoltZDM2ReadLocalCtx* readCtx;
  VtLibCtx libCtx = (VtLibCtx)0;
  
  if ((obj == (Pointer)0) || (ctx == (Pointer)0))
    return;
  
  readCtx = (VoltZDM2ReadLocalCtx*)ctx;
  VT_ASSERT(readCtx != (VoltZDM2ReadLocalCtx*)0);
  libCtx = zdmObj->voltObject.libraryCtx;
  VT_ASSERT(libCtx != (VtLibCtx)0);
  
  VtDestroySecureArchiveObject(&readCtx->mSecureArchive);
  VtDestroyDataNodeObject(&readCtx->mInsecureAttributes);
  if (readCtx->mOwnsInputStream)
    VtDestroyStreamObject(&readCtx->mInputStream);
  Z2Free(readCtx->mPrimaryRecipientList.emailList);
  Z2Free(readCtx->mCCRecipientList.emailList);
  
  Z2Free(readCtx);
}

static int VoltZDM2InitEmailRecipients(
  VtZDMObject zdmObj
)
{
  int status = 0;
  VtLibCtx libCtx = (VtLibCtx)0;
  VoltZDM2ReadLocalCtx* readCtx;
  VtDataNodeObject attributesNode;
  VtDataNodeObject recipientsNode;
  VtDataNodeObject recipientNode;
  VtDataNodeObject node;
  const unsigned char* recipientAddress;
  long recipientFlags;
  int recipientCount;
  int i;
  VOLT_DECLARE_FNCT_LINE(fnctLine)
  VOLT_DECLARE_ERROR_TYPE(errorType)
  
  VT_ASSERT(zdmObj != (VtZDMObject)0);

  libCtx = zdmObj->voltObject.libraryCtx;
  VT_ASSERT(libCtx != (VtLibCtx)0);
  readCtx = (VoltZDM2ReadLocalCtx*) zdmObj->localCtx;
  VT_ASSERT(readCtx != (VoltZDM2ReadLocalCtx*)0);
  VT_ASSERT(readCtx->mSecureArchive != (VtSecureArchiveObject)0);
  
  VOLT_SET_ERROR_TYPE(errorType, 0)
  
  do
  {
    if (readCtx->mEmailRecipientsInited)
      break;
      
    /* Access the attributes node maintained by the secure archive.
     * This is sort of a hack and we could get around it by getting
     * all the information through the public attribute API, but it
     * would be inconvenient.
     */
    VOLT_SET_FNCT_LINE(fnctLine)
    status = VtGetSecureArchiveParam(readCtx->mSecureArchive,
      VtSecureArchiveParamAttributesNode, (Pointer*)&attributesNode);
    if (status != 0)
      break;
    
    VOLT_SET_FNCT_LINE(fnctLine)
    status = VtDataNodeResolveChild(attributesNode,
      VoltZDM2RecipientsAttributeName, 0, &recipientsNode);
    if (status != 0)
      break;
    
    /* Figure out how many total recipients there are. This count will
     * include both primary and CC recipients. We use this total to
     * allocate the email address array for both the primary and CC
     * recipients even though we probably won't fill them up, but it's
     * not that wasteful and it avoid having to make a preliminary pass
     * over the recipients to determine the counts.
     */
    VOLT_SET_FNCT_LINE(fnctLine)
    status = VtDataNodeGetChildCount(recipientsNode, &recipientCount);
    if (status != 0)
      break;
    
    readCtx->mPrimaryRecipientList.emailList = (const unsigned char**)
      Z3Malloc(recipientCount * sizeof(unsigned char*));
    readCtx->mCCRecipientList.emailList = (const unsigned char**)
      Z3Malloc(recipientCount * sizeof(unsigned char*));
    if ((readCtx->mPrimaryRecipientList.emailList == (const unsigned char**)0) ||
        (readCtx->mCCRecipientList.emailList == (const unsigned char**)0))
    {
      VOLT_SET_ERROR_TYPE(errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE(fnctLine)
      status = VT_ERROR_MEMORY;
      break;
    }
    
    /* Loop over the recipients, extracting the recipient email
     * address and flags.
     */
    for (i = 0; i < recipientCount; i++)
    {
      VOLT_SET_FNCT_LINE(fnctLine)
      status = VtDataNodeGetChild(recipientsNode, i, &recipientNode);
      if (status != 0)
        break;
      
      VOLT_SET_FNCT_LINE(fnctLine)
      status = VtDataNodeLookupChild(recipientNode,
        VoltZDM2AddressAttributeName, &node);
      if (status != 0)
        break;
      
      VOLT_SET_FNCT_LINE(fnctLine)
      status = VtDataNodeGetStringValue(node, &recipientAddress);
      if (status != 0)
        break;
        
      VOLT_SET_FNCT_LINE(fnctLine)
      status = VtDataNodeLookupChild(recipientNode,
        VoltZDM2FlagsAttributeName, &node);
      if (status != 0)
        break;
      
      VOLT_SET_FNCT_LINE(fnctLine)
      status = VtDataNodeGetIntegerValue(node, &recipientFlags);
      if (status != 0)
        break;
      
      /* If the primary recipient flag is set then add it to the
       * primary recipient list.
       */
      if ((recipientFlags & VOLT_ZDM_RECIPIENT_FLAGS_PRIMARY) != 0)
      {
        readCtx->mPrimaryRecipientList.emailList[
          readCtx->mPrimaryRecipientList.count++] = recipientAddress;
      }
      
      /* If the CC recipient flag is set then add it to the
       * CC recipient list.
       */
      if ((recipientFlags & VOLT_ZDM_RECIPIENT_FLAGS_CC) != 0)
      {
        readCtx->mCCRecipientList.emailList[
          readCtx->mCCRecipientList.count++] = recipientAddress;
      }
    }
    
    readCtx->mEmailRecipientsInited = 1;
  }
  while (0);
  
  VOLT_LOG_ERROR_COMPARE(status, libCtx, status, errorType,
    fnctLine,"VoltZDM2InitEmailRecipients", (unsigned char*)0)
    
  return status;
}

static int VoltZDM2InitInsecureAttributes(
  VtZDMObject zdmObj
)
{
  int status = 0;
  VtLibCtx libCtx = (VtLibCtx)0;
  VoltZDM2ReadLocalCtx* readCtx;
  VtSecureArchiveCurrentEntryInfo currentEntryInfo;
  unsigned char buffer[1000];
  unsigned int size;
  VtStreamSize streamSize;
  unsigned char* attributesXML = (unsigned char*)0;
  VtStreamObject attributesStream = (VtStreamObject)0;
  VtStreamImplMemoryInfo memoryInfo;
  VOLT_DECLARE_FNCT_LINE(fnctLine)
  VOLT_DECLARE_ERROR_TYPE(errorType)
  
  VT_ASSERT(zdmObj != (VtZDMObject)0);

  libCtx = zdmObj->voltObject.libraryCtx;
  VT_ASSERT(libCtx != (VtLibCtx)0);
  readCtx = (VoltZDM2ReadLocalCtx*) zdmObj->localCtx;
  VT_ASSERT(readCtx != (VoltZDM2ReadLocalCtx*)0);
  VT_ASSERT(readCtx->mSecureArchive != (VtSecureArchiveObject)0);
  
  VOLT_SET_ERROR_TYPE(errorType, 0)
  
  do
  {
    if (readCtx->mInsecureAttributes != (VtDataNodeObject)0)
      break;
      
    /* Create a stream to hold the contents of the insecure
     * attributes entry. Since we're going to access the buffer
     * directly below to pass to the data node call, the stream
     * needs to be a memory-based stream, so we always create the
     * stream using the VtStreamImplMemory instead of using the
     * buffer type specified by the user. The insecure attributes
     * entry will typically be pretty small, so there shouldn't be
     * much of a memory overhead from using the memory-based stream.
     */
    VOLT_SET_FNCT_LINE(fnctLine)
    Z2Memset(&memoryInfo, 0, sizeof(memoryInfo));
    memoryInfo.flags = VT_STREAM_OPEN_ON_ACCESS;
    memoryInfo.openMode = VT_STREAM_OPEN_READ_WRITE;
    status = VtCreateStreamObject(libCtx, VtStreamImplMemory,
      (Pointer)&memoryInfo, &attributesStream);
    if (status != 0)
      break;
    
    /* Set the current entry in the secure archive */
    currentEntryInfo.type = VT_SECURE_ARCHIVE_CURRENT_ENTRY_INSECURE;
    currentEntryInfo.name = VoltZDM2InsecureAttributesFilePathName;
    
    VOLT_SET_FNCT_LINE(fnctLine)
    status = VtSetSecureArchiveParam(readCtx->mSecureArchive,
      VtSecureArchiveParamCurrentEntry, (Pointer)&currentEntryInfo);
    if (status != 0)
      break;
    
    /* Copy over the contents to the stream */
    for (;;)
    {
      VOLT_SET_FNCT_LINE(fnctLine)
      status = VtSecureArchiveReadUpdate(readCtx->mSecureArchive,
        (unsigned char*)0, 0, (unsigned int*)0, buffer,
        sizeof(buffer), &size);
      if ((status != 0) || (size == 0))
      {
        if (status == VT_ERROR_END_OF_STREAM)
          status = 0;
        break;
      }
      
      VOLT_SET_FNCT_LINE(fnctLine)
      status = VtStreamWrite(attributesStream, buffer, size);
      if (status != 0)
        break;
    }
    
    if (status != 0)
      break;
    
    /* Add a null-terminator, so we can use the memory buffer
     * as a C string to pass to the data node call.
     */
    VOLT_SET_FNCT_LINE(fnctLine)
    status = VtStreamWrite(attributesStream, "", 1);
    if (status != 0)
      break;
    
    /* Get a pointer to the stream's underlying buffer. This buffer
     * is still owned by the stream, so we don't need to delete it
     */
    VOLT_SET_FNCT_LINE(fnctLine)
    status = VtStreamGetBuffer(attributesStream, &attributesXML, &streamSize);
    if (status != 0)
      break;
    
    VOLT_SET_FNCT_LINE(fnctLine)
    status = VtCreateDataNodeObjectFromXML(libCtx, attributesXML,
      &readCtx->mInsecureAttributes);
    if (status != 0)
      break;
  }
  while (0);
  
  VtDestroyStreamObject(&attributesStream);
  
  VOLT_LOG_ERROR_COMPARE(status, libCtx, status, errorType,
    fnctLine,"VoltZDM2InitInsecureAttributes", (unsigned char*)0)
    
  return status;
}

static int VoltZDM2UnwrapMessage(
  VtZDMObject zdmObj
)
{
  int status = 0;
  VtLibCtx libCtx = (VtLibCtx)0;
  VoltZDM2ReadLocalCtx* readCtx;
  const unsigned int messageBufferSize = 4096;
  unsigned char* messageBuffer = (unsigned char*)0;
  unsigned char* dataBuffer = (unsigned char*)0;
  unsigned int dataBufferSize = 0;
  unsigned int dataSize;
  VtAlgorithmObject base64Decoder = (VtAlgorithmObject)0;
  VtStreamSize dataLength;
  int copyDataLength = 0;
  unsigned char* copySrc;
  int foundStartTag = 0;
  int foundEndTag = 0;
  int maxStartTagLength;
  unsigned char* startData = 0;
  unsigned char* endData;
  unsigned int bytesConsumed;
  unsigned int startTagVersion;
  unsigned int tagStartOffset;
  unsigned int tagEndOffset;
  const char* startInputFieldValue = "value=\"";
  int startInputFieldLength;
  int inInputFieldTag = 0;
  unsigned char* p;
  VOLT_DECLARE_FNCT_LINE(fnctLine)
  VOLT_DECLARE_ERROR_TYPE(errorType)
  
  VT_ASSERT(zdmObj != (VtZDMObject)0);

  libCtx = zdmObj->voltObject.libraryCtx;
  VT_ASSERT(libCtx != (VtLibCtx)0);
  readCtx = (VoltZDM2ReadLocalCtx*) zdmObj->localCtx;
  VT_ASSERT(readCtx != (VoltZDM2ReadLocalCtx*)0);

  VOLT_SET_ERROR_TYPE(errorType, 0)
  
  do
  {
    if (readCtx->mMessageUnwrapped)
      break;
    
    startInputFieldLength = Z2Strlen(startInputFieldValue);
    maxStartTagLength = Z2Strlen(VoltZDM2SecureBlockStartTagPrefix) +
      Z2Strlen(VoltZDM2SecureBlockStartTagPrefix) +
      VOLT_ZDM2_MAX_VERSION_NUMBER_LENGTH;
    
    messageBuffer = (unsigned char*) Z3Malloc(messageBufferSize);
    if (messageBuffer == (unsigned char*)0)
    {
      VOLT_SET_FNCT_LINE(fnctLine)
      VOLT_SET_ERROR_TYPE(errorType, VT_ERROR_TYPE_PRIMARY)
      status = VT_ERROR_MEMORY;
      break;
    }
    
    do
    {
      VOLT_SET_FNCT_LINE(fnctLine)
      status = VtStreamRead(readCtx->mInputStream,
        messageBuffer + copyDataLength,
        messageBufferSize - copyDataLength, &dataLength);
      if (status != 0)
      {
        status = VT_ERROR_INVALID_ZDM_MSG;
        break;
      }
      
      startData = (unsigned char*)0;
      endData = (unsigned char*)0;
      
      dataLength += copyDataLength;
      
      //messageBuffer[dataLength] = 0;
      
      if (foundStartTag)
      {
        startData = messageBuffer;
      }
      else
      {
        foundStartTag = VoltZDM2FindMessageTag(libCtx,
          VoltZDM2SecureBlockStartTagPrefix,
          VoltZDM2SecureBlockStartTagSuffix, messageBuffer,
          dataLength, 2, VOLT_ZDM2_CURRENT_VERSION, &startTagVersion,
          &tagStartOffset, &tagEndOffset);
        if (foundStartTag)
        {
          startData = messageBuffer + tagEndOffset;
        }
      }
      
      if (foundStartTag)
      {
        copyDataLength = startInputFieldLength;
        endData = 0;
        p = startData;
        
        while ((p < messageBuffer + dataLength) && !foundEndTag)
        {
          if (inInputFieldTag)
          {
            if ((p + startInputFieldLength < messageBuffer + dataLength) &&
              (VoltCaseInsensitiveCompareBuffers(p, startInputFieldLength,
              startInputFieldValue, startInputFieldLength, libCtx) == 0))
            {
              p += startInputFieldLength;
              startData = p;
              inInputFieldTag = 0;
            }
            else
            {
              p++;
            }
          }
          else if (*p == '"')
          {
            endData = p++;
            inInputFieldTag = 1;
          }
          else if (*p == VoltZDM2SecureBlockEndTagPrefix[0])
          {
            endData = p;
            foundEndTag = 1;
          }
          else
          {
            p++;
            if (p == messageBuffer + dataLength)
              endData = p - copyDataLength;
          }

          if (endData > startData)
          {
            if (base64Decoder == (VtAlgorithmObject)0)
            {
              VOLT_SET_FNCT_LINE(fnctLine)
              status = VtCreateAlgorithmObject(libCtx, VtAlgorithmImplBase64,
                (Pointer)0, &base64Decoder);
              if (status != 0)
                break;
              
              VOLT_SET_FNCT_LINE(fnctLine)
              status = VtDecodeInit(base64Decoder);
              if (status != 0)
              break;
            }
            
            if (foundEndTag)
            {
              status = VtDecodeFinal(base64Decoder, (VtRandomObject)0,
                startData, endData - startData, dataBuffer,
                dataBufferSize, &dataSize);
            }
            else
            {
              status = VtDecodeUpdate(base64Decoder, (VtRandomObject)0,
                startData, endData - startData, dataBuffer,
                dataBufferSize, &dataSize);
            }
            
            if (status == VT_ERROR_BUFFER_TOO_SMALL)
            {
              Z2Free(dataBuffer);
              dataBuffer = (unsigned char*) Z3Malloc(dataSize);
              if (dataBuffer == (unsigned char*)0)
              {
                VOLT_SET_FNCT_LINE(fnctLine)
                VOLT_SET_ERROR_TYPE(errorType, VT_ERROR_TYPE_PRIMARY)
                status = VT_ERROR_MEMORY;
                break;
              }
              dataBufferSize = dataSize;

              if (foundEndTag)
              {
                VOLT_SET_FNCT_LINE(fnctLine)
                status = VtDecodeFinal(base64Decoder, (VtRandomObject)0,
                  startData, endData - startData, dataBuffer,
                  dataBufferSize, &dataSize);
              }
              else

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲第一精品在线| 欧美日韩精品电影| 91精品麻豆日日躁夜夜躁| 国产亚洲福利社区一区| 天天色天天操综合| av在线播放不卡| 26uuu国产电影一区二区| 亚洲成人自拍偷拍| 91亚洲精华国产精华精华液| wwww国产精品欧美| 美女看a上一区| 欧美日韩高清一区二区不卡| 一区二区三区中文免费| 国产91色综合久久免费分享| 久久久精品日韩欧美| 久久精品国产一区二区三| 欧美日韩精品欧美日韩精品| 亚洲午夜国产一区99re久久| 成人国产精品免费观看动漫 | 国产精品资源网| 777久久久精品| 午夜视频在线观看一区二区三区| 99re热视频这里只精品| 中文在线资源观看网站视频免费不卡| 国产麻豆日韩欧美久久| 日韩精品影音先锋| 美女视频黄久久| 欧美成人女星排行榜| 久久狠狠亚洲综合| 日韩天堂在线观看| 极品少妇xxxx精品少妇| 欧美大片一区二区三区| 久久成人免费电影| 欧美精品一区男女天堂| 国产精品一二三区在线| 国产精品午夜春色av| 91亚洲精品久久久蜜桃| 一二三区精品视频| 欧美日韩激情一区| 蜜臀av一区二区在线免费观看| 日韩免费高清视频| 国内精品在线播放| 日本一区二区三区四区| av一区二区三区| 亚洲国产精品麻豆| 精品乱人伦小说| 国产精品12区| 一区二区在线观看视频| 欧美二区乱c少妇| 精品亚洲aⅴ乱码一区二区三区| 久久人人爽人人爽| 99re视频精品| 日本亚洲最大的色成网站www| 精品成人在线观看| 成人app在线观看| 亚洲国产精品精华液网站| 91精品国产免费久久综合| 国产在线精品免费| 亚洲色图19p| 日韩西西人体444www| 成人永久免费视频| 亚洲综合av网| 久久综合国产精品| 欧美亚洲一区二区在线观看| 久久99国产精品麻豆| 亚洲日本在线天堂| 精品福利一区二区三区| 91日韩在线专区| 精品在线一区二区| 一区二区三区欧美久久| 欧美精品一区二区三区四区| 色美美综合视频| 国产麻豆视频一区二区| 天天综合色天天| 中文字幕亚洲电影| 欧美变态口味重另类| 色狠狠色噜噜噜综合网| 黄色精品一二区| 亚洲va欧美va天堂v国产综合| 国产蜜臀97一区二区三区| 91精品婷婷国产综合久久性色| 成人国产亚洲欧美成人综合网 | 精品免费国产二区三区| 色天使色偷偷av一区二区| 国产麻豆欧美日韩一区| 午夜精品123| 洋洋成人永久网站入口| 国产精品久久精品日日| 精品国产乱码久久久久久免费| 欧美这里有精品| av一本久道久久综合久久鬼色| 极品美女销魂一区二区三区| 午夜视频一区在线观看| 亚洲激情男女视频| 国产精品毛片a∨一区二区三区 | 欧美嫩在线观看| 91污在线观看| yourporn久久国产精品| 国产福利91精品| 精品一区二区三区欧美| 日韩激情视频在线观看| 亚洲国产一区二区三区青草影视| 国产精品久久一级| 亚洲国产成人自拍| 欧美经典一区二区三区| 久久久久久久久久电影| 日韩西西人体444www| 91麻豆精品国产自产在线| 欧美日韩视频在线第一区| 91久久久免费一区二区| 91久久一区二区| 欧美色欧美亚洲另类二区| 欧美在线一区二区| 欧美日韩精品专区| 欧美一区二区精品在线| 91麻豆精品国产| 日韩丝袜情趣美女图片| 精品国产一区二区三区久久影院| 日韩精品专区在线影院重磅| 欧美www视频| 国产欧美视频一区二区| 国产精品成人午夜| 亚洲男同性恋视频| 亚洲成人一区在线| 免费成人av在线| 韩国成人精品a∨在线观看| 国产成人一级电影| 99精品视频一区二区| 色婷婷av一区二区三区大白胸 | 日韩精品高清不卡| 精品亚洲成a人| fc2成人免费人成在线观看播放| 95精品视频在线| 5月丁香婷婷综合| 久久久久久久久一| 中文字幕视频一区| 首页欧美精品中文字幕| 国产综合色产在线精品| www.日韩大片| 在线观看91精品国产麻豆| 精品日韩av一区二区| 国产精品久久一级| 日韩高清不卡一区| 国产精品12区| 欧美日本不卡视频| 久久久噜噜噜久久人人看| 一区二区在线观看视频| 久久精品国产亚洲a| 91丨porny丨蝌蚪视频| 91麻豆精品久久久久蜜臀 | 久久精品夜色噜噜亚洲aⅴ| 国产精品乱码一区二区三区软件| 亚洲激情自拍视频| 精品亚洲成a人| 欧美在线观看视频一区二区三区| 日韩一区二区三区电影| 亚洲天堂免费看| 毛片不卡一区二区| 91高清视频在线| 久久婷婷国产综合国色天香| 一区二区三区欧美在线观看| 国产高清久久久久| 欧美日韩dvd在线观看| 中文av一区特黄| 久久精工是国产品牌吗| 在线观看91精品国产入口| 欧美经典一区二区| 美女任你摸久久| 欧美色网一区二区| 亚洲欧美在线高清| 高清不卡一区二区| 日韩久久久精品| 性做久久久久久免费观看| 99久久精品一区| 欧美精品一区二区三区蜜桃| 天天综合天天综合色| 欧美在线观看视频在线| 中文字幕五月欧美| 国产成人aaaa| 久久这里只有精品视频网| 无吗不卡中文字幕| 欧美日韩亚洲综合一区| 亚洲女同ⅹxx女同tv| 99天天综合性| 国产精品第13页| 丁香啪啪综合成人亚洲小说| 精品久久久久久最新网址| 日韩高清电影一区| 在线播放一区二区三区| 亚洲一区二区三区中文字幕| 91麻豆产精品久久久久久| 国产精品免费观看视频| 成人国产在线观看| 中文字幕在线视频一区| 国产成人av一区二区| 国产丝袜欧美中文另类| 国产精品性做久久久久久| 久久久精品日韩欧美| 国产精品99久久久久久久vr| 国产亚洲成av人在线观看导航|