⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asn1types.c

📁 IBE是一种非对称密码技术
💻 C
📖 第 1 页 / 共 3 页
字号:
  return (1);
}


int Asn1EcPointNew (
   ASN1_VALUE **obj,
   const ASN1_ITEM *asn1Item
   )
{
  Asn1EcPoint *retVal = (Asn1EcPoint *)0;

  if (obj == (ASN1_VALUE **)0)
    return (0);
  *obj = (ASN1_VALUE *)0;

  /* Build an empty Asn1EcPoint struct.
   */
  retVal = (Asn1EcPoint *)OPENSSL_malloc (sizeof (Asn1EcPoint));
  if (retVal == (Asn1EcPoint *)0)
    return (0);

  retVal->base.length = 0;
  retVal->base.type = 0;
  retVal->base.data = (unsigned char *)0;
  retVal->base.flags = 0;
  retVal->vFlags = 0;
  retVal->primeLen = 0;
  retVal->xCoord.data = (unsigned char *)0;
  retVal->xCoord.len = 0;
  retVal->yCoord.data = (unsigned char *)0;
  retVal->yCoord.len = 0;
  *obj = (ASN1_VALUE *)retVal;

  return (1);
}


void Asn1EcPointFree (
   ASN1_VALUE **obj,
   const ASN1_ITEM *asn1Item
   )
{
  /* Anything to free?
   */
  if (obj == (ASN1_VALUE **)0)
    return;
  if (*obj == (ASN1_VALUE *)0)
    return;

  Asn1EcPointClear (obj, asn1Item);

  OPENSSL_free (*obj);
  *obj = (ASN1_VALUE *)0;
}


void Asn1EcPointClear (
   ASN1_VALUE **obj,
   const ASN1_ITEM *asn1Item
   )
{
  Asn1EcPoint *value;

  /* Anything to free?
   */
  if (obj == (ASN1_VALUE **)0)
    return;
  if (*obj == (ASN1_VALUE *)0)
    return;

  value = (Asn1EcPoint *)(*obj);

  /* If copy by value, overwrite and free.
   */
  if ((value->vFlags & VOLT_ASN1_COPY_MASK) == VOLT_ASN1_COPY_DATA)
  {
    if (value->base.data != (unsigned char *)0)
    {
      Asn1Memset (value->base.data, 0, (unsigned int)(value->base.length));
      OPENSSL_free (value->base.data);
    }
    if (value->xCoord.data != (unsigned char *)0)
    {
      Asn1Memset (value->xCoord.data, 0, value->xCoord.len);
      OPENSSL_free (value->xCoord.data);
    }
    if (value->yCoord.data != (unsigned char *)0)
    {
      Asn1Memset (value->yCoord.data, 0, value->yCoord.len);
      OPENSSL_free (value->yCoord.data);
    }
  }

  value->base.data = (unsigned char *)0;
  value->base.length = 0;
  value->xCoord.data = (unsigned char *)0;
  value->xCoord.len = 0;
  value->yCoord.data = (unsigned char *)0;
  value->yCoord.len = 0;
  value->primeLen = 0;
}


