Statistics
| Branch: | Revision:

root / vnc.c @ bcfad70f

History | View | Annotate | Download (58.4 kB)

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(h, vs->height);
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 = qemu_realloc(ds->data, w * h * vs->depth);
295
    vs->old_data = qemu_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 (size_changed) {
311
        vs->width = ds->width;
312
        vs->height = ds->height;
313
        if (vs->csock != -1 && vs->has_resize) {
314
            vnc_write_u8(vs, 0);  /* msg id */
315
            vnc_write_u8(vs, 0);
316
            vnc_write_u16(vs, 1); /* number of rects */
317
            vnc_framebuffer_update(vs, 0, 0, ds->width, ds->height, -223);
318
            vnc_flush(vs);
319
        }
320
    }
321

    
322
    memset(vs->dirty_row, 0xFF, sizeof(vs->dirty_row));
323
    memset(vs->old_data, 42, vs->ds->linesize * vs->ds->height);
324
}
325

    
326
/* fastest code */
327
static void vnc_write_pixels_copy(VncState *vs, void *pixels, int size)
328
{
329
    vnc_write(vs, pixels, size);
330
}
331

    
332
/* slowest but generic code. */
333
static void vnc_convert_pixel(VncState *vs, uint8_t *buf, uint32_t v)
334
{
335
    unsigned int r, g, b;
336

    
337
    r = (v >> vs->red_shift1) & vs->red_max;
338
    g = (v >> vs->green_shift1) & vs->green_max;
339
    b = (v >> vs->blue_shift1) & vs->blue_max;
340
    v = (r << vs->red_shift) |
341
        (g << vs->green_shift) |
342
        (b << vs->blue_shift);
343
    switch(vs->pix_bpp) {
344
    case 1:
345
        buf[0] = v;
346
        break;
347
    case 2:
348
        if (vs->pix_big_endian) {
349
            buf[0] = v >> 8;
350
            buf[1] = v;
351
        } else {
352
            buf[1] = v >> 8;
353
            buf[0] = v;
354
        }
355
        break;
356
    default:
357
    case 4:
358
        if (vs->pix_big_endian) {
359
            buf[0] = v >> 24;
360
            buf[1] = v >> 16;
361
            buf[2] = v >> 8;
362
            buf[3] = v;
363
        } else {
364
            buf[3] = v >> 24;
365
            buf[2] = v >> 16;
366
            buf[1] = v >> 8;
367
            buf[0] = v;
368
        }
369
        break;
370
    }
371
}
372

    
373
static void vnc_write_pixels_generic(VncState *vs, void *pixels1, int size)
374
{
375
    uint32_t *pixels = pixels1;
376
    uint8_t buf[4];
377
    int n, i;
378

    
379
    n = size >> 2;
380
    for(i = 0; i < n; i++) {
381
        vnc_convert_pixel(vs, buf, pixels[i]);
382
        vnc_write(vs, buf, vs->pix_bpp);
383
    }
384
}
385

    
386
static void send_framebuffer_update_raw(VncState *vs, int x, int y, int w, int h)
387
{
388
    int i;
389
    uint8_t *row;
390

    
391
    vnc_framebuffer_update(vs, x, y, w, h, 0);
392

    
393
    row = vs->ds->data + y * vs->ds->linesize + x * vs->depth;
394
    for (i = 0; i < h; i++) {
395
        vs->write_pixels(vs, row, w * vs->depth);
396
        row += vs->ds->linesize;
397
    }
398
}
399

    
400
static void hextile_enc_cord(uint8_t *ptr, int x, int y, int w, int h)
401
{
402
    ptr[0] = ((x & 0x0F) << 4) | (y & 0x0F);
403
    ptr[1] = (((w - 1) & 0x0F) << 4) | ((h - 1) & 0x0F);
404
}
405

    
406
#define BPP 8
407
#include "vnchextile.h"
408
#undef BPP
409

    
410
#define BPP 16
411
#include "vnchextile.h"
412
#undef BPP
413

    
414
#define BPP 32
415
#include "vnchextile.h"
416
#undef BPP
417

    
418
#define GENERIC
419
#define BPP 32
420
#include "vnchextile.h"
421
#undef BPP
422
#undef GENERIC
423

    
424
static void send_framebuffer_update_hextile(VncState *vs, int x, int y, int w, int h)
425
{
426
    int i, j;
427
    int has_fg, has_bg;
428
    uint32_t last_fg32, last_bg32;
429

    
430
    vnc_framebuffer_update(vs, x, y, w, h, 5);
431

    
432
    has_fg = has_bg = 0;
433
    for (j = y; j < (y + h); j += 16) {
434
        for (i = x; i < (x + w); i += 16) {
435
            vs->send_hextile_tile(vs, i, j,
436
                                  MIN(16, x + w - i), MIN(16, y + h - j),
437
                                  &last_bg32, &last_fg32, &has_bg, &has_fg);
438
        }
439
    }
440
}
441

    
442
static void send_framebuffer_update(VncState *vs, int x, int y, int w, int h)
443
{
444
        if (vs->has_hextile)
445
            send_framebuffer_update_hextile(vs, x, y, w, h);
446
        else
447
            send_framebuffer_update_raw(vs, x, y, w, h);
448
}
449

    
450
static void vnc_copy(DisplayState *ds, int src_x, int src_y, int dst_x, int dst_y, int w, int h)
451
{
452
    int src, dst;
453
    uint8_t *src_row;
454
    uint8_t *dst_row;
455
    char *old_row;
456
    int y = 0;
457
    int pitch = ds->linesize;
458
    VncState *vs = ds->opaque;
459

    
460
    vnc_update_client(vs);
461

    
462
    if (dst_y > src_y) {
463
        y = h - 1;
464
        pitch = -pitch;
465
    }
466

    
467
    src = (ds->linesize * (src_y + y) + vs->depth * src_x);
468
    dst = (ds->linesize * (dst_y + y) + vs->depth * dst_x);
469

    
470
    src_row = ds->data + src;
471
    dst_row = ds->data + dst;
472
    old_row = vs->old_data + dst;
473

    
474
    for (y = 0; y < h; y++) {
475
        memmove(old_row, src_row, w * vs->depth);
476
        memmove(dst_row, src_row, w * vs->depth);
477
        src_row += pitch;
478
        dst_row += pitch;
479
        old_row += pitch;
480
    }
481

    
482
    vnc_write_u8(vs, 0);  /* msg id */
483
    vnc_write_u8(vs, 0);
484
    vnc_write_u16(vs, 1); /* number of rects */
485
    vnc_framebuffer_update(vs, dst_x, dst_y, w, h, 1);
486
    vnc_write_u16(vs, src_x);
487
    vnc_write_u16(vs, src_y);
488
    vnc_flush(vs);
489
}
490

    
491
static int find_dirty_height(VncState *vs, int y, int last_x, int x)
492
{
493
    int h;
494

    
495
    for (h = 1; h < (vs->height - y); h++) {
496
        int tmp_x;
497
        if (!vnc_get_bit(vs->dirty_row[y + h], last_x))
498
            break;
499
        for (tmp_x = last_x; tmp_x < x; tmp_x++)
500
            vnc_clear_bit(vs->dirty_row[y + h], tmp_x);
501
    }
502

    
503
    return h;
504
}
505

    
506
static void vnc_update_client(void *opaque)
507
{
508
    VncState *vs = opaque;
509

    
510
    if (vs->need_update && vs->csock != -1) {
511
        int y;
512
        uint8_t *row;
513
        char *old_row;
514
        uint32_t width_mask[VNC_DIRTY_WORDS];
515
        int n_rectangles;
516
        int saved_offset;
517
        int has_dirty = 0;
518

    
519
        vga_hw_update();
520

    
521
        vnc_set_bits(width_mask, (vs->width / 16), VNC_DIRTY_WORDS);
522

    
523
        /* Walk through the dirty map and eliminate tiles that
524
           really aren't dirty */
525
        row = vs->ds->data;
526
        old_row = vs->old_data;
527

    
528
        for (y = 0; y < vs->height; y++) {
529
            if (vnc_and_bits(vs->dirty_row[y], width_mask, VNC_DIRTY_WORDS)) {
530
                int x;
531
                uint8_t *ptr;
532
                char *old_ptr;
533

    
534
                ptr = row;
535
                old_ptr = (char*)old_row;
536

    
537
                for (x = 0; x < vs->ds->width; x += 16) {
538
                    if (memcmp(old_ptr, ptr, 16 * vs->depth) == 0) {
539
                        vnc_clear_bit(vs->dirty_row[y], (x / 16));
540
                    } else {
541
                        has_dirty = 1;
542
                        memcpy(old_ptr, ptr, 16 * vs->depth);
543
                    }
544

    
545
                    ptr += 16 * vs->depth;
546
                    old_ptr += 16 * vs->depth;
547
                }
548
            }
549

    
550
            row += vs->ds->linesize;
551
            old_row += vs->ds->linesize;
552
        }
553

    
554
        if (!has_dirty) {
555
            qemu_mod_timer(vs->timer, qemu_get_clock(rt_clock) + VNC_REFRESH_INTERVAL);
556
            return;
557
        }
558

    
559
        /* Count rectangles */
560
        n_rectangles = 0;
561
        vnc_write_u8(vs, 0);  /* msg id */
562
        vnc_write_u8(vs, 0);
563
        saved_offset = vs->output.offset;
564
        vnc_write_u16(vs, 0);
565

    
566
        for (y = 0; y < vs->height; y++) {
567
            int x;
568
            int last_x = -1;
569
            for (x = 0; x < vs->width / 16; x++) {
570
                if (vnc_get_bit(vs->dirty_row[y], x)) {
571
                    if (last_x == -1) {
572
                        last_x = x;
573
                    }
574
                    vnc_clear_bit(vs->dirty_row[y], x);
575
                } else {
576
                    if (last_x != -1) {
577
                        int h = find_dirty_height(vs, y, last_x, x);
578
                        send_framebuffer_update(vs, last_x * 16, y, (x - last_x) * 16, h);
579
                        n_rectangles++;
580
                    }
581
                    last_x = -1;
582
                }
583
            }
584
            if (last_x != -1) {
585
                int h = find_dirty_height(vs, y, last_x, x);
586
                send_framebuffer_update(vs, last_x * 16, y, (x - last_x) * 16, h);
587
                n_rectangles++;
588
            }
589
        }
590
        vs->output.buffer[saved_offset] = (n_rectangles >> 8) & 0xFF;
591
        vs->output.buffer[saved_offset + 1] = n_rectangles & 0xFF;
592
        vnc_flush(vs);
593

    
594
    }
595

    
596
    if (vs->csock != -1) {
597
        qemu_mod_timer(vs->timer, qemu_get_clock(rt_clock) + VNC_REFRESH_INTERVAL);
598
    }
599

    
600
}
601

    
602
static int vnc_listen_poll(void *opaque)
603
{
604
    VncState *vs = opaque;
605
    if (vs->csock == -1)
606
        return 1;
607
    return 0;
608
}
609

    
610
static void buffer_reserve(Buffer *buffer, size_t len)
611
{
612
    if ((buffer->capacity - buffer->offset) < len) {
613
        buffer->capacity += (len + 1024);
614
        buffer->buffer = qemu_realloc(buffer->buffer, buffer->capacity);
615
        if (buffer->buffer == NULL) {
616
            fprintf(stderr, "vnc: out of memory\n");
617
            exit(1);
618
        }
619
    }
620
}
621

    
622
static int buffer_empty(Buffer *buffer)
623
{
624
    return buffer->offset == 0;
625
}
626

    
627
static uint8_t *buffer_end(Buffer *buffer)
628
{
629
    return buffer->buffer + buffer->offset;
630
}
631

    
632
static void buffer_reset(Buffer *buffer)
633
{
634
        buffer->offset = 0;
635
}
636

    
637
static void buffer_append(Buffer *buffer, const void *data, size_t len)
638
{
639
    memcpy(buffer->buffer + buffer->offset, data, len);
640
    buffer->offset += len;
641
}
642

    
643
static int vnc_client_io_error(VncState *vs, int ret, int last_errno)
644
{
645
    if (ret == 0 || ret == -1) {
646
        if (ret == -1) {
647
            switch (last_errno) {
648
                case EINTR:
649
                case EAGAIN:
650
#ifdef _WIN32
651
                case WSAEWOULDBLOCK:
652
#endif
653
                    return 0;
654
                default:
655
                    break;
656
            }
657
        }
658

    
659
        VNC_DEBUG("Closing down client sock %d %d\n", ret, ret < 0 ? last_errno : 0);
660
        qemu_set_fd_handler2(vs->csock, NULL, NULL, NULL, NULL);
661
        closesocket(vs->csock);
662
        vs->csock = -1;
663
        vs->ds->idle = 1;
664
        buffer_reset(&vs->input);
665
        buffer_reset(&vs->output);
666
        vs->need_update = 0;
667
#if CONFIG_VNC_TLS
668
        if (vs->tls_session) {
669
            gnutls_deinit(vs->tls_session);
670
            vs->tls_session = NULL;
671
        }
672
        vs->wiremode = VNC_WIREMODE_CLEAR;
673
#endif /* CONFIG_VNC_TLS */
674
        return 0;
675
    }
676
    return ret;
677
}
678

    
679
static void vnc_client_error(VncState *vs)
680
{
681
    vnc_client_io_error(vs, -1, EINVAL);
682
}
683

    
684
static void vnc_client_write(void *opaque)
685
{
686
    long ret;
687
    VncState *vs = opaque;
688

    
689
#if CONFIG_VNC_TLS
690
    if (vs->tls_session) {
691
        ret = gnutls_write(vs->tls_session, vs->output.buffer, vs->output.offset);
692
        if (ret < 0) {
693
            if (ret == GNUTLS_E_AGAIN)
694
                errno = EAGAIN;
695
            else
696
                errno = EIO;
697
            ret = -1;
698
        }
699
    } else
700
#endif /* CONFIG_VNC_TLS */
701
        ret = send(vs->csock, vs->output.buffer, vs->output.offset, 0);
702
    ret = vnc_client_io_error(vs, ret, socket_error());
703
    if (!ret)
704
        return;
705

    
706
    memmove(vs->output.buffer, vs->output.buffer + ret, (vs->output.offset - ret));
707
    vs->output.offset -= ret;
708

    
709
    if (vs->output.offset == 0) {
710
        qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, vs);
711
    }
