Invalidate VNC framebuffer on every resize.
[qemu] / vnc.c
1 /*
2  * QEMU VNC display driver
3  *
4  * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
5  * Copyright (C) 2006 Fabrice Bellard
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23  * THE SOFTWARE.
24  */
25
26 #include "qemu-common.h"
27 #include "console.h"
28 #include "sysemu.h"
29 #include "qemu_socket.h"
30 #include "qemu-timer.h"
31
32 #define VNC_REFRESH_INTERVAL (1000 / 30)
33
34 #include "vnc_keysym.h"
35 #include "keymaps.c"
36 #include "d3des.h"
37
38 #if CONFIG_VNC_TLS
39 #include <gnutls/gnutls.h>
40 #include <gnutls/x509.h>
41 #endif /* CONFIG_VNC_TLS */
42
43 // #define _VNC_DEBUG 1
44
45 #if _VNC_DEBUG
46 #define VNC_DEBUG(fmt, ...) do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
47
48 #if CONFIG_VNC_TLS && _VNC_DEBUG >= 2
49 /* Very verbose, so only enabled for _VNC_DEBUG >= 2 */
50 static void vnc_debug_gnutls_log(int level, const char* str) {
51     VNC_DEBUG("%d %s", level, str);
52 }
53 #endif /* CONFIG_VNC_TLS && _VNC_DEBUG */
54 #else
55 #define VNC_DEBUG(fmt, ...) do { } while (0)
56 #endif
57
58
59 typedef struct Buffer
60 {
61     size_t capacity;
62     size_t offset;
63     uint8_t *buffer;
64 } Buffer;
65
66 typedef struct VncState VncState;
67
68 typedef int VncReadEvent(VncState *vs, uint8_t *data, size_t len);
69
70 typedef void VncWritePixels(VncState *vs, void *data, int size);
71
72 typedef void VncSendHextileTile(VncState *vs,
73                                 int x, int y, int w, int h,
74                                 uint32_t *last_bg,
75                                 uint32_t *last_fg,
76                                 int *has_bg, int *has_fg);
77
78 #define VNC_MAX_WIDTH 2048
79 #define VNC_MAX_HEIGHT 2048
80 #define VNC_DIRTY_WORDS (VNC_MAX_WIDTH / (16 * 32))
81
82 #define VNC_AUTH_CHALLENGE_SIZE 16
83
84 enum {
85     VNC_AUTH_INVALID = 0,
86     VNC_AUTH_NONE = 1,
87     VNC_AUTH_VNC = 2,
88     VNC_AUTH_RA2 = 5,
89     VNC_AUTH_RA2NE = 6,
90     VNC_AUTH_TIGHT = 16,
91     VNC_AUTH_ULTRA = 17,
92     VNC_AUTH_TLS = 18,
93     VNC_AUTH_VENCRYPT = 19
94 };
95
96 #if CONFIG_VNC_TLS
97 enum {
98     VNC_WIREMODE_CLEAR,
99     VNC_WIREMODE_TLS,
100 };
101
102 enum {
103     VNC_AUTH_VENCRYPT_PLAIN = 256,
104     VNC_AUTH_VENCRYPT_TLSNONE = 257,
105     VNC_AUTH_VENCRYPT_TLSVNC = 258,
106     VNC_AUTH_VENCRYPT_TLSPLAIN = 259,
107     VNC_AUTH_VENCRYPT_X509NONE = 260,
108     VNC_AUTH_VENCRYPT_X509VNC = 261,
109     VNC_AUTH_VENCRYPT_X509PLAIN = 262,
110 };
111
112 #if CONFIG_VNC_TLS
113 #define X509_CA_CERT_FILE "ca-cert.pem"
114 #define X509_CA_CRL_FILE "ca-crl.pem"
115 #define X509_SERVER_KEY_FILE "server-key.pem"
116 #define X509_SERVER_CERT_FILE "server-cert.pem"
117 #endif
118
119 #endif /* CONFIG_VNC_TLS */
120
121 struct VncState
122 {
123     QEMUTimer *timer;
124     int lsock;
125     int csock;
126     DisplayState *ds;
127     int need_update;
128     int width;
129     int height;
130     uint32_t dirty_row[VNC_MAX_HEIGHT][VNC_DIRTY_WORDS];
131     char *old_data;
132     int depth; /* internal VNC frame buffer byte per pixel */
133     int has_resize;
134     int has_hextile;
135     int has_pointer_type_change;
136     int absolute;
137     int last_x;
138     int last_y;
139
140     int major;
141     int minor;
142
143     char *display;
144     char *password;
145     int auth;
146 #if CONFIG_VNC_TLS
147     int subauth;
148     int x509verify;
149
150     char *x509cacert;
151     char *x509cacrl;
152     char *x509cert;
153     char *x509key;
154 #endif
155     char challenge[VNC_AUTH_CHALLENGE_SIZE];
156
157 #if CONFIG_VNC_TLS
158     int wiremode;
159     gnutls_session_t tls_session;
160 #endif
161
162     Buffer output;
163     Buffer input;
164     kbd_layout_t *kbd_layout;
165     /* current output mode information */
166     VncWritePixels *write_pixels;
167     VncSendHextileTile *send_hextile_tile;
168     int pix_bpp, pix_big_endian;
169     int red_shift, red_max, red_shift1;
170     int green_shift, green_max, green_shift1;
171     int blue_shift, blue_max, blue_shift1;
172
173     VncReadEvent *read_handler;
174     size_t read_handler_expect;
175     /* input */
176     uint8_t modifiers_state[256];
177 };
178
179 static VncState *vnc_state; /* needed for info vnc */
180
181 void do_info_vnc(void)
182 {
183     if (vnc_state == NULL)
184         term_printf("VNC server disabled\n");
185     else {
186         term_printf("VNC server active on: ");
187         term_print_filename(vnc_state->display);
188         term_printf("\n");
189
190         if (vnc_state->csock == -1)
191             term_printf("No client connected\n");
192         else
193             term_printf("Client connected\n");
194     }
195 }
196
197 /* TODO
198    1) Get the queue working for IO.
199    2) there is some weirdness when using the -S option (the screen is grey
200       and not totally invalidated
201    3) resolutions > 1024
202 */
203
204 static void vnc_write(VncState *vs, const void *data, size_t len);
205 static void vnc_write_u32(VncState *vs, uint32_t value);
206 static void vnc_write_s32(VncState *vs, int32_t value);
207 static void vnc_write_u16(VncState *vs, uint16_t value);
208 static void vnc_write_u8(VncState *vs, uint8_t value);
209 static void vnc_flush(VncState *vs);
210 static void vnc_update_client(void *opaque);
211 static void vnc_client_read(void *opaque);
212
213 static inline void vnc_set_bit(uint32_t *d, int k)
214 {
215     d[k >> 5] |= 1 << (k & 0x1f);
216 }
217
218 static inline void vnc_clear_bit(uint32_t *d, int k)
219 {
220     d[k >> 5] &= ~(1 << (k & 0x1f));
221 }
222
223 static inline void vnc_set_bits(uint32_t *d, int n, int nb_words)
224 {
225     int j;
226
227     j = 0;
228     while (n >= 32) {
229         d[j++] = -1;
230         n -= 32;
231     }
232     if (n > 0)
233         d[j++] = (1 << n) - 1;
234     while (j < nb_words)
235         d[j++] = 0;
236 }
237
238 static inline int vnc_get_bit(const uint32_t *d, int k)
239 {
240     return (d[k >> 5] >> (k & 0x1f)) & 1;
241 }
242
243 static inline int vnc_and_bits(const uint32_t *d1, const uint32_t *d2,
244                                int nb_words)
245 {
246     int i;
247     for(i = 0; i < nb_words; i++) {
248         if ((d1[i] & d2[i]) != 0)
249             return 1;
250     }
251     return 0;
252 }
253
254 static void vnc_dpy_update(DisplayState *ds, int x, int y, int w, int h)
255 {
256     VncState *vs = ds->opaque;
257     int i;
258
259     h += y;
260
261     /* round x down to ensure the loop only spans one 16-pixel block per,
262        iteration.  otherwise, if (x % 16) != 0, the last iteration may span
263        two 16-pixel blocks but we only mark the first as dirty
264     */
265     w += (x % 16);
266     x -= (x % 16);
267
268     x = MIN(x, vs->width);
269     y = MIN(y, vs->height);
270     w = MIN(x + w, vs->width) - x;
271     h = MIN(y + h, vs->height) - y;
272
273     for (; y < h; y++)
274         for (i = 0; i < w; i += 16)
275             vnc_set_bit(vs->dirty_row[y], (x + i) / 16);
276 }
277
278 static void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
279                                    int32_t encoding)
280 {
281     vnc_write_u16(vs, x);
282     vnc_write_u16(vs, y);
283     vnc_write_u16(vs, w);
284     vnc_write_u16(vs, h);
285
286     vnc_write_s32(vs, encoding);
287 }
288
289 static void vnc_dpy_resize(DisplayState *ds, int w, int h)
290 {
291     int size_changed;
292     VncState *vs = ds->opaque;
293
294     ds->data = realloc(ds->data, w * h * vs->depth);
295     vs->old_data = realloc(vs->old_data, w * h * vs->depth);
296
297     if (ds->data == NULL || vs->old_data == NULL) {
298         fprintf(stderr, "vnc: memory allocation failed\n");
299         exit(1);
300     }
301
302     if (ds->depth != vs->depth * 8) {
303         ds->depth = vs->depth * 8;
304         console_color_init(ds);
305     }
306     size_changed = ds->width != w || ds->height != h;
307     ds->width = w;
308     ds->height = h;
309     ds->linesize = w * vs->depth;
310     if (vs->csock != -1 && vs->has_resize && size_changed) {
311         vnc_write_u8(vs, 0);  /* msg id */
312         vnc_write_u8(vs, 0);
313         vnc_write_u16(vs, 1); /* number of rects */
314         vnc_framebuffer_update(vs, 0, 0, ds->width, ds->height, -223);
315         vnc_flush(vs);
316         vs->width = ds->width;
317         vs->height = ds->height;
318     }
319
320     memset(vs->dirty_row, 0xFF, sizeof(vs->dirty_row));
321     memset(vs->old_data, 42, vs->ds->linesize * vs->ds->height);
322 }
323
324 /* fastest code */
325 static void vnc_write_pixels_copy(VncState *vs, void *pixels, int size)
326 {
327     vnc_write(vs, pixels, size);
328 }
329
330 /* slowest but generic code. */
331 static void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v)
332 {
333     unsigned int r, g, b;
334
335     r = (v >> vs->red_shift1) & vs->red_max;
336     g = (v >> vs->green_shift1) & vs->green_max;
337     b = (v >> vs->blue_shift1) & vs->blue_max;
338     v = (r << vs->red_shift) |
339         (g << vs->green_shift) |
340         (b << vs->blue_shift);
341     switch(vs->pix_bpp) {
342     case 1:
343         buf[0] = v;
344         break;
345     case 2:
346         if (vs->pix_big_endian) {
347             buf[0] = v >> 8;
348             buf[1] = v;
349         } else {
350             buf[1] = v >> 8;
351             buf[0] = v;
352         }
353         break;
354     default:
355     case 4:
356         if (vs->pix_big_endian) {
357             buf[0] = v >> 24;
358             buf[1] = v >> 16;
359             buf[2] = v >> 8;
360             buf[3] = v;
361         } else {
362             buf[3] = v >> 24;
363             buf[2] = v >> 16;
364             buf[1] = v >> 8;
365             buf[0] = v;
366         }
367         break;
368     }
369 }
370
371 static void vnc_write_pixels_generic(VncState *vs, void *pixels1, int size)
372 {
373     uint32_t *pixels = pixels1;
374     uint8_t buf[4];
375     int n, i;
376
377     n = size >> 2;
378     for(i = 0; i < n; i++) {
379         vnc_convert_pixel(vs, buf, pixels[i]);
380         vnc_write(vs, buf, vs->pix_bpp);
381     }
382 }
383
384 static void send_framebuffer_update_raw(VncState *vs, int x, int y, int w, int h)
385 {
386     int i;
387     uint8_t *row;
388
389     vnc_framebuffer_update(vs, x, y, w, h, 0);
390
391     row = vs->ds->data + y * vs->ds->linesize + x * vs->depth;
392     for (i = 0; i < h; i++) {
393         vs->write_pixels(vs, row, w * vs->depth);
394         row += vs->ds->linesize;
395     }
396 }
397
398 static void hextile_enc_cord(uint8_t *ptr, int x, int y, int w, int h)
399 {
400     ptr[0] = ((x & 0x0F) << 4) | (y & 0x0F);
401     ptr[1] = (((w - 1) & 0x0F) << 4) | ((h - 1) & 0x0F);
402 }
403
404 #define BPP 8
405 #include "vnchextile.h"
406 #undef BPP
407
408 #define BPP 16
409 #include "vnchextile.h"
410 #undef BPP
411
412 #define BPP 32
413 #include "vnchextile.h"
414 #undef BPP
415
416 #define GENERIC
417 #define BPP 32
418 #include "vnchextile.h"
419 #undef BPP
420 #undef GENERIC
421
422 static void send_framebuffer_update_hextile(VncState *vs, int x, int y, int w, int h)
423 {
424     int i, j;
425     int has_fg, has_bg;
426     uint32_t last_fg32, last_bg32;
427
428     vnc_framebuffer_update(vs, x, y, w, h, 5);
429
430     has_fg = has_bg = 0;
431     for (j = y; j < (y + h); j += 16) {
432         for (i = x; i < (x + w); i += 16) {
433             vs->send_hextile_tile(vs, i, j,
434                                   MIN(16, x + w - i), MIN(16, y + h - j),
435                                   &last_bg32, &last_fg32, &has_bg, &has_fg);
436         }
437     }
438 }
439
440 static void send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
441 {
442         if (vs->has_hextile)
443             send_framebuffer_update_hextile(vs, x, y, w, h);
444         else
445             send_framebuffer_update_raw(vs, x, y, w, h);
446 }
447
448 static void vnc_copy(DisplayState *ds, int src_x, int src_y, int dst_x, int dst_y, int w, int h)
449 {
450     int src, dst;
451     uint8_t *src_row;
452     uint8_t *dst_row;
453     char *old_row;
454     int y = 0;
455     int pitch = ds->linesize;
456     VncState *vs = ds->opaque;
457
458     vnc_update_client(vs);
459
460     if (dst_y > src_y) {
461         y = h - 1;
462         pitch = -pitch;
463     }
464
465     src = (ds->linesize * (src_y + y) + vs->depth * src_x);
466     dst = (ds->linesize * (dst_y + y) + vs->depth * dst_x);
467
468     src_row = ds->data + src;
469     dst_row = ds->data + dst;
470     old_row = vs->old_data + dst;
471
472     for (y = 0; y < h; y++) {
473         memmove(old_row, src_row, w * vs->depth);
474         memmove(dst_row, src_row, w * vs->depth);
475         src_row += pitch;
476         dst_row += pitch;
477         old_row += pitch;
478     }
479
480     vnc_write_u8(vs, 0);  /* msg id */
481     vnc_write_u8(vs, 0);
482     vnc_write_u16(vs, 1); /* number of rects */
483     vnc_framebuffer_update(vs, dst_x, dst_y, w, h, 1);
484     vnc_write_u16(vs, src_x);
485     vnc_write_u16(vs, src_y);
486     vnc_flush(vs);
487 }
488
489 static int find_dirty_height(VncState *vs, int y, int last_x, int x)
490 {
491     int h;
492
493     for (h = 1; h < (vs->height - y); h++) {
494         int tmp_x;
495         if (!vnc_get_bit(vs->dirty_row[y + h], last_x))
496             break;
497         for (tmp_x = last_x; tmp_x < x; tmp_x++)
498             vnc_clear_bit(vs->dirty_row[y + h], tmp_x);
499     }
500
501     return h;
502 }
503
504 static void vnc_update_client(void *opaque)
505 {
506     VncState *vs = opaque;
507
508     if (vs->need_update && vs->csock != -1) {
509         int y;
510         uint8_t *row;
511         char *old_row;
512         uint32_t width_mask[VNC_DIRTY_WORDS];
513         int n_rectangles;
514         int saved_offset;
515         int has_dirty = 0;
516
517         vga_hw_update();
518
519         vnc_set_bits(width_mask, (vs->width / 16), VNC_DIRTY_WORDS);
520
521         /* Walk through the dirty map and eliminate tiles that
522            really aren't dirty */
523         row = vs->ds->data;
524         old_row = vs->old_data;
525
526         for (y = 0; y < vs->height; y++) {
527             if (vnc_and_bits(vs->dirty_row[y], width_mask, VNC_DIRTY_WORDS)) {
528                 int x;
529                 uint8_t *ptr;
530                 char *old_ptr;
531
532                 ptr = row;
533                 old_ptr = (char*)old_row;
534
535                 for (x = 0; x < vs->ds->width; x += 16) {
536                     if (memcmp(old_ptr, ptr, 16 * vs->depth) == 0) {
537                         vnc_clear_bit(vs->dirty_row[y], (x / 16));
538                     } else {
539                         has_dirty = 1;
540                         memcpy(old_ptr, ptr, 16 * vs->depth);
541                     }
542
543                     ptr += 16 * vs->depth;
544                     old_ptr += 16 * vs->depth;
545                 }
546             }
547
548             row += vs->ds->linesize;
549             old_row += vs->ds->linesize;
550         }
551
552         if (!has_dirty) {
553             qemu_mod_timer(vs->timer, qemu_get_clock(rt_clock) + VNC_REFRESH_INTERVAL);
554             return;
555         }
556
557         /* Count rectangles */
558         n_rectangles = 0;
559         vnc_write_u8(vs, 0);  /* msg id */
560         vnc_write_u8(vs, 0);
561         saved_offset = vs->output.offset;
562         vnc_write_u16(vs, 0);
563
564         for (y = 0; y < vs->height; y++) {
565             int x;
566             int last_x = -1;
567             for (x = 0; x < vs->width / 16; x++) {
568                 if (vnc_get_bit(vs->dirty_row[y], x)) {
569                     if (last_x == -1) {
570                         last_x = x;
571                     }
572                     vnc_clear_bit(vs->dirty_row[y], x);
573                 } else {
574                     if (last_x != -1) {
575                         int h = find_dirty_height(vs, y, last_x, x);
576                         send_framebuffer_update(vs, last_x * 16, y, (x - last_x) * 16, h);
577                         n_rectangles++;
578                     }
579                     last_x = -1;
580                 }
581             }
582             if (last_x != -1) {
583                 int h = find_dirty_height(vs, y, last_x, x);
584                 send_framebuffer_update(vs, last_x * 16, y, (x - last_x) * 16, h);
585                 n_rectangles++;
586             }
587         }
588         vs->output.buffer[saved_offset] = (n_rectangles >> 8) & 0xFF;
589         vs->output.buffer[saved_offset + 1] = n_rectangles & 0xFF;
590         vnc_flush(vs);
591
592     }
593
594     if (vs->csock != -1) {
595         qemu_mod_timer(vs->timer, qemu_get_clock(rt_clock) + VNC_REFRESH_INTERVAL);
596     }
597
598 }
599
600 static int vnc_listen_poll(void *opaque)
601 {
602     VncState *vs = opaque;
603     if (vs->csock == -1)
604         return 1;
605     return 0;
606 }
607
608 static void buffer_reserve(Buffer *buffer, size_t len)
609 {
610     if ((buffer->capacity - buffer->offset) < len) {
611         buffer->capacity += (len + 1024);
612         buffer->buffer = realloc(buffer->buffer, buffer->capacity);
613         if (buffer->buffer == NULL) {
614             fprintf(stderr, "vnc: out of memory\n");
615             exit(1);
616         }
617     }
618 }
619
620 static int buffer_empty(Buffer *buffer)
621 {
622     return buffer->offset == 0;
623 }
624
625 static uint8_t *buffer_end(Buffer *buffer)
626 {
627     return buffer->buffer + buffer->offset;
628 }
629
630 static void buffer_reset(Buffer *buffer)
631 {
632         buffer->offset = 0;
633 }
634
635 static void buffer_append(Buffer *buffer, const void *data, size_t len)
636 {
637     memcpy(buffer->buffer + buffer->offset, data, len);
638     buffer->offset += len;
639 }
640
641 static int vnc_client_io_error(VncState *vs, int ret, int last_errno)
642 {
643     if (ret == 0 || ret == -1) {
644         if (ret == -1) {
645             switch (last_errno) {
646                 case EINTR:
647                 case EAGAIN:
648 #ifdef _WIN32
649                 case WSAEWOULDBLOCK:
650 #endif
651                     return 0;
652                 default:
653                     break;
654             }
655         }
656
657         VNC_DEBUG("Closing down client sock %d %d\n", ret, ret < 0 ? last_errno : 0);
658         qemu_set_fd_handler2(vs->csock, NULL, NULL, NULL, NULL);
659         closesocket(vs->csock);
660         vs->csock = -1;
661         buffer_reset(&vs->input);
662         buffer_reset(&vs->output);
663         vs->need_update = 0;
664 #if CONFIG_VNC_TLS
665         if (vs->tls_session) {
666             gnutls_deinit(vs->tls_session);
667             vs->tls_session = NULL;
668         }
669         vs->wiremode = VNC_WIREMODE_CLEAR;
670 #endif /* CONFIG_VNC_TLS */
671         return 0;
672     }
673     return ret;
674 }
675
676 static void vnc_client_error(VncState *vs)
677 {
678     vnc_client_io_error(vs, -1, EINVAL);
679 }
680
681 static void vnc_client_write(void *opaque)
682 {
683     long ret;
684     VncState *vs = opaque;
685
686 #if CONFIG_VNC_TLS
687     if (vs->tls_session) {
688         ret = gnutls_write(vs->tls_session, vs->output.buffer, vs->output.offset);
689         if (ret < 0) {
690             if (ret == GNUTLS_E_AGAIN)
691                 errno = EAGAIN;
692             else
693                 errno = EIO;
694             ret = -1;
695         }
696     } else
697 #endif /* CONFIG_VNC_TLS */
698         ret = send(vs->csock, vs->output.buffer, vs->output.offset, 0);
699     ret = vnc_client_io_error(vs, ret, socket_error());
700     if (!ret)
701         return;
702
703     memmove(vs->output.buffer, vs->output.buffer + ret, (vs->output.offset - ret));
704     vs->output.offset -= ret;
705
706     if (vs->output.offset == 0) {
707         qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, vs);
708     }
709 }
710
711 static void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting)
712 {
713     vs->read_handler = func;
714     vs->read_handler_expect = expecting;
715 }
716
717 static void vnc_client_read(void *opaque)
718 {
719     VncState *vs = opaque;
720     long ret;
721
722     buffer_reserve(&vs->input, 4096);
723
724 #if CONFIG_VNC_TLS
725     if (vs->tls_session) {
726         ret = gnutls_read(vs->tls_session, buffer_end(&vs->input), 4096);
727         if (ret < 0) {
728             if (ret == GNUTLS_E_AGAIN)
729                 errno = EAGAIN;
730             else
731                 errno = EIO;
732             ret = -1;
733         }
734     } else
735 #endif /* CONFIG_VNC_TLS */
736         ret = recv(vs->csock, buffer_end(&vs->input), 4096, 0);
737     ret = vnc_client_io_error(vs, ret, socket_error());
738     if (!ret)
739         return;
740
741     vs->input.offset += ret;
742
743     while (vs->read_handler && vs->input.offset >= vs->read_handler_expect) {
744         size_t len = vs->read_handler_expect;
745         int ret;
746
747         ret = vs->read_handler(vs, vs->input.buffer, len);
748         if (vs->csock == -1)
749             return;
750
751         if (!ret) {
752             memmove(vs->input.buffer, vs->input.buffer + len, (vs->input.offset - len));
753             vs->input.offset -= len;
754         } else {
755             vs->read_handler_expect = ret;
756         }
757     }
758 }
759
760 static void vnc_write(VncState *vs, const void *data, size_t len)
761 {
762     buffer_reserve(&vs->output, len);
763
764     if (buffer_empty(&vs->output)) {
765         qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, vnc_client_write, vs);
766     }
767
768     buffer_append(&vs->output, data, len);
769 }
770
771 static void vnc_write_s32(VncState *vs, int32_t value)
772 {
773     vnc_write_u32(vs, *(uint32_t *)&value);
774 }
775
776 static void vnc_write_u32(VncState *vs, uint32_t value)
777 {
778     uint8_t buf[4];
779
780     buf[0] = (value >> 24) & 0xFF;
781     buf[1] = (value >> 16) & 0xFF;
782     buf[2] = (value >>  8) & 0xFF;
783     buf[3] = value & 0xFF;
784
785     vnc_write(vs, buf, 4);
786 }
787
788 static void vnc_write_u16(VncState *vs, uint16_t value)
789 {
790     uint8_t buf[2];
791
792     buf[0] = (value >> 8) & 0xFF;
793     buf[1] = value & 0xFF;
794
795     vnc_write(vs, buf, 2);
796 }
797
798 static void vnc_write_u8(VncState *vs, uint8_t value)
799 {
800     vnc_write(vs, (char *)&value, 1);
801 }
802
803 static void vnc_flush(VncState *vs)
804 {
805     if (vs->output.offset)
806         vnc_client_write(vs);
807 }
808
809 static uint8_t read_u8(uint8_t *data, size_t offset)
810 {
811     return data[offset];
812 }
813
814 static uint16_t read_u16(uint8_t *data, size_t offset)
815 {
816     return ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF);
817 }
818
819 static int32_t read_s32(uint8_t *data, size_t offset)
820 {
821     return (int32_t)((data[offset] << 24) | (data[offset + 1] << 16) |
822                      (data[offset + 2] << 8) | data[offset + 3]);
823 }
824
825 static uint32_t read_u32(uint8_t *data, size_t offset)
826 {
827     return ((data[offset] << 24) | (data[offset + 1] << 16) |
828             (data[offset + 2] << 8) | data[offset + 3]);
829 }
830
831 #if CONFIG_VNC_TLS
832 static ssize_t vnc_tls_push(gnutls_transport_ptr_t transport,
833                             const void *data,
834                             size_t len) {
835     struct VncState *vs = (struct VncState *)transport;
836     int ret;
837
838  retry:
839     ret = send(vs->csock, data, len, 0);
840     if (ret < 0) {
841         if (errno == EINTR)
842             goto retry;
843         return -1;
844     }
845     return ret;
846 }
847
848
849 static ssize_t vnc_tls_pull(gnutls_transport_ptr_t transport,
850                             void *data,
851                             size_t len) {
852     struct VncState *vs = (struct VncState *)transport;
853     int ret;
854
855  retry:
856     ret = recv(vs->csock, data, len, 0);
857     if (ret < 0) {
858         if (errno == EINTR)
859             goto retry;
860         return -1;
861     }
862     return ret;
863 }
864 #endif /* CONFIG_VNC_TLS */
865
866 static void client_cut_text(VncState *vs, size_t len, uint8_t *text)
867 {
868 }
869
870 static void check_pointer_type_change(VncState *vs, int absolute)
871 {
872     if (vs->has_pointer_type_change && vs->absolute != absolute) {
873         vnc_write_u8(vs, 0);
874         vnc_write_u8(vs, 0);
875         vnc_write_u16(vs, 1);
876         vnc_framebuffer_update(vs, absolute, 0,
877                                vs->ds->width, vs->ds->height, -257);
878         vnc_flush(vs);
879     }
880     vs->absolute = absolute;
881 }
882
883 static void pointer_event(VncState *vs, int button_mask, int x, int y)
884 {
885     int buttons = 0;
886     int dz = 0;
887
888     if (button_mask & 0x01)
889         buttons |= MOUSE_EVENT_LBUTTON;
890     if (button_mask & 0x02)
891         buttons |= MOUSE_EVENT_MBUTTON;
892     if (button_mask & 0x04)
893         buttons |= MOUSE_EVENT_RBUTTON;
894     if (button_mask & 0x08)
895         dz = -1;
896     if (button_mask & 0x10)
897         dz = 1;
898
899     if (vs->absolute) {
900         kbd_mouse_event(x * 0x7FFF / (vs->ds->width - 1),
901                         y * 0x7FFF / (vs->ds->height - 1),
902                         dz, buttons);
903     } else if (vs->has_pointer_type_change) {
904         x -= 0x7FFF;
905         y -= 0x7FFF;
906
907         kbd_mouse_event(x, y, dz, buttons);
908     } else {
909         if (vs->last_x != -1)
910             kbd_mouse_event(x - vs->last_x,
911                             y - vs->last_y,
912                             dz, buttons);
913         vs->last_x = x;
914         vs->last_y = y;
915     }
916
917     check_pointer_type_change(vs, kbd_mouse_is_absolute());
918 }
919
920 static void reset_keys(VncState *vs)
921 {
922     int i;
923     for(i = 0; i < 256; i++) {
924         if (vs->modifiers_state[i]) {
925             if (i & 0x80)
926                 kbd_put_keycode(0xe0);
927             kbd_put_keycode(i | 0x80);
928             vs->modifiers_state[i] = 0;
929         }
930     }
931 }
932
933 static void press_key(VncState *vs, int keysym)
934 {
935     kbd_put_keycode(keysym2scancode(vs->kbd_layout, keysym) & 0x7f);
936     kbd_put_keycode(keysym2scancode(vs->kbd_layout, keysym) | 0x80);
937 }
938
939 static void do_key_event(VncState *vs, int down, uint32_t sym)
940 {
941     int keycode;
942
943     keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF);
944
945     /* QEMU console switch */
946     switch(keycode) {
947     case 0x2a:                          /* Left Shift */
948     case 0x36:                          /* Right Shift */
949     case 0x1d:                          /* Left CTRL */
950     case 0x9d:                          /* Right CTRL */
951     case 0x38:                          /* Left ALT */
952     case 0xb8:                          /* Right ALT */
953         if (down)
954             vs->modifiers_state[keycode] = 1;
955         else
956             vs->modifiers_state[keycode] = 0;
957         break;
958     case 0x02 ... 0x0a: /* '1' to '9' keys */
959         if (down && vs->modifiers_state[0x1d] && vs->modifiers_state[0x38]) {
960             /* Reset the modifiers sent to the current console */
961             reset_keys(vs);
962             console_select(keycode - 0x02);
963             return;
964         }
965         break;
966     case 0x3a:                  /* CapsLock */
967     case 0x45:                  /* NumLock */
968         if (!down)
969             vs->modifiers_state[keycode] ^= 1;
970         break;
971     }
972
973     if (keycode_is_keypad(vs->kbd_layout, keycode)) {
974         /* If the numlock state needs to change then simulate an additional
975            keypress before sending this one.  This will happen if the user
976            toggles numlock away from the VNC window.
977         */
978         if (keysym_is_numlock(vs->kbd_layout, sym & 0xFFFF)) {
979             if (!vs->modifiers_state[0x45]) {
980                 vs->modifiers_state[0x45] = 1;
981                 press_key(vs, 0xff7f);
982             }
983         } else {
984             if (vs->modifiers_state[0x45]) {
985                 vs->modifiers_state[0x45] = 0;
986                 press_key(vs, 0xff7f);
987             }
988         }
989     }
990
991     if (is_graphic_console()) {
992         if (keycode & 0x80)
993             kbd_put_keycode(0xe0);
994         if (down)
995             kbd_put_keycode(keycode & 0x7f);
996         else
997             kbd_put_keycode(keycode | 0x80);
998     } else {
999         /* QEMU console emulation */
1000         if (down) {
1001             switch (keycode) {
1002             case 0x2a:                          /* Left Shift */
1003             case 0x36:                          /* Right Shift */
1004             case 0x1d:                          /* Left CTRL */
1005             case 0x9d:                          /* Right CTRL */
1006             case 0x38:                          /* Left ALT */
1007             case 0xb8:                          /* Right ALT */
1008                 break;
1009             case 0xc8:
1010                 kbd_put_keysym(QEMU_KEY_UP);
1011                 break;
1012             case 0xd0:
1013                 kbd_put_keysym(QEMU_KEY_DOWN);
1014                 break;
1015             case 0xcb:
1016                 kbd_put_keysym(QEMU_KEY_LEFT);
1017                 break;
1018             case 0xcd:
1019                 kbd_put_keysym(QEMU_KEY_RIGHT);
1020                 break;
1021             case 0xd3:
1022                 kbd_put_keysym(QEMU_KEY_DELETE);
1023                 break;
1024             case 0xc7:
1025                 kbd_put_keysym(QEMU_KEY_HOME);
1026                 break;
1027             case 0xcf:
1028                 kbd_put_keysym(QEMU_KEY_END);
1029                 break;
1030             case 0xc9:
1031                 kbd_put_keysym(QEMU_KEY_PAGEUP);
1032                 break;
1033             case 0xd1:
1034                 kbd_put_keysym(QEMU_KEY_PAGEDOWN);
1035                 break;
1036             default:
1037                 kbd_put_keysym(sym);
1038                 break;
1039             }
1040         }
1041     }
1042 }
1043
1044 static void key_event(VncState *vs, int down, uint32_t sym)
1045 {
1046     if (sym >= 'A' && sym <= 'Z' && is_graphic_console())
1047         sym = sym - 'A' + 'a';
1048     do_key_event(vs, down, sym);
1049 }
1050
1051 static void framebuffer_update_request(VncState *vs, int incremental,
1052                                        int x_position, int y_position,
1053                                        int w, int h)
1054 {
1055     if (x_position > vs->ds->width)
1056         x_position = vs->ds->width;
1057     if (y_position > vs->ds->height)
1058         y_position = vs->ds->height;
1059     if (x_position + w >= vs->ds->width)
1060         w = vs->ds->width  - x_position;
1061     if (y_position + h >= vs->ds->height)
1062         h = vs->ds->height - y_position;
1063
1064     int i;
1065     vs->need_update = 1;
1066     if (!incremental) {
1067         char *old_row = vs->old_data + y_position * vs->ds->linesize;
1068
1069         for (i = 0; i < h; i++) {
1070             vnc_set_bits(vs->dirty_row[y_position + i],
1071                          (vs->ds->width / 16), VNC_DIRTY_WORDS);
1072             memset(old_row, 42, vs->ds->width * vs->depth);
1073             old_row += vs->ds->linesize;
1074         }
1075     }
1076 }
1077
1078 static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
1079 {
1080     int i;
1081
1082     vs->has_hextile = 0;
1083     vs->has_resize = 0;
1084     vs->has_pointer_type_change = 0;
1085     vs->absolute = -1;
1086     vs->ds->dpy_copy = NULL;
1087
1088     for (i = n_encodings - 1; i >= 0; i--) {
1089         switch (encodings[i]) {
1090         case 0: /* Raw */
1091             vs->has_hextile = 0;
1092             break;
1093         case 1: /* CopyRect */
1094             vs->ds->dpy_copy = vnc_copy;
1095             break;
1096         case 5: /* Hextile */
1097             vs->has_hextile = 1;
1098             break;
1099         case -223: /* DesktopResize */
1100             vs->has_resize = 1;
1101             break;
1102         case -257:
1103             vs->has_pointer_type_change = 1;
1104             break;
1105         default:
1106             break;
1107         }
1108     }
1109
1110     check_pointer_type_change(vs, kbd_mouse_is_absolute());
1111 }
1112
1113 static int compute_nbits(unsigned int val)
1114 {
1115     int n;
1116     n = 0;
1117     while (val != 0) {
1118         n++;
1119         val >>= 1;
1120     }
1121     return n;
1122 }
1123
1124 static void set_pixel_format(VncState *vs,
1125                              int bits_per_pixel, int depth,
1126                              int big_endian_flag, int true_color_flag,
1127                              int red_max, int green_max, int blue_max,
1128                              int red_shift, int green_shift, int blue_shift)
1129 {
1130     int host_big_endian_flag;
1131
1132 #ifdef WORDS_BIGENDIAN
1133     host_big_endian_flag = 1;
1134 #else
1135     host_big_endian_flag = 0;
1136 #endif
1137     if (!true_color_flag) {
1138     fail:
1139         vnc_client_error(vs);
1140         return;
1141     }
1142     if (bits_per_pixel == 32 &&
1143         host_big_endian_flag == big_endian_flag &&
1144         red_max == 0xff && green_max == 0xff && blue_max == 0xff &&
1145         red_shift == 16 && green_shift == 8 && blue_shift == 0) {
1146         vs->depth = 4;
1147         vs->write_pixels = vnc_write_pixels_copy;
1148         vs->send_hextile_tile = send_hextile_tile_32;
1149     } else
1150     if (bits_per_pixel == 16 &&
1151         host_big_endian_flag == big_endian_flag &&
1152         red_max == 31 && green_max == 63 && blue_max == 31 &&
1153         red_shift == 11 && green_shift == 5 && blue_shift == 0) {
1154         vs->depth = 2;
1155         vs->write_pixels = vnc_write_pixels_copy;
1156         vs->send_hextile_tile = send_hextile_tile_16;
1157     } else
1158     if (bits_per_pixel == 8 &&
1159         red_max == 7 && green_max == 7 && blue_max == 3 &&
1160         red_shift == 5 && green_shift == 2 && blue_shift == 0) {
1161         vs->depth = 1;
1162         vs->write_pixels = vnc_write_pixels_copy;
1163         vs->send_hextile_tile = send_hextile_tile_8;
1164     } else
1165     {
1166         /* generic and slower case */
1167         if (bits_per_pixel != 8 &&
1168             bits_per_pixel != 16 &&
1169             bits_per_pixel != 32)
1170             goto fail;
1171         vs->depth = 4;
1172         vs->red_shift = red_shift;
1173         vs->red_max = red_max;
1174         vs->red_shift1 = 24 - compute_nbits(red_max);
1175         vs->green_shift = green_shift;
1176         vs->green_max = green_max;
1177         vs->green_shift1 = 16 - compute_nbits(green_max);
1178         vs->blue_shift = blue_shift;
1179         vs->blue_max = blue_max;
1180         vs->blue_shift1 = 8 - compute_nbits(blue_max);
1181         vs->pix_bpp = bits_per_pixel / 8;
1182         vs->pix_big_endian = big_endian_flag;
1183         vs->write_pixels = vnc_write_pixels_generic;
1184         vs->send_hextile_tile = send_hextile_tile_generic;
1185     }
1186
1187     vnc_dpy_resize(vs->ds, vs->ds->width, vs->ds->height);
1188
1189     vga_hw_invalidate();
1190     vga_hw_update();
1191 }
1192
1193 static int protocol_client_msg(VncState *vs, uint8_t *data, size_t len)
1194 {
1195     int i;
1196     uint16_t limit;
1197
1198     switch (data[0]) {
1199     case 0:
1200         if (len == 1)
1201             return 20;
1202
1203         set_pixel_format(vs, read_u8(data, 4), read_u8(data, 5),
1204                          read_u8(data, 6), read_u8(data, 7),
1205                          read_u16(data, 8), read_u16(data, 10),
1206                          read_u16(data, 12), read_u8(data, 14),
1207                          read_u8(data, 15), read_u8(data, 16));
1208         break;
1209     case 2:
1210         if (len == 1)
1211             return 4;
1212
1213         if (len == 4)
1214             return 4 + (read_u16(data, 2) * 4);
1215
1216         limit = read_u16(data, 2);
1217         for (i = 0; i < limit; i++) {
1218             int32_t val = read_s32(data, 4 + (i * 4));
1219             memcpy(data + 4 + (i * 4), &val, sizeof(val));
1220         }
1221
1222         set_encodings(vs, (int32_t *)(data + 4), limit);
1223         break;
1224     case 3:
1225         if (len == 1)
1226             return 10;
1227
1228         framebuffer_update_request(vs,
1229                                    read_u8(data, 1), read_u16(data, 2), read_u16(data, 4),
1230                                    read_u16(data, 6), read_u16(data, 8));
1231         break;
1232     case 4:
1233         if (len == 1)
1234             return 8;
1235
1236         key_event(vs, read_u8(data, 1), read_u32(data, 4));
1237         break;
1238     case 5:
1239         if (len == 1)
1240             return 6;
1241
1242         pointer_event(vs, read_u8(data, 1), read_u16(data, 2), read_u16(data, 4));
1243         break;
1244     case 6:
1245         if (len == 1)
1246             return 8;
1247
1248         if (len == 8) {
1249             uint32_t dlen = read_u32(data, 4);
1250             if (dlen > 0)
1251                 return 8 + dlen;
1252         }
1253
1254         client_cut_text(vs, read_u32(data, 4), data + 8);
1255         break;
1256     default:
1257         printf("Msg: %d\n", data[0]);
1258         vnc_client_error(vs);
1259         break;
1260     }
1261
1262     vnc_read_when(vs, protocol_client_msg, 1);
1263     return 0;
1264 }
1265
1266 static int protocol_client_init(VncState *vs, uint8_t *data, size_t len)
1267 {
1268     char pad[3] = { 0, 0, 0 };
1269     char buf[1024];
1270     int size;
1271
1272     vs->width = vs->ds->width;
1273     vs->height = vs->ds->height;
1274     vnc_write_u16(vs, vs->ds->width);
1275     vnc_write_u16(vs, vs->ds->height);
1276
1277     vnc_write_u8(vs, vs->depth * 8); /* bits-per-pixel */
1278     vnc_write_u8(vs, vs->depth * 8); /* depth */
1279 #ifdef WORDS_BIGENDIAN
1280     vnc_write_u8(vs, 1);             /* big-endian-flag */
1281 #else
1282     vnc_write_u8(vs, 0);             /* big-endian-flag */
1283 #endif
1284     vnc_write_u8(vs, 1);             /* true-color-flag */
1285     if (vs->depth == 4) {
1286         vnc_write_u16(vs, 0xFF);     /* red-max */
1287         vnc_write_u16(vs, 0xFF);     /* green-max */
1288         vnc_write_u16(vs, 0xFF);     /* blue-max */
1289         vnc_write_u8(vs, 16);        /* red-shift */
1290         vnc_write_u8(vs, 8);         /* green-shift */
1291         vnc_write_u8(vs, 0);         /* blue-shift */
1292         vs->send_hextile_tile = send_hextile_tile_32;
1293     } else if (vs->depth == 2) {
1294         vnc_write_u16(vs, 31);       /* red-max */
1295         vnc_write_u16(vs, 63);       /* green-max */
1296         vnc_write_u16(vs, 31);       /* blue-max */
1297         vnc_write_u8(vs, 11);        /* red-shift */
1298         vnc_write_u8(vs, 5);         /* green-shift */
1299         vnc_write_u8(vs, 0);         /* blue-shift */
1300         vs->send_hextile_tile = send_hextile_tile_16;
1301     } else if (vs->depth == 1) {
1302         /* XXX: change QEMU pixel 8 bit pixel format to match the VNC one ? */
1303         vnc_write_u16(vs, 7);        /* red-max */
1304         vnc_write_u16(vs, 7);        /* green-max */
1305         vnc_write_u16(vs, 3);        /* blue-max */
1306         vnc_write_u8(vs, 5);         /* red-shift */
1307         vnc_write_u8(vs, 2);         /* green-shift */
1308         vnc_write_u8(vs, 0);         /* blue-shift */
1309         vs->send_hextile_tile = send_hextile_tile_8;
1310     }
1311     vs->write_pixels = vnc_write_pixels_copy;
1312
1313     vnc_write(vs, pad, 3);           /* padding */
1314
1315     if (qemu_name)
1316         size = snprintf(buf, sizeof(buf), "QEMU (%s)", qemu_name);
1317     else
1318         size = snprintf(buf, sizeof(buf), "QEMU");
1319
1320     vnc_write_u32(vs, size);
1321     vnc_write(vs, buf, size);
1322     vnc_flush(vs);
1323
1324     vnc_read_when(vs, protocol_client_msg, 1);
1325
1326     return 0;
1327 }
1328
1329 static void make_challenge(VncState *vs)
1330 {
1331     int i;
1332
1333     srand(time(NULL)+getpid()+getpid()*987654+rand());
1334
1335     for (i = 0 ; i < sizeof(vs->challenge) ; i++)
1336         vs->challenge[i] = (int) (256.0*rand()/(RAND_MAX+1.0));
1337 }
1338
1339 static int protocol_client_auth_vnc(VncState *vs, uint8_t *data, size_t len)
1340 {
1341     unsigned char response[VNC_AUTH_CHALLENGE_SIZE];
1342     int i, j, pwlen;
1343     unsigned char key[8];
1344
1345     if (!vs->password || !vs->password[0]) {
1346         VNC_DEBUG("No password configured on server");
1347         vnc_write_u32(vs, 1); /* Reject auth */
1348         if (vs->minor >= 8) {
1349             static const char err[] = "Authentication failed";
1350             vnc_write_u32(vs, sizeof(err));
1351             vnc_write(vs, err, sizeof(err));
1352         }
1353         vnc_flush(vs);
1354         vnc_client_error(vs);
1355         return 0;
1356     }
1357
1358     memcpy(response, vs->challenge, VNC_AUTH_CHALLENGE_SIZE);
1359
1360     /* Calculate the expected challenge response */
1361     pwlen = strlen(vs->password);
1362     for (i=0; i<sizeof(key); i++)
1363         key[i] = i<pwlen ? vs->password[i] : 0;
1364     deskey(key, EN0);
1365     for (j = 0; j < VNC_AUTH_CHALLENGE_SIZE; j += 8)
1366         des(response+j, response+j);
1367
1368     /* Compare expected vs actual challenge response */
1369     if (memcmp(response, data, VNC_AUTH_CHALLENGE_SIZE) != 0) {
1370         VNC_DEBUG("Client challenge reponse did not match\n");
1371         vnc_write_u32(vs, 1); /* Reject auth */
1372         if (vs->minor >= 8) {
1373             static const char err[] = "Authentication failed";
1374             vnc_write_u32(vs, sizeof(err));
1375             vnc_write(vs, err, sizeof(err));
1376         }
1377         vnc_flush(vs);
1378         vnc_client_error(vs);
1379     } else {
1380         VNC_DEBUG("Accepting VNC challenge response\n");
1381         vnc_write_u32(vs, 0); /* Accept auth */
1382         vnc_flush(vs);
1383
1384         vnc_read_when(vs, protocol_client_init, 1);
1385     }
1386     return 0;
1387 }
1388
1389 static int start_auth_vnc(VncState *vs)
1390 {
1391     make_challenge(vs);
1392     /* Send client a 'random' challenge */
1393     vnc_write(vs, vs->challenge, sizeof(vs->challenge));
1394     vnc_flush(vs);
1395
1396     vnc_read_when(vs, protocol_client_auth_vnc, sizeof(vs->challenge));
1397     return 0;
1398 }
1399
1400
1401 #if CONFIG_VNC_TLS
1402 #define DH_BITS 1024
1403 static gnutls_dh_params_t dh_params;
1404
1405 static int vnc_tls_initialize(void)
1406 {
1407     static int tlsinitialized = 0;
1408
1409     if (tlsinitialized)
1410         return 1;
1411
1412     if (gnutls_global_init () < 0)
1413         return 0;
1414
1415     /* XXX ought to re-generate diffie-hellmen params periodically */
1416     if (gnutls_dh_params_init (&dh_params) < 0)
1417         return 0;
1418     if (gnutls_dh_params_generate2 (dh_params, DH_BITS) < 0)
1419         return 0;
1420
1421 #if _VNC_DEBUG == 2
1422     gnutls_global_set_log_level(10);
1423     gnutls_global_set_log_function(vnc_debug_gnutls_log);
1424 #endif
1425
1426     tlsinitialized = 1;
1427
1428     return 1;
1429 }
1430
1431 static gnutls_anon_server_credentials vnc_tls_initialize_anon_cred(void)
1432 {
1433     gnutls_anon_server_credentials anon_cred;
1434     int ret;
1435
1436     if ((ret = gnutls_anon_allocate_server_credentials(&anon_cred)) < 0) {
1437         VNC_DEBUG("Cannot allocate credentials %s\n", gnutls_strerror(ret));
1438         return NULL;
1439     }
1440
1441     gnutls_anon_set_server_dh_params(anon_cred, dh_params);
1442
1443     return anon_cred;
1444 }
1445
1446
1447 static gnutls_certificate_credentials_t vnc_tls_initialize_x509_cred(VncState *vs)
1448 {
1449     gnutls_certificate_credentials_t x509_cred;
1450     int ret;
1451
1452     if (!vs->x509cacert) {
1453         VNC_DEBUG("No CA x509 certificate specified\n");
1454         return NULL;
1455     }
1456     if (!vs->x509cert) {
1457         VNC_DEBUG("No server x509 certificate specified\n");
1458         return NULL;
1459     }
1460     if (!vs->x509key) {
1461         VNC_DEBUG("No server private key specified\n");
1462         return NULL;
1463     }
1464
1465     if ((ret = gnutls_certificate_allocate_credentials(&x509_cred)) < 0) {
1466         VNC_DEBUG("Cannot allocate credentials %s\n", gnutls_strerror(ret));
1467         return NULL;
1468     }
1469     if ((ret = gnutls_certificate_set_x509_trust_file(x509_cred,
1470                                                       vs->x509cacert,
1471                                                       GNUTLS_X509_FMT_PEM)) < 0) {
1472         VNC_DEBUG("Cannot load CA certificate %s\n", gnutls_strerror(ret));
1473         gnutls_certificate_free_credentials(x509_cred);
1474         return NULL;
1475     }
1476
1477     if ((ret = gnutls_certificate_set_x509_key_file (x509_cred,
1478                                                      vs->x509cert,
1479                                                      vs->x509key,
1480                                                      GNUTLS_X509_FMT_PEM)) < 0) {
1481         VNC_DEBUG("Cannot load certificate & key %s\n", gnutls_strerror(ret));
1482         gnutls_certificate_free_credentials(x509_cred);
1483         return NULL;
1484     }
1485
1486     if (vs->x509cacrl) {
1487         if ((ret = gnutls_certificate_set_x509_crl_file(x509_cred,
1488                                                         vs->x509cacrl,
1489                                                         GNUTLS_X509_FMT_PEM)) < 0) {
1490             VNC_DEBUG("Cannot load CRL %s\n", gnutls_strerror(ret));
1491             gnutls_certificate_free_credentials(x509_cred);
1492             return NULL;
1493         }
1494     }
1495
1496     gnutls_certificate_set_dh_params (x509_cred, dh_params);
1497
1498     return x509_cred;
1499 }
1500
1501 static int vnc_validate_certificate(struct VncState *vs)
1502 {
1503     int ret;
1504     unsigned int status;
1505     const gnutls_datum_t *certs;
1506     unsigned int nCerts, i;
1507     time_t now;
1508
1509     VNC_DEBUG("Validating client certificate\n");
1510     if ((ret = gnutls_certificate_verify_peers2 (vs->tls_session, &status)) < 0) {
1511         VNC_DEBUG("Verify failed %s\n", gnutls_strerror(ret));
1512         return -1;
1513     }
1514
1515     if ((now = time(NULL)) == ((time_t)-1)) {
1516         return -1;
1517     }
1518
1519     if (status != 0) {
1520         if (status & GNUTLS_CERT_INVALID)
1521             VNC_DEBUG("The certificate is not trusted.\n");
1522
1523         if (status & GNUTLS_CERT_SIGNER_NOT_FOUND)
1524             VNC_DEBUG("The certificate hasn't got a known issuer.\n");
1525
1526         if (status & GNUTLS_CERT_REVOKED)
1527             VNC_DEBUG("The certificate has been revoked.\n");
1528
1529         if (status & GNUTLS_CERT_INSECURE_ALGORITHM)
1530             VNC_DEBUG("The certificate uses an insecure algorithm\n");
1531
1532         return -1;
1533     } else {
1534         VNC_DEBUG("Certificate is valid!\n");
1535     }
1536
1537     /* Only support x509 for now */
1538     if (gnutls_certificate_type_get(vs->tls_session) != GNUTLS_CRT_X509)
1539         return -1;
1540
1541     if (!(certs = gnutls_certificate_get_peers(vs->tls_session, &nCerts)))
1542         return -1;
1543
1544     for (i = 0 ; i < nCerts ; i++) {
1545         gnutls_x509_crt_t cert;
1546         VNC_DEBUG ("Checking certificate chain %d\n", i);
1547         if (gnutls_x509_crt_init (&cert) < 0)
1548             return -1;
1549
1550         if (gnutls_x509_crt_import(cert, &certs[i], GNUTLS_X509_FMT_DER) < 0) {
1551             gnutls_x509_crt_deinit (cert);
1552             return -1;
1553         }
1554
1555         if (gnutls_x509_crt_get_expiration_time (cert) < now) {
1556             VNC_DEBUG("The certificate has expired\n");
1557             gnutls_x509_crt_deinit (cert);
1558             return -1;
1559         }
1560
1561         if (gnutls_x509_crt_get_activation_time (cert) > now) {
1562             VNC_DEBUG("The certificate is not yet activated\n");
1563             gnutls_x509_crt_deinit (cert);
1564             return -1;
1565         }
1566
1567         if (gnutls_x509_crt_get_activation_time (cert) > now) {
1568             VNC_DEBUG("The certificate is not yet activated\n");
1569             gnutls_x509_crt_deinit (cert);
1570             return -1;
1571         }
1572
1573         gnutls_x509_crt_deinit (cert);
1574     }
1575
1576     return 0;
1577 }
1578
1579
1580 static int start_auth_vencrypt_subauth(VncState *vs)
1581 {
1582     switch (vs->subauth) {
1583     case VNC_AUTH_VENCRYPT_TLSNONE:
1584     case VNC_AUTH_VENCRYPT_X509NONE:
1585        VNC_DEBUG("Accept TLS auth none\n");
1586        vnc_write_u32(vs, 0); /* Accept auth completion */
1587        vnc_read_when(vs, protocol_client_init, 1);
1588        break;
1589
1590     case VNC_AUTH_VENCRYPT_TLSVNC:
1591     case VNC_AUTH_VENCRYPT_X509VNC:
1592        VNC_DEBUG("Start TLS auth VNC\n");
1593        return start_auth_vnc(vs);
1594
1595     default: /* Should not be possible, but just in case */
1596        VNC_DEBUG("Reject auth %d\n", vs->auth);
1597        vnc_write_u8(vs, 1);
1598        if (vs->minor >= 8) {
1599            static const char err[] = "Unsupported authentication type";
1600            vnc_write_u32(vs, sizeof(err));
1601            vnc_write(vs, err, sizeof(err));
1602        }
1603        vnc_client_error(vs);
1604     }
1605
1606     return 0;
1607 }
1608
1609 static void vnc_handshake_io(void *opaque);
1610
1611 static int vnc_continue_handshake(struct VncState *vs) {
1612     int ret;
1613
1614     if ((ret = gnutls_handshake(vs->tls_session)) < 0) {
1615        if (!gnutls_error_is_fatal(ret)) {
1616            VNC_DEBUG("Handshake interrupted (blocking)\n");
1617            if (!gnutls_record_get_direction(vs->tls_session))
1618                qemu_set_fd_handler(vs->csock, vnc_handshake_io, NULL, vs);
1619            else
1620                qemu_set_fd_handler(vs->csock, NULL, vnc_handshake_io, vs);
1621            return 0;
1622        }
1623        VNC_DEBUG("Handshake failed %s\n", gnutls_strerror(ret));
1624        vnc_client_error(vs);
1625        return -1;
1626     }
1627
1628     if (vs->x509verify) {
1629         if (vnc_validate_certificate(vs) < 0) {
1630             VNC_DEBUG("Client verification failed\n");
1631             vnc_client_error(vs);
1632             return -1;
1633         } else {
1634             VNC_DEBUG("Client verification passed\n");
1635         }
1636     }
1637
1638     VNC_DEBUG("Handshake done, switching to TLS data mode\n");
1639     vs->wiremode = VNC_WIREMODE_TLS;
1640     qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, vnc_client_write, vs);
1641
1642     return start_auth_vencrypt_subauth(vs);
1643 }
1644
1645 static void vnc_handshake_io(void *opaque) {
1646     struct VncState *vs = (struct VncState *)opaque;
1647
1648     VNC_DEBUG("Handshake IO continue\n");
1649     vnc_continue_handshake(vs);
1650 }
1651
1652 #define NEED_X509_AUTH(vs)                            \
1653     ((vs)->subauth == VNC_AUTH_VENCRYPT_X509NONE ||   \
1654      (vs)->subauth == VNC_AUTH_VENCRYPT_X509VNC ||    \
1655      (vs)->subauth == VNC_AUTH_VENCRYPT_X509PLAIN)
1656
1657
1658 static int vnc_start_tls(struct VncState *vs) {
1659     static const int cert_type_priority[] = { GNUTLS_CRT_X509, 0 };
1660     static const int protocol_priority[]= { GNUTLS_TLS1_1, GNUTLS_TLS1_0, GNUTLS_SSL3, 0 };
1661     static const int kx_anon[] = {GNUTLS_KX_ANON_DH, 0};
1662     static const int kx_x509[] = {GNUTLS_KX_DHE_DSS, GNUTLS_KX_RSA, GNUTLS_KX_DHE_RSA, GNUTLS_KX_SRP, 0};
1663
1664     VNC_DEBUG("Do TLS setup\n");
1665     if (vnc_tls_initialize() < 0) {
1666         VNC_DEBUG("Failed to init TLS\n");
1667         vnc_client_error(vs);
1668         return -1;
1669     }
1670     if (vs->tls_session == NULL) {
1671         if (gnutls_init(&vs->tls_session, GNUTLS_SERVER) < 0) {
1672             vnc_client_error(vs);
1673             return -1;
1674         }
1675
1676         if (gnutls_set_default_priority(vs->tls_session) < 0) {
1677             gnutls_deinit(vs->tls_session);
1678             vs->tls_session = NULL;
1679             vnc_client_error(vs);
1680             return -1;
1681         }
1682
1683         if (gnutls_kx_set_priority(vs->tls_session, NEED_X509_AUTH(vs) ? kx_x509 : kx_anon) < 0) {
1684             gnutls_deinit(vs->tls_session);
1685             vs->tls_session = NULL;
1686             vnc_client_error(vs);
1687             return -1;
1688         }
1689
1690         if (gnutls_certificate_type_set_priority(vs->tls_session, cert_type_priority) < 0) {
1691             gnutls_deinit(vs->tls_session);
1692             vs->tls_session = NULL;
1693             vnc_client_error(vs);
1694             return -1;
1695         }
1696
1697         if (gnutls_protocol_set_priority(vs->tls_session, protocol_priority) < 0) {
1698             gnutls_deinit(vs->tls_session);
1699             vs->tls_session = NULL;
1700             vnc_client_error(vs);
1701             return -1;
1702         }
1703
1704         if (NEED_X509_AUTH(vs)) {
1705             gnutls_certificate_server_credentials x509_cred = vnc_tls_initialize_x509_cred(vs);
1706             if (!x509_cred) {
1707                 gnutls_deinit(vs->tls_session);
1708                 vs->tls_session = NULL;
1709                 vnc_client_error(vs);
1710                 return -1;
1711             }
1712             if (gnutls_credentials_set(vs->tls_session, GNUTLS_CRD_CERTIFICATE, x509_cred) < 0) {
1713                 gnutls_deinit(vs->tls_session);
1714                 vs->tls_session = NULL;
1715                 gnutls_certificate_free_credentials(x509_cred);
1716                 vnc_client_error(vs);
1717                 return -1;
1718             }
1719             if (vs->x509verify) {
1720                 VNC_DEBUG("Requesting a client certificate\n");
1721                 gnutls_certificate_server_set_request (vs->tls_session, GNUTLS_CERT_REQUEST);
1722             }
1723
1724         } else {
1725             gnutls_anon_server_credentials anon_cred = vnc_tls_initialize_anon_cred();
1726             if (!anon_cred) {
1727                 gnutls_deinit(vs->tls_session);
1728                 vs->tls_session = NULL;
1729                 vnc_client_error(vs);
1730                 return -1;
1731             }
1732             if (gnutls_credentials_set(vs->tls_session, GNUTLS_CRD_ANON, anon_cred) < 0) {
1733                 gnutls_deinit(vs->tls_session);
1734                 vs->tls_session = NULL;
1735                 gnutls_anon_free_server_credentials(anon_cred);
1736                 vnc_client_error(vs);
1737                 return -1;
1738             }
1739         }
1740
1741         gnutls_transport_set_ptr(vs->tls_session, (gnutls_transport_ptr_t)vs);
1742         gnutls_transport_set_push_function(vs->tls_session, vnc_tls_push);
1743         gnutls_transport_set_pull_function(vs->tls_session, vnc_tls_pull);
1744     }
1745
1746     VNC_DEBUG("Start TLS handshake process\n");
1747     return vnc_continue_handshake(vs);
1748 }
1749
1750 static int protocol_client_vencrypt_auth(VncState *vs, uint8_t *data, size_t len)
1751 {
1752     int auth = read_u32(data, 0);
1753
1754     if (auth != vs->subauth) {
1755         VNC_DEBUG("Rejecting auth %d\n", auth);
1756         vnc_write_u8(vs, 0); /* Reject auth */
1757         vnc_flush(vs);
1758         vnc_client_error(vs);
1759     } else {
1760         VNC_DEBUG("Accepting auth %d, starting handshake\n", auth);
1761         vnc_write_u8(vs, 1); /* Accept auth */
1762         vnc_flush(vs);
1763
1764         if (vnc_start_tls(vs) < 0) {
1765             VNC_DEBUG("Failed to complete TLS\n");
1766             return 0;
1767         }
1768
1769         if (vs->wiremode == VNC_WIREMODE_TLS) {
1770             VNC_DEBUG("Starting VeNCrypt subauth\n");
1771             return start_auth_vencrypt_subauth(vs);
1772         } else {
1773             VNC_DEBUG("TLS handshake blocked\n");
1774             return 0;
1775         }
1776     }
1777     return 0;
1778 }
1779
1780 static int protocol_client_vencrypt_init(VncState *vs, uint8_t *data, size_t len)
1781 {
1782     if (data[0] != 0 ||
1783         data[1] != 2) {
1784         VNC_DEBUG("Unsupported VeNCrypt protocol %d.%d\n", (int)data[0], (int)data[1]);
1785         vnc_write_u8(vs, 1); /* Reject version */
1786         vnc_flush(vs);
1787         vnc_client_error(vs);
1788     } else {
1789         VNC_DEBUG("Sending allowed auth %d\n", vs->subauth);
1790         vnc_write_u8(vs, 0); /* Accept version */
1791         vnc_write_u8(vs, 1); /* Number of sub-auths */
1792         vnc_write_u32(vs, vs->subauth); /* The supported auth */
1793         vnc_flush(vs);
1794         vnc_read_when(vs, protocol_client_vencrypt_auth, 4);
1795     }
1796     return 0;
1797 }
1798
1799 static int start_auth_vencrypt(VncState *vs)
1800 {
1801     /* Send VeNCrypt version 0.2 */
1802     vnc_write_u8(vs, 0);
1803     vnc_write_u8(vs, 2);
1804
1805     vnc_read_when(vs, protocol_client_vencrypt_init, 2);
1806     return 0;
1807 }
1808 #endif /* CONFIG_VNC_TLS */
1809
1810 static int protocol_client_auth(VncState *vs, uint8_t *data, size_t len)
1811 {
1812     /* We only advertise 1 auth scheme at a time, so client
1813      * must pick the one we sent. Verify this */
1814     if (data[0] != vs->auth) { /* Reject auth */
1815        VNC_DEBUG("Reject auth %d\n", (int)data[0]);
1816        vnc_write_u32(vs, 1);
1817        if (vs->minor >= 8) {
1818            static const char err[] = "Authentication failed";
1819            vnc_write_u32(vs, sizeof(err));
1820            vnc_write(vs, err, sizeof(err));
1821        }
1822        vnc_client_error(vs);
1823     } else { /* Accept requested auth */
1824        VNC_DEBUG("Client requested auth %d\n", (int)data[0]);
1825        switch (vs->auth) {
1826        case VNC_AUTH_NONE:
1827            VNC_DEBUG("Accept auth none\n");
1828            if (vs->minor >= 8) {
1829                vnc_write_u32(vs, 0); /* Accept auth completion */
1830                vnc_flush(vs);
1831            }
1832            vnc_read_when(vs, protocol_client_init, 1);
1833            break;
1834
1835        case VNC_AUTH_VNC:
1836            VNC_DEBUG("Start VNC auth\n");
1837            return start_auth_vnc(vs);
1838
1839 #if CONFIG_VNC_TLS
1840        case VNC_AUTH_VENCRYPT:
1841            VNC_DEBUG("Accept VeNCrypt auth\n");;
1842            return start_auth_vencrypt(vs);
1843 #endif /* CONFIG_VNC_TLS */
1844
1845        default: /* Should not be possible, but just in case */
1846            VNC_DEBUG("Reject auth %d\n", vs->auth);
1847            vnc_write_u8(vs, 1);
1848            if (vs->minor >= 8) {
1849                static const char err[] = "Authentication failed";
1850                vnc_write_u32(vs, sizeof(err));
1851                vnc_write(vs, err, sizeof(err));
1852            }
1853            vnc_client_error(vs);
1854        }
1855     }
1856     return 0;
1857 }
1858
1859 static int protocol_version(VncState *vs, uint8_t *version, size_t len)
1860 {
1861     char local[13];
1862
1863     memcpy(local, version, 12);
1864     local[12] = 0;
1865
1866     if (sscanf(local, "RFB %03d.%03d\n", &vs->major, &vs->minor) != 2) {
1867         VNC_DEBUG("Malformed protocol version %s\n", local);
1868         vnc_client_error(vs);
1869         return 0;
1870     }
1871     VNC_DEBUG("Client request protocol version %d.%d\n", vs->major, vs->minor);
1872     if (vs->major != 3 ||
1873         (vs->minor != 3 &&
1874          vs->minor != 4 &&
1875          vs->minor != 5 &&
1876          vs->minor != 7 &&
1877          vs->minor != 8)) {
1878         VNC_DEBUG("Unsupported client version\n");
1879         vnc_write_u32(vs, VNC_AUTH_INVALID);
1880         vnc_flush(vs);
1881         vnc_client_error(vs);
1882         return 0;
1883     }
1884     /* Some broken clients report v3.4 or v3.5, which spec requires to be treated
1885      * as equivalent to v3.3 by servers
1886      */
1887     if (vs->minor == 4 || vs->minor == 5)
1888         vs->minor = 3;
1889
1890     if (vs->minor == 3) {
1891         if (vs->auth == VNC_AUTH_NONE) {
1892             VNC_DEBUG("Tell client auth none\n");
1893             vnc_write_u32(vs, vs->auth);
1894             vnc_flush(vs);
1895             vnc_read_when(vs, protocol_client_init, 1);
1896        } else if (vs->auth == VNC_AUTH_VNC) {
1897             VNC_DEBUG("Tell client VNC auth\n");
1898             vnc_write_u32(vs, vs->auth);
1899             vnc_flush(vs);
1900             start_auth_vnc(vs);
1901        } else {
1902             VNC_DEBUG("Unsupported auth %d for protocol 3.3\n", vs->auth);
1903             vnc_write_u32(vs, VNC_AUTH_INVALID);
1904             vnc_flush(vs);
1905             vnc_client_error(vs);
1906        }
1907     } else {
1908         VNC_DEBUG("Telling client we support auth %d\n", vs->auth);
1909         vnc_write_u8(vs, 1); /* num auth */
1910         vnc_write_u8(vs, vs->auth);
1911         vnc_read_when(vs, protocol_client_auth, 1);
1912         vnc_flush(vs);
1913     }
1914
1915     return 0;
1916 }
1917
1918 static void vnc_connect(VncState *vs)
1919 {
1920     VNC_DEBUG("New client on socket %d\n", vs->csock);
1921     socket_set_nonblock(vs->csock);
1922     qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, vs);
1923     vnc_write(vs, "RFB 003.008\n", 12);
1924     vnc_flush(vs);
1925     vnc_read_when(vs, protocol_version, 12);
1926     memset(vs->old_data, 0, vs->ds->linesize * vs->ds->height);
1927     memset(vs->dirty_row, 0xFF, sizeof(vs->dirty_row));
1928     vs->has_resize = 0;
1929     vs->has_hextile = 0;
1930     vs->ds->dpy_copy = NULL;
1931     vnc_update_client(vs);
1932 }
1933
1934 static void vnc_listen_read(void *opaque)
1935 {
1936     VncState *vs = opaque;
1937     struct sockaddr_in addr;
1938     socklen_t addrlen = sizeof(addr);
1939
1940     /* Catch-up */
1941     vga_hw_update();
1942
1943     vs->csock = accept(vs->lsock, (struct sockaddr *)&addr, &addrlen);
1944     if (vs->csock != -1) {
1945         vnc_connect(vs);
1946     }
1947 }
1948
1949 extern int parse_host_port(struct sockaddr_in *saddr, const char *str);
1950
1951 void vnc_display_init(DisplayState *ds)
1952 {
1953     VncState *vs;
1954
1955     vs = qemu_mallocz(sizeof(VncState));
1956     if (!vs)
1957         exit(1);
1958
1959     ds->opaque = vs;
1960     vnc_state = vs;
1961     vs->display = NULL;
1962     vs->password = NULL;
1963
1964     vs->lsock = -1;
1965     vs->csock = -1;
1966     vs->depth = 4;
1967     vs->last_x = -1;
1968     vs->last_y = -1;
1969
1970     vs->ds = ds;
1971
1972     if (!keyboard_layout)
1973         keyboard_layout = "en-us";
1974
1975     vs->kbd_layout = init_keyboard_layout(keyboard_layout);
1976     if (!vs->kbd_layout)
1977         exit(1);
1978
1979     vs->timer = qemu_new_timer(rt_clock, vnc_update_client, vs);
1980
1981     vs->ds->data = NULL;
1982     vs->ds->dpy_update = vnc_dpy_update;
1983     vs->ds->dpy_resize = vnc_dpy_resize;
1984     vs->ds->dpy_refresh = NULL;
1985
1986     vnc_dpy_resize(vs->ds, 640, 400);
1987 }
1988
1989 #if CONFIG_VNC_TLS
1990 static int vnc_set_x509_credential(VncState *vs,
1991                                    const char *certdir,
1992                                    const char *filename,
1993                                    char **cred,
1994                                    int ignoreMissing)
1995 {
1996     struct stat sb;
1997
1998     if (*cred) {
1999         qemu_free(*cred);
2000         *cred = NULL;
2001     }
2002
2003     if (!(*cred = qemu_malloc(strlen(certdir) + strlen(filename) + 2)))
2004         return -1;
2005
2006     strcpy(*cred, certdir);
2007     strcat(*cred, "/");
2008     strcat(*cred, filename);
2009
2010     VNC_DEBUG("Check %s\n", *cred);
2011     if (stat(*cred, &sb) < 0) {
2012         qemu_free(*cred);
2013         *cred = NULL;
2014         if (ignoreMissing && errno == ENOENT)
2015             return 0;
2016         return -1;
2017     }
2018
2019     return 0;
2020 }
2021
2022 static int vnc_set_x509_credential_dir(VncState *vs,
2023                                        const char *certdir)
2024 {
2025     if (vnc_set_x509_credential(vs, certdir, X509_CA_CERT_FILE, &vs->x509cacert, 0) < 0)
2026         goto cleanup;
2027     if (vnc_set_x509_credential(vs, certdir, X509_CA_CRL_FILE, &vs->x509cacrl, 1) < 0)
2028         goto cleanup;
2029     if (vnc_set_x509_credential(vs, certdir, X509_SERVER_CERT_FILE, &vs->x509cert, 0) < 0)
2030         goto cleanup;
2031     if (vnc_set_x509_credential(vs, certdir, X509_SERVER_KEY_FILE, &vs->x509key, 0) < 0)
2032         goto cleanup;
2033
2034     return 0;
2035
2036  cleanup:
2037     qemu_free(vs->x509cacert);
2038     qemu_free(vs->x509cacrl);
2039     qemu_free(vs->x509cert);
2040     qemu_free(vs->x509key);
2041     vs->x509cacert = vs->x509cacrl = vs->x509cert = vs->x509key = NULL;
2042     return -1;
2043 }
2044 #endif /* CONFIG_VNC_TLS */
2045
2046 void vnc_display_close(DisplayState *ds)
2047 {
2048     VncState *vs = ds ? (VncState *)ds->opaque : vnc_state;
2049
2050     if (vs->display) {
2051         qemu_free(vs->display);
2052         vs->display = NULL;
2053     }
2054     if (vs->lsock != -1) {
2055         qemu_set_fd_handler2(vs->lsock, NULL, NULL, NULL, NULL);
2056         close(vs->lsock);
2057         vs->lsock = -1;
2058     }
2059     if (vs->csock != -1) {
2060         qemu_set_fd_handler2(vs->csock, NULL, NULL, NULL, NULL);
2061         closesocket(vs->csock);
2062         vs->csock = -1;
2063         buffer_reset(&vs->input);
2064         buffer_reset(&vs->output);
2065         vs->need_update = 0;
2066 #if CONFIG_VNC_TLS
2067         if (vs->tls_session) {
2068             gnutls_deinit(vs->tls_session);
2069             vs->tls_session = NULL;
2070         }
2071         vs->wiremode = VNC_WIREMODE_CLEAR;
2072 #endif /* CONFIG_VNC_TLS */
2073     }
2074     vs->auth = VNC_AUTH_INVALID;
2075 #if CONFIG_VNC_TLS
2076     vs->subauth = VNC_AUTH_INVALID;
2077     vs->x509verify = 0;
2078 #endif
2079 }
2080
2081 int vnc_display_password(DisplayState *ds, const char *password)
2082 {
2083     VncState *vs = ds ? (VncState *)ds->opaque : vnc_state;
2084
2085     if (vs->password) {
2086         qemu_free(vs->password);
2087         vs->password = NULL;
2088     }
2089     if (password && password[0]) {
2090         if (!(vs->password = qemu_strdup(password)))
2091             return -1;
2092     }
2093
2094     return 0;
2095 }
2096
2097 int vnc_display_open(DisplayState *ds, const char *display)
2098 {
2099     struct sockaddr *addr;
2100     struct sockaddr_in iaddr;
2101 #ifndef _WIN32
2102     struct sockaddr_un uaddr;
2103     const char *p;
2104 #endif
2105     int reuse_addr, ret;
2106     socklen_t addrlen;
2107     VncState *vs = ds ? (VncState *)ds->opaque : vnc_state;
2108     const char *options;
2109     int password = 0;
2110     int reverse = 0;
2111 #if CONFIG_VNC_TLS
2112     int tls = 0, x509 = 0;
2113 #endif
2114
2115     vnc_display_close(ds);
2116     if (strcmp(display, "none") == 0)
2117         return 0;
2118
2119     if (!(vs->display = strdup(display)))
2120         return -1;
2121
2122     options = display;
2123     while ((options = strchr(options, ','))) {
2124         options++;
2125         if (strncmp(options, "password", 8) == 0) {
2126             password = 1; /* Require password auth */
2127         } else if (strncmp(options, "reverse", 7) == 0) {
2128             reverse = 1;
2129 #if CONFIG_VNC_TLS
2130         } else if (strncmp(options, "tls", 3) == 0) {
2131             tls = 1; /* Require TLS */
2132         } else if (strncmp(options, "x509", 4) == 0) {
2133             char *start, *end;
2134             x509 = 1; /* Require x509 certificates */
2135             if (strncmp(options, "x509verify", 10) == 0)
2136                 vs->x509verify = 1; /* ...and verify client certs */
2137
2138             /* Now check for 'x509=/some/path' postfix
2139              * and use that to setup x509 certificate/key paths */
2140             start = strchr(options, '=');
2141             end = strchr(options, ',');
2142             if (start && (!end || (start < end))) {
2143                 int len = end ? end-(start+1) : strlen(start+1);
2144                 char *path = qemu_malloc(len+1);
2145                 strncpy(path, start+1, len);
2146                 path[len] = '\0';
2147                 VNC_DEBUG("Trying certificate path '%s'\n", path);
2148                 if (vnc_set_x509_credential_dir(vs, path) < 0) {
2149                     fprintf(stderr, "Failed to find x509 certificates/keys in %s\n", path);
2150                     qemu_free(path);
2151                     qemu_free(vs->display);
2152                     vs->display = NULL;
2153                     return -1;
2154                 }
2155                 qemu_free(path);
2156             } else {
2157                 fprintf(stderr, "No certificate path provided\n");
2158                 qemu_free(vs->display);
2159                 vs->display = NULL;
2160                 return -1;
2161             }
2162 #endif
2163         }
2164     }
2165
2166     if (password) {
2167 #if CONFIG_VNC_TLS
2168         if (tls) {
2169             vs->auth = VNC_AUTH_VENCRYPT;
2170             if (x509) {
2171                 VNC_DEBUG("Initializing VNC server with x509 password auth\n");
2172                 vs->subauth = VNC_AUTH_VENCRYPT_X509VNC;
2173             } else {
2174                 VNC_DEBUG("Initializing VNC server with TLS password auth\n");
2175                 vs->subauth = VNC_AUTH_VENCRYPT_TLSVNC;
2176             }
2177         } else {
2178 #endif
2179             VNC_DEBUG("Initializing VNC server with password auth\n");
2180             vs->auth = VNC_AUTH_VNC;
2181 #if CONFIG_VNC_TLS
2182             vs->subauth = VNC_AUTH_INVALID;
2183         }
2184 #endif
2185     } else {
2186 #if CONFIG_VNC_TLS
2187         if (tls) {
2188             vs->auth = VNC_AUTH_VENCRYPT;
2189             if (x509) {
2190                 VNC_DEBUG("Initializing VNC server with x509 no auth\n");
2191                 vs->subauth = VNC_AUTH_VENCRYPT_X509NONE;
2192             } else {
2193                 VNC_DEBUG("Initializing VNC server with TLS no auth\n");
2194                 vs->subauth = VNC_AUTH_VENCRYPT_TLSNONE;
2195             }
2196         } else {
2197 #endif
2198             VNC_DEBUG("Initializing VNC server with no auth\n");
2199             vs->auth = VNC_AUTH_NONE;
2200 #if CONFIG_VNC_TLS
2201             vs->subauth = VNC_AUTH_INVALID;
2202         }
2203 #endif
2204     }
2205 #ifndef _WIN32
2206     if (strstart(display, "unix:", &p)) {
2207         addr = (struct sockaddr *)&uaddr;
2208         addrlen = sizeof(uaddr);
2209
2210         vs->lsock = socket(PF_UNIX, SOCK_STREAM, 0);
2211         if (vs->lsock == -1) {
2212             fprintf(stderr, "Could not create socket\n");
2213             free(vs->display);
2214             vs->display = NULL;
2215             return -1;
2216         }
2217
2218         uaddr.sun_family = AF_UNIX;
2219         memset(uaddr.sun_path, 0, 108);
2220         snprintf(uaddr.sun_path, 108, "%s", p);
2221
2222         if (!reverse) {
2223             unlink(uaddr.sun_path);
2224         }
2225     } else
2226 #endif
2227     {
2228         addr = (struct sockaddr *)&iaddr;
2229         addrlen = sizeof(iaddr);
2230
2231         if (parse_host_port(&iaddr, display) < 0) {
2232             fprintf(stderr, "Could not parse VNC address\n");
2233             free(vs->display);
2234             vs->display = NULL;
2235             return -1;
2236         }
2237
2238         iaddr.sin_port = htons(ntohs(iaddr.sin_port) + (reverse ? 0 : 5900));
2239
2240         vs->lsock = socket(PF_INET, SOCK_STREAM, 0);
2241         if (vs->lsock == -1) {
2242             fprintf(stderr, "Could not create socket\n");
2243             free(vs->display);
2244             vs->display = NULL;
2245             return -1;
2246         }
2247
2248         reuse_addr = 1;
2249         ret = setsockopt(vs->lsock, SOL_SOCKET, SO_REUSEADDR,
2250                          (const char *)&reuse_addr, sizeof(reuse_addr));
2251         if (ret == -1) {
2252             fprintf(stderr, "setsockopt() failed\n");
2253             close(vs->lsock);
2254             vs->lsock = -1;
2255             free(vs->display);
2256             vs->display = NULL;
2257             return -1;
2258         }
2259     }
2260
2261     if (reverse) {
2262         if (connect(vs->lsock, addr, addrlen) == -1) {
2263             fprintf(stderr, "Connection to VNC client failed\n");
2264             close(vs->lsock);
2265             vs->lsock = -1;
2266             free(vs->display);
2267             vs->display = NULL;
2268             return -1;
2269         } else {
2270             vs->csock = vs->lsock;
2271             vs->lsock = -1;
2272             vnc_connect(vs);
2273             return 0;
2274         }
2275     }
2276
2277     if (bind(vs->lsock, addr, addrlen) == -1) {
2278         fprintf(stderr, "bind() failed\n");
2279         close(vs->lsock);
2280         vs->lsock = -1;
2281         free(vs->display);
2282         vs->display = NULL;
2283         return -1;
2284     }
2285
2286     if (listen(vs->lsock, 1) == -1) {
2287         fprintf(stderr, "listen() failed\n");
2288         close(vs->lsock);
2289         vs->lsock = -1;
2290         free(vs->display);
2291         vs->display = NULL;
2292         return -1;
2293     }
2294
2295     return qemu_set_fd_handler2(vs->lsock, vnc_listen_poll, vnc_listen_read, NULL, vs);
2296 }