Line | Source | Count |
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | | - |
11 | | - |
12 | | - |
13 | | - |
14 | struct pkcs11_keyinfo { | - |
15 | struct sshkey *key; | - |
16 | char *providername; | - |
17 | struct { struct pkcs11_keyinfo *tqe_next; struct pkcs11_keyinfo **tqe_prev; } next; | - |
18 | }; | - |
19 | | - |
20 | struct { struct pkcs11_keyinfo *tqh_first; struct pkcs11_keyinfo **tqh_last; } pkcs11_keylist; | - |
21 | | - |
22 | | - |
23 | | - |
24 | | - |
25 | struct sshbuf *iqueue; | - |
26 | struct sshbuf *oqueue; | - |
27 | | - |
28 | static void | - |
29 | add_key(struct sshkey *k, char *name) | - |
30 | { | - |
31 | struct pkcs11_keyinfo *ki; | - |
32 | | - |
33 | ki = xcalloc(1, sizeof(*ki)); | - |
34 | ki->providername = xstrdup(name); | - |
35 | ki->key = k; | - |
36 | do { (ki)->next.tqe_next = | - |
37 | ((void *)0) | - |
38 | ; (ki)->next.tqe_prev = (&pkcs11_keylist)->tqh_last; *(&pkcs11_keylist)->tqh_last = (ki); (&pkcs11_keylist)->tqh_last = &(ki)->next.tqe_next; } while (0); | - |
39 | } never executed: end of block | 0 |
40 | | - |
41 | static void | - |
42 | del_keys_by_name(char *name) | - |
43 | { | - |
44 | struct pkcs11_keyinfo *ki, *nxt; | - |
45 | | - |
46 | for (ki = ((&pkcs11_keylist)->tqh_first); kiTRUE | never evaluated | FALSE | never evaluated |
; ki = nxt) { | 0 |
47 | nxt = ((ki)->next.tqe_next); | - |
48 | if (!TRUE | never evaluated | FALSE | never evaluated |
| 0 |
49 | __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
50 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
51 | ) && __builtin_constant_p (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
52 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
53 | ) && (__s1_len = __builtin_strlen (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
54 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
55 | ), __s2_len = __builtin_strlen (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
56 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
57 | ), (!((size_t)(const void *)((TRUE | never evaluated | FALSE | never evaluated |
| 0 |
58 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
59 | ) + 1) - (size_t)(const void *)(TRUE | never evaluated | FALSE | never evaluated |
| 0 |
60 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
61 | ) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((TRUE | never evaluated | FALSE | never evaluated |
| 0 |
62 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
63 | ) + 1) - (size_t)(const void *)(TRUE | never evaluated | FALSE | never evaluated |
| 0 |
64 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
65 | ) == 1) || __s2_len >= 4)) ? __builtin_strcmp (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
66 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
67 | , TRUE | never evaluated | FALSE | never evaluated |
| 0 |
68 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
69 | ) : (__builtin_constant_p (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
70 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
71 | ) && ((size_t)(const void *)((TRUE | never evaluated | FALSE | never evaluated |
| 0 |
72 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
73 | ) + 1) - (size_t)(const void *)(TRUE | never evaluated | FALSE | never evaluated |
| 0 |
74 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
75 | ) == 1) && (__s1_len = __builtin_strlen (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
76 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
77 | ), __s1_len < 4) ? (__builtin_constant_p (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
78 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
79 | ) && ((size_t)(const void *)((TRUE | never evaluated | FALSE | never evaluated |
| 0 |
80 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
81 | ) + 1) - (size_t)(const void *)(TRUE | never evaluated | FALSE | never evaluated |
| 0 |
82 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
83 | ) == 1) ? __builtin_strcmp (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
84 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
85 | , TRUE | never evaluated | FALSE | never evaluated |
| 0 |
86 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
87 | ) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
88 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
89 | ); int __result = (((const unsigned char *) (const char *) (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
90 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
91 | ))[0] - __s2[0]); if (__s1_len > 0TRUE | never evaluated | FALSE | never evaluated |
&& __result == 0TRUE | never evaluated | FALSE | never evaluated |
) { __result = (((const unsigned char *) (const char *) (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
92 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
93 | ))[1] - __s2[1]); if (__s1_len > 1TRUE | never evaluated | FALSE | never evaluated |
&& __result == 0TRUE | never evaluated | FALSE | never evaluated |
) { __result = (((const unsigned char *) (const char *) (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
94 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
95 | ))[2] - __s2[2]); if (__s1_len > 2TRUE | never evaluated | FALSE | never evaluated |
&& __result == 0TRUE | never evaluated | FALSE | never evaluated |
) __result = (((const unsigned char *) (const char *) (never executed: __result = (((const unsigned char *) (const char *) ( ki->providername ))[3] - __s2[3]); | 0 |
96 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
never executed: __result = (((const unsigned char *) (const char *) ( ki->providername ))[3] - __s2[3]); | 0 |
97 | ))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
98 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
99 | ) && ((size_t)(const void *)((TRUE | never evaluated | FALSE | never evaluated |
| 0 |
100 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
101 | ) + 1) - (size_t)(const void *)(TRUE | never evaluated | FALSE | never evaluated |
| 0 |
102 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
103 | ) == 1) && (__s2_len = __builtin_strlen (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
104 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
105 | ), __s2_len < 4) ? (__builtin_constant_p (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
106 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
107 | ) && ((size_t)(const void *)((TRUE | never evaluated | FALSE | never evaluated |
| 0 |
108 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
109 | ) + 1) - (size_t)(const void *)(TRUE | never evaluated | FALSE | never evaluated |
| 0 |
110 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
111 | ) == 1) ? __builtin_strcmp (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
112 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
113 | , TRUE | never evaluated | FALSE | never evaluated |
| 0 |
114 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
115 | ) : -(__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
116 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
117 | ); int __result = (((const unsigned char *) (const char *) (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
118 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
119 | ))[0] - __s2[0]); if (__s2_len > 0TRUE | never evaluated | FALSE | never evaluated |
&& __result == 0TRUE | never evaluated | FALSE | never evaluated |
) { __result = (((const unsigned char *) (const char *) (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
120 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
121 | ))[1] - __s2[1]); if (__s2_len > 1TRUE | never evaluated | FALSE | never evaluated |
&& __result == 0TRUE | never evaluated | FALSE | never evaluated |
) { __result = (((const unsigned char *) (const char *) (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
122 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
123 | ))[2] - __s2[2]); if (__s2_len > 2TRUE | never evaluated | FALSE | never evaluated |
&& __result == 0TRUE | never evaluated | FALSE | never evaluated |
) __result = (((const unsigned char *) (const char *) (never executed: __result = (((const unsigned char *) (const char *) ( name ))[3] - __s2[3]); | 0 |
124 | nameTRUE | never evaluated | FALSE | never evaluated |
never executed: __result = (((const unsigned char *) (const char *) ( name ))[3] - __s2[3]); | 0 |
125 | ))[3] - __s2[3]); } } __result; }))) : __builtin_strcmp (TRUE | never evaluated | FALSE | never evaluated |
| 0 |
126 | ki->providernameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
127 | , TRUE | never evaluated | FALSE | never evaluated |
| 0 |
128 | nameTRUE | never evaluated | FALSE | never evaluated |
| 0 |
129 | )))); })TRUE | never evaluated | FALSE | never evaluated |
| 0 |
130 | ) { | - |
131 | do { if (((TRUE | never evaluated | FALSE | never evaluated |
ki)->next.tqe_next) != TRUE | never evaluated | FALSE | never evaluated |
| 0 |
132 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
133 | ) ( never executed: (ki)->next.tqe_next->next.tqe_prev = (ki)->next.tqe_prev; ki)->next.tqe_next->next.tqe_prev = (ki)->next.tqe_prev;never executed: (ki)->next.tqe_next->next.tqe_prev = (ki)->next.tqe_prev; else (never executed: (&pkcs11_keylist)->tqh_last = (ki)->next.tqe_prev; &pkcs11_keylist)->tqh_last = (ki)->next.tqe_prev;never executed: (&pkcs11_keylist)->tqh_last = (ki)->next.tqe_prev; *(ki)->next.tqe_prev = (ki)->next.tqe_next; ; ; } while (0); | 0 |
134 | free(ki->providername); | - |
135 | sshkey_free(ki->key); | - |
136 | free(ki); | - |
137 | } never executed: end of block | 0 |
138 | } never executed: end of block | 0 |
139 | } never executed: end of block | 0 |
140 | | - |
141 | | - |
142 | static struct sshkey * | - |
143 | lookup_key(struct sshkey *k) | - |
144 | { | - |
145 | struct pkcs11_keyinfo *ki; | - |
146 | | - |
147 | for((ki) = ((&pkcs11_keylist)->tqh_first); (TRUE | never evaluated | FALSE | never evaluated |
ki) != TRUE | never evaluated | FALSE | never evaluated |
| 0 |
148 | ((TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
149 | ; (ki) = ((ki)->next.tqe_next)) { | - |
150 | debug("check %p %s", ki, ki->providername); | - |
151 | if (sshkey_equal(k, ki->key)TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
152 | return never executed: return (ki->key); (ki->key);never executed: return (ki->key); | 0 |
153 | } never executed: end of block | 0 |
154 | return never executed: return ( ((void *)0) ); (never executed: return ( ((void *)0) ); | 0 |
155 | ((void *)0) never executed: return ( ((void *)0) ); | 0 |
156 | ); never executed: return ( ((void *)0) ); | 0 |
157 | } | - |
158 | | - |
159 | static void | - |
160 | send_msg(struct sshbuf *m) | - |
161 | { | - |
162 | int r; | - |
163 | | - |
164 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_put_stringb(oqueue, m)) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
165 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
166 | } never executed: end of block | 0 |
167 | | - |
168 | static void | - |
169 | process_add(void) | - |
170 | { | - |
171 | char *name, *pin; | - |
172 | struct sshkey **keys; | - |
173 | int r, i, nkeys; | - |
174 | u_char *blob; | - |
175 | size_t blen; | - |
176 | struct sshbuf *msg; | - |
177 | | - |
178 | if ((TRUE | never evaluated | FALSE | never evaluated |
msg = sshbuf_new()) == TRUE | never evaluated | FALSE | never evaluated |
| 0 |
179 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
180 | ) | - |
181 | fatal("%s: sshbuf_new failed", __func__); never executed: fatal("%s: sshbuf_new failed", __func__); | 0 |
182 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_get_cstring(iqueue, &name, TRUE | never evaluated | FALSE | never evaluated |
| 0 |
183 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
184 | )) != 0TRUE | never evaluated | FALSE | never evaluated |
|| | 0 |
185 | (TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_get_cstring(iqueue, &pin, TRUE | never evaluated | FALSE | never evaluated |
| 0 |
186 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
187 | )) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
188 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
189 | if ((TRUE | never evaluated | FALSE | never evaluated |
nkeys = pkcs11_add_provider(name, pin, &keys)) > 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
190 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_put_u8(msg,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
191 | 12)) != 0TRUE | never evaluated | FALSE | never evaluated |
|| | 0 |
192 | (TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_put_u32(msg, nkeys)) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
193 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
194 | for (i = 0; i < nkeysTRUE | never evaluated | FALSE | never evaluated |
; i++) { | 0 |
195 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshkey_to_blob(keys[i], &blob, &blen)) != 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
196 | debug("%s: sshkey_to_blob: %s", | - |
197 | __func__, ssh_err(r)); | - |
198 | continue; never executed: continue; | 0 |
199 | } | - |
200 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_put_string(msg, blob, blen)) != 0TRUE | never evaluated | FALSE | never evaluated |
|| | 0 |
201 | (TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_put_cstring(msg, name)) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
202 | fatal("%s: buffer error: %s", never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
203 | __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
204 | free(blob); | - |
205 | add_key(keys[i], name); | - |
206 | } never executed: end of block | 0 |
207 | free(keys); | - |
208 | } never executed: end of block else { | 0 |
209 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_put_u8(msg, 5)) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
210 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
211 | } never executed: end of block | 0 |
212 | free(pin); | - |
213 | free(name); | - |
214 | send_msg(msg); | - |
215 | sshbuf_free(msg); | - |
216 | } never executed: end of block | 0 |
217 | | - |
218 | static void | - |
219 | process_del(void) | - |
220 | { | - |
221 | char *name, *pin; | - |
222 | struct sshbuf *msg; | - |
223 | int r; | - |
224 | | - |
225 | if ((TRUE | never evaluated | FALSE | never evaluated |
msg = sshbuf_new()) == TRUE | never evaluated | FALSE | never evaluated |
| 0 |
226 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
227 | ) | - |
228 | fatal("%s: sshbuf_new failed", __func__); never executed: fatal("%s: sshbuf_new failed", __func__); | 0 |
229 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_get_cstring(iqueue, &name, TRUE | never evaluated | FALSE | never evaluated |
| 0 |
230 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
231 | )) != 0TRUE | never evaluated | FALSE | never evaluated |
|| | 0 |
232 | (TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_get_cstring(iqueue, &pin, TRUE | never evaluated | FALSE | never evaluated |
| 0 |
233 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
234 | )) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
235 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
236 | del_keys_by_name(name); | - |
237 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_put_u8(msg, pkcs11_del_provider(name) == 0 ?TRUE | never evaluated | FALSE | never evaluated |
| 0 |
238 | 6 : 5)) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
239 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
240 | free(pin); | - |
241 | free(name); | - |
242 | send_msg(msg); | - |
243 | sshbuf_free(msg); | - |
244 | } never executed: end of block | 0 |
245 | | - |
246 | static void | - |
247 | process_sign(void) | - |
248 | { | - |
249 | u_char *blob, *data, *signature = | - |
250 | ((void *)0) | - |
251 | ; | - |
252 | size_t blen, dlen, slen = 0; | - |
253 | int r, ok = -1; | - |
254 | struct sshkey *key, *found; | - |
255 | struct sshbuf *msg; | - |
256 | | - |
257 | | - |
258 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_get_string(iqueue, &blob, &blen)) != 0TRUE | never evaluated | FALSE | never evaluated |
|| | 0 |
259 | (TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_get_string(iqueue, &data, &dlen)) != 0TRUE | never evaluated | FALSE | never evaluated |
|| | 0 |
260 | (TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_get_u32(iqueue, TRUE | never evaluated | FALSE | never evaluated |
| 0 |
261 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
262 | )) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
263 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
264 | | - |
265 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshkey_from_blob(blob, blen, &key)) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
266 | error("%s: sshkey_from_blob: %s", __func__, ssh_err(r)); never executed: error("%s: sshkey_from_blob: %s", __func__, ssh_err(r)); | 0 |
267 | else { | - |
268 | if ((TRUE | never evaluated | FALSE | never evaluated |
found = lookup_key(key)) != TRUE | never evaluated | FALSE | never evaluated |
| 0 |
269 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
270 | ) { | - |
271 | | - |
272 | int ret; | - |
273 | | - |
274 | slen = RSA_size(key->rsa); | - |
275 | signature = xmalloc(slen); | - |
276 | if ((TRUE | never evaluated | FALSE | never evaluated |
ret = RSA_private_encrypt(dlen, data, signature,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
277 | found->rsa, TRUE | never evaluated | FALSE | never evaluated |
| 0 |
278 | 1TRUE | never evaluated | FALSE | never evaluated |
| 0 |
279 | )) != -1TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
280 | slen = ret; | - |
281 | ok = 0; | - |
282 | } never executed: end of block | 0 |
283 | | - |
284 | } never executed: end of block | 0 |
285 | sshkey_free(key); | - |
286 | } never executed: end of block | 0 |
287 | if ((TRUE | never evaluated | FALSE | never evaluated |
msg = sshbuf_new()) == TRUE | never evaluated | FALSE | never evaluated |
| 0 |
288 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
289 | ) | - |
290 | fatal("%s: sshbuf_new failed", __func__); never executed: fatal("%s: sshbuf_new failed", __func__); | 0 |
291 | if (ok == 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
292 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_put_u8(msg, 14)) != 0TRUE | never evaluated | FALSE | never evaluated |
|| | 0 |
293 | (TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_put_string(msg, signature, slen)) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
294 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
295 | } never executed: end of block else { | 0 |
296 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_put_u8(msg, 30)) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
297 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
298 | } never executed: end of block | 0 |
299 | free(data); | - |
300 | free(blob); | - |
301 | free(signature); | - |
302 | send_msg(msg); | - |
303 | sshbuf_free(msg); | - |
304 | } never executed: end of block | 0 |
305 | | - |
306 | static void | - |
307 | process(void) | - |
308 | { | - |
309 | u_int msg_len; | - |
310 | u_int buf_len; | - |
311 | u_int consumed; | - |
312 | u_char type; | - |
313 | const u_char *cp; | - |
314 | int r; | - |
315 | | - |
316 | buf_len = sshbuf_len(iqueue); | - |
317 | if (buf_len < 5TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
318 | return; never executed: return; | 0 |
319 | cp = sshbuf_ptr(iqueue); | - |
320 | msg_len = get_u32(cp); | - |
321 | if (msg_len > 10240TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
322 | error("bad message len %d", msg_len); | - |
323 | cleanup_exit(11); | - |
324 | } never executed: end of block | 0 |
325 | if (buf_len < msg_len + 4TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
326 | return; never executed: return; | 0 |
327 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_consume(iqueue, 4)) != 0TRUE | never evaluated | FALSE | never evaluated |
|| | 0 |
328 | (TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_get_u8(iqueue, &type)) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
329 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
330 | buf_len -= 4; | - |
331 | switch (type) { | - |
332 | case never executed: case 20: 20:never executed: case 20: | 0 |
333 | debug("process_add"); | - |
334 | process_add(); | - |
335 | break; never executed: break; | 0 |
336 | case never executed: case 21: 21:never executed: case 21: | 0 |
337 | debug("process_del"); | - |
338 | process_del(); | - |
339 | break; never executed: break; | 0 |
340 | case never executed: case 13: 13:never executed: case 13: | 0 |
341 | debug("process_sign"); | - |
342 | process_sign(); | - |
343 | break; never executed: break; | 0 |
344 | default never executed: default: :never executed: default: | 0 |
345 | error("Unknown message %d", type); | - |
346 | break; never executed: break; | 0 |
347 | } | - |
348 | | - |
349 | if (buf_len < sshbuf_len(iqueue)TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
350 | error("iqueue grew unexpectedly"); | - |
351 | cleanup_exit(255); | - |
352 | } never executed: end of block | 0 |
353 | consumed = buf_len - sshbuf_len(iqueue); | - |
354 | if (msg_len < consumedTRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
355 | error("msg_len %d < consumed %d", msg_len, consumed); | - |
356 | cleanup_exit(255); | - |
357 | } never executed: end of block | 0 |
358 | if (msg_len > consumedTRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
359 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_consume(iqueue, msg_len - consumed)) != 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
360 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
361 | } never executed: end of block | 0 |
362 | } never executed: end of block | 0 |
363 | | - |
364 | void | - |
365 | cleanup_exit(int i) | - |
366 | { | - |
367 | | - |
368 | _exit(i); | - |
369 | } never executed: end of block | 0 |
370 | | - |
371 | int | - |
372 | main(int argc, char **argv) | - |
373 | { | - |
374 | fd_set *rset, *wset; | - |
375 | int r, in, out, max, log_stderr = 0; | - |
376 | ssize_t len, olen, set_size; | - |
377 | SyslogFacility log_facility = SYSLOG_FACILITY_AUTH; | - |
378 | LogLevel log_level = SYSLOG_LEVEL_ERROR; | - |
379 | char buf[4*4096]; | - |
380 | | - |
381 | extern char *__progname; | - |
382 | | - |
383 | ssh_malloc_init(); | - |
384 | do { (&pkcs11_keylist)->tqh_first = | - |
385 | ((void *)0) | - |
386 | ; (&pkcs11_keylist)->tqh_last = &(&pkcs11_keylist)->tqh_first; } while (0); | - |
387 | pkcs11_init(0); | - |
388 | | - |
389 | seed_rng(); | - |
390 | __progname = ssh_get_progname(argv[0]); | - |
391 | | - |
392 | log_init(__progname, log_level, log_facility, log_stderr); | - |
393 | | - |
394 | in = | - |
395 | 0 | - |
396 | ; | - |
397 | out = | - |
398 | 1 | - |
399 | ; | - |
400 | | - |
401 | max = 0; | - |
402 | if (in > maxTRUE | never evaluated | FALSE | never evaluated |
) | 0 |
403 | max = in; never executed: max = in; | 0 |
404 | if (out > maxTRUE | never evaluated | FALSE | never evaluated |
) | 0 |
405 | max = out; never executed: max = out; | 0 |
406 | | - |
407 | if ((TRUE | never evaluated | FALSE | never evaluated |
iqueue = sshbuf_new()) == TRUE | never evaluated | FALSE | never evaluated |
| 0 |
408 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
409 | ) | - |
410 | fatal("%s: sshbuf_new failed", __func__); never executed: fatal("%s: sshbuf_new failed", __func__); | 0 |
411 | if ((TRUE | never evaluated | FALSE | never evaluated |
oqueue = sshbuf_new()) == TRUE | never evaluated | FALSE | never evaluated |
| 0 |
412 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
413 | ) | - |
414 | fatal("%s: sshbuf_new failed", __func__); never executed: fatal("%s: sshbuf_new failed", __func__); | 0 |
415 | | - |
416 | set_size = | - |
417 | ((( | - |
418 | max + 1 | - |
419 | ) + (((8 * (int) sizeof (__fd_mask))) - 1)) / ((8 * (int) sizeof (__fd_mask)))) | - |
420 | * sizeof(fd_mask); | - |
421 | rset = xmalloc(set_size); | - |
422 | wset = xmalloc(set_size); | - |
423 | | - |
424 | for (;;) { | - |
425 | memset(rset, 0, set_size); | - |
426 | memset(wset, 0, set_size); | - |
427 | | - |
428 | | - |
429 | | - |
430 | | - |
431 | | - |
432 | | - |
433 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_check_reserve(iqueue, sizeof(buf))) == 0TRUE | never evaluated | FALSE | never evaluated |
&& | 0 |
434 | (TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_check_reserve(oqueue, 10240)) == 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
435 | kludge_FD_SET(in, rset); never executed: kludge_FD_SET(in, rset); | 0 |
436 | else if (r != -9TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
437 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
438 | | - |
439 | olen = sshbuf_len(oqueue); | - |
440 | if (olen > 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
441 | kludge_FD_SET(out, wset); never executed: kludge_FD_SET(out, wset); | 0 |
442 | | - |
443 | if (select(max+1, rset, wset, TRUE | never evaluated | FALSE | never evaluated |
| 0 |
444 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
445 | , TRUE | never evaluated | FALSE | never evaluated |
| 0 |
446 | ((void *)0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
447 | ) < 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
448 | if ( | - |
449 | (*TRUE | never evaluated | FALSE | never evaluated |
__errno_location ()) TRUE | never evaluated | FALSE | never evaluated |
| 0 |
450 | == TRUE | never evaluated | FALSE | never evaluated |
| 0 |
451 | 4TRUE | never evaluated | FALSE | never evaluated |
| 0 |
452 | ) | - |
453 | continue; never executed: continue; | 0 |
454 | error("select: %s", strerror( | - |
455 | (*__errno_location ()) | - |
456 | )); | - |
457 | cleanup_exit(2); | - |
458 | } never executed: end of block | 0 |
459 | | - |
460 | | - |
461 | if (kludge_FD_ISSET(in, rset)TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
462 | len = read(in, buf, sizeof buf); | - |
463 | if (len == 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
464 | debug("read eof"); | - |
465 | cleanup_exit(0); | - |
466 | } never executed: end of block else if (len < 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
467 | error("read: %s", strerror( | - |
468 | (*__errno_location ()) | - |
469 | )); | - |
470 | cleanup_exit(1); | - |
471 | } never executed: end of block else if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_put(iqueue, buf, len)) != 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
472 | fatal("%s: buffer error: %s", | - |
473 | __func__, ssh_err(r)); | - |
474 | } never executed: end of block | 0 |
475 | } never executed: end of block | 0 |
476 | | - |
477 | if (kludge_FD_ISSET(out, wset)TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
478 | len = write(out, sshbuf_ptr(oqueue), olen); | - |
479 | if (len < 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
480 | error("write: %s", strerror( | - |
481 | (*__errno_location ()) | - |
482 | )); | - |
483 | cleanup_exit(1); | - |
484 | } never executed: end of block else if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_consume(oqueue, len)) != 0TRUE | never evaluated | FALSE | never evaluated |
) { | 0 |
485 | fatal("%s: buffer error: %s", | - |
486 | __func__, ssh_err(r)); | - |
487 | } never executed: end of block | 0 |
488 | } never executed: end of block | 0 |
489 | | - |
490 | | - |
491 | | - |
492 | | - |
493 | | - |
494 | | - |
495 | if ((TRUE | never evaluated | FALSE | never evaluated |
r = sshbuf_check_reserve(oqueue, 10240)) == 0TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
496 | process(); never executed: process(); | 0 |
497 | else if (r != -9TRUE | never evaluated | FALSE | never evaluated |
) | 0 |
498 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 0 |
499 | } never executed: end of block | 0 |
500 | } never executed: end of block | 0 |
| | |