Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Reinstated even/odd AES keys
  • Loading branch information
spdfrk1 authored and perexg committed Aug 6, 2014
1 parent 66f6a3b commit a558c9e
Showing 1 changed file with 12 additions and 13 deletions.
25 changes: 12 additions & 13 deletions src/descrambler/libaesdec/libaesdec.c
Expand Up @@ -16,34 +16,28 @@

struct aes_keys_t {
AES_KEY even;
AES_KEY odd; // Reserved for future use
AES_KEY odd;
};

unsigned char * keybuffer;

// Even and Odd cw represent one full 128-bit AES key
void aes_set_even_control_word(void *keys, const unsigned char *pk) {
memcpy(keybuffer, pk, 8);
AES_set_decrypt_key(keybuffer, 128, &((struct aes_keys_t *) keys)->even);
AES_set_decrypt_key(pk, 128, &((struct aes_keys_t *) keys)->even);
}

void aes_set_odd_control_word(void *keys, const unsigned char *pk) {
memcpy(keybuffer + 8, pk, 8);
AES_set_decrypt_key(keybuffer, 128, &((struct aes_keys_t *) keys)->even);
AES_set_decrypt_key(pk, 128, &((struct aes_keys_t *) keys)->odd);
}

//-----set control words
void aes_set_control_words(void *keys, const unsigned char *ev,
const unsigned char *od) {
memcpy(keybuffer, ev, 8);
memcpy(keybuffer + 8, od, 8);
AES_set_decrypt_key(keybuffer, 128, &((struct aes_keys_t *) keys)->even);
AES_set_decrypt_key(ev, 128, &((struct aes_keys_t *) keys)->even);
AES_set_decrypt_key(od, 128, &((struct aes_keys_t *) keys)->odd);
}

//-----key structure

void *aes_get_key_struct(void) {
keybuffer = calloc(16, 1);
struct aes_keys_t *keys = (struct aes_keys_t *) malloc(
sizeof(struct aes_keys_t));
if (keys) {
Expand All @@ -54,14 +48,14 @@ void *aes_get_key_struct(void) {
}

void aes_free_key_struct(void *keys) {
free(keybuffer);
return free(keys);
}

//----- decrypt

void aes_decrypt_packet(void *keys, unsigned char *packet) {
unsigned char *pkt;
unsigned char ev_od = 0;
int xc0, len, offset, n;

pkt = packet;
Expand All @@ -78,6 +72,7 @@ void aes_decrypt_packet(void *keys, unsigned char *packet) {
}

if (xc0 == 0x80 || xc0 == 0xc0) { // encrypted
ev_od = (xc0 & 0x40) >> 6; // 0 even, 1 odd
pkt[3] &= 0x3f; // consider it decrypted now
if (pkt[3] & 0x20) { // incomplete packet
offset = 4 + pkt[4] + 1;
Expand All @@ -95,7 +90,11 @@ void aes_decrypt_packet(void *keys, unsigned char *packet) {
return;
}

k = ((struct aes_keys_t *) keys)->even;
if (ev_od == 0) {
k = ((struct aes_keys_t *) keys)->even;
} else {
k = ((struct aes_keys_t *) keys)->odd;
}

// TODO room for improvement?
int i;
Expand Down

0 comments on commit a558c9e

Please sign in to comment.