| 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 |