This commit is contained in:
spdfrk1 2014-08-05 21:05:01 +02:00 committed by Jaroslav Kysela
parent 16f99d440c
commit 88672fd157

View file

@ -2,7 +2,7 @@
* libaesdec.c
*
* Created on: Jun 22, 2014
* Author: root
* Author: spdfrk1
*/
#include <sys/types.h>
@ -14,16 +14,18 @@
#include "libaesdec.h"
//-----allocate key structure
struct aes_keys_t {
AES_KEY even;
AES_KEY odd;
};
// Even and Odd cw represent one full 128-bit AES key
//-----even cw represents one full 128-bit AES key
void aes_set_even_control_word(void *keys, const unsigned char *pk) {
AES_set_decrypt_key(pk, 128, &((struct aes_keys_t *) keys)->even);
}
//-----odd cw represents one full 128-bit AES key
void aes_set_odd_control_word(void *keys, const unsigned char *pk) {
AES_set_decrypt_key(pk, 128, &((struct aes_keys_t *) keys)->odd);
}
@ -35,8 +37,8 @@ void aes_set_control_words(void *keys, const unsigned char *ev,
AES_set_decrypt_key(od, 128, &((struct aes_keys_t *) keys)->odd);
}
//-----key structure
void *aes_get_key_struct(void) {
//-----allocate key structure
void * aes_get_key_struct(void) {
struct aes_keys_t *keys = (struct aes_keys_t *) malloc(
sizeof(struct aes_keys_t));
if (keys) {
@ -46,9 +48,10 @@ void *aes_get_key_struct(void) {
return keys;
}
//-----free key structure
void aes_free_key_struct(void *keys) {
free(keybuffer);
return free(keys);
if (keys)
free(keys);
}
//----- decrypt
@ -57,35 +60,32 @@ void aes_decrypt_packet(void *keys, unsigned char *packet) {
unsigned char ev_od = 0;
int xc0, offset, n;
int len;
//int residue;
pkt = packet;
AES_KEY k;
// TODO check all flags
xc0 = pkt[3] & 0xc0;
if (xc0 == 0x00) {//skip clear pkt
//skip clear pkt
if (xc0 == 0x00) {
return;
}
if (xc0 == 0x40) { //skip reserved pkt
//skip reserved pkt
if (xc0 == 0x40) {
return;
}
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 TODO Check this
if (pkt[3] & 0x20) { // incomplete packet
offset = 4 + pkt[4] + 1;
len = 188 - offset;
n = len >> 3;
//residue = len - (n << 3);
if (n == 0) { // decrypted==encrypted!
//DBG(fprintf(stderr,"DECRYPTED MINI!\n"));
return; // this doesn't need more processing
}
}
else {
len = 184;
offset = 4;
//residue = 0;
}
}
else {
@ -103,5 +103,4 @@ void aes_decrypt_packet(void *keys, unsigned char *packet) {
for (i = offset; i <= (len - 16); i += 16) {
AES_ecb_encrypt(pkt + i, pkt + i, &k, AES_DECRYPT);
}
return;
}