aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.mike/eh43.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.mike/eh43.C')
-rw-r--r--gcc/testsuite/g++.old-deja/g++.mike/eh43.C741
1 files changed, 0 insertions, 741 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/eh43.C b/gcc/testsuite/g++.old-deja/g++.mike/eh43.C
deleted file mode 100644
index c5fbde939d0..00000000000
--- a/gcc/testsuite/g++.old-deja/g++.mike/eh43.C
+++ /dev/null
@@ -1,741 +0,0 @@
-// Build don't link:
-// Special g++ Options: -fexceptions
-
-// testcase to check obstack allocation for cleanups
-
-typedef unsigned char byte;
-typedef unsigned short word16;
-typedef unsigned long word32;
-typedef unsigned char boolean;
-enum {FALSE, TRUE};
-extern "C" {
-extern void __eprintf (const char *, const char *, unsigned, const char *);
-}
-extern "C" {
-typedef unsigned int size_t;
-extern void *memccpy(void *, const void *, int, size_t);
-extern void *memchr(const void *, int, size_t);
-extern void *memset(void *, int, size_t);
-}
-template <class T> struct SecBlock
-{
-public:
- SecBlock(unsigned int size)
- : size(size), ptr((new T [( size )]) ) {}
- ~SecBlock()
- {(memset(( ptr ), 0, ( size )*sizeof(*( ptr ))), delete [] ( ptr )) ;}
- operator T *() const
- {return ptr;}
- T *operator +(unsigned int offset)
- {return ptr+offset;}
- T& operator[](int index)
- {((void) (( index<size ) ? 0 : (__eprintf ("%s:%u: failed assertion `%s'\n", "misc.h" , 31 , "index<size" ), 0) )) ; return ptr[index];}
- const T& operator[](int index) const
- {((void) (( index<size ) ? 0 : (__eprintf ("%s:%u: failed assertion `%s'\n", "misc.h" , 33 , "index<size" ), 0) )) ; return ptr[index];}
- const unsigned int size;
- T *const ptr;
-};
-typedef SecBlock<byte> SecByteBlock;
-void xorbuf(byte *buf, const byte *mask, unsigned int count);
-void byteReverse(word16 *out, const word16 *in, unsigned int byteCount);
-void byteReverse(word32 *out, const word32 *in, unsigned int byteCount);
-inline word16 Invert(const word16 value)
-{
- return (value << 8) | (value >> 8);
-}
-inline word32 Invert(const word32 value)
-{
- word32 work = ((value & 0xFF00FF00L) >> 8) | ((value & 0x00FF00FFL) << 8);
- return (work << 16) | (work >> 16);
-}
-template <class T> inline T min (const T t1, const T t2)
-{
- return (t1 < t2 ? t1 : t2);
-}
-template <class T> inline T max (const T t1, const T t2)
-{
- return (t1 > t2 ? t1 : t2);
-}
-template <class T> inline void swap (T &a, T &b)
-{
- T temp = a;
- a = b;
- b = temp;
-}
-template <class T> inline T rotl(T x, unsigned int y)
-{
- return ((x<<y) | (x>>(sizeof(T)*8-y)));
-}
-template <class T> inline T rotr(T x, unsigned int y)
-{
- return ((x>>y) | (x<<(sizeof(T)*8-y)));
-}
-int BytePrecision(unsigned long);
-int BitPrecision(unsigned long);
-unsigned long Crop(unsigned long, int size);
-enum CipherDir {ENCRYPTION, DECRYPTION};
-class BlockTransformation
-{
-public:
- virtual ~BlockTransformation() {}
- virtual void ProcessBlock(byte *inoutBlock) =0;
- virtual void ProcessBlock(const byte *inBlock, byte *outBlock) =0;
- virtual unsigned int BlockSize() const =0;
-};
-class StreamCipher
-{
-public:
- virtual ~StreamCipher() {}
- virtual byte ProcessByte(byte input) =0;
- virtual void ProcessString(byte *outString, const byte *inString, unsigned int length);
- virtual void ProcessString(byte *inoutString, unsigned int length);
-};
-class RandomAccessStreamCipher : public StreamCipher
-{
-public:
- virtual ~RandomAccessStreamCipher() {}
- virtual void Seek(unsigned long position) =0;
-};
-class RandomNumberGenerator
-{
-public:
- virtual ~RandomNumberGenerator() {}
- virtual byte GetByte() =0;
- virtual int GetBit();
- virtual word32 GetLong(word32 min=0, word32 max=0xffffffffL);
- virtual word16 GetShort(word16 min=0, word16 max=0xffff)
- {return (word16)GetLong(min, max);}
- virtual void GetBlock(byte *output, unsigned int size);
-};
-template <class T> void Shuffle(RandomNumberGenerator &rng, T *array, unsigned int size)
-{
- while (--size)
- swap(array[size], array[(unsigned int)rng.GetLong(0, size)]);
-}
-class HashModule
-{
-public:
- virtual ~HashModule() {}
- virtual void Update(const byte *input, unsigned int length) =0;
- virtual void Final(byte *digest) =0;
- virtual int DigestSize() const =0;
- virtual void CalculateDigest(byte *digest, const byte *input, int length)
- {Update(input, length); Final(digest);}
-};
-class BufferedTransformation
-{
-public:
- virtual ~BufferedTransformation() {}
- virtual unsigned long MaxRetrieveable() =0;
- virtual void TransferTo(BufferedTransformation &target);
- virtual boolean Attachable() {return FALSE;}
- virtual void Detach(BufferedTransformation *) {}
- virtual void Attach(BufferedTransformation *) {}
- virtual void Close() {InputFinished();}
- virtual void Put(byte inByte) =0;
- virtual void Put(const byte *inString, unsigned int length) =0;
- virtual void InputFinished() {}
- void PutShort(word16 value, boolean highFirst=TRUE);
- void PutLong(word32 value, boolean highFirst=TRUE);
- virtual int Get(byte &outByte) =0;
- virtual unsigned int Get(byte *outString, unsigned int getMax) =0;
- int GetShort(word16 &value, boolean highFirst=TRUE);
- int GetLong(word32 &value, boolean highFirst=TRUE);
- unsigned int Skip(unsigned int skipMax);
-};
-class PK_CryptoSystem
-{
-public:
- virtual ~PK_CryptoSystem() {};
- virtual unsigned int MaxPlainTextLength() const =0;
- virtual unsigned int CipherTextLength() const =0;
-};
-class PK_Encryptor : public PK_CryptoSystem
-{
-public:
- virtual void Encrypt(RandomNumberGenerator &rng, const byte *plainText, unsigned int plainTextLength, byte *cipherText) =0;
-};
-class PK_Decryptor : public PK_CryptoSystem
-{
-public:
- virtual unsigned int Decrypt(const byte *cipherText, byte *plainText) =0;
-};
-class PK_SignatureSystem
-{
-public:
- virtual ~PK_SignatureSystem() {};
- virtual unsigned int MaxMessageLength() const =0;
- virtual unsigned int SignatureLength() const =0;
-};
-class PK_Signer : public PK_SignatureSystem
-{
-public:
- virtual void Sign(RandomNumberGenerator &rng, const byte *message, unsigned int messageLen, byte *signature) =0;
-};
-class PK_Verifier : public PK_SignatureSystem
-{
-public:
- virtual boolean Verify(const byte *message, unsigned int messageLen, const byte *signature) =0;
-};
-class ByteQueueNode;
-class ByteQueue : public BufferedTransformation
-{
-public:
- ByteQueue();
- ~ByteQueue();
- unsigned long CurrentSize() const;
- unsigned long MaxRetrieveable()
- {return CurrentSize();}
- void Put(byte inByte);
- void Put(const byte *inString, unsigned int length);
- int Get(byte &outByte);
- unsigned int Get(byte *outString, unsigned int getMax);
-private:
- ByteQueueNode *head, *tail;
-};
-enum ASNTag {INTEGER=0x02, BIT_STRING=0x03, SEQUENCE=0x10};
-enum ASNIdFlag {CONSTRUCTED = 0x20};
-unsigned int DERLengthEncode(unsigned int length, byte *output);
-unsigned int DERLengthEncode(unsigned int length, BufferedTransformation &);
-class BERDecodeErr {};
-boolean BERLengthDecode(BufferedTransformation &, unsigned int &);
-class BERSequenceDecoder : public BufferedTransformation
-{
-public:
- BERSequenceDecoder(BufferedTransformation &inQueue);
- ~BERSequenceDecoder();
- void Put(byte inByte) {}
- void Put(const byte *, unsigned int) {}
- unsigned long MaxRetrieveable()
- {return inQueue.MaxRetrieveable();}
- int Get(byte &outByte)
- {return inQueue.Get(outByte);}
- unsigned int Get(byte *outString, unsigned int getMax)
- {return inQueue.Get(outString, getMax);}
-private:
- BufferedTransformation &inQueue;
- boolean definiteLength;
- unsigned int length;
-};
-class DERSequenceEncoder : public ByteQueue
-{
-public:
- DERSequenceEncoder(BufferedTransformation &outQueue);
- ~DERSequenceEncoder();
-private:
- BufferedTransformation &outQueue;
-};
-extern "C" {
-}
-extern "C" {
-extern void *memmove(void *, const void *, size_t);
-extern char *strcpy(char *, const char *);
-extern char *strncpy(char *, const char *, size_t);
-extern char *strcat(char *, const char *);
-extern char *strncat(char *, const char *, size_t);
-extern int strcmp(const char *, const char *);
-extern int strcoll(const char *, const char *);
-extern int strncmp(const char *, const char *, size_t);
-extern size_t strxfrm(char *, const char *, size_t);
-extern void * __hide_memchr (const void *, int, size_t);
-extern char * __hide_strchr (const char *, int);
-extern size_t strcspn(const char *, const char *);
-extern char * __hide_strpbrk (const char *, const char *);
-extern char * __hide_strrchr (const char *, int);
-extern size_t strspn(const char *, const char *);
-extern char * __hide_strstr (const char *, const char *);
-extern char *strtok(char *, const char *);
-extern void *memset(void *, int, size_t);
-extern char *strerror(int);
-extern void *memccpy(void *, const void *, int, size_t);
-extern char *strdup(const char *);
-extern char *strsignal(int);
-extern int ffs(const int);
-extern int strcasecmp(const char *, const char *);
-extern int strncasecmp(const char *, const char *, size_t);
-}
-typedef int ptrdiff_t;
-extern "C" const char *strchr (const char *, int);
-inline char *
-strchr (char *s, int c)
-{
- return (char*) strchr ((const char *) s, c);
-}
-extern "C" const char *strpbrk (const char *, const char *);
-inline char *
-strpbrk (char *s1, const char *s2)
-{
- return (char *) strpbrk ((const char *) s1, s2);
-}
-extern "C" const char *strrchr (const char *, int);
-inline char *
-strrchr (char *s, int c)
-{
- return (char *) strrchr ((const char *) s, c);
-}
-extern "C" const char *strstr (const char *, const char *);
-inline char *
-strstr (char *s1, const char *s2)
-{
- return (char *) strstr ((const char *) s1, s2);
-}
-extern "C" void *memchr (const void *, int, size_t);
-inline void *
-memchr (void *s, int c, size_t n)
-{
- return (void *) memchr ((const void *) s, c, n);
-}
-typedef word16 unit;
-typedef short signedunit;
-typedef unit *unitptr;
-extern short global_precision;
-boolean mp_addc
- (register unitptr r1,const unit * r2,register boolean carry);
-boolean mp_subb
- (register unitptr r1,const unit * r2,register boolean borrow);
-boolean mp_rotate_left(register unitptr r1,register boolean carry);
-void mp_shift_right_bits(register unitptr r1,register short bits);
-short mp_compare(const unit * r1,const unit * r2);
-boolean mp_inc(register unitptr r);
-boolean mp_dec(register unitptr r);
-void mp_neg(register unitptr r);
-void mp_init(register unitptr r, word16 value);
-short significance(const unit * r);
-int mp_udiv(register unitptr remainder,register unitptr quotient,
- const unit * dividend,const unit * divisor);
-int mp_recip(register unitptr quotient,const unit * divisor);
-int mp_div(register unitptr remainder,register unitptr quotient,
- unit * dividend, unit * divisor);
-word16 mp_shortdiv(register unitptr quotient,
- const unit * dividend,register word16 divisor);
-int mp_mod(register unitptr remainder,
- const unit * dividend,const unit * divisor);
-word16 mp_shortmod(register unitptr dividend,register word16 divisor);
-int mp_mult(register unitptr prod,
- const unit * multiplicand,const unit * multiplier);
-int countbits(const unit * r);
-int stage_peasant_modulus(const unit * n);
-int stage_merritt_modulus(const unit * n);
-int stage_upton_modulus(const unit * n);
-int stage_smith_modulus(const unit * n);
-int peasant_modmult(register unitptr prod,
- const unit * multiplicand,const unit * multiplier);
-int merritt_modmult(register unitptr prod,
- const unit * multiplicand,const unit * multiplier);
-int upton_modmult(register unitptr prod,
- const unit * multiplicand,const unit * multiplier);
-int smith_modmult(register unitptr prod,
- const unit * multiplicand,const unit * multiplier);
-void peasant_burn();
-void merritt_burn();
-void upton_burn();
-void smith_burn();
-int mp_modexp(register unitptr expout,const unit * expin,
- const unit * exponent,const unit * modulus);
-int mp_modexp_crt(unitptr expout, const unit * expin,
- const unit * p, const unit * q, const unit * ep, const unit * eq, const unit * u);
-word16 fetch_word16(byte *buf);
-byte *put_word16(word16 w, byte *buf);
-word32 fetch_word32(byte *buf);
-byte *put_word32(word32 w, byte *buf);
-int string_length(const char *s);
-int str2reg(unit * reg,const char* digitstr);
-int reg2str(char * s,const unit * n,short radix);
-void mp_display(char * s,unitptr r);
-word16 checksum(register byte * buf, register word16 count);
-void cbc_xor(register unitptr dst, register unitptr src, word16 bytecount);
-void hiloswap(byte * r1,short numbytes);
-short mpi2reg(register unitptr r, register byte * buf);
-short reg2mpi(register byte * buf, register unitptr r);
-enum RandomNumberType {ANY, ODD, PRIME, BLUMINT};
-class MPIRegister : public SecBlock<unit>
-{
-public:
- MPIRegister() : SecBlock<unit>((2048 / 16 ) ) {}
-};
-class ostream;
-class bignum
-{
-public:
- bignum()
- {}
- bignum(unsigned long value);
- bignum(const char *str)
- {str2reg(reg, str);}
- enum Signedness{UNSIGNED, SIGNED};
- bignum(const byte *encodedBignum, unsigned int byteCount, Signedness s=UNSIGNED)
- {Decode(encodedBignum, byteCount, s);}
- bignum(const byte *BEREncodedInteger)
- {BERDecode(BEREncodedInteger);}
- bignum(BufferedTransformation &bt)
- {BERDecode(bt);}
- bignum(RandomNumberGenerator &rng, unsigned int bitcount)
- {Randomize(rng, bitcount);}
- bignum(RandomNumberGenerator &rng, const bignum &min, const bignum &max, RandomNumberType rnType=ANY)
- {Randomize(rng, min, max, rnType);}
- bignum(const bignum& t)
- {memcpy(reg, t.reg, (2048 /8) );}
- unsigned int Encode(byte *output) const;
- unsigned int Encode(byte *output, unsigned int outputLen) const;
- void Decode(const byte *input, unsigned int inputLen, Signedness=UNSIGNED);
- unsigned int DEREncode(byte *output) const;
- unsigned int DEREncode(BufferedTransformation &bt) const;
- void BERDecode(const byte *input);
- void BERDecode(BufferedTransformation &bt);
- void Randomize(RandomNumberGenerator &rng, unsigned int bitcount);
- void Randomize(RandomNumberGenerator &rng, const bignum &min, const bignum &max);
- void Randomize(RandomNumberGenerator &rng, const bignum &min, const bignum &max, RandomNumberType rnType);
- unsigned int ByteCount() const
- {
- return ((countbits( reg )+7)>>3) ;
- }
- int BitCount() const
- {
- return countbits(reg);
- }
- bignum& operator++()
- {
- mp_inc(reg);
- return *this;
- }
- bignum& operator--()
- {
- mp_dec(reg);
- return *this;
- }
- int operator!() const
- {
- return ( ((* (( reg.ptr )+( global_precision )-1) ) ==( 0 )) && (significance( reg.ptr )<=1) ) ;
- }
- bignum& operator=(const bignum& t)
- {
- memcpy(reg, t.reg, (2048 /8) );
- return *this;
- }
- bignum& operator+=(const bignum& t)
- {
- mp_addc( reg , t.reg ,(boolean)0) ;
- return *this;
- }
- bignum& operator-=(const bignum& t)
- {
- mp_subb( reg , t.reg ,(boolean)0) ;
- return *this;
- }
- bignum& operator*=(const bignum& t)
- {
- *this = (*this) * t;
- return *this;
- }
- bignum& operator/=(const bignum& t)
- {
- *this = (*this) / t;
- return *this;
- }
- bignum& operator%=(const bignum& t)
- {
- *this = (*this) % t;
- return *this;
- }
- bignum& operator<<=(unsigned int);
- bignum& operator>>=(unsigned int);
- unsigned MaxBitPrecision() const {return 2048 ;}
- int operator[](unsigned int n) const;
- friend bignum operator+(bignum a, const bignum &b)
- {
- return (a+=b);
- }
- friend bignum operator-(bignum a, const bignum &b)
- {
- return (a-=b);
- }
- friend bignum operator*(const bignum &a, const bignum &b);
- friend bignum operator/(const bignum &a, const bignum &b);
- friend bignum operator%(const bignum &a, const bignum &b);
- friend bignum operator/(const bignum &a, word16 b);
- friend word16 operator%(const bignum &a, word16 b);
- friend bignum operator>>(bignum a, unsigned int n)
- {return (a>>=n);}
- friend bignum operator<<(bignum a, unsigned int n)
- {return (a<<=n);}
- void Negate() {mp_neg(reg);}
- friend bignum operator-(bignum a)
- {
- a.Negate();
- return a;
- }
- friend int operator==(const bignum &a, const bignum &b)
- {
- return (memcmp(a.reg.ptr, b.reg.ptr, (2048 /8) )==0);
- }
- friend int operator!=(const bignum& a, const bignum& b)
- {
- return (memcmp(a.reg.ptr, b.reg.ptr, (2048 /8) )!=0);
- }
- friend int operator>(const bignum& a, const bignum& b)
- {
- return (mp_compare(a.reg, b.reg)>0);
- }
- friend int operator>=(const bignum& a, const bignum& b)
- {
- return (mp_compare(a.reg, b.reg)>=0);
- }
- friend int operator<(const bignum& a, const bignum& b)
- {
- return (mp_compare(a.reg, b.reg)<0);
- }
- friend int operator<=(const bignum& a, const bignum& b)
- {
- return (mp_compare(a.reg, b.reg)<=0);
- }
- friend bignum a_times_b_mod_c(const bignum &x, const bignum& y, const bignum& m);
- friend bignum a_exp_b_mod_c(const bignum &x, const bignum& e, const bignum& m);
- class DivideErr {};
- friend void Divide(bignum &r, bignum &q,
- const bignum &a, const bignum &d,
- Signedness s=SIGNED);
- friend boolean Negative(const bignum &a)
- {
- return ((signedunit) (* ( a.reg.ptr ) ) < 0) ;
- }
- friend bignum Abs(bignum a)
- {
- (((signedunit) (* ( a.reg.ptr ) ) < 0) ? (mp_neg( a.reg.ptr ),TRUE) : FALSE) ;
- return a;
- }
- friend ostream& operator<<(ostream& out, const bignum &a);
- unit lsUnit() {return (* (( reg.ptr )+( global_precision )-1) ) ;}
-private:
- MPIRegister reg;
-};
-class RSAPublicKey : public PK_Encryptor, public PK_Decryptor,
- public PK_Verifier
-{
-public:
- RSAPublicKey(const bignum &n, const bignum &e);
- RSAPublicKey(BufferedTransformation &bt);
- void DEREncode(BufferedTransformation &bt) const;
- void Encrypt(RandomNumberGenerator &rng, const byte *plainText, unsigned int plainTextLength, byte *cipherText);
- unsigned int Decrypt(const byte *cipherText, byte *plainText);
- boolean Verify(const byte *message, unsigned int messageLen, const byte *signature);
- unsigned int MaxPlainTextLength() const {return modulusLen-11;}
- unsigned int CipherTextLength() const {return modulusLen;}
- unsigned int MaxMessageLength() const {return modulusLen-11;}
- unsigned int SignatureLength() const {return modulusLen;}
- const bignum& Exponent() const {return e;}
- const bignum& Modulus() const {return n;}
-protected:
- void RawEncrypt(const bignum &in, bignum &out) const;
-private:
- friend class RSAPrivateKey;
- RSAPublicKey() {}
- bignum n;
- bignum e;
- unsigned int modulusLen;
-};
-class RSAPrivateKey : public RSAPublicKey, public PK_Signer
-{
-public:
- RSAPrivateKey(const bignum &n, const bignum &e, const bignum &d,
- const bignum &p, const bignum &q, const bignum &dp, const bignum &dq, const bignum &u);
- RSAPrivateKey(RandomNumberGenerator &rng, int keybits, bignum eStart=17);
- RSAPrivateKey(BufferedTransformation &bt);
- void DEREncode(BufferedTransformation &bt) const;
- void Encrypt(const byte *plainText, unsigned int plainTextLength, byte *cipherText);
- unsigned int Decrypt(const byte *cipherText, byte *plainText);
- void Encrypt(RandomNumberGenerator &, const byte *plainText, unsigned int plainTextLength, byte *cipherText)
- {Encrypt(plainText, plainTextLength, cipherText);}
- void Sign(const byte *message, unsigned int messageLen, byte *signature)
- {Encrypt(message, messageLen, signature);}
- void Sign(RandomNumberGenerator &, const byte *message, unsigned int messageLen, byte *signature)
- {Encrypt(message, messageLen, signature);}
- unsigned int MaxMessageLength() const {return modulusLen-11;}
- unsigned int SignatureLength() const {return modulusLen;}
-protected:
- void RawEncrypt(const bignum &in, bignum &out) const;
-private:
- bignum d;
- bignum p;
- bignum q;
- bignum dp;
- bignum dq;
- bignum u;
-};
-bignum Gcd(const bignum &a, const bignum &b);
-bignum Inverse(const bignum &a, const bignum &m);
-boolean IsSmallPrime(const bignum &p);
-boolean SmallDivisorsTest(const bignum &p);
-boolean FermatTest(const bignum &p, unsigned int rounds);
-boolean RabinMillerTest(RandomNumberGenerator &rng, const bignum &w, unsigned int rounds);
-inline boolean IsPrime(const bignum &p)
-{
- return (IsSmallPrime(p) || (SmallDivisorsTest(p) && FermatTest(p, 2)));
-}
-boolean NextPrime(bignum &p, const bignum &max, boolean blumInt=FALSE);
-bignum a_exp_b_mod_pq(const bignum &a, const bignum &ep, const bignum &eq,
- const bignum &p, const bignum &q, const bignum &u);
-class PrimeAndGenerator
-{
-public:
- PrimeAndGenerator(RandomNumberGenerator &rng, unsigned int pbits);
- PrimeAndGenerator(RandomNumberGenerator &rng, unsigned int pbits, unsigned qbits);
- const bignum& Prime() const {return p;}
- const bignum& SubPrime() const {return q;}
- const bignum& Generator() const {return g;}
-private:
- bignum p, q, g;
-};
-extern "C" {
-extern void __eprintf (const char *, const char *, unsigned, const char *);
-}
-RSAPublicKey::RSAPublicKey(const bignum &n, const bignum &e)
- : n(n), e(e), modulusLen(n.ByteCount())
-{
-}
-RSAPublicKey::RSAPublicKey(BufferedTransformation &bt)
-{
- BERSequenceDecoder seq(bt);
- n.BERDecode(seq);
- modulusLen = n.ByteCount();
- e.BERDecode(seq);
-}
-void RSAPublicKey::DEREncode(BufferedTransformation &bt) const
-{
- DERSequenceEncoder seq(bt);
- n.DEREncode(seq);
- e.DEREncode(seq);
-}
-void RSAPublicKey::Encrypt(RandomNumberGenerator &rng, const byte *input, unsigned int inputLen, byte *output)
-{unsigned int i;
- ((void) (( inputLen <= MaxPlainTextLength() ) ? 0 : (__eprintf ("%s:%u: failed assertion `%s'\n", "rsa.cpp" , 30 , "inputLen <= MaxPlainTextLength()" ), 0) )) ;
- SecByteBlock pkcsBlock(modulusLen);
- pkcsBlock[0] = 0;
- pkcsBlock[1] = 2;
- for (i = 2; i < modulusLen - inputLen - 1; i++)
- {
- do
- pkcsBlock[i] = rng.GetByte();
- while (pkcsBlock[i] == 0);
- }
- pkcsBlock[i++] = 0;
- memcpy(pkcsBlock+i, input, inputLen);
- bignum c;
- RawEncrypt(bignum(pkcsBlock, modulusLen), c);
- c.Encode(output, modulusLen);
-}
-unsigned int RSAPublicKey::Decrypt(const byte *input, byte *output)
-{unsigned int i;
- bignum m;
- RawEncrypt(bignum(input, modulusLen), m);
- SecByteBlock pkcsBlock(modulusLen);
- m.Encode(pkcsBlock, modulusLen);
- if ((pkcsBlock[0] != 0) || (pkcsBlock[1] != 1))
- return 0;
- for (i = 2; i < modulusLen-1; i++)
- if (pkcsBlock[i] != 0xff)
- break;
- if (pkcsBlock[i++] != 0)
- return 0;
- unsigned int outputLen = modulusLen - i;
- if (outputLen > MaxPlainTextLength())
- return 0;
- memcpy (output, pkcsBlock+i, outputLen);
- return outputLen;
-}
-boolean RSAPublicKey::Verify(const byte *message, unsigned int messageLen, const byte *signature)
-{
- ((void) (( messageLen <= MaxMessageLength() ) ? 0 : (__eprintf ("%s:%u: failed assertion `%s'\n", "rsa.cpp" , 83 , "messageLen <= MaxMessageLength()" ), 0) )) ;
- SecByteBlock m(MaxMessageLength());
- unsigned int mLen = RSAPublicKey::Decrypt(signature, m);
- return (mLen==messageLen && memcmp(message, m, mLen)==0);
-}
-void RSAPublicKey::RawEncrypt(const bignum &in, bignum &out) const
-{
- out = a_exp_b_mod_c(in, e, n);
-}
-RSAPrivateKey::RSAPrivateKey(const bignum &nIn, const bignum &eIn, const bignum &dIn,
- const bignum &pIn, const bignum &qIn,
- const bignum &dpIn, const bignum &dqIn, const bignum &uIn)
- : RSAPublicKey(nIn, eIn)
-{
- d=dIn;
- if (pIn < qIn)
- {
- p=pIn;
- q=qIn;
- dp=dpIn;
- dq=dqIn;
- }
- else
- {
- p=qIn;
- q=pIn;
- dp=dqIn;
- dq=dpIn;
- }
- u=uIn;
-}
-RSAPrivateKey::RSAPrivateKey(RandomNumberGenerator &rng, int keybits, bignum eStart)
-{
- p = bignum(rng, keybits/2, PRIME);
- const bignum minQ = ((bignum(1) << (keybits-1)) / p) + 1;
- const bignum maxQ = (bignum(1) << keybits) / p;
- do
- {
- bignum temp(rng, minQ, maxQ, PRIME);
- if (p>temp && p.BitCount()-(p-temp).BitCount() < 7)
- {
- q=p;
- p=temp;
- break;
- }
- if (p<temp && temp.BitCount()-(temp-p).BitCount() < 7)
- {
- q=temp;
- break;
- }
- } while (1);
- bignum phi = (p-1)*(q-1);
- for (e = eStart; Gcd(e, phi)!=1; ++e, ++e);
- d = Inverse(e, phi/Gcd(p-1, q-1));
- dp = d % (p-1);
- dq = d % (q-1);
- u = Inverse(p, q);
- n = p * q;
- modulusLen = n.ByteCount();
-}
-RSAPrivateKey::RSAPrivateKey(BufferedTransformation &bt)
-{
- BERSequenceDecoder seq(bt);
- bignum version(seq);
- if (!!version)
- throw BERDecodeErr() ;
- n.BERDecode(seq);
- modulusLen = n.ByteCount();
- e.BERDecode(seq);
- d.BERDecode(seq);
- p.BERDecode(seq);
- q.BERDecode(seq);
- dp.BERDecode(seq);
- dq.BERDecode(seq);
- u.BERDecode(seq);
- if (p>q)
- {
- swap(p, q);
- swap(dp, dq);
- }
-}
-void RSAPrivateKey::DEREncode(BufferedTransformation &bt) const
-{
- DERSequenceEncoder seq(bt);
- byte version[] = {INTEGER, 1, 0};
- seq.Put(version, sizeof(version));
- n.DEREncode(seq);
- e.DEREncode(seq);
- d.DEREncode(seq);
- q.DEREncode(seq);
- p.DEREncode(seq);
- dq.DEREncode(seq);
- dp.DEREncode(seq);
- u.DEREncode(seq);
-}