base32_to.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include <stddef.h>
  2. #include <stdint.h>
  3. #include "types.h"
  4. #include "base32.h"
  5. static const char base32t[32] = {
  6. 'a', 'b', 'c', 'd', // 0
  7. 'e', 'f', 'g', 'h', // 1
  8. 'i', 'j', 'k', 'l', // 2
  9. 'm', 'n', 'o', 'p', // 3
  10. 'q', 'r', 's', 't', // 4
  11. 'u', 'v', 'w', 'x', // 5
  12. 'y', 'z', '2', '3', // 6
  13. '4', '5', '6', '7', // 7
  14. };
  15. /*
  16. +--first octet--+-second octet--+--third octet--+--forth octet--+--fifth octet--+
  17. |7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|
  18. +---------+-----+---+---------+-+-------+-------+-+---------+---+-----+---------+
  19. |4 3 2 1 0|4 3 2 1 0|4 3 2 1 0|4 3 2 1 0|4 3 2 1 0|4 3 2 1 0|4 3 2 1 0|4 3 2 1 0|
  20. +-1.index-+-2.index-+-3.index-+-4.index-+-5.index-+-6.index-+-7.index-+-8.index-+
  21. */
  22. // masks:
  23. // 0xFF 0x7F 0x3F 0x1F 0x0F 0x07 0x03 0x01
  24. // 255 127 63 31 15 7 3 1
  25. char *base32_to(char *dst,const u8 *src,size_t slen)
  26. {
  27. //printf("slen = %d\n", slen);
  28. //printhex(base32t, 32);
  29. //printhex(base32f, 256);
  30. // base32 eats in 5bit pieces;
  31. // closest we can provide is 40, which is 5 bytes
  32. size_t i;
  33. for (i = 0; i + 4 < slen; i += 5) {
  34. //printf("ei!\n");
  35. //char *od = dst;
  36. *dst++ = base32t[src[i+0] >> 3];
  37. *dst++ = base32t[((src[i+0] & 7) << 2) | (src[i+1] >> 6)];
  38. *dst++ = base32t[(src[i+1] >> 1) & 31];
  39. *dst++ = base32t[((src[i+1] & 1) << 4) | (src[i+2] >> 4)];
  40. *dst++ = base32t[((src[i+2] & 15) << 1) | (src[i+3] >> 7)];
  41. *dst++ = base32t[((src[i+3]) >> 2) & 31];
  42. *dst++ = base32t[((src[i+3] & 3) << 3) | (src[i+4] >> 5)];
  43. *dst++ = base32t[src[i+4] & 31];
  44. //printhex(od, 8);
  45. }
  46. //char *od = dst;
  47. if (i < slen) {
  48. //printf("oi!0\n");
  49. *dst++ = base32t[src[i+0] >> 3];
  50. if (i + 1 < slen) {
  51. //printf("oi!1\n");
  52. *dst++ = base32t[((src[i+0] & 7) << 2) | (src[i+1] >> 6)];
  53. *dst++ = base32t[(src[i+1] >> 1) & 31];
  54. if (i + 2 < slen) {
  55. //printf("oi!2\n");
  56. *dst++ = base32t[((src[i+1] & 1) << 4) | (src[i+2] >> 4)];
  57. if (i + 3 < slen) {
  58. //printf("oi!3\n");
  59. *dst++ = base32t[((src[i+2] & 15) << 1) | (src[i+3] >> 7)];
  60. *dst++ = base32t[(src[i+3] >> 2) & 31];
  61. *dst++ = base32t[(src[i+3] & 3) << 3];
  62. }
  63. else {
  64. *dst++ = base32t[(src[i+2] & 15) << 1];
  65. }
  66. }
  67. else
  68. *dst++ = base32t[(src[i+1] & 1) << 4];
  69. }
  70. else
  71. *dst++ = base32t[(src[i+0] & 7) << 2];
  72. }
  73. //printhex(od, dst-od);
  74. *dst = 0;
  75. return dst;
  76. }