blob: 6a87498c64bb368a38a666d2a48fd6ccb157cb32 [file] [log] [blame]
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +00001/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
2 *
3 * This is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This software is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16 * USA.
17 */
18//
19// CSecurityVncAuth
20//
21// XXX not thread-safe, because d3des isn't - do we need to worry about this?
22//
23
24#include <string.h>
25#include <stdio.h>
Pierre Ossman0068a4f2015-11-09 15:48:19 +010026
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000027#include <rfb/CConnection.h>
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000028#include <rfb/Password.h>
29#include <rfb/CSecurityVncAuth.h>
30#include <rfb/util.h>
Adam Tkacb10489b2010-04-23 14:16:04 +000031#include <rfb/Security.h>
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000032extern "C" {
33#include <rfb/d3des.h>
34}
35
Pierre Ossman0068a4f2015-11-09 15:48:19 +010036#include <rdr/InStream.h>
37#include <rdr/OutStream.h>
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000038
39using namespace rfb;
40
41static const int vncAuthChallengeSize = 16;
42
Pierre Ossmanad2b3c42018-09-21 15:31:11 +020043bool CSecurityVncAuth::processMsg()
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000044{
45 rdr::InStream* is = cc->getInStream();
46 rdr::OutStream* os = cc->getOutStream();
47
48 // Read the challenge & obtain the user's password
49 rdr::U8 challenge[vncAuthChallengeSize];
50 is->readBytes(challenge, vncAuthChallengeSize);
51 PlainPasswd passwd;
Pierre Ossmandaf3d882017-09-01 11:14:35 +020052 (CSecurity::upg)->getUserPasswd(cc->isSecure(), 0, &passwd.buf);
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000053
54 // Calculate the correct response
55 rdr::U8 key[8];
56 int pwdLen = strlen(passwd.buf);
57 for (int i=0; i<8; i++)
58 key[i] = i<pwdLen ? passwd.buf[i] : 0;
59 deskey(key, EN0);
60 for (int j = 0; j < vncAuthChallengeSize; j += 8)
61 des(challenge+j, challenge+j);
62
63 // Return the response to the server
64 os->writeBytes(challenge, vncAuthChallengeSize);
65 os->flush();
66 return true;
67}