Home | History | Annotate | Download | only in ippcp
      1 /*******************************************************************************
      2 * Copyright 2010-2018 Intel Corporation
      3 * All Rights Reserved.
      4 *
      5 * If this  software was obtained  under the  Intel Simplified  Software License,
      6 * the following terms apply:
      7 *
      8 * The source code,  information  and material  ("Material") contained  herein is
      9 * owned by Intel Corporation or its  suppliers or licensors,  and  title to such
     10 * Material remains with Intel  Corporation or its  suppliers or  licensors.  The
     11 * Material  contains  proprietary  information  of  Intel or  its suppliers  and
     12 * licensors.  The Material is protected by  worldwide copyright  laws and treaty
     13 * provisions.  No part  of  the  Material   may  be  used,  copied,  reproduced,
     14 * modified, published,  uploaded, posted, transmitted,  distributed or disclosed
     15 * in any way without Intel's prior express written permission.  No license under
     16 * any patent,  copyright or other  intellectual property rights  in the Material
     17 * is granted to  or  conferred  upon  you,  either   expressly,  by implication,
     18 * inducement,  estoppel  or  otherwise.  Any  license   under such  intellectual
     19 * property rights must be express and approved by Intel in writing.
     20 *
     21 * Unless otherwise agreed by Intel in writing,  you may not remove or alter this
     22 * notice or  any  other  notice   embedded  in  Materials  by  Intel  or Intel's
     23 * suppliers or licensors in any way.
     24 *
     25 *
     26 * If this  software  was obtained  under the  Apache License,  Version  2.0 (the
     27 * "License"), the following terms apply:
     28 *
     29 * You may  not use this  file except  in compliance  with  the License.  You may
     30 * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
     31 *
     32 *
     33 * Unless  required  by   applicable  law  or  agreed  to  in  writing,  software
     34 * distributed under the License  is distributed  on an  "AS IS"  BASIS,  WITHOUT
     35 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     36 *
     37 * See the   License  for the   specific  language   governing   permissions  and
     38 * limitations under the License.
     39 *******************************************************************************/
     40 
     41 /*
     42 //
     43 //  Purpose:
     44 //     Intel(R) Integrated Performance Primitives. Cryptography Primitives.
     45 //     Internal EC over GF(p^m) basic Definitions & Function Prototypes
     46 //
     47 //
     48 */
     49 
     50 #if !defined(_CP_ECGFP_H_)
     51 #define _CP_ECGFP_H_
     52 
     53 #include "pcpgfpstuff.h"
     54 #include "pcpgfpxstuff.h"
     55 #include "pcpmask_ct.h"
     56 
     57 #define _LEGACY_ECCP_SUPPORT_
     58 
     59 /*
     60 // EC over GF(p) Point context
     61 */
     62 typedef struct _cpGFpECPoint {
     63    IppCtxId     idCtx;  /* EC Point identifier     */
     64    int          flags;  /* flags: affine           */
     65    int    elementSize;  /* size of each coordinate */
     66    BNU_CHUNK_T* pData;  /* coordinatex X, Y, Z     */
     67 } cpGFPECPoint;
     68 
     69 /*
     70 // Contetx Access Macros
     71 */
     72 #define ECP_POINT_ID(ctx)       ((ctx)->idCtx)
     73 #define ECP_POINT_FLAGS(ctx)    ((ctx)->flags)
     74 #define ECP_POINT_FELEN(ctx)    ((ctx)->elementSize)
     75 #define ECP_POINT_DATA(ctx)     ((ctx)->pData)
     76 #define ECP_POINT_X(ctx)        ((ctx)->pData)
     77 #define ECP_POINT_Y(ctx)        ((ctx)->pData+(ctx)->elementSize)
     78 #define ECP_POINT_Z(ctx)        ((ctx)->pData+(ctx)->elementSize*2)
     79 #define ECP_POINT_TEST_ID(ctx)  (ECP_POINT_ID((ctx))==idCtxGFPPoint)
     80 
     81 /* point flags */
     82 #define ECP_AFFINE_POINT   (1)
     83 #define ECP_FINITE_POINT   (2)
     84 
     85 #define  IS_ECP_AFFINE_POINT(ctx)      (ECP_POINT_FLAGS((ctx))&ECP_AFFINE_POINT)
     86 #define SET_ECP_AFFINE_POINT(ctx)      (ECP_POINT_FLAGS((ctx))|ECP_AFFINE_POINT)
     87 #define SET_ECP_PROJECTIVE_POINT(ctx)  (ECP_POINT_FLAGS((ctx))&~ECP_AFFINE_POINT)
     88 
     89 #define  IS_ECP_FINITE_POINT(ctx)      (ECP_POINT_FLAGS((ctx))&ECP_FINITE_POINT)
     90 #define SET_ECP_FINITE_POINT(ctx)      (ECP_POINT_FLAGS((ctx))|ECP_FINITE_POINT)
     91 #define SET_ECP_INFINITE_POINT(ctx)    (ECP_POINT_FLAGS((ctx))&~ECP_FINITE_POINT)
     92 
     93 /*
     94 // define using projective coordinates
     95 */
     96 #define JACOBIAN        (0)
     97 #define HOMOGENEOUS     (1)
     98 #define ECP_PROJECTIVE_COORD  JACOBIAN
     99 //#define ECP_PROJECTIVE_COORD  HOMOGENEOUS
    100 
    101 #if (ECP_PROJECTIVE_COORD== JACOBIAN)
    102    #pragma message ("ECP_PROJECTIVE_COORD = JACOBIAN")
    103 #elif (ECP_PROJECTIVE_COORD== HOMOGENEOUS)
    104    #pragma message ("ECP_PROJECTIVE_COORD = HOMOGENEOUS")
    105 #else
    106    #error ECP_PROJECTIVE_COORD should be either JACOBIAN or HOMOGENEOUS type
    107 #endif
    108 
    109 
    110 /*
    111 // pre-computed Base Point descriptor
    112 */
    113 typedef void (*selectAP) (BNU_CHUNK_T* pAP, const BNU_CHUNK_T* pAPtbl, int index);
    114 
    115 typedef struct _cpPrecompAP {
    116    int      w;                   /* scalar's window bitsize */
    117    selectAP select_affine_point; /* get affine point function */
    118    const BNU_CHUNK_T* pTbl;      /* pre-computed table */
    119 } cpPrecompAP;
    120 
    121 
    122 /* EC over GF(p) context */
    123 typedef struct _cpGFpEC {
    124    IppCtxId     idCtx;  /* EC identifier */
    125 
    126    IppsGFpState*  pGF;  /* arbitrary GF(p^d)*/
    127 
    128    int          subgroup;  /* set up subgroup */
    129    int       elementSize;  /* length of EC point */
    130    int      orderBitSize;  /* base_point order bitsize */
    131    BNU_CHUNK_T*       pA;  /*   EC parameter A */
    132    BNU_CHUNK_T*       pB;  /*                B */
    133    BNU_CHUNK_T*       pG;  /*       base_point */
    134    BNU_CHUNK_T* cofactor;  /* cofactor = #E/base_point order */
    135    int          parmAspc;  /* NIST's, EPIDv2.0 A-parameter specific */
    136    int          infinity;  /* 0/1 if B !=0/==0 */
    137    const cpPrecompAP* pBaseTbl;  /* address of pre-computed [n]G tabble */
    138    gsModEngine*    pMontR; /* EC order montgomery engine */
    139 
    140    BNU_CHUNK_T*    pPool;  /* pool of points   */
    141    #if defined(_LEGACY_ECCP_SUPPORT_)
    142    BNU_CHUNK_T*  pPublic;  /* regular   public key */
    143    BNU_CHUNK_T*  pPublicE; /* ephemeral public key */
    144    BNU_CHUNK_T*  pPrivat;  /* regular   private key */
    145    BNU_CHUNK_T*  pPrivatE; /* ephemeral private key */
    146    BNU_CHUNK_T*  pBuffer;  /* pointer to scaratch buffer (for lagacy ECCP only) */
    147    #endif
    148 } cpGFPEC;
    149 
    150 #define ECGFP_ALIGNMENT   ((int)(sizeof(void*)))
    151 
    152 /* Local definitions */
    153 #define EC_POOL_SIZE       (10)  /* num of points into the pool */
    154 
    155 #define EC_MONT_POOL_SIZE   (4)  /* num of temp values for modular arithmetic */
    156 
    157 #define ECP_ID(pCtx)          ((pCtx)->idCtx)
    158 #define ECP_GFP(pCtx)         ((pCtx)->pGF)
    159 #define ECP_SUBGROUP(pCtx)    ((pCtx)->subgroup)
    160 #define ECP_POINTLEN(pCtx)    ((pCtx)->elementSize)
    161 #define ECP_ORDBITSIZE(pCtx)  ((pCtx)->orderBitSize)
    162 #define ECP_COFACTOR(pCtx)    ((pCtx)->cofactor)
    163 #define ECP_SPECIFIC(pCtx)    ((pCtx)->parmAspc)
    164 #define ECP_INFINITY(pCtx)    ((pCtx)->infinity)
    165 #define ECP_A(pCtx)           ((pCtx)->pA)
    166 #define ECP_B(pCtx)           ((pCtx)->pB)
    167 #define ECP_G(pCtx)           ((pCtx)->pG)
    168 #define ECP_PREMULBP(pCtx)    ((pCtx)->pBaseTbl)
    169 #define ECP_MONT_R(pCtx)      ((pCtx)->pMontR)
    170 #define ECP_POOL(pCtx)        ((pCtx)->pPool)
    171 #if defined(_LEGACY_ECCP_SUPPORT_)
    172    #define ECP_PUBLIC(pCtx)   ((pCtx)->pPublic)
    173    #define ECP_PUBLIC_E(pCtx) ((pCtx)->pPublicE)
    174    #define ECP_PRIVAT(pCtx)   ((pCtx)->pPrivat)
    175    #define ECP_PRIVAT_E(pCtx) ((pCtx)->pPrivatE)
    176    #define ECP_SBUFFER(pCtx)  ((pCtx)->pBuffer)
    177 #endif
    178 
    179 #define ECP_TEST_ID(pCtx)     (ECP_ID((pCtx))==idCtxGFPEC)
    180 
    181 /* EC curve specific (a-parameter) */
    182 #define ECP_Acom    (0) /* commont case */
    183 #define ECP_Ami3    (1) /* a=-3 NIST's and SM2 curve */
    184 #define ECP_Aeq0    (2) /* a=0  EPIDv2.0 curve */
    185 
    186 #define ECP_ARB     ECP_Acom
    187 #define ECP_STD     ECP_Ami3
    188 #define ECP_EPID2   ECP_Aeq0
    189 
    190 /* std ec pre-computed tables */
    191 #define gfpec_precom_nistP192r1_fun OWNAPI(gfpec_precom_nistP192r1_fun)
    192 #define gfpec_precom_nistP224r1_fun OWNAPI(gfpec_precom_nistP224r1_fun)
    193 #define gfpec_precom_nistP256r1_fun OWNAPI(gfpec_precom_nistP256r1_fun)
    194 #define gfpec_precom_nistP384r1_fun OWNAPI(gfpec_precom_nistP384r1_fun)
    195 #define gfpec_precom_nistP521r1_fun OWNAPI(gfpec_precom_nistP521r1_fun)
    196 #define gfpec_precom_sm2_fun        OWNAPI(gfpec_precom_sm2_fun)
    197 
    198 const cpPrecompAP* gfpec_precom_nistP192r1_fun(void);
    199 const cpPrecompAP* gfpec_precom_nistP224r1_fun(void);
    200 const cpPrecompAP* gfpec_precom_nistP256r1_fun(void);
    201 const cpPrecompAP* gfpec_precom_nistP384r1_fun(void);
    202 const cpPrecompAP* gfpec_precom_nistP521r1_fun(void);
    203 const cpPrecompAP* gfpec_precom_sm2_fun(void);
    204 
    205 /*
    206 // get/release n points from/to the pool
    207 */
    208 __INLINE BNU_CHUNK_T* cpEcGFpGetPool(int n, IppsGFpECState* pEC)
    209 {
    210    BNU_CHUNK_T* pPool = ECP_POOL(pEC);
    211    ECP_POOL(pEC) += n*GFP_FELEN(GFP_PMA(ECP_GFP(pEC)))*3;
    212    return pPool;
    213 }
    214 __INLINE void cpEcGFpReleasePool(int n, IppsGFpECState* pEC)
    215 {
    216    ECP_POOL(pEC) -= n*GFP_FELEN(GFP_PMA(ECP_GFP(pEC)))*3;
    217 }
    218 
    219 __INLINE IppsGFpECPoint* cpEcGFpInitPoint(IppsGFpECPoint* pPoint, BNU_CHUNK_T* pData, int flags, const IppsGFpECState* pEC)
    220 {
    221    ECP_POINT_ID(pPoint) = idCtxGFPPoint;
    222    ECP_POINT_FLAGS(pPoint) = flags;
    223    ECP_POINT_FELEN(pPoint) = GFP_FELEN(GFP_PMA(ECP_GFP(pEC)));
    224    ECP_POINT_DATA(pPoint) = pData;
    225    return pPoint;
    226 }
    227 
    228 /* copy one point into another */
    229 __INLINE IppsGFpECPoint* gfec_CopyPoint(IppsGFpECPoint* pPointR, const IppsGFpECPoint* pPointA, int elemLen)
    230 {
    231    cpGFpElementCopy(ECP_POINT_DATA(pPointR), ECP_POINT_DATA(pPointA), 3*elemLen);
    232    ECP_POINT_FLAGS(pPointR) = ECP_POINT_FLAGS(pPointA);
    233    return pPointR;
    234 }
    235 
    236 
    237 __INLINE IppsGFpECPoint* gfec_SetPointAtInfinity(IppsGFpECPoint* pPoint)
    238 {
    239    int elemLen = ECP_POINT_FELEN(pPoint);
    240    cpGFpElementPadd(ECP_POINT_X(pPoint), elemLen, 0);
    241    cpGFpElementPadd(ECP_POINT_Y(pPoint), elemLen, 0);
    242    cpGFpElementPadd(ECP_POINT_Z(pPoint), elemLen, 0);
    243    ECP_POINT_FLAGS(pPoint) = 0;
    244    return pPoint;
    245 }
    246 
    247 /*
    248 // test infinity:
    249 //    IsProjectivePointAtInfinity
    250 */
    251 __INLINE int gfec_IsPointAtInfinity(const IppsGFpECPoint* pPoint)
    252 {
    253    return GFP_IS_ZERO( ECP_POINT_Z(pPoint), ECP_POINT_FELEN(pPoint));
    254 }
    255 
    256 
    257 
    258 /* signed encode */
    259 __INLINE void booth_recode(Ipp8u* sign, Ipp8u* digit, Ipp8u in, int w)
    260 {
    261    Ipp8u s = (Ipp8u)(~((in >> w) - 1));
    262    int d = (1 << (w+1)) - in - 1;
    263    d = (d & s) | (in & ~s);
    264    d = (d >> 1) + (d & 1);
    265    *sign = s & 1;
    266    *digit = (Ipp8u)d;
    267 }
    268 
    269 
    270 #define gfec_point_add        OWNAPI(gfec_point_add)
    271 void    gfec_point_add       (BNU_CHUNK_T* pRdata,
    272                         const BNU_CHUNK_T* pPdata,
    273                         const BNU_CHUNK_T* pQdata, IppsGFpECState* pEC);
    274 #define gfec_affine_point_add OWNAPI(gfec_affine_point_add)
    275 void    gfec_affine_point_add(BNU_CHUNK_T* pRdata,
    276                         const BNU_CHUNK_T* pPdata,
    277                         const BNU_CHUNK_T* pAdata, IppsGFpECState* pEC);
    278 #define gfec_point_double     OWNAPI(gfec_point_double)
    279 void    gfec_point_double    (BNU_CHUNK_T* pRdata,
    280                         const BNU_CHUNK_T* pPdata, IppsGFpECState* pEC);
    281 #define gfec_point_mul        OWNAPI(gfec_point_mul)
    282 void    gfec_point_mul       (BNU_CHUNK_T* pRdata,
    283                         const BNU_CHUNK_T* pPdata, const Ipp8u* pScalar8, int scalarBitSize, IppsGFpECState* pEC, Ipp8u* pScratchBuffer);
    284 #define gfec_point_prod       OWNAPI(gfec_point_prod)
    285 void    gfec_point_prod      (BNU_CHUNK_T* pointR,
    286                         const BNU_CHUNK_T* pointA, const Ipp8u* pScalarA,
    287                         const BNU_CHUNK_T* pointB, const Ipp8u* pScalarB, int scalarBitSize, IppsGFpECState* pEC, Ipp8u* pScratchBuffer);
    288 #define gfec_base_point_mul   OWNAPI(gfec_base_point_mul)
    289 void    gfec_base_point_mul  (BNU_CHUNK_T* pRdata, const Ipp8u* pScalarB, int scalarBitSize, IppsGFpECState* pEC);
    290 #define setupTable            OWNAPI(setupTable)
    291 void    setupTable           (BNU_CHUNK_T* pTbl,
    292                         const BNU_CHUNK_T* pPdata, IppsGFpECState* pEC);
    293 
    294 
    295 /* size of context */
    296 #define cpGFpECGetSize OWNAPI(cpGFpECGetSize)
    297     int cpGFpECGetSize(int deg, int basicElmBitSize);
    298 
    299 /* point operations */
    300 #define gfec_GetPoint OWNAPI(gfec_GetPoint)
    301     int gfec_GetPoint(BNU_CHUNK_T* pX, BNU_CHUNK_T* pY, const IppsGFpECPoint* pPoint, IppsGFpECState* pEC);
    302 #define gfec_SetPoint OWNAPI(gfec_SetPoint)
    303     int gfec_SetPoint(BNU_CHUNK_T* pP, const BNU_CHUNK_T* pX, const BNU_CHUNK_T* pY, IppsGFpECState* pEC);
    304 #define gfec_MakePoint OWNAPI(gfec_MakePoint)
    305     int gfec_MakePoint(IppsGFpECPoint* pPoint, const BNU_CHUNK_T* pElm, IppsGFpECState* pEC);
    306 #define gfec_ComparePoint OWNAPI(gfec_ComparePoint)
    307     int gfec_ComparePoint(const IppsGFpECPoint* pP, const IppsGFpECPoint* pQ, IppsGFpECState* pEC);
    308 #define gfec_IsPointOnCurve OWNAPI(gfec_IsPointOnCurve)
    309     int gfec_IsPointOnCurve(const IppsGFpECPoint* pP, IppsGFpECState* pEC);
    310 
    311 __INLINE IppsGFpECPoint* gfec_DblPoint(IppsGFpECPoint* pR,
    312                         const IppsGFpECPoint* pP, IppsGFpECState* pEC)
    313 {
    314    gfec_point_double(ECP_POINT_X(pR), ECP_POINT_X(pP), pEC);
    315    ECP_POINT_FLAGS(pR) = gfec_IsPointAtInfinity(pR)? 0 : ECP_FINITE_POINT;
    316    return pR;
    317 }
    318 
    319 __INLINE IppsGFpECPoint* gfec_AddPoint(IppsGFpECPoint* pR,
    320                         const IppsGFpECPoint* pP, const IppsGFpECPoint* pQ,
    321                         IppsGFpECState* pEC)
    322 {
    323    gfec_point_add(ECP_POINT_X(pR), ECP_POINT_X(pP), ECP_POINT_X(pQ), pEC);
    324    ECP_POINT_FLAGS(pR) = gfec_IsPointAtInfinity(pR)? 0 : ECP_FINITE_POINT;
    325    return pR;
    326 }
    327 
    328 
    329 #define         gfec_NegPoint OWNAPI(gfec_NegPoint)
    330 IppsGFpECPoint* gfec_NegPoint(IppsGFpECPoint* pR,
    331                         const IppsGFpECPoint* pP, IppsGFpECState* pEC);
    332 #define         gfec_MulPoint OWNAPI(gfec_MulPoint)
    333 IppsGFpECPoint* gfec_MulPoint(IppsGFpECPoint* pR,
    334                         const IppsGFpECPoint* pP, const BNU_CHUNK_T* pScalar, int scalarLen,
    335                               IppsGFpECState* pEC, Ipp8u* pScratchBuffer);
    336 #define         gfec_MulBasePoint OWNAPI(gfec_MulBasePoint)
    337 IppsGFpECPoint* gfec_MulBasePoint(IppsGFpECPoint* pR,
    338                         const BNU_CHUNK_T* pScalar, int scalarLen,
    339                               IppsGFpECState* pEC, Ipp8u* pScratchBuffer);
    340 //#define         gfec_PointProduct OWNAPI(gfec_PointProduct)
    341 //IppsGFpECPoint* gfec_PointProduct(IppsGFpECPoint* pR,
    342 //                        const IppsGFpECPoint* pP, const BNU_CHUNK_T* pScalarP, int scalarPlen,
    343 //                        const IppsGFpECPoint* pQ, const BNU_CHUNK_T* pScalarQ, int scalarQlen,
    344 //                        IppsGFpECState* pEC, Ipp8u* pScratchBuffer);
    345 #define         gfec_BasePointProduct OWNAPI(gfec_BasePointProduct)
    346 IppsGFpECPoint* gfec_BasePointProduct(IppsGFpECPoint* pR,
    347                         const BNU_CHUNK_T* pScalarG, int scalarGlen,
    348                         const IppsGFpECPoint* pP, const BNU_CHUNK_T* pScalarP, int scalarPlen,
    349                         IppsGFpECState* pEC, Ipp8u* pScratchBuffer);
    350 
    351 #define p192r1_select_ap_w7 OWNAPI(p192r1_select_ap_w7)
    352    void p192r1_select_ap_w7(BNU_CHUNK_T* pAffinePoint, const BNU_CHUNK_T* pTable, int index);
    353 #define p224r1_select_ap_w7 OWNAPI(p224r1_select_ap_w7)
    354    void p224r1_select_ap_w7(BNU_CHUNK_T* pAffinePoint, const BNU_CHUNK_T* pTable, int index);
    355 #define p256r1_select_ap_w7 OWNAPI(p256r1_select_ap_w7)
    356    void p256r1_select_ap_w7(BNU_CHUNK_T* pAffinePoint, const BNU_CHUNK_T* pTable, int index);
    357 #define p384r1_select_ap_w5 OWNAPI(p384r1_select_ap_w5)
    358    void p384r1_select_ap_w5(BNU_CHUNK_T* pAffinePoint, const BNU_CHUNK_T* pTable, int index);
    359 #define p521r1_select_ap_w5 OWNAPI(p521r1_select_ap_w5)
    360    void p521r1_select_ap_w5(BNU_CHUNK_T* pAffinePoint, const BNU_CHUNK_T* pTable, int index);
    361 
    362 #endif /* _CP_ECGFP_H_ */
    363