OpenCoverage

rsa_lib.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/rsa/rsa_lib.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: rsa_lib.c,v 1.37 2018/04/14 07:09:21 tb Exp $ */-
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)-
3 * All rights reserved.-
4 *-
5 * This package is an SSL implementation written-
6 * by Eric Young (eay@cryptsoft.com).-
7 * The implementation was written so as to conform with Netscapes SSL.-
8 *-
9 * This library is free for commercial and non-commercial use as long as-
10 * the following conditions are aheared to. The following conditions-
11 * apply to all code found in this distribution, be it the RC4, RSA,-
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation-
13 * included with this distribution is covered by the same copyright terms-
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).-
15 *-
16 * Copyright remains Eric Young's, and as such any Copyright notices in-
17 * the code are not to be removed.-
18 * If this package is used in a product, Eric Young should be given attribution-
19 * as the author of the parts of the library used.-
20 * This can be in the form of a textual message at program startup or-
21 * in documentation (online or textual) provided with the package.-
22 *-
23 * Redistribution and use in source and binary forms, with or without-
24 * modification, are permitted provided that the following conditions-
25 * are met:-
26 * 1. Redistributions of source code must retain the copyright-
27 * notice, this list of conditions and the following disclaimer.-
28 * 2. Redistributions in binary form must reproduce the above copyright-
29 * notice, this list of conditions and the following disclaimer in the-
30 * documentation and/or other materials provided with the distribution.-
31 * 3. All advertising materials mentioning features or use of this software-
32 * must display the following acknowledgement:-
33 * "This product includes cryptographic software written by-
34 * Eric Young (eay@cryptsoft.com)"-
35 * The word 'cryptographic' can be left out if the rouines from the library-
36 * being used are not cryptographic related :-).-
37 * 4. If you include any Windows specific code (or a derivative thereof) from-
38 * the apps directory (application code) you must include an acknowledgement:-
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"-
40 *-
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND-
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE-
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE-
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS-
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT-
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY-
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF-
51 * SUCH DAMAGE.-
52 *-
53 * The licence and distribution terms for any publically available version or-
54 * derivative of this code cannot be changed. i.e. this code cannot simply be-
55 * copied and put under another distribution licence-
56 * [including the GNU Public Licence.]-
57 */-
58-
59#include <stdio.h>-
60-
61#include <openssl/opensslconf.h>-
62-
63#include <openssl/bn.h>-
64#include <openssl/crypto.h>-
65#include <openssl/err.h>-
66#include <openssl/lhash.h>-
67#include <openssl/rsa.h>-
68-
69#ifndef OPENSSL_NO_ENGINE-
70#include <openssl/engine.h>-
71#endif-
72-
73static const RSA_METHOD *default_RSA_meth = NULL;-
74-
75RSA *-
76RSA_new(void)-
77{-
78 RSA *r = RSA_new_method(NULL);-
79-
80 return r;
executed 256 times by 6 tests: return r;
Executed by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
256
81}-
82-
83void-
84RSA_set_default_method(const RSA_METHOD *meth)-
85{-
86 default_RSA_meth = meth;-
87}
never executed: end of block
0
88-
89const RSA_METHOD *-
90RSA_get_default_method(void)-
91{-
92 if (default_RSA_meth == NULL)
default_RSA_me...== ((void *)0)Description
TRUEevaluated 58 times by 6 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
FALSEevaluated 198 times by 6 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
58-198
93 default_RSA_meth = RSA_PKCS1_SSLeay();
executed 58 times by 6 tests: default_RSA_meth = RSA_PKCS1_SSLeay();
Executed by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
58
94-
95 return default_RSA_meth;
executed 256 times by 6 tests: return default_RSA_meth;
Executed by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
256
96}-
97-
98const RSA_METHOD *-
99RSA_get_method(const RSA *rsa)-
100{-
101 return rsa->meth;
never executed: return rsa->meth;
0
102}-
103-
104int-
105RSA_set_method(RSA *rsa, const RSA_METHOD *meth)-
106{-
107 /*-
108 * NB: The caller is specifically setting a method, so it's not up to us-
109 * to deal with which ENGINE it comes from.-
110 */-
111 const RSA_METHOD *mtmp;-
112-
113 mtmp = rsa->meth;-
114 if (mtmp->finish)
mtmp->finishDescription
TRUEnever evaluated
FALSEnever evaluated
0
115 mtmp->finish(rsa);
never executed: mtmp->finish(rsa);
0
116#ifndef OPENSSL_NO_ENGINE-
117 ENGINE_finish(rsa->engine);-
118 rsa->engine = NULL;-
119#endif-
120 rsa->meth = meth;-
121 if (meth->init)
meth->initDescription
TRUEnever evaluated
FALSEnever evaluated
0
122 meth->init(rsa);
never executed: meth->init(rsa);
0
123 return 1;
never executed: return 1;
0
124}-
125-
126RSA *-
127RSA_new_method(ENGINE *engine)-
128{-
129 RSA *ret;-
130-
131 ret = malloc(sizeof(RSA));-
132 if (ret == NULL) {
ret == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 256 times by 6 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
0-256
133 RSAerror(ERR_R_MALLOC_FAILURE);-
134 return NULL;
never executed: return ((void *)0) ;
0
135 }-
136-
137 ret->meth = RSA_get_default_method();-
138#ifndef OPENSSL_NO_ENGINE-
139 if (engine) {
engineDescription
TRUEnever evaluated
FALSEevaluated 256 times by 6 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
0-256
140 if (!ENGINE_init(engine)) {
!ENGINE_init(engine)Description
TRUEnever evaluated
FALSEnever evaluated
0
141 RSAerror(ERR_R_ENGINE_LIB);-
142 free(ret);-
143 return NULL;
never executed: return ((void *)0) ;
0
144 }-
145 ret->engine = engine;-
146 } else
never executed: end of block
0
147 ret->engine = ENGINE_get_default_RSA();
executed 256 times by 6 tests: ret->engine = ENGINE_get_default_RSA();
Executed by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
256
148 if (ret->engine) {
ret->engineDescription
TRUEnever evaluated
FALSEevaluated 256 times by 6 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
0-256
149 ret->meth = ENGINE_get_RSA(ret->engine);-
150 if (ret->meth == NULL) {
ret->meth == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
151 RSAerror(ERR_R_ENGINE_LIB);-
152 ENGINE_finish(ret->engine);-
153 free(ret);-
154 return NULL;
never executed: return ((void *)0) ;
0
155 }-
156 }
never executed: end of block
0
157#endif-
158-
159 ret->pad = 0;-
160 ret->version = 0;-
161 ret->n = NULL;-
162 ret->e = NULL;-
163 ret->d = NULL;-
164 ret->p = NULL;-
165 ret->q = NULL;-
166 ret->dmp1 = NULL;-
167 ret->dmq1 = NULL;-
168 ret->iqmp = NULL;-
169 ret->references = 1;-
170 ret->_method_mod_n = NULL;-
171 ret->_method_mod_p = NULL;-
172 ret->_method_mod_q = NULL;-
173 ret->blinding = NULL;-
174 ret->mt_blinding = NULL;-
175 ret->flags = ret->meth->flags & ~RSA_FLAG_NON_FIPS_ALLOW;-
176 if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_RSA, ret, &ret->ex_data)) {
!CRYPTO_new_ex...&ret->ex_data)Description
TRUEnever evaluated
FALSEevaluated 256 times by 6 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
0-256
177#ifndef OPENSSL_NO_ENGINE-
178 ENGINE_finish(ret->engine);-
179#endif-
180 free(ret);-
181 return NULL;
never executed: return ((void *)0) ;
0
182 }-
183-
184 if (ret->meth->init != NULL && !ret->meth->init(ret)) {
ret->meth->init != ((void *)0)Description
TRUEevaluated 256 times by 6 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
FALSEnever evaluated
!ret->meth->init(ret)Description
TRUEnever evaluated
FALSEevaluated 256 times by 6 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
0-256
185#ifndef OPENSSL_NO_ENGINE-
186 ENGINE_finish(ret->engine);-
187#endif-
188 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_RSA, ret, &ret->ex_data);-
189 free(ret);-
190 ret = NULL;-
191 }
never executed: end of block
0
192 return ret;
executed 256 times by 6 tests: return ret;
Executed by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • rsa_test
  • servertest
  • ssltest
  • tlstest
