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