diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5503d83..4d18488 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -67,6 +67,20 @@ set(TOMCRYPT_FILES
src/libtomcrypt/src/pk/asn1/der_decode_short_integer.c
src/libtomcrypt/src/pk/asn1/der_decode_utctime.c
src/libtomcrypt/src/pk/asn1/der_decode_utf8_string.c
+ src/libtomcrypt/src/pk/asn1/der_encode_bit_string.c
+ src/libtomcrypt/src/pk/asn1/der_encode_boolean.c
+ src/libtomcrypt/src/pk/asn1/der_encode_ia5_string.c
+ src/libtomcrypt/src/pk/asn1/der_encode_integer.c
+ src/libtomcrypt/src/pk/asn1/der_encode_object_identifier.c
+ src/libtomcrypt/src/pk/asn1/der_encode_octet_string.c
+ src/libtomcrypt/src/pk/asn1/der_encode_printable_string.c
+ src/libtomcrypt/src/pk/asn1/der_encode_sequence_ex.c
+ src/libtomcrypt/src/pk/asn1/der_encode_sequence_multi.c
+ src/libtomcrypt/src/pk/asn1/der_encode_set.c
+ src/libtomcrypt/src/pk/asn1/der_encode_setof.c
+ src/libtomcrypt/src/pk/asn1/der_encode_short_integer.c
+ src/libtomcrypt/src/pk/asn1/der_encode_utctime.c
+ src/libtomcrypt/src/pk/asn1/der_encode_utf8_string.c
src/libtomcrypt/src/pk/asn1/der_length_bit_string.c
src/libtomcrypt/src/pk/asn1/der_length_boolean.c
src/libtomcrypt/src/pk/asn1/der_length_ia5_string.c
@@ -88,11 +102,14 @@ set(TOMCRYPT_FILES
src/libtomcrypt/src/pk/pkcs1/pkcs_1_mgf1.c
src/libtomcrypt/src/pk/pkcs1/pkcs_1_oaep_decode.c
src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_decode.c
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_encode.c
src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_decode.c
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_encode.c
src/libtomcrypt/src/pk/rsa/rsa_exptmod.c
src/libtomcrypt/src/pk/rsa/rsa_free.c
src/libtomcrypt/src/pk/rsa/rsa_import.c
src/libtomcrypt/src/pk/rsa/rsa_make_key.c
+ src/libtomcrypt/src/pk/rsa/rsa_sign_hash.c
src/libtomcrypt/src/pk/rsa/rsa_verify_hash.c
)
diff --git a/Makefile.linux b/Makefile.linux
index 46cdd1c..c588d61 100644
--- a/Makefile.linux
+++ b/Makefile.linux
@@ -28,8 +28,9 @@ CFLAGS = -fPIC -D_7ZIP_ST
CFLAGS += $(OFLAGS) $(DFLAGS)
OBJS = src/adpcm/adpcm.o \
- src/FileStream.o \
src/huffman/huff.o \
+ src/sparse/sparse.o \
+ src/FileStream.o \
src/SBaseCommon.o \
src/SBaseDumpData.o \
src/SBaseFileTable.o \
@@ -47,8 +48,7 @@ OBJS = src/adpcm/adpcm.o \
src/SFileOpenFileEx.o \
src/SFilePatchArchives.o \
src/SFileReadFile.o \
- src/SFileVerify.o \
- src/sparse/sparse.o
+ src/SFileVerify.o
COBJS = src/libtomcrypt/src/hashes/sha1.o \
src/libtomcrypt/src/hashes/hash_memory.o \
@@ -69,48 +69,65 @@ COBJS = src/libtomcrypt/src/hashes/sha1.o \
src/libtomcrypt/src/math/multi.o \
src/libtomcrypt/src/math/ltm_desc.o \
src/libtomcrypt/src/math/rand_prime.o \
- src/libtomcrypt/src/pk/asn1/der_length_ia5_string.o \
- src/libtomcrypt/src/pk/asn1/der_decode_utctime.o \
- src/libtomcrypt/src/pk/asn1/der_length_boolean.o \
- src/libtomcrypt/src/pk/asn1/der_decode_object_identifier.o \
- src/libtomcrypt/src/pk/asn1/der_decode_sequence_multi.o \
- src/libtomcrypt/src/pk/asn1/der_decode_octet_string.o \
- src/libtomcrypt/src/pk/asn1/der_length_object_identifier.o \
- src/libtomcrypt/src/pk/asn1/der_length_bit_string.o \
- src/libtomcrypt/src/pk/asn1/der_decode_ia5_string.o \
- src/libtomcrypt/src/pk/asn1/der_length_integer.o \
- src/libtomcrypt/src/pk/asn1/der_length_sequence.o \
- src/libtomcrypt/src/pk/asn1/der_decode_choice.o \
- src/libtomcrypt/src/pk/asn1/der_length_octet_string.o \
- src/libtomcrypt/src/pk/asn1/der_decode_sequence_flexi.o \
- src/libtomcrypt/src/pk/asn1/der_decode_printable_string.o \
src/libtomcrypt/src/pk/asn1/der_decode_bit_string.o \
- src/libtomcrypt/src/pk/asn1/der_decode_short_integer.o \
- src/libtomcrypt/src/pk/asn1/der_length_utctime.o \
- src/libtomcrypt/src/pk/asn1/der_decode_utf8_string.o \
- src/libtomcrypt/src/pk/asn1/der_decode_integer.o \
src/libtomcrypt/src/pk/asn1/der_decode_boolean.o \
- src/libtomcrypt/src/pk/asn1/der_sequence_free.o \
- src/libtomcrypt/src/pk/asn1/der_decode_sequence_ex.o \
- src/libtomcrypt/src/pk/asn1/der_length_short_integer.o \
- src/libtomcrypt/src/pk/asn1/der_length_printable_string.o \
- src/libtomcrypt/src/pk/asn1/der_length_utf8_string.o \
- src/libtomcrypt/src/pk/rsa/rsa_make_key.o \
- src/libtomcrypt/src/pk/rsa/rsa_free.o \
- src/libtomcrypt/src/pk/rsa/rsa_verify_simple.o \
- src/libtomcrypt/src/pk/rsa/rsa_import.o \
- src/libtomcrypt/src/pk/rsa/rsa_verify_hash.o \
- src/libtomcrypt/src/pk/rsa/rsa_exptmod.o \
- src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_decode.o \
- src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_decode.o \
- src/libtomcrypt/src/pk/pkcs1/pkcs_1_mgf1.o \
- src/libtomcrypt/src/pk/pkcs1/pkcs_1_oaep_decode.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_choice.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_ia5_string.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_object_identifier.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_octet_string.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_printable_string.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_sequence_ex.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_sequence_flexi.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_sequence_multi.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_short_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_utctime.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_utf8_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_bit_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_boolean.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_ia5_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_object_identifier.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_octet_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_printable_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_sequence_ex.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_sequence_multi.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_set.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_setof.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_short_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_utctime.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_utf8_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_bit_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_boolean.o \
+ src/libtomcrypt/src/pk/asn1/der_length_ia5_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_length_object_identifier.o \
+ src/libtomcrypt/src/pk/asn1/der_length_octet_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_printable_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_sequence.o \
+ src/libtomcrypt/src/pk/asn1/der_length_utctime.o \
+ src/libtomcrypt/src/pk/asn1/der_sequence_free.o \
+ src/libtomcrypt/src/pk/asn1/der_length_utf8_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_short_integer.o \
src/libtomcrypt/src/pk/ecc/ltc_ecc_projective_dbl_point.o \
src/libtomcrypt/src/pk/ecc/ltc_ecc_mulmod.o \
src/libtomcrypt/src/pk/ecc/ltc_ecc_projective_add_point.o \
src/libtomcrypt/src/pk/ecc/ltc_ecc_map.o \
src/libtomcrypt/src/pk/ecc/ltc_ecc_points.o \
src/libtomcrypt/src/pk/ecc/ltc_ecc_mul2add.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_decode.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_encode.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_decode.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_encode.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_mgf1.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_oaep_decode.o \
+ src/libtomcrypt/src/pk/rsa/rsa_make_key.o \
+ src/libtomcrypt/src/pk/rsa/rsa_free.o \
+ src/libtomcrypt/src/pk/rsa/rsa_verify_simple.o \
+ src/libtomcrypt/src/pk/rsa/rsa_import.o \
+ src/libtomcrypt/src/pk/rsa/rsa_verify_hash.o \
+ src/libtomcrypt/src/pk/rsa/rsa_sign_hash.o \
+ src/libtomcrypt/src/pk/rsa/rsa_exptmod.o \
src/libtommath/bn_mp_exptmod_fast.o \
src/libtommath/bn_mp_jacobi.o \
src/libtommath/bn_mp_mod.o \
diff --git a/Makefile.mac b/Makefile.mac
index f024f2c..b5c59db 100644
--- a/Makefile.mac
+++ b/Makefile.mac
@@ -19,215 +19,241 @@ ARFLAGS= rcs
LIBRARY = libStorm.dylib
-OBJS_CPP = src/adpcm/adpcm.obj \
- src/huffman/huff.obj \
- src/sparse/sparse.obj \
- src/FileStream.obj \
- src/SBaseCommon.o \
- src/SBaseDumpData.o \
- src/SBaseFileTable.o \
- src/SBaseSubTypes.o \
- src/SCompression.obj \
- src/SFileAddFile.obj \
- src/SFileAttributes.obj \
- src/SFileCompactArchive.obj \
- src/SFileCreateArchive.obj \
- src/SFileExtractFile.obj \
- src/SFileFindFile.obj \
- src/SFileGetFileInfo.obj \
- src/SFileListFile.obj \
- src/SFileOpenArchive.obj \
- src/SFileOpenFileEx.obj \
- src/SFilePatchArchives.obj \
- src/SFileReadFile.obj \
- src/SFileVerify.obj
+OBJS = src/adpcm/adpcm.o \
+ src/huffman/huff.o \
+ src/sparse/sparse.o \
+ src/FileStream.o \
+ src/SBaseCommon.o \
+ src/SBaseDumpData.o \
+ src/SBaseFileTable.o \
+ src/SBaseSubTypes.o \
+ src/SCompression.o \
+ src/SFileAddFile.o \
+ src/SFileAttributes.o \
+ src/SFileCompactArchive.o \
+ src/SFileCreateArchive.o \
+ src/SFileExtractFile.o \
+ src/SFileFindFile.o \
+ src/SFileGetFileInfo.o \
+ src/SFileListFile.o \
+ src/SFileOpenArchive.o \
+ src/SFileOpenFileEx.o \
+ src/SFilePatchArchives.o \
+ src/SFileReadFile.o \
+ src/SFileVerify.o
-
-OBJS_C = src/jenkins/lookup3.o \
- src/libtomcrypt/src/hashes/hash_memory.obj \
- src/libtomcrypt/src/hashes/md5.obj \
- src/libtomcrypt/src/hashes/sha1.obj\
- src/libtomcrypt/src/math/ltm_desc.obj \
- src/libtomcrypt/src/math/multi.obj \
- src/libtomcrypt/src/math/rand_prime.obj \
- src/libtomcrypt/src/misc/base64_decode.obj \
- src/libtomcrypt/src/misc/crypt_argchk.obj \
- src/libtomcrypt/src/misc/crypt_find_hash.obj \
- src/libtomcrypt/src/misc/crypt_find_prng.obj \
- src/libtomcrypt/src/misc/crypt_hash_descriptor.obj \
- src/libtomcrypt/src/misc/crypt_hash_is_valid.obj \
- src/libtomcrypt/src/misc/crypt_libc.obj \
- src/libtomcrypt/src/misc/crypt_ltc_mp_descriptor.obj \
- src/libtomcrypt/src/misc/crypt_prng_descriptor.obj \
- src/libtomcrypt/src/misc/crypt_prng_is_valid.obj \
- src/libtomcrypt/src/misc/crypt_register_hash.obj \
- src/libtomcrypt/src/misc/crypt_register_prng.obj \
- src/libtomcrypt/src/misc/zeromem.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_bit_string.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_boolean.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_choice.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_ia5_string.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_integer.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_object_identifier.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_octet_string.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_printable_string.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_sequence_ex.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_sequence_flexi.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_sequence_multi.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_short_integer.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_utctime.obj \
- src/libtomcrypt/src/pk/asn1/der_decode_utf8_string.obj \
- src/libtomcrypt/src/pk/asn1/der_length_bit_string.obj \
- src/libtomcrypt/src/pk/asn1/der_length_boolean.obj \
- src/libtomcrypt/src/pk/asn1/der_length_ia5_string.obj \
- src/libtomcrypt/src/pk/asn1/der_length_integer.obj \
- src/libtomcrypt/src/pk/asn1/der_length_object_identifier.obj \
- src/libtomcrypt/src/pk/asn1/der_length_octet_string.obj \
- src/libtomcrypt/src/pk/asn1/der_length_printable_string.obj \
- src/libtomcrypt/src/pk/asn1/der_length_sequence.obj \
- src/libtomcrypt/src/pk/asn1/der_length_short_integer.obj \
- src/libtomcrypt/src/pk/asn1/der_length_utctime.obj \
- src/libtomcrypt/src/pk/asn1/der_length_utf8_string.obj \
- src/libtomcrypt/src/pk/asn1/der_sequence_free.obj \
- src/libtomcrypt/src/pk/ecc/ltc_ecc_map.obj \
- src/libtomcrypt/src/pk/ecc/ltc_ecc_mul2add.obj \
- src/libtomcrypt/src/pk/ecc/ltc_ecc_mulmod.obj \
- src/libtomcrypt/src/pk/ecc/ltc_ecc_points.obj \
- src/libtomcrypt/src/pk/ecc/ltc_ecc_projective_add_point.obj \
- src/libtomcrypt/src/pk/ecc/ltc_ecc_projective_dbl_point.obj \
- src/libtomcrypt/src/pk/pkcs1/pkcs_1_mgf1.obj \
- src/libtomcrypt/src/pk/pkcs1/pkcs_1_oaep_decode.obj \
- src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_decode.obj \
- src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_decode.obj \
- src/libtomcrypt/src/pk/rsa/rsa_exptmod.obj \
- src/libtomcrypt/src/pk/rsa/rsa_free.obj \
- src/libtomcrypt/src/pk/rsa/rsa_import.obj \
- src/libtomcrypt/src/pk/rsa/rsa_make_key.obj \
- src/libtomcrypt/src/pk/rsa/rsa_verify_hash.obj \
- src/libtomcrypt/src/pk/rsa/rsa_verify_simple.obj \
- src/libtommath/bncore.obj \
- src/libtommath/bn_fast_mp_invmod.obj \
- src/libtommath/bn_fast_mp_montgomery_reduce.obj \
- src/libtommath/bn_fast_s_mp_mul_digs.obj \
- src/libtommath/bn_fast_s_mp_mul_high_digs.obj \
- src/libtommath/bn_fast_s_mp_sqr.obj \
- src/libtommath/bn_mp_2expt.obj \
- src/libtommath/bn_mp_abs.obj \
- src/libtommath/bn_mp_add.obj \
- src/libtommath/bn_mp_addmod.obj \
- src/libtommath/bn_mp_add_d.obj \
- src/libtommath/bn_mp_and.obj \
- src/libtommath/bn_mp_clamp.obj \
- src/libtommath/bn_mp_clear.obj \
- src/libtommath/bn_mp_clear_multi.obj \
- src/libtommath/bn_mp_cmp.obj \
- src/libtommath/bn_mp_cmp_d.obj \
- src/libtommath/bn_mp_cmp_mag.obj \
- src/libtommath/bn_mp_cnt_lsb.obj \
- src/libtommath/bn_mp_copy.obj \
- src/libtommath/bn_mp_count_bits.obj \
- src/libtommath/bn_mp_div.obj \
- src/libtommath/bn_mp_div_2.obj \
- src/libtommath/bn_mp_div_2d.obj \
- src/libtommath/bn_mp_div_3.obj \
- src/libtommath/bn_mp_div_d.obj \
- src/libtommath/bn_mp_dr_is_modulus.obj \
- src/libtommath/bn_mp_dr_reduce.obj \
- src/libtommath/bn_mp_dr_setup.obj \
- src/libtommath/bn_mp_exch.obj \
- src/libtommath/bn_mp_exptmod.obj \
- src/libtommath/bn_mp_exptmod_fast.obj \
- src/libtommath/bn_mp_expt_d.obj \
- src/libtommath/bn_mp_exteuclid.obj \
- src/libtommath/bn_mp_fread.obj \
- src/libtommath/bn_mp_fwrite.obj \
- src/libtommath/bn_mp_gcd.obj \
- src/libtommath/bn_mp_get_int.obj \
- src/libtommath/bn_mp_grow.obj \
- src/libtommath/bn_mp_init.obj \
- src/libtommath/bn_mp_init_copy.obj \
- src/libtommath/bn_mp_init_multi.obj \
- src/libtommath/bn_mp_init_set.obj \
- src/libtommath/bn_mp_init_set_int.obj \
- src/libtommath/bn_mp_init_size.obj \
- src/libtommath/bn_mp_invmod.obj \
- src/libtommath/bn_mp_invmod_slow.obj \
- src/libtommath/bn_mp_is_square.obj \
- src/libtommath/bn_mp_jacobi.obj \
- src/libtommath/bn_mp_karatsuba_mul.obj \
- src/libtommath/bn_mp_karatsuba_sqr.obj \
- src/libtommath/bn_mp_lcm.obj \
- src/libtommath/bn_mp_lshd.obj \
- src/libtommath/bn_mp_mod.obj \
- src/libtommath/bn_mp_mod_2d.obj \
- src/libtommath/bn_mp_mod_d.obj \
- src/libtommath/bn_mp_montgomery_calc_normalization.obj \
- src/libtommath/bn_mp_montgomery_reduce.obj \
- src/libtommath/bn_mp_montgomery_setup.obj \
- src/libtommath/bn_mp_mul.obj \
- src/libtommath/bn_mp_mulmod.obj \
- src/libtommath/bn_mp_mul_2.obj \
- src/libtommath/bn_mp_mul_2d.obj \
- src/libtommath/bn_mp_mul_d.obj \
- src/libtommath/bn_mp_neg.obj \
- src/libtommath/bn_mp_n_root.obj \
- src/libtommath/bn_mp_or.obj \
- src/libtommath/bn_mp_prime_fermat.obj \
- src/libtommath/bn_mp_prime_is_divisible.obj \
- src/libtommath/bn_mp_prime_is_prime.obj \
- src/libtommath/bn_mp_prime_miller_rabin.obj \
- src/libtommath/bn_mp_prime_next_prime.obj \
- src/libtommath/bn_mp_prime_rabin_miller_trials.obj \
- src/libtommath/bn_mp_prime_random_ex.obj \
- src/libtommath/bn_mp_radix_size.obj \
- src/libtommath/bn_mp_radix_smap.obj \
- src/libtommath/bn_mp_rand.obj \
- src/libtommath/bn_mp_read_radix.obj \
- src/libtommath/bn_mp_read_signed_bin.obj \
- src/libtommath/bn_mp_read_unsigned_bin.obj \
- src/libtommath/bn_mp_reduce.obj \
- src/libtommath/bn_mp_reduce_2k.obj \
- src/libtommath/bn_mp_reduce_2k_l.obj \
- src/libtommath/bn_mp_reduce_2k_setup.obj \
- src/libtommath/bn_mp_reduce_2k_setup_l.obj \
- src/libtommath/bn_mp_reduce_is_2k.obj \
- src/libtommath/bn_mp_reduce_is_2k_l.obj \
- src/libtommath/bn_mp_reduce_setup.obj \
- src/libtommath/bn_mp_rshd.obj \
- src/libtommath/bn_mp_set.obj \
- src/libtommath/bn_mp_set_int.obj \
- src/libtommath/bn_mp_shrink.obj \
- src/libtommath/bn_mp_signed_bin_size.obj \
- src/libtommath/bn_mp_sqr.obj \
- src/libtommath/bn_mp_sqrmod.obj \
- src/libtommath/bn_mp_sqrt.obj \
- src/libtommath/bn_mp_sub.obj \
- src/libtommath/bn_mp_submod.obj \
- src/libtommath/bn_mp_sub_d.obj \
- src/libtommath/bn_mp_toom_mul.obj \
- src/libtommath/bn_mp_toom_sqr.obj \
- src/libtommath/bn_mp_toradix.obj \
- src/libtommath/bn_mp_toradix_n.obj \
- src/libtommath/bn_mp_to_signed_bin.obj \
- src/libtommath/bn_mp_to_signed_bin_n.obj \
- src/libtommath/bn_mp_to_unsigned_bin.obj \
- src/libtommath/bn_mp_to_unsigned_bin_n.obj \
- src/libtommath/bn_mp_unsigned_bin_size.obj \
- src/libtommath/bn_mp_xor.obj \
- src/libtommath/bn_mp_zero.obj \
- src/libtommath/bn_prime_tab.obj \
- src/libtommath/bn_reverse.obj \
- src/libtommath/bn_s_mp_add.obj \
- src/libtommath/bn_s_mp_exptmod.obj \
- src/libtommath/bn_s_mp_mul_digs.obj \
- src/libtommath/bn_s_mp_mul_high_digs.obj \
- src/libtommath/bn_s_mp_sqr.obj \
- src/libtommath/bn_s_mp_sub.obj \
- src/lzma/C/LzFind.obj \
- src/lzma/C/LzmaDec.obj \
- src/lzma/C/LzmaEnc.obj \
- src/pklib/explode.obj \
- src/pklib/implode.obj
+COBJS = src/libtomcrypt/src/hashes/sha1.o \
+ src/libtomcrypt/src/hashes/hash_memory.o \
+ src/libtomcrypt/src/hashes/md5.o \
+ src/libtomcrypt/src/misc/crypt_hash_is_valid.o \
+ src/libtomcrypt/src/misc/crypt_prng_descriptor.o \
+ src/libtomcrypt/src/misc/crypt_register_prng.o \
+ src/libtomcrypt/src/misc/crypt_ltc_mp_descriptor.o \
+ src/libtomcrypt/src/misc/crypt_find_hash.o \
+ src/libtomcrypt/src/misc/zeromem.o \
+ src/libtomcrypt/src/misc/base64_decode.o \
+ src/libtomcrypt/src/misc/crypt_register_hash.o \
+ src/libtomcrypt/src/misc/crypt_find_prng.o \
+ src/libtomcrypt/src/misc/crypt_prng_is_valid.o \
+ src/libtomcrypt/src/misc/crypt_hash_descriptor.o \
+ src/libtomcrypt/src/misc/crypt_libc.o \
+ src/libtomcrypt/src/misc/crypt_argchk.o \
+ src/libtomcrypt/src/math/multi.o \
+ src/libtomcrypt/src/math/ltm_desc.o \
+ src/libtomcrypt/src/math/rand_prime.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_bit_string.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_boolean.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_choice.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_ia5_string.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_object_identifier.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_octet_string.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_printable_string.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_sequence_ex.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_sequence_flexi.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_sequence_multi.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_short_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_utctime.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_utf8_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_bit_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_boolean.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_ia5_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_object_identifier.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_octet_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_printable_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_sequence_ex.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_sequence_multi.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_set.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_setof.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_short_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_utctime.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_utf8_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_bit_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_boolean.o \
+ src/libtomcrypt/src/pk/asn1/der_length_ia5_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_length_object_identifier.o \
+ src/libtomcrypt/src/pk/asn1/der_length_octet_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_printable_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_sequence.o \
+ src/libtomcrypt/src/pk/asn1/der_length_utctime.o \
+ src/libtomcrypt/src/pk/asn1/der_sequence_free.o \
+ src/libtomcrypt/src/pk/asn1/der_length_utf8_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_short_integer.o \
+ src/libtomcrypt/src/pk/ecc/ltc_ecc_projective_dbl_point.o \
+ src/libtomcrypt/src/pk/ecc/ltc_ecc_mulmod.o \
+ src/libtomcrypt/src/pk/ecc/ltc_ecc_projective_add_point.o \
+ src/libtomcrypt/src/pk/ecc/ltc_ecc_map.o \
+ src/libtomcrypt/src/pk/ecc/ltc_ecc_points.o \
+ src/libtomcrypt/src/pk/ecc/ltc_ecc_mul2add.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_decode.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_encode.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_decode.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_encode.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_mgf1.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_oaep_decode.o \
+ src/libtomcrypt/src/pk/rsa/rsa_make_key.o \
+ src/libtomcrypt/src/pk/rsa/rsa_free.o \
+ src/libtomcrypt/src/pk/rsa/rsa_verify_simple.o \
+ src/libtomcrypt/src/pk/rsa/rsa_import.o \
+ src/libtomcrypt/src/pk/rsa/rsa_verify_hash.o \
+ src/libtomcrypt/src/pk/rsa/rsa_sign_hash.o \
+ src/libtomcrypt/src/pk/rsa/rsa_exptmod.o \
+ src/libtommath/bn_mp_exptmod_fast.o \
+ src/libtommath/bn_mp_jacobi.o \
+ src/libtommath/bn_mp_mod.o \
+ src/libtommath/bn_mp_signed_bin_size.o \
+ src/libtommath/bn_mp_invmod.o \
+ src/libtommath/bn_mp_is_square.o \
+ src/libtommath/bn_mp_neg.o \
+ src/libtommath/bn_mp_reduce_2k.o \
+ src/libtommath/bn_mp_xor.o \
+ src/libtommath/bn_mp_karatsuba_mul.o \
+ src/libtommath/bn_mp_dr_setup.o \
+ src/libtommath/bn_mp_mul.o \
+ src/libtommath/bn_mp_init_multi.o \
+ src/libtommath/bn_mp_clear.o \
+ src/libtommath/bn_s_mp_sqr.o \
+ src/libtommath/bn_mp_rshd.o \
+ src/libtommath/bn_s_mp_sub.o \
+ src/libtommath/bn_mp_sub.o \
+ src/libtommath/bn_mp_toradix.o \
+ src/libtommath/bn_mp_reduce.o \
+ src/libtommath/bn_mp_prime_is_prime.o \
+ src/libtommath/bn_mp_prime_next_prime.o \
+ src/libtommath/bn_mp_exptmod.o \
+ src/libtommath/bn_mp_mod_2d.o \
+ src/libtommath/bn_reverse.o \
+ src/libtommath/bn_mp_init.o \
+ src/libtommath/bn_fast_s_mp_sqr.o \
+ src/libtommath/bn_mp_sqr.o \
+ src/libtommath/bn_mp_cnt_lsb.o \
+ src/libtommath/bn_mp_clear_multi.o \
+ src/libtommath/bn_mp_exch.o \
+ src/libtommath/bn_fast_s_mp_mul_digs.o \
+ src/libtommath/bn_mp_grow.o \
+ src/libtommath/bn_mp_read_radix.o \
+ src/libtommath/bn_mp_mul_2.o \
+ src/libtommath/bn_mp_shrink.o \
+ src/libtommath/bn_mp_div_2.o \
+ src/libtommath/bn_fast_mp_invmod.o \
+ src/libtommath/bn_mp_prime_miller_rabin.o \
+ src/libtommath/bn_mp_to_unsigned_bin.o \
+ src/libtommath/bn_mp_prime_rabin_miller_trials.o \
+ src/libtommath/bn_mp_2expt.o \
+ src/libtommath/bn_mp_cmp_mag.o \
+ src/libtommath/bn_mp_to_signed_bin.o \
+ src/libtommath/bn_mp_get_int.o \
+ src/libtommath/bn_mp_montgomery_reduce.o \
+ src/libtommath/bn_mp_dr_reduce.o \
+ src/libtommath/bn_mp_fwrite.o \
+ src/libtommath/bn_mp_and.o \
+ src/libtommath/bn_mp_exteuclid.o \
+ src/libtommath/bn_fast_mp_montgomery_reduce.o \
+ src/libtommath/bn_s_mp_mul_high_digs.o \
+ src/libtommath/bn_mp_reduce_setup.o \
+ src/libtommath/bn_mp_lcm.o \
+ src/libtommath/bn_mp_abs.o \
+ src/libtommath/bn_mp_cmp.o \
+ src/libtommath/bn_mp_submod.o \
+ src/libtommath/bn_mp_div_d.o \
+ src/libtommath/bn_s_mp_mul_digs.o \
+ src/libtommath/bn_mp_mul_d.o \
+ src/libtommath/bn_mp_to_unsigned_bin_n.o \
+ src/libtommath/bn_mp_prime_random_ex.o \
+ src/libtommath/bn_mp_rand.o \
+ src/libtommath/bn_mp_div_2d.o \
+ src/libtommath/bn_mp_addmod.o \
+ src/libtommath/bn_mp_init_copy.o \
+ src/libtommath/bn_mp_read_unsigned_bin.o \
+ src/libtommath/bn_mp_toradix_n.o \
+ src/libtommath/bn_fast_s_mp_mul_high_digs.o \
+ src/libtommath/bn_mp_toom_sqr.o \
+ src/libtommath/bn_mp_to_signed_bin_n.o \
+ src/libtommath/bn_mp_reduce_2k_setup_l.o \
+ src/libtommath/bn_mp_div.o \
+ src/libtommath/bn_prime_tab.o \
+ src/libtommath/bn_mp_karatsuba_sqr.o \
+ src/libtommath/bn_mp_gcd.o \
+ src/libtommath/bn_mp_prime_is_divisible.o \
+ src/libtommath/bn_mp_set_int.o \
+ src/libtommath/bn_mp_prime_fermat.o \
+ src/libtommath/bn_mp_cmp_d.o \
+ src/libtommath/bn_mp_add.o \
+ src/libtommath/bn_mp_sub_d.o \
+ src/libtommath/bn_s_mp_exptmod.o \
+ src/libtommath/bn_mp_init_size.o \
+ src/libtommath/bncore.o \
+ src/libtommath/bn_mp_radix_smap.o \
+ src/libtommath/bn_mp_reduce_2k_l.o \
+ src/libtommath/bn_mp_montgomery_calc_normalization.o \
+ src/libtommath/bn_mp_mod_d.o \
+ src/libtommath/bn_mp_set.o \
+ src/libtommath/bn_mp_or.o \
+ src/libtommath/bn_mp_sqrt.o \
+ src/libtommath/bn_mp_invmod_slow.o \
+ src/libtommath/bn_mp_count_bits.o \
+ src/libtommath/bn_mp_read_signed_bin.o \
+ src/libtommath/bn_mp_div_3.o \
+ src/libtommath/bn_mp_unsigned_bin_size.o \
+ src/libtommath/bn_mp_mulmod.o \
+ src/libtommath/bn_mp_clamp.o \
+ src/libtommath/bn_mp_reduce_2k_setup.o \
+ src/libtommath/bn_mp_toom_mul.o \
+ src/libtommath/bn_mp_montgomery_setup.o \
+ src/libtommath/bn_mp_expt_d.o \
+ src/libtommath/bn_mp_copy.o \
+ src/libtommath/bn_mp_dr_is_modulus.o \
+ src/libtommath/bn_mp_sqrmod.o \
+ src/libtommath/bn_mp_reduce_is_2k_l.o \
+ src/libtommath/bn_mp_mul_2d.o \
+ src/libtommath/bn_mp_fread.o \
+ src/libtommath/bn_mp_init_set.o \
+ src/libtommath/bn_mp_add_d.o \
+ src/libtommath/bn_mp_zero.o \
+ src/libtommath/bn_s_mp_add.o \
+ src/libtommath/bn_mp_radix_size.o \
+ src/libtommath/bn_mp_init_set_int.o \
+ src/libtommath/bn_mp_n_root.o \
+ src/libtommath/bn_mp_lshd.o \
+ src/libtommath/bn_mp_reduce_is_2k.o \
+ src/pklib/implode.o \
+ src/pklib/crc32.o \
+ src/pklib/explode.o \
+ src/zlib/crc32.o \
+ src/zlib/trees.o \
+ src/zlib/compress.o \
+ src/zlib/adler32.o \
+ src/zlib/inftrees.o \
+ src/zlib/inffast.o \
+ src/zlib/deflate.o \
+ src/zlib/inflate.o \
+ src/zlib/zutil.o \
+ src/lzma/C/LzFind.o \
+ src/lzma/C/LzmaEnc.o \
+ src/lzma/C/LzmaDec.o \
+ src/jenkins/lookup3.o
all: $(LIBRARY)
@@ -240,13 +266,13 @@ all: $(LIBRARY)
# cp StormLib.h /usr/local/include/StormLib
# cp StormPort.h /usr/local/include/StormLib
-$(LIBRARY): $(OBJS_C) $(OBJS_CPP)
- $(CPP) $(CFLAGS) $(DFLAGS) $(ARCH) $(LFLAGS) -shared -o $(LIBRARY) $(OBJS_C) $(OBJS_CPP)
-# $(AR) $(ARFLAGS) $(LIBRARY) $(OBJS_C) $(OBJS_CPP)
+$(LIBRARY): $(COBJS) $(OBJS)
+ $(CPP) $(CFLAGS) $(DFLAGS) $(ARCH) $(LFLAGS) -shared -o $(LIBRARY) $(COBJS) $(OBJS)
+# $(AR) $(ARFLAGS) $(LIBRARY) $(COBJS) $(OBJS)
-$(OBJS_C): %.obj: %.c
+$(COBJS): %.o: %.c
$(CC) -o $@ $(CFLAGS) $(DFLAGS) -c $<
-$(OBJS_CPP): %.obj: %.cpp
+$(OBJS): %.o: %.cpp
$(CC) -o $@ $(CFLAGS) $(DFLAGS) -c $<
diff --git a/StormLib.vcproj b/StormLib.vcproj
index be45757..db947a7 100644
--- a/StormLib.vcproj
+++ b/StormLib.vcproj
@@ -4227,6 +4227,62 @@
RelativePath=".\src\libtomcrypt\src\pk\asn1\der_decode_utf8_string.c"
>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4319,10 +4375,18 @@
RelativePath=".\src\libtomcrypt\src\pk\pkcs1\pkcs_1_pss_decode.c"
>
+
+
+
+
+
+
diff --git a/StormLib_dll.vcproj b/StormLib_dll.vcproj
index 1850ed4..0b8d247 100644
--- a/StormLib_dll.vcproj
+++ b/StormLib_dll.vcproj
@@ -1873,6 +1873,62 @@
RelativePath=".\src\libtomcrypt\src\pk\asn1\der_decode_utf8_string.c"
>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1965,10 +2021,18 @@
RelativePath=".\src\libtomcrypt\src\pk\pkcs1\pkcs_1_pss_decode.c"
>
+
+
+
+
+
+
diff --git a/StormLib_test.vcproj b/StormLib_test.vcproj
index 337ac78..09cef44 100644
--- a/StormLib_test.vcproj
+++ b/StormLib_test.vcproj
@@ -1307,6 +1307,62 @@
RelativePath=".\src\libtomcrypt\src\pk\asn1\der_decode_utf8_string.c"
>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1399,10 +1455,18 @@
RelativePath=".\src\libtomcrypt\src\pk\pkcs1\pkcs_1_pss_decode.c"
>
+
+
+
+
+
+
diff --git a/makefile.w32 b/makefile.w32
index 9c88fae..88662ba 100644
--- a/makefile.w32
+++ b/makefile.w32
@@ -20,231 +20,241 @@ ARFLAGS = rcs
LIBRARY = StormLib.dll
TESTEXE = StormLib_test.exe
-OBJS_CPP = src/adpcm/adpcm.o \
- src/huffman/huff.o \
- src/sparse/sparse.o \
- src/FileStream.o \
- src/SBaseCommon.o \
- src/SBaseDumpData.o \
- src/SBaseFileTable.o \
- src/SBaseSubTypes.o \
- src/SCompression.o \
- src/SFileAddFile.o \
- src/SFileAttributes.o \
- src/SFileCompactArchive.o \
- src/SFileCreateArchive.o \
- src/SFileExtractFile.o \
- src/SFileFindFile.o \
- src/SFileGetFileInfo.o \
- src/SFileListFile.o \
- src/SFileOpenArchive.o \
- src/SFileOpenFileEx.o \
- src/SFilePatchArchives.o \
- src/SFileReadFile.o \
- src/SFileVerify.o
-
+OBJS = src/adpcm/adpcm.o \
+ src/huffman/huff.o \
+ src/sparse/sparse.o \
+ src/FileStream.o \
+ src/SBaseCommon.o \
+ src/SBaseDumpData.o \
+ src/SBaseFileTable.o \
+ src/SBaseSubTypes.o \
+ src/SCompression.o \
+ src/SFileAddFile.o \
+ src/SFileAttributes.o \
+ src/SFileCompactArchive.o \
+ src/SFileCreateArchive.o \
+ src/SFileExtractFile.o \
+ src/SFileFindFile.o \
+ src/SFileGetFileInfo.o \
+ src/SFileListFile.o \
+ src/SFileOpenArchive.o \
+ src/SFileOpenFileEx.o \
+ src/SFilePatchArchives.o \
+ src/SFileReadFile.o \
+ src/SFileVerify.o
-OBJS_C = src/bzip2/blocksort.o \
- src/bzip2/bzlib.o \
- src/bzip2/compress.o \
- src/bzip2/crctable.o \
- src/bzip2/decompress.o \
- src/bzip2/huffman.o \
- src/bzip2/randtable.o \
- src/jenkins/lookup3.o \
- src/libtomcrypt/src/hashes/hash_memory.o \
- src/libtomcrypt/src/hashes/md5.o \
- src/libtomcrypt/src/hashes/sha1.o\
- src/libtomcrypt/src/math/ltm_desc.o \
- src/libtomcrypt/src/math/multi.o \
- src/libtomcrypt/src/math/rand_prime.o \
- src/libtomcrypt/src/misc/base64_decode.o \
- src/libtomcrypt/src/misc/crypt_argchk.o \
- src/libtomcrypt/src/misc/crypt_find_hash.o \
- src/libtomcrypt/src/misc/crypt_find_prng.o \
- src/libtomcrypt/src/misc/crypt_hash_descriptor.o \
- src/libtomcrypt/src/misc/crypt_hash_is_valid.o \
- src/libtomcrypt/src/misc/crypt_libc.o \
- src/libtomcrypt/src/misc/crypt_ltc_mp_descriptor.o \
- src/libtomcrypt/src/misc/crypt_prng_descriptor.o \
- src/libtomcrypt/src/misc/crypt_prng_is_valid.o \
- src/libtomcrypt/src/misc/crypt_register_hash.o \
- src/libtomcrypt/src/misc/crypt_register_prng.o \
- src/libtomcrypt/src/misc/zeromem.o \
- src/libtomcrypt/src/pk/asn1/der_decode_bit_string.o \
- src/libtomcrypt/src/pk/asn1/der_decode_boolean.o \
- src/libtomcrypt/src/pk/asn1/der_decode_choice.o \
- src/libtomcrypt/src/pk/asn1/der_decode_ia5_string.o \
- src/libtomcrypt/src/pk/asn1/der_decode_integer.o \
- src/libtomcrypt/src/pk/asn1/der_decode_object_identifier.o \
- src/libtomcrypt/src/pk/asn1/der_decode_octet_string.o \
- src/libtomcrypt/src/pk/asn1/der_decode_printable_string.o \
- src/libtomcrypt/src/pk/asn1/der_decode_sequence_ex.o \
- src/libtomcrypt/src/pk/asn1/der_decode_sequence_flexi.o \
- src/libtomcrypt/src/pk/asn1/der_decode_sequence_multi.o \
- src/libtomcrypt/src/pk/asn1/der_decode_short_integer.o \
- src/libtomcrypt/src/pk/asn1/der_decode_utctime.o \
- src/libtomcrypt/src/pk/asn1/der_decode_utf8_string.o \
- src/libtomcrypt/src/pk/asn1/der_length_bit_string.o \
- src/libtomcrypt/src/pk/asn1/der_length_boolean.o \
- src/libtomcrypt/src/pk/asn1/der_length_ia5_string.o \
- src/libtomcrypt/src/pk/asn1/der_length_integer.o \
- src/libtomcrypt/src/pk/asn1/der_length_object_identifier.o \
- src/libtomcrypt/src/pk/asn1/der_length_octet_string.o \
- src/libtomcrypt/src/pk/asn1/der_length_printable_string.o \
- src/libtomcrypt/src/pk/asn1/der_length_sequence.o \
- src/libtomcrypt/src/pk/asn1/der_length_short_integer.o \
- src/libtomcrypt/src/pk/asn1/der_length_utctime.o \
- src/libtomcrypt/src/pk/asn1/der_length_utf8_string.o \
- src/libtomcrypt/src/pk/asn1/der_sequence_free.o \
- src/libtomcrypt/src/pk/ecc/ltc_ecc_map.o \
- src/libtomcrypt/src/pk/ecc/ltc_ecc_mul2add.o \
- src/libtomcrypt/src/pk/ecc/ltc_ecc_mulmod.o \
- src/libtomcrypt/src/pk/ecc/ltc_ecc_points.o \
- src/libtomcrypt/src/pk/ecc/ltc_ecc_projective_add_point.o \
- src/libtomcrypt/src/pk/ecc/ltc_ecc_projective_dbl_point.o \
- src/libtomcrypt/src/pk/pkcs1/pkcs_1_mgf1.o \
- src/libtomcrypt/src/pk/pkcs1/pkcs_1_oaep_decode.o \
- src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_decode.o \
- src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_decode.o \
- src/libtomcrypt/src/pk/rsa/rsa_exptmod.o \
- src/libtomcrypt/src/pk/rsa/rsa_free.o \
- src/libtomcrypt/src/pk/rsa/rsa_import.o \
- src/libtomcrypt/src/pk/rsa/rsa_make_key.o \
- src/libtomcrypt/src/pk/rsa/rsa_verify_hash.o \
- src/libtomcrypt/src/pk/rsa/rsa_verify_simple.o \
- src/libtommath/bncore.o \
- src/libtommath/bn_fast_mp_invmod.o \
- src/libtommath/bn_fast_mp_montgomery_reduce.o \
- src/libtommath/bn_fast_s_mp_mul_digs.o \
- src/libtommath/bn_fast_s_mp_mul_high_digs.o \
- src/libtommath/bn_fast_s_mp_sqr.o \
- src/libtommath/bn_mp_2expt.o \
- src/libtommath/bn_mp_abs.o \
- src/libtommath/bn_mp_add.o \
- src/libtommath/bn_mp_addmod.o \
- src/libtommath/bn_mp_add_d.o \
- src/libtommath/bn_mp_and.o \
- src/libtommath/bn_mp_clamp.o \
- src/libtommath/bn_mp_clear.o \
- src/libtommath/bn_mp_clear_multi.o \
- src/libtommath/bn_mp_cmp.o \
- src/libtommath/bn_mp_cmp_d.o \
- src/libtommath/bn_mp_cmp_mag.o \
- src/libtommath/bn_mp_cnt_lsb.o \
- src/libtommath/bn_mp_copy.o \
- src/libtommath/bn_mp_count_bits.o \
- src/libtommath/bn_mp_div.o \
- src/libtommath/bn_mp_div_2.o \
- src/libtommath/bn_mp_div_2d.o \
- src/libtommath/bn_mp_div_3.o \
- src/libtommath/bn_mp_div_d.o \
- src/libtommath/bn_mp_dr_is_modulus.o \
- src/libtommath/bn_mp_dr_reduce.o \
- src/libtommath/bn_mp_dr_setup.o \
- src/libtommath/bn_mp_exch.o \
- src/libtommath/bn_mp_exptmod.o \
- src/libtommath/bn_mp_exptmod_fast.o \
- src/libtommath/bn_mp_expt_d.o \
- src/libtommath/bn_mp_exteuclid.o \
- src/libtommath/bn_mp_fread.o \
- src/libtommath/bn_mp_fwrite.o \
- src/libtommath/bn_mp_gcd.o \
- src/libtommath/bn_mp_get_int.o \
- src/libtommath/bn_mp_grow.o \
- src/libtommath/bn_mp_init.o \
- src/libtommath/bn_mp_init_copy.o \
- src/libtommath/bn_mp_init_multi.o \
- src/libtommath/bn_mp_init_set.o \
- src/libtommath/bn_mp_init_set_int.o \
- src/libtommath/bn_mp_init_size.o \
- src/libtommath/bn_mp_invmod.o \
- src/libtommath/bn_mp_invmod_slow.o \
- src/libtommath/bn_mp_is_square.o \
- src/libtommath/bn_mp_jacobi.o \
- src/libtommath/bn_mp_karatsuba_mul.o \
- src/libtommath/bn_mp_karatsuba_sqr.o \
- src/libtommath/bn_mp_lcm.o \
- src/libtommath/bn_mp_lshd.o \
- src/libtommath/bn_mp_mod.o \
- src/libtommath/bn_mp_mod_2d.o \
- src/libtommath/bn_mp_mod_d.o \
- src/libtommath/bn_mp_montgomery_calc_normalization.o \
- src/libtommath/bn_mp_montgomery_reduce.o \
- src/libtommath/bn_mp_montgomery_setup.o \
- src/libtommath/bn_mp_mul.o \
- src/libtommath/bn_mp_mulmod.o \
- src/libtommath/bn_mp_mul_2.o \
- src/libtommath/bn_mp_mul_2d.o \
- src/libtommath/bn_mp_mul_d.o \
- src/libtommath/bn_mp_neg.o \
- src/libtommath/bn_mp_n_root.o \
- src/libtommath/bn_mp_or.o \
- src/libtommath/bn_mp_prime_fermat.o \
- src/libtommath/bn_mp_prime_is_divisible.o \
- src/libtommath/bn_mp_prime_is_prime.o \
- src/libtommath/bn_mp_prime_miller_rabin.o \
- src/libtommath/bn_mp_prime_next_prime.o \
- src/libtommath/bn_mp_prime_rabin_miller_trials.o \
- src/libtommath/bn_mp_prime_random_ex.o \
- src/libtommath/bn_mp_radix_size.o \
- src/libtommath/bn_mp_radix_smap.o \
- src/libtommath/bn_mp_rand.o \
- src/libtommath/bn_mp_read_radix.o \
- src/libtommath/bn_mp_read_signed_bin.o \
- src/libtommath/bn_mp_read_unsigned_bin.o \
- src/libtommath/bn_mp_reduce.o \
- src/libtommath/bn_mp_reduce_2k.o \
- src/libtommath/bn_mp_reduce_2k_l.o \
- src/libtommath/bn_mp_reduce_2k_setup.o \
- src/libtommath/bn_mp_reduce_2k_setup_l.o \
- src/libtommath/bn_mp_reduce_is_2k.o \
- src/libtommath/bn_mp_reduce_is_2k_l.o \
- src/libtommath/bn_mp_reduce_setup.o \
- src/libtommath/bn_mp_rshd.o \
- src/libtommath/bn_mp_set.o \
- src/libtommath/bn_mp_set_int.o \
- src/libtommath/bn_mp_shrink.o \
- src/libtommath/bn_mp_signed_bin_size.o \
- src/libtommath/bn_mp_sqr.o \
- src/libtommath/bn_mp_sqrmod.o \
- src/libtommath/bn_mp_sqrt.o \
- src/libtommath/bn_mp_sub.o \
- src/libtommath/bn_mp_submod.o \
- src/libtommath/bn_mp_sub_d.o \
- src/libtommath/bn_mp_toom_mul.o \
- src/libtommath/bn_mp_toom_sqr.o \
- src/libtommath/bn_mp_toradix.o \
- src/libtommath/bn_mp_toradix_n.o \
- src/libtommath/bn_mp_to_signed_bin.o \
- src/libtommath/bn_mp_to_signed_bin_n.o \
- src/libtommath/bn_mp_to_unsigned_bin.o \
- src/libtommath/bn_mp_to_unsigned_bin_n.o \
- src/libtommath/bn_mp_unsigned_bin_size.o \
- src/libtommath/bn_mp_xor.o \
- src/libtommath/bn_mp_zero.o \
- src/libtommath/bn_prime_tab.o \
- src/libtommath/bn_reverse.o \
- src/libtommath/bn_s_mp_add.o \
- src/libtommath/bn_s_mp_exptmod.o \
- src/libtommath/bn_s_mp_mul_digs.o \
- src/libtommath/bn_s_mp_mul_high_digs.o \
- src/libtommath/bn_s_mp_sqr.o \
- src/libtommath/bn_s_mp_sub.o \
- src/lzma/C/LzFind.o \
- src/lzma/C/LzmaDec.o \
- src/lzma/C/LzmaEnc.o \
- src/pklib/explode.o \
- src/pklib/implode.o \
- src/zlib/adler32.o \
- src/zlib/compress.o \
- src/zlib/crc32.o \
- src/zlib/deflate.o \
- src/zlib/inffast.o \
- src/zlib/inflate.o \
- src/zlib/inftrees.o \
- src/zlib/trees.o \
- src/zlib/zutil.o
+COBJS = src/libtomcrypt/src/hashes/sha1.o \
+ src/libtomcrypt/src/hashes/hash_memory.o \
+ src/libtomcrypt/src/hashes/md5.o \
+ src/libtomcrypt/src/misc/crypt_hash_is_valid.o \
+ src/libtomcrypt/src/misc/crypt_prng_descriptor.o \
+ src/libtomcrypt/src/misc/crypt_register_prng.o \
+ src/libtomcrypt/src/misc/crypt_ltc_mp_descriptor.o \
+ src/libtomcrypt/src/misc/crypt_find_hash.o \
+ src/libtomcrypt/src/misc/zeromem.o \
+ src/libtomcrypt/src/misc/base64_decode.o \
+ src/libtomcrypt/src/misc/crypt_register_hash.o \
+ src/libtomcrypt/src/misc/crypt_find_prng.o \
+ src/libtomcrypt/src/misc/crypt_prng_is_valid.o \
+ src/libtomcrypt/src/misc/crypt_hash_descriptor.o \
+ src/libtomcrypt/src/misc/crypt_libc.o \
+ src/libtomcrypt/src/misc/crypt_argchk.o \
+ src/libtomcrypt/src/math/multi.o \
+ src/libtomcrypt/src/math/ltm_desc.o \
+ src/libtomcrypt/src/math/rand_prime.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_bit_string.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_boolean.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_choice.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_ia5_string.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_object_identifier.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_octet_string.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_printable_string.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_sequence_ex.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_sequence_flexi.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_sequence_multi.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_short_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_utctime.o \
+ src/libtomcrypt/src/pk/asn1/der_decode_utf8_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_bit_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_boolean.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_ia5_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_object_identifier.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_octet_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_printable_string.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_sequence_ex.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_sequence_multi.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_set.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_setof.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_short_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_utctime.o \
+ src/libtomcrypt/src/pk/asn1/der_encode_utf8_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_bit_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_boolean.o \
+ src/libtomcrypt/src/pk/asn1/der_length_ia5_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_integer.o \
+ src/libtomcrypt/src/pk/asn1/der_length_object_identifier.o \
+ src/libtomcrypt/src/pk/asn1/der_length_octet_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_printable_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_sequence.o \
+ src/libtomcrypt/src/pk/asn1/der_length_utctime.o \
+ src/libtomcrypt/src/pk/asn1/der_sequence_free.o \
+ src/libtomcrypt/src/pk/asn1/der_length_utf8_string.o \
+ src/libtomcrypt/src/pk/asn1/der_length_short_integer.o \
+ src/libtomcrypt/src/pk/ecc/ltc_ecc_projective_dbl_point.o \
+ src/libtomcrypt/src/pk/ecc/ltc_ecc_mulmod.o \
+ src/libtomcrypt/src/pk/ecc/ltc_ecc_projective_add_point.o \
+ src/libtomcrypt/src/pk/ecc/ltc_ecc_map.o \
+ src/libtomcrypt/src/pk/ecc/ltc_ecc_points.o \
+ src/libtomcrypt/src/pk/ecc/ltc_ecc_mul2add.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_decode.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_encode.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_decode.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_encode.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_mgf1.o \
+ src/libtomcrypt/src/pk/pkcs1/pkcs_1_oaep_decode.o \
+ src/libtomcrypt/src/pk/rsa/rsa_make_key.o \
+ src/libtomcrypt/src/pk/rsa/rsa_free.o \
+ src/libtomcrypt/src/pk/rsa/rsa_verify_simple.o \
+ src/libtomcrypt/src/pk/rsa/rsa_import.o \
+ src/libtomcrypt/src/pk/rsa/rsa_verify_hash.o \
+ src/libtomcrypt/src/pk/rsa/rsa_sign_hash.o \
+ src/libtomcrypt/src/pk/rsa/rsa_exptmod.o \
+ src/libtommath/bn_mp_exptmod_fast.o \
+ src/libtommath/bn_mp_jacobi.o \
+ src/libtommath/bn_mp_mod.o \
+ src/libtommath/bn_mp_signed_bin_size.o \
+ src/libtommath/bn_mp_invmod.o \
+ src/libtommath/bn_mp_is_square.o \
+ src/libtommath/bn_mp_neg.o \
+ src/libtommath/bn_mp_reduce_2k.o \
+ src/libtommath/bn_mp_xor.o \
+ src/libtommath/bn_mp_karatsuba_mul.o \
+ src/libtommath/bn_mp_dr_setup.o \
+ src/libtommath/bn_mp_mul.o \
+ src/libtommath/bn_mp_init_multi.o \
+ src/libtommath/bn_mp_clear.o \
+ src/libtommath/bn_s_mp_sqr.o \
+ src/libtommath/bn_mp_rshd.o \
+ src/libtommath/bn_s_mp_sub.o \
+ src/libtommath/bn_mp_sub.o \
+ src/libtommath/bn_mp_toradix.o \
+ src/libtommath/bn_mp_reduce.o \
+ src/libtommath/bn_mp_prime_is_prime.o \
+ src/libtommath/bn_mp_prime_next_prime.o \
+ src/libtommath/bn_mp_exptmod.o \
+ src/libtommath/bn_mp_mod_2d.o \
+ src/libtommath/bn_reverse.o \
+ src/libtommath/bn_mp_init.o \
+ src/libtommath/bn_fast_s_mp_sqr.o \
+ src/libtommath/bn_mp_sqr.o \
+ src/libtommath/bn_mp_cnt_lsb.o \
+ src/libtommath/bn_mp_clear_multi.o \
+ src/libtommath/bn_mp_exch.o \
+ src/libtommath/bn_fast_s_mp_mul_digs.o \
+ src/libtommath/bn_mp_grow.o \
+ src/libtommath/bn_mp_read_radix.o \
+ src/libtommath/bn_mp_mul_2.o \
+ src/libtommath/bn_mp_shrink.o \
+ src/libtommath/bn_mp_div_2.o \
+ src/libtommath/bn_fast_mp_invmod.o \
+ src/libtommath/bn_mp_prime_miller_rabin.o \
+ src/libtommath/bn_mp_to_unsigned_bin.o \
+ src/libtommath/bn_mp_prime_rabin_miller_trials.o \
+ src/libtommath/bn_mp_2expt.o \
+ src/libtommath/bn_mp_cmp_mag.o \
+ src/libtommath/bn_mp_to_signed_bin.o \
+ src/libtommath/bn_mp_get_int.o \
+ src/libtommath/bn_mp_montgomery_reduce.o \
+ src/libtommath/bn_mp_dr_reduce.o \
+ src/libtommath/bn_mp_fwrite.o \
+ src/libtommath/bn_mp_and.o \
+ src/libtommath/bn_mp_exteuclid.o \
+ src/libtommath/bn_fast_mp_montgomery_reduce.o \
+ src/libtommath/bn_s_mp_mul_high_digs.o \
+ src/libtommath/bn_mp_reduce_setup.o \
+ src/libtommath/bn_mp_lcm.o \
+ src/libtommath/bn_mp_abs.o \
+ src/libtommath/bn_mp_cmp.o \
+ src/libtommath/bn_mp_submod.o \
+ src/libtommath/bn_mp_div_d.o \
+ src/libtommath/bn_s_mp_mul_digs.o \
+ src/libtommath/bn_mp_mul_d.o \
+ src/libtommath/bn_mp_to_unsigned_bin_n.o \
+ src/libtommath/bn_mp_prime_random_ex.o \
+ src/libtommath/bn_mp_rand.o \
+ src/libtommath/bn_mp_div_2d.o \
+ src/libtommath/bn_mp_addmod.o \
+ src/libtommath/bn_mp_init_copy.o \
+ src/libtommath/bn_mp_read_unsigned_bin.o \
+ src/libtommath/bn_mp_toradix_n.o \
+ src/libtommath/bn_fast_s_mp_mul_high_digs.o \
+ src/libtommath/bn_mp_toom_sqr.o \
+ src/libtommath/bn_mp_to_signed_bin_n.o \
+ src/libtommath/bn_mp_reduce_2k_setup_l.o \
+ src/libtommath/bn_mp_div.o \
+ src/libtommath/bn_prime_tab.o \
+ src/libtommath/bn_mp_karatsuba_sqr.o \
+ src/libtommath/bn_mp_gcd.o \
+ src/libtommath/bn_mp_prime_is_divisible.o \
+ src/libtommath/bn_mp_set_int.o \
+ src/libtommath/bn_mp_prime_fermat.o \
+ src/libtommath/bn_mp_cmp_d.o \
+ src/libtommath/bn_mp_add.o \
+ src/libtommath/bn_mp_sub_d.o \
+ src/libtommath/bn_s_mp_exptmod.o \
+ src/libtommath/bn_mp_init_size.o \
+ src/libtommath/bncore.o \
+ src/libtommath/bn_mp_radix_smap.o \
+ src/libtommath/bn_mp_reduce_2k_l.o \
+ src/libtommath/bn_mp_montgomery_calc_normalization.o \
+ src/libtommath/bn_mp_mod_d.o \
+ src/libtommath/bn_mp_set.o \
+ src/libtommath/bn_mp_or.o \
+ src/libtommath/bn_mp_sqrt.o \
+ src/libtommath/bn_mp_invmod_slow.o \
+ src/libtommath/bn_mp_count_bits.o \
+ src/libtommath/bn_mp_read_signed_bin.o \
+ src/libtommath/bn_mp_div_3.o \
+ src/libtommath/bn_mp_unsigned_bin_size.o \
+ src/libtommath/bn_mp_mulmod.o \
+ src/libtommath/bn_mp_clamp.o \
+ src/libtommath/bn_mp_reduce_2k_setup.o \
+ src/libtommath/bn_mp_toom_mul.o \
+ src/libtommath/bn_mp_montgomery_setup.o \
+ src/libtommath/bn_mp_expt_d.o \
+ src/libtommath/bn_mp_copy.o \
+ src/libtommath/bn_mp_dr_is_modulus.o \
+ src/libtommath/bn_mp_sqrmod.o \
+ src/libtommath/bn_mp_reduce_is_2k_l.o \
+ src/libtommath/bn_mp_mul_2d.o \
+ src/libtommath/bn_mp_fread.o \
+ src/libtommath/bn_mp_init_set.o \
+ src/libtommath/bn_mp_add_d.o \
+ src/libtommath/bn_mp_zero.o \
+ src/libtommath/bn_s_mp_add.o \
+ src/libtommath/bn_mp_radix_size.o \
+ src/libtommath/bn_mp_init_set_int.o \
+ src/libtommath/bn_mp_n_root.o \
+ src/libtommath/bn_mp_lshd.o \
+ src/libtommath/bn_mp_reduce_is_2k.o \
+ src/pklib/implode.o \
+ src/pklib/crc32.o \
+ src/pklib/explode.o \
+ src/zlib/crc32.o \
+ src/zlib/trees.o \
+ src/zlib/compress.o \
+ src/zlib/adler32.o \
+ src/zlib/inftrees.o \
+ src/zlib/inffast.o \
+ src/zlib/deflate.o \
+ src/zlib/inflate.o \
+ src/zlib/zutil.o \
+ src/lzma/C/LzFind.o \
+ src/lzma/C/LzmaEnc.o \
+ src/lzma/C/LzmaDec.o \
+ src/jenkins/lookup3.o
OBJS_DLL = stormlib_dll/DllMain.o
@@ -253,7 +263,7 @@ OBJS_TEST = test/test.o
all: $(LIBRARY) $(TESTEXE)
#clean:
-# rm -f $(OBJS) $(LIBRARY)
+# rm -f $(COBJS) $(LIBRARY)
#install: $(LIBRARY)
# install $(LIBRARY) /usr/local/lib
@@ -261,16 +271,16 @@ all: $(LIBRARY) $(TESTEXE)
# cp StormLib.h /usr/local/include/StormLib
# cp StormPort.h /usr/local/include/StormLib
-$(LIBRARY): $(OBJS_C) $(OBJS_CPP) $(OBJS_DLL)
- $(CPP) $(CFLAGS) $(DFLAGS) -o $(LIBRARY) $(OBJS_C) $(OBJS_CPP) $(OBJS_DLL) $(DLLLFLAGS)
+$(LIBRARY): $(COBJS) $(OBJS) $(OBJS_DLL)
+ $(CPP) $(CFLAGS) $(DFLAGS) -o $(LIBRARY) $(COBJS) $(OBJS) $(OBJS_DLL) $(DLLLFLAGS)
-$(TESTEXE): $(OBJS_C) $(OBJS_CPP) $(OBJS_TEST)
- $(CPP) $(CFLAGS) $(DFLAGS) -o "$@" $(OBJS_C) $(OBJS_CPP) $(OBJS_TEST) $(EXELFLAGS)
+$(TESTEXE): $(COBJS) $(OBJS) $(OBJS_TEST)
+ $(CPP) $(CFLAGS) $(DFLAGS) -o "$@" $(COBJS) $(OBJS) $(OBJS_TEST) $(EXELFLAGS)
-$(OBJS_C): %.o: %.c
+$(COBJS): %.o: %.c
$(CC) -o $@ $(CFLAGS) $(DFLAGS) -c $<
-$(OBJS_CPP): %.o: %.cpp
+$(OBJS): %.o: %.cpp
$(CC) -o $@ $(CFLAGS) $(DFLAGS) -c $<
$(OBJS_DLL): %.o: %.c
diff --git a/src/SBaseFileTable.cpp b/src/SBaseFileTable.cpp
index 33e1472..906edce 100644
--- a/src/SBaseFileTable.cpp
+++ b/src/SBaseFileTable.cpp
@@ -1943,6 +1943,7 @@ void InvalidateInternalFiles(TMPQArchive * ha)
TFileEntry * pFileTableEnd;
TFileEntry * pFileEntry1 = NULL;
TFileEntry * pFileEntry2 = NULL;
+ TFileEntry * pFileEntry3 = NULL;
// Do nothing if we are in the middle of saving internal files
if(!(ha->dwFlags & MPQ_FLAG_SAVING_TABLES))
@@ -1979,17 +1980,33 @@ void InvalidateInternalFiles(TMPQArchive * ha)
ha->dwReservedFiles++;
}
+ // Invalidate the (signature), if not done yet
+ if(ha->dwFileFlags3 != 0 && (ha->dwFlags & MPQ_FLAG_SIGNATURE_INVALID) == 0)
+ {
+ // Delete the existing entry for (attributes)
+ pFileEntry3 = GetFileEntryExact(ha, SIGNATURE_NAME, LANG_NEUTRAL);
+ if(pFileEntry3 != NULL)
+ DeleteFileEntry(ha, pFileEntry3);
+
+ // Reserve one entry for (attributes)
+ ha->dwFlags |= MPQ_FLAG_SIGNATURE_INVALID;
+ ha->dwReservedFiles++;
+ }
+
+
// If the internal files are at the end of the file table (they usually are),
- // we want to free these 2 entries, so when new files are added, they get
+ // we want to free these 3 entries, so when new files are added, they get
// added to the freed entries and the internal files get added after that
if(ha->dwFileTableSize > 0)
{
pFileTableEnd = ha->pFileTable + ha->dwFileTableSize;
// Is one of the entries the last one?
- if(pFileEntry1 == pFileTableEnd - 1 || pFileEntry2 == pFileTableEnd - 1)
+ if(pFileEntry1 == pFileTableEnd - 1 || pFileEntry2 == pFileTableEnd - 1 || pFileEntry3 == pFileTableEnd - 1)
+ pFileTableEnd--;
+ if(pFileEntry1 == pFileTableEnd - 1 || pFileEntry2 == pFileTableEnd - 1 || pFileEntry3 == pFileTableEnd - 1)
pFileTableEnd--;
- if(pFileEntry1 == pFileTableEnd - 1 || pFileEntry2 == pFileTableEnd - 1)
+ if(pFileEntry1 == pFileTableEnd - 1 || pFileEntry2 == pFileTableEnd - 1 || pFileEntry3 == pFileTableEnd - 1)
pFileTableEnd--;
// Calculate the new file table size
diff --git a/src/SFileAttributes.cpp b/src/SFileAttributes.cpp
index 479363d..0278426 100644
--- a/src/SFileAttributes.cpp
+++ b/src/SFileAttributes.cpp
@@ -368,7 +368,7 @@ int SAttrLoadAttributes(TMPQArchive * ha)
// File table must be initialized
assert(ha->pFileTable != NULL);
- // Don't load the attributes file from malformer Warcraft III maps
+ // Don't load the attributes file from malformed Warcraft III maps
if(ha->dwFlags & MPQ_FLAG_MALFORMED)
return ERROR_FILE_CORRUPT;
diff --git a/src/SFileCreateArchive.cpp b/src/SFileCreateArchive.cpp
index 569b953..206baff 100644
--- a/src/SFileCreateArchive.cpp
+++ b/src/SFileCreateArchive.cpp
@@ -80,6 +80,7 @@ bool WINAPI SFileCreateArchive(const TCHAR * szMpqName, DWORD dwCreateFlags, DWO
CreateInfo.dwStreamFlags = STREAM_PROVIDER_FLAT | BASE_PROVIDER_FILE;
CreateInfo.dwFileFlags1 = (dwCreateFlags & MPQ_CREATE_LISTFILE) ? MPQ_FILE_EXISTS : 0;
CreateInfo.dwFileFlags2 = (dwCreateFlags & MPQ_CREATE_ATTRIBUTES) ? MPQ_FILE_EXISTS : 0;
+ CreateInfo.dwFileFlags3 = (dwCreateFlags & MPQ_CREATE_SIGNATURE) ? MPQ_FILE_EXISTS : 0;
CreateInfo.dwAttrFlags = (dwCreateFlags & MPQ_CREATE_ATTRIBUTES) ? (MPQ_ATTRIBUTE_CRC32 | MPQ_ATTRIBUTE_FILETIME | MPQ_ATTRIBUTE_MD5) : 0;
CreateInfo.dwSectorSize = (CreateInfo.dwMpqVersion >= MPQ_FORMAT_VERSION_3) ? 0x4000 : 0x1000;
CreateInfo.dwRawChunkSize = (CreateInfo.dwMpqVersion >= MPQ_FORMAT_VERSION_4) ? 0x4000 : 0;
@@ -118,11 +119,11 @@ bool WINAPI SFileCreateArchive2(const TCHAR * szMpqName, PSFILE_CREATE_MPQ pCrea
}
// Verify if all variables in SFILE_CREATE_MPQ are correct
- if((pCreateInfo->cbSize == 0 || pCreateInfo->cbSize > sizeof(SFILE_CREATE_MPQ)) ||
- (pCreateInfo->dwMpqVersion > MPQ_FORMAT_VERSION_4) ||
- (pCreateInfo->pvUserData != NULL || pCreateInfo->cbUserData != 0) ||
- (pCreateInfo->dwAttrFlags & ~MPQ_ATTRIBUTE_ALL) ||
- (pCreateInfo->dwSectorSize & (pCreateInfo->dwSectorSize - 1)) ||
+ if((pCreateInfo->cbSize == 0 || pCreateInfo->cbSize > sizeof(SFILE_CREATE_MPQ)) ||
+ (pCreateInfo->dwMpqVersion > MPQ_FORMAT_VERSION_4) ||
+ (pCreateInfo->pvUserData != NULL || pCreateInfo->cbUserData != 0) ||
+ (pCreateInfo->dwAttrFlags & ~MPQ_ATTRIBUTE_ALL) ||
+ (pCreateInfo->dwSectorSize & (pCreateInfo->dwSectorSize - 1)) ||
(pCreateInfo->dwRawChunkSize & (pCreateInfo->dwRawChunkSize - 1)))
{
SetLastError(ERROR_INVALID_PARAMETER);
@@ -169,6 +170,13 @@ bool WINAPI SFileCreateArchive2(const TCHAR * szMpqName, PSFILE_CREATE_MPQ pCrea
dwReservedFiles++;
}
+ // Increment the maximum amount of files to have space for (signature)
+ if(pCreateInfo->dwMaxFileCount && pCreateInfo->dwFileFlags3)
+ {
+ dwMpqFlags |= MPQ_FLAG_SIGNATURE_INVALID;
+ dwReservedFiles++;
+ }
+
// If file count is not zero, initialize the hash table size
dwHashTableSize = GetHashTableSizeForFileCount(pCreateInfo->dwMaxFileCount + dwReservedFiles);
@@ -205,6 +213,7 @@ bool WINAPI SFileCreateArchive2(const TCHAR * szMpqName, PSFILE_CREATE_MPQ pCrea
ha->dwReservedFiles = dwReservedFiles;
ha->dwFileFlags1 = pCreateInfo->dwFileFlags1;
ha->dwFileFlags2 = pCreateInfo->dwFileFlags2;
+ ha->dwFileFlags3 = pCreateInfo->dwFileFlags3 ? MPQ_FILE_EXISTS : 0;
ha->dwAttrFlags = pCreateInfo->dwAttrFlags;
ha->dwFlags = dwMpqFlags | MPQ_FLAG_CHANGED;
pStream = NULL;
diff --git a/src/SFileOpenArchive.cpp b/src/SFileOpenArchive.cpp
index 98d8766..15c395c 100644
--- a/src/SFileOpenArchive.cpp
+++ b/src/SFileOpenArchive.cpp
@@ -388,7 +388,7 @@ bool WINAPI SFileOpenArchive(
// Load the internal listfile and include it to the file table
if(nError == ERROR_SUCCESS && (dwFlags & MPQ_OPEN_NO_LISTFILE) == 0)
{
- // Save the flags for (listfile)
+ // Quick check for (listfile)
pFileEntry = GetFileEntryLocale(ha, LISTFILE_NAME, LANG_NEUTRAL);
if(pFileEntry != NULL)
{
@@ -401,7 +401,7 @@ bool WINAPI SFileOpenArchive(
// Load the "(attributes)" file and merge it to the file table
if(nError == ERROR_SUCCESS && (dwFlags & MPQ_OPEN_NO_ATTRIBUTES) == 0)
{
- // Save the flags for (attributes)
+ // Quick check for (attributes)
pFileEntry = GetFileEntryLocale(ha, ATTRIBUTES_NAME, LANG_NEUTRAL);
if(pFileEntry != NULL)
{
@@ -411,6 +411,19 @@ bool WINAPI SFileOpenArchive(
}
}
+ // Remember whether the archive has weak signature. Only for MPQs format 1.0.
+ if(nError == ERROR_SUCCESS)
+ {
+ // Quick check for (signature)
+ pFileEntry = GetFileEntryLocale(ha, SIGNATURE_NAME, LANG_NEUTRAL);
+ if(pFileEntry != NULL)
+ {
+ // Just remember that the archive is weak-signed
+ assert(pFileEntry->dwFlags == MPQ_FILE_EXISTS);
+ ha->dwFileFlags3 = pFileEntry->dwFlags;
+ }
+ }
+
// Cleanup and exit
if(nError != ERROR_SUCCESS)
{
@@ -469,6 +482,14 @@ bool WINAPI SFileFlushArchive(HANDLE hMpq)
// Indicate that we are saving MPQ internal structures
ha->dwFlags |= MPQ_FLAG_SAVING_TABLES;
+ // If the (signature) has been invalidated, save it
+ if(ha->dwFlags & MPQ_FLAG_SIGNATURE_INVALID)
+ {
+ nError = SSignFileCreate(ha);
+ if(nError != ERROR_SUCCESS)
+ nResultError = nError;
+ }
+
// If the (listfile) has been invalidated, save it
if(ha->dwFlags & MPQ_FLAG_LISTFILE_INVALID)
{
@@ -488,9 +509,18 @@ bool WINAPI SFileFlushArchive(HANDLE hMpq)
// Save HET table, BET table, hash table, block table, hi-block table
if(ha->dwFlags & MPQ_FLAG_CHANGED)
{
+ // Save all MPQ tables first
nError = SaveMPQTables(ha);
if(nError != ERROR_SUCCESS)
nResultError = nError;
+
+ // If the archive has weak signature, we need to finish it
+ if(ha->dwFileFlags3 != 0)
+ {
+ nError = SSignFileFinish(ha);
+ if(nError != ERROR_SUCCESS)
+ nResultError = nError;
+ }
}
// We are no longer saving internal MPQ structures
diff --git a/src/SFileVerify.cpp b/src/SFileVerify.cpp
index 8d7e950..a506fc3 100644
--- a/src/SFileVerify.cpp
+++ b/src/SFileVerify.cpp
@@ -726,9 +726,8 @@ bool QueryMpqSignatureInfo(
TMPQArchive * ha,
PMPQ_SIGNATURE_INFO pSI)
{
+ TFileEntry * pFileEntry;
ULONGLONG ExtraBytes;
- TMPQFile * hf;
- HANDLE hFile;
DWORD dwFileSize;
// Make sure it's all zeroed
@@ -738,23 +737,25 @@ bool QueryMpqSignatureInfo(
CalculateArchiveRange(ha, pSI);
// If there is "(signature)" file in the MPQ, it has a weak signature
- if(SFileOpenFileEx((HANDLE)ha, SIGNATURE_NAME, SFILE_OPEN_BASE_FILE, &hFile))
+ pFileEntry = GetFileEntryLocale(ha, SIGNATURE_NAME, LANG_NEUTRAL);
+ if(pFileEntry != NULL)
{
- // Get the content of the signature
- SFileReadFile(hFile, pSI->Signature, sizeof(pSI->Signature), &pSI->cbSignatureSize, NULL);
+ // Calculate the begin and end of the signature file itself
+ pSI->BeginExclude = ha->MpqPos + pFileEntry->ByteOffset;
+ pSI->EndExclude = pSI->BeginExclude + pFileEntry->dwCmpSize;
+ dwFileSize = (DWORD)(pSI->EndExclude - pSI->BeginExclude);
- // Verify the size of the signature
- hf = (TMPQFile *)hFile;
-
- // We have to exclude the signature file from the digest
- pSI->BeginExclude = ha->MpqPos + hf->pFileEntry->ByteOffset;
- pSI->EndExclude = pSI->BeginExclude + hf->pFileEntry->dwCmpSize;
- dwFileSize = hf->dwDataSize;
+ // Does the signature have proper size?
+ if(dwFileSize == MPQ_SIGNATURE_FILE_SIZE)
+ {
+ // Read the weak signature
+ if(!FileStream_Read(ha->pStream, &pSI->BeginExclude, pSI->Signature, dwFileSize))
+ return false;
- // Close the file
- SFileCloseFile(hFile);
- pSI->SignatureTypes |= SIGNATURE_TYPE_WEAK;
- return (dwFileSize == (MPQ_WEAK_SIGNATURE_SIZE + 8)) ? true : false;
+ pSI->cbSignatureSize = dwFileSize;
+ pSI->SignatureTypes |= SIGNATURE_TYPE_WEAK;
+ return true;
+ }
}
// If there is extra bytes beyond the end of the archive,
@@ -778,6 +779,96 @@ bool QueryMpqSignatureInfo(
return true;
}
+//-----------------------------------------------------------------------------
+// Support for weak signature
+
+int SSignFileCreate(TMPQArchive * ha)
+{
+ TMPQFile * hf = NULL;
+ BYTE EmptySignature[MPQ_SIGNATURE_FILE_SIZE];
+ int nError = ERROR_SUCCESS;
+
+ // Only save the signature if we should do so
+ if(ha->dwFileFlags3 != 0)
+ {
+ // The (signature) file must be non-encrypted and non-compressed
+ assert(ha->dwFileFlags3 == MPQ_FILE_EXISTS);
+
+ // Create the (signature) file file in the MPQ
+ // Note that the file must not be compressed or encrypted
+ nError = SFileAddFile_Init(ha, SIGNATURE_NAME,
+ 0,
+ sizeof(EmptySignature),
+ LANG_NEUTRAL,
+ ha->dwFileFlags3 | MPQ_FILE_REPLACEEXISTING,
+ &hf);
+
+ // Write the empty signature file to the archive
+ if(nError == ERROR_SUCCESS)
+ {
+ // Write the empty zeroed fiel to the MPQ
+ memset(EmptySignature, 0, sizeof(EmptySignature));
+ nError = SFileAddFile_Write(hf, EmptySignature, (DWORD)sizeof(EmptySignature), 0);
+ }
+
+ // If the save process succeeded, we clear the MPQ_FLAG_ATTRIBUTE_INVALID flag
+ if(nError == ERROR_SUCCESS)
+ {
+ ha->dwFlags &= ~MPQ_FLAG_SIGNATURE_INVALID;
+ ha->dwReservedFiles--;
+ }
+
+ // Free the file
+ if(hf != NULL)
+ SFileAddFile_Finish(hf);
+ }
+
+ return nError;
+}
+
+int SSignFileFinish(TMPQArchive * ha)
+{
+ MPQ_SIGNATURE_INFO si;
+ unsigned long signature_len = MPQ_WEAK_SIGNATURE_SIZE;
+ BYTE WeakSignature[MPQ_SIGNATURE_FILE_SIZE];
+ BYTE Md5Digest[MD5_DIGEST_SIZE];
+ rsa_key key;
+ int hash_idx = find_hash("md5");
+
+ // Sanity checks
+ assert((ha->dwFlags & MPQ_FLAG_CHANGED) == 0);
+ assert(ha->dwFileFlags3 == MPQ_FILE_EXISTS);
+
+ // Query the weak signature info
+ memset(&si, 0, sizeof(MPQ_SIGNATURE_INFO));
+ if(!QueryMpqSignatureInfo(ha, &si))
+ return ERROR_FILE_CORRUPT;
+
+ // There must be exactly one signature
+ if(si.SignatureTypes != SIGNATURE_TYPE_WEAK)
+ return ERROR_FILE_CORRUPT;
+
+ // Calculate MD5 of the entire archive
+ if(!CalculateMpqHashMd5(ha, &si, Md5Digest))
+ return ERROR_VERIFY_FAILED;
+
+ // Decode the private key
+ if(!decode_base64_key(szBlizzardWeakPrivateKey, &key))
+ return ERROR_VERIFY_FAILED;
+
+ // Sign the hash
+ memset(WeakSignature, 0, sizeof(WeakSignature));
+ rsa_sign_hash_ex(Md5Digest, sizeof(Md5Digest), WeakSignature + 8, &signature_len, LTC_LTC_PKCS_1_V1_5, 0, 0, hash_idx, 0, &key);
+ memrev(WeakSignature + 8, MPQ_WEAK_SIGNATURE_SIZE);
+ rsa_free(&key);
+
+ // Write the signature to the MPQ. Don't use SFile* functions, but write the hash directly
+ if(!FileStream_Write(ha->pStream, &si.BeginExclude, WeakSignature, MPQ_SIGNATURE_FILE_SIZE))
+ return GetLastError();
+
+ return ERROR_SUCCESS;
+}
+
//-----------------------------------------------------------------------------
// Public (exported) functions
@@ -900,6 +991,10 @@ DWORD WINAPI SFileVerifyArchive(HANDLE hMpq)
if(!IsValidMpqHandle(hMpq))
return ERROR_VERIFY_FAILED;
+ // If the archive was modified, we need to flush it
+ if(ha->dwFlags & MPQ_FLAG_CHANGED)
+ SFileFlushArchive(hMpq);
+
// Get the MPQ signature and signature type
memset(&si, 0, sizeof(MPQ_SIGNATURE_INFO));
if(!QueryMpqSignatureInfo(ha, &si))
@@ -922,3 +1017,44 @@ DWORD WINAPI SFileVerifyArchive(HANDLE hMpq)
return ERROR_NO_SIGNATURE;
}
+
+// Verifies the archive against the signature
+bool WINAPI SFileSignArchive(HANDLE hMpq, DWORD dwSignatureType)
+{
+ TMPQArchive * ha;
+
+ // Verify the archive handle
+ ha = IsValidMpqHandle(hMpq);
+ if(ha == NULL)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return false;
+ }
+
+ // We only support weak signature, and only for MPQs version 1.0
+ if(dwSignatureType != SIGNATURE_TYPE_WEAK)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return false;
+ }
+
+ // The archive must not be malformed and must not be read-only
+ if(ha->dwFlags & (MPQ_FLAG_READ_ONLY | MPQ_FLAG_MALFORMED))
+ {
+ SetLastError(ERROR_ACCESS_DENIED);
+ return false;
+ }
+
+ // If the signature is not there yet
+ if(ha->dwFileFlags3 == 0)
+ {
+ // Turn the signature on. The signature will
+ // be applied when the archive is closed
+ ha->dwFlags |= MPQ_FLAG_SIGNATURE_INVALID | MPQ_FLAG_CHANGED;
+ ha->dwFileFlags3 = MPQ_FILE_EXISTS;
+ ha->dwReservedFiles++;
+ }
+
+ return true;
+}
+
diff --git a/src/StormCommon.h b/src/StormCommon.h
index 52a5620..25cc981 100644
--- a/src/StormCommon.h
+++ b/src/StormCommon.h
@@ -77,6 +77,7 @@
#define MPQ_WEAK_SIGNATURE_SIZE 64
#define MPQ_STRONG_SIGNATURE_SIZE 256
#define MPQ_STRONG_SIGNATURE_ID 0x5349474E // ID of the strong signature ("NGIS")
+#define MPQ_SIGNATURE_FILE_SIZE (MPQ_WEAK_SIGNATURE_SIZE + 8)
// MPQ signature info
typedef struct _MPQ_SIGNATURE_INFO
@@ -302,6 +303,12 @@ int SAttrFileSaveToMpq(TMPQArchive * ha);
int SListFileSaveToMpq(TMPQArchive * ha);
+//-----------------------------------------------------------------------------
+// Weak signature support
+
+int SSignFileCreate(TMPQArchive * ha);
+int SSignFileFinish(TMPQArchive * ha);
+
//-----------------------------------------------------------------------------
// Dump data support
diff --git a/src/StormLib.h b/src/StormLib.h
index 3ff72e8..ce1c02f 100644
--- a/src/StormLib.h
+++ b/src/StormLib.h
@@ -68,6 +68,7 @@
/* 29.05.12 8.20 Lad C-only interface */
/* 14.01.13 8.21 Lad ADPCM and Huffmann (de)compression refactored */
/* 04.12.13 9.00 Lad Unit tests, bug fixes */
+/* 27.08.14 9.10 Lad Signing archives with weak digital signature */
/*****************************************************************************/
#ifndef __STORMLIB_H__
@@ -132,8 +133,8 @@ extern "C" {
//-----------------------------------------------------------------------------
// Defines
-#define STORMLIB_VERSION 0x0900 // Current version of StormLib (9.0)
-#define STORMLIB_VERSION_STRING "9.00" // String version of StormLib version
+#define STORMLIB_VERSION 0x090A // Current version of StormLib (9.1)
+#define STORMLIB_VERSION_STRING "9.10" // String version of StormLib version
#define ID_MPQ 0x1A51504D // MPQ archive header ID ('MPQ\x1A')
#define ID_MPQ_USERDATA 0x1B51504D // MPQ userdata entry ('MPQ\x1B')
@@ -180,7 +181,8 @@ extern "C" {
#define MPQ_FLAG_CHECK_SECTOR_CRC 0x00000008 // Checking sector CRC when reading files
#define MPQ_FLAG_LISTFILE_INVALID 0x00000020 // If set, it means that the (listfile) has been invalidated
#define MPQ_FLAG_ATTRIBUTES_INVALID 0x00000040 // If set, it means that the (attributes) has been invalidated
-#define MPQ_FLAG_SAVING_TABLES 0x00000080 // If set, we are saving MPQ internal files and MPQ tables
+#define MPQ_FLAG_SIGNATURE_INVALID 0x00000080 // If set, it means that the (signature) has been invalidated
+#define MPQ_FLAG_SAVING_TABLES 0x00000100 // If set, we are saving MPQ internal files and MPQ tables
// Values for TMPQArchive::dwSubType
#define MPQ_SUBTYPE_MPQ 0x00000000 // The file is a MPQ file (Blizzard games)
@@ -290,6 +292,7 @@ extern "C" {
// Flags for SFileCreateArchive
#define MPQ_CREATE_LISTFILE 0x00100000 // Also add the (listfile) file
#define MPQ_CREATE_ATTRIBUTES 0x00200000 // Also add the (attributes) file
+#define MPQ_CREATE_SIGNATURE 0x00400000 // Also add the (signature) file
#define MPQ_CREATE_ARCHIVE_V1 0x00000000 // Creates archive of version 1 (size up to 4GB)
#define MPQ_CREATE_ARCHIVE_V2 0x01000000 // Creates archive of version 2 (larger than 4 GB)
#define MPQ_CREATE_ARCHIVE_V3 0x02000000 // Creates archive of version 3
@@ -852,6 +855,7 @@ typedef struct _TMPQArchive
DWORD dwSectorSize; // Default size of one file sector
DWORD dwFileFlags1; // Flags for (listfile)
DWORD dwFileFlags2; // Flags for (attributes)
+ DWORD dwFileFlags3; // Flags for (signature)
DWORD dwAttrFlags; // Flags for the (attributes) file, see MPQ_ATTRIBUTE_XXX
DWORD dwFlags; // See MPQ_FLAG_XXXXX
DWORD dwSubType; // See MPQ_SUBTYPE_XXX
@@ -929,6 +933,7 @@ typedef struct _SFILE_CREATE_MPQ
DWORD dwStreamFlags; // Stream flags for creating the MPQ
DWORD dwFileFlags1; // File flags for (listfile). 0 = default
DWORD dwFileFlags2; // File flags for (attributes). 0 = default
+ DWORD dwFileFlags3; // File flags for (signature). 0 = default
DWORD dwAttrFlags; // Flags for the (attributes) file. If 0, no attributes will be created
DWORD dwSectorSize; // Sector size for compressed files
DWORD dwRawChunkSize; // Size of raw data chunk
@@ -1058,6 +1063,7 @@ DWORD WINAPI SFileVerifyFile(HANDLE hMpq, const char * szFileName, DWORD dwFlag
int WINAPI SFileVerifyRawData(HANDLE hMpq, DWORD dwWhatToVerify, const char * szFileName);
// Verifies the signature, if present
+bool WINAPI SFileSignArchive(HANDLE hMpq, DWORD dwSignatureType);
DWORD WINAPI SFileVerifyArchive(HANDLE hMpq);
//-----------------------------------------------------------------------------
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_bit_string.c b/src/libtomcrypt/src/pk/asn1/der_encode_bit_string.c
new file mode 100644
index 0000000..ca29c58
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_bit_string.c
@@ -0,0 +1,89 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file der_encode_bit_string.c
+ ASN.1 DER, encode a BIT STRING, Tom St Denis
+*/
+
+
+#ifdef LTC_DER
+
+/**
+ Store a BIT STRING
+ @param in The array of bits to store (one per char)
+ @param inlen The number of bits tostore
+ @param out [out] The destination for the DER encoded BIT STRING
+ @param outlen [in/out] The max size and resulting size of the DER BIT STRING
+ @return CRYPT_OK if successful
+*/
+int der_encode_bit_string(const unsigned char *in, unsigned long inlen,
+ unsigned char *out, unsigned long *outlen)
+{
+ unsigned long len, x, y;
+ unsigned char buf;
+ int err;
+
+ LTC_ARGCHK(in != NULL);
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+
+ /* avoid overflows */
+ if ((err = der_length_bit_string(inlen, &len)) != CRYPT_OK) {
+ return err;
+ }
+
+ if (len > *outlen) {
+ *outlen = len;
+ return CRYPT_BUFFER_OVERFLOW;
+ }
+
+ /* store header (include bit padding count in length) */
+ x = 0;
+ y = (inlen >> 3) + ((inlen&7) ? 1 : 0) + 1;
+
+ out[x++] = 0x03;
+ if (y < 128) {
+ out[x++] = (unsigned char)y;
+ } else if (y < 256) {
+ out[x++] = 0x81;
+ out[x++] = (unsigned char)y;
+ } else if (y < 65536) {
+ out[x++] = 0x82;
+ out[x++] = (unsigned char)((y>>8)&255);
+ out[x++] = (unsigned char)(y&255);
+ }
+
+ /* store number of zero padding bits */
+ out[x++] = (unsigned char)((8 - inlen) & 7);
+
+ /* store the bits in big endian format */
+ for (y = buf = 0; y < inlen; y++) {
+ buf |= (in[y] ? 1 : 0) << (7 - (y & 7));
+ if ((y & 7) == 7) {
+ out[x++] = buf;
+ buf = 0;
+ }
+ }
+ /* store last byte */
+ if (inlen & 7) {
+ out[x++] = buf;
+ }
+ *outlen = x;
+ return CRYPT_OK;
+}
+
+#endif
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/bit/der_encode_bit_string.c,v $ */
+/* $Revision: 1.5 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_boolean.c b/src/libtomcrypt/src/pk/asn1/der_encode_boolean.c
new file mode 100644
index 0000000..ded2731
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_boolean.c
@@ -0,0 +1,51 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file der_encode_boolean.c
+ ASN.1 DER, encode a BOOLEAN, Tom St Denis
+*/
+
+
+#ifdef LTC_DER
+
+/**
+ Store a BOOLEAN
+ @param in The boolean to encode
+ @param out [out] The destination for the DER encoded BOOLEAN
+ @param outlen [in/out] The max size and resulting size of the DER BOOLEAN
+ @return CRYPT_OK if successful
+*/
+int der_encode_boolean(int in,
+ unsigned char *out, unsigned long *outlen)
+{
+ LTC_ARGCHK(outlen != NULL);
+ LTC_ARGCHK(out != NULL);
+
+ if (*outlen < 3) {
+ *outlen = 3;
+ return CRYPT_BUFFER_OVERFLOW;
+ }
+
+ *outlen = 3;
+ out[0] = 0x01;
+ out[1] = 0x01;
+ out[2] = in ? 0xFF : 0x00;
+
+ return CRYPT_OK;
+}
+
+#endif
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/boolean/der_encode_boolean.c,v $ */
+/* $Revision: 1.4 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_ia5_string.c b/src/libtomcrypt/src/pk/asn1/der_encode_ia5_string.c
new file mode 100644
index 0000000..30d3f43
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_ia5_string.c
@@ -0,0 +1,85 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file der_encode_ia5_string.c
+ ASN.1 DER, encode a IA5 STRING, Tom St Denis
+*/
+
+#ifdef LTC_DER
+
+/**
+ Store an IA5 STRING
+ @param in The array of IA5 to store (one per char)
+ @param inlen The number of IA5 to store
+ @param out [out] The destination for the DER encoded IA5 STRING
+ @param outlen [in/out] The max size and resulting size of the DER IA5 STRING
+ @return CRYPT_OK if successful
+*/
+int der_encode_ia5_string(const unsigned char *in, unsigned long inlen,
+ unsigned char *out, unsigned long *outlen)
+{
+ unsigned long x, y, len;
+ int err;
+
+ LTC_ARGCHK(in != NULL);
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+
+ /* get the size */
+ if ((err = der_length_ia5_string(in, inlen, &len)) != CRYPT_OK) {
+ return err;
+ }
+
+ /* too big? */
+ if (len > *outlen) {
+ *outlen = len;
+ return CRYPT_BUFFER_OVERFLOW;
+ }
+
+ /* encode the header+len */
+ x = 0;
+ out[x++] = 0x16;
+ if (inlen < 128) {
+ out[x++] = (unsigned char)inlen;
+ } else if (inlen < 256) {
+ out[x++] = 0x81;
+ out[x++] = (unsigned char)inlen;
+ } else if (inlen < 65536UL) {
+ out[x++] = 0x82;
+ out[x++] = (unsigned char)((inlen>>8)&255);
+ out[x++] = (unsigned char)(inlen&255);
+ } else if (inlen < 16777216UL) {
+ out[x++] = 0x83;
+ out[x++] = (unsigned char)((inlen>>16)&255);
+ out[x++] = (unsigned char)((inlen>>8)&255);
+ out[x++] = (unsigned char)(inlen&255);
+ } else {
+ return CRYPT_INVALID_ARG;
+ }
+
+ /* store octets */
+ for (y = 0; y < inlen; y++) {
+ out[x++] = der_ia5_char_encode(in[y]);
+ }
+
+ /* retun length */
+ *outlen = x;
+
+ return CRYPT_OK;
+}
+
+#endif
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/ia5/der_encode_ia5_string.c,v $ */
+/* $Revision: 1.5 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_integer.c b/src/libtomcrypt/src/pk/asn1/der_encode_integer.c
new file mode 100644
index 0000000..4137a94
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_integer.c
@@ -0,0 +1,130 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file der_encode_integer.c
+ ASN.1 DER, encode an integer, Tom St Denis
+*/
+
+
+#ifdef LTC_DER
+
+/* Exports a positive bignum as DER format (upto 2^32 bytes in size) */
+/**
+ Store a mp_int integer
+ @param num The first mp_int to encode
+ @param out [out] The destination for the DER encoded integers
+ @param outlen [in/out] The max size and resulting size of the DER encoded integers
+ @return CRYPT_OK if successful
+*/
+int der_encode_integer(void *num, unsigned char *out, unsigned long *outlen)
+{
+ unsigned long tmplen, y;
+ int err, leading_zero;
+
+ LTC_ARGCHK(num != NULL);
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+
+ /* find out how big this will be */
+ if ((err = der_length_integer(num, &tmplen)) != CRYPT_OK) {
+ return err;
+ }
+
+ if (*outlen < tmplen) {
+ *outlen = tmplen;
+ return CRYPT_BUFFER_OVERFLOW;
+ }
+
+ if (mp_cmp_d(num, 0) != LTC_MP_LT) {
+ /* we only need a leading zero if the msb of the first byte is one */
+ if ((mp_count_bits(num) & 7) == 0 || mp_iszero(num) == LTC_MP_YES) {
+ leading_zero = 1;
+ } else {
+ leading_zero = 0;
+ }
+
+ /* get length of num in bytes (plus 1 since we force the msbyte to zero) */
+ y = mp_unsigned_bin_size(num) + leading_zero;
+ } else {
+ leading_zero = 0;
+ y = mp_count_bits(num);
+ y = y + (8 - (y & 7));
+ y = y >> 3;
+ if (((mp_cnt_lsb(num)+1)==mp_count_bits(num)) && ((mp_count_bits(num)&7)==0)) --y;
+ }
+
+ /* now store initial data */
+ *out++ = 0x02;
+ if (y < 128) {
+ /* short form */
+ *out++ = (unsigned char)y;
+ } else if (y < 256) {
+ *out++ = 0x81;
+ *out++ = (unsigned char)y;
+ } else if (y < 65536UL) {
+ *out++ = 0x82;
+ *out++ = (unsigned char)((y>>8)&255);
+ *out++ = (unsigned char)y;
+ } else if (y < 16777216UL) {
+ *out++ = 0x83;
+ *out++ = (unsigned char)((y>>16)&255);
+ *out++ = (unsigned char)((y>>8)&255);
+ *out++ = (unsigned char)y;
+ } else {
+ return CRYPT_INVALID_ARG;
+ }
+
+ /* now store msbyte of zero if num is non-zero */
+ if (leading_zero) {
+ *out++ = 0x00;
+ }
+
+ /* if it's not zero store it as big endian */
+ if (mp_cmp_d(num, 0) == LTC_MP_GT) {
+ /* now store the mpint */
+ if ((err = mp_to_unsigned_bin(num, out)) != CRYPT_OK) {
+ return err;
+ }
+ } else if (mp_iszero(num) != LTC_MP_YES) {
+ void *tmp;
+
+ /* negative */
+ if (mp_init(&tmp) != CRYPT_OK) {
+ return CRYPT_MEM;
+ }
+
+ /* 2^roundup and subtract */
+ y = mp_count_bits(num);
+ y = y + (8 - (y & 7));
+ if (((mp_cnt_lsb(num)+1)==mp_count_bits(num)) && ((mp_count_bits(num)&7)==0)) y -= 8;
+ if (mp_2expt(tmp, y) != CRYPT_OK || mp_add(tmp, num, tmp) != CRYPT_OK) {
+ mp_clear(tmp);
+ return CRYPT_MEM;
+ }
+ if ((err = mp_to_unsigned_bin(tmp, out)) != CRYPT_OK) {
+ mp_clear(tmp);
+ return err;
+ }
+ mp_clear(tmp);
+ }
+
+ /* we good */
+ *outlen = tmplen;
+ return CRYPT_OK;
+}
+
+#endif
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/integer/der_encode_integer.c,v $ */
+/* $Revision: 1.9 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_object_identifier.c b/src/libtomcrypt/src/pk/asn1/der_encode_object_identifier.c
new file mode 100644
index 0000000..68e2162
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_object_identifier.c
@@ -0,0 +1,111 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file der_encode_object_identifier.c
+ ASN.1 DER, Encode Object Identifier, Tom St Denis
+*/
+
+#ifdef LTC_DER
+/**
+ Encode an OID
+ @param words The words to encode (upto 32-bits each)
+ @param nwords The number of words in the OID
+ @param out [out] Destination of OID data
+ @param outlen [in/out] The max and resulting size of the OID
+ @return CRYPT_OK if successful
+*/
+int der_encode_object_identifier(unsigned long *words, unsigned long nwords,
+ unsigned char *out, unsigned long *outlen)
+{
+ unsigned long i, x, y, z, t, mask, wordbuf;
+ int err;
+
+ LTC_ARGCHK(words != NULL);
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+
+ /* check length */
+ if ((err = der_length_object_identifier(words, nwords, &x)) != CRYPT_OK) {
+ return err;
+ }
+ if (x > *outlen) {
+ *outlen = x;
+ return CRYPT_BUFFER_OVERFLOW;
+ }
+
+ /* compute length to store OID data */
+ z = 0;
+ wordbuf = words[0] * 40 + words[1];
+ for (y = 1; y < nwords; y++) {
+ t = der_object_identifier_bits(wordbuf);
+ z += t/7 + ((t%7) ? 1 : 0) + (wordbuf == 0 ? 1 : 0);
+ if (y < nwords - 1) {
+ wordbuf = words[y + 1];
+ }
+ }
+
+ /* store header + length */
+ x = 0;
+ out[x++] = 0x06;
+ if (z < 128) {
+ out[x++] = (unsigned char)z;
+ } else if (z < 256) {
+ out[x++] = 0x81;
+ out[x++] = (unsigned char)z;
+ } else if (z < 65536UL) {
+ out[x++] = 0x82;
+ out[x++] = (unsigned char)((z>>8)&255);
+ out[x++] = (unsigned char)(z&255);
+ } else {
+ return CRYPT_INVALID_ARG;
+ }
+
+ /* store first byte */
+ wordbuf = words[0] * 40 + words[1];
+ for (i = 1; i < nwords; i++) {
+ /* store 7 bit words in little endian */
+ t = wordbuf & 0xFFFFFFFF;
+ if (t) {
+ y = x;
+ mask = 0;
+ while (t) {
+ out[x++] = (unsigned char)((t & 0x7F) | mask);
+ t >>= 7;
+ mask |= 0x80; /* upper bit is set on all but the last byte */
+ }
+ /* now swap bytes y...x-1 */
+ z = x - 1;
+ while (y < z) {
+ t = out[y]; out[y] = out[z]; out[z] = (unsigned char)t;
+ ++y;
+ --z;
+ }
+ } else {
+ /* zero word */
+ out[x++] = 0x00;
+ }
+
+ if (i < nwords - 1) {
+ wordbuf = words[i + 1];
+ }
+ }
+
+ *outlen = x;
+ return CRYPT_OK;
+}
+
+#endif
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/object_identifier/der_encode_object_identifier.c,v $ */
+/* $Revision: 1.7 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_octet_string.c b/src/libtomcrypt/src/pk/asn1/der_encode_octet_string.c
new file mode 100644
index 0000000..b3ee7f4
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_octet_string.c
@@ -0,0 +1,86 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file der_encode_octet_string.c
+ ASN.1 DER, encode a OCTET STRING, Tom St Denis
+*/
+
+
+#ifdef LTC_DER
+
+/**
+ Store an OCTET STRING
+ @param in The array of OCTETS to store (one per char)
+ @param inlen The number of OCTETS to store
+ @param out [out] The destination for the DER encoded OCTET STRING
+ @param outlen [in/out] The max size and resulting size of the DER OCTET STRING
+ @return CRYPT_OK if successful
+*/
+int der_encode_octet_string(const unsigned char *in, unsigned long inlen,
+ unsigned char *out, unsigned long *outlen)
+{
+ unsigned long x, y, len;
+ int err;
+
+ LTC_ARGCHK(in != NULL);
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+
+ /* get the size */
+ if ((err = der_length_octet_string(inlen, &len)) != CRYPT_OK) {
+ return err;
+ }
+
+ /* too big? */
+ if (len > *outlen) {
+ *outlen = len;
+ return CRYPT_BUFFER_OVERFLOW;
+ }
+
+ /* encode the header+len */
+ x = 0;
+ out[x++] = 0x04;
+ if (inlen < 128) {
+ out[x++] = (unsigned char)inlen;
+ } else if (inlen < 256) {
+ out[x++] = 0x81;
+ out[x++] = (unsigned char)inlen;
+ } else if (inlen < 65536UL) {
+ out[x++] = 0x82;
+ out[x++] = (unsigned char)((inlen>>8)&255);
+ out[x++] = (unsigned char)(inlen&255);
+ } else if (inlen < 16777216UL) {
+ out[x++] = 0x83;
+ out[x++] = (unsigned char)((inlen>>16)&255);
+ out[x++] = (unsigned char)((inlen>>8)&255);
+ out[x++] = (unsigned char)(inlen&255);
+ } else {
+ return CRYPT_INVALID_ARG;
+ }
+
+ /* store octets */
+ for (y = 0; y < inlen; y++) {
+ out[x++] = in[y];
+ }
+
+ /* retun length */
+ *outlen = x;
+
+ return CRYPT_OK;
+}
+
+#endif
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/octet/der_encode_octet_string.c,v $ */
+/* $Revision: 1.5 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_printable_string.c b/src/libtomcrypt/src/pk/asn1/der_encode_printable_string.c
new file mode 100644
index 0000000..a1dab5f
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_printable_string.c
@@ -0,0 +1,85 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file der_encode_printable_string.c
+ ASN.1 DER, encode a printable STRING, Tom St Denis
+*/
+
+#ifdef LTC_DER
+
+/**
+ Store an printable STRING
+ @param in The array of printable to store (one per char)
+ @param inlen The number of printable to store
+ @param out [out] The destination for the DER encoded printable STRING
+ @param outlen [in/out] The max size and resulting size of the DER printable STRING
+ @return CRYPT_OK if successful
+*/
+int der_encode_printable_string(const unsigned char *in, unsigned long inlen,
+ unsigned char *out, unsigned long *outlen)
+{
+ unsigned long x, y, len;
+ int err;
+
+ LTC_ARGCHK(in != NULL);
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+
+ /* get the size */
+ if ((err = der_length_printable_string(in, inlen, &len)) != CRYPT_OK) {
+ return err;
+ }
+
+ /* too big? */
+ if (len > *outlen) {
+ *outlen = len;
+ return CRYPT_BUFFER_OVERFLOW;
+ }
+
+ /* encode the header+len */
+ x = 0;
+ out[x++] = 0x13;
+ if (inlen < 128) {
+ out[x++] = (unsigned char)inlen;
+ } else if (inlen < 256) {
+ out[x++] = 0x81;
+ out[x++] = (unsigned char)inlen;
+ } else if (inlen < 65536UL) {
+ out[x++] = 0x82;
+ out[x++] = (unsigned char)((inlen>>8)&255);
+ out[x++] = (unsigned char)(inlen&255);
+ } else if (inlen < 16777216UL) {
+ out[x++] = 0x83;
+ out[x++] = (unsigned char)((inlen>>16)&255);
+ out[x++] = (unsigned char)((inlen>>8)&255);
+ out[x++] = (unsigned char)(inlen&255);
+ } else {
+ return CRYPT_INVALID_ARG;
+ }
+
+ /* store octets */
+ for (y = 0; y < inlen; y++) {
+ out[x++] = der_printable_char_encode(in[y]);
+ }
+
+ /* retun length */
+ *outlen = x;
+
+ return CRYPT_OK;
+}
+
+#endif
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/printable_string/der_encode_printable_string.c,v $ */
+/* $Revision: 1.5 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_sequence_ex.c b/src/libtomcrypt/src/pk/asn1/der_encode_sequence_ex.c
new file mode 100644
index 0000000..3df19cf
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_sequence_ex.c
@@ -0,0 +1,335 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+#include
+
+
+/**
+ @file der_encode_sequence_ex.c
+ ASN.1 DER, encode a SEQUENCE, Tom St Denis
+*/
+
+#ifdef LTC_DER
+
+/**
+ Encode a SEQUENCE
+ @param list The list of items to encode
+ @param inlen The number of items in the list
+ @param out [out] The destination
+ @param outlen [in/out] The size of the output
+ @param type_of LTC_ASN1_SEQUENCE or LTC_ASN1_SET/LTC_ASN1_SETOF
+ @return CRYPT_OK on success
+*/
+int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen,
+ unsigned char *out, unsigned long *outlen, int type_of)
+{
+ int err, type;
+ unsigned long size, x, y, z, i;
+ void *data;
+
+ LTC_ARGCHK(list != NULL);
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+
+ /* get size of output that will be required */
+ y = 0;
+ for (i = 0; i < inlen; i++) {
+ type = list[i].type;
+ size = list[i].size;
+ data = list[i].data;
+
+ if (type == LTC_ASN1_EOL) {
+ break;
+ }
+
+ switch (type) {
+ case LTC_ASN1_BOOLEAN:
+ if ((err = der_length_boolean(&x)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ y += x;
+ break;
+
+ case LTC_ASN1_INTEGER:
+ if ((err = der_length_integer(data, &x)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ y += x;
+ break;
+
+ case LTC_ASN1_SHORT_INTEGER:
+ if ((err = der_length_short_integer(*((unsigned long*)data), &x)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ y += x;
+ break;
+
+ case LTC_ASN1_BIT_STRING:
+ if ((err = der_length_bit_string(size, &x)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ y += x;
+ break;
+
+ case LTC_ASN1_OCTET_STRING:
+ if ((err = der_length_octet_string(size, &x)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ y += x;
+ break;
+
+ case LTC_ASN1_NULL:
+ y += 2;
+ break;
+
+ case LTC_ASN1_OBJECT_IDENTIFIER:
+ if ((err = der_length_object_identifier(data, size, &x)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ y += x;
+ break;
+
+ case LTC_ASN1_IA5_STRING:
+ if ((err = der_length_ia5_string(data, size, &x)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ y += x;
+ break;
+
+ case LTC_ASN1_PRINTABLE_STRING:
+ if ((err = der_length_printable_string(data, size, &x)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ y += x;
+ break;
+
+ case LTC_ASN1_UTF8_STRING:
+ if ((err = der_length_utf8_string(data, size, &x)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ y += x;
+ break;
+
+ case LTC_ASN1_UTCTIME:
+ if ((err = der_length_utctime(data, &x)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ y += x;
+ break;
+
+ case LTC_ASN1_SET:
+ case LTC_ASN1_SETOF:
+ case LTC_ASN1_SEQUENCE:
+ if ((err = der_length_sequence(data, size, &x)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ y += x;
+ break;
+
+ default:
+ err = CRYPT_INVALID_ARG;
+ goto LBL_ERR;
+ }
+ }
+
+ /* calc header size */
+ z = y;
+ if (y < 128) {
+ y += 2;
+ } else if (y < 256) {
+ /* 0x30 0x81 LL */
+ y += 3;
+ } else if (y < 65536UL) {
+ /* 0x30 0x82 LL LL */
+ y += 4;
+ } else if (y < 16777216UL) {
+ /* 0x30 0x83 LL LL LL */
+ y += 5;
+ } else {
+ err = CRYPT_INVALID_ARG;
+ goto LBL_ERR;
+ }
+
+ /* too big ? */
+ if (*outlen < y) {
+ *outlen = y;
+ err = CRYPT_BUFFER_OVERFLOW;
+ goto LBL_ERR;
+ }
+
+ /* store header */
+ x = 0;
+ out[x++] = (type_of == LTC_ASN1_SEQUENCE) ? 0x30 : 0x31;
+
+ if (z < 128) {
+ out[x++] = (unsigned char)z;
+ } else if (z < 256) {
+ out[x++] = 0x81;
+ out[x++] = (unsigned char)z;
+ } else if (z < 65536UL) {
+ out[x++] = 0x82;
+ out[x++] = (unsigned char)((z>>8UL)&255);
+ out[x++] = (unsigned char)(z&255);
+ } else if (z < 16777216UL) {
+ out[x++] = 0x83;
+ out[x++] = (unsigned char)((z>>16UL)&255);
+ out[x++] = (unsigned char)((z>>8UL)&255);
+ out[x++] = (unsigned char)(z&255);
+ }
+
+ /* store data */
+ *outlen -= x;
+ for (i = 0; i < inlen; i++) {
+ type = list[i].type;
+ size = list[i].size;
+ data = list[i].data;
+
+ if (type == LTC_ASN1_EOL) {
+ break;
+ }
+
+ switch (type) {
+ case LTC_ASN1_BOOLEAN:
+ z = *outlen;
+ if ((err = der_encode_boolean(*((int *)data), out + x, &z)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ case LTC_ASN1_INTEGER:
+ z = *outlen;
+ if ((err = der_encode_integer(data, out + x, &z)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ case LTC_ASN1_SHORT_INTEGER:
+ z = *outlen;
+ if ((err = der_encode_short_integer(*((unsigned long*)data), out + x, &z)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ case LTC_ASN1_BIT_STRING:
+ z = *outlen;
+ if ((err = der_encode_bit_string(data, size, out + x, &z)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ case LTC_ASN1_OCTET_STRING:
+ z = *outlen;
+ if ((err = der_encode_octet_string(data, size, out + x, &z)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ case LTC_ASN1_NULL:
+ out[x++] = 0x05;
+ out[x++] = 0x00;
+ *outlen -= 2;
+ break;
+
+ case LTC_ASN1_OBJECT_IDENTIFIER:
+ z = *outlen;
+ if ((err = der_encode_object_identifier(data, size, out + x, &z)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ case LTC_ASN1_IA5_STRING:
+ z = *outlen;
+ if ((err = der_encode_ia5_string(data, size, out + x, &z)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ case LTC_ASN1_PRINTABLE_STRING:
+ z = *outlen;
+ if ((err = der_encode_printable_string(data, size, out + x, &z)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ case LTC_ASN1_UTF8_STRING:
+ z = *outlen;
+ if ((err = der_encode_utf8_string(data, size, out + x, &z)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ case LTC_ASN1_UTCTIME:
+ z = *outlen;
+ if ((err = der_encode_utctime(data, out + x, &z)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ case LTC_ASN1_SET:
+ z = *outlen;
+ if ((err = der_encode_set(data, size, out + x, &z)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ case LTC_ASN1_SETOF:
+ z = *outlen;
+ if ((err = der_encode_setof(data, size, out + x, &z)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ case LTC_ASN1_SEQUENCE:
+ z = *outlen;
+ if ((err = der_encode_sequence_ex(data, size, out + x, &z, type)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ x += z;
+ *outlen -= z;
+ break;
+
+ default:
+ err = CRYPT_INVALID_ARG;
+ goto LBL_ERR;
+ }
+ }
+ *outlen = x;
+ err = CRYPT_OK;
+
+LBL_ERR:
+ return err;
+}
+
+#endif
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_sequence_multi.c b/src/libtomcrypt/src/pk/asn1/der_encode_sequence_multi.c
new file mode 100644
index 0000000..782f042
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_sequence_multi.c
@@ -0,0 +1,138 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+#include
+
+
+/**
+ @file der_encode_sequence_multi.c
+ ASN.1 DER, encode a SEQUENCE, Tom St Denis
+*/
+
+#ifdef LTC_DER
+
+/**
+ Encode a SEQUENCE type using a VA list
+ @param out [out] Destination for data
+ @param outlen [in/out] Length of buffer and resulting length of output
+ @remark <...> is of the form (int, unsigned long, void*)
+ @return CRYPT_OK on success
+*/
+int der_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...)
+{
+ int err, type;
+ unsigned long size, x;
+ void *data;
+ va_list args;
+ ltc_asn1_list *list;
+
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+
+ /* get size of output that will be required */
+ va_start(args, outlen);
+ x = 0;
+ for (;;) {
+ type = va_arg(args, int);
+ size = va_arg(args, unsigned long);
+ data = va_arg(args, void*);
+
+ if (type == LTC_ASN1_EOL) {
+ break;
+ }
+
+ switch (type) {
+ case LTC_ASN1_BOOLEAN:
+ case LTC_ASN1_INTEGER:
+ case LTC_ASN1_SHORT_INTEGER:
+ case LTC_ASN1_BIT_STRING:
+ case LTC_ASN1_OCTET_STRING:
+ case LTC_ASN1_NULL:
+ case LTC_ASN1_OBJECT_IDENTIFIER:
+ case LTC_ASN1_IA5_STRING:
+ case LTC_ASN1_PRINTABLE_STRING:
+ case LTC_ASN1_UTF8_STRING:
+ case LTC_ASN1_UTCTIME:
+ case LTC_ASN1_SEQUENCE:
+ case LTC_ASN1_SET:
+ case LTC_ASN1_SETOF:
+ ++x;
+ break;
+
+ default:
+ va_end(args);
+ return CRYPT_INVALID_ARG;
+ }
+ }
+ va_end(args);
+
+ /* allocate structure for x elements */
+ if (x == 0) {
+ return CRYPT_NOP;
+ }
+
+ list = XCALLOC(sizeof(*list), x);
+ if (list == NULL) {
+ return CRYPT_MEM;
+ }
+
+ /* fill in the structure */
+ va_start(args, outlen);
+ x = 0;
+ for (;;) {
+ type = va_arg(args, int);
+ size = va_arg(args, unsigned long);
+ data = va_arg(args, void*);
+
+ if (type == LTC_ASN1_EOL) {
+ break;
+ }
+
+ switch (type) {
+ case LTC_ASN1_BOOLEAN:
+ case LTC_ASN1_INTEGER:
+ case LTC_ASN1_SHORT_INTEGER:
+ case LTC_ASN1_BIT_STRING:
+ case LTC_ASN1_OCTET_STRING:
+ case LTC_ASN1_NULL:
+ case LTC_ASN1_OBJECT_IDENTIFIER:
+ case LTC_ASN1_IA5_STRING:
+ case LTC_ASN1_PRINTABLE_STRING:
+ case LTC_ASN1_UTF8_STRING:
+ case LTC_ASN1_UTCTIME:
+ case LTC_ASN1_SEQUENCE:
+ case LTC_ASN1_SET:
+ case LTC_ASN1_SETOF:
+ list[x].type = type;
+ list[x].size = size;
+ list[x++].data = data;
+ break;
+
+ default:
+ va_end(args);
+ err = CRYPT_INVALID_ARG;
+ goto LBL_ERR;
+ }
+ }
+ va_end(args);
+
+ err = der_encode_sequence(list, x, out, outlen);
+LBL_ERR:
+ XFREE(list);
+ return err;
+}
+
+#endif
+
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/sequence/der_encode_sequence_multi.c,v $ */
+/* $Revision: 1.12 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_set.c b/src/libtomcrypt/src/pk/asn1/der_encode_set.c
new file mode 100644
index 0000000..41f6587
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_set.c
@@ -0,0 +1,103 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file der_encode_set.c
+ ASN.1 DER, Encode a SET, Tom St Denis
+*/
+
+#ifdef LTC_DER
+
+/* LTC define to ASN.1 TAG */
+static int ltc_to_asn1(int v)
+{
+ switch (v) {
+ case LTC_ASN1_BOOLEAN: return 0x01;
+ case LTC_ASN1_INTEGER:
+ case LTC_ASN1_SHORT_INTEGER: return 0x02;
+ case LTC_ASN1_BIT_STRING: return 0x03;
+ case LTC_ASN1_OCTET_STRING: return 0x04;
+ case LTC_ASN1_NULL: return 0x05;
+ case LTC_ASN1_OBJECT_IDENTIFIER: return 0x06;
+ case LTC_ASN1_UTF8_STRING: return 0x0C;
+ case LTC_ASN1_PRINTABLE_STRING: return 0x13;
+ case LTC_ASN1_IA5_STRING: return 0x16;
+ case LTC_ASN1_UTCTIME: return 0x17;
+ case LTC_ASN1_SEQUENCE: return 0x30;
+ case LTC_ASN1_SET:
+ case LTC_ASN1_SETOF: return 0x31;
+ default: return -1;
+ }
+}
+
+
+static int qsort_helper(const void *a, const void *b)
+{
+ ltc_asn1_list *A = (ltc_asn1_list *)a, *B = (ltc_asn1_list *)b;
+ int r;
+
+ r = ltc_to_asn1(A->type) - ltc_to_asn1(B->type);
+
+ /* for QSORT the order is UNDEFINED if they are "equal" which means it is NOT DETERMINISTIC. So we force it to be :-) */
+ if (r == 0) {
+ /* their order in the original list now determines the position */
+ return A->used - B->used;
+ } else {
+ return r;
+ }
+}
+
+/*
+ Encode a SET type
+ @param list The list of items to encode
+ @param inlen The number of items in the list
+ @param out [out] The destination
+ @param outlen [in/out] The size of the output
+ @return CRYPT_OK on success
+*/
+int der_encode_set(ltc_asn1_list *list, unsigned long inlen,
+ unsigned char *out, unsigned long *outlen)
+{
+ ltc_asn1_list *copy;
+ unsigned long x;
+ int err;
+
+ /* make copy of list */
+ copy = XCALLOC(inlen, sizeof(*copy));
+ if (copy == NULL) {
+ return CRYPT_MEM;
+ }
+
+ /* fill in used member with index so we can fully sort it */
+ for (x = 0; x < inlen; x++) {
+ copy[x] = list[x];
+ copy[x].used = x;
+ }
+
+ /* sort it by the "type" field */
+ XQSORT(copy, inlen, sizeof(*copy), &qsort_helper);
+
+ /* call der_encode_sequence_ex() */
+ err = der_encode_sequence_ex(copy, inlen, out, outlen, LTC_ASN1_SET);
+
+ /* free list */
+ XFREE(copy);
+
+ return err;
+}
+
+
+#endif
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/set/der_encode_set.c,v $ */
+/* $Revision: 1.12 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_setof.c b/src/libtomcrypt/src/pk/asn1/der_encode_setof.c
new file mode 100644
index 0000000..ad7b0f6
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_setof.c
@@ -0,0 +1,162 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file der_encode_setof.c
+ ASN.1 DER, Encode SET OF, Tom St Denis
+*/
+
+#ifdef LTC_DER
+
+struct edge {
+ unsigned char *start;
+ unsigned long size;
+};
+
+static int qsort_helper(const void *a, const void *b)
+{
+ struct edge *A = (struct edge *)a, *B = (struct edge *)b;
+ int r;
+ unsigned long x;
+
+ /* compare min length */
+ r = XMEMCMP(A->start, B->start, MIN(A->size, B->size));
+
+ if (r == 0 && A->size != B->size) {
+ if (A->size > B->size) {
+ for (x = B->size; x < A->size; x++) {
+ if (A->start[x]) {
+ return 1;
+ }
+ }
+ } else {
+ for (x = A->size; x < B->size; x++) {
+ if (B->start[x]) {
+ return -1;
+ }
+ }
+ }
+ }
+
+ return r;
+}
+
+/**
+ Encode a SETOF stucture
+ @param list The list of items to encode
+ @param inlen The number of items in the list
+ @param out [out] The destination
+ @param outlen [in/out] The size of the output
+ @return CRYPT_OK on success
+*/
+int der_encode_setof(ltc_asn1_list *list, unsigned long inlen,
+ unsigned char *out, unsigned long *outlen)
+{
+ unsigned long x, y, z, hdrlen;
+ int err;
+ struct edge *edges;
+ unsigned char *ptr, *buf;
+
+ /* check that they're all the same type */
+ for (x = 1; x < inlen; x++) {
+ if (list[x].type != list[x-1].type) {
+ return CRYPT_INVALID_ARG;
+ }
+ }
+
+ /* alloc buffer to store copy of output */
+ buf = XCALLOC(1, *outlen);
+ if (buf == NULL) {
+ return CRYPT_MEM;
+ }
+
+ /* encode list */
+ if ((err = der_encode_sequence_ex(list, inlen, buf, outlen, LTC_ASN1_SETOF)) != CRYPT_OK) {
+ XFREE(buf);
+ return err;
+ }
+
+ /* allocate edges */
+ edges = XCALLOC(inlen, sizeof(*edges));
+ if (edges == NULL) {
+ XFREE(buf);
+ return CRYPT_MEM;
+ }
+
+ /* skip header */
+ ptr = buf + 1;
+
+ /* now skip length data */
+ x = *ptr++;
+ if (x >= 0x80) {
+ ptr += (x & 0x7F);
+ }
+
+ /* get the size of the static header */
+ hdrlen = ((unsigned long)ptr) - ((unsigned long)buf);
+
+
+ /* scan for edges */
+ x = 0;
+ while (ptr < (buf + *outlen)) {
+ /* store start */
+ edges[x].start = ptr;
+
+ /* skip type */
+ z = 1;
+
+ /* parse length */
+ y = ptr[z++];
+ if (y < 128) {
+ edges[x].size = y;
+ } else {
+ y &= 0x7F;
+ edges[x].size = 0;
+ while (y--) {
+ edges[x].size = (edges[x].size << 8) | ((unsigned long)ptr[z++]);
+ }
+ }
+
+ /* skip content */
+ edges[x].size += z;
+ ptr += edges[x].size;
+ ++x;
+ }
+
+ /* sort based on contents (using edges) */
+ XQSORT(edges, inlen, sizeof(*edges), &qsort_helper);
+
+ /* copy static header */
+ XMEMCPY(out, buf, hdrlen);
+
+ /* copy+sort using edges+indecies to output from buffer */
+ for (y = hdrlen, x = 0; x < inlen; x++) {
+ XMEMCPY(out+y, edges[x].start, edges[x].size);
+ y += edges[x].size;
+ }
+
+#ifdef LTC_CLEAN_STACK
+ zeromem(buf, *outlen);
+#endif
+
+ /* free buffers */
+ XFREE(edges);
+ XFREE(buf);
+
+ return CRYPT_OK;
+}
+
+#endif
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/set/der_encode_setof.c,v $ */
+/* $Revision: 1.12 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_short_integer.c b/src/libtomcrypt/src/pk/asn1/der_encode_short_integer.c
new file mode 100644
index 0000000..9b167d0
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_short_integer.c
@@ -0,0 +1,97 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file der_encode_short_integer.c
+ ASN.1 DER, encode an integer, Tom St Denis
+*/
+
+
+#ifdef LTC_DER
+
+/**
+ Store a short integer in the range (0,2^32-1)
+ @param num The integer to encode
+ @param out [out] The destination for the DER encoded integers
+ @param outlen [in/out] The max size and resulting size of the DER encoded integers
+ @return CRYPT_OK if successful
+*/
+int der_encode_short_integer(unsigned long num, unsigned char *out, unsigned long *outlen)
+{
+ unsigned long len, x, y, z;
+ int err;
+
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+
+ /* force to 32 bits */
+ num &= 0xFFFFFFFFUL;
+
+ /* find out how big this will be */
+ if ((err = der_length_short_integer(num, &len)) != CRYPT_OK) {
+ return err;
+ }
+
+ if (*outlen < len) {
+ *outlen = len;
+ return CRYPT_BUFFER_OVERFLOW;
+ }
+
+ /* get len of output */
+ z = 0;
+ y = num;
+ while (y) {
+ ++z;
+ y >>= 8;
+ }
+
+ /* handle zero */
+ if (z == 0) {
+ z = 1;
+ }
+
+ /* see if msb is set */
+ z += (num&(1UL<<((z<<3) - 1))) ? 1 : 0;
+
+ /* adjust the number so the msB is non-zero */
+ for (x = 0; (z <= 4) && (x < (4 - z)); x++) {
+ num <<= 8;
+ }
+
+ /* store header */
+ x = 0;
+ out[x++] = 0x02;
+ out[x++] = (unsigned char)z;
+
+ /* if 31st bit is set output a leading zero and decrement count */
+ if (z == 5) {
+ out[x++] = 0;
+ --z;
+ }
+
+ /* store values */
+ for (y = 0; y < z; y++) {
+ out[x++] = (unsigned char)((num >> 24) & 0xFF);
+ num <<= 8;
+ }
+
+ /* we good */
+ *outlen = x;
+
+ return CRYPT_OK;
+}
+
+#endif
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/short_integer/der_encode_short_integer.c,v $ */
+/* $Revision: 1.8 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_utctime.c b/src/libtomcrypt/src/pk/asn1/der_encode_utctime.c
new file mode 100644
index 0000000..167a2b4
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_utctime.c
@@ -0,0 +1,83 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file der_encode_utctime.c
+ ASN.1 DER, encode a UTCTIME, Tom St Denis
+*/
+
+#ifdef LTC_DER
+
+static const char *baseten = "0123456789";
+
+#define STORE_V(y) \
+ out[x++] = der_ia5_char_encode(baseten[(y/10) % 10]); \
+ out[x++] = der_ia5_char_encode(baseten[y % 10]);
+
+/**
+ Encodes a UTC time structure in DER format
+ @param utctime The UTC time structure to encode
+ @param out The destination of the DER encoding of the UTC time structure
+ @param outlen [in/out] The length of the DER encoding
+ @return CRYPT_OK if successful
+*/
+int der_encode_utctime(ltc_utctime *utctime,
+ unsigned char *out, unsigned long *outlen)
+{
+ unsigned long x, tmplen;
+ int err;
+
+ LTC_ARGCHK(utctime != NULL);
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+
+ if ((err = der_length_utctime(utctime, &tmplen)) != CRYPT_OK) {
+ return err;
+ }
+ if (tmplen > *outlen) {
+ *outlen = tmplen;
+ return CRYPT_BUFFER_OVERFLOW;
+ }
+
+ /* store header */
+ out[0] = 0x17;
+
+ /* store values */
+ x = 2;
+ STORE_V(utctime->YY);
+ STORE_V(utctime->MM);
+ STORE_V(utctime->DD);
+ STORE_V(utctime->hh);
+ STORE_V(utctime->mm);
+ STORE_V(utctime->ss);
+
+ if (utctime->off_mm || utctime->off_hh) {
+ out[x++] = der_ia5_char_encode(utctime->off_dir ? '-' : '+');
+ STORE_V(utctime->off_hh);
+ STORE_V(utctime->off_mm);
+ } else {
+ out[x++] = der_ia5_char_encode('Z');
+ }
+
+ /* store length */
+ out[1] = (unsigned char)(x - 2);
+
+ /* all good let's return */
+ *outlen = x;
+ return CRYPT_OK;
+}
+
+#endif
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/utctime/der_encode_utctime.c,v $ */
+/* $Revision: 1.10 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/asn1/der_encode_utf8_string.c b/src/libtomcrypt/src/pk/asn1/der_encode_utf8_string.c
new file mode 100644
index 0000000..84d8d06
--- /dev/null
+++ b/src/libtomcrypt/src/pk/asn1/der_encode_utf8_string.c
@@ -0,0 +1,105 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file der_encode_utf8_string.c
+ ASN.1 DER, encode a UTF8 STRING, Tom St Denis
+*/
+
+
+#ifdef LTC_DER
+
+/**
+ Store an UTF8 STRING
+ @param in The array of UTF8 to store (one per wchar_t)
+ @param inlen The number of UTF8 to store
+ @param out [out] The destination for the DER encoded UTF8 STRING
+ @param outlen [in/out] The max size and resulting size of the DER UTF8 STRING
+ @return CRYPT_OK if successful
+*/
+int der_encode_utf8_string(const wchar_t *in, unsigned long inlen,
+ unsigned char *out, unsigned long *outlen)
+{
+ unsigned long x, y, len;
+
+ LTC_ARGCHK(in != NULL);
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+
+ /* get the size */
+ for (x = len = 0; x < inlen; x++) {
+ if (in[x] < 0 || in[x] > 0x1FFFF) {
+ return CRYPT_INVALID_ARG;
+ }
+ len += der_utf8_charsize(in[x]);
+ }
+
+ if (len < 128) {
+ y = 2 + len;
+ } else if (len < 256) {
+ y = 3 + len;
+ } else if (len < 65536UL) {
+ y = 4 + len;
+ } else if (len < 16777216UL) {
+ y = 5 + len;
+ } else {
+ return CRYPT_INVALID_ARG;
+ }
+
+ /* too big? */
+ if (y > *outlen) {
+ *outlen = len;
+ return CRYPT_BUFFER_OVERFLOW;
+ }
+
+ /* encode the header+len */
+ x = 0;
+ out[x++] = 0x0C;
+ if (len < 128) {
+ out[x++] = (unsigned char)len;
+ } else if (len < 256) {
+ out[x++] = 0x81;
+ out[x++] = (unsigned char)len;
+ } else if (len < 65536UL) {
+ out[x++] = 0x82;
+ out[x++] = (unsigned char)((len>>8)&255);
+ out[x++] = (unsigned char)(len&255);
+ } else if (len < 16777216UL) {
+ out[x++] = 0x83;
+ out[x++] = (unsigned char)((len>>16)&255);
+ out[x++] = (unsigned char)((len>>8)&255);
+ out[x++] = (unsigned char)(len&255);
+ } else {
+ return CRYPT_INVALID_ARG;
+ }
+
+ /* store UTF8 */
+ for (y = 0; y < inlen; y++) {
+ switch (der_utf8_charsize(in[y])) {
+ case 1: out[x++] = (unsigned char)in[y]; break;
+ case 2: out[x++] = 0xC0 | ((in[y] >> 6) & 0x1F); out[x++] = 0x80 | (in[y] & 0x3F); break;
+ case 3: out[x++] = 0xE0 | ((in[y] >> 12) & 0x0F); out[x++] = 0x80 | ((in[y] >> 6) & 0x3F); out[x++] = 0x80 | (in[y] & 0x3F); break;
+ case 4: out[x++] = 0xF0 | ((in[y] >> 18) & 0x07); out[x++] = 0x80 | ((in[y] >> 12) & 0x3F); out[x++] = 0x80 | ((in[y] >> 6) & 0x3F); out[x++] = 0x80 | (in[y] & 0x3F); break;
+ }
+ }
+
+ /* retun length */
+ *outlen = x;
+
+ return CRYPT_OK;
+}
+
+#endif
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/utf8/der_encode_utf8_string.c,v $ */
+/* $Revision: 1.9 $ */
+/* $Date: 2006/12/28 01:27:24 $ */
diff --git a/src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_encode.c b/src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_encode.c
new file mode 100644
index 0000000..68d5e86
--- /dev/null
+++ b/src/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_encode.c
@@ -0,0 +1,175 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file pkcs_1_pss_encode.c
+ LTC_PKCS #1 PSS Signature Padding, Tom St Denis
+*/
+
+#ifdef LTC_PKCS_1
+
+/**
+ LTC_PKCS #1 v2.00 Signature Encoding
+ @param msghash The hash to encode
+ @param msghashlen The length of the hash (octets)
+ @param saltlen The length of the salt desired (octets)
+ @param prng An active PRNG context
+ @param prng_idx The index of the PRNG desired
+ @param hash_idx The index of the hash desired
+ @param modulus_bitlen The bit length of the RSA modulus
+ @param out [out] The destination of the encoding
+ @param outlen [in/out] The max size and resulting size of the encoded data
+ @return CRYPT_OK if successful
+*/
+int pkcs_1_pss_encode(const unsigned char *msghash, unsigned long msghashlen,
+ unsigned long saltlen, prng_state *prng,
+ int prng_idx, int hash_idx,
+ unsigned long modulus_bitlen,
+ unsigned char *out, unsigned long *outlen)
+{
+ unsigned char *DB, *mask, *salt, *hash;
+ unsigned long x, y, hLen, modulus_len;
+ int err;
+ hash_state md;
+
+ LTC_ARGCHK(msghash != NULL);
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+
+ /* ensure hash and PRNG are valid */
+ if ((err = hash_is_valid(hash_idx)) != CRYPT_OK) {
+ return err;
+ }
+ if ((err = prng_is_valid(prng_idx)) != CRYPT_OK) {
+ return err;
+ }
+
+ hLen = hash_descriptor[hash_idx].hashsize;
+ modulus_len = (modulus_bitlen>>3) + (modulus_bitlen & 7 ? 1 : 0);
+
+ /* check sizes */
+ if ((saltlen > modulus_len) || (modulus_len < hLen + saltlen + 2)) {
+ return CRYPT_PK_INVALID_SIZE;
+ }
+
+ /* allocate ram for DB/mask/salt/hash of size modulus_len */
+ DB = XMALLOC(modulus_len);
+ mask = XMALLOC(modulus_len);
+ salt = XMALLOC(modulus_len);
+ hash = XMALLOC(modulus_len);
+ if (DB == NULL || mask == NULL || salt == NULL || hash == NULL) {
+ if (DB != NULL) {
+ XFREE(DB);
+ }
+ if (mask != NULL) {
+ XFREE(mask);
+ }
+ if (salt != NULL) {
+ XFREE(salt);
+ }
+ if (hash != NULL) {
+ XFREE(hash);
+ }
+ return CRYPT_MEM;
+ }
+
+
+ /* generate random salt */
+ if (saltlen > 0) {
+ if (prng_descriptor[prng_idx].read(salt, saltlen, prng) != saltlen) {
+ err = CRYPT_ERROR_READPRNG;
+ goto LBL_ERR;
+ }
+ }
+
+ /* M = (eight) 0x00 || msghash || salt, hash = H(M) */
+ if ((err = hash_descriptor[hash_idx].init(&md)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ zeromem(DB, 8);
+ if ((err = hash_descriptor[hash_idx].process(&md, DB, 8)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ if ((err = hash_descriptor[hash_idx].process(&md, msghash, msghashlen)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ if ((err = hash_descriptor[hash_idx].process(&md, salt, saltlen)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+ if ((err = hash_descriptor[hash_idx].done(&md, hash)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+
+ /* generate DB = PS || 0x01 || salt, PS == modulus_len - saltlen - hLen - 2 zero bytes */
+ x = 0;
+ XMEMSET(DB + x, 0, modulus_len - saltlen - hLen - 2);
+ x += modulus_len - saltlen - hLen - 2;
+ DB[x++] = 0x01;
+ XMEMCPY(DB + x, salt, saltlen);
+ x += saltlen;
+
+ /* generate mask of length modulus_len - hLen - 1 from hash */
+ if ((err = pkcs_1_mgf1(hash_idx, hash, hLen, mask, modulus_len - hLen - 1)) != CRYPT_OK) {
+ goto LBL_ERR;
+ }
+
+ /* xor against DB */
+ for (y = 0; y < (modulus_len - hLen - 1); y++) {
+ DB[y] ^= mask[y];
+ }
+
+ /* output is DB || hash || 0xBC */
+ if (*outlen < modulus_len) {
+ *outlen = modulus_len;
+ err = CRYPT_BUFFER_OVERFLOW;
+ goto LBL_ERR;
+ }
+
+ /* DB len = modulus_len - hLen - 1 */
+ y = 0;
+ XMEMCPY(out + y, DB, modulus_len - hLen - 1);
+ y += modulus_len - hLen - 1;
+
+ /* hash */
+ XMEMCPY(out + y, hash, hLen);
+ y += hLen;
+
+ /* 0xBC */
+ out[y] = 0xBC;
+
+ /* now clear the 8*modulus_len - modulus_bitlen most significant bits */
+ out[0] &= 0xFF >> ((modulus_len<<3) - (modulus_bitlen-1));
+
+ /* store output size */
+ *outlen = modulus_len;
+ err = CRYPT_OK;
+LBL_ERR:
+#ifdef LTC_CLEAN_STACK
+ zeromem(DB, modulus_len);
+ zeromem(mask, modulus_len);
+ zeromem(salt, modulus_len);
+ zeromem(hash, modulus_len);
+#endif
+
+ XFREE(hash);
+ XFREE(salt);
+ XFREE(mask);
+ XFREE(DB);
+
+ return err;
+}
+
+#endif /* LTC_PKCS_1 */
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_encode.c,v $ */
+/* $Revision: 1.9 $ */
+/* $Date: 2007/05/12 14:32:35 $ */
diff --git a/src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_encode.c b/src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_encode.c
new file mode 100644
index 0000000..4342919
--- /dev/null
+++ b/src/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_encode.c
@@ -0,0 +1,111 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/*! \file pkcs_1_v1_5_encode.c
+ *
+ * LTC_PKCS #1 v1.5 Padding (Andreas Lange)
+ */
+
+#ifdef LTC_PKCS_1
+
+/*! \brief LTC_PKCS #1 v1.5 encode.
+ *
+ * \param msg The data to encode
+ * \param msglen The length of the data to encode (octets)
+ * \param block_type Block type to use in padding (\sa ltc_pkcs_1_v1_5_blocks)
+ * \param modulus_bitlen The bit length of the RSA modulus
+ * \param prng An active PRNG state (only for LTC_LTC_PKCS_1_EME)
+ * \param prng_idx The index of the PRNG desired (only for LTC_LTC_PKCS_1_EME)
+ * \param out [out] The destination for the encoded data
+ * \param outlen [in/out] The max size and resulting size of the encoded data
+ *
+ * \return CRYPT_OK if successful
+ */
+int pkcs_1_v1_5_encode(const unsigned char *msg,
+ unsigned long msglen,
+ int block_type,
+ unsigned long modulus_bitlen,
+ prng_state *prng,
+ int prng_idx,
+ unsigned char *out,
+ unsigned long *outlen)
+{
+ unsigned long modulus_len, ps_len, i;
+ unsigned char *ps;
+ int result;
+
+ /* valid block_type? */
+ if ((block_type != LTC_LTC_PKCS_1_EMSA) &&
+ (block_type != LTC_LTC_PKCS_1_EME)) {
+ return CRYPT_PK_INVALID_PADDING;
+ }
+
+ if (block_type == LTC_LTC_PKCS_1_EME) { /* encryption padding, we need a valid PRNG */
+ if ((result = prng_is_valid(prng_idx)) != CRYPT_OK) {
+ return result;
+ }
+ }
+
+ modulus_len = (modulus_bitlen >> 3) + (modulus_bitlen & 7 ? 1 : 0);
+
+ /* test message size */
+ if ((msglen + 11) > modulus_len) {
+ return CRYPT_PK_INVALID_SIZE;
+ }
+
+ if (*outlen < modulus_len) {
+ *outlen = modulus_len;
+ result = CRYPT_BUFFER_OVERFLOW;
+ goto bail;
+ }
+
+ /* generate an octets string PS */
+ ps = &out[2];
+ ps_len = modulus_len - msglen - 3;
+
+ if (block_type == LTC_LTC_PKCS_1_EME) {
+ /* now choose a random ps */
+ if (prng_descriptor[prng_idx].read(ps, ps_len, prng) != ps_len) {
+ result = CRYPT_ERROR_READPRNG;
+ goto bail;
+ }
+
+ /* transform zero bytes (if any) to non-zero random bytes */
+ for (i = 0; i < ps_len; i++) {
+ while (ps[i] == 0) {
+ if (prng_descriptor[prng_idx].read(&ps[i], 1, prng) != 1) {
+ result = CRYPT_ERROR_READPRNG;
+ goto bail;
+ }
+ }
+ }
+ } else {
+ XMEMSET(ps, 0xFF, ps_len);
+ }
+
+ /* create string of length modulus_len */
+ out[0] = 0x00;
+ out[1] = (unsigned char)block_type; /* block_type 1 or 2 */
+ out[2 + ps_len] = 0x00;
+ XMEMCPY(&out[2 + ps_len + 1], msg, msglen);
+ *outlen = modulus_len;
+
+ result = CRYPT_OK;
+bail:
+ return result;
+} /* pkcs_1_v1_5_encode */
+
+#endif /* #ifdef LTC_PKCS_1 */
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/pkcs1/pkcs_1_v1_5_encode.c,v $ */
+/* $Revision: 1.4 $ */
+/* $Date: 2007/05/12 14:32:35 $ */
diff --git a/src/libtomcrypt/src/pk/rsa/rsa_sign_hash.c b/src/libtomcrypt/src/pk/rsa/rsa_sign_hash.c
new file mode 100644
index 0000000..49fb858
--- /dev/null
+++ b/src/libtomcrypt/src/pk/rsa/rsa_sign_hash.c
@@ -0,0 +1,134 @@
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis
+ *
+ * LibTomCrypt is a library that provides various cryptographic
+ * algorithms in a highly modular and flexible manner.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
+ */
+#include "../../headers/tomcrypt.h"
+
+/**
+ @file rsa_sign_hash.c
+ RSA LTC_PKCS #1 v1.5 and v2 PSS sign hash, Tom St Denis and Andreas Lange
+*/
+
+#ifdef LTC_MRSA
+
+/**
+ LTC_PKCS #1 pad then sign
+ @param in The hash to sign
+ @param inlen The length of the hash to sign (octets)
+ @param out [out] The signature
+ @param outlen [in/out] The max size and resulting size of the signature
+ @param padding Type of padding (LTC_LTC_PKCS_1_PSS or LTC_LTC_PKCS_1_V1_5)
+ @param prng An active PRNG state
+ @param prng_idx The index of the PRNG desired
+ @param hash_idx The index of the hash desired
+ @param saltlen The length of the salt desired (octets)
+ @param key The private RSA key to use
+ @return CRYPT_OK if successful
+*/
+int rsa_sign_hash_ex(const unsigned char *in, unsigned long inlen,
+ unsigned char *out, unsigned long *outlen,
+ int padding,
+ prng_state *prng, int prng_idx,
+ int hash_idx, unsigned long saltlen,
+ rsa_key *key)
+{
+ unsigned long modulus_bitlen, modulus_bytelen, x, y;
+ int err;
+
+ LTC_ARGCHK(in != NULL);
+ LTC_ARGCHK(out != NULL);
+ LTC_ARGCHK(outlen != NULL);
+ LTC_ARGCHK(key != NULL);
+
+ /* valid padding? */
+ if ((padding != LTC_LTC_PKCS_1_V1_5) && (padding != LTC_LTC_PKCS_1_PSS)) {
+ return CRYPT_PK_INVALID_PADDING;
+ }
+
+ if (padding == LTC_LTC_PKCS_1_PSS) {
+ /* valid prng and hash ? */
+ if ((err = prng_is_valid(prng_idx)) != CRYPT_OK) {
+ return err;
+ }
+ if ((err = hash_is_valid(hash_idx)) != CRYPT_OK) {
+ return err;
+ }
+ }
+
+ /* get modulus len in bits */
+ modulus_bitlen = mp_count_bits((key->N));
+
+ /* outlen must be at least the size of the modulus */
+ modulus_bytelen = mp_unsigned_bin_size((key->N));
+ if (modulus_bytelen > *outlen) {
+ *outlen = modulus_bytelen;
+ return CRYPT_BUFFER_OVERFLOW;
+ }
+
+ if (padding == LTC_LTC_PKCS_1_PSS) {
+ /* PSS pad the key */
+ x = *outlen;
+ if ((err = pkcs_1_pss_encode(in, inlen, saltlen, prng, prng_idx,
+ hash_idx, modulus_bitlen, out, &x)) != CRYPT_OK) {
+ return err;
+ }
+ } else {
+ /* LTC_PKCS #1 v1.5 pad the hash */
+ unsigned char *tmpin;
+ ltc_asn1_list digestinfo[2], siginfo[2];
+
+ /* not all hashes have OIDs... so sad */
+ if (hash_descriptor[hash_idx].OIDlen == 0) {
+ return CRYPT_INVALID_ARG;
+ }
+
+ /* construct the SEQUENCE
+ SEQUENCE {
+ SEQUENCE {hashoid OID
+ blah NULL
+ }
+ hash OCTET STRING
+ }
+ */
+ LTC_SET_ASN1(digestinfo, 0, LTC_ASN1_OBJECT_IDENTIFIER, hash_descriptor[hash_idx].OID, hash_descriptor[hash_idx].OIDlen);
+ LTC_SET_ASN1(digestinfo, 1, LTC_ASN1_NULL, NULL, 0);
+ LTC_SET_ASN1(siginfo, 0, LTC_ASN1_SEQUENCE, digestinfo, 2);
+ LTC_SET_ASN1(siginfo, 1, LTC_ASN1_OCTET_STRING, in, inlen);
+
+ /* allocate memory for the encoding */
+ y = mp_unsigned_bin_size(key->N);
+ tmpin = XMALLOC(y);
+ if (tmpin == NULL) {
+ return CRYPT_MEM;
+ }
+
+ if ((err = der_encode_sequence(siginfo, 2, tmpin, &y)) != CRYPT_OK) {
+ XFREE(tmpin);
+ return err;
+ }
+
+ x = *outlen;
+ if ((err = pkcs_1_v1_5_encode(tmpin, y, LTC_LTC_PKCS_1_EMSA,
+ modulus_bitlen, NULL, 0,
+ out, &x)) != CRYPT_OK) {
+ XFREE(tmpin);
+ return err;
+ }
+ XFREE(tmpin);
+ }
+
+ /* RSA encode it */
+ return ltc_mp.rsa_me(out, x, out, outlen, PK_PRIVATE, key);
+}
+
+#endif /* LTC_MRSA */
+
+/* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_sign_hash.c,v $ */
+/* $Revision: 1.11 $ */
+/* $Date: 2007/05/12 14:32:35 $ */
diff --git a/test/StormTest.cpp b/test/StormTest.cpp
index 63669e9..c70115c 100644
--- a/test/StormTest.cpp
+++ b/test/StormTest.cpp
@@ -1655,6 +1655,7 @@ static int CreateNewArchive_V2(TLogHelper * pLogger, const char * szPlainName, D
CreateInfo.dwStreamFlags = STREAM_PROVIDER_FLAT | BASE_PROVIDER_FILE;
CreateInfo.dwFileFlags1 = (dwCreateFlags & MPQ_CREATE_LISTFILE) ? MPQ_FILE_EXISTS : 0;
CreateInfo.dwFileFlags2 = (dwCreateFlags & MPQ_CREATE_ATTRIBUTES) ? MPQ_FILE_EXISTS : 0;
+ CreateInfo.dwFileFlags3 = (dwCreateFlags & MPQ_CREATE_SIGNATURE) ? MPQ_FILE_EXISTS : 0;
CreateInfo.dwAttrFlags = (dwCreateFlags & MPQ_CREATE_ATTRIBUTES) ? (MPQ_ATTRIBUTE_CRC32 | MPQ_ATTRIBUTE_FILETIME | MPQ_ATTRIBUTE_MD5) : 0;
CreateInfo.dwSectorSize = (CreateInfo.dwMpqVersion >= MPQ_FORMAT_VERSION_3) ? 0x4000 : 0x1000;
CreateInfo.dwRawChunkSize = (CreateInfo.dwMpqVersion >= MPQ_FORMAT_VERSION_4) ? 0x4000 : 0;
@@ -2594,6 +2595,114 @@ static int TestOpenArchive_VerifySignature(const char * szPlainName, const char
return nError;
}
+static int TestOpenArchive_ModifySigned(const char * szPlainName, const char * szOriginalName)
+{
+ TLogHelper Logger("ModifySignedTest", szPlainName);
+ HANDLE hMpq = NULL;
+ int nVerifyError;
+ int nError = ERROR_SUCCESS;
+
+ // We need original name for the signature check
+ nError = OpenExistingArchiveWithCopy(&Logger, szPlainName, szOriginalName, &hMpq);
+ if(nError == ERROR_SUCCESS)
+ {
+ // Verify the weak signature
+ Logger.PrintProgress("Verifying archive signature ...");
+ nVerifyError = SFileVerifyArchive(hMpq);
+
+ // Check the result signature
+ if(nVerifyError != ERROR_WEAK_SIGNATURE_OK)
+ {
+ Logger.PrintMessage("Weak signature verification error");
+ nError = ERROR_FILE_CORRUPT;
+ }
+ }
+
+ // Add a file and verify the signature again
+ if(nError == ERROR_SUCCESS)
+ {
+ // Verify any of the present signatures
+ Logger.PrintProgress("Modifying signed archive ...");
+ nError = AddFileToMpq(&Logger, hMpq, "AddedFile01.txt", "This is a file added to signed MPQ", 0, 0, true);
+ }
+
+ // Verify the signature again
+ if(nError == ERROR_SUCCESS)
+ {
+ // Verify the weak signature
+ Logger.PrintProgress("Verifying archive signature ...");
+ nVerifyError = SFileVerifyArchive(hMpq);
+
+ // Check the result signature
+ if(nVerifyError != ERROR_WEAK_SIGNATURE_OK)
+ {
+ Logger.PrintMessage("Weak signature verification error");
+ nError = ERROR_FILE_CORRUPT;
+ }
+ }
+
+ // Close the MPQ
+ if(hMpq != NULL)
+ SFileCloseArchive(hMpq);
+ return nError;
+}
+
+static int TestOpenArchive_SignExisting(const char * szPlainName)
+{
+ TLogHelper Logger("SignExistingMpq", szPlainName);
+ HANDLE hMpq = NULL;
+ int nVerifyError;
+ int nError = ERROR_SUCCESS;
+
+ // We need original name for the signature check
+ nError = OpenExistingArchiveWithCopy(&Logger, szPlainName, szPlainName, &hMpq);
+ if(nError == ERROR_SUCCESS)
+ {
+ // Verify the weak signature
+ Logger.PrintProgress("Verifying archive signature ...");
+ nVerifyError = SFileVerifyArchive(hMpq);
+
+ // Check the result signature
+ if(nVerifyError != ERROR_NO_SIGNATURE)
+ {
+ Logger.PrintMessage("There already is a signature in the MPQ");
+ nError = ERROR_FILE_CORRUPT;
+ }
+ }
+
+ // Add a file and verify the signature again
+ if(nError == ERROR_SUCCESS)
+ {
+ // Verify any of the present signatures
+ Logger.PrintProgress("Signing the MPQ ...");
+ if(!SFileSignArchive(hMpq, SIGNATURE_TYPE_WEAK))
+ {
+ Logger.PrintMessage("Failed to create archive signature");
+ nError = ERROR_FILE_CORRUPT;
+ }
+ }
+
+ // Verify the signature again
+ if(nError == ERROR_SUCCESS)
+ {
+ // Verify the weak signature
+ Logger.PrintProgress("Verifying archive signature ...");
+ nVerifyError = SFileVerifyArchive(hMpq);
+
+ // Check the result signature
+ if(nVerifyError != ERROR_WEAK_SIGNATURE_OK)
+ {
+ Logger.PrintMessage("Weak signature verification error");
+ nError = ERROR_FILE_CORRUPT;
+ }
+ }
+
+ // Close the MPQ
+ if(hMpq != NULL)
+ SFileCloseArchive(hMpq);
+ return nError;
+}
+
// Open an empty archive (found in WoW cache - it's just a header)
static int TestOpenArchive_CraftedUserData(const char * szPlainName, const char * szCopyName)
{
@@ -2895,7 +3004,7 @@ static int TestCreateArchive_EmptyMpq(const char * szPlainName, DWORD dwCreateFl
static int TestCreateArchive_TestGaps(const char * szPlainName)
{
- TLogHelper Logger("CreateMpqEditor", szPlainName);
+ TLogHelper Logger("CreateGapsTest", szPlainName);
ULONGLONG ByteOffset1 = 0xFFFFFFFF;
ULONGLONG ByteOffset2 = 0xEEEEEEEE;
HANDLE hMpq = NULL;
@@ -2966,6 +3075,60 @@ static int TestCreateArchive_TestGaps(const char * szPlainName)
return nError;
}
+static int TestCreateArchive_Signed(const char * szPlainName, bool bSignAtCreate)
+{
+ TLogHelper Logger("CreateSignedMpq", szPlainName);
+ HANDLE hMpq = NULL;
+ DWORD dwCreateFlags = MPQ_CREATE_LISTFILE | MPQ_CREATE_ATTRIBUTES | MPQ_FORMAT_VERSION_1;
+ DWORD dwSignatures = 0;
+ DWORD nVerifyError = 0;
+ int nError = ERROR_SUCCESS;
+
+ // Method 1: Create the archive as signed
+ if(bSignAtCreate)
+ dwCreateFlags |= MPQ_CREATE_SIGNATURE;
+
+ // Create new MPQ
+ nError = CreateNewArchive_V2(&Logger, szPlainName, dwCreateFlags, 4000, &hMpq);
+ if(nError == ERROR_SUCCESS)
+ {
+ // Add one file and flush the archive
+ nError = AddFileToMpq(&Logger, hMpq, "AddedFile01.txt", "This is the file data.", MPQ_FILE_COMPRESS);
+ }
+
+ // Sign the archive with weak signature
+ if(nError == ERROR_SUCCESS)
+ {
+ if(!SFileSignArchive(hMpq, SIGNATURE_TYPE_WEAK))
+ nError = ERROR_SUCCESS;
+ }
+
+ // Reopen the MPQ and add another file.
+ // The new file must be added to the position of the (listfile)
+ if(nError == ERROR_SUCCESS)
+ {
+ // Query the signature types
+ Logger.PrintProgress("Retrieving signatures ...");
+ TestGetFileInfo(&Logger, hMpq, SFileMpqSignatures, &dwSignatures, sizeof(DWORD), NULL, true, ERROR_SUCCESS);
+
+ // Verify any of the present signatures
+ Logger.PrintProgress("Verifying archive signature ...");
+ nVerifyError = SFileVerifyArchive(hMpq);
+
+ // Verify the result
+ if((dwSignatures != SIGNATURE_TYPE_WEAK) && (nVerifyError != ERROR_WEAK_SIGNATURE_OK))
+ {
+ Logger.PrintMessage("Weak signature verification error");
+ nError = ERROR_FILE_CORRUPT;
+ }
+ }
+
+ // Close the archive
+ if(hMpq != NULL)
+ SFileCloseArchive(hMpq);
+ return nError;
+}
+
static int TestCreateArchive_MpqEditor(const char * szPlainName, const char * szFileName)
{
TLogHelper Logger("CreateMpqEditor", szPlainName);
@@ -3866,6 +4029,21 @@ int main(int argc, char * argv[])
if(nError == ERROR_SUCCESS)
nError = TestCreateArchive_TestGaps("StormLibTest_GapsTest.mpq");
+ // Sign an existing non-signed archive
+ if(nError == ERROR_SUCCESS)
+ nError = TestOpenArchive_SignExisting("MPQ_1998_v1_StarDat.mpq");
+
+ // Open a signed archive, add a file and verify the signature
+ if(nError == ERROR_SUCCESS)
+ nError = TestOpenArchive_ModifySigned("MPQ_1999_v1_WeakSignature.exe", "War2Patch_202.exe");
+
+ // Create new archive and sign it
+ if(nError == ERROR_SUCCESS)
+ nError = TestCreateArchive_Signed("MPQ_1999_v1_WeakSigned1.mpq", true);
+
+ if(nError == ERROR_SUCCESS)
+ nError = TestCreateArchive_Signed("MPQ_1999_v1_WeakSigned2.mpq", false);
+
// Test creating of an archive the same way like MPQ Editor does
if(nError == ERROR_SUCCESS)
nError = TestCreateArchive_MpqEditor("StormLibTest_MpqEditorTest.mpq", "AddedFile.exe");