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

📄 itemfield.cpp

📁 Password Safe Password Safe is a password database utility. Users can keep their passwords securely
💻 CPP
字号:
/// \file ItemField.cpp//-----------------------------------------------------------------------------#include <math.h>#include "ItemField.h"#include "Util.h"#include "Blowfish.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//Returns the number of bytes of 8 byte blocks needed to store 'size' bytesintCItemField::GetBlockSize(int size) const{  return (int)ceil((double)size/8.0) * 8;}CItemField::CItemField(const CItemField &that)  : m_Type(that.m_Type), m_Length(that.m_Length){  if (m_Length > 0) {    int bs = GetBlockSize(m_Length);    m_Data = new unsigned char[bs];    ::memcpy(m_Data, that.m_Data, bs);  } else {    m_Data = NULL;  }}CItemField &CItemField::operator=(const CItemField &that){  if (this != &that) {    m_Type = that.m_Type;    m_Length = that.m_Length;    if (m_Data != NULL)      delete[] m_Data;    if (m_Length > 0) {      int bs = GetBlockSize(m_Length);      m_Data = new unsigned char[bs];      ::memcpy(m_Data, that.m_Data, bs);    } else {      m_Data = NULL;    }  }  return *this;}void CItemField::Set(const unsigned char* value, unsigned int length, BlowFish *bf){  const LPCSTR plainstr = (const LPCSTR)value;  int BlockLength;  m_Length = length;  BlockLength = GetBlockSize(m_Length);  if (m_Data != NULL)    delete[] m_Data;  if (m_Length == 0) {    m_Data = NULL;  } else {    m_Data = new unsigned char[BlockLength];    if (m_Data == NULL) { // out of memory - try to fail gracefully      m_Length = 0; // at least keep structure consistent      return;    }    unsigned char *tempmem = new unsigned char[BlockLength];    // invariant: BlockLength >= plainlength    ::memcpy((char*)tempmem, (char*)plainstr, m_Length);    int x;   //Fill the unused characters in with random stuff    for (x=m_Length; x<BlockLength; x++)      tempmem[x] = newrand();    //Do the actual encryption    for (x=0; x<BlockLength; x+=8)      bf->Encrypt(tempmem+x, m_Data+x);    delete[] tempmem;  }}void CItemField::Set(const CMyString &value, BlowFish *bf){  const LPCSTR plainstr = (const LPCSTR)value; // use of CString::operator LPCSTR  Set((const unsigned char *)plainstr, value.GetLength(), bf);}void CItemField::Get(unsigned char *value, unsigned int &length, BlowFish *bf) const{  // Sanity check: length is 0 iff data ptr is NULL  ASSERT((m_Length == 0 && m_Data == NULL) ||	 (m_Length > 0 && m_Data != NULL));  /*   * length is an in/out parameter:   * In: size of value array - must be at least BlockLength   * Out: size of data stored: m_Length (No trailing zero!)   * if In < BlockLength, assertion is triggered (no way to handle gracefully)   */  if (m_Length == 0) {    value[0] = '\0';    length = 0;  } else { // we have data to decrypt    int BlockLength = GetBlockSize(m_Length);    ASSERT(length >= (unsigned int)BlockLength);    unsigned char *tempmem = new unsigned char[BlockLength];   int x;   for (x=0;x<BlockLength;x+=8)      bf->Decrypt(m_Data+x, tempmem+x);   for (x=0;x<BlockLength;x++)     if (x<int(m_Length))       value[x] = tempmem[x];     else       value[x] = 0;   length = m_Length;   delete [] tempmem;  }}void CItemField::Get(CMyString &value, BlowFish *bf) const{  // Sanity check: length is 0 iff data ptr is NULL  ASSERT((m_Length == 0 && m_Data == NULL) ||	 (m_Length > 0 && m_Data != NULL));  if (m_Length == 0) {    value = _T("");  } else { // we have data to decrypt    int BlockLength = GetBlockSize(m_Length);    unsigned char *tempmem = new unsigned char[BlockLength];    unsigned char *plaintxt = (unsigned char*)value.GetBuffer(BlockLength+1);   int x;   for (x=0;x<BlockLength;x+=8)      bf->Decrypt(m_Data+x, tempmem+x);   for (x=0;x<BlockLength;x++)     if (x<int(m_Length))       plaintxt[x] = tempmem[x];     else       plaintxt[x] = 0;   plaintxt[BlockLength] = 0;   delete [] tempmem;   value.ReleaseBuffer();  }}

⌨️ 快捷键说明

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