Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
3.9 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2002 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // EncryptedBSTR.h
  7. //
  8. // Description:
  9. // Class to encrypt and decrypt BSTRs.
  10. //
  11. // Maintained By:
  12. // John Franco (jfranco) 15-APR-2002
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #pragma once
  16. //////////////////////////////////////////////////////////////////////////////
  17. //++
  18. //
  19. // class CEncryptedBSTR
  20. //
  21. // Description:
  22. // Class to encrypt and decrypt BSTRs.
  23. //
  24. //--
  25. //////////////////////////////////////////////////////////////////////////////
  26. class CEncryptedBSTR
  27. {
  28. private:
  29. DATA_BLOB m_dbBSTR;
  30. // Private copy constructor to prevent copying.
  31. CEncryptedBSTR( const CEncryptedBSTR & );
  32. // Private assignment operator to prevent copying.
  33. CEncryptedBSTR & operator=( const CEncryptedBSTR & );
  34. public:
  35. CEncryptedBSTR( void );
  36. ~CEncryptedBSTR( void );
  37. HRESULT HrSetBSTR( BSTR bstrIn );
  38. HRESULT HrSetWSTR( PCWSTR pcwszIn, size_t cchIn );
  39. HRESULT HrGetBSTR( BSTR * pbstrOut ) const;
  40. HRESULT HrAssign( const CEncryptedBSTR& rSourceIn );
  41. BOOL IsEmpty( void ) const;
  42. void Erase( void );
  43. static void SecureZeroBSTR( BSTR bstrIn );
  44. }; //*** class CEncryptedBSTR
  45. //////////////////////////////////////////////////////////////////////////////
  46. //++
  47. //
  48. // inline
  49. // CEncryptedBSTR::HrSetBSTR
  50. //
  51. // Description:
  52. // Set a string into this class.
  53. //
  54. // Arguments:
  55. // bstrIn
  56. //
  57. // Return Values:
  58. // S_OK - Operation completed successfully.
  59. // Other HRESULTs.
  60. //
  61. //--
  62. //////////////////////////////////////////////////////////////////////////////
  63. inline
  64. HRESULT
  65. CEncryptedBSTR::HrSetBSTR( BSTR bstrIn )
  66. {
  67. TraceFunc( "" );
  68. HRESULT hr;
  69. size_t cchBSTR = SysStringLen( bstrIn );
  70. hr = THR( HrSetWSTR( bstrIn, cchBSTR ) );
  71. HRETURN( hr );
  72. } //*** CEncryptedBSTR::HrSetBSTR
  73. //////////////////////////////////////////////////////////////////////////////
  74. //++
  75. //
  76. // inline
  77. // CEncryptedBSTR::IsEmpty
  78. //
  79. // Description:
  80. // Reports whether the string is empty or not.
  81. //
  82. // Arguments:
  83. // None.
  84. //
  85. // Return Values:
  86. // TRUE - String is empty.
  87. // FALSE - String is not empty.
  88. //
  89. //--
  90. //////////////////////////////////////////////////////////////////////////////
  91. inline
  92. BOOL
  93. CEncryptedBSTR::IsEmpty( void ) const
  94. {
  95. TraceFunc( "" );
  96. RETURN( m_dbBSTR.cbData == 0 );
  97. } //*** CEncryptedBSTR::IsEmpty
  98. //////////////////////////////////////////////////////////////////////////////
  99. //++
  100. //
  101. // inline
  102. // CEncryptedBSTR::Erase
  103. //
  104. // Description:
  105. // Erase the string.
  106. //
  107. // Arguments:
  108. // None.
  109. //
  110. // Return Values:
  111. // None.
  112. //
  113. //--
  114. //////////////////////////////////////////////////////////////////////////////
  115. inline
  116. void
  117. CEncryptedBSTR::Erase( void )
  118. {
  119. TraceFunc( "" );
  120. if ( m_dbBSTR.cbData > 0 )
  121. {
  122. Assert( m_dbBSTR.pbData != NULL );
  123. delete [] m_dbBSTR.pbData;
  124. m_dbBSTR.pbData = NULL;
  125. m_dbBSTR.cbData = 0;
  126. }
  127. TraceFuncExit();
  128. } //*** CEncryptedBSTR::Erase
  129. //////////////////////////////////////////////////////////////////////////////
  130. //++
  131. //
  132. // inline
  133. // CEncryptedBSTR::SecureZeroBSTR
  134. //
  135. // Description:
  136. // Zero out the string in a secure manner.
  137. //
  138. // Arguments:
  139. // bstrIn
  140. //
  141. // Return Values:
  142. // None.
  143. //
  144. //--
  145. //////////////////////////////////////////////////////////////////////////////
  146. inline
  147. void
  148. CEncryptedBSTR::SecureZeroBSTR( BSTR bstrIn )
  149. {
  150. TraceFunc( "" );
  151. UINT cchBSTR = SysStringLen( bstrIn );
  152. if ( cchBSTR > 0 )
  153. {
  154. ::SecureZeroMemory( bstrIn, cchBSTR * sizeof( *bstrIn ) );
  155. }
  156. TraceFuncExit();
  157. } //*** CEncryptedBSTR::SecureZeroBSTR