int Asn1EcPointDecode (
   ASN1_VALUE **obj,
   const unsigned char **input,
   long length,
   const ASN1_ITEM *asn1Item,
   int tag,
   int aclass,
   char opt,
   ASN1_TLC *ctx
   )
{
  int status, asn1Ret;
  unsigned int lengthLen, valueLen, totalLen, primeLen, theTag;
  UInt32 lenLo, lenHi;
  Asn1EcPoint *value = (Asn1EcPoint *)0;
  unsigned char *encoding = (unsigned char *)(*input);

  if (obj == (ASN1_VALUE **)0)
    return (0);
  if (*obj != (ASN1_VALUE *)0)
    value = (Asn1EcPoint *)(*obj);

  Asn1EcPointClear (obj, asn1Item);

  /* What are the lengths?
   */
  status = VoltDecodeTagAndLen (
    (VoltLibCtx *)0, encoding, length, &theTag, &lengthLen, &lenLo, &lenHi,
    sizeof (unsigned int));
  if (status != 0)
    return (0);

  valueLen = (unsigned int)lenLo;

  /* Is the encoding big enough for the alleged lengths?
   */
  totalLen = lengthLen + valueLen + 1;
  if (length < (long)totalLen)
    return (0);

  /* valueLen must = (2 * primeLen) + 1, hence, it must be odd.
   */
  if ((valueLen & 1) == 0)
    return (0);

  /* Make sure the tag is OCTET STRING (or the proper IMPLICIT tag if
   * necessary).
   */
  theTag = 4;
  if (tag != -1)
    theTag = aclass | tag;
  if (encoding[0] != theTag)
    return (0);

  /* The first byte of the value must be 4 (It's not an OCTET STRING
   * tag, but coincidence).
   */
  encoding += lengthLen + 1;
  if (encoding[0] != 4)
    return (0);

  encoding++;
  primeLen = (valueLen - 1) / 2;

  /* The OpenSSL engine requires moving the input pointer along.
   */
  (*input) += totalLen;

  /* Is there an object? If not, create one.
   */
  if (value == (Asn1EcPoint *)0)
  {
    asn1Ret = Asn1EcPointNew ((ASN1_VALUE **)&value, asn1Item);
    if (asn1Ret != 1)
      return (0);
    *obj = (ASN1_VALUE *)value;
  }

  value->vFlags |= VOLT_ASN1_COPY_FLAG_FIXED;

  /* If copy by ref, copy the addresses, if copy by value, allocate and
   * copy.
   */
  if ((value->vFlags & VOLT_ASN1_COPY_MASK) == VOLT_ASN1_COPY_DATA)
  {
    value->xCoord.data = (unsigned char *)OPENSSL_malloc (primeLen);
    if (value->xCoord.data == (unsigned char *)0)
      return (0);

    Asn1Memcpy (value->xCoord.data, encoding, primeLen);
    encoding += primeLen;

    value->yCoord.data = (unsigned char *)OPENSSL_malloc (primeLen);
    if (value->yCoord.data == (unsigned char *)0)
      return (0);

    Asn1Memcpy (value->yCoord.data, encoding, primeLen);
  }
  else
  {
    value->xCoord.data = encoding;
    encoding += primeLen;
    value->yCoord.data = encoding;
  }

  value->xCoord.len = primeLen;
  value->yCoord.len = primeLen;

  /* Clear the context.
   */
  ctx->valid = 0;
  ctx->ret = 0;
  ctx->plen = 0;
  ctx->ptag = 0;
  ctx->pclass = 0;
  ctx->hdrlen = 0;

  return (1);
}


int Asn1EcPointEncode (
   ASN1_VALUE **obj,
   unsigned char **output,
   const ASN1_ITEM *asn1Item,
   int tag,
   int aclass
   )
{
  unsigned int valueLen, totalLen, theTag, index, offset;
  Asn1EcPoint *value = (Asn1EcPoint *)(*obj);  
  unsigned char *encoding;

  value->vFlags |= VOLT_ASN1_COPY_FLAG_FIXED;

  if (value->primeLen == 0)
    return (0);

  /* Encode the tag and length.
   */
  valueLen = (2 * value->primeLen) + 1;
  totalLen =
    valueLen + VoltDetermineDerLengthLen ((UInt32)valueLen, (UInt32)0) + 1;

  /* If there's no pointer to output, just indicate the length.
   */
  if (output == (unsigned char **)0)
    return (totalLen);

  /* If the caller supplied no buffer, don't do anything.
   */
  if (*output == (unsigned char *)0)
    return (0);

  encoding = *output;

  /* Write the tag and len.
   */
  theTag = 4;
  if (tag != -1)
    theTag = aclass | tag;
  encoding += VoltWriteDerTagAndLen (
    encoding, theTag, (UInt32)valueLen, (UInt32)0);

  /* Write the leading 4 (not the tag, the coincidence).
   */
  encoding[0] = 4;
  encoding++;

  /* Copy the coordinates into the buffer. If the length is < primeLen,
   * place leading 00 bytes.
   */
  offset = value->primeLen - value->xCoord.len;
  for (index = 0; index < offset; ++index)
    encoding[index] = 0;
  Asn1Memcpy (encoding + offset, value->xCoord.data, value->xCoord.len);
  encoding += value->primeLen;
  offset = value->primeLen - value->yCoord.len;
  for (index = 0; index < offset; ++index)
    encoding[index] = 0;
  Asn1Memcpy (encoding, value->yCoord.data, value->yCoord.len);

  /* The OpenSSL engine requires moving the output pointer along.
   */
  (*output) += totalLen;
  return (totalLen);
}


