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

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

?? smread.c

?? IBE是一種非對稱密碼技術
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* Copyright 2003-2006, Voltage Security, all rights reserved.
 */
#include "vibe.h"
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "securemail.h"
#include "derhelp.h"
#include "errorctx.h"

/* Call DecodeUpdate, or DecodeFinal, place the result into
 * readCtx->unprocessedData. If the buffer is not big enough, expand it.
 * <p>The function will call Update or Final depending on the flag. If
 * non-zero, do Update, if 0, do Final.
 * <p>Upon return, the unprocessedData buffer contains the decoded
 * material and unprocessedDataLen is the length.
 *
 * @param obj
 * @param readCtx
 * @param flag If non-zero, Update, if 0, Final.
 * @param dataToDecode
 * @param dataToDecodeLen
 * @return an int, 0 if the function completed successfully or a
 * non-zero error code.
 */
static int VOLT_CALLING_CONV DoDecodeUpdateOrFinal VOLT_PROTO_LIST ((
   VoltSecureMailObject *obj,
   VoltSecureMailReadCtx *readCtx,
   unsigned int flag,
   unsigned char *dataToDecode,
   unsigned int dataToDecodeLen
));

/* There's data in the unprocessedData buffer, pass it to the Envelope
 * object for a ReadUpdate.
 * <p>The function will call Update or Final depending on the flag. If
 * non-zero, do Update, if 0, do Final. If it calls FInal, it will call
 * it with no data.
 * <p>If the envelope object cannot read all the data because of
 * VT_ERROR_CHOOSE_RECIPIENT, return that error and make sure the
 * unprocessedData buffer contains any unread envelope data. That is,
 * Memmove the unread data to the beginning of the buffer and set
 * unprocessedDataLen. If this is the case, there will be no Envelope
 * output.
 * <p>This function will not return BUFFER_TOO_SMALL, because if
 * there's any output, this routine will use any allocated space it
 * already has or will allocate new space if needed.
 * <p>Any error other than CHOOSE will be passed back to the caller.
 * <p>If the return is 0, the function will have read all the input.
 * <p>If the envelope object produces output, this function will place
 * the output into the unprocessedData buffer. That is, upon successful
 * completion, look in the unprocessedData buffer (length:
 * unprocessedDataLen) for material that is to be passed to the
 * SignedData object.
 */
static int VOLT_CALLING_CONV DoEnvelopeRead VOLT_PROTO_LIST ((
   VoltSecureMailObject *obj,
   VoltSecureMailReadCtx *readCtx,
   unsigned int flag
));

/* Add the given data to the given byteArrayObj.
 * <p>Append data. If there is already data there, place this new data
 * on the end. This might require a realloc.
 *
 * @param obj
 * @param byteArrayObj Where the new data will be placed.
 * @param data The data to place.
 * @param dataLen The length, in bytes of the data to place.
 * @return an int, 0 if the function completed successfully or a
 * non-zero error code.
 */
static int VOLT_CALLING_CONV StoreUnprocessedData VOLT_PROTO_LIST ((
   VoltSecureMailObject *obj,
   VoltByteArrayObj *byteArrayObj,
   unsigned char *data,
   unsigned int dataLen
));

/* Data was copied into the byteArrayCtx. The completeFlag indicates
 * whether it was a complete content descriptor. The signRead is how
 * many bytes were read out of the unprocessedData buffer of the
 * readCtx.
 * <p>This function will move the unprocessedData buffer by signRead
 * bytes.
 * <p>If the completeFlag indicates complete, the routine will check
 * the contents to see if the descriptor copied is the last one. If it
 * is not the last one, the function will increment the
 * contentMaterialCount in the readCtx and set the contentMaterialState
 * to ELEMENT. If it is the last one, the function will set the
 * contentMaterialState to COMPLETE.
 * <p>If the completeFlag is not complete, the function will set the
 * contentMaterialState to PARTIAL.
 * <p>If complete, the routine will pass the content to the P7
 * SignedData object, but will not return the output to the
 * application's output buffer.
 */
static int VOLT_CALLING_CONV ProcessContentDescriptor VOLT_PROTO_LIST ((
   VoltSecureMailObject *obj,
   VoltSecureMailReadCtx *readCtx,
   VoltByteArrayObj *byteArrayObj,
   unsigned int completeFlag,
   unsigned int signRead
));

