#include "lib3.h" #include "lib2.h" #include "lib.h" #define NR_STIRNGS_CHALLENGE17 10 char *challenge17_encrypt(int *length) { int i, t; char **string; char **decoded; string = malloc(sizeof(char *)*NR_STIRNGS_CHALLENGE17); decoded = malloc(sizeof(char *)*NR_STIRNGS_CHALLENGE17); char filename[] = "task17_0"; for(i=0;i<10;i++) { filename[strlen(filename)-1] = (char) (i+'0'); t = read_base64_file(filename, &string[i]); decoded[i] = malloc(t); length[i] = decode_base64(string[i], decoded[i]); printf("read: %s\n", string[i]); } // choose one randomly int random = rand() % NR_STIRNGS_CHALLENGE17; int padding; printf("plaintext: %s\n", string[random]); *length = strlen(string[random]); char *padded_string = __pkcs7_padding(string[random], *length, 16, &padding); char *encrypted = malloc(strlen(padded_string)); *length += padding; aes_cbc(padded_string, strlen(padded_string), encrypted, key, iv, 1); return encrypted; } int cbc_padding_oracle(char *encrypted, int length) { char *decrypted = malloc(length); char *unpadded= malloc(length); aes_cbc(encrypted, length, decrypted, key, iv, 0); int valid = valid_pkcs7_padding(decrypted, length, unpadded, 16); free(decrypted); free(unpadded); return valid; } int convert_to_little_endian(char *string) { } /** * format is: 64 nonce concat with 64 bit counter * calle has to make sure that nonce is at least 8 bytes * its all little endian */ int aes_ctr(char *in, int length_in, char *out, char *string_key, char *nonce) { long counter; unsigned char tmp[16]; char keystream[16]; long nr_blocks = length_in / BLOCKSIZE; int length_last_block = length_in % BLOCKSIZE; memcpy(tmp, nonce, 16); for(counter=0;counter