712
}
713

    
714
static void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting)
715
{
716
    vs->read_handler = func;
717
    vs->read_handler_expect = expecting;
718
}
719

    
720
static void vnc_client_read(void *opaque)
721
{
722
    VncState *vs = opaque;
723
    long ret;
724

    
725
    buffer_reserve(&vs->input, 4096);
726

    
727
#if CONFIG_VNC_TLS
728
    if (vs->tls_session) {
729
        ret = gnutls_read(vs->tls_session, buffer_end(&vs->input), 4096);
730
        if (ret < 0) {
731
            if (ret == GNUTLS_E_AGAIN)
732
                errno = EAGAIN;
733
            else
734
                errno = EIO;
735
            ret = -1;
736
        }
737
    } else
738
#endif /* CONFIG_VNC_TLS */
739
        ret = recv(vs->csock, buffer_end(&vs->input), 4096, 0);
740
    ret = vnc_client_io_error(vs, ret, socket_error());
741
    if (!ret)
742
        return;
743

    
744
    vs->input.offset += ret;
745

    
746
    while (vs->read_handler && vs->input.offset >= vs->read_handler_expect) {
747
        size_t len = vs->read_handler_expect;
748
        int ret;
749

    
750
        ret = vs->read_handler(vs, vs->input.buffer, len);
751
        if (vs->csock == -1)
752
            return;
753

    
754
        if (!ret) {
755
            memmove(vs->input.buffer, vs->input.buffer + len, (vs->input.offset - len));
756
            vs->input.offset -= len;
757
        } else {
758
            vs->read_handler_expect = ret;
759
        }
760
    }
761
}
762

    
763
static void vnc_write(VncState *vs, const void *data, size_t len)
764
{
765
    buffer_reserve(&vs->output, len);
766

    
767
    if (buffer_empty(&vs->output)) {
768
        qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, vnc_client_write, vs);
769
    }
770

    
771
    buffer_append(&vs->output, data, len);
772
}
773

    
774
static void vnc_write_s32(VncState *vs, int32_t value)
775
{
776
    vnc_write_u32(vs, *(uint32_t *)&value);
777
}
778

    
779
static void vnc_write_u32(VncState *vs, uint32_t value)
780
{
781
    uint8_t buf[4];
782

    
783
    buf[0] = (value >> 24) & 0xFF;
784
    buf[1] = (value >> 16) & 0xFF;
785
    buf[2] = (value >>  8) & 0xFF;
786
    buf[3] = value & 0xFF;
787

    
788
    vnc_write(vs, buf, 4);
789
}
790

    
791
static void vnc_write_u16(VncState *vs, uint16_t value)
792
{
793
    uint8_t buf[2];
794

    
795
    buf[0] = (value >> 8) & 0xFF;
796
    buf[1] = value & 0xFF;
797

    
798
    vnc_write(vs, buf, 2);
799
}
800

    
801
static void vnc_write_u8(VncState *vs, uint8_t value)
802
{
803
    vnc_write(vs, (char *)&value, 1);
804
}
805

    
806
static void vnc_flush(VncState *vs)
807
{
808
    if (vs->output.offset)
809
        vnc_client_write(vs);
810
}
811

    
812
static uint8_t read_u8(uint8_t *data, size_t offset)
813
{
814
    return data[offset];
815
}
816

    
817
static uint16_t read_u16(uint8_t *data, size_t offset)
818
{
819
    return ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF);
