1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * datatypes.h
3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * data types for bit vectors and finite fields
5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * David A. McGrew
7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Cisco Systems, Inc.
8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Copyright (c) 2001-2006, Cisco Systems, Inc.
13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * All rights reserved.
14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistribution and use in source and binary forms, with or without
16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * modification, are permitted provided that the following conditions
17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * are met:
18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Redistributions of source code must retain the above copyright
20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   notice, this list of conditions and the following disclaimer.
21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Redistributions in binary form must reproduce the above
23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   copyright notice, this list of conditions and the following
24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   disclaimer in the documentation and/or other materials provided
25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   with the distribution.
26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Neither the name of the Cisco Systems, Inc. nor the names of its
28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   contributors may be used to endorse or promote products derived
29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   from this software without specific prior written permission.
30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * OF THE POSSIBILITY OF SUCH DAMAGE.
43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef _DATATYPES_H
48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _DATATYPES_H
49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "integers.h"           /* definitions of uint32_t, et cetera   */
51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "alloc.h"
52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include <stdarg.h>
54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef SRTP_KERNEL
56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# include <stdio.h>
57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# include <string.h>
58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# include <time.h>
59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# ifdef HAVE_NETINET_IN_H
60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#  include <netinet/in.h>
61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# elif defined HAVE_WINSOCK2_H
62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#  include <winsock2.h>
63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# endif
64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* if DATATYPES_USE_MACROS is defined, then little functions are macros */
68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define DATATYPES_USE_MACROS
69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef union {
71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t  v8[2];
72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint16_t value;
73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} v16_t;
74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef union {
76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t  v8[4];
77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint16_t v16[2];
78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t value;
79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} v32_t;
80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef union {
82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t  v8[8];
83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint16_t v16[4];
84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t v32[2];
85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint64_t value;
86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} v64_t;
87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef union {
89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t  v8[16];
90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint16_t v16[8];
91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t v32[4];
92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint64_t v64[2];
93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} v128_t;
94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
95386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
96386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
97386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* some useful and simple math functions */
98386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
99386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define pow_2(X) ( (unsigned int)1 << (X) )   /* 2^X     */
100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define pow_minus_one(X) ( (X) ? -1 : 1 )      /* (-1)^X  */
102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * octet_get_weight(x) returns the hamming weight (number of bits equal to
106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * one) in the octet x
107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_get_weight(uint8_t octet);
111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_bit_string(uint8_t x);
114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define MAX_PRINT_STRING_LEN 1024
116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_string_hex_string(const void *str, int length);
119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_bit_string(v128_t *x);
122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_hex_string(v128_t *x);
125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint8_t
127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarinibble_to_hex_char(uint8_t nibble);
128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar_to_hex_string(char *x, int num_char);
131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint8_t
133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihex_string_to_octet(char *s);
134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * hex_string_to_octet_string(raw, hex, len) converts the hexadecimal
137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * string at *hex (of length len octets) to the equivalent raw data
138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * and writes it to *raw.
139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * if a character in the hex string that is not a hexadeciaml digit
141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (0123456789abcdefABCDEF) is encountered, the function stops writing
142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * data to *raw
143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * the number of hex digits copied (which is two times the number of
145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * octets in *raw) is returned
146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
147386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
148386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
149386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihex_string_to_octet_string(char *raw, char *hex, int len);
150386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
151386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_t
152386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarihex_string_to_v128(char *s);
153386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
154386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
155386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_copy_octet_string(v128_t *x, const uint8_t s[16]);
156386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
157386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
158386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_left_shift(v128_t *x, int index);
159386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
160386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
161386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_right_shift(v128_t *x, int index);
162386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
163386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
164386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * the following macros define the data manipulation functions
165386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
166386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * If DATATYPES_USE_MACROS is defined, then these macros are used
167386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * directly (and function call overhead is avoided).  Otherwise,
168386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * the macros are used through the functions defined in datatypes.c
169386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (and the compiler provides better warnings).
170386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
171386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
172386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_set_to_zero(x)     \
173386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(                               \
174386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (x)->v32[0] = 0,              \
175386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (x)->v32[1] = 0,              \
176386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (x)->v32[2] = 0,              \
177386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (x)->v32[3] = 0               \
178386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
179386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
180386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_copy(x, y)          \
181386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(                                \
182386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (x)->v32[0] = (y)->v32[0],     \
183386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (x)->v32[1] = (y)->v32[1],     \
184386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (x)->v32[2] = (y)->v32[2],     \
185386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (x)->v32[3] = (y)->v32[3]      \
186386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
187386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
188386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_xor(z, x, y)                       \
189386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(                                               \
190386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[0] = (x)->v32[0] ^ (y)->v32[0],     \
191386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[1] = (x)->v32[1] ^ (y)->v32[1],     \
192386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[2] = (x)->v32[2] ^ (y)->v32[2],     \
193386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[3] = (x)->v32[3] ^ (y)->v32[3]      \
194386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
195386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
196386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_and(z, x, y)                       \
197386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(                                               \
198386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[0] = (x)->v32[0] & (y)->v32[0],     \
199386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[1] = (x)->v32[1] & (y)->v32[1],     \
200386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[2] = (x)->v32[2] & (y)->v32[2],     \
201386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[3] = (x)->v32[3] & (y)->v32[3]      \
202386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
203386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
204386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_or(z, x, y)                        \
205386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(                                               \
206386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[0] = (x)->v32[0] | (y)->v32[0],     \
207386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[1] = (x)->v32[1] | (y)->v32[1],     \
208386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[2] = (x)->v32[2] | (y)->v32[2],     \
209386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[3] = (x)->v32[3] | (y)->v32[3]      \
210386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
211386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
212386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_complement(x)        \
213386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(                                  \
214386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (x)->v32[0] = ~(x)->v32[0],     \
215386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (x)->v32[1] = ~(x)->v32[1],     \
216386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (x)->v32[2] = ~(x)->v32[2],     \
217386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (x)->v32[3] = ~(x)->v32[3]      \
218386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
219386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
220386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* ok for NO_64BIT_MATH if it can compare uint64_t's (even as structures) */
221386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_is_eq(x, y)                                        \
222386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (((x)->v64[0] == (y)->v64[0]) && ((x)->v64[1] == (y)->v64[1]))
223386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
224386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
225386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef NO_64BIT_MATH
226386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_xor_eq(z, x)         \
227386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(                                  \
228386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[0] ^= (x)->v32[0],     \
229386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[1] ^= (x)->v32[1],     \
230386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[2] ^= (x)->v32[2],     \
231386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v32[3] ^= (x)->v32[3]      \
232386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
233386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#else
234386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_xor_eq(z, x)         \
235386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(                                  \
236386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v64[0] ^= (x)->v64[0],     \
237386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (z)->v64[1] ^= (x)->v64[1]      \
238386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
239386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
240386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
241386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* NOTE!  This assumes an odd ordering! */
242386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* This will not be compatible directly with math on some processors */
243386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* bit 0 is first 32-bit word, low order bit. in little-endian, that's
244386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   the first byte of the first 32-bit word.  In big-endian, that's
245386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   the 3rd byte of the first 32-bit word */
246386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* The get/set bit code is used by the replay code ONLY, and it doesn't
247386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   really care which bit is which.  AES does care which bit is which, but
248386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   doesn't use the 128-bit get/set or 128-bit shifts  */
249386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
250386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_get_bit(x, bit)                     \
251386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(                                                 \
252386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  ((((x)->v32[(bit) >> 5]) >> ((bit) & 31)) & 1)  \
253386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
254386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
255386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_set_bit(x, bit)                                    \
256386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(                                                                \
257386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (((x)->v32[(bit) >> 5]) |= ((uint32_t)1 << ((bit) & 31))) \
258386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
259386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
260386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_clear_bit(x, bit)                                   \
261386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(                                                                 \
262386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (((x)->v32[(bit) >> 5]) &= ~((uint32_t)1 << ((bit) & 31))) \
263386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
264386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
265386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_set_bit_to(x, bit, value)   \
266386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(                                         \
267386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   (value) ? _v128_set_bit(x, bit) :      \
268386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari             _v128_clear_bit(x, bit)      \
269386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
270386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
271386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
272386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if 0
273386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* nothing uses this */
274386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef WORDS_BIGENDIAN
275386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
276386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_add(z, x, y) {                    \
277386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint64_t tmp;					\
278386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    						\
279386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp = x->v32[3] + y->v32[3];                  \
280386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[3] = (uint32_t) tmp;			\
281386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  						\
282386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp =  x->v32[2] + y->v32[2] + (tmp >> 32);	\
283386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[2] = (uint32_t) tmp;                   \
284386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari						\
285386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp =  x->v32[1] + y->v32[1] + (tmp >> 32);	\
286386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[1] = (uint32_t) tmp;			\
287386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari                                                \
288386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp =  x->v32[0] + y->v32[0] + (tmp >> 32);	\
289386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[0] = (uint32_t) tmp;			\
290386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
291386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
292386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#else /* assume little endian architecture */
293386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
294386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _v128_add(z, x, y) {                    \
295386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint64_t tmp;					\
296386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari						\
297386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp = htonl(x->v32[3]) + htonl(y->v32[3]);	\
298386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[3] = ntohl((uint32_t) tmp);		\
299386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  						\
300386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp =  htonl(x->v32[2]) + htonl(y->v32[2])	\
301386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari       + htonl(tmp >> 32);			\
302386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[2] = ntohl((uint32_t) tmp);		\
303386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari                                                \
304386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp =  htonl(x->v32[1]) + htonl(y->v32[1])	\
305386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari       + htonl(tmp >> 32);			\
306386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[1] = ntohl((uint32_t) tmp);		\
307386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  						\
308386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  tmp =  htonl(x->v32[0]) + htonl(y->v32[0])	\
309386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari       + htonl(tmp >> 32);			\
310386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  z->v32[0] = ntohl((uint32_t) tmp);		\
311386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
312386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* WORDS_BIGENDIAN */
313386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* 0 */
314386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
315386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
316386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef DATATYPES_USE_MACROS  /* little functions are really macros */
317386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
318386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define v128_set_to_zero(z)       _v128_set_to_zero(z)
319386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define v128_copy(z, x)           _v128_copy(z, x)
320386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define v128_xor(z, x, y)         _v128_xor(z, x, y)
321386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define v128_and(z, x, y)         _v128_and(z, x, y)
322386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define v128_or(z, x, y)          _v128_or(z, x, y)
323386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define v128_complement(x)        _v128_complement(x)
324386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define v128_is_eq(x, y)          _v128_is_eq(x, y)
325386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define v128_xor_eq(x, y)         _v128_xor_eq(x, y)
326386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define v128_get_bit(x, i)        _v128_get_bit(x, i)
327386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define v128_set_bit(x, i)        _v128_set_bit(x, i)
328386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define v128_clear_bit(x, i)      _v128_clear_bit(x, i)
329386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define v128_set_bit_to(x, i, y)  _v128_set_bit_to(x, i, y)
330386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
331386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#else
332386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
333386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
334386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_set_to_zero(v128_t *x);
335386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
336386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
337386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_is_eq(const v128_t *x, const v128_t *y);
338386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
339386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
340386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_copy(v128_t *x, const v128_t *y);
341386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
342386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
343386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_xor(v128_t *z, v128_t *x, v128_t *y);
344386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
345386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
346386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_and(v128_t *z, v128_t *x, v128_t *y);
347386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
348386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
349386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_or(v128_t *z, v128_t *x, v128_t *y);
350386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
351386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
352386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_complement(v128_t *x);
353386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
354386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
355386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_get_bit(const v128_t *x, int i);
356386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
357386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
358386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_set_bit(v128_t *x, int i) ;
359386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
360386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
361386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_clear_bit(v128_t *x, int i);
362386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
363386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
364386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariv128_set_bit_to(v128_t *x, int i, int y);
365386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
366386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* DATATYPES_USE_MACROS */
367386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
368386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
369386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * octet_string_is_eq(a,b, len) returns 1 if the length len strings a
370386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * and b are not equal, returns 0 otherwise
371386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
372386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
373386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
374386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_string_is_eq(uint8_t *a, uint8_t *b, int len);
375386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
376386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
377386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarioctet_string_set_to_zero(uint8_t *s, int len);
378386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
379386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
380386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef SRTP_KERNEL_LINUX
381386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
382386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
383386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Convert big endian integers to CPU byte order.
384386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
385386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef WORDS_BIGENDIAN
386386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* Nothing to do. */
387386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# define be32_to_cpu(x)	(x)
388386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# define be64_to_cpu(x)	(x)
389386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#elif defined(HAVE_BYTESWAP_H)
390386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* We have (hopefully) optimized versions in byteswap.h */
391386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# include <byteswap.h>
392386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# define be32_to_cpu(x)	bswap_32((x))
393386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# define be64_to_cpu(x)	bswap_64((x))
394386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#else
395386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
396386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if defined(__GNUC__) && defined(HAVE_X86)
397386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* Fall back. */
398386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaristatic inline uint32_t be32_to_cpu(uint32_t v) {
399386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   /* optimized for x86. */
400386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   asm("bswap %0" : "=r" (v) : "0" (v));
401386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   return v;
402386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
403386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# else /* HAVE_X86 */
404386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#  ifdef HAVE_NETINET_IN_H
405386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#   include <netinet/in.h>
406386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#  elif defined HAVE_WINSOCK2_H
407386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#   include <winsock2.h>
408386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#  endif
409386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#  define be32_to_cpu(x)	ntohl((x))
410386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# endif /* HAVE_X86 */
411386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
412386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaristatic inline uint64_t be64_to_cpu(uint64_t v) {
413386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# ifdef NO_64BIT_MATH
414386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   /* use the make64 functions to do 64-bit math */
415386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   v = make64(htonl(low32(v)),htonl(high32(v)));
416386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# else
417386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   /* use the native 64-bit math */
418386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   v= (uint64_t)((be32_to_cpu((uint32_t)(v >> 32))) | (((uint64_t)be32_to_cpu((uint32_t)v)) << 32));
419386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# endif
420386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   return v;
421386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
422386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
423386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* ! SRTP_KERNEL_LINUX */
424386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
425386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* WORDS_BIGENDIAN */
426386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
427386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
428386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * functions manipulating bitvector_t
429386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
430386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * A bitvector_t consists of an array of words and an integer
431386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * representing the number of significant bits stored in the array.
432386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * The bits are packed as follows: the least significant bit is that
433386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * of word[0], while the most significant bit is the nth most
434386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * significant bit of word[m], where length = bits_per_word * m + n.
435386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
436386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
437386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
438386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define bits_per_word  32
439386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define bytes_per_word 4
440386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
441386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef struct {
442386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t length;
443386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t *word;
444386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} bitvector_t;
445386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
446386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
447386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _bitvector_get_bit(v, bit_index)				\
448386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(									\
449386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ((((v)->word[((bit_index) >> 5)]) >> ((bit_index) & 31)) & 1)		\
450386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
451386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
452386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
453386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _bitvector_set_bit(v, bit_index)				\
454386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(									\
455386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari (((v)->word[((bit_index) >> 5)] |= ((uint32_t)1 << ((bit_index) & 31)))) \
456386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
457386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
458386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _bitvector_clear_bit(v, bit_index)				\
459386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(									\
460386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari (((v)->word[((bit_index) >> 5)] &= ~((uint32_t)1 << ((bit_index) & 31)))) \
461386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
462386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
463386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define _bitvector_get_length(v)					\
464386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari(									\
465386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ((v)->length)								\
466386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari)
467386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
468386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef DATATYPES_USE_MACROS  /* little functions are really macros */
469386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
470386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define bitvector_get_bit(v, bit_index) _bitvector_get_bit(v, bit_index)
471386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define bitvector_set_bit(v, bit_index) _bitvector_set_bit(v, bit_index)
472386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define bitvector_clear_bit(v, bit_index) _bitvector_clear_bit(v, bit_index)
473386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define bitvector_get_length(v) _bitvector_get_length(v)
474386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
475386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#else
476386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
477386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
478386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_get_bit(const bitvector_t *v, int bit_index);
479386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
480386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
481386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_set_bit(bitvector_t *v, int bit_index);
482386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
483386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
484386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_clear_bit(bitvector_t *v, int bit_index);
485386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
486386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariunsigned long
487386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_get_length(const bitvector_t *v);
488386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
489386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
490386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
491386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
492386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_alloc(bitvector_t *v, unsigned long length);
493386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
494386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
495386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_dealloc(bitvector_t *v);
496386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
497386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
498386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_set_to_zero(bitvector_t *x);
499386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
500386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
501386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_left_shift(bitvector_t *x, int index);
502386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
503386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
504386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaribitvector_bit_string(bitvector_t *x, char* buf, int len);
505386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
506386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* _DATATYPES_H */
507