Moved load_licence/save_licence to licence.c. Removed SAVE_LICENCE cond.

git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@316 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
Peter Åstrand 2003-02-10 12:56:34 +00:00
parent cbb156faa7
commit 2dd0b246fb
2 changed files with 166 additions and 167 deletions

175
licence.c
View File

@ -18,6 +18,11 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include "rdesktop.h" #include "rdesktop.h"
#ifdef WITH_OPENSSL #ifdef WITH_OPENSSL
@ -34,6 +39,166 @@ static uint8 licence_sign_key[16];
BOOL licence_issued = False; BOOL licence_issued = False;
int
load_licence(unsigned char **data)
{
char *path;
char *home;
struct stat st;
int fd;
home = getenv("HOME");
if (home == NULL)
return -1;
path = xmalloc(strlen(home) + strlen(hostname) + 20);
sprintf(path, "%s/.rdesktop/licence.%s", home, hostname);
fd = open(path, O_RDONLY);
if (fd == -1)
return -1;
if (fstat(fd, &st))
return -1;
*data = xmalloc(st.st_size);
return read(fd, *data, st.st_size);
}
void
save_licence(unsigned char *data, int length)
{
char *fpath; /* file path for licence */
char *fname, *fnamewrk; /* file name for licence .inkl path. */
char *home;
uint32 y;
struct flock fnfl;
int fnfd, fnwrkfd, i, wlen;
struct stream s, *s_ptr;
uint32 len;
/* Construct a stream, so that we can use macros to extract the
* licence.
*/
s_ptr = &s;
s_ptr->p = data;
/* Skip first two bytes */
in_uint16(s_ptr, len);
/* Skip three strings */
for (i = 0; i < 3; i++)
{
in_uint32(s_ptr, len);
s_ptr->p += len;
/* Make sure that we won't be past the end of data after
* reading the next length value
*/
if ((s_ptr->p) + 4 > data + length)
{
printf("Error in parsing licence key.\n");
printf("Strings %d end value %x > supplied length (%x)\n", i,
(unsigned int)s_ptr->p,
(unsigned int)data + length);
return;
}
}
in_uint32(s_ptr, len);
if (s_ptr->p + len > data + length)
{
printf("Error in parsing licence key.\n");
printf("End of licence %x > supplied length (%x)\n",
(unsigned int)s_ptr->p + len,
(unsigned int)data + length);
return;
}
home = getenv("HOME");
if (home == NULL)
return;
/* set and create the directory -- if it doesn't exist. */
fpath = xmalloc(strlen(home) + 11);
STRNCPY(fpath, home, strlen(home) + 1);
sprintf(fpath, "%s/.rdesktop", fpath);
if (mkdir(fpath, 0700) == -1 && errno != EEXIST)
{
perror("mkdir");
exit(1);
}
/* set the real licence filename, and put a write lock on it. */
fname = xmalloc(strlen(fpath) + strlen(hostname) + 10);
sprintf(fname, "%s/licence.%s", fpath, hostname);
fnfd = open(fname, O_RDONLY);
if (fnfd != -1)
{
fnfl.l_type = F_WRLCK;
fnfl.l_whence = SEEK_SET;
fnfl.l_start = 0;
fnfl.l_len = 1;
fcntl(fnfd, F_SETLK, &fnfl);
}
/* create a temporary licence file */
fnamewrk = xmalloc(strlen(fname) + 12);
for (y = 0;; y++)
{
sprintf(fnamewrk, "%s.%lu", fname, (long unsigned int)y);
fnwrkfd = open(fnamewrk, O_WRONLY | O_CREAT | O_EXCL, 0600);
if (fnwrkfd == -1)
{
if (errno == EINTR || errno == EEXIST)
continue;
perror("create");
exit(1);
}
break;
}
/* write to the licence file */
for (y = 0; y < len;)
{
do
{
wlen = write(fnwrkfd, s_ptr->p + y, len - y);
}
while (wlen == -1 && errno == EINTR);
if (wlen < 1)
{
perror("write");
unlink(fnamewrk);
exit(1);
}
y += wlen;
}
/* close the file and rename it to fname */
if (close(fnwrkfd) == -1)
{
perror("close");
unlink(fnamewrk);
exit(1);
}
if (rename(fnamewrk, fname) == -1)
{
perror("rename");
unlink(fnamewrk);
exit(1);
}
/* close the file lock on fname */
if (fnfd != -1)
{
fnfl.l_type = F_UNLCK;
fnfl.l_whence = SEEK_SET;
fnfl.l_start = 0;
fnfl.l_len = 1;
fcntl(fnfd, F_SETLK, &fnfl);
close(fnfd);
}
}
/* Generate a session key and RC4 keys, given client and server randoms */ /* Generate a session key and RC4 keys, given client and server randoms */
static void static void
licence_generate_keys(uint8 * client_key, uint8 * server_key, uint8 * client_rsa) licence_generate_keys(uint8 * client_key, uint8 * server_key, uint8 * client_rsa)
@ -59,7 +224,6 @@ licence_generate_hwid(uint8 * hwid)
strncpy((char *) (hwid + 4), hostname, LICENCE_HWID_SIZE - 4); strncpy((char *) (hwid + 4), hostname, LICENCE_HWID_SIZE - 4);
} }
#ifdef SAVE_LICENCE
/* Present an existing licence to the server */ /* Present an existing licence to the server */
static void static void
licence_present(uint8 * client_random, uint8 * rsa_data, licence_present(uint8 * client_random, uint8 * rsa_data,
@ -99,7 +263,6 @@ licence_present(uint8 * client_random, uint8 * rsa_data,
s_mark_end(s); s_mark_end(s);
sec_send(s, sec_flags); sec_send(s, sec_flags);
} }
#endif
/* Send a licence request packet */ /* Send a licence request packet */
static void static void
@ -144,13 +307,11 @@ licence_process_demand(STREAM s)
{ {
uint8 null_data[SEC_MODULUS_SIZE]; uint8 null_data[SEC_MODULUS_SIZE];
uint8 *server_random; uint8 *server_random;
#ifdef SAVE_LICENCE
uint8 signature[LICENCE_SIGNATURE_SIZE]; uint8 signature[LICENCE_SIGNATURE_SIZE];
uint8 hwid[LICENCE_HWID_SIZE]; uint8 hwid[LICENCE_HWID_SIZE];
uint8 *licence_data; uint8 *licence_data;
int licence_size; int licence_size;
RC4_KEY crypt_key; RC4_KEY crypt_key;
#endif
/* Retrieve the server random from the incoming packet */ /* Retrieve the server random from the incoming packet */
in_uint8p(s, server_random, SEC_RANDOM_SIZE); in_uint8p(s, server_random, SEC_RANDOM_SIZE);
@ -160,7 +321,6 @@ licence_process_demand(STREAM s)
memset(null_data, 0, sizeof(null_data)); memset(null_data, 0, sizeof(null_data));
licence_generate_keys(null_data, server_random, null_data); licence_generate_keys(null_data, server_random, null_data);
#ifdef SAVE_LICENCE
licence_size = load_licence(&licence_data); licence_size = load_licence(&licence_data);
if (licence_size != -1) if (licence_size != -1)
{ {
@ -176,7 +336,6 @@ licence_process_demand(STREAM s)
xfree(licence_data); xfree(licence_data);
return; return;
} }
#endif
licence_send_request(null_data, null_data, username, hostname); licence_send_request(null_data, null_data, username, hostname);
} }
@ -282,10 +441,7 @@ licence_process_issue(STREAM s)
return; return;
licence_issued = True; licence_issued = True;
#ifdef SAVE_LICENCE
save_licence(s->p, length - 2); save_licence(s->p, length - 2);
#endif
} }
/* Process a licence packet */ /* Process a licence packet */
@ -321,3 +477,4 @@ licence_process(STREAM s)
unimpl("licence tag 0x%x\n", tag); unimpl("licence tag 0x%x\n", tag);
} }
} }

