- br_i15_modpow(s2, sk->dq, sk->dqlen, mq, q0i, t1, t2);
+ r = br_i15_modpow_opt(s2, sk->dq, sk->dqlen, mq, q0i,
+ mq + 2 * fwlen, TLEN - 2 * fwlen);
+
+ /*
+ * Decode p.
+ */
+ mp = mq + 2 * fwlen;
+ br_i15_decode(mp, p, plen);
+
+ /*
+ * Compute s1 = x^dq mod q.
+ */
+ p0i = br_i15_ninv15(mp[1]);
+ s1 = mq + 3 * fwlen;
+ br_i15_decode_reduce(s1, x, xlen, mp);
+ r &= br_i15_modpow_opt(s1, sk->dp, sk->dplen, mp, p0i,
+ mq + 4 * fwlen, TLEN - 4 * fwlen);