123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- #ifndef _CLIENTCDKEY_H
- #define _CLIENTCDKEY_H
- // ClientCDKey
- // Class that implements WON CD-Key functionality for use by clients. Allows
- // conversion to/from human readable string. Implements persistance to the registry
- // in a secure manner. Implements a lightweight validation check of the key.
- #include "../common/won.h"
- #include <ostream>
- // Forwards
- namespace WONCrypt {
- class BFSymmetricKey;
- };
- // In WONCDKey namespace
- namespace WONCDKey
- {
- class ClientCDKey
- {
- public:
- // Standard constructor
- // ProductName is string representing product using the CDKey, (i.e., "Homeworld")
- // *IMPORTANT* product must be at least 3 chars for good security!!!
- explicit ClientCDKey(const std::string& theProductR);
- // Copy Constructor
- ClientCDKey(const ClientCDKey& theKeyR);
- // Destructor
- virtual ~ClientCDKey();
- // Operators
- ClientCDKey& operator=(const ClientCDKey& theKeyR);
- bool operator==(const ClientCDKey& theKeyR) const;
- bool operator!=(const ClientCDKey& theKeyR) const;
- // Product access. Careful setting product. Product is used to encrypt/decypt
- // the key to/from its binary form and for the Lightweight check.
- const std::string& GetProduct() const;
- void SetProduct(const std::string& theProductR);
- // Check two keys for equality
- virtual bool IsEqual(const ClientCDKey& theKeyR) const;
- // Check validity of a key, performs lightweight check if needed.
- virtual bool IsValid() const;
- // Is this a beta key?
- bool IsBeta() const;
- // Init from raw, unencrypted key. A return of true DOES NOT imply key is valid!
- // (Call IsValid() to verify validity).
- virtual bool Init(const __int64& theKeyR);
- // Initialize from Human readable string (dashes are optional):
- // CVCN-CVCN-CVCN-CVCN-NNNN
- // Returns true if init is successful, false if not. A return of true DOES NOT
- // imply key is valid! (Call IsValid() to verify validity).
- virtual bool Init(const std::string& theStrR);
- // Init from encrypted binary image (what is returned by AsBinary). A return of
- // true DOES NOT imply key is valid! (Call IsValid() to verify validity).
- virtual bool Init(const WONCommon::RawBuffer& theKeyR);
- // Fetch as raw, unencrypted (64bit) key
- __int64 AsRaw() const;
- // Fetch as human readable string. Validates key if needed if validate is true.
- // If Keys fails to validate, returns "#######INVALID KEY######"
- const std::string& AsString(bool validate=true) const;
- // Fetch as encrypted binary image. Valdates key if needed. Returns empty
- // buffer if key is not valid.
- const WONCommon::RawBuffer& AsBinary() const;
- // Load/Save key in registry securely (key is encrypted in the registry)
- virtual bool Load();
- virtual bool Save() const;
- // Clean key from registry
- virtual bool CleanReg();
- protected:
- // Types
- enum ValidityState { Unknown, Invalid, Valid };
- // Members
- std::string mProduct; // Product string
- unsigned char mLightCheck; // Lightweight checksum
- WONCommon::RawBuffer mKey; // Key value
- mutable ValidityState mValidity; // Current key validity
- // Buffers for string and binary versions of key
- mutable std::string mStrKey; // CD-Key as string
- mutable WONCommon::RawBuffer mBinKey; // CD-Key as encrypted binary
- // Perform the light validity check. Returns light checksum
- unsigned char LightValidityCheck() const;
- // Build human readable string rep of CDKey. Fills in mStrKey
- void BuildStringKey() const;
- // Extract LightCheck, and Key from a buffer
- void FieldsFromBuffer(const __int64& theBuf);
- // Build buffer from LightCheck and Key
- __int64 BufferFromFields() const;
- // Decypt mBin Key into buffer
- bool DecryptKey(__int64& theBufR);
- // Encrypt buffer into mBinKey
- bool EncryptKey(const __int64& theBufR) const;
- private:
- // Methods
- void BuildCChar(const __int64& theBuf, unsigned int& theOffset) const;
- void BuildVChar(const __int64& theBuf, unsigned int& theOffset) const;
- void BuildNChar(const __int64& theBuf, unsigned int& theOffset) const;
- void CreateSymmetricKey(WONCrypt::BFSymmetricKey& theSymKeyR) const;
- // Class methods
- static void RemoveSkipChars(string& theStrR);
- static char ValFromBits(const __int64& aBuf, unsigned int theOffset, unsigned int theBits);
- static bool ProcessCChar(__int64& theBuf, unsigned int& theOffset, char theChar);
- static bool ProcessVChar(__int64& theBuf, unsigned int& theOffset, char theChar);
- static bool ProcessNChar(__int64& theBuf, unsigned int& theOffset, char theChar);
- };
- // Inlines
- inline bool
- ClientCDKey::operator==(const ClientCDKey& theKeyR) const
- { return IsEqual(theKeyR); }
- inline bool
- ClientCDKey::operator!=(const ClientCDKey& theKeyR) const
- { return (! IsEqual(theKeyR)); }
- inline const std::string&
- ClientCDKey::GetProduct() const
- { return mProduct; }
- inline void
- ClientCDKey::SetProduct(const std::string& theProductR)
- { mProduct = theProductR; }
- inline __int64
- ClientCDKey::AsRaw() const
- { return BufferFromFields(); }
- }; //namespace WONCDKey
- // Output operators
- inline std::ostream&
- operator<<(std::ostream& os, const WONCDKey::ClientCDKey& theKeyR)
- { os << theKeyR.AsString(); return os; }
- #endif
|