View File

@ -21,7 +21,6 @@
#include <stdarg.h> /* va_list va_start va_end */ #include <stdarg.h> /* va_list va_start va_end */
#include <unistd.h> /* read close getuid getgid getpid getppid gethostname */ #include <unistd.h> /* read close getuid getgid getpid getppid gethostname */
#include <fcntl.h> /* open */ #include <fcntl.h> /* open */
#include <errno.h> /* save licence uses it. */
#include <pwd.h> /* getpwuid */ #include <pwd.h> /* getpwuid */
#include <termios.h> /* tcgetattr tcsetattr */ #include <termios.h> /* tcgetattr tcsetattr */
#include <sys/stat.h> /* stat */ #include <sys/stat.h> /* stat */
@ -514,160 +513,3 @@ hexdump(unsigned char *p, unsigned int len)
} }
} }
#ifdef SAVE_LICENCE
int
load_licence(unsigned char **data)
{
char *path;
char *home;
struct stat st;
int fd;
home = getenv("HOME");
if (home == NULL)
return -1;
path = xmalloc(strlen(home) + strlen(hostname) + 20);
sprintf(path, "%s/.rdesktop/licence.%s", home, hostname);
fd = open(path, O_RDONLY);
if (fd == -1)
return -1;
if (fstat(fd, &st))
return -1;
*data = xmalloc(st.st_size);
return read(fd, *data, st.st_size);
}
void
save_licence(unsigned char *data, int length)
{
char *fpath; /* file path for licence */
char *fname, *fnamewrk; /* file name for licence .inkl path. */
char *home;
uint32 y;
struct flock fnfl;
int fnfd, fnwrkfd, i, wlen;
struct stream s, *s_ptr;
uint32 len;
/* Construct a stream, so that we can use macros to extract the
* licence.
*/
s_ptr = &s;
s_ptr->p = data;
/* Skip first two bytes */
in_uint16(s_ptr, len);
/* Skip three strings */
for (i = 0; i < 3; i++)
{
in_uint32(s_ptr, len);
s_ptr->p += len;
/* Make sure that we won't be past the end of data after
* reading the next length value
*/
if ((s_ptr->p) + 4 > data + length)
{
printf("Error in parsing licence key.\n");
printf("Strings %d end value %x > supplied length (%x)\n",
i, s_ptr->p, data + length);
return;
}
}
in_uint32(s_ptr, len);
if (s_ptr->p + len > data + length)
{
printf("Error in parsing licence key.\n");
printf("End of licence %x > supplied length (%x)\n", s_ptr->p + len, data + length);
return;
}
home = getenv("HOME");
if (home == NULL)
return;
/* set and create the directory -- if it doesn't exist. */
fpath = xmalloc(strlen(home) + 11);
STRNCPY(fpath, home, strlen(home) + 1);
sprintf(fpath, "%s/.rdesktop", fpath);
if (mkdir(fpath, 0700) == -1 && errno != EEXIST)
{
perror("mkdir");
exit(1);
}
/* set the real licence filename, and put a write lock on it. */
fname = xmalloc(strlen(fpath) + strlen(hostname) + 10);
sprintf(fname, "%s/licence.%s", fpath, hostname);
fnfd = open(fname, O_RDONLY);
if (fnfd != -1)
{
fnfl.l_type = F_WRLCK;
fnfl.l_whence = SEEK_SET;
fnfl.l_start = 0;
fnfl.l_len = 1;
fcntl(fnfd, F_SETLK, &fnfl);
}
/* create a temporary licence file */
fnamewrk = xmalloc(strlen(fname) + 12);
for (y = 0;; y++)
{
sprintf(fnamewrk, "%s.%lu", fname, y);
fnwrkfd = open(fnamewrk, O_WRONLY | O_CREAT | O_EXCL, 0600);
if (fnwrkfd == -1)
{
if (errno == EINTR || errno == EEXIST)
continue;
perror("create");
exit(1);
}
break;
}
/* write to the licence file */
for (y = 0; y < len;)
{
do
{
wlen = write(fnwrkfd, s_ptr->p + y, len - y);
}
while (wlen == -1 && errno == EINTR);
if (wlen < 1)
{
perror("write");
unlink(fnamewrk);
exit(1);
}
y += wlen;
}
/* close the file and rename it to fname */
if (close(fnwrkfd) == -1)
{
perror("close");
unlink(fnamewrk);
exit(1);
}
if (rename(fnamewrk, fname) == -1)
{
perror("rename");
unlink(fnamewrk);
exit(1);
}
/* close the file lock on fname */
if (fnfd != -1)
{
fnfl.l_type = F_UNLCK;
fnfl.l_whence = SEEK_SET;
fnfl.l_start = 0;
fnfl.l_len = 1;
fcntl(fnfd, F_SETLK, &fnfl);
close(fnfd);
}
}
#endif