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