Пример #1
0
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;
}
Пример #2
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);
		}
	}
}
Пример #3
0
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);
		}
	}
}