1 /*
2  * math.c
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 #include "crypto_math.h"
46 
47 int
48 octet_weight[256] = {
49   0, 1, 1, 2, 1, 2, 2, 3,
50   1, 2, 2, 3, 2, 3, 3, 4,
51   1, 2, 2, 3, 2, 3, 3, 4,
52   2, 3, 3, 4, 3, 4, 4, 5,
53   1, 2, 2, 3, 2, 3, 3, 4,
54   2, 3, 3, 4, 3, 4, 4, 5,
55   2, 3, 3, 4, 3, 4, 4, 5,
56   3, 4, 4, 5, 4, 5, 5, 6,
57   1, 2, 2, 3, 2, 3, 3, 4,
58   2, 3, 3, 4, 3, 4, 4, 5,
59   2, 3, 3, 4, 3, 4, 4, 5,
60   3, 4, 4, 5, 4, 5, 5, 6,
61   2, 3, 3, 4, 3, 4, 4, 5,
62   3, 4, 4, 5, 4, 5, 5, 6,
63   3, 4, 4, 5, 4, 5, 5, 6,
64   4, 5, 5, 6, 5, 6, 6, 7,
65   1, 2, 2, 3, 2, 3, 3, 4,
66   2, 3, 3, 4, 3, 4, 4, 5,
67   2, 3, 3, 4, 3, 4, 4, 5,
68   3, 4, 4, 5, 4, 5, 5, 6,
69   2, 3, 3, 4, 3, 4, 4, 5,
70   3, 4, 4, 5, 4, 5, 5, 6,
71   3, 4, 4, 5, 4, 5, 5, 6,
72   4, 5, 5, 6, 5, 6, 6, 7,
73   2, 3, 3, 4, 3, 4, 4, 5,
74   3, 4, 4, 5, 4, 5, 5, 6,
75   3, 4, 4, 5, 4, 5, 5, 6,
76   4, 5, 5, 6, 5, 6, 6, 7,
77   3, 4, 4, 5, 4, 5, 5, 6,
78   4, 5, 5, 6, 5, 6, 6, 7,
79   4, 5, 5, 6, 5, 6, 6, 7,
80   5, 6, 6, 7, 6, 7, 7, 8
81 };
82 
83 int
84 low_bit[256] = {
85   -1, 0, 1, 0, 2, 0, 1, 0,
86   3, 0, 1, 0, 2, 0, 1, 0,
87   4, 0, 1, 0, 2, 0, 1, 0,
88   3, 0, 1, 0, 2, 0, 1, 0,
89   5, 0, 1, 0, 2, 0, 1, 0,
90   3, 0, 1, 0, 2, 0, 1, 0,
91   4, 0, 1, 0, 2, 0, 1, 0,
92   3, 0, 1, 0, 2, 0, 1, 0,
93   6, 0, 1, 0, 2, 0, 1, 0,
94   3, 0, 1, 0, 2, 0, 1, 0,
95   4, 0, 1, 0, 2, 0, 1, 0,
96   3, 0, 1, 0, 2, 0, 1, 0,
97   5, 0, 1, 0, 2, 0, 1, 0,
98   3, 0, 1, 0, 2, 0, 1, 0,
99   4, 0, 1, 0, 2, 0, 1, 0,
100   3, 0, 1, 0, 2, 0, 1, 0,
101   7, 0, 1, 0, 2, 0, 1, 0,
102   3, 0, 1, 0, 2, 0, 1, 0,
103   4, 0, 1, 0, 2, 0, 1, 0,
104   3, 0, 1, 0, 2, 0, 1, 0,
105   5, 0, 1, 0, 2, 0, 1, 0,
106   3, 0, 1, 0, 2, 0, 1, 0,
107   4, 0, 1, 0, 2, 0, 1, 0,
108   3, 0, 1, 0, 2, 0, 1, 0,
109   6, 0, 1, 0, 2, 0, 1, 0,
110   3, 0, 1, 0, 2, 0, 1, 0,
111   4, 0, 1, 0, 2, 0, 1, 0,
112   3, 0, 1, 0, 2, 0, 1, 0,
113   5, 0, 1, 0, 2, 0, 1, 0,
114   3, 0, 1, 0, 2, 0, 1, 0,
115   4, 0, 1, 0, 2, 0, 1, 0,
116   3, 0, 1, 0, 2, 0, 1, 0
117 };
118 
119 
120 int
121 high_bit[256] = {
122   -1, 0, 1, 1, 2, 2, 2, 2,
123   3, 3, 3, 3, 3, 3, 3, 3,
124   4, 4, 4, 4, 4, 4, 4, 4,
125   4, 4, 4, 4, 4, 4, 4, 4,
126   5, 5, 5, 5, 5, 5, 5, 5,
127   5, 5, 5, 5, 5, 5, 5, 5,
128   5, 5, 5, 5, 5, 5, 5, 5,
129   5, 5, 5, 5, 5, 5, 5, 5,
130   6, 6, 6, 6, 6, 6, 6, 6,
131   6, 6, 6, 6, 6, 6, 6, 6,
132   6, 6, 6, 6, 6, 6, 6, 6,
133   6, 6, 6, 6, 6, 6, 6, 6,
134   6, 6, 6, 6, 6, 6, 6, 6,
135   6, 6, 6, 6, 6, 6, 6, 6,
136   6, 6, 6, 6, 6, 6, 6, 6,
137   6, 6, 6, 6, 6, 6, 6, 6,
138   7, 7, 7, 7, 7, 7, 7, 7,
139   7, 7, 7, 7, 7, 7, 7, 7,
140   7, 7, 7, 7, 7, 7, 7, 7,
141   7, 7, 7, 7, 7, 7, 7, 7,
142   7, 7, 7, 7, 7, 7, 7, 7,
143   7, 7, 7, 7, 7, 7, 7, 7,
144   7, 7, 7, 7, 7, 7, 7, 7,
145   7, 7, 7, 7, 7, 7, 7, 7,
146   7, 7, 7, 7, 7, 7, 7, 7,
147   7, 7, 7, 7, 7, 7, 7, 7,
148   7, 7, 7, 7, 7, 7, 7, 7,
149   7, 7, 7, 7, 7, 7, 7, 7,
150   7, 7, 7, 7, 7, 7, 7, 7,
151   7, 7, 7, 7, 7, 7, 7, 7,
152   7, 7, 7, 7, 7, 7, 7, 7,
153   7, 7, 7, 7, 7, 7, 7, 7
154 };
155 
156 int
octet_get_weight(uint8_t octet)157 octet_get_weight(uint8_t octet) {
158   extern int octet_weight[256];
159 
160   return octet_weight[octet];
161 }
162 
163 unsigned char
v32_weight(v32_t a)164 v32_weight(v32_t a) {
165   unsigned int wt = 0;
166 
167   wt += octet_weight[a.v8[0]];  /* note: endian-ness makes no difference */
168   wt += octet_weight[a.v8[1]];
169   wt += octet_weight[a.v8[2]];
170   wt += octet_weight[a.v8[3]];
171 
172   return wt;
173 }
174 
175 inline unsigned char
v32_distance(v32_t x,v32_t y)176 v32_distance(v32_t x, v32_t y) {
177   x.value ^= y.value;
178   return v32_weight(x);
179 }
180 
181 unsigned int
v32_dot_product(v32_t a,v32_t b)182 v32_dot_product(v32_t a, v32_t b) {
183   a.value &= b.value;
184   return v32_weight(a) & 1;
185 }
186 
187 /*
188  * _bit_string returns a NULL-terminated character string suitable for
189  * printing
190  */
191 
192 #define MAX_STRING_LENGTH 1024
193 
194 char bit_string[MAX_STRING_LENGTH];
195 
196 char *
octet_bit_string(uint8_t x)197 octet_bit_string(uint8_t x) {
198   int mask, index;
199 
200   for (mask = 1, index = 0; mask < 256; mask <<= 1)
201     if ((x & mask) == 0)
202       bit_string[index++] = '0';
203     else
204       bit_string[index++] = '1';
205 
206   bit_string[index++] = 0;  /* NULL terminate string */
207 
208   return bit_string;
209 }
210 
211 char *
v16_bit_string(v16_t x)212 v16_bit_string(v16_t x) {
213   int i, mask, index;
214 
215   for (i = index = 0; i < 2; i++) {
216     for (mask = 1; mask < 256; mask <<= 1)
217       if ((x.v8[i] & mask) == 0)
218 	bit_string[index++] = '0';
219       else
220 	bit_string[index++] = '1';
221   }
222   bit_string[index++] = 0;  /* NULL terminate string */
223   return bit_string;
224 }
225 
226 char *
v32_bit_string(v32_t x)227 v32_bit_string(v32_t x) {
228   int i, mask, index;
229 
230   for (i = index = 0; i < 4; i++) {
231     for (mask = 128; mask > 0; mask >>= 1)
232       if ((x.v8[i] & mask) == 0)
233 	bit_string[index++] = '0';
234       else
235 	bit_string[index++] = '1';
236   }
237   bit_string[index++] = 0;  /* NULL terminate string */
238   return bit_string;
239 }
240 
241 char *
v64_bit_string(const v64_t * x)242 v64_bit_string(const v64_t *x) {
243   int i, mask, index;
244 
245   for (i = index = 0; i < 8; i++) {
246     for (mask = 1; mask < 256; mask <<= 1)
247       if ((x->v8[i] & mask) == 0)
248 	bit_string[index++] = '0';
249       else
250 	bit_string[index++] = '1';
251   }
252   bit_string[index++] = 0;  /* NULL terminate string */
253   return bit_string;
254 }
255 
256 char *
v128_bit_string(v128_t * x)257 v128_bit_string(v128_t *x) {
258   int j, index;
259   uint32_t mask;
260 
261   for (j=index=0; j < 4; j++) {
262     for (mask=0x80000000; mask > 0; mask >>= 1) {
263       if (x->v32[j] & mask)
264 	bit_string[index] = '1';
265       else
266 	bit_string[index] = '0';
267       ++index;
268     }
269   }
270   bit_string[128] = 0; /* null terminate string */
271 
272   return bit_string;
273 }
274 
275 uint8_t
nibble_to_hex_char(uint8_t nibble)276 nibble_to_hex_char(uint8_t nibble) {
277   char buf[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
278 		  '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
279   return buf[nibble & 0xF];
280 }
281 
282 char *
octet_hex_string(uint8_t x)283 octet_hex_string(uint8_t x) {
284 
285   bit_string[0]  = nibble_to_hex_char(x >> 4);
286   bit_string[1]  = nibble_to_hex_char(x & 0xF);
287 
288   bit_string[2] = 0; /* null terminate string */
289   return bit_string;
290 }
291 
292 char *
octet_string_hex_string(const void * str,int length)293 octet_string_hex_string(const void *str, int length) {
294   const uint8_t *s = str;
295   int i;
296 
297   /* double length, since one octet takes two hex characters */
298   length *= 2;
299 
300   /* truncate string if it would be too long */
301   if (length > MAX_STRING_LENGTH)
302     length = MAX_STRING_LENGTH-1;
303 
304   for (i=0; i < length; i+=2) {
305     bit_string[i]   = nibble_to_hex_char(*s >> 4);
306     bit_string[i+1] = nibble_to_hex_char(*s++ & 0xF);
307   }
308   bit_string[i] = 0; /* null terminate string */
309   return bit_string;
310 }
311 
312 char *
v16_hex_string(v16_t x)313 v16_hex_string(v16_t x) {
314   int i, j;
315 
316   for (i=j=0; i < 2; i++) {
317     bit_string[j++]  = nibble_to_hex_char(x.v8[i] >> 4);
318     bit_string[j++]  = nibble_to_hex_char(x.v8[i] & 0xF);
319   }
320 
321   bit_string[j] = 0; /* null terminate string */
322   return bit_string;
323 }
324 
325 char *
v32_hex_string(v32_t x)326 v32_hex_string(v32_t x) {
327   int i, j;
328 
329   for (i=j=0; i < 4; i++) {
330     bit_string[j++]  = nibble_to_hex_char(x.v8[i] >> 4);
331     bit_string[j++]  = nibble_to_hex_char(x.v8[i] & 0xF);
332   }
333 
334   bit_string[j] = 0; /* null terminate string */
335   return bit_string;
336 }
337 
338 char *
v64_hex_string(const v64_t * x)339 v64_hex_string(const v64_t *x) {
340   int i, j;
341 
342   for (i=j=0; i < 8; i++) {
343     bit_string[j++]  = nibble_to_hex_char(x->v8[i] >> 4);
344     bit_string[j++]  = nibble_to_hex_char(x->v8[i] & 0xF);
345   }
346 
347   bit_string[j] = 0; /* null terminate string */
348   return bit_string;
349 }
350 
351 char *
v128_hex_string(v128_t * x)352 v128_hex_string(v128_t *x) {
353   int i, j;
354 
355   for (i=j=0; i < 16; i++) {
356     bit_string[j++]  = nibble_to_hex_char(x->v8[i] >> 4);
357     bit_string[j++]  = nibble_to_hex_char(x->v8[i] & 0xF);
358   }
359 
360   bit_string[j] = 0; /* null terminate string */
361   return bit_string;
362 }
363 
364 char *
char_to_hex_string(char * x,int num_char)365 char_to_hex_string(char *x, int num_char) {
366   int i, j;
367 
368   if (num_char >= 16)
369     num_char = 16;
370   for (i=j=0; i < num_char; i++) {
371     bit_string[j++]  = nibble_to_hex_char(x[i] >> 4);
372     bit_string[j++]  = nibble_to_hex_char(x[i] & 0xF);
373   }
374 
375   bit_string[j] = 0; /* null terminate string */
376   return bit_string;
377 }
378 
379 int
hex_char_to_nibble(uint8_t c)380 hex_char_to_nibble(uint8_t c) {
381   switch(c) {
382   case ('0'): return 0x0;
383   case ('1'): return 0x1;
384   case ('2'): return 0x2;
385   case ('3'): return 0x3;
386   case ('4'): return 0x4;
387   case ('5'): return 0x5;
388   case ('6'): return 0x6;
389   case ('7'): return 0x7;
390   case ('8'): return 0x8;
391   case ('9'): return 0x9;
392   case ('a'): return 0xa;
393   case ('A'): return 0xa;
394   case ('b'): return 0xb;
395   case ('B'): return 0xb;
396   case ('c'): return 0xc;
397   case ('C'): return 0xc;
398   case ('d'): return 0xd;
399   case ('D'): return 0xd;
400   case ('e'): return 0xe;
401   case ('E'): return 0xe;
402   case ('f'): return 0xf;
403   case ('F'): return 0xf;
404   default: return -1;   /* this flags an error */
405   }
406   /* NOTREACHED */
407   return -1;  /* this keeps compilers from complaining */
408 }
409 
410 int
is_hex_string(char * s)411 is_hex_string(char *s) {
412   while(*s != 0)
413     if (hex_char_to_nibble(*s++) == -1)
414       return 0;
415   return 1;
416 }
417 
418 uint8_t
hex_string_to_octet(char * s)419 hex_string_to_octet(char *s) {
420   uint8_t x;
421 
422   x = (hex_char_to_nibble(s[0]) << 4)
423     | hex_char_to_nibble(s[1] & 0xFF);
424 
425   return x;
426 }
427 
428 /*
429  * hex_string_to_octet_string converts a hexadecimal string
430  * of length 2 * len to a raw octet string of length len
431  */
432 
433 int
hex_string_to_octet_string(char * raw,char * hex,int len)434 hex_string_to_octet_string(char *raw, char *hex, int len) {
435   uint8_t x;
436   int tmp;
437   int hex_len;
438 
439   hex_len = 0;
440   while (hex_len < len) {
441     tmp = hex_char_to_nibble(hex[0]);
442     if (tmp == -1)
443       return hex_len;
444     x = (tmp << 4);
445     hex_len++;
446     tmp = hex_char_to_nibble(hex[1]);
447     if (tmp == -1)
448       return hex_len;
449     x |= (tmp & 0xff);
450     hex_len++;
451     *raw++ = x;
452     hex += 2;
453   }
454   return hex_len;
455 }
456 
457 v16_t
hex_string_to_v16(char * s)458 hex_string_to_v16(char *s) {
459   v16_t x;
460   int i, j;
461 
462   for (i=j=0; i < 4; i += 2, j++) {
463     x.v8[j] = (hex_char_to_nibble(s[i]) << 4)
464       | hex_char_to_nibble(s[i+1] & 0xFF);
465   }
466   return x;
467 }
468 
469 v32_t
hex_string_to_v32(char * s)470 hex_string_to_v32(char *s) {
471   v32_t x;
472   int i, j;
473 
474   for (i=j=0; i < 8; i += 2, j++) {
475     x.v8[j] = (hex_char_to_nibble(s[i]) << 4)
476       | hex_char_to_nibble(s[i+1] & 0xFF);
477   }
478   return x;
479 }
480 
481 v64_t
hex_string_to_v64(char * s)482 hex_string_to_v64(char *s) {
483   v64_t x;
484   int i, j;
485 
486   for (i=j=0; i < 16; i += 2, j++) {
487     x.v8[j] = (hex_char_to_nibble(s[i]) << 4)
488       | hex_char_to_nibble(s[i+1] & 0xFF);
489   }
490   return x;
491 }
492 
493 v128_t
hex_string_to_v128(char * s)494 hex_string_to_v128(char *s) {
495   v128_t x;
496   int i, j;
497 
498   for (i=j=0; i < 32; i += 2, j++) {
499     x.v8[j] = (hex_char_to_nibble(s[i]) << 4)
500       | hex_char_to_nibble(s[i+1] & 0xFF);
501   }
502   return x;
503 }
504 
505 
506 
507 /*
508  * the matrix A[] is stored in column format, i.e., A[i] is the ith
509  * column of the matrix
510  */
511 
512 uint8_t
A_times_x_plus_b(uint8_t A[8],uint8_t x,uint8_t b)513 A_times_x_plus_b(uint8_t A[8], uint8_t x, uint8_t b) {
514   int index = 0;
515   unsigned mask;
516 
517   for (mask=1; mask < 256; mask *= 2) {
518     if (x & mask)
519       b^= A[index];
520     ++index;
521   }
522 
523   return b;
524 }
525 
526 inline void
v16_copy_octet_string(v16_t * x,const uint8_t s[2])527 v16_copy_octet_string(v16_t *x, const uint8_t s[2]) {
528   x->v8[0]  = s[0];
529   x->v8[1]  = s[1];
530 }
531 
532 inline void
v32_copy_octet_string(v32_t * x,const uint8_t s[4])533 v32_copy_octet_string(v32_t *x, const uint8_t s[4]) {
534   x->v8[0]  = s[0];
535   x->v8[1]  = s[1];
536   x->v8[2]  = s[2];
537   x->v8[3]  = s[3];
538 }
539 
540 inline void
v64_copy_octet_string(v64_t * x,const uint8_t s[8])541 v64_copy_octet_string(v64_t *x, const uint8_t s[8]) {
542   x->v8[0]  = s[0];
543   x->v8[1]  = s[1];
544   x->v8[2]  = s[2];
545   x->v8[3]  = s[3];
546   x->v8[4]  = s[4];
547   x->v8[5]  = s[5];
548   x->v8[6]  = s[6];
549   x->v8[7]  = s[7];
550 }
551 
552 void
v128_copy_octet_string(v128_t * x,const uint8_t s[16])553 v128_copy_octet_string(v128_t *x, const uint8_t s[16]) {
554   x->v8[0]  = s[0];
555   x->v8[1]  = s[1];
556   x->v8[2]  = s[2];
557   x->v8[3]  = s[3];
558   x->v8[4]  = s[4];
559   x->v8[5]  = s[5];
560   x->v8[6]  = s[6];
561   x->v8[7]  = s[7];
562   x->v8[8]  = s[8];
563   x->v8[9]  = s[9];
564   x->v8[10] = s[10];
565   x->v8[11] = s[11];
566   x->v8[12] = s[12];
567   x->v8[13] = s[13];
568   x->v8[14] = s[14];
569   x->v8[15] = s[15];
570 
571 }
572 
573 #ifndef DATATYPES_USE_MACROS /* little functions are not macros */
574 
575 void
v128_set_to_zero(v128_t * x)576 v128_set_to_zero(v128_t *x) {
577   _v128_set_to_zero(x);
578 }
579 
580 void
v128_copy(v128_t * x,const v128_t * y)581 v128_copy(v128_t *x, const v128_t *y) {
582   _v128_copy(x, y);
583 }
584 
585 void
v128_xor(v128_t * z,v128_t * x,v128_t * y)586 v128_xor(v128_t *z, v128_t *x, v128_t *y) {
587   _v128_xor(z, x, y);
588 }
589 
590 void
v128_and(v128_t * z,v128_t * x,v128_t * y)591 v128_and(v128_t *z, v128_t *x, v128_t *y) {
592   _v128_and(z, x, y);
593 }
594 
595 void
v128_or(v128_t * z,v128_t * x,v128_t * y)596 v128_or(v128_t *z, v128_t *x, v128_t *y) {
597   _v128_or(z, x, y);
598 }
599 
600 void
v128_complement(v128_t * x)601 v128_complement(v128_t *x) {
602   _v128_complement(x);
603 }
604 
605 int
v128_is_eq(const v128_t * x,const v128_t * y)606 v128_is_eq(const v128_t *x, const v128_t *y) {
607   return _v128_is_eq(x, y);
608 }
609 
610 int
v128_get_bit(const v128_t * x,int i)611 v128_get_bit(const v128_t *x, int i) {
612   return _v128_get_bit(x, i);
613 }
614 
615 void
v128_set_bit(v128_t * x,int i)616 v128_set_bit(v128_t *x, int i) {
617   _v128_set_bit(x, i);
618 }
619 
620 void
v128_clear_bit(v128_t * x,int i)621 v128_clear_bit(v128_t *x, int i){
622   _v128_clear_bit(x, i);
623 }
624 
625 void
v128_set_bit_to(v128_t * x,int i,int y)626 v128_set_bit_to(v128_t *x, int i, int y){
627   _v128_set_bit_to(x, i, y);
628 }
629 
630 
631 #endif /* DATATYPES_USE_MACROS */
632 
633 
634 inline void
v128_left_shift2(v128_t * x,int num_bits)635 v128_left_shift2(v128_t *x, int num_bits) {
636   int i;
637   int word_shift = num_bits >> 5;
638   int bit_shift  = num_bits & 31;
639 
640   for (i=0; i < (4-word_shift); i++) {
641     x->v32[i] = x->v32[i+word_shift] << bit_shift;
642   }
643 
644   for (   ; i < word_shift; i++) {
645     x->v32[i] = 0;
646   }
647 
648 }
649 
650 void
v128_right_shift(v128_t * x,int index)651 v128_right_shift(v128_t *x, int index) {
652   const int base_index = index >> 5;
653   const int bit_index = index & 31;
654   int i, from;
655   uint32_t b;
656 
657   if (index > 127) {
658     v128_set_to_zero(x);
659     return;
660   }
661 
662   if (bit_index == 0) {
663 
664     /* copy each word from left size to right side */
665     x->v32[4-1] = x->v32[4-1-base_index];
666     for (i=4-1; i > base_index; i--)
667       x->v32[i-1] = x->v32[i-1-base_index];
668 
669   } else {
670 
671     /* set each word to the "or" of the two bit-shifted words */
672     for (i = 4; i > base_index; i--) {
673       from = i-1 - base_index;
674       b = x->v32[from] << bit_index;
675       if (from > 0)
676         b |= x->v32[from-1] >> (32-bit_index);
677       x->v32[i-1] = b;
678     }
679 
680   }
681 
682   /* now wrap up the final portion */
683   for (i=0; i < base_index; i++)
684     x->v32[i] = 0;
685 
686 }
687 
688 void
v128_left_shift(v128_t * x,int index)689 v128_left_shift(v128_t *x, int index) {
690   int i;
691   const int base_index = index >> 5;
692   const int bit_index = index & 31;
693 
694   if (index > 127) {
695     v128_set_to_zero(x);
696     return;
697   }
698 
699   if (bit_index == 0) {
700     for (i=0; i < 4 - base_index; i++)
701       x->v32[i] = x->v32[i+base_index];
702   } else {
703     for (i=0; i < 4 - base_index - 1; i++)
704       x->v32[i] = (x->v32[i+base_index] << bit_index) ^
705 	(x->v32[i+base_index+1] >> (32 - bit_index));
706     x->v32[4 - base_index-1] = x->v32[4-1] << bit_index;
707   }
708 
709   /* now wrap up the final portion */
710   for (i = 4 - base_index; i < 4; i++)
711     x->v32[i] = 0;
712 
713 }
714 
715 
716 #if 0
717 void
718 v128_add(v128_t *z, v128_t *x, v128_t *y) {
719   /* integer addition modulo 2^128    */
720 
721 #ifdef WORDS_BIGENDIAN
722   uint64_t tmp;
723 
724   tmp = x->v32[3] + y->v32[3];
725   z->v32[3] = (uint32_t) tmp;
726 
727   tmp =  x->v32[2] + y->v32[2] + (tmp >> 32);
728   z->v32[2] = (uint32_t) tmp;
729 
730   tmp =  x->v32[1] + y->v32[1] + (tmp >> 32);
731   z->v32[1] = (uint32_t) tmp;
732 
733   tmp =  x->v32[0] + y->v32[0] + (tmp >> 32);
734   z->v32[0] = (uint32_t) tmp;
735 
736 #else /* assume little endian architecture */
737   uint64_t tmp;
738 
739   tmp = htonl(x->v32[3]) + htonl(y->v32[3]);
740   z->v32[3] = ntohl((uint32_t) tmp);
741 
742   tmp =  htonl(x->v32[2]) + htonl(y->v32[2]) + htonl(tmp >> 32);
743   z->v32[2] = ntohl((uint32_t) tmp);
744 
745   tmp =  htonl(x->v32[1]) + htonl(y->v32[1]) + htonl(tmp >> 32);
746   z->v32[1] = ntohl((uint32_t) tmp);
747 
748   tmp =  htonl(x->v32[0]) + htonl(y->v32[0]) + htonl(tmp >> 32);
749   z->v32[0] = ntohl((uint32_t) tmp);
750 
751 #endif /* WORDS_BIGENDIAN */
752 
753 }
754 #endif
755 
756 int
octet_string_is_eq(uint8_t * a,uint8_t * b,int len)757 octet_string_is_eq(uint8_t *a, uint8_t *b, int len) {
758   uint8_t *end = b + len;
759   while (b < end)
760     if (*a++ != *b++)
761       return 1;
762   return 0;
763 }
764 
765 void
octet_string_set_to_zero(uint8_t * s,int len)766 octet_string_set_to_zero(uint8_t *s, int len) {
767   uint8_t *end = s + len;
768 
769   do {
770     *s = 0;
771   } while (++s < end);
772 
773 }
774 
775 
776 /* functions below not yet tested! */
777 
778 int
v32_low_bit(v32_t * w)779 v32_low_bit(v32_t *w) {
780   int value;
781 
782   value = low_bit[w->v8[0]];
783   if (value != -1)
784     return value;
785   value = low_bit[w->v8[1]];
786   if (value != -1)
787     return value + 8;
788   value = low_bit[w->v8[2]];
789   if (value != -1)
790     return value + 16;
791   value = low_bit[w->v8[3]];
792   if (value == -1)
793     return -1;
794   return value + 24;
795 }
796 
797 /* high_bit not done yet */
798 
799 
800 
801 
802 
803