int main(void) { static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; unsigned i_bits = 0; int i_shift = 0; int out_len = 0; int in; #define putb64() \ do { \ putchar(b64[(i_bits << 6 >> i_shift) & 0x3f]); \ out_len++; \ i_shift -= 6; \ } while (0) while ((in = getchar()) != EOF) { i_bits = (i_bits << 8) + in; i_shift += 8; while (i_shift > 6) putb64(); } while (i_shift > 0) putb64(); while (out_len++ & 3) putchar('='); putchar('\n'); return 0; }
static void hybi10_decode(FILE *in, int outfd) { FILE *out; unsigned char ch, masks[4]; char inb[4]; size_t inblen = 0; uint64_t i, framelen; out = fdopen(outfd, "w"); if (out == NULL) { perror("fdopen"); die(1); } for (;;) { /* Frame header. */ ch = pgetc(in); if (ch != 0x81) { DPRINTF("unsupported packet received: %#hhx", ch); die(1); } /* Payload length. */ framelen = hybi10_getlength(in); hybi10_getmasks(in, masks); for (i = 0; i < framelen; i++) { ch = pgetc(in) ^ masks[i % 4]; if (!((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '+' || ch == '/' || ch == '=')) { DPRINTF("non-Base64 character received"); die(1); } /* Base64 character. */ inb[inblen++] = ch; if (inblen == sizeof inb) putb64(out, inb, &inblen); } /* Frame trailer. */ putb64(out, inb, &inblen); if (fflush(out) == -1) { perror("fflush"); die(1); } } }
static void hixie76_decode(FILE *in, int outfd) { FILE *out; unsigned char ch; char inb[4]; size_t inblen = 0; out = fdopen(outfd, "w"); if (out == NULL) { perror("fdopen"); die(1); } for (;;) { /* Frame header. */ ch = pgetc(in); if (ch != 0x00) { DPRINTF("unsupported packet received: %#hhx", ch); die(1); } while ((ch = pgetc(in)) != 0xff) { if (!((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '+' || ch == '/' || ch == '=')) { DPRINTF("non-Base64 character received"); die(1); } /* Base64 character. */ inb[inblen++] = ch; if (inblen == sizeof inb) putb64(out, inb, &inblen); } /* Frame trailer. */ putb64(out, inb, &inblen); if (fflush(out) == -1) { perror("fflush"); die(1); } } }