OLD | NEW |
1 /* | 1 /* |
2 * datatypes.c | 2 * datatypes.c |
3 * | 3 * |
4 * data types for finite fields and functions for input, output, and | 4 * data types for finite fields and functions for input, output, and |
5 * manipulation | 5 * manipulation |
6 * | 6 * |
7 * David A. McGrew | 7 * David A. McGrew |
8 * Cisco Systems, Inc. | 8 * Cisco Systems, Inc. |
9 */ | 9 */ |
10 /* | 10 /* |
(...skipping 25 matching lines...) Expand all Loading... |
36 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 36 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
37 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | 37 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
38 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 38 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
41 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | 41 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
42 * OF THE POSSIBILITY OF SUCH DAMAGE. | 42 * OF THE POSSIBILITY OF SUCH DAMAGE. |
43 * | 43 * |
44 */ | 44 */ |
45 | 45 |
| 46 #ifdef HAVE_CONFIG_H |
| 47 #include <config.h> |
| 48 #endif |
| 49 |
46 #include "datatypes.h" | 50 #include "datatypes.h" |
47 | 51 |
48 int | 52 int |
49 octet_weight[256] = { | 53 octet_weight[256] = { |
50 0, 1, 1, 2, 1, 2, 2, 3, | 54 0, 1, 1, 2, 1, 2, 2, 3, |
51 1, 2, 2, 3, 2, 3, 3, 4, | 55 1, 2, 2, 3, 2, 3, 3, 4, |
52 1, 2, 2, 3, 2, 3, 3, 4, | 56 1, 2, 2, 3, 2, 3, 3, 4, |
53 2, 3, 3, 4, 3, 4, 4, 5, | 57 2, 3, 3, 4, 3, 4, 4, 5, |
54 1, 2, 2, 3, 2, 3, 3, 4, | 58 1, 2, 2, 3, 2, 3, 3, 4, |
55 2, 3, 3, 4, 3, 4, 4, 5, | 59 2, 3, 3, 4, 3, 4, 4, 5, |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 length = MAX_PRINT_STRING_LEN-1; | 121 length = MAX_PRINT_STRING_LEN-1; |
118 | 122 |
119 for (i=0; i < length; i+=2) { | 123 for (i=0; i < length; i+=2) { |
120 bit_string[i] = nibble_to_hex_char(*str >> 4); | 124 bit_string[i] = nibble_to_hex_char(*str >> 4); |
121 bit_string[i+1] = nibble_to_hex_char(*str++ & 0xF); | 125 bit_string[i+1] = nibble_to_hex_char(*str++ & 0xF); |
122 } | 126 } |
123 bit_string[i] = 0; /* null terminate string */ | 127 bit_string[i] = 0; /* null terminate string */ |
124 return bit_string; | 128 return bit_string; |
125 } | 129 } |
126 | 130 |
127 static INLINE int | 131 static inline int |
128 hex_char_to_nibble(uint8_t c) { | 132 hex_char_to_nibble(uint8_t c) { |
129 switch(c) { | 133 switch(c) { |
130 case ('0'): return 0x0; | 134 case ('0'): return 0x0; |
131 case ('1'): return 0x1; | 135 case ('1'): return 0x1; |
132 case ('2'): return 0x2; | 136 case ('2'): return 0x2; |
133 case ('3'): return 0x3; | 137 case ('3'): return 0x3; |
134 case ('4'): return 0x4; | 138 case ('4'): return 0x4; |
135 case ('5'): return 0x5; | 139 case ('5'): return 0x5; |
136 case ('6'): return 0x6; | 140 case ('6'): return 0x6; |
137 case ('7'): return 0x7; | 141 case ('7'): return 0x7; |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 void | 522 void |
519 octet_string_set_to_zero(uint8_t *s, int len) { | 523 octet_string_set_to_zero(uint8_t *s, int len) { |
520 uint8_t *end = s + len; | 524 uint8_t *end = s + len; |
521 | 525 |
522 do { | 526 do { |
523 *s = 0; | 527 *s = 0; |
524 } while (++s < end); | 528 } while (++s < end); |
525 | 529 |
526 } | 530 } |
527 | 531 |
| 532 #ifdef TESTAPP_SOURCE |
528 | 533 |
529 /* | 534 static const char b64chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
530 * From RFC 1521: The Base64 Alphabet | 535 "abcdefghijklmnopqrstuvwxyz0123456789+/"; |
531 * | |
532 * Value Encoding Value Encoding Value Encoding Value Encoding | |
533 * 0 A 17 R 34 i 51 z | |
534 * 1 B 18 S 35 j 52 0 | |
535 * 2 C 19 T 36 k 53 1 | |
536 * 3 D 20 U 37 l 54 2 | |
537 * 4 E 21 V 38 m 55 3 | |
538 * 5 F 22 W 39 n 56 4 | |
539 * 6 G 23 X 40 o 57 5 | |
540 * 7 H 24 Y 41 p 58 6 | |
541 * 8 I 25 Z 42 q 59 7 | |
542 * 9 J 26 a 43 r 60 8 | |
543 * 10 K 27 b 44 s 61 9 | |
544 * 11 L 28 c 45 t 62 + | |
545 * 12 M 29 d 46 u 63 / | |
546 * 13 N 30 e 47 v | |
547 * 14 O 31 f 48 w (pad) = | |
548 * 15 P 32 g 49 x | |
549 * 16 Q 33 h 50 y | |
550 */ | |
551 | 536 |
552 int | 537 static int base64_block_to_octet_triple(char *out, char *in) { |
553 base64_char_to_sextet(uint8_t c) { | 538 unsigned char sextets[4] = {}; |
554 switch(c) { | 539 int j = 0; |
555 case 'A': | 540 int i; |
556 return 0; | 541 |
557 case 'B': | 542 for (i = 0; i < 4; i++) { |
558 return 1; | 543 char *p = strchr(b64chars, in[i]); |
559 case 'C': | 544 if (p != NULL) sextets[i] = p - b64chars; |
560 return 2; | 545 else j++; |
561 case 'D': | 546 } |
562 return 3; | 547 |
563 case 'E': | 548 out[0] = (sextets[0]<<2)|(sextets[1]>>4); |
564 return 4; | 549 if (j < 2) out[1] = (sextets[1]<<4)|(sextets[2]>>2); |
565 case 'F': | 550 if (j < 1) out[2] = (sextets[2]<<6)|sextets[3]; |
566 return 5; | 551 return j; |
567 case 'G': | |
568 return 6; | |
569 case 'H': | |
570 return 7; | |
571 case 'I': | |
572 return 8; | |
573 case 'J': | |
574 return 9; | |
575 case 'K': | |
576 return 10; | |
577 case 'L': | |
578 return 11; | |
579 case 'M': | |
580 return 12; | |
581 case 'N': | |
582 return 13; | |
583 case 'O': | |
584 return 14; | |
585 case 'P': | |
586 return 15; | |
587 case 'Q': | |
588 return 16; | |
589 case 'R': | |
590 return 17; | |
591 case 'S': | |
592 return 18; | |
593 case 'T': | |
594 return 19; | |
595 case 'U': | |
596 return 20; | |
597 case 'V': | |
598 return 21; | |
599 case 'W': | |
600 return 22; | |
601 case 'X': | |
602 return 23; | |
603 case 'Y': | |
604 return 24; | |
605 case 'Z': | |
606 return 25; | |
607 case 'a': | |
608 return 26; | |
609 case 'b': | |
610 return 27; | |
611 case 'c': | |
612 return 28; | |
613 case 'd': | |
614 return 29; | |
615 case 'e': | |
616 return 30; | |
617 case 'f': | |
618 return 31; | |
619 case 'g': | |
620 return 32; | |
621 case 'h': | |
622 return 33; | |
623 case 'i': | |
624 return 34; | |
625 case 'j': | |
626 return 35; | |
627 case 'k': | |
628 return 36; | |
629 case 'l': | |
630 return 37; | |
631 case 'm': | |
632 return 38; | |
633 case 'n': | |
634 return 39; | |
635 case 'o': | |
636 return 40; | |
637 case 'p': | |
638 return 41; | |
639 case 'q': | |
640 return 42; | |
641 case 'r': | |
642 return 43; | |
643 case 's': | |
644 return 44; | |
645 case 't': | |
646 return 45; | |
647 case 'u': | |
648 return 46; | |
649 case 'v': | |
650 return 47; | |
651 case 'w': | |
652 return 48; | |
653 case 'x': | |
654 return 49; | |
655 case 'y': | |
656 return 50; | |
657 case 'z': | |
658 return 51; | |
659 case '0': | |
660 return 52; | |
661 case '1': | |
662 return 53; | |
663 case '2': | |
664 return 54; | |
665 case '3': | |
666 return 55; | |
667 case '4': | |
668 return 56; | |
669 case '5': | |
670 return 57; | |
671 case '6': | |
672 return 58; | |
673 case '7': | |
674 return 59; | |
675 case '8': | |
676 return 60; | |
677 case '9': | |
678 return 61; | |
679 case '+': | |
680 return 62; | |
681 case '/': | |
682 return 63; | |
683 case '=': | |
684 return 64; | |
685 default: | |
686 break; | |
687 } | |
688 return -1; | |
689 } | 552 } |
690 | 553 |
691 /* | 554 int base64_string_to_octet_string(char *out, int *pad, char *in, int len) { |
692 * base64_string_to_octet_string converts a hexadecimal string | 555 int k = 0; |
693 * of length 2 * len to a raw octet string of length len | 556 int i = 0; |
694 */ | 557 int j = 0; |
| 558 if (len % 4 != 0) return 0; |
695 | 559 |
696 int | 560 while (i < len && j == 0) { |
697 base64_string_to_octet_string(char *raw, char *base64, int len) { | 561 j = base64_block_to_octet_triple(out + k, in + i); |
698 uint8_t x; | 562 k += 3; |
699 int tmp; | 563 i += 4; |
700 int base64_len; | 564 } |
| 565 *pad = j; |
| 566 return i; |
| 567 } |
701 | 568 |
702 base64_len = 0; | 569 #endif |
703 while (base64_len < len) { | |
704 tmp = base64_char_to_sextet(base64[0]); | |
705 if (tmp == -1) | |
706 return base64_len; | |
707 x = (tmp << 6); | |
708 base64_len++; | |
709 tmp = base64_char_to_sextet(base64[1]); | |
710 if (tmp == -1) | |
711 return base64_len; | |
712 x |= (tmp & 0xffff); | |
713 base64_len++; | |
714 *raw++ = x; | |
715 base64 += 2; | |
716 } | |
717 return base64_len; | |
718 } | |
OLD | NEW |