OpenSSL
1.0.1c
Main Page
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
crypto
bn
bn_blind.c
Go to the documentation of this file.
1
/* crypto/bn/bn_blind.c */
2
/* ====================================================================
3
* Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
*
9
* 1. Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
*
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in
14
* the documentation and/or other materials provided with the
15
* distribution.
16
*
17
* 3. All advertising materials mentioning features or use of this
18
* software must display the following acknowledgment:
19
* "This product includes software developed by the OpenSSL Project
20
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21
*
22
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23
* endorse or promote products derived from this software without
24
* prior written permission. For written permission, please contact
25
*
[email protected]
.
26
*
27
* 5. Products derived from this software may not be called "OpenSSL"
28
* nor may "OpenSSL" appear in their names without prior written
29
* permission of the OpenSSL Project.
30
*
31
* 6. Redistributions of any form whatsoever must retain the following
32
* acknowledgment:
33
* "This product includes software developed by the OpenSSL Project
34
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35
*
36
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
40
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47
* OF THE POSSIBILITY OF SUCH DAMAGE.
48
* ====================================================================
49
*
50
* This product includes cryptographic software written by Eric Young
51
* (
[email protected]
). This product includes software written by Tim
52
* Hudson (
[email protected]
).
53
*
54
*/
55
/* Copyright (C) 1995-1998 Eric Young (
[email protected]
)
56
* All rights reserved.
57
*
58
* This package is an SSL implementation written
59
* by Eric Young (
[email protected]
).
60
* The implementation was written so as to conform with Netscapes SSL.
61
*
62
* This library is free for commercial and non-commercial use as long as
63
* the following conditions are aheared to. The following conditions
64
* apply to all code found in this distribution, be it the RC4, RSA,
65
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
66
* included with this distribution is covered by the same copyright terms
67
* except that the holder is Tim Hudson (
[email protected]
).
68
*
69
* Copyright remains Eric Young's, and as such any Copyright notices in
70
* the code are not to be removed.
71
* If this package is used in a product, Eric Young should be given attribution
72
* as the author of the parts of the library used.
73
* This can be in the form of a textual message at program startup or
74
* in documentation (online or textual) provided with the package.
75
*
76
* Redistribution and use in source and binary forms, with or without
77
* modification, are permitted provided that the following conditions
78
* are met:
79
* 1. Redistributions of source code must retain the copyright
80
* notice, this list of conditions and the following disclaimer.
81
* 2. Redistributions in binary form must reproduce the above copyright
82
* notice, this list of conditions and the following disclaimer in the
83
* documentation and/or other materials provided with the distribution.
84
* 3. All advertising materials mentioning features or use of this software
85
* must display the following acknowledgement:
86
* "This product includes cryptographic software written by
87
* Eric Young (
[email protected]
)"
88
* The word 'cryptographic' can be left out if the rouines from the library
89
* being used are not cryptographic related :-).
90
* 4. If you include any Windows specific code (or a derivative thereof) from
91
* the apps directory (application code) you must include an acknowledgement:
92
* "This product includes software written by Tim Hudson (
[email protected]
)"
93
*
94
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
95
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
96
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
97
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
98
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
99
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
100
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
101
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
102
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
103
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
104
* SUCH DAMAGE.
105
*
106
* The licence and distribution terms for any publically available version or
107
* derivative of this code cannot be changed. i.e. this code cannot simply be
108
* copied and put under another distribution licence
109
* [including the GNU Public Licence.]
110
*/
111
112
#include <stdio.h>
113
#include "
cryptlib.h
"
114
#include "
bn_lcl.h
"
115
116
#define BN_BLINDING_COUNTER 32
117
118
struct
bn_blinding_st
119
{
120
BIGNUM
*
A
;
121
BIGNUM
*
Ai
;
122
BIGNUM
*
e
;
123
BIGNUM
*
mod
;
/* just a reference */
124
#ifndef OPENSSL_NO_DEPRECATED
125
unsigned
long
thread_id
;
/* added in OpenSSL 0.9.6j and 0.9.7b;
126
* used only by crypto/rsa/rsa_eay.c, rsa_lib.c */
127
#endif
128
CRYPTO_THREADID
tid
;
129
int
counter
;
130
unsigned
long
flags
;
131
BN_MONT_CTX
*
m_ctx
;
132
int (*
bn_mod_exp
)(
BIGNUM
*r,
const
BIGNUM
*
a
,
const
BIGNUM
*
p
,
133
const
BIGNUM
*m,
BN_CTX
*ctx,
134
BN_MONT_CTX
*
m_ctx
);
135
};
136
137
BN_BLINDING
*
BN_BLINDING_new
(
const
BIGNUM
*A,
const
BIGNUM
*Ai,
BIGNUM
*mod)
138
{
139
BN_BLINDING
*ret=NULL;
140
141
bn_check_top
(mod);
142
143
if
((ret=(
BN_BLINDING
*)
OPENSSL_malloc
(
sizeof
(
BN_BLINDING
))) == NULL)
144
{
145
BNerr
(
BN_F_BN_BLINDING_NEW
,
ERR_R_MALLOC_FAILURE
);
146
return
(NULL);
147
}
148
memset(ret,0,
sizeof
(
BN_BLINDING
));
149
if
(A != NULL)
150
{
151
if
((ret->
A
=
BN_dup
(A)) == NULL)
goto
err;
152
}
153
if
(Ai != NULL)
154
{
155
if
((ret->
Ai
=
BN_dup
(Ai)) == NULL)
goto
err;
156
}
157
158
/* save a copy of mod in the BN_BLINDING structure */
159
if
((ret->
mod
=
BN_dup
(mod)) == NULL)
goto
err;
160
if
(
BN_get_flags
(mod,
BN_FLG_CONSTTIME
) != 0)
161
BN_set_flags
(ret->
mod
,
BN_FLG_CONSTTIME
);
162
163
/* Set the counter to the special value -1
164
* to indicate that this is never-used fresh blinding
165
* that does not need updating before first use. */
166
ret->
counter
= -1;
167
CRYPTO_THREADID_current
(&ret->
tid
);
168
return
(ret);
169
err:
170
if
(ret != NULL)
BN_BLINDING_free
(ret);
171
return
(NULL);
172
}
173
174
void
BN_BLINDING_free
(
BN_BLINDING
*r)
175
{
176
if
(r == NULL)
177
return
;
178
179
if
(r->
A
!= NULL)
BN_free
(r->
A
);
180
if
(r->
Ai
!= NULL)
BN_free
(r->
Ai
);
181
if
(r->
e
!= NULL)
BN_free
(r->
e
);
182
if
(r->
mod
!= NULL)
BN_free
(r->
mod
);
183
OPENSSL_free
(r);
184
}
185
186
int
BN_BLINDING_update
(
BN_BLINDING
*
b
,
BN_CTX
*ctx)
187
{
188
int
ret=0;
189
190
if
((b->
A
== NULL) || (b->
Ai
== NULL))
191
{
192
BNerr
(
BN_F_BN_BLINDING_UPDATE
,
BN_R_NOT_INITIALIZED
);
193
goto
err;
194
}
195
196
if
(b->
counter
== -1)
197
b->
counter
= 0;
198
199
if
(++b->
counter
==
BN_BLINDING_COUNTER
&& b->
e
!= NULL &&
200
!(b->
flags
&
BN_BLINDING_NO_RECREATE
))
201
{
202
/* re-create blinding parameters */
203
if
(!
BN_BLINDING_create_param
(b, NULL, NULL, ctx, NULL, NULL))
204
goto
err;
205
}
206
else
if
(!(b->
flags
&
BN_BLINDING_NO_UPDATE
))
207
{
208
if
(!
BN_mod_mul
(b->
A
,b->
A
,b->
A
,b->
mod
,ctx))
goto
err;
209
if
(!
BN_mod_mul
(b->
Ai
,b->
Ai
,b->
Ai
,b->
mod
,ctx))
goto
err;
210
}
211
212
ret=1;
213
err:
214
if
(b->
counter
==
BN_BLINDING_COUNTER
)
215
b->
counter
= 0;
216
return
(ret);
217
}
218
219
int
BN_BLINDING_convert
(
BIGNUM
*n,
BN_BLINDING
*
b
,
BN_CTX
*ctx)
220
{
221
return
BN_BLINDING_convert_ex
(n, NULL, b, ctx);
222
}
223
224
int
BN_BLINDING_convert_ex
(
BIGNUM
*n,
BIGNUM
*r,
BN_BLINDING
*
b
,
BN_CTX
*ctx)
225
{
226
int
ret = 1;
227
228
bn_check_top
(n);
229
230
if
((b->
A
== NULL) || (b->
Ai
== NULL))
231
{
232
BNerr
(
BN_F_BN_BLINDING_CONVERT_EX
,
BN_R_NOT_INITIALIZED
);
233
return
(0);
234
}
235
236
if
(b->
counter
== -1)
237
/* Fresh blinding, doesn't need updating. */
238
b->
counter
= 0;
239
else
if
(!
BN_BLINDING_update
(b,ctx))
240
return
(0);
241
242
if
(r != NULL)
243
{
244
if
(!
BN_copy
(r, b->
Ai
)) ret=0;
245
}
246
247
if
(!
BN_mod_mul
(n,n,b->
A
,b->
mod
,ctx)) ret=0;
248
249
return
ret;
250
}
251
252
int
BN_BLINDING_invert
(
BIGNUM
*n,
BN_BLINDING
*
b
,
BN_CTX
*ctx)
253
{
254
return
BN_BLINDING_invert_ex
(n, NULL, b, ctx);
255
}
256
257
int
BN_BLINDING_invert_ex
(
BIGNUM
*n,
const
BIGNUM
*r,
BN_BLINDING
*
b
,
BN_CTX
*ctx)
258
{
259
int
ret;
260
261
bn_check_top
(n);
262
263
if
(r != NULL)
264
ret =
BN_mod_mul
(n, n, r, b->
mod
, ctx);
265
else
266
{
267
if
(b->
Ai
== NULL)
268
{
269
BNerr
(
BN_F_BN_BLINDING_INVERT_EX
,
BN_R_NOT_INITIALIZED
);
270
return
(0);
271
}
272
ret =
BN_mod_mul
(n, n, b->
Ai
, b->
mod
, ctx);
273
}
274
275
bn_check_top
(n);
276
return
(ret);
277
}
278
279
#ifndef OPENSSL_NO_DEPRECATED
280
unsigned
long
BN_BLINDING_get_thread_id
(
const
BN_BLINDING
*
b
)
281
{
282
return
b->
thread_id
;
283
}
284
285
void
BN_BLINDING_set_thread_id
(
BN_BLINDING
*
b
,
unsigned
long
n)
286
{
287
b->
thread_id
= n;
288
}
289
#endif
290
291
CRYPTO_THREADID
*
BN_BLINDING_thread_id
(
BN_BLINDING
*
b
)
292
{
293
return
&b->
tid
;
294
}
295
296
unsigned
long
BN_BLINDING_get_flags
(
const
BN_BLINDING
*
b
)
297
{
298
return
b->
flags
;
299
}
300
301
void
BN_BLINDING_set_flags
(
BN_BLINDING
*
b
,
unsigned
long
flags
)
302
{
303
b->
flags
=
flags
;
304
}
305
306
BN_BLINDING
*
BN_BLINDING_create_param
(
BN_BLINDING
*
b
,
307
const
BIGNUM
*
e
,
BIGNUM
*m,
BN_CTX
*ctx,
308
int
(*bn_mod_exp)(
BIGNUM
*r,
const
BIGNUM
*
a
,
const
BIGNUM
*
p
,
309
const
BIGNUM
*m,
BN_CTX
*ctx,
BN_MONT_CTX
*m_ctx),
310
BN_MONT_CTX
*m_ctx)
311
{
312
int
retry_counter = 32;
313
BN_BLINDING
*ret = NULL;
314
315
if
(b == NULL)
316
ret =
BN_BLINDING_new
(NULL, NULL, m);
317
else
318
ret =
b
;
319
320
if
(ret == NULL)
321
goto
err;
322
323
if
(ret->
A
== NULL && (ret->
A
=
BN_new
()) == NULL)
324
goto
err;
325
if
(ret->
Ai
== NULL && (ret->
Ai
=
BN_new
()) == NULL)
326
goto
err;
327
328
if
(e != NULL)
329
{
330
if
(ret->
e
!= NULL)
331
BN_free
(ret->
e
);
332
ret->
e
=
BN_dup
(e);
333
}
334
if
(ret->
e
== NULL)
335
goto
err;
336
337
if
(bn_mod_exp != NULL)
338
ret->
bn_mod_exp
= bn_mod_exp;
339
if
(m_ctx != NULL)
340
ret->
m_ctx
= m_ctx;
341
342
do
{
343
if
(!
BN_rand_range
(ret->
A
, ret->
mod
))
goto
err;
344
if
(
BN_mod_inverse
(ret->
Ai
, ret->
A
, ret->
mod
, ctx) == NULL)
345
{
346
/* this should almost never happen for good RSA keys */
347
unsigned
long
error
=
ERR_peek_last_error
();
348
if
(
ERR_GET_REASON
(error) ==
BN_R_NO_INVERSE
)
349
{
350
if
(retry_counter-- == 0)
351
{
352
BNerr
(
BN_F_BN_BLINDING_CREATE_PARAM
,
353
BN_R_TOO_MANY_ITERATIONS
);
354
goto
err;
355
}
356
ERR_clear_error
();
357
}
358
else
359
goto
err;
360
}
361
else
362
break
;
363
}
while
(1);
364
365
if
(ret->
bn_mod_exp
!= NULL && ret->
m_ctx
!= NULL)
366
{
367
if
(!ret->
bn_mod_exp
(ret->
A
, ret->
A
, ret->
e
, ret->
mod
, ctx, ret->
m_ctx
))
368
goto
err;
369
}
370
else
371
{
372
if
(!
BN_mod_exp
(ret->
A
, ret->
A
, ret->
e
, ret->
mod
, ctx))
373
goto
err;
374
}
375
376
return
ret;
377
err:
378
if
(b == NULL && ret != NULL)
379
{
380
BN_BLINDING_free
(ret);
381
ret = NULL;
382
}
383
384
return
ret;
385
}
Generated on Thu Jan 10 2013 09:53:34 for OpenSSL by
1.8.2