Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
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 */
45 #include "crypto_math.h"
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 };
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 };
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 };
156 int
157 octet_get_weight(uint8_t octet) {
158 extern int octet_weight[256];
160 return octet_weight[octet];
161 }
163 unsigned char
164 v32_weight(v32_t a) {
165 unsigned int wt = 0;
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]];
172 return wt;
173 }
175 unsigned char
176 v32_distance(v32_t x, v32_t y) {
177 x.value ^= y.value;
178 return v32_weight(x);
179 }
181 unsigned int
182 v32_dot_product(v32_t a, v32_t b) {
183 a.value &= b.value;
184 return v32_weight(a) & 1;
185 }
187 /*
188 * _bit_string returns a NULL-terminated character string suitable for
189 * printing
190 */
192 #define MAX_STRING_LENGTH 1024
194 char bit_string[MAX_STRING_LENGTH];
196 char *
197 octet_bit_string(uint8_t x) {
198 int mask, index;
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';
206 bit_string[index++] = 0; /* NULL terminate string */
208 return bit_string;
209 }
211 char *
212 v16_bit_string(v16_t x) {
213 int i, mask, index;
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 }
226 char *
227 v32_bit_string(v32_t x) {
228 int i, mask, index;
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 }
241 char *
242 v64_bit_string(const v64_t *x) {
243 int i, mask, index;
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 }
256 char *
257 v128_bit_string(v128_t *x) {
258 int j, index;
259 uint32_t mask;
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 */
272 return bit_string;
273 }
275 uint8_t
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 }
282 char *
283 octet_hex_string(uint8_t x) {
285 bit_string[0] = nibble_to_hex_char(x >> 4);
286 bit_string[1] = nibble_to_hex_char(x & 0xF);
288 bit_string[2] = 0; /* null terminate string */
289 return bit_string;
290 }
292 char *
293 octet_string_hex_string(const void *str, int length) {
294 const uint8_t *s = str;
295 int i;
297 /* double length, since one octet takes two hex characters */
298 length *= 2;
300 /* truncate string if it would be too long */
301 if (length > MAX_STRING_LENGTH)
302 length = MAX_STRING_LENGTH-1;
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 }
312 char *
313 v16_hex_string(v16_t x) {
314 int i, j;
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 }
321 bit_string[j] = 0; /* null terminate string */
322 return bit_string;
323 }
325 char *
326 v32_hex_string(v32_t x) {
327 int i, j;
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 }
334 bit_string[j] = 0; /* null terminate string */
335 return bit_string;
336 }
338 char *
339 v64_hex_string(const v64_t *x) {
340 int i, j;
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 }
347 bit_string[j] = 0; /* null terminate string */
348 return bit_string;
349 }
351 char *
352 v128_hex_string(v128_t *x) {
353 int i, j;
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 }
360 bit_string[j] = 0; /* null terminate string */
361 return bit_string;
362 }
364 char *
365 char_to_hex_string(char *x, int num_char) {
366 int i, j;
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 }
375 bit_string[j] = 0; /* null terminate string */
376 return bit_string;
377 }
379 int
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 }
410 int
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 }
418 uint8_t
419 hex_string_to_octet(char *s) {
420 uint8_t x;
422 x = (hex_char_to_nibble(s[0]) << 4)
423 | hex_char_to_nibble(s[1] & 0xFF);
425 return x;
426 }
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 */
433 int
434 hex_string_to_octet_string(char *raw, char *hex, int len) {
435 uint8_t x;
436 int tmp;
437 int hex_len;
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 }
457 v16_t
458 hex_string_to_v16(char *s) {
459 v16_t x;
460 int i, j;
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 }
469 v32_t
470 hex_string_to_v32(char *s) {
471 v32_t x;
472 int i, j;
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 }
481 v64_t
482 hex_string_to_v64(char *s) {
483 v64_t x;
484 int i, j;
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 }
493 v128_t
494 hex_string_to_v128(char *s) {
495 v128_t x;
496 int i, j;
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 }
507 /*
508 * the matrix A[] is stored in column format, i.e., A[i] is the ith
509 * column of the matrix
510 */
512 uint8_t
513 A_times_x_plus_b(uint8_t A[8], uint8_t x, uint8_t b) {
514 int index = 0;
515 unsigned mask;
517 for (mask=1; mask < 256; mask *= 2) {
518 if (x & mask)
519 b^= A[index];
520 ++index;
521 }
523 return b;
524 }
526 void
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 }
532 void
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 }
540 void
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 }
552 void
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];
571 }
573 #ifndef DATATYPES_USE_MACROS /* little functions are not macros */
575 void
576 v128_set_to_zero(v128_t *x) {
577 _v128_set_to_zero(x);
578 }
580 void
581 v128_copy(v128_t *x, const v128_t *y) {
582 _v128_copy(x, y);
583 }
585 void
586 v128_xor(v128_t *z, v128_t *x, v128_t *y) {
587 _v128_xor(z, x, y);
588 }
590 void
591 v128_and(v128_t *z, v128_t *x, v128_t *y) {
592 _v128_and(z, x, y);
593 }
595 void
596 v128_or(v128_t *z, v128_t *x, v128_t *y) {
597 _v128_or(z, x, y);
598 }
600 void
601 v128_complement(v128_t *x) {
602 _v128_complement(x);
603 }
605 int
606 v128_is_eq(const v128_t *x, const v128_t *y) {
607 return _v128_is_eq(x, y);
608 }
610 int
611 v128_get_bit(const v128_t *x, int i) {
612 return _v128_get_bit(x, i);
613 }
615 void
616 v128_set_bit(v128_t *x, int i) {
617 _v128_set_bit(x, i);
618 }
620 void
621 v128_clear_bit(v128_t *x, int i){
622 _v128_clear_bit(x, i);
623 }
625 void
626 v128_set_bit_to(v128_t *x, int i, int y){
627 _v128_set_bit_to(x, i, y);
628 }
631 #endif /* DATATYPES_USE_MACROS */
634 static inline void
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;
640 for (i=0; i < (4-word_shift); i++) {
641 x->v32[i] = x->v32[i+word_shift] << bit_shift;
642 }
644 for ( ; i < word_shift; i++) {
645 x->v32[i] = 0;
646 }
648 }
650 void
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;
657 if (index > 127) {
658 v128_set_to_zero(x);
659 return;
660 }
662 if (bit_index == 0) {
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];
669 } else {
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 }
680 }
682 /* now wrap up the final portion */
683 for (i=0; i < base_index; i++)
684 x->v32[i] = 0;
686 }
688 void
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;
694 if (index > 127) {
695 v128_set_to_zero(x);
696 return;
697 }
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 }
709 /* now wrap up the final portion */
710 for (i = 4 - base_index; i < 4; i++)
711 x->v32[i] = 0;
713 }
716 #if 0
717 void
718 v128_add(v128_t *z, v128_t *x, v128_t *y) {
719 /* integer addition modulo 2^128 */
721 #ifdef WORDS_BIGENDIAN
722 uint64_t tmp;
724 tmp = x->v32[3] + y->v32[3];
725 z->v32[3] = (uint32_t) tmp;
727 tmp = x->v32[2] + y->v32[2] + (tmp >> 32);
728 z->v32[2] = (uint32_t) tmp;
730 tmp = x->v32[1] + y->v32[1] + (tmp >> 32);
731 z->v32[1] = (uint32_t) tmp;
733 tmp = x->v32[0] + y->v32[0] + (tmp >> 32);
734 z->v32[0] = (uint32_t) tmp;
736 #else /* assume little endian architecture */
737 uint64_t tmp;
739 tmp = htonl(x->v32[3]) + htonl(y->v32[3]);
740 z->v32[3] = ntohl((uint32_t) tmp);
742 tmp = htonl(x->v32[2]) + htonl(y->v32[2]) + htonl(tmp >> 32);
743 z->v32[2] = ntohl((uint32_t) tmp);
745 tmp = htonl(x->v32[1]) + htonl(y->v32[1]) + htonl(tmp >> 32);
746 z->v32[1] = ntohl((uint32_t) tmp);
748 tmp = htonl(x->v32[0]) + htonl(y->v32[0]) + htonl(tmp >> 32);
749 z->v32[0] = ntohl((uint32_t) tmp);
751 #endif /* WORDS_BIGENDIAN */
753 }
754 #endif
756 int
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 }
765 void
766 octet_string_set_to_zero(uint8_t *s, int len) {
767 uint8_t *end = s + len;
769 do {
770 *s = 0;
771 } while (++s < end);
773 }
776 /* functions below not yet tested! */
778 int
779 v32_low_bit(v32_t *w) {
780 int value;
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 }
797 /* high_bit not done yet */