Home | History | Annotate | Download | only in ippcp
      1 /*******************************************************************************
      2 * Copyright 2002-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 //               Intel(R) Integrated Performance Primitives
     43 //                   Cryptographic Primitives (ippcp)
     44 //
     45 //
     46 */
     47 
     48 #if !defined(_CP_MONTGOMETRY_H)
     49 #define _CP_MONTGOMETRY_H
     50 
     51 #include "pcpbn.h"
     52 #include "gsmodstuff.h"
     53 
     54 //tbcd: temporary excluded: #include <assert.h>
     55 
     56 #define MONT_DEFAULT_POOL_LENGTH (6)
     57 
     58 /*
     59 // Montgomery spec structure
     60 */
     61 struct _cpMontgomery
     62 {
     63    IppCtxId       idCtx;      /* Montgomery spec identifier             */
     64    cpSize         maxLen;     /* Maximum length of modulus being stored */
     65    gsModEngine*   pEngine;    /* Modular arith engine structure         */
     66 };
     67 
     68 /* accessory macros */
     69 #define MNT_ID(eng)       ((eng)->idCtx)
     70 #define MNT_ROOM(eng)     ((eng)->maxLen)
     71 #define MNT_ENGINE(eng)   ((eng)->pEngine)
     72 
     73 #define MNT_VALID_ID(eng) (MNT_ID((eng))==idCtxMontgomery)
     74 
     75 /* default methos */
     76 #define EXPONENT_METHOD    (ippBinaryMethod)
     77 
     78 /* alignment */
     79 #define MONT_ALIGNMENT  ((int)(sizeof(void*)))
     80 
     81 
     82 /*
     83 // Pacp/unpack Montgomery context
     84 */
     85 #define cpPackMontCtx OWNAPI(cpPackMontCtx)
     86 void    cpPackMontCtx(const IppsMontState* pCtx, Ipp8u* pBuffer);
     87 #define cpUnpackMontCtx OWNAPI(cpUnpackMontCtx)
     88 void    cpUnpackMontCtx(const Ipp8u* pBuffer, IppsMontState* pCtx);
     89 
     90 
     91 /*
     92 // Montgomery reduction, multiplication and squaring
     93 */
     94 __INLINE void cpMontRed_BNU(BNU_CHUNK_T* pR,
     95                             BNU_CHUNK_T* pProduct,
     96                             gsModEngine* pModEngine)
     97 {
     98    MOD_METHOD( pModEngine )->red(pR, pProduct, pModEngine);
     99 }
    100 
    101 __INLINE void cpMontMul_BNU(BNU_CHUNK_T* pR,
    102                      const BNU_CHUNK_T* pA,
    103                      const BNU_CHUNK_T* pB,
    104                            gsModEngine* pModEngine)
    105 {
    106    MOD_METHOD( pModEngine )->mul(pR, pA, pB, pModEngine);
    107 }
    108 
    109 __INLINE cpSize cpMontMul_BNU_EX(BNU_CHUNK_T* pR,
    110                            const BNU_CHUNK_T* pA, cpSize nsA,
    111                            const BNU_CHUNK_T* pB, cpSize nsB,
    112                                  gsModEngine* pModEngine)
    113 {
    114    const int usedPoolLen = 1;
    115    cpSize nsM = MOD_LEN( pModEngine );
    116    BNU_CHUNK_T* pDataR  = pR;
    117    BNU_CHUNK_T* pDataA  = gsModPoolAlloc(pModEngine, usedPoolLen);
    118    //tbcd: temporary excluded: assert(NULL!=pDataA);
    119 
    120    ZEXPAND_COPY_BNU(pDataA, nsM, pA, nsA);
    121    ZEXPAND_COPY_BNU(pDataR, nsM, pB, nsB);
    122 
    123    MOD_METHOD( pModEngine )->mul(pDataR, pDataA, pDataR, pModEngine);
    124 
    125    gsModPoolFree(pModEngine, usedPoolLen);
    126    return nsM;
    127 }
    128 
    129 __INLINE void cpMontSqr_BNU(BNU_CHUNK_T* pR,
    130                       const BNU_CHUNK_T* pA,
    131                             gsModEngine* pModEngine)
    132 {
    133    MOD_METHOD( pModEngine )->sqr(pR, pA, pModEngine);
    134 }
    135 
    136 __INLINE void cpMontSqr_BNU_EX(BNU_CHUNK_T* pR,
    137                          const BNU_CHUNK_T* pA, cpSize nsA,
    138                                gsModEngine* pModEngine)
    139 {
    140    cpSize nsM = MOD_LEN( pModEngine );
    141    ZEXPAND_COPY_BNU(pR, nsM, pA, nsA);
    142 
    143    MOD_METHOD( pModEngine )->sqr(pR, pR, pModEngine);
    144 }
    145 
    146 /*
    147 // Montgomery encoding/decoding
    148 */
    149 __INLINE cpSize cpMontEnc_BNU(BNU_CHUNK_T* pR,
    150                         const BNU_CHUNK_T* pXreg,
    151                               gsModEngine* pModEngine)
    152 {
    153    cpSize nsM = MOD_LEN(pModEngine);
    154 
    155    MOD_METHOD( pModEngine )->encode(pR, pXreg, pModEngine);
    156 
    157    FIX_BNU(pR, nsM);
    158    return nsM;
    159 }
    160 
    161 __INLINE cpSize cpMontEnc_BNU_EX(BNU_CHUNK_T* pR,
    162                            const BNU_CHUNK_T* pXreg, cpSize nsX,
    163                                  gsModEngine* pModEngine)
    164 {
    165    cpSize nsM = MOD_LEN(pModEngine);
    166 
    167    ZEXPAND_COPY_BNU(pR, nsM, pXreg, nsX);
    168 
    169    MOD_METHOD( pModEngine )->encode(pR, pR, pModEngine);
    170 
    171    FIX_BNU(pR, nsM);
    172 
    173    return nsM;
    174 }
    175 
    176 __INLINE cpSize cpMontDec_BNU(BNU_CHUNK_T* pR,
    177                         const BNU_CHUNK_T* pXmont, cpSize nsX,
    178                               gsModEngine* pModEngine)
    179 {
    180    cpSize nsM = MOD_LEN( pModEngine );
    181 
    182    ZEXPAND_COPY_BNU(pR, nsM, pXmont, nsX);
    183 
    184    MOD_METHOD( pModEngine )->decode(pR, pR, pModEngine);
    185 
    186    FIX_BNU(pR, nsM);
    187    return nsM;
    188 }
    189 
    190 __INLINE void cpMontMul_BN(IppsBigNumState* pRbn,
    191                      const IppsBigNumState* pXbn,
    192                      const IppsBigNumState* pYbn,
    193                            gsModEngine*     pModEngine)
    194 {
    195    cpSize nsM = cpMontMul_BNU_EX(BN_NUMBER(pRbn),
    196                                  BN_NUMBER(pXbn), BN_SIZE(pXbn),
    197                                  BN_NUMBER(pYbn), BN_SIZE(pYbn),
    198                                  pModEngine);
    199 
    200    FIX_BNU(BN_NUMBER(pRbn), nsM);
    201    BN_SIZE(pRbn) = nsM;
    202    BN_SIGN(pRbn) = ippBigNumPOS;
    203 }
    204 
    205 __INLINE void cpMontEnc_BN(IppsBigNumState* pRbn,
    206                      const IppsBigNumState* pXbn,
    207                            gsModEngine*     pModEngine)
    208 {
    209    cpSize nsM = cpMontEnc_BNU_EX(BN_NUMBER(pRbn),
    210                                  BN_NUMBER(pXbn), BN_SIZE(pXbn),
    211                                  pModEngine);
    212 
    213    BN_SIZE(pRbn) = nsM;
    214    BN_SIGN(pRbn) = ippBigNumPOS;
    215 }
    216 
    217 __INLINE void cpMontDec_BN(IppsBigNumState* pRbn,
    218                      const IppsBigNumState* pXbn,
    219                            gsModEngine*     pModEngine)
    220 {
    221    cpSize nsM = MOD_LEN(pModEngine);
    222    cpMontDec_BNU(BN_NUMBER(pRbn), BN_NUMBER(pXbn), BN_SIZE(pXbn), pModEngine);
    223 
    224    BN_SIZE(pRbn) = nsM;
    225    BN_SIGN(pRbn) = ippBigNumPOS;
    226 }
    227 
    228 /*
    229 // Montgomery exponentiation (binary) "fast" and "safe" versions
    230 */
    231 #define cpMontExpBin_BNU_sscm OWNAPI(cpMontExpBin_BNU_sscm)
    232 cpSize  cpMontExpBin_BNU_sscm(BNU_CHUNK_T* pY,
    233                        const BNU_CHUNK_T* pX, cpSize nsX,
    234                        const BNU_CHUNK_T* pE, cpSize nsE,
    235                              gsModEngine* pModEngine);
    236 
    237 #define cpMontExpBin_BNU OWNAPI(cpMontExpBin_BNU)
    238 cpSize  cpMontExpBin_BNU(BNU_CHUNK_T* pY,
    239                    const BNU_CHUNK_T* pX, cpSize nsX,
    240                    const BNU_CHUNK_T* pE, cpSize nsE,
    241                          gsModEngine* pModEngine);
    242 
    243 __INLINE void cpMontExpBin_BN_sscm(IppsBigNumState* pYbn,
    244                              const IppsBigNumState* pXbn,
    245                              const IppsBigNumState* pEbn,
    246                                    gsModEngine*     pMont)
    247 {
    248    BNU_CHUNK_T* pX = BN_NUMBER(pXbn);
    249    cpSize nsX = BN_SIZE(pXbn);
    250    BNU_CHUNK_T* pE = BN_NUMBER(pEbn);
    251    cpSize nsE = BN_SIZE(pEbn);
    252    BNU_CHUNK_T* pY = BN_NUMBER(pYbn);
    253    cpSize nsY = cpMontExpBin_BNU_sscm(pY, pX,nsX, pE,nsE, pMont);
    254    FIX_BNU(pY, nsY);
    255    BN_SIZE(pYbn) = nsY;
    256    BN_SIGN(pYbn) = ippBigNumPOS;
    257 }
    258 
    259 __INLINE void cpMontExpBin_BN(IppsBigNumState* pYbn,
    260                         const IppsBigNumState* pXbn,
    261                         const IppsBigNumState* pEbn,
    262                               gsModEngine* pModEngine)
    263 {
    264    BNU_CHUNK_T* pX = BN_NUMBER(pXbn);
    265    cpSize nsX = BN_SIZE(pXbn);
    266    BNU_CHUNK_T* pE = BN_NUMBER(pEbn);
    267    cpSize nsE = BN_SIZE(pEbn);
    268    BNU_CHUNK_T* pY = BN_NUMBER(pYbn);
    269    cpSize nsY = cpMontExpBin_BNU(pY, pX,nsX, pE,nsE, pModEngine);
    270    FIX_BNU(pY, nsY);
    271    BN_SIZE(pYbn) = nsY;
    272    BN_SIGN(pYbn) = ippBigNumPOS;
    273 }
    274 
    275 
    276 /*
    277 // Montgomery exponentiation (fixed window)
    278 */
    279 #define cpMontExp_WinSize OWNAPI(cpMontExp_WinSize)
    280 cpSize  cpMontExp_WinSize(int bitsize);
    281 
    282 #if defined(_USE_WINDOW_EXP_)
    283 #define cpMontExpWin_BN_sscm OWNAPI(cpMontExpWin_BN_sscm)
    284 void    cpMontExpWin_BN_sscm(IppsBigNumState* pY,
    285                       const IppsBigNumState* pX, const IppsBigNumState* pE,
    286                             gsModEngine*     pMont,
    287                             BNU_CHUNK_T* pPrecompResource);
    288 
    289 #define cpMontExpWin_BN OWNAPI(cpMontExpWin_BN)
    290 void    cpMontExpWin_BN(IppsBigNumState* pY,
    291                   const IppsBigNumState* pX, const IppsBigNumState* pE,
    292                         gsModEngine*     pMont,
    293                         BNU_CHUNK_T* pPrecompResource);
    294 #endif
    295 
    296 /*
    297 // Montgomery multi-exponentiation
    298 */
    299 /* precompute table for multi-exponentiation */
    300 #define cpMontMultiExpInitArray OWNAPI(cpMontMultiExpInitArray)
    301 void    cpMontMultiExpInitArray(BNU_CHUNK_T* pPrecomTbl,
    302                          const BNU_CHUNK_T** ppX, cpSize xItemBitSize, cpSize numItems,
    303                                gsModEngine* pMont);
    304 
    305 /* multi-exponentiation */
    306 #define cpFastMontMultiExp OWNAPI(cpFastMontMultiExp)
    307 void    cpFastMontMultiExp(BNU_CHUNK_T* pY,
    308                      const BNU_CHUNK_T* pPrecomTbl,
    309                      const Ipp8u** ppE, cpSize eItemBitSize, cpSize numItems,
    310                            gsModEngine* pMont);
    311 /*
    312 // Montgomery inversion
    313 */
    314 #define      cpMontInv_BNU OWNAPI(cpMontInv_BNU)
    315 BNU_CHUNK_T* cpMontInv_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, IppsMontState* pMont);
    316 #define      cpRegInv_BNU OWNAPI(cpRegInv_BNU)
    317 BNU_CHUNK_T* cpRegInv_BNU(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, IppsMontState* pMont);
    318 
    319 
    320 /*
    321 // Montgomery internal GetSize/Init functions
    322 */
    323 #define   cpMontGetSize OWNAPI(cpMontGetSize)
    324 IppStatus cpMontGetSize(cpSize maxLen32, int poolLength, cpSize* pCtxSize);
    325 
    326 #define   cpMontInit OWNAPI(cpMontInit)
    327 IppStatus cpMontInit(int maxLen32, int poolLength, IppsMontState* pMont);
    328 
    329 #define   cpMontSet OWNAPI(cpMontSet)
    330 IppStatus cpMontSet(const Ipp32u* pModulus, cpSize len32, IppsMontState* pMont);
    331 
    332 #endif /* _CP_MONTGOMETRY_H */
    333