256
193}-
194-
195void-
196RSA_free(RSA *r)-
197{-
198 int i;-
199-
200 if (r == NULL)
r == ((void *)0)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • freenull
FALSEevaluated 258 times by 5 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • rsa_test
  • servertest
  • ssltest
  • tlstest
1-258
201 return;
executed 1 time by 1 test: return;
Executed by:
  • freenull
1
202-
203 i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_RSA);-
204 if (i > 0)
i > 0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tlstest
FALSEevaluated 254 times by 5 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • rsa_test
  • servertest
  • ssltest
  • tlstest
4-254
205 return;
executed 4 times by 1 test: return;
Executed by:
  • tlstest
4
206-
207 if (r->meth->finish)
r->meth->finishDescription
TRUEevaluated 254 times by 5 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • rsa_test
  • servertest
  • ssltest
  • tlstest
FALSEnever evaluated
0-254
208 r->meth->finish(r);
executed 254 times by 5 tests: r->meth->finish(r);
Executed by:
  • libcrypto.so.44.0.1
  • rsa_test
  • servertest
  • ssltest
  • tlstest
254
209#ifndef OPENSSL_NO_ENGINE-
210 ENGINE_finish(r->engine);-
211#endif-
212-
213 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_RSA, r, &r->ex_data);-
214-
215 BN_clear_free(r->n);-
216 BN_clear_free(r->e);-
217 BN_clear_free(r->d);-
218 BN_clear_free(r->p);-
219 BN_clear_free(r->q);-
220 BN_clear_free(r->dmp1);-
221 BN_clear_free(r->dmq1);-
222 BN_clear_free(r->iqmp);-
223 BN_BLINDING_free(r->blinding);-
224 BN_BLINDING_free(r->mt_blinding);-
225 free(r);-
226}
executed 254 times by 5 tests: end of block
Executed by:
  • libcrypto.so.44.0.1
  • rsa_test
  • servertest
  • ssltest
  • tlstest
