00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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;
00360 mutable BIGNUM * m_q;
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