void cpMontRedAdc_BNU(BNU_CHUNK_T* pR, BNU_CHUNK_T* pProduct, const BNU_CHUNK_T* pModulus, cpSize nsM, BNU_CHUNK_T m0) { BNU_CHUNK_T carry; BNU_CHUNK_T extension; cpSize n; for(n=0, carry = 0; n<(nsM-1); n++) { BNU_CHUNK_T u = pProduct[n]*m0; BNU_CHUNK_T t = pProduct[nsM +n +1] + carry; extension = cpAddMulDgt_BNU(pProduct+n, pModulus, nsM, u); ADD_AB(carry, pProduct[nsM+n], pProduct[nsM+n], extension); t += carry; carry = t<pProduct[nsM+n+1]; pProduct[nsM+n+1] = t; } m0 *= pProduct[nsM-1]; extension = cpAddMulDgt_BNU(pProduct+nsM-1, pModulus, nsM, m0); ADD_AB(extension, pProduct[2*nsM-1], pProduct[2*nsM-1], extension); carry |= extension; carry -= cpSub_BNU(pR, pProduct+nsM, pModulus, nsM); /* condition copy: R = carry? Product+mSize : R */ MASKED_COPY_BNU(pR, carry, pProduct+nsM, pR, nsM); }
/* // cpMAC_BNU // // Multiply with ACcumulation // Computes r <- r + a * b, returns real size of the r in the size_r variable // Returns 0 if there are no enought buffer size to write to r[MAX(size_r + 1, size_a + size_b) - 1] // Returns 1 if no error // // Note: // DO NOT run in inplace mode // The minimum buffer size for the r must be (size_a + size_b - 1) // the maximum buffer size for the r is MAX(size_r + 1, size_a + size_b) */ static int cpMac_BNU(BNU_CHUNK_T* pR, cpSize nsR, const BNU_CHUNK_T* pA, cpSize nsA, const BNU_CHUNK_T* pB, cpSize nsB) { /* cleanup the rest of destination buffer */ ZEXPAND_BNU(pR, nsR, nsA+nsB-1); { BNU_CHUNK_T expansion = 0; cpSize i; for(i=0; i<nsB && !expansion; i++) { expansion = cpAddMulDgt_BNU(pR+i, pA, nsA, pB[i]); if(expansion) expansion = cpInc_BNU(pR+i+nsA, pR+i+nsA, nsR-i-nsA, expansion); } if(expansion) return 0; else { /* compute real size */ FIX_BNU(pR, nsR); return nsR; } } }