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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? p1oaepad.c

?? IBE是一種非對稱密碼技術(shù)
?? C
字號:
/* Copyright 2005-2006, Voltage Security, all rights reserved.
 */
#include "vibecrypto.h"
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "algobj.h"
#include "cipher.h"
#include "p1pad.h"
#include "errorctx.h"

/* Generate mask bytes based on the seed and XOR the dataToMask.
 */
static int VOLT_CALLING_CONV VoltMgf1 VOLT_PROTO_LIST ((
   VoltLibCtx *libCtx,
   VtAlgorithmObject digester,
   unsigned int digestLen,
   unsigned char *seed,
   unsigned int seedLen,
   unsigned char *dataToMask,
   unsigned int dataToMaskLen
));

int VtPaddingPkcs1OAEP (
   VtAlgorithmObject object,
   VtPaddingInfo *info,
   unsigned int flag
   )
{
  int status;
  unsigned int digestLen;
  VoltAlgorithmObject *obj = (VoltAlgorithmObject *)object;
  VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  VoltCipherClassCtx *cipherCtx;
  VoltPaddingInfo *padInfo = (VoltPaddingInfo *)info;
  VtOAEPInfo *oaepInfo;
  VoltP1OaepCtx *ctx;
  unsigned char *buffer = (unsigned char *)0;
  VtAlgorithmObject digester = (VtAlgorithmObject)0;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* Check the flag, it should be VOLT_PADDING_SET_TYPE_FLAG.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_TYPE;
    if (flag != VOLT_PADDING_SET_TYPE_FLAG)
      break;

    /* The associated info should be a pointer to a VtOAEPInfo struct.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_ASSOCIATED_INFO;
    if (padInfo->info == (Pointer)0)
      break;

    oaepInfo = (VtOAEPInfo *)(padInfo->info);

    VOLT_SET_FNCT_LINE (fnctLine)
    if (oaepInfo->digestImpl == (VtAlgorithmImpl *)0)
      break;

    /* Check the class of the object. It should be
     * VOLT_CLASS_ASYMMETRIC_CIPHER.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_SET;
    if (obj->algClass != VOLT_CLASS_ASYMMETRIC_CIPHER)
      break;

    /* We have an asymmetric cipher object, which means we have a
     * CipherCtx.
     */
    cipherCtx = (VoltCipherClassCtx *)(obj->classCtx);

    /* This only works with RSA.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    if (cipherCtx->setState != VOLT_CIPHER_SET_STATE_RSA)
      break;

    /* Build the digest object we will use to do the OAEP work. Do this
     * first so we can digest the label. We want to get the digestLen
     * before we allocate memory for the ctx.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtCreateAlgorithmObject (
      (VtLibCtx)libCtx, oaepInfo->digestImpl, oaepInfo->digestInfo,
      &digester);
    if (status != 0)
      break;

    /* Make sure the object created is indeed a digest.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_ASSOCIATED_INFO;
    if (((VoltAlgorithmObject *)digester)->algClass != VOLT_CLASS_DIGEST)
      break;

    /* Digest the label. Actually, just get the output length first.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtDigestInit (digester);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtDigestFinal (
      digester, (unsigned char *)0, 0, (unsigned char *)0, 0, &digestLen);
    if (status == 0)
      status = VT_ERROR_GENERAL;
    if (status != VT_ERROR_BUFFER_TOO_SMALL)
      break;

    /* Build the OAEP ctx.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_MEMORY;
    buffer = (unsigned char *)Z2Malloc (
      sizeof (VoltP1OaepCtx) + digestLen, VOLT_MEMORY_SENSITIVE);
    if (buffer == (unsigned char *)0)
      break;
    Z2Memset (buffer, 0, sizeof (VoltP1OaepCtx) + digestLen);

    ctx = (VoltP1OaepCtx *)buffer;
    ctx->digestOfLabel = buffer + sizeof (VoltP1OaepCtx);
    ctx->digestLen = digestLen;

    /* Digest the label now.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtDigestFinal (
      digester, oaepInfo->label.data, oaepInfo->label.len,
      ctx->digestOfLabel, digestLen, &digestLen);
    if (status != 0)
      break;

    ctx->digester = digester;

    cipherCtx->Pad = P1OAEPad;
    cipherCtx->Unpad = P1OAEPUnpad;
    cipherCtx->padCtx = (Pointer)ctx;
    cipherCtx->PadCtxDestroy = P1OAEPCtxDestroy;

    obj->subAlg2 |= VOLT_SUB_ALG_P1_OAEP_PAD;

    status = 0;

  } while (0);

  if (status == 0)
    return (0);

  /* If there was an error, destrow anything we created and would have
   * returned, but didn't.
   */
  VtDestroyAlgorithmObject (&digester);

  if (buffer != (unsigned char *)0)
    Z2Free (buffer);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, obj, status, 0, errorType,
    (char *)0, "VtPaddingPkcs1OAEP", fnctLine, (char *)0)

  return (status);
}

