Home | History | Annotate | Download | only in include
      1 /*
      2  * math.h
      3  *
      4  * crypto math operations and data types
      5  *
      6  * David A. McGrew
      7  * Cisco Systems, Inc.
      8  */
      9 /*
     10  *
     11  * Copyright (c) 2001-2006 Cisco Systems, Inc.
     12  * All rights reserved.
     13  *
     14  * Redistribution and use in source and binary forms, with or without
     15  * modification, are permitted provided that the following conditions
     16  * are met:
     17  *
     18  *   Redistributions of source code must retain the above copyright
     19  *   notice, this list of conditions and the following disclaimer.
     20  *
     21  *   Redistributions in binary form must reproduce the above
     22  *   copyright notice, this list of conditions and the following
     23  *   disclaimer in the documentation and/or other materials provided
     24  *   with the distribution.
     25  *
     26  *   Neither the name of the Cisco Systems, Inc. nor the names of its
     27  *   contributors may be used to endorse or promote products derived
     28  *   from this software without specific prior written permission.
     29  *
     30  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     31  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     32  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     33  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     34  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     35  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     36  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     37  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     40  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     41  * OF THE POSSIBILITY OF SUCH DAMAGE.
     42  *
     43  */
     44 
     45 #ifndef MATH_H
     46 #define MATH_H
     47 
     48 #include "datatypes.h"
     49 
     50 unsigned char
     51 v32_weight(v32_t a);
     52 
     53 unsigned char
     54 v32_distance(v32_t x, v32_t y);
     55 
     56 unsigned int
     57 v32_dot_product(v32_t a, v32_t b);
     58 
     59 char *
     60 v16_bit_string(v16_t x);
     61 
     62 char *
     63 v32_bit_string(v32_t x);
     64 
     65 char *
     66 v64_bit_string(const v64_t *x);
     67 
     68 char *
     69 octet_hex_string(uint8_t x);
     70 
     71 char *
     72 v16_hex_string(v16_t x);
     73 
     74 char *
     75 v32_hex_string(v32_t x);
     76 
     77 char *
     78 v64_hex_string(const v64_t *x);
     79 
     80 int
     81 hex_char_to_nibble(uint8_t c);
     82 
     83 int
     84 is_hex_string(char *s);
     85 
     86 v16_t
     87 hex_string_to_v16(char *s);
     88 
     89 v32_t
     90 hex_string_to_v32(char *s);
     91 
     92 v64_t
     93 hex_string_to_v64(char *s);
     94 
     95 /* the matrix A[] is stored in column format, i.e., A[i] is
     96    the ith column of the matrix */
     97 
     98 uint8_t
     99 A_times_x_plus_b(uint8_t A[8], uint8_t x, uint8_t b);
    100 
    101 void
    102 v16_copy_octet_string(v16_t *x, const uint8_t s[2]);
    103 
    104 void
    105 v32_copy_octet_string(v32_t *x, const uint8_t s[4]);
    106 
    107 void
    108 v64_copy_octet_string(v64_t *x, const uint8_t s[8]);
    109 
    110 void
    111 v128_add(v128_t *z, v128_t *x, v128_t *y);
    112 
    113 int
    114 octet_string_is_eq(uint8_t *a, uint8_t *b, int len);
    115 
    116 void
    117 octet_string_set_to_zero(uint8_t *s, int len);
    118 
    119 
    120 
    121 /*
    122  * the matrix A[] is stored in column format, i.e., A[i] is the ith
    123  * column of the matrix
    124 */
    125 uint8_t
    126 A_times_x_plus_b(uint8_t A[8], uint8_t x, uint8_t b);
    127 
    128 
    129 #if 0
    130 #if WORDS_BIGENDIAN
    131 
    132 #define _v128_add(z, x, y) {                    \
    133   uint64_t tmp;					\
    134     						\
    135   tmp = x->v32[3] + y->v32[3];                  \
    136   z->v32[3] = (uint32_t) tmp;			\
    137   						\
    138   tmp =  x->v32[2] + y->v32[2] + (tmp >> 32);	\
    139   z->v32[2] = (uint32_t) tmp;                   \
    140 						\
    141   tmp =  x->v32[1] + y->v32[1] + (tmp >> 32);	\
    142   z->v32[1] = (uint32_t) tmp;			\
    143                                                 \
    144   tmp =  x->v32[0] + y->v32[0] + (tmp >> 32);	\
    145   z->v32[0] = (uint32_t) tmp;			\
    146 }
    147 
    148 #else /* assume little endian architecture */
    149 
    150 #define _v128_add(z, x, y) {                    \
    151   uint64_t tmp;					\
    152 						\
    153   tmp = htonl(x->v32[3]) + htonl(y->v32[3]);	\
    154   z->v32[3] = ntohl((uint32_t) tmp);		\
    155   						\
    156   tmp =  htonl(x->v32[2]) + htonl(y->v32[2])	\
    157        + htonl(tmp >> 32);			\
    158   z->v32[2] = ntohl((uint32_t) tmp);		\
    159                                                 \
    160   tmp =  htonl(x->v32[1]) + htonl(y->v32[1])	\
    161        + htonl(tmp >> 32);			\
    162   z->v32[1] = ntohl((uint32_t) tmp);		\
    163   						\
    164   tmp =  htonl(x->v32[0]) + htonl(y->v32[0])	\
    165        + htonl(tmp >> 32);			\
    166   z->v32[0] = ntohl((uint32_t) tmp);		\
    167 }
    168 
    169 #endif /* WORDS_BIGENDIAN */
    170 #endif
    171 
    172 #ifdef DATATYPES_USE_MACROS  /* little functions are really macros */
    173 
    174 #define v128_set_to_zero(z)       _v128_set_to_zero(z)
    175 #define v128_copy(z, x)           _v128_copy(z, x)
    176 #define v128_xor(z, x, y)         _v128_xor(z, x, y)
    177 #define v128_and(z, x, y)         _v128_and(z, x, y)
    178 #define v128_or(z, x, y)          _v128_or(z, x, y)
    179 #define v128_complement(x)        _v128_complement(x)
    180 #define v128_is_eq(x, y)          _v128_is_eq(x, y)
    181 #define v128_xor_eq(x, y)         _v128_xor_eq(x, y)
    182 #define v128_get_bit(x, i)        _v128_get_bit(x, i)
    183 #define v128_set_bit(x, i)        _v128_set_bit(x, i)
    184 #define v128_clear_bit(x, i)      _v128_clear_bit(x, i)
    185 #define v128_set_bit_to(x, i, y)  _v128_set_bit_to(x, i, y)
    186 
    187 #else
    188 
    189 void
    190 v128_set_to_zero(v128_t *x);
    191 
    192 int
    193 v128_is_eq(const v128_t *x, const v128_t *y);
    194 
    195 void
    196 v128_copy(v128_t *x, const v128_t *y);
    197 
    198 void
    199 v128_xor(v128_t *z, v128_t *x, v128_t *y);
    200 
    201 void
    202 v128_and(v128_t *z, v128_t *x, v128_t *y);
    203 
    204 void
    205 v128_or(v128_t *z, v128_t *x, v128_t *y);
    206 
    207 void
    208 v128_complement(v128_t *x);
    209 
    210 int
    211 v128_get_bit(const v128_t *x, int i);
    212 
    213 void
    214 v128_set_bit(v128_t *x, int i) ;
    215 
    216 void
    217 v128_clear_bit(v128_t *x, int i);
    218 
    219 void
    220 v128_set_bit_to(v128_t *x, int i, int y);
    221 
    222 #endif /* DATATYPES_USE_MACROS */
    223 
    224 /*
    225  * octet_string_is_eq(a,b, len) returns 1 if the length len strings a
    226  * and b are not equal, returns 0 otherwise
    227  */
    228 
    229 int
    230 octet_string_is_eq(uint8_t *a, uint8_t *b, int len);
    231 
    232 void
    233 octet_string_set_to_zero(uint8_t *s, int len);
    234 
    235 
    236 #endif /* MATH_H */
    237 
    238 
    239 
    240