#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; } /** * 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> 30))) + i; // only the last 32 bit __global_mt_19937.mt[i] &= 0xFFFFFFFF; } } void mt_19937_generate() { unsigned int i, x; for(i=0;i<=MT_19937_N;i++) { x = (((__global_mt_19937.mt[i] & MT_19937_UPPER_MASK) + (__global_mt_19937.mt[(i+1) % 624] & MT_19937_LOWER_MASK) )& 0xFFFFFFFF); __global_mt_19937.mt[i] = __global_mt_19937.mt[(i+397) % MT_19937_N] ^ x >> 1; if (x % 2) __global_mt_19937.mt[i] ^= 0x9908b0df; } __global_mt_19937.index = 0; } int mt_19937() { unsigned int y = 0x0; if(__global_mt_19937.index >= MT_19937_N) mt_19937_generate(); y = __global_mt_19937.mt[__global_mt_19937.index]; y = y ^ (y >> 11); y = y ^ ((y << 7) & 0x9D2C5680); y = y ^ ((y << 15) & 0xEFC60000); y = y ^ (y >> 18); __global_mt_19937.index++; return (y & 0xFFFFFFFF); }