Asn1EncryptedContent *Asn1EncryptedContent_new ()
{
  Asn1EncryptedContent *retVal = (Asn1EncryptedContent *)0;

  Asn1EncryptedContentNew ((ASN1_VALUE **)&retVal, (const ASN1_ITEM *)0);
  return (retVal);
}


int Asn1EncryptedContent_set (
   Asn1EncryptedContent *value,
   VtLibCtx libCtx,
   VtAlgorithmImpl *AlgImpl,
   Pointer algImplInfo,
   VtKeyParam *KeyParam,
   Pointer keyParamInfo,
   VtRandomObject random,
   unsigned char *data,
   unsigned int dataLen
   )
{
  int status;

  if (value == (Asn1EncryptedContent *)0)
    return (0);

  Asn1EncryptedContentClear ((ASN1_VALUE **)&value, (ASN1_ITEM *)0);
  value->vFlags |= VOLT_ASN1_COPY_FLAG_FIXED;

  /* Did the caller pass in an alg object or do we need to build our
   * own?
   */
  if (AlgImpl == (VtAlgorithmImpl *)0)
  {
    value->cipherObj = (VtAlgorithmObject)algImplInfo;
  }
  else
  {
    /* Build an encryption object using the input.
     */
    status = VtCreateAlgorithmObject (
      libCtx, AlgImpl, algImplInfo, &(value->cipherObj));
    if (status != 0)
      return (0);

    value->state |= VOLT_ENC_CONTENT_STATE_ALG;
  }

  /* Did the caller pass in a key object or do we need to build our own?
   */
  if (KeyParam == (VtKeyParam *)0)
  {
    value->keyObj = (VtKeyObject)keyParamInfo;
  }
  else
  {
    /* Build a key object using the input.
     */
    status = VtCreateKeyObject (
      libCtx, (VtKeyImpl *)0, (Pointer)0, &(value->keyObj));
    if (status != 0)
      return (0);

    status = VtSetKeyParam (value->keyObj, KeyParam, keyParamInfo);
    if (status != 0)
      return (0);

    value->state |= VOLT_ENC_CONTENT_STATE_KEY;
  }

  value->random = random;

  value->state |= VOLT_ENC_CONTENT_STATE_SET;
  if ( (data == (unsigned char *)0) || (dataLen == 0) )
    return (1);

  /* If copy by ref, copy the addresses, if copy by value, allocate and
   * copy.
   */
  if ((value->vFlags & VOLT_ASN1_COPY_MASK) == VOLT_ASN1_COPY_DATA)
  {
    value->base.data = (unsigned char *)OPENSSL_malloc (dataLen);
    if (value->base.data == (unsigned char *)0)
      return (0);
    Asn1Memcpy (value->base.data, data, dataLen);
  }
  else
  {
    value->base.data = data;
  }

  value->base.length = (int)dataLen;

  return (1);
}

int Asn1EncryptedContentNew (
   ASN1_VALUE **obj,
   const ASN1_ITEM *asn1Item
   )
{
  Asn1EncryptedContent *retVal = (Asn1EncryptedContent *)0;

  if (obj == (ASN1_VALUE **)0)
    return (0);
  *obj = (ASN1_VALUE *)0;

  /* Build an empty Asn1EncryptedContent struct.
   */
  retVal = (Asn1EncryptedContent *)OPENSSL_malloc (
    sizeof (Asn1EncryptedContent));
  if (retVal == (Asn1EncryptedContent *)0)
    return (0);

  retVal->vFlags = 0;
  retVal->state = VOLT_ENC_CONTENT_STATE_CREATE;
  retVal->cipherObj = (VtAlgorithmObject)0;
  retVal->keyObj = (VtKeyObject)0;
  retVal->random = (VtRandomObject)0;
  retVal->base.length = 0;
  retVal->base.type = 0;
  retVal->base.data = (unsigned char *)0;
  retVal->base.flags = 0;
  *obj = (ASN1_VALUE *)retVal;

  return (1);
}