820
}
821

    
822
static int32_t read_s32(uint8_t *data, size_t offset)
823
{
824
    return (int32_t)((data[offset] << 24) | (data[offset + 1] << 16) |
825
                     (data[offset + 2] << 8) | data[offset + 3]);
826
}
827

    
828
static uint32_t read_u32(uint8_t *data, size_t offset)
829
{
830
    return ((data[offset] << 24) | (data[offset + 1] << 16) |
831
            (data[offset + 2] << 8) | data[offset + 3]);
832
}
833

    
834
#if CONFIG_VNC_TLS
835
static ssize_t vnc_tls_push(gnutls_transport_ptr_t transport,
836
                            const void *data,
837
                            size_t len) {
838
    struct VncState *vs = (struct VncState *)transport;
839
    int ret;
840

    
841
 retry:
842
    ret = send(vs->csock, data, len, 0);
843
    if (ret < 0) {
844
        if (errno == EINTR)
845
            goto retry;
846
        return -1;
847
    }
848
    return ret;
849
}
850

    
851

    
852
static ssize_t vnc_tls_pull(gnutls_transport_ptr_t transport,
853
                            void *data,
854
                            size_t len) {
855
    struct VncState *vs = (struct VncState *)transport;
856
    int ret;
857

    
858
 retry:
859
    ret = recv(vs->csock, data, len, 0);
860
    if (ret < 0) {
861
        if (errno == EINTR)
862
            goto retry;
863
        return -1;
864
    }
865
    return ret;
866
}
867
#endif /* CONFIG_VNC_TLS */
868

    
869
static void client_cut_text(VncState *vs, size_t len, uint8_t *text)
870
{
871
}
872

    
873
static void check_pointer_type_change(VncState *vs, int absolute)
874
{
875
    if (vs->has_pointer_type_change && vs->absolute != absolute) {
876
        vnc_write_u8(vs, 0);
877
        vnc_write_u8(vs, 0);
878
        vnc_write_u16(vs, 1);
879
        vnc_framebuffer_update(vs, absolute, 0,
880
                               vs->ds->width, vs->ds->height, -257);
881
        vnc_flush(vs);
882
    }
883
    vs->absolute = absolute;
884
}
885

    
886
static void pointer_event(VncState *vs, int button_mask, int x, int y)
887
{
888
    int buttons = 0;
889
    int dz = 0;
890

    
891
    if (button_mask & 0x01)
892
        buttons |= MOUSE_EVENT_LBUTTON;
893
    if (button_mask & 0x02)
894
        buttons |= MOUSE_EVENT_MBUTTON;
895
    if (button_mask & 0x04)
896
        buttons |= MOUSE_EVENT_RBUTTON;
897
    if (button_mask & 0x08)
898
        dz = -1;
899
    if (button_mask & 0x10)
900
        dz = 1;
901

    
902
    if (vs->absolute) {
903
        kbd_mouse_event(x * 0x7FFF / (vs->ds->width - 1),
904
                        y * 0x7FFF / (vs->ds->height - 1),
905
                        dz, buttons);
906
    } else if (vs->has_pointer_type_change) {
907
        x -= 0x7FFF;
908
        y -= 0x7FFF;
909

    
910
        kbd_mouse_event(x, y, dz, buttons);
911
    } else {
912
        if (vs->last_x != -1)
913
            kbd_mouse_event(x - vs->last_x,
914
                            y - vs->last_y,
915
                            dz, buttons);
916
        vs->last_x = x;
917
        vs->last_y = y;
918
    }
919

    
920
    check_pointer_type_change(vs, kbd_mouse_is_absolute());
921
}
922

    
923
static void reset_keys(VncState *vs)
924
{
925
    int i;
926
    for(i = 0; i < 256; i++) {
927
        if (vs->modifiers_state[i]) {
928
            if (i & 0x80)
929
                kbd_put_keycode(0xe0);
930
            kbd_put_keycode(i | 0x80);
931
            vs->modifiers_state[i] = 0;
932
        }
933
    }
934
}
935

    
936
static void press_key(VncState *vs, int keysym)
937
{
938
    kbd_put_keycode(keysym2scancode(vs->kbd_layout, keysym) & 0x7f);
939
    kbd_put_keycode(keysym2scancode(vs->kbd_layout, keysym) | 0x80);
940
}
941

    
942
static void do_key_event(VncState *vs, int down, uint32_t sym)
943
{
944
    int keycode;
945

    
946
    keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF);
947

    
948
    /* QEMU console switch */
949
    switch(keycode) {
950
    case 0x2a:                          /* Left Shift */
951
    case 0x36:                          /* Right Shift */
952
    case 0x1d:                          /* Left CTRL */
953
    case 0x9d:                          /* Right CTRL */
954
    case 0x38:                          /* Left ALT */
955
    case 0xb8:                          /* Right ALT */
956
        if (down)
957
            vs->modifiers_state[keycode] = 1;
958
        else
959
            vs->modifiers_state[keycode] = 0;
960
        break;
961
    case 0x02 ... 0x0a: /* '1' to '9' keys */
962
        if (down && vs->modifiers_state[0x1d] && vs->modifiers_state[0x38]) {
963
            /* Reset the modifiers sent to the current console */
964
            reset_keys(vs);
965
            console_select(keycode - 0x02);
966
            return;
967
        }
968
        break;
969
    case 0x3a:                        /* CapsLock */
970
    case 0x45:                        /* NumLock */
971
        if (!down)
972
            vs->modifiers_state[keycode] ^= 1;
973
        break;
974
    }
975

    
976
    if (keycode_is_keypad(vs->kbd_layout, keycode)) {
977
        /* If the numlock state needs to change then simulate an additional
978
           keypress before sending this one.  This will happen if the user
979
           toggles numlock away from the VNC window.
980
        */
981
        if (keysym_is_numlock(vs->kbd_layout, sym & 0xFFFF)) {
982
            if (!vs->modifiers_state[0x45]) {
983
                vs->modifiers_state[0x45] = 1;
984
                press_key(vs, 0xff7f);
985
            }
986
        } else {
987
            if (vs->modifiers_state[0x45]) {
988
                vs->modifiers_state[0x45] = 0;
989
                press_key(vs, 0xff7f);
990
            }
991
        }
992
    }
993

    
994
    if (is_graphic_console()) {
995
        if (keycode & 0x80)
996
            kbd_put_keycode(0xe0);
997
        if (down)
998
            kbd_put_keycode(keycode & 0x7f);
999
        else
1000
            kbd_put_keycode(keycode | 0x80);
1001
    } else {
1002
        /* QEMU console emulation */
1003
        if (down) {
1004
            switch (keycode) {
1005
            case 0x2a:                          /* Left Shift */
1006
            case 0x36:                          /* Right Shift */
1007
            case 0x1d:                          /* Left CTRL */
1008
            case 0x9d:                          /* Right CTRL */
1009
            case 0x38:                          /* Left ALT */
1010
            case 0xb8:                          /* Right ALT */
1011
                break;
1012
            case 0xc8:
1013
                kbd_put_keysym(QEMU_KEY_UP);
1014
                break;
1015
            case 0xd0:
1016
                kbd_put_keysym(QEMU_KEY_DOWN);
1017
                break;
1018
            case 0xcb:
1019
                kbd_put_keysym(QEMU_KEY_LEFT);
1020
                break;
1021
            case 0xcd:
1022
                kbd_put_keysym(QEMU_KEY_RIGHT);
1023
                break;
1024
            case 0xd3:
1025
                kbd_put_keysym(QEMU_KEY_DELETE);
1026
                break;
1027
            case 0xc7:
1028
                kbd_put_keysym(QEMU_KEY_HOME);
1029
                break;
1030
            case 0xcf:
1031
                kbd_put_keysym(QEMU_KEY_END);
1032
                break;
1033
            case 0xc9:
1034
                kbd_put_keysym(QEMU_KEY_PAGEUP);
1035
                break;
1036
            case 0xd1:
1037
                kbd_put_keysym(QEMU_KEY_PAGEDOWN);
1038
                break;
1039
            default:
1040
                kbd_put_keysym(sym);
1041
                break;
1042
            }
1043
        }
1044
    }
1045
}
1046

    
1047
static void key_event(VncState *vs, int down, uint32_t sym)
1048
{
1049
    if (sym >= 'A' && sym <= 'Z' && is_graphic_console())
1050
        sym = sym - 'A' + 'a';
1051
    do_key_event(vs, down, sym);
1052
}
1053

    
1054
static void framebuffer_update_request(VncState *vs, int incremental,
1055
                                       int x_position, int y_position,
1056
                                       int w, int h)
1057
{
1058
    if (x_position > vs->ds->width)
1059
        x_position = vs->ds->width;
1060
    if (y_position > vs->ds->height)
1061
        y_position = vs->ds->height;
1062
    if (x_position + w >= vs->ds->width)
1063
        w = vs->ds->width  - x_position;
1064
    if (y_position + h >= vs->ds->height)
1065
        h = vs->ds->height - y_position;
1066

    
1067
    int i;
1068
    vs->need_update = 1;
1069
    if (!incremental) {
1070
        char *old_row = vs->old_data + y_position * vs->ds->linesize;
1071

    
1072
        for (i = 0; i < h; i++) {
1073
            vnc_set_bits(vs->dirty_row[y_position + i],
1074
                         (vs->ds->width / 16), VNC_DIRTY_WORDS);
1075
            memset(old_row, 42, vs->ds->width * vs->depth);
1076
            old_row += vs->ds->linesize;
1077
        }
1078
    }
1079
}
1080

    
1081
static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
1082
{
1083
    int i;
1084

    
1085
    vs->has_hextile = 0;
1086
    vs->has_resize = 0;
1087
    vs->has_pointer_type_change = 0;
1088
    vs->absolute = -1;
1089
    vs->ds->dpy_copy = NULL;
1090

    
1091
    for (i = n_encodings - 1; i >= 0; i--) {
1092
        switch (encodings[i]) {
1093
        case 0: /* Raw */
1094
            vs->has_hextile = 0;
1095
            break;
1096
        case 1: /* CopyRect */
1097
            vs->ds->dpy_copy = vnc_copy;
1098
            break;
1099
        case 5: /* Hextile */
1100
            vs->has_hextile = 1;
1101
            break;
1102
        case -223: /* DesktopResize */
1103
            vs->has_resize = 1;
1104
            break;
1105
        case -257:
1106
            vs->has_pointer_type_change = 1;
1107
            break;
1108
        default:
1109
            break;
1110
        }
1111
    }
1112

    
1113
    check_pointer_type_change(vs, kbd_mouse_is_absolute());
1114
}
1115

    
1116
static int compute_nbits(unsigned int val)
1117
{
1118
    int n;
1119
    n = 0;
1120
    while (val != 0) {
1121
        n++;
1122
        val >>= 1;
1123
    }
1124
    return n;
1125
}
1126

    
1127
static void set_pixel_format(VncState *vs,
1128
                             int bits_per_pixel, int depth,
1129
                             int big_endian_flag, int true_color_flag,
1130
                             int red_max, int green_max, int blue_max,
1131
                             int red_shift, int green_shift, int blue_shift)
