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