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