1132
{
1133
    int host_big_endian_flag;
1134

    
1135
#ifdef WORDS_BIGENDIAN
1136
    host_big_endian_flag = 1;
1137
#else
1138
    host_big_endian_flag = 0;
1139
#endif
1140
    if (!true_color_flag) {
1141
    fail:
1142
        vnc_client_error(vs);
1143
        return;
1144
    }
1145
    if (bits_per_pixel == 32 &&
1146
        host_big_endian_flag == big_endian_flag &&
1147
        red_max == 0xff && green_max == 0xff && blue_max == 0xff &&
1148
        red_shift == 16 && green_shift == 8 && blue_shift == 0) {
1149
        vs->depth = 4;
1150
        vs->write_pixels = vnc_write_pixels_copy;
1151
        vs->send_hextile_tile = send_hextile_tile_32;
1152
    } else
1153
    if (bits_per_pixel == 16 &&
1154
        host_big_endian_flag == big_endian_flag &&
1155
        red_max == 31 && green_max == 63 && blue_max == 31 &&
1156
        red_shift == 11 && green_shift == 5 && blue_shift == 0) {
1157
        vs->depth = 2;
1158
        vs->write_pixels = vnc_write_pixels_copy;
1159
        vs->send_hextile_tile = send_hextile_tile_16;
1160
    } else
1161
    if (bits_per_pixel == 8 &&
1162
        red_max == 7 && green_max == 7 && blue_max == 3 &&
1163
        red_shift == 5 && green_shift == 2 && blue_shift == 0) {
1164
        vs->depth = 1;
1165
        vs->write_pixels = vnc_write_pixels_copy;
1166
        vs->send_hextile_tile = send_hextile_tile_8;
1167
    } else
1168
    {
1169
        /* generic and slower case */
1170
        if (bits_per_pixel != 8 &&
1171
            bits_per_pixel != 16 &&
1172
            bits_per_pixel != 32)
1173
            goto fail;
1174
        vs->depth = 4;
1175
        vs->red_shift = red_shift;
1176
        vs->red_max = red_max;
1177
        vs->red_shift1 = 24 - compute_nbits(red_max);
1178
        vs->green_shift = green_shift;
1179
        vs->green_max = green_max;
1180
        vs->green_shift1 = 16 - compute_nbits(green_max);
1181
        vs->blue_shift = blue_shift;
1182
        vs->blue_max = blue_max;
1183
        vs->blue_shift1 = 8 - compute_nbits(blue_max);
1184
        vs->pix_bpp = bits_per_pixel / 8;
1185
        vs->pix_big_endian = big_endian_flag;
1186
        vs->write_pixels = vnc_write_pixels_generic;
1187
        vs->send_hextile_tile = send_hextile_tile_generic;
1188
    }
1189

    
1190
    vnc_dpy_resize(vs->ds, vs->ds->width, vs->ds->height);
1191

    
1192
    vga_hw_invalidate();
1193
    vga_hw_update();
1194
}
1195

    
1196
static int protocol_client_msg(VncState *vs, uint8_t *data, size_t len)
1197
{
1198
    int i;
1199
    uint16_t limit;
1200

    
1201
    switch (data[0]) {
1202
    case 0:
1203
        if (len == 1)
1204
            return 20;
1205

    
1206
        set_pixel_format(vs, read_u8(data, 4), read_u8(data, 5),
1207
                         read_u8(data, 6), read_u8(data, 7),
1208
                         read_u16(data, 8), read_u16(data, 10),
1209
                         read_u16(data, 12), read_u8(data, 14),
1210
                         read_u8(data, 15), read_u8(data, 16));
1211
        break;
1212
    case 2:
1213
        if (len == 1)
1214
            return 4;
1215

    
1216
        if (len == 4)
1217
            return 4 + (read_u16(data, 2) * 4);
1218

    
1219
        limit = read_u16(data, 2);
1220
        for (i = 0; i < limit; i++) {
1221
            int32_t val = read_s32(data, 4 + (i * 4));
1222
            memcpy(data + 4 + (i * 4), &val, sizeof(val));
1223
        }
1224

    
1225
        set_encodings(vs, (int32_t *)(data + 4), limit);
1226
        break;
1227
    case 3:
1228
        if (len == 1)
1229
            return 10;
1230

    
1231
        framebuffer_update_request(vs,
1232
                                   read_u8(data, 1), read_u16(data, 2), read_u16(data, 4),
1233
                                   read_u16(data, 6), read_u16(data, 8));
1234
        break;
1235
    case 4:
1236
        if (len == 1)
1237
            return 8;
1238

    
1239
        key_event(vs, read_u8(data, 1), read_u32(data, 4));
1240
        break;
1241
    case 5:
1242
        if (len == 1)
1243
            return 6;
1244

    
1245
        pointer_event(vs, read_u8(data, 1), read_u16(data, 2), read_u16(data, 4));
1246
        break;
1247
    case 6:
1248
        if (len == 1)
1249
            return 8;
1250

    
1251
        if (len == 8) {
1252
            uint32_t dlen = read_u32(data, 4);
1253
            if (dlen > 0)
1254
                return 8 + dlen;
1255
        }
1256

    
1257
        client_cut_text(vs, read_u32(data, 4), data + 8);
1258
        break;
1259
    default:
1260
        printf("Msg: %d\n", data[0]);
1261
        vnc_client_error(vs);
1262
        break;
1263
    }
1264

    
1265
    vnc_read_when(vs, protocol_client_msg, 1);
1266
    return 0;
1267
}
1268

    
1269
static int protocol_client_init(VncState *vs, uint8_t *data, size_t len)
1270
{
1271
    char pad[3] = { 0, 0, 0 };
1272
    char buf[1024];
1273
    int size;
1274

    
1275
    vs->width = vs->ds->width;
1276
    vs->height = vs->ds->height;
1277
    vnc_write_u16(vs, vs->ds->width);
1278
    vnc_write_u16(vs, vs->ds->height);
1279

    
1280
    vnc_write_u8(vs, vs->depth * 8); /* bits-per-pixel */
1281
    vnc_write_u8(vs, vs->depth * 8); /* depth */
1282
#ifdef WORDS_BIGENDIAN
1283
    vnc_write_u8(vs, 1);             /* big-endian-flag */
1284
#else
1285
    vnc_write_u8(vs, 0);             /* big-endian-flag */
1286
#endif
1287
    vnc_write_u8(vs, 1);             /* true-color-flag */
1288
    if (vs->depth == 4) {
1289
        vnc_write_u16(vs, 0xFF);     /* red-max */
1290
        vnc_write_u16(vs, 0xFF);     /* green-max */
1291
        vnc_write_u16(vs, 0xFF);     /* blue-max */
1292
        vnc_write_u8(vs, 16);        /* red-shift */
1293
        vnc_write_u8(vs, 8);         /* green-shift */
1294
        vnc_write_u8(vs, 0);         /* blue-shift */
1295
        vs->send_hextile_tile = send_hextile_tile_32;
1296
    } else if (vs->depth == 2) {
1297
        vnc_write_u16(vs, 31);       /* red-max */
1298
        vnc_write_u16(vs, 63);       /* green-max */
1299
        vnc_write_u16(vs, 31);       /* blue-max */
1300
        vnc_write_u8(vs, 11);        /* red-shift */
1301
        vnc_write_u8(vs, 5);         /* green-shift */
1302
        vnc_write_u8(vs, 0);         /* blue-shift */
1303
        vs->send_hextile_tile = send_hextile_tile_16;
1304
    } else if (vs->depth == 1) {
1305
        /* XXX: change QEMU pixel 8 bit pixel format to match the VNC one ? */
1306
        vnc_write_u16(vs, 7);        /* red-max */
1307
        vnc_write_u16(vs, 7);        /* green-max */
1308
        vnc_write_u16(vs, 3);        /* blue-max */
1309
        vnc_write_u8(vs, 5);         /* red-shift */
1310
        vnc_write_u8(vs, 2);         /* green-shift */
1311
        vnc_write_u8(vs, 0);         /* blue-shift */
1312
        vs->send_hextile_tile = send_hextile_tile_8;
1313
    }
1314
    vs->write_pixels = vnc_write_pixels_copy;
1315

    
1316
    vnc_write(vs, pad, 3);           /* padding */
1317

    
1318
    if (qemu_name)
1319
        size = snprintf(buf, sizeof(buf), "QEMU (%s)", qemu_name);
1320
    else
1321
        size = snprintf(buf, sizeof(buf), "QEMU");
1322

    
1323
    vnc_write_u32(vs, size);
1324
    vnc_write(vs, buf, size);
1325
    vnc_flush(vs);
1326

    
1327
    vnc_read_when(vs, protocol_client_msg, 1);
1328

    
1329
    return 0;
1330
}
1331

    
1332
static void make_challenge(VncState *vs)
1333
{
1334
    int i;
1335

    
1336
    srand(time(NULL)+getpid()+getpid()*987654+rand());
1337

    
1338
    for (i = 0 ; i < sizeof(vs->challenge) ; i++)
1339
        vs->challenge[i] = (int) (256.0*rand()/(RAND_MAX+1.0));
1340
}
1341

    
1342
static int protocol_client_auth_vnc(VncState *vs, uint8_t *data, size_t len)
1343
{
1344
    unsigned char response[VNC_AUTH_CHALLENGE_SIZE];
1345
    int i, j, pwlen;
1346
    unsigned char key[8];
1347

    
1348
    if (!vs->password || !vs->password[0]) {
1349
        VNC_DEBUG("No password configured on server");
1350
        vnc_write_u32(vs, 1); /* Reject auth */
1351
        if (vs->minor >= 8) {
1352
            static const char err[] = "Authentication failed";
1353
            vnc_write_u32(vs, sizeof(err));
1354
            vnc_write(vs, err, sizeof(err));
1355
        }
1356
        vnc_flush(vs);
1357
        vnc_client_error(vs);
1358
        return 0;
1359
    }
1360

    
1361
    memcpy(response, vs->challenge, VNC_AUTH_CHALLENGE_SIZE);
1362

    
1363
    /* Calculate the expected challenge response */
1364
    pwlen = strlen(vs->password);
1365
    for (i=0; i<sizeof(key); i++)
1366
        key[i] = i<pwlen ? vs->password[i] : 0;
1367
    deskey(key, EN0);
1368
    for (j = 0; j < VNC_AUTH_CHALLENGE_SIZE; j += 8)
1369
        des(response+j, response+j);
1370

    
1371
    /* Compare expected vs actual challenge response */
1372
    if (memcmp(response, data, VNC_AUTH_CHALLENGE_SIZE) != 0) {
1373
        VNC_DEBUG("Client challenge reponse did not match\n");
1374
        vnc_write_u32(vs, 1); /* Reject auth */
1375
        if (vs->minor >= 8) {
1376
            static const char err[] = "Authentication failed";
1377
            vnc_write_u32(vs, sizeof(err));
1378
            vnc_write(vs, err, sizeof(err));
1379
        }
1380
        vnc_flush(vs);
1381
        vnc_client_error(vs);
1382
    } else {
1383
        VNC_DEBUG("Accepting VNC challenge response\n");
1384
        vnc_write_u32(vs, 0); /* Accept auth */
1385
        vnc_flush(vs);
1386

    
1387
        vnc_read_when(vs, protocol_client_init, 1);
1388
    }
1389
    return 0;
1390
}
1391

    
1392
static int start_auth_vnc(VncState *vs)
1393
{
1394
    make_challenge(vs);
1395
    /* Send client a 'random' challenge */
1396
    vnc_write(vs, vs->challenge, sizeof(vs->challenge));
1397
    vnc_flush(vs);
1398

    
1399
    vnc_read_when(vs, protocol_client_auth_vnc, sizeof(vs->challenge));
1400
    return 0;
1401
}
1402

    
1403

    
1404
#if CONFIG_VNC_TLS
1405
#define DH_BITS 1024
1406
static gnutls_dh_params_t dh_params;
1407

    
1408
static int vnc_tls_initialize(void)
1409
{
1410
    static int tlsinitialized = 0;
1411

    
1412
    if (tlsinitialized)
1413
        return 1;
1414

    
1415
    if (gnutls_global_init () < 0)
1416
        return 0;
1417

    
1418
    /* XXX ought to re-generate diffie-hellmen params periodically */
1419
    if (gnutls_dh_params_init (&dh_params) < 0)
1420
        return 0;
1421
    if (gnutls_dh_params_generate2 (dh_params, DH_BITS) < 0)
1422
        return 0;
1423

    
1424
#if _VNC_DEBUG == 2
1425
    gnutls_global_set_log_level(10);
1426
    gnutls_global_set_log_function(vnc_debug_gnutls_log);
1427
#endif
1428

    
1429
    tlsinitialized = 1;
1430

    
1431
    return 1;
1432
}
1433

    
1434
static gnutls_anon_server_credentials vnc_tls_initialize_anon_cred(void)
1435
{
1436
    gnutls_anon_server_credentials anon_cred;
1437
    int ret;
1438

    
1439
    if ((ret = gnutls_anon_allocate_server_credentials(&anon_cred)) < 0) {
1440
        VNC_DEBUG("Cannot allocate credentials %s\n", gnutls_strerror(ret));
1441
        return NULL;
1442
    }
1443

    
1444
    gnutls_anon_set_server_dh_params(anon_cred, dh_params);
1445

    
1446
    return anon_cred;
1447
}
1448

    
1449

    
1450
static gnutls_certificate_credentials_t vnc_tls_initialize_x509_cred(VncState *vs)
1451
{
1452
    gnutls_certificate_credentials_t x509_cred;
1453
    int ret;
1454

    
1455
    if (!vs->x509cacert) {
1456
        VNC_DEBUG("No CA x509 certificate specified\n");
1457
        return NULL;
1458
    }
1459
    if (!vs->x509cert) {
1460
        VNC_DEBUG("No server x509 certificate specified\n");
1461
        return NULL;
1462
    }
1463
    if (!vs->x509key) {
1464
        VNC_DEBUG("No server private key specified\n");
1465
        return NULL;
1466
    }
1467

    
1468
    if ((ret = gnutls_certificate_allocate_credentials(&x509_cred)) < 0) {
1469
        VNC_DEBUG("Cannot allocate credentials %s\n", gnutls_strerror(ret));
1470
        return NULL;
1471
    }
1472
    if ((ret = gnutls_certificate_set_x509_trust_file(x509_cred,
1473
                                                      vs->x509cacert,
1474
                                                      GNUTLS_X509_FMT_PEM)) < 0) {
1475
        VNC_DEBUG("Cannot load CA certificate %s\n", gnutls_strerror(ret));
1476
        gnutls_certificate_free_credentials(x509_cred);
1477
        return NULL;
1478
    }
1479

    
1480
    if ((ret = gnutls_certificate_set_x509_key_file (x509_cred,
1481
                                                     vs->x509cert,
1482
                                                     vs->x509key,
1483
                                                     GNUTLS_X509_FMT_PEM)) < 0) {
1484
        VNC_DEBUG("Cannot load certificate & key %s\n", gnutls_strerror(ret));
1485
        gnutls_certificate_free_credentials(x509_cred);
1486
        return NULL;
1487
    }
1488

    
1489
    if (vs->x509cacrl) {
1490
        if ((ret = gnutls_certificate_set_x509_crl_file(x509_cred,
1491
                                                        vs->x509cacrl,
1492
                                                        GNUTLS_X509_FMT_PEM)) < 0) {
1493
            VNC_DEBUG("Cannot load CRL %s\n", gnutls_strerror(ret));
1494
            gnutls_certificate_free_credentials(x509_cred);
1495
            return NULL;
1496
        }
1497
    }
1498

    
1499
    gnutls_certificate_set_dh_params (x509_cred, dh_params);
1500

    
1501
    return x509_cred;
1502
}
1503

    
1504
static int vnc_validate_certificate(struct VncState *vs)
1505
{
1506
    int ret;
1507
    unsigned int status;
1508
    const gnutls_datum_t *certs;
1509
    unsigned int nCerts, i;
1510
    time_t now;
1511

    
1512
    VNC_DEBUG("Validating client certificate\n");
1513
    if ((ret = gnutls_certificate_verify_peers2 (vs->tls_session, &status)) < 0) {
1514
        VNC_DEBUG("Verify failed %s\n", gnutls_strerror(ret));
1515
        return -1;
1516
    }
1517

    
1518
    if ((now = time(NULL)) == ((time_t)-1)) {
1519
        return -1;
1520
    }
1521

    
1522
    if (status != 0) {
1523
        if (status & GNUTLS_CERT_INVALID)
1524
            VNC_DEBUG("The certificate is not trusted.\n");
1525

    
1526
        if (status & GNUTLS_CERT_SIGNER_NOT_FOUND)
1527
            VNC_DEBUG("The certificate hasn't got a known issuer.\n");
1528

    
1529
        if (status & GNUTLS_CERT_REVOKED)
1530
            VNC_DEBUG("The certificate has been revoked.\n");
1531

    
1532
        if (status & GNUTLS_CERT_INSECURE_ALGORITHM)
1533
            VNC_DEBUG("The certificate uses an insecure algorithm\n");
1534

    
1535
        return -1;
1536
    } else {
1537
        VNC_DEBUG("Certificate is valid!\n");
1538
    }
1539

    
1540
    /* Only support x509 for now */
1541
    if (gnutls_certificate_type_get(vs->tls_session) != GNUTLS_CRT_X509)
1542
        return -1;
1543

    
1544
    if (!(certs = gnutls_certificate_get_peers(vs->tls_session, &nCerts)))
1545
        return -1;
1546

    
1547
    for (i = 0 ; i < nCerts ; i++) {
1548
        gnutls_x509_crt_t cert;
1549
        VNC_DEBUG ("Checking certificate chain %d\n", i);
1550
        if (gnutls_x509_crt_init (&cert) < 0)
1551
            return -1;
1552

    
1553
        if (gnutls_x509_crt_import(cert, &certs[i], GNUTLS_X509_FMT_DER) < 0) {
1554
            gnutls_x509_crt_deinit (cert);
1555
            return -1;
1556
        }
1557

    
1558
        if (gnutls_x509_crt_get_expiration_time (cert) < now) {
1559
            VNC_DEBUG("The certificate has expired\n");
1560
            gnutls_x509_crt_deinit (cert);
1561
            return -1;
1562
        }
1563

    
1564
        if (gnutls_x509_crt_get_activation_time (cert) > now) {
1565
            VNC_DEBUG("The certificate is not yet activated\n");
1566
            gnutls_x509_crt_deinit (cert);
1567
            return -1;
1568
        }
1569

    
1570
        if (gnutls_x509_crt_get_activation_time (cert) > now) {
1571
            VNC_DEBUG("The certificate is not yet activated\n");
1572
            gnutls_x509_crt_deinit (cert);
1573
            return -1;
1574
        }
1575

    
1576
        gnutls_x509_crt_deinit (cert);
1577
    }
1578

    
1579
    return 0;
1580
}
1581

    
1582

    
1583
static int start_auth_vencrypt_subauth(VncState *vs)
1584
{
1585
    switch (vs->subauth) {
1586
    case VNC_AUTH_VENCRYPT_TLSNONE:
1587
    case VNC_AUTH_VENCRYPT_X509NONE:
1588
       VNC_DEBUG("Accept TLS auth none\n");
1589
       vnc_write_u32(vs, 0); /* Accept auth completion */
1590
       vnc_read_when(vs, protocol_client_init, 1);
1591
       break;
1592

    
1593
    case VNC_AUTH_VENCRYPT_TLSVNC:
1594
    case VNC_AUTH_VENCRYPT_X509VNC:
1595
       VNC_DEBUG("Start TLS auth VNC\n");
1596
       return start_auth_vnc(vs);
1597

    
1598
    default: /* Should not be possible, but just in case */
1599
       VNC_DEBUG("Reject auth %d\n", vs->auth);
1600
       vnc_write_u8(vs, 1);
1601
       if (vs->minor >= 8) {
1602
           static const char err[] = "Unsupported authentication type";
1603
           vnc_write_u32(vs, sizeof(err));
1604
           vnc_write(vs, err, sizeof(err));
1605
       }
1606
       vnc_client_error(vs);
1607
    }
1608

    
1609
    return 0;
1610
}
1611

    
1612
static void vnc_handshake_io(void *opaque);
1613

    
1614
static int vnc_continue_handshake(struct VncState *vs) {
1615
    int ret;
1616

    
1617
    if ((ret = gnutls_handshake(vs->tls_session)) < 0) {
1618
       if (!gnutls_error_is_fatal(ret)) {
1619
           VNC_DEBUG("Handshake interrupted (blocking)\n");
1620
           if (!gnutls_record_get_direction(vs->tls_session))
1621
               qemu_set_fd_handler(vs->csock, vnc_handshake_io, NULL, vs);
1622
           else
1623
               qemu_set_fd_handler(vs->csock, NULL, vnc_handshake_io, vs);
1624
           return 0;
1625
       }
1626
       VNC_DEBUG("Handshake failed %s\n", gnutls_strerror(ret));
1627
       vnc_client_error(vs);
1628
       return -1;
1629
    }
1630

    
1631
    if (vs->x509verify) {
1632
        if (vnc_validate_certificate(vs) < 0) {
1633
            VNC_DEBUG("Client verification failed\n");
1634
            vnc_client_error(vs);
1635
            return -1;
1636
        } else {
1637
            VNC_DEBUG("Client verification passed\n");
1638
        }
1639
    }
1640

    
1641
    VNC_DEBUG("Handshake done, switching to TLS data mode\n");
1642
    vs->wiremode = VNC_WIREMODE_TLS;
1643
    qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, vnc_client_write, vs);
