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