Reconstruction of des.exe/undes.exe
This commit is contained in:
@@ -32,3 +32,6 @@
|
|||||||
*.out
|
*.out
|
||||||
*.app
|
*.app
|
||||||
|
|
||||||
|
build/
|
||||||
|
*.bak
|
||||||
|
.qtcreator
|
||||||
|
|||||||
+102
@@ -0,0 +1,102 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
|
project(des_undes VERSION 1.1.0 LANGUAGES C)
|
||||||
|
|
||||||
|
set(CMAKE_C_STANDARD 99)
|
||||||
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||||
|
set(CMAKE_C_EXTENSIONS ON)
|
||||||
|
|
||||||
|
set(CRYPTLIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/cryptlib-0.99")
|
||||||
|
|
||||||
|
# CRYPTLIB 0.99 registers all algorithms in crypt.c at startup, so all of the
|
||||||
|
# original algorithm backends must be linked even though DES/UNDES itself uses
|
||||||
|
# only CRYPT_ALGO_3DES + CRYPT_MODE_CBC.
|
||||||
|
add_library(cryptlib099 STATIC
|
||||||
|
${CRYPTLIB_DIR}/crypt.c
|
||||||
|
${CRYPTLIB_DIR}/lib_3des.c
|
||||||
|
${CRYPTLIB_DIR}/lib_des.c
|
||||||
|
${CRYPTLIB_DIR}/lib_idea.c
|
||||||
|
${CRYPTLIB_DIR}/lib_mdc.c
|
||||||
|
${CRYPTLIB_DIR}/lib_null.c
|
||||||
|
${CRYPTLIB_DIR}/lib_rc4.c
|
||||||
|
${CRYPTLIB_DIR}/lib_safr.c
|
||||||
|
${CRYPTLIB_DIR}/idea/idea.c
|
||||||
|
${CRYPTLIB_DIR}/libdes/3ecb_enc.c
|
||||||
|
${CRYPTLIB_DIR}/libdes/ecb_enc.c
|
||||||
|
${CRYPTLIB_DIR}/libdes/pcbc_enc.c
|
||||||
|
${CRYPTLIB_DIR}/libdes/set_key.c
|
||||||
|
${CRYPTLIB_DIR}/rc4/rc4.c
|
||||||
|
${CRYPTLIB_DIR}/safer/safer.c
|
||||||
|
${CRYPTLIB_DIR}/mdc/shs.c
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(cryptlib099 PUBLIC
|
||||||
|
${CRYPTLIB_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# The original makefile used __UNIX__ for Unix builds.
|
||||||
|
if(UNIX)
|
||||||
|
target_compile_definitions(cryptlib099 PRIVATE __UNIX__)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(des_common STATIC des_common.c)
|
||||||
|
target_include_directories(des_common PUBLIC
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
${CRYPTLIB_DIR}
|
||||||
|
)
|
||||||
|
target_link_libraries(des_common PUBLIC cryptlib099)
|
||||||
|
|
||||||
|
add_executable(des des.c)
|
||||||
|
add_executable(undes undes.c)
|
||||||
|
|
||||||
|
target_link_libraries(des PRIVATE des_common)
|
||||||
|
target_link_libraries(undes PRIVATE des_common)
|
||||||
|
|
||||||
|
# des.c and undes.c deliberately retain the original DOS-style <io.h>, read()
|
||||||
|
# and fileno() calls. POSIX systems have these declarations in <unistd.h>, so
|
||||||
|
# provide a tiny generated compatibility header without changing the recovered
|
||||||
|
# source files.
|
||||||
|
if(UNIX)
|
||||||
|
set(COMPAT_DIR "${CMAKE_CURRENT_BINARY_DIR}/compat")
|
||||||
|
file(MAKE_DIRECTORY "${COMPAT_DIR}")
|
||||||
|
file(WRITE "${COMPAT_DIR}/io.h" "#ifndef DES_COMPAT_IO_H\n#define DES_COMPAT_IO_H\n#include <unistd.h>\n#endif\n")
|
||||||
|
target_include_directories(des PRIVATE "${COMPAT_DIR}")
|
||||||
|
target_include_directories(undes PRIVATE "${COMPAT_DIR}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Modern Microsoft C uses underscored names for these POSIX-compatible calls.
|
||||||
|
#if(MSVC)
|
||||||
|
# target_compile_definitions(des PRIVATE
|
||||||
|
# _CRT_SECURE_NO_WARNINGS
|
||||||
|
# fileno=_fileno
|
||||||
|
# read=_read
|
||||||
|
# )
|
||||||
|
# target_compile_definitions(undes PRIVATE
|
||||||
|
# _CRT_SECURE_NO_WARNINGS
|
||||||
|
# fileno=_fileno
|
||||||
|
# read=_read
|
||||||
|
# )
|
||||||
|
# target_compile_definitions(cryptlib099 PRIVATE __WINDOWS__ _CRT_SECURE_NO_WARNINGS)
|
||||||
|
#endif()
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
target_compile_definitions(cryptlib099 PRIVATE
|
||||||
|
_CRT_SECURE_NO_WARNINGS
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(des PRIVATE
|
||||||
|
_CRT_SECURE_NO_WARNINGS
|
||||||
|
fileno=_fileno
|
||||||
|
read=_read
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(undes PRIVATE
|
||||||
|
_CRT_SECURE_NO_WARNINGS
|
||||||
|
fileno=_fileno
|
||||||
|
read=_read
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
install(TARGETS des undes RUNTIME DESTINATION bin)
|
||||||
@@ -0,0 +1,815 @@
|
|||||||
|
|
||||||
|
/mnt/data/des.img: file format binary
|
||||||
|
|
||||||
|
|
||||||
|
Disassembly of section .data:
|
||||||
|
|
||||||
|
000004b0 <.data+0x4b0>:
|
||||||
|
4b0: c2 33 d2 ret 0xd233
|
||||||
|
4b3: d3 e8 shr ax,cl
|
||||||
|
4b5: cb retf
|
||||||
|
4b6: 55 push bp
|
||||||
|
4b7: 8b ec mov bp,sp
|
||||||
|
4b9: 81 ec 3c 05 sub sp,0x53c
|
||||||
|
4bd: 56 push si
|
||||||
|
4be: 57 push di
|
||||||
|
4bf: 1e push ds
|
||||||
|
4c0: b8 46 0d mov ax,0xd46
|
||||||
|
4c3: 8e d8 mov ds,ax
|
||||||
|
4c5: 83 7e 06 02 cmp WORD PTR [bp+0x6],0x2
|
||||||
|
4c9: 74 03 je 0x4ce
|
||||||
|
4cb: e9 a0 00 jmp 0x56e
|
||||||
|
4ce: 1e push ds
|
||||||
|
4cf: b8 0c 00 mov ax,0xc
|
||||||
|
4d2: 50 push ax
|
||||||
|
4d3: c4 5e 08 les bx,DWORD PTR [bp+0x8]
|
||||||
|
4d6: 26 ff 77 06 push WORD PTR es:[bx+0x6]
|
||||||
|
4da: 26 ff 77 04 push WORD PTR es:[bx+0x4]
|
||||||
|
4de: 9a 0f 00 b7 0b call 0xbb7:0xf
|
||||||
|
4e3: 83 c4 08 add sp,0x8
|
||||||
|
4e6: 0b c0 or ax,ax
|
||||||
|
4e8: 75 43 jne 0x52d
|
||||||
|
4ea: b8 5f 0d mov ax,0xd5f
|
||||||
|
4ed: 8e c0 mov es,ax
|
||||||
|
4ef: 26 ff 36 04 00 push WORD PTR es:0x4
|
||||||
|
4f4: 26 ff 36 02 00 push WORD PTR es:0x2
|
||||||
|
4f9: 1e push ds
|
||||||
|
4fa: b8 18 00 mov ax,0x18
|
||||||
|
4fd: 50 push ax
|
||||||
|
4fe: 9a 06 00 d7 0b call 0xbd7:0x6
|
||||||
|
503: 83 c4 08 add sp,0x8
|
||||||
|
506: b8 5f 0d mov ax,0xd5f
|
||||||
|
509: 8e c0 mov es,ax
|
||||||
|
50b: 26 ff 36 0c 00 push WORD PTR es:0xc
|
||||||
|
510: 26 ff 36 0a 00 push WORD PTR es:0xa
|
||||||
|
515: 1e push ds
|
||||||
|
516: b8 1d 00 mov ax,0x1d
|
||||||
|
519: 50 push ax
|
||||||
|
51a: 9a 06 00 d7 0b call 0xbd7:0x6
|
||||||
|
51f: 83 c4 08 add sp,0x8
|
||||||
|
522: 6a 00 push 0x0
|
||||||
|
524: 9a 0b 00 55 0a call 0xa55:0xb
|
||||||
|
529: 44 inc sp
|
||||||
|
52a: 44 inc sp
|
||||||
|
52b: eb 41 jmp 0x56e
|
||||||
|
52d: 1e push ds
|
||||||
|
52e: b8 20 00 mov ax,0x20
|
||||||
|
531: 50 push ax
|
||||||
|
532: c4 5e 08 les bx,DWORD PTR [bp+0x8]
|
||||||
|
535: 26 ff 77 06 push WORD PTR es:[bx+0x6]
|
||||||
|
539: 26 ff 77 04 push WORD PTR es:[bx+0x4]
|
||||||
|
53d: 9a 0f 00 b7 0b call 0xbb7:0xf
|
||||||
|
542: 83 c4 08 add sp,0x8
|
||||||
|
545: 0b c0 or ax,ax
|
||||||
|
547: 75 25 jne 0x56e
|
||||||
|
549: b8 5f 0d mov ax,0xd5f
|
||||||
|
54c: 8e c0 mov es,ax
|
||||||
|
54e: 26 ff 36 04 00 push WORD PTR es:0x4
|
||||||
|
553: 26 ff 36 02 00 push WORD PTR es:0x2
|
||||||
|
558: 1e push ds
|
||||||
|
559: b8 2a 00 mov ax,0x2a
|
||||||
|
55c: 50 push ax
|
||||||
|
55d: 9a 06 00 d7 0b call 0xbd7:0x6
|
||||||
|
562: 83 c4 08 add sp,0x8
|
||||||
|
565: 6a 00 push 0x0
|
||||||
|
567: 9a 0b 00 55 0a call 0xa55:0xb
|
||||||
|
56c: 44 inc sp
|
||||||
|
56d: 44 inc sp
|
||||||
|
56e: 83 7e 06 04 cmp WORD PTR [bp+0x6],0x4
|
||||||
|
572: 74 3e je 0x5b2
|
||||||
|
574: 1e push ds
|
||||||
|
575: b8 90 00 mov ax,0x90
|
||||||
|
578: 50 push ax
|
||||||
|
579: 1e push ds
|
||||||
|
57a: b8 7b 00 mov ax,0x7b
|
||||||
|
57d: 50 push ax
|
||||||
|
57e: 1e push ds
|
||||||
|
57f: b8 64 00 mov ax,0x64
|
||||||
|
582: 50 push ax
|
||||||
|
583: 1e push ds
|
||||||
|
584: b8 3b 00 mov ax,0x3b
|
||||||
|
587: 50 push ax
|
||||||
|
588: 1e push ds
|
||||||
|
589: b8 2e 00 mov ax,0x2e
|
||||||
|
58c: 50 push ax
|
||||||
|
58d: b8 e0 11 mov ax,0x11e0
|
||||||
|
590: 50 push ax
|
||||||
|
591: b8 2a 00 mov ax,0x2a
|
||||||
|
594: 50 push ax
|
||||||
|
595: 9a 08 00 9b 0c call 0xc9b:0x8
|
||||||
|
59a: 83 c4 18 add sp,0x18
|
||||||
|
59d: 83 7e 06 01 cmp WORD PTR [bp+0x6],0x1
|
||||||
|
5a1: 75 04 jne 0x5a7
|
||||||
|
5a3: 33 c0 xor ax,ax
|
||||||
|
5a5: eb 03 jmp 0x5aa
|
||||||
|
5a7: b8 02 00 mov ax,0x2
|
||||||
|
5aa: 50 push ax
|
||||||
|
5ab: 9a 0b 00 55 0a call 0xa55:0xb
|
||||||
|
5b0: 44 inc sp
|
||||||
|
5b1: 44 inc sp
|
||||||
|
5b2: c4 5e 08 les bx,DWORD PTR [bp+0x8]
|
||||||
|
5b5: 26 c4 5f 04 les bx,DWORD PTR es:[bx+0x4]
|
||||||
|
5b9: 8c 46 f6 mov WORD PTR [bp-0xa],es
|
||||||
|
5bc: 89 5e f4 mov WORD PTR [bp-0xc],bx
|
||||||
|
5bf: c4 5e 08 les bx,DWORD PTR [bp+0x8]
|
||||||
|
5c2: 26 c4 5f 08 les bx,DWORD PTR es:[bx+0x8]
|
||||||
|
5c6: 8c 46 ee mov WORD PTR [bp-0x12],es
|
||||||
|
5c9: 89 5e ec mov WORD PTR [bp-0x14],bx
|
||||||
|
5cc: c4 5e 08 les bx,DWORD PTR [bp+0x8]
|
||||||
|
5cf: 26 c4 5f 0c les bx,DWORD PTR es:[bx+0xc]
|
||||||
|
5d3: 8c 46 f2 mov WORD PTR [bp-0xe],es
|
||||||
|
5d6: 89 5e f0 mov WORD PTR [bp-0x10],bx
|
||||||
|
5d9: 1e push ds
|
||||||
|
5da: b8 b5 00 mov ax,0xb5
|
||||||
|
5dd: 50 push ax
|
||||||
|
5de: ff 76 ee push WORD PTR [bp-0x12]
|
||||||
|
5e1: ff 76 ec push WORD PTR [bp-0x14]
|
||||||
|
5e4: 9a 0f 00 b7 0b call 0xbb7:0xf
|
||||||
|
5e9: 83 c4 08 add sp,0x8
|
||||||
|
5ec: 0b c0 or ax,ax
|
||||||
|
5ee: 74 3b je 0x62b
|
||||||
|
5f0: ff 76 f2 push WORD PTR [bp-0xe]
|
||||||
|
5f3: ff 76 f0 push WORD PTR [bp-0x10]
|
||||||
|
5f6: ff 76 ee push WORD PTR [bp-0x12]
|
||||||
|
5f9: ff 76 ec push WORD PTR [bp-0x14]
|
||||||
|
5fc: 9a 0f 00 b7 0b call 0xbb7:0xf
|
||||||
|
601: 83 c4 08 add sp,0x8
|
||||||
|
604: 0b c0 or ax,ax
|
||||||
|
606: 75 23 jne 0x62b
|
||||||
|
608: 1e push ds
|
||||||
|
609: b8 bb 00 mov ax,0xbb
|
||||||
|
60c: 50 push ax
|
||||||
|
60d: 1e push ds
|
||||||
|
60e: b8 b7 00 mov ax,0xb7
|
||||||
|
611: 50 push ax
|
||||||
|
612: b8 e0 11 mov ax,0x11e0
|
||||||
|
615: 50 push ax
|
||||||
|
616: b8 2a 00 mov ax,0x2a
|
||||||
|
619: 50 push ax
|
||||||
|
61a: 9a 08 00 9b 0c call 0xc9b:0x8
|
||||||
|
61f: 83 c4 0c add sp,0xc
|
||||||
|
622: 6a 01 push 0x1
|
||||||
|
624: 9a 0b 00 55 0a call 0xa55:0xb
|
||||||
|
629: 44 inc sp
|
||||||
|
62a: 44 inc sp
|
||||||
|
62b: 1e push ds
|
||||||
|
62c: b8 e7 00 mov ax,0xe7
|
||||||
|
62f: 50 push ax
|
||||||
|
630: ff 76 ee push WORD PTR [bp-0x12]
|
||||||
|
633: ff 76 ec push WORD PTR [bp-0x14]
|
||||||
|
636: 9a 0f 00 b7 0b call 0xbb7:0xf
|
||||||
|
63b: 83 c4 08 add sp,0x8
|
||||||
|
63e: 0b c0 or ax,ax
|
||||||
|
640: 75 0c jne 0x64e
|
||||||
|
642: c7 46 fa e0 11 mov WORD PTR [bp-0x6],0x11e0
|
||||||
|
647: c7 46 f8 02 00 mov WORD PTR [bp-0x8],0x2
|
||||||
|
64c: eb 19 jmp 0x667
|
||||||
|
64e: 1e push ds
|
||||||
|
64f: b8 e9 00 mov ax,0xe9
|
||||||
|
652: 50 push ax
|
||||||
|
653: ff 76 ee push WORD PTR [bp-0x12]
|
||||||
|
656: ff 76 ec push WORD PTR [bp-0x14]
|
||||||
|
659: 9a 45 02 b0 0a call 0xab0:0x245
|
||||||
|
65e: 83 c4 08 add sp,0x8
|
||||||
|
661: 89 56 fa mov WORD PTR [bp-0x6],dx
|
||||||
|
664: 89 46 f8 mov WORD PTR [bp-0x8],ax
|
||||||
|
667: 1e push ds
|
||||||
|
668: b8 ec 00 mov ax,0xec
|
||||||
|
66b: 50 push ax
|
||||||
|
66c: ff 76 f2 push WORD PTR [bp-0xe]
|
||||||
|
66f: ff 76 f0 push WORD PTR [bp-0x10]
|
||||||
|
672: 9a 0f 00 b7 0b call 0xbb7:0xf
|
||||||
|
677: 83 c4 08 add sp,0x8
|
||||||
|
67a: 0b c0 or ax,ax
|
||||||
|
67c: 75 0c jne 0x68a
|
||||||
|
67e: c7 46 fe e0 11 mov WORD PTR [bp-0x2],0x11e0
|
||||||
|
683: c7 46 fc 16 00 mov WORD PTR [bp-0x4],0x16
|
||||||
|
688: eb 19 jmp 0x6a3
|
||||||
|
68a: 1e push ds
|
||||||
|
68b: b8 ee 00 mov ax,0xee
|
||||||
|
68e: 50 push ax
|
||||||
|
68f: ff 76 f2 push WORD PTR [bp-0xe]
|
||||||
|
692: ff 76 f0 push WORD PTR [bp-0x10]
|
||||||
|
695: 9a 45 02 b0 0a call 0xab0:0x245
|
||||||
|
69a: 83 c4 08 add sp,0x8
|
||||||
|
69d: 89 56 fe mov WORD PTR [bp-0x2],dx
|
||||||
|
6a0: 89 46 fc mov WORD PTR [bp-0x4],ax
|
||||||
|
6a3: ff 76 ee push WORD PTR [bp-0x12]
|
||||||
|
6a6: ff 76 ec push WORD PTR [bp-0x14]
|
||||||
|
6a9: ff 76 fa push WORD PTR [bp-0x6]
|
||||||
|
6ac: ff 76 f8 push WORD PTR [bp-0x8]
|
||||||
|
6af: 9a 8c 00 a0 00 call 0xa0:0x8c
|
||||||
|
6b4: 83 c4 08 add sp,0x8
|
||||||
|
6b7: ff 76 f2 push WORD PTR [bp-0xe]
|
||||||
|
6ba: ff 76 f0 push WORD PTR [bp-0x10]
|
||||||
|
6bd: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
6c0: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
6c3: 9a 8c 00 a0 00 call 0xa0:0x8c
|
||||||
|
6c8: 83 c4 08 add sp,0x8
|
||||||
|
6cb: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
6ce: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
6d1: 6a 01 push 0x1
|
||||||
|
6d3: 6a 04 push 0x4
|
||||||
|
6d5: b8 5f 0d mov ax,0xd5f
|
||||||
|
6d8: 50 push ax
|
||||||
|
6d9: b8 06 00 mov ax,0x6
|
||||||
|
6dc: 50 push ax
|
||||||
|
6dd: 9a 0a 00 60 0b call 0xb60:0xa
|
||||||
|
6e2: 83 c4 0c add sp,0xc
|
||||||
|
6e5: c7 86 ba fe 03 00 mov WORD PTR [bp-0x146],0x3
|
||||||
|
6eb: c7 86 bc fe 03 00 mov WORD PTR [bp-0x144],0x3
|
||||||
|
6f1: 68 00 40 push 0x4000
|
||||||
|
6f4: 9a 0e 00 5d 0a call 0xa5d:0xe
|
||||||
|
6f9: 44 inc sp
|
||||||
|
6fa: 44 inc sp
|
||||||
|
6fb: 89 56 e2 mov WORD PTR [bp-0x1e],dx
|
||||||
|
6fe: 89 46 e0 mov WORD PTR [bp-0x20],ax
|
||||||
|
701: 89 56 ea mov WORD PTR [bp-0x16],dx
|
||||||
|
704: 89 46 e8 mov WORD PTR [bp-0x18],ax
|
||||||
|
707: 8b 46 e0 mov ax,WORD PTR [bp-0x20]
|
||||||
|
70a: 0b 46 e2 or ax,WORD PTR [bp-0x1e]
|
||||||
|
70d: 75 1e jne 0x72d
|
||||||
|
70f: 1e push ds
|
||||||
|
710: b8 f1 00 mov ax,0xf1
|
||||||
|
713: 50 push ax
|
||||||
|
714: b8 e0 11 mov ax,0x11e0
|
||||||
|
717: 50 push ax
|
||||||
|
718: b8 2a 00 mov ax,0x2a
|
||||||
|
71b: 50 push ax
|
||||||
|
71c: 9a 08 00 9b 0c call 0xc9b:0x8
|
||||||
|
721: 83 c4 08 add sp,0x8
|
||||||
|
724: 6a 01 push 0x1
|
||||||
|
726: 9a 0b 00 55 0a call 0xa55:0xb
|
||||||
|
72b: 44 inc sp
|
||||||
|
72c: 44 inc sp
|
||||||
|
72d: c4 5e e0 les bx,DWORD PTR [bp-0x20]
|
||||||
|
730: 83 c3 08 add bx,0x8
|
||||||
|
733: 8c 46 e6 mov WORD PTR [bp-0x1a],es
|
||||||
|
736: 89 5e e4 mov WORD PTR [bp-0x1c],bx
|
||||||
|
739: 9a 38 07 b3 00 call 0xb3:0x738
|
||||||
|
73e: 16 push ss
|
||||||
|
73f: 8d 86 be fe lea ax,[bp-0x142]
|
||||||
|
743: 50 push ax
|
||||||
|
744: ff b6 bc fe push WORD PTR [bp-0x144]
|
||||||
|
748: ff b6 ba fe push WORD PTR [bp-0x146]
|
||||||
|
74c: 9a 66 05 b3 00 call 0xb3:0x566
|
||||||
|
751: 83 c4 08 add sp,0x8
|
||||||
|
754: 8b 86 ca fe mov ax,WORD PTR [bp-0x136]
|
||||||
|
758: 89 46 d6 mov WORD PTR [bp-0x2a],ax
|
||||||
|
75b: 8b 86 d0 fe mov ax,WORD PTR [bp-0x130]
|
||||||
|
75f: 89 46 d8 mov WORD PTR [bp-0x28],ax
|
||||||
|
762: 33 ff xor di,di
|
||||||
|
764: eb 0b jmp 0x771
|
||||||
|
766: c4 5e f4 les bx,DWORD PTR [bp-0xc]
|
||||||
|
769: 26 8a 01 mov al,BYTE PTR es:[bx+di]
|
||||||
|
76c: 88 83 d6 fe mov BYTE PTR [bp+di-0x12a],al
|
||||||
|
770: 47 inc di
|
||||||
|
771: 3b 7e d6 cmp di,WORD PTR [bp-0x2a]
|
||||||
|
774: 7d 09 jge 0x77f
|
||||||
|
776: c4 5e f4 les bx,DWORD PTR [bp-0xc]
|
||||||
|
779: 26 80 39 00 cmp BYTE PTR es:[bx+di],0x0
|
||||||
|
77d: 75 e7 jne 0x766
|
||||||
|
77f: eb 06 jmp 0x787
|
||||||
|
781: c6 83 d6 fe 00 mov BYTE PTR [bp+di-0x12a],0x0
|
||||||
|
786: 47 inc di
|
||||||
|
787: 3b 7e d6 cmp di,WORD PTR [bp-0x2a]
|
||||||
|
78a: 7c f5 jl 0x781
|
||||||
|
78c: ff b6 bc fe push WORD PTR [bp-0x144]
|
||||||
|
790: ff b6 ba fe push WORD PTR [bp-0x146]
|
||||||
|
794: 16 push ss
|
||||||
|
795: 8d 86 1e fc lea ax,[bp-0x3e2]
|
||||||
|
799: 50 push ax
|
||||||
|
79a: 9a 56 07 b3 00 call 0xb3:0x756
|
||||||
|
79f: 83 c4 08 add sp,0x8
|
||||||
|
7a2: ff 76 d6 push WORD PTR [bp-0x2a]
|
||||||
|
7a5: 16 push ss
|
||||||
|
7a6: 8d 86 d6 fe lea ax,[bp-0x12a]
|
||||||
|
7aa: 50 push ax
|
||||||
|
7ab: 16 push ss
|
||||||
|
7ac: 8d 86 1e fc lea ax,[bp-0x3e2]
|
||||||
|
7b0: 50 push ax
|
||||||
|
7b1: 9a c5 09 b3 00 call 0xb3:0x9c5
|
||||||
|
7b6: 83 c4 0a add sp,0xa
|
||||||
|
7b9: c7 46 dc 01 00 mov WORD PTR [bp-0x24],0x1
|
||||||
|
7be: c4 5e f8 les bx,DWORD PTR [bp-0x8]
|
||||||
|
7c1: 26 8a 47 04 mov al,BYTE PTR es:[bx+0x4]
|
||||||
|
7c5: 98 cbw
|
||||||
|
7c6: 89 46 de mov WORD PTR [bp-0x22],ax
|
||||||
|
7c9: 68 f8 3f push 0x3ff8
|
||||||
|
7cc: ff 76 e6 push WORD PTR [bp-0x1a]
|
||||||
|
7cf: ff 76 e4 push WORD PTR [bp-0x1c]
|
||||||
|
7d2: ff 76 de push WORD PTR [bp-0x22]
|
||||||
|
7d5: 9a 05 00 50 0b call 0xb50:0x5
|
||||||
|
7da: 83 c4 08 add sp,0x8
|
||||||
|
7dd: 89 46 da mov WORD PTR [bp-0x26],ax
|
||||||
|
7e0: ff 76 da push WORD PTR [bp-0x26]
|
||||||
|
7e3: 9a 0d 00 a0 00 call 0xa0:0xd
|
||||||
|
7e8: 44 inc sp
|
||||||
|
7e9: 44 inc sp
|
||||||
|
7ea: e9 93 01 jmp 0x980
|
||||||
|
7ed: 81 7e da f8 3f cmp WORD PTR [bp-0x26],0x3ff8
|
||||||
|
7f2: 75 4f jne 0x843
|
||||||
|
7f4: c4 5e e8 les bx,DWORD PTR [bp-0x18]
|
||||||
|
7f7: 26 8b 47 08 mov ax,WORD PTR es:[bx+0x8]
|
||||||
|
7fb: 99 cwd
|
||||||
|
7fc: 33 c2 xor ax,dx
|
||||||
|
7fe: 2b c2 sub ax,dx
|
||||||
|
800: f7 d8 neg ax
|
||||||
|
802: 99 cwd
|
||||||
|
803: c4 5e e8 les bx,DWORD PTR [bp-0x18]
|
||||||
|
806: 26 89 57 02 mov WORD PTR es:[bx+0x2],dx
|
||||||
|
80a: 26 89 07 mov WORD PTR es:[bx],ax
|
||||||
|
80d: c4 5e e8 les bx,DWORD PTR [bp-0x18]
|
||||||
|
810: 26 8b 07 mov ax,WORD PTR es:[bx]
|
||||||
|
813: 26 0b 47 02 or ax,WORD PTR es:[bx+0x2]
|
||||||
|
817: 75 0e jne 0x827
|
||||||
|
819: c4 5e e8 les bx,DWORD PTR [bp-0x18]
|
||||||
|
81c: 26 c7 47 02 ff ff mov WORD PTR es:[bx+0x2],0xffff
|
||||||
|
822: 26 c7 07 ff ff mov WORD PTR es:[bx],0xffff
|
||||||
|
827: c4 5e e8 les bx,DWORD PTR [bp-0x18]
|
||||||
|
82a: 26 8b 47 0c mov ax,WORD PTR es:[bx+0xc]
|
||||||
|
82e: 99 cwd
|
||||||
|
82f: 33 c2 xor ax,dx
|
||||||
|
831: 2b c2 sub ax,dx
|
||||||
|
833: f7 d8 neg ax
|
||||||
|
835: 99 cwd
|
||||||
|
836: c4 5e e8 les bx,DWORD PTR [bp-0x18]
|
||||||
|
839: 26 89 57 06 mov WORD PTR es:[bx+0x6],dx
|
||||||
|
83d: 26 89 47 04 mov WORD PTR es:[bx+0x4],ax
|
||||||
|
841: eb 28 jmp 0x86b
|
||||||
|
843: 8b 46 da mov ax,WORD PTR [bp-0x26]
|
||||||
|
846: 99 cwd
|
||||||
|
847: c4 5e e8 les bx,DWORD PTR [bp-0x18]
|
||||||
|
84a: 26 89 57 02 mov WORD PTR es:[bx+0x2],dx
|
||||||
|
84e: 26 89 07 mov WORD PTR es:[bx],ax
|
||||||
|
851: c4 5e e8 les bx,DWORD PTR [bp-0x18]
|
||||||
|
854: 26 8b 47 08 mov ax,WORD PTR es:[bx+0x8]
|
||||||
|
858: 99 cwd
|
||||||
|
859: 33 c2 xor ax,dx
|
||||||
|
85b: 2b c2 sub ax,dx
|
||||||
|
85d: f7 d8 neg ax
|
||||||
|
85f: 99 cwd
|
||||||
|
860: c4 5e e8 les bx,DWORD PTR [bp-0x18]
|
||||||
|
863: 26 89 57 06 mov WORD PTR es:[bx+0x6],dx
|
||||||
|
867: 26 89 47 04 mov WORD PTR es:[bx+0x4],ax
|
||||||
|
86b: 68 00 40 push 0x4000
|
||||||
|
86e: ff 76 e2 push WORD PTR [bp-0x1e]
|
||||||
|
871: ff 76 e0 push WORD PTR [bp-0x20]
|
||||||
|
874: 16 push ss
|
||||||
|
875: 8d 86 1e fc lea ax,[bp-0x3e2]
|
||||||
|
879: 50 push ax
|
||||||
|
87a: 9a 1e 0c b3 00 call 0xb3:0xc1e
|
||||||
|
87f: 83 c4 0a add sp,0xa
|
||||||
|
882: 83 7e dc 00 cmp WORD PTR [bp-0x24],0x0
|
||||||
|
886: 75 03 jne 0x88b
|
||||||
|
888: e9 ad 00 jmp 0x938
|
||||||
|
88b: 16 push ss
|
||||||
|
88c: 8d 86 c4 fa lea ax,[bp-0x53c]
|
||||||
|
890: 50 push ax
|
||||||
|
891: 16 push ss
|
||||||
|
892: 8d 86 1e fc lea ax,[bp-0x3e2]
|
||||||
|
896: 50 push ax
|
||||||
|
897: 9a ec 06 b3 00 call 0xb3:0x6ec
|
||||||
|
89c: 83 c4 08 add sp,0x8
|
||||||
|
89f: 8b 86 d6 fa mov ax,WORD PTR [bp-0x52a]
|
||||||
|
8a3: 89 86 1c fb mov WORD PTR [bp-0x4e4],ax
|
||||||
|
8a7: 16 push ss
|
||||||
|
8a8: 8d 86 dc fa lea ax,[bp-0x524]
|
||||||
|
8ac: 50 push ax
|
||||||
|
8ad: 16 push ss
|
||||||
|
8ae: 8d 86 1e fc lea ax,[bp-0x3e2]
|
||||||
|
8b2: 50 push ax
|
||||||
|
8b3: 9a a9 0b b3 00 call 0xb3:0xba9
|
||||||
|
8b8: 83 c4 08 add sp,0x8
|
||||||
|
8bb: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
8be: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
8c1: 6a 01 push 0x1
|
||||||
|
8c3: ff b6 1c fb push WORD PTR [bp-0x4e4]
|
||||||
|
8c7: 16 push ss
|
||||||
|
8c8: 8d 86 dc fa lea ax,[bp-0x524]
|
||||||
|
8cc: 50 push ax
|
||||||
|
8cd: 9a 0a 00 60 0b call 0xb60:0xa
|
||||||
|
8d2: 83 c4 0c add sp,0xc
|
||||||
|
8d5: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
8d8: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
8db: 9a 4a 00 a0 00 call 0xa0:0x4a
|
||||||
|
8e0: 83 c4 04 add sp,0x4
|
||||||
|
8e3: 33 f6 xor si,si
|
||||||
|
8e5: eb 09 jmp 0x8f0
|
||||||
|
8e7: 8a 82 d6 fe mov al,BYTE PTR [bp+si-0x12a]
|
||||||
|
8eb: 88 82 1e fb mov BYTE PTR [bp+si-0x4e2],al
|
||||||
|
8ef: 46 inc si
|
||||||
|
8f0: 3b 76 d6 cmp si,WORD PTR [bp-0x2a]
|
||||||
|
8f3: 7c f2 jl 0x8e7
|
||||||
|
8f5: 68 00 01 push 0x100
|
||||||
|
8f8: 16 push ss
|
||||||
|
8f9: 8d 86 1e fb lea ax,[bp-0x4e2]
|
||||||
|
8fd: 50 push ax
|
||||||
|
8fe: 16 push ss
|
||||||
|
8ff: 8d 86 1e fc lea ax,[bp-0x3e2]
|
||||||
|
903: 50 push ax
|
||||||
|
904: 9a 1e 0c b3 00 call 0xb3:0xc1e
|
||||||
|
909: 83 c4 0a add sp,0xa
|
||||||
|
90c: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
90f: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
912: 6a 01 push 0x1
|
||||||
|
914: 68 00 01 push 0x100
|
||||||
|
917: 16 push ss
|
||||||
|
918: 8d 86 1e fb lea ax,[bp-0x4e2]
|
||||||
|
91c: 50 push ax
|
||||||
|
91d: 9a 0a 00 60 0b call 0xb60:0xa
|
||||||
|
922: 83 c4 0c add sp,0xc
|
||||||
|
925: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
928: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
92b: 9a 4a 00 a0 00 call 0xa0:0x4a
|
||||||
|
930: 83 c4 04 add sp,0x4
|
||||||
|
933: c7 46 dc 00 00 mov WORD PTR [bp-0x24],0x0
|
||||||
|
938: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
93b: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
93e: 6a 01 push 0x1
|
||||||
|
940: 68 00 40 push 0x4000
|
||||||
|
943: ff 76 e2 push WORD PTR [bp-0x1e]
|
||||||
|
946: ff 76 e0 push WORD PTR [bp-0x20]
|
||||||
|
949: 9a 0a 00 60 0b call 0xb60:0xa
|
||||||
|
94e: 83 c4 0c add sp,0xc
|
||||||
|
951: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
954: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
957: 9a 4a 00 a0 00 call 0xa0:0x4a
|
||||||
|
95c: 83 c4 04 add sp,0x4
|
||||||
|
95f: 68 f8 3f push 0x3ff8
|
||||||
|
962: ff 76 e6 push WORD PTR [bp-0x1a]
|
||||||
|
965: ff 76 e4 push WORD PTR [bp-0x1c]
|
||||||
|
968: ff 76 de push WORD PTR [bp-0x22]
|
||||||
|
96b: 9a 05 00 50 0b call 0xb50:0x5
|
||||||
|
970: 83 c4 08 add sp,0x8
|
||||||
|
973: 89 46 da mov WORD PTR [bp-0x26],ax
|
||||||
|
976: ff 76 da push WORD PTR [bp-0x26]
|
||||||
|
979: 9a 0d 00 a0 00 call 0xa0:0xd
|
||||||
|
97e: 44 inc sp
|
||||||
|
97f: 44 inc sp
|
||||||
|
980: 83 7e da 00 cmp WORD PTR [bp-0x26],0x0
|
||||||
|
984: 74 03 je 0x989
|
||||||
|
986: e9 64 fe jmp 0x7ed
|
||||||
|
989: 6a 00 push 0x0
|
||||||
|
98b: ff 76 e2 push WORD PTR [bp-0x1e]
|
||||||
|
98e: ff 76 e0 push WORD PTR [bp-0x20]
|
||||||
|
991: 16 push ss
|
||||||
|
992: 8d 86 1e fc lea ax,[bp-0x3e2]
|
||||||
|
996: 50 push ax
|
||||||
|
997: 9a 1e 0c b3 00 call 0xb3:0xc1e
|
||||||
|
99c: 83 c4 0a add sp,0xa
|
||||||
|
99f: 16 push ss
|
||||||
|
9a0: 8d 86 1e fc lea ax,[bp-0x3e2]
|
||||||
|
9a4: 50 push ax
|
||||||
|
9a5: 9a 40 09 b3 00 call 0xb3:0x940
|
||||||
|
9aa: 83 c4 04 add sp,0x4
|
||||||
|
9ad: 9a 46 07 b3 00 call 0xb3:0x746
|
||||||
|
9b2: ff 76 e2 push WORD PTR [bp-0x1e]
|
||||||
|
9b5: ff 76 e0 push WORD PTR [bp-0x20]
|
||||||
|
9b8: 9a 04 00 5e 0c call 0xc5e:0x4
|
||||||
|
9bd: 83 c4 04 add sp,0x4
|
||||||
|
9c0: 8b 56 fa mov dx,WORD PTR [bp-0x6]
|
||||||
|
9c3: 8b 46 f8 mov ax,WORD PTR [bp-0x8]
|
||||||
|
9c6: bb 02 00 mov bx,0x2
|
||||||
|
9c9: b9 e0 11 mov cx,0x11e0
|
||||||
|
9cc: 3b d1 cmp dx,cx
|
||||||
|
9ce: 75 04 jne 0x9d4
|
||||||
|
9d0: 3b c3 cmp ax,bx
|
||||||
|
9d2: 74 0e je 0x9e2
|
||||||
|
9d4: ff 76 fa push WORD PTR [bp-0x6]
|
||||||
|
9d7: ff 76 f8 push WORD PTR [bp-0x8]
|
||||||
|
9da: 9a 09 00 33 0b call 0xb33:0x9
|
||||||
|
9df: 83 c4 04 add sp,0x4
|
||||||
|
9e2: 8b 56 fe mov dx,WORD PTR [bp-0x2]
|
||||||
|
9e5: 8b 46 fc mov ax,WORD PTR [bp-0x4]
|
||||||
|
9e8: bb 16 00 mov bx,0x16
|
||||||
|
9eb: b9 e0 11 mov cx,0x11e0
|
||||||
|
9ee: 3b d1 cmp dx,cx
|
||||||
|
9f0: 75 04 jne 0x9f6
|
||||||
|
9f2: 3b c3 cmp ax,bx
|
||||||
|
9f4: 74 0e je 0xa04
|
||||||
|
9f6: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
9f9: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
9fc: 9a 09 00 33 0b call 0xb33:0x9
|
||||||
|
a01: 83 c4 04 add sp,0x4
|
||||||
|
a04: 33 c0 xor ax,ax
|
||||||
|
a06: eb 00 jmp 0xa08
|
||||||
|
a08: 1f pop ds
|
||||||
|
a09: 5f pop di
|
||||||
|
a0a: 5e pop si
|
||||||
|
a0b: c9 leave
|
||||||
|
a0c: cb retf
|
||||||
|
a0d: 55 push bp
|
||||||
|
a0e: 8b ec mov bp,sp
|
||||||
|
a10: 1e push ds
|
||||||
|
a11: b8 56 0d mov ax,0xd56
|
||||||
|
a14: 8e d8 mov ds,ax
|
||||||
|
a16: 83 7e 06 ff cmp WORD PTR [bp+0x6],0xffff
|
||||||
|
a1a: 75 2b jne 0xa47
|
||||||
|
a1c: 1e push ds
|
||||||
|
a1d: b8 0a 00 mov ax,0xa
|
||||||
|
a20: 50 push ax
|
||||||
|
a21: b8 e0 11 mov ax,0x11e0
|
||||||
|
a24: 50 push ax
|
||||||
|
a25: b8 2a 00 mov ax,0x2a
|
||||||
|
a28: 50 push ax
|
||||||
|
a29: 9a 08 00 9b 0c call 0xc9b:0x8
|
||||||
|
a2e: 83 c4 08 add sp,0x8
|
||||||
|
a31: 1e push ds
|
||||||
|
a32: b8 31 00 mov ax,0x31
|
||||||
|
a35: 50 push ax
|
||||||
|
a36: 9a 0d 00 b6 0c call 0xcb6:0xd
|
||||||
|
a3b: 83 c4 04 add sp,0x4
|
||||||
|
a3e: 6a 03 push 0x3
|
||||||
|
a40: 9a 0b 00 55 0a call 0xa55:0xb
|
||||||
|
a45: 44 inc sp
|
||||||
|
a46: 44 inc sp
|
||||||
|
a47: 1f pop ds
|
||||||
|
a48: 5d pop bp
|
||||||
|
a49: cb retf
|
||||||
|
a4a: 55 push bp
|
||||||
|
a4b: 8b ec mov bp,sp
|
||||||
|
a4d: 1e push ds
|
||||||
|
a4e: b8 56 0d mov ax,0xd56
|
||||||
|
a51: 8e d8 mov ds,ax
|
||||||
|
a53: c4 5e 06 les bx,DWORD PTR [bp+0x6]
|
||||||
|
a56: 26 f7 47 02 10 00 test WORD PTR es:[bx+0x2],0x10
|
||||||
|
a5c: 74 2b je 0xa89
|
||||||
|
a5e: 1e push ds
|
||||||
|
a5f: b8 3a 00 mov ax,0x3a
|
||||||
|
a62: 50 push ax
|
||||||
|
a63: b8 e0 11 mov ax,0x11e0
|
||||||
|
a66: 50 push ax
|
||||||
|
a67: b8 2a 00 mov ax,0x2a
|
||||||
|
a6a: 50 push ax
|
||||||
|
a6b: 9a 08 00 9b 0c call 0xc9b:0x8
|
||||||
|
a70: 83 c4 08 add sp,0x8
|
||||||
|
a73: 1e push ds
|
||||||
|
a74: b8 62 00 mov ax,0x62
|
||||||
|
a77: 50 push ax
|
||||||
|
a78: 9a 0d 00 b6 0c call 0xcb6:0xd
|
||||||
|
a7d: 83 c4 04 add sp,0x4
|
||||||
|
a80: 6a 03 push 0x3
|
||||||
|
a82: 9a 0b 00 55 0a call 0xa55:0xb
|
||||||
|
a87: 44 inc sp
|
||||||
|
a88: 44 inc sp
|
||||||
|
a89: 1f pop ds
|
||||||
|
a8a: 5d pop bp
|
||||||
|
a8b: cb retf
|
||||||
|
a8c: 55 push bp
|
||||||
|
a8d: 8b ec mov bp,sp
|
||||||
|
a8f: 1e push ds
|
||||||
|
a90: b8 56 0d mov ax,0xd56
|
||||||
|
a93: 8e d8 mov ds,ax
|
||||||
|
a95: 8b 46 06 mov ax,WORD PTR [bp+0x6]
|
||||||
|
a98: 0b 46 08 or ax,WORD PTR [bp+0x8]
|
||||||
|
a9b: 75 31 jne 0xace
|
||||||
|
a9d: ff 76 0c push WORD PTR [bp+0xc]
|
||||||
|
aa0: ff 76 0a push WORD PTR [bp+0xa]
|
||||||
|
aa3: 1e push ds
|
||||||
|
aa4: b8 6b 00 mov ax,0x6b
|
||||||
|
aa7: 50 push ax
|
||||||
|
aa8: b8 e0 11 mov ax,0x11e0
|
||||||
|
aab: 50 push ax
|
||||||
|
aac: b8 2a 00 mov ax,0x2a
|
||||||
|
aaf: 50 push ax
|
||||||
|
ab0: 9a 08 00 9b 0c call 0xc9b:0x8
|
||||||
|
ab5: 83 c4 0c add sp,0xc
|
||||||
|
ab8: 1e push ds
|
||||||
|
ab9: b8 88 00 mov ax,0x88
|
||||||
|
abc: 50 push ax
|
||||||
|
abd: 9a 0d 00 b6 0c call 0xcb6:0xd
|
||||||
|
ac2: 83 c4 04 add sp,0x4
|
||||||
|
ac5: 6a 03 push 0x3
|
||||||
|
ac7: 9a 0b 00 55 0a call 0xa55:0xb
|
||||||
|
acc: 44 inc sp
|
||||||
|
acd: 44 inc sp
|
||||||
|
ace: 1f pop ds
|
||||||
|
acf: 5d pop bp
|
||||||
|
ad0: cb retf
|
||||||
|
ad1: 55 push bp
|
||||||
|
ad2: 8b ec mov bp,sp
|
||||||
|
ad4: 56 push si
|
||||||
|
ad5: 1e push ds
|
||||||
|
ad6: b8 5f 0d mov ax,0xd5f
|
||||||
|
ad9: 8e d8 mov ds,ax
|
||||||
|
adb: 33 f6 xor si,si
|
||||||
|
add: eb 01 jmp 0xae0
|
||||||
|
adf: 46 inc si
|
||||||
|
ae0: 8b de mov bx,si
|
||||||
|
ae2: c1 e3 02 shl bx,0x2
|
||||||
|
ae5: 8b 97 10 00 mov dx,WORD PTR [bx+0x10]
|
||||||
|
ae9: 8b 87 0e 00 mov ax,WORD PTR [bx+0xe]
|
||||||
|
aed: 3b 56 08 cmp dx,WORD PTR [bp+0x8]
|
||||||
|
af0: 75 05 jne 0xaf7
|
||||||
|
af2: 3b 46 06 cmp ax,WORD PTR [bp+0x6]
|
||||||
|
af5: 74 13 je 0xb0a
|
||||||
|
af7: 8b de mov bx,si
|
||||||
|
af9: c1 e3 02 shl bx,0x2
|
||||||
|
afc: 83 bf 10 00 ff cmp WORD PTR [bx+0x10],0xffff
|
||||||
|
b01: 75 dc jne 0xadf
|
||||||
|
b03: 83 bf 0e 00 ff cmp WORD PTR [bx+0xe],0xffff
|
||||||
|
b08: 75 d5 jne 0xadf
|
||||||
|
b0a: 8b de mov bx,si
|
||||||
|
b0c: c1 e3 02 shl bx,0x2
|
||||||
|
b0f: 83 bf 10 00 ff cmp WORD PTR [bx+0x10],0xffff
|
||||||
|
b14: 75 25 jne 0xb3b
|
||||||
|
b16: 83 bf 0e 00 ff cmp WORD PTR [bx+0xe],0xffff
|
||||||
|
b1b: 75 1e jne 0xb3b
|
||||||
|
b1d: 1e push ds
|
||||||
|
b1e: b8 5c 05 mov ax,0x55c
|
||||||
|
b21: 50 push ax
|
||||||
|
b22: b8 e0 11 mov ax,0x11e0
|
||||||
|
b25: 50 push ax
|
||||||
|
b26: b8 2a 00 mov ax,0x2a
|
||||||
|
b29: 50 push ax
|
||||||
|
b2a: 9a 08 00 9b 0c call 0xc9b:0x8
|
||||||
|
b2f: 83 c4 08 add sp,0x8
|
||||||
|
b32: 6a 01 push 0x1
|
||||||
|
b34: 9a 0b 00 55 0a call 0xa55:0xb
|
||||||
|
b39: 44 inc sp
|
||||||
|
b3a: 44 inc sp
|
||||||
|
b3b: 1f pop ds
|
||||||
|
b3c: 5e pop si
|
||||||
|
b3d: 5d pop bp
|
||||||
|
b3e: cb retf
|
||||||
|
b3f: 55 push bp
|
||||||
|
b40: 8b ec mov bp,sp
|
||||||
|
b42: 81 ec 9e 02 sub sp,0x29e
|
||||||
|
b46: 1e push ds
|
||||||
|
b47: b8 b8 0d mov ax,0xdb8
|
||||||
|
b4a: 8e d8 mov ds,ax
|
||||||
|
b4c: 83 3e 08 00 00 cmp WORD PTR ds:0x8,0x0
|
||||||
|
b51: 75 24 jne 0xb77
|
||||||
|
b53: 6a 40 push 0x40
|
||||||
|
b55: 6a 00 push 0x0
|
||||||
|
b57: 1e push ds
|
||||||
|
b58: b8 0a 00 mov ax,0xa
|
||||||
|
b5b: 50 push ax
|
||||||
|
b5c: 9a 38 00 c0 0b call 0xbc0:0x38
|
||||||
|
b61: 83 c4 08 add sp,0x8
|
||||||
|
b64: 1e push ds
|
||||||
|
b65: b8 0a 00 mov ax,0xa
|
||||||
|
b68: 50 push ax
|
||||||
|
b69: 9a 4e 00 c1 0c call 0xcc1:0x4e
|
||||||
|
b6e: 83 c4 04 add sp,0x4
|
||||||
|
b71: c7 06 08 00 01 00 mov WORD PTR ds:0x8,0x1
|
||||||
|
b77: c7 46 fe 02 00 mov WORD PTR [bp-0x2],0x2
|
||||||
|
b7c: 16 push ss
|
||||||
|
b7d: 8d 46 fe lea ax,[bp-0x2]
|
||||||
|
b80: 50 push ax
|
||||||
|
b81: 6a 04 push 0x4
|
||||||
|
b83: 6a 01 push 0x1
|
||||||
|
b85: 16 push ss
|
||||||
|
b86: 8d 86 62 fd lea ax,[bp-0x29e]
|
||||||
|
b8a: 50 push ax
|
||||||
|
b8b: 9a 41 08 b3 00 call 0xb3:0x841
|
||||||
|
b90: 83 c4 0c add sp,0xc
|
||||||
|
b93: 6a 40 push 0x40
|
||||||
|
b95: 1e push ds
|
||||||
|
b96: b8 0a 00 mov ax,0xa
|
||||||
|
b99: 50 push ax
|
||||||
|
b9a: 16 push ss
|
||||||
|
b9b: 8d 86 62 fd lea ax,[bp-0x29e]
|
||||||
|
b9f: 50 push ax
|
||||||
|
ba0: 9a c5 09 b3 00 call 0xb3:0x9c5
|
||||||
|
ba5: 83 c4 0a add sp,0xa
|
||||||
|
ba8: c7 46 ac 01 00 mov WORD PTR [bp-0x54],0x1
|
||||||
|
bad: 6a 40 push 0x40
|
||||||
|
baf: 1e push ds
|
||||||
|
bb0: b8 0a 00 mov ax,0xa
|
||||||
|
bb3: 50 push ax
|
||||||
|
bb4: 16 push ss
|
||||||
|
bb5: 8d 86 62 fd lea ax,[bp-0x29e]
|
||||||
|
bb9: 50 push ax
|
||||||
|
bba: 9a 1e 0c b3 00 call 0xb3:0xc1e
|
||||||
|
bbf: 83 c4 0a add sp,0xa
|
||||||
|
bc2: 16 push ss
|
||||||
|
bc3: 8d 86 62 fd lea ax,[bp-0x29e]
|
||||||
|
bc7: 50 push ax
|
||||||
|
bc8: 9a 40 09 b3 00 call 0xb3:0x940
|
||||||
|
bcd: 83 c4 04 add sp,0x4
|
||||||
|
bd0: ff 76 0a push WORD PTR [bp+0xa]
|
||||||
|
bd3: 1e push ds
|
||||||
|
bd4: b8 0a 00 mov ax,0xa
|
||||||
|
bd7: 50 push ax
|
||||||
|
bd8: ff 76 08 push WORD PTR [bp+0x8]
|
||||||
|
bdb: ff 76 06 push WORD PTR [bp+0x6]
|
||||||
|
bde: 9a 02 00 be 0b call 0xbbe:0x2
|
||||||
|
be3: 83 c4 0a add sp,0xa
|
||||||
|
be6: 1f pop ds
|
||||||
|
be7: c9 leave
|
||||||
|
be8: cb retf
|
||||||
|
be9: 55 push bp
|
||||||
|
bea: 8b ec mov bp,sp
|
||||||
|
bec: 83 ec 04 sub sp,0x4
|
||||||
|
bef: 56 push si
|
||||||
|
bf0: 1e push ds
|
||||||
|
bf1: b8 b8 0d mov ax,0xdb8
|
||||||
|
bf4: 8e d8 mov ds,ax
|
||||||
|
bf6: 8b 76 0a mov si,WORD PTR [bp+0xa]
|
||||||
|
bf9: 8b c6 mov ax,si
|
||||||
|
bfb: c1 e8 02 shr ax,0x2
|
||||||
|
bfe: 8b f0 mov si,ax
|
||||||
|
c00: eb 71 jmp 0xc73
|
||||||
|
c02: c4 5e 06 les bx,DWORD PTR [bp+0x6]
|
||||||
|
c05: 26 8b 57 02 mov dx,WORD PTR es:[bx+0x2]
|
||||||
|
c09: 26 8b 07 mov ax,WORD PTR es:[bx]
|
||||||
|
c0c: 89 56 fe mov WORD PTR [bp-0x2],dx
|
||||||
|
c0f: 89 46 fc mov WORD PTR [bp-0x4],ax
|
||||||
|
c12: 8b 56 fe mov dx,WORD PTR [bp-0x2]
|
||||||
|
c15: 8b 46 fc mov ax,WORD PTR [bp-0x4]
|
||||||
|
c18: 25 00 ff and ax,0xff00
|
||||||
|
c1b: 81 e2 00 ff and dx,0xff00
|
||||||
|
c1f: b1 08 mov cl,0x8
|
||||||
|
c21: 9a 97 04 00 00 call 0x0:0x497
|
||||||
|
c26: 8b 4e fe mov cx,WORD PTR [bp-0x2]
|
||||||
|
c29: 8b 5e fc mov bx,WORD PTR [bp-0x4]
|
||||||
|
c2c: 81 e3 ff 00 and bx,0xff
|
||||||
|
c30: 81 e1 ff 00 and cx,0xff
|
||||||
|
c34: 52 push dx
|
||||||
|
c35: 50 push ax
|
||||||
|
c36: 8b c3 mov ax,bx
|
||||||
|
c38: 8b d1 mov dx,cx
|
||||||
|
c3a: b1 08 mov cl,0x8
|
||||||
|
c3c: 9a 78 04 00 00 call 0x0:0x478
|
||||||
|
c41: 5b pop bx
|
||||||
|
c42: 59 pop cx
|
||||||
|
c43: 0b d8 or bx,ax
|
||||||
|
c45: 0b ca or cx,dx
|
||||||
|
c47: 89 4e fe mov WORD PTR [bp-0x2],cx
|
||||||
|
c4a: 89 5e fc mov WORD PTR [bp-0x4],bx
|
||||||
|
c4d: 8b 56 fe mov dx,WORD PTR [bp-0x2]
|
||||||
|
c50: 8b 46 fc mov ax,WORD PTR [bp-0x4]
|
||||||
|
c53: 8b d0 mov dx,ax
|
||||||
|
c55: 33 c0 xor ax,ax
|
||||||
|
c57: 8b 4e fe mov cx,WORD PTR [bp-0x2]
|
||||||
|
c5a: 8b 5e fc mov bx,WORD PTR [bp-0x4]
|
||||||
|
c5d: 8b d9 mov bx,cx
|
||||||
|
c5f: 33 c9 xor cx,cx
|
||||||
|
c61: 0b c3 or ax,bx
|
||||||
|
c63: 0b d1 or dx,cx
|
||||||
|
c65: c4 5e 06 les bx,DWORD PTR [bp+0x6]
|
||||||
|
c68: 26 89 57 02 mov WORD PTR es:[bx+0x2],dx
|
||||||
|
c6c: 26 89 07 mov WORD PTR es:[bx],ax
|
||||||
|
c6f: 83 46 06 04 add WORD PTR [bp+0x6],0x4
|
||||||
|
c73: 8b c6 mov ax,si
|
||||||
|
c75: 4e dec si
|
||||||
|
c76: 0b c0 or ax,ax
|
||||||
|
c78: 75 88 jne 0xc02
|
||||||
|
c7a: 1f pop ds
|
||||||
|
c7b: 5e pop si
|
||||||
|
c7c: c9 leave
|
||||||
|
c7d: cb retf
|
||||||
|
c7e: 55 push bp
|
||||||
|
c7f: 8b ec mov bp,sp
|
||||||
|
c81: 83 ec 02 sub sp,0x2
|
||||||
|
c84: 56 push si
|
||||||
|
c85: 1e push ds
|
||||||
|
c86: b8 b8 0d mov ax,0xdb8
|
||||||
|
c89: 8e d8 mov ds,ax
|
||||||
|
c8b: 8b 76 0a mov si,WORD PTR [bp+0xa]
|
||||||
|
c8e: 8b c6 mov ax,si
|
||||||
|
c90: d1 e8 shr ax,1
|
||||||
|
c92: 8b f0 mov si,ax
|
||||||
|
c94: eb 21 jmp 0xcb7
|
||||||
|
c96: c4 5e 06 les bx,DWORD PTR [bp+0x6]
|
||||||
|
c99: 26 8b 07 mov ax,WORD PTR es:[bx]
|
||||||
|
c9c: 89 46 fe mov WORD PTR [bp-0x2],ax
|
||||||
|
c9f: 8b 46 fe mov ax,WORD PTR [bp-0x2]
|
||||||
|
ca2: c1 e0 08 shl ax,0x8
|
||||||
|
ca5: 8b 56 fe mov dx,WORD PTR [bp-0x2]
|
||||||
|
ca8: c1 ea 08 shr dx,0x8
|
||||||
|
cab: 0b c2 or ax,dx
|
||||||
|
cad: c4 5e 06 les bx,DWORD PTR [bp+0x6]
|
||||||
|
cb0: 26 89 07 mov WORD PTR es:[bx],ax
|
||||||
|
cb3: 83 46 06 02 add WORD PTR [bp+0x6],0x2
|
||||||
|
cb7: 8b c6 mov ax,si
|
||||||
|
cb9: 4e dec si
|
||||||
|
cba: 0b c0 or ax,ax
|
||||||
|
cbc: 75 d8 jne 0xc96
|
||||||
|
cbe: 1f pop ds
|
||||||
|
cbf: 5e pop si
|
||||||
|
cc0: c9 leave
|
||||||
|
cc1: cb retf
|
||||||
|
cc2: 55 push bp
|
||||||
|
cc3: 8b ec mov bp,sp
|
||||||
|
cc5: 1e push ds
|
||||||
|
cc6: b8 b8 0d mov ax,0xdb8
|
||||||
|
cc9: 8e d8 mov ds,ax
|
||||||
|
ccb: c4 5e 06 les bx,DWORD PTR [bp+0x6]
|
||||||
|
cce: 26 8b 07 mov ax,WORD PTR es:[bx]
|
||||||
|
cd1: 26 0b 47 02 or ax,WORD PTR es:[bx+0x2]
|
||||||
|
cd5: 74 37 je 0xd0e
|
||||||
|
cd7: ff 76 0a push WORD PTR [bp+0xa]
|
||||||
|
cda: 6a 00 push 0x0
|
||||||
|
cdc: c4 5e 06 les bx,DWORD PTR [bp+0x6]
|
||||||
|
cdf: 26 ff 77 02 push WORD PTR es:[bx+0x2]
|
||||||
|
ce3: 26 ff 37 push WORD PTR es:[bx]
|
||||||
|
ce6: 9a 38 00 c0 0b call 0xbc0:0x38
|
||||||
|
ceb: 83 c4 08 add sp,0x8
|
||||||
|
cee: c4 5e 06 les bx,DWORD PTR [bp+0x6]
|
||||||
|
cf1: 26 ff 77 02 push WORD PTR es:[bx+0x2]
|
||||||
|
cf5: 26 ff 37 push WORD PTR es:[bx]
|
||||||
|
cf8: 9a 04 00 5e 0c call 0xc5e:0x4
|
||||||
|
cfd: 83 c4 04 add sp,0x4
|
||||||
@@ -0,0 +1,598 @@
|
|||||||
|
|
||||||
|
/mnt/data/undes.img: file format binary
|
||||||
|
|
||||||
|
|
||||||
|
Disassembly of section .data:
|
||||||
|
|
||||||
|
000004b0 <.data+0x4b0>:
|
||||||
|
4b0: c2 33 d2 ret 0xd233
|
||||||
|
4b3: d3 e8 shr ax,cl
|
||||||
|
4b5: cb retf
|
||||||
|
4b6: 55 push bp
|
||||||
|
4b7: 8b ec mov bp,sp
|
||||||
|
4b9: 81 ec 26 05 sub sp,0x526
|
||||||
|
4bd: 56 push si
|
||||||
|
4be: 57 push di
|
||||||
|
4bf: 1e push ds
|
||||||
|
4c0: b8 49 0d mov ax,0xd49
|
||||||
|
4c3: 8e d8 mov ds,ax
|
||||||
|
4c5: 83 7e 06 02 cmp WORD PTR [bp+0x6],0x2
|
||||||
|
4c9: 74 03 je 0x4ce
|
||||||
|
4cb: e9 a0 00 jmp 0x56e
|
||||||
|
4ce: 1e push ds
|
||||||
|
4cf: b8 0c 00 mov ax,0xc
|
||||||
|
4d2: 50 push ax
|
||||||
|
4d3: c4 5e 08 les bx,DWORD PTR [bp+0x8]
|
||||||
|
4d6: 26 ff 77 06 push WORD PTR es:[bx+0x6]
|
||||||
|
4da: 26 ff 77 04 push WORD PTR es:[bx+0x4]
|
||||||
|
4de: 9a 01 00 bb 0b call 0xbbb:0x1
|
||||||
|
4e3: 83 c4 08 add sp,0x8
|
||||||
|
4e6: 0b c0 or ax,ax
|
||||||
|
4e8: 75 43 jne 0x52d
|
||||||
|
4ea: b8 65 0d mov ax,0xd65
|
||||||
|
4ed: 8e c0 mov es,ax
|
||||||
|
4ef: 26 ff 36 0a 00 push WORD PTR es:0xa
|
||||||
|
4f4: 26 ff 36 08 00 push WORD PTR es:0x8
|
||||||
|
4f9: 1e push ds
|
||||||
|
4fa: b8 18 00 mov ax,0x18
|
||||||
|
4fd: 50 push ax
|
||||||
|
4fe: 9a 08 00 da 0b call 0xbda:0x8
|
||||||
|
503: 83 c4 08 add sp,0x8
|
||||||
|
506: b8 65 0d mov ax,0xd65
|
||||||
|
509: 8e c0 mov es,ax
|
||||||
|
50b: 26 ff 36 12 00 push WORD PTR es:0x12
|
||||||
|
510: 26 ff 36 10 00 push WORD PTR es:0x10
|
||||||
|
515: 1e push ds
|
||||||
|
516: b8 1d 00 mov ax,0x1d
|
||||||
|
519: 50 push ax
|
||||||
|
51a: 9a 08 00 da 0b call 0xbda:0x8
|
||||||
|
51f: 83 c4 08 add sp,0x8
|
||||||
|
522: 6a 00 push 0x0
|
||||||
|
524: 9a 0d 00 58 0a call 0xa58:0xd
|
||||||
|
529: 44 inc sp
|
||||||
|
52a: 44 inc sp
|
||||||
|
52b: eb 41 jmp 0x56e
|
||||||
|
52d: 1e push ds
|
||||||
|
52e: b8 20 00 mov ax,0x20
|
||||||
|
531: 50 push ax
|
||||||
|
532: c4 5e 08 les bx,DWORD PTR [bp+0x8]
|
||||||
|
535: 26 ff 77 06 push WORD PTR es:[bx+0x6]
|
||||||
|
539: 26 ff 77 04 push WORD PTR es:[bx+0x4]
|
||||||
|
53d: 9a 01 00 bb 0b call 0xbbb:0x1
|
||||||
|
542: 83 c4 08 add sp,0x8
|
||||||
|
545: 0b c0 or ax,ax
|
||||||
|
547: 75 25 jne 0x56e
|
||||||
|
549: b8 65 0d mov ax,0xd65
|
||||||
|
54c: 8e c0 mov es,ax
|
||||||
|
54e: 26 ff 36 0a 00 push WORD PTR es:0xa
|
||||||
|
553: 26 ff 36 08 00 push WORD PTR es:0x8
|
||||||
|
558: 1e push ds
|
||||||
|
559: b8 2a 00 mov ax,0x2a
|
||||||
|
55c: 50 push ax
|
||||||
|
55d: 9a 08 00 da 0b call 0xbda:0x8
|
||||||
|
562: 83 c4 08 add sp,0x8
|
||||||
|
565: 6a 00 push 0x0
|
||||||
|
567: 9a 0d 00 58 0a call 0xa58:0xd
|
||||||
|
56c: 44 inc sp
|
||||||
|
56d: 44 inc sp
|
||||||
|
56e: 83 7e 06 04 cmp WORD PTR [bp+0x6],0x4
|
||||||
|
572: 74 3e je 0x5b2
|
||||||
|
574: 1e push ds
|
||||||
|
575: b8 96 00 mov ax,0x96
|
||||||
|
578: 50 push ax
|
||||||
|
579: 1e push ds
|
||||||
|
57a: b8 7f 00 mov ax,0x7f
|
||||||
|
57d: 50 push ax
|
||||||
|
57e: 1e push ds
|
||||||
|
57f: b8 66 00 mov ax,0x66
|
||||||
|
582: 50 push ax
|
||||||
|
583: 1e push ds
|
||||||
|
584: b8 3b 00 mov ax,0x3b
|
||||||
|
587: 50 push ax
|
||||||
|
588: 1e push ds
|
||||||
|
589: b8 2e 00 mov ax,0x2e
|
||||||
|
58c: 50 push ax
|
||||||
|
58d: b8 e6 11 mov ax,0x11e6
|
||||||
|
590: 50 push ax
|
||||||
|
591: b8 30 00 mov ax,0x30
|
||||||
|
594: 50 push ax
|
||||||
|
595: 9a 0a 00 9e 0c call 0xc9e:0xa
|
||||||
|
59a: 83 c4 18 add sp,0x18
|
||||||
|
59d: 83 7e 06 01 cmp WORD PTR [bp+0x6],0x1
|
||||||
|
5a1: 75 04 jne 0x5a7
|
||||||
|
5a3: 33 c0 xor ax,ax
|
||||||
|
5a5: eb 03 jmp 0x5aa
|
||||||
|
5a7: b8 02 00 mov ax,0x2
|
||||||
|
5aa: 50 push ax
|
||||||
|
5ab: 9a 0d 00 58 0a call 0xa58:0xd
|
||||||
|
5b0: 44 inc sp
|
||||||
|
5b1: 44 inc sp
|
||||||
|
5b2: c4 5e 08 les bx,DWORD PTR [bp+0x8]
|
||||||
|
5b5: 26 c4 5f 04 les bx,DWORD PTR es:[bx+0x4]
|
||||||
|
5b9: 8c 46 f6 mov WORD PTR [bp-0xa],es
|
||||||
|
5bc: 89 5e f4 mov WORD PTR [bp-0xc],bx
|
||||||
|
5bf: c4 5e 08 les bx,DWORD PTR [bp+0x8]
|
||||||
|
5c2: 26 c4 5f 08 les bx,DWORD PTR es:[bx+0x8]
|
||||||
|
5c6: 8c 46 ee mov WORD PTR [bp-0x12],es
|
||||||
|
5c9: 89 5e ec mov WORD PTR [bp-0x14],bx
|
||||||
|
5cc: c4 5e 08 les bx,DWORD PTR [bp+0x8]
|
||||||
|
5cf: 26 c4 5f 0c les bx,DWORD PTR es:[bx+0xc]
|
||||||
|
5d3: 8c 46 f2 mov WORD PTR [bp-0xe],es
|
||||||
|
5d6: 89 5e f0 mov WORD PTR [bp-0x10],bx
|
||||||
|
5d9: 1e push ds
|
||||||
|
5da: b8 bb 00 mov ax,0xbb
|
||||||
|
5dd: 50 push ax
|
||||||
|
5de: ff 76 ee push WORD PTR [bp-0x12]
|
||||||
|
5e1: ff 76 ec push WORD PTR [bp-0x14]
|
||||||
|
5e4: 9a 01 00 bb 0b call 0xbbb:0x1
|
||||||
|
5e9: 83 c4 08 add sp,0x8
|
||||||
|
5ec: 0b c0 or ax,ax
|
||||||
|
5ee: 74 3b je 0x62b
|
||||||
|
5f0: ff 76 f2 push WORD PTR [bp-0xe]
|
||||||
|
5f3: ff 76 f0 push WORD PTR [bp-0x10]
|
||||||
|
5f6: ff 76 ee push WORD PTR [bp-0x12]
|
||||||
|
5f9: ff 76 ec push WORD PTR [bp-0x14]
|
||||||
|
5fc: 9a 01 00 bb 0b call 0xbbb:0x1
|
||||||
|
601: 83 c4 08 add sp,0x8
|
||||||
|
604: 0b c0 or ax,ax
|
||||||
|
606: 75 23 jne 0x62b
|
||||||
|
608: 1e push ds
|
||||||
|
609: b8 c1 00 mov ax,0xc1
|
||||||
|
60c: 50 push ax
|
||||||
|
60d: 1e push ds
|
||||||
|
60e: b8 bd 00 mov ax,0xbd
|
||||||
|
611: 50 push ax
|
||||||
|
612: b8 e6 11 mov ax,0x11e6
|
||||||
|
615: 50 push ax
|
||||||
|
616: b8 30 00 mov ax,0x30
|
||||||
|
619: 50 push ax
|
||||||
|
61a: 9a 0a 00 9e 0c call 0xc9e:0xa
|
||||||
|
61f: 83 c4 0c add sp,0xc
|
||||||
|
622: 6a 01 push 0x1
|
||||||
|
624: 9a 0d 00 58 0a call 0xa58:0xd
|
||||||
|
629: 44 inc sp
|
||||||
|
62a: 44 inc sp
|
||||||
|
62b: 1e push ds
|
||||||
|
62c: b8 ed 00 mov ax,0xed
|
||||||
|
62f: 50 push ax
|
||||||
|
630: ff 76 ee push WORD PTR [bp-0x12]
|
||||||
|
633: ff 76 ec push WORD PTR [bp-0x14]
|
||||||
|
636: 9a 01 00 bb 0b call 0xbbb:0x1
|
||||||
|
63b: 83 c4 08 add sp,0x8
|
||||||
|
63e: 0b c0 or ax,ax
|
||||||
|
640: 75 0c jne 0x64e
|
||||||
|
642: c7 46 fa e6 11 mov WORD PTR [bp-0x6],0x11e6
|
||||||
|
647: c7 46 f8 08 00 mov WORD PTR [bp-0x8],0x8
|
||||||
|
64c: eb 19 jmp 0x667
|
||||||
|
64e: 1e push ds
|
||||||
|
64f: b8 ef 00 mov ax,0xef
|
||||||
|
652: 50 push ax
|
||||||
|
653: ff 76 ee push WORD PTR [bp-0x12]
|
||||||
|
656: ff 76 ec push WORD PTR [bp-0x14]
|
||||||
|
659: 9a 47 02 b3 0a call 0xab3:0x247
|
||||||
|
65e: 83 c4 08 add sp,0x8
|
||||||
|
661: 89 56 fa mov WORD PTR [bp-0x6],dx
|
||||||
|
664: 89 46 f8 mov WORD PTR [bp-0x8],ax
|
||||||
|
667: 1e push ds
|
||||||
|
668: b8 f2 00 mov ax,0xf2
|
||||||
|
66b: 50 push ax
|
||||||
|
66c: ff 76 f2 push WORD PTR [bp-0xe]
|
||||||
|
66f: ff 76 f0 push WORD PTR [bp-0x10]
|
||||||
|
672: 9a 01 00 bb 0b call 0xbbb:0x1
|
||||||
|
677: 83 c4 08 add sp,0x8
|
||||||
|
67a: 0b c0 or ax,ax
|
||||||
|
67c: 75 0c jne 0x68a
|
||||||
|
67e: c7 46 fe e6 11 mov WORD PTR [bp-0x2],0x11e6
|
||||||
|
683: c7 46 fc 1c 00 mov WORD PTR [bp-0x4],0x1c
|
||||||
|
688: eb 19 jmp 0x6a3
|
||||||
|
68a: 1e push ds
|
||||||
|
68b: b8 f4 00 mov ax,0xf4
|
||||||
|
68e: 50 push ax
|
||||||
|
68f: ff 76 f2 push WORD PTR [bp-0xe]
|
||||||
|
692: ff 76 f0 push WORD PTR [bp-0x10]
|
||||||
|
695: 9a 47 02 b3 0a call 0xab3:0x247
|
||||||
|
69a: 83 c4 08 add sp,0x8
|
||||||
|
69d: 89 56 fe mov WORD PTR [bp-0x2],dx
|
||||||
|
6a0: 89 46 fc mov WORD PTR [bp-0x4],ax
|
||||||
|
6a3: ff 76 ee push WORD PTR [bp-0x12]
|
||||||
|
6a6: ff 76 ec push WORD PTR [bp-0x14]
|
||||||
|
6a9: ff 76 fa push WORD PTR [bp-0x6]
|
||||||
|
6ac: ff 76 f8 push WORD PTR [bp-0x8]
|
||||||
|
6af: 9a 8e 00 a3 00 call 0xa3:0x8e
|
||||||
|
6b4: 83 c4 08 add sp,0x8
|
||||||
|
6b7: ff 76 f2 push WORD PTR [bp-0xe]
|
||||||
|
6ba: ff 76 f0 push WORD PTR [bp-0x10]
|
||||||
|
6bd: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
6c0: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
6c3: 9a 8e 00 a3 00 call 0xa3:0x8e
|
||||||
|
6c8: 83 c4 08 add sp,0x8
|
||||||
|
6cb: c7 86 7a fd 03 00 mov WORD PTR [bp-0x286],0x3
|
||||||
|
6d1: c7 86 7c fd 03 00 mov WORD PTR [bp-0x284],0x3
|
||||||
|
6d7: c7 86 ea fe 01 00 mov WORD PTR [bp-0x116],0x1
|
||||||
|
6dd: 68 00 40 push 0x4000
|
||||||
|
6e0: 9a 00 00 61 0a call 0xa61:0x0
|
||||||
|
6e5: 44 inc sp
|
||||||
|
6e6: 44 inc sp
|
||||||
|
6e7: 89 96 e0 fe mov WORD PTR [bp-0x120],dx
|
||||||
|
6eb: 89 86 de fe mov WORD PTR [bp-0x122],ax
|
||||||
|
6ef: c4 9e de fe les bx,DWORD PTR [bp-0x122]
|
||||||
|
6f3: 83 c3 08 add bx,0x8
|
||||||
|
6f6: 8c 86 e4 fe mov WORD PTR [bp-0x11c],es
|
||||||
|
6fa: 89 9e e2 fe mov WORD PTR [bp-0x11e],bx
|
||||||
|
6fe: 8b 86 de fe mov ax,WORD PTR [bp-0x122]
|
||||||
|
702: 0b 86 e0 fe or ax,WORD PTR [bp-0x120]
|
||||||
|
706: 75 1e jne 0x726
|
||||||
|
708: 1e push ds
|
||||||
|
709: b8 f7 00 mov ax,0xf7
|
||||||
|
70c: 50 push ax
|
||||||
|
70d: b8 e6 11 mov ax,0x11e6
|
||||||
|
710: 50 push ax
|
||||||
|
711: b8 30 00 mov ax,0x30
|
||||||
|
714: 50 push ax
|
||||||
|
715: 9a 0a 00 9e 0c call 0xc9e:0xa
|
||||||
|
71a: 83 c4 08 add sp,0x8
|
||||||
|
71d: 6a 01 push 0x1
|
||||||
|
71f: 9a 0d 00 58 0a call 0xa58:0xd
|
||||||
|
724: 44 inc sp
|
||||||
|
725: 44 inc sp
|
||||||
|
726: c4 9e de fe les bx,DWORD PTR [bp-0x122]
|
||||||
|
72a: 8c 86 e8 fe mov WORD PTR [bp-0x118],es
|
||||||
|
72e: 89 9e e6 fe mov WORD PTR [bp-0x11a],bx
|
||||||
|
732: 9a 2a 07 b7 00 call 0xb7:0x72a
|
||||||
|
737: 16 push ss
|
||||||
|
738: 8d 86 7e fd lea ax,[bp-0x282]
|
||||||
|
73c: 50 push ax
|
||||||
|
73d: ff b6 7c fd push WORD PTR [bp-0x284]
|
||||||
|
741: ff b6 7a fd push WORD PTR [bp-0x286]
|
||||||
|
745: 9a 58 05 b7 00 call 0xb7:0x558
|
||||||
|
74a: 83 c4 08 add sp,0x8
|
||||||
|
74d: 8b 86 8a fd mov ax,WORD PTR [bp-0x276]
|
||||||
|
751: 89 86 d6 fe mov WORD PTR [bp-0x12a],ax
|
||||||
|
755: 8b 86 90 fd mov ax,WORD PTR [bp-0x270]
|
||||||
|
759: 89 86 d8 fe mov WORD PTR [bp-0x128],ax
|
||||||
|
75d: 33 ff xor di,di
|
||||||
|
75f: eb 0b jmp 0x76c
|
||||||
|
761: c4 5e f4 les bx,DWORD PTR [bp-0xc]
|
||||||
|
764: 26 8a 01 mov al,BYTE PTR es:[bx+di]
|
||||||
|
767: 88 83 96 fd mov BYTE PTR [bp+di-0x26a],al
|
||||||
|
76b: 47 inc di
|
||||||
|
76c: 3b be d6 fe cmp di,WORD PTR [bp-0x12a]
|
||||||
|
770: 7d 09 jge 0x77b
|
||||||
|
772: c4 5e f4 les bx,DWORD PTR [bp-0xc]
|
||||||
|
775: 26 80 39 00 cmp BYTE PTR es:[bx+di],0x0
|
||||||
|
779: 75 e6 jne 0x761
|
||||||
|
77b: eb 06 jmp 0x783
|
||||||
|
77d: c6 83 96 fd 00 mov BYTE PTR [bp+di-0x26a],0x0
|
||||||
|
782: 47 inc di
|
||||||
|
783: 3b be d6 fe cmp di,WORD PTR [bp-0x12a]
|
||||||
|
787: 7c f4 jl 0x77d
|
||||||
|
789: b8 65 0d mov ax,0xd65
|
||||||
|
78c: 8e c0 mov es,ax
|
||||||
|
78e: 26 c7 06 0e 00 ff ff mov WORD PTR es:0xe,0xffff
|
||||||
|
795: 26 c7 06 0c 00 ff ff mov WORD PTR es:0xc,0xffff
|
||||||
|
79c: c4 5e f8 les bx,DWORD PTR [bp-0x8]
|
||||||
|
79f: 26 8a 47 04 mov al,BYTE PTR es:[bx+0x4]
|
||||||
|
7a3: 98 cbw
|
||||||
|
7a4: 89 86 dc fe mov WORD PTR [bp-0x124],ax
|
||||||
|
7a8: 6a 04 push 0x4
|
||||||
|
7aa: b8 65 0d mov ax,0xd65
|
||||||
|
7ad: 50 push ax
|
||||||
|
7ae: b8 0c 00 mov ax,0xc
|
||||||
|
7b1: 50 push ax
|
||||||
|
7b2: ff b6 dc fe push WORD PTR [bp-0x124]
|
||||||
|
7b6: 9a 07 00 53 0b call 0xb53:0x7
|
||||||
|
7bb: 83 c4 08 add sp,0x8
|
||||||
|
7be: 89 86 da fe mov WORD PTR [bp-0x126],ax
|
||||||
|
7c2: ff b6 da fe push WORD PTR [bp-0x126]
|
||||||
|
7c6: 9a 0f 00 a3 00 call 0xa3:0xf
|
||||||
|
7cb: 44 inc sp
|
||||||
|
7cc: 44 inc sp
|
||||||
|
7cd: b8 65 0d mov ax,0xd65
|
||||||
|
7d0: 8e c0 mov es,ax
|
||||||
|
7d2: 26 ff 36 0e 00 push WORD PTR es:0xe
|
||||||
|
7d7: 26 ff 36 0c 00 push WORD PTR es:0xc
|
||||||
|
7dc: 9a 03 00 b0 00 call 0xb0:0x3
|
||||||
|
7e1: 83 c4 04 add sp,0x4
|
||||||
|
7e4: ff b6 7c fd push WORD PTR [bp-0x284]
|
||||||
|
7e8: ff b6 7a fd push WORD PTR [bp-0x286]
|
||||||
|
7ec: 16 push ss
|
||||||
|
7ed: 8d 86 de fa lea ax,[bp-0x522]
|
||||||
|
7f1: 50 push ax
|
||||||
|
7f2: 9a 48 07 b7 00 call 0xb7:0x748
|
||||||
|
7f7: 83 c4 08 add sp,0x8
|
||||||
|
7fa: ff b6 d6 fe push WORD PTR [bp-0x12a]
|
||||||
|
7fe: 16 push ss
|
||||||
|
7ff: 8d 86 96 fd lea ax,[bp-0x26a]
|
||||||
|
803: 50 push ax
|
||||||
|
804: 16 push ss
|
||||||
|
805: 8d 86 de fa lea ax,[bp-0x522]
|
||||||
|
809: 50 push ax
|
||||||
|
80a: 9a b7 09 b7 00 call 0xb7:0x9b7
|
||||||
|
80f: 83 c4 0a add sp,0xa
|
||||||
|
812: 16 push ss
|
||||||
|
813: 8d 86 7e fd lea ax,[bp-0x282]
|
||||||
|
817: 50 push ax
|
||||||
|
818: 16 push ss
|
||||||
|
819: 8d 86 de fa lea ax,[bp-0x522]
|
||||||
|
81d: 50 push ax
|
||||||
|
81e: 9a de 06 b7 00 call 0xb7:0x6de
|
||||||
|
823: 83 c4 08 add sp,0x8
|
||||||
|
826: 8b 86 90 fd mov ax,WORD PTR [bp-0x270]
|
||||||
|
82a: 89 86 d8 fe mov WORD PTR [bp-0x128],ax
|
||||||
|
82e: ff b6 d8 fe push WORD PTR [bp-0x128]
|
||||||
|
832: 16 push ss
|
||||||
|
833: 8d 86 96 fe lea ax,[bp-0x16a]
|
||||||
|
837: 50 push ax
|
||||||
|
838: ff b6 dc fe push WORD PTR [bp-0x124]
|
||||||
|
83c: 9a 07 00 53 0b call 0xb53:0x7
|
||||||
|
841: 83 c4 08 add sp,0x8
|
||||||
|
844: 89 86 da fe mov WORD PTR [bp-0x126],ax
|
||||||
|
848: ff b6 da fe push WORD PTR [bp-0x126]
|
||||||
|
84c: 9a 0f 00 a3 00 call 0xa3:0xf
|
||||||
|
851: 44 inc sp
|
||||||
|
852: 44 inc sp
|
||||||
|
853: ff b6 d8 fe push WORD PTR [bp-0x128]
|
||||||
|
857: 16 push ss
|
||||||
|
858: 8d 86 96 fe lea ax,[bp-0x16a]
|
||||||
|
85c: 50 push ax
|
||||||
|
85d: 16 push ss
|
||||||
|
85e: 8d 86 de fa lea ax,[bp-0x522]
|
||||||
|
862: 50 push ax
|
||||||
|
863: 9a 90 0a b7 00 call 0xb7:0xa90
|
||||||
|
868: 83 c4 0a add sp,0xa
|
||||||
|
86b: 68 00 01 push 0x100
|
||||||
|
86e: 16 push ss
|
||||||
|
86f: 8d 86 ec fe lea ax,[bp-0x114]
|
||||||
|
873: 50 push ax
|
||||||
|
874: ff b6 dc fe push WORD PTR [bp-0x124]
|
||||||
|
878: 9a 07 00 53 0b call 0xb53:0x7
|
||||||
|
87d: 83 c4 08 add sp,0x8
|
||||||
|
880: 89 86 da fe mov WORD PTR [bp-0x126],ax
|
||||||
|
884: ff b6 da fe push WORD PTR [bp-0x126]
|
||||||
|
888: 9a 0f 00 a3 00 call 0xa3:0xf
|
||||||
|
88d: 44 inc sp
|
||||||
|
88e: 44 inc sp
|
||||||
|
88f: 68 00 40 push 0x4000
|
||||||
|
892: ff b6 e0 fe push WORD PTR [bp-0x120]
|
||||||
|
896: ff b6 de fe push WORD PTR [bp-0x122]
|
||||||
|
89a: ff b6 dc fe push WORD PTR [bp-0x124]
|
||||||
|
89e: 9a 07 00 53 0b call 0xb53:0x7
|
||||||
|
8a3: 83 c4 08 add sp,0x8
|
||||||
|
8a6: 89 86 da fe mov WORD PTR [bp-0x126],ax
|
||||||
|
8aa: ff b6 da fe push WORD PTR [bp-0x126]
|
||||||
|
8ae: 9a 0f 00 a3 00 call 0xa3:0xf
|
||||||
|
8b3: 44 inc sp
|
||||||
|
8b4: 44 inc sp
|
||||||
|
8b5: e9 f5 00 jmp 0x9ad
|
||||||
|
8b8: 68 00 40 push 0x4000
|
||||||
|
8bb: ff b6 e0 fe push WORD PTR [bp-0x120]
|
||||||
|
8bf: ff b6 de fe push WORD PTR [bp-0x122]
|
||||||
|
8c3: 16 push ss
|
||||||
|
8c4: 8d 86 de fa lea ax,[bp-0x522]
|
||||||
|
8c8: 50 push ax
|
||||||
|
8c9: 9a ec 0c b7 00 call 0xb7:0xcec
|
||||||
|
8ce: 83 c4 0a add sp,0xa
|
||||||
|
8d1: c4 9e e6 fe les bx,DWORD PTR [bp-0x11a]
|
||||||
|
8d5: 26 8b 57 02 mov dx,WORD PTR es:[bx+0x2]
|
||||||
|
8d9: 26 8b 07 mov ax,WORD PTR es:[bx]
|
||||||
|
8dc: 89 96 dc fa mov WORD PTR [bp-0x524],dx
|
||||||
|
8e0: 89 86 da fa mov WORD PTR [bp-0x526],ax
|
||||||
|
8e4: 83 be dc fa 00 cmp WORD PTR [bp-0x524],0x0
|
||||||
|
8e9: 7f 15 jg 0x900
|
||||||
|
8eb: 7c 07 jl 0x8f4
|
||||||
|
8ed: 83 be da fa 00 cmp WORD PTR [bp-0x526],0x0
|
||||||
|
8f2: 73 0c jae 0x900
|
||||||
|
8f4: c7 86 dc fa 00 00 mov WORD PTR [bp-0x524],0x0
|
||||||
|
8fa: c7 86 da fa f8 3f mov WORD PTR [bp-0x526],0x3ff8
|
||||||
|
900: 83 be ea fe 00 cmp WORD PTR [bp-0x116],0x0
|
||||||
|
905: 74 56 je 0x95d
|
||||||
|
907: 68 00 01 push 0x100
|
||||||
|
90a: 16 push ss
|
||||||
|
90b: 8d 86 ec fe lea ax,[bp-0x114]
|
||||||
|
90f: 50 push ax
|
||||||
|
910: 16 push ss
|
||||||
|
911: 8d 86 de fa lea ax,[bp-0x522]
|
||||||
|
915: 50 push ax
|
||||||
|
916: 9a ec 0c b7 00 call 0xb7:0xcec
|
||||||
|
91b: 83 c4 0a add sp,0xa
|
||||||
|
91e: 33 f6 xor si,si
|
||||||
|
920: eb 01 jmp 0x923
|
||||||
|
922: 46 inc si
|
||||||
|
923: 3b b6 d6 fe cmp si,WORD PTR [bp-0x12a]
|
||||||
|
927: 7d 0a jge 0x933
|
||||||
|
929: 8a 82 ec fe mov al,BYTE PTR [bp+si-0x114]
|
||||||
|
92d: 3a 82 96 fd cmp al,BYTE PTR [bp+si-0x26a]
|
||||||
|
931: 74 ef je 0x922
|
||||||
|
933: 3b b6 d6 fe cmp si,WORD PTR [bp-0x12a]
|
||||||
|
937: 74 1e je 0x957
|
||||||
|
939: 1e push ds
|
||||||
|
93a: b8 0e 01 mov ax,0x10e
|
||||||
|
93d: 50 push ax
|
||||||
|
93e: b8 e6 11 mov ax,0x11e6
|
||||||
|
941: 50 push ax
|
||||||
|
942: b8 30 00 mov ax,0x30
|
||||||
|
945: 50 push ax
|
||||||
|
946: 9a 0a 00 9e 0c call 0xc9e:0xa
|
||||||
|
94b: 83 c4 08 add sp,0x8
|
||||||
|
94e: 6a 01 push 0x1
|
||||||
|
950: 9a 0d 00 58 0a call 0xa58:0xd
|
||||||
|
955: 44 inc sp
|
||||||
|
956: 44 inc sp
|
||||||
|
957: c7 86 ea fe 00 00 mov WORD PTR [bp-0x116],0x0
|
||||||
|
95d: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
960: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
963: 6a 01 push 0x1
|
||||||
|
965: ff b6 da fa push WORD PTR [bp-0x526]
|
||||||
|
969: ff b6 e4 fe push WORD PTR [bp-0x11c]
|
||||||
|
96d: ff b6 e2 fe push WORD PTR [bp-0x11e]
|
||||||
|
971: 9a 0c 00 63 0b call 0xb63:0xc
|
||||||
|
976: 83 c4 0c add sp,0xc
|
||||||
|
979: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
97c: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
97f: 9a 4c 00 a3 00 call 0xa3:0x4c
|
||||||
|
984: 83 c4 04 add sp,0x4
|
||||||
|
987: 68 00 40 push 0x4000
|
||||||
|
98a: ff b6 e0 fe push WORD PTR [bp-0x120]
|
||||||
|
98e: ff b6 de fe push WORD PTR [bp-0x122]
|
||||||
|
992: ff b6 dc fe push WORD PTR [bp-0x124]
|
||||||
|
996: 9a 07 00 53 0b call 0xb53:0x7
|
||||||
|
99b: 83 c4 08 add sp,0x8
|
||||||
|
99e: 89 86 da fe mov WORD PTR [bp-0x126],ax
|
||||||
|
9a2: ff b6 da fe push WORD PTR [bp-0x126]
|
||||||
|
9a6: 9a 0f 00 a3 00 call 0xa3:0xf
|
||||||
|
9ab: 44 inc sp
|
||||||
|
9ac: 44 inc sp
|
||||||
|
9ad: 83 be da fe 00 cmp WORD PTR [bp-0x126],0x0
|
||||||
|
9b2: 74 03 je 0x9b7
|
||||||
|
9b4: e9 01 ff jmp 0x8b8
|
||||||
|
9b7: 6a 00 push 0x0
|
||||||
|
9b9: ff b6 e0 fe push WORD PTR [bp-0x120]
|
||||||
|
9bd: ff b6 de fe push WORD PTR [bp-0x122]
|
||||||
|
9c1: 16 push ss
|
||||||
|
9c2: 8d 86 de fa lea ax,[bp-0x522]
|
||||||
|
9c6: 50 push ax
|
||||||
|
9c7: 9a ec 0c b7 00 call 0xb7:0xcec
|
||||||
|
9cc: 83 c4 0a add sp,0xa
|
||||||
|
9cf: 16 push ss
|
||||||
|
9d0: 8d 86 de fa lea ax,[bp-0x522]
|
||||||
|
9d4: 50 push ax
|
||||||
|
9d5: 9a 32 09 b7 00 call 0xb7:0x932
|
||||||
|
9da: 83 c4 04 add sp,0x4
|
||||||
|
9dd: 9a 38 07 b7 00 call 0xb7:0x738
|
||||||
|
9e2: ff b6 e0 fe push WORD PTR [bp-0x120]
|
||||||
|
9e6: ff b6 de fe push WORD PTR [bp-0x122]
|
||||||
|
9ea: 9a 06 00 61 0c call 0xc61:0x6
|
||||||
|
9ef: 83 c4 04 add sp,0x4
|
||||||
|
9f2: 8b 56 fa mov dx,WORD PTR [bp-0x6]
|
||||||
|
9f5: 8b 46 f8 mov ax,WORD PTR [bp-0x8]
|
||||||
|
9f8: bb 08 00 mov bx,0x8
|
||||||
|
9fb: b9 e6 11 mov cx,0x11e6
|
||||||
|
9fe: 3b d1 cmp dx,cx
|
||||||
|
a00: 75 04 jne 0xa06
|
||||||
|
a02: 3b c3 cmp ax,bx
|
||||||
|
a04: 74 0e je 0xa14
|
||||||
|
a06: ff 76 fa push WORD PTR [bp-0x6]
|
||||||
|
a09: ff 76 f8 push WORD PTR [bp-0x8]
|
||||||
|
a0c: 9a 0b 00 36 0b call 0xb36:0xb
|
||||||
|
a11: 83 c4 04 add sp,0x4
|
||||||
|
a14: 8b 56 fe mov dx,WORD PTR [bp-0x2]
|
||||||
|
a17: 8b 46 fc mov ax,WORD PTR [bp-0x4]
|
||||||
|
a1a: bb 1c 00 mov bx,0x1c
|
||||||
|
a1d: b9 e6 11 mov cx,0x11e6
|
||||||
|
a20: 3b d1 cmp dx,cx
|
||||||
|
a22: 75 04 jne 0xa28
|
||||||
|
a24: 3b c3 cmp ax,bx
|
||||||
|
a26: 74 0e je 0xa36
|
||||||
|
a28: ff 76 fe push WORD PTR [bp-0x2]
|
||||||
|
a2b: ff 76 fc push WORD PTR [bp-0x4]
|
||||||
|
a2e: 9a 0b 00 36 0b call 0xb36:0xb
|
||||||
|
a33: 83 c4 04 add sp,0x4
|
||||||
|
a36: 33 c0 xor ax,ax
|
||||||
|
a38: eb 00 jmp 0xa3a
|
||||||
|
a3a: 1f pop ds
|
||||||
|
a3b: 5f pop di
|
||||||
|
a3c: 5e pop si
|
||||||
|
a3d: c9 leave
|
||||||
|
a3e: cb retf
|
||||||
|
a3f: 55 push bp
|
||||||
|
a40: 8b ec mov bp,sp
|
||||||
|
a42: 1e push ds
|
||||||
|
a43: b8 5d 0d mov ax,0xd5d
|
||||||
|
a46: 8e d8 mov ds,ax
|
||||||
|
a48: 83 7e 06 ff cmp WORD PTR [bp+0x6],0xffff
|
||||||
|
a4c: 75 2b jne 0xa79
|
||||||
|
a4e: 1e push ds
|
||||||
|
a4f: b8 00 00 mov ax,0x0
|
||||||
|
a52: 50 push ax
|
||||||
|
a53: b8 e6 11 mov ax,0x11e6
|
||||||
|
a56: 50 push ax
|
||||||
|
a57: b8 30 00 mov ax,0x30
|
||||||
|
a5a: 50 push ax
|
||||||
|
a5b: 9a 0a 00 9e 0c call 0xc9e:0xa
|
||||||
|
a60: 83 c4 08 add sp,0x8
|
||||||
|
a63: 1e push ds
|
||||||
|
a64: b8 27 00 mov ax,0x27
|
||||||
|
a67: 50 push ax
|
||||||
|
a68: 9a 0f 00 b9 0c call 0xcb9:0xf
|
||||||
|
a6d: 83 c4 04 add sp,0x4
|
||||||
|
a70: 6a 03 push 0x3
|
||||||
|
a72: 9a 0d 00 58 0a call 0xa58:0xd
|
||||||
|
a77: 44 inc sp
|
||||||
|
a78: 44 inc sp
|
||||||
|
a79: 1f pop ds
|
||||||
|
a7a: 5d pop bp
|
||||||
|
a7b: cb retf
|
||||||
|
a7c: 55 push bp
|
||||||
|
a7d: 8b ec mov bp,sp
|
||||||
|
a7f: 1e push ds
|
||||||
|
a80: b8 5d 0d mov ax,0xd5d
|
||||||
|
a83: 8e d8 mov ds,ax
|
||||||
|
a85: c4 5e 06 les bx,DWORD PTR [bp+0x6]
|
||||||
|
a88: 26 f7 47 02 10 00 test WORD PTR es:[bx+0x2],0x10
|
||||||
|
a8e: 74 2b je 0xabb
|
||||||
|
a90: 1e push ds
|
||||||
|
a91: b8 30 00 mov ax,0x30
|
||||||
|
a94: 50 push ax
|
||||||
|
a95: b8 e6 11 mov ax,0x11e6
|
||||||
|
a98: 50 push ax
|
||||||
|
a99: b8 30 00 mov ax,0x30
|
||||||
|
a9c: 50 push ax
|
||||||
|
a9d: 9a 0a 00 9e 0c call 0xc9e:0xa
|
||||||
|
aa2: 83 c4 08 add sp,0x8
|
||||||
|
aa5: 1e push ds
|
||||||
|
aa6: b8 58 00 mov ax,0x58
|
||||||
|
aa9: 50 push ax
|
||||||
|
aaa: 9a 0f 00 b9 0c call 0xcb9:0xf
|
||||||
|
aaf: 83 c4 04 add sp,0x4
|
||||||
|
ab2: 6a 03 push 0x3
|
||||||
|
ab4: 9a 0d 00 58 0a call 0xa58:0xd
|
||||||
|
ab9: 44 inc sp
|
||||||
|
aba: 44 inc sp
|
||||||
|
abb: 1f pop ds
|
||||||
|
abc: 5d pop bp
|
||||||
|
abd: cb retf
|
||||||
|
abe: 55 push bp
|
||||||
|
abf: 8b ec mov bp,sp
|
||||||
|
ac1: 1e push ds
|
||||||
|
ac2: b8 5d 0d mov ax,0xd5d
|
||||||
|
ac5: 8e d8 mov ds,ax
|
||||||
|
ac7: 8b 46 06 mov ax,WORD PTR [bp+0x6]
|
||||||
|
aca: 0b 46 08 or ax,WORD PTR [bp+0x8]
|
||||||
|
acd: 75 31 jne 0xb00
|
||||||
|
acf: ff 76 0c push WORD PTR [bp+0xc]
|
||||||
|
ad2: ff 76 0a push WORD PTR [bp+0xa]
|
||||||
|
ad5: 1e push ds
|
||||||
|
ad6: b8 61 00 mov ax,0x61
|
||||||
|
ad9: 50 push ax
|
||||||
|
ada: b8 e6 11 mov ax,0x11e6
|
||||||
|
add: 50 push ax
|
||||||
|
ade: b8 30 00 mov ax,0x30
|
||||||
|
ae1: 50 push ax
|
||||||
|
ae2: 9a 0a 00 9e 0c call 0xc9e:0xa
|
||||||
|
ae7: 83 c4 0c add sp,0xc
|
||||||
|
aea: 1e push ds
|
||||||
|
aeb: b8 7e 00 mov ax,0x7e
|
||||||
|
aee: 50 push ax
|
||||||
|
aef: 9a 0f 00 b9 0c call 0xcb9:0xf
|
||||||
|
af4: 83 c4 04 add sp,0x4
|
||||||
|
af7: 6a 03 push 0x3
|
||||||
|
af9: 9a 0d 00 58 0a call 0xa58:0xd
|
||||||
|
afe: 44 inc sp
|
||||||
|
aff: 44 inc sp
|
||||||
|
b00: 1f pop ds
|
||||||
|
b01: 5d pop bp
|
||||||
|
b02: cb retf
|
||||||
|
b03: 55 push bp
|
||||||
|
b04: 8b ec mov bp,sp
|
||||||
|
b06: 56 push si
|
||||||
|
b07: 1e push ds
|
||||||
|
b08: b8 65 0d mov ax,0xd65
|
||||||
|
b0b: 8e d8 mov ds,ax
|
||||||
|
b0d: 33 f6 xor si,si
|
||||||
|
b0f: eb 01 jmp 0xb12
|
||||||
|
b11: 46 inc si
|
||||||
|
b12: 8b de mov bx,si
|
||||||
|
b14: c1 e3 02 shl bx,0x2
|
||||||
|
b17: 8b 97 16 00 mov dx,WORD PTR [bx+0x16]
|
||||||
|
b1b: 8b 87 14 00 mov ax,WORD PTR [bx+0x14]
|
||||||
|
b1f: 3b cmp dx,WORD PTR [bp+0x8]
|
||||||
@@ -1,3 +1,38 @@
|
|||||||
# des_undes
|
# DES/UNDES V1.1.0 source reconstruction — v2
|
||||||
|
|
||||||
Old des/undes code based on libdes-3.14.
|
This directory contains a revised C reconstruction of `des.exe` and
|
||||||
|
`undes.exe` after comparison with the original `cryptl99.zip` dependency.
|
||||||
|
|
||||||
|
## Main files
|
||||||
|
|
||||||
|
- `des.c` — reconstructed encryption program
|
||||||
|
- `undes.c` — reconstructed decryption program
|
||||||
|
- `des_common.c`, `des_common.h` — reconstructed common support
|
||||||
|
- `reconstruction-notes.md` — evidence, file format and remaining uncertainty
|
||||||
|
- `cryptlib-api-map.md` — exact CRYPTLIB 0.99 function mapping
|
||||||
|
- `validation.md` — build/round-trip sanity check
|
||||||
|
- `asm/` — disassembly used for the reconstruction
|
||||||
|
- `third_party/cryptl99.zip` — user-supplied original archive
|
||||||
|
- `third_party/cryptlib-0.99/` — extracted dependency source
|
||||||
|
|
||||||
|
## What changed from the first reconstruction
|
||||||
|
|
||||||
|
The supplied CRYPTLIB source resolves several earlier uncertainties and one
|
||||||
|
important mistake:
|
||||||
|
|
||||||
|
1. The real API names are lower-case (`initLibrary`,
|
||||||
|
`queryAlgoModeInformation`, `retrieveIV`, etc.).
|
||||||
|
2. The executable uses `CRYPT_ALGO_3DES`, not `CRYPT_ALGO_DES`.
|
||||||
|
3. The mode is `CRYPT_MODE_CBC`.
|
||||||
|
4. The effective queried key size is 14 bytes.
|
||||||
|
5. The queried/stored IV is 4 bytes, not 8 bytes.
|
||||||
|
6. The archive contains exactly libdes 3.14, matching the embedded executable
|
||||||
|
version string.
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
The control flow and file-format reconstruction is high confidence. The code
|
||||||
|
is intended primarily as a faithful readable reconstruction. It has not been
|
||||||
|
claimed to be byte-for-byte recompilable to the original executables because
|
||||||
|
that would require the exact original compiler flags, source layout, linker
|
||||||
|
configuration and original identifiers.
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
d118d9b9a618d7e758229642c0585e005b0ab4d458ef369f44d1f4de7012c034 /mnt/data/des.exe
|
||||||
|
2e54e8820857a1391ac6ce12444f11f75a8a65bfcc58226edd51d6f495c4aa84 /mnt/data/undes.exe
|
||||||
|
3cd4d36c75916a2c6050b75bd3ad2706e284d3993fbaa68fbde4343a7056f629 /mnt/data/cryptl99.zip
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# CRYPTLIB 0.99 API mapping
|
||||||
|
|
||||||
|
The supplied `cryptl99.zip` removes the remaining uncertainty about the
|
||||||
|
CRYPTLIB calls. The executable's call shapes, local structure offsets and the
|
||||||
|
source in `crypt.h`/`crypt.c` all agree.
|
||||||
|
|
||||||
|
| Operation | CRYPTLIB 0.99 function | des.exe target | undes.exe target |
|
||||||
|
|---|---|---:|---:|
|
||||||
|
| Initialise library | `initLibrary()` | `00B3:0738` | `00B7:072A` |
|
||||||
|
| End library | `endLibrary()` | `00B3:0746` | `00B7:0738` |
|
||||||
|
| Query algorithm/mode | `queryAlgoModeInformation()` | `00B3:0566` | `00B7:0558` |
|
||||||
|
| Query context | `queryContextInformation()` | `00B3:06EC` | `00B7:06DE` |
|
||||||
|
| Initialise context | `initCryptContext()` | `00B3:0756` | `00B7:0748` |
|
||||||
|
| Destroy context | `destroyCryptContext()` | `00B3:0940` | `00B7:0932` |
|
||||||
|
| Load key | `loadCryptContext()` | `00B3:09C5` | `00B7:09B7` |
|
||||||
|
| Retrieve IV | `retrieveIV()` | `00B3:0BA9` | — |
|
||||||
|
| Load IV | `loadIV()` | — | `00B7:0A90` |
|
||||||
|
| Encrypt | `encryptBuffer()` | `00B3:0C1E` | — |
|
||||||
|
| Decrypt | `decryptBuffer()` | — | `00B7:0CEC` |
|
||||||
|
|
||||||
|
## Algorithm values
|
||||||
|
|
||||||
|
Both mains store the integer value `3` for the algorithm and `3` for the mode.
|
||||||
|
In the supplied `crypt.h` these are:
|
||||||
|
|
||||||
|
```c
|
||||||
|
CRYPT_ALGO_3DES == 3
|
||||||
|
CRYPT_MODE_CBC == 3
|
||||||
|
```
|
||||||
|
|
||||||
|
So DES/UNDES V1.1.0 uses **two-key triple DES in CBC mode**.
|
||||||
|
|
||||||
|
The `CRYPT_QUERY_INFO` offsets used by the machine code also match the supplied
|
||||||
|
header in the 16-bit large memory model. The program reads:
|
||||||
|
|
||||||
|
- `keySize` = 14 bytes (112 bits)
|
||||||
|
- `ivSize` = 4 bytes (32 bits)
|
||||||
|
|
||||||
|
Those are exactly the recommended values in the CRYPTLIB 0.99 `3DES-CBC`
|
||||||
|
capability entry.
|
||||||
@@ -0,0 +1,205 @@
|
|||||||
|
/*
|
||||||
|
* DES V1.1.0 - reconstructed from des.exe
|
||||||
|
* Original executable: (C) 1998 H.N.M. Dijkema, GPL
|
||||||
|
*
|
||||||
|
* IMPORTANT: despite the program name, the executable selects
|
||||||
|
* CRYPT_ALGO_3DES + CRYPT_MODE_CBC, i.e. two-key triple DES in CBC mode.
|
||||||
|
*
|
||||||
|
* This is reconstructed source, not the original source text. Control flow,
|
||||||
|
* constants, CRYPTLIB calls and file-format behaviour are derived from the
|
||||||
|
* 16-bit Turbo C executable and verified against CRYPTLIB 0.99 source.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <io.h>
|
||||||
|
#include "crypt.h"
|
||||||
|
#include "des_common.h"
|
||||||
|
|
||||||
|
int main( int argc, char **argv )
|
||||||
|
{
|
||||||
|
char *password;
|
||||||
|
char *inputName;
|
||||||
|
char *outputName;
|
||||||
|
FILE *input;
|
||||||
|
FILE *output;
|
||||||
|
unsigned char *buffer;
|
||||||
|
unsigned char *payload;
|
||||||
|
BYTE key[ CRYPT_MAX_KEYSIZE ];
|
||||||
|
BYTE iv[ CRYPT_MAX_IVSIZE ];
|
||||||
|
BYTE passwordBlock[ CRYPT_MAX_KEYSIZE ];
|
||||||
|
CRYPT_INFO cryptInfo;
|
||||||
|
CRYPT_QUERY_INFO queryInfo;
|
||||||
|
CRYPT_ALGO algorithm = CRYPT_ALGO_3DES;
|
||||||
|
CRYPT_MODE mode = CRYPT_MODE_CBC;
|
||||||
|
DES_INT32 fileVersion = DES_FILE_VERSION;
|
||||||
|
int keySize;
|
||||||
|
int ivSize;
|
||||||
|
int bytesRead;
|
||||||
|
int firstTime;
|
||||||
|
int inputFd;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if( argc == 2 )
|
||||||
|
{
|
||||||
|
if( strcmp( argv[ 1 ], "--copyright" ) == 0 )
|
||||||
|
{
|
||||||
|
printf( "%s\n\n", desProgramVersion );
|
||||||
|
printf( "%s", desCopyrightText );
|
||||||
|
exit( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( strcmp( argv[ 1 ], "--version" ) == 0 )
|
||||||
|
{
|
||||||
|
printf( "%s\n", desProgramVersion );
|
||||||
|
exit( 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( argc != 4 )
|
||||||
|
{
|
||||||
|
fprintf( stderr,
|
||||||
|
"usage: des <passwd> <file in> <file out>\n"
|
||||||
|
" des --copyright\n"
|
||||||
|
" des --version\n"
|
||||||
|
" '-' for file --> stdin/stdout\n" );
|
||||||
|
exit( argc == 1 ? 0 : 2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
password = argv[ 1 ];
|
||||||
|
inputName = argv[ 2 ];
|
||||||
|
outputName = argv[ 3 ];
|
||||||
|
|
||||||
|
if( strcmp( inputName, "-" ) != 0 &&
|
||||||
|
strcmp( inputName, outputName ) == 0 )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "<file in> and <file out> cannot be the same\n" );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
input = ( strcmp( inputName, "-" ) == 0 ) ?
|
||||||
|
stdin : fopen( inputName, "rb" );
|
||||||
|
output = ( strcmp( outputName, "-" ) == 0 ) ?
|
||||||
|
stdout : fopen( outputName, "wb" );
|
||||||
|
|
||||||
|
checkOpen( input, inputName );
|
||||||
|
checkOpen( output, outputName );
|
||||||
|
|
||||||
|
/* The executable writes exactly four bytes here. */
|
||||||
|
fwrite( &fileVersion, 4, 1, output );
|
||||||
|
|
||||||
|
algorithm = CRYPT_ALGO_3DES;
|
||||||
|
mode = CRYPT_MODE_CBC;
|
||||||
|
|
||||||
|
buffer = (unsigned char *) malloc( DES_BUFFER_SIZE );
|
||||||
|
if( buffer == NULL )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Cannot allocate buffer\n" );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
payload = buffer + DES_PREFIX_SIZE;
|
||||||
|
|
||||||
|
initLibrary();
|
||||||
|
|
||||||
|
queryAlgoModeInformation( algorithm, mode, &queryInfo );
|
||||||
|
keySize = queryInfo.keySize; /* 14 bytes for 3DES-CBC in 0.99 */
|
||||||
|
ivSize = queryInfo.ivSize; /* 4 bytes for 3DES-CBC in 0.99 */
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while( i < keySize && password[ i ] != '\0' )
|
||||||
|
{
|
||||||
|
key[ i ] = (BYTE) password[ i ];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
while( i < keySize )
|
||||||
|
key[ i++ ] = 0;
|
||||||
|
|
||||||
|
initCryptContext( &cryptInfo, algorithm, mode );
|
||||||
|
loadCryptContext( &cryptInfo, key, keySize );
|
||||||
|
|
||||||
|
firstTime = TRUE;
|
||||||
|
inputFd = fileno( input );
|
||||||
|
|
||||||
|
bytesRead = read( inputFd, payload, DES_PAYLOAD_SIZE );
|
||||||
|
checkRead( bytesRead );
|
||||||
|
|
||||||
|
while( bytesRead != 0 )
|
||||||
|
{
|
||||||
|
DES_INT32 marker;
|
||||||
|
|
||||||
|
if( bytesRead == DES_PAYLOAD_SIZE )
|
||||||
|
{
|
||||||
|
marker = negativeMarker( payload );
|
||||||
|
if( marker == 0 )
|
||||||
|
marker = (DES_INT32) -1;
|
||||||
|
|
||||||
|
memcpy( buffer, &marker, 4 );
|
||||||
|
marker = negativeMarker( payload + 4 );
|
||||||
|
memcpy( buffer + 4, &marker, 4 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
marker = (DES_INT32) bytesRead;
|
||||||
|
memcpy( buffer, &marker, 4 );
|
||||||
|
marker = negativeMarker( payload );
|
||||||
|
memcpy( buffer + 4, &marker, 4 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The executable always encrypts the complete 16 KiB buffer. */
|
||||||
|
encryptBuffer( &cryptInfo, buffer, DES_BUFFER_SIZE );
|
||||||
|
|
||||||
|
if( firstTime )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* CRYPTLIB generates the IV on the first encryptBuffer() call.
|
||||||
|
* Therefore it can only be retrieved after that call.
|
||||||
|
*/
|
||||||
|
queryContextInformation( &cryptInfo, &queryInfo );
|
||||||
|
ivSize = queryInfo.ivSize;
|
||||||
|
retrieveIV( &cryptInfo, iv );
|
||||||
|
|
||||||
|
fwrite( iv, ivSize, 1, output );
|
||||||
|
checkWrite( output );
|
||||||
|
fflush( output );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only keySize bytes are assigned. The remaining bytes of this
|
||||||
|
* 256-byte stack buffer are intentionally left as they were in the
|
||||||
|
* original executable; UNDES compares only the first keySize bytes.
|
||||||
|
*/
|
||||||
|
for( i = 0; i < keySize; i++ )
|
||||||
|
passwordBlock[ i ] = key[ i ];
|
||||||
|
|
||||||
|
encryptBuffer( &cryptInfo, passwordBlock, CRYPT_MAX_KEYSIZE );
|
||||||
|
fwrite( passwordBlock, CRYPT_MAX_KEYSIZE, 1, output );
|
||||||
|
checkWrite( output );
|
||||||
|
fflush( output );
|
||||||
|
|
||||||
|
firstTime = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
fwrite( buffer, DES_BUFFER_SIZE, 1, output );
|
||||||
|
checkWrite( output );
|
||||||
|
fflush( output );
|
||||||
|
|
||||||
|
bytesRead = read( inputFd, payload, DES_PAYLOAD_SIZE );
|
||||||
|
checkRead( bytesRead );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Courtesy close call used by CRYPTLIB block-cipher examples. */
|
||||||
|
encryptBuffer( &cryptInfo, buffer, 0 );
|
||||||
|
|
||||||
|
destroyCryptContext( &cryptInfo );
|
||||||
|
endLibrary();
|
||||||
|
|
||||||
|
free( buffer );
|
||||||
|
|
||||||
|
if( input != stdin )
|
||||||
|
fclose( input );
|
||||||
|
if( output != stdout )
|
||||||
|
fclose( output );
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
+122
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* Common support reconstructed from DES/UNDES V1.1.0 executables.
|
||||||
|
* Original program copyright: (C) 1998 H.N.M. Dijkema, GPL.
|
||||||
|
*
|
||||||
|
* This is reconstructed source, not the original source text. The helper
|
||||||
|
* behaviour and strings below are derived directly from des.exe/undes.exe.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "des_common.h"
|
||||||
|
|
||||||
|
DES_INT32 desKnownVersions[] = {
|
||||||
|
DES_FILE_VERSION,
|
||||||
|
(DES_INT32) -1
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *desProgramVersion =
|
||||||
|
"DES/UNDES V1.1.0, (C) 1998 H.N.M. Dijkema (GPL)";
|
||||||
|
|
||||||
|
const char *desCopyrightText =
|
||||||
|
" Copyright (C) 1998 H.N.M. Dijkema\n"
|
||||||
|
"\n"
|
||||||
|
" This product includes software developed by Eric Young (eay@mincom.oz.au)\n"
|
||||||
|
"\n"
|
||||||
|
" This program is free software; you can redistribute it and/or modify\n"
|
||||||
|
" it under the terms of the GNU General Public License as published by\n"
|
||||||
|
" the Free Software Foundation; either version 2 of the License, or\n"
|
||||||
|
" (at your option) any later version.\n"
|
||||||
|
"\n"
|
||||||
|
" This program is distributed in the hope that it will be useful,\n"
|
||||||
|
" but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
||||||
|
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
|
||||||
|
" GNU General Public License for more details.\n"
|
||||||
|
"\n"
|
||||||
|
" You should have received a copy of the GNU General Public License\n"
|
||||||
|
" along with this program; if not, write to the Free Software\n"
|
||||||
|
" Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
|
||||||
|
"\n"
|
||||||
|
" You can contact the author by electronic mail, hnmdijkema@freemail.nl\n"
|
||||||
|
"\n"
|
||||||
|
"\n"
|
||||||
|
"Acknowledgements\n"
|
||||||
|
"----------------\n"
|
||||||
|
"The author of CRYPTLIB, Peter Putmann of University of Auckland\n"
|
||||||
|
"cryptl99.zip Free encryption library for DOS/UNIX/Windows\n"
|
||||||
|
"\n"
|
||||||
|
"The DES and 3DES encryption code was contributed by Eric Young\n"
|
||||||
|
"<eay@psych.psy.uq.oz.au> and is part of his libdes package.\n"
|
||||||
|
"The primary ftp site for the full libdes is\n"
|
||||||
|
" ftp://ftp.psy.uq.oz.au/pub/Crypto/DES/libdes-x.xx.tar.gz.\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
|
void checkRead( int result )
|
||||||
|
{
|
||||||
|
if( result == -1 )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "\nFATAL : error reading input stream\n" );
|
||||||
|
perror( "MESSAGE " );
|
||||||
|
exit( 3 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkWrite( FILE *stream )
|
||||||
|
{
|
||||||
|
if( ferror( stream ) )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "\nFATAL : error writing output stream\n" );
|
||||||
|
perror( "MESSAGE " );
|
||||||
|
exit( 3 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkOpen( FILE *stream, const char *name )
|
||||||
|
{
|
||||||
|
if( stream == NULL )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "\nFATAL : Cannot open '%s'\n", name );
|
||||||
|
perror( "MESSAGE " );
|
||||||
|
exit( 3 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkVersion( DES_INT32 version )
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while( desKnownVersions[ i ] != version &&
|
||||||
|
desKnownVersions[ i ] != (DES_INT32) -1 )
|
||||||
|
i++;
|
||||||
|
|
||||||
|
if( desKnownVersions[ i ] == (DES_INT32) -1 )
|
||||||
|
{
|
||||||
|
fprintf( stderr,
|
||||||
|
"I don't know the version of this file, can't decrypt this\n" );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The compiler output proves that the marker is formed from a signed 16-bit
|
||||||
|
* word: abs(word), followed by negation and sign-extension to 32 bits.
|
||||||
|
*/
|
||||||
|
DES_INT32 negativeMarker( const unsigned char *p )
|
||||||
|
{
|
||||||
|
DES_INT16 value;
|
||||||
|
DES_UINT16 magnitude;
|
||||||
|
DES_UINT16 negated;
|
||||||
|
|
||||||
|
memcpy( &value, p, sizeof( value ) );
|
||||||
|
|
||||||
|
/* Emulate 16-bit Turbo C arithmetic exactly, including -32768. */
|
||||||
|
if( value < 0 )
|
||||||
|
magnitude = (DES_UINT16) ( -(DES_INT32) value );
|
||||||
|
else
|
||||||
|
magnitude = (DES_UINT16) value;
|
||||||
|
|
||||||
|
negated = (DES_UINT16) ( 0U - magnitude );
|
||||||
|
memcpy( &value, &negated, sizeof( value ) );
|
||||||
|
return( (DES_INT32) value );
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#ifndef DES_COMMON_H
|
||||||
|
#define DES_COMMON_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "crypt.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Types which have the same width as Turbo C 2.x int/long when this source
|
||||||
|
* is inspected or built on a modern compiler.
|
||||||
|
*/
|
||||||
|
#ifdef __TURBOC__
|
||||||
|
typedef int DES_INT16;
|
||||||
|
typedef unsigned int DES_UINT16;
|
||||||
|
typedef long DES_INT32;
|
||||||
|
#else
|
||||||
|
#include <stdint.h>
|
||||||
|
typedef int16_t DES_INT16;
|
||||||
|
typedef uint16_t DES_UINT16;
|
||||||
|
typedef int32_t DES_INT32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DES_BUFFER_SIZE 0x4000
|
||||||
|
#define DES_PREFIX_SIZE 8
|
||||||
|
#define DES_PAYLOAD_SIZE ( DES_BUFFER_SIZE - DES_PREFIX_SIZE )
|
||||||
|
#define DES_FILE_VERSION ((DES_INT32) 0x2775L)
|
||||||
|
|
||||||
|
extern DES_INT32 desKnownVersions[];
|
||||||
|
extern const char *desProgramVersion;
|
||||||
|
extern const char *desCopyrightText;
|
||||||
|
|
||||||
|
void checkRead( int result );
|
||||||
|
void checkWrite( FILE *stream );
|
||||||
|
void checkOpen( FILE *stream, const char *name );
|
||||||
|
void checkVersion( DES_INT32 version );
|
||||||
|
DES_INT32 negativeMarker( const unsigned char *p );
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,162 @@
|
|||||||
|
# Reconstruction notes — DES/UNDES V1.1.0
|
||||||
|
|
||||||
|
## Confidence
|
||||||
|
|
||||||
|
The main program logic is now reconstructed with high confidence. The supplied
|
||||||
|
`cryptl99.zip` is especially useful because it contains the exact CRYPTLIB 0.99
|
||||||
|
API and libdes 3.14 source that was linked into the executables.
|
||||||
|
|
||||||
|
This is **not** the original source text. Original variable names, comments,
|
||||||
|
whitespace and file decomposition were not retained in the executable. Names
|
||||||
|
such as `firstTime`, `passwordBlock`, `negativeMarker`, and the split into
|
||||||
|
`des_common.c`/`.h` are descriptive reconstruction choices.
|
||||||
|
|
||||||
|
## Compiler and memory model
|
||||||
|
|
||||||
|
Both programs are 16-bit MS-DOS MZ executables and contain the runtime string:
|
||||||
|
|
||||||
|
`Turbo-C - Copyright (c) 1988 Borland Intl.`
|
||||||
|
|
||||||
|
The generated code uses far data pointers extensively, and `malloc()` returns a
|
||||||
|
segment:offset pointer. That is consistent with a Turbo C large-memory-model
|
||||||
|
build.
|
||||||
|
|
||||||
|
## Exact crypto dependency
|
||||||
|
|
||||||
|
The executables contain:
|
||||||
|
|
||||||
|
`libdes v 3.14 - eay`
|
||||||
|
|
||||||
|
The supplied CRYPTLIB archive contains the same `libdes/version.h` string, plus
|
||||||
|
`crypt.h`, `crypt.c`, `lib_3des.c` and the relevant libdes sources. This is the
|
||||||
|
actual dependency family used by the executables rather than merely a later
|
||||||
|
compatible library.
|
||||||
|
|
||||||
|
## Important correction: it is 3DES
|
||||||
|
|
||||||
|
The machine code assigns value 3 to both the algorithm and mode variables.
|
||||||
|
According to the supplied `crypt.h`:
|
||||||
|
|
||||||
|
- `CRYPT_ALGO_3DES` = 3
|
||||||
|
- `CRYPT_MODE_CBC` = 3
|
||||||
|
|
||||||
|
Therefore the encryption is **two-key 3DES-CBC**, despite the executable being
|
||||||
|
called `des.exe`.
|
||||||
|
|
||||||
|
`crypt.c` defines the recommended 3DES-CBC parameters as:
|
||||||
|
|
||||||
|
- key size: 112 bits = 14 bytes
|
||||||
|
- IV size: 32 bits = 4 bytes
|
||||||
|
- DES block size: 64 bits = 8 bytes
|
||||||
|
|
||||||
|
The main routine obtains both sizes through `queryAlgoModeInformation()`.
|
||||||
|
|
||||||
|
## Password handling
|
||||||
|
|
||||||
|
The command-line password is copied directly into a 14-byte key buffer and is
|
||||||
|
zero-padded if shorter. Characters after byte 14 do not influence encryption.
|
||||||
|
There is no password hash or KDF in the DES/UNDES layer.
|
||||||
|
|
||||||
|
CRYPTLIB's `des3InitKey()` then constructs the two DES key schedules from that
|
||||||
|
user-key buffer. `des_check_key` in the bundled libdes defaults to zero, so
|
||||||
|
parity/weak-key checking is not enabled by default.
|
||||||
|
|
||||||
|
## File layout
|
||||||
|
|
||||||
|
For a non-empty encrypted input the file is:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Offset Size Meaning
|
||||||
|
0 4 file version: 0x00002775
|
||||||
|
4 4 CRYPTLIB-recommended CBC IV
|
||||||
|
8 256 encrypted password-check block
|
||||||
|
264 16384 encrypted data block 1
|
||||||
|
16648 16384 encrypted data block 2
|
||||||
|
... ...
|
||||||
|
```
|
||||||
|
|
||||||
|
For an empty input, `des.exe` writes only the four-byte version. Because no
|
||||||
|
`encryptBuffer()` call with data occurs, no IV or password-check block is
|
||||||
|
written.
|
||||||
|
|
||||||
|
## Data-block layout before encryption
|
||||||
|
|
||||||
|
Each 16384-byte encrypted data block consists of:
|
||||||
|
|
||||||
|
```text
|
||||||
|
0..3 signed 32-bit length marker
|
||||||
|
4..7 signed 32-bit secondary marker
|
||||||
|
8..16383 at most 16376 bytes input data
|
||||||
|
```
|
||||||
|
|
||||||
|
For a partial final block, the first field is the positive plaintext byte count.
|
||||||
|
For a full block it is a negative value; `undes.exe` interprets any negative
|
||||||
|
value as exactly 16376 plaintext bytes.
|
||||||
|
|
||||||
|
The full-block negative value is formed from the absolute value of the first
|
||||||
|
signed 16-bit word of the plaintext and then negated. If that produces zero,
|
||||||
|
`-1` is stored instead. The second field is also a negative marker derived from
|
||||||
|
a signed 16-bit plaintext word. `undes.exe` does not use this second field.
|
||||||
|
|
||||||
|
The exact purpose of the secondary marker cannot be established from the
|
||||||
|
executables alone; its computation is established, its design intent is not.
|
||||||
|
|
||||||
|
## CBC ordering on the first block
|
||||||
|
|
||||||
|
An unusual but confirmed detail is the first-block ordering.
|
||||||
|
|
||||||
|
`des.exe` performs the cryptographic operations in this order:
|
||||||
|
|
||||||
|
1. encrypt first 16 KiB data block
|
||||||
|
2. retrieve the now-generated IV
|
||||||
|
3. encrypt the 256-byte password-check block
|
||||||
|
|
||||||
|
but writes:
|
||||||
|
|
||||||
|
1. IV
|
||||||
|
2. encrypted password-check block
|
||||||
|
3. encrypted first data block
|
||||||
|
|
||||||
|
`undes.exe` reads the stored password block and first data block, then decrypts
|
||||||
|
in cryptographic order:
|
||||||
|
|
||||||
|
1. decrypt first data block
|
||||||
|
2. decrypt password-check block
|
||||||
|
|
||||||
|
This preserves the CBC state exactly. The apparent storage/processing order
|
||||||
|
mismatch is therefore intentional in the program logic, not a decompiler error.
|
||||||
|
|
||||||
|
## Password-check block
|
||||||
|
|
||||||
|
Before encryption, the first 14 bytes of the 256-byte password-check block are
|
||||||
|
the derived 14-byte key. The executable does not initialise the remaining 242
|
||||||
|
bytes before encrypting the block. During decryption only the first 14 bytes
|
||||||
|
are compared.
|
||||||
|
|
||||||
|
## Uninitialised bytes in the final data block
|
||||||
|
|
||||||
|
`des.exe` always encrypts the complete 16384-byte buffer. If the final input
|
||||||
|
chunk is shorter than 16376 bytes, the unused tail is not explicitly cleared
|
||||||
|
first. This is also visible in the machine code. UNDES writes only the number
|
||||||
|
of plaintext bytes stored in the first 32-bit field.
|
||||||
|
|
||||||
|
## Error handling and robustness
|
||||||
|
|
||||||
|
Read errors are detected only when `read()` returns `-1`; short reads are not
|
||||||
|
rejected. `undes.exe` does not authenticate ciphertext and does not validate a
|
||||||
|
positive decrypted length against 16376 before passing it to `fwrite()`. These
|
||||||
|
are normal limitations for small DOS-era utility code, but they matter if old
|
||||||
|
encrypted files are corrupted or attacker-controlled.
|
||||||
|
|
||||||
|
## Remaining uncertainty
|
||||||
|
|
||||||
|
The following cannot be recovered exactly without original source/debug
|
||||||
|
symbols:
|
||||||
|
|
||||||
|
- original variable/function names for the DES/UNDES-specific code;
|
||||||
|
- original comments and formatting;
|
||||||
|
- exact source-file decomposition;
|
||||||
|
- the design rationale for the secondary 32-bit marker;
|
||||||
|
- the symbolic name/formula originally used for file version `0x2775`.
|
||||||
|
|
||||||
|
The actual program behaviour no longer depends on guessed CRYPTLIB API names.
|
||||||
Vendored
BIN
Binary file not shown.
Vendored
+120
@@ -0,0 +1,120 @@
|
|||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* Makefile for the encryption library *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
CC = dcc -v -c
|
||||||
|
|
||||||
|
PROJ = crypt
|
||||||
|
LIBNAME = $(PROJ).lib
|
||||||
|
|
||||||
|
# Where object files go (/tmp is a good place)
|
||||||
|
OUTPATH = DObjs/
|
||||||
|
# Extension for object files
|
||||||
|
OBJ = .o
|
||||||
|
|
||||||
|
# Linker (just use the C compiler)
|
||||||
|
LD = dcc -v
|
||||||
|
# Echo to screen command
|
||||||
|
ECHO = echo
|
||||||
|
# The make command
|
||||||
|
MAKE = dmake
|
||||||
|
|
||||||
|
# The object files which make up the library
|
||||||
|
|
||||||
|
OBJS = $(OUTPATH)crypt$(OBJ) $(OUTPATH)lib_3des$(OBJ) $(OUTPATH)lib_des$(OBJ) $(OUTPATH)lib_idea$(OBJ) $(OUTPATH)lib_mdc$(OBJ) $(OUTPATH)lib_null$(OBJ) $(OUTPATH)lib_rc4$(OBJ) $(OUTPATH)idea$(OBJ) $(OUTPATH)3ecb_enc$(OBJ) $(OUTPATH)ecb_enc$(OBJ) $(OUTPATH)pcbc_enc$(OBJ) $(OUTPATH)set_key$(OBJ) $(OUTPATH)rc4$(OBJ) $(OUTPATH)shs$(OBJ)
|
||||||
|
|
||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* If no args are given, print a usage message and exit *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
default: $(LIBNAME)
|
||||||
|
|
||||||
|
love:
|
||||||
|
@$(ECHO) "Nicht wahr?"
|
||||||
|
@$(ECHO)
|
||||||
|
|
||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* Rules to build the encryption library *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
# Main directory
|
||||||
|
|
||||||
|
$(OUTPATH)crypt$(OBJ): crypt.h crypt.c
|
||||||
|
$(CC) -o %(left) crypt.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_3des$(OBJ): crypt.h libdes/des.h lib_3des.c
|
||||||
|
$(CC) -o %(left) lib_3des.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_des$(OBJ): crypt.h testdes.h libdes/des.h lib_des.c
|
||||||
|
$(CC) -o %(left) lib_des.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_idea$(OBJ): crypt.h idea/idea.h testidea.h lib_idea.c
|
||||||
|
$(CC) -o %(left) lib_idea.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_mdc$(OBJ): crypt.h mdc/shs.h lib_mdc.c
|
||||||
|
$(CC) -o %(left) lib_mdc.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_null$(OBJ): crypt.h lib_null.c
|
||||||
|
$(CC) -o %(left) lib_null.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_rc4$(OBJ): crypt.h testrc4.h rc4/rc4.h lib_rc4.c
|
||||||
|
$(CC) -o %(left) lib_rc4.c
|
||||||
|
|
||||||
|
$(OUTPATH)test$(OBJ): crypt.h test.c
|
||||||
|
$(CC) -o %(left) test.c
|
||||||
|
|
||||||
|
# idea subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)idea$(OBJ): idea/idea.h idea/idea.c
|
||||||
|
$(CC) -o %(left) idea/idea.c
|
||||||
|
|
||||||
|
# libdes subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)3ecb_enc$(OBJ): libdes/des.h libdes/des_locl.h libdes/3ecb_enc.c
|
||||||
|
$(CC) -o %(left) libdes/3ecb_enc.c
|
||||||
|
|
||||||
|
$(OUTPATH)ecb_enc$(OBJ): libdes/des.h libdes/des_locl.h libdes/spr.h libdes/version.h libdes/ecb_enc.c
|
||||||
|
$(CC) -o %(left) libdes/ecb_enc.c
|
||||||
|
|
||||||
|
$(OUTPATH)pcbc_enc$(OBJ): libdes/des.h libdes/des_locl.h libdes/pcbc_enc.c
|
||||||
|
$(CC) -o %(left) libdes/pcbc_enc.c
|
||||||
|
|
||||||
|
$(OUTPATH)set_key$(OBJ): libdes/des.h libdes/des_locl.h libdes/podd.h libdes/sk.h libdes/set_key.c
|
||||||
|
$(CC) -o %(left) libdes/set_key.c
|
||||||
|
|
||||||
|
# rc4 subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)rc4$(OBJ): rc4/rc4.h rc4/rc4.c
|
||||||
|
$(CC) -o %(left) rc4/rc4.c
|
||||||
|
|
||||||
|
# mdc subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)shs$(OBJ): mdc/shs.h mdc/shs.c
|
||||||
|
$(CC) -o %(left) mdc/shs.c
|
||||||
|
|
||||||
|
# Create the library. The test program is also listed as a dependancy
|
||||||
|
# since we need to use OS-specific compiler options for it which a
|
||||||
|
# simple 'make test' won't give us (yuck).
|
||||||
|
|
||||||
|
$(LIBNAME): $(OBJS) $(OUTPATH)test$(OBJ)
|
||||||
|
join as $(LIBNAME) $(OBJS)
|
||||||
|
|
||||||
|
# Link everything into a test program
|
||||||
|
|
||||||
|
test: $(LIBNAME) $(OUTPATH)test$(OBJ)
|
||||||
|
$(LD) -o testcrypt $(OUTPATH)test$(OBJ) -l$(PROJ)
|
||||||
|
|
||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* Cleanup after make has finished *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
clean:
|
||||||
|
delete force #?.o testcrypt $(LIBNAME)
|
||||||
Vendored
+35
@@ -0,0 +1,35 @@
|
|||||||
|
Ansi
|
||||||
|
Batch
|
||||||
|
Debug=Line
|
||||||
|
Error=All
|
||||||
|
ErrorRexx
|
||||||
|
Ignore=178
|
||||||
|
Ignore=306
|
||||||
|
IncludeDir=A31:
|
||||||
|
LinkOpts=NoAlvs
|
||||||
|
MemSize=Huge
|
||||||
|
MultiCharacterConstants
|
||||||
|
NoIcons
|
||||||
|
NoMultipleIncludes
|
||||||
|
NoStackCheck
|
||||||
|
OnError=Continue
|
||||||
|
NoOptimize
|
||||||
|
OptimizerComplexity=10
|
||||||
|
OptimizerDepth=10
|
||||||
|
OptimizerInlineLocal
|
||||||
|
OptimizerRecurDepth=10
|
||||||
|
NoOptimizerScheduler
|
||||||
|
OptimizerTime
|
||||||
|
Parameters=Registers
|
||||||
|
SmallCode
|
||||||
|
SmallData
|
||||||
|
Startup=cres
|
||||||
|
Strict
|
||||||
|
StringMerge
|
||||||
|
Verbose
|
||||||
|
Define=_STRICT_ANSI
|
||||||
|
Define=__ANSI__
|
||||||
|
Define=USE_BUILTIN_MATH
|
||||||
|
Define=AMIGA
|
||||||
|
Define=STDC_HEADERS
|
||||||
|
Define=KULTUR
|
||||||
Vendored
+115
@@ -0,0 +1,115 @@
|
|||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* Makefile for the encryption library *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
CC = sc
|
||||||
|
|
||||||
|
PROJ = crypt
|
||||||
|
LIBNAME = $(PROJ).lib
|
||||||
|
|
||||||
|
OUTPATH = SObjs/ # Where object files go (/tmp is a good place)
|
||||||
|
OBJ = .o # Extension for object files
|
||||||
|
|
||||||
|
LD = $(CC) link # Linker (just use the C compiler)
|
||||||
|
ECHO = echo # Echo to screen command
|
||||||
|
MAKE = smake # The make command
|
||||||
|
|
||||||
|
# The object files which make up the library
|
||||||
|
|
||||||
|
OBJS = $(OUTPATH)crypt$(OBJ) $(OUTPATH)lib_3des$(OBJ) $(OUTPATH)lib_des$(OBJ) $(OUTPATH)lib_idea$(OBJ) $(OUTPATH)lib_mdc$(OBJ) $(OUTPATH)lib_null$(OBJ) $(OUTPATH)lib_rc4$(OBJ) $(OUTPATH)idea$(OBJ) $(OUTPATH)3ecb_enc$(OBJ) $(OUTPATH)ecb_enc$(OBJ) $(OUTPATH)pcbc_enc$(OBJ) $(OUTPATH)set_key$(OBJ) $(OUTPATH)rc4$(OBJ) $(OUTPATH)shs$(OBJ)
|
||||||
|
|
||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* If no args are given, print a usage message and exit *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
default: $(LIBNAME)
|
||||||
|
|
||||||
|
love:
|
||||||
|
@$(ECHO) "Nicht wahr?"
|
||||||
|
@$(ECHO)
|
||||||
|
|
||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* Rules to build the encryption library *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
# Main directory
|
||||||
|
|
||||||
|
$(OUTPATH)crypt$(OBJ): crypt.h crypt.c
|
||||||
|
$(CC) objname $@ crypt.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_3des$(OBJ): crypt.h libdes/des.h lib_3des.c
|
||||||
|
$(CC) objname $@ lib_3des.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_des$(OBJ): crypt.h testdes.h libdes/des.h lib_des.c
|
||||||
|
$(CC) objname $@ lib_des.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_idea$(OBJ): crypt.h idea/idea.h testidea.h lib_idea.c
|
||||||
|
$(CC) objname $@ lib_idea.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_mdc$(OBJ): crypt.h mdc/shs.h lib_mdc.c
|
||||||
|
$(CC) objname $@ lib_mdc.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_null$(OBJ): crypt.h lib_null.c
|
||||||
|
$(CC) objname $@ lib_null.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_rc4$(OBJ): crypt.h testrc4.h rc4/rc4.h lib_rc4.c
|
||||||
|
$(CC) objname $@ lib_rc4.c
|
||||||
|
|
||||||
|
$(OUTPATH)test$(OBJ): crypt.h test.c
|
||||||
|
$(CC) objname $@ test.c
|
||||||
|
|
||||||
|
# idea subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)idea$(OBJ): idea/idea.h idea/idea.c
|
||||||
|
$(CC) objname $@ idea/idea.c
|
||||||
|
|
||||||
|
# libdes subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)3ecb_enc$(OBJ): libdes/des.h libdes/des_locl.h libdes/3ecb_enc.c
|
||||||
|
$(CC) objname $@ libdes/3ecb_enc.c
|
||||||
|
|
||||||
|
$(OUTPATH)ecb_enc$(OBJ): libdes/des.h libdes/des_locl.h libdes/spr.h libdes/version.h libdes/ecb_enc.c
|
||||||
|
$(CC) objname $@ libdes/ecb_enc.c
|
||||||
|
|
||||||
|
$(OUTPATH)pcbc_enc$(OBJ): libdes/des.h libdes/des_locl.h libdes/pcbc_enc.c
|
||||||
|
$(CC) objname $@ libdes/pcbc_enc.c
|
||||||
|
|
||||||
|
$(OUTPATH)set_key$(OBJ): libdes/des.h libdes/des_locl.h libdes/podd.h libdes/sk.h libdes/set_key.c
|
||||||
|
$(CC) objname $@ libdes/set_key.c
|
||||||
|
|
||||||
|
# rc4 subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)rc4$(OBJ): rc4/rc4.h rc4/rc4.c
|
||||||
|
$(CC) objname $@ rc4/rc4.c
|
||||||
|
|
||||||
|
# mdc subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)shs$(OBJ): mdc/shs.h mdc/shs.c
|
||||||
|
$(CC) objname $@ mdc/shs.c
|
||||||
|
|
||||||
|
# Create the library. The test program is also listed as a dependancy
|
||||||
|
# since we need to use OS-specific compiler options for it which a
|
||||||
|
# simple 'make test' won't give us (yuck).
|
||||||
|
|
||||||
|
$(LIBNAME): $(OBJS) $(OUTPATH)test$(OBJ)
|
||||||
|
oml -n -b $(LIBNAME) r $(OBJS)
|
||||||
|
|
||||||
|
# Link everything into a test program
|
||||||
|
|
||||||
|
test: $(LIBNAME) $(OUTPATH)test$(OBJ)
|
||||||
|
@$(LD) pname testcrypt $(OUTPATH)test$(OBJ) lib $(LIBNAME)
|
||||||
|
|
||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* Cleanup after make has finished *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
clean:
|
||||||
|
delete force \#?.o testcrypt $(LIBNAME)
|
||||||
Vendored
+215
@@ -0,0 +1,215 @@
|
|||||||
|
' A warning to parents that this programming language is unsuited for small
|
||||||
|
' children
|
||||||
|
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
'****************************************************************************
|
||||||
|
'* *
|
||||||
|
'* Encryption Algorithm Types/Modes *
|
||||||
|
'* *
|
||||||
|
'****************************************************************************
|
||||||
|
|
||||||
|
' The encryption algorithms we can use
|
||||||
|
|
||||||
|
Global Const CRYPT_ALGO_NONE = 0 ' No encryption
|
||||||
|
Global Const CRYPT_ALGO_MDCSHS = 1 ' MDC/SHS
|
||||||
|
Global Const CRYPT_ALGO_DES = 2 ' DES
|
||||||
|
Global Const CRYPT_ALGO_3DES = 3 ' Two-key triple DES
|
||||||
|
Global Const CRYPT_ALGO_IDEA = 4 ' IDEA
|
||||||
|
Global Const CRYPT_ALGO_RC4 = 5 ' RC4
|
||||||
|
Global Const CRYPT_ALGO_SAFER = 6 ' SAFER and SAFER-SK
|
||||||
|
Global Const CRYPT_ALGO_LAST = 7 ' Last possible crypt algo value
|
||||||
|
|
||||||
|
' The encryption modes we can use
|
||||||
|
|
||||||
|
Global Const CRYPT_MODE_NONE = 0 ' No encryption
|
||||||
|
Global Const CRYPT_MODE_STREAM = 1 ' Stream cipher
|
||||||
|
Global Const CRYPT_MODE_ECB = 2 ' ECB
|
||||||
|
Global Const CRYPT_MODE_CBC = 3 ' CBC
|
||||||
|
Global Const CRYPT_MODE_CFB = 4 ' CFB
|
||||||
|
Global Const CRYPT_MODE_OFB = 5 ' OFB
|
||||||
|
Global Const CRYPT_MODE_PCBC = 6 ' PCBC
|
||||||
|
Global Const CRYPT_MODE_LAST = 6 ' Last possible crypt algo value
|
||||||
|
|
||||||
|
'****************************************************************************
|
||||||
|
'* *
|
||||||
|
'* Library-Wide Constants and Definitions *
|
||||||
|
'* *
|
||||||
|
'****************************************************************************
|
||||||
|
|
||||||
|
' The maximum user key size - 2048 bits
|
||||||
|
|
||||||
|
Global Const CRYPT_MAX_KEYSIZE = 256
|
||||||
|
|
||||||
|
' The maximum IV size - 256 bits
|
||||||
|
|
||||||
|
Global Const CRYPT_MAX_IVSIZE = 64
|
||||||
|
|
||||||
|
' The maximum speed ratio for an encryption algorithm
|
||||||
|
|
||||||
|
Global Const CRYPT_MAX_SPEED = 1000
|
||||||
|
|
||||||
|
'****************************************************************************
|
||||||
|
'* *
|
||||||
|
'* Data Structures *
|
||||||
|
'* *
|
||||||
|
'****************************************************************************
|
||||||
|
|
||||||
|
' An encryption context. Note the order of the BYTE[] fields in this
|
||||||
|
' structure, which ensures they're aligned to the machine word size
|
||||||
|
|
||||||
|
Type CRYPT_INFO
|
||||||
|
' Basic information on the encryption we're using (a pointer to an
|
||||||
|
' internal data structure)
|
||||||
|
capabilityInfo As Long ' The encryption capability data
|
||||||
|
|
||||||
|
' User keying information. The user key is the key as entered by the
|
||||||
|
' user, the transformed user key is (for those algoriths which do this)
|
||||||
|
' the user key transformed by whatever key preprocessing method is used,
|
||||||
|
' stored in canonical form. The IV is the initial IV stored in canonical
|
||||||
|
' form
|
||||||
|
userKey As String * MAX_KEYSIZE ' User encryption key
|
||||||
|
transUserKey As String * MAX_KEYSIZE ' Transformed user key
|
||||||
|
iv As String * MAX_IVSIZE ' Initial IV
|
||||||
|
userKeyLength As Integer ' User encryption key length in bytes
|
||||||
|
ivLength As Integer ' IV length in bytes
|
||||||
|
keySet As Integer ' Whether the key is set up
|
||||||
|
ivSet As Integer ' Whether the IV is set up
|
||||||
|
|
||||||
|
' Keying information. The key is the raw encryption key stored in
|
||||||
|
' whatever form is required by the algorithm. This may be simply an
|
||||||
|
' endianness-adjusted form of the transformed key (in the case of
|
||||||
|
' algorithms like MDC/SHS) or a processed form of the user key (in the
|
||||||
|
' case of algorithms like DES or IDEA). The IV is the current working
|
||||||
|
' IV stored in an endianness-adjusted form. The ivCount is the number
|
||||||
|
' of bytes of IV in use, and may be used for various chaining modes.
|
||||||
|
' These fields may be unused if the algorithm is implemented in hardware
|
||||||
|
key As Long ' Pointer to internal working key
|
||||||
|
currentIV As String * MAX_IVSIZE ' Internal working IV
|
||||||
|
keyLength As Integer ' Internal key length in bytes
|
||||||
|
ivCount As Integer ' Internal IV count for chaining modes
|
||||||
|
|
||||||
|
' Private data needed by the algorithm
|
||||||
|
privateData As Long ' For private use
|
||||||
|
End Type
|
||||||
|
|
||||||
|
' Extra algorithm-specific information stored within a crypt context
|
||||||
|
|
||||||
|
Type CRYPT_INFO_MDCSHS
|
||||||
|
keySetupIterations As Integer ' No.iterations for user key setup
|
||||||
|
End Type
|
||||||
|
|
||||||
|
Type CRYPT_INFO_SAFER
|
||||||
|
rounds As Integer ' Number of encryption rounds
|
||||||
|
currentRounds As Integer ' Internal number of rounds for this key
|
||||||
|
useSaferSK As Integer ' Whether to use strengthened-key version
|
||||||
|
End Type
|
||||||
|
|
||||||
|
' Results returned from the encryption capability query
|
||||||
|
|
||||||
|
Type CRYPT_QUERY_INFO
|
||||||
|
' The algorithm, encryption mode, and algorithm name. Note that the
|
||||||
|
' algorithm name is a pointer to a C string, which current versions of
|
||||||
|
' Visual Basic can't handle when they're inside a structure. To use it,
|
||||||
|
' you need to extract it into a String in the VB program
|
||||||
|
cryptAlgo As Integer ' The encryption algorithm
|
||||||
|
cryptMode As Integer ' The encryption mode
|
||||||
|
algoName As Long ' The algorithm name
|
||||||
|
|
||||||
|
' The algorithm parameters
|
||||||
|
blockSize As Integer ' The basic block size of the algorithm
|
||||||
|
minKeySize As Integer ' Minimum key size in bytes
|
||||||
|
keySize As Integer ' Recommended key size in bytes
|
||||||
|
maxKeySize As Integer ' Maximum key size in bytes
|
||||||
|
minIVsize As Integer ' Minimum IV size in bytes
|
||||||
|
ivSize As Integer ' Recommended IV size in bytes
|
||||||
|
maxIVsize As Integer ' Maximum IV size in bytes
|
||||||
|
|
||||||
|
' Various algorithm characteristics
|
||||||
|
speed As Integer ' Speed relative to block copy
|
||||||
|
End Type
|
||||||
|
|
||||||
|
'****************************************************************************
|
||||||
|
'* *
|
||||||
|
'* Status Codes *
|
||||||
|
'* *
|
||||||
|
'****************************************************************************
|
||||||
|
|
||||||
|
' No error in function call
|
||||||
|
|
||||||
|
Global Const CRYPT_OK = 0 ' No error
|
||||||
|
|
||||||
|
' Generic internal error
|
||||||
|
|
||||||
|
Global Const CRYPT_ERROR = -1 ' Nonspecific error
|
||||||
|
|
||||||
|
' Failed self-test in encryption code
|
||||||
|
|
||||||
|
Global Const CRYPT_SELFTEST = -2 ' Failed self-test
|
||||||
|
|
||||||
|
' Error in parameters passed to function
|
||||||
|
|
||||||
|
Global Const CRYPT_BADPARM = -3 ' Generic bad argument to function
|
||||||
|
Global Const CRYPT_BADPARM1 = -4 ' Bad argument, parameter 1
|
||||||
|
Global Const CRYPT_BADPARM2 = -5 ' Bad argument, parameter 2
|
||||||
|
Global Const CRYPT_BADPARM3 = -6 ' Bad argument, parameter 3
|
||||||
|
Global Const CRYPT_BADPARM4 = -7 ' Bad argument, parameter 4
|
||||||
|
Global Const CRYPT_BADPARM5 = -8 ' Bad argument, parameter 5
|
||||||
|
Global Const CRYPT_BADPARM6 = -9 ' Bad argument, parameter 6
|
||||||
|
Global Const CRYPT_BADPARM7 = -10 ' Bad argument, parameter 7
|
||||||
|
Global Const CRYPT_BADPARM8 = -11 ' Bad argument, parameter 8
|
||||||
|
Global Const CRYPT_BADPARM9 = -12 ' Bad argument, parameter 9
|
||||||
|
Global Const CRYPT_BADPARM10 = -13 ' Bad argument, parameter 10
|
||||||
|
Global Const CRYPT_BADPARM11 = -14 ' Bad argument, parameter 11
|
||||||
|
Global Const CRYPT_BADPARM12 = -15 ' Bad argument, parameter 12
|
||||||
|
Global Const CRYPT_BADPARM13 = -16 ' Bad argument, parameter 13
|
||||||
|
Global Const CRYPT_BADPARM14 = -17 ' Bad argument, parameter 14
|
||||||
|
Global Const CRYPT_BADPARM15 = -18 ' Bad argument, parameter 15
|
||||||
|
|
||||||
|
' Errors due to insufficient resources
|
||||||
|
|
||||||
|
Global Const CRYPT_NOMEM = -19 ' Out of memory
|
||||||
|
Global Const CRYPT_NOTINITED = -20 ' Data has not been initialised
|
||||||
|
Global Const CRYPT_INITED = -21 ' Data has already been initialised
|
||||||
|
Global Const CRYPT_NOALGO = -22 ' Algorithm unavailable
|
||||||
|
Global Const CRYPT_NOMODE = -23 ' Encryption mode unavailable
|
||||||
|
Global Const CRYPT_NOKEY = -24 ' Key not initialised
|
||||||
|
Global Const CRYPT_NOIV = -25 ' IV not initialised
|
||||||
|
|
||||||
|
'****************************************************************************
|
||||||
|
'* *
|
||||||
|
'* Public Functions *
|
||||||
|
'* *
|
||||||
|
'****************************************************************************
|
||||||
|
|
||||||
|
' Initialise and shut down the encryption library
|
||||||
|
|
||||||
|
Declare Function initLibrary Lib "Crypt.Dll" () As Integer
|
||||||
|
Declare Function endLibrary Lib "Crypt.Dll" () As Integer
|
||||||
|
|
||||||
|
' Query the capabilities of the encryption library
|
||||||
|
|
||||||
|
Declare Function queryModeAvailability Lib "Crypt.Dll" (ByVal cryptAlgo As Integer, ByVal cryptMode As Integer) As Integer
|
||||||
|
Declare Function queryAlgoAvailability Lib "Crypt.Dll" (ByVal cryptAlgo As Integer) As Integer
|
||||||
|
Declare Function queryAlgoModeInformation Lib "Crypt.Dll" (ByVal cryptAlgo As Integer, ByVal cryptMode As Integer, cryptQueryInfo As CRYPT_QUERY_INFO) As Integer
|
||||||
|
Declare Function queryContextInformation Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, cryptQueryInfo As CRYPT_QUERY_INFO) As Integer
|
||||||
|
|
||||||
|
' Initialise and destroy an encryption context
|
||||||
|
|
||||||
|
Declare Function initCryptContext Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal cryptAlgo As Integer, ByVal cryptMode As Integer) As Integer
|
||||||
|
Declare Function initCryptContextEx Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal cryptAlgo As Integer, ByVal cryptMode As Integer, cryptInfoEx As Any) As Integer
|
||||||
|
Declare Function destroyCryptContext Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO) As Integer
|
||||||
|
|
||||||
|
' Load a user key into a crypt context
|
||||||
|
|
||||||
|
Declare Function loadCryptContext Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal key As String, ByVal keyLength As Integer) As Integer
|
||||||
|
|
||||||
|
' Load/retreive an IV into/from a crypt context
|
||||||
|
|
||||||
|
Declare Function loadIV Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal iv As String, ByVal length As Integer) As Integer
|
||||||
|
Declare Function retrieveIV Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal iv As String) As Integer
|
||||||
|
|
||||||
|
' Encrypt/decrypt a block of memory
|
||||||
|
|
||||||
|
Declare Function encryptBuffer Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal buffer As String, ByVal length As Integer) As Integer
|
||||||
|
Declare Function decryptBuffer Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal buffer As String, ByVal length As Integer) As Integer
|
||||||
Vendored
+1049
File diff suppressed because it is too large
Load Diff
Vendored
+421
@@ -0,0 +1,421 @@
|
|||||||
|
#ifndef _CRYPT_DEFINED
|
||||||
|
|
||||||
|
#define _CRYPT_DEFINED
|
||||||
|
|
||||||
|
/* Fixup for Windoze support. We need to include windows.h for various types
|
||||||
|
and prototypes needed for DLL's, and then fix up a type clash with a
|
||||||
|
Windows predefined type - for some bizarre reason BYTE and WORD are
|
||||||
|
unsigned, but LONG is signed */
|
||||||
|
|
||||||
|
#if defined( __WINDOWS__ )
|
||||||
|
#include <windows.h>
|
||||||
|
#undef LONG
|
||||||
|
#endif /* __WINDOWS__ */
|
||||||
|
|
||||||
|
/* Some encryption algorithms which rely on longints having 32 bits won't
|
||||||
|
work on 64- or 128-bit machines due to problems with sign extension and
|
||||||
|
whatnot. The following define can be used to enable special handling for
|
||||||
|
processors with a > 32 bit word size */
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#if LONG_MAX > 0xFFFFFFFFUL
|
||||||
|
#define _BIG_WORDS
|
||||||
|
#endif /* LONG > 32 bits */
|
||||||
|
|
||||||
|
/* Some useful types. We have to jump through all sorts of hoops for Windoze,
|
||||||
|
not helped by the fact that the method of detecting Windoze at compile
|
||||||
|
time changes with different versions of Visual C */
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
typedef int BOOLEAN;
|
||||||
|
#elif !( defined( WIN32 ) || defined( _WIN32 ) )
|
||||||
|
typedef int BOOLEAN;
|
||||||
|
#endif /* !( WIN32 || _WIN32 ) */
|
||||||
|
typedef unsigned char BYTE;
|
||||||
|
#ifndef __WINDOWS__
|
||||||
|
typedef unsigned short WORD;
|
||||||
|
#endif /* __WINDOWS__ */
|
||||||
|
#if defined( __WINDOWS__ ) && ( defined( WIN32 ) || defined( _WIN32 ) )
|
||||||
|
#pragma warning( disable : 4142 )
|
||||||
|
typedef unsigned long LONG;
|
||||||
|
#pragma warning( default : 4142 )
|
||||||
|
#ifdef _WIN32
|
||||||
|
/* Visual C 2.1 doesn't seem to like LONG being typedef'd to unsigned
|
||||||
|
no matter what you do, so we rely on the preprocessor to get rid of
|
||||||
|
the problem. Visual C 2.1 defined _WIN32 whereas 2.0 defined WIN32,
|
||||||
|
so we can use this to tell the two apart */
|
||||||
|
#define LONG unsigned long
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
#else
|
||||||
|
typedef unsigned long LONG;
|
||||||
|
#endif /* __WINDOWS__ && ( WIN32 || _WIN32 ) */
|
||||||
|
|
||||||
|
/* Boolean consants */
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define FALSE 0
|
||||||
|
#define TRUE !FALSE
|
||||||
|
#endif /* TRUE */
|
||||||
|
|
||||||
|
/* Machine-dependant types to allow use in special library types such as
|
||||||
|
DLL's */
|
||||||
|
|
||||||
|
#if defined( __WINDOWS__ ) && !( defined( WIN32 ) || defined( _WIN32 ) )
|
||||||
|
#define CPTR FAR * /* DLL pointer */
|
||||||
|
#define CRET int FAR PASCAL _export /* DLL return value */
|
||||||
|
#else
|
||||||
|
#define CPTR * /* General pointer */
|
||||||
|
#define CRET int /* General return value */
|
||||||
|
#endif /* __WINDOWS__ && !( WIN32 || _WIN32 ) */
|
||||||
|
|
||||||
|
/* Determine the processor endianness. Thanks to Shawn Clifford
|
||||||
|
<sysop@robot.nuceng.ufl.edu> for this trick.
|
||||||
|
|
||||||
|
NB: A number of compilers aren't tough enough for this test */
|
||||||
|
|
||||||
|
#if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All architectures currently supported by MSVC/Windows
|
||||||
|
* use little-endian byte ordering.
|
||||||
|
*/
|
||||||
|
#if defined(_M_IX86) || \
|
||||||
|
defined(_M_X64) || \
|
||||||
|
defined(_M_AMD64) || \
|
||||||
|
defined(_M_ARM) || \
|
||||||
|
defined(_M_ARM64) || \
|
||||||
|
defined(_M_ARM64EC)
|
||||||
|
|
||||||
|
#define LITTLE_ENDIAN
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error Cannot determine processor endianness for MSVC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(AMIGA)
|
||||||
|
|
||||||
|
#define BIG_ENDIAN
|
||||||
|
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
|
||||||
|
#ifdef BYTES_BIG_ENDIAN
|
||||||
|
#define BIG_ENDIAN
|
||||||
|
#else
|
||||||
|
#define LITTLE_ENDIAN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#error Cannot determine processor endianness - edit crypt.h and recompile
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Encryption Algorithm Types/Modes *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* The encryption algorithms we can use */
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CRYPT_ALGO_NONE, /* No encryption */
|
||||||
|
CRYPT_ALGO_MDCSHS, /* MDC/SHS */
|
||||||
|
CRYPT_ALGO_DES, /* DES */
|
||||||
|
CRYPT_ALGO_3DES, /* Two-key triple DES */
|
||||||
|
CRYPT_ALGO_IDEA, /* IDEA */
|
||||||
|
CRYPT_ALGO_RC4, /* RC4 */
|
||||||
|
CRYPT_ALGO_SAFER, /* SAFER */
|
||||||
|
|
||||||
|
CRYPT_ALGO_LAST /* Last possible crypt algo value */
|
||||||
|
} CRYPT_ALGO;
|
||||||
|
|
||||||
|
/* The encryption modes we can use */
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
/* No encryption */
|
||||||
|
CRYPT_MODE_NONE, /* No encryption */
|
||||||
|
|
||||||
|
/* Stream cipher modes */
|
||||||
|
CRYPT_MODE_STREAM, /* Stream cipher */
|
||||||
|
|
||||||
|
/* Block cipher modes */
|
||||||
|
CRYPT_MODE_ECB, /* ECB */
|
||||||
|
CRYPT_MODE_CBC, /* CBC */
|
||||||
|
CRYPT_MODE_CFB, /* CFB */
|
||||||
|
CRYPT_MODE_OFB, /* OFB */
|
||||||
|
CRYPT_MODE_PCBC, /* PCBC */
|
||||||
|
|
||||||
|
CRYPT_MODE_LAST /* Last possible crypt algo value */
|
||||||
|
} CRYPT_MODE;
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Library-Wide Constants and Definitions *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* The maximum user key size - 2048 bits */
|
||||||
|
|
||||||
|
#define CRYPT_MAX_KEYSIZE 256
|
||||||
|
|
||||||
|
/* The maximum IV size - 256 bits */
|
||||||
|
|
||||||
|
#define CRYPT_MAX_IVSIZE 64
|
||||||
|
|
||||||
|
/* The maximum speed ratio for an encryption algorithm */
|
||||||
|
|
||||||
|
#define CRYPT_MAX_SPEED 1000
|
||||||
|
|
||||||
|
/* A magic value indicating that the default setting for this parameter
|
||||||
|
should be used */
|
||||||
|
|
||||||
|
#define CRYPT_USE_DEFAULT -1
|
||||||
|
|
||||||
|
/* Macros to convert to and from the bit counts used for some encryption
|
||||||
|
parameters */
|
||||||
|
|
||||||
|
#define bitsToBytes(bits) ( ( bits ) >> 3 )
|
||||||
|
#define bytesToBits(bytes) ( ( bytes ) << 3 )
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Data Structures *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* The structure used to store internal information about the crypto library
|
||||||
|
capabilities. This information is used internally by the library and is
|
||||||
|
not available to users */
|
||||||
|
|
||||||
|
struct CI; /* Forward declaration for nested struct */
|
||||||
|
|
||||||
|
typedef struct CA {
|
||||||
|
/* Basic identification information for the algorithm */
|
||||||
|
CRYPT_ALGO cryptAlgo; /* The encryption algorithm */
|
||||||
|
CRYPT_MODE cryptMode; /* The encryption mode */
|
||||||
|
int blockSize; /* The basic block size of the algorithm */
|
||||||
|
char *name; /* Algorithm name */
|
||||||
|
int speed; /* Speed relative to block copy */
|
||||||
|
|
||||||
|
/* Keying information */
|
||||||
|
int minKeySize; /* Minimum key size in bytes */
|
||||||
|
int keySize; /* Recommended key size in bytes */
|
||||||
|
int maxKeySize; /* Maximum key size in bytes */
|
||||||
|
|
||||||
|
/* IV information */
|
||||||
|
int minIVsize; /* Minimum IV size in bytes */
|
||||||
|
int ivSize; /* Recommended IV size in bytes */
|
||||||
|
int maxIVsize; /* Maximum IV size in bytes */
|
||||||
|
|
||||||
|
/* The functions for implementing the algorithm */
|
||||||
|
int ( *selfTestFunction )( void );
|
||||||
|
int ( *initFunction )( struct CI CPTR cryptInfo );
|
||||||
|
int ( *initExFunction )( struct CI CPTR cryptInfo, void CPTR cryptInfoEx );
|
||||||
|
int ( *endFunction )( struct CI CPTR cryptInfo );
|
||||||
|
int ( *initKeyFunction )( struct CI CPTR cryptInfo );
|
||||||
|
int ( *initIVFunction )( struct CI CPTR cryptInfo );
|
||||||
|
int ( *encryptFunction )( struct CI CPTR cryptInfo, void CPTR buffer, int length );
|
||||||
|
int ( *decryptFunction )( struct CI CPTR cryptInfo, void CPTR buffer, int length );
|
||||||
|
|
||||||
|
/* The results of the self-test for this algorithm */
|
||||||
|
int selfTestStatus;
|
||||||
|
|
||||||
|
/* The next record in the list */
|
||||||
|
struct CA *next; /* Pointer to the next record */
|
||||||
|
} CAPABILITY_INFO;
|
||||||
|
|
||||||
|
/* An encryption context. Note the order of the BYTE[] fields in this
|
||||||
|
structure, which ensures they're aligned to the machine word size */
|
||||||
|
|
||||||
|
typedef struct CI {
|
||||||
|
/* Basic information on the encryption we're using */
|
||||||
|
CAPABILITY_INFO *capabilityInfo;/* The encryption capability data */
|
||||||
|
|
||||||
|
/* User keying information. The user key is the key as entered by the
|
||||||
|
user, the transformed user key is (for those algoriths which do
|
||||||
|
this) the user key transformed by whatever key preprocessing method
|
||||||
|
is used, stored in canonical form. The IV is the initial IV stored
|
||||||
|
in canonical form */
|
||||||
|
BYTE userKey[ CRYPT_MAX_KEYSIZE ]; /* User encryption key */
|
||||||
|
BYTE transUserKey[ CRYPT_MAX_KEYSIZE ]; /* Transformed user key */
|
||||||
|
BYTE iv[ CRYPT_MAX_IVSIZE ]; /* Initial IV */
|
||||||
|
int userKeyLength; /* User encryption key length in bytes */
|
||||||
|
int ivLength; /* IV length in bytes */
|
||||||
|
BOOLEAN keySet; /* Whether the key is set up */
|
||||||
|
BOOLEAN ivSet; /* Whether the IV is set up */
|
||||||
|
|
||||||
|
/* Keying information. The key is the raw encryption key stored in
|
||||||
|
whatever form is required by the algorithm. This may be simply an
|
||||||
|
endianness-adjusted form of the transformed key (in the case of
|
||||||
|
algorithms like MDC/SHS) or a processed form of the user key (in the
|
||||||
|
case of algorithms like DES or IDEA). The IV is the current working
|
||||||
|
IV stored in an endianness-adjusted form. The ivCount is the number
|
||||||
|
of bytes of IV in use, and may be used for various chaining modes.
|
||||||
|
These fields may be unused if the algorithm is implemented in hardware */
|
||||||
|
void *key; /* Internal working key */
|
||||||
|
BYTE currentIV[ CRYPT_MAX_IVSIZE ]; /* Internal working IV */
|
||||||
|
int keyLength; /* Internal key length in bytes */
|
||||||
|
int ivCount; /* Internal IV count for chaining modes */
|
||||||
|
|
||||||
|
/* Private data needed by the algorithm */
|
||||||
|
void *privateData; /* For private use */
|
||||||
|
|
||||||
|
/* A check value so we can determine whether the crypt context has been
|
||||||
|
initialised or not. This is needed because passing in an
|
||||||
|
uninitialised block of memory as a crypt context can lead to problems
|
||||||
|
when we try to dereference wild pointers */
|
||||||
|
LONG checkValue;
|
||||||
|
} CRYPT_INFO;
|
||||||
|
|
||||||
|
/* Extra algorithm-specific information stored within a crypt context. Set
|
||||||
|
the parameter values to CRYPT_USE_DEFAULT to use the default values for
|
||||||
|
this algorithm */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int keySetupIterations; /* No.iterations for user key setup */
|
||||||
|
} CRYPT_INFO_MDCSHS;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int rounds; /* Number of encryption rounds */
|
||||||
|
int currentRounds; /* Internal number of rounds for this key */
|
||||||
|
BOOLEAN useSaferSK; /* Whether to use strengthened-key version */
|
||||||
|
} CRYPT_INFO_SAFER;
|
||||||
|
|
||||||
|
/* Results returned from the encryption capability query */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* The algorithm, encryption mode, and algorithm name */
|
||||||
|
CRYPT_ALGO cryptAlgo; /* The encryption algorithm */
|
||||||
|
CRYPT_MODE cryptMode; /* The encryption mode */
|
||||||
|
char *algoName; /* The algorithm name */
|
||||||
|
|
||||||
|
/* The algorithm parameters */
|
||||||
|
int blockSize; /* The basic block size of the algorithm */
|
||||||
|
int minKeySize; /* Minimum key size in bytes */
|
||||||
|
int keySize; /* Recommended key size in bytes */
|
||||||
|
int maxKeySize; /* Maximum key size in bytes */
|
||||||
|
int minIVsize; /* Minimum IV size in bytes */
|
||||||
|
int ivSize; /* Recommended IV size in bytes */
|
||||||
|
int maxIVsize; /* Maximum IV size in bytes */
|
||||||
|
|
||||||
|
/* Various algorithm characteristics */
|
||||||
|
int speed; /* Speed relative to block copy */
|
||||||
|
} CRYPT_QUERY_INFO;
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Status Codes *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* No error in function call */
|
||||||
|
|
||||||
|
#define CRYPT_OK 0 /* No error */
|
||||||
|
|
||||||
|
/* Generic internal error */
|
||||||
|
|
||||||
|
#define CRYPT_ERROR -1 /* Nonspecific error */
|
||||||
|
|
||||||
|
/* Failed self-test in encryption code */
|
||||||
|
|
||||||
|
#define CRYPT_SELFTEST -2 /* Failed self-test */
|
||||||
|
|
||||||
|
/* Error in parameters passed to function */
|
||||||
|
|
||||||
|
#define CRYPT_BADPARM -3 /* Generic bad argument to function */
|
||||||
|
#define CRYPT_BADPARM1 -4 /* Bad argument, parameter 1 */
|
||||||
|
#define CRYPT_BADPARM2 -5 /* Bad argument, parameter 2 */
|
||||||
|
#define CRYPT_BADPARM3 -6 /* Bad argument, parameter 3 */
|
||||||
|
#define CRYPT_BADPARM4 -7 /* Bad argument, parameter 4 */
|
||||||
|
#define CRYPT_BADPARM5 -8 /* Bad argument, parameter 5 */
|
||||||
|
#define CRYPT_BADPARM6 -9 /* Bad argument, parameter 6 */
|
||||||
|
#define CRYPT_BADPARM7 -10 /* Bad argument, parameter 7 */
|
||||||
|
#define CRYPT_BADPARM8 -11 /* Bad argument, parameter 8 */
|
||||||
|
#define CRYPT_BADPARM9 -12 /* Bad argument, parameter 9 */
|
||||||
|
#define CRYPT_BADPARM10 -13 /* Bad argument, parameter 10 */
|
||||||
|
#define CRYPT_BADPARM11 -14 /* Bad argument, parameter 11 */
|
||||||
|
#define CRYPT_BADPARM12 -15 /* Bad argument, parameter 12 */
|
||||||
|
#define CRYPT_BADPARM13 -16 /* Bad argument, parameter 13 */
|
||||||
|
#define CRYPT_BADPARM14 -17 /* Bad argument, parameter 14 */
|
||||||
|
#define CRYPT_BADPARM15 -18 /* Bad argument, parameter 15 */
|
||||||
|
|
||||||
|
/* Errors due to insufficient resources */
|
||||||
|
|
||||||
|
#define CRYPT_NOMEM -19 /* Out of memory */
|
||||||
|
#define CRYPT_NOTINITED -20 /* Data has not been initialised */
|
||||||
|
#define CRYPT_INITED -21 /* Data has already been initialised */
|
||||||
|
#define CRYPT_NOALGO -22 /* Algorithm unavailable */
|
||||||
|
#define CRYPT_NOMODE -23 /* Encryption mode unavailable */
|
||||||
|
#define CRYPT_NOKEY -24 /* Key not initialised */
|
||||||
|
#define CRYPT_NOIV -25 /* IV not initialised */
|
||||||
|
|
||||||
|
/* A macro to detect an error return value */
|
||||||
|
|
||||||
|
#define isStatusError(status) ( ( status ) < CRYPT_OK )
|
||||||
|
#define isStatusOK(status) ( ( status ) == CRYPT_OK )
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Private Functions *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Functions to convert the endianness from the canonical form to the
|
||||||
|
internal form. These are only needed on little-endian machines */
|
||||||
|
|
||||||
|
#ifdef LITTLE_ENDIAN
|
||||||
|
void longReverse( LONG *buffer, int count );
|
||||||
|
void wordReverse( WORD *buffer, int count );
|
||||||
|
#else
|
||||||
|
#define longReverse(x,y)
|
||||||
|
#define wordReverse(x,y)
|
||||||
|
#endif /* LITTLE_ENDIAN */
|
||||||
|
|
||||||
|
/* A free() which sanitises the memory before it frees it */
|
||||||
|
|
||||||
|
void secureFree( void **pointer, int count );
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Public Functions *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Initialise and shut down the encryption library */
|
||||||
|
|
||||||
|
CRET initLibrary( void );
|
||||||
|
CRET endLibrary( void );
|
||||||
|
|
||||||
|
/* Query the capabilities of the encryption library */
|
||||||
|
|
||||||
|
CRET queryModeAvailability( CRYPT_ALGO cryptAlgo, CRYPT_MODE cryptMode );
|
||||||
|
CRET queryAlgoAvailability( CRYPT_ALGO cryptAlgo );
|
||||||
|
CRET queryAlgoModeInformation( CRYPT_ALGO cryptAlgo, CRYPT_MODE cryptMode, CRYPT_QUERY_INFO CPTR cryptQueryInfo );
|
||||||
|
CRET queryContextInformation( CRYPT_INFO CPTR cryptInfo, CRYPT_QUERY_INFO CPTR cryptQueryInfo );
|
||||||
|
|
||||||
|
/* Initialise and destroy an encryption context */
|
||||||
|
|
||||||
|
CRET initCryptContext( CRYPT_INFO CPTR cryptInfo, CRYPT_ALGO cryptAlgo, CRYPT_MODE cryptMode );
|
||||||
|
CRET initCryptContextEx( CRYPT_INFO CPTR cryptInfo, CRYPT_ALGO cryptAlgo, CRYPT_MODE cryptMode, void *cryptInfoEx );
|
||||||
|
CRET destroyCryptContext( CRYPT_INFO CPTR cryptInfo );
|
||||||
|
|
||||||
|
/* Load a user key into a crypt context */
|
||||||
|
|
||||||
|
CRET loadCryptContext( CRYPT_INFO CPTR cryptInfo, void CPTR key, int keyLength );
|
||||||
|
|
||||||
|
/* Load/retreive an IV into/from a crypt context */
|
||||||
|
|
||||||
|
CRET loadIV( CRYPT_INFO CPTR cryptInfo, void CPTR iv, int length );
|
||||||
|
CRET retrieveIV( CRYPT_INFO CPTR cryptInfo, void CPTR iv );
|
||||||
|
|
||||||
|
/* Encrypt/decrypt a block of memory */
|
||||||
|
|
||||||
|
CRET encryptBuffer( CRYPT_INFO CPTR cryptInfo, void CPTR buffer, int length );
|
||||||
|
CRET decryptBuffer( CRYPT_INFO CPTR cryptInfo, void CPTR buffer, int length );
|
||||||
|
|
||||||
|
#endif /* _CRYPT_DEFINED */
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
; Definition file for Crypt DLL
|
||||||
|
|
||||||
|
LIBRARY CRYPTNT
|
||||||
|
DESCRIPTION 'Encryption DLL'
|
||||||
|
CODE PRELOAD MOVEABLE DISCARDABLE
|
||||||
|
DATA PRELOAD MOVEABLE SINGLE
|
||||||
|
HEAPSIZE 8192
|
||||||
|
EXPORTS initLibrary
|
||||||
|
endLibrary
|
||||||
|
queryModeAvailability
|
||||||
|
queryAlgoAvailability
|
||||||
|
queryAlgoModeInformation
|
||||||
|
queryContextInformation
|
||||||
|
initCryptContext
|
||||||
|
initCryptContextEx
|
||||||
|
destroyCryptContext
|
||||||
|
loadCryptContext
|
||||||
|
loadIV
|
||||||
|
retrieveIV
|
||||||
|
encryptBuffer
|
||||||
|
decryptBuffer
|
||||||
|
|
||||||
|
IMPORTS
|
||||||
+391
@@ -0,0 +1,391 @@
|
|||||||
|
# Microsoft Visual C++ Generated NMAKE File, Format Version 2.00
|
||||||
|
# ** DO NOT EDIT **
|
||||||
|
|
||||||
|
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||||
|
|
||||||
|
!IF "$(CFG)" == ""
|
||||||
|
CFG=Win32 Debug
|
||||||
|
!MESSAGE No configuration specified. Defaulting to Win32 Debug.
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
|
!IF "$(CFG)" != "Win32 Release" && "$(CFG)" != "Win32 Debug"
|
||||||
|
!MESSAGE Invalid configuration "$(CFG)" specified.
|
||||||
|
!MESSAGE You can specify a configuration when running NMAKE on this makefile
|
||||||
|
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||||
|
!MESSAGE
|
||||||
|
!MESSAGE NMAKE /f "CRYPTNT.MAK" CFG="Win32 Debug"
|
||||||
|
!MESSAGE
|
||||||
|
!MESSAGE Possible choices for configuration are:
|
||||||
|
!MESSAGE
|
||||||
|
!MESSAGE "Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||||
|
!MESSAGE "Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
||||||
|
!MESSAGE
|
||||||
|
!ERROR An invalid configuration is specified.
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# Begin Project
|
||||||
|
# PROP Target_Last_Scanned "Win32 Debug"
|
||||||
|
MTL=MkTypLib.exe
|
||||||
|
CPP=cl.exe
|
||||||
|
RSC=rc.exe
|
||||||
|
|
||||||
|
!IF "$(CFG)" == "Win32 Release"
|
||||||
|
|
||||||
|
# PROP BASE Use_MFC 0
|
||||||
|
# PROP BASE Use_Debug_Libraries 0
|
||||||
|
# PROP BASE Output_Dir "WinRel"
|
||||||
|
# PROP BASE Intermediate_Dir "WinRel"
|
||||||
|
# PROP Use_MFC 0
|
||||||
|
# PROP Use_Debug_Libraries 0
|
||||||
|
# PROP Output_Dir "WinRel"
|
||||||
|
# PROP Intermediate_Dir "WinRel"
|
||||||
|
OUTDIR=.\WinRel
|
||||||
|
INTDIR=.\WinRel
|
||||||
|
|
||||||
|
ALL : .\cryptnt.dll $(OUTDIR)/CRYPTNT.bsc
|
||||||
|
|
||||||
|
$(OUTDIR) :
|
||||||
|
if not exist $(OUTDIR)/nul mkdir $(OUTDIR)
|
||||||
|
|
||||||
|
# ADD BASE MTL /nologo /D "NDEBUG" /win32
|
||||||
|
# ADD MTL /nologo /D "NDEBUG" /win32
|
||||||
|
MTL_PROJ=/nologo /D "NDEBUG" /win32
|
||||||
|
# ADD BASE CPP /nologo /MT /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c
|
||||||
|
# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /c
|
||||||
|
# SUBTRACT CPP /YX /Fr
|
||||||
|
CPP_PROJ=/nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D\
|
||||||
|
"__WINDOWS__" /Fo$(INTDIR)/ /c
|
||||||
|
CPP_OBJS=.\WinRel/
|
||||||
|
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||||
|
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||||
|
RSC_PROJ=/l 0x409 /fo$(INTDIR)/"CRYPTNT.res" /d "NDEBUG"
|
||||||
|
BSC32=bscmake.exe
|
||||||
|
BSC32_SBRS= \
|
||||||
|
|
||||||
|
# ADD BASE BSC32 /nologo
|
||||||
|
# ADD BSC32 /nologo
|
||||||
|
BSC32_FLAGS=/nologo /o$(OUTDIR)/"CRYPTNT.bsc"
|
||||||
|
|
||||||
|
$(OUTDIR)/CRYPTNT.bsc : $(OUTDIR) $(BSC32_SBRS)
|
||||||
|
LINK32=link.exe
|
||||||
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:windows /DLL /MACHINE:I386
|
||||||
|
# ADD LINK32 kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /NOLOGO /VERSION:0,99 /SUBSYSTEM:windows /DLL /PDB:none /MACHINE:I386 /OUT:"cryptnt.dll"
|
||||||
|
LINK32_FLAGS=kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib\
|
||||||
|
shell32.lib /NOLOGO /VERSION:0,99 /SUBSYSTEM:windows /DLL /PDB:none\
|
||||||
|
/MACHINE:I386 /DEF:".\CRYPTNT.DEF" /OUT:"cryptnt.dll"\
|
||||||
|
/IMPLIB:$(OUTDIR)/"CRYPTNT.lib"
|
||||||
|
DEF_FILE=.\CRYPTNT.DEF
|
||||||
|
LINK32_OBJS= \
|
||||||
|
$(INTDIR)/SHS.OBJ \
|
||||||
|
$(INTDIR)/LIB_IDEA.OBJ \
|
||||||
|
$(INTDIR)/SET_KEY.OBJ \
|
||||||
|
$(INTDIR)/CRYPTNT.res \
|
||||||
|
$(INTDIR)/3ECB_ENC.OBJ \
|
||||||
|
$(INTDIR)/IDEA.OBJ \
|
||||||
|
$(INTDIR)/CRYPT.OBJ \
|
||||||
|
$(INTDIR)/LIB_MDC.OBJ \
|
||||||
|
$(INTDIR)/LIB_RC4.OBJ \
|
||||||
|
$(INTDIR)/LIB_3DES.OBJ \
|
||||||
|
$(INTDIR)/LIB_NULL.OBJ \
|
||||||
|
$(INTDIR)/LIB_DES.OBJ \
|
||||||
|
$(INTDIR)/RC4.OBJ \
|
||||||
|
$(INTDIR)/ECB_ENC.OBJ \
|
||||||
|
$(INTDIR)/PCBC_ENC.OBJ \
|
||||||
|
$(INTDIR)/SAFER.OBJ \
|
||||||
|
$(INTDIR)/LIB_SAFR.OBJ
|
||||||
|
|
||||||
|
.\cryptnt.dll : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS)
|
||||||
|
$(LINK32) @<<
|
||||||
|
$(LINK32_FLAGS) $(LINK32_OBJS)
|
||||||
|
<<
|
||||||
|
|
||||||
|
!ELSEIF "$(CFG)" == "Win32 Debug"
|
||||||
|
|
||||||
|
# PROP BASE Use_MFC 0
|
||||||
|
# PROP BASE Use_Debug_Libraries 1
|
||||||
|
# PROP BASE Output_Dir "WinDebug"
|
||||||
|
# PROP BASE Intermediate_Dir "WinDebug"
|
||||||
|
# PROP Use_MFC 0
|
||||||
|
# PROP Use_Debug_Libraries 1
|
||||||
|
# PROP Output_Dir "WinDebug"
|
||||||
|
# PROP Intermediate_Dir "WinDebug"
|
||||||
|
OUTDIR=.\WinDebug
|
||||||
|
INTDIR=.\WinDebug
|
||||||
|
|
||||||
|
ALL : .\cryptnt.dll $(OUTDIR)/CRYPTNT.bsc
|
||||||
|
|
||||||
|
$(OUTDIR) :
|
||||||
|
if not exist $(OUTDIR)/nul mkdir $(OUTDIR)
|
||||||
|
|
||||||
|
# ADD BASE MTL /nologo /D "_DEBUG" /win32
|
||||||
|
# ADD MTL /nologo /D "_DEBUG" /win32
|
||||||
|
MTL_PROJ=/nologo /D "_DEBUG" /win32
|
||||||
|
# ADD BASE CPP /nologo /MT /W3 /GX /Zi /YX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /c
|
||||||
|
# ADD CPP /nologo /MT /W3 /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /c
|
||||||
|
# SUBTRACT CPP /YX /Fr
|
||||||
|
CPP_PROJ=/nologo /MT /W3 /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D\
|
||||||
|
"__WINDOWS__" /Fo$(INTDIR)/ /Fd$(OUTDIR)/"CRYPTNT.pdb" /c
|
||||||
|
CPP_OBJS=.\WinDebug/
|
||||||
|
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||||
|
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||||
|
RSC_PROJ=/l 0x409 /fo$(INTDIR)/"CRYPTNT.res" /d "_DEBUG"
|
||||||
|
BSC32=bscmake.exe
|
||||||
|
BSC32_SBRS= \
|
||||||
|
|
||||||
|
# ADD BASE BSC32 /nologo
|
||||||
|
# ADD BSC32 /nologo
|
||||||
|
BSC32_FLAGS=/nologo /o$(OUTDIR)/"CRYPTNT.bsc"
|
||||||
|
|
||||||
|
$(OUTDIR)/CRYPTNT.bsc : $(OUTDIR) $(BSC32_SBRS)
|
||||||
|
LINK32=link.exe
|
||||||
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /NOLOGO /SUBSYSTEM:windows /DLL /DEBUG /MACHINE:I386
|
||||||
|
# ADD LINK32 kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /NOLOGO /VERSION:0,99 /SUBSYSTEM:windows /DLL /PDB:none /DEBUG /MACHINE:I386 /OUT:"cryptnt.dll"
|
||||||
|
LINK32_FLAGS=kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib\
|
||||||
|
shell32.lib /NOLOGO /VERSION:0,99 /SUBSYSTEM:windows /DLL /PDB:none /DEBUG\
|
||||||
|
/MACHINE:I386 /DEF:".\CRYPTNT.DEF" /OUT:"cryptnt.dll"\
|
||||||
|
/IMPLIB:$(OUTDIR)/"CRYPTNT.lib"
|
||||||
|
DEF_FILE=.\CRYPTNT.DEF
|
||||||
|
LINK32_OBJS= \
|
||||||
|
$(INTDIR)/SHS.OBJ \
|
||||||
|
$(INTDIR)/LIB_IDEA.OBJ \
|
||||||
|
$(INTDIR)/SET_KEY.OBJ \
|
||||||
|
$(INTDIR)/CRYPTNT.res \
|
||||||
|
$(INTDIR)/3ECB_ENC.OBJ \
|
||||||
|
$(INTDIR)/IDEA.OBJ \
|
||||||
|
$(INTDIR)/CRYPT.OBJ \
|
||||||
|
$(INTDIR)/LIB_MDC.OBJ \
|
||||||
|
$(INTDIR)/LIB_RC4.OBJ \
|
||||||
|
$(INTDIR)/LIB_3DES.OBJ \
|
||||||
|
$(INTDIR)/LIB_NULL.OBJ \
|
||||||
|
$(INTDIR)/LIB_DES.OBJ \
|
||||||
|
$(INTDIR)/RC4.OBJ \
|
||||||
|
$(INTDIR)/ECB_ENC.OBJ \
|
||||||
|
$(INTDIR)/PCBC_ENC.OBJ \
|
||||||
|
$(INTDIR)/SAFER.OBJ \
|
||||||
|
$(INTDIR)/LIB_SAFR.OBJ
|
||||||
|
|
||||||
|
.\cryptnt.dll : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS)
|
||||||
|
$(LINK32) @<<
|
||||||
|
$(LINK32_FLAGS) $(LINK32_OBJS)
|
||||||
|
<<
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
|
.c{$(CPP_OBJS)}.obj:
|
||||||
|
$(CPP) $(CPP_PROJ) $<
|
||||||
|
|
||||||
|
.cpp{$(CPP_OBJS)}.obj:
|
||||||
|
$(CPP) $(CPP_PROJ) $<
|
||||||
|
|
||||||
|
.cxx{$(CPP_OBJS)}.obj:
|
||||||
|
$(CPP) $(CPP_PROJ) $<
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# Begin Group "Source Files"
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\MDC\SHS.C
|
||||||
|
DEP_SHS_C=\
|
||||||
|
.\CRYPT.H\
|
||||||
|
.\MDC\SHS.H
|
||||||
|
|
||||||
|
$(INTDIR)/SHS.OBJ : $(SOURCE) $(DEP_SHS_C) $(INTDIR)
|
||||||
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\LIB_IDEA.C
|
||||||
|
DEP_LIB_I=\
|
||||||
|
.\CRYPT.H\
|
||||||
|
.\IDEA\IDEA.H\
|
||||||
|
.\TESTIDEA.H
|
||||||
|
|
||||||
|
$(INTDIR)/LIB_IDEA.OBJ : $(SOURCE) $(DEP_LIB_I) $(INTDIR)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\LIBDES\SET_KEY.C
|
||||||
|
DEP_SET_K=\
|
||||||
|
.\LIBDES\DES_LOCL.H\
|
||||||
|
.\LIBDES\PODD.H\
|
||||||
|
.\LIBDES\SK.H\
|
||||||
|
.\LIBDES\DES.H
|
||||||
|
|
||||||
|
$(INTDIR)/SET_KEY.OBJ : $(SOURCE) $(DEP_SET_K) $(INTDIR)
|
||||||
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CRYPTNT.RC
|
||||||
|
|
||||||
|
$(INTDIR)/CRYPTNT.res : $(SOURCE) $(INTDIR)
|
||||||
|
$(RSC) $(RSC_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CRYPTNT.DEF
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\LIBDES\3ECB_ENC.C
|
||||||
|
DEP_3ECB_=\
|
||||||
|
.\LIBDES\DES_LOCL.H\
|
||||||
|
.\LIBDES\DES.H
|
||||||
|
|
||||||
|
$(INTDIR)/3ECB_ENC.OBJ : $(SOURCE) $(DEP_3ECB_) $(INTDIR)
|
||||||
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\IDEA\IDEA.C
|
||||||
|
DEP_IDEA_=\
|
||||||
|
.\CRYPT.H\
|
||||||
|
.\IDEA\IDEA.H
|
||||||
|
|
||||||
|
$(INTDIR)/IDEA.OBJ : $(SOURCE) $(DEP_IDEA_) $(INTDIR)
|
||||||
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\CRYPT.C
|
||||||
|
DEP_CRYPT=\
|
||||||
|
.\CRYPT.H
|
||||||
|
|
||||||
|
$(INTDIR)/CRYPT.OBJ : $(SOURCE) $(DEP_CRYPT) $(INTDIR)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\LIB_MDC.C
|
||||||
|
DEP_LIB_M=\
|
||||||
|
.\CRYPT.H\
|
||||||
|
.\MDC\SHS.H
|
||||||
|
|
||||||
|
$(INTDIR)/LIB_MDC.OBJ : $(SOURCE) $(DEP_LIB_M) $(INTDIR)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\LIB_RC4.C
|
||||||
|
DEP_LIB_R=\
|
||||||
|
.\CRYPT.H\
|
||||||
|
.\RC4\RC4.H\
|
||||||
|
.\TESTRC4.H
|
||||||
|
|
||||||
|
$(INTDIR)/LIB_RC4.OBJ : $(SOURCE) $(DEP_LIB_R) $(INTDIR)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\LIB_3DES.C
|
||||||
|
DEP_LIB_3=\
|
||||||
|
.\CRYPT.H\
|
||||||
|
.\LIBDES\DES.H
|
||||||
|
|
||||||
|
$(INTDIR)/LIB_3DES.OBJ : $(SOURCE) $(DEP_LIB_3) $(INTDIR)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\LIB_NULL.C
|
||||||
|
DEP_LIB_N=\
|
||||||
|
.\CRYPT.H
|
||||||
|
|
||||||
|
$(INTDIR)/LIB_NULL.OBJ : $(SOURCE) $(DEP_LIB_N) $(INTDIR)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\LIB_DES.C
|
||||||
|
DEP_LIB_D=\
|
||||||
|
.\CRYPT.H\
|
||||||
|
.\LIBDES\DES.H\
|
||||||
|
.\TESTDES.H
|
||||||
|
|
||||||
|
$(INTDIR)/LIB_DES.OBJ : $(SOURCE) $(DEP_LIB_D) $(INTDIR)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\RC4\RC4.C
|
||||||
|
DEP_RC4_C=\
|
||||||
|
.\RC4\RC4.H
|
||||||
|
|
||||||
|
$(INTDIR)/RC4.OBJ : $(SOURCE) $(DEP_RC4_C) $(INTDIR)
|
||||||
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\LIBDES\ECB_ENC.C
|
||||||
|
DEP_ECB_E=\
|
||||||
|
.\LIBDES\DES_LOCL.H\
|
||||||
|
.\LIBDES\SPR.H\
|
||||||
|
.\LIBDES\VERSION.H\
|
||||||
|
.\LIBDES\DES.H
|
||||||
|
|
||||||
|
$(INTDIR)/ECB_ENC.OBJ : $(SOURCE) $(DEP_ECB_E) $(INTDIR)
|
||||||
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\LIBDES\PCBC_ENC.C
|
||||||
|
DEP_PCBC_=\
|
||||||
|
.\LIBDES\DES_LOCL.H\
|
||||||
|
.\LIBDES\DES.H
|
||||||
|
|
||||||
|
$(INTDIR)/PCBC_ENC.OBJ : $(SOURCE) $(DEP_PCBC_) $(INTDIR)
|
||||||
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\SAFER\SAFER.C
|
||||||
|
DEP_SAFER=\
|
||||||
|
.\SAFER\SAFER.H
|
||||||
|
|
||||||
|
$(INTDIR)/SAFER.OBJ : $(SOURCE) $(DEP_SAFER) $(INTDIR)
|
||||||
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
################################################################################
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\LIB_SAFR.C
|
||||||
|
DEP_LIB_S=\
|
||||||
|
.\CRYPT.H\
|
||||||
|
.\SAFER\SAFER.H\
|
||||||
|
.\TESTSAFR.H
|
||||||
|
|
||||||
|
$(INTDIR)/LIB_SAFR.OBJ : $(SOURCE) $(DEP_LIB_S) $(INTDIR)
|
||||||
|
|
||||||
|
# End Source File
|
||||||
|
# End Group
|
||||||
|
# End Project
|
||||||
|
################################################################################
|
||||||
Vendored
+33
@@ -0,0 +1,33 @@
|
|||||||
|
; Resource file for the Windows 32-bit encryption library
|
||||||
|
|
||||||
|
#include <ver.h>
|
||||||
|
|
||||||
|
VS_VERSION_INFO VERSIONINFO
|
||||||
|
FILEVERSION 0,0,0,99
|
||||||
|
PRODUCTVERSION 0,0,0,99
|
||||||
|
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
||||||
|
FILEFLAGS 0
|
||||||
|
FILEOS VOS_NT
|
||||||
|
FILETYPE VFT_DLL
|
||||||
|
FILESUBTYPE VFT2_UNKNOWN
|
||||||
|
BEGIN
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x0409, 1252 ; US English, Windoze charset
|
||||||
|
END
|
||||||
|
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "040904E4" ; US English, Windoze charset data
|
||||||
|
BEGIN
|
||||||
|
VALUE "CompanyName", "Peter Gutmann et al.\0"
|
||||||
|
VALUE "FileDescription", "Encryption library.\0"
|
||||||
|
VALUE "FileVersion", "0.99\0"
|
||||||
|
VALUE "InternalName", "CRYPT.DLL\0"
|
||||||
|
VALUE "LegalCopyright", "Copyright \251 Peter Gutmann, Eric Young, Colin Plumb 1994, 1995.\0"
|
||||||
|
VALUE "OriginalFilename", "CRYPT.DLL\0"
|
||||||
|
VALUE "ProductName", "Encryption library.\0"
|
||||||
|
VALUE "ProductVersion", "0.99\0"
|
||||||
|
END
|
||||||
|
END
|
||||||
|
END
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
; Definition file for Crypt DLL
|
||||||
|
|
||||||
|
LIBRARY CRYPT
|
||||||
|
DESCRIPTION 'Encryption DLL'
|
||||||
|
EXETYPE WINDOWS 3
|
||||||
|
CODE PRELOAD MOVEABLE DISCARDABLE
|
||||||
|
DATA PRELOAD MOVEABLE SINGLE
|
||||||
|
HEAPSIZE 8192
|
||||||
|
EXPORTS initLibrary
|
||||||
|
endLibrary
|
||||||
|
queryModeAvailability
|
||||||
|
queryAlgoAvailability
|
||||||
|
queryAlgoModeInformation
|
||||||
|
queryContextInformation
|
||||||
|
initCryptContext
|
||||||
|
initCryptContextEx
|
||||||
|
destroyCryptContext
|
||||||
|
loadCryptContext
|
||||||
|
loadIV
|
||||||
|
retrieveIV
|
||||||
|
encryptBuffer
|
||||||
|
decryptBuffer
|
||||||
|
|
||||||
|
IMPORTS
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
; Definition file for Crypt DLL
|
||||||
|
|
||||||
|
LIBRARY CRYPT
|
||||||
|
DESCRIPTION 'Encryption DLL'
|
||||||
|
EXETYPE WINDOWS 3
|
||||||
|
CODE PRELOAD MOVEABLE DISCARDABLE
|
||||||
|
DATA PRELOAD MOVEABLE SINGLE
|
||||||
|
HEAPSIZE 8192
|
||||||
|
EXPORTS initLibrary
|
||||||
|
endLibrary
|
||||||
|
queryModeAvailability
|
||||||
|
queryAlgoAvailability
|
||||||
|
queryAlgoModeInformation
|
||||||
|
queryContextInformation
|
||||||
|
initCryptContext
|
||||||
|
initCryptContextEx
|
||||||
|
destroyCryptContext
|
||||||
|
loadCryptContext
|
||||||
|
loadIV
|
||||||
|
retrieveIV
|
||||||
|
encryptBuffer
|
||||||
|
decryptBuffer
|
||||||
|
|
||||||
|
IMPORTS
|
||||||
+255
@@ -0,0 +1,255 @@
|
|||||||
|
# Microsoft Visual C++ generated build script - Do not modify
|
||||||
|
|
||||||
|
PROJ = CRYPTWIN
|
||||||
|
DEBUG = 0
|
||||||
|
PROGTYPE = 1
|
||||||
|
CALLER =
|
||||||
|
ARGS =
|
||||||
|
DLLS =
|
||||||
|
D_RCDEFINES = -d_DEBUG
|
||||||
|
R_RCDEFINES = -dNDEBUG
|
||||||
|
ORIGIN = MSVC
|
||||||
|
ORIGIN_VER = 1.00
|
||||||
|
PROJPATH = C:\WORK\CRYPT\
|
||||||
|
USEMFC = 0
|
||||||
|
CC = cl
|
||||||
|
CPP = cl
|
||||||
|
CXX = cl
|
||||||
|
CCREATEPCHFLAG =
|
||||||
|
CPPCREATEPCHFLAG =
|
||||||
|
CUSEPCHFLAG =
|
||||||
|
CPPUSEPCHFLAG =
|
||||||
|
FIRSTC = CRYPT.C
|
||||||
|
FIRSTCPP =
|
||||||
|
RC = rc
|
||||||
|
CFLAGS_D_WDLL = /nologo /G2 /W3 /Zi /ALw /Od /D "_DEBUG" /D "__WINDOWS__" /GD /Fd"CRYPT.PDB"
|
||||||
|
CFLAGS_R_WDLL = /nologo /G2 /W3 /ALw /O1 /D "NDEBUG" /D "__WINDOWS__" /GD
|
||||||
|
LFLAGS_D_WDLL = /NOLOGO /NOD /NOE /PACKC:61440 /ALIGN:16 /ONERROR:NOEXE /CO
|
||||||
|
LFLAGS_R_WDLL = /NOLOGO /NOD /NOE /PACKC:61440 /ALIGN:16 /ONERROR:NOEXE
|
||||||
|
LIBS_D_WDLL = oldnames libw ldllcew
|
||||||
|
LIBS_R_WDLL = oldnames libw ldllcew
|
||||||
|
RCFLAGS = /nologo
|
||||||
|
RESFLAGS = /nologo
|
||||||
|
RUNFLAGS =
|
||||||
|
DEFFILE = CRYPTWIN.DEF
|
||||||
|
OBJS_EXT =
|
||||||
|
LIBS_EXT =
|
||||||
|
!if "$(DEBUG)" == "1"
|
||||||
|
CFLAGS = $(CFLAGS_D_WDLL)
|
||||||
|
LFLAGS = $(LFLAGS_D_WDLL)
|
||||||
|
LIBS = $(LIBS_D_WDLL)
|
||||||
|
MAPFILE = nul
|
||||||
|
RCDEFINES = $(D_RCDEFINES)
|
||||||
|
!else
|
||||||
|
CFLAGS = $(CFLAGS_R_WDLL)
|
||||||
|
LFLAGS = $(LFLAGS_R_WDLL)
|
||||||
|
LIBS = $(LIBS_R_WDLL)
|
||||||
|
MAPFILE = nul
|
||||||
|
RCDEFINES = $(R_RCDEFINES)
|
||||||
|
!endif
|
||||||
|
!if [if exist MSVC.BND del MSVC.BND]
|
||||||
|
!endif
|
||||||
|
SBRS = CRYPT.SBR \
|
||||||
|
LIB_3DES.SBR \
|
||||||
|
LIB_IDEA.SBR \
|
||||||
|
LIB_DES.SBR \
|
||||||
|
LIB_MDC.SBR \
|
||||||
|
LIB_NULL.SBR \
|
||||||
|
LIB_RC4.SBR \
|
||||||
|
IDEA.SBR \
|
||||||
|
3ECB_ENC.SBR \
|
||||||
|
ECB_ENC.SBR \
|
||||||
|
PCBC_ENC.SBR \
|
||||||
|
SET_KEY.SBR \
|
||||||
|
RC4.SBR \
|
||||||
|
SHS.SBR \
|
||||||
|
SAFER.SBR \
|
||||||
|
LIB_SAFR.SBR
|
||||||
|
|
||||||
|
|
||||||
|
CRYPT_DEP = c:\work\crypt\crypt.h
|
||||||
|
|
||||||
|
|
||||||
|
LIB_3DES_DEP = c:\work\crypt\crypt.h \
|
||||||
|
c:\work\crypt\libdes/des.h
|
||||||
|
|
||||||
|
|
||||||
|
LIB_IDEA_DEP = c:\work\crypt\crypt.h \
|
||||||
|
c:\work\crypt\idea/idea.h \
|
||||||
|
c:\work\crypt\testidea.h
|
||||||
|
|
||||||
|
|
||||||
|
LIB_DES_DEP = c:\work\crypt\crypt.h \
|
||||||
|
c:\work\crypt\libdes/des.h \
|
||||||
|
c:\work\crypt\testdes.h
|
||||||
|
|
||||||
|
|
||||||
|
LIB_MDC_DEP = c:\work\crypt\crypt.h \
|
||||||
|
c:\work\crypt\mdc/shs.h
|
||||||
|
|
||||||
|
|
||||||
|
LIB_NULL_DEP = c:\work\crypt\crypt.h
|
||||||
|
|
||||||
|
|
||||||
|
LIB_RC4_DEP = c:\work\crypt\crypt.h \
|
||||||
|
c:\work\crypt\rc4/rc4.h \
|
||||||
|
c:\work\crypt\testrc4.h
|
||||||
|
|
||||||
|
|
||||||
|
CRYPTWIN_RCDEP =
|
||||||
|
|
||||||
|
IDEA_DEP = c:\work\crypt\crypt.h \
|
||||||
|
c:\work\crypt\idea\idea.h \
|
||||||
|
idea/idea.h
|
||||||
|
|
||||||
|
|
||||||
|
3ECB_ENC_DEP = c:\work\crypt\libdes\des_locl.h \
|
||||||
|
c:\work\crypt\libdes\des.h \
|
||||||
|
libdes/des.h \
|
||||||
|
libdes/des_locl.h
|
||||||
|
|
||||||
|
|
||||||
|
ECB_ENC_DEP = c:\work\crypt\libdes\des_locl.h \
|
||||||
|
c:\work\crypt\libdes\des.h \
|
||||||
|
libdes/des.h \
|
||||||
|
c:\work\crypt\libdes\spr.h \
|
||||||
|
c:\work\crypt\libdes\version.h \
|
||||||
|
libdes/des_locl.h \
|
||||||
|
libdes/spr.h \
|
||||||
|
libdes/version.h
|
||||||
|
|
||||||
|
|
||||||
|
PCBC_ENC_DEP = c:\work\crypt\libdes\des_locl.h \
|
||||||
|
c:\work\crypt\libdes\des.h \
|
||||||
|
libdes/des.h \
|
||||||
|
libdes/des_locl.h
|
||||||
|
|
||||||
|
|
||||||
|
SET_KEY_DEP = c:\work\crypt\libdes\des_locl.h \
|
||||||
|
c:\work\crypt\libdes\des.h \
|
||||||
|
libdes/des.h \
|
||||||
|
c:\work\crypt\libdes\podd.h \
|
||||||
|
c:\work\crypt\libdes\sk.h \
|
||||||
|
libdes/des_locl.h \
|
||||||
|
libdes/podd.h \
|
||||||
|
libdes/sk.h
|
||||||
|
|
||||||
|
|
||||||
|
RC4_DEP = c:\work\crypt\rc4\rc4.h \
|
||||||
|
rc4/rc4.h
|
||||||
|
|
||||||
|
|
||||||
|
SHS_DEP = c:\work\crypt\crypt.h \
|
||||||
|
c:\work\crypt\mdc\shs.h \
|
||||||
|
mdc/shs.h
|
||||||
|
|
||||||
|
|
||||||
|
SAFER_DEP = c:\work\crypt\safer\safer.h \
|
||||||
|
safer/safer.h
|
||||||
|
|
||||||
|
|
||||||
|
LIB_SAFR_DEP = c:\work\crypt\crypt.h \
|
||||||
|
c:\work\crypt\safer/safer.h \
|
||||||
|
c:\work\crypt\testsafr.h
|
||||||
|
|
||||||
|
|
||||||
|
all: $(PROJ).DLL
|
||||||
|
|
||||||
|
CRYPT.OBJ: CRYPT.C $(CRYPT_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CCREATEPCHFLAG) /c CRYPT.C
|
||||||
|
|
||||||
|
LIB_3DES.OBJ: LIB_3DES.C $(LIB_3DES_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c LIB_3DES.C
|
||||||
|
|
||||||
|
LIB_IDEA.OBJ: LIB_IDEA.C $(LIB_IDEA_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c LIB_IDEA.C
|
||||||
|
|
||||||
|
LIB_DES.OBJ: LIB_DES.C $(LIB_DES_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c LIB_DES.C
|
||||||
|
|
||||||
|
LIB_MDC.OBJ: LIB_MDC.C $(LIB_MDC_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c LIB_MDC.C
|
||||||
|
|
||||||
|
LIB_NULL.OBJ: LIB_NULL.C $(LIB_NULL_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c LIB_NULL.C
|
||||||
|
|
||||||
|
LIB_RC4.OBJ: LIB_RC4.C $(LIB_RC4_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c LIB_RC4.C
|
||||||
|
|
||||||
|
CRYPTWIN.RES: CRYPTWIN.RC $(CRYPTWIN_RCDEP)
|
||||||
|
$(RC) $(RCFLAGS) $(RCDEFINES) -r CRYPTWIN.RC
|
||||||
|
|
||||||
|
IDEA.OBJ: IDEA\IDEA.C $(IDEA_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c IDEA\IDEA.C
|
||||||
|
|
||||||
|
3ECB_ENC.OBJ: LIBDES\3ECB_ENC.C $(3ECB_ENC_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c LIBDES\3ECB_ENC.C
|
||||||
|
|
||||||
|
ECB_ENC.OBJ: LIBDES\ECB_ENC.C $(ECB_ENC_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c LIBDES\ECB_ENC.C
|
||||||
|
|
||||||
|
PCBC_ENC.OBJ: LIBDES\PCBC_ENC.C $(PCBC_ENC_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c LIBDES\PCBC_ENC.C
|
||||||
|
|
||||||
|
SET_KEY.OBJ: LIBDES\SET_KEY.C $(SET_KEY_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c LIBDES\SET_KEY.C
|
||||||
|
|
||||||
|
RC4.OBJ: RC4\RC4.C $(RC4_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c RC4\RC4.C
|
||||||
|
|
||||||
|
SHS.OBJ: MDC\SHS.C $(SHS_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c MDC\SHS.C
|
||||||
|
|
||||||
|
SAFER.OBJ: SAFER\SAFER.C $(SAFER_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c SAFER\SAFER.C
|
||||||
|
|
||||||
|
LIB_SAFR.OBJ: LIB_SAFR.C $(LIB_SAFR_DEP)
|
||||||
|
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c LIB_SAFR.C
|
||||||
|
|
||||||
|
|
||||||
|
$(PROJ).DLL:: CRYPTWIN.RES
|
||||||
|
|
||||||
|
$(PROJ).DLL:: CRYPT.OBJ LIB_3DES.OBJ LIB_IDEA.OBJ LIB_DES.OBJ LIB_MDC.OBJ LIB_NULL.OBJ \
|
||||||
|
LIB_RC4.OBJ IDEA.OBJ 3ECB_ENC.OBJ ECB_ENC.OBJ PCBC_ENC.OBJ SET_KEY.OBJ RC4.OBJ SHS.OBJ \
|
||||||
|
SAFER.OBJ LIB_SAFR.OBJ $(OBJS_EXT) $(DEFFILE)
|
||||||
|
echo >NUL @<<$(PROJ).CRF
|
||||||
|
CRYPT.OBJ +
|
||||||
|
LIB_3DES.OBJ +
|
||||||
|
LIB_IDEA.OBJ +
|
||||||
|
LIB_DES.OBJ +
|
||||||
|
LIB_MDC.OBJ +
|
||||||
|
LIB_NULL.OBJ +
|
||||||
|
LIB_RC4.OBJ +
|
||||||
|
IDEA.OBJ +
|
||||||
|
3ECB_ENC.OBJ +
|
||||||
|
ECB_ENC.OBJ +
|
||||||
|
PCBC_ENC.OBJ +
|
||||||
|
SET_KEY.OBJ +
|
||||||
|
RC4.OBJ +
|
||||||
|
SHS.OBJ +
|
||||||
|
SAFER.OBJ +
|
||||||
|
LIB_SAFR.OBJ +
|
||||||
|
$(OBJS_EXT)
|
||||||
|
$(PROJ).DLL
|
||||||
|
$(MAPFILE)
|
||||||
|
G:\MSVC15\LIB\+
|
||||||
|
G:\MSVC15\MFC\LIB\+
|
||||||
|
$(LIBS)
|
||||||
|
$(DEFFILE);
|
||||||
|
<<
|
||||||
|
link $(LFLAGS) @$(PROJ).CRF
|
||||||
|
$(RC) $(RESFLAGS) CRYPTWIN.RES $@
|
||||||
|
@copy $(PROJ).CRF MSVC.BND
|
||||||
|
implib /nowep $(PROJ).LIB $(PROJ).DLL
|
||||||
|
|
||||||
|
$(PROJ).DLL:: CRYPTWIN.RES
|
||||||
|
if not exist MSVC.BND $(RC) $(RESFLAGS) CRYPTWIN.RES $@
|
||||||
|
|
||||||
|
run: $(PROJ).DLL
|
||||||
|
$(PROJ) $(RUNFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
$(PROJ).BSC: $(SBRS)
|
||||||
|
bscmake @<<
|
||||||
|
/o$@ $(SBRS)
|
||||||
|
<<
|
||||||
+33
@@ -0,0 +1,33 @@
|
|||||||
|
; Resource file for the encryption library
|
||||||
|
|
||||||
|
#include <ver.h>
|
||||||
|
|
||||||
|
VS_VERSION_INFO VERSIONINFO
|
||||||
|
FILEVERSION 0,0,0,99
|
||||||
|
PRODUCTVERSION 0,0,0,99
|
||||||
|
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
||||||
|
FILEFLAGS 0
|
||||||
|
FILEOS VOS_DOS_WINDOWS16
|
||||||
|
FILETYPE VFT_DLL
|
||||||
|
FILESUBTYPE VFT2_UNKNOWN
|
||||||
|
BEGIN
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x0409, 1252 ; US English, Windoze charset
|
||||||
|
END
|
||||||
|
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "040904E4" ; US English, Windoze charset data
|
||||||
|
BEGIN
|
||||||
|
VALUE "CompanyName", "Peter Gutmann et al.\0"
|
||||||
|
VALUE "FileDescription", "Encryption library.\0"
|
||||||
|
VALUE "FileVersion", "0.99\0"
|
||||||
|
VALUE "InternalName", "CRYPT.DLL\0"
|
||||||
|
VALUE "LegalCopyright", "Copyright \251 Peter Gutmann, Eric Young, Colin Plumb 1994, 1995.\0"
|
||||||
|
VALUE "OriginalFilename", "CRYPT.DLL\0"
|
||||||
|
VALUE "ProductName", "Encryption library.\0"
|
||||||
|
VALUE "ProductVersion", "0.99\0"
|
||||||
|
END
|
||||||
|
END
|
||||||
|
END
|
||||||
Vendored
+613
@@ -0,0 +1,613 @@
|
|||||||
|
After much procrastinating I'm finally ready to release the initial version of
|
||||||
|
my encryption library. I wrote this in response to random requests I keep
|
||||||
|
seeing in various newsgroups for encryption libraries, usually with no
|
||||||
|
responses. This library provides a (hopefully) universal interface to all
|
||||||
|
kinds of conventional-key encryption algorithms in an easy-to-use manner. The
|
||||||
|
library is divided into two parts:
|
||||||
|
|
||||||
|
1. Routines to query the library capabilities.
|
||||||
|
2. Routines to perform the en/decryption.
|
||||||
|
|
||||||
|
The library currently provides the following encryption algorithms and modes:
|
||||||
|
|
||||||
|
MDC/SHS CFB
|
||||||
|
DES ECB, CBC, CFB, OFB, PCBC
|
||||||
|
3DES ECB, CBC, CFB, OFB
|
||||||
|
IDEA ECB, CBC, CFB, OFB
|
||||||
|
RC4
|
||||||
|
SAFER ECB, CBC, CFB, OFB
|
||||||
|
SAFER-SK ECB, CBC, CFB, OFB
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
1. The Visual Basic interface hasn't been tested much. If someone could do
|
||||||
|
a Delphi interface and a VBX or OCX version that'd be nice.
|
||||||
|
|
||||||
|
2. A proper configure script with everything would be nice for Unix users.
|
||||||
|
Anyone want to create one of these?
|
||||||
|
|
||||||
|
3. Optimised asm implementations of some of the routines would be useful.
|
||||||
|
There are 80x86 and 68K asm routines included for IDEA and RC4, but I
|
||||||
|
haven't had time to tie them into the code yet. I have 386+ asm code for
|
||||||
|
SHA, but need to tie that in as well. Volunteers?
|
||||||
|
|
||||||
|
|
||||||
|
Requirements for a Standard Encryption Library
|
||||||
|
----------------------------------------------
|
||||||
|
|
||||||
|
- It should be idiot-proof.
|
||||||
|
|
||||||
|
It's quite difficult to implement insecure encryption using this code without
|
||||||
|
actually trying.
|
||||||
|
|
||||||
|
- It should provide extensive error checking.
|
||||||
|
|
||||||
|
Each parameter and function call is checked for errors before any actions are
|
||||||
|
performed, with error reporting down to the level of individual parameters.
|
||||||
|
|
||||||
|
- It should be portable.
|
||||||
|
|
||||||
|
The library is written entirely in ANSI C, with hooks for certain OS-specific
|
||||||
|
oddities such as Windows/OS/2 dynamic link libraries. The only external
|
||||||
|
routines used are ones from <string.h> and one call from <time.h>.
|
||||||
|
|
||||||
|
- It should be extendable.
|
||||||
|
|
||||||
|
The library provides the capability to add encryption capabilities at runtime
|
||||||
|
(currently only partially implemented, since the interface is somewhat messy
|
||||||
|
- you need to pass in about 15 parameters to do it).
|
||||||
|
|
||||||
|
- It should be free of silly restrictions.
|
||||||
|
|
||||||
|
This software is distributed as copyrighted freeware, with copyrights on
|
||||||
|
individual encryption modules being held by the contributing authors. You
|
||||||
|
are free to use the code in any way you want, with the following
|
||||||
|
restrictions:
|
||||||
|
|
||||||
|
If you make any changes to the code, you should send a copy of the changes
|
||||||
|
to the author or authors to allow them to integrate the changes into the
|
||||||
|
code. This is to allow a central consistent version to be maintained.
|
||||||
|
|
||||||
|
If you use the library as part of a product, you should offer a copy to the
|
||||||
|
author or authors of the library routines you are using. This is to let
|
||||||
|
the authors know that their work is being usefully applied.
|
||||||
|
|
||||||
|
Any commercial software you create with this code may not be merely a set
|
||||||
|
or subset of the encryption libraries, with or without minor added
|
||||||
|
functionality. This is to stop people adding their own wrappers and
|
||||||
|
selling it as "their" encryption product.
|
||||||
|
|
||||||
|
These terms are pretty much identical the the library GPL, which seem to be
|
||||||
|
about the least restrictive usage terms around apart from outright public
|
||||||
|
domain software.
|
||||||
|
|
||||||
|
- It should be buzzword-complete.
|
||||||
|
|
||||||
|
The library is written in C, but is basically laid out as a C++ class
|
||||||
|
library. It can work as a static library, a shared library, or a dynamic
|
||||||
|
link library. It'll even work with things like Visual Basic.
|
||||||
|
|
||||||
|
|
||||||
|
Library Basics
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Like the standard C file I/O libraries which work with FILE objects, this
|
||||||
|
library works with an "encryption context" of type CRYPT_INFO. To encrypt
|
||||||
|
data, you create an encryption context, load a user key into it, en/decrypt
|
||||||
|
data, and destroy it when you've finished. This concept lends itself to
|
||||||
|
implementation either as a C++ class or as C routines. Throughout this
|
||||||
|
document all examples are given in C, translation to C++ is a simple step.
|
||||||
|
|
||||||
|
The overall library structure is as follows:
|
||||||
|
|
||||||
|
Library core Plug-in
|
||||||
|
modules
|
||||||
|
+---------------+------------+
|
||||||
|
| | MDC/SHS |
|
||||||
|
| +------------+
|
||||||
|
| | DES |
|
||||||
|
| +------------+
|
||||||
|
/ \ | Crypt | Triple DES |
|
||||||
|
User / ---- \ | +------------+
|
||||||
|
Programs \ ---- / | Library | IDEA |
|
||||||
|
\ / | +------------+
|
||||||
|
| API | RC4 |
|
||||||
|
| +------------+
|
||||||
|
| | Safer |
|
||||||
|
| +------------+
|
||||||
|
| | others |
|
||||||
|
+---------------+------------+
|
||||||
|
|
||||||
|
The library API serves as an interface to a range of plug-in encryption modules
|
||||||
|
which allow encryption algorithms to be added in a fairly transparent manner.
|
||||||
|
The standardised API allows any of the algorithms and modes supported by the
|
||||||
|
library to be used with a minimum of coding effort. As such the main function
|
||||||
|
of the library is to provide a standard, portable, easy-to-use interface
|
||||||
|
between the underlying encryption routines and the user software.
|
||||||
|
|
||||||
|
|
||||||
|
Portability
|
||||||
|
-----------
|
||||||
|
|
||||||
|
All data made accessible through the library API is in big-endian format. The
|
||||||
|
library automatically takes care of endianness conversion to the form used by
|
||||||
|
the local system in a manner invisible to the end user.
|
||||||
|
|
||||||
|
All code is plain ANSI C, with no machine or OS-specific functions or calls
|
||||||
|
being used.
|
||||||
|
|
||||||
|
|
||||||
|
Creating/Destroying Encryption Contexts
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
When you create an encryption context, you must specify the encryption
|
||||||
|
algorithm and mode you want to use for that context. The encryption algorithms
|
||||||
|
and modes are given in the crypt.h file, and are updated along with the library
|
||||||
|
itself. For example, to create and destroy an encryption context for DES in
|
||||||
|
CBC mode, you would use the following code:
|
||||||
|
|
||||||
|
CRYPT_INFO cryptInfo;
|
||||||
|
|
||||||
|
initCryptContext( &cryptInfo, CRYPT_ALGO_DES, CRYPT_MODE_CBC );
|
||||||
|
|
||||||
|
/* Perform en/decryption */
|
||||||
|
|
||||||
|
endCryptContext( &cryptInfo );
|
||||||
|
|
||||||
|
The initCryptContext() and endCryptContext() functions take care of issues like
|
||||||
|
initialization, memory management, and erasure of data after use.
|
||||||
|
|
||||||
|
|
||||||
|
Loading Keys into Encryption Contexts
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
Once an encryption context has been created, you need to load a key into it.
|
||||||
|
This is done with the loadCryptContext() function. For example to load the key
|
||||||
|
"Secret key" into the previously-created encryption context you would use:
|
||||||
|
|
||||||
|
loadCryptContext( &cryptInfo, "Secret key", 10 );
|
||||||
|
|
||||||
|
Some hardware modules which enforce red/black seperation will not allow
|
||||||
|
plaintext keys to pass across the library interface. In this case the key
|
||||||
|
parameter passed to loadCryptContext() will be a key selector or key encryption
|
||||||
|
key to be passed to the underlying hardware. For example to pass a key
|
||||||
|
selector to a key stored inside a DES hardware module you would use:
|
||||||
|
|
||||||
|
loadCryptContext( &cryptInfo, &keySelector, sizeof( keySelector ) );
|
||||||
|
|
||||||
|
You can also load an IV into the context, although for encryption you would
|
||||||
|
usually leave this to the library to perform automatically. To load an IV you
|
||||||
|
would use:
|
||||||
|
|
||||||
|
loadIV( &cryptInfo, iv, ivSize );
|
||||||
|
|
||||||
|
To retrieve an IV which has been generated by the library you would use:
|
||||||
|
|
||||||
|
retrieveIV( &cryptInfo, iv );
|
||||||
|
|
||||||
|
The loadCryptContext(), loadIV(), and retrieveIV() functions take care of
|
||||||
|
issues like initialization, memory management, endianness conversion, and key
|
||||||
|
setup.
|
||||||
|
|
||||||
|
If you need to reserver space for keys and IV's, you can use the
|
||||||
|
CRYPT_MAX_KEYSIZE and CRYPT_MAX_IVSIZE defines from crypt.h to determine the
|
||||||
|
mount of memory you need. No key or IV used by the library will ever need more
|
||||||
|
storage than the settings given in these defines.
|
||||||
|
|
||||||
|
|
||||||
|
Encrypting/Decrypting Data
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Now that the encryption context and (if necessary) IV are set up, you're ready
|
||||||
|
to encrypt or decrypt data. To encrypt or decrypt a block of data you use:
|
||||||
|
|
||||||
|
encryptBuffer( &cryptInfo, buffer, length );
|
||||||
|
|
||||||
|
and:
|
||||||
|
|
||||||
|
decryptBuffer( &cryptInfo, buffer, length );
|
||||||
|
|
||||||
|
If a block encryption mode is being used, these functions will recognise a call
|
||||||
|
with length == 0 as a courtesy call to indicate that this is the last data
|
||||||
|
block and will take whatever special action is necessary for this case.
|
||||||
|
|
||||||
|
|
||||||
|
Extended Initialization
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
The initCryptContext() has a companion function initCryptContextEx() which may
|
||||||
|
be used to perform an extended, algorithm-specific initialisation. The second
|
||||||
|
parameter passed to the function is an algorithm-dependant structure used to
|
||||||
|
specify extra information to be used in the initalisation. Not all algorithms
|
||||||
|
will support extended initialisation parameters. If they are supported, the
|
||||||
|
structures have the name CRYPT_INFO_<algorithm_name>, and are laid out as
|
||||||
|
follows:
|
||||||
|
|
||||||
|
Structure CRYPT_INFO_MDCSHS:
|
||||||
|
|
||||||
|
/* The number of iterations used during the key setup process triggered
|
||||||
|
by a loadCryptContext() call. Using a high value (500 or more) will
|
||||||
|
greatly slow down password-guessing attacks by making the key setup
|
||||||
|
process painfully slow. Values in the range of 50-100 are recommended for
|
||||||
|
most systems */
|
||||||
|
int keySetupIterations;
|
||||||
|
|
||||||
|
Structure CRYPT_INFO_SAFER:
|
||||||
|
|
||||||
|
/* The number of rounds of encryption. The default settings are 6 rounds for
|
||||||
|
SAFER-K64, 8 rounds for SAFER-SK64, and 10 rounds for SAFER-K128 and
|
||||||
|
SAFER-SK128 */
|
||||||
|
int rounds;
|
||||||
|
|
||||||
|
/* Whether to use SAFER or SAFER-SK. The default is to use the original
|
||||||
|
algorithm SAFER. SAFER-SK is a version which improves the key schedule to
|
||||||
|
eliminate some possible weaknesses when SAFER is used as a keyed hash
|
||||||
|
function */
|
||||||
|
BOOLEAN useSaferSK;
|
||||||
|
|
||||||
|
|
||||||
|
Error Checking
|
||||||
|
--------------
|
||||||
|
|
||||||
|
When the library is initialised, each of the built-in encryption algorithms
|
||||||
|
goes through a self-test procedure which checks the implementation using
|
||||||
|
standard test vectors and methods given with the algorithm specification
|
||||||
|
(typically FIPS publications, ANSI standards, or standard reference
|
||||||
|
implementations). This self-test is used to verify that each encryption
|
||||||
|
algorithm is performing as required.
|
||||||
|
|
||||||
|
Each function in the library performs extensive error checking (although
|
||||||
|
monitoring of error codes has been left out in the following code samples for
|
||||||
|
readability). The file TEST.C, included with the crypt library, includes
|
||||||
|
better error handling than the short examples below.
|
||||||
|
|
||||||
|
For functions which complete with no error, the library will return CRYPT_OK.
|
||||||
|
For functions which complete with some form of error internal to the library
|
||||||
|
itself, the library will return CRYPT_ERROR (this situation should never occur
|
||||||
|
and should be reported to the library authors).
|
||||||
|
|
||||||
|
If the encryption code or hardware fails an internal self-test, the library
|
||||||
|
will return CRYPT_SELFTEST if an attempt is made to use the encryption module
|
||||||
|
which failed the self-test.
|
||||||
|
|
||||||
|
If there is a problem with a parameter passed to a library function, the
|
||||||
|
library will return one of CRYPT_BADPARM1 ... CRYPT_BADPARM15 depending on the
|
||||||
|
parameter in error, or simply CRYPT_BADPARM if it cannot resolve the exact
|
||||||
|
parameter error type.
|
||||||
|
|
||||||
|
General resource and programming errors are flagged by the return values
|
||||||
|
CRYPT_NOMEM for a lack of memory, CRYPT_NOTINITED if you try to use an
|
||||||
|
encryption context hasn't been initialised yet or which has been destroyed,
|
||||||
|
CRYPT_INITED when you try to re-initialise an encryption context or re-load an
|
||||||
|
encryption key, CRYPT_NOALGO or CRYPT_NOMODE if the requested encryption
|
||||||
|
algorithm or mode is unavailable, CRYPT_NOKEY if the encryption key hasn't been
|
||||||
|
loaded into an encryption context, and CRYPT_NOIV if the IV hasn't been loaded
|
||||||
|
into an encryption context.
|
||||||
|
|
||||||
|
The macros isStatusError() and isStatusOK() can be used to determine whether a
|
||||||
|
return value denotes an error condition, for example:
|
||||||
|
|
||||||
|
int status;
|
||||||
|
|
||||||
|
status = initCryptContext( &cryptInfo, CRYPT_ALGO_IDEA, CRYPT_MODE_CFB );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
/* Perform error processing */
|
||||||
|
|
||||||
|
|
||||||
|
Examples
|
||||||
|
--------
|
||||||
|
|
||||||
|
The following examples have had error checking removed for readability. See
|
||||||
|
the test code in TEST.C for an example with full error checking.
|
||||||
|
|
||||||
|
To encrypt a buffer using DES in CFB mode with the password 0x12345678ABCDEF:
|
||||||
|
|
||||||
|
CRYPT_INFO cryptInfo;
|
||||||
|
BYTE key[] = { 0x12, 0x34, 0x56, 0x78, 0xAB, 0xCD, 0xEF };
|
||||||
|
|
||||||
|
/* Load the key, encrypt the buffer (the IV is automatically generated
|
||||||
|
if we don't specify one, it can be obtained with retrieveIV()), and
|
||||||
|
destroy the encryption context */
|
||||||
|
initCryptContext( &cryptInfo, CRYPT_ALGO_DES, CRYPT_MODE_CFB );
|
||||||
|
loadCryptContext( &cryptInfo, key, sizeof( key ) );
|
||||||
|
encryptBuffer( &cryptInfo, buffer, length );
|
||||||
|
destroyCryptContext( &cryptInfo );
|
||||||
|
|
||||||
|
To hash an arbitrary-size passphrase down to the one used by a particular
|
||||||
|
cryptosystem (in this case triple DES) using MDC/SHS:
|
||||||
|
|
||||||
|
CRYPT_QUERY_INFO cryptQueryInfo;
|
||||||
|
CRYPT_INFO cryptInfo;
|
||||||
|
BYTE key[ 100 ];
|
||||||
|
int keySize, ivSize;
|
||||||
|
|
||||||
|
/* Find out how long we can make the key */
|
||||||
|
queryAlgoModeInformation( CRYPT_ALGO_3DES, CRYPT_MODE_CBC,
|
||||||
|
&cryptQueryInfo );
|
||||||
|
keySize = cryptQueryInfo->maxKeySize; /* Use all we can */
|
||||||
|
ivSize = cryptQueryInfo->ivSize;
|
||||||
|
|
||||||
|
/* Encrypt a null data block using a null IV with the passphrase as the
|
||||||
|
key. This works vaguely like the Unix password encryption except
|
||||||
|
that we don't have a salt (which would be the IV) */
|
||||||
|
memset( key, 0, keySize );
|
||||||
|
initCryptContext( &cryptInfo, CRYPT_ALGO_MDCSHS, CRYPT_MODE_CFB );
|
||||||
|
loadCryptContext( &cryptInfo, passphrase, strlen( passphrase ) );
|
||||||
|
loadIV( &cryptInfo, key, ivSize );
|
||||||
|
encryptBuffer( &cryptInfo, key, keySize );
|
||||||
|
destroyCryptContext( &cryptInfo );
|
||||||
|
|
||||||
|
To encrypt a file using triple DES in CBC mode with the key generated in the
|
||||||
|
previous example:
|
||||||
|
|
||||||
|
BOOLEAN firstTime = TRUE;
|
||||||
|
|
||||||
|
/* Load the previously-generated key */
|
||||||
|
initCryptContext( &cryptInfo, CRYPT_ALGO_3DES, CRYPT_MODE_CBC );
|
||||||
|
loadCryptContext( &cryptInfo, key, keySize );
|
||||||
|
|
||||||
|
/* Copy the data across, encrypting as we go */
|
||||||
|
while( ( length = fread( buffer, 1, BUFSIZE, inFile ) ) != 0 )
|
||||||
|
{
|
||||||
|
/* Encrypt the data in the buffer */
|
||||||
|
encryptBuffer( &cryptInfo, buffer, length );
|
||||||
|
|
||||||
|
/* If it's the first block, retrieve the IV and prepend it to the
|
||||||
|
output data. Note the since we've let the library generate the
|
||||||
|
IV for us automatically, we can't retrieve it until after the first
|
||||||
|
encryptBuffer() call */
|
||||||
|
if( firstTime )
|
||||||
|
{
|
||||||
|
CRYPT_QUERY_INFO cryptQueryInfo;
|
||||||
|
BYTE iv[ CRYPT_MAX_IVSIZE ];
|
||||||
|
int ivSize;
|
||||||
|
|
||||||
|
/* Find out how long the IV we're using is */
|
||||||
|
queryContextInformation( &cryptInfo, &cryptQueryInfo );
|
||||||
|
ivSize = cryptQueryInfo->ivSize;
|
||||||
|
|
||||||
|
/* Retrieve the IV and write it to the output file */
|
||||||
|
retrieveIV( &cryptInfo, iv );
|
||||||
|
fwrite( iv, 1, ivSize, outFile );
|
||||||
|
|
||||||
|
firstTime = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write the encrypted data to the output file */
|
||||||
|
fwrite( buffer, 1, length, outFile );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Since CBC is a block cipher, we perform a courtesy close call to let
|
||||||
|
the encryption routines handle the last block */
|
||||||
|
encryptBuffer( &cryptInfo, buffer, 0 );
|
||||||
|
|
||||||
|
destroyCryptContext( &cryptInfo );
|
||||||
|
|
||||||
|
To decrypt the previously encrypted file with the key generated in the previous
|
||||||
|
example:
|
||||||
|
|
||||||
|
CRYPT_QUERY_INFO cryptQueryInfo;
|
||||||
|
BYTE iv[ CRYPT_MAX_IVSIZE ];
|
||||||
|
int ivSize;
|
||||||
|
|
||||||
|
/* Load the previously-generated key */
|
||||||
|
initCryptContext( &cryptInfo, CRYPT_ALGO_3DES, CRYPT_MODE_CBC );
|
||||||
|
loadCryptContext( &cryptInfo, key, keySize );
|
||||||
|
|
||||||
|
/* Find out how long the IV we're using is */
|
||||||
|
queryContextInformation( &cryptInfo, &cryptQueryInfo );
|
||||||
|
ivSize = cryptQueryInfo->ivSize;
|
||||||
|
|
||||||
|
/* Read the IV from the input file and load it into the encryption
|
||||||
|
context */
|
||||||
|
fread( iv, 1, ivSize, inFile );
|
||||||
|
loadIV( &cryptInfo, iv, ivSize );
|
||||||
|
|
||||||
|
/* Copy the data across, decrypting as we go */
|
||||||
|
while( ( length = fread( buffer, 1, BUFSIZE, inFile ) ) != 0 )
|
||||||
|
{
|
||||||
|
/* Encrypt the data in the buffer */
|
||||||
|
decryptBuffer( &cryptInfo, buffer, length );
|
||||||
|
|
||||||
|
/* Write the decrypted data to the output file */
|
||||||
|
fwrite( buffer, 1, length, outFile );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Since CBC is a block cipher, we perform a courtesy close call to let
|
||||||
|
the encryption routines handle the last block */
|
||||||
|
decryptBuffer( &cryptInfo, buffer, 0 );
|
||||||
|
|
||||||
|
destroyCryptContext( &cryptInfo );
|
||||||
|
|
||||||
|
A longer usage example including proper error checking and with various other
|
||||||
|
test routines can be found in the file test.c included with the code.
|
||||||
|
|
||||||
|
|
||||||
|
Querying the Encryption Library Capabilities
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
The previous examples showed the use of the queryAlgoModeInformation() and
|
||||||
|
queryContextInformation() calls to retrieve information about the
|
||||||
|
characteristics of a particular algorithm as implemented by the encryption
|
||||||
|
library. There are four such calls in total, of which two query the existence
|
||||||
|
of an implementation of an algorithm or algorithm/mode combination, and two
|
||||||
|
return information about the implementation.
|
||||||
|
|
||||||
|
The library can be interrogated about the existence of a particular encryption
|
||||||
|
algorithm or algorithm and encryption mode combination with:
|
||||||
|
|
||||||
|
status = queryAlgoAvailability( algorithm );
|
||||||
|
|
||||||
|
or:
|
||||||
|
|
||||||
|
status = queryModeAvailability( algorithm, mode );
|
||||||
|
|
||||||
|
In addition to requesting information on the availability of an encryption
|
||||||
|
algorithm and mode, you can request extra information to be returned in a
|
||||||
|
CRYPT_QUERY_INFO structure with:
|
||||||
|
|
||||||
|
status = queryAlgoModeInformation( algorithm, mode, &cryptQueryInfo );
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
status = queryContextInformation( &cryptInfo, &cryptQueryInfo );
|
||||||
|
|
||||||
|
with the former being used to request information on a given algorithm/mode
|
||||||
|
combination and the latter being used to request information about the
|
||||||
|
encryption context being used.
|
||||||
|
|
||||||
|
The CRYPT_QUERY_INFO structure contains the following fields:
|
||||||
|
|
||||||
|
/* The encryption algorithm, encryption mode, and general algorithm name
|
||||||
|
as an ASCII string */
|
||||||
|
CRYPT_ALGO cryptAlgo;
|
||||||
|
CRYPT_MODE cryptMode;
|
||||||
|
char *algoName;
|
||||||
|
|
||||||
|
/* The algorithm block size in bytes, the minimum, recommended, and
|
||||||
|
maximum key size in bytes, and the minimum, recommended, and maximum
|
||||||
|
IV size in bytes */
|
||||||
|
int blockSize;
|
||||||
|
int minKeySize;
|
||||||
|
int keySize;
|
||||||
|
int maxKeySize;
|
||||||
|
int minIVsize;
|
||||||
|
int ivSize;
|
||||||
|
int maxIVsize;
|
||||||
|
|
||||||
|
/* The algorithm speed relative to a block copy operation. This value
|
||||||
|
ranges from 1 ... CRYPT_MAX_SPEED, or CRYPT_ERROR if no speed rating is
|
||||||
|
available */
|
||||||
|
int speed;
|
||||||
|
|
||||||
|
|
||||||
|
Algorithm-Specific Notes
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
MDCSHS:
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
DES:
|
||||||
|
|
||||||
|
loadCryptContext() will return a bad parameter code if the DES key parity is
|
||||||
|
wrong or if the key is a weak key (CRYPT_BADPARM2 in this case).
|
||||||
|
|
||||||
|
encryptBuffer() and decryptBuffer() will return a bad parameter code if the
|
||||||
|
encryption mode is ECB, CBC, or PCBC and the encrypted data length is not a
|
||||||
|
multiple of the block size (CRYPT_BADPARM3 in this case).
|
||||||
|
|
||||||
|
Triple DES:
|
||||||
|
|
||||||
|
loadCryptContext() will return a bad parameter code if the DES key parity is
|
||||||
|
wrong or if the key is a weak key (CRYPT_BADPARM2 in this case).
|
||||||
|
|
||||||
|
encryptBuffer() and decryptBuffer() will return a bad parameter code if the
|
||||||
|
encryption mode is ECB or CBC and the encrypted data length is not a multiple
|
||||||
|
of the block size (CRYPT_BADPARM3 in this case).
|
||||||
|
|
||||||
|
IDEA:
|
||||||
|
|
||||||
|
encryptBuffer() and decryptBuffer() will return a bad parameter code if the
|
||||||
|
encryption mode is ECB or CBC and the encrypted data length is not a multiple
|
||||||
|
of the block size (CRYPT_BADPARM3 in this case).
|
||||||
|
|
||||||
|
The IDEA algorithm is patented by Ascom Systec AG, CH-5506 Maegenwil,
|
||||||
|
Switzerland, ph. +41 64 56 59 45, email idea@ascom.ch, and cannot be used
|
||||||
|
commercially without a license. As of June 1995, the licensing terms were
|
||||||
|
120 SFr (about US$90) per user for 1-10 users, 80 Sfr (about US$60) per user
|
||||||
|
for 11-20 users, and 60 Sfr (about US$46) per user for 21-100 users.
|
||||||
|
|
||||||
|
RC4:
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
SAFER:
|
||||||
|
SAFER-SK:
|
||||||
|
|
||||||
|
encryptBuffer() and decryptBuffer() will return a bad parameter code if the
|
||||||
|
encryption mode is ECB or CBC and the encrypted data length is not a multiple
|
||||||
|
of the block size (CRYPT_BADPARM3 in this case).
|
||||||
|
|
||||||
|
|
||||||
|
Plug-In Module Implementation
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
These notes are rather brief since there is a lot of ground to cover, and the
|
||||||
|
easiest way to see what is required is to look at the crypt.c code and the way
|
||||||
|
it interfaces to the lib_XXX.c code, which may be regarded as standard
|
||||||
|
implementations of a plug-in module (the triple DES and IDEA modules are
|
||||||
|
probably the best examples). Basically, implementors must provide the
|
||||||
|
following services in their plug-in modules:
|
||||||
|
|
||||||
|
int selfTestFunction( void );
|
||||||
|
|
||||||
|
Perform a self-test on the encryption hardware/software module. This
|
||||||
|
function is called once before any other function is called.
|
||||||
|
|
||||||
|
int initFunction( CRYPT_INFO *cryptInfo );
|
||||||
|
|
||||||
|
Initialise the appropriate private CRYPT_INFO fields.
|
||||||
|
|
||||||
|
int initExFunction( CRYPT_INFO *cryptInfo, void *cryptInfoEx );
|
||||||
|
|
||||||
|
Initialiase the appropriate private CRYPT_INFO fields based on the extended
|
||||||
|
information given in the second parameter.
|
||||||
|
|
||||||
|
int endFunction( CRYPT_INFO *cryptInfo );
|
||||||
|
|
||||||
|
Clear the appropriate private CRYPT_INFO fields.
|
||||||
|
|
||||||
|
int initKeyFunction( CRYPT_INFO *cryptInfo );
|
||||||
|
|
||||||
|
Initialise the internal key based on the user key. Typically this might
|
||||||
|
perform one or more of the following:
|
||||||
|
|
||||||
|
Hash the user key down to the size of the key used by the algorithm
|
||||||
|
|
||||||
|
Perform some type of key schedule operation
|
||||||
|
|
||||||
|
Perform endianness conversion for the current operating environment
|
||||||
|
|
||||||
|
Load the key into external crypto hardware.
|
||||||
|
|
||||||
|
Perform a key selection in external hardware based on the specified key
|
||||||
|
selector.
|
||||||
|
|
||||||
|
For algorithms with asymmetric internal keys, both an encryption and a
|
||||||
|
decryption key will have to be generated, as a crypt context may be used for
|
||||||
|
encryption or decryption.
|
||||||
|
|
||||||
|
int initIVFunction( CRYPT_INFO *cryptInfo );
|
||||||
|
|
||||||
|
Initialise the IV. Typically this might perform one or more of the
|
||||||
|
following:
|
||||||
|
|
||||||
|
Perform endianness conversion for the current operating environment
|
||||||
|
|
||||||
|
Load the IV into external crypto hardware.
|
||||||
|
|
||||||
|
int encryptFunction( CRYPT_INFO *cryptInfo, void *buffer, int length );
|
||||||
|
int decryptFunction( CRYPT_INFO *cryptInfo, void *buffer, int length );
|
||||||
|
|
||||||
|
Encrypt/decrypt a block of data based on the algorithm and keying information
|
||||||
|
in CRYPT_INFO. Some algorithms may require special handling for the last
|
||||||
|
block (eg block truncation in CBC) so both routines should recognise a call
|
||||||
|
with length = 0 to indicate the end of the encrypted data block.
|
||||||
|
|
||||||
|
|
||||||
|
Acknowledgements
|
||||||
|
----------------
|
||||||
|
|
||||||
|
The DES and 3DES encryption code was contributed by Eric Young
|
||||||
|
<eay@psych.psy.uq.oz.au> and is part of his libdes package. The primary ftp
|
||||||
|
site for the full libdes is
|
||||||
|
ftp://ftp.psy.uq.oz.au/pub/Crypto/DES/libdes-x.xx.tar.gz. libdes is now also
|
||||||
|
shipped with SSLeay. The primary site for this is
|
||||||
|
ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL/SSLeay-x.xx.tar.gz.
|
||||||
|
|
||||||
|
The IDEA code was contributed by Colin Plumb.
|
||||||
|
|
||||||
|
The SAFER code was written by Richard De Moliner <demoliner@isi.ee.ethz.ch> of
|
||||||
|
the Signal and Information Processing Laboratory, Swiss Federal Institute of
|
||||||
|
Technology.
|
||||||
+410
@@ -0,0 +1,410 @@
|
|||||||
|
/*
|
||||||
|
* idea.c - C source code for IDEA block cipher.
|
||||||
|
* IDEA (International Data Encryption Algorithm), formerly known as
|
||||||
|
* IPES (Improved Proposed Encryption Standard).
|
||||||
|
* Algorithm developed by Xuejia Lai and James L. Massey, of ETH Zurich.
|
||||||
|
* This implementation modified and derived from original C code
|
||||||
|
* developed by Xuejia Lai.
|
||||||
|
* Zero-based indexing added, names changed from IPES to IDEA.
|
||||||
|
* CFB functions added. Random number routines added.
|
||||||
|
*
|
||||||
|
* Extensively optimized and restructured by Colin Plumb.
|
||||||
|
*
|
||||||
|
* There are two adjustments that can be made to this code to
|
||||||
|
* speed it up. Defaults may be used for PCs. Only the -DIDEA32
|
||||||
|
* pays off significantly if selectively set or not set.
|
||||||
|
* Experiment to see what works best for your machine.
|
||||||
|
*
|
||||||
|
* Multiplication: default is inline, -DAVOID_JUMPS uses a
|
||||||
|
* different version that does not do any conditional
|
||||||
|
* jumps (a few percent worse on a SPARC), while
|
||||||
|
* -DSMALL_CACHE takes it out of line to stay
|
||||||
|
* within a small on-chip code cache.
|
||||||
|
* Variables: normally, 16-bit variables are used, but some
|
||||||
|
* machines (notably RISCs) do not have 16-bit registers,
|
||||||
|
* so they do a great deal of masking. -DIDEA32 uses "int"
|
||||||
|
* register variables and masks explicitly only where
|
||||||
|
* necessary. On a SPARC, for example, this boosts
|
||||||
|
* performace by 30%.
|
||||||
|
*
|
||||||
|
* The IDEA(tm) block cipher is covered by patents held by ETH and a
|
||||||
|
* Swiss company called Ascom-Tech AG. The Swiss patent number is
|
||||||
|
* PCT/CH91/00117, the European patent number is EP 0 482 154 B1, and
|
||||||
|
* the U.S. patent number is US005214703. IDEA(tm) is a trademark of
|
||||||
|
* Ascom-Tech AG. There is no license fee required for noncommercial
|
||||||
|
* use. Commercial users may obtain licensing details from Dieter
|
||||||
|
* Profos, Ascom Tech AG, Solothurn Lab, Postfach 151, 4502 Solothurn,
|
||||||
|
* Switzerland, Tel +41 65 242885, Fax +41 65 235761.
|
||||||
|
*
|
||||||
|
* The IDEA block cipher uses a 64-bit block size, and a 128-bit key
|
||||||
|
* size. It breaks the 64-bit cipher block into four 16-bit words
|
||||||
|
* because all of the primitive inner operations are done with 16-bit
|
||||||
|
* arithmetic. It likewise breaks the 128-bit cipher key into eight
|
||||||
|
* 16-bit words.
|
||||||
|
*
|
||||||
|
* For further information on the IDEA cipher, see the book:
|
||||||
|
* Xuejia Lai, "On the Design and Security of Block Ciphers",
|
||||||
|
* ETH Series on Information Processing (ed. J.L. Massey) Vol 1,
|
||||||
|
* Hartung-Gorre Verlag, Konstanz, Switzerland, 1992. ISBN
|
||||||
|
* 3-89191-573-X.
|
||||||
|
*
|
||||||
|
* This code runs on arrays of bytes by taking pairs in big-endian
|
||||||
|
* order to make the 16-bit words that IDEA uses internally. This
|
||||||
|
* produces the same result regardless of the byte order of the
|
||||||
|
* native CPU.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include "../crypt.h"
|
||||||
|
#include "idea.h"
|
||||||
|
#else
|
||||||
|
#include "crypt.h"
|
||||||
|
#include "idea/idea.h"
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
#ifdef BIG_ENDIAN /* This code uses slightly different names */
|
||||||
|
#define HIGHFIRST
|
||||||
|
#endif /* BIG_ENDIAN */
|
||||||
|
|
||||||
|
#ifdef IDEA32 /* Use >16-bit temporaries */
|
||||||
|
#define low16(x) ((x) & 0xFFFF)
|
||||||
|
typedef unsigned int uint16; /* at LEAST 16 bits, maybe more */
|
||||||
|
#else
|
||||||
|
#define low16(x) (x) /* this is only ever applied to uint16's */
|
||||||
|
typedef word16 uint16;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _GNUC_
|
||||||
|
/* __const__ simply means there are no side effects for this function,
|
||||||
|
* which is useful info for the gcc optimizer
|
||||||
|
*/
|
||||||
|
#define CONST __const__
|
||||||
|
#else
|
||||||
|
#define CONST
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Multiplication, modulo (2**16)+1
|
||||||
|
* Note that this code is structured on the assumption that
|
||||||
|
* untaken branches are cheaper than taken branches, and the
|
||||||
|
* compiler doesn't schedule branches.
|
||||||
|
*/
|
||||||
|
#ifdef SMALL_CACHE
|
||||||
|
CONST static uint16
|
||||||
|
mul(register uint16 a, register uint16 b)
|
||||||
|
{
|
||||||
|
register word32 p;
|
||||||
|
|
||||||
|
p = (word32)a * b;
|
||||||
|
if (p) {
|
||||||
|
b = low16(p);
|
||||||
|
a = p>>16;
|
||||||
|
return (b - a) + (b < a);
|
||||||
|
} else if (a) {
|
||||||
|
return 1-b;
|
||||||
|
} else {
|
||||||
|
return 1-a;
|
||||||
|
}
|
||||||
|
} /* mul */
|
||||||
|
#endif /* SMALL_CACHE */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compute the multiplicative inverse of x, modulo 65537, using Euclid's
|
||||||
|
* algorithm. It is unrolled twice to avoid swapping the registers each
|
||||||
|
* iteration, and some subtracts of t have been changed to adds.
|
||||||
|
*/
|
||||||
|
CONST static uint16
|
||||||
|
mulInv(uint16 x)
|
||||||
|
{
|
||||||
|
uint16 t0, t1;
|
||||||
|
uint16 q, y;
|
||||||
|
|
||||||
|
if (x <= 1)
|
||||||
|
return x; /* 0 and 1 are self-inverse */
|
||||||
|
t1 = 0x10001L / x; /* Since x >= 2, this fits into 16 bits */
|
||||||
|
y = 0x10001L % x;
|
||||||
|
if (y == 1)
|
||||||
|
return ( uint16 ) low16(1-t1);
|
||||||
|
t0 = 1;
|
||||||
|
do {
|
||||||
|
q = x / y;
|
||||||
|
x = x % y;
|
||||||
|
t0 += q * t1;
|
||||||
|
if (x == 1)
|
||||||
|
return t0;
|
||||||
|
q = y / x;
|
||||||
|
y = y % x;
|
||||||
|
t1 += q * t0;
|
||||||
|
} while (y != 1);
|
||||||
|
return ( uint16 ) low16(1-t1);
|
||||||
|
} /* mukInv */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Expand a 128-bit user key to a working encryption key EK
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ideaExpandKey(byte const *userkey, word16 *EK)
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
for (j=0; j<8; j++) {
|
||||||
|
EK[j] = (userkey[0]<<8) + userkey[1];
|
||||||
|
userkey += 2;
|
||||||
|
}
|
||||||
|
for (i=0; j < IDEAKEYLEN; j++) {
|
||||||
|
i++;
|
||||||
|
EK[i+7] = (EK[i & 7] << 9) | (EK[i+1 & 7] >> 7);
|
||||||
|
EK += i & 8;
|
||||||
|
i &= 7;
|
||||||
|
}
|
||||||
|
} /* ideaExpandKey */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compute IDEA decryption key DK from an expanded IDEA encryption key EK
|
||||||
|
* Note that the input and output may be the same. Thus, the key is
|
||||||
|
* inverted into an internal buffer, and then copied to the output.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
#ifdef _DCC
|
||||||
|
ideaInvertKey(word16 *EK, word16 DK[IDEAKEYLEN])
|
||||||
|
#else
|
||||||
|
ideaInvertKey(word16 const *EK, word16 DK[IDEAKEYLEN])
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
uint16 t1, t2, t3;
|
||||||
|
word16 temp[IDEAKEYLEN];
|
||||||
|
word16 *p = temp + IDEAKEYLEN;
|
||||||
|
|
||||||
|
t1 = mulInv(*EK++);
|
||||||
|
t2 = - ( int ) *EK++;
|
||||||
|
t3 = - ( int ) *EK++;
|
||||||
|
*--p = mulInv(*EK++);
|
||||||
|
*--p = t3;
|
||||||
|
*--p = t2;
|
||||||
|
*--p = t1;
|
||||||
|
|
||||||
|
for (i = 0; i < IDEAROUNDS-1; i++) {
|
||||||
|
t1 = *EK++;
|
||||||
|
*--p = *EK++;
|
||||||
|
*--p = t1;
|
||||||
|
|
||||||
|
t1 = mulInv(*EK++);
|
||||||
|
t2 = - ( int ) *EK++;
|
||||||
|
t3 = - ( int ) *EK++;
|
||||||
|
*--p = mulInv(*EK++);
|
||||||
|
*--p = t2;
|
||||||
|
*--p = t3;
|
||||||
|
*--p = t1;
|
||||||
|
}
|
||||||
|
t1 = *EK++;
|
||||||
|
*--p = *EK++;
|
||||||
|
*--p = t1;
|
||||||
|
|
||||||
|
t1 = mulInv(*EK++);
|
||||||
|
t2 = - ( int ) *EK++;
|
||||||
|
t3 = - ( int ) *EK++;
|
||||||
|
*--p = mulInv(*EK++);
|
||||||
|
*--p = t3;
|
||||||
|
*--p = t2;
|
||||||
|
*--p = t1;
|
||||||
|
/* Copy and destroy temp copy */
|
||||||
|
memcpy(DK, temp, sizeof(temp));
|
||||||
|
burn(temp);
|
||||||
|
} /* ideaInvertKey */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MUL(x,y) computes x = x*y, modulo 0x10001. Requires two temps,
|
||||||
|
* t16 and t32. x is modified, and must me a side-effect-free lvalue.
|
||||||
|
* y may be anything, but unlike x, must be strictly 16 bits even if
|
||||||
|
* low16() is #defined.
|
||||||
|
* All of these are equivalent - see which is faster on your machine
|
||||||
|
*/
|
||||||
|
#ifdef SMALL_CACHE
|
||||||
|
#define MUL(x,y) (x = mul(low16(x),y))
|
||||||
|
#else /* !SMALL_CACHE */
|
||||||
|
#ifdef AVOID_JUMPS
|
||||||
|
#define MUL(x,y) (x = low16(x-1), t16 = low16((y)-1), \
|
||||||
|
t32 = (word32)x*t16 + x + t16 + 1, x = low16(t32), \
|
||||||
|
t16 = t32>>16, x = (x-t16) + (x<t16) )
|
||||||
|
#else /* !AVOID_JUMPS (default) */
|
||||||
|
#define MUL(x,y) \
|
||||||
|
((t16 = (y)) ? \
|
||||||
|
(x=low16(x)) ? \
|
||||||
|
t32 = (word32)x*t16, \
|
||||||
|
x = low16(t32), \
|
||||||
|
t16 = t32>>16, \
|
||||||
|
x = (x-t16)+(x<t16) \
|
||||||
|
: \
|
||||||
|
(x = 1-t16) \
|
||||||
|
: \
|
||||||
|
(x = 1-x))
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* IDEA encryption/decryption algorithm */
|
||||||
|
/* Note that in and out can be the same buffer */
|
||||||
|
void
|
||||||
|
#ifdef _DCC
|
||||||
|
ideaCipher(byte (inbuf[8]), byte (outbuf[8]), word16 *key)
|
||||||
|
#else
|
||||||
|
ideaCipher(byte const (inbuf[8]), byte (outbuf[8]), word16 const *key)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
register uint16 x1, x2, x3, x4, s2, s3;
|
||||||
|
word16 *in, *out;
|
||||||
|
#ifndef SMALL_CACHE
|
||||||
|
register uint16 t16; /* Temporaries needed by MUL macro */
|
||||||
|
register word32 t32;
|
||||||
|
#endif
|
||||||
|
int r = IDEAROUNDS;
|
||||||
|
|
||||||
|
in = (word16 *)inbuf;
|
||||||
|
x1 = *in++; x2 = *in++;
|
||||||
|
x3 = *in++; x4 = *in;
|
||||||
|
#ifndef HIGHFIRST
|
||||||
|
x1 = (x1>>8) | (x1<<8);
|
||||||
|
x2 = (x2>>8) | (x2<<8);
|
||||||
|
x3 = (x3>>8) | (x3<<8);
|
||||||
|
x4 = (x4>>8) | (x4<<8);
|
||||||
|
#endif
|
||||||
|
do {
|
||||||
|
MUL(x1,*key++);
|
||||||
|
x2 += *key++;
|
||||||
|
x3 += *key++;
|
||||||
|
MUL(x4, *key++);
|
||||||
|
|
||||||
|
s3 = x3;
|
||||||
|
x3 ^= x1;
|
||||||
|
MUL(x3, *key++);
|
||||||
|
s2 = x2;
|
||||||
|
x2 ^= x4;
|
||||||
|
x2 += x3;
|
||||||
|
MUL(x2, *key++);
|
||||||
|
x3 += x2;
|
||||||
|
|
||||||
|
x1 ^= x2; x4 ^= x3;
|
||||||
|
|
||||||
|
x2 ^= s3; x3 ^= s2;
|
||||||
|
} while (--r);
|
||||||
|
MUL(x1, *key++);
|
||||||
|
x3 += *key++;
|
||||||
|
x2 += *key++;
|
||||||
|
MUL(x4, *key);
|
||||||
|
|
||||||
|
out = (word16 *)outbuf;
|
||||||
|
#ifdef HIGHFIRST
|
||||||
|
*out++ = x1;
|
||||||
|
*out++ = x3;
|
||||||
|
*out++ = x2;
|
||||||
|
*out = x4;
|
||||||
|
#else /* !HIGHFIRST */
|
||||||
|
x1 = low16(x1);
|
||||||
|
x2 = low16(x2);
|
||||||
|
x3 = low16(x3);
|
||||||
|
x4 = low16(x4);
|
||||||
|
*out++ = (x1>>8) | (x1<<8);
|
||||||
|
*out++ = (x3>>8) | (x3<<8);
|
||||||
|
*out++ = (x2>>8) | (x2<<8);
|
||||||
|
*out = (x4>>8) | (x4<<8);
|
||||||
|
#endif
|
||||||
|
} /* ideaCipher */
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifdef TEST
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
/*
|
||||||
|
* This is the number of Kbytes of test data to encrypt.
|
||||||
|
* It defaults to 1 MByte.
|
||||||
|
*/
|
||||||
|
#ifndef BLOCKS
|
||||||
|
#ifndef KBYTES
|
||||||
|
#define KBYTES 1024
|
||||||
|
#endif
|
||||||
|
#define BLOCKS (64*KBYTES)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{ /* Test driver for IDEA cipher */
|
||||||
|
int i, j, k;
|
||||||
|
byte userkey[16];
|
||||||
|
word16 EK[IDEAKEYLEN], DK[IDEAKEYLEN];
|
||||||
|
byte XX[8], YY[8], ZZ[8];
|
||||||
|
clock_t start, end;
|
||||||
|
long l;
|
||||||
|
|
||||||
|
/* Make a sample user key for testing... */
|
||||||
|
for(i=0; i<16; i++)
|
||||||
|
userkey[i] = i+1;
|
||||||
|
|
||||||
|
/* Compute encryption subkeys from user key... */
|
||||||
|
ideaExpandKey(userkey, EK);
|
||||||
|
printf("\nEncryption key subblocks: ");
|
||||||
|
for (j=0; j<IDEAROUNDS+1; j++) {
|
||||||
|
printf("\nround %d: ", j+1);
|
||||||
|
if (j < IDEAROUNDS)
|
||||||
|
for(i=0; i<6; i++)
|
||||||
|
printf(" %6u", EK[j*6+i]);
|
||||||
|
else
|
||||||
|
for(i=0; i<4; i++)
|
||||||
|
printf(" %6u", EK[j*6+i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Compute decryption subkeys from encryption subkeys... */
|
||||||
|
ideaInvertKey(EK, DK);
|
||||||
|
printf("\nDecryption key subblocks: ");
|
||||||
|
for (j=0; j<IDEAROUNDS+1; j++) {
|
||||||
|
printf("\nround %d: ", j+1);
|
||||||
|
if (j < IDEAROUNDS)
|
||||||
|
for(i=0; i<6; i++)
|
||||||
|
printf(" %6u", DK[j*6+i]);
|
||||||
|
else
|
||||||
|
for(i=0; i<4; i++)
|
||||||
|
printf(" %6u", DK[j*6+i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make a sample plaintext pattern for testing... */
|
||||||
|
for (k=0; k<8; k++)
|
||||||
|
XX[k] = k;
|
||||||
|
|
||||||
|
printf("\n Encrypting %d bytes (%ld blocks)...", BLOCKS*16, BLOCKS);
|
||||||
|
fflush(stdout);
|
||||||
|
start = clock();
|
||||||
|
memcpy(YY, XX, 8);
|
||||||
|
for (l = 0; l < BLOCKS; l++)
|
||||||
|
ideaCipher(YY, YY, EK); /* repeated encryption */
|
||||||
|
memcpy(ZZ, YY, 8);
|
||||||
|
for (l = 0; l < BLOCKS; l++)
|
||||||
|
ideaCipher(ZZ, ZZ, DK); /* repeated decryption */
|
||||||
|
end = clock() - start;
|
||||||
|
l = end / (CLOCKS_PER_SEC/1000) + 1;
|
||||||
|
i = l/1000;
|
||||||
|
j = l%1000;
|
||||||
|
l = (16 * BLOCKS * (CLOCKS_PER_SEC/1000)) / (end/1000);
|
||||||
|
printf("%d.%03d seconds = %ld bytes per second\n", i, j, l);
|
||||||
|
|
||||||
|
printf("\nX %3u %3u %3u %3u %3u %3u %3u %3u\n",
|
||||||
|
XX[0], XX[1], XX[2], XX[3], XX[4], XX[5], XX[6], XX[7]);
|
||||||
|
printf("\nY %3u %3u %3u %3u %3u %3u %3u %3u\n",
|
||||||
|
YY[0], YY[1], YY[2], YY[3], YY[4], YY[5], YY[6], YY[7]);
|
||||||
|
printf("\nZ %3u %3u %3u %3u %3u %3u %3u %3u\n",
|
||||||
|
ZZ[0], ZZ[1], ZZ[2], ZZ[3], ZZ[4], ZZ[5], ZZ[6], ZZ[7]);
|
||||||
|
|
||||||
|
/* Now decrypted ZZ should be same as original XX */
|
||||||
|
for (k=0; k<8; k++)
|
||||||
|
if (XX[k] != ZZ[k]) {
|
||||||
|
printf("\n\07Error! Noninvertable encryption.\n");
|
||||||
|
exit(-1); /* error exit */
|
||||||
|
}
|
||||||
|
printf("\nNormal exit.\n");
|
||||||
|
return 0; /* normal exit */
|
||||||
|
} /* main */
|
||||||
|
|
||||||
|
#endif /* TEST */
|
||||||
|
|
||||||
|
/* end of idea.c */
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
#ifndef _IDEA_DEFINED
|
||||||
|
|
||||||
|
#define _IDEA_DEFINED
|
||||||
|
|
||||||
|
/* Defines for the PGP-style types used in IDEA.C */
|
||||||
|
|
||||||
|
#define byte unsigned char
|
||||||
|
#define word16 unsigned short int
|
||||||
|
#define word32 unsigned long int
|
||||||
|
|
||||||
|
/* Macros from PGP */
|
||||||
|
|
||||||
|
#define burn(x) memset( x, 0, sizeof( x ) )
|
||||||
|
|
||||||
|
/* IDEA algorithm constants */
|
||||||
|
|
||||||
|
#define IDEAKEYSIZE 16
|
||||||
|
#define IDEABLOCKSIZE 8
|
||||||
|
|
||||||
|
#define IDEAROUNDS 8
|
||||||
|
#define IDEAKEYLEN ( 6 * IDEAROUNDS + 4 )
|
||||||
|
|
||||||
|
/* Routines used to implement the IDEA encryption */
|
||||||
|
void ideaExpandKey( byte const *userkey, word16 *EK );
|
||||||
|
|
||||||
|
#ifdef _DCC
|
||||||
|
void ideaInvertKey( word16 *EK, word16 DK[IDEAKEYLEN] );
|
||||||
|
void ideaCipher( byte (inbuf[8]), byte (outbuf[8]), word16 *key );
|
||||||
|
#else
|
||||||
|
void ideaInvertKey( word16 const *EK, word16 DK[IDEAKEYLEN] );
|
||||||
|
void ideaCipher( byte const (inbuf[8]), byte (outbuf[8]), word16 const *key );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _IDEA_DEFINED */
|
||||||
+173
@@ -0,0 +1,173 @@
|
|||||||
|
;-------------------------------------------------------------------------
|
||||||
|
; idea68k.a
|
||||||
|
;
|
||||||
|
; 68000 Assembler version of idea cipher, direct translation from c code
|
||||||
|
; from PGP.
|
||||||
|
;
|
||||||
|
; Author: Risto Paasivirta, paasivir@jyu.fi.
|
||||||
|
;
|
||||||
|
|
||||||
|
section text,code
|
||||||
|
|
||||||
|
xdef _asm_mul,_asm_inv
|
||||||
|
xdef _asm_cipher_idea
|
||||||
|
|
||||||
|
; key schedule block
|
||||||
|
|
||||||
|
ROUNDS equ 8
|
||||||
|
|
||||||
|
Z0 equ 0
|
||||||
|
Z1 equ (ROUNDS+1)*2
|
||||||
|
Z2 equ (ROUNDS+1)*4
|
||||||
|
Z3 equ (ROUNDS+1)*6
|
||||||
|
Z4 equ (ROUNDS+1)*8
|
||||||
|
Z5 equ (ROUNDS+1)*10
|
||||||
|
|
||||||
|
ZSIZE equ (ROUNDS+1)*12
|
||||||
|
|
||||||
|
KSSIZE equ ZSIZE*2
|
||||||
|
|
||||||
|
;-------------------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; idmul da,db -- db = da * db mod 65537, d0 = scratch (da may be d0)
|
||||||
|
;
|
||||||
|
|
||||||
|
idmul macro
|
||||||
|
tst.w \2
|
||||||
|
bne.b idmul1.\@
|
||||||
|
|
||||||
|
moveq #1,\2
|
||||||
|
sub.w \1,\2
|
||||||
|
bra.b idmul3.\@
|
||||||
|
|
||||||
|
idmul1.\@ tst.w \1
|
||||||
|
bne.b idmul2.\@
|
||||||
|
moveq #1,d0
|
||||||
|
sub.w \2,d0
|
||||||
|
move.w d0,\2
|
||||||
|
bra.b idmul3.\@
|
||||||
|
|
||||||
|
idmul2.\@ mulu.w \1,\2
|
||||||
|
move.l \2,d0
|
||||||
|
swap d0
|
||||||
|
sub.w d0,\2
|
||||||
|
bcc.b idmul3.\@
|
||||||
|
addq.w #1,\2
|
||||||
|
idmul3.\@
|
||||||
|
endm
|
||||||
|
|
||||||
|
;-------------------------------------------------------------------------
|
||||||
|
; idea_cip (a0=inblock,a1=outblock,a2=keyshedule) (d0-d7/a3 scratch)
|
||||||
|
;
|
||||||
|
;
|
||||||
|
;
|
||||||
|
|
||||||
|
idea_cip movem.w (a0),d1-d4
|
||||||
|
moveq #0,d7
|
||||||
|
|
||||||
|
idea_cip_loop lea 0(a2,d7.w),a3
|
||||||
|
idmul (a3),d1
|
||||||
|
idmul Z3(a3),d4
|
||||||
|
add.w Z1(a3),d2
|
||||||
|
add.w Z2(a3),d3
|
||||||
|
move.w d1,d6
|
||||||
|
eor.w d3,d6
|
||||||
|
idmul Z4(a3),d6
|
||||||
|
move.w d4,d5
|
||||||
|
eor.w d2,d5
|
||||||
|
add.w d6,d5
|
||||||
|
idmul Z5(a3),d5
|
||||||
|
add.w d5,d6
|
||||||
|
eor.w d5,d1
|
||||||
|
eor.w d6,d4
|
||||||
|
eor.w d6,d2
|
||||||
|
eor.w d5,d3
|
||||||
|
exg d2,d3
|
||||||
|
addq.w #2,d7
|
||||||
|
cmp.w #ROUNDS*2,d7
|
||||||
|
bcs idea_cip_loop
|
||||||
|
|
||||||
|
lea 0(a2,d7.w),a3
|
||||||
|
idmul (a3),d1
|
||||||
|
idmul Z3(a3),d4
|
||||||
|
add.w Z1(a3),d3
|
||||||
|
add.w Z2(a3),d2
|
||||||
|
exg d2,d3
|
||||||
|
movem.w d1-d4,(a1)
|
||||||
|
rts
|
||||||
|
|
||||||
|
;-------------------------------------------------------------------------
|
||||||
|
; _asm_cipher_idea(word16 *in,word16 *out,word16 *ks)
|
||||||
|
;
|
||||||
|
;
|
||||||
|
;
|
||||||
|
|
||||||
|
_asm_cipher_idea
|
||||||
|
movem.l a2-a3/d2-d7,-(sp)
|
||||||
|
movem.l 36(sp),a0-a2
|
||||||
|
bsr idea_cip
|
||||||
|
movem.l (sp)+,a2-a3/d2-d7
|
||||||
|
rts
|
||||||
|
|
||||||
|
;-------------------------------------------------------------------------
|
||||||
|
; word16 _asm_mul(word16, word16);
|
||||||
|
;
|
||||||
|
;
|
||||||
|
|
||||||
|
_asm_mul move.w 6(sp),d1
|
||||||
|
idmul 10(sp),d1
|
||||||
|
moveq #0,d0
|
||||||
|
move.w d1,d0
|
||||||
|
rts
|
||||||
|
|
||||||
|
;-------------------------------------------------------------------------
|
||||||
|
; d0:16 = inv(d0)
|
||||||
|
;
|
||||||
|
|
||||||
|
_asm_inv move.w 6(sp),d0
|
||||||
|
|
||||||
|
inv cmp.w #2,d0 ; inv(0)=0,inv(1)=1
|
||||||
|
bcs.b 1$
|
||||||
|
|
||||||
|
cmp.w #3,d0
|
||||||
|
bcc.b 2$
|
||||||
|
|
||||||
|
move.w #32769,d0 ; inv(2)
|
||||||
|
1$ rts
|
||||||
|
|
||||||
|
2$ movem.l d1-d7,-(sp)
|
||||||
|
move.l #$10001,d1 ; d1 = n1
|
||||||
|
moveq #1,d2 ; d2 = b2
|
||||||
|
moveq #0,d3 ; d3 = b1
|
||||||
|
|
||||||
|
inv_loop divu.w d0,d1
|
||||||
|
move.l d1,d4
|
||||||
|
swap d4 ; r = d4
|
||||||
|
tst.w d4
|
||||||
|
beq.b inv_done
|
||||||
|
|
||||||
|
move.w d2,d5
|
||||||
|
muls.w d1,d5
|
||||||
|
exg d3,d2
|
||||||
|
sub.l d5,d2
|
||||||
|
moveq #0,d1
|
||||||
|
move.w d0,d1
|
||||||
|
move.w d4,d0
|
||||||
|
bra.b inv_loop
|
||||||
|
|
||||||
|
inv_done tst.l d2
|
||||||
|
bpl.b 1$
|
||||||
|
|
||||||
|
move.l #$10001,d0
|
||||||
|
add.l d2,d0
|
||||||
|
bra.b 2$
|
||||||
|
|
||||||
|
1$ move.l d2,d0
|
||||||
|
|
||||||
|
2$ movem.l (sp)+,d1-d7
|
||||||
|
rts
|
||||||
|
|
||||||
|
;-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
+285
@@ -0,0 +1,285 @@
|
|||||||
|
;A while ago I posted a message claiming a speed of 238,000
|
||||||
|
;bytes/sec for an implementation of IDEA on a 33Mh 486. Below is
|
||||||
|
;an explanation and some code to show how it works. The basic
|
||||||
|
;trick should be useful on many (but not all) processors. I
|
||||||
|
;expect only those familiar with IDEA and its reference
|
||||||
|
;implementation will be able to follow the discussion. See:
|
||||||
|
;
|
||||||
|
;Lai, Xueja and Massey, James L. A Proposal for a New Block
|
||||||
|
;Encryption Standard, Eurocrypt 90
|
||||||
|
;
|
||||||
|
;For those who have been asking for the code, sorry I kept
|
||||||
|
;putting it off. I wanted to get it out of Turbo Pascal
|
||||||
|
;ideal-mode, but I never had the time.
|
||||||
|
;
|
||||||
|
;Colin Plum wrote IDEA-386 code which is included in PGP
|
||||||
|
;2.3a and uses the same tricks. I don't know who's is
|
||||||
|
;faster, but I expect they will be very close. Now
|
||||||
|
;here's how it's done.
|
||||||
|
;
|
||||||
|
;A major bottleneck in software IDEA is the mul() routine, which
|
||||||
|
;is used 34 times per 64 bit block. The routine performs
|
||||||
|
;multiplication in the multiplicative group mod 2^16+1. The two
|
||||||
|
;factors are each in a 16 bit word, and the output is also in a 16
|
||||||
|
;bit word. Note that 0 is not a member of the multiplicative
|
||||||
|
;group and 2^16 does not fit in 16 bits. We therefor use the 0
|
||||||
|
;word to represent 2^16. Now group elements map one to one onto
|
||||||
|
;all possible 16 bit words, since 2^16+1 is prime.
|
||||||
|
;
|
||||||
|
;Here is (essentially) the reference implementation from [Lai].
|
||||||
|
;
|
||||||
|
;
|
||||||
|
;unsigned mul( unsigned a, unsigned b ) {
|
||||||
|
; long int p ;
|
||||||
|
; long unsigned q ;
|
||||||
|
; if( a==0 ) p= 0x00010001 - b ;
|
||||||
|
; else if( b==0 ) p= 0x00010001 - a ;
|
||||||
|
; else {
|
||||||
|
; q= a*b;
|
||||||
|
; p= (q & 0xffff) - (q>>16)
|
||||||
|
; if( p<0 ) p= p + 0x00010001 ;
|
||||||
|
; }
|
||||||
|
; return (unsigned)(p & 0xffff) ;
|
||||||
|
;}
|
||||||
|
;
|
||||||
|
;
|
||||||
|
;Note the method of reducing a 32 bit word modulo 2^16-1. We
|
||||||
|
;subtract the high word from the low word, and add the modulus
|
||||||
|
;back if the result is less than 0. [Lai] contains a proof that
|
||||||
|
;this works, and you can convince yourself fairly easily.
|
||||||
|
;
|
||||||
|
;To speed up this routine, we note that the tests for a=0 and b=0
|
||||||
|
;will rarely be false. With the possible exception of the first 2
|
||||||
|
;of the 34 multiplications, 0 should be no more likely than any of
|
||||||
|
;the other 65535 numbers. Note that if (and only if) either a or
|
||||||
|
;b is 0 then q will also be 0, and we can check for this in one
|
||||||
|
;instruction if our processor sets a zero flag for multiplication
|
||||||
|
;(as the 68000 does but 80x86 does not).
|
||||||
|
;
|
||||||
|
;Fortunately p will also be zero after the subtraction if and only
|
||||||
|
;if either a or b is 0. Proof: r will be zero when the high order
|
||||||
|
;word of q equals the low order word, and that happens when q is
|
||||||
|
;divisible by 00010001 hex. Since 00010001h = 2^16+1 is prime,
|
||||||
|
;this happens if either a or b is a multiple of 2^16+1, and 0 is
|
||||||
|
;the only such multiple which will fit in a 16 bit word.
|
||||||
|
;
|
||||||
|
;The speed-up strategy is to proceed under the assumption that a
|
||||||
|
;and b are not 0, check to be sure in one instruction, and
|
||||||
|
;recompute if the assumption was wrong. Here's some 8086
|
||||||
|
;assembler code:
|
||||||
|
;
|
||||||
|
; mov ax, [a]
|
||||||
|
; mul [b] ; ax is implied. q is now in DX AX
|
||||||
|
; sub ax, dx ; mod 2^16+1
|
||||||
|
; jnz not0 ; Jump if neither op was 0. Usually taken.
|
||||||
|
;
|
||||||
|
; mov ax, 1 ; recompute result knowing one op is 0.
|
||||||
|
; sub ax, [a]
|
||||||
|
; sub ax, [b]
|
||||||
|
; jmp out ; Just jump over adding the carry.
|
||||||
|
;not0:
|
||||||
|
; adc ax, 0 ; If r<0 add 1, otherwise do nothing.
|
||||||
|
;out: ; Result is now in ax
|
||||||
|
;
|
||||||
|
;
|
||||||
|
;Note that when r<0 we add 1 instead of 2^16+1 since the 2^16 part
|
||||||
|
;overflows out of the result. The "adc ax, 0" does all the work
|
||||||
|
;of checking for a negative result and adding the modulus if
|
||||||
|
;needed.
|
||||||
|
;
|
||||||
|
;The multiplication takes 9 instructions, 4 of which are rarely
|
||||||
|
;executed. I believe similar tricks are possible on many
|
||||||
|
;processors. The one drawback to the check-after-multiply tactic
|
||||||
|
;is that we can't let the multiply overwrite the only copy of an
|
||||||
|
;operand.
|
||||||
|
;
|
||||||
|
;Note that most software implementations of IDEA will run at
|
||||||
|
;slightly different speeds when 0's come up in the multiply
|
||||||
|
;routine. The reference implementation is faster on 0, this one
|
||||||
|
;is faster on non-zero. This may be a problem for some real-time
|
||||||
|
;stuff, and also suggests an attack based on timing.
|
||||||
|
;
|
||||||
|
;Finally, below is an implementation of the complete encryption
|
||||||
|
;function in 8086 assembler, to replace the cipher_idea() function
|
||||||
|
;in PGP. It takes the same parameters as the function from PGP,
|
||||||
|
;and uses the c language calling conventions. I tested it using
|
||||||
|
;the debug features of the idea.c file in PGP. You will need to
|
||||||
|
;add segment/assume directives. This version uses no global data
|
||||||
|
;and should be reentrant.
|
||||||
|
;
|
||||||
|
;The handling of zero multipliers is outside the inner loop so
|
||||||
|
;that a short conditional jump can loop back to the beginning.
|
||||||
|
;Forward conditional jumps are usually not taken and backward
|
||||||
|
;jumps are usually taken, which is consistent with 586 branch
|
||||||
|
;prediction (or so I've heard). Stalls where the output of one
|
||||||
|
;instruction is needed for the next seem unavoidable.
|
||||||
|
;
|
||||||
|
;Last I heard, IDEA was patent pending. My code is up for grabs,
|
||||||
|
;although I would get a kick out being credited if you use it.
|
||||||
|
;On the other hand Colin's code is already tested and ready
|
||||||
|
;to assemble and link with PGP.
|
||||||
|
;
|
||||||
|
;--Bryan
|
||||||
|
;
|
||||||
|
;____________________CODE STARTS BELOW THIS LINE_________
|
||||||
|
|
||||||
|
; Called as: asmcrypt( inbuff, outbuff, zkey ) just like PGP
|
||||||
|
|
||||||
|
PROC _asmcrypt
|
||||||
|
|
||||||
|
; establish parameter and local space on stack
|
||||||
|
; follow c language calling conventions
|
||||||
|
|
||||||
|
ARG inblock:Word, outblock:Word, zkey:Word
|
||||||
|
LOCAL sx1:Word,sx4:Word,skk:Word,done8:Word =stacksize
|
||||||
|
|
||||||
|
push bp
|
||||||
|
mov bp, sp
|
||||||
|
sub sp, stacksize
|
||||||
|
|
||||||
|
; push ax ; My compiler assumes these are not saved.
|
||||||
|
; push bx
|
||||||
|
; push cx
|
||||||
|
; push dx
|
||||||
|
|
||||||
|
push si
|
||||||
|
push di
|
||||||
|
|
||||||
|
; Put the 16 bit sub-blocks in registers and/or local variables
|
||||||
|
mov si, [inblock]
|
||||||
|
mov ax, [si]
|
||||||
|
mov [sx1], ax ; x1 is in ax and sx1
|
||||||
|
mov di, [si+2] ; x2 is in di
|
||||||
|
mov bx, [si+4] ; x3 is in bx
|
||||||
|
mov dx, [si+6]
|
||||||
|
mov [sx4], dx ; x4 is in sx4
|
||||||
|
|
||||||
|
mov si, [zkey] ; si points to next subkey
|
||||||
|
mov [done8], si
|
||||||
|
add [done8], 96 ; we will be finished with 8 rounds
|
||||||
|
; when si=done8
|
||||||
|
|
||||||
|
@@loop: ; 8 rounds of this
|
||||||
|
add di, [si+2] ; x2+=zkey[2] is in di
|
||||||
|
add bx, [si+4] ; x3+=zkey[4] is in bx
|
||||||
|
|
||||||
|
mul [Word si] ;x1 *= zkey[0]
|
||||||
|
sub ax, dx
|
||||||
|
jz @@x1 ; if 0, use special case multiply
|
||||||
|
adc ax, 0
|
||||||
|
@@x1out:
|
||||||
|
mov [sx1], ax ; x1 is in ax and sx1
|
||||||
|
|
||||||
|
xor ax, bx ; ax= x1^x3
|
||||||
|
mul [Word si+8] ; compute kk
|
||||||
|
sub ax, dx ; if 0, use special case multiply
|
||||||
|
jz @@kk
|
||||||
|
adc ax, 0
|
||||||
|
@@kkout:
|
||||||
|
mov cx, ax ; kk is in cx
|
||||||
|
|
||||||
|
mov ax, [sx4] ; x4 *= zkey[6]
|
||||||
|
mul [Word si+6]
|
||||||
|
sub ax, dx
|
||||||
|
jz @@x4 ; if 0, use special case multiply
|
||||||
|
adc ax, 0
|
||||||
|
@@x4out:
|
||||||
|
mov [sx4], ax ; x4 is in sx4 and ax
|
||||||
|
|
||||||
|
xor ax, di ; x4^x2
|
||||||
|
add ax, cx ; kk+(x2^x4)
|
||||||
|
mul [Word si+10] ; compute t1
|
||||||
|
sub ax, dx
|
||||||
|
jz @@t1 ; if 0, use special case multiply
|
||||||
|
adc ax, 0
|
||||||
|
@@t1out: ; t1 is in ax
|
||||||
|
|
||||||
|
add cx, ax ; t2 is in cx kk+t1
|
||||||
|
|
||||||
|
xor [sx4], cx ; x4 in sx4
|
||||||
|
xor di, cx ; new x3 in di
|
||||||
|
xor bx, ax ; new x2 in bx
|
||||||
|
xchg bx, di ; x2 in di, x3 in bx
|
||||||
|
xor ax, [sx1] ; x1 in ax
|
||||||
|
mov [sx1], ax ; and [sx1]
|
||||||
|
|
||||||
|
add si, 12 ; point to next subkey
|
||||||
|
cmp si, [done8]
|
||||||
|
jne @@loop
|
||||||
|
jmp @@out8
|
||||||
|
|
||||||
|
;------------------------------------------
|
||||||
|
; Special case multiplications, when one factor is 0
|
||||||
|
|
||||||
|
@@x1: mov ax, 1
|
||||||
|
sub ax, [sx1]
|
||||||
|
sub ax, [Word si]
|
||||||
|
jmp @@x1out
|
||||||
|
|
||||||
|
@@kk: mov ax, [sx1] ; rebuild overwritten operand
|
||||||
|
xor ax, bx
|
||||||
|
neg ax
|
||||||
|
inc ax
|
||||||
|
sub ax, [si+8]
|
||||||
|
jmp @@kkout
|
||||||
|
|
||||||
|
@@x4: mov ax, 1
|
||||||
|
sub ax, [sx4]
|
||||||
|
sub ax, [Word si+6]
|
||||||
|
jmp @@x4out
|
||||||
|
|
||||||
|
@@t1: mov ax, [sx4] ; rebuild
|
||||||
|
xor ax, di
|
||||||
|
add ax, cx
|
||||||
|
neg ax
|
||||||
|
inc ax
|
||||||
|
sub ax, [si+10]
|
||||||
|
jmp @@t1out
|
||||||
|
|
||||||
|
;---------------------------------------------------
|
||||||
|
; 8 rounds are done, now that extra pseudo-round
|
||||||
|
|
||||||
|
@@out8:
|
||||||
|
push di
|
||||||
|
mov di, [outblock]
|
||||||
|
|
||||||
|
mul [Word si]
|
||||||
|
sub ax, dx
|
||||||
|
jnz @@o1n ; jump over special case code
|
||||||
|
mov ax, 1
|
||||||
|
sub ax, [sx1]
|
||||||
|
sub ax, [si]
|
||||||
|
jmp @@o1out
|
||||||
|
@@o1n: adc ax, 0
|
||||||
|
@@o1out: mov [di], ax ; final ciphertext block 1
|
||||||
|
|
||||||
|
mov ax, [sx4]
|
||||||
|
mul [Word si+6]
|
||||||
|
sub ax, dx
|
||||||
|
jnz @@o4n ; jump over special case code
|
||||||
|
mov ax, 1
|
||||||
|
sub ax, [sx4]
|
||||||
|
sub ax, [si+6]
|
||||||
|
jmp @@o4out
|
||||||
|
@@o4n: adc ax, 0
|
||||||
|
@@o4out: mov [di+6], ax ; final ciphertext block 4
|
||||||
|
|
||||||
|
add bx, [si+2]
|
||||||
|
mov [di+2], bx ; final ciphertext block 2
|
||||||
|
pop ax
|
||||||
|
add ax, [si+4]
|
||||||
|
mov [di+4], ax ; final ciphertext block 3
|
||||||
|
|
||||||
|
; Restore the stack and return
|
||||||
|
|
||||||
|
pop di
|
||||||
|
pop si
|
||||||
|
; pop dx
|
||||||
|
; pop cx
|
||||||
|
; pop bx
|
||||||
|
; pop ax
|
||||||
|
|
||||||
|
mov sp, bp
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
ENDP _asmcrypt
|
||||||
Vendored
+443
@@ -0,0 +1,443 @@
|
|||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "crypt.h"
|
||||||
|
#include "libdes/des.h"
|
||||||
|
|
||||||
|
/* The DES block size */
|
||||||
|
|
||||||
|
#define DES_BLOCKSIZE 8
|
||||||
|
|
||||||
|
/* A structure to hold the two keyscheduled DES keys */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Key_schedule desKey1; /* The first DES key */
|
||||||
|
Key_schedule desKey2; /* The second DES key */
|
||||||
|
} DES3_KEY;
|
||||||
|
|
||||||
|
/* The size of the keyscheduled DES and 3DES keys */
|
||||||
|
|
||||||
|
#define DES_KEYSIZE sizeof( Key_schedule )
|
||||||
|
#define DES3_KEYSIZE sizeof( DES3_KEY )
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* 3DES Self-test Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Are there any 3DES test vectors? Presumably X9F1 will eventually
|
||||||
|
publish some... */
|
||||||
|
|
||||||
|
int des3SelfTest( void )
|
||||||
|
{
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Init/Shutdown Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Perform auxiliary init and shutdown actions on an encryption context */
|
||||||
|
|
||||||
|
int des3InitEx( CRYPT_INFO *cryptInfo, void *cryptInfoEx )
|
||||||
|
{
|
||||||
|
/* Get rid of unused parameter warnings in a compiler-independant manner */
|
||||||
|
if( cryptInfoEx );
|
||||||
|
|
||||||
|
/* Allocate memory for the keyscheduled key */
|
||||||
|
if( cryptInfo->key != NULL || cryptInfo->privateData != NULL )
|
||||||
|
return( CRYPT_INITED );
|
||||||
|
if( ( cryptInfo->key = malloc( DES3_KEYSIZE ) ) == NULL )
|
||||||
|
return( CRYPT_NOMEM );
|
||||||
|
memset( cryptInfo->key, 0, DES3_KEYSIZE );
|
||||||
|
cryptInfo->keyLength = DES3_KEYSIZE;
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int des3Init( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Just pass the call through to the extended setup routine */
|
||||||
|
return( des3InitEx( cryptInfo, NULL ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
int des3End( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Free any allocated memory */
|
||||||
|
secureFree( &cryptInfo->key, cryptInfo->keyLength );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* 3DES En/Decryption Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in ECB mode */
|
||||||
|
|
||||||
|
int des3EncryptECB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
DES3_KEY *des3Key = ( DES3_KEY * ) cryptInfo->key;
|
||||||
|
int blockCount = noBytes / DES_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % DES_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
/* Encrypt a block of data */
|
||||||
|
des_3ecb_encrypt( ( C_Block * ) buffer, ( C_Block * ) buffer,
|
||||||
|
des3Key->desKey1, des3Key->desKey2, DES_ENCRYPT );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += DES_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int des3DecryptECB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
DES3_KEY *des3Key = ( DES3_KEY * ) cryptInfo->key;
|
||||||
|
int blockCount = noBytes / DES_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % DES_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
/* Decrypt a block of data */
|
||||||
|
des_3ecb_encrypt( ( C_Block * ) buffer, ( C_Block * ) buffer,
|
||||||
|
des3Key->desKey1, des3Key->desKey2, DES_DECRYPT );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += DES_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in CBC mode */
|
||||||
|
|
||||||
|
int des3EncryptCBC( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
DES3_KEY *des3Key = ( DES3_KEY * ) cryptInfo->key;
|
||||||
|
int blockCount = noBytes / DES_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % DES_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < DES_BLOCKSIZE; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Encrypt a block of data */
|
||||||
|
des_3ecb_encrypt( ( C_Block * ) buffer, ( C_Block * ) buffer,
|
||||||
|
des3Key->desKey1, des3Key->desKey2, DES_ENCRYPT );
|
||||||
|
|
||||||
|
/* Shift ciphertext into IV */
|
||||||
|
memcpy( cryptInfo->currentIV, buffer, DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += DES_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int des3DecryptCBC( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
DES3_KEY *des3Key = ( DES3_KEY * ) cryptInfo->key;
|
||||||
|
BYTE temp[ DES_BLOCKSIZE ];
|
||||||
|
int blockCount = noBytes / DES_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % DES_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Save the ciphertext */
|
||||||
|
memcpy( temp, buffer, DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Decrypt a block of data */
|
||||||
|
des_3ecb_encrypt( ( C_Block * ) buffer, ( C_Block * ) buffer,
|
||||||
|
des3Key->desKey1, des3Key->desKey2, DES_DECRYPT );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < DES_BLOCKSIZE; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, temp, DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += DES_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear the temporary buffer */
|
||||||
|
memset( temp, 0, DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in CFB mode */
|
||||||
|
|
||||||
|
int des3EncryptCFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
DES3_KEY *des3Key = ( DES3_KEY * ) cryptInfo->key;
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = DES_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
memcpy( cryptInfo->currentIV + ivCount, buffer, bytesToUse );
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > DES_BLOCKSIZE ) ? DES_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
des_3ecb_encrypt( ( C_Block * ) cryptInfo->currentIV,
|
||||||
|
( C_Block * ) cryptInfo->currentIV,
|
||||||
|
des3Key->desKey1, des3Key->desKey2, DES_ENCRYPT );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, buffer, ivCount );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decrypt data in CFB mode. Note that the transformation can be made
|
||||||
|
faster (but less clear) with temp = buffer, buffer ^= iv, iv = temp
|
||||||
|
all in one loop */
|
||||||
|
|
||||||
|
int des3DecryptCFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
DES3_KEY *des3Key = ( DES3_KEY * ) cryptInfo->key;
|
||||||
|
BYTE temp[ DES_BLOCKSIZE ];
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = DES_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Decrypt the data */
|
||||||
|
memcpy( temp, buffer, bytesToUse );
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
memcpy( cryptInfo->currentIV + ivCount, temp, bytesToUse );
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > DES_BLOCKSIZE ) ? DES_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
des_3ecb_encrypt( ( C_Block * ) cryptInfo->currentIV,
|
||||||
|
( C_Block * ) cryptInfo->currentIV,
|
||||||
|
des3Key->desKey1, des3Key->desKey2, DES_ENCRYPT );
|
||||||
|
|
||||||
|
/* Save the ciphertext */
|
||||||
|
memcpy( temp, buffer, ivCount );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, temp, ivCount );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Clear the temporary buffer */
|
||||||
|
memset( temp, 0, DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in OFB mode */
|
||||||
|
|
||||||
|
int des3EncryptOFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
DES3_KEY *des3Key = ( DES3_KEY * ) cryptInfo->key;
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = DES_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > DES_BLOCKSIZE ) ? DES_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
des_3ecb_encrypt( ( C_Block * ) cryptInfo->currentIV,
|
||||||
|
( C_Block * ) cryptInfo->currentIV,
|
||||||
|
des3Key->desKey1, des3Key->desKey2, DES_ENCRYPT );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decrypt data in OFB mode */
|
||||||
|
|
||||||
|
int des3DecryptOFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
DES3_KEY *des3Key = ( DES3_KEY * ) cryptInfo->key;
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = DES_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Decrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > DES_BLOCKSIZE ) ? DES_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
des_3ecb_encrypt( ( C_Block * ) cryptInfo->currentIV,
|
||||||
|
( C_Block * ) cryptInfo->currentIV,
|
||||||
|
des3Key->desKey1, des3Key->desKey2, DES_ENCRYPT );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* 3DES Key Management Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Key schedule two DES keys */
|
||||||
|
|
||||||
|
int des3InitKey( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
DES3_KEY *des3Key = ( DES3_KEY * ) cryptInfo->key;
|
||||||
|
|
||||||
|
/* Call the libdes key schedule code. Returns with -1 if the key parity
|
||||||
|
is wrong, -2 if a weak key is used */
|
||||||
|
if( key_sched( ( C_Block * ) cryptInfo->userKey, des3Key->desKey1 ) )
|
||||||
|
return( CRYPT_BADPARM );
|
||||||
|
if( key_sched( ( C_Block * ) ( cryptInfo->userKey + bitsToBytes( 56 ) ),
|
||||||
|
des3Key->desKey2 ) )
|
||||||
|
return( CRYPT_BADPARM );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
Vendored
+486
@@ -0,0 +1,486 @@
|
|||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "crypt.h"
|
||||||
|
#include "libdes/des.h"
|
||||||
|
|
||||||
|
/* The DES key and block size */
|
||||||
|
|
||||||
|
#define DES_KEYSIZE 7
|
||||||
|
#define DES_BLOCKSIZE 8
|
||||||
|
|
||||||
|
/* The size of the keyscheduled DES key */
|
||||||
|
|
||||||
|
#define DES_EXPANDED_KEYSIZE sizeof( Key_schedule )
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* DES Self-test Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "testdes.h"
|
||||||
|
|
||||||
|
/* Test the DES implementation against the test vectors given in NBS Special
|
||||||
|
Publication 500-20, 1980. We need to perform the tests at a very low
|
||||||
|
level since the encryption library hasn't been intialized yet */
|
||||||
|
|
||||||
|
static int desTestLoop( DES_TEST *testData, int iterations, int operation )
|
||||||
|
{
|
||||||
|
BYTE temp[ DES_BLOCKSIZE ];
|
||||||
|
BYTE key[ DES_EXPANDED_KEYSIZE ];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for( i = 0; i < iterations; i++ )
|
||||||
|
{
|
||||||
|
memcpy( temp, testData[ i ].plaintext, DES_BLOCKSIZE );
|
||||||
|
key_sched( ( C_Block * ) testData[ i ].key,
|
||||||
|
*( ( Key_schedule * ) key ) );
|
||||||
|
des_ecb_encrypt( ( C_Block * ) temp, ( C_Block * ) temp,
|
||||||
|
*( ( Key_schedule * ) key ), operation );
|
||||||
|
if( memcmp( testData[ i ].ciphertext, temp, DES_BLOCKSIZE ) )
|
||||||
|
return( CRYPT_ERROR );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int desSelfTest( void )
|
||||||
|
{
|
||||||
|
/* Check the DES test vectors */
|
||||||
|
if( ( desTestLoop( testIP, sizeof( testIP ) / sizeof( DES_TEST ),
|
||||||
|
DES_ENCRYPT ) != CRYPT_OK ) || \
|
||||||
|
( desTestLoop( testVP, sizeof( testVP ) / sizeof( DES_TEST ),
|
||||||
|
DES_ENCRYPT ) != CRYPT_OK ) || \
|
||||||
|
( desTestLoop( testKP, sizeof( testKP ) / sizeof( DES_TEST ),
|
||||||
|
DES_ENCRYPT ) != CRYPT_OK ) || \
|
||||||
|
( desTestLoop( testRS, sizeof( testRS ) / sizeof( DES_TEST ),
|
||||||
|
DES_DECRYPT ) != CRYPT_OK ) || \
|
||||||
|
( desTestLoop( testDP, sizeof( testDP ) / sizeof( DES_TEST ),
|
||||||
|
DES_ENCRYPT ) != CRYPT_OK ) || \
|
||||||
|
( desTestLoop( testSB, sizeof( testSB ) / sizeof( DES_TEST ),
|
||||||
|
DES_ENCRYPT ) != CRYPT_OK ) )
|
||||||
|
return( CRYPT_SELFTEST );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Init/Shutdown Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Perform auxiliary init and shutdown actions on an encryption context */
|
||||||
|
|
||||||
|
int desInitEx( CRYPT_INFO *cryptInfo, void *cryptInfoEx )
|
||||||
|
{
|
||||||
|
/* Get rid of unused parameter warnings in a compiler-independant manner */
|
||||||
|
if( cryptInfoEx );
|
||||||
|
|
||||||
|
/* Allocate memory for the keyscheduled key */
|
||||||
|
if( cryptInfo->key != NULL || cryptInfo->privateData != NULL )
|
||||||
|
return( CRYPT_INITED );
|
||||||
|
if( ( cryptInfo->key = malloc( DES_EXPANDED_KEYSIZE ) ) == NULL )
|
||||||
|
return( CRYPT_NOMEM );
|
||||||
|
memset( cryptInfo->key, 0, DES_EXPANDED_KEYSIZE );
|
||||||
|
cryptInfo->keyLength = DES_EXPANDED_KEYSIZE;
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int desInit( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Just pass the call through to the extended setup routine */
|
||||||
|
return( desInitEx( cryptInfo, NULL ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
int desEnd( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Free any allocated memory */
|
||||||
|
secureFree( &cryptInfo->key, cryptInfo->keyLength );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* DES En/Decryption Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in ECB mode */
|
||||||
|
|
||||||
|
int desEncryptECB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
int blockCount = noBytes / DES_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % DES_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
/* Encrypt a block of data */
|
||||||
|
des_ecb_encrypt( ( C_Block * ) buffer, ( C_Block * ) buffer,
|
||||||
|
cryptInfo->key, DES_ENCRYPT );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += DES_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int desDecryptECB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
int blockCount = noBytes / DES_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % DES_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
/* Decrypt a block of data */
|
||||||
|
des_ecb_encrypt( ( C_Block * ) buffer, ( C_Block * ) buffer,
|
||||||
|
cryptInfo->key, DES_DECRYPT );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += DES_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in CBC mode */
|
||||||
|
|
||||||
|
int desEncryptCBC( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
int blockCount = noBytes / DES_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % DES_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < DES_BLOCKSIZE; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Encrypt a block of data */
|
||||||
|
des_ecb_encrypt( ( C_Block * ) buffer, ( C_Block * ) buffer,
|
||||||
|
cryptInfo->key, DES_ENCRYPT );
|
||||||
|
|
||||||
|
/* Shift ciphertext into IV */
|
||||||
|
memcpy( cryptInfo->currentIV, buffer, DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += DES_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int desDecryptCBC( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
BYTE temp[ DES_BLOCKSIZE ];
|
||||||
|
int blockCount = noBytes / DES_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % DES_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Save the ciphertext */
|
||||||
|
memcpy( temp, buffer, DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Decrypt a block of data */
|
||||||
|
des_ecb_encrypt( ( C_Block * ) buffer, ( C_Block * ) buffer,
|
||||||
|
cryptInfo->key, DES_DECRYPT );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < DES_BLOCKSIZE; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, temp, DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += DES_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear the temporary buffer */
|
||||||
|
memset( temp, 0, DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in CFB mode */
|
||||||
|
|
||||||
|
int desEncryptCFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = DES_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
memcpy( cryptInfo->currentIV + ivCount, buffer, bytesToUse );
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > DES_BLOCKSIZE ) ? DES_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
des_ecb_encrypt( ( C_Block * ) cryptInfo->currentIV,
|
||||||
|
( C_Block * ) cryptInfo->currentIV,
|
||||||
|
cryptInfo->key, DES_ENCRYPT );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, buffer, ivCount );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int desDecryptCFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
BYTE temp[ DES_BLOCKSIZE ];
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = DES_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Decrypt the data */
|
||||||
|
memcpy( temp, buffer, bytesToUse );
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
memcpy( cryptInfo->currentIV + ivCount, temp, bytesToUse );
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > DES_BLOCKSIZE ) ? DES_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
des_ecb_encrypt( ( C_Block * ) cryptInfo->currentIV,
|
||||||
|
( C_Block * ) cryptInfo->currentIV,
|
||||||
|
cryptInfo->key, DES_ENCRYPT );
|
||||||
|
|
||||||
|
/* Save the ciphertext */
|
||||||
|
memcpy( temp, buffer, ivCount );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, temp, ivCount );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Clear the temporary buffer */
|
||||||
|
memset( temp, 0, DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in OFB mode */
|
||||||
|
|
||||||
|
int desEncryptOFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = DES_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > DES_BLOCKSIZE ) ? DES_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
des_ecb_encrypt( ( C_Block * ) cryptInfo->currentIV,
|
||||||
|
( C_Block * ) cryptInfo->currentIV,
|
||||||
|
cryptInfo->key, DES_ENCRYPT );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int desDecryptOFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = DES_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Decrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > DES_BLOCKSIZE ) ? DES_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
des_ecb_encrypt( ( C_Block * ) cryptInfo->currentIV,
|
||||||
|
( C_Block * ) cryptInfo->currentIV,
|
||||||
|
cryptInfo->key, DES_ENCRYPT );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % DES_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in PCBC mode */
|
||||||
|
|
||||||
|
int desEncryptPCBC( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % DES_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
/* Encrypt the entire buffer */
|
||||||
|
des_pcbc_encrypt( ( C_Block *) buffer, ( C_Block * ) buffer,
|
||||||
|
( long ) noBytes, cryptInfo->key,
|
||||||
|
( C_Block * ) cryptInfo->currentIV, DES_ENCRYPT );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int desDecryptPCBC( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % DES_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
/* Decrypt the entire buffer */
|
||||||
|
des_pcbc_encrypt( ( C_Block *) buffer, ( C_Block * ) buffer,
|
||||||
|
( long ) noBytes, cryptInfo->key,
|
||||||
|
( C_Block * ) cryptInfo->currentIV, DES_DECRYPT );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* DES Key Management Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Key schedule a DES key */
|
||||||
|
|
||||||
|
int desInitKey( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Call the libdes key schedule code. Returns with -1 if the key parity
|
||||||
|
is wrong, -2 if a weak key is used */
|
||||||
|
if( key_sched( ( C_Block * ) cryptInfo->userKey,
|
||||||
|
*( ( Key_schedule * ) cryptInfo->key ) ) )
|
||||||
|
return( CRYPT_BADPARM );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
Vendored
+442
@@ -0,0 +1,442 @@
|
|||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "crypt.h"
|
||||||
|
#include "idea/idea.h"
|
||||||
|
|
||||||
|
/* The IDEA key and block size */
|
||||||
|
|
||||||
|
#define IDEA_KEYSIZE IDEAKEYSIZE
|
||||||
|
#define IDEA_BLOCKSIZE IDEABLOCKSIZE
|
||||||
|
|
||||||
|
/* A structure to hold the two expanded IDEA keys */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
WORD eKey[ IDEAKEYLEN ]; /* The encryption key */
|
||||||
|
WORD dKey[ IDEAKEYLEN ]; /* The decryption key */
|
||||||
|
} IDEA_KEY;
|
||||||
|
|
||||||
|
/* The size of the expanded IDEA keys */
|
||||||
|
|
||||||
|
#define IDEA_EXPANDED_KEYSIZE sizeof( IDEA_KEY )
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* IDEA Self-test Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "testidea.h"
|
||||||
|
|
||||||
|
/* Test the IDEA code against the test vectors from the ETH reference
|
||||||
|
implementation */
|
||||||
|
|
||||||
|
int ideaSelfTest( void )
|
||||||
|
{
|
||||||
|
BYTE temp[ IDEA_BLOCKSIZE ];
|
||||||
|
WORD key[ IDEAKEYLEN ];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for( i = 0; i < sizeof( testIdea ) / sizeof( IDEA_TEST ); i++ )
|
||||||
|
{
|
||||||
|
memcpy( temp, testIdea[ i ].plaintext, IDEA_BLOCKSIZE );
|
||||||
|
ideaExpandKey( testIdea[ i ].key, key );
|
||||||
|
ideaCipher( temp, temp, key );
|
||||||
|
if( memcmp( testIdea[ i ].ciphertext, temp, IDEA_BLOCKSIZE ) )
|
||||||
|
return( CRYPT_ERROR );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Init/Shutdown Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Perform auxiliary init and shutdown actions on an encryption context */
|
||||||
|
|
||||||
|
int ideaInitEx( CRYPT_INFO *cryptInfo, void *cryptInfoEx )
|
||||||
|
{
|
||||||
|
/* Get rid of unused parameter warnings in a compiler-independant manner */
|
||||||
|
if( cryptInfoEx );
|
||||||
|
|
||||||
|
/* Allocate memory for the keyscheduled key */
|
||||||
|
if( cryptInfo->key != NULL || cryptInfo->privateData != NULL )
|
||||||
|
return( CRYPT_INITED );
|
||||||
|
if( ( cryptInfo->key = malloc( IDEA_EXPANDED_KEYSIZE ) ) == NULL )
|
||||||
|
return( CRYPT_NOMEM );
|
||||||
|
memset( cryptInfo->key, 0, IDEA_EXPANDED_KEYSIZE );
|
||||||
|
cryptInfo->keyLength = IDEA_EXPANDED_KEYSIZE;
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int ideaInit( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Just pass the call through to the extended setup routine */
|
||||||
|
return( ideaInitEx( cryptInfo, NULL ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
int ideaEnd( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Free any allocated memory */
|
||||||
|
secureFree( &cryptInfo->key, cryptInfo->keyLength );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* IDEA En/Decryption Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in ECB mode */
|
||||||
|
|
||||||
|
int ideaEncryptECB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
IDEA_KEY *ideaKey = ( IDEA_KEY * ) cryptInfo->key;
|
||||||
|
int blockCount = noBytes / IDEA_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % IDEA_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
/* Encrypt a block of data */
|
||||||
|
ideaCipher( buffer, buffer, ideaKey->eKey );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += IDEA_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int ideaDecryptECB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
IDEA_KEY *ideaKey = ( IDEA_KEY * ) cryptInfo->key;
|
||||||
|
int blockCount = noBytes / IDEA_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % IDEA_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
/* Decrypt a block of data */
|
||||||
|
ideaCipher( buffer, buffer, ideaKey->dKey );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += IDEA_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in CBC mode */
|
||||||
|
|
||||||
|
int ideaEncryptCBC( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
IDEA_KEY *ideaKey = ( IDEA_KEY * ) cryptInfo->key;
|
||||||
|
int blockCount = noBytes / IDEA_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % IDEA_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < IDEA_BLOCKSIZE; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Encrypt a block of data */
|
||||||
|
ideaCipher( buffer, buffer, ideaKey->eKey );
|
||||||
|
|
||||||
|
/* Shift ciphertext into IV */
|
||||||
|
memcpy( cryptInfo->currentIV, buffer, IDEA_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += IDEA_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int ideaDecryptCBC( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
IDEA_KEY *ideaKey = ( IDEA_KEY * ) cryptInfo->key;
|
||||||
|
BYTE temp[ IDEA_BLOCKSIZE ];
|
||||||
|
int blockCount = noBytes / IDEA_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % IDEA_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Save the ciphertext */
|
||||||
|
memcpy( temp, buffer, IDEA_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Decrypt a block of data */
|
||||||
|
ideaCipher( buffer, buffer, ideaKey->dKey );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < IDEA_BLOCKSIZE; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, temp, IDEA_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += IDEA_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear the temporary buffer */
|
||||||
|
memset( temp, 0, IDEA_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in CFB mode */
|
||||||
|
|
||||||
|
int ideaEncryptCFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
IDEA_KEY *ideaKey = ( IDEA_KEY * ) cryptInfo->key;
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = IDEA_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
memcpy( cryptInfo->currentIV + ivCount, buffer, bytesToUse );
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > IDEA_BLOCKSIZE ) ? IDEA_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
ideaCipher( cryptInfo->currentIV, cryptInfo->currentIV, ideaKey->eKey );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, buffer, ivCount );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % IDEA_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decrypt data in CFB mode. Note that the transformation can be made
|
||||||
|
faster (but less clear) with temp = buffer, buffer ^= iv, iv = temp
|
||||||
|
all in one loop */
|
||||||
|
|
||||||
|
int ideaDecryptCFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
IDEA_KEY *ideaKey = ( IDEA_KEY * ) cryptInfo->key;
|
||||||
|
BYTE temp[ IDEA_BLOCKSIZE ];
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = IDEA_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Decrypt the data */
|
||||||
|
memcpy( temp, buffer, bytesToUse );
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
memcpy( cryptInfo->currentIV + ivCount, temp, bytesToUse );
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > IDEA_BLOCKSIZE ) ? IDEA_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
ideaCipher( cryptInfo->currentIV, cryptInfo->currentIV, ideaKey->eKey );
|
||||||
|
|
||||||
|
/* Save the ciphertext */
|
||||||
|
memcpy( temp, buffer, ivCount );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, temp, ivCount );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % IDEA_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Clear the temporary buffer */
|
||||||
|
memset( temp, 0, IDEA_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in OFB mode */
|
||||||
|
|
||||||
|
int ideaEncryptOFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
IDEA_KEY *ideaKey = ( IDEA_KEY * ) cryptInfo->key;
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = IDEA_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > IDEA_BLOCKSIZE ) ? IDEA_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
ideaCipher( cryptInfo->currentIV, cryptInfo->currentIV, ideaKey->eKey );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % IDEA_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decrypt data in OFB mode */
|
||||||
|
|
||||||
|
int ideaDecryptOFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
IDEA_KEY *ideaKey = ( IDEA_KEY * ) cryptInfo->key;
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = IDEA_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Decrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > IDEA_BLOCKSIZE ) ? IDEA_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
ideaCipher( cryptInfo->currentIV, cryptInfo->currentIV, ideaKey->eKey );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % IDEA_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* IDEA Key Management Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Key schedule an IDEA key */
|
||||||
|
|
||||||
|
int ideaInitKey( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
IDEA_KEY *ideaKey = ( IDEA_KEY * ) cryptInfo->key;
|
||||||
|
|
||||||
|
/* Generate an expanded IDEA key and its inverse */
|
||||||
|
ideaExpandKey( cryptInfo->userKey, ideaKey->eKey );
|
||||||
|
ideaInvertKey( ideaKey->eKey, ideaKey->dKey );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
Vendored
+460
@@ -0,0 +1,460 @@
|
|||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "crypt.h"
|
||||||
|
#include "mdc/shs.h"
|
||||||
|
|
||||||
|
/* The default key setup iteration count. This gives roughly 0.5s delay on
|
||||||
|
a 10K dhrystone machine */
|
||||||
|
|
||||||
|
#define MDCSHS_DEFAULT_ITERATIONS 200
|
||||||
|
|
||||||
|
/* The size of an MDCSHS key. If we're running on a machine with a > 32
|
||||||
|
bit wordsize, we need to store the key as an array of words rather than
|
||||||
|
an array of bytes which is cast to an array of words */
|
||||||
|
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
#define MDCSHS_KEY_WORDS ( SHS_DATASIZE / 4 )
|
||||||
|
#define MDCSHS_KEYSIZE ( MDCSHS_KEY_WORDS * sizeof( LONG ) )
|
||||||
|
#else
|
||||||
|
#define MDCSHS_KEYSIZE SHS_DATASIZE
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
|
||||||
|
/* If we're running on a machine with > 32 bit wordsize we need to jump
|
||||||
|
through all sorts of hoops to convert data from arrays of bytes to arrays
|
||||||
|
of longints. The following macros pull bytes out of memory and assemble
|
||||||
|
them into a longword, and deposit a longword into memory as a series of
|
||||||
|
bytes. This code really blows on any processors which need to use it */
|
||||||
|
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
#ifdef BIG_ENDIAN
|
||||||
|
#define mgetLong(memPtr) \
|
||||||
|
( ( ( LONG ) memPtr[ 0 ] << 24 ) | ( ( LONG ) memPtr[ 1 ] << 16 ) | \
|
||||||
|
( ( LONG ) memPtr[ 2 ] << 8 ) | ( ( LONG ) memPtr[ 3 ] ) ); \
|
||||||
|
memPtr += 4
|
||||||
|
|
||||||
|
#define mputLong(memPtr,data) \
|
||||||
|
memPtr[ 0 ] = ( ( data ) >> 24 ) & 0xFF; \
|
||||||
|
memPtr[ 1 ] = ( ( data ) >> 16 ) & 0xFF; \
|
||||||
|
memPtr[ 2 ] = ( ( data ) >> 8 ) & 0xFF; \
|
||||||
|
memPtr[ 3 ] = ( data ) & 0xFF; \
|
||||||
|
memPtr += 4
|
||||||
|
#else
|
||||||
|
#define mgetLong(memPtr) \
|
||||||
|
( ( ( LONG ) memPtr[ 0 ] ) | ( ( LONG ) memPtr[ 1 ] << 8 ) | \
|
||||||
|
( ( LONG ) memPtr[ 2 ] << 16 ) | ( ( LONG ) memPtr[ 3 ] << 24 ) ); \
|
||||||
|
memPtr += 4
|
||||||
|
|
||||||
|
#define mputLong(memPtr,data) \
|
||||||
|
memPtr[ 0 ] = ( data ) & 0xFF; \
|
||||||
|
memPtr[ 1 ] = ( ( data ) >> 8 ) & 0xFF; \
|
||||||
|
memPtr[ 2 ] = ( ( data ) >> 16 ) & 0xFF; \
|
||||||
|
memPtr[ 3 ] = ( ( data ) >> 24 ) & 0xFF; \
|
||||||
|
memPtr += 4
|
||||||
|
#endif /* BIG_ENDIAN */
|
||||||
|
|
||||||
|
/* Versions of the above which are guaranteed to always be big-endian */
|
||||||
|
|
||||||
|
#define mgetELong(memPtr) \
|
||||||
|
( ( ( LONG ) memPtr[ 0 ] << 24 ) | ( ( LONG ) memPtr[ 1 ] << 16 ) | \
|
||||||
|
( ( LONG ) memPtr[ 2 ] << 8 ) | ( LONG ) memPtr[ 3 ] ); \
|
||||||
|
memPtr += 4
|
||||||
|
|
||||||
|
#define mputELong(memPtr,data) \
|
||||||
|
memPtr[ 0 ] = ( ( data ) >> 24 ) & 0xFF; \
|
||||||
|
memPtr[ 1 ] = ( ( data ) >> 16 ) & 0xFF; \
|
||||||
|
memPtr[ 2 ] = ( ( data ) >> 8 ) & 0xFF; \
|
||||||
|
memPtr[ 3 ] = ( data ) & 0xFF; \
|
||||||
|
memPtr += 4
|
||||||
|
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
|
||||||
|
/* Copy an array of bytes to an array of 32-bit words. We need to take
|
||||||
|
special precautions when the machine word size is > 32 bits because we
|
||||||
|
can't just assume BYTE[] == LONG[] */
|
||||||
|
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
#define copyToLong(dest,src,count) \
|
||||||
|
{ \
|
||||||
|
LONG *destPtr = ( LONG * ) dest; \
|
||||||
|
BYTE *srcPtr = src; \
|
||||||
|
int i; \
|
||||||
|
for( i = 0; i < count / 4; i++ ) \
|
||||||
|
{ \
|
||||||
|
destPtr[ i ] = mgetLong( srcPtr ); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define copyToLong(dest,src,count) \
|
||||||
|
memcpy( dest, src, count )
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* MDC/SHS Self-test Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Test the SHA output against the test vectors given in FIPS 180 */
|
||||||
|
|
||||||
|
static LONG shsTestResults[][ 5 ] = {
|
||||||
|
{ 0x0164B8A9L, 0x14CD2A5EL, 0x74C4F7FFL, 0x082C4D97L, 0xF1EDF880L },
|
||||||
|
{ 0xD2516EE1L, 0xACFA5BAFL, 0x33DFC1C4L, 0x71E43844L, 0x9EF134C8L },
|
||||||
|
{ 0x3232AFFAL, 0x48628A26L, 0x653B5AAAL, 0x44541FD9L, 0x0D690603L }
|
||||||
|
};
|
||||||
|
|
||||||
|
static int compareSHSresults( SHS_INFO *shsInfo, int shsTestLevel )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Compare the returned digest and required values */
|
||||||
|
for( i = 0; i < 5; i++ )
|
||||||
|
if( shsInfo->digest[ i ] != shsTestResults[ shsTestLevel ][ i ] )
|
||||||
|
return( CRYPT_SELFTEST );
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int mdcshsSelfTest( void )
|
||||||
|
{
|
||||||
|
SHS_INFO shsInfo;
|
||||||
|
|
||||||
|
/* Test SHA against values given in FIPS 180 */
|
||||||
|
shsInit( &shsInfo );
|
||||||
|
shsUpdate( &shsInfo, ( BYTE * ) "abc", 3 );
|
||||||
|
shsFinal( &shsInfo );
|
||||||
|
if( compareSHSresults( &shsInfo, 0 ) != CRYPT_OK )
|
||||||
|
return( CRYPT_SELFTEST );
|
||||||
|
shsInit( &shsInfo );
|
||||||
|
shsUpdate( &shsInfo, ( BYTE * ) "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56 );
|
||||||
|
shsFinal( &shsInfo );
|
||||||
|
if( compareSHSresults( &shsInfo, 1 ) != CRYPT_OK )
|
||||||
|
return( CRYPT_SELFTEST );
|
||||||
|
#if 0
|
||||||
|
/* We skip the third test since this takes several seconds to execute,
|
||||||
|
which leads to an unacceptable delay in the library startup time */
|
||||||
|
shsInit( &shsInfo );
|
||||||
|
for( i = 0; i < 15625; i++ )
|
||||||
|
shsUpdate( &shsInfo, ( BYTE * ) "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 64 );
|
||||||
|
shsFinal( &shsInfo );
|
||||||
|
if( compareSHSresults( &shsInfo, 2 ) != CRYPT_OK )
|
||||||
|
return( CRYPT_SELFTEST );
|
||||||
|
#endif /* 0 */
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Init/Shutdown Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Perform auxiliary init and shutdown actions on an encryption context */
|
||||||
|
|
||||||
|
int mdcshsInitEx( CRYPT_INFO *cryptInfo, void *cryptInfoEx )
|
||||||
|
{
|
||||||
|
CRYPT_INFO_MDCSHS *cryptInfoExPtr = ( CRYPT_INFO_MDCSHS * ) cryptInfoEx;
|
||||||
|
|
||||||
|
/* Allocate memory for the key and the algorithm-specific data within
|
||||||
|
the crypt context and set up any pointers we need */
|
||||||
|
if( cryptInfo->key != NULL || cryptInfo->privateData != NULL )
|
||||||
|
return( CRYPT_INITED );
|
||||||
|
if( ( cryptInfo->key = malloc( MDCSHS_KEYSIZE ) ) == NULL )
|
||||||
|
return( CRYPT_NOMEM );
|
||||||
|
memset( cryptInfo->key, 0, MDCSHS_KEYSIZE );
|
||||||
|
if( ( cryptInfo->privateData = malloc( sizeof( CRYPT_INFO_MDCSHS ) ) ) == NULL )
|
||||||
|
{
|
||||||
|
free( cryptInfo->key );
|
||||||
|
cryptInfo->key = NULL;
|
||||||
|
return( CRYPT_NOMEM );
|
||||||
|
}
|
||||||
|
if( cryptInfoExPtr->keySetupIterations == CRYPT_USE_DEFAULT )
|
||||||
|
cryptInfoExPtr->keySetupIterations = MDCSHS_DEFAULT_ITERATIONS;
|
||||||
|
memcpy( cryptInfo->privateData, cryptInfoEx, sizeof( CRYPT_INFO_MDCSHS ) );
|
||||||
|
cryptInfo->keyLength = MDCSHS_KEYSIZE;
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int mdcshsInit( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
CRYPT_INFO_MDCSHS cryptInfoEx;
|
||||||
|
|
||||||
|
/* Use the default number of setup iterations */
|
||||||
|
memset( &cryptInfoEx, 0, sizeof( CRYPT_INFO_MDCSHS ) );
|
||||||
|
cryptInfoEx.keySetupIterations = CRYPT_USE_DEFAULT;
|
||||||
|
|
||||||
|
/* Pass through to the extended setup routine */
|
||||||
|
return( mdcshsInitEx( cryptInfo, &cryptInfoEx ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
int mdcshsEnd( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Free any allocated memory */
|
||||||
|
secureFree( &cryptInfo->key, cryptInfo->keyLength );
|
||||||
|
secureFree( &cryptInfo->privateData, sizeof( CRYPT_INFO_MDCSHS ) );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* MDC/SHS En/Decryption Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* The SHS transformation. What we're doing here isn't totally correct since
|
||||||
|
we're forcing the IV to big-endian, transforming it, and returning it to
|
||||||
|
the local endianness, rather than changing the data to the local
|
||||||
|
endianness and back as we should. However doing it correctly isn't really
|
||||||
|
possible since we can only endianness-swap 4 bytes at a time which
|
||||||
|
precludes swapping the data. The use of the temp variable when the IV is
|
||||||
|
copied back in the _BIG_WORDS case is to eliminate multiple memory
|
||||||
|
accesses when the four bytes are extracted from ivLong[ n ], since many
|
||||||
|
compilers won't risk optimising the loads due to possible aliasing
|
||||||
|
problems. We declare the necessary ivLong array as part of the actual
|
||||||
|
encryption function to save it having to be instantiated for every use
|
||||||
|
of shsTransform() */
|
||||||
|
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
#define shsTransform(cI) { \
|
||||||
|
LONG temp; \
|
||||||
|
BYTE *ivPtr; \
|
||||||
|
ivPtr = ( BYTE * ) cI->currentIV; \
|
||||||
|
for( i = 0; i < 5; i++ ) \
|
||||||
|
{ \
|
||||||
|
ivLong[ i ] = mgetELong( ivPtr ); \
|
||||||
|
} \
|
||||||
|
SHSTransform( ivLong, cI->key ); \
|
||||||
|
ivPtr = ( BYTE * ) cI->currentIV; \
|
||||||
|
for( i = 0; i < 5; i++ ) \
|
||||||
|
{ \
|
||||||
|
temp = ivLong[ i ]; \
|
||||||
|
mputELong( ivPtr, temp ); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define shsTransform(cI) longReverse( ( LONG * ) cI->currentIV, SHS_DIGESTSIZE ); \
|
||||||
|
SHSTransform( ( LONG * ) cI->currentIV, ( LONG * ) cI->key ); \
|
||||||
|
longReverse( ( LONG * ) cI->currentIV, SHS_DIGESTSIZE );
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
|
||||||
|
void SHSTransform( LONG *digest, LONG *data );
|
||||||
|
|
||||||
|
/* Encrypt data in CFB mode */
|
||||||
|
|
||||||
|
int mdcshsEncrypt( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
LONG ivLong[ 5 ];
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = SHS_DIGESTSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
memcpy( cryptInfo->currentIV + ivCount, buffer, bytesToUse );
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > SHS_DIGESTSIZE ) ? SHS_DIGESTSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
shsTransform( cryptInfo );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, buffer, ivCount );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % SHS_DIGESTSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decrypt data in CFB mode. Note that the transformation can be made
|
||||||
|
faster (but less clear) with temp = buffer, buffer ^= iv, iv = temp
|
||||||
|
all in one loop */
|
||||||
|
|
||||||
|
int mdcshsDecrypt( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
BYTE temp[ SHS_DIGESTSIZE ];
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
LONG ivLong[ 5 ];
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = SHS_DIGESTSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Decrypt the data */
|
||||||
|
memcpy( temp, buffer, bytesToUse );
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
memcpy( cryptInfo->currentIV + ivCount, temp, bytesToUse );
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > SHS_DIGESTSIZE ) ? SHS_DIGESTSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
shsTransform( cryptInfo );
|
||||||
|
|
||||||
|
/* Save the ciphertext */
|
||||||
|
memcpy( temp, buffer, ivCount );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, temp, ivCount );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % SHS_DIGESTSIZE );
|
||||||
|
|
||||||
|
/* Clear the temporary buffer */
|
||||||
|
memset( temp, 0, SHS_DIGESTSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* MDC/SHS Key Management Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* The size of the key buffer. Note that increasing this value will result
|
||||||
|
in a significant increase in the setup time, so it will be necessary to
|
||||||
|
make a corresponding decrease in the iteration count */
|
||||||
|
|
||||||
|
#define KEYBUFFER_SIZE 256
|
||||||
|
|
||||||
|
/* Initialise an MDC/SHS key. This is done by repeatedly encrypting the
|
||||||
|
user key as follows:
|
||||||
|
|
||||||
|
IV <- 0
|
||||||
|
key <- 0
|
||||||
|
repeat
|
||||||
|
encrypt userkey with key
|
||||||
|
key <- userkey
|
||||||
|
|
||||||
|
The IV is updated transparently as part of the encryption process */
|
||||||
|
|
||||||
|
int mdcshsInitKey( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
BYTE keyData[ KEYBUFFER_SIZE ];
|
||||||
|
int keySetupIterations = ( ( CRYPT_INFO_MDCSHS * ) cryptInfo->privateData )->keySetupIterations;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
/* Copy the key information into the key data buffer. We silently
|
||||||
|
truncate the key length to the size of the buffer, but this usually
|
||||||
|
is some hundreds of bytes so it shouldn't be a problem.
|
||||||
|
We also correct the endianness of the keyData at this point. From
|
||||||
|
here on all data is in the local endianness format so there is no need
|
||||||
|
for further corrections */
|
||||||
|
memset( keyData, 0, KEYBUFFER_SIZE );
|
||||||
|
keyData[ 0 ] = ( BYTE ) ( cryptInfo->userKeyLength >> 8 );
|
||||||
|
keyData[ 1 ] = ( BYTE ) cryptInfo->userKeyLength;
|
||||||
|
cryptInfo->userKeyLength %= KEYBUFFER_SIZE - 2;
|
||||||
|
memcpy( keyData + 2, cryptInfo->userKey, cryptInfo->userKeyLength );
|
||||||
|
|
||||||
|
/* Set the initial key and IV to null */
|
||||||
|
memset( cryptInfo->currentIV, 0, CRYPT_MAX_IVSIZE );
|
||||||
|
memset( cryptInfo->key, 0, MDCSHS_KEYSIZE );
|
||||||
|
|
||||||
|
/* Convert the endianness of the input data from the canonical form to
|
||||||
|
the local form */
|
||||||
|
longReverse( ( LONG * ) keyData, KEYBUFFER_SIZE );
|
||||||
|
|
||||||
|
/* "Encrypt" the keyData with the given IV and then set the key to
|
||||||
|
the encrypted keyData. The act of encryption also sets the IV.
|
||||||
|
This is particularly important in the case of SHS, since although only
|
||||||
|
the first SHS_DATASIZE bytes are copied into the key, the IV is
|
||||||
|
still affected by the entire buffer */
|
||||||
|
for( count = 0; count < keySetupIterations; count++ )
|
||||||
|
{
|
||||||
|
mdcshsEncrypt( cryptInfo, keyData, KEYBUFFER_SIZE );
|
||||||
|
copyToLong( cryptInfo->key, keyData, SHS_DATASIZE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform one last copy in case they've specified zero iterations and
|
||||||
|
the loop was never executed. For MDCSHS, the transformed key is the
|
||||||
|
same as the raw encryption key, so we just copy it over */
|
||||||
|
copyToLong( cryptInfo->key, keyData, SHS_DATASIZE );
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Set the key check byte to the last WORD of the encrypted keyData.
|
||||||
|
This is never used for anything (it's 191 bytes past the end of the
|
||||||
|
last value used to set the key) so we're not revealing much to an
|
||||||
|
attacker */
|
||||||
|
longReverse( ( LONG * ) ( keyData + KEYBUFFER_SIZE - sizeof( LONG ) ), sizeof( LONG ) );
|
||||||
|
cryptInfo->keyCheck = ( ( WORD ) keyData[ KEYBUFFER_SIZE - 2 ] << 8 ) | \
|
||||||
|
keyData[ KEYBUFFER_SIZE - 1 ];
|
||||||
|
#endif /* 0 */
|
||||||
|
|
||||||
|
/* Finally, create a copy of the transformed key in the canonical form
|
||||||
|
in case the user wants to access it */
|
||||||
|
memcpy( cryptInfo->transUserKey, keyData, MDCSHS_KEYSIZE );
|
||||||
|
longReverse( ( LONG * ) cryptInfo->transUserKey, SHS_DATASIZE );
|
||||||
|
|
||||||
|
/* Wipe the keyData */
|
||||||
|
memset( keyData, 0, KEYBUFFER_SIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialise the IV */
|
||||||
|
|
||||||
|
int mdcshsInitIV( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Convert the working IV from the canonical to the internal form */
|
||||||
|
longReverse( ( LONG * ) cryptInfo->currentIV, CRYPT_MAX_IVSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
Vendored
+68
@@ -0,0 +1,68 @@
|
|||||||
|
#include "crypt.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Null En/Decryption Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int nullSelfTest( void )
|
||||||
|
{
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int nullInit( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Get rid of unused parameter warning in a compiler-independant manner */
|
||||||
|
if( cryptInfo );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int nullInitEx( CRYPT_INFO *cryptInfo, void *cryptInfoEx )
|
||||||
|
{
|
||||||
|
/* Get rid of unused parameter warning in a compiler-independant manner */
|
||||||
|
if( cryptInfoEx );
|
||||||
|
|
||||||
|
return( nullInit( cryptInfo ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
int nullEnd( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Get rid of unused parameter warning in a compiler-independant manner */
|
||||||
|
if( cryptInfo );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int nullInitKey( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Get rid of unused parameter warning in a compiler-independant manner */
|
||||||
|
if( cryptInfo );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int nullInitIV( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Get rid of unused parameter warning in a compiler-independant manner */
|
||||||
|
if( cryptInfo );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int nullEncrypt( CRYPT_INFO *cryptInfo, void *buffer, int length )
|
||||||
|
{
|
||||||
|
/* Get rid of unused parameter warning in a compiler-independant manner */
|
||||||
|
if( cryptInfo || buffer || length );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int nullDecrypt( CRYPT_INFO *cryptInfo, void *buffer, int length )
|
||||||
|
{
|
||||||
|
/* Get rid of unused parameter warning in a compiler-independant manner */
|
||||||
|
if( cryptInfo || buffer || length );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
Vendored
+134
@@ -0,0 +1,134 @@
|
|||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "crypt.h"
|
||||||
|
#include "rc4/rc4.h"
|
||||||
|
|
||||||
|
/* The size of the expanded IDEA keys */
|
||||||
|
|
||||||
|
#define RC4_EXPANDED_KEYSIZE sizeof( RC4KEY )
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* RC4 Self-test Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "testrc4.h"
|
||||||
|
|
||||||
|
/* Test the RC4 code against the test vectors from the BSAFE2 implementation */
|
||||||
|
|
||||||
|
static int rc4Test( BYTE *key, int keySize,
|
||||||
|
BYTE *plaintext, BYTE *ciphertext, int length )
|
||||||
|
{
|
||||||
|
BYTE temp[ 512 ];
|
||||||
|
RC4KEY rc4key;
|
||||||
|
|
||||||
|
memcpy( temp, plaintext, length );
|
||||||
|
rc4ExpandKey( &rc4key, key, keySize );
|
||||||
|
rc4Crypt( &rc4key, temp, length );
|
||||||
|
if( memcmp( ciphertext, temp, length ) )
|
||||||
|
return( CRYPT_ERROR );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int rc4SelfTest( void )
|
||||||
|
{
|
||||||
|
/* The testing gets somewhat messy here because of the variable-length
|
||||||
|
arrays, which isn't normally a problem with the fixed-length keys
|
||||||
|
and data used in the block ciphers */
|
||||||
|
if( rc4Test( testRC4key1, sizeof( testRC4key1 ), testRC4plaintext1,
|
||||||
|
testRC4ciphertext1, sizeof( testRC4plaintext1 ) ) != CRYPT_OK ||
|
||||||
|
rc4Test( testRC4key2, sizeof( testRC4key2 ), testRC4plaintext2,
|
||||||
|
testRC4ciphertext2, sizeof( testRC4plaintext2 ) ) != CRYPT_OK ||
|
||||||
|
rc4Test( testRC4key3, sizeof( testRC4key3 ), testRC4plaintext3,
|
||||||
|
testRC4ciphertext3, sizeof( testRC4plaintext3 ) ) != CRYPT_OK ||
|
||||||
|
rc4Test( testRC4key4, sizeof( testRC4key4 ), testRC4plaintext4,
|
||||||
|
testRC4ciphertext4, sizeof( testRC4plaintext4 ) ) != CRYPT_OK ||
|
||||||
|
rc4Test( testRC4key5, sizeof( testRC4key5 ), testRC4plaintext5,
|
||||||
|
testRC4ciphertext5, sizeof( testRC4plaintext5 ) ) != CRYPT_OK )
|
||||||
|
return( CRYPT_ERROR );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Init/Shutdown Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Perform auxiliary init and shutdown actions on an encryption context */
|
||||||
|
|
||||||
|
int rc4InitEx( CRYPT_INFO *cryptInfo, void *cryptInfoEx )
|
||||||
|
{
|
||||||
|
/* Get rid of unused parameter warnings in a compiler-independant manner */
|
||||||
|
if( cryptInfoEx );
|
||||||
|
|
||||||
|
/* Allocate memory for the expanded key */
|
||||||
|
if( cryptInfo->key != NULL || cryptInfo->privateData != NULL )
|
||||||
|
return( CRYPT_INITED );
|
||||||
|
if( ( cryptInfo->key = malloc( RC4_EXPANDED_KEYSIZE ) ) == NULL )
|
||||||
|
return( CRYPT_NOMEM );
|
||||||
|
memset( cryptInfo->key, 0, RC4_EXPANDED_KEYSIZE );
|
||||||
|
cryptInfo->keyLength = RC4_EXPANDED_KEYSIZE;
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int rc4Init( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Just pass the call through to the extended setup routine */
|
||||||
|
return( rc4InitEx( cryptInfo, NULL ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
int rc4End( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Free any allocated memory */
|
||||||
|
secureFree( &cryptInfo->key, cryptInfo->keyLength );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* RC4 En/Decryption Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data. Since RC4 is a stream cipher, encryption and
|
||||||
|
decryption are one and the same */
|
||||||
|
|
||||||
|
int rc4Encrypt( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
rc4Crypt( ( RC4KEY * ) cryptInfo->key, buffer, noBytes );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int rc4Decrypt( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
rc4Crypt( ( RC4KEY * ) cryptInfo->key, buffer, noBytes );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* RC4 Key Management Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Create an expanded RC4 key */
|
||||||
|
|
||||||
|
int rc4InitKey( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
rc4ExpandKey( ( RC4KEY * ) cryptInfo->key, cryptInfo->userKey,
|
||||||
|
cryptInfo->userKeyLength );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
Vendored
+489
@@ -0,0 +1,489 @@
|
|||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "crypt.h"
|
||||||
|
#include "safer/safer.h"
|
||||||
|
|
||||||
|
/* The SAFER key and block size */
|
||||||
|
|
||||||
|
#define SAFER_KEYSIZE SAFER_KEY_LEN
|
||||||
|
#define SAFER_BLOCKSIZE SAFER_BLOCK_LEN
|
||||||
|
|
||||||
|
#define SAFER_KEY safer_key_t
|
||||||
|
|
||||||
|
/* The size of the expanded SAFER keys */
|
||||||
|
|
||||||
|
#define SAFER_EXPANDED_KEYSIZE sizeof( SAFER_KEY )
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* SAFER Self-test Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "testsafr.h"
|
||||||
|
|
||||||
|
/* Test the SAFER-SK code against the test vectors from the ETH reference
|
||||||
|
implementation */
|
||||||
|
|
||||||
|
int saferSelfTest( void )
|
||||||
|
{
|
||||||
|
BYTE temp[ SAFER_BLOCKSIZE ];
|
||||||
|
SAFER_KEY key;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
Safer_Init_Module();
|
||||||
|
for( i = 0; i < sizeof( testSafer ) / sizeof( SAFER_TEST ); i++ )
|
||||||
|
{
|
||||||
|
memcpy( temp, testSafer[ i ].plaintext, SAFER_BLOCKSIZE );
|
||||||
|
if( testSafer[ i ].rounds == SAFER_K64_DEFAULT_NOF_ROUNDS )
|
||||||
|
Safer_Expand_Userkey( testSafer[ i ].key, \
|
||||||
|
testSafer[ i ].key, \
|
||||||
|
testSafer[ i ].rounds, TRUE, key );
|
||||||
|
else
|
||||||
|
Safer_Expand_Userkey( testSafer[ i ].key, \
|
||||||
|
testSafer[ i ].key + bitsToBytes( 64 ), \
|
||||||
|
testSafer[ i ].rounds, TRUE, key );
|
||||||
|
Safer_Encrypt_Block( temp, key, temp );
|
||||||
|
if( memcmp( testSafer[ i ].ciphertext, temp, SAFER_BLOCKSIZE ) )
|
||||||
|
return( CRYPT_ERROR );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Init/Shutdown Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Perform auxiliary init and shutdown actions on an encryption context */
|
||||||
|
|
||||||
|
int saferInitEx( CRYPT_INFO *cryptInfo, void *cryptInfoEx )
|
||||||
|
{
|
||||||
|
CRYPT_INFO_SAFER *cryptInfoExPtr = ( CRYPT_INFO_SAFER * ) cryptInfoEx;
|
||||||
|
|
||||||
|
/* Allocate memory for the key and the algorithm-specific data within
|
||||||
|
the crypt context and set up any pointers we need. We don't process
|
||||||
|
cryptInfoExPtr->rounds at this point since we set things up when we
|
||||||
|
perform the saferInitKey() function, as the number of rounds is key-
|
||||||
|
dependant */
|
||||||
|
if( cryptInfo->key != NULL || cryptInfo->privateData != NULL )
|
||||||
|
return( CRYPT_INITED );
|
||||||
|
if( ( cryptInfo->key = malloc( SAFER_EXPANDED_KEYSIZE ) ) == NULL )
|
||||||
|
return( CRYPT_NOMEM );
|
||||||
|
memset( cryptInfo->key, 0, SAFER_EXPANDED_KEYSIZE );
|
||||||
|
if( ( cryptInfo->privateData = malloc( sizeof( CRYPT_INFO_SAFER ) ) ) == NULL )
|
||||||
|
{
|
||||||
|
free( cryptInfo->key );
|
||||||
|
cryptInfo->key = NULL;
|
||||||
|
return( CRYPT_NOMEM );
|
||||||
|
}
|
||||||
|
if( cryptInfoExPtr->useSaferSK == CRYPT_USE_DEFAULT )
|
||||||
|
cryptInfoExPtr->useSaferSK = FALSE;
|
||||||
|
memcpy( cryptInfo->privateData, cryptInfoEx, sizeof( CRYPT_INFO_SAFER ) );
|
||||||
|
cryptInfo->keyLength = SAFER_EXPANDED_KEYSIZE;
|
||||||
|
|
||||||
|
/* Set up the SAFER data tables if necessary */
|
||||||
|
Safer_Init_Module();
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int saferInit( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
CRYPT_INFO_SAFER cryptInfoEx;
|
||||||
|
|
||||||
|
/* Use the default number of rounds and the non-enhanced SAFER */
|
||||||
|
memset( &cryptInfoEx, 0, sizeof( CRYPT_INFO_MDCSHS ) );
|
||||||
|
cryptInfoEx.rounds = CRYPT_USE_DEFAULT;
|
||||||
|
cryptInfoEx.useSaferSK = CRYPT_USE_DEFAULT;
|
||||||
|
|
||||||
|
/* Pass through to the extended setup routine */
|
||||||
|
return( saferInitEx( cryptInfo, &cryptInfoEx ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
int saferEnd( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
/* Free any allocated memory */
|
||||||
|
secureFree( &cryptInfo->key, cryptInfo->keyLength );
|
||||||
|
secureFree( &cryptInfo->privateData, sizeof( CRYPT_INFO_SAFER ) );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* SAFER En/Decryption Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in ECB mode */
|
||||||
|
|
||||||
|
int saferEncryptECB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
SAFER_KEY *saferKey = ( SAFER_KEY * ) cryptInfo->key;
|
||||||
|
int blockCount = noBytes / SAFER_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % SAFER_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
/* Encrypt a block of data */
|
||||||
|
Safer_Encrypt_Block( buffer, *saferKey, buffer );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += SAFER_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int saferDecryptECB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
SAFER_KEY *saferKey = ( SAFER_KEY * ) cryptInfo->key;
|
||||||
|
int blockCount = noBytes / SAFER_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % SAFER_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
/* Decrypt a block of data */
|
||||||
|
Safer_Decrypt_Block( buffer, *saferKey, buffer );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += SAFER_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in CBC mode */
|
||||||
|
|
||||||
|
int saferEncryptCBC( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
SAFER_KEY *saferKey = ( SAFER_KEY * ) cryptInfo->key;
|
||||||
|
int blockCount = noBytes / SAFER_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % SAFER_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < SAFER_BLOCKSIZE; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Encrypt a block of data */
|
||||||
|
Safer_Encrypt_Block( buffer, *saferKey, buffer );
|
||||||
|
|
||||||
|
/* Shift ciphertext into IV */
|
||||||
|
memcpy( cryptInfo->currentIV, buffer, SAFER_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += SAFER_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
int saferDecryptCBC( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
SAFER_KEY *saferKey = ( SAFER_KEY * ) cryptInfo->key;
|
||||||
|
BYTE temp[ SAFER_BLOCKSIZE ];
|
||||||
|
int blockCount = noBytes / SAFER_BLOCKSIZE;
|
||||||
|
|
||||||
|
/* Make sure the data length is a multiple of the block size */
|
||||||
|
if( noBytes % SAFER_BLOCKSIZE )
|
||||||
|
return( CRYPT_BADPARM3 );
|
||||||
|
|
||||||
|
while( blockCount-- )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Save the ciphertext */
|
||||||
|
memcpy( temp, buffer, SAFER_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Decrypt a block of data */
|
||||||
|
Safer_Decrypt_Block( buffer, *saferKey, buffer );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < SAFER_BLOCKSIZE; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, temp, SAFER_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
buffer += SAFER_BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear the temporary buffer */
|
||||||
|
memset( temp, 0, SAFER_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in CFB mode */
|
||||||
|
|
||||||
|
int saferEncryptCFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
SAFER_KEY *saferKey = ( SAFER_KEY * ) cryptInfo->key;
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = SAFER_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
memcpy( cryptInfo->currentIV + ivCount, buffer, bytesToUse );
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > SAFER_BLOCKSIZE ) ? SAFER_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
Safer_Encrypt_Block( cryptInfo->currentIV, *saferKey, cryptInfo->currentIV );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, buffer, ivCount );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % SAFER_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decrypt data in CFB mode. Note that the transformation can be made
|
||||||
|
faster (but less clear) with temp = buffer, buffer ^= iv, iv = temp
|
||||||
|
all in one loop */
|
||||||
|
|
||||||
|
int saferDecryptCFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
SAFER_KEY *saferKey = ( SAFER_KEY * ) cryptInfo->key;
|
||||||
|
BYTE temp[ SAFER_BLOCKSIZE ];
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = SAFER_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Decrypt the data */
|
||||||
|
memcpy( temp, buffer, bytesToUse );
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
memcpy( cryptInfo->currentIV + ivCount, temp, bytesToUse );
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > SAFER_BLOCKSIZE ) ? SAFER_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
Safer_Encrypt_Block( cryptInfo->currentIV, *saferKey, cryptInfo->currentIV );
|
||||||
|
|
||||||
|
/* Save the ciphertext */
|
||||||
|
memcpy( temp, buffer, ivCount );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Shift the ciphertext into the IV */
|
||||||
|
memcpy( cryptInfo->currentIV, temp, ivCount );
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % SAFER_BLOCKSIZE );
|
||||||
|
|
||||||
|
/* Clear the temporary buffer */
|
||||||
|
memset( temp, 0, SAFER_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt/decrypt data in OFB mode */
|
||||||
|
|
||||||
|
int saferEncryptOFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
SAFER_KEY *saferKey = ( SAFER_KEY * ) cryptInfo->key;
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = SAFER_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > SAFER_BLOCKSIZE ) ? SAFER_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
Safer_Encrypt_Block( cryptInfo->currentIV, *saferKey, cryptInfo->currentIV );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % SAFER_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decrypt data in OFB mode */
|
||||||
|
|
||||||
|
int saferDecryptOFB( CRYPT_INFO *cryptInfo, BYTE *buffer, int noBytes )
|
||||||
|
{
|
||||||
|
SAFER_KEY *saferKey = ( SAFER_KEY * ) cryptInfo->key;
|
||||||
|
int i, ivCount = cryptInfo->ivCount;
|
||||||
|
|
||||||
|
/* If there's any encrypted material left in the IV, use it now */
|
||||||
|
if( ivCount )
|
||||||
|
{
|
||||||
|
int bytesToUse;
|
||||||
|
|
||||||
|
/* Find out how much material left in the encrypted IV we can use */
|
||||||
|
bytesToUse = SAFER_BLOCKSIZE - ivCount;
|
||||||
|
if( noBytes < bytesToUse )
|
||||||
|
bytesToUse = noBytes;
|
||||||
|
|
||||||
|
/* Decrypt the data */
|
||||||
|
for( i = 0; i < bytesToUse; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i + ivCount ];
|
||||||
|
|
||||||
|
/* Adjust the byte count and buffer position */
|
||||||
|
noBytes -= bytesToUse;
|
||||||
|
buffer += bytesToUse;
|
||||||
|
ivCount += bytesToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( noBytes )
|
||||||
|
{
|
||||||
|
ivCount = ( noBytes > SAFER_BLOCKSIZE ) ? SAFER_BLOCKSIZE : noBytes;
|
||||||
|
|
||||||
|
/* Encrypt the IV */
|
||||||
|
Safer_Encrypt_Block( cryptInfo->currentIV, *saferKey, cryptInfo->currentIV );
|
||||||
|
|
||||||
|
/* XOR the buffer contents with the encrypted IV */
|
||||||
|
for( i = 0; i < ivCount; i++ )
|
||||||
|
buffer[ i ] ^= cryptInfo->currentIV[ i ];
|
||||||
|
|
||||||
|
/* Move on to next block of data */
|
||||||
|
noBytes -= ivCount;
|
||||||
|
buffer += ivCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember how much of the IV is still available for use */
|
||||||
|
cryptInfo->ivCount = ( ivCount % SAFER_BLOCKSIZE );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* SAFER Key Management Routines *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Key schedule a SAFER key */
|
||||||
|
|
||||||
|
int saferInitKey( CRYPT_INFO *cryptInfo )
|
||||||
|
{
|
||||||
|
CRYPT_INFO_SAFER *cryptInfoEx = ( CRYPT_INFO_SAFER * ) cryptInfo->privateData;
|
||||||
|
SAFER_KEY *saferKey = ( SAFER_KEY * ) cryptInfo->key;
|
||||||
|
BOOLEAN shortKey = cryptInfo->userKeyLength <= bitsToBytes( 64 );
|
||||||
|
|
||||||
|
/* If the number of rounds has been preset, use this value */
|
||||||
|
if( cryptInfoEx->rounds != CRYPT_USE_DEFAULT )
|
||||||
|
cryptInfoEx->currentRounds = cryptInfoEx->rounds;
|
||||||
|
else
|
||||||
|
/* Determine the number of rounds to use based on the key size */
|
||||||
|
if( cryptInfoEx->useSaferSK )
|
||||||
|
cryptInfoEx->currentRounds = ( shortKey ) ? \
|
||||||
|
SAFER_SK64_DEFAULT_NOF_ROUNDS : SAFER_SK128_DEFAULT_NOF_ROUNDS;
|
||||||
|
else
|
||||||
|
cryptInfoEx->currentRounds = ( shortKey ) ? \
|
||||||
|
SAFER_K64_DEFAULT_NOF_ROUNDS : SAFER_K128_DEFAULT_NOF_ROUNDS;
|
||||||
|
|
||||||
|
/* Generate an expanded SAFER key */
|
||||||
|
if( shortKey )
|
||||||
|
Safer_Expand_Userkey( cryptInfo->userKey, \
|
||||||
|
cryptInfo->userKey, cryptInfoEx->currentRounds, \
|
||||||
|
cryptInfoEx->useSaferSK, *saferKey );
|
||||||
|
else
|
||||||
|
Safer_Expand_Userkey( cryptInfo->userKey, \
|
||||||
|
cryptInfo->userKey + bitsToBytes( 64 ), \
|
||||||
|
cryptInfoEx->currentRounds, \
|
||||||
|
cryptInfoEx->useSaferSK, *saferKey );
|
||||||
|
|
||||||
|
return( CRYPT_OK );
|
||||||
|
}
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
/* 3ecb_enc.c */
|
||||||
|
|
||||||
|
/* Copyright (C) 1993 Eric Young - see README for more details */
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include "des_locl.h"
|
||||||
|
#else
|
||||||
|
#include "libdes/des_locl.h"
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
|
||||||
|
int des_3ecb_encrypt(input,output,ks1,ks2,encrypt)
|
||||||
|
des_cblock *input;
|
||||||
|
des_cblock *output;
|
||||||
|
des_key_schedule ks1,ks2;
|
||||||
|
int encrypt;
|
||||||
|
{
|
||||||
|
register unsigned long l0,l1;
|
||||||
|
register unsigned char *in,*out;
|
||||||
|
unsigned long ll[2];
|
||||||
|
|
||||||
|
in=(unsigned char *)input;
|
||||||
|
out=(unsigned char *)output;
|
||||||
|
c2l(in,l0);
|
||||||
|
c2l(in,l1);
|
||||||
|
ll[0]=l0;
|
||||||
|
ll[1]=l1;
|
||||||
|
des_encrypt(ll,ll,ks1,encrypt);
|
||||||
|
des_encrypt(ll,ll,ks2,!encrypt);
|
||||||
|
des_encrypt(ll,ll,ks1,encrypt);
|
||||||
|
l0=ll[0];
|
||||||
|
l1=ll[1];
|
||||||
|
l2c(l0,out);
|
||||||
|
l2c(l1,out);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
Copyright (C) 1995 Eric Young (eay@mincom.oz.au)
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This package is an DES implementation written by Eric Young (eay@mincom.oz.au).
|
||||||
|
The implementation was written so as to conform with MIT's libdes.
|
||||||
|
|
||||||
|
This library is free for commercial and non-commercial use as long as
|
||||||
|
the following conditions are aheared to. The following conditions
|
||||||
|
apply to all code found in this distribution.
|
||||||
|
|
||||||
|
Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
the code are not to be removed.
|
||||||
|
If this package is used in a product, Eric Young should be given attribution
|
||||||
|
as the author of that the SSL library. This can be in the form of a textual
|
||||||
|
message at program startup or in documentation (online or textual) provided
|
||||||
|
with the package.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
3. All advertising materials mentioning features or use of this software
|
||||||
|
must display the following acknowledgement:
|
||||||
|
This product includes software developed by Eric Young (eay@mincom.oz.au)
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
||||||
|
|
||||||
|
The license and distribution terms for any publically available version or
|
||||||
|
derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||||
|
copied and put under another distrubution license
|
||||||
|
[including the GNU Public License.]
|
||||||
|
|
||||||
|
The reason behind this being stated in this direct manner is past
|
||||||
|
experience in code simply being copied and the attribution removed
|
||||||
|
from it and then being distributed as part of other packages. This
|
||||||
|
implementation was a non-trivial and unpaid effort.
|
||||||
+98
@@ -0,0 +1,98 @@
|
|||||||
|
/* des.h */
|
||||||
|
/* Copyright (C) 1995 Eric Young (eay@mincom.oz.au).
|
||||||
|
* All rights reserved.
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* See the COPYRIGHT file in the libdes distribution for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HEADER_DES_H
|
||||||
|
#define HEADER_DES_H
|
||||||
|
|
||||||
|
typedef unsigned char des_cblock[8];
|
||||||
|
typedef struct des_ks_struct
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
des_cblock _;
|
||||||
|
/* make sure things are correct size on machines with
|
||||||
|
* 8 byte longs */
|
||||||
|
unsigned long pad[2];
|
||||||
|
} ks;
|
||||||
|
#undef _
|
||||||
|
#define _ ks._
|
||||||
|
} des_key_schedule[16];
|
||||||
|
|
||||||
|
#define DES_KEY_SZ (sizeof(des_cblock))
|
||||||
|
#define DES_SCHEDULE_SZ (sizeof(des_key_schedule))
|
||||||
|
|
||||||
|
#define DES_ENCRYPT 1
|
||||||
|
#define DES_DECRYPT 0
|
||||||
|
|
||||||
|
#define DES_CBC_MODE 0
|
||||||
|
#define DES_PCBC_MODE 1
|
||||||
|
|
||||||
|
#define C_Block des_cblock
|
||||||
|
#define Key_schedule des_key_schedule
|
||||||
|
#define ENCRYPT DES_ENCRYPT
|
||||||
|
#define DECRYPT DES_DECRYPT
|
||||||
|
#define KEY_SZ DES_KEY_SZ
|
||||||
|
#define string_to_key des_string_to_key
|
||||||
|
#define read_pw_string des_read_pw_string
|
||||||
|
#define random_key des_random_key
|
||||||
|
#define pcbc_encrypt des_pcbc_encrypt
|
||||||
|
#define set_key des_set_key
|
||||||
|
#define key_sched des_key_sched
|
||||||
|
#define ecb_encrypt des_ecb_encrypt
|
||||||
|
#define cbc_encrypt des_cbc_encrypt
|
||||||
|
#define cbc_cksum des_cbc_cksum
|
||||||
|
#define quad_cksum des_quad_cksum
|
||||||
|
|
||||||
|
/* For compatibility with the MIT lib - eay 20/05/92 */
|
||||||
|
typedef struct des_ks_struct bit_64;
|
||||||
|
|
||||||
|
extern int des_check_key; /* defaults to false */
|
||||||
|
extern int des_rw_mode; /* defaults to DES_PCBC_MODE */
|
||||||
|
|
||||||
|
int des_3ecb_encrypt(des_cblock *input,des_cblock *output,\
|
||||||
|
des_key_schedule ks1,des_key_schedule ks2,int encrypt);
|
||||||
|
unsigned long des_cbc_cksum(des_cblock *input,des_cblock *output,\
|
||||||
|
long length,des_key_schedule schedule,des_cblock *ivec);
|
||||||
|
int des_cbc_encrypt(des_cblock *input,des_cblock *output,long length,\
|
||||||
|
des_key_schedule schedule,des_cblock *ivec,int encrypt);
|
||||||
|
int des_3cbc_encrypt(des_cblock *input,des_cblock *output,long length,\
|
||||||
|
des_key_schedule sk1,des_key_schedule sk2,\
|
||||||
|
des_cblock *ivec1,des_cblock *ivec2,int encrypt);
|
||||||
|
int des_cfb_encrypt(unsigned char *in,unsigned char *out,int numbits,\
|
||||||
|
long length,des_key_schedule schedule,des_cblock *ivec,int encrypt);
|
||||||
|
int des_ecb_encrypt(des_cblock *input,des_cblock *output,\
|
||||||
|
des_key_schedule ks,int encrypt);
|
||||||
|
int des_encrypt(unsigned long *input,unsigned long *output,
|
||||||
|
des_key_schedule ks, int encrypt);
|
||||||
|
int des_enc_read(int fd,char *buf,int len,des_key_schedule sched,\
|
||||||
|
des_cblock *iv);
|
||||||
|
int des_enc_write(int fd,char *buf,int len,des_key_schedule sched,\
|
||||||
|
des_cblock *iv);
|
||||||
|
#ifdef PERL5
|
||||||
|
char *des_crypt(const char *buf,const char *salt);
|
||||||
|
#else
|
||||||
|
char *crypt(char *buf,char *salt);
|
||||||
|
#endif
|
||||||
|
int des_ofb_encrypt(unsigned char *in,unsigned char *out,\
|
||||||
|
int numbits,long length,des_key_schedule schedule,des_cblock *ivec);
|
||||||
|
int des_pcbc_encrypt(des_cblock *input,des_cblock *output,long length,\
|
||||||
|
des_key_schedule schedule,des_cblock *ivec,int encrypt);
|
||||||
|
unsigned long des_quad_cksum(des_cblock *input,des_cblock *output,\
|
||||||
|
long length,int out_count,des_cblock *seed);
|
||||||
|
void des_random_seed(des_cblock key);
|
||||||
|
int des_random_key(des_cblock ret);
|
||||||
|
int des_read_password(des_cblock *key,char *prompt,int verify);
|
||||||
|
int des_read_2passwords(des_cblock *key1,des_cblock *key2, \
|
||||||
|
char *prompt,int verify);
|
||||||
|
int des_read_pw_string(char *buf,int length,char *prompt,int verify);
|
||||||
|
void des_set_odd_parity(des_cblock *key);
|
||||||
|
int des_is_weak_key(des_cblock *key);
|
||||||
|
int des_set_key(des_cblock *key,des_key_schedule schedule);
|
||||||
|
int des_key_sched(des_cblock *key,des_key_schedule schedule);
|
||||||
|
int des_string_to_key(char *str,des_cblock *key);
|
||||||
|
int des_string_to_2keys(char *str,des_cblock *key1,des_cblock *key2);
|
||||||
|
#endif
|
||||||
+204
@@ -0,0 +1,204 @@
|
|||||||
|
/* des_locl.h */
|
||||||
|
/* Copyright (C) 1995 Eric Young (eay@mincom.oz.au).
|
||||||
|
* All rights reserved.
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* See the COPYRIGHT file in the libdes distribution for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include "des.h"
|
||||||
|
#else
|
||||||
|
#include "libdes/des.h"
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
/* Force ANSI usage as the rest of the library assumes ANSI anyway - pcg */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define bcopy(b1,b2,len) memcpy(b2, b1, (size_t)(len))
|
||||||
|
#define bzero(b,len) memset(b, 0, (size_t)(len))
|
||||||
|
#define bcmp(b1,b2,len) memcmp(b1, b2, (size_t)(len))
|
||||||
|
#define index(s1,char) strchr(s1,char)
|
||||||
|
|
||||||
|
#if !defined(_LIBC) || defined(NOCONST)
|
||||||
|
#define const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __STDC__
|
||||||
|
#define PROTO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RAND
|
||||||
|
#define random() rand()
|
||||||
|
#define srandom(s) srand(s)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ITERATIONS 16
|
||||||
|
#define HALF_ITERATIONS 8
|
||||||
|
|
||||||
|
/* used in des_read and des_write */
|
||||||
|
#define MAXWRITE (1024*16)
|
||||||
|
#define BSIZE (MAXWRITE+4)
|
||||||
|
|
||||||
|
#define c2l(c,l) (l =((unsigned long)(*((c)++))) , \
|
||||||
|
l|=((unsigned long)(*((c)++)))<< 8, \
|
||||||
|
l|=((unsigned long)(*((c)++)))<<16, \
|
||||||
|
l|=((unsigned long)(*((c)++)))<<24)
|
||||||
|
|
||||||
|
/* NOTE - c is not incremented as per c2l */
|
||||||
|
#define c2ln(c,l1,l2,n) { \
|
||||||
|
c+=n; \
|
||||||
|
l1=l2=0; \
|
||||||
|
switch (n) { \
|
||||||
|
case 8: l2 =((unsigned long)(*(--(c))))<<24; \
|
||||||
|
case 7: l2|=((unsigned long)(*(--(c))))<<16; \
|
||||||
|
case 6: l2|=((unsigned long)(*(--(c))))<< 8; \
|
||||||
|
case 5: l2|=((unsigned long)(*(--(c)))); \
|
||||||
|
case 4: l1 =((unsigned long)(*(--(c))))<<24; \
|
||||||
|
case 3: l1|=((unsigned long)(*(--(c))))<<16; \
|
||||||
|
case 2: l1|=((unsigned long)(*(--(c))))<< 8; \
|
||||||
|
case 1: l1|=((unsigned long)(*(--(c)))); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
|
||||||
|
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \
|
||||||
|
*((c)++)=(unsigned char)(((l)>>16)&0xff), \
|
||||||
|
*((c)++)=(unsigned char)(((l)>>24)&0xff))
|
||||||
|
|
||||||
|
/* replacements for htonl and ntohl since I have no idea what to do
|
||||||
|
* when faced with machines with 8 byte longs. */
|
||||||
|
#define HDRSIZE 4
|
||||||
|
|
||||||
|
#define n2l(c,l) (l =((unsigned long)(*((c)++)))<<24, \
|
||||||
|
l|=((unsigned long)(*((c)++)))<<16, \
|
||||||
|
l|=((unsigned long)(*((c)++)))<< 8, \
|
||||||
|
l|=((unsigned long)(*((c)++))))
|
||||||
|
|
||||||
|
#define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \
|
||||||
|
*((c)++)=(unsigned char)(((l)>>16)&0xff), \
|
||||||
|
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \
|
||||||
|
*((c)++)=(unsigned char)(((l) )&0xff))
|
||||||
|
|
||||||
|
/* NOTE - c is not incremented as per l2c */
|
||||||
|
#define l2cn(l1,l2,c,n) { \
|
||||||
|
c+=n; \
|
||||||
|
switch (n) { \
|
||||||
|
case 8: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \
|
||||||
|
case 7: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \
|
||||||
|
case 6: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \
|
||||||
|
case 5: *(--(c))=(unsigned char)(((l2) )&0xff); \
|
||||||
|
case 4: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \
|
||||||
|
case 3: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \
|
||||||
|
case 2: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \
|
||||||
|
case 1: *(--(c))=(unsigned char)(((l1) )&0xff); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The changes to this macro may help or hinder, depending on the
|
||||||
|
* compiler and the achitecture. gcc2 always seems to do well :-).
|
||||||
|
* Inspired by Dana How <how@isl.stanford.edu>
|
||||||
|
* DO NOT use the alternative version on machines with 8 byte longs. */
|
||||||
|
#ifdef ALT_ECB
|
||||||
|
#define D_ENCRYPT(L,R,S) \
|
||||||
|
u=((R^s[S ])<<2); \
|
||||||
|
t= R^s[S+1]; \
|
||||||
|
t=((t>>2)+(t<<30)); \
|
||||||
|
L^= \
|
||||||
|
*(unsigned long *)(des_SP+0x0100+((t )&0xfc))+ \
|
||||||
|
*(unsigned long *)(des_SP+0x0300+((t>> 8)&0xfc))+ \
|
||||||
|
*(unsigned long *)(des_SP+0x0500+((t>>16)&0xfc))+ \
|
||||||
|
*(unsigned long *)(des_SP+0x0700+((t>>24)&0xfc))+ \
|
||||||
|
*(unsigned long *)(des_SP+ ((u )&0xfc))+ \
|
||||||
|
*(unsigned long *)(des_SP+0x0200+((u>> 8)&0xfc))+ \
|
||||||
|
*(unsigned long *)(des_SP+0x0400+((u>>16)&0xfc))+ \
|
||||||
|
*(unsigned long *)(des_SP+0x0600+((u>>24)&0xfc));
|
||||||
|
#else /* original version */
|
||||||
|
#ifdef MSDOS
|
||||||
|
#define D_ENCRYPT(L,R,S) \
|
||||||
|
U.l=R^s[S+1]; \
|
||||||
|
T.s[0]=((U.s[0]>>4)|(U.s[1]<<12))&0x3f3f; \
|
||||||
|
T.s[1]=((U.s[1]>>4)|(U.s[0]<<12))&0x3f3f; \
|
||||||
|
U.l=(R^s[S ])&0x3f3f3f3f; \
|
||||||
|
L^= des_SPtrans[1][(T.c[0])]| \
|
||||||
|
des_SPtrans[3][(T.c[1])]| \
|
||||||
|
des_SPtrans[5][(T.c[2])]| \
|
||||||
|
des_SPtrans[7][(T.c[3])]| \
|
||||||
|
des_SPtrans[0][(U.c[0])]| \
|
||||||
|
des_SPtrans[2][(U.c[1])]| \
|
||||||
|
des_SPtrans[4][(U.c[2])]| \
|
||||||
|
des_SPtrans[6][(U.c[3])];
|
||||||
|
#else
|
||||||
|
#define D_ENCRYPT(L,R,S) \
|
||||||
|
u=(R^s[S ]); \
|
||||||
|
t=R^s[S+1]; \
|
||||||
|
t=((t>>4)+(t<<28)); \
|
||||||
|
L^= des_SPtrans[1][(t )&0x3f]| \
|
||||||
|
des_SPtrans[3][(t>> 8)&0x3f]| \
|
||||||
|
des_SPtrans[5][(t>>16)&0x3f]| \
|
||||||
|
des_SPtrans[7][(t>>24)&0x3f]| \
|
||||||
|
des_SPtrans[0][(u )&0x3f]| \
|
||||||
|
des_SPtrans[2][(u>> 8)&0x3f]| \
|
||||||
|
des_SPtrans[4][(u>>16)&0x3f]| \
|
||||||
|
des_SPtrans[6][(u>>24)&0x3f];
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* IP and FP
|
||||||
|
* The problem is more of a geometric problem that random bit fiddling.
|
||||||
|
0 1 2 3 4 5 6 7 62 54 46 38 30 22 14 6
|
||||||
|
8 9 10 11 12 13 14 15 60 52 44 36 28 20 12 4
|
||||||
|
16 17 18 19 20 21 22 23 58 50 42 34 26 18 10 2
|
||||||
|
24 25 26 27 28 29 30 31 to 56 48 40 32 24 16 8 0
|
||||||
|
|
||||||
|
32 33 34 35 36 37 38 39 63 55 47 39 31 23 15 7
|
||||||
|
40 41 42 43 44 45 46 47 61 53 45 37 29 21 13 5
|
||||||
|
48 49 50 51 52 53 54 55 59 51 43 35 27 19 11 3
|
||||||
|
56 57 58 59 60 61 62 63 57 49 41 33 25 17 9 1
|
||||||
|
|
||||||
|
The output has been subject to swaps of the form
|
||||||
|
0 1 -> 3 1 but the odd and even bits have been put into
|
||||||
|
2 3 2 0
|
||||||
|
different words. The main trick is to remember that
|
||||||
|
t=((l>>size)^r)&(mask);
|
||||||
|
r^=t;
|
||||||
|
l^=(t<<size);
|
||||||
|
can be used to swap and move bits between words.
|
||||||
|
|
||||||
|
So l = 0 1 2 3 r = 16 17 18 19
|
||||||
|
4 5 6 7 20 21 22 23
|
||||||
|
8 9 10 11 24 25 26 27
|
||||||
|
12 13 14 15 28 29 30 31
|
||||||
|
becomes (for size == 2 and mask == 0x3333)
|
||||||
|
t = 2^16 3^17 -- -- l = 0 1 16 17 r = 2 3 18 19
|
||||||
|
6^20 7^21 -- -- 4 5 20 21 6 7 22 23
|
||||||
|
10^24 11^25 -- -- 8 9 24 25 10 11 24 25
|
||||||
|
14^28 15^29 -- -- 12 13 28 29 14 15 28 29
|
||||||
|
|
||||||
|
Thanks for hints from Richard Outerbridge - he told me IP&FP
|
||||||
|
could be done in 15 xor, 10 shifts and 5 ands.
|
||||||
|
When I finally started to think of the problem in 2D
|
||||||
|
I first got ~42 operations without xors. When I remembered
|
||||||
|
how to use xors :-) I got it to its final state.
|
||||||
|
*/
|
||||||
|
#define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
|
||||||
|
(b)^=(t),\
|
||||||
|
(a)^=((t)<<(n)))
|
||||||
|
|
||||||
|
#define IP(l,r,t) \
|
||||||
|
PERM_OP(r,l,t, 4,0x0f0f0f0fL); \
|
||||||
|
PERM_OP(l,r,t,16,0x0000ffffL); \
|
||||||
|
PERM_OP(r,l,t, 2,0x33333333L); \
|
||||||
|
PERM_OP(l,r,t, 8,0x00ff00ffL); \
|
||||||
|
PERM_OP(r,l,t, 1,0x55555555L);
|
||||||
|
|
||||||
|
#define FP(l,r,t) \
|
||||||
|
PERM_OP(l,r,t, 1,0x55555555L); \
|
||||||
|
PERM_OP(r,l,t, 8,0x00ff00ffL); \
|
||||||
|
PERM_OP(l,r,t, 2,0x33333333L); \
|
||||||
|
PERM_OP(r,l,t,16,0x0000ffffL); \
|
||||||
|
PERM_OP(l,r,t, 4,0x0f0f0f0fL);
|
||||||
|
|
||||||
|
|
||||||
+112
@@ -0,0 +1,112 @@
|
|||||||
|
/* ecb_enc.c */
|
||||||
|
/* Copyright (C) 1995 Eric Young (eay@mincom.oz.au).
|
||||||
|
* All rights reserved.
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* See the COPYRIGHT file in the libdes distribution for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include "des_locl.h"
|
||||||
|
#include "spr.h"
|
||||||
|
#include "version.h"
|
||||||
|
#else
|
||||||
|
#include "libdes/des_locl.h"
|
||||||
|
#include "libdes/spr.h"
|
||||||
|
#include "libdes/version.h"
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
int des_ecb_encrypt(input,output,ks,encrypt)
|
||||||
|
des_cblock *input;
|
||||||
|
des_cblock *output;
|
||||||
|
des_key_schedule ks;
|
||||||
|
int encrypt;
|
||||||
|
{
|
||||||
|
register unsigned long l0,l1;
|
||||||
|
register unsigned char *in,*out;
|
||||||
|
unsigned long ll[2];
|
||||||
|
|
||||||
|
in=(unsigned char *)input;
|
||||||
|
out=(unsigned char *)output;
|
||||||
|
c2l(in,l0);
|
||||||
|
c2l(in,l1);
|
||||||
|
ll[0]=l0;
|
||||||
|
ll[1]=l1;
|
||||||
|
des_encrypt(ll,ll,ks,encrypt);
|
||||||
|
l0=ll[0];
|
||||||
|
l1=ll[1];
|
||||||
|
l2c(l0,out);
|
||||||
|
l2c(l1,out);
|
||||||
|
l0=l1=ll[0]=ll[1]=0;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int des_encrypt(input,output,ks,encrypt)
|
||||||
|
unsigned long *input;
|
||||||
|
unsigned long *output;
|
||||||
|
des_key_schedule ks;
|
||||||
|
int encrypt;
|
||||||
|
{
|
||||||
|
register unsigned long l,r,t,u;
|
||||||
|
#ifdef ALT_ECB
|
||||||
|
register unsigned char *des_SP=(unsigned char *)des_SPtrans;
|
||||||
|
#endif
|
||||||
|
#ifdef MSDOS
|
||||||
|
union fudge {
|
||||||
|
unsigned long l;
|
||||||
|
unsigned short s[2];
|
||||||
|
unsigned char c[4];
|
||||||
|
} U,T;
|
||||||
|
#endif
|
||||||
|
register int i;
|
||||||
|
register unsigned long *s;
|
||||||
|
|
||||||
|
l=input[0];
|
||||||
|
r=input[1];
|
||||||
|
|
||||||
|
IP(l,r,t);
|
||||||
|
/* Things have been modified so that the initial rotate is
|
||||||
|
* done outside the loop. This required the
|
||||||
|
* des_SPtrans values in sp.h to be rotated 1 bit to the right.
|
||||||
|
* One perl script later and things have a 5% speed up on a sparc2.
|
||||||
|
* Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
|
||||||
|
* for pointing this out. */
|
||||||
|
t=(r<<1)|(r>>31);
|
||||||
|
r=(l<<1)|(l>>31);
|
||||||
|
l=t;
|
||||||
|
|
||||||
|
/* clear the top bits on machines with 8byte longs */
|
||||||
|
l&=0xffffffffL;
|
||||||
|
r&=0xffffffffL;
|
||||||
|
|
||||||
|
s=(unsigned long *)ks;
|
||||||
|
/* I don't know if it is worth the effort of loop unrolling the
|
||||||
|
* inner loop */
|
||||||
|
if (encrypt)
|
||||||
|
{
|
||||||
|
for (i=0; i<32; i+=4)
|
||||||
|
{
|
||||||
|
D_ENCRYPT(l,r,i+0); /* 1 */
|
||||||
|
D_ENCRYPT(r,l,i+2); /* 2 */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i=30; i>0; i-=4)
|
||||||
|
{
|
||||||
|
D_ENCRYPT(l,r,i-0); /* 16 */
|
||||||
|
D_ENCRYPT(r,l,i-2); /* 15 */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
l=(l>>1)|(l<<31);
|
||||||
|
r=(r>>1)|(r<<31);
|
||||||
|
/* clear the top bits on machines with 8byte longs */
|
||||||
|
l&=0xffffffffL;
|
||||||
|
r&=0xffffffffL;
|
||||||
|
|
||||||
|
FP(r,l,t);
|
||||||
|
output[0]=l;
|
||||||
|
output[1]=r;
|
||||||
|
l=r=t=u=0;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
+83
@@ -0,0 +1,83 @@
|
|||||||
|
/* pcbc_enc.c */
|
||||||
|
/* Copyright (C) 1995 Eric Young (eay@mincom.oz.au).
|
||||||
|
* All rights reserved.
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* See the COPYRIGHT file in the libdes distribution for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include "des_locl.h"
|
||||||
|
#else
|
||||||
|
#include "libdes/des_locl.h"
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
int des_pcbc_encrypt(input,output,length,schedule,ivec,encrypt)
|
||||||
|
des_cblock *input;
|
||||||
|
des_cblock *output;
|
||||||
|
long length;
|
||||||
|
des_key_schedule schedule;
|
||||||
|
des_cblock *ivec;
|
||||||
|
int encrypt;
|
||||||
|
{
|
||||||
|
register unsigned long sin0,sin1,xor0,xor1,tout0,tout1;
|
||||||
|
unsigned long tin[2],tout[2];
|
||||||
|
unsigned char *in,*out,*iv;
|
||||||
|
|
||||||
|
in=(unsigned char *)input;
|
||||||
|
out=(unsigned char *)output;
|
||||||
|
iv=(unsigned char *)ivec;
|
||||||
|
|
||||||
|
if (encrypt)
|
||||||
|
{
|
||||||
|
c2l(iv,xor0);
|
||||||
|
c2l(iv,xor1);
|
||||||
|
for (; length>0; length-=8)
|
||||||
|
{
|
||||||
|
if (length >= 8)
|
||||||
|
{
|
||||||
|
c2l(in,sin0);
|
||||||
|
c2l(in,sin1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
c2ln(in,sin0,sin1,length);
|
||||||
|
tin[0]=sin0^xor0;
|
||||||
|
tin[1]=sin1^xor1;
|
||||||
|
des_encrypt((unsigned long *)tin,(unsigned long *)tout,
|
||||||
|
schedule,encrypt);
|
||||||
|
tout0=tout[0];
|
||||||
|
tout1=tout[1];
|
||||||
|
xor0=sin0^tout[0];
|
||||||
|
xor1=sin1^tout[1];
|
||||||
|
l2c(tout0,out);
|
||||||
|
l2c(tout1,out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
c2l(iv,xor0); c2l(iv,xor1);
|
||||||
|
for (; length>0; length-=8)
|
||||||
|
{
|
||||||
|
c2l(in,sin0);
|
||||||
|
c2l(in,sin1);
|
||||||
|
tin[0]=sin0;
|
||||||
|
tin[1]=sin1;
|
||||||
|
des_encrypt((unsigned long *)tin,(unsigned long *)tout,
|
||||||
|
schedule,encrypt);
|
||||||
|
tout0=tout[0]^xor0;
|
||||||
|
tout1=tout[1]^xor1;
|
||||||
|
if (length >= 8)
|
||||||
|
{
|
||||||
|
l2c(tout0,out);
|
||||||
|
l2c(tout1,out);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
l2cn(tout0,tout1,out,length);
|
||||||
|
xor0=tout0^sin0;
|
||||||
|
xor1=tout1^sin1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tin[0]=tin[1]=tout[0]=tout[1]=0;
|
||||||
|
sin0=sin1=xor0=xor1=tout0=tout1=0;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
/* podd.h */
|
||||||
|
/* Copyright (C) 1995 Eric Young (eay@mincom.oz.au).
|
||||||
|
* All rights reserved.
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* See the COPYRIGHT file in the libdes distribution for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const unsigned char odd_parity[256]={
|
||||||
|
1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14,
|
||||||
|
16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
|
||||||
|
32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
|
||||||
|
49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
|
||||||
|
64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
|
||||||
|
81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
|
||||||
|
97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
|
||||||
|
112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
|
||||||
|
128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
|
||||||
|
145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
|
||||||
|
161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
|
||||||
|
176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
|
||||||
|
193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
|
||||||
|
208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
|
||||||
|
224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
|
||||||
|
241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254};
|
||||||
+198
@@ -0,0 +1,198 @@
|
|||||||
|
/* set_key.c */
|
||||||
|
/* Copyright (C) 1995 Eric Young (eay@mincom.oz.au).
|
||||||
|
* All rights reserved.
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* See the COPYRIGHT file in the libdes distribution for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* set_key.c v 1.4 eay 24/9/91
|
||||||
|
* 1.4 Speed up by 400% :-)
|
||||||
|
* 1.3 added register declarations.
|
||||||
|
* 1.2 unrolled make_key_sched a bit more
|
||||||
|
* 1.1 added norm_expand_bits
|
||||||
|
* 1.0 First working version
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include "des_locl.h"
|
||||||
|
#include "podd.h"
|
||||||
|
#include "sk.h"
|
||||||
|
#else
|
||||||
|
#include "libdes/des_locl.h"
|
||||||
|
#include "libdes/podd.h"
|
||||||
|
#include "libdes/sk.h"
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
static int check_parity(des_cblock *key);
|
||||||
|
|
||||||
|
int des_check_key=0;
|
||||||
|
|
||||||
|
void des_set_odd_parity(key)
|
||||||
|
des_cblock *key;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0; i<DES_KEY_SZ; i++)
|
||||||
|
(*key)[i]=odd_parity[(*key)[i]];
|
||||||
|
}
|
||||||
|
|
||||||
|
static int check_parity(key)
|
||||||
|
des_cblock *key;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0; i<DES_KEY_SZ; i++)
|
||||||
|
{
|
||||||
|
if ((*key)[i] != odd_parity[(*key)[i]])
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Weak and semi week keys as take from
|
||||||
|
* %A D.W. Davies
|
||||||
|
* %A W.L. Price
|
||||||
|
* %T Security for Computer Networks
|
||||||
|
* %I John Wiley & Sons
|
||||||
|
* %D 1984
|
||||||
|
* Many thanks to smb@ulysses.att.com (Steven Bellovin) for the reference
|
||||||
|
* (and actual cblock values).
|
||||||
|
*/
|
||||||
|
#define NUM_WEAK_KEY 16
|
||||||
|
static des_cblock weak_keys[NUM_WEAK_KEY]={
|
||||||
|
/* weak keys */
|
||||||
|
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
|
||||||
|
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
|
||||||
|
0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
|
||||||
|
0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,
|
||||||
|
/* semi-weak keys */
|
||||||
|
0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,
|
||||||
|
0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,
|
||||||
|
0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1,
|
||||||
|
0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E,
|
||||||
|
0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,
|
||||||
|
0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01,
|
||||||
|
0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE,
|
||||||
|
0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,
|
||||||
|
0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,
|
||||||
|
0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01,
|
||||||
|
0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE,
|
||||||
|
0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1};
|
||||||
|
|
||||||
|
int des_is_weak_key(key)
|
||||||
|
des_cblock *key;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0; i<NUM_WEAK_KEY; i++)
|
||||||
|
/* Added == 0 to comparision, I obviously don't run
|
||||||
|
* this section very often :-(, thanks to
|
||||||
|
* engineering@MorningStar.Com for the fix
|
||||||
|
* eay 93/06/29 */
|
||||||
|
if (memcmp(weak_keys[i],key,sizeof(key)) == 0) return(1);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NOW DEFINED IN des_local.h
|
||||||
|
* See ecb_encrypt.c for a pseudo description of these macros.
|
||||||
|
* #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
|
||||||
|
* (b)^=(t),\
|
||||||
|
* (a)=((a)^((t)<<(n))))
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
|
||||||
|
(a)=(a)^(t)^(t>>(16-(n))))
|
||||||
|
|
||||||
|
static char shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
|
||||||
|
|
||||||
|
/* return 0 if key parity is odd (correct),
|
||||||
|
* return -1 if key parity error,
|
||||||
|
* return -2 if illegal weak key.
|
||||||
|
*/
|
||||||
|
int des_set_key(key,schedule)
|
||||||
|
des_cblock *key;
|
||||||
|
des_key_schedule schedule;
|
||||||
|
{
|
||||||
|
register unsigned long c,d,t,s;
|
||||||
|
register unsigned char *in;
|
||||||
|
register unsigned long *k;
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
if (des_check_key)
|
||||||
|
{
|
||||||
|
if (!check_parity(key))
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
if (des_is_weak_key(key))
|
||||||
|
return(-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
k=(unsigned long *)schedule;
|
||||||
|
in=(unsigned char *)key;
|
||||||
|
|
||||||
|
c2l(in,c);
|
||||||
|
c2l(in,d);
|
||||||
|
|
||||||
|
/* do PC1 in 60 simple operations */
|
||||||
|
/* PERM_OP(d,c,t,4,0x0f0f0f0f);
|
||||||
|
HPERM_OP(c,t,-2, 0xcccc0000);
|
||||||
|
HPERM_OP(c,t,-1, 0xaaaa0000);
|
||||||
|
HPERM_OP(c,t, 8, 0x00ff0000);
|
||||||
|
HPERM_OP(c,t,-1, 0xaaaa0000);
|
||||||
|
HPERM_OP(d,t,-8, 0xff000000);
|
||||||
|
HPERM_OP(d,t, 8, 0x00ff0000);
|
||||||
|
HPERM_OP(d,t, 2, 0x33330000);
|
||||||
|
d=((d&0x00aa00aa)<<7)|((d&0x55005500)>>7)|(d&0xaa55aa55);
|
||||||
|
d=(d>>8)|((c&0xf0000000)>>4);
|
||||||
|
c&=0x0fffffff; */
|
||||||
|
|
||||||
|
/* I now do it in 47 simple operations :-)
|
||||||
|
* Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
|
||||||
|
* for the inspiration. :-) */
|
||||||
|
PERM_OP (d,c,t,4,0x0f0f0f0fL);
|
||||||
|
HPERM_OP(c,t,-2,0xcccc0000L);
|
||||||
|
HPERM_OP(d,t,-2,0xcccc0000L);
|
||||||
|
PERM_OP (d,c,t,1,0x55555555L);
|
||||||
|
PERM_OP (c,d,t,8,0x00ff00ffL);
|
||||||
|
PERM_OP (d,c,t,1,0x55555555L);
|
||||||
|
d= (((d&0x000000ffL)<<16)| (d&0x0000ff00L) |
|
||||||
|
((d&0x00ff0000L)>>16)|((c&0xf0000000L)>>4));
|
||||||
|
c&=0x0fffffffL;
|
||||||
|
|
||||||
|
for (i=0; i<ITERATIONS; i++)
|
||||||
|
{
|
||||||
|
if (shifts2[i])
|
||||||
|
{ c=((c>>2)|(c<<26)); d=((d>>2)|(d<<26)); }
|
||||||
|
else
|
||||||
|
{ c=((c>>1)|(c<<27)); d=((d>>1)|(d<<27)); }
|
||||||
|
c&=0x0fffffffL;
|
||||||
|
d&=0x0fffffffL;
|
||||||
|
/* could be a few less shifts but I am to lazy at this
|
||||||
|
* point in time to investigate */
|
||||||
|
s= des_skb[0][ (c )&0x3f ]|
|
||||||
|
des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
|
||||||
|
des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
|
||||||
|
des_skb[3][((c>>20)&0x01)|((c>>21)&0x06) |
|
||||||
|
((c>>22)&0x38)];
|
||||||
|
t= des_skb[4][ (d )&0x3f ]|
|
||||||
|
des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
|
||||||
|
des_skb[6][ (d>>15)&0x3f ]|
|
||||||
|
des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];
|
||||||
|
|
||||||
|
/* table contained 0213 4657 */
|
||||||
|
*(k++)=((t<<16)|(s&0x0000ffffL))&0xffffffffL;
|
||||||
|
s= ((s>>16)|(t&0xffff0000L));
|
||||||
|
|
||||||
|
s=(s<<4)|(s>>28);
|
||||||
|
*(k++)=s&0xffffffffL;
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int des_key_sched(key,schedule)
|
||||||
|
des_cblock *key;
|
||||||
|
des_key_schedule schedule;
|
||||||
|
{
|
||||||
|
return(des_set_key(key,schedule));
|
||||||
|
}
|
||||||
+146
@@ -0,0 +1,146 @@
|
|||||||
|
/* sk.h */
|
||||||
|
/* Copyright (C) 1995 Eric Young (eay@mincom.oz.au).
|
||||||
|
* All rights reserved.
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* See the COPYRIGHT file in the libdes distribution for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const unsigned long des_skb[8][64]={
|
||||||
|
/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
|
||||||
|
0x00000000L,0x00000010L,0x20000000L,0x20000010L,
|
||||||
|
0x00010000L,0x00010010L,0x20010000L,0x20010010L,
|
||||||
|
0x00000800L,0x00000810L,0x20000800L,0x20000810L,
|
||||||
|
0x00010800L,0x00010810L,0x20010800L,0x20010810L,
|
||||||
|
0x00000020L,0x00000030L,0x20000020L,0x20000030L,
|
||||||
|
0x00010020L,0x00010030L,0x20010020L,0x20010030L,
|
||||||
|
0x00000820L,0x00000830L,0x20000820L,0x20000830L,
|
||||||
|
0x00010820L,0x00010830L,0x20010820L,0x20010830L,
|
||||||
|
0x00080000L,0x00080010L,0x20080000L,0x20080010L,
|
||||||
|
0x00090000L,0x00090010L,0x20090000L,0x20090010L,
|
||||||
|
0x00080800L,0x00080810L,0x20080800L,0x20080810L,
|
||||||
|
0x00090800L,0x00090810L,0x20090800L,0x20090810L,
|
||||||
|
0x00080020L,0x00080030L,0x20080020L,0x20080030L,
|
||||||
|
0x00090020L,0x00090030L,0x20090020L,0x20090030L,
|
||||||
|
0x00080820L,0x00080830L,0x20080820L,0x20080830L,
|
||||||
|
0x00090820L,0x00090830L,0x20090820L,0x20090830L,
|
||||||
|
/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
|
||||||
|
0x00000000L,0x02000000L,0x00002000L,0x02002000L,
|
||||||
|
0x00200000L,0x02200000L,0x00202000L,0x02202000L,
|
||||||
|
0x00000004L,0x02000004L,0x00002004L,0x02002004L,
|
||||||
|
0x00200004L,0x02200004L,0x00202004L,0x02202004L,
|
||||||
|
0x00000400L,0x02000400L,0x00002400L,0x02002400L,
|
||||||
|
0x00200400L,0x02200400L,0x00202400L,0x02202400L,
|
||||||
|
0x00000404L,0x02000404L,0x00002404L,0x02002404L,
|
||||||
|
0x00200404L,0x02200404L,0x00202404L,0x02202404L,
|
||||||
|
0x10000000L,0x12000000L,0x10002000L,0x12002000L,
|
||||||
|
0x10200000L,0x12200000L,0x10202000L,0x12202000L,
|
||||||
|
0x10000004L,0x12000004L,0x10002004L,0x12002004L,
|
||||||
|
0x10200004L,0x12200004L,0x10202004L,0x12202004L,
|
||||||
|
0x10000400L,0x12000400L,0x10002400L,0x12002400L,
|
||||||
|
0x10200400L,0x12200400L,0x10202400L,0x12202400L,
|
||||||
|
0x10000404L,0x12000404L,0x10002404L,0x12002404L,
|
||||||
|
0x10200404L,0x12200404L,0x10202404L,0x12202404L,
|
||||||
|
/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
|
||||||
|
0x00000000L,0x00000001L,0x00040000L,0x00040001L,
|
||||||
|
0x01000000L,0x01000001L,0x01040000L,0x01040001L,
|
||||||
|
0x00000002L,0x00000003L,0x00040002L,0x00040003L,
|
||||||
|
0x01000002L,0x01000003L,0x01040002L,0x01040003L,
|
||||||
|
0x00000200L,0x00000201L,0x00040200L,0x00040201L,
|
||||||
|
0x01000200L,0x01000201L,0x01040200L,0x01040201L,
|
||||||
|
0x00000202L,0x00000203L,0x00040202L,0x00040203L,
|
||||||
|
0x01000202L,0x01000203L,0x01040202L,0x01040203L,
|
||||||
|
0x08000000L,0x08000001L,0x08040000L,0x08040001L,
|
||||||
|
0x09000000L,0x09000001L,0x09040000L,0x09040001L,
|
||||||
|
0x08000002L,0x08000003L,0x08040002L,0x08040003L,
|
||||||
|
0x09000002L,0x09000003L,0x09040002L,0x09040003L,
|
||||||
|
0x08000200L,0x08000201L,0x08040200L,0x08040201L,
|
||||||
|
0x09000200L,0x09000201L,0x09040200L,0x09040201L,
|
||||||
|
0x08000202L,0x08000203L,0x08040202L,0x08040203L,
|
||||||
|
0x09000202L,0x09000203L,0x09040202L,0x09040203L,
|
||||||
|
/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
|
||||||
|
0x00000000L,0x00100000L,0x00000100L,0x00100100L,
|
||||||
|
0x00000008L,0x00100008L,0x00000108L,0x00100108L,
|
||||||
|
0x00001000L,0x00101000L,0x00001100L,0x00101100L,
|
||||||
|
0x00001008L,0x00101008L,0x00001108L,0x00101108L,
|
||||||
|
0x04000000L,0x04100000L,0x04000100L,0x04100100L,
|
||||||
|
0x04000008L,0x04100008L,0x04000108L,0x04100108L,
|
||||||
|
0x04001000L,0x04101000L,0x04001100L,0x04101100L,
|
||||||
|
0x04001008L,0x04101008L,0x04001108L,0x04101108L,
|
||||||
|
0x00020000L,0x00120000L,0x00020100L,0x00120100L,
|
||||||
|
0x00020008L,0x00120008L,0x00020108L,0x00120108L,
|
||||||
|
0x00021000L,0x00121000L,0x00021100L,0x00121100L,
|
||||||
|
0x00021008L,0x00121008L,0x00021108L,0x00121108L,
|
||||||
|
0x04020000L,0x04120000L,0x04020100L,0x04120100L,
|
||||||
|
0x04020008L,0x04120008L,0x04020108L,0x04120108L,
|
||||||
|
0x04021000L,0x04121000L,0x04021100L,0x04121100L,
|
||||||
|
0x04021008L,0x04121008L,0x04021108L,0x04121108L,
|
||||||
|
/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
|
||||||
|
0x00000000L,0x10000000L,0x00010000L,0x10010000L,
|
||||||
|
0x00000004L,0x10000004L,0x00010004L,0x10010004L,
|
||||||
|
0x20000000L,0x30000000L,0x20010000L,0x30010000L,
|
||||||
|
0x20000004L,0x30000004L,0x20010004L,0x30010004L,
|
||||||
|
0x00100000L,0x10100000L,0x00110000L,0x10110000L,
|
||||||
|
0x00100004L,0x10100004L,0x00110004L,0x10110004L,
|
||||||
|
0x20100000L,0x30100000L,0x20110000L,0x30110000L,
|
||||||
|
0x20100004L,0x30100004L,0x20110004L,0x30110004L,
|
||||||
|
0x00001000L,0x10001000L,0x00011000L,0x10011000L,
|
||||||
|
0x00001004L,0x10001004L,0x00011004L,0x10011004L,
|
||||||
|
0x20001000L,0x30001000L,0x20011000L,0x30011000L,
|
||||||
|
0x20001004L,0x30001004L,0x20011004L,0x30011004L,
|
||||||
|
0x00101000L,0x10101000L,0x00111000L,0x10111000L,
|
||||||
|
0x00101004L,0x10101004L,0x00111004L,0x10111004L,
|
||||||
|
0x20101000L,0x30101000L,0x20111000L,0x30111000L,
|
||||||
|
0x20101004L,0x30101004L,0x20111004L,0x30111004L,
|
||||||
|
/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
|
||||||
|
0x00000000L,0x08000000L,0x00000008L,0x08000008L,
|
||||||
|
0x00000400L,0x08000400L,0x00000408L,0x08000408L,
|
||||||
|
0x00020000L,0x08020000L,0x00020008L,0x08020008L,
|
||||||
|
0x00020400L,0x08020400L,0x00020408L,0x08020408L,
|
||||||
|
0x00000001L,0x08000001L,0x00000009L,0x08000009L,
|
||||||
|
0x00000401L,0x08000401L,0x00000409L,0x08000409L,
|
||||||
|
0x00020001L,0x08020001L,0x00020009L,0x08020009L,
|
||||||
|
0x00020401L,0x08020401L,0x00020409L,0x08020409L,
|
||||||
|
0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
|
||||||
|
0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
|
||||||
|
0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
|
||||||
|
0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
|
||||||
|
0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
|
||||||
|
0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
|
||||||
|
0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
|
||||||
|
0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
|
||||||
|
/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
|
||||||
|
0x00000000L,0x00000100L,0x00080000L,0x00080100L,
|
||||||
|
0x01000000L,0x01000100L,0x01080000L,0x01080100L,
|
||||||
|
0x00000010L,0x00000110L,0x00080010L,0x00080110L,
|
||||||
|
0x01000010L,0x01000110L,0x01080010L,0x01080110L,
|
||||||
|
0x00200000L,0x00200100L,0x00280000L,0x00280100L,
|
||||||
|
0x01200000L,0x01200100L,0x01280000L,0x01280100L,
|
||||||
|
0x00200010L,0x00200110L,0x00280010L,0x00280110L,
|
||||||
|
0x01200010L,0x01200110L,0x01280010L,0x01280110L,
|
||||||
|
0x00000200L,0x00000300L,0x00080200L,0x00080300L,
|
||||||
|
0x01000200L,0x01000300L,0x01080200L,0x01080300L,
|
||||||
|
0x00000210L,0x00000310L,0x00080210L,0x00080310L,
|
||||||
|
0x01000210L,0x01000310L,0x01080210L,0x01080310L,
|
||||||
|
0x00200200L,0x00200300L,0x00280200L,0x00280300L,
|
||||||
|
0x01200200L,0x01200300L,0x01280200L,0x01280300L,
|
||||||
|
0x00200210L,0x00200310L,0x00280210L,0x00280310L,
|
||||||
|
0x01200210L,0x01200310L,0x01280210L,0x01280310L,
|
||||||
|
/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
|
||||||
|
0x00000000L,0x04000000L,0x00040000L,0x04040000L,
|
||||||
|
0x00000002L,0x04000002L,0x00040002L,0x04040002L,
|
||||||
|
0x00002000L,0x04002000L,0x00042000L,0x04042000L,
|
||||||
|
0x00002002L,0x04002002L,0x00042002L,0x04042002L,
|
||||||
|
0x00000020L,0x04000020L,0x00040020L,0x04040020L,
|
||||||
|
0x00000022L,0x04000022L,0x00040022L,0x04040022L,
|
||||||
|
0x00002020L,0x04002020L,0x00042020L,0x04042020L,
|
||||||
|
0x00002022L,0x04002022L,0x00042022L,0x04042022L,
|
||||||
|
0x00000800L,0x04000800L,0x00040800L,0x04040800L,
|
||||||
|
0x00000802L,0x04000802L,0x00040802L,0x04040802L,
|
||||||
|
0x00002800L,0x04002800L,0x00042800L,0x04042800L,
|
||||||
|
0x00002802L,0x04002802L,0x00042802L,0x04042802L,
|
||||||
|
0x00000820L,0x04000820L,0x00040820L,0x04040820L,
|
||||||
|
0x00000822L,0x04000822L,0x00040822L,0x04040822L,
|
||||||
|
0x00002820L,0x04002820L,0x00042820L,0x04042820L,
|
||||||
|
0x00002822L,0x04002822L,0x00042822L,0x04042822L
|
||||||
|
};
|
||||||
+152
@@ -0,0 +1,152 @@
|
|||||||
|
/* spr.h */
|
||||||
|
/* Copyright (C) 1995 Eric Young (eay@mincom.oz.au).
|
||||||
|
* All rights reserved.
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* See the COPYRIGHT file in the libdes distribution for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const unsigned long des_SPtrans[8][64]={
|
||||||
|
/* nibble 0 */
|
||||||
|
0x00820200L, 0x00020000L, 0x80800000L, 0x80820200L,
|
||||||
|
0x00800000L, 0x80020200L, 0x80020000L, 0x80800000L,
|
||||||
|
0x80020200L, 0x00820200L, 0x00820000L, 0x80000200L,
|
||||||
|
0x80800200L, 0x00800000L, 0x00000000L, 0x80020000L,
|
||||||
|
0x00020000L, 0x80000000L, 0x00800200L, 0x00020200L,
|
||||||
|
0x80820200L, 0x00820000L, 0x80000200L, 0x00800200L,
|
||||||
|
0x80000000L, 0x00000200L, 0x00020200L, 0x80820000L,
|
||||||
|
0x00000200L, 0x80800200L, 0x80820000L, 0x00000000L,
|
||||||
|
0x00000000L, 0x80820200L, 0x00800200L, 0x80020000L,
|
||||||
|
0x00820200L, 0x00020000L, 0x80000200L, 0x00800200L,
|
||||||
|
0x80820000L, 0x00000200L, 0x00020200L, 0x80800000L,
|
||||||
|
0x80020200L, 0x80000000L, 0x80800000L, 0x00820000L,
|
||||||
|
0x80820200L, 0x00020200L, 0x00820000L, 0x80800200L,
|
||||||
|
0x00800000L, 0x80000200L, 0x80020000L, 0x00000000L,
|
||||||
|
0x00020000L, 0x00800000L, 0x80800200L, 0x00820200L,
|
||||||
|
0x80000000L, 0x80820000L, 0x00000200L, 0x80020200L,
|
||||||
|
|
||||||
|
/* nibble 1 */
|
||||||
|
0x10042004L, 0x00000000L, 0x00042000L, 0x10040000L,
|
||||||
|
0x10000004L, 0x00002004L, 0x10002000L, 0x00042000L,
|
||||||
|
0x00002000L, 0x10040004L, 0x00000004L, 0x10002000L,
|
||||||
|
0x00040004L, 0x10042000L, 0x10040000L, 0x00000004L,
|
||||||
|
0x00040000L, 0x10002004L, 0x10040004L, 0x00002000L,
|
||||||
|
0x00042004L, 0x10000000L, 0x00000000L, 0x00040004L,
|
||||||
|
0x10002004L, 0x00042004L, 0x10042000L, 0x10000004L,
|
||||||
|
0x10000000L, 0x00040000L, 0x00002004L, 0x10042004L,
|
||||||
|
0x00040004L, 0x10042000L, 0x10002000L, 0x00042004L,
|
||||||
|
0x10042004L, 0x00040004L, 0x10000004L, 0x00000000L,
|
||||||
|
0x10000000L, 0x00002004L, 0x00040000L, 0x10040004L,
|
||||||
|
0x00002000L, 0x10000000L, 0x00042004L, 0x10002004L,
|
||||||
|
0x10042000L, 0x00002000L, 0x00000000L, 0x10000004L,
|
||||||
|
0x00000004L, 0x10042004L, 0x00042000L, 0x10040000L,
|
||||||
|
0x10040004L, 0x00040000L, 0x00002004L, 0x10002000L,
|
||||||
|
0x10002004L, 0x00000004L, 0x10040000L, 0x00042000L,
|
||||||
|
|
||||||
|
/* nibble 2 */
|
||||||
|
0x41000000L, 0x01010040L, 0x00000040L, 0x41000040L,
|
||||||
|
0x40010000L, 0x01000000L, 0x41000040L, 0x00010040L,
|
||||||
|
0x01000040L, 0x00010000L, 0x01010000L, 0x40000000L,
|
||||||
|
0x41010040L, 0x40000040L, 0x40000000L, 0x41010000L,
|
||||||
|
0x00000000L, 0x40010000L, 0x01010040L, 0x00000040L,
|
||||||
|
0x40000040L, 0x41010040L, 0x00010000L, 0x41000000L,
|
||||||
|
0x41010000L, 0x01000040L, 0x40010040L, 0x01010000L,
|
||||||
|
0x00010040L, 0x00000000L, 0x01000000L, 0x40010040L,
|
||||||
|
0x01010040L, 0x00000040L, 0x40000000L, 0x00010000L,
|
||||||
|
0x40000040L, 0x40010000L, 0x01010000L, 0x41000040L,
|
||||||
|
0x00000000L, 0x01010040L, 0x00010040L, 0x41010000L,
|
||||||
|
0x40010000L, 0x01000000L, 0x41010040L, 0x40000000L,
|
||||||
|
0x40010040L, 0x41000000L, 0x01000000L, 0x41010040L,
|
||||||
|
0x00010000L, 0x01000040L, 0x41000040L, 0x00010040L,
|
||||||
|
0x01000040L, 0x00000000L, 0x41010000L, 0x40000040L,
|
||||||
|
0x41000000L, 0x40010040L, 0x00000040L, 0x01010000L,
|
||||||
|
|
||||||
|
/* nibble 3 */
|
||||||
|
0x00100402L, 0x04000400L, 0x00000002L, 0x04100402L,
|
||||||
|
0x00000000L, 0x04100000L, 0x04000402L, 0x00100002L,
|
||||||
|
0x04100400L, 0x04000002L, 0x04000000L, 0x00000402L,
|
||||||
|
0x04000002L, 0x00100402L, 0x00100000L, 0x04000000L,
|
||||||
|
0x04100002L, 0x00100400L, 0x00000400L, 0x00000002L,
|
||||||
|
0x00100400L, 0x04000402L, 0x04100000L, 0x00000400L,
|
||||||
|
0x00000402L, 0x00000000L, 0x00100002L, 0x04100400L,
|
||||||
|
0x04000400L, 0x04100002L, 0x04100402L, 0x00100000L,
|
||||||
|
0x04100002L, 0x00000402L, 0x00100000L, 0x04000002L,
|
||||||
|
0x00100400L, 0x04000400L, 0x00000002L, 0x04100000L,
|
||||||
|
0x04000402L, 0x00000000L, 0x00000400L, 0x00100002L,
|
||||||
|
0x00000000L, 0x04100002L, 0x04100400L, 0x00000400L,
|
||||||
|
0x04000000L, 0x04100402L, 0x00100402L, 0x00100000L,
|
||||||
|
0x04100402L, 0x00000002L, 0x04000400L, 0x00100402L,
|
||||||
|
0x00100002L, 0x00100400L, 0x04100000L, 0x04000402L,
|
||||||
|
0x00000402L, 0x04000000L, 0x04000002L, 0x04100400L,
|
||||||
|
|
||||||
|
/* nibble 4 */
|
||||||
|
0x02000000L, 0x00004000L, 0x00000100L, 0x02004108L,
|
||||||
|
0x02004008L, 0x02000100L, 0x00004108L, 0x02004000L,
|
||||||
|
0x00004000L, 0x00000008L, 0x02000008L, 0x00004100L,
|
||||||
|
0x02000108L, 0x02004008L, 0x02004100L, 0x00000000L,
|
||||||
|
0x00004100L, 0x02000000L, 0x00004008L, 0x00000108L,
|
||||||
|
0x02000100L, 0x00004108L, 0x00000000L, 0x02000008L,
|
||||||
|
0x00000008L, 0x02000108L, 0x02004108L, 0x00004008L,
|
||||||
|
0x02004000L, 0x00000100L, 0x00000108L, 0x02004100L,
|
||||||
|
0x02004100L, 0x02000108L, 0x00004008L, 0x02004000L,
|
||||||
|
0x00004000L, 0x00000008L, 0x02000008L, 0x02000100L,
|
||||||
|
0x02000000L, 0x00004100L, 0x02004108L, 0x00000000L,
|
||||||
|
0x00004108L, 0x02000000L, 0x00000100L, 0x00004008L,
|
||||||
|
0x02000108L, 0x00000100L, 0x00000000L, 0x02004108L,
|
||||||
|
0x02004008L, 0x02004100L, 0x00000108L, 0x00004000L,
|
||||||
|
0x00004100L, 0x02004008L, 0x02000100L, 0x00000108L,
|
||||||
|
0x00000008L, 0x00004108L, 0x02004000L, 0x02000008L,
|
||||||
|
|
||||||
|
/* nibble 5 */
|
||||||
|
0x20000010L, 0x00080010L, 0x00000000L, 0x20080800L,
|
||||||
|
0x00080010L, 0x00000800L, 0x20000810L, 0x00080000L,
|
||||||
|
0x00000810L, 0x20080810L, 0x00080800L, 0x20000000L,
|
||||||
|
0x20000800L, 0x20000010L, 0x20080000L, 0x00080810L,
|
||||||
|
0x00080000L, 0x20000810L, 0x20080010L, 0x00000000L,
|
||||||
|
0x00000800L, 0x00000010L, 0x20080800L, 0x20080010L,
|
||||||
|
0x20080810L, 0x20080000L, 0x20000000L, 0x00000810L,
|
||||||
|
0x00000010L, 0x00080800L, 0x00080810L, 0x20000800L,
|
||||||
|
0x00000810L, 0x20000000L, 0x20000800L, 0x00080810L,
|
||||||
|
0x20080800L, 0x00080010L, 0x00000000L, 0x20000800L,
|
||||||
|
0x20000000L, 0x00000800L, 0x20080010L, 0x00080000L,
|
||||||
|
0x00080010L, 0x20080810L, 0x00080800L, 0x00000010L,
|
||||||
|
0x20080810L, 0x00080800L, 0x00080000L, 0x20000810L,
|
||||||
|
0x20000010L, 0x20080000L, 0x00080810L, 0x00000000L,
|
||||||
|
0x00000800L, 0x20000010L, 0x20000810L, 0x20080800L,
|
||||||
|
0x20080000L, 0x00000810L, 0x00000010L, 0x20080010L,
|
||||||
|
|
||||||
|
/* nibble 6 */
|
||||||
|
0x00001000L, 0x00000080L, 0x00400080L, 0x00400001L,
|
||||||
|
0x00401081L, 0x00001001L, 0x00001080L, 0x00000000L,
|
||||||
|
0x00400000L, 0x00400081L, 0x00000081L, 0x00401000L,
|
||||||
|
0x00000001L, 0x00401080L, 0x00401000L, 0x00000081L,
|
||||||
|
0x00400081L, 0x00001000L, 0x00001001L, 0x00401081L,
|
||||||
|
0x00000000L, 0x00400080L, 0x00400001L, 0x00001080L,
|
||||||
|
0x00401001L, 0x00001081L, 0x00401080L, 0x00000001L,
|
||||||
|
0x00001081L, 0x00401001L, 0x00000080L, 0x00400000L,
|
||||||
|
0x00001081L, 0x00401000L, 0x00401001L, 0x00000081L,
|
||||||
|
0x00001000L, 0x00000080L, 0x00400000L, 0x00401001L,
|
||||||
|
0x00400081L, 0x00001081L, 0x00001080L, 0x00000000L,
|
||||||
|
0x00000080L, 0x00400001L, 0x00000001L, 0x00400080L,
|
||||||
|
0x00000000L, 0x00400081L, 0x00400080L, 0x00001080L,
|
||||||
|
0x00000081L, 0x00001000L, 0x00401081L, 0x00400000L,
|
||||||
|
0x00401080L, 0x00000001L, 0x00001001L, 0x00401081L,
|
||||||
|
0x00400001L, 0x00401080L, 0x00401000L, 0x00001001L,
|
||||||
|
|
||||||
|
/* nibble 7 */
|
||||||
|
0x08200020L, 0x08208000L, 0x00008020L, 0x00000000L,
|
||||||
|
0x08008000L, 0x00200020L, 0x08200000L, 0x08208020L,
|
||||||
|
0x00000020L, 0x08000000L, 0x00208000L, 0x00008020L,
|
||||||
|
0x00208020L, 0x08008020L, 0x08000020L, 0x08200000L,
|
||||||
|
0x00008000L, 0x00208020L, 0x00200020L, 0x08008000L,
|
||||||
|
0x08208020L, 0x08000020L, 0x00000000L, 0x00208000L,
|
||||||
|
0x08000000L, 0x00200000L, 0x08008020L, 0x08200020L,
|
||||||
|
0x00200000L, 0x00008000L, 0x08208000L, 0x00000020L,
|
||||||
|
0x00200000L, 0x00008000L, 0x08000020L, 0x08208020L,
|
||||||
|
0x00008020L, 0x08000000L, 0x00000000L, 0x00208000L,
|
||||||
|
0x08200020L, 0x08008020L, 0x08008000L, 0x00200020L,
|
||||||
|
0x08208000L, 0x00000020L, 0x00200020L, 0x08008000L,
|
||||||
|
0x08208020L, 0x00200000L, 0x08200000L, 0x08000020L,
|
||||||
|
0x00208000L, 0x00008020L, 0x08008020L, 0x08200000L,
|
||||||
|
0x00000020L, 0x08208000L, 0x00208020L, 0x00000000L,
|
||||||
|
0x08000000L, 0x08200020L, 0x00008000L, 0x00208020L};
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
/* version.h */
|
||||||
|
/* Copyright (C) 1995 Eric Young (eay@mincom.oz.au).
|
||||||
|
* All rights reserved.
|
||||||
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||||
|
* the code are not to be removed.
|
||||||
|
* See the COPYRIGHT file in the libdes distribution for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const char *version="libdes v 3.14 - eay";
|
||||||
Vendored
+271
@@ -0,0 +1,271 @@
|
|||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* Makefile for the encryption library *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
PROJ = crypt
|
||||||
|
LIBNAME = lib$(PROJ).a
|
||||||
|
|
||||||
|
CFLAGS = -c -D__UNIX__ -O -I. $(CMDC) # Flags for compiler
|
||||||
|
|
||||||
|
LFLAGS = $(CMDL) # Flags for linker
|
||||||
|
|
||||||
|
OUTPATH = # Where object files go (/tmp is a good place)
|
||||||
|
OBJ = .o # Extension for object files
|
||||||
|
|
||||||
|
LD = $(CC) # Linker (just use the C compiler)
|
||||||
|
ECHO = echo # Echo to screen command
|
||||||
|
MAKE = make # The make command
|
||||||
|
|
||||||
|
# The object files which make up the library
|
||||||
|
|
||||||
|
OBJS = $(OUTPATH)crypt$(OBJ) $(OUTPATH)lib_3des$(OBJ) \
|
||||||
|
$(OUTPATH)lib_des$(OBJ) $(OUTPATH)lib_idea$(OBJ) \
|
||||||
|
$(OUTPATH)lib_mdc$(OBJ) $(OUTPATH)lib_null$(OBJ) \
|
||||||
|
$(OUTPATH)lib_rc4$(OBJ) $(OUTPATH)lib_safr$(OBJ) \
|
||||||
|
$(OUTPATH)idea$(OBJ) $(OUTPATH)3ecb_enc$(OBJ) \
|
||||||
|
$(OUTPATH)ecb_enc$(OBJ) $(OUTPATH)pcbc_enc$(OBJ) \
|
||||||
|
$(OUTPATH)set_key$(OBJ) $(OUTPATH)rc4$(OBJ) \
|
||||||
|
$(OUTPATH)safer$(OBJ) $(OUTPATH)shs$(OBJ)
|
||||||
|
|
||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* If no args are given, print a usage message and exit *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
default:
|
||||||
|
@$(ECHO)
|
||||||
|
@$(ECHO) "Usage: make <system-type>"
|
||||||
|
@$(ECHO)
|
||||||
|
@$(ECHO) "To create the encryption library, you have to enter the Unix system type"
|
||||||
|
@$(ECHO) "you want to build it for. Possible options are: aix, aix370, aix386,"
|
||||||
|
@$(ECHO) "bsd386, convex, irix, hpux, hpux-gcc, isc, linux, mint, mipsbsd, next, osf1,"
|
||||||
|
@$(ECHO) "qnx, sco, sun, svr4, ultrix, and uts4. If none of the above fit, try 'make "
|
||||||
|
@$(ECHO) "generic', and send a copy of any changes necessary to the author, "
|
||||||
|
@$(ECHO) "pgut01@cs.auckland.ac.nz"
|
||||||
|
@$(ECHO)
|
||||||
|
@$(ECHO) "After the library has been created, use 'make test' to build a test program"
|
||||||
|
@$(ECHO) "with it."
|
||||||
|
|
||||||
|
# Frohe Ostern.
|
||||||
|
|
||||||
|
babies:
|
||||||
|
@$(ECHO) "Good grief, what do you think I am? The Unix environment is capable, but"
|
||||||
|
@$(ECHO) "not that capable."
|
||||||
|
|
||||||
|
cookies:
|
||||||
|
@$(ECHO) "Mix 250g flour, 150g sugar, 125g butter, an egg, a few drops of vanilla"
|
||||||
|
@$(ECHO) "essence, and 1 tsp baking powder into a dough, cut cookies from rolls of"
|
||||||
|
@$(ECHO) "dough, bake for about 15 minutes at 180C until they turn very light brown"
|
||||||
|
@$(ECHO) "at the edges."
|
||||||
|
|
||||||
|
love:
|
||||||
|
@$(ECHO) "Nicht wahr?"
|
||||||
|
@$(ECHO)
|
||||||
|
|
||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* Rules to build the encryption library *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
# Main directory
|
||||||
|
|
||||||
|
$(OUTPATH)crypt$(OBJ): crypt.h crypt.c
|
||||||
|
$(CC) $(CFLAGS) crypt.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_3des$(OBJ): crypt.h libdes/des.h lib_3des.c
|
||||||
|
$(CC) $(CFLAGS) lib_3des.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_des$(OBJ): crypt.h testdes.h libdes/des.h lib_des.c
|
||||||
|
$(CC) $(CFLAGS) lib_des.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_idea$(OBJ): crypt.h idea/idea.h testidea.h lib_idea.c
|
||||||
|
$(CC) $(CFLAGS) lib_idea.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_mdc$(OBJ): crypt.h mdc/shs.h lib_mdc.c
|
||||||
|
$(CC) $(CFLAGS) lib_mdc.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_null$(OBJ): crypt.h lib_null.c
|
||||||
|
$(CC) $(CFLAGS) lib_null.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_rc4$(OBJ): crypt.h testrc4.h rc4/rc4.h lib_rc4.c
|
||||||
|
$(CC) $(CFLAGS) lib_rc4.c
|
||||||
|
|
||||||
|
$(OUTPATH)lib_safr$(OBJ): crypt.h testsafr.h safer/safer.h lib_safr.c
|
||||||
|
$(CC) $(CFLAGS) lib_safr.c
|
||||||
|
|
||||||
|
$(OUTPATH)test$(OBJ): crypt.h test.c
|
||||||
|
$(CC) $(CFLAGS) test.c
|
||||||
|
|
||||||
|
# idea subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)idea$(OBJ): idea/idea.h idea/idea.c
|
||||||
|
$(CC) $(CFLAGS) idea/idea.c
|
||||||
|
|
||||||
|
# libdes subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)3ecb_enc$(OBJ): libdes/des.h libdes/des_locl.h libdes/3ecb_enc.c
|
||||||
|
$(CC) $(CFLAGS) libdes/3ecb_enc.c
|
||||||
|
|
||||||
|
$(OUTPATH)ecb_enc$(OBJ): libdes/des.h libdes/des_locl.h libdes/spr.h \
|
||||||
|
libdes/version.h libdes/ecb_enc.c
|
||||||
|
$(CC) $(CFLAGS) libdes/ecb_enc.c
|
||||||
|
|
||||||
|
$(OUTPATH)pcbc_enc$(OBJ): libdes/des.h libdes/des_locl.h libdes/pcbc_enc.c
|
||||||
|
$(CC) $(CFLAGS) libdes/pcbc_enc.c
|
||||||
|
|
||||||
|
$(OUTPATH)set_key$(OBJ): libdes/des.h libdes/des_locl.h libdes/podd.h \
|
||||||
|
libdes/sk.h libdes/set_key.c
|
||||||
|
$(CC) $(CFLAGS) libdes/set_key.c
|
||||||
|
|
||||||
|
# rc4 subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)rc4$(OBJ): rc4/rc4.h rc4/rc4.c
|
||||||
|
$(CC) $(CFLAGS) rc4/rc4.c
|
||||||
|
|
||||||
|
# safer subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)safer$(OBJ): safer/safer.h safer/safer.c
|
||||||
|
$(CC) $(CFLAGS) safer/safer.c
|
||||||
|
|
||||||
|
# mdc subdirectory
|
||||||
|
|
||||||
|
$(OUTPATH)shs$(OBJ): mdc/shs.h mdc/shs.c
|
||||||
|
$(CC) $(CFLAGS) mdc/shs.c
|
||||||
|
|
||||||
|
# Create the library. The test program is also listed as a dependancy
|
||||||
|
# since we need to use OS-specific compiler options for it which a
|
||||||
|
# simple 'make test' won't give us (yuck).
|
||||||
|
|
||||||
|
$(LIBNAME): $(OBJS) $(OUTPATH)test$(OBJ)
|
||||||
|
ar rc $(LIBNAME) $(OBJS)
|
||||||
|
|
||||||
|
# Link everything into a test program
|
||||||
|
|
||||||
|
test: $(LIBNAME) $(OUTPATH)test$(OBJ)
|
||||||
|
@$(LD) -o testcrypt $(LFLAGS) $(OUTPATH)test$(OBJ) -L. -l$(PROJ)
|
||||||
|
|
||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* Defines for each variation of Unix *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
# AIX for the RS6000: Use cc. Differs from AIX370/386 in endianness
|
||||||
|
|
||||||
|
aix:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="cc"
|
||||||
|
|
||||||
|
# AIX370, AIX386: Use cc
|
||||||
|
|
||||||
|
aix370:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="cc"
|
||||||
|
aix386:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="cc"
|
||||||
|
|
||||||
|
# AUX: The only Unix so bloated it has /etc.etc.etc
|
||||||
|
|
||||||
|
# BSD 386: Use cc
|
||||||
|
|
||||||
|
bsd386:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="cc"
|
||||||
|
|
||||||
|
# Convex: Use cc (cc has some bugs)
|
||||||
|
|
||||||
|
convex:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="cc"
|
||||||
|
|
||||||
|
# Esix: Run away!! Run away!!
|
||||||
|
|
||||||
|
# Generic: Generic BSD-ish system running gcc
|
||||||
|
|
||||||
|
generic:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="gcc"
|
||||||
|
|
||||||
|
# HPUX: Use cc if you have the ANSI C compiler, otherwise use gcc
|
||||||
|
# Need to use '-Aa -D_HPUX_SOURCE' as compiler options to get
|
||||||
|
# C compiler into ANSI C mode with UNIX symbols.
|
||||||
|
|
||||||
|
hpux:
|
||||||
|
@$(MAKE) $(LIBNAME) CMDC="-Aa -D_HPUX_SOURCE +O3" CC="cc"
|
||||||
|
|
||||||
|
hpux-gcc:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="gcc"
|
||||||
|
|
||||||
|
# Irix: Use cc with the -acpp flag for maximum ANSI-ness
|
||||||
|
|
||||||
|
irix:
|
||||||
|
@$(MAKE) $(LIBNAME) CMDC="-acpp" CC="cc"
|
||||||
|
|
||||||
|
# ISC Unix: Use gcc
|
||||||
|
|
||||||
|
isc:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="gcc"
|
||||||
|
|
||||||
|
# Linux: Use gcc
|
||||||
|
|
||||||
|
linux:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="gcc"
|
||||||
|
|
||||||
|
# MiNT: Use gcc
|
||||||
|
|
||||||
|
mint:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="gcc"
|
||||||
|
|
||||||
|
# Risc/OS 4: Use gcc
|
||||||
|
|
||||||
|
mipsbsd:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="gcc"
|
||||||
|
|
||||||
|
# NeXT 3.0: Use cc
|
||||||
|
|
||||||
|
next:
|
||||||
|
@$(MAKE) $(LIBNAME) CMDC="-O2" CMDL="-object -s" CC="cc"
|
||||||
|
|
||||||
|
# OSF 1: Use gcc
|
||||||
|
|
||||||
|
osf1:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="gcc"
|
||||||
|
|
||||||
|
# QNX 4.x: Use cc -ml, ld -N32768 -ml
|
||||||
|
|
||||||
|
qnx:
|
||||||
|
@$(MAKE) $(LIBNAME) CMDC="-ml" CMDL="-N32768 -ml" CC="cc"
|
||||||
|
|
||||||
|
# SCO: Use cc.
|
||||||
|
|
||||||
|
sco:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="cc"
|
||||||
|
|
||||||
|
# Sun/Slowaris: Use gcc
|
||||||
|
|
||||||
|
sun:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="gcc"
|
||||||
|
|
||||||
|
# SVR4: Use cc. Better results can be obtained by upgrading your OS to
|
||||||
|
# 4.4 BSD.
|
||||||
|
|
||||||
|
svr4:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="cc"
|
||||||
|
|
||||||
|
# Ultrix: Use vcc or gcc
|
||||||
|
|
||||||
|
ultrix:
|
||||||
|
@$(MAKE) $(LIBNAME) CC="gcc"
|
||||||
|
|
||||||
|
# Amdahl UTS 4: Use cc
|
||||||
|
|
||||||
|
uts4:
|
||||||
|
@$(MAKE) $(LIBNAME) CMDC="-Xc", CC="cc"
|
||||||
|
|
||||||
|
#****************************************************************************
|
||||||
|
#* *
|
||||||
|
#* Cleanup after make has finished *
|
||||||
|
#* *
|
||||||
|
#****************************************************************************
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o core testcrypt $(LIBNAME)
|
||||||
Vendored
+540
@@ -0,0 +1,540 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include "../crypt.h"
|
||||||
|
#include "shs.h"
|
||||||
|
#else
|
||||||
|
#include "crypt.h"
|
||||||
|
#include "mdc/shs.h"
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
/* The SHS f()-functions. The f1 and f3 functions can be optimized to
|
||||||
|
save one boolean operation each - thanks to Rich Schroeppel,
|
||||||
|
rcs@cs.arizona.edu for discovering this */
|
||||||
|
|
||||||
|
/*#define f1(x,y,z) ( ( x & y ) | ( ~x & z ) ) // Rounds 0-19 */
|
||||||
|
#define f1(x,y,z) ( z ^ ( x & ( y ^ z ) ) ) /* Rounds 0-19 */
|
||||||
|
#define f2(x,y,z) ( x ^ y ^ z ) /* Rounds 20-39 */
|
||||||
|
/*#define f3(x,y,z) ( ( x & y ) | ( x & z ) | ( y & z ) ) // Rounds 40-59 */
|
||||||
|
#define f3(x,y,z) ( ( x & y ) | ( z & ( x | y ) ) ) /* Rounds 40-59 */
|
||||||
|
#define f4(x,y,z) ( x ^ y ^ z ) /* Rounds 60-79 */
|
||||||
|
|
||||||
|
/* The SHS Mysterious Constants */
|
||||||
|
|
||||||
|
#define K1 0x5A827999UL /* Rounds 0-19 */
|
||||||
|
#define K2 0x6ED9EBA1UL /* Rounds 20-39 */
|
||||||
|
#define K3 0x8F1BBCDCUL /* Rounds 40-59 */
|
||||||
|
#define K4 0xCA62C1D6UL /* Rounds 60-79 */
|
||||||
|
|
||||||
|
/* SHS initial values */
|
||||||
|
|
||||||
|
#define h0init 0x67452301UL
|
||||||
|
#define h1init 0xEFCDAB89UL
|
||||||
|
#define h2init 0x98BADCFEUL
|
||||||
|
#define h3init 0x10325476UL
|
||||||
|
#define h4init 0xC3D2E1F0UL
|
||||||
|
|
||||||
|
/* Note that it may be necessary to add parentheses to these macros if they
|
||||||
|
are to be called with expressions as arguments */
|
||||||
|
|
||||||
|
/* 32-bit rotate left - kludged with shifts */
|
||||||
|
|
||||||
|
#define ROTL(n,X) ( ( ( X ) << n ) | ( ( X ) >> ( 32 - n ) ) )
|
||||||
|
|
||||||
|
/* The initial expanding function. The hash function is defined over an
|
||||||
|
80-word expanded input array W, where the first 16 are copies of the input
|
||||||
|
data, and the remaining 64 are defined by
|
||||||
|
|
||||||
|
W[ i ] = W[ i - 16 ] ^ W[ i - 14 ] ^ W[ i - 8 ] ^ W[ i - 3 ]
|
||||||
|
|
||||||
|
This implementation generates these values on the fly in a circular
|
||||||
|
buffer - thanks to Colin Plumb, colin@nyx10.cs.du.edu for this
|
||||||
|
optimization.
|
||||||
|
|
||||||
|
The updated SHS changes the expanding function by adding a rotate of 1
|
||||||
|
bit. Thanks to Jim Gillogly, jim@rand.org, and an anonymous contributor
|
||||||
|
for this information */
|
||||||
|
|
||||||
|
#ifdef NEW_SHS
|
||||||
|
#define expand(W,i) ( W[ i & 15 ] = ROTL( 1, ( W[ i & 15 ] ^ W[ i - 14 & 15 ] ^ \
|
||||||
|
W[ i - 8 & 15 ] ^ W[ i - 3 & 15 ] ) ) )
|
||||||
|
#else
|
||||||
|
#define expand(W,i) ( W[ i & 15 ] ^= W[ i - 14 & 15 ] ^ W[ i - 8 & 15 ] ^ W[ i - 3 & 15 ] )
|
||||||
|
#endif /* NEW_SHS */
|
||||||
|
|
||||||
|
/* The prototype SHS sub-round. The fundamental sub-round is:
|
||||||
|
|
||||||
|
a' = e + ROTL( 5, a ) + f( b, c, d ) + k + data;
|
||||||
|
b' = a;
|
||||||
|
c' = ROTL( 30, b );
|
||||||
|
d' = c;
|
||||||
|
e' = d;
|
||||||
|
|
||||||
|
but this is implemented by unrolling the loop 5 times and renaming the
|
||||||
|
variables ( e, a, b, c, d ) = ( a', b', c', d', e' ) each iteration.
|
||||||
|
This code is then replicated 20 times for each of the 4 functions, using
|
||||||
|
the next 20 values from the W[] array each time */
|
||||||
|
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
#define subRound(a, b, c, d, e, f, k, data) \
|
||||||
|
e += ROTL( 5, a ) + f( b, c, d ) + k + data; \
|
||||||
|
e &= 0xFFFFFFFFUL; \
|
||||||
|
b = ROTL( 30, b ) & 0xFFFFFFFFUL
|
||||||
|
#else
|
||||||
|
#define subRound(a, b, c, d, e, f, k, data) \
|
||||||
|
( e += ROTL( 5, a ) + f( b, c, d ) + k + data, b = ROTL( 30, b ) )
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
|
||||||
|
/* Initialize the SHS values */
|
||||||
|
|
||||||
|
void shsInit( SHS_INFO *shsInfo )
|
||||||
|
{
|
||||||
|
/* Set the h-vars to their initial values */
|
||||||
|
shsInfo->digest[ 0 ] = h0init;
|
||||||
|
shsInfo->digest[ 1 ] = h1init;
|
||||||
|
shsInfo->digest[ 2 ] = h2init;
|
||||||
|
shsInfo->digest[ 3 ] = h3init;
|
||||||
|
shsInfo->digest[ 4 ] = h4init;
|
||||||
|
|
||||||
|
/* Initialise bit count */
|
||||||
|
shsInfo->countLo = shsInfo->countHi = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef ASM_SHS
|
||||||
|
|
||||||
|
/* Perform the SHS transformation. Note that this code, like MD5, seems to
|
||||||
|
break some optimizing compilers due to the complexity of the expressions
|
||||||
|
and the size of the basic block. It may be necessary to split it into
|
||||||
|
sections, e.g. based on the four subrounds */
|
||||||
|
|
||||||
|
void SHSTransform( LONG *digest, LONG *data )
|
||||||
|
{
|
||||||
|
LONG A, B, C, D, E; /* Local vars */
|
||||||
|
LONG eData[ 16 ]; /* Expanded data */
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Set up first buffer and local data buffer */
|
||||||
|
A = digest[ 0 ];
|
||||||
|
B = digest[ 1 ];
|
||||||
|
C = digest[ 2 ];
|
||||||
|
D = digest[ 3 ];
|
||||||
|
E = digest[ 4 ];
|
||||||
|
for( i = 0; i < 16; i++ )
|
||||||
|
eData[ i ] = data[ i ];
|
||||||
|
|
||||||
|
/* Heavy mangling, in 4 sub-rounds of 20 interations each. */
|
||||||
|
subRound( A, B, C, D, E, f1, K1, eData[ 0 ] );
|
||||||
|
subRound( E, A, B, C, D, f1, K1, eData[ 1 ] );
|
||||||
|
subRound( D, E, A, B, C, f1, K1, eData[ 2 ] );
|
||||||
|
subRound( C, D, E, A, B, f1, K1, eData[ 3 ] );
|
||||||
|
subRound( B, C, D, E, A, f1, K1, eData[ 4 ] );
|
||||||
|
subRound( A, B, C, D, E, f1, K1, eData[ 5 ] );
|
||||||
|
subRound( E, A, B, C, D, f1, K1, eData[ 6 ] );
|
||||||
|
subRound( D, E, A, B, C, f1, K1, eData[ 7 ] );
|
||||||
|
subRound( C, D, E, A, B, f1, K1, eData[ 8 ] );
|
||||||
|
subRound( B, C, D, E, A, f1, K1, eData[ 9 ] );
|
||||||
|
subRound( A, B, C, D, E, f1, K1, eData[ 10 ] );
|
||||||
|
subRound( E, A, B, C, D, f1, K1, eData[ 11 ] );
|
||||||
|
subRound( D, E, A, B, C, f1, K1, eData[ 12 ] );
|
||||||
|
subRound( C, D, E, A, B, f1, K1, eData[ 13 ] );
|
||||||
|
subRound( B, C, D, E, A, f1, K1, eData[ 14 ] );
|
||||||
|
subRound( A, B, C, D, E, f1, K1, eData[ 15 ] );
|
||||||
|
subRound( E, A, B, C, D, f1, K1, expand( eData, 16 ) );
|
||||||
|
subRound( D, E, A, B, C, f1, K1, expand( eData, 17 ) );
|
||||||
|
subRound( C, D, E, A, B, f1, K1, expand( eData, 18 ) );
|
||||||
|
subRound( B, C, D, E, A, f1, K1, expand( eData, 19 ) );
|
||||||
|
|
||||||
|
subRound( A, B, C, D, E, f2, K2, expand( eData, 20 ) );
|
||||||
|
subRound( E, A, B, C, D, f2, K2, expand( eData, 21 ) );
|
||||||
|
subRound( D, E, A, B, C, f2, K2, expand( eData, 22 ) );
|
||||||
|
subRound( C, D, E, A, B, f2, K2, expand( eData, 23 ) );
|
||||||
|
subRound( B, C, D, E, A, f2, K2, expand( eData, 24 ) );
|
||||||
|
subRound( A, B, C, D, E, f2, K2, expand( eData, 25 ) );
|
||||||
|
subRound( E, A, B, C, D, f2, K2, expand( eData, 26 ) );
|
||||||
|
subRound( D, E, A, B, C, f2, K2, expand( eData, 27 ) );
|
||||||
|
subRound( C, D, E, A, B, f2, K2, expand( eData, 28 ) );
|
||||||
|
subRound( B, C, D, E, A, f2, K2, expand( eData, 29 ) );
|
||||||
|
subRound( A, B, C, D, E, f2, K2, expand( eData, 30 ) );
|
||||||
|
subRound( E, A, B, C, D, f2, K2, expand( eData, 31 ) );
|
||||||
|
subRound( D, E, A, B, C, f2, K2, expand( eData, 32 ) );
|
||||||
|
subRound( C, D, E, A, B, f2, K2, expand( eData, 33 ) );
|
||||||
|
subRound( B, C, D, E, A, f2, K2, expand( eData, 34 ) );
|
||||||
|
subRound( A, B, C, D, E, f2, K2, expand( eData, 35 ) );
|
||||||
|
subRound( E, A, B, C, D, f2, K2, expand( eData, 36 ) );
|
||||||
|
subRound( D, E, A, B, C, f2, K2, expand( eData, 37 ) );
|
||||||
|
subRound( C, D, E, A, B, f2, K2, expand( eData, 38 ) );
|
||||||
|
subRound( B, C, D, E, A, f2, K2, expand( eData, 39 ) );
|
||||||
|
|
||||||
|
subRound( A, B, C, D, E, f3, K3, expand( eData, 40 ) );
|
||||||
|
subRound( E, A, B, C, D, f3, K3, expand( eData, 41 ) );
|
||||||
|
subRound( D, E, A, B, C, f3, K3, expand( eData, 42 ) );
|
||||||
|
subRound( C, D, E, A, B, f3, K3, expand( eData, 43 ) );
|
||||||
|
subRound( B, C, D, E, A, f3, K3, expand( eData, 44 ) );
|
||||||
|
subRound( A, B, C, D, E, f3, K3, expand( eData, 45 ) );
|
||||||
|
subRound( E, A, B, C, D, f3, K3, expand( eData, 46 ) );
|
||||||
|
subRound( D, E, A, B, C, f3, K3, expand( eData, 47 ) );
|
||||||
|
subRound( C, D, E, A, B, f3, K3, expand( eData, 48 ) );
|
||||||
|
subRound( B, C, D, E, A, f3, K3, expand( eData, 49 ) );
|
||||||
|
subRound( A, B, C, D, E, f3, K3, expand( eData, 50 ) );
|
||||||
|
subRound( E, A, B, C, D, f3, K3, expand( eData, 51 ) );
|
||||||
|
subRound( D, E, A, B, C, f3, K3, expand( eData, 52 ) );
|
||||||
|
subRound( C, D, E, A, B, f3, K3, expand( eData, 53 ) );
|
||||||
|
subRound( B, C, D, E, A, f3, K3, expand( eData, 54 ) );
|
||||||
|
subRound( A, B, C, D, E, f3, K3, expand( eData, 55 ) );
|
||||||
|
subRound( E, A, B, C, D, f3, K3, expand( eData, 56 ) );
|
||||||
|
subRound( D, E, A, B, C, f3, K3, expand( eData, 57 ) );
|
||||||
|
subRound( C, D, E, A, B, f3, K3, expand( eData, 58 ) );
|
||||||
|
subRound( B, C, D, E, A, f3, K3, expand( eData, 59 ) );
|
||||||
|
|
||||||
|
subRound( A, B, C, D, E, f4, K4, expand( eData, 60 ) );
|
||||||
|
subRound( E, A, B, C, D, f4, K4, expand( eData, 61 ) );
|
||||||
|
subRound( D, E, A, B, C, f4, K4, expand( eData, 62 ) );
|
||||||
|
subRound( C, D, E, A, B, f4, K4, expand( eData, 63 ) );
|
||||||
|
subRound( B, C, D, E, A, f4, K4, expand( eData, 64 ) );
|
||||||
|
subRound( A, B, C, D, E, f4, K4, expand( eData, 65 ) );
|
||||||
|
subRound( E, A, B, C, D, f4, K4, expand( eData, 66 ) );
|
||||||
|
subRound( D, E, A, B, C, f4, K4, expand( eData, 67 ) );
|
||||||
|
subRound( C, D, E, A, B, f4, K4, expand( eData, 68 ) );
|
||||||
|
subRound( B, C, D, E, A, f4, K4, expand( eData, 69 ) );
|
||||||
|
subRound( A, B, C, D, E, f4, K4, expand( eData, 70 ) );
|
||||||
|
subRound( E, A, B, C, D, f4, K4, expand( eData, 71 ) );
|
||||||
|
subRound( D, E, A, B, C, f4, K4, expand( eData, 72 ) );
|
||||||
|
subRound( C, D, E, A, B, f4, K4, expand( eData, 73 ) );
|
||||||
|
subRound( B, C, D, E, A, f4, K4, expand( eData, 74 ) );
|
||||||
|
subRound( A, B, C, D, E, f4, K4, expand( eData, 75 ) );
|
||||||
|
subRound( E, A, B, C, D, f4, K4, expand( eData, 76 ) );
|
||||||
|
subRound( D, E, A, B, C, f4, K4, expand( eData, 77 ) );
|
||||||
|
subRound( C, D, E, A, B, f4, K4, expand( eData, 78 ) );
|
||||||
|
subRound( B, C, D, E, A, f4, K4, expand( eData, 79 ) );
|
||||||
|
|
||||||
|
/* Build message digest */
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
digest[ 0 ] = ( digest[ 0 ] + A ) & 0xFFFFFFFFUL;
|
||||||
|
digest[ 1 ] = ( digest[ 1 ] + B ) & 0xFFFFFFFFUL;
|
||||||
|
digest[ 2 ] = ( digest[ 2 ] + C ) & 0xFFFFFFFFUL;
|
||||||
|
digest[ 3 ] = ( digest[ 3 ] + D ) & 0xFFFFFFFFUL;
|
||||||
|
digest[ 4 ] = ( digest[ 4 ] + E ) & 0xFFFFFFFFUL;
|
||||||
|
#else
|
||||||
|
digest[ 0 ] += A;
|
||||||
|
digest[ 1 ] += B;
|
||||||
|
digest[ 2 ] += C;
|
||||||
|
digest[ 3 ] += D;
|
||||||
|
digest[ 4 ] += E;
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void SHSTransform( LONG *digest, LONG *data );
|
||||||
|
#endif /* !ASM_SHS */
|
||||||
|
|
||||||
|
#ifdef TEST_SHS
|
||||||
|
|
||||||
|
/* When run on a little-endian CPU we need to perform byte reversal on an
|
||||||
|
array of longwords. It is possible to make the code endianness-
|
||||||
|
independant by fiddling around with data at the byte level, but this
|
||||||
|
makes for very slow code, so we rely on the user to sort out endianness
|
||||||
|
at compile time */
|
||||||
|
|
||||||
|
#if defined( LITTLE_ENDIAN )
|
||||||
|
|
||||||
|
void longReverse( LONG *buffer, int byteCount )
|
||||||
|
{
|
||||||
|
LONG value;
|
||||||
|
|
||||||
|
byteCount /= sizeof( LONG );
|
||||||
|
while( byteCount-- )
|
||||||
|
{
|
||||||
|
value = *buffer;
|
||||||
|
value = ( ( value & 0xFF00FF00L ) >> 8 ) | \
|
||||||
|
( ( value & 0x00FF00FFL ) << 8 );
|
||||||
|
*buffer++ = ( value << 16 ) | ( value >> 16 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define longReverse(buf, count)
|
||||||
|
#endif /* LITTLE_ENDIAN */
|
||||||
|
|
||||||
|
#endif /* TEST_SHS */
|
||||||
|
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
|
||||||
|
/* When run on a CPU with > 32 bit word size, we need to move the data from
|
||||||
|
the byte-aligned buffer to the final word-aligned data buffer. We perform
|
||||||
|
the endianness-reversal at the same time */
|
||||||
|
|
||||||
|
static void extractData( SHS_INFO *shsInfo )
|
||||||
|
{
|
||||||
|
BYTE *bufferPtr = shsInfo->dataBuffer;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for( i = 0; i < 16; i++ )
|
||||||
|
{
|
||||||
|
shsInfo->data[ i ] = ( ( LONG ) bufferPtr[ 0 ] << 24 ) | \
|
||||||
|
( ( LONG ) bufferPtr[ 1 ] << 16 ) | \
|
||||||
|
( ( LONG ) bufferPtr[ 2 ] << 8 ) | \
|
||||||
|
( ( LONG ) bufferPtr[ 3 ] );
|
||||||
|
bufferPtr += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
|
||||||
|
/* Update SHS for a block of data */
|
||||||
|
|
||||||
|
void shsUpdate( SHS_INFO *shsInfo, BYTE *buffer, int count )
|
||||||
|
{
|
||||||
|
LONG tmp;
|
||||||
|
int dataCount;
|
||||||
|
|
||||||
|
/* Update bitcount */
|
||||||
|
tmp = shsInfo->countLo;
|
||||||
|
if ( ( shsInfo->countLo = tmp + ( ( LONG ) count << 3 ) ) < tmp )
|
||||||
|
shsInfo->countHi++; /* Carry from low to high */
|
||||||
|
shsInfo->countHi += count >> 29;
|
||||||
|
|
||||||
|
/* Get count of bytes already in data */
|
||||||
|
dataCount = ( int ) ( tmp >> 3 ) & 0x3F;
|
||||||
|
|
||||||
|
/* Handle any leading odd-sized chunks */
|
||||||
|
if( dataCount )
|
||||||
|
{
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
BYTE *p = shsInfo->dataBuffer + dataCount;
|
||||||
|
#else
|
||||||
|
BYTE *p = ( BYTE * ) shsInfo->data + dataCount;
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
|
||||||
|
dataCount = SHS_DATASIZE - dataCount;
|
||||||
|
if( count < dataCount )
|
||||||
|
{
|
||||||
|
memcpy( p, buffer, count );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
memcpy( p, buffer, dataCount );
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
extractData( shsInfo );
|
||||||
|
#else
|
||||||
|
longReverse( shsInfo->data, SHS_DATASIZE );
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
SHSTransform( shsInfo->digest, shsInfo->data );
|
||||||
|
buffer += dataCount;
|
||||||
|
count -= dataCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process data in SHS_DATASIZE chunks */
|
||||||
|
while( count >= SHS_DATASIZE )
|
||||||
|
{
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
memcpy( shsInfo->dataBuffer, buffer, SHS_DATASIZE );
|
||||||
|
extractData( shsInfo );
|
||||||
|
#else
|
||||||
|
memcpy( shsInfo->data, buffer, SHS_DATASIZE );
|
||||||
|
longReverse( shsInfo->data, SHS_DATASIZE );
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
SHSTransform( shsInfo->digest, shsInfo->data );
|
||||||
|
buffer += SHS_DATASIZE;
|
||||||
|
count -= SHS_DATASIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle any remaining bytes of data. */
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
memcpy( shsInfo->dataBuffer, buffer, count );
|
||||||
|
#else
|
||||||
|
memcpy( shsInfo->data, buffer, count );
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Final wrapup - pad to SHS_DATASIZE-byte boundary with the bit pattern
|
||||||
|
1 0* (64-bit count of bits processed, MSB-first) */
|
||||||
|
|
||||||
|
void shsFinal( SHS_INFO *shsInfo )
|
||||||
|
{
|
||||||
|
int count;
|
||||||
|
BYTE *dataPtr;
|
||||||
|
|
||||||
|
/* Compute number of bytes mod 64 */
|
||||||
|
count = ( int ) shsInfo->countLo;
|
||||||
|
count = ( count >> 3 ) & 0x3F;
|
||||||
|
|
||||||
|
/* Set the first char of padding to 0x80. This is safe since there is
|
||||||
|
always at least one byte free */
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
dataPtr = shsInfo->dataBuffer + count;
|
||||||
|
#else
|
||||||
|
dataPtr = ( BYTE * ) shsInfo->data + count;
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
*dataPtr++ = 0x80;
|
||||||
|
|
||||||
|
/* Bytes of padding needed to make 64 bytes */
|
||||||
|
count = SHS_DATASIZE - 1 - count;
|
||||||
|
|
||||||
|
/* Pad out to 56 mod 64 */
|
||||||
|
if( count < 8 )
|
||||||
|
{
|
||||||
|
/* Two lots of padding: Pad the first block to 64 bytes */
|
||||||
|
memset( dataPtr, 0, count );
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
extractData( shsInfo );
|
||||||
|
#else
|
||||||
|
longReverse( shsInfo->data, SHS_DATASIZE );
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
SHSTransform( shsInfo->digest, shsInfo->data );
|
||||||
|
|
||||||
|
/* Now fill the next block with 56 bytes */
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
memset( shsInfo->dataBuffer, 0, SHS_DATASIZE - 8 );
|
||||||
|
#else
|
||||||
|
memset( shsInfo->data, 0, SHS_DATASIZE - 8 );
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* Pad block to 56 bytes */
|
||||||
|
memset( dataPtr, 0, count - 8 );
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
extractData( shsInfo );
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
|
||||||
|
/* Append length in bits and transform */
|
||||||
|
shsInfo->data[ 14 ] = shsInfo->countHi;
|
||||||
|
shsInfo->data[ 15 ] = shsInfo->countLo;
|
||||||
|
|
||||||
|
#ifndef _BIG_WORDS
|
||||||
|
longReverse( shsInfo->data, SHS_DATASIZE - 8 );
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
SHSTransform( shsInfo->digest, shsInfo->data );
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* SHS Test Code *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef TEST_SHS
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
/* Defines for the standalone test version */
|
||||||
|
|
||||||
|
#define ERROR -1
|
||||||
|
#define OK 0
|
||||||
|
|
||||||
|
/* Test the SHS implementation */
|
||||||
|
|
||||||
|
#ifdef NEW_SHS
|
||||||
|
|
||||||
|
static LONG shsTestResults[][ 5 ] = {
|
||||||
|
{ 0xA9993E36L, 0x4706816AL, 0xBA3E2571L, 0x7850C26CL, 0x9CD0D89DL, },
|
||||||
|
{ 0x84983E44L, 0x1C3BD26EL, 0xBAAE4AA1L, 0xF95129E5L, 0xE54670F1L, },
|
||||||
|
{ 0x34AA973CL, 0xD4C4DAA4L, 0xF61EEB2BL, 0xDBAD2731L, 0x6534016FL, }
|
||||||
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static LONG shsTestResults[][ 5 ] = {
|
||||||
|
{ 0x0164B8A9L, 0x14CD2A5EL, 0x74C4F7FFL, 0x082C4D97L, 0xF1EDF880L },
|
||||||
|
{ 0xD2516EE1L, 0xACFA5BAFL, 0x33DFC1C4L, 0x71E43844L, 0x9EF134C8L },
|
||||||
|
{ 0x3232AFFAL, 0x48628A26L, 0x653B5AAAL, 0x44541FD9L, 0x0D690603L }
|
||||||
|
};
|
||||||
|
#endif /* NEW_SHS */
|
||||||
|
|
||||||
|
static int compareSHSresults( SHS_INFO *shsInfo, int shsTestLevel )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Compare the returned digest and required values */
|
||||||
|
for( i = 0; i < 5; i++ )
|
||||||
|
if( shsInfo->digest[ i ] != shsTestResults[ shsTestLevel ][ i ] )
|
||||||
|
return( ERROR );
|
||||||
|
return( OK );
|
||||||
|
}
|
||||||
|
|
||||||
|
void main( void )
|
||||||
|
{
|
||||||
|
SHS_INFO shsInfo;
|
||||||
|
unsigned int i;
|
||||||
|
time_t secondCount;
|
||||||
|
BYTE data[ 200 ];
|
||||||
|
|
||||||
|
/* Make sure we've got the endianness set right. If the machine is
|
||||||
|
big-endian (up to 64 bits) the following value will be signed,
|
||||||
|
otherwise it will be unsigned. Unfortunately we can't test for odd
|
||||||
|
things like middle-endianness without knowing the size of the data
|
||||||
|
types */
|
||||||
|
#ifdef LITTLE_ENDIAN
|
||||||
|
if( *( long * ) "\x80\x00\x00\x00\x00\x00\x00\x00" < 0 )
|
||||||
|
{
|
||||||
|
puts( "Error: Comment out the LITTLE_ENDIAN define in SHS.H and recompile" );
|
||||||
|
exit( ERROR );
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if( *( long * ) "\x80\x00\x00\x00\x00\x00\x00\x00" >= 0 )
|
||||||
|
{
|
||||||
|
puts( "Error: Uncomment the LITTLE_ENDIAN define in SHS.H and recompile" );
|
||||||
|
exit( ERROR );
|
||||||
|
}
|
||||||
|
#endif /* LITTLE_ENDIAN */
|
||||||
|
|
||||||
|
/* Test SHS against values given in SHS standards document */
|
||||||
|
printf( "Running SHS test 1 ... " );
|
||||||
|
shsInit( &shsInfo );
|
||||||
|
shsUpdate( &shsInfo, ( BYTE * ) "abc", 3 );
|
||||||
|
shsFinal( &shsInfo );
|
||||||
|
if( compareSHSresults( &shsInfo, 0 ) == ERROR )
|
||||||
|
{
|
||||||
|
putchar( '\n' );
|
||||||
|
puts( "SHS test 1 failed" );
|
||||||
|
exit( ERROR );
|
||||||
|
}
|
||||||
|
#ifdef NEW_SHS
|
||||||
|
puts( "passed, result= A9993E364706816ABA3E25717850C26C9CD0D89D" );
|
||||||
|
#else
|
||||||
|
puts( "passed, result= 0164B8A914CD2A5E74C4F7FF082C4D97F1EDF880" );
|
||||||
|
#endif /* NEW_SHS */
|
||||||
|
|
||||||
|
printf( "Running SHS test 2 ... " );
|
||||||
|
shsInit( &shsInfo );
|
||||||
|
shsUpdate( &shsInfo, ( BYTE * ) "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56 );
|
||||||
|
shsFinal( &shsInfo );
|
||||||
|
if( compareSHSresults( &shsInfo, 1 ) == ERROR )
|
||||||
|
{
|
||||||
|
putchar( '\n' );
|
||||||
|
puts( "SHS test 2 failed" );
|
||||||
|
exit( ERROR );
|
||||||
|
}
|
||||||
|
#ifdef NEW_SHS
|
||||||
|
puts( "passed, result= 84983E441C3BD26EBAAE4AA1F95129E5E54670F1" );
|
||||||
|
#else
|
||||||
|
puts( "passed, result= D2516EE1ACFA5BAF33DFC1C471E438449EF134C8" );
|
||||||
|
#endif /* NEW_SHS */
|
||||||
|
|
||||||
|
printf( "Running SHS test 3 ... " );
|
||||||
|
shsInit( &shsInfo );
|
||||||
|
for( i = 0; i < 15625; i++ )
|
||||||
|
shsUpdate( &shsInfo, ( BYTE * ) "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 64 );
|
||||||
|
shsFinal( &shsInfo );
|
||||||
|
if( compareSHSresults( &shsInfo, 2 ) == ERROR )
|
||||||
|
{
|
||||||
|
putchar( '\n' );
|
||||||
|
puts( "SHS test 3 failed" );
|
||||||
|
exit( ERROR );
|
||||||
|
}
|
||||||
|
#ifdef NEW_SHS
|
||||||
|
puts( "passed, result= 34AA973CD4C4DAA4F61EEB2BDBAD27316534016F" );
|
||||||
|
#else
|
||||||
|
puts( "passed, result= 3232AFFA48628A26653B5AAA44541FD90D690603" );
|
||||||
|
#endif /* NEW_SHS */
|
||||||
|
|
||||||
|
printf( "\nTesting speed for 10MB data... " );
|
||||||
|
shsInit( &shsInfo );
|
||||||
|
secondCount = time( NULL );
|
||||||
|
for( i = 0; i < 50000U; i++ )
|
||||||
|
shsUpdate( &shsInfo, data, 200 );
|
||||||
|
secondCount = time( NULL ) - secondCount;
|
||||||
|
printf( "done. Time = %ld seconds, %ld kbytes/second\n", \
|
||||||
|
secondCount, 10050L / secondCount );
|
||||||
|
|
||||||
|
puts( "\nAll SHS tests passed" );
|
||||||
|
exit( OK );
|
||||||
|
}
|
||||||
|
#endif /* TEST_SHS */
|
||||||
Vendored
+35
@@ -0,0 +1,35 @@
|
|||||||
|
#ifndef _SHS_DEFINED
|
||||||
|
|
||||||
|
#define _SHS_DEFINED
|
||||||
|
|
||||||
|
/* Define the following to compile the SHS test code */
|
||||||
|
|
||||||
|
/*#define TEST_SHS*/
|
||||||
|
|
||||||
|
/* Define the following to use the updated SHS implementation */
|
||||||
|
|
||||||
|
/*#define NEW_SHS*/
|
||||||
|
|
||||||
|
/* The SHS block size and message digest sizes, in bytes */
|
||||||
|
|
||||||
|
#define SHS_DATASIZE 64
|
||||||
|
#define SHS_DIGESTSIZE 20
|
||||||
|
|
||||||
|
/* The structure for storing SHS info */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
LONG digest[ 5 ]; /* Message digest */
|
||||||
|
LONG countLo, countHi; /* 64-bit bit count */
|
||||||
|
LONG data[ 16 ]; /* SHS data buffer */
|
||||||
|
#ifdef _BIG_WORDS
|
||||||
|
BYTE dataBuffer[ SHS_DATASIZE ]; /* Byte buffer for data */
|
||||||
|
#endif /* _BIG_WORDS */
|
||||||
|
} SHS_INFO;
|
||||||
|
|
||||||
|
/* Message digest functions */
|
||||||
|
|
||||||
|
void shsInit( SHS_INFO *shsInfo );
|
||||||
|
void shsUpdate( SHS_INFO *shsInfo, BYTE *buffer, int count );
|
||||||
|
void shsFinal( SHS_INFO *shsInfo );
|
||||||
|
|
||||||
|
#endif /* _SHS_DEFINED */
|
||||||
+137
@@ -0,0 +1,137 @@
|
|||||||
|
; Simple RC4 implementation, Peter Gutmann, 21 September 1995.
|
||||||
|
; This code was written in about 30 minutes as a testbed for an asm.RC4. It
|
||||||
|
; uses a static data area as the key so it's not terribly practical as it
|
||||||
|
; stands. In addition, the RC4 algorithm leads to an almost solid block of
|
||||||
|
; pipeline stalls on anything >= '486, so I wouldn't recommend using it on
|
||||||
|
; anything except perhaps 8-bit microcontrollers and smart cards.
|
||||||
|
|
||||||
|
INCLUDE MISC.INC
|
||||||
|
MODULE RC4
|
||||||
|
|
||||||
|
PUBLIC _rc4expandKey, _rc4crypt
|
||||||
|
|
||||||
|
DATA
|
||||||
|
|
||||||
|
; The RC4 keying information
|
||||||
|
|
||||||
|
rc4key DB 256 DUP (?)
|
||||||
|
rc4x DB 0
|
||||||
|
rc4y DB 0
|
||||||
|
|
||||||
|
CODE
|
||||||
|
|
||||||
|
; void rc4ExpandKey( unsigned char const *key, int keylen )
|
||||||
|
|
||||||
|
_rc4expandKey PROCEDURE
|
||||||
|
push bp
|
||||||
|
mov bp, sp
|
||||||
|
push si
|
||||||
|
push di ; Save register vars
|
||||||
|
les si, [bp+4] ; ES:SI = key
|
||||||
|
mov dx, [bp+8] ; DX = keylen
|
||||||
|
mov dh, dl ; keylenTmp = keylen
|
||||||
|
|
||||||
|
; rc4word y = 0;
|
||||||
|
xor ax, ax ; y = 0
|
||||||
|
sub di, di ; DI = AX as an index register
|
||||||
|
|
||||||
|
; for( x = 0; x < 256; x++ )
|
||||||
|
; rc4key[ x ] = x;
|
||||||
|
xor bx, bx ; x = 0
|
||||||
|
@@initLoop:
|
||||||
|
mov rc4key[bx], bl ; rc4key[ x ] = x
|
||||||
|
inc bl ; x++
|
||||||
|
jnz SHORT @@initLoop
|
||||||
|
|
||||||
|
; for( x = 0; x < 256; x++ )
|
||||||
|
; {
|
||||||
|
; sx = rc4key[ x ];
|
||||||
|
; y += sx + key[ keypos ];
|
||||||
|
; rc4key[ x ] = rc4key[ y ];
|
||||||
|
; rc4key[ y ] = sx;
|
||||||
|
;
|
||||||
|
; if( ++keypos == keylen )
|
||||||
|
; keypos = 0;
|
||||||
|
; }
|
||||||
|
@@keyLoop:
|
||||||
|
mov cl, rc4key[bx] ; sx = rc4key[ x ]
|
||||||
|
add al, es:[si] ; y += key[ keypos ]
|
||||||
|
add al, cl ; y += sx
|
||||||
|
mov di, ax
|
||||||
|
mov ch, rc4key[di] ; temp = rc4key[ y ]
|
||||||
|
mov rc4key[bx], ch ; rc4key[ x ] = temp
|
||||||
|
mov rc4key[di], cl ; rc4key[ y ] = sx
|
||||||
|
inc si ; ++keypos
|
||||||
|
dec dh ; keylenTmp--
|
||||||
|
jnz SHORT @@noResetKeypos ; if( !keylenTmp )
|
||||||
|
sub si, dx ; keypos = 0
|
||||||
|
mov dh, dl ; keylenTmp = keylen
|
||||||
|
@@noResetKeypos:
|
||||||
|
inc bl ; x++
|
||||||
|
jnz SHORT @@keyLoop
|
||||||
|
|
||||||
|
; rc4->x = rc4->y = 0;
|
||||||
|
mov rc4x, bl ; rc4->x = 0
|
||||||
|
mov rc4y, bl ; rc4->y = 0
|
||||||
|
|
||||||
|
pop di
|
||||||
|
pop si ; Restore register vars
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
_rc4expandKey ENDP
|
||||||
|
|
||||||
|
; void rc4Crypt( unsigned char *data, int len )
|
||||||
|
|
||||||
|
_rc4crypt PROCEDURE
|
||||||
|
push bp
|
||||||
|
mov bp, sp
|
||||||
|
push si
|
||||||
|
push di ; Save register vars
|
||||||
|
les si, [bp+4] ; ES:SI = data
|
||||||
|
mov dx, [bp+8] ; DX = len
|
||||||
|
test dx, dx ; Check that len != 0
|
||||||
|
jz SHORT @@exit ; Yes, exit now
|
||||||
|
|
||||||
|
xor bx, bx
|
||||||
|
mov bl, rc4x ; BX = rc4x
|
||||||
|
xor ax, ax
|
||||||
|
mov al, rc4y ; AX = rc4y
|
||||||
|
xor di, di ; DI = AX as an index register
|
||||||
|
|
||||||
|
; while( len-- )
|
||||||
|
; {
|
||||||
|
; x++;
|
||||||
|
; sx = rc4key[ x ];
|
||||||
|
; y += sx;
|
||||||
|
; sy = rc4key[ y ];
|
||||||
|
; rc4key[ y ] = sx;
|
||||||
|
; rc4key[ x ] = sy;
|
||||||
|
; *data++ ^= rc4key[ ( sx + sy ) & 0xFF ];
|
||||||
|
; }
|
||||||
|
@@rc4loop:
|
||||||
|
inc bl ; x++
|
||||||
|
mov cl, rc4key[bx] ; sx = rc4key[ x ]
|
||||||
|
add al, cl ; y += sx
|
||||||
|
mov di, ax
|
||||||
|
mov ch, rc4key[di] ; sy = rc4key[ y ]
|
||||||
|
mov rc4key[di], cl ; rc4key[ y ] = sx
|
||||||
|
mov rc4key[bx], ch ; rc4key[ x ] = sy
|
||||||
|
add cl, ch
|
||||||
|
xor ch, ch
|
||||||
|
mov di, cx ; temp = ( sx + sy ) & 0xFF
|
||||||
|
mov cl, rc4key[di]
|
||||||
|
xor es:[si], cl ; *data ^= rc4key[ temp ]
|
||||||
|
inc si ; data++
|
||||||
|
dec dx ; len--
|
||||||
|
jnz SHORT @@rc4loop
|
||||||
|
|
||||||
|
mov rc4x, bl
|
||||||
|
mov rc4y, al ; Remember x and y values
|
||||||
|
|
||||||
|
@@exit:
|
||||||
|
pop di
|
||||||
|
pop si ; Restore register vars
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
_rc4crypt ENDP
|
||||||
|
ENDMODULE
|
||||||
Vendored
+65
@@ -0,0 +1,65 @@
|
|||||||
|
/* Optimized RC4 code, from an unknown source ("and they knew not from whence
|
||||||
|
it had come...") */
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include "rc4.h"
|
||||||
|
#else
|
||||||
|
#include "rc4/rc4.h"
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
void rc4ExpandKey( RC4KEY *rc4, unsigned char const *key, int keylen )
|
||||||
|
{
|
||||||
|
int x, keypos = 0;
|
||||||
|
rc4word sx, y = 0;
|
||||||
|
rc4word *state = &rc4->state[ 0 ];
|
||||||
|
|
||||||
|
rc4->x = rc4->y = 0;
|
||||||
|
|
||||||
|
for( x = 0; x < 256; x++ )
|
||||||
|
state[ x ] = x;
|
||||||
|
|
||||||
|
for( x = 0; x < 256; x++ )
|
||||||
|
{
|
||||||
|
sx = state[ x ];
|
||||||
|
y += sx + key[ keypos ];
|
||||||
|
#ifdef USE_LONG_RC4
|
||||||
|
y &= 0xFF;
|
||||||
|
#endif /* USE_LONG_RC4 */
|
||||||
|
state[ x ] = state[ y ];
|
||||||
|
state[ y ] = sx;
|
||||||
|
|
||||||
|
if( ++keypos == keylen )
|
||||||
|
keypos = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void rc4Crypt( RC4KEY *rc4, unsigned char *data, int len )
|
||||||
|
{
|
||||||
|
rc4word x = rc4->x, y = rc4->y;
|
||||||
|
rc4word sx, sy;
|
||||||
|
rc4word *state = &rc4->state[ 0 ];
|
||||||
|
|
||||||
|
while (len--) {
|
||||||
|
x++;
|
||||||
|
#ifdef USE_LONG_RC4
|
||||||
|
x &= 0xFF;
|
||||||
|
#endif /* USE_LONG_RC4 */
|
||||||
|
sx = state[ x ];
|
||||||
|
y += sx;
|
||||||
|
#ifdef USE_LONG_RC4
|
||||||
|
y &= 0xFF;
|
||||||
|
#endif /* USE_LONG_RC4 */
|
||||||
|
sy = state[ y ];
|
||||||
|
state[ y ] = sx;
|
||||||
|
state[ x ] = sy;
|
||||||
|
|
||||||
|
#ifdef USE_LONG_RC4
|
||||||
|
*data++ ^= state[ ( unsigned char ) ( sx+sy ) ];
|
||||||
|
#else
|
||||||
|
*data++ ^= state[ ( sx+sy ) & 0xFF ];
|
||||||
|
#endif /* USE_LONG_RC4 */
|
||||||
|
}
|
||||||
|
|
||||||
|
rc4->x = x;
|
||||||
|
rc4->y = y;
|
||||||
|
}
|
||||||
Vendored
+23
@@ -0,0 +1,23 @@
|
|||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
/* If the system can handle byte ops, we use those so we don't have to do a
|
||||||
|
lot of masking. Otherwise, we use machine-word-size ops which will be
|
||||||
|
faster on RISC machines */
|
||||||
|
|
||||||
|
#if UINT_MAX > 0xFFFFL /* System has 32-bit ints */
|
||||||
|
#define USE_LONG_RC4
|
||||||
|
|
||||||
|
typedef unsigned int rc4word;
|
||||||
|
#else
|
||||||
|
typedef unsigned char rc4word;
|
||||||
|
#endif /* UINT_MAX > 0xFFFFL */
|
||||||
|
|
||||||
|
/* The scheduled RC4 key */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
rc4word state[ 256 ];
|
||||||
|
rc4word x, y;
|
||||||
|
} RC4KEY ;
|
||||||
|
|
||||||
|
void rc4ExpandKey( RC4KEY *rc4, unsigned char const *key, int keylen );
|
||||||
|
void rc4Crypt( RC4KEY *rc4, unsigned char *data, int len );
|
||||||
+203
@@ -0,0 +1,203 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
*
|
||||||
|
* FILE: safer.c
|
||||||
|
*
|
||||||
|
* DESCRIPTION: block-cipher algorithm SAFER (Secure And Fast Encryption
|
||||||
|
* Routine) in its four versions: SAFER K-64, SAFER K-128,
|
||||||
|
* SAFER SK-64 and SAFER SK-128.
|
||||||
|
*
|
||||||
|
* AUTHOR: Richard De Moliner (demoliner@isi.ee.ethz.ch)
|
||||||
|
* Signal and Information Processing Laboratory
|
||||||
|
* Swiss Federal Institute of Technology
|
||||||
|
* CH-8092 Zuerich, Switzerland
|
||||||
|
*
|
||||||
|
* DATE: September 9, 1995
|
||||||
|
*
|
||||||
|
* CHANGE HISTORY:
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
/******************* External Headers *****************************************/
|
||||||
|
|
||||||
|
/******************* Local Headers ********************************************/
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include "safer.h"
|
||||||
|
#else
|
||||||
|
#include "safer/safer.h"
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
/******************* Constants ************************************************/
|
||||||
|
#define TAB_LEN 256
|
||||||
|
|
||||||
|
/******************* Assertions ***********************************************/
|
||||||
|
|
||||||
|
/******************* Macros ***************************************************/
|
||||||
|
#define ROL(x, n) ((unsigned char)(((unsigned int)(x) << (n))\
|
||||||
|
|((unsigned int)((x) & 0xFF) >> (8 - (n)))))
|
||||||
|
#define EXP(x) exp_tab[(x) & 0xFF]
|
||||||
|
#define LOG(x) log_tab[(x) & 0xFF]
|
||||||
|
#define PHT(x, y) { y += x; x += y; }
|
||||||
|
#define IPHT(x, y) { x -= y; y -= x; }
|
||||||
|
|
||||||
|
/******************* Types ****************************************************/
|
||||||
|
static unsigned char exp_tab[TAB_LEN];
|
||||||
|
static unsigned char log_tab[TAB_LEN];
|
||||||
|
|
||||||
|
/******************* Module Data **********************************************/
|
||||||
|
static int init_called = 0;
|
||||||
|
/******************* Functions ************************************************/
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#ifndef NOT_ANSI_C
|
||||||
|
void Safer_Init_Module(void)
|
||||||
|
#else
|
||||||
|
Safer_Init_Module()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{ unsigned int i, exp;
|
||||||
|
|
||||||
|
if (init_called) return;
|
||||||
|
|
||||||
|
exp = 1;
|
||||||
|
for (i = 0; i < TAB_LEN; i++)
|
||||||
|
{
|
||||||
|
exp_tab[i] = (unsigned char)(exp & 0xFF);
|
||||||
|
log_tab[exp_tab[i]] = (unsigned char)i;
|
||||||
|
exp = exp * 45 % 257;
|
||||||
|
}
|
||||||
|
|
||||||
|
init_called = 1;
|
||||||
|
} /* Safer_Init_Module */
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#ifndef NOT_ANSI_C
|
||||||
|
void Safer_Expand_Userkey(safer_block_t userkey_1,
|
||||||
|
safer_block_t userkey_2,
|
||||||
|
unsigned int nof_rounds,
|
||||||
|
int strengthened,
|
||||||
|
safer_key_t key)
|
||||||
|
#else
|
||||||
|
Safer_Expand_Userkey(userkey_1, userkey_2, nof_rounds, strengthened, key)
|
||||||
|
safer_block_t userkey_1;
|
||||||
|
safer_block_t userkey_2;
|
||||||
|
unsigned int nof_rounds;
|
||||||
|
int strengthened;
|
||||||
|
safer_key_t key;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{ unsigned int i, j;
|
||||||
|
unsigned char ka[SAFER_BLOCK_LEN + 1];
|
||||||
|
unsigned char kb[SAFER_BLOCK_LEN + 1];
|
||||||
|
|
||||||
|
if (SAFER_MAX_NOF_ROUNDS < nof_rounds)
|
||||||
|
nof_rounds = SAFER_MAX_NOF_ROUNDS;
|
||||||
|
*key++ = (unsigned char)nof_rounds;
|
||||||
|
ka[SAFER_BLOCK_LEN] = 0;
|
||||||
|
kb[SAFER_BLOCK_LEN] = 0;
|
||||||
|
for (j = 0; j < SAFER_BLOCK_LEN; j++)
|
||||||
|
{
|
||||||
|
ka[SAFER_BLOCK_LEN] ^= ka[j] = ROL(userkey_1[j], 5);
|
||||||
|
kb[SAFER_BLOCK_LEN] ^= kb[j] = *key++ = userkey_2[j];
|
||||||
|
}
|
||||||
|
for (i = 1; i <= nof_rounds; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < SAFER_BLOCK_LEN + 1; j++)
|
||||||
|
{
|
||||||
|
ka[j] = ROL(ka[j], 6);
|
||||||
|
kb[j] = ROL(kb[j], 6);
|
||||||
|
}
|
||||||
|
for (j = 0; j < SAFER_BLOCK_LEN; j++)
|
||||||
|
if (strengthened)
|
||||||
|
*key++ = (ka[(j + 2 * i - 1) % (SAFER_BLOCK_LEN + 1)]
|
||||||
|
+ exp_tab[exp_tab[18 * i + j + 1]]) & 0xFF;
|
||||||
|
else
|
||||||
|
*key++ = (ka[j] + exp_tab[exp_tab[18 * i + j + 1]]) & 0xFF;
|
||||||
|
for (j = 0; j < SAFER_BLOCK_LEN; j++)
|
||||||
|
if (strengthened)
|
||||||
|
*key++ = (kb[(j + 2 * i) % (SAFER_BLOCK_LEN + 1)]
|
||||||
|
+ exp_tab[exp_tab[18 * i + j + 10]]) & 0xFF;
|
||||||
|
else
|
||||||
|
*key++ = (kb[j] + exp_tab[exp_tab[18 * i + j + 10]]) & 0xFF;
|
||||||
|
}
|
||||||
|
for (j = 0; j < SAFER_BLOCK_LEN + 1; j++)
|
||||||
|
ka[j] = kb[j] = 0;
|
||||||
|
} /* Safer_Expand_Userkey */
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#ifndef NOT_ANSI_C
|
||||||
|
void Safer_Encrypt_Block(safer_block_t block_in, safer_key_t key,
|
||||||
|
safer_block_t block_out)
|
||||||
|
#else
|
||||||
|
Safer_Encrypt_Block(block_in, key, block_out)
|
||||||
|
safer_block_t block_in;
|
||||||
|
safer_key_t key;
|
||||||
|
safer_block_t block_out;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{ unsigned char a, b, c, d, e, f, g, h, t;
|
||||||
|
unsigned int round;
|
||||||
|
|
||||||
|
a = block_in[0]; b = block_in[1]; c = block_in[2]; d = block_in[3];
|
||||||
|
e = block_in[4]; f = block_in[5]; g = block_in[6]; h = block_in[7];
|
||||||
|
if (SAFER_MAX_NOF_ROUNDS < (round = *key)) round = SAFER_MAX_NOF_ROUNDS;
|
||||||
|
while(round--)
|
||||||
|
{
|
||||||
|
a ^= *++key; b += *++key; c += *++key; d ^= *++key;
|
||||||
|
e ^= *++key; f += *++key; g += *++key; h ^= *++key;
|
||||||
|
a = EXP(a) + *++key; b = LOG(b) ^ *++key;
|
||||||
|
c = LOG(c) ^ *++key; d = EXP(d) + *++key;
|
||||||
|
e = EXP(e) + *++key; f = LOG(f) ^ *++key;
|
||||||
|
g = LOG(g) ^ *++key; h = EXP(h) + *++key;
|
||||||
|
PHT(a, b); PHT(c, d); PHT(e, f); PHT(g, h);
|
||||||
|
PHT(a, c); PHT(e, g); PHT(b, d); PHT(f, h);
|
||||||
|
PHT(a, e); PHT(b, f); PHT(c, g); PHT(d, h);
|
||||||
|
t = b; b = e; e = c; c = t; t = d; d = f; f = g; g = t;
|
||||||
|
}
|
||||||
|
a ^= *++key; b += *++key; c += *++key; d ^= *++key;
|
||||||
|
e ^= *++key; f += *++key; g += *++key; h ^= *++key;
|
||||||
|
block_out[0] = a & 0xFF; block_out[1] = b & 0xFF;
|
||||||
|
block_out[2] = c & 0xFF; block_out[3] = d & 0xFF;
|
||||||
|
block_out[4] = e & 0xFF; block_out[5] = f & 0xFF;
|
||||||
|
block_out[6] = g & 0xFF; block_out[7] = h & 0xFF;
|
||||||
|
} /* Safer_Encrypt_Block */
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#ifndef NOT_ANSI_C
|
||||||
|
void Safer_Decrypt_Block(safer_block_t block_in, safer_key_t key,
|
||||||
|
safer_block_t block_out)
|
||||||
|
#else
|
||||||
|
Safer_Decrypt_Block(block_in, key, block_out)
|
||||||
|
safer_block_t block_in;
|
||||||
|
safer_key_t key;
|
||||||
|
safer_block_t block_out;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{ unsigned char a, b, c, d, e, f, g, h, t;
|
||||||
|
unsigned int round;
|
||||||
|
|
||||||
|
a = block_in[0]; b = block_in[1]; c = block_in[2]; d = block_in[3];
|
||||||
|
e = block_in[4]; f = block_in[5]; g = block_in[6]; h = block_in[7];
|
||||||
|
if (SAFER_MAX_NOF_ROUNDS < (round = *key)) round = SAFER_MAX_NOF_ROUNDS;
|
||||||
|
key += SAFER_BLOCK_LEN * (1 + 2 * round);
|
||||||
|
h ^= *key; g -= *--key; f -= *--key; e ^= *--key;
|
||||||
|
d ^= *--key; c -= *--key; b -= *--key; a ^= *--key;
|
||||||
|
while (round--)
|
||||||
|
{
|
||||||
|
t = e; e = b; b = c; c = t; t = f; f = d; d = g; g = t;
|
||||||
|
IPHT(a, e); IPHT(b, f); IPHT(c, g); IPHT(d, h);
|
||||||
|
IPHT(a, c); IPHT(e, g); IPHT(b, d); IPHT(f, h);
|
||||||
|
IPHT(a, b); IPHT(c, d); IPHT(e, f); IPHT(g, h);
|
||||||
|
h -= *--key; g ^= *--key; f ^= *--key; e -= *--key;
|
||||||
|
d -= *--key; c ^= *--key; b ^= *--key; a -= *--key;
|
||||||
|
h = LOG(h) ^ *--key; g = EXP(g) - *--key;
|
||||||
|
f = EXP(f) - *--key; e = LOG(e) ^ *--key;
|
||||||
|
d = LOG(d) ^ *--key; c = EXP(c) - *--key;
|
||||||
|
b = EXP(b) - *--key; a = LOG(a) ^ *--key;
|
||||||
|
}
|
||||||
|
block_out[0] = a & 0xFF; block_out[1] = b & 0xFF;
|
||||||
|
block_out[2] = c & 0xFF; block_out[3] = d & 0xFF;
|
||||||
|
block_out[4] = e & 0xFF; block_out[5] = f & 0xFF;
|
||||||
|
block_out[6] = g & 0xFF; block_out[7] = h & 0xFF;
|
||||||
|
} /* Safer_Decrypt_Block */
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
+114
@@ -0,0 +1,114 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
*
|
||||||
|
* FILE: safer.h
|
||||||
|
*
|
||||||
|
* DESCRIPTION: block-cipher algorithm SAFER (Secure And Fast Encryption
|
||||||
|
* Routine) in its four versions: SAFER K-64, SAFER K-128,
|
||||||
|
* SAFER SK-64 and SAFER SK-128.
|
||||||
|
*
|
||||||
|
* AUTHOR: Richard De Moliner (demoliner@isi.ee.ethz.ch)
|
||||||
|
* Signal and Information Processing Laboratory
|
||||||
|
* Swiss Federal Institute of Technology
|
||||||
|
* CH-8092 Zuerich, Switzerland
|
||||||
|
*
|
||||||
|
* DATE: September 9, 1995
|
||||||
|
*
|
||||||
|
* CHANGE HISTORY:
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
#ifndef SAFER_H
|
||||||
|
#define SAFER_H
|
||||||
|
|
||||||
|
/******************* External Headers *****************************************/
|
||||||
|
|
||||||
|
/******************* Local Headers ********************************************/
|
||||||
|
|
||||||
|
/******************* Constants ************************************************/
|
||||||
|
#define SAFER_K64_DEFAULT_NOF_ROUNDS 6
|
||||||
|
#define SAFER_K128_DEFAULT_NOF_ROUNDS 10
|
||||||
|
#define SAFER_SK64_DEFAULT_NOF_ROUNDS 8
|
||||||
|
#define SAFER_SK128_DEFAULT_NOF_ROUNDS 10
|
||||||
|
#define SAFER_MAX_NOF_ROUNDS 13
|
||||||
|
#define SAFER_BLOCK_LEN 8
|
||||||
|
#define SAFER_KEY_LEN (1 + SAFER_BLOCK_LEN * (1 + 2 * SAFER_MAX_NOF_ROUNDS))
|
||||||
|
|
||||||
|
/******************* Assertions ***********************************************/
|
||||||
|
|
||||||
|
/******************* Macros ***************************************************/
|
||||||
|
|
||||||
|
/******************* Types ****************************************************/
|
||||||
|
typedef unsigned char safer_block_t[SAFER_BLOCK_LEN];
|
||||||
|
typedef unsigned char safer_key_t[SAFER_KEY_LEN];
|
||||||
|
|
||||||
|
/******************* Module Data **********************************************/
|
||||||
|
|
||||||
|
/******************* Prototypes ***********************************************/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* void Safer_Init_Module(void)
|
||||||
|
*
|
||||||
|
* initializes this module.
|
||||||
|
*
|
||||||
|
********************************************************************************
|
||||||
|
* void Safer_Expand_Userkey(safer_block_t userkey_1,
|
||||||
|
* safer_block_t userkey_2,
|
||||||
|
* unsigned int nof_rounds,
|
||||||
|
* int strengthened,
|
||||||
|
* safer_key_t key)
|
||||||
|
*
|
||||||
|
* expands a user-selected key of length 64 bits or 128 bits to a encryption /
|
||||||
|
* decryption key. If your user-selected key is of length 64 bits, then give
|
||||||
|
* this key to both arguments 'userkey_1' and 'userkey_2', e.g.
|
||||||
|
* 'Safer_Expand_Userkey(z, z, key)'. Note: SAFER K-64 and SAFER SK-64 with a
|
||||||
|
* user-selected key 'z' of length 64 bits are identical to SAFER K-128 and
|
||||||
|
* SAFER SK-128 with a user-selected key 'z z' of length 128 bits,
|
||||||
|
* respectively.
|
||||||
|
* pre: 'userkey_1' contains the first 64 bits of user key.
|
||||||
|
* 'userkey_2' contains the second 64 bits of user key.
|
||||||
|
* 'nof_rounds' contains the number of encryption rounds
|
||||||
|
* 'nof_rounds' <= 'SAFER_MAX_NOF_ROUNDS'
|
||||||
|
* 'strengthened' is non-zero if the strengthened key schedule should be
|
||||||
|
* used and zero if the original key schedule should be
|
||||||
|
* used.
|
||||||
|
* post: 'key' contains the expanded key.
|
||||||
|
*
|
||||||
|
********************************************************************************
|
||||||
|
* void Safer_Encrypt_Block(safer_block_t block_in, safer_key_t key,
|
||||||
|
* safer_block_t block_out)
|
||||||
|
*
|
||||||
|
* encryption algorithm.
|
||||||
|
* pre: 'block_in' contains the plain-text block.
|
||||||
|
* 'key' contains the expanded key.
|
||||||
|
* post: 'block_out' contains the cipher-text block.
|
||||||
|
*
|
||||||
|
********************************************************************************
|
||||||
|
* void Safer_Decrypt_Block(safer_block_t block_in, safer_key_t key,
|
||||||
|
* safer_block_t block_out)
|
||||||
|
*
|
||||||
|
* decryption algorithm.
|
||||||
|
* pre: 'block_in' contains the cipher-text block.
|
||||||
|
* 'key' contains the expanded key.
|
||||||
|
* post: 'block_out' contains the plain-text block.
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef NOT_ANSI_C
|
||||||
|
extern void Safer_Init_Module(void);
|
||||||
|
extern void Safer_Expand_Userkey(safer_block_t userkey_1,
|
||||||
|
safer_block_t userkey_2,
|
||||||
|
unsigned int nof_rounds,
|
||||||
|
int strengthened,
|
||||||
|
safer_key_t key);
|
||||||
|
extern void Safer_Encrypt_Block (safer_block_t block_in, safer_key_t key,
|
||||||
|
safer_block_t block_out);
|
||||||
|
extern void Safer_Decrypt_Block (safer_block_t block_in, safer_key_t key,
|
||||||
|
safer_block_t block_out);
|
||||||
|
#else
|
||||||
|
Safer_Init_Module();
|
||||||
|
Safer_Expand_Userkey();
|
||||||
|
Safer_Encrypt_Block();
|
||||||
|
Safer_Decrypt_Block();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#endif /* SAFER_H */
|
||||||
Vendored
+519
@@ -0,0 +1,519 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "crypt.h"
|
||||||
|
|
||||||
|
/* The size of the test buffers */
|
||||||
|
|
||||||
|
#define TESTBUFFER_SIZE 256
|
||||||
|
|
||||||
|
/* Work routines: Set a pair of encrypt/decrypt buffers to a known state,
|
||||||
|
and make sure they're still in that known state */
|
||||||
|
|
||||||
|
static void initTestBuffers( BYTE *buffer1, BYTE *buffer2 )
|
||||||
|
{
|
||||||
|
/* Set the buffers to a known state */
|
||||||
|
memset( buffer1, '*', TESTBUFFER_SIZE );
|
||||||
|
memcpy( buffer1, "12345678", 8 ); /* For endianness check */
|
||||||
|
memcpy( buffer2, buffer1, TESTBUFFER_SIZE );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void checkTestBuffers( BYTE *buffer1, BYTE *buffer2 )
|
||||||
|
{
|
||||||
|
/* Make sure everything went OK */
|
||||||
|
if( memcmp( buffer1, buffer2, TESTBUFFER_SIZE ) )
|
||||||
|
{
|
||||||
|
puts( "Warning: Decrypted data != original plaintext." );
|
||||||
|
|
||||||
|
/* Try and guess at block chaining problems */
|
||||||
|
if( !memcmp( buffer1, "12345678****", 12 ) )
|
||||||
|
puts( "\t It looks like there's a problem with block chaining." );
|
||||||
|
else
|
||||||
|
/* Try and guess at endianness problems - we want "1234" */
|
||||||
|
if( !memcmp( buffer1, "4321", 4 ) )
|
||||||
|
puts( "\t It looks like the 32-bit word endianness is "
|
||||||
|
"reversed." );
|
||||||
|
else
|
||||||
|
if( !memcmp( buffer1, "2143", 4 ) )
|
||||||
|
puts( "\t It looks like the 16-bit word endianness is "
|
||||||
|
"reversed." );
|
||||||
|
else
|
||||||
|
if( buffer1[ 0 ] >= '1' && buffer1[ 0 ] <= '9' )
|
||||||
|
puts( "\t It looks like there's some sort of endianness "
|
||||||
|
"problem which is\n\t more complex than just a "
|
||||||
|
"reversal." );
|
||||||
|
else
|
||||||
|
puts( "\t It's probably more than just an endianness "
|
||||||
|
"problem." );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Report information on the encryption algorithm */
|
||||||
|
|
||||||
|
static void reportAlgorithmInformation( char *algorithmName,
|
||||||
|
CRYPT_QUERY_INFO *cryptQueryInfo )
|
||||||
|
{
|
||||||
|
char speedFactor[ 50 ];
|
||||||
|
|
||||||
|
/* Determine the speed factor relative to a block copy */
|
||||||
|
if( cryptQueryInfo->speed == CRYPT_ERROR )
|
||||||
|
strcpy( speedFactor, "unknown speed factor" );
|
||||||
|
else
|
||||||
|
sprintf( speedFactor, "0.%03d times the speed of a block copy",
|
||||||
|
cryptQueryInfo->speed );
|
||||||
|
|
||||||
|
printf( "%s algorithm is available with\n"
|
||||||
|
" name `%s', block size %d bits, %s,\n"
|
||||||
|
" min key size %d bits, recommended key size %d bits, "
|
||||||
|
"max key size %d bits,\n"
|
||||||
|
" min IV size %d bits, recommended IV size %d bits, "
|
||||||
|
"max IV size %d bits.\n",
|
||||||
|
algorithmName, cryptQueryInfo->algoName,
|
||||||
|
bytesToBits( cryptQueryInfo->blockSize ), speedFactor,
|
||||||
|
bytesToBits( cryptQueryInfo->minKeySize ),
|
||||||
|
bytesToBits( cryptQueryInfo->keySize ),
|
||||||
|
bytesToBits( cryptQueryInfo->maxKeySize ),
|
||||||
|
bytesToBits( cryptQueryInfo->minIVsize ),
|
||||||
|
bytesToBits( cryptQueryInfo->ivSize ),
|
||||||
|
bytesToBits( cryptQueryInfo->maxIVsize ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the library for an algorithm/mode */
|
||||||
|
|
||||||
|
static BOOLEAN checkLibraryInfo( char *name, char *longName,
|
||||||
|
CRYPT_ALGO cryptAlgo, CRYPT_MODE cryptMode )
|
||||||
|
{
|
||||||
|
CRYPT_QUERY_INFO cryptQueryInfo;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
status = queryAlgoAvailability( cryptAlgo );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
{
|
||||||
|
printf( "queryAlgoAvailability() reports %s is not available: "
|
||||||
|
"Code %d.\n", name, status );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
status = queryModeAvailability( cryptAlgo, cryptMode );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
{
|
||||||
|
printf( "queryModeAvailability() reports %s is not available: "
|
||||||
|
"Code %d.\n", longName, status );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
status = queryAlgoModeInformation( cryptAlgo, cryptMode, &cryptQueryInfo );
|
||||||
|
printf( "queryModeAvailability() reports " );
|
||||||
|
if( isStatusOK( status ) )
|
||||||
|
reportAlgorithmInformation( longName, &cryptQueryInfo );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf( "no information available on %s algorithm: Code %d.\n",
|
||||||
|
name, status );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load the encryption contexts */
|
||||||
|
|
||||||
|
static BOOLEAN loadContexts( CRYPT_INFO *cryptInfo, CRYPT_INFO *decryptInfo,
|
||||||
|
CRYPT_ALGO cryptAlgo, CRYPT_MODE cryptMode,
|
||||||
|
BYTE *key, int length )
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
/* Create the encryption context */
|
||||||
|
status = initCryptContext( cryptInfo, cryptAlgo, cryptMode );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
{
|
||||||
|
printf( "initCryptContext(): Failed with error code %d.\n", status );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
status = loadCryptContext( cryptInfo, key, length );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
{
|
||||||
|
printf( "loadCryptContext(): Failed with error code %d.\n", status );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create the decryption context */
|
||||||
|
status = initCryptContext( decryptInfo, cryptAlgo, cryptMode );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
{
|
||||||
|
printf( "initCryptContext(): Failed with error code %d.\n", status );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
status = loadCryptContext( decryptInfo, key, length );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
{
|
||||||
|
printf( "loadCryptContext(): Failed with error code %d.\n", status );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform a test en/decryption */
|
||||||
|
|
||||||
|
static void testCrypt( CRYPT_INFO *cryptInfo, CRYPT_INFO *decryptInfo,
|
||||||
|
BYTE *buffer )
|
||||||
|
{
|
||||||
|
CRYPT_QUERY_INFO cryptQueryInfo;
|
||||||
|
BYTE iv[ 100 ];
|
||||||
|
int status;
|
||||||
|
|
||||||
|
/* Find out about the algorithm we're using */
|
||||||
|
queryContextInformation( cryptInfo, &cryptQueryInfo );
|
||||||
|
if( cryptQueryInfo.cryptMode == CRYPT_MODE_CFB ||
|
||||||
|
cryptQueryInfo.cryptMode == CRYPT_MODE_OFB ||
|
||||||
|
cryptQueryInfo.cryptMode == CRYPT_MODE_STREAM )
|
||||||
|
{
|
||||||
|
/* Encrypt the buffer in two odd-sized chunks */
|
||||||
|
status = encryptBuffer( cryptInfo, buffer, 79 );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "Couldn't encrypt data: Code %d.\n", status );
|
||||||
|
status = encryptBuffer( cryptInfo, buffer + 79, TESTBUFFER_SIZE - 79 );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "Couldn't encrypt data: Code %d.\n", status );
|
||||||
|
status = encryptBuffer( cryptInfo, buffer + TESTBUFFER_SIZE, 0 );
|
||||||
|
|
||||||
|
/* Copy the IV from the encryption to the decryption context */
|
||||||
|
status = retrieveIV( cryptInfo, iv );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "Couldn't retrieve IV after encryption: Code %d.\n",
|
||||||
|
status );
|
||||||
|
status = loadIV( decryptInfo, iv, cryptQueryInfo.ivSize );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "Couldn't load IV for decryption: Code %d.\n", status );
|
||||||
|
|
||||||
|
/* Decrypt the buffer in different odd-size chunks */
|
||||||
|
status = decryptBuffer( decryptInfo, buffer, 125 );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "Couldn't decrypt data: Code %d.\n", status );
|
||||||
|
status = decryptBuffer( decryptInfo, buffer + 125, TESTBUFFER_SIZE - 125 );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "Couldn't decrypt data: Code %d.\n", status );
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( cryptQueryInfo.cryptMode == CRYPT_MODE_ECB ||
|
||||||
|
cryptQueryInfo.cryptMode == CRYPT_MODE_CBC ||
|
||||||
|
cryptQueryInfo.cryptMode == CRYPT_MODE_PCBC )
|
||||||
|
{
|
||||||
|
/* Encrypt the buffer in two odd-sized chunks */
|
||||||
|
status = encryptBuffer( cryptInfo, buffer, 80 );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "Couldn't encrypt data: Code %d.\n", status );
|
||||||
|
status = encryptBuffer( cryptInfo, buffer + 80, TESTBUFFER_SIZE - 80 );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "Couldn't encrypt data: Code %d.\n", status );
|
||||||
|
status = encryptBuffer( cryptInfo, buffer + TESTBUFFER_SIZE, 0 );
|
||||||
|
|
||||||
|
/* Copy the IV from the encryption to the decryption context */
|
||||||
|
status = retrieveIV( cryptInfo, iv );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "Couldn't retrieve IV after encryption: Code %d.\n",
|
||||||
|
status );
|
||||||
|
status = loadIV( decryptInfo, iv, cryptQueryInfo.ivSize );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "Couldn't load IV for decryption: Code %d.\n", status );
|
||||||
|
|
||||||
|
/* Decrypt the buffer in different odd-size chunks */
|
||||||
|
status = decryptBuffer( decryptInfo, buffer, 128 );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "Couldn't decrypt data: Code %d.\n", status );
|
||||||
|
status = decryptBuffer( decryptInfo, buffer + 128, TESTBUFFER_SIZE - 128 );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "Couldn't decrypt data: Code %d.\n", status );
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
puts( "Unknown encryption mode found in test code." );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Destroy the encryption contexts */
|
||||||
|
|
||||||
|
static void destroyContexts( CRYPT_INFO *cryptInfo, CRYPT_INFO *decryptInfo )
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
status = destroyCryptContext( cryptInfo );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "destroyCryptContext(): Failed with error code %d.\n", status );
|
||||||
|
status = destroyCryptContext( decryptInfo );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
printf( "destroyCryptContext(): Failed with error code %d.\n", status );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sample code to test an algorithm/mode implementation */
|
||||||
|
|
||||||
|
static int testLibrary( CRYPT_ALGO cryptAlgo, CRYPT_MODE cryptMode,
|
||||||
|
char *name, char *longName )
|
||||||
|
{
|
||||||
|
BYTE buffer[ TESTBUFFER_SIZE ], testBuffer[ TESTBUFFER_SIZE ];
|
||||||
|
CRYPT_INFO cryptInfo, decryptInfo;
|
||||||
|
CRYPT_INFO_MDCSHS cryptInfoEx;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
/* Initialise the test buffers */
|
||||||
|
initTestBuffers( buffer, testBuffer );
|
||||||
|
|
||||||
|
/* Check the capabilities of the library */
|
||||||
|
putchar( '\n' );
|
||||||
|
if( !checkLibraryInfo( name, longName, cryptAlgo, cryptMode ) )
|
||||||
|
return( FALSE );
|
||||||
|
|
||||||
|
/* Set up an encryption context, load a user key into it, and perform a
|
||||||
|
key setup */
|
||||||
|
switch( cryptAlgo )
|
||||||
|
{
|
||||||
|
case CRYPT_ALGO_MDCSHS:
|
||||||
|
/* We use an extended setup with reduced iteration count for
|
||||||
|
people who have to run this thing 2000 times while debugging */
|
||||||
|
cryptInfoEx.keySetupIterations = 10;
|
||||||
|
status = initCryptContextEx( &cryptInfo, cryptAlgo, cryptMode,
|
||||||
|
&cryptInfoEx );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
{
|
||||||
|
printf( "initCryptContext(): Failed with error code %d.\n",
|
||||||
|
status );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
status = loadCryptContext( &cryptInfo, "Test key", 8 );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
{
|
||||||
|
printf( "loadCryptContext(): Failed with error code %d.\n",
|
||||||
|
status );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create another crypt context for decryption. The error
|
||||||
|
checking here is a bit less picky to save space */
|
||||||
|
cryptInfoEx.keySetupIterations = 10;
|
||||||
|
initCryptContextEx( &decryptInfo, cryptAlgo, cryptMode,
|
||||||
|
&cryptInfoEx );
|
||||||
|
status = loadCryptContext( &decryptInfo, "Test key", 8 );
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
{
|
||||||
|
printf( "loadCryptContext(): Failed with error code %d.\n",
|
||||||
|
status );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CRYPT_ALGO_DES:
|
||||||
|
if( !loadContexts( &cryptInfo, &decryptInfo, cryptAlgo, cryptMode,
|
||||||
|
( BYTE * ) "1234567", 7 ) )
|
||||||
|
return( FALSE );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CRYPT_ALGO_3DES:
|
||||||
|
if( !loadContexts( &cryptInfo, &decryptInfo, cryptAlgo, cryptMode,
|
||||||
|
( BYTE * ) "12345677654321", 14 ) )
|
||||||
|
return( FALSE );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CRYPT_ALGO_IDEA:
|
||||||
|
if( !loadContexts( &cryptInfo, &decryptInfo, cryptAlgo, cryptMode,
|
||||||
|
( BYTE * ) "1234567887654321", 16 ) )
|
||||||
|
return( FALSE );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CRYPT_ALGO_RC4:
|
||||||
|
if( !loadContexts( &cryptInfo, &decryptInfo, cryptAlgo, cryptMode,
|
||||||
|
( BYTE * ) "12345678900987654321", 20 ) )
|
||||||
|
return( FALSE );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CRYPT_ALGO_SAFER:
|
||||||
|
if( !loadContexts( &cryptInfo, &decryptInfo, cryptAlgo, cryptMode,
|
||||||
|
( BYTE * ) "1234567887654321", 16 ) )
|
||||||
|
return( FALSE );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf( "Unknown encryption algorithm = ID %d, cannot perform "
|
||||||
|
"encryption test\n", cryptAlgo );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform a test en/decryption */
|
||||||
|
testCrypt( &cryptInfo, &decryptInfo, buffer );
|
||||||
|
|
||||||
|
/* Make sure everything went OK */
|
||||||
|
checkTestBuffers( buffer, testBuffer );
|
||||||
|
|
||||||
|
/* Destroy the encryption contexts */
|
||||||
|
destroyContexts( &cryptInfo, &decryptInfo );
|
||||||
|
|
||||||
|
return( TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Exercise various aspects of the encryption library */
|
||||||
|
|
||||||
|
int main( int argc, char **argv )
|
||||||
|
{
|
||||||
|
int status, bigEndian;
|
||||||
|
|
||||||
|
/* Get rid of compiler warning */
|
||||||
|
if( argc || argv );
|
||||||
|
|
||||||
|
/* Make sure we've got the endianness set right. If the machine is
|
||||||
|
big-endian (up to 64 bits) the following value will be signed,
|
||||||
|
otherwise it will be unsigned. Unfortunately we can't test for
|
||||||
|
things like middle-endianness without knowing the size of the data
|
||||||
|
types */
|
||||||
|
bigEndian = ( *( long * ) "\x80\x00\x00\x00\x00\x00\x00\x00" < 0 );
|
||||||
|
#ifdef LITTLE_ENDIAN
|
||||||
|
if( bigEndian )
|
||||||
|
{
|
||||||
|
puts( "The CPU endianness define is set wrong in crypt.h, this "
|
||||||
|
"machine appears to be\nbig-endian, not little-endian. Edit "
|
||||||
|
"the file and rebuild the library." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if( !bigEndian )
|
||||||
|
{
|
||||||
|
puts( "The CPU endianness define is set wrong in crypt.h, this "
|
||||||
|
"machine appears to be\nlittle-endian, not big-endian. Edit "
|
||||||
|
"the file and rebuild the library." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
#endif /* LITTLE_ENDIAN */
|
||||||
|
|
||||||
|
/* If we're compiling under Windoze, make sure that this weeks version
|
||||||
|
of Visual C gets the LONG type right */
|
||||||
|
#ifdef __WINDOWS__
|
||||||
|
{
|
||||||
|
LONG test = 0x80000000L;
|
||||||
|
|
||||||
|
if( test < 0 )
|
||||||
|
{
|
||||||
|
puts( "typeof( LONG ) is incorrect. It evaluates to a signed 32-bit "
|
||||||
|
"value rather\nthan an unsigned 32-bit value. You need to edit "
|
||||||
|
"crypt.h and recompile the\nencryption library" );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* __WINDOWS__ */
|
||||||
|
|
||||||
|
/* Initialise the library */
|
||||||
|
status = initLibrary();
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
{
|
||||||
|
printf( "Couldn't init library, code %d.\n", status );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test the encryption routines contained in the library */
|
||||||
|
#if 1
|
||||||
|
if( !testLibrary( CRYPT_ALGO_MDCSHS, CRYPT_MODE_CFB, "MDC/SHS",
|
||||||
|
"MDC/SHS-CFB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_DES, CRYPT_MODE_ECB, "DES", "DES-ECB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_DES, CRYPT_MODE_CBC, "DES", "DES-CBC" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_DES, CRYPT_MODE_CFB, "DES", "DES-CFB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_DES, CRYPT_MODE_OFB, "DES", "DES-OFB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_DES, CRYPT_MODE_PCBC, "DES", "DES-PCBC" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_3DES, CRYPT_MODE_ECB, "3DES", "3DES-ECB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_3DES, CRYPT_MODE_CBC, "3DES", "3DES-CBC" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_3DES, CRYPT_MODE_CFB, "3DES", "3DES-CFB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_3DES, CRYPT_MODE_OFB, "3DES", "3DES-OFB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_IDEA, CRYPT_MODE_ECB, "IDEA", "IDEA-ECB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_IDEA, CRYPT_MODE_CBC, "IDEA", "IDEA-CBC" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_IDEA, CRYPT_MODE_CFB, "IDEA", "IDEA-CFB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_IDEA, CRYPT_MODE_OFB, "IDEA", "IDEA-OFB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_RC4, CRYPT_MODE_STREAM, "RC4", "RC4" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_SAFER, CRYPT_MODE_ECB, "SAFER", "SAFER-ECB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_SAFER, CRYPT_MODE_CBC, "SAFER", "SAFER-CBC" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_SAFER, CRYPT_MODE_CFB, "SAFER", "SAFER-CFB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
if( !testLibrary( CRYPT_ALGO_SAFER, CRYPT_MODE_OFB, "SAFER", "SAFER-OFB" ) )
|
||||||
|
{
|
||||||
|
puts( "Tests aborted due to encryption library error." );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
#endif /* 0 or 1 */
|
||||||
|
|
||||||
|
/* Shut down the library */
|
||||||
|
status = endLibrary();
|
||||||
|
if( isStatusError( status ) )
|
||||||
|
{
|
||||||
|
printf( "endLibrary(): Failed with error code %d.\n", status );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( EXIT_SUCCESS );
|
||||||
|
}
|
||||||
Vendored
+928
@@ -0,0 +1,928 @@
|
|||||||
|
/* DES test vectors, derived from "Validating the Correctness of Hardware
|
||||||
|
Implementations of the NBS Data Encryption Standard", NBS Special
|
||||||
|
Publication 500-20, 1980 */
|
||||||
|
|
||||||
|
/* The data structure for the ( key, plaintext, ciphertext ) triplets. Each
|
||||||
|
set of tests also includes a string describing the test, suitable for
|
||||||
|
printing as "Testing <description string>" during the testing process */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE key[ DES_BLOCKSIZE ];
|
||||||
|
BYTE plaintext[ DES_BLOCKSIZE ];
|
||||||
|
BYTE ciphertext[ DES_BLOCKSIZE ];
|
||||||
|
} DES_TEST;
|
||||||
|
|
||||||
|
/* Initial Permutation and Expansion test: Encrypt */
|
||||||
|
|
||||||
|
static char *testIPname = "Initial Permutation and Expansion";
|
||||||
|
|
||||||
|
static DES_TEST testIP[] = {
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x95, 0xF8, 0xA5, 0xE5, 0xDD, 0x31, 0xD9, 0x00 },
|
||||||
|
{ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xDD, 0x7F, 0x12, 0x1C, 0xA5, 0x01, 0x56, 0x19 },
|
||||||
|
{ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x2E, 0x86, 0x53, 0x10, 0x4F, 0x38, 0x34, 0xEA },
|
||||||
|
{ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x4B, 0xD3, 0x88, 0xFF, 0x6C, 0xD8, 0x1D, 0x4F },
|
||||||
|
{ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x20, 0xB9, 0xE7, 0x67, 0xB2, 0xFB, 0x14, 0x56 },
|
||||||
|
{ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x55, 0x57, 0x93, 0x80, 0xD7, 0x71, 0x38, 0xEF },
|
||||||
|
{ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x6C, 0xC5, 0xDE, 0xFA, 0xAF, 0x04, 0x51, 0x2F },
|
||||||
|
{ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x0D, 0x9F, 0x27, 0x9B, 0xA5, 0xD8, 0x72, 0x60 },
|
||||||
|
{ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xD9, 0x03, 0x1B, 0x02, 0x71, 0xBD, 0x5A, 0x0A },
|
||||||
|
{ 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x42, 0x42, 0x50, 0xB3, 0x7C, 0x3D, 0xD9, 0x51 },
|
||||||
|
{ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xB8, 0x06, 0x1B, 0x7E, 0xCD, 0x9A, 0x21, 0xE5 },
|
||||||
|
{ 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xF1, 0x5D, 0x0F, 0x28, 0x6B, 0x65, 0xBD, 0x28 },
|
||||||
|
{ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xAD, 0xD0, 0xCC, 0x8D, 0x6E, 0x5D, 0xEB, 0xA1 },
|
||||||
|
{ 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xE6, 0xD5, 0xF8, 0x27, 0x52, 0xAD, 0x63, 0xD1 },
|
||||||
|
{ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xEC, 0xBF, 0xE3, 0xBD, 0x3F, 0x59, 0x1A, 0x5E },
|
||||||
|
{ 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xF3, 0x56, 0x83, 0x43, 0x79, 0xD1, 0x65, 0xCD },
|
||||||
|
{ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x2B, 0x9F, 0x98, 0x2F, 0x20, 0x03, 0x7F, 0xA9 },
|
||||||
|
{ 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x88, 0x9D, 0xE0, 0x68, 0xA1, 0x6F, 0x0B, 0xE6 },
|
||||||
|
{ 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xE1, 0x9E, 0x27, 0x5D, 0x84, 0x6A, 0x12, 0x98 },
|
||||||
|
{ 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x32, 0x9A, 0x8E, 0xD5, 0x23, 0xD7, 0x1A, 0xEC },
|
||||||
|
{ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xE7, 0xFC, 0xE2, 0x25, 0x57, 0xD2, 0x3C, 0x97 },
|
||||||
|
{ 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x12, 0xA9, 0xF5, 0x81, 0x7F, 0xF2, 0xD6, 0x5D },
|
||||||
|
{ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xA4, 0x84, 0xC3, 0xAD, 0x38, 0xDC, 0x9C, 0x19 },
|
||||||
|
{ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xFB, 0xE0, 0x0A, 0x8A, 0x1E, 0xF8, 0xAD, 0x72 },
|
||||||
|
{ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x75, 0x0D, 0x07, 0x94, 0x07, 0x52, 0x13, 0x63 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x64, 0xFE, 0xED, 0x9C, 0x72, 0x4C, 0x2F, 0xAF },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xF0, 0x2B, 0x26, 0x3B, 0x32, 0x8E, 0x2B, 0x60 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x9D, 0x64, 0x55, 0x5A, 0x9A, 0x10, 0xB8, 0x52 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xD1, 0x06, 0xFF, 0x0B, 0xED, 0x52, 0x55, 0xD7 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xE1, 0x65, 0x2C, 0x6B, 0x13, 0x8C, 0x64, 0xA5 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xE4, 0x28, 0x58, 0x11, 0x86, 0xEC, 0x8F, 0x46 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xAE, 0xB5, 0xF5, 0xED, 0xE2, 0x2D, 0x1A, 0x36 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xE9, 0x43, 0xD7, 0x56, 0x8A, 0xEC, 0x0C, 0x5C },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xDF, 0x98, 0xC8, 0x27, 0x6F, 0x54, 0xB0, 0x4B },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xB1, 0x60, 0xE4, 0x68, 0x0F, 0x6C, 0x69, 0x6F },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xFA, 0x07, 0x52, 0xB0, 0x7D, 0x9C, 0x4A, 0xB8 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xCA, 0x3A, 0x2B, 0x03, 0x6D, 0xBC, 0x85, 0x02 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x5E, 0x09, 0x05, 0x51, 0x7B, 0xB5, 0x9B, 0xCF },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x81, 0x4E, 0xEB, 0x3B, 0x91, 0xD9, 0x07, 0x26 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x4D, 0x49, 0xDB, 0x15, 0x32, 0x91, 0x9C, 0x9F },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x25, 0xEB, 0x5F, 0xC3, 0xF8, 0xCF, 0x06, 0x21 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xAB, 0x6A, 0x20, 0xC0, 0x62, 0x0D, 0x1C, 0x6F },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x79, 0xE9, 0x0D, 0xBC, 0x98, 0xF9, 0x2C, 0xCA },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x86, 0x6E, 0xCE, 0xDD, 0x80, 0x72, 0xBB, 0x0E },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x8B, 0x54, 0x53, 0x6F, 0x2F, 0x3E, 0x64, 0xA8 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xEA, 0x51, 0xD3, 0x97, 0x55, 0x95, 0xB8, 0x6B },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xCA, 0xFF, 0xC6, 0xAC, 0x45, 0x42, 0xDE, 0x31 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x8D, 0xD4, 0x5A, 0x2D, 0xDF, 0x90, 0x79, 0x6C },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x10, 0x29, 0xD5, 0x5E, 0x88, 0x0E, 0xC2, 0xD0 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x5D, 0x86, 0xCB, 0x23, 0x63, 0x9D, 0xBE, 0xA9 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x1D, 0x1C, 0xA8, 0x53, 0xAE, 0x7C, 0x0C, 0x5F },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xCE, 0x33, 0x23, 0x29, 0x24, 0x8F, 0x32, 0x28 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x84, 0x05, 0xD1, 0xAB, 0xE2, 0x4F, 0xB9, 0x42 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xE6, 0x43, 0xD7, 0x80, 0x90, 0xCA, 0x42, 0x07 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x48, 0x22, 0x1B, 0x99, 0x37, 0x74, 0x8A, 0x23 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xDD, 0x7C, 0x0B, 0xBD, 0x61, 0xFA, 0xFD, 0x54 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x2F, 0xBC, 0x29, 0x1A, 0x57, 0x0D, 0xB5, 0xC4 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xE0, 0x7C, 0x30, 0xD7, 0xE4, 0xE2, 0x6E, 0x12 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x09, 0x53, 0xE2, 0x25, 0x8E, 0x8E, 0x90, 0xA1 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x5B, 0x71, 0x1B, 0xC4, 0xCE, 0xEB, 0xF2, 0xEE },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xCC, 0x08, 0x3F, 0x1E, 0x6D, 0x9E, 0x85, 0xF6 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xD2, 0xFD, 0x88, 0x67, 0xD5, 0x0D, 0x2D, 0xFE },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x06, 0xE7, 0xEA, 0x22, 0xCE, 0x92, 0x70, 0x8F },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x16, 0x6B, 0x40, 0xB4, 0x4A, 0xBA, 0x4B, 0xD6 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Inverse Permutation and Expansion test: Encrypt */
|
||||||
|
|
||||||
|
static char *testVPname = "Inverse Permutation and Expansion";
|
||||||
|
|
||||||
|
static DES_TEST testVP[] = {
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x95, 0xF8, 0xA5, 0xE5, 0xDD, 0x31, 0xD9, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xDD, 0x7F, 0x12, 0x1C, 0xA5, 0x01, 0x56, 0x19 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x2E, 0x86, 0x53, 0x10, 0x4F, 0x38, 0x34, 0xEA } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x4B, 0xD3, 0x88, 0xFF, 0x6C, 0xD8, 0x1D, 0x4F } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x20, 0xB9, 0xE7, 0x67, 0xB2, 0xFB, 0x14, 0x56 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x55, 0x57, 0x93, 0x80, 0xD7, 0x71, 0x38, 0xEF } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x6C, 0xC5, 0xDE, 0xFA, 0xAF, 0x04, 0x51, 0x2F } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x0D, 0x9F, 0x27, 0x9B, 0xA5, 0xD8, 0x72, 0x60 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xD9, 0x03, 0x1B, 0x02, 0x71, 0xBD, 0x5A, 0x0A } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x42, 0x42, 0x50, 0xB3, 0x7C, 0x3D, 0xD9, 0x51 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xB8, 0x06, 0x1B, 0x7E, 0xCD, 0x9A, 0x21, 0xE5 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xF1, 0x5D, 0x0F, 0x28, 0x6B, 0x65, 0xBD, 0x28 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xAD, 0xD0, 0xCC, 0x8D, 0x6E, 0x5D, 0xEB, 0xA1 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xE6, 0xD5, 0xF8, 0x27, 0x52, 0xAD, 0x63, 0xD1 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xEC, 0xBF, 0xE3, 0xBD, 0x3F, 0x59, 0x1A, 0x5E } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xF3, 0x56, 0x83, 0x43, 0x79, 0xD1, 0x65, 0xCD } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x2B, 0x9F, 0x98, 0x2F, 0x20, 0x03, 0x7F, 0xA9 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x88, 0x9D, 0xE0, 0x68, 0xA1, 0x6F, 0x0B, 0xE6 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xE1, 0x9E, 0x27, 0x5D, 0x84, 0x6A, 0x12, 0x98 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x32, 0x9A, 0x8E, 0xD5, 0x23, 0xD7, 0x1A, 0xEC } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xE7, 0xFC, 0xE2, 0x25, 0x57, 0xD2, 0x3C, 0x97 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x12, 0xA9, 0xF5, 0x81, 0x7F, 0xF2, 0xD6, 0x5D } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xA4, 0x84, 0xC3, 0xAD, 0x38, 0xDC, 0x9C, 0x19 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xFB, 0xE0, 0x0A, 0x8A, 0x1E, 0xF8, 0xAD, 0x72 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x75, 0x0D, 0x07, 0x94, 0x07, 0x52, 0x13, 0x63 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x64, 0xFE, 0xED, 0x9C, 0x72, 0x4C, 0x2F, 0xAF } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xF0, 0x2B, 0x26, 0x3B, 0x32, 0x8E, 0x2B, 0x60 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x9D, 0x64, 0x55, 0x5A, 0x9A, 0x10, 0xB8, 0x52 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xD1, 0x06, 0xFF, 0x0B, 0xED, 0x52, 0x55, 0xD7 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xE1, 0x65, 0x2C, 0x6B, 0x13, 0x8C, 0x64, 0xA5 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xE4, 0x28, 0x58, 0x11, 0x86, 0xEC, 0x8F, 0x46 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xAE, 0xB5, 0xF5, 0xED, 0xE2, 0x2D, 0x1A, 0x36 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xE9, 0x43, 0xD7, 0x56, 0x8A, 0xEC, 0x0C, 0x5C } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xDF, 0x98, 0xC8, 0x27, 0x6F, 0x54, 0xB0, 0x4B } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xB1, 0x60, 0xE4, 0x68, 0x0F, 0x6C, 0x69, 0x6F } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xFA, 0x07, 0x52, 0xB0, 0x7D, 0x9C, 0x4A, 0xB8 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xCA, 0x3A, 0x2B, 0x03, 0x6D, 0xBC, 0x85, 0x02 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x5E, 0x09, 0x05, 0x51, 0x7B, 0xB5, 0x9B, 0xCF } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x81, 0x4E, 0xEB, 0x3B, 0x91, 0xD9, 0x07, 0x26 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x4D, 0x49, 0xDB, 0x15, 0x32, 0x91, 0x9C, 0x9F } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00 },
|
||||||
|
{ 0x25, 0xEB, 0x5F, 0xC3, 0xF8, 0xCF, 0x06, 0x21 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00 },
|
||||||
|
{ 0xAB, 0x6A, 0x20, 0xC0, 0x62, 0x0D, 0x1C, 0x6F } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00 },
|
||||||
|
{ 0x79, 0xE9, 0x0D, 0xBC, 0x98, 0xF9, 0x2C, 0xCA } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00 },
|
||||||
|
{ 0x86, 0x6E, 0xCE, 0xDD, 0x80, 0x72, 0xBB, 0x0E } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00 },
|
||||||
|
{ 0x8B, 0x54, 0x53, 0x6F, 0x2F, 0x3E, 0x64, 0xA8 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00 },
|
||||||
|
{ 0xEA, 0x51, 0xD3, 0x97, 0x55, 0x95, 0xB8, 0x6B } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00 },
|
||||||
|
{ 0xCA, 0xFF, 0xC6, 0xAC, 0x45, 0x42, 0xDE, 0x31 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00 },
|
||||||
|
{ 0x8D, 0xD4, 0x5A, 0x2D, 0xDF, 0x90, 0x79, 0x6C } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
|
||||||
|
{ 0x10, 0x29, 0xD5, 0x5E, 0x88, 0x0E, 0xC2, 0xD0 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00 },
|
||||||
|
{ 0x5D, 0x86, 0xCB, 0x23, 0x63, 0x9D, 0xBE, 0xA9 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00 },
|
||||||
|
{ 0x1D, 0x1C, 0xA8, 0x53, 0xAE, 0x7C, 0x0C, 0x5F } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 },
|
||||||
|
{ 0xCE, 0x33, 0x23, 0x29, 0x24, 0x8F, 0x32, 0x28 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00 },
|
||||||
|
{ 0x84, 0x05, 0xD1, 0xAB, 0xE2, 0x4F, 0xB9, 0x42 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00 },
|
||||||
|
{ 0xE6, 0x43, 0xD7, 0x80, 0x90, 0xCA, 0x42, 0x07 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00 },
|
||||||
|
{ 0x48, 0x22, 0x1B, 0x99, 0x37, 0x74, 0x8A, 0x23 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00 },
|
||||||
|
{ 0xDD, 0x7C, 0x0B, 0xBD, 0x61, 0xFA, 0xFD, 0x54 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
|
||||||
|
{ 0x2F, 0xBC, 0x29, 0x1A, 0x57, 0x0D, 0xB5, 0xC4 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40 },
|
||||||
|
{ 0xE0, 0x7C, 0x30, 0xD7, 0xE4, 0xE2, 0x6E, 0x12 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20 },
|
||||||
|
{ 0x09, 0x53, 0xE2, 0x25, 0x8E, 0x8E, 0x90, 0xA1 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 },
|
||||||
|
{ 0x5B, 0x71, 0x1B, 0xC4, 0xCE, 0xEB, 0xF2, 0xEE } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 },
|
||||||
|
{ 0xCC, 0x08, 0x3F, 0x1E, 0x6D, 0x9E, 0x85, 0xF6 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04 },
|
||||||
|
{ 0xD2, 0xFD, 0x88, 0x67, 0xD5, 0x0D, 0x2D, 0xFE } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 },
|
||||||
|
{ 0x06, 0xE7, 0xEA, 0x22, 0xCE, 0x92, 0x70, 0x8F } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
|
||||||
|
{ 0x16, 0x6B, 0x40, 0xB4, 0x4A, 0xBA, 0x4B, 0xD6 } }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Key Permutation tests: Encrypt */
|
||||||
|
|
||||||
|
static char *testKPname = "Key Permutation";
|
||||||
|
|
||||||
|
static DES_TEST testKP[] = {
|
||||||
|
{ { 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x95, 0xA8, 0xD7, 0x28, 0x13, 0xDA, 0xA9, 0x4D } },
|
||||||
|
{ { 0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x0E, 0xEC, 0x14, 0x87, 0xDD, 0x8C, 0x26, 0xD5 } },
|
||||||
|
{ { 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x7A, 0xD1, 0x6F, 0xFB, 0x79, 0xC4, 0x59, 0x26 } },
|
||||||
|
{ { 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xD3, 0x74, 0x62, 0x94, 0xCA, 0x6A, 0x6C, 0xF3 } },
|
||||||
|
{ { 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x80, 0x9F, 0x5F, 0x87, 0x3C, 0x1F, 0xD7, 0x61 } },
|
||||||
|
{ { 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xC0, 0x2F, 0xAF, 0xFE, 0xC9, 0x89, 0xD1, 0xFC } },
|
||||||
|
{ { 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x46, 0x15, 0xAA, 0x1D, 0x33, 0xE7, 0x2F, 0x10 } },
|
||||||
|
{ { 0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x20, 0x55, 0x12, 0x33, 0x50, 0xC0, 0x08, 0x58 } },
|
||||||
|
{ { 0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xDF, 0x3B, 0x99, 0xD6, 0x57, 0x73, 0x97, 0xC8 } },
|
||||||
|
{ { 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x31, 0xFE, 0x17, 0x36, 0x9B, 0x52, 0x88, 0xC9 } },
|
||||||
|
{ { 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xDF, 0xDD, 0x3C, 0xC6, 0x4D, 0xAE, 0x16, 0x42 } },
|
||||||
|
{ { 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x17, 0x8C, 0x83, 0xCE, 0x2B, 0x39, 0x9D, 0x94 } },
|
||||||
|
{ { 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x50, 0xF6, 0x36, 0x32, 0x4A, 0x9B, 0x7F, 0x80 } },
|
||||||
|
{ { 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xA8, 0x46, 0x8E, 0xE3, 0xBC, 0x18, 0xF0, 0x6D } },
|
||||||
|
{ { 0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xA2, 0xDC, 0x9E, 0x92, 0xFD, 0x3C, 0xDE, 0x92 } },
|
||||||
|
{ { 0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xCA, 0xC0, 0x9F, 0x79, 0x7D, 0x03, 0x12, 0x87 } },
|
||||||
|
{ { 0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x90, 0xBA, 0x68, 0x0B, 0x22, 0xAE, 0xB5, 0x25 } },
|
||||||
|
{ { 0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xCE, 0x7A, 0x24, 0xF3, 0x50, 0xE2, 0x80, 0xB6 } },
|
||||||
|
{ { 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x88, 0x2B, 0xFF, 0x0A, 0xA0, 0x1A, 0x0B, 0x87 } },
|
||||||
|
{ { 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x25, 0x61, 0x02, 0x88, 0x92, 0x45, 0x11, 0xC2 } },
|
||||||
|
{ { 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xC7, 0x15, 0x16, 0xC2, 0x9C, 0x75, 0xD1, 0x70 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x51, 0x99, 0xC2, 0x9A, 0x52, 0xC9, 0xF0, 0x59 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xC2, 0x2F, 0x0A, 0x29, 0x4A, 0x71, 0xF2, 0x9F } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xEE, 0x37, 0x14, 0x83, 0x71, 0x4C, 0x02, 0xEA } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xA8, 0x1F, 0xBD, 0x44, 0x8F, 0x9E, 0x52, 0x2F } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x4F, 0x64, 0x4C, 0x92, 0xE1, 0x92, 0xDF, 0xED } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x1A, 0xFA, 0x9A, 0x66, 0xA6, 0xDF, 0x92, 0xAE } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xB3, 0xC1, 0xCC, 0x71, 0x5C, 0xB8, 0x79, 0xD8 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x19, 0xD0, 0x32, 0xE6, 0x4A, 0xB0, 0xBD, 0x8B } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x3C, 0xFA, 0xA7, 0xA7, 0xDC, 0x87, 0x20, 0xDC } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xB7, 0x26, 0x5F, 0x7F, 0x44, 0x7A, 0xC6, 0xF3 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x9D, 0xB7, 0x3B, 0x3C, 0x0D, 0x16, 0x3F, 0x54 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x81, 0x81, 0xB6, 0x5B, 0xAB, 0xF4, 0xA9, 0x75 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x93, 0xC9, 0xB6, 0x40, 0x42, 0xEA, 0xA2, 0x40 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x55, 0x70, 0x53, 0x08, 0x29, 0x70, 0x55, 0x92 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x86, 0x38, 0x80, 0x9E, 0x87, 0x87, 0x87, 0xA0 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x41, 0xB9, 0xA7, 0x9A, 0xF7, 0x9A, 0xC2, 0x08 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x7A, 0x9B, 0xE4, 0x2F, 0x20, 0x09, 0xA8, 0x92 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x29, 0x03, 0x8D, 0x56, 0xBA, 0x6D, 0x27, 0x45 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x54, 0x95, 0xC6, 0xAB, 0xF1, 0xE5, 0xDF, 0x51 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xAE, 0x13, 0xDB, 0xD5, 0x61, 0x48, 0x89, 0x33 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x02, 0x4D, 0x1F, 0xFA, 0x89, 0x04, 0xE3, 0x89 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xD1, 0x39, 0x97, 0x12, 0xF9, 0x9B, 0xF0, 0x2E } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x14, 0xC1, 0xD7, 0xC1, 0xCF, 0xFE, 0xC7, 0x9E } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x1D, 0xE5, 0x27, 0x9D, 0xAE, 0x3B, 0xED, 0x6F } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xE9, 0x41, 0xA3, 0x3F, 0x85, 0x50, 0x13, 0x03 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xDA, 0x99, 0xDB, 0xBC, 0x9A, 0x03, 0xF3, 0x79 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xB7, 0xFC, 0x92, 0xF9, 0x1D, 0x8E, 0x92, 0xE9 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xAE, 0x8E, 0x5C, 0xAA, 0x3C, 0xA0, 0x4E, 0x85 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x9C, 0xC6, 0x2D, 0xF4, 0x3B, 0x6E, 0xED, 0x74 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xD8, 0x63, 0xDB, 0xB5, 0xC5, 0x9A, 0x91, 0xA0 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xA1, 0xAB, 0x21, 0x90, 0x54, 0x5B, 0x91, 0xD7 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x08, 0x75, 0x04, 0x1E, 0x64, 0xC5, 0x70, 0xF7 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x5A, 0x59, 0x45, 0x28, 0xBE, 0xBE, 0xF1, 0xCC } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xFC, 0xDB, 0x32, 0x91, 0xDE, 0x21, 0xF0, 0xC0 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x86, 0x9E, 0xFD, 0x7F, 0x9F, 0x26, 0x5A, 0x09 } }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Test of right-shifts in Decryption: Decrypt */
|
||||||
|
|
||||||
|
static char *testRSname = "Right-shifts in Decryption";
|
||||||
|
|
||||||
|
static DES_TEST testRS[] = {
|
||||||
|
{ { 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x95, 0xA8, 0xD7, 0x28, 0x13, 0xDA, 0xA9, 0x4D },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x0E, 0xEC, 0x14, 0x87, 0xDD, 0x8C, 0x26, 0xD5 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x7A, 0xD1, 0x6F, 0xFB, 0x79, 0xC4, 0x59, 0x26 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xD3, 0x74, 0x62, 0x94, 0xCA, 0x6A, 0x6C, 0xF3 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x80, 0x9F, 0x5F, 0x87, 0x3C, 0x1F, 0xD7, 0x61 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xC0, 0x2F, 0xAF, 0xFE, 0xC9, 0x89, 0xD1, 0xFC },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x46, 0x15, 0xAA, 0x1D, 0x33, 0xE7, 0x2F, 0x10 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x20, 0x55, 0x12, 0x33, 0x50, 0xC0, 0x08, 0x58 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xDF, 0x3B, 0x99, 0xD6, 0x57, 0x73, 0x97, 0xC8 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x31, 0xFE, 0x17, 0x36, 0x9B, 0x52, 0x88, 0xC9 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xDF, 0xDD, 0x3C, 0xC6, 0x4D, 0xAE, 0x16, 0x42 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x17, 0x8C, 0x83, 0xCE, 0x2B, 0x39, 0x9D, 0x94 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x50, 0xF6, 0x36, 0x32, 0x4A, 0x9B, 0x7F, 0x80 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xA8, 0x46, 0x8E, 0xE3, 0xBC, 0x18, 0xF0, 0x6D },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xA2, 0xDC, 0x9E, 0x92, 0xFD, 0x3C, 0xDE, 0x92 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xCA, 0xC0, 0x9F, 0x79, 0x7D, 0x03, 0x12, 0x87 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x90, 0xBA, 0x68, 0x0B, 0x22, 0xAE, 0xB5, 0x25 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xCE, 0x7A, 0x24, 0xF3, 0x50, 0xE2, 0x80, 0xB6 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x88, 0x2B, 0xFF, 0x0A, 0xA0, 0x1A, 0x0B, 0x87 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x25, 0x61, 0x02, 0x88, 0x92, 0x45, 0x11, 0xC2 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xC7, 0x15, 0x16, 0xC2, 0x9C, 0x75, 0xD1, 0x70 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x51, 0x99, 0xC2, 0x9A, 0x52, 0xC9, 0xF0, 0x59 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xC2, 0x2F, 0x0A, 0x29, 0x4A, 0x71, 0xF2, 0x9F },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xEE, 0x37, 0x14, 0x83, 0x71, 0x4C, 0x02, 0xEA },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xA8, 0x1F, 0xBD, 0x44, 0x8F, 0x9E, 0x52, 0x2F },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x4F, 0x64, 0x4C, 0x92, 0xE1, 0x92, 0xDF, 0xED },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x1A, 0xFA, 0x9A, 0x66, 0xA6, 0xDF, 0x92, 0xAE },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xB3, 0xC1, 0xCC, 0x71, 0x5C, 0xB8, 0x79, 0xD8 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x19, 0xD0, 0x32, 0xE6, 0x4A, 0xB0, 0xBD, 0x8B },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x3C, 0xFA, 0xA7, 0xA7, 0xDC, 0x87, 0x20, 0xDC },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0xB7, 0x26, 0x5F, 0x7F, 0x44, 0x7A, 0xC6, 0xF3 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x9D, 0xB7, 0x3B, 0x3C, 0x0D, 0x16, 0x3F, 0x54 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x81, 0x81, 0xB6, 0x5B, 0xAB, 0xF4, 0xA9, 0x75 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x93, 0xC9, 0xB6, 0x40, 0x42, 0xEA, 0xA2, 0x40 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01 },
|
||||||
|
{ 0x55, 0x70, 0x53, 0x08, 0x29, 0x70, 0x55, 0x92 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01 },
|
||||||
|
{ 0x86, 0x38, 0x80, 0x9E, 0x87, 0x87, 0x87, 0xA0 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01 },
|
||||||
|
{ 0x41, 0xB9, 0xA7, 0x9A, 0xF7, 0x9A, 0xC2, 0x08 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01 },
|
||||||
|
{ 0x7A, 0x9B, 0xE4, 0x2F, 0x20, 0x09, 0xA8, 0x92 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01 },
|
||||||
|
{ 0x29, 0x03, 0x8D, 0x56, 0xBA, 0x6D, 0x27, 0x45 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01 },
|
||||||
|
{ 0x54, 0x95, 0xC6, 0xAB, 0xF1, 0xE5, 0xDF, 0x51 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01 },
|
||||||
|
{ 0xAE, 0x13, 0xDB, 0xD5, 0x61, 0x48, 0x89, 0x33 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01 },
|
||||||
|
{ 0x02, 0x4D, 0x1F, 0xFA, 0x89, 0x04, 0xE3, 0x89 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01 },
|
||||||
|
{ 0xD1, 0x39, 0x97, 0x12, 0xF9, 0x9B, 0xF0, 0x2E },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01 },
|
||||||
|
{ 0x14, 0xC1, 0xD7, 0xC1, 0xCF, 0xFE, 0xC7, 0x9E },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01 },
|
||||||
|
{ 0x1D, 0xE5, 0x27, 0x9D, 0xAE, 0x3B, 0xED, 0x6F },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01 },
|
||||||
|
{ 0xE9, 0x41, 0xA3, 0x3F, 0x85, 0x50, 0x13, 0x03 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01 },
|
||||||
|
{ 0xDA, 0x99, 0xDB, 0xBC, 0x9A, 0x03, 0xF3, 0x79 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01 },
|
||||||
|
{ 0xB7, 0xFC, 0x92, 0xF9, 0x1D, 0x8E, 0x92, 0xE9 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01 },
|
||||||
|
{ 0xAE, 0x8E, 0x5C, 0xAA, 0x3C, 0xA0, 0x4E, 0x85 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80 },
|
||||||
|
{ 0x9C, 0xC6, 0x2D, 0xF4, 0x3B, 0x6E, 0xED, 0x74 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40 },
|
||||||
|
{ 0xD8, 0x63, 0xDB, 0xB5, 0xC5, 0x9A, 0x91, 0xA0 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20 },
|
||||||
|
{ 0xA1, 0xAB, 0x21, 0x90, 0x54, 0x5B, 0x91, 0xD7 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10 },
|
||||||
|
{ 0x08, 0x75, 0x04, 0x1E, 0x64, 0xC5, 0x70, 0xF7 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08 },
|
||||||
|
{ 0x5A, 0x59, 0x45, 0x28, 0xBE, 0xBE, 0xF1, 0xCC },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04 },
|
||||||
|
{ 0xFC, 0xDB, 0x32, 0x91, 0xDE, 0x21, 0xF0, 0xC0 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
|
||||||
|
{ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02 },
|
||||||
|
{ 0x86, 0x9E, 0xFD, 0x7F, 0x9F, 0x26, 0x5A, 0x09 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Data Permutation test: Encrypt */
|
||||||
|
|
||||||
|
static char *testDPname = "Data Permutation";
|
||||||
|
|
||||||
|
static DES_TEST testDP[] = {
|
||||||
|
{ { 0x10, 0x46, 0x91, 0x34, 0x89, 0x98, 0x01, 0x31 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x88, 0xD5, 0x5E, 0x54, 0xF5, 0x4C, 0x97, 0xB4 } },
|
||||||
|
{ { 0x10, 0x07, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x0C, 0x0C, 0xC0, 0x0C, 0x83, 0xEA, 0x48, 0xFD } },
|
||||||
|
{ { 0x10, 0x07, 0x10, 0x34, 0xC8, 0x98, 0x01, 0x20 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x83, 0xBC, 0x8E, 0xF3, 0xA6, 0x57, 0x01, 0x83 } },
|
||||||
|
{ { 0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xDF, 0x72, 0x5D, 0xCA, 0xD9, 0x4E, 0xA2, 0xE9 } },
|
||||||
|
{ { 0x10, 0x86, 0x91, 0x15, 0x19, 0x19, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xE6, 0x52, 0xB5, 0x3B, 0x55, 0x0B, 0xE8, 0xB0 } },
|
||||||
|
{ { 0x10, 0x86, 0x91, 0x15, 0x19, 0x58, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xAF, 0x52, 0x71, 0x20, 0xC4, 0x85, 0xCB, 0xB0 } },
|
||||||
|
{ { 0x51, 0x07, 0xB0, 0x15, 0x19, 0x58, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x0F, 0x04, 0xCE, 0x39, 0x3D, 0xB9, 0x26, 0xD5 } },
|
||||||
|
{ { 0x10, 0x07, 0xB0, 0x15, 0x19, 0x19, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xC9, 0xF0, 0x0F, 0xFC, 0x74, 0x07, 0x90, 0x67 } },
|
||||||
|
{ { 0x31, 0x07, 0x91, 0x54, 0x98, 0x08, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x7C, 0xFD, 0x82, 0xA5, 0x93, 0x25, 0x2B, 0x4E } },
|
||||||
|
{ { 0x31, 0x07, 0x91, 0x94, 0x98, 0x08, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xCB, 0x49, 0xA2, 0xF9, 0xE9, 0x13, 0x63, 0xE3 } },
|
||||||
|
{ { 0x10, 0x07, 0x91, 0x15, 0xB9, 0x08, 0x01, 0x40 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x00, 0xB5, 0x88, 0xBE, 0x70, 0xD2, 0x3F, 0x56 } },
|
||||||
|
{ { 0x31, 0x07, 0x91, 0x15, 0x98, 0x08, 0x01, 0x40 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x40, 0x6A, 0x9A, 0x6A, 0xB4, 0x33, 0x99, 0xAE } },
|
||||||
|
{ { 0x10, 0x07, 0xD0, 0x15, 0x89, 0x98, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x6C, 0xB7, 0x73, 0x61, 0x1D, 0xCA, 0x9A, 0xDA } },
|
||||||
|
{ { 0x91, 0x07, 0x91, 0x15, 0x89, 0x98, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x67, 0xFD, 0x21, 0xC1, 0x7D, 0xBB, 0x5D, 0x70 } },
|
||||||
|
{ { 0x91, 0x07, 0xD0, 0x15, 0x89, 0x19, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x95, 0x92, 0xCB, 0x41, 0x10, 0x43, 0x07, 0x87 } },
|
||||||
|
{ { 0x10, 0x07, 0xD0, 0x15, 0x98, 0x98, 0x01, 0x20 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xA6, 0xB7, 0xFF, 0x68, 0xA3, 0x18, 0xDD, 0xD3 } },
|
||||||
|
{ { 0x10, 0x07, 0x94, 0x04, 0x98, 0x19, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x4D, 0x10, 0x21, 0x96, 0xC9, 0x14, 0xCA, 0x16 } },
|
||||||
|
{ { 0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x04, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x2D, 0xFA, 0x9F, 0x45, 0x73, 0x59, 0x49, 0x65 } },
|
||||||
|
{ { 0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xB4, 0x66, 0x04, 0x81, 0x6C, 0x0E, 0x07, 0x74 } },
|
||||||
|
{ { 0x01, 0x07, 0x94, 0x04, 0x91, 0x19, 0x04, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x6E, 0x7E, 0x62, 0x21, 0xA4, 0xF3, 0x4E, 0x87 } },
|
||||||
|
{ { 0x19, 0x07, 0x92, 0x10, 0x98, 0x1A, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xAA, 0x85, 0xE7, 0x46, 0x43, 0x23, 0x31, 0x99 } },
|
||||||
|
{ { 0x10, 0x07, 0x91, 0x19, 0x98, 0x19, 0x08, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x2E, 0x5A, 0x19, 0xDB, 0x4D, 0x19, 0x62, 0xD6 } },
|
||||||
|
{ { 0x10, 0x07, 0x91, 0x19, 0x98, 0x1A, 0x08, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x23, 0xA8, 0x66, 0xA8, 0x09, 0xD3, 0x08, 0x94 } },
|
||||||
|
{ { 0x10, 0x07, 0x92, 0x10, 0x98, 0x19, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xD8, 0x12, 0xD9, 0x61, 0xF0, 0x17, 0xD3, 0x20 } },
|
||||||
|
{ { 0x10, 0x07, 0x91, 0x15, 0x98, 0x19, 0x01, 0x0B },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x05, 0x56, 0x05, 0x81, 0x6E, 0x58, 0x60, 0x8F } },
|
||||||
|
{ { 0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xAB, 0xD8, 0x8E, 0x8B, 0x1B, 0x77, 0x16, 0xF1 } },
|
||||||
|
{ { 0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x02 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x53, 0x7A, 0xC9, 0x5B, 0xE6, 0x9D, 0xA1, 0xE1 } },
|
||||||
|
{ { 0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x08 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xAE, 0xD0, 0xF6, 0xAE, 0x3C, 0x25, 0xCD, 0xD8 } },
|
||||||
|
{ { 0x10, 0x02, 0x91, 0x14, 0x98, 0x10, 0x01, 0x04 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xB3, 0xE3, 0x5A, 0x5E, 0xE5, 0x3E, 0x7B, 0x8D } },
|
||||||
|
{ { 0x10, 0x02, 0x91, 0x15, 0x98, 0x19, 0x01, 0x04 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x61, 0xC7, 0x9C, 0x71, 0x92, 0x1A, 0x2E, 0xF8 } },
|
||||||
|
{ { 0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x02, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xE2, 0xF5, 0x72, 0x8F, 0x09, 0x95, 0x01, 0x3C } },
|
||||||
|
{ { 0x10, 0x02, 0x91, 0x16, 0x98, 0x10, 0x01, 0x01 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x1A, 0xEA, 0xC3, 0x9A, 0x61, 0xF0, 0xA4, 0x64 } }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* S-Box test: Encrypt */
|
||||||
|
|
||||||
|
static char *testSBname = "S-Boxes";
|
||||||
|
|
||||||
|
static DES_TEST testSB[] = {
|
||||||
|
{ { 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
|
||||||
|
{ 0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42 },
|
||||||
|
{ 0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B } },
|
||||||
|
{ { 0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E },
|
||||||
|
{ 0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA },
|
||||||
|
{ 0x7A, 0x38, 0x9D, 0x10, 0x35, 0x4B, 0xD2, 0x71 } },
|
||||||
|
{ { 0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86 },
|
||||||
|
{ 0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72 },
|
||||||
|
{ 0x86, 0x8E, 0xBB, 0x51, 0xCA, 0xB4, 0x59, 0x9A } },
|
||||||
|
{ { 0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E },
|
||||||
|
{ 0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A },
|
||||||
|
{ 0x71, 0x78, 0x87, 0x6E, 0x01, 0xF1, 0x9B, 0x2A } },
|
||||||
|
{ { 0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6 },
|
||||||
|
{ 0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2 },
|
||||||
|
{ 0xAF, 0x37, 0xFB, 0x42, 0x1F, 0x8C, 0x40, 0x95 } },
|
||||||
|
{ { 0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE },
|
||||||
|
{ 0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A },
|
||||||
|
{ 0x86, 0xA5, 0x60, 0xF1, 0x0E, 0xC6, 0xD8, 0x5B } },
|
||||||
|
{ { 0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6 },
|
||||||
|
{ 0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2 },
|
||||||
|
{ 0x0C, 0xD3, 0xDA, 0x02, 0x00, 0x21, 0xDC, 0x09 } },
|
||||||
|
{ { 0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE },
|
||||||
|
{ 0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A },
|
||||||
|
{ 0xEA, 0x67, 0x6B, 0x2C, 0xB7, 0xDB, 0x2B, 0x7A } },
|
||||||
|
{ { 0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16 },
|
||||||
|
{ 0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02 },
|
||||||
|
{ 0xDF, 0xD6, 0x4A, 0x81, 0x5C, 0xAF, 0x1A, 0x0F } },
|
||||||
|
{ { 0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F },
|
||||||
|
{ 0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A },
|
||||||
|
{ 0x5C, 0x51, 0x3C, 0x9C, 0x48, 0x86, 0xC0, 0x88 } },
|
||||||
|
{ { 0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46 },
|
||||||
|
{ 0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32 },
|
||||||
|
{ 0x0A, 0x2A, 0xEE, 0xAE, 0x3F, 0xF4, 0xAB, 0x77 } },
|
||||||
|
{ { 0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E },
|
||||||
|
{ 0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA },
|
||||||
|
{ 0xEF, 0x1B, 0xF0, 0x3E, 0x5D, 0xFA, 0x57, 0x5A } },
|
||||||
|
{ { 0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76 },
|
||||||
|
{ 0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62 },
|
||||||
|
{ 0x88, 0xBF, 0x0D, 0xB6, 0xD7, 0x0D, 0xEE, 0x56 } },
|
||||||
|
{ { 0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07 },
|
||||||
|
{ 0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2 },
|
||||||
|
{ 0xA1, 0xF9, 0x91, 0x55, 0x41, 0x02, 0x0B, 0x56 } },
|
||||||
|
{ { 0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F },
|
||||||
|
{ 0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA },
|
||||||
|
{ 0x6F, 0xBF, 0x1C, 0xAF, 0xCF, 0xFD, 0x05, 0x56 } },
|
||||||
|
{ { 0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7 },
|
||||||
|
{ 0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92 },
|
||||||
|
{ 0x2F, 0x22, 0xE4, 0x9B, 0xAB, 0x7C, 0xA1, 0xAC } },
|
||||||
|
{ { 0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF },
|
||||||
|
{ 0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A },
|
||||||
|
{ 0x5A, 0x6B, 0x61, 0x2C, 0xC2, 0x6C, 0xCE, 0x4A } },
|
||||||
|
{ { 0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6 },
|
||||||
|
{ 0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2 },
|
||||||
|
{ 0x5F, 0x4C, 0x03, 0x8E, 0xD1, 0x2B, 0x2E, 0x41 } },
|
||||||
|
{ { 0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF },
|
||||||
|
{ 0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A },
|
||||||
|
{ 0x63, 0xFA, 0xC0, 0xD0, 0x34, 0xD9, 0xF7, 0x93 } }
|
||||||
|
};
|
||||||
Vendored
+56
@@ -0,0 +1,56 @@
|
|||||||
|
/* IDEA test vectors, from the ETH reference implementation */
|
||||||
|
|
||||||
|
/* The data structure for the ( key, plaintext, ciphertext ) triplets */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE key[ IDEA_KEYSIZE ];
|
||||||
|
BYTE plaintext[ IDEA_BLOCKSIZE ];
|
||||||
|
BYTE ciphertext[ IDEA_BLOCKSIZE ];
|
||||||
|
} IDEA_TEST;
|
||||||
|
|
||||||
|
static IDEA_TEST testIdea[] = {
|
||||||
|
{ { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
|
||||||
|
0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03 },
|
||||||
|
{ 0x11, 0xFB, 0xED, 0x2B, 0x01, 0x98, 0x6D, 0xE5 } },
|
||||||
|
{ { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
|
||||||
|
0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 },
|
||||||
|
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
|
||||||
|
{ 0x54, 0x0E, 0x5F, 0xEA, 0x18, 0xC2, 0xF8, 0xB1 } },
|
||||||
|
{ { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
|
||||||
|
0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 },
|
||||||
|
{ 0x00, 0x19, 0x32, 0x4B, 0x64, 0x7D, 0x96, 0xAF },
|
||||||
|
{ 0x9F, 0x0A, 0x0A, 0xB6, 0xE1, 0x0C, 0xED, 0x78 } },
|
||||||
|
{ { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
|
||||||
|
0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 },
|
||||||
|
{ 0xF5, 0x20, 0x2D, 0x5B, 0x9C, 0x67, 0x1B, 0x08 },
|
||||||
|
{ 0xCF, 0x18, 0xFD, 0x73, 0x55, 0xE2, 0xC5, 0xC5 } },
|
||||||
|
{ { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
|
||||||
|
0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 },
|
||||||
|
{ 0xFA, 0xE6, 0xD2, 0xBE, 0xAA, 0x96, 0x82, 0x6E },
|
||||||
|
{ 0x85, 0xDF, 0x52, 0x00, 0x56, 0x08, 0x19, 0x3D } },
|
||||||
|
{ { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
|
||||||
|
0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 },
|
||||||
|
{ 0x0A, 0x14, 0x1E, 0x28, 0x32, 0x3C, 0x46, 0x50 },
|
||||||
|
{ 0x2F, 0x7D, 0xE7, 0x50, 0x21, 0x2F, 0xB7, 0x34 } },
|
||||||
|
{ { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
|
||||||
|
0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 },
|
||||||
|
{ 0x05, 0x0A, 0x0F, 0x14, 0x19, 0x1E, 0x23, 0x28 },
|
||||||
|
{ 0x7B, 0x73, 0x14, 0x92, 0x5D, 0xE5, 0x9C, 0x09 } },
|
||||||
|
{ { 0x00, 0x05, 0x00, 0x0A, 0x00, 0x0F, 0x00, 0x14,
|
||||||
|
0x00, 0x19, 0x00, 0x1E, 0x00, 0x23, 0x00, 0x28 },
|
||||||
|
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
|
||||||
|
{ 0x3E, 0xC0, 0x47, 0x80, 0xBE, 0xFF, 0x6E, 0x20 } },
|
||||||
|
{ { 0x3A, 0x98, 0x4E, 0x20, 0x00, 0x19, 0x5D, 0xB3,
|
||||||
|
0x2E, 0xE5, 0x01, 0xC8, 0xC4, 0x7C, 0xEA, 0x60 },
|
||||||
|
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
|
||||||
|
{ 0x97, 0xBC, 0xD8, 0x20, 0x07, 0x80, 0xDA, 0x86 } },
|
||||||
|
{ { 0x00, 0x64, 0x00, 0xC8, 0x01, 0x2C, 0x01, 0x90,
|
||||||
|
0x01, 0xF4, 0x02, 0x58, 0x02, 0xBC, 0x03, 0x20 },
|
||||||
|
{ 0x05, 0x32, 0x0A, 0x64, 0x14, 0xC8, 0x19, 0xFA },
|
||||||
|
{ 0x65, 0xBE, 0x87, 0xE7, 0xA2, 0x53, 0x8A, 0xED } },
|
||||||
|
{ { 0x9D, 0x40, 0x75, 0xC1, 0x03, 0xBC, 0x32, 0x2A,
|
||||||
|
0xFB, 0x03, 0xE7, 0xBE, 0x6A, 0xB3, 0x00, 0x06 },
|
||||||
|
{ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 },
|
||||||
|
{ 0xF5, 0xDB, 0x1A, 0xC4, 0x5E, 0x5E, 0xF9, 0xF9 } }
|
||||||
|
};
|
||||||
Vendored
+162
@@ -0,0 +1,162 @@
|
|||||||
|
/* RC4 test vectors from the BSAFE2 implementation */
|
||||||
|
|
||||||
|
BYTE testRC4key1[] =
|
||||||
|
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
|
||||||
|
BYTE testRC4plaintext1[] =
|
||||||
|
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
|
||||||
|
BYTE testRC4ciphertext1[] =
|
||||||
|
{ 0x75, 0xB7, 0x87, 0x80, 0x99, 0xE0, 0xC5, 0x96 };
|
||||||
|
|
||||||
|
BYTE testRC4key2[] =
|
||||||
|
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
|
||||||
|
BYTE testRC4plaintext2[] =
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
BYTE testRC4ciphertext2[] =
|
||||||
|
{ 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79 };
|
||||||
|
|
||||||
|
BYTE testRC4key3[] =
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
BYTE testRC4plaintext3[] =
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
BYTE testRC4ciphertext3[] =
|
||||||
|
{ 0xDE, 0x18, 0x89, 0x41, 0xA3, 0x37, 0x5D, 0x3A };
|
||||||
|
|
||||||
|
BYTE testRC4key4[] =
|
||||||
|
{ 0xEF, 0x01, 0x23, 0x45 };
|
||||||
|
BYTE testRC4plaintext4[] =
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
BYTE testRC4ciphertext4[] =
|
||||||
|
{ 0xD6, 0xA1, 0x41, 0xA7, 0xEC, 0x3C, 0x38, 0xDF, 0xBD, 0x61 };
|
||||||
|
|
||||||
|
BYTE testRC4key5[] =
|
||||||
|
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
|
||||||
|
BYTE testRC4plaintext5[] =
|
||||||
|
{ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
|
||||||
|
BYTE testRC4ciphertext5[] =
|
||||||
|
{ 0x75, 0x95, 0xC3, 0xE6, 0x11, 0x4A, 0x09, 0x78,
|
||||||
|
0x0C, 0x4A, 0xD4, 0x52, 0x33, 0x8E, 0x1F, 0xFD,
|
||||||
|
0x9A, 0x1B, 0xE9, 0x49, 0x8F, 0x81, 0x3D, 0x76,
|
||||||
|
0x53, 0x34, 0x49, 0xB6, 0x77, 0x8D, 0xCA, 0xD8,
|
||||||
|
0xC7, 0x8A, 0x8D, 0x2B, 0xA9, 0xAC, 0x66, 0x08,
|
||||||
|
0x5D, 0x0E, 0x53, 0xD5, 0x9C, 0x26, 0xC2, 0xD1,
|
||||||
|
0xC4, 0x90, 0xC1, 0xEB, 0xBE, 0x0C, 0xE6, 0x6D,
|
||||||
|
0x1B, 0x6B, 0x1B, 0x13, 0xB6, 0xB9, 0x19, 0xB8,
|
||||||
|
0x47, 0xC2, 0x5A, 0x91, 0x44, 0x7A, 0x95, 0xE7,
|
||||||
|
0x5E, 0x4E, 0xF1, 0x67, 0x79, 0xCD, 0xE8, 0xBF,
|
||||||
|
0x0A, 0x95, 0x85, 0x0E, 0x32, 0xAF, 0x96, 0x89,
|
||||||
|
0x44, 0x4F, 0xD3, 0x77, 0x10, 0x8F, 0x98, 0xFD,
|
||||||
|
0xCB, 0xD4, 0xE7, 0x26, 0x56, 0x75, 0x00, 0x99,
|
||||||
|
0x0B, 0xCC, 0x7E, 0x0C, 0xA3, 0xC4, 0xAA, 0xA3,
|
||||||
|
0x04, 0xA3, 0x87, 0xD2, 0x0F, 0x3B, 0x8F, 0xBB,
|
||||||
|
0xCD, 0x42, 0xA1, 0xBD, 0x31, 0x1D, 0x7A, 0x43,
|
||||||
|
0x03, 0xDD, 0xA5, 0xAB, 0x07, 0x88, 0x96, 0xAE,
|
||||||
|
0x80, 0xC1, 0x8B, 0x0A, 0xF6, 0x6D, 0xFF, 0x31,
|
||||||
|
0x96, 0x16, 0xEB, 0x78, 0x4E, 0x49, 0x5A, 0xD2,
|
||||||
|
0xCE, 0x90, 0xD7, 0xF7, 0x72, 0xA8, 0x17, 0x47,
|
||||||
|
0xB6, 0x5F, 0x62, 0x09, 0x3B, 0x1E, 0x0D, 0xB9,
|
||||||
|
0xE5, 0xBA, 0x53, 0x2F, 0xAF, 0xEC, 0x47, 0x50,
|
||||||
|
0x83, 0x23, 0xE6, 0x71, 0x32, 0x7D, 0xF9, 0x44,
|
||||||
|
0x44, 0x32, 0xCB, 0x73, 0x67, 0xCE, 0xC8, 0x2F,
|
||||||
|
0x5D, 0x44, 0xC0, 0xD0, 0x0B, 0x67, 0xD6, 0x50,
|
||||||
|
0xA0, 0x75, 0xCD, 0x4B, 0x70, 0xDE, 0xDD, 0x77,
|
||||||
|
0xEB, 0x9B, 0x10, 0x23, 0x1B, 0x6B, 0x5B, 0x74,
|
||||||
|
0x13, 0x47, 0x39, 0x6D, 0x62, 0x89, 0x74, 0x21,
|
||||||
|
0xD4, 0x3D, 0xF9, 0xB4, 0x2E, 0x44, 0x6E, 0x35,
|
||||||
|
0x8E, 0x9C, 0x11, 0xA9, 0xB2, 0x18, 0x4E, 0xCB,
|
||||||
|
0xEF, 0x0C, 0xD8, 0xE7, 0xA8, 0x77, 0xEF, 0x96,
|
||||||
|
0x8F, 0x13, 0x90, 0xEC, 0x9B, 0x3D, 0x35, 0xA5,
|
||||||
|
0x58, 0x5C, 0xB0, 0x09, 0x29, 0x0E, 0x2F, 0xCD,
|
||||||
|
0xE7, 0xB5, 0xEC, 0x66, 0xD9, 0x08, 0x4B, 0xE4,
|
||||||
|
0x40, 0x55, 0xA6, 0x19, 0xD9, 0xDD, 0x7F, 0xC3,
|
||||||
|
0x16, 0x6F, 0x94, 0x87, 0xF7, 0xCB, 0x27, 0x29,
|
||||||
|
0x12, 0x42, 0x64, 0x45, 0x99, 0x85, 0x14, 0xC1,
|
||||||
|
0x5D, 0x53, 0xA1, 0x8C, 0x86, 0x4C, 0xE3, 0xA2,
|
||||||
|
0xB7, 0x55, 0x57, 0x93, 0x98, 0x81, 0x26, 0x52,
|
||||||
|
0x0E, 0xAC, 0xF2, 0xE3, 0x06, 0x6E, 0x23, 0x0C,
|
||||||
|
0x91, 0xBE, 0xE4, 0xDD, 0x53, 0x04, 0xF5, 0xFD,
|
||||||
|
0x04, 0x05, 0xB3, 0x5B, 0xD9, 0x9C, 0x73, 0x13,
|
||||||
|
0x5D, 0x3D, 0x9B, 0xC3, 0x35, 0xEE, 0x04, 0x9E,
|
||||||
|
0xF6, 0x9B, 0x38, 0x67, 0xBF, 0x2D, 0x7B, 0xD1,
|
||||||
|
0xEA, 0xA5, 0x95, 0xD8, 0xBF, 0xC0, 0x06, 0x6F,
|
||||||
|
0xF8, 0xD3, 0x15, 0x09, 0xEB, 0x0C, 0x6C, 0xAA,
|
||||||
|
0x00, 0x6C, 0x80, 0x7A, 0x62, 0x3E, 0xF8, 0x4C,
|
||||||
|
0x3D, 0x33, 0xC1, 0x95, 0xD2, 0x3E, 0xE3, 0x20,
|
||||||
|
0xC4, 0x0D, 0xE0, 0x55, 0x81, 0x57, 0xC8, 0x22,
|
||||||
|
0xD4, 0xB8, 0xC5, 0x69, 0xD8, 0x49, 0xAE, 0xD5,
|
||||||
|
0x9D, 0x4E, 0x0F, 0xD7, 0xF3, 0x79, 0x58, 0x6B,
|
||||||
|
0x4B, 0x7F, 0xF6, 0x84, 0xED, 0x6A, 0x18, 0x9F,
|
||||||
|
0x74, 0x86, 0xD4, 0x9B, 0x9C, 0x4B, 0xAD, 0x9B,
|
||||||
|
0xA2, 0x4B, 0x96, 0xAB, 0xF9, 0x24, 0x37, 0x2C,
|
||||||
|
0x8A, 0x8F, 0xFF, 0xB1, 0x0D, 0x55, 0x35, 0x49,
|
||||||
|
0x00, 0xA7, 0x7A, 0x3D, 0xB5, 0xF2, 0x05, 0xE1,
|
||||||
|
0xB9, 0x9F, 0xCD, 0x86, 0x60, 0x86, 0x3A, 0x15,
|
||||||
|
0x9A, 0xD4, 0xAB, 0xE4, 0x0F, 0xA4, 0x89, 0x34,
|
||||||
|
0x16, 0x3D, 0xDD, 0xE5, 0x42, 0xA6, 0x58, 0x55,
|
||||||
|
0x40, 0xFD, 0x68, 0x3C, 0xBF, 0xD8, 0xC0, 0x0F,
|
||||||
|
0x12, 0x12, 0x9A, 0x28, 0x4D, 0xEA, 0xCC, 0x4C,
|
||||||
|
0xDE, 0xFE, 0x58, 0xBE, 0x71, 0x37, 0x54, 0x1C,
|
||||||
|
0x04, 0x71, 0x26, 0xC8, 0xD4, 0x9E, 0x27, 0x55,
|
||||||
|
0xAB, 0x18, 0x1A, 0xB7, 0xE9, 0x40, 0xB0, 0xC0 };
|
||||||
Vendored
+36
@@ -0,0 +1,36 @@
|
|||||||
|
/* SAFER-SK64 test vectors, from the ETH reference implementation */
|
||||||
|
|
||||||
|
/* The data structure for the ( key, plaintext, ciphertext ) triplets */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int rounds;
|
||||||
|
BYTE key[ SAFER_KEYSIZE ];
|
||||||
|
BYTE plaintext[ SAFER_BLOCKSIZE ];
|
||||||
|
BYTE ciphertext[ SAFER_BLOCKSIZE ];
|
||||||
|
} SAFER_TEST;
|
||||||
|
|
||||||
|
static SAFER_TEST testSafer[] = {
|
||||||
|
{ SAFER_K64_DEFAULT_NOF_ROUNDS,
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
|
||||||
|
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
|
||||||
|
{ 0x15, 0x1B, 0xFF, 0x02, 0xAD, 0x11, 0xBF, 0x2D } },
|
||||||
|
{ SAFER_K64_DEFAULT_NOF_ROUNDS,
|
||||||
|
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
|
||||||
|
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
|
||||||
|
{ 0x5F, 0xCE, 0x9B, 0xA2, 0x05, 0x84, 0x38, 0xC7 } },
|
||||||
|
{ SAFER_K128_DEFAULT_NOF_ROUNDS,
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
|
||||||
|
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
|
||||||
|
{ 0x41, 0x4C, 0x54, 0x5A, 0xB6, 0x99, 0x4A, 0xF7 } },
|
||||||
|
{ SAFER_K128_DEFAULT_NOF_ROUNDS,
|
||||||
|
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
|
||||||
|
{ 0xFF, 0x78, 0x11, 0xE4, 0xB3, 0xA7, 0x2E, 0x71 } },
|
||||||
|
{ SAFER_K128_DEFAULT_NOF_ROUNDS,
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
|
||||||
|
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },
|
||||||
|
{ 0x49, 0xC9, 0x9D, 0x98, 0xA5, 0xBC, 0x59, 0x08 } },
|
||||||
|
};
|
||||||
@@ -0,0 +1,193 @@
|
|||||||
|
/*
|
||||||
|
* UNDES V1.1.0 - reconstructed from undes.exe
|
||||||
|
* Original executable: (C) 1998 H.N.M. Dijkema, GPL
|
||||||
|
*
|
||||||
|
* IMPORTANT: despite the program name, the executable selects
|
||||||
|
* CRYPT_ALGO_3DES + CRYPT_MODE_CBC, i.e. two-key triple DES in CBC mode.
|
||||||
|
*
|
||||||
|
* This is reconstructed source, not the original source text. Control flow,
|
||||||
|
* constants, CRYPTLIB calls and file-format behaviour are derived from the
|
||||||
|
* 16-bit Turbo C executable and verified against CRYPTLIB 0.99 source.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <io.h>
|
||||||
|
#include "crypt.h"
|
||||||
|
#include "des_common.h"
|
||||||
|
|
||||||
|
int main( int argc, char **argv )
|
||||||
|
{
|
||||||
|
char *password;
|
||||||
|
char *inputName;
|
||||||
|
char *outputName;
|
||||||
|
FILE *input;
|
||||||
|
FILE *output;
|
||||||
|
unsigned char *buffer;
|
||||||
|
unsigned char *payload;
|
||||||
|
BYTE key[ CRYPT_MAX_KEYSIZE ];
|
||||||
|
BYTE iv[ CRYPT_MAX_IVSIZE ];
|
||||||
|
BYTE passwordBlock[ CRYPT_MAX_KEYSIZE ];
|
||||||
|
CRYPT_INFO cryptInfo;
|
||||||
|
CRYPT_QUERY_INFO queryInfo;
|
||||||
|
CRYPT_ALGO algorithm = CRYPT_ALGO_3DES;
|
||||||
|
CRYPT_MODE mode = CRYPT_MODE_CBC;
|
||||||
|
DES_INT32 fileVersion;
|
||||||
|
DES_INT32 plainLength;
|
||||||
|
int keySize;
|
||||||
|
int ivSize;
|
||||||
|
int bytesRead;
|
||||||
|
int firstTime;
|
||||||
|
int inputFd;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if( argc == 2 )
|
||||||
|
{
|
||||||
|
if( strcmp( argv[ 1 ], "--copyright" ) == 0 )
|
||||||
|
{
|
||||||
|
printf( "%s\n\n", desProgramVersion );
|
||||||
|
printf( "%s", desCopyrightText );
|
||||||
|
exit( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( strcmp( argv[ 1 ], "--version" ) == 0 )
|
||||||
|
{
|
||||||
|
printf( "%s\n", desProgramVersion );
|
||||||
|
exit( 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( argc != 4 )
|
||||||
|
{
|
||||||
|
fprintf( stderr,
|
||||||
|
"usage: undes <passwd> <file in> <file out>\n"
|
||||||
|
" undes --copyright\n"
|
||||||
|
" undes --version\n"
|
||||||
|
" '-' for file --> stdin/stdout\n" );
|
||||||
|
exit( argc == 1 ? 0 : 2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
password = argv[ 1 ];
|
||||||
|
inputName = argv[ 2 ];
|
||||||
|
outputName = argv[ 3 ];
|
||||||
|
|
||||||
|
if( strcmp( inputName, "-" ) != 0 &&
|
||||||
|
strcmp( inputName, outputName ) == 0 )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "<file in> and <file out> cannot be the same\n" );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
input = ( strcmp( inputName, "-" ) == 0 ) ?
|
||||||
|
stdin : fopen( inputName, "rb" );
|
||||||
|
output = ( strcmp( outputName, "-" ) == 0 ) ?
|
||||||
|
stdout : fopen( outputName, "wb" );
|
||||||
|
|
||||||
|
checkOpen( input, inputName );
|
||||||
|
checkOpen( output, outputName );
|
||||||
|
|
||||||
|
algorithm = CRYPT_ALGO_3DES;
|
||||||
|
mode = CRYPT_MODE_CBC;
|
||||||
|
firstTime = TRUE;
|
||||||
|
|
||||||
|
buffer = (unsigned char *) malloc( DES_BUFFER_SIZE );
|
||||||
|
if( buffer == NULL )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Can't allocate buffer\n" );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
payload = buffer + DES_PREFIX_SIZE;
|
||||||
|
|
||||||
|
initLibrary();
|
||||||
|
|
||||||
|
queryAlgoModeInformation( algorithm, mode, &queryInfo );
|
||||||
|
keySize = queryInfo.keySize; /* 14 bytes */
|
||||||
|
ivSize = queryInfo.ivSize; /* 4 bytes */
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while( i < keySize && password[ i ] != '\0' )
|
||||||
|
{
|
||||||
|
key[ i ] = (BYTE) password[ i ];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
while( i < keySize )
|
||||||
|
key[ i++ ] = 0;
|
||||||
|
|
||||||
|
fileVersion = (DES_INT32) -1;
|
||||||
|
inputFd = fileno( input );
|
||||||
|
|
||||||
|
bytesRead = read( inputFd, &fileVersion, 4 );
|
||||||
|
checkRead( bytesRead );
|
||||||
|
checkVersion( fileVersion );
|
||||||
|
|
||||||
|
initCryptContext( &cryptInfo, algorithm, mode );
|
||||||
|
loadCryptContext( &cryptInfo, key, keySize );
|
||||||
|
|
||||||
|
queryContextInformation( &cryptInfo, &queryInfo );
|
||||||
|
ivSize = queryInfo.ivSize;
|
||||||
|
|
||||||
|
bytesRead = read( inputFd, iv, ivSize );
|
||||||
|
checkRead( bytesRead );
|
||||||
|
loadIV( &cryptInfo, iv, ivSize );
|
||||||
|
|
||||||
|
bytesRead = read( inputFd, passwordBlock, CRYPT_MAX_KEYSIZE );
|
||||||
|
checkRead( bytesRead );
|
||||||
|
|
||||||
|
bytesRead = read( inputFd, buffer, DES_BUFFER_SIZE );
|
||||||
|
checkRead( bytesRead );
|
||||||
|
|
||||||
|
while( bytesRead != 0 )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* This ordering is intentional. DES encrypts the first data block
|
||||||
|
* before passwordBlock, although passwordBlock is stored first in the
|
||||||
|
* file. Decrypting in the same crypto order preserves CBC state.
|
||||||
|
*/
|
||||||
|
decryptBuffer( &cryptInfo, buffer, DES_BUFFER_SIZE );
|
||||||
|
|
||||||
|
memcpy( &plainLength, buffer, 4 );
|
||||||
|
if( plainLength < 0 )
|
||||||
|
plainLength = DES_PAYLOAD_SIZE;
|
||||||
|
|
||||||
|
if( firstTime )
|
||||||
|
{
|
||||||
|
decryptBuffer( &cryptInfo, passwordBlock, CRYPT_MAX_KEYSIZE );
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while( i < keySize && passwordBlock[ i ] == key[ i ] )
|
||||||
|
i++;
|
||||||
|
|
||||||
|
if( i != keySize )
|
||||||
|
{
|
||||||
|
fprintf( stderr,
|
||||||
|
"Password is not correct, no decryption possible\n" );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
firstTime = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
fwrite( payload, (DES_UINT16) plainLength, 1, output );
|
||||||
|
checkWrite( output );
|
||||||
|
fflush( output );
|
||||||
|
|
||||||
|
bytesRead = read( inputFd, buffer, DES_BUFFER_SIZE );
|
||||||
|
checkRead( bytesRead );
|
||||||
|
}
|
||||||
|
|
||||||
|
decryptBuffer( &cryptInfo, buffer, 0 );
|
||||||
|
|
||||||
|
destroyCryptContext( &cryptInfo );
|
||||||
|
endLibrary();
|
||||||
|
|
||||||
|
free( buffer );
|
||||||
|
|
||||||
|
if( input != stdin )
|
||||||
|
fclose( input );
|
||||||
|
if( output != stdout )
|
||||||
|
fclose( output );
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
# Validation
|
||||||
|
|
||||||
|
The reconstructed sources were checked in two ways.
|
||||||
|
|
||||||
|
## 1. Header/API syntax check
|
||||||
|
|
||||||
|
`des.c`, `undes.c` and the common support compile syntactically against the
|
||||||
|
actual `crypt.h` from the supplied `cryptl99.zip`. There are no remaining
|
||||||
|
placeholder CRYPTLIB declarations.
|
||||||
|
|
||||||
|
## 2. Full CRYPTLIB round-trip on a modern compiler
|
||||||
|
|
||||||
|
For a behavioural sanity check, the supplied CRYPTLIB 0.99 source and libdes
|
||||||
|
3.14 source were compiled with GCC 14.2 together with the reconstruction.
|
||||||
|
|
||||||
|
A binary test file was then processed as:
|
||||||
|
|
||||||
|
```text
|
||||||
|
plain.bin -> des_v2 -> encrypted.bin -> undes_v2 -> roundtrip.bin
|
||||||
|
```
|
||||||
|
|
||||||
|
`plain.bin` and `roundtrip.bin` compare byte-for-byte equal.
|
||||||
|
|
||||||
|
The generated single-block encrypted file has the expected size:
|
||||||
|
|
||||||
|
```text
|
||||||
|
4 version
|
||||||
|
4 IV
|
||||||
|
256 password-check block
|
||||||
|
16384 encrypted data block
|
||||||
|
-----
|
||||||
|
16648 bytes total
|
||||||
|
```
|
||||||
|
|
||||||
|
The prefix begins with `75 27 00 00`, i.e. file version `0x00002775` in the
|
||||||
|
little-endian format used by the DOS executable.
|
||||||
|
|
||||||
|
A second test with an incorrect password exits with status 1 and prints the
|
||||||
|
same executable string:
|
||||||
|
|
||||||
|
`Password is not correct, no decryption possible`
|
||||||
|
|
||||||
|
## Scope of this validation
|
||||||
|
|
||||||
|
This confirms that the reconstructed control flow is internally consistent
|
||||||
|
with the supplied CRYPTLIB source. It does **not** prove that a modern GCC
|
||||||
|
build produces ciphertext byte-for-byte identical to the original Turbo C
|
||||||
|
build. The strongest compatibility test would be to decrypt an actual file
|
||||||
|
created by the 1998 `des.exe`, or run the original executable in a DOS
|
||||||
|
environment and compare outputs.
|
||||||
Reference in New Issue
Block a user