Feature #3360 » oscam-emu.11384.patch
CMakeLists.txt (working copy) | ||
---|---|---|
101 | 101 |
${CMAKE_CURRENT_SOURCE_DIR}/csctapi |
102 | 102 |
${CMAKE_CURRENT_SOURCE_DIR}/cscrypt |
103 | 103 |
${CMAKE_CURRENT_SOURCE_DIR}/minilzo |
104 |
${CMAKE_CURRENT_SOURCE_DIR}/ffdecsa |
|
104 | 105 |
${CMAKE_CURRENT_SOURCE_DIR}/extapi/cygwin |
105 | 106 |
/usr/include/w32api |
106 | 107 |
${OPTIONAL_INCLUDE_DIR} |
... | ... | |
110 | 111 |
${CMAKE_CURRENT_SOURCE_DIR}/csctapi |
111 | 112 |
${CMAKE_CURRENT_SOURCE_DIR}/cscrypt |
112 | 113 |
${CMAKE_CURRENT_SOURCE_DIR}/minilzo |
114 |
${CMAKE_CURRENT_SOURCE_DIR}/ffdecsa |
|
113 | 115 |
${OPTIONAL_INCLUDE_DIR} |
114 | 116 |
) |
115 | 117 |
endif (OSCamOperatingSystem MATCHES "Windows/Cygwin") |
... | ... | |
420 | 422 |
# Manage config.h based on command line parameters |
421 | 423 |
# Manipulate config file based on given parameters and read unset parameters |
422 | 424 | |
425 |
execute_process (COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/config.sh --enabled WITH_EMU OUTPUT_VARIABLE CONFIG_WITH_EMU OUTPUT_STRIP_TRAILING_WHITESPACE) |
|
426 |
if (CONFIG_WITH_EMU MATCHES "Y" AND NOT WITH_EMU EQUAL 1) |
|
427 |
add_definitions ("-DWITH_EMU") |
|
428 |
set (WITH_EMU "1") |
|
429 |
message(STATUS " EMU is added by config compiling with EMU") |
|
430 |
endif(CONFIG_WITH_EMU MATCHES "Y" AND NOT WITH_EMU EQUAL 1) |
|
431 | ||
423 | 432 |
execute_process (COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/config.sh --show-valid OUTPUT_VARIABLE config_vars_string OUTPUT_STRIP_TRAILING_WHITESPACE) |
424 | 433 |
string(REGEX MATCHALL "[A-Z0-9_]+" config_vars ${config_vars_string}) |
425 | 434 | |
... | ... | |
449 | 458 |
add_subdirectory (csctapi) |
450 | 459 |
add_subdirectory (minilzo) |
451 | 460 |
add_subdirectory (cscrypt) |
461 |
add_subdirectory (ffdecsa) |
|
452 | 462 | |
453 | 463 |
#----------------------- file groups ------------------------------ |
454 | 464 |
execute_process (COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/config.sh --enabled MODULE_CAMD33 OUTPUT_VARIABLE CAMD33 OUTPUT_STRIP_TRAILING_WHITESPACE) |
... | ... | |
498 | 508 | |
499 | 509 |
set (exe_name "oscam") |
500 | 510 |
add_executable (${exe_name} ${exe_srcs} ${exe_hdrs}) |
501 |
target_link_libraries (${exe_name} ${csoscam} ${csmodules} ${csreaders} csctapi cscrypt minilzo) |
|
511 |
target_link_libraries (${exe_name} ${csoscam} ${csmodules} ${csreaders} csctapi cscrypt minilzo ffdecsa)
|
|
502 | 512 |
if(HAVE_LIBRT AND HAVE_LIBUSB) |
503 | 513 |
if (LIBUSBDIR) |
504 | 514 |
set (libusb_link "imp_libusb") |
... | ... | |
647 | 657 |
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpmachine COMMAND tr -d '\n' OUTPUT_VARIABLE CS_TARGET) |
648 | 658 |
add_definitions ("-D'CS_TARGET=\"${CS_TARGET}\"'") |
649 | 659 |
#----------------------- global compile and link options ------------------------------ |
660 |
#enable sse2 on x86 |
|
661 |
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)") |
|
662 |
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse -msse2 -msse3") |
|
663 |
endif (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)") |
|
664 | ||
650 | 665 |
# disable warning about unused but set variables in gcc 4.6+ |
651 | 666 |
if (CMAKE_COMPILER_IS_GNUCC) |
652 | 667 |
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) |
... | ... | |
731 | 746 | |
732 | 747 |
#-------------------------------------------------------------------------------- |
733 | 748 | |
749 |
if (NOT OSCamOperatingSystem MATCHES "Mac OS X") |
|
750 |
if (NOT DEFINED ENV{ANDROID_NDK}) |
|
751 |
if (NOT DEFINED ENV{ANDROID_STANDALONE_TOOLCHAIN}) |
|
752 |
if(WITH_EMU) |
|
753 |
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/SoftCam.Key) |
|
754 |
execute_process(COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/SoftCam.Key ${CMAKE_CURRENT_BINARY_DIR}/SoftCam.Key) |
|
755 |
else(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/SoftCam.Key) |
|
756 |
execute_process(COMMAND touch ${CMAKE_CURRENT_BINARY_DIR}/SoftCam.Key) |
|
757 |
endif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/SoftCam.Key) |
|
758 |
execute_process(COMMAND touch ${CMAKE_CURRENT_BINARY_DIR}/utils/SoftCam.Key) |
|
759 |
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--format=binary -Wl,SoftCam.Key -Wl,--format=default" ) |
|
760 |
endif(WITH_EMU) |
|
761 |
endif (NOT DEFINED ENV{ANDROID_STANDALONE_TOOLCHAIN}) |
|
762 |
endif (NOT DEFINED ENV{ANDROID_NDK}) |
|
763 |
endif (NOT OSCamOperatingSystem MATCHES "Mac OS X") |
|
764 | ||
734 | 765 |
#----------------------- installation ----------------------------- |
735 | 766 | |
736 | 767 |
file (GLOB config_files "${CMAKE_CURRENT_SOURCE_DIR}/Distribution/oscam.*") |
... | ... | |
819 | 850 |
endif(STATICLIBUSB AND NOT LIBUSBDIR) |
820 | 851 |
endif (HAVE_LIBUSB) |
821 | 852 | |
853 |
if (WITH_EMU) |
|
854 |
message(STATUS " Compile with EMU support") |
|
855 |
endif (WITH_EMU) |
|
856 | ||
822 | 857 |
message (STATUS "") |
Makefile (working copy) | ||
---|---|---|
65 | 65 | |
66 | 66 |
LDFLAGS = -Wl,--gc-sections |
67 | 67 | |
68 |
TARGETHELP := $(shell $(CC) --target-help 2>&1) |
|
69 |
ifneq (,$(findstring sse2,$(TARGETHELP))) |
|
70 |
override CFLAGS += -fexpensive-optimizations -mmmx -msse -msse2 -msse3 |
|
71 |
else |
|
72 |
override CFLAGS += -fexpensive-optimizations |
|
73 |
endif |
|
74 | ||
68 | 75 |
# The linker for powerpc have bug that prevents --gc-sections from working |
69 | 76 |
# Check for the linker version and if it matches disable --gc-sections |
70 | 77 |
# For more information about the bug see: |
... | ... | |
268 | 275 |
SRC-$(CONFIG_MODULE_CCCAM) += module-cccam.c |
269 | 276 |
SRC-$(CONFIG_MODULE_CCCSHARE) += module-cccshare.c |
270 | 277 |
SRC-$(CONFIG_MODULE_CONSTCW) += module-constcw.c |
278 |
SRC-$(CONFIG_WITH_EMU) += module-emulator.c |
|
279 |
SRC-$(CONFIG_WITH_EMU) += module-emulator-osemu.c |
|
280 |
SRC-$(CONFIG_WITH_EMU) += module-emulator-stream.c |
|
281 |
SRC-$(CONFIG_WITH_EMU) += ffdecsa/ffdecsa.c |
|
282 |
UNAME := $(shell uname -s) |
|
283 |
ifneq ($(UNAME),Darwin) |
|
284 |
ifndef ANDROID_NDK |
|
285 |
ifndef ANDROID_STANDALONE_TOOLCHAIN |
|
286 |
ifeq "$(CONFIG_WITH_EMU)" "y" |
|
287 |
TOUCH_SK := $(shell touch SoftCam.Key) |
|
288 |
override LDFLAGS += -Wl,--format=binary -Wl,SoftCam.Key -Wl,--format=default |
|
289 |
endif |
|
290 |
endif |
|
291 |
endif |
|
292 |
endif |
|
271 | 293 |
SRC-$(CONFIG_CS_CACHEEX) += module-csp.c |
272 | 294 |
SRC-$(CONFIG_CW_CYCLE_CHECK) += module-cw-cycle-check.c |
273 | 295 |
SRC-$(CONFIG_WITH_AZBOX) += module-dvbapi-azbox.c |
... | ... | |
365 | 387 |
# starts the compilation. |
366 | 388 |
all: |
367 | 389 |
@./config.sh --use-flags "$(USE_FLAGS)" --objdir "$(OBJDIR)" --make-config.mak |
368 |
@-mkdir -p $(OBJDIR)/cscrypt $(OBJDIR)/csctapi $(OBJDIR)/minilzo $(OBJDIR)/webif |
|
390 |
@-mkdir -p $(OBJDIR)/cscrypt $(OBJDIR)/csctapi $(OBJDIR)/minilzo $(OBJDIR)/ffdecsa $(OBJDIR)/webif
|
|
369 | 391 |
@-printf "\ |
370 | 392 |
+-------------------------------------------------------------------------------\n\ |
371 | 393 |
| OSCam ver: $(VER) rev: $(SVN_REV) target: $(TARGET)\n\ |
config.h (working copy) | ||
---|---|---|
1 | 1 |
#ifndef CONFIG_H_ |
2 | 2 |
#define CONFIG_H_ |
3 | 3 | |
4 |
#define WITH_EMU 1 |
|
4 | 5 |
#define WEBIF 1 |
5 | 6 |
#define WEBIF_LIVELOG 1 |
6 | 7 |
#define WEBIF_JQUERY 1 |
config.sh (working copy) | ||
---|---|---|
1 | 1 |
#!/bin/sh |
2 | 2 | |
3 |
addons="WEBIF WEBIF_LIVELOG WEBIF_JQUERY TOUCH WITH_SSL HAVE_DVBAPI READ_SDT_CHARSETS IRDETO_GUESSING CS_ANTICASC WITH_DEBUG MODULE_MONITOR WITH_LB CS_CACHEEX CW_CYCLE_CHECK LCDSUPPORT LEDSUPPORT CLOCKFIX IPV6SUPPORT" |
|
3 |
addons="WEBIF WEBIF_LIVELOG WEBIF_JQUERY TOUCH WITH_SSL HAVE_DVBAPI READ_SDT_CHARSETS IRDETO_GUESSING CS_ANTICASC WITH_DEBUG MODULE_MONITOR WITH_LB CS_CACHEEX CW_CYCLE_CHECK LCDSUPPORT LEDSUPPORT CLOCKFIX IPV6SUPPORT WITH_EMU"
|
|
4 | 4 |
protocols="MODULE_CAMD33 MODULE_CAMD35 MODULE_CAMD35_TCP MODULE_NEWCAMD MODULE_CCCAM MODULE_CCCSHARE MODULE_GBOX MODULE_RADEGAST MODULE_SCAM MODULE_SERIAL MODULE_CONSTCW MODULE_PANDORA MODULE_GHTTP" |
5 | 5 |
readers="READER_NAGRA READER_IRDETO READER_CONAX READER_CRYPTOWORKS READER_SECA READER_VIACCESS READER_VIDEOGUARD READER_DRE READER_TONGFANG READER_BULCRYPT READER_GRIFFIN READER_DGCRYPT" |
6 | 6 |
card_readers="CARDREADER_PHOENIX CARDREADER_INTERNAL CARDREADER_SC8IN1 CARDREADER_MP35 CARDREADER_SMARGO CARDREADER_DB2COM CARDREADER_STAPI CARDREADER_STAPI5 CARDREADER_STINGER CARDREADER_DRECAS" |
... | ... | |
24 | 24 |
# CONFIG_LEDSUPPORT=n |
25 | 25 |
CONFIG_CLOCKFIX=y |
26 | 26 |
# CONFIG_IPV6SUPPORT=n |
27 |
CONFIG_WITH_EMU=y |
|
27 | 28 |
# CONFIG_MODULE_CAMD33=n |
28 | 29 |
CONFIG_MODULE_CAMD35=y |
29 | 30 |
CONFIG_MODULE_CAMD35_TCP=y |
... | ... | |
289 | 290 | |
290 | 291 |
update_deps() { |
291 | 292 |
# Calculate dependencies |
292 |
enabled_any $(get_opts readers) $(get_opts card_readers) && enable_opt WITH_CARDREADER >/dev/null |
|
293 |
disabled_all $(get_opts readers) $(get_opts card_readers) && disable_opt WITH_CARDREADER >/dev/null |
|
293 |
enabled_any $(get_opts readers) $(get_opts card_readers) WITH_EMU && enable_opt WITH_CARDREADER >/dev/null
|
|
294 |
disabled_all $(get_opts readers) $(get_opts card_readers) WITH_EMU && disable_opt WITH_CARDREADER >/dev/null
|
|
294 | 295 |
disabled WEBIF && disable_opt WEBIF_LIVELOG >/dev/null |
295 | 296 |
disabled WEBIF && disable_opt WEBIF_JQUERY >/dev/null |
296 | 297 |
enabled MODULE_CCCSHARE && enable_opt MODULE_CCCAM >/dev/null |
297 | 298 |
enabled_any CARDREADER_DB2COM CARDREADER_MP35 CARDREADER_SC8IN1 CARDREADER_STINGER && enable_opt CARDREADER_PHOENIX >/dev/null |
299 |
enabled WITH_EMU && enable_opt READER_VIACCESS >/dev/null |
|
300 |
enabled WITH_EMU && enable_opt READER_DRE >/dev/null |
|
301 |
enabled WITH_EMU && enable_opt MODULE_NEWCAMD >/dev/null |
|
298 | 302 |
} |
299 | 303 | |
300 | 304 |
list_config() { |
... | ... | |
344 | 348 |
not_have_flag USE_LIBCRYPTO && echo "CONFIG_LIB_AES=y" || echo "# CONFIG_LIB_AES=n" |
345 | 349 |
enabled MODULE_CCCAM && echo "CONFIG_LIB_RC6=y" || echo "# CONFIG_LIB_RC6=n" |
346 | 350 |
not_have_flag USE_LIBCRYPTO && enabled MODULE_CCCAM && echo "CONFIG_LIB_SHA1=y" || echo "# CONFIG_LIB_SHA1=n" |
347 |
enabled_any READER_DRE MODULE_SCAM READER_VIACCESS && echo "CONFIG_LIB_DES=y" || echo "# CONFIG_LIB_DES=n" |
|
348 |
enabled_any MODULE_CCCAM READER_NAGRA READER_SECA && echo "CONFIG_LIB_IDEA=y" || echo "# CONFIG_LIB_IDEA=n" |
|
349 |
not_have_flag USE_LIBCRYPTO && enabled_any READER_CONAX READER_CRYPTOWORKS READER_NAGRA && echo "CONFIG_LIB_BIGNUM=y" || echo "# CONFIG_LIB_BIGNUM=n" |
|
351 |
enabled_any READER_DRE MODULE_SCAM READER_VIACCESS WITH_EMU && echo "CONFIG_LIB_DES=y" || echo "# CONFIG_LIB_DES=n"
|
|
352 |
enabled_any MODULE_CCCAM READER_NAGRA READER_SECA WITH_EMU && echo "CONFIG_LIB_IDEA=y" || echo "# CONFIG_LIB_IDEA=n"
|
|
353 |
not_have_flag USE_LIBCRYPTO && enabled_any READER_CONAX READER_CRYPTOWORKS READER_NAGRA WITH_EMU && echo "CONFIG_LIB_BIGNUM=y" || echo "# CONFIG_LIB_BIGNUM=n"
|
|
350 | 354 |
} |
351 | 355 | |
352 | 356 |
make_config_c() { |
... | ... | |
457 | 461 |
LEDSUPPORT "LED support" $(check_test "LEDSUPPORT") \ |
458 | 462 |
CLOCKFIX "Clockfix (disable on old systems!)" $(check_test "CLOCKFIX") \ |
459 | 463 |
IPV6SUPPORT "IPv6 support (experimental)" $(check_test "IPV6SUPPORT") \ |
464 |
WITH_EMU "Emulator support" $(check_test "WITH_EMU") \ |
|
460 | 465 |
2> ${tempfile} |
461 | 466 | |
462 | 467 |
opt=${?} |
cscrypt/md5.c (working copy) | ||
---|---|---|
25 | 25 | |
26 | 26 |
#if !defined(WITH_SSL) && !defined(WITH_LIBCRYPTO) |
27 | 27 | |
28 |
typedef struct MD5Context |
|
29 |
{ |
|
30 |
uint32_t buf[4]; |
|
31 |
uint32_t bits[2]; |
|
32 |
uint32_t in[16]; |
|
33 |
} MD5_CTX; |
|
34 | ||
35 | 28 |
#ifdef __i386__ |
36 | 29 |
#define byteReverse(a, b) |
37 | 30 |
#else |
... | ... | |
155 | 148 |
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious |
156 | 149 |
* initialization constants. |
157 | 150 |
*/ |
158 |
static void MD5_Init(MD5_CTX *ctx)
|
|
151 |
void MD5_Init(MD5_CTX *ctx) |
|
159 | 152 |
{ |
160 | 153 |
ctx->buf[0] = 0x67452301; |
161 | 154 |
ctx->buf[1] = 0xefcdab89; |
... | ... | |
170 | 163 |
* Update context to reflect the concatenation of another buffer full |
171 | 164 |
* of bytes. |
172 | 165 |
*/ |
173 |
static void MD5_Update(MD5_CTX *ctx, const unsigned char *buf, unsigned int len)
|
|
166 |
void MD5_Update(MD5_CTX *ctx, const unsigned char *buf, unsigned int len) |
|
174 | 167 |
{ |
175 | 168 |
uint32_t t; |
176 | 169 | |
... | ... | |
219 | 212 |
* Final wrapup - pad to 64-byte boundary with the bit pattern |
220 | 213 |
* 1 0* (64-bit count of bits processed, MSB-first) |
221 | 214 |
*/ |
222 |
static void MD5_Final(unsigned char digest[MD5_DIGEST_LENGTH], MD5_CTX *ctx)
|
|
215 |
void MD5_Final(unsigned char digest[MD5_DIGEST_LENGTH], MD5_CTX *ctx) |
|
223 | 216 |
{ |
224 | 217 |
unsigned count; |
225 | 218 |
unsigned char *p; |
cscrypt/md5.h (working copy) | ||
---|---|---|
7 | 7 |
#define MD5_DIGEST_LENGTH 16 |
8 | 8 | |
9 | 9 |
unsigned char *MD5(const unsigned char *input, unsigned long len, unsigned char *output_hash); |
10 |
#endif |
|
11 | 10 | |
12 |
char *__md5_crypt(const char *text_pass, const char *salt, char *crypted_passwd); |
|
11 |
typedef struct MD5Context { |
|
12 |
uint32_t buf[4]; |
|
13 |
uint32_t bits[2]; |
|
14 |
uint32_t in[16]; |
|
15 |
} MD5_CTX; |
|
13 | 16 | |
17 |
void MD5_Init(MD5_CTX *ctx); |
|
18 |
void MD5_Update(MD5_CTX *ctx, const unsigned char *buf, unsigned int len); |
|
19 |
void MD5_Final(unsigned char digest[MD5_DIGEST_LENGTH], MD5_CTX *ctx); |
|
14 | 20 |
#endif |
21 |
char *__md5_crypt(const char *text_pass, const char *salt, char *crypted_passwd); |
|
22 |
#endif |
csctapi/cardreaders.h (working copy) | ||
---|---|---|
14 | 14 |
extern const struct s_cardreader cardreader_stapi; |
15 | 15 |
extern const struct s_cardreader cardreader_stinger; |
16 | 16 |
extern const struct s_cardreader cardreader_drecas; |
17 |
extern const struct s_cardreader cardreader_emu; |
|
17 | 18 | |
18 | 19 |
#endif |
ffdecsa/CMakeLists.txt (working copy) | ||
---|---|---|
1 |
project (ffdecsa) |
|
2 | ||
3 |
file (GLOB ffdecsa_srcs "ffdecsa.c") |
|
4 |
file (GLOB ffdecsa_hdrs "*.h") |
|
5 | ||
6 |
set (lib_name "ffdecsa") |
|
7 | ||
8 |
add_library (${lib_name} STATIC ${ffdecsa_srcs} ${ffdecsa_hdrs}) |
ffdecsa/COPYING (working copy) | ||
---|---|---|
1 |
GNU GENERAL PUBLIC LICENSE |
|
2 |
Version 2, June 1991 |
|
3 | ||
4 |
Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
|
5 |
675 Mass Ave, Cambridge, MA 02139, USA |
|
6 |
Everyone is permitted to copy and distribute verbatim copies |
|
7 |
of this license document, but changing it is not allowed. |
|
8 | ||
9 |
Preamble |
|
10 | ||
11 |
The licenses for most software are designed to take away your |
|
12 |
freedom to share and change it. By contrast, the GNU General Public |
|
13 |
License is intended to guarantee your freedom to share and change free |
|
14 |
software--to make sure the software is free for all its users. This |
|
15 |
General Public License applies to most of the Free Software |
|
16 |
Foundation's software and to any other program whose authors commit to |
|
17 |
using it. (Some other Free Software Foundation software is covered by |
|
18 |
the GNU Library General Public License instead.) You can apply it to |
|
19 |
your programs, too. |
|
20 | ||
21 |
When we speak of free software, we are referring to freedom, not |
|
22 |
price. Our General Public Licenses are designed to make sure that you |
|
23 |
have the freedom to distribute copies of free software (and charge for |
|
24 |
this service if you wish), that you receive source code or can get it |
|
25 |
if you want it, that you can change the software or use pieces of it |
|
26 |
in new free programs; and that you know you can do these things. |
|
27 | ||
28 |
To protect your rights, we need to make restrictions that forbid |
|
29 |
anyone to deny you these rights or to ask you to surrender the rights. |
|
30 |
These restrictions translate to certain responsibilities for you if you |
|
31 |
distribute copies of the software, or if you modify it. |
|
32 | ||
33 |
For example, if you distribute copies of such a program, whether |
|
34 |
gratis or for a fee, you must give the recipients all the rights that |
|
35 |
you have. You must make sure that they, too, receive or can get the |
|
36 |
source code. And you must show them these terms so they know their |
|
37 |
rights. |
|
38 | ||
39 |
We protect your rights with two steps: (1) copyright the software, and |
|
40 |
(2) offer you this license which gives you legal permission to copy, |
|
41 |
distribute and/or modify the software. |
|
42 | ||
43 |
Also, for each author's protection and ours, we want to make certain |
|
44 |
that everyone understands that there is no warranty for this free |
|
45 |
software. If the software is modified by someone else and passed on, we |
|
46 |
want its recipients to know that what they have is not the original, so |
|
47 |
that any problems introduced by others will not reflect on the original |
|
48 |
authors' reputations. |
|
49 | ||
50 |
Finally, any free program is threatened constantly by software |
|
51 |
patents. We wish to avoid the danger that redistributors of a free |
|
52 |
program will individually obtain patent licenses, in effect making the |
|
53 |
program proprietary. To prevent this, we have made it clear that any |
|
54 |
patent must be licensed for everyone's free use or not licensed at all. |
|
55 | ||
56 |
The precise terms and conditions for copying, distribution and |
|
57 |
modification follow. |
|
58 | ||
59 |
GNU GENERAL PUBLIC LICENSE |
|
60 |
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
|
61 | ||
62 |
0. This License applies to any program or other work which contains |
|
63 |
a notice placed by the copyright holder saying it may be distributed |
|
64 |
under the terms of this General Public License. The "Program", below, |
|
65 |
refers to any such program or work, and a "work based on the Program" |
|
66 |
means either the Program or any derivative work under copyright law: |
|
67 |
that is to say, a work containing the Program or a portion of it, |
|
68 |
either verbatim or with modifications and/or translated into another |
|
69 |
language. (Hereinafter, translation is included without limitation in |
|
70 |
the term "modification".) Each licensee is addressed as "you". |
|
71 | ||
72 |
Activities other than copying, distribution and modification are not |
|
73 |
covered by this License; they are outside its scope. The act of |
|
74 |
running the Program is not restricted, and the output from the Program |
|
75 |
is covered only if its contents constitute a work based on the |
|
76 |
Program (independent of having been made by running the Program). |
|
77 |
Whether that is true depends on what the Program does. |
|
78 | ||
79 |
1. You may copy and distribute verbatim copies of the Program's |
|
80 |
source code as you receive it, in any medium, provided that you |
|
81 |
conspicuously and appropriately publish on each copy an appropriate |
|
82 |
copyright notice and disclaimer of warranty; keep intact all the |
|
83 |
notices that refer to this License and to the absence of any warranty; |
|
84 |
and give any other recipients of the Program a copy of this License |
|
85 |
along with the Program. |
|
86 | ||
87 |
You may charge a fee for the physical act of transferring a copy, and |
|
88 |
you may at your option offer warranty protection in exchange for a fee. |
|
89 | ||
90 |
2. You may modify your copy or copies of the Program or any portion |
|
91 |
of it, thus forming a work based on the Program, and copy and |
|
92 |
distribute such modifications or work under the terms of Section 1 |
|
93 |
above, provided that you also meet all of these conditions: |
|
94 | ||
95 |
a) You must cause the modified files to carry prominent notices |
|
96 |
stating that you changed the files and the date of any change. |
|
97 | ||
98 |
b) You must cause any work that you distribute or publish, that in |
|
99 |
whole or in part contains or is derived from the Program or any |
|
100 |
part thereof, to be licensed as a whole at no charge to all third |
|
101 |
parties under the terms of this License. |
|
102 | ||
103 |
c) If the modified program normally reads commands interactively |
|
104 |
when run, you must cause it, when started running for such |
|
105 |
interactive use in the most ordinary way, to print or display an |
|
106 |
announcement including an appropriate copyright notice and a |
|
107 |
notice that there is no warranty (or else, saying that you provide |
|
108 |
a warranty) and that users may redistribute the program under |
|
109 |
these conditions, and telling the user how to view a copy of this |
|
110 |
License. (Exception: if the Program itself is interactive but |
|
111 |
does not normally print such an announcement, your work based on |
|
112 |
the Program is not required to print an announcement.) |
|
113 | ||
114 |
These requirements apply to the modified work as a whole. If |
|
115 |
identifiable sections of that work are not derived from the Program, |
|
116 |
and can be reasonably considered independent and separate works in |
|
117 |
themselves, then this License, and its terms, do not apply to those |
|
118 |
sections when you distribute them as separate works. But when you |
|
119 |
distribute the same sections as part of a whole which is a work based |
|
120 |
on the Program, the distribution of the whole must be on the terms of |
|
121 |
this License, whose permissions for other licensees extend to the |
|
122 |
entire whole, and thus to each and every part regardless of who wrote it. |
|
123 | ||
124 |
Thus, it is not the intent of this section to claim rights or contest |
|
125 |
your rights to work written entirely by you; rather, the intent is to |
|
126 |
exercise the right to control the distribution of derivative or |
|
127 |
collective works based on the Program. |
|
128 | ||
129 |
In addition, mere aggregation of another work not based on the Program |
|
130 |
with the Program (or with a work based on the Program) on a volume of |
|
131 |
a storage or distribution medium does not bring the other work under |
|
132 |
the scope of this License. |
|
133 | ||
134 |
3. You may copy and distribute the Program (or a work based on it, |
|
135 |
under Section 2) in object code or executable form under the terms of |
|
136 |
Sections 1 and 2 above provided that you also do one of the following: |
|
137 | ||
138 |
a) Accompany it with the complete corresponding machine-readable |
|
139 |
source code, which must be distributed under the terms of Sections |
|
140 |
1 and 2 above on a medium customarily used for software interchange; or, |
|
141 | ||
142 |
b) Accompany it with a written offer, valid for at least three |
|
143 |
years, to give any third party, for a charge no more than your |
|
144 |
cost of physically performing source distribution, a complete |
|
145 |
machine-readable copy of the corresponding source code, to be |
|
146 |
distributed under the terms of Sections 1 and 2 above on a medium |
|
147 |
customarily used for software interchange; or, |
|
148 | ||
149 |
c) Accompany it with the information you received as to the offer |
|
150 |
to distribute corresponding source code. (This alternative is |
|
151 |
allowed only for noncommercial distribution and only if you |
|
152 |
received the program in object code or executable form with such |
|
153 |
an offer, in accord with Subsection b above.) |
|
154 | ||
155 |
The source code for a work means the preferred form of the work for |
|
156 |
making modifications to it. For an executable work, complete source |
|
157 |
code means all the source code for all modules it contains, plus any |
|
158 |
associated interface definition files, plus the scripts used to |
|
159 |
control compilation and installation of the executable. However, as a |
|
160 |
special exception, the source code distributed need not include |
|
161 |
anything that is normally distributed (in either source or binary |
|
162 |
form) with the major components (compiler, kernel, and so on) of the |
|
163 |
operating system on which the executable runs, unless that component |
|
164 |
itself accompanies the executable. |
|
165 | ||
166 |
If distribution of executable or object code is made by offering |
|
167 |
access to copy from a designated place, then offering equivalent |
|
168 |
access to copy the source code from the same place counts as |
|
169 |
distribution of the source code, even though third parties are not |
|
170 |
compelled to copy the source along with the object code. |
|
171 | ||
172 |
4. You may not copy, modify, sublicense, or distribute the Program |
|
173 |
except as expressly provided under this License. Any attempt |
|
174 |
otherwise to copy, modify, sublicense or distribute the Program is |
|
175 |
void, and will automatically terminate your rights under this License. |
|
176 |
However, parties who have received copies, or rights, from you under |
|
177 |
this License will not have their licenses terminated so long as such |
|
178 |
parties remain in full compliance. |
|
179 | ||
180 |
5. You are not required to accept this License, since you have not |
|
181 |
signed it. However, nothing else grants you permission to modify or |
|
182 |
distribute the Program or its derivative works. These actions are |
|
183 |
prohibited by law if you do not accept this License. Therefore, by |
|
184 |
modifying or distributing the Program (or any work based on the |
|
185 |
Program), you indicate your acceptance of this License to do so, and |
|
186 |
all its terms and conditions for copying, distributing or modifying |
|
187 |
the Program or works based on it. |
|
188 | ||
189 |
6. Each time you redistribute the Program (or any work based on the |
|
190 |
Program), the recipient automatically receives a license from the |
|
191 |
original licensor to copy, distribute or modify the Program subject to |
|
192 |
these terms and conditions. You may not impose any further |
|
193 |
restrictions on the recipients' exercise of the rights granted herein. |
|
194 |
You are not responsible for enforcing compliance by third parties to |
|
195 |
this License. |
|
196 | ||
197 |
7. If, as a consequence of a court judgment or allegation of patent |
|
198 |
infringement or for any other reason (not limited to patent issues), |
|
199 |
conditions are imposed on you (whether by court order, agreement or |
|
200 |
otherwise) that contradict the conditions of this License, they do not |
|
201 |
excuse you from the conditions of this License. If you cannot |
|
202 |
distribute so as to satisfy simultaneously your obligations under this |
|
203 |
License and any other pertinent obligations, then as a consequence you |
|
204 |
may not distribute the Program at all. For example, if a patent |
|
205 |
license would not permit royalty-free redistribution of the Program by |
|
206 |
all those who receive copies directly or indirectly through you, then |
|
207 |
the only way you could satisfy both it and this License would be to |
|
208 |
refrain entirely from distribution of the Program. |
|
209 | ||
210 |
If any portion of this section is held invalid or unenforceable under |
|
211 |
any particular circumstance, the balance of the section is intended to |
|
212 |
apply and the section as a whole is intended to apply in other |
|
213 |
circumstances. |
|
214 | ||
215 |
It is not the purpose of this section to induce you to infringe any |
|
216 |
patents or other property right claims or to contest validity of any |
|
217 |
such claims; this section has the sole purpose of protecting the |
|
218 |
integrity of the free software distribution system, which is |
|
219 |
implemented by public license practices. Many people have made |
|
220 |
generous contributions to the wide range of software distributed |
|
221 |
through that system in reliance on consistent application of that |
|
222 |
system; it is up to the author/donor to decide if he or she is willing |
|
223 |
to distribute software through any other system and a licensee cannot |
|
224 |
impose that choice. |
|
225 | ||
226 |
This section is intended to make thoroughly clear what is believed to |
|
227 |
be a consequence of the rest of this License. |
|
228 | ||
229 |
8. If the distribution and/or use of the Program is restricted in |
|
230 |
certain countries either by patents or by copyrighted interfaces, the |
|
231 |
original copyright holder who places the Program under this License |
|
232 |
may add an explicit geographical distribution limitation excluding |
|
233 |
those countries, so that distribution is permitted only in or among |
|
234 |
countries not thus excluded. In such case, this License incorporates |
|
235 |
the limitation as if written in the body of this License. |
|
236 | ||
237 |
9. The Free Software Foundation may publish revised and/or new versions |
|
238 |
of the General Public License from time to time. Such new versions will |
|
239 |
be similar in spirit to the present version, but may differ in detail to |
|
240 |
address new problems or concerns. |
|
241 | ||
242 |
Each version is given a distinguishing version number. If the Program |
|
243 |
specifies a version number of this License which applies to it and "any |
|
244 |
later version", you have the option of following the terms and conditions |
|
245 |
either of that version or of any later version published by the Free |
|
246 |
Software Foundation. If the Program does not specify a version number of |
|
247 |
this License, you may choose any version ever published by the Free Software |
|
248 |
Foundation. |
|
249 | ||
250 |
10. If you wish to incorporate parts of the Program into other free |
|
251 |
programs whose distribution conditions are different, write to the author |
|
252 |
to ask for permission. For software which is copyrighted by the Free |
|
253 |
Software Foundation, write to the Free Software Foundation; we sometimes |
|
254 |
make exceptions for this. Our decision will be guided by the two goals |
|
255 |
of preserving the free status of all derivatives of our free software and |
|
256 |
of promoting the sharing and reuse of software generally. |
|
257 | ||
258 |
NO WARRANTY |
|
259 | ||
260 |
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
|
261 |
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
|
262 |
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
|
263 |
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
|
264 |
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
|
265 |
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
|
266 |
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
|
267 |
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
|
268 |
REPAIR OR CORRECTION. |
|
269 | ||
270 |
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
|
271 |
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
|
272 |
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
|
273 |
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
|
274 |
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
|
275 |
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
|
276 |
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
|
277 |
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
|
278 |
POSSIBILITY OF SUCH DAMAGES. |
|
279 | ||
280 |
END OF TERMS AND CONDITIONS |
|
281 | ||
282 |
Appendix: How to Apply These Terms to Your New Programs |
|
283 | ||
284 |
If you develop a new program, and you want it to be of the greatest |
|
285 |
possible use to the public, the best way to achieve this is to make it |
|
286 |
free software which everyone can redistribute and change under these terms. |
|
287 | ||
288 |
To do so, attach the following notices to the program. It is safest |
|
289 |
to attach them to the start of each source file to most effectively |
|
290 |
convey the exclusion of warranty; and each file should have at least |
|
291 |
the "copyright" line and a pointer to where the full notice is found. |
|
292 | ||
293 |
<one line to give the program's name and a brief idea of what it does.> |
|
294 |
Copyright (C) 19yy <name of author> |
|
295 | ||
296 |
This program is free software; you can redistribute it and/or modify |
|
297 |
it under the terms of the GNU General Public License as published by |
|
298 |
the Free Software Foundation; either version 2 of the License, or |
|
299 |
(at your option) any later version. |
|
300 | ||
301 |
This program is distributed in the hope that it will be useful, |
|
302 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
303 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
304 |
GNU General Public License for more details. |
|
305 | ||
306 |
You should have received a copy of the GNU General Public License |
|
307 |
along with this program; if not, write to the Free Software |
|
308 |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
|
309 | ||
310 |
Also add information on how to contact you by electronic and paper mail. |
|
311 | ||
312 |
If the program is interactive, make it output a short notice like this |
|
313 |
when it starts in an interactive mode: |
|
314 | ||
315 |
Gnomovision version 69, Copyright (C) 19yy name of author |
|
316 |
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
|
317 |
This is free software, and you are welcome to redistribute it |
|
318 |
under certain conditions; type `show c' for details. |
|
319 | ||
320 |
The hypothetical commands `show w' and `show c' should show the appropriate |
|
321 |
parts of the General Public License. Of course, the commands you use may |
|
322 |
be called something other than `show w' and `show c'; they could even be |
|
323 |
mouse-clicks or menu items--whatever suits your program. |
|
324 | ||
325 |
You should also get your employer (if you work as a programmer) or your |
|
326 |
school, if any, to sign a "copyright disclaimer" for the program, if |
|
327 |
necessary. Here is a sample; alter the names: |
|
328 | ||
329 |
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
|
330 |
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
|
331 | ||
332 |
<signature of Ty Coon>, 1 April 1989 |
|
333 |
Ty Coon, President of Vice |
|
334 | ||
335 |
This General Public License does not permit incorporating your program into |
|
336 |
proprietary programs. If your program is a subroutine library, you may |
|
337 |
consider it more useful to permit linking proprietary applications with the |
|
338 |
library. If this is what you want to do, use the GNU Library General |
|
339 |
Public License instead of this License. |
ffdecsa/Makefile (working copy) | ||
---|---|---|
1 |
parent: |
|
2 |
@$(MAKE) --no-print-directory -C .. |
ffdecsa/ffdecsa.c (working copy) | ||
---|---|---|
1 |
/* FFdecsa -- fast decsa algorithm |
|
2 |
* |
|
3 |
* Copyright (C) 2003-2004 fatih89r |
|
4 |
* |
|
5 |
* This program is free software; you can redistribute it and/or modify |
|
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; either version 2 of the License, or |
|
8 |
* (at your option) any later version. |
|
9 |
* |
|
10 |
* This program is distributed in the hope that it will be useful, |
|
11 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
13 |
* GNU General Public License for more details. |
|
14 |
* |
|
15 |
* You should have received a copy of the GNU General Public License |
|
16 |
* along with this program; if not, write to the Free Software |
|
17 |
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
|
18 |
*/ |
|
19 | ||
20 | ||
21 |
#include <sys/types.h> |
|
22 |
#include <string.h> |
|
23 |
#include <stdio.h> |
|
24 |
#include <stdlib.h> |
|
25 | ||
26 |
#include "ffdecsa.h" |
|
27 | ||
28 |
#ifndef NULL |
|
29 |
#define NULL 0 |
|
30 |
#endif |
|
31 | ||
32 |
//#define DEBUG |
|
33 |
#ifdef DEBUG |
|
34 |
#define DBG(a) a |
|
35 |
#else |
|
36 |
#define DBG(a) |
|
37 |
#endif |
|
38 | ||
39 |
//// parallelization stuff, large speed differences are possible |
|
40 |
// possible choices |
|
41 |
#define PARALLEL_32_4CHAR 320 |
|
42 |
#define PARALLEL_32_4CHARA 321 |
|
43 |
#define PARALLEL_32_INT 322 |
|
44 |
#define PARALLEL_64_8CHAR 640 |
|
45 |
#define PARALLEL_64_8CHARA 641 |
|
46 |
#define PARALLEL_64_2INT 642 |
|
47 |
#define PARALLEL_64_LONG 643 |
|
48 |
#define PARALLEL_64_MMX 644 |
|
49 |
#define PARALLEL_128_16CHAR 1280 |
|
50 |
#define PARALLEL_128_16CHARA 1281 |
|
51 |
#define PARALLEL_128_4INT 1282 |
|
52 |
#define PARALLEL_128_2LONG 1283 |
|
53 |
#define PARALLEL_128_2MMX 1284 |
|
54 |
#define PARALLEL_128_SSE 1285 |
|
55 |
#define PARALLEL_128_SSE2 1286 |
|
56 | ||
57 |
//////// our choice //////////////// our choice //////////////// our choice //////////////// our choice //////// |
|
58 |
#ifndef PARALLEL_MODE |
|
59 | ||
60 |
#if defined(__x86_64__) || defined(_M_X64) |
|
61 |
#define PARALLEL_MODE PARALLEL_128_SSE2 |
|
62 | ||
63 |
#elif defined(__mips__) || defined(__mips) || defined(__MIPS__) |
|
64 |
#define PARALLEL_MODE PARALLEL_64_LONG |
|
65 | ||
66 |
#elif defined(__sh__) || defined(__SH4__) |
|
67 |
#define PARALLEL_MODE PARALLEL_32_INT |
|
68 |
#define COPY_UNALIGNED_PKT |
|
69 |
#define MEMALIGN_VAL 4 |
|
70 | ||
71 |
#else |
|
72 |
#define PARALLEL_MODE PARALLEL_32_INT |
|
73 |
#endif |
|
74 | ||
75 |
#endif |
|
76 |
//////// our choice //////////////// our choice //////////////// our choice //////////////// our choice //////// |
|
77 | ||
78 |
#include "parallel_generic.h" |
|
79 |
//// conditionals |
|
80 |
#if PARALLEL_MODE==PARALLEL_32_4CHAR |
|
81 |
#include "parallel_032_4char.h" |
|
82 |
#elif PARALLEL_MODE==PARALLEL_32_4CHARA |
|
83 |
#include "parallel_032_4charA.h" |
|
84 |
#elif PARALLEL_MODE==PARALLEL_32_INT |
|
85 |
#include "parallel_032_int.h" |
|
86 |
#elif PARALLEL_MODE==PARALLEL_64_8CHAR |
|
87 |
#include "parallel_064_8char.h" |
|
88 |
#elif PARALLEL_MODE==PARALLEL_64_8CHARA |
|
89 |
#include "parallel_064_8charA.h" |
|
90 |
#elif PARALLEL_MODE==PARALLEL_64_2INT |
|
91 |
#include "parallel_064_2int.h" |
|
92 |
#elif PARALLEL_MODE==PARALLEL_64_LONG |
|
93 |
#include "parallel_064_long.h" |
|
94 |
#elif PARALLEL_MODE==PARALLEL_64_MMX |
|
95 |
#include "parallel_064_mmx.h" |
|
96 |
#elif PARALLEL_MODE==PARALLEL_128_16CHAR |
|
97 |
#include "parallel_128_16char.h" |
|
98 |
#elif PARALLEL_MODE==PARALLEL_128_16CHARA |
|
99 |
#include "parallel_128_16charA.h" |
|
100 |
#elif PARALLEL_MODE==PARALLEL_128_4INT |
|
101 |
#include "parallel_128_4int.h" |
|
102 |
#elif PARALLEL_MODE==PARALLEL_128_2LONG |
|
103 |
#include "parallel_128_2long.h" |
|
104 |
#elif PARALLEL_MODE==PARALLEL_128_2MMX |
|
105 |
#include "parallel_128_2mmx.h" |
|
106 |
#elif PARALLEL_MODE==PARALLEL_128_SSE |
|
107 |
#include "parallel_128_sse.h" |
|
108 |
#elif PARALLEL_MODE==PARALLEL_128_SSE2 |
|
109 |
#include "parallel_128_sse2.h" |
|
110 |
#else |
|
111 |
#error "unknown/undefined parallel mode" |
|
112 |
#endif |
|
113 | ||
114 |
// stuff depending on conditionals |
|
115 | ||
116 |
#define BYTES_PER_GROUP (GROUP_PARALLELISM/8) |
|
117 |
#define BYPG BYTES_PER_GROUP |
|
118 |
#define BITS_PER_GROUP GROUP_PARALLELISM |
|
119 |
#define BIPG BITS_PER_GROUP |
|
120 | ||
121 |
// platform specific |
|
122 | ||
123 |
#ifdef __arm__ |
|
124 |
#if !defined(MEMALIGN_VAL) || MEMALIGN_VAL<4 |
|
125 |
#undef MEMALIGN_VAL |
|
126 |
#define MEMALIGN_VAL 4 |
|
127 |
#endif |
|
128 |
#define COPY_UNALIGNED_PKT |
|
129 |
#endif |
|
130 | ||
131 |
// |
|
132 | ||
133 |
#ifndef MALLOC |
|
134 |
#define MALLOC(X) malloc(X) |
|
135 |
#endif |
|
136 |
#ifndef FREE |
|
137 |
#define FREE(X) free(X) |
|
138 |
#endif |
|
139 |
#ifdef MEMALIGN_VAL |
|
140 |
#define MEMALIGN __attribute__((aligned(MEMALIGN_VAL))) |
|
141 |
#else |
|
142 |
#define MEMALIGN |
|
143 |
#endif |
|
144 | ||
145 |
//// debug tool |
|
146 | ||
147 |
#ifdef DEBUG |
|
148 |
static void dump_mem(const char *string, const unsigned char *p, int len, int linelen){ |
|
149 |
int i; |
|
150 |
for(i=0;i<len;i++){ |
|
151 |
if(i%linelen==0&&i) fprintf(stderr,"\n"); |
|
152 |
if(i%linelen==0) fprintf(stderr,"%s %08x:",string,i); |
|
153 |
else{ |
|
154 |
if(i%8==0) fprintf(stderr," "); |
|
155 |
if(i%4==0) fprintf(stderr," "); |
|
156 |
} |
|
157 |
fprintf(stderr," %02x",p[i]); |
|
158 |
} |
|
159 |
if(i%linelen==0) fprintf(stderr,"\n"); |
|
160 |
} |
|
161 |
#endif |
|
162 | ||
163 |
////////////////////////////////////////////////////////////////////////////////// |
|
164 | ||
165 |
struct csa_key_t{ |
|
166 |
unsigned char ck[8]; |
|
167 |
// used by stream |
|
168 |
int iA[8]; // iA[0] is for A1, iA[7] is for A8 |
|
169 |
int iB[8]; // iB[0] is for B1, iB[7] is for B8 |
|
170 |
// used by stream (group) |
|
171 |
MEMALIGN group ck_g[8][8]; // [byte][bit:0=LSB,7=MSB] |
|
172 |
MEMALIGN group iA_g[8][4]; // [0 for A1][0 for LSB] |
|
173 |
MEMALIGN group iB_g[8][4]; // [0 for B1][0 for LSB] |
|
174 |
// used by block |
|
175 |
unsigned char kk[56]; |
|
176 |
// used by block (group) |
|
177 |
MEMALIGN batch kkmulti[56]; // many times the same byte in every batch |
|
178 |
}; |
|
179 | ||
180 |
struct csa_keys_t{ |
|
181 |
struct csa_key_t even; |
|
182 |
struct csa_key_t odd; |
|
183 |
}; |
|
184 | ||
185 |
//-----stream cypher |
|
186 | ||
187 |
//-----key schedule for stream decypher |
|
188 |
static void key_schedule_stream( |
|
189 |
unsigned char *ck, // [In] ck[0]-ck[7] 8 bytes | Key. |
|
190 |
int *iA, // [Out] iA[0]-iA[7] 8 nibbles | Key schedule. |
|
191 |
int *iB) // [Out] iB[0]-iB[7] 8 nibbles | Key schedule. |
|
192 |
{ |
|
193 |
iA[0]=(ck[0]>>4)&0xf; |
|
194 |
iA[1]=(ck[0] )&0xf; |
|
195 |
iA[2]=(ck[1]>>4)&0xf; |
|
196 |
iA[3]=(ck[1] )&0xf; |
|
197 |
iA[4]=(ck[2]>>4)&0xf; |
|
198 |
iA[5]=(ck[2] )&0xf; |
|
199 |
iA[6]=(ck[3]>>4)&0xf; |
|
200 |
iA[7]=(ck[3] )&0xf; |
|
201 |
iB[0]=(ck[4]>>4)&0xf; |
|
202 |
iB[1]=(ck[4] )&0xf; |
|
203 |
iB[2]=(ck[5]>>4)&0xf; |
|
204 |
iB[3]=(ck[5] )&0xf; |
|
205 |
iB[4]=(ck[6]>>4)&0xf; |
|
206 |
iB[5]=(ck[6] )&0xf; |
|
207 |
iB[6]=(ck[7]>>4)&0xf; |
|
208 |
iB[7]=(ck[7] )&0xf; |
|
209 |
} |
|
210 | ||
211 |
//----- stream main function |
|
212 | ||
213 |
#define STREAM_INIT |
|
214 |
#include "stream.c" |
|
215 |
#undef STREAM_INIT |
|
216 | ||
217 |
#define STREAM_NORMAL |
|
218 |
#include "stream.c" |
|
219 |
#undef STREAM_NORMAL |
|
220 | ||
221 | ||
222 |
//-----block decypher |
|
223 | ||
224 |
//-----key schedule for block decypher |
|
225 | ||
226 |
static void key_schedule_block( |
|
227 |
unsigned char *ck, // [In] ck[0]-ck[7] 8 bytes | Key. |
|
228 |
unsigned char *kk) // [Out] kk[0]-kk[55] 56 bytes | Key schedule. |
|
229 |
{ |
|
230 |
static const unsigned char key_perm[0x40] = { |
|
231 |
0x12,0x24,0x09,0x07,0x2A,0x31,0x1D,0x15, 0x1C,0x36,0x3E,0x32,0x13,0x21,0x3B,0x40, |
|
232 |
0x18,0x14,0x25,0x27,0x02,0x35,0x1B,0x01, 0x22,0x04,0x0D,0x0E,0x39,0x28,0x1A,0x29, |
|
233 |
0x33,0x23,0x34,0x0C,0x16,0x30,0x1E,0x3A, 0x2D,0x1F,0x08,0x19,0x17,0x2F,0x3D,0x11, |
|
234 |
0x3C,0x05,0x38,0x2B,0x0B,0x06,0x0A,0x2C, 0x20,0x3F,0x2E,0x0F,0x03,0x26,0x10,0x37, |
|
235 |
}; |
|
236 | ||
237 |
int i,j,k; |
|
238 |
int bit[64]; |
|
239 |
int newbit[64]; |
|
240 |
int kb[7][8]; |
|
241 | ||
242 |
// 56 steps |
|
243 |
// 56 key bytes kk(55)..kk(0) by key schedule from ck |
|
244 | ||
245 |
// kb(6,0) .. kb(6,7) = ck(0) .. ck(7) |
|
246 |
kb[6][0] = ck[0]; |
|
247 |
kb[6][1] = ck[1]; |
|
248 |
kb[6][2] = ck[2]; |
|
249 |
kb[6][3] = ck[3]; |
|
250 |
kb[6][4] = ck[4]; |
|
251 |
kb[6][5] = ck[5]; |
|
252 |
kb[6][6] = ck[6]; |
|
253 |
kb[6][7] = ck[7]; |
|
254 | ||
255 |
// calculate kb[5] .. kb[0] |
|
256 |
for(i=5; i>=0; i--){ |
|
257 |
// 64 bit perm on kb |
|
258 |
for(j=0; j<8; j++){ |
|
259 |
for(k=0; k<8; k++){ |
|
260 |
bit[j*8+k] = (kb[i+1][j] >> (7-k)) & 1; |
|
261 |
newbit[key_perm[j*8+k]-1] = bit[j*8+k]; |
|
262 |
} |
|
263 |
} |
|
264 |
for(j=0; j<8; j++){ |
|
265 |
kb[i][j] = 0; |
|
266 |
for(k=0; k<8; k++){ |
|
267 |
kb[i][j] |= newbit[j*8+k] << (7-k); |
|
268 |
} |
|
269 |
} |
|
270 |
} |
|
271 | ||
272 |
// xor to give kk |
|
273 |
for(i=0; i<7; i++){ |
|
274 |
for(j=0; j<8; j++){ |
|
275 |
kk[i*8+j] = kb[i][j] ^ i; |
|
276 |
} |
|
277 |
} |
|
278 | ||
279 |
} |
|
280 | ||
281 |
//-----block utils |
|
282 | ||
283 |
static inline __attribute__((always_inline)) void trasp_N_8 (unsigned char *in,unsigned char* out,int count){ |
|
284 |
int *ri=(int *)in; |
|
285 |
int *ibi=(int *)out; |
|
286 |
int j,i,k,g; |
|
287 |
// copy and first step |
|
288 |
for(g=0;g<count;g++){ |
|
289 |
ri[g]=ibi[2*g]; |
|
290 |
ri[GROUP_PARALLELISM+g]=ibi[2*g+1]; |
|
291 |
} |
|
292 |
//dump_mem("NE1 r[roff]",&r[roff],GROUP_PARALLELISM*8,GROUP_PARALLELISM); |
|
293 |
// now 01230123 |
|
294 |
#define INTS_PER_ROW (GROUP_PARALLELISM/8*2) |
|
295 |
for(j=0;j<8;j+=4){ |
|
296 |
for(i=0;i<2;i++){ |
|
297 |
for(k=0;k<INTS_PER_ROW;k++){ |
|
298 |
unsigned int t,b; |
|
299 |
t=ri[INTS_PER_ROW*(j+i)+k]; |
|
300 |
b=ri[INTS_PER_ROW*(j+i+2)+k]; |
|
301 |
ri[INTS_PER_ROW*(j+i)+k]= (t&0x0000ffff) | ((b )<<16); |
|
302 |
ri[INTS_PER_ROW*(j+i+2)+k]= ((t )>>16) | (b&0xffff0000) ; |
|
303 |
} |
|
304 |
} |
|
305 |
} |
|
306 |
//dump_mem("NE2 r[roff]",&r[roff],GROUP_PARALLELISM*8,GROUP_PARALLELISM); |
|
307 |
// now 01010101 |
|
308 |
for(j=0;j<8;j+=2){ |
|
309 |
for(i=0;i<1;i++){ |
|
310 |
for(k=0;k<INTS_PER_ROW;k++){ |
|
311 |
unsigned int t,b; |
|
312 |
t=ri[INTS_PER_ROW*(j+i)+k]; |
|
313 |
b=ri[INTS_PER_ROW*(j+i+1)+k]; |
|
314 |
ri[INTS_PER_ROW*(j+i)+k]= (t&0x00ff00ff) | ((b&0x00ff00ff)<<8); |
|
315 |
ri[INTS_PER_ROW*(j+i+1)+k]= ((t&0xff00ff00)>>8) | (b&0xff00ff00); |
|
316 |
} |
|
317 |
} |
|
318 |
} |
|
319 |
//dump_mem("NE3 r[roff]",&r[roff],GROUP_PARALLELISM*8,GROUP_PARALLELISM); |
|
320 |
// now 00000000 |
|
321 |
} |
|
322 | ||
323 |
static inline __attribute__((always_inline)) void trasp_8_N (unsigned char *in,unsigned char* out,int count){ |
|
324 |
int *ri=(int *)in; |
|
325 |
int *bdi=(int *)out; |
|
326 |
int j,i,k,g; |
|
327 |
#define INTS_PER_ROW (GROUP_PARALLELISM/8*2) |
|
328 |
//dump_mem("NE1 r[roff]",&r[roff],GROUP_PARALLELISM*8,GROUP_PARALLELISM); |
|
329 |
// now 00000000 |
|
330 |
for(j=0;j<8;j+=2){ |
|
331 |
for(i=0;i<1;i++){ |
|
332 |
for(k=0;k<INTS_PER_ROW;k++){ |
|
333 |
unsigned int t,b; |
|
334 |
t=ri[INTS_PER_ROW*(j+i)+k]; |
|
335 |
b=ri[INTS_PER_ROW*(j+i+1)+k]; |
|
336 |
ri[INTS_PER_ROW*(j+i)+k]= (t&0x00ff00ff) | ((b&0x00ff00ff)<<8); |
|
337 |
ri[INTS_PER_ROW*(j+i+1)+k]= ((t&0xff00ff00)>>8) | (b&0xff00ff00); |
|
338 |
} |
|
339 |
} |
|
340 |
} |
|
341 |
//dump_mem("NE2 r[roff]",&r[roff],GROUP_PARALLELISM*8,GROUP_PARALLELISM); |
|
342 |
// now 01010101 |
|
343 |
for(j=0;j<8;j+=4){ |
|
344 |
for(i=0;i<2;i++){ |
|
345 |
for(k=0;k<INTS_PER_ROW;k++){ |
|
346 |
unsigned int t,b; |
|
347 |
t=ri[INTS_PER_ROW*(j+i)+k]; |
|
348 |
b=ri[INTS_PER_ROW*(j+i+2)+k]; |
|
349 |
ri[INTS_PER_ROW*(j+i)+k]= (t&0x0000ffff) | ((b )<<16); |
|
350 |
ri[INTS_PER_ROW*(j+i+2)+k]= ((t )>>16) | (b&0xffff0000) ; |
|
351 |
} |
|
352 |
} |
|
353 |
} |
|
354 |
//dump_mem("NE3 r[roff]",&r[roff],GROUP_PARALLELISM*8,GROUP_PARALLELISM); |
|
355 |
// now 01230123 |
|
356 |
for(g=0;g<count;g++){ |
|
357 |
bdi[2*g]=ri[g]; |
|
358 |
bdi[2*g+1]=ri[GROUP_PARALLELISM+g]; |
|
359 |
} |
|
360 |
} |
|
361 | ||
362 |
//-----block main function |
|
363 | ||
364 |
// block group |
|
365 |
static void block_decypher_group( |
|
366 |
batch *kkmulti, // [In] kkmulti[0]-kkmulti[55] 56 batches | Key schedule (each batch has repeated equal bytes). |
|
367 |
unsigned char *ib, // [In] (ib0,ib1,...ib7)...x32 32*8 bytes | Initialization vector. |
|
368 |
unsigned char *bd, // [Out] (bd0,bd1,...bd7)...x32 32*8 bytes | Block decipher. |
|
369 |
int count) |
|
370 |
{ |
|
371 |
// int is faster than unsigned char. apparently not |
|
372 |
static const unsigned char block_sbox[0x100] = { |
|
373 |
0x3A,0xEA,0x68,0xFE,0x33,0xE9,0x88,0x1A, 0x83,0xCF,0xE1,0x7F,0xBA,0xE2,0x38,0x12, |
|
374 |
0xE8,0x27,0x61,0x95,0x0C,0x36,0xE5,0x70, 0xA2,0x06,0x82,0x7C,0x17,0xA3,0x26,0x49, |
|
375 |
0xBE,0x7A,0x6D,0x47,0xC1,0x51,0x8F,0xF3, 0xCC,0x5B,0x67,0xBD,0xCD,0x18,0x08,0xC9, |
|
376 |
0xFF,0x69,0xEF,0x03,0x4E,0x48,0x4A,0x84, 0x3F,0xB4,0x10,0x04,0xDC,0xF5,0x5C,0xC6, |
|
377 |
0x16,0xAB,0xAC,0x4C,0xF1,0x6A,0x2F,0x3C, 0x3B,0xD4,0xD5,0x94,0xD0,0xC4,0x63,0x62, |
|
378 |
0x71,0xA1,0xF9,0x4F,0x2E,0xAA,0xC5,0x56, 0xE3,0x39,0x93,0xCE,0x65,0x64,0xE4,0x58, |
|
379 |
0x6C,0x19,0x42,0x79,0xDD,0xEE,0x96,0xF6, 0x8A,0xEC,0x1E,0x85,0x53,0x45,0xDE,0xBB, |
|
380 |
0x7E,0x0A,0x9A,0x13,0x2A,0x9D,0xC2,0x5E, 0x5A,0x1F,0x32,0x35,0x9C,0xA8,0x73,0x30, |
|
381 | ||
382 |
0x29,0x3D,0xE7,0x92,0x87,0x1B,0x2B,0x4B, 0xA5,0x57,0x97,0x40,0x15,0xE6,0xBC,0x0E, |
|
383 |
0xEB,0xC3,0x34,0x2D,0xB8,0x44,0x25,0xA4, 0x1C,0xC7,0x23,0xED,0x90,0x6E,0x50,0x00, |
|
384 |
0x99,0x9E,0x4D,0xD9,0xDA,0x8D,0x6F,0x5F, 0x3E,0xD7,0x21,0x74,0x86,0xDF,0x6B,0x05, |
|
385 |
0x8E,0x5D,0x37,0x11,0xD2,0x28,0x75,0xD6, 0xA7,0x77,0x24,0xBF,0xF0,0xB0,0x02,0xB7, |
|
386 |
0xF8,0xFC,0x81,0x09,0xB1,0x01,0x76,0x91, 0x7D,0x0F,0xC8,0xA0,0xF2,0xCB,0x78,0x60, |
|
387 |
0xD1,0xF7,0xE0,0xB5,0x98,0x22,0xB3,0x20, 0x1D,0xA6,0xDB,0x7B,0x59,0x9F,0xAE,0x31, |
|
388 |
0xFB,0xD3,0xB6,0xCA,0x43,0x72,0x07,0xF4, 0xD8,0x41,0x14,0x55,0x0D,0x54,0x8B,0xB9, |
|
389 |
0xAD,0x46,0x0B,0xAF,0x80,0x52,0x2C,0xFA, 0x8C,0x89,0x66,0xFD,0xB2,0xA9,0x9B,0xC0, |
|
390 |
}; |
|
391 |
MEMALIGN unsigned char r[GROUP_PARALLELISM*(8+56)]; /* 56 because we will move back in memory while looping */ |
|
392 |
MEMALIGN unsigned char sbox_in[GROUP_PARALLELISM],sbox_out[GROUP_PARALLELISM],perm_out[GROUP_PARALLELISM]; |
|
393 |
int roff; |
|
394 |
int i,g,count_all=GROUP_PARALLELISM; |
|
395 | ||
396 |
roff=GROUP_PARALLELISM*56; |
|
397 | ||
398 |
#define FASTTRASP1 |
|
399 |
#ifndef FASTTRASP1 |
|
400 |
for(g=0;g<count;g++){ |
|
401 |
// Init registers |
|
402 |
int j; |
|
403 |
for(j=0;j<8;j++){ |
|
404 |
r[roff+GROUP_PARALLELISM*j+g]=ib[8*g+j]; |
|
405 |
} |
|
406 |
} |
|
407 |
#else |
|
408 |
trasp_N_8((unsigned char *)&r[roff],(unsigned char *)ib,count); |
|
409 |
#endif |
|
410 |
//dump_mem("OLD r[roff]",&r[roff],GROUP_PARALLELISM*8,GROUP_PARALLELISM); |
|
411 | ||
412 |
// loop over kk[55]..kk[0] |
|
413 |
for(i=55;i>=0;i--){ |
|
414 |
{ |
|
415 |
MEMALIGN batch tkkmulti=kkmulti[i]; |
|
416 |
batch *si=(batch *)sbox_in; |
|
417 |
batch *r6_N=(batch *)(r+roff+GROUP_PARALLELISM*6); |
|
418 |
for(g=0;g<count_all/BYTES_PER_BATCH;g++){ |
|
419 |
si[g]=B_FFXOR(tkkmulti,r6_N[g]); //FIXME: introduce FASTBATCH? |
|
420 |
} |
|
421 |
} |
|
422 | ||
423 |
// table lookup, this works on only one byte at a time |
|
424 |
// most difficult part of all |
|
425 |
// - can't be parallelized |
|
426 |
// - can't be synthetized through boolean terms (8 input bits are too many) |
|
427 |
for(g=0;g<count_all;g++){ |
|
428 |
sbox_out[g]=block_sbox[sbox_in[g]]; |
|
429 |
} |
|
430 | ||
431 |
// bit permutation |
|
432 |
{ |
|
433 |
unsigned char *po=(unsigned char *)perm_out; |
|
434 |
unsigned char *so=(unsigned char *)sbox_out; |
|
435 |
//dump_mem("pre perm ",(unsigned char *)so,GROUP_PARALLELISM,GROUP_PARALLELISM); |
|
436 |
for(g=0;g<count_all;g+=BYTES_PER_BATCH){ |
|
437 |
MEMALIGN batch in,out; |
|
438 |
in=*(batch *)&so[g]; |
|
439 | ||
440 |
out=B_FFOR( |
|
441 |
B_FFOR( |
|
442 |
B_FFOR( |
|
443 |
B_FFOR( |
|
444 |
B_FFOR( |
|
445 |
B_FFSH8L(B_FFAND(in,B_FFN_ALL_29()),1), |
|
446 |
B_FFSH8L(B_FFAND(in,B_FFN_ALL_02()),6)), |
|
447 |
B_FFSH8L(B_FFAND(in,B_FFN_ALL_04()),3)), |
|
448 |
B_FFSH8R(B_FFAND(in,B_FFN_ALL_10()),2)), |
|
449 |
B_FFSH8R(B_FFAND(in,B_FFN_ALL_40()),6)), |
|
450 |
B_FFSH8R(B_FFAND(in,B_FFN_ALL_80()),4)); |
|
451 | ||
452 |
*(batch *)&po[g]=out; |
|
453 |
} |
|
454 |
//dump_mem("post perm",(unsigned char *)po,GROUP_PARALLELISM,GROUP_PARALLELISM); |
|
455 |
} |
|
456 | ||
457 |
roff-=GROUP_PARALLELISM; /* virtual shift of registers */ |
|
458 | ||
459 |
#if 0 |
|
460 |
/* one by one */ |
|
461 |
for(g=0;g<count_all;g++){ |
|
462 |
r[roff+GROUP_PARALLELISM*0+g]=r[roff+GROUP_PARALLELISM*8+g]^sbox_out[g]; |
|
463 |
r[roff+GROUP_PARALLELISM*6+g]^=perm_out[g]; |
|
464 |
r[roff+GROUP_PARALLELISM*4+g]^=r[roff+GROUP_PARALLELISM*0+g]; |
|
465 |
r[roff+GROUP_PARALLELISM*3+g]^=r[roff+GROUP_PARALLELISM*0+g]; |
|
466 |
r[roff+GROUP_PARALLELISM*2+g]^=r[roff+GROUP_PARALLELISM*0+g]; |
|
467 |
} |
|
468 |
#else |
|
469 |
for(g=0;g<count_all;g+=BEST_SPAN){ |
|
470 |
XOR_BEST_BY(&r[roff+GROUP_PARALLELISM*0+g],&r[roff+GROUP_PARALLELISM*8+g],&sbox_out[g]); |
|
471 |
XOREQ_BEST_BY(&r[roff+GROUP_PARALLELISM*6+g],&perm_out[g]); |
|
472 |
XOREQ_BEST_BY(&r[roff+GROUP_PARALLELISM*4+g],&r[roff+GROUP_PARALLELISM*0+g]); |
|
473 |
XOREQ_BEST_BY(&r[roff+GROUP_PARALLELISM*3+g],&r[roff+GROUP_PARALLELISM*0+g]); |
|
474 |
XOREQ_BEST_BY(&r[roff+GROUP_PARALLELISM*2+g],&r[roff+GROUP_PARALLELISM*0+g]); |
|
475 |
} |
|
476 |
#endif |
|
477 |
} |
|
478 | ||
479 |
#define FASTTRASP2 |
|
480 |
#ifndef FASTTRASP2 |
|
481 |
for(g=0;g<count;g++){ |
|
482 |
// Copy results |
|
483 |
int j; |
|
484 |
for(j=0;j<8;j++){ |
|
485 |
bd[8*g+j]=r[roff+GROUP_PARALLELISM*j+g]; |
|
486 |
} |
|
487 |
} |
|
488 |
#else |
|
489 |
trasp_8_N((unsigned char *)&r[roff],(unsigned char *)bd,count); |
|
490 |
#endif |
|
491 |
} |
|
492 | ||
493 |
//-----------------------------------EXTERNAL INTERFACE |
|
494 | ||
495 |
//-----get internal parallelism |
|
496 | ||
497 |
int get_internal_parallelism(void){ |
|
498 |
return GROUP_PARALLELISM; |
|
499 |
} |
|
500 | ||
501 |
//-----get suggested cluster size |
|
502 | ||
503 |
int get_suggested_cluster_size(void){ |
|
504 |
int r; |
|
505 |
r=GROUP_PARALLELISM+GROUP_PARALLELISM/10; |
|
506 |
if(r<GROUP_PARALLELISM+5) r=GROUP_PARALLELISM+5; |
|
507 |
return r; |
|
508 |
} |
|
509 | ||
510 |
//-----key structure |
|
511 | ||
512 |
void *get_key_struct(void){ |
|
513 |
struct csa_keys_t *keys=(struct csa_keys_t *)MALLOC(sizeof(struct csa_keys_t)); |
|
514 |
if(keys) { |
|
515 |
static const unsigned char pk[8] = { 0,0,0,0,0,0,0,0 }; |
|
516 |
set_control_words(keys,pk,pk); |
|
517 |
} |
|
518 |
return keys; |
|
519 |
} |
|
520 | ||
521 |
void free_key_struct(void *keys){ |
|
522 |
return FREE(keys); |
|
523 |
} |
|
524 | ||
525 |
//-----set control words |
|
526 | ||
527 |
static void schedule_key(struct csa_key_t *key, const unsigned char *pk){ |
|
528 |
// could be made faster, but is not run often |
|
529 |
int bi,by; |
|
530 |
int i,j; |
|
531 |
// key |
|
532 |
memcpy(key->ck,pk,8); |
|
533 |
// precalculations for stream |
|
534 |
key_schedule_stream(key->ck,key->iA,key->iB); |
|
535 |
for(by=0;by<8;by++){ |
|
536 |
for(bi=0;bi<8;bi++){ |
|
537 |
key->ck_g[by][bi]=(key->ck[by]&(1<<bi))?FF1():FF0(); |
|
538 |
} |
|
539 |
} |
|
540 |
for(by=0;by<8;by++){ |
|
541 |
for(bi=0;bi<4;bi++){ |
|
542 |
key->iA_g[by][bi]=(key->iA[by]&(1<<bi))?FF1():FF0(); |
|
543 |
key->iB_g[by][bi]=(key->iB[by]&(1<<bi))?FF1():FF0(); |
|
544 |
} |
|
545 |
} |
|
546 |
// precalculations for block |
|
547 |
key_schedule_block(key->ck,key->kk); |
|
548 |
for(i=0;i<56;i++){ |
|
549 |
for(j=0;j<BYTES_PER_BATCH;j++){ |
|
550 |
*(((unsigned char *)&key->kkmulti[i])+j)=key->kk[i]; |
|
551 |
} |
|
552 |
} |
|
553 |
} |
|
554 | ||
555 |
void set_control_words(void *keys, const unsigned char *ev, const unsigned char *od){ |
|
556 |
schedule_key(&((struct csa_keys_t *)keys)->even,ev); |
|
557 |
schedule_key(&((struct csa_keys_t *)keys)->odd,od); |
|
558 |
} |
|
559 | ||
560 |
void set_even_control_word(void *keys, const unsigned char *pk){ |
|
561 |
schedule_key(&((struct csa_keys_t *)keys)->even,pk); |
|
562 |
} |
|
563 | ||
564 |
void set_odd_control_word(void *keys, const unsigned char *pk){ |
|
565 |
schedule_key(&((struct csa_keys_t *)keys)->odd,pk); |
|
566 |
} |
|
567 | ||
568 |
//-----get control words |
|
569 | ||
570 |
void get_control_words(void *keys, unsigned char *even, unsigned char *odd){ |
|
571 |
memcpy(even,&((struct csa_keys_t *)keys)->even.ck,8); |
|
572 |
memcpy(odd,&((struct csa_keys_t *)keys)->odd.ck,8); |
|
573 |
} |
|
574 | ||
575 |
//----- decrypt |
|
576 | ||
577 |
int decrypt_packets(void *keys, unsigned char **cluster){ |
|
578 |
// statistics, currently unused |
|
579 |
int stat_no_scramble=0; |
|
580 |
int stat_reserved=0; |
|
581 |
int stat_decrypted[2]={0,0}; |
|
582 |
int stat_decrypted_mini=0; |
|
583 |
unsigned char **clst; |
|
584 |
unsigned char **clst2; |
|
585 |
int grouped; |
|
586 |
int group_ev_od; |
|
587 |
int advanced; |
|
588 |
int can_advance; |
|
589 |
unsigned char *g_pkt[GROUP_PARALLELISM]; |
|
590 |
int g_len[GROUP_PARALLELISM]; |
|
591 |
int g_offset[GROUP_PARALLELISM]; |
|
592 |
int g_n[GROUP_PARALLELISM]; |
|
593 |
int g_residue[GROUP_PARALLELISM]; |
|
594 |
unsigned char *pkt; |
|
595 |
int xc0,ev_od,len,offset,n,residue; |
|
596 |
struct csa_key_t* k; |
|
597 |
int i,j,iter,g; |
|
598 |
int t23,tsmall; |
|
599 |
int alive[24]; |
|
600 |
//icc craziness int pad1=0; //////////align! FIXME |
|
601 |
unsigned char *encp[GROUP_PARALLELISM]; |
|
602 |
MEMALIGN unsigned char stream_in[GROUP_PARALLELISM*8]; |
|
603 |
MEMALIGN unsigned char stream_out[GROUP_PARALLELISM*8]; |
|
604 |
MEMALIGN unsigned char ib[GROUP_PARALLELISM*8]; |
|
605 |
MEMALIGN unsigned char block_out[GROUP_PARALLELISM*8]; |
|
606 |
#ifdef COPY_UNALIGNED_PKT |
|
607 |
unsigned char *unaligned[GROUP_PARALLELISM]; |
|
608 |
MEMALIGN unsigned char alignedBuff[GROUP_PARALLELISM][188]; |
|
609 |
#endif |
|
610 |
struct stream_regs regs; |
|
611 | ||
612 |
//icc craziness i=(int)&pad1;//////////align!!! FIXME |
|
613 | ||
614 |
// build a list of packets to be processed |
|
615 |
clst=cluster; |
|
616 |
grouped=0; |
|
617 |
advanced=0; |
|
618 |
can_advance=1; |
|
619 |
group_ev_od=-1; // silence incorrect compiler warning |
|
620 |
pkt=*clst; |
|
621 |
do{ // find a new packet |
|
622 |
if(grouped==GROUP_PARALLELISM){ |
|
623 |
// full |
|
624 |
break; |
|
625 |
} |
|
626 |
if(pkt==NULL){ |
|
627 |
// no more ranges |
|
628 |
break; |
|
629 |
} |
|
630 |
if(pkt>=*(clst+1)){ |
|
631 |
// out of this range, try next |
|
632 |
clst++;clst++; |
|
633 |
pkt=*clst; |
|
634 |
continue; |
|
635 |
} |
|
636 | ||
637 |
do{ // handle this packet |
|
638 |
xc0=pkt[3]&0xc0; |
|
639 |
DBG(fprintf(stderr," exam pkt=%p, xc0=%02x, can_adv=%i\n",pkt,xc0,can_advance)); |
|
640 |
if(xc0==0x00){ |
|
641 |
DBG(fprintf(stderr,"skip clear pkt %p (can_advance is %i)\n",pkt,can_advance)); |
|
642 |
advanced+=can_advance; |
|
643 |
stat_no_scramble++; |
|
644 |
break; |
|
645 |
} |
|
646 |
if(xc0==0x40){ |
|
647 |
DBG(fprintf(stderr,"skip reserved pkt %p (can_advance is %i)\n",pkt,can_advance)); |
|
648 |
advanced+=can_advance; |
|
649 |
stat_reserved++; |
|
650 |
break; |
|
651 |
} |
|
652 |
if(xc0==0x80||xc0==0xc0){ // encrypted |
|
653 |
ev_od=(xc0&0x40)>>6; // 0 even, 1 odd |
|
654 |
if(grouped==0) group_ev_od=ev_od; // this group will be all even (or odd) |
|
655 |
if(group_ev_od==ev_od){ // could be added to group |
|
656 |
pkt[3]&=0x3f; // consider it decrypted now |
|
657 |
if(pkt[3]&0x20){ // incomplete packet |
|
658 |
offset=4+pkt[4]+1; |
|
659 |
len=188-offset; |
|
660 |
n=len>>3; |
|
661 |
residue=len-(n<<3); |
|
662 |
if(n==0){ // decrypted==encrypted! |
|
663 |
DBG(fprintf(stderr,"DECRYPTED MINI! (can_advance is %i)\n",can_advance)); |
|
664 |
advanced+=can_advance; |
|
665 |
stat_decrypted_mini++; |
|
666 |
break; // this doesn't need more processing |
|
667 |
} |
|
668 |
}else{ |
|
669 |
len=184; |
|
670 |
offset=4; |
|
671 |
n=23; |
|
672 |
residue=0; |
|
673 |
} |
|
674 |
g_pkt[grouped]=pkt; |
|
675 |
g_len[grouped]=len; |
|
676 |
g_offset[grouped]=offset; |
|
677 |
g_n[grouped]=n; |
|
678 |
g_residue[grouped]=residue; |
|
679 |
DBG(fprintf(stderr,"%2i: eo=%i pkt=%p len=%03i n=%2i residue=%i\n",grouped,ev_od,pkt,len,n,residue)); |
|
680 |
grouped++; |
|
681 |
advanced+=can_advance; |
|
682 |
stat_decrypted[ev_od]++; |
|
683 |
} |
|
684 |
else{ |
|
685 |
can_advance=0; |
|
686 |
DBG(fprintf(stderr,"skip pkt %p and can_advance set to 0\n",pkt)); |
|
687 |
break; // skip and go on |
|
688 |
} |
|
689 |
} |
|
690 |
} while(0); |
|
691 | ||
692 |
if(can_advance){ |
|
693 |
// move range start forward |
|
694 |
*clst+=188; |
|
695 |
} |
|
696 |
// next packet, if there is one |
|
697 |
pkt+=188; |
|
698 |
} while(1); |
|
699 |
DBG(fprintf(stderr,"-- result: grouped %i pkts, advanced %i pkts\n",grouped,advanced)); |
|
700 | ||
701 |
// delete empty ranges and compact list |
|
702 |
clst2=cluster; |
|
703 |
for(clst=cluster;*clst!=NULL;clst+=2){ |
|
704 |
// if not empty |
|
705 |
if(*clst<*(clst+1)){ |
|
706 |
// it will remain |
|
707 |
*clst2=*clst; |
|
708 |
*(clst2+1)=*(clst+1); |
|
709 |
clst2+=2; |
|
710 |
} |
|
711 |
} |
|
712 |
*clst2=NULL; |
|
713 | ||
714 |
if(grouped==0){ |
|
715 |
// no processing needed |
|
716 |
return advanced; |
|
717 |
} |
|
718 | ||
719 |
// sort them, longest payload first |
|
720 |
// we expect many n=23 packets and a few n<23 |
|
721 |
DBG(fprintf(stderr,"PRESORTING\n")); |
|
722 |
for(i=0;i<grouped;i++){ |
|
723 |
DBG(fprintf(stderr,"%2i of %2i: pkt=%p len=%03i n=%2i residue=%i\n",i,grouped,g_pkt[i],g_len[i],g_n[i],g_residue[i])); |
|
724 |
} |
|
725 |
// grouped is always <= GROUP_PARALLELISM |
|
726 | ||
727 |
#define g_swap(a,b) \ |
|
728 |
pkt=g_pkt[a]; \ |
|
729 |
g_pkt[a]=g_pkt[b]; \ |
|
730 |
g_pkt[b]=pkt; \ |
|
731 |
\ |
|
732 |
len=g_len[a]; \ |
|
733 |
g_len[a]=g_len[b]; \ |
|
734 |
g_len[b]=len; \ |
|
735 |
\ |
|
736 |
offset=g_offset[a]; \ |
|
737 |
g_offset[a]=g_offset[b]; \ |
|
738 |
g_offset[b]=offset; \ |
|
739 |
\ |
|
740 |
n=g_n[a]; \ |
|
741 |
g_n[a]=g_n[b]; \ |
|
742 |
g_n[b]=n; \ |
|
743 |
\ |
|
744 |
residue=g_residue[a]; \ |
|
745 |
g_residue[a]=g_residue[b]; \ |
|
746 |
g_residue[b]=residue; |
|
747 | ||
748 |
// step 1: move n=23 packets before small packets |
|
749 |
t23=0; |
|
750 |
tsmall=grouped-1; |
|
751 |
for(;;){ |
|
752 |
for(;t23<grouped;t23++){ |
|
753 |
if(g_n[t23]!=23) break; |
|
754 |
} |
|
755 |
DBG(fprintf(stderr,"t23 after for =%i\n",t23)); |
|
756 |
|
|
757 |
for(;tsmall>=0;tsmall--){ |
|
758 |
if(g_n[tsmall]==23) break; |
|
759 |
} |
|
760 |
DBG(fprintf(stderr,"tsmall after for =%i\n",tsmall)); |
|
761 |
|
|
762 |
if(tsmall-t23<1) break; |
|
763 |
|
|
764 |
DBG(fprintf(stderr,"swap t23=%i,tsmall=%i\n",t23,tsmall)); |
|
765 | ||
766 |
g_swap(t23,tsmall); |
|
767 | ||
768 |
t23++; |
|
769 |
tsmall--; |
|
770 |
DBG(fprintf(stderr,"new t23=%i,tsmall=%i\n\n",t23,tsmall)); |
|
771 |
} |
|
772 |
DBG(fprintf(stderr,"packets with n=23, t23=%i grouped=%i\n",t23,grouped)); |
|
773 |
DBG(fprintf(stderr,"MIDSORTING\n")); |
|
774 |
for(i=0;i<grouped;i++){ |
|
775 |
DBG(fprintf(stderr,"%2i of %2i: pkt=%p len=%03i n=%2i residue=%i\n",i,grouped,g_pkt[i],g_len[i],g_n[i],g_residue[i])); |
|
776 |
} |
|
777 | ||
778 |
// step 2: sort small packets in decreasing order of n (bubble sort is enough) |
|
779 |
for(i=t23;i<grouped;i++){ |
|
780 |
for(j=i+1;j<grouped;j++){ |
|
781 |
if(g_n[j]>g_n[i]){ |
|
782 |
g_swap(i,j); |
|
783 |
} |
|
784 |
} |
|
785 |
} |
|
786 |
DBG(fprintf(stderr,"POSTSORTING\n")); |
|
787 |
for(i=0;i<grouped;i++){ |
|
788 |
DBG(fprintf(stderr,"%2i of %2i: pkt=%p len=%03i n=%2i residue=%i\n",i,grouped,g_pkt[i],g_len[i],g_n[i],g_residue[i])); |
|
789 |
} |
|
790 | ||
791 |
// we need to know how many packets need 23 iterations, how many 22... |
|
792 |
for(i=0;i<=23;i++){ |
|
793 |
alive[i]=0; |
|
794 |
} |
|
795 |
// count |
|
796 |
alive[23-1]=t23; |
|
797 |
for(i=t23;i<grouped;i++){ |
|
798 |
alive[g_n[i]-1]++; |
|
799 |
} |
|
800 |
// integrate |
|
801 |
for(i=22;i>=0;i--){ |
|
802 |
alive[i]+=alive[i+1]; |
|
803 |
} |
|
804 |
DBG(fprintf(stderr,"ALIVE\n")); |
|
805 |
for(i=0;i<=23;i++){ |
|
806 |
DBG(fprintf(stderr,"alive%2i=%i\n",i,alive[i])); |
|
807 |
} |
|
808 | ||
809 |
// choose key |
|
810 |
if(group_ev_od==0){ |
|
811 |
k=&((struct csa_keys_t *)keys)->even; |
|
812 |
} |
|
813 |
else{ |
|
814 |
k=&((struct csa_keys_t *)keys)->odd; |
|
815 |
} |
|
816 | ||
817 |
//INIT |
|
818 |
//#define INITIALIZE_UNUSED_INPUT |
|
819 |
#ifdef INITIALIZE_UNUSED_INPUT |
|
820 |
// unnecessary zeroing. |
|
821 |
// without this, we operate on uninitialized memory |
|
822 |
// when grouped<GROUP_PARALLELISM, but it's not a problem, |
|
823 |
// as final results will be discarded. |
|
824 |
// random data makes debugging sessions difficult. |
|
825 |
for(j=0;j<GROUP_PARALLELISM*8;j++) stream_in[j]=0; |
|
826 |
DBG(fprintf(stderr,"--- WARNING: you could gain speed by not initializing unused memory ---\n")); |
|
827 |
#else |
|
828 |
DBG(fprintf(stderr,"--- WARNING: DEBUGGING IS MORE DIFFICULT WHEN PROCESSING RANDOM DATA CHANGING AT EVERY RUN! ---\n")); |
|
829 |
#endif |
|
830 | ||
831 |
for(g=0;g<grouped;g++){ |
|
832 |
encp[g]=g_pkt[g]; |
|
833 |
DBG(fprintf(stderr,"header[%i]=%p (%02x)\n",g,encp[g],*(encp[g]))); |
|
834 |
encp[g]+=g_offset[g]; // skip header |
|
835 |
#ifdef COPY_UNALIGNED_PKT |
|
836 |
if(((int)encp[g])&0x03) { |
|
837 |
memcpy(alignedBuff[g],encp[g],g_len[g]); |
|
838 |
unaligned[g]=encp[g]; |