1644

    
1645
    return start_auth_vencrypt_subauth(vs);
1646
}
1647

    
1648
static void vnc_handshake_io(void *opaque) {
1649
    struct VncState *vs = (struct VncState *)opaque;
1650

    
1651
    VNC_DEBUG("Handshake IO continue\n");
1652
    vnc_continue_handshake(vs);
1653
}
1654

    
1655
#define NEED_X509_AUTH(vs)                              \
1656
    ((vs)->subauth == VNC_AUTH_VENCRYPT_X509NONE ||   \
1657
     (vs)->subauth == VNC_AUTH_VENCRYPT_X509VNC ||    \
1658
     (vs)->subauth == VNC_AUTH_VENCRYPT_X509PLAIN)
1659

    
1660

    
1661
static int vnc_start_tls(struct VncState *vs) {
1662
    static const int cert_type_priority[] = { GNUTLS_CRT_X509, 0 };
1663
    static const int protocol_priority[]= { GNUTLS_TLS1_1, GNUTLS_TLS1_0, GNUTLS_SSL3, 0 };
1664
    static const int kx_anon[] = {GNUTLS_KX_ANON_DH, 0};
1665
    static const int kx_x509[] = {GNUTLS_KX_DHE_DSS, GNUTLS_KX_RSA, GNUTLS_KX_DHE_RSA, GNUTLS_KX_SRP, 0};
1666

    
1667
    VNC_DEBUG("Do TLS setup\n");
1668
    if (vnc_tls_initialize() < 0) {
1669
        VNC_DEBUG("Failed to init TLS\n");
1670
        vnc_client_error(vs);
1671
        return -1;
1672
    }
1673
    if (vs->tls_session == NULL) {
1674
        if (gnutls_init(&vs->tls_session, GNUTLS_SERVER) < 0) {
1675
            vnc_client_error(vs);
1676
            return -1;
1677
        }
1678

    
1679
        if (gnutls_set_default_priority(vs->tls_session) < 0) {
1680
            gnutls_deinit(vs->tls_session);
1681
            vs->tls_session = NULL;
1682
            vnc_client_error(vs);
1683
            return -1;
1684
        }
1685

    
1686
        if (gnutls_kx_set_priority(vs->tls_session, NEED_X509_AUTH(vs) ? kx_x509 : kx_anon) < 0) {
1687
            gnutls_deinit(vs->tls_session);
1688
            vs->tls_session = NULL;
1689
            vnc_client_error(vs);
1690
            return -1;
1691
        }
1692

    
1693
        if (gnutls_certificate_type_set_priority(vs->tls_session, cert_type_priority) < 0) {
1694
            gnutls_deinit(vs->tls_session);
1695
            vs->tls_session = NULL;
1696
            vnc_client_error(vs);
1697
            return -1;
1698
        }
1699

    
1700
        if (gnutls_protocol_set_priority(vs->tls_session, protocol_priority) < 0) {
1701
            gnutls_deinit(vs->tls_session);
1702
            vs->tls_session = NULL;
1703
            vnc_client_error(vs);
1704
            return -1;
1705
        }
1706

    
1707
        if (NEED_X509_AUTH(vs)) {
1708
            gnutls_certificate_server_credentials x509_cred = vnc_tls_initialize_x509_cred(vs);
1709
            if (!x509_cred) {
1710
                gnutls_deinit(vs->tls_session);
1711
                vs->tls_session = NULL;
1712
                vnc_client_error(vs);
1713
                return -1;
1714
            }
1715
            if (gnutls_credentials_set(vs->tls_session, GNUTLS_CRD_CERTIFICATE, x509_cred) < 0) {
1716
                gnutls_deinit(vs->tls_session);
1717
                vs->tls_session = NULL;
1718
                gnutls_certificate_free_credentials(x509_cred);
1719
                vnc_client_error(vs);
1720
                return -1;
1721
            }
1722
            if (vs->x509verify) {
1723
                VNC_DEBUG("Requesting a client certificate\n");
1724
                gnutls_certificate_server_set_request (vs->tls_session, GNUTLS_CERT_REQUEST);
1725
            }
1726

    
1727
        } else {
1728
            gnutls_anon_server_credentials anon_cred = vnc_tls_initialize_anon_cred();
1729
            if (!anon_cred) {
1730
                gnutls_deinit(vs->tls_session);
1731
                vs->tls_session = NULL;
1732
                vnc_client_error(vs);
1733
                return -1;
1734
            }
1735
            if (gnutls_credentials_set(vs->tls_session, GNUTLS_CRD_ANON, anon_cred) < 0) {
1736
                gnutls_deinit(vs->tls_session);
1737
                vs->tls_session = NULL;
1738
                gnutls_anon_free_server_credentials(anon_cred);
1739
                vnc_client_error(vs);
1740
                return -1;
1741
            }
1742
        }
1743

    
1744
        gnutls_transport_set_ptr(vs->tls_session, (gnutls_transport_ptr_t)vs);
1745
        gnutls_transport_set_push_function(vs->tls_session, vnc_tls_push);
1746
        gnutls_transport_set_pull_function(vs->tls_session, vnc_tls_pull);
1747
    }
1748

    
1749
    VNC_DEBUG("Start TLS handshake process\n");
1750
    return vnc_continue_handshake(vs);
1751
}
1752

    
1753
static int protocol_client_vencrypt_auth(VncState *vs, uint8_t *data, size_t len)
1754
{
1755
    int auth = read_u32(data, 0);
1756

    
1757
    if (auth != vs->subauth) {
1758
        VNC_DEBUG("Rejecting auth %d\n", auth);
1759
        vnc_write_u8(vs, 0); /* Reject auth */
1760
        vnc_flush(vs);
1761
        vnc_client_error(vs);
1762
    } else {
1763
        VNC_DEBUG("Accepting auth %d, starting handshake\n", auth);
1764
        vnc_write_u8(vs, 1); /* Accept auth */
1765
        vnc_flush(vs);
1766

    
1767
        if (vnc_start_tls(vs) < 0) {
1768
            VNC_DEBUG("Failed to complete TLS\n");
1769
            return 0;
1770
        }
1771

    
1772
        if (vs->wiremode == VNC_WIREMODE_TLS) {
1773
            VNC_DEBUG("Starting VeNCrypt subauth\n");
1774
            return start_auth_vencrypt_subauth(vs);
1775
        } else {
1776
            VNC_DEBUG("TLS handshake blocked\n");
1777
            return 0;
1778
        }
1779
    }
1780
    return 0;
1781
}
1782

    
1783
static int protocol_client_vencrypt_init(VncState *vs, uint8_t *data, size_t len)
1784
{
1785
    if (data[0] != 0 ||
1786
        data[1] != 2) {
1787
        VNC_DEBUG("Unsupported VeNCrypt protocol %d.%d\n", (int)data[0], (int)data[1]);
1788
        vnc_write_u8(vs, 1); /* Reject version */
1789
        vnc_flush(vs);
1790
        vnc_client_error(vs);
1791
    } else {
1792
        VNC_DEBUG("Sending allowed auth %d\n", vs->subauth);
1793
        vnc_write_u8(vs, 0); /* Accept version */
1794
        vnc_write_u8(vs, 1); /* Number of sub-auths */
1795
        vnc_write_u32(vs, vs->subauth); /* The supported auth */
1796
        vnc_flush(vs);
1797
        vnc_read_when(vs, protocol_client_vencrypt_auth, 4);
1798
    }
1799
    return 0;
1800
}
1801

    
1802
static int start_auth_vencrypt(VncState *vs)
1803
{
1804
    /* Send VeNCrypt version 0.2 */
1805
    vnc_write_u8(vs, 0);
1806
    vnc_write_u8(vs, 2);
1807

    
1808
    vnc_read_when(vs, protocol_client_vencrypt_init, 2);
1809
    return 0;
1810
}
1811
#endif /* CONFIG_VNC_TLS */
1812

    
1813
static int protocol_client_auth(VncState *vs, uint8_t *data, size_t len)
1814
{
1815
    /* We only advertise 1 auth scheme at a time, so client
1816
     * must pick the one we sent. Verify this */
1817
    if (data[0] != vs->auth) { /* Reject auth */
1818
       VNC_DEBUG("Reject auth %d\n", (int)data[0]);
1819
       vnc_write_u32(vs, 1);
1820
       if (vs->minor >= 8) {
1821
           static const char err[] = "Authentication failed";
1822
           vnc_write_u32(vs, sizeof(err));
1823
           vnc_write(vs, err, sizeof(err));
1824
       }
1825
       vnc_client_error(vs);
1826
    } else { /* Accept requested auth */
1827
       VNC_DEBUG("Client requested auth %d\n", (int)data[0]);
1828
       switch (vs->auth) {
1829
       case VNC_AUTH_NONE:
1830
           VNC_DEBUG("Accept auth none\n");
1831
           if (vs->minor >= 8) {
1832
               vnc_write_u32(vs, 0); /* Accept auth completion */
1833
               vnc_flush(vs);
1834
           }
1835
           vnc_read_when(vs, protocol_client_init, 1);
1836
           break;
1837

    
1838
       case VNC_AUTH_VNC:
1839
           VNC_DEBUG("Start VNC auth\n");
1840
           return start_auth_vnc(vs);
1841

    
1842
#if CONFIG_VNC_TLS
1843
       case VNC_AUTH_VENCRYPT:
1844
           VNC_DEBUG("Accept VeNCrypt auth\n");;
1845
           return start_auth_vencrypt(vs);
1846
#endif /* CONFIG_VNC_TLS */
1847

    
1848
       default: /* Should not be possible, but just in case */
1849
           VNC_DEBUG("Reject auth %d\n", vs->auth);
1850
           vnc_write_u8(vs, 1);
1851
           if (vs->minor >= 8) {
1852
               static const char err[] = "Authentication failed";
1853
               vnc_write_u32(vs, sizeof(err));
1854
               vnc_write(vs, err, sizeof(err));
1855
           }
1856
           vnc_client_error(vs);
1857
       }
1858
    }
1859
    return 0;
1860
}
1861

    
1862
static int protocol_version(VncState *vs, uint8_t *version, size_t len)
1863
{
1864
    char local[13];
1865

    
1866
    memcpy(local, version, 12);
1867
    local[12] = 0;
1868

    
1869
    if (sscanf(local, "RFB %03d.%03d\n", &vs->major, &vs->minor) != 2) {
1870
        VNC_DEBUG("Malformed protocol version %s\n", local);
1871
        vnc_client_error(vs);
1872
        return 0;
1873
    }
1874
    VNC_DEBUG("Client request protocol version %d.%d\n", vs->major, vs->minor);
1875
    if (vs->major != 3 ||
1876
        (vs->minor != 3 &&
1877
         vs->minor != 4 &&
1878
         vs->minor != 5 &&
1879
         vs->minor != 7 &&
1880
         vs->minor != 8)) {
1881
        VNC_DEBUG("Unsupported client version\n");
1882
        vnc_write_u32(vs, VNC_AUTH_INVALID);
1883
        vnc_flush(vs);
1884
        vnc_client_error(vs);
1885
        return 0;
1886
    }
1887
    /* Some broken clients report v3.4 or v3.5, which spec requires to be treated
1888
     * as equivalent to v3.3 by servers
1889
     */
1890
    if (vs->minor == 4 || vs->minor == 5)
1891
        vs->minor = 3;
1892

    
1893
    if (vs->minor == 3) {
1894
        if (vs->auth == VNC_AUTH_NONE) {
1895
            VNC_DEBUG("Tell client auth none\n");
1896
            vnc_write_u32(vs, vs->auth);
1897
            vnc_flush(vs);
1898
            vnc_read_when(vs, protocol_client_init, 1);
1899
       } else if (vs->auth == VNC_AUTH_VNC) {
1900
            VNC_DEBUG("Tell client VNC auth\n");
1901
            vnc_write_u32(vs, vs->auth);
1902
            vnc_flush(vs);
1903
            start_auth_vnc(vs);
1904
       } else {
1905
            VNC_DEBUG("Unsupported auth %d for protocol 3.3\n", vs->auth);
1906
            vnc_write_u32(vs, VNC_AUTH_INVALID);
1907
            vnc_flush(vs);
1908
            vnc_client_error(vs);
1909
       }
1910
    } else {
1911
        VNC_DEBUG("Telling client we support auth %d\n", vs->auth);
1912
        vnc_write_u8(vs, 1); /* num auth */
1913
        vnc_write_u8(vs, vs->auth);
1914
        vnc_read_when(vs, protocol_client_auth, 1);
1915
        vnc_flush(vs);
1916
    }
1917

    
1918
    return 0;
1919
}
1920

    
1921
static void vnc_connect(VncState *vs)
1922
{
1923
    VNC_DEBUG("New client on socket %d\n", vs->csock);
1924
    vs->ds->idle = 0;
1925
    socket_set_nonblock(vs->csock);
1926
    qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, vs);
