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, 741 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/eh43.C b/gcc/testsuite/g++.old-deja/g++.mike/eh43.C
new file mode 100644
index 00000000000..c5fbde939d0
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.mike/eh43.C
@@ -0,0 +1,741 @@
+// 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);
+}