]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Initial libaesdec commit
authorspdfrk1 <spdfrk1@github>
Tue, 8 Jul 2014 18:19:08 +0000 (20:19 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 6 Aug 2014 06:54:32 +0000 (08:54 +0200)
Makefile
src/descrambler/descrambler.c
src/descrambler/libaesdec/libaesdec.c [new file with mode: 0644]
src/descrambler/libaesdec/libaesdec.h [new file with mode: 0644]
src/descrambler/libaesdec/libaesdec_interface.c [new file with mode: 0644]

index c3ad89c2e3b2457dafcaecba88792c465127c1b1..a4c42ca4ce8088e86e03af66464c5ce6134dc1bf 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -292,12 +292,9 @@ FFDECSA-$(CONFIG_CWC)   = yes
 endif
 
 ifeq ($(FFDECSA-yes),yes)
-SRCS-yes += src/descrambler/ffdecsa/ffdecsa_interface.c \
-           src/descrambler/ffdecsa/ffdecsa_int.c
-SRCS-${CONFIG_MMX}  += src/descrambler/ffdecsa/ffdecsa_mmx.c
-SRCS-${CONFIG_SSE2} += src/descrambler/ffdecsa/ffdecsa_sse2.c
-${BUILDDIR}/src/descrambler/ffdecsa/ffdecsa_mmx.o  : CFLAGS += -mmmx
-${BUILDDIR}/src/descrambler/ffdecsa/ffdecsa_sse2.o : CFLAGS += -msse2
+SRCS-yes += src/descrambler/libaesdec/libaesdec_interface.c \
+           src/descrambler/libaesdec/libaesdec.c
+${BUILDDIR}/src/descrambler/libaesdec/libaesdec.o : CFLAGS += -msse2
 endif
 
 # File bundles
index de3ce11a8d6cf0c8271794e790a20b781cda6d51..ee6870f9a4c1341276cd6c1e172b174fd0347525 100755 (executable)
@@ -20,7 +20,7 @@
 #include "descrambler.h"
 #include "cwc.h"
 #include "capmt.h"
-#include "ffdecsa/FFdecsa.h"
+#include "libaesdec/libaesdec.h"
 #include "input.h"
 #include "tvhcsa.h"
 
@@ -88,7 +88,7 @@ descrambler_init ( void )
   capmt_init();
 #endif
 #if (ENABLE_CWC || ENABLE_CAPMT) && !ENABLE_DVBCSA
-  ffdecsa_init();
+  libaesdec_init();
 #endif
 }
 
diff --git a/src/descrambler/libaesdec/libaesdec.c b/src/descrambler/libaesdec/libaesdec.c
new file mode 100644 (file)
index 0000000..f0baa8d
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * libaesdec.c
+ *
+ *  Created on: Jun 22, 2014
+ *      Author: root
+ */
+
+#include <sys/types.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "openssl/aes.h"
+
+#include "libaesdec.h"
+
+struct aes_keys_t {
+       AES_KEY even;
+       AES_KEY odd;
+};
+
+void aes_set_even_control_word(void *keys, const unsigned char *pk) {
+       //AES_set_decrypt_key(pk, 128, &((struct aes_keys_t *) keys)->even);
+}
+
+void aes_set_odd_control_word(void *keys, const unsigned char *pk) {
+       //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) {
+       unsigned char key[16];
+       memcpy(key, ev, 8);
+       memcpy(key + 8, od, 8);
+       AES_set_decrypt_key(key, 128, &((struct aes_keys_t *) keys)->even);
+}
+
+//-----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) {
+               static const unsigned char pk[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+               aes_set_control_words(keys, pk, pk);
+       }
+       return keys;
+}
+
+void aes_free_key_struct(void *keys) {
+       return free(keys);
+}
+
+//----- decrypt
+
+void aes_decrypt_packet(void *keys, unsigned char *packet) {
+       unsigned char *pkt;
+       int xc0, len, offset, n;
+
+       pkt = packet;
+       AES_KEY k;
+
+       // TODO check all flags
+               xc0 = pkt[3] & 0xc0;
+
+               if (xc0 == 0x00) {//skip clear pkt
+                       return;
+               }
+               if (xc0 == 0x40) { //skip reserved pkt
+                       return;
+               }
+       
+       if (xc0 == 0x80 || xc0 == 0xc0) { // encrypted 
+               pkt[3] &= 0x3f;  // consider it decrypted now
+               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
+                               }
+                return; // TODO Handle incomplete packets?
+               }
+       }
+       else {
+               return;
+       }
+
+       k = ((struct aes_keys_t *) keys)->even;
+
+       // TODO room for improvement?
+       int i;
+       for (i = 4; i <= 164; i += 16) {
+               AES_ecb_encrypt(pkt + i, pkt + i, &k, AES_DECRYPT);
+       }
+       return;
+}
diff --git a/src/descrambler/libaesdec/libaesdec.h b/src/descrambler/libaesdec/libaesdec.h
new file mode 100644 (file)
index 0000000..91e4fae
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * libaesdec.h
+ *
+ *  Created on: Jun 22, 2014
+ *      Author: root
+ */
+
+#ifndef LIBAESDEC_H_
+#define LIBAESDEC_H_
+
+void libaesdec_init(void);
+int get_internal_parallelism(void);
+int get_suggested_cluster_size(void);
+void * get_key_struct(void);
+void free_key_struct(void *keys);
+void set_even_control_word(void *keys, const unsigned char *even);
+void set_odd_control_word(void *keys, const unsigned char *odd);
+int decrypt_packets(void *keys, unsigned char **cluster);
+
+// -- alloc & free the key structure
+void *aes_get_key_struct(void);
+void aes_free_key_struct(void *keys);
+
+// -- set aes keys, 16 bytes each
+void aes_set_control_words(void *keys, const unsigned char *even, const unsigned char *odd);
+
+// -- set even aes key, 16 bytes
+void aes_set_even_control_word(void *keys, const unsigned char *even);
+
+// -- set odd aes key, 16 bytes
+void aes_set_odd_control_word(void *keys, const unsigned char *odd);
+
+// -- get aes keys, 16 bytes each
+//void get_control_words(void *keys, unsigned char *even, unsigned char *odd);
+
+// -- decrypt TS packet
+void aes_decrypt_packet(void *keys, unsigned char *packet);
+
+
+#endif /* LIBAESDEC_H_ */
diff --git a/src/descrambler/libaesdec/libaesdec_interface.c b/src/descrambler/libaesdec/libaesdec_interface.c
new file mode 100644 (file)
index 0000000..0975dc3
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include "tvheadend.h"
+#include "libaesdec.h"
+
+
+void libaesdec_init(void) {
+       tvhlog(LOG_INFO, "CSA", "Using AES descrambling");
+}
+
+int get_internal_parallelism(void) {
+       return 0;
+}
+int get_suggested_cluster_size(void) {
+       return 1;
+}
+
+void *
+get_key_struct(void) {
+       return aes_get_key_struct();
+}
+void free_key_struct(void *keys) {
+       aes_free_key_struct(keys);
+}
+
+void set_even_control_word(void *keys, const unsigned char *even) {
+       aes_set_even_control_word(keys, even);
+}
+
+void set_odd_control_word(void *keys, const unsigned char *odd) {
+       aes_set_even_control_word(keys, odd);
+}
+
+int decrypt_packets(void *keys, unsigned char **cluster) {
+       aes_decrypt_packet(keys, cluster[0]);
+       return 1;
+}