示例#1
0
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);
}
示例#3
0
uint64_t fmbe64(uint64_t x) { return OSSwapBigToHostInt64(x);    }