| /******************************************************************************* |
| * Copyright 2010-2018 Intel Corporation |
| * All Rights Reserved. |
| * |
| * If this software was obtained under the Intel Simplified Software License, |
| * the following terms apply: |
| * |
| * The source code, information and material ("Material") contained herein is |
| * owned by Intel Corporation or its suppliers or licensors, and title to such |
| * Material remains with Intel Corporation or its suppliers or licensors. The |
| * Material contains proprietary information of Intel or its suppliers and |
| * licensors. The Material is protected by worldwide copyright laws and treaty |
| * provisions. No part of the Material may be used, copied, reproduced, |
| * modified, published, uploaded, posted, transmitted, distributed or disclosed |
| * in any way without Intel's prior express written permission. No license under |
| * any patent, copyright or other intellectual property rights in the Material |
| * is granted to or conferred upon you, either expressly, by implication, |
| * inducement, estoppel or otherwise. Any license under such intellectual |
| * property rights must be express and approved by Intel in writing. |
| * |
| * Unless otherwise agreed by Intel in writing, you may not remove or alter this |
| * notice or any other notice embedded in Materials by Intel or Intel's |
| * suppliers or licensors in any way. |
| * |
| * |
| * If this software was obtained under the Apache License, Version 2.0 (the |
| * "License"), the following terms apply: |
| * |
| * 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); |
| |
| #define InitGFpxCtx OWNAPI(InitGFpxCtx) |
| void InitGFpxCtx(const IppsGFpState* pGroundGF, int extDeg, const IppsGFpMethod* method, IppsGFpState* pGFpx); |
| |
| #endif /* _PCP_GFPEXT_H_ */ |