1927
    vnc_write(vs, "RFB 003.008\n", 12);
1928
    vnc_flush(vs);
1929
    vnc_read_when(vs, protocol_version, 12);
1930
    memset(vs->old_data, 0, vs->ds->linesize * vs->ds->height);
1931
    memset(vs->dirty_row, 0xFF, sizeof(vs->dirty_row));
1932
    vs->has_resize = 0;
1933
    vs->has_hextile = 0;
1934
    vs->ds->dpy_copy = NULL;
1935
    vnc_update_client(vs);
1936
}
1937

    
1938
static void vnc_listen_read(void *opaque)
1939
{
1940
    VncState *vs = opaque;
1941
    struct sockaddr_in addr;
1942
    socklen_t addrlen = sizeof(addr);
1943

    
1944
    /* Catch-up */
1945
    vga_hw_update();
1946

    
1947
    vs->csock = accept(vs->lsock, (struct sockaddr *)&addr, &addrlen);
1948
    if (vs->csock != -1) {
1949
        vnc_connect(vs);
1950
    }
1951
}
1952

    
1953
extern int parse_host_port(struct sockaddr_in *saddr, const char *str);
1954

    
1955
void vnc_display_init(DisplayState *ds)
1956
{
1957
    VncState *vs;
1958

    
1959
    vs = qemu_mallocz(sizeof(VncState));
1960
    if (!vs)
1961
        exit(1);
1962

    
1963
    ds->opaque = vs;
1964
    ds->idle = 1;
1965
    vnc_state = vs;
1966
    vs->display = NULL;
1967
    vs->password = NULL;
1968

    
1969
    vs->lsock = -1;
1970
    vs->csock = -1;
1971
    vs->depth = 4;
1972
    vs->last_x = -1;
1973
    vs->last_y = -1;
1974

    
1975
    vs->ds = ds;
1976

    
1977
    if (!keyboard_layout)
1978
        keyboard_layout = "en-us";
1979

    
1980
    vs->kbd_layout = init_keyboard_layout(keyboard_layout);
1981
    if (!vs->kbd_layout)
1982
        exit(1);
1983

    
1984
    vs->timer = qemu_new_timer(rt_clock, vnc_update_client, vs);
1985

    
1986
    vs->ds->data = NULL;
1987
    vs->ds->dpy_update = vnc_dpy_update;
1988
    vs->ds->dpy_resize = vnc_dpy_resize;
1989
    vs->ds->dpy_refresh = NULL;
1990

    
1991
    vnc_dpy_resize(vs->ds, 640, 400);
1992
}
1993

    
1994
#if CONFIG_VNC_TLS
1995
static int vnc_set_x509_credential(VncState *vs,
1996
                                   const char *certdir,
1997
                                   const char *filename,
1998
                                   char **cred,
1999
                                   int ignoreMissing)
