WebSocketFrameRef WebSocketFrameCreateWithPayloadData (CFAllocatorRef allocator, WebSocketFrameOpCode opCode, Boolean isMasked, UInt8 *maskingKey, CFDataRef payload) { WebSocketFrameRef self = WebSocketFrameCreate(allocator); if_self { UInt8 header[2 + 8]; memset(header, 0, sizeof(header)); Boolean isFin = TRUE; Boolean rsv1 = FALSE; Boolean rsv2 = FALSE; Boolean rsv3 = FALSE; header[0] |= ((isFin ? 1 : 0) << 7); header[0] |= ((rsv1 ? 1 : 0) << 6); header[0] |= ((rsv2 ? 1 : 0) << 5); header[0] |= ((rsv3 ? 1 : 0) << 4); header[0] |= (opCode & 0xf); header[1] |= ((isMasked ? 1 : 0) << 7); CFIndex length = payload != NULL ? CFDataGetLength(payload) : 0; if (length <= 125) { header[1] |= (UInt8) length; WebSocketFrameAppend(self, header, 2); } else { if (length < 65535) { header[1] |= 126; *((UInt16 *) &header[2]) = OSSwapBigToHostInt16(length); WebSocketFrameAppend(self, header, 2 + 2); } else { header[1] |= 127; *((UInt64 *) &header[2]) = OSSwapBigToHostInt64(length); WebSocketFrameAppend(self, header, 2 + 8); } } if (isMasked) { UInt8 autoMaskingKey[4] = { 0, 0, 0, 0 }; if (maskingKey == NULL) { * (u_int32_t *) autoMaskingKey = arc4random(); maskingKey = autoMaskingKey; } WebSocketFrameAppend(self, maskingKey, 4); } if (length > 0) { WebSocketFrameAppend(self, CFDataGetBytePtr(payload), length); } WebSocketFrameParse(self); } return self; }
static bool_t xdr_CSSM_DATA_FLIPPED(XDR *xdrs, CSSM_DATA *objp) { bool_t size_alloc = sec_xdr_arena_size_allocator(xdrs); if ((xdrs->x_op == XDR_ENCODE) && !size_alloc) { switch (objp->Length) { case sizeof(uint32_t): *(uint32_t*)objp->Data = htonl(*(uint32_t*)objp->Data); break; case sizeof(uint64_t): *(uint64_t*)objp->Data = OSSwapHostToBigInt64(*(uint64_t*)objp->Data); break; case sizeof(uint8_t): break; default: assert(FALSE); break; } } if (!xdr_CSSM_DATA(xdrs, objp)) return (FALSE); if ((xdrs->x_op == XDR_DECODE) && !size_alloc) { switch (objp->Length) { case sizeof(uint32_t): *(uint32_t*)objp->Data = ntohl(*(uint32_t*)objp->Data); break; case sizeof(uint64_t): *(uint64_t*)objp->Data = OSSwapBigToHostInt64(*(uint64_t*)objp->Data); break; case sizeof(uint8_t): break; default: assert(FALSE); break; } } return (TRUE); }
uint64_t fmbe64(uint64_t x) { return OSSwapBigToHostInt64(x); }