Line | Source | Count |
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | #include <stdio.h> | - |
11 | #include <string.h> | - |
12 | #include <time.h> | - |
13 | #include <openssl/err.h> | - |
14 | #include <openssl/bn.h> | - |
15 | #include "rsa_locl.h" | - |
16 | | - |
17 | | - |
18 | | - |
19 | int RSA_X931_derive_ex(RSA *rsa, BIGNUM *p1, BIGNUM *p2, BIGNUM *q1, | - |
20 | BIGNUM *q2, const BIGNUM *Xp1, const BIGNUM *Xp2, | - |
21 | const BIGNUM *Xp, const BIGNUM *Xq1, const BIGNUM *Xq2, | - |
22 | const BIGNUM *Xq, const BIGNUM *e, BN_GENCB *cb) | - |
23 | { | - |
24 | BIGNUM *r0 = NULL, *r1 = NULL, *r2 = NULL, *r3 = NULL; | - |
25 | BN_CTX *ctx = NULL, *ctx2 = NULL; | - |
26 | int ret = 0; | - |
27 | | - |
28 | if (!rsa)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
29 | goto err; never executed: goto err; | 0 |
30 | | - |
31 | ctx = BN_CTX_new(); | - |
32 | if (ctx == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
33 | goto err; never executed: goto err; | 0 |
34 | BN_CTX_start(ctx); | - |
35 | | - |
36 | r0 = BN_CTX_get(ctx); | - |
37 | r1 = BN_CTX_get(ctx); | - |
38 | r2 = BN_CTX_get(ctx); | - |
39 | r3 = BN_CTX_get(ctx); | - |
40 | | - |
41 | if (r3 == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
42 | goto err; never executed: goto err; | 0 |
43 | if (!rsa->e) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
44 | rsa->e = BN_dup(e); | - |
45 | if (!rsa->e)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
46 | goto err; never executed: goto err; | 0 |
47 | } else { never executed: end of block | 0 |
48 | e = rsa->e; | - |
49 | } never executed: end of block | 0 |
50 | | - |
51 | | - |
52 | | - |
53 | | - |
54 | | - |
55 | | - |
56 | if (Xp && rsa->p == NULL) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
57 | rsa->p = BN_new(); | - |
58 | if (rsa->p == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
59 | goto err; never executed: goto err; | 0 |
60 | | - |
61 | if (!BN_X931_derive_prime_ex(rsa->p, p1, p2,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
62 | Xp, Xp1, Xp2, e, ctx, cb))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
63 | goto err; never executed: goto err; | 0 |
64 | } never executed: end of block | 0 |
65 | | - |
66 | if (Xq && rsa->q == NULL) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
67 | rsa->q = BN_new(); | - |
68 | if (rsa->q == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
69 | goto err; never executed: goto err; | 0 |
70 | if (!BN_X931_derive_prime_ex(rsa->q, q1, q2,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
71 | Xq, Xq1, Xq2, e, ctx, cb))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
72 | goto err; never executed: goto err; | 0 |
73 | } never executed: end of block | 0 |
74 | | - |
75 | if (rsa->p == NULL || rsa->q == NULL) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
76 | BN_CTX_end(ctx); | - |
77 | BN_CTX_free(ctx); | - |
78 | return 2; never executed: return 2; | 0 |
79 | } | - |
80 | | - |
81 | | - |
82 | | - |
83 | | - |
84 | | - |
85 | | - |
86 | | - |
87 | rsa->n = BN_new(); | - |
88 | if (rsa->n == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
89 | goto err; never executed: goto err; | 0 |
90 | if (!BN_mul(rsa->n, rsa->p, rsa->q, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
91 | goto err; never executed: goto err; | 0 |
92 | | - |
93 | | - |
94 | if (!BN_sub(r1, rsa->p, BN_value_one()))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
95 | goto err; never executed: goto err; | 0 |
96 | if (!BN_sub(r2, rsa->q, BN_value_one()))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
97 | goto err; never executed: goto err; | 0 |
98 | if (!BN_mul(r0, r1, r2, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
99 | goto err; never executed: goto err; | 0 |
100 | | - |
101 | if (!BN_gcd(r3, r1, r2, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
102 | goto err; never executed: goto err; | 0 |
103 | | - |
104 | if (!BN_div(r0, NULL, r0, r3, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
105 | goto err; never executed: goto err; | 0 |
106 | | - |
107 | ctx2 = BN_CTX_new(); | - |
108 | if (ctx2 == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
109 | goto err; never executed: goto err; | 0 |
110 | | - |
111 | rsa->d = BN_mod_inverse(NULL, rsa->e, r0, ctx2); | - |
112 | if (rsa->d == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
113 | goto err; never executed: goto err; | 0 |
114 | | - |
115 | | - |
116 | rsa->dmp1 = BN_new(); | - |
117 | if (rsa->dmp1 == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
118 | goto err; never executed: goto err; | 0 |
119 | if (!BN_mod(rsa->dmp1, rsa->d, r1, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
120 | goto err; never executed: goto err; | 0 |
121 | | - |
122 | | - |
123 | rsa->dmq1 = BN_new(); | - |
124 | if (rsa->dmq1 == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
125 | goto err; never executed: goto err; | 0 |
126 | if (!BN_mod(rsa->dmq1, rsa->d, r2, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
127 | goto err; never executed: goto err; | 0 |
128 | | - |
129 | | - |
130 | rsa->iqmp = BN_mod_inverse(NULL, rsa->q, rsa->p, ctx2); | - |
131 | | - |
132 | ret = 1; | - |
133 | err: code before this statement never executed: err: | 0 |
134 | if (ctx)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
135 | BN_CTX_end(ctx); never executed: BN_CTX_end(ctx); | 0 |
136 | BN_CTX_free(ctx); | - |
137 | BN_CTX_free(ctx2); | - |
138 | | - |
139 | return ret; never executed: return ret; | 0 |
140 | | - |
141 | } | - |
142 | | - |
143 | int RSA_X931_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e, | - |
144 | BN_GENCB *cb) | - |
145 | { | - |
146 | int ok = 0; | - |
147 | BIGNUM *Xp = NULL, *Xq = NULL; | - |
148 | BN_CTX *ctx = NULL; | - |
149 | | - |
150 | ctx = BN_CTX_new(); | - |
151 | if (ctx == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
152 | goto error; never executed: goto error; | 0 |
153 | | - |
154 | BN_CTX_start(ctx); | - |
155 | Xp = BN_CTX_get(ctx); | - |
156 | Xq = BN_CTX_get(ctx); | - |
157 | if (Xq == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
158 | goto error; never executed: goto error; | 0 |
159 | if (!BN_X931_generate_Xpq(Xp, Xq, bits, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
160 | goto error; never executed: goto error; | 0 |
161 | | - |
162 | rsa->p = BN_new(); | - |
163 | rsa->q = BN_new(); | - |
164 | if (rsa->p == NULL || rsa->q == NULL)TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
165 | goto error; never executed: goto error; | 0 |
166 | | - |
167 | | - |
168 | | - |
169 | if (!BN_X931_generate_prime_ex(rsa->p, NULL, NULL, NULL, NULL, Xp,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
170 | e, ctx, cb))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
171 | goto error; never executed: goto error; | 0 |
172 | | - |
173 | if (!BN_X931_generate_prime_ex(rsa->q, NULL, NULL, NULL, NULL, Xq,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
174 | e, ctx, cb))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
175 | goto error; never executed: goto error; | 0 |
176 | | - |
177 | | - |
178 | | - |
179 | | - |
180 | | - |
181 | | - |
182 | if (!RSA_X931_derive_ex(rsa, NULL, NULL, NULL, NULL,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
183 | NULL, NULL, NULL, NULL, NULL, NULL, e, cb))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
184 | goto error; never executed: goto error; | 0 |
185 | | - |
186 | ok = 1; | - |
187 | | - |
188 | error: code before this statement never executed: error: | 0 |
189 | if (ctx)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
190 | BN_CTX_end(ctx); never executed: BN_CTX_end(ctx); | 0 |
191 | BN_CTX_free(ctx); | - |
192 | | - |
193 | if (ok)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
194 | return 1; never executed: return 1; | 0 |
195 | | - |
196 | return 0; never executed: return 0; | 0 |
197 | | - |
198 | } | - |
| | |