172 lines
3.6 KiB
C++
172 lines
3.6 KiB
C++
|
// Copyright (c) 2001 Microsoft Corporation
|
||
|
//
|
||
|
// run-encoded string class
|
||
|
//
|
||
|
// 2001-02-08 sburns
|
||
|
|
||
|
|
||
|
|
||
|
#ifndef ENCODEDSTRING_HPP_INCLUDED
|
||
|
#define ENCODEDSTRING_HPP_INCLUDED
|
||
|
|
||
|
|
||
|
|
||
|
// A class that has a similar public interface as class Burnslib::String, but
|
||
|
// is represented as a run-encoded unicode string, using the Rtl functions.
|
||
|
// This class is used to represent password strings in-memory, instead of
|
||
|
// holding them as cleartext, which is a security hole if the memory pages
|
||
|
// are swapped to disk.
|
||
|
|
||
|
class EncodedString
|
||
|
{
|
||
|
typedef String::size_type size_type;
|
||
|
|
||
|
public:
|
||
|
|
||
|
|
||
|
|
||
|
// constucts an empty string.
|
||
|
|
||
|
explicit
|
||
|
EncodedString();
|
||
|
|
||
|
|
||
|
|
||
|
// constructs a copy of an existing, already encoded string
|
||
|
|
||
|
EncodedString(const EncodedString& rhs);
|
||
|
|
||
|
|
||
|
|
||
|
// scribbles out the text, and deletes it.
|
||
|
|
||
|
~EncodedString()
|
||
|
{
|
||
|
Reset();
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// Extracts the decoded cleartext representation of the text, including
|
||
|
// null terminator. The caller must free the result with delete[], and
|
||
|
// should scribble it out, too.
|
||
|
//
|
||
|
// Example:
|
||
|
// WCHAR* cleartext = encoded.GetDecodedCopy();
|
||
|
// // use the cleartext
|
||
|
// ::ZeroMemory(cleartext, encoded.GetLength() * sizeof(WCHAR));
|
||
|
// delete[] cleartext;
|
||
|
|
||
|
WCHAR*
|
||
|
EncodedString::GetDecodedCopy() const;
|
||
|
|
||
|
|
||
|
|
||
|
// Returns true if the string is zero-length, false if not.
|
||
|
|
||
|
bool
|
||
|
IsEmpty() const
|
||
|
{
|
||
|
return (GetLength() == 0);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// Sets the contents of self to the encoded representation of the
|
||
|
// cleartext, replacing the previous value of self. The encoded
|
||
|
// representation will be the same length, in characters, as the
|
||
|
// cleartext.
|
||
|
//
|
||
|
// clearText - in, un-encoded text to be encoded. May be empty string, but
|
||
|
// not a null pointer.
|
||
|
|
||
|
void
|
||
|
Encode(const WCHAR* cleartext);
|
||
|
|
||
|
|
||
|
|
||
|
// Returns the length, in unicode characters, of the text.
|
||
|
|
||
|
size_type
|
||
|
GetLength() const
|
||
|
{
|
||
|
return cypherText.Length;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// Replaces the contents of self with a copy of the contents of rhs.
|
||
|
// Returns *this.
|
||
|
|
||
|
const EncodedString&
|
||
|
operator= (const EncodedString& rhs);
|
||
|
|
||
|
|
||
|
|
||
|
// Compares the cleartext representations of self and rhs, and returns
|
||
|
// true if they are lexicographically the same: the lengths are the same
|
||
|
// and all the characters are the same.
|
||
|
|
||
|
bool
|
||
|
operator== (const EncodedString& rhs) const;
|
||
|
|
||
|
|
||
|
|
||
|
bool
|
||
|
operator!= (const EncodedString& rhs) const
|
||
|
{
|
||
|
return !(operator==(rhs));
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
private:
|
||
|
|
||
|
|
||
|
|
||
|
// scribbles out and frees the internal string.
|
||
|
|
||
|
void
|
||
|
Reset();
|
||
|
|
||
|
|
||
|
|
||
|
// builds the internal encoded representation from the cleartext.
|
||
|
//
|
||
|
// clearText - in, un-encoded text to be encoded. May be empty string, but
|
||
|
// not a null pointer.
|
||
|
|
||
|
void
|
||
|
Init(const WCHAR* clearText);
|
||
|
|
||
|
|
||
|
|
||
|
// We deliberately do not implement conversion to or from wchar_t* or
|
||
|
// String. This is to force the user of the class to be very deliberate
|
||
|
// about decoding the string. class String is a copy-on-write shared
|
||
|
// reference implementation, and we don't want to make it easy to create
|
||
|
// "hidden" copies of cleartext, or move from one representation to
|
||
|
// another, or accidentally get a String filled with encoded text.
|
||
|
|
||
|
// deliberately commented out
|
||
|
// explicit
|
||
|
// EncodedString(const String& cleartext);
|
||
|
|
||
|
operator WCHAR* ();
|
||
|
operator String ();
|
||
|
|
||
|
|
||
|
|
||
|
// In the course of encoding, decoding, and assigning to the instance,
|
||
|
// we may create and destroy these, but logically the string is "const"
|
||
|
|
||
|
mutable UCHAR seed;
|
||
|
mutable UNICODE_STRING cypherText;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
#endif // ENCODEDSTRING_HPP_INCLUDED
|
||
|
|
||
|
|
||
|
|