How to integrate support for securing a property in my C++ application?

ImportantThe following article uses options that are available starting with the Professional edition and project type.

Step 1 - Loading and initializing the SecureProp library

 
// "GetRevealedTextLength" function signature
typedef size_t (__stdcall * GetTextLengthFcn)(LPCWSTR);
// "RevealText" function signature
typedef void (__stdcall * RevealTextFcn)(LPCWSTR, LPWSTR, size_t);
HMODULE hModule = NULL;
void InitSecurePropSupport(GetTextLengthFcn & aGetTextLengthFcn, RevealTextFcn & aRevealTextFcn)
{
  // The name of the dll file to load
  const wstring kDllName = L"SecureProp.dll";
  // Try to load the dll file
  hModule = ::LoadLibrary(kDllName.c_str());
  if (!hModule)
  {
    // Couldn't load the dll file, so just output an error message
    wcerr << L"Couldn't load " << kDllName << endl;
    return;
  }
  // Match the calling convention of the "GetRevealedTextLength" exported function
  aGetTextLengthFcn = reinterpret_cast<GetTextLengthFcn>(::GetProcAddress(hModule, "GetRevealedTextLength"));
  if (aGetTextLengthFcn == NULL)
  {
    // Function signature mismatch
    wcerr << L"Couldn't match the function signature of GetRevealedTextLength" << endl;
    return;
  }
  // Match the calling convention of the "RevealText" exported function
  aRevealTextFcn = reinterpret_cast<RevealTextFcn<(::GetProcAddress(hModule, "RevealText"));
  if (aRevealTextFcn == NULL)
  {
    // Function signature mismatch
    wcerr << L"Couldn't match the function signature of RevealText" << endl;
    return;
  }
}
      

SecureProp library exported functions

  • GetRevealedTextLength - the DLL exported function that reveals the secured text and returns its length
  • RevealText - the DLL exported function that reveals the secured text and stores the result in the provided buffer

Step 2 - Using the SecureProp library

 
void SecureProps()
{
  //------------------------------------------------------------------------------------------
  // Load the SecureProp library and initialize the exported functions  
  //------------------------------------------------------------------------------------------
  GetTextLengthFcn GetRevealedTextLength = NULL;
  RevealTextFcn RevealText = NULL;
  InitSecurePropSupport(GetRevealedTextLength, RevealText);
  if (GetRevealedTextLength == NULL || RevealText == NULL)
    return;
  // Load the properties from the ini file
  vector<Property> properties;
  LoadPropertiesFromIni(properties);
  if (properties.empty())
    return;
  //------------------------------------------------------------------------------------------
  // Use the SecureProp library
  //------------------------------------------------------------------------------------------
  for (size_t i = 0; i < properties.size(); i++)
  {
    LPCWSTR propValue = properties[i].mValue.c_str();
    //------------------------------------------------------------------------------------------
    // Exported function call
    // Reveal the secured text and return its length
    //------------------------------------------------------------------------------------------
    size_t textLength = GetRevealedTextLength(propValue);
    // Allocate a buffer of wide characters with the length: textLength + 1
    // We need to add 1 in order to provide space for the null terminator
    wchar_t * textBuffer = new wchar_t[++textLength];
    //------------------------------------------------------------------------------------------
    // Exported function call
    // Reveal the secured text and store the result in the provided buffer
    //------------------------------------------------------------------------------------------
    RevealText(propValue, textBuffer, textLength);
    // Output the revealed text
    wcout << properties[i].mName << L" = " << textBuffer << endl;
    // Delete the text buffer
    delete[] textBuffer;
    textBuffer = NULL;
  }
  // Free the loaded dll file
  ::FreeLibrary(hModule);
}
      

Sample Project

Download the C++ sample showcasing how the secure property functionality works.