Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound 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.3 2004/05/19 15:56:47 mmarsh Exp $
00008 //
00009 // $Log: ElGamal.h,v $
00010 // Revision 1.3  2004/05/19 15:56:47  mmarsh
00011 // *** empty log message ***
00012 //
00013 // Revision 1.2  2003/11/04 22:08:54  mmarsh
00014 // General code cleanup.
00015 //
00016 //
00017 
00018 #ifndef __CODEX_CIPHERS_ELGAMAL_H__
00019 #define __CODEX_CIPHERS_ELGAMAL_H__
00020 
00021 #include <openssl/bn.h>
00022 #include "CODEX_ASN1/Base.h"
00023 #include "CODEX_ASN1/BigNumber.h"
00024 #include "CODEX_ASN1/SecureBigNumber.h"
00025 #include "HashFunction.h"
00026 
00027 namespace CODEX_Ciphers
00028 {
00034    class ElGamalCipherText : public CODEX_ASN1::Base
00035    {
00036       public:
00038          ElGamalCipherText();
00040          ElGamalCipherText( BIGNUM * c1, BIGNUM * c2 );
00042          ElGamalCipherText( const CODEX_ASN1::BigNumber& c1,
00043                             const CODEX_ASN1::BigNumber& c2 );
00045          ElGamalCipherText( const ElGamalCipherText& aCT );
00047          virtual ~ElGamalCipherText();
00048 
00050          void operator=( const ElGamalCipherText& aCT );
00051 
00053          bool operator<( const ElGamalCipherText& aCT ) const;
00054 
00056          bool operator==( const ElGamalCipherText& aCT ) const;
00057 
00059          bool operator!=( const ElGamalCipherText& aCT ) const;
00060 
00062          const CODEX_ASN1::BigNumber& c1() const { return m_c1; }
00064          const CODEX_ASN1::BigNumber& c2() const { return m_c2; }
00065 
00073          ElGamalCipherText* blind(
00074             const ElGamalCipherText& aOther,
00075             const CODEX_ASN1::BigNumber& modulus ) const;
00076 
00078          int marshal( unsigned char ** pp ) const;
00080          void* unmarshal( void* bogus, unsigned char ** pp, long length );
00081 
00082       private:
00083          CODEX_ASN1::BigNumber m_c1;
00084          CODEX_ASN1::BigNumber m_c2;
00085    };
00086 
00094    class ElGamalSchnorrCipherText : public ElGamalCipherText
00095    {
00096       public:
00098          ElGamalSchnorrCipherText();
00100          ElGamalSchnorrCipherText( BIGNUM * c1, BIGNUM * c2,
00101                                    BIGNUM * h, BIGNUM * z );
00103          ElGamalSchnorrCipherText( const CODEX_ASN1::BigNumber& c1,
00104                                    const CODEX_ASN1::BigNumber& c2,
00105                                    const CODEX_ASN1::BigNumber& h,
00106                                    const CODEX_ASN1::BigNumber& z );
00108          ElGamalSchnorrCipherText( const ElGamalSchnorrCipherText& aCT );
00110          virtual ~ElGamalSchnorrCipherText();
00111 
00113          void operator=( const ElGamalSchnorrCipherText& aCT );
00114 
00116          const CODEX_ASN1::BigNumber& h() const { return m_h; }
00118          const CODEX_ASN1::BigNumber& z() const { return m_z; }
00119 
00134          bool verify( const CODEX_ASN1::BigNumber& g,
00135                       const CODEX_ASN1::BigNumber& p,
00136                       const CODEX_ASN1::Base& id,
00137                       const HashFunction& hashFunc ) const;
00138 
00140          int marshal( unsigned char ** pp ) const;
00142          void* unmarshal( void* bogus, unsigned char ** pp, long length );
00143 
00144       private:
00145          CODEX_ASN1::BigNumber m_h;
00146          CODEX_ASN1::BigNumber m_z;
00147    };
00148 
00154    class ElGamalSignature : public CODEX_ASN1::Base
00155    {
00156       public:
00158          ElGamalSignature();
00160          ElGamalSignature( BIGNUM * r, BIGNUM * s );
00162          ElGamalSignature( const CODEX_ASN1::BigNumber& r,
00163                            const CODEX_ASN1::BigNumber& s );
00165          ElGamalSignature( const ElGamalSignature& aSig );
00167          virtual ~ElGamalSignature();
00168 
00170          void operator=( const ElGamalSignature& aSig );
00171 
00173          const CODEX_ASN1::BigNumber& r() const { return m_r; }
00175          const CODEX_ASN1::BigNumber& s() const { return m_s; }
00176 
00178          int marshal( unsigned char ** pp ) const;
00180          void* unmarshal( void* bogus, unsigned char ** pp, long length );
00181 
00182       private:
00183          CODEX_ASN1::BigNumber m_r; 
00184          CODEX_ASN1::BigNumber m_s; 
00185    };
00186 
00190    class ElGamalPublicKey : public CODEX_ASN1::Base
00191    {
00192       public:
00194          ElGamalPublicKey();
00196          ElGamalPublicKey( BIGNUM * p, BIGNUM * g, BIGNUM * y );
00198          ElGamalPublicKey( const CODEX_ASN1::BigNumber& p,
00199                            const CODEX_ASN1::BigNumber& g,
00200                            const CODEX_ASN1::BigNumber& y );
00202          ElGamalPublicKey( const ElGamalPublicKey& aKey );
00204          virtual ~ElGamalPublicKey();
00205 
00207          void operator=( const ElGamalPublicKey& aKey );
00208 
00210          const CODEX_ASN1::BigNumber& p() const { return m_p; }
00212          const CODEX_ASN1::BigNumber& g() const { return m_g; }
00214          const CODEX_ASN1::BigNumber& y() const { return m_y; }
00220          const BIGNUM * p1() const;
00226          const BIGNUM * q() const;
00227 
00253          ElGamalCipherText* encrypt( const BIGNUM * message,
00254                                      BIGNUM * k=0 ) const;
00255 
00290          ElGamalSchnorrCipherText* encryptS( const BIGNUM * message,
00291                                              const CODEX_ASN1::Base& id,
00292                                              const HashFunction& hashFunc,
00293                                              BIGNUM * k=0 ) const;
00294 
00313          bool verifySignature( const ElGamalSignature& signature,
00314                                const BIGNUM * message ) const;
00315 
00317          int marshal( unsigned char ** pp ) const;
00319          void* unmarshal( void* bogus, unsigned char ** pp, long length );
00320 
00327          void toFile(const char* fname) const;
00328 
00335          void* fromFile(const char* fname);
00336 
00337       protected :
00350          void encryptVals( const BIGNUM * message ,
00351                            BIGNUM * k ,
00352                            BIGNUM * c1 ,
00353                            BIGNUM * c2 ) const;
00354 
00355       private:
00356          CODEX_ASN1::BigNumber m_p;
00357          CODEX_ASN1::BigNumber m_g;
00358          CODEX_ASN1::BigNumber m_y;
00359          mutable BIGNUM *      m_p1; // useful at times
00360          mutable BIGNUM *      m_q;  // useful at times
00361    };
00362 
00367    class ElGamalPrivateKey : public CODEX_ASN1::SecureBigNumber
00368    {
00369       public:
00371          ElGamalPrivateKey();
00373          ElGamalPrivateKey( BIGNUM * x );
00375          ElGamalPrivateKey( const CODEX_ASN1::BigNumber& x );
00377          ElGamalPrivateKey( const ElGamalPrivateKey& aKey );
00379          virtual ~ElGamalPrivateKey();
00380 
00382          const CODEX_ASN1::SecureBigNumber& x() const { return *this; }
00383 
00401          BIGNUM * decrypt( const ElGamalCipherText& cipherText,
00402                            const ElGamalPublicKey& publicKey ) const;
00428          ElGamalSignature* sign( const BIGNUM * message,
00429                                  const ElGamalPublicKey& publicKey ) const;
00430 
00437          void toFile(const char* fname) const;
00438 
00445          void* fromFile(const char* fname);
00446    };
00447 
00451    class ElGamalKeyPairGenerator
00452    {
00453       public:
00455          ElGamalKeyPairGenerator( long numBits ) : m_numBits( numBits ) {}
00456 
00479          void operator()( ElGamalPublicKey*& pubKey,
00480                           ElGamalPrivateKey*& privKey,
00481                           BIGNUM * p=0,
00482                           BIGNUM * g=0 );
00483 
00484       private:
00485          long m_numBits;
00486    };
00487 
00488 }
00489 
00490 #endif /* __CODEX_CIPHERS_ELGAMAL_H__ */

Generated on Wed Jun 2 16:32:55 2004 for COrnell Data EXchange (CODEX) by doxygen1.2.18