Speed up DH with small generator.
[openssl.git] / crypto / dh / dh_key.c
index 0c7eeaf..6f9426d 100644 (file)
@@ -193,19 +193,26 @@ err:
 static int dh_bn_mod_exp(DH *dh, BIGNUM *r, BIGNUM *a, const BIGNUM *p,
                        const BIGNUM *m, BN_CTX *ctx,
                        BN_MONT_CTX *m_ctx)
-{
-       return BN_mod_exp_mont(r, a, p, m, ctx, m_ctx);
-}
+       {
+       if (a->top == 1)
+               {
+               BN_ULONG A = a->d[0];
+               return BN_mod_exp_mont_word(r,A,p,m,ctx,m_ctx);
+               }
+       else
+               return BN_mod_exp_mont(r,a,p,m,ctx,m_ctx);
+       }
+
 
 static int dh_init(DH *dh)
-{
+       {
        dh->flags |= DH_FLAG_CACHE_MONT_P;
        return(1);
-}
+       }
 
 static int dh_finish(DH *dh)
-{
+       {
        if(dh->method_mont_p)
                BN_MONT_CTX_free((BN_MONT_CTX *)dh->method_mont_p);
        return(1);
-}
+       }