1 /*******************************************************************************
2 * Copyright 2013-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 // Cryptography Primitive.
45 // Internal Definitions and
46 // Internal ng RSA Function Prototypes
47 //
48 //
49 */
50
51 #if !defined(_CP_NG_MONT_EXP_STUFF_H)
52 #define _CP_NG_MONT_EXP_STUFF_H
53
54 #include "pcpbnuimpl.h"
55 #include "pcpbn.h"
56 #include "gsmodstuff.h"
57
58
59 /*
60 // optimal size of fixed window exponentiation
61 */
gsMontExp_WinSize(cpSize bitsize)62 __INLINE cpSize gsMontExp_WinSize(cpSize bitsize)
63 {
64 #if defined(_USE_WINDOW_EXP_)
65 // new computations
66 return
67 #if (_IPP !=_IPP_M5) /*limited by 6 or 4 (LOG_CACHE_LINE_SIZE); we use it for windowing-exp imtigation */
68 bitsize> 4096? 6 : /* 4096- .. . */
69 bitsize> 2666? 5 : /* 2666 - 4095 */
70 #endif
71 bitsize> 717? 4 : /* 717 - 2665 */
72 bitsize> 178? 3 : /* 178 - 716 */
73 bitsize> 41? 2 : 1; /* 41 - 177 */
74 #else
75 UNREFERENCED_PARAMETER(bitsize);
76 return 1;
77 #endif
78 }
79
80 /*
81 // Montgomery encoding/decoding
82 */
gsMontEnc_BNU(BNU_CHUNK_T * pR,const BNU_CHUNK_T * pXreg,cpSize nsX,const gsModEngine * pMont)83 __INLINE cpSize gsMontEnc_BNU(BNU_CHUNK_T* pR,
84 const BNU_CHUNK_T* pXreg, cpSize nsX,
85 const gsModEngine* pMont)
86 {
87 cpSize nsM = MOD_LEN( pMont );
88 ZEXPAND_COPY_BNU(pR, nsM, pXreg, nsX);
89 MOD_METHOD( pMont )->encode(pR, pR, (gsModEngine*)pMont);
90 return nsM;
91 }
92
gsMontDec_BNU(BNU_CHUNK_T * pR,const BNU_CHUNK_T * pXmont,gsModEngine * pMont)93 __INLINE cpSize gsMontDec_BNU(BNU_CHUNK_T* pR,
94 const BNU_CHUNK_T* pXmont,
95 gsModEngine* pMont)
96 {
97 cpSize nsM = MOD_LEN(pMont);
98 MOD_METHOD( pMont )->decode(pR, pXmont, (gsModEngine*)pMont);
99 return nsM;
100 }
101
gsMontEnc_BN(IppsBigNumState * pRbn,const IppsBigNumState * pXbn,gsModEngine * pMont)102 __INLINE void gsMontEnc_BN(IppsBigNumState* pRbn,
103 const IppsBigNumState* pXbn,
104 gsModEngine* pMont)
105 {
106 BNU_CHUNK_T* pR = BN_NUMBER(pRbn);
107 cpSize nsM = MOD_LEN(pMont);
108
109 gsMontEnc_BNU(pR, BN_NUMBER(pXbn), BN_SIZE(pXbn), pMont);
110
111 FIX_BNU(pR, nsM);
112 BN_SIZE(pRbn) = nsM;
113 BN_SIGN(pRbn) = ippBigNumPOS;
114 }
115
116
117 /* exponentiation buffer size */
118 #define gsMontExpBinBuffer OWNAPI(gsMontExpBinBuffer)
119 #define gsMontExpWinBuffer OWNAPI(gsMontExpWinBuffer)
120 cpSize gsMontExpBinBuffer(int modulusBits);
121 cpSize gsMontExpWinBuffer(int modulusBits);
122
123 /* exponentiation prototype */
124 typedef cpSize (*ngMontExp)(BNU_CHUNK_T* dataY,
125 const BNU_CHUNK_T* dataX, cpSize nsX,
126 const BNU_CHUNK_T* dataE, cpSize nbitsE,
127 gsModEngine* pMont,
128 BNU_CHUNK_T* pBuffer);
129
130 /*
131 // "fast" and "safe" binary montgomery exponentiation ("fast" version)
132 */
133 #define gsMontExpBin_BNU OWNAPI(gsMontExpBin_BNU)
134 #define gsModExpBin_BNU OWNAPI(gsModExpBin_BNU)
135 cpSize gsMontExpBin_BNU(BNU_CHUNK_T* dataY,
136 const BNU_CHUNK_T* dataX, cpSize nsX,
137 const BNU_CHUNK_T* dataE, cpSize nbitsE,
138 gsModEngine* pMont,
139 BNU_CHUNK_T* pBuffer);
140 cpSize gsModExpBin_BNU(BNU_CHUNK_T* dataY,
141 const BNU_CHUNK_T* dataX, cpSize nsX,
142 const BNU_CHUNK_T* dataE, cpSize nbitsE,
143 gsModEngine* pMont,
144 BNU_CHUNK_T* pBuffer);
145
146 #define gsMontExpBin_BNU_sscm OWNAPI(gsMontExpBin_BNU_sscm)
147 #define gsModExpBin_BNU_sscm OWNAPI(gsModExpBin_BNU_sscm)
148 cpSize gsMontExpBin_BNU_sscm(BNU_CHUNK_T* pY,
149 const BNU_CHUNK_T* pX, cpSize nsX,
150 const BNU_CHUNK_T* pE, cpSize nbitsE,
151 gsModEngine* pMont,
152 BNU_CHUNK_T* pBuffer);
153 cpSize gsModExpBin_BNU_sscm(BNU_CHUNK_T* pY,
154 const BNU_CHUNK_T* pX, cpSize nsX,
155 const BNU_CHUNK_T* pE, cpSize nbitsE,
156 gsModEngine* pMont,
157 BNU_CHUNK_T* pBuffer);
158
159 /*
160 // "fast" and "safe" fixed-size window montgomery exponentiation
161 */
162 #define gsMontExpWin_BNU OWNAPI(gsMontExpWin_BNU_mont)
163 #define gsModExpWin_BNU OWNAPI(gsModExpWin_BNU)
164 cpSize gsMontExpWin_BNU(BNU_CHUNK_T* pY,
165 const BNU_CHUNK_T* pX, cpSize nsX,
166 const BNU_CHUNK_T* dataE, cpSize nbitsE,
167 gsModEngine* pMont,
168 BNU_CHUNK_T* pBuffer);
169 cpSize gsModExpWin_BNU(BNU_CHUNK_T* pY,
170 const BNU_CHUNK_T* pX, cpSize nsX,
171 const BNU_CHUNK_T* dataE, cpSize nbitsE,
172 gsModEngine* pMont,
173 BNU_CHUNK_T* pBuffer);
174
175 #define gsMontExpWin_BNU_sscm OWNAPI(gsMontExpWin_BNU_mont_sscm)
176 #define gsModExpWin_BNU_sscm OWNAPI(gsModExpWin_BNU_sscm)
177 cpSize gsMontExpWin_BNU_sscm(BNU_CHUNK_T* dataY,
178 const BNU_CHUNK_T* dataX, cpSize nsX,
179 const BNU_CHUNK_T* dataE, cpSize nbitsE,
180 gsModEngine* pMont,
181 BNU_CHUNK_T* pBuffer);
182 cpSize gsModExpWin_BNU_sscm(BNU_CHUNK_T* dataY,
183 const BNU_CHUNK_T* dataX, cpSize nsX,
184 const BNU_CHUNK_T* dataE, cpSize nbitsE,
185 gsModEngine* pMont,
186 BNU_CHUNK_T* pBuffer);
187
188 #endif /* _CP_NG_MONT_EXP_STUFF_H */
189