summaryrefslogtreecommitdiff
path: root/lib/lib3.c
diff options
context:
space:
mode:
authorBenedict <benedict@0xb8000.de>2016-08-04 14:28:15 +0200
committerBenedict <benedict@0xb8000.de>2017-02-21 13:00:25 +0100
commit11b2ff584c67cf85ebe2405f6a74ab2799736927 (patch)
treeeb5e99a5f4f77ceae37f4d2a3e3d5f4a63bc4bc4 /lib/lib3.c
parent896bb17f14e44925f5cdacbe10f1e86c20b88972 (diff)
completed set3, task 18
Diffstat (limited to 'lib/lib3.c')
-rw-r--r--lib/lib3.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/lib/lib3.c b/lib/lib3.c
new file mode 100644
index 0000000..87865ed
--- /dev/null
+++ b/lib/lib3.c
@@ -0,0 +1,83 @@
+#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<nr_blocks-1;counter++) {
+ // right now it only works for 256 block :P
+ tmp[8] = counter % 256;
+ // encrypt nonce and counter and produce keystream
+ aes_ecb(tmp, 16, keystream, string_key, 16, 1);
+ // xor against keystream to encrpy/decrypt
+ xor_string(&in[counter*BLOCKSIZE], keystream, &out[counter*BLOCKSIZE], 16, 16);
+ }
+
+ // do last block
+ tmp[8] = counter % 256;
+ aes_ecb(tmp, 16, keystream, string_key, 16, 1);
+ xor_string(&in[counter*BLOCKSIZE], keystream, &out[counter*BLOCKSIZE],
+ 16, length_last_block);
+
+}