diff options
author | Erwin Nindl <nine@wirdorange.org> | 2007-07-13 16:05:16 +0000 |
---|---|---|
committer | Erwin Nindl <nine@wirdorange.org> | 2007-07-13 16:05:16 +0000 |
commit | 17b77485fa4ea8ecbf472e2d1daa15007ff93705 (patch) | |
tree | 1b1c72d09b898f8d5dcdd68dcbd86d030e66ded5 /srtp/crypto/math | |
parent | bugfix window size (diff) |
* removed srtp directory
* install libsrtp under /usr/local/lib
* cleaned up Makefile
Diffstat (limited to 'srtp/crypto/math')
-rw-r--r-- | srtp/crypto/math/CVS/Entries | 5 | ||||
-rw-r--r-- | srtp/crypto/math/CVS/Repository | 1 | ||||
-rw-r--r-- | srtp/crypto/math/CVS/Root | 1 | ||||
-rw-r--r-- | srtp/crypto/math/datatypes.c | 600 | ||||
-rw-r--r-- | srtp/crypto/math/gf2_8.c | 83 | ||||
-rw-r--r-- | srtp/crypto/math/math.c | 962 | ||||
-rw-r--r-- | srtp/crypto/math/stat.c | 367 |
7 files changed, 0 insertions, 2019 deletions
diff --git a/srtp/crypto/math/CVS/Entries b/srtp/crypto/math/CVS/Entries deleted file mode 100644 index 292b955..0000000 --- a/srtp/crypto/math/CVS/Entries +++ /dev/null @@ -1,5 +0,0 @@ -/datatypes.c/1.9/Tue Jul 18 19:45:46 2006// -/gf2_8.c/1.3/Thu Jun 8 17:00:28 2006// -/math.c/1.6/Thu Jun 8 17:00:28 2006// -/stat.c/1.7/Wed Jul 12 22:22:09 2006// -D diff --git a/srtp/crypto/math/CVS/Repository b/srtp/crypto/math/CVS/Repository deleted file mode 100644 index 739b84b..0000000 --- a/srtp/crypto/math/CVS/Repository +++ /dev/null @@ -1 +0,0 @@ -srtp/crypto/math diff --git a/srtp/crypto/math/CVS/Root b/srtp/crypto/math/CVS/Root deleted file mode 100644 index 05e15d8..0000000 --- a/srtp/crypto/math/CVS/Root +++ /dev/null @@ -1 +0,0 @@ -srtp.cvs.sourceforge.net:/cvsroot/srtp diff --git a/srtp/crypto/math/datatypes.c b/srtp/crypto/math/datatypes.c deleted file mode 100644 index 61bf34f..0000000 --- a/srtp/crypto/math/datatypes.c +++ /dev/null @@ -1,600 +0,0 @@ -/* - * datatypes.c - * - * data types for finite fields and functions for input, output, and - * manipulation - * - * David A. McGrew - * Cisco Systems, Inc. - */ -/* - * - * Copyright (c) 2001-2006 Cisco Systems, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * Neither the name of the Cisco Systems, Inc. nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include "datatypes.h" - -int -octet_weight[256] = { - 0, 1, 1, 2, 1, 2, 2, 3, - 1, 2, 2, 3, 2, 3, 3, 4, - 1, 2, 2, 3, 2, 3, 3, 4, - 2, 3, 3, 4, 3, 4, 4, 5, - 1, 2, 2, 3, 2, 3, 3, 4, - 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, - 3, 4, 4, 5, 4, 5, 5, 6, - 1, 2, 2, 3, 2, 3, 3, 4, - 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, - 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, - 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, - 4, 5, 5, 6, 5, 6, 6, 7, - 1, 2, 2, 3, 2, 3, 3, 4, - 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, - 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, - 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, - 4, 5, 5, 6, 5, 6, 6, 7, - 2, 3, 3, 4, 3, 4, 4, 5, - 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, - 4, 5, 5, 6, 5, 6, 6, 7, - 3, 4, 4, 5, 4, 5, 5, 6, - 4, 5, 5, 6, 5, 6, 6, 7, - 4, 5, 5, 6, 5, 6, 6, 7, - 5, 6, 6, 7, 6, 7, 7, 8 -}; - -int -octet_get_weight(uint8_t octet) { - extern int octet_weight[256]; - - return octet_weight[octet]; -} - -/* - * bit_string is a buffer that is used to hold output strings, e.g. - * for printing. - */ - -/* the value MAX_PRINT_STRING_LEN is defined in datatypes.h */ - -char bit_string[MAX_PRINT_STRING_LEN]; - -uint8_t -nibble_to_hex_char(uint8_t nibble) { - char buf[16] = {'0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; - return buf[nibble & 0xF]; -} - -char * -octet_string_hex_string(const void *s, int length) { - const uint8_t *str = (const uint8_t *)s; - int i; - - /* double length, since one octet takes two hex characters */ - length *= 2; - - /* truncate string if it would be too long */ - if (length > MAX_PRINT_STRING_LEN) - length = MAX_PRINT_STRING_LEN-1; - - for (i=0; i < length; i+=2) { - bit_string[i] = nibble_to_hex_char(*str >> 4); - bit_string[i+1] = nibble_to_hex_char(*str++ & 0xF); - } - bit_string[i] = 0; /* null terminate string */ - return bit_string; -} - -inline int -hex_char_to_nibble(uint8_t c) { - switch(c) { - case ('0'): return 0x0; - case ('1'): return 0x1; - case ('2'): return 0x2; - case ('3'): return 0x3; - case ('4'): return 0x4; - case ('5'): return 0x5; - case ('6'): return 0x6; - case ('7'): return 0x7; - case ('8'): return 0x8; - case ('9'): return 0x9; - case ('a'): return 0xa; - case ('A'): return 0xa; - case ('b'): return 0xb; - case ('B'): return 0xb; - case ('c'): return 0xc; - case ('C'): return 0xc; - case ('d'): return 0xd; - case ('D'): return 0xd; - case ('e'): return 0xe; - case ('E'): return 0xe; - case ('f'): return 0xf; - case ('F'): return 0xf; - default: return -1; /* this flags an error */ - } - /* NOTREACHED */ - return -1; /* this keeps compilers from complaining */ -} - -int -is_hex_string(char *s) { - while(*s != 0) - if (hex_char_to_nibble(*s++) == -1) - return 0; - return 1; -} - -/* - * hex_string_to_octet_string converts a hexadecimal string - * of length 2 * len to a raw octet string of length len - */ - -int -hex_string_to_octet_string(char *raw, char *hex, int len) { - uint8_t x; - int tmp; - int hex_len; - - hex_len = 0; - while (hex_len < len) { - tmp = hex_char_to_nibble(hex[0]); - if (tmp == -1) - return hex_len; - x = (tmp << 4); - hex_len++; - tmp = hex_char_to_nibble(hex[1]); - if (tmp == -1) - return hex_len; - x |= (tmp & 0xff); - hex_len++; - *raw++ = x; - hex += 2; - } - return hex_len; -} - -char * -v128_hex_string(v128_t *x) { - int i, j; - - for (i=j=0; i < 16; i++) { - bit_string[j++] = nibble_to_hex_char(x->v8[i] >> 4); - bit_string[j++] = nibble_to_hex_char(x->v8[i] & 0xF); - } - - bit_string[j] = 0; /* null terminate string */ - return bit_string; -} - -char * -v128_bit_string(v128_t *x) { - int j, index; - uint32_t mask; - - for (j=index=0; j < 4; j++) { - for (mask=0x80000000; mask > 0; mask >>= 1) { - if (x->v32[j] & mask) - bit_string[index] = '1'; - else - bit_string[index] = '0'; - ++index; - } - } - bit_string[128] = 0; /* null terminate string */ - - return bit_string; -} - -void -v128_copy_octet_string(v128_t *x, const uint8_t s[16]) { -#ifdef ALIGNMENT_32BIT_REQUIRED - if ((((uint32_t) &s[0]) & 0x3) != 0) -#endif - { - x->v8[0] = s[0]; - x->v8[1] = s[1]; - x->v8[2] = s[2]; - x->v8[3] = s[3]; - x->v8[4] = s[4]; - x->v8[5] = s[5]; - x->v8[6] = s[6]; - x->v8[7] = s[7]; - x->v8[8] = s[8]; - x->v8[9] = s[9]; - x->v8[10] = s[10]; - x->v8[11] = s[11]; - x->v8[12] = s[12]; - x->v8[13] = s[13]; - x->v8[14] = s[14]; - x->v8[15] = s[15]; - } -#ifdef ALIGNMENT_32BIT_REQUIRED - else - { - v128_t *v = (v128_t *) &s[0]; - - v128_copy(x,v); - } -#endif -} - -#ifndef DATATYPES_USE_MACROS /* little functions are not macros */ - -void -v128_set_to_zero(v128_t *x) { - _v128_set_to_zero(x); -} - -void -v128_copy(v128_t *x, const v128_t *y) { - _v128_copy(x, y); -} - -void -v128_xor(v128_t *z, v128_t *x, v128_t *y) { - _v128_xor(z, x, y); -} - -void -v128_and(v128_t *z, v128_t *x, v128_t *y) { - _v128_and(z, x, y); -} - -void -v128_or(v128_t *z, v128_t *x, v128_t *y) { - _v128_or(z, x, y); -} - -void -v128_complement(v128_t *x) { - _v128_complement(x); -} - -int -v128_is_eq(const v128_t *x, const v128_t *y) { - return _v128_is_eq(x, y); -} - -int -v128_xor_eq(v128_t *x, const v128_t *y) { - return _v128_xor_eq(x, y); -} - -int -v128_get_bit(const v128_t *x, int i) { - return _v128_get_bit(x, i); -} - -void -v128_set_bit(v128_t *x, int i) { - _v128_set_bit(x, i); -} - -void -v128_clear_bit(v128_t *x, int i){ - _v128_clear_bit(x, i); -} - -void -v128_set_bit_to(v128_t *x, int i, int y){ - _v128_set_bit_to(x, i, y); -} - - -#endif /* DATATYPES_USE_MACROS */ - -void -v128_right_shift(v128_t *x, int index) { - const int base_index = index >> 5; - const int bit_index = index & 31; - int i, from; - uint32_t b; - - if (index > 127) { - v128_set_to_zero(x); - return; - } - - if (bit_index == 0) { - - /* copy each word from left size to right side */ - x->v32[4-1] = x->v32[4-1-base_index]; - for (i=4-1; i > base_index; i--) - x->v32[i-1] = x->v32[i-1-base_index]; - - } else { - - /* set each word to the "or" of the two bit-shifted words */ - for (i = 4; i > base_index; i--) { - from = i-1 - base_index; - b = x->v32[from] << bit_index; - if (from > 0) - b |= x->v32[from-1] >> (32-bit_index); - x->v32[i-1] = b; - } - - } - - /* now wrap up the final portion */ - for (i=0; i < base_index; i++) - x->v32[i] = 0; - -} - -void -v128_left_shift(v128_t *x, int index) { - int i; - const int base_index = index >> 5; - const int bit_index = index & 31; - - if (index > 127) { - v128_set_to_zero(x); - return; - } - - if (bit_index == 0) { - for (i=0; i < 4 - base_index; i++) - x->v32[i] = x->v32[i+base_index]; - } else { - for (i=0; i < 4 - base_index - 1; i++) - x->v32[i] = (x->v32[i+base_index] >> bit_index) ^ - (x->v32[i+base_index+1] << (32 - bit_index)); - x->v32[4 - base_index-1] = x->v32[4-1] >> bit_index; - } - - /* now wrap up the final portion */ - for (i = 4 - base_index; i < 4; i++) - x->v32[i] = 0; - -} - - -int -octet_string_is_eq(uint8_t *a, uint8_t *b, int len) { - uint8_t *end = b + len; - while (b < end) - if (*a++ != *b++) - return 1; - return 0; -} - -void -octet_string_set_to_zero(uint8_t *s, int len) { - uint8_t *end = s + len; - - do { - *s = 0; - } while (++s < end); - -} - - -/* - * From RFC 1521: The Base64 Alphabet - * - * Value Encoding Value Encoding Value Encoding Value Encoding - * 0 A 17 R 34 i 51 z - * 1 B 18 S 35 j 52 0 - * 2 C 19 T 36 k 53 1 - * 3 D 20 U 37 l 54 2 - * 4 E 21 V 38 m 55 3 - * 5 F 22 W 39 n 56 4 - * 6 G 23 X 40 o 57 5 - * 7 H 24 Y 41 p 58 6 - * 8 I 25 Z 42 q 59 7 - * 9 J 26 a 43 r 60 8 - * 10 K 27 b 44 s 61 9 - * 11 L 28 c 45 t 62 + - * 12 M 29 d 46 u 63 / - * 13 N 30 e 47 v - * 14 O 31 f 48 w (pad) = - * 15 P 32 g 49 x - * 16 Q 33 h 50 y - */ - -int -base64_char_to_sextet(uint8_t c) { - switch(c) { - case 'A': - return 0; - case 'B': - return 1; - case 'C': - return 2; - case 'D': - return 3; - case 'E': - return 4; - case 'F': - return 5; - case 'G': - return 6; - case 'H': - return 7; - case 'I': - return 8; - case 'J': - return 9; - case 'K': - return 10; - case 'L': - return 11; - case 'M': - return 12; - case 'N': - return 13; - case 'O': - return 14; - case 'P': - return 15; - case 'Q': - return 16; - case 'R': - return 17; - case 'S': - return 18; - case 'T': - return 19; - case 'U': - return 20; - case 'V': - return 21; - case 'W': - return 22; - case 'X': - return 23; - case 'Y': - return 24; - case 'Z': - return 25; - case 'a': - return 26; - case 'b': - return 27; - case 'c': - return 28; - case 'd': - return 29; - case 'e': - return 30; - case 'f': - return 31; - case 'g': - return 32; - case 'h': - return 33; - case 'i': - return 34; - case 'j': - return 35; - case 'k': - return 36; - case 'l': - return 37; - case 'm': - return 38; - case 'n': - return 39; - case 'o': - return 40; - case 'p': - return 41; - case 'q': - return 42; - case 'r': - return 43; - case 's': - return 44; - case 't': - return 45; - case 'u': - return 46; - case 'v': - return 47; - case 'w': - return 48; - case 'x': - return 49; - case 'y': - return 50; - case 'z': - return 51; - case '0': - return 52; - case '1': - return 53; - case '2': - return 54; - case '3': - return 55; - case '4': - return 56; - case '5': - return 57; - case '6': - return 58; - case '7': - return 59; - case '8': - return 60; - case '9': - return 61; - case '+': - return 62; - case '/': - return 63; - case '=': - return 64; - default: - break; - } - return -1; -} - -/* - * base64_string_to_octet_string converts a hexadecimal string - * of length 2 * len to a raw octet string of length len - */ - -int -base64_string_to_octet_string(char *raw, char *base64, int len) { - uint8_t x; - int tmp; - int base64_len; - - base64_len = 0; - while (base64_len < len) { - tmp = base64_char_to_sextet(base64[0]); - if (tmp == -1) - return base64_len; - x = (tmp << 6); - base64_len++; - tmp = base64_char_to_sextet(base64[1]); - if (tmp == -1) - return base64_len; - x |= (tmp & 0xffff); - base64_len++; - *raw++ = x; - base64 += 2; - } - return base64_len; -} diff --git a/srtp/crypto/math/gf2_8.c b/srtp/crypto/math/gf2_8.c deleted file mode 100644 index 8a112ba..0000000 --- a/srtp/crypto/math/gf2_8.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * gf2_8.c - * - * GF(256) finite field implementation, with the representation used - * in the AES cipher. - * - * David A. McGrew - * Cisco Systems, Inc. - */ - -/* - * - * Copyright (c) 2001-2006, Cisco Systems, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * Neither the name of the Cisco Systems, Inc. nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - - -#include "datatypes.h" -#include "gf2_8.h" - -/* gf2_8_shift() moved to gf2_8.h as an inline function */ - -inline gf2_8 -gf2_8_multiply(gf2_8 x, gf2_8 y) { - gf2_8 z = 0; - - if (y & 1) z ^= x; x = gf2_8_shift(x); - if (y & 2) z ^= x; x = gf2_8_shift(x); - if (y & 4) z ^= x; x = gf2_8_shift(x); - if (y & 8) z ^= x; x = gf2_8_shift(x); - if (y & 16) z ^= x; x = gf2_8_shift(x); - if (y & 32) z ^= x; x = gf2_8_shift(x); - if (y & 64) z ^= x; x = gf2_8_shift(x); - if (y & 128) z ^= x; - - return z; -} - - -/* this should use the euclidean algorithm */ - -gf2_8 -gf2_8_compute_inverse(gf2_8 x) { - unsigned int i; - - if (x == 0) return 0; /* zero is a special case */ - for (i=0; i < 256; i++) - if (gf2_8_multiply((gf2_8) i, x) == 1) - return (gf2_8) i; - - return 0; -} - diff --git a/srtp/crypto/math/math.c b/srtp/crypto/math/math.c deleted file mode 100644 index 3e61997..0000000 --- a/srtp/crypto/math/math.c +++ /dev/null @@ -1,962 +0,0 @@ -/* - * math.c - * - * crypto math operations and data types - * - * David A. McGrew - * Cisco Systems, Inc. - */ -/* - * - * Copyright (c) 2001-2006 Cisco Systems, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * Neither the name of the Cisco Systems, Inc. nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include "crypto_math.h" -#include <stdlib.h> /* malloc() used in bitvector_alloc */ - -int -octet_weight[256] = { - 0, 1, 1, 2, 1, 2, 2, 3, - 1, 2, 2, 3, 2, 3, 3, 4, - 1, 2, 2, 3, 2, 3, 3, 4, - 2, 3, 3, 4, 3, 4, 4, 5, - 1, 2, 2, 3, 2, 3, 3, 4, - 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, - 3, 4, 4, 5, 4, 5, 5, 6, - 1, 2, 2, 3, 2, 3, 3, 4, - 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, - 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, - 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, - 4, 5, 5, 6, 5, 6, 6, 7, - 1, 2, 2, 3, 2, 3, 3, 4, - 2, 3, 3, 4, 3, 4, 4, 5, - 2, 3, 3, 4, 3, 4, 4, 5, - 3, 4, 4, 5, 4, 5, 5, 6, - 2, 3, 3, 4, 3, 4, 4, 5, - 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, - 4, 5, 5, 6, 5, 6, 6, 7, - 2, 3, 3, 4, 3, 4, 4, 5, - 3, 4, 4, 5, 4, 5, 5, 6, - 3, 4, 4, 5, 4, 5, 5, 6, - 4, 5, 5, 6, 5, 6, 6, 7, - 3, 4, 4, 5, 4, 5, 5, 6, - 4, 5, 5, 6, 5, 6, 6, 7, - 4, 5, 5, 6, 5, 6, 6, 7, - 5, 6, 6, 7, 6, 7, 7, 8 -}; - -int -low_bit[256] = { - -1, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 5, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 6, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 5, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 7, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 5, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 6, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 5, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, - 3, 0, 1, 0, 2, 0, 1, 0 -}; - - -int -high_bit[256] = { - -1, 0, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7 -}; - -int -octet_get_weight(uint8_t octet) { - extern int octet_weight[256]; - - return octet_weight[octet]; -} - -unsigned char -v32_weight(v32_t a) { - unsigned int wt = 0; - - wt += octet_weight[a.v8[0]]; /* note: endian-ness makes no difference */ - wt += octet_weight[a.v8[1]]; - wt += octet_weight[a.v8[2]]; - wt += octet_weight[a.v8[3]]; - - return wt; -} - -inline unsigned char -v32_distance(v32_t x, v32_t y) { - x.value ^= y.value; - return v32_weight(x); -} - -unsigned int -v32_dot_product(v32_t a, v32_t b) { - a.value &= b.value; - return v32_weight(a) & 1; -} - -/* - * _bit_string returns a NULL-terminated character string suitable for - * printing - */ - -#define MAX_STRING_LENGTH 1024 - -char bit_string[MAX_STRING_LENGTH]; - -char * -octet_bit_string(uint8_t x) { - int mask, index; - - for (mask = 1, index = 0; mask < 256; mask <<= 1) - if ((x & mask) == 0) - bit_string[index++] = '0'; - else - bit_string[index++] = '1'; - - bit_string[index++] = 0; /* NULL terminate string */ - - return bit_string; -} - -char * -v16_bit_string(v16_t x) { - int i, mask, index; - - for (i = index = 0; i < 2; i++) { - for (mask = 1; mask < 256; mask <<= 1) - if ((x.v8[i] & mask) == 0) - bit_string[index++] = '0'; - else - bit_string[index++] = '1'; - } - bit_string[index++] = 0; /* NULL terminate string */ - return bit_string; -} - -char * -v32_bit_string(v32_t x) { - int i, mask, index; - - for (i = index = 0; i < 4; i++) { - for (mask = 128; mask > 0; mask >>= 1) - if ((x.v8[i] & mask) == 0) - bit_string[index++] = '0'; - else - bit_string[index++] = '1'; - } - bit_string[index++] = 0; /* NULL terminate string */ - return bit_string; -} - -char * -v64_bit_string(const v64_t *x) { - int i, mask, index; - - for (i = index = 0; i < 8; i++) { - for (mask = 1; mask < 256; mask <<= 1) - if ((x->v8[i] & mask) == 0) - bit_string[index++] = '0'; - else - bit_string[index++] = '1'; - } - bit_string[index++] = 0; /* NULL terminate string */ - return bit_string; -} - -char * -v128_bit_string(v128_t *x) { - int j, index; - uint32_t mask; - - for (j=index=0; j < 4; j++) { - for (mask=0x80000000; mask > 0; mask >>= 1) { - if (x->v32[j] & mask) - bit_string[index] = '1'; - else - bit_string[index] = '0'; - ++index; - } - } - bit_string[128] = 0; /* null terminate string */ - - return bit_string; -} - -uint8_t -nibble_to_hex_char(uint8_t nibble) { - char buf[16] = {'0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; - return buf[nibble & 0xF]; -} - -char * -octet_hex_string(uint8_t x) { - - bit_string[0] = nibble_to_hex_char(x >> 4); - bit_string[1] = nibble_to_hex_char(x & 0xF); - - bit_string[2] = 0; /* null terminate string */ - return bit_string; -} - -char * -octet_string_hex_string(const void *str, int length) { - const uint8_t *s = str; - int i; - - /* double length, since one octet takes two hex characters */ - length *= 2; - - /* truncate string if it would be too long */ - if (length > MAX_STRING_LENGTH) - length = MAX_STRING_LENGTH-1; - - for (i=0; i < length; i+=2) { - bit_string[i] = nibble_to_hex_char(*s >> 4); - bit_string[i+1] = nibble_to_hex_char(*s++ & 0xF); - } - bit_string[i] = 0; /* null terminate string */ - return bit_string; -} - -char * -v16_hex_string(v16_t x) { - int i, j; - - for (i=j=0; i < 2; i++) { - bit_string[j++] = nibble_to_hex_char(x.v8[i] >> 4); - bit_string[j++] = nibble_to_hex_char(x.v8[i] & 0xF); - } - - bit_string[j] = 0; /* null terminate string */ - return bit_string; -} - -char * -v32_hex_string(v32_t x) { - int i, j; - - for (i=j=0; i < 4; i++) { - bit_string[j++] = nibble_to_hex_char(x.v8[i] >> 4); - bit_string[j++] = nibble_to_hex_char(x.v8[i] & 0xF); - } - - bit_string[j] = 0; /* null terminate string */ - return bit_string; -} - -char * -v64_hex_string(const v64_t *x) { - int i, j; - - for (i=j=0; i < 8; i++) { - bit_string[j++] = nibble_to_hex_char(x->v8[i] >> 4); - bit_string[j++] = nibble_to_hex_char(x->v8[i] & 0xF); - } - - bit_string[j] = 0; /* null terminate string */ - return bit_string; -} - -char * -v128_hex_string(v128_t *x) { - int i, j; - - for (i=j=0; i < 16; i++) { - bit_string[j++] = nibble_to_hex_char(x->v8[i] >> 4); - bit_string[j++] = nibble_to_hex_char(x->v8[i] & 0xF); - } - - bit_string[j] = 0; /* null terminate string */ - return bit_string; -} - -char * -char_to_hex_string(char *x, int num_char) { - int i, j; - - if (num_char >= 16) - num_char = 16; - for (i=j=0; i < num_char; i++) { - bit_string[j++] = nibble_to_hex_char(x[i] >> 4); - bit_string[j++] = nibble_to_hex_char(x[i] & 0xF); - } - - bit_string[j] = 0; /* null terminate string */ - return bit_string; -} - -int -hex_char_to_nibble(uint8_t c) { - switch(c) { - case ('0'): return 0x0; - case ('1'): return 0x1; - case ('2'): return 0x2; - case ('3'): return 0x3; - case ('4'): return 0x4; - case ('5'): return 0x5; - case ('6'): return 0x6; - case ('7'): return 0x7; - case ('8'): return 0x8; - case ('9'): return 0x9; - case ('a'): return 0xa; - case ('A'): return 0xa; - case ('b'): return 0xb; - case ('B'): return 0xb; - case ('c'): return 0xc; - case ('C'): return 0xc; - case ('d'): return 0xd; - case ('D'): return 0xd; - case ('e'): return 0xe; - case ('E'): return 0xe; - case ('f'): return 0xf; - case ('F'): return 0xf; - default: return -1; /* this flags an error */ - } - /* NOTREACHED */ - return -1; /* this keeps compilers from complaining */ -} - -int -is_hex_string(char *s) { - while(*s != 0) - if (hex_char_to_nibble(*s++) == -1) - return 0; - return 1; -} - -uint8_t -hex_string_to_octet(char *s) { - uint8_t x; - - x = (hex_char_to_nibble(s[0]) << 4) - | hex_char_to_nibble(s[1] & 0xFF); - - return x; -} - -/* - * hex_string_to_octet_string converts a hexadecimal string - * of length 2 * len to a raw octet string of length len - */ - -int -hex_string_to_octet_string(char *raw, char *hex, int len) { - uint8_t x; - int tmp; - int hex_len; - - hex_len = 0; - while (hex_len < len) { - tmp = hex_char_to_nibble(hex[0]); - if (tmp == -1) - return hex_len; - x = (tmp << 4); - hex_len++; - tmp = hex_char_to_nibble(hex[1]); - if (tmp == -1) - return hex_len; - x |= (tmp & 0xff); - hex_len++; - *raw++ = x; - hex += 2; - } - return hex_len; -} - -v16_t -hex_string_to_v16(char *s) { - v16_t x; - int i, j; - - for (i=j=0; i < 4; i += 2, j++) { - x.v8[j] = (hex_char_to_nibble(s[i]) << 4) - | hex_char_to_nibble(s[i+1] & 0xFF); - } - return x; -} - -v32_t -hex_string_to_v32(char *s) { - v32_t x; - int i, j; - - for (i=j=0; i < 8; i += 2, j++) { - x.v8[j] = (hex_char_to_nibble(s[i]) << 4) - | hex_char_to_nibble(s[i+1] & 0xFF); - } - return x; -} - -v64_t -hex_string_to_v64(char *s) { - v64_t x; - int i, j; - - for (i=j=0; i < 16; i += 2, j++) { - x.v8[j] = (hex_char_to_nibble(s[i]) << 4) - | hex_char_to_nibble(s[i+1] & 0xFF); - } - return x; -} - -v128_t -hex_string_to_v128(char *s) { - v128_t x; - int i, j; - - for (i=j=0; i < 32; i += 2, j++) { - x.v8[j] = (hex_char_to_nibble(s[i]) << 4) - | hex_char_to_nibble(s[i+1] & 0xFF); - } - return x; -} - - - -/* - * the matrix A[] is stored in column format, i.e., A[i] is the ith - * column of the matrix - */ - -uint8_t -A_times_x_plus_b(uint8_t A[8], uint8_t x, uint8_t b) { - int index = 0; - unsigned mask; - - for (mask=1; mask < 256; mask *= 2) { - if (x & mask) - b^= A[index]; - ++index; - } - - return b; -} - -inline void -v16_copy_octet_string(v16_t *x, const uint8_t s[2]) { - x->v8[0] = s[0]; - x->v8[1] = s[1]; -} - -inline void -v32_copy_octet_string(v32_t *x, const uint8_t s[4]) { - x->v8[0] = s[0]; - x->v8[1] = s[1]; - x->v8[2] = s[2]; - x->v8[3] = s[3]; -} - -inline void -v64_copy_octet_string(v64_t *x, const uint8_t s[8]) { - x->v8[0] = s[0]; - x->v8[1] = s[1]; - x->v8[2] = s[2]; - x->v8[3] = s[3]; - x->v8[4] = s[4]; - x->v8[5] = s[5]; - x->v8[6] = s[6]; - x->v8[7] = s[7]; -} - -void -v128_copy_octet_string(v128_t *x, const uint8_t s[16]) { - x->v8[0] = s[0]; - x->v8[1] = s[1]; - x->v8[2] = s[2]; - x->v8[3] = s[3]; - x->v8[4] = s[4]; - x->v8[5] = s[5]; - x->v8[6] = s[6]; - x->v8[7] = s[7]; - x->v8[8] = s[8]; - x->v8[9] = s[9]; - x->v8[10] = s[10]; - x->v8[11] = s[11]; - x->v8[12] = s[12]; - x->v8[13] = s[13]; - x->v8[14] = s[14]; - x->v8[15] = s[15]; - -} - -#ifndef DATATYPES_USE_MACROS /* little functions are not macros */ - -void -v128_set_to_zero(v128_t *x) { - _v128_set_to_zero(x); -} - -void -v128_copy(v128_t *x, const v128_t *y) { - _v128_copy(x, y); -} - -void -v128_xor(v128_t *z, v128_t *x, v128_t *y) { - _v128_xor(z, x, y); -} - -void -v128_and(v128_t *z, v128_t *x, v128_t *y) { - _v128_and(z, x, y); -} - -void -v128_or(v128_t *z, v128_t *x, v128_t *y) { - _v128_or(z, x, y); -} - -void -v128_complement(v128_t *x) { - _v128_complement(x); -} - -int -v128_is_eq(const v128_t *x, const v128_t *y) { - return _v128_is_eq(x, y); -} - -int -v128_get_bit(const v128_t *x, int i) { - return _v128_get_bit(x, i); -} - -void -v128_set_bit(v128_t *x, int i) { - _v128_set_bit(x, i); -} - -void -v128_clear_bit(v128_t *x, int i){ - _v128_clear_bit(x, i); -} - -void -v128_set_bit_to(v128_t *x, int i, int y){ - _v128_set_bit_to(x, i, y); -} - - -#endif /* DATATYPES_USE_MACROS */ - - -inline void -v128_left_shift2(v128_t *x, int num_bits) { - int i; - int word_shift = num_bits >> 5; - int bit_shift = num_bits & 31; - - for (i=0; i < (4-word_shift); i++) { - x->v32[i] = x->v32[i+word_shift] << bit_shift; - } - - for ( ; i < word_shift; i++) { - x->v32[i] = 0; - } - -} - -void -v128_right_shift(v128_t *x, int index) { - const int base_index = index >> 5; - const int bit_index = index & 31; - int i, from; - uint32_t b; - - if (index > 127) { - v128_set_to_zero(x); - return; - } - - if (bit_index == 0) { - - /* copy each word from left size to right side */ - x->v32[4-1] = x->v32[4-1-base_index]; - for (i=4-1; i > base_index; i--) - x->v32[i-1] = x->v32[i-1-base_index]; - - } else { - - /* set each word to the "or" of the two bit-shifted words */ - for (i = 4; i > base_index; i--) { - from = i-1 - base_index; - b = x->v32[from] << bit_index; - if (from > 0) - b |= x->v32[from-1] >> (32-bit_index); - x->v32[i-1] = b; - } - - } - - /* now wrap up the final portion */ - for (i=0; i < base_index; i++) - x->v32[i] = 0; - -} - -void -v128_left_shift(v128_t *x, int index) { - int i; - const int base_index = index >> 5; - const int bit_index = index & 31; - - if (index > 127) { - v128_set_to_zero(x); - return; - } - - if (bit_index == 0) { - for (i=0; i < 4 - base_index; i++) - x->v32[i] = x->v32[i+base_index]; - } else { - for (i=0; i < 4 - base_index - 1; i++) - x->v32[i] = (x->v32[i+base_index] << bit_index) ^ - (x->v32[i+base_index+1] >> (32 - bit_index)); - x->v32[4 - base_index-1] = x->v32[4-1] << bit_index; - } - - /* now wrap up the final portion */ - for (i = 4 - base_index; i < 4; i++) - x->v32[i] = 0; - -} - - -#if 0 -void -v128_add(v128_t *z, v128_t *x, v128_t *y) { - /* integer addition modulo 2^128 */ - -#ifdef WORDS_BIGENDIAN - uint64_t tmp; - - tmp = x->v32[3] + y->v32[3]; - z->v32[3] = (uint32_t) tmp; - - tmp = x->v32[2] + y->v32[2] + (tmp >> 32); - z->v32[2] = (uint32_t) tmp; - - tmp = x->v32[1] + y->v32[1] + (tmp >> 32); - z->v32[1] = (uint32_t) tmp; - - tmp = x->v32[0] + y->v32[0] + (tmp >> 32); - z->v32[0] = (uint32_t) tmp; - -#else /* assume little endian architecture */ - uint64_t tmp; - - tmp = htonl(x->v32[3]) + htonl(y->v32[3]); - z->v32[3] = ntohl((uint32_t) tmp); - - tmp = htonl(x->v32[2]) + htonl(y->v32[2]) + htonl(tmp >> 32); - z->v32[2] = ntohl((uint32_t) tmp); - - tmp = htonl(x->v32[1]) + htonl(y->v32[1]) + htonl(tmp >> 32); - z->v32[1] = ntohl((uint32_t) tmp); - - tmp = htonl(x->v32[0]) + htonl(y->v32[0]) + htonl(tmp >> 32); - z->v32[0] = ntohl((uint32_t) tmp); - -#endif /* WORDS_BIGENDIAN */ - -} -#endif - -int -octet_string_is_eq(uint8_t *a, uint8_t *b, int len) { - uint8_t *end = b + len; - while (b < end) - if (*a++ != *b++) - return 1; - return 0; -} - -void -octet_string_set_to_zero(uint8_t *s, int len) { - uint8_t *end = s + len; - - do { - *s = 0; - } while (++s < end); - -} - -/* functions manipulating bit_vector_t */ - -#define BITVECTOR_MAX_WORDS 5 - -int -bitvector_alloc(bitvector_t *v, unsigned long length) { - unsigned long l = (length + bytes_per_word - 1) / bytes_per_word; - int i; - - /* allocate memory, then set parameters */ - if (l > BITVECTOR_MAX_WORDS) - return -1; - else - l = BITVECTOR_MAX_WORDS; - v->word = malloc(l); - if (v->word == NULL) - return -1; - v->length = length; - - /* initialize bitvector to zero */ - for (i=0; i < (length >> 5); i++) { - v->word = 0; - } - - return 0; -} - -void -bitvector_set_bit(bitvector_t *v, int bit_index) { - - v->word[(bit_index >> 5)] |= (1 << (bit_index & 31)); - -} - -int -bitvector_get_bit(const bitvector_t *v, int bit_index) { - - return ((v->word[(bit_index >> 5)]) >> (bit_index & 31)) & 1; - -} - -#include <stdio.h> - -int -bitvector_print_hex(const bitvector_t *v, FILE *stream) { - int i; - int m = v->length >> 5; - int n = v->length & 31; - char string[9]; - uint32_t tmp; - - /* if length isn't a multiple of four, we can't hex_print */ - if (n & 3) - return -1; - - /* if the length is zero, do nothing */ - if (v->length == 0) - return 0; - - /* - * loop over words from most significant to least significant - - */ - - for (i=m; i > 0; i++) { - char *str = string + 7; - tmp = v->word[i]; - - /* null terminate string */ - string[8] = 0; - - /* loop over nibbles */ - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); - - /* now print stream */ - fprintf(stream, string); - } - - return 0; - -} - - -int -hex_string_length(char *s) { - int count = 0; - - /* ignore leading zeros */ - while ((*s != 0) && *s == '0') - s++; - - /* count remaining characters */ - while (*s != 0) { - if (hex_char_to_nibble(*s++) == -1) - return -1; - count++; - } - - return count; -} - -int -bitvector_set_from_hex(bitvector_t *v, char *string) { - int num_hex_chars, m, n, i, j; - uint32_t tmp; - - num_hex_chars = hex_string_length(string); - if (num_hex_chars == -1) - return -1; - - /* set length */ - v->length = num_hex_chars * 4; - /* - * at this point, we should subtract away a bit if the high - * bit of the first character is zero, but we ignore that - * for now and assume that we're four-bit aligned - DAM - */ - - - m = num_hex_chars / 8; /* number of words */ - n = num_hex_chars % 8; /* number of nibbles in last word */ - - /* if the length is greater than the bitvector, return an error */ - if (m > BITVECTOR_MAX_WORDS) - return -1; - - /* - * loop over words from most significant - first word is a special - * case - */ - - if (n) { - tmp = 0; - for (i=0; i < n; i++) { - tmp = hex_char_to_nibble(*string++); - tmp <<= 4; - } - v->word[m] = tmp; - } - - /* now loop over the rest of the words */ - for (i=m-1; i >= 0; i--) { - tmp = 0; - for (j=0; j < 8; j++) { - tmp = hex_char_to_nibble(*string++); - tmp <<= 4; - } - v->word[i] = tmp; - } - - return 0; -} - - -/* functions below not yet tested! */ - -int -v32_low_bit(v32_t *w) { - int value; - - value = low_bit[w->v8[0]]; - if (value != -1) - return value; - value = low_bit[w->v8[1]]; - if (value != -1) - return value + 8; - value = low_bit[w->v8[2]]; - if (value != -1) - return value + 16; - value = low_bit[w->v8[3]]; - if (value == -1) - return -1; - return value + 24; -} - -/* high_bit not done yet */ - - - - - diff --git a/srtp/crypto/math/stat.c b/srtp/crypto/math/stat.c deleted file mode 100644 index 5e46c20..0000000 --- a/srtp/crypto/math/stat.c +++ /dev/null @@ -1,367 +0,0 @@ -/* - * stats.c - * - * statistical tests for randomness (FIPS 140-2, Section 4.9) - * - * David A. McGrew - * Cisco Systems, Inc. - */ - -#include "stat.h" - -debug_module_t mod_stat = { - 0, /* debugging is off by default */ - (char *)"stat test" /* printable module name */ -}; - -/* - * each test assumes that 20,000 bits (2500 octets) of data is - * provided as input - */ - -#define STAT_TEST_DATA_LEN 2500 - -err_status_t -stat_test_monobit(uint8_t *data) { - uint8_t *data_end = data + STAT_TEST_DATA_LEN; - uint16_t ones_count; - - ones_count = 0; - while (data < data_end) { - ones_count += octet_get_weight(*data); - data++; - } - - debug_print(mod_stat, "bit count: %d", ones_count); - - if ((ones_count < 9725) || (ones_count > 10275)) - return err_status_algo_fail; - - return err_status_ok; -} - -err_status_t -stat_test_poker(uint8_t *data) { - int i; - uint8_t *data_end = data + STAT_TEST_DATA_LEN; - double poker; - uint16_t f[16] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 - }; - - while (data < data_end) { - f[*data & 0x0f]++; /* increment freq. count for low nibble */ - f[(*data) >> 4]++; /* increment freq. count for high nibble */ - data++; - } - - poker = 0.0; - for (i=0; i < 16; i++) - poker += (double) f[i] * f[i]; - - poker *= (16.0 / 5000.0); - poker -= 5000.0; - - debug_print(mod_stat, "poker test: %f\n", poker); - - if ((poker < 2.16) || (poker > 46.17)) - return err_status_algo_fail; - - return err_status_ok; -} - - -/* - * runs[i] holds the number of runs of size (i-1) - */ - -err_status_t -stat_test_runs(uint8_t *data) { - uint8_t *data_end = data + STAT_TEST_DATA_LEN; - uint16_t runs[6] = { 0, 0, 0, 0, 0, 0 }; - uint16_t gaps[6] = { 0, 0, 0, 0, 0, 0 }; - uint16_t lo_value[6] = { 2315, 1114, 527, 240, 103, 103 }; - uint16_t hi_value[6] = { 2685, 1386, 723, 384, 209, 209 }; - int state = 0; - uint16_t mask; - int i; - - /* - * the state variable holds the number of bits in the - * current run (or gap, if negative) - */ - - while (data < data_end) { - - /* loop over the bits of this byte */ - for (mask = 1; mask < 256; mask <<= 1) { - if (*data & mask) { - - /* next bit is a one */ - if (state > 0) { - - /* prefix is a run, so increment the run-count */ - state++; - - /* check for long runs */ - if (state > 25) { - debug_print(mod_stat, ">25 runs: %d", state); - return err_status_algo_fail; - } - - } else if (state < 0) { - - /* prefix is a gap */ - if (state < -25) { - debug_print(mod_stat, ">25 gaps: %d", state); - return err_status_algo_fail; /* long-runs test failed */ - } - if (state < -6) { - state = -6; /* group together gaps > 5 */ - } - gaps[-1-state]++; /* increment gap count */ - state = 1; /* set state at one set bit */ - } else { - - /* state is zero; this happens only at initialization */ - state = 1; - } - } else { - - /* next bit is a zero */ - if (state > 0) { - - /* prefix is a run */ - if (state > 25) { - debug_print(mod_stat, ">25 runs (2): %d", state); - return err_status_algo_fail; /* long-runs test failed */ - } - if (state > 6) { - state = 6; /* group together runs > 5 */ - } - runs[state-1]++; /* increment run count */ - state = -1; /* set state at one zero bit */ - } else if (state < 0) { - - /* prefix is a gap, so increment gap-count (decrement state) */ - state--; - - /* check for long gaps */ - if (state < -25) { - debug_print(mod_stat, ">25 gaps (2): %d", state); - return err_status_algo_fail; - } - - } else { - - /* state is zero; this happens only at initialization */ - state = -1; - } - } - } - - /* move along to next octet */ - data++; - } - - if (mod_stat.on) { - debug_print(mod_stat, "runs test", NULL); - for (i=0; i < 6; i++) - debug_print(mod_stat, " runs[]: %d", runs[i]); - for (i=0; i < 6; i++) - debug_print(mod_stat, " gaps[]: %d", gaps[i]); - } - - /* check run and gap counts against the fixed limits */ - for (i=0; i < 6; i++) - if ( (runs[i] < lo_value[i] ) || (runs[i] > hi_value[i]) - || (gaps[i] < lo_value[i] ) || (gaps[i] > hi_value[i])) - return err_status_algo_fail; - - - return err_status_ok; -} - - -/* - * the function stat_test_rand_source applys the FIPS-140-2 statistical - * tests to the random source defined by rs - * - */ - -#define RAND_SRC_BUF_OCTETS 50 /* this value MUST divide 2500! */ - -err_status_t -stat_test_rand_source(rand_source_func_t get_rand_bytes) { - int i; - double poker; - uint8_t *data, *data_end; - uint16_t f[16] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 - }; - uint8_t buffer[RAND_SRC_BUF_OCTETS]; - err_status_t status; - int ones_count = 0; - uint16_t runs[6] = { 0, 0, 0, 0, 0, 0 }; - uint16_t gaps[6] = { 0, 0, 0, 0, 0, 0 }; - uint16_t lo_value[6] = { 2315, 1114, 527, 240, 103, 103 }; - uint16_t hi_value[6] = { 2685, 1386, 723, 384, 209, 209 }; - int state = 0; - uint16_t mask; - - /* counters for monobit, poker, and runs tests are initialized above */ - - /* main loop: fill buffer, update counters for stat tests */ - for (i=0; i < 2500; i+=RAND_SRC_BUF_OCTETS) { - - /* fill data buffer */ - status = get_rand_bytes(buffer, RAND_SRC_BUF_OCTETS); - if (status) { - debug_print(mod_stat, "couldn't get rand bytes: %d",status); - return status; - } - -#if 0 - debug_print(mod_stat, "%s", - octet_string_hex_string(buffer, RAND_SRC_BUF_OCTETS)); -#endif - - data = buffer; - data_end = data + RAND_SRC_BUF_OCTETS; - while (data < data_end) { - - /* update monobit test counter */ - ones_count += octet_get_weight(*data); - - /* update poker test counters */ - f[*data & 0x0f]++; /* increment freq. count for low nibble */ - f[(*data) >> 4]++; /* increment freq. count for high nibble */ - - /* update runs test counters */ - /* loop over the bits of this byte */ - for (mask = 1; mask < 256; mask <<= 1) { - if (*data & mask) { - - /* next bit is a one */ - if (state > 0) { - - /* prefix is a run, so increment the run-count */ - state++; - - /* check for long runs */ - if (state > 25) { - debug_print(mod_stat, ">25 runs (3): %d", state); - return err_status_algo_fail; - } - - } else if (state < 0) { - - /* prefix is a gap */ - if (state < -25) { - debug_print(mod_stat, ">25 gaps (3): %d", state); - return err_status_algo_fail; /* long-runs test failed */ - } - if (state < -6) { - state = -6; /* group together gaps > 5 */ - } - gaps[-1-state]++; /* increment gap count */ - state = 1; /* set state at one set bit */ - } else { - - /* state is zero; this happens only at initialization */ - state = 1; - } - } else { - - /* next bit is a zero */ - if (state > 0) { - - /* prefix is a run */ - if (state > 25) { - debug_print(mod_stat, ">25 runs (4): %d", state); - return err_status_algo_fail; /* long-runs test failed */ - } - if (state > 6) { - state = 6; /* group together runs > 5 */ - } - runs[state-1]++; /* increment run count */ - state = -1; /* set state at one zero bit */ - } else if (state < 0) { - - /* prefix is a gap, so increment gap-count (decrement state) */ - state--; - - /* check for long gaps */ - if (state < -25) { - debug_print(mod_stat, ">25 gaps (4): %d", state); - return err_status_algo_fail; - } - - } else { - - /* state is zero; this happens only at initialization */ - state = -1; - } - } - } - - /* advance data pointer */ - data++; - } - } - - /* check to see if test data is within bounds */ - - /* check monobit test data */ - - debug_print(mod_stat, "stat: bit count: %d", ones_count); - - if ((ones_count < 9725) || (ones_count > 10275)) { - debug_print(mod_stat, "stat: failed monobit test %d", ones_count); - return err_status_algo_fail; - } - - /* check poker test data */ - poker = 0.0; - for (i=0; i < 16; i++) - poker += (double) f[i] * f[i]; - - poker *= (16.0 / 5000.0); - poker -= 5000.0; - - debug_print(mod_stat, "stat: poker test: %f", poker); - - if ((poker < 2.16) || (poker > 46.17)) { - debug_print(mod_stat, "stat: failed poker test", NULL); - return err_status_algo_fail; - } - - /* check run and gap counts against the fixed limits */ - for (i=0; i < 6; i++) - if ((runs[i] < lo_value[i] ) || (runs[i] > hi_value[i]) - || (gaps[i] < lo_value[i] ) || (gaps[i] > hi_value[i])) { - debug_print(mod_stat, "stat: failed run/gap test", NULL); - return err_status_algo_fail; - } - - debug_print(mod_stat, "passed random stat test", NULL); - return err_status_ok; -} - -err_status_t -stat_test_rand_source_with_repetition(rand_source_func_t source, unsigned num_trials) { - unsigned int i; - err_status_t err = err_status_algo_fail; - - for (i=0; i < num_trials; i++) { - err = stat_test_rand_source(source); - if (err == err_status_ok) { - return err_status_ok; - } - debug_print(mod_stat, "failed stat test (try number %d)\n", i); - } - - return err; -} |