Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/pem/pvkfmt.c |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||||||||||||||
2 | - | |||||||||||||||||||||||||
3 | - | |||||||||||||||||||||||||
4 | - | |||||||||||||||||||||||||
5 | - | |||||||||||||||||||||||||
6 | - | |||||||||||||||||||||||||
7 | - | |||||||||||||||||||||||||
8 | - | |||||||||||||||||||||||||
9 | - | |||||||||||||||||||||||||
10 | - | |||||||||||||||||||||||||
11 | - | |||||||||||||||||||||||||
12 | - | |||||||||||||||||||||||||
13 | static unsigned int | - | ||||||||||||||||||||||||
14 | read_ledword(const unsigned char **in) | - | ||||||||||||||||||||||||
15 | { | - | ||||||||||||||||||||||||
16 | const unsigned char *p = *in; | - | ||||||||||||||||||||||||
17 | unsigned int ret; | - | ||||||||||||||||||||||||
18 | - | |||||||||||||||||||||||||
19 | ret = *p++; | - | ||||||||||||||||||||||||
20 | ret |= (*p++ << 8); | - | ||||||||||||||||||||||||
21 | ret |= (*p++ << 16); | - | ||||||||||||||||||||||||
22 | ret |= (*p++ << 24); | - | ||||||||||||||||||||||||
23 | *in = p; | - | ||||||||||||||||||||||||
24 | return never executed: ret;return ret; never executed: return ret; | 0 | ||||||||||||||||||||||||
25 | } | - | ||||||||||||||||||||||||
26 | - | |||||||||||||||||||||||||
27 | - | |||||||||||||||||||||||||
28 | - | |||||||||||||||||||||||||
29 | - | |||||||||||||||||||||||||
30 | - | |||||||||||||||||||||||||
31 | static int | - | ||||||||||||||||||||||||
32 | read_lebn(const unsigned char **in, unsigned int nbyte, BIGNUM **r) | - | ||||||||||||||||||||||||
33 | { | - | ||||||||||||||||||||||||
34 | const unsigned char *p; | - | ||||||||||||||||||||||||
35 | unsigned char *tmpbuf, *q; | - | ||||||||||||||||||||||||
36 | unsigned int i; | - | ||||||||||||||||||||||||
37 | - | |||||||||||||||||||||||||
38 | p = *in + nbyte - 1; | - | ||||||||||||||||||||||||
39 | tmpbuf = malloc(nbyte); | - | ||||||||||||||||||||||||
40 | if (!tmpbuf
| 0 | ||||||||||||||||||||||||
41 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
42 | q = tmpbuf; | - | ||||||||||||||||||||||||
43 | for (i = 0; i < nbyte
| 0 | ||||||||||||||||||||||||
44 | * never executed: q++ = *p--;*q++ = *p--; never executed: *q++ = *p--; | 0 | ||||||||||||||||||||||||
45 | *r = BN_bin2bn(tmpbuf, nbyte, | - | ||||||||||||||||||||||||
46 | ((void *)0) | - | ||||||||||||||||||||||||
47 | ); | - | ||||||||||||||||||||||||
48 | free(tmpbuf); | - | ||||||||||||||||||||||||
49 | if (*
| 0 | ||||||||||||||||||||||||
50 | *in += nbyte; | - | ||||||||||||||||||||||||
51 | return never executed: 1;return 1; never executed: return 1; | 0 | ||||||||||||||||||||||||
52 | } else | - | ||||||||||||||||||||||||
53 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
54 | } | - | ||||||||||||||||||||||||
55 | static EVP_PKEY *b2i_rsa(const unsigned char **in, unsigned int length, | - | ||||||||||||||||||||||||
56 | unsigned int bitlen, int ispub); | - | ||||||||||||||||||||||||
57 | static EVP_PKEY *b2i_dss(const unsigned char **in, unsigned int length, | - | ||||||||||||||||||||||||
58 | unsigned int bitlen, int ispub); | - | ||||||||||||||||||||||||
59 | - | |||||||||||||||||||||||||
60 | static int | - | ||||||||||||||||||||||||
61 | do_blob_header(const unsigned char **in, unsigned int length, | - | ||||||||||||||||||||||||
62 | unsigned int *pmagic, unsigned int *pbitlen, int *pisdss, int *pispub) | - | ||||||||||||||||||||||||
63 | { | - | ||||||||||||||||||||||||
64 | const unsigned char *p = *in; | - | ||||||||||||||||||||||||
65 | - | |||||||||||||||||||||||||
66 | if (length < 16
| 0 | ||||||||||||||||||||||||
67 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
68 | - | |||||||||||||||||||||||||
69 | if (*
| 0 | ||||||||||||||||||||||||
70 | if (*
| 0 | ||||||||||||||||||||||||
71 | ERR_put_error(9,(0xfff),(119),__FILE__,160); | - | ||||||||||||||||||||||||
72 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
73 | } | - | ||||||||||||||||||||||||
74 | *pispub = 1; | - | ||||||||||||||||||||||||
75 | } never executed: else if (*end of block
| 0 | ||||||||||||||||||||||||
76 | if (*
| 0 | ||||||||||||||||||||||||
77 | ERR_put_error(9,(0xfff),(120),__FILE__,166); | - | ||||||||||||||||||||||||
78 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
79 | } | - | ||||||||||||||||||||||||
80 | *pispub = 0; | - | ||||||||||||||||||||||||
81 | } never executed: elseend of block | 0 | ||||||||||||||||||||||||
82 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
83 | p++; | - | ||||||||||||||||||||||||
84 | - | |||||||||||||||||||||||||
85 | if (*
| 0 | ||||||||||||||||||||||||
86 | ERR_put_error(9,(0xfff),(117),__FILE__,175); | - | ||||||||||||||||||||||||
87 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
88 | } | - | ||||||||||||||||||||||||
89 | - | |||||||||||||||||||||||||
90 | p += 6; | - | ||||||||||||||||||||||||
91 | *pmagic = read_ledword(&p); | - | ||||||||||||||||||||||||
92 | *pbitlen = read_ledword(&p); | - | ||||||||||||||||||||||||
93 | if (*
| 0 | ||||||||||||||||||||||||
94 | ERR_put_error(9,(0xfff),(121),__FILE__,183); | - | ||||||||||||||||||||||||
95 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
96 | } | - | ||||||||||||||||||||||||
97 | *pisdss = 0; | - | ||||||||||||||||||||||||
98 | switch (*pmagic) { | - | ||||||||||||||||||||||||
99 | - | |||||||||||||||||||||||||
100 | case never executed: 0x31535344L:case 0x31535344L: never executed: case 0x31535344L: | 0 | ||||||||||||||||||||||||
101 | *pisdss = 1; | - | ||||||||||||||||||||||||
102 | case never executed: 0x31415352L:case 0x31415352L: never executed: case 0x31415352L: code before this statement never executed: case 0x31415352L: | 0 | ||||||||||||||||||||||||
103 | if (*
| 0 | ||||||||||||||||||||||||
104 | ERR_put_error(9,(0xfff),(119),__FILE__,193); | - | ||||||||||||||||||||||||
105 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
106 | } | - | ||||||||||||||||||||||||
107 | break; never executed: break; | 0 | ||||||||||||||||||||||||
108 | - | |||||||||||||||||||||||||
109 | case never executed: 0x32535344L:case 0x32535344L: never executed: case 0x32535344L: | 0 | ||||||||||||||||||||||||
110 | *pisdss = 1; | - | ||||||||||||||||||||||||
111 | case never executed: 0x32415352L:case 0x32415352L: never executed: case 0x32415352L: code before this statement never executed: case 0x32415352L: | 0 | ||||||||||||||||||||||||
112 | if (*
| 0 | ||||||||||||||||||||||||
113 | ERR_put_error(9,(0xfff),(120),__FILE__,202); | - | ||||||||||||||||||||||||
114 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
115 | } | - | ||||||||||||||||||||||||
116 | break; never executed: break; | 0 | ||||||||||||||||||||||||
117 | - | |||||||||||||||||||||||||
118 | default never executed: :default: never executed: default: | 0 | ||||||||||||||||||||||||
119 | ERR_put_error(9,(0xfff),(116),__FILE__,208); | - | ||||||||||||||||||||||||
120 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
121 | } | - | ||||||||||||||||||||||||
122 | *in = p; | - | ||||||||||||||||||||||||
123 | return never executed: 1;return 1; never executed: return 1; | 0 | ||||||||||||||||||||||||
124 | } | - | ||||||||||||||||||||||||
125 | - | |||||||||||||||||||||||||
126 | static unsigned int | - | ||||||||||||||||||||||||
127 | blob_length(unsigned bitlen, int isdss, int ispub) | - | ||||||||||||||||||||||||
128 | { | - | ||||||||||||||||||||||||
129 | unsigned int nbyte, hnbyte; | - | ||||||||||||||||||||||||
130 | - | |||||||||||||||||||||||||
131 | nbyte = (bitlen + 7) >> 3; | - | ||||||||||||||||||||||||
132 | hnbyte = (bitlen + 15) >> 4; | - | ||||||||||||||||||||||||
133 | if (isdss
| 0 | ||||||||||||||||||||||||
134 | - | |||||||||||||||||||||||||
135 | - | |||||||||||||||||||||||||
136 | - | |||||||||||||||||||||||||
137 | - | |||||||||||||||||||||||||
138 | if (ispub
| 0 | ||||||||||||||||||||||||
139 | return never executed: 44 + 3 * nbyte;return 44 + 3 * nbyte; never executed: return 44 + 3 * nbyte; | 0 | ||||||||||||||||||||||||
140 | - | |||||||||||||||||||||||||
141 | - | |||||||||||||||||||||||||
142 | - | |||||||||||||||||||||||||
143 | else | - | ||||||||||||||||||||||||
144 | return never executed: 64 + 2 * nbyte;return 64 + 2 * nbyte; never executed: return 64 + 2 * nbyte; | 0 | ||||||||||||||||||||||||
145 | } else { | - | ||||||||||||||||||||||||
146 | - | |||||||||||||||||||||||||
147 | if (ispub
| 0 | ||||||||||||||||||||||||
148 | return never executed: 4 + nbyte;return 4 + nbyte; never executed: return 4 + nbyte; | 0 | ||||||||||||||||||||||||
149 | else | - | ||||||||||||||||||||||||
150 | - | |||||||||||||||||||||||||
151 | - | |||||||||||||||||||||||||
152 | - | |||||||||||||||||||||||||
153 | return never executed: 4 + 2*nbyte + 5*hnbyte;return 4 + 2*nbyte + 5*hnbyte; never executed: return 4 + 2*nbyte + 5*hnbyte; | 0 | ||||||||||||||||||||||||
154 | } | - | ||||||||||||||||||||||||
155 | - | |||||||||||||||||||||||||
156 | } | - | ||||||||||||||||||||||||
157 | - | |||||||||||||||||||||||||
158 | static EVP_PKEY * | - | ||||||||||||||||||||||||
159 | do_b2i(const unsigned char **in, unsigned int length, int ispub) | - | ||||||||||||||||||||||||
160 | { | - | ||||||||||||||||||||||||
161 | const unsigned char *p = *in; | - | ||||||||||||||||||||||||
162 | unsigned int bitlen, magic; | - | ||||||||||||||||||||||||
163 | int isdss; | - | ||||||||||||||||||||||||
164 | - | |||||||||||||||||||||||||
165 | if (do_blob_header(&p, length, &magic, &bitlen, &isdss, &ispub) <= 0
| 0 | ||||||||||||||||||||||||
166 | ERR_put_error(9,(0xfff),(122),__FILE__,255); | - | ||||||||||||||||||||||||
167 | return never executed: return ((void *)0) ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
168 | ((void *)0) never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
169 | ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
170 | } | - | ||||||||||||||||||||||||
171 | length -= 16; | - | ||||||||||||||||||||||||
172 | if (length < blob_length(bitlen, isdss, ispub)
| 0 | ||||||||||||||||||||||||
173 | ERR_put_error(9,(0xfff),(123),__FILE__,260); | - | ||||||||||||||||||||||||
174 | return never executed: return ((void *)0) ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
175 | ((void *)0) never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
176 | ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
177 | } | - | ||||||||||||||||||||||||
178 | if (isdss
| 0 | ||||||||||||||||||||||||
179 | return never executed: b2i_dss(&p, length, bitlen, ispub);return b2i_dss(&p, length, bitlen, ispub); never executed: return b2i_dss(&p, length, bitlen, ispub); | 0 | ||||||||||||||||||||||||
180 | else | - | ||||||||||||||||||||||||
181 | return never executed: b2i_rsa(&p, length, bitlen, ispub);return b2i_rsa(&p, length, bitlen, ispub); never executed: return b2i_rsa(&p, length, bitlen, ispub); | 0 | ||||||||||||||||||||||||
182 | } | - | ||||||||||||||||||||||||
183 | - | |||||||||||||||||||||||||
184 | static EVP_PKEY * | - | ||||||||||||||||||||||||
185 | do_b2i_bio(BIO *in, int ispub) | - | ||||||||||||||||||||||||
186 | { | - | ||||||||||||||||||||||||
187 | const unsigned char *p; | - | ||||||||||||||||||||||||
188 | unsigned char hdr_buf[16], *buf = | - | ||||||||||||||||||||||||
189 | ((void *)0) | - | ||||||||||||||||||||||||
190 | ; | - | ||||||||||||||||||||||||
191 | unsigned int bitlen, magic, length; | - | ||||||||||||||||||||||||
192 | int isdss; | - | ||||||||||||||||||||||||
193 | EVP_PKEY *ret = | - | ||||||||||||||||||||||||
194 | ((void *)0) | - | ||||||||||||||||||||||||
195 | ; | - | ||||||||||||||||||||||||
196 | - | |||||||||||||||||||||||||
197 | if (BIO_read(in, hdr_buf, 16) != 16
| 0 | ||||||||||||||||||||||||
198 | ERR_put_error(9,(0xfff),(123),__FILE__,279); | - | ||||||||||||||||||||||||
199 | return never executed: return ((void *)0) ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
200 | ((void *)0) never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
201 | ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
202 | } | - | ||||||||||||||||||||||||
203 | p = hdr_buf; | - | ||||||||||||||||||||||||
204 | if (do_blob_header(&p, 16, &magic, &bitlen, &isdss, &ispub) <= 0
| 0 | ||||||||||||||||||||||||
205 | return never executed: return ((void *)0) ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
206 | ((void *)0) never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
207 | ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
208 | - | |||||||||||||||||||||||||
209 | length = blob_length(bitlen, isdss, ispub); | - | ||||||||||||||||||||||||
210 | buf = malloc(length); | - | ||||||||||||||||||||||||
211 | if (!buf
| 0 | ||||||||||||||||||||||||
212 | ERR_put_error(9,(0xfff),((1|64)),__FILE__,289); | - | ||||||||||||||||||||||||
213 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
214 | } | - | ||||||||||||||||||||||||
215 | p = buf; | - | ||||||||||||||||||||||||
216 | if (BIO_read(in, buf, length) != (int)length
| 0 | ||||||||||||||||||||||||
217 | ERR_put_error(9,(0xfff),(123),__FILE__,294); | - | ||||||||||||||||||||||||
218 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
219 | } | - | ||||||||||||||||||||||||
220 | - | |||||||||||||||||||||||||
221 | if (isdss
| 0 | ||||||||||||||||||||||||
222 | ret = b2i_dss(&p, length, bitlen, ispub); never executed: ret = b2i_dss(&p, length, bitlen, ispub); | 0 | ||||||||||||||||||||||||
223 | else | - | ||||||||||||||||||||||||
224 | ret = b2i_rsa(&p, length, bitlen, ispub); never executed: ret = b2i_rsa(&p, length, bitlen, ispub); | 0 | ||||||||||||||||||||||||
225 | - | |||||||||||||||||||||||||
226 | err: code before this statement never executed: err: | 0 | ||||||||||||||||||||||||
227 | free(buf); | - | ||||||||||||||||||||||||
228 | return never executed: ret;return ret; never executed: return ret; | 0 | ||||||||||||||||||||||||
229 | } | - | ||||||||||||||||||||||||
230 | - | |||||||||||||||||||||||||
231 | static EVP_PKEY * | - | ||||||||||||||||||||||||
232 | b2i_dss(const unsigned char **in, unsigned int length, unsigned int bitlen, | - | ||||||||||||||||||||||||
233 | int ispub) | - | ||||||||||||||||||||||||
234 | { | - | ||||||||||||||||||||||||
235 | const unsigned char *p = *in; | - | ||||||||||||||||||||||||
236 | EVP_PKEY *ret = | - | ||||||||||||||||||||||||
237 | ((void *)0) | - | ||||||||||||||||||||||||
238 | ; | - | ||||||||||||||||||||||||
239 | DSA *dsa = | - | ||||||||||||||||||||||||
240 | ((void *)0) | - | ||||||||||||||||||||||||
241 | ; | - | ||||||||||||||||||||||||
242 | BN_CTX *ctx = | - | ||||||||||||||||||||||||
243 | ((void *)0) | - | ||||||||||||||||||||||||
244 | ; | - | ||||||||||||||||||||||||
245 | unsigned int nbyte; | - | ||||||||||||||||||||||||
246 | - | |||||||||||||||||||||||||
247 | nbyte = (bitlen + 7) >> 3; | - | ||||||||||||||||||||||||
248 | - | |||||||||||||||||||||||||
249 | dsa = DSA_new(); | - | ||||||||||||||||||||||||
250 | ret = EVP_PKEY_new(); | - | ||||||||||||||||||||||||
251 | if (!dsa
| 0 | ||||||||||||||||||||||||
252 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
253 | if (!read_lebn(&p, nbyte, &dsa->p)
| 0 | ||||||||||||||||||||||||
254 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
255 | if (!read_lebn(&p, 20, &dsa->q)
| 0 | ||||||||||||||||||||||||
256 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
257 | if (!read_lebn(&p, nbyte, &dsa->g)
| 0 | ||||||||||||||||||||||||
258 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
259 | if (ispub
| 0 | ||||||||||||||||||||||||
260 | if (!read_lebn(&p, nbyte, &dsa->pub_key)
| 0 | ||||||||||||||||||||||||
261 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
262 | } never executed: else {end of block | 0 | ||||||||||||||||||||||||
263 | if (!read_lebn(&p, 20, &dsa->priv_key)
| 0 | ||||||||||||||||||||||||
264 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
265 | - | |||||||||||||||||||||||||
266 | if (!(dsa->pub_key = BN_new())
| 0 | ||||||||||||||||||||||||
267 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
268 | if (!(ctx = BN_CTX_new())
| 0 | ||||||||||||||||||||||||
269 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
270 | if (!BN_mod_exp_ct(dsa->pub_key, dsa->g,
| 0 | ||||||||||||||||||||||||
271 | dsa->priv_key, dsa->p, ctx)
| 0 | ||||||||||||||||||||||||
272 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
273 | BN_CTX_free(ctx); | - | ||||||||||||||||||||||||
274 | } never executed: end of block | 0 | ||||||||||||||||||||||||
275 | - | |||||||||||||||||||||||||
276 | EVP_PKEY_set1_DSA(ret, dsa); | - | ||||||||||||||||||||||||
277 | DSA_free(dsa); | - | ||||||||||||||||||||||||
278 | *in = p; | - | ||||||||||||||||||||||||
279 | return never executed: ret;return ret; never executed: return ret; | 0 | ||||||||||||||||||||||||
280 | - | |||||||||||||||||||||||||
281 | memerr: | - | ||||||||||||||||||||||||
282 | ERR_put_error(9,(0xfff),((1|64)),__FILE__,353); | - | ||||||||||||||||||||||||
283 | DSA_free(dsa); | - | ||||||||||||||||||||||||
284 | EVP_PKEY_free(ret); | - | ||||||||||||||||||||||||
285 | BN_CTX_free(ctx); | - | ||||||||||||||||||||||||
286 | return never executed: return ((void *)0) ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
287 | ((void *)0) never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
288 | ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
289 | } | - | ||||||||||||||||||||||||
290 | - | |||||||||||||||||||||||||
291 | static EVP_PKEY * | - | ||||||||||||||||||||||||
292 | b2i_rsa(const unsigned char **in, unsigned int length, unsigned int bitlen, | - | ||||||||||||||||||||||||
293 | int ispub) | - | ||||||||||||||||||||||||
294 | { | - | ||||||||||||||||||||||||
295 | const unsigned char *p = *in; | - | ||||||||||||||||||||||||
296 | EVP_PKEY *ret = | - | ||||||||||||||||||||||||
297 | ((void *)0) | - | ||||||||||||||||||||||||
298 | ; | - | ||||||||||||||||||||||||
299 | RSA *rsa = | - | ||||||||||||||||||||||||
300 | ((void *)0) | - | ||||||||||||||||||||||||
301 | ; | - | ||||||||||||||||||||||||
302 | unsigned int nbyte, hnbyte; | - | ||||||||||||||||||||||||
303 | - | |||||||||||||||||||||||||
304 | nbyte = (bitlen + 7) >> 3; | - | ||||||||||||||||||||||||
305 | hnbyte = (bitlen + 15) >> 4; | - | ||||||||||||||||||||||||
306 | rsa = RSA_new(); | - | ||||||||||||||||||||||||
307 | ret = EVP_PKEY_new(); | - | ||||||||||||||||||||||||
308 | if (!rsa
| 0 | ||||||||||||||||||||||||
309 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
310 | rsa->e = BN_new(); | - | ||||||||||||||||||||||||
311 | if (!rsa->e
| 0 | ||||||||||||||||||||||||
312 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
313 | if (!BN_set_word(rsa->e, read_ledword(&p))
| 0 | ||||||||||||||||||||||||
314 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
315 | if (!read_lebn(&p, nbyte, &rsa->n)
| 0 | ||||||||||||||||||||||||
316 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
317 | if (!ispub
| 0 | ||||||||||||||||||||||||
318 | if (!read_lebn(&p, hnbyte, &rsa->p)
| 0 | ||||||||||||||||||||||||
319 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
320 | if (!read_lebn(&p, hnbyte, &rsa->q)
| 0 | ||||||||||||||||||||||||
321 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
322 | if (!read_lebn(&p, hnbyte, &rsa->dmp1)
| 0 | ||||||||||||||||||||||||
323 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
324 | if (!read_lebn(&p, hnbyte, &rsa->dmq1)
| 0 | ||||||||||||||||||||||||
325 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
326 | if (!read_lebn(&p, hnbyte, &rsa->iqmp)
| 0 | ||||||||||||||||||||||||
327 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
328 | if (!read_lebn(&p, nbyte, &rsa->d)
| 0 | ||||||||||||||||||||||||
329 | goto never executed: memerr;goto memerr; never executed: goto memerr; | 0 | ||||||||||||||||||||||||
330 | } never executed: end of block | 0 | ||||||||||||||||||||||||
331 | - | |||||||||||||||||||||||||
332 | EVP_PKEY_set1_RSA(ret, rsa); | - | ||||||||||||||||||||||||
333 | RSA_free(rsa); | - | ||||||||||||||||||||||||
334 | *in = p; | - | ||||||||||||||||||||||||
335 | return never executed: ret;return ret; never executed: return ret; | 0 | ||||||||||||||||||||||||
336 | - | |||||||||||||||||||||||||
337 | memerr: | - | ||||||||||||||||||||||||
338 | ERR_put_error(9,(0xfff),((1|64)),__FILE__,403); | - | ||||||||||||||||||||||||
339 | RSA_free(rsa); | - | ||||||||||||||||||||||||
340 | EVP_PKEY_free(ret); | - | ||||||||||||||||||||||||
341 | return never executed: return ((void *)0) ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
342 | ((void *)0) never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
343 | ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
344 | } | - | ||||||||||||||||||||||||
345 | - | |||||||||||||||||||||||||
346 | EVP_PKEY * | - | ||||||||||||||||||||||||
347 | b2i_PrivateKey(const unsigned char **in, long length) | - | ||||||||||||||||||||||||
348 | { | - | ||||||||||||||||||||||||
349 | return never executed: do_b2i(in, length, 0);return do_b2i(in, length, 0); never executed: return do_b2i(in, length, 0); | 0 | ||||||||||||||||||||||||
350 | } | - | ||||||||||||||||||||||||
351 | - | |||||||||||||||||||||||||
352 | EVP_PKEY * | - | ||||||||||||||||||||||||
353 | b2i_PublicKey(const unsigned char **in, long length) | - | ||||||||||||||||||||||||
354 | { | - | ||||||||||||||||||||||||
355 | return never executed: do_b2i(in, length, 1);return do_b2i(in, length, 1); never executed: return do_b2i(in, length, 1); | 0 | ||||||||||||||||||||||||
356 | } | - | ||||||||||||||||||||||||
357 | - | |||||||||||||||||||||||||
358 | EVP_PKEY * | - | ||||||||||||||||||||||||
359 | b2i_PrivateKey_bio(BIO *in) | - | ||||||||||||||||||||||||
360 | { | - | ||||||||||||||||||||||||
361 | return never executed: do_b2i_bio(in, 0);return do_b2i_bio(in, 0); never executed: return do_b2i_bio(in, 0); | 0 | ||||||||||||||||||||||||
362 | } | - | ||||||||||||||||||||||||
363 | - | |||||||||||||||||||||||||
364 | EVP_PKEY * | - | ||||||||||||||||||||||||
365 | b2i_PublicKey_bio(BIO *in) | - | ||||||||||||||||||||||||
366 | { | - | ||||||||||||||||||||||||
367 | return never executed: do_b2i_bio(in, 1);return do_b2i_bio(in, 1); never executed: return do_b2i_bio(in, 1); | 0 | ||||||||||||||||||||||||
368 | } | - | ||||||||||||||||||||||||
369 | - | |||||||||||||||||||||||||
370 | static void | - | ||||||||||||||||||||||||
371 | write_ledword(unsigned char **out, unsigned int dw) | - | ||||||||||||||||||||||||
372 | { | - | ||||||||||||||||||||||||
373 | unsigned char *p = *out; | - | ||||||||||||||||||||||||
374 | - | |||||||||||||||||||||||||
375 | *p++ = dw & 0xff; | - | ||||||||||||||||||||||||
376 | *p++ = (dw >> 8) & 0xff; | - | ||||||||||||||||||||||||
377 | *p++ = (dw >> 16) & 0xff; | - | ||||||||||||||||||||||||
378 | *p++ = (dw >> 24) & 0xff; | - | ||||||||||||||||||||||||
379 | *out = p; | - | ||||||||||||||||||||||||
380 | } never executed: end of block | 0 | ||||||||||||||||||||||||
381 | - | |||||||||||||||||||||||||
382 | static void | - | ||||||||||||||||||||||||
383 | write_lebn(unsigned char **out, const BIGNUM *bn, int len) | - | ||||||||||||||||||||||||
384 | { | - | ||||||||||||||||||||||||
385 | int nb, i; | - | ||||||||||||||||||||||||
386 | unsigned char *p = *out, *q, c; | - | ||||||||||||||||||||||||
387 | - | |||||||||||||||||||||||||
388 | nb = ((BN_num_bits(bn)+7)/8); | - | ||||||||||||||||||||||||
389 | BN_bn2bin(bn, p); | - | ||||||||||||||||||||||||
390 | q = p + nb - 1; | - | ||||||||||||||||||||||||
391 | - | |||||||||||||||||||||||||
392 | for (i = 0; i < nb / 2
| 0 | ||||||||||||||||||||||||
393 | c = *p; | - | ||||||||||||||||||||||||
394 | *p++ = *q; | - | ||||||||||||||||||||||||
395 | *q-- = c; | - | ||||||||||||||||||||||||
396 | } never executed: end of block | 0 | ||||||||||||||||||||||||
397 | *out += nb; | - | ||||||||||||||||||||||||
398 | - | |||||||||||||||||||||||||
399 | if (len > 0
| 0 | ||||||||||||||||||||||||
400 | len -= nb; | - | ||||||||||||||||||||||||
401 | if (len > 0
| 0 | ||||||||||||||||||||||||
402 | memset(*out, 0, len); | - | ||||||||||||||||||||||||
403 | *out += len; | - | ||||||||||||||||||||||||
404 | } never executed: end of block | 0 | ||||||||||||||||||||||||
405 | } never executed: end of block | 0 | ||||||||||||||||||||||||
406 | } never executed: end of block | 0 | ||||||||||||||||||||||||
407 | - | |||||||||||||||||||||||||
408 | - | |||||||||||||||||||||||||
409 | static int check_bitlen_rsa(RSA *rsa, int ispub, unsigned int *magic); | - | ||||||||||||||||||||||||
410 | static int check_bitlen_dsa(DSA *dsa, int ispub, unsigned int *magic); | - | ||||||||||||||||||||||||
411 | - | |||||||||||||||||||||||||
412 | static void write_rsa(unsigned char **out, RSA *rsa, int ispub); | - | ||||||||||||||||||||||||
413 | static void write_dsa(unsigned char **out, DSA *dsa, int ispub); | - | ||||||||||||||||||||||||
414 | - | |||||||||||||||||||||||||
415 | static int | - | ||||||||||||||||||||||||
416 | do_i2b(unsigned char **out, EVP_PKEY *pk, int ispub) | - | ||||||||||||||||||||||||
417 | { | - | ||||||||||||||||||||||||
418 | unsigned char *p; | - | ||||||||||||||||||||||||
419 | unsigned int bitlen, magic = 0, keyalg; | - | ||||||||||||||||||||||||
420 | int outlen, noinc = 0; | - | ||||||||||||||||||||||||
421 | - | |||||||||||||||||||||||||
422 | if (pk->type == 116
| 0 | ||||||||||||||||||||||||
423 | bitlen = check_bitlen_dsa(pk->pkey.dsa, ispub, &magic); | - | ||||||||||||||||||||||||
424 | keyalg = 0x2200; | - | ||||||||||||||||||||||||
425 | } never executed: else if (pk->type == 6end of block
| 0 | ||||||||||||||||||||||||
426 | bitlen = check_bitlen_rsa(pk->pkey.rsa, ispub, &magic); | - | ||||||||||||||||||||||||
427 | keyalg = 0xa400; | - | ||||||||||||||||||||||||
428 | } never executed: elseend of block | 0 | ||||||||||||||||||||||||
429 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
430 | if (bitlen == 0
| 0 | ||||||||||||||||||||||||
431 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
432 | outlen = 16 + blob_length(bitlen, | - | ||||||||||||||||||||||||
433 | keyalg == 0x2200 ? 1 : 0, ispub); | - | ||||||||||||||||||||||||
434 | if (out ==
| 0 | ||||||||||||||||||||||||
435 | ((void *)0)
| 0 | ||||||||||||||||||||||||
436 | ) | - | ||||||||||||||||||||||||
437 | return never executed: outlen;return outlen; never executed: return outlen; | 0 | ||||||||||||||||||||||||
438 | if (*
| 0 | ||||||||||||||||||||||||
439 | p = *out; never executed: p = *out; | 0 | ||||||||||||||||||||||||
440 | else { | - | ||||||||||||||||||||||||
441 | p = malloc(outlen); | - | ||||||||||||||||||||||||
442 | if (!p
| 0 | ||||||||||||||||||||||||
443 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
444 | *out = p; | - | ||||||||||||||||||||||||
445 | noinc = 1; | - | ||||||||||||||||||||||||
446 | } never executed: end of block | 0 | ||||||||||||||||||||||||
447 | if (ispub
| 0 | ||||||||||||||||||||||||
448 | * never executed: p++ = 0x6;*p++ = 0x6; never executed: *p++ = 0x6; | 0 | ||||||||||||||||||||||||
449 | else | - | ||||||||||||||||||||||||
450 | * never executed: p++ = 0x7;*p++ = 0x7; never executed: *p++ = 0x7; | 0 | ||||||||||||||||||||||||
451 | *p++ = 0x2; | - | ||||||||||||||||||||||||
452 | *p++ = 0; | - | ||||||||||||||||||||||||
453 | *p++ = 0; | - | ||||||||||||||||||||||||
454 | write_ledword(&p, keyalg); | - | ||||||||||||||||||||||||
455 | write_ledword(&p, magic); | - | ||||||||||||||||||||||||
456 | write_ledword(&p, bitlen); | - | ||||||||||||||||||||||||
457 | if (keyalg == 0x2200
| 0 | ||||||||||||||||||||||||
458 | write_dsa(&p, pk->pkey.dsa, ispub); never executed: write_dsa(&p, pk->pkey.dsa, ispub); | 0 | ||||||||||||||||||||||||
459 | else | - | ||||||||||||||||||||||||
460 | write_rsa(&p, pk->pkey.rsa, ispub); never executed: write_rsa(&p, pk->pkey.rsa, ispub); | 0 | ||||||||||||||||||||||||
461 | if (!noinc
| 0 | ||||||||||||||||||||||||
462 | * never executed: out += outlen;*out += outlen; never executed: *out += outlen; | 0 | ||||||||||||||||||||||||
463 | return never executed: outlen;return outlen; never executed: return outlen; | 0 | ||||||||||||||||||||||||
464 | } | - | ||||||||||||||||||||||||
465 | - | |||||||||||||||||||||||||
466 | static int | - | ||||||||||||||||||||||||
467 | do_i2b_bio(BIO *out, EVP_PKEY *pk, int ispub) | - | ||||||||||||||||||||||||
468 | { | - | ||||||||||||||||||||||||
469 | unsigned char *tmp = | - | ||||||||||||||||||||||||
470 | ((void *)0) | - | ||||||||||||||||||||||||
471 | ; | - | ||||||||||||||||||||||||
472 | int outlen, wrlen; | - | ||||||||||||||||||||||||
473 | - | |||||||||||||||||||||||||
474 | outlen = do_i2b(&tmp, pk, ispub); | - | ||||||||||||||||||||||||
475 | if (outlen < 0
| 0 | ||||||||||||||||||||||||
476 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
477 | wrlen = BIO_write(out, tmp, outlen); | - | ||||||||||||||||||||||||
478 | free(tmp); | - | ||||||||||||||||||||||||
479 | if (wrlen == outlen
| 0 | ||||||||||||||||||||||||
480 | return never executed: outlen;return outlen; never executed: return outlen; | 0 | ||||||||||||||||||||||||
481 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
482 | } | - | ||||||||||||||||||||||||
483 | - | |||||||||||||||||||||||||
484 | static int | - | ||||||||||||||||||||||||
485 | check_bitlen_dsa(DSA *dsa, int ispub, unsigned int *pmagic) | - | ||||||||||||||||||||||||
486 | { | - | ||||||||||||||||||||||||
487 | int bitlen; | - | ||||||||||||||||||||||||
488 | - | |||||||||||||||||||||||||
489 | bitlen = BN_num_bits(dsa->p); | - | ||||||||||||||||||||||||
490 | if ((
| 0 | ||||||||||||||||||||||||
491 | (
| 0 | ||||||||||||||||||||||||
492 | goto never executed: badkey;goto badkey; never executed: goto badkey; | 0 | ||||||||||||||||||||||||
493 | if (ispub
| 0 | ||||||||||||||||||||||||
494 | if (BN_num_bits(dsa->pub_key) > bitlen
| 0 | ||||||||||||||||||||||||
495 | goto never executed: badkey;goto badkey; never executed: goto badkey; | 0 | ||||||||||||||||||||||||
496 | *pmagic = 0x31535344L; | - | ||||||||||||||||||||||||
497 | } never executed: else {end of block | 0 | ||||||||||||||||||||||||
498 | if (BN_num_bits(dsa->priv_key) > 160
| 0 | ||||||||||||||||||||||||
499 | goto never executed: badkey;goto badkey; never executed: goto badkey; | 0 | ||||||||||||||||||||||||
500 | *pmagic = 0x32535344L; | - | ||||||||||||||||||||||||
501 | } never executed: end of block | 0 | ||||||||||||||||||||||||
502 | - | |||||||||||||||||||||||||
503 | return never executed: bitlen;return bitlen; never executed: return bitlen; | 0 | ||||||||||||||||||||||||
504 | - | |||||||||||||||||||||||||
505 | badkey: | - | ||||||||||||||||||||||||
506 | ERR_put_error(9,(0xfff),(126),__FILE__,565); | - | ||||||||||||||||||||||||
507 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
508 | } | - | ||||||||||||||||||||||||
509 | - | |||||||||||||||||||||||||
510 | static int | - | ||||||||||||||||||||||||
511 | check_bitlen_rsa(RSA *rsa, int ispub, unsigned int *pmagic) | - | ||||||||||||||||||||||||
512 | { | - | ||||||||||||||||||||||||
513 | int nbyte, hnbyte, bitlen; | - | ||||||||||||||||||||||||
514 | - | |||||||||||||||||||||||||
515 | if (BN_num_bits(rsa->e) > 32
| 0 | ||||||||||||||||||||||||
516 | goto never executed: badkey;goto badkey; never executed: goto badkey; | 0 | ||||||||||||||||||||||||
517 | bitlen = BN_num_bits(rsa->n); | - | ||||||||||||||||||||||||
518 | nbyte = ((BN_num_bits(rsa->n)+7)/8); | - | ||||||||||||||||||||||||
519 | hnbyte = (BN_num_bits(rsa->n) + 15) >> 4; | - | ||||||||||||||||||||||||
520 | if (ispub
| 0 | ||||||||||||||||||||||||
521 | *pmagic = 0x31415352L; | - | ||||||||||||||||||||||||
522 | return never executed: bitlen;return bitlen; never executed: return bitlen; | 0 | ||||||||||||||||||||||||
523 | } else { | - | ||||||||||||||||||||||||
524 | *pmagic = 0x32415352L; | - | ||||||||||||||||||||||||
525 | - | |||||||||||||||||||||||||
526 | - | |||||||||||||||||||||||||
527 | - | |||||||||||||||||||||||||
528 | if (((
| 0 | ||||||||||||||||||||||||
529 | goto never executed: badkey;goto badkey; never executed: goto badkey; | 0 | ||||||||||||||||||||||||
530 | if ((((
| 0 | ||||||||||||||||||||||||
531 | (((
| 0 | ||||||||||||||||||||||||
532 | (((
| 0 | ||||||||||||||||||||||||
533 | (((
| 0 | ||||||||||||||||||||||||
534 | (((
| 0 | ||||||||||||||||||||||||
535 | goto never executed: badkey;goto badkey; never executed: goto badkey; | 0 | ||||||||||||||||||||||||
536 | } never executed: end of block | 0 | ||||||||||||||||||||||||
537 | return never executed: bitlen;return bitlen; never executed: return bitlen; | 0 | ||||||||||||||||||||||||
538 | - | |||||||||||||||||||||||||
539 | badkey: | - | ||||||||||||||||||||||||
540 | ERR_put_error(9,(0xfff),(126),__FILE__,599); | - | ||||||||||||||||||||||||
541 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
542 | } | - | ||||||||||||||||||||||||
543 | - | |||||||||||||||||||||||||
544 | static void | - | ||||||||||||||||||||||||
545 | write_rsa(unsigned char **out, RSA *rsa, int ispub) | - | ||||||||||||||||||||||||
546 | { | - | ||||||||||||||||||||||||
547 | int nbyte, hnbyte; | - | ||||||||||||||||||||||||
548 | - | |||||||||||||||||||||||||
549 | nbyte = ((BN_num_bits(rsa->n)+7)/8); | - | ||||||||||||||||||||||||
550 | hnbyte = (BN_num_bits(rsa->n) + 15) >> 4; | - | ||||||||||||||||||||||||
551 | write_lebn(out, rsa->e, 4); | - | ||||||||||||||||||||||||
552 | write_lebn(out, rsa->n, -1); | - | ||||||||||||||||||||||||
553 | if (ispub
| 0 | ||||||||||||||||||||||||
554 | return; never executed: return; | 0 | ||||||||||||||||||||||||
555 | write_lebn(out, rsa->p, hnbyte); | - | ||||||||||||||||||||||||
556 | write_lebn(out, rsa->q, hnbyte); | - | ||||||||||||||||||||||||
557 | write_lebn(out, rsa->dmp1, hnbyte); | - | ||||||||||||||||||||||||
558 | write_lebn(out, rsa->dmq1, hnbyte); | - | ||||||||||||||||||||||||
559 | write_lebn(out, rsa->iqmp, hnbyte); | - | ||||||||||||||||||||||||
560 | write_lebn(out, rsa->d, nbyte); | - | ||||||||||||||||||||||||
561 | } never executed: end of block | 0 | ||||||||||||||||||||||||
562 | - | |||||||||||||||||||||||||
563 | static void | - | ||||||||||||||||||||||||
564 | write_dsa(unsigned char **out, DSA *dsa, int ispub) | - | ||||||||||||||||||||||||
565 | { | - | ||||||||||||||||||||||||
566 | int nbyte; | - | ||||||||||||||||||||||||
567 | - | |||||||||||||||||||||||||
568 | nbyte = ((BN_num_bits(dsa->p)+7)/8); | - | ||||||||||||||||||||||||
569 | write_lebn(out, dsa->p, nbyte); | - | ||||||||||||||||||||||||
570 | write_lebn(out, dsa->q, 20); | - | ||||||||||||||||||||||||
571 | write_lebn(out, dsa->g, nbyte); | - | ||||||||||||||||||||||||
572 | if (ispub
| 0 | ||||||||||||||||||||||||
573 | write_lebn(out, dsa->pub_key, nbyte); never executed: write_lebn(out, dsa->pub_key, nbyte); | 0 | ||||||||||||||||||||||||
574 | else | - | ||||||||||||||||||||||||
575 | write_lebn(out, dsa->priv_key, 20); never executed: write_lebn(out, dsa->priv_key, 20); | 0 | ||||||||||||||||||||||||
576 | - | |||||||||||||||||||||||||
577 | memset(*out, 0xff, 24); | - | ||||||||||||||||||||||||
578 | *out += 24; | - | ||||||||||||||||||||||||
579 | return; never executed: return; | 0 | ||||||||||||||||||||||||
580 | } | - | ||||||||||||||||||||||||
581 | - | |||||||||||||||||||||||||
582 | int | - | ||||||||||||||||||||||||
583 | i2b_PrivateKey_bio(BIO *out, EVP_PKEY *pk) | - | ||||||||||||||||||||||||
584 | { | - | ||||||||||||||||||||||||
585 | return never executed: do_i2b_bio(out, pk, 0);return do_i2b_bio(out, pk, 0); never executed: return do_i2b_bio(out, pk, 0); | 0 | ||||||||||||||||||||||||
586 | } | - | ||||||||||||||||||||||||
587 | - | |||||||||||||||||||||||||
588 | int | - | ||||||||||||||||||||||||
589 | i2b_PublicKey_bio(BIO *out, EVP_PKEY *pk) | - | ||||||||||||||||||||||||
590 | { | - | ||||||||||||||||||||||||
591 | return never executed: do_i2b_bio(out, pk, 1);return do_i2b_bio(out, pk, 1); never executed: return do_i2b_bio(out, pk, 1); | 0 | ||||||||||||||||||||||||
592 | } | - | ||||||||||||||||||||||||
593 | - | |||||||||||||||||||||||||
594 | - | |||||||||||||||||||||||||
595 | - | |||||||||||||||||||||||||
596 | static int | - | ||||||||||||||||||||||||
597 | do_PVK_header(const unsigned char **in, unsigned int length, int skip_magic, | - | ||||||||||||||||||||||||
598 | unsigned int *psaltlen, unsigned int *pkeylen) | - | ||||||||||||||||||||||||
599 | { | - | ||||||||||||||||||||||||
600 | const unsigned char *p = *in; | - | ||||||||||||||||||||||||
601 | unsigned int pvk_magic, is_encrypted; | - | ||||||||||||||||||||||||
602 | - | |||||||||||||||||||||||||
603 | if (skip_magic
| 0 | ||||||||||||||||||||||||
604 | if (length < 20
| 0 | ||||||||||||||||||||||||
605 | ERR_put_error(9,(0xfff),(125),__FILE__,664); | - | ||||||||||||||||||||||||
606 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
607 | } | - | ||||||||||||||||||||||||
608 | length -= 20; | - | ||||||||||||||||||||||||
609 | } never executed: else {end of block | 0 | ||||||||||||||||||||||||
610 | if (length < 24
| 0 | ||||||||||||||||||||||||
611 | ERR_put_error(9,(0xfff),(125),__FILE__,670); | - | ||||||||||||||||||||||||
612 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
613 | } | - | ||||||||||||||||||||||||
614 | length -= 24; | - | ||||||||||||||||||||||||
615 | pvk_magic = read_ledword(&p); | - | ||||||||||||||||||||||||
616 | if (pvk_magic != 0xb0b5f11eL
| 0 | ||||||||||||||||||||||||
617 | ERR_put_error(9,(0xfff),(116),__FILE__,676); | - | ||||||||||||||||||||||||
618 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
619 | } | - | ||||||||||||||||||||||||
620 | } never executed: end of block | 0 | ||||||||||||||||||||||||
621 | - | |||||||||||||||||||||||||
622 | p += 4; | - | ||||||||||||||||||||||||
623 | read_ledword(&p); | - | ||||||||||||||||||||||||
624 | is_encrypted = read_ledword(&p); | - | ||||||||||||||||||||||||
625 | *psaltlen = read_ledword(&p); | - | ||||||||||||||||||||||||
626 | *pkeylen = read_ledword(&p); | - | ||||||||||||||||||||||||
627 | if (*
| 0 | ||||||||||||||||||||||||
628 | ERR_put_error(9,(0xfff),(115),__FILE__,687); | - | ||||||||||||||||||||||||
629 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
630 | } | - | ||||||||||||||||||||||||
631 | - | |||||||||||||||||||||||||
632 | if (is_encrypted
| 0 | ||||||||||||||||||||||||
633 | ERR_put_error(9,(0xfff),(121),__FILE__,692); | - | ||||||||||||||||||||||||
634 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
635 | } | - | ||||||||||||||||||||||||
636 | - | |||||||||||||||||||||||||
637 | *in = p; | - | ||||||||||||||||||||||||
638 | return never executed: 1;return 1; never executed: return 1; | 0 | ||||||||||||||||||||||||
639 | } | - | ||||||||||||||||||||||||
640 | - | |||||||||||||||||||||||||
641 | static int | - | ||||||||||||||||||||||||
642 | derive_pvk_key(unsigned char *key, const unsigned char *salt, | - | ||||||||||||||||||||||||
643 | unsigned int saltlen, const unsigned char *pass, int passlen) | - | ||||||||||||||||||||||||
644 | { | - | ||||||||||||||||||||||||
645 | EVP_MD_CTX mctx; | - | ||||||||||||||||||||||||
646 | int rv = 1; | - | ||||||||||||||||||||||||
647 | - | |||||||||||||||||||||||||
648 | EVP_MD_CTX_init(&mctx); | - | ||||||||||||||||||||||||
649 | if (!EVP_DigestInit_ex(&mctx, EVP_sha1(),
| 0 | ||||||||||||||||||||||||
650 | ((void *)0)
| 0 | ||||||||||||||||||||||||
651 | )
| 0 | ||||||||||||||||||||||||
652 | !EVP_DigestUpdate(&mctx, salt, saltlen)
| 0 | ||||||||||||||||||||||||
653 | !EVP_DigestUpdate(&mctx, pass, passlen)
| 0 | ||||||||||||||||||||||||
654 | !EVP_DigestFinal_ex(&mctx, key,
| 0 | ||||||||||||||||||||||||
655 | ((void *)0)
| 0 | ||||||||||||||||||||||||
656 | )
| 0 | ||||||||||||||||||||||||
657 | rv = 0; never executed: rv = 0; | 0 | ||||||||||||||||||||||||
658 | - | |||||||||||||||||||||||||
659 | EVP_MD_CTX_cleanup(&mctx); | - | ||||||||||||||||||||||||
660 | return never executed: rv;return rv; never executed: return rv; | 0 | ||||||||||||||||||||||||
661 | } | - | ||||||||||||||||||||||||
662 | - | |||||||||||||||||||||||||
663 | static EVP_PKEY * | - | ||||||||||||||||||||||||
664 | do_PVK_body(const unsigned char **in, unsigned int saltlen, | - | ||||||||||||||||||||||||
665 | unsigned int keylen, pem_password_cb *cb, void *u) | - | ||||||||||||||||||||||||
666 | { | - | ||||||||||||||||||||||||
667 | EVP_PKEY *ret = | - | ||||||||||||||||||||||||
668 | ((void *)0) | - | ||||||||||||||||||||||||
669 | ; | - | ||||||||||||||||||||||||
670 | const unsigned char *p = *in; | - | ||||||||||||||||||||||||
671 | unsigned int magic; | - | ||||||||||||||||||||||||
672 | unsigned char *enctmp = | - | ||||||||||||||||||||||||
673 | ((void *)0) | - | ||||||||||||||||||||||||
674 | , *q; | - | ||||||||||||||||||||||||
675 | EVP_CIPHER_CTX cctx; | - | ||||||||||||||||||||||||
676 | - | |||||||||||||||||||||||||
677 | EVP_CIPHER_CTX_init(&cctx); | - | ||||||||||||||||||||||||
678 | if (saltlen
| 0 | ||||||||||||||||||||||||
679 | char psbuf[1024]; | - | ||||||||||||||||||||||||
680 | unsigned char keybuf[20]; | - | ||||||||||||||||||||||||
681 | int enctmplen, inlen; | - | ||||||||||||||||||||||||
682 | - | |||||||||||||||||||||||||
683 | if (cb
| 0 | ||||||||||||||||||||||||
684 | inlen = cb(psbuf, 1024, 0, u); never executed: inlen = cb(psbuf, 1024, 0, u); | 0 | ||||||||||||||||||||||||
685 | else | - | ||||||||||||||||||||||||
686 | inlen = PEM_def_callback(psbuf, 1024, 0, u); never executed: inlen = PEM_def_callback(psbuf, 1024, 0, u); | 0 | ||||||||||||||||||||||||
687 | if (inlen <= 0
| 0 | ||||||||||||||||||||||||
688 | ERR_put_error(9,(0xfff),(104),__FILE__,739); | - | ||||||||||||||||||||||||
689 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
690 | } | - | ||||||||||||||||||||||||
691 | enctmp = malloc(keylen + 8); | - | ||||||||||||||||||||||||
692 | if (!enctmp
| 0 | ||||||||||||||||||||||||
693 | ERR_put_error(9,(0xfff),((1|64)),__FILE__,744); | - | ||||||||||||||||||||||||
694 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
695 | } | - | ||||||||||||||||||||||||
696 | if (!derive_pvk_key(keybuf, p, saltlen, (unsigned char *)psbuf,
| 0 | ||||||||||||||||||||||||
697 | inlen)
| 0 | ||||||||||||||||||||||||
698 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
699 | } | - | ||||||||||||||||||||||||
700 | p += saltlen; | - | ||||||||||||||||||||||||
701 | - | |||||||||||||||||||||||||
702 | memcpy(enctmp, p, 8); | - | ||||||||||||||||||||||||
703 | p += 8; | - | ||||||||||||||||||||||||
704 | if (keylen < 8
| 0 | ||||||||||||||||||||||||
705 | ERR_put_error(9,(0xfff),(125),__FILE__,756); | - | ||||||||||||||||||||||||
706 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
707 | } | - | ||||||||||||||||||||||||
708 | inlen = keylen - 8; | - | ||||||||||||||||||||||||
709 | q = enctmp + 8; | - | ||||||||||||||||||||||||
710 | if (!EVP_DecryptInit_ex(&cctx, EVP_rc4(),
| 0 | ||||||||||||||||||||||||
711 | ((void *)0)
| 0 | ||||||||||||||||||||||||
712 | , keybuf,
| 0 | ||||||||||||||||||||||||
713 | ((void *)0)
| 0 | ||||||||||||||||||||||||
714 | )
| 0 | ||||||||||||||||||||||||
715 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
716 | if (!EVP_DecryptUpdate(&cctx, q, &enctmplen, p, inlen)
| 0 | ||||||||||||||||||||||||
717 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
718 | if (!EVP_DecryptFinal_ex(&cctx, q + enctmplen, &enctmplen)
| 0 | ||||||||||||||||||||||||
719 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
720 | magic = read_ledword((const unsigned char **)&q); | - | ||||||||||||||||||||||||
721 | if (magic != 0x32415352L
| 0 | ||||||||||||||||||||||||
722 | q = enctmp + 8; | - | ||||||||||||||||||||||||
723 | memset(keybuf + 5, 0, 11); | - | ||||||||||||||||||||||||
724 | if (!EVP_DecryptInit_ex(&cctx, EVP_rc4(),
| 0 | ||||||||||||||||||||||||
725 | ((void *)0)
| 0 | ||||||||||||||||||||||||
726 | , keybuf,
| 0 | ||||||||||||||||||||||||
727 |
| 0 | ||||||||||||||||||||||||
728 | ((void *)0)
| 0 | ||||||||||||||||||||||||
729 | )
| 0 | ||||||||||||||||||||||||
730 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
731 | explicit_bzero(keybuf, 20); | - | ||||||||||||||||||||||||
732 | if (!EVP_DecryptUpdate(&cctx, q, &enctmplen, p, inlen)
| 0 | ||||||||||||||||||||||||
733 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
734 | if (!EVP_DecryptFinal_ex(&cctx, q + enctmplen,
| 0 | ||||||||||||||||||||||||
735 | &enctmplen)
| 0 | ||||||||||||||||||||||||
736 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
737 | magic = read_ledword((const unsigned char **)&q); | - | ||||||||||||||||||||||||
738 | if (magic != 0x32415352L
| 0 | ||||||||||||||||||||||||
739 | ERR_put_error(9,(0xfff),(101),__FILE__,782); | - | ||||||||||||||||||||||||
740 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
741 | } | - | ||||||||||||||||||||||||
742 | } never executed: elseend of block | 0 | ||||||||||||||||||||||||
743 | explicit_bzero(keybuf, 20); never executed: explicit_bzero(keybuf, 20); | 0 | ||||||||||||||||||||||||
744 | p = enctmp; | - | ||||||||||||||||||||||||
745 | } never executed: end of block | 0 | ||||||||||||||||||||||||
746 | - | |||||||||||||||||||||||||
747 | ret = b2i_PrivateKey(&p, keylen); | - | ||||||||||||||||||||||||
748 | - | |||||||||||||||||||||||||
749 | err: code before this statement never executed: err: | 0 | ||||||||||||||||||||||||
750 | EVP_CIPHER_CTX_cleanup(&cctx); | - | ||||||||||||||||||||||||
751 | if (enctmp
| 0 | ||||||||||||||||||||||||
752 | free(enctmp); never executed: free(enctmp); | 0 | ||||||||||||||||||||||||
753 | return never executed: ret;return ret; never executed: return ret; | 0 | ||||||||||||||||||||||||
754 | } | - | ||||||||||||||||||||||||
755 | - | |||||||||||||||||||||||||
756 | - | |||||||||||||||||||||||||
757 | EVP_PKEY * | - | ||||||||||||||||||||||||
758 | b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u) | - | ||||||||||||||||||||||||
759 | { | - | ||||||||||||||||||||||||
760 | unsigned char pvk_hdr[24], *buf = | - | ||||||||||||||||||||||||
761 | ((void *)0) | - | ||||||||||||||||||||||||
762 | ; | - | ||||||||||||||||||||||||
763 | const unsigned char *p; | - | ||||||||||||||||||||||||
764 | size_t buflen; | - | ||||||||||||||||||||||||
765 | EVP_PKEY *ret = | - | ||||||||||||||||||||||||
766 | ((void *)0) | - | ||||||||||||||||||||||||
767 | ; | - | ||||||||||||||||||||||||
768 | unsigned int saltlen, keylen; | - | ||||||||||||||||||||||||
769 | - | |||||||||||||||||||||||||
770 | if (BIO_read(in, pvk_hdr, 24) != 24
| 0 | ||||||||||||||||||||||||
771 | ERR_put_error(9,(0xfff),(124),__FILE__,810); | - | ||||||||||||||||||||||||
772 | return never executed: return ((void *)0) ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
773 | ((void *)0) never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
774 | ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
775 | } | - | ||||||||||||||||||||||||
776 | p = pvk_hdr; | - | ||||||||||||||||||||||||
777 | - | |||||||||||||||||||||||||
778 | if (!do_PVK_header(&p, 24, 0, &saltlen, &keylen)
| 0 | ||||||||||||||||||||||||
779 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
780 | buflen = keylen + saltlen; | - | ||||||||||||||||||||||||
781 | buf = malloc(buflen); | - | ||||||||||||||||||||||||
782 | if (!buf
| 0 | ||||||||||||||||||||||||
783 | ERR_put_error(9,(0xfff),((1|64)),__FILE__,820); | - | ||||||||||||||||||||||||
784 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
785 | } | - | ||||||||||||||||||||||||
786 | p = buf; | - | ||||||||||||||||||||||||
787 | if (BIO_read(in, buf, buflen) != buflen
| 0 | ||||||||||||||||||||||||
788 | ERR_put_error(9,(0xfff),(124),__FILE__,825); | - | ||||||||||||||||||||||||
789 | goto never executed: err;goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
790 | } | - | ||||||||||||||||||||||||
791 | ret = do_PVK_body(&p, saltlen, keylen, cb, u); | - | ||||||||||||||||||||||||
792 | - | |||||||||||||||||||||||||
793 | err: code before this statement never executed: err: | 0 | ||||||||||||||||||||||||
794 | freezero(buf, buflen); | - | ||||||||||||||||||||||||
795 | return never executed: ret;return ret; never executed: return ret; | 0 | ||||||||||||||||||||||||
796 | } | - | ||||||||||||||||||||||||
797 | - | |||||||||||||||||||||||||
798 | static int | - | ||||||||||||||||||||||||
799 | i2b_PVK(unsigned char **out, EVP_PKEY*pk, int enclevel, pem_password_cb *cb, | - | ||||||||||||||||||||||||
800 | void *u) | - | ||||||||||||||||||||||||
801 | { | - | ||||||||||||||||||||||||
802 | int outlen = 24, pklen; | - | ||||||||||||||||||||||||
803 | unsigned char *p, *salt = | - | ||||||||||||||||||||||||
804 | ((void *)0) | - | ||||||||||||||||||||||||
805 | ; | - | ||||||||||||||||||||||||
806 | EVP_CIPHER_CTX cctx; | - | ||||||||||||||||||||||||
807 | - | |||||||||||||||||||||||||
808 | EVP_CIPHER_CTX_init(&cctx); | - | ||||||||||||||||||||||||
809 | if (enclevel
| 0 | ||||||||||||||||||||||||
810 | outlen += 0x10; never executed: outlen += 0x10; | 0 | ||||||||||||||||||||||||
811 | pklen = do_i2b( | - | ||||||||||||||||||||||||
812 | ((void *)0) | - | ||||||||||||||||||||||||
813 | , pk, 0); | - | ||||||||||||||||||||||||
814 | if (pklen < 0
| 0 | ||||||||||||||||||||||||
815 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
816 | outlen += pklen; | - | ||||||||||||||||||||||||
817 | p = malloc(outlen); | - | ||||||||||||||||||||||||
818 | if (!p
| 0 | ||||||||||||||||||||||||
819 | ERR_put_error(9,(0xfff),((1|64)),__FILE__,852); | - | ||||||||||||||||||||||||
820 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
821 | } | - | ||||||||||||||||||||||||
822 | - | |||||||||||||||||||||||||
823 | write_ledword(&p, 0xb0b5f11eL); | - | ||||||||||||||||||||||||
824 | write_ledword(&p, 0); | - | ||||||||||||||||||||||||
825 | if (pk->type == 116
| 0 | ||||||||||||||||||||||||
826 | write_ledword(&p, 0x2); never executed: write_ledword(&p, 0x2); | 0 | ||||||||||||||||||||||||
827 | else | - | ||||||||||||||||||||||||
828 | write_ledword(&p, 0x1); never executed: write_ledword(&p, 0x1); | 0 | ||||||||||||||||||||||||
829 | write_ledword(&p, enclevel ? 1 : 0); | - | ||||||||||||||||||||||||
830 | write_ledword(&p, enclevel ? 0x10 : 0); | - | ||||||||||||||||||||||||
831 | write_ledword(&p, pklen); | - | ||||||||||||||||||||||||
832 | if (enclevel
| 0 | ||||||||||||||||||||||||
833 | arc4random_buf(p, 0x10); | - | ||||||||||||||||||||||||
834 | salt = p; | - | ||||||||||||||||||||||||
835 | p += 0x10; | - | ||||||||||||||||||||||||
836 | } never executed: end of block | 0 | ||||||||||||||||||||||||
837 | do_i2b(&p, pk, 0); | - | ||||||||||||||||||||||||
838 | if (enclevel == 0
| 0 | ||||||||||||||||||||||||
839 | *out = p; | - | ||||||||||||||||||||||||
840 | return never executed: outlen;return outlen; never executed: return outlen; | 0 | ||||||||||||||||||||||||
841 | } else { | - | ||||||||||||||||||||||||
842 | char psbuf[1024]; | - | ||||||||||||||||||||||||
843 | unsigned char keybuf[20]; | - | ||||||||||||||||||||||||
844 | int enctmplen, inlen; | - | ||||||||||||||||||||||||
845 | if (cb
| 0 | ||||||||||||||||||||||||
846 | inlen = cb(psbuf, 1024, 1, u); never executed: inlen = cb(psbuf, 1024, 1, u); | 0 | ||||||||||||||||||||||||
847 | else | - | ||||||||||||||||||||||||
848 | inlen = PEM_def_callback(psbuf, 1024, 1, u); never executed: inlen = PEM_def_callback(psbuf, 1024, 1, u); | 0 | ||||||||||||||||||||||||
849 | if (inlen <= 0
| 0 | ||||||||||||||||||||||||
850 | ERR_put_error(9,(0xfff),(104),__FILE__,883); | - | ||||||||||||||||||||||||
851 | goto never executed: error;goto error; never executed: goto error; | 0 | ||||||||||||||||||||||||
852 | } | - | ||||||||||||||||||||||||
853 | if (!derive_pvk_key(keybuf, salt, 0x10,
| 0 | ||||||||||||||||||||||||
854 | (unsigned char *)psbuf, inlen)
| 0 | ||||||||||||||||||||||||
855 | goto never executed: error;goto error; never executed: goto error; | 0 | ||||||||||||||||||||||||
856 | if (enclevel == 1
| 0 | ||||||||||||||||||||||||
857 | memset(keybuf + 5, 0, 11); never executed: memset(keybuf + 5, 0, 11); | 0 | ||||||||||||||||||||||||
858 | p = salt + 0x10 + 8; | - | ||||||||||||||||||||||||
859 | if (!EVP_EncryptInit_ex(&cctx, EVP_rc4(),
| 0 | ||||||||||||||||||||||||
860 | ((void *)0)
| 0 | ||||||||||||||||||||||||
861 | , keybuf,
| 0 | ||||||||||||||||||||||||
862 | ((void *)0)
| 0 | ||||||||||||||||||||||||
863 | )
| 0 | ||||||||||||||||||||||||
864 | goto never executed: error;goto error; never executed: goto error; | 0 | ||||||||||||||||||||||||
865 | explicit_bzero(keybuf, 20); | - | ||||||||||||||||||||||||
866 | if (!EVP_DecryptUpdate(&cctx, p, &enctmplen, p, pklen - 8)
| 0 | ||||||||||||||||||||||||
867 | goto never executed: error;goto error; never executed: goto error; | 0 | ||||||||||||||||||||||||
868 | if (!EVP_DecryptFinal_ex(&cctx, p + enctmplen, &enctmplen)
| 0 | ||||||||||||||||||||||||
869 | goto never executed: error;goto error; never executed: goto error; | 0 | ||||||||||||||||||||||||
870 | } never executed: end of block | 0 | ||||||||||||||||||||||||
871 | EVP_CIPHER_CTX_cleanup(&cctx); | - | ||||||||||||||||||||||||
872 | *out = p; | - | ||||||||||||||||||||||||
873 | return never executed: outlen;return outlen; never executed: return outlen; | 0 | ||||||||||||||||||||||||
874 | - | |||||||||||||||||||||||||
875 | error: | - | ||||||||||||||||||||||||
876 | EVP_CIPHER_CTX_cleanup(&cctx); | - | ||||||||||||||||||||||||
877 | free(p); | - | ||||||||||||||||||||||||
878 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
879 | } | - | ||||||||||||||||||||||||
880 | - | |||||||||||||||||||||||||
881 | int | - | ||||||||||||||||||||||||
882 | i2b_PVK_bio(BIO *out, EVP_PKEY *pk, int enclevel, pem_password_cb *cb, void *u) | - | ||||||||||||||||||||||||
883 | { | - | ||||||||||||||||||||||||
884 | unsigned char *tmp = | - | ||||||||||||||||||||||||
885 | ((void *)0) | - | ||||||||||||||||||||||||
886 | ; | - | ||||||||||||||||||||||||
887 | int outlen, wrlen; | - | ||||||||||||||||||||||||
888 | - | |||||||||||||||||||||||||
889 | outlen = i2b_PVK(&tmp, pk, enclevel, cb, u); | - | ||||||||||||||||||||||||
890 | if (outlen < 0
| 0 | ||||||||||||||||||||||||
891 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
892 | wrlen = BIO_write(out, tmp, outlen); | - | ||||||||||||||||||||||||
893 | free(tmp); | - | ||||||||||||||||||||||||
894 | if (wrlen == outlen
| 0 | ||||||||||||||||||||||||
895 | ERR_put_error(9,(0xfff),(118),__FILE__,922); | - | ||||||||||||||||||||||||
896 | return never executed: outlen;return outlen; never executed: return outlen; | 0 | ||||||||||||||||||||||||
897 | } | - | ||||||||||||||||||||||||
898 | return never executed: -1;return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
899 | } | - | ||||||||||||||||||||||||
Switch to Source code | Preprocessed file |