Blame Key.c

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