int P1OAEPad (
   VoltAlgorithmObject *obj,
   VtRandomObject random,
   Pointer context,
   unsigned char *block,
   unsigned int inputLen,
   unsigned int blockSize
   )
{
  int status;
  unsigned int zeroLen;
  VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  VoltP1OaepCtx *ctx = (VoltP1OaepCtx *)context;
  VtRandomObject randomToUse;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* If there's no random object, get one from the libCtx.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_NO_RANDOM_OBJECT;
    randomToUse = random;
    if (random == (VtRandomObject)0)
    {
      randomToUse = (VtRandomObject)VoltGetLibCtxInfo (
        (VtLibCtx)libCtx, VOLT_LIB_CTX_INFO_TYPE_RANDOM);

      if (randomToUse == (VtRandomObject)0)
        break;
    }

    /* Make sure the random object is valid.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_RANDOM_OBJ;
    if (VOLT_OBJECT_TYPE_NOT_EQUAL (randomToUse, VOLT_OBJECT_TYPE_RANDOM))
      break;

    /* Start by creating a block that looks like this.
     *    00
     *    <digestLen random bytes: known as seed>
     *    <digest of label>
     *    00 ... 00
     *    01
     *    <data to encrypt>
     * It is possible to have no 00 bytes (after digest of label and
     * before the 01).
     * That means the length of the data to encrypt must be less than
     *    blockSize - 2*digestLen - 2
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_INPUT_LENGTH;
    zeroLen = inputLen + (2 * ctx->digestLen) + 2;
    if (zeroLen > blockSize)
      break;

    zeroLen = blockSize - zeroLen;

    /* Move the data to the end.
     */
    Z2Memmove (block + (blockSize - inputLen), block, inputLen);

    /* The first byte is 00.
     */
    block[0] = 0;

    /* The next digestLen bytes are random. This is the seed.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtGenerateRandomBytes (randomToUse, block + 1, ctx->digestLen);
    if (status != 0)
      break;

    /* The next digestLen bytes are the digest of the label.
     */
    Z2Memcpy (block + ctx->digestLen + 1, ctx->digestOfLabel, ctx->digestLen);

    /* The next zeroLen bytes are 00.
     */
    Z2Memset (block + (2 * ctx->digestLen) + 1, 0, zeroLen);

    /* Finally, there's a 01 byte. Use zeroLen as a temp variable.
     */
    zeroLen += (2 * ctx->digestLen) + 1;
    block[zeroLen] = 1;

    /* Call on the mask generating function to generate a mask for
     * everything after the seed, using the seed as the MGF seed.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VoltMgf1 (
      libCtx, ctx->digester, ctx->digestLen, block + 1, ctx->digestLen,
      block + ctx->digestLen + 1, blockSize - (ctx->digestLen + 1));
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VoltMgf1 (
      libCtx, ctx->digester, ctx->digestLen,
      block + ctx->digestLen + 1, blockSize - (ctx->digestLen + 1),
      block + 1, ctx->digestLen);

  } while (0);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, obj, status, 0, errorType,
    (char *)0, "P1OAEPad", fnctLine, (char *)0)

  return (status);
}

int P1OAEPUnpad (
   VoltAlgorithmObject *obj,
   Pointer context,
   unsigned char *block,
   unsigned int blockSize,
   unsigned int *outputLen
   )
{
  int status;
  unsigned int index;
  VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  VoltP1OaepCtx *ctx = (VoltP1OaepCtx *)context;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* Use the data after the seed as the seed for MGF1 to unmask the
     * seed (whoever came up with the terminology for OAEP and MGF,
     * didn't do a very good job).
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VoltMgf1 (
      libCtx, ctx->digester, ctx->digestLen,
      block + ctx->digestLen + 1, blockSize - (ctx->digestLen + 1),
      block + 1, ctx->digestLen);
    if (status != 0)
      break;

    /* Use the seed as the seed for MGF1 to unmask the data after the
     * seed.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VoltMgf1 (
      libCtx, ctx->digester, ctx->digestLen, block + 1, ctx->digestLen,
      block + ctx->digestLen + 1, blockSize - (ctx->digestLen + 1));
    if (status != 0)
      break;

    /* To help avoid timing attacks, perform all checks.
     */
    VOLT_SET_FNCT_LINE (fnctLine)

    /* Make sure the first byte is 00.
     */
    if (block[0] != 0)
      status = VT_ERROR_INVALID_PAD;

    /* Skip the next digestLen bytes. Then the next digestLen bytes
     * should be the digest of the label.
     */
    if (Z2Memcmp (
      block + ctx->digestLen + 1, ctx->digestOfLabel, ctx->digestLen) != 0)
      status = VT_ERROR_INVALID_PAD;

    /* The next bytes should be 00, until we hit 01.
     */
    index = (2 * ctx->digestLen) + 1;
    for (; index < blockSize; ++index)
      if (block[index] != 0)
        break;

    /* If the 00s never ended, error. Otherwise, continue checking.
     */
    if (index >= blockSize)
    {
      status = VT_ERROR_INVALID_PAD;
    }
    else
    {
      if (block[index] != 1)
        status = VT_ERROR_INVALID_PAD;

      /* Move the message block to the front.
       */
      index++;
      Z2Memmove (block, block + index, blockSize - index);
      *outputLen = blockSize - index;
    }

  } while (0);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, obj, status, 0, errorType,
    (char *)0, "P1OAEPUnpad", fnctLine, (char *)0)

  return (status);
}

