Blame Key.c

Packit Service 681ffc
/*
Packit Service 681ffc
Copyright 1989, 1998  The Open Group
Packit Service 681ffc
Packit Service 681ffc
Permission to use, copy, modify, distribute, and sell this software and its
Packit Service 681ffc
documentation for any purpose is hereby granted without fee, provided that
Packit Service 681ffc
the above copyright notice appear in all copies and that both that
Packit Service 681ffc
copyright notice and this permission notice appear in supporting
Packit Service 681ffc
documentation.
Packit Service 681ffc
Packit Service 681ffc
The above copyright notice and this permission notice shall be included in
Packit Service 681ffc
all copies or substantial portions of the Software.
Packit Service 681ffc
Packit Service 681ffc
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Service 681ffc
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Service 681ffc
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit Service 681ffc
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit Service 681ffc
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit Service 681ffc
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit Service 681ffc
Packit Service 681ffc
Except as contained in this notice, the name of The Open Group shall not be
Packit Service 681ffc
used in advertising or otherwise to promote the sale, use or other dealings
Packit Service 681ffc
in this Software without prior written authorization from The Open Group.
Packit Service 681ffc
 *
Packit Service 681ffc
 * Author:  Keith Packard, MIT X Consortium
Packit Service 681ffc
 */
Packit Service 681ffc
Packit Service 681ffc
#ifdef HAVE_CONFIG_H
Packit Service 681ffc
#include <config.h>
Packit Service 681ffc
#endif
Packit Service 681ffc
#include <X11/Xos.h>
Packit Service 681ffc
#include <X11/X.h>
Packit Service 681ffc
#include <X11/Xmd.h>
Packit Service 681ffc
#include <X11/Xdmcp.h>
Packit Service 681ffc
Packit Service 681ffc
#ifdef HAVE_LIBBSD
Packit Service 681ffc
#include <bsd/stdlib.h> /* for arc4random_buf() */
Packit Service 681ffc
#endif
Packit Service 681ffc
Packit Service 681ffc
#ifndef HAVE_ARC4RANDOM_BUF
Packit Service 681ffc
static void
Packit Service 681ffc
getbits (long data, unsigned char *dst)
Packit Service 681ffc
{
Packit Service 681ffc
    dst[0] = (data      ) & 0xff;
Packit Service 681ffc
    dst[1] = (data >>  8) & 0xff;
Packit Service 681ffc
    dst[2] = (data >> 16) & 0xff;
Packit Service 681ffc
    dst[3] = (data >> 24) & 0xff;
Packit Service 681ffc
}
Packit Service 681ffc
#endif
Packit Service 681ffc
Packit Service 681ffc
#define Time_t time_t
Packit Service 681ffc
Packit Service 681ffc
#include <stdlib.h>
Packit Service 681ffc
Packit Service 681ffc
#if defined(HAVE_LRAND48) && defined(HAVE_SRAND48)
Packit Service 681ffc
#define srandom srand48
Packit Service 681ffc
#define random lrand48
Packit Service 681ffc
#endif
Packit Service 681ffc
#ifdef WIN32
Packit Service 681ffc
#include <process.h>
Packit Service 681ffc
#define srandom srand
Packit Service 681ffc
#define random rand
Packit Service 681ffc
#define getpid(x) _getpid(x)
Packit Service 681ffc
#endif
Packit Service 681ffc
Packit Service 681ffc
#ifndef HAVE_ARC4RANDOM_BUF
Packit Service 681ffc
Packit Service 681ffc
static void
Packit Service 681ffc
insecure_getrandom_buf (unsigned char *auth, int len)
Packit Service 681ffc
{
Packit Service 681ffc
    long    lowbits, highbits;
Packit Service 681ffc
Packit Service 681ffc
    srandom ((int)getpid() ^ time((Time_t *)0));
Packit Service 681ffc
    lowbits = random ();
Packit Service 681ffc
    highbits = random ();
Packit Service 681ffc
    getbits (lowbits, auth);
Packit Service 681ffc
    getbits (highbits, auth + 4);
Packit Service 681ffc
}
Packit Service 681ffc
Packit Service 681ffc
static void
Packit Service 681ffc
arc4random_buf (void *auth, int len)
Packit Service 681ffc
{
Packit Service 681ffc
    int	    ret;
Packit Service 681ffc
Packit Service 681ffc
#if HAVE_GETENTROPY
Packit Service 681ffc
    /* weak emulation of arc4random through the getentropy libc call */
Packit Service 681ffc
    ret = getentropy (auth, len);
Packit Service 681ffc
    if (ret == 0)
Packit Service 681ffc
	return;
Packit Service 681ffc
#endif /* HAVE_GETENTROPY */
Packit Service 681ffc
Packit Service 681ffc
    insecure_getrandom_buf (auth, len);
Packit Service 681ffc
}
Packit Service 681ffc
Packit Service 681ffc
#endif /* !defined(HAVE_ARC4RANDOM_BUF) */
Packit Service 681ffc
Packit Service 681ffc
void
Packit Service 681ffc
XdmcpGenerateKey (XdmAuthKeyPtr key)
Packit Service 681ffc
{
Packit Service 681ffc
    arc4random_buf(key->data, 8);
Packit Service 681ffc
}
Packit Service 681ffc
Packit Service 681ffc
int
Packit Service 681ffc
XdmcpCompareKeys (const XdmAuthKeyPtr a, const XdmAuthKeyPtr b)
Packit Service 681ffc
{
Packit Service 681ffc
    int	i;
Packit Service 681ffc
Packit Service 681ffc
    for (i = 0; i < 8; i++)
Packit Service 681ffc
	if (a->data[i] != b->data[i])
Packit Service 681ffc
	    return FALSE;
Packit Service 681ffc
    return TRUE;
Packit Service 681ffc
}
Packit Service 681ffc
Packit Service 681ffc
void
Packit Service 681ffc
XdmcpIncrementKey (XdmAuthKeyPtr key)
Packit Service 681ffc
{
Packit Service 681ffc
    int	i;
Packit Service 681ffc
Packit Service 681ffc
    i = 7;
Packit Service 681ffc
    while (++key->data[i] == 0)
Packit Service 681ffc
	if (--i < 0)
Packit Service 681ffc
	    break;
Packit Service 681ffc
}
Packit Service 681ffc
Packit Service 681ffc
void
Packit Service 681ffc
XdmcpDecrementKey (XdmAuthKeyPtr key)
Packit Service 681ffc
{
Packit Service 681ffc
    int	i;
Packit Service 681ffc
Packit Service 681ffc
    i = 7;
Packit Service 681ffc
    while (key->data[i]-- == 0)
Packit Service 681ffc
	if (--i < 0)
Packit Service 681ffc
	    break;
Packit Service 681ffc
}