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

📄 opensslbntype.c

📁 IBE是一种非对称密码技术
💻 C
字号:
/* Copyright 2003-2006, Voltage Security, all rights reserved.
 */
#include "vibe.h"
#include "vibecrypto.h"
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "mpint.h"
#include "opensslbnwrap.h"
#include "errorctx.h"
#include "openssl/bn.h"

typedef struct ThreadLocalBNContextInfo
{
  struct ThreadLocalBNContextInfo*  next;
  VtLibCtx                          libCtx;
  Pointer                           threadLocalKey;
  int                               refCount;
} ThreadLocalBNContextInfo;

static ThreadLocalBNContextInfo*    gBNContextInfoList;

int VOLT_CALLING_CONV DeleteThreadLocalBNCtx (
  VoltThreadCtx *threadCtx,
  Pointer threadLocalData
)
{
  if (threadLocalData != (Pointer)0)
  {
    BN_CTX_free((BN_CTX*)threadLocalData);
  }
  
  return 0;
}

int VtMpIntImplOpenSSL (
   VtMpIntCtx *mpCtx,
   Pointer info,
   unsigned int flag
   )
{
  int status, status2;
  VoltMpIntCtx *ctx = (VoltMpIntCtx *)(*mpCtx);
  VtLibCtx libCtx;
  VoltThreadCtx* threadCtx;
  Pointer toolkitLock;
  ThreadLocalBNContextInfo* contextInfo;
  int acquiredLock = 0;
  //BN_CTX *bnCtx = (BN_CTX *)0;
  VOLT_DECLARE_FNCT_LINE (fnctLine)
  VOLT_DECLARE_ERROR_TYPE (errorType)

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

    /* The associated info should be NULL pointer.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_ASSOCIATED_INFO;
    if (info != (Pointer)0)
      break;

    libCtx = ctx->voltObject.libraryCtx;
    threadCtx = libCtx->threadCtx;
    
    VOLT_SET_ERROR_TYPE(errorType, 0)

    VOLT_SET_FNCT_LINE (fnctLine)
    status = threadCtx->GetToolkitLock(threadCtx, &toolkitLock);
    if (status != 0)
      break;
      
    VOLT_SET_FNCT_LINE (fnctLine)
    status = threadCtx->AcquireLock(threadCtx, toolkitLock);
    if (status != 0)
      break;
    
    acquiredLock = 1;
    
    /* First search through list to see if there's already a
     * thread-local variable for this library context
     */
    contextInfo = gBNContextInfoList;
    while (contextInfo != (ThreadLocalBNContextInfo*)0)
    {
      if (contextInfo->libCtx == libCtx)
        break;
      contextInfo = contextInfo->next;
    }
  
    /* Create a new info entry if necessary */
    if (contextInfo == (ThreadLocalBNContextInfo*)0)
    {
      VOLT_SET_FNCT_LINE (fnctLine)
      contextInfo = (ThreadLocalBNContextInfo*)
        Z3Malloc(sizeof(ThreadLocalBNContextInfo));
      if (contextInfo == (ThreadLocalBNContextInfo*)0)
      {
        VOLT_SET_ERROR_TYPE(errorType, VT_ERROR_TYPE_PRIMARY)
        status = VT_ERROR_MEMORY;
        break;
      }
      
      Z2Memset(contextInfo, 0, sizeof(ThreadLocalBNContextInfo));

      contextInfo->libCtx = libCtx;
      
      /* Create the thread-local key. We do this per-libCtx,
       * because the thread-local key is associated with a
       * particular library context and cannot, in general,
       * be shared safely across multiple contexts.
       */
      VOLT_SET_FNCT_LINE(fnctLine)
      status = threadCtx->CreateThreadLocalKey(threadCtx,
        DeleteThreadLocalBNCtx, &contextInfo->threadLocalKey);
      if (status != 0)
        break;
      
      /* Link it into the BN context info list */
      contextInfo->next = gBNContextInfoList;
      gBNContextInfoList = contextInfo;
    }
    
    contextInfo->refCount++;

    #if 0
    status = VT_ERROR_MEMORY;
    bnCtx = BN_CTX_new ();
    if (bnCtx == (BN_CTX *)0)
      break;
    #endif
    
    /* Set the fields of the mpCtx.
     */
    ctx->MpIntImpl = VtMpIntImplOpenSSL;
    ctx->CreateMpInt = OpenSSLBnWrapCreateMpInt;
    ctx->DestroyMpInt = OpenSSLBnWrapDestroyMpInt;
    ctx->OctetStringToMpInt = OpenSSLBnWrapOctetStringToMpInt;
    ctx->IntToMpInt = OpenSSLBnWrapIntToMpInt;
    ctx->MpIntToMpInt = OpenSSLBnWrapMpIntToMpInt;
    ctx->MpIntToOctetString = OpenSSLBnWrapMpIntToOctetString;
    ctx->MpIntToInt = OpenSSLBnWrapMpIntToInt;
    ctx->Compare = OpenSSLBnWrapCompare;
    ctx->EvenOddZeroPositiveNegative =
      OpenSSLBnWrapEvenOddZeroPositiveNegative;
    ctx->GetBitLength = OpenSSLBnWrapGetBitLength;
    ctx->SetBit = OpenSSLBnWrapSetBit;
    ctx->GetBit = OpenSSLBnWrapGetBit;
    ctx->ShiftLeftBits = OpenSSLBnWrapShiftLeftBits;
    ctx->ShiftRightBits = OpenSSLBnWrapShiftRightBits;
    ctx->Add = OpenSSLBnWrapAdd;
    ctx->Subtract = OpenSSLBnWrapSubtract;
    ctx->Multiply = OpenSSLBnWrapMultiply;
    ctx->Square = OpenSSLBnWrapSquare;
    ctx->Divide = OpenSSLBnWrapDivide;
    ctx->GCD = OpenSSLBnWrapGCD;
    ctx->ModReduce = OpenSSLBnWrapModReduce;
    ctx->ModInvert = OpenSSLBnWrapModInvert;
    ctx->ModExp = OpenSSLBnWrapModExp;
    /* OpenSSL does not supply a CRT function, use the Volt version.
     */
    ctx->ModExpCRT = VoltModExpCRT;
    /* This implementation has no GeneratePrime.
     */

    ctx->localCtx = contextInfo->threadLocalKey;
    ctx->LocalCtxDestroy = OpenSSLBnWrapLocalCtxDestroy;

    status = 0;

  } while (0);

  if (acquiredLock)
  {
    status2 = threadCtx->ReleaseLock(threadCtx, toolkitLock);
  }
  
  VOLT_LOG_ERROR_COMPARE (
    status, libCtx, status, errorType,
    fnctLine, "VtMpIntImplOpenSSL", (char *)0)

  return (status);
}

