@@ -68,6 +68,11 @@ string RemotePassword::pluginName(unsigned bits)
6868
6969RemotePassword::RemotePassword ()
7070 : group(RemoteGroup::getGroup())
71+ {
72+ makePrivate ();
73+ }
74+
75+ void RemotePassword::makePrivate ()
7176{
7277#if SRP_DEBUG > 1
7378 privateKey = BigInteger (" 60975527035CF2AD1989806F0407210BC81EDC04E2762A56AFD529DDDA2D4393" );
@@ -103,23 +108,40 @@ BigInteger RemotePassword::computeVerifier(const string& account, const string&
103108
104109void RemotePassword::genClientKey (string& pubkey)
105110{
106- dumpIt (" privateKey(C)" , privateKey);
107- clientPublicKey = group->generator .modPow (privateKey, group->prime );
108- clientPublicKey.getText (pubkey);
109- dumpIt (" clientPublicKey" , clientPublicKey);
111+ for (;;)
112+ {
113+ dumpIt (" privateKey(C)" , privateKey);
114+ clientPublicKey = group->generator .modPow (privateKey, group->prime );
115+ dumpIt (" clientPublicKey" , clientPublicKey);
116+ if (clientPublicKey > 1 )
117+ {
118+ clientPublicKey.getText (pubkey);
119+ break ;
120+ }
121+ dumpIt (" remake private key" , " " );
122+ makePrivate ();
123+ }
110124}
111125
112126void RemotePassword::genServerKey (string& pubkey, const Firebird::UCharBuffer& verifier)
113127{
114- dumpIt (" privateKey(S)" , privateKey);
115- BigInteger gb (group->generator .modPow (privateKey, group->prime )); // g^b
116- dumpIt (" gb" , gb);
117- BigInteger v (verifier); // v
118- BigInteger kv = (group->k * v) % group->prime ;
119- dumpIt (" kv" , kv);
120- serverPublicKey = (kv + gb) % group->prime ;
121- serverPublicKey.getText (pubkey);
122- dumpIt (" serverPublicKey" , serverPublicKey);
128+ for (;;)
129+ {
130+ dumpIt (" privateKey(S)" , privateKey);
131+ BigInteger gb (group->generator .modPow (privateKey, group->prime )); // g^b
132+ dumpIt (" gb" , gb);
133+ BigInteger v (verifier); // v
134+ BigInteger kv = (group->k * v) % group->prime ;
135+ dumpIt (" kv" , kv);
136+ serverPublicKey = (kv + gb) % group->prime ;
137+ dumpIt (" serverPublicKey" , serverPublicKey);
138+ if (serverPublicKey > 1 )
139+ {
140+ serverPublicKey.getText (pubkey);
141+ break ;
142+ }
143+ makePrivate ();
144+ }
123145}
124146
125147void RemotePassword::computeScramble ()
@@ -133,10 +155,8 @@ void RemotePassword::computeScramble()
133155}
134156
135157void RemotePassword::clientSessionKey (UCharBuffer& sessionKey, const char * account,
136- const char * salt, const char * password,
137- const char * serverPubKey)
158+ const char * salt, const char * password)
138159{
139- serverPublicKey = BigInteger (serverPubKey);
140160 computeScramble ();
141161 dumpIt (" scramble" , scramble);
142162 dumpIt (" password" , password);
@@ -158,10 +178,8 @@ void RemotePassword::clientSessionKey(UCharBuffer& sessionKey, const char* accou
158178 hash.getHash (sessionKey);
159179}
160180
161- void RemotePassword::serverSessionKey (UCharBuffer& sessionKey, const char * clientPubKey,
162- const UCharBuffer& verifier)
181+ void RemotePassword::serverSessionKey (UCharBuffer& sessionKey, const UCharBuffer& verifier)
163182{
164- clientPublicKey = BigInteger (clientPubKey);
165183 computeScramble ();
166184 dumpIt (" scramble" , scramble);
167185 BigInteger v = BigInteger (verifier);
@@ -201,6 +219,15 @@ BigInteger RemotePassword::clientProof(const char* account, const char* salt, co
201219RemotePassword::~RemotePassword ()
202220{ }
203221
222+ BigInteger RemotePassword::setKey (const char * from)
223+ {
224+ BigInteger key (from);
225+ if (key % group->prime < 2 )
226+ (Arg::Gds (isc_random) << " Trivial public key" ).raise ();
227+
228+ return key;
229+ }
230+
204231#if SRP_DEBUG > 0
205232void dumpIt (const char * name, const Firebird::UCharBuffer& data)
206233{
@@ -217,7 +244,7 @@ void dumpIt(const char* name, const Firebird::string& str)
217244
218245void dumpBin (const char * name, const Firebird::string& str)
219246{
220- fprintf (stderr, " %s (%ld)\n " , name, str.length ());
247+ fprintf (stderr, " %s (%ld)\n " , name, long ( str.length () ));
221248 for (size_t x = 0 ; x < str.length (); ++x)
222249 fprintf (stderr, " %02x " , str[x]);
223250 fprintf (stderr, " \n " );
0 commit comments