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

📄 sess_mgr.c

📁 IBM的Linux上的PKCS#11实现
💻 C
📖 第 1 页 / 共 3 页
字号:
   if (sess->decr_ctx.active == TRUE) {      if (op_data != NULL){         st_err_log(71, __FILE__, __LINE__);          return CKR_STATE_UNSAVEABLE;      }      op_data_len = sizeof(OP_STATE_DATA)      +                    sizeof(ENCR_DECR_CONTEXT)  +                    sess->decr_ctx.context_len +                    sess->decr_ctx.mech.ulParameterLen;      if (length_only == FALSE) {         op_data = (OP_STATE_DATA *)data;         op_data->data_len         = op_data_len - sizeof(OP_STATE_DATA);         op_data->session_state    = sess->session_info.state;         op_data->active_operation = STATE_DECR;         offset = sizeof(OP_STATE_DATA);         memcpy( (CK_BYTE *)op_data + offset,                 &sess->decr_ctx,                 sizeof(ENCR_DECR_CONTEXT) );         offset += sizeof(ENCR_DECR_CONTEXT);         if (sess->decr_ctx.context_len != 0) {            memcpy( (CK_BYTE *)op_data + offset,                    sess->decr_ctx.context,                    sess->decr_ctx.context_len );            offset += sess->decr_ctx.context_len;         }         if (sess->decr_ctx.mech.ulParameterLen != 0) {            memcpy( (CK_BYTE *)op_data + offset,                    sess->decr_ctx.mech.pParameter,                    sess->decr_ctx.mech.ulParameterLen );         }      }   }   if (sess->digest_ctx.active == TRUE) {      if (op_data != NULL){         st_err_log(71, __FILE__, __LINE__);          return CKR_STATE_UNSAVEABLE;      }      op_data_len = sizeof(OP_STATE_DATA)        +                    sizeof(DIGEST_CONTEXT)       +                    sess->digest_ctx.context_len +                    sess->digest_ctx.mech.ulParameterLen;      if (length_only == FALSE) {         op_data = (OP_STATE_DATA *)data;         op_data->data_len         = op_data_len - sizeof(OP_STATE_DATA);         op_data->session_state    = sess->session_info.state;         op_data->active_operation = STATE_DIGEST;         offset = sizeof(OP_STATE_DATA);         memcpy( (CK_BYTE *)op_data + offset,                 &sess->digest_ctx,                 sizeof(DIGEST_CONTEXT) );         offset += sizeof(DIGEST_CONTEXT);         if (sess->digest_ctx.context_len != 0) {            memcpy( (CK_BYTE *)op_data + offset,                    sess->digest_ctx.context,                    sess->digest_ctx.context_len );            offset += sess->digest_ctx.context_len;         }         if (sess->digest_ctx.mech.ulParameterLen != 0) {            memcpy( (CK_BYTE *)op_data + offset,                    sess->digest_ctx.mech.pParameter,                    sess->digest_ctx.mech.ulParameterLen );         }      }   }   if (sess->sign_ctx.active == TRUE) {      if (op_data != NULL){         st_err_log(71, __FILE__, __LINE__);          return CKR_STATE_UNSAVEABLE;      }      op_data_len = sizeof(OP_STATE_DATA)       +                    sizeof(SIGN_VERIFY_CONTEXT) +                    sess->sign_ctx.context_len  +                    sess->sign_ctx.mech.ulParameterLen;      if (length_only == FALSE) {         op_data = (OP_STATE_DATA *)data;         op_data->data_len         = op_data_len - sizeof(OP_STATE_DATA);         op_data->session_state    = sess->session_info.state;         op_data->active_operation = STATE_SIGN;         offset = sizeof(OP_STATE_DATA);         memcpy( (CK_BYTE *)op_data + offset,                 &sess->sign_ctx,                 sizeof(SIGN_VERIFY_CONTEXT) );         offset += sizeof(SIGN_VERIFY_CONTEXT);         if (sess->sign_ctx.context_len != 0) {            memcpy( (CK_BYTE *)op_data + offset,                    sess->sign_ctx.context,                    sess->sign_ctx.context_len );            offset += sess->sign_ctx.context_len;         }         if (sess->sign_ctx.mech.ulParameterLen != 0) {            memcpy( (CK_BYTE *)op_data + offset,                    sess->sign_ctx.mech.pParameter,                    sess->sign_ctx.mech.ulParameterLen );         }      }   }   if (sess->verify_ctx.active == TRUE) {      if (op_data != NULL){         st_err_log(71, __FILE__, __LINE__);          return CKR_STATE_UNSAVEABLE;      }      op_data_len = sizeof(OP_STATE_DATA)        +                    sizeof(SIGN_VERIFY_CONTEXT)  +                    sess->verify_ctx.context_len +                    sess->verify_ctx.mech.ulParameterLen;      if (length_only == FALSE) {         op_data = (OP_STATE_DATA *)data;         op_data->data_len         = op_data_len - sizeof(OP_STATE_DATA);         op_data->session_state    = sess->session_info.state;         op_data->active_operation = STATE_SIGN;         offset = sizeof(OP_STATE_DATA);         memcpy( (CK_BYTE *)op_data + offset,                 &sess->verify_ctx,                 sizeof(SIGN_VERIFY_CONTEXT) );         offset += sizeof(SIGN_VERIFY_CONTEXT);         if (sess->verify_ctx.context_len != 0) {            memcpy( (CK_BYTE *)op_data + offset,                    sess->verify_ctx.context,                    sess->verify_ctx.context_len );            offset += sess->verify_ctx.context_len;         }         if (sess->verify_ctx.mech.ulParameterLen != 0) {            memcpy( (CK_BYTE *)op_data + offset,                    sess->verify_ctx.mech.pParameter,                    sess->verify_ctx.mech.ulParameterLen );         }      }   }   *data_len = op_data_len;   return CKR_OK;}////CK_RVsession_mgr_set_op_state( SESSION           * sess,                          CK_OBJECT_HANDLE    encr_key,                          CK_OBJECT_HANDLE    auth_key,                          CK_BYTE           * data,                          CK_ULONG            data_len ){   OP_STATE_DATA  *op_data    = NULL;   CK_BYTE        *mech_param = NULL;   CK_BYTE        *context    = NULL;   CK_BYTE        *ptr1       = NULL;   CK_BYTE        *ptr2       = NULL;   CK_BYTE        *ptr3       = NULL;   CK_ULONG        len;   if (!sess || !data){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);       return CKR_FUNCTION_FAILED;   }   op_data = (OP_STATE_DATA *)data;   // make sure the session states are compatible   //   if (sess->session_info.state != op_data->session_state){      st_err_log(69, __FILE__, __LINE__);       return CKR_SAVED_STATE_INVALID;   }   // validate the new state information.  don't touch the session   // until the new state is valid.   //   switch (op_data->active_operation) {      case STATE_ENCR:      case STATE_DECR:         {            ENCR_DECR_CONTEXT *ctx = (ENCR_DECR_CONTEXT *)(data + sizeof(OP_STATE_DATA));            len = sizeof(ENCR_DECR_CONTEXT) + ctx->context_len + ctx->mech.ulParameterLen;            if (len != op_data->data_len){               st_err_log(69, __FILE__, __LINE__);                return CKR_SAVED_STATE_INVALID;            }            if (auth_key != 0){               st_err_log(21, __FILE__, __LINE__);                return CKR_KEY_NOT_NEEDED;            }            if (encr_key == 0){               st_err_log(23, __FILE__, __LINE__);                return CKR_KEY_NEEDED;            }            ptr1 = (CK_BYTE *)ctx;            ptr2 = ptr1 + sizeof(ENCR_DECR_CONTEXT);            ptr3 = ptr2 + ctx->context_len;            if (ctx->context_len) {               context = (CK_BYTE *)malloc( ctx->context_len );               if (!context){                  st_err_log(0, __FILE__, __LINE__);                  return CKR_HOST_MEMORY;               }               memcpy( context, ptr2, ctx->context_len );            }            if (ctx->mech.ulParameterLen) {               mech_param = (CK_BYTE *)malloc( ctx->mech.ulParameterLen );               if (!mech_param) {                  if (context)                     free( context );                  st_err_log(0, __FILE__, __LINE__);                  return CKR_HOST_MEMORY;               }               memcpy( mech_param, ptr3, ctx->mech.ulParameterLen );            }         }         break;      case STATE_SIGN:      case STATE_VERIFY:         {            SIGN_VERIFY_CONTEXT *ctx = (SIGN_VERIFY_CONTEXT *)(data + sizeof(OP_STATE_DATA));            len = sizeof(SIGN_VERIFY_CONTEXT) + ctx->context_len + ctx->mech.ulParameterLen;            if (len != op_data->data_len){               st_err_log(69, __FILE__, __LINE__);                return CKR_SAVED_STATE_INVALID;            }            if (auth_key == 0){               st_err_log(23, __FILE__, __LINE__);                return CKR_KEY_NEEDED;            }            if (encr_key != 0){               st_err_log(21, __FILE__, __LINE__);                return CKR_KEY_NOT_NEEDED;            }            ptr1 = (CK_BYTE *)ctx;            ptr2 = ptr1 + sizeof(SIGN_VERIFY_CONTEXT);            ptr3 = ptr2 + ctx->context_len;            if (ctx->context_len) {               context = (CK_BYTE *)malloc( ctx->context_len );               if (!context){                  st_err_log(0, __FILE__, __LINE__);                  return CKR_HOST_MEMORY;               }               memcpy( context, ptr2, ctx->context_len );            }            if (ctx->mech.ulParameterLen) {               mech_param = (CK_BYTE *)malloc( ctx->mech.ulParameterLen );               if (!mech_param) {                  if (context)                     free( context );                  st_err_log(0, __FILE__, __LINE__);                  return CKR_HOST_MEMORY;               }               memcpy( mech_param, ptr3, ctx->mech.ulParameterLen );            }         }         break;      case STATE_DIGEST:         {            DIGEST_CONTEXT *ctx = (DIGEST_CONTEXT *)(data + sizeof(OP_STATE_DATA));            len = sizeof(DIGEST_CONTEXT) + ctx->context_len + ctx->mech.ulParameterLen;            if (len != op_data->data_len){               st_err_log(69, __FILE__, __LINE__);                return CKR_SAVED_STATE_INVALID;            }            if (auth_key != 0){               st_err_log(23, __FILE__, __LINE__);                return CKR_KEY_NOT_NEEDED;            }            if (encr_key != 0){               st_err_log(23, __FILE__, __LINE__);                return CKR_KEY_NOT_NEEDED;            }            ptr1 = (CK_BYTE *)ctx;            ptr2 = ptr1 + sizeof(DIGEST_CONTEXT);            ptr3 = ptr2 + ctx->context_len;            if (ctx->context_len) {               context = (CK_BYTE *)malloc( ctx->context_len );               if (!context){                  st_err_log(0, __FILE__, __LINE__);                  return CKR_HOST_MEMORY;               }               memcpy( context, ptr2, ctx->context_len );            }            if (ctx->mech.ulParameterLen) {               mech_param = (CK_BYTE *)malloc( ctx->mech.ulParameterLen );               if (!mech_param) {                  if (context)                     free( context );                  st_err_log(0, __FILE__, __LINE__);                  return CKR_HOST_MEMORY;               }               memcpy( mech_param, ptr3, ctx->mech.ulParameterLen );            }         }         break;      default:         st_err_log(69, __FILE__, __LINE__);          return CKR_SAVED_STATE_INVALID;   }   // state information looks okay.  cleanup the current session state, first   //   if (sess->encr_ctx.active)      encr_mgr_cleanup( &sess->encr_ctx );   if (sess->decr_ctx.active)      decr_mgr_cleanup( &sess->decr_ctx );   if (sess->digest_ctx.active)      digest_mgr_cleanup( &sess->digest_ctx );   if (sess->sign_ctx.active)      sign_mgr_cleanup( &sess->sign_ctx );   if (sess->verify_ctx.active)      verify_mgr_cleanup( &sess->verify_ctx );   // copy the new state information   //   switch (op_data->active_operation) {      case STATE_ENCR:         memcpy( &sess->encr_ctx, ptr1, sizeof(ENCR_DECR_CONTEXT) );         sess->encr_ctx.key             = encr_key;         sess->encr_ctx.context         = context;         sess->encr_ctx.mech.pParameter = mech_param;         break;      case STATE_DECR:         memcpy( &sess->decr_ctx, ptr1, sizeof(ENCR_DECR_CONTEXT) );         sess->decr_ctx.key             = encr_key;         sess->decr_ctx.context         = context;         sess->decr_ctx.mech.pParameter = mech_param;         break;      case STATE_SIGN:         memcpy( &sess->sign_ctx, ptr1, sizeof(SIGN_VERIFY_CONTEXT) );         sess->sign_ctx.key             = auth_key;         sess->sign_ctx.context         = context;         sess->sign_ctx.mech.pParameter = mech_param;         break;      case STATE_VERIFY:         memcpy( &sess->verify_ctx, ptr1, sizeof(SIGN_VERIFY_CONTEXT) );         sess->verify_ctx.key             = auth_key;         sess->verify_ctx.context         = context;         sess->verify_ctx.mech.pParameter = mech_param;         break;      case STATE_DIGEST:         memcpy( &sess->digest_ctx, ptr1, sizeof(DIGEST_CONTEXT) );         sess->digest_ctx.context         = context;         sess->digest_ctx.mech.pParameter = mech_param;         break;   }   return CKR_OK;}// Return TRUE if the session we're in has its PIN// expired.CK_BBOOL pin_expired(CK_SESSION_INFO *si){   // If this is an SO session   if (	(si->flags & CKF_SO_PIN_TO_BE_CHANGED) &&	   (si->state == CKS_RW_SO_FUNCTIONS) )	   return TRUE;	      // Else we're a User session   return( (si->flags & CKF_USER_PIN_TO_BE_CHANGED) &&	  ((si->state == CKS_RO_USER_FUNCTIONS) ||	   (si->state == CKS_RW_USER_FUNCTIONS)) );}	   // Return TRUE if the session we're in has its PIN// locked.CK_BBOOL pin_locked(CK_SESSION_INFO *si){   // If this is an SO session   if (	(si->flags & CKF_SO_PIN_LOCKED) &&	   (si->state == CKS_RW_SO_FUNCTIONS) ) 	   return TRUE;	      // Else we're a User session   return( (si->flags & CKF_USER_PIN_LOCKED) &&	  ((si->state == CKS_RO_USER_FUNCTIONS) ||	   (si->state == CKS_RW_USER_FUNCTIONS)) );}// Increment the login flags after an incorrect password// has been passed to C_Login. New for v2.11. - KEYvoid set_login_flags(CK_USER_TYPE userType, CK_FLAGS_32 *flags){	if(userType == CKU_USER) {		if(*flags & CKF_USER_PIN_FINAL_TRY) {			*flags |= CKF_USER_PIN_LOCKED;			*flags &= ~(CKF_USER_PIN_FINAL_TRY);		} else if (*flags & CKF_USER_PIN_COUNT_LOW) {			*flags |= CKF_USER_PIN_FINAL_TRY;			*flags &= ~(CKF_USER_PIN_COUNT_LOW);		} else {			*flags |= CKF_USER_PIN_COUNT_LOW;		}	} else {		if(*flags & CKF_SO_PIN_FINAL_TRY) {			*flags |= CKF_SO_PIN_LOCKED;			*flags &= ~(CKF_SO_PIN_FINAL_TRY);		} else if (*flags & CKF_SO_PIN_COUNT_LOW) {			*flags |= CKF_SO_PIN_FINAL_TRY;			*flags &= ~(CKF_SO_PIN_COUNT_LOW);		} else {			*flags |= CKF_SO_PIN_COUNT_LOW;		}	}}

⌨️ 快捷键说明

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