16ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 26ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * datatypes.h 36ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 46ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * data types for bit vectors and finite fields 56ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 66ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * David A. McGrew 76ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Cisco Systems, Inc. 86ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 96ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Copyright (c) 2001-2006, Cisco Systems, Inc. 136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * All rights reserved. 146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Redistribution and use in source and binary forms, with or without 166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * modification, are permitted provided that the following conditions 176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * are met: 186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Redistributions of source code must retain the above copyright 206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * notice, this list of conditions and the following disclaimer. 216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Redistributions in binary form must reproduce the above 236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * copyright notice, this list of conditions and the following 246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * disclaimer in the documentation and/or other materials provided 256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * with the distribution. 266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Neither the name of the Cisco Systems, Inc. nor the names of its 286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * contributors may be used to endorse or promote products derived 296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * from this software without specific prior written permission. 306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * OF THE POSSIBILITY OF SUCH DAMAGE. 436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef _DATATYPES_H 486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _DATATYPES_H 496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "integers.h" /* definitions of uint32_t, et cetera */ 516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "alloc.h" 526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include <stdarg.h> 546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef SRTP_KERNEL 566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <stdio.h> 576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <string.h> 586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <time.h> 596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# ifdef HAVE_NETINET_IN_H 606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <netinet/in.h> 616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# elif defined HAVE_WINSOCK2_H 626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <winsock2.h> 63362c71e8d0dc205a4ad9f4709d42c25864ac872amallinath@chromium.org# elif defined HAVE_BYTESWAP_METHODS_H 644af3b6f1c78b98d7b33ec9ba652305aa3fbd95e5mallinath@chromium.org# include <stdlib.h> 654af3b6f1c78b98d7b33ec9ba652305aa3fbd95e5mallinath@chromium.org# define ntohl(x) _byteswap_ulong (x) 664af3b6f1c78b98d7b33ec9ba652305aa3fbd95e5mallinath@chromium.org# define ntohs(x) _byteswap_ushort (x) 674af3b6f1c78b98d7b33ec9ba652305aa3fbd95e5mallinath@chromium.org# define htonl(x) _byteswap_ulong (x) 684af3b6f1c78b98d7b33ec9ba652305aa3fbd95e5mallinath@chromium.org# define htons(x) _byteswap_ushort (x) 696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# endif 706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif 716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 734af3b6f1c78b98d7b33ec9ba652305aa3fbd95e5mallinath@chromium.org 746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* if DATATYPES_USE_MACROS is defined, then little functions are macros */ 756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define DATATYPES_USE_MACROS 766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef union { 786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint8_t v8[2]; 796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint16_t value; 806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} v16_t; 816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef union { 836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint8_t v8[4]; 846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint16_t v16[2]; 856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint32_t value; 866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} v32_t; 876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef union { 896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint8_t v8[8]; 906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint16_t v16[4]; 916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint32_t v32[2]; 926ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint64_t value; 936ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} v64_t; 946ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 956ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef union { 966ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint8_t v8[16]; 976ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint16_t v16[8]; 986ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint32_t v32[4]; 996ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint64_t v64[2]; 1006ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} v128_t; 1016ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1026ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1036ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1046ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* some useful and simple math functions */ 1056ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1066ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define pow_2(X) ( (unsigned int)1 << (X) ) /* 2^X */ 1076ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1086ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define pow_minus_one(X) ( (X) ? -1 : 1 ) /* (-1)^X */ 1096ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 1126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * octet_get_weight(x) returns the hamming weight (number of bits equal to 1136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * one) in the octet x 1146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 1156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint 1176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgoctet_get_weight(uint8_t octet); 1186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgchar * 1206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgoctet_bit_string(uint8_t x); 1216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define MAX_PRINT_STRING_LEN 1024 1236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgchar * 1256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgoctet_string_hex_string(const void *str, int length); 1266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgchar * 1286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_bit_string(v128_t *x); 1296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgchar * 1316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_hex_string(v128_t *x); 1326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orguint8_t 1346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgnibble_to_hex_char(uint8_t nibble); 1356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgchar * 1376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgchar_to_hex_string(char *x, int num_char); 1386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orguint8_t 1406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orghex_string_to_octet(char *s); 1416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 1436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * hex_string_to_octet_string(raw, hex, len) converts the hexadecimal 1446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * string at *hex (of length len octets) to the equivalent raw data 1456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * and writes it to *raw. 1466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 1476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * if a character in the hex string that is not a hexadeciaml digit 1486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * (0123456789abcdefABCDEF) is encountered, the function stops writing 1496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * data to *raw 1506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 1516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * the number of hex digits copied (which is two times the number of 1526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * octets in *raw) is returned 1536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 1546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint 1566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orghex_string_to_octet_string(char *raw, char *hex, int len); 1576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_t 1596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orghex_string_to_v128(char *s); 1606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 1626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_copy_octet_string(v128_t *x, const uint8_t s[16]); 1636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 1656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_left_shift(v128_t *x, int shift_index); 1666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 1686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_right_shift(v128_t *x, int shift_index); 1696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 1716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * the following macros define the data manipulation functions 1726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 1736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * If DATATYPES_USE_MACROS is defined, then these macros are used 1746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * directly (and function call overhead is avoided). Otherwise, 1756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * the macros are used through the functions defined in datatypes.c 1766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * (and the compiler provides better warnings). 1776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 1786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_set_to_zero(x) \ 1806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 1816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (x)->v32[0] = 0, \ 1826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (x)->v32[1] = 0, \ 1836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (x)->v32[2] = 0, \ 1846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (x)->v32[3] = 0 \ 1856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 1866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_copy(x, y) \ 1886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 1896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (x)->v32[0] = (y)->v32[0], \ 1906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (x)->v32[1] = (y)->v32[1], \ 1916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (x)->v32[2] = (y)->v32[2], \ 1926ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (x)->v32[3] = (y)->v32[3] \ 1936ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 1946ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1956ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_xor(z, x, y) \ 1966ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 1976ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[0] = (x)->v32[0] ^ (y)->v32[0], \ 1986ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[1] = (x)->v32[1] ^ (y)->v32[1], \ 1996ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[2] = (x)->v32[2] ^ (y)->v32[2], \ 2006ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[3] = (x)->v32[3] ^ (y)->v32[3] \ 2016ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 2026ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2036ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_and(z, x, y) \ 2046ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 2056ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[0] = (x)->v32[0] & (y)->v32[0], \ 2066ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[1] = (x)->v32[1] & (y)->v32[1], \ 2076ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[2] = (x)->v32[2] & (y)->v32[2], \ 2086ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[3] = (x)->v32[3] & (y)->v32[3] \ 2096ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 2106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_or(z, x, y) \ 2126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 2136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[0] = (x)->v32[0] | (y)->v32[0], \ 2146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[1] = (x)->v32[1] | (y)->v32[1], \ 2156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[2] = (x)->v32[2] | (y)->v32[2], \ 2166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[3] = (x)->v32[3] | (y)->v32[3] \ 2176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 2186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_complement(x) \ 2206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 2216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (x)->v32[0] = ~(x)->v32[0], \ 2226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (x)->v32[1] = ~(x)->v32[1], \ 2236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (x)->v32[2] = ~(x)->v32[2], \ 2246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (x)->v32[3] = ~(x)->v32[3] \ 2256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 2266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* ok for NO_64BIT_MATH if it can compare uint64_t's (even as structures) */ 2286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_is_eq(x, y) \ 2296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (((x)->v64[0] == (y)->v64[0]) && ((x)->v64[1] == (y)->v64[1])) 2306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef NO_64BIT_MATH 2336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_xor_eq(z, x) \ 2346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 2356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[0] ^= (x)->v32[0], \ 2366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[1] ^= (x)->v32[1], \ 2376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[2] ^= (x)->v32[2], \ 2386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v32[3] ^= (x)->v32[3] \ 2396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 2406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#else 2416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_xor_eq(z, x) \ 2426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 2436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v64[0] ^= (x)->v64[0], \ 2446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (z)->v64[1] ^= (x)->v64[1] \ 2456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 2466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif 2476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* NOTE! This assumes an odd ordering! */ 2496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* This will not be compatible directly with math on some processors */ 2506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* bit 0 is first 32-bit word, low order bit. in little-endian, that's 2516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org the first byte of the first 32-bit word. In big-endian, that's 2526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org the 3rd byte of the first 32-bit word */ 2536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* The get/set bit code is used by the replay code ONLY, and it doesn't 2546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org really care which bit is which. AES does care which bit is which, but 2556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org doesn't use the 128-bit get/set or 128-bit shifts */ 2566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_get_bit(x, bit) \ 2586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 2596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org ((((x)->v32[(bit) >> 5]) >> ((bit) & 31)) & 1) \ 2606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 2616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_set_bit(x, bit) \ 2636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 2646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (((x)->v32[(bit) >> 5]) |= ((uint32_t)1 << ((bit) & 31))) \ 2656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 2666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_clear_bit(x, bit) \ 2686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 2696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (((x)->v32[(bit) >> 5]) &= ~((uint32_t)1 << ((bit) & 31))) \ 2706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 2716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_set_bit_to(x, bit, value) \ 2736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 2746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (value) ? _v128_set_bit(x, bit) : \ 2756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org _v128_clear_bit(x, bit) \ 2766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 2776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#if 0 2806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* nothing uses this */ 2816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef WORDS_BIGENDIAN 2826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_add(z, x, y) { \ 2846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint64_t tmp; \ 2856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org \ 2866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org tmp = x->v32[3] + y->v32[3]; \ 2876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org z->v32[3] = (uint32_t) tmp; \ 2886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org \ 2896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org tmp = x->v32[2] + y->v32[2] + (tmp >> 32); \ 2906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org z->v32[2] = (uint32_t) tmp; \ 2916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org \ 2926ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org tmp = x->v32[1] + y->v32[1] + (tmp >> 32); \ 2936ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org z->v32[1] = (uint32_t) tmp; \ 2946ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org \ 2956ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org tmp = x->v32[0] + y->v32[0] + (tmp >> 32); \ 2966ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org z->v32[0] = (uint32_t) tmp; \ 2976ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} 2986ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 2996ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#else /* assume little endian architecture */ 3006ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3016ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _v128_add(z, x, y) { \ 3026ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint64_t tmp; \ 3036ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org \ 3046ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org tmp = htonl(x->v32[3]) + htonl(y->v32[3]); \ 3056ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org z->v32[3] = ntohl((uint32_t) tmp); \ 3066ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org \ 3076ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org tmp = htonl(x->v32[2]) + htonl(y->v32[2]) \ 3086ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org + htonl(tmp >> 32); \ 3096ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org z->v32[2] = ntohl((uint32_t) tmp); \ 3106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org \ 3116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org tmp = htonl(x->v32[1]) + htonl(y->v32[1]) \ 3126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org + htonl(tmp >> 32); \ 3136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org z->v32[1] = ntohl((uint32_t) tmp); \ 3146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org \ 3156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org tmp = htonl(x->v32[0]) + htonl(y->v32[0]) \ 3166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org + htonl(tmp >> 32); \ 3176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org z->v32[0] = ntohl((uint32_t) tmp); \ 3186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} 3196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif /* WORDS_BIGENDIAN */ 3206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif /* 0 */ 3216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef DATATYPES_USE_MACROS /* little functions are really macros */ 3246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define v128_set_to_zero(z) _v128_set_to_zero(z) 3266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define v128_copy(z, x) _v128_copy(z, x) 3276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define v128_xor(z, x, y) _v128_xor(z, x, y) 3286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define v128_and(z, x, y) _v128_and(z, x, y) 3296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define v128_or(z, x, y) _v128_or(z, x, y) 3306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define v128_complement(x) _v128_complement(x) 3316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define v128_is_eq(x, y) _v128_is_eq(x, y) 3326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define v128_xor_eq(x, y) _v128_xor_eq(x, y) 3336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define v128_get_bit(x, i) _v128_get_bit(x, i) 3346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define v128_set_bit(x, i) _v128_set_bit(x, i) 3356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define v128_clear_bit(x, i) _v128_clear_bit(x, i) 3366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define v128_set_bit_to(x, i, y) _v128_set_bit_to(x, i, y) 3376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#else 3396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 3416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_set_to_zero(v128_t *x); 3426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint 3446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_is_eq(const v128_t *x, const v128_t *y); 3456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 3476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_copy(v128_t *x, const v128_t *y); 3486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 3506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_xor(v128_t *z, v128_t *x, v128_t *y); 3516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 3536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_and(v128_t *z, v128_t *x, v128_t *y); 3546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 3566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_or(v128_t *z, v128_t *x, v128_t *y); 3576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 3596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_complement(v128_t *x); 3606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint 3626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_get_bit(const v128_t *x, int i); 3636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 3656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_set_bit(v128_t *x, int i) ; 3666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 3686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_clear_bit(v128_t *x, int i); 3696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 3716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgv128_set_bit_to(v128_t *x, int i, int y); 3726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif /* DATATYPES_USE_MACROS */ 3746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 3766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * octet_string_is_eq(a,b, len) returns 1 if the length len strings a 3776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * and b are not equal, returns 0 otherwise 3786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 3796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint 3816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgoctet_string_is_eq(uint8_t *a, uint8_t *b, int len); 3826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 3846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgoctet_string_set_to_zero(uint8_t *s, int len); 3856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef SRTP_KERNEL_LINUX 3886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 3896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 3906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Convert big endian integers to CPU byte order. 3916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 3926ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef WORDS_BIGENDIAN 3936ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* Nothing to do. */ 3946ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# define be32_to_cpu(x) (x) 3956ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# define be64_to_cpu(x) (x) 3966ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#elif defined(HAVE_BYTESWAP_H) 3976ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* We have (hopefully) optimized versions in byteswap.h */ 3986ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <byteswap.h> 3996ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# define be32_to_cpu(x) bswap_32((x)) 4006ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# define be64_to_cpu(x) bswap_64((x)) 4016ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#else 4026ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4036ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#if defined(__GNUC__) && defined(HAVE_X86) 4046ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* Fall back. */ 4057bcb8db4f328fefa2056e025e1d1b657ef98adcfscottmg@chromium.orgstatic INLINE uint32_t be32_to_cpu(uint32_t v) { 4066ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org /* optimized for x86. */ 4076ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org asm("bswap %0" : "=r" (v) : "0" (v)); 4086ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org return v; 4096ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} 4106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# else /* HAVE_X86 */ 4116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# ifdef HAVE_NETINET_IN_H 4126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <netinet/in.h> 4136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# elif defined HAVE_WINSOCK2_H 4146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <winsock2.h> 4156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# endif 4166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# define be32_to_cpu(x) ntohl((x)) 4176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# endif /* HAVE_X86 */ 4186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4197bcb8db4f328fefa2056e025e1d1b657ef98adcfscottmg@chromium.orgstatic INLINE uint64_t be64_to_cpu(uint64_t v) { 4206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# ifdef NO_64BIT_MATH 4216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org /* use the make64 functions to do 64-bit math */ 4226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org v = make64(htonl(low32(v)),htonl(high32(v))); 4236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# else 4246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org /* use the native 64-bit math */ 4256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org v= (uint64_t)((be32_to_cpu((uint32_t)(v >> 32))) | (((uint64_t)be32_to_cpu((uint32_t)v)) << 32)); 4266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# endif 4276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org return v; 4286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} 4296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif /* ! SRTP_KERNEL_LINUX */ 4316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif /* WORDS_BIGENDIAN */ 4336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 4356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * functions manipulating bitvector_t 4366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 4376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * A bitvector_t consists of an array of words and an integer 4386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * representing the number of significant bits stored in the array. 4396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * The bits are packed as follows: the least significant bit is that 4406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * of word[0], while the most significant bit is the nth most 4416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * significant bit of word[m], where length = bits_per_word * m + n. 4426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 4436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 4446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define bits_per_word 32 4466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define bytes_per_word 4 4476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct { 4496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint32_t length; 4506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint32_t *word; 4516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} bitvector_t; 4526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _bitvector_get_bit(v, bit_index) \ 4556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 4566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org ((((v)->word[((bit_index) >> 5)]) >> ((bit_index) & 31)) & 1) \ 4576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 4586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _bitvector_set_bit(v, bit_index) \ 4616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 4626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (((v)->word[((bit_index) >> 5)] |= ((uint32_t)1 << ((bit_index) & 31)))) \ 4636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 4646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _bitvector_clear_bit(v, bit_index) \ 4666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 4676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (((v)->word[((bit_index) >> 5)] &= ~((uint32_t)1 << ((bit_index) & 31)))) \ 4686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 4696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define _bitvector_get_length(v) \ 4716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org( \ 4726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org ((v)->length) \ 4736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org) 4746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef DATATYPES_USE_MACROS /* little functions are really macros */ 4766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define bitvector_get_bit(v, bit_index) _bitvector_get_bit(v, bit_index) 4786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define bitvector_set_bit(v, bit_index) _bitvector_set_bit(v, bit_index) 4796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define bitvector_clear_bit(v, bit_index) _bitvector_clear_bit(v, bit_index) 4806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define bitvector_get_length(v) _bitvector_get_length(v) 4816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#else 4836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint 4856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgbitvector_get_bit(const bitvector_t *v, int bit_index); 4866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 4886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgbitvector_set_bit(bitvector_t *v, int bit_index); 4896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 4916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgbitvector_clear_bit(bitvector_t *v, int bit_index); 4926ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4936ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgunsigned long 4946ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgbitvector_get_length(const bitvector_t *v); 4956ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4966ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif 4976ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 4986ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint 4996ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgbitvector_alloc(bitvector_t *v, unsigned long length); 5006ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 5016ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 5026ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgbitvector_dealloc(bitvector_t *v); 5036ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 5046ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 5056ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgbitvector_set_to_zero(bitvector_t *x); 5066ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 5076ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid 5086ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgbitvector_left_shift(bitvector_t *x, int index); 5096ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 5106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgchar * 5116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgbitvector_bit_string(bitvector_t *x, char* buf, int len); 5126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 5136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif /* _DATATYPES_H */ 514