254
227-
228int-
229RSA_up_ref(RSA *r)-
230{-
231 int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_RSA);-
232 return i > 1 ? 1 : 0;
executed 4 times by 1 test: return i > 1 ? 1 : 0;
Executed by:
  • tlstest
i > 1Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tlstest
FALSEnever evaluated
0-4
233}-
234-
235int-
236RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,-
237 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)-
238{-
239 return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_RSA, argl, argp,
never executed: return CRYPTO_get_ex_new_index(6, argl, argp, new_func, dup_func, free_func);
0
240 new_func, dup_func, free_func);
never executed: return CRYPTO_get_ex_new_index(6, argl, argp, new_func, dup_func, free_func);
0
241}-
242-
243int-
244RSA_set_ex_data(RSA *r, int idx, void *arg)-
245{-
246 return CRYPTO_set_ex_data(&r->ex_data, idx, arg);
executed 4 times by 1 test: return CRYPTO_set_ex_data(&r->ex_data, idx, arg);
Executed by:
  • tlstest
4
247}-
248-
249void *-
250RSA_get_ex_data(const RSA *r, int idx)-
251{-
252 return CRYPTO_get_ex_data(&r->ex_data, idx);
never executed: return CRYPTO_get_ex_data(&r->ex_data, idx);
0
253}-
254-
255void-
256RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d)-
257{-
258 if (n != NULL)
n != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
259 *n = r->n;
never executed: *n = r->n;
0
260 if (e != NULL)
e != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
261 *e = r->e;
never executed: *e = r->e;
0
262 if (d != NULL)
d != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
263 *d = r->d;
never executed: *d = r->d;
0
264}
never executed: end of block
0
265-
266int-
267RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d)-
268{-
269 if ((r->n == NULL && n == NULL) || (r->e == NULL && e == NULL))
r->n == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
n == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
r->e == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
e == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
270 return 0;
never executed: return 0;
0
271-
272 if (n != NULL) {
n != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
273 BN_free(r->n);-
274 r->n = n;-
275 }
never executed: end of block
0
276 if (e != NULL) {
e != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
277 BN_free(r->e);-
278 r->e = e;-
279 }
never executed: end of block
0
280 if (d != NULL) {
d != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
281 BN_free(r->d);-
282 r->d = d;-
283 }
never executed: end of block
0
284-
285 return 1;
never executed: return 1;
0
286}-
287-
288void-
289RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1,-
290 const BIGNUM **iqmp)-
291{-
292 if (dmp1 != NULL)
dmp1 != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
293 *dmp1 = r->dmp1;
never executed: *dmp1 = r->dmp1;
0
294 if (dmq1 != NULL)
dmq1 != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
295 *dmq1 = r->dmq1;
never executed: *dmq1 = r->dmq1;
0
296 if (iqmp != NULL)
iqmp != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
297 *iqmp = r->iqmp;
never executed: *iqmp = r->iqmp;
0
298}
never executed: end of block
0
299-
300int-
301RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp)-
302{-
303 if ((r->dmp1 == NULL && dmp1 == NULL) ||
r->dmp1 == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
dmp1 == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
304 (r->dmq1 == NULL && dmq1 == NULL) ||
r->dmq1 == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
dmq1 == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
305 (r->iqmp == NULL && iqmp == NULL))
r->iqmp == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
iqmp == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
306 return 0;
never executed: return 0;
0
307-
308 if (dmp1 != NULL) {
dmp1 != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
309 BN_free(r->dmp1);-
310 r->dmp1 = dmp1;-
311 }
never executed: end of block
0
312 if (dmq1 != NULL) {
dmq1 != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
313 BN_free(r->dmq1);-
314 r->dmq1 = dmq1;-
315 }
never executed: end of block
0
316 if (iqmp != NULL) {
iqmp != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
317 BN_free(r->iqmp);-
318 r->iqmp = iqmp;-
319 }
never executed: end of block
0
320-
321 return 1;
never executed: return 1;
0
322}-
323-
324void-
325RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q)-
326{-
327 if (p != NULL)
p != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
328 *p = r->p;
never executed: *p = r->p;
0
329 if (q != NULL)
q != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
330 *q = r->q;
never executed: *q = r->q;
0
331}
never executed: end of block
0
332-
333int-
334RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q)-
335{-
336 if ((r->p == NULL && p == NULL) || (r->q == NULL && q == NULL))
r->p == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
p == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
r->q == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
q == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
337 return 0;
never executed: return 0;
0
338-
339 if (p != NULL) {
p != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
340 BN_free(r->p);-
341 r->p = p;-
342 }
never executed: end of block
0
343 if (q != NULL) {
q != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
344 BN_free(r->q);-
345 r->q = q;-
346 }
never executed: end of block
0
347-
348 return 1;
never executed: return 1;
0
349}-
350-
351void-
352RSA_clear_flags(RSA *r, int flags)-
353{-
354 r->flags &= ~flags;-
355}
never executed: end of block
0
356-
357int-
358RSA_test_flags(const RSA *r, int flags)-
359{-
360 return r->flags & flags;
never executed: return r->flags & flags;
0
361}-
362-
363void-
364RSA_set_flags(RSA *r, int flags)-
365{-
366 r->flags |= flags;-
367}
never executed: end of block
0
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2