main: need polish, almost done

This commit is contained in:
theBigBlase 2023-10-06 20:22:32 -04:00
commit 8a6ffdedb1
4 changed files with 206 additions and 0 deletions

4
.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
build/
massif*
dhat*
.vimspector.json

BIN
IFT814-Dev2-A23.pdf Normal file

Binary file not shown.

34
Makefile Normal file
View file

@ -0,0 +1,34 @@
.PHONY: all test clean build
SRC = src/main.c
OJB = $(SRC:.c=.o)
OUT = build
CC = /usr/bin/gcc
CFLAGS = -ansi -Wall -std=c99 -O0
CFDEBUG = -ansi -Wall -g -std=c99
RM = /bin/rm -fr
TEST = -D TEST_TECH
PART = -D PART_
EVE = -D EVE_
%.o: %.c
$(CC) -c $(CFLAGS)
build:
$(CC) $(SRC) $(PART)$(part) $(EVE)$(eve) $(CFLAGS) -o $(OUT)/main.o
build_test:
$(CC) $(SRC) $(CFLAGS) $(TEST) -o $(OUT)/main.o
debug:
$(CC) $(SRC) $(PART)$(part) $(CFDEBUG) -o $(OUT)/main.o
clean:
$(RM) $(OBJ) $(OUT)/main.o
run:
$(MAKE) build && ./build/main.o
test:
$(MAKE) build_test && ./build/main.o

168
src/main.c Normal file
View file

@ -0,0 +1,168 @@
/*
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* <paum1202@usherbrooke.ca> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. -violette paulin
* ----------------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
/* get bits after n from k */
#define LAST_BITS(k,n) ((k) & ((1 << (n)) - 1))
/* get bits of k between m and n */
#define MID_BITS(k,m,n) LAST_BITS((k) >> (m), ((n) - (m)))
#define SIZE_ALPH 26
#define SIZE_MSG 32
#define SIZE_OTP 64
struct eve {
uint32_t msg;
uint32_t tag;
};
static uint32_t mac(uint32_t, uint32_t);
static char verif(uint32_t, uint32_t, uint32_t);
static inline uint32_t gen();
static uint32_t char_arr_to_uint32(char *);
static struct eve eve_shenanigans(struct eve);
static char * uint32_to_char_arr(uint32_t n);
static void print_hex(char *);
int
main(int argc, char *argv[])
{
srand(time(0)); /* init rand */
uint32_t key = gen();
uint32_t msg = 0;
#ifdef TEST_TECH
char *test = "yay";
printf("Testing char_arr_to_uint32 and uint32_to_char_arr: \n");
printf("%s\n", uint32_to_char_arr(char_arr_to_uint32(test)));
#endif
printf("\n--- MSG ---\nas 0x: ");
#ifdef PART_ZERO
msg = 0;
printf("0x00000000\n");
#endif
#ifdef PART_MAX
msg = UINT32_MAX;
printf("0xffffffff\n");
#endif
#ifdef PART_MID
printf("0x0000ffff\n");
/* is UINT16_MAX, but keeping this way for corrector convenience */
msg = UINT32_MAX & UINT16_MAX;
#endif
#ifdef PART_NAME
msg = *(uint32_t *)"bob";
printf("%u\n", msg);
#endif
printf("as char *: %s\nas uint32: %u\n",
uint32_to_char_arr(msg), msg);
uint32_t tag = mac(msg, key);
printf("--- TAG ---\n%d \n", tag);
printf("--- VERIF ---\n%d\n",
verif(key, msg, tag));
printf("\n--- ALICE ---\n");
printf("sends msg: %u\nsends tag: %u\n", msg, tag);
printf("knows key: %u\n", key);
printf("\n--- EVE ---\n");
printf("recieves msg: %u\nrecieves tag: %u\n", msg, tag);
struct eve tmp = { msg, tag };
tmp = eve_shenanigans(tmp);
msg = tmp.msg, tag = tmp.tag;
printf("sends msg: %u\nsends tag: %u\n", msg, tag);
printf("\n--- BOB ---\n");
printf("recieves msg: %u\nrecieves tag: %u\n", msg, tag);
printf("knows key: %u\n", key);
char res = verif(msg, tag, key);
printf("verifies: %s\n", res ? "TRUE" : "FALSE");
if (res)
printf("msg as char *: %s\n", uint32_to_char_arr(msg));
return 0;
}
static uint32_t
gen()
{
/* rand is between 0 and UINT32_MAX - 1 / 2 (because sign) */
return rand() + rand() + (rand() % 1);
}
static struct eve
eve_shenanigans(struct eve str)
{
#ifdef EVE_NAME
str.msg = *(uint32_t *)"eve";
str.tag = str.tag ^ (*(uint32_t *)"bob") ^ str.msg;
#endif
#ifdef EVE_ZERO
str.msg = UINT32_MAX;
str.tag = str.tag ^ 0 ^ str.msg;
#endif
return str;
}
static char
verif(uint32_t key, uint32_t msg, uint32_t tag)
{
return (key ^ msg) == tag;
}
static uint32_t
mac(uint32_t key, uint32_t msg)
{
return msg ^ key;
}
static uint32_t
char_arr_to_uint32(char *arr)
{
return *(uint32_t *)arr;
}
static char *
uint32_to_char_arr(uint32_t n)
{
char *res = calloc(4, 1);
res[0] = MID_BITS(n, 0, 8);
res[1] = MID_BITS(n, 8, 16);
res[2] = MID_BITS(n, 16, 24);
res[3] = MID_BITS(n, 24, 32);
return res;
}
static void
print_hex(char *str)
{
short k = 0;
while (str[k] != '\0') {
printf("%02X ", str[k] & 0xff);
++k;
}
printf("\n");
}