void Asn1EncryptedContentFree (
   ASN1_VALUE **obj,
   const ASN1_ITEM *asn1Item
   )
{
  /* Anything to free?
   */
  if (obj == (ASN1_VALUE **)0)
    return;
  if (*obj == (ASN1_VALUE *)0)
    return;

  Asn1EncryptedContentClear (obj, asn1Item);

  OPENSSL_free (*obj);
  *obj = (ASN1_VALUE *)0;
}

void Asn1EncryptedContentClear (
   ASN1_VALUE **obj,
   const ASN1_ITEM *asn1Item
   )
{
  Asn1EncryptedContent *value;

  /* Anything to free?
   */
  if (obj == (ASN1_VALUE **)0)
    return;
  if (*obj == (ASN1_VALUE *)0)
    return;

  value = (Asn1EncryptedContent *)(*obj);

  /* If copy by value, overwrite and free.
   */
  if ((value->vFlags & VOLT_ASN1_COPY_MASK) == VOLT_ASN1_COPY_DATA)
  {
    if (value->base.data != (unsigned char *)0)
    {
      Asn1Memset (value->base.data, 0, (unsigned int)(value->base.length));
      OPENSSL_free (value->base.data);
    }
  }
  value->base.data = (unsigned char *)0;
  value->base.length = 0;

  /* Destroy the encryption and key objects if we created them. Don't
   * destroy the random object (only a reference was stored). Also, the
   * data to transform was copied as reference as well, don't free it.
   */
  if ((value->state & VOLT_ENC_CONTENT_STATE_ALG) != 0)
    VtDestroyAlgorithmObject (&(value->cipherObj));
  else
    value->cipherObj = (VtAlgorithmObject)0;
  if ((value->state & VOLT_ENC_CONTENT_STATE_KEY) != 0)
    VtDestroyKeyObject (&(value->keyObj));
  else
    value->keyObj = (VtKeyObject)0;
  value->random = (VtRandomObject)0;
  value->state = VOLT_ENC_CONTENT_STATE_CREATE;
}

int Asn1EncryptedContentDecode (
   ASN1_VALUE **obj,
   const unsigned char **input,
   long length,
   const ASN1_ITEM *asn1Item,
   int tag,
   int aclass,
   char opt,
   ASN1_TLC *ctx
   )
{
  int status;
  unsigned int lengthLen, valueLen, totalLen, decryptLen, theTag;
  UInt32 lenLo, lenHi;
  Asn1EncryptedContent *value = (Asn1EncryptedContent *)0;
  unsigned char *encoding = (unsigned char *)(*input);

  if (obj == (ASN1_VALUE **)0)
    return (0);
  value = (Asn1EncryptedContent *)(*obj);

  /* Is there an object? If not, error
   */
  if (value == (Asn1EncryptedContent *)0)
    return (0);

  value->vFlags |= VOLT_ASN1_COPY_FLAG_FIXED;

  /* We can call this if the object is SET or has been initialized for
   * Decryption/Decoding. Use totalLen as a temp variable.
   */
  totalLen = VOLT_ENC_CONTENT_STATE_MASK & value->state;
  if (totalLen == VOLT_ENC_CONTENT_STATE_INIT_E)
    return (0);

  if (totalLen == VOLT_ENC_CONTENT_STATE_SET)
  {
    if (value->cipherObj != (VtAlgorithmObject)0)
    {
      status = VtDecryptInit (value->cipherObj, value->keyObj);
      if (status != 0)
        return (0);
      value->state ^= totalLen;
      value->state |= VOLT_ENC_CONTENT_STATE_INIT_D;
    }
  }

  /* What are the lengths?

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -