From b15f54e39cb36540408e374edcda8871e6e71295 Mon Sep 17 00:00:00 2001 From: Matt Johnston Date: Wed, 6 Jul 2005 03:53:40 +0000 Subject: [PATCH] Import of libtomcrypt 1.05 --HG-- branch : libtomcrypt-orig extra : convert_revision : 42edf60b8235e6aa06e306688266188818e41c03 --- Doxyfile | 2 +- TODO | 9 + build.sh | 20 + changes | 81 +++ crypt.tex | 602 +++++++++++++----- demos/encrypt.c | 4 + demos/hashsum.c | 4 + demos/multi.c | 4 + demos/small.c | 4 + demos/test.c | 27 +- demos/timing.c | 5 +- demos/tv_gen.c | 4 + doc/crypt.pdf | Bin 457121 -> 484454 bytes doc/footer.html | 6 + doc/header.html | 6 + genlist.sh | 4 + makefile | 103 ++- makefile.icc | 69 +- makefile.msvc | 60 +- makefile.shared | 99 ++- mess.sh | 4 + notes/etc/saferp_optimizer.c | 4 + notes/etc/whirlgen.c | 4 + notes/etc/whirltest.c | 4 + notes/tech0005.txt | 18 + notes/tech0006.txt | 91 +++ parsenames.pl | 4 + run.sh | 35 + src/ciphers/aes/aes.c | 6 +- src/ciphers/aes/aes_tab.c | 4 + src/ciphers/anubis.c | 4 + src/ciphers/blowfish.c | 4 + src/ciphers/cast5.c | 4 + src/ciphers/des.c | 4 + src/ciphers/khazad.c | 4 + src/ciphers/noekeon.c | 4 + src/ciphers/rc2.c | 4 + src/ciphers/rc5.c | 4 + src/ciphers/rc6.c | 4 + src/ciphers/safer/safer.c | 4 + src/ciphers/safer/safer_tab.c | 4 + src/ciphers/safer/saferp.c | 4 + src/ciphers/skipjack.c | 4 + src/ciphers/twofish/twofish.c | 6 +- src/ciphers/twofish/twofish_tab.c | 4 + src/ciphers/xtea.c | 4 + src/encauth/ccm/ccm_memory.c | 5 +- src/encauth/ccm/ccm_test.c | 4 + src/encauth/eax/eax_addheader.c | 4 + src/encauth/eax/eax_decrypt.c | 4 + src/encauth/eax/eax_decrypt_verify_memory.c | 4 + src/encauth/eax/eax_done.c | 4 + src/encauth/eax/eax_encrypt.c | 4 + .../eax/eax_encrypt_authenticate_memory.c | 4 + src/encauth/eax/eax_init.c | 8 +- src/encauth/eax/eax_test.c | 4 + src/encauth/gcm/gcm_add_aad.c | 9 +- src/encauth/gcm/gcm_add_iv.c | 4 + src/encauth/gcm/gcm_done.c | 4 + src/encauth/gcm/gcm_gf_mult.c | 5 + src/encauth/gcm/gcm_init.c | 71 ++- src/encauth/gcm/gcm_memory.c | 4 + src/encauth/gcm/gcm_process.c | 4 + src/encauth/gcm/gcm_reset.c | 4 + src/encauth/gcm/gcm_test.c | 5 +- src/encauth/ocb/ocb_decrypt.c | 4 + src/encauth/ocb/ocb_decrypt_verify_memory.c | 4 + src/encauth/ocb/ocb_done_decrypt.c | 4 + src/encauth/ocb/ocb_done_encrypt.c | 4 + src/encauth/ocb/ocb_encrypt.c | 4 + .../ocb/ocb_encrypt_authenticate_memory.c | 4 + src/encauth/ocb/ocb_init.c | 4 + src/encauth/ocb/ocb_ntz.c | 4 + src/encauth/ocb/ocb_shift_xor.c | 4 + src/encauth/ocb/ocb_test.c | 4 + src/encauth/ocb/s_ocb_done.c | 4 + src/hashes/chc/chc.c | 4 + src/hashes/helper/hash_file.c | 4 + src/hashes/helper/hash_filehandle.c | 4 + src/hashes/helper/hash_memory.c | 4 + src/hashes/helper/hash_memory_multi.c | 4 + src/hashes/md2.c | 12 +- src/hashes/md4.c | 10 +- src/hashes/md5.c | 12 +- src/hashes/rmd128.c | 10 +- src/hashes/rmd160.c | 11 +- src/hashes/sha1.c | 11 +- src/hashes/sha2/sha224.c | 10 +- src/hashes/sha2/sha256.c | 12 +- src/hashes/sha2/sha384.c | 12 +- src/hashes/sha2/sha512.c | 12 +- src/hashes/tiger.c | 12 +- src/hashes/whirl/whirl.c | 10 +- src/hashes/whirl/whirltab.c | 4 + src/headers/ltc_tommath.h | 4 + src/headers/tomcrypt.h | 8 +- src/headers/tomcrypt_argchk.h | 4 + src/headers/tomcrypt_cfg.h | 4 + src/headers/tomcrypt_cipher.h | 20 +- src/headers/tomcrypt_custom.h | 76 ++- src/headers/tomcrypt_hash.h | 45 +- src/headers/tomcrypt_mac.h | 4 + src/headers/tomcrypt_macros.h | 12 +- src/headers/tomcrypt_misc.h | 4 + src/headers/tomcrypt_pk.h | 163 ++++- src/headers/tomcrypt_pkcs.h | 32 +- src/headers/tomcrypt_prng.h | 5 + src/headers/tommath_class.h | 4 + src/headers/tommath_superclass.h | 10 +- src/mac/hmac/hmac_done.c | 4 + src/mac/hmac/hmac_file.c | 4 + src/mac/hmac/hmac_init.c | 4 + src/mac/hmac/hmac_memory.c | 4 + src/mac/hmac/hmac_memory_multi.c | 4 + src/mac/hmac/hmac_process.c | 4 + src/mac/hmac/hmac_test.c | 4 + src/mac/omac/omac_done.c | 4 + src/mac/omac/omac_file.c | 4 + src/mac/omac/omac_init.c | 6 +- src/mac/omac/omac_memory.c | 4 + src/mac/omac/omac_memory_multi.c | 4 + src/mac/omac/omac_process.c | 9 +- src/mac/omac/omac_test.c | 4 + src/mac/pelican/pelican.c | 16 + src/mac/pelican/pelican_memory.c | 4 + src/mac/pelican/pelican_test.c | 4 + src/mac/pmac/pmac_done.c | 4 + src/mac/pmac/pmac_file.c | 4 + src/mac/pmac/pmac_init.c | 4 + src/mac/pmac/pmac_memory.c | 4 + src/mac/pmac/pmac_memory_multi.c | 4 + src/mac/pmac/pmac_ntz.c | 4 + src/mac/pmac/pmac_process.c | 4 + src/mac/pmac/pmac_shift_xor.c | 4 + src/mac/pmac/pmac_test.c | 4 + src/misc/base64/base64_decode.c | 4 + src/misc/base64/base64_encode.c | 4 + src/misc/burn_stack.c | 4 + src/misc/crypt/crypt.c | 13 + src/misc/crypt/crypt_argchk.c | 4 + src/misc/crypt/crypt_cipher_descriptor.c | 6 + src/misc/crypt/crypt_cipher_is_valid.c | 7 + src/misc/crypt/crypt_find_cipher.c | 7 + src/misc/crypt/crypt_find_cipher_any.c | 7 + src/misc/crypt/crypt_find_cipher_id.c | 10 +- src/misc/crypt/crypt_find_hash.c | 7 + src/misc/crypt/crypt_find_hash_any.c | 6 + src/misc/crypt/crypt_find_hash_id.c | 14 +- src/misc/crypt/crypt_find_prng.c | 7 + src/misc/crypt/crypt_hash_descriptor.c | 7 + src/misc/crypt/crypt_hash_is_valid.c | 7 + src/misc/crypt/crypt_prng_descriptor.c | 7 + src/misc/crypt/crypt_prng_is_valid.c | 7 + src/misc/crypt/crypt_register_cipher.c | 8 + src/misc/crypt/crypt_register_hash.c | 8 + src/misc/crypt/crypt_register_prng.c | 8 + src/misc/crypt/crypt_unregister_cipher.c | 7 + src/misc/crypt/crypt_unregister_hash.c | 7 + src/misc/crypt/crypt_unregister_prng.c | 9 +- src/misc/error_to_string.c | 4 + src/misc/mpi/is_prime.c | 4 + src/misc/mpi/mpi.c | 4 + src/misc/mpi/mpi_to_ltc_error.c | 4 + src/misc/mpi/rand_prime.c | 4 + src/misc/pkcs5/pkcs_5_1.c | 4 + src/misc/pkcs5/pkcs_5_2.c | 4 + src/misc/zeromem.c | 4 + src/modes/cbc/cbc_decrypt.c | 4 + src/modes/cbc/cbc_done.c | 4 + src/modes/cbc/cbc_encrypt.c | 4 + src/modes/cbc/cbc_getiv.c | 4 + src/modes/cbc/cbc_setiv.c | 4 + src/modes/cbc/cbc_start.c | 4 + src/modes/cfb/cfb_decrypt.c | 4 + src/modes/cfb/cfb_done.c | 4 + src/modes/cfb/cfb_encrypt.c | 4 + src/modes/cfb/cfb_getiv.c | 4 + src/modes/cfb/cfb_setiv.c | 4 + src/modes/cfb/cfb_start.c | 4 + src/modes/ctr/ctr_decrypt.c | 4 + src/modes/ctr/ctr_done.c | 4 + src/modes/ctr/ctr_encrypt.c | 6 +- src/modes/ctr/ctr_getiv.c | 4 + src/modes/ctr/ctr_setiv.c | 4 + src/modes/ctr/ctr_start.c | 20 +- src/modes/ecb/ecb_decrypt.c | 4 + src/modes/ecb/ecb_done.c | 6 +- src/modes/ecb/ecb_encrypt.c | 4 + src/modes/ecb/ecb_start.c | 4 + src/modes/ofb/ofb_decrypt.c | 4 + src/modes/ofb/ofb_done.c | 4 + src/modes/ofb/ofb_encrypt.c | 4 + src/modes/ofb/ofb_getiv.c | 4 + src/modes/ofb/ofb_setiv.c | 4 + src/modes/ofb/ofb_start.c | 4 + src/pk/asn1/der/bit/der_decode_bit_string.c | 101 +++ src/pk/asn1/der/bit/der_encode_bit_string.c | 87 +++ src/pk/asn1/der/bit/der_length_bit_string.c | 54 ++ src/pk/asn1/der/choice/der_decode_choice.c | 168 +++++ src/pk/asn1/der/der_get_multi_integer.c | 67 -- src/pk/asn1/der/der_put_multi_integer.c | 67 -- src/pk/asn1/der/ia5/der_decode_ia5_string.c | 95 +++ src/pk/asn1/der/ia5/der_encode_ia5_string.c | 84 +++ src/pk/asn1/der/ia5/der_length_ia5_string.c | 194 ++++++ .../der/{ => integer}/der_decode_integer.c | 68 +- .../der/{ => integer}/der_encode_integer.c | 87 ++- .../der/{ => integer}/der_length_integer.c | 36 +- .../der_decode_object_identifier.c | 99 +++ .../der_encode_object_identifier.c | 103 +++ .../der_length_object_identifier.c | 84 +++ .../asn1/der/octet/der_decode_octet_string.c | 90 +++ .../asn1/der/octet/der_encode_octet_string.c | 85 +++ .../asn1/der/octet/der_length_octet_string.c | 53 ++ .../der_decode_printable_string.c | 95 +++ .../der_encode_printable_string.c | 84 +++ .../der_length_printable_string.c | 166 +++++ .../asn1/der/sequence/der_decode_sequence.c | 234 +++++++ .../der/sequence/der_decode_sequence_multi.c | 124 ++++ .../asn1/der/sequence/der_encode_sequence.c | 281 ++++++++ .../der/sequence/der_encode_sequence_multi.c | 123 ++++ .../asn1/der/sequence/der_length_sequence.c | 144 +++++ .../short_integer/der_decode_short_integer.c | 68 ++ .../short_integer/der_encode_short_integer.c | 97 +++ .../short_integer/der_length_short_integer.c | 69 ++ src/pk/asn1/der/utctime/der_decode_utctime.c | 120 ++++ src/pk/asn1/der/utctime/der_encode_utctime.c | 80 +++ src/pk/asn1/der/utctime/der_length_utctime.c | 45 ++ src/pk/dh/dh.c | 4 + src/pk/dh/dh_sys.c | 4 + src/pk/dsa/dsa_export.c | 47 +- src/pk/dsa/dsa_free.c | 4 + src/pk/dsa/dsa_import.c | 68 +- src/pk/dsa/dsa_make_key.c | 12 +- src/pk/dsa/dsa_sign_hash.c | 97 ++- src/pk/dsa/dsa_verify_hash.c | 128 ++-- src/pk/dsa/dsa_verify_key.c | 4 + src/pk/ecc/ecc.c | 484 +++++--------- src/pk/ecc/ecc_sys.c | 436 +++++-------- src/pk/packet_store_header.c | 4 + src/pk/packet_valid_header.c | 4 + src/pk/pkcs1/pkcs_1_i2osp.c | 4 + src/pk/pkcs1/pkcs_1_mgf1.c | 4 + src/pk/pkcs1/pkcs_1_oaep_decode.c | 24 +- src/pk/pkcs1/pkcs_1_oaep_encode.c | 34 +- src/pk/pkcs1/pkcs_1_os2ip.c | 4 + src/pk/pkcs1/pkcs_1_pss_decode.c | 15 +- src/pk/pkcs1/pkcs_1_pss_encode.c | 30 +- src/pk/pkcs1/pkcs_1_v15_es_decode.c | 74 --- src/pk/pkcs1/pkcs_1_v15_es_encode.c | 69 -- src/pk/pkcs1/pkcs_1_v15_sa_decode.c | 91 --- src/pk/pkcs1/pkcs_1_v15_sa_encode.c | 84 --- src/pk/rsa/rsa_decrypt_key.c | 4 + src/pk/rsa/rsa_encrypt_key.c | 4 + src/pk/rsa/rsa_export.c | 64 +- src/pk/rsa/rsa_exptmod.c | 10 + src/pk/rsa/rsa_free.c | 4 + src/pk/rsa/rsa_import.c | 76 +-- src/pk/rsa/rsa_make_key.c | 4 + src/pk/rsa/rsa_sign_hash.c | 4 + src/pk/rsa/rsa_v15_decrypt_key.c | 73 --- src/pk/rsa/rsa_v15_encrypt_key.c | 68 -- src/pk/rsa/rsa_v15_sign_hash.c | 66 -- src/pk/rsa/rsa_v15_verify_hash.c | 81 --- src/pk/rsa/rsa_verify_hash.c | 4 + src/prngs/fortuna.c | 4 + src/prngs/rc4.c | 4 + src/prngs/rng_get_bytes.c | 4 + src/prngs/rng_make_prng.c | 4 + src/prngs/sober128.c | 4 + src/prngs/sober128tab.c | 8 +- src/prngs/sprng.c | 4 + src/prngs/yarrow.c | 5 + testbuild.sh | 11 + testme.sh | 52 ++ testprof/base64_test.c | 6 +- testprof/cipher_hash_test.c | 4 + testprof/der_tests.c | 378 +++++++++-- testprof/dh_tests.c | 20 +- testprof/dsa_test.c | 15 +- testprof/ecc_test.c | 195 +++--- testprof/mac_test.c | 4 + testprof/makefile.icc | 2 +- testprof/modes_test.c | 24 +- testprof/pkcs_1_test.c | 46 +- testprof/rsa_test.c | 210 ++++-- testprof/store_test.c | 40 +- testprof/test.c | 4 + testprof/test.key | 15 + testprof/tomcrypt_test.h | 4 + testprof/x86_prof.c | 112 ++-- 290 files changed, 6870 insertions(+), 2419 deletions(-) create mode 100644 build.sh create mode 100644 mess.sh create mode 100644 notes/tech0005.txt create mode 100644 notes/tech0006.txt create mode 100644 run.sh create mode 100644 src/pk/asn1/der/bit/der_decode_bit_string.c create mode 100644 src/pk/asn1/der/bit/der_encode_bit_string.c create mode 100644 src/pk/asn1/der/bit/der_length_bit_string.c create mode 100644 src/pk/asn1/der/choice/der_decode_choice.c delete mode 100644 src/pk/asn1/der/der_get_multi_integer.c delete mode 100644 src/pk/asn1/der/der_put_multi_integer.c create mode 100644 src/pk/asn1/der/ia5/der_decode_ia5_string.c create mode 100644 src/pk/asn1/der/ia5/der_encode_ia5_string.c create mode 100644 src/pk/asn1/der/ia5/der_length_ia5_string.c rename src/pk/asn1/der/{ => integer}/der_decode_integer.c (52%) rename src/pk/asn1/der/{ => integer}/der_encode_integer.c (53%) rename src/pk/asn1/der/{ => integer}/der_length_integer.c (57%) create mode 100644 src/pk/asn1/der/object_identifier/der_decode_object_identifier.c create mode 100644 src/pk/asn1/der/object_identifier/der_encode_object_identifier.c create mode 100644 src/pk/asn1/der/object_identifier/der_length_object_identifier.c create mode 100644 src/pk/asn1/der/octet/der_decode_octet_string.c create mode 100644 src/pk/asn1/der/octet/der_encode_octet_string.c create mode 100644 src/pk/asn1/der/octet/der_length_octet_string.c create mode 100644 src/pk/asn1/der/printable_string/der_decode_printable_string.c create mode 100644 src/pk/asn1/der/printable_string/der_encode_printable_string.c create mode 100644 src/pk/asn1/der/printable_string/der_length_printable_string.c create mode 100644 src/pk/asn1/der/sequence/der_decode_sequence.c create mode 100644 src/pk/asn1/der/sequence/der_decode_sequence_multi.c create mode 100644 src/pk/asn1/der/sequence/der_encode_sequence.c create mode 100644 src/pk/asn1/der/sequence/der_encode_sequence_multi.c create mode 100644 src/pk/asn1/der/sequence/der_length_sequence.c create mode 100644 src/pk/asn1/der/short_integer/der_decode_short_integer.c create mode 100644 src/pk/asn1/der/short_integer/der_encode_short_integer.c create mode 100644 src/pk/asn1/der/short_integer/der_length_short_integer.c create mode 100644 src/pk/asn1/der/utctime/der_decode_utctime.c create mode 100644 src/pk/asn1/der/utctime/der_encode_utctime.c create mode 100644 src/pk/asn1/der/utctime/der_length_utctime.c delete mode 100644 src/pk/pkcs1/pkcs_1_v15_es_decode.c delete mode 100644 src/pk/pkcs1/pkcs_1_v15_es_encode.c delete mode 100644 src/pk/pkcs1/pkcs_1_v15_sa_decode.c delete mode 100644 src/pk/pkcs1/pkcs_1_v15_sa_encode.c delete mode 100644 src/pk/rsa/rsa_v15_decrypt_key.c delete mode 100644 src/pk/rsa/rsa_v15_encrypt_key.c delete mode 100644 src/pk/rsa/rsa_v15_sign_hash.c delete mode 100644 src/pk/rsa/rsa_v15_verify_hash.c create mode 100644 testbuild.sh create mode 100644 testme.sh create mode 100644 testprof/test.key diff --git a/Doxyfile b/Doxyfile index d42b778..a8de8a9 100644 --- a/Doxyfile +++ b/Doxyfile @@ -23,7 +23,7 @@ PROJECT_NAME = LibTomCrypt # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = 1.02 +PROJECT_NUMBER = 1.05 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. diff --git a/TODO b/TODO index 8b13789..f4f0665 100644 --- a/TODO +++ b/TODO @@ -1 +1,10 @@ +For 1.06 +1. export ECC functions globally [e.g. mulmod and the sets] + - goal is tv_gen module and test vectors +2. ASN.1 SET and T61String +3. phase out DH code [RSA/ECC/DSA is enough] +4. Some ASN.1 demo programs [for now read the source code!] +5. Start working towards making the bignum code plugable +6. Look into other ECC point muls and consider a "precomp" interface +7. Add OID for ciphers and PRNGs to their descriptors diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..a018aac --- /dev/null +++ b/build.sh @@ -0,0 +1,20 @@ +#!/bin/bash +echo "$1 ($2, $3)..." +make clean 1>/dev/null 2>/dev/null +echo -n "building..." +CFLAGS="$2 $CFLAGS" make -j3 -f $3 test tv_gen 1>gcc_1.txt 2>gcc_2.txt || (echo "build $1 failed see gcc_2.txt for more information" && cat gcc_2.txt && exit 1) +echo -n "testing..." +if [ -a test ] && [ -f test ] && [ -x test ]; then + ((./test >test_std.txt 2>test_err.txt && ./tv_gen > tv.txt) && echo "$1 test passed." && echo "y" > testok.txt) || (echo "$1 test failed" && cat test_err.txt && exit 1) + if find *_tv.txt -type f 1>/dev/null 2>/dev/null ; then + for f in *_tv.txt; do if (diff $f notes/$f) then true; else (echo "tv_gen $f failed" && rm -f testok.txt && exit 1); fi; done + fi +fi +if [ -a testok.txt ] && [ -f testok.txt ]; then + exit 0 +fi +exit 1 + +# $Source: /cvs/libtom/libtomcrypt/build.sh,v $ +# $Revision: 1.5 $ +# $Date: 2005/06/27 13:04:05 $ diff --git a/changes b/changes index 54480cf..65ccd16 100644 --- a/changes +++ b/changes @@ -1,3 +1,79 @@ +June 27th, 2005 +v1.05 + -- Added Technote #6 which covers the current PK compliance. + -- Fixed buffer overflow in OAEP decoder + -- Added CHOICE to the list of ASN.1 types + -- Added UTCTIME to the list of ASN.1 types + -- Added MUTEX locks around descriptor table functions [but not on the functions that are dependent on them] + All functions call *_is_valid() before using a descriptor index which means the respective table must be unlocked before + it can be accessed. However, during the operation [e.g. CCM] if the descriptor has been altered the results will be + undefined. + -- Minor updates to the manual to reflect recent changes + -- Added a catch to for an error that should never come up in rsa_exptmod(). Just being thorough. + +June 15th, 2005 +v1.04 + -- Fixed off by one [bit] error in dsa_make_key() it was too high by one bit [not a security problem just inconsistent] + -- ECC-224 curve was wrong [it was an ok curve just not NIST, so no security flaw just interoperability]. + -- Removed point compression since it slows down ECC ops to save a measly couple bytes. + This makes the ecc export format incompatible with 1.03 [it shouldn't change in the future] + -- Removed ECC-160 from timing and added the other curves + +June 9th, 2005 +v1.03 + -- Users may want to note that on a P4/GCC3.4 platform "-fno-regmove" greatly accelerates the ciphers/hashes. + -------------------------------------------------------------------------------------------------------------- + -- Made it install the testing library in the icc/static makefiles + -- Found bug in ccm_memory.c which would fail to compile when LTC_CLEAN_STACK was enabled + -- Simon Johnson proposed I do a fully automated test suite. Hence "testme.sh" was born + -- Added LTC_NO_TEST which forces test vectors off (regardless of what tomcrypt_custom.h has) + -- Added LTC_NO_TABLES which disables large tables (where possible, regardless of what tomcrypt_custom.h has) + -- New test script found a bug in twofish.c when TABLES was disabled. Yeah testing! + -- Added a LTC_FAST specific test to the testing software. + -- Updated test driver to actually halt on errors and just print them out (useful for say... automated testing...) + -- Added bounds checking to Pelican MAC + -- Added BIT and OCTET STRING to the ASN.1 side of things. + -- Pekka Riikonen pointed out that my ctr_start() function should accept the counter mode. + -- Cleaned up warnings in testprof + -- Removed redundant mu and point mapping in ecc_verify_hash() so it should be a bit faster now + -- Pekka pointed out that the AES key structure was using 32 bytes more than it ought to. + -- Added quick defines to remove entire classes of algorithms. This makes it easier if you want to build with just + one algorithm (say AES or SHA-256). Defines are LTC_NO_CIPHERS, LTC_NO_MODES, LTC_NO_HASHES, LTC_NO_MACS, + LTC_NO_PRNGS, LTC_NO_PK, LTC_NO_PKCS + -- As part of the move for ECC to X9.62 I've changed the signature algorithm to EC DSA. No API changes. + -- Pekka helped me clean up the PKCS #1 v2.1 [OAEP/PSS] code + -- Wrote new DER SEQUENCE coder/decoder + -- RSA, DSA and ECDSA now use the DER SEQUENCE code (saves a lot of code!) + -- DSA output is now a DER SEQUENCE (so not compatible with previous releases). + -- Added Technote #5 which shows how to build LTC on an AMD64 to have a variety of algorithms in only ~80KB of code. + -- Changed temp variable in LOAD/STORE macros to "ulong32" for 32-bit ops. Makes it safer on Big endian platforms + -- Added INSTALL_GROUP and INSTALL_USER which you can specify on the build to override the default USER/GROUP the library + is to be installed as + -- Removed "testprof" from the default build. + -- Added IA5, NULL and Object Identifier to the list of ASN.1 DER supported types + -- The "no_oops" target (part of zipup) now scans for non-cvs files. This helps prevent temp/scratch files from appearing in releases ;-) + -- Added DERs for missing hashes, but just the OID not the PKCS #1 v1.5 additions. + -- Removed PKCS #1 v1.5 from the tree since it's taking up space and you ought to use v2.1 anyways + -- Kevin Kenny pointed out a few stray // comments + -- INTEGER code properly supports negatives and zero padding [Pekka!] + -- Sorted asn1/der/ directory ... less of a mess now ;-) + -- Added PRINTABLE STRING type + -- Removed ECC-160 as it wasn't a standard curve + -- Made ecc_shared_secret() ANSI X9.63 compliant + -- Changed "printf" to "fprintf(stderr, " in the testbench... ;-) + -- Optimized the GCM table creation. On 1KB packets [with key switching] the new GCM is 12.7x faster than before. + -- Changed OID representation for hashes to be just a list of unsigned longs (so you can compare against them nicely after decoding a sequence) + -- ECC code now uses Montgomery reduction ... it's even faster [ECC-256 make key down from 37.4M to 4.6M cycles on an Athlon64] + -- Added SHORT_INTEGER so users can easily store DER encoded INTEGER types without using the bignum math library + -- Fixed OMAC code so that with LTC_FAST it doesn't require that LTC_FAST_TYPE divides 16 [it has to divide the block size instead] + -- ECC key export is now a simple [and documented] SEQUENCE, the "encrypt_key" also uses a new SEQUENCE format. + -- Thanks goes to the following testers + Michael Brown - Solaris 10/uSPARCII + Richard Outerbridge - MacOS + Martin Carpenter - Solaris 8/uSPARCII [Thanks for cleaning up the scripts] + Greg Rose - ... SunOS 5.8/SPARC [... what's with the SPARCS?] + Matt Johnston - MacOS X [Thanks for pointing out GCC 4 problems with -Os] + April 19th, 2005 v1.02 -- Added LTC_TEST support to gcm_test() @@ -1243,3 +1319,8 @@ v0.02 -- Changed RC5 to only allow 12 to 24 rounds -- Added more to the manual. v0.01 -- We will call this the first version. + +/* $Source: /cvs/libtom/libtomcrypt/changes,v $ */ +/* $Revision: 1.106 $ */ +/* $Date: 2005/06/27 12:37:06 $ */ + diff --git a/crypt.tex b/crypt.tex index c785e83..cf1c37e 100644 --- a/crypt.tex +++ b/crypt.tex @@ -47,7 +47,7 @@ \def\gap{\vspace{0.5ex}} \makeindex \begin{document} -\title{LibTomCrypt \\ Version 1.02} +\title{LibTomCrypt \\ Version 1.05} \author{Tom St Denis \\ \\ tomstdenis@gmail.com \\ @@ -57,7 +57,7 @@ http://libtomcrypt.org This text and source code library are both hereby placed in the public domain. This book has been formatted for A4 paper using the \LaTeX{} {\em book} macro package. -\vspace{10cm} +\vspace{15cm} \begin{flushright}Open Source. Open Academia. Open Minds. @@ -771,13 +771,19 @@ other modes. \index{OFB Mode} \index{CFB Mode} The library provides simple support routines for handling CBC, CTR, CFB, OFB and ECB encoded messages. Assuming the mode you want is XXX there is a structure called ``symmetric\_XXX'' that will contain the information required to -use that mode. They have identical setup routines (except ECB mode for obvious reasons): +use that mode. They have identical setup routines (except CTR and ECB mode): \index{ecb\_start()} \index{cfb\_start()} \index{cbc\_start()} \index{ofb\_start()} \index{ctr\_start()} \begin{verbatim} int XXX_start(int cipher, const unsigned char *IV, const unsigned char *key, int keylen, int num_rounds, symmetric_XXX *XXX); +int ctr_start( int cipher, + const unsigned char *IV, + const unsigned char *key, int keylen, + int num_rounds, int ctr_mode, + symmetric_CTR *ctr); + int ecb_start(int cipher, const unsigned char *key, int keylen, int num_rounds, symmetric_ECB *ecb); \end{verbatim} @@ -789,7 +795,12 @@ of the cipher you choose. It is important that the IV be random for each uniqu parameters ``key'', ``keylen'' and ``num\_rounds'' are the same as in the XXX\_setup() function call. The final parameter is a pointer to the structure you want to hold the information for the mode of operation. -Both routines return {\bf CRYPT\_OK} if the cipher initialized correctly, otherwise they return an error code. + +In the case of CTR mode there is an additional parameter ``ctr\_mode'' which specifies the mode that the counter is to be used in. +If \textbf{CTR\_COUNTER\_LITTLE\_ENDIAN} was specified then the counter will be treated as a little endian value. Otherwise, if +\textbf{CTR\_COUNTER\_BIG\_ENDIAN} was specified the counter will be treated as a big endian value. + +The routines return {\bf CRYPT\_OK} if the cipher initialized correctly, otherwise they return an error code. \subsection{Encryption and Decryption} To actually encrypt or decrypt the following routines are provided: @@ -867,6 +878,7 @@ int main(void) key, /* the secret key */ 16, /* length of secret key (16 bytes, 128 bits) */ 0, /* 0 == default # of rounds */ + CTR_COUNTER_LITTLE_ENDIAN, /* Little endian counter */ &ctr) /* where to store initialized CTR state */ ) != CRYPT_OK) { printf("ctr_start error: %s\n", error_to_string(err)); @@ -1349,7 +1361,7 @@ int send_packet(const unsigned char *pt, unsigned long ptlen, } /* process the plaintext */ - if ((err = gcm_add_process(gcm, pt, ptlen, pt, GCM_ENCRYPT)) != CRYPT_OK) { + if ((err = gcm_process(gcm, pt, ptlen, pt, GCM_ENCRYPT)) != CRYPT_OK) { return err; } @@ -1359,6 +1371,8 @@ int send_packet(const unsigned char *pt, unsigned long ptlen, return err; } + /* ... send a header describing the lengths ... */ + /* depending on the protocol and how IV is generated you may have to send it too... */ send(socket, iv, ivlen, 0); @@ -2452,8 +2466,8 @@ int main(void) \section{Introduction} RSA wrote the PKCS \#1 specifications which detail RSA Public Key Cryptography. In the specifications are -padding algorithms for encryption and signatures. The standard includes ``v1.5'' and ``v2.0'' algorithms. -To simplify matters a little the v2.0 encryption and signature padding algorithms are called OAEP and PSS +padding algorithms for encryption and signatures. The standard includes the ``v2.1'' algorithms. +To simplify matters a little the v2.1 encryption and signature padding algorithms are called OAEP and PSS respectively. \section{PKCS \#1 Encryption} @@ -2509,33 +2523,6 @@ If the function succeeds it decodes the OAEP encoded message into ``out'' of len $1$ in ``res''. If the packet is invalid it stores $0$ in ``res'' and if the function fails for another reason it returns an error code. -\subsection{PKCS \#1 v1.5 Encoding} - -\index{pkcs\_1\_v15\_es\_encode()} -\begin{verbatim} -int pkcs_1_v15_es_encode(const unsigned char *msg, unsigned long msglen, - unsigned long modulus_bitlen, - prng_state *prng, int prng_idx, - unsigned char *out, unsigned long *outlen); -\end{verbatim} - -This will PKCS v1.5 encode the data in ``msg'' of length ``msglen''. Pass the length (in bits) of your -RSA modulus in ``modulus\_bitlen''. The encoded data will be stored in ``out'' of length ``outlen''. - -\subsection{PKCS \#1 v1.5 Decoding} -\index{pkcs\_1\_v15\_es\_decode()} -\begin{verbatim} -int pkcs_1_v15_es_decode(const unsigned char *msg, unsigned long msglen, - unsigned long modulus_bitlen, - unsigned char *out, unsigned long outlen, - int *res); -\end{verbatim} - -This will PKCS v1.5 decode the message in ``msg'' of length ``msglen''. It will store the output in ``out''. Note -that the length of the output ``outlen'' is a constant. This decoder cannot determine the original message -length. If the data in ``msg'' is a valid packet then a $1$ is stored in ``res'', otherwise a $0$ is -stored. - \section{PKCS \#1 Digital Signatures} \subsection{PSS Encoding} @@ -2577,34 +2564,6 @@ it is set to zero. The rest of the parameters are as in the PSS encode call. It's important to use the same ``saltlen'' and hash for both encoding and decoding as otherwise the procedure will not work. -\subsection{PKCS \#1 v1.5 Encoding} - -\index{pkcs\_1\_v15\_sa\_encode()} -\begin{verbatim} -int pkcs_1_v15_sa_encode(const unsigned char *msghash, unsigned long msghashlen, - int hash_idx, unsigned long modulus_bitlen, - unsigned char *out, unsigned long *outlen); -\end{verbatim} - -This will PKCS \#1 v1.5 signature encode the message hash ``msghash'' of length ``msghashlen''. You have -to tell this routine which hash produced the message hash in ``hash\_idx''. The encoded hash is stored -in ``out'' of length ``outlen''. - -\subsection{PKCS \#1 v1.5 Decoding} - -\index{pkcs\_1\_v15\_sa\_decode()} -\begin{verbatim} -int pkcs_1_v15_sa_decode(const unsigned char *msghash, unsigned long msghashlen, - const unsigned char *sig, unsigned long siglen, - int hash_idx, unsigned long modulus_bitlen, - int *res); -\end{verbatim} - -This will PKCS \#1 v1.5 signature decode the data in ``sig'' of length ``siglen'' and compare the extracted -hash against ``msghash'' of length ``msghashlen''. You have to tell this routine which hash produced the -message digest in ``hash\_idx''. If the packet is valid and the hashes match ``res'' is set to $1$. Otherwise, -it is set to $0$. - \section{RSA Operations} \subsection{Background} @@ -2698,15 +2657,14 @@ to pkcs\_1\_oaep\_encode(). int rsa_decrypt_key(const unsigned char *in, unsigned long inlen, unsigned char *out, unsigned long *outlen, const unsigned char *lparam, unsigned long lparamlen, - prng_state *prng, int prng_idx, - int hash_idx, int *res, + int hash_idx, int *stat, rsa_key *key); \end{verbatim} This function will RSA decrypt ``in'' of length ``inlen'' then OAEP depad the resulting data and store it in ``out'' of length ``outlen''. The ``lparam'' and ``lparamlen'' are the same parameters you would pass to pkcs\_1\_oaep\_decode(). -If the RSA decrypted data isn't a valid OAEP packet then ``res'' is set to $0$. Otherwise, it is set to $1$. +If the RSA decrypted data isn't a valid OAEP packet then ``stat'' is set to $0$. Otherwise, it is set to $1$. \subsection{RSA Hash Signatures} Similar to RSA key encryption RSA is also used to ``digitally sign'' message digests (hashes). To facilitate this @@ -2729,7 +2687,6 @@ the output is stored in ``out'' of length ``outlen''. \begin{verbatim} int rsa_verify_hash(const unsigned char *sig, unsigned long siglen, const unsigned char *msghash, unsigned long msghashlen, - prng_state *prng, int prng_idx, int hash_idx, unsigned long saltlen, int *stat, rsa_key *key); \end{verbatim} @@ -2799,8 +2756,6 @@ int main(void) &l2, /* plaintext length */ "TestApp", /* lparam for this program */ 7, /* lparam is 7 bytes long */ - NULL, /* PRNG state */ - prng_idx, /* prng idx */ hash_idx, /* hash idx */ &res, /* validity of data */ &key) /* our RSA key */ @@ -3060,6 +3015,33 @@ provided are very close to $p$ that is $\vert \vert \phi(\beta) \vert \vert \app range in order from $\approx 2^{192}$ points to $\approx 2^{521}$. According to the source document any key size greater than or equal to 256-bits is sufficient for long term security. +\section{Key Format} +LibTomCrypt uses it's own format for ECC public and private keys. While ANSI X9.62 partially specifies key formats (it covers public keys) it does it in a less +than ideally simple manner. In the case of LibTomCrypt it is meant \textbf{solely} for NIST $GF(p)$ curves. The format of the keys is as follows: + +\begin{small} +\begin{verbatim} +ECCPublicKey ::= SEQUENCE { + flags BIT STRING(1), -- public/private flag (always zero), + keySize INTEGER, -- Curve size (in bits) divided by eight + -- and rounded down, e.g. 521 => 65 + pubkey.x INTEGER, -- The X co-ordinate of the public key point + pubkey.y INTEGER, -- The Y co-ordinate of the public key point +} + +ECCPrivateKey ::= SEQUENCE { + flags BIT STRING(1), -- public/private flag (always one), + keySize INTEGER, -- Curve size (in bits) divided by eight + -- and rounded down, e.g. 521 => 65 + pubkey.x INTEGER, -- The X co-ordinate of the public key point + pubkey.y INTEGER, -- The Y co-ordinate of the public key point + secret.k INTEGER, -- The secret key scalar +} +\end{verbatim} +\end{small} + +The first flags bit denotes whether the key is public (zero) or private (one). + \section{Core Functions} Like the DH routines there is a key structure ``ecc\_key'' used by the functions. There is a function to make a key: @@ -3069,8 +3051,8 @@ int ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key); \end{verbatim} -The ``keysize'' is the size of the modulus in bytes desired. Currently directly supported values are 20, 24, 28, 32, 48 and 65 bytes which -correspond to key sizes of 160, 192, 224, 256, 384 and 521 bits respectively. If you pass a key size that is between any key size +The ``keysize'' is the size of the modulus in bytes desired. Currently directly supported values are 24, 28, 32, 48 and 65 bytes which +correspond to key sizes of 192, 224, 256, 384 and 521 bits respectively. If you pass a key size that is between any key size it will round the keysize up to the next available one. The rest of the parameters work like they do in the ``dh\_make\_key()'' function. To free the ram allocated by a key call: \index{ecc\_free()} @@ -3129,11 +3111,23 @@ int ecc_decrypt_key(const unsigned char *in, unsigned long inlen, ecc_key *key); \end{verbatim} -Where ``in'' is an input symmetric key of no more than 32 bytes. Essentially these routines created a random public key +Where ``in'' is an input symmetric key of no more than 64 bytes. Essentially these routines created a random public key and find the hash of the shared secret. The message digest is than XOR'ed against the symmetric key. All of the required data is placed in ``out'' by ``ecc\_encrypt\_key()''. The hash chosen must produce a message digest at least as large as the symmetric key you are trying to share. +\subsection{Encrypt Packet Format} + +The packet format for the encrypted keys is the following ASN.1 SEQUENCE: + +\begin{verbatim} +ECCEncrypt ::= SEQUENCE { + hashID OBJECT IDENTIFIER, -- OID of hash used + pubkey OCTET STRING , -- Encapsulated ECCPublicKey (see above) + skey OCTET STRING -- xor of plaintext and "hash of shared secret" +} +\end{verbatim} + There are also functions to sign and verify the hash of a message. \index{ecc\_sign\_hash()} \index{ecc\_verify\_hash()} \begin{verbatim} @@ -3150,12 +3144,14 @@ The ``ecc\_sign\_hash'' function signs the message hash in ``in'' of length ``in The ``ecc\_verify\_hash'' function verifies the ECC signature in ``sig'' against the hash in ``hash''. It sets ``stat'' to non-zero if the signature passes or zero if it fails. +\subsection{Signature Format} +The signature code is an implementation of X9.62 EC-DSA and the output is comformant for GF(p) curves. \section{ECC Keysizes} With ECC if you try and sign a hash that is bigger than your ECC key you can run into problems. The math will still work and in effect the signature will still work. With ECC keys the strength of the signature is limited by the size of -the hash or the size of they key, whichever is smaller. For example, if you sign with SHA256 and a ECC-160 key in effect -you have 160-bits of security (e.g. as if you signed with SHA-1). +the hash or the size of they key, whichever is smaller. For example, if you sign with SHA256 and an ECC-192 key in effect +you have 192-bits of security. The library will not warn you if you make this mistake so it is important to check yourself before using the signatures. @@ -3170,6 +3166,38 @@ would require at least 256 bytes where as the DSA signature would require only a The API for the DSA is essentially the same as the other PK algorithms. Except in the case of DSA no encryption or decryption routines are provided. +\section{Key Format} +Since no useful public standard for DSA key storage was presented to me during the course of this development I made my own ASN.1 SEQUENCE which I document +now so that others can interoperate with this library. + +\begin{verbatim} +DSAPublicKey ::= SEQUENCE { + publicFlags BIT STRING(1), -- must be 0 + g INTEGER , -- base generator, check that g^q mod p == 1 + -- and that 1 < g < p - 1 + p INTEGER , -- prime modulus + q INTEGER , -- order of sub-group (must be prime) + y INTEGER , -- public key, specifically, g^x mod p, + -- check that y^q mod p == 1 + -- and that 1 < y < p - 1 +} + +DSAPrivateKey ::= SEQUENCE { + publicFlags BIT STRING(1), -- must be 1 + g INTEGER , -- base generator, check that g^q mod p == 1 + -- and that 1 < g < p - 1 + p INTEGER , -- prime modulus + q INTEGER , -- order of sub-group (must be prime) + y INTEGER , -- public key, specifically, g^x mod p, + -- check that y^q mod p == 1 + -- and that 1 < y < p - 1 + x INTEGER -- private key +} +\end{verbatim} + +The leading BIT STRING has a single bit in it which is zero for public keys and one for private keys. This makes the structure uniquely decodable and easy +to work with. + \section{Key Generation} To make a DSA key you must call the following function \begin{verbatim} @@ -3291,79 +3319,351 @@ This will import the DSA key from the buffer ``in'' of length ``inlen'' to the ` will automatically free all of the heap allocated in the process (you don't have to call dsa\_free()). \chapter{Standards Support} -\section{DER Support} -DER or ``Distinguished Encoding Rules'' is a subset of the ASN.1 encoding rules that is fully deterministic and -ideal for cryptography. In particular ASN.1 specifies an INTEGER type for storing arbitrary sized integers. DER -further limits the ASN.1 specifications to a deterministic encoding. +\section{ASN.1 Formats} +LibTomCrypt supports a variety of ASN.1 data types encoded with the Distinguished Encoding Rules (DER) suitable for various cryptographic protocols. The data types +are all provided with three basic functions with \textit{similar} prototypes. One function has been dedicated to calculate the length in octets of a given +format and two functions have been dedicated to encoding and decoding the format. -\subsection{Storing INTEGER types} -\index{der\_encode\_integer()} -\begin{alltt} -int der_encode_integer(mp_int *num, unsigned char *out, unsigned long *outlen); -\end{alltt} +On top of the basic data types are the SEQUENCE and\footnote{Planned for LTC 1.06} SET data types which are collections of other ASN.1 types. They are provided +in the same manner as the other data types except they use list of objects known as the \textbf{ltc\_asn1\_list} structure. It is defined as -This will store the integer in ``num'' to the output buffer ``out'' of length ``outlen''. It only stores -non--negative numbers. It stores the number of octets used back in ``outlen''. +\index{ltc\_asn1\_list structure} +\begin{verbatim} +typedef struct { + int type; + void *data; + unsigned long size; + int used; +} ltc_asn1_list; +\end{verbatim} -\subsection{Reading INTEGER types} -\index{der\_decode\_integer()} -\begin{alltt} -int der_decode_integer(const unsigned char *in, unsigned long *inlen, mp_int *num); -\end{alltt} -This will decode the DER encoded INTEGER in ``in'' of length ``inlen'' and store the resulting integer -in ``num''. It will store the bytes read in ``inlen'' which is handy if you have to parse multiple -data items out of a binary packet. +The ``type'' field is one of the following ASN.1 field definitions. The ``data'' pointer is a void pointer to the data to be encoded (or the destination) and the +``size'' field is specific to what you are encoding (e.g. number of bits in the BIT STRING data type). The ``used'' field is primarily for the CHOICE decoder +and reflects if the particular member of a list was the decoded data type. To help build the lists in an orderly fashion the macro +``LTC\_SET\_ASN1(list, index, Type, Data, Size)'' has been provided. -\subsection{INTEGER length} -\index{der\_length\_integer()} -\begin{alltt} -int der_length_integer(mp_int *num, unsigned long *len); -\end{alltt} -This will determine the length of the DER encoding of the integer ``num'' and store it in ``len''. +It will assign to the ``index''th position in the ``list'' the tripplet (Type, Data, Size). An example usage would be: -\subsection{Multiple INTEGER types} -To simplify the DER encoding/decoding there are two functions two handle multple types at once. +\begin{small} +\begin{verbatim} +... +ltc_asn1_list sequence[3]; +unsigned long three=3; -\index{der\_put\_multi\_integer()} -\index{der\_get\_multi\_integer()} -\begin{alltt} -int der_put_multi_integer(unsigned char *dst, unsigned long *outlen, mp_int *num, ...); -int der_get_multi_integer(const unsigned char *src, unsigned long *inlen, mp_int *num, ...); -\end{alltt} +LTC_SET_ASN1(sequence, 0, LTC_ASN1_IA5_STRING, "hello", 5); +LTC_SET_ASN1(sequence, 1, LTC_ASN1_SHORT_INTEGER, &three, 1); +LTC_SET_ASN1(sequence, 2, LTC_ASN1_NULL, NULL, 0); +\end{verbatim} +\end{small} -These will handle multiple encodings/decodings at once. They work like their single operand counterparts -except they handle a \textbf{NULL} terminated list of operands. +The macro is relatively safe with respect to modifying variables, for instance the following code is equivalent. + +\begin{small} +\begin{verbatim} +... +ltc_asn1_list sequence[3]; +unsigned long three=3; +int x=0; +LTC_SET_ASN1(sequence, x++, LTC_ASN1_IA5_STRING, "hello", 5); +LTC_SET_ASN1(sequence, x++, LTC_ASN1_SHORT_INTEGER, &three, 1); +LTC_SET_ASN1(sequence, x++, LTC_ASN1_NULL, NULL, 0); +\end{verbatim} +\end{small} + +\begin{figure}[here] +\begin{center} +\begin{small} +\begin{tabular}{|l|l|} +\hline \textbf{Definition} & \textbf{ASN.1 Type} \\ +\hline LTC\_ASN1\_EOL & End of a ASN.1 list structure. \\ +\hline LTC\_ASN1\_INTEGER & INTEGER (uses mp\_int) \\ +\hline LTC\_ASN1\_SHORT\_INTEGER & INTEGER (32--bit using unsigned long) \\ +\hline LTC\_ASN1\_BIT\_STRING & BIT STRING (one bit per char) \\ +\hline LTC\_ASN1\_OCTET\_STRING & OCTET STRING (one octet per char) \\ +\hline LTC\_ASN1\_NULL & NULL \\ +\hline LTC\_ASN1\_OBJECT\_IDENTIFIER & OBJECT IDENTIFIER (words are in unsigned long) \\ +\hline LTC\_ASN1\_IA5\_STRING & IA5 STRING (one octet per char) \\ +\hline LTC\_ASN1\_PRINTABLE\_STRING & PRINTABLE STIRNG (one octet per char) \\ +\hline LTC\_ASN1\_UTCTIME & UTCTIME (see ltc\_utctime structure) \\ +\hline LTC\_ASN1\_SEQUENCE & SEQUENCE OF \\ +\hline LTC\_ASN1\_CHOICE & CHOICE \\ +\hline +\end{tabular} +\caption{List of ASN.1 Supported Types} +\end{small} +\end{center} +\end{figure} + +\subsection{SEQUENCE Type} +The SEQUENCE data type is a collection of other ASN.1 data types encapsulated with a small header which is a useful way of sending multiple data types in one packet. + +\subsubsection{SEUQNECE Encoding} +To encode a sequence a \textbf{ltc\_asn1\_list} array must be initialized with the members of the sequence and their respective pointers. The encoding is performed +with the following function. + +\index{der\_encode\_sequence()} +\begin{verbatim} +int der_encode_sequence(ltc_asn1_list *list, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +\end{verbatim} +This encodes a sequence of items pointed to by ``list'' where the list has ``inlen'' items in it. The SEQUENCE will be encoded to ``out'' and of length ``outlen''. The +function will terminate when it reads all the items out of the list (upto ``inlen'') or it encounters an item in the list with a type of \textbf{LTC\_ASN1\_EOL}. + +The ``data'' pointer in the list would be the same pointer you would pass to the respective ASN.1 encoder (e.g. der\_encode\_bit\_string()) and it is simply passed on +verbatim to the dependent encoder. The list can contain other SEQUENCE or SET types which enables you to have nested SEQUENCE and SET definitions. In these cases +the ``data'' pointer is simply a pointer to another \textbf{ltc\_asn1\_list}. + +\subsubsection{SEQUENCE Decoding} + +\index{der\_decode\_sequence()} + +Decoding a SEQUENCE is similar to encoding. You set up an array of \textbf{ltc\_asn1\_list} where in this case the ``size'' member is the maximum size +(in certain cases). For types such as IA5 STRING, BIT STRING, OCTET STRING (etc) the ``size'' field is updated after successful decoding to reflect how many +units of the respective type has been loaded. \begin{verbatim} -#include -int main(void) -{ - mp_int a, b, c, d; - unsigned char buffer[1000]; - unsigned long len; - int err; - - /* init a,b,c,d with some values ... */ - - /* ok we want to store them now... */ - len = sizeof(buffer); - if ((err = der_put_multi_integer(buffer, &len, - &a, &b, &c, &d, NULL)) != CRYPT_OK) { - // error - } - printf("I stored %lu bytes in buf\n", len); - - /* ok say we want to get them back for fun */ - /* len set previously...otherwise set it to the size of the packet */ - if ((err = der_get_multi_integer(buffer, &len, - &a, &b, &c, &d, NULL)) != CRYPT_OK) { - // error - } - printf("I read %lu bytes from buf\n", len); -} +int der_decode_sequence(const unsigned char *in, unsigned long inlen, + ltc_asn1_list *list, unsigned long outlen); \end{verbatim} + +This will decode upto ``outlen'' items from the input buffer ``in'' of length ``inlen'' octets. The function will stop (gracefully) when it runs out of items to decode. +It will fail (for among other reasons) when it runs out of input bytes to read, a data type is invalid or a heap failure occured. + +For the following types the ``size'' field will be updated to reflect the number of units read of the given type. +\begin{enumerate} + \item BIT STRING + \item OCTET STRING + \item OBJECT IDENTIFIER + \item IA5 STRING + \item PRINTABLE STRING +\end{enumerate} + +\subsubsection{SEQUENCE Length} + +The length of a SEQUENCE can be determined with the following function. + +\index{der\_length\_sequence()} +\begin{verbatim} +int der_length_sequence(ltc_asn1_list *list, unsigned long inlen, + unsigned long *outlen); +\end{verbatim} + +This will get the encoding size for the given ``list'' of length ``inlen'' and store it in ``outlen''. + +\subsubsection{SEQUENCE Multiple Argument Lists} + +For small or simple sequences an encoding or decoding can be performed with one of the following two functions. + +\index{der\_encode\_sequence\_multi()} +\index{der\_decode\_sequence\_multi()} + +\begin{verbatim} +int der_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...); +int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...); +\end{verbatim} + +These either encode or decode (respectively) a SEQUENCE data type where the items in the sequence are specified after the length parameter. + +The list of items are specified as a triple of the form ``(type, size, data)'' where ``type'' is an \textbf{int}, ``size'' is a \textbf{unsigned long} +and ``data'' is \textbf{void} pointer. The list of items must be terminated with an item with the type \textbf{LTC\_ASN1\_EOL}. + +It's ideal that you cast the ``size'' values to unsigned long to ensure that the proper data type is passed to the function. Constants such as ``1'' without +a cast or prototype are of type \textbf{int} by default. Appending \textit{UL} or prepending \textit{(unsigned long)} is enough to cast it to the correct type. + +\subsection{ASN.1 INTEGER} + +To encode or decode INTEGER data types use the following functions. + +\index{der\_encode\_integer()} +\index{der\_decode\_integer()} +\index{der\_length\_integer()} +\begin{verbatim} +int der_encode_integer(mp_int *num, unsigned char *out, unsigned long *outlen); +int der_decode_integer(const unsigned char *in, unsigned long inlen, mp_int *num); +int der_length_integer(mp_int *num, unsigned long *len); +\end{verbatim} + +These will encode or decode a signed INTEGER data type using the ``mp\_int'' data type to store the large INTEGER. To encode smaller values without allocating +an mp\_int to store the value the ``short'' INTEGER functions were made available. + +\index{der\_encode\_short\_integer()} +\index{der\_decode\_short\_integer()} +\index{der\_length\_short\_integer()} +\begin{verbatim} +int der_encode_short_integer(unsigned long num, + unsigned char *out, unsigned long *outlen); + +int der_decode_short_integer(const unsigned char *in, unsigned long inlen, + unsigned long *num); + +int der_length_short_integer(unsigned long num, unsigned long *outlen); +\end{verbatim} + +These will encode or decode an unsigned \textbf{unsigned long} type (only reads upto 32--bits). For values in the range $0 \dots 2^{32} - 1$ the integer +and short integer functions can encode and decode each others outputs. + +\subsection{ASN.1 BIT STRING} + +\index{der\_encode\_bit\_string()} +\index{der\_decode\_bit\_string()} +\index{der\_length\_bit\_string()} +\begin{verbatim} +int der_encode_bit_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +int der_decode_bit_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +int der_length_bit_string(unsigned long nbits, unsigned long *outlen); +\end{verbatim} + +These will encode or decode a BIT STRING data type. The bits are passed in (or read out) using one \textbf{char} per bit. A non--zero value will be interpretted +as a one bit and a zero value a zero bit. + +\subsection{ASN.1 OCTET STRING} + +\index{der\_encode\_octet\_string()} +\index{der\_decode\_octet\_string()} +\index{der\_length\_octet\_string()} +\begin{verbatim} +int der_encode_octet_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +int der_decode_octet_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +int der_length_octet_string(unsigned long noctets, unsigned long *outlen); +\end{verbatim} + +These will encode or decode an OCTET STRING data type. The octets are stored using one \textbf{char} each. + +\subsection{ASN.1 OBJECT IDENTIFIER} + +\index{der\_encode\_object\_identifier()} +\index{der\_decode\_object\_identifier()} +\index{der\_length\_object\_identifier()} +\begin{verbatim} +int der_encode_object_identifier(unsigned long *words, unsigned long nwords, + unsigned char *out, unsigned long *outlen); + +int der_decode_object_identifier(const unsigned char *in, unsigned long inlen, + unsigned long *words, unsigned long *outlen); + +int der_length_object_identifier(unsigned long *words, unsigned long nwords, + unsigned long *outlen); +\end{verbatim} + +These will encode or decode an OBJECT IDENTIFIER object. The words of the OID are stored in individual \textbf{unsigned long} elements and must be in the range +$0 \ldots 2^{32} - 1$. + +\subsection{ASN.1 IA5 STRING} + +\index{der\_encode\_ia5\_string()} +\index{der\_decode\_ia5\_string()} +\index{der\_length\_ia5\_string()} +\begin{verbatim} +int der_encode_ia5_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +int der_decode_ia5_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +int der_length_ia5_string(const unsigned char *octets, unsigned long noctets, + unsigned long *outlen); +\end{verbatim} + +These will encode or decode an IA5 STRING. The characters are read or stored in individual \textbf{char} elements. This functions performs internal character +to numerical conversions based on the conventions of the compiler being used. For instance, on an x86\_32 machine 'A' == 65 but the same may not be true on +say a SPARC machine. Internally these functions have a table of literal characters and their numerical ASCII values. This provides a stable conversion provided +that the build platform honours the runtime platforms character conventions. + +If you're worried try building the test suite and running it. It has hard coded test vectors to ensure it is operating properly. + +\subsection{ASN.1 PRINTABLE STRING} + +\index{der\_encode\_printable\_string()} +\index{der\_decode\_printable\_string()} +\index{der\_length\_printable\_string()} +\begin{verbatim} +int der_encode_printable_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +int der_decode_printable_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +int der_length_printable_string(const unsigned char *octets, unsigned long noctets, + unsigned long *outlen); +\end{verbatim} + +These will encode or decode an PRINTABLE STRING. The characters are read or stored in individual \textbf{char} elements. This functions performs internal character +to numerical conversions based on the conventions of the compiler being used. For instance, on an x86\_32 machine 'A' == 65 but the same may not be true on +say a SPARC machine. Internally these functions have a table of literal characters and their numerical ASCII values. This provides a stable conversion provided +that the build platform honours the runtime platforms character conventions. + +If you're worried try building the test suite and running it. It has hard coded test vectors to ensure it is operating properly. + +\subsection{ASN.1 UTCTIME} + +The UTCTIME type is to store a date and time in ASN.1 format. It uses the following structure to organize the time. + +\begin{verbatim} +typedef struct { + unsigned YY, /* year 00--99 */ + MM, /* month 01--12 */ + DD, /* day 01--31 */ + hh, /* hour 00--23 */ + mm, /* minute 00--59 */ + ss, /* second 00--59 */ + off_dir, /* timezone offset direction 0 == +, 1 == - */ + off_hh, /* timezone offset hours */ + off_mm; /* timezone offset minutes */ +} ltc_utctime; +\end{verbatim} + +The time can be offset plus or minus a set amount of hours (off\_hh) and minutes (off\_mm). When ``off\_dir'' is zero the time will be added otherwise it +will be subtracted. + +For instance, the array $\lbrace 5, 6, 20, 22, 4, 00, 0, 5, 0 \rbrace$ represents the current time of 2005, June 20th, 22:04:00 with a time offset of +05h00. + +\index{der\_encode\_utctime()} +\index{der\_decode\_utctime()} +\index{der\_length\_utctime()} +\begin{verbatim} +int der_encode_utctime(ltc_utctime *utctime, + unsigned char *out, unsigned long *outlen); + +int der_decode_utctime(const unsigned char *in, unsigned long *inlen, + ltc_utctime *out); + +int der_length_utctime(ltc_utctime *utctime, unsigned long *outlen); +\end{verbatim} + +The encoder will store time in one of the two ASN.1 formats, either ``YYMMDDhhmmssZ'' or ``YYMMDDhhmmss$\pm$hhmm'' and perform minimal error checking on the +input. The decoder will read all valid ASN.1 formats and perform range checking on the values (not complete but rational) useful for catching packet errors. + +It is suggested that decoded data be further scrutinized (e.g. days of month in particular). + +\subsection{ASN.1 CHOICE} + +The CHOICE ASN.1 type represents a union of ASN.1 types all of which are stored in a ``ltc\_asn1\_list''. There is no encoder for the CHOICE type, only a +decoder. The decoder will scan through the provided list attempting to use the appropriate decoder on the input packet. The list can contain any ASN.1 data +type\footnote{Except it cannot have LTC\_ASN1\_INTEGER and LTC\_ASN1\_SHORT\_INTEGER simultaneously.} except for other CHOICE types. + +There is no encoder for the CHOICE type as the actual DER encoding is the encoding of the chosen type. + +\index{der\_decode\_choice()} +\begin{verbatim} +int der_decode_choice(const unsigned char *in, unsigned long *inlen, + ltc_asn1_list *list, unsigned long outlen); +\end{verbatim} + +This will decode the input in the ``in'' field of length ``inlen''. It uses the provided ASN.1 list specified in the ``list'' field which has ``outlen'' elements. +The ``inlen'' field will be updated with the length of the decoded data type as well as the respective entry in the ``list'' field will have the ``used'' flag +set to non--zero to reflect it was the data type decoded. + \section{Password Based Cryptography} \subsection{PKCS \#5} +\index{PKCS \#5} In order to securely handle user passwords for the purposes of creating session keys and chaining IVs the PKCS \#5 was drafted. PKCS \#5 is made up of two algorithms, Algorithm One and Algorithm Two. Algorithm One is the older fairly limited algorithm which has been implemented for completeness. Algorithm Two is a bit more modern and more flexible to work with. @@ -3436,7 +3736,6 @@ int main(void) \} \end{alltt} - \chapter{Miscellaneous} \section{Base64 Encoding and Decoding} The library provides functions to encode and decode a RFC1521 base64 coding scheme. This means that it can decode what it @@ -3634,7 +3933,6 @@ $n$ it requires $\sqrt n$ work. The following table sumarizes the work required \begin{center} \begin{tabular}{|c|c|} \hline ECC Key Size (bits) & Work Factor ($log_2$) \\ - \hline 160 & 80 \\ \hline 192 & 96 \\ \hline 224 & 112 \\ \hline 256 & 128 \\ @@ -3792,8 +4090,8 @@ will increase by approximately 500 bytes. If this is defined but TWOFISH\_SMALL it will not speed up the encryption or decryption functions. \subsection{GCM\_TABLES} -When defined GCM will use a 64KB table (per GCM state) which will greatly lower up the per--packet latency. -It also increases the initialization time. +When defined GCM will use a 64KB table (per GCM state) which will greatly speed up the per--packet latency. +It also increases the initialization time and isn't suitable when you are going to use a key a few times only. \subsection{SMALL\_CODE} When this is defined some of the code such as the Rijndael and SAFER+ ciphers are replaced with smaller code variants. @@ -3824,6 +4122,13 @@ data type you can perform integer operations with. Ideally it should be four or of your block cipher (e.g. 16 bytes for AES). This means sadly if you're on a platform with 57--bit words (or something) you can't use this mode. So sad. +\subsection{LTC\_PTHREAD} +When this is activated all of the descriptor table functions will use pthread locking to ensure thread safe updates to the tables. Note that +it doesn't prevent a thread that is passively using a table from being messed up by another thread that updates the table. + +Generally the rule of thumb is to setup the tables once at startup and then leave them be. This added build flag simply makes updating +the tables safer. + \section{MPI Tweaks} \subsection{RSA Only Tweak} If you plan on only using RSA with moduli in the range of 1024 to 2560 bits you can enable a series of tweaks @@ -4030,8 +4335,8 @@ To initialize a cipher (for ECB mode) the function setup() was provided. It acc can specify the number of rounds they want through ``num\_rounds'' where $num\_rounds = 0$ means use the default. The destination of a scheduled key is stored in ``skey''. -This is where things get tricky. Currently there is no provision to allocate memory during initialization since there is no ``cipher done'' function. So you have -to either use an existing member of the symmetric\_key union or alias your own structure over top of it provided symmetric\_key is not smaller. +Inside the ``symmetric\_key'' union there is a ``void *data'' which you can use to allocate data if you need a data structure that doesn't fit with the existing +ones provided. Just make sure in your ``done()'' function that you free the allocated memory. \subsection{Single block ECB} To process a single block in ECB mode the ecb\_encrypt() and ecb\_decrypt() functions were provided. The plaintext and ciphertext buffers are allowed to overlap so you @@ -4062,7 +4367,8 @@ updated by the function before returning. \subsubsection{Accelerated CTR} This function is meant for accelerated CTR encryption. It is accessible through the accel\_ctr\_encrypt pointer. The ``blocks'' value is the number of complete blocks to process. The ``IV'' is the CTR counter vector. It is an input upon calling this function and must be -updated by the function before returning. The ``mode'' value indicates whether the counter is big ($mode = 1$) or little ($mode = 0$) endian. +updated by the function before returning. The ``mode'' value indicates whether the counter is big (mode = CTR\_COUNTER\_BIG\_ENDIAN) or +little (mode = CTR\_COUNTER\_LITTLE\_ENDIAN) endian. This function (and the way it's called) differs from the other two since ctr\_encrypt() allows any size input plaintext. The accelerator will only be called if the following conditions are met. @@ -4101,10 +4407,10 @@ struct ltc_hash_descriptor { unsigned long hashsize; /** Input block size in octets */ unsigned long blocksize; - /** ASN.1 DER identifier */ - unsigned char DER[64]; + /** ASN.1 OID */ + unsigned long OID[16]; /** Length of DER encoding */ - unsigned long DERlen; + unsigned long OIDlen; /** Init a hash state @param hash The hash to initialize @return CRYPT_OK if successful @@ -4144,8 +4450,8 @@ The ``hashsize'' variable indicates the length of the output in octets. The `blocksize'' variable indicates the length of input (in octets) that the hash processes in a given invokation. -\subsection{DER Identifier} -This is the DER identifier (including the SEQUENCE header). This is used solely for PKCS \#1 style signatures. +\subsection{OID Identifier} +This is the universal ASN.1 Object Identifier for the hash. \subsection{Initialization} The init function initializes the hash and prepares it to process message bytes. @@ -4251,3 +4557,7 @@ but should at least maintain the same level of state entropy. \input{crypt.ind} \end{document} + +% $Source: /cvs/libtom/libtomcrypt/crypt.tex,v $ +% $Revision: 1.39 $ +% $Date: 2005/06/27 13:08:28 $ diff --git a/demos/encrypt.c b/demos/encrypt.c index 67627f7..d8eb293 100644 --- a/demos/encrypt.c +++ b/demos/encrypt.c @@ -235,3 +235,7 @@ int main(int argc, char *argv[]) } return 0; } + +/* $Source: /cvs/libtom/libtomcrypt/demos/encrypt.c,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/05/05 14:35:56 $ */ diff --git a/demos/hashsum.c b/demos/hashsum.c index 23946cc..653b6ef 100644 --- a/demos/hashsum.c +++ b/demos/hashsum.c @@ -113,3 +113,7 @@ void register_algs(void) #endif } + +/* $Source: /cvs/libtom/libtomcrypt/demos/hashsum.c,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/05/05 14:35:56 $ */ diff --git a/demos/multi.c b/demos/multi.c index fdc8dc6..af4d6b6 100644 --- a/demos/multi.c +++ b/demos/multi.c @@ -104,3 +104,7 @@ int main(void) return EXIT_SUCCESS; } + +/* $Source: /cvs/libtom/libtomcrypt/demos/multi.c,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/05/05 14:35:56 $ */ diff --git a/demos/small.c b/demos/small.c index bc9793b..6bdd842 100644 --- a/demos/small.c +++ b/demos/small.c @@ -8,3 +8,7 @@ int main(void) register_hash(&sha256_desc); return 0; } + +/* $Source: /cvs/libtom/libtomcrypt/demos/small.c,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/05/05 14:35:56 $ */ diff --git a/demos/test.c b/demos/test.c index 290861d..f6c7170 100644 --- a/demos/test.c +++ b/demos/test.c @@ -2,18 +2,23 @@ int main(void) { + int x; reg_algs(); printf("build == \n%s\n", crypt_build_settings); - printf("\ncipher_test..."); fflush(stdout); printf(cipher_hash_test() ? "failed" : "passed"); - printf("\nmodes_test..."); fflush(stdout); printf(modes_test() ? "failed" : "passed"); - printf("\nmac_test..."); fflush(stdout); printf(mac_test() ? "failed" : "passed"); - printf("\npkcs_1_test..."); fflush(stdout); printf(pkcs_1_test() ? "failed" : "passed"); - printf("\nstore_test..."); fflush(stdout); printf(store_test() ? "failed" : "passed"); - printf("\nrsa_test..."); fflush(stdout); printf(rsa_test() ? "failed" : "passed"); - printf("\necc_test..."); fflush(stdout); printf(ecc_tests() ? "failed" : "passed"); - printf("\ndsa_test..."); fflush(stdout); printf(dsa_test() ? "failed" : "passed"); - printf("\ndh_test..."); fflush(stdout); printf(dh_tests() ? "failed" : "passed"); - printf("\nder_test..."); fflush(stdout); printf(der_tests() ? "failed" : "passed"); - + printf("\nstore_test...."); fflush(stdout); x = store_test(); printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE); + printf("\ncipher_test..."); fflush(stdout); x = cipher_hash_test(); printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE); + printf("\nmodes_test...."); fflush(stdout); x = modes_test(); printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE); + printf("\nder_test......"); fflush(stdout); x = der_tests(); printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE); + printf("\nmac_test......"); fflush(stdout); x = mac_test(); printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE); + printf("\npkcs_1_test..."); fflush(stdout); x = pkcs_1_test(); printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE); + printf("\nrsa_test......"); fflush(stdout); x = rsa_test(); printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE); + printf("\necc_test......"); fflush(stdout); x = ecc_tests(); printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE); + printf("\ndsa_test......"); fflush(stdout); x = dsa_test(); printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE); + printf("\ndh_test......."); fflush(stdout); x = dh_tests(); printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE); + printf("\n"); return EXIT_SUCCESS; } + +/* $Source: /cvs/libtom/libtomcrypt/demos/test.c,v $ */ +/* $Revision: 1.12 $ */ +/* $Date: 2005/06/19 12:06:58 $ */ diff --git a/demos/timing.c b/demos/timing.c index 54c0462..368d6e4 100644 --- a/demos/timing.c +++ b/demos/timing.c @@ -17,7 +17,10 @@ time_sqr(); time_rsa(); time_ecc(); time_dh(); - return EXIT_SUCCESS; } + +/* $Source: /cvs/libtom/libtomcrypt/demos/timing.c,v $ */ +/* $Revision: 1.17 $ */ +/* $Date: 2005/06/23 02:16:26 $ */ diff --git a/demos/tv_gen.c b/demos/tv_gen.c index c37d1af..edaae3e 100644 --- a/demos/tv_gen.c +++ b/demos/tv_gen.c @@ -664,3 +664,7 @@ int main(void) + +/* $Source: /cvs/libtom/libtomcrypt/demos/tv_gen.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:56 $ */ diff --git a/doc/crypt.pdf b/doc/crypt.pdf index 9eb60c6cbab9ccb3269caec6440559309afe833b..1c56c51f7ffe88024566a020536d618f51d4539b 100644 GIT binary patch delta 395450 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 z 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%0D6=Q^0MT-g$>)MJ5zP4)wvAdu%`Z!m|L z31gM}2wT-`r) zl^<6pkNxG9$N9Z=Q}FF`Gw!U@!f`)}RYn6^Ac?HLSyP<4h}weL;=h1c3(qpPx_4>{ zLcZazN=S$J&m&tKbH#1hO$!l&5xF(^e2}`xov(cJ4J@+Rr;PwTwXkWWHF`PA7Zu$b zk0c~$*Cb?jd3YpL-+Uyt@8Tbo?rg5Ct`pg`hJ9hdZOvpSPZX^~MF{RKLq)v&Q^=j^ zaDo~jPK~s@b;WW$97@bBhcAw zL4~j{+B_Mcbk2a!;#_M{`pOEu9NknDJ&6h}g1^F$6^09+ABKDuTNeLgNG>wc*5Lf_C=zuwr}t~0v+e@^=U ziCkc2U`w1C7XeJ`YTM(C*UvO25C~o-y2r9!d%a}wc-VqlldfOJyT0MF^etT8Cv+FL5UR#a*+l8LdqV_bu9Ra{Jj#h)|~o4GLe{sHvU==pd(OoAVxDXR=fvL{Aj zu=DGz2Np0jAwceSeVm6@TJz9pkb%8~?&@^|oWHJ1GkbM-PFrz( zzbSu&@dIcyEmfI+9^9=tyg#mP?oy>o{*a;K=_)DpW4(Ty9=jYQ6Gl~iskYMhSdSdK zJwN>6`SIA9Nu_BUy@K^ZQKTY@ma}Klqg%m2jGln9?bMLxr`rf$#iOfiXGU7Ht8&Z(h*+a(;N+ z736fYX|_9nV_EySx++L--CaBEU?NvIaj~U}QtLt&teW<@@Q}qGEUfw? zqppOEC--R-UR6OB>$|MgtpuTimCInY-BCJFmA}BwgJfO7bFA(GqyRN7BB_F-R-$w*%-OHjPFCn zkO-x#pL<&=>TE}SBNpJg@5869Mo}6AO-B_W7b!u2?!Vm7>2-fRSTt_5VAOtd6=2l* z_WgMOEaJRATwk5BW2oO;`XGo;W(&T|Con0%SMGBfjI-(Za^=;I5+wyV)CJ#D5&;H; zl4KPE0Nz_$+|DX!B#c4quo$OM5ojYoEZd(x0uUorycnte{v^`Vvr8-}`lI-1NXa2( z{6&^VT(aCLc^wDXP$f5Xc}i&8;8WgQt%V?`QfPK{*`dnKhF*i>qPTpRJOH2Q*^O?U z$vHE}NyPof{ZdcvQ3IH_xV_f7mH7OMQ$Nuf4b1taIHp|syc>=6$M}U@k z!1&A~AIC`}oDgV5Jv;$v0d`faD;8 zNeF#dn@-lh?9`c7)$3>`_!mYw+5kOm^9_^u!eVqDEo?_RoOP(#A|QMUDVxv~4x)3- zI9YI(N1{z&Z|ahhA8?bk3vEgO7YJJZQDdx>B>)BDlRjg%LkVv#o^zdssUWVsS+f~# zEG)K{(=i&N+an{%60FK?PpI#3LdCM=&b38bvJfYwm|s9KBocJr@sOVWf+Z=5bYn>H zu&~J!Iv;V=@NY=oB%URv-wbP;<^*=T?XR8Azm5Qsj95nRCVQ49z|$B@HmJONZmn@GCK^!{ zRH4Bz0OT&{@JPGfDsLsNq2HNO?kPV}ZsX|>tIryTD9l(>c?{LD)p8Ky0qxl*qe?_j zu%f#!EMgL|6~KF^iq8YVxH&42Ih+k8@F4ZWZQnL=NKvNJ3ZNVG|bJKh#Bd;B2)2r5s`;$|5jybo~LXq}uf~xN${&yALU8 zIP0)Z(?*?!o_9zV&(`)3%HINuf;~nHiIhDK+aDZD39uB9hE7P!Bfk29ZqiHy9j7{_ zE`a4sudiFq;nN81Ob`ch8K;O8Bb|3QBpOy{n&lVtx}<|&+sa;mqy@G$v0Uvy^Cr^~ zAj6(sA9D@C831OVNFFpq&|iW=X z_DX!*q3O*NvWj` zh;8biYRT#ZHz<$?&6Fs}K5Ph$L?FC?K-<+FlRIoRx5!GI_k8 zgn^K_CW%cr6oBwH1$JOJl1vd@ag+5+0Vqs3l$t_m5;>);rP+ z+Bp%bttG|ZI1x-on~?rgG@;|l7fX#zIL`R7N+?I&pB7MwNor<*)PtA#A6SJ8W+bF$ zbr)PNhr)GGM`NBxVCM+wMISG^h)SCqH~^}>+L+EOnnq}KpCCCyYa#}PIu4%j0aZVA z9n>|!TB>c2B=aDqkjnx@`AB!imIaXY?q#*rz`Q~4!QpV8Ji_pSj}qhK;e$xL$V)rw zdEy7?A_#MZLY^k1k@(UiF^_A4deO^^j}lVm>HhfKI_ZxZTE2e}sH#tHCp842hO4{o~;V09>G}NQQSCSy^0gNa$NItG20GjRWenx3~fHdkWe& z`ak=B-vK#hB?ohus(r;=!!35#8_R?7>n=vPO$(gGduTmR(s{@6%8tdFP7B?@(?q5B zZGEg!c|JPyU-!U;2Y(645pa3f>`}vtyTAmHkYbU6qXMO<BBpm9pjIVL$8NGA-lSjccCyni3rWrS%(=wmPKg2;mfC zrptlVq}tu@m_gPuS+m5D*Mw6>85g}Kgp`-Wb-N)aFJqw%FkoE{rjEXx^>3xHdOf!n z4Jivj(M+>~qQgFpT1WH{)V9~_?X9nL<4}<(Da7XSl}sN$h+n8n|0&_?=e1kOG_H)c zvbqpZ<4SIz%8`pVMV7S8)+FBl_bw47Ty$Tc0EEr{1pNolxGdJK;bcGh`Fb+xf}lZW zUQQJ^h&4d~bzy05H9-NBR-?I<2lJ;YjuKXLj9srSyneXl`V;G|zMj?i;pxtmQ+&T= z@m=T5mI`&>0F0l0{UL=?I|%OgJ-nSZN2{}b57{kqcx{u>_9LQfys7LD>S!<(>g*`m zSQ!glrck+!PQ3d}AL|(R5a+h@Ey6qnAP0bcy;N?OAsrpz}7k&?Eo*WgOYs2a_MjHaXiu!a|p4p9ApiT%E-IP{PHH!zbZ9vvubh zZ?6HCE~`!FgO3svL4AzF^-R=vhq(yWjSl6}b0Qgo8t&_0_ZR`Kl-Z%s{N3YHBn&dm@o_9{T zO*&kZ!t5W?rQ%E*3@nq^vtZ82K_(^2Ckh*yb-3aTIc=20pI4(>yLMNnrQ{>W z4nS#Oj-N>4FjW)%%VIsfz2)lV^A12(T5`ix443{CvGKfZeeG0F=ucJA<<%{NZf&cr z1!%_Q*}(^8quqcz+qR8ajUvArK1O}1?Ls+@btuv2Kl4JG+7816)&WN>ny;&D;9;xd z75&Fut_{5r-POIdGiAzQr{g`P%~ZVM<2@MImK@wswFM`6m}5sva9_dPl^ehy^&>w? zcCUAioY1W5$`j9vEHk}h3ZD9Y>1L11^vJx3v2LJ`u&%wK0~0d$zx?BnU!Nlz%?b)L z!zCr`j*T#~kXKr&4G)vX))m0Ew$8t$U|SDKMpWf@#!-?3Bma8N7P*2mHRAphS$N3i56D2jh2--gkX;(DHfNt85e|4 z>JXJiln@3lea)L-9dxGd@!3znD?6c##T#Tk?zVqE&E&h$|GSxU=r!xGLf$1R(@+~~ zhL;h++}wH&eEY|oJ zi^-=#_8feYL$>fv(9mO!(GDZ(wl**_zqtVw1EG@nPaTd8+LRJNi!*Jib_0uab0yeu zzL)qu44yq-lkbXn6czb-4nH%nwNZj5)9mnN9po@jiG+vgdPvE=`>Qr_e`I)lJB5B8 z+wrBUP-pE8xpe;8piC_m5jbo*^#FI>s(o7qqi2EPb*8JeR~HJJbtKMWYdSQ2cR%<+ z3cI261EZ+fQn4QJ;9_i2ItALQ-`dy-5ZXWQIq-X66n{2NjrG?PZPGrtb0GYd9USt- z&j0Lz_!1wfxs4d!=Rj8UKbJvP?Dp+O;B1kVZ-)`522&88c2KGiNlg;tmQ^dP*{&hc zcnes6v_a(+dFBCwedAz|MEU9=*>6gVxN7bM>mwa>?A-#)2;uKs{Y7=NRP5_j#DH`; z5eA*Vogxhz;bnBl#SZqeX_&Z~U)B6|q0v=p8WV|jSR#_`>zIC%=j%8-&-)dy!2R_P z*V=YF$yQxb(r;6J7pfS^ii5pOxYN)Bk7vk5>4992gl{IZ}UR z0FwctJ&Zi`~_<%e;@LiII-6#Ja)cJ zKbf_KBCIljh(L2@d5qp{H{OU96_6Z!hXYC@3*E(U#FqG_0VR?1cjNPisY_8drfAAW zE>3Q!e0e0)lEv#1&YHiNxioQk4KDY`>FWS`Vf~&XG&Gpr&Q6|>d*kf-zJUA3Vr@zf zG8WZ4@Y*eA>U}I5jGXTGyWz-E3i@1L$J(TdBs0smyN8<`?+biqZAWsKjqmlBT^^q| z>N!DZ94tZ+$3rMA=HJvHNqvAm620Ch66#%_iN$*3#qzHpSkYw@`qJ zY5)oj0o$adyGOm9y7Y@&A2+e6w|k4G+&0c^R$ej#xzDrJaqEHIKa59n`z^F!AwZd@ z>FP^a8M+vmDp8VWRoRl7MAGv(t>dO0#8RoS#iIPQ`bT1HLWy)V(s0Tjzj)a~MiN}7 z6QhwUtA=Kd@^{QF1(39+oqd-UjUAvkL6T#d$@jOV=L#L&$uw~n&;%L@PyI&L$g*FJ z$ohIkNFB zt7yXlM&-^8^xjH9NwH7k<(CmTbz*Tc=U%53o->Hon9|YWv(btRKC`g_SPOta8B+Hr zK{cLVN;KhYSM7qlVvr#aa>?IT8#=@-#bQ5ss!4`ipV#M@Xi##PlCCCIl3)vU?63{n zuR>v!u*^h8C5-e#Hcq1Ml9cZd-#?|gP91MpL?sk`C5aFPNVhy;g%0$Eki=TX^Odbi zc`px{d)kyhGJj~#H`8?pcny%hKEOUEha(b-pn~E9zs&L%O$UWwZ9!glQGdv%JpN3u zj}8z`ZYNrhpRWHM)iOAgeECvl5pQGZiq2RYt){J@)(86cKuQoe3z^q76_x6@mUd?p zHZd;zNmWh_3A+v8)70*ryGHErkX zs|(U1lGhnnMCrH%maO(|VQEzk6;B-Nz$tj`mXi$x^aCq8m4=1(JKWZ5Gv8St_{J4w zDHY_H(mE#HJg&nR_E-Q65I2Xey^T+X-3<%GPp(lydsk(Yzf1S@|7PCl-!9j7icnLg z9v(E(jcvTiTD_uw0)4ITyUX&*d$OYQ4jdX>(jiP_#*@`LDqg1pn>eMU3=0_aC%Ixl zzpBOq9lXks0#R$mfF+KPdp*+gSX#N(=5EJIC1an@YWksD;5-4&EpeD4EO0XN+;5Mi4eaRT8)b1lyT^ zP}k?WJ>2#&L&yP%Pgefxdy9$lyF}@b2hp?3qkUUYNuW<_Pv?NO7jvAKA>zRyNY z*KE`ChXi7eXLsz^`lGx2{`|8&*k31S=ghr}{tX6cdZir#ZQi+#?h0hyx(vMBwPr7s zX$%V0jXcU7go;Qn9efp$byDm89cpQ&p!R#&33<WL`QeKUlO}MUzf}5kfuYZ zjWubCVBZnkNxzi$a;jV*+nuxG^txZ~-yY&r`qvXET)K0c7cph}r%*;4fqbDlr1l2l z6uIxTr^@6ry(S^>xO{(lvS)v3cZ@X^e)-8W%Gm8YAe9x|80_`Hi$UMwjpI!A_kLC98YD7g64+j++m!@W+H z%%z^78B7dOfKM&qacbsQ^4PO^);fQ+LDSSDzpd^>>%cLTZI2IrFoI}HwNy&i>V>I+ zJVbZwCL7^3r~`WlCP?g789#%kB&O|RT=ZMJQV9Z%F?(f5vlbE@R2g%MA2&g#1Y1J+ z;u}%Npgfm-KOqQCZ0Nyc#t`Fz|8WCo^kIl>L&%fhiA}==<$<+sbRtJl%prK{ z9Y^;RnwmuQmI(zW=ZBik9qHmEffhBlAAxsxZAMuXrf4Hj%`S2r6XalxYe8x3J`uw* zh4}#YCy+*Cp5M!C2FG$NUJ*cnrB9h}T;!5SL}?;)Laf+MX0YR-N5xU`eoG!R%z{os_JN|cvc1JzAhNixV7bkjjYYH$GHaWS>@;SHFzVj3vdm# z8RosGkY+ySNVSoT?xOC@Md7ag3btw_E<2>hHRMrsG4t0K4+J+0lrw4l7u{0G+Ces;^|bLw zOfp6562sF=dLw;x+apRZOO@-zR_PJMdl9#r4g_+gBZ#_yvqLBB9L>BzCTa7y$@=f! zG~rufkWH#^h;$aM-}fxr!&u=mc`C;II&3Nx1(A;el1WV@h#(TkO*Xnbu7#^ZvP_2o zH*F3Wuzd*j7DadgaR4pt1=sSuk~@F$F9GKvw*tk3o->YdMXyR?#+3w zi_SO)w7(^dxyUW0!D~a4t@W3g>~=A52&+q}CGD`>;-5K$PI3+Ffc}obkkE>}femh~ zNWTM}N@OKeI4Vit0Rkthn89rxcy{M#C2{GlZr1Tm2p9PJlhKk{#a;^kV6yB zW;N|v7v+?~8mLfPF?6rj`Y-M)XHgxv>kphM*deyC`(m+oP1uN68veY{u>CCOH$NB(iIlTkN z_`SyRA+4mL=;{K=H*LmLoz6M!LW%tKngD_QVtTkxLwk+K5{67x=CrJj#{=-@ic$se zvq3P@Z6Dtn?e8%9Of=Aamm8Ix3zF!yUf@~4qOt4@{^_y)i*%9Rk@;`tkKtCS7UkH`u5+qd|e(Ra0oXvAI)hxqf~M?par zz-%CRJj6whMPTFZ#%r6B#2WP@sPfFD@^wW10Qutu@wYycEQ@{EvkHTO4|S|4)g0)A zrW-rkByV)K%VK=YwdgE&M+YN2B*65&TzQ57|0(T1C~*O-HIFN|F5wbsV#_EKoPjA5 zSnoBdV_%OnH3k2(gYn&H#<*a3Lz;l6MX~!^Q%ORQaVSgBH7jDl=m+O43*gs;&vXSs zE4V{2$?hpht0@|p&mB1Hn@G52bcPqWGE*Me&V-L%VA){x81q@7lh=pDlE;@Z-`{Dj z3`Ju@y27BTr2eu21Xj#1)S4uiXCbn zxNuxF^1@CVggt5}1~Ed47mw{#*tPH@%nqqJZ!bns%DyOn<^eT>aV{3FnUTYN)q1&bhAcN(7dcMvUi=g#do-ke+l8>X;4aFJDL*t{zLZNMY?z#V z(1DKUv446thqqMx7V^=eSLFAQVZBkG&rJh(V>m6c&kHM6gbu3S25o%7k$=?ewod+w zJsvRyS!-GA{*ms`(3t-IyPT$nNUjJ4puUgZb>sB7y{O=Yr*p~D!+8IZM@7WTGitot zd`Jt250~`KXfL7LVe#42`8M%=4m@KNv9JD80WZIx$A~oBZeCoqA3Vls72CJXz|R4k z*l#}sBu%9^{4;iQ1<2vPjT*bR6Ty`e0PrN z?1WB#!yq1e^I+d)LJ*6fY&Ahi7mMLP`RNd!HzQ*iZxRM1`XJ4o6r3+3T zWA#-Z^BRKR0OO23hLsalk9QMf)*mEfN-c4#;i80=gI$<~1_!M{8P#FZ-KCG8a z(Jq>kGi7hDmBflMJiy}Q)IlE>BnR9TF>xBKuB98VAH~cZ38Rd$!yEB%x2>>uw)0_b z#3hr#_O|fw{(Inu{Yj_B3#L@Z_~|qd5C2U~&BF3@zp?>tP+RBtap740%m7=g8=Al~ z&&QO<*!UpjJaC5Zi)dV#NpfeOZrJ1aBtb8~$Jci2KFvOtHy|wDASIzgCo{Fg&+P4A zwqW0m)ABU7Jte{!RKL4~8`A{;Rlp(vZZSzJ|)$KW6L|lO5-yJ;SzvUmvqqpiIImr4t9e{60XsO1a|4Tvmp8^60Ar%AR z|9i>8!0~?w0yf6~M&a0){)d8)h%zw;OxJicu?!5*SRP)EQiOH1AR4DE0ELKP3adfMydG=8M6` zdQ}G>4$+Ur6r9_yvr-G{rJ!qq z-(wJSfYWU4HiA!O6!m&s#%jB&l6}&($~>+RYfu2IYoyHAB_6X&$Mihr;UbLDO!ed5 z!gLY|_00}rC}35Ui$@7vz4EIj#zUMY`=4d+hicOLIAd!++=^BVUqvBS&{6@b@K~*& z3776tS-Xt2DeIEA^1kKD$a@XU*^$oS@v>RkZ*)c)uyoAyc@eB2Pi_6waE_)_0Om(dBrE1;PrUlybI!Ja zaQ=2Mt9fXTe!m>U@!b0QCWG(>WN8q|e288Gkm|zGuXMZ|>$$M$YdWrx1xV0OD^eqI z&_+EwWbz~dnI>=qiI}C=3|Z~nbds3t`<*QaQh}33)Gy`aN}hO5GmTl483mYeWKWPd z69&O9**buF0hCp&`v39&1cC4J6C0>L5urVu~ZDZ1d zZ#oBo^*drou-2y^9@=oaQ+V7#rdPz>wsK;RBp5treN?Pj`^6g5i3-ZmQfMdrf4k{Fp1d?PjYV(NZ&X!Bw2Ey@JrS*Me_9L7fvhc3%xatglYHv) z@NqS4hVC#2gtkz`VCZ9ulPbl@a`+#|$6eAtcsHXEe#(|Q=H)>ULQlIEK<^vH|87{6 zfVsc4S?hp0+%2Z16Jkb-GGnZ23~n})7k8)d`*P-42T7M8fPvJGMk%&Cz1Blz>B3lm zE$@GAUm<>kHvX*fC;00({B#2VMWr287rBj-lVc)z`@`k^$7PFtf3TLNrJ3{Ft#gT@ zg(X7&dTAxQ0>dlIz`%L3?2&COyCH#K0LNzV=i+|VP^w>isrr77H5()t>iyH0Y}GnD zZH4Usx2Z+B+^It%Amx0<$m`<`lo;X!6$jL)H=6J3Xjs^1PqmB%>ED1Vjyy~GcO&od zfT>eoUXLtNNxNT!w%lM+&XM*~uKDhQrD9GAceLRi-pDn<76m0gmlylRk%k`+p}Kc1 zU0NsBshb1P>Yled2Kf3O3R8=v!t>1N?$1l#tk~cc(U+F3+x~d97~;FxWC4}=AWemZ zMdp`#Xnt`d%-vDc^yq+NcgA**TxZ#y>-SpaHZQi!dWWGWJgh3WrFZoyEIXN}E$-|2 zes1N}9WOH_i?gXS0#F;>ca_<#$7^2&n+n7?g~I}@>*xelk|@bVpO>~%41}WiQYO=c zzw)4*Am~B0oU{#xl>Snos6YzH-S*o{B+&1+1JFgAMPuh=Car)~4F2G+o)xHhVc1tJ z%6Ihw@XHkhFRo|#oI9)$PMt&B-da50p4b%#?+v!J%I%91Pk0-kAkV>eNIuJc8&Av2 zN&gT&DFJ7LKQYMocoss39)vnBN1ui((TTuu?7hKkSMi0v$c2e@QioR_B=&G3h?1ci zm659FCD#rWNxT4w z6A)^z*)nk*_AIfG*oNazdddnInSXO9wqP3D0#L^R5UGGdB@FE*Fc7BQ-`hou2@rmm zuS3&A0X;p3Asmp}G&zrCJyc1)aXC{zHti7&@WbKHote7Lh>6L-h`}9MmS)~g5w>?@ z-h6dNtD^frk9OKs12RLh(fV4q_yVrPJPX5}=X?EQ$yFcaASK;T=2*b;fRYRtqs$hZ)f~x-9fANMqgr*{ zc||WoCvdtNR*Q!RR%F~+RA+!(0ds;k`vUeBnbyV+(&^vyGoNuzI4T7{#Uq8?&}Ug7 z-t%eQ{#3iTWd!8b3)8-wpO8SdF@Dy<2q0k$TVG$!i9ui?h(p$BHGgC2%|=lG_MF(p z?F>Lq7~nRWUGl}jen0(N{@DVwzDG8B2;SxPT-`&H)gMuijrr5z?*(5rA*~T6YW`{} zdO|ASE1cMN(BJ;IN%eeB1H92H2k$3v1pg@9%gf$)YW)KbdCtSMz*on@z+0iE`2ynUMHOCFD~cn0H>2FpgS>!&(mLd`JHu?M z2rMqN;J5`$ReHoks2ED+t7Lz)G-m})0I_!kn4IAp+{-J{LKNv&gkuJ7`V*cc^9_}# zA(6yZkNp52VRE+Zt=nwDKyjh6Wt%)rSaJ>R4Ke?M!_PN-#aZWi;;(%axc}hwOzf;I zi3PX9fNrf#JKXkP)5dw1;!}muCR|n4yt`ky3a&Ih*)^l+?CHKggEQiP zR~bn~*};9;Tl# z*cI=EEGh;NyBv&F1~6$)M}5CnM`Ksn_4#z#bCal(%pBj3clmX{jzZdhbD(h1{p>${ zT+s7>I6GwL8c$VGMHv<{E;4M$_4ahQC>sha)(woRdLif{)rewds`>WU5RC|-YV{Q{ z0$9Os=%9L$yrY*pbQ91PDDg*XPM3=`Yg3+vzQ|pOs-te|U>1XsQRN*lrV1@tOu1#z zWfoZ;*JhBx4OLw9B~Z60H$8|ZvPBEe|H^WU!SsvrcraH6u#z&~on?C7vDC83*6|g# zT^3lGRT?PFz-P?D`)3xJw%t;vlj0k60?Pj%0DnM$zgi41R&b)DH9oZaP+CyQ=z*g? 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

EDJ_5(&WX`99%~Cbc-pM9BFg34#MP@ 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�Habbe*RbWWa^!xb&$ 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

vlMuA1o_yDHw?HHizO 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ⅇl2jq{`B2I+4XE8LH*yV7-rg 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 diff --git a/doc/footer.html b/doc/footer.html index fe5338c..a1895ac 100644 --- a/doc/footer.html +++ b/doc/footer.html @@ -2,3 +2,9 @@ Code by Tom
Docs using doxygen + + diff --git a/doc/header.html b/doc/header.html index 426d4e3..231475d 100644 --- a/doc/header.html +++ b/doc/header.html @@ -4,3 +4,9 @@ + + diff --git a/genlist.sh b/genlist.sh index 73daa1d..832e8e7 100644 --- a/genlist.sh +++ b/genlist.sh @@ -4,3 +4,7 @@ export a=`echo -n "src/ciphers/aes/aes_enc.o *(MPIOBJECT) " ; find . -type f | s perl ./parsenames.pl OBJECTS "$a" export a=`find . -type f | grep [.]/src | grep [.]h | sed -e 'se\./ee' | xargs` perl ./parsenames.pl HEADERS "$a" + +# $Source: /cvs/libtom/libtomcrypt/genlist.sh,v $ +# $Revision: 1.3 $ +# $Date: 2005/05/05 14:49:27 $ diff --git a/makefile b/makefile index b38aa17..fba5f73 100644 --- a/makefile +++ b/makefile @@ -4,7 +4,7 @@ # Modified by Clay Culver # The version -VERSION=1.02 +VERSION=1.05 # Compiler and Linker Names #CC=gcc @@ -21,6 +21,8 @@ CFLAGS += -c -I./testprof/ -I./src/headers/ -Wall -Wsign-compare -W -Wshadow -Wn #CFLAGS += -Wsystem-headers -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wmissing-prototypes \ # -Wmissing-declarations -Wpointer-arith +ifndef IGNORE_SPEED + # optimize for SPEED CFLAGS += -O3 -funroll-loops @@ -30,6 +32,8 @@ CFLAGS += -fomit-frame-pointer # optimize for SIZE #CFLAGS += -Os -DLTC_SMALL_CODE +endif + # older GCCs can't handle the "rotate with immediate" ROLc/RORc/etc macros # define this to help #CFLAGS += -DLTC_NO_ROLC @@ -58,13 +62,24 @@ INCPATH=/usr/include DATAPATH=/usr/share/doc/libtomcrypt/pdf #Who do we install as? +ifdef INSTALL_USER +USER=$(INSTALL_USER) +else USER=root +endif + +ifdef INSTALL_GROUP +GROUP=$(INSTALL_GROUP) +else GROUP=wheel +endif #List of objects to compile. #Leave MPI built-in or force developer to link against libtommath? +ifndef IGNORE_MPI MPIOBJECT=src/misc/mpi/mpi.o +endif OBJECTS=src/ciphers/aes/aes_enc.o $(MPIOBJECT) src/ciphers/aes/aes.o src/ciphers/anubis.o \ src/ciphers/blowfish.o src/ciphers/cast5.o src/ciphers/des.o src/ciphers/khazad.o src/ciphers/noekeon.o \ @@ -115,29 +130,43 @@ src/modes/ctr/ctr_getiv.o src/modes/ctr/ctr_setiv.o src/modes/ctr/ctr_start.o \ src/modes/ecb/ecb_decrypt.o src/modes/ecb/ecb_done.o src/modes/ecb/ecb_encrypt.o \ src/modes/ecb/ecb_start.o src/modes/ofb/ofb_decrypt.o src/modes/ofb/ofb_done.o \ src/modes/ofb/ofb_encrypt.o src/modes/ofb/ofb_getiv.o src/modes/ofb/ofb_setiv.o \ -src/modes/ofb/ofb_start.o src/pk/asn1/der/der_decode_integer.o src/pk/asn1/der/der_encode_integer.o \ -src/pk/asn1/der/der_get_multi_integer.o src/pk/asn1/der/der_length_integer.o \ -src/pk/asn1/der/der_put_multi_integer.o src/pk/dh/dh.o src/pk/dsa/dsa_export.o src/pk/dsa/dsa_free.o \ -src/pk/dsa/dsa_import.o src/pk/dsa/dsa_make_key.o src/pk/dsa/dsa_sign_hash.o \ -src/pk/dsa/dsa_verify_hash.o src/pk/dsa/dsa_verify_key.o src/pk/ecc/ecc.o src/pk/packet_store_header.o \ -src/pk/packet_valid_header.o src/pk/pkcs1/pkcs_1_i2osp.o src/pk/pkcs1/pkcs_1_mgf1.o \ -src/pk/pkcs1/pkcs_1_oaep_decode.o src/pk/pkcs1/pkcs_1_oaep_encode.o src/pk/pkcs1/pkcs_1_os2ip.o \ -src/pk/pkcs1/pkcs_1_pss_decode.o src/pk/pkcs1/pkcs_1_pss_encode.o src/pk/pkcs1/pkcs_1_v15_es_decode.o \ -src/pk/pkcs1/pkcs_1_v15_es_encode.o src/pk/pkcs1/pkcs_1_v15_sa_decode.o \ -src/pk/pkcs1/pkcs_1_v15_sa_encode.o src/pk/rsa/rsa_decrypt_key.o src/pk/rsa/rsa_encrypt_key.o \ +src/modes/ofb/ofb_start.o src/pk/asn1/der/bit/der_decode_bit_string.o \ +src/pk/asn1/der/bit/der_encode_bit_string.o src/pk/asn1/der/bit/der_length_bit_string.o \ +src/pk/asn1/der/choice/der_decode_choice.o src/pk/asn1/der/ia5/der_decode_ia5_string.o \ +src/pk/asn1/der/ia5/der_encode_ia5_string.o src/pk/asn1/der/ia5/der_length_ia5_string.o \ +src/pk/asn1/der/integer/der_decode_integer.o src/pk/asn1/der/integer/der_encode_integer.o \ +src/pk/asn1/der/integer/der_length_integer.o \ +src/pk/asn1/der/object_identifier/der_decode_object_identifier.o \ +src/pk/asn1/der/object_identifier/der_encode_object_identifier.o \ +src/pk/asn1/der/object_identifier/der_length_object_identifier.o \ +src/pk/asn1/der/octet/der_decode_octet_string.o src/pk/asn1/der/octet/der_encode_octet_string.o \ +src/pk/asn1/der/octet/der_length_octet_string.o \ +src/pk/asn1/der/printable_string/der_decode_printable_string.o \ +src/pk/asn1/der/printable_string/der_encode_printable_string.o \ +src/pk/asn1/der/printable_string/der_length_printable_string.o \ +src/pk/asn1/der/sequence/der_decode_sequence.o src/pk/asn1/der/sequence/der_decode_sequence_multi.o \ +src/pk/asn1/der/sequence/der_encode_sequence.o src/pk/asn1/der/sequence/der_encode_sequence_multi.o \ +src/pk/asn1/der/sequence/der_length_sequence.o \ +src/pk/asn1/der/short_integer/der_decode_short_integer.o \ +src/pk/asn1/der/short_integer/der_encode_short_integer.o \ +src/pk/asn1/der/short_integer/der_length_short_integer.o src/pk/asn1/der/utctime/der_decode_utctime.o \ +src/pk/asn1/der/utctime/der_encode_utctime.o src/pk/asn1/der/utctime/der_length_utctime.o \ +src/pk/dh/dh.o src/pk/dsa/dsa_export.o src/pk/dsa/dsa_free.o src/pk/dsa/dsa_import.o \ +src/pk/dsa/dsa_make_key.o src/pk/dsa/dsa_sign_hash.o src/pk/dsa/dsa_verify_hash.o \ +src/pk/dsa/dsa_verify_key.o src/pk/ecc/ecc.o src/pk/packet_store_header.o src/pk/packet_valid_header.o \ +src/pk/pkcs1/pkcs_1_i2osp.o src/pk/pkcs1/pkcs_1_mgf1.o src/pk/pkcs1/pkcs_1_oaep_decode.o \ +src/pk/pkcs1/pkcs_1_oaep_encode.o src/pk/pkcs1/pkcs_1_os2ip.o src/pk/pkcs1/pkcs_1_pss_decode.o \ +src/pk/pkcs1/pkcs_1_pss_encode.o src/pk/rsa/rsa_decrypt_key.o src/pk/rsa/rsa_encrypt_key.o \ src/pk/rsa/rsa_export.o src/pk/rsa/rsa_exptmod.o src/pk/rsa/rsa_free.o src/pk/rsa/rsa_import.o \ -src/pk/rsa/rsa_make_key.o src/pk/rsa/rsa_sign_hash.o src/pk/rsa/rsa_v15_decrypt_key.o \ -src/pk/rsa/rsa_v15_encrypt_key.o src/pk/rsa/rsa_v15_sign_hash.o src/pk/rsa/rsa_v15_verify_hash.o \ -src/pk/rsa/rsa_verify_hash.o src/prngs/fortuna.o src/prngs/rc4.o src/prngs/rng_get_bytes.o \ -src/prngs/rng_make_prng.o src/prngs/sober128.o src/prngs/sprng.o src/prngs/yarrow.o +src/pk/rsa/rsa_make_key.o src/pk/rsa/rsa_sign_hash.o src/pk/rsa/rsa_verify_hash.o src/prngs/fortuna.o \ +src/prngs/rc4.o src/prngs/rng_get_bytes.o src/prngs/rng_make_prng.o src/prngs/sober128.o \ +src/prngs/sprng.o src/prngs/yarrow.o -HEADERS=src/headers/tommath_superclass.h src/headers/tomcrypt_cfg.h \ -src/headers/tomcrypt_mac.h src/headers/tomcrypt_macros.h \ -src/headers/tomcrypt_custom.h src/headers/tomcrypt_argchk.h \ -src/headers/tomcrypt_cipher.h src/headers/tomcrypt_pk.h \ -src/headers/tommath_class.h src/headers/ltc_tommath.h src/headers/tomcrypt_hash.h \ -src/headers/tomcrypt_misc.h src/headers/tomcrypt.h src/headers/tomcrypt_pkcs.h \ -src/headers/tomcrypt_prng.h testprof/tomcrypt_test.h +HEADERS=src/headers/tommath_superclass.h src/headers/tomcrypt_cfg.h src/headers/tomcrypt_mac.h \ +src/headers/tomcrypt_macros.h src/headers/tomcrypt_custom.h src/headers/tomcrypt_argchk.h \ +src/headers/tomcrypt_cipher.h src/headers/tomcrypt_pk.h src/headers/tommath_class.h \ +src/headers/ltc_tommath.h src/headers/tomcrypt_hash.h src/headers/tomcrypt_misc.h \ +src/headers/tomcrypt.h src/headers/tomcrypt_pkcs.h src/headers/tomcrypt_prng.h testprof/tomcrypt_test.h TESTOBJECTS=demos/test.o HASHOBJECTS=demos/hashsum.o @@ -171,7 +200,7 @@ src/hashes/sha2/sha512.o: src/hashes/sha2/sha512.c src/hashes/sha2/sha384.c src/hashes/sha2/sha256.o: src/hashes/sha2/sha256.c src/hashes/sha2/sha224.c #This rule makes the libtomcrypt library. -library: $(LIBTEST) $(LIBNAME) +library: $(LIBNAME) $(LIBTEST): cd testprof ; CFLAGS="$(CFLAGS)" make @@ -193,15 +222,15 @@ small: library $(SMALLOBJECTS) $(CC) $(SMALLOBJECTS) $(LIBNAME) -o $(SMALL) $(WARN) tv_gen: library $(TVS) - $(CC) $(TVS) $(LIBNAME) $(EXTRALIBS) -o $(TV) + $(CC) $(TVS) $(LIBNAME) -o $(TV) multi: library $(MULTIS) $(CC) $(MULTIS) $(LIBNAME) -o $(MULTI) -timing: library $(TIMINGS) - $(CC) $(TIMINGS) $(LIBTEST) $(LIBNAME) -o $(TIMING) +timing: library $(LIBTEST) $(TIMINGS) + $(CC) $(TIMINGS) $(LIBTEST) $(LIBNAME) $(EXTRALIBS) -o $(TIMING) -test: library $(TESTS) +test: library $(LIBTEST) $(TESTS) $(CC) $(TESTS) $(LIBTEST) $(LIBNAME) -o $(TEST) @@ -216,11 +245,17 @@ install: library docs install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH) install -g $(GROUP) -o $(USER) doc/crypt.pdf $(DESTDIR)$(DATAPATH) -install_lib: library +install_test: $(LIBTEST) install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(LIBPATH) install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH) - install -g $(GROUP) -o $(USER) $(LIBNAME) $(DESTDIR)$(LIBPATH) - install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH) + install -g $(GROUP) -o $(USER) $(LIBTEST) $(DESTDIR)$(LIBPATH) + +profile: + CFLAGS="$(CFLAGS) -fprofile-generate" make timing EXTRALIBS=-lgcov + ./timing + rm -f timing `find . -type f | grep [.][ao] | xargs` + CFLAGS="$(CFLAGS) -fprofile-use" make timing EXTRALIBS=-lgcov + #This rule cleans the source tree of all compiled code, not including the pdf #documentation. @@ -242,6 +277,7 @@ clean: rm -f $(TV) $(PROF) $(SMALL) $(CRYPT) $(HASHSUM) $(MULTI) $(TIMING) $(TEST) rm -rf doc/doxygen rm -f doc/*.pdf + rm -f *.txt #build the doxy files (requires Doxygen, tetex and patience) doxy: @@ -274,6 +310,8 @@ docdvi: crypt.tex #zipup the project (take that!) no_oops: clean cd .. ; cvs commit + echo Scanning for scratch/dirty files + find . -type f | grep -v CVS | xargs -n 1 bash mess.sh zipup: no_oops docs cd .. ; rm -rf crypt* libtomcrypt-$(VERSION) ; mkdir libtomcrypt-$(VERSION) ; \ @@ -283,3 +321,8 @@ zipup: no_oops docs zip -9r crypt-$(VERSION).zip libtomcrypt-$(VERSION) ; \ gpg -b -a crypt-$(VERSION).tar.bz2 ; gpg -b -a crypt-$(VERSION).zip ; \ mv -fv crypt* ~ ; rm -rf libtomcrypt-$(VERSION) + + +# $Source: /cvs/libtom/libtomcrypt/makefile,v $ +# $Revision: 1.70 $ +# $Date: 2005/06/19 18:03:24 $ diff --git a/makefile.icc b/makefile.icc index 41848dc..a9ab38f 100644 --- a/makefile.icc +++ b/makefile.icc @@ -22,7 +22,7 @@ CC=icc #ARFLAGS=r # Compilation flags. Note the += does not write over the user's CFLAGS! -CFLAGS += -c -I./src/headers/ -DINTEL_CC +CFLAGS += -c -Isrc/headers/ -Itestprof/ -DINTEL_CC #The default rule for make builds the libtomcrypt library. default:library @@ -41,7 +41,13 @@ default:library # B - Blend of P4 and PM [mobile] # # Default to just generic max opts +ifdef LTC_SMALL +CFLAGS += -O2 -xP -ip +endif + +ifndef IGNORE_SPEED CFLAGS += -O3 -xP -ip +endif # want to see stuff? #CFLAGS += -opt_report @@ -122,29 +128,43 @@ src/modes/ctr/ctr_getiv.o src/modes/ctr/ctr_setiv.o src/modes/ctr/ctr_start.o \ src/modes/ecb/ecb_decrypt.o src/modes/ecb/ecb_done.o src/modes/ecb/ecb_encrypt.o \ src/modes/ecb/ecb_start.o src/modes/ofb/ofb_decrypt.o src/modes/ofb/ofb_done.o \ src/modes/ofb/ofb_encrypt.o src/modes/ofb/ofb_getiv.o src/modes/ofb/ofb_setiv.o \ -src/modes/ofb/ofb_start.o src/pk/asn1/der/der_decode_integer.o src/pk/asn1/der/der_encode_integer.o \ -src/pk/asn1/der/der_get_multi_integer.o src/pk/asn1/der/der_length_integer.o \ -src/pk/asn1/der/der_put_multi_integer.o src/pk/dh/dh.o src/pk/dsa/dsa_export.o src/pk/dsa/dsa_free.o \ -src/pk/dsa/dsa_import.o src/pk/dsa/dsa_make_key.o src/pk/dsa/dsa_sign_hash.o \ -src/pk/dsa/dsa_verify_hash.o src/pk/dsa/dsa_verify_key.o src/pk/ecc/ecc.o src/pk/packet_store_header.o \ -src/pk/packet_valid_header.o src/pk/pkcs1/pkcs_1_i2osp.o src/pk/pkcs1/pkcs_1_mgf1.o \ -src/pk/pkcs1/pkcs_1_oaep_decode.o src/pk/pkcs1/pkcs_1_oaep_encode.o src/pk/pkcs1/pkcs_1_os2ip.o \ -src/pk/pkcs1/pkcs_1_pss_decode.o src/pk/pkcs1/pkcs_1_pss_encode.o src/pk/pkcs1/pkcs_1_v15_es_decode.o \ -src/pk/pkcs1/pkcs_1_v15_es_encode.o src/pk/pkcs1/pkcs_1_v15_sa_decode.o \ -src/pk/pkcs1/pkcs_1_v15_sa_encode.o src/pk/rsa/rsa_decrypt_key.o src/pk/rsa/rsa_encrypt_key.o \ +src/modes/ofb/ofb_start.o src/pk/asn1/der/bit/der_decode_bit_string.o \ +src/pk/asn1/der/bit/der_encode_bit_string.o src/pk/asn1/der/bit/der_length_bit_string.o \ +src/pk/asn1/der/choice/der_decode_choice.o src/pk/asn1/der/ia5/der_decode_ia5_string.o \ +src/pk/asn1/der/ia5/der_encode_ia5_string.o src/pk/asn1/der/ia5/der_length_ia5_string.o \ +src/pk/asn1/der/integer/der_decode_integer.o src/pk/asn1/der/integer/der_encode_integer.o \ +src/pk/asn1/der/integer/der_length_integer.o \ +src/pk/asn1/der/object_identifier/der_decode_object_identifier.o \ +src/pk/asn1/der/object_identifier/der_encode_object_identifier.o \ +src/pk/asn1/der/object_identifier/der_length_object_identifier.o \ +src/pk/asn1/der/octet/der_decode_octet_string.o src/pk/asn1/der/octet/der_encode_octet_string.o \ +src/pk/asn1/der/octet/der_length_octet_string.o \ +src/pk/asn1/der/printable_string/der_decode_printable_string.o \ +src/pk/asn1/der/printable_string/der_encode_printable_string.o \ +src/pk/asn1/der/printable_string/der_length_printable_string.o \ +src/pk/asn1/der/sequence/der_decode_sequence.o src/pk/asn1/der/sequence/der_decode_sequence_multi.o \ +src/pk/asn1/der/sequence/der_encode_sequence.o src/pk/asn1/der/sequence/der_encode_sequence_multi.o \ +src/pk/asn1/der/sequence/der_length_sequence.o \ +src/pk/asn1/der/short_integer/der_decode_short_integer.o \ +src/pk/asn1/der/short_integer/der_encode_short_integer.o \ +src/pk/asn1/der/short_integer/der_length_short_integer.o src/pk/asn1/der/utctime/der_decode_utctime.o \ +src/pk/asn1/der/utctime/der_encode_utctime.o src/pk/asn1/der/utctime/der_length_utctime.o \ +src/pk/dh/dh.o src/pk/dsa/dsa_export.o src/pk/dsa/dsa_free.o src/pk/dsa/dsa_import.o \ +src/pk/dsa/dsa_make_key.o src/pk/dsa/dsa_sign_hash.o src/pk/dsa/dsa_verify_hash.o \ +src/pk/dsa/dsa_verify_key.o src/pk/ecc/ecc.o src/pk/packet_store_header.o src/pk/packet_valid_header.o \ +src/pk/pkcs1/pkcs_1_i2osp.o src/pk/pkcs1/pkcs_1_mgf1.o src/pk/pkcs1/pkcs_1_oaep_decode.o \ +src/pk/pkcs1/pkcs_1_oaep_encode.o src/pk/pkcs1/pkcs_1_os2ip.o src/pk/pkcs1/pkcs_1_pss_decode.o \ +src/pk/pkcs1/pkcs_1_pss_encode.o src/pk/rsa/rsa_decrypt_key.o src/pk/rsa/rsa_encrypt_key.o \ src/pk/rsa/rsa_export.o src/pk/rsa/rsa_exptmod.o src/pk/rsa/rsa_free.o src/pk/rsa/rsa_import.o \ -src/pk/rsa/rsa_make_key.o src/pk/rsa/rsa_sign_hash.o src/pk/rsa/rsa_v15_decrypt_key.o \ -src/pk/rsa/rsa_v15_encrypt_key.o src/pk/rsa/rsa_v15_sign_hash.o src/pk/rsa/rsa_v15_verify_hash.o \ -src/pk/rsa/rsa_verify_hash.o src/prngs/fortuna.o src/prngs/rc4.o src/prngs/rng_get_bytes.o \ -src/prngs/rng_make_prng.o src/prngs/sober128.o src/prngs/sprng.o src/prngs/yarrow.o +src/pk/rsa/rsa_make_key.o src/pk/rsa/rsa_sign_hash.o src/pk/rsa/rsa_verify_hash.o src/prngs/fortuna.o \ +src/prngs/rc4.o src/prngs/rng_get_bytes.o src/prngs/rng_make_prng.o src/prngs/sober128.o \ +src/prngs/sprng.o src/prngs/yarrow.o -HEADERS=src/headers/tommath_superclass.h src/headers/tomcrypt_cfg.h \ -src/headers/tomcrypt_mac.h src/headers/tomcrypt_macros.h \ -src/headers/tomcrypt_custom.h src/headers/tomcrypt_argchk.h \ -src/headers/tomcrypt_cipher.h src/headers/tomcrypt_pk.h \ -src/headers/tommath_class.h src/headers/ltc_tommath.h src/headers/tomcrypt_hash.h \ -src/headers/tomcrypt_misc.h src/headers/tomcrypt.h src/headers/tomcrypt_pkcs.h \ -src/headers/tomcrypt_prng.h testprof/tomcrypt_test.h +HEADERS=src/headers/tommath_superclass.h src/headers/tomcrypt_cfg.h src/headers/tomcrypt_mac.h \ +src/headers/tomcrypt_macros.h src/headers/tomcrypt_custom.h src/headers/tomcrypt_argchk.h \ +src/headers/tomcrypt_cipher.h src/headers/tomcrypt_pk.h src/headers/tommath_class.h \ +src/headers/ltc_tommath.h src/headers/tomcrypt_hash.h src/headers/tomcrypt_misc.h \ +src/headers/tomcrypt.h src/headers/tomcrypt_pkcs.h src/headers/tomcrypt_prng.h testprof/tomcrypt_test.h #ciphers come in two flavours... enc+dec and enc aes_enc.o: aes.c aes_tab.c @@ -214,4 +234,9 @@ install: library install -d -g root -o root $(DESTDIR)$(LIBPATH) install -d -g root -o root $(DESTDIR)$(INCPATH) install -g root -o root $(LIBNAME) $(DESTDIR)$(LIBPATH) + install -g root -o root $(LIBTEST) $(DESTDIR)$(LIBPATH) install -g root -o root $(HEADERS) $(DESTDIR)$(INCPATH) + +# $Source: /cvs/libtom/libtomcrypt/makefile.icc,v $ +# $Revision: 1.33 $ +# $Date: 2005/06/19 18:22:31 $ diff --git a/makefile.msvc b/makefile.msvc index 16d4b8d..ae01079 100644 --- a/makefile.msvc +++ b/makefile.msvc @@ -57,29 +57,43 @@ src/modes/ctr/ctr_getiv.obj src/modes/ctr/ctr_setiv.obj src/modes/ctr/ctr_start. src/modes/ecb/ecb_decrypt.obj src/modes/ecb/ecb_done.obj src/modes/ecb/ecb_encrypt.obj \ src/modes/ecb/ecb_start.obj src/modes/ofb/ofb_decrypt.obj src/modes/ofb/ofb_done.obj \ src/modes/ofb/ofb_encrypt.obj src/modes/ofb/ofb_getiv.obj src/modes/ofb/ofb_setiv.obj \ -src/modes/ofb/ofb_start.obj src/pk/asn1/der/der_decode_integer.obj src/pk/asn1/der/der_encode_integer.obj \ -src/pk/asn1/der/der_get_multi_integer.obj src/pk/asn1/der/der_length_integer.obj \ -src/pk/asn1/der/der_put_multi_integer.obj src/pk/dh/dh.obj src/pk/dsa/dsa_export.obj src/pk/dsa/dsa_free.obj \ -src/pk/dsa/dsa_import.obj src/pk/dsa/dsa_make_key.obj src/pk/dsa/dsa_sign_hash.obj \ -src/pk/dsa/dsa_verify_hash.obj src/pk/dsa/dsa_verify_key.obj src/pk/ecc/ecc.obj src/pk/packet_store_header.obj \ -src/pk/packet_valid_header.obj src/pk/pkcs1/pkcs_1_i2osp.obj src/pk/pkcs1/pkcs_1_mgf1.obj \ -src/pk/pkcs1/pkcs_1_oaep_decode.obj src/pk/pkcs1/pkcs_1_oaep_encode.obj src/pk/pkcs1/pkcs_1_os2ip.obj \ -src/pk/pkcs1/pkcs_1_pss_decode.obj src/pk/pkcs1/pkcs_1_pss_encode.obj src/pk/pkcs1/pkcs_1_v15_es_decode.obj \ -src/pk/pkcs1/pkcs_1_v15_es_encode.obj src/pk/pkcs1/pkcs_1_v15_sa_decode.obj \ -src/pk/pkcs1/pkcs_1_v15_sa_encode.obj src/pk/rsa/rsa_decrypt_key.obj src/pk/rsa/rsa_encrypt_key.obj \ +src/modes/ofb/ofb_start.obj src/pk/asn1/der/bit/der_decode_bit_string.obj \ +src/pk/asn1/der/bit/der_encode_bit_string.obj src/pk/asn1/der/bit/der_length_bit_string.obj \ +src/pk/asn1/der/choice/der_decode_choice.obj src/pk/asn1/der/ia5/der_decode_ia5_string.obj \ +src/pk/asn1/der/ia5/der_encode_ia5_string.obj src/pk/asn1/der/ia5/der_length_ia5_string.obj \ +src/pk/asn1/der/integer/der_decode_integer.obj src/pk/asn1/der/integer/der_encode_integer.obj \ +src/pk/asn1/der/integer/der_length_integer.obj \ +src/pk/asn1/der/object_identifier/der_decode_object_identifier.obj \ +src/pk/asn1/der/object_identifier/der_encode_object_identifier.obj \ +src/pk/asn1/der/object_identifier/der_length_object_identifier.obj \ +src/pk/asn1/der/octet/der_decode_octet_string.obj src/pk/asn1/der/octet/der_encode_octet_string.obj \ +src/pk/asn1/der/octet/der_length_octet_string.obj \ +src/pk/asn1/der/printable_string/der_decode_printable_string.obj \ +src/pk/asn1/der/printable_string/der_encode_printable_string.obj \ +src/pk/asn1/der/printable_string/der_length_printable_string.obj \ +src/pk/asn1/der/sequence/der_decode_sequence.obj src/pk/asn1/der/sequence/der_decode_sequence_multi.obj \ +src/pk/asn1/der/sequence/der_encode_sequence.obj src/pk/asn1/der/sequence/der_encode_sequence_multi.obj \ +src/pk/asn1/der/sequence/der_length_sequence.obj \ +src/pk/asn1/der/short_integer/der_decode_short_integer.obj \ +src/pk/asn1/der/short_integer/der_encode_short_integer.obj \ +src/pk/asn1/der/short_integer/der_length_short_integer.obj src/pk/asn1/der/utctime/der_decode_utctime.obj \ +src/pk/asn1/der/utctime/der_encode_utctime.obj src/pk/asn1/der/utctime/der_length_utctime.obj \ +src/pk/dh/dh.obj src/pk/dsa/dsa_export.obj src/pk/dsa/dsa_free.obj src/pk/dsa/dsa_import.obj \ +src/pk/dsa/dsa_make_key.obj src/pk/dsa/dsa_sign_hash.obj src/pk/dsa/dsa_verify_hash.obj \ +src/pk/dsa/dsa_verify_key.obj src/pk/ecc/ecc.obj src/pk/packet_store_header.obj src/pk/packet_valid_header.obj \ +src/pk/pkcs1/pkcs_1_i2osp.obj src/pk/pkcs1/pkcs_1_mgf1.obj src/pk/pkcs1/pkcs_1_oaep_decode.obj \ +src/pk/pkcs1/pkcs_1_oaep_encode.obj src/pk/pkcs1/pkcs_1_os2ip.obj src/pk/pkcs1/pkcs_1_pss_decode.obj \ +src/pk/pkcs1/pkcs_1_pss_encode.obj src/pk/rsa/rsa_decrypt_key.obj src/pk/rsa/rsa_encrypt_key.obj \ src/pk/rsa/rsa_export.obj src/pk/rsa/rsa_exptmod.obj src/pk/rsa/rsa_free.obj src/pk/rsa/rsa_import.obj \ -src/pk/rsa/rsa_make_key.obj src/pk/rsa/rsa_sign_hash.obj src/pk/rsa/rsa_v15_decrypt_key.obj \ -src/pk/rsa/rsa_v15_encrypt_key.obj src/pk/rsa/rsa_v15_sign_hash.obj src/pk/rsa/rsa_v15_verify_hash.obj \ -src/pk/rsa/rsa_verify_hash.obj src/prngs/fortuna.obj src/prngs/rc4.obj src/prngs/rng_get_bytes.obj \ -src/prngs/rng_make_prng.obj src/prngs/sober128.obj src/prngs/sprng.obj src/prngs/yarrow.obj +src/pk/rsa/rsa_make_key.obj src/pk/rsa/rsa_sign_hash.obj src/pk/rsa/rsa_verify_hash.obj src/prngs/fortuna.obj \ +src/prngs/rc4.obj src/prngs/rng_get_bytes.obj src/prngs/rng_make_prng.obj src/prngs/sober128.obj \ +src/prngs/sprng.obj src/prngs/yarrow.obj -HEADERS=src/headers/tommath_superclass.h src/headers/tomcrypt_cfg.h \ -src/headers/tomcrypt_mac.h src/headers/tomcrypt_macros.h \ -src/headers/tomcrypt_custom.h src/headers/tomcrypt_argchk.h \ -src/headers/tomcrypt_cipher.h src/headers/tomcrypt_pk.h \ -src/headers/tommath_class.h src/headers/ltc_tommath.h src/headers/tomcrypt_hash.h \ -src/headers/tomcrypt_misc.h src/headers/tomcrypt.h src/headers/tomcrypt_pkcs.h \ -src/headers/tomcrypt_prng.h testprof/tomcrypt_test.h +HEADERS=src/headers/tommath_superclass.h src/headers/tomcrypt_cfg.h src/headers/tomcrypt_mac.h \ +src/headers/tomcrypt_macros.h src/headers/tomcrypt_custom.h src/headers/tomcrypt_argchk.h \ +src/headers/tomcrypt_cipher.h src/headers/tomcrypt_pk.h src/headers/tommath_class.h \ +src/headers/ltc_tommath.h src/headers/tomcrypt_hash.h src/headers/tomcrypt_misc.h \ +src/headers/tomcrypt.h src/headers/tomcrypt_pkcs.h src/headers/tomcrypt_prng.h testprof/tomcrypt_test.h #ciphers come in two flavours... enc+dec and enc src/ciphers/aes/aes_enc.obj: src/ciphers/aes/aes.c src/ciphers/aes/aes_tab.c @@ -102,3 +116,7 @@ test: demos/test.c library timing: demos/timing.c library cl $(CFLAGS) demos/timing.c testprof/tomcrypt_prof.lib tomcrypt.lib advapi32.lib + +# $Source: /cvs/libtom/libtomcrypt/makefile.msvc,v $ +# $Revision: 1.15 $ +# $Date: 2005/06/27 12:37:06 $ diff --git a/makefile.shared b/makefile.shared index 207ceea..62cc87b 100644 --- a/makefile.shared +++ b/makefile.shared @@ -6,7 +6,7 @@ # Tom St Denis # The version -VERSION=0:102 +VERSION=0:105 # Compiler and Linker Names CC=libtool --mode=compile gcc @@ -18,14 +18,18 @@ CFLAGS += -c -I./src/headers/ -Wall -Wsign-compare -W -Wshadow #CFLAGS += -Wsystem-headers -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wmissing-prototypes \ # -Wmissing-declarations -Wpointer-arith +ifndef IGNORE_SPEED + # optimize for SPEED -CFLAGS += -O3 -funroll-all-loops +CFLAGS += -O3 -funroll-loops # add -fomit-frame-pointer. hinders debugging! CFLAGS += -fomit-frame-pointer # optimize for SIZE -#CFLAGS += -Os +#CFLAGS += -Os -DLTC_SMALL_CODE + +endif # compile for DEBUGING (required for ccmalloc checking!!!) #CFLAGS += -g3 @@ -45,7 +49,6 @@ TV=tv_gen TEST=test TIMING=timing - #LIBPATH-The directory for libtomcrypt to be installed to. #INCPATH-The directory to install the header files for libtomcrypt. #DATAPATH-The directory to install the pdf docs. @@ -55,16 +58,27 @@ INCPATH=/usr/include DATAPATH=/usr/share/doc/libtomcrypt/pdf #Who do we install as? +ifdef INSTALL_USER +USER=$(INSTALL_USER) +else USER=root -GROUP=wheel +endif + +ifdef INSTALL_GROUP +GROUP=$(INSTALL_GROUP) +else +GROUP=wheel +endif #List of objects to compile. #Leave MPI built-in or force developer to link against libtommath? +ifndef IGNORE_MPI MPIOBJECT=src/misc/mpi/mpi.o - +else #If you don't want mpi.o then add this -#MPISHARED=$(LIBPATH)/libtommath.la +MPISHARED=$(LIBPATH)/libtommath.la +endif OBJECTS=src/ciphers/aes/aes_enc.o $(MPIOBJECT) src/ciphers/aes/aes.o src/ciphers/anubis.o \ src/ciphers/blowfish.o src/ciphers/cast5.o src/ciphers/des.o src/ciphers/khazad.o src/ciphers/noekeon.o \ @@ -115,29 +129,43 @@ src/modes/ctr/ctr_getiv.o src/modes/ctr/ctr_setiv.o src/modes/ctr/ctr_start.o \ src/modes/ecb/ecb_decrypt.o src/modes/ecb/ecb_done.o src/modes/ecb/ecb_encrypt.o \ src/modes/ecb/ecb_start.o src/modes/ofb/ofb_decrypt.o src/modes/ofb/ofb_done.o \ src/modes/ofb/ofb_encrypt.o src/modes/ofb/ofb_getiv.o src/modes/ofb/ofb_setiv.o \ -src/modes/ofb/ofb_start.o src/pk/asn1/der/der_decode_integer.o src/pk/asn1/der/der_encode_integer.o \ -src/pk/asn1/der/der_get_multi_integer.o src/pk/asn1/der/der_length_integer.o \ -src/pk/asn1/der/der_put_multi_integer.o src/pk/dh/dh.o src/pk/dsa/dsa_export.o src/pk/dsa/dsa_free.o \ -src/pk/dsa/dsa_import.o src/pk/dsa/dsa_make_key.o src/pk/dsa/dsa_sign_hash.o \ -src/pk/dsa/dsa_verify_hash.o src/pk/dsa/dsa_verify_key.o src/pk/ecc/ecc.o src/pk/packet_store_header.o \ -src/pk/packet_valid_header.o src/pk/pkcs1/pkcs_1_i2osp.o src/pk/pkcs1/pkcs_1_mgf1.o \ -src/pk/pkcs1/pkcs_1_oaep_decode.o src/pk/pkcs1/pkcs_1_oaep_encode.o src/pk/pkcs1/pkcs_1_os2ip.o \ -src/pk/pkcs1/pkcs_1_pss_decode.o src/pk/pkcs1/pkcs_1_pss_encode.o src/pk/pkcs1/pkcs_1_v15_es_decode.o \ -src/pk/pkcs1/pkcs_1_v15_es_encode.o src/pk/pkcs1/pkcs_1_v15_sa_decode.o \ -src/pk/pkcs1/pkcs_1_v15_sa_encode.o src/pk/rsa/rsa_decrypt_key.o src/pk/rsa/rsa_encrypt_key.o \ +src/modes/ofb/ofb_start.o src/pk/asn1/der/bit/der_decode_bit_string.o \ +src/pk/asn1/der/bit/der_encode_bit_string.o src/pk/asn1/der/bit/der_length_bit_string.o \ +src/pk/asn1/der/choice/der_decode_choice.o src/pk/asn1/der/ia5/der_decode_ia5_string.o \ +src/pk/asn1/der/ia5/der_encode_ia5_string.o src/pk/asn1/der/ia5/der_length_ia5_string.o \ +src/pk/asn1/der/integer/der_decode_integer.o src/pk/asn1/der/integer/der_encode_integer.o \ +src/pk/asn1/der/integer/der_length_integer.o \ +src/pk/asn1/der/object_identifier/der_decode_object_identifier.o \ +src/pk/asn1/der/object_identifier/der_encode_object_identifier.o \ +src/pk/asn1/der/object_identifier/der_length_object_identifier.o \ +src/pk/asn1/der/octet/der_decode_octet_string.o src/pk/asn1/der/octet/der_encode_octet_string.o \ +src/pk/asn1/der/octet/der_length_octet_string.o \ +src/pk/asn1/der/printable_string/der_decode_printable_string.o \ +src/pk/asn1/der/printable_string/der_encode_printable_string.o \ +src/pk/asn1/der/printable_string/der_length_printable_string.o \ +src/pk/asn1/der/sequence/der_decode_sequence.o src/pk/asn1/der/sequence/der_decode_sequence_multi.o \ +src/pk/asn1/der/sequence/der_encode_sequence.o src/pk/asn1/der/sequence/der_encode_sequence_multi.o \ +src/pk/asn1/der/sequence/der_length_sequence.o \ +src/pk/asn1/der/short_integer/der_decode_short_integer.o \ +src/pk/asn1/der/short_integer/der_encode_short_integer.o \ +src/pk/asn1/der/short_integer/der_length_short_integer.o src/pk/asn1/der/utctime/der_decode_utctime.o \ +src/pk/asn1/der/utctime/der_encode_utctime.o src/pk/asn1/der/utctime/der_length_utctime.o \ +src/pk/dh/dh.o src/pk/dsa/dsa_export.o src/pk/dsa/dsa_free.o src/pk/dsa/dsa_import.o \ +src/pk/dsa/dsa_make_key.o src/pk/dsa/dsa_sign_hash.o src/pk/dsa/dsa_verify_hash.o \ +src/pk/dsa/dsa_verify_key.o src/pk/ecc/ecc.o src/pk/packet_store_header.o src/pk/packet_valid_header.o \ +src/pk/pkcs1/pkcs_1_i2osp.o src/pk/pkcs1/pkcs_1_mgf1.o src/pk/pkcs1/pkcs_1_oaep_decode.o \ +src/pk/pkcs1/pkcs_1_oaep_encode.o src/pk/pkcs1/pkcs_1_os2ip.o src/pk/pkcs1/pkcs_1_pss_decode.o \ +src/pk/pkcs1/pkcs_1_pss_encode.o src/pk/rsa/rsa_decrypt_key.o src/pk/rsa/rsa_encrypt_key.o \ src/pk/rsa/rsa_export.o src/pk/rsa/rsa_exptmod.o src/pk/rsa/rsa_free.o src/pk/rsa/rsa_import.o \ -src/pk/rsa/rsa_make_key.o src/pk/rsa/rsa_sign_hash.o src/pk/rsa/rsa_v15_decrypt_key.o \ -src/pk/rsa/rsa_v15_encrypt_key.o src/pk/rsa/rsa_v15_sign_hash.o src/pk/rsa/rsa_v15_verify_hash.o \ -src/pk/rsa/rsa_verify_hash.o src/prngs/fortuna.o src/prngs/rc4.o src/prngs/rng_get_bytes.o \ -src/prngs/rng_make_prng.o src/prngs/sober128.o src/prngs/sprng.o src/prngs/yarrow.o +src/pk/rsa/rsa_make_key.o src/pk/rsa/rsa_sign_hash.o src/pk/rsa/rsa_verify_hash.o src/prngs/fortuna.o \ +src/prngs/rc4.o src/prngs/rng_get_bytes.o src/prngs/rng_make_prng.o src/prngs/sober128.o \ +src/prngs/sprng.o src/prngs/yarrow.o -HEADERS=src/headers/tommath_superclass.h src/headers/tomcrypt_cfg.h \ -src/headers/tomcrypt_mac.h src/headers/tomcrypt_macros.h \ -src/headers/tomcrypt_custom.h src/headers/tomcrypt_argchk.h \ -src/headers/tomcrypt_cipher.h src/headers/tomcrypt_pk.h \ -src/headers/tommath_class.h src/headers/ltc_tommath.h src/headers/tomcrypt_hash.h \ -src/headers/tomcrypt_misc.h src/headers/tomcrypt.h src/headers/tomcrypt_pkcs.h \ -src/headers/tomcrypt_prng.h testprof/tomcrypt_test.h +HEADERS=src/headers/tommath_superclass.h src/headers/tomcrypt_cfg.h src/headers/tomcrypt_mac.h \ +src/headers/tomcrypt_macros.h src/headers/tomcrypt_custom.h src/headers/tomcrypt_argchk.h \ +src/headers/tomcrypt_cipher.h src/headers/tomcrypt_pk.h src/headers/tommath_class.h \ +src/headers/ltc_tommath.h src/headers/tomcrypt_hash.h src/headers/tomcrypt_misc.h \ +src/headers/tomcrypt.h src/headers/tomcrypt_pkcs.h src/headers/tomcrypt_prng.h testprof/tomcrypt_test.h TESTOBJECTS=demos/test.o HASHOBJECTS=demos/hashsum.o @@ -164,7 +192,7 @@ src/hashes/sha2/sha512.o: src/hashes/sha2/sha512.c src/hashes/sha2/sha384.c src/hashes/sha2/sha256.o: src/hashes/sha2/sha256.c src/hashes/sha2/sha224.c #This rule makes the libtomcrypt library. -library: $(LIBTEST) $(LIBNAME) +library: $(LIBNAME) $(LIBTEST): cd testprof ; CFLAGS="$(CFLAGS)" GROUP=$(GROUP) USER=$(USER) VERSION=$(VERSION) LIBPATH=$(LIBPATH) LIBNAME=$(LIBTEST) make -f makefile.shared @@ -180,19 +208,22 @@ $(LIBNAME): $(OBJECTS) #This rule makes the hash program included with libtomcrypt hashsum: library gcc $(CFLAGS) demos/hashsum.c -o hashsum.o - gcc -o hashsum hashsum.o -ltomcrypt_prof -ltomcrypt $(MPISHARED) + gcc -o hashsum hashsum.o -ltomcrypt $(MPISHARED) #makes the crypt program crypt: library gcc $(CFLAGS) demos/encrypt.c -o encrypt.o - gcc -o crypt encrypt.o -ltomcrypt_prof -ltomcrypt $(MPISHARED) + gcc -o crypt encrypt.o -ltomcrypt $(MPISHARED) tv_gen: library $(TVS) - gcc -o tv_gen $(TVS) -ltomcrypt_prof -ltomcrypt $(MPISHARED) + gcc -o tv_gen $(TVS) -ltomcrypt $(MPISHARED) -test: library $(TESTS) +test: library $(LIBTEST) $(TESTS) gcc -o $(TEST) $(TESTS) -ltomcrypt_prof -ltomcrypt $(MPISHARED) -timing: library $(TIMINGS) +timing: library $(LIBTEST) $(TIMINGS) gcc -o $(TIMING) $(TIMINGS) -ltomcrypt_prof -ltomcrypt $(MPISHARED) +# $Source: /cvs/libtom/libtomcrypt/makefile.shared,v $ +# $Revision: 1.19 $ +# $Date: 2005/06/27 12:37:06 $ diff --git a/mess.sh b/mess.sh new file mode 100644 index 0000000..bf639ce --- /dev/null +++ b/mess.sh @@ -0,0 +1,4 @@ +#!/bin/bash +if cvs log $1 >/dev/null 2>/dev/null; then exit 0; else echo "$1 shouldn't be here" ; exit 1; fi + + diff --git a/notes/etc/saferp_optimizer.c b/notes/etc/saferp_optimizer.c index 664661a..32de878 100644 --- a/notes/etc/saferp_optimizer.c +++ b/notes/etc/saferp_optimizer.c @@ -171,3 +171,7 @@ printf(" }\n}\n\n"); return 0; } + +/* $Source: /cvs/libtom/libtomcrypt/notes/etc/saferp_optimizer.c,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/notes/etc/whirlgen.c b/notes/etc/whirlgen.c index 2880d3f..c06687e 100644 --- a/notes/etc/whirlgen.c +++ b/notes/etc/whirlgen.c @@ -89,3 +89,7 @@ int main(void) } + +/* $Source: /cvs/libtom/libtomcrypt/notes/etc/whirlgen.c,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/notes/etc/whirltest.c b/notes/etc/whirltest.c index 9184f77..226e012 100644 --- a/notes/etc/whirltest.c +++ b/notes/etc/whirltest.c @@ -13,3 +13,7 @@ int main(void) } } + +/* $Source: /cvs/libtom/libtomcrypt/notes/etc/whirltest.c,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/notes/tech0005.txt b/notes/tech0005.txt new file mode 100644 index 0000000..8f393d5 --- /dev/null +++ b/notes/tech0005.txt @@ -0,0 +1,18 @@ +Tech Note 0005 +Minimizing Code Space +Tom St Denis + +Introduction +------------ + +Tweaking... + +You can disable whole classes of algorithms on the command line with the LTC_NO_* defines. From there you can manually turn on what you want to enable. + +The following build with GCC 3.4.3 on an AMD64 box gets you AES, CTR mode, SHA-256, HMAC, Yarrow, full RSA PKCS #1, PKCS #5, ASN.1 DER and MPI in +roughly 80KB of code. + +CFLAGS="-DSC_RSA_1 -DLTC_NO_CIPHERS -DLTC_NO_HASHES -DLTC_NO_PRNGS -DLTC_NO_MACS -DLTC_NO_MODES -DLTC_NO_PK -DRIJNDAEL -DCTR -DSHA256 \ +-DHMAC -DYARROW -DMRSA -DMPI -Os -fomit-frame-pointer" make IGNORE_SPEED=1 + +Neato eh? diff --git a/notes/tech0006.txt b/notes/tech0006.txt new file mode 100644 index 0000000..ecbe8b0 --- /dev/null +++ b/notes/tech0006.txt @@ -0,0 +1,91 @@ +Tech Note 0006 +PK Standards Compliance +Tom St Denis + +RSA +---- + +PKCS #1 compliance. + +Key Format: RSAPublicKey and RSAPrivateKey as per PKCS #1 v2.1 +Encryption: OAEP as per PKCS #1 +Signature : PSS as per PKCS #1 + +DSA +---- + +The NIST DSA algorithm + +Key Format: HomeBrew [see below] +Signature : ANSI X9.62 format [see below]. + +Keys are stored as + +DSAPublicKey ::= SEQUENCE { + publicFlags BIT STRING(1), -- must be 0 + g INTEGER , -- base generator, check that g^q mod p == 1 + -- and that 1 < g < p - 1 + p INTEGER , -- prime modulus + q INTEGER , -- order of sub-group (must be prime) + y INTEGER , -- public key, specifically, g^x mod p, + -- check that y^q mod p == 1 + -- and that 1 < y < p - 1 +} + +DSAPrivateKey ::= SEQUENCE { + publicFlags BIT STRING(1), -- must be 1 + g INTEGER , -- base generator, check that g^q mod p == 1 + -- and that 1 < g < p - 1 + p INTEGER , -- prime modulus + q INTEGER , -- order of sub-group (must be prime) + y INTEGER , -- public key, specifically, g^x mod p, + -- check that y^q mod p == 1 + -- and that 1 < y < p - 1 + x INTEGER -- private key +} + +Signatures are stored as + +DSASignature ::= SEQUENCE { + r, s INTEGER -- signature parameters +} + +ECC +---- + +The ANSI X9.62 and X9.63 algorithms [partial]. Supports all NIST GF(p) curves. + +Key Format : Homebrew [see below, only GF(p) NIST curves supported] +Signature : X9.62 compliant +Encryption : Homebrew [based on X9.63, differs in that the public point is stored as an ECCPublicKey] +Shared Secret: X9.63 compliant + +ECCPublicKey ::= SEQUENCE { + flags BIT STRING(1), -- public/private flag (always zero), + keySize INTEGER, -- Curve size (in bits) divided by eight + -- and rounded down, e.g. 521 => 65 + pubkey.x INTEGER, -- The X co-ordinate of the public key point + pubkey.y INTEGER, -- The Y co-ordinate of the public key point +} + +ECCPrivateKey ::= SEQUENCE { + flags BIT STRING(1), -- public/private flag (always one), + keySize INTEGER, -- Curve size (in bits) divided by eight + -- and rounded down, e.g. 521 => 65 + pubkey.x INTEGER, -- The X co-ordinate of the public key point + pubkey.y INTEGER, -- The Y co-ordinate of the public key point + secret.k INTEGER, -- The secret key scalar +} + +The encryption works by finding the X9.63 shared secret and hashing it. The hash is then simply XOR'ed against the message [which must be at most the size +of the hash digest]. The format of the encrypted text is as follows + +ECCEncrypted ::= SEQUENCE { + hashOID OBJECT IDENTIFIER, -- The OID of the hash used + pubkey OCTET STRING , -- Encapsulation of a random ECCPublicKey + skey OCTET STRING -- The encrypted text (which the hash was XOR'ed against) +} + +% $Source: /cvs/libtom/libtomcrypt/notes/tech0006.txt,v $ +% $Revision: 1.2 $ +% $Date: 2005/06/18 02:26:27 $ diff --git a/parsenames.pl b/parsenames.pl index d6466c5..761f036 100644 --- a/parsenames.pl +++ b/parsenames.pl @@ -20,3 +20,7 @@ foreach my $obj (@a) { if ($ARGV[0] eq "HEADERS") { print "testprof/tomcrypt_test.h"; } print "\n\n"; + +# $Source: /cvs/libtom/libtomcrypt/parsenames.pl,v $ +# $Revision: 1.3 $ +# $Date: 2005/05/05 14:49:27 $ diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..b652110 --- /dev/null +++ b/run.sh @@ -0,0 +1,35 @@ +#!/bin/bash +bash build.sh " $1" "$2 -O2" "$3 IGNORE_SPEED=1" +if [ -a testok.txt ] && [ -f testok.txt ]; then + echo +else + echo + echo "Test failed" + exit 1 +fi + +rm -f testok.txt +bash build.sh " $1" "$2 -Os" " $3 IGNORE_SPEED=1 LTC_SMALL=1" +if [ -a testok.txt ] && [ -f testok.txt ]; then + echo +else + echo + echo "Test failed" + exit 1 +fi + +rm -f testok.txt +bash build.sh " $1" " $2" " $3" +if [ -a testok.txt ] && [ -f testok.txt ]; then + echo +else + echo + echo "Test failed" + exit 1 +fi + +exit 0 + +# $Source: /cvs/libtom/libtomcrypt/run.sh,v $ +# $Revision: 1.13 $ +# $Date: 2005/05/11 18:59:53 $ diff --git a/src/ciphers/aes/aes.c b/src/ciphers/aes/aes.c index e698efd..8c95215 100644 --- a/src/ciphers/aes/aes.c +++ b/src/ciphers/aes/aes.c @@ -127,7 +127,7 @@ int SETUP(const unsigned char *key, int keylen, int num_rounds, symmetric_key *s #endif LTC_ARGCHK(key != NULL); LTC_ARGCHK(skey != NULL); - + if (keylen != 16 && keylen != 24 && keylen != 32) { return CRYPT_INVALID_KEYSIZE; } @@ -747,3 +747,7 @@ int ECB_KS(int *keysize) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/aes/aes.c,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/aes/aes_tab.c b/src/ciphers/aes/aes_tab.c index 0ad1dfe..31d276e 100644 --- a/src/ciphers/aes/aes_tab.c +++ b/src/ciphers/aes/aes_tab.c @@ -1018,3 +1018,7 @@ static const ulong32 rcon[] = { 0x10000000UL, 0x20000000UL, 0x40000000UL, 0x80000000UL, 0x1B000000UL, 0x36000000UL, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ }; + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/aes/aes_tab.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/anubis.c b/src/ciphers/anubis.c index 7e2af60..511eac2 100644 --- a/src/ciphers/anubis.c +++ b/src/ciphers/anubis.c @@ -1548,3 +1548,7 @@ int anubis_keysize(int *keysize) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/anubis.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/blowfish.c b/src/ciphers/blowfish.c index 2f0385d..3502983 100644 --- a/src/ciphers/blowfish.c +++ b/src/ciphers/blowfish.c @@ -581,3 +581,7 @@ int blowfish_keysize(int *keysize) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/blowfish.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/cast5.c b/src/ciphers/cast5.c index 2b8e4a5..f4b045c 100644 --- a/src/ciphers/cast5.c +++ b/src/ciphers/cast5.c @@ -709,3 +709,7 @@ int cast5_keysize(int *keysize) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/cast5.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/des.c b/src/ciphers/des.c index d42c5fa..9c5b59b 100644 --- a/src/ciphers/des.c +++ b/src/ciphers/des.c @@ -1888,3 +1888,7 @@ int des3_keysize(int *keysize) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/des.c,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/khazad.c b/src/ciphers/khazad.c index 4626923..d07134c 100644 --- a/src/ciphers/khazad.c +++ b/src/ciphers/khazad.c @@ -845,3 +845,7 @@ int khazad_keysize(int *keysize) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/khazad.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/noekeon.c b/src/ciphers/noekeon.c index 194cdbe..e502dfe 100644 --- a/src/ciphers/noekeon.c +++ b/src/ciphers/noekeon.c @@ -290,3 +290,7 @@ int noekeon_keysize(int *keysize) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/noekeon.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/rc2.c b/src/ciphers/rc2.c index 6382941..e91f83a 100644 --- a/src/ciphers/rc2.c +++ b/src/ciphers/rc2.c @@ -348,3 +348,7 @@ int rc2_keysize(int *keysize) + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/rc2.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/rc5.c b/src/ciphers/rc5.c index 32f666f..9465ac8 100644 --- a/src/ciphers/rc5.c +++ b/src/ciphers/rc5.c @@ -308,3 +308,7 @@ int rc5_keysize(int *keysize) + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/rc5.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/rc6.c b/src/ciphers/rc6.c index 996c015..ae6f114 100644 --- a/src/ciphers/rc6.c +++ b/src/ciphers/rc6.c @@ -337,3 +337,7 @@ int rc6_keysize(int *keysize) #endif /*RC6*/ + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/rc6.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/safer/safer.c b/src/ciphers/safer/safer.c index e6e073a..bad00a0 100644 --- a/src/ciphers/safer/safer.c +++ b/src/ciphers/safer/safer.c @@ -481,3 +481,7 @@ int safer_sk128_test(void) + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/safer/safer.c,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/safer/safer_tab.c b/src/ciphers/safer/safer_tab.c index f63ba6c..47fbd1c 100644 --- a/src/ciphers/safer/safer_tab.c +++ b/src/ciphers/safer/safer_tab.c @@ -62,3 +62,7 @@ const unsigned char safer_lbox[256] = { #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/safer/safer_tab.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/safer/saferp.c b/src/ciphers/safer/saferp.c index 17112f4..6d0d589 100644 --- a/src/ciphers/safer/saferp.c +++ b/src/ciphers/safer/saferp.c @@ -549,3 +549,7 @@ int saferp_keysize(int *keysize) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/safer/saferp.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/skipjack.c b/src/ciphers/skipjack.c index e2431af..4cb3bf2 100644 --- a/src/ciphers/skipjack.c +++ b/src/ciphers/skipjack.c @@ -329,3 +329,7 @@ int skipjack_keysize(int *keysize) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/skipjack.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/twofish/twofish.c b/src/ciphers/twofish/twofish.c index 7dbe9b7..61aa950 100644 --- a/src/ciphers/twofish/twofish.c +++ b/src/ciphers/twofish/twofish.c @@ -576,7 +576,7 @@ void twofish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_k b = RORc(b ^ (t2 + t1 + k[3]), 1); t2 = g1_func(b, skey); - t1 = g_func(a, key) + t2; + t1 = g_func(a, skey) + t2; c = ROLc(c, 1) ^ (t1 + k[0]); d = RORc(d ^ (t2 + t1 + k[1]), 1); k -= 4; @@ -700,3 +700,7 @@ int twofish_keysize(int *keysize) + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/twofish/twofish.c,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/twofish/twofish_tab.c b/src/ciphers/twofish/twofish_tab.c index 0bffade..47d4717 100644 --- a/src/ciphers/twofish/twofish_tab.c +++ b/src/ciphers/twofish/twofish_tab.c @@ -490,3 +490,7 @@ static const ulong32 rs_tab7[256] = { #endif /* TWOFISH_ALL_TABLES */ #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/twofish/twofish_tab.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/ciphers/xtea.c b/src/ciphers/xtea.c index 98546df..a45a13a 100644 --- a/src/ciphers/xtea.c +++ b/src/ciphers/xtea.c @@ -201,3 +201,7 @@ int xtea_keysize(int *keysize) + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/xtea.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ccm/ccm_memory.c b/src/encauth/ccm/ccm_memory.c index 34a254d..48dc4b7 100644 --- a/src/encauth/ccm/ccm_memory.c +++ b/src/encauth/ccm/ccm_memory.c @@ -293,7 +293,6 @@ int ccm_memory(int cipher, #ifdef LTC_CLEAN_STACK zeromem(skey, sizeof(*skey)); - zeromem(B, sizeof(B)); zeromem(PAD, sizeof(PAD)); zeromem(CTRPAD, sizeof(CTRPAD)); #endif @@ -304,3 +303,7 @@ int ccm_memory(int cipher, } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ccm/ccm_memory.c,v $ */ +/* $Revision: 1.9 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ccm/ccm_test.c b/src/encauth/ccm/ccm_test.c index ee78523..c33502a 100644 --- a/src/encauth/ccm/ccm_test.c +++ b/src/encauth/ccm/ccm_test.c @@ -168,3 +168,7 @@ int ccm_test(void) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ccm/ccm_test.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/eax/eax_addheader.c b/src/encauth/eax/eax_addheader.c index 3004025..cfb325d 100644 --- a/src/encauth/eax/eax_addheader.c +++ b/src/encauth/eax/eax_addheader.c @@ -32,3 +32,7 @@ int eax_addheader(eax_state *eax, const unsigned char *header, } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/eax/eax_addheader.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/eax/eax_decrypt.c b/src/encauth/eax/eax_decrypt.c index 8711d2d..13e23cc 100644 --- a/src/encauth/eax/eax_decrypt.c +++ b/src/encauth/eax/eax_decrypt.c @@ -44,3 +44,7 @@ int eax_decrypt(eax_state *eax, const unsigned char *ct, unsigned char *pt, } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/eax/eax_decrypt.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/eax/eax_decrypt_verify_memory.c b/src/encauth/eax/eax_decrypt_verify_memory.c index 3fcab46..d6d72ab 100644 --- a/src/encauth/eax/eax_decrypt_verify_memory.c +++ b/src/encauth/eax/eax_decrypt_verify_memory.c @@ -102,3 +102,7 @@ LBL_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/eax/eax_decrypt_verify_memory.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/eax/eax_done.c b/src/encauth/eax/eax_done.c index 1d43651..10e2c23 100644 --- a/src/encauth/eax/eax_done.c +++ b/src/encauth/eax/eax_done.c @@ -88,3 +88,7 @@ LBL_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/eax/eax_done.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/eax/eax_encrypt.c b/src/encauth/eax/eax_encrypt.c index da23a8c..a646588 100644 --- a/src/encauth/eax/eax_encrypt.c +++ b/src/encauth/eax/eax_encrypt.c @@ -45,3 +45,7 @@ int eax_encrypt(eax_state *eax, const unsigned char *pt, unsigned char *ct, #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/eax/eax_encrypt.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/eax/eax_encrypt_authenticate_memory.c b/src/encauth/eax/eax_encrypt_authenticate_memory.c index 8a601cf..9760616 100644 --- a/src/encauth/eax/eax_encrypt_authenticate_memory.c +++ b/src/encauth/eax/eax_encrypt_authenticate_memory.c @@ -76,3 +76,7 @@ LBL_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/eax/eax_encrypt_authenticate_memory.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/eax/eax_init.c b/src/encauth/eax/eax_init.c index 5a20db0..942b25f 100644 --- a/src/encauth/eax/eax_init.c +++ b/src/encauth/eax/eax_init.c @@ -108,11 +108,9 @@ int eax_init(eax_state *eax, int cipher, /* note we don't finish the headeromac, this allows us to add more header later */ /* setup the CTR mode */ - if ((err = ctr_start(cipher, eax->N, key, keylen, 0, &eax->ctr)) != CRYPT_OK) { + if ((err = ctr_start(cipher, eax->N, key, keylen, 0, CTR_COUNTER_BIG_ENDIAN, &eax->ctr)) != CRYPT_OK) { goto LBL_ERR; } - /* use big-endian counter */ - eax->ctr.mode = 1; /* setup the OMAC for the ciphertext */ if ((err = omac_init(&eax->ctomac, cipher, key, keylen)) != CRYPT_OK) { @@ -140,3 +138,7 @@ LBL_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/eax/eax_init.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/eax/eax_test.c b/src/encauth/eax/eax_test.c index 777dea1..b08f5ab 100644 --- a/src/encauth/eax/eax_test.c +++ b/src/encauth/eax/eax_test.c @@ -276,3 +276,7 @@ int eax_test(void) } #endif /* EAX_MODE */ + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/eax/eax_test.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/gcm/gcm_add_aad.c b/src/encauth/gcm/gcm_add_aad.c index cdcc0d9..03cb279 100644 --- a/src/encauth/gcm/gcm_add_aad.c +++ b/src/encauth/gcm/gcm_add_aad.c @@ -27,8 +27,11 @@ int gcm_add_aad(gcm_state *gcm, const unsigned char *adata, unsigned long adatalen) { - unsigned long x, y; + unsigned long x; int err; +#ifdef LTC_FAST + unsigned long y; +#endif LTC_ARGCHK(gcm != NULL); if (adatalen > 0) { @@ -115,3 +118,7 @@ int gcm_add_aad(gcm_state *gcm, } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/gcm/gcm_add_aad.c,v $ */ +/* $Revision: 1.14 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/gcm/gcm_add_iv.c b/src/encauth/gcm/gcm_add_iv.c index 7faf4c0..107cf35 100644 --- a/src/encauth/gcm/gcm_add_iv.c +++ b/src/encauth/gcm/gcm_add_iv.c @@ -88,3 +88,7 @@ int gcm_add_iv(gcm_state *gcm, #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/gcm/gcm_add_iv.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/gcm/gcm_done.c b/src/encauth/gcm/gcm_done.c index 8b3a6dd..96ef7f3 100644 --- a/src/encauth/gcm/gcm_done.c +++ b/src/encauth/gcm/gcm_done.c @@ -75,3 +75,7 @@ int gcm_done(gcm_state *gcm, #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/gcm/gcm_done.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/gcm/gcm_gf_mult.c b/src/encauth/gcm/gcm_gf_mult.c index a870c91..06db22b 100644 --- a/src/encauth/gcm/gcm_gf_mult.c +++ b/src/encauth/gcm/gcm_gf_mult.c @@ -31,6 +31,7 @@ static void gcm_rightshift(unsigned char *a) static const unsigned char mask[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; static const unsigned char poly[] = { 0x00, 0xE1 }; + /** GCM GF multiplier (internal use only) @param a First value @@ -87,3 +88,7 @@ void gcm_mult_h(gcm_state *gcm, unsigned char *I) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/gcm/gcm_gf_mult.c,v $ */ +/* $Revision: 1.16 $ */ +/* $Date: 2005/05/21 14:33:42 $ */ diff --git a/src/encauth/gcm/gcm_init.c b/src/encauth/gcm/gcm_init.c index 35a5ab8..249b61d 100644 --- a/src/encauth/gcm/gcm_init.c +++ b/src/encauth/gcm/gcm_init.c @@ -17,6 +17,46 @@ #ifdef GCM_MODE +#ifdef GCM_TABLES + +/* this is x*2^128 mod p(x) ... the results are 16 bytes each stored in a packed format. Since only the + * lower 16 bits are not zero'ed I removed the upper 14 bytes */ +static const unsigned char gcm_shift_table[256*2] = { +0x00, 0x00, 0x01, 0xc2, 0x03, 0x84, 0x02, 0x46, 0x07, 0x08, 0x06, 0xca, 0x04, 0x8c, 0x05, 0x4e, +0x0e, 0x10, 0x0f, 0xd2, 0x0d, 0x94, 0x0c, 0x56, 0x09, 0x18, 0x08, 0xda, 0x0a, 0x9c, 0x0b, 0x5e, +0x1c, 0x20, 0x1d, 0xe2, 0x1f, 0xa4, 0x1e, 0x66, 0x1b, 0x28, 0x1a, 0xea, 0x18, 0xac, 0x19, 0x6e, +0x12, 0x30, 0x13, 0xf2, 0x11, 0xb4, 0x10, 0x76, 0x15, 0x38, 0x14, 0xfa, 0x16, 0xbc, 0x17, 0x7e, +0x38, 0x40, 0x39, 0x82, 0x3b, 0xc4, 0x3a, 0x06, 0x3f, 0x48, 0x3e, 0x8a, 0x3c, 0xcc, 0x3d, 0x0e, +0x36, 0x50, 0x37, 0x92, 0x35, 0xd4, 0x34, 0x16, 0x31, 0x58, 0x30, 0x9a, 0x32, 0xdc, 0x33, 0x1e, +0x24, 0x60, 0x25, 0xa2, 0x27, 0xe4, 0x26, 0x26, 0x23, 0x68, 0x22, 0xaa, 0x20, 0xec, 0x21, 0x2e, +0x2a, 0x70, 0x2b, 0xb2, 0x29, 0xf4, 0x28, 0x36, 0x2d, 0x78, 0x2c, 0xba, 0x2e, 0xfc, 0x2f, 0x3e, +0x70, 0x80, 0x71, 0x42, 0x73, 0x04, 0x72, 0xc6, 0x77, 0x88, 0x76, 0x4a, 0x74, 0x0c, 0x75, 0xce, +0x7e, 0x90, 0x7f, 0x52, 0x7d, 0x14, 0x7c, 0xd6, 0x79, 0x98, 0x78, 0x5a, 0x7a, 0x1c, 0x7b, 0xde, +0x6c, 0xa0, 0x6d, 0x62, 0x6f, 0x24, 0x6e, 0xe6, 0x6b, 0xa8, 0x6a, 0x6a, 0x68, 0x2c, 0x69, 0xee, +0x62, 0xb0, 0x63, 0x72, 0x61, 0x34, 0x60, 0xf6, 0x65, 0xb8, 0x64, 0x7a, 0x66, 0x3c, 0x67, 0xfe, +0x48, 0xc0, 0x49, 0x02, 0x4b, 0x44, 0x4a, 0x86, 0x4f, 0xc8, 0x4e, 0x0a, 0x4c, 0x4c, 0x4d, 0x8e, +0x46, 0xd0, 0x47, 0x12, 0x45, 0x54, 0x44, 0x96, 0x41, 0xd8, 0x40, 0x1a, 0x42, 0x5c, 0x43, 0x9e, +0x54, 0xe0, 0x55, 0x22, 0x57, 0x64, 0x56, 0xa6, 0x53, 0xe8, 0x52, 0x2a, 0x50, 0x6c, 0x51, 0xae, +0x5a, 0xf0, 0x5b, 0x32, 0x59, 0x74, 0x58, 0xb6, 0x5d, 0xf8, 0x5c, 0x3a, 0x5e, 0x7c, 0x5f, 0xbe, +0xe1, 0x00, 0xe0, 0xc2, 0xe2, 0x84, 0xe3, 0x46, 0xe6, 0x08, 0xe7, 0xca, 0xe5, 0x8c, 0xe4, 0x4e, +0xef, 0x10, 0xee, 0xd2, 0xec, 0x94, 0xed, 0x56, 0xe8, 0x18, 0xe9, 0xda, 0xeb, 0x9c, 0xea, 0x5e, +0xfd, 0x20, 0xfc, 0xe2, 0xfe, 0xa4, 0xff, 0x66, 0xfa, 0x28, 0xfb, 0xea, 0xf9, 0xac, 0xf8, 0x6e, +0xf3, 0x30, 0xf2, 0xf2, 0xf0, 0xb4, 0xf1, 0x76, 0xf4, 0x38, 0xf5, 0xfa, 0xf7, 0xbc, 0xf6, 0x7e, +0xd9, 0x40, 0xd8, 0x82, 0xda, 0xc4, 0xdb, 0x06, 0xde, 0x48, 0xdf, 0x8a, 0xdd, 0xcc, 0xdc, 0x0e, +0xd7, 0x50, 0xd6, 0x92, 0xd4, 0xd4, 0xd5, 0x16, 0xd0, 0x58, 0xd1, 0x9a, 0xd3, 0xdc, 0xd2, 0x1e, +0xc5, 0x60, 0xc4, 0xa2, 0xc6, 0xe4, 0xc7, 0x26, 0xc2, 0x68, 0xc3, 0xaa, 0xc1, 0xec, 0xc0, 0x2e, +0xcb, 0x70, 0xca, 0xb2, 0xc8, 0xf4, 0xc9, 0x36, 0xcc, 0x78, 0xcd, 0xba, 0xcf, 0xfc, 0xce, 0x3e, +0x91, 0x80, 0x90, 0x42, 0x92, 0x04, 0x93, 0xc6, 0x96, 0x88, 0x97, 0x4a, 0x95, 0x0c, 0x94, 0xce, +0x9f, 0x90, 0x9e, 0x52, 0x9c, 0x14, 0x9d, 0xd6, 0x98, 0x98, 0x99, 0x5a, 0x9b, 0x1c, 0x9a, 0xde, +0x8d, 0xa0, 0x8c, 0x62, 0x8e, 0x24, 0x8f, 0xe6, 0x8a, 0xa8, 0x8b, 0x6a, 0x89, 0x2c, 0x88, 0xee, +0x83, 0xb0, 0x82, 0x72, 0x80, 0x34, 0x81, 0xf6, 0x84, 0xb8, 0x85, 0x7a, 0x87, 0x3c, 0x86, 0xfe, +0xa9, 0xc0, 0xa8, 0x02, 0xaa, 0x44, 0xab, 0x86, 0xae, 0xc8, 0xaf, 0x0a, 0xad, 0x4c, 0xac, 0x8e, +0xa7, 0xd0, 0xa6, 0x12, 0xa4, 0x54, 0xa5, 0x96, 0xa0, 0xd8, 0xa1, 0x1a, 0xa3, 0x5c, 0xa2, 0x9e, +0xb5, 0xe0, 0xb4, 0x22, 0xb6, 0x64, 0xb7, 0xa6, 0xb2, 0xe8, 0xb3, 0x2a, 0xb1, 0x6c, 0xb0, 0xae, +0xbb, 0xf0, 0xba, 0x32, 0xb8, 0x74, 0xb9, 0xb6, 0xbc, 0xf8, 0xbd, 0x3a, 0xbf, 0x7c, 0xbe, 0xbe }; + +#endif + /** Initialize a GCM state @param gcm The GCM state to initialize @@ -31,7 +71,7 @@ int gcm_init(gcm_state *gcm, int cipher, int err; unsigned char B[16]; #ifdef GCM_TABLES - int x, y; + int x, y, z, t; #endif LTC_ARGCHK(gcm != NULL); @@ -72,17 +112,34 @@ int gcm_init(gcm_state *gcm, int cipher, #ifdef GCM_TABLES /* setup tables */ + + /* generate the first table as it has no shifting (from which we make the other tables) */ zeromem(B, 16); - for (x = 0; x < 16; x++) { - for (y = 0; y < 256; y++) { - B[x] = y; - gcm_gf_mult(gcm->H, B, &gcm->PC[x][y][0]); - } - B[x] = 0; + for (y = 0; y < 256; y++) { + B[0] = y; + gcm_gf_mult(gcm->H, B, &gcm->PC[0][y][0]); } + + /* now generate the rest of the tables based the previous table */ + for (x = 1; x < 16; x++) { + for (y = 0; y < 256; y++) { + /* now shift it right by 8 bits */ + t = gcm->PC[x-1][y][15]; + for (z = 15; z > 0; z--) { + gcm->PC[x][y][z] = gcm->PC[x-1][y][z-1]; + } + gcm->PC[x][y][0] = gcm_shift_table[t<<1]; + gcm->PC[x][y][1] ^= gcm_shift_table[(t<<1)+1]; + } + } + #endif return CRYPT_OK; } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/gcm/gcm_init.c,v $ */ +/* $Revision: 1.15 $ */ +/* $Date: 2005/05/21 15:05:19 $ */ diff --git a/src/encauth/gcm/gcm_memory.c b/src/encauth/gcm/gcm_memory.c index e062413..ee10d3f 100644 --- a/src/encauth/gcm/gcm_memory.c +++ b/src/encauth/gcm/gcm_memory.c @@ -87,3 +87,7 @@ LTC_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/gcm/gcm_memory.c,v $ */ +/* $Revision: 1.19 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/gcm/gcm_process.c b/src/encauth/gcm/gcm_process.c index 577967b..f512e28 100644 --- a/src/encauth/gcm/gcm_process.c +++ b/src/encauth/gcm/gcm_process.c @@ -141,3 +141,7 @@ int gcm_process(gcm_state *gcm, #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/gcm/gcm_process.c,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/gcm/gcm_reset.c b/src/encauth/gcm/gcm_reset.c index e73bf66..b336a92 100644 --- a/src/encauth/gcm/gcm_reset.c +++ b/src/encauth/gcm/gcm_reset.c @@ -38,3 +38,7 @@ int gcm_reset(gcm_state *gcm) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/gcm/gcm_reset.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/gcm/gcm_test.c b/src/encauth/gcm/gcm_test.c index bc6ad7e..7106188 100644 --- a/src/encauth/gcm/gcm_test.c +++ b/src/encauth/gcm/gcm_test.c @@ -281,7 +281,6 @@ int gcm_test(void) }; int idx, err; unsigned long x, y; - gcm_state gcm; unsigned char out[2][64], T[2][16]; /* find aes */ @@ -363,3 +362,7 @@ int gcm_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/gcm/gcm_test.c,v $ */ +/* $Revision: 1.15 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ocb/ocb_decrypt.c b/src/encauth/ocb/ocb_decrypt.c index d3bf480..a0f2754 100644 --- a/src/encauth/ocb/ocb_decrypt.c +++ b/src/encauth/ocb/ocb_decrypt.c @@ -71,3 +71,7 @@ int ocb_decrypt(ocb_state *ocb, const unsigned char *ct, unsigned char *pt) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_decrypt.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ocb/ocb_decrypt_verify_memory.c b/src/encauth/ocb/ocb_decrypt_verify_memory.c index 378a8af..0173eff 100644 --- a/src/encauth/ocb/ocb_decrypt_verify_memory.c +++ b/src/encauth/ocb/ocb_decrypt_verify_memory.c @@ -80,3 +80,7 @@ LBL_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_decrypt_verify_memory.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ocb/ocb_done_decrypt.c b/src/encauth/ocb/ocb_done_decrypt.c index 9f8b1b9..fb149bd 100644 --- a/src/encauth/ocb/ocb_done_decrypt.c +++ b/src/encauth/ocb/ocb_done_decrypt.c @@ -74,3 +74,7 @@ LBL_ERR: #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_done_decrypt.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ocb/ocb_done_encrypt.c b/src/encauth/ocb/ocb_done_encrypt.c index 1a07569..27126e7 100644 --- a/src/encauth/ocb/ocb_done_encrypt.c +++ b/src/encauth/ocb/ocb_done_encrypt.c @@ -40,3 +40,7 @@ int ocb_done_encrypt(ocb_state *ocb, const unsigned char *pt, unsigned long ptle #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_done_encrypt.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ocb/ocb_encrypt.c b/src/encauth/ocb/ocb_encrypt.c index ba39c60..2a48551 100644 --- a/src/encauth/ocb/ocb_encrypt.c +++ b/src/encauth/ocb/ocb_encrypt.c @@ -64,3 +64,7 @@ int ocb_encrypt(ocb_state *ocb, const unsigned char *pt, unsigned char *ct) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_encrypt.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ocb/ocb_encrypt_authenticate_memory.c b/src/encauth/ocb/ocb_encrypt_authenticate_memory.c index bcc9cfb..beb72c8 100644 --- a/src/encauth/ocb/ocb_encrypt_authenticate_memory.c +++ b/src/encauth/ocb/ocb_encrypt_authenticate_memory.c @@ -78,3 +78,7 @@ LBL_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_encrypt_authenticate_memory.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ocb/ocb_init.c b/src/encauth/ocb/ocb_init.c index 57e04af..9266d5c 100644 --- a/src/encauth/ocb/ocb_init.c +++ b/src/encauth/ocb/ocb_init.c @@ -127,3 +127,7 @@ int ocb_init(ocb_state *ocb, int cipher, } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_init.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ocb/ocb_ntz.c b/src/encauth/ocb/ocb_ntz.c index 4ffe7e8..9b83c53 100644 --- a/src/encauth/ocb/ocb_ntz.c +++ b/src/encauth/ocb/ocb_ntz.c @@ -36,3 +36,7 @@ int ocb_ntz(unsigned long x) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_ntz.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ocb/ocb_shift_xor.c b/src/encauth/ocb/ocb_shift_xor.c index b63b022..b03de4b 100644 --- a/src/encauth/ocb/ocb_shift_xor.c +++ b/src/encauth/ocb/ocb_shift_xor.c @@ -33,3 +33,7 @@ void ocb_shift_xor(ocb_state *ocb, unsigned char *Z) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_shift_xor.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ocb/ocb_test.c b/src/encauth/ocb/ocb_test.c index d6cb14b..7a7fc77 100644 --- a/src/encauth/ocb/ocb_test.c +++ b/src/encauth/ocb/ocb_test.c @@ -231,3 +231,7 @@ int ocb_test(void) -- hard to stream [you can't emit ciphertext until full block] -- The setup is somewhat complicated... */ + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_test.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/encauth/ocb/s_ocb_done.c b/src/encauth/ocb/s_ocb_done.c index 6f6e63d..7399b54 100644 --- a/src/encauth/ocb/s_ocb_done.c +++ b/src/encauth/ocb/s_ocb_done.c @@ -138,3 +138,7 @@ int s_ocb_done(ocb_state *ocb, const unsigned char *pt, unsigned long ptlen, #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/s_ocb_done.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/hashes/chc/chc.c b/src/hashes/chc/chc.c index 67dd090..4ff39f0 100644 --- a/src/hashes/chc/chc.c +++ b/src/hashes/chc/chc.c @@ -291,3 +291,7 @@ int chc_test(void) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/chc/chc.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/hashes/helper/hash_file.c b/src/hashes/helper/hash_file.c index 78c290a..50f726a 100644 --- a/src/hashes/helper/hash_file.c +++ b/src/hashes/helper/hash_file.c @@ -51,3 +51,7 @@ int hash_file(int hash, const char *fname, unsigned char *out, unsigned long *ou #endif } + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/helper/hash_file.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/hashes/helper/hash_filehandle.c b/src/hashes/helper/hash_filehandle.c index c02c5a7..201ef83 100644 --- a/src/hashes/helper/hash_filehandle.c +++ b/src/hashes/helper/hash_filehandle.c @@ -64,3 +64,7 @@ int hash_filehandle(int hash, FILE *in, unsigned char *out, unsigned long *outle #endif } + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/helper/hash_filehandle.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/hashes/helper/hash_memory.c b/src/hashes/helper/hash_memory.c index 9786948..7e849b4 100644 --- a/src/hashes/helper/hash_memory.c +++ b/src/hashes/helper/hash_memory.c @@ -62,3 +62,7 @@ LBL_ERR: return err; } + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/helper/hash_memory.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/hashes/helper/hash_memory_multi.c b/src/hashes/helper/hash_memory_multi.c index ce22283..8fcb8e9 100644 --- a/src/hashes/helper/hash_memory_multi.c +++ b/src/hashes/helper/hash_memory_multi.c @@ -80,3 +80,7 @@ LBL_ERR: va_end(args); return err; } + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/helper/hash_memory_multi.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/hashes/md2.c b/src/hashes/md2.c index 5381771..db60fbd 100644 --- a/src/hashes/md2.c +++ b/src/hashes/md2.c @@ -24,11 +24,9 @@ const struct ltc_hash_descriptor md2_desc = 16, 16, - /* DER encoding */ - { 0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x02, 0x05, 0x00, - 0x04, 0x10 }, - 18, + /* OID */ + { 1, 2, 840, 113549, 2, 2, }, + 6, &md2_init, &md2_process, @@ -246,3 +244,7 @@ int md2_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/md2.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/23 02:42:07 $ */ diff --git a/src/hashes/md4.c b/src/hashes/md4.c index 477f5b0..17ef35e 100644 --- a/src/hashes/md4.c +++ b/src/hashes/md4.c @@ -24,9 +24,9 @@ const struct ltc_hash_descriptor md4_desc = 16, 64, - /* DER encoding (not yet supported) */ - { 0x00 }, - 0, + /* OID */ + { 1, 2, 840, 113549, 2, 4, }, + 6, &md4_init, &md4_process, @@ -300,3 +300,7 @@ int md4_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/md4.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/23 02:42:07 $ */ diff --git a/src/hashes/md5.c b/src/hashes/md5.c index e2e5c74..fb8ff31 100644 --- a/src/hashes/md5.c +++ b/src/hashes/md5.c @@ -25,11 +25,9 @@ const struct ltc_hash_descriptor md5_desc = 16, 64, - /* DER identifier */ - { 0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05, 0x05, 0x00, - 0x04, 0x10 }, - 18, + /* OID */ + { 1, 2, 840, 113549, 2, 5, }, + 6, &md5_init, &md5_process, @@ -363,3 +361,7 @@ int md5_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/md5.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/23 02:42:07 $ */ diff --git a/src/hashes/rmd128.c b/src/hashes/rmd128.c index 1c304a1..1c663e4 100644 --- a/src/hashes/rmd128.c +++ b/src/hashes/rmd128.c @@ -30,9 +30,9 @@ const struct ltc_hash_descriptor rmd128_desc = 16, 64, - /* DER identifier (not supported) */ - { 0x00 }, - 0, + /* OID */ + { 1, 0, 10118, 3, 0, 50 }, + 6, &rmd128_init, &rmd128_process, @@ -403,3 +403,7 @@ int rmd128_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/rmd128.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2005/05/23 02:42:07 $ */ diff --git a/src/hashes/rmd160.c b/src/hashes/rmd160.c index a617152..6124f59 100644 --- a/src/hashes/rmd160.c +++ b/src/hashes/rmd160.c @@ -30,10 +30,9 @@ const struct ltc_hash_descriptor rmd160_desc = 20, 64, - /* DER identifier */ - { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, - 0x03, 0x02, 0x01, 0x05, 0x00, 0x04, 0x14 }, - 15, + /* OID */ + { 1, 3, 36, 3, 2, 1, }, + 6, &rmd160_init, &rmd160_process, @@ -463,3 +462,7 @@ int rmd160_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/rmd160.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/23 02:42:07 $ */ diff --git a/src/hashes/sha1.c b/src/hashes/sha1.c index 267729b..a75d04d 100644 --- a/src/hashes/sha1.c +++ b/src/hashes/sha1.c @@ -25,10 +25,9 @@ const struct ltc_hash_descriptor sha1_desc = 20, 64, - /* DER identifier */ - { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, - 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04, 0x14 }, - 15, + /* OID */ + { 1, 3, 14, 3, 2, 26, }, + 6, &sha1_init, &sha1_process, @@ -282,3 +281,7 @@ int sha1_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/sha1.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/23 02:42:07 $ */ diff --git a/src/hashes/sha2/sha224.c b/src/hashes/sha2/sha224.c index 8c0dcde..bff2fdf 100644 --- a/src/hashes/sha2/sha224.c +++ b/src/hashes/sha2/sha224.c @@ -20,9 +20,9 @@ const struct ltc_hash_descriptor sha224_desc = 28, 64, - /* DER identifier (not supported) */ - { 0x00 }, - 0, + /* OID */ + { 2, 16, 840, 1, 101, 3, 4, 2, 4, }, + 9, &sha224_init, &sha256_process, @@ -118,3 +118,7 @@ int sha224_test(void) #endif } + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/sha2/sha224.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/23 02:42:07 $ */ diff --git a/src/hashes/sha2/sha256.c b/src/hashes/sha2/sha256.c index 85eba2a..c48c0f6 100644 --- a/src/hashes/sha2/sha256.c +++ b/src/hashes/sha2/sha256.c @@ -24,11 +24,9 @@ const struct ltc_hash_descriptor sha256_desc = 32, 64, - /* DER identifier */ - { 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, - 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, - 0x00, 0x04, 0x20 }, - 19, + /* OID */ + { 2, 16, 840, 1, 101, 3, 4, 2, 1, }, + 9, &sha256_init, &sha256_process, @@ -335,3 +333,7 @@ int sha256_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/sha2/sha256.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/23 02:42:07 $ */ diff --git a/src/hashes/sha2/sha384.c b/src/hashes/sha2/sha384.c index 912145c..43f8fb6 100644 --- a/src/hashes/sha2/sha384.c +++ b/src/hashes/sha2/sha384.c @@ -20,11 +20,9 @@ const struct ltc_hash_descriptor sha384_desc = 48, 128, - /* DER identifier */ - { 0x30, 0x41, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, - 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, - 0x00, 0x04, 0x30 }, - 19, + /* OID */ + { 2, 16, 840, 1, 101, 3, 4, 2, 2, }, + 9, &sha384_init, &sha512_process, @@ -130,3 +128,7 @@ int sha384_test(void) + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/sha2/sha384.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/23 02:42:07 $ */ diff --git a/src/hashes/sha2/sha512.c b/src/hashes/sha2/sha512.c index 3238f2b..7b6805b 100644 --- a/src/hashes/sha2/sha512.c +++ b/src/hashes/sha2/sha512.c @@ -24,11 +24,9 @@ const struct ltc_hash_descriptor sha512_desc = 64, 128, - /* DER identifier */ - { 0x30, 0x51, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, - 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, - 0x00, 0x04, 0x40 }, - 19, + /* OID */ + { 2, 16, 840, 1, 101, 3, 4, 2, 3, }, + 9, &sha512_init, &sha512_process, @@ -314,3 +312,7 @@ int sha512_test(void) + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/sha2/sha512.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/23 02:42:07 $ */ diff --git a/src/hashes/tiger.c b/src/hashes/tiger.c index a1cd888..250c186 100644 --- a/src/hashes/tiger.c +++ b/src/hashes/tiger.c @@ -25,11 +25,9 @@ const struct ltc_hash_descriptor tiger_desc = 24, 64, - /* DER identifier */ - { 0x30, 0x29, 0x30, 0x0D, 0x06, 0x09, 0x2B, 0x06, - 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0C, 0x02, 0x05, - 0x00, 0x04, 0x18 }, - 19, + /* OID */ + { 1, 3, 6, 1, 4, 1, 11591, 12, 2, }, + 9, &tiger_init, &tiger_process, @@ -809,3 +807,7 @@ Hash of "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-ABCDEFG + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/tiger.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/23 02:42:07 $ */ diff --git a/src/hashes/whirl/whirl.c b/src/hashes/whirl/whirl.c index ff0b436..1bd7983 100644 --- a/src/hashes/whirl/whirl.c +++ b/src/hashes/whirl/whirl.c @@ -25,9 +25,9 @@ const struct ltc_hash_descriptor whirlpool_desc = 64, 64, - /* DER encoding (not yet supported) */ - { 0x00 }, - 0, + /* OID */ + { 1, 0, 10118, 3, 0, 55 }, + 6, &whirlpool_init, &whirlpool_process, @@ -307,3 +307,7 @@ int whirlpool_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/whirl/whirl.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/23 02:42:07 $ */ diff --git a/src/hashes/whirl/whirltab.c b/src/hashes/whirl/whirltab.c index fb99bea..c83d0b2 100644 --- a/src/hashes/whirl/whirltab.c +++ b/src/hashes/whirl/whirltab.c @@ -577,3 +577,7 @@ CONST64(0xca2dbf07ad5a8333), CONST64(0x6302aa71c81949d9), }; + +/* $Source: /cvs/libtom/libtomcrypt/src/hashes/whirl/whirltab.c,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/headers/ltc_tommath.h b/src/headers/ltc_tommath.h index 05212e5..2d62b4e 100644 --- a/src/headers/ltc_tommath.h +++ b/src/headers/ltc_tommath.h @@ -575,3 +575,7 @@ extern const char *mp_s_rmap; #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/ltc_tommath.h,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/headers/tomcrypt.h b/src/headers/tomcrypt.h index 0d34c74..8369c74 100644 --- a/src/headers/tomcrypt.h +++ b/src/headers/tomcrypt.h @@ -16,8 +16,8 @@ extern "C" { #endif /* version */ -#define CRYPT 0x0102 -#define SCRYPT "1.02" +#define CRYPT 0x0105 +#define SCRYPT "1.05" /* max size of either a cipher/hash block or symmetric key [largest of the two] */ #define MAXBLOCKSIZE 128 @@ -79,3 +79,7 @@ enum { #endif /* TOMCRYPT_H_ */ + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt.h,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/06/19 18:03:25 $ */ diff --git a/src/headers/tomcrypt_argchk.h b/src/headers/tomcrypt_argchk.h index 5c8759d..ef344ee 100644 --- a/src/headers/tomcrypt_argchk.h +++ b/src/headers/tomcrypt_argchk.h @@ -19,3 +19,7 @@ void crypt_argchk(char *v, char *s, int d); #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_argchk.h,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/headers/tomcrypt_cfg.h b/src/headers/tomcrypt_cfg.h index a0022d1..1d5bc6c 100644 --- a/src/headers/tomcrypt_cfg.h +++ b/src/headers/tomcrypt_cfg.h @@ -106,3 +106,7 @@ int XMEMCMP(const void *s1, const void *s2, size_t n); #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_cfg.h,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/headers/tomcrypt_cipher.h b/src/headers/tomcrypt_cipher.h index af184c2..4f00302 100644 --- a/src/headers/tomcrypt_cipher.h +++ b/src/headers/tomcrypt_cipher.h @@ -32,7 +32,7 @@ struct saferp_key { #ifdef RIJNDAEL struct rijndael_key { - ulong32 eK[64], dK[64]; + ulong32 eK[60], dK[60]; int Nr; }; #endif @@ -599,8 +599,15 @@ int cbc_done(symmetric_CBC *cbc); #endif #ifdef CTR -int ctr_start(int cipher, const unsigned char *IV, const unsigned char *key, - int keylen, int num_rounds, symmetric_CTR *ctr); + +#define CTR_COUNTER_LITTLE_ENDIAN 0 +#define CTR_COUNTER_BIG_ENDIAN 1 + +int ctr_start( int cipher, + const unsigned char *IV, + const unsigned char *key, int keylen, + int num_rounds, int ctr_mode, + symmetric_CTR *ctr); int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr); int ctr_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CTR *ctr); int ctr_getiv(unsigned char *IV, unsigned long *len, symmetric_CTR *ctr); @@ -611,9 +618,12 @@ int ctr_done(symmetric_CTR *ctr); int find_cipher(const char *name); int find_cipher_any(const char *name, int blocklen, int keylen); int find_cipher_id(unsigned char ID); - int register_cipher(const struct ltc_cipher_descriptor *cipher); int unregister_cipher(const struct ltc_cipher_descriptor *cipher); - int cipher_is_valid(int idx); +LTC_MUTEX_PROTO(ltc_cipher_mutex); + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_cipher.h,v $ */ +/* $Revision: 1.16 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/headers/tomcrypt_custom.h b/src/headers/tomcrypt_custom.h index d786f0b..db90048 100644 --- a/src/headers/tomcrypt_custom.h +++ b/src/headers/tomcrypt_custom.h @@ -1,6 +1,3 @@ -/* This header is meant to be included before mycrypt.h in projects where - * you don't want to throw all the defines in a makefile. - */ #ifndef TOMCRYPT_CUSTOM_H_ #define TOMCRYPT_CUSTOM_H_ @@ -20,7 +17,9 @@ /* #define LTC_SMALL_CODE */ /* Enable self-test test vector checking */ -#define LTC_TEST +#ifndef LTC_NO_TEST + #define LTC_TEST +#endif /* clean the stack of functions which put private information on stack */ /* #define LTC_CLEAN_STACK */ @@ -38,6 +37,8 @@ /* #define LTC_NO_BSWAP */ /* ---> Symmetric Block Ciphers <--- */ +#ifndef LTC_NO_CIPHERS + #define BLOWFISH #define RC2 #define RC5 @@ -48,8 +49,12 @@ /* _TABLES tells it to use tables during setup, _SMALL means to use the smaller scheduled key format * (saves 4KB of ram), _ALL_TABLES enables all tables during setup */ #define TWOFISH -#define TWOFISH_TABLES -/* #define TWOFISH_ALL_TABLES */ +#ifndef LTC_NO_TABLES + #define TWOFISH_TABLES + /* #define TWOFISH_ALL_TABLES */ +#else + #define TWOFISH_SMALL +#endif /* #define TWOFISH_SMALL */ /* DES includes EDE triple-DES */ #define DES @@ -61,15 +66,23 @@ #define ANUBIS #define ANUBIS_TWEAK +#endif /* LTC_NO_CIPHERS */ + /* ---> Block Cipher Modes of Operation <--- */ +#ifndef LTC_NO_MODES + #define CFB #define OFB #define ECB #define CBC #define CTR +#endif /* LTC_NO_MODES */ + /* ---> One-Way Hash Functions <--- */ +#ifndef LTC_NO_HASHES + #define CHC_HASH #define WHIRLPOOL #define SHA512 @@ -84,7 +97,11 @@ #define RIPEMD128 #define RIPEMD160 +#endif /* LTC_NO_HASHES */ + /* ---> MAC functions <--- */ +#ifndef LTC_NO_MACS + #define HMAC #define OMAC #define PMAC @@ -95,6 +112,7 @@ #endif /* ---> Encrypt + Authenticate Modes <--- */ + #define EAX_MODE #if defined(EAX_MODE) && !(defined(CTR) && defined(OMAC)) #error EAX_MODE requires CTR and OMAC mode @@ -104,13 +122,20 @@ #define CCM_MODE #define GCM_MODE + /* Use 64KiB tables */ -#define GCM_TABLES +#ifndef LTC_NO_TABLES + #define GCM_TABLES +#endif + +#endif /* LTC_NO_MACS */ /* Various tidbits of modern neatoness */ #define BASE64 /* --> Pseudo Random Number Generators <--- */ +#ifndef LTC_NO_PRNGS + /* Yarrow */ #define YARROW /* which descriptor of AES to use? */ @@ -142,7 +167,11 @@ /* try /dev/urandom before trying /dev/random */ #define TRY_URANDOM_FIRST +#endif /* LTC_NO_PRNGS */ + /* ---> Public Key Crypto <--- */ +#ifndef LTC_NO_PK + #define MRSA /* Digital Signature Algorithm */ @@ -168,7 +197,6 @@ /* ECC */ #define MECC /* Supported Key Sizes */ -#define ECC160 #define ECC192 #define ECC224 #define ECC256 @@ -178,7 +206,11 @@ /* Include the MPI functionality? (required by the PK algorithms) */ #define MPI +#endif /* LTC_NO_PK */ + /* PKCS #1 (RSA) and #5 (Password Handling) stuff */ +#ifndef LTC_NO_PKCS + #define PKCS_1 #define PKCS_5 @@ -192,5 +224,33 @@ #error RSA/DSA requires ASN.1 DER functionality, make sure LTC_DER is enabled #endif +#endif /* LTC_NO_PKCS */ + #endif + +/* THREAD management */ + +#ifdef LTC_PTHREAD + +#include + +#define LTC_MUTEX_GLOBAL(x) pthread_mutex_t x = PTHREAD_MUTEX_INITIALIZER; +#define LTC_MUTEX_PROTO(x) extern pthread_mutex_t x; +#define LTC_MUTEX_LOCK(x) pthread_mutex_lock(x); +#define LTC_MUTEX_UNLOCK(x) pthread_mutex_unlock(x); + +#else + +/* default no functions */ +#define LTC_MUTEX_GLOBAL(x) +#define LTC_MUTEX_PROTO(x) +#define LTC_MUTEX_LOCK(x) +#define LTC_MUTEX_UNLOCK(x) + +#endif + + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_custom.h,v $ */ +/* $Revision: 1.17 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/headers/tomcrypt_hash.h b/src/headers/tomcrypt_hash.h index d295a59..a0534f9 100644 --- a/src/headers/tomcrypt_hash.h +++ b/src/headers/tomcrypt_hash.h @@ -132,10 +132,11 @@ extern struct ltc_hash_descriptor { unsigned long hashsize; /** Input block size in octets */ unsigned long blocksize; - /** ASN.1 DER identifier */ - unsigned char DER[64]; + /** ASN.1 OID */ + unsigned long OID[16]; /** Length of DER encoding */ - unsigned long DERlen; + unsigned long OIDlen; + /** Init a hash state @param hash The hash to initialize @return CRYPT_OK if successful @@ -278,6 +279,8 @@ int register_hash(const struct ltc_hash_descriptor *hash); int unregister_hash(const struct ltc_hash_descriptor *hash); int hash_is_valid(int idx); +LTC_MUTEX_PROTO(ltc_hash_mutex); + int hash_memory(int hash, const unsigned char *in, unsigned long inlen, unsigned char *out, unsigned long *outlen); @@ -292,29 +295,29 @@ int func_name (hash_state * md, const unsigned char *in, unsigned long inlen) { \ unsigned long n; \ int err; \ - LTC_ARGCHK(md != NULL); \ - LTC_ARGCHK(in != NULL); \ + LTC_ARGCHK(md != NULL); \ + LTC_ARGCHK(in != NULL); \ if (md-> state_var .curlen > sizeof(md-> state_var .buf)) { \ return CRYPT_INVALID_ARG; \ } \ - while (inlen > 0) { \ - if (md-> state_var .curlen == 0 && inlen >= block_size) { \ - if ((err = compress_name (md, (unsigned char *)in)) != CRYPT_OK) { \ - return err; \ - } \ + while (inlen > 0) { \ + if (md-> state_var .curlen == 0 && inlen >= block_size) { \ + if ((err = compress_name (md, (unsigned char *)in)) != CRYPT_OK) { \ + return err; \ + } \ md-> state_var .length += block_size * 8; \ - in += block_size; \ - inlen -= block_size; \ + in += block_size; \ + inlen -= block_size; \ } else { \ - n = MIN(inlen, (block_size - md-> state_var .curlen)); \ - memcpy(md-> state_var .buf + md-> state_var.curlen, in, (size_t)n); \ + n = MIN(inlen, (block_size - md-> state_var .curlen)); \ + memcpy(md-> state_var .buf + md-> state_var.curlen, in, (size_t)n); \ md-> state_var .curlen += n; \ - in += n; \ - inlen -= n; \ + in += n; \ + inlen -= n; \ if (md-> state_var .curlen == block_size) { \ - if ((err = compress_name (md, md-> state_var .buf)) != CRYPT_OK) {\ - return err; \ - } \ + if ((err = compress_name (md, md-> state_var .buf)) != CRYPT_OK) { \ + return err; \ + } \ md-> state_var .length += 8*block_size; \ md-> state_var .curlen = 0; \ } \ @@ -322,3 +325,7 @@ int func_name (hash_state * md, const unsigned char *in, unsigned long inlen) } \ return CRYPT_OK; \ } + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_hash.h,v $ */ +/* $Revision: 1.12 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/headers/tomcrypt_mac.h b/src/headers/tomcrypt_mac.h index 6b5e1ce..411b1bc 100644 --- a/src/headers/tomcrypt_mac.h +++ b/src/headers/tomcrypt_mac.h @@ -295,3 +295,7 @@ int pelican_memory(const unsigned char *key, unsigned long keylen, unsigned char *out); #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_mac.h,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/headers/tomcrypt_macros.h b/src/headers/tomcrypt_macros.h index f083984..488931f 100644 --- a/src/headers/tomcrypt_macros.h +++ b/src/headers/tomcrypt_macros.h @@ -132,7 +132,7 @@ asm __volatile__ ( \ #ifdef ENDIAN_32BITWORD #define STORE32L(x, y) \ - { unsigned long __t = (x); memcpy(y, &__t, 4); } + { ulong32 __t = (x); memcpy(y, &__t, 4); } #define LOAD32L(x, y) \ memcpy(&(x), y, 4); @@ -152,7 +152,7 @@ asm __volatile__ ( \ #else /* 64-bit words then */ #define STORE32L(x, y) \ - { unsigned long __t = (x); memcpy(y, &__t, 4); } + { ulong32 __t = (x); memcpy(y, &__t, 4); } #define LOAD32L(x, y) \ { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; } @@ -193,7 +193,7 @@ asm __volatile__ ( \ #ifdef ENDIAN_32BITWORD #define STORE32H(x, y) \ - { unsigned long __t = (x); memcpy(y, &__t, 4); } + { ulong32 __t = (x); memcpy(y, &__t, 4); } #define LOAD32H(x, y) \ memcpy(&(x), y, 4); @@ -213,7 +213,7 @@ asm __volatile__ ( \ #else /* 64-bit words then */ #define STORE32H(x, y) \ - { unsigned long __t = (x); memcpy(y, &__t, 4); } + { ulong32 __t = (x); memcpy(y, &__t, 4); } #define LOAD32H(x, y) \ { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; } @@ -371,3 +371,7 @@ static inline unsigned long ROR64c(unsigned long word, const int i) #else #define byte(x, n) (((x) >> (8 * (n))) & 255) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_macros.h,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/headers/tomcrypt_misc.h b/src/headers/tomcrypt_misc.h index bed5015..3b44795 100644 --- a/src/headers/tomcrypt_misc.h +++ b/src/headers/tomcrypt_misc.h @@ -15,3 +15,7 @@ const char *error_to_string(int err); int mpi_to_ltc_error(int err); extern const char *crypt_build_settings; + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_misc.h,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/headers/tomcrypt_pk.h b/src/headers/tomcrypt_pk.h index 065ca99..4f047de 100644 --- a/src/headers/tomcrypt_pk.h +++ b/src/headers/tomcrypt_pk.h @@ -84,9 +84,6 @@ int packet_valid_header(unsigned char *src, int section, int subsection); #define MIN_RSA_SIZE 1024 #define MAX_RSA_SIZE 4096 -/* Stack required for temps (plus padding) */ -// #define RSA_STACK (8 + (MAX_RSA_SIZE/8)) - typedef struct Rsa_key { int type; mp_int e, d, N, p, q, qP, dP, dQ; @@ -123,26 +120,6 @@ int rsa_verify_hash(const unsigned char *sig, unsigned long siglen, int hash_idx, unsigned long saltlen, int *stat, rsa_key *key); -/* these use PKCS #1 v1.5 padding */ -int rsa_v15_encrypt_key(const unsigned char *in, unsigned long inlen, - unsigned char *out, unsigned long *outlen, - prng_state *prng, int prng_idx, - rsa_key *key); - -int rsa_v15_decrypt_key(const unsigned char *in, unsigned long inlen, - unsigned char *out, unsigned long outlen, - int *stat, rsa_key *key); - -int rsa_v15_sign_hash(const unsigned char *in, unsigned long inlen, - unsigned char *out, unsigned long *siglen, - int hash_idx, rsa_key *key); - -int rsa_v15_verify_hash(const unsigned char *sig, unsigned long siglen, - const unsigned char *hash, unsigned long hashlen, - int hash_idx, int *stat, - rsa_key *key); - - /* PKCS #1 import/export */ int rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key); int rsa_import(const unsigned char *in, unsigned long inlen, rsa_key *key); @@ -244,10 +221,19 @@ typedef struct { int dsa_make_key(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key); void dsa_free(dsa_key *key); + +int dsa_sign_hash_raw(const unsigned char *in, unsigned long inlen, + mp_int *r, mp_int *s, + prng_state *prng, int wprng, dsa_key *key); + int dsa_sign_hash(const unsigned char *in, unsigned long inlen, unsigned char *out, unsigned long *outlen, prng_state *prng, int wprng, dsa_key *key); +int dsa_verify_hash_raw( mp_int *r, mp_int *s, + const unsigned char *hash, unsigned long hashlen, + int *stat, dsa_key *key); + int dsa_verify_hash(const unsigned char *sig, unsigned long siglen, const unsigned char *hash, unsigned long hashlen, int *stat, dsa_key *key); @@ -262,9 +248,134 @@ int dsa_verify_key(dsa_key *key, int *stat); #ifdef LTC_DER /* DER handling */ + +enum { + LTC_ASN1_EOL, + LTC_ASN1_INTEGER, + LTC_ASN1_SHORT_INTEGER, + LTC_ASN1_BIT_STRING, + LTC_ASN1_OCTET_STRING, + LTC_ASN1_NULL, + LTC_ASN1_OBJECT_IDENTIFIER, + LTC_ASN1_IA5_STRING, + LTC_ASN1_PRINTABLE_STRING, + LTC_ASN1_UTCTIME, + + LTC_ASN1_CHOICE, + LTC_ASN1_SEQUENCE +}; + +typedef struct { + int type; + void *data; + unsigned long size; + int used; +} ltc_asn1_list; + +#define LTC_SET_ASN1(list, index, Type, Data, Size) \ + do { \ + int LTC_MACRO_temp = (index); \ + ltc_asn1_list *LTC_MACRO_list = (list); \ + LTC_MACRO_list[LTC_MACRO_temp].type = (Type); \ + LTC_MACRO_list[LTC_MACRO_temp].data = (Data); \ + LTC_MACRO_list[LTC_MACRO_temp].size = (Size); \ + LTC_MACRO_list[LTC_MACRO_temp].used = 0; \ + } while (0); + +/* SEQUENCE */ +int der_encode_sequence(ltc_asn1_list *list, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +int der_decode_sequence(const unsigned char *in, unsigned long inlen, + ltc_asn1_list *list, unsigned long outlen); + +int der_length_sequence(ltc_asn1_list *list, unsigned long inlen, + unsigned long *outlen); + +/* VA list handy helpers */ +int der_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...); +int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...); + +/* INTEGER */ int der_encode_integer(mp_int *num, unsigned char *out, unsigned long *outlen); -int der_decode_integer(const unsigned char *in, unsigned long *inlen, mp_int *num); +int der_decode_integer(const unsigned char *in, unsigned long inlen, mp_int *num); int der_length_integer(mp_int *num, unsigned long *len); -int der_put_multi_integer(unsigned char *dst, unsigned long *outlen, mp_int *num, ...); -int der_get_multi_integer(const unsigned char *src, unsigned long *inlen, mp_int *num, ...); + +/* INTEGER -- handy for 0..2^32-1 values */ +int der_decode_short_integer(const unsigned char *in, unsigned long inlen, unsigned long *num); +int der_encode_short_integer(unsigned long num, unsigned char *out, unsigned long *outlen); +int der_length_short_integer(unsigned long num, unsigned long *outlen); + +/* BIT STRING */ +int der_encode_bit_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_decode_bit_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_length_bit_string(unsigned long nbits, unsigned long *outlen); + +/* OCTET STRING */ +int der_encode_octet_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_decode_octet_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_length_octet_string(unsigned long noctets, unsigned long *outlen); + +/* OBJECT IDENTIFIER */ +int der_encode_object_identifier(unsigned long *words, unsigned long nwords, + unsigned char *out, unsigned long *outlen); +int der_decode_object_identifier(const unsigned char *in, unsigned long inlen, + unsigned long *words, unsigned long *outlen); +int der_length_object_identifier(unsigned long *words, unsigned long nwords, unsigned long *outlen); +unsigned long der_object_identifier_bits(unsigned long x); + +/* IA5 STRING */ +int der_encode_ia5_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_decode_ia5_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_length_ia5_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen); + +int der_ia5_char_encode(int c); +int der_ia5_value_decode(int v); + +/* Printable STRING */ +int der_encode_printable_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_decode_printable_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_length_printable_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen); + +int der_printable_char_encode(int c); +int der_printable_value_decode(int v); + +/* CHOICE */ +int der_decode_choice(const unsigned char *in, unsigned long *inlen, + ltc_asn1_list *list, unsigned long outlen); + +/* UTCTime */ +typedef struct { + unsigned YY, /* year */ + MM, /* month */ + DD, /* day */ + hh, /* hour */ + mm, /* minute */ + ss, /* second */ + off_dir, /* timezone offset direction 0 == +, 1 == - */ + off_hh, /* timezone offset hours */ + off_mm; /* timezone offset minutes */ +} ltc_utctime; + +int der_encode_utctime(ltc_utctime *utctime, + unsigned char *out, unsigned long *outlen); + +int der_decode_utctime(const unsigned char *in, unsigned long *inlen, + ltc_utctime *out); + +int der_length_utctime(ltc_utctime *utctime, unsigned long *outlen); + + #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_pk.h,v $ */ +/* $Revision: 1.30 $ */ +/* $Date: 2005/06/19 11:23:03 $ */ diff --git a/src/headers/tomcrypt_pkcs.h b/src/headers/tomcrypt_pkcs.h index 9fd0581..8d850de 100644 --- a/src/headers/tomcrypt_pkcs.h +++ b/src/headers/tomcrypt_pkcs.h @@ -10,7 +10,7 @@ int pkcs_1_mgf1(const unsigned char *seed, unsigned long seedlen, int pkcs_1_i2osp(mp_int *n, unsigned long modulus_len, unsigned char *out); int pkcs_1_os2ip(mp_int *n, unsigned char *in, unsigned long inlen); -/* *** v2.0 padding */ +/* *** v2.1 padding */ int pkcs_1_oaep_encode(const unsigned char *msg, unsigned long msglen, const unsigned char *lparam, unsigned long lparamlen, unsigned long modulus_bitlen, prng_state *prng, @@ -34,32 +34,6 @@ int pkcs_1_pss_decode(const unsigned char *msghash, unsigned long msghashlen, unsigned long saltlen, int hash_idx, unsigned long modulus_bitlen, int *res); -/* *** v1.5 padding */ -/* encryption padding */ -int pkcs_1_v15_es_encode(const unsigned char *msg, unsigned long msglen, - unsigned long modulus_bitlen, - prng_state *prng, int prng_idx, - unsigned char *out, unsigned long *outlen); - -/* note "outlen" is fixed, you have to tell this decoder how big - * the original message was. Unlike the OAEP decoder it cannot auto-detect it. - */ -int pkcs_1_v15_es_decode(const unsigned char *msg, unsigned long msglen, - unsigned long modulus_bitlen, - unsigned char *out, unsigned long outlen, - int *res); - -/* signature padding */ -int pkcs_1_v15_sa_encode(const unsigned char *msghash, unsigned long msghashlen, - int hash_idx, unsigned long modulus_bitlen, - unsigned char *out, unsigned long *outlen); - -int pkcs_1_v15_sa_decode(const unsigned char *msghash, unsigned long msghashlen, - const unsigned char *sig, unsigned long siglen, - int hash_idx, unsigned long modulus_bitlen, - int *res); - - #endif /* PKCS_1 */ /* ===> PKCS #5 -- Password Based Cryptography <=== */ @@ -78,3 +52,7 @@ int pkcs_5_alg2(const unsigned char *password, unsigned long password_len, unsigned char *out, unsigned long *outlen); #endif /* PKCS_5 */ + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_pkcs.h,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/14 11:46:08 $ */ diff --git a/src/headers/tomcrypt_prng.h b/src/headers/tomcrypt_prng.h index 2ae5749..f96d408 100644 --- a/src/headers/tomcrypt_prng.h +++ b/src/headers/tomcrypt_prng.h @@ -178,6 +178,7 @@ int find_prng(const char *name); int register_prng(const struct ltc_prng_descriptor *prng); int unregister_prng(const struct ltc_prng_descriptor *prng); int prng_is_valid(int idx); +LTC_MUTEX_PROTO(ltc_prng_mutex); /* Slow RNG you **might** be able to use to seed a PRNG with. Be careful as this * might not work on all platforms as planned @@ -188,3 +189,7 @@ unsigned long rng_get_bytes(unsigned char *out, int rng_make_prng(int bits, int wprng, prng_state *prng, void (*callback)(void)); + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_prng.h,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/headers/tommath_class.h b/src/headers/tommath_class.h index 6d05b7b..02dd7cf 100644 --- a/src/headers/tommath_class.h +++ b/src/headers/tommath_class.h @@ -992,3 +992,7 @@ #else #define LTM_LAST #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tommath_class.h,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/headers/tommath_superclass.h b/src/headers/tommath_superclass.h index b50ecb0..89f3f57 100644 --- a/src/headers/tommath_superclass.h +++ b/src/headers/tommath_superclass.h @@ -1,10 +1,14 @@ /* super class file for PK algos */ /* default ... include all MPI */ +#ifndef SC_RSA_1 + #define LTM_ALL +#endif + /* RSA only (does not support DH/DSA/ECC) */ -// #define SC_RSA_1 +/* #define SC_RSA_1 */ /* For reference.... On an Athlon64 optimizing for speed... @@ -70,3 +74,7 @@ #endif #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tommath_superclass.h,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/14 13:27:20 $ */ diff --git a/src/mac/hmac/hmac_done.c b/src/mac/hmac/hmac_done.c index fdf20be..f64d044 100644 --- a/src/mac/hmac/hmac_done.c +++ b/src/mac/hmac/hmac_done.c @@ -103,3 +103,7 @@ LBL_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/hmac/hmac_done.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/mac/hmac/hmac_file.c b/src/mac/hmac/hmac_file.c index edbb6a6..f88d692 100644 --- a/src/mac/hmac/hmac_file.c +++ b/src/mac/hmac/hmac_file.c @@ -87,3 +87,7 @@ int hmac_file(int hash, const char *fname, #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/hmac/hmac_file.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/mac/hmac/hmac_init.c b/src/mac/hmac/hmac_init.c index d060a5b..e64d47f 100644 --- a/src/mac/hmac/hmac_init.c +++ b/src/mac/hmac/hmac_init.c @@ -106,3 +106,7 @@ done: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/hmac/hmac_init.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/mac/hmac/hmac_memory.c b/src/mac/hmac/hmac_memory.c index 036ee36..99959f4 100644 --- a/src/mac/hmac/hmac_memory.c +++ b/src/mac/hmac/hmac_memory.c @@ -71,3 +71,7 @@ LBL_ERR: #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/hmac/hmac_memory.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/mac/hmac/hmac_memory_multi.c b/src/mac/hmac/hmac_memory_multi.c index 4a5b9be..b7a6d96 100644 --- a/src/mac/hmac/hmac_memory_multi.c +++ b/src/mac/hmac/hmac_memory_multi.c @@ -86,3 +86,7 @@ LBL_ERR: #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/hmac/hmac_memory_multi.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/mac/hmac/hmac_process.c b/src/mac/hmac/hmac_process.c index 30e64c3..2919282 100644 --- a/src/mac/hmac/hmac_process.c +++ b/src/mac/hmac/hmac_process.c @@ -37,3 +37,7 @@ int hmac_process(hmac_state *hmac, const unsigned char *in, unsigned long inlen) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/hmac/hmac_process.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/mac/hmac/hmac_test.c b/src/mac/hmac/hmac_test.c index 0d542d4..87758f5 100644 --- a/src/mac/hmac/hmac_test.c +++ b/src/mac/hmac/hmac_test.c @@ -310,3 +310,7 @@ Key First" #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/hmac/hmac_test.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/mac/omac/omac_done.c b/src/mac/omac/omac_done.c index 0a91a14..37292d5 100644 --- a/src/mac/omac/omac_done.c +++ b/src/mac/omac/omac_done.c @@ -78,3 +78,7 @@ int omac_done(omac_state *omac, unsigned char *out, unsigned long *outlen) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/omac/omac_done.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/mac/omac/omac_file.c b/src/mac/omac/omac_file.c index 1e3d2f6..63784b0 100644 --- a/src/mac/omac/omac_file.c +++ b/src/mac/omac/omac_file.c @@ -77,3 +77,7 @@ int omac_file(int cipher, } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/omac/omac_file.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/mac/omac/omac_init.c b/src/mac/omac/omac_init.c index d39219d..8866772 100644 --- a/src/mac/omac/omac_init.c +++ b/src/mac/omac/omac_init.c @@ -39,7 +39,7 @@ int omac_init(omac_state *omac, int cipher, const unsigned char *key, unsigned l } #ifdef LTC_FAST - if (16 % sizeof(LTC_FAST_TYPE)) { + if (cipher_descriptor[cipher].block_length % sizeof(LTC_FAST_TYPE)) { return CRYPT_INVALID_ARG; } #endif @@ -93,3 +93,7 @@ int omac_init(omac_state *omac, int cipher, const unsigned char *key, unsigned l } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/omac/omac_init.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/06/06 10:22:44 $ */ diff --git a/src/mac/omac/omac_memory.c b/src/mac/omac/omac_memory.c index 51d0ce2..3b1521c 100644 --- a/src/mac/omac/omac_memory.c +++ b/src/mac/omac/omac_memory.c @@ -69,3 +69,7 @@ LBL_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/omac/omac_memory.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/mac/omac/omac_memory_multi.c b/src/mac/omac/omac_memory_multi.c index 76e4eb0..52f7323 100644 --- a/src/mac/omac/omac_memory_multi.c +++ b/src/mac/omac/omac_memory_multi.c @@ -84,3 +84,7 @@ LBL_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/omac/omac_memory_multi.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/mac/omac/omac_process.c b/src/mac/omac/omac_process.c index 6b603f7..ca3ec6b 100644 --- a/src/mac/omac/omac_process.c +++ b/src/mac/omac/omac_process.c @@ -27,7 +27,8 @@ */ int omac_process(omac_state *omac, const unsigned char *in, unsigned long inlen) { - int err, n, x; + unsigned long n, x; + int err; LTC_ARGCHK(omac != NULL); LTC_ARGCHK(in != NULL); @@ -57,7 +58,7 @@ int omac_process(omac_state *omac, const unsigned char *in, unsigned long inlen) while (inlen != 0) { /* ok if the block is full we xor in prev, encrypt and replace prev */ if (omac->buflen == omac->blklen) { - for (x = 0; x < omac->blklen; x++) { + for (x = 0; x < (unsigned long)omac->blklen; x++) { omac->block[x] ^= omac->prev[x]; } cipher_descriptor[omac->cipher_idx].ecb_encrypt(omac->block, omac->prev, &omac->key); @@ -77,3 +78,7 @@ int omac_process(omac_state *omac, const unsigned char *in, unsigned long inlen) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/omac/omac_process.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2005/05/05 14:35:58 $ */ diff --git a/src/mac/omac/omac_test.c b/src/mac/omac/omac_test.c index 42e42bd..1bc9ead 100644 --- a/src/mac/omac/omac_test.c +++ b/src/mac/omac/omac_test.c @@ -104,3 +104,7 @@ int omac_test(void) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/omac/omac_test.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/mac/pelican/pelican.c b/src/mac/pelican/pelican.c index fb7ce58..85bf9ee 100644 --- a/src/mac/pelican/pelican.c +++ b/src/mac/pelican/pelican.c @@ -102,6 +102,12 @@ int pelican_process(pelican_state *pelmac, const unsigned char *in, unsigned lon LTC_ARGCHK(pelmac != NULL); LTC_ARGCHK(in != NULL); + + /* check range */ + if (pelmac->buflen < 0 || pelmac->buflen > 15) { + return CRYPT_INVALID_ARG; + } + #ifdef LTC_FAST if (pelmac->buflen == 0) { while (inlen & ~15) { @@ -136,6 +142,12 @@ int pelican_done(pelican_state *pelmac, unsigned char *out) { LTC_ARGCHK(pelmac != NULL); LTC_ARGCHK(out != NULL); + + /* check range */ + if (pelmac->buflen < 0 || pelmac->buflen > 16) { + return CRYPT_INVALID_ARG; + } + if (pelmac->buflen == 16) { four_rounds(pelmac); pelmac->buflen = 0; @@ -147,3 +159,7 @@ int pelican_done(pelican_state *pelmac, unsigned char *out) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/pelican/pelican.c,v $ */ +/* $Revision: 1.16 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/mac/pelican/pelican_memory.c b/src/mac/pelican/pelican_memory.c index 9e0fc7b..093340d 100644 --- a/src/mac/pelican/pelican_memory.c +++ b/src/mac/pelican/pelican_memory.c @@ -53,3 +53,7 @@ int pelican_memory(const unsigned char *key, unsigned long keylen, #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/pelican/pelican_memory.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/mac/pelican/pelican_test.c b/src/mac/pelican/pelican_test.c index e694f61..06ec3f0 100644 --- a/src/mac/pelican/pelican_test.c +++ b/src/mac/pelican/pelican_test.c @@ -114,3 +114,7 @@ int pelican_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/pelican/pelican_test.c,v $ */ +/* $Revision: 1.9 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/mac/pmac/pmac_done.c b/src/mac/pmac/pmac_done.c index 610e433..09c430c 100644 --- a/src/mac/pmac/pmac_done.c +++ b/src/mac/pmac/pmac_done.c @@ -66,3 +66,7 @@ int pmac_done(pmac_state *state, unsigned char *out, unsigned long *outlen) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/pmac/pmac_done.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/mac/pmac/pmac_file.c b/src/mac/pmac/pmac_file.c index 5b7dd24..1034c6f 100644 --- a/src/mac/pmac/pmac_file.c +++ b/src/mac/pmac/pmac_file.c @@ -78,3 +78,7 @@ int pmac_file(int cipher, } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/pmac/pmac_file.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/mac/pmac/pmac_init.c b/src/mac/pmac/pmac_init.c index a02b20c..5bd94a0 100644 --- a/src/mac/pmac/pmac_init.c +++ b/src/mac/pmac/pmac_init.c @@ -138,3 +138,7 @@ int pmac_init(pmac_state *pmac, int cipher, const unsigned char *key, unsigned l } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/pmac/pmac_init.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/mac/pmac/pmac_memory.c b/src/mac/pmac/pmac_memory.c index a04cd78..fcdef99 100644 --- a/src/mac/pmac/pmac_memory.c +++ b/src/mac/pmac/pmac_memory.c @@ -68,3 +68,7 @@ LBL_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/pmac/pmac_memory.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/mac/pmac/pmac_memory_multi.c b/src/mac/pmac/pmac_memory_multi.c index 289d2e0..2cc8572 100644 --- a/src/mac/pmac/pmac_memory_multi.c +++ b/src/mac/pmac/pmac_memory_multi.c @@ -83,3 +83,7 @@ LBL_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/pmac/pmac_memory_multi.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/mac/pmac/pmac_ntz.c b/src/mac/pmac/pmac_ntz.c index 97f0a15..7ec4550 100644 --- a/src/mac/pmac/pmac_ntz.c +++ b/src/mac/pmac/pmac_ntz.c @@ -33,3 +33,7 @@ int pmac_ntz(unsigned long x) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/pmac/pmac_ntz.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/mac/pmac/pmac_process.c b/src/mac/pmac/pmac_process.c index 5cee5ec..9ebd44e 100644 --- a/src/mac/pmac/pmac_process.c +++ b/src/mac/pmac/pmac_process.c @@ -90,3 +90,7 @@ int pmac_process(pmac_state *pmac, const unsigned char *in, unsigned long inlen) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/pmac/pmac_process.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/mac/pmac/pmac_shift_xor.c b/src/mac/pmac/pmac_shift_xor.c index 18c6141..f24c22b 100644 --- a/src/mac/pmac/pmac_shift_xor.c +++ b/src/mac/pmac/pmac_shift_xor.c @@ -38,3 +38,7 @@ void pmac_shift_xor(pmac_state *pmac) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/pmac/pmac_shift_xor.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/mac/pmac/pmac_test.c b/src/mac/pmac/pmac_test.c index 6c610f9..6d88703 100644 --- a/src/mac/pmac/pmac_test.c +++ b/src/mac/pmac/pmac_test.c @@ -159,3 +159,7 @@ int pmac_test(void) + +/* $Source: /cvs/libtom/libtomcrypt/src/mac/pmac/pmac_test.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/misc/base64/base64_decode.c b/src/misc/base64/base64_decode.c index ac6db57..551add1 100644 --- a/src/misc/base64/base64_decode.c +++ b/src/misc/base64/base64_decode.c @@ -98,3 +98,7 @@ int base64_decode(const unsigned char *in, unsigned long inlen, #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/base64/base64_decode.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/misc/base64/base64_encode.c b/src/misc/base64/base64_encode.c index 047980c..5978643 100644 --- a/src/misc/base64/base64_encode.c +++ b/src/misc/base64/base64_encode.c @@ -74,3 +74,7 @@ int base64_encode(const unsigned char *in, unsigned long inlen, #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/base64/base64_encode.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/misc/burn_stack.c b/src/misc/burn_stack.c index 3bc69ab..7ac6518 100644 --- a/src/misc/burn_stack.c +++ b/src/misc/burn_stack.c @@ -28,3 +28,7 @@ void burn_stack(unsigned long len) } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/burn_stack.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/misc/crypt/crypt.c b/src/misc/crypt/crypt.c index 83f1414..6d85ceb 100644 --- a/src/misc/crypt/crypt.c +++ b/src/misc/crypt/crypt.c @@ -295,8 +295,21 @@ const char *crypt_build_settings = #endif #if defined(LTC_NO_ASM) " LTC_NO_ASM " +#endif +#if defined(LTC_NO_TEST) + " LTC_NO_TEST " +#endif +#if defined(LTC_NO_TABLES) + " LTC_NO_TABLES " +#endif +#if defined(LTC_PTHREAD) + " LTC_PTHREAD " #endif "\n" "\n\n\n" ; + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt.c,v $ */ +/* $Revision: 1.11 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_argchk.c b/src/misc/crypt/crypt_argchk.c index d345c8d..699c6cf 100644 --- a/src/misc/crypt/crypt_argchk.c +++ b/src/misc/crypt/crypt_argchk.c @@ -24,3 +24,7 @@ void crypt_argchk(char *v, char *s, int d) (void)raise(SIGABRT); } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_argchk.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/misc/crypt/crypt_cipher_descriptor.c b/src/misc/crypt/crypt_cipher_descriptor.c index e274449..127e85c 100644 --- a/src/misc/crypt/crypt_cipher_descriptor.c +++ b/src/misc/crypt/crypt_cipher_descriptor.c @@ -19,3 +19,9 @@ struct ltc_cipher_descriptor cipher_descriptor[TAB_SIZE] = { { NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } }; +LTC_MUTEX_GLOBAL(ltc_cipher_mutex); + + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_cipher_descriptor.c,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_cipher_is_valid.c b/src/misc/crypt/crypt_cipher_is_valid.c index b179402..7830303 100644 --- a/src/misc/crypt/crypt_cipher_is_valid.c +++ b/src/misc/crypt/crypt_cipher_is_valid.c @@ -22,8 +22,15 @@ */ int cipher_is_valid(int idx) { + LTC_MUTEX_LOCK(<c_cipher_mutex); if (idx < 0 || idx >= TAB_SIZE || cipher_descriptor[idx].name == NULL) { + LTC_MUTEX_UNLOCK(<c_cipher_mutex); return CRYPT_INVALID_CIPHER; } + LTC_MUTEX_UNLOCK(<c_cipher_mutex); return CRYPT_OK; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_cipher_is_valid.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_find_cipher.c b/src/misc/crypt/crypt_find_cipher.c index b83109c..e7fba73 100644 --- a/src/misc/crypt/crypt_find_cipher.c +++ b/src/misc/crypt/crypt_find_cipher.c @@ -24,11 +24,18 @@ int find_cipher(const char *name) { int x; LTC_ARGCHK(name != NULL); + LTC_MUTEX_LOCK(<c_cipher_mutex); for (x = 0; x < TAB_SIZE; x++) { if (cipher_descriptor[x].name != NULL && !strcmp(cipher_descriptor[x].name, name)) { + LTC_MUTEX_UNLOCK(<c_cipher_mutex); return x; } } + LTC_MUTEX_UNLOCK(<c_cipher_mutex); return -1; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_find_cipher.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_find_cipher_any.c b/src/misc/crypt/crypt_find_cipher_any.c index 42e59c0..6dd0e6d 100644 --- a/src/misc/crypt/crypt_find_cipher_any.c +++ b/src/misc/crypt/crypt_find_cipher_any.c @@ -31,13 +31,20 @@ int find_cipher_any(const char *name, int blocklen, int keylen) x = find_cipher(name); if (x != -1) return x; + LTC_MUTEX_LOCK(<c_cipher_mutex); for (x = 0; x < TAB_SIZE; x++) { if (cipher_descriptor[x].name == NULL) { continue; } if (blocklen <= (int)cipher_descriptor[x].block_length && keylen <= (int)cipher_descriptor[x].max_key_length) { + LTC_MUTEX_UNLOCK(<c_cipher_mutex); return x; } } + LTC_MUTEX_UNLOCK(<c_cipher_mutex); return -1; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_find_cipher_any.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_find_cipher_id.c b/src/misc/crypt/crypt_find_cipher_id.c index 986baf5..5f5f874 100644 --- a/src/misc/crypt/crypt_find_cipher_id.c +++ b/src/misc/crypt/crypt_find_cipher_id.c @@ -23,10 +23,18 @@ int find_cipher_id(unsigned char ID) { int x; + LTC_MUTEX_LOCK(<c_cipher_mutex); for (x = 0; x < TAB_SIZE; x++) { if (cipher_descriptor[x].ID == ID) { - return (cipher_descriptor[x].name == NULL) ? -1 : x; + x = (cipher_descriptor[x].name == NULL) ? -1 : x; + LTC_MUTEX_UNLOCK(<c_cipher_mutex); + return x; } } + LTC_MUTEX_UNLOCK(<c_cipher_mutex); return -1; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_find_cipher_id.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_find_hash.c b/src/misc/crypt/crypt_find_hash.c index d66201c..d02a449 100644 --- a/src/misc/crypt/crypt_find_hash.c +++ b/src/misc/crypt/crypt_find_hash.c @@ -24,10 +24,17 @@ int find_hash(const char *name) { int x; LTC_ARGCHK(name != NULL); + LTC_MUTEX_LOCK(<c_hash_mutex); for (x = 0; x < TAB_SIZE; x++) { if (hash_descriptor[x].name != NULL && strcmp(hash_descriptor[x].name, name) == 0) { + LTC_MUTEX_UNLOCK(<c_hash_mutex); return x; } } + LTC_MUTEX_UNLOCK(<c_hash_mutex); return -1; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_find_hash.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_find_hash_any.c b/src/misc/crypt/crypt_find_hash_any.c index 0d6d430..1172f22 100644 --- a/src/misc/crypt/crypt_find_hash_any.c +++ b/src/misc/crypt/crypt_find_hash_any.c @@ -28,6 +28,7 @@ x = find_hash(name); if (x != -1) return x; + LTC_MUTEX_LOCK(<c_hash_mutex); y = MAXBLOCKSIZE+1; z = -1; for (x = 0; x < TAB_SIZE; x++) { @@ -39,5 +40,10 @@ y = hash_descriptor[x].hashsize; } } + LTC_MUTEX_UNLOCK(<c_hash_mutex); return z; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_find_hash_any.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_find_hash_id.c b/src/misc/crypt/crypt_find_hash_id.c index 8628d53..8cd0d38 100644 --- a/src/misc/crypt/crypt_find_hash_id.c +++ b/src/misc/crypt/crypt_find_hash_id.c @@ -23,10 +23,18 @@ int find_hash_id(unsigned char ID) { int x; + LTC_MUTEX_LOCK(<c_hash_mutex); for (x = 0; x < TAB_SIZE; x++) { - if (hash_descriptor[x].ID == ID) { - return (hash_descriptor[x].name == NULL) ? -1 : x; - } + if (hash_descriptor[x].ID == ID) { + x = (hash_descriptor[x].name == NULL) ? -1 : x; + LTC_MUTEX_UNLOCK(<c_hash_mutex); + return x; + } } + LTC_MUTEX_UNLOCK(<c_hash_mutex); return -1; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_find_hash_id.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/06/19 18:03:25 $ */ diff --git a/src/misc/crypt/crypt_find_prng.c b/src/misc/crypt/crypt_find_prng.c index c01a023..503813d 100644 --- a/src/misc/crypt/crypt_find_prng.c +++ b/src/misc/crypt/crypt_find_prng.c @@ -24,11 +24,18 @@ int find_prng(const char *name) { int x; LTC_ARGCHK(name != NULL); + LTC_MUTEX_LOCK(<c_prng_mutex); for (x = 0; x < TAB_SIZE; x++) { if ((prng_descriptor[x].name != NULL) && strcmp(prng_descriptor[x].name, name) == 0) { + LTC_MUTEX_UNLOCK(<c_prng_mutex); return x; } } + LTC_MUTEX_UNLOCK(<c_prng_mutex); return -1; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_find_prng.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_hash_descriptor.c b/src/misc/crypt/crypt_hash_descriptor.c index cbd6d03..f8583d8 100644 --- a/src/misc/crypt/crypt_hash_descriptor.c +++ b/src/misc/crypt/crypt_hash_descriptor.c @@ -18,3 +18,10 @@ struct ltc_hash_descriptor hash_descriptor[TAB_SIZE] = { { NULL, 0, 0, 0, { 0 }, 0, NULL, NULL, NULL, NULL } }; + +LTC_MUTEX_GLOBAL(ltc_hash_mutex); + + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_hash_descriptor.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_hash_is_valid.c b/src/misc/crypt/crypt_hash_is_valid.c index c9784b8..a8130d4 100644 --- a/src/misc/crypt/crypt_hash_is_valid.c +++ b/src/misc/crypt/crypt_hash_is_valid.c @@ -22,8 +22,15 @@ */ int hash_is_valid(int idx) { + LTC_MUTEX_LOCK(<c_hash_mutex); if (idx < 0 || idx >= TAB_SIZE || hash_descriptor[idx].name == NULL) { + LTC_MUTEX_UNLOCK(<c_hash_mutex); return CRYPT_INVALID_HASH; } + LTC_MUTEX_UNLOCK(<c_hash_mutex); return CRYPT_OK; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_hash_is_valid.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_prng_descriptor.c b/src/misc/crypt/crypt_prng_descriptor.c index 8a99510..7335f5d 100644 --- a/src/misc/crypt/crypt_prng_descriptor.c +++ b/src/misc/crypt/crypt_prng_descriptor.c @@ -17,3 +17,10 @@ struct ltc_prng_descriptor prng_descriptor[TAB_SIZE] = { { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } }; + +LTC_MUTEX_GLOBAL(ltc_prng_mutex); + + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_prng_descriptor.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_prng_is_valid.c b/src/misc/crypt/crypt_prng_is_valid.c index 7795bbb..a7a7ed6 100644 --- a/src/misc/crypt/crypt_prng_is_valid.c +++ b/src/misc/crypt/crypt_prng_is_valid.c @@ -22,8 +22,15 @@ */ int prng_is_valid(int idx) { + LTC_MUTEX_LOCK(<c_prng_mutex); if (idx < 0 || idx >= TAB_SIZE || prng_descriptor[idx].name == NULL) { + LTC_MUTEX_UNLOCK(<c_prng_mutex); return CRYPT_INVALID_PRNG; } + LTC_MUTEX_UNLOCK(<c_prng_mutex); return CRYPT_OK; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_prng_is_valid.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_register_cipher.c b/src/misc/crypt/crypt_register_cipher.c index 74349e6..c55d7c0 100644 --- a/src/misc/crypt/crypt_register_cipher.c +++ b/src/misc/crypt/crypt_register_cipher.c @@ -27,8 +27,10 @@ int register_cipher(const struct ltc_cipher_descriptor *cipher) LTC_ARGCHK(cipher != NULL); /* is it already registered? */ + LTC_MUTEX_LOCK(<c_cipher_mutex); for (x = 0; x < TAB_SIZE; x++) { if (cipher_descriptor[x].name != NULL && cipher_descriptor[x].ID == cipher->ID) { + LTC_MUTEX_UNLOCK(<c_cipher_mutex); return x; } } @@ -37,10 +39,16 @@ int register_cipher(const struct ltc_cipher_descriptor *cipher) for (x = 0; x < TAB_SIZE; x++) { if (cipher_descriptor[x].name == NULL) { XMEMCPY(&cipher_descriptor[x], cipher, sizeof(struct ltc_cipher_descriptor)); + LTC_MUTEX_UNLOCK(<c_cipher_mutex); return x; } } /* no spot */ + LTC_MUTEX_UNLOCK(<c_cipher_mutex); return -1; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_register_cipher.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_register_hash.c b/src/misc/crypt/crypt_register_hash.c index d5cf5b8..0ff521f 100644 --- a/src/misc/crypt/crypt_register_hash.c +++ b/src/misc/crypt/crypt_register_hash.c @@ -27,8 +27,10 @@ int register_hash(const struct ltc_hash_descriptor *hash) LTC_ARGCHK(hash != NULL); /* is it already registered? */ + LTC_MUTEX_LOCK(<c_hash_mutex); for (x = 0; x < TAB_SIZE; x++) { if (memcmp(&hash_descriptor[x], hash, sizeof(struct ltc_hash_descriptor)) == 0) { + LTC_MUTEX_UNLOCK(<c_hash_mutex); return x; } } @@ -37,10 +39,16 @@ int register_hash(const struct ltc_hash_descriptor *hash) for (x = 0; x < TAB_SIZE; x++) { if (hash_descriptor[x].name == NULL) { XMEMCPY(&hash_descriptor[x], hash, sizeof(struct ltc_hash_descriptor)); + LTC_MUTEX_UNLOCK(<c_hash_mutex); return x; } } /* no spot */ + LTC_MUTEX_UNLOCK(<c_hash_mutex); return -1; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_register_hash.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_register_prng.c b/src/misc/crypt/crypt_register_prng.c index 6a1be77..5ab4a49 100644 --- a/src/misc/crypt/crypt_register_prng.c +++ b/src/misc/crypt/crypt_register_prng.c @@ -27,8 +27,10 @@ int register_prng(const struct ltc_prng_descriptor *prng) LTC_ARGCHK(prng != NULL); /* is it already registered? */ + LTC_MUTEX_LOCK(<c_prng_mutex); for (x = 0; x < TAB_SIZE; x++) { if (memcmp(&prng_descriptor[x], prng, sizeof(struct ltc_prng_descriptor)) == 0) { + LTC_MUTEX_UNLOCK(<c_prng_mutex); return x; } } @@ -37,10 +39,16 @@ int register_prng(const struct ltc_prng_descriptor *prng) for (x = 0; x < TAB_SIZE; x++) { if (prng_descriptor[x].name == NULL) { XMEMCPY(&prng_descriptor[x], prng, sizeof(struct ltc_prng_descriptor)); + LTC_MUTEX_UNLOCK(<c_prng_mutex); return x; } } /* no spot */ + LTC_MUTEX_UNLOCK(<c_prng_mutex); return -1; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_register_prng.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_unregister_cipher.c b/src/misc/crypt/crypt_unregister_cipher.c index 0511de5..4081ca8 100644 --- a/src/misc/crypt/crypt_unregister_cipher.c +++ b/src/misc/crypt/crypt_unregister_cipher.c @@ -27,12 +27,19 @@ int unregister_cipher(const struct ltc_cipher_descriptor *cipher) LTC_ARGCHK(cipher != NULL); /* is it already registered? */ + LTC_MUTEX_LOCK(<c_cipher_mutex); for (x = 0; x < TAB_SIZE; x++) { if (memcmp(&cipher_descriptor[x], cipher, sizeof(struct ltc_cipher_descriptor)) == 0) { cipher_descriptor[x].name = NULL; cipher_descriptor[x].ID = 255; + LTC_MUTEX_UNLOCK(<c_cipher_mutex); return CRYPT_OK; } } + LTC_MUTEX_UNLOCK(<c_cipher_mutex); return CRYPT_ERROR; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_unregister_cipher.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_unregister_hash.c b/src/misc/crypt/crypt_unregister_hash.c index 25e36f2..fdd25b2 100644 --- a/src/misc/crypt/crypt_unregister_hash.c +++ b/src/misc/crypt/crypt_unregister_hash.c @@ -27,11 +27,18 @@ int unregister_hash(const struct ltc_hash_descriptor *hash) LTC_ARGCHK(hash != NULL); /* is it already registered? */ + LTC_MUTEX_LOCK(<c_hash_mutex); for (x = 0; x < TAB_SIZE; x++) { if (memcmp(&hash_descriptor[x], hash, sizeof(struct ltc_hash_descriptor)) == 0) { hash_descriptor[x].name = NULL; + LTC_MUTEX_UNLOCK(<c_hash_mutex); return CRYPT_OK; } } + LTC_MUTEX_UNLOCK(<c_hash_mutex); return CRYPT_ERROR; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_unregister_hash.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/crypt/crypt_unregister_prng.c b/src/misc/crypt/crypt_unregister_prng.c index 55cc554..4aff6de 100644 --- a/src/misc/crypt/crypt_unregister_prng.c +++ b/src/misc/crypt/crypt_unregister_prng.c @@ -25,13 +25,20 @@ int unregister_prng(const struct ltc_prng_descriptor *prng) int x; LTC_ARGCHK(prng != NULL); - + /* is it already registered? */ + LTC_MUTEX_LOCK(<c_prng_mutex); for (x = 0; x < TAB_SIZE; x++) { if (memcmp(&prng_descriptor[x], prng, sizeof(struct ltc_prng_descriptor)) != 0) { prng_descriptor[x].name = NULL; + LTC_MUTEX_UNLOCK(<c_prng_mutex); return CRYPT_OK; } } + LTC_MUTEX_UNLOCK(<c_prng_mutex); return CRYPT_ERROR; } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/crypt/crypt_unregister_prng.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 18:00:28 $ */ diff --git a/src/misc/error_to_string.c b/src/misc/error_to_string.c index 3a325a2..6167a70 100644 --- a/src/misc/error_to_string.c +++ b/src/misc/error_to_string.c @@ -68,3 +68,7 @@ const char *error_to_string(int err) } } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/error_to_string.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/misc/mpi/is_prime.c b/src/misc/mpi/is_prime.c index f58391f..9ee4ed2 100644 --- a/src/misc/mpi/is_prime.c +++ b/src/misc/mpi/is_prime.c @@ -30,3 +30,7 @@ int is_prime(mp_int *N, int *result) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/mpi/is_prime.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/misc/mpi/mpi.c b/src/misc/mpi/mpi.c index ba3a7ed..56dfa02 100644 --- a/src/misc/mpi/mpi.c +++ b/src/misc/mpi/mpi.c @@ -9042,3 +9042,7 @@ int KARATSUBA_MUL_CUTOFF = 74, /* Min. number of digits before Karatsub /* EOF */ + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/mpi/mpi.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/misc/mpi/mpi_to_ltc_error.c b/src/misc/mpi/mpi_to_ltc_error.c index 3a4ea17..bc39ea1 100644 --- a/src/misc/mpi/mpi_to_ltc_error.c +++ b/src/misc/mpi/mpi_to_ltc_error.c @@ -42,3 +42,7 @@ int mpi_to_ltc_error(int err) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/mpi/mpi_to_ltc_error.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/misc/mpi/rand_prime.c b/src/misc/mpi/rand_prime.c index 97ddf73..9c5921a 100644 --- a/src/misc/mpi/rand_prime.c +++ b/src/misc/mpi/rand_prime.c @@ -64,3 +64,7 @@ int rand_prime(mp_int *N, long len, prng_state *prng, int wprng) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/mpi/rand_prime.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/misc/pkcs5/pkcs_5_1.c b/src/misc/pkcs5/pkcs_5_1.c index ec47372..90411b7 100644 --- a/src/misc/pkcs5/pkcs_5_1.c +++ b/src/misc/pkcs5/pkcs_5_1.c @@ -100,3 +100,7 @@ LBL_ERR: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/pkcs5/pkcs_5_1.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/misc/pkcs5/pkcs_5_2.c b/src/misc/pkcs5/pkcs_5_2.c index aac811b..08d8a18 100644 --- a/src/misc/pkcs5/pkcs_5_2.c +++ b/src/misc/pkcs5/pkcs_5_2.c @@ -123,3 +123,7 @@ LBL_ERR: #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/pkcs5/pkcs_5_2.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/misc/zeromem.c b/src/misc/zeromem.c index c640bb4..1ab07dc 100644 --- a/src/misc/zeromem.c +++ b/src/misc/zeromem.c @@ -28,3 +28,7 @@ void zeromem(void *out, size_t outlen) *mem++ = 0; } } + +/* $Source: /cvs/libtom/libtomcrypt/src/misc/zeromem.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/cbc/cbc_decrypt.c b/src/modes/cbc/cbc_decrypt.c index c79631c..fc3fdd5 100644 --- a/src/modes/cbc/cbc_decrypt.c +++ b/src/modes/cbc/cbc_decrypt.c @@ -89,3 +89,7 @@ int cbc_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, s } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/cbc/cbc_decrypt.c,v $ */ +/* $Revision: 1.9 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/cbc/cbc_done.c b/src/modes/cbc/cbc_done.c index daa9110..afaa9bb 100644 --- a/src/modes/cbc/cbc_done.c +++ b/src/modes/cbc/cbc_done.c @@ -36,3 +36,7 @@ int cbc_done(symmetric_CBC *cbc) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/cbc/cbc_done.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/cbc/cbc_encrypt.c b/src/modes/cbc/cbc_encrypt.c index 00ca05f..a6b41b1 100644 --- a/src/modes/cbc/cbc_encrypt.c +++ b/src/modes/cbc/cbc_encrypt.c @@ -90,3 +90,7 @@ int cbc_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, s } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/cbc/cbc_encrypt.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/cbc/cbc_getiv.c b/src/modes/cbc/cbc_getiv.c index 0f5c3e4..ab418b1 100644 --- a/src/modes/cbc/cbc_getiv.c +++ b/src/modes/cbc/cbc_getiv.c @@ -39,3 +39,7 @@ int cbc_getiv(unsigned char *IV, unsigned long *len, symmetric_CBC *cbc) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/cbc/cbc_getiv.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/cbc/cbc_setiv.c b/src/modes/cbc/cbc_setiv.c index f2e8b31..c38e713 100644 --- a/src/modes/cbc/cbc_setiv.c +++ b/src/modes/cbc/cbc_setiv.c @@ -38,3 +38,7 @@ int cbc_setiv(const unsigned char *IV, unsigned long len, symmetric_CBC *cbc) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/cbc/cbc_setiv.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/cbc/cbc_start.c b/src/modes/cbc/cbc_start.c index 680faab..833bb87 100644 --- a/src/modes/cbc/cbc_start.c +++ b/src/modes/cbc/cbc_start.c @@ -56,3 +56,7 @@ int cbc_start(int cipher, const unsigned char *IV, const unsigned char *key, } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/cbc/cbc_start.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/cfb/cfb_decrypt.c b/src/modes/cfb/cfb_decrypt.c index 8b78898..3d51ba5 100644 --- a/src/modes/cfb/cfb_decrypt.c +++ b/src/modes/cfb/cfb_decrypt.c @@ -59,3 +59,7 @@ int cfb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, s #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/cfb/cfb_decrypt.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/cfb/cfb_done.c b/src/modes/cfb/cfb_done.c index 04e775c..8924761 100644 --- a/src/modes/cfb/cfb_done.c +++ b/src/modes/cfb/cfb_done.c @@ -36,3 +36,7 @@ int cfb_done(symmetric_CFB *cfb) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/cfb/cfb_done.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/cfb/cfb_encrypt.c b/src/modes/cfb/cfb_encrypt.c index b960368..cca0116 100644 --- a/src/modes/cfb/cfb_encrypt.c +++ b/src/modes/cfb/cfb_encrypt.c @@ -57,3 +57,7 @@ int cfb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, s } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/cfb/cfb_encrypt.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/cfb/cfb_getiv.c b/src/modes/cfb/cfb_getiv.c index e59c1e4..5c5b4c4 100644 --- a/src/modes/cfb/cfb_getiv.c +++ b/src/modes/cfb/cfb_getiv.c @@ -39,3 +39,7 @@ int cfb_getiv(unsigned char *IV, unsigned long *len, symmetric_CFB *cfb) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/cfb/cfb_getiv.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/cfb/cfb_setiv.c b/src/modes/cfb/cfb_setiv.c index e475ad9..d075a0d 100644 --- a/src/modes/cfb/cfb_setiv.c +++ b/src/modes/cfb/cfb_setiv.c @@ -47,3 +47,7 @@ int cfb_setiv(const unsigned char *IV, unsigned long len, symmetric_CFB *cfb) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/cfb/cfb_setiv.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/cfb/cfb_start.c b/src/modes/cfb/cfb_start.c index 7157fc3..755e173 100644 --- a/src/modes/cfb/cfb_start.c +++ b/src/modes/cfb/cfb_start.c @@ -61,3 +61,7 @@ int cfb_start(int cipher, const unsigned char *IV, const unsigned char *key, } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/cfb/cfb_start.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ctr/ctr_decrypt.c b/src/modes/ctr/ctr_decrypt.c index daa78a8..e1d1d51 100644 --- a/src/modes/ctr/ctr_decrypt.c +++ b/src/modes/ctr/ctr_decrypt.c @@ -36,3 +36,7 @@ int ctr_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, s #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ctr/ctr_decrypt.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ctr/ctr_done.c b/src/modes/ctr/ctr_done.c index 88508ba..f2e79ba 100644 --- a/src/modes/ctr/ctr_done.c +++ b/src/modes/ctr/ctr_done.c @@ -36,3 +36,7 @@ int ctr_done(symmetric_CTR *ctr) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ctr/ctr_done.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ctr/ctr_encrypt.c b/src/modes/ctr/ctr_encrypt.c index a96b806..79795ae 100644 --- a/src/modes/ctr/ctr_encrypt.c +++ b/src/modes/ctr/ctr_encrypt.c @@ -60,7 +60,7 @@ int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, s /* is the pad empty? */ if (ctr->padlen == ctr->blocklen) { /* increment counter */ - if (ctr->mode == 0) { + if (ctr->mode == CTR_COUNTER_LITTLE_ENDIAN) { /* little-endian */ for (x = 0; x < ctr->blocklen; x++) { ctr->ctr[x] = (ctr->ctr[x] + (unsigned char)1) & (unsigned char)255; @@ -102,3 +102,7 @@ int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, s } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ctr/ctr_encrypt.c,v $ */ +/* $Revision: 1.13 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ctr/ctr_getiv.c b/src/modes/ctr/ctr_getiv.c index 3997033..50ce6a0 100644 --- a/src/modes/ctr/ctr_getiv.c +++ b/src/modes/ctr/ctr_getiv.c @@ -39,3 +39,7 @@ int ctr_getiv(unsigned char *IV, unsigned long *len, symmetric_CTR *ctr) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ctr/ctr_getiv.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ctr/ctr_setiv.c b/src/modes/ctr/ctr_setiv.c index 2aab190..64d4c43 100644 --- a/src/modes/ctr/ctr_setiv.c +++ b/src/modes/ctr/ctr_setiv.c @@ -52,3 +52,7 @@ int ctr_setiv(const unsigned char *IV, unsigned long len, symmetric_CTR *ctr) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ctr/ctr_setiv.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ctr/ctr_start.c b/src/modes/ctr/ctr_start.c index db8c464..7c7eebb 100644 --- a/src/modes/ctr/ctr_start.c +++ b/src/modes/ctr/ctr_start.c @@ -21,19 +21,23 @@ /** Initialize a CTR context @param cipher The index of the cipher desired - @param count The initial vector + @param IV The initial vector @param key The secret key @param keylen The length of the secret key (octets) @param num_rounds Number of rounds in the cipher desired (0 for default) + @param ctr_mode The counter mode (CTR_COUNTER_LITTLE_ENDIAN or CTR_COUNTER_BIG_ENDIAN) @param ctr The CTR state to initialize @return CRYPT_OK if successful */ -int ctr_start(int cipher, const unsigned char *count, const unsigned char *key, int keylen, - int num_rounds, symmetric_CTR *ctr) +int ctr_start( int cipher, + const unsigned char *IV, + const unsigned char *key, int keylen, + int num_rounds, int ctr_mode, + symmetric_CTR *ctr) { int x, err; - LTC_ARGCHK(count != NULL); + LTC_ARGCHK(IV != NULL); LTC_ARGCHK(key != NULL); LTC_ARGCHK(ctr != NULL); @@ -51,12 +55,16 @@ int ctr_start(int cipher, const unsigned char *count, const unsigned char *key, ctr->blocklen = cipher_descriptor[cipher].block_length; ctr->cipher = cipher; ctr->padlen = 0; - ctr->mode = 0; + ctr->mode = ctr_mode; for (x = 0; x < ctr->blocklen; x++) { - ctr->ctr[x] = count[x]; + ctr->ctr[x] = IV[x]; } cipher_descriptor[ctr->cipher].ecb_encrypt(ctr->ctr, ctr->pad, &ctr->key); return CRYPT_OK; } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ctr/ctr_start.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ecb/ecb_decrypt.c b/src/modes/ecb/ecb_decrypt.c index 8db4d37..aa83661 100644 --- a/src/modes/ecb/ecb_decrypt.c +++ b/src/modes/ecb/ecb_decrypt.c @@ -53,3 +53,7 @@ int ecb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, s } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ecb/ecb_decrypt.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ecb/ecb_done.c b/src/modes/ecb/ecb_done.c index 31a42fa..a072615 100644 --- a/src/modes/ecb/ecb_done.c +++ b/src/modes/ecb/ecb_done.c @@ -18,7 +18,7 @@ #ifdef ECB /** Terminate the chain - @param rcb The ECB chain to terminate + @param ecb The ECB chain to terminate @return CRYPT_OK on success */ int ecb_done(symmetric_ECB *ecb) @@ -36,3 +36,7 @@ int ecb_done(symmetric_ECB *ecb) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ecb/ecb_done.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ecb/ecb_encrypt.c b/src/modes/ecb/ecb_encrypt.c index dc045e9..21e0385 100644 --- a/src/modes/ecb/ecb_encrypt.c +++ b/src/modes/ecb/ecb_encrypt.c @@ -53,3 +53,7 @@ int ecb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, s } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ecb/ecb_encrypt.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ecb/ecb_start.c b/src/modes/ecb/ecb_start.c index a8b6d45..f7baa81 100644 --- a/src/modes/ecb/ecb_start.c +++ b/src/modes/ecb/ecb_start.c @@ -42,3 +42,7 @@ int ecb_start(int cipher, const unsigned char *key, int keylen, int num_rounds, } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ecb/ecb_start.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ofb/ofb_decrypt.c b/src/modes/ofb/ofb_decrypt.c index f725410..cf5f19d 100644 --- a/src/modes/ofb/ofb_decrypt.c +++ b/src/modes/ofb/ofb_decrypt.c @@ -37,3 +37,7 @@ int ofb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, s #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ofb/ofb_decrypt.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ofb/ofb_done.c b/src/modes/ofb/ofb_done.c index ff72ddc..5e114f4 100644 --- a/src/modes/ofb/ofb_done.c +++ b/src/modes/ofb/ofb_done.c @@ -36,3 +36,7 @@ int ofb_done(symmetric_OFB *ofb) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ofb/ofb_done.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ofb/ofb_encrypt.c b/src/modes/ofb/ofb_encrypt.c index 4409ac8..d66979a 100644 --- a/src/modes/ofb/ofb_encrypt.c +++ b/src/modes/ofb/ofb_encrypt.c @@ -52,3 +52,7 @@ int ofb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, s } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ofb/ofb_encrypt.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ofb/ofb_getiv.c b/src/modes/ofb/ofb_getiv.c index eb8ef1e..f945fff 100644 --- a/src/modes/ofb/ofb_getiv.c +++ b/src/modes/ofb/ofb_getiv.c @@ -39,3 +39,7 @@ int ofb_getiv(unsigned char *IV, unsigned long *len, symmetric_OFB *ofb) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ofb/ofb_getiv.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ofb/ofb_setiv.c b/src/modes/ofb/ofb_setiv.c index 96b3f1c..f678601 100644 --- a/src/modes/ofb/ofb_setiv.c +++ b/src/modes/ofb/ofb_setiv.c @@ -47,3 +47,7 @@ int ofb_setiv(const unsigned char *IV, unsigned long len, symmetric_OFB *ofb) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ofb/ofb_setiv.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/modes/ofb/ofb_start.c b/src/modes/ofb/ofb_start.c index 977e6a3..083e381 100644 --- a/src/modes/ofb/ofb_start.c +++ b/src/modes/ofb/ofb_start.c @@ -54,3 +54,7 @@ int ofb_start(int cipher, const unsigned char *IV, const unsigned char *key, } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/modes/ofb/ofb_start.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/asn1/der/bit/der_decode_bit_string.c b/src/pk/asn1/der/bit/der_decode_bit_string.c new file mode 100644 index 0000000..da5b989 --- /dev/null +++ b/src/pk/asn1/der/bit/der_decode_bit_string.c @@ -0,0 +1,101 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_decode_bit_string.c + ASN.1 DER, encode a BIT STRING, Tom St Denis +*/ + + +#ifdef LTC_DER + +/** + Store a BIT STRING + @param in The DER encoded BIT STRING + @param inlen The size of the DER BIT STRING + @param out [out] The array of bits stored (one per char) + @param outlen [in/out] The number of bits stored + @return CRYPT_OK if successful +*/ +int der_decode_bit_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen) +{ + unsigned long dlen, blen, x, y; + + LTC_ARGCHK(in != NULL); + LTC_ARGCHK(out != NULL); + LTC_ARGCHK(outlen != NULL); + + /* packet must be at least 4 bytes */ + if (inlen < 4) { + return CRYPT_INVALID_ARG; + } + + /* check for 0x03 */ + if ((in[0]&0x1F) != 0x03) { + return CRYPT_INVALID_PACKET; + } + + /* offset in the data */ + x = 1; + + /* get the length of the data */ + if (in[x] & 0x80) { + /* long format get number of length bytes */ + y = in[x++] & 127; + + /* invalid if 0 or > 2 */ + if (y == 0 || y > 2) { + return CRYPT_INVALID_PACKET; + } + + /* read the data len */ + dlen = 0; + while (y--) { + dlen = (dlen << 8) | (unsigned long)in[x++]; + } + } else { + /* short format */ + dlen = in[x++] & 127; + } + + /* is the data len too long or too short? */ + if ((dlen == 0) || (dlen + x > inlen)) { + return CRYPT_INVALID_PACKET; + } + + /* get padding count */ + blen = ((dlen - 1) << 3) - (in[x++] & 7); + + /* too many bits? */ + if (blen > *outlen) { + return CRYPT_BUFFER_OVERFLOW; + } + + /* decode/store the bits */ + for (y = 0; y < blen; y++) { + out[y] = (in[x] & (1 << (7 - (y & 7)))) ? 1 : 0; + if ((y & 7) == 7) { + ++x; + } + } + + /* we done */ + *outlen = blen; + return CRYPT_OK; +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/bit/der_decode_bit_string.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/bit/der_encode_bit_string.c b/src/pk/asn1/der/bit/der_encode_bit_string.c new file mode 100644 index 0000000..569c15b --- /dev/null +++ b/src/pk/asn1/der/bit/der_encode_bit_string.c @@ -0,0 +1,87 @@ +/* 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://libtomcrypt.org + */ +#include "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, 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) { + 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++] = y; + } else if (y < 256) { + out[x++] = 0x81; + out[x++] = y; + } else if (y < 65536) { + out[x++] = 0x82; + out[x++] = (y>>8)&255; + out[x++] = y&255; + } + + /* store number of zero padding bits */ + out[x++] = (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.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/bit/der_length_bit_string.c b/src/pk/asn1/der/bit/der_length_bit_string.c new file mode 100644 index 0000000..dd6ea6d --- /dev/null +++ b/src/pk/asn1/der/bit/der_length_bit_string.c @@ -0,0 +1,54 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_length_bit_string.c + ASN.1 DER, get length of BIT STRING, Tom St Denis +*/ + +#ifdef LTC_DER +/** + Gets length of DER encoding of BIT STRING + @param nbits The number of bits in the string to encode + @param outlen [out] The length of the DER encoding for the given string + @return CRYPT_OK if successful +*/ +int der_length_bit_string(unsigned long nbits, unsigned long *outlen) +{ + unsigned long nbytes; + LTC_ARGCHK(outlen != NULL); + + /* get the number of the bytes */ + nbytes = (nbits >> 3) + ((nbits & 7) ? 1 : 0) + 1; + + if (nbytes < 128) { + /* 03 LL PP DD DD DD ... */ + *outlen = 2 + nbytes; + } else if (nbytes < 256) { + /* 03 81 LL PP DD DD DD ... */ + *outlen = 3 + nbytes; + } else if (nbytes < 65536) { + /* 03 82 LL LL PP DD DD DD ... */ + *outlen = 4 + nbytes; + } else { + return CRYPT_INVALID_ARG; + } + + return CRYPT_OK; +} + +#endif + + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/bit/der_length_bit_string.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/choice/der_decode_choice.c b/src/pk/asn1/der/choice/der_decode_choice.c new file mode 100644 index 0000000..61cba11 --- /dev/null +++ b/src/pk/asn1/der/choice/der_decode_choice.c @@ -0,0 +1,168 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_decode_choice.c + ASN.1 DER, decode a CHOICE, Tom St Denis +*/ + +#ifdef LTC_DER + +/** + Decode a CHOICE + @param in The DER encoded input + @param inlen [in/out] The size of the input and resulting size of read type + @param list The list of items to decode + @param outlen The number of items in the list + @return CRYPT_OK on success +*/ +int der_decode_choice(const unsigned char *in, unsigned long *inlen, + ltc_asn1_list *list, unsigned long outlen) +{ + unsigned long size, x, z; + void *data; + + LTC_ARGCHK(in != NULL); + LTC_ARGCHK(inlen != NULL); + LTC_ARGCHK(list != NULL); + + /* get blk size */ + if (*inlen < 2) { + return CRYPT_INVALID_PACKET; + } + + /* set all of the "used" flags to zero */ + for (x = 0; x < outlen; x++) { + list[x].used = 0; + } + + /* now scan until we have a winner */ + for (x = 0; x < outlen; x++) { + size = list[x].size; + data = list[x].data; + + switch (list[x].type) { + case LTC_ASN1_INTEGER: + if (der_decode_integer(in, *inlen, data) == CRYPT_OK) { + if (der_length_integer(data, &z) == CRYPT_OK) { + list[x].used = 1; + *inlen = z; + return CRYPT_OK; + } + } + break; + + case LTC_ASN1_SHORT_INTEGER: + if (der_decode_short_integer(in, *inlen, data) == CRYPT_OK) { + if (der_length_short_integer(size, &z) == CRYPT_OK) { + list[x].used = 1; + *inlen = z; + return CRYPT_OK; + } + } + break; + + case LTC_ASN1_BIT_STRING: + if (der_decode_bit_string(in, *inlen, data, &size) == CRYPT_OK) { + if (der_length_bit_string(size, &z) == CRYPT_OK) { + list[x].used = 1; + list[x].size = size; + *inlen = z; + return CRYPT_OK; + } + } + break; + + case LTC_ASN1_OCTET_STRING: + if (der_decode_octet_string(in, *inlen, data, &size) == CRYPT_OK) { + if (der_length_octet_string(size, &z) == CRYPT_OK) { + list[x].used = 1; + list[x].size = size; + *inlen = z; + return CRYPT_OK; + } + } + break; + + case LTC_ASN1_NULL: + if (*inlen == 2 && in[x] == 0x05 && in[x+1] == 0x00) { + *inlen = 2; + return CRYPT_OK; + } + break; + + case LTC_ASN1_OBJECT_IDENTIFIER: + if (der_decode_object_identifier(in, *inlen, data, &size) == CRYPT_OK) { + if (der_length_object_identifier(data, size, &z) == CRYPT_OK) { + list[x].used = 1; + list[x].size = size; + *inlen = z; + return CRYPT_OK; + } + } + break; + + case LTC_ASN1_IA5_STRING: + if (der_decode_ia5_string(in, *inlen, data, &size) == CRYPT_OK) { + if (der_length_ia5_string(data, size, &z) == CRYPT_OK) { + list[x].used = 1; + list[x].size = size; + *inlen = z; + return CRYPT_OK; + } + } + break; + + + case LTC_ASN1_PRINTABLE_STRING: + if (der_decode_printable_string(in, *inlen, data, &size) == CRYPT_OK) { + if (der_length_printable_string(data, size, &z) == CRYPT_OK) { + list[x].used = 1; + list[x].size = size; + *inlen = z; + return CRYPT_OK; + } + } + break; + + case LTC_ASN1_UTCTIME: + z = *inlen; + if (der_decode_utctime(in, &z, data) == CRYPT_OK) { + list[x].used = 1; + *inlen = z; + return CRYPT_OK; + } + break; + + case LTC_ASN1_SEQUENCE: + if (der_decode_sequence(in, *inlen, data, size) == CRYPT_OK) { + if (der_length_sequence(data, size, &z) == CRYPT_OK) { + list[x].used = 1; + *inlen = z; + return CRYPT_OK; + } + } + break; + + default: + return CRYPT_INVALID_ARG; + } + } + + return CRYPT_INVALID_PACKET; +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/choice/der_decode_choice.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/19 11:25:01 $ */ diff --git a/src/pk/asn1/der/der_get_multi_integer.c b/src/pk/asn1/der/der_get_multi_integer.c deleted file mode 100644 index 75ae0bc..0000000 --- a/src/pk/asn1/der/der_get_multi_integer.c +++ /dev/null @@ -1,67 +0,0 @@ -/* 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://libtomcrypt.org - */ -#include -#include "tomcrypt.h" - -/** - @file der_get_multi_integer.c - ASN.1 DER, read multiple integers, Tom St Denis -*/ - - -#ifdef LTC_DER - -/* will read multiple DER INTEGER encoded mp_ints from src - * of upto [inlen] bytes. It will store the number of bytes - * read back into [inlen]. - */ -/** - Read multiple mp_int integers one after another - @param src The DER encoded integers - @param inlen [in] The length of the src buffer, [out] the amount of bytes read - @param num The first mp_int to decode - @param ... A NULL terminated list of mp_ints to decode - @return CRYPT_OK if successful -*/ -int der_get_multi_integer(const unsigned char *src, unsigned long *inlen, - mp_int *num, ...) -{ - va_list args; - mp_int *next; - unsigned long wrote, len; - int err; - - LTC_ARGCHK(src != NULL); - LTC_ARGCHK(inlen != NULL); - - /* setup va list */ - next = num; - len = *inlen; - wrote = 0; - va_start(args, num); - - while (next != NULL) { - if ((err = der_decode_integer(src, inlen, next)) != CRYPT_OK) { - va_end(args); - return err; - } - wrote += *inlen; - src += *inlen; - len -= *inlen; - *inlen = len; - next = va_arg(args, mp_int*); - } - va_end(args); - *inlen = wrote; - return CRYPT_OK; -} - -#endif diff --git a/src/pk/asn1/der/der_put_multi_integer.c b/src/pk/asn1/der/der_put_multi_integer.c deleted file mode 100644 index af2ca88..0000000 --- a/src/pk/asn1/der/der_put_multi_integer.c +++ /dev/null @@ -1,67 +0,0 @@ -/* 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://libtomcrypt.org - */ -#include -#include "tomcrypt.h" - -/** - @file der_put_multi_integer.c - ASN.1 DER, store multiple integers, Tom St Denis -*/ - - -#ifdef LTC_DER - -/* store multiple mp_ints in DER INTEGER format to the out, will not - * overflow the length you give it [outlen] and store the number of - * bytes used in [outlen] - */ -/** - Store multiple mp_int integers one after another - @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 - @param num The first mp_int to encode - @param ... A NULL terminated list of mp_ints to encode - @return CRYPT_OK if successful -*/ -int der_put_multi_integer(unsigned char *out, unsigned long *outlen, - mp_int *num, ...) -{ - va_list args; - mp_int *next; - unsigned long wrote, len; - int err; - - LTC_ARGCHK(out != NULL); - LTC_ARGCHK(outlen != NULL); - - /* setup va list */ - next = num; - len = *outlen; - wrote = 0; - va_start(args, num); - - while (next != NULL) { - if ((err = der_encode_integer(next, out, outlen)) != CRYPT_OK) { - va_end(args); - return err; - } - wrote += *outlen; - out += *outlen; - len -= *outlen; - *outlen = len; - next = va_arg(args, mp_int*); - } - va_end(args); - *outlen = wrote; - return CRYPT_OK; -} - -#endif diff --git a/src/pk/asn1/der/ia5/der_decode_ia5_string.c b/src/pk/asn1/der/ia5/der_decode_ia5_string.c new file mode 100644 index 0000000..ac0a4af --- /dev/null +++ b/src/pk/asn1/der/ia5/der_decode_ia5_string.c @@ -0,0 +1,95 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_decode_ia5_string.c + ASN.1 DER, encode a IA5 STRING, Tom St Denis +*/ + + +#ifdef LTC_DER + +/** + Store a IA5 STRING + @param in The DER encoded IA5 STRING + @param inlen The size of the DER IA5 STRING + @param out [out] The array of octets stored (one per char) + @param outlen [in/out] The number of octets stored + @return CRYPT_OK if successful +*/ +int der_decode_ia5_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen) +{ + unsigned long x, y, len; + int t; + + LTC_ARGCHK(in != NULL); + LTC_ARGCHK(out != NULL); + LTC_ARGCHK(outlen != NULL); + + /* must have header at least */ + if (inlen < 2) { + return CRYPT_INVALID_PACKET; + } + + /* check for 0x16 */ + if ((in[0] & 0x1F) != 0x16) { + return CRYPT_INVALID_PACKET; + } + x = 1; + + /* decode the length */ + if (in[x] & 0x80) { + /* valid # of bytes in length are 1,2,3 */ + y = in[x] & 0x7F; + if ((y == 0) || (y > 3) || ((x + y) > inlen)) { + return CRYPT_INVALID_PACKET; + } + + /* read the length in */ + len = 0; + ++x; + while (y--) { + len = (len << 8) | in[x++]; + } + } else { + len = in[x++] & 0x7F; + } + + /* is it too long? */ + if (len > *outlen) { + return CRYPT_BUFFER_OVERFLOW; + } + + if (len + x > inlen) { + return CRYPT_INVALID_PACKET; + } + + /* read the data */ + for (y = 0; y < len; y++) { + t = der_ia5_value_decode(in[x++]); + if (t == -1) { + return CRYPT_INVALID_ARG; + } + out[y] = t; + } + + *outlen = y; + + return CRYPT_OK; +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/ia5/der_decode_ia5_string.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/ia5/der_encode_ia5_string.c b/src/pk/asn1/der/ia5/der_encode_ia5_string.c new file mode 100644 index 0000000..a79b46e --- /dev/null +++ b/src/pk/asn1/der/ia5/der_encode_ia5_string.c @@ -0,0 +1,84 @@ +/* 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://libtomcrypt.org + */ +#include "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) { + return CRYPT_BUFFER_OVERFLOW; + } + + /* encode the header+len */ + x = 0; + out[x++] = 0x16; + if (inlen < 128) { + out[x++] = inlen; + } else if (inlen < 256) { + out[x++] = 0x81; + out[x++] = inlen; + } else if (inlen < 65536UL) { + out[x++] = 0x82; + out[x++] = (inlen>>8)&255; + out[x++] = inlen&255; + } else if (inlen < 16777216UL) { + out[x++] = 0x83; + out[x++] = (inlen>>16)&255; + out[x++] = (inlen>>8)&255; + out[x++] = 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.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/ia5/der_length_ia5_string.c b/src/pk/asn1/der/ia5/der_length_ia5_string.c new file mode 100644 index 0000000..d07d630 --- /dev/null +++ b/src/pk/asn1/der/ia5/der_length_ia5_string.c @@ -0,0 +1,194 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_length_ia5_string.c + ASN.1 DER, get length of IA5 STRING, Tom St Denis +*/ + +#ifdef LTC_DER + +static const struct { + int code, value; +} ia5_table[] = { +{ '\0', 0 }, +{ '\a', 7 }, +{ '\b', 8 }, +{ '\t', 9 }, +{ '\n', 10 }, +{ '\f', 12 }, +{ '\r', 13 }, +{ ' ', 32 }, +{ '!', 33 }, +{ '"', 34 }, +{ '#', 35 }, +{ '$', 36 }, +{ '%', 37 }, +{ '&', 38 }, +{ '\'', 39 }, +{ '(', 40 }, +{ ')', 41 }, +{ '*', 42 }, +{ '+', 43 }, +{ ',', 44 }, +{ '-', 45 }, +{ '.', 46 }, +{ '/', 47 }, +{ '0', 48 }, +{ '1', 49 }, +{ '2', 50 }, +{ '3', 51 }, +{ '4', 52 }, +{ '5', 53 }, +{ '6', 54 }, +{ '7', 55 }, +{ '8', 56 }, +{ '9', 57 }, +{ ':', 58 }, +{ ';', 59 }, +{ '<', 60 }, +{ '=', 61 }, +{ '>', 62 }, +{ '?', 63 }, +{ '@', 64 }, +{ 'A', 65 }, +{ 'B', 66 }, +{ 'C', 67 }, +{ 'D', 68 }, +{ 'E', 69 }, +{ 'F', 70 }, +{ 'G', 71 }, +{ 'H', 72 }, +{ 'I', 73 }, +{ 'J', 74 }, +{ 'K', 75 }, +{ 'L', 76 }, +{ 'M', 77 }, +{ 'N', 78 }, +{ 'O', 79 }, +{ 'P', 80 }, +{ 'Q', 81 }, +{ 'R', 82 }, +{ 'S', 83 }, +{ 'T', 84 }, +{ 'U', 85 }, +{ 'V', 86 }, +{ 'W', 87 }, +{ 'X', 88 }, +{ 'Y', 89 }, +{ 'Z', 90 }, +{ '[', 91 }, +{ '\\', 92 }, +{ ']', 93 }, +{ '^', 94 }, +{ '_', 95 }, +{ '`', 96 }, +{ 'a', 97 }, +{ 'b', 98 }, +{ 'c', 99 }, +{ 'd', 100 }, +{ 'e', 101 }, +{ 'f', 102 }, +{ 'g', 103 }, +{ 'h', 104 }, +{ 'i', 105 }, +{ 'j', 106 }, +{ 'k', 107 }, +{ 'l', 108 }, +{ 'm', 109 }, +{ 'n', 110 }, +{ 'o', 111 }, +{ 'p', 112 }, +{ 'q', 113 }, +{ 'r', 114 }, +{ 's', 115 }, +{ 't', 116 }, +{ 'u', 117 }, +{ 'v', 118 }, +{ 'w', 119 }, +{ 'x', 120 }, +{ 'y', 121 }, +{ 'z', 122 }, +{ '{', 123 }, +{ '|', 124 }, +{ '}', 125 }, +{ '~', 126 } +}; + +int der_ia5_char_encode(int c) +{ + int x; + for (x = 0; x < (int)(sizeof(ia5_table)/sizeof(ia5_table[0])); x++) { + if (ia5_table[x].code == c) { + return ia5_table[x].value; + } + } + return -1; +} + +int der_ia5_value_decode(int v) +{ + int x; + for (x = 0; x < (int)(sizeof(ia5_table)/sizeof(ia5_table[0])); x++) { + if (ia5_table[x].value == v) { + return ia5_table[x].code; + } + } + return -1; +} + +/** + Gets length of DER encoding of IA5 STRING + @param octets The values you want to encode + @param noctets The number of octets in the string to encode + @param outlen [out] The length of the DER encoding for the given string + @return CRYPT_OK if successful +*/ +int der_length_ia5_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen) +{ + unsigned long x; + + LTC_ARGCHK(outlen != NULL); + LTC_ARGCHK(octets != NULL); + + /* scan string for validity */ + for (x = 0; x < noctets; x++) { + if (der_ia5_char_encode(octets[x]) == -1) { + return CRYPT_INVALID_ARG; + } + } + + if (noctets < 128) { + /* 16 LL DD DD DD ... */ + *outlen = 2 + noctets; + } else if (noctets < 256) { + /* 16 81 LL DD DD DD ... */ + *outlen = 3 + noctets; + } else if (noctets < 65536UL) { + /* 16 82 LL LL DD DD DD ... */ + *outlen = 4 + noctets; + } else if (noctets < 16777216UL) { + /* 16 83 LL LL LL DD DD DD ... */ + *outlen = 5 + noctets; + } else { + return CRYPT_INVALID_ARG; + } + + return CRYPT_OK; +} + +#endif + + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/ia5/der_length_ia5_string.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/der_decode_integer.c b/src/pk/asn1/der/integer/der_decode_integer.c similarity index 52% rename from src/pk/asn1/der/der_decode_integer.c rename to src/pk/asn1/der/integer/der_decode_integer.c index b798bd4..e68b2c9 100644 --- a/src/pk/asn1/der/der_decode_integer.c +++ b/src/pk/asn1/der/integer/der_decode_integer.c @@ -18,81 +18,93 @@ #ifdef LTC_DER -/* decodes a DER INTEGER in [in]. You have to tell this function - * how many bytes are available [inlen]. It will then attempt to - * read the INTEGER. If all goes well it stores the number of bytes - * read in [inlen] and the number in [num]. - */ /** Read a mp_int integer @param in The DER encoded data - @param inlen [in] Size of the in data, [out] number of bytes read + @param inlen Size of DER encoded data @param num The first mp_int to decode @return CRYPT_OK if successful */ -int der_decode_integer(const unsigned char *in, unsigned long *inlen, mp_int *num) +int der_decode_integer(const unsigned char *in, unsigned long inlen, mp_int *num) { - unsigned long tmplen, y, z; + unsigned long x, y, z; + int err; LTC_ARGCHK(num != NULL); LTC_ARGCHK(in != NULL); - LTC_ARGCHK(inlen != NULL); - - /* save copy of max output size */ - tmplen = *inlen; - *inlen = 0; /* min DER INTEGER is 0x02 01 00 == 0 */ - if (tmplen < (1 + 1 + 1)) { + if (inlen < (1 + 1 + 1)) { return CRYPT_INVALID_PACKET; } - /* ok expect 0x02 when we AND with 0011 1111 [3F] */ - if ((*in++ & 0x3F) != 0x02) { + /* ok expect 0x02 when we AND with 0001 1111 [1F] */ + x = 0; + if ((in[x++] & 0x1F) != 0x02) { return CRYPT_INVALID_PACKET; } - ++(*inlen); /* now decode the len stuff */ - z = *in++; - ++(*inlen); + z = in[x++]; if ((z & 0x80) == 0x00) { /* short form */ /* will it overflow? */ - if (*inlen + z > tmplen) { + if (x + z > inlen) { return CRYPT_INVALID_PACKET; } /* no so read it */ - (*inlen) += z; - return mpi_to_ltc_error(mp_read_unsigned_bin(num, (unsigned char *)in, z)); + if ((err = mpi_to_ltc_error(mp_read_unsigned_bin(num, (unsigned char *)in + x, z))) != CRYPT_OK) { + return err; + } } else { /* long form */ z &= 0x7F; /* will number of length bytes overflow? (or > 4) */ - if (((*inlen + z) > tmplen) || (z > 4)) { + if (((x + z) > inlen) || (z > 4) || (z == 0)) { return CRYPT_INVALID_PACKET; } /* now read it in */ y = 0; while (z--) { - y = ((unsigned long)(*in++)) | (y << 8); - ++(*inlen); + y = ((unsigned long)(in[x++])) | (y << 8); } /* now will reading y bytes overrun? */ - if ((*inlen + y) > tmplen) { + if ((x + y) > inlen) { return CRYPT_INVALID_PACKET; } /* no so read it */ - (*inlen) += y; - return mpi_to_ltc_error(mp_read_unsigned_bin(num, (unsigned char *)in, y)); + if ((err = mpi_to_ltc_error(mp_read_unsigned_bin(num, (unsigned char *)in + x, y))) != CRYPT_OK) { + return err; + } } + + /* see if it's negative */ + if (in[x] & 0x80) { + mp_int tmp; + if (mp_init(&tmp) != MP_OKAY) { + return CRYPT_MEM; + } + + if (mp_2expt(&tmp, mp_count_bits(num)) != MP_OKAY || mp_sub(num, &tmp, num) != MP_OKAY) { + mp_clear(&tmp); + return CRYPT_MEM; + } + mp_clear(&tmp); + } + + return CRYPT_OK; + } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/integer/der_decode_integer.c,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/06/01 00:06:05 $ */ diff --git a/src/pk/asn1/der/der_encode_integer.c b/src/pk/asn1/der/integer/der_encode_integer.c similarity index 53% rename from src/pk/asn1/der/der_encode_integer.c rename to src/pk/asn1/der/integer/der_encode_integer.c index c5c5267..f0f41be 100644 --- a/src/pk/asn1/der/der_encode_integer.c +++ b/src/pk/asn1/der/integer/der_encode_integer.c @@ -28,7 +28,7 @@ */ int der_encode_integer(mp_int *num, unsigned char *out, unsigned long *outlen) { - unsigned long tmplen, x, y, z; + unsigned long tmplen, y; int err, leading_zero; LTC_ARGCHK(num != NULL); @@ -44,48 +44,43 @@ int der_encode_integer(mp_int *num, unsigned char *out, unsigned long *outlen) return CRYPT_BUFFER_OVERFLOW; } - /* we only need a leading zero if the msb of the first byte is one */ - if ((mp_count_bits(num) & 7) == 7 || mp_iszero(num) == MP_YES) { - leading_zero = 1; + if (mp_cmp_d(num, 0) != 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) == 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; - /* get length of num in bytes (plus 1 since we force the msbyte to zero) */ - y = mp_unsigned_bin_size(num) + leading_zero; + } /* now store initial data */ *out++ = 0x02; if (y < 128) { /* short form */ *out++ = (unsigned char)y; + } else if (y < 256) { + *out++ = 0x81; + *out++ = y; + } else if (y < 65536UL) { + *out++ = 0x82; + *out++ = (y>>8)&255; + *out++ = y; + } else if (y < 16777216UL) { + *out++ = 0x83; + *out++ = (y>>16)&255; + *out++ = (y>>8)&255; + *out++ = y; } else { - /* long form (relies on y != 0) */ - - /* get length of length... ;-) */ - x = y; - z = 0; - while (x) { - ++z; - x >>= 8; - } - - /* store length of length */ - *out++ = 0x80 | ((unsigned char)z); - - /* now store length */ - - /* first shift length up so msbyte != 0 */ - x = y; - while ((x & 0xFF000000) == 0) { - x <<= 8; - } - - /* now store length */ - while (z--) { - *out++ = (unsigned char)((x >> 24) & 0xFF); - x <<= 8; - } + return CRYPT_INVALID_ARG; } /* now store msbyte of zero if num is non-zero */ @@ -94,11 +89,31 @@ int der_encode_integer(mp_int *num, unsigned char *out, unsigned long *outlen) } /* if it's not zero store it as big endian */ - if (mp_iszero(num) == MP_NO) { + if (mp_cmp_d(num, 0) == MP_GT) { /* now store the mpint */ if ((err = mp_to_unsigned_bin(num, out)) != MP_OKAY) { return mpi_to_ltc_error(err); } + } else if (mp_iszero(num) != MP_YES) { + mp_int tmp; + /* negative */ + if (mp_init(&tmp) != MP_OKAY) { + return CRYPT_MEM; + } + + /* 2^roundup and subtract */ + y = mp_count_bits(num); + y = y + (8 - (y & 7)); + if (mp_2expt(&tmp, y) != MP_OKAY || mp_add(&tmp, num, &tmp) != MP_OKAY) { + mp_clear(&tmp); + return CRYPT_MEM; + } + + if ((err = mp_to_unsigned_bin(&tmp, out)) != MP_OKAY) { + mp_clear(&tmp); + return mpi_to_ltc_error(err); + } + mp_clear(&tmp); } /* we good */ @@ -107,3 +122,7 @@ int der_encode_integer(mp_int *num, unsigned char *out, unsigned long *outlen) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/integer/der_encode_integer.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/der_length_integer.c b/src/pk/asn1/der/integer/der_length_integer.c similarity index 57% rename from src/pk/asn1/der/der_length_integer.c rename to src/pk/asn1/der/integer/der_length_integer.c index f86738a..1bfee45 100644 --- a/src/pk/asn1/der/der_length_integer.c +++ b/src/pk/asn1/der/integer/der_length_integer.c @@ -31,25 +31,33 @@ int der_length_integer(mp_int *num, unsigned long *outlen) LTC_ARGCHK(num != NULL); LTC_ARGCHK(outlen != NULL); - /* we only need a leading zero if the msb of the first byte is one */ - if ((mp_count_bits(num) & 7) == 7 || mp_iszero(num) == MP_YES) { - leading_zero = 1; + if (mp_cmp_d(num, 0) != MP_LT) { + /* positive */ + + /* 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) == MP_YES) { + leading_zero = 1; + } else { + leading_zero = 0; + } + + /* size for bignum */ + z = len = leading_zero + mp_unsigned_bin_size(num); } else { + /* it's negative */ + /* find power of 2 that is a multiple of eight and greater than count bits */ leading_zero = 0; + z = mp_count_bits(num); + z = z + (8 - (z & 7)); + len = z = z >> 3; } - /* size for bignum */ - z = len = leading_zero + mp_unsigned_bin_size(num); - - /* we need a 0x02 */ - ++len; - /* now we need a length */ if (z < 128) { /* short form */ ++len; } else { - /* long form (relies on z != 0) */ + /* long form (relies on z != 0), assumes length bytes < 128 */ ++len; while (z) { @@ -58,8 +66,16 @@ int der_length_integer(mp_int *num, unsigned long *outlen) } } + /* we need a 0x02 to indicate it's INTEGER */ + ++len; + + /* return length */ *outlen = len; return CRYPT_OK; } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/integer/der_length_integer.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/object_identifier/der_decode_object_identifier.c b/src/pk/asn1/der/object_identifier/der_decode_object_identifier.c new file mode 100644 index 0000000..c69c9a3 --- /dev/null +++ b/src/pk/asn1/der/object_identifier/der_decode_object_identifier.c @@ -0,0 +1,99 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_decode_object_identifier.c + ASN.1 DER, Decode Object Identifier, Tom St Denis +*/ + +#ifdef LTC_DER +/** + Decode OID data and store the array of integers in words + @param in The OID DER encoded data + @param inlen The length of the OID data + @param words [out] The destination of the OID words + @param outlen [in/out] The number of OID words + @return CRYPT_OK if successful +*/ +int der_decode_object_identifier(const unsigned char *in, unsigned long inlen, + unsigned long *words, unsigned long *outlen) +{ + unsigned long x, y, t, len; + + LTC_ARGCHK(in != NULL); + LTC_ARGCHK(words != NULL); + LTC_ARGCHK(outlen != NULL); + + /* header is at least 3 bytes */ + if (inlen < 3) { + return CRYPT_INVALID_PACKET; + } + + /* must be room for at least two words */ + if (*outlen < 2) { + return CRYPT_BUFFER_OVERFLOW; + } + + /* decode the packet header */ + x = 0; + if ((in[x++] & 0x1F) != 0x06) { + return CRYPT_INVALID_PACKET; + } + + /* get the length */ + if (in[x] < 128) { + len = in[x++]; + } else { + if (in[x] < 0x81 || in[x] > 0x82) { + return CRYPT_INVALID_PACKET; + } + y = in[x++] & 0x7F; + len = 0; + while (y--) { + len = (len << 8) | (unsigned long)in[x++]; + } + } + + if (len < 1 || (len + x) > inlen) { + return CRYPT_INVALID_PACKET; + } + + /* decode word1 and word2 */ + --len; + t = in[x++]; + words[0] = t/40; + words[1] = t%40; + + /* decode rest */ + y = 2; + t = 0; + while (len--) { + t = (t << 7) | (in[x] & 0x7F); + if (!(in[x++] & 0x80)) { + /* store t */ + if (y >= *outlen) { + return CRYPT_BUFFER_OVERFLOW; + } + words[y++] = t; + t = 0; + } + } + + *outlen = y; + return CRYPT_OK; +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/object_identifier/der_decode_object_identifier.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/object_identifier/der_encode_object_identifier.c b/src/pk/asn1/der/object_identifier/der_encode_object_identifier.c new file mode 100644 index 0000000..16eb112 --- /dev/null +++ b/src/pk/asn1/der/object_identifier/der_encode_object_identifier.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://libtomcrypt.org + */ +#include "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; + 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) { + return CRYPT_BUFFER_OVERFLOW; + } + + /* compute length to store OID data */ + z = 1; + for (y = 2; y < nwords; y++) { + t = der_object_identifier_bits(words[y]); + z += t/7 + ((t%7) ? 1 : 0); + } + + /* store header + length */ + x = 0; + out[x++] = 0x06; + if (z < 128) { + out[x++] = z; + } else if (z < 256) { + out[x++] = 0x81; + out[x++] = z; + } else if (z < 65536UL) { + out[x++] = 0x82; + out[x++] = (z>>8)&255; + out[x++] = z&255; + } else { + return CRYPT_INVALID_ARG; + } + + /* store first byte */ + out[x++] = words[0] * 40 + words[1]; + + for (i = 2; i < nwords; i++) { + /* store 7 bit words in little endian */ + t = words[i] & 0xFFFFFFFF; + if (t) { + y = x; + mask = 0; + while (t) { + out[x++] = (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] = t; + ++y; + --z; + } + } else { + /* zero word */ + out[x++] = 0x00; + } + } + + *outlen = x; + return CRYPT_OK; +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/object_identifier/der_encode_object_identifier.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/object_identifier/der_length_object_identifier.c b/src/pk/asn1/der/object_identifier/der_length_object_identifier.c new file mode 100644 index 0000000..d03d1a7 --- /dev/null +++ b/src/pk/asn1/der/object_identifier/der_length_object_identifier.c @@ -0,0 +1,84 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_length_object_identifier.c + ASN.1 DER, get length of Object Identifier, Tom St Denis +*/ + +#ifdef LTC_DER + +unsigned long der_object_identifier_bits(unsigned long x) +{ + unsigned long c; + x &= 0xFFFFFFFF; + c = 0; + while (x) { + ++c; + x >>= 1; + } + return c; +} + + +/** + Gets length of DER encoding of Object Identifier + @param nwords The number of OID words + @param words The actual OID words to get the size of + @param outlen [out] The length of the DER encoding for the given string + @return CRYPT_OK if successful +*/ +int der_length_object_identifier(unsigned long *words, unsigned long nwords, unsigned long *outlen) +{ + unsigned long y, z, t; + + LTC_ARGCHK(words != NULL); + LTC_ARGCHK(outlen != NULL); + + + /* must be >= 2 words */ + if (nwords < 2) { + return CRYPT_INVALID_ARG; + } + + /* word1 = 0,1,2 and word2 0..39 */ + if (words[0] > 2 || words[1] > 39) { + return CRYPT_INVALID_ARG; + } + + /* leading byte of first two words */ + z = 1; + for (y = 2; y < nwords; y++) { + t = der_object_identifier_bits(words[y]); + z += t/7 + ((t%7) ? 1 : 0); + } + + /* now depending on the length our length encoding changes */ + if (z < 128) { + z += 2; + } else if (z < 256) { + z += 3; + } else if (z < 65536UL) { + z += 4; + } else { + return CRYPT_INVALID_ARG; + } + + *outlen = z; + return CRYPT_OK; +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/object_identifier/der_length_object_identifier.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/octet/der_decode_octet_string.c b/src/pk/asn1/der/octet/der_decode_octet_string.c new file mode 100644 index 0000000..2d3800f --- /dev/null +++ b/src/pk/asn1/der/octet/der_decode_octet_string.c @@ -0,0 +1,90 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_decode_octet_string.c + ASN.1 DER, encode a OCTET STRING, Tom St Denis +*/ + + +#ifdef LTC_DER + +/** + Store a OCTET STRING + @param in The DER encoded OCTET STRING + @param inlen The size of the DER OCTET STRING + @param out [out] The array of octets stored (one per char) + @param outlen [in/out] The number of octets stored + @return CRYPT_OK if successful +*/ +int der_decode_octet_string(const unsigned char *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); + + /* must have header at least */ + if (inlen < 2) { + return CRYPT_INVALID_PACKET; + } + + /* check for 0x04 */ + if ((in[0] & 0x1F) != 0x04) { + return CRYPT_INVALID_PACKET; + } + x = 1; + + /* decode the length */ + if (in[x] & 0x80) { + /* valid # of bytes in length are 1,2,3 */ + y = in[x] & 0x7F; + if ((y == 0) || (y > 3) || ((x + y) > inlen)) { + return CRYPT_INVALID_PACKET; + } + + /* read the length in */ + len = 0; + ++x; + while (y--) { + len = (len << 8) | in[x++]; + } + } else { + len = in[x++] & 0x7F; + } + + /* is it too long? */ + if (len > *outlen) { + return CRYPT_BUFFER_OVERFLOW; + } + + if (len + x > inlen) { + return CRYPT_INVALID_PACKET; + } + + /* read the data */ + for (y = 0; y < len; y++) { + out[y] = in[x++]; + } + + *outlen = y; + + return CRYPT_OK; +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/octet/der_decode_octet_string.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/octet/der_encode_octet_string.c b/src/pk/asn1/der/octet/der_encode_octet_string.c new file mode 100644 index 0000000..f34b708 --- /dev/null +++ b/src/pk/asn1/der/octet/der_encode_octet_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://libtomcrypt.org + */ +#include "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) { + return CRYPT_BUFFER_OVERFLOW; + } + + /* encode the header+len */ + x = 0; + out[x++] = 0x04; + if (inlen < 128) { + out[x++] = inlen; + } else if (inlen < 256) { + out[x++] = 0x81; + out[x++] = inlen; + } else if (inlen < 65536UL) { + out[x++] = 0x82; + out[x++] = (inlen>>8)&255; + out[x++] = inlen&255; + } else if (inlen < 16777216UL) { + out[x++] = 0x83; + out[x++] = (inlen>>16)&255; + out[x++] = (inlen>>8)&255; + out[x++] = 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.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/octet/der_length_octet_string.c b/src/pk/asn1/der/octet/der_length_octet_string.c new file mode 100644 index 0000000..9a0bed3 --- /dev/null +++ b/src/pk/asn1/der/octet/der_length_octet_string.c @@ -0,0 +1,53 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_length_octet_string.c + ASN.1 DER, get length of OCTET STRING, Tom St Denis +*/ + +#ifdef LTC_DER +/** + Gets length of DER encoding of OCTET STRING + @param noctets The number of octets in the string to encode + @param outlen [out] The length of the DER encoding for the given string + @return CRYPT_OK if successful +*/ +int der_length_octet_string(unsigned long noctets, unsigned long *outlen) +{ + LTC_ARGCHK(outlen != NULL); + + if (noctets < 128) { + /* 04 LL DD DD DD ... */ + *outlen = 2 + noctets; + } else if (noctets < 256) { + /* 04 81 LL DD DD DD ... */ + *outlen = 3 + noctets; + } else if (noctets < 65536UL) { + /* 04 82 LL LL DD DD DD ... */ + *outlen = 4 + noctets; + } else if (noctets < 16777216UL) { + /* 04 83 LL LL LL DD DD DD ... */ + *outlen = 5 + noctets; + } else { + return CRYPT_INVALID_ARG; + } + + return CRYPT_OK; +} + +#endif + + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/octet/der_length_octet_string.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/16 15:08:11 $ */ diff --git a/src/pk/asn1/der/printable_string/der_decode_printable_string.c b/src/pk/asn1/der/printable_string/der_decode_printable_string.c new file mode 100644 index 0000000..cbc9239 --- /dev/null +++ b/src/pk/asn1/der/printable_string/der_decode_printable_string.c @@ -0,0 +1,95 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_decode_printable_string.c + ASN.1 DER, encode a printable STRING, Tom St Denis +*/ + + +#ifdef LTC_DER + +/** + Store a printable STRING + @param in The DER encoded printable STRING + @param inlen The size of the DER printable STRING + @param out [out] The array of octets stored (one per char) + @param outlen [in/out] The number of octets stored + @return CRYPT_OK if successful +*/ +int der_decode_printable_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen) +{ + unsigned long x, y, len; + int t; + + LTC_ARGCHK(in != NULL); + LTC_ARGCHK(out != NULL); + LTC_ARGCHK(outlen != NULL); + + /* must have header at least */ + if (inlen < 2) { + return CRYPT_INVALID_PACKET; + } + + /* check for 0x13 */ + if ((in[0] & 0x1F) != 0x13) { + return CRYPT_INVALID_PACKET; + } + x = 1; + + /* decode the length */ + if (in[x] & 0x80) { + /* valid # of bytes in length are 1,2,3 */ + y = in[x] & 0x7F; + if ((y == 0) || (y > 3) || ((x + y) > inlen)) { + return CRYPT_INVALID_PACKET; + } + + /* read the length in */ + len = 0; + ++x; + while (y--) { + len = (len << 8) | in[x++]; + } + } else { + len = in[x++] & 0x7F; + } + + /* is it too long? */ + if (len > *outlen) { + return CRYPT_BUFFER_OVERFLOW; + } + + if (len + x > inlen) { + return CRYPT_INVALID_PACKET; + } + + /* read the data */ + for (y = 0; y < len; y++) { + t = der_printable_value_decode(in[x++]); + if (t == -1) { + return CRYPT_INVALID_ARG; + } + out[y] = t; + } + + *outlen = y; + + return CRYPT_OK; +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/printable_string/der_decode_printable_string.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/21 02:29:54 $ */ diff --git a/src/pk/asn1/der/printable_string/der_encode_printable_string.c b/src/pk/asn1/der/printable_string/der_encode_printable_string.c new file mode 100644 index 0000000..ab4e8bf --- /dev/null +++ b/src/pk/asn1/der/printable_string/der_encode_printable_string.c @@ -0,0 +1,84 @@ +/* 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://libtomcrypt.org + */ +#include "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) { + return CRYPT_BUFFER_OVERFLOW; + } + + /* encode the header+len */ + x = 0; + out[x++] = 0x13; + if (inlen < 128) { + out[x++] = inlen; + } else if (inlen < 256) { + out[x++] = 0x81; + out[x++] = inlen; + } else if (inlen < 65536UL) { + out[x++] = 0x82; + out[x++] = (inlen>>8)&255; + out[x++] = inlen&255; + } else if (inlen < 16777216UL) { + out[x++] = 0x83; + out[x++] = (inlen>>16)&255; + out[x++] = (inlen>>8)&255; + out[x++] = 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.1 $ */ +/* $Date: 2005/05/21 02:29:54 $ */ diff --git a/src/pk/asn1/der/printable_string/der_length_printable_string.c b/src/pk/asn1/der/printable_string/der_length_printable_string.c new file mode 100644 index 0000000..34065f2 --- /dev/null +++ b/src/pk/asn1/der/printable_string/der_length_printable_string.c @@ -0,0 +1,166 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_length_printable_string.c + ASN.1 DER, get length of Printable STRING, Tom St Denis +*/ + +#ifdef LTC_DER + +static const struct { + int code, value; +} printable_table[] = { +{ ' ', 32 }, +{ '\'', 39 }, +{ '(', 40 }, +{ ')', 41 }, +{ '+', 43 }, +{ ',', 44 }, +{ '-', 45 }, +{ '.', 46 }, +{ '/', 47 }, +{ '0', 48 }, +{ '1', 49 }, +{ '2', 50 }, +{ '3', 51 }, +{ '4', 52 }, +{ '5', 53 }, +{ '6', 54 }, +{ '7', 55 }, +{ '8', 56 }, +{ '9', 57 }, +{ ':', 58 }, +{ '=', 61 }, +{ '?', 63 }, +{ 'A', 65 }, +{ 'B', 66 }, +{ 'C', 67 }, +{ 'D', 68 }, +{ 'E', 69 }, +{ 'F', 70 }, +{ 'G', 71 }, +{ 'H', 72 }, +{ 'I', 73 }, +{ 'J', 74 }, +{ 'K', 75 }, +{ 'L', 76 }, +{ 'M', 77 }, +{ 'N', 78 }, +{ 'O', 79 }, +{ 'P', 80 }, +{ 'Q', 81 }, +{ 'R', 82 }, +{ 'S', 83 }, +{ 'T', 84 }, +{ 'U', 85 }, +{ 'V', 86 }, +{ 'W', 87 }, +{ 'X', 88 }, +{ 'Y', 89 }, +{ 'Z', 90 }, +{ 'a', 97 }, +{ 'b', 98 }, +{ 'c', 99 }, +{ 'd', 100 }, +{ 'e', 101 }, +{ 'f', 102 }, +{ 'g', 103 }, +{ 'h', 104 }, +{ 'i', 105 }, +{ 'j', 106 }, +{ 'k', 107 }, +{ 'l', 108 }, +{ 'm', 109 }, +{ 'n', 110 }, +{ 'o', 111 }, +{ 'p', 112 }, +{ 'q', 113 }, +{ 'r', 114 }, +{ 's', 115 }, +{ 't', 116 }, +{ 'u', 117 }, +{ 'v', 118 }, +{ 'w', 119 }, +{ 'x', 120 }, +{ 'y', 121 }, +{ 'z', 122 }, +}; + +int der_printable_char_encode(int c) +{ + int x; + for (x = 0; x < (int)(sizeof(printable_table)/sizeof(printable_table[0])); x++) { + if (printable_table[x].code == c) { + return printable_table[x].value; + } + } + return -1; +} + +int der_printable_value_decode(int v) +{ + int x; + for (x = 0; x < (int)(sizeof(printable_table)/sizeof(printable_table[0])); x++) { + if (printable_table[x].value == v) { + return printable_table[x].code; + } + } + return -1; +} + +/** + Gets length of DER encoding of Printable STRING + @param octets The values you want to encode + @param noctets The number of octets in the string to encode + @param outlen [out] The length of the DER encoding for the given string + @return CRYPT_OK if successful +*/ +int der_length_printable_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen) +{ + unsigned long x; + + LTC_ARGCHK(outlen != NULL); + LTC_ARGCHK(octets != NULL); + + /* scan string for validity */ + for (x = 0; x < noctets; x++) { + if (der_printable_char_encode(octets[x]) == -1) { + return CRYPT_INVALID_ARG; + } + } + + if (noctets < 128) { + /* 16 LL DD DD DD ... */ + *outlen = 2 + noctets; + } else if (noctets < 256) { + /* 16 81 LL DD DD DD ... */ + *outlen = 3 + noctets; + } else if (noctets < 65536UL) { + /* 16 82 LL LL DD DD DD ... */ + *outlen = 4 + noctets; + } else if (noctets < 16777216UL) { + /* 16 83 LL LL LL DD DD DD ... */ + *outlen = 5 + noctets; + } else { + return CRYPT_INVALID_ARG; + } + + return CRYPT_OK; +} + +#endif + + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/printable_string/der_length_printable_string.c,v $ */ +/* $Revision: 1.1 $ */ +/* $Date: 2005/05/21 02:29:54 $ */ diff --git a/src/pk/asn1/der/sequence/der_decode_sequence.c b/src/pk/asn1/der/sequence/der_decode_sequence.c new file mode 100644 index 0000000..335a882 --- /dev/null +++ b/src/pk/asn1/der/sequence/der_decode_sequence.c @@ -0,0 +1,234 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" +#include + + +/** + @file der_decode_sequence.c + ASN.1 DER, decode a SEQUENCE, Tom St Denis +*/ + +#ifdef LTC_DER + +/** + Decode a SEQUENCE + @param in The DER encoded input + @param inlen The size of the input + @param list The list of items to decode + @param outlen The number of items in the list + @return CRYPT_OK on success +*/ +int der_decode_sequence(const unsigned char *in, unsigned long inlen, + ltc_asn1_list *list, unsigned long outlen) +{ + int err, type; + unsigned long size, x, y, z, i, blksize; + void *data; + + LTC_ARGCHK(in != NULL); + LTC_ARGCHK(list != NULL); + + /* get blk size */ + if (inlen < 2) { + return CRYPT_INVALID_PACKET; + } + + /* sequence type? */ + x = 0; + if (in[x++] != 0x30) { + return CRYPT_INVALID_PACKET; + } + + if (in[x] < 128) { + blksize = in[x++]; + } else if (in[x] & 0x80) { + if (in[x] < 0x81 || in[x] > 0x83) { + return CRYPT_INVALID_PACKET; + } + y = in[x++] & 0x7F; + + /* would reading the len bytes overrun? */ + if (x + y > inlen) { + return CRYPT_INVALID_PACKET; + } + + /* read len */ + blksize = 0; + while (y--) { + blksize = (blksize << 8) | (unsigned long)in[x++]; + } + } + + /* would this blksize overflow? */ + if (x + blksize > inlen) { + return CRYPT_INVALID_PACKET; + } + + /* ok read data */ + inlen = blksize; + for (i = 0; i < outlen; i++) { + type = list[i].type; + size = list[i].size; + data = list[i].data; + + if (type == LTC_ASN1_EOL) { + break; + } + + switch (type) { + case LTC_ASN1_INTEGER: + z = inlen; + if ((err = der_decode_integer(in + x, z, data)) != CRYPT_OK) { + goto LBL_ERR; + } + if ((err = der_length_integer(data, &z)) != CRYPT_OK) { + goto LBL_ERR; + } + x += z; + inlen -= z; + break; + + + case LTC_ASN1_SHORT_INTEGER: + z = inlen; + if ((err = der_decode_short_integer(in + x, z, data)) != CRYPT_OK) { + goto LBL_ERR; + } + if ((err = der_length_short_integer(size, &z)) != CRYPT_OK) { + goto LBL_ERR; + } + x += z; + inlen -= z; + break; + + case LTC_ASN1_BIT_STRING: + z = inlen; + if ((err = der_decode_bit_string(in + x, z, data, &size)) != CRYPT_OK) { + goto LBL_ERR; + } + list[i].size = size; + if ((err = der_length_bit_string(size, &z)) != CRYPT_OK) { + goto LBL_ERR; + } + x += z; + inlen -= z; + break; + + case LTC_ASN1_OCTET_STRING: + z = inlen; + if ((err = der_decode_octet_string(in + x, z, data, &size)) != CRYPT_OK) { + goto LBL_ERR; + } + list[i].size = size; + if ((err = der_length_octet_string(size, &z)) != CRYPT_OK) { + goto LBL_ERR; + } + x += z; + inlen -= z; + break; + + case LTC_ASN1_NULL: + if (inlen < 2 || in[x] != 0x05 || in[x+1] != 0x00) { + err = CRYPT_INVALID_PACKET; + goto LBL_ERR; + } + x += 2; + inlen -= 2; + break; + + case LTC_ASN1_OBJECT_IDENTIFIER: + z = inlen; + if ((err = der_decode_object_identifier(in + x, z, data, &size)) != CRYPT_OK) { + goto LBL_ERR; + } + list[i].size = size; + if ((err = der_length_object_identifier(data, size, &z)) != CRYPT_OK) { + goto LBL_ERR; + } + x += z; + inlen -= z; + break; + + case LTC_ASN1_IA5_STRING: + z = inlen; + if ((err = der_decode_ia5_string(in + x, z, data, &size)) != CRYPT_OK) { + goto LBL_ERR; + } + list[i].size = size; + if ((err = der_length_ia5_string(data, size, &z)) != CRYPT_OK) { + goto LBL_ERR; + } + x += z; + inlen -= z; + break; + + + case LTC_ASN1_PRINTABLE_STRING: + z = inlen; + if ((err = der_decode_printable_string(in + x, z, data, &size)) != CRYPT_OK) { + goto LBL_ERR; + } + list[i].size = size; + if ((err = der_length_printable_string(data, size, &z)) != CRYPT_OK) { + goto LBL_ERR; + } + x += z; + inlen -= z; + break; + + case LTC_ASN1_UTCTIME: + z = inlen; + if ((err = der_decode_utctime(in + x, &z, data)) != CRYPT_OK) { + goto LBL_ERR; + } + x += z; + inlen -= z; + break; + + case LTC_ASN1_SEQUENCE: + z = inlen; + if ((err = der_decode_sequence(in + x, z, data, size)) != CRYPT_OK) { + goto LBL_ERR; + } + if ((err = der_length_sequence(data, size, &z)) != CRYPT_OK) { + goto LBL_ERR; + } + x += z; + inlen -= z; + break; + + + case LTC_ASN1_CHOICE: + z = inlen; + if ((err = der_decode_choice(in + x, &z, data, size)) != CRYPT_OK) { + goto LBL_ERR; + } + x += z; + inlen -= z; + break; + + default: + err = CRYPT_INVALID_ARG; + goto LBL_ERR; + } + } + err = CRYPT_OK; + +LBL_ERR: + return err; +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/sequence/der_decode_sequence.c,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2005/06/18 19:20:23 $ */ diff --git a/src/pk/asn1/der/sequence/der_decode_sequence_multi.c b/src/pk/asn1/der/sequence/der_decode_sequence_multi.c new file mode 100644 index 0000000..a4a1038 --- /dev/null +++ b/src/pk/asn1/der/sequence/der_decode_sequence_multi.c @@ -0,0 +1,124 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" +#include + + +/** + @file der_decode_sequence_multi.c + ASN.1 DER, decode a SEQUENCE, Tom St Denis +*/ + +#ifdef LTC_DER + +int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...) +{ + int err, type; + unsigned long size, x; + void *data; + va_list args; + ltc_asn1_list *list; + + LTC_ARGCHK(in != NULL); + + /* get size of output that will be required */ + va_start(args, inlen); + 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_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_UTCTIME: + case LTC_ASN1_SEQUENCE: + case LTC_ASN1_CHOICE: + ++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, inlen); + 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_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_UTCTIME: + case LTC_ASN1_SEQUENCE: + case LTC_ASN1_CHOICE: + 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_decode_sequence(in, inlen, list, x); +LBL_ERR: + XFREE(list); + return err; +} + +#endif + + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/sequence/der_decode_sequence_multi.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/06/18 19:20:23 $ */ diff --git a/src/pk/asn1/der/sequence/der_encode_sequence.c b/src/pk/asn1/der/sequence/der_encode_sequence.c new file mode 100644 index 0000000..d53153c --- /dev/null +++ b/src/pk/asn1/der/sequence/der_encode_sequence.c @@ -0,0 +1,281 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" +#include + + +/** + @file der_encode_sequence.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 + @return CRYPT_OK on success +*/ +int der_encode_sequence(ltc_asn1_list *list, unsigned long inlen, + unsigned char *out, unsigned long *outlen) +{ + 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_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_UTCTIME: + if ((err = der_length_utctime(data, &x)) != CRYPT_OK) { + goto LBL_ERR; + } + y += x; + break; + + 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) { + err = CRYPT_BUFFER_OVERFLOW; + goto LBL_ERR; + } + + /* store header */ + x = 0; + out[x++] = 0x30; + if (z < 128) { + out[x++] = z; + } else if (z < 256) { + out[x++] = 0x81; + out[x++] = z; + } else if (z < 65536UL) { + out[x++] = 0x82; + out[x++] = (z>>8UL)&255; + out[x++] = z&255; + } else if (z < 16777216UL) { + out[x++] = 0x83; + out[x++] = (z>>16UL)&255; + out[x++] = (z>>8UL)&255; + out[x++] = 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_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_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_SEQUENCE: + z = *outlen; + if ((err = der_encode_sequence(data, size, out + x, &z)) != 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/pk/asn1/der/sequence/der_encode_sequence_multi.c b/src/pk/asn1/der/sequence/der_encode_sequence_multi.c new file mode 100644 index 0000000..9ff48b9 --- /dev/null +++ b/src/pk/asn1/der/sequence/der_encode_sequence_multi.c @@ -0,0 +1,123 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" +#include + + +/** + @file der_encode_sequence_multi.c + ASN.1 DER, encode a SEQUENCE, Tom St Denis +*/ + +#ifdef LTC_DER + +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_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_UTCTIME: + case LTC_ASN1_SEQUENCE: + ++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_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_UTCTIME: + case LTC_ASN1_SEQUENCE: + 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.6 $ */ +/* $Date: 2005/06/18 19:20:23 $ */ diff --git a/src/pk/asn1/der/sequence/der_length_sequence.c b/src/pk/asn1/der/sequence/der_length_sequence.c new file mode 100644 index 0000000..9120451 --- /dev/null +++ b/src/pk/asn1/der/sequence/der_length_sequence.c @@ -0,0 +1,144 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" +#include + + +/** + @file der_length_sequence.c + ASN.1 DER, length a SEQUENCE, Tom St Denis +*/ + +#ifdef LTC_DER + +/** + Get the length of a DER sequence + @param list The sequences of items in the SEQUENCE + @param inlen The number of items + @param outlen [out] The length required in octets to store it + @return CRYPT_OK on success +*/ +int der_length_sequence(ltc_asn1_list *list, unsigned long inlen, + unsigned long *outlen) +{ + int err, type; + unsigned long size, x, y, z, i; + void *data; + + LTC_ARGCHK(list != 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_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_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; + } + + /* store size */ + *outlen = y; + err = CRYPT_OK; + +LBL_ERR: + return err; +} + +#endif diff --git a/src/pk/asn1/der/short_integer/der_decode_short_integer.c b/src/pk/asn1/der/short_integer/der_decode_short_integer.c new file mode 100644 index 0000000..7d3d3b7 --- /dev/null +++ b/src/pk/asn1/der/short_integer/der_decode_short_integer.c @@ -0,0 +1,68 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_decode_short_integer.c + ASN.1 DER, decode an integer, Tom St Denis +*/ + + +#ifdef LTC_DER + +/** + Read a mp_int integer + @param in The DER encoded data + @param inlen Size of data + @param num [out] The integer to decode + @return CRYPT_OK if successful +*/ +int der_decode_short_integer(const unsigned char *in, unsigned long inlen, unsigned long *num) +{ + unsigned long len, x, y; + + LTC_ARGCHK(num != NULL); + LTC_ARGCHK(in != NULL); + + /* check length */ + if (inlen < 2) { + return CRYPT_INVALID_PACKET; + } + + /* check header */ + x = 0; + if ((in[x++] & 0x1F) != 0x02) { + return CRYPT_INVALID_PACKET; + } + + /* get the packet len */ + len = in[x++]; + + if (x + len > inlen) { + return CRYPT_INVALID_PACKET; + } + + /* read number */ + y = 0; + while (len--) { + y = (y<<8) | (unsigned long)in[x++]; + } + *num = y; + + return CRYPT_OK; + +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/short_integer/der_decode_short_integer.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/23 01:04:13 $ */ diff --git a/src/pk/asn1/der/short_integer/der_encode_short_integer.c b/src/pk/asn1/der/short_integer/der_encode_short_integer.c new file mode 100644 index 0000000..eb94d38 --- /dev/null +++ b/src/pk/asn1/der/short_integer/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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_encode_short_integer.c + ASN.1 DER, encode an integer, Tom St Denis +*/ + + +#ifdef LTC_DER + +/* Exports a positive integer as DER format (upto 32-bits in size) */ +/** + Store a mp_int integer + @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) { + 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++] = 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++] = (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.3 $ */ +/* $Date: 2005/05/23 01:27:03 $ */ diff --git a/src/pk/asn1/der/short_integer/der_length_short_integer.c b/src/pk/asn1/der/short_integer/der_length_short_integer.c new file mode 100644 index 0000000..7324b4a --- /dev/null +++ b/src/pk/asn1/der/short_integer/der_length_short_integer.c @@ -0,0 +1,69 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_length_short_integer.c + ASN.1 DER, get length of encoding, Tom St Denis +*/ + + +#ifdef LTC_DER +/** + Gets length of DER encoding of num + @param num The integer to get the size of + @param outlen [out] The length of the DER encoding for the given integer + @return CRYPT_OK if successful +*/ +int der_length_short_integer(unsigned long num, unsigned long *outlen) +{ + unsigned long z, y, len; + + LTC_ARGCHK(outlen != NULL); + + /* force to 32 bits */ + num &= 0xFFFFFFFFUL; + + /* get the number of bytes */ + z = 0; + y = num; + while (y) { + ++z; + y >>= 8; + } + + /* handle zero */ + if (z == 0) { + z = 1; + } + + /* we need a 0x02 to indicate it's INTEGER */ + len = 1; + + /* length byte */ + ++len; + + /* bytes in value */ + len += z; + + /* see if msb is set */ + len += (num&(1UL<<((z<<3) - 1))) ? 1 : 0; + + /* return length */ + *outlen = len; + return CRYPT_OK; +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/short_integer/der_length_short_integer.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/23 01:35:38 $ */ diff --git a/src/pk/asn1/der/utctime/der_decode_utctime.c b/src/pk/asn1/der/utctime/der_decode_utctime.c new file mode 100644 index 0000000..43ba033 --- /dev/null +++ b/src/pk/asn1/der/utctime/der_decode_utctime.c @@ -0,0 +1,120 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_decode_utctime.c + ASN.1 DER, decode a UTCTIME, Tom St Denis +*/ + +#ifdef LTC_DER + +static int char_to_int(unsigned char x) +{ + switch (x) { + case '0': return 0; + case '1': return 1; + case '2': return 2; + case '3': return 3; + case '4': return 4; + case '5': return 5; + case '6': return 6; + case '7': return 7; + case '8': return 8; + case '9': return 9; + } + return 100; +} + +#define DECODE_V(y, max) \ + y = char_to_int(buf[x])*10 + char_to_int(buf[x+1]); \ + if (y >= max) return CRYPT_INVALID_PACKET; \ + x += 2; + +int der_decode_utctime(const unsigned char *in, unsigned long *inlen, + ltc_utctime *out) +{ + unsigned char buf[32]; + unsigned long x; + int y; + + LTC_ARGCHK(in != NULL); + LTC_ARGCHK(inlen != NULL); + LTC_ARGCHK(out != NULL); + + /* check header */ + if (*inlen < 2UL || (in[1] >= sizeof(buf)) || ((in[1] + 2UL) > *inlen)) { + return CRYPT_INVALID_PACKET; + } + + /* decode the string */ + for (x = 0; x < in[1]; x++) { + y = der_ia5_value_decode(in[x+2]); + if (y == -1) { + return CRYPT_INVALID_PACKET; + } + buf[x] = y; + } + *inlen = 2 + x; + + + /* possible encodings are +YYMMDDhhmmZ +YYMMDDhhmm+hh'mm' +YYMMDDhhmm-hh'mm' +YYMMDDhhmmssZ +YYMMDDhhmmss+hh'mm' +YYMMDDhhmmss-hh'mm' + + So let's do a trivial decode upto [including] mm + */ + + x = 0; + DECODE_V(out->YY, 100); + DECODE_V(out->MM, 13); + DECODE_V(out->DD, 32); + DECODE_V(out->hh, 24); + DECODE_V(out->mm, 60); + + /* clear timezone and seconds info */ + out->off_dir = out->off_hh = out->off_mm = out->ss = 0; + + /* now is it Z, +, - or 0-9 */ + if (buf[x] == 'Z') { + return CRYPT_OK; + } else if (buf[x] == '+' || buf[x] == '-') { + out->off_dir = (buf[x++] == '+') ? 0 : 1; + DECODE_V(out->off_hh, 24); + DECODE_V(out->off_mm, 60); + return CRYPT_OK; + } + + /* decode seconds */ + DECODE_V(out->ss, 60); + + /* now is it Z, +, - */ + if (buf[x] == 'Z') { + return CRYPT_OK; + } else if (buf[x] == '+' || buf[x] == '-') { + out->off_dir = (buf[x++] == '+') ? 0 : 1; + DECODE_V(out->off_hh, 24); + DECODE_V(out->off_mm, 60); + return CRYPT_OK; + } else { + return CRYPT_INVALID_PACKET; + } +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/utctime/der_decode_utctime.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2005/06/19 12:07:00 $ */ diff --git a/src/pk/asn1/der/utctime/der_encode_utctime.c b/src/pk/asn1/der/utctime/der_encode_utctime.c new file mode 100644 index 0000000..dad8c84 --- /dev/null +++ b/src/pk/asn1/der/utctime/der_encode_utctime.c @@ -0,0 +1,80 @@ +/* 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://libtomcrypt.org + */ +#include "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]); + +/** + Gets length of DER encoding of UTCTIME + @param outlen [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) { + 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] = 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.5 $ */ +/* $Date: 2005/06/19 12:07:00 $ */ diff --git a/src/pk/asn1/der/utctime/der_length_utctime.c b/src/pk/asn1/der/utctime/der_length_utctime.c new file mode 100644 index 0000000..84e654a --- /dev/null +++ b/src/pk/asn1/der/utctime/der_length_utctime.c @@ -0,0 +1,45 @@ +/* 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://libtomcrypt.org + */ +#include "tomcrypt.h" + +/** + @file der_length_utctime.c + ASN.1 DER, get length of UTCTIME, Tom St Denis +*/ + +#ifdef LTC_DER + +/** + Gets length of DER encoding of UTCTIME + @param outlen [out] The length of the DER encoding + @return CRYPT_OK if successful +*/ +int der_length_utctime(ltc_utctime *utctime, unsigned long *outlen) +{ + LTC_ARGCHK(outlen != NULL); + LTC_ARGCHK(utctime != NULL); + + if (utctime->off_hh == 0 && utctime->off_mm == 0) { + /* we encode as YYMMDDhhmmssZ */ + *outlen = 2 + 13; + } else { + /* we encode as YYMMDDhhmmss{+|-}hh'mm' */ + *outlen = 2 + 17; + } + + return CRYPT_OK; +} + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/utctime/der_length_utctime.c,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/06/19 11:23:04 $ */ diff --git a/src/pk/dh/dh.c b/src/pk/dh/dh.c index c2085a6..a54f29b 100644 --- a/src/pk/dh/dh.c +++ b/src/pk/dh/dh.c @@ -518,3 +518,7 @@ done: #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/dh/dh.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/dh/dh_sys.c b/src/pk/dh/dh_sys.c index 801f85a..4f10556 100644 --- a/src/pk/dh/dh_sys.c +++ b/src/pk/dh/dh_sys.c @@ -493,3 +493,7 @@ done: return err; } + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/dh/dh_sys.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/dsa/dsa_export.c b/src/pk/dsa/dsa_export.c index 773023e..5a093d9 100644 --- a/src/pk/dsa/dsa_export.c +++ b/src/pk/dsa/dsa_export.c @@ -27,18 +27,13 @@ */ int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key) { - unsigned long y, z; - int err; + unsigned char flags[1]; LTC_ARGCHK(out != NULL); LTC_ARGCHK(outlen != NULL); LTC_ARGCHK(key != NULL); /* can we store the static header? */ - if (*outlen < (PACKET_SIZE + 1 + 2)) { - return CRYPT_BUFFER_OVERFLOW; - } - if (type == PK_PRIVATE && key->type != PK_PRIVATE) { return CRYPT_PK_TYPE_MISMATCH; } @@ -47,29 +42,31 @@ int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key return CRYPT_INVALID_ARG; } - /* store header */ - packet_store_header(out, PACKET_SECT_DSA, PACKET_SUB_KEY); - y = PACKET_SIZE; + flags[0] = (type != PK_PUBLIC) ? 1 : 0; - /* store g, p, q, qord */ - out[y++] = type; - out[y++] = (key->qord>>8)&255; - out[y++] = key->qord & 255; - - OUTPUT_BIGNUM(&key->g,out,y,z); - OUTPUT_BIGNUM(&key->p,out,y,z); - OUTPUT_BIGNUM(&key->q,out,y,z); - - /* public exponent */ - OUTPUT_BIGNUM(&key->y,out,y,z); - if (type == PK_PRIVATE) { - OUTPUT_BIGNUM(&key->x,out,y,z); + return der_encode_sequence_multi(out, outlen, + LTC_ASN1_BIT_STRING, 1UL, flags, + LTC_ASN1_INTEGER, 1UL, &key->g, + LTC_ASN1_INTEGER, 1UL, &key->p, + LTC_ASN1_INTEGER, 1UL, &key->q, + LTC_ASN1_INTEGER, 1UL, &key->y, + LTC_ASN1_INTEGER, 1UL, &key->x, + LTC_ASN1_EOL, 0UL, NULL); + } else { + return der_encode_sequence_multi(out, outlen, + LTC_ASN1_BIT_STRING, 1UL, flags, + LTC_ASN1_INTEGER, 1UL, &key->g, + LTC_ASN1_INTEGER, 1UL, &key->p, + LTC_ASN1_INTEGER, 1UL, &key->q, + LTC_ASN1_INTEGER, 1UL, &key->y, + LTC_ASN1_EOL, 0UL, NULL); } - - *outlen = y; - return CRYPT_OK; } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_export.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2005/06/03 19:24:31 $ */ diff --git a/src/pk/dsa/dsa_free.c b/src/pk/dsa/dsa_free.c index 862a2dd..9157acb 100644 --- a/src/pk/dsa/dsa_free.c +++ b/src/pk/dsa/dsa_free.c @@ -28,3 +28,7 @@ void dsa_free(dsa_key *key) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_free.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/dsa/dsa_import.c b/src/pk/dsa/dsa_import.c index 6de56e3..e81bac8 100644 --- a/src/pk/dsa/dsa_import.c +++ b/src/pk/dsa/dsa_import.c @@ -26,46 +26,64 @@ */ int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key) { - unsigned long x, y; + unsigned char flags[1]; int err; LTC_ARGCHK(in != NULL); LTC_ARGCHK(key != NULL); - /* check length */ - if ((1+2+PACKET_SIZE) > inlen) { - return CRYPT_INVALID_PACKET; - } - - /* check type */ - if ((err = packet_valid_header((unsigned char *)in, PACKET_SECT_DSA, PACKET_SUB_KEY)) != CRYPT_OK) { - return err; - } - y = PACKET_SIZE; - /* init key */ if (mp_init_multi(&key->p, &key->g, &key->q, &key->x, &key->y, NULL) != MP_OKAY) { return CRYPT_MEM; } - /* read type/qord */ - key->type = in[y++]; - key->qord = ((unsigned)in[y]<<8)|((unsigned)in[y+1]); - y += 2; - - /* input publics */ - INPUT_BIGNUM(&key->g,in,x,y, inlen); - INPUT_BIGNUM(&key->p,in,x,y, inlen); - INPUT_BIGNUM(&key->q,in,x,y, inlen); - INPUT_BIGNUM(&key->y,in,x,y, inlen); - if (key->type == PK_PRIVATE) { - INPUT_BIGNUM(&key->x,in,x,y, inlen); + /* get key type */ + if ((err = der_decode_sequence_multi(in, inlen, + LTC_ASN1_BIT_STRING, 1UL, flags, + LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { + goto error; } - return CRYPT_OK; + if (flags[0] == 1) { + if ((err = der_decode_sequence_multi(in, inlen, + LTC_ASN1_BIT_STRING, 1UL, flags, + LTC_ASN1_INTEGER, 1UL, &key->g, + LTC_ASN1_INTEGER, 1UL, &key->p, + LTC_ASN1_INTEGER, 1UL, &key->q, + LTC_ASN1_INTEGER, 1UL, &key->y, + LTC_ASN1_INTEGER, 1UL, &key->x, + LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { + goto error; + } + key->type = PK_PRIVATE; + } else { + if ((err = der_decode_sequence_multi(in, inlen, + LTC_ASN1_BIT_STRING, 1UL, flags, + LTC_ASN1_INTEGER, 1UL, &key->g, + LTC_ASN1_INTEGER, 1UL, &key->p, + LTC_ASN1_INTEGER, 1UL, &key->q, + LTC_ASN1_INTEGER, 1UL, &key->y, + LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { + goto error; + } + key->type = PK_PUBLIC; + } + key->qord = mp_unsigned_bin_size(&key->q); + + if (key->qord >= MDSA_MAX_GROUP || key->qord <= 15 || + key->qord >= mp_unsigned_bin_size(&key->p) || (mp_unsigned_bin_size(&key->p) - key->qord) >= MDSA_DELTA) { + err = CRYPT_INVALID_PACKET; + goto error; + } + + return CRYPT_OK; error: mp_clear_multi(&key->p, &key->g, &key->q, &key->x, &key->y, NULL); return err; } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_import.c,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2005/06/08 23:31:17 $ */ diff --git a/src/pk/dsa/dsa_make_key.c b/src/pk/dsa/dsa_make_key.c index 60683a0..02f69e0 100644 --- a/src/pk/dsa/dsa_make_key.c +++ b/src/pk/dsa/dsa_make_key.c @@ -70,15 +70,15 @@ int dsa_make_key(prng_state *prng, int wprng, int group_size, int modulus_size, } /* force magnitude */ - buf[0] = 1; + buf[0] |= 0xC0; /* force even */ - buf[modulus_size - group_size] &= ~1; + buf[modulus_size - group_size - 1] &= ~1; - if ((err = mp_read_unsigned_bin(&tmp2, buf, modulus_size - group_size+1)) != MP_OKAY) { goto error; } + if ((err = mp_read_unsigned_bin(&tmp2, buf, modulus_size - group_size)) != MP_OKAY) { goto error; } if ((err = mp_mul(&key->q, &tmp2, &key->p)) != MP_OKAY) { goto error; } if ((err = mp_add_d(&key->p, 1, &key->p)) != MP_OKAY) { goto error; } - + /* now loop until p is prime */ for (;;) { if ((err = is_prime(&key->p, &res)) != CRYPT_OK) { goto LBL_ERR; } @@ -140,3 +140,7 @@ done: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_make_key.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/11 05:45:35 $ */ diff --git a/src/pk/dsa/dsa_sign_hash.c b/src/pk/dsa/dsa_sign_hash.c index da92a82..48d29a2 100644 --- a/src/pk/dsa/dsa_sign_hash.c +++ b/src/pk/dsa/dsa_sign_hash.c @@ -21,26 +21,25 @@ Sign a hash with DSA @param in The hash to sign @param inlen The length of the hash to sign - @param out [out] Where to store the signature - @param outlen [in/out] The max size and resulting size of the signature + @param r The "r" integer of the signature (caller must initialize with mp_init() first) + @param s The "s" integer of the signature (caller must initialize with mp_init() first) @param prng An active PRNG state @param wprng The index of the PRNG desired @param key A private DSA key @return CRYPT_OK if successful */ -int dsa_sign_hash(const unsigned char *in, unsigned long inlen, - unsigned char *out, unsigned long *outlen, - prng_state *prng, int wprng, dsa_key *key) +int dsa_sign_hash_raw(const unsigned char *in, unsigned long inlen, + mp_int *r, mp_int *s, + prng_state *prng, int wprng, dsa_key *key) { - mp_int k, kinv, tmp, r, s; + mp_int k, kinv, tmp; unsigned char *buf; int err; - unsigned long out1, out2; - LTC_ARGCHK(in != NULL); - LTC_ARGCHK(out != NULL); - LTC_ARGCHK(outlen != NULL); - LTC_ARGCHK(key != NULL); + LTC_ARGCHK(in != NULL); + LTC_ARGCHK(r != NULL); + LTC_ARGCHK(s != NULL); + LTC_ARGCHK(key != NULL); if ((err = prng_is_valid(wprng)) != CRYPT_OK) { return err; @@ -60,7 +59,7 @@ int dsa_sign_hash(const unsigned char *in, unsigned long inlen, } /* Init our temps */ - if ((err = mp_init_multi(&k, &kinv, &r, &s, &tmp, NULL)) != MP_OKAY) { goto error; } + if ((err = mp_init_multi(&k, &kinv, &tmp, NULL)) != MP_OKAY) { goto error; } retry: @@ -85,37 +84,26 @@ retry: if ((err = mp_invmod(&k, &key->q, &kinv)) != MP_OKAY) { goto error; } /* now find r = g^k mod p mod q */ - if ((err = mp_exptmod(&key->g, &k, &key->p, &r)) != MP_OKAY) { goto error; } - if ((err = mp_mod(&r, &key->q, &r)) != MP_OKAY) { goto error; } + if ((err = mp_exptmod(&key->g, &k, &key->p, r)) != MP_OKAY) { goto error; } + if ((err = mp_mod(r, &key->q, r)) != MP_OKAY) { goto error; } - if (mp_iszero(&r) == MP_YES) { goto retry; } + if (mp_iszero(r) == MP_YES) { goto retry; } /* now find s = (in + xr)/k mod q */ if ((err = mp_read_unsigned_bin(&tmp, (unsigned char *)in, inlen)) != MP_OKAY) { goto error; } - if ((err = mp_mul(&key->x, &r, &s)) != MP_OKAY) { goto error; } - if ((err = mp_add(&s, &tmp, &s)) != MP_OKAY) { goto error; } - if ((err = mp_mulmod(&s, &kinv, &key->q, &s)) != MP_OKAY) { goto error; } + if ((err = mp_mul(&key->x, r, s)) != MP_OKAY) { goto error; } + if ((err = mp_add(s, &tmp, s)) != MP_OKAY) { goto error; } + if ((err = mp_mulmod(s, &kinv, &key->q, s)) != MP_OKAY) { goto error; } - if (mp_iszero(&s) == MP_YES) { goto retry; } + if (mp_iszero(s) == MP_YES) { goto retry; } - /* now store em both */ - - /* first check that we have enough room */ - if ((err = der_length_integer(&s, &out1)) != CRYPT_OK) { goto LBL_ERR; } - if ((err = der_length_integer(&r, &out2)) != CRYPT_OK) { goto LBL_ERR; } - if (*outlen < (out1+out2)) { - err = CRYPT_BUFFER_OVERFLOW; - goto LBL_ERR; - } - - /* store ints */ - err = der_put_multi_integer(out, outlen, &r, &s, NULL); + err = CRYPT_OK; goto LBL_ERR; error: err = mpi_to_ltc_error(err); LBL_ERR: - mp_clear_multi(&k, &kinv, &r, &s, &tmp, NULL); + mp_clear_multi(&k, &kinv, &tmp, NULL); #ifdef LTC_CLEAN_STACK zeromem(buf, MDSA_MAX_GROUP); #endif @@ -123,4 +111,49 @@ LBL_ERR: return err; } +/** + Sign a hash with DSA + @param in The hash to sign + @param inlen The length of the hash to sign + @param out [out] Where to store the signature + @param outlen [in/out] The max size and resulting size of the signature + @param prng An active PRNG state + @param wprng The index of the PRNG desired + @param key A private DSA key + @return CRYPT_OK if successful +*/ +int dsa_sign_hash(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, + prng_state *prng, int wprng, dsa_key *key) +{ + mp_int r, s; + int err; + + LTC_ARGCHK(in != NULL); + LTC_ARGCHK(out != NULL); + LTC_ARGCHK(outlen != NULL); + LTC_ARGCHK(key != NULL); + + if (mp_init_multi(&r, &s, NULL) != MP_OKAY) { + return CRYPT_MEM; + } + + if ((err = dsa_sign_hash_raw(in, inlen, &r, &s, prng, wprng, key)) != CRYPT_OK) { + goto LBL_ERR; + } + + err = der_encode_sequence_multi(out, outlen, + LTC_ASN1_INTEGER, 1UL, &r, + LTC_ASN1_INTEGER, 1UL, &s, + LTC_ASN1_EOL, 0UL, NULL); + +LBL_ERR: + mp_clear_multi(&r, &s, NULL); + return err; +} + #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_sign_hash.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2005/05/15 21:48:59 $ */ diff --git a/src/pk/dsa/dsa_verify_hash.c b/src/pk/dsa/dsa_verify_hash.c index 140f0e2..11e5c33 100644 --- a/src/pk/dsa/dsa_verify_hash.c +++ b/src/pk/dsa/dsa_verify_hash.c @@ -18,6 +18,71 @@ #ifdef MDSA +/** + Verify a DSA signature + @param r DSA "r" parameter + @param s DSA "s" parameter + @param hash The hash that was signed + @param hashlen The length of the hash that was signed + @param stat [out] The result of the signature verification, 1==valid, 0==invalid + @param key The corresponding public DH key + @return CRYPT_OK if successful (even if the signature is invalid) +*/ +int dsa_verify_hash_raw( mp_int *r, mp_int *s, + const unsigned char *hash, unsigned long hashlen, + int *stat, dsa_key *key) +{ + mp_int w, v, u1, u2; + int err; + + LTC_ARGCHK(r != NULL); + LTC_ARGCHK(s != NULL); + LTC_ARGCHK(stat != NULL); + LTC_ARGCHK(key != NULL); + + /* default to invalid signature */ + *stat = 0; + + /* init our variables */ + if ((err = mp_init_multi(&w, &v, &u1, &u2, NULL)) != MP_OKAY) { + return mpi_to_ltc_error(err); + } + + /* neither r or s can be null or >q*/ + if (mp_iszero(r) == MP_YES || mp_iszero(s) == MP_YES || mp_cmp(r, &key->q) != MP_LT || mp_cmp(s, &key->q) != MP_LT) { + err = CRYPT_INVALID_PACKET; + goto done; + } + + /* w = 1/s mod q */ + if ((err = mp_invmod(s, &key->q, &w)) != MP_OKAY) { goto error; } + + /* u1 = m * w mod q */ + if ((err = mp_read_unsigned_bin(&u1, (unsigned char *)hash, hashlen)) != MP_OKAY) { goto error; } + if ((err = mp_mulmod(&u1, &w, &key->q, &u1)) != MP_OKAY) { goto error; } + + /* u2 = r*w mod q */ + if ((err = mp_mulmod(r, &w, &key->q, &u2)) != MP_OKAY) { goto error; } + + /* v = g^u1 * y^u2 mod p mod q */ + if ((err = mp_exptmod(&key->g, &u1, &key->p, &u1)) != MP_OKAY) { goto error; } + if ((err = mp_exptmod(&key->y, &u2, &key->p, &u2)) != MP_OKAY) { goto error; } + if ((err = mp_mulmod(&u1, &u2, &key->p, &v)) != MP_OKAY) { goto error; } + if ((err = mp_mod(&v, &key->q, &v)) != MP_OKAY) { goto error; } + + /* if r = v then we're set */ + if (mp_cmp(r, &v) == MP_EQ) { + *stat = 1; + } + + err = CRYPT_OK; + goto done; + +error : err = mpi_to_ltc_error(err); +done : mp_clear_multi(&w, &v, &u1, &u2, NULL); + return err; +} + /** Verify a DSA signature @param sig The signature @@ -32,59 +97,32 @@ int dsa_verify_hash(const unsigned char *sig, unsigned long siglen, const unsigned char *hash, unsigned long hashlen, int *stat, dsa_key *key) { - mp_int r, s, w, v, u1, u2; - int err; + int err; + mp_int r, s; - LTC_ARGCHK(sig != NULL); - LTC_ARGCHK(hash != NULL); - LTC_ARGCHK(stat != NULL); - LTC_ARGCHK(key != NULL); - - /* default to invalid signature */ - *stat = 0; - - /* init our variables */ - if ((err = mp_init_multi(&r, &s, &w, &v, &u1, &u2, NULL)) != MP_OKAY) { - return mpi_to_ltc_error(err); + if ((err = mp_init_multi(&r, &s, NULL)) != CRYPT_OK) { + return CRYPT_MEM; } - /* read in r followed by s */ - if ((err = der_get_multi_integer(sig, &siglen, &r, &s, NULL)) != CRYPT_OK) { goto done; } - - /* neither r or s can be null */ - if (mp_iszero(&r) == MP_YES || mp_iszero(&s) == MP_YES) { - err = CRYPT_INVALID_PACKET; - goto done; - } - - /* w = 1/s mod q */ - if ((err = mp_invmod(&s, &key->q, &w)) != MP_OKAY) { goto error; } - - /* u1 = m * w mod q */ - if ((err = mp_read_unsigned_bin(&u1, (unsigned char *)hash, hashlen)) != MP_OKAY) { goto error; } - if ((err = mp_mulmod(&u1, &w, &key->q, &u1)) != MP_OKAY) { goto error; } - - /* u2 = r*w mod q */ - if ((err = mp_mulmod(&r, &w, &key->q, &u2)) != MP_OKAY) { goto error; } - - /* v = g^u1 * y^u2 mod p mod q */ - if ((err = mp_exptmod(&key->g, &u1, &key->p, &u1)) != MP_OKAY) { goto error; } - if ((err = mp_exptmod(&key->y, &u2, &key->p, &u2)) != MP_OKAY) { goto error; } - if ((err = mp_mulmod(&u1, &u2, &key->p, &v)) != MP_OKAY) { goto error; } - if ((err = mp_mod(&v, &key->q, &v)) != MP_OKAY) { goto error; } - - /* if r = v then we're set */ - if (mp_cmp(&r, &v) == MP_EQ) { - *stat = 1; + /* decode the sequence */ + if ((err = der_decode_sequence_multi(sig, siglen, + LTC_ASN1_INTEGER, 1UL, &r, + LTC_ASN1_INTEGER, 1UL, &s, + LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { + goto LBL_ERR; } - err = CRYPT_OK; - goto done; + /* do the op */ + err = dsa_verify_hash_raw(&r, &s, hash, hashlen, stat, key); -error : err = mpi_to_ltc_error(err); -done : mp_clear_multi(&r, &s, &w, &v, &u1, &u2, NULL); +LBL_ERR: + mp_clear_multi(&r, &s, NULL); return err; } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_verify_hash.c,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2005/05/15 21:48:59 $ */ diff --git a/src/pk/dsa/dsa_verify_key.c b/src/pk/dsa/dsa_verify_key.c index 3e84261..b7be103 100644 --- a/src/pk/dsa/dsa_verify_key.c +++ b/src/pk/dsa/dsa_verify_key.c @@ -96,3 +96,7 @@ done : mp_clear_multi(&tmp, &tmp2, NULL); return err; } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_verify_key.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/ecc/ecc.c b/src/pk/ecc/ecc.c index b5e088b..469d56d 100644 --- a/src/pk/ecc/ecc.c +++ b/src/pk/ecc/ecc.c @@ -24,7 +24,7 @@ #ifdef MECC /* size of our temp buffers for exported keys */ -#define ECC_BUF_SIZE 160 +#define ECC_BUF_SIZE 256 /* max private key size */ #define ECC_MAXSIZE 66 @@ -34,22 +34,6 @@ static const struct { int size; char *name, *prime, *B, *order, *Gx, *Gy; } sets[] = { -#ifdef ECC160 -{ - 20, - "ECC-160", - /* prime */ - "G00000000000000000000000007", - /* B */ - "1oUV2vOaSlWbxr6", - /* order */ - "G0000000000004sCQUtDxaqDUN5", - /* Gx */ - "jpqOf1BHus6Yd/pyhyVpP", - /* Gy */ - "D/wykuuIFfr+vPyx7kQEPu8MixO", -}, -#endif #ifdef ECC192 { 24, @@ -76,19 +60,20 @@ static const struct { "ECC-224", /* prime */ - "400000000000000000000000000000000000BV", + "3/////////////////////0000000000000001", /* B */ - "21HkWGL2CxJIp", + "2q1Gg530Ipg/L1CbPGHB2trx/OkYSBEKCZLV+q", /* order */ - "4000000000000000000Kxnixk9t8MLzMiV264/", + "3//////////////////nQYuBZmFXFTAKLSN2ez", /* Gx */ - "jpqOf1BHus6Yd/pyhyVpP", + "2t3WozQxI/Vp8JaBbA0y7JLi8H8ZGoWDOHN1qX", + /* Gy */ - "3FCtyo2yHA5SFjkCGbYxbOvNeChwS+j6wSIwck", + "2zDsE8jVSZ+qmYt+RDGtMWMWT7P4JLWPc507uq", }, #endif #ifdef ECC256 @@ -165,70 +150,6 @@ static const struct { } }; -#if 0 - -/* you plug in a prime and B value and it finds a pseudo-random base point */ -void ecc_find_base(void) -{ - static char *prime = "26959946667150639794667015087019630673637144422540572481103610249951"; - static char *order = "26959946667150639794667015087019637467111563745054605861463538557247"; - static char *b = "9538957348957353489587"; - mp_int pp, p, r, B, tmp1, tmp2, tx, ty, x, y; - char buf[4096]; - int i; - - mp_init_multi(&tx, &ty, &x, &y, &p, &pp, &r, &B, &tmp1, &tmp2, NULL); - mp_read_radix(&p, prime, 10); - mp_read_radix(&r, order, 10); - mp_read_radix(&B, b, 10); - - /* get (p+1)/4 */ - mp_add_d(&p, 1, &pp); - mp_div_2(&pp, &pp); - mp_div_2(&pp, &pp); - - buf[0] = 0; - do { - printf("."); fflush(stdout); - /* make a random value of x */ - for (i = 0; i < 16; i++) buf[i+1] = rand() & 255; - mp_read_raw(&x, buf, 17); - mp_copy(&x, &tx); - - /* now compute x^3 - 3x + b */ - mp_expt_d(&x, 3, &tmp1); - mp_mul_d(&x, 3, &tmp2); - mp_sub(&tmp1, &tmp2, &tmp1); - mp_add(&tmp1, &B, &tmp1); - mp_mod(&tmp1, &p, &tmp1); - - /* now compute sqrt via x^((p+1)/4) */ - mp_exptmod(&tmp1, &pp, &p, &tmp2); - mp_copy(&tmp2, &ty); - - /* now square it */ - mp_sqrmod(&tmp2, &p, &tmp2); - - /* tmp2 should equal tmp1 */ - } while (mp_cmp(&tmp1, &tmp2)); - - /* now output values in way that libtomcrypt wants */ - mp_todecimal(&p, buf); - printf("\n\np==%s\n", buf); - mp_tohex(&B, buf); - printf("b==%s\n", buf); - mp_todecimal(&r, buf); - printf("r==%s\n", buf); - mp_tohex(&tx, buf); - printf("Gx==%s\n", buf); - mp_tohex(&ty, buf); - printf("Gy==%s\n", buf); - - mp_clear_multi(&tx, &ty, &x, &y, &p, &pp, &r, &B, &tmp1, &tmp2, NULL); -} - -#endif - static int is_valid_idx(int n) { int x; @@ -263,7 +184,7 @@ static void del_point(ecc_point *p) } } -static int ecc_map(ecc_point *P, mp_int *modulus, mp_int *mu) +static int ecc_map(ecc_point *P, mp_int *modulus, mp_digit mp) { mp_int t1, t2; int err; @@ -272,20 +193,23 @@ static int ecc_map(ecc_point *P, mp_int *modulus, mp_int *mu) return CRYPT_MEM; } + /* first map z back to normal */ + if ((err = mp_montgomery_reduce(&P->z, modulus, mp)) != MP_OKAY) { goto error; } + /* get 1/z */ - if ((err = mp_invmod(&P->z, modulus, &t1)) != MP_OKAY) { goto error; } + if ((err = mp_invmod(&P->z, modulus, &t1)) != MP_OKAY) { goto error; } /* get 1/z^2 and 1/z^3 */ - if ((err = mp_sqr(&t1, &t2)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t2, modulus, mu)) != MP_OKAY) { goto error; } - if ((err = mp_mul(&t1, &t2, &t1)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t1, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_sqr(&t1, &t2)) != MP_OKAY) { goto error; } + if ((err = mp_mod(&t2, modulus, &t2)) != MP_OKAY) { goto error; } + if ((err = mp_mul(&t1, &t2, &t1)) != MP_OKAY) { goto error; } + if ((err = mp_mod(&t1, modulus, &t1)) != MP_OKAY) { goto error; } /* multiply against x/y */ - if ((err = mp_mul(&P->x, &t2, &P->x)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&P->x, modulus, mu)) != MP_OKAY) { goto error; } - if ((err = mp_mul(&P->y, &t1, &P->y)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&P->y, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_mul(&P->x, &t2, &P->x)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&P->x, modulus, mp)) != MP_OKAY) { goto error; } + if ((err = mp_mul(&P->y, &t1, &P->y)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&P->y, modulus, mp)) != MP_OKAY) { goto error; } mp_set(&P->z, 1); err = CRYPT_OK; @@ -298,9 +222,8 @@ done: } - /* double a point R = 2P, R can be P*/ -static int dbl_point(ecc_point *P, ecc_point *R, mp_int *modulus, mp_int *mu) +static int dbl_point(ecc_point *P, ecc_point *R, mp_int *modulus, mp_digit mp) { mp_int t1, t2; int err; @@ -315,10 +238,10 @@ static int dbl_point(ecc_point *P, ecc_point *R, mp_int *modulus, mp_int *mu) /* t1 = Z * Z */ if ((err = mp_sqr(&R->z, &t1)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t1, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t1, modulus, mp)) != MP_OKAY) { goto error; } /* Z = Y * Z */ if ((err = mp_mul(&R->z, &R->y, &R->z)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&R->z, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&R->z, modulus, mp)) != MP_OKAY) { goto error; } /* Z = 2Z */ if ((err = mp_mul_2(&R->z, &R->z)) != MP_OKAY) { goto error; } if (mp_cmp(&R->z, modulus) != MP_LT) { @@ -337,7 +260,7 @@ static int dbl_point(ecc_point *P, ecc_point *R, mp_int *modulus, mp_int *mu) } /* T2 = T1 * T2 */ if ((err = mp_mul(&t1, &t2, &t2)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t2, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t2, modulus, mp)) != MP_OKAY) { goto error; } /* T1 = 2T2 */ if ((err = mp_mul_2(&t2, &t1)) != MP_OKAY) { goto error; } if (mp_cmp(&t1, modulus) != MP_LT) { @@ -356,10 +279,10 @@ static int dbl_point(ecc_point *P, ecc_point *R, mp_int *modulus, mp_int *mu) } /* Y = Y * Y */ if ((err = mp_sqr(&R->y, &R->y)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&R->y, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&R->y, modulus, mp)) != MP_OKAY) { goto error; } /* T2 = Y * Y */ if ((err = mp_sqr(&R->y, &t2)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t2, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t2, modulus, mp)) != MP_OKAY) { goto error; } /* T2 = T2/2 */ if (mp_isodd(&t2)) { if ((err = mp_add(&t2, modulus, &t2)) != MP_OKAY) { goto error; } @@ -367,11 +290,11 @@ static int dbl_point(ecc_point *P, ecc_point *R, mp_int *modulus, mp_int *mu) if ((err = mp_div_2(&t2, &t2)) != MP_OKAY) { goto error; } /* Y = Y * X */ if ((err = mp_mul(&R->y, &R->x, &R->y)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&R->y, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&R->y, modulus, mp)) != MP_OKAY) { goto error; } /* X = T1 * T1 */ if ((err = mp_sqr(&t1, &R->x)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&R->x, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&R->x, modulus, mp)) != MP_OKAY) { goto error; } /* X = X - Y */ if ((err = mp_sub(&R->x, &R->y, &R->x)) != MP_OKAY) { goto error; } if (mp_cmp_d(&R->x, 0) == MP_LT) { @@ -390,7 +313,7 @@ static int dbl_point(ecc_point *P, ecc_point *R, mp_int *modulus, mp_int *mu) } /* Y = Y * T1 */ if ((err = mp_mul(&R->y, &t1, &R->y)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&R->y, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&R->y, modulus, mp)) != MP_OKAY) { goto error; } /* Y = Y - T2 */ if ((err = mp_sub(&R->y, &t2, &R->y)) != MP_OKAY) { goto error; } if (mp_cmp_d(&R->y, 0) == MP_LT) { @@ -407,7 +330,7 @@ done: } /* add two different points over Z/pZ, R = P + Q, note R can equal either P or Q */ -static int add_point(ecc_point *P, ecc_point *Q, ecc_point *R, mp_int *modulus, mp_int *mu) +static int add_point(ecc_point *P, ecc_point *Q, ecc_point *R, mp_int *modulus, mp_digit mp) { mp_int t1, t2, x, y, z; int err; @@ -420,34 +343,31 @@ static int add_point(ecc_point *P, ecc_point *Q, ecc_point *R, mp_int *modulus, if ((err = mp_copy(&P->y, &y)) != MP_OKAY) { goto error; } if ((err = mp_copy(&P->z, &z)) != MP_OKAY) { goto error; } - /* if Z' != 1 */ - if (mp_cmp_d(&Q->z, 1) != MP_EQ) { /* T1 = Z' * Z' */ if ((err = mp_sqr(&Q->z, &t1)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t1, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t1, modulus, mp)) != MP_OKAY) { goto error; } /* X = X * T1 */ if ((err = mp_mul(&t1, &x, &x)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&x, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&x, modulus, mp)) != MP_OKAY) { goto error; } /* T1 = Z' * T1 */ if ((err = mp_mul(&Q->z, &t1, &t1)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t1, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t1, modulus, mp)) != MP_OKAY) { goto error; } /* Y = Y * T1 */ if ((err = mp_mul(&t1, &y, &y)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&y, modulus, mu)) != MP_OKAY) { goto error; } - } + if ((err = mp_montgomery_reduce(&y, modulus, mp)) != MP_OKAY) { goto error; } /* T1 = Z*Z */ if ((err = mp_sqr(&z, &t1)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t1, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t1, modulus, mp)) != MP_OKAY) { goto error; } /* T2 = X' * T1 */ if ((err = mp_mul(&Q->x, &t1, &t2)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t2, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t2, modulus, mp)) != MP_OKAY) { goto error; } /* T1 = Z * T1 */ if ((err = mp_mul(&z, &t1, &t1)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t1, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t1, modulus, mp)) != MP_OKAY) { goto error; } /* T1 = Y' * T1 */ if ((err = mp_mul(&Q->y, &t1, &t1)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t1, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t1, modulus, mp)) != MP_OKAY) { goto error; } /* Y = Y - T1 */ if ((err = mp_sub(&y, &t1, &y)) != MP_OKAY) { goto error; } @@ -484,28 +404,28 @@ static int add_point(ecc_point *P, ecc_point *Q, ecc_point *R, mp_int *modulus, if (mp_cmp_d(&Q->z, 1) != MP_EQ) { /* Z = Z * Z' */ if ((err = mp_mul(&z, &Q->z, &z)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&z, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&z, modulus, mp)) != MP_OKAY) { goto error; } } /* Z = Z * X */ if ((err = mp_mul(&z, &x, &z)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&z, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&z, modulus, mp)) != MP_OKAY) { goto error; } /* T1 = T1 * X */ if ((err = mp_mul(&t1, &x, &t1)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t1, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t1, modulus, mp)) != MP_OKAY) { goto error; } /* X = X * X */ if ((err = mp_sqr(&x, &x)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&x, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&x, modulus, mp)) != MP_OKAY) { goto error; } /* T2 = T2 * x */ if ((err = mp_mul(&t2, &x, &t2)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t2, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t2, modulus, mp)) != MP_OKAY) { goto error; } /* T1 = T1 * X */ if ((err = mp_mul(&t1, &x, &t1)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t1, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t1, modulus, mp)) != MP_OKAY) { goto error; } /* X = Y*Y */ if ((err = mp_sqr(&y, &x)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&x, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&x, modulus, mp)) != MP_OKAY) { goto error; } /* X = X - T2 */ if ((err = mp_sub(&x, &t2, &x)) != MP_OKAY) { goto error; } if (mp_cmp_d(&x, 0) == MP_LT) { @@ -524,7 +444,7 @@ static int add_point(ecc_point *P, ecc_point *Q, ecc_point *R, mp_int *modulus, } /* T2 = T2 * Y */ if ((err = mp_mul(&t2, &y, &t2)) != MP_OKAY) { goto error; } - if ((err = mp_reduce(&t2, modulus, mu)) != MP_OKAY) { goto error; } + if ((err = mp_montgomery_reduce(&t2, modulus, mp)) != MP_OKAY) { goto error; } /* Y = T2 - T1 */ if ((err = mp_sub(&t2, &t1, &y)) != MP_OKAY) { goto error; } if (mp_cmp_d(&y, 0) == MP_LT) { @@ -553,22 +473,25 @@ done: #define WINSIZE 4 /* perform R = kG where k == integer and G == ecc_point */ -static int ecc_mulmod(mp_int *k, ecc_point *G, ecc_point *R, mp_int *modulus) +static int ecc_mulmod(mp_int *k, ecc_point *G, ecc_point *R, mp_int *modulus, int map) { ecc_point *tG, *M[8]; int i, j, err; mp_int mu; - mp_digit buf; + mp_digit buf, mp; int first, bitbuf, bitcpy, bitcnt, mode, digidx; - /* init barrett reduction */ - if ((err = mp_init(&mu)) != MP_OKAY) { - return mpi_to_ltc_error(err); - } - if ((err = mp_reduce_setup(&mu, modulus)) != MP_OKAY) { + /* init montgomery reduction */ + if ((err = mp_montgomery_setup(modulus, &mp)) != MP_OKAY) { + return CRYPT_INVALID_ARG; + } + if ((err = mp_init(&mu)) != MP_OKAY) { + return CRYPT_MEM; + } + if ((err = mp_montgomery_calc_normalization(&mu, modulus)) != MP_OKAY) { mp_clear(&mu); - return mpi_to_ltc_error(err); - } + return CRYPT_INVALID_ARG; + } /* alloc ram for window temps */ for (i = 0; i < 8; i++) { @@ -586,20 +509,21 @@ static int ecc_mulmod(mp_int *k, ecc_point *G, ecc_point *R, mp_int *modulus) tG = new_point(); if (tG == NULL) { err = CRYPT_MEM; goto done; } - /* tG = G */ - if ((err = mp_copy(&G->x, &tG->x)) != MP_OKAY) { goto error; } - if ((err = mp_copy(&G->y, &tG->y)) != MP_OKAY) { goto error; } - if ((err = mp_copy(&G->z, &tG->z)) != MP_OKAY) { goto error; } + /* tG = G and convert to montgomery */ + if ((err = mp_mulmod(&G->x, &mu, modulus, &tG->x)) != MP_OKAY) { goto error; } + if ((err = mp_mulmod(&G->y, &mu, modulus, &tG->y)) != MP_OKAY) { goto error; } + if ((err = mp_mulmod(&G->z, &mu, modulus, &tG->z)) != MP_OKAY) { goto error; } + mp_clear(&mu); /* calc the M tab, which holds kG for k==8..15 */ /* M[0] == 8G */ - if ((err = dbl_point(G, M[0], modulus, &mu)) != CRYPT_OK) { goto done; } - if ((err = dbl_point(M[0], M[0], modulus, &mu)) != CRYPT_OK) { goto done; } - if ((err = dbl_point(M[0], M[0], modulus, &mu)) != CRYPT_OK) { goto done; } + if ((err = dbl_point(tG, M[0], modulus, mp)) != CRYPT_OK) { goto done; } + if ((err = dbl_point(M[0], M[0], modulus, mp)) != CRYPT_OK) { goto done; } + if ((err = dbl_point(M[0], M[0], modulus, mp)) != CRYPT_OK) { goto done; } /* now find (8+k)G for k=1..7 */ for (j = 9; j < 16; j++) { - if ((err = add_point(M[j-9], G, M[j-8], modulus, &mu)) != CRYPT_OK) { goto done; } + if ((err = add_point(M[j-9], tG, M[j-8], modulus, mp)) != CRYPT_OK) { goto done; } } /* setup sliding window */ @@ -621,7 +545,7 @@ static int ecc_mulmod(mp_int *k, ecc_point *G, ecc_point *R, mp_int *modulus) bitcnt = (int) DIGIT_BIT; } - /* grab the next msb from the multiplicand */ + /* grab the next msb from the ltiplicand */ i = (buf >> (DIGIT_BIT - 1)) & 1; buf <<= 1; @@ -632,7 +556,7 @@ static int ecc_mulmod(mp_int *k, ecc_point *G, ecc_point *R, mp_int *modulus) /* if the bit is zero and mode == 1 then we double */ if (mode == 1 && i == 0) { - if ((err = dbl_point(R, R, modulus, &mu)) != CRYPT_OK) { goto done; } + if ((err = dbl_point(R, R, modulus, mp)) != CRYPT_OK) { goto done; } continue; } @@ -653,11 +577,11 @@ static int ecc_mulmod(mp_int *k, ecc_point *G, ecc_point *R, mp_int *modulus) /* ok window is filled so double as required and add */ /* double first */ for (j = 0; j < WINSIZE; j++) { - if ((err = dbl_point(R, R, modulus, &mu)) != CRYPT_OK) { goto done; } + if ((err = dbl_point(R, R, modulus, mp)) != CRYPT_OK) { goto done; } } /* then add, bitbuf will be 8..15 [8..2^WINSIZE] guaranteed */ - if ((err = add_point(R, M[bitbuf-8], R, modulus, &mu)) != CRYPT_OK) { goto done; } + if ((err = add_point(R, M[bitbuf-8], R, modulus, mp)) != CRYPT_OK) { goto done; } } /* empty window and reset */ bitcpy = bitbuf = 0; @@ -671,7 +595,7 @@ static int ecc_mulmod(mp_int *k, ecc_point *G, ecc_point *R, mp_int *modulus) for (j = 0; j < bitcpy; j++) { /* only double if we have had at least one add first */ if (first == 0) { - if ((err = dbl_point(R, R, modulus, &mu)) != CRYPT_OK) { goto done; } + if ((err = dbl_point(R, R, modulus, mp)) != CRYPT_OK) { goto done; } } bitbuf <<= 1; @@ -684,14 +608,19 @@ static int ecc_mulmod(mp_int *k, ecc_point *G, ecc_point *R, mp_int *modulus) first = 0; } else { /* then add */ - if ((err = add_point(R, tG, R, modulus, &mu)) != CRYPT_OK) { goto done; } + if ((err = add_point(R, tG, R, modulus, mp)) != CRYPT_OK) { goto done; } } } } } /* map R back from projective space */ - err = ecc_map(R, modulus, &mu); + if (map) { + err = ecc_map(R, modulus, mp); + } else { + err = CRYPT_OK; + } + goto done; error: err = mpi_to_ltc_error(err); @@ -700,7 +629,6 @@ done: for (i = 0; i < 8; i++) { del_point(M[i]); } - mp_clear(&mu); return err; } @@ -756,7 +684,7 @@ int ecc_test(void) /* then we should have G == (order + 1)G */ if ((err = mp_add_d(&order, 1, &order)) != MP_OKAY) { goto error; } - if ((err = ecc_mulmod(&order, G, GG, &modulus)) != CRYPT_OK) { goto done; } + if ((err = ecc_mulmod(&order, G, GG, &modulus, 1)) != CRYPT_OK) { goto done; } if (mp_cmp(&G->x, &GG->x) != 0 || mp_cmp(&G->y, &GG->y) != 0) { err = CRYPT_FAIL_TESTVECTOR; goto done; @@ -855,7 +783,7 @@ int ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key) if ((err = mp_read_unsigned_bin(&key->k, (unsigned char *)buf, keysize)) != MP_OKAY) { goto error; } /* make the public key */ - if ((err = ecc_mulmod(&key->k, base, &key->pubkey, &prime)) != CRYPT_OK) { goto LBL_ERR; } + if ((err = ecc_mulmod(&key->k, base, &key->pubkey, &prime, 1)) != CRYPT_OK) { goto LBL_ERR; } key->type = PK_PRIVATE; /* shrink key */ @@ -892,89 +820,6 @@ void ecc_free(ecc_key *key) mp_clear_multi(&key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k, NULL); } -static int compress_y_point(ecc_point *pt, int idx, int *result) -{ - mp_int tmp, tmp2, p; - int err; - - LTC_ARGCHK(pt != NULL); - LTC_ARGCHK(result != NULL); - - if ((err = mp_init_multi(&tmp, &tmp2, &p, NULL)) != MP_OKAY) { - return mpi_to_ltc_error(err); - } - - /* get x^3 - 3x + b */ - if ((err = mp_read_radix(&p, (char *)sets[idx].B, 64)) != MP_OKAY) { goto error; } /* p = B */ - if ((err = mp_expt_d(&pt->x, 3, &tmp)) != MP_OKAY) { goto error; } /* tmp = pX^3 */ - if ((err = mp_mul_d(&pt->x, 3, &tmp2)) != MP_OKAY) { goto error; } /* tmp2 = 3*pX^3 */ - if ((err = mp_sub(&tmp, &tmp2, &tmp)) != MP_OKAY) { goto error; } /* tmp = tmp - tmp2 */ - if ((err = mp_add(&tmp, &p, &tmp)) != MP_OKAY) { goto error; } /* tmp = tmp + p */ - if ((err = mp_read_radix(&p, (char *)sets[idx].prime, 64)) != MP_OKAY) { goto error; } /* p = prime */ - if ((err = mp_mod(&tmp, &p, &tmp)) != MP_OKAY) { goto error; } /* tmp = tmp mod p */ - - /* now find square root */ - if ((err = mp_add_d(&p, 1, &tmp2)) != MP_OKAY) { goto error; } /* tmp2 = p + 1 */ - if ((err = mp_div_2d(&tmp2, 2, &tmp2, NULL)) != MP_OKAY) { goto error; } /* tmp2 = (p+1)/4 */ - if ((err = mp_exptmod(&tmp, &tmp2, &p, &tmp)) != MP_OKAY) { goto error; } /* tmp = (x^3 - 3x + b)^((p+1)/4) mod p */ - - /* if tmp equals the y point give a 0, otherwise 1 */ - if (mp_cmp(&tmp, &pt->y) == 0) { - *result = 0; - } else { - *result = 1; - } - - err = CRYPT_OK; - goto done; -error: - err = mpi_to_ltc_error(err); -done: - mp_clear_multi(&p, &tmp, &tmp2, NULL); - return err; -} - -static int expand_y_point(ecc_point *pt, int idx, int result) -{ - mp_int tmp, tmp2, p; - int err; - - LTC_ARGCHK(pt != NULL); - - if ((err = mp_init_multi(&tmp, &tmp2, &p, NULL)) != MP_OKAY) { - return CRYPT_MEM; - } - - /* get x^3 - 3x + b */ - if ((err = mp_read_radix(&p, (char *)sets[idx].B, 64)) != MP_OKAY) { goto error; } /* p = B */ - if ((err = mp_expt_d(&pt->x, 3, &tmp)) != MP_OKAY) { goto error; } /* tmp = pX^3 */ - if ((err = mp_mul_d(&pt->x, 3, &tmp2)) != MP_OKAY) { goto error; } /* tmp2 = 3*pX^3 */ - if ((err = mp_sub(&tmp, &tmp2, &tmp)) != MP_OKAY) { goto error; } /* tmp = tmp - tmp2 */ - if ((err = mp_add(&tmp, &p, &tmp)) != MP_OKAY) { goto error; } /* tmp = tmp + p */ - if ((err = mp_read_radix(&p, (char *)sets[idx].prime, 64)) != MP_OKAY) { goto error; } /* p = prime */ - if ((err = mp_mod(&tmp, &p, &tmp)) != MP_OKAY) { goto error; } /* tmp = tmp mod p */ - - /* now find square root */ - if ((err = mp_add_d(&p, 1, &tmp2)) != MP_OKAY) { goto error; } /* tmp2 = p + 1 */ - if ((err = mp_div_2d(&tmp2, 2, &tmp2, NULL)) != MP_OKAY) { goto error; } /* tmp2 = (p+1)/4 */ - if ((err = mp_exptmod(&tmp, &tmp2, &p, &tmp)) != MP_OKAY) { goto error; } /* tmp = (x^3 - 3x + b)^((p+1)/4) mod p */ - - /* if result==0, then y==tmp, otherwise y==p-tmp */ - if (result == 0) { - if ((err = mp_copy(&tmp, &pt->y) != MP_OKAY)) { goto error; } - } else { - if ((err = mp_sub(&p, &tmp, &pt->y) != MP_OKAY)) { goto error; } - } - - err = CRYPT_OK; - goto done; -error: - err = mpi_to_ltc_error(err); -done: - mp_clear_multi(&p, &tmp, &tmp2, NULL); - return err; -} - /** Export an ECC key as a binary packet @param out [out] Destination for the key @@ -985,46 +830,46 @@ done: */ int ecc_export(unsigned char *out, unsigned long *outlen, int type, ecc_key *key) { - unsigned long y, z; - int cp, err; + int err; + unsigned char flags[1]; + unsigned long key_size; LTC_ARGCHK(out != NULL); LTC_ARGCHK(outlen != NULL); LTC_ARGCHK(key != NULL); - /* can we store the static header? */ - if (*outlen < (PACKET_SIZE + 3)) { - return CRYPT_BUFFER_OVERFLOW; - } - /* type valid? */ if (key->type != PK_PRIVATE && type == PK_PRIVATE) { return CRYPT_PK_TYPE_MISMATCH; } - /* output type and magic byte */ - y = PACKET_SIZE; - out[y++] = (unsigned char)type; - out[y++] = (unsigned char)sets[key->idx].size; - - /* output x coordinate */ - OUTPUT_BIGNUM(&(key->pubkey.x), out, y, z); - - /* compress y and output it */ - if ((err = compress_y_point(&key->pubkey, key->idx, &cp)) != CRYPT_OK) { - return err; + if (is_valid_idx(key->idx) == 0) { + return CRYPT_INVALID_ARG; } - out[y++] = (unsigned char)cp; + + /* we store the NIST byte size */ + key_size = sets[key->idx].size; if (type == PK_PRIVATE) { - OUTPUT_BIGNUM(&key->k, out, y, z); + flags[0] = 1; + err = der_encode_sequence_multi(out, outlen, + LTC_ASN1_BIT_STRING, 1UL, flags, + LTC_ASN1_SHORT_INTEGER, 1UL, &key_size, + LTC_ASN1_INTEGER, 1UL, &key->pubkey.x, + LTC_ASN1_INTEGER, 1UL, &key->pubkey.y, + LTC_ASN1_INTEGER, 1UL, &key->k, + LTC_ASN1_EOL, 0UL, NULL); + } else { + flags[0] = 0; + err = der_encode_sequence_multi(out, outlen, + LTC_ASN1_BIT_STRING, 1UL, flags, + LTC_ASN1_SHORT_INTEGER, 1UL, &key_size, + LTC_ASN1_INTEGER, 1UL, &key->pubkey.x, + LTC_ASN1_INTEGER, 1UL, &key->pubkey.y, + LTC_ASN1_EOL, 0UL, NULL); } - /* store header */ - packet_store_header(out, PACKET_SECT_ECC, PACKET_SUB_KEY); - *outlen = y; - - return CRYPT_OK; + return err; } /** @@ -1036,72 +881,63 @@ int ecc_export(unsigned char *out, unsigned long *outlen, int type, ecc_key *key */ int ecc_import(const unsigned char *in, unsigned long inlen, ecc_key *key) { - unsigned long x, y, s; - int err; + unsigned long key_size; + unsigned char flags[1]; + int err; LTC_ARGCHK(in != NULL); LTC_ARGCHK(key != NULL); - /* check length */ - if ((3+PACKET_SIZE) > inlen) { - return CRYPT_INVALID_PACKET; - } - - /* check type */ - if ((err = packet_valid_header((unsigned char *)in, PACKET_SECT_ECC, PACKET_SUB_KEY)) != CRYPT_OK) { - return err; - } - /* init key */ if (mp_init_multi(&key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k, NULL) != MP_OKAY) { return CRYPT_MEM; } - y = PACKET_SIZE; - key->type = (int)in[y++]; - s = (unsigned long)in[y++]; - - for (x = 0; (s > (unsigned long)sets[x].size) && (sets[x].size != 0); x++); - if (sets[x].size == 0) { - err = CRYPT_INVALID_KEYSIZE; + /* find out what type of key it is */ + if ((err = der_decode_sequence_multi(in, inlen, + LTC_ASN1_BIT_STRING, 1UL, &flags, + LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { goto error; } - key->idx = (int)x; - /* type check both values */ - if ((key->type != PK_PUBLIC) && (key->type != PK_PRIVATE)) { + + if (flags[0] == 1) { + /* private key */ + key->type = PK_PRIVATE; + if ((err = der_decode_sequence_multi(in, inlen, + LTC_ASN1_BIT_STRING, 1UL, flags, + LTC_ASN1_SHORT_INTEGER, 1UL, &key_size, + LTC_ASN1_INTEGER, 1UL, &key->pubkey.x, + LTC_ASN1_INTEGER, 1UL, &key->pubkey.y, + LTC_ASN1_INTEGER, 1UL, &key->k, + LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { + goto error; + } + } else { + /* public key */ + /* private key */ + key->type = PK_PUBLIC; + if ((err = der_decode_sequence_multi(in, inlen, + LTC_ASN1_BIT_STRING, 1UL, flags, + LTC_ASN1_SHORT_INTEGER, 1UL, &key_size, + LTC_ASN1_INTEGER, 1UL, &key->pubkey.x, + LTC_ASN1_INTEGER, 1UL, &key->pubkey.y, + LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { + goto error; + } + } + + /* find the idx */ + for (key->idx = 0; sets[key->idx].size && (unsigned long)sets[key->idx].size != key_size; ++key->idx); + if (sets[key->idx].size == 0) { err = CRYPT_INVALID_PACKET; goto error; } - /* is the key idx valid? */ - if (is_valid_idx(key->idx) != 1) { - err = CRYPT_INVALID_PACKET; - goto error; - } - - /* load x coordinate */ - INPUT_BIGNUM(&key->pubkey.x, in, x, y, inlen); - - /* load y */ - x = (unsigned long)in[y++]; - if ((err = expand_y_point(&key->pubkey, key->idx, (int)x)) != CRYPT_OK) { - goto error; - } - - if (key->type == PK_PRIVATE) { - /* load private key */ - INPUT_BIGNUM(&key->k, in, x, y, inlen); - } - - /* eliminate private key if public */ - if (key->type == PK_PUBLIC) { - mp_clear(&key->k); - } - - /* z is always 1 */ + /* set z */ mp_set(&key->pubkey.z, 1); + /* we're good */ return CRYPT_OK; error: mp_clear_multi(&key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k, NULL); @@ -1112,14 +948,14 @@ error: Create an ECC shared secret between two keys @param private_key The private ECC key @param public_key The public key - @param out [out] Destination of the shared secret + @param out [out] Destination of the shared secret (Conforms to EC-DH from ANSI X9.63) @param outlen [in/out] The max size and resulting size of the shared secret @return CRYPT_OK if successful */ int ecc_shared_secret(ecc_key *private_key, ecc_key *public_key, unsigned char *out, unsigned long *outlen) { - unsigned long x, y; + unsigned long x; ecc_point *result; mp_int prime; int err; @@ -1134,6 +970,10 @@ int ecc_shared_secret(ecc_key *private_key, ecc_key *public_key, return CRYPT_PK_NOT_PRIVATE; } + if (is_valid_idx(private_key->idx) == 0) { + return CRYPT_INVALID_ARG; + } + if (private_key->idx != public_key->idx) { return CRYPT_PK_TYPE_MISMATCH; } @@ -1149,21 +989,19 @@ int ecc_shared_secret(ecc_key *private_key, ecc_key *public_key, return mpi_to_ltc_error(err); } - if ((err = mp_read_radix(&prime, (char *)sets[private_key->idx].prime, 64)) != MP_OKAY) { goto error; } - if ((err = ecc_mulmod(&private_key->k, &public_key->pubkey, result, &prime)) != CRYPT_OK) { goto done1; } + if ((err = mp_read_radix(&prime, (char *)sets[private_key->idx].prime, 64)) != MP_OKAY) { goto error; } + if ((err = ecc_mulmod(&private_key->k, &public_key->pubkey, result, &prime, 1)) != CRYPT_OK) { goto done1; } - x = (unsigned long)mp_unsigned_bin_size(&result->x); - y = (unsigned long)mp_unsigned_bin_size(&result->y); - - if (*outlen < (x+y)) { + x = (unsigned long)mp_unsigned_bin_size(&prime); + if (*outlen < x) { err = CRYPT_BUFFER_OVERFLOW; goto done1; } - *outlen = x+y; - if ((err = mp_to_unsigned_bin(&result->x, out)) != MP_OKAY) { goto error; } - if ((err = mp_to_unsigned_bin(&result->y, out+x)) != MP_OKAY) { goto error; } + zeromem(out, x); + if ((err = mp_to_unsigned_bin(&result->x, out + (x - mp_unsigned_bin_size(&result->x)))) != MP_OKAY) { goto error; } - err = CRYPT_OK; + err = CRYPT_OK; + *outlen = x; goto done1; error: err = mpi_to_ltc_error(err); @@ -1192,3 +1030,7 @@ int ecc_get_size(ecc_key *key) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/ecc/ecc.c,v $ */ +/* $Revision: 1.20 $ */ +/* $Date: 2005/06/14 20:42:28 $ */ diff --git a/src/pk/ecc/ecc_sys.c b/src/pk/ecc/ecc_sys.c index d5576f6..65ead31 100644 --- a/src/pk/ecc/ecc_sys.c +++ b/src/pk/ecc/ecc_sys.c @@ -33,7 +33,7 @@ int ecc_encrypt_key(const unsigned char *in, unsigned long inlen, { unsigned char *pub_expt, *ecc_shared, *skey; ecc_key pubkey; - unsigned long x, y, z, hashsize, pubkeysize; + unsigned long x, y, pubkeysize; int err; LTC_ARGCHK(in != NULL); @@ -82,53 +82,29 @@ int ecc_encrypt_key(const unsigned char *in, unsigned long inlen, goto LBL_ERR; } - /* now check if the out buffer is big enough */ - if (*outlen < (9 + PACKET_SIZE + pubkeysize + hash_descriptor[hash].hashsize)) { - ecc_free(&pubkey); - err = CRYPT_BUFFER_OVERFLOW; - goto LBL_ERR; - } - /* make random key */ - hashsize = hash_descriptor[hash].hashsize; - x = ECC_BUF_SIZE; + x = ECC_BUF_SIZE; if ((err = ecc_shared_secret(&pubkey, key, ecc_shared, &x)) != CRYPT_OK) { ecc_free(&pubkey); goto LBL_ERR; } ecc_free(&pubkey); - z = MAXBLOCKSIZE; - if ((err = hash_memory(hash, ecc_shared, x, skey, &z)) != CRYPT_OK) { + y = MAXBLOCKSIZE; + if ((err = hash_memory(hash, ecc_shared, x, skey, &y)) != CRYPT_OK) { goto LBL_ERR; } - /* store header */ - packet_store_header(out, PACKET_SECT_ECC, PACKET_SUB_ENC_KEY); - - /* output header */ - y = PACKET_SIZE; - - /* size of hash name and the name itself */ - out[y++] = hash_descriptor[hash].ID; - - /* length of ECC pubkey and the key itself */ - STORE32L(pubkeysize, out+y); - y += 4; - - for (x = 0; x < pubkeysize; x++, y++) { - out[y] = pub_expt[x]; + /* Encrypt key */ + for (x = 0; x < inlen; x++) { + skey[x] ^= in[x]; } - STORE32L(inlen, out+y); - y += 4; + err = der_encode_sequence_multi(out, outlen, + LTC_ASN1_OBJECT_IDENTIFIER, hash_descriptor[hash].OIDlen, hash_descriptor[hash].OID, + LTC_ASN1_OCTET_STRING, pubkeysize, pub_expt, + LTC_ASN1_OCTET_STRING, inlen, skey, + LTC_ASN1_EOL, 0UL, NULL); - /* Encrypt/Store the encrypted key */ - for (x = 0; x < inlen; x++, y++) { - out[y] = skey[x] ^ in[x]; - } - *outlen = y; - - err = CRYPT_OK; LBL_ERR: #ifdef LTC_CLEAN_STACK /* clean up */ @@ -157,10 +133,11 @@ int ecc_decrypt_key(const unsigned char *in, unsigned long inlen, unsigned char *out, unsigned long *outlen, ecc_key *key) { - unsigned char *shared_secret, *skey; - unsigned long x, y, z, hashsize, keysize; + unsigned char *ecc_shared, *skey, *pub_expt; + unsigned long x, y, hashOID[32]; int hash, err; ecc_key pubkey; + ltc_asn1_list decode[3]; LTC_ARGCHK(in != NULL); LTC_ARGCHK(out != NULL); @@ -172,98 +149,93 @@ int ecc_decrypt_key(const unsigned char *in, unsigned long inlen, return CRYPT_PK_NOT_PRIVATE; } - /* correct length ? */ - if (inlen < PACKET_SIZE+1+4+4) { - return CRYPT_INVALID_PACKET; - } else { - inlen -= PACKET_SIZE+1+4+4; - } - - /* is header correct? */ - if ((err = packet_valid_header((unsigned char *)in, PACKET_SECT_ECC, PACKET_SUB_ENC_KEY)) != CRYPT_OK) { + /* decode to find out hash */ + LTC_SET_ASN1(decode, 0, LTC_ASN1_OBJECT_IDENTIFIER, hashOID, sizeof(hashOID)/sizeof(hashOID[0])); + + if ((err = der_decode_sequence(in, inlen, decode, 1)) != CRYPT_OK) { return err; } + for (hash = 0; hash_descriptor[hash].name != NULL && + (hash_descriptor[hash].OIDlen != decode[0].size || + memcmp(hash_descriptor[hash].OID, hashOID, sizeof(unsigned long)*decode[0].size)); hash++); - /* now lets get the hash name */ - y = PACKET_SIZE; - hash = find_hash_id(in[y++]); - if (hash == -1) { - return CRYPT_INVALID_HASH; - } - - /* common values */ - hashsize = hash_descriptor[hash].hashsize; - - /* get public key */ - LOAD32L(x, in+y); - if (inlen < x) { + if (hash_descriptor[hash].name == NULL) { return CRYPT_INVALID_PACKET; - } else { - inlen -= x; } - y += 4; - if ((err = ecc_import(in+y, x, &pubkey)) != CRYPT_OK) { - return err; - } - y += x; + + /* we now have the hash! */ /* allocate memory */ - shared_secret = XMALLOC(ECC_BUF_SIZE); - skey = XMALLOC(MAXBLOCKSIZE); - if (shared_secret == NULL || skey == NULL) { - if (shared_secret != NULL) { - XFREE(shared_secret); + pub_expt = XMALLOC(ECC_BUF_SIZE); + ecc_shared = XMALLOC(ECC_BUF_SIZE); + skey = XMALLOC(MAXBLOCKSIZE); + if (pub_expt == NULL || ecc_shared == NULL || skey == NULL) { + if (pub_expt != NULL) { + XFREE(pub_expt); + } + if (ecc_shared != NULL) { + XFREE(ecc_shared); } if (skey != NULL) { XFREE(skey); } - ecc_free(&pubkey); return CRYPT_MEM; } + LTC_SET_ASN1(decode, 1, LTC_ASN1_OCTET_STRING, pub_expt, ECC_BUF_SIZE); + LTC_SET_ASN1(decode, 2, LTC_ASN1_OCTET_STRING, skey, MAXBLOCKSIZE); + + /* read the structure in now */ + if ((err = der_decode_sequence(in, inlen, decode, 3)) != CRYPT_OK) { + goto LBL_ERR; + } + + /* import ECC key from packet */ + if ((err = ecc_import(decode[1].data, decode[1].size, &pubkey)) != CRYPT_OK) { + goto LBL_ERR; + } /* make shared key */ x = ECC_BUF_SIZE; - if ((err = ecc_shared_secret(key, &pubkey, shared_secret, &x)) != CRYPT_OK) { + if ((err = ecc_shared_secret(key, &pubkey, ecc_shared, &x)) != CRYPT_OK) { ecc_free(&pubkey); goto LBL_ERR; } ecc_free(&pubkey); - z = MAXBLOCKSIZE; - if ((err = hash_memory(hash, shared_secret, x, skey, &z)) != CRYPT_OK) { + y = MAXBLOCKSIZE; + if ((err = hash_memory(hash, ecc_shared, x, ecc_shared, &y)) != CRYPT_OK) { goto LBL_ERR; } - LOAD32L(keysize, in+y); - if (inlen < keysize) { + /* ensure the hash of the shared secret is at least as big as the encrypt itself */ + if (decode[2].size > y) { err = CRYPT_INVALID_PACKET; goto LBL_ERR; - } else { - inlen -= keysize; } - y += 4; - if (*outlen < keysize) { - err = CRYPT_BUFFER_OVERFLOW; - goto LBL_ERR; + /* avoid buffer overflow */ + if (*outlen < decode[2].size) { + err = CRYPT_BUFFER_OVERFLOW; + goto LBL_ERR; } /* Decrypt the key */ - for (x = 0; x < keysize; x++, y++) { - out[x] = skey[x] ^ in[y]; + for (x = 0; x < decode[2].size; x++) { + out[x] = skey[x] ^ ecc_shared[x]; } - - *outlen = keysize; + *outlen = x; err = CRYPT_OK; LBL_ERR: #ifdef LTC_CLEAN_STACK - zeromem(shared_secret, ECC_BUF_SIZE); - zeromem(skey, MAXBLOCKSIZE); + zeromem(pub_expt, ECC_BUF_SIZE); + zeromem(ecc_shared, ECC_BUF_SIZE); + zeromem(skey, MAXBLOCKSIZE); #endif + XFREE(pub_expt); + XFREE(ecc_shared); XFREE(skey); - XFREE(shared_secret); return err; } @@ -284,9 +256,7 @@ int ecc_sign_hash(const unsigned char *in, unsigned long inlen, prng_state *prng, int wprng, ecc_key *key) { ecc_key pubkey; - mp_int b, p; - unsigned char *epubkey, *er; - unsigned long x, y, pubkeysize, rsize; + mp_int r, s, e, p; int err; LTC_ARGCHK(in != NULL); @@ -308,116 +278,65 @@ int ecc_sign_hash(const unsigned char *in, unsigned long inlen, return err; } - /* make up a key and export the public copy */ - if ((err = ecc_make_key(prng, wprng, ecc_get_size(key), &pubkey)) != CRYPT_OK) { - return err; - } - - /* allocate ram */ - epubkey = XMALLOC(ECC_BUF_SIZE); - er = XMALLOC(ECC_BUF_SIZE); - if (epubkey == NULL || er == NULL) { - if (epubkey != NULL) { - XFREE(epubkey); - } - if (er != NULL) { - XFREE(er); - } - ecc_free(&pubkey); - return CRYPT_MEM; - } - - pubkeysize = ECC_BUF_SIZE; - if ((err = ecc_export(epubkey, &pubkeysize, PK_PUBLIC, &pubkey)) != CRYPT_OK) { - ecc_free(&pubkey); - goto LBL_ERR; - } - - /* get the hash and load it as a bignum into 'b' */ + /* get the hash and load it as a bignum into 'e' */ /* init the bignums */ - if ((err = mp_init_multi(&b, &p, NULL)) != MP_OKAY) { + if ((err = mp_init_multi(&r, &s, &p, &e, NULL)) != MP_OKAY) { ecc_free(&pubkey); err = mpi_to_ltc_error(err); goto LBL_ERR; } if ((err = mp_read_radix(&p, (char *)sets[key->idx].order, 64)) != MP_OKAY) { goto error; } - if ((err = mp_read_unsigned_bin(&b, (unsigned char *)in, (int)inlen)) != MP_OKAY) { goto error; } + if ((err = mp_read_unsigned_bin(&e, (unsigned char *)in, (int)inlen)) != MP_OKAY) { goto error; } - /* find b = (m - x)/k */ - if ((err = mp_invmod(&pubkey.k, &p, &pubkey.k)) != MP_OKAY) { goto error; } /* k = 1/k */ - if ((err = mp_submod(&b, &key->k, &p, &b)) != MP_OKAY) { goto error; } /* b = m - x */ - if ((err = mp_mulmod(&b, &pubkey.k, &p, &b)) != MP_OKAY) { goto error; } /* b = (m - x)/k */ + /* make up a key and export the public copy */ + for (;;) { + if ((err = ecc_make_key(prng, wprng, ecc_get_size(key), &pubkey)) != CRYPT_OK) { + return err; + } - /* export it */ - rsize = (unsigned long)mp_unsigned_bin_size(&b); - if (rsize > ECC_BUF_SIZE) { - err = CRYPT_BUFFER_OVERFLOW; - goto error; - } - if ((err = mp_to_unsigned_bin(&b, er)) != MP_OKAY) { goto error; } + /* find r = x1 mod n */ + if ((err = mp_mod(&pubkey.pubkey.x, &p, &r)) != MP_OKAY) { goto error; } - /* now lets check the outlen before we write */ - if (*outlen < (12 + rsize + pubkeysize)) { - err = CRYPT_BUFFER_OVERFLOW; - goto LBL_ERR; + if (mp_iszero(&r)) { + ecc_free(&pubkey); + } else { + /* find s = (e + xr)/k */ + if ((err = mp_invmod(&pubkey.k, &p, &pubkey.k)) != MP_OKAY) { goto error; } /* k = 1/k */ + if ((err = mp_mulmod(&key->k, &r, &p, &s)) != MP_OKAY) { goto error; } /* s = xr */ + if ((err = mp_addmod(&e, &s, &p, &s)) != MP_OKAY) { goto error; } /* s = e + xr */ + if ((err = mp_mulmod(&s, &pubkey.k, &p, &s)) != MP_OKAY) { goto error; } /* s = (e + xr)/k */ + + if (mp_iszero(&s)) { + ecc_free(&pubkey); + } else { + break; + } + } } - /* lets output */ - y = PACKET_SIZE; - - /* size of public key */ - STORE32L(pubkeysize, out+y); - y += 4; - - /* copy the public key */ - for (x = 0; x < pubkeysize; x++, y++) { - out[y] = epubkey[x]; - } - - /* size of 'r' */ - STORE32L(rsize, out+y); - y += 4; - - /* copy r */ - for (x = 0; x < rsize; x++, y++) { - out[y] = er[x]; - } - - /* store header */ - packet_store_header(out, PACKET_SECT_ECC, PACKET_SUB_SIGNED); - *outlen = y; - - /* all ok */ - err = CRYPT_OK; + /* store as SEQUENCE { r, s -- integer } */ + err = der_encode_sequence_multi(out, outlen, + LTC_ASN1_INTEGER, 1UL, &r, + LTC_ASN1_INTEGER, 1UL, &s, + LTC_ASN1_EOL, 0UL, NULL); goto LBL_ERR; error: err = mpi_to_ltc_error(err); LBL_ERR: - mp_clear_multi(&b, &p, NULL); + mp_clear_multi(&r, &s, &p, &e, NULL); ecc_free(&pubkey); -#ifdef LTC_CLEAN_STACK - zeromem(er, ECC_BUF_SIZE); - zeromem(epubkey, ECC_BUF_SIZE); -#endif - - XFREE(epubkey); - XFREE(er); return err; } -/* verify that mG = (bA + Y) +/* verify * - * The signatures work by making up a fresh key "a" with a public key "A". Now we want to sign so the - * public key Y = xG can verify it. - * - * b = (m - x)/k, A is the public key embedded and Y is the users public key [who signed it] - * A = kG therefore bA == ((m-x)/k)kG == (m-x)G - * - * Adding Y = xG to the bA gives us (m-x)G + xG == mG - * - * The user given only xG, kG and b cannot determine k or x which means they can't find the private key. - * + * w = s^-1 mod n + * u1 = xw + * u2 = rw + * X = u1*G + u2*Q + * v = X_x1 mod n + * accept if v == r */ /** @@ -434,10 +353,9 @@ int ecc_verify_hash(const unsigned char *sig, unsigned long siglen, const unsigned char *hash, unsigned long hashlen, int *stat, ecc_key *key) { - ecc_point *mG; - ecc_key pubkey; - mp_int b, p, m, mu; - unsigned long x, y; + ecc_point *mG, *mQ; + mp_int r, s, v, w, u1, u2, e, p, m; + mp_digit mp; int err; LTC_ARGCHK(sig != NULL); @@ -448,89 +366,81 @@ int ecc_verify_hash(const unsigned char *sig, unsigned long siglen, /* default to invalid signature */ *stat = 0; - if (siglen < PACKET_SIZE+4+4) { - return CRYPT_INVALID_PACKET; - } else { - siglen -= PACKET_SIZE+4+4; + /* is the IDX valid ? */ + if (is_valid_idx(key->idx) != 1) { + return CRYPT_PK_INVALID_TYPE; } - /* is the message format correct? */ - if ((err = packet_valid_header((unsigned char *)sig, PACKET_SECT_ECC, PACKET_SUB_SIGNED)) != CRYPT_OK) { - return err; - } - - /* get hash name */ - y = PACKET_SIZE; - - /* get size of public key */ - LOAD32L(x, sig+y); - if (siglen < x) { - return CRYPT_INVALID_PACKET; - } else { - siglen -= x; - } - y += 4; - - /* load the public key */ - if ((err = ecc_import((unsigned char*)sig+y, x, &pubkey)) != CRYPT_OK) { - return err; - } - y += x; - - /* load size of 'b' */ - LOAD32L(x, sig+y); - if (siglen < x) { - return CRYPT_INVALID_PACKET; - } else { - siglen -= x; - } - y += 4; - - /* init values */ - if ((err = mp_init_multi(&b, &m, &p, &mu, NULL)) != MP_OKAY) { - ecc_free(&pubkey); - return mpi_to_ltc_error(err); - } - - mG = new_point(); - if (mG == NULL) { - mp_clear_multi(&b, &m, &p, &mu, NULL); - ecc_free(&pubkey); + /* allocate ints */ + if ((err = mp_init_multi(&r, &s, &v, &w, &u1, &u2, &p, &e, &m, NULL)) != MP_OKAY) { return CRYPT_MEM; - } + } - /* load b */ - if ((err = mp_read_unsigned_bin(&b, (unsigned char *)sig+y, (int)x)) != MP_OKAY) { goto error; } - y += x; + /* allocate points */ + mG = new_point(); + mQ = new_point(); + if (mQ == NULL || mG == NULL) { + err = CRYPT_MEM; + goto done; + } - /* get m in binary a bignum */ - if ((err = mp_read_unsigned_bin(&m, (unsigned char *)hash, (int)hashlen)) != MP_OKAY) { goto error; } - - /* load prime */ - if ((err = mp_read_radix(&p, (char *)sets[key->idx].prime, 64)) != MP_OKAY) { goto error; } - - /* calculate barrett stuff */ - mp_set(&mu, 1); - mp_lshd(&mu, 2 * USED(&p)); - if ((err = mp_div(&mu, &p, &mu, NULL)) != MP_OKAY) { goto error; } + /* parse header */ + if ((err = der_decode_sequence_multi(sig, siglen, + LTC_ASN1_INTEGER, 1UL, &r, + LTC_ASN1_INTEGER, 1UL, &s, + LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { + goto done; + } - /* get bA */ - if ((err = ecc_mulmod(&b, &pubkey.pubkey, &pubkey.pubkey, &p)) != CRYPT_OK) { goto done; } - - /* get bA + Y */ - if ((err = add_point(&pubkey.pubkey, &key->pubkey, &pubkey.pubkey, &p, &mu)) != CRYPT_OK) { goto done; } + /* get the order */ + if ((err = mp_read_radix(&p, (char *)sets[key->idx].order, 64)) != MP_OKAY) { goto error; } - /* we have to transform it */ - if ((err = ecc_map(&pubkey.pubkey, &p, &mu)) != CRYPT_OK) { goto done; } + /* get the modulus */ + if ((err = mp_read_radix(&m, (char *)sets[key->idx].prime, 64)) != MP_OKAY) { goto error; } - /* get mG */ + /* check for zero */ + if (mp_iszero(&r) || mp_iszero(&s) || mp_cmp(&r, &p) != MP_LT || mp_cmp(&s, &p) != MP_LT) { + err = CRYPT_INVALID_PACKET; + goto done; + } + + /* read hash */ + if ((err = mp_read_unsigned_bin(&e, (unsigned char *)hash, (int)hashlen)) != MP_OKAY) { goto error; } + + /* w = s^-1 mod n */ + if ((err = mp_invmod(&s, &p, &w)) != MP_OKAY) { goto error; } + + /* u1 = ew */ + if ((err = mp_mulmod(&e, &w, &p, &u1)) != MP_OKAY) { goto error; } + + /* u2 = rw */ + if ((err = mp_mulmod(&r, &w, &p, &u2)) != MP_OKAY) { goto error; } + + /* find mG = u1*G */ if ((err = mp_read_radix(&mG->x, (char *)sets[key->idx].Gx, 64)) != MP_OKAY) { goto error; } if ((err = mp_read_radix(&mG->y, (char *)sets[key->idx].Gy, 64)) != MP_OKAY) { goto error; } - mp_set(&mG->z, 1); - if ((err = ecc_mulmod(&m, mG, mG, &p)) != CRYPT_OK) { goto done; } + mp_set(&mG->z, 1); + if ((err = ecc_mulmod(&u1, mG, mG, &m, 0)) != CRYPT_OK) { goto done; } - /* compare mG to bA + Y */ - if (mp_cmp(&mG->x, &pubkey.pubkey.x) == MP_EQ && mp_cmp(&mG->y, &pubkey.pubkey.y) == MP_EQ) { + /* find mQ = u2*Q */ + if ((err = mp_copy(&key->pubkey.x, &mQ->x)) != MP_OKAY) { goto error; } + if ((err = mp_copy(&key->pubkey.y, &mQ->y)) != MP_OKAY) { goto error; } + if ((err = mp_copy(&key->pubkey.z, &mQ->z)) != MP_OKAY) { goto error; } + if ((err = ecc_mulmod(&u2, mQ, mQ, &m, 0)) != CRYPT_OK) { goto done; } + + /* find the montgomery mp */ + if ((err = mp_montgomery_setup(&m, &mp)) != MP_OKAY) { goto error; } + /* add them */ + if ((err = add_point(mQ, mG, mG, &m, mp)) != CRYPT_OK) { goto done; } + + /* reduce */ + if ((err = ecc_map(mG, &m, mp)) != CRYPT_OK) { goto done; } + + /* v = X_x1 mod n */ + if ((err = mp_mod(&mG->x, &p, &v)) != CRYPT_OK) { goto done; } + + /* does v == r */ + if (mp_cmp(&v, &r) == MP_EQ) { *stat = 1; } @@ -541,8 +451,12 @@ error: err = mpi_to_ltc_error(err); done: del_point(mG); - ecc_free(&pubkey); - mp_clear_multi(&p, &m, &b, &mu, NULL); + del_point(mQ); + mp_clear_multi(&r, &s, &v, &w, &u1, &u2, &p, &e, &m, NULL); return err; } + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/ecc/ecc_sys.c,v $ */ +/* $Revision: 1.18 $ */ +/* $Date: 2005/06/14 20:47:55 $ */ diff --git a/src/pk/packet_store_header.c b/src/pk/packet_store_header.c index a2442cc..855ca70 100644 --- a/src/pk/packet_store_header.c +++ b/src/pk/packet_store_header.c @@ -27,3 +27,7 @@ void packet_store_header(unsigned char *dst, int section, int subsection) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/packet_store_header.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/packet_valid_header.c b/src/pk/packet_valid_header.c index b2eb9c9..59db0f7 100644 --- a/src/pk/packet_valid_header.c +++ b/src/pk/packet_valid_header.c @@ -35,3 +35,7 @@ int packet_valid_header(unsigned char *src, int section, int subsection) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/packet_valid_header.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/pkcs1/pkcs_1_i2osp.c b/src/pk/pkcs1/pkcs_1_i2osp.c index 7f13626..3e68eb8 100644 --- a/src/pk/pkcs1/pkcs_1_i2osp.c +++ b/src/pk/pkcs1/pkcs_1_i2osp.c @@ -49,3 +49,7 @@ int pkcs_1_i2osp(mp_int *n, unsigned long modulus_len, unsigned char *out) #endif /* PKCS_1 */ + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/pkcs1/pkcs_1_i2osp.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/pkcs1/pkcs_1_mgf1.c b/src/pk/pkcs1/pkcs_1_mgf1.c index 0fe177f..aac7494 100644 --- a/src/pk/pkcs1/pkcs_1_mgf1.c +++ b/src/pk/pkcs1/pkcs_1_mgf1.c @@ -102,3 +102,7 @@ LBL_ERR: } #endif /* PKCS_1 */ + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/pkcs1/pkcs_1_mgf1.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/pkcs1/pkcs_1_oaep_decode.c b/src/pk/pkcs1/pkcs_1_oaep_decode.c index 82862c1..cd4931b 100644 --- a/src/pk/pkcs1/pkcs_1_oaep_decode.c +++ b/src/pk/pkcs1/pkcs_1_oaep_decode.c @@ -63,7 +63,7 @@ int pkcs_1_oaep_decode(const unsigned char *msg, unsigned long msglen, /* allocate ram for DB/mask/salt of size modulus_len */ DB = XMALLOC(modulus_len); mask = XMALLOC(modulus_len); - seed = XMALLOC(modulus_len); + seed = XMALLOC(hLen); if (DB == NULL || mask == NULL || seed == NULL) { if (DB != NULL) { XFREE(DB); @@ -92,14 +92,13 @@ int pkcs_1_oaep_decode(const unsigned char *msg, unsigned long msglen, } /* now read the masked seed */ - for (x = 1, y = 0; y < hLen; y++) { - seed[y] = msg[x++]; - } + x = 1; + XMEMCPY(seed, msg + x, hLen); + x += hLen; /* now read the masked DB */ - for (y = 0; y < modulus_len - hLen - 1; y++) { - DB[y] = msg[x++]; - } + XMEMCPY(DB, msg + x, modulus_len - hLen - 1); + x += modulus_len - hLen - 1; /* compute MGF1 of maskedDB (hLen) */ if ((err = pkcs_1_mgf1(DB, modulus_len - hLen - 1, hash_idx, mask, hLen)) != CRYPT_OK) { @@ -161,9 +160,8 @@ int pkcs_1_oaep_decode(const unsigned char *msg, unsigned long msglen, /* copy message */ *outlen = (modulus_len - hLen - 1) - x; - for (y = 0; x != (modulus_len - hLen - 1); ) { - out[y++] = DB[x++]; - } + XMEMCPY(out, DB + x, modulus_len - hLen - 1 - x); + x += modulus_len - hLen - 1; /* valid packet */ *res = 1; @@ -172,7 +170,7 @@ int pkcs_1_oaep_decode(const unsigned char *msg, unsigned long msglen, LBL_ERR: #ifdef LTC_CLEAN_STACK zeromem(DB, modulus_len); - zeromem(seed, modulus_len); + zeromem(seed, hLen); zeromem(mask, modulus_len); #endif @@ -184,3 +182,7 @@ LBL_ERR: } #endif /* PKCS_1 */ + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/pkcs1/pkcs_1_oaep_decode.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/06/18 02:37:06 $ */ diff --git a/src/pk/pkcs1/pkcs_1_oaep_encode.c b/src/pk/pkcs1/pkcs_1_oaep_encode.c index 7afea60..12670b5 100644 --- a/src/pk/pkcs1/pkcs_1_oaep_encode.c +++ b/src/pk/pkcs1/pkcs_1_oaep_encode.c @@ -66,7 +66,7 @@ int pkcs_1_oaep_encode(const unsigned char *msg, unsigned long msglen, /* allocate ram for DB/mask/salt of size modulus_len */ DB = XMALLOC(modulus_len); mask = XMALLOC(modulus_len); - seed = XMALLOC(modulus_len); + seed = XMALLOC(hLen); if (DB == NULL || mask == NULL || seed == NULL) { if (DB != NULL) { XFREE(DB); @@ -97,16 +97,15 @@ int pkcs_1_oaep_encode(const unsigned char *msg, unsigned long msglen, /* append PS then 0x01 (to lhash) */ x = hLen; y = modulus_len - msglen - 2*hLen - 2; - while (y--) { - DB[x++] = 0x00; - } + XMEMSET(DB+x, 0, y); + x += y; + + /* 0x01 byte */ DB[x++] = 0x01; - /* message */ - y = msglen; - while (y--) { - DB[x++] = *msg++; - } + /* message (length = msglen) */ + XMEMCPY(DB+x, msg, msglen); + x += msglen; /* now choose a random seed */ if (prng_descriptor[prng_idx].read(seed, hLen, prng) != hLen) { @@ -143,19 +142,18 @@ int pkcs_1_oaep_encode(const unsigned char *msg, unsigned long msglen, /* start output which is 0x00 || maskedSeed || maskedDB */ x = 0; out[x++] = 0x00; - for (y = 0; y < hLen; y++) { - out[x++] = seed[y]; - } - for (y = 0; y < modulus_len - hLen - 1; y++) { - out[x++] = DB[y]; - } + XMEMCPY(out+x, seed, hLen); + x += hLen; + XMEMCPY(out+x, DB, modulus_len - hLen - 1); + x += modulus_len - hLen - 1; + *outlen = x; err = CRYPT_OK; LBL_ERR: #ifdef LTC_CLEAN_STACK zeromem(DB, modulus_len); - zeromem(seed, modulus_len); + zeromem(seed, hLen); zeromem(mask, modulus_len); #endif @@ -168,3 +166,7 @@ LBL_ERR: #endif /* PKCS_1 */ + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/pkcs1/pkcs_1_oaep_encode.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/pkcs1/pkcs_1_os2ip.c b/src/pk/pkcs1/pkcs_1_os2ip.c index db6b58c..a9a1858 100644 --- a/src/pk/pkcs1/pkcs_1_os2ip.c +++ b/src/pk/pkcs1/pkcs_1_os2ip.c @@ -35,3 +35,7 @@ int pkcs_1_os2ip(mp_int *n, unsigned char *in, unsigned long inlen) #endif /* PKCS_1 */ + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/pkcs1/pkcs_1_os2ip.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/pkcs1/pkcs_1_pss_decode.c b/src/pk/pkcs1/pkcs_1_pss_decode.c index a19e7d8..e61c33f 100644 --- a/src/pk/pkcs1/pkcs_1_pss_decode.c +++ b/src/pk/pkcs1/pkcs_1_pss_decode.c @@ -87,14 +87,13 @@ int pkcs_1_pss_decode(const unsigned char *msghash, unsigned long msghashlen, } /* copy out the DB */ - for (x = 0; x < modulus_len - hLen - 1; x++) { - DB[x] = sig[x]; - } + x = 0; + XMEMCPY(DB, sig + x, modulus_len - hLen - 1); + x += modulus_len - hLen - 1; /* copy out the hash */ - for (y = 0; y < hLen; y++) { - hash[y] = sig[x++]; - } + XMEMCPY(hash, sig + x, hLen); + x += hLen; /* check the MSB */ if ((sig[0] & ~(0xFF >> ((modulus_len<<3) - (modulus_bitlen-1)))) != 0) { @@ -172,3 +171,7 @@ LBL_ERR: } #endif /* PKCS_1 */ + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_decode.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/pkcs1/pkcs_1_pss_encode.c b/src/pk/pkcs1/pkcs_1_pss_encode.c index 58a03d5..899605c 100644 --- a/src/pk/pkcs1/pkcs_1_pss_encode.c +++ b/src/pk/pkcs1/pkcs_1_pss_encode.c @@ -110,13 +110,12 @@ int pkcs_1_pss_encode(const unsigned char *msghash, unsigned long msghashlen, } /* generate DB = PS || 0x01 || salt, PS == modulus_len - saltlen - hLen - 2 zero bytes */ - for (x = 0; x < (modulus_len - saltlen - hLen - 2); x++) { - DB[x] = 0x00; - } + x = 0; + XMEMSET(DB + x, 0, modulus_len - saltlen - hLen - 2); + x += modulus_len - saltlen - hLen - 2; DB[x++] = 0x01; - for (y = 0; y < saltlen; y++) { - DB[x++] = salt[y]; - } + XMEMCPY(DB + x, salt, saltlen); + x += saltlen; /* generate mask of length modulus_len - hLen - 1 from hash */ if ((err = pkcs_1_mgf1(hash, hLen, hash_idx, mask, modulus_len - hLen - 1)) != CRYPT_OK) { @@ -134,14 +133,15 @@ int pkcs_1_pss_encode(const unsigned char *msghash, unsigned long msghashlen, goto LBL_ERR; } - /* DB */ - for (y = x = 0; x < modulus_len - hLen - 1; x++) { - out[y++] = DB[x]; - } + /* DB len = modulus_len - hLen - 1 */ + y = 0; + XMEMCPY(out + y, DB, modulus_len - hLen - 1); + y += modulus_len - hLen - 1; + /* hash */ - for (x = 0; x < hLen; x++) { - out[y++] = hash[x]; - } + XMEMCPY(out + y, hash, hLen); + y += hLen; + /* 0xBC */ out[y] = 0xBC; @@ -168,3 +168,7 @@ LBL_ERR: } #endif /* PKCS_1 */ + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/pkcs1/pkcs_1_pss_encode.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/pkcs1/pkcs_1_v15_es_decode.c b/src/pk/pkcs1/pkcs_1_v15_es_decode.c deleted file mode 100644 index fc54845..0000000 --- a/src/pk/pkcs1/pkcs_1_v15_es_decode.c +++ /dev/null @@ -1,74 +0,0 @@ -/* 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://libtomcrypt.org - */ -#include "tomcrypt.h" - -/** - @file pkcs_1_v15_es_decode.c - PKCS #1 v1.5 Encryption Padding, Tom St Denis -*/ - -#ifdef PKCS_1 - -/** - PKCS #1 v1.5 Encryption Decoding - @param msg The padded data - @param msglen The length of the padded data (octets) - @param modulus_bitlen The bit length of the RSA modulus - @param out [out] Where to store the decoded data - @param outlen The length of the decoded data - @param res [out] Result of the decoding, 1==valid, 0==invalid - @return CRYPT_OK if successful -*/ -int pkcs_1_v15_es_decode(const unsigned char *msg, unsigned long msglen, - unsigned long modulus_bitlen, - unsigned char *out, unsigned long outlen, - int *res) -{ - unsigned long x, modulus_bytelen; - - LTC_ARGCHK(msg != NULL); - LTC_ARGCHK(out != NULL); - LTC_ARGCHK(res != NULL); - - /* default to failed */ - *res = 0; - - modulus_bytelen = (modulus_bitlen>>3) + (modulus_bitlen & 7 ? 1 : 0); - - /* must be at least modulus_bytelen bytes long */ - if (msglen != modulus_bytelen) { - return CRYPT_INVALID_ARG; - } - - /* should start with 0x00 0x02 */ - if (msg[0] != 0x00 || msg[1] != 0x02) { - return CRYPT_OK; - } - - /* skip over PS */ - x = 2 + (modulus_bytelen - outlen - 3); - - /* should be 0x00 */ - if (msg[x++] != 0x00) { - return CRYPT_OK; - } - - /* the message is left */ - if (x + outlen > modulus_bytelen) { - return CRYPT_PK_INVALID_SIZE; - } - XMEMCPY(out, msg + x, outlen); - *res = 1; - return CRYPT_OK; -} - -#endif - diff --git a/src/pk/pkcs1/pkcs_1_v15_es_encode.c b/src/pk/pkcs1/pkcs_1_v15_es_encode.c deleted file mode 100644 index b6ac429..0000000 --- a/src/pk/pkcs1/pkcs_1_v15_es_encode.c +++ /dev/null @@ -1,69 +0,0 @@ -/* 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://libtomcrypt.org - */ -#include "tomcrypt.h" - -/** - @file pkcs_1_v15_es_encode.c - v1.5 Encryption Padding for PKCS #1, Tom St Denis -*/ - -#ifdef PKCS_1 - -/** - PKCS #1 v1.5 Encryption Padding - @param msg The data to encode - @param msglen The length of the data (octets) - @param modulus_bitlen The bit length of the RSA modulus - @param prng An active PRNG - @param prng_idx The index of the PRNG desired - @param out [out] The destination of the padding - @param outlen [in/out] The max size and resulting size of the padding - @return CRYPT_OK if successful -*/ -int pkcs_1_v15_es_encode(const unsigned char *msg, unsigned long msglen, - unsigned long modulus_bitlen, - prng_state *prng, int prng_idx, - unsigned char *out, unsigned long *outlen) -{ - unsigned long modulus_bytelen, x, y; - - LTC_ARGCHK(msg != NULL); - LTC_ARGCHK(out != NULL); - LTC_ARGCHK(outlen != NULL); - - /* get modulus len */ - modulus_bytelen = (modulus_bitlen >> 3) + (modulus_bitlen & 7 ? 1 : 0); - if (modulus_bytelen < 12) { - return CRYPT_INVALID_ARG; - } - - /* verify length */ - if (msglen > (modulus_bytelen - 11) || *outlen < modulus_bytelen) { - return CRYPT_PK_INVALID_SIZE; - } - - /* 0x00 0x02 PS 0x00 M */ - x = 0; - out[x++] = 0x00; - out[x++] = 0x02; - y = modulus_bytelen - msglen - 3; - if (prng_descriptor[prng_idx].read(out+x, y, prng) != y) { - return CRYPT_ERROR_READPRNG; - } - x += y; - out[x++] = 0x00; - XMEMCPY(out+x, msg, msglen); - *outlen = modulus_bytelen; - - return CRYPT_OK; -} - -#endif /* PKCS_1 */ diff --git a/src/pk/pkcs1/pkcs_1_v15_sa_decode.c b/src/pk/pkcs1/pkcs_1_v15_sa_decode.c deleted file mode 100644 index 7cad021..0000000 --- a/src/pk/pkcs1/pkcs_1_v15_sa_decode.c +++ /dev/null @@ -1,91 +0,0 @@ -/* 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://libtomcrypt.org - */ -#include "tomcrypt.h" - -/** - @file pkcs_1_v15_sa_decode.c - PKCS #1 v1.5 Signature Padding, Tom St Denis -*/ - -#ifdef PKCS_1 - -/** - Perform PKCS #1 v1.5 Signature Decoding - @param msghash The hash that was signed - @param msghashlen The length of the hash - @param sig The signature [padded data] - @param siglen The length of the signature - @param hash_idx The index of the hash used - @param modulus_bitlen The bit length of the RSA modulus - @param res [out] Result of comparison, 1==valid, 0==invalid - @return CRYPT_OK if successful -*/ -int pkcs_1_v15_sa_decode(const unsigned char *msghash, unsigned long msghashlen, - const unsigned char *sig, unsigned long siglen, - int hash_idx, unsigned long modulus_bitlen, - int *res) -{ - unsigned long x, y, modulus_bytelen, derlen; - int err; - - LTC_ARGCHK(msghash != NULL); - LTC_ARGCHK(sig != NULL); - LTC_ARGCHK(res != NULL); - - /* default to invalid */ - *res = 0; - - /* valid hash ? */ - if ((err = hash_is_valid(hash_idx)) != CRYPT_OK) { - return err; - } - - /* get derlen */ - derlen = hash_descriptor[hash_idx].DERlen; - - /* get modulus len */ - modulus_bytelen = (modulus_bitlen>>3) + (modulus_bitlen & 7 ? 1 : 0); - - /* valid sizes? */ - if ((msghashlen + 3 + derlen > modulus_bytelen) || (siglen != modulus_bytelen)) { - return CRYPT_PK_INVALID_SIZE; - } - - /* packet is 0x00 0x01 PS 0x00 T, where PS == 0xFF repeated modulus_bytelen - 3 - derlen - msghashlen times, T == DER || hash */ - x = 0; - if (sig[x++] != 0x00 || sig[x++] != 0x01) { - return CRYPT_OK; - } - - /* now follows (modulus_bytelen - 3 - derlen - msghashlen) 0xFF bytes */ - for (y = 0; y < (modulus_bytelen - 3 - derlen - msghashlen); y++) { - if (sig[x++] != 0xFF) { - return CRYPT_OK; - } - } - - if (sig[x++] != 0x00) { - return CRYPT_OK; - } - - for (y = 0; y < derlen; y++) { - if (sig[x++] != hash_descriptor[hash_idx].DER[y]) { - return CRYPT_OK; - } - } - - if (memcmp(msghash, sig+x, msghashlen) == 0) { - *res = 1; - } - return CRYPT_OK; -} - -#endif diff --git a/src/pk/pkcs1/pkcs_1_v15_sa_encode.c b/src/pk/pkcs1/pkcs_1_v15_sa_encode.c deleted file mode 100644 index 60c77ef..0000000 --- a/src/pk/pkcs1/pkcs_1_v15_sa_encode.c +++ /dev/null @@ -1,84 +0,0 @@ -/* 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://libtomcrypt.org - */ -#include "tomcrypt.h" - -/** - @file pkcs_1_v15_sa_encode.c - PKCS #1 v1.5 Signature Padding, Tom St Denis -*/ - -#ifdef PKCS_1 - -/** - Perform PKCS #1 v1.5 Signature Padding - @param msghash The hash you wish to incorporate in the padding - @param msghashlen The length of the hash - @param hash_idx The index of the hash used - @param modulus_bitlen The length of the RSA modulus that will sign this (bits) - @param out [out] Where to store the padded data - @param outlen [in/out] Max size and resulting size of the padded data - @return CRYPT_OK if successful -*/ -int pkcs_1_v15_sa_encode(const unsigned char *msghash, unsigned long msghashlen, - int hash_idx, unsigned long modulus_bitlen, - unsigned char *out, unsigned long *outlen) -{ - unsigned long derlen, modulus_bytelen, x, y; - int err; - - LTC_ARGCHK(msghash != NULL) - LTC_ARGCHK(out != NULL); - LTC_ARGCHK(outlen != NULL); - - if ((err = hash_is_valid(hash_idx)) != CRYPT_OK) { - return err; - } - - /* hack, to detect any hash without a DER OID */ - if (hash_descriptor[hash_idx].DERlen == 0) { - return CRYPT_INVALID_ARG; - } - - /* get modulus len */ - modulus_bytelen = (modulus_bitlen>>3) + (modulus_bitlen & 7 ? 1 : 0); - - /* get der len ok? Forgive my lame German accent.... */ - derlen = hash_descriptor[hash_idx].DERlen; - - /* valid sizes? */ - if (msghashlen + 3 + derlen > modulus_bytelen) { - return CRYPT_PK_INVALID_SIZE; - } - - if (*outlen < modulus_bytelen) { - return CRYPT_BUFFER_OVERFLOW; - } - - /* packet is 0x00 0x01 PS 0x00 T, where PS == 0xFF repeated modulus_bytelen - 3 - derlen - msghashlen times, T == DER || hash */ - x = 0; - out[x++] = 0x00; - out[x++] = 0x01; - for (y = 0; y < (modulus_bytelen - 3 - derlen - msghashlen); y++) { - out[x++] = 0xFF; - } - out[x++] = 0x00; - for (y = 0; y < derlen; y++) { - out[x++] = hash_descriptor[hash_idx].DER[y]; - } - for (y = 0; y < msghashlen; y++) { - out[x++] = msghash[y]; - } - - *outlen = modulus_bytelen; - return CRYPT_OK; -} - -#endif /* PKCS_1 */ diff --git a/src/pk/rsa/rsa_decrypt_key.c b/src/pk/rsa/rsa_decrypt_key.c index 3117715..7cea807 100644 --- a/src/pk/rsa/rsa_decrypt_key.c +++ b/src/pk/rsa/rsa_decrypt_key.c @@ -87,3 +87,7 @@ int rsa_decrypt_key(const unsigned char *in, unsigned long inlen, + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_decrypt_key.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/rsa/rsa_encrypt_key.c b/src/pk/rsa/rsa_encrypt_key.c index 891b43e..d29aa83 100644 --- a/src/pk/rsa/rsa_encrypt_key.c +++ b/src/pk/rsa/rsa_encrypt_key.c @@ -74,3 +74,7 @@ int rsa_encrypt_key(const unsigned char *in, unsigned long inlen, } #endif /* MRSA */ + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_encrypt_key.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/rsa/rsa_export.c b/src/pk/rsa/rsa_export.c index 951be70..f2e324d 100644 --- a/src/pk/rsa/rsa_export.c +++ b/src/pk/rsa/rsa_export.c @@ -27,7 +27,8 @@ */ int rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key) { - int err, x; + int err; + unsigned long zero=0; LTC_ARGCHK(out != NULL); LTC_ARGCHK(outlen != NULL); @@ -37,62 +38,39 @@ int rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key if (!(key->type == PK_PRIVATE) && (type == PK_PRIVATE)) { return CRYPT_PK_INVALID_TYPE; } - if (*outlen < 4) { - return CRYPT_BUFFER_OVERFLOW; - } - - /* Mental Note: push space for the header 0x30 0x82 LL LL (LL = length of packet EXcluding 4 bytes) - * we assume LL > 255 which is true since the smallest RSA key has a 128-byte modulus (1024-bit) - */ - *outlen -= 4; if (type == PK_PRIVATE) { /* private key */ - mp_int zero; - - /* first INTEGER == 0 to signify two-prime RSA */ - if ((err = mp_init(&zero)) != MP_OKAY) { - return mpi_to_ltc_error(err); - } - /* output is Version, n, e, d, p, q, d mod (p-1), d mod (q - 1), 1/q mod p */ - if ((err = der_put_multi_integer( - out+4, outlen, &zero, &key->N, &key->e, - &key->d, &key->p, &key->q, &key->dP, - &key->dQ, &key->qP, NULL)) != CRYPT_OK) { - mp_clear(&zero); + if ((err = der_encode_sequence_multi(out, outlen, + LTC_ASN1_SHORT_INTEGER, 1UL, &zero, + LTC_ASN1_INTEGER, 1UL, &key->N, + LTC_ASN1_INTEGER, 1UL, &key->e, + LTC_ASN1_INTEGER, 1UL, &key->d, + LTC_ASN1_INTEGER, 1UL, &key->p, + LTC_ASN1_INTEGER, 1UL, &key->q, + LTC_ASN1_INTEGER, 1UL, &key->dP, + LTC_ASN1_INTEGER, 1UL, &key->dQ, + LTC_ASN1_INTEGER, 1UL, &key->qP, + LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { return err; } /* clear zero and return */ - mp_clear(&zero); + return CRYPT_OK; } else { /* public key */ - if ((err = der_put_multi_integer(out+4, outlen, &key->N, &key->e, NULL)) != CRYPT_OK) { - return err; - } + return der_encode_sequence_multi(out, outlen, + LTC_ASN1_INTEGER, 1UL, &key->N, + LTC_ASN1_INTEGER, 1UL, &key->e, + LTC_ASN1_EOL, 0UL, NULL); } - - /* store the header */ - out[0] = 0x30; - if (*outlen < 256) { - /* shift the output up one byte if the header is only 3 bytes */ - for (x = 0; x < *outlen; x++) { - out[x+3] = out[x+4]; - } - out[1] = 0x81; - out[2] = (*outlen & 255); - *outlen += 3; - } else { - out[1] = 0x82; - out[2] = (*outlen >> 8) & 255; - out[3] = (*outlen & 255); - *outlen += 4; - } - return err; } #endif /* MRSA */ +/* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_export.c,v $ */ +/* $Revision: 1.11 $ */ +/* $Date: 2005/06/04 01:42:48 $ */ diff --git a/src/pk/rsa/rsa_exptmod.c b/src/pk/rsa/rsa_exptmod.c index fda6cbb..379404c 100644 --- a/src/pk/rsa/rsa_exptmod.c +++ b/src/pk/rsa/rsa_exptmod.c @@ -86,6 +86,12 @@ int rsa_exptmod(const unsigned char *in, unsigned long inlen, err = CRYPT_BUFFER_OVERFLOW; goto done; } + + /* this should never happen ... */ + if (mp_unsigned_bin_size(&tmp) > mp_unsigned_bin_size(&key->N)) { + err = CRYPT_ERROR; + goto done; + } *outlen = x; /* convert it */ @@ -103,3 +109,7 @@ done: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_exptmod.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2005/06/23 02:10:22 $ */ diff --git a/src/pk/rsa/rsa_free.c b/src/pk/rsa/rsa_free.c index 85ade97..69eeaec 100644 --- a/src/pk/rsa/rsa_free.c +++ b/src/pk/rsa/rsa_free.c @@ -29,3 +29,7 @@ void rsa_free(rsa_key *key) } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_free.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/rsa/rsa_import.c b/src/pk/rsa/rsa_import.c index 5408df0..5706134 100644 --- a/src/pk/rsa/rsa_import.c +++ b/src/pk/rsa/rsa_import.c @@ -18,7 +18,7 @@ #ifdef MRSA /** - Import an RSAPublicKey or RSAPrivateKey [two-prime only, defined in PKCS #1 v2.1] + Import an RSAPublicKey or RSAPrivateKey [two-prime only, only support >= 1024-bit keys, defined in PKCS #1 v2.1] @param in The packet to import from @param inlen It's length (octets) @param key [out] Destination for newly imported key @@ -26,65 +26,39 @@ */ int rsa_import(const unsigned char *in, unsigned long inlen, rsa_key *key) { - unsigned long x, y; - int err; + int err; + mp_int zero; LTC_ARGCHK(in != NULL); LTC_ARGCHK(key != NULL); /* init key */ - if ((err = mp_init_multi(&key->e, &key->d, &key->N, &key->dQ, &key->dP, &key->qP, - &key->p, &key->q, NULL)) != MP_OKAY) { + if ((err = mp_init_multi(&zero, &key->e, &key->d, &key->N, &key->dQ, + &key->dP, &key->qP, &key->p, &key->q, NULL)) != MP_OKAY) { return mpi_to_ltc_error(err); } - /* check the header */ - if (inlen < 4) { - return CRYPT_INVALID_PACKET; - } - - /* should be 0x30 0x8{1|2} LL LL */ - if ((in[0] != 0x30) || ((in[1] != 0x81) && (in[1] != 0x82))) { - return CRYPT_INVALID_PACKET; - } - - /* ok all the ASN.1 params are fine so far, let's move up */ - x = ((unsigned long)in[2]); - y = 0; - if ((in[1] & ~0x80) == 2) { - x = (x << 8) + ((unsigned long)in[3]) + 1; - in += 1; - y = 1; - } - in += 3; /* advance input */ - x += 3; /* size of packet according to header */ - y += 3; /* used input */ - - if (x != inlen) { - return CRYPT_INVALID_PACKET; - } - - /* decrement inlen by the header size */ - inlen -= y; - - /* read first number, it's either N or 0 [0 == private key] */ - x = inlen; - if ((err = der_get_multi_integer(in, &x, &key->N, NULL)) != CRYPT_OK) { + if ((err = der_decode_sequence_multi(in, inlen, + LTC_ASN1_INTEGER, 1UL, &key->N, + LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { goto LBL_ERR; } - /* advance */ - inlen -= x; - in += x; - if (mp_cmp_d(&key->N, 0) == MP_EQ) { /* it's a private key */ - if ((err = der_get_multi_integer(in, &inlen, &key->N, &key->e, - &key->d, &key->p, &key->q, &key->dP, - &key->dQ, &key->qP, NULL)) != CRYPT_OK) { + if ((err = der_decode_sequence_multi(in, inlen, + LTC_ASN1_INTEGER, 1UL, &zero, + LTC_ASN1_INTEGER, 1UL, &key->N, + LTC_ASN1_INTEGER, 1UL, &key->e, + LTC_ASN1_INTEGER, 1UL, &key->d, + LTC_ASN1_INTEGER, 1UL, &key->p, + LTC_ASN1_INTEGER, 1UL, &key->q, + LTC_ASN1_INTEGER, 1UL, &key->dP, + LTC_ASN1_INTEGER, 1UL, &key->dQ, + LTC_ASN1_INTEGER, 1UL, &key->qP, + LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { goto LBL_ERR; } - key->type = PK_PRIVATE; } else if (mp_cmp_d(&key->N, 1) == MP_EQ) { /* we don't support multi-prime RSA */ @@ -92,21 +66,27 @@ int rsa_import(const unsigned char *in, unsigned long inlen, rsa_key *key) goto LBL_ERR; } else { /* it's a public key and we lack e */ - if ((err = der_get_multi_integer(in, &inlen, &key->e, NULL)) != CRYPT_OK) { + if ((err = der_decode_sequence_multi(in, inlen, + LTC_ASN1_INTEGER, 1UL, &key->N, + LTC_ASN1_INTEGER, 1UL, &key->e, + LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { goto LBL_ERR; } /* free up some ram */ mp_clear_multi(&key->p, &key->q, &key->qP, &key->dP, &key->dQ, NULL); - key->type = PK_PUBLIC; } return CRYPT_OK; LBL_ERR: - mp_clear_multi(&key->d, &key->e, &key->N, &key->dQ, &key->dP, + mp_clear_multi(&zero, &key->d, &key->e, &key->N, &key->dQ, &key->dP, &key->qP, &key->p, &key->q, NULL); return err; } #endif /* MRSA */ + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_import.c,v $ */ +/* $Revision: 1.10 $ */ +/* $Date: 2005/06/03 18:48:28 $ */ diff --git a/src/pk/rsa/rsa_make_key.c b/src/pk/rsa/rsa_make_key.c index 9d49e3c..d874106 100644 --- a/src/pk/rsa/rsa_make_key.c +++ b/src/pk/rsa/rsa_make_key.c @@ -119,3 +119,7 @@ done: } #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_make_key.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/rsa/rsa_sign_hash.c b/src/pk/rsa/rsa_sign_hash.c index b86ad64..d31bda3 100644 --- a/src/pk/rsa/rsa_sign_hash.c +++ b/src/pk/rsa/rsa_sign_hash.c @@ -73,3 +73,7 @@ int rsa_sign_hash(const unsigned char *in, unsigned long inlen, } #endif /* MRSA */ + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_sign_hash.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/pk/rsa/rsa_v15_decrypt_key.c b/src/pk/rsa/rsa_v15_decrypt_key.c deleted file mode 100644 index eb5fe7d..0000000 --- a/src/pk/rsa/rsa_v15_decrypt_key.c +++ /dev/null @@ -1,73 +0,0 @@ - /* 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://libtomcrypt.org - */ -#include "tomcrypt.h" - -/** - @file rsa_v15_decrypt_key.c - RSA PKCS v1.5 Decryption, Tom St Denis -*/ - -#ifdef MRSA - -/** - RSA decrypt then PKCS #1 v1.5 depad - @param in The ciphertext - @param inlen The length of the ciphertext (octets) - @param out [out] The plaintext - @param outlen The length of the plaintext (you have to tell this function as it's not part of PKCS #1 v1.0 padding!) - @param stat [out] Status of decryption, 1==valid, 0==invalid - @param key The corresponding private RSA key - @return CRYPT_OK if successful (even if invalid) -*/ -int rsa_v15_decrypt_key(const unsigned char *in, unsigned long inlen, - unsigned char *out, unsigned long outlen, - int *stat, rsa_key *key) -{ - unsigned long modulus_bitlen, modulus_bytelen, x; - int err; - unsigned char *tmp; - - LTC_ARGCHK(out != NULL); - LTC_ARGCHK(key != NULL); - LTC_ARGCHK(stat != NULL); - - /* default to invalid */ - *stat = 0; - - /* 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 != inlen) { - return CRYPT_INVALID_PACKET; - } - - /* allocate ram */ - tmp = XMALLOC(inlen); - if (tmp == NULL) { - return CRYPT_MEM; - } - - /* rsa decode the packet */ - x = inlen; - if ((err = rsa_exptmod(in, inlen, tmp, &x, PK_PRIVATE, key)) != CRYPT_OK) { - XFREE(tmp); - return err; - } - - /* PKCS #1 v1.5 depad */ - err = pkcs_1_v15_es_decode(tmp, x, modulus_bitlen, out, outlen, stat); - XFREE(tmp); - return err; -} - -#endif diff --git a/src/pk/rsa/rsa_v15_encrypt_key.c b/src/pk/rsa/rsa_v15_encrypt_key.c deleted file mode 100644 index d422f67..0000000 --- a/src/pk/rsa/rsa_v15_encrypt_key.c +++ /dev/null @@ -1,68 +0,0 @@ -/* 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://libtomcrypt.org - */ -#include "tomcrypt.h" - -/** - @file rsa_v15_encrypt_key.c - RSA PKCS v1.5 Encryption, Tom St Denis -*/ - -#ifdef MRSA - -/** - PKCS #1 v1.5 pad then encrypt - @param in The plaintext - @param inlen The length of the plaintext (octets) - @param out [out] The ciphertext - @param outlen [in/out] The max size and resulting size of the ciphertext - @param prng An active PRNG - @param prng_idx The index of the desired PRNG - @param key The public RSA key - @return CRYPT_OK if successful -*/ -int rsa_v15_encrypt_key(const unsigned char *in, unsigned long inlen, - unsigned char *out, unsigned long *outlen, - prng_state *prng, int prng_idx, - rsa_key *key) -{ - unsigned long modulus_bitlen, modulus_bytelen, x; - int err; - - LTC_ARGCHK(in != NULL); - LTC_ARGCHK(out != NULL); - LTC_ARGCHK(outlen != NULL); - LTC_ARGCHK(key != NULL); - - /* valid prng? */ - if ((err = prng_is_valid(prng_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) { - return CRYPT_BUFFER_OVERFLOW; - } - - /* pad it */ - x = *outlen; - if ((err = pkcs_1_v15_es_encode(in, inlen, modulus_bitlen, prng, prng_idx, out, &x)) != CRYPT_OK) { - return err; - } - - /* encrypt it */ - return rsa_exptmod(out, x, out, outlen, PK_PUBLIC, key); -} - -#endif diff --git a/src/pk/rsa/rsa_v15_sign_hash.c b/src/pk/rsa/rsa_v15_sign_hash.c deleted file mode 100644 index 7e9b350..0000000 --- a/src/pk/rsa/rsa_v15_sign_hash.c +++ /dev/null @@ -1,66 +0,0 @@ -/* 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://libtomcrypt.org - */ -#include "tomcrypt.h" - -/** - @file rsa_v15_sign_hash.c - RSA PKCS v1.5 Signature, Tom St Denis -*/ - -#ifdef MRSA - -/** - PKCS #1 v1.5 pad then sign - @param in The hash to sign - @param inlen The length of the message hash (octets) - @param out [out] The signature - @param siglen [in/out] The max size and resulting size of the signature - @param hash_idx The index of the hash desired - @param key The private RSA key to perform the signature with - @return CRYPT_OK if successful -*/ -int rsa_v15_sign_hash(const unsigned char *in, unsigned long inlen, - unsigned char *out, unsigned long *siglen, - int hash_idx, rsa_key *key) -{ - unsigned long modulus_bitlen, modulus_bytelen, x; - int err; - - LTC_ARGCHK(in != NULL); - LTC_ARGCHK(out != NULL); - LTC_ARGCHK(siglen != NULL); - LTC_ARGCHK(key != NULL); - - /* valid hash ? */ - 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 > *siglen) { - return CRYPT_BUFFER_OVERFLOW; - } - - /* PKCS #1 v1.5 pad the key */ - x = *siglen; - if ((err = pkcs_1_v15_sa_encode(in, inlen, hash_idx, modulus_bitlen, out, &x)) != CRYPT_OK) { - return err; - } - - /* RSA encode it */ - return rsa_exptmod(out, x, out, siglen, PK_PRIVATE, key); -} - -#endif diff --git a/src/pk/rsa/rsa_v15_verify_hash.c b/src/pk/rsa/rsa_v15_verify_hash.c deleted file mode 100644 index e742cba..0000000 --- a/src/pk/rsa/rsa_v15_verify_hash.c +++ /dev/null @@ -1,81 +0,0 @@ -/* 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://libtomcrypt.org - */ -#include "tomcrypt.h" - -/** - @file rsa_v15_verify_hash.c - RSA PKCS v1.5 Signature verification, Tom St Denis -*/ - -#ifdef MRSA - -/** - RSA de-sign then PKCS v1.5 signature depad - @param sig The signature data - @param siglen The length of the signature (octets) - @param hash The hash of the message that was signed - @param hashlen The length of the hash of the message that was signed (octets) - @param hash_idx The index of the desired hash - @param stat [out] The result of the signature comparison, 1==valid, 0==invalid - @param key The corresponding public RSA key that performed the signature - @return CRYPT_OK if successful (even if the signature is invalid) -*/ -int rsa_v15_verify_hash(const unsigned char *sig, unsigned long siglen, - const unsigned char *hash, unsigned long hashlen, - int hash_idx, int *stat, - rsa_key *key) -{ - unsigned long modulus_bitlen, modulus_bytelen, x; - int err; - unsigned char *tmpbuf; - - LTC_ARGCHK(hash != NULL); - LTC_ARGCHK(sig != NULL); - LTC_ARGCHK(stat != NULL); - LTC_ARGCHK(key != NULL); - - /* default to invalid */ - *stat = 0; - - /* valid hash ? */ - 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 != siglen) { - return CRYPT_INVALID_PACKET; - } - - /* allocate temp buffer for decoded sig */ - tmpbuf = XMALLOC(siglen); - if (tmpbuf == NULL) { - return CRYPT_MEM; - } - - /* RSA decode it */ - x = siglen; - if ((err = rsa_exptmod(sig, siglen, tmpbuf, &x, PK_PUBLIC, key)) != CRYPT_OK) { - XFREE(tmpbuf); - return err; - } - - /* PSS decode it */ - err = pkcs_1_v15_sa_decode(hash, hashlen, tmpbuf, x, hash_idx, modulus_bitlen, stat); - XFREE(tmpbuf); - return err; -} - -#endif diff --git a/src/pk/rsa/rsa_verify_hash.c b/src/pk/rsa/rsa_verify_hash.c index 7072083..690364d 100644 --- a/src/pk/rsa/rsa_verify_hash.c +++ b/src/pk/rsa/rsa_verify_hash.c @@ -80,3 +80,7 @@ int rsa_verify_hash(const unsigned char *sig, unsigned long siglen, } #endif /* MRSA */ + +/* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_verify_hash.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/prngs/fortuna.c b/src/prngs/fortuna.c index 4548a90..8a3b8ea 100644 --- a/src/prngs/fortuna.c +++ b/src/prngs/fortuna.c @@ -384,3 +384,7 @@ int fortuna_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/prngs/fortuna.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/prngs/rc4.c b/src/prngs/rc4.c index 750c38b..4d29d9a 100644 --- a/src/prngs/rc4.c +++ b/src/prngs/rc4.c @@ -258,3 +258,7 @@ int rc4_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/prngs/rc4.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/prngs/rng_get_bytes.c b/src/prngs/rng_get_bytes.c index 8519e0a..a711dfa 100644 --- a/src/prngs/rng_get_bytes.c +++ b/src/prngs/rng_get_bytes.c @@ -138,3 +138,7 @@ unsigned long rng_get_bytes(unsigned char *out, unsigned long outlen, #endif return 0; } + +/* $Source: /cvs/libtom/libtomcrypt/src/prngs/rng_get_bytes.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/prngs/rng_make_prng.c b/src/prngs/rng_make_prng.c index 94132e7..51b6e6c 100644 --- a/src/prngs/rng_make_prng.c +++ b/src/prngs/rng_make_prng.c @@ -63,3 +63,7 @@ int rng_make_prng(int bits, int wprng, prng_state *prng, return CRYPT_OK; } + +/* $Source: /cvs/libtom/libtomcrypt/src/prngs/rng_make_prng.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/prngs/sober128.c b/src/prngs/sober128.c index 48667bd..c89f01c 100644 --- a/src/prngs/sober128.c +++ b/src/prngs/sober128.c @@ -489,3 +489,7 @@ int sober128_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/prngs/sober128.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/prngs/sober128tab.c b/src/prngs/sober128tab.c index dc6f3e2..b50c77b 100644 --- a/src/prngs/sober128tab.c +++ b/src/prngs/sober128tab.c @@ -2,7 +2,7 @@ @file sober128tab.c SOBER-128 Tables */ -/* $Id: sober128tab.c,v 1.1.1.1 2005/03/18 23:19:17 root Exp $ */ +/* $Id: sober128tab.c,v 1.2 2005/05/05 14:35:59 tom Exp $ */ /* @(#)TuringMultab.h 1.3 (QUALCOMM) 02/09/03 */ /* Multiplication table for Turing using 0xD02B4367 */ static const ulong32 Multab[256] = { @@ -72,7 +72,7 @@ static const ulong32 Multab[256] = { 0xEF72A3F1, 0x3F59E096, 0x0224253F, 0xD20F6658, }; -/* $Id: sober128tab.c,v 1.1.1.1 2005/03/18 23:19:17 root Exp $ */ +/* $Id: sober128tab.c,v 1.2 2005/05/05 14:35:59 tom Exp $ */ /* Sbox for SOBER-128 */ /* * This is really the combination of two SBoxes; the least significant @@ -156,3 +156,7 @@ static const ulong32 Sbox[256] = { 0x45f0b24f, 0x51fda998, 0xc0d52d71, 0xfa0896a8, 0xf9e6053f, 0xa4b0d300, 0xd499cbcc, 0xb95e3d40, }; + +/* $Source: /cvs/libtom/libtomcrypt/src/prngs/sober128tab.c,v $ */ +/* $Revision: 1.2 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/prngs/sprng.c b/src/prngs/sprng.c index dce8347..4e657da 100644 --- a/src/prngs/sprng.c +++ b/src/prngs/sprng.c @@ -130,3 +130,7 @@ int sprng_test(void) + +/* $Source: /cvs/libtom/libtomcrypt/src/prngs/sprng.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/src/prngs/yarrow.c b/src/prngs/yarrow.c index 1582856..0e59c22 100644 --- a/src/prngs/yarrow.c +++ b/src/prngs/yarrow.c @@ -186,6 +186,7 @@ int yarrow_ready(prng_state *prng) prng->yarrow.pool, /* IV */ prng->yarrow.pool, ks, /* KEY and key size */ 0, /* number of rounds */ + CTR_COUNTER_LITTLE_ENDIAN, /* little endian counter */ &prng->yarrow.ctr)) != CRYPT_OK) { return err; } @@ -310,3 +311,7 @@ int yarrow_test(void) #endif + +/* $Source: /cvs/libtom/libtomcrypt/src/prngs/yarrow.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/testbuild.sh b/testbuild.sh new file mode 100644 index 0000000..a17c677 --- /dev/null +++ b/testbuild.sh @@ -0,0 +1,11 @@ +#!/bin/bash +echo "$1 (Build Only, $2, $3)..." +make clean 1>/dev/null 2>/dev/null +echo -n "building..." +touch testok.txt +CFLAGS="$2" make -f $3 test tv_gen 1>gcc_1.txt 2>gcc_2.txt || (echo "build $1 failed see gcc_2.txt for more information" && cat gcc_2.txt && rm -f testok.txt && exit 1) +if find testok.txt -type f 1>/dev/null 2>/dev/null ; then + echo "successful" + exit 0 +fi +exit 1 diff --git a/testme.sh b/testme.sh new file mode 100644 index 0000000..da0f97b --- /dev/null +++ b/testme.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# date +echo "date="`date` + +# output version +echo "Testing verion" `grep "^VERSION=" makefile | sed "s/.*=//"` +#grep "VERSION=" makefile | perl -e "@a = split('=', <>); print @a[1];"` + +# get uname +echo "uname="`uname -a` +echo + +# stock build +bash run.sh "STOCK" " " $1 || exit 1 + +# SMALL code +bash run.sh "SMALL" "-DLTC_SMALL_CODE" $1 || exit 1 + +# NOTABLES +bash run.sh "NOTABLES" "-DLTC_NO_TABLES" $1 || exit 1 + +# SMALL+NOTABLES +bash run.sh "SMALL+NOTABLES" "-DLTC_SMALL_CODE -DLTC_NO_TABLES" $1 || exit 1 + +# CLEANSTACK +bash run.sh "CLEANSTACK" "-DLTC_CLEAN_STACK" $1 || exit 1 + +# CLEANSTACK + SMALL +bash run.sh "CLEANSTACK+SMALL" "-DLTC_SMALL_CODE -DLTC_CLEAN_STACK" $1 || exit 1 + +# CLEANSTACK + NOTABLES +bash run.sh "CLEANSTACK+NOTABLES" "-DLTC_NO_TABLES -DLTC_CLEAN_STACK" $1 || exit 1 + +# CLEANSTACK + NOTABLES + SMALL +bash run.sh "CLEANSTACK+NOTABLES+SMALL" "-DLTC_NO_TABLES -DLTC_CLEAN_STACK -DLTC_SMALL_CODE" $1 || exit 1 + +# NO_FAST +bash run.sh "NO_FAST" "-DLTC_NO_FAST" $1 || exit 1 + +# NO_ASM +bash run.sh "NO_ASM" "-DLTC_NO_ASM" $1 || exit 1 + +# test build with no testing +bash testbuild.sh "NOTEST" "-DLTC_NO_TEST" $1 || exit 1 + +# test build with no file routines +bash testbuild.sh "NOFILE" "-DLTC_NO_FILE" $1 || exit 1 + +# $Source: /cvs/libtom/libtomcrypt/testme.sh,v $ +# $Revision: 1.16 $ +# $Date: 2005/05/11 18:59:53 $ diff --git a/testprof/base64_test.c b/testprof/base64_test.c index e93ebef..af20a67 100644 --- a/testprof/base64_test.c +++ b/testprof/base64_test.c @@ -12,9 +12,13 @@ int base64_test(void) l2 = sizeof(tmp); DO(base64_decode(out, l1, tmp, &l2)); if (l2 != x || memcmp(tmp, in, x)) { - printf("base64 failed %lu %lu %lu", x, l1, l2); + fprintf(stderr, "base64 failed %lu %lu %lu", x, l1, l2); return 1; } } return 0; } + +/* $Source: /cvs/libtom/libtomcrypt/testprof/base64_test.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/21 12:51:25 $ */ diff --git a/testprof/cipher_hash_test.c b/testprof/cipher_hash_test.c index d2f3bfc..27232e2 100644 --- a/testprof/cipher_hash_test.c +++ b/testprof/cipher_hash_test.c @@ -39,3 +39,7 @@ int cipher_hash_test(void) return 0; } + +/* $Source: /cvs/libtom/libtomcrypt/testprof/cipher_hash_test.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/testprof/der_tests.c b/testprof/der_tests.c index fe8eb00..8119351 100644 --- a/testprof/der_tests.c +++ b/testprof/der_tests.c @@ -4,91 +4,367 @@ int der_tests(void) { - printf("NOP"); + fprintf(stderr, "NOP"); return 0; } #else +static int der_choice_test(void) +{ + ltc_asn1_list types[7], host[1]; + unsigned char bitbuf[10], octetbuf[10], ia5buf[10], printbuf[10], outbuf[256]; + unsigned long integer, oidbuf[10], outlen, inlen, x, y; + mp_int mpinteger; + ltc_utctime utctime = { 91, 5, 6, 16, 45, 40, 1, 7, 0 }; + + /* setup variables */ + for (x = 0; x < sizeof(bitbuf); x++) { bitbuf[x] = x & 1; } + for (x = 0; x < sizeof(octetbuf); x++) { octetbuf[x] = x; } + for (x = 0; x < sizeof(ia5buf); x++) { ia5buf[x] = 'a'; } + for (x = 0; x < sizeof(printbuf); x++) { printbuf[x] = 'a'; } + integer = 1; + for (x = 0; x < sizeof(oidbuf)/sizeof(oidbuf[0]); x++) { oidbuf[x] = x + 1; } + DO(mpi_to_ltc_error(mp_init(&mpinteger))); + + for (x = 0; x < 14; x++) { + /* setup list */ + LTC_SET_ASN1(types, 0, LTC_ASN1_PRINTABLE_STRING, printbuf, sizeof(printbuf)); + LTC_SET_ASN1(types, 1, LTC_ASN1_BIT_STRING, bitbuf, sizeof(bitbuf)); + LTC_SET_ASN1(types, 2, LTC_ASN1_OCTET_STRING, octetbuf, sizeof(octetbuf)); + LTC_SET_ASN1(types, 3, LTC_ASN1_IA5_STRING, ia5buf, sizeof(ia5buf)); + if (x > 7) { + LTC_SET_ASN1(types, 4, LTC_ASN1_SHORT_INTEGER, &integer, 1); + } else { + LTC_SET_ASN1(types, 4, LTC_ASN1_INTEGER, &mpinteger, 1); + } + LTC_SET_ASN1(types, 5, LTC_ASN1_OBJECT_IDENTIFIER, oidbuf, sizeof(oidbuf)/sizeof(oidbuf[0])); + LTC_SET_ASN1(types, 6, LTC_ASN1_UTCTIME, &utctime, 1); + + LTC_SET_ASN1(host, 0, LTC_ASN1_CHOICE, types, 7); + + + /* encode */ + outlen = sizeof(outbuf); + DO(der_encode_sequence(&types[x>6?x-7:x], 1, outbuf, &outlen)); + + /* decode it */ + inlen = outlen; + DO(der_decode_sequence(outbuf, inlen, &host, 1)); + + for (y = 0; y < 7; y++) { + if (types[y].used && y != (x>6?x-7:x)) { + fprintf(stderr, "CHOICE, flag %lu in trial %lu was incorrectly set to one\n", y, x); + return 1; + } + if (!types[y].used && y == (x>6?x-7:x)) { + fprintf(stderr, "CHOICE, flag %lu in trial %lu was incorrectly set to zero\n", y, x); + return 1; + } + } + } + mp_clear(&mpinteger); + return 0; +} + + int der_tests(void) { - unsigned long x, y, z, zz; - unsigned char buf[2][4096]; + unsigned long x, y, z, zz, oid[2][32]; + unsigned char buf[3][2048]; mp_int a, b, c, d, e, f, g; + static const unsigned char rsa_oid_der[] = { 0x06, 0x06, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d }; + static const unsigned long rsa_oid[] = { 1, 2, 840, 113549 }; + + static const unsigned char rsa_ia5[] = "test1@rsa.com"; + static const unsigned char rsa_ia5_der[] = { 0x16, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x31, + 0x40, 0x72, 0x73, 0x61, 0x2e, 0x63, 0x6f, 0x6d }; + + static const unsigned char rsa_printable[] = "Test User 1"; + static const unsigned char rsa_printable_der[] = { 0x13, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, + 0x73, 0x65, 0x72, 0x20, 0x31 }; + + static const ltc_utctime rsa_time1 = { 91, 5, 6, 16, 45, 40, 1, 7, 0 }; + static const ltc_utctime rsa_time2 = { 91, 5, 6, 23, 45, 40, 0, 0, 0 }; + ltc_utctime tmp_time; + + static const unsigned char rsa_time1_der[] = { 0x17, 0x11, 0x39, 0x31, 0x30, 0x35, 0x30, 0x36, 0x31, 0x36, 0x34, 0x35, 0x34, 0x30, 0x2D, 0x30, 0x37, 0x30, 0x30 }; + static const unsigned char rsa_time2_der[] = { 0x17, 0x0d, 0x39, 0x31, 0x30, 0x35, 0x30, 0x36, 0x32, 0x33, 0x34, 0x35, 0x34, 0x30, 0x5a }; + DO(mpi_to_ltc_error(mp_init_multi(&a, &b, &c, &d, &e, &f, &g, NULL))); for (zz = 0; zz < 16; zz++) { for (z = 0; z < 1024; z++) { if (yarrow_read(buf[0], z, &yarrow_prng) != z) { - printf("Failed to read %lu bytes from yarrow\n", z); + fprintf(stderr, "Failed to read %lu bytes from yarrow\n", z); return 1; } DO(mpi_to_ltc_error(mp_read_unsigned_bin(&a, buf[0], z))); + if (mp_iszero(&a) == MP_NO) { a.sign = buf[0][0] & 1 ? MP_ZPOS : MP_NEG; } x = sizeof(buf[0]); DO(der_encode_integer(&a, buf[0], &x)); - y = x; + DO(der_length_integer(&a, &y)); + if (y != x) { fprintf(stderr, "DER INTEGER size mismatch\n"); return 1; } mp_zero(&b); - DO(der_decode_integer(buf[0], &y, &b)); + DO(der_decode_integer(buf[0], y, &b)); if (y != x || mp_cmp(&a, &b) != MP_EQ) { - printf("%lu: %lu vs %lu\n", z, x, y); + fprintf(stderr, "%lu: %lu vs %lu\n", z, x, y); #ifdef BN_MP_TORADIX_C mp_todecimal(&a, buf[0]); mp_todecimal(&b, buf[1]); - printf("a == %s\nb == %s\n", buf[0], buf[1]); + fprintf(stderr, "a == %s\nb == %s\n", buf[0], buf[1]); #endif mp_clear_multi(&a, &b, &c, &d, &e, &f, &g, NULL); return 1; } } } - -/* test the multi */ - mp_set(&a, 1); - x = sizeof(buf[0]); - DO(der_put_multi_integer(buf[0], &x, &a, NULL)); - y = x; - mp_zero(&a); - DO(der_get_multi_integer(buf[0], &y, &a, NULL)); - if (x != y || mp_cmp_d(&a, 1)) { - printf("%lu, %lu, %d\n", x, y, mp_cmp_d(&a, 1)); - mp_clear_multi(&a, &b, &c, &d, &e, &f, &g, NULL); - return 1; - } +/* test short integer */ + for (zz = 0; zz < 256; zz++) { + for (z = 1; z < 4; z++) { + if (yarrow_read(buf[0], z, &yarrow_prng) != z) { + fprintf(stderr, "Failed to read %lu bytes from yarrow\n", z); + return 1; + } + /* encode with normal */ + DO(mpi_to_ltc_error(mp_read_unsigned_bin(&a, buf[0], z))); - mp_set(&a, 1); - mp_set(&b, 2); - x = sizeof(buf[0]); - DO(der_put_multi_integer(buf[0], &x, &a, &b, NULL)); - y = x; - mp_zero(&a); - mp_zero(&b); - DO(der_get_multi_integer(buf[0], &y, &a, &b, NULL)); - if (x != y || mp_cmp_d(&a, 1) || mp_cmp_d(&b, 2)) { - printf("%lu, %lu, %d, %d\n", x, y, mp_cmp_d(&a, 1), mp_cmp_d(&b, 2)); - mp_clear_multi(&a, &b, &c, &d, &e, &f, &g, NULL); - return 1; - } - - mp_set(&a, 1); - mp_set(&b, 2); - mp_set(&c, 3); - x = sizeof(buf[0]); - DO(der_put_multi_integer(buf[0], &x, &a, &b, &c, NULL)); - y = x; - mp_zero(&a); - mp_zero(&b); - mp_zero(&c); - DO(der_get_multi_integer(buf[0], &y, &a, &b, &c, NULL)); - if (x != y || mp_cmp_d(&a, 1) || mp_cmp_d(&b, 2) || mp_cmp_d(&c, 3)) { - printf("%lu, %lu, %d, %d, %d\n", x, y, mp_cmp_d(&a, 1), mp_cmp_d(&b, 2), mp_cmp_d(&c, 3)); - mp_clear_multi(&a, &b, &c, &d, &e, &f, &g, NULL); - return 1; - } + x = sizeof(buf[0]); + DO(der_encode_integer(&a, buf[0], &x)); + /* encode with short */ + y = sizeof(buf[1]); + DO(der_encode_short_integer(mp_get_int(&a), buf[1], &y)); + if (x != y || memcmp(buf[0], buf[1], x)) { + fprintf(stderr, "DER INTEGER short encoding failed, %lu, %lu\n", x, y); + for (z = 0; z < x; z++) fprintf(stderr, "%02x ", buf[0][z]); fprintf(stderr, "\n"); + for (z = 0; z < y; z++) fprintf(stderr, "%02x ", buf[1][z]); fprintf(stderr, "\n"); + mp_clear_multi(&a, &b, &c, &d, &e, &f, &g, NULL); + return 1; + } + /* decode it */ + x = 0; + DO(der_decode_short_integer(buf[1], y, &x)); + if (x != mp_get_int(&a)) { + fprintf(stderr, "DER INTEGER short decoding failed, %lu, %lu\n", x, mp_get_int(&a)); + mp_clear_multi(&a, &b, &c, &d, &e, &f, &g, NULL); + return 1; + } + } + } mp_clear_multi(&a, &b, &c, &d, &e, &f, &g, NULL); - return 0; + + +/* Test bit string */ + for (zz = 1; zz < 1536; zz++) { + yarrow_read(buf[0], zz, &yarrow_prng); + for (z = 0; z < zz; z++) { + buf[0][z] &= 0x01; + } + x = sizeof(buf[1]); + DO(der_encode_bit_string(buf[0], zz, buf[1], &x)); + DO(der_length_bit_string(zz, &y)); + if (y != x) { + fprintf(stderr, "\nDER BIT STRING length of encoded not match expected : %lu, %lu, %lu\n", z, x, y); + return 1; + } + + y = sizeof(buf[2]); + DO(der_decode_bit_string(buf[1], x, buf[2], &y)); + if (y != zz || memcmp(buf[0], buf[2], zz)) { + fprintf(stderr, "%lu, %lu, %d\n", y, zz, memcmp(buf[0], buf[2], zz)); + return 1; + } + } + +/* Test octet string */ + for (zz = 1; zz < 1536; zz++) { + yarrow_read(buf[0], zz, &yarrow_prng); + x = sizeof(buf[1]); + DO(der_encode_octet_string(buf[0], zz, buf[1], &x)); + DO(der_length_octet_string(zz, &y)); + if (y != x) { + fprintf(stderr, "\nDER OCTET STRING length of encoded not match expected : %lu, %lu, %lu\n", z, x, y); + return 1; + } + y = sizeof(buf[2]); + DO(der_decode_octet_string(buf[1], x, buf[2], &y)); + if (y != zz || memcmp(buf[0], buf[2], zz)) { + fprintf(stderr, "%lu, %lu, %d\n", y, zz, memcmp(buf[0], buf[2], zz)); + return 1; + } + } + +/* test OID */ + x = sizeof(buf[0]); + DO(der_encode_object_identifier(rsa_oid, sizeof(rsa_oid)/sizeof(rsa_oid[0]), buf[0], &x)); + if (x != sizeof(rsa_oid_der) || memcmp(rsa_oid_der, buf[0], x)) { + fprintf(stderr, "rsa_oid_der encode failed to match, %lu, ", x); + for (y = 0; y < x; y++) fprintf(stderr, "%02x ", buf[0][y]); + fprintf(stderr, "\n"); + return 1; + } + + y = sizeof(oid[0])/sizeof(oid[0][0]); + DO(der_decode_object_identifier(buf[0], x, oid[0], &y)); + if (y != sizeof(rsa_oid)/sizeof(rsa_oid[0]) || memcmp(rsa_oid, oid[0], sizeof(rsa_oid))) { + fprintf(stderr, "rsa_oid_der decode failed to match, %lu, ", y); + for (z = 0; z < y; z++) fprintf(stderr, "%lu ", oid[0][z]); + fprintf(stderr, "\n"); + return 1; + } + + /* do random strings */ + for (zz = 0; zz < 5000; zz++) { + /* pick a random number of words */ + yarrow_read(buf[0], 4, &yarrow_prng); + LOAD32L(z, buf[0]); + z = 2 + (z % ((sizeof(oid[0])/sizeof(oid[0][0])) - 2)); + + /* fill them in */ + oid[0][0] = buf[0][0] % 3; + oid[0][1] = buf[0][1] % 40; + + for (y = 2; y < z; y++) { + yarrow_read(buf[0], 4, &yarrow_prng); + LOAD32L(oid[0][y], buf[0]); + } + + /* encode it */ + x = sizeof(buf[0]); + DO(der_encode_object_identifier(oid[0], z, buf[0], &x)); + DO(der_length_object_identifier(oid[0], z, &y)); + if (x != y) { + fprintf(stderr, "Random OID %lu test failed, length mismatch: %lu, %lu\n", z, x, y); + for (x = 0; x < z; x++) fprintf(stderr, "%lu\n", oid[0][x]); + return 1; + } + + /* decode it */ + y = sizeof(oid[0])/sizeof(oid[0][0]); + DO(der_decode_object_identifier(buf[0], x, oid[1], &y)); + if (y != z) { + fprintf(stderr, "Random OID %lu test failed, decode length mismatch: %lu, %lu\n", z, x, y); + return 1; + } + if (memcmp(oid[0], oid[1], sizeof(oid[0][0]) * z)) { + fprintf(stderr, "Random OID %lu test failed, decoded values wrong\n", z); + for (x = 0; x < z; x++) fprintf(stderr, "%lu\n", oid[0][x]); fprintf(stderr, "\n\n Got \n\n"); + for (x = 0; x < z; x++) fprintf(stderr, "%lu\n", oid[1][x]); + return 1; + } + } + +/* IA5 string */ + x = sizeof(buf[0]); + DO(der_encode_ia5_string(rsa_ia5, strlen(rsa_ia5), buf[0], &x)); + if (x != sizeof(rsa_ia5_der) || memcmp(buf[0], rsa_ia5_der, x)) { + fprintf(stderr, "IA5 encode failed: %lu, %lu\n", x, (unsigned long)sizeof(rsa_ia5_der)); + return 1; + } + DO(der_length_ia5_string(rsa_ia5, strlen(rsa_ia5), &y)); + if (y != x) { + fprintf(stderr, "IA5 length failed to match: %lu, %lu\n", x, y); + return 1; + } + y = sizeof(buf[1]); + DO(der_decode_ia5_string(buf[0], x, buf[1], &y)); + if (y != strlen(rsa_ia5) || memcmp(buf[1], rsa_ia5, strlen(rsa_ia5))) { + fprintf(stderr, "DER IA5 failed test vector\n"); + return 1; + } + +/* Printable string */ + x = sizeof(buf[0]); + DO(der_encode_printable_string(rsa_printable, strlen(rsa_printable), buf[0], &x)); + if (x != sizeof(rsa_printable_der) || memcmp(buf[0], rsa_printable_der, x)) { + fprintf(stderr, "PRINTABLE encode failed: %lu, %lu\n", x, (unsigned long)sizeof(rsa_printable_der)); + return 1; + } + DO(der_length_printable_string(rsa_printable, strlen(rsa_printable), &y)); + if (y != x) { + fprintf(stderr, "printable length failed to match: %lu, %lu\n", x, y); + return 1; + } + y = sizeof(buf[1]); + DO(der_decode_printable_string(buf[0], x, buf[1], &y)); + if (y != strlen(rsa_printable) || memcmp(buf[1], rsa_printable, strlen(rsa_printable))) { + fprintf(stderr, "DER printable failed test vector\n"); + return 1; + } + +/* Test UTC time */ + x = sizeof(buf[0]); + DO(der_encode_utctime(&rsa_time1, buf[0], &x)); + if (x != sizeof(rsa_time1_der) || memcmp(buf[0], rsa_time1_der, x)) { + fprintf(stderr, "UTCTIME encode of rsa_time1 failed: %lu, %lu\n", x, (unsigned long)sizeof(rsa_time1_der)); +fprintf(stderr, "\n\n"); +for (y = 0; y < x; y++) fprintf(stderr, "%02x ", buf[0][y]); printf("\n"); + + return 1; + } + DO(der_length_utctime(&rsa_time1, &y)); + if (y != x) { + fprintf(stderr, "UTCTIME length failed to match for rsa_time1: %lu, %lu\n", x, y); + return 1; + } + DO(der_decode_utctime(buf[0], &y, &tmp_time)); + if (y != x || memcmp(&rsa_time1, &tmp_time, sizeof(ltc_utctime))) { + fprintf(stderr, "UTCTIME decode failed for rsa_time1: %lu %lu\n", x, y); +fprintf(stderr, "\n\n%u %u %u %u %u %u %u %u %u\n\n", +tmp_time.YY, +tmp_time.MM, +tmp_time.DD, +tmp_time.hh, +tmp_time.mm, +tmp_time.ss, +tmp_time.off_dir, +tmp_time.off_mm, +tmp_time.off_hh); + return 1; + } + + x = sizeof(buf[0]); + DO(der_encode_utctime(&rsa_time2, buf[0], &x)); + if (x != sizeof(rsa_time2_der) || memcmp(buf[0], rsa_time2_der, x)) { + fprintf(stderr, "UTCTIME encode of rsa_time2 failed: %lu, %lu\n", x, (unsigned long)sizeof(rsa_time1_der)); +fprintf(stderr, "\n\n"); +for (y = 0; y < x; y++) fprintf(stderr, "%02x ", buf[0][y]); printf("\n"); + + return 1; + } + DO(der_length_utctime(&rsa_time2, &y)); + if (y != x) { + fprintf(stderr, "UTCTIME length failed to match for rsa_time2: %lu, %lu\n", x, y); + return 1; + } + DO(der_decode_utctime(buf[0], &y, &tmp_time)); + if (y != x || memcmp(&rsa_time2, &tmp_time, sizeof(ltc_utctime))) { + fprintf(stderr, "UTCTIME decode failed for rsa_time2: %lu %lu\n", x, y); +fprintf(stderr, "\n\n%u %u %u %u %u %u %u %u %u\n\n", +tmp_time.YY, +tmp_time.MM, +tmp_time.DD, +tmp_time.hh, +tmp_time.mm, +tmp_time.ss, +tmp_time.off_dir, +tmp_time.off_mm, +tmp_time.off_hh); + + + return 1; + } + + + + return der_choice_test(); } #endif + +/* $Source: /cvs/libtom/libtomcrypt/testprof/der_tests.c,v $ */ +/* $Revision: 1.25 $ */ +/* $Date: 2005/06/20 20:37:45 $ */ diff --git a/testprof/dh_tests.c b/testprof/dh_tests.c index feb74ac..3852e47 100644 --- a/testprof/dh_tests.c +++ b/testprof/dh_tests.c @@ -22,11 +22,11 @@ int dh_tests (void) y = 4096; DO(dh_shared_secret (&userb, &usera, buf[1], &y)); if (y != x) { - printf ("DH Shared keys are not same size.\n"); + fprintf(stderr, "DH Shared keys are not same size.\n"); return 1; } if (memcmp (buf[0], buf[1], x)) { - printf ("DH Shared keys not same contents.\n"); + fprintf(stderr, "DH Shared keys not same contents.\n"); return 1; } @@ -41,11 +41,11 @@ int dh_tests (void) DO(dh_shared_secret (&usera, &userb, buf[2], &z)); if (z != x) { - printf ("failed. Size don't match?\n"); + fprintf(stderr, "failed. Size don't match?\n"); return 1; } if (memcmp (buf[0], buf[2], x)) { - printf ("Failed. Content didn't match.\n"); + fprintf(stderr, "Failed. Content didn't match.\n"); return 1; } dh_free (&usera); @@ -62,12 +62,12 @@ int dh_tests (void) x = sizeof (buf[0]); DO(dh_decrypt_key (buf[1], y, buf[0], &x, &usera)); if (x != 16) { - printf ("Failed (length)\n"); + fprintf(stderr, "Failed (length)\n"); return 1; } for (x = 0; x < 16; x++) if (buf[0][x] != x) { - printf ("Failed (contents)\n"); + fprintf(stderr, "Failed (contents)\n"); return 1; } @@ -81,7 +81,7 @@ int dh_tests (void) buf[0][0] ^= 1; DO(dh_verify_hash (buf[1], x, buf[0], 16, &stat2, &usera)); if (!(stat == 1 && stat2 == 0)) { - printf("dh_sign/verify_hash %d %d", stat, stat2); + fprintf(stderr, "dh_sign/verify_hash %d %d", stat, stat2); return 1; } dh_free (&usera); @@ -92,8 +92,12 @@ int dh_tests (void) int dh_tests(void) { - printf("NOP"); + fprintf(stderr, "NOP"); return 0; } #endif + +/* $Source: /cvs/libtom/libtomcrypt/testprof/dh_tests.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2005/05/21 12:51:25 $ */ diff --git a/testprof/dsa_test.c b/testprof/dsa_test.c index cd2e89a..aa4988c 100644 --- a/testprof/dsa_test.c +++ b/testprof/dsa_test.c @@ -14,7 +14,7 @@ int dsa_test(void) /* verify it */ DO(dsa_verify_key(&key, &stat1)); - if (stat1 == 0) { printf("dsa_verify_key "); return 1; } + if (stat1 == 0) { fprintf(stderr, "dsa_verify_key "); return 1; } /* sign the message */ x = sizeof(out); @@ -27,7 +27,7 @@ int dsa_test(void) msg[0] ^= 1; DO(dsa_verify_hash(out, x, msg, sizeof(msg), &stat2, &key)); msg[0] ^= 1; - if (!(stat1 == 1 && stat2 == 0)) { printf("dsa_verify %d %d", stat1, stat2); return 1; } + if (!(stat1 == 1 && stat2 == 0)) { fprintf(stderr, "dsa_verify %d %d", stat1, stat2); return 1; } /* test exporting it */ x = sizeof(out2); @@ -36,16 +36,17 @@ int dsa_test(void) /* verify a signature with it */ DO(dsa_verify_hash(out, x, msg, sizeof(msg), &stat1, &key2)); - if (stat1 == 0) { printf("dsa_verify (import private) %d ", stat1); return 1; } + if (stat1 == 0) { fprintf(stderr, "dsa_verify (import private) %d ", stat1); return 1; } dsa_free(&key2); /* export as public now */ x = sizeof(out2); DO(dsa_export(out2, &x, PK_PUBLIC, &key)); + DO(dsa_import(out2, x, &key2)); /* verify a signature with it */ DO(dsa_verify_hash(out, x, msg, sizeof(msg), &stat1, &key2)); - if (stat1 == 0) { printf("dsa_verify (import public) %d ", stat1); return 1; } + if (stat1 == 0) { fprintf(stderr, "dsa_verify (import public) %d ", stat1); return 1; } dsa_free(&key2); dsa_free(&key); @@ -56,8 +57,12 @@ int dsa_test(void) int dsa_test(void) { - printf("NOP"); + fprintf(stderr, "NOP"); return 0; } #endif + +/* $Source: /cvs/libtom/libtomcrypt/testprof/dsa_test.c,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2005/06/03 19:24:32 $ */ diff --git a/testprof/ecc_test.c b/testprof/ecc_test.c index 0b37ba2..d5f88ab 100644 --- a/testprof/ecc_test.c +++ b/testprof/ecc_test.c @@ -2,102 +2,123 @@ #ifdef MECC +static int sizes[] = { +#ifdef ECC192 +24, +#endif +#ifdef ECC224 +28, +#endif +#ifdef ECC256 +32, +#endif +#ifdef ECC384 +48, +#endif +#ifdef ECC512 +65 +#endif +}; + int ecc_tests (void) { unsigned char buf[4][4096]; - unsigned long x, y, z; + unsigned long x, y, z, s; int stat, stat2; ecc_key usera, userb, pubKey, privKey; DO(ecc_test ()); - /* make up two keys */ - DO(ecc_make_key (&yarrow_prng, find_prng ("yarrow"), 65, &usera)); - DO(ecc_make_key (&yarrow_prng, find_prng ("yarrow"), 65, &userb)); + for (s = 0; s < (int)(sizeof(sizes)/sizeof(sizes[0])); s++) { + /* make up two keys */ + DO(ecc_make_key (&yarrow_prng, find_prng ("yarrow"), sizes[s], &usera)); + DO(ecc_make_key (&yarrow_prng, find_prng ("yarrow"), sizes[s], &userb)); - /* make the shared secret */ - x = 4096; - DO(ecc_shared_secret (&usera, &userb, buf[0], &x)); + /* make the shared secret */ + x = 4096; + DO(ecc_shared_secret (&usera, &userb, buf[0], &x)); - y = 4096; - DO(ecc_shared_secret (&userb, &usera, buf[1], &y)); + y = 4096; + DO(ecc_shared_secret (&userb, &usera, buf[1], &y)); - if (y != x) { - printf ("ecc Shared keys are not same size."); - return 1; + if (y != x) { + fprintf(stderr, "ecc Shared keys are not same size."); + return 1; + } + + if (memcmp (buf[0], buf[1], x)) { + fprintf(stderr, "ecc Shared keys not same contents."); + return 1; + } + + /* now export userb */ + y = 4096; + DO(ecc_export (buf[1], &y, PK_PUBLIC, &userb)); + ecc_free (&userb); + + /* import and make the shared secret again */ + DO(ecc_import (buf[1], y, &userb)); + + z = 4096; + DO(ecc_shared_secret (&usera, &userb, buf[2], &z)); + + if (z != x) { + fprintf(stderr, "failed. Size don't match?"); + return 1; + } + if (memcmp (buf[0], buf[2], x)) { + fprintf(stderr, "Failed. Contents didn't match."); + return 1; + } + ecc_free (&usera); + ecc_free (&userb); + + /* test encrypt_key */ + DO(ecc_make_key (&yarrow_prng, find_prng ("yarrow"), sizes[s], &usera)); + + /* export key */ + x = sizeof(buf[0]); + DO(ecc_export(buf[0], &x, PK_PUBLIC, &usera)); + DO(ecc_import(buf[0], x, &pubKey)); + x = sizeof(buf[0]); + DO(ecc_export(buf[0], &x, PK_PRIVATE, &usera)); + DO(ecc_import(buf[0], x, &privKey)); + + for (x = 0; x < 32; x++) { + buf[0][x] = x; + } + y = sizeof (buf[1]); + DO(ecc_encrypt_key (buf[0], 32, buf[1], &y, &yarrow_prng, find_prng ("yarrow"), find_hash ("sha256"), &pubKey)); + zeromem (buf[0], sizeof (buf[0])); + x = sizeof (buf[0]); + DO(ecc_decrypt_key (buf[1], y, buf[0], &x, &privKey)); + if (x != 32) { + fprintf(stderr, "Failed (length)"); + return 1; + } + for (x = 0; x < 32; x++) { + if (buf[0][x] != x) { + fprintf(stderr, "Failed (contents)"); + return 1; + } + } + /* test sign_hash */ + for (x = 0; x < 16; x++) { + buf[0][x] = x; + } + x = sizeof (buf[1]); + DO(ecc_sign_hash (buf[0], 16, buf[1], &x, &yarrow_prng, find_prng ("yarrow"), &privKey)); + DO(ecc_verify_hash (buf[1], x, buf[0], 16, &stat, &pubKey)); + buf[0][0] ^= 1; + DO(ecc_verify_hash (buf[1], x, buf[0], 16, &stat2, &privKey)); + if (!(stat == 1 && stat2 == 0)) { + fprintf(stderr, "ecc_verify_hash failed %d, %d, ", stat, stat2); + return 1; + } + ecc_free (&usera); + ecc_free (&pubKey); + ecc_free (&privKey); } - - if (memcmp (buf[0], buf[1], x)) { - printf ("ecc Shared keys not same contents."); - return 1; - } - - /* now export userb */ - y = 4096; - DO(ecc_export (buf[1], &y, PK_PUBLIC, &userb)); - ecc_free (&userb); - - /* import and make the shared secret again */ - DO(ecc_import (buf[1], y, &userb)); - - z = 4096; - DO(ecc_shared_secret (&usera, &userb, buf[2], &z)); - - if (z != x) { - printf ("failed. Size don't match?"); - return 1; - } - if (memcmp (buf[0], buf[2], x)) { - printf ("Failed. Content didn't match."); - return 1; - } - ecc_free (&usera); - ecc_free (&userb); - -/* test encrypt_key */ - DO(ecc_make_key (&yarrow_prng, find_prng ("yarrow"), 65, &usera)); - -/* export key */ - x = sizeof(buf[0]); - DO(ecc_export(buf[0], &x, PK_PUBLIC, &usera)); - DO(ecc_import(buf[0], x, &pubKey)); - x = sizeof(buf[0]); - DO(ecc_export(buf[0], &x, PK_PRIVATE, &usera)); - DO(ecc_import(buf[0], x, &privKey)); - - for (x = 0; x < 32; x++) { - buf[0][x] = x; - } - y = sizeof (buf[1]); - DO(ecc_encrypt_key (buf[0], 32, buf[1], &y, &yarrow_prng, find_prng ("yarrow"), find_hash ("sha256"), &pubKey)); - zeromem (buf[0], sizeof (buf[0])); - x = sizeof (buf[0]); - DO(ecc_decrypt_key (buf[1], y, buf[0], &x, &privKey)); - if (x != 32) { - printf ("Failed (length)"); - return 1; - } - for (x = 0; x < 32; x++) - if (buf[0][x] != x) { - printf ("Failed (contents)"); - return 1; - } -/* test sign_hash */ - for (x = 0; x < 16; x++) { - buf[0][x] = x; - } - x = sizeof (buf[1]); - DO(ecc_sign_hash (buf[0], 16, buf[1], &x, &yarrow_prng, find_prng ("yarrow"), &privKey)); - DO(ecc_verify_hash (buf[1], x, buf[0], 16, &stat, &pubKey)); - buf[0][0] ^= 1; - DO(ecc_verify_hash (buf[1], x, buf[0], 16, &stat2, &privKey)); - if (!(stat == 1 && stat2 == 0)) { - printf("ecc_verify_hash failed %d, %d, ", stat, stat2); - return 1; - } - ecc_free (&usera); - ecc_free (&pubKey); - ecc_free (&privKey); return 0; } @@ -105,8 +126,12 @@ int ecc_tests (void) int ecc_tests(void) { - printf("NOP"); + fprintf(stderr, "NOP"); return 0; } #endif + +/* $Source: /cvs/libtom/libtomcrypt/testprof/ecc_test.c,v $ */ +/* $Revision: 1.9 $ */ +/* $Date: 2005/06/14 19:43:29 $ */ diff --git a/testprof/mac_test.c b/testprof/mac_test.c index b076d7b..3c9e902 100644 --- a/testprof/mac_test.c +++ b/testprof/mac_test.c @@ -29,3 +29,7 @@ int mac_test(void) #endif return 0; } + +/* $Source: /cvs/libtom/libtomcrypt/testprof/mac_test.c,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/testprof/makefile.icc b/testprof/makefile.icc index c9226fb..ff87660 100644 --- a/testprof/makefile.icc +++ b/testprof/makefile.icc @@ -1,4 +1,4 @@ -CFLAGS += -I../src/headers -I./ -O3 -xP -ip +CFLAGS += -I../src/headers -I./ CC=icc OBJECTS = base64_test.o cipher_hash_test.o der_tests.o dh_tests.o \ diff --git a/testprof/modes_test.c b/testprof/modes_test.c index 46beb8a..d394267 100644 --- a/testprof/modes_test.c +++ b/testprof/modes_test.c @@ -19,7 +19,7 @@ int modes_test(void) /* get idx of AES handy */ cipher_idx = find_cipher("aes"); if (cipher_idx == -1) { - printf("test requires AES"); + fprintf(stderr, "test requires AES"); return 1; } @@ -30,7 +30,7 @@ int modes_test(void) l = sizeof(iv2); DO(cbc_getiv(iv2, &l, &cbc)); if (l != 16 || memcmp(iv2, iv, 16)) { - printf("cbc_getiv failed"); + fprintf(stderr, "cbc_getiv failed"); return 1; } DO(cbc_encrypt(pt, ct, 64, &cbc)); @@ -40,7 +40,7 @@ int modes_test(void) zeromem(tmp, sizeof(tmp)); DO(cbc_decrypt(ct, tmp, 64, &cbc)); if (memcmp(tmp, pt, 64) != 0) { - printf("CBC failed"); + fprintf(stderr, "CBC failed"); return 1; } #endif @@ -53,7 +53,7 @@ int modes_test(void) DO(cfb_getiv(iv2, &l, &cfb)); /* note we don't memcmp iv2/iv since cfb_start processes the IV for the first block */ if (l != 16) { - printf("cfb_getiv failed"); + fprintf(stderr, "cfb_getiv failed"); return 1; } DO(cfb_encrypt(pt, ct, 64, &cfb)); @@ -63,7 +63,7 @@ int modes_test(void) zeromem(tmp, sizeof(tmp)); DO(cfb_decrypt(ct, tmp, 64, &cfb)); if (memcmp(tmp, pt, 64) != 0) { - printf("CFB failed"); + fprintf(stderr, "CFB failed"); return 1; } #endif @@ -75,7 +75,7 @@ int modes_test(void) l = sizeof(iv2); DO(ofb_getiv(iv2, &l, &ofb)); if (l != 16 || memcmp(iv2, iv, 16)) { - printf("ofb_getiv failed"); + fprintf(stderr, "ofb_getiv failed"); return 1; } DO(ofb_encrypt(pt, ct, 64, &ofb)); @@ -85,7 +85,7 @@ int modes_test(void) zeromem(tmp, sizeof(tmp)); DO(ofb_decrypt(ct, tmp, 64, &ofb)); if (memcmp(tmp, pt, 64) != 0) { - printf("OFB failed"); + fprintf(stderr, "OFB failed"); return 1; } #endif @@ -93,11 +93,11 @@ int modes_test(void) #ifdef CTR /* test CTR mode */ /* encode the block */ - DO(ctr_start(cipher_idx, iv, key, 16, 0, &ctr)); + DO(ctr_start(cipher_idx, iv, key, 16, 0, CTR_COUNTER_LITTLE_ENDIAN, &ctr)); l = sizeof(iv2); DO(ctr_getiv(iv2, &l, &ctr)); if (l != 16 || memcmp(iv2, iv, 16)) { - printf("ctr_getiv failed"); + fprintf(stderr, "ctr_getiv failed"); return 1; } DO(ctr_encrypt(pt, ct, 57, &ctr)); @@ -107,10 +107,14 @@ int modes_test(void) zeromem(tmp, sizeof(tmp)); DO(ctr_decrypt(ct, tmp, 57, &ctr)); if (memcmp(tmp, pt, 57) != 0) { - printf("CTR failed"); + fprintf(stderr, "CTR failed"); return 1; } #endif return 0; } + +/* $Source: /cvs/libtom/libtomcrypt/testprof/modes_test.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2005/05/21 12:51:25 $ */ diff --git a/testprof/pkcs_1_test.c b/testprof/pkcs_1_test.c index 40cf630..1a47d85 100644 --- a/testprof/pkcs_1_test.c +++ b/testprof/pkcs_1_test.c @@ -14,7 +14,7 @@ int pkcs_1_test(void) prng_idx = find_prng("yarrow"); if (hash_idx == -1 || prng_idx == -1) { - printf("pkcs_1 tests require sha1/yarrow"); + fprintf(stderr, "pkcs_1 tests require sha1/yarrow"); return 1; } @@ -29,30 +29,6 @@ int pkcs_1_test(void) /* random modulus len (v1.5 must be multiple of 8 though arbitrary sizes seem to work) */ modlen = 800 + 8 * (abs(rand()) % 28); - /* PKCS v1.5 testing (encryption) */ - l1 = sizeof(buf[1]); - DO(pkcs_1_v15_es_encode(buf[0], l3, modlen, &yarrow_prng, prng_idx, buf[1], &l1)); - DO(pkcs_1_v15_es_decode(buf[1], l1, modlen, buf[2], l3, &res1)); - if (res1 != 1 || memcmp(buf[0], buf[2], l3)) { - printf("pkcs v1.5 encrypt failed %d, %lu, %lu ", res1, l1, l3); - return 1; - } - - /* PKCS v1.5 testing (signatures) */ - l1 = sizeof(buf[1]); - DO(pkcs_1_v15_sa_encode(buf[0], l3, hash_idx, modlen, buf[1], &l1)); - DO(pkcs_1_v15_sa_decode(buf[0], l3, buf[1], l1, hash_idx, modlen, &res1)); - buf[0][i1 = abs(rand()) % l3] ^= 1; - DO(pkcs_1_v15_sa_decode(buf[0], l3, buf[1], l1, hash_idx, modlen, &res2)); - buf[0][i1] ^= 1; - buf[1][i2 = abs(rand()) % l1] ^= 1; - DO(pkcs_1_v15_sa_decode(buf[0], l3, buf[1], l1, hash_idx, modlen, &res3)); - - if (!(res1 == 1 && res2 == 0 && res3 == 0)) { - printf("pkcs v1.5 sign failed %d %d %d ", res1, res2, res3); - return 1; - } - /* pick a random lparam len [0..16] */ lparamlen = abs(rand()) % 17; @@ -71,16 +47,16 @@ int pkcs_1_test(void) DO(pkcs_1_oaep_decode(buf[1], l1, lparam, lparamlen, modlen, hash_idx, buf[2], &l2, &res1)); if (res1 != 1 || l2 != l3 || memcmp(buf[2], buf[0], l3) != 0) { - printf("Outsize == %lu, should have been %lu, res1 = %d, lparamlen = %lu, msg contents follow.\n", l2, l3, res1, lparamlen); - printf("ORIGINAL:\n"); + fprintf(stderr, "Outsize == %lu, should have been %lu, res1 = %d, lparamlen = %lu, msg contents follow.\n", l2, l3, res1, lparamlen); + fprintf(stderr, "ORIGINAL:\n"); for (x = 0; x < l3; x++) { - printf("%02x ", buf[0][x]); + fprintf(stderr, "%02x ", buf[0][x]); } - printf("\nRESULT:\n"); + fprintf(stderr, "\nRESULT:\n"); for (x = 0; x < l2; x++) { - printf("%02x ", buf[2][x]); + fprintf(stderr, "%02x ", buf[2][x]); } - printf("\n\n"); + fprintf(stderr, "\n\n"); return 1; } @@ -97,7 +73,7 @@ int pkcs_1_test(void) DO(pkcs_1_pss_decode(buf[0], l3, buf[1], l1, saltlen, hash_idx, modlen, &res3)); if (!(res1 == 1 && res2 == 0 && res3 == 0)) { - printf("PSS failed: %d, %d, %d, %lu, %lu\n", res1, res2, res3, l3, saltlen); + fprintf(stderr, "PSS failed: %d, %d, %d, %lu, %lu\n", res1, res2, res3, l3, saltlen); return 1; } } @@ -108,9 +84,13 @@ int pkcs_1_test(void) int pkcs_1_test(void) { - printf("NOP"); + fprintf(stderr, "NOP"); return 0; } #endif + +/* $Source: /cvs/libtom/libtomcrypt/testprof/pkcs_1_test.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2005/05/21 12:51:25 $ */ diff --git a/testprof/rsa_test.c b/testprof/rsa_test.c index f114e49..4facdcd 100644 --- a/testprof/rsa_test.c +++ b/testprof/rsa_test.c @@ -4,18 +4,125 @@ #define RSA_MSGSIZE 78 +/* These are test keys [see file test.key] that I use to test my import/export against */ +static const unsigned char openssl_private_rsa[] = { + 0x30, 0x82, 0x02, 0x5e, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xcf, 0x9a, 0xde, 0x64, 0x8a, + 0xda, 0xc8, 0x33, 0x20, 0xa9, 0xd7, 0x83, 0x31, 0x19, 0x54, 0xb2, 0x9a, 0x85, 0xa7, 0xa1, 0xb7, + 0x75, 0x33, 0xb6, 0xa9, 0xac, 0x84, 0x24, 0xb3, 0xde, 0xdb, 0x7d, 0x85, 0x2d, 0x96, 0x65, 0xe5, + 0x3f, 0x72, 0x95, 0x24, 0x9f, 0x28, 0x68, 0xca, 0x4f, 0xdb, 0x44, 0x1c, 0x3e, 0x60, 0x12, 0x8a, + 0xdd, 0x26, 0xa5, 0xeb, 0xff, 0x0b, 0x5e, 0xd4, 0x88, 0x38, 0x49, 0x2a, 0x6e, 0x5b, 0xbf, 0x12, + 0x37, 0x47, 0xbd, 0x05, 0x6b, 0xbc, 0xdb, 0xf3, 0xee, 0xe4, 0x11, 0x8e, 0x41, 0x68, 0x7c, 0x61, + 0x13, 0xd7, 0x42, 0xc8, 0x80, 0xbe, 0x36, 0x8f, 0xdc, 0x08, 0x8b, 0x4f, 0xac, 0xa4, 0xe2, 0x76, + 0x0c, 0xc9, 0x63, 0x6c, 0x49, 0x58, 0x93, 0xed, 0xcc, 0xaa, 0xdc, 0x25, 0x3b, 0x0a, 0x60, 0x3f, + 0x8b, 0x54, 0x3a, 0xc3, 0x4d, 0x31, 0xe7, 0x94, 0xa4, 0x44, 0xfd, 0x02, 0x03, 0x01, 0x00, 0x01, + 0x02, 0x81, 0x81, 0x00, 0xc8, 0x62, 0xb9, 0xea, 0xde, 0x44, 0x53, 0x1d, 0x56, 0x97, 0xd9, 0x97, + 0x9e, 0x1a, 0xcf, 0x30, 0x1e, 0x0a, 0x88, 0x45, 0x86, 0x29, 0x30, 0xa3, 0x4d, 0x9f, 0x61, 0x65, + 0x73, 0xe0, 0xd6, 0x87, 0x8f, 0xb6, 0xf3, 0x06, 0xa3, 0x82, 0xdc, 0x7c, 0xac, 0xfe, 0x9b, 0x28, + 0x9a, 0xae, 0xfd, 0xfb, 0xfe, 0x2f, 0x0e, 0xd8, 0x97, 0x04, 0xe3, 0xbb, 0x1f, 0xd1, 0xec, 0x0d, + 0xba, 0xa3, 0x49, 0x7f, 0x47, 0xac, 0x8a, 0x44, 0x04, 0x7e, 0x86, 0xb7, 0x39, 0x42, 0x3f, 0xad, + 0x1e, 0xb7, 0x0e, 0xa5, 0x51, 0xf4, 0x40, 0x63, 0x1e, 0xfd, 0xbd, 0xea, 0x9f, 0x41, 0x9f, 0xa8, + 0x90, 0x1d, 0x6f, 0x0a, 0x5a, 0x95, 0x13, 0x11, 0x0d, 0x80, 0xaf, 0x5f, 0x64, 0x98, 0x8a, 0x2c, + 0x78, 0x68, 0x65, 0xb0, 0x2b, 0x8b, 0xa2, 0x53, 0x87, 0xca, 0xf1, 0x64, 0x04, 0xab, 0xf2, 0x7b, + 0xdb, 0x83, 0xc8, 0x81, 0x02, 0x41, 0x00, 0xf7, 0xbe, 0x5e, 0x23, 0xc3, 0x32, 0x3f, 0xbf, 0x8b, + 0x8e, 0x3a, 0xee, 0xfc, 0xfc, 0xcb, 0xe5, 0xf7, 0xf1, 0x0b, 0xbc, 0x42, 0x82, 0xae, 0xd5, 0x7a, + 0x3e, 0xca, 0xf7, 0xd5, 0x69, 0x3f, 0x64, 0x25, 0xa2, 0x1f, 0xb7, 0x75, 0x75, 0x05, 0x92, 0x42, + 0xeb, 0xb8, 0xf1, 0xf3, 0x0a, 0x05, 0xe3, 0x94, 0xd1, 0x55, 0x78, 0x35, 0xa0, 0x36, 0xa0, 0x9b, + 0x7c, 0x92, 0x84, 0x6c, 0xdd, 0xdc, 0x4d, 0x02, 0x41, 0x00, 0xd6, 0x86, 0x0e, 0x85, 0x42, 0x0b, + 0x04, 0x08, 0x84, 0x21, 0x60, 0xf0, 0x0e, 0x0d, 0x88, 0xfd, 0x1e, 0x36, 0x10, 0x65, 0x4f, 0x1e, + 0x53, 0xb4, 0x08, 0x72, 0x80, 0x5c, 0x3f, 0x59, 0x66, 0x17, 0xe6, 0x98, 0xf2, 0xe9, 0x6c, 0x7a, + 0x06, 0x4c, 0xac, 0x76, 0x3d, 0xed, 0x8c, 0xa1, 0xce, 0xad, 0x1b, 0xbd, 0xb4, 0x7d, 0x28, 0xbc, + 0xe3, 0x0e, 0x38, 0x8d, 0x99, 0xd8, 0x05, 0xb5, 0xa3, 0x71, 0x02, 0x40, 0x6d, 0xeb, 0xc3, 0x2d, + 0x2e, 0xf0, 0x5e, 0xa4, 0x88, 0x31, 0x05, 0x29, 0x00, 0x8a, 0xd1, 0x95, 0x29, 0x9b, 0x83, 0xcf, + 0x75, 0xdb, 0x31, 0xe3, 0x7a, 0x27, 0xde, 0x3a, 0x74, 0x30, 0x0c, 0x76, 0x4c, 0xd4, 0x50, 0x2a, + 0x40, 0x2d, 0x39, 0xd9, 0x99, 0x63, 0xa9, 0x5d, 0x80, 0xae, 0x53, 0xca, 0x94, 0x3f, 0x05, 0x23, + 0x1e, 0xf8, 0x05, 0x04, 0xe1, 0xb8, 0x35, 0xf2, 0x17, 0xb3, 0xa0, 0x89, 0x02, 0x41, 0x00, 0xab, + 0x90, 0x88, 0xfa, 0x60, 0x08, 0x29, 0x50, 0x9a, 0x43, 0x8b, 0xa0, 0x50, 0xcc, 0xd8, 0x5a, 0xfe, + 0x97, 0x64, 0x63, 0x71, 0x74, 0x22, 0xa3, 0x20, 0x02, 0x5a, 0xcf, 0xeb, 0xc6, 0x16, 0x95, 0x54, + 0xd1, 0xcb, 0xab, 0x8d, 0x1a, 0xc6, 0x00, 0xfa, 0x08, 0x92, 0x9c, 0x71, 0xd5, 0x52, 0x52, 0x35, + 0x96, 0x71, 0x4b, 0x8b, 0x92, 0x0c, 0xd0, 0xe9, 0xbf, 0xad, 0x63, 0x0b, 0xa5, 0xe9, 0xb1, 0x02, + 0x41, 0x00, 0xdc, 0xcc, 0x27, 0xc8, 0xe4, 0xdc, 0x62, 0x48, 0xd5, 0x9b, 0xaf, 0xf5, 0xab, 0x60, + 0xf6, 0x21, 0xfd, 0x53, 0xe2, 0xb7, 0x5d, 0x09, 0xc9, 0x1a, 0xa1, 0x04, 0xa9, 0xfc, 0x61, 0x2c, + 0x5d, 0x04, 0x58, 0x3a, 0x5a, 0x39, 0xf1, 0x4a, 0x21, 0x56, 0x67, 0xfd, 0xcc, 0x20, 0xa3, 0x8f, + 0x78, 0x18, 0x5a, 0x79, 0x3d, 0x2e, 0x8e, 0x7e, 0x86, 0x0a, 0xe6, 0xa8, 0x33, 0xc1, 0x04, 0x17, + 0x4a, 0x9f, }; + + +/*** NOTE: OpenSSL seems to have more to their public key format. I've stripped the extra headers... */ +static const unsigned char openssl_public_rsa[] = { + 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xcf, 0x9a, 0xde, + 0x64, 0x8a, 0xda, 0xc8, 0x33, 0x20, 0xa9, 0xd7, 0x83, 0x31, 0x19, 0x54, 0xb2, 0x9a, 0x85, 0xa7, + 0xa1, 0xb7, 0x75, 0x33, 0xb6, 0xa9, 0xac, 0x84, 0x24, 0xb3, 0xde, 0xdb, 0x7d, 0x85, 0x2d, 0x96, + 0x65, 0xe5, 0x3f, 0x72, 0x95, 0x24, 0x9f, 0x28, 0x68, 0xca, 0x4f, 0xdb, 0x44, 0x1c, 0x3e, 0x60, + 0x12, 0x8a, 0xdd, 0x26, 0xa5, 0xeb, 0xff, 0x0b, 0x5e, 0xd4, 0x88, 0x38, 0x49, 0x2a, 0x6e, 0x5b, + 0xbf, 0x12, 0x37, 0x47, 0xbd, 0x05, 0x6b, 0xbc, 0xdb, 0xf3, 0xee, 0xe4, 0x11, 0x8e, 0x41, 0x68, + 0x7c, 0x61, 0x13, 0xd7, 0x42, 0xc8, 0x80, 0xbe, 0x36, 0x8f, 0xdc, 0x08, 0x8b, 0x4f, 0xac, 0xa4, + 0xe2, 0x76, 0x0c, 0xc9, 0x63, 0x6c, 0x49, 0x58, 0x93, 0xed, 0xcc, 0xaa, 0xdc, 0x25, 0x3b, 0x0a, + 0x60, 0x3f, 0x8b, 0x54, 0x3a, 0xc3, 0x4d, 0x31, 0xe7, 0x94, 0xa4, 0x44, 0xfd, 0x02, 0x03, 0x01, + 0x00, 0x01, }; + +static int rsa_compat_test(void) +{ + rsa_key key; + unsigned char buf[1024]; + unsigned long len; + + /* try reading the key */ + DO(rsa_import(openssl_private_rsa, sizeof(openssl_private_rsa), &key)); + + /* now try to export private/public and compare */ + len = sizeof(buf); + DO(rsa_export(buf, &len, PK_PRIVATE, &key)); + if (len != sizeof(openssl_private_rsa) || memcmp(buf, openssl_private_rsa, len)) { + fprintf(stderr, "RSA private export failed to match OpenSSL output, %lu, %lu\n", len, sizeof(openssl_private_rsa)); + + +{ +int x; +printf("\n\n"); +for (x = 0; x < len; ) { if (buf[x] == openssl_private_rsa[x]) printf("-- "); else printf("%02x ", buf[x]^openssl_private_rsa[x]); if (!(++x & 15)) printf("\n"); } +} +printf("\n\n"); + + return 1; + } + + len = sizeof(buf); + DO(rsa_export(buf, &len, PK_PUBLIC, &key)); + if (len != sizeof(openssl_public_rsa) || memcmp(buf, openssl_public_rsa, len)) { + fprintf(stderr, "RSA(private) public export failed to match OpenSSL output\n"); + return 1; + } + rsa_free(&key); + + /* try reading the public key */ + DO(rsa_import(openssl_public_rsa, sizeof(openssl_public_rsa), &key)); + len = sizeof(buf); + DO(rsa_export(buf, &len, PK_PUBLIC, &key)); + if (len != sizeof(openssl_public_rsa) || memcmp(buf, openssl_public_rsa, len)) { + fprintf(stderr, "RSA(public) public export failed to match OpenSSL output\n"); + return 1; + } + rsa_free(&key); + + return 0; +} + int rsa_test(void) { unsigned char in[1024], out[1024], tmp[1024]; rsa_key key, privKey, pubKey; - int hash_idx, prng_idx, stat, stat2, cnt; - unsigned long rsa_msgsize, len, len2; + int hash_idx, prng_idx, stat, stat2; + unsigned long rsa_msgsize, len, len2, cnt; static unsigned char lparam[] = { 0x01, 0x02, 0x03, 0x04 }; + + if (rsa_compat_test() != 0) { + return 1; + } hash_idx = find_hash("sha1"); prng_idx = find_prng("yarrow"); if (hash_idx == -1 || prng_idx == -1) { - printf("rsa_test requires SHA1 and yarrow"); + fprintf(stderr, "rsa_test requires SHA1 and yarrow"); return 1; } @@ -23,32 +130,32 @@ int rsa_test(void) for (cnt = 0; cnt < 10; cnt++) { DO(rsa_make_key(&yarrow_prng, prng_idx, 1024/8, 65537, &key)); if (mp_count_bits(&key.N) != 1024) { - printf("rsa_1024 key modulus has %d bits\n", mp_count_bits(&key.N)); + fprintf(stderr, "rsa_1024 key modulus has %d bits\n", mp_count_bits(&key.N)); len = mp_unsigned_bin_size(&key.N); mp_to_unsigned_bin(&key.N, tmp); -printf("N == \n"); + fprintf(stderr, "N == \n"); for (cnt = 0; cnt < len; ) { - printf("%02x ", tmp[cnt]); - if (!(++cnt & 15)) printf("\n"); + fprintf(stderr, "%02x ", tmp[cnt]); + if (!(++cnt & 15)) fprintf(stderr, "\n"); } len = mp_unsigned_bin_size(&key.p); mp_to_unsigned_bin(&key.p, tmp); -printf("p == \n"); + fprintf(stderr, "p == \n"); for (cnt = 0; cnt < len; ) { - printf("%02x ", tmp[cnt]); - if (!(++cnt & 15)) printf("\n"); + fprintf(stderr, "%02x ", tmp[cnt]); + if (!(++cnt & 15)) fprintf(stderr, "\n"); } len = mp_unsigned_bin_size(&key.q); mp_to_unsigned_bin(&key.q, tmp); -printf("\nq == \n"); + fprintf(stderr, "\nq == \n"); for (cnt = 0; cnt < len; ) { - printf("%02x ", tmp[cnt]); - if (!(++cnt & 15)) printf("\n"); + fprintf(stderr, "%02x ", tmp[cnt]); + if (!(++cnt & 15)) fprintf(stderr, "\n"); } -printf("\n"); + fprintf(stderr, "\n"); return 1; @@ -57,38 +164,7 @@ printf("\n"); rsa_free(&key); } } - - /* test PKCS #1 v1.5 */ - for (cnt = 0; cnt < 4; cnt++) { - for (rsa_msgsize = 1; rsa_msgsize <= 117; rsa_msgsize++) { - /* make a random key/msg */ - yarrow_read(in, rsa_msgsize, &yarrow_prng); - - len = sizeof(out); - len2 = rsa_msgsize; - - /* encrypt */ - DO(rsa_v15_encrypt_key(in, rsa_msgsize, out, &len, &yarrow_prng, prng_idx, &key)); - DO(rsa_v15_decrypt_key(out, len, tmp, rsa_msgsize, &stat, &key)); - if (stat != 1 || memcmp(tmp, in, rsa_msgsize)) { - printf("PKCS #1 v1.5 encrypt/decrypt failure (rsa_msgsize: %lu, stat: %d)\n", rsa_msgsize, stat); - return 1; - } - } - } - - /* signature */ - len = sizeof(out); - DO(rsa_v15_sign_hash(in, 20, out, &len, hash_idx, &key)); - in[1] ^= 1; - DO(rsa_v15_verify_hash(out, len, in, 20, hash_idx, &stat, &key)); - in[1] ^= 1; - DO(rsa_v15_verify_hash(out, len, in, 20, hash_idx, &stat2, &key)); - if (!(stat == 0 && stat2 == 1)) { - printf("PKCS #1 v1.5 sign/verify failure (stat %d, stat2 %d)\n", stat, stat2); - return 1; - } - + /* encrypt the key (without lparam) */ for (cnt = 0; cnt < 4; cnt++) { for (rsa_msgsize = 1; rsa_msgsize <= 86; rsa_msgsize++) { @@ -105,35 +181,35 @@ printf("\n"); /* change a byte back */ out[8] ^= 1; if (len2 != rsa_msgsize) { - printf("\nrsa_decrypt_key mismatch len %lu (first decrypt)", len2); + fprintf(stderr, "\nrsa_decrypt_key mismatch len %lu (first decrypt)", len2); return 1; } len2 = rsa_msgsize; DO(rsa_decrypt_key(out, len, tmp, &len2, NULL, 0, hash_idx, &stat, &key)); if (!(stat == 1 && stat2 == 0)) { - printf("rsa_decrypt_key failed"); + fprintf(stderr, "rsa_decrypt_key failed"); return 1; } if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) { unsigned long x; - printf("\nrsa_decrypt_key mismatch, len %lu (second decrypt)\n", len2); - printf("Original contents: \n"); + fprintf(stderr, "\nrsa_decrypt_key mismatch, len %lu (second decrypt)\n", len2); + fprintf(stderr, "Original contents: \n"); for (x = 0; x < rsa_msgsize; ) { - printf("%02x ", in[x]); + fprintf(stderr, "%02x ", in[x]); if (!(++x % 16)) { - printf("\n"); + fprintf(stderr, "\n"); } } - printf("\n"); - printf("Output contents: \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Output contents: \n"); for (x = 0; x < rsa_msgsize; ) { - printf("%02x ", out[x]); + fprintf(stderr, "%02x ", out[x]); if (!(++x % 16)) { - printf("\n"); + fprintf(stderr, "\n"); } } - printf("\n"); + fprintf(stderr, "\n"); return 1; } } @@ -148,7 +224,7 @@ printf("\n"); out[8] ^= 1; DO(rsa_decrypt_key(out, len, tmp, &len2, lparam, sizeof(lparam), hash_idx, &stat2, &key)); if (len2 != rsa_msgsize) { - printf("\nrsa_decrypt_key mismatch len %lu (first decrypt)", len2); + fprintf(stderr, "\nrsa_decrypt_key mismatch len %lu (first decrypt)", len2); return 1; } /* change a byte back */ @@ -157,11 +233,11 @@ printf("\n"); len2 = rsa_msgsize; DO(rsa_decrypt_key(out, len, tmp, &len2, lparam, sizeof(lparam), hash_idx, &stat, &key)); if (!(stat == 1 && stat2 == 0)) { - printf("rsa_decrypt_key failed"); + fprintf(stderr, "rsa_decrypt_key failed"); return 1; } if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) { - printf("rsa_decrypt_key mismatch len %lu", len2); + fprintf(stderr, "rsa_decrypt_key mismatch len %lu", len2); return 1; } } @@ -185,7 +261,7 @@ printf("\n"); DO(rsa_verify_hash(out, len, in, 20, hash_idx, 0, &stat2, &key)); if (!(stat == 1 && stat2 == 0)) { - printf("rsa_verify_hash (unsalted, origKey) failed, %d, %d", stat, stat2); + fprintf(stderr, "rsa_verify_hash (unsalted, origKey) failed, %d, %d", stat, stat2); rsa_free(&key); rsa_free(&pubKey); rsa_free(&privKey); @@ -201,7 +277,7 @@ printf("\n"); DO(rsa_verify_hash(out, len, in, 20, hash_idx, 0, &stat2, &privKey)); if (!(stat == 1 && stat2 == 0)) { - printf("rsa_verify_hash (unsalted, privKey) failed, %d, %d", stat, stat2); + fprintf(stderr, "rsa_verify_hash (unsalted, privKey) failed, %d, %d", stat, stat2); rsa_free(&key); rsa_free(&pubKey); rsa_free(&privKey); @@ -217,7 +293,7 @@ printf("\n"); DO(rsa_verify_hash(out, len, in, 20, hash_idx, 0, &stat2, &pubKey)); if (!(stat == 1 && stat2 == 0)) { - printf("rsa_verify_hash (unsalted, pubkey) failed, %d, %d", stat, stat2); + fprintf(stderr, "rsa_verify_hash (unsalted, pubkey) failed, %d, %d", stat, stat2); rsa_free(&key); rsa_free(&pubKey); rsa_free(&privKey); @@ -233,7 +309,7 @@ printf("\n"); DO(rsa_verify_hash(out, len, in, 20, hash_idx, 8, &stat2, &pubKey)); if (!(stat == 1 && stat2 == 0)) { - printf("rsa_verify_hash (salted) failed, %d, %d", stat, stat2); + fprintf(stderr, "rsa_verify_hash (salted) failed, %d, %d", stat, stat2); rsa_free(&key); rsa_free(&pubKey); rsa_free(&privKey); @@ -251,8 +327,12 @@ printf("\n"); int rsa_test(void) { - printf("NOP"); + fprintf(stderr, "NOP"); return 0; } #endif + +/* $Source: /cvs/libtom/libtomcrypt/testprof/rsa_test.c,v $ */ +/* $Revision: 1.10 $ */ +/* $Date: 2005/06/03 19:18:33 $ */ diff --git a/testprof/store_test.c b/testprof/store_test.c index 41b2f92..5a38d65 100644 --- a/testprof/store_test.c +++ b/testprof/store_test.c @@ -3,13 +3,17 @@ /* Test store/load macros with offsets */ int store_test(void) { - unsigned char buf[24]; + unsigned char buf[256]; int y; ulong32 L, L1; ulong64 LL, LL1; +#ifdef LTC_FAST + int x, z; +#endif - L = 0x12345678UL; for (y = 0; y < 4; y++) { + L = 0x12345678UL; + L1 = 0; STORE32L(L, buf + y); LOAD32L(L1, buf + y); if (L1 != L) { @@ -24,8 +28,9 @@ int store_test(void) } } - LL = CONST64 (0x01020304050607); for (y = 0; y < 8; y++) { + LL = CONST64 (0x01020304050607); + LL1 = 0; STORE64L(LL, buf + y); LOAD64L(LL1, buf + y); if (LL1 != LL) { @@ -40,5 +45,34 @@ int store_test(void) } } +/* test LTC_FAST */ +#ifdef LTC_FAST + y = 16; + + for (z = 0; z < y; z++) { + /* fill y bytes with random */ + yarrow_read(buf+z, y, &yarrow_prng); + yarrow_read(buf+z+y, y, &yarrow_prng); + + /* now XOR it byte for byte */ + for (x = 0; x < y; x++) { + buf[2*y+z+x] = buf[z+x] ^ buf[z+y+x]; + } + + /* now XOR it word for word */ + for (x = 0; x < y; x += sizeof(LTC_FAST_TYPE)) { + *((LTC_FAST_TYPE*)(&buf[3*y+z+x])) = *((LTC_FAST_TYPE*)(&buf[z+x])) ^ *((LTC_FAST_TYPE*)(&buf[z+y+x])); + } + + if (memcmp(&buf[2*y+z], &buf[3*y+z], y)) { + fprintf(stderr, "\nLTC_FAST failed at offset %d\n", z); + return 1; + } + } +#endif return 0; } + +/* $Source: /cvs/libtom/libtomcrypt/testprof/store_test.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/testprof/test.c b/testprof/test.c index 9f6df71..5a38421 100644 --- a/testprof/test.c +++ b/testprof/test.c @@ -7,3 +7,7 @@ void run_cmd(int res, int line, char *file, char *cmd) exit(EXIT_FAILURE); } } + +/* $Source: /cvs/libtom/libtomcrypt/testprof/test.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/testprof/test.key b/testprof/test.key new file mode 100644 index 0000000..e4996c3 --- /dev/null +++ b/testprof/test.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXgIBAAKBgQDPmt5kitrIMyCp14MxGVSymoWnobd1M7aprIQks97bfYUtlmXl +P3KVJJ8oaMpP20QcPmASit0mpev/C17UiDhJKm5bvxI3R70Fa7zb8+7kEY5BaHxh +E9dCyIC+No/cCItPrKTidgzJY2xJWJPtzKrcJTsKYD+LVDrDTTHnlKRE/QIDAQAB +AoGBAMhiuereRFMdVpfZl54azzAeCohFhikwo02fYWVz4NaHj7bzBqOC3Hys/pso +mq79+/4vDtiXBOO7H9HsDbqjSX9HrIpEBH6GtzlCP60etw6lUfRAYx79veqfQZ+o +kB1vClqVExENgK9fZJiKLHhoZbAri6JTh8rxZASr8nvbg8iBAkEA975eI8MyP7+L +jjru/PzL5ffxC7xCgq7Vej7K99VpP2Qloh+3dXUFkkLruPHzCgXjlNFVeDWgNqCb +fJKEbN3cTQJBANaGDoVCCwQIhCFg8A4NiP0eNhBlTx5TtAhygFw/WWYX5pjy6Wx6 +Bkysdj3tjKHOrRu9tH0ovOMOOI2Z2AW1o3ECQG3rwy0u8F6kiDEFKQCK0ZUpm4PP +ddsx43on3jp0MAx2TNRQKkAtOdmZY6ldgK5TypQ/BSMe+AUE4bg18hezoIkCQQCr +kIj6YAgpUJpDi6BQzNha/pdkY3F0IqMgAlrP68YWlVTRy6uNGsYA+giSnHHVUlI1 +lnFLi5IM0Om/rWMLpemxAkEA3MwnyOTcYkjVm6/1q2D2If1T4rddCckaoQSp/GEs +XQRYOlo58UohVmf9zCCjj3gYWnk9Lo5+hgrmqDPBBBdKnw== +-----END RSA PRIVATE KEY----- diff --git a/testprof/tomcrypt_test.h b/testprof/tomcrypt_test.h index fc28430..2c66bad 100644 --- a/testprof/tomcrypt_test.h +++ b/testprof/tomcrypt_test.h @@ -71,3 +71,7 @@ void time_encmacs(void); #endif + +/* $Source: /cvs/libtom/libtomcrypt/testprof/tomcrypt_test.h,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2005/05/05 14:35:59 $ */ diff --git a/testprof/x86_prof.c b/testprof/x86_prof.c index bcc25f4..997180c 100644 --- a/testprof/x86_prof.c +++ b/testprof/x86_prof.c @@ -21,10 +21,10 @@ void tally_results(int type) // qsort the results qsort(results, no_results, sizeof(struct list), &sorter); - printf("\n"); + fprintf(stderr, "\n"); if (type == 0) { for (x = 0; x < no_results; x++) { - printf("%-20s: Schedule at %6lu\n", cipher_descriptor[results[x].id].name, (unsigned long)results[x].spd1); + fprintf(stderr, "%-20s: Schedule at %6lu\n", cipher_descriptor[results[x].id].name, (unsigned long)results[x].spd1); } } else if (type == 1) { for (x = 0; x < no_results; x++) { @@ -42,7 +42,7 @@ void tally_results(int type) /* RDTSC from Scott Duplichan */ ulong64 rdtsc (void) { - #if defined __GNUC__ + #if defined __GNUC__ && !defined(LTC_NO_ASM) #ifdef INTEL_CC ulong64 a; asm ( " rdtsc ":"=A"(a)); @@ -62,11 +62,11 @@ ulong64 rdtsc (void) #endif // Microsoft and Intel Windows compilers - #elif defined _M_IX86 + #elif defined _M_IX86 && !defined(LTC_NO_ASM) __asm rdtsc - #elif defined _M_AMD64 + #elif defined _M_AMD64 && !defined(LTC_NO_ASM) return __rdtsc (); - #elif defined _M_IA64 + #elif defined _M_IA64 && !defined(LTC_NO_ASM) #if defined __INTEL_COMPILER #include #endif @@ -104,7 +104,7 @@ void init_timer(void) c2 = (t2 > c2) ? t2 : c2; } skew = c2 - c1; - printf("Clock Skew: %lu\n", (unsigned long)skew); + fprintf(stderr, "Clock Skew: %lu\n", (unsigned long)skew); } void reg_algs(void) @@ -199,7 +199,7 @@ void reg_algs(void) #ifdef CHC_HASH register_hash(&chc_desc); if ((err = chc_register(register_cipher(&aes_desc))) != CRYPT_OK) { - printf("chc_register error: %s\n", error_to_string(err)); + fprintf(stderr, "chc_register error: %s\n", error_to_string(err)); exit(EXIT_FAILURE); } #endif @@ -231,7 +231,7 @@ int time_keysched(void) int (*func) (const unsigned char *, int , int , symmetric_key *); unsigned char key[MAXBLOCKSIZE]; - printf ("\n\nKey Schedule Time Trials for the Symmetric Ciphers:\n(Times are cycles per key)\n"); + fprintf(stderr, "\n\nKey Schedule Time Trials for the Symmetric Ciphers:\n(Times are cycles per key)\n"); no_results = 0; for (x = 0; cipher_descriptor[x].name != NULL; x++) { #define DO1(k) func(k, kl, 0, &skey); @@ -249,7 +249,7 @@ int time_keysched(void) t1 = c1 - skew; results[no_results].spd1 = results[no_results].avg = t1; results[no_results++].id = x; - printf("."); fflush(stdout); + fprintf(stderr, "."); fflush(stdout); #undef DO1 } @@ -266,7 +266,7 @@ int time_cipher(void) unsigned char key[MAXBLOCKSIZE], pt[4096]; int err; - printf ("\n\nECB Time Trials for the Symmetric Ciphers:\n"); + fprintf(stderr, "\n\nECB Time Trials for the Symmetric Ciphers:\n"); no_results = 0; for (x = 0; cipher_descriptor[x].name != NULL; x++) { ecb_start(x, key, cipher_descriptor[x].min_key_length, 0, &ecb); @@ -318,7 +318,7 @@ int time_cipher(void) results[no_results].spd2 = a2/(sizeof(pt)/cipher_descriptor[x].block_length); results[no_results].avg = (results[no_results].spd1 + results[no_results].spd2+1)/2; ++no_results; - printf("."); fflush(stdout); + fprintf(stderr, "."); fflush(stdout); #undef DO2 #undef DO1 @@ -337,7 +337,7 @@ int time_cipher2(void) unsigned char key[MAXBLOCKSIZE], pt[4096]; int err; - printf ("\n\nCBC Time Trials for the Symmetric Ciphers:\n"); + fprintf(stderr, "\n\nCBC Time Trials for the Symmetric Ciphers:\n"); no_results = 0; for (x = 0; cipher_descriptor[x].name != NULL; x++) { cbc_start(x, pt, key, cipher_descriptor[x].min_key_length, 0, &cbc); @@ -389,7 +389,7 @@ int time_cipher2(void) results[no_results].spd2 = a2/(sizeof(pt)/cipher_descriptor[x].block_length); results[no_results].avg = (results[no_results].spd1 + results[no_results].spd2+1)/2; ++no_results; - printf("."); fflush(stdout); + fprintf(stderr, "."); fflush(stdout); #undef DO2 #undef DO1 @@ -399,7 +399,7 @@ int time_cipher2(void) return 0; } #else -int time_cipher2(void) { printf("NO CBC\n"); return 0; } +int time_cipher2(void) { fprintf(stderr, "NO CBC\n"); return 0; } #endif #ifdef CTR @@ -411,10 +411,10 @@ int time_cipher3(void) unsigned char key[MAXBLOCKSIZE], pt[4096]; int err; - printf ("\n\nCTR Time Trials for the Symmetric Ciphers:\n"); + fprintf(stderr, "\n\nCTR Time Trials for the Symmetric Ciphers:\n"); no_results = 0; for (x = 0; cipher_descriptor[x].name != NULL; x++) { - ctr_start(x, pt, key, cipher_descriptor[x].min_key_length, 0, &ctr); + ctr_start(x, pt, key, cipher_descriptor[x].min_key_length, 0, CTR_COUNTER_LITTLE_ENDIAN, &ctr); /* sanity check on cipher */ if ((err = cipher_descriptor[x].test()) != CRYPT_OK) { @@ -463,7 +463,7 @@ int time_cipher3(void) results[no_results].spd2 = a2/(sizeof(pt)/cipher_descriptor[x].block_length); results[no_results].avg = (results[no_results].spd1 + results[no_results].spd2+1)/2; ++no_results; - printf("."); fflush(stdout); + fprintf(stderr, "."); fflush(stdout); #undef DO2 #undef DO1 @@ -473,7 +473,7 @@ int time_cipher3(void) return 0; } #else -int time_cipher3(void) { printf("NO CTR\n"); return 0; } +int time_cipher3(void) { fprintf(stderr, "NO CTR\n"); return 0; } #endif int time_hash(void) @@ -485,7 +485,7 @@ int time_hash(void) unsigned char pt[MAXBLOCKSIZE]; - printf ("\n\nHASH Time Trials for:\n"); + fprintf(stderr, "\n\nHASH Time Trials for:\n"); no_results = 0; for (x = 0; hash_descriptor[x].name != NULL; x++) { @@ -518,7 +518,7 @@ int time_hash(void) results[no_results].id = x; results[no_results].spd1 = results[no_results].avg = t1; ++no_results; - printf("."); fflush(stdout); + fprintf(stderr, "."); fflush(stdout); #undef DO2 #undef DO1 } @@ -534,7 +534,7 @@ void time_mult(void) unsigned long x, y; mp_int a, b, c; - printf("Timing Multiplying:\n"); + fprintf(stderr, "Timing Multiplying:\n"); mp_init_multi(&a,&b,&c,NULL); for (x = 128/DIGIT_BIT; x <= 1536/DIGIT_BIT; x += 128/DIGIT_BIT) { mp_rand(&a, x); @@ -551,7 +551,7 @@ void time_mult(void) t1 = (t_read() - t1)>>1; if (t1 < t2) t2 = t1; } - printf("%4lu bits: %9llu cycles\n", x*DIGIT_BIT, t2); + fprintf(stderr, "%4lu bits: %9llu cycles\n", x*DIGIT_BIT, t2); } mp_clear_multi(&a,&b,&c,NULL); @@ -565,7 +565,7 @@ void time_sqr(void) unsigned long x, y; mp_int a, b; - printf("Timing Squaring:\n"); + fprintf(stderr, "Timing Squaring:\n"); mp_init_multi(&a,&b,NULL); for (x = 128/DIGIT_BIT; x <= 1536/DIGIT_BIT; x += 128/DIGIT_BIT) { mp_rand(&a, x); @@ -581,7 +581,7 @@ void time_sqr(void) t1 = (t_read() - t1)>>1; if (t1 < t2) t2 = t1; } - printf("%4lu bits: %9llu cycles\n", x*DIGIT_BIT, t2); + fprintf(stderr, "%4lu bits: %9llu cycles\n", x*DIGIT_BIT, t2); } mp_clear_multi(&a,&b,NULL); @@ -589,8 +589,8 @@ void time_sqr(void) #undef DO2 } #else -void time_mult(void) { printf("NO MULT\n"); } -void time_sqr(void) { printf("NO SQR\n"); } +void time_mult(void) { fprintf(stderr, "NO MULT\n"); } +void time_sqr(void) { fprintf(stderr, "NO SQR\n"); } #endif void time_prng(void) @@ -601,7 +601,7 @@ void time_prng(void) unsigned long x, y; int err; - printf("Timing PRNGs (cycles/byte output, cycles add_entropy (32 bytes) :\n"); + fprintf(stderr, "Timing PRNGs (cycles/byte output, cycles add_entropy (32 bytes) :\n"); for (x = 0; prng_descriptor[x].name != NULL; x++) { /* sanity check on prng */ @@ -616,7 +616,7 @@ void time_prng(void) prng_descriptor[x].ready(&tprng); t2 = -1; -#define DO1 if (prng_descriptor[x].read(buf, 4096, &tprng) != 4096) { printf("\n\nERROR READ != 4096\n\n"); exit(EXIT_FAILURE); } +#define DO1 if (prng_descriptor[x].read(buf, 4096, &tprng) != 4096) { fprintf(stderr, "\n\nERROR READ != 4096\n\n"); exit(EXIT_FAILURE); } #define DO2 DO1 DO1 for (y = 0; y < 10000; y++) { t_start(); @@ -625,7 +625,7 @@ void time_prng(void) t1 = (t_read() - t1)>>1; if (t1 < t2) t2 = t1; } - printf("%20s: %5llu ", prng_descriptor[x].name, t2>>12); + fprintf(stderr, "%20s: %5llu ", prng_descriptor[x].name, t2>>12); #undef DO2 #undef DO1 @@ -638,7 +638,7 @@ void time_prng(void) t1 = (t_read() - t1)>>1; if (t1 < t2) t2 = t1; } - printf("%5llu\n", t2); + fprintf(stderr, "%5llu\n", t2); #undef DO2 #undef DO1 @@ -672,7 +672,7 @@ void time_rsa(void) } } t2 >>= 4; - printf("RSA-%lu make_key took %15llu cycles\n", x, t2); + fprintf(stderr, "RSA-%lu make_key took %15llu cycles\n", x, t2); t2 = 0; for (y = 0; y < 16; y++) { @@ -689,7 +689,7 @@ void time_rsa(void) t2 += t1; } t2 >>= 4; - printf("RSA-%lu encrypt_key took %15llu cycles\n", x, t2); + fprintf(stderr, "RSA-%lu encrypt_key took %15llu cycles\n", x, t2); t2 = 0; for (y = 0; y < 16; y++) { @@ -705,14 +705,14 @@ void time_rsa(void) t2 += t1; } t2 >>= 4; - printf("RSA-%lu decrypt_key took %15llu cycles\n", x, t2); + fprintf(stderr, "RSA-%lu decrypt_key took %15llu cycles\n", x, t2); rsa_free(&key); } } #else -void time_rsa(void) { printf("NO RSA\n"); } +void time_rsa(void) { fprintf(stderr, "NO RSA\n"); } #endif #ifdef MECC @@ -724,7 +724,7 @@ void time_ecc(void) unsigned char buf[2][4096]; unsigned long i, x, y, z; int err; - static unsigned long sizes[] = {160/8, 256/8, 521/8, 100000}; + static unsigned long sizes[] = {192/8, 256/8, 384/8, 521/8, 100000}; for (x = sizes[i=0]; x < 100000; x = sizes[++i]) { t2 = 0; @@ -743,7 +743,7 @@ void time_ecc(void) } } t2 >>= 4; - printf("ECC-%lu make_key took %15llu cycles\n", x*8, t2); + fprintf(stderr, "ECC-%lu make_key took %15llu cycles\n", x*8, t2); t2 = 0; for (y = 0; y < 16; y++) { @@ -759,12 +759,12 @@ void time_ecc(void) t2 += t1; } t2 >>= 4; - printf("ECC-%lu encrypt_key took %15llu cycles\n", x*8, t2); + fprintf(stderr, "ECC-%lu encrypt_key took %15llu cycles\n", x*8, t2); ecc_free(&key); } } #else -void time_ecc(void) { printf("NO ECC\n"); } +void time_ecc(void) { fprintf(stderr, "NO ECC\n"); } #endif #ifdef MDH @@ -795,7 +795,7 @@ void time_dh(void) } } t2 >>= 4; - printf("DH-%4lu make_key took %15llu cycles\n", x*8, t2); + fprintf(stderr, "DH-%4lu make_key took %15llu cycles\n", x*8, t2); t2 = 0; for (y = 0; y < 16; y++) { @@ -811,12 +811,12 @@ void time_dh(void) t2 += t1; } t2 >>= 4; - printf("DH-%4lu encrypt_key took %15llu cycles\n", x*8, t2); + fprintf(stderr, "DH-%4lu encrypt_key took %15llu cycles\n", x*8, t2); dh_free(&key); } } #else -void time_dh(void) { printf("NO DH\n"); } +void time_dh(void) { fprintf(stderr, "NO DH\n"); } #endif void time_macs_(unsigned long MAC_SIZE) @@ -826,7 +826,7 @@ void time_macs_(unsigned long MAC_SIZE) unsigned long x, z; int err, cipher_idx, hash_idx; - printf("\nMAC Timings (cycles/byte on %dKB blocks):\n", MAC_SIZE); + fprintf(stderr, "\nMAC Timings (cycles/byte on %luKB blocks):\n", MAC_SIZE); buf = XMALLOC(MAC_SIZE*1024); if (buf == NULL) { @@ -853,7 +853,7 @@ void time_macs_(unsigned long MAC_SIZE) t1 = t_read() - t1; if (t1 < t2) t2 = t1; } - printf("OMAC-AES\t\t%9llu\n", t2/(MAC_SIZE*1024)); + fprintf(stderr, "OMAC-AES\t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); #endif #ifdef PMAC @@ -869,7 +869,7 @@ void time_macs_(unsigned long MAC_SIZE) t1 = t_read() - t1; if (t1 < t2) t2 = t1; } - printf("PMAC-AES\t\t%9llu\n", t2/(MAC_SIZE*1024)); + fprintf(stderr, "PMAC-AES\t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); #endif #ifdef PELICAN @@ -885,7 +885,7 @@ void time_macs_(unsigned long MAC_SIZE) t1 = t_read() - t1; if (t1 < t2) t2 = t1; } - printf("PELICAN \t\t%9llu\n", t2/(MAC_SIZE*1024)); + fprintf(stderr, "PELICAN \t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); #endif #ifdef HMAC @@ -901,7 +901,7 @@ void time_macs_(unsigned long MAC_SIZE) t1 = t_read() - t1; if (t1 < t2) t2 = t1; } - printf("HMAC-MD5\t\t%9llu\n", t2/(MAC_SIZE*1024)); + fprintf(stderr, "HMAC-MD5\t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); #endif XFREE(buf); @@ -921,7 +921,7 @@ void time_encmacs_(unsigned long MAC_SIZE) unsigned long x, z; int err, cipher_idx; - printf("\nENC+MAC Timings (zero byte AAD, 16 byte IV, cycles/byte on %dKB blocks):\n", MAC_SIZE); + fprintf(stderr, "\nENC+MAC Timings (zero byte AAD, 16 byte IV, cycles/byte on %luKB blocks):\n", MAC_SIZE); buf = XMALLOC(MAC_SIZE*1024); if (buf == NULL) { @@ -948,7 +948,7 @@ void time_encmacs_(unsigned long MAC_SIZE) t1 = t_read() - t1; if (t1 < t2) t2 = t1; } - printf("EAX \t\t%9llu\n", t2/(MAC_SIZE*1024)); + fprintf(stderr, "EAX \t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); #endif #ifdef OCB_MODE @@ -964,7 +964,7 @@ void time_encmacs_(unsigned long MAC_SIZE) t1 = t_read() - t1; if (t1 < t2) t2 = t1; } - printf("OCB \t\t%9llu\n", t2/(MAC_SIZE*1024)); + fprintf(stderr, "OCB \t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); #endif #ifdef CCM_MODE @@ -980,7 +980,7 @@ void time_encmacs_(unsigned long MAC_SIZE) t1 = t_read() - t1; if (t1 < t2) t2 = t1; } - printf("CCM \t\t%9llu\n", t2/(MAC_SIZE*1024)); + fprintf(stderr, "CCM \t\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); #endif #ifdef GCM_MODE @@ -996,12 +996,12 @@ void time_encmacs_(unsigned long MAC_SIZE) t1 = t_read() - t1; if (t1 < t2) t2 = t1; } - printf("GCM (no-precomp)\t%9llu\n", t2/(MAC_SIZE*1024)); + fprintf(stderr, "GCM (no-precomp)\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); { gcm_state gcm; - if ((err = gcm_init(&gcm, cipher_idx, key, 16)) != CRYPT_OK) { printf("gcm_init: %s\n", error_to_string(err)); exit(EXIT_FAILURE); } + if ((err = gcm_init(&gcm, cipher_idx, key, 16)) != CRYPT_OK) { fprintf(stderr, "gcm_init: %s\n", error_to_string(err)); exit(EXIT_FAILURE); } t2 = -1; for (x = 0; x < 10000; x++) { t_start(); @@ -1031,7 +1031,7 @@ void time_encmacs_(unsigned long MAC_SIZE) t1 = t_read() - t1; if (t1 < t2) t2 = t1; } - printf("GCM (precomp)\t%9llu\n", t2/(MAC_SIZE*1024)); + fprintf(stderr, "GCM (precomp)\t%9llu\n", t2/(ulong64)(MAC_SIZE*1024)); } #endif @@ -1044,3 +1044,7 @@ void time_encmacs(void) time_encmacs_(4); time_encmacs_(32); } + +/* $Source: /cvs/libtom/libtomcrypt/testprof/x86_prof.c,v $ */ +/* $Revision: 1.16 $ */ +/* $Date: 2005/06/14 20:44:23 $ */

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 delta 369671 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