cypher.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:17k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * cypher.h
  3.  *
  4.  * Encryption support classes.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: cypher.h,v $
  30.  * Revision 1.12  1999/03/09 08:01:46  robertj
  31.  * Changed comments for doc++ support (more to come).
  32.  *
  33.  * Revision 1.11  1999/02/16 08:07:10  robertj
  34.  * MSVC 6.0 compatibility changes.
  35.  *
  36.  * Revision 1.10  1998/09/23 06:19:24  robertj
  37.  * Added open source copyright license.
  38.  *
  39.  * Revision 1.9  1997/10/10 10:44:01  robertj
  40.  * Fixed bug in password encryption, missing string terminator.
  41.  *
  42.  * Revision 1.8  1996/11/16 10:50:24  robertj
  43.  * Fixed bug in registration order form showing incorrect check code when have key.
  44.  *
  45.  * Revision 1.7  1996/07/15 10:29:38  robertj
  46.  * Changed memory block cypher conversion functions to be void *.
  47.  * Changed key types to be structures rather than arrays to avoid pinter/reference confusion by compilers.
  48.  *
  49.  * Revision 1.6  1996/03/17 05:47:00  robertj
  50.  * Changed secured config to allow for expiry dates.
  51.  *
  52.  * Revision 1.5  1996/03/16 04:36:43  robertj
  53.  * Redesign of secure config to accommodate expiry dates and option values passed in security key code.
  54.  *
  55.  * Revision 1.4  1996/02/25 02:52:46  robertj
  56.  * Further secure config development.
  57.  *
  58.  * Revision 1.3  1996/01/28 14:16:11  robertj
  59.  * Further implementation of secure config.
  60.  *
  61.  * Revision 1.2  1996/01/28 02:41:00  robertj
  62.  * Removal of MemoryPointer classes as usage didn't work for GNU.
  63.  * Added the secure configuration mechanism for protecting applications.
  64.  *
  65.  * Revision 1.1  1996/01/23 13:04:20  robertj
  66.  * Initial revision
  67.  *
  68.  */
  69. #ifndef _PCYPHER
  70. #define _PCYPHER
  71. #ifdef __GNUC__
  72. #pragma interface
  73. #endif
  74. /** MD5 Message Digest.
  75.  A class to produce a Message Digest for a block of text/data using the
  76.  MD5 algorithm as defined in RFC1321 by Ronald Rivest of MIT Laboratory
  77.  for Computer Science and RSA Data Security, Inc.
  78.  */
  79. class PMessageDigest5 : public PObject
  80. {
  81.   PCLASSINFO(PMessageDigest5, PObject)
  82.   public:
  83.     /// Create a new message digestor
  84.     PMessageDigest5();
  85.     /// Begin a Message Digest operation, initialising the object instance.
  86.     void Start();
  87.     /** Incorporate the specified data into the message digest. */
  88.     void Process(
  89.       const PString & str      /// String to be part of the MD5
  90.     );
  91.     /** Incorporate the specified data into the message digest. */
  92.     void Process(
  93.       const char * cstr        /// C String to be part of the MD5
  94.     );
  95.     /** Incorporate the specified data into the message digest. */
  96.     void Process(
  97.       const PBYTEArray & data  /// Data block to be part of the MD5
  98.     );
  99.     /** Incorporate the specified data into the message digest. */
  100.     void Process(
  101.       const void * dataBlock,  /// Pointer to data to be part of the MD5
  102.       PINDEX length            /// Length of the data block.
  103.     );
  104.     /// Resultant 128 bit digest of input data.
  105.     class Code {
  106.       private:
  107.         PUInt32l value[4];
  108.       friend class PMessageDigest5;
  109.     };
  110.     /**
  111.     Complete the message digest and return the magic number result.
  112.     The parameterless form returns the MD5 code as a Base64 string.
  113.     
  114.     @return
  115.        Base64 encoded MD5 code for the processed data.
  116.     */
  117.     PString Complete();
  118.     void Complete(
  119.       Code & result   /// The resultant 128 bit MD5 code
  120.     );
  121.     /** Encode the data in memory to and MD5 hash value. */
  122.     static PString Encode(
  123.       const PString & str      /// String to be encoded to MD5
  124.     );
  125.     /** Encode the data in memory to and MD5 hash value. */
  126.     static void Encode(
  127.       const PString & str,     /// String to be encoded to MD5
  128.       Code & result            /// The resultant 128 bit MD5 code
  129.     );
  130.     /** Encode the data in memory to and MD5 hash value. */
  131.     static PString Encode(
  132.       const char * cstr        /// C String to be encoded to MD5
  133.     );
  134.     /** Encode the data in memory to and MD5 hash value. */
  135.     static void Encode(
  136.       const char * cstr,       /// C String to be encoded to MD5
  137.       Code & result            /// The resultant 128 bit MD5 code
  138.     );
  139.     /** Encode the data in memory to and MD5 hash value. */
  140.     static PString Encode(
  141.       const PBYTEArray & data  /// Data block to be encoded to MD5
  142.     );
  143.     /** Encode the data in memory to and MD5 hash value. */
  144.     static void Encode(
  145.       const PBYTEArray & data, /// Data block to be encoded to MD5
  146.       Code & result            /// The resultant 128 bit MD5 code
  147.     );
  148.     /** Encode the data in memory to and MD5 hash value. */
  149.     static PString Encode(
  150.       const void * dataBlock,  /// Pointer to data to be encoded to MD5
  151.       PINDEX length            /// Length of the data block.
  152.     );
  153.     /** Encode the data in memory to and MD5 hash value.
  154.     
  155.     @return
  156.        Base64 encoded MD5 code for the processed data.
  157.     */
  158.     static void Encode(
  159.       const void * dataBlock,  /// Pointer to data to be encoded to MD5
  160.       PINDEX length,           /// Length of the data block.
  161.       Code & result            /// The resultant 128 bit MD5 code
  162.     );
  163.   private:
  164.     void Transform(const BYTE * block);
  165.     /// input buffer
  166.     BYTE buffer[64];
  167.     /// state (ABCD)
  168.     DWORD state[4];
  169.     /// number of bits, modulo 2^64 (lsb first)
  170.     PUInt64 count;
  171. };
  172. /**This abstract class defines an encryption/decryption algortihm.
  173. A specific algorithm is implemented in a descendent class.
  174. */
  175. class PCypher : public PObject
  176. {
  177.   PCLASSINFO(PCypher, PObject)
  178.   public:
  179.     /// Mechanism by which sequential blocks are linked.
  180.     enum BlockChainMode {
  181.       ElectronicCodebook,
  182.         ECB = ElectronicCodebook,
  183.       CypherBlockChaining,
  184.         CBC = CypherBlockChaining,
  185.       OutputFeedback,
  186.         OFB = OutputFeedback,
  187.       CypherFeedback,
  188.         CFB = CypherFeedback,
  189.       NumBlockChainModes
  190.     };
  191.   // New functions for class
  192.     /**Encode the data. */
  193.     PString Encode(
  194.       const PString & str       /// Clear text string to be encoded.
  195.     );
  196.     /**Encode the data. */
  197.     PString Encode(
  198.       const PBYTEArray & clear  /// Clear text binary data to be encoded.
  199.     );
  200.     /**Encode the data. */
  201.     PString Encode(
  202.       const void * data,        /// Clear text binary data to be encoded.
  203.       PINDEX length             /// Number of bytes of data to be encoded.
  204.     );
  205.     /**Encode the data. */
  206.     void Encode(
  207.       const PBYTEArray & clear, /// Clear text binary data to be encoded.
  208.       PBYTEArray & coded        /// Encoded data.
  209.     );
  210.     /**Encode the data.
  211.     The data is encoded using the algorithm embodied by the descendent class
  212.     and the key specifed in the construction of the objects instance.
  213.     The first form takes a string and returns an encoded string. The second
  214.     form takes arbitrary binary data bytes and returns an encoded string. In
  215.     both cases the encoded string is always 7 bit printable ASCII suitable
  216.     for use in mail systems etc.
  217.     The final form takes and arbitrary block of bytes and encodes them into
  218.     another block of binary data.
  219.     
  220.     @return
  221.       encoded string.
  222.     */
  223.     void Encode(
  224.       const void * data,        // Clear text binary data to be encoded.
  225.       PINDEX length,            // Number of bytes of data to be encoded.
  226.       PBYTEArray & coded        // Encoded data.
  227.     );
  228.     /**Decode the data. */
  229.     PString Decode(
  230.       const PString & cypher   /// Base64 Cypher text string to be decoded.
  231.     );
  232.     /**Decode the data. */
  233.     BOOL Decode(
  234.       const PString & cypher,  /// Base64 Cypher text string to be decoded.
  235.       PString & clear          /// Clear text string decoded.
  236.     );
  237.     /**Decode the data. */
  238.     BOOL Decode(
  239.       const PString & cypher,  /// Base64 Cypher text string to be decoded.
  240.       PBYTEArray & clear       /// Clear text binary data decoded.
  241.     );
  242.     /**Decode the data. */
  243.     PINDEX Decode(
  244.       const PString & cypher,  /// Base64 Cypher text string to be decoded.
  245.       void * data,             /// Clear text binary data decoded.
  246.       PINDEX length            /// Maximum number of bytes of data decoded.
  247.     );
  248.     /**Decode the data. */
  249.     PINDEX Decode(
  250.       const PBYTEArray & coded, /// Encoded data (cyphertext).
  251.       void * data,              /// Clear text binary data decoded.
  252.       PINDEX length             /// Maximum number of bytes of data decoded.
  253.     );
  254.     /**Decode the data.
  255.     Decode the data using the algorithm embodied by the descendent class
  256.     and the key specifed in the construction of the objects instance.
  257.     The first form takes a string and returns a decoded string. The second
  258.     form takes an encoded string and returns arbitrary binary data bytes. In
  259.     both cases the encoded string is always 7 bit printable ASCII suitable
  260.     for use in mail systems etc.
  261.     The final form takes and arbitrary block of bytes and decodes them into
  262.     another block of binary data.
  263.     
  264.     @return
  265.       decoded string.
  266.     */
  267.     BOOL Decode(
  268.       const PBYTEArray & coded, /// Encoded data (cyphertext).
  269.       PBYTEArray & clear       /// Clear text binary data decoded.
  270.     );
  271.   protected:
  272.     /**
  273.     Create a new encryption object instance.
  274.     */
  275.     PCypher(
  276.       PINDEX blockSize,          /// Size of encryption blocks (in bits)
  277.       BlockChainMode chainMode   /// Block chain mode
  278.     );
  279.     PCypher(
  280.       const void * keyData,    /// Key for the encryption/decryption algorithm.
  281.       PINDEX keyLength,        /// Length of the key.
  282.       PINDEX blockSize,        /// Size of encryption blocks (in bits)
  283.       BlockChainMode chainMode /// Block chain mode
  284.     );
  285.     /** Initialise the encoding/decoding sequence. */
  286.     virtual void Initialise(
  287.       BOOL encoding   /// Flag for encoding/decoding sequence about to start.
  288.     ) = 0;
  289.     /** Encode an n bit block of memory according to the encryption algorithm. */
  290.     virtual void EncodeBlock(
  291.       const void * in,    /// Pointer to clear n bit block.
  292.       void * out          /// Pointer to coded n bit block.
  293.     ) = 0;
  294.     /** Dencode an n bit block of memory according to the encryption algorithm. */
  295.     virtual void DecodeBlock(
  296.       const void * in,  /// Pointer to coded n bit block.
  297.       void * out        /// Pointer to clear n bit block.
  298.     ) = 0;
  299.     /// Key for the encryption/decryption.
  300.     PBYTEArray key;
  301.     /// Size of each encryption block in bytes
  302.     PINDEX blockSize;
  303.     /// Mode for sequential encryption each block
  304.     BlockChainMode chainMode;
  305. };
  306. /** Tiny Encryption Algorithm.
  307. This class implements the Tiny Encryption Algorithm by David Wheeler and
  308. Roger Needham at Cambridge University.
  309. This is a simple algorithm using a 128 bit binary key and encrypts data in
  310. 64 bit blocks.
  311. */
  312. class PTEACypher : public PCypher
  313. {
  314.   PCLASSINFO(PTEACypher, PCypher)
  315.   public:
  316.     struct Key {
  317.       BYTE value[16];
  318.     };
  319.     /**
  320.     Create a new TEA encryption object instance. The parameterless version
  321.     automatically generates a new, random, key.
  322.     */
  323.     PTEACypher(
  324.       BlockChainMode chainMode = ElectronicCodebook   /// Block chain mode
  325.     );
  326.     PTEACypher(
  327.       const Key & keyData,     /// Key for the encryption/decryption algorithm.
  328.       BlockChainMode chainMode = ElectronicCodebook   /// Block chain mode
  329.     );
  330.     /** Set the key used by this encryption method. */
  331.     void SetKey(
  332.       const Key & newKey    /// Variable to take the key used by cypher.
  333.     );
  334.     /** Get the key used by this encryption method. */
  335.     void GetKey(
  336.       Key & newKey    /// Variable to take the key used by cypher.
  337.     ) const;
  338.     /** Generate a new key suitable for use for encryption using random data. */
  339.     static void GenerateKey(
  340.       Key & newKey    /// Variable to take the newly generated key.
  341.     );
  342.   protected:
  343.     /** Initialise the encoding/decoding sequence. */
  344.     virtual void Initialise(
  345.       BOOL encoding   /// Flag for encoding/decoding sequence about to start.
  346.     );
  347.     /** Encode an n bit block of memory according to the encryption algorithm. */
  348.     virtual void EncodeBlock(
  349.       const void * in,  /// Pointer to clear n bit block.
  350.       void * out        /// Pointer to coded n bit block.
  351.     );
  352.     /** Decode an n bit block of memory according to the encryption algorithm. */
  353.     virtual void DecodeBlock(
  354.       const void * in,  /// Pointer to coded n bit block.
  355.       void * out        /// Pointer to clear n bit block.
  356.     );
  357.   private:
  358.     DWORD k0, k1, k2, k3;
  359. };
  360. class PSecureConfig : public PConfig
  361. {
  362.   PCLASSINFO(PSecureConfig, PConfig)
  363. /* This class defines a set of configuration keys which may be secured by an
  364.    encrypted hash function. Thus values contained in keys specified by this
  365.    class cannot be changed without invalidating the hash function.
  366.  */
  367.   public:
  368.     PSecureConfig(
  369.       const PTEACypher::Key & productKey,    // Key to decrypt validation code.
  370.       const PStringArray    & securedKeys,   // List of secured keys.
  371.       Source src = Application        // Standard source for the configuration.
  372.     );
  373.     PSecureConfig(
  374.       const PTEACypher::Key & productKey,   // Key to decrypt validation code.
  375.       const char * const * securedKeyArray, // List of secured keys.
  376.       PINDEX count,                         // Number of secured keys in list.
  377.       Source src = Application        // Standard source for the configuration.
  378.     );
  379.     /* Create a secured configuration. The default section for the
  380.        configuration keys is "Secured Options", the default security key is
  381.        "Validation" and the defualt prefix string is "Pending:".
  382.        The user can descend from this class and change any of the member
  383.        variable for the names of keys or the configuration file section.
  384.      */
  385.   // New functions for class
  386.     const PStringArray & GetSecuredKeys() const { return securedKeys; }
  387.     /* Get the list of secured keys in the configuration file section.
  388.        @return
  389.        Array of  strings for the secured keys.
  390.      */
  391.     const PString & GetSecurityKey() const { return securityKey; }
  392.     /* Get the security keys name in the configuration file section.
  393.        @return
  394.        String for the security values key.
  395.      */
  396.     const PString & GetExpiryDateKey() const { return expiryDateKey; }
  397.     /* Get the expiry date keys name in the configuration file section.
  398.        @return
  399.        String for the expiry date values key.
  400.      */
  401.     const PString & GetOptionBitsKey() const { return optionBitsKey; }
  402.     /* Get the Option Bits keys name in the configuration file section.
  403.        @return
  404.        String for the Option Bits values key.
  405.      */
  406.     const PString & GetPendingPrefix() const { return pendingPrefix; }
  407.     /* Get the pending prefix name in the configuration file section.
  408.        @return
  409.        String for the pending prefix.
  410.      */
  411.     void GetProductKey(
  412.       PTEACypher::Key & productKey  // Variable to receive the product key.
  413.     ) const;
  414.     /* Get the pending prefix name in the configuration file section.
  415.        @return
  416.        String for the pending prefix.
  417.      */
  418.     enum ValidationState {
  419.       Defaults,
  420.       Pending,
  421.       IsValid,
  422.       Expired,
  423.       Invalid
  424.     };
  425.     ValidationState GetValidation() const;
  426.     /* Check the current values attached to the keys specified in the
  427.        constructor against an encoded validation key.
  428.        @return
  429.        State of the validation keys.
  430.      */
  431.     BOOL ValidatePending();
  432.     /* Validate a pending secured option list for the product. All secured
  433.        keys with the <CODE>pendingPrefix</CODE> name will be checked against
  434.        the value of the field <CODE>securityKey</CODE>. If they match then
  435.        they are copied to the secured variables.
  436.        @return
  437.        TRUE if secure key values are valid.
  438.      */
  439.     void ResetPending();
  440.     /* "Unvalidate" a security configuration going back to a pending state,
  441.        usually used after an <CODE>Invalid</CODE> response was recieved from
  442.        the <A>GetValidation()</A> function.
  443.      */
  444.   protected:
  445.     PTEACypher::Key productKey;
  446.     PStringArray    securedKeys;
  447.     PString         securityKey;
  448.     PString         expiryDateKey;
  449.     PString         optionBitsKey;
  450.     PString         pendingPrefix;
  451. };
  452. #endif // _PCYPHER
  453. // End Of File ///////////////////////////////////////////////////////////////