| 698 | } |
| 699 | |
| 700 | void tss_encode_digit_base64(const byte_t*& pchSrc, size_t& nchSrcLeft, byte_t*& pchBuf, size_t& nchBufLeft) |
| 701 | { |
| 702 | // NOTE:RAD -- Redundant and ugly but very fast!! |
| 703 | |
| 704 | ASSERT(nchBufLeft > 4); // One for NULL |
| 705 | |
| 706 | switch (nchSrcLeft) |
| 707 | { |
| 708 | case 0: |
| 709 | { |
| 710 | ASSERTMSG(false, "Invalid call to encode_base64_digit!"); |
| 711 | break; |
| 712 | } |
| 713 | case 1: |
| 714 | { |
| 715 | int ch1 = int(*pchSrc++ & 0xFF); |
| 716 | |
| 717 | *pchBuf++ = _abBase64[(ch1 & 0xFC) >> 2]; |
| 718 | *pchBuf++ = _abBase64[(ch1 & 0x03) << 4]; |
| 719 | *pchBuf++ = '='; |
| 720 | *pchBuf++ = '='; |
| 721 | |
| 722 | nchSrcLeft = 0; // NOTE: |
| 723 | break; |
| 724 | } |
| 725 | case 2: |
| 726 | { |
| 727 | int ch1 = int(*pchSrc++ & 0xFF); |
| 728 | int ch2 = int(*pchSrc++ & 0xFF); |
| 729 | |
| 730 | *pchBuf++ = _abBase64[((ch1 & 0xFC) >> 2)]; |
| 731 | *pchBuf++ = _abBase64[((ch1 & 0x03) << 4) | ((ch2 & 0xF0) >> 4)]; |
| 732 | *pchBuf++ = _abBase64[((ch2 & 0x0F) << 2)]; |
| 733 | *pchBuf++ = '='; |
| 734 | |
| 735 | nchSrcLeft = 0; // NOTE: |
| 736 | break; |
| 737 | } |
| 738 | default: |
| 739 | { |
| 740 | |
| 741 | int ch1 = int(*pchSrc++ & 0xFF); |
| 742 | int ch2 = int(*pchSrc++ & 0xFF); |
| 743 | int ch3 = int(*pchSrc++ & 0xFF); |
| 744 | |
| 745 | *pchBuf++ = _abBase64[((ch1 & 0xFC) >> 2)]; |
| 746 | *pchBuf++ = _abBase64[((ch1 & 0x03) << 4) | ((ch2 & 0xF0) >> 4)]; |
| 747 | *pchBuf++ = _abBase64[((ch2 & 0x0F) << 2) | ((ch3 & 0xC0) >> 6)]; |
| 748 | *pchBuf++ = _abBase64[(ch3 & 0x3F)]; |
| 749 | |
| 750 | nchSrcLeft -= 3; // NOTE: Probably greater than 3 |
| 751 | break; |
| 752 | } |
| 753 | } |
| 754 | |
| 755 | nchBufLeft -= 4; // Always the same due to padding! |
| 756 | }; |
| 757 | |