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