test failed
#include <malloc.h>
#include <string.h>
#include <cstdio>
#include <stdlib.h>
#include <cassert>
#include <cstdlib>
#include "des.h"
void c(const char* const src, char* const dst, const int size, const key_set* const key_sets, int m) {
char buf_src[8], buf_dst[8];
int block = size / 8;
int mod = size % 8;
memcpy(dst + block * 8, src + block * 8, mod);
for (int i = 0; i < block; ++i) {
memcpy(buf_src, src + i * 8, 8);
process_message((unsigned char *) buf_src, (unsigned char *) buf_dst, (key_set *) key_sets, m);
memcpy(dst + i * 8, buf_dst, 8);
}
}
void c(const char* const src, char* const dst, const int size, int m) {
char key1[] = {-5, 11, 24, -51, 34, 46, 98, -104};
char key2[] = {-51, 101, 44, -21, 54, 47, 91, -114};
char key3[] = {-57, 111, 27, -81, 38, 66, 58, -14};
key_set* key_sets1 = (key_set*)malloc(17 * sizeof(key_set));
key_set* key_sets2 = (key_set*)malloc(17 * sizeof(key_set));
key_set* key_sets3 = (key_set*)malloc(17 * sizeof(key_set));
generate_sub_keys((unsigned char *) key1, key_sets1);
generate_sub_keys((unsigned char *) key2, key_sets2);
generate_sub_keys((unsigned char *) key3, key_sets3);
if (m == ENCRYPTION_MODE) {
c(src, dst, size, key_sets1, m);
c(dst, dst, size, key_sets2, m);
c(dst, dst, size, key_sets3, m);
} else {
c(src, dst, size, key_sets3, m);
c(dst, dst, size, key_sets2, m);
c(dst, dst, size, key_sets1, m);
}
free(key_sets1);
free(key_sets2);
free(key_sets3);
}
bool test(char* src, int size) {
char* dst = new char[size];
char* dst2 = new char[size];
c(src, dst, size, ENCRYPTION_MODE);
c(dst, dst2, size, DECRYPTION_MODE);
for (int i = 0; i < size; ++i) {
if (dst2[i] != src[i]) {
delete [] dst;
delete [] dst2;
return false;
}
}
delete [] dst;
delete [] dst2;
return true;
}
int main(int argc, char** argv) {
for (int i = 0; i < 1000; ++i) {
int size = rand() % 9999;
unsigned char* src = new unsigned char[size];
for (int s = 0; s < size; ++s) {
src[s] = rand() % 256;
}
if (!test((char*)src, size)) {
printf("bug:%d,count:%d\n", i, size);
}
delete [] src;
}
return 0;
}
result bug:201,count:3066 os windows 10 compiler E:\workplace\sample\jni-classloader\src\main\java>g++ -v Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=C:/Program\ Files/mingw-w64/x86_64-6.2.0-posix-seh-rt_v5- rev1/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/6.2.0/lto-wrapper.exe Target: x86_64-w64-mingw32 Configured with: ../../../src/gcc-6.2.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw620/x86_64-620-posix-seh-rt_v5-rev1/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-isl-version-check --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw620/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw620/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw620/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw620/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh-rev1, Built by MinGW-W64 project' --with-bugurl=http://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -I/c/mingw620/x86_64-620-posix-seh-rt_v5-rev1/mingw64/opt/include -I/c/mingw620/prerequisites/x86_64-zlib-static/include -I/c/mingw620/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -I/c/mingw620/x86_64-620-posix-seh-rt_v5-rev1/mingw64/opt/include -I/c/mingw620/prerequisites/x86_64-zlib-static/include -I/c/mingw620/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS= LDFLAGS='-pipe -L/c/mingw620/x86_64-620-posix-seh-rt_v5-rev1/mingw64/opt/lib -L/c/mingw620/prerequisites/x86_64-zlib-static/lib -L/c/mingw620/prerequisites/x86_64-w64-mingw32- static/lib ' Thread model: posix gcc version 6.2.0 (x86_64-posix-seh-rev1, Built by MinGW-W64 project)
This is actually related to #7 - fix that and this problem goes away (confirmed with testing).