void OpenSSLBnWrapLocalCtxDestroy (
   Pointer obj,
   Pointer ctx
   )
{
  int status;
  VtMpIntCtx mpCtx;
  VtLibCtx libCtx;
  VoltThreadCtx* threadCtx;
  Pointer toolkitLock;
  ThreadLocalBNContextInfo* contextInfo;
  ThreadLocalBNContextInfo* previousContextInfo;
  
  /* Anything to destroy?
   */
  if ( (obj == (Pointer)0) || (ctx == (Pointer)0) )
    return;

  mpCtx = (VtMpIntCtx) obj;
  
  libCtx = mpCtx->voltObject.libraryCtx;
  threadCtx = libCtx->threadCtx;
  
  status = threadCtx->GetToolkitLock(threadCtx, &toolkitLock);
  status = threadCtx->AcquireLock(threadCtx, toolkitLock);
  
  contextInfo = gBNContextInfoList;
  previousContextInfo = (ThreadLocalBNContextInfo*)0;
  while (contextInfo != (ThreadLocalBNContextInfo*)0)
  {
    if (contextInfo->libCtx == libCtx)
    {
      contextInfo->refCount--;
      if (contextInfo->refCount == 0)
      {
        status = threadCtx->DestroyThreadLocalKey(threadCtx,
          &contextInfo->threadLocalKey);
        if (previousContextInfo == (ThreadLocalBNContextInfo*)0)
          gBNContextInfoList = contextInfo->next;
        else
          previousContextInfo->next = contextInfo->next;
        Z2Free(contextInfo);
      }
      break;
    }
    previousContextInfo = contextInfo;
    contextInfo = contextInfo->next;
  }
  
  status = threadCtx->ReleaseLock(threadCtx, toolkitLock);
  //BN_CTX_free ((BN_CTX *)ctx);
}

⌨️ 快捷键说明

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