2000
{
2001
    struct stat sb;
2002

    
2003
    if (*cred) {
2004
        qemu_free(*cred);
2005
        *cred = NULL;
2006
    }
2007

    
2008
    if (!(*cred = qemu_malloc(strlen(certdir) + strlen(filename) + 2)))
2009
        return -1;
2010

    
2011
    strcpy(*cred, certdir);
2012
    strcat(*cred, "/");
2013
    strcat(*cred, filename);
2014

    
2015
    VNC_DEBUG("Check %s\n", *cred);
2016
    if (stat(*cred, &sb) < 0) {
2017
        qemu_free(*cred);
2018
        *cred = NULL;
2019
        if (ignoreMissing && errno == ENOENT)
2020
            return 0;
2021
        return -1;
2022
    }
2023

    
2024
    return 0;
2025
}
2026

    
2027
static int vnc_set_x509_credential_dir(VncState *vs,
2028
                                       const char *certdir)
2029
{
2030
    if (vnc_set_x509_credential(vs, certdir, X509_CA_CERT_FILE, &vs->x509cacert, 0) < 0)
2031
        goto cleanup;
2032
    if (vnc_set_x509_credential(vs, certdir, X509_CA_CRL_FILE, &vs->x509cacrl, 1) < 0)
2033
        goto cleanup;
2034
    if (vnc_set_x509_credential(vs, certdir, X509_SERVER_CERT_FILE, &vs->x509cert, 0) < 0)
2035
        goto cleanup;
2036
    if (vnc_set_x509_credential(vs, certdir, X509_SERVER_KEY_FILE, &vs->x509key, 0) < 0)
2037
        goto cleanup;
2038

    
2039
    return 0;
2040

    
2041
 cleanup:
2042
    qemu_free(vs->x509cacert);
2043
    qemu_free(vs->x509cacrl);
2044
    qemu_free(vs->x509cert);
2045
    qemu_free(vs->x509key);
2046
    vs->x509cacert = vs->x509cacrl = vs->x509cert = vs->x509key = NULL;
2047
    return -1;
2048
}
2049
#endif /* CONFIG_VNC_TLS */
2050

    
2051
void vnc_display_close(DisplayState *ds)
2052
{
2053
    VncState *vs = ds ? (VncState *)ds->opaque : vnc_state;
2054

    
2055
    if (vs->display) {
2056
        qemu_free(vs->display);
2057
        vs->display = NULL;
2058
    }
2059
    if (vs->lsock != -1) {
2060
        qemu_set_fd_handler2(vs->lsock, NULL, NULL, NULL, NULL);
2061
        close(vs->lsock);
2062
        vs->lsock = -1;
2063
    }
2064
    if (vs->csock != -1) {
2065
        qemu_set_fd_handler2(vs->csock, NULL, NULL, NULL, NULL);
2066
        closesocket(vs->csock);
2067
        vs->csock = -1;
2068
        buffer_reset(&vs->input);
2069
        buffer_reset(&vs->output);
2070
        vs->need_update = 0;
2071
#if CONFIG_VNC_TLS
2072
        if (vs->tls_session) {
2073
            gnutls_deinit(vs->tls_session);
2074
            vs->tls_session = NULL;
2075
        }
2076
        vs->wiremode = VNC_WIREMODE_CLEAR;
2077
#endif /* CONFIG_VNC_TLS */
2078
    }
2079
    vs->auth = VNC_AUTH_INVALID;
2080
#if CONFIG_VNC_TLS
2081
    vs->subauth = VNC_AUTH_INVALID;
2082
    vs->x509verify = 0;
2083
#endif
2084
}
2085

    
2086
int vnc_display_password(DisplayState *ds, const char *password)
2087
{
2088
    VncState *vs = ds ? (VncState *)ds->opaque : vnc_state;
2089

    
2090
    if (vs->password) {
2091
        qemu_free(vs->password);
2092
        vs->password = NULL;
2093
    }
2094
    if (password && password[0]) {
2095
        if (!(vs->password = qemu_strdup(password)))
2096
            return -1;
2097
    }
2098

    
2099
    return 0;
2100
}
2101

    
2102
int vnc_display_open(DisplayState *ds, const char *display)
2103
{
2104
    struct sockaddr *addr;
2105
    struct sockaddr_in iaddr;
2106
#ifndef _WIN32
2107
    struct sockaddr_un uaddr;
2108
    const char *p;
2109
#endif
2110
    int reuse_addr, ret;
2111
    socklen_t addrlen;
2112
    VncState *vs = ds ? (VncState *)ds->opaque : vnc_state;
2113
    const char *options;
2114
    int password = 0;
2115
    int reverse = 0;
2116
#if CONFIG_VNC_TLS
2117
    int tls = 0, x509 = 0;
2118
#endif
2119

    
2120
    vnc_display_close(ds);
2121
    if (strcmp(display, "none") == 0)
2122
        return 0;
2123

    
2124
    if (!(vs->display = strdup(display)))
2125
        return -1;
2126

    
2127
    options = display;
2128
    while ((options = strchr(options, ','))) {
2129
        options++;
2130
        if (strncmp(options, "password", 8) == 0) {
2131
            password = 1; /* Require password auth */
2132
        } else if (strncmp(options, "reverse", 7) == 0) {
2133
            reverse = 1;
2134
#if CONFIG_VNC_TLS
2135
        } else if (strncmp(options, "tls", 3) == 0) {
2136
            tls = 1; /* Require TLS */
2137
        } else if (strncmp(options, "x509", 4) == 0) {
2138
            char *start, *end;
2139
            x509 = 1; /* Require x509 certificates */
2140
            if (strncmp(options, "x509verify", 10) == 0)
2141
                vs->x509verify = 1; /* ...and verify client certs */
2142

    
2143
            /* Now check for 'x509=/some/path' postfix
2144
             * and use that to setup x509 certificate/key paths */
2145
            start = strchr(options, '=');
2146
            end = strchr(options, ',');
2147
            if (start && (!end || (start < end))) {
2148
                int len = end ? end-(start+1) : strlen(start+1);
2149
                char *path = qemu_malloc(len+1);
2150
                strncpy(path, start+1, len);
2151
                path[len] = '\0';
2152
                VNC_DEBUG("Trying certificate path '%s'\n", path);
2153
                if (vnc_set_x509_credential_dir(vs, path) < 0) {
2154
                    fprintf(stderr, "Failed to find x509 certificates/keys in %s\n", path);
2155
                    qemu_free(path);
2156
                    qemu_free(vs->display);
2157
                    vs->display = NULL;
2158
                    return -1;
2159
                }
2160
                qemu_free(path);
2161
            } else {
2162
                fprintf(stderr, "No certificate path provided\n");
2163
                qemu_free(vs->display);
2164
                vs->display = NULL;
2165
                return -1;
2166
            }
2167
#endif
2168
        }
2169
    }
2170

    
2171
    if (password) {
2172
#if CONFIG_VNC_TLS
2173
        if (tls) {
2174
            vs->auth = VNC_AUTH_VENCRYPT;
2175
            if (x509) {
2176
                VNC_DEBUG("Initializing VNC server with x509 password auth\n");
2177
                vs->subauth = VNC_AUTH_VENCRYPT_X509VNC;
2178
            } else {
2179
                VNC_DEBUG("Initializing VNC server with TLS password auth\n");
2180
                vs->subauth = VNC_AUTH_VENCRYPT_TLSVNC;
2181
            }
2182
        } else {
2183
#endif
2184
            VNC_DEBUG("Initializing VNC server with password auth\n");
2185
            vs->auth = VNC_AUTH_VNC;
2186
#if CONFIG_VNC_TLS
2187
            vs->subauth = VNC_AUTH_INVALID;
2188
        }
2189
#endif
2190
    } else {
2191
#if CONFIG_VNC_TLS
2192
        if (tls) {
2193
            vs->auth = VNC_AUTH_VENCRYPT;
2194
            if (x509) {
2195
                VNC_DEBUG("Initializing VNC server with x509 no auth\n");
2196
                vs->subauth = VNC_AUTH_VENCRYPT_X509NONE;
2197
            } else {
2198
                VNC_DEBUG("Initializing VNC server with TLS no auth\n");
2199
                vs->subauth = VNC_AUTH_VENCRYPT_TLSNONE;
2200
            }
2201
        } else {
2202
#endif
2203
            VNC_DEBUG("Initializing VNC server with no auth\n");
2204
            vs->auth = VNC_AUTH_NONE;
2205
#if CONFIG_VNC_TLS
2206
            vs->subauth = VNC_AUTH_INVALID;
2207
        }
2208
#endif
2209
    }
2210
#ifndef _WIN32
2211
    if (strstart(display, "unix:", &p)) {
2212
        addr = (struct sockaddr *)&uaddr;
2213
        addrlen = sizeof(uaddr);
2214

    
2215
        vs->lsock = socket(PF_UNIX, SOCK_STREAM, 0);
2216
        if (vs->lsock == -1) {
2217
            fprintf(stderr, "Could not create socket\n");
2218
            free(vs->display);
2219
            vs->display = NULL;
2220
            return -1;
2221
        }
2222

    
2223
        uaddr.sun_family = AF_UNIX;
2224
        memset(uaddr.sun_path, 0, 108);
2225
        snprintf(uaddr.sun_path, 108, "%s", p);
2226

    
2227
        if (!reverse) {
2228
            unlink(uaddr.sun_path);
2229
        }
2230
    } else
2231
#endif
2232
    {
2233
        addr = (struct sockaddr *)&iaddr;
2234
        addrlen = sizeof(iaddr);
2235

    
2236
        if (parse_host_port(&iaddr, display) < 0) {
2237
            fprintf(stderr, "Could not parse VNC address\n");
2238
            free(vs->display);
2239
            vs->display = NULL;
2240
            return -1;
2241
        }
2242

    
2243
        iaddr.sin_port = htons(ntohs(iaddr.sin_port) + (reverse ? 0 : 5900));
2244

    
2245
        vs->lsock = socket(PF_INET, SOCK_STREAM, 0);
2246
        if (vs->lsock == -1) {
2247
            fprintf(stderr, "Could not create socket\n");
2248
            free(vs->display);
2249
            vs->display = NULL;
2250
            return -1;
2251
        }
2252

    
2253
        reuse_addr = 1;
2254
        ret = setsockopt(vs->lsock, SOL_SOCKET, SO_REUSEADDR,
2255
                         (const char *)&reuse_addr, sizeof(reuse_addr));
2256
        if (ret == -1) {
2257
            fprintf(stderr, "setsockopt() failed\n");
2258
            close(vs->lsock);
2259
            vs->lsock = -1;
2260
            free(vs->display);
2261
            vs->display = NULL;
2262
            return -1;
2263
        }
2264
    }
2265

    
2266
    if (reverse) {
2267
        if (connect(vs->lsock, addr, addrlen) == -1) {
2268
            fprintf(stderr, "Connection to VNC client failed\n");
2269
            close(vs->lsock);
2270
            vs->lsock = -1;
2271
            free(vs->display);
2272
            vs->display = NULL;
2273
            return -1;
2274
        } else {
2275
            vs->csock = vs->lsock;
2276
            vs->lsock = -1;
2277
            vnc_connect(vs);
2278
            return 0;
2279
        }
2280
    }
2281

    
2282
    if (bind(vs->lsock, addr, addrlen) == -1) {
2283
        fprintf(stderr, "bind() failed\n");
2284
        close(vs->lsock);
2285
        vs->lsock = -1;
2286
        free(vs->display);
2287
        vs->display = NULL;
2288
        return -1;
2289
    }
2290

    
2291
    if (listen(vs->lsock, 1) == -1) {
2292
        fprintf(stderr, "listen() failed\n");
2293
        close(vs->lsock);
2294
        vs->lsock = -1;
2295
        free(vs->display);
2296
        vs->display = NULL;
2297
        return -1;
2298
    }
2299

    
2300
    return qemu_set_fd_handler2(vs->lsock, vnc_listen_poll, vnc_listen_read, NULL, vs);
2301
}