Home | History | Annotate | Download | only in include
      1 /*
      2  * datatypes.h
      3  *
      4  * data types for bit vectors and finite fields
      5  *
      6  * David A. McGrew
      7  * Cisco Systems, Inc.
      8  */
      9 
     10 /*
     11  *
     12  * Copyright (c) 2001-2006, Cisco Systems, Inc.
     13  * All rights reserved.
     14  *
     15  * Redistribution and use in source and binary forms, with or without
     16  * modification, are permitted provided that the following conditions
     17  * are met:
     18  *
     19  *   Redistributions of source code must retain the above copyright
     20  *   notice, this list of conditions and the following disclaimer.
     21  *
     22  *   Redistributions in binary form must reproduce the above
     23  *   copyright notice, this list of conditions and the following
     24  *   disclaimer in the documentation and/or other materials provided
     25  *   with the distribution.
     26  *
     27  *   Neither the name of the Cisco Systems, Inc. nor the names of its
     28  *   contributors may be used to endorse or promote products derived
     29  *   from this software without specific prior written permission.
     30  *
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     34  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     35  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     36  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     37  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     38  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     39  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     40  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     41  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     42  * OF THE POSSIBILITY OF SUCH DAMAGE.
     43  *
     44  */
     45 
     46 
     47 #ifndef _DATATYPES_H
     48 #define _DATATYPES_H
     49 
     50 #include "integers.h"           /* definitions of uint32_t, et cetera   */
     51 #include "alloc.h"
     52 
     53 #include <stdarg.h>
     54 
     55 #ifndef SRTP_KERNEL
     56 # include <stdio.h>
     57 # include <string.h>
     58 # include <time.h>
     59 # ifdef HAVE_NETINET_IN_H
     60 #  include <netinet/in.h>
     61 # elif defined HAVE_WINSOCK2_H
     62 #  include <winsock2.h>
     63 # elif defined HAVE_BYTESWAP_METHODS_H
     64 #  include <stdlib.h>
     65 #  define ntohl(x) _byteswap_ulong (x)
     66 #  define ntohs(x) _byteswap_ushort (x)
     67 #  define htonl(x) _byteswap_ulong (x)
     68 #  define htons(x) _byteswap_ushort (x)
     69 # endif
     70 #endif
     71 
     72 
     73 
     74 /* if DATATYPES_USE_MACROS is defined, then little functions are macros */
     75 #define DATATYPES_USE_MACROS
     76 
     77 typedef union {
     78   uint8_t  v8[2];
     79   uint16_t value;
     80 } v16_t;
     81 
     82 typedef union {
     83   uint8_t  v8[4];
     84   uint16_t v16[2];
     85   uint32_t value;
     86 } v32_t;
     87 
     88 typedef union {
     89   uint8_t  v8[8];
     90   uint16_t v16[4];
     91   uint32_t v32[2];
     92   uint64_t value;
     93 } v64_t;
     94 
     95 typedef union {
     96   uint8_t  v8[16];
     97   uint16_t v16[8];
     98   uint32_t v32[4];
     99   uint64_t v64[2];
    100 } v128_t;
    101 
    102 
    103 
    104 /* some useful and simple math functions */
    105 
    106 #define pow_2(X) ( (unsigned int)1 << (X) )   /* 2^X     */
    107 
    108 #define pow_minus_one(X) ( (X) ? -1 : 1 )      /* (-1)^X  */
    109 
    110 
    111 /*
    112  * octet_get_weight(x) returns the hamming weight (number of bits equal to
    113  * one) in the octet x
    114  */
    115 
    116 int
    117 octet_get_weight(uint8_t octet);
    118 
    119 char *
    120 octet_bit_string(uint8_t x);
    121 
    122 #define MAX_PRINT_STRING_LEN 1024
    123 
    124 char *
    125 octet_string_hex_string(const void *str, int length);
    126 
    127 char *
    128 v128_bit_string(v128_t *x);
    129 
    130 char *
    131 v128_hex_string(v128_t *x);
    132 
    133 uint8_t
    134 nibble_to_hex_char(uint8_t nibble);
    135 
    136 char *
    137 char_to_hex_string(char *x, int num_char);
    138 
    139 uint8_t
    140 hex_string_to_octet(char *s);
    141 
    142 /*
    143  * hex_string_to_octet_string(raw, hex, len) converts the hexadecimal
    144  * string at *hex (of length len octets) to the equivalent raw data
    145  * and writes it to *raw.
    146  *
    147  * if a character in the hex string that is not a hexadeciaml digit
    148  * (0123456789abcdefABCDEF) is encountered, the function stops writing
    149  * data to *raw
    150  *
    151  * the number of hex digits copied (which is two times the number of
    152  * octets in *raw) is returned
    153  */
    154 
    155 int
    156 hex_string_to_octet_string(char *raw, char *hex, int len);
    157 
    158 v128_t
    159 hex_string_to_v128(char *s);
    160 
    161 void
    162 v128_copy_octet_string(v128_t *x, const uint8_t s[16]);
    163 
    164 void
    165 v128_left_shift(v128_t *x, int shift_index);
    166 
    167 void
    168 v128_right_shift(v128_t *x, int shift_index);
    169 
    170 /*
    171  * the following macros define the data manipulation functions
    172  *
    173  * If DATATYPES_USE_MACROS is defined, then these macros are used
    174  * directly (and function call overhead is avoided).  Otherwise,
    175  * the macros are used through the functions defined in datatypes.c
    176  * (and the compiler provides better warnings).
    177  */
    178 
    179 #define _v128_set_to_zero(x)     \
    180 (                               \
    181   (x)->v32[0] = 0,              \
    182   (x)->v32[1] = 0,              \
    183   (x)->v32[2] = 0,              \
    184   (x)->v32[3] = 0               \
    185 )
    186 
    187 #define _v128_copy(x, y)          \
    188 (                                \
    189   (x)->v32[0] = (y)->v32[0],     \
    190   (x)->v32[1] = (y)->v32[1],     \
    191   (x)->v32[2] = (y)->v32[2],     \
    192   (x)->v32[3] = (y)->v32[3]      \
    193 )
    194 
    195 #define _v128_xor(z, x, y)                       \
    196 (                                               \
    197    (z)->v32[0] = (x)->v32[0] ^ (y)->v32[0],     \
    198    (z)->v32[1] = (x)->v32[1] ^ (y)->v32[1],     \
    199    (z)->v32[2] = (x)->v32[2] ^ (y)->v32[2],     \
    200    (z)->v32[3] = (x)->v32[3] ^ (y)->v32[3]      \
    201 )
    202 
    203 #define _v128_and(z, x, y)                       \
    204 (                                               \
    205    (z)->v32[0] = (x)->v32[0] & (y)->v32[0],     \
    206    (z)->v32[1] = (x)->v32[1] & (y)->v32[1],     \
    207    (z)->v32[2] = (x)->v32[2] & (y)->v32[2],     \
    208    (z)->v32[3] = (x)->v32[3] & (y)->v32[3]      \
    209 )
    210 
    211 #define _v128_or(z, x, y)                        \
    212 (                                               \
    213    (z)->v32[0] = (x)->v32[0] | (y)->v32[0],     \
    214    (z)->v32[1] = (x)->v32[1] | (y)->v32[1],     \
    215    (z)->v32[2] = (x)->v32[2] | (y)->v32[2],     \
    216    (z)->v32[3] = (x)->v32[3] | (y)->v32[3]      \
    217 )
    218 
    219 #define _v128_complement(x)        \
    220 (                                  \
    221    (x)->v32[0] = ~(x)->v32[0],     \
    222    (x)->v32[1] = ~(x)->v32[1],     \
    223    (x)->v32[2] = ~(x)->v32[2],     \
    224    (x)->v32[3] = ~(x)->v32[3]      \
    225 )
    226 
    227 /* ok for NO_64BIT_MATH if it can compare uint64_t's (even as structures) */
    228 #define _v128_is_eq(x, y)                                        \
    229   (((x)->v64[0] == (y)->v64[0]) && ((x)->v64[1] == (y)->v64[1]))
    230 
    231 
    232 #ifdef NO_64BIT_MATH
    233 #define _v128_xor_eq(z, x)         \
    234 (                                  \
    235    (z)->v32[0] ^= (x)->v32[0],     \
    236    (z)->v32[1] ^= (x)->v32[1],     \
    237    (z)->v32[2] ^= (x)->v32[2],     \
    238    (z)->v32[3] ^= (x)->v32[3]      \
    239 )
    240 #else
    241 #define _v128_xor_eq(z, x)         \
    242 (                                  \
    243    (z)->v64[0] ^= (x)->v64[0],     \
    244    (z)->v64[1] ^= (x)->v64[1]      \
    245 )
    246 #endif
    247 
    248 /* NOTE!  This assumes an odd ordering! */
    249 /* This will not be compatible directly with math on some processors */
    250 /* bit 0 is first 32-bit word, low order bit. in little-endian, that's
    251    the first byte of the first 32-bit word.  In big-endian, that's
    252    the 3rd byte of the first 32-bit word */
    253 /* The get/set bit code is used by the replay code ONLY, and it doesn't
    254    really care which bit is which.  AES does care which bit is which, but
    255    doesn't use the 128-bit get/set or 128-bit shifts  */
    256 
    257 #define _v128_get_bit(x, bit)                     \
    258 (                                                 \
    259   ((((x)->v32[(bit) >> 5]) >> ((bit) & 31)) & 1)  \
    260 )
    261 
    262 #define _v128_set_bit(x, bit)                                    \
    263 (                                                                \
    264   (((x)->v32[(bit) >> 5]) |= ((uint32_t)1 << ((bit) & 31))) \
    265 )
    266 
    267 #define _v128_clear_bit(x, bit)                                   \
    268 (                                                                 \
    269   (((x)->v32[(bit) >> 5]) &= ~((uint32_t)1 << ((bit) & 31))) \
    270 )
    271 
    272 #define _v128_set_bit_to(x, bit, value)   \
    273 (                                         \
    274    (value) ? _v128_set_bit(x, bit) :      \
    275              _v128_clear_bit(x, bit)      \
    276 )
    277 
    278 
    279 #if 0
    280 /* nothing uses this */
    281 #ifdef WORDS_BIGENDIAN
    282 
    283 #define _v128_add(z, x, y) {                    \
    284   uint64_t tmp;					\
    285     						\
    286   tmp = x->v32[3] + y->v32[3];                  \
    287   z->v32[3] = (uint32_t) tmp;			\
    288   						\
    289   tmp =  x->v32[2] + y->v32[2] + (tmp >> 32);	\
    290   z->v32[2] = (uint32_t) tmp;                   \
    291 						\
    292   tmp =  x->v32[1] + y->v32[1] + (tmp >> 32);	\
    293   z->v32[1] = (uint32_t) tmp;			\
    294                                                 \
    295   tmp =  x->v32[0] + y->v32[0] + (tmp >> 32);	\
    296   z->v32[0] = (uint32_t) tmp;			\
    297 }
    298 
    299 #else /* assume little endian architecture */
    300 
    301 #define _v128_add(z, x, y) {                    \
    302   uint64_t tmp;					\
    303 						\
    304   tmp = htonl(x->v32[3]) + htonl(y->v32[3]);	\
    305   z->v32[3] = ntohl((uint32_t) tmp);		\
    306   						\
    307   tmp =  htonl(x->v32[2]) + htonl(y->v32[2])	\
    308        + htonl(tmp >> 32);			\
    309   z->v32[2] = ntohl((uint32_t) tmp);		\
    310                                                 \
    311   tmp =  htonl(x->v32[1]) + htonl(y->v32[1])	\
    312        + htonl(tmp >> 32);			\
    313   z->v32[1] = ntohl((uint32_t) tmp);		\
    314   						\
    315   tmp =  htonl(x->v32[0]) + htonl(y->v32[0])	\
    316        + htonl(tmp >> 32);			\
    317   z->v32[0] = ntohl((uint32_t) tmp);		\
    318 }
    319 #endif /* WORDS_BIGENDIAN */
    320 #endif /* 0 */
    321 
    322 
    323 #ifdef DATATYPES_USE_MACROS  /* little functions are really macros */
    324 
    325 #define v128_set_to_zero(z)       _v128_set_to_zero(z)
    326 #define v128_copy(z, x)           _v128_copy(z, x)
    327 #define v128_xor(z, x, y)         _v128_xor(z, x, y)
    328 #define v128_and(z, x, y)         _v128_and(z, x, y)
    329 #define v128_or(z, x, y)          _v128_or(z, x, y)
    330 #define v128_complement(x)        _v128_complement(x)
    331 #define v128_is_eq(x, y)          _v128_is_eq(x, y)
    332 #define v128_xor_eq(x, y)         _v128_xor_eq(x, y)
    333 #define v128_get_bit(x, i)        _v128_get_bit(x, i)
    334 #define v128_set_bit(x, i)        _v128_set_bit(x, i)
    335 #define v128_clear_bit(x, i)      _v128_clear_bit(x, i)
    336 #define v128_set_bit_to(x, i, y)  _v128_set_bit_to(x, i, y)
    337 
    338 #else
    339 
    340 void
    341 v128_set_to_zero(v128_t *x);
    342 
    343 int
    344 v128_is_eq(const v128_t *x, const v128_t *y);
    345 
    346 void
    347 v128_copy(v128_t *x, const v128_t *y);
    348 
    349 void
    350 v128_xor(v128_t *z, v128_t *x, v128_t *y);
    351 
    352 void
    353 v128_and(v128_t *z, v128_t *x, v128_t *y);
    354 
    355 void
    356 v128_or(v128_t *z, v128_t *x, v128_t *y);
    357 
    358 void
    359 v128_complement(v128_t *x);
    360 
    361 int
    362 v128_get_bit(const v128_t *x, int i);
    363 
    364 void
    365 v128_set_bit(v128_t *x, int i) ;
    366 
    367 void
    368 v128_clear_bit(v128_t *x, int i);
    369 
    370 void
    371 v128_set_bit_to(v128_t *x, int i, int y);
    372 
    373 #endif /* DATATYPES_USE_MACROS */
    374 
    375 /*
    376  * octet_string_is_eq(a,b, len) returns 1 if the length len strings a
    377  * and b are not equal, returns 0 otherwise
    378  */
    379 
    380 int
    381 octet_string_is_eq(uint8_t *a, uint8_t *b, int len);
    382 
    383 void
    384 octet_string_set_to_zero(uint8_t *s, int len);
    385 
    386 
    387 #ifndef SRTP_KERNEL_LINUX
    388 
    389 /*
    390  * Convert big endian integers to CPU byte order.
    391  */
    392 #ifdef WORDS_BIGENDIAN
    393 /* Nothing to do. */
    394 # define be32_to_cpu(x)	(x)
    395 # define be64_to_cpu(x)	(x)
    396 #elif defined(HAVE_BYTESWAP_H)
    397 /* We have (hopefully) optimized versions in byteswap.h */
    398 # include <byteswap.h>
    399 # define be32_to_cpu(x)	bswap_32((x))
    400 # define be64_to_cpu(x)	bswap_64((x))
    401 #else
    402 
    403 #if defined(__GNUC__) && defined(HAVE_X86)
    404 /* Fall back. */
    405 static INLINE uint32_t be32_to_cpu(uint32_t v) {
    406    /* optimized for x86. */
    407    asm("bswap %0" : "=r" (v) : "0" (v));
    408    return v;
    409 }
    410 # else /* HAVE_X86 */
    411 #  ifdef HAVE_NETINET_IN_H
    412 #   include <netinet/in.h>
    413 #  elif defined HAVE_WINSOCK2_H
    414 #   include <winsock2.h>
    415 #  endif
    416 #  define be32_to_cpu(x)	ntohl((x))
    417 # endif /* HAVE_X86 */
    418 
    419 static INLINE uint64_t be64_to_cpu(uint64_t v) {
    420 # ifdef NO_64BIT_MATH
    421    /* use the make64 functions to do 64-bit math */
    422    v = make64(htonl(low32(v)),htonl(high32(v)));
    423 # else
    424    /* use the native 64-bit math */
    425    v= (uint64_t)((be32_to_cpu((uint32_t)(v >> 32))) | (((uint64_t)be32_to_cpu((uint32_t)v)) << 32));
    426 # endif
    427    return v;
    428 }
    429 
    430 #endif /* ! SRTP_KERNEL_LINUX */
    431 
    432 #endif /* WORDS_BIGENDIAN */
    433 
    434 /*
    435  * functions manipulating bitvector_t
    436  *
    437  * A bitvector_t consists of an array of words and an integer
    438  * representing the number of significant bits stored in the array.
    439  * The bits are packed as follows: the least significant bit is that
    440  * of word[0], while the most significant bit is the nth most
    441  * significant bit of word[m], where length = bits_per_word * m + n.
    442  *
    443  */
    444 
    445 #define bits_per_word  32
    446 #define bytes_per_word 4
    447 
    448 typedef struct {
    449   uint32_t length;
    450   uint32_t *word;
    451 } bitvector_t;
    452 
    453 
    454 #define _bitvector_get_bit(v, bit_index)				\
    455 (									\
    456  ((((v)->word[((bit_index) >> 5)]) >> ((bit_index) & 31)) & 1)		\
    457 )
    458 
    459 
    460 #define _bitvector_set_bit(v, bit_index)				\
    461 (									\
    462  (((v)->word[((bit_index) >> 5)] |= ((uint32_t)1 << ((bit_index) & 31)))) \
    463 )
    464 
    465 #define _bitvector_clear_bit(v, bit_index)				\
    466 (									\
    467  (((v)->word[((bit_index) >> 5)] &= ~((uint32_t)1 << ((bit_index) & 31)))) \
    468 )
    469 
    470 #define _bitvector_get_length(v)					\
    471 (									\
    472  ((v)->length)								\
    473 )
    474 
    475 #ifdef DATATYPES_USE_MACROS  /* little functions are really macros */
    476 
    477 #define bitvector_get_bit(v, bit_index) _bitvector_get_bit(v, bit_index)
    478 #define bitvector_set_bit(v, bit_index) _bitvector_set_bit(v, bit_index)
    479 #define bitvector_clear_bit(v, bit_index) _bitvector_clear_bit(v, bit_index)
    480 #define bitvector_get_length(v) _bitvector_get_length(v)
    481 
    482 #else
    483 
    484 int
    485 bitvector_get_bit(const bitvector_t *v, int bit_index);
    486 
    487 void
    488 bitvector_set_bit(bitvector_t *v, int bit_index);
    489 
    490 void
    491 bitvector_clear_bit(bitvector_t *v, int bit_index);
    492 
    493 unsigned long
    494 bitvector_get_length(const bitvector_t *v);
    495 
    496 #endif
    497 
    498 int
    499 bitvector_alloc(bitvector_t *v, unsigned long length);
    500 
    501 void
    502 bitvector_dealloc(bitvector_t *v);
    503 
    504 void
    505 bitvector_set_to_zero(bitvector_t *x);
    506 
    507 void
    508 bitvector_left_shift(bitvector_t *x, int index);
    509 
    510 char *
    511 bitvector_bit_string(bitvector_t *x, char* buf, int len);
    512 
    513 #endif /* _DATATYPES_H */
    514