Wrap.c revision ff559fab
1ff559fabSmrg/*
2ff559fabSmrg * $Xorg: Wrap.c,v 1.4 2001/02/09 02:03:49 xorgcvs Exp $
3ff559fabSmrg *
4ff559fabSmrg *
5ff559fabSmrgCopyright 1989, 1998  The Open Group
6ff559fabSmrg
7ff559fabSmrgPermission to use, copy, modify, distribute, and sell this software and its
8ff559fabSmrgdocumentation for any purpose is hereby granted without fee, provided that
9ff559fabSmrgthe above copyright notice appear in all copies and that both that
10ff559fabSmrgcopyright notice and this permission notice appear in supporting
11ff559fabSmrgdocumentation.
12ff559fabSmrg
13ff559fabSmrgThe above copyright notice and this permission notice shall be included in
14ff559fabSmrgall copies or substantial portions of the Software.
15ff559fabSmrg
16ff559fabSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17ff559fabSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18ff559fabSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
19ff559fabSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20ff559fabSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21ff559fabSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22ff559fabSmrg
23ff559fabSmrgExcept as contained in this notice, the name of The Open Group shall not be
24ff559fabSmrgused in advertising or otherwise to promote the sale, use or other dealings
25ff559fabSmrgin this Software without prior written authorization from The Open Group.
26ff559fabSmrg * *
27ff559fabSmrg * Author:  Keith Packard, MIT X Consortium
28ff559fabSmrg */
29ff559fabSmrg
30ff559fabSmrg/* $XFree86: xc/lib/Xdmcp/Wrap.c,v 1.3 2001/01/17 19:42:44 dawes Exp $ */
31ff559fabSmrg
32ff559fabSmrg#ifdef HAVE_CONFIG_H
33ff559fabSmrg#include <config.h>
34ff559fabSmrg#endif
35ff559fabSmrg#include <X11/Xos.h>
36ff559fabSmrg#include <X11/X.h>
37ff559fabSmrg#include <X11/Xmd.h>
38ff559fabSmrg#include <X11/Xdmcp.h>
39ff559fabSmrg
40ff559fabSmrg#ifdef HASXDMAUTH
41ff559fabSmrg
42ff559fabSmrg/*
43ff559fabSmrg * The following function exists only to demonstrate the
44ff559fabSmrg * desired functional interface for this routine.  You will
45ff559fabSmrg * need to add the appropriate algorithm if you wish to
46ff559fabSmrg * use XDM-AUTHENTICATION-1/XDM-AUTHORIZATION-1.
47ff559fabSmrg *
48ff559fabSmrg * Examine the XDMCP specification for the correct algorithm
49ff559fabSmrg */
50ff559fabSmrg
51ff559fabSmrg#include "Wrap.h"
52ff559fabSmrg
53ff559fabSmrgvoid
54ff559fabSmrgXdmcpWrap (
55ff559fabSmrg    unsigned char	*input,
56ff559fabSmrg    unsigned char	*wrapper,
57ff559fabSmrg    unsigned char	*output,
58ff559fabSmrg    int			bytes)
59ff559fabSmrg{
60ff559fabSmrg    int			i, j;
61ff559fabSmrg    int			len;
62ff559fabSmrg    unsigned char	tmp[8];
63ff559fabSmrg    unsigned char	expand_wrapper[8];
64ff559fabSmrg    auth_wrapper_schedule	schedule;
65ff559fabSmrg
66ff559fabSmrg    _XdmcpWrapperToOddParity (wrapper, expand_wrapper);
67ff559fabSmrg    _XdmcpAuthSetup (expand_wrapper, schedule);
68ff559fabSmrg    for (j = 0; j < bytes; j += 8)
69ff559fabSmrg    {
70ff559fabSmrg	len = 8;
71ff559fabSmrg	if (bytes - j < len)
72ff559fabSmrg	    len = bytes - j;
73ff559fabSmrg	/* block chaining */
74ff559fabSmrg	for (i = 0; i < len; i++)
75ff559fabSmrg	{
76ff559fabSmrg	    if (j == 0)
77ff559fabSmrg		tmp[i] = input[i];
78ff559fabSmrg	    else
79ff559fabSmrg		tmp[i] = input[j + i] ^ output[j - 8 + i];
80ff559fabSmrg	}
81ff559fabSmrg	for (; i < 8; i++)
82ff559fabSmrg	{
83ff559fabSmrg	    if (j == 0)
84ff559fabSmrg		tmp[i] = 0;
85ff559fabSmrg	    else
86ff559fabSmrg		tmp[i] = 0 ^ output[j - 8 + i];
87ff559fabSmrg	}
88ff559fabSmrg	_XdmcpAuthDoIt (tmp, (output + j), schedule, 1);
89ff559fabSmrg    }
90ff559fabSmrg}
91ff559fabSmrg
92ff559fabSmrg/*
93ff559fabSmrg * Given a 56 bit wrapper in XDMCP format, create a 56
94ff559fabSmrg * bit wrapper in 7-bits + odd parity format
95ff559fabSmrg */
96ff559fabSmrg
97ff559fabSmrgstatic int
98ff559fabSmrgOddParity (unsigned char c)
99ff559fabSmrg{
100ff559fabSmrg    c = c ^ (c >> 4);
101ff559fabSmrg    c = c ^ (c >> 2);
102ff559fabSmrg    c = c ^ (c >> 1);
103ff559fabSmrg    return ~c & 0x1;
104ff559fabSmrg}
105ff559fabSmrg
106ff559fabSmrg/*
107ff559fabSmrg * Spread the 56 bit wrapper among 8 bytes, using the upper 7 bits
108ff559fabSmrg * of each byte, and storing an odd parity bit in the low bit
109ff559fabSmrg */
110ff559fabSmrg
111ff559fabSmrgvoid
112ff559fabSmrg_XdmcpWrapperToOddParity (
113ff559fabSmrg    unsigned char   *in,
114ff559fabSmrg    unsigned char   *out)
115ff559fabSmrg{
116ff559fabSmrg    int		    ashift, bshift;
117ff559fabSmrg    int		    i;
118ff559fabSmrg    unsigned char   c;
119ff559fabSmrg
120ff559fabSmrg    ashift = 7;
121ff559fabSmrg    bshift = 1;
122ff559fabSmrg    for (i = 0; i < 7; i++)
123ff559fabSmrg    {
124ff559fabSmrg	c = ((in[i] << ashift) | (in[i+1] >> bshift)) & 0x7f;
125ff559fabSmrg	out[i] = (c << 1) | OddParity (c);
126ff559fabSmrg	ashift--;
127ff559fabSmrg	bshift++;
128ff559fabSmrg    }
129ff559fabSmrg    c = in[i];
130ff559fabSmrg    out[i] = (c << 1) | OddParity(c);
131ff559fabSmrg}
132ff559fabSmrg
133ff559fabSmrg#endif
134