aboutsummaryrefslogtreecommitdiff
path: root/ext/ipp/sources/ippcp/src/pcpgfpxstuff.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/ipp/sources/ippcp/src/pcpgfpxstuff.c')
-rw-r--r--ext/ipp/sources/ippcp/src/pcpgfpxstuff.c722
1 files changed, 0 insertions, 722 deletions
diff --git a/ext/ipp/sources/ippcp/src/pcpgfpxstuff.c b/ext/ipp/sources/ippcp/src/pcpgfpxstuff.c
deleted file mode 100644
index 625a7da..0000000
--- a/ext/ipp/sources/ippcp/src/pcpgfpxstuff.c
+++ /dev/null
@@ -1,722 +0,0 @@
-/*############################################################################
- # Copyright 1999-2018 Intel Corporation
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- ############################################################################*/
-
-/*
-// Intel(R) Performance Primitives. Cryptography Primitives.
-// Internal operations over GF(p) extension.
-//
-// Context:
-// cpGFpxRand
-// cpGFpxSet, cpGFpxSetPolyTerm
-// cpGFpxGet, cpGFpxGetPolyTerm
-//
-// cpGFpxNeg
-// cpGFpxInv
-// cpGFpxHalve
-// cpGFpxAdd, cpGFpxAdd_GFE
-// cpGFpxSub, cpGFpxSub_GFE
-// cpGFpxMul, cpGFpxMul_GFE
-// cpGFpxSqr
-// cpGFpxExp, cpGFpxMultiExp
-// cpGFpxConj
-//
-//
-*/
-#include "owncp.h"
-
-#include "pcpbnumisc.h"
-#include "pcpgfpxstuff.h"
-#include "gsscramble.h"
-
-//gres: temporary excluded: #include <assert.h>
-
-
-BNU_CHUNK_T* cpGFpxRand(BNU_CHUNK_T* pR, gsModEngine* pGFEx, IppBitSupplier rndFunc, void* pRndParam)
-{
- if( GFP_IS_BASIC(pGFEx) )
- return cpGFpRand(pR, pGFEx, rndFunc, pRndParam);
-
- else {
- gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
- int basicElemLen = GFP_FELEN(pBasicGFE);
- int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
-
- BNU_CHUNK_T* pTmp = pR;
- int deg;
- for(deg=0; deg<basicDeg; deg++) {
- if(NULL == cpGFpRand(pTmp, pBasicGFE, rndFunc, pRndParam))
- break;
- pTmp += basicElemLen;
- }
- return deg==basicDeg? pR : NULL;
- }
-}
-
-BNU_CHUNK_T* cpGFpxSet(BNU_CHUNK_T* pE, const BNU_CHUNK_T* pDataA, int nsA, gsModEngine* pGFEx)
-{
- if( GFP_IS_BASIC(pGFEx) )
- return cpGFpSet(pE, pDataA, nsA, pGFEx);
-
- else {
- gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
- int basicElemLen = GFP_FELEN(pBasicGFE);
-
- BNU_CHUNK_T* pTmpE = pE;
- int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
-
- int deg, error;
- for(deg=0, error=0; deg<basicDeg && !error; deg++) {
- int pieceA = IPP_MIN(nsA, basicElemLen);
-
- error = NULL == cpGFpSet(pTmpE, pDataA, pieceA, pBasicGFE);
- pTmpE += basicElemLen;
- pDataA += pieceA;
- nsA -= pieceA;
- }
-
- return (deg<basicDeg)? NULL : pE;
- }
-}
-
-BNU_CHUNK_T* cpGFpxSetPolyTerm(BNU_CHUNK_T* pE, int deg, const BNU_CHUNK_T* pDataA, int nsA, gsModEngine* pGFEx)
-{
- pE += deg * GFP_FELEN(pGFEx);
- return cpGFpxSet(pE, pDataA, nsA, pGFEx);
-}
-
-BNU_CHUNK_T* cpGFpxGet(BNU_CHUNK_T* pDataA, int nsA, const BNU_CHUNK_T* pE, gsModEngine* pGFEx)
-{
- cpGFpElementPadd(pDataA, nsA, 0);
-
- if( GFP_IS_BASIC(pGFEx) )
- return cpGFpGet(pDataA, nsA, pE, pGFEx);
-
- else {
- gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
- int basicElemLen = GFP_FELEN(pBasicGFE);
-
- BNU_CHUNK_T* pTmp = pDataA;
- int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
-
- int deg;
- for(deg=0; deg<basicDeg && nsA>0; deg++) {
- int pieceA = IPP_MIN(nsA, basicElemLen);
-
- cpGFpGet(pTmp, pieceA, pE, pBasicGFE);
- pE += basicElemLen;
- pTmp += pieceA;
- nsA -= pieceA;
- }
-
- return pDataA;
- }
-}
-
-BNU_CHUNK_T* cpGFpxGetPolyTerm(BNU_CHUNK_T* pDataA, int nsA, const BNU_CHUNK_T* pE, int deg, gsModEngine* pGFEx)
-{
- pE += deg * GFP_FELEN(pGFEx);
- return cpGFpxGet(pDataA, nsA, pE, pGFEx);
-}
-
-BNU_CHUNK_T* cpGFpxConj(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx)
-{
- gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
- int groundElemLen = GFP_FELEN(pGroundGFE);
-
- if(pR != pA)
- cpGFpElementCopy(pR, pA, groundElemLen);
- MOD_METHOD(pGroundGFE)->neg(pR+groundElemLen, pA+groundElemLen, pGroundGFE);
-
- return pR;
-}
-
-
-BNU_CHUNK_T* cpGFpxAdd_GFE(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pGroundB, gsModEngine* pGFEx)
-{
- gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
- mod_add addF = MOD_METHOD(pGroundGFE)->add;
-
- if(pR != pA) {
- int groundElemLen = GFP_FELEN(pGroundGFE);
- int deg = GFP_EXTDEGREE(pGFEx);
- cpGFpElementCopy(pR+groundElemLen, pA+groundElemLen, groundElemLen*(deg-1));
- }
- return addF(pR, pA, pGroundB, pGroundGFE);
-}
-
-BNU_CHUNK_T* cpGFpxSub_GFE(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pGroundB, gsModEngine* pGFEx)
-{
- gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
- mod_sub subF = MOD_METHOD(pGroundGFE)->sub;
-
- if(pR != pA) {
- int groundElemLen = GFP_FELEN(pGroundGFE);
- int deg = GFP_EXTDEGREE(pGFEx);
- cpGFpElementCopy(pR+groundElemLen, pA+groundElemLen, groundElemLen*(deg-1));
- }
- return subF(pR, pA, pGroundB, pGroundGFE);
-}
-
-BNU_CHUNK_T* cpGFpxMul_GFE(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pGroundB, gsModEngine* pGFEx)
-{
- gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
- mod_mul mulF = MOD_METHOD(pGroundGFE)->mul;
-
- int grounfElemLen = GFP_FELEN(pGroundGFE);
-
- BNU_CHUNK_T* pTmp = pR;
-
- int deg;
- for(deg=0; deg<GFP_EXTDEGREE(pGFEx); deg++) {
- mulF(pTmp, pA, pGroundB, pGroundGFE);
- pTmp += grounfElemLen;
- pA += grounfElemLen;
- }
- return pR;
-}
-
-BNU_CHUNK_T* cpGFpxNeg(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx)
-{
- gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
- int basicElemLen = GFP_FELEN(pBasicGFE);
- int basicDeg = cpGFpBasicDegreeExtension(pGFEx);
-
- BNU_CHUNK_T* pTmp = pR;
- int deg;
- for(deg=0; deg<basicDeg; deg++) {
- GFP_METHOD(pBasicGFE)->neg(pTmp, pA, pBasicGFE);
- pTmp += basicElemLen;
- pA += basicElemLen;
- }
- return pR;
-}
-
-static BNU_CHUNK_T* gfpxPolyDiv(BNU_CHUNK_T* pQ, BNU_CHUNK_T* pR,
- const BNU_CHUNK_T* pA,
- const BNU_CHUNK_T* pB,
- gsModEngine* pGFEx)
-{
- if( GFP_IS_BASIC(pGFEx) )
- return NULL;
-
- else {
- int elemLen = GFP_FELEN(pGFEx);
- gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
- int termLen = GFP_FELEN(pGroundGFE);
-
- int degA = degree(pA, pGFEx);
- int degB = degree(pB, pGFEx);
-
- if(degB==0) {
- if( GFP_IS_ZERO(pB, termLen) )
- return NULL;
- else {
- gsModEngine* pBasicGFE = cpGFpBasic(pGroundGFE);
-
- cpGFpInv(pR, pB, pBasicGFE);
- cpGFpElementPadd(pR+GFP_FELEN(pGroundGFE), termLen-GFP_FELEN(pGroundGFE), 0);
- cpGFpxMul_GFE(pQ, pA, pR, pGFEx);
- cpGFpElementPadd(pR, elemLen, 0);
- return pR;
- }
- }
-
- if(degA < degB) {
- cpGFpElementPadd(pQ, elemLen, 0);
- cpGFpElementCopyPadd(pR, elemLen, pA, (degA+1)*termLen);
- return pR;
- }
-
- else {
- mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
- mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
-
- int i, j;
- BNU_CHUNK_T* pProduct = cpGFpGetPool(2, pGroundGFE);
- BNU_CHUNK_T* pInvB = pProduct + GFP_PELEN(pGroundGFE);
- //gres: temporary excluded: assert(NULL!=pProduct);
-
- cpGFpElementCopyPadd(pR, elemLen, pA, (degA+1)*termLen);
- cpGFpElementPadd(pQ, elemLen, 0);
-
- cpGFpxInv(pInvB, GFPX_IDX_ELEMENT(pB, degB, termLen), pGroundGFE);
-
- for(i=0; i<=degA-degB && !GFP_IS_ZERO(GFPX_IDX_ELEMENT(pR, degA-i, termLen), termLen); i++) {
- /* compute q term */
- mulF(GFPX_IDX_ELEMENT(pQ, degA-degB-i, termLen),
- GFPX_IDX_ELEMENT(pR, degA-i, termLen),
- pInvB,
- pGroundGFE);
-
- /* R -= B * q */
- cpGFpElementPadd(GFPX_IDX_ELEMENT(pR, degA-i, termLen), termLen, 0);
- for(j=0; j<degB; j++) {
- mulF(pProduct,
- GFPX_IDX_ELEMENT(pB, j ,termLen),
- GFPX_IDX_ELEMENT(pQ, degA-degB-i, termLen),
- pGroundGFE);
- subF(GFPX_IDX_ELEMENT(pR, degA-degB-i+j, termLen),
- GFPX_IDX_ELEMENT(pR, degA-degB-i+j, termLen),
- pProduct,
- pGroundGFE);
- }
- }
-
- cpGFpReleasePool(2, pGroundGFE);
- return pR;
- }
- }
-}
-
-static BNU_CHUNK_T* gfpxGeneratorDiv(BNU_CHUNK_T* pQ, BNU_CHUNK_T* pR, const BNU_CHUNK_T* pB, gsModEngine* pGFEx)
-{
- if( GFP_IS_BASIC(pGFEx) )
- return NULL;
-
- else {
- int elemLen = GFP_FELEN(pGFEx);
-
- gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
- mod_mul mulF = GFP_METHOD(pGroundGFE)->mul;
- mod_sub subF = GFP_METHOD(pGroundGFE)->sub;
-
- int termLen = GFP_FELEN(pGroundGFE);
-
- BNU_CHUNK_T* pInvB = cpGFpGetPool(2, pGroundGFE);
- BNU_CHUNK_T* pTmp = pInvB + GFP_PELEN(pGroundGFE);
-
- int degB = degree(pB, pGFEx);
- int i;
-
- //gres: temporary excluded: assert(NULL!=pInvB);
-
- cpGFpElementCopy(pR, GFP_MODULUS(pGFEx), elemLen);
- cpGFpElementPadd(pQ, elemLen, 0);
-
- cpGFpxInv(pInvB, GFPX_IDX_ELEMENT(pB, degB, termLen), pGroundGFE);
-
- for(i=0; i<degB; i++) {
- BNU_CHUNK_T* ptr;
- mulF(pTmp, pInvB, GFPX_IDX_ELEMENT(pB, i, termLen), pGroundGFE);
- ptr = GFPX_IDX_ELEMENT(pR, GFP_EXTDEGREE(pGFEx)-degB+i, termLen);
- subF(ptr, ptr, pTmp, pGroundGFE);
- }
-
- gfpxPolyDiv(pQ, pR, pR, pB, pGFEx);
-
- cpGFpElementCopy(GFPX_IDX_ELEMENT(pQ, GFP_EXTDEGREE(pGFEx)-degB, termLen), pInvB, termLen);
-
- cpGFpReleasePool(2, pGroundGFE);
- return pR;
- }
-}
-
-BNU_CHUNK_T* cpGFpxInv(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx)
-{
- if( GFP_IS_BASIC(pGFEx) )
- return cpGFpInv(pR, pA, pGFEx);
-
- if(0==degree(pA, pGFEx)) {
- gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
- BNU_CHUNK_T* tmpR = cpGFpGetPool(1, pGroundGFE);
- //gres: temporary excluded: assert(NULL!=tmpR);
-
- cpGFpxInv(tmpR, pA, pGroundGFE);
-
- cpGFpElementCopyPadd(pR, GFP_FELEN(pGFEx), tmpR, GFP_FELEN(pGroundGFE));
- cpGFpReleasePool(1, pGroundGFE);
- return pR;
- }
-
- else {
- int elemLen = GFP_FELEN(pGFEx);
- gsModEngine* pGroundGFE = GFP_PARENT(pGFEx);
- gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
-
- int pxVars = 6;
- int pelemLen = GFP_PELEN(pGFEx);
- BNU_CHUNK_T* lastrem = cpGFpGetPool(pxVars, pGFEx);
- BNU_CHUNK_T* rem = lastrem + pelemLen;
- BNU_CHUNK_T* quo = rem + pelemLen;
- BNU_CHUNK_T* lastaux = quo + pelemLen;
- BNU_CHUNK_T* aux = lastaux + pelemLen;
- BNU_CHUNK_T* temp = aux + pelemLen;
- //gres: temporary excluded: assert(NULL!=lastrem);
-
- cpGFpElementCopy(lastrem, pA, elemLen);
- cpGFpElementCopyPadd(lastaux, elemLen, GFP_MNT_R(pBasicGFE), GFP_FELEN(pBasicGFE));
-
- gfpxGeneratorDiv(quo, rem, pA, pGFEx);
- cpGFpxNeg(aux, quo, pGFEx);
-
- while(degree(rem, pGFEx) > 0) {
- gfpxPolyDiv(quo, temp, lastrem, rem, pGFEx);
- SWAP_PTR(BNU_CHUNK_T, rem, lastrem); //
- SWAP_PTR(BNU_CHUNK_T, temp, rem);
-
- GFP_METHOD(pGFEx)->neg(quo, quo, pGFEx);
- GFP_METHOD(pGFEx)->mul(temp, quo, aux, pGFEx);
- GFP_METHOD(pGFEx)->add(temp, lastaux, temp, pGFEx);
- SWAP_PTR(BNU_CHUNK_T, aux, lastaux);
- SWAP_PTR(BNU_CHUNK_T, temp, aux);
- }
- if (GFP_IS_ZERO(rem, elemLen)) { /* gcd != 1 */
- cpGFpReleasePool(pxVars, pGFEx);
- return NULL;
- }
-
- {
- BNU_CHUNK_T* invRem = cpGFpGetPool(1, pGroundGFE);
- //gres: temporary excluded: assert(NULL!=invRem);
-
- cpGFpxInv(invRem, rem, pGroundGFE);
- cpGFpxMul_GFE(pR, aux, invRem, pGFEx);
-
- cpGFpReleasePool(1, pGroundGFE);
- }
-
- cpGFpReleasePool(pxVars, pGFEx);
-
- return pR;
- }
-}
-
-
-static int div_upper(int a, int d)
-{ return (a+d-1)/d; }
-
-static int getNumOperations(int bitsize, int w)
-{
- int n_overhead = (1<<w) -1;
- int n_ops = div_upper(bitsize, w) + n_overhead;
- return n_ops;
-}
-int cpGFpGetOptimalWinSize(int bitsize)
-{
- int w_opt = 1;
- int n_opt = getNumOperations(bitsize, w_opt);
- int w_trial;
- for(w_trial=w_opt+1; w_trial<=IPP_MAX_EXPONENT_NUM; w_trial++) {
- int n_trial = getNumOperations(bitsize, w_trial);
- if(n_trial>=n_opt) break;
- w_opt = w_trial;
- n_opt = n_trial;
- }
- return w_opt;
-}
-
-
-//#define _GRES_DBG_
-#if defined(_GRES_DBG_)
-#include <stdio.h>
-static void printBNU(const char* note, Ipp64u* pData, int len, int nt)
-{
- int n, k;
-
- if(note)
- printf("%s", note);
-
- for(n=0, k=0; n<len; n++) {
- Ipp64u x = pData[n];
- printf("%016I64x ", x);
- k++;
- if(k==nt) {
- printf("\n");
- k = 0;
- }
- }
- printf("\n");
-}
-#endif
-
-/* sscm version */
-BNU_CHUNK_T* cpGFpxExp(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pE, int nsE,
- gsModEngine* pGFEx, Ipp8u* pScratchBuffer)
-{
- gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
-
- /* remove leding zeros */
- FIX_BNU(pE, nsE);
-
- {
- mod_mul mulF = GFP_METHOD(pGFEx)->mul; /* mul and sqr methods */
- mod_sqr sqrF = GFP_METHOD(pGFEx)->sqr;
-
- BNU_CHUNK_T* pScratchAligned; /* aligned scratch buffer */
- int nAllocation = 0; /* points from the pool */
-
- /* size of element */
- int elmLen = GFP_FELEN(pGFEx);
-
- /* exponent bitsize */
- int expBitSize = BITSIZE_BNU(pE, nsE);
- /* optimal size of window */
- int w = (NULL==pScratchBuffer)? 1 : cpGFpGetOptimalWinSize(expBitSize);
- /* number of table entries */
- int nPrecomputed = 1<<w;
-
- int poolElmLen = GFP_PELEN(pGFEx);
- BNU_CHUNK_T* pExpandedE = cpGFpGetPool(1, pGFEx);
- BNU_CHUNK_T* pTmp = cpGFpGetPool(1, pGFEx);
- //gres: temporary excluded: assert(NULL!=pExpandedE && NULL!=pTmp);
-
- if(NULL==pScratchBuffer) {
- nAllocation = 2 + div_upper(CACHE_LINE_SIZE, poolElmLen*sizeof(BNU_CHUNK_T));
- pScratchBuffer = (Ipp8u*)cpGFpGetPool(nAllocation, pGFEx);
- //gres: temporary excluded: assert(NULL!=pScratchBuffer);
- }
- pScratchAligned = (BNU_CHUNK_T*)( IPP_ALIGNED_PTR(pScratchBuffer, CACHE_LINE_SIZE) );
-
- #if defined(_GRES_DBG_)
- printf("precom tbl:\n");
- #endif
- /* pre-compute auxiliary table t[] = {A^0, A^1, A^2, ..., A^(2^w-1)} */
- cpGFpElementCopyPadd(pTmp, elmLen, GFP_MNT_R(pBasicGFE), GFP_FELEN(pBasicGFE));
- //cpScramblePut(pScratchAligned+0, nPrecomputed, (Ipp8u*)pTmp, elmDataSize);
- gsScramblePut(pScratchAligned, 0, pTmp, elmLen, w);
- #if defined(_GRES_DBG_)
- printBNU("precom tbl:\n", pTmp, 48, 6);
- #endif
-
- { /* pre compute multiplication table */
- int n;
- for(n=1; n<nPrecomputed; n++) {
- mulF(pTmp, pTmp, pA, pGFEx);
- //cpScramblePut(pScratchAligned+n, nPrecomputed, (Ipp8u*)pTmp, elmDataSize);
- gsScramblePut(pScratchAligned, n, pTmp, elmLen, w);
- #if defined(_GRES_DBG_)
- printBNU("precom tbl:\n", pTmp, 48, 6);
- #endif
- }
- }
-
- {
- /* copy exponent value */
- cpGFpElementCopy(pExpandedE, pE, nsE);
-
- /* expand exponent value */
- ((Ipp32u*)pExpandedE)[BITS2WORD32_SIZE(expBitSize)] = 0;
- expBitSize = ((expBitSize+w-1)/w)*w;
-
- #if defined(_GRES_DBG_)
- printf("\nexponentiation:\n");
- #endif
- /*
- // exponentiation
- */
- {
- /* digit mask */
- BNU_CHUNK_T dmask = nPrecomputed-1;
-
- /* position (bit number) of the leftmost window */
- int wPosition = expBitSize-w;
-
- /* extract leftmost window value */
- Ipp32u eChunk = *((Ipp32u*)((Ipp16u*)pExpandedE+ wPosition/BITSIZE(Ipp16u)));
- int shift = wPosition & 0xF;
- Ipp32u windowVal = (eChunk>>shift) & dmask;
-
- /* initialize result */
- //cpScrambleGet((Ipp8u*)pR, elmDataSize, pScratchAligned+windowVal, nPrecomputed);
- gsScrambleGet_sscm(pR, elmLen, pScratchAligned, windowVal, w);
- #if defined(_GRES_DBG_)
- printBNU("init result:\n", pR, 48, 6);
- #endif
-
- for(wPosition-=w; wPosition>=0; wPosition-=w) {
- int k;
- #if defined(_GRES_DBG_)
- printf("\nwPosition=%d\n", wPosition);
- #endif
- /* w times squaring */
- for(k=0; k<w; k++) {
- sqrF(pR, pR, pGFEx);
- #if defined(_GRES_DBG_)
- printBNU("sqr:\n", pR, 48, 6);
- #endif
- }
-
- /* extract next window value */
- eChunk = *((Ipp32u*)((Ipp16u*)pExpandedE+ wPosition/BITSIZE(Ipp16u)));
- shift = wPosition & 0xF;
- windowVal = (eChunk>>shift) & dmask;
-
- /* extract value from the pre-computed table */
- //cpScrambleGet((Ipp8u*)pTmp, elmDataSize, pScratchAligned+windowVal, nPrecomputed);
- gsScrambleGet_sscm(pTmp, elmLen, pScratchAligned, windowVal, w);
-
- /* and multiply */
- mulF(pR, pR, pTmp, pGFEx);
- #if defined(_GRES_DBG_)
- printBNU("mul:\n", pR, 48, 6);
- #endif
- }
- }
-
- }
-
- cpGFpReleasePool(nAllocation+2, pGFEx);
-
- return pR;
- }
-}
-
-static void cpPrecomputeMultiExp(BNU_CHUNK_T* pTable, const BNU_CHUNK_T* ppA[], int nItems, gsModEngine* pGFEx)
-{
- gsModEngine* pBasicGFE = cpGFpBasic(pGFEx);
-
- //int nPrecomputed = 1<<nItems;
-
- /* length of element (BNU_CHUNK_T) */
- int elmLen = GFP_FELEN(pGFEx);
-
- /* get resource */
- BNU_CHUNK_T* pT = cpGFpGetPool(1, pGFEx);
- //gres: temporary excluded: assert(NULL!=pT);
-
- /* pTable[0] = 1 */
- cpGFpElementCopyPadd(pT, elmLen, GFP_MNT_R(pBasicGFE), GFP_FELEN(pBasicGFE));
- //cpScramblePut(pTable+0, nPrecomputed, (Ipp8u*)pT, elmDataSize);
- gsScramblePut(pTable, 0, pT, elmLen, nItems);
- /* pTable[1] = A[0] */
- //cpScramblePut(pTable+1, nPrecomputed, (Ipp8u*)(ppA[0]), elmDataSize);
- gsScramblePut(pTable, 1, ppA[0], elmLen, nItems);
-
- {
- mod_mul mulF = GFP_METHOD(pGFEx)->mul; /* mul method */
-
- int i, baseIdx;
- for(i=1, baseIdx=2; i<nItems; i++, baseIdx*=2) {
- /* pTable[baseIdx] = A[i] */
- //cpScramblePut(pTable+baseIdx, nPrecomputed, (Ipp8u*)(ppA[i]), elmDataSize);
- gsScramblePut(pTable, baseIdx, ppA[i], elmLen, nItems);
-
- {
- int nPasses = 1;
- int step = baseIdx/2;
-
- int k;
- for(k=i-1; k>=0; k--) {
- int tblIdx = baseIdx;
-
- int n;
- for(n=0; n<nPasses; n++, tblIdx+=2*step) {
- /* use pre-computed value */
- //cpScrambleGet((Ipp8u*)pT, elmDataSize, pTable+tblIdx, nPrecomputed);
- gsScrambleGet(pT, elmLen, pTable, tblIdx, nItems);
- mulF(pT, pT, ppA[k], pGFEx);
- //cpScramblePut(pTable+tblIdx+step, nPrecomputed, (Ipp8u*)pT, elmDataSize);
- gsScramblePut(pTable, tblIdx+step, pT, elmLen, nItems);
- }
-
- nPasses *= 2;
- step /= 2;
- }
- }
- }
- }
-
- /* release resourse */
- cpGFpReleasePool(1, pGFEx);
-}
-
-static int cpGetMaxBitsizeExponent(const BNU_CHUNK_T* ppE[], int nsE[], int nItems)
-{
- int n;
- /* find out the longest exponent */
- int expBitSize = BITSIZE_BNU(ppE[0], nsE[0]);
- for(n=1; n<nItems; n++) {
- expBitSize = IPP_MAX(expBitSize, BITSIZE_BNU(ppE[n], nsE[n]));
- }
- return expBitSize;
-}
-
-static int GetIndex(const BNU_CHUNK_T* ppE[], int nItems, int nBit)
-{
- int shift = nBit%BYTESIZE;
- int offset= nBit/BYTESIZE;
- int index = 0;
-
- int n;
- for(n=nItems; n>0; n--) {
- const Ipp8u* pE = ((Ipp8u*)ppE[n-1]) + offset;
- Ipp8u e = pE[0];
- index <<= 1;
- index += (e>>shift) &1;
- }
- return index;
-}
-
-/* sscm version */
-BNU_CHUNK_T* cpGFpxMultiExp(BNU_CHUNK_T* pR, const BNU_CHUNK_T* ppA[], const BNU_CHUNK_T* ppE[], int nsE[], int nItems,
- gsModEngine* pGFEx, Ipp8u* pScratchBuffer)
-{
- /* align scratch buffer */
- BNU_CHUNK_T* pTable = (BNU_CHUNK_T*)( IPP_ALIGNED_PTR(pScratchBuffer, CACHE_LINE_SIZE) );
- /* pre-compute table */
- cpPrecomputeMultiExp(pTable, ppA, nItems, pGFEx);
-
- {
- mod_mul mulF = GFP_METHOD(pGFEx)->mul; /* mul and sqr methods and parameter */
- mod_sqr sqrF = GFP_METHOD(pGFEx)->sqr;
- int elmLen = GFP_FELEN(pGFEx);
-
- /* find out the longest exponent */
- int expBitSize = cpGetMaxBitsizeExponent(ppE, nsE, nItems);
-
- /* allocate resource and copy expanded exponents into */
- const BNU_CHUNK_T* ppExponent[IPP_MAX_EXPONENT_NUM];
- {
- int n;
- for(n=0; n<nItems; n++) {
- BNU_CHUNK_T* pData = cpGFpGetPool(1, pGFEx);
- //gres: temporary excluded: assert(NULL!=pData);
- cpGFpElementCopyPadd(pData, elmLen, ppE[n], nsE[n]);
- ppExponent[n] = pData;
- }
- }
-
- /* multiexponentiation */
- {
- /* get temporary */
- BNU_CHUNK_T* pT = cpGFpGetPool(1, pGFEx);
-
- /* init result */
- int tblIdx = GetIndex(ppExponent, nItems, --expBitSize);
- //cpScrambleGet((Ipp8u*)pR, elmDataSize, pScratchBuffer+tblIdx, nPrecomputed);
- gsScrambleGet_sscm(pR, elmLen, pTable, tblIdx, nItems);
-
- //gres: temporary excluded: assert(NULL!=pT);
-
- /* compute the rest: square and multiply */
- for(--expBitSize; expBitSize>=0; expBitSize--) {
- sqrF(pR, pR, pGFEx);
- tblIdx = GetIndex(ppExponent, nItems, expBitSize);
- //cpScrambleGet((Ipp8u*)pT, elmDataSize, pScratchBuffer+tblIdx, nPrecomputed);
- gsScrambleGet_sscm(pT, elmLen, pTable, tblIdx, nItems);
- mulF(pR, pR, pT, pGFEx);
- }
-
- /* release resourse */
- cpGFpReleasePool(1, pGFEx);
- }
-
- /* release resourse */
- cpGFpReleasePool(nItems, pGFEx);
-
- return pR;
- }
-}