Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

ElGamal.h

00001 /*
00002  * Copyright 2003 Michael A. Marsh, Cornell University. All rights reserved.
00003  * This software is released under the modified BSD license.
00004  * See the file LICENSE in the top-level directory for details.
00005  */
00006 //
00007 // $Id: ElGamal.h,v 1.4 2005/01/21 19:44:16 mmarsh Exp $
00008 //
00009 // $Log: ElGamal.h,v $
00010 // Revision 1.4  2005/01/21 19:44:16  mmarsh
00011 // Updated for compatibility with Doxygen 1.4.1
00012 //
00013 // Revision 1.3  2004/05/19 15:56:47  mmarsh
00014 // *** empty log message ***
00015 //
00016 // Revision 1.2  2003/11/04 22:08:54  mmarsh
00017 // General code cleanup.
00018 //
00019 //
00020 
00021 #ifndef __CODEX_CIPHERS_ELGAMAL_H__
00022 #define __CODEX_CIPHERS_ELGAMAL_H__
00023 
00024 #include <openssl/bn.h>
00025 #include "CODEX_ASN1/Base.h"
00026 #include "CODEX_ASN1/BigNumber.h"
00027 #include "CODEX_ASN1/SecureBigNumber.h"
00028 #include "HashFunction.h"
00029 
00030 namespace CODEX_Ciphers
00031 {
00037    class ElGamalCipherText : public CODEX_ASN1::Base
00038    {
00039       public:
00041          ElGamalCipherText();
00043          ElGamalCipherText( BIGNUM * c1, BIGNUM * c2 );
00045          ElGamalCipherText( const CODEX_ASN1::BigNumber& c1,
00046                             const CODEX_ASN1::BigNumber& c2 );
00048          ElGamalCipherText( const ElGamalCipherText& aCT );
00050          virtual ~ElGamalCipherText();
00051 
00053          void operator=( const ElGamalCipherText& aCT );
00054 
00056          bool operator<( const ElGamalCipherText& aCT ) const;
00057 
00059          bool operator==( const ElGamalCipherText& aCT ) const;
00060 
00062          bool operator!=( const ElGamalCipherText& aCT ) const;
00063 
00065          const CODEX_ASN1::BigNumber& c1() const { return m_c1; }
00067          const CODEX_ASN1::BigNumber& c2() const { return m_c2; }
00068 
00076          ElGamalCipherText* blind(
00077             const ElGamalCipherText& aOther,
00078             const CODEX_ASN1::BigNumber& modulus ) const;
00079 
00081          int marshal( unsigned char ** pp ) const;
00083          void* unmarshal( void* bogus, unsigned char ** pp, long length );
00084 
00085       private:
00086          CODEX_ASN1::BigNumber m_c1;
00087          CODEX_ASN1::BigNumber m_c2;
00088    };
00089 
00097    class ElGamalSchnorrCipherText : public ElGamalCipherText
00098    {
00099       public:
00101          ElGamalSchnorrCipherText();
00103          ElGamalSchnorrCipherText( BIGNUM * c1, BIGNUM * c2,
00104                                    BIGNUM * h, BIGNUM * z );
00106          ElGamalSchnorrCipherText( const CODEX_ASN1::BigNumber& c1,
00107                                    const CODEX_ASN1::BigNumber& c2,
00108                                    const CODEX_ASN1::BigNumber& h,
00109                                    const CODEX_ASN1::BigNumber& z );
00111          ElGamalSchnorrCipherText( const ElGamalSchnorrCipherText& aCT );
00113          virtual ~ElGamalSchnorrCipherText();
00114 
00116          void operator=( const ElGamalSchnorrCipherText& aCT );
00117 
00119          const CODEX_ASN1::BigNumber& h() const { return m_h; }
00121          const CODEX_ASN1::BigNumber& z() const { return m_z; }
00122 
00137          bool verify( const CODEX_ASN1::BigNumber& g,
00138                       const CODEX_ASN1::BigNumber& p,
00139                       const CODEX_ASN1::Base& id,
00140                       const HashFunction& hashFunc ) const;
00141 
00143          int marshal( unsigned char ** pp ) const;
00145          void* unmarshal( void* bogus, unsigned char ** pp, long length );
00146 
00147       private:
00148          CODEX_ASN1::BigNumber m_h;
00149          CODEX_ASN1::BigNumber m_z;
00150    };
00151 
00157    class ElGamalSignature : public CODEX_ASN1::Base
00158    {
00159       public:
00161          ElGamalSignature();
00163          ElGamalSignature( BIGNUM * r, BIGNUM * s );
00165          ElGamalSignature( const CODEX_ASN1::BigNumber& r,
00166                            const CODEX_ASN1::BigNumber& s );
00168          ElGamalSignature( const ElGamalSignature& aSig );
00170          virtual ~ElGamalSignature();
00171 
00173          void operator=( const ElGamalSignature& aSig );
00174 
00176          const CODEX_ASN1::BigNumber& r() const { return m_r; }
00178          const CODEX_ASN1::BigNumber& s() const { return m_s; }
00179 
00181          int marshal( unsigned char ** pp ) const;
00183          void* unmarshal( void* bogus, unsigned char ** pp, long length );
00184 
00185       private:
00186          CODEX_ASN1::BigNumber m_r; 
00187          CODEX_ASN1::BigNumber m_s; 
00188    };
00189 
00193    class ElGamalPublicKey : public CODEX_ASN1::Base
00194    {
00195       public:
00197          ElGamalPublicKey();
00199          ElGamalPublicKey( BIGNUM * p, BIGNUM * g, BIGNUM * y );
00201          ElGamalPublicKey( const CODEX_ASN1::BigNumber& p,
00202                            const CODEX_ASN1::BigNumber& g,
00203                            const CODEX_ASN1::BigNumber& y );
00205          ElGamalPublicKey( const ElGamalPublicKey& aKey );
00207          virtual ~ElGamalPublicKey();
00208 
00210          void operator=( const ElGamalPublicKey& aKey );
00211 
00213          const CODEX_ASN1::BigNumber& p() const { return m_p; }
00215          const CODEX_ASN1::BigNumber& g() const { return m_g; }
00217          const CODEX_ASN1::BigNumber& y() const { return m_y; }
00223          const BIGNUM * p1() const;
00229          const BIGNUM * q() const;
00230 
00256          ElGamalCipherText* encrypt( const BIGNUM * message,
00257                                      BIGNUM * k=0 ) const;
00258 
00293          ElGamalSchnorrCipherText* encryptS( const BIGNUM * message,
00294                                              const CODEX_ASN1::Base& id,
00295                                              const HashFunction& hashFunc,
00296                                              BIGNUM * k=0 ) const;
00297 
00316          bool verifySignature( const ElGamalSignature& signature,
00317                                const BIGNUM * message ) const;
00318 
00320          int marshal( unsigned char ** pp ) const;
00322          void* unmarshal( void* bogus, unsigned char ** pp, long length );
00323 
00330          void toFile(const char* fname) const;
00331 
00338          void* fromFile(const char* fname);
00339 
00340       protected :
00353          void encryptVals( const BIGNUM * message ,
00354                            BIGNUM * k ,
00355                            BIGNUM * c1 ,
00356                            BIGNUM * c2 ) const;
00357 
00358       private:
00359          CODEX_ASN1::BigNumber m_p;
00360          CODEX_ASN1::BigNumber m_g;
00361          CODEX_ASN1::BigNumber m_y;
00362          mutable BIGNUM *      m_p1; // useful at times
00363          mutable BIGNUM *      m_q;  // useful at times
00364    };
00365 
00370    class ElGamalPrivateKey : public CODEX_ASN1::SecureBigNumber
00371    {
00372       public:
00374          ElGamalPrivateKey();
00376          ElGamalPrivateKey( BIGNUM * x );
00378          ElGamalPrivateKey( const CODEX_ASN1::BigNumber& x );
00380          ElGamalPrivateKey( const ElGamalPrivateKey& aKey );
00382          virtual ~ElGamalPrivateKey();
00383 
00385          const CODEX_ASN1::SecureBigNumber& x() const { return *this; }
00386 
00404          BIGNUM * decrypt( const ElGamalCipherText& cipherText,
00405                            const ElGamalPublicKey& publicKey ) const;
00431          ElGamalSignature* sign( const BIGNUM * message,
00432                                  const ElGamalPublicKey& publicKey ) const;
00433 
00440          void toFile(const char* fname) const;
00441 
00448          void* fromFile(const char* fname);
00449    };
00450 
00454    class ElGamalKeyPairGenerator
00455    {
00456       public:
00458          ElGamalKeyPairGenerator( long numBits ) : m_numBits( numBits ) {}
00459 
00482          void operator()( ElGamalPublicKey*& pubKey,
00483                           ElGamalPrivateKey*& privKey,
00484                           BIGNUM * p=0,
00485                           BIGNUM * g=0 );
00486 
00487       private:
00488          long m_numBits;
00489    };
00490 
00491 }
00492 
00493 #endif /* __CODEX_CIPHERS_ELGAMAL_H__ */

Generated on Fri May 6 17:39:11 2005 for COrnell Data EXchange (CODEX) by  doxygen 1.4.1