static Bool XdmAuthenticationGenerator (ARRAY8Ptr privateData, ARRAY8Ptr outgoingData, xdmOpCode packet_type) { outgoingData->length = 0; outgoingData->data = 0; if (packet_type == REQUEST) { if (XdmcpAllocARRAY8 (outgoingData, 8)) XdmcpWrap ((unsigned char *)&rho, (unsigned char *)&privateKey, outgoingData->data, 8); } return TRUE; }
static int compute_auth(xcb_auth_info_t *info, Xauth *authptr, struct sockaddr *sockname) { if (authname_match(AUTH_MC1, authptr->name, authptr->name_length)) { info->datalen = memdup(&info->data, authptr->data, authptr->data_length); if(!info->datalen) return 0; return 1; } #ifdef HASXDMAUTH #define APPEND(buf,idx,val) do_append((buf),&(idx),&(val),sizeof(val)) if (authname_match(AUTH_XA1, authptr->name, authptr->name_length)) { int j; info->data = malloc(192 / 8); if(!info->data) return 0; for (j = 0; j < 8; j++) info->data[j] = authptr->data[j]; switch(sockname->sa_family) { case AF_INET: /*block*/ { struct sockaddr_in *si = (struct sockaddr_in *) sockname; APPEND(info->data, j, si->sin_addr.s_addr); APPEND(info->data, j, si->sin_port); } break; #ifdef AF_INET6 case AF_INET6: /*block*/ { struct sockaddr_in6 *si6 = (struct sockaddr_in6 *) sockname; if(IN6_IS_ADDR_V4MAPPED(SIN6_ADDR(sockname))) { do_append(info->data, &j, &si6->sin6_addr.s6_addr[12], 4); APPEND(info->data, j, si6->sin6_port); } else { /* XDM-AUTHORIZATION-1 does not handle IPv6 correctly. Do the same thing Xlib does: use all zeroes for the 4-byte address and 2-byte port number. */ uint32_t fakeaddr = 0; uint16_t fakeport = 0; APPEND(info->data, j, fakeaddr); APPEND(info->data, j, fakeport); } } break; #endif case AF_UNIX: /*block*/ { uint32_t fakeaddr = htonl(0xffffffff - next_nonce()); uint16_t fakeport = htons(getpid()); APPEND(info->data, j, fakeaddr); APPEND(info->data, j, fakeport); } break; default: free(info->data); return 0; /* do not know how to build this */ } { uint32_t now = htonl(time(0)); APPEND(info->data, j, now); } assert(j <= 192 / 8); while (j < 192 / 8) info->data[j++] = 0; info->datalen = j; XdmcpWrap ((unsigned char *) info->data, (unsigned char *) authptr->data + 8, (unsigned char *) info->data, info->datalen); return 1; } #undef APPEND #endif return 0; /* Unknown authorization type */ }