void P1OAEPCtxDestroy (
   Pointer object,
   Pointer context
   )
{
  VoltAlgorithmObject *obj;
  VoltLibCtx *libCtx;
  VoltCipherClassCtx *cipherCtx;
  VoltP1OaepCtx *ctx;

  /* Anything to destroy?
   */
  if ( (object == (Pointer)0) || (context == (Pointer)0) )
    return;

  obj = (VoltAlgorithmObject *)object;
  libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  cipherCtx = (VoltCipherClassCtx *)(obj->classCtx);
  ctx = (VoltP1OaepCtx *)(cipherCtx->padCtx);

  VtDestroyAlgorithmObject (&(ctx->digester));

  Z2Free (ctx);
}

static int VoltMgf1 (
   VoltLibCtx *libCtx,
   VtAlgorithmObject digester,
   unsigned int digestLen,
   unsigned char *seed,
   unsigned int seedLen,
   unsigned char *dataToMask,
   unsigned int dataToMaskLen
   )
{
  int status;
  unsigned int index, currentLen, outputLen;
  unsigned char *buffer = (unsigned char *)0;
  unsigned char counter[4] = { 0, 0, 0, 0 };
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  /* Allocate a buffer to hold the results of digesting. If the Malloc
   * works, go ahead and do the mask operation.
   */
  VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
  VOLT_SET_FNCT_LINE (fnctLine)
  status = VT_ERROR_MEMORY;
  buffer = (unsigned char *)Z2Malloc (digestLen, VOLT_MEMORY_SENSITIVE);
  if (buffer != (unsigned char *)0)
  {
    VOLT_SET_ERROR_TYPE (errorType, 0)

    do
    {
      /* How many bytes do we still need? If we can't get them all, get
       * digestLen more mask bytes.
       */
      currentLen = dataToMaskLen;
      if (dataToMaskLen >= digestLen)
        currentLen = digestLen;

      dataToMaskLen -= currentLen;

      /* Find digest (seed || counter).
       */
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VtDigestInit (digester);
      if (status != 0)
        break;

      VOLT_SET_FNCT_LINE (fnctLine)
      status = VtDigestUpdate (digester, seed, seedLen);
      if (status != 0)
        break;

      status = VtDigestFinal (
        digester, counter, 4, buffer, digestLen, &outputLen);
      if (status != 0)
        break;

      /* Use this result to mask the next currentLen bytes of the
       * dataToMask.
       */
      for (index = 0; index < currentLen; ++index)
      {
        *dataToMask ^= buffer[index];
        dataToMask++;
      }

      if (dataToMaskLen == 0)
        break;

      /* Increment the counter. A true implementation would worry about
       * carry from one byte to another (add 1 to 0xff and get 0, add
       * the carry bit to the next byte). However, that will only
       * happen if a block to be masked is > 5100 bytes (assuming a
       * minimum 20-byte digest). That would mean we were dealing with
       * a 40,000 bit key (instead of the 1024, 2048 and possibly 4096
       * bit keys in use today).
       * So this implementation does not look at the carry. If we ever
       * have to mask more than 5100 bytes with a 20-byte digest (or an
       * 8160 bytes with a 32-byte digest, etc.), we'll have to change
       * this code.
       */
      counter[3]++;

    } while (1);
  }

  if (buffer != (unsigned char *)0)
    Z2Free (buffer);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, libCtx, 0, status, 0, errorType,
    (char *)0, "VoltMgf1", fnctLine, (char *)0)

  return (status);
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品一区二区三区四区| 五月婷婷另类国产| 在线观看av一区二区| 经典三级一区二区| 一区二区三区高清不卡| 国产丝袜在线精品| 日韩一级黄色片| 色婷婷综合视频在线观看| 国产精品一区二区久激情瑜伽| 亚洲制服丝袜一区| 中文字幕欧美一| 久久这里只精品最新地址| 欧美日本一区二区| 色婷婷激情久久| 成人性生交大片免费看中文| 激情欧美一区二区| 青青草97国产精品免费观看无弹窗版| 亚洲免费观看高清完整版在线 | 欧美高清一级片在线| 99re视频精品| 风间由美中文字幕在线看视频国产欧美 | 久久丝袜美腿综合| 日韩视频一区二区三区| 欧美精品vⅰdeose4hd| 色中色一区二区| 91在线精品秘密一区二区| 从欧美一区二区三区| 国精产品一区一区三区mba视频| 青草av.久久免费一区| 亚洲电影第三页| 亚洲va天堂va国产va久| 亚洲香肠在线观看| 亚洲福中文字幕伊人影院| 亚洲欧美激情在线| 亚洲色图视频网| 亚洲精品ww久久久久久p站| 亚洲欧洲日韩一区二区三区| 国产精品区一区二区三| 国产精品久久久99| 最好看的中文字幕久久| 亚洲欧美激情插| 亚洲一区二区综合| 99久久精品免费精品国产| 成人综合在线视频| 99久久精品免费观看| 在线免费观看日本一区| 欧美日韩国产高清一区二区三区| 欧美日韩一二区| 日韩欧美国产高清| 久久色在线观看| 亚洲欧洲精品一区二区精品久久久| 亚洲欧美一区二区久久| 亚洲一区二区五区| 丝袜美腿亚洲色图| 国产综合久久久久影院| 国产成人av电影在线| 91麻豆国产自产在线观看| 精品视频免费看| 91麻豆精品国产| 久久精品一区二区三区四区| 国产精品二三区| 亚洲成人动漫在线免费观看| 青青草国产精品亚洲专区无| 国产成人超碰人人澡人人澡| 91猫先生在线| 91精品国产综合久久久蜜臀粉嫩 | 一区二区三区精密机械公司| 视频一区二区国产| 国产一区二区三区久久久| 成人av在线一区二区| 欧美少妇性性性| 精品国产乱码久久久久久图片 | 日韩和的一区二区| 国产成人激情av| 欧美日韩国产天堂| 久久毛片高清国产| 一区二区高清在线| 韩国一区二区在线观看| 91视频.com| 日韩久久久精品| 亚洲美女免费视频| 激情综合色综合久久综合| fc2成人免费人成在线观看播放| 欧美日韩成人综合天天影院| 国产清纯在线一区二区www| 一二三区精品福利视频| 国产剧情av麻豆香蕉精品| 日本韩国一区二区三区视频| 久久综合久久综合九色| 亚洲二区视频在线| 国产成人免费av在线| 5566中文字幕一区二区电影| 国产精品久久久久久久久动漫| 免费在线观看一区| 91国内精品野花午夜精品| 中文字幕乱码久久午夜不卡| 三级久久三级久久| 色综合天天在线| 日本一区二区免费在线 | 岛国av在线一区| 91精品综合久久久久久| 日韩码欧中文字| 国产91在线观看丝袜| 欧美成人vr18sexvr| 亚洲自拍偷拍欧美| 国产ts人妖一区二区| 日韩欧美国产午夜精品| 亚洲一区二区三区四区不卡| 91丝袜美腿高跟国产极品老师| 久久亚洲欧美国产精品乐播 | 成人国产亚洲欧美成人综合网| 91精品国产日韩91久久久久久| 亚洲日本在线看| 成人avav在线| 国产精品免费丝袜| 国产成人精品午夜视频免费| 久久久另类综合| 国产精品一区久久久久| 精品99999| 久久99精品视频| 日韩欧美一卡二卡| 日本欧美在线看| 8x福利精品第一导航| 婷婷成人激情在线网| 欧美图片一区二区三区| 樱花草国产18久久久久| 一本大道久久a久久精二百| 综合久久给合久久狠狠狠97色| 成人免费视频一区二区| 国产欧美一区二区精品婷婷| 风间由美性色一区二区三区| 久久精品亚洲精品国产欧美kt∨| 国产一区二区不卡老阿姨| 26uuu另类欧美亚洲曰本| 国产一区二区三区观看| 久久久久久综合| 国产精品主播直播| 中文字幕欧美激情| 91小宝寻花一区二区三区| 亚洲欧美日韩在线不卡| 色呦呦一区二区三区| 一区二区三区资源| 欧美日韩一区二区三区视频| 三级欧美韩日大片在线看| 日韩欧美一区二区视频| 狠狠色丁香婷婷综合久久片| 国产亚洲成av人在线观看导航| 国产成人免费网站| 亚洲免费三区一区二区| 欧美性色综合网| 日韩在线a电影| 精品福利在线导航| 成人免费高清视频在线观看| 综合欧美一区二区三区| 欧美午夜不卡在线观看免费| 免费观看一级欧美片| 久久精品亚洲麻豆av一区二区| 91亚洲精品久久久蜜桃网站| 午夜欧美一区二区三区在线播放 | 一区二区三区四区激情| 欧美精品第1页| 国产成人在线看| 亚洲丝袜美腿综合| 欧美午夜一区二区三区免费大片| 日本色综合中文字幕| 欧美激情一区二区在线| 欧美性受xxxx黑人xyx性爽| 久久99久久久欧美国产| 国产精品卡一卡二卡三| 欧美日韩不卡视频| 国产成人精品亚洲777人妖 | 精品一区二区免费在线观看| 国产精品天干天干在线综合| 欧美亚洲综合在线| 国产成人av影院| 午夜久久久影院| 国产欧美va欧美不卡在线| 欧美日韩一区二区三区四区五区| 激情综合五月天| 亚洲一区二区三区国产| 久久久九九九九| 51精品视频一区二区三区| 成人免费视频一区| 青青草国产精品97视觉盛宴| 日韩美女视频一区二区| 精品国产精品网麻豆系列| 日本韩国欧美一区| 国产一区二区三区黄视频 | 国产麻豆精品theporn| 亚洲午夜激情av| 欧美激情自拍偷拍| 69久久夜色精品国产69蝌蚪网 | 久久一区二区三区四区| 欧美亚洲国产一区二区三区| 高清不卡一区二区在线| 美女视频一区二区| 亚洲一区二区成人在线观看| 国产精品电影院| 2014亚洲片线观看视频免费| 在线不卡免费av|