int VoltSecureMailReadInit (
   VtSecureMailObject secureMailObj
   )
{
  int status;
  VoltSecureMailObject *obj = (VoltSecureMailObject *)secureMailObj;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* The state must be VOLT_SECURE_MAIL_STATE_READ_SET, if not,
     * we're not allowed to call ReadInit.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_CALL_ORDER;
    if (obj->state != VOLT_SECURE_MAIL_STATE_READ_SET)
      break;

    /* Init the subordinate objects.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtPkcs7ReadInit (obj->p7SignedData);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtPkcs7ReadInit (obj->p7EnvelopedData);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtDecodeInit (obj->base64);
    if (status != 0)
      break;

    obj->state = VOLT_SECURE_MAIL_STATE_READ_INIT;

  } while (0);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, secureMailObj, status, 0, errorType,
    (char *)0, "VoltSecureMailReadInit", fnctLine, (char *)0)

  return (status);
}

#define VOLT_ZDM_MESSAGE_TYPE \
    "<input type=\"hidden\" name=\"ZFRtype\" value=\"VoltageZFRDoc\">"
#define VOLT_ZDM_MESSAGE_TYPE_LEN  58
#define VOLT_ZDM_MESSAGE_START \
    "<input type=\"hidden\" name=\"ZFRdata\" value=\""
#define VOLT_ZDM_MESSAGE_START_LEN 43

int VoltSecureMailReadUpdate (
   VtSecureMailObject secureMailObj,
   unsigned char *message,
   unsigned int messageLen,
   unsigned int *bytesRead,
   unsigned char *outputData,
   unsigned int bufferSize,
   unsigned int *outputDataLen
   )
{
  int status;
  unsigned int index, completeFlag, amountRead, currentMessageLen;
  unsigned int inBlockLen, outBlockLen, leftovers, newLineLen;
  unsigned int theTag, lengthLen, valueLen, preSpaceLen, flag;
#if VT_64_BIT_LENGTH == 64
  VtUInt64 envelopeLen, inBlocks, outLen;
#else
  unsigned int envelopeLen, inBlocks, outLen;
#endif
  UInt32 lenLo, lenHi;
  VoltSecureMailObject *obj = (VoltSecureMailObject *)secureMailObj;
  VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  VoltSecureMailReadCtx *readCtx = (VoltSecureMailReadCtx *)(obj->localCtx);
  unsigned char *currentMessage;
  unsigned char *beginMsg = VOLT_SECURE_MAIL_BEGIN_MESSAGE;
  unsigned char *beginBlk = VOLT_SECURE_MAIL_BEGIN_BLOCK;
  unsigned char *endBlk = VOLT_SECURE_MAIL_END_BLOCK;
  unsigned char *endMsg = VOLT_SECURE_MAIL_END_MESSAGE;
  unsigned char *zdmMessageType = VOLT_ZDM_MESSAGE_TYPE;
  unsigned char *zdmMessageStart = VOLT_ZDM_MESSAGE_START;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  *bytesRead = 0;
  *outputDataLen = 0;
  currentMessage = message;
  currentMessageLen = messageLen;

  switch (obj->state)
  {
    default:
      VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_INVALID_CALL_ORDER;
      break;

VoltSecureMailStateReadComplete:
    case VOLT_SECURE_MAIL_STATE_READ_ENV_FINAL:
    case VOLT_SECURE_MAIL_STATE_READ_SIGN_FINAL:
    case VOLT_SECURE_MAIL_STATE_READ_P7_FINAL:
    case VOLT_SECURE_MAIL_STATE_READ_COMPLETE:
      /* If we're done, don't read anything. Actually, if this is ZDM,
       * ignore any new data. Otherwise, the caller passed in too much
       * data.
       */
      status = 0;
      if (currentMessageLen == 0)
        break;

      if ((obj->formatType & VOLT_MESSAGE_FORMAT_ZDM) != 0)
      {
        *bytesRead += currentMessageLen;
        break;
      }

      VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_INVALID_SECURE_MAIL_MSG;
      if (obj->formatType == VOLT_MESSAGE_FORMAT_SECURE_MAIL)
        break;

      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_INVALID_SECURE_FILE_MSG;
      break;

    case VOLT_ZDM_STATE_READ_INIT:
      /* With ZDM, the first thing to do will be to read the
       * preliminary HTML info ... and ignore it.
       */
      obj->formatType = VOLT_MESSAGE_FORMAT_ZDM_MAIL;
      obj->state = VOLT_ZDM_STATE_READ_HEADER;

VoltZdmStateReadHeader:
    case VOLT_ZDM_STATE_READ_HEADER:
      /* Keep reading blocks of data until finding something we
       * recognize.
       */
      VOLT_SET_ERROR_TYPE (errorType, 0)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VoltSMGetNextBlock (
        obj, &(readCtx->unprocessedData), currentMessage, currentMessageLen,
        9, &amountRead, &completeFlag, &newLineLen);
      if (status != 0)
        break;

      *bytesRead += amountRead;
      if (completeFlag == 0)
        break;

      currentMessage = message + *bytesRead;
      currentMessageLen = messageLen - *bytesRead;

      /* We have the next block in the unprocessedData buffer, is this
       * the block that says this is a ZDM attachment?
       * If not, is it the start of the data?
       */
      if (readCtx->unprocessedData.len >= VOLT_ZDM_MESSAGE_TYPE_LEN)
      {
        if (Z2Memcmp (
          readCtx->unprocessedData.data, zdmMessageType,
          VOLT_ZDM_MESSAGE_TYPE_LEN) == 0)
          obj->formatType = VOLT_MESSAGE_FORMAT_ZDM_ATTACHMENT;
      }

      if (readCtx->unprocessedData.len >= VOLT_ZDM_MESSAGE_START_LEN)
      {
        if (Z2Memcmp (
          readCtx->unprocessedData.data, zdmMessageStart,
          VOLT_ZDM_MESSAGE_START_LEN) == 0)
        {
          /* We've found the start, what's after the start line, a new
           * line character or data. If new line, the beginning of the
           * actual data is on a new line. If data, there was no
           * carriage return inserted.
           */
          if ( (readCtx->unprocessedData.data[VOLT_ZDM_MESSAGE_START_LEN] == 0x0d) ||
               (readCtx->unprocessedData.data[VOLT_ZDM_MESSAGE_START_LEN] == 0x0a) )
          {
            readCtx->unprocessedData.len = 0;
          }
          else
          {
            /* If data, move the data to the beginning, we'll need to
             * read it.
             */
            Z2Memmove (
              readCtx->unprocessedData.data,
              readCtx->unprocessedData.data + VOLT_ZDM_MESSAGE_START_LEN,
              readCtx->unprocessedData.len - VOLT_ZDM_MESSAGE_START_LEN);
            readCtx->unprocessedData.len -= VOLT_ZDM_MESSAGE_START_LEN;
          }

          /* Now do we move on to reading SecureMail headers or actual
           * data.
           */
          if (obj->formatType == VOLT_MESSAGE_FORMAT_ZDM_MAIL)
          {
            /* This is MAIL, read SecureMail headers. Do we have the
             * first one in the buffer already?
             */
            obj->state = VOLT_SECURE_MAIL_STATE_READ_HEADER_1;
            if (readCtx->unprocessedData.len == 0)
              goto VoltSecureMailReadHeader1;
            goto VoltSecureMailReadHeader1A;
          }

          /* This is a ZDM attachment, there are no headers.
           * Do we have the first line of B64 in the buffer already?
           */
          if (readCtx->unprocessedData.len == 0)
            goto VoltSecureMailBase64;
          obj->state = VOLT_SECURE_MAIL_STATE_READ_B64_LEN;
          goto VoltSecureMailBase64A;
        }
      }

      /* The line is not something expected, keep reading.
       */
      readCtx->unprocessedData.len = 0;
      goto VoltZdmStateReadHeader;

    case VOLT_SECURE_MAIL_STATE_READ_INIT:
      /* The first thing to do will be to read the first header.
       */
      obj->state = VOLT_SECURE_MAIL_STATE_READ_HEADER_1;

VoltSecureMailReadHeader1:
    case VOLT_SECURE_MAIL_STATE_READ_HEADER_1:
      /* We're just starting to read the message. The first thing up
       * should be
       *   -----BEGIN VOLTAGE MESSAGE BLOCK V1-----
       */
      VOLT_SET_ERROR_TYPE (errorType, 0)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VoltSMGetNextBlock (
        obj, &(readCtx->unprocessedData), currentMessage, currentMessageLen,
        0, &amountRead, &completeFlag, &newLineLen);
      if (status != 0)
        break;

      *bytesRead += amountRead;
      if (completeFlag == 0)
        break;

      currentMessage = message + *bytesRead;
      currentMessageLen = messageLen - *bytesRead;

      /* We have the next block in the unprocessedData buffer, is this
       * the block we expect?
       * Remember, the VoltSMGetNextBlock function added a
       * NULL-terminating character.
       */
VoltSecureMailReadHeader1A:
      VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_INVALID_SECURE_MAIL_MSG;
      if (readCtx->unprocessedData.len !=
        VOLT_SECURE_MAIL_BEGIN_MESSAGE_LEN + newLineLen)
        break;
      if (Z2Memcmp (
        readCtx->unprocessedData.data, beginMsg,
        VOLT_SECURE_MAIL_BEGIN_MESSAGE_LEN) != 0)
        break;

      /* Set up the context for the next block.
       */
      status = 0;
      readCtx->unprocessedData.len = 0;
      obj->state = VOLT_SECURE_MAIL_STATE_READ_HEADER_2;
      obj->version = 1;
      
      /* If there's no more message to read, return.
       */
      if (currentMessageLen == 0)
        break;

VoltSecureMailReadHeader2:
    case VOLT_SECURE_MAIL_STATE_READ_HEADER_2:
      /* At this point we should read an "extra" header or
       *   -----BEGIN VOLTAGE SECURE BLOCK V1-----
       */  
      VOLT_SET_ERROR_TYPE (errorType, 0)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VoltSMGetNextBlock (
        obj, &(readCtx->unprocessedData), currentMessage, currentMessageLen,
        9, &amountRead, &completeFlag, &newLineLen);
      if (status != 0)
        break;

      *bytesRead += amountRead;
      if (completeFlag == 0)
        break;

      currentMessage = message + *bytesRead;
      currentMessageLen = messageLen - *bytesRead;

      /* We have the next block in the unprocessedData buffer, is this
       * an "extra" block or the second header?
       * Note from the programmer: Notice the goto statement.
       * Normally I don't like them, but in this case it really works.
       */      
      if (readCtx->unprocessedData.len ==
        VOLT_SECURE_MAIL_BEGIN_BLOCK_LEN + newLineLen)
      {
        /* If this is the third header (no second header), skip to the
         * next part of the read.
         */
        if (Z2Memcmp (
          readCtx->unprocessedData.data, beginBlk,
          VOLT_SECURE_MAIL_BEGIN_BLOCK_LEN) == 0) 
        {
          /* Set up for reading the next part.
           */                     
          status = 0;
          readCtx->unprocessedData.len = 0;
          goto VoltSecureMailBase64 ;
        }
      }

      /* This is an "extra" header, just Copy it to the extraHeader
       * field in the context. Copy the NULL-terminating character as
       * well.
       */
      VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_MEMORY;
      readCtx->extraHeader.data = (unsigned char *)Z2Realloc (
        readCtx->extraHeader.data, readCtx->unprocessedData.len + readCtx->extraHeader.len);
      if (readCtx->extraHeader.data == (unsigned char *)0)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产农村妇女毛片精品久久麻豆| 一本在线高清不卡dvd| 日韩欧美一级在线播放| 五月天中文字幕一区二区| 欧美区一区二区三区| 开心九九激情九九欧美日韩精美视频电影| 欧美福利视频一区| 狠狠色狠狠色综合系列| 中文字幕精品一区| 欧美亚洲国产一区二区三区va | 国产不卡一区视频| ㊣最新国产の精品bt伙计久久| 一本一本久久a久久精品综合麻豆| 亚洲激情自拍偷拍| 日韩一区二区三区三四区视频在线观看| 青娱乐精品视频在线| 精品国产91洋老外米糕| 成人黄色小视频在线观看| 日韩理论电影院| 日韩一区二区在线观看| 国产91精品露脸国语对白| 亚洲激情网站免费观看| 欧美一二区视频| 99久久精品费精品国产一区二区| 亚洲妇熟xx妇色黄| 国产亚洲精品资源在线26u| 色哟哟国产精品| 久久精品国内一区二区三区| 国产精品美日韩| 91麻豆精品国产| 不卡视频免费播放| 青椒成人免费视频| 亚洲青青青在线视频| 日韩视频一区二区在线观看| 成人晚上爱看视频| 手机精品视频在线观看| 国产精品区一区二区三区| 欧美日韩二区三区| 99久久国产综合精品女不卡| 另类综合日韩欧美亚洲| 亚洲免费色视频| 久久蜜臀中文字幕| 8v天堂国产在线一区二区| av中文字幕一区| 国产一区二区久久| 男女男精品视频网| 夜夜揉揉日日人人青青一国产精品| 久久综合九色综合97婷婷| 欧美日韩专区在线| 91在线观看高清| 国产精品一区二区三区网站| 视频一区欧美日韩| 亚洲成a人片在线观看中文| 国产精品理伦片| 久久老女人爱爱| 26uuu欧美日本| 日韩一二三区视频| 欧美日韩高清一区二区三区| 91福利精品视频| av日韩在线网站| 成人综合婷婷国产精品久久免费| 麻豆精品一区二区三区| 亚洲18影院在线观看| 亚洲精品免费一二三区| 成人欧美一区二区三区黑人麻豆 | 26uuu另类欧美亚洲曰本| 在线播放中文一区| 欧美日韩国产另类不卡| 欧美日韩精品一区二区在线播放| 91久久线看在观草草青青| 成人丝袜高跟foot| 97精品久久久久中文字幕| 成人av电影在线| 成人亚洲一区二区一| 国产高清在线精品| 高清在线成人网| 成人开心网精品视频| 波多野结衣的一区二区三区| 成人av在线资源| www.久久精品| 欧美在线观看一二区| 欧美日韩一级大片网址| 678五月天丁香亚洲综合网| 8v天堂国产在线一区二区| 日韩久久久久久| 久久婷婷色综合| 国产精品的网站| 亚洲一区二区影院| 日韩专区中文字幕一区二区| 日本欧美一区二区三区乱码| 日本少妇一区二区| 国产麻豆精品视频| aaa亚洲精品| 欧美亚洲综合色| 日韩欧美久久一区| 国产日韩欧美精品一区| 亚洲猫色日本管| 天堂va蜜桃一区二区三区漫画版| 日av在线不卡| 成人涩涩免费视频| 欧美日韩免费一区二区三区| 51精品视频一区二区三区| 久久欧美中文字幕| 亚洲精品福利视频网站| 蜜桃视频一区二区三区| 国产91丝袜在线观看| eeuss鲁片一区二区三区在线观看| 色www精品视频在线观看| 69堂国产成人免费视频| 欧美激情一区二区三区蜜桃视频 | 国产精品初高中害羞小美女文| 一区二区三区国产精华| 视频一区在线视频| www.av精品| 日韩一级二级三级精品视频| 国产精品护士白丝一区av| 亚洲成人动漫一区| 风间由美中文字幕在线看视频国产欧美 | 天堂精品中文字幕在线| 国产福利91精品一区二区三区| 色婷婷久久久综合中文字幕| 日韩精品一区国产麻豆| 亚洲欧美激情一区二区| 久久99久久久久| 色综合久久88色综合天天6| 精品国产乱码久久久久久老虎 | **性色生活片久久毛片| 日韩电影在线免费看| 成人av一区二区三区| 欧美电视剧在线看免费| 亚洲欧美日韩在线播放| 国产一区二区在线免费观看| 在线观看日韩电影| 国产精品三级视频| 免费成人美女在线观看| 91久久久免费一区二区| 国产精品你懂的在线欣赏| 免费在线一区观看| 6080午夜不卡| 亚洲国产中文字幕| 99麻豆久久久国产精品免费| 久久看人人爽人人| 久久99精品国产91久久来源| 欧美性猛交xxxx黑人交| 中文字幕一区二区三区四区| 国产毛片精品国产一区二区三区| 欧美一区二区三区影视| 亚洲综合一区二区三区| 成人自拍视频在线| 国产欧美日韩不卡免费| 精品亚洲国内自在自线福利| 欧美一级欧美三级| 午夜精品福利一区二区蜜股av | 天天色综合成人网| 欧美伊人久久久久久午夜久久久久| 一色屋精品亚洲香蕉网站| 国产精品2024| 国产亚洲一区二区三区四区| 精品一区二区三区的国产在线播放| 欧美揉bbbbb揉bbbbb| 亚洲一区二区三区小说| 在线视频国内自拍亚洲视频| 亚洲欧洲av另类| 91一区二区三区在线观看| 国产精品精品国产色婷婷| 成人激情视频网站| 欧美国产禁国产网站cc| 成人性生交大合| 国产精品麻豆网站| 91亚洲午夜精品久久久久久| 亚洲美腿欧美偷拍| 欧美在线一二三四区| 视频在线观看一区二区三区| 91精品国产乱码| 激情综合色丁香一区二区| 精品久久久网站| 激情国产一区二区| 国产色产综合产在线视频| 成人美女视频在线看| 亚洲精品欧美专区| 欧美日本一区二区| 国产制服丝袜一区| 中文无字幕一区二区三区| 99riav一区二区三区| 亚洲老妇xxxxxx| 欧美伦理影视网| 久久不见久久见免费视频7| 久久久99久久| av激情成人网| 日本人妖一区二区| 国产日韩一级二级三级| 色猫猫国产区一区二在线视频| 亚洲国产精品自拍| 欧美电影免费观看高清完整版在线观看| 久久99国产精品久久99| 国产精品进线69影院| 欧美精品欧美精品系列| 国产成人精品一区二区三区四区 | 久久不见久久见中文字幕免费| 国产亚洲精品资源在线26u|