all repos — cryptopals-challenges @ d32e28bde36161fac9688123c867c2609af65c4f

cryptopals-challenges

set1/src/base64.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
#include <stdint.h>
#include <stdio.h>
#include <string.h>

/*
 * base64.c: reads in raw bytes and converts to/outputs in base64 format
 * x1phosura 2022
 */

#define BUF_LEN 4096

#define b64_output putchar
//#define b64_output b64_out_debug

size_t out_index = 0;
char out_buf[BUF_LEN];

void b64_out_debug(char c)
{
	printf("Using '%c' from base64 alphabet\n", c);
	out_buf[out_index] = c; // TODO: check out_index
	++out_index;
}

char *b64_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";


void main(int argc, char *argv[])
{
	char c, spoke = 0;
	int tmp, alph_index = 0;
	
	while ((c = getchar()) != EOF) {
		switch (spoke) {
		case 0:
			alph_index = c >> 2;                  // get last 6 bits
			tmp = (c & 0x03) << 4;                // extract last 2 bits
			break;
		case 1:
			alph_index = c >> 4;                  // get last 4 bits
			alph_index += tmp;
			tmp = (c & 0x0f) << 2;
			break;
		case 2:
			alph_index = tmp;
			alph_index += c >> 6;
			b64_output(b64_alphabet[alph_index]);
			alph_index = c & 0x3f;
			break;
		}
		b64_output(b64_alphabet[alph_index]);
		spoke = (spoke + 1) % 3;
	}

	if (spoke == 1) {
		alph_index = tmp;
		b64_output(b64_alphabet[alph_index]);
		b64_output('=');
		b64_output('=');
	} else if (spoke == 2) {
		alph_index = tmp;
		b64_output(b64_alphabet[alph_index]);
		b64_output('=');
	}

	putchar('\n');
}