| /*############################################################################ |
| # 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) Integrated Performance Primitives |
| // Cryptographic Primitives (ippCP) |
| // GF(p) extension internal |
| // |
| */ |
| |
| #if !defined(_PCP_GFPEXT_H_) |
| #define _PCP_GFPEXT_H_ |
| |
| #include "pcpgfpstuff.h" |
| |
| |
| /* GF(p^d) pool */ |
| #define GFPX_PESIZE(pGF) GFP_FELEN((pGF)) |
| #define GFPX_POOL_SIZE (14) //(8) /* Number of temporary variables in pool */ |
| |
| /* address of ground field element inside expanded field element */ |
| #define GFPX_IDX_ELEMENT(pxe, idx, eleSize) ((pxe)+(eleSize)*(idx)) |
| |
| |
| __INLINE int degree(const BNU_CHUNK_T* pE, const gsModEngine* pGFEx) |
| { |
| int groundElemLen = GFP_FELEN(GFP_PARENT(pGFEx)); |
| int deg; |
| for(deg=GFP_EXTDEGREE(pGFEx)-1; deg>=0; deg-- ) { |
| if(!GFP_IS_ZERO(pE+groundElemLen*deg, groundElemLen)) break; |
| } |
| return deg; |
| } |
| |
| __INLINE gsModEngine* cpGFpBasic(const gsModEngine* pGFEx) |
| { |
| while( !GFP_IS_BASIC(pGFEx) ) { |
| pGFEx = GFP_PARENT(pGFEx); |
| } |
| return (gsModEngine*)pGFEx; |
| } |
| __INLINE int cpGFpBasicDegreeExtension(const gsModEngine* pGFEx) |
| { |
| int degree = GFP_EXTDEGREE(pGFEx); |
| while( !GFP_IS_BASIC(pGFEx) ) { |
| pGFEx = GFP_PARENT(pGFEx); |
| degree *= GFP_EXTDEGREE(pGFEx); |
| } |
| return degree; |
| } |
| |
| /* convert external data (Ipp32u) => internal element (BNU_CHUNK_T) representation |
| returns length of element (in BNU_CHUNK_T) |
| */ |
| __INLINE int cpGFpxCopyToChunk(BNU_CHUNK_T* pElm, const Ipp32u* pA, int nsA, const gsModEngine* pGFEx) |
| { |
| gsModEngine* pBasicGFE = cpGFpBasic(pGFEx); |
| int basicExtension = cpGFpBasicDegreeExtension(pGFEx); |
| int basicElmLen32 = GFP_FELEN32(pBasicGFE); |
| int basicElmLen = GFP_FELEN(pBasicGFE); |
| int deg; |
| for(deg=0; deg<basicExtension && nsA>0; deg++, nsA -= basicElmLen32) { |
| int srcLen = IPP_MIN(nsA, basicElmLen32); |
| ZEXPAND_COPY_BNU((Ipp32u*)pElm, basicElmLen*(int)(sizeof(BNU_CHUNK_T)/sizeof(Ipp32u)), pA,srcLen); |
| pElm += basicElmLen; |
| pA += basicElmLen32; |
| } |
| return basicElmLen*deg; |
| } |
| |
| /* convert internal element (BNU_CHUNK_T) => external data (Ipp32u) representation |
| returns length of data (in Ipp32u) |
| */ |
| __INLINE int cpGFpxCopyFromChunk(Ipp32u* pA, const BNU_CHUNK_T* pElm, const gsModEngine* pGFEx) |
| { |
| gsModEngine* pBasicGFE = cpGFpBasic(pGFEx); |
| int basicExtension = cpGFpBasicDegreeExtension(pGFEx); |
| int basicElmLen32 = GFP_FELEN32(pBasicGFE); |
| int basicElmLen = GFP_FELEN(pBasicGFE); |
| int deg; |
| for(deg=0; deg<basicExtension; deg++) { |
| COPY_BNU(pA, (Ipp32u*)pElm, basicElmLen32); |
| pA += basicElmLen32; |
| pElm += basicElmLen; |
| } |
| return basicElmLen32*deg; |
| } |
| |
| |
| #define cpGFpxRand OWNAPI(cpGFpxRand) |
| BNU_CHUNK_T* cpGFpxRand(BNU_CHUNK_T* pR, gsModEngine* pGFEx, IppBitSupplier rndFunc, void* pRndParam); |
| |
| #define cpGFpxSet OWNAPI(cpGFpxSet) |
| BNU_CHUNK_T* cpGFpxSet (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pDataA, int nsA, gsModEngine* pGFEx); |
| |
| #define cpGFpxGet OWNAPI(cpGFpxGet) |
| BNU_CHUNK_T* cpGFpxGet (BNU_CHUNK_T* pDataA, int nsA, const BNU_CHUNK_T* pR, gsModEngine* pGFEx); |
| |
| #define cpGFpxSetPolyTerm OWNAPI(cpGFpxSetPolyTerm) |
| BNU_CHUNK_T* cpGFpxSetPolyTerm (BNU_CHUNK_T* pR, int deg, const BNU_CHUNK_T* pDataA, int nsA, gsModEngine* pGFEx); |
| |
| #define cpGFpxGetPolyTerm OWNAPI(cpGFpxGetPolyTerm) |
| BNU_CHUNK_T* cpGFpxGetPolyTerm (BNU_CHUNK_T* pDataA, int nsA, const BNU_CHUNK_T* pR, int deg, gsModEngine* pGFEx); |
| |
| #define cpGFpxAdd OWNAPI(cpGFpxAdd) |
| BNU_CHUNK_T* cpGFpxAdd (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsModEngine* pGFEx); |
| |
| #define cpGFpxSub OWNAPI(cpGFpxSub) |
| BNU_CHUNK_T* cpGFpxSub (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsModEngine* pGFEx); |
| |
| #define cpGFpxMul OWNAPI(cpGFpxMul) |
| BNU_CHUNK_T* cpGFpxMul (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsModEngine* pGFEx); |
| |
| #define cpGFpxSqr OWNAPI(cpGFpxSqr) |
| BNU_CHUNK_T* cpGFpxSqr (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx); |
| |
| #define cpGFpxAdd_GFE OWNAPI(cpGFpxAdd_GFE) |
| BNU_CHUNK_T* cpGFpxAdd_GFE (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pGroundB, gsModEngine* pGFEx); |
| |
| #define cpGFpxSub_GFE OWNAPI(cpGFpxSub_GFE) |
| BNU_CHUNK_T* cpGFpxSub_GFE (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pGroundB, gsModEngine* pGFEx); |
| |
| #define cpGFpxMul_GFE OWNAPI(cpGFpxMul_GFE) |
| BNU_CHUNK_T* cpGFpxMul_GFE (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pGroundB, gsModEngine* pGFEx); |
| |
| #define cpGFpGetOptimalWinSize OWNAPI(cpGFpGetOptimalWinSize) |
| int cpGFpGetOptimalWinSize(int bitsize); |
| |
| #define cpGFpxExp OWNAPI(cpGFpxExp) |
| BNU_CHUNK_T* cpGFpxExp (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pE, int nsE, gsModEngine* pGFEx, Ipp8u* pScratchBuffer); |
| |
| #define cpGFpxMultiExp OWNAPI(cpGFpxMultiExp) |
| 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); |
| |
| #define cpGFpxConj OWNAPI(cpGFpxConj) |
| BNU_CHUNK_T* cpGFpxConj(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx); |
| |
| #define cpGFpxNeg OWNAPI(cpGFpxNeg) |
| BNU_CHUNK_T* cpGFpxNeg (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx); |
| |
| #define cpGFpxInv OWNAPI(cpGFpxInv) |
| BNU_CHUNK_T* cpGFpxInv (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx); |
| |
| #define cpGFpxHalve OWNAPI(cpGFpxHalve) |
| BNU_CHUNK_T* cpGFpxHalve (BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsModEngine* pGFEx); |
| |
| #endif /* _PCP_GFPEXT_H_ */ |