Import of old SSLeay release: SSLeay 0.9.1b (unreleased) SSLeay
authorRalf S. Engelschall <rse@openssl.org>
Mon, 21 Dec 1998 11:00:56 +0000 (11:00 +0000)
committerRalf S. Engelschall <rse@openssl.org>
Mon, 21 Dec 1998 11:00:56 +0000 (11:00 +0000)
501 files changed:
Configure
HISTORY.090 [new file with mode: 0644]
INSTALL
MINFO
Makefile.ssl
PATENTS
README
README.090
apps/asn1pars.c
apps/ca-cert.srl
apps/ca.c
apps/cert.der [new file with mode: 0644]
apps/crl.c
apps/dgst.c
apps/dsaparam.c
apps/g_ssleay.pl
apps/gmon.out [new file with mode: 0644]
apps/mklinks
apps/oid.cnf [new file with mode: 0644]
apps/openssl.c
apps/openssl.cnf
apps/privkey.pem
apps/progs.h
apps/progs.pl
apps/req.c
apps/rmlinks
apps/rsa/01.pem [new file with mode: 0644]
apps/rsa/1.txt [new file with mode: 0644]
apps/rsa/SecureServer.pem [new file with mode: 0644]
apps/rsa/s.txt [new file with mode: 0644]
apps/s_cb.c
apps/s_client.c
apps/s_server.c
apps/s_time.c
apps/sc.c [new file with mode: 0644]
apps/server.pem
apps/sess_id.c
apps/speed.c
apps/ssleay.c
apps/ssleay.cnf
apps/verify.c
apps/version.c
apps/x509.c
bugs/sgiccbug.c
bugs/ultrixcc.c [new file with mode: 0644]
certs/expired/ICE-CA.pem [new file with mode: 0644]
certs/expired/ICE-root.pem [new file with mode: 0644]
certs/expired/ICE-user.pem [new file with mode: 0644]
certs/expired/ICE.crl [new file with mode: 0644]
certs/vsign1.pem
certs/vsign2.pem
certs/vsign3.pem
certs/vsignss.pem [new file with mode: 0644]
certs/vsigntca.pem [new file with mode: 0644]
config
crypto/Makefile.ssl
crypto/asn1/Makefile.ssl
crypto/asn1/a_bitstr.c
crypto/asn1/a_bitstr.orig.c [new file with mode: 0644]
crypto/asn1/a_bmp.c
crypto/asn1/a_bytes.c
crypto/asn1/a_hdr.c
crypto/asn1/a_int.c
crypto/asn1/a_object.c
crypto/asn1/a_octet.c
crypto/asn1/a_set.c
crypto/asn1/a_sign.c
crypto/asn1/a_type.c
crypto/asn1/a_utctm.c
crypto/asn1/asn1.err
crypto/asn1/asn1.h
crypto/asn1/asn1_err.c
crypto/asn1/asn1_lib.c
crypto/asn1/asn1_mac.h
crypto/asn1/asn1_par.c
crypto/asn1/d2i_dhp.c
crypto/asn1/d2i_dsap.c
crypto/asn1/d2i_pr.c
crypto/asn1/d2i_pu.c
crypto/asn1/d2i_r_pr.c
crypto/asn1/d2i_r_pu.c
crypto/asn1/d2i_s_pr.c
crypto/asn1/d2i_s_pu.c
crypto/asn1/evp_asn1.c
crypto/asn1/i2d_dhp.c
crypto/asn1/i2d_dsap.c
crypto/asn1/i2d_r_pr.c
crypto/asn1/i2d_r_pu.c
crypto/asn1/n_pkey.c
crypto/asn1/p7_dgst.c
crypto/asn1/p7_enc.c
crypto/asn1/p7_enc_c.c
crypto/asn1/p7_evp.c
crypto/asn1/p7_i_s.c
crypto/asn1/p7_lib.c
crypto/asn1/p7_recip.c
crypto/asn1/p7_s_e.c
crypto/asn1/p7_signd.c
crypto/asn1/p7_signi.c
crypto/asn1/pkcs8.c
crypto/asn1/t_x509.c
crypto/asn1/x [new file with mode: 0644]
crypto/asn1/x_algor.c
crypto/asn1/x_attrib.c
crypto/asn1/x_cinf.c
crypto/asn1/x_crl.c
crypto/asn1/x_exten.c
crypto/asn1/x_name.c
crypto/asn1/x_pkey.c
crypto/asn1/x_pubkey.c
crypto/asn1/x_req.c
crypto/asn1/x_sig.c
crypto/asn1/x_spki.c
crypto/asn1/x_val.c
crypto/asn1/x_x509.c
crypto/bf/Makefile.ssl
crypto/bf/bf_ecb.c
crypto/bf/bf_opts.c
crypto/bf/bfspeed.c
crypto/bio/b_sock.c
crypto/bio/bio.err
crypto/bio/bio.h
crypto/bio/bio_err.c
crypto/bio/bio_lib.c
crypto/bio/bss_acpt.c
crypto/bio/bss_conn.c
crypto/bio/bss_file.c
crypto/bio/bss_mem.c
crypto/bio/bss_sock.c
crypto/bio/cd [new file with mode: 0644]
crypto/bio/fg [new file with mode: 0644]
crypto/bio/grep [new file with mode: 0644]
crypto/bio/vi [new file with mode: 0644]
crypto/bn/DSA [new file with mode: 0644]
crypto/bn/Makefile.ssl
crypto/bn/alpha.s [new file with mode: 0644]
crypto/bn/asm/a.out [new file with mode: 0644]
crypto/bn/asm/alpha.s
crypto/bn/asm/alpha.s.works [new file with mode: 0644]
crypto/bn/asm/alpha.works/add.pl [new file with mode: 0644]
crypto/bn/asm/alpha.works/div.pl [new file with mode: 0644]
crypto/bn/asm/alpha.works/mul.pl [new file with mode: 0644]
crypto/bn/asm/alpha.works/mul_add.pl [new file with mode: 0644]
crypto/bn/asm/alpha.works/mul_c4.pl [new file with mode: 0644]
crypto/bn/asm/alpha.works/mul_c4.works.pl [new file with mode: 0644]
crypto/bn/asm/alpha.works/mul_c8.pl [new file with mode: 0644]
crypto/bn/asm/alpha.works/sqr.pl [new file with mode: 0644]
crypto/bn/asm/alpha.works/sqr_c4.pl [new file with mode: 0644]
crypto/bn/asm/alpha.works/sqr_c8.pl [new file with mode: 0644]
crypto/bn/asm/alpha.works/sub.pl [new file with mode: 0644]
crypto/bn/asm/alpha/add.pl [new file with mode: 0644]
crypto/bn/asm/alpha/div.pl [new file with mode: 0644]
crypto/bn/asm/alpha/mul.pl [new file with mode: 0644]
crypto/bn/asm/alpha/mul_add.pl [new file with mode: 0644]
crypto/bn/asm/alpha/mul_c4.pl [new file with mode: 0644]
crypto/bn/asm/alpha/mul_c4.works.pl [new file with mode: 0644]
crypto/bn/asm/alpha/mul_c8.pl [new file with mode: 0644]
crypto/bn/asm/alpha/sqr.pl [new file with mode: 0644]
crypto/bn/asm/alpha/sqr_c4.pl [new file with mode: 0644]
crypto/bn/asm/alpha/sqr_c8.pl [new file with mode: 0644]
crypto/bn/asm/alpha/sub.pl [new file with mode: 0644]
crypto/bn/asm/bn-586.pl
crypto/bn/asm/bn-alpha.pl [new file with mode: 0644]
crypto/bn/asm/bn-win32.asm
crypto/bn/asm/bn86unix.cpp
crypto/bn/asm/ca.pl [new file with mode: 0644]
crypto/bn/asm/co-586.pl [new file with mode: 0644]
crypto/bn/asm/co-alpha.pl [new file with mode: 0644]
crypto/bn/asm/co86unix.cpp [new file with mode: 0644]
crypto/bn/asm/elf.s [new file with mode: 0644]
crypto/bn/asm/f [new file with mode: 0644]
crypto/bn/asm/f.c [new file with mode: 0644]
crypto/bn/asm/f.elf [new file with mode: 0644]
crypto/bn/asm/f.s [new file with mode: 0644]
crypto/bn/asm/ff [new file with mode: 0644]
crypto/bn/asm/mips1.s [new file with mode: 0644]
crypto/bn/asm/mips3.s [new file with mode: 0644]
crypto/bn/asm/x86.pl [new file with mode: 0644]
crypto/bn/asm/x86/add.pl [new file with mode: 0644]
crypto/bn/asm/x86/comba.pl [new file with mode: 0644]
crypto/bn/asm/x86/div.pl [new file with mode: 0644]
crypto/bn/asm/x86/f [new file with mode: 0644]
crypto/bn/asm/x86/mul.pl [new file with mode: 0644]
crypto/bn/asm/x86/mul_add.pl [new file with mode: 0644]
crypto/bn/asm/x86/sqr.pl [new file with mode: 0644]
crypto/bn/asm/x86/sub.pl [new file with mode: 0644]
crypto/bn/asm/x86w16.asm
crypto/bn/asm/x86w32.asm
crypto/bn/bn.err
crypto/bn/bn.h
crypto/bn/bn.mul [new file with mode: 0644]
crypto/bn/bn.org
crypto/bn/bn_add.c
crypto/bn/bn_asm.c [new file with mode: 0644]
crypto/bn/bn_blind.c
crypto/bn/bn_comba.c [new file with mode: 0644]
crypto/bn/bn_div.c
crypto/bn/bn_err.c
crypto/bn/bn_exp.c
crypto/bn/bn_exp2.c [new file with mode: 0644]
crypto/bn/bn_gcd.c
crypto/bn/bn_lcl.h
crypto/bn/bn_lib.c
crypto/bn/bn_mont.c
crypto/bn/bn_mpi.c
crypto/bn/bn_mul.c
crypto/bn/bn_opts.c [new file with mode: 0644]
crypto/bn/bn_prime.c
crypto/bn/bn_recp.c
crypto/bn/bn_sqr.c
crypto/bn/bn_word.c
crypto/bn/bnspeed.c
crypto/bn/bntest.c
crypto/bn/comba.pl [new file with mode: 0644]
crypto/bn/d.c [new file with mode: 0644]
crypto/bn/exp.c [new file with mode: 0644]
crypto/bn/expspeed.c
crypto/bn/exptest.c
crypto/bn/m.pl [new file with mode: 0644]
crypto/bn/new [new file with mode: 0644]
crypto/bn/old/b_sqr.c [new file with mode: 0644]
crypto/bn/old/bn_com.c [new file with mode: 0644]
crypto/bn/old/bn_high.c [new file with mode: 0644]
crypto/bn/old/bn_ka.c [new file with mode: 0644]
crypto/bn/old/bn_low.c [new file with mode: 0644]
crypto/bn/old/bn_m.c [new file with mode: 0644]
crypto/bn/old/bn_mul.c.works [new file with mode: 0644]
crypto/bn/old/bn_wmul.c [new file with mode: 0644]
crypto/bn/old/build [new file with mode: 0755]
crypto/bn/old/info [new file with mode: 0644]
crypto/bn/old/test.works [new file with mode: 0644]
crypto/bn/test.c [new file with mode: 0644]
crypto/bn/todo [new file with mode: 0644]
crypto/buffer/buf_err.c
crypto/cast/Makefile.ssl
crypto/cast/c_ecb.c
crypto/cast/cast_spd.c
crypto/cast/castopts.c
crypto/comp/Makefile.ssl [new file with mode: 0644]
crypto/comp/c_rle.c [new file with mode: 0644]
crypto/comp/c_zlib.c [new file with mode: 0644]
crypto/comp/comp.err [new file with mode: 0644]
crypto/comp/comp.h [new file with mode: 0644]
crypto/comp/comp_err.c [new file with mode: 0644]
crypto/comp/comp_lib.c [new file with mode: 0644]
crypto/conf/conf.c
crypto/conf/conf_err.c
crypto/cpt_err.c
crypto/cryptlib.c
crypto/crypto.h
crypto/cversion.c
crypto/date.h
crypto/des/Makefile.ssl
crypto/des/VERSION
crypto/des/asm/f.cpp [new file with mode: 0644]
crypto/des/des.h
crypto/des/des.org
crypto/des/des_locl.h
crypto/des/des_locl.org
crypto/des/des_opts.c
crypto/des/destest.c
crypto/des/ecb_enc.c
crypto/des/fcrypt.c
crypto/des/set_key.c
crypto/des/speed.c
crypto/dh/dh.h
crypto/dh/dh_err.c
crypto/dh/dh_gen.c
crypto/dh/dh_key.c
crypto/dh/dh_lib.c
crypto/dh/dhtest.c
crypto/dsa/dsa.h
crypto/dsa/dsa_err.c
crypto/dsa/dsa_gen.c
crypto/dsa/dsa_lib.c
crypto/dsa/dsa_sign.c
crypto/dsa/dsa_vrf.c
crypto/dsa/f [new file with mode: 0644]
crypto/err/err.c
crypto/err/err.h
crypto/err/err_genc.pl
crypto/err/ssleay.ec
crypto/evp/abc.c [new file with mode: 0644]
crypto/evp/abcs.c [new file with mode: 0644]
crypto/evp/bio_enc.c
crypto/evp/c_all.c
crypto/evp/e_cbc_r2.c
crypto/evp/e_cfb_r2.c
crypto/evp/e_ecb_r2.c
crypto/evp/e_ofb_r2.c
crypto/evp/evp.err
crypto/evp/evp.h
crypto/evp/evp_enc.c
crypto/evp/evp_err.c
crypto/evp/evp_lib.c
crypto/evp/names.c
crypto/evp/p_lib.c
crypto/ex_data.c
crypto/idea/i_ecb.c
crypto/idea/idea_spd.c
crypto/lhash/lhash.c
crypto/lhash/lhash.h
crypto/md2/md2_dgst.c
crypto/md5/Makefile.ssl
crypto/md5/f [new file with mode: 0644]
crypto/md5/md5_dgst.c
crypto/mdc2/mdc2dgst.c
crypto/mem.c
crypto/objects/Makefile.ssl
crypto/objects/o_names.c [new file with mode: 0644]
crypto/objects/obj_dat.c
crypto/objects/obj_dat.h
crypto/objects/obj_err.c
crypto/objects/obj_lib.c
crypto/objects/objects.h
crypto/pem/gmon.out [new file with mode: 0644]
crypto/pem/pem_err.c
crypto/pem/pem_lib.c
crypto/perlasm/alpha.pl [new file with mode: 0644]
crypto/perlasm/f [new file with mode: 0644]
crypto/pkcs7/bio_ber.c [new file with mode: 0644]
crypto/pkcs7/build [new file with mode: 0755]
crypto/pkcs7/dec.c [new file with mode: 0644]
crypto/pkcs7/des.pem [new file with mode: 0644]
crypto/pkcs7/enc.c
crypto/pkcs7/es1.pem [new file with mode: 0644]
crypto/pkcs7/example.c [new file with mode: 0644]
crypto/pkcs7/info.pem [new file with mode: 0644]
crypto/pkcs7/infokey.pem [new file with mode: 0644]
crypto/pkcs7/pk7_doit.c
crypto/pkcs7/pk7_lib.c
crypto/pkcs7/pkcs7.err
crypto/pkcs7/pkcs7.h
crypto/pkcs7/pkcs7err.c
crypto/pkcs7/sign.c
crypto/pkcs7/t/3des.pem [new file with mode: 0644]
crypto/pkcs7/t/3dess.pem [new file with mode: 0644]
crypto/pkcs7/t/c.pem [new file with mode: 0644]
crypto/pkcs7/t/f [new file with mode: 0644]
crypto/pkcs7/t/ff [new file with mode: 0644]
crypto/pkcs7/t/msie-e [new file with mode: 0644]
crypto/pkcs7/t/msie-e.pem [new file with mode: 0644]
crypto/pkcs7/t/msie-enc-01 [new file with mode: 0644]
crypto/pkcs7/t/msie-enc-01.pem [new file with mode: 0644]
crypto/pkcs7/t/msie-enc-02 [new file with mode: 0644]
crypto/pkcs7/t/msie-enc-02.pem [new file with mode: 0644]
crypto/pkcs7/t/msie-s-a-e [new file with mode: 0644]
crypto/pkcs7/t/msie-s-a-e.pem [new file with mode: 0644]
crypto/pkcs7/t/nav-smime [new file with mode: 0644]
crypto/pkcs7/t/s.pem [new file with mode: 0644]
crypto/pkcs7/t/server.pem [new file with mode: 0644]
crypto/pkcs7/t/z [new file with mode: 0644]
crypto/pkcs7/t/zz [new file with mode: 0644]
crypto/pkcs7/verify.c
crypto/rand/Makefile.ssl
crypto/rand/md_rand.c
crypto/rand/rand.h
crypto/rand/rand_lib.c [new file with mode: 0644]
crypto/rand/randfile.c
crypto/rc2/rc2_ecb.c
crypto/rc2/rc2speed.c
crypto/rc2/tab.c [new file with mode: 0644]
crypto/rc4/Makefile.ssl
crypto/rc4/rc4_enc.c
crypto/rc4/rc4_skey.c
crypto/rc4/rc4speed.c
crypto/rc5/Makefile.ssl
crypto/rc5/rc5_ecb.c
crypto/rc5/rc5speed.c
crypto/ripemd/Makefile.ssl
crypto/ripemd/rmd_dgst.c
crypto/rsa/f [new file with mode: 0644]
crypto/rsa/rsa.err
crypto/rsa/rsa.h
crypto/rsa/rsa_eay.c
crypto/rsa/rsa_err.c
crypto/rsa/rsa_gen.c
crypto/rsa/rsa_lib.c
crypto/rsa/rsa_none.c
crypto/rsa/rsa_pk1.c
crypto/rsa/rsa_sign.c
crypto/rsa/rsa_ssl.c
crypto/sha/Makefile.ssl
crypto/sha/asm/a.out [new file with mode: 0644]
crypto/sha/asm/f [new file with mode: 0644]
crypto/sha/asm/f.s [new file with mode: 0644]
crypto/sha/sha1dgst.c
crypto/sha/sha_dgst.c
crypto/stack/stack.c
crypto/threads/f [new file with mode: 0644]
crypto/tmdiff.c
crypto/tmdiff.h [new file with mode: 0644]
crypto/txt_db/txt_db.c
crypto/x509/v3_x509.c
crypto/x509/x509.h
crypto/x509/x509_cmp.c
crypto/x509/x509_err.c
crypto/x509/x509_lu.c
crypto/x509/x509_r2x.c
crypto/x509/x509_vfy.c
crypto/x509/x509_vfy.h
crypto/x509/x_all.c
demos/bio/sconnect.c
demos/eay/base64.c [new file with mode: 0644]
demos/eay/conn.c [new file with mode: 0644]
demos/eay/loadrsa.c [new file with mode: 0644]
dep/files
e_os.h
makefile.one
ms/certCA.srl
ms/certCA.ss
ms/certU.ss
ms/f.bat [new file with mode: 0755]
ms/keyCA.ss
ms/keyU.ss
ms/libeay16.def
ms/libeay32.def
ms/ntdll.mak
ms/req2CA.ss
ms/reqCA.ss
ms/reqU.ss
ms/ssleay16.def
ms/ssleay32.def
ms/test.bat
ms/testenc.bat
ms/w31dll.mak
ms/zzz [new file with mode: 0755]
perl/OpenSSL.xs
perl/SSLeay.xs
perl/bio.pl
perl/bio.xs
perl/callback.c
perl/f.pl
perl/openssl_bio.xs
perl/openssl_cb.c
perl/openssl_ssl.xs
perl/ssl.pl
perl/ssl.xs
rsaref/rsar_err.c
ssl/KEYS [new file with mode: 0644]
ssl/f
ssl/f.mak [new file with mode: 0644]
ssl/s23_clnt.c
ssl/s23_lib.c
ssl/s23_srvr.c
ssl/s2_clnt.c
ssl/s2_lib.c
ssl/s3_both.c
ssl/s3_clnt.c
ssl/s3_enc.c
ssl/s3_lib.c
ssl/s3_pkt.c
ssl/s3_srvr.c
ssl/ssl.err
ssl/ssl.h
ssl/ssl3.h
ssl/ssl_algs.c
ssl/ssl_cert.c
ssl/ssl_ciph.c
ssl/ssl_comp.c [new file with mode: 0644]
ssl/ssl_err.c
ssl/ssl_lib.c
ssl/ssl_locl.h
ssl/ssl_rsa.c
ssl/ssl_sess.c
ssl/ssltest.c
ssl/t1_enc.c
ssl/t1_lib.c
test/Makefile.ssl
test/certCA.srl
test/f [new file with mode: 0644]
test/testkey.pem
test/testreq.pem
times/091/486-50.nt [new file with mode: 0644]
times/091/586-100.lnx [new file with mode: 0644]
times/091/68000.bsd [new file with mode: 0644]
times/091/686-200.lnx [new file with mode: 0644]
times/091/alpha064.osf [new file with mode: 0644]
times/091/alpha164.lnx [new file with mode: 0644]
times/091/alpha164.osf [new file with mode: 0644]
times/091/mips-rel.pl [new file with mode: 0644]
times/091/r10000.irx [new file with mode: 0644]
times/091/r3000.ult [new file with mode: 0644]
times/091/r4400.irx [new file with mode: 0644]
tools/c_rehash
util/ck_errf.pl
util/f.mak [new file with mode: 0644]
util/libeay.num
util/mk1mf.pl
util/mkdef.pl
util/pl/BC-16.pl
util/pl/BC-32.pl
util/pl/VC-16.pl
util/pl/VC-32.pl
util/pl/f [new file with mode: 0644]
util/pl/linux.pl
util/pl/ultrix.pl [new file with mode: 0644]
util/pl/unix.pl
util/ssleay.num
util/up_ver.pl
util/x86asm.sh

index 4f66d64e25c20d7ea6535450d79611e8702e2f3b..b1c47828a65e3e31a8b705085c1db999d14a3413 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -36,7 +36,6 @@
 # MD5_ASM      use some extra md5 assember,
 # SHA1_ASM     use some extra sha1 assember, must define L_ENDIAN for x86
 # RMD160_ASM   use some extra ripemd160 assember,
-# BN_ASM       use some extra bn assember,
 
 $x86_gcc_des="DES_PTR DES_RISC1 DES_UNROLL";
 
@@ -55,10 +54,10 @@ $tlib="-lnsl -lsocket";
 $bits1="THIRTY_TWO_BIT ";
 $bits2="SIXTY_FOUR_BIT ";
 
-$x86_sol_asm="asm/bn86-sol.o:asm/dx86-sol.o asm/yx86-sol.o:asm/bx86-sol.o:asm/mx86-sol.o:asm/sx86-sol.o:asm/cx86-sol.o:asm/rx86-sol.o:asm/rm86-sol.o:asm/r586-sol.o";
-$x86_elf_asm="asm/bn86-elf.o:asm/dx86-elf.o asm/yx86-elf.o:asm/bx86-elf.o:asm/mx86-elf.o:asm/sx86-elf.o:asm/cx86-elf.o:asm/rx86-elf.o:asm/rm86-elf.o:asm/r586-elf.o";
-$x86_out_asm="asm/bn86-out.o:asm/dx86-out.o asm/yx86-out.o:asm/bx86-out.o:asm/mx86-out.o:asm/sx86-out.o:asm/cx86-out.o:asm/rx86-out.o:asm/rm86-out.o:asm/r586-out.o";
-$x86_bsdi_asm="asm/bn86bsdi.o:asm/dx86bsdi.o asm/yx86bsdi.o:asm/bx86bsdi.o:asm/mx86bsdi.o:asm/sx86bsdi.o:asm/cx86bsdi.o:asm/rx86bsdi.o:asm/rm86bsdi.o:asm/r586bsdi.o";
+$x86_sol_asm="asm/bn86-sol.o asm/co86-sol.o:asm/dx86-sol.o asm/yx86-sol.o:asm/bx86-sol.o:asm/mx86-sol.o:asm/sx86-sol.o:asm/cx86-sol.o:asm/rx86-sol.o:asm/rm86-sol.o:asm/r586-sol.o";
+$x86_elf_asm="asm/bn86-elf.o asm/co86-elf.o:asm/dx86-elf.o asm/yx86-elf.o:asm/bx86-elf.o:asm/mx86-elf.o:asm/sx86-elf.o:asm/cx86-elf.o:asm/rx86-elf.o:asm/rm86-elf.o:asm/r586-elf.o";
+$x86_out_asm="asm/bn86-out.o asm/co86-out.o:asm/dx86-out.o asm/yx86-out.o:asm/bx86-out.o:asm/mx86-out.o:asm/sx86-out.o:asm/cx86-out.o:asm/rx86-out.o:asm/rm86-out.o:asm/r586-out.o";
+$x86_bsdi_asm="asm/bn86bsdi.o asm/co86bsdi.o:asm/dx86bsdi.o asm/yx86bsdi.o:asm/bx86bsdi.o:asm/mx86bsdi.o:asm/sx86bsdi.o:asm/cx86bsdi.o:asm/rx86bsdi.o:asm/rm86bsdi.o:asm/r586bsdi.o";
 
 # -DB_ENDIAN slows things down on a sparc for md5, but helps sha1.
 # So the md5_locl.h file has an undef B_ENDIAN if sun is defined
@@ -73,7 +72,7 @@ $x86_bsdi_asm="asm/bn86bsdi.o:asm/dx86bsdi.o asm/yx86bsdi.o:asm/bx86bsdi.o:asm/m
 
 # A few of my development configs
 "purify",      "purify gcc:-g -DPURIFY -Wall:-lsocket -lnsl::::",
-"debug",       "gcc:-DREF_CHECK -DCRYPTO_MDEBUG -ggdb -g2 -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations -Werror:::::",
+"debug",       "gcc:-DBN_DEBUG -DREF_CHECK -DCRYPTO_MDEBUG -ggdb -g2 -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations -Werror:-lefence::::",
 "dist",                "cc:-O -DNOPROTO::::",
 
 # Basic configs that should work on any box
@@ -82,7 +81,7 @@ $x86_bsdi_asm="asm/bn86bsdi.o:asm/dx86bsdi.o asm/yx86bsdi.o:asm/bx86bsdi.o:asm/m
 
 
 # My solaris setups
-"solaris-x86-gcc","gcc:-O3 -fomit-frame-pointer -m486 -Wall -DL_ENDIAN -DBN_ASM:-lsocket -lnsl:BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_sol_asm:",
+"solaris-x86-gcc","gcc:-O3 -fomit-frame-pointer -m486 -Wall -DL_ENDIAN:-lsocket -lnsl:BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_sol_asm",
 "solaris-sparc-gcc","gcc:-O3 -fomit-frame-pointer -mv8 -Wall -DB_ENDIAN:-lsocket -lnsl:BN_LLONG RC4_CHAR DES_UNROLL BF_PTR:::",
 # DO NOT use /xO[34] on sparc with SC3.0. 
 # It is broken, and will not pass the tests
@@ -103,10 +102,16 @@ $x86_bsdi_asm="asm/bn86bsdi.o:asm/dx86bsdi.o asm/yx86bsdi.o:asm/bx86bsdi.o:asm/m
 # SGI configurations.  If the box is rather old (r3000 cpu), you will
 # probably have to remove the '-mips2' flag.  I've only been using
 # IRIX 5.[23].
-#"irix-gcc","gcc:-O2 -mips2::BN_LLONG RC4_INDEX RC4_CHAR:::",
-"irix-gcc","gcc:-O2 -DTERMIOS -DB_ENDIAN::BN_LLONG MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC2 DES_PTR BF_PTR:::",
-"irix-cc", "cc:-O2 -DTERMIOS -DB_ENDIAN::DES_PTR DES_RISC2 DES_UNROLL BF_PTR:asm/r3000.o::",
+# I've recently done 32 and 64 bit mips assember, it make this RSA
+# 3 times faster, use if at all possible.
+#"irix-gcc","gcc:-O2 -mips2::SIXTY_FOUR_BIT BN_LLONG RC4_INDEX RC4_CHAR:::",
+"irix-gcc","gcc:-O2 -DTERMIOS -DB_ENDIAN::BN_LLONG MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC2 DES_PTR BF_PTR:asm/mips1.o::",
+"irix64-gcc","gcc:-mips3 -O2 -DTERMIOS -DB_ENDIAN::MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC2 DES_PTR BF_PTR SIXTY_FOUR_BIT:asm/mips3.o::",
+"irix-cc", "cc:-O2 -use_readonly_const -DTERMIOS -DB_ENDIAN::BN_LLONG DES_PTR DES_RISC2 DES_UNROLL BF_PTR:asm/mips1.o::",
+"irix64-cc", "cc:-O2 -use_readonly_const -DTERMIOS -DB_ENDIAN::DES_PTR DES_RISC2 DES_UNROLL BF_PTR SIXTY_FOUR_BIT:asm/mips3.o::",
 "debug-irix-cc", "cc:-w2 -g -DCRYPTO_MDEBUG -DTERMIOS -DB_ENDIAN:::asm/r3000.o::",
+# This is the n64 mode build.
+"irix-n64-cc", "cc:-64 -O2 -use_readonly_const -DTERMIOS::DES_RISC2 DES_UNROLL SIXTY_FOUR_BIT:asm/mips3_64.o::",
 
 # HPUX config.  I've been building on HPUX 9, so the options may be
 # different on version 10.  The pa-risc2.o assember file is 2 times
@@ -118,23 +123,24 @@ $x86_bsdi_asm="asm/bn86bsdi.o:asm/dx86bsdi.o asm/yx86bsdi.o:asm/bx86bsdi.o:asm/m
 "hpux-kr-cc",  "cc:-DB_ENDIAN -DNOCONST -DNOPROTO -D_HPUX_SOURCE::DES_PTR DES_UNROLL:asm/pa-risc2.o::",
 "hpux-gcc",    "gcc:-DB_ENDIAN -O3::BN_LLONG DES_PTR DES_UNROLL DES_RISC1:::",
 
-# Dec Alpha, OSF/1 - the alpha400-cc is the flags for a 21164A with
+# Dec Alpha, OSF/1 - the alpha164-cc is the flags for a 21164A with
 # the new compiler
-"alpha-gcc","gcc:-O3::SIXTY_FOUR_BIT_LONGS DES_INT DES_PTR DES_RISC2:asm/alpha.o::",
-"alpha-cc", "cc:-O2::SIXTY_FOUR_BIT_LONGS DES_INT DES_PTR DES_RISC2:asm/alpha.o::",
-"alpha400-cc", "cc:-arch host -tune host -fast -std -O4 -inline speed::SIXTY_FOUR_BIT_LONG:asm/alpha.o::",
+# For gcc, the following gave a %50 speedup on a 164 over the 'DES_INT' version
+"alpha-gcc","gcc:-O3::SIXTY_FOUR_BIT_LONG DES_UNROLL DES_RISC1:asm/alpha.o::",
+"alpha-cc", "cc:-tune host -O4 -readonly_strings::SIXTY_FOUR_BIT_LONG:asm/alpha.o::",
+"alpha164-cc", "cc:-tune host -fast -readonly_strings::SIXTY_FOUR_BIT_LONG:asm/alpha.o::",
 
 # The intel boxes :-), It would be worth seeing if bsdi-gcc can use the
 # bn86-elf.o file file since it is hand tweaked assembler.
-"linux-elf",   "gcc:-DL_ENDIAN -DTERMIO -DBN_ASM -O3 -fomit-frame-pointer -m486 -Wall -Wuninitialized::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
-"debug-linux-elf","gcc:-DREF_CHECK -DBN_ASM -DCRYPTO_MDEBUG -DL_ENDIAN -DTERMIO -g -m486 -Wall:-lefence:BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
-"linux-aout",  "gcc:-DL_ENDIAN -DTERMIO -DBN_ASM -O3 -fomit-frame-pointer -m486 -Wall::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_out_asm",
+"linux-elf",   "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall -Wuninitialized::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
+"debug-linux-elf","gcc:-DREF_CHECK -DCRYPTO_MDEBUG -DL_ENDIAN -DTERMIO -g -m486 -Wall:-lefence:BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
+"linux-aout",  "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_out_asm",
 "NetBSD-sparc",        "gcc:-DTERMIOS -O3 -fomit-frame-pointer -mv8 -Wall -DB_ENDIAN::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL:::",
-"NetBSD-m86",  "gcc:-DTERMIOS -O3 -fomit-frame-pointer -Wall -DB_ENDIAN::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL:::",
-"NetBSD-x86",  "gcc:-DTERMIOS -DBN_ASM -D_ANSI_SOURCE -O3 -fomit-frame-pointer -m486 -Wall::BN_LLONG $x86_gcc_des $x86_gcc_opts:",
-"FreeBSD",   "gcc:-DTERMIOS -DBN_ASM -DL_ENDIAN -D_ANSI_SOURCE -fomit-frame-pointer -O3 -m486 -Wall::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_out_asm",
-#"bsdi-gcc",     "gcc:-O3 -ffast-math -DBN_ASM -DL_ENDIAN -DPERL5 -m486::RSA_LLONG $x86_gc_des $x86_gcc_opts:$x86_bsdi_asm",
-"nextstep",    "cc:-O3 -Wall -DBN_ASM::BN_LLONG $x86_gcc_des $x86_gcc_opts:::",
+"NetBSD-m68",  "gcc:-DTERMIOS -O3 -fomit-frame-pointer -Wall -DB_ENDIAN::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL:::",
+"NetBSD-x86",  "gcc:-DTERMIOS -D_ANSI_SOURCE -O3 -fomit-frame-pointer -m486 -Wall::BN_LLONG $x86_gcc_des $x86_gcc_opts:",
+"FreeBSD",   "gcc:-DTERMIOS -DL_ENDIAN -D_ANSI_SOURCE -fomit-frame-pointer -O3 -m486 -Wall::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_out_asm",
+#"bsdi-gcc",     "gcc:-O3 -ffast-math -DL_ENDIAN -DPERL5 -m486::RSA_LLONG $x86_gc_des $x86_gcc_opts:$x86_bsdi_asm",
+"nextstep",    "cc:-O3 -Wall::BN_LLONG $x86_gcc_des $x86_gcc_opts:::",
 # NCR MP-RAS UNIX ver 02.03.01
 "ncr-scde","cc:-O6 -Xa -Hoff=BEHAVED -686 -Hwide -Hiw:-lsocket -lnsl:$x86_gcc_des $x86_gcc_opts:::",
 
@@ -162,10 +168,11 @@ $x86_bsdi_asm="asm/bn86bsdi.o:asm/dx86bsdi.o asm/yx86bsdi.o:asm/bx86bsdi.o:asm/m
 # DGUX, 88100.
 "dgux-R3-gcc", "gcc:-O3 -fomit-frame-pointer::RC4_INDEX DES_UNROLL:::",
 "dgux-R4-gcc", "gcc:-O3 -fomit-frame-pointer:-lnsl -lsocket:RC4_INDEX:RC4_INDEX DES_UNROLL:::",
-"dgux-R4-x86-gcc",     "gcc:-O3 -DBN_ASM -fomit-frame-pointer -DL_ENDIAN:-lnsl -lsocket:BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
+"dgux-R4-x86-gcc",     "gcc:-O3 -fomit-frame-pointer -DL_ENDIAN:-lnsl -lsocket:BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
 
-# SCO 5
-"sco5-cc",  "cc:-O:-lsocket:$x86_gcc_des $x86_gcc_opts:::", # des options?
+# SCO 5 - Ben Laurie <ben@algroup.co.uk> says the -O breaks the
+# SCO cc.
+"sco5-cc",  "cc::-lsocket:$x86_gcc_des $x86_gcc_opts:::", # des options?
 
 # Sinix RM400
 "SINIX-N","/usr/ucb/cc:-O2 -misaligned:-lucb:RC4_INDEX RC4_CHAR:::",
@@ -183,8 +190,19 @@ $x86_bsdi_asm="asm/bn86bsdi.o:asm/dx86bsdi.o asm/yx86bsdi.o:asm/bx86bsdi.o:asm/m
 # Borland C++ 4.5
 "BC-32","bcc32:::DES_PTR RC4_INDEX:::",
 "BC-16","bcc:::BN_LLONG DES_PTR RC4_INDEX SIXTEEN_BIT:::",
+
+# Our old Ultrix box :-). -O2 breaks some of the bignum stuff (now fixed,
+# it is a compiler bug, look in bug/ultrixcc.c for example code.
+"ultrix","cc:-O2 -DNOPROTO -DNOCONST -DL_ENDIAN:::asm/mips1.o:::",
+
+# Some OpenBSD from Bob Beck <beck@obtuse.com>
+"OpenBSD-alpha","gcc:-DTERMIOS -O3 -fomit-frame-pointer:SIXTY_FOUR_BIT_LONG DES_INT DES_PTR DES_RISC2:asm/alpha.o::",
+"OpenBSD-x86",  "gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -m486::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_out_asm",
+"OpenBSD",      "gcc:-DTERMIOS -O3 -fomit-frame-pointer::BN_LLONG RC2_CHAR RC4_INDEX DES_UNROLL:::",
+"OpenBSD-mips","gcc:-O2 -DL_ENDIAN:BN_LLONG MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC2 DES_PTR BF_PTR::::",
 );
 
+$no_asm=0;
 $postfix="org";
 $Makefile="Makefile.ssl";
 $des_locl="crypto/des/des_locl.h";
@@ -196,7 +214,7 @@ $rc4_locl="crypto/rc4/rc4_locl.h";
 $idea  ="crypto/idea/idea.h";
 $rc2   ="crypto/rc2/rc2.h";
 $bf    ="crypto/bf/bf_locl.h";
-$bn_mulw="bn_mulw.o";
+$bn_asm        ="bn_asm.o";
 $des_enc="des_enc.o fcrypt_b.o";
 $bf_enc        ="bf_enc.o";
 $cast_enc="c_enc.o";
@@ -215,7 +233,9 @@ if ($#ARGV < 0)
 $flags="";
 foreach (@ARGV)
        {
-       if ($_ =~ /^-/)
+       if ($_ =~ /^no-asm$/)
+               { $no_asm=1; }
+       elsif ($_ =~ /^-/)
                {
                if ($_ =~ /^-[lL](.*)$/)
                        {
@@ -254,7 +274,16 @@ if (!defined($table{$target}))
 $cflags="$flags$cflags" if ($flags ne "");
 $lflags="$libs$lflags"if ($libs ne "");
 
-$bn_obj=$bn_mulw       unless ($bn_obj =~ /\.o$/);
+if ($no_asm)
+       {
+       $bn_obj=$des_obj=$bf_obj=$cast_obj=$rc4_obj=$rc5_obj="";
+       $sha1_obj=$md5_obj=$rmd160_obj="";
+       }
+
+($bn1)=split(/\s+/,$bn_obj);
+$bn1=$bn_asm unless ($bn1 =~ /\.o$/);
+$bn_obj="$bn1";
+
 $des_obj=$des_enc      unless ($des_obj =~ /\.o$/);
 $bf_obj=$bf_enc                unless ($bf_obj =~ /\.o$/);
 $cast_obj=$cast_enc    unless ($cast_obj =~ /\.o$/);
@@ -282,6 +311,7 @@ open(OUT,">".$n) || die "unable to read $n:$!\n";
 while (<IN>)
        {
        chop;
+       s/^PLATFORM=.*$/PLATFORM=$target/;
        s/^CC=.*$/CC= $cc/;
        s/^CFLAG=.*$/CFLAG= $cflags/;
        s/^EX_LIBS=.*$/EX_LIBS= $lflags/;
diff --git a/HISTORY.090 b/HISTORY.090
new file mode 100644 (file)
index 0000000..b7bbb5e
--- /dev/null
@@ -0,0 +1,7 @@
+-      A minor bug in ssl/s3_clnt.c where there would always be 4 0 bytes
+       sent in the client random, thanks to 
+       Edward Bishop <ebishop@spyglass.com>
+-      Changed some BIGNUM api stuff.
+
+-      I Deleted the HISTORY.090 I was working on and when I found out, it was
+       permanently gone :-(
diff --git a/INSTALL b/INSTALL
index d394bf8a7b9eac0cc96d14069e34ba6673443211..2cddfb93e6922c2567a92a09f118367bdcd2543e 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -126,3 +126,8 @@ The examples for solaris and windows NT/95 are in the mt directory.
 have fun
 
 eric 25-Jun-1997
+
+IRIX 5.x will build as a 32 bit system with mips1 assember.
+IRIX 6.x will build as a 64 bit system with mips3 assember.  It conforms
+to n32 standards. In theory you can compile the 64 bit assember under
+IRIX 5.x but you will have to have the correct system software installed.
diff --git a/MINFO b/MINFO
index 0509f336489e6b62da5247dc7d2596553038e411..4680e23fbe7f989c7d1ea9ed999d7f06f77a19ea 100644 (file)
--- a/MINFO
+++ b/MINFO
@@ -2,13 +2,13 @@ RELATIVE_DIRECTORY=.
 AR=ar r
 BASENAME=SSLeay
 BF_ENC=bf_enc.o
-BN_MULW=bn_mulw.o
+BN_ASM=bn_asm.o
 CAST_ENC=c_enc.o
-CC=cc
-CFLAG=-O -DNOPROTO
+CC=cl
+CFLAG=
 DES_ENC=des_enc.o fcrypt_b.o
 DIRS=crypto ssl rsaref apps test tools
-EDIRS=times doc bugs util include certs ms shlib mt demos perl dep
+EDIRS=times doc bugs util include certs ms shlib mt demos perl sf dep
 EXHEADER=e_os.h
 EX_LIBS=
 GENERAL=Makefile
@@ -20,49 +20,50 @@ MAKEFILE=Makefile.ssl
 MAN1=1
 MAN3=3
 MD5_ASM_OBJ=
-MISC=COPYRIGHT Configure HISTORY.066 INSTALL Makefile.ssl Makefile README TODO HISTORY README.066 README.080 README.090 VERSION PROBLEMS MINFO makefile.one e_os.h MICROSOFT makevms.com config PATENTS
-NAME=SSLeay-0.9.0
+MISC=COPYRIGHT Configure HISTORY.090 HISTORY.066 INSTALL Makefile.ssl Makefile README TODO HISTORY README.066 README.080 README.090 VERSION PROBLEMS MINFO makefile.one e_os.h MICROSOFT makevms.com config PATENTS
+NAME=SSLeay-0.9.1b
 ONEDIRS=out tmp
 PEX_LIBS=-L. -L.. -L../.. -L../../..
+PLATFORM=VC-WIN32
 RC4_ENC=rc4_enc.o
 RC5_ENC=rc5_enc.o
 RMD160_ASM_OBJ=
-SDIRS=md2 md5 sha mdc2 hmac ripemd des rc2 rc4 rc5 idea bf cast bn rsa dsa dh buffer bio stack lhash rand err objects evp pem asn1 x509 conf txt_db pkcs7
+SDIRS=md2 md5 sha mdc2 hmac ripemd des rc2 rc4 rc5 idea bf cast bn rsa dsa dh buffer bio stack lhash rand err objects evp pem asn1 x509 conf txt_db pkcs7 proxy comp
 SHA1_ASM_OBJ=
 SHELL=/bin/sh
-TARFILE=SSLeay-0.9.0.tar
+TARFILE=SSLeay-0.9.1b.tar
 TOP=.
-VERSION=0.9.0
+VERSION=0.9.1b
 WDIRS=windows
-WTARFILE=SSLeay-0.9.0-win.tar
+WTARFILE=SSLeay-0.9.1b-win.tar
 RELATIVE_DIRECTORY=
 RELATIVE_DIRECTORY=crypto
-ALL=Makefile README cryptlib.c mem.c cversion.c ex_data.c cpt_err.c cryptlib.h date.h crypto.h cryptall.h
+ALL=Makefile README cryptlib.c mem.c cversion.c ex_data.c tmdiff.c cpt_err.c cryptlib.h date.h crypto.h cryptall.h tmdiff.h
 AR=ar r
 CC=cc
 CFLAG=-g
-CFLAGS=-I. -I../include -g -DCFLAGS=" \"cc -g\" "
+CFLAGS=-I. -I../include -g -DCFLAGS=" \"cc -g\" " -DPLATFORM=" \"\" "
 DIR=crypto
 ERR=crypto
 ERRC=cpt_err
-EXHEADER=crypto.h cryptall.h
+EXHEADER=crypto.h cryptall.h tmdiff.h
 EX_LIBS=
 GENERAL=Makefile README
-HEADER=cryptlib.h date.h crypto.h cryptall.h
+HEADER=cryptlib.h date.h crypto.h cryptall.h tmdiff.h
 INCLUDE=-I. -I../include
 INCLUDES=-I.. -I../../include
 INSTALLTOP=/usr/local/ssl
 LIB=../libcrypto.a
-LIBOBJ=cryptlib.o mem.o cversion.o ex_data.o cpt_err.o
+LIBOBJ=cryptlib.o mem.o cversion.o ex_data.o tmdiff.o cpt_err.o
 LIBS=
-LIBSRC=cryptlib.c mem.c cversion.c ex_data.c cpt_err.c
+LIBSRC=cryptlib.c mem.c cversion.c ex_data.c tmdiff.c cpt_err.c
 MAKE=make -f Makefile.ssl
 MAKEDEPEND=makedepend -f Makefile.ssl
 MAKEFILE=Makefile.ssl
 PEX_LIBS=
 RM=/bin/rm -f
-SDIRS=md2 md5 sha mdc2 hmac ripemd des rc2 rc4 rc5 idea bf cast bn rsa dsa dh buffer bio stack lhash rand err objects evp pem x509 asn1 conf txt_db pkcs7
-SRC=cryptlib.c mem.c cversion.c ex_data.c cpt_err.c
+SDIRS=md2 md5 sha mdc2 hmac ripemd des rc2 rc4 rc5 idea bf cast bn rsa dsa dh buffer bio stack lhash rand err objects evp pem x509 asn1 conf txt_db pkcs7 proxy comp
+SRC=cryptlib.c mem.c cversion.c ex_data.c tmdiff.c cpt_err.c
 TOP=..
 RELATIVE_DIRECTORY=
 RELATIVE_DIRECTORY=crypto/md2
@@ -379,10 +380,10 @@ TEST=casttest.c
 TOP=../..
 RELATIVE_DIRECTORY=
 RELATIVE_DIRECTORY=crypto/bn
-ALL=Makefile bn_add.c bn_div.c bn_exp.c bn_lib.c bn_mod.c bn_mul.c bn_print.c bn_rand.c bn_shift.c bn_sub.c bn_word.c bn_blind.c bn_gcd.c bn_prime.c bn_err.c bn_sqr.c bn_mulw.c bn_recp.c bn_mont.c bn_mpi.c bn_lcl.h bn_prime.h bn.h
+ALL=Makefile bn_add.c bn_div.c bn_exp.c bn_lib.c bn_mul.c bn_print.c bn_rand.c bn_shift.c bn_word.c bn_blind.c bn_gcd.c bn_prime.c bn_err.c bn_sqr.c bn_asm.c bn_recp.c bn_mont.c bn_mpi.c bn_exp2.c bn_lcl.h bn_prime.h bn.h
 APPS=
 AR=ar r
-BN_MULW=bn_mulw.o
+BN_ASM=bn_asm.o
 CC=cc
 CFLAG=-g
 CFLAGS=-I.. -I../../include -g
@@ -395,12 +396,12 @@ HEADER=bn_lcl.h bn_prime.h bn.h
 INCLUDES=-I.. -I../../include
 INSTALLTOP=/usr/local/ssl
 LIB=../../libcrypto.a
-LIBOBJ=bn_add.o bn_div.o bn_exp.o bn_lib.o bn_mod.o bn_mul.o bn_print.o bn_rand.o bn_shift.o bn_sub.o bn_word.o bn_blind.o bn_gcd.o bn_prime.o bn_err.o bn_sqr.o bn_mulw.o bn_recp.o bn_mont.o bn_mpi.o
-LIBSRC=bn_add.c bn_div.c bn_exp.c bn_lib.c bn_mod.c bn_mul.c bn_print.c bn_rand.c bn_shift.c bn_sub.c bn_word.c bn_blind.c bn_gcd.c bn_prime.c bn_err.c bn_sqr.c bn_mulw.c bn_recp.c bn_mont.c bn_mpi.c
+LIBOBJ=bn_add.o bn_div.o bn_exp.o bn_lib.o bn_mul.o bn_print.o bn_rand.o bn_shift.o bn_word.o bn_blind.o bn_gcd.o bn_prime.o bn_err.o bn_sqr.o bn_asm.o bn_recp.o bn_mont.o bn_mpi.o bn_exp2.o
+LIBSRC=bn_add.c bn_div.c bn_exp.c bn_lib.c bn_mul.c bn_print.c bn_rand.c bn_shift.c bn_word.c bn_blind.c bn_gcd.c bn_prime.c bn_err.c bn_sqr.c bn_asm.c bn_recp.c bn_mont.c bn_mpi.c bn_exp2.c
 MAKE=make -f Makefile.ssl
 MAKEDEPEND=makedepend -f Makefile.ssl
 MAKEFILE=Makefile.ssl
-SRC=bn_add.c bn_div.c bn_exp.c bn_lib.c bn_mod.c bn_mul.c bn_print.c bn_rand.c bn_shift.c bn_sub.c bn_word.c bn_blind.c bn_gcd.c bn_prime.c bn_err.c bn_sqr.c bn_mulw.c bn_recp.c bn_mont.c bn_mpi.c
+SRC=bn_add.c bn_div.c bn_exp.c bn_lib.c bn_mul.c bn_print.c bn_rand.c bn_shift.c bn_word.c bn_blind.c bn_gcd.c bn_prime.c bn_err.c bn_sqr.c bn_asm.c bn_recp.c bn_mont.c bn_mpi.c bn_exp2.c
 TEST=bntest.c exptest.c
 TOP=../..
 RELATIVE_DIRECTORY=
@@ -505,7 +506,7 @@ TEST=
 TOP=../..
 RELATIVE_DIRECTORY=
 RELATIVE_DIRECTORY=crypto/bio
-ALL=Makefile bio_lib.c bio_cb.c bio_err.c bss_mem.c bss_null.c bss_fd.c bss_file.c bss_sock.c bss_conn.c bf_null.c bf_buff.c b_print.c b_dump.c b_sock.c bss_acpt.c bf_nbio.c bio.h bss_file.c
+ALL=Makefile bio_lib.c bio_cb.c bio_err.c bss_mem.c bss_null.c bss_fd.c bss_file.c bss_sock.c bss_conn.c bf_null.c bf_buff.c b_print.c b_dump.c b_sock.c bss_acpt.c bf_nbio.c bss_cs4a.c bio.h bss_file.c
 APPS=
 AR=ar r
 CC=cc
@@ -520,12 +521,12 @@ HEADER=bio.h bss_file.c
 INCLUDES=-I.. -I../../include
 INSTALLTOP=/usr/local/ssl
 LIB=../../libcrypto.a
-LIBOBJ=bio_lib.o bio_cb.o bio_err.o bss_mem.o bss_null.o bss_fd.o bss_file.o bss_sock.o bss_conn.o bf_null.o bf_buff.o b_print.o b_dump.o b_sock.o bss_acpt.o bf_nbio.o
-LIBSRC=bio_lib.c bio_cb.c bio_err.c bss_mem.c bss_null.c bss_fd.c bss_file.c bss_sock.c bss_conn.c bf_null.c bf_buff.c b_print.c b_dump.c b_sock.c bss_acpt.c bf_nbio.c
+LIBOBJ=bio_lib.o bio_cb.o bio_err.o bss_mem.o bss_null.o bss_fd.o bss_file.o bss_sock.o bss_conn.o bf_null.o bf_buff.o b_print.o b_dump.o b_sock.o bss_acpt.o bf_nbio.o bss_cs4a.o
+LIBSRC=bio_lib.c bio_cb.c bio_err.c bss_mem.c bss_null.c bss_fd.c bss_file.c bss_sock.c bss_conn.c bf_null.c bf_buff.c b_print.c b_dump.c b_sock.c bss_acpt.c bf_nbio.c bss_cs4a.c
 MAKE=make -f Makefile.ssl
 MAKEDEPEND=makedepend -f Makefile.ssl
 MAKEFILE=Makefile.ssl
-SRC=bio_lib.c bio_cb.c bio_err.c bss_mem.c bss_null.c bss_fd.c bss_file.c bss_sock.c bss_conn.c bf_null.c bf_buff.c b_print.c b_dump.c b_sock.c bss_acpt.c bf_nbio.c
+SRC=bio_lib.c bio_cb.c bio_err.c bss_mem.c bss_null.c bss_fd.c bss_file.c bss_sock.c bss_conn.c bf_null.c bf_buff.c b_print.c b_dump.c b_sock.c bss_acpt.c bf_nbio.c bss_cs4a.c
 TEST=
 TOP=../..
 RELATIVE_DIRECTORY=
@@ -576,7 +577,7 @@ TEST=
 TOP=../..
 RELATIVE_DIRECTORY=
 RELATIVE_DIRECTORY=crypto/rand
-ALL=Makefile md_rand.c randfile.c rand.h
+ALL=Makefile md_rand.c randfile.c rand_lib.c rand.h
 APPS=
 AR=ar r
 CC=cc
@@ -589,12 +590,12 @@ HEADER=rand.h
 INCLUDES=
 INSTALLTOP=/usr/local/ssl
 LIB=../../libcrypto.a
-LIBOBJ=md_rand.o randfile.o
-LIBSRC=md_rand.c randfile.c
+LIBOBJ=md_rand.o randfile.o rand_lib.o
+LIBSRC=md_rand.c randfile.c rand_lib.c
 MAKE=make -f Makefile.ssl
 MAKEDEPEND=makedepend -f Makefile.ssl
 MAKEFILE=Makefile.ssl
-SRC=md_rand.c randfile.c
+SRC=md_rand.c randfile.c rand_lib.c
 TEST=randtest.c
 TOP=../..
 RELATIVE_DIRECTORY=
@@ -622,7 +623,7 @@ TEST=
 TOP=../..
 RELATIVE_DIRECTORY=
 RELATIVE_DIRECTORY=crypto/objects
-ALL=Makefile README obj_dat.c obj_lib.c obj_err.c objects.h obj_dat.h
+ALL=Makefile README o_names.c obj_dat.c obj_lib.c obj_err.c objects.h obj_dat.h
 APPS=
 AR=ar r
 CC=cc
@@ -637,12 +638,12 @@ HEADER=objects.h obj_dat.h
 INCLUDES=-I.. -I../../include
 INSTALLTOP=/usr/local/ssl
 LIB=../../libcrypto.a
-LIBOBJ=obj_dat.o obj_lib.o obj_err.o
-LIBSRC=obj_dat.c obj_lib.c obj_err.c
+LIBOBJ=o_names.o obj_dat.o obj_lib.o obj_err.o
+LIBSRC=o_names.c obj_dat.c obj_lib.c obj_err.c
 MAKE=make -f Makefile.ssl
 MAKEDEPEND=makedepend -f Makefile.ssl
 MAKEFILE=Makefile.ssl
-SRC=obj_dat.c obj_lib.c obj_err.c
+SRC=o_names.c obj_dat.c obj_lib.c obj_err.c
 TEST=
 TOP=../..
 RELATIVE_DIRECTORY=
@@ -698,7 +699,7 @@ TEST=
 TOP=../..
 RELATIVE_DIRECTORY=
 RELATIVE_DIRECTORY=crypto/asn1
-ALL=Makefile README a_object.c a_bitstr.c a_utctm.c a_int.c a_octet.c a_print.c a_type.c a_set.c a_dup.c a_d2i_fp.c a_i2d_fp.c a_sign.c a_digest.c a_verify.c x_algor.c x_val.c x_pubkey.c x_sig.c x_req.c x_attrib.c x_name.c x_cinf.c x_x509.c x_crl.c x_info.c x_spki.c d2i_r_pr.c i2d_r_pr.c d2i_r_pu.c i2d_r_pu.c d2i_s_pr.c i2d_s_pr.c d2i_s_pu.c i2d_s_pu.c d2i_pu.c d2i_pr.c i2d_pu.c i2d_pr.c t_req.c t_x509.c t_pkey.c p7_i_s.c p7_signi.c p7_signd.c p7_recip.c p7_enc_c.c p7_evp.c p7_dgst.c p7_s_e.c p7_enc.c p7_lib.c f_int.c f_string.c i2d_dhp.c i2d_dsap.c d2i_dhp.c d2i_dsap.c n_pkey.c a_hdr.c x_pkey.c a_bool.c x_exten.c asn1_par.c asn1_lib.c asn1_err.c a_meth.c a_bytes.c evp_asn1.c asn1.h asn1_mac.h
+ALL=Makefile README a_object.c a_bitstr.c a_utctm.c a_int.c a_octet.c a_print.c a_type.c a_set.c a_dup.c a_d2i_fp.c a_i2d_fp.c a_bmp.c a_sign.c a_digest.c a_verify.c x_algor.c x_val.c x_pubkey.c x_sig.c x_req.c x_attrib.c x_name.c x_cinf.c x_x509.c x_crl.c x_info.c x_spki.c d2i_r_pr.c i2d_r_pr.c d2i_r_pu.c i2d_r_pu.c d2i_s_pr.c i2d_s_pr.c d2i_s_pu.c i2d_s_pu.c d2i_pu.c d2i_pr.c i2d_pu.c i2d_pr.c t_req.c t_x509.c t_pkey.c p7_i_s.c p7_signi.c p7_signd.c p7_recip.c p7_enc_c.c p7_evp.c p7_dgst.c p7_s_e.c p7_enc.c p7_lib.c f_int.c f_string.c i2d_dhp.c i2d_dsap.c d2i_dhp.c d2i_dsap.c n_pkey.c a_hdr.c x_pkey.c a_bool.c x_exten.c asn1_par.c asn1_lib.c asn1_err.c a_meth.c a_bytes.c evp_asn1.c asn1.h asn1_mac.h
 APPS=
 AR=ar r
 CC=cc
@@ -713,12 +714,12 @@ HEADER=asn1.h asn1_mac.h
 INCLUDES=-I.. -I../../include
 INSTALLTOP=/usr/local/ssl
 LIB=../../libcrypto.a
-LIBOBJ=a_object.o a_bitstr.o a_utctm.o a_int.o a_octet.o a_print.o a_type.o a_set.o a_dup.o a_d2i_fp.o a_i2d_fp.o a_sign.o a_digest.o a_verify.o x_algor.o x_val.o x_pubkey.o x_sig.o x_req.o x_attrib.o x_name.o x_cinf.o x_x509.o x_crl.o x_info.o x_spki.o d2i_r_pr.o i2d_r_pr.o d2i_r_pu.o i2d_r_pu.o d2i_s_pr.o i2d_s_pr.o d2i_s_pu.o i2d_s_pu.o d2i_pu.o d2i_pr.o i2d_pu.o i2d_pr.o t_req.o t_x509.o t_pkey.o p7_i_s.o p7_signi.o p7_signd.o p7_recip.o p7_enc_c.o p7_evp.o p7_dgst.o p7_s_e.o p7_enc.o p7_lib.o f_int.o f_string.o i2d_dhp.o i2d_dsap.o d2i_dhp.o d2i_dsap.o n_pkey.o a_hdr.o x_pkey.o a_bool.o x_exten.o asn1_par.o asn1_lib.o asn1_err.o a_meth.o a_bytes.o evp_asn1.o
-LIBSRC=a_object.c a_bitstr.c a_utctm.c a_int.c a_octet.c a_print.c a_type.c a_set.c a_dup.c a_d2i_fp.c a_i2d_fp.c a_sign.c a_digest.c a_verify.c x_algor.c x_val.c x_pubkey.c x_sig.c x_req.c x_attrib.c x_name.c x_cinf.c x_x509.c x_crl.c x_info.c x_spki.c d2i_r_pr.c i2d_r_pr.c d2i_r_pu.c i2d_r_pu.c d2i_s_pr.c i2d_s_pr.c d2i_s_pu.c i2d_s_pu.c d2i_pu.c d2i_pr.c i2d_pu.c i2d_pr.c t_req.c t_x509.c t_pkey.c p7_i_s.c p7_signi.c p7_signd.c p7_recip.c p7_enc_c.c p7_evp.c p7_dgst.c p7_s_e.c p7_enc.c p7_lib.c f_int.c f_string.c i2d_dhp.c i2d_dsap.c d2i_dhp.c d2i_dsap.c n_pkey.c a_hdr.c x_pkey.c a_bool.c x_exten.c asn1_par.c asn1_lib.c asn1_err.c a_meth.c a_bytes.c evp_asn1.c
+LIBOBJ=a_object.o a_bitstr.o a_utctm.o a_int.o a_octet.o a_print.o a_type.o a_set.o a_dup.o a_d2i_fp.o a_i2d_fp.o a_bmp.o a_sign.o a_digest.o a_verify.o x_algor.o x_val.o x_pubkey.o x_sig.o x_req.o x_attrib.o x_name.o x_cinf.o x_x509.o x_crl.o x_info.o x_spki.o d2i_r_pr.o i2d_r_pr.o d2i_r_pu.o i2d_r_pu.o d2i_s_pr.o i2d_s_pr.o d2i_s_pu.o i2d_s_pu.o d2i_pu.o d2i_pr.o i2d_pu.o i2d_pr.o t_req.o t_x509.o t_pkey.o p7_i_s.o p7_signi.o p7_signd.o p7_recip.o p7_enc_c.o p7_evp.o p7_dgst.o p7_s_e.o p7_enc.o p7_lib.o f_int.o f_string.o i2d_dhp.o i2d_dsap.o d2i_dhp.o d2i_dsap.o n_pkey.o a_hdr.o x_pkey.o a_bool.o x_exten.o asn1_par.o asn1_lib.o asn1_err.o a_meth.o a_bytes.o evp_asn1.o
+LIBSRC=a_object.c a_bitstr.c a_utctm.c a_int.c a_octet.c a_print.c a_type.c a_set.c a_dup.c a_d2i_fp.c a_i2d_fp.c a_bmp.c a_sign.c a_digest.c a_verify.c x_algor.c x_val.c x_pubkey.c x_sig.c x_req.c x_attrib.c x_name.c x_cinf.c x_x509.c x_crl.c x_info.c x_spki.c d2i_r_pr.c i2d_r_pr.c d2i_r_pu.c i2d_r_pu.c d2i_s_pr.c i2d_s_pr.c d2i_s_pu.c i2d_s_pu.c d2i_pu.c d2i_pr.c i2d_pu.c i2d_pr.c t_req.c t_x509.c t_pkey.c p7_i_s.c p7_signi.c p7_signd.c p7_recip.c p7_enc_c.c p7_evp.c p7_dgst.c p7_s_e.c p7_enc.c p7_lib.c f_int.c f_string.c i2d_dhp.c i2d_dsap.c d2i_dhp.c d2i_dsap.c n_pkey.c a_hdr.c x_pkey.c a_bool.c x_exten.c asn1_par.c asn1_lib.c asn1_err.c a_meth.c a_bytes.c evp_asn1.c
 MAKE=make -f Makefile.ssl
 MAKEDEPEND=makedepend -f Makefile.ssl
 MAKEFILE=Makefile.ssl
-SRC=a_object.c a_bitstr.c a_utctm.c a_int.c a_octet.c a_print.c a_type.c a_set.c a_dup.c a_d2i_fp.c a_i2d_fp.c a_sign.c a_digest.c a_verify.c x_algor.c x_val.c x_pubkey.c x_sig.c x_req.c x_attrib.c x_name.c x_cinf.c x_x509.c x_crl.c x_info.c x_spki.c d2i_r_pr.c i2d_r_pr.c d2i_r_pu.c i2d_r_pu.c d2i_s_pr.c i2d_s_pr.c d2i_s_pu.c i2d_s_pu.c d2i_pu.c d2i_pr.c i2d_pu.c i2d_pr.c t_req.c t_x509.c t_pkey.c p7_i_s.c p7_signi.c p7_signd.c p7_recip.c p7_enc_c.c p7_evp.c p7_dgst.c p7_s_e.c p7_enc.c p7_lib.c f_int.c f_string.c i2d_dhp.c i2d_dsap.c d2i_dhp.c d2i_dsap.c n_pkey.c a_hdr.c x_pkey.c a_bool.c x_exten.c asn1_par.c asn1_lib.c asn1_err.c a_meth.c a_bytes.c evp_asn1.c
+SRC=a_object.c a_bitstr.c a_utctm.c a_int.c a_octet.c a_print.c a_type.c a_set.c a_dup.c a_d2i_fp.c a_i2d_fp.c a_bmp.c a_sign.c a_digest.c a_verify.c x_algor.c x_val.c x_pubkey.c x_sig.c x_req.c x_attrib.c x_name.c x_cinf.c x_x509.c x_crl.c x_info.c x_spki.c d2i_r_pr.c i2d_r_pr.c d2i_r_pu.c i2d_r_pu.c d2i_s_pr.c i2d_s_pr.c d2i_s_pu.c i2d_s_pu.c d2i_pu.c d2i_pr.c i2d_pu.c i2d_pr.c t_req.c t_x509.c t_pkey.c p7_i_s.c p7_signi.c p7_signd.c p7_recip.c p7_enc_c.c p7_evp.c p7_dgst.c p7_s_e.c p7_enc.c p7_lib.c f_int.c f_string.c i2d_dhp.c i2d_dsap.c d2i_dhp.c d2i_dsap.c n_pkey.c a_hdr.c x_pkey.c a_bool.c x_exten.c asn1_par.c asn1_lib.c asn1_err.c a_meth.c a_bytes.c evp_asn1.c
 TEST=
 TOP=../..
 RELATIVE_DIRECTORY=
@@ -820,8 +821,58 @@ SRC=pk7_lib.c pkcs7err.c pk7_doit.c
 TEST=
 TOP=../..
 RELATIVE_DIRECTORY=
+RELATIVE_DIRECTORY=crypto/proxy
+ALL=Makefile proxy.c pxy_txt.c bf_proxy.c pxy_conf.c pxy_err.c proxy.h
+APPS=
+AR=ar r
+CC=cc
+CFLAG=-g
+CFLAGS=-I.. -I../../include -g
+DIR=proxy
+ERR=proxy
+ERRC=pxy_err
+EXHEADER=proxy.h
+GENERAL=Makefile
+HEADER=proxy.h
+INCLUDES=-I.. -I../../include
+INSTALLTOP=/usr/local/ssl
+LIB=../../libcrypto.a
+LIBOBJ=proxy.o pxy_txt.o bf_proxy.o pxy_conf.o pxy_err.o
+LIBSRC=proxy.c pxy_txt.c bf_proxy.c pxy_conf.c pxy_err.c
+MAKE=make -f Makefile.ssl
+MAKEDEPEND=makedepend -f Makefile.ssl
+MAKEFILE=Makefile.ssl
+SRC=proxy.c pxy_txt.c bf_proxy.c pxy_conf.c pxy_err.c
+TEST=
+TOP=../..
+RELATIVE_DIRECTORY=
+RELATIVE_DIRECTORY=crypto/comp
+ALL=Makefile comp_lib.c c_rle.c c_zlib.c comp.h
+APPS=
+AR=ar r
+CC=cc
+CFLAG=-g
+CFLAGS=-I.. -I../../include -g
+DIR=comp
+ERR=comp
+ERRC=comp_err
+EXHEADER=comp.h
+GENERAL=Makefile
+HEADER=comp.h
+INCLUDES=-I.. -I../../include
+INSTALLTOP=/usr/local/ssl
+LIB=../../libcrypto.a
+LIBOBJ=comp_lib.o c_rle.o c_zlib.o
+LIBSRC=comp_lib.c c_rle.c c_zlib.c
+MAKE=make -f Makefile.ssl
+MAKEDEPEND=makedepend -f Makefile.ssl
+MAKEFILE=Makefile.ssl
+SRC=comp_lib.c c_rle.c c_zlib.c
+TEST=
+TOP=../..
+RELATIVE_DIRECTORY=
 RELATIVE_DIRECTORY=ssl
-ALL=Makefile README s2_meth.c s2_srvr.c s2_clnt.c s2_lib.c s2_enc.c s2_pkt.c s3_meth.c s3_srvr.c s3_clnt.c s3_lib.c s3_enc.c s3_pkt.c s3_both.c s23_meth.c s23_srvr.c s23_clnt.c s23_lib.c s23_pkt.c t1_meth.c t1_srvr.c t1_clnt.c t1_lib.c t1_enc.c ssl_lib.c ssl_err2.c ssl_cert.c ssl_sess.c ssl_ciph.c ssl_stat.c ssl_rsa.c ssl_asn1.c ssl_txt.c ssl_algs.c bio_ssl.c ssl_err.c ssl.h ssl2.h ssl3.h ssl23.h tls1.h ssl_locl.h
+ALL=Makefile README s2_meth.c s2_srvr.c s2_clnt.c s2_lib.c s2_enc.c s2_pkt.c s3_meth.c s3_srvr.c s3_clnt.c s3_lib.c s3_enc.c s3_pkt.c s3_both.c s23_meth.c s23_srvr.c s23_clnt.c s23_lib.c s23_pkt.c t1_meth.c t1_srvr.c t1_clnt.c t1_lib.c t1_enc.c ssl_lib.c ssl_err2.c ssl_cert.c ssl_sess.c ssl_ciph.c ssl_stat.c ssl_rsa.c ssl_asn1.c ssl_txt.c ssl_algs.c bio_ssl.c pxy_ssl.c ssl_err.c ssl.h ssl2.h ssl3.h ssl23.h tls1.h ssl_locl.h
 APPS=
 AR=ar r
 CC=cc
@@ -836,12 +887,12 @@ HEADER=ssl.h ssl2.h ssl3.h ssl23.h tls1.h ssl_locl.h
 INCLUDES=-I../crypto -I../include
 INSTALLTOP=/usr/local/ssl
 LIB=../libssl.a
-LIBOBJ=s2_meth.o s2_srvr.o s2_clnt.o s2_lib.o s2_enc.o s2_pkt.o s3_meth.o s3_srvr.o s3_clnt.o s3_lib.o s3_enc.o s3_pkt.o s3_both.o s23_meth.o s23_srvr.o s23_clnt.o s23_lib.o s23_pkt.o t1_meth.o t1_srvr.o t1_clnt.o t1_lib.o t1_enc.o ssl_lib.o ssl_err2.o ssl_cert.o ssl_sess.o ssl_ciph.o ssl_stat.o ssl_rsa.o ssl_asn1.o ssl_txt.o ssl_algs.o bio_ssl.o ssl_err.o
-LIBSRC=s2_meth.c s2_srvr.c s2_clnt.c s2_lib.c s2_enc.c s2_pkt.c s3_meth.c s3_srvr.c s3_clnt.c s3_lib.c s3_enc.c s3_pkt.c s3_both.c s23_meth.c s23_srvr.c s23_clnt.c s23_lib.c s23_pkt.c t1_meth.c t1_srvr.c t1_clnt.c t1_lib.c t1_enc.c ssl_lib.c ssl_err2.c ssl_cert.c ssl_sess.c ssl_ciph.c ssl_stat.c ssl_rsa.c ssl_asn1.c ssl_txt.c ssl_algs.c bio_ssl.c ssl_err.c
+LIBOBJ=s2_meth.o s2_srvr.o s2_clnt.o s2_lib.o s2_enc.o s2_pkt.o s3_meth.o s3_srvr.o s3_clnt.o s3_lib.o s3_enc.o s3_pkt.o s3_both.o s23_meth.o s23_srvr.o s23_clnt.o s23_lib.o s23_pkt.o t1_meth.o t1_srvr.o t1_clnt.o t1_lib.o t1_enc.o ssl_lib.o ssl_err2.o ssl_cert.o ssl_sess.o ssl_ciph.o ssl_stat.o ssl_rsa.o ssl_asn1.o ssl_txt.o ssl_algs.o bio_ssl.o pxy_ssl.o ssl_err.o
+LIBSRC=s2_meth.c s2_srvr.c s2_clnt.c s2_lib.c s2_enc.c s2_pkt.c s3_meth.c s3_srvr.c s3_clnt.c s3_lib.c s3_enc.c s3_pkt.c s3_both.c s23_meth.c s23_srvr.c s23_clnt.c s23_lib.c s23_pkt.c t1_meth.c t1_srvr.c t1_clnt.c t1_lib.c t1_enc.c ssl_lib.c ssl_err2.c ssl_cert.c ssl_sess.c ssl_ciph.c ssl_stat.c ssl_rsa.c ssl_asn1.c ssl_txt.c ssl_algs.c bio_ssl.c pxy_ssl.c ssl_err.c
 MAKE=make -f Makefile.ssl
 MAKEDEPEND=makedepend -f Makefile.ssl
 MAKEFILE=Makefile.ssl
-SRC=s2_meth.c s2_srvr.c s2_clnt.c s2_lib.c s2_enc.c s2_pkt.c s3_meth.c s3_srvr.c s3_clnt.c s3_lib.c s3_enc.c s3_pkt.c s3_both.c s23_meth.c s23_srvr.c s23_clnt.c s23_lib.c s23_pkt.c t1_meth.c t1_srvr.c t1_clnt.c t1_lib.c t1_enc.c ssl_lib.c ssl_err2.c ssl_cert.c ssl_sess.c ssl_ciph.c ssl_stat.c ssl_rsa.c ssl_asn1.c ssl_txt.c ssl_algs.c bio_ssl.c ssl_err.c
+SRC=s2_meth.c s2_srvr.c s2_clnt.c s2_lib.c s2_enc.c s2_pkt.c s3_meth.c s3_srvr.c s3_clnt.c s3_lib.c s3_enc.c s3_pkt.c s3_both.c s23_meth.c s23_srvr.c s23_clnt.c s23_lib.c s23_pkt.c t1_meth.c t1_srvr.c t1_clnt.c t1_lib.c t1_enc.c ssl_lib.c ssl_err2.c ssl_cert.c ssl_sess.c ssl_ciph.c ssl_stat.c ssl_rsa.c ssl_asn1.c ssl_txt.c ssl_algs.c bio_ssl.c pxy_ssl.c ssl_err.c
 TEST=ssltest.c
 TOP=..
 RELATIVE_DIRECTORY=
@@ -871,7 +922,7 @@ TEST=
 TOP=..
 RELATIVE_DIRECTORY=
 RELATIVE_DIRECTORY=apps
-ALL=Makefile verify.c asn1pars.c req.c dgst.c dh.c enc.c gendh.c errstr.c ca.c pkcs7.c crl2p7.c crl.c rsa.c dsa.c dsaparam.c x509.c genrsa.c s_server.c s_client.c speed.c s_time.c apps.c s_cb.c s_socket.c version.c sess_id.c ciphers.c apps.h progs.h s_apps.h testdsa.h testrsa.h 
+ALL=Makefile verify.c asn1pars.c req.c dgst.c dh.c enc.c gendh.c errstr.c ca.c pkcs7.c crl2p7.c crl.c rsa.c dsa.c dsaparam.c x509.c genrsa.c s_server.c s_client.c speed.c s_time.c apps.c s_cb.c s_socket.c bf_perm.c version.c sess_id.c ciphers.c apps.h progs.h s_apps.h testdsa.h testrsa.h 
 A_OBJ=apps.o
 A_SRC=apps.c
 CC=cc
@@ -884,8 +935,8 @@ EXE=ssleay
 EXHEADER=
 EX_LIBS=
 E_EXE=verify asn1pars req dgst dh enc gendh errstr ca crl rsa dsa dsaparam x509 genrsa s_server s_client speed s_time version pkcs7 crl2pkcs7 sess_id ciphers
-E_OBJ=verify.o asn1pars.o req.o dgst.o dh.o enc.o gendh.o errstr.o ca.o pkcs7.o crl2p7.o crl.o rsa.o dsa.o dsaparam.o x509.o genrsa.o s_server.o s_client.o speed.o s_time.o apps.o s_cb.o s_socket.o version.o sess_id.o ciphers.o
-E_SRC=verify.c asn1pars.c req.c dgst.c dh.c enc.c gendh.c errstr.c ca.c pkcs7.c crl2p7.c crl.c rsa.c dsa.c dsaparam.c x509.c genrsa.c s_server.c s_client.c speed.c s_time.c apps.c s_cb.c s_socket.c version.c sess_id.c ciphers.c
+E_OBJ=verify.o asn1pars.o req.o dgst.o dh.o enc.o gendh.o errstr.o ca.o pkcs7.o crl2p7.o crl.o rsa.o dsa.o dsaparam.o x509.o genrsa.o s_server.o s_client.o s_ speed.o s_time.o apps.o s_cb.o s_socket.o bf_perm.o version.o sess_id.o ciphers.o
+E_SRC=verify.c asn1pars.c req.c dgst.c dh.c enc.c gendh.c errstr.c ca.c pkcs7.c crl2p7.c crl.c rsa.c dsa.c dsaparam.c x509.c genrsa.c s_server.c s_client.c speed.c s_time.c apps.c s_cb.c s_socket.c bf_perm.c version.c sess_id.c ciphers.c
 GENERAL=Makefile
 HEADER=apps.h progs.h s_apps.h testdsa.h testrsa.h 
 INCLUDES=-I../include
@@ -899,10 +950,10 @@ PEX_LIBS=
 PROGS=ssleay.c
 RM=/bin/rm -f
 SCRIPTS=CA.sh der_chop
-SRC=verify.c asn1pars.c req.c dgst.c dh.c enc.c gendh.c errstr.c ca.c pkcs7.c crl2p7.c crl.c rsa.c dsa.c dsaparam.c x509.c genrsa.c s_server.c s_client.c speed.c s_time.c apps.c s_cb.c s_socket.c version.c sess_id.c ciphers.c
+SRC=verify.c asn1pars.c req.c dgst.c dh.c enc.c gendh.c errstr.c ca.c pkcs7.c crl2p7.c crl.c rsa.c dsa.c dsaparam.c x509.c genrsa.c s_server.c s_client.c speed.c s_time.c apps.c s_cb.c s_socket.c bf_perm.c version.c sess_id.c ciphers.c
 SSLEAY=ssleay
-S_OBJ=s_cb.o s_socket.o
-S_SRC=s_cb.c s_socket.c
+S_OBJ=s_cb.o s_socket.o bf_perm.o
+S_SRC=s_cb.c s_socket.c bf_perm.c
 TOP=..
 RELATIVE_DIRECTORY=
 RELATIVE_DIRECTORY=test
index 0f352027e61c4aacabd0830385411feaae44982c..09c2ff25e3bc4fd9320986750465db64a592634d 100644 (file)
@@ -1,6 +1,7 @@
 #
 # Makefile for all the SSL related library routines and utilities
-VERSION = 0.9.0a
+VERSION = 0.9.1b
+PLATFORM=debug
 #
 # make install will install:
 #   libraries into $INSTALLTOP/lib
@@ -57,29 +58,31 @@ VERSION = 0.9.0a
 # MD5_ASM needs to be defined to use the x86 assembler for MD5
 # SHA1_ASM needs to be defined to use the x86 assembler for SHA1
 # RMD160_ASM needs to be defined to use the x86 assembler for RIPEMD160
+# Do not define B_ENDIAN or L_ENDIAN if 'unsigned long' == 8.  It must
+# equal 4.
+# PKCS1_CHECK - pkcs1 tests.
 
-
-CC= cc
-#CFLAG= -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall -Wuninitialized -DMD5_ASM -DSHA1_ASM -DRMD160_ASM
-CFLAG= -O -DNOPROTO
+CC= gcc
+#CFLAG= -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall -Wuninitialized -DSHA1_ASM -DMD5_ASM -DRMD160_ASM
+CFLAG= -DBN_DEBUG -DREF_CHECK -DCRYPTO_MDEBUG -ggdb -g2 -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations -Werror
 PEX_LIBS= -L. -L.. -L../.. -L../../..
-EX_LIBS= 
+EX_LIBS= -lefence
 AR=ar r
 
-# Set BN_MULW to bn_mulw.o if you want to use the C version
-BN_MULW= bn_mulw.o
-#BN_MULW= bn_mulw.o
-#BN_MULW= asm/bn86-elf.o        # elf, linux-elf
-#BN_MULW= asm/bn86-sol.o        # solaris
-#BN_MULW= asm/bn86-out.o        # a.out, FreeBSD
-#BN_MULW= asm/bn86bsdi.o        # bsdi
-#BN_MULW= asm/alpha.o           # DEC Alpha
-#BN_MULW= asm/pa-risc2.o        # HP-UX PA-RISC
-#BN_MULW= asm/r3000.o           # SGI MIPS cpu
-#BN_MULW= asm/sparc.o           # Sun solaris/SunOS
-#BN_MULW= asm/bn-win32.o                # Windows 95/NT
-#BN_MULW= asm/x86w16.o          # 16 bit code for Windows 3.1/DOS
-#BN_MULW= asm/x86w32.o          # 32 bit code for Windows 3.1
+# Set BN_ASM to bn_asm.o if you want to use the C version
+BN_ASM= bn_asm.o
+#BN_ASM= bn_asm.o
+#BN_ASM= asm/bn86-elf.o        # elf, linux-elf
+#BN_ASM= asm/bn86-sol.o # solaris
+#BN_ASM= asm/bn86-out.o # a.out, FreeBSD
+#BN_ASM= asm/bn86bsdi.o # bsdi
+#BN_ASM= asm/alpha.o    # DEC Alpha
+#BN_ASM= asm/pa-risc2.o # HP-UX PA-RISC
+#BN_ASM= asm/r3000.o    # SGI MIPS cpu
+#BN_ASM= asm/sparc.o    # Sun solaris/SunOS
+#BN_ASM= asm/bn-win32.o # Windows 95/NT
+#BN_ASM= asm/x86w16.o   # 16 bit code for Windows 3.1/DOS
+#BN_ASM= asm/x86w32.o   # 32 bit code for Windows 3.1
 
 # Set DES_ENC to des_enc.o if you want to use the C version
 #There are 4 x86 assember options.
@@ -154,7 +157,7 @@ SDIRS=  \
        des rc2 rc4 rc5 idea bf cast \
        bn rsa dsa dh \
        buffer bio stack lhash rand err objects \
-       evp pem asn1 x509 conf txt_db pkcs7
+       evp pem asn1 x509 conf txt_db pkcs7 comp
 
 # If you change the INSTALLTOP, make sure to also change the values
 # in crypto/location.h
@@ -169,8 +172,9 @@ SHELL=/bin/sh
 
 TOP=    .
 ONEDIRS=out tmp
-EDIRS=  times doc bugs util include certs ms shlib mt demos perl dep
-MISC=   COPYRIGHT Configure HISTORY.066 INSTALL Makefile.ssl Makefile \
+EDIRS=  times doc bugs util include certs ms shlib mt demos perl sf dep
+MISC=   COPYRIGHT Configure HISTORY.090        HISTORY.066 INSTALL Makefile.ssl \
+       Makefile \
        README TODO HISTORY README.066 README.080 README.090 \
        VERSION PROBLEMS MINFO makefile.one e_os.h \
        MICROSOFT makevms.com config PATENTS
@@ -189,16 +193,19 @@ all:
        @for i in $(DIRS) ;\
        do \
        (cd $$i; echo "making $$i..."; \
-       $(MAKE) CC='${CC}' CFLAG='${CFLAG}' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_MULW='${BN_MULW}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' SDIRS='${SDIRS}' AR='${AR}' all ); \
+       $(MAKE) CC='${CC}' PLATFORM='${PLATFORM}' CFLAG='${CFLAG}' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' SDIRS='${SDIRS}' AR='${AR}' all ); \
        done;
 
 sub_all:
        @for i in $(DIRS) ;\
        do \
        (cd $$i; echo "making $$i..."; \
-       $(MAKE) CC='${CC}' CFLAG='${CFLAG}' SDIRS='$(SDIRS)' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_MULW='${BN_MULW}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' AR='${AR}' all ); \
+       $(MAKE) CC='${CC}' PLATFORM='${PLATFORM}' CFLAG='${CFLAG}' SDIRS='$(SDIRS)' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' AR='${AR}' all ); \
        done;
 
+libclean:
+       /bin/rm *.a */lib */*/lib
+
 clean:
        /bin/rm -f shlib/*.o *.o core a.out fluff *.map
        @for i in $(DIRS) ;\
@@ -253,7 +260,7 @@ test:   tests
 
 tests:
        (cd test; echo "testing $$i..."; \
-       $(MAKE) CC='${CC}' CFLAG='${CFLAG}' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_MULW='${BN_MULW}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SDIRS='${SDIRS}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' AR='${AR}' tests );
+       $(MAKE) CC='${CC}' CFLAG='${CFLAG}' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' SDIRS='${SDIRS}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' AR='${AR}' tests );
        @apps/ssleay version -a
 
 depend:
diff --git a/PATENTS b/PATENTS
index 61423d03c8be08d40a2bb934e9268b49b4c75f43..1e09003ec7244038fae8c7afb5e57702a346e7dc 100644 (file)
--- a/PATENTS
+++ b/PATENTS
@@ -1,9 +1,13 @@
 RSA Data Security holds software patents on the RSA and RC5 algorithms.
 If there ciphers are used used inside the USA (and Japan?), you must contact
-RSA Data Security for licencing conditions.
-
-The IDEA algorithm is patented by XXXX and they should be contacted if that
-algorithm is to be used.
+RSA Data Security for licencing conditions.  Their web page is
+http://www.rsa.com
 
 RC4 is a trademark of RSA Data Security, so use of this label should perhaps
-only me used with RSA Data Security's permission.
+only me used with RSA Data Security's permission. 
+
+The IDEA algorithm is patented by Ascom in Austria, France, Germany,
+Italy, Japan, Netherlands, Spain, Sweden, Switzerland, UK and the USA.
+They should be contacted if that algorithm is to be used, their web page is
+http://www.ascom.ch
+
diff --git a/README b/README
index eaa77007f0b259b7bb1c596390d802adf3ace1ea..bc72bfe3167cc029620b2e121b5ad3a08b2b914c 100644 (file)
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-               SSLeay 0.9.0b 29-Jun-1998
+               SSLeay 0.9.1a 06-Jul-1998
                Copyright (c) 1997, Eric Young
                All rights reserved.
 
index 634870d5f1777e0c2f5df01674ea901f3c63490f..811037fc2d2d597a4bdd463a712626aae3660e37 100644 (file)
@@ -5,67 +5,4 @@ I expect a 0.9.1 will follow with portability fixes in the next few weeks.
 This is a quick, meet the deadline.  Look to ssl-users for comments on what
 is new etc.
 
-The state of play
-- TLSv1 - I need to do some explaining about how the methods interact.
-  The bad news is that SSLeay 0.8.x application will not roll back to
-  SSLv3, I suffed up.  0.8.x is rather pedantic about the '3.0' version
-  number.  Look at the 'no-tls' options in applications in the apps directory.
-- The perl5 stuff is very rough.  The SSL part does not work due to
-  reference count hassles in the BIO stuff.  I just have not had time to
-  look at it.  The cipher, digest and bignum stuff works though.  I just
-  need to clean up the API.
-- Lots of x86 assember.  I now have it for des, 3des, rc4, rc5, blowfish,
-  cast, md5, sha1 and ripemd160.  It has been tested on win32, linux (elf)
-  and FreeBSD (a.out).
-- As mentioned above, cast, rc5 and ripemd160 have been added.
-- A simple HMAC set of functions.
-- EX_DATA strucutre, which can be used by applications or other libraries
-  to tack arbitarty data against strucutures that include it.
-  You will probably have to see examples to see how to use it, and I will
-  elaberate on the ssl-users mailing list
-- RSA blinding.  If you fear timing attacks on RSA, you can turn on
-  blinding which defeats it.
-- From Tim Hudson, try running 'sh config' instead of 'perl Configure'.
-  I makes an educated guess as to what you are and then runs 'perl Configure'
-- The error stuff has been modified so arbitary strings can be taged
-  against an error message.  It is used in a few places to elaberate on
-  parameters that caused the error.
-
-Areas of work
-- The 16bit big-num assember needs a routine added.  The WIN16 and
-  WIN32 stuff is ok, but MS-DOS or 286 builds need the update.
-- Most of the bignum assember will not work.  There will be a function
-  missing, bn_add_words().  I need people to send me the C compiler output
-  for platforms I don't already have.  Currently, the assember is correct for
-  x86, win32, win16(386+), linux elf, FreeBSD a.out and sparc.
-- PKCS7, I have delusions of s/MIME.  I need to do a BIO interface.
-- perl5, it needs finishing
-- X509v3 extension.  I have some ideas, I just need to
-  implement them :-)
-- Public key methods.  I need to clean up the library internally so
-  public key methods are loaded is a similar way to symetric ciphers
-  and digests.  I also need to seperate out the digests from public
-  key methods.  This stuff is needed to support sortware patents, smaller
-  code size and hardware tokens.
-
-Anyway, this release gets out the bug fixes and TLS, but be warned, until
-all those old SSLeay 0.8.x based server get upgraded, you will need to
-connect with SSLv3 if TLSv1 fails.
-
 eric (about to go bushwalking for the 4 day easter break :-)
-
-PS Common problems
-- For Win32 build, use /MD to specify your libraries, or build SSLeay with
-  the same flags as your application.  Visual C stuffs up the malloc routines
-  if memory allocated by one memory model is freed by another.  FILE pointers
-  are a major cause of these problem.
-- If you are trying to use non-blocking IO and it is not working,
-  try 'ssleay s_client -help' and see if the -nbio option is listed.
-  For unixware, it has the non-block IO define in 'differnt' header file
-  and SSLeay will silently build without non-blocking IO calls (but for
-  unixware, the special header has been included).
-- -DL_ENDIAN.  For the message digests, some code needs to be turned off
-  in the C code when assember is used.  For x86, this means the L_ENDIAN
-  needs to defined when x86 -DSHA1_ASM is defined.  The reasons this is
-  not automagically done is because non-x86 assember could be bigendian.
-  For pure C code builds, the B_ENDIAN/L_ENDIAN flags are optional.
index 3d382282e41c497a0fbedc06b9cbe96e941a5b5a..edeffaaa8463943a9233adc5393a3e192be6c420 100644 (file)
  * [including the GNU Public Licence.]
  */
 
+/* A nice addition from Dr Stephen Henson <shenson@bigfoot.com> to 
+ * add the -strparse option which parses nested binarary structures
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include "x509.h"
 #include "pem.h"
 
-#define FORMAT_UNDEF   0
-#define FORMAT_ASN1    1
-#define FORMAT_TEXT    2
-#define FORMAT_PEM     3
-
 /* -inform arg - input format - default PEM (DER or PEM)
  * -in arg     - input file - default stdin
  * -i          - indent the details by depth
@@ -85,13 +84,16 @@ int MAIN(argc, argv)
 int argc;
 char **argv;
        {
-       int i,badops=0,offset=0,ret=1;
+       int i,badops=0,offset=0,ret=1,j;
        unsigned int length=0;
-       long num;
+       long num,tmplen;
        BIO *in=NULL,*out=NULL,*b64=NULL;
        int informat,indent=0;
        char *infile=NULL,*str=NULL,*prog,*oidfile=NULL;
+       unsigned char *tmpbuf;
        BUF_MEM *buf=NULL;
+       STACK *osk=NULL;
+       ASN1_TYPE *at=NULL;
 
        informat=FORMAT_PEM;
 
@@ -104,6 +106,11 @@ char **argv;
        prog=argv[0];
        argc--;
        argv++;
+       if ((osk=sk_new_null()) == NULL)
+               {
+               BIO_printf(bio_err,"Malloc failure\n");
+               goto end;
+               }
        while (argc >= 1)
                {
                if      (strcmp(*argv,"-inform") == 0)
@@ -136,6 +143,11 @@ char **argv;
                        length= atoi(*(++argv));
                        if (length == 0) goto bad;
                        }
+               else if (strcmp(*argv,"-strparse") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       sk_push(osk,*(++argv));
+                       }
                else
                        {
                        BIO_printf(bio_err,"unknown option %s\n",*argv);
@@ -157,6 +169,9 @@ bad:
                BIO_printf(bio_err," -length arg   lenth of section in file\n");
                BIO_printf(bio_err," -i            indent entries\n");
                BIO_printf(bio_err," -oid file     file of extra oid definitions\n");
+               BIO_printf(bio_err," -strparse offset\n");
+               BIO_printf(bio_err,"               a series of these can be used to 'dig' into multiple\n");
+               BIO_printf(bio_err,"               ASN1 blob wrappings\n");
                goto end;
                }
 
@@ -218,6 +233,36 @@ bad:
                }
        str=buf->data;
 
+       /* If any structs to parse go through in sequence */
+
+       if (sk_num(osk))
+               {
+               tmpbuf=(unsigned char *)str;
+               tmplen=num;
+               for (i=0; i<sk_num(osk); i++)
+                       {
+                       j=atoi(sk_value(osk,i));
+                       if (j == 0)
+                               {
+                               BIO_printf(bio_err,"'%s' is an invalid number\n",sk_value(osk,i));
+                               continue;
+                               }
+                       tmpbuf+=j;
+                       tmplen-=j;
+                       if (d2i_ASN1_TYPE(&at,&tmpbuf,tmplen) == NULL)
+                               {
+                               BIO_printf(bio_err,"Error parsing structure\n");
+                               ERR_print_errors(bio_err);
+                               goto end;
+                               }
+                       /* hmm... this is a little evil but it works */
+                       tmpbuf=at->value.asn1_string->data;
+                       tmplen=at->value.asn1_string->length;
+                       }
+               str=(char *)tmpbuf;
+               num=tmplen;
+               }
+
        if (length == 0) length=(unsigned int)num;
        if (!ASN1_parse(out,(unsigned char *)&(str[offset]),length,indent))
                {
@@ -232,6 +277,8 @@ end:
        if (ret != 0)
                ERR_print_errors(bio_err);
        if (buf != NULL) BUF_MEM_free(buf);
+       if (at != NULL) ASN1_TYPE_free(at);
+       if (osk != NULL) sk_free(osk);
        OBJ_cleanup();
        EXIT(ret);
        }
index 75016ea3625245b1aac79cc5586c3f33ce8b7c78..eeee65ec419f2fcb5e45c19008cd23793bea8932 100644 (file)
@@ -1 +1 @@
-03
+05
index a5848366cfe6649987b8c7099b0c39ab29ffb2ac..8990aa20a7d9358912e594af1213ab8e8b272e87 100644 (file)
--- a/apps/ca.c
+++ b/apps/ca.c
@@ -431,6 +431,29 @@ bad:
                        }
                }
 
+       if (conf != NULL)
+               {
+               p=CONF_get_string(conf,NULL,"oid_file");
+               if (p != NULL)
+                       {
+                       BIO *oid_bio;
+
+                       oid_bio=BIO_new_file(p,"r");
+                       if (oid_bio == NULL) 
+                               {
+                               /*
+                               BIO_printf(bio_err,"problems opening %s for extra oid's\n",p);
+                               ERR_print_errors(bio_err);
+                               */
+                               }
+                       else
+                               {
+                               OBJ_create_objects(oid_bio);
+                               BIO_free(oid_bio);
+                               }
+                       }
+               }
+
        in=BIO_new(BIO_s_file());
        out=BIO_new(BIO_s_file());
        Sout=BIO_new(BIO_s_file());
@@ -490,6 +513,12 @@ bad:
                goto err;
                }
 
+       if (!X509_check_private_key(x509,pkey))
+               {
+               BIO_printf(bio_err,"CA certificate and CA private key do not match\n");
+               goto err;
+               }
+
        f=CONF_get_string(conf,BASE_SECTION,ENV_PRESERVE);
        if ((f != NULL) && ((*f == 'y') || (*f == 'Y')))
                preserve=1;
@@ -700,7 +729,7 @@ bad:
                        }
                if (verbose)
                        {
-                       if ((f=BN_bn2ascii(serial)) == NULL) goto err;
+                       if ((f=BN_bn2hex(serial)) == NULL) goto err;
                        BIO_printf(bio_err,"next serial number is %s\n",f);
                        Free(f);
                        }
@@ -1273,7 +1302,7 @@ int verbose;
        if (i == 0)
                {
                ok=0;
-               BIO_printf(bio_err,"Signature did not match the certificate request\n");
+               BIO_printf(bio_err,"Signature did not match the certificate\n");
                goto err;
                }
        else
@@ -1530,7 +1559,7 @@ again2:
                BIO_printf(bio_err,"The subject name apears to be ok, checking data base for clashes\n");
 
        row[DB_name]=X509_NAME_oneline(subject,NULL,0);
-       row[DB_serial]=BN_bn2ascii(serial);
+       row[DB_serial]=BN_bn2hex(serial);
        if ((row[DB_name] == NULL) || (row[DB_serial] == NULL))
                {
                BIO_printf(bio_err,"Malloc failure\n");
@@ -1661,6 +1690,8 @@ again2:
                        }
                }
 
+       if (pkey->type == EVP_PKEY_DSA) dgst=EVP_dss1();
+
 #ifndef NO_DSA
         pktmp=X509_get_pubkey(ret);
         if (EVP_PKEY_missing_parameters(pktmp) &&
@@ -2022,7 +2053,7 @@ char *sec;
                default:
                        BIO_printf(bio_err,"Don't know how to pack extension %s\n",cv->name);
                        goto err;
-                       break;
+                       /* break; */
                        }
 
                if ((x=X509_EXTENSION_create_by_NID(NULL,nid,0,str)) == NULL)
diff --git a/apps/cert.der b/apps/cert.der
new file mode 100644 (file)
index 0000000..58d9fd8
Binary files /dev/null and b/apps/cert.der differ
index 2c18374ee0ea7b75a93a2e5d0044db950db1a621..acb5cb9b243863379f5dba33d0efc522829d124a 100644 (file)
 #undef POSTFIX
 #define        POSTFIX ".rvk"
 
-#define FORMAT_UNDEF   0
-#define FORMAT_ASN1    1
-#define FORMAT_TEXT    2
-#define FORMAT_PEM     3
-
 static char *crl_usage[]={
 "usage: crl args\n",
 "\n",
index eea291db1274f907c27b61ab2c02d5e5eded113f..86d60c53da5a148e5be164e5b863480da30c9d7e 100644 (file)
@@ -146,6 +146,8 @@ char **argv;
                        LN_sha,LN_sha);
                BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n",
                        LN_mdc2,LN_mdc2);
+               BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n",
+                       LN_ripemd160,LN_ripemd160);
                err=1;
                goto end;
                }
index 6e99289bd343f9d34defa6ca4c37b050bb5e60e0..de1d0cc953ad6490b1ecbcbf114736c94e6c6caa 100644 (file)
@@ -80,6 +80,7 @@
  * -text
  * -C
  * -noout
+ * -genkey
  */
 
 #ifndef NOPROTO
@@ -97,7 +98,7 @@ char **argv;
        BIO *in=NULL,*out=NULL;
        int informat,outformat,noout=0,C=0,ret=1;
        char *infile,*outfile,*prog,*inrand=NULL;
-       int numbits= -1,num;
+       int numbits= -1,num,genkey=0;
        char buffer[200],*randfile=NULL;
 
        apps_startup();
@@ -140,6 +141,8 @@ char **argv;
                        text=1;
                else if (strcmp(*argv,"-C") == 0)
                        C=1;
+               else if (strcmp(*argv,"-genkey") == 0)
+                       genkey=1;
                else if (strcmp(*argv,"-rand") == 0)
                        {
                        if (--argc < 1) goto bad;
@@ -315,6 +318,22 @@ bad:
                        goto end;
                        }
                }
+       if (genkey)
+               {
+               DSA *dsakey;
+
+               if ((dsakey=DSAparams_dup(dsa)) == NULL) goto end;
+               if (!DSA_generate_key(dsakey)) goto end;
+               if      (outformat == FORMAT_ASN1)
+                       i=i2d_DSAPrivateKey_bio(out,dsakey);
+               else if (outformat == FORMAT_PEM)
+                       i=PEM_write_bio_DSAPrivateKey(out,dsakey,NULL,NULL,0,NULL);
+               else    {
+                       BIO_printf(bio_err,"bad output format specified for outfile\n");
+                       goto end;
+                       }
+               DSA_free(dsakey);
+               }
        ret=0;
 end:
        if (in != NULL) BIO_free(in);
index cd05fe6a785b2db6dbdcc4b2533c51c0b09b51a4..4c63e86ea5f040c6f2b38065d60e6381c00dede9 100644 (file)
@@ -49,7 +49,7 @@ foreach (@ARGV)
                { print $str; }
        }
 
-foreach ("md2","md5","sha","sha1","mdc2")
+foreach ("md2","md5","sha","sha1","mdc2","rmd160")
        {
        push(@files,$_);
        printf "\t{FUNC_TYPE_MD,\"%s\",dgst_main},\n",$_;
diff --git a/apps/gmon.out b/apps/gmon.out
new file mode 100644 (file)
index 0000000..abab8b9
Binary files /dev/null and b/apps/gmon.out differ
index 55a56b399e4f53a711a442de5886e577765d7c3c..d9be1c35c4f6dc5d89f57bbc443e496b95a2d4b4 100644 (file)
@@ -1,5 +1,5 @@
 #!/bin/sh
-for i in verify asn1parse req dgst dh enc gendh errstr ca crl rsa dsa dsaparam x509 genrsa s_server s_client speed s_time version pkcs7 crl2pkcs7 sess_id ciphers md2 md5 sha sha1 mdc2 base64 des des3 desx idea rc4 rc2 bf cast rc5 des-ecb des-ede des-ede3 des-cbc des-ede-cbc des-ede3-cbc des-cfb des-ede-cfb des-ede3-cfb des-ofb des-ede-ofb des-ede3-ofb idea-cbc idea-ecb idea-cfb idea-ofb rc2-cbc rc2-ecb rc2-cfb rc2-ofb bf-cbc bf-ecb bf-cfb bf-ofb cast5-cbc cast5-ecb cast5-cfb cast5-ofb cast-cbc rc5-cbc rc5-ecb rc5-cfb rc5-ofb 
+for i in verify asn1parse req dgst dh enc gendh errstr ca crl rsa dsa dsaparam x509 genrsa s_server s_client speed s_time version pkcs7 crl2pkcs7 sess_id ciphers md2 md5 sha sha1 mdc2 rmd160 base64 des des3 desx idea rc4 rc2 bf cast rc5 des-ecb des-ede des-ede3 des-cbc des-ede-cbc des-ede3-cbc des-cfb des-ede-cfb des-ede3-cfb des-ofb des-ede-ofb des-ede3-ofb idea-cbc idea-ecb idea-cfb idea-ofb rc2-cbc rc2-ecb rc2-cfb rc2-ofb bf-cbc bf-ecb bf-cfb bf-ofb cast5-cbc cast5-ecb cast5-cfb cast5-ofb cast-cbc rc5-cbc rc5-ecb rc5-cfb rc5-ofb 
 do
 echo making symlink for $i
 /bin/rm -f $i
diff --git a/apps/oid.cnf b/apps/oid.cnf
new file mode 100644 (file)
index 0000000..faf425a
--- /dev/null
@@ -0,0 +1,6 @@
+2.99999.1       SET.ex1         SET x509v3 extension 1
+2.99999.2       SET.ex2         SET x509v3 extension 2
+2.99999.3       SET.ex3         SET x509v3 extension 3
+2.99999.4       SET.ex4         SET x509v3 extension 4
+2.99999.5       SET.ex5         SET x509v3 extension 5
+2.99999.6       SET.ex6         SET x509v3 extension 6
index eac411b85405b9ee5d18ec5e58dc1e93508db961..739a0e8f31c0f260793de5a824037d604ddc55f6 100644 (file)
@@ -241,6 +241,7 @@ end:
        ERR_remove_state(0);
 
        EVP_cleanup();
+       ERR_free_strings();
 
        CRYPTO_mem_leaks(bio_err);
        if (bio_err != NULL)
index 0b3bfa64f861487d30786b04d40cb6a9d8effc7f..2621d90d31b70e4b229670a5eb3e14406bf66fcf 100644 (file)
@@ -4,6 +4,7 @@
 #
 
 RANDFILE               = $ENV::HOME/.rnd
+oid_file               = $ENV::HOME/.oid
 
 ####################################################################
 [ ca ]
@@ -90,6 +91,8 @@ commonName_max                        = 64
 emailAddress                   = Email Address
 emailAddress_max               = 40
 
+SET-ex3                                = SET extension number 3
+
 [ req_attributes ]
 challengePassword              = A challenge password
 challengePassword_min          = 4
index b567e411b20e3448d517cbd83711d0def8208d0b..0af46474a7ee721474c8d43964cd614a9ac116e4 100644 (file)
@@ -1,11 +1,18 @@
------BEGIN DSA PRIVATE KEY-----
+-----BEGIN RSA PRIVATE KEY-----
 Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,1BF8E9CE60B9941C
+DEK-Info: DES-EDE3-CBC,BA26229A1653B7FF
 
-JuhgIvVRrxCRedTTC9ABlIByMsq6IcpqyDZwOPS4rxTtVWvjj1BMHtoCebK7CKMZ
-dLsvztfSkdAYmTGK62C73RwlmnMxB4JXhTLaoAX2eL9iylojTWRg+/0Y4rbIKmUe
-hrmwrHld7vnfE9XHL8OoaFp6aJ8BB9B8HIfdJMnrNcTWJSGS6gYPTWPdm7ZCykEV
-2fFEX6IqWjBjaRm36Esj5mHLRVhBbi2n/jy5IhZeqjEsQ8adYGUulzPSe5xc2JZa
-+OO4ch/RRqWTFP59eNPfdke3UE7uNlUhPnYDAOXhSdMJBzI+T9RQXU2y/tMOrYYK
-3+jNQcQ9q1Xy1s5dz/BOvw==
------END DSA PRIVATE KEY-----
+6nhWG8PKhTPO/s3ZvjUa6226NlKdvPDZFsNXOOoSUs9ejxpb/aj5huhs6qRYzsz9
+Year47uaAZYhGD0vAagnNiBnYmjWEpN9G/wQxG7pgZThK1ZxDi63qn8aQ8UjuGHo
+F6RpnnBQIAnWTWqr/Qsybtc5EoNkrj/Cpx0OfbSr6gZsFBCxwX1R1hT3/mhJ45f3
+XMofY32Vdfx9/vtw1O7HmlHXQnXaqnbd9/nn1EpvFJG9+UjPoW7gV4jCOLuR4deE
+jS8hm+cpkwXmFtk3VGjT9tQXPpMv3JpYfBqgGQoMAJ5Toq0DWcHi6Wg08PsD8lgy
+vmTioPsRg+JGkJkJ8GnusgLpQdlQJbjzd7wGE6ElUFLfOxLo8bLlRHoriHNdWYhh
+JjY0LyeTkovcmWxVjImc6ZyBz5Ly4t0BYf1gq3OkjsV91Q1taBxnhiavfizqMCAf
+PPB3sLQnlXG77TOXkNxpqbZfEYrVZW2Nsqqdn8s07Uj4IMONZyq2odYKWFPMJBiM
+POYwXjMAOcmFMTHYsVlhcUJuV6LOuipw/FEbTtPH/MYMxLe4zx65dYo1rb4iLKLS
+gMtB0o/Wl4Xno3ZXh1ucicYnV2J7NpVcjVq+3SFiCRu2SrSkZHZ23EPS13Ec6fcz
+8X/YGA2vTJ8MAOozAzQUwHQYvLk7bIoQVekqDq4p0AZQbhdspHpArCk0Ifqqzg/v
+Uyky/zZiQYanzDenTSRVI/8wac3olxpU8QvbySxYqmbkgq6bTpXJfYFQfnAttEsC
+dA4S5UFgyOPZluxCAM4yaJF3Ft6neutNwftuJQMbgCUi9vYg2tGdSw==
+-----END RSA PRIVATE KEY-----
index ec00396ed7feebc98d3d377a1021538cd07c40a2..578bfcf510a963dd064d2bc85554a77a8678e0a8 100644 (file)
@@ -118,6 +118,7 @@ FUNCTION functions[] = {
        {FUNC_TYPE_MD,"sha",dgst_main},
        {FUNC_TYPE_MD,"sha1",dgst_main},
        {FUNC_TYPE_MD,"mdc2",dgst_main},
+       {FUNC_TYPE_MD,"rmd160",dgst_main},
        {FUNC_TYPE_CIPHER,"base64",enc_main},
 #ifndef NO_DES
        {FUNC_TYPE_CIPHER,"des",enc_main},
index cd05fe6a785b2db6dbdcc4b2533c51c0b09b51a4..4c63e86ea5f040c6f2b38065d60e6381c00dede9 100644 (file)
@@ -49,7 +49,7 @@ foreach (@ARGV)
                { print $str; }
        }
 
-foreach ("md2","md5","sha","sha1","mdc2")
+foreach ("md2","md5","sha","sha1","mdc2","rmd160")
        {
        push(@files,$_);
        printf "\t{FUNC_TYPE_MD,\"%s\",dgst_main},\n",$_;
index f51345f5a2890f731a83757762d759121b023057..9af5b49570bcb10662e787ee8dc68cf12f03775d 100644 (file)
@@ -392,6 +392,29 @@ bad:
                        }
                }
 
+       if (req_conf != NULL)
+               {
+               p=CONF_get_string(req_conf,NULL,"oid_file");
+               if (p != NULL)
+                       {
+                       BIO *oid_bio;
+
+                       oid_bio=BIO_new_file(p,"r");
+                       if (oid_bio == NULL) 
+                               {
+                               /*
+                               BIO_printf(bio_err,"problems opening %s for extra oid's\n",p);
+                               ERR_print_errors(bio_err);
+                               */
+                               }
+                       else
+                               {
+                               OBJ_create_objects(oid_bio);
+                               BIO_free(oid_bio);
+                               }
+                       }
+               }
+
        if ((md_alg == NULL) &&
                ((p=CONF_get_string(req_conf,SECTION,"default_md")) != NULL))
                {
index 7c4f8983ba08ac1ceb7ff3ecfa5ac0ed82db306a..0056736752e0a1fb3fd72c0af3d8cc3969112cb3 100644 (file)
@@ -1,5 +1,5 @@
 #!/bin/sh
-for i in verify asn1parse req dgst dh enc gendh errstr ca crl rsa dsa dsaparam x509 genrsa s_server s_client speed s_time version pkcs7 crl2pkcs7 sess_id ciphers md2 md5 sha sha1 mdc2 base64 des des3 desx idea rc4 rc2 bf cast rc5 des-ecb des-ede des-ede3 des-cbc des-ede-cbc des-ede3-cbc des-cfb des-ede-cfb des-ede3-cfb des-ofb des-ede-ofb des-ede3-ofb idea-cbc idea-ecb idea-cfb idea-ofb rc2-cbc rc2-ecb rc2-cfb rc2-ofb bf-cbc bf-ecb bf-cfb bf-ofb cast5-cbc cast5-ecb cast5-cfb cast5-ofb cast-cbc rc5-cbc rc5-ecb rc5-cfb rc5-ofb 
+for i in verify asn1parse req dgst dh enc gendh errstr ca crl rsa dsa dsaparam x509 genrsa s_server s_client speed s_time version pkcs7 crl2pkcs7 sess_id ciphers md2 md5 sha sha1 mdc2 rmd160 base64 des des3 desx idea rc4 rc2 bf cast rc5 des-ecb des-ede des-ede3 des-cbc des-ede-cbc des-ede3-cbc des-cfb des-ede-cfb des-ede3-cfb des-ofb des-ede-ofb des-ede3-ofb idea-cbc idea-ecb idea-cfb idea-ofb rc2-cbc rc2-ecb rc2-cfb rc2-ofb bf-cbc bf-ecb bf-cfb bf-ofb cast5-cbc cast5-ecb cast5-cfb cast5-ofb cast-cbc rc5-cbc rc5-ecb rc5-cfb rc5-ofb 
 do
 echo removing $i
 /bin/rm -f $i
diff --git a/apps/rsa/01.pem b/apps/rsa/01.pem
new file mode 100644 (file)
index 0000000..36ec575
--- /dev/null
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICTjCCAbsCEGiuFKTJn6nzmiPPLxUZs1owDQYJKoZIhvcNAQEEBQAwXzELMAkG
+A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
+VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk4
+MDUxODAwMDAwMFoXDTk5MDUxODIzNTk1OVowdTELMAkGA1UEBhMCVVMxETAPBgNV
+BAgTCE5ldyBZb3JrMREwDwYDVQQHFAhOZXcgWW9yazEeMBwGA1UEChQVSW5kdXN0
+cmlhbCBQcmVzcyBJbmMuMSAwHgYDVQQDFBd3d3cuaW5kdXN0cmlhbHByZXNzLmNv
+bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqiH9xUJNHvqCmaDon27ValJb
+qTLymF3yKKWBxbODLWjX7yKjewoqWhotaEARI6jXPqomU87gFU1tH4r/bgwh3FmU
+MK3qo92XOsvwNAHzXzWRXQNJmm54g2F1RUt00pgYiOximDse1t9RL5POCDEbfX8D
+gugrE/WwkS2FrSoc5/cCAwEAATANBgkqhkiG9w0BAQQFAAN+AIw7fvF0EtEvrNS/
+LYuqAgUw/tH0FLgCkqKLmYYm/yR+Z0hD2eP/UhF+jAwmV8rHtBnaTM7oN23RVW2k
+Cf8soiGfr2PYtfufpXtd7azUFa+WJCWnp0N29EG0BR1JOFC0Q/4dh/X9qulM8luq
+Pjrmw2eSgbdmmdumWAcNPVbV
+-----END CERTIFICATE-----
diff --git a/apps/rsa/1.txt b/apps/rsa/1.txt
new file mode 100644 (file)
index 0000000..95a862e
--- /dev/null
@@ -0,0 +1,50 @@
+issuer= /C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority
+subject=/C=US/ST=New York/L=New York/O=Industrial Press Inc./CN=www.industrialpress.com
+Certificate:
+    Data:
+        Version: 1 (0x0)
+        Serial Number:
+            68:ae:14:a4:c9:9f:a9:f3:9a:23:cf:2f:15:19:b3:5a
+        Signature Algorithm: md5WithRSAEncryption
+        Issuer: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority
+        Validity
+            Not Before: May 18 00:00:00 1998 GMT
+            Not After : May 18 23:59:59 1999 GMT
+        Subject: C=US, ST=New York, L=New York, O=Industrial Press Inc., CN=www.industrialpress.com
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:aa:21:fd:c5:42:4d:1e:fa:82:99:a0:e8:9f:6e:
+                    d5:6a:52:5b:a9:32:f2:98:5d:f2:28:a5:81:c5:b3:
+                    83:2d:68:d7:ef:22:a3:7b:0a:2a:5a:1a:2d:68:40:
+                    11:23:a8:d7:3e:aa:26:53:ce:e0:15:4d:6d:1f:8a:
+                    ff:6e:0c:21:dc:59:94:30:ad:ea:a3:dd:97:3a:cb:
+                    f0:34:01:f3:5f:35:91:5d:03:49:9a:6e:78:83:61:
+                    75:45:4b:74:d2:98:18:88:ec:62:98:3b:1e:d6:df:
+                    51:2f:93:ce:08:31:1b:7d:7f:03:82:e8:2b:13:f5:
+                    b0:91:2d:85:ad:2a:1c:e7:f7
+                Exponent: 65537 (0x10001)
+    Signature Algorithm: md5WithRSAEncryption
+        8c:3b:7e:f1:74:12:d1:2f:ac:d4:bf:2d:8b:aa:02:05:30:fe:
+        d1:f4:14:b8:02:92:a2:8b:99:86:26:ff:24:7e:67:48:43:d9:
+        e3:ff:52:11:7e:8c:0c:26:57:ca:c7:b4:19:da:4c:ce:e8:37:
+        6d:d1:55:6d:a4:09:ff:2c:a2:21:9f:af:63:d8:b5:fb:9f:a5:
+        7b:5d:ed:ac:d4:15:af:96:24:25:a7:a7:43:76:f4:41:b4:05:
+        1d:49:38:50:b4:43:fe:1d:87:f5:fd:aa:e9:4c:f2:5b:aa:3e:
+        3a:e6:c3:67:92:81:b7:66:99:db:a6:58:07:0d:3d:56:d5
+-----BEGIN CERTIFICATE-----
+MIICTjCCAbsCEGiuFKTJn6nzmiPPLxUZs1owDQYJKoZIhvcNAQEEBQAwXzELMAkG
+A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
+VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk4
+MDUxODAwMDAwMFoXDTk5MDUxODIzNTk1OVowdTELMAkGA1UEBhMCVVMxETAPBgNV
+BAgTCE5ldyBZb3JrMREwDwYDVQQHFAhOZXcgWW9yazEeMBwGA1UEChQVSW5kdXN0
+cmlhbCBQcmVzcyBJbmMuMSAwHgYDVQQDFBd3d3cuaW5kdXN0cmlhbHByZXNzLmNv
+bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqiH9xUJNHvqCmaDon27ValJb
+qTLymF3yKKWBxbODLWjX7yKjewoqWhotaEARI6jXPqomU87gFU1tH4r/bgwh3FmU
+MK3qo92XOsvwNAHzXzWRXQNJmm54g2F1RUt00pgYiOximDse1t9RL5POCDEbfX8D
+gugrE/WwkS2FrSoc5/cCAwEAATANBgkqhkiG9w0BAQQFAAN+AIw7fvF0EtEvrNS/
+LYuqAgUw/tH0FLgCkqKLmYYm/yR+Z0hD2eP/UhF+jAwmV8rHtBnaTM7oN23RVW2k
+Cf8soiGfr2PYtfufpXtd7azUFa+WJCWnp0N29EG0BR1JOFC0Q/4dh/X9qulM8luq
+Pjrmw2eSgbdmmdumWAcNPVbV
+-----END CERTIFICATE-----
diff --git a/apps/rsa/SecureServer.pem b/apps/rsa/SecureServer.pem
new file mode 100644 (file)
index 0000000..7c8ffb2
--- /dev/null
@@ -0,0 +1,47 @@
+Certificate:
+    Data:
+        Version: 1 (0x0)
+        Serial Number:
+            02:ad:66:7e:4e:45:fe:5e:57:6f:3c:98:19:5e:dd:c0
+        Signature Algorithm: md2WithRSAEncryption
+        Issuer: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority
+        Validity
+            Not Before: Nov  9 00:00:00 1994 GMT
+            Not After : Jan  7 23:59:59 2010 GMT
+        Subject: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1000 bit)
+                Modulus (1000 bit):
+                    00:92:ce:7a:c1:ae:83:3e:5a:aa:89:83:57:ac:25:
+                    01:76:0c:ad:ae:8e:2c:37:ce:eb:35:78:64:54:03:
+                    e5:84:40:51:c9:bf:8f:08:e2:8a:82:08:d2:16:86:
+                    37:55:e9:b1:21:02:ad:76:68:81:9a:05:a2:4b:c9:
+                    4b:25:66:22:56:6c:88:07:8f:f7:81:59:6d:84:07:
+                    65:70:13:71:76:3e:9b:77:4c:e3:50:89:56:98:48:
+                    b9:1d:a7:29:1a:13:2e:4a:11:59:9c:1e:15:d5:49:
+                    54:2c:73:3a:69:82:b1:97:39:9c:6d:70:67:48:e5:
+                    dd:2d:d6:c8:1e:7b
+                Exponent: 65537 (0x10001)
+    Signature Algorithm: md2WithRSAEncryption
+        65:dd:7e:e1:b2:ec:b0:e2:3a:e0:ec:71:46:9a:19:11:b8:d3:
+        c7:a0:b4:03:40:26:02:3e:09:9c:e1:12:b3:d1:5a:f6:37:a5:
+        b7:61:03:b6:5b:16:69:3b:c6:44:08:0c:88:53:0c:6b:97:49:
+        c7:3e:35:dc:6c:b9:bb:aa:df:5c:bb:3a:2f:93:60:b6:a9:4b:
+        4d:f2:20:f7:cd:5f:7f:64:7b:8e:dc:00:5c:d7:fa:77:ca:39:
+        16:59:6f:0e:ea:d3:b5:83:7f:4d:4d:42:56:76:b4:c9:5f:04:
+        f8:38:f8:eb:d2:5f:75:5f:cd:7b:fc:e5:8e:80:7c:fc:50
+-----BEGIN CERTIFICATE-----
+MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
+VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
+MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
+BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
+dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
+ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
+0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
+uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
+hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
+YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
+1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
+-----END CERTIFICATE-----
diff --git a/apps/rsa/s.txt b/apps/rsa/s.txt
new file mode 100644 (file)
index 0000000..7de7e07
--- /dev/null
@@ -0,0 +1,49 @@
+issuer= /C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority
+subject=/C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority
+Certificate:
+    Data:
+        Version: 1 (0x0)
+        Serial Number:
+            02:ad:66:7e:4e:45:fe:5e:57:6f:3c:98:19:5e:dd:c0
+        Signature Algorithm: md2WithRSAEncryption
+        Issuer: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority
+        Validity
+            Not Before: Nov  9 00:00:00 1994 GMT
+            Not After : Jan  7 23:59:59 2010 GMT
+        Subject: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1000 bit)
+                Modulus (1000 bit):
+                    00:92:ce:7a:c1:ae:83:3e:5a:aa:89:83:57:ac:25:
+                    01:76:0c:ad:ae:8e:2c:37:ce:eb:35:78:64:54:03:
+                    e5:84:40:51:c9:bf:8f:08:e2:8a:82:08:d2:16:86:
+                    37:55:e9:b1:21:02:ad:76:68:81:9a:05:a2:4b:c9:
+                    4b:25:66:22:56:6c:88:07:8f:f7:81:59:6d:84:07:
+                    65:70:13:71:76:3e:9b:77:4c:e3:50:89:56:98:48:
+                    b9:1d:a7:29:1a:13:2e:4a:11:59:9c:1e:15:d5:49:
+                    54:2c:73:3a:69:82:b1:97:39:9c:6d:70:67:48:e5:
+                    dd:2d:d6:c8:1e:7b
+                Exponent: 65537 (0x10001)
+    Signature Algorithm: md2WithRSAEncryption
+        65:dd:7e:e1:b2:ec:b0:e2:3a:e0:ec:71:46:9a:19:11:b8:d3:
+        c7:a0:b4:03:40:26:02:3e:09:9c:e1:12:b3:d1:5a:f6:37:a5:
+        b7:61:03:b6:5b:16:69:3b:c6:44:08:0c:88:53:0c:6b:97:49:
+        c7:3e:35:dc:6c:b9:bb:aa:df:5c:bb:3a:2f:93:60:b6:a9:4b:
+        4d:f2:20:f7:cd:5f:7f:64:7b:8e:dc:00:5c:d7:fa:77:ca:39:
+        16:59:6f:0e:ea:d3:b5:83:7f:4d:4d:42:56:76:b4:c9:5f:04:
+        f8:38:f8:eb:d2:5f:75:5f:cd:7b:fc:e5:8e:80:7c:fc:50
+-----BEGIN CERTIFICATE-----
+MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
+VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
+MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
+BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
+dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
+ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
+0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
+uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
+hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
+YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
+1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
+-----END CERTIFICATE-----
index cd086bb93ed02251f4e64926ef94b8912d8fe89d..7fa855c5dcf74b136f3a7660aba8833aa4211ebd 100644 (file)
@@ -130,8 +130,10 @@ char *key_file;
        {
        if (cert_file != NULL)
                {
+               /*
                SSL *ssl;
                X509 *x509;
+               */
 
                if (SSL_CTX_use_certificate_file(ctx,cert_file,
                        SSL_FILETYPE_PEM) <= 0)
@@ -149,6 +151,8 @@ char *key_file;
                        return(0);
                        }
 
+               /*
+               In theory this is no longer needed 
                ssl=SSL_new(ctx);
                x509=SSL_get_certificate(ssl);
 
@@ -156,6 +160,7 @@ char *key_file;
                        EVP_PKEY_copy_parameters(X509_get_pubkey(x509),
                                SSL_get_privatekey(ssl));
                SSL_free(ssl);
+               */
 
                /* If we are using DSA, we can copy the parameters from
                 * the private key */
index e783eb723c4e2b0972cec50183cfbb5abec01306..e0cb24500360d8704195eddffd04d3da28425923 100644 (file)
@@ -131,7 +131,7 @@ static void sc_usage()
        BIO_printf(bio_err," -no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
        BIO_printf(bio_err," -bugs         - Switch on all SSL implementation bug workarounds\n");
        BIO_printf(bio_err," -cipher       - prefered cipher to use, use the 'ssleay ciphers'\n");
-       BIO_printf(bio_err,"                 command to se what is available\n");
+       BIO_printf(bio_err,"                 command to see what is available\n");
 
        }
 
@@ -551,7 +551,15 @@ re_start:
 #ifdef RENEG
 { static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
 #endif
+#if 1
                        k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
+#else
+/* Demo for pending and peek :-) */
+                       k=SSL_read(con,sbuf,16);
+{ char zbuf[10240]; 
+printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
+}
+#endif
 
                        switch (SSL_get_error(con,k))
                                {
@@ -588,7 +596,7 @@ re_start:
                        case SSL_ERROR_SSL:
                                ERR_print_errors(bio_err);
                                goto shut;
-                               break;
+                               /* break; */
                                }
                        }
 
@@ -658,7 +666,7 @@ int full;
                sk=SSL_get_peer_cert_chain(s);
                if (sk != NULL)
                        {
-                       BIO_printf(bio,"---\nCertficate chain\n");
+                       BIO_printf(bio,"---\nCertificate chain\n");
                        for (i=0; i<sk_num(sk); i++)
                                {
                                X509_NAME_oneline(X509_get_subject_name((X509 *)
index 5012ef254da704a8676df51a31f21bfd1c36500c..c9651b84af6ed5cef3ffd370ec123e39cbb94abb 100644 (file)
@@ -136,7 +136,8 @@ static DH *get_dh512()
 /* static int load_CA(SSL_CTX *ctx, char *file);*/
 
 #undef BUFSIZZ
-#define BUFSIZZ        8*1024
+#define BUFSIZZ        16*1024
+static int bufsize=32;
 static int accept_socket= -1;
 
 #define TEST_CERT      "server.pem"
@@ -562,7 +563,7 @@ int s;
        SSL *con=NULL;
        BIO *sbio;
 
-       if ((buf=Malloc(BUFSIZZ)) == NULL)
+       if ((buf=Malloc(bufsize)) == NULL)
                {
                BIO_printf(bio_err,"out of memory\n");
                goto err;
@@ -614,7 +615,7 @@ int s;
                if (i <= 0) continue;
                if (FD_ISSET(fileno(stdin),&readfds))
                        {
-                       i=read(fileno(stdin),buf,128/*BUFSIZZ*/);
+                       i=read(fileno(stdin),buf,bufsize);
                        if (!s_quiet)
                                {
                                if ((i <= 0) || (buf[0] == 'Q'))
@@ -641,7 +642,7 @@ int s;
                                        printf("SSL_do_handshake -> %d\n",i);
                                        i=0; /*13; */
                                        continue;
-                                       strcpy(buf,"server side RE-NEGOTIATE\n");
+                                       /* strcpy(buf,"server side RE-NEGOTIATE\n"); */
                                        }
                                if ((buf[0] == 'R') &&
                                        ((buf[1] == '\0') || (buf[1] == '\r')))
@@ -653,7 +654,7 @@ int s;
                                        printf("SSL_do_handshake -> %d\n",i);
                                        i=0; /* 13; */
                                        continue;
-                                       strcpy(buf,"server side RE-NEGOTIATE asking for client cert\n");
+                                       /* strcpy(buf,"server side RE-NEGOTIATE asking for client cert\n"); */
                                        }
                                if (buf[0] == 'P')
                                        {
@@ -688,7 +689,7 @@ int s;
                                        ERR_print_errors(bio_err);
                                        ret=1;
                                        goto err;
-                                       break;
+                                       /* break; */
                                case SSL_ERROR_ZERO_RETURN:
                                        BIO_printf(bio_s_out,"DONE\n");
                                        ret=1;
@@ -718,12 +719,14 @@ int s;
                                }
                        else
                                {
-                               i=SSL_read(con,(char *)buf,128 /*BUFSIZZ */);
+again: 
+                               i=SSL_read(con,(char *)buf,bufsize);
                                switch (SSL_get_error(con,i))
                                        {
                                case SSL_ERROR_NONE:
                                        write(fileno(stdout),buf,
                                                (unsigned int)i);
+                                       if (SSL_pending(con)) goto again;
                                        break;
                                case SSL_ERROR_WANT_WRITE:
                                case SSL_ERROR_WANT_READ:
@@ -755,7 +758,7 @@ err:
        BIO_printf(bio_s_out,"CONNECTION CLOSED\n");
        if (buf != NULL)
                {
-               memset(buf,0,BUFSIZZ);
+               memset(buf,0,bufsize);
                Free(buf);
                }
        if (ret >= 0)
@@ -820,6 +823,10 @@ SSL *con;
        str=SSL_CIPHER_get_name(SSL_get_current_cipher(con));
        BIO_printf(bio_s_out,"CIPHER is %s\n",(str != NULL)?str:"(NONE)");
        if (con->hit) BIO_printf(bio_s_out,"Reused session-id\n");
+       if (SSL_ctrl(con,SSL_CTRL_GET_FLAGS,0,NULL) &
+               TLS1_FLAGS_TLS_PADDING_BUG)
+               BIO_printf(bio_s_out,"Peer has incorrect TLSv1 block padding\n");
+
        return(1);
        }
 
@@ -865,7 +872,7 @@ static int www_body(hostname, s)
 char *hostname;
 int s;
        {
-       char buf[1024];
+       char *buf=NULL;
        int ret=1;
        int i,j,k,blank,dot;
        struct stat st_buf;
@@ -874,6 +881,8 @@ int s;
        BIO *io,*ssl_bio,*sbio;
        long total_bytes;
 
+       buf=Malloc(bufsize);
+       if (buf == NULL) return(0);
        io=BIO_new(BIO_f_buffer());
        ssl_bio=BIO_new(BIO_f_ssl());
        if ((io == NULL) || (ssl_bio == NULL)) goto err;
@@ -891,7 +900,7 @@ int s;
 #endif
 
        /* lets make the output buffer a reasonable size */
-       if (!BIO_set_write_buffer_size(io,253 /*16*1024*/)) goto err;
+       if (!BIO_set_write_buffer_size(io,bufsize)) goto err;
 
        if ((con=(SSL *)SSL_new(ctx)) == NULL) goto err;
 
@@ -937,14 +946,14 @@ int s;
                        case SSL_ERROR_ZERO_RETURN:
                                ret=1;
                                goto err;
-                               break;
+                               /* break; */
                                }
 
                        SSL_renegotiate(con);
                        SSL_write(con,NULL,0);
                        }
 
-               i=BIO_gets(io,buf,sizeof(buf)-1);
+               i=BIO_gets(io,buf,bufsize-1);
                if (i < 0) /* error */
                        {
                        if (!BIO_should_retry(io))
@@ -1004,7 +1013,7 @@ int s;
                                        BIO_puts(io,"\n");
                                }
                        BIO_puts(io,"\n");
-                       p=SSL_get_shared_ciphers(con,buf,sizeof(buf));
+                       p=SSL_get_shared_ciphers(con,buf,bufsize);
                        if (p != NULL)
                                {
                                BIO_printf(io,"---\nCiphers common between both SSL end points:\n");
@@ -1129,9 +1138,10 @@ int s;
                        total_bytes=0;
                        for (;;)
                                {
-                               i=BIO_read(file,buf,1024);
+                               i=BIO_read(file,buf,bufsize);
                                if (i <= 0) break;
 
+#ifdef RENEG
                                total_bytes+=i;
                                fprintf(stderr,"%d\n",i);
                                if (total_bytes > 3*1024)
@@ -1140,6 +1150,7 @@ int s;
                                        fprintf(stderr,"RENEGOTIATE\n");
                                        SSL_renegotiate(con);
                                        }
+#endif
 
                                for (j=0; j<i; )
                                        {
@@ -1194,6 +1205,7 @@ err:
        if (ret >= 0)
                BIO_printf(bio_s_out,"ACCEPT\n");
 
+       if (buf != NULL) Free(buf);
        if (io != NULL) BIO_free_all(io);
 /*     if (ssl_bio != NULL) BIO_free(ssl_bio);*/
        return(ret);
index 7571c208d4b7b1082f74ac92e256ee9097d8bf7d..02f54f9d84f14530c2436ce884ab077fc32bf1fa 100644 (file)
@@ -111,7 +111,8 @@ struct tms {
 #include <sys/select.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
diff --git a/apps/sc.c b/apps/sc.c
new file mode 100644 (file)
index 0000000..0c00c37
--- /dev/null
+++ b/apps/sc.c
@@ -0,0 +1,780 @@
+/* apps/s_client.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define USE_SOCKETS
+#ifdef NO_STDIO
+#define APPS_WIN16
+#endif
+#include "apps.h"
+#include "x509.h"
+#include "ssl.h"
+#include "err.h"
+#include "pem.h"
+#include "s_apps.h"
+
+#ifdef WINDOWS
+/* Most of the #if(n)def WINDOWS put in by Gerrit van Niekerk 
+   <gerritvn@osi.co.za> to support the keyboard under Windows.
+   Tested using Win95, *should* work with NT and Win3.x
+*/
+#include <conio.h>
+#endif
+
+#undef PROG
+#define PROG   s_client_main
+
+/*#define SSL_HOST_NAME        "www.netscape.com" */
+/*#define SSL_HOST_NAME        "193.118.187.102" */
+#define SSL_HOST_NAME  "localhost"
+
+/*#define TEST_CERT "client.pem" */ /* no default cert. */
+
+#undef BUFSIZZ
+#define BUFSIZZ 1024*8
+
+extern int verify_depth;
+extern int verify_error;
+
+#ifdef FIONBIO
+static int c_nbio=0;
+#endif
+static int c_Pause=0;
+static int c_debug=0;
+
+#ifndef NOPROTO
+static void sc_usage(void);
+static void print_stuff(BIO *berr,SSL *con,int full);
+#else
+static void sc_usage();
+static void print_stuff();
+#endif
+
+static BIO *bio_c_out=NULL;
+static int c_quiet=0;
+
+static void sc_usage()
+       {
+       BIO_printf(bio_err,"usage: client args\n");
+       BIO_printf(bio_err,"\n");
+       BIO_printf(bio_err," -host host     - use -connect instead\n");
+       BIO_printf(bio_err," -port port     - use -connect instead\n");
+       BIO_printf(bio_err," -connect host:port - who to connect to (default is %s:%s)\n",SSL_HOST_NAME,PORT_STR);
+
+       BIO_printf(bio_err," -verify arg   - turn on peer certificate verification\n");
+       BIO_printf(bio_err," -cert arg     - certificate file to use, PEM format assumed\n");
+       BIO_printf(bio_err," -key arg      - Private key file to use, PEM format assumed, in cert file if\n");
+       BIO_printf(bio_err,"                 not specified but cert file is.\n");
+       BIO_printf(bio_err," -CApath arg   - PEM format directory of CA's\n");
+       BIO_printf(bio_err," -CAfile arg   - PEM format file of CA's\n");
+       BIO_printf(bio_err," -reconnect    - Drop and re-make the connection with the same Session-ID\n");
+       BIO_printf(bio_err," -pause        - sleep(1) after each read(2) and write(2) system call\n");
+       BIO_printf(bio_err," -debug        - extra output\n");
+       BIO_printf(bio_err," -nbio_test    - more ssl protocol testing\n");
+       BIO_printf(bio_err," -state        - print the 'ssl' states\n");
+#ifdef FIONBIO
+       BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
+#endif
+       BIO_printf(bio_err," -quiet        - no s_client output\n");
+       BIO_printf(bio_err," -ssl2         - just use SSLv2\n");
+       BIO_printf(bio_err," -ssl3         - just use SSLv3\n");
+       BIO_printf(bio_err," -tls1         - just use TLSv1\n");
+       BIO_printf(bio_err," -no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
+       BIO_printf(bio_err," -bugs         - Switch on all SSL implementation bug workarounds\n");
+       BIO_printf(bio_err," -cipher       - prefered cipher to use, use the 'ssleay ciphers'\n");
+       BIO_printf(bio_err,"                 command to see what is available\n");
+
+       }
+
+int MAIN(argc, argv)
+int argc;
+char **argv;
+       {
+       int off=0;
+       SSL *con=NULL,*con2=NULL;
+       int s,k,width,state=0;
+       char *cbuf=NULL,*sbuf=NULL;
+       int cbuf_len,cbuf_off;
+       int sbuf_len,sbuf_off;
+       fd_set readfds,writefds;
+       short port=PORT;
+       int full_log=1;
+       char *host=SSL_HOST_NAME;
+       char *cert_file=NULL,*key_file=NULL;
+       char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
+       int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
+       int write_tty,read_tty,write_ssl,read_ssl,tty_on;
+       SSL_CTX *ctx=NULL;
+       int ret=1,in_init=1,i,nbio_test=0;
+       SSL_METHOD *meth=NULL;
+       BIO *sbio;
+       /*static struct timeval timeout={10,0};*/
+
+#if !defined(NO_SSL2) && !defined(NO_SSL3)
+       meth=SSLv23_client_method();
+#elif !defined(NO_SSL3)
+       meth=SSLv3_client_method();
+#elif !defined(NO_SSL2)
+       meth=SSLv2_client_method();
+#endif
+
+       apps_startup();
+       c_Pause=0;
+       c_quiet=0;
+       c_debug=0;
+
+       if (bio_err == NULL)
+               bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
+
+       if (    ((cbuf=Malloc(BUFSIZZ)) == NULL) ||
+               ((sbuf=Malloc(BUFSIZZ)) == NULL))
+               {
+               BIO_printf(bio_err,"out of memory\n");
+               goto end;
+               }
+
+       verify_depth=0;
+       verify_error=X509_V_OK;
+#ifdef FIONBIO
+       c_nbio=0;
+#endif
+#ifdef WINDOWS
+       c_nbio = 1;
+#endif
+
+       argc--;
+       argv++;
+       while (argc >= 1)
+               {
+               if      (strcmp(*argv,"-host") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       host= *(++argv);
+                       }
+               else if (strcmp(*argv,"-port") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       port=atoi(*(++argv));
+                       if (port == 0) goto bad;
+                       }
+               else if (strcmp(*argv,"-connect") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       if (!extract_host_port(*(++argv),&host,NULL,&port))
+                               goto bad;
+                       }
+               else if (strcmp(*argv,"-verify") == 0)
+                       {
+                       verify=SSL_VERIFY_PEER;
+                       if (--argc < 1) goto bad;
+                       verify_depth=atoi(*(++argv));
+                       BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
+                       }
+               else if (strcmp(*argv,"-cert") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       cert_file= *(++argv);
+                       }
+               else if (strcmp(*argv,"-quiet") == 0)
+                       c_quiet=1;
+               else if (strcmp(*argv,"-pause") == 0)
+                       c_Pause=1;
+               else if (strcmp(*argv,"-debug") == 0)
+                       c_debug=1;
+               else if (strcmp(*argv,"-nbio_test") == 0)
+                       nbio_test=1;
+               else if (strcmp(*argv,"-state") == 0)
+                       state=1;
+#ifndef NO_SSL2
+               else if (strcmp(*argv,"-ssl2") == 0)
+                       meth=SSLv2_client_method();
+#endif
+#ifndef NO_SSL3
+               else if (strcmp(*argv,"-ssl3") == 0)
+                       meth=SSLv3_client_method();
+#endif
+#ifndef NO_TLS1
+               else if (strcmp(*argv,"-tls1") == 0)
+                       meth=TLSv1_client_method();
+#endif
+               else if (strcmp(*argv,"-bugs") == 0)
+                       bugs=1;
+               else if (strcmp(*argv,"-key") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       key_file= *(++argv);
+                       }
+               else if (strcmp(*argv,"-reconnect") == 0)
+                       {
+                       reconnect=5;
+                       }
+               else if (strcmp(*argv,"-CApath") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       CApath= *(++argv);
+                       }
+               else if (strcmp(*argv,"-CAfile") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       CAfile= *(++argv);
+                       }
+               else if (strcmp(*argv,"-no_tls1") == 0)
+                       off|=SSL_OP_NO_TLSv1;
+               else if (strcmp(*argv,"-no_ssl3") == 0)
+                       off|=SSL_OP_NO_SSLv3;
+               else if (strcmp(*argv,"-no_ssl2") == 0)
+                       off|=SSL_OP_NO_SSLv2;
+               else if (strcmp(*argv,"-cipher") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       cipher= *(++argv);
+                       }
+#ifdef FIONBIO
+               else if (strcmp(*argv,"-nbio") == 0)
+                       { c_nbio=1; }
+#endif
+               else
+                       {
+                       BIO_printf(bio_err,"unknown option %s\n",*argv);
+                       badop=1;
+                       break;
+                       }
+               argc--;
+               argv++;
+               }
+       if (badop)
+               {
+bad:
+               sc_usage();
+               goto end;
+               }
+
+       if (bio_c_out == NULL)
+               {
+               if (c_quiet)
+                       {
+                       bio_c_out=BIO_new(BIO_s_null());
+                       }
+               else
+                       {
+                       if (bio_c_out == NULL)
+                               bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
+                       }
+               }
+
+       SSLeay_add_ssl_algorithms();
+       ctx=SSL_CTX_new(meth);
+       if (ctx == NULL)
+               {
+               ERR_print_errors(bio_err);
+               goto end;
+               }
+
+       if (bugs)
+               SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
+       else
+               SSL_CTX_set_options(ctx,off);
+
+       if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
+       if (cipher != NULL)
+               SSL_CTX_set_cipher_list(ctx,cipher);
+#if 0
+       else
+               SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
+#endif
+
+       SSL_CTX_set_verify(ctx,verify,verify_callback);
+       if (!set_cert_stuff(ctx,cert_file,key_file))
+               goto end;
+
+       if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
+               (!SSL_CTX_set_default_verify_paths(ctx)))
+               {
+               /* BIO_printf(bio_err,"error seting default verify locations\n"); */
+               ERR_print_errors(bio_err);
+               /* goto end; */
+               }
+
+       SSL_load_error_strings();
+
+       con=(SSL *)SSL_new(ctx);
+/*     SSL_set_cipher_list(con,"RC4-MD5"); */
+
+re_start:
+
+       if (init_client(&s,host,port) == 0)
+               {
+               BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
+               SHUTDOWN(s);
+               goto end;
+               }
+       BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
+
+#ifdef FIONBIO
+       if (c_nbio)
+               {
+               unsigned long l=1;
+               BIO_printf(bio_c_out,"turning on non blocking io\n");
+               if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
+                       {
+                       ERR_print_errors(bio_err);
+                       goto end;
+                       }
+               }
+#endif                                              
+       if (c_Pause & 0x01) con->debug=1;
+       sbio=BIO_new_socket(s,BIO_NOCLOSE);
+
+       if (nbio_test)
+               {
+               BIO *test;
+
+               test=BIO_new(BIO_f_nbio_test());
+               sbio=BIO_push(test,sbio);
+               }
+
+       if (c_debug)
+               {
+               con->debug=1;
+               BIO_set_callback(sbio,bio_dump_cb);
+               BIO_set_callback_arg(sbio,bio_c_out);
+               }
+
+       SSL_set_bio(con,sbio,sbio);
+       SSL_set_connect_state(con);
+
+       /* ok, lets connect */
+       width=SSL_get_fd(con)+1;
+
+       read_tty=1;
+       write_tty=0;
+       tty_on=0;
+       read_ssl=1;
+       write_ssl=1;
+       
+       cbuf_len=0;
+       cbuf_off=0;
+       sbuf_len=0;
+       sbuf_off=0;
+
+       for (;;)
+               {
+               FD_ZERO(&readfds);
+               FD_ZERO(&writefds);
+
+               if (SSL_in_init(con) && !SSL_total_renegotiations(con))
+                       {
+                       in_init=1;
+                       tty_on=0;
+                       }
+               else
+                       {
+                       tty_on=1;
+                       if (in_init)
+                               {
+                               in_init=0;
+                               print_stuff(bio_c_out,con,full_log);
+                               if (full_log > 0) full_log--;
+
+                               if (reconnect)
+                                       {
+                                       reconnect--;
+                                       BIO_printf(bio_c_out,"drop connection and then reconnect\n");
+                                       SSL_shutdown(con);
+                                       SSL_set_connect_state(con);
+                                       SHUTDOWN(SSL_get_fd(con));
+                                       goto re_start;
+                                       }
+                               }
+                       }
+
+#ifndef WINDOWS
+               if (tty_on)
+                       {
+                       if (read_tty)  FD_SET(fileno(stdin),&readfds);
+                       if (write_tty) FD_SET(fileno(stdout),&writefds);
+                       }
+#endif
+               if (read_ssl)
+                       FD_SET(SSL_get_fd(con),&readfds);
+               if (write_ssl)
+                       FD_SET(SSL_get_fd(con),&writefds);
+
+/*             printf("mode tty(%d %d%d) ssl(%d%d)\n",
+                       tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
+
+#ifndef WINDOWS
+               i=select(width,&readfds,&writefds,NULL,NULL);
+               if ( i < 0)
+                       {
+                       BIO_printf(bio_err,"bad select %d\n",
+                               get_last_socket_error());
+                       goto shut;
+                       /* goto end; */
+                       }
+
+               if (FD_ISSET(SSL_get_fd(con),&writefds))
+#else
+               if (write_ssl)
+#endif
+                       {
+                       k=SSL_write(con,&(cbuf[cbuf_off]),
+                               (unsigned int)cbuf_len);
+                       switch (SSL_get_error(con,k))
+                               {
+                       case SSL_ERROR_NONE:
+                               cbuf_off+=k;
+                               cbuf_len-=k;
+                               if (k <= 0) goto end;
+                               /* we have done a  write(con,NULL,0); */
+                               if (cbuf_len <= 0)
+                                       {
+                                       read_tty=1;
+                                       write_ssl=0;
+                                       }
+                               else /* if (cbuf_len > 0) */
+                                       {
+                                       read_tty=0;
+                                       write_ssl=1;
+                                       }
+                               break;
+                       case SSL_ERROR_WANT_WRITE:
+#ifndef WINDOWS
+                               BIO_printf(bio_c_out,"write W BLOCK\n");
+#endif
+                               write_ssl=1;
+                               read_tty=0;
+                               break;
+                       case SSL_ERROR_WANT_READ:
+#ifndef WINDOWS
+                               BIO_printf(bio_c_out,"write R BLOCK\n");
+#endif
+                               write_tty=0;
+                               read_ssl=1;
+                               write_ssl=0;
+                               break;
+                       case SSL_ERROR_WANT_X509_LOOKUP:
+                               BIO_printf(bio_c_out,"write X BLOCK\n");
+                               break;
+                       case SSL_ERROR_ZERO_RETURN:
+                               if (cbuf_len != 0)
+                                       {
+                                       BIO_printf(bio_c_out,"shutdown\n");
+                                       goto shut;
+                                       }
+                               else
+                                       {
+                                       read_tty=1;
+                                       write_ssl=0;
+                                       break;
+                                       }
+                               
+                       case SSL_ERROR_SYSCALL:
+                               if ((k != 0) || (cbuf_len != 0))
+                                       {
+                                       BIO_printf(bio_err,"write:errno=%d\n",
+                                               get_last_socket_error());
+                                       goto shut;
+                                       }
+                               else
+                                       {
+                                       read_tty=1;
+                                       write_ssl=0;
+                                       }
+                               break;
+                       case SSL_ERROR_SSL:
+                               ERR_print_errors(bio_err);
+                               goto shut;
+                               }
+                       }
+#ifndef WINDOWS
+               else if (FD_ISSET(fileno(stdout),&writefds))
+#else
+               else if (tty_on && write_tty)
+#endif
+                       {
+                       i=write(fileno(stdout),&(sbuf[sbuf_off]),sbuf_len);
+
+                       if (i <= 0)
+                               {
+                               BIO_printf(bio_c_out,"DONE\n");
+                               goto shut;
+                               /* goto end; */
+                               }
+
+                       sbuf_len-=i;;
+                       sbuf_off+=i;
+                       if (sbuf_len <= 0)
+                               {
+                               read_ssl=1;
+                               write_tty=0;
+                               }
+                       }
+#ifndef WINDOWS
+               else if (FD_ISSET(SSL_get_fd(con),&readfds))
+#else
+               if (read_ssl)
+#endif
+                       {
+#ifdef RENEG
+{ static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
+#endif
+                       k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
+
+                       switch (SSL_get_error(con,k))
+                               {
+                       case SSL_ERROR_NONE:
+                               if (k <= 0)
+                                       goto end;
+                               sbuf_off=0;
+                               sbuf_len=k;
+
+                               read_ssl=0;
+                               write_tty=1;
+                               break;
+                       case SSL_ERROR_WANT_WRITE:
+#ifndef WINDOWS
+                               BIO_printf(bio_c_out,"read W BLOCK\n");
+#endif
+                               write_ssl=1;
+                               read_tty=0;
+                               break;
+                       case SSL_ERROR_WANT_READ:
+#ifndef WINDOWS
+                               BIO_printf(bio_c_out,"read R BLOCK\n");
+#endif
+                               write_tty=0;
+                               read_ssl=1;
+                               if ((read_tty == 0) && (write_ssl == 0))
+                                       write_ssl=1;
+                               break;
+                       case SSL_ERROR_WANT_X509_LOOKUP:
+                               BIO_printf(bio_c_out,"read X BLOCK\n");
+                               break;
+                       case SSL_ERROR_SYSCALL:
+                               BIO_printf(bio_err,"read:errno=%d\n",get_last_socket_error());
+                               goto shut;
+                       case SSL_ERROR_ZERO_RETURN:
+                               BIO_printf(bio_c_out,"closed\n");
+                               goto shut;
+                       case SSL_ERROR_SSL:
+                               ERR_print_errors(bio_err);
+                               goto shut;
+                               break;
+                               }
+                       }
+
+#ifndef WINDOWS
+               else if (FD_ISSET(fileno(stdin),&readfds))
+                       {
+                       i=read(fileno(stdin),cbuf,BUFSIZZ);
+#else
+               if (tty_on && read_tty && _kbhit())
+                       {
+                       i = 1;
+                       cbuf[0] = _getch();
+#endif
+
+                       if ((!c_quiet) && ((i <= 0) || (cbuf[0] == 'Q')))
+                               {
+                               BIO_printf(bio_err,"DONE\n");
+                               goto shut;
+                               }
+
+                       if ((!c_quiet) && (cbuf[0] == 'R'))
+                               {
+                               SSL_renegotiate(con);
+                               read_tty=0;
+                               write_ssl=1;
+                               }
+                       else
+                               {
+                               cbuf_len=i;
+                               cbuf_off=0;
+                               }
+
+                       read_tty=0;
+                       write_ssl=1;
+                       }
+               }
+shut:
+       SSL_shutdown(con);
+       SHUTDOWN(SSL_get_fd(con));
+       ret=0;
+end:
+       if (con != NULL) SSL_free(con);
+       if (con2 != NULL) SSL_free(con2);
+       if (ctx != NULL) SSL_CTX_free(ctx);
+       if (cbuf != NULL) { memset(cbuf,0,BUFSIZZ); Free(cbuf); }
+       if (sbuf != NULL) { memset(sbuf,0,BUFSIZZ); Free(sbuf); }
+       if (bio_c_out != NULL)
+               {
+               BIO_free(bio_c_out);
+               bio_c_out=NULL;
+               }
+       EXIT(ret);
+       }
+
+
+static void print_stuff(bio,s,full)
+BIO *bio;
+SSL *s;
+int full;
+       {
+       X509 *peer=NULL;
+       char *p;
+       static char *space="                ";
+       char buf[BUFSIZ];
+       STACK *sk;
+       SSL_CIPHER *c;
+       X509_NAME *xn;
+       int j,i;
+
+       if (full)
+               {
+               sk=SSL_get_peer_cert_chain(s);
+               if (sk != NULL)
+                       {
+                       BIO_printf(bio,"---\nCertificate chain\n");
+                       for (i=0; i<sk_num(sk); i++)
+                               {
+                               X509_NAME_oneline(X509_get_subject_name((X509 *)
+                                       sk_value(sk,i)),buf,BUFSIZ);
+                               BIO_printf(bio,"%2d s:%s\n",i,buf);
+                               X509_NAME_oneline(X509_get_issuer_name((X509 *)
+                                       sk_value(sk,i)),buf,BUFSIZ);
+                               BIO_printf(bio,"   i:%s\n",buf);
+                               }
+                       }
+
+               BIO_printf(bio,"---\n");
+               peer=SSL_get_peer_certificate(s);
+               if (peer != NULL)
+                       {
+                       BIO_printf(bio,"Server certificate\n");
+                       PEM_write_bio_X509(bio,peer);
+                       X509_NAME_oneline(X509_get_subject_name(peer),
+                               buf,BUFSIZ);
+                       BIO_printf(bio,"subject=%s\n",buf);
+                       X509_NAME_oneline(X509_get_issuer_name(peer),
+                               buf,BUFSIZ);
+                       BIO_printf(bio,"issuer=%s\n",buf);
+                       }
+               else
+                       BIO_printf(bio,"no peer certificate available\n");
+
+               sk=SSL_get_client_CA_list(s);
+               if ((sk != NULL) && (sk_num(sk) > 0))
+                       {
+                       BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
+                       for (i=0; i<sk_num(sk); i++)
+                               {
+                               xn=(X509_NAME *)sk_value(sk,i);
+                               X509_NAME_oneline(xn,buf,sizeof(buf));
+                               BIO_write(bio,buf,strlen(buf));
+                               BIO_write(bio,"\n",1);
+                               }
+                       }
+               else
+                       {
+                       BIO_printf(bio,"---\nNo client certificate CA names sent\n");
+                       }
+               p=SSL_get_shared_ciphers(s,buf,BUFSIZ);
+               if (p != NULL)
+                       {
+                       BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
+                       j=i=0;
+                       while (*p)
+                               {
+                               if (*p == ':')
+                                       {
+                                       BIO_write(bio,space,15-j%25);
+                                       i++;
+                                       j=0;
+                                       BIO_write(bio,((i%3)?" ":"\n"),1);
+                                       }
+                               else
+                                       {
+                                       BIO_write(bio,p,1);
+                                       j++;
+                                       }
+                               p++;
+                               }
+                       BIO_write(bio,"\n",1);
+                       }
+
+               BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
+                       BIO_number_read(SSL_get_rbio(s)),
+                       BIO_number_written(SSL_get_wbio(s)));
+               }
+       BIO_printf(bio,((s->hit)?"---\nReused, ":"---\nNew, "));
+       c=SSL_get_current_cipher(s);
+       BIO_printf(bio,"%s, Cipher is %s\n",
+               SSL_CIPHER_get_version(c),
+               SSL_CIPHER_get_name(c));
+       if (peer != NULL)
+               BIO_printf(bio,"Server public key is %d bit\n",
+                       EVP_PKEY_bits(X509_get_pubkey(peer)));
+       SSL_SESSION_print(bio,SSL_get_session(s));
+       BIO_printf(bio,"---\n");
+       if (peer != NULL)
+               X509_free(peer);
+       }
+
index eabb927036f0ccdedb5ccb9e5ad7e9d7969fd415..c57b32507d0a2d94c9a6ebb4f1e44cd87878c5f7 100644 (file)
@@ -1,17 +1,17 @@
 issuer= /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test CA (1024 bit)
 subject=/C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Server test cert (512 bit)
 -----BEGIN CERTIFICATE-----
-MIIB6TCCAVICAQAwDQYJKoZIhvcNAQEEBQAwWzELMAkGA1UEBhMCQVUxEzARBgNV
+MIIB6TCCAVICAQQwDQYJKoZIhvcNAQEEBQAwWzELMAkGA1UEBhMCQVUxEzARBgNV
 BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRswGQYD
-VQQDExJUZXN0IENBICgxMDI0IGJpdCkwHhcNOTcwNjA5MTM1NzQ2WhcNOTgwNjA5
-MTM1NzQ2WjBjMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDEaMBgG
+VQQDExJUZXN0IENBICgxMDI0IGJpdCkwHhcNOTgwNjI5MjM1MjQwWhcNMDAwNjI4
+MjM1MjQwWjBjMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDEaMBgG
 A1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxIzAhBgNVBAMTGlNlcnZlciB0ZXN0IGNl
 cnQgKDUxMiBiaXQpMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ+zw4Qnlf8SMVIP
 Fe9GEcStgOY2Ww/dgNdhjeD8ckUJNP5VZkVDTGiXav6ooKXfX3j/7tdkuD8Ey2//
-Kv7+ue0CAwEAATANBgkqhkiG9w0BAQQFAAOBgQB4TMR2CvacKE9wAsu9jyCX8YiW
-mgCM+YoP6kt4Zkj2z5IRfm7WrycKsnpnOR+tGeqAjkCeZ6/36o9l91RvPnN1VJ/i
-xQv2df0KFeMr00IkDdTNAdIWqFkSsZTAY2QAdgenb7MB1joejquYzO2DQIO7+wpH
-irObpESxAZLySCmPPg==
+Kv7+ue0CAwEAATANBgkqhkiG9w0BAQQFAAOBgQCVvvfkGSe2GHgDFfmOua4Isjb9
+JVhImWMASiOClkZlMESDJjsszg/6+d/W+8TrbObhazpl95FivXBVucbj9dudh7AO
+IZu1h1MAPlyknc9Ud816vz3FejB4qqUoaXjnlkrIgEbr/un7jSS86WOe0hRhwHkJ
+FUGcPZf9ND22Etc+AQ==
 -----END CERTIFICATE-----
 -----BEGIN RSA PRIVATE KEY-----
 MIIBPAIBAAJBAJ+zw4Qnlf8SMVIPFe9GEcStgOY2Ww/dgNdhjeD8ckUJNP5VZkVD
index 2fad36a4951d714bf674ab5ab1a5926765310102..a606ca3a5cd30186e9c0b46bf47287c8c1d2c9db 100644 (file)
 #undef PROG
 #define PROG   sess_id_main
 
-#define FORMAT_UNDEF   0
-#define FORMAT_ASN1    1
-#define FORMAT_TEXT    2
-#define FORMAT_PEM     3
-
 static char *sess_id_usage[]={
 "usage: crl args\n",
 "\n",
index 00039342475c67889655573b8cca3d4065b88739..9e20b7217c2b57ae23c929d8c353e58453747125 100644 (file)
@@ -60,8 +60,8 @@
 
 #undef SECONDS
 #define SECONDS                3       
-#define RSA_SECONDS    10      
-#define DSA_SECONDS    10      
+#define RSA_SECONDS    10
+#define DSA_SECONDS    10
 
 /* 11-Sep-92 Andrew Daviel   Support for Silicon Graphics IRIX added */
 /* 06-Apr-92 Luke Brennan    Support for VMS and add extra signal calls */
@@ -107,7 +107,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
@@ -361,13 +362,19 @@ char **argv;
        int pr_header=0;
 
        apps_startup();
+#ifdef NO_DSA
+       memset(dsa_key,0,sizeof(dsa_key));
+#endif
 
        if (bio_err == NULL)
                if ((bio_err=BIO_new(BIO_s_file())) != NULL)
                        BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
 
+#ifndef NO_RSA
+       memset(rsa_key,0,sizeof(rsa_key));
        for (i=0; i<RSA_NUM; i++)
                rsa_key[i]=NULL;
+#endif
 
        if ((buf=(unsigned char *)Malloc((int)BUFSIZE)) == NULL)
                {
@@ -679,7 +686,7 @@ char **argv;
                        rsa_doit[i]=0;
                else
                        {
-                       if (rsa_c[i] == 0)
+                       if (rsa_c[i][0] == 0)
                                {
                                rsa_c[i][0]=1;
                                rsa_c[i][1]=20;
@@ -969,6 +976,8 @@ char **argv;
        for (j=0; j<RSA_NUM; j++)
                {
                if (!rsa_doit[j]) continue;
+               rsa_num=RSA_private_encrypt(30,buf,buf2,rsa_key[j],
+                       RSA_PKCS1_PADDING);
                pkey_print_message("private","rsa",rsa_c[j][0],rsa_bits[j],
                        RSA_SECONDS);
 /*             RSA_blinding_on(rsa_key[j],NULL); */
@@ -992,6 +1001,8 @@ char **argv;
                rsa_count=count;
 
 #if 1
+               rsa_num2=RSA_public_decrypt(rsa_num,buf2,buf,rsa_key[j],
+                       RSA_PKCS1_PADDING);
                pkey_print_message("public","rsa",rsa_c[j][1],rsa_bits[j],
                        RSA_SECONDS);
                Time_F(START);
@@ -1031,6 +1042,8 @@ char **argv;
                if (!dsa_doit[j]) continue;
                DSA_generate_key(dsa_key[j]);
 /*             DSA_sign_setup(dsa_key[j],NULL); */
+               rsa_num=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
+                       &kk,dsa_key[j]);
                pkey_print_message("sign","dsa",dsa_c[j][0],dsa_bits[j],
                        DSA_SECONDS);
                Time_F(START);
@@ -1052,6 +1065,8 @@ char **argv;
                dsa_results[j][0]=d/(double)count;
                rsa_count=count;
 
+               rsa_num2=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
+                       kk,dsa_key[j]);
                pkey_print_message("verify","dsa",dsa_c[j][1],dsa_bits[j],
                        DSA_SECONDS);
                Time_F(START);
index eac411b85405b9ee5d18ec5e58dc1e93508db961..739a0e8f31c0f260793de5a824037d604ddc55f6 100644 (file)
@@ -241,6 +241,7 @@ end:
        ERR_remove_state(0);
 
        EVP_cleanup();
+       ERR_free_strings();
 
        CRYPTO_mem_leaks(bio_err);
        if (bio_err != NULL)
index 0b3bfa64f861487d30786b04d40cb6a9d8effc7f..2621d90d31b70e4b229670a5eb3e14406bf66fcf 100644 (file)
@@ -4,6 +4,7 @@
 #
 
 RANDFILE               = $ENV::HOME/.rnd
+oid_file               = $ENV::HOME/.oid
 
 ####################################################################
 [ ca ]
@@ -90,6 +91,8 @@ commonName_max                        = 64
 emailAddress                   = Email Address
 emailAddress_max               = 40
 
+SET-ex3                                = SET extension number 3
+
 [ req_attributes ]
 challengePassword              = A challenge password
 challengePassword_min          = 4
index 8cd675ff0ab9ce486ad0cd3124d438c538c098be..2179110d37b0f0064962d5aaf5e8ba6555068727 100644 (file)
@@ -141,6 +141,7 @@ char **argv;
                X509_LOOKUP_add_dir(lookup,NULL,X509_FILETYPE_DEFAULT);
 
 
+       ERR_clear_error();
        if (argc < 1) check(cert_ctx,NULL);
        else
                for (i=0; i<argc; i++)
index fcf1f08cfb3867e6125f625a4e22d9f509787fac..8d154ea8b3084704359f5701b935b5fb9d4ad534 100644 (file)
@@ -71,7 +71,7 @@ int argc;
 char **argv;
        {
        int i,ret=0;
-       int cflags=0,version=0,date=0,options=0;
+       int cflags=0,version=0,date=0,options=0,platform=0;
 
        apps_startup();
 
@@ -90,11 +90,13 @@ char **argv;
                        cflags=1;
                else if (strcmp(argv[i],"-o") == 0)
                        options=1;
+               else if (strcmp(argv[i],"-p") == 0)
+                       platform=1;
                else if (strcmp(argv[i],"-a") == 0)
-                       date=version=cflags=options=1;
+                       date=version=cflags=options=platform=1;
                else
                        {
-                       BIO_printf(bio_err,"usage:version [-a] [-v] [-b] [-o] [-f]\n");
+                       BIO_printf(bio_err,"usage:version -[avbofp]\n");
                        ret=1;
                        goto end;
                        }
@@ -102,6 +104,7 @@ char **argv;
 
        if (version) printf("%s\n",SSLeay_version(SSLEAY_VERSION));
        if (date)    printf("%s\n",SSLeay_version(SSLEAY_BUILT_ON));
+       if (platform) printf("%s\n",SSLeay_version(SSLEAY_PLATFORM));
        if (options) 
                {
                printf("options:");
index f5e8be106864c8c47c4f68e072cafef6ef1dc5e5..94d57bb3d23441964a1c3881f18d3239597c8379 100644 (file)
 #define        POSTFIX ".srl"
 #define DEF_DAYS       30
 
-#define FORMAT_UNDEF   0
-#define FORMAT_ASN1    1
-#define FORMAT_TEXT    2
-#define FORMAT_PEM     3
-
 #define CERT_HDR       "certificate"
 
 static char *x509_usage[]={
@@ -219,7 +214,7 @@ char **argv;
                        days=atoi(*(++argv));
                        if (days == 0)
                                {
-                               BIO_printf(bio_err,"bad number of days\n");
+                               BIO_printf(STDout,"bad number of days\n");
                                goto bad;
                                }
                        }
@@ -400,9 +395,13 @@ bad:
                X509_gmtime_adj(X509_get_notBefore(x),0);
                X509_gmtime_adj(X509_get_notAfter(x),(long)60*60*24*days);
 
+#if 0
                X509_PUBKEY_free(ci->key);
                ci->key=req->req_info->pubkey;
                req->req_info->pubkey=NULL;
+#else
+               X509_set_pubkey(x,X509_REQ_get_pubkey(req));
+#endif
                }
        else
                x=load_cert(infile,informat);
@@ -445,24 +444,23 @@ bad:
                                {
                                X509_NAME_oneline(X509_get_issuer_name(x),
                                        buf,256);
-                               fprintf(stdout,"issuer= %s\n",buf);
+                               BIO_printf(STDout,"issuer= %s\n",buf);
                                }
                        else if (subject == i) 
                                {
                                X509_NAME_oneline(X509_get_subject_name(x),
                                        buf,256);
-                               fprintf(stdout,"subject=%s\n",buf);
+                               BIO_printf(STDout,"subject=%s\n",buf);
                                }
                        else if (serial == i)
                                {
-                               fprintf(stdout,"serial=");
+                               BIO_printf(STDout,"serial=");
                                i2a_ASN1_INTEGER(STDout,x->cert_info->serialNumber);
-                               fprintf(stdout,"\n");
+                               BIO_printf(STDout,"\n");
                                }
                        else if (hash == i)
                                {
-                               fprintf(stdout,"%08lx\n",
-                                       X509_subject_name_hash(x));
+                               BIO_printf(STDout,"%08lx\n",X509_subject_name_hash(x));
                                }
                        else
 #ifndef NO_RSA
@@ -473,16 +471,16 @@ bad:
                                pkey=X509_get_pubkey(x);
                                if (pkey == NULL)
                                        {
-                                       fprintf(stdout,"Modulus=unavailable\n");
+                                       BIO_printf(bio_err,"Modulus=unavailable\n");
                                        ERR_print_errors(bio_err);
                                        goto end;
                                        }
-                               fprintf(stdout,"Modulus=");
+                               BIO_printf(STDout,"Modulus=");
                                if (pkey->type == EVP_PKEY_RSA)
                                        BN_print(STDout,pkey->pkey.rsa->n);
                                else
-                                       fprintf(stdout,"Wrong Algorithm type");
-                               fprintf(stdout,"\n");
+                                       BIO_printf(STDout,"Wrong Algorithm type");
+                               BIO_printf(STDout,"\n");
                                }
                        else
 #endif
@@ -494,47 +492,49 @@ bad:
 
                                X509_NAME_oneline(X509_get_subject_name(x),
                                        buf,256);
-                               printf("/* subject:%s */\n",buf);
+                               BIO_printf(STDout,"/* subject:%s */\n",buf);
                                m=X509_NAME_oneline(
                                        X509_get_issuer_name(x),buf,256);
-                               printf("/* issuer :%s */\n",buf);
+                               BIO_printf(STDout,"/* issuer :%s */\n",buf);
 
                                z=i2d_X509(x,NULL);
                                m=Malloc(z);
 
                                d=(unsigned char *)m;
                                z=i2d_X509_NAME(X509_get_subject_name(x),&d);
-                               printf("unsigned char XXX_subject_name[%d]={\n",z);
+                               BIO_printf(STDout,"unsigned char XXX_subject_name[%d]={\n",z);
                                d=(unsigned char *)m;
                                for (y=0; y<z; y++)
                                        {
-                                       printf("0x%02X,",d[y]);
-                                       if ((y & 0x0f) == 0x0f) printf("\n");
+                                       BIO_printf(STDout,"0x%02X,",d[y]);
+                                       if ((y & 0x0f) == 0x0f) BIO_printf(STDout,"\n");
                                        }
-                               if (y%16 != 0) printf("\n");
-                               printf("};\n");
+                               if (y%16 != 0) BIO_printf(STDout,"\n");
+                               BIO_printf(STDout,"};\n");
 
                                z=i2d_X509_PUBKEY(X509_get_X509_PUBKEY(x),&d);
-                               printf("unsigned char XXX_public_key[%d]={\n",z);
+                               BIO_printf(STDout,"unsigned char XXX_public_key[%d]={\n",z);
                                d=(unsigned char *)m;
                                for (y=0; y<z; y++)
                                        {
-                                       printf("0x%02X,",d[y]);
-                                       if ((y & 0x0f) == 0x0f) printf("\n");
+                                       BIO_printf(STDout,"0x%02X,",d[y]);
+                                       if ((y & 0x0f) == 0x0f)
+                                               BIO_printf(STDout,"\n");
                                        }
-                               if (y%16 != 0) printf("\n");
-                               printf("};\n");
+                               if (y%16 != 0) BIO_printf(STDout,"\n");
+                               BIO_printf(STDout,"};\n");
 
                                z=i2d_X509(x,&d);
-                               printf("unsigned char XXX_certificate[%d]={\n",z);
+                               BIO_printf(STDout,"unsigned char XXX_certificate[%d]={\n",z);
                                d=(unsigned char *)m;
                                for (y=0; y<z; y++)
                                        {
-                                       printf("0x%02X,",d[y]);
-                                       if ((y & 0x0f) == 0x0f) printf("\n");
+                                       BIO_printf(STDout,"0x%02X,",d[y]);
+                                       if ((y & 0x0f) == 0x0f)
+                                               BIO_printf(STDout,"\n");
                                        }
-                               if (y%16 != 0) printf("\n");
-                               printf("};\n");
+                               if (y%16 != 0) BIO_printf(STDout,"\n");
+                               BIO_printf(STDout,"};\n");
 
                                Free(m);
                                }
@@ -565,10 +565,10 @@ bad:
                                        BIO_printf(bio_err,"out of memory\n");
                                        goto end;
                                        }
-                               fprintf(stdout,"MD5 Fingerprint=");
+                               BIO_printf(STDout,"MD5 Fingerprint=");
                                for (j=0; j<(int)n; j++)
                                        {
-                                       fprintf(stdout,"%02X%c",md[j],
+                                       BIO_printf(STDout,"%02X%c",md[j],
                                                (j+1 == (int)n)
                                                ?'\n':':');
                                        }
@@ -602,6 +602,7 @@ bad:
                                if (CApkey->type == EVP_PKEY_DSA)
                                        digest=EVP_dss1();
 #endif
+                               
                                if (!x509_certify(ctx,CAfile,digest,x,xca,
                                        CApkey,
                                        CAserial,CA_createserial,days))
@@ -802,6 +803,12 @@ int days;
        if (!reqfile && !X509_verify_cert(&xsc))
                goto end;
 
+       if (!X509_check_private_key(xca,pkey))
+               {
+               BIO_printf(bio_err,"CA certificate and CA private key do not match\n");
+               goto end;
+               }
+
        if (!X509_set_issuer_name(x,X509_get_subject_name(xca))) goto end;
        if (!X509_set_serialNumber(x,bs)) goto end;
 
@@ -856,15 +863,15 @@ X509_STORE_CTX *ctx;
         * DEPTH_ZERO_SELF_.... */
        if (ok)
                {
-               printf("error with certificate to be certified - should be self signed\n");
+               BIO_printf(bio_err,"error with certificate to be certified - should be self signed\n");
                return(0);
                }
        else
                {
                err_cert=X509_STORE_CTX_get_current_cert(ctx);
                X509_NAME_oneline(X509_get_subject_name(err_cert),buf,256);
-               printf("%s\n",buf);
-               printf("error with certificate - error %d at depth %d\n%s\n",
+               BIO_printf(bio_err,"%s\n",buf);
+               BIO_printf(bio_err,"error with certificate - error %d at depth %d\n%s\n",
                        err,X509_STORE_CTX_get_error_depth(ctx),
                        X509_verify_cert_error_string(err));
                return(1);
index 48bd0605df89fc286b122eaa1f7f12ad9984fde8..178239d492a2bda2acd6c6ca82206144571d364b 100644 (file)
@@ -7,6 +7,8 @@
 /* This compiler bug it present on IRIX 5.3, 5.1 and 4.0.5 (these are
  * the only versions of IRIX I have access to.
  * defining FIXBUG removes the bug.
+ * (bug is still present in IRIX 6.3 according to
+ * Gage <agage@forgetmenot.Mines.EDU>
  */
  
 /* Compare the output from
diff --git a/bugs/ultrixcc.c b/bugs/ultrixcc.c
new file mode 100644 (file)
index 0000000..7ba75b1
--- /dev/null
@@ -0,0 +1,45 @@
+#include <stdio.h>
+
+/* This is a cc optimiser bug for ultrix 4.3, mips CPU.
+ * What happens is that the compiler, due to the (a)&7,
+ * does
+ * i=a&7;
+ * i--;
+ * i*=4;
+ * Then uses i as the offset into a jump table.
+ * The problem is that a value of 0 generates an offset of
+ * 0xfffffffc.
+ */
+
+main()
+       {
+       f(5);
+       f(0);
+       }
+
+int f(a)
+int a;
+       {
+       switch(a&7)
+               {
+       case 7:
+               printf("7\n");
+       case 6:
+               printf("6\n");
+       case 5:
+               printf("5\n");
+       case 4:
+               printf("4\n");
+       case 3:
+               printf("3\n");
+       case 2:
+               printf("2\n");
+       case 1:
+               printf("1\n");
+#ifdef FIX_BUG
+       case 0:
+               ;
+#endif
+               }
+       }       
+
diff --git a/certs/expired/ICE-CA.pem b/certs/expired/ICE-CA.pem
new file mode 100644 (file)
index 0000000..7565236
--- /dev/null
@@ -0,0 +1,59 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1 (0x1)
+        Signature Algorithm: md5WithRSAEncryption
+        Issuer: O=European ICE-TEL project, OU=V3-Certification Authority
+        Validity
+            Not Before: Apr  2 17:35:53 1997 GMT
+            Not After : Apr  2 17:35:53 1998 GMT
+        Subject: O=European ICE-TEL project, OU=V3-Certification Authority, L=Darmstadt
+        Subject Public Key Info:
+            Public Key Algorithm: rsa
+            RSA Public Key: (512 bit)
+                Modulus (512 bit):
+                    00:82:75:ba:f6:d1:60:b5:f9:15:b3:6a:dd:29:8f:
+                    8b:a4:6f:1a:88:e0:50:43:40:0b:79:41:d5:d3:16:
+                    44:7d:74:65:17:42:06:52:0b:e9:50:c8:10:cd:24:
+                    e2:ae:8d:22:30:73:e6:b4:b7:93:1f:e5:6e:a2:ae:
+                    49:11:a5:c9:45
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Authority Key Identifier: 
+                0.........z.."p......e..
+            X509v3 Subject Key Identifier: 
+                ..~r..:..B.44fu......3
+            X509v3 Key Usage: critical
+                ....
+            X509v3 Certificate Policies: critical
+                0.0...*...
+            X509v3 Subject Alternative Name: 
+                0!..secude-support@darmstadt.gmd.de
+            X509v3 Issuer Alternative Name: 
+                0I..ice-tel-ca@darmstadt.gmd.de.*http://www.darmstadt.gmd.de/ice-tel/euroca
+            X509v3 Basic Constraints: critical
+                0....
+            X509v3 CRL Distribution Points: 
+                0200...,.*http://www.darmstadt.gmd.de/ice-tel/euroca
+    Signature Algorithm: md5WithRSAEncryption
+        17:a2:88:b7:99:5a:05:41:e4:13:34:67:e6:1f:3e:26:ec:4b:
+        69:f9:3e:28:22:be:9d:1c:ab:41:6f:0c:00:85:fe:45:74:f6:
+        98:f0:ce:9b:65:53:4a:50:42:c7:d4:92:bd:d7:a2:a8:3d:98:
+        88:73:cd:60:28:79:a3:fc:48:7a
+-----BEGIN CERTIFICATE-----
+MIICzDCCAnagAwIBAgIBATANBgkqhkiG9w0BAQQFADBIMSEwHwYDVQQKExhFdXJv
+cGVhbiBJQ0UtVEVMIHByb2plY3QxIzAhBgNVBAsTGlYzLUNlcnRpZmljYXRpb24g
+QXV0aG9yaXR5MB4XDTk3MDQwMjE3MzU1M1oXDTk4MDQwMjE3MzU1M1owXDEhMB8G
+A1UEChMYRXVyb3BlYW4gSUNFLVRFTCBwcm9qZWN0MSMwIQYDVQQLExpWMy1DZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTESMBAGA1UEBxMJRGFybXN0YWR0MFkwCgYEVQgB
+AQICAgADSwAwSAJBAIJ1uvbRYLX5FbNq3SmPi6RvGojgUENAC3lB1dMWRH10ZRdC
+BlIL6VDIEM0k4q6NIjBz5rS3kx/lbqKuSRGlyUUCAwEAAaOCATgwggE0MB8GA1Ud
+IwQYMBaAFIr3yNUOx3ro1yJw4AuJ1bbsZbzPMB0GA1UdDgQWBBR+cvL4OoacQog0
+NGZ1w9T80aIRMzAOBgNVHQ8BAf8EBAMCAfYwFAYDVR0gAQH/BAowCDAGBgQqAwQF
+MCoGA1UdEQQjMCGBH3NlY3VkZS1zdXBwb3J0QGRhcm1zdGFkdC5nbWQuZGUwUgYD
+VR0SBEswSYEbaWNlLXRlbC1jYUBkYXJtc3RhZHQuZ21kLmRlhipodHRwOi8vd3d3
+LmRhcm1zdGFkdC5nbWQuZGUvaWNlLXRlbC9ldXJvY2EwDwYDVR0TAQH/BAUwAwEB
+/zA7BgNVHR8ENDAyMDCgLqAshipodHRwOi8vd3d3LmRhcm1zdGFkdC5nbWQuZGUv
+aWNlLXRlbC9ldXJvY2EwDQYJKoZIhvcNAQEEBQADQQAXooi3mVoFQeQTNGfmHz4m
+7Etp+T4oIr6dHKtBbwwAhf5FdPaY8M6bZVNKUELH1JK916KoPZiIc81gKHmj/Eh6
+-----END CERTIFICATE-----
diff --git a/certs/expired/ICE-root.pem b/certs/expired/ICE-root.pem
new file mode 100644 (file)
index 0000000..fa99159
--- /dev/null
@@ -0,0 +1,48 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 0 (0x0)
+        Signature Algorithm: md5WithRSAEncryption
+        Issuer: O=European ICE-TEL project, OU=V3-Certification Authority
+        Validity
+            Not Before: Apr  2 17:33:36 1997 GMT
+            Not After : Apr  2 17:33:36 1998 GMT
+        Subject: O=European ICE-TEL project, OU=V3-Certification Authority
+        Subject Public Key Info:
+            Public Key Algorithm: rsa
+            RSA Public Key: (512 bit)
+                Modulus (512 bit):
+                    00:80:3e:eb:ae:47:a9:fe:10:54:0b:81:8b:9c:2b:
+                    82:ab:3a:61:36:65:8b:f3:73:9f:ac:ac:7a:15:a7:
+                    13:8f:b4:c4:ba:a3:0f:bc:a5:58:8d:cc:b1:93:31:
+                    9e:81:9e:8c:19:61:86:fa:52:73:54:d1:97:76:22:
+                    e7:c7:9f:41:cd
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Subject Key Identifier: 
+                ........z.."p......e..
+            X509v3 Key Usage: critical
+                ....
+            X509v3 Subject Alternative Name: 
+                0I.*http://www.darmstadt.gmd.de/ice-tel/euroca..ice-tel-ca@darmstadt.gmd.de
+            X509v3 Basic Constraints: critical
+                0....
+    Signature Algorithm: md5WithRSAEncryption
+        76:69:61:db:b7:cf:8b:06:9e:d8:8c:96:53:d2:4d:a8:23:a6:
+        03:44:e8:8f:24:a5:c0:84:a8:4b:77:d4:2d:2b:7d:37:91:67:
+        f2:2c:ce:02:31:4c:6b:cc:ce:f2:68:a6:11:11:ab:7d:88:b8:
+        7e:22:9f:25:06:60:bd:79:30:3d
+-----BEGIN CERTIFICATE-----
+MIICFjCCAcCgAwIBAgIBADANBgkqhkiG9w0BAQQFADBIMSEwHwYDVQQKExhFdXJv
+cGVhbiBJQ0UtVEVMIHByb2plY3QxIzAhBgNVBAsTGlYzLUNlcnRpZmljYXRpb24g
+QXV0aG9yaXR5MB4XDTk3MDQwMjE3MzMzNloXDTk4MDQwMjE3MzMzNlowSDEhMB8G
+A1UEChMYRXVyb3BlYW4gSUNFLVRFTCBwcm9qZWN0MSMwIQYDVQQLExpWMy1DZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTBZMAoGBFUIAQECAgIAA0sAMEgCQQCAPuuuR6n+
+EFQLgYucK4KrOmE2ZYvzc5+srHoVpxOPtMS6ow+8pViNzLGTMZ6BnowZYYb6UnNU
+0Zd2IufHn0HNAgMBAAGjgZcwgZQwHQYDVR0OBBYEFIr3yNUOx3ro1yJw4AuJ1bbs
+ZbzPMA4GA1UdDwEB/wQEAwIB9jBSBgNVHREESzBJhipodHRwOi8vd3d3LmRhcm1z
+dGFkdC5nbWQuZGUvaWNlLXRlbC9ldXJvY2GBG2ljZS10ZWwtY2FAZGFybXN0YWR0
+LmdtZC5kZTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBAUAA0EAdmlh27fP
+iwae2IyWU9JNqCOmA0TojySlwISoS3fULSt9N5Fn8izOAjFMa8zO8mimERGrfYi4
+fiKfJQZgvXkwPQ==
+-----END CERTIFICATE-----
diff --git a/certs/expired/ICE-user.pem b/certs/expired/ICE-user.pem
new file mode 100644 (file)
index 0000000..28065fd
--- /dev/null
@@ -0,0 +1,63 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1 (0x1)
+        Signature Algorithm: md5WithRSAEncryption
+        Issuer: O=European ICE-TEL project, OU=V3-Certification Authority, L=Darmstadt
+        Validity
+            Not Before: Apr  2 17:35:59 1997 GMT
+            Not After : Apr  2 17:35:59 1998 GMT
+        Subject: O=European ICE-TEL project, OU=V3-Certification Authority, L=Darmstadt, CN=USER
+        Subject Public Key Info:
+            Public Key Algorithm: rsa
+            RSA Public Key: (512 bit)
+                Modulus (512 bit):
+                    00:a8:a8:53:63:49:1b:93:c3:c3:0b:6c:88:11:55:
+                    de:7e:6a:e2:f9:52:a0:dc:69:25:c4:c8:bf:55:e1:
+                    31:a8:ce:e4:a9:29:85:99:8a:15:9a:de:f6:2f:e1:
+                    b4:50:5f:5e:04:75:a6:f4:76:dc:3c:0e:39:dc:3a:
+                    be:3e:a4:61:8b
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Authority Key Identifier: 
+                0...~r..:..B.44fu......3
+            X509v3 Subject Key Identifier: 
+                ...... .*...1.*.......
+            X509v3 Key Usage: critical
+                ....
+            X509v3 Certificate Policies: critical
+                0.0...*...0.......
+            X509v3 Subject Alternative Name: 
+                0:..user@darmstadt.gmd.de.!http://www.darmstadt.gmd.de/~user
+            X509v3 Issuer Alternative Name: 
+                0....gmdca@gmd.de..http://www.gmd.de..saturn.darmstadt.gmd.de.\1!0...U.
+..European ICE-TEL project1#0!..U....V3-Certification Authority1.0...U....Darmstadt..141.12.62.26
+            X509v3 Basic Constraints: critical
+                0.
+            X509v3 CRL Distribution Points: 
+                0.0.......gmdca@gmd.de
+    Signature Algorithm: md5WithRSAEncryption
+        69:0c:e1:b7:a7:f2:d8:fb:e8:69:c0:13:cd:37:ad:21:06:22:
+        4d:e8:c6:db:f1:04:0b:b7:e0:b3:d6:0c:81:03:ce:c3:6a:3e:
+        c7:e7:24:24:a4:92:64:c2:83:83:06:42:53:0e:6f:09:1e:84:
+        9a:f7:6f:63:9b:94:99:83:d6:a4
+-----BEGIN CERTIFICATE-----
+MIIDTzCCAvmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBcMSEwHwYDVQQKExhFdXJv
+cGVhbiBJQ0UtVEVMIHByb2plY3QxIzAhBgNVBAsTGlYzLUNlcnRpZmljYXRpb24g
+QXV0aG9yaXR5MRIwEAYDVQQHEwlEYXJtc3RhZHQwHhcNOTcwNDAyMTczNTU5WhcN
+OTgwNDAyMTczNTU5WjBrMSEwHwYDVQQKExhFdXJvcGVhbiBJQ0UtVEVMIHByb2pl
+Y3QxIzAhBgNVBAsTGlYzLUNlcnRpZmljYXRpb24gQXV0aG9yaXR5MRIwEAYDVQQH
+EwlEYXJtc3RhZHQxDTALBgNVBAMTBFVTRVIwWTAKBgRVCAEBAgICAANLADBIAkEA
+qKhTY0kbk8PDC2yIEVXefmri+VKg3GklxMi/VeExqM7kqSmFmYoVmt72L+G0UF9e
+BHWm9HbcPA453Dq+PqRhiwIDAQABo4IBmDCCAZQwHwYDVR0jBBgwFoAUfnLy+DqG
+nEKINDRmdcPU/NGiETMwHQYDVR0OBBYEFJfc4B8gjSoRmLUx4Sq/ucIYiMrPMA4G
+A1UdDwEB/wQEAwIB8DAcBgNVHSABAf8EEjAQMAYGBCoDBAUwBgYECQgHBjBDBgNV
+HREEPDA6gRV1c2VyQGRhcm1zdGFkdC5nbWQuZGWGIWh0dHA6Ly93d3cuZGFybXN0
+YWR0LmdtZC5kZS9+dXNlcjCBsQYDVR0SBIGpMIGmgQxnbWRjYUBnbWQuZGWGEWh0
+dHA6Ly93d3cuZ21kLmRlghdzYXR1cm4uZGFybXN0YWR0LmdtZC5kZaRcMSEwHwYD
+VQQKExhFdXJvcGVhbiBJQ0UtVEVMIHByb2plY3QxIzAhBgNVBAsTGlYzLUNlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MRIwEAYDVQQHEwlEYXJtc3RhZHSHDDE0MS4xMi42
+Mi4yNjAMBgNVHRMBAf8EAjAAMB0GA1UdHwQWMBQwEqAQoA6BDGdtZGNhQGdtZC5k
+ZTANBgkqhkiG9w0BAQQFAANBAGkM4ben8tj76GnAE803rSEGIk3oxtvxBAu34LPW
+DIEDzsNqPsfnJCSkkmTCg4MGQlMObwkehJr3b2OblJmD1qQ=
+-----END CERTIFICATE-----
diff --git a/certs/expired/ICE.crl b/certs/expired/ICE.crl
new file mode 100644 (file)
index 0000000..21939e8
--- /dev/null
@@ -0,0 +1,9 @@
+-----BEGIN X509 CRL-----
+MIIBNDCBnjANBgkqhkiG9w0BAQIFADBFMSEwHwYDVQQKExhFdXJvcGVhbiBJQ0Ut
+VEVMIFByb2plY3QxIDAeBgNVBAsTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5Fw05
+NzA2MDkxNDQyNDNaFw05NzA3MDkxNDQyNDNaMCgwEgIBChcNOTcwMzAzMTQ0MjU0
+WjASAgEJFw05NjEwMDIxMjI5MjdaMA0GCSqGSIb3DQEBAgUAA4GBAH4vgWo2Tej/
+i7kbiw4Imd30If91iosjClNpBFwvwUDBclPEeMuYimHbLOk4H8Nofc0fw11+U/IO
+KSNouUDcqG7B64oY7c4SXKn+i1MWOb5OJiWeodX3TehHjBlyWzoNMWCnYA8XqFP1
+mOKp8Jla1BibEZf14+/HqCi2hnZUiEXh
+-----END X509 CRL-----
index 08c70f26742d7ab73b504e2a0d9a6c1bb68e663f..277894d1ff1955ccd86441f872283ea6b25a5d7c 100644 (file)
@@ -1,15 +1,17 @@
+subject=/C=US/O=VeriSign, Inc./OU=Class 1 Public Primary Certification Authority
+notBefore=Jan 29 00:00:00 1996 GMT
+notAfter=Jan  7 23:59:59 2020 GMT
 -----BEGIN CERTIFICATE-----
-MIAwgKADAgECAgEAMA0GCSqGSIb3DQEBBAUAMGIxETAPBgNVBAcTCEludGVybmV0
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xh
-c3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcjAeFw05NjA0MDgxMDIwMjda
-Fw05NzA0MDgxMDIwMjdaMGIxETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5W
-ZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAtIElu
-ZGl2aWR1YWwgU3Vic2NyaWJlcjCAMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2
-FKbPTdAFDdjKI9BvqrQpkmOOLPhvltcunXZLEbE2jVfJw/0cxrr+Hgi6M8qV6r7j
-W80GqLd5HUQq7XPysVKDaBBwZJHXPmv5912dFEObbpdFmIFH0S3L3bty10w/cari
-QPJUObwW7s987LrbP2wqsxaxhhKdrpM01bjV0Pc+qQIDAQABAAAAADANBgkqhkiG
-9w0BAQQFAAOBgQA+1nJryNt8VBRjRr07ArDAV/3jAH7GjDc9jsrxZS68ost9v06C
-TvTNKGL+LISNmFLXl+JXhgGB0JZ9fvyYzNgHQ46HBUng1H6voalfJgS2KdEo50wW
-8EFZYMDkT1k4uynwJqkVN2QJK/2q4/A/VCov5h6SlM8Affg2W+1TLqvqkwAA
+MIICPDCCAaUCEDJQM89Q0VbzXIGtZVxPyCUwDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTIwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0f
+zGVuDLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHi
+TkVWaR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0G
+CSqGSIb3DQEBAgUAA4GBAEtEZmBoZOSYG/OwcuaViXzde7OVwB0u2NgZ0C00PcZQ
+mhCGjKo/O6gE/DdSlcPZydvN8oYGxLEb8IKIMEKOF1AcZHq4PplJdJf8rAJD+5YM
+VgQlDHx8h50kp9jwMim1pN9dokzFFjKoQvZFprY2ueC/ZTaTwtLXa9zeWdaiNfhF
 -----END CERTIFICATE-----
-
index 2386e149d0bf09571e39c66097ef5267280f1581..d8bdd8c812f147c83274f383ae1752ea4180ba8a 100644 (file)
@@ -1,31 +1,18 @@
- subject=/L=Internet/O=VeriSign, Inc./OU=VeriSign Class 2 CA - Individual Subscriber
- issuer= /L=Internet/O=VeriSign, Inc./OU=VeriSign Class 2 CA - Individual Subscriber
-
+subject=/C=US/O=VeriSign, Inc./OU=Class 2 Public Primary Certification Authority
+notBefore=Jan 29 00:00:00 1996 GMT
+notAfter=Jan  7 23:59:59 2004 GMT
 -----BEGIN CERTIFICATE-----
-MIIEkzCCA/ygAwIBAgIRANDTUpSRL3nTFeMrMayFSPAwDQYJKoZIhvcNAQECBQAw
-YjERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQw
-MgYDVQQLEytWZXJpU2lnbiBDbGFzcyAyIENBIC0gSW5kaXZpZHVhbCBTdWJzY3Jp
-YmVyMB4XDTk2MDYwNDAwMDAwMFoXDTk4MDYwNDIzNTk1OVowYjERMA8GA1UEBxMI
-SW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJp
-U2lnbiBDbGFzcyAyIENBIC0gSW5kaXZpZHVhbCBTdWJzY3JpYmVyMIGfMA0GCSqG
-SIb3DQEBAQUAA4GNADCBiQKBgQC6A+2czKGRcYMfm8gdnk+0de99TDDzsqo0v5nb
-RsbUmMcdRQ7nsMbRWe0SAb/9QoLTZ/cJ0iOBqdrkz7UpqqKarVoTSdlSMVM92tWp
-3bJncZHQD1t4xd6lQVdI1/T6R+5J0T1ukOdsI9Jmf+F28S6g3R3L1SFwiHKeZKZv
-z+793wIDAQABo4ICRzCCAkMwggIpBgNVHQMBAf8EggIdMIICGTCCAhUwggIRBgtg
-hkgBhvhFAQcBATCCAgAWggGrVGhpcyBjZXJ0aWZpY2F0ZSBpbmNvcnBvcmF0ZXMg
-YnkgcmVmZXJlbmNlLCBhbmQgaXRzIHVzZSBpcyBzdHJpY3RseSBzdWJqZWN0IHRv
-LCB0aGUgVmVyaVNpZ24gQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQg
-KENQUyksIGF2YWlsYWJsZSBhdDogaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL0NQ
-Uy0xLjA7IGJ5IEUtbWFpbCBhdCBDUFMtcmVxdWVzdHNAdmVyaXNpZ24uY29tOyBv
-ciBieSBtYWlsIGF0IFZlcmlTaWduLCBJbmMuLCAyNTkzIENvYXN0IEF2ZS4sIE1v
-dW50YWluIFZpZXcsIENBIDk0MDQzIFVTQSBUZWwuICsxICg0MTUpIDk2MS04ODMw
-IENvcHlyaWdodCAoYykgMTk5NiBWZXJpU2lnbiwgSW5jLiAgQWxsIFJpZ2h0cyBS
-ZXNlcnZlZC4gQ0VSVEFJTiBXQVJSQU5USUVTIERJU0NMQUlNRUQgYW5kIExJQUJJ
-TElUWSBMSU1JVEVELqAOBgxghkgBhvhFAQcBAQGhDgYMYIZIAYb4RQEHAQECMC8w
-LRYraHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JlcG9zaXRvcnkvQ1BTLTEuMDAU
-BglghkgBhvhCAQEBAf8EBAMCAgQwDQYJKoZIhvcNAQECBQADgYEApRJRkNBqLLgs
-53IR/d18ODdLOWMTZ+QOOxBrq460iBEdUwgF8vmPRX1ku7UiDeNzaLlurE6eFqHq
-2zPyK5j60zfTLVJMWKcQWwTJLjHtXrW8pxhNtFc6Fdvy5ZkHnC/9NIl7/t4U6WqB
-p4y+p7SdMIkEwIZfds0VbnQyX5MRUJY=
+MIICPTCCAaYCEQC6WslMBTuS1qe2307QU5INMA0GCSqGSIb3DQEBAgUAMF8xCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
+c3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05
+NjAxMjkwMDAwMDBaFw0wNDAxMDcyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD
+VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMiBQdWJsaWMgUHJp
+bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEAtlqLow1qI4OAa885h/QhEzMGTCWi7VUSl8WngLn6g8EgoPovFQ18
+oWBrfnks+gYPOq72G2+x0v8vKFJfg31LxHq3+GYfgFT8t8KOWUoUV0bRmpO+QZED
+uxWAk1zr58wIbD8+s0r8/0tsI9VQgiZEGY4jw3HqGSRHBJ51v8imAB8CAwEAATAN
+BgkqhkiG9w0BAQIFAAOBgQC2AB+TV6QHp0DOZUA/VV7t7/pUSaUw1iF8YYfug5ML
+v7Qz8pisnwa/TqjOFIFMywROWMPPX+5815pvy0GKt3+BuP+EYcYnQ2UdDOyxAArd
+G6S7x3ggKLKi3TaVLuFUT79guXdoEZkj6OpS6KoATmdOu5C1RZtG644W78QzWzM9
+1Q==
 -----END CERTIFICATE-----
-
index e6e31879c1c00ccf95e11d4ebf8f9f632e407f81..aa5bb4c1f32bc83d831cc58c2750022b19561f6b 100644 (file)
@@ -1,16 +1,18 @@
- subject=/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
- issuer= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
+subject=/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
+notBefore=Jan 29 00:00:00 1996 GMT
+notAfter=Jan  7 23:59:59 2004 GMT
 -----BEGIN CERTIFICATE-----
-MIICMTCCAZoCBQKhAAABMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVTMRcw
-FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMg
-UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjAxMjkwMDAwMDBa
-Fw05OTEyMzEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2ln
-biwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAyVxZ
-nvIbigEUtBDfBEDb41evakVAj4QMC9Ez2dkRz+4CWB8l9yqoRAWq7AMfeH+ek7ma
-AKojfdashaJjRcdyJ8z0TMZ1cdI5709C8HXfCpDGjiBvmA/4rCNfcCk2pMmG57Ga
-IMtTpYXnPb59mv4kRTPcdhXtD6JxZExlLoFoRacCAwEAATANBgkqhkiG9w0BAQIF
-AAOBgQB1Zmw+0c2B27X4LzZRtvdCvM1Cr9wO+hVs+GeTVzrrtpLotgHKjLeOQ7RJ
-Zfk+7r11Ri7J/CVdqMcvi5uPaM+0nJcYwE3vH9mvgrPmZLiEXIqaB1JDYft0nls6
-NvxMsvwaPxUupVs8G5DsiCnkWRb5zget7Ond2tIxik/W2O8XjQ==
+MIICPTCCAaYCEQDknv3zOugOz6URPhmkJAIyMA0GCSqGSIb3DQEBAgUAMF8xCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
+c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05
+NjAxMjkwMDAwMDBaFw0wNDAxMDcyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD
+VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMgUHJp
+bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEAyVxZnvIbigEUtBDfBEDb41evakVAj4QMC9Ez2dkRz+4CWB8l9yqo
+RAWq7AMfeH+ek7maAKojfdashaJjRcdyJ8z0TMZ1cdI5709C8HXfCpDGjiBvmA/4
+rCNfcCk2pMmG57GaIMtTpYXnPb59mv4kRTPcdhXtD6JxZExlLoFoRacCAwEAATAN
+BgkqhkiG9w0BAQIFAAOBgQBhcOwvP579K+ZoVCGwZ3kIDCCWMYoNer62Jt95LCJp
+STbjl3diYaIy13pUITa6Ask05yXaRDWw0lyAXbOU+Pms7qRgdSoflUkjsUp89LNH
+ciFbfperVKxi513srpvSybIk+4Kt6WcVS7qqpvCXoPawl1cAyAw8CaCCBLpB2veZ
+pA==
 -----END CERTIFICATE-----
diff --git a/certs/vsignss.pem b/certs/vsignss.pem
new file mode 100644 (file)
index 0000000..5de48bf
--- /dev/null
@@ -0,0 +1,17 @@
+subject=/C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority
+notBefore=Nov  9 00:00:00 1994 GMT
+notAfter=Jan  7 23:59:59 2010 GMT
+-----BEGIN CERTIFICATE-----
+MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
+VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
+MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
+BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
+dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
+ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
+0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
+uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
+hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
+YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
+1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
+-----END CERTIFICATE-----
diff --git a/certs/vsigntca.pem b/certs/vsigntca.pem
new file mode 100644 (file)
index 0000000..05acf76
--- /dev/null
@@ -0,0 +1,18 @@
+subject=/O=VeriSign, Inc/OU=www.verisign.com/repository/TestCPS Incorp. By Ref. Liab. LTD./OU=For VeriSign authorized testing only. No assurances (C)VS1997
+notBefore=Mar  4 00:00:00 1997 GMT
+notAfter=Mar  4 23:59:59 2025 GMT
+-----BEGIN CERTIFICATE-----
+MIICTTCCAfcCEEdoCqpuXxnoK27q7d58Qc4wDQYJKoZIhvcNAQEEBQAwgakxFjAU
+BgNVBAoTDVZlcmlTaWduLCBJbmMxRzBFBgNVBAsTPnd3dy52ZXJpc2lnbi5jb20v
+cmVwb3NpdG9yeS9UZXN0Q1BTIEluY29ycC4gQnkgUmVmLiBMaWFiLiBMVEQuMUYw
+RAYDVQQLEz1Gb3IgVmVyaVNpZ24gYXV0aG9yaXplZCB0ZXN0aW5nIG9ubHkuIE5v
+IGFzc3VyYW5jZXMgKEMpVlMxOTk3MB4XDTk3MDMwNDAwMDAwMFoXDTI1MDMwNDIz
+NTk1OVowgakxFjAUBgNVBAoTDVZlcmlTaWduLCBJbmMxRzBFBgNVBAsTPnd3dy52
+ZXJpc2lnbi5jb20vcmVwb3NpdG9yeS9UZXN0Q1BTIEluY29ycC4gQnkgUmVmLiBM
+aWFiLiBMVEQuMUYwRAYDVQQLEz1Gb3IgVmVyaVNpZ24gYXV0aG9yaXplZCB0ZXN0
+aW5nIG9ubHkuIE5vIGFzc3VyYW5jZXMgKEMpVlMxOTk3MFwwDQYJKoZIhvcNAQEB
+BQADSwAwSAJBAMak6xImJx44jMKcbkACy5/CyMA2fqXK4PlzTtCxRq5tFkDzne7s
+cI8oFK/J+gFZNE3bjidDxf07O3JOYG9RGx8CAwEAATANBgkqhkiG9w0BAQQFAANB
+ADT523tENOKrEheZFpsJx1UUjPrG7TwYc/C4NBHrZI4gZJcKVFIfNulftVS6UMYW
+ToLEMaUojc3DuNXHG21PDG8=
+-----END CERTIFICATE-----
diff --git a/config b/config
index 0afbcccb1ddddd632f2277d9c956dc5e7565d950..f403a22451f8ac716e52238041048d3648fd45cf 100755 (executable)
--- a/config
+++ b/config
@@ -4,6 +4,9 @@
 #          which then automatically runs Configure from SSLeay after
 #         mapping the Apache names for OSs into SSLeay names
 #
+# 29-May-97 eay                Added no-asm option
+# 27-May-97 eay                Alpha linux mods
+# ??-May-97 eay                IRIX mods
 # 16-Sep-97 tjh                first cut of merged version
 #
 # Tim Hudson
@@ -30,7 +33,6 @@ RELEASE=`(uname -r) 2>/dev/null` || RELEASE="unknown"
 SYSTEM=`(uname -s) 2>/dev/null`  || SYSTEM="unknown"
 VERSION=`(uname -v) 2>/dev/null` || VERSION="unknown"
 
-
 # Now test for ISC and SCO, since it is has a braindamaged uname.
 #
 # We need to work around FreeBSD 1.1.5.1 
@@ -252,7 +254,27 @@ do
 case "$i" in 
 -d*) PREFIX="debug-";;
 -v*) VERBOSE="true";;
--n*|-t*) TEST="true";;
+-t*) TEST="true";;
+-h*) cat <<EOF
+usage: config [options]
+ -d    Add a debug- prefix to machine choice.
+ -v    Verbose mode.
+ -t    Test mode, do not run the Configure perl script.
+ -h    This help.
+
+Any other text will be passed to ther Configure perl script.
+Usefull options include
+ no-asm Build with no assember code.
+ -Dxxx Add xxx define to compilation.
+ -Lxxx Add xxx library include path to build.
+ -lxxx Add xxx library to build.
+
+eg, to build using RSAref, without assember, building to allow anon-DH
+ciphers and null encryption ciphers,
+ config no-asm -DRSAref -DSSL_ALLOW_ADH -DSSL_ALLOW_ENULL -lrsaref
+EOF
+;;
+*) options=$options" $i" ;;
 esac
 done
 
@@ -276,6 +298,7 @@ fi
 # script above so we end up with values in vars but that would take
 # more time that I want to waste at the moment
 case "$GUESSOS" in
+  alpha-*-linux2) OUT="alpha-gcc" ;;
   *-*-linux2) OUT="linux-elf" ;;
   *-*-linux) OUT="linux-aout" ;;
   sun4*-sun-solaris2) OUT="solaris-sparc-$CC" ;;
@@ -285,11 +308,15 @@ case "$GUESSOS" in
   *86*-*-netbsd) OUT="NetBSD-x86" ;;
   sun3*-*-netbsd) OUT="NetBSD-m68" ;;
   *-*-netbsd) OUT="NetBSD-sparc" ;;
-  *-*-osf) OUT="alpha-$CC" ;;
+  *86*-*-openbsd) OUT="OpenBSD-x86" ;;
+  alpha*-*-openbsd) OUT="OpenBSD-alpha" ;;
+  pmax*-*-openbsd) OUT="OpenBSD-mips" ;;
+  *-*-openbsd) OUT="OpenBSD" ;;
+  *-*-osf) OUT="alpha-cc" ;;
   *-*-unixware*) OUT="unixware-2.0" ;;
   *-sni-sysv4) OUT="SINIX" ;;
+  *-hpux*) OUT="hpux-$CC" ;;
   # these are all covered by the catchall below
-  # *-hpux) OUT="hpux-$CC" ;;
   # *-aix) OUT="aix-$CC" ;;
   # *-dgux) OUT="dgux" ;;
   *) OUT=`echo $GUESSOS | awk -F- '{print $3}'`;;
@@ -302,7 +329,7 @@ fi
 # run Configure to check to see if we need to specify the 
 # compiler for the platform ... in which case we add it on
 # the end ... otherwise we leave it off
-./Configure 2>&1 | grep '$OUT-$CC' > /dev/null
+perl ./Configure 2>&1 | grep "$OUT-$CC" > /dev/null
 if [ $? = "0" ]; then
   OUT="$OUT-$CC"
 fi
@@ -315,9 +342,9 @@ OUT="$PREFIX$OUT"
 echo Configuring for $OUT
 
 if [ "$TEST" = "true" ]; then
-  echo ./Configure $OUT
+  echo ./Configure $OUT $options
 else
-  ./Configure $OUT
+  perl ./Configure $OUT $options
 fi
 
 )
index efdbba38acaa2644fb3657cb5d97955aeebec288..ab821e2ccb7d8fedff57a491bc9d8f8d8a490da9 100644 (file)
@@ -22,7 +22,7 @@ MAKEFILE=     Makefile.ssl
 PEX_LIBS=
 EX_LIBS=
  
-CFLAGS= $(INCLUDE) $(CFLAG) -DCFLAGS=" \"$(CC) $(CFLAG)\" "
+CFLAGS= $(INCLUDE) $(CFLAG) -DCFLAGS=" \"$(CC) $(CFLAG)\" " -DPLATFORM=" \"$(PLATFORM)\" "
 
 ERR=crypto
 ERRC=cpt_err
@@ -34,17 +34,17 @@ SDIRS=      md2 md5 sha mdc2 hmac ripemd \
        bn rsa dsa dh \
        buffer bio stack lhash rand err objects \
        evp pem x509 \
-       asn1 conf txt_db pkcs7
+       asn1 conf txt_db pkcs7 comp
 
 GENERAL=Makefile README
 
 LIB= $(TOP)/libcrypto.a
-LIBSRC=        cryptlib.c mem.c cversion.c ex_data.c $(ERRC).c
-LIBOBJ= cryptlib.o mem.o cversion.o ex_data.o $(ERRC).o
+LIBSRC=        cryptlib.c mem.c cversion.c ex_data.c tmdiff.c $(ERRC).c
+LIBOBJ= cryptlib.o mem.o cversion.o ex_data.o tmdiff.o $(ERRC).o
 
 SRC= $(LIBSRC)
 
-EXHEADER= crypto.h cryptall.h
+EXHEADER= crypto.h cryptall.h tmdiff.h
 HEADER=        cryptlib.h date.h $(EXHEADER)
 
 ALL=    $(GENERAL) $(SRC) $(HEADER)
@@ -61,7 +61,7 @@ subdirs:
        @for i in $(SDIRS) ;\
        do \
        (cd $$i; echo "making all in $$i..."; \
-       $(MAKE) CC='$(CC)' INCLUDES='${INCLUDES}' CFLAG='${CFLAG}' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_MULW='${BN_MULW}' DES_ENC='${DES_ENC}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' AR='${AR}' all ); \
+       $(MAKE) CC='$(CC)' INCLUDES='${INCLUDES}' CFLAG='${CFLAG}' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' BN_ASM='${BN_ASM}' DES_ENC='${DES_ENC}' SHA1_ASM_OBJ='${SHA1_ASM_OBJ}' MD5_ASM_OBJ='${MD5_ASM_OBJ}' RMD160_ASM_OBJ='${RMD160_ASM_OBJ}' BF_ENC='${BF_ENC}' CAST_ENC='${CAST_ENC}' RC4_ENC='${RC4_ENC}' RC5_ENC='${RC5_ENC}' AR='${AR}' all ); \
        done;
 
 files:
index 30751bd156a89bcdb3abef22dda1e2b9d6a85f58..1e9951fc565929bf8506eaf6bcc65de2e0aa375a 100644 (file)
@@ -23,7 +23,7 @@ APPS=
 
 LIB=$(TOP)/libcrypto.a
 LIBSRC=        a_object.c a_bitstr.c a_utctm.c a_int.c a_octet.c a_print.c \
-       a_type.c a_set.c a_dup.c a_d2i_fp.c a_i2d_fp.c \
+       a_type.c a_set.c a_dup.c a_d2i_fp.c a_i2d_fp.c a_bmp.c \
        a_sign.c a_digest.c a_verify.c \
        x_algor.c x_val.c x_pubkey.c x_sig.c x_req.c x_attrib.c \
        x_name.c x_cinf.c x_x509.c x_crl.c x_info.c x_spki.c \
@@ -38,7 +38,7 @@ LIBSRC=       a_object.c a_bitstr.c a_utctm.c a_int.c a_octet.c a_print.c \
        asn1_par.c asn1_lib.c $(ERRC).c a_meth.c a_bytes.c \
        evp_asn1.c
 LIBOBJ= a_object.o a_bitstr.o a_utctm.o a_int.o a_octet.o a_print.o \
-       a_type.o a_set.o a_dup.o a_d2i_fp.o a_i2d_fp.o \
+       a_type.o a_set.o a_dup.o a_d2i_fp.o a_i2d_fp.o a_bmp.o \
        a_sign.o a_digest.o a_verify.o \
        x_algor.o x_val.o x_pubkey.o x_sig.o x_req.o x_attrib.o \
        x_name.o x_cinf.o x_x509.o x_crl.o x_info.o x_spki.o \
index 2c101206511d88686fcdcda0abea4b6277f068d9..275de43eb6c1e27d1e9fec379e6ce979f702e7c8 100644 (file)
@@ -68,27 +68,50 @@ int i2d_ASN1_BIT_STRING(a,pp)
 ASN1_BIT_STRING *a;
 unsigned char **pp;
        {
-       int ret,j,r,bits;
+       int ret,j,r,bits,len;
        unsigned char *p,*d;
 
        if (a == NULL) return(0);
 
-       /* our bit strings are always a multiple of 8 :-) */
-       bits=0;
-       ret=1+a->length;
+       len=a->length;
+
+       if (len > 0)
+               {
+               if (a->flags & ASN1_STRING_FLAG_BITS_LEFT)
+                       {
+                       bits=(int)a->flags&0x07;
+                       }
+               else
+                       {
+                       for ( ; len > 0; len--)
+                               {
+                               if (a->data[len-1]) break;
+                               }
+                       j=a->data[len-1];
+                       if      (j & 0x01) bits=0;
+                       else if (j & 0x02) bits=1;
+                       else if (j & 0x04) bits=2;
+                       else if (j & 0x08) bits=3;
+                       else if (j & 0x10) bits=4;
+                       else if (j & 0x20) bits=5;
+                       else if (j & 0x40) bits=6;
+                       else if (j & 0x80) bits=7;
+                       else bits=0; /* should not happen */
+                       }
+               }
+       else
+               bits=0;
+       ret=1+len;
        r=ASN1_object_size(0,ret,V_ASN1_BIT_STRING);
        if (pp == NULL) return(r);
        p= *pp;
 
        ASN1_put_object(&p,0,ret,V_ASN1_BIT_STRING,V_ASN1_UNIVERSAL);
-       if (bits == 0)
-               j=0;
-       else    j=8-bits;
-       *(p++)=(unsigned char)j;
+       *(p++)=(unsigned char)bits;
        d=a->data;
-       memcpy(p,d,a->length);
-       p+=a->length;
-       if (a->length > 0) p[-1]&=(0xff<<j);
+       memcpy(p,d,len);
+       p+=len;
+       if (len > 0) p[-1]&=(0xff<<bits);
        *pp=p;
        return(r);
        }
@@ -127,6 +150,12 @@ long length;
        if (len < 1) { i=ASN1_R_STRING_TOO_SHORT; goto err; }
 
        i= *(p++);
+       /* We do this to preserve the settings.  If we modify
+        * the settings, via the _set_bit function, we will recalculate
+        * on output */
+       ret->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); /* clear */
+       ret->flags|=(ASN1_STRING_FLAG_BITS_LEFT|(i&0x07)); /* set */
+
        if (len-- > 1) /* using one because of the bits left byte */
                {
                s=(unsigned char *)Malloc((int)len);
@@ -170,6 +199,8 @@ int value;
        v=1<<(7-(n&0x07));
        iv= ~v;
 
+       a->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); /* clear, set on write */
+
        if (a == NULL) return(0);
        if ((a->length < (w+1)) || (a->data == NULL))
                {
diff --git a/crypto/asn1/a_bitstr.orig.c b/crypto/asn1/a_bitstr.orig.c
new file mode 100644 (file)
index 0000000..871e057
--- /dev/null
@@ -0,0 +1,236 @@
+/* crypto/asn1/a_bitstr.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include "cryptlib.h"
+#include "asn1.h"
+
+/* ASN1err(ASN1_F_ASN1_STRING_NEW,ASN1_R_STRING_TOO_SHORT);
+ * ASN1err(ASN1_F_D2I_ASN1_BIT_STRING,ASN1_R_EXPECTING_A_BIT_STRING);
+ */
+
+int i2d_ASN1_BIT_STRING(a,pp)
+ASN1_BIT_STRING *a;
+unsigned char **pp;
+       {
+       int ret,i,j,r,bits,len;
+       unsigned char *p,*d;
+
+       if (a == NULL) return(0);
+
+       len=a->length;
+
+       if ((len > 0)
+               {
+               if (a->flags & ASN1_FG_BITS_LEFT))
+                       {
+                       bits=a->flags&0x07;
+                       }
+               else
+                       {
+                       for ( ; len > 0; len--)
+                               {
+                               if (a->data[len-1]) break;
+                               }
+                       j=a->data[len-1];
+                       if      (j & 0x80) bits=1;
+                       else if (j & 0x40) bits=2;
+                       else if (j & 0x20) bits=3;
+                       else if (j & 0x10) bits=4;
+                       else if (j & 0x08) bits=5;
+                       else if (j & 0x04) bits=6;
+                       else if (j & 0x02) bits=7;
+                       else if (j & 0x01) bits=8;
+                       else bits=0;
+                       }
+               }
+       else
+               bits=0;
+       ret=1+len;
+       r=ASN1_object_size(0,ret,V_ASN1_BIT_STRING);
+       if (pp == NULL) return(r);
+       p= *pp;
+
+       ASN1_put_object(&p,0,ret,V_ASN1_BIT_STRING,V_ASN1_UNIVERSAL);
+       if (bits == 0)
+               j=0;
+       else    j=8-bits;
+       *(p++)=(unsigned char)j;
+       d=a->data;
+       memcpy(p,d,len);
+       p+=len;
+       if (len > 0) p[-1]&=(0xff<<j);
+       *pp=p;
+       return(r);
+       }
+
+ASN1_BIT_STRING *d2i_ASN1_BIT_STRING(a, pp, length)
+ASN1_BIT_STRING **a;
+unsigned char **pp;
+long length;
+       {
+       ASN1_BIT_STRING *ret=NULL;
+       unsigned char *p,*s;
+       long len;
+       int inf,tag,xclass;
+       int i;
+
+       if ((a == NULL) || ((*a) == NULL))
+               {
+               if ((ret=ASN1_BIT_STRING_new()) == NULL) return(NULL);
+               }
+       else
+               ret=(*a);
+
+       p= *pp;
+       inf=ASN1_get_object(&p,&len,&tag,&xclass,length);
+       if (inf & 0x80)
+               {
+               i=ASN1_R_BAD_OBJECT_HEADER;
+               goto err;
+               }
+
+       if (tag != V_ASN1_BIT_STRING)
+               {
+               i=ASN1_R_EXPECTING_A_BIT_STRING;
+               goto err;
+               }
+       if (len < 1) { i=ASN1_R_STRING_TOO_SHORT; goto err; }
+
+       i= *(p++);
+       ret->flag&= ~(ASN1_FG_BITS_LEFT|0x07); /* clear */
+       if (i > 0)
+               ret->flag|=(ASN1_FG_BITS_LEFT|(i&0x07)); /* set */
+
+       if (len-- > 1) /* using one because of the bits left byte */
+               {
+               s=(unsigned char *)Malloc((int)len);
+               if (s == NULL)
+                       {
+                       i=ERR_R_MALLOC_FAILURE;
+                       goto err;
+                       }
+               memcpy(s,p,(int)len);
+               s[len-1]&=(0xff<<i);
+               p+=len;
+               }
+       else
+               s=NULL;
+
+       ret->length=(int)len;
+       if (ret->data != NULL) Free((char *)ret->data);
+       ret->data=s;
+       ret->type=V_ASN1_BIT_STRING;
+       if (a != NULL) (*a)=ret;
+       *pp=p;
+       return(ret);
+err:
+       ASN1err(ASN1_F_D2I_ASN1_BIT_STRING,i);
+       if ((ret != NULL) && ((a == NULL) || (*a != ret)))
+               ASN1_BIT_STRING_free(ret);
+       return(NULL);
+       }
+
+/* These next 2 functions from Goetz Babin-Ebell <babinebell@trustcenter.de>
+ */
+int ASN1_BIT_STRING_set_bit(a,n,value)
+ASN1_BIT_STRING *a;
+int n;
+int value;
+       {
+       int w,v,iv;
+       unsigned char *c;
+
+       w=n/8;
+       v=1<<(7-(n&0x07));
+       iv= ~v;
+
+       a->flag&= ~(ASN1_FG_BITS_LEFT|0x07); /* clear, set on write */
+
+       if (a == NULL) return(0);
+       if ((a->length < (w+1)) || (a->data == NULL))
+               {
+               if (!value) return(1); /* Don't need to set */
+               if (a->data == NULL)
+                       c=(unsigned char *)Malloc(w+1);
+               else
+                       c=(unsigned char *)Realloc(a->data,w+1);
+               if (c == NULL) return(0);
+               a->data=c;
+               a->length=w+1;
+               c[w]=0;
+               }
+       a->data[w]=((a->data[w])&iv)|v;
+       while ((a->length > 0) && (a->data[a->length-1] == 0))
+               a->length--;
+       return(1);
+       }
+
+int ASN1_BIT_STRING_get_bit(a,n)
+ASN1_BIT_STRING *a;
+int n;
+       {
+       int w,v;
+
+       w=n/8;
+       v=1<<(7-(n&0x07));
+       if ((a == NULL) || (a->length < (w+1)) || (a->data == NULL))
+               return(0);
+       return((a->data[w]&v) != 0);
+       }
+
index 774502b1fc49bb8d89c9b680a5d2ffa217821fde..76a6f1cd6658a6737b59fb310b155865b14a3f6d 100644 (file)
@@ -79,10 +79,10 @@ long length;
        ASN1_BMPSTRING *ret=NULL;
 
        ret=(ASN1_BMPSTRING *)d2i_ASN1_bytes((ASN1_STRING **)a,
-       pp,length,V_ASN1_BMPSTRING,V_ASN1_UNIVERSAL);
+               pp,length,V_ASN1_BMPSTRING,V_ASN1_UNIVERSAL);
        if (ret == NULL)
                {
-               ASN1err(ASN1_F_D2I_ASN1_BMPSTRING,ASN1_R_ERROR_STACK);
+               ASN1err(ASN1_F_D2I_ASN1_BMPSTRING,ERR_R_NESTED_ASN1_ERROR);
                return(NULL);
                }
        return(ret);
index 14168d61ad1dd2ce7b409acffae0acd8003a03bd..6bfa98334972a96b877c4b0fa8165dcaa07f25a5 100644 (file)
@@ -60,9 +60,7 @@
 #include "cryptlib.h"
 #include "asn1_mac.h"
 
-/* ASN1err(ASN1_F_ASN1_TYPE_NEW,ASN1_R_ERROR_STACK);
- * ASN1err(ASN1_F_D2I_ASN1_TYPE_BYTES,ASN1_R_ERROR_STACK);
- * ASN1err(ASN1_F_D2I_ASN1_TYPE_BYTES,ASN1_R_WRONG_TYPE);
+/* ASN1err(ASN1_F_D2I_ASN1_TYPE_BYTES,ASN1_R_WRONG_TYPE);
  * ASN1err(ASN1_F_ASN1_COLLATE_PRIMATIVE,ASN1_R_WRONG_TAG);
  */
 
index 4fb7a5fa752098618f75a299e889054c470d77c0..e9de2838d017f741ab46c19b8ac11ce9e90a55b1 100644 (file)
 #include "asn1.h"
 
 /*
- * ASN1err(ASN1_F_D2I_ASN1_HEADER,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_I2D_ASN1_HEADER,ASN1_R_BAD_GET_OBJECT);
- * ASN1err(ASN1_F_I2D_ASN1_HEADER,ASN1_R_BAD_GET_OBJECT);
- * ASN1err(ASN1_F_ASN1_HEADER_NEW,ASN1_R_BAD_GET_OBJECT);
+ * ASN1err(ASN1_F_D2I_ASN1_HEADER,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_I2D_ASN1_HEADER,ERR_R_BAD_GET_ASN1_OBJECT_CALL);
+ * ASN1err(ASN1_F_I2D_ASN1_HEADER,ERR_R_BAD_GET_ASN1_OBJECT_CALL);
+ * ASN1err(ASN1_F_ASN1_HEADER_NEW,ERR_R_BAD_GET_ASN1_OBJECT_CALL);
  */
 
 int i2d_ASN1_HEADER(a,pp)
@@ -110,6 +110,7 @@ long length;
 ASN1_HEADER *ASN1_HEADER_new()
        {
        ASN1_HEADER *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,ASN1_HEADER);
        M_ASN1_New(ret->header,ASN1_OCTET_STRING_new);
index df79cf99bbbcdf546e401947d96bdd26d343e91d..e847efee85dfb92b5aa5cb1435469466e574a969 100644 (file)
@@ -279,7 +279,7 @@ ASN1_INTEGER *ai;
                ret=ai;
        if (ret == NULL)
                {
-               ASN1err(ASN1_F_BN_TO_ASN1_INTEGER,ASN1_R_ERROR_STACK);
+               ASN1err(ASN1_F_BN_TO_ASN1_INTEGER,ERR_R_NESTED_ASN1_ERROR);
                goto err;
                }
        ret->type=V_ASN1_INTEGER;
index 5a7eeef8d8b08b8620a87392f84268fd00e66d90..a476960d9aa1a2287a6267225050bf555e6c7af9 100644 (file)
@@ -382,8 +382,8 @@ char *sn,*ln;
        o.data=data;
        o.nid=nid;
        o.length=len;
-       o.flags=ASN1_OBJECT_FLAG_DYNAMIC|
-               ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|ASN1_OBJECT_FLAG_DYNAMIC_DATA;
+       o.flags=ASN1_OBJECT_FLAG_DYNAMIC|ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|
+               ASN1_OBJECT_FLAG_DYNAMIC_DATA;
        return(OBJ_dup(&o));
        }
 
index be3f172a8c490c76d5a3a968150414889d949a48..5954c7bee08d519febd712b6588ba54a87f229f8 100644 (file)
@@ -82,7 +82,7 @@ long length;
                pp,length,V_ASN1_OCTET_STRING,V_ASN1_UNIVERSAL);
        if (ret == NULL)
                {
-               ASN1err(ASN1_F_D2I_ASN1_OCTET_STRING,ASN1_R_ERROR_STACK);
+               ASN1err(ASN1_F_D2I_ASN1_OCTET_STRING,ERR_R_NESTED_ASN1_ERROR);
                return(NULL);
                }
        return(ret);
index 17c49946cf404df05d950b05807f1abf5606d15e..7fd4807e52a724398caf7f3aee2f4db8e4454200 100644 (file)
@@ -89,11 +89,12 @@ int ex_class;
        return(r);
        }
 
-STACK *d2i_ASN1_SET(a,pp,length,func,ex_tag,ex_class)
+STACK *d2i_ASN1_SET(a,pp,length,func,free_func,ex_tag,ex_class)
 STACK **a;
 unsigned char **pp;
 long length;
 char *(*func)();
+void (*free_func)();
 int ex_tag;
 int ex_class;
        {
@@ -136,14 +137,25 @@ int ex_class;
                char *s;
 
                if (M_ASN1_D2I_end_sequence()) break;
-               if ((s=func(NULL,&c.p,c.slen,c.max-c.p)) == NULL) goto err;
+               if ((s=func(NULL,&c.p,c.slen,c.max-c.p)) == NULL)
+                       {
+                       ASN1err(ASN1_F_D2I_ASN1_SET,ASN1_R_ERROR_PARSING_SET_ELEMENT);
+                       asn1_add_error(*pp,(int)(c.q- *pp));
+                       goto err;
+                       }
                if (!sk_push(ret,s)) goto err;
                }
        if (a != NULL) (*a)=ret;
        *pp=c.p;
        return(ret);
 err:
-       if ((ret != NULL) && ((a == NULL) || (*a != ret))) sk_free(ret);
+       if ((ret != NULL) && ((a == NULL) || (*a != ret)))
+               {
+               if (free_func != NULL)
+                       sk_pop_free(ret,free_func);
+               else
+                       sk_free(ret);
+               }
        return(NULL);
        }
 
index 02188e68c48526c64302351e745a453dd8161fe3..c2ff9783ac867d84a7c1d9b8ee97ee54914c038f 100644 (file)
@@ -136,7 +136,11 @@ EVP_MD *type;
        signature->data=buf_out;
        buf_out=NULL;
        signature->length=outl;
-
+       /* In the interests of compatability, I'll make sure that
+        * the bit string has a 'not-used bits' value of 0
+        */
+       signature->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07);
+       signature->flags|=ASN1_STRING_FLAG_BITS_LEFT;
 err:
        memset(&ctx,0,sizeof(ctx));
        if (buf_in != NULL)
index 7c0004084c2dc802b5d46ab9a14cdc6837bef15e..7ddf5f9917dcffc6042909bf6d8c560c906d27ea 100644 (file)
@@ -60,9 +60,7 @@
 #include "cryptlib.h"
 #include "asn1_mac.h"
 
-/* ASN1err(ASN1_F_ASN1_TYPE_NEW,ASN1_R_ERROR_STACK);
- * ASN1err(ASN1_F_D2I_ASN1_BYTES,ASN1_R_ERROR_STACK);
- * ASN1err(ASN1_F_D2I_ASN1_BYTES,ASN1_R_WRONG_TAG);
+/* ASN1err(ASN1_F_D2I_ASN1_BYTES,ASN1_R_WRONG_TAG);
  * ASN1err(ASN1_F_ASN1_COLLATE_PRIMATIVE,ASN1_R_WRONG_TAG);
  */
 
@@ -252,6 +250,7 @@ err:
 ASN1_TYPE *ASN1_TYPE_new()
        {
        ASN1_TYPE *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,ASN1_TYPE);
        ret->type= -1;
@@ -304,14 +303,20 @@ ASN1_TYPE *a;
                case V_ASN1_NEG_INTEGER:
                case V_ASN1_BIT_STRING:
                case V_ASN1_OCTET_STRING:
+               case V_ASN1_SEQUENCE:
+               case V_ASN1_SET:
+               case V_ASN1_NUMERICSTRING:
                case V_ASN1_PRINTABLESTRING:
                case V_ASN1_T61STRING:
+               case V_ASN1_VIDEOTEXSTRING:
                case V_ASN1_IA5STRING:
-               case V_ASN1_UNIVERSALSTRING:
-               case V_ASN1_GENERALSTRING:
                case V_ASN1_UTCTIME:
-               case V_ASN1_SET:
-               case V_ASN1_SEQUENCE:
+               case V_ASN1_GENERALIZEDTIME:
+               case V_ASN1_GRAPHICSTRING:
+               case V_ASN1_VISIBLESTRING:
+               case V_ASN1_GENERALSTRING:
+               case V_ASN1_UNIVERSALSTRING:
+               case V_ASN1_BMPSTRING:
                        ASN1_STRING_free((ASN1_STRING *)a->value.ptr);
                        break;
                default:
index 17a7abbb679df027b91b6e5f9ca124f0c174e78b..ddd1a4016b9cf0e340ea05f4db627b96e183e897 100644 (file)
@@ -85,7 +85,7 @@ long length;
                V_ASN1_UTCTIME,V_ASN1_UNIVERSAL);
        if (ret == NULL)
                {
-               ASN1err(ASN1_F_D2I_ASN1_UTCTIME,ASN1_R_ERROR_STACK);
+               ASN1err(ASN1_F_D2I_ASN1_UTCTIME,ERR_R_NESTED_ASN1_ERROR);
                return(NULL);
                }
        if (!ASN1_UTCTIME_check(ret))
@@ -180,7 +180,7 @@ time_t t;
        {
        char *p;
        struct tm *ts;
-#if defined(THREADS)
+#if defined(THREADS) && !defined(WIN32)
        struct tm data;
 #endif
 
@@ -189,7 +189,7 @@ time_t t;
        if (s == NULL)
                return(NULL);
 
-#if defined(THREADS)
+#if defined(THREADS) && !defined(WIN32)
        ts=(struct tm *)gmtime_r(&t,&data);
 #else
        ts=(struct tm *)gmtime(&t);
index c8b70114885dc5cc23e546f2fc56c8f7dbbbab1f..1f5af96941fe18312da79516eeba1948940687d5 100644 (file)
 
 /* Reason codes. */
 #define ASN1_R_BAD_CLASS                                100
-#define ASN1_R_BAD_GET_OBJECT                           101
-#define ASN1_R_BAD_OBJECT_HEADER                        102
-#define ASN1_R_BAD_PASSWORD_READ                        103
-#define ASN1_R_BAD_PKCS7_CONTENT                        104
-#define ASN1_R_BAD_PKCS7_TYPE                           105
-#define ASN1_R_BAD_TAG                                  106
-#define ASN1_R_BAD_TYPE                                         107
-#define ASN1_R_BN_LIB                                   108
-#define ASN1_R_BOOLEAN_IS_WRONG_LENGTH                  109
-#define ASN1_R_BUFFER_TOO_SMALL                                 110
-#define ASN1_R_DATA_IS_WRONG                            111
-#define ASN1_R_DECODING_ERROR                           112
-#define ASN1_R_ERROR_STACK                              113
-#define ASN1_R_EXPECTING_AN_INTEGER                     114
-#define ASN1_R_EXPECTING_AN_OBJECT                      115
-#define ASN1_R_EXPECTING_AN_OCTET_STRING                116
-#define ASN1_R_EXPECTING_A_BIT_STRING                   117
-#define ASN1_R_EXPECTING_A_BOOLEAN                      118
-#define ASN1_R_EXPECTING_A_SEQUENCE                     119
-#define ASN1_R_EXPECTING_A_UTCTIME                      120
-#define ASN1_R_FIRST_NUM_TOO_LARGE                      121
-#define ASN1_R_HEADER_TOO_LONG                          122
-#define ASN1_R_INVALID_DIGIT                            123
-#define ASN1_R_INVALID_SEPARATOR                        124
-#define ASN1_R_INVALID_TIME_FORMAT                      125
-#define ASN1_R_IV_TOO_LARGE                             126
-#define ASN1_R_LENGTH_ERROR                             127
-#define ASN1_R_LENGTH_MISMATCH                          128
-#define ASN1_R_MISSING_EOS                              129
-#define ASN1_R_MISSING_SECOND_NUMBER                    130
-#define ASN1_R_NON_HEX_CHARACTERS                       131
-#define ASN1_R_NOT_ENOUGH_DATA                          132
-#define ASN1_R_ODD_NUMBER_OF_CHARS                      133
-#define ASN1_R_PARSING                                  134
-#define ASN1_R_PRIVATE_KEY_HEADER_MISSING               135
-#define ASN1_R_SECOND_NUMBER_TOO_LARGE                  136
-#define ASN1_R_SHORT_LINE                               137
-#define ASN1_R_STRING_TOO_SHORT                                 138
-#define ASN1_R_TAG_VALUE_TOO_HIGH                       139
-#define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 140
-#define ASN1_R_TOO_LONG                                         141
-#define ASN1_R_UNABLE_TO_DECODE_RSA_KEY                         142
-#define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY                 143
-#define ASN1_R_UNKNOWN_ATTRIBUTE_TYPE                   144
-#define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM                 145
-#define ASN1_R_UNKNOWN_OBJECT_TYPE                      146
-#define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE                  147
-#define ASN1_R_UNSUPPORTED_CIPHER                       148
-#define ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM                 149
-#define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE              150
-#define ASN1_R_UTCTIME_TOO_LONG                                 151
-#define ASN1_R_WRONG_PRINTABLE_TYPE                     152
-#define ASN1_R_WRONG_TAG                                153
-#define ASN1_R_WRONG_TYPE                               154
+#define ASN1_R_BAD_OBJECT_HEADER                        101
+#define ASN1_R_BAD_PASSWORD_READ                        102
+#define ASN1_R_BAD_PKCS7_CONTENT                        103
+#define ASN1_R_BAD_PKCS7_TYPE                           104
+#define ASN1_R_BAD_TAG                                  105
+#define ASN1_R_BAD_TYPE                                         106
+#define ASN1_R_BN_LIB                                   107
+#define ASN1_R_BOOLEAN_IS_WRONG_LENGTH                  108
+#define ASN1_R_BUFFER_TOO_SMALL                                 109
+#define ASN1_R_DATA_IS_WRONG                            110
+#define ASN1_R_DECODING_ERROR                           111
+#define ASN1_R_ERROR_PARSING_SET_ELEMENT                112
+#define ASN1_R_EXPECTING_AN_INTEGER                     113
+#define ASN1_R_EXPECTING_AN_OBJECT                      114
+#define ASN1_R_EXPECTING_AN_OCTET_STRING                115
+#define ASN1_R_EXPECTING_A_BIT_STRING                   116
+#define ASN1_R_EXPECTING_A_BOOLEAN                      117
+#define ASN1_R_EXPECTING_A_UTCTIME                      118
+#define ASN1_R_FIRST_NUM_TOO_LARGE                      119
+#define ASN1_R_HEADER_TOO_LONG                          120
+#define ASN1_R_INVALID_DIGIT                            121
+#define ASN1_R_INVALID_SEPARATOR                        122
+#define ASN1_R_INVALID_TIME_FORMAT                      123
+#define ASN1_R_IV_TOO_LARGE                             124
+#define ASN1_R_LENGTH_ERROR                             125
+#define ASN1_R_MISSING_SECOND_NUMBER                    126
+#define ASN1_R_NON_HEX_CHARACTERS                       127
+#define ASN1_R_NOT_ENOUGH_DATA                          128
+#define ASN1_R_ODD_NUMBER_OF_CHARS                      129
+#define ASN1_R_PARSING                                  130
+#define ASN1_R_PRIVATE_KEY_HEADER_MISSING               131
+#define ASN1_R_SECOND_NUMBER_TOO_LARGE                  132
+#define ASN1_R_SHORT_LINE                               133
+#define ASN1_R_STRING_TOO_SHORT                                 134
+#define ASN1_R_TAG_VALUE_TOO_HIGH                       135
+#define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 136
+#define ASN1_R_TOO_LONG                                         137
+#define ASN1_R_UNABLE_TO_DECODE_RSA_KEY                         138
+#define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY                 139
+#define ASN1_R_UNKNOWN_ATTRIBUTE_TYPE                   140
+#define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM                 141
+#define ASN1_R_UNKNOWN_OBJECT_TYPE                      142
+#define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE                  143
+#define ASN1_R_UNSUPPORTED_CIPHER                       144
+#define ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM                 145
+#define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE              146
+#define ASN1_R_UTCTIME_TOO_LONG                                 147
+#define ASN1_R_WRONG_PRINTABLE_TYPE                     148
+#define ASN1_R_WRONG_TAG                                149
+#define ASN1_R_WRONG_TYPE                               150
index 9793db365d35cd9a89114cc49f1a2d7742b0c6fe..0aa1ca043dba192cbf91dd1b8e66c7fdaf415299 100644 (file)
@@ -122,101 +122,6 @@ extern "C" {
 #define B_ASN1_BMPSTRING       0x0800
 #define B_ASN1_UNKNOWN         0x1000
 
-#ifndef DEBUG
-
-#define ASN1_INTEGER           ASN1_STRING
-#define ASN1_BIT_STRING                ASN1_STRING
-#define ASN1_OCTET_STRING      ASN1_STRING
-#define ASN1_PRINTABLESTRING   ASN1_STRING
-#define ASN1_T61STRING         ASN1_STRING
-#define ASN1_IA5STRING         ASN1_STRING
-#define ASN1_UTCTIME           ASN1_STRING
-#define ASN1_GENERALIZEDTIME   ASN1_STRING
-#define ASN1_GENERALSTRING     ASN1_STRING
-#define ASN1_UNIVERSALSTRING   ASN1_STRING
-#define ASN1_BMPSTRING         ASN1_STRING
-
-#else
-
-typedef struct asn1_integer_st
-       {
-       int length;
-       int type;
-       unsigned char *data;
-       } ASN1_INTEGER;
-
-typedef struct asn1_bit_string_st
-       {
-       int length;
-       int type;
-       unsigned char *data;
-       } ASN1_BIT_STRING;
-
-typedef struct asn1_octet_string_st
-       {
-       int length;
-       int type;
-       unsigned char *data;
-       } ASN1_OCTET_STRING;
-
-typedef struct asn1_printablestring_st
-       {
-       int length;
-       int type;
-       unsigned char *data;
-       } ASN1_PRINTABLESTRING;
-
-typedef struct asn1_t61string_st
-       {
-       int length;
-       int type;
-       unsigned char *data;
-       } ASN1_T61STRING;
-
-typedef struct asn1_ia5string_st
-       {
-       int length;
-       int type;
-       unsigned char *data;
-       } ASN1_IA5STRING;
-
-typedef struct asn1_generalstring_st
-       {
-       int length;
-       int type;
-       unsigned char *data;
-       } ASN1_GENERALSTRING;
-
-typedef struct asn1_universalstring_st
-       {
-       int length;
-       int type;
-       unsigned char *data;
-       } ASN1_UNIVERSALSTRING;
-
-typedef struct asn1_bmpstring_st
-       {
-       int length;
-       int type;
-       unsigned char *data;
-       } ASN1_BMPSTRING;
-
-typedef struct asn1_utctime_st
-       {
-       int length;
-       int type;
-       unsigned char *data;
-       } ASN1_UTCTIME;
-
-typedef struct asn1_generalizedtime_st
-       {
-       int length;
-       int type;
-       unsigned char *data;
-       } ASN1_GENERALIZEDTIME;
-
-#endif
-
 typedef struct asn1_ctx_st
        {
        unsigned char *p;/* work char pointer */
@@ -229,6 +134,7 @@ typedef struct asn1_ctx_st
        unsigned char *max; /* largest value of p alowed */
        unsigned char *q;/* temporary variable */
        unsigned char **pp;/* variable */
+       int line;       /* used in error processing */
        } ASN1_CTX;
 
 /* These are used internally in the ASN1_OBJECT to keep track of
@@ -246,14 +152,46 @@ typedef struct asn1_object_st
        int flags;      /* Should we free this one */
        } ASN1_OBJECT;
 
+#define ASN1_STRING_FLAG_BITS_LEFT 0x08 /* Set if 0x07 has bits left value */
 /* This is the base type that holds just about everything :-) */
 typedef struct asn1_string_st
        {
        int length;
        int type;
        unsigned char *data;
+       /* The value of the following field depends on the type being
+        * held.  It is mostly being used for BIT_STRING so if the
+        * input data has a non-zero 'unused bits' value, it will be
+        * handled correctly */
+       long flags;
        } ASN1_STRING;
 
+#ifndef DEBUG
+#define ASN1_INTEGER           ASN1_STRING
+#define ASN1_BIT_STRING                ASN1_STRING
+#define ASN1_OCTET_STRING      ASN1_STRING
+#define ASN1_PRINTABLESTRING   ASN1_STRING
+#define ASN1_T61STRING         ASN1_STRING
+#define ASN1_IA5STRING         ASN1_STRING
+#define ASN1_UTCTIME           ASN1_STRING
+#define ASN1_GENERALIZEDTIME   ASN1_STRING
+#define ASN1_GENERALSTRING     ASN1_STRING
+#define ASN1_UNIVERSALSTRING   ASN1_STRING
+#define ASN1_BMPSTRING         ASN1_STRING
+#else
+typedef struct asn1_string_st ASN1_INTEGER;
+typedef struct asn1_string_st ASN1_BIT_STRING;
+typedef struct asn1_string_st ASN1_OCTET_STRING;
+typedef struct asn1_string_st ASN1_PRINTABLESTRING;
+typedef struct asn1_string_st ASN1_T61STRING;
+typedef struct asn1_string_st ASN1_IA5STRING;
+typedef struct asn1_string_st ASN1_GENERALSTRING;
+typedef struct asn1_string_st ASN1_UNIVERSALSTRING;
+typedef struct asn1_string_st ASN1_BMPSTRING;
+typedef struct asn1_string_st ASN1_UTCTIME;
+typedef struct asn1_string_st ASN1_GENERALIZEDTIME;
+#endif
+
 typedef struct asn1_type_st
        {
        int type;
@@ -472,6 +410,10 @@ int                i2d_ASN1_OCTET_STRING(ASN1_OCTET_STRING *a,unsigned char **pp);
 ASN1_OCTET_STRING *d2i_ASN1_OCTET_STRING(ASN1_OCTET_STRING **a,
                        unsigned char **pp,long length);
 
+int i2d_ASN1_BMPSTRING(ASN1_BMPSTRING *a, unsigned char **pp);
+ASN1_BMPSTRING *d2i_ASN1_BMPSTRING(ASN1_BMPSTRING **a, unsigned char **pp,
+       long length);
+
 int i2d_ASN1_PRINTABLE(ASN1_STRING *a,unsigned char **pp);
 ASN1_STRING *d2i_ASN1_PRINTABLE(ASN1_STRING **a,
        unsigned char **pp, long l);
@@ -491,7 +433,8 @@ ASN1_UTCTIME *      d2i_ASN1_UTCTIME(ASN1_UTCTIME **a,unsigned char **pp,
 int            i2d_ASN1_SET(STACK *a, unsigned char **pp,
                        int (*func)(), int ex_tag, int ex_class);
 STACK *                d2i_ASN1_SET(STACK **a, unsigned char **pp, long length,
-                       char *(*func)(), int ex_tag, int ex_class);
+                       char *(*func)(), void (*free_func)(),
+                       int ex_tag, int ex_class);
 
 #ifdef HEADER_BIO_H
 int i2a_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *a);
@@ -666,6 +609,9 @@ int ASN1_TYPE_get_octetstring();
 int ASN1_TYPE_set_int_octetstring();
 int ASN1_TYPE_get_int_octetstring();
 
+int i2d_ASN1_BMPSTRING();
+ASN1_BMPSTRING *d2i_ASN1_BMPSTRING();
+
 #endif
 
 /* BEGIN ERROR CODES */
@@ -797,60 +743,56 @@ int ASN1_TYPE_get_int_octetstring();
 
 /* Reason codes. */
 #define ASN1_R_BAD_CLASS                                100
-#define ASN1_R_BAD_GET_OBJECT                           101
-#define ASN1_R_BAD_OBJECT_HEADER                        102
-#define ASN1_R_BAD_PASSWORD_READ                        103
-#define ASN1_R_BAD_PKCS7_CONTENT                        104
-#define ASN1_R_BAD_PKCS7_TYPE                           105
-#define ASN1_R_BAD_TAG                                  106
-#define ASN1_R_BAD_TYPE                                         107
-#define ASN1_R_BN_LIB                                   108
-#define ASN1_R_BOOLEAN_IS_WRONG_LENGTH                  109
-#define ASN1_R_BUFFER_TOO_SMALL                                 110
-#define ASN1_R_DATA_IS_WRONG                            111
-#define ASN1_R_DECODING_ERROR                           112
-#define ASN1_R_ERROR_STACK                              113
-#define ASN1_R_EXPECTING_AN_INTEGER                     114
-#define ASN1_R_EXPECTING_AN_OBJECT                      115
-#define ASN1_R_EXPECTING_AN_OCTET_STRING                116
-#define ASN1_R_EXPECTING_A_BIT_STRING                   117
-#define ASN1_R_EXPECTING_A_BOOLEAN                      118
-#define ASN1_R_EXPECTING_A_SEQUENCE                     119
-#define ASN1_R_EXPECTING_A_UTCTIME                      120
-#define ASN1_R_FIRST_NUM_TOO_LARGE                      121
-#define ASN1_R_HEADER_TOO_LONG                          122
-#define ASN1_R_INVALID_DIGIT                            123
-#define ASN1_R_INVALID_SEPARATOR                        124
-#define ASN1_R_INVALID_TIME_FORMAT                      125
-#define ASN1_R_IV_TOO_LARGE                             126
-#define ASN1_R_LENGTH_ERROR                             127
-#define ASN1_R_LENGTH_MISMATCH                          128
-#define ASN1_R_MISSING_EOS                              129
-#define ASN1_R_MISSING_SECOND_NUMBER                    130
-#define ASN1_R_NON_HEX_CHARACTERS                       131
-#define ASN1_R_NOT_ENOUGH_DATA                          132
-#define ASN1_R_ODD_NUMBER_OF_CHARS                      133
-#define ASN1_R_PARSING                                  134
-#define ASN1_R_PRIVATE_KEY_HEADER_MISSING               135
-#define ASN1_R_SECOND_NUMBER_TOO_LARGE                  136
-#define ASN1_R_SHORT_LINE                               137
-#define ASN1_R_STRING_TOO_SHORT                                 138
-#define ASN1_R_TAG_VALUE_TOO_HIGH                       139
-#define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 140
-#define ASN1_R_TOO_LONG                                         141
-#define ASN1_R_UNABLE_TO_DECODE_RSA_KEY                         142
-#define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY                 143
-#define ASN1_R_UNKNOWN_ATTRIBUTE_TYPE                   144
-#define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM                 145
-#define ASN1_R_UNKNOWN_OBJECT_TYPE                      146
-#define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE                  147
-#define ASN1_R_UNSUPPORTED_CIPHER                       148
-#define ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM                 149
-#define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE              150
-#define ASN1_R_UTCTIME_TOO_LONG                                 151
-#define ASN1_R_WRONG_PRINTABLE_TYPE                     152
-#define ASN1_R_WRONG_TAG                                153
-#define ASN1_R_WRONG_TYPE                               154
+#define ASN1_R_BAD_OBJECT_HEADER                        101
+#define ASN1_R_BAD_PASSWORD_READ                        102
+#define ASN1_R_BAD_PKCS7_CONTENT                        103
+#define ASN1_R_BAD_PKCS7_TYPE                           104
+#define ASN1_R_BAD_TAG                                  105
+#define ASN1_R_BAD_TYPE                                         106
+#define ASN1_R_BN_LIB                                   107
+#define ASN1_R_BOOLEAN_IS_WRONG_LENGTH                  108
+#define ASN1_R_BUFFER_TOO_SMALL                                 109
+#define ASN1_R_DATA_IS_WRONG                            110
+#define ASN1_R_DECODING_ERROR                           111
+#define ASN1_R_ERROR_PARSING_SET_ELEMENT                112
+#define ASN1_R_EXPECTING_AN_INTEGER                     113
+#define ASN1_R_EXPECTING_AN_OBJECT                      114
+#define ASN1_R_EXPECTING_AN_OCTET_STRING                115
+#define ASN1_R_EXPECTING_A_BIT_STRING                   116
+#define ASN1_R_EXPECTING_A_BOOLEAN                      117
+#define ASN1_R_EXPECTING_A_UTCTIME                      118
+#define ASN1_R_FIRST_NUM_TOO_LARGE                      119
+#define ASN1_R_HEADER_TOO_LONG                          120
+#define ASN1_R_INVALID_DIGIT                            121
+#define ASN1_R_INVALID_SEPARATOR                        122
+#define ASN1_R_INVALID_TIME_FORMAT                      123
+#define ASN1_R_IV_TOO_LARGE                             124
+#define ASN1_R_LENGTH_ERROR                             125
+#define ASN1_R_MISSING_SECOND_NUMBER                    126
+#define ASN1_R_NON_HEX_CHARACTERS                       127
+#define ASN1_R_NOT_ENOUGH_DATA                          128
+#define ASN1_R_ODD_NUMBER_OF_CHARS                      129
+#define ASN1_R_PARSING                                  130
+#define ASN1_R_PRIVATE_KEY_HEADER_MISSING               131
+#define ASN1_R_SECOND_NUMBER_TOO_LARGE                  132
+#define ASN1_R_SHORT_LINE                               133
+#define ASN1_R_STRING_TOO_SHORT                                 134
+#define ASN1_R_TAG_VALUE_TOO_HIGH                       135
+#define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 136
+#define ASN1_R_TOO_LONG                                         137
+#define ASN1_R_UNABLE_TO_DECODE_RSA_KEY                         138
+#define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY                 139
+#define ASN1_R_UNKNOWN_ATTRIBUTE_TYPE                   140
+#define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM                 141
+#define ASN1_R_UNKNOWN_OBJECT_TYPE                      142
+#define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE                  143
+#define ASN1_R_UNSUPPORTED_CIPHER                       144
+#define ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM                 145
+#define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE              146
+#define ASN1_R_UTCTIME_TOO_LONG                                 147
+#define ASN1_R_WRONG_PRINTABLE_TYPE                     148
+#define ASN1_R_WRONG_TAG                                149
+#define ASN1_R_WRONG_TYPE                               150
  
 #ifdef  __cplusplus
 }
index 03c2858e7df82ccc29c859b3adce380609ee45b7..b7818f8477032e62b2014007a3111a79735da911 100644 (file)
@@ -87,7 +87,7 @@ static ERR_STRING_DATA ASN1_str_functs[]=
 {ERR_PACK(0,ASN1_F_ASN1_VERIFY,0),     "ASN1_VERIFY"},
 {ERR_PACK(0,ASN1_F_BN_TO_ASN1_INTEGER,0),      "BN_to_ASN1_INTEGER"},
 {ERR_PACK(0,ASN1_F_D2I_ASN1_BIT_STRING,0),     "d2i_ASN1_BIT_STRING"},
-{ERR_PACK(0,ASN1_F_D2I_ASN1_BMPSTRING,0),      "D2I_ASN1_BMPSTRING"},
+{ERR_PACK(0,ASN1_F_D2I_ASN1_BMPSTRING,0),      "d2i_ASN1_BMPSTRING"},
 {ERR_PACK(0,ASN1_F_D2I_ASN1_BOOLEAN,0),        "d2i_ASN1_BOOLEAN"},
 {ERR_PACK(0,ASN1_F_D2I_ASN1_BYTES,0),  "d2i_ASN1_bytes"},
 {ERR_PACK(0,ASN1_F_D2I_ASN1_HEADER,0), "d2i_ASN1_HEADER"},
@@ -191,7 +191,6 @@ static ERR_STRING_DATA ASN1_str_functs[]=
 static ERR_STRING_DATA ASN1_str_reasons[]=
        {
 {ASN1_R_BAD_CLASS                        ,"bad class"},
-{ASN1_R_BAD_GET_OBJECT                   ,"bad get object"},
 {ASN1_R_BAD_OBJECT_HEADER                ,"bad object header"},
 {ASN1_R_BAD_PASSWORD_READ                ,"bad password read"},
 {ASN1_R_BAD_PKCS7_CONTENT                ,"bad pkcs7 content"},
@@ -203,13 +202,12 @@ static ERR_STRING_DATA ASN1_str_reasons[]=
 {ASN1_R_BUFFER_TOO_SMALL                 ,"buffer too small"},
 {ASN1_R_DATA_IS_WRONG                    ,"data is wrong"},
 {ASN1_R_DECODING_ERROR                   ,"decoding error"},
-{ASN1_R_ERROR_STACK                      ,"error stack"},
+{ASN1_R_ERROR_PARSING_SET_ELEMENT        ,"error parsing set element"},
 {ASN1_R_EXPECTING_AN_INTEGER             ,"expecting an integer"},
 {ASN1_R_EXPECTING_AN_OBJECT              ,"expecting an object"},
 {ASN1_R_EXPECTING_AN_OCTET_STRING        ,"expecting an octet string"},
 {ASN1_R_EXPECTING_A_BIT_STRING           ,"expecting a bit string"},
 {ASN1_R_EXPECTING_A_BOOLEAN              ,"expecting a boolean"},
-{ASN1_R_EXPECTING_A_SEQUENCE             ,"expecting a sequence"},
 {ASN1_R_EXPECTING_A_UTCTIME              ,"expecting a utctime"},
 {ASN1_R_FIRST_NUM_TOO_LARGE              ,"first num too large"},
 {ASN1_R_HEADER_TOO_LONG                  ,"header too long"},
@@ -218,8 +216,6 @@ static ERR_STRING_DATA ASN1_str_reasons[]=
 {ASN1_R_INVALID_TIME_FORMAT              ,"invalid time format"},
 {ASN1_R_IV_TOO_LARGE                     ,"iv too large"},
 {ASN1_R_LENGTH_ERROR                     ,"length error"},
-{ASN1_R_LENGTH_MISMATCH                  ,"length mismatch"},
-{ASN1_R_MISSING_EOS                      ,"missing eos"},
 {ASN1_R_MISSING_SECOND_NUMBER            ,"missing second number"},
 {ASN1_R_NON_HEX_CHARACTERS               ,"non hex characters"},
 {ASN1_R_NOT_ENOUGH_DATA                  ,"not enough data"},
@@ -254,8 +250,8 @@ void ERR_load_ASN1_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_ASN1,ASN1_str_functs);
index ff30b25836ee4911caf74e4062467e44560c93ec..bc34cc4fe012781f40372b202504632f81b28c43 100644 (file)
@@ -69,7 +69,7 @@ static int asn1_get_length();
 static void asn1_put_length();
 #endif
 
-char *ASN1_version="ASN1 part of SSLeay 0.9.0b 29-Jun-1998";
+char *ASN1_version="ASN1 part of SSLeay 0.9.1a 06-Jul-1998";
 
 int ASN1_check_infinite_end(p,len)
 unsigned char **p;
@@ -130,11 +130,13 @@ long omax;
        *pclass=xclass;
        if (!asn1_get_length(&p,&inf,plength,(int)max)) goto err;
 
-#ifdef undef
-       fprintf(stderr,"p=%d + *plength=%d > omax=%d + *pp=%d  (%d > %d)\n", 
-               p,*plength,omax,*pp,(p+ *plength),omax+ *pp);
+#if 0
+       fprintf(stderr,"p=%d + *plength=%ld > omax=%ld + *pp=%d  (%d > %d)\n", 
+               (int)p,*plength,omax,(int)*pp,(int)(p+ *plength),
+               (int)(omax+ *pp));
 
 #endif
+#if 0
        if ((p+ *plength) > (omax+ *pp))
                {
                ASN1err(ASN1_F_ASN1_GET_OBJECT,ASN1_R_TOO_LONG);
@@ -142,8 +144,9 @@ long omax;
                 * the values are set correctly */
                ret|=0x80;
                }
+#endif
        *pp=p;
-       return(ret+inf);
+       return(ret|inf);
 err:
        ASN1err(ASN1_F_ASN1_GET_OBJECT,ASN1_R_HEADER_TOO_LONG);
        return(0x80);
@@ -284,14 +287,14 @@ ASN1_CTX *c;
                {
                if (!ASN1_check_infinite_end(&c->p,c->slen))
                        {
-                       c->error=ASN1_R_MISSING_EOS;
+                       c->error=ERR_R_MISSING_ASN1_EOS;
                        return(0);
                        }
                }
        if (    ((c->slen != 0) && !(c->inf & 1)) ||
                ((c->slen < 0) && (c->inf & 1)))
                {
-               c->error=ASN1_R_LENGTH_MISMATCH;
+               c->error=ERR_R_ASN1_LENGTH_MISMATCH;
                return(0);
                }
        return(1);
@@ -308,18 +311,18 @@ long *length;
                *length);
        if (c->inf & 0x80)
                {
-               c->error=ASN1_R_BAD_GET_OBJECT;
+               c->error=ERR_R_BAD_GET_ASN1_OBJECT_CALL;
                return(0);
                }
        if (c->tag != V_ASN1_SEQUENCE)
                {
-               c->error=ASN1_R_EXPECTING_A_SEQUENCE;
+               c->error=ERR_R_EXPECTING_AN_ASN1_SEQUENCE;
                return(0);
                }
        (*length)-=(c->p-q);
        if (c->max && (*length < 0))
                {
-               c->error=ASN1_R_LENGTH_MISMATCH;
+               c->error=ERR_R_ASN1_LENGTH_MISMATCH;
                return(0);
                }
        if (c->inf == (1|V_ASN1_CONSTRUCTED))
@@ -402,6 +405,7 @@ int type;
        ret->length=0;
        ret->type=type;
        ret->data=NULL;
+       ret->flags=0;
        return(ret);
        }
 
index 4fba70e4bb4cf6c97268aea8deced94bdd4ad47c..4e6115224c88370ccee6bbabd195d75c1b3a3fec 100644 (file)
@@ -67,14 +67,23 @@ extern "C" {
 #include "x509.h"
 #include "pkcs7.h"
 
+#ifndef ASN1_MAC_ERR_LIB
+#define ASN1_MAC_ERR_LIB       ERR_LIB_ASN1
+#endif 
+
+#define ASN1_MAC_H_err(f,r,line) \
+       ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),ERR_file_name,(line))
+
 #define M_ASN1_D2I_vars(a,type,func) \
        ASN1_CTX c; \
        type ret=NULL; \
        \
        c.pp=pp; \
-       c.error=ASN1_R_ERROR_STACK; \
+       c.q= *pp; \
+       c.error=ERR_R_NESTED_ASN1_ERROR; \
        if ((a == NULL) || ((*a) == NULL)) \
-               { if ((ret=(type)func()) == NULL) goto err; } \
+               { if ((ret=(type)func()) == NULL) \
+                       { c.line=__LINE__; goto err; } } \
        else    ret=(*a);
 
 #define M_ASN1_D2I_Init() \
@@ -82,7 +91,8 @@ extern "C" {
        c.max=(length == 0)?0:(c.p+length);
 
 #define M_ASN1_D2I_Finish_2(a) \
-       if (!asn1_Finish(&c)) goto err; \
+       if (!asn1_Finish(&c)) \
+               { c.line=__LINE__; goto err; } \
        *pp=c.p; \
        if (a != NULL) (*a)=ret; \
        return(ret);
@@ -90,21 +100,31 @@ extern "C" {
 #define M_ASN1_D2I_Finish(a,func,e) \
        M_ASN1_D2I_Finish_2(a); \
 err:\
-       ASN1err((e),c.error); \
+       ASN1_MAC_H_err((e),c.error,c.line); \
        asn1_add_error(*pp,(int)(c.q- *pp)); \
        if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \
        return(NULL)
 
 #define M_ASN1_D2I_start_sequence() \
-       if (!asn1_GetSequence(&c,&length)) goto err;
+       if (!asn1_GetSequence(&c,&length)) \
+               { c.line=__LINE__; goto err; }
 
 #define M_ASN1_D2I_end_sequence() \
        (((c.inf&1) == 0)?(c.slen <= 0): \
                (c.eos=ASN1_check_infinite_end(&c.p,c.slen)))
 
+/* Don't use this with d2i_ASN1_BOOLEAN() */
 #define M_ASN1_D2I_get(b,func) \
        c.q=c.p; \
-       if (func(&(b),&c.p,c.slen) == NULL) goto err; \
+       if (func(&(b),&c.p,c.slen) == NULL) \
+               {c.line=__LINE__; goto err; } \
+       c.slen-=(c.p-c.q);
+
+/* use this instead () */
+#define M_ASN1_D2I_get_int(b,func) \
+       c.q=c.p; \
+       if (func(&(b),&c.p,c.slen) < 0) \
+               {c.line=__LINE__; goto err; } \
        c.slen-=(c.p-c.q);
 
 #define M_ASN1_D2I_get_opt(b,func,type) \
@@ -125,38 +145,56 @@ err:\
                M_ASN1_next_prev=tmp; \
                }
 
-#define M_ASN1_D2I_get_set(r,func) \
-               M_ASN1_D2I_get_imp_set(r,func,V_ASN1_SET,V_ASN1_UNIVERSAL);
+#define M_ASN1_D2I_get_set(r,func,free_func) \
+               M_ASN1_D2I_get_imp_set(r,func,free_func, \
+                       V_ASN1_SET,V_ASN1_UNIVERSAL);
+
+#define M_ASN1_D2I_get_set_opt(r,func,free_func) \
+       if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
+               V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
+               { M_ASN1_D2I_get_set(r,func,free_func); }
+
+#define M_ASN1_I2D_len_SET_opt(a,f) \
+       if ((a != NULL) && (sk_num(a) != 0)) \
+               M_ASN1_I2D_len_SET(a,f);
+
+#define M_ASN1_I2D_put_SET_opt(a,f) \
+       if ((a != NULL) && (sk_num(a) != 0)) \
+               M_ASN1_I2D_put_SET(a,f);
 
-#define M_ASN1_D2I_get_IMP_set_opt(b,func,tag) \
+#define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \
        if ((c.slen != 0) && \
                (M_ASN1_next == \
                (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
                { \
-               M_ASN1_D2I_get_imp_set(b,func,tag,V_ASN1_CONTEXT_SPECIFIC); \
+               M_ASN1_D2I_get_imp_set(b,func,free_func,\
+                       tag,V_ASN1_CONTEXT_SPECIFIC); \
                }
 
-#define M_ASN1_D2I_get_seq(r,func) \
-               M_ASN1_D2I_get_imp_set(r,func,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);
+#define M_ASN1_D2I_get_seq(r,func,free_func) \
+               M_ASN1_D2I_get_imp_set(r,func,free_func,\
+                       V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);
 
-#define M_ASN1_D2I_get_seq_opt(r,func) \
+#define M_ASN1_D2I_get_seq_opt(r,func,free_func) \
        if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
                V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
-               { M_ASN1_D2I_get_seq(r,func); }
+               { M_ASN1_D2I_get_seq(r,func,free_func); }
 
-#define M_ASN1_D2I_get_IMP_set(r,func,x) \
-               M_ASN1_D2I_get_imp_set(r,func,x,V_ASN1_CONTEXT_SPECIFIC);
+#define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \
+               M_ASN1_D2I_get_imp_set(r,func,free_func,\
+                       x,V_ASN1_CONTEXT_SPECIFIC);
 
-#define M_ASN1_D2I_get_imp_set(r,func,a,b) \
+#define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \
        c.q=c.p; \
-       if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,a,b) == NULL) \
-               goto err; \
+       if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,\
+               (void (*)())free_func,a,b) == NULL) \
+               { c.line=__LINE__; goto err; } \
        c.slen-=(c.p-c.q);
 
 #define M_ASN1_D2I_get_set_strings(r,func,a,b) \
        c.q=c.p; \
        if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \
-               goto err; \
+               { c.line=__LINE__; goto err; } \
        c.slen-=(c.p-c.q);
 
 #define M_ASN1_D2I_get_EXP_opt(r,func,tag) \
@@ -169,13 +207,14 @@ err:\
                c.q=c.p; \
                Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
                if (Tinf & 0x80) \
-                       { c.error=ASN1_R_BAD_OBJECT_HEADER; goto err; } \
+                       { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
+                       c.line=__LINE__; goto err; } \
                if (func(&(r),&c.p,Tlen) == NULL) \
-                       goto err; \
+                       { c.line=__LINE__; goto err; } \
                c.slen-=(c.p-c.q); \
                }
 
-#define M_ASN1_D2I_get_EXP_set_opt(r,func,tag,b) \
+#define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \
        if ((c.slen != 0) && (M_ASN1_next == \
                (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
                { \
@@ -185,24 +224,27 @@ err:\
                c.q=c.p; \
                Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
                if (Tinf & 0x80) \
-                       { c.error=ASN1_R_BAD_OBJECT_HEADER; goto err; } \
+                       { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
+                       c.line=__LINE__; goto err; } \
                if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \
+                       (void (*)())free_func, \
                        b,V_ASN1_UNIVERSAL) == NULL) \
-                       goto err; \
+                       { c.line=__LINE__; goto err; } \
                c.slen-=(c.p-c.q); \
                }
 
 /* New macros */
 #define M_ASN1_New_Malloc(ret,type) \
-       if ((ret=(type *)Malloc(sizeof(type))) == NULL) goto err2;
+       if ((ret=(type *)Malloc(sizeof(type))) == NULL) \
+               { c.line=__LINE__; goto err2; }
 
 #define M_ASN1_New(arg,func) \
        if (((arg)=func()) == NULL) return(NULL)
 
 #define M_ASN1_New_Error(a) \
-/*     err:    ASN1err((a),ASN1_R_ERROR_STACK); \
+/*     err:    ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \
                return(NULL);*/ \
-       err2:   ASN1err((a),ERR_R_MALLOC_FAILURE); \
+       err2:   ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \
                return(NULL)
 
 
index 3906227d21a70b1c99312bcb749a435d1f083d7a..af71b1a85ddfb4408fca3ef597d4d126db6ffd30 100644 (file)
@@ -266,7 +266,8 @@ int indent;
                        if (    (tag == V_ASN1_PRINTABLESTRING) ||
                                (tag == V_ASN1_T61STRING) ||
                                (tag == V_ASN1_IA5STRING) ||
-                               (tag == V_ASN1_UTCTIME))
+                               (tag == V_ASN1_UTCTIME) ||
+                               (tag == V_ASN1_GENERALIZEDTIME))
                                {
                                if (BIO_write(bp,":",1) <= 0) goto end;
                                if ((len > 0) &&
index 616a308100fc7d848f0f1824b4016023802cc44b..f2236fc2e2d500ab3ec47f1ef8c1531e06d2c92e 100644 (file)
@@ -64,7 +64,7 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_DHPARAMS,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_DHPARAMS,ERR_R_ASN1_LENGTH_MISMATCH);
  * ASN1err(ASN1_F_I2D_DHPARAMS,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE);
  */
 
@@ -73,7 +73,7 @@ DH **a;
 unsigned char **pp;
 long length;
        {
-       int i=ASN1_R_ERROR_STACK;
+       int i=ERR_R_NESTED_ASN1_ERROR;
        ASN1_INTEGER *bs=NULL;
        long v=0;
        M_ASN1_D2I_vars(a,DH *,DH_new);
index 2c8ac7bbcfa3d5c20fce70992a3886b967ce6ecd..fc2961b3a419243f6abee374964c44f9ed8be782 100644 (file)
@@ -64,7 +64,7 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_DSAPARAMS,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_DSAPARAMS,ERR_R_ASN1_LENGTH_MISMATCH);
  * ASN1err(ASN1_F_I2D_DSAPARAMS,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE);
  */
 
@@ -73,7 +73,7 @@ DSA **a;
 unsigned char **pp;
 long length;
        {
-       int i=ASN1_R_ERROR_STACK;
+       int i=ERR_R_NESTED_ASN1_ERROR;
        ASN1_INTEGER *bs=NULL;
        M_ASN1_D2I_vars(a,DSA *,DSA_new);
 
index b9eaa9629b07c465125f7eaecef20bcaeab7b0fe..677403564bf9e4f9ba39709deffb26972069a6f0 100644 (file)
@@ -106,7 +106,7 @@ long length;
        default:
                ASN1err(ASN1_F_D2I_PRIVATEKEY,ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE);
                goto err;
-               break;
+               /* break; */
                }
        if (a != NULL) (*a)=ret;
        return(ret);
index 5d6192f1e527047b3caa4535585ccf147856470f..eb572acb0f3a1bf5783c2d8a26441cde9580cc1e 100644 (file)
@@ -106,7 +106,7 @@ long length;
        default:
                ASN1err(ASN1_F_D2I_PUBLICKEY,ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE);
                goto err;
-               break;
+               /* break; */
                }
        if (a != NULL) (*a)=ret;
        return(ret);
index 0c53aa94bf5808474776019540c561d3fbcc01d8..a276a1d4c5e968d46d343d4fd8a308460f0636fe 100644 (file)
@@ -64,7 +64,7 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_RSAPRIVATEKEY,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_RSAPRIVATEKEY,ERR_R_ASN1_LENGTH_MISMATCH);
  * ASN1err(ASN1_F_I2D_RSAPRIVATEKEY,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE);
  * ASN1err(ASN1_F_I2D_RSAPRIVATEKEY,ASN1_R_PARSING);
  */
index 778b792b1e7ee1b12726edabebdfa8eac37696b4..a4e2c22f36613548f80bb6f4cb58f6aef008d6b8 100644 (file)
@@ -64,7 +64,7 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_RSAPUBLICKEY,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_RSAPUBLICKEY,ERR_R_ASN1_LENGTH_MISMATCH);
  * ASN1err(ASN1_F_I2D_RSAPUBLICKEY,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE);
  */
 
index 32ff8ba4b397aa667425c9666d9b36630e2df6e4..8499702c9c7e8e4bddddbdaeb4c34f2d4590d679 100644 (file)
@@ -66,7 +66,7 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_DSAPRIVATEKEY,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_DSAPRIVATEKEY,ERR_R_ASN1_LENGTH_MISMATCH);
  * ASN1err(ASN1_F_I2D_DSAPRIVATEKEY,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE);
  * ASN1err(ASN1_F_I2D_DSAPRIVATEKEY,ASN1_R_PARSING);
  */
index 1002f41cd8fd7f277a4b01ca2476b8683e183523..ecf6407eabbb4535b6dca378ca47994fd9e9bb22 100644 (file)
@@ -66,7 +66,7 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_DSAPUBLICKEY,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_DSAPUBLICKEY,ERR_R_ASN1_LENGTH_MISMATCH);
  * ASN1err(ASN1_F_I2D_DSAPUBLICKEY,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE);
  */
 
index ebe34a3362df353e7bdc1218268bb06f29cd6989..4153d1b57f5fbbff41c3c497e50f43ec664a42b7 100644 (file)
@@ -135,7 +135,8 @@ int len;
        return(1);
        }
 
-/* we return the actual length... */
+/* we return the actual length..., num may be missing, in which
+ * case, set it to zero */
 int ASN1_TYPE_get_int_octetstring(a,num,data,max_len)
 ASN1_TYPE *a;
 long *num;
index a454025ce3226482b87efb05fe6d5a4cc10c6a80..a1afa46c864bfec130c947628938c71d81fcc2d9 100644 (file)
@@ -63,8 +63,8 @@
 #include "dh.h"
 
 /*
- * ASN1err(ASN1_F_D2I_DHPARAMS,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_DHPARAMS_NEW,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_DHPARAMS,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_DHPARAMS_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_DHparams(a,pp)
index 94ecff152548c38126fe3db2edbedb890c265fbe..0b7d5543f37cf285fea6e2ecf6dd5f1a7bfd0f23 100644 (file)
@@ -63,7 +63,7 @@
 #include "dsa.h"
 
 /*
- * ASN1err(ASN1_F_D2I_DSAPARAMS,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_DSAPARAMS,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_DSAparams(a,pp)
index aadbb92d8eb9b5f1ef94156f67e4f282d9f71256..78312dbf2ff0c5d9a5eb5a312da24cad12e27ee4 100644 (file)
@@ -64,7 +64,7 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_RSAPRIVATEKEY,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_RSAPRIVATEKEY,ERR_R_ASN1_LENGTH_MISMATCH);
  * ASN1err(ASN1_F_I2D_RSAPRIVATEKEY,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE);
  */
 
index 3c54f6709da949af84a182b332b61384272baca6..4bcebaa1ba072ec8cadb3eb7429eb753427c77a6 100644 (file)
@@ -64,7 +64,7 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_RSAPUBLICKEY,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_RSAPUBLICKEY,ERR_R_ASN1_LENGTH_MISMATCH);
  * ASN1err(ASN1_F_I2D_RSAPUBLICKEY,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE);
  */
 
index 5110c91bec90d3c5815d41918385f0e83a561b6b..9649847866ea63a475f6bc3d76dd058856d13868 100644 (file)
@@ -75,7 +75,7 @@ typedef struct netscape_pkey_st
        } NETSCAPE_PKEY;
 
 /*
- * ASN1err(ASN1_F_D2I_NETSCAPE_RSA,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_NETSCAPE_RSA,ERR_R_ASN1_LENGTH_MISMATCH);
  * ASN1err(ASN1_F_D2I_NETSCAPE_RSA,ASN1_R_DECODING_ERROR);
  * ASN1err(ASN1_F_D2I_NETSCAPE_PKEY,ASN1_R_DECODING_ERROR);
  * ASN1err(ASN1_F_NETSCAPE_PKEY_NEW,ASN1_R_DECODING_ERROR);
@@ -249,7 +249,7 @@ int (*cb)();
        ASN1_OCTET_STRING *os=NULL;
        ASN1_CTX c;
 
-       c.error=ASN1_R_ERROR_STACK;
+       c.error=ERR_R_NESTED_ASN1_ERROR;
        c.pp=pp;
 
        M_ASN1_D2I_Init();
@@ -342,6 +342,7 @@ long length;
 static NETSCAPE_PKEY *NETSCAPE_PKEY_new()
        {
        NETSCAPE_PKEY *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,NETSCAPE_PKEY);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
index f71ed8eb1daabe4fcc7c1f3f1b7b44ba933f0c94..bf7b8e2f43ceb53503c28f6ec272d0fd6b350373 100644 (file)
@@ -62,8 +62,8 @@
 #include "x509.h"
 
 /*
- * ASN1err(ASN1_F_PKCS7_DIGEST_NEW,ASN1_R_MISSING_EOS);
- * ASN1err(ASN1_F_D2I_PKCS7_DIGEST,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_PKCS7_DIGEST_NEW,ERR_R_MISSING_ASN1_EOS);
+ * ASN1err(ASN1_F_D2I_PKCS7_DIGEST,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_PKCS7_DIGEST(a,pp)
@@ -107,6 +107,7 @@ long length;
 PKCS7_DIGEST *PKCS7_DIGEST_new()
        {
        PKCS7_DIGEST *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,PKCS7_DIGEST);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
index 874dd78389fcf63437f70bb17bdb6c28cc0681c8..56e27fa1121c7e54cbb39822ffaac4ffbae18f45 100644 (file)
@@ -62,8 +62,8 @@
 #include "x509.h"
 
 /*
- * ASN1err(ASN1_F_PKCS7_ENCRYPT_NEW,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_D2I_PKCS7_ENCRYPT,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_PKCS7_ENCRYPT_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_PKCS7_ENCRYPT,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_PKCS7_ENCRYPT(a,pp)
@@ -101,6 +101,7 @@ long length;
 PKCS7_ENCRYPT *PKCS7_ENCRYPT_new()
        {
        PKCS7_ENCRYPT *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,PKCS7_ENCRYPT);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
index 2860d3e9255b83644742115f310460a1abddac65..f98afb51b8d9c06db0dea22c85b346e65961918d 100644 (file)
@@ -62,8 +62,8 @@
 #include "x509.h"
 
 /*
- * ASN1err(ASN1_F_PKCS7_ENC_CONTENT_NEW,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_D2I_PKCS7_ENC_CONTENT,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_PKCS7_ENC_CONTENT_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_PKCS7_ENC_CONTENT,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_PKCS7_ENC_CONTENT(a,pp)
@@ -106,9 +106,11 @@ long length;
 PKCS7_ENC_CONTENT *PKCS7_ENC_CONTENT_new()
        {
        PKCS7_ENC_CONTENT *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,PKCS7_ENC_CONTENT);
-       M_ASN1_New(ret->content_type,ASN1_OBJECT_new);
+       /* M_ASN1_New(ret->content_type,ASN1_OBJECT_new); */
+       ret->content_type=OBJ_nid2obj(NID_pkcs7_encrypted);
        M_ASN1_New(ret->algorithm,X509_ALGOR_new);
        ret->enc_data=NULL;
        return(ret);
index 4db0a7fe625e19253556837a6733985d15f510ff..7879a66848c7a7a23ff73b957757c814bc9892ae 100644 (file)
@@ -62,8 +62,8 @@
 #include "x509.h"
 
 /*
- * ASN1err(ASN1_F_PKCS7_ENVELOPE_NEW,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_D2I_PKCS7_ENVELOPE,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_PKCS7_ENVELOPE_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_PKCS7_ENVELOPE,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_PKCS7_ENVELOPE(a,pp)
@@ -95,7 +95,8 @@ long length;
        M_ASN1_D2I_Init();
        M_ASN1_D2I_start_sequence();
        M_ASN1_D2I_get(ret->version,d2i_ASN1_INTEGER);
-       M_ASN1_D2I_get_set(ret->recipientinfo,d2i_PKCS7_RECIP_INFO);
+       M_ASN1_D2I_get_set(ret->recipientinfo,d2i_PKCS7_RECIP_INFO,
+               PKCS7_RECIP_INFO_free);
        M_ASN1_D2I_get(ret->enc_data,d2i_PKCS7_ENC_CONTENT);
 
        M_ASN1_D2I_Finish(a,PKCS7_ENVELOPE_free,ASN1_F_D2I_PKCS7_ENVELOPE);
@@ -104,6 +105,7 @@ long length;
 PKCS7_ENVELOPE *PKCS7_ENVELOPE_new()
        {
        PKCS7_ENVELOPE *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,PKCS7_ENVELOPE);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
index 9b00c556d9e07b6335c98f8fea0d7ccfa4b4a926..9bae647febfcc5946a970ae981326d3df375b7fe 100644 (file)
@@ -62,8 +62,8 @@
 #include "x509.h"
 
 /*
- * ASN1err(ASN1_F_PKCS7_ISSUER_AND_SERIAL_NEW,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_D2I_PKCS7_ISSUER_AND_SERIAL,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_PKCS7_ISSUER_AND_SERIAL_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_PKCS7_ISSUER_AND_SERIAL,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_PKCS7_ISSUER_AND_SERIAL(a,pp)
@@ -101,6 +101,7 @@ long length;
 PKCS7_ISSUER_AND_SERIAL *PKCS7_ISSUER_AND_SERIAL_new()
        {
        PKCS7_ISSUER_AND_SERIAL *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,PKCS7_ISSUER_AND_SERIAL);
        M_ASN1_New(ret->issuer,X509_NAME_new);
index 2134e0974afc82d86030cfd404261ab5861cb021..06e1da4a742ca9f9df4ebb4bc5e08ceb862ed3f3 100644 (file)
@@ -179,6 +179,7 @@ long length;
                        V_ASN1_CONTEXT_SPECIFIC|0))
                        {
                        c.error=ASN1_R_BAD_PKCS7_CONTENT;
+                       c.line=__LINE__;
                        goto err;
                        }
 
@@ -187,7 +188,7 @@ long length;
                c.q=c.p;
                Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,
                        (c.inf & 1)?(length+ *pp-c.q):c.slen);
-               if (Tinf & 0x80) goto err;
+               if (Tinf & 0x80) { c.line=__LINE__; goto err; }
                c.slen-=(c.p-c.q);
 
                switch (OBJ_obj2nid(ret->type))
@@ -215,14 +216,16 @@ long length;
                        break;
                default:
                        c.error=ASN1_R_BAD_PKCS7_TYPE;
+                       c.line=__LINE__;
                        goto err;
-                       break;
+                       /* break; */
                        }
                if (Tinf == (1|V_ASN1_CONSTRUCTED))
                        {
                        if (!ASN1_check_infinite_end(&c.p,c.slen))
                                {
-                               c.error=ASN1_R_MISSING_EOS;
+                               c.error=ERR_R_MISSING_ASN1_EOS;
+                               c.line=__LINE__;
                                goto err;
                                }
                        }
@@ -236,9 +239,10 @@ long length;
 PKCS7 *PKCS7_new()
        {
        PKCS7 *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,PKCS7);
-       ret->type=ASN1_OBJECT_new();
+       ret->type=OBJ_nid2obj(NID_undef);
        ret->asn1=NULL;
        ret->length=0;
        ret->detached=0;
index f02233f5a8bc068ad60fcc6a82871729d1be63d8..2516d7b193e1f22f388b4e6359496a9d14d8d430 100644 (file)
@@ -62,8 +62,8 @@
 #include "x509.h"
 
 /*
- * ASN1err(ASN1_F_PKCS7_RECIP_INFO_NEW,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_D2I_PKCS7_RECIP_INFO,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_PKCS7_RECIP_INFO_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_PKCS7_RECIP_INFO,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_PKCS7_RECIP_INFO(a,pp)
@@ -107,6 +107,7 @@ long length;
 PKCS7_RECIP_INFO *PKCS7_RECIP_INFO_new()
        {
        PKCS7_RECIP_INFO *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,PKCS7_RECIP_INFO);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
index d344211456f40d7686e1e9092a0382432872e559..0368bcbbcd52546fc48492a2174550d2f61f9a10 100644 (file)
@@ -62,8 +62,8 @@
 #include "x509.h"
 
 /*
- * ASN1err(ASN1_F_PKCS7_SIGN_ENVELOPE_NEW,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_D2I_PKCS7_SIGN_ENVELOPE,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_PKCS7_SIGN_ENVELOPE_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_PKCS7_SIGN_ENVELOPE,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_PKCS7_SIGN_ENVELOPE(a,pp)
@@ -103,12 +103,14 @@ long length;
        M_ASN1_D2I_Init();
        M_ASN1_D2I_start_sequence();
        M_ASN1_D2I_get(ret->version,d2i_ASN1_INTEGER);
-       M_ASN1_D2I_get_set(ret->recipientinfo,d2i_PKCS7_RECIP_INFO);
-       M_ASN1_D2I_get_set(ret->md_algs,d2i_X509_ALGOR);
+       M_ASN1_D2I_get_set(ret->recipientinfo,d2i_PKCS7_RECIP_INFO,
+               PKCS7_RECIP_INFO_free);
+       M_ASN1_D2I_get_set(ret->md_algs,d2i_X509_ALGOR,X509_ALGOR_free);
        M_ASN1_D2I_get(ret->enc_data,d2i_PKCS7_ENC_CONTENT);
-       M_ASN1_D2I_get_IMP_set_opt(ret->cert,d2i_X509,0);
-       M_ASN1_D2I_get_IMP_set_opt(ret->crl,d2i_X509_CRL,1);
-       M_ASN1_D2I_get_set(ret->signer_info,d2i_PKCS7_SIGNER_INFO);
+       M_ASN1_D2I_get_IMP_set_opt(ret->cert,d2i_X509,X509_free,0);
+       M_ASN1_D2I_get_IMP_set_opt(ret->crl,d2i_X509_CRL,X509_CRL_free,1);
+       M_ASN1_D2I_get_set(ret->signer_info,d2i_PKCS7_SIGNER_INFO,
+               PKCS7_SIGNER_INFO_free);
 
        M_ASN1_D2I_Finish(a,PKCS7_SIGN_ENVELOPE_free,
                ASN1_F_D2I_PKCS7_SIGN_ENVELOPE);
@@ -117,6 +119,7 @@ long length;
 PKCS7_SIGN_ENVELOPE *PKCS7_SIGN_ENVELOPE_new()
        {
        PKCS7_SIGN_ENVELOPE *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,PKCS7_SIGN_ENVELOPE);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
index 40f9a44fa8d84b091d3b24008b3109cc66857c9a..830617cbf83bb22a0a8577c44fe39728047bafbf 100644 (file)
@@ -62,8 +62,8 @@
 #include "x509.h"
 
 /*
- * ASN1err(ASN1_F_PKCS7_SIGNED_NEW,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_D2I_PKCS7_SIGNED,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_PKCS7_SIGNED_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_PKCS7_SIGNED,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_PKCS7_SIGNED(a,pp)
@@ -101,11 +101,12 @@ long length;
        M_ASN1_D2I_Init();
        M_ASN1_D2I_start_sequence();
        M_ASN1_D2I_get(ret->version,d2i_ASN1_INTEGER);
-       M_ASN1_D2I_get_set(ret->md_algs,d2i_X509_ALGOR);
+       M_ASN1_D2I_get_set(ret->md_algs,d2i_X509_ALGOR,X509_ALGOR_free);
        M_ASN1_D2I_get(ret->contents,d2i_PKCS7);
-       M_ASN1_D2I_get_IMP_set_opt(ret->cert,d2i_X509,0);
-       M_ASN1_D2I_get_IMP_set_opt(ret->crl,d2i_X509_CRL,1);
-       M_ASN1_D2I_get_set(ret->signer_info,d2i_PKCS7_SIGNER_INFO);
+       M_ASN1_D2I_get_IMP_set_opt(ret->cert,d2i_X509,X509_free,0);
+       M_ASN1_D2I_get_IMP_set_opt(ret->crl,d2i_X509_CRL,X509_CRL_free,1);
+       M_ASN1_D2I_get_set(ret->signer_info,d2i_PKCS7_SIGNER_INFO,
+               PKCS7_SIGNER_INFO_free);
 
        M_ASN1_D2I_Finish(a,PKCS7_SIGNED_free,ASN1_F_D2I_PKCS7_SIGNED);
        }
@@ -113,6 +114,7 @@ long length;
 PKCS7_SIGNED *PKCS7_SIGNED_new()
        {
        PKCS7_SIGNED *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,PKCS7_SIGNED);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
index 0da92169fcc16e62a9be52b287fdc2f5185fe426..4bc415d572f7f4e7a4fc6103e885631318ea260a 100644 (file)
@@ -62,8 +62,8 @@
 #include "x509.h"
 
 /*
- * ASN1err(ASN1_F_PKCS7_SIGNER_INFO_NEW,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_D2I_PKCS7_SIGNER_INFO,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_PKCS7_SIGNER_INFO_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_PKCS7_SIGNER_INFO,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_PKCS7_SIGNER_INFO(a,pp)
@@ -105,10 +105,12 @@ long length;
        M_ASN1_D2I_get(ret->version,d2i_ASN1_INTEGER);
        M_ASN1_D2I_get(ret->issuer_and_serial,d2i_PKCS7_ISSUER_AND_SERIAL);
        M_ASN1_D2I_get(ret->digest_alg,d2i_X509_ALGOR);
-       M_ASN1_D2I_get_IMP_set_opt(ret->auth_attr,d2i_X509_ATTRIBUTE,0);
+       M_ASN1_D2I_get_IMP_set_opt(ret->auth_attr,d2i_X509_ATTRIBUTE,
+               X509_ATTRIBUTE_free,0);
        M_ASN1_D2I_get(ret->digest_enc_alg,d2i_X509_ALGOR);
        M_ASN1_D2I_get(ret->enc_digest,d2i_ASN1_OCTET_STRING);
-       M_ASN1_D2I_get_IMP_set_opt(ret->unauth_attr,d2i_X509_ATTRIBUTE,1);
+       M_ASN1_D2I_get_IMP_set_opt(ret->unauth_attr,d2i_X509_ATTRIBUTE,
+               X509_ATTRIBUTE_free,1);
 
        M_ASN1_D2I_Finish(a,PKCS7_SIGNER_INFO_free,
                ASN1_F_D2I_PKCS7_SIGNER_INFO);
@@ -117,6 +119,7 @@ long length;
 PKCS7_SIGNER_INFO *PKCS7_SIGNER_INFO_new()
        {
        PKCS7_SIGNER_INFO *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,PKCS7_SIGNER_INFO);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
index 03fdadd51a9261294afc4b3b7cd772ced57309b9..d2bc9ce134f9f97f55008ced719783e4c727cb08 100644 (file)
@@ -62,8 +62,8 @@
 #include "objects.h"
 
 /*
- * ASN1err(ASN1_F_D2I_X509_KEY,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_KEY_NEW,ASN1_R_BAD_GET_OBJECT);
+ * ASN1err(ASN1_F_D2I_X509_KEY,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_KEY_NEW,ERR_R_BAD_GET_ASN1_OBJECT_CALL);
  */
 
 int i2d_X509_KEY(a,pp)
index b10fbbb9922e8edc6b4d0b1523820dba1509591e..9a8c8bf0ca7354c35d1c717226dfd2c038c964b5 100644 (file)
@@ -158,6 +158,11 @@ X509 *x;
                (i == NID_undef)?"UNKNOWN":OBJ_nid2ln(i)) <= 0) goto err;
 
        pkey=X509_get_pubkey(x);
+       if (pkey == NULL)
+               {
+               BIO_printf(bp,"%12sUnable to load Public Key\n","");
+               }
+       else
 #ifndef NO_RSA
        if (pkey->type == EVP_PKEY_RSA)
                {
@@ -175,7 +180,7 @@ X509 *x;
                }
        else
 #endif
-               BIO_printf(bp,"%12sDSA Public Key:\n","");
+               BIO_printf(bp,"%12sUnknown Public Key:\n","");
 
        n=X509_get_ext_count(x);
        if (n > 0)
diff --git a/crypto/asn1/x b/crypto/asn1/x
new file mode 100644 (file)
index 0000000..13acdab
--- /dev/null
@@ -0,0 +1,353 @@
+/* crypto/asn1/x_crl.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include "cryptlib.h"
+#include "asn1_mac.h"
+#include "x509.h"
+
+/*
+ * ASN1err(ASN1_F_D2I_X509_CRL,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_CRL_INFO,ASN1_R_EXPECTING_A_SEQUENCE);
+ * ASN1err(ASN1_F_D2I_X509_REVOKED,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_CRL_NEW,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_CRL_INFO_NEW,ASN1_R_EXPECTING_A_SEQUENCE);
+ * ASN1err(ASN1_F_X509_REVOKED_NEW,ASN1_R_LENGTH_MISMATCH);
+ */
+
+#ifndef NOPROTO
+static int X509_REVOKED_cmp(X509_REVOKED **a,X509_REVOKED **b);
+static int X509_REVOKED_seq_cmp(X509_REVOKED **a,X509_REVOKED **b);
+#else
+static int X509_REVOKED_cmp();
+static int X509_REVOKED_seq_cmp();
+#endif
+
+int i2d_X509_REVOKED(a,pp)
+X509_REVOKED *a;
+unsigned char **pp;
+       {
+       M_ASN1_I2D_vars(a);
+
+       M_ASN1_I2D_len(a->serialNumber,i2d_ASN1_INTEGER);
+       M_ASN1_I2D_len(a->revocationDate,i2d_ASN1_UTCTIME);
+       M_ASN1_I2D_len_SEQ_opt(a->extensions,i2d_X509_EXTENSION);
+
+       M_ASN1_I2D_seq_total();
+
+       M_ASN1_I2D_put(a->serialNumber,i2d_ASN1_INTEGER);
+       M_ASN1_I2D_put(a->revocationDate,i2d_ASN1_UTCTIME);
+       M_ASN1_I2D_put_SEQ_opt(a->extensions,i2d_X509_EXTENSION);
+
+       M_ASN1_I2D_finish();
+       }
+
+X509_REVOKED *d2i_X509_REVOKED(a,pp,length)
+X509_REVOKED **a;
+unsigned char **pp;
+long length;
+       {
+       M_ASN1_D2I_vars(a,X509_REVOKED *,X509_REVOKED_new);
+
+       M_ASN1_D2I_Init();
+       M_ASN1_D2I_start_sequence();
+       M_ASN1_D2I_get(ret->serialNumber,d2i_ASN1_INTEGER);
+       M_ASN1_D2I_get(ret->revocationDate,d2i_ASN1_UTCTIME);
+       M_ASN1_D2I_get_seq_opt(ret->extensions,d2i_X509_EXTENSION);
+       M_ASN1_D2I_Finish(a,X509_REVOKED_free,ASN1_F_D2I_X509_REVOKED);
+       }
+
+int i2d_X509_CRL_INFO(a,pp)
+X509_CRL_INFO *a;
+unsigned char **pp;
+       {
+       int v1=0;
+       long l=0;
+       M_ASN1_I2D_vars(a);
+
+       if (sk_num(a->revoked) != 0)
+               qsort((char *)a->revoked->data,sk_num(a->revoked),
+                       sizeof(X509_REVOKED *),(int (*)(P_CC_CC))X509_REVOKED_seq_cmp);
+       if ((a->version != NULL) && ((l=ASN1_INTEGER_get(a->version)) != 0))
+               {
+               M_ASN1_I2D_len(a->version,i2d_ASN1_INTEGER);
+               }
+       M_ASN1_I2D_len(a->sig_alg,i2d_X509_ALGOR);
+       M_ASN1_I2D_len(a->issuer,i2d_X509_NAME);
+       M_ASN1_I2D_len(a->lastUpdate,i2d_ASN1_UTCTIME);
+       if (a->nextUpdate != NULL)
+               { M_ASN1_I2D_len(a->nextUpdate,i2d_ASN1_UTCTIME); }
+       M_ASN1_I2D_len_SEQ_opt(a->revoked,i2d_X509_REVOKED);
+       M_ASN1_I2D_len_EXP_set_opt(a->extensions,i2d_X509_EXTENSION,0,
+               V_ASN1_SEQUENCE,v1);
+
+       M_ASN1_I2D_seq_total();
+
+       if ((a->version != NULL) && (l != 0))
+               {
+               M_ASN1_I2D_put(a->version,i2d_ASN1_INTEGER);
+               }
+       M_ASN1_I2D_put(a->sig_alg,i2d_X509_ALGOR);
+       M_ASN1_I2D_put(a->issuer,i2d_X509_NAME);
+       M_ASN1_I2D_put(a->lastUpdate,i2d_ASN1_UTCTIME);
+       if (a->nextUpdate != NULL)
+               { M_ASN1_I2D_put(a->nextUpdate,i2d_ASN1_UTCTIME); }
+       M_ASN1_I2D_put_SEQ_opt(a->revoked,i2d_X509_REVOKED);
+       M_ASN1_I2D_put_EXP_set_opt(a->extensions,i2d_X509_EXTENSION,0,
+               V_ASN1_SEQUENCE,v1);
+
+       M_ASN1_I2D_finish();
+       }
+
+X509_CRL_INFO *d2i_X509_CRL_INFO(a,pp,length)
+X509_CRL_INFO **a;
+unsigned char **pp;
+long length;
+       {
+       int i,ver=0;
+       M_ASN1_D2I_vars(a,X509_CRL_INFO *,X509_CRL_INFO_new);
+
+
+       M_ASN1_D2I_Init();
+       M_ASN1_D2I_start_sequence();
+       M_ASN1_D2I_get_opt(ret->version,d2i_ASN1_INTEGER,V_ASN1_INTEGER);
+       if (ret->version != NULL)
+               ver=ret->version->data[0];
+       
+       if ((ver == 0) && (ret->version != NULL))
+               {
+               ASN1_INTEGER_free(ret->version);
+               ret->version=NULL;
+               }
+       M_ASN1_D2I_get(ret->sig_alg,d2i_X509_ALGOR);
+       M_ASN1_D2I_get(ret->issuer,d2i_X509_NAME);
+       M_ASN1_D2I_get(ret->lastUpdate,d2i_ASN1_UTCTIME);
+       M_ASN1_D2I_get_opt(ret->nextUpdate,d2i_ASN1_UTCTIME,V_ASN1_UTCTIME);
+       if (ret->revoked != NULL)
+               {
+               while (sk_num(ret->revoked))
+                       X509_REVOKED_free((X509_REVOKED *)sk_pop(ret->revoked));
+               }
+       M_ASN1_D2I_get_seq_opt(ret->revoked,d2i_X509_REVOKED);
+
+       if (ret->revoked != NULL)
+               {
+               for (i=0; i<sk_num(ret->revoked); i++)
+                       {
+                       ((X509_REVOKED *)sk_value(ret->revoked,i))->sequence=i;
+                       }
+               }
+
+       if (ver >= 1)
+               {
+               if (ret->extensions != NULL)
+                       {
+                       while (sk_num(ret->extensions))
+                               X509_EXTENSION_free((X509_EXTENSION *)
+                               sk_pop(ret->extensions));
+                       }
+                       
+               M_ASN1_D2I_get_EXP_set_opt(ret->extensions,d2i_X509_EXTENSION,
+                       0,V_ASN1_SEQUENCE);
+               }
+
+       M_ASN1_D2I_Finish(a,X509_CRL_INFO_free,ASN1_F_D2I_X509_CRL_INFO);
+       }
+
+int i2d_X509_CRL(a,pp)
+X509_CRL *a;
+unsigned char **pp;
+       {
+       M_ASN1_I2D_vars(a);
+
+       M_ASN1_I2D_len(a->crl,i2d_X509_CRL_INFO);
+       M_ASN1_I2D_len(a->sig_alg,i2d_X509_ALGOR);
+       M_ASN1_I2D_len(a->signature,i2d_ASN1_BIT_STRING);
+
+       M_ASN1_I2D_seq_total();
+
+       M_ASN1_I2D_put(a->crl,i2d_X509_CRL_INFO);
+       M_ASN1_I2D_put(a->sig_alg,i2d_X509_ALGOR);
+       M_ASN1_I2D_put(a->signature,i2d_ASN1_BIT_STRING);
+
+       M_ASN1_I2D_finish();
+       }
+
+X509_CRL *d2i_X509_CRL(a,pp,length)
+X509_CRL **a;
+unsigned char **pp;
+long length;
+       {
+       M_ASN1_D2I_vars(a,X509_CRL *,X509_CRL_new);
+
+       M_ASN1_D2I_Init();
+       M_ASN1_D2I_start_sequence();
+       M_ASN1_D2I_get(ret->crl,d2i_X509_CRL_INFO);
+       M_ASN1_D2I_get(ret->sig_alg,d2i_X509_ALGOR);
+       M_ASN1_D2I_get(ret->signature,d2i_ASN1_BIT_STRING);
+
+       M_ASN1_D2I_Finish(a,X509_CRL_free,ASN1_F_D2I_X509_CRL);
+       }
+
+
+X509_REVOKED *X509_REVOKED_new()
+       {
+       X509_REVOKED *ret=NULL;
+
+       M_ASN1_New_Malloc(ret,X509_REVOKED);
+       M_ASN1_New(ret->serialNumber,ASN1_INTEGER_new);
+       M_ASN1_New(ret->revocationDate,ASN1_UTCTIME_new);
+       ret->extensions=NULL;
+       return(ret);
+       M_ASN1_New_Error(ASN1_F_X509_REVOKED_NEW);
+       }
+
+X509_CRL_INFO *X509_CRL_INFO_new()
+       {
+       X509_CRL_INFO *ret=NULL;
+
+       M_ASN1_New_Malloc(ret,X509_CRL_INFO);
+       ret->version=NULL;
+       M_ASN1_New(ret->sig_alg,X509_ALGOR_new);
+       M_ASN1_New(ret->issuer,X509_NAME_new);
+       M_ASN1_New(ret->lastUpdate,ASN1_UTCTIME_new);
+       ret->nextUpdate=NULL;
+       M_ASN1_New(ret->revoked,sk_new_null);
+       M_ASN1_New(ret->extensions,sk_new_null);
+       ret->revoked->comp=(int (*)())X509_REVOKED_cmp;
+       return(ret);
+       M_ASN1_New_Error(ASN1_F_X509_CRL_INFO_NEW);
+       }
+
+X509_CRL *X509_CRL_new()
+       {
+       X509_CRL *ret=NULL;
+
+       M_ASN1_New_Malloc(ret,X509_CRL);
+       ret->references=1;
+       M_ASN1_New(ret->crl,X509_CRL_INFO_new);
+       M_ASN1_New(ret->sig_alg,X509_ALGOR_new);
+       M_ASN1_New(ret->signature,ASN1_BIT_STRING_new);
+       return(ret);
+       M_ASN1_New_Error(ASN1_F_X509_CRL_NEW);
+       }
+
+void X509_REVOKED_free(a)
+X509_REVOKED *a;
+       {
+       if (a == NULL) return;
+       ASN1_INTEGER_free(a->serialNumber);
+       ASN1_UTCTIME_free(a->revocationDate);
+       sk_pop_free(a->extensions,X509_EXTENSION_free);
+       Free((char *)a);
+       }
+
+void X509_CRL_INFO_free(a)
+X509_CRL_INFO *a;
+       {
+       if (a == NULL) return;
+       ASN1_INTEGER_free(a->version);
+       X509_ALGOR_free(a->sig_alg);
+       X509_NAME_free(a->issuer);
+       ASN1_UTCTIME_free(a->lastUpdate);
+       if (a->nextUpdate)
+               ASN1_UTCTIME_free(a->nextUpdate);
+       sk_pop_free(a->revoked,X509_REVOKED_free);
+       sk_pop_free(a->extensions,X509_EXTENSION_free);
+       Free((char *)a);
+       }
+
+void X509_CRL_free(a)
+X509_CRL *a;
+       {
+       int i;
+
+       if (a == NULL) return;
+
+       i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_X509_CRL);
+#ifdef REF_PRINT
+       REF_PRINT("X509_CRL",a);
+#endif
+       if (i > 0) return;
+#ifdef REF_CHECK
+       if (i < 0)
+               {
+               fprintf(stderr,"X509_CRL_free, bad reference count\n");
+               abort();
+               }
+#endif
+
+       X509_CRL_INFO_free(a->crl);
+       X509_ALGOR_free(a->sig_alg);
+       ASN1_BIT_STRING_free(a->signature);
+       Free((char *)a);
+       }
+
+static int X509_REVOKED_cmp(a,b)
+X509_REVOKED **a,**b;
+       {
+       return(ASN1_STRING_cmp(
+               (ASN1_STRING *)(*a)->serialNumber,
+               (ASN1_STRING *)(*b)->serialNumber));
+       }
+
+static int X509_REVOKED_seq_cmp(a,b)
+X509_REVOKED **a,**b;
+       {
+       return((*a)->sequence-(*b)->sequence);
+       }
index 0ed2c87b6494576b0a37527464a38c0762f3f4fc..01aa0cb6fc6e5866bb8ed4562352de16f78a7742 100644 (file)
@@ -61,9 +61,9 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_X509_ALGOR,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_ALGOR_NEW,ASN1_R_EXPECTING_A_SEQUENCE);
- * ASN1err(ASN1_F_D2I_X509_ALGOR,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_ALGOR,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_ALGOR_NEW,ERR_R_EXPECTING_AN_ASN1_SEQUENCE);
+ * ASN1err(ASN1_F_D2I_X509_ALGOR,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_X509_ALGOR(a,pp)
@@ -107,9 +107,10 @@ long length;
 X509_ALGOR *X509_ALGOR_new()
        {
        X509_ALGOR *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_ALGOR);
-       M_ASN1_New(ret->algorithm,ASN1_OBJECT_new);
+       ret->algorithm=OBJ_nid2obj(NID_undef);
        ret->parameter=NULL;
        return(ret);
        M_ASN1_New_Error(ASN1_F_X509_ALGOR_NEW);
index e52ced86276b9246c2e1186018ac15b265621993..d9faf141d3991ee629ffa9278ad1be3b50926db1 100644 (file)
@@ -62,7 +62,7 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_X509_ATTRIBUTE,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_ATTRIBUTE,ERR_R_ASN1_LENGTH_MISMATCH);
  * ASN1err(ASN1_F_X509_ATTRIBUTE_NEW,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE);
  * ASN1err(ASN1_F_I2D_X509_ATTRIBUTE,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE);
  */
@@ -115,7 +115,7 @@ long length;
                (M_ASN1_next == (V_ASN1_CONSTRUCTED|V_ASN1_UNIVERSAL|V_ASN1_SET)))
                {
                ret->set=1;
-               M_ASN1_D2I_get_set(ret->value.set,d2i_ASN1_TYPE);
+               M_ASN1_D2I_get_set(ret->value.set,d2i_ASN1_TYPE,ASN1_TYPE_free);
                }
        else
                {
@@ -126,12 +126,37 @@ long length;
        M_ASN1_D2I_Finish(a,X509_ATTRIBUTE_free,ASN1_F_D2I_X509_ATTRIBUTE);
        }
 
+X509_ATTRIBUTE *X509_ATTRIBUTE_create(nid,atrtype,value)
+int nid;
+int atrtype;
+char *value;
+       {
+       X509_ATTRIBUTE *ret=NULL;
+       ASN1_TYPE *val=NULL;
+
+       if ((ret=X509_ATTRIBUTE_new()) == NULL)
+               return(NULL);
+       ret->object=OBJ_nid2obj(nid);
+       ret->set=1;
+       if ((ret->value.set=sk_new_null()) == NULL) goto err;
+       if ((val=ASN1_TYPE_new()) == NULL) goto err;
+       if (!sk_push(ret->value.set,(char *)val)) goto err;
+
+       ASN1_TYPE_set(val,atrtype,value);
+       return(ret);
+err:
+       if (ret != NULL) X509_ATTRIBUTE_free(ret);
+       if (val != NULL) ASN1_TYPE_free(val);
+       return(NULL);
+       }
+
 X509_ATTRIBUTE *X509_ATTRIBUTE_new()
        {
        X509_ATTRIBUTE *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_ATTRIBUTE);
-       M_ASN1_New(ret->object,ASN1_OBJECT_new);
+       ret->object=OBJ_nid2obj(NID_undef);
        ret->set=0;
        ret->value.ptr=NULL;
        return(ret);
index 4fc2cc9f6e46f380690e96e8f7f1d2d3eaf3beb1..27aad14c521dab9449aac484a0ca22e166e8cf53 100644 (file)
@@ -61,8 +61,8 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_X509_CINF,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_CINF_NEW,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_CINF,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_CINF_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_X509_CINF(a,pp)
@@ -140,7 +140,7 @@ long length;
                if (ret->subjectUID != NULL)
                        {
                        ASN1_BIT_STRING_free(ret->subjectUID);
-                       ret->issuerUID=NULL;
+                       ret->subjectUID=NULL;
                        }
                M_ASN1_D2I_get_IMP_opt(ret->issuerUID,d2i_ASN1_BIT_STRING,  1,
                        V_ASN1_BIT_STRING);
@@ -153,8 +153,8 @@ long length;
                        while (sk_num(ret->extensions))
                                X509_EXTENSION_free((X509_EXTENSION *)
                                        sk_pop(ret->extensions));
-               M_ASN1_D2I_get_EXP_set_opt(ret->extensions,d2i_X509_EXTENSION,3,
-                       V_ASN1_SEQUENCE);
+               M_ASN1_D2I_get_EXP_set_opt(ret->extensions,d2i_X509_EXTENSION,
+                       X509_EXTENSION_free,3,V_ASN1_SEQUENCE);
                }
        M_ASN1_D2I_Finish(a,X509_CINF_free,ASN1_F_D2I_X509_CINF);
        }
@@ -162,6 +162,7 @@ long length;
 X509_CINF *X509_CINF_new()
        {
        X509_CINF *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_CINF);
        ret->version=NULL;
index 13acdab427d772b85faebc305f1beb0b9b842a10..fe7b5f175b6c22b8780d1892a9d867f542cf8083 100644 (file)
 #include "x509.h"
 
 /*
- * ASN1err(ASN1_F_D2I_X509_CRL,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_D2I_X509_CRL_INFO,ASN1_R_EXPECTING_A_SEQUENCE);
- * ASN1err(ASN1_F_D2I_X509_REVOKED,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_CRL_NEW,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_CRL_INFO_NEW,ASN1_R_EXPECTING_A_SEQUENCE);
- * ASN1err(ASN1_F_X509_REVOKED_NEW,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_CRL,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_CRL_INFO,ERR_R_EXPECTING_AN_ASN1_SEQUENCE);
+ * ASN1err(ASN1_F_D2I_X509_REVOKED,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_CRL_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_CRL_INFO_NEW,ERR_R_EXPECTING_AN_ASN1_SEQUENCE);
+ * ASN1err(ASN1_F_X509_REVOKED_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 #ifndef NOPROTO
@@ -108,7 +108,8 @@ long length;
        M_ASN1_D2I_start_sequence();
        M_ASN1_D2I_get(ret->serialNumber,d2i_ASN1_INTEGER);
        M_ASN1_D2I_get(ret->revocationDate,d2i_ASN1_UTCTIME);
-       M_ASN1_D2I_get_seq_opt(ret->extensions,d2i_X509_EXTENSION);
+       M_ASN1_D2I_get_seq_opt(ret->extensions,d2i_X509_EXTENSION,
+               X509_EXTENSION_free);
        M_ASN1_D2I_Finish(a,X509_REVOKED_free,ASN1_F_D2I_X509_REVOKED);
        }
 
@@ -183,7 +184,7 @@ long length;
                while (sk_num(ret->revoked))
                        X509_REVOKED_free((X509_REVOKED *)sk_pop(ret->revoked));
                }
-       M_ASN1_D2I_get_seq_opt(ret->revoked,d2i_X509_REVOKED);
+       M_ASN1_D2I_get_seq_opt(ret->revoked,d2i_X509_REVOKED,X509_REVOKED_free);
 
        if (ret->revoked != NULL)
                {
@@ -203,7 +204,7 @@ long length;
                        }
                        
                M_ASN1_D2I_get_EXP_set_opt(ret->extensions,d2i_X509_EXTENSION,
-                       0,V_ASN1_SEQUENCE);
+                       X509_EXTENSION_free,0,V_ASN1_SEQUENCE);
                }
 
        M_ASN1_D2I_Finish(a,X509_CRL_INFO_free,ASN1_F_D2I_X509_CRL_INFO);
@@ -248,6 +249,7 @@ long length;
 X509_REVOKED *X509_REVOKED_new()
        {
        X509_REVOKED *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_REVOKED);
        M_ASN1_New(ret->serialNumber,ASN1_INTEGER_new);
@@ -260,6 +262,7 @@ X509_REVOKED *X509_REVOKED_new()
 X509_CRL_INFO *X509_CRL_INFO_new()
        {
        X509_CRL_INFO *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_CRL_INFO);
        ret->version=NULL;
@@ -277,6 +280,7 @@ X509_CRL_INFO *X509_CRL_INFO_new()
 X509_CRL *X509_CRL_new()
        {
        X509_CRL *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_CRL);
        ret->references=1;
index 54ffe2f00b24cd77903bd223c8ddb056686df301..f5e3ece2261be7279d0057dddd0f602748059682 100644 (file)
@@ -62,8 +62,8 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_X509_EXTENSION,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_EXTENSION_NEW,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_EXTENSION,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_EXTENSION_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_X509_EXTENSION(a,pp)
@@ -130,9 +130,10 @@ long length;
 X509_EXTENSION *X509_EXTENSION_new()
        {
        X509_EXTENSION *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_EXTENSION);
-       M_ASN1_New(ret->object,ASN1_OBJECT_new);
+       ret->object=OBJ_nid2obj(NID_undef);
        M_ASN1_New(ret->value,ASN1_OCTET_STRING_new);
        ret->critical=0;
        ret->netscape_hack=0;
index 28b9c34b589747156a1d9ac134a9b570eff9a739..3b8bc5191f0ae07d8df46dab701f7ef319d58e29 100644 (file)
@@ -62,9 +62,9 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_X509_NAME,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_NAME,ERR_R_ASN1_LENGTH_MISMATCH);
  * ASN1err(ASN1_F_X509_NAME_NEW,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE);
- * ASN1err(ASN1_F_D2I_X509_NAME_ENTRY,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_NAME_ENTRY,ERR_R_ASN1_LENGTH_MISMATCH);
  * ASN1err(ASN1_F_X509_NAME_ENTRY_NEW,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE);
  */
 
@@ -213,7 +213,8 @@ long length;
        for (;;)
                {
                if (M_ASN1_D2I_end_sequence()) break;
-               M_ASN1_D2I_get_set(ret->entries,d2i_X509_NAME_ENTRY);
+               M_ASN1_D2I_get_set(ret->entries,d2i_X509_NAME_ENTRY,
+                       X509_NAME_ENTRY_free);
                for (; idx < sk_num(ret->entries); idx++)
                        {
                        ((X509_NAME_ENTRY *)sk_value(ret->entries,idx))->set=
@@ -234,9 +235,11 @@ long length;
 X509_NAME *X509_NAME_new()
        {
        X509_NAME *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_NAME);
-       if ((ret->entries=sk_new(NULL)) == NULL) goto err2;
+       if ((ret->entries=sk_new(NULL)) == NULL)
+               { c.line=__LINE__; goto err2; }
        M_ASN1_New(ret->bytes,BUF_MEM_new);
        ret->modified=1;
        return(ret);
@@ -246,6 +249,7 @@ X509_NAME *X509_NAME_new()
 X509_NAME_ENTRY *X509_NAME_ENTRY_new()
        {
        X509_NAME_ENTRY *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_NAME_ENTRY);
 /*     M_ASN1_New(ret->object,ASN1_OBJECT_new);*/
index 1d4d92612931ab03b4f973069cc183e95c603284..3a359cce9e36653e80c405259956638410cb2708 100644 (file)
@@ -91,6 +91,7 @@ long length;
        if (ret->cipher.cipher == NULL)
                {
                c.error=ASN1_R_UNSUPPORTED_CIPHER;
+               c.line=__LINE__;
                goto err;
                }
        if (ret->enc_algor->parameter->type == V_ASN1_OCTET_STRING) 
@@ -99,6 +100,7 @@ long length;
                if (i > EVP_MAX_IV_LENGTH)
                        {
                        c.error=ASN1_R_IV_TOO_LARGE;
+                       c.line=__LINE__;
                        goto err;
                        }
                memcpy(ret->cipher.iv,
@@ -112,6 +114,7 @@ long length;
 X509_PKEY *X509_PKEY_new()
        {
        X509_PKEY *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_PKEY);
        ret->version=0;
index a309cf74a79487335ef6668afb13a8d59cee03f5..b8e6d0e00ee75bcb2de687ea9869ead4c4c304f7 100644 (file)
@@ -61,8 +61,8 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_X509_PUBKEY,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_PUBKEY_NEW,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_PUBKEY,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_PUBKEY_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_X509_PUBKEY(a,pp)
@@ -104,6 +104,7 @@ long length;
 X509_PUBKEY *X509_PUBKEY_new()
        {
        X509_PUBKEY *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_PUBKEY);
        M_ASN1_New(ret->algor,X509_ALGOR_new);
index ff0be13d379aa579ed71d6de1ef1865acdb76966..a0df9982dc4650419c0fd8a008bc924d20997e6b 100644 (file)
 #include "x509.h"
 
 /*
- * ASN1err(ASN1_F_D2I_X509_REQ,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_D2I_X509_REQ_INFO,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_REQ_NEW,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_REQ_INFO_NEW,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_REQ,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_REQ_INFO,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_REQ_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_REQ_INFO_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_X509_REQ_INFO(a,pp)
@@ -141,7 +141,8 @@ long length;
                ret->req_kludge=1;
        else
                {
-               M_ASN1_D2I_get_IMP_set(ret->attributes,d2i_X509_ATTRIBUTE,0);
+               M_ASN1_D2I_get_IMP_set(ret->attributes,d2i_X509_ATTRIBUTE,
+                       X509_ATTRIBUTE_free,0);
                }
 
        M_ASN1_D2I_Finish(a,X509_REQ_INFO_free,ASN1_F_D2I_X509_REQ_INFO);
@@ -150,6 +151,7 @@ long length;
 X509_REQ_INFO *X509_REQ_INFO_new()
        {
        X509_REQ_INFO *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_REQ_INFO);
        M_ASN1_New(ret->version,ASN1_INTEGER_new);
@@ -208,6 +210,7 @@ long length;
 X509_REQ *X509_REQ_new()
        {
        X509_REQ *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_REQ);
        ret->references=1;
index f0a2e4c27a3b05034d81cb60e385124edeb60bbc..245a76b0f09b76fd460baa11718eec1e70b8a04e 100644 (file)
@@ -61,8 +61,8 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_X509_SIG,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_SIG_NEW,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_SIG,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_SIG_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_X509_SIG(a,pp)
@@ -99,6 +99,7 @@ long length;
 X509_SIG *X509_SIG_new()
        {
        X509_SIG *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_SIG);
        M_ASN1_New(ret->algor,X509_ALGOR_new);
index 4a80df44b84c0b4a10251bbeb56aa339b948d0d9..5600d305a3eed874b8fdb0de1085a9296d395f4a 100644 (file)
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_NETSCAPE_SPKAC,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_NETSCAPE_SPKAC_NEW,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_D2I_NETSCAPE_SPKI,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_NETSCAPE_SPKI_NEW,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_NETSCAPE_SPKAC,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_NETSCAPE_SPKAC_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_NETSCAPE_SPKI,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_NETSCAPE_SPKI_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_NETSCAPE_SPKAC(a,pp)
@@ -106,6 +106,7 @@ long length;
 NETSCAPE_SPKAC *NETSCAPE_SPKAC_new()
        {
        NETSCAPE_SPKAC *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,NETSCAPE_SPKAC);
        M_ASN1_New(ret->pubkey,X509_PUBKEY_new);
@@ -160,6 +161,7 @@ long length;
 NETSCAPE_SPKI *NETSCAPE_SPKI_new()
        {
        NETSCAPE_SPKI *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,NETSCAPE_SPKI);
        M_ASN1_New(ret->spkac,NETSCAPE_SPKAC_new);
index a9c390f88ce889eae8d449035ad7114a4930c83a..8d996e99507582af03b1e990ad1e9223775e8891 100644 (file)
@@ -99,6 +99,7 @@ long length;
 X509_VAL *X509_VAL_new()
        {
        X509_VAL *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_VAL);
        M_ASN1_New(ret->notBefore,ASN1_UTCTIME_new);
index bc466ce0f6870f233a3e2dc6c42e3c55655127f2..e235abb23110dc2e0be99a236f4bb9db98f05413 100644 (file)
@@ -62,8 +62,8 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_X509,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_NEW,ASN1_R_BAD_GET_OBJECT);
+ * ASN1err(ASN1_F_D2I_X509,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_NEW,ERR_R_BAD_GET_ASN1_OBJECT_CALL);
  */
 
 static ASN1_METHOD meth={
@@ -117,6 +117,7 @@ ret->name=X509_NAME_oneline(ret->cert_info->subject,NULL,0);
 X509 *X509_new()
        {
        X509 *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509);
        ret->references=1;
@@ -149,9 +150,11 @@ X509 *a;
                }
 #endif
 
+       /* CRYPTO_free_ex_data(bio_meth,(char *)a,&a->ex_data); */
        X509_CINF_free(a->cert_info);
        X509_ALGOR_free(a->sig_alg);
        ASN1_BIT_STRING_free(a->signature);
+
        if (a->name != NULL) Free(a->name);
        Free((char *)a);
        }
index 236671f238d13a8b05303efdc3540529e77ad882..22aa4ca6f5bace19b02ae834419b12ec344bfdf9 100644 (file)
@@ -61,7 +61,7 @@ asm/bx86-out.o: asm/bx86unix.cpp
 
 # bsdi
 asm/bx86bsdi.o: asm/bx86unix.cpp
-       $(CPP) -DBSDI asm/bx86unix.cpp | as -o asm/bx86bsdi.o
+       $(CPP) -DBSDI asm/bx86unix.cpp | sed 's/ :/:/' | as -o asm/bx86bsdi.o
 
 asm/bx86unix.cpp:
        (cd asm; perl bf-586.pl cpp >bx86unix.cpp)
index 6d16360bd98a91a78aa5cf8ba5fdb4386f24c48e..3b534ac038d56f0112148fed5d7df4aaa888bff9 100644 (file)
@@ -64,7 +64,7 @@
  * CAMBRIDGE SECURITY WORKSHOP, CAMBRIDGE, U.K., DECEMBER 9-11, 1993)
  */
 
-char *BF_version="BlowFish part of SSLeay 0.9.0b 29-Jun-1998";
+char *BF_version="BlowFish part of SSLeay 0.9.1a 06-Jul-1998";
 
 char *BF_options()
        {
index 5cfa60c5373210a0a044a6603c7f38d3539c9ddb..735d16b764d10fdd1e85e277d888368726e8a378 100644 (file)
@@ -92,7 +92,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
index 640d820dd3c2f6a9e8370de111ad15d373016c88..30db62b234e7a2d1a3ea196cef44053834102e52 100644 (file)
@@ -92,7 +92,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
index a45909527c9f27d11da148441a314112cd76f1a9..2c36150b9b038405bac5d852dbab92c777559ded 100644 (file)
@@ -148,7 +148,7 @@ unsigned char *ip;
 
 int BIO_get_port(str,port_ptr)
 char *str;
-short *port_ptr;
+unsigned short *port_ptr;
        {
        int i;
        struct servent *s;
@@ -223,13 +223,13 @@ char *parg;
                {
        case BIO_GHBN_CTRL_HITS:
                return(BIO_ghbn_hits);
-               break;
+               /* break; */
        case BIO_GHBN_CTRL_MISSES:
                return(BIO_ghbn_miss);
-               break;
+               /* break; */
        case BIO_GHBN_CTRL_CACHE_SIZE:
                return(GHBN_NUM);
-               break;
+               /* break; */
        case BIO_GHBN_CTRL_GET_ENTRY:
                if ((iarg >= 0) && (iarg <GHBN_NUM) &&
                        (ghbn_cache[iarg].order > 0))
@@ -241,7 +241,7 @@ char *parg;
                        return(1);
                        }
                return(0);
-               break;
+               /* break; */
        case BIO_GHBN_CTRL_FLUSH:
                for (i=0; i<GHBN_NUM; i++)
                        ghbn_cache[i].order=0;
@@ -258,46 +258,51 @@ struct hostent *a;
        struct hostent *ret;
        int i,j;
 
-       ret=(struct hostent *)malloc(sizeof(struct hostent));
+       MemCheck_off();
+       ret=(struct hostent *)Malloc(sizeof(struct hostent));
        if (ret == NULL) return(NULL);
        memset(ret,0,sizeof(struct hostent));
 
        for (i=0; a->h_aliases[i] != NULL; i++)
                ;
        i++;
-       ret->h_aliases=(char **)malloc(sizeof(char *)*i);
+       ret->h_aliases=(char **)Malloc(sizeof(char *)*i);
        memset(ret->h_aliases,0,sizeof(char *)*i);
        if (ret == NULL) goto err;
 
        for (i=0; a->h_addr_list[i] != NULL; i++)
                ;
        i++;
-       ret->h_addr_list=(char **)malloc(sizeof(char *)*i);
+       ret->h_addr_list=(char **)Malloc(sizeof(char *)*i);
        memset(ret->h_addr_list,0,sizeof(char *)*i);
        if (ret->h_addr_list == NULL) goto err;
 
        j=strlen(a->h_name)+1;
-       if ((ret->h_name=malloc(j)) == NULL) goto err;
-       memcpy((char *)ret->h_name,a->h_name,j);
+       if ((ret->h_name=Malloc(j)) == NULL) goto err;
+       memcpy((char *)ret->h_name,a->h_name,j+1);
        for (i=0; a->h_aliases[i] != NULL; i++)
                {
                j=strlen(a->h_aliases[i])+1;
-               if ((ret->h_aliases[i]=malloc(j)) == NULL) goto err;
-               memcpy(ret->h_aliases[i],a->h_aliases[i],j);
+               if ((ret->h_aliases[i]=Malloc(j)) == NULL) goto err;
+               memcpy(ret->h_aliases[i],a->h_aliases[i],j+1);
                }
        ret->h_length=a->h_length;
        ret->h_addrtype=a->h_addrtype;
        for (i=0; a->h_addr_list[i] != NULL; i++)
                {
-               if ((ret->h_addr_list[i]=malloc(a->h_length)) == NULL)
+               if ((ret->h_addr_list[i]=Malloc(a->h_length)) == NULL)
                        goto err;
                memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length);
                }
-       return(ret);
+       if (0)
+               {
 err:   
-       if (ret != NULL)
-               ghbn_free(ret);
-       return(NULL);
+               if (ret != NULL)
+                       ghbn_free(ret);
+               ret=NULL;
+               }
+       MemCheck_on();
+       return(ret);
        }
 
 static void ghbn_free(a)
@@ -308,17 +313,17 @@ struct hostent *a;
        if (a->h_aliases != NULL)
                {
                for (i=0; a->h_aliases[i] != NULL; i++)
-                       free(a->h_aliases[i]);
-               free(a->h_aliases);
+                       Free(a->h_aliases[i]);
+               Free(a->h_aliases);
                }
        if (a->h_addr_list != NULL)
                {
                for (i=0; a->h_addr_list[i] != NULL; i++)
-                       free(a->h_addr_list[i]);
-               free(a->h_addr_list);
+                       Free(a->h_addr_list[i]);
+               Free(a->h_addr_list);
                }
-       if (a->h_name != NULL) free((char *)a->h_name);
-       free(a);
+       if (a->h_name != NULL) Free((char *)a->h_name);
+       Free(a);
        }
 
 struct hostent *BIO_gethostbyname(name)
@@ -467,16 +472,18 @@ unsigned char ip[4];
        return(1);
        }
 
-int BIO_get_accept_socket(host)
+int BIO_get_accept_socket(host,bind_mode)
 char *host;
+int bind_mode;
        {
        int ret=0;
-       struct sockaddr_in server;
-       int s= -1;
+       struct sockaddr_in server,client;
+       int s= -1,cs;
        unsigned char ip[4];
        short port;
        char *str,*h,*p,*e;
        unsigned long l;
+       int err_num;
 
        if (!BIO_sock_init()) return(INVALID_SOCKET);
 
@@ -517,12 +524,13 @@ char *host;
                if (!BIO_get_host_ip(h,&(ip[0]))) return(INVALID_SOCKET);
                l=(unsigned long)
                        ((unsigned long)ip[0]<<24L)|
-                       ((unsigned long)ip[0]<<16L)|
-                       ((unsigned long)ip[0]<< 8L)|
-                       ((unsigned long)ip[0]);
+                       ((unsigned long)ip[1]<<16L)|
+                       ((unsigned long)ip[2]<< 8L)|
+                       ((unsigned long)ip[3]);
                server.sin_addr.s_addr=htonl(l);
                }
 
+again:
        s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);
        if (s == INVALID_SOCKET)
                {
@@ -531,9 +539,45 @@ char *host;
                BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET);
                goto err;
                }
+
+#ifdef SO_REUSEADDR
+       if (bind_mode == BIO_BIND_REUSEADDR)
+               {
+               int i=1;
+
+               ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i));
+               bind_mode=BIO_BIND_NORMAL;
+               }
+#endif
        if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1)
                {
-               SYSerr(SYS_F_BIND,get_last_socket_error());
+#ifdef SO_REUSEADDR
+               err_num=get_last_socket_error();
+               if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) &&
+                       (err_num == EADDRINUSE))
+                       {
+                       memcpy((char *)&client,(char *)&server,sizeof(server));
+                       if (strcmp(h,"*") == 0)
+                               client.sin_addr.s_addr=htonl(0x7F000001);
+                       cs=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);
+                       if (cs != INVALID_SOCKET)
+                               {
+                               int ii;
+                               ii=connect(cs,(struct sockaddr *)&client,
+                                       sizeof(client));
+                               closesocket(cs);
+                               if (ii == INVALID_SOCKET)
+                                       {
+                                       bind_mode=BIO_BIND_REUSEADDR;
+                                       closesocket(s);
+                                       goto again;
+                                       }
+                               /* else error */
+                               }
+                       /* else error */
+                       }
+#endif
+               SYSerr(SYS_F_BIND,err_num);
                ERR_add_error_data(3,"port='",host,"'");
                BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET);
                goto err;
@@ -550,11 +594,7 @@ err:
        if (str != NULL) Free(str);
        if ((ret == 0) && (s != INVALID_SOCKET))
                {
-#ifdef WINDOWS
                closesocket(s);
-#else
-               close(s);
-#endif
                s= INVALID_SOCKET;
                }
        return(s);
@@ -626,3 +666,16 @@ int on;
        }
 #endif
 
+int BIO_socket_nbio(s,mode)
+int s;
+int mode;
+       {
+       int ret= -1;
+       unsigned long l;
+
+       l=mode;
+#ifdef FIONBIO
+       ret=BIO_socket_ioctl(s,FIONBIO,&l);
+#endif
+       return(ret == 0);
+       }
index 6e2f2b63ca00057fe0fd24f6255158a72964d596..daef6430f8211ffbd704ee9c90620821237f9d49 100644 (file)
@@ -3,23 +3,25 @@
 /* Function codes. */
 #define BIO_F_ACPT_STATE                                100
 #define BIO_F_BIO_ACCEPT                                101
-#define BIO_F_BIO_CTRL                                  102
-#define BIO_F_BIO_GETS                                  103
-#define BIO_F_BIO_GET_ACCEPT_SOCKET                     104
-#define BIO_F_BIO_GET_HOST_IP                           105
-#define BIO_F_BIO_GET_PORT                              106
-#define BIO_F_BIO_NEW                                   107
-#define BIO_F_BIO_NEW_FILE                              108
-#define BIO_F_BIO_PUTS                                  109
-#define BIO_F_BIO_READ                                  110
-#define BIO_F_BIO_SOCK_INIT                             111
-#define BIO_F_BIO_WRITE                                         112
-#define BIO_F_BUFFER_CTRL                               113
-#define BIO_F_CONN_STATE                                114
-#define BIO_F_FILE_CTRL                                         115
-#define BIO_F_MEM_WRITE                                         116
-#define BIO_F_SSL_NEW                                   117
-#define BIO_F_WSASTARTUP                                118
+#define BIO_F_BIO_BER_GET_HEADER                        102
+#define BIO_F_BIO_CTRL                                  103
+#define BIO_F_BIO_GETS                                  104
+#define BIO_F_BIO_GET_ACCEPT_SOCKET                     105
+#define BIO_F_BIO_GET_HOST_IP                           106
+#define BIO_F_BIO_GET_PORT                              107
+#define BIO_F_BIO_NEW                                   108
+#define BIO_F_BIO_NEW_FILE                              109
+#define BIO_F_BIO_PUTS                                  110
+#define BIO_F_BIO_READ                                  111
+#define BIO_F_BIO_SOCK_INIT                             112
+#define BIO_F_BIO_WRITE                                         113
+#define BIO_F_BUFFER_CTRL                               114
+#define BIO_F_CONN_STATE                                115
+#define BIO_F_FILE_CTRL                                         116
+#define BIO_F_MEM_WRITE                                         117
+#define BIO_F_SOCKS4A_STATE                             118
+#define BIO_F_SSL_NEW                                   119
+#define BIO_F_WSASTARTUP                                120
 
 /* Reason codes. */
 #define BIO_R_ACCEPT_ERROR                              100
 #define BIO_R_NO_PORT_DEFINED                           113
 #define BIO_R_NO_PORT_SPECIFIED                                 114
 #define BIO_R_NULL_PARAMETER                            115
-#define BIO_R_UNABLE_TO_BIND_SOCKET                     116
-#define BIO_R_UNABLE_TO_CREATE_SOCKET                   117
-#define BIO_R_UNABLE_TO_LISTEN_SOCKET                   118
-#define BIO_R_UNINITALISED                              119
-#define BIO_R_UNSUPPORTED_METHOD                        120
-#define BIO_R_WSASTARTUP                                121
+#define BIO_R_SOCKS_ID_AND_IDENT_DID_NOT_MATCH          116
+#define BIO_R_SOCKS_REJECTED_CONNECTION                         117
+#define BIO_R_SOCKS_UNABLE_TO_TALK_TO_IDENT_SERVER      118
+#define BIO_R_SOCKS_UNKNOWN_ERROR                       119
+#define BIO_R_TAG_MISMATCH                              120
+#define BIO_R_UNABLE_TO_BIND_SOCKET                     121
+#define BIO_R_UNABLE_TO_CREATE_SOCKET                   122
+#define BIO_R_UNABLE_TO_LISTEN_SOCKET                   123
+#define BIO_R_UNINITALISED                              124
+#define BIO_R_UNSUPPORTED_METHOD                        125
+#define BIO_R_WSASTARTUP                                126
index 300b330e00db9ace3cd17ace75b77608b89dfd85..35db3dffb1ffd295e58a50e720b218dba5ca9c60 100644 (file)
@@ -84,6 +84,7 @@ extern "C" {
 #define BIO_TYPE_PROXY_SERVER  (15|0x0200)             /* server proxy BIO */
 #define BIO_TYPE_NBIO_TEST     (16|0x0200)             /* server proxy BIO */
 #define BIO_TYPE_NULL_FILTER   (17|0x0200)
+#define BIO_TYPE_BER           (18|0x0200)             /* BER -> bin filter */
 
 #define BIO_TYPE_DESCRIPTOR    0x0100  /* socket, fd, connect or accept */
 #define BIO_TYPE_FILTER                0x0200
@@ -276,7 +277,7 @@ typedef struct bio_f_buffer_ctx_struct
 #define BIO_CONN_S_OK                  6
 #define BIO_CONN_S_BLOCKED_CONNECT     7
 #define BIO_CONN_S_NBIO                        8
-#define BIO_CONN_get_param_hostname    BIO_ctrl
+/*#define BIO_CONN_get_param_hostname  BIO_ctrl */
 
 #define BIO_number_read(b)     ((b)->num_read)
 #define BIO_number_written(b)  ((b)->num_write)
@@ -309,6 +310,14 @@ typedef struct bio_f_buffer_ctx_struct
 #define BIO_C_SET_SSL_RENEGOTIATE_BYTES                125
 #define BIO_C_GET_SSL_NUM_RENEGOTIATES         126
 #define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT      127
+#define BIO_C_FILE_SEEK                                128
+#define BIO_C_GET_CIPHER_CTX                   129
+#define BIO_C_SET_BUF_MEM_EOF_RETURN           130/*return end of input value*/
+#define BIO_C_SET_BIND_MODE                    131
+#define BIO_C_GET_BIND_MODE                    132
+#define BIO_C_FILE_TELL                                133
+#define BIO_C_GET_SOCKS                                134
+#define BIO_C_SET_SOCKS                                135
 
 #define BIO_set_app_data(s,arg)                BIO_set_ex_data(s,0,(char *)arg)
 #define BIO_get_app_data(s)            BIO_get_ex_data(s,0)
@@ -320,7 +329,7 @@ void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)());
 int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
        int (*dup_func)(), void (*free_func)());
 
-/* BIO_s_connect_socket() */
+/* BIO_s_connect() and BIO_s_socks4a_connect() */
 #define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name)
 #define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port)
 #define BIO_set_conn_ip(b,ip)    BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip)
@@ -328,7 +337,8 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
 #define BIO_get_conn_hostname(b)  BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0)
 #define BIO_get_conn_port(b)      BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1)
 #define BIO_get_conn_ip(b,ip) BIO_ptr_ctrl(b,BIO_C_SET_CONNECT,2)
-#define BIO_get_conn_int port(b,port) BIO_int_ctrl(b,BIO_C_SET_CONNECT,3,port)
+#define BIO_get_conn_int_port(b,port) BIO_int_ctrl(b,BIO_C_SET_CONNECT,3,port)
+
 
 #define BIO_set_nbio(b,n)      BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL)
 
@@ -339,6 +349,12 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
 #define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?"a":NULL)
 #define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio)
 
+#define BIO_BIND_NORMAL                        0
+#define BIO_BIND_REUSEADDR_IF_UNUSED   1
+#define BIO_BIND_REUSEADDR             2
+#define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL)
+#define BIO_get_bind_mode(b,mode) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL)
+
 #define BIO_do_connect(b)      BIO_do_handshake(b)
 #define BIO_do_accept(b)       BIO_do_handshake(b)
 #define BIO_do_handshake(b)    BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL)
@@ -364,12 +380,17 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
 #define BIO_set_fp(b,fp,c)     BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp)
 #define BIO_get_fp(b,fpp)      BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)fpp)
 
+#define BIO_seek(b,ofs)        (int)BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,NULL)
+#define BIO_tell(b)    (int)BIO_ctrl(b,BIO_C_FILE_TELL,0,NULL)
+
 #define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
                BIO_CLOSE|BIO_FP_READ,name)
 #define BIO_write_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
                BIO_CLOSE|BIO_FP_WRITE,name)
 #define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
                BIO_CLOSE|BIO_FP_APPEND,name)
+#define BIO_rw_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
+               BIO_CLOSE|BIO_FP_READ|BIO_FP_WRITE,name)
 
 /* WARNING WARNING, this ups the reference count on the read bio of the
  * SSL structure.  This is because the ssl read BIO is now pointed to by
@@ -388,8 +409,11 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
 /* defined in evp.h */
 /* #define BIO_set_md(b,md)    BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */
 
+#define BIO_get_mem_data(b,pp) BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp)
 #define BIO_set_mem_buf(b,bm,c)        BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)bm)
 #define BIO_get_mem_ptr(b,pp)  BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0,(char *)pp)
+#define BIO_set_mem_eof_return(b,v) \
+                               BIO_ctrl(b,BIO_C_SET_BUF_MEM_EOF_RETURN,v,NULL)
 
 /* For the BIO_f_buffer() type */
 #define BIO_get_buffer_num_lines(b)    BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL)
@@ -486,8 +510,9 @@ BIO_METHOD *BIO_s_accept(void);
 BIO_METHOD *BIO_s_fd(void);
 BIO_METHOD *BIO_s_null(void);
 BIO_METHOD *BIO_f_null(void);
-BIO_METHOD *BIO_f_nbio_test(void);
 BIO_METHOD *BIO_f_buffer(void);
+BIO_METHOD *BIO_f_nbio_test(void);
+/* BIO_METHOD *BIO_f_ber(void); */
 
 int BIO_sock_should_retry(int i);
 int BIO_sock_non_fatal_error(int error);
@@ -498,9 +523,10 @@ int BIO_dump(BIO *b,char *bytes,int len);
 struct hostent *BIO_gethostbyname(char *name);
 int BIO_sock_error(int sock);
 int BIO_socket_ioctl(int fd, long type, unsigned long *arg);
-int BIO_get_port(char *str, short *port_ptr);
+int BIO_socket_nbio(int fd,int mode);
+int BIO_get_port(char *str, unsigned short *port_ptr);
 int BIO_get_host_ip(char *str, unsigned char *ip);
-int BIO_get_accept_socket(char *host_port);
+int BIO_get_accept_socket(char *host_port,int mode);
 int BIO_accept(int sock,char **ip_port);
 int BIO_sock_init(void );
 void BIO_sock_cleanup(void);
@@ -552,6 +578,7 @@ BIO_METHOD *BIO_s_null();
 BIO_METHOD *BIO_f_null();
 BIO_METHOD *BIO_f_buffer();
 BIO_METHOD *BIO_f_nbio_test();
+/* BIO_METHOD *BIO_f_ber(); */
 
 int BIO_sock_should_retry();
 int BIO_sock_non_fatal_error();
@@ -562,6 +589,7 @@ int BIO_dump();
 struct hostent *BIO_gethostbyname();
 int BIO_sock_error();
 int BIO_socket_ioctl();
+int BIO_socket_nbio();
 int BIO_get_port();
 int BIO_get_host_ip();
 int BIO_get_accept_socket();
@@ -579,7 +607,7 @@ BIO *BIO_new_accept();
 
 void BIO_copy_next_retry();
 
-int BIO_ghbn_ctrl();
+long BIO_ghbn_ctrl();
 
 #endif
 
@@ -639,23 +667,24 @@ int BIO_printf();
 /* Function codes. */
 #define BIO_F_ACPT_STATE                                100
 #define BIO_F_BIO_ACCEPT                                101
-#define BIO_F_BIO_CTRL                                  102
-#define BIO_F_BIO_GETS                                  103
-#define BIO_F_BIO_GET_ACCEPT_SOCKET                     104
-#define BIO_F_BIO_GET_HOST_IP                           105
-#define BIO_F_BIO_GET_PORT                              106
-#define BIO_F_BIO_NEW                                   107
-#define BIO_F_BIO_NEW_FILE                              108
-#define BIO_F_BIO_PUTS                                  109
-#define BIO_F_BIO_READ                                  110
-#define BIO_F_BIO_SOCK_INIT                             111
-#define BIO_F_BIO_WRITE                                         112
-#define BIO_F_BUFFER_CTRL                               113
-#define BIO_F_CONN_STATE                                114
-#define BIO_F_FILE_CTRL                                         115
-#define BIO_F_MEM_WRITE                                         116
-#define BIO_F_SSL_NEW                                   117
-#define BIO_F_WSASTARTUP                                118
+#define BIO_F_BIO_BER_GET_HEADER                        102
+#define BIO_F_BIO_CTRL                                  103
+#define BIO_F_BIO_GETS                                  104
+#define BIO_F_BIO_GET_ACCEPT_SOCKET                     105
+#define BIO_F_BIO_GET_HOST_IP                           106
+#define BIO_F_BIO_GET_PORT                              107
+#define BIO_F_BIO_NEW                                   108
+#define BIO_F_BIO_NEW_FILE                              109
+#define BIO_F_BIO_PUTS                                  110
+#define BIO_F_BIO_READ                                  111
+#define BIO_F_BIO_SOCK_INIT                             112
+#define BIO_F_BIO_WRITE                                         113
+#define BIO_F_BUFFER_CTRL                               114
+#define BIO_F_CONN_STATE                                115
+#define BIO_F_FILE_CTRL                                         116
+#define BIO_F_MEM_WRITE                                         117
+#define BIO_F_SSL_NEW                                   119
+#define BIO_F_WSASTARTUP                                120
 
 /* Reason codes. */
 #define BIO_R_ACCEPT_ERROR                              100
@@ -674,12 +703,17 @@ int BIO_printf();
 #define BIO_R_NO_PORT_DEFINED                           113
 #define BIO_R_NO_PORT_SPECIFIED                                 114
 #define BIO_R_NULL_PARAMETER                            115
-#define BIO_R_UNABLE_TO_BIND_SOCKET                     116
-#define BIO_R_UNABLE_TO_CREATE_SOCKET                   117
-#define BIO_R_UNABLE_TO_LISTEN_SOCKET                   118
-#define BIO_R_UNINITALISED                              119
-#define BIO_R_UNSUPPORTED_METHOD                        120
-#define BIO_R_WSASTARTUP                                121
+#define BIO_R_SOCKS_ID_AND_IDENT_DID_NOT_MATCH          116
+#define BIO_R_SOCKS_REJECTED_CONNECTION                         117
+#define BIO_R_SOCKS_UNABLE_TO_TALK_TO_IDENT_SERVER      118
+#define BIO_R_SOCKS_UNKNOWN_ERROR                       119
+#define BIO_R_TAG_MISMATCH                              120
+#define BIO_R_UNABLE_TO_BIND_SOCKET                     121
+#define BIO_R_UNABLE_TO_CREATE_SOCKET                   122
+#define BIO_R_UNABLE_TO_LISTEN_SOCKET                   123
+#define BIO_R_UNINITALISED                              124
+#define BIO_R_UNSUPPORTED_METHOD                        125
+#define BIO_R_WSASTARTUP                                126
  
 #ifdef  __cplusplus
 }
index 37e14ca107eb51732ee0794ebac9b033f692c94f..01aac6e582800b419ea75e427cc067325e6c61bf 100644 (file)
@@ -65,6 +65,7 @@ static ERR_STRING_DATA BIO_str_functs[]=
        {
 {ERR_PACK(0,BIO_F_ACPT_STATE,0),       "ACPT_STATE"},
 {ERR_PACK(0,BIO_F_BIO_ACCEPT,0),       "BIO_accept"},
+{ERR_PACK(0,BIO_F_BIO_BER_GET_HEADER,0),       "BIO_BER_GET_HEADER"},
 {ERR_PACK(0,BIO_F_BIO_CTRL,0), "BIO_ctrl"},
 {ERR_PACK(0,BIO_F_BIO_GETS,0), "BIO_gets"},
 {ERR_PACK(0,BIO_F_BIO_GET_ACCEPT_SOCKET,0),    "BIO_get_accept_socket"},
@@ -80,6 +81,7 @@ static ERR_STRING_DATA BIO_str_functs[]=
 {ERR_PACK(0,BIO_F_CONN_STATE,0),       "CONN_STATE"},
 {ERR_PACK(0,BIO_F_FILE_CTRL,0),        "FILE_CTRL"},
 {ERR_PACK(0,BIO_F_MEM_WRITE,0),        "MEM_WRITE"},
+{ERR_PACK(0,BIO_F_SOCKS4A_STATE,0),    "SOCKS4A_STATE"},
 {ERR_PACK(0,BIO_F_SSL_NEW,0),  "SSL_NEW"},
 {ERR_PACK(0,BIO_F_WSASTARTUP,0),       "WSASTARTUP"},
 {0,NULL},
@@ -103,6 +105,11 @@ static ERR_STRING_DATA BIO_str_reasons[]=
 {BIO_R_NO_PORT_DEFINED                   ,"no port defined"},
 {BIO_R_NO_PORT_SPECIFIED                 ,"no port specified"},
 {BIO_R_NULL_PARAMETER                    ,"null parameter"},
+{BIO_R_SOCKS_ID_AND_IDENT_DID_NOT_MATCH  ,"socks id and ident did not match"},
+{BIO_R_SOCKS_REJECTED_CONNECTION         ,"socks rejected connection"},
+{BIO_R_SOCKS_UNABLE_TO_TALK_TO_IDENT_SERVER,"socks unable to talk to ident server"},
+{BIO_R_SOCKS_UNKNOWN_ERROR               ,"socks unknown error"},
+{BIO_R_TAG_MISMATCH                      ,"tag mismatch"},
 {BIO_R_UNABLE_TO_BIND_SOCKET             ,"unable to bind socket"},
 {BIO_R_UNABLE_TO_CREATE_SOCKET           ,"unable to create socket"},
 {BIO_R_UNABLE_TO_LISTEN_SOCKET           ,"unable to listen socket"},
@@ -118,8 +125,8 @@ void ERR_load_BIO_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_BIO,BIO_str_functs);
index 7a66b0892ed2a584b480c6a5413c7603a1ab3772..bee1f5d2e0d3c76e6715bcf07337ee420de50a6a 100644 (file)
@@ -167,6 +167,7 @@ int outl;
                }
 
        i=b->method->bread(b,out,outl);
+
        if (i > 0) b->num_read+=(unsigned long)i;
 
        if (cb != NULL)
@@ -204,9 +205,16 @@ int inl;
                }
 
        i=b->method->bwrite(b,in,inl);
+
        if (i > 0) b->num_write+=(unsigned long)i;
 
-       if (cb != NULL)
+       /* This is evil and not thread safe.  If the BIO has been freed,
+        * we must not call the callback.  The only way to be able to
+        * determine this is the reference count which is now invalid since
+        * the memory has been free()ed.
+        */
+       if (b->references <= 0) abort();
+       if (cb != NULL) /* && (b->references >= 1)) */
                i=(int)cb(b,BIO_CB_WRITE|BIO_CB_RETURN,in,inl,
                        0L,(long)i);
        return(i);
index e49902fa9fb936440bb02cf5c6d21876be5f9865..872807d8634da863fc748357c97bcd38760c78a6 100644 (file)
@@ -82,6 +82,10 @@ typedef struct bio_accept_st
 
        char *addr;
        int nbio;
+       /* If 0, it means normal, if 1, do a connect on bind failure,
+        * and if there is no-one listening, bind with SO_REUSEADDR.
+        * If 2, always use SO_REUSEADDR. */
+       int bind_mode;
        BIO *bio_chain;
        } BIO_ACCEPT;
 
@@ -162,6 +166,7 @@ BIO_ACCEPT *BIO_ACCEPT_new()
 
        memset(ret,0,sizeof(BIO_ACCEPT));
        ret->accept_sock=INVALID_SOCKET;
+       ret->bind_mode=BIO_BIND_NORMAL;
        return(ret);
        }
 
@@ -183,11 +188,7 @@ BIO *bio;
        if (c->accept_sock != INVALID_SOCKET)
                {
                shutdown(c->accept_sock,2);
-# ifdef WINDOWS
                closesocket(c->accept_sock);
-# else
-               close(c->accept_sock);
-# endif
                c->accept_sock=INVALID_SOCKET;
                bio->num=INVALID_SOCKET;
                }
@@ -217,7 +218,6 @@ BIO *b;
 BIO_ACCEPT *c;
        {
        BIO *bio=NULL,*dbio;
-       unsigned long l=1;
        int s= -1;
        int i;
 
@@ -230,31 +230,24 @@ again:
                        BIOerr(BIO_F_ACPT_STATE,BIO_R_NO_ACCEPT_PORT_SPECIFIED);
                        return(-1);
                        }
-               s=BIO_get_accept_socket(c->param_addr);
+               s=BIO_get_accept_socket(c->param_addr,c->bind_mode);
                if (s == INVALID_SOCKET)
                        return(-1);
 
-#ifdef FIONBIO
                if (c->accept_nbio)
                        {
-                       i=BIO_socket_ioctl(b->num,FIONBIO,&l);
-                       if (i < 0)
+                       if (!BIO_socket_nbio(s,1))
                                {
-#ifdef WINDOWS
                                closesocket(s);
-#else
-                               close(s);
-# endif
                                BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET);
                                return(-1);
                                }
                        }
-#endif
                c->accept_sock=s;
                b->num=s;
                c->state=ACPT_S_GET_ACCEPT_SOCKET;
                return(1);
-               break;
+               /* break; */
        case ACPT_S_GET_ACCEPT_SOCKET:
                if (b->next_bio != NULL)
                        {
@@ -269,17 +262,14 @@ again:
                BIO_set_callback(bio,BIO_get_callback(b));
                BIO_set_callback_arg(bio,BIO_get_callback_arg(b));
 
-#ifdef FIONBIO
                if (c->nbio)
                        {
-                       i=BIO_socket_ioctl(i,FIONBIO,&l);
-                       if (i < 0)
+                       if (!BIO_socket_nbio(i,1))
                                {
                                BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET);
                                goto err;
                                }
                        }
-#endif
 
                /* If the accept BIO has an bio_chain, we dup it and
                 * put the new socket at the end. */
@@ -298,15 +288,9 @@ err:
                if (bio != NULL)
                        BIO_free(bio);
                else if (s >= 0)
-                       {
-#ifdef WINDOWS
                        closesocket(s);
-#else
-                       close(s);
-# endif
-                       }
                return(0);
-               break;
+               /* break; */
        case ACPT_S_OK:
                if (b->next_bio == NULL)
                        {
@@ -314,10 +298,10 @@ err:
                        goto again;
                        }
                return(1);
-               break;
+               /* break; */
        default:        
                return(0);
-               break;
+               /* break; */
                }
 
        }
@@ -417,13 +401,21 @@ char *ptr;
        case BIO_C_SET_NBIO:
                data->nbio=(int)num;
                break;
+       case BIO_C_SET_FD:
+               b->init=1;
+               b->num= *((int *)ptr);
+               data->accept_sock=b->num;
+               data->state=ACPT_S_GET_ACCEPT_SOCKET;
+               b->shutdown=(int)num;
+               b->init=1;
+               break;
        case BIO_C_GET_FD:
                if (b->init)
                        {
                        ip=(int *)ptr;
                        if (ip != NULL)
                                *ip=data->accept_sock;
-                       ret=b->num;
+                       ret=data->accept_sock;
                        }
                else
                        ret= -1;
@@ -454,6 +446,12 @@ char *ptr;
                break;
        case BIO_CTRL_FLUSH:
                break;
+       case BIO_C_SET_BIND_MODE:
+               data->bind_mode=(int)num;
+               break;
+       case BIO_C_GET_BIND_MODE:
+               ret=(long)data->bind_mode;
+               break;
        case BIO_CTRL_DUP:
                dbio=(BIO *)ptr;
 /*             if (data->param_port) EAY EAY
index 6e547bf86669c852be420a1d1c3e482e5861cd77..3ec1388f2e8ac8b5ea94f03b13b2362de3afb5a6 100644 (file)
@@ -81,13 +81,12 @@ typedef struct bio_connect_st
        int nbio;
 
        unsigned char ip[4];
-       short port;
+       unsigned short port;
 
        struct sockaddr_in them;
 
        /* int socket; this will be kept in bio->num so that it is
         * compatable with the bss_sock bio */ 
-       int error;
 
        /* called when the connection is initially made
         *  callback(BIO,state,ret);  The callback should return
@@ -187,7 +186,7 @@ BIO_CONNECT *c;
                                        }
                                }
 
-                       if (p == NULL)
+                       if (c->param_port == NULL)
                                {
                                BIOerr(BIO_F_CONN_STATE,BIO_R_NO_PORT_SPECIFIED);
                                ERR_add_error_data(2,"host=",c->param_hostname);
@@ -203,7 +202,12 @@ BIO_CONNECT *c;
                        break;
 
                case BIO_CONN_S_GET_PORT:
-                       if (BIO_get_port(c->param_port,&c->port) <= 0)
+                       if (c->param_port == NULL)
+                               {
+                               abort();
+                               goto exit_loop;
+                               }
+                       else if (BIO_get_port(c->param_port,&c->port) <= 0)
                                goto exit_loop;
                        c->state=BIO_CONN_S_CREATE_SOCKET;
                        break;
@@ -235,12 +239,9 @@ BIO_CONNECT *c;
                        break;
 
                case BIO_CONN_S_NBIO:
-#ifdef FIONBIO
                        if (c->nbio)
                                {
-                               l=1;
-                               ret=BIO_socket_ioctl(b->num,FIONBIO,&l);
-                               if (ret < 0)
+                               if (!BIO_socket_nbio(b->num,1))
                                        {
                                        BIOerr(BIO_F_CONN_STATE,BIO_R_ERROR_SETTING_NBIO);
                                        ERR_add_error_data(4,"host=",
@@ -249,7 +250,6 @@ BIO_CONNECT *c;
                                        goto exit_loop;
                                        }
                                }
-#endif
                        c->state=BIO_CONN_S_CONNECT;
 
 #ifdef SO_KEEPALIVE
@@ -326,12 +326,10 @@ BIO_CONNECT *c;
                        }
                }
 
-       if (1)
-               {
+       /* Loop does not exit */
 exit_loop:
-               if (cb != NULL)
-                       ret=cb((BIO *)b,c->state,ret);
-               }
+       if (cb != NULL)
+               ret=cb((BIO *)b,c->state,ret);
 end:
        return(ret);
        }
@@ -353,7 +351,6 @@ BIO_CONNECT *BIO_CONNECT_new()
        ret->ip[3]=0;
        ret->port=0;
        memset((char *)&ret->them,0,sizeof(ret->them));
-       ret->error=0;
        return(ret);
        }
 
@@ -395,11 +392,7 @@ BIO *bio;
                /* Only do a shutdown if things were established */
                if (c->state == BIO_CONN_S_OK)
                        shutdown(bio->num,2);
-# ifdef WINDOWS
                closesocket(bio->num);
-# else
-               close(bio->num);
-# endif
                bio->num=INVALID_SOCKET;
                }
        }
@@ -442,11 +435,7 @@ int outl;
        if (out != NULL)
                {
                clear_socket_error();
-#if defined(WINDOWS)
-               ret=recv(b->num,out,outl,0);
-#else
-               ret=read(b->num,out,outl);
-#endif
+               ret=readsocket(b->num,out,outl);
                BIO_clear_retry_flags(b);
                if (ret <= 0)
                        {
@@ -473,11 +462,7 @@ int inl;
                }
 
        clear_socket_error();
-#if defined(WINDOWS)
-       ret=send(b->num,in,inl,0);
-#else
-       ret=write(b->num,in,inl);
-#endif
+       ret=writesocket(b->num,in,inl);
        BIO_clear_retry_flags(b);
        if (ret <= 0)
                {
@@ -559,9 +544,26 @@ char *ptr;
                                data->param_port=BUF_strdup(ptr);
                                }
                        else if (num == 2)
-                               memcpy(data->ip,ptr,4);
+                               {
+                               char buf[16];
+
+                               sprintf(buf,"%d.%d.%d.%d",
+                                       ptr[0],ptr[1],ptr[2],ptr[3]);
+                               if (data->param_hostname != NULL)
+                                       Free(data->param_hostname);
+                               data->param_hostname=BUF_strdup(buf);
+                               memcpy(&(data->ip[0]),ptr,4);
+                               }
                        else if (num == 3)
+                               {
+                               char buf[16];
+
+                               sprintf(buf,"%d",*(int *)ptr);
+                               if (data->param_port != NULL)
+                                       Free(data->param_port);
+                               data->param_port=BUF_strdup(buf);
                                data->port= *(int *)ptr;
+                               }
                        }
                break;
        case BIO_C_SET_NBIO:
index 1484cf849eed9d7fe2a104f4ac0c8ea378745a35..5068a7ca0d7fb04e1e9aeb088e732f60cfc7db74 100644 (file)
@@ -214,12 +214,14 @@ char *ptr;
 
        switch (cmd)
                {
+       case BIO_C_FILE_SEEK:
        case BIO_CTRL_RESET:
                ret=(long)fseek(fp,num,0);
                break;
        case BIO_CTRL_EOF:
                ret=(long)feof(fp);
                break;
+       case BIO_C_FILE_TELL:
        case BIO_CTRL_INFO:
                ret=ftell(fp);
                break;
index 40c4e39f025ef1afa056e63136b13d716dff2338..8a2efb938cd198a917bc88630dcfd97988a12c15 100644 (file)
@@ -92,6 +92,9 @@ static BIO_METHOD mem_method=
        mem_free,
        };
 
+/* bio->num is used to hold the value to return on 'empty', if it is
+ * 0, should_retry is not set */
+
 BIO_METHOD *BIO_s_mem()
        {
        return(&mem_method);
@@ -106,7 +109,7 @@ BIO *bi;
                return(0);
        bi->shutdown=1;
        bi->init=1;
-       bi->num=0;
+       bi->num= -1;
        bi->ptr=(char *)b;
        return(1);
        }
@@ -151,8 +154,9 @@ int outl;
                }
        else if (bm->length == 0)
                {
-               BIO_set_retry_read(b);
-               ret= -1;
+               if (b->num != 0)
+                       BIO_set_retry_read(b);
+               ret= b->num;
                }
        return(ret);
        }
@@ -204,6 +208,9 @@ char *ptr;
        case BIO_CTRL_EOF:
                ret=(long)(bm->length == 0);
                break;
+       case BIO_C_SET_BUF_MEM_EOF_RETURN:
+               b->num=(int)num;
+               break;
        case BIO_CTRL_INFO:
                ret=(long)bm->length;
                if (ptr != NULL)
index d907a2867ba1fdeaccb778cac8050c480f2813e5..a664377d39a467e1931d18fba71f36c6e8b012d7 100644 (file)
@@ -189,11 +189,7 @@ BIO *a;
                        {
 #ifndef BIO_FD
                        shutdown(a->num,2);
-# ifdef WINDOWS
                        closesocket(a->num);
-# else
-                       close(a->num);
-# endif
 #else                  /* BIO_FD */
                        close(a->num);
 #endif
@@ -218,9 +214,9 @@ int outl;
 
        if (out != NULL)
                {
-#if defined(WINDOWS) && !defined(BIO_FD)
+#ifndef BIO_FD
                clear_socket_error();
-               ret=recv(b->num,out,outl,0);
+               ret=readsocket(b->num,out,outl);
 #else
                clear_sys_error();
                ret=read(b->num,out,outl);
@@ -250,9 +246,9 @@ int inl;
        {
        int ret;
        
-#if defined(WINDOWS) && !defined(BIO_FD)
+#ifndef BIO_FD
        clear_socket_error();
-       ret=send(b->num,in,inl,0);
+       ret=writesocket(b->num,in,inl);
 #else
        clear_sys_error();
        ret=write(b->num,in,inl);
@@ -286,14 +282,21 @@ char *ptr;
        switch (cmd)
                {
        case BIO_CTRL_RESET:
+               num=0;
+       case BIO_C_FILE_SEEK:
 #ifdef BIO_FD
-               ret=(long)lseek(b->num,0,0);
+               ret=(long)lseek(b->num,num,0);
 #else
                ret=0;
 #endif
                break;
+       case BIO_C_FILE_TELL:
        case BIO_CTRL_INFO:
+#ifdef BIO_FD
+               ret=(long)lseek(b->num,0,1);
+#else
                ret=0;
+#endif
                break;
        case BIO_C_SET_FD:
 #ifndef BIO_FD
@@ -329,7 +332,6 @@ char *ptr;
        case BIO_CTRL_FLUSH:
                ret=1;
                break;
-               break;
        default:
                ret=0;
                break;
@@ -377,7 +379,7 @@ int i;
 
        if ((i == 0) || (i == -1))
                {
-#if !defined(BIO_FD) && defined(WINDOWS)
+#ifndef BIO_FD
                err=get_last_socket_error();
 #else
                err=get_last_sys_error();
@@ -411,8 +413,10 @@ int err;
        case WSAEWOULDBLOCK:
 # endif
 
-# if defined(WSAENOTCONN)
+# if 0 /* This appears to always be an error */
+#  if defined(WSAENOTCONN)
        case WSAENOTCONN:
+#  endif
 # endif
 #endif
 
@@ -452,7 +456,7 @@ int err;
        case EALREADY:
 #endif
                return(1);
-               break;
+               /* break; */
        default:
                break;
                }
diff --git a/crypto/bio/cd b/crypto/bio/cd
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/crypto/bio/fg b/crypto/bio/fg
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/crypto/bio/grep b/crypto/bio/grep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/crypto/bio/vi b/crypto/bio/vi
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/crypto/bn/DSA b/crypto/bn/DSA
new file mode 100644 (file)
index 0000000..83f257c
--- /dev/null
@@ -0,0 +1,2 @@
+DSA wants 64*32 to use word mont mul, but
+RSA wants to use full.
index 9809d26cbcbc0bcdc367b9593cb9cc677e530010..0a365fca6a9e9605c5fdf834b52ba6abb4dcd079 100644 (file)
@@ -13,9 +13,9 @@ MAKEDEPEND=   makedepend -f Makefile.ssl
 MAKEFILE=      Makefile.ssl
 AR=            ar r
 
-BN_MULW=       bn_mulw.o
+BN_ASM=                bn_asm.o
 # or use
-#BN_MULW=      bn86-elf.o
+#BN_ASM=       bn86-elf.o
 
 CFLAGS= $(INCLUDES) $(CFLAG)
 
@@ -26,16 +26,15 @@ TEST=bntest.c exptest.c
 APPS=
 
 LIB=$(TOP)/libcrypto.a
-LIBSRC=        bn_add.c bn_div.c bn_exp.c bn_lib.c bn_mod.c bn_mul.c \
-       bn_print.c bn_rand.c bn_shift.c bn_sub.c bn_word.c bn_blind.c \
-       bn_gcd.c bn_prime.c $(ERRC).c bn_sqr.c bn_mulw.c bn_recp.c bn_mont.c \
-       bn_mpi.c
-
-LIBOBJ=        bn_add.o bn_div.o bn_exp.o bn_lib.o bn_mod.o bn_mul.o \
-       bn_print.o bn_rand.o bn_shift.o bn_sub.o bn_word.o bn_blind.o \
-       bn_gcd.o bn_prime.o $(ERRC).o bn_sqr.o $(BN_MULW) bn_recp.o bn_mont.o \
-       bn_mpi.o
+LIBSRC=        bn_add.c bn_div.c bn_exp.c bn_lib.c bn_mul.c \
+       bn_print.c bn_rand.c bn_shift.c bn_word.c bn_blind.c \
+       bn_gcd.c bn_prime.c $(ERRC).c bn_sqr.c bn_asm.c bn_recp.c bn_mont.c \
+       bn_mpi.c bn_exp2.c
 
+LIBOBJ=        bn_add.o bn_div.o bn_exp.o bn_lib.o bn_mul.o \
+       bn_print.o bn_rand.o bn_shift.o bn_word.o bn_blind.o \
+       bn_gcd.o bn_prime.o $(ERRC).o bn_sqr.o $(BN_ASM) bn_recp.o bn_mont.o \
+       bn_mpi.o bn_exp2.o
 
 SRC= $(LIBSRC)
 
@@ -65,23 +64,48 @@ lib:        $(LIBOBJ)
 asm/bn86-elf.o: asm/bn86unix.cpp
        $(CPP) -DELF asm/bn86unix.cpp | as -o asm/bn86-elf.o
 
+asm/co86-elf.o: asm/co86unix.cpp
+       $(CPP) -DELF asm/co86unix.cpp | as -o asm/co86-elf.o
+
 # solaris
 asm/bn86-sol.o: asm/bn86unix.cpp
        $(CC) -E -DSOL asm/bn86unix.cpp | sed 's/^#.*//' > asm/bn86-sol.s
        as -o asm/bn86-sol.o asm/bn86-sol.s
        rm -f asm/bn86-sol.s
 
+asm/co86-sol.o: asm/co86unix.cpp
+       $(CC) -E -DSOL asm/co86unix.cpp | sed 's/^#.*//' > asm/co86-sol.s
+       as -o asm/co86-sol.o asm/co86-sol.s
+       rm -f asm/co86-sol.s
+
 # a.out
 asm/bn86-out.o: asm/bn86unix.cpp
        $(CPP) -DOUT asm/bn86unix.cpp | as -o asm/bn86-out.o
 
+asm/co86-out.o: asm/co86unix.cpp
+       $(CPP) -DOUT asm/co86unix.cpp | as -o asm/co86-out.o
+
 # bsdi
 asm/bn86bsdi.o: asm/bn86unix.cpp
-       $(CPP) -DBSDI asm/bn86unix.cpp | as -o asm/bn86bsdi.o
+       $(CPP) -DBSDI asm/bn86unix.cpp | sed 's/ :/:/' | as -o asm/bn86bsdi.o
+
+asm/co86bsdi.o: asm/co86unix.cpp
+       $(CPP) -DBSDI asm/co86unix.cpp | sed 's/ :/:/' | as -o asm/co86bsdi.o
 
 asm/bn86unix.cpp:
        (cd asm; perl bn-586.pl cpp >bn86unix.cpp )
 
+asm/co86unix.cpp:
+       (cd asm; perl co-586.pl cpp >co86unix.cpp )
+
+# MIPS 64 bit assember 
+asm/mips3.o: asm/mips3.s
+       /usr/bin/as -mips3 -O2 -o asm/mips3.o asm/mips3.s            
+
+# MIPS 32 bit assember
+asm/mips1.o: asm/mips1.s
+       /usr/bin/as -O2 -o asm/mips1.o asm/mips1.s
+
 files:
        perl $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
 
@@ -123,7 +147,7 @@ dclean:
        mv -f Makefile.new $(MAKEFILE)
 
 clean:
-       /bin/rm -f *.o */*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff bn_mulw.s
+       /bin/rm -f *.o */*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff bn_asm.s
 
 errors:
        perl $(TOP)/util/err-ins.pl $(ERR).err $(ERR).org # special case .org
diff --git a/crypto/bn/alpha.s b/crypto/bn/alpha.s
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/crypto/bn/asm/a.out b/crypto/bn/asm/a.out
new file mode 100644 (file)
index 0000000..cc5094f
Binary files /dev/null and b/crypto/bn/asm/a.out differ
index 1d17b1d6195261d80e9c752e75dda33a31a91f1e..cf0b69cff9ba7f223ce826615105e2c67db50821 100644 (file)
@@ -2,7 +2,13 @@
  # The bn_div64 is actually gcc output but the other parts are hand done.
  # Thanks to tzeruch@ceddec.com for sending me the gcc output for
  # bn_div64.
-       .file   1 "bn_mulw.c"
+ # I've gone back and re-done most of routines.
+ # The key thing to remeber for the 164 CPU is that while a
+ # multiply operation takes 8 cycles, another one can only be issued
+ # after 4 cycles have elapsed.  I've done modification to help
+ # improve this.  Also, normally, a ld instruction will not be available
+ # for about 3 cycles.
+       .file   1 "bn_asm.c"
        .set noat
 gcc2_compiled.:
 __gnu_compiled_c:
@@ -14,65 +20,91 @@ bn_mul_add_words:
 bn_mul_add_words..ng:
        .frame $30,0,$26,0
        .prologue 0
-       subq $18,2,$25  # num=-2
-       bis $31,$31,$0
-       blt $25,$42
        .align 5
-$142:
-       subq $18,2,$18  # num-=2
-       subq $25,2,$25  # num-=2
-
-       ldq $1,0($17)   # a[0]
-       ldq $2,8($17)   # a[1]
-
-       mulq $19,$1,$3  # a[0]*w low part       r3
-       umulh $19,$1,$1 # a[0]*w high part      r1
-       mulq $19,$2,$4  # a[1]*w low part       r4
-       umulh $19,$2,$2 # a[1]*w high part      r2
-
-       ldq $22,0($16)  # r[0]                  r22
-       ldq $23,8($16)  # r[1]                  r23
-
-       addq $3,$22,$3  # a0 low part + r[0]    
-       addq $4,$23,$4  # a1 low part + r[1]    
-       cmpult $3,$22,$5 # overflow?
-       cmpult $4,$23,$6 # overflow?
-       addq $5,$1,$1   # high part + overflow 
-       addq $6,$2,$2   # high part + overflow 
-
-       addq $3,$0,$3   # add c
-       cmpult $3,$0,$5 # overflow?
-       stq $3,0($16)
-       addq $5,$1,$0   # c=high part + overflow 
-
-       addq $4,$0,$4   # add c
-       cmpult $4,$0,$5 # overflow?
-       stq $4,8($16)
-       addq $5,$2,$0   # c=high part + overflow 
+       subq    $18,4,$18
+       bis     $31,$31,$0
+       blt     $18,$43         # if we are -1, -2, -3 or -4 goto tail code
+       ldq     $20,0($17)      # 1 1
+       ldq     $1,0($16)       # 1 1
+       .align 3
+$42:
+       mulq    $20,$19,$5      # 1 2 1 ######
+       ldq     $21,8($17)      # 2 1
+       ldq     $2,8($16)       # 2 1
+       umulh   $20,$19,$20     # 1 2   ######
+       ldq     $27,16($17)     # 3 1
+       ldq     $3,16($16)      # 3 1
+       mulq    $21,$19,$6      # 2 2 1 ######
+        ldq    $28,24($17)     # 4 1
+       addq    $1,$5,$1        # 1 2 2
+        ldq    $4,24($16)      # 4 1
+       umulh   $21,$19,$21     # 2 2   ######
+        cmpult $1,$5,$22       # 1 2 3 1
+       addq    $20,$22,$20     # 1 3 1
+        addq   $1,$0,$1        # 1 2 3 1
+       mulq    $27,$19,$7      # 3 2 1 ######
+        cmpult $1,$0,$0        # 1 2 3 2
+       addq    $2,$6,$2        # 2 2 2
+        addq   $20,$0,$0       # 1 3 2 
+       cmpult  $2,$6,$23       # 2 2 3 1
+        addq   $21,$23,$21     # 2 3 1
+       umulh   $27,$19,$27     # 3 2   ######
+        addq   $2,$0,$2        # 2 2 3 1
+       cmpult  $2,$0,$0        # 2 2 3 2
+        subq   $18,4,$18
+       mulq    $28,$19,$8      # 4 2 1 ######
+        addq   $21,$0,$0       # 2 3 2 
+       addq    $3,$7,$3        # 3 2 2
+        addq   $16,32,$16
+       cmpult  $3,$7,$24       # 3 2 3 1
+        stq    $1,-32($16)     # 1 2 4
+       umulh   $28,$19,$28     # 4 2   ######
+        addq   $27,$24,$27     # 3 3 1
+       addq    $3,$0,$3        # 3 2 3 1
+        stq    $2,-24($16)     # 2 2 4
+       cmpult  $3,$0,$0        # 3 2 3 2
+        stq    $3,-16($16)     # 3 2 4
+       addq    $4,$8,$4        # 4 2 2
+        addq   $27,$0,$0       # 3 3 2 
+       cmpult  $4,$8,$25       # 4 2 3 1
+        addq   $17,32,$17
+       addq    $28,$25,$28     # 4 3 1
+        addq   $4,$0,$4        # 4 2 3 1
+       cmpult  $4,$0,$0        # 4 2 3 2
+        stq    $4,-8($16)      # 4 2 4
+       addq    $28,$0,$0       # 4 3 2 
+        blt    $18,$43
 
-       ble $18,$43
+       ldq     $20,0($17)      # 1 1
+       ldq     $1,0($16)       # 1 1
 
-       addq $16,16,$16
-       addq $17,16,$17
-       blt $25,$42
+       br      $42
 
-       br $31,$142
-$42:
-       ldq $1,0($17)   # a[0]
-       umulh $19,$1,$3 # a[0]*w high part
-       mulq $19,$1,$1  # a[0]*w low part
-       ldq $2,0($16)   # r[0]
-       addq $1,$2,$1   # low part + r[0]
-       cmpult $1,$2,$4 # overflow?
-       addq $4,$3,$3   # high part + overflow 
-       addq $1,$0,$1   # add c
-       cmpult $1,$0,$4 # overflow?
-       addq $4,$3,$0   # c=high part + overflow 
-       stq $1,0($16)
+       .align 4
+$45:
+       ldq     $20,0($17)      # 4 1
+       ldq     $1,0($16)       # 4 1
+       mulq    $20,$19,$5      # 4 2 1
+       subq    $18,1,$18
+       addq    $16,8,$16
+       addq    $17,8,$17
+       umulh   $20,$19,$20     # 4 2
+       addq    $1,$5,$1        # 4 2 2
+       cmpult  $1,$5,$22       # 4 2 3 1
+       addq    $20,$22,$20     # 4 3 1
+       addq    $1,$0,$1        # 4 2 3 1
+       cmpult  $1,$0,$0        # 4 2 3 2
+       addq    $20,$0,$0       # 4 3 2 
+       stq     $1,-8($16)      # 4 2 4
+       bgt     $18,$45
+       ret     $31,($26),1     # else exit
 
        .align 4
 $43:
-       ret $31,($26),1
+       addq    $18,4,$18
+       bgt     $18,$45         # goto tail code
+       ret     $31,($26),1     # else exit
+
        .end bn_mul_add_words
        .align 3
        .globl bn_mul_words
@@ -81,49 +113,75 @@ bn_mul_words:
 bn_mul_words..ng:
        .frame $30,0,$26,0
        .prologue 0
-       subq $18,2,$25  # num=-2
-       bis $31,$31,$0
-       blt $25,$242
        .align 5
-$342:
-       subq $18,2,$18  # num-=2
-       subq $25,2,$25  # num-=2
-
-       ldq $1,0($17)   # a[0]
-       ldq $2,8($17)   # a[1]
-
-       mulq $19,$1,$3  # a[0]*w low part       r3
-       umulh $19,$1,$1 # a[0]*w high part      r1
-       mulq $19,$2,$4  # a[1]*w low part       r4
-       umulh $19,$2,$2 # a[1]*w high part      r2
-
-       addq $3,$0,$3   # add c
-       cmpult $3,$0,$5 # overflow?
-       stq $3,0($16)
-       addq $5,$1,$0   # c=high part + overflow 
-
-       addq $4,$0,$4   # add c
-       cmpult $4,$0,$5 # overflow?
-       stq $4,8($16)
-       addq $5,$2,$0   # c=high part + overflow 
-
-       ble $18,$243
-
-       addq $16,16,$16
-       addq $17,16,$17
-       blt $25,$242
-
-       br $31,$342
-$242:
-       ldq $1,0($17)   # a[0]
-       umulh $19,$1,$3 # a[0]*w high part
-       mulq $19,$1,$1  # a[0]*w low part
-       addq $1,$0,$1   # add c
-       cmpult $1,$0,$4 # overflow?
-       addq $4,$3,$0   # c=high part + overflow 
-       stq $1,0($16)
-$243:
-       ret $31,($26),1
+       subq    $18,4,$18
+       bis     $31,$31,$0
+       blt     $18,$143        # if we are -1, -2, -3 or -4 goto tail code
+       ldq     $20,0($17)      # 1 1
+       .align 3
+$142:
+
+       mulq    $20,$19,$5      # 1 2 1 #####
+        ldq    $21,8($17)      # 2 1
+        ldq    $27,16($17)     # 3 1
+       umulh   $20,$19,$20     # 1 2   #####
+        ldq    $28,24($17)     # 4 1
+       mulq    $21,$19,$6      # 2 2 1 #####
+        addq   $5,$0,$5        # 1 2 3 1
+       subq    $18,4,$18
+        cmpult $5,$0,$0        # 1 2 3 2
+       umulh   $21,$19,$21     # 2 2   #####
+        addq   $20,$0,$0       # 1 3 2 
+       addq    $17,32,$17
+        addq   $6,$0,$6        # 2 2 3 1
+       mulq    $27,$19,$7      # 3 2 1 #####
+        cmpult $6,$0,$0        # 2 2 3 2
+       addq    $21,$0,$0       # 2 3 2 
+        addq   $16,32,$16
+       umulh   $27,$19,$27     # 3 2   #####
+        stq    $5,-32($16)     # 1 2 4
+       mulq    $28,$19,$8      # 4 2 1 #####
+        addq   $7,$0,$7        # 3 2 3 1
+       stq     $6,-24($16)     # 2 2 4
+        cmpult $7,$0,$0        # 3 2 3 2
+       umulh   $28,$19,$28     # 4 2   #####
+        addq   $27,$0,$0       # 3 3 2 
+       stq     $7,-16($16)     # 3 2 4
+        addq   $8,$0,$8        # 4 2 3 1
+       cmpult  $8,$0,$0        # 4 2 3 2
+
+       addq    $28,$0,$0       # 4 3 2 
+
+       stq     $8,-8($16)      # 4 2 4
+
+       blt     $18,$143
+
+       ldq     $20,0($17)      # 1 1
+
+       br      $142
+
+       .align 4
+$145:
+       ldq     $20,0($17)      # 4 1
+       mulq    $20,$19,$5      # 4 2 1
+       subq    $18,1,$18
+       umulh   $20,$19,$20     # 4 2
+       addq    $5,$0,$5        # 4 2 3 1
+        addq   $16,8,$16
+       cmpult  $5,$0,$0        # 4 2 3 2
+        addq   $17,8,$17
+       addq    $20,$0,$0       # 4 3 2 
+       stq     $5,-8($16)      # 4 2 4
+
+       bgt     $18,$145
+       ret     $31,($26),1     # else exit
+
+       .align 4
+$143:
+       addq    $18,4,$18
+       bgt     $18,$145        # goto tail code
+       ret     $31,($26),1     # else exit
+
        .end bn_mul_words
        .align 3
        .globl bn_sqr_words
@@ -132,44 +190,58 @@ bn_sqr_words:
 bn_sqr_words..ng:
        .frame $30,0,$26,0
        .prologue 0
-       
-       subq $18,2,$25  # num=-2
-       blt $25,$442
-       .align 5
-$542:
-       subq $18,2,$18  # num-=2
-       subq $25,2,$25  # num-=2
-
-       ldq $1,0($17)   # a[0]
-       ldq $4,8($17)   # a[1]
 
-       mulq $1,$1,$2   # a[0]*w low part       r2
-       umulh $1,$1,$3 # a[0]*w high part       r3
-       mulq $4,$4,$5   # a[1]*w low part       r5
-       umulh $4,$4,$6 # a[1]*w high part       r6
-
-       stq $2,0($16)   # r[0]
-       stq $3,8($16)   # r[1]
-       stq $5,16($16)  # r[3]
-       stq $6,24($16)  # r[4]
+       subq    $18,4,$18
+       blt     $18,$543        # if we are -1, -2, -3 or -4 goto tail code
+       ldq     $20,0($17)      # 1 1
+       .align 3
+$542:
+       mulq    $20,$20,$5              ######
+        ldq    $21,8($17)      # 1 1
+       subq    $18,4
+       umulh   $20,$20,$1              ######
+       ldq     $27,16($17)     # 1 1
+       mulq    $21,$21,$6              ######
+       ldq     $28,24($17)     # 1 1
+       stq     $5,0($16)       # r[0]
+       umulh   $21,$21,$2              ######
+       stq     $1,8($16)       # r[1]
+       mulq    $27,$27,$7              ######
+       stq     $6,16($16)      # r[0]
+       umulh   $27,$27,$3              ######
+       stq     $2,24($16)      # r[1]
+       mulq    $28,$28,$8              ######
+       stq     $7,32($16)      # r[0]
+       umulh   $28,$28,$4              ######
+       stq     $3,40($16)      # r[1]
 
-       ble $18,$443
+       addq    $16,64,$16
+       addq    $17,32,$17
+       stq     $8,-16($16)     # r[0]
+       stq     $4,-8($16)      # r[1]
 
-       addq $16,32,$16
-       addq $17,16,$17
-       blt $25,$442
-       br $31,$542
+       blt     $18,$543
+       ldq     $20,0($17)      # 1 1
+       br      $542
 
 $442:
-       ldq $1,0($17)   # a[0]
-       mulq $1,$1,$2   # a[0]*w low part       r2
-        umulh $1,$1,$3  # a[0]*w high part       r3
-       stq $2,0($16)   # r[0]
-        stq $3,8($16)   # r[1]
+       ldq     $20,0($17)   # a[0]
+       mulq    $20,$20,$5  # a[0]*w low part       r2
+       addq    $16,16,$16
+       addq    $17,8,$17
+       subq    $18,1,$18
+        umulh  $20,$20,$1  # a[0]*w high part       r3
+       stq     $5,-16($16)   # r[0]
+        stq    $1,-8($16)   # r[1]
+
+       bgt     $18,$442
+       ret     $31,($26),1     # else exit
 
        .align 4
-$443:
-       ret $31,($26),1
+$543:
+       addq    $18,4,$18
+       bgt     $18,$442        # goto tail code
+       ret     $31,($26),1     # else exit
        .end bn_sqr_words
 
        .align 3
@@ -180,31 +252,74 @@ bn_add_words..ng:
        .frame $30,0,$26,0
        .prologue 0
 
-       bis     $31,$31,$8      # carry = 0
-       ble     $19,$900
+       subq    $19,4,$19
+       bis     $31,$31,$0      # carry = 0
+       blt     $19,$900
+       ldq     $5,0($17)       # a[0]
+       ldq     $1,0($18)       # b[1]
+       .align 3
 $901:
-       ldq     $0,0($17)       # a[0]
-       ldq     $1,0($18)       # a[1]
+       addq    $1,$5,$1        # r=a+b;
+        ldq    $6,8($17)       # a[1]
+       cmpult  $1,$5,$22       # did we overflow?
+        ldq    $2,8($18)       # b[1]
+       addq    $1,$0,$1        # c+= overflow
+        ldq    $7,16($17)      # a[2]
+       cmpult  $1,$0,$0        # overflow?
+        ldq    $3,16($18)      # b[2]
+       addq    $0,$22,$0
+        ldq    $8,24($17)      # a[3]
+       addq    $2,$6,$2        # r=a+b;
+        ldq    $4,24($18)      # b[3]
+       cmpult  $2,$6,$23       # did we overflow?
+        addq   $3,$7,$3        # r=a+b;
+       addq    $2,$0,$2        # c+= overflow
+        cmpult $3,$7,$24       # did we overflow?
+       cmpult  $2,$0,$0        # overflow?
+        addq   $4,$8,$4        # r=a+b;
+       addq    $0,$23,$0
+        cmpult $4,$8,$25       # did we overflow?
+       addq    $3,$0,$3        # c+= overflow
+        stq    $1,0($16)       # r[0]=c
+       cmpult  $3,$0,$0        # overflow?
+        stq    $2,8($16)       # r[1]=c
+       addq    $0,$24,$0
+        stq    $3,16($16)      # r[2]=c
+       addq    $4,$0,$4        # c+= overflow
+        subq   $19,4,$19       # loop--
+       cmpult  $4,$0,$0        # overflow?
+        addq   $17,32,$17      # a++
+       addq    $0,$25,$0
+        stq    $4,24($16)      # r[3]=c
+       addq    $18,32,$18      # b++
+        addq   $16,32,$16      # r++
 
-       addq    $0,$1,$3        # c=a+b;
+       blt     $19,$900
+        ldq    $5,0($17)       # a[0]
+       ldq     $1,0($18)       # b[1]
+        br     $901
+       .align 4
+$945:
+       ldq     $5,0($17)       # a[0]
+        ldq    $1,0($18)       # b[1]
+       addq    $1,$5,$1        # r=a+b;
+        subq   $19,1,$19       # loop--
+       addq    $1,$0,$1        # c+= overflow
         addq   $17,8,$17       # a++
+       cmpult  $1,$5,$22       # did we overflow?
+        cmpult $1,$0,$0        # overflow?
+       addq    $18,8,$18       # b++
+        stq    $1,0($16)       # r[0]=c
+       addq    $0,$22,$0
+        addq   $16,8,$16       # r++
 
-       cmpult  $3,$1,$7        # did we overflow?
-        addq   $18,8,$18       # b++
-
-       addq    $8,$3,$3        # c+=carry
+       bgt     $19,$945
+       ret     $31,($26),1     # else exit
 
-       cmpult  $3,$8,$8        # did we overflow?
-        stq    $3,($16)        # r[0]=c
-
-       addq    $7,$8,$8        # add into overflow
-        subq   $19,1,$19       # loop--
-
-       addq    $16,8,$16       # r++
-        bgt    $19,$901
 $900:
-       bis     $8,$8,$0        # return carry
-       ret $31,($26),1
+       addq    $19,4,$19
+       bgt     $19,$945        # goto tail code
+       ret     $31,($26),1     # else exit
        .end bn_add_words
 
  #
@@ -339,6 +454,1445 @@ $136:
        addq $30,48,$30
        ret $31,($26),1
        .end bn_div64
-       .ident  "GCC: (GNU) 2.7.2.1"
 
+       .set noat
+       .text
+       .align 3
+       .globl bn_sub_words
+       .ent bn_sub_words
+bn_sub_words:
+bn_sub_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $19,    4,      $19
+       bis     $31,    $31,    $0
+       blt     $19,    $100
+       ldq     $1,     0($17)
+       ldq     $2,     0($18)
+$101:
+       ldq     $3,     8($17)
+       cmpult  $1,     $2,     $4
+       ldq     $5,     8($18)
+       subq    $1,     $2,     $1
+       ldq     $6,     16($17)
+       cmpult  $1,     $0,     $2
+       ldq     $7,     16($18)
+       subq    $1,     $0,     $23
+       ldq     $8,     24($17)
+       addq    $2,     $4,     $0
+       cmpult  $3,     $5,     $24
+       subq    $3,     $5,     $3
+       ldq     $22,    24($18)
+       cmpult  $3,     $0,     $5
+       subq    $3,     $0,     $25
+       addq    $5,     $24,    $0
+       cmpult  $6,     $7,     $27
+       subq    $6,     $7,     $6
+       stq     $23,    0($16)
+       cmpult  $6,     $0,     $7
+       subq    $6,     $0,     $28
+       addq    $7,     $27,    $0
+       cmpult  $8,     $22,    $21
+       subq    $8,     $22,    $8
+       stq     $25,    8($16)
+       cmpult  $8,     $0,     $22
+       subq    $8,     $0,     $20
+       addq    $22,    $21,    $0
+       stq     $28,    16($16)
+       subq    $19,    4,      $19
+       stq     $20,    24($16)
+       addq    $17,    32,     $17
+       addq    $18,    32,     $18
+       addq    $16,    32,     $16
+       blt     $19,    $100
+       ldq     $1,     0($17)
+       ldq     $2,     0($18)
+       br      $101
+$102:
+       ldq     $1,     0($17)
+       ldq     $2,     0($18)
+       cmpult  $1,     $2,     $27
+       subq    $1,     $2,     $1
+       cmpult  $1,     $0,     $2
+       subq    $1,     $0,     $1
+       stq     $1,     0($16)
+       addq    $2,     $27,    $0
+       addq    $17,    8,      $17
+       addq    $18,    8,      $18
+       addq    $16,    8,      $16
+       subq    $19,    1,      $19
+       bgt     $19,    $102
+       ret     $31,($26),1
+$100:
+       addq    $19,    4,      $19
+       bgt     $19,    $102
+$103:
+       ret     $31,($26),1
+       .end bn_sub_words
+       .text
+       .align 3
+       .globl bn_mul_comba4
+       .ent bn_mul_comba4
+bn_mul_comba4:
+bn_mul_comba4..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       ldq     $0,     0($17)
+       ldq     $1,     0($18)
+       ldq     $2,     8($17)
+       ldq     $3,     8($18)
+       ldq     $4,     16($17)
+       ldq     $5,     16($18)
+       ldq     $6,     24($17)
+       ldq     $7,     24($18)
+       bis     $31,    $31,    $23
+       mulq    $0,     $1,     $8
+       umulh   $0,     $1,     $22
+       stq     $8,     0($16)
+       bis     $31,    $31,    $8
+       mulq    $0,     $3,     $24
+       umulh   $0,     $3,     $25
+       addq    $22,    $24,    $22
+       cmpult  $22,    $24,    $27
+       addq    $27,    $25,    $25
+       addq    $23,    $25,    $23
+       cmpult  $23,    $25,    $28
+       addq    $8,     $28,    $8
+       mulq    $2,     $1,     $21
+       umulh   $2,     $1,     $20
+       addq    $22,    $21,    $22
+       cmpult  $22,    $21,    $19
+       addq    $19,    $20,    $20
+       addq    $23,    $20,    $23
+       cmpult  $23,    $20,    $17
+       addq    $8,     $17,    $8
+       stq     $22,    8($16)
+       bis     $31,    $31,    $22
+       mulq    $2,     $3,     $18
+       umulh   $2,     $3,     $24
+       addq    $23,    $18,    $23
+       cmpult  $23,    $18,    $27
+       addq    $27,    $24,    $24
+       addq    $8,     $24,    $8
+       cmpult  $8,     $24,    $25
+       addq    $22,    $25,    $22
+       mulq    $0,     $5,     $28
+       umulh   $0,     $5,     $21
+       addq    $23,    $28,    $23
+       cmpult  $23,    $28,    $19
+       addq    $19,    $21,    $21
+       addq    $8,     $21,    $8
+       cmpult  $8,     $21,    $20
+       addq    $22,    $20,    $22
+       mulq    $4,     $1,     $17
+       umulh   $4,     $1,     $18
+       addq    $23,    $17,    $23
+       cmpult  $23,    $17,    $27
+       addq    $27,    $18,    $18
+       addq    $8,     $18,    $8
+       cmpult  $8,     $18,    $24
+       addq    $22,    $24,    $22
+       stq     $23,    16($16)
+       bis     $31,    $31,    $23
+       mulq    $0,     $7,     $25
+       umulh   $0,     $7,     $28
+       addq    $8,     $25,    $8
+       cmpult  $8,     $25,    $19
+       addq    $19,    $28,    $28
+       addq    $22,    $28,    $22
+       cmpult  $22,    $28,    $21
+       addq    $23,    $21,    $23
+       mulq    $2,     $5,     $20
+       umulh   $2,     $5,     $17
+       addq    $8,     $20,    $8
+       cmpult  $8,     $20,    $27
+       addq    $27,    $17,    $17
+       addq    $22,    $17,    $22
+       cmpult  $22,    $17,    $18
+       addq    $23,    $18,    $23
+       mulq    $4,     $3,     $24
+       umulh   $4,     $3,     $25
+       addq    $8,     $24,    $8
+       cmpult  $8,     $24,    $19
+       addq    $19,    $25,    $25
+       addq    $22,    $25,    $22
+       cmpult  $22,    $25,    $28
+       addq    $23,    $28,    $23
+       mulq    $6,     $1,     $21
+       umulh   $6,     $1,     $0
+       addq    $8,     $21,    $8
+       cmpult  $8,     $21,    $20
+       addq    $20,    $0,     $0
+       addq    $22,    $0,     $22
+       cmpult  $22,    $0,     $27
+       addq    $23,    $27,    $23
+       stq     $8,     24($16)
+       bis     $31,    $31,    $8
+       mulq    $2,     $7,     $17
+       umulh   $2,     $7,     $18
+       addq    $22,    $17,    $22
+       cmpult  $22,    $17,    $24
+       addq    $24,    $18,    $18
+       addq    $23,    $18,    $23
+       cmpult  $23,    $18,    $19
+       addq    $8,     $19,    $8
+       mulq    $4,     $5,     $25
+       umulh   $4,     $5,     $28
+       addq    $22,    $25,    $22
+       cmpult  $22,    $25,    $21
+       addq    $21,    $28,    $28
+       addq    $23,    $28,    $23
+       cmpult  $23,    $28,    $20
+       addq    $8,     $20,    $8
+       mulq    $6,     $3,     $0
+       umulh   $6,     $3,     $27
+       addq    $22,    $0,     $22
+       cmpult  $22,    $0,     $1
+       addq    $1,     $27,    $27
+       addq    $23,    $27,    $23
+       cmpult  $23,    $27,    $17
+       addq    $8,     $17,    $8
+       stq     $22,    32($16)
+       bis     $31,    $31,    $22
+       mulq    $4,     $7,     $24
+       umulh   $4,     $7,     $18
+       addq    $23,    $24,    $23
+       cmpult  $23,    $24,    $19
+       addq    $19,    $18,    $18
+       addq    $8,     $18,    $8
+       cmpult  $8,     $18,    $2
+       addq    $22,    $2,     $22
+       mulq    $6,     $5,     $25
+       umulh   $6,     $5,     $21
+       addq    $23,    $25,    $23
+       cmpult  $23,    $25,    $28
+       addq    $28,    $21,    $21
+       addq    $8,     $21,    $8
+       cmpult  $8,     $21,    $20
+       addq    $22,    $20,    $22
+       stq     $23,    40($16)
+       bis     $31,    $31,    $23
+       mulq    $6,     $7,     $0
+       umulh   $6,     $7,     $1
+       addq    $8,     $0,     $8
+       cmpult  $8,     $0,     $27
+       addq    $27,    $1,     $1
+       addq    $22,    $1,     $22
+       cmpult  $22,    $1,     $17
+       addq    $23,    $17,    $23
+       stq     $8,     48($16)
+       stq     $22,    56($16)
+       ret     $31,($26),1
+       .end bn_mul_comba4
+       .text
+       .align 3
+       .globl bn_mul_comba8
+       .ent bn_mul_comba8
+bn_mul_comba8:
+bn_mul_comba8..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $30,    16,     $30
+       ldq     $0,     0($17)
+       ldq     $1,     0($18)
+       stq     $9,     0($30)
+       stq     $10,    8($30)
+       ldq     $2,     8($17)
+       ldq     $3,     8($18)
+       ldq     $4,     16($17)
+       ldq     $5,     16($18)
+       ldq     $6,     24($17)
+       ldq     $7,     24($18)
+       ldq     $8,     8($17)
+       ldq     $22,    8($18)
+       ldq     $23,    8($17)
+       ldq     $24,    8($18)
+       ldq     $25,    8($17)
+       ldq     $27,    8($18)
+       ldq     $28,    8($17)
+       ldq     $21,    8($18)
+       bis     $31,    $31,    $9
+       mulq    $0,     $1,     $20
+       umulh   $0,     $1,     $19
+       stq     $20,    0($16)
+       bis     $31,    $31,    $20
+       mulq    $0,     $3,     $10
+       umulh   $0,     $3,     $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $10
+       addq    $20,    $10,    $20
+       mulq    $2,     $1,     $18
+       umulh   $2,     $1,     $17
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $18
+       addq    $20,    $18,    $20
+       stq     $19,    8($16)
+       bis     $31,    $31,    $19
+       mulq    $0,     $5,     $10
+       umulh   $0,     $5,     $17
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $18
+       addq    $18,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $19,    $10,    $19
+       mulq    $2,     $3,     $18
+       umulh   $2,     $3,     $17
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $10
+       addq    $10,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $18
+       addq    $19,    $18,    $19
+       mulq    $4,     $1,     $10
+       umulh   $4,     $1,     $17
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $18
+       addq    $18,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $19,    $10,    $19
+       stq     $9,     16($16)
+       bis     $31,    $31,    $9
+       mulq    $0,     $7,     $18
+       umulh   $0,     $7,     $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $2,     $5,     $10
+       umulh   $2,     $5,     $17
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $10
+       addq    $9,     $10,    $9
+       mulq    $4,     $3,     $18
+       umulh   $4,     $3,     $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $6,     $1,     $10
+       umulh   $6,     $1,     $17
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $10
+       addq    $9,     $10,    $9
+       stq     $20,    24($16)
+       bis     $31,    $31,    $20
+       mulq    $0,     $22,    $18
+       umulh   $0,     $22,    $17
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $18
+       addq    $20,    $18,    $20
+       mulq    $2,     $7,     $10
+       umulh   $2,     $7,     $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $10
+       addq    $20,    $10,    $20
+       mulq    $4,     $5,     $18
+       umulh   $4,     $5,     $17
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $18
+       addq    $20,    $18,    $20
+       mulq    $6,     $3,     $10
+       umulh   $6,     $3,     $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $10
+       addq    $20,    $10,    $20
+       mulq    $8,     $1,     $18
+       umulh   $8,     $1,     $17
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $18
+       addq    $20,    $18,    $20
+       stq     $19,    32($16)
+       bis     $31,    $31,    $19
+       mulq    $0,     $24,    $10
+       umulh   $0,     $24,    $17
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $18
+       addq    $18,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $19,    $10,    $19
+       mulq    $2,     $22,    $18
+       umulh   $2,     $22,    $17
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $10
+       addq    $10,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $18
+       addq    $19,    $18,    $19
+       mulq    $4,     $7,     $10
+       umulh   $4,     $7,     $17
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $18
+       addq    $18,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $19,    $10,    $19
+       mulq    $6,     $5,     $18
+       umulh   $6,     $5,     $17
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $10
+       addq    $10,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $18
+       addq    $19,    $18,    $19
+       mulq    $8,     $3,     $10
+       umulh   $8,     $3,     $17
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $18
+       addq    $18,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $19,    $10,    $19
+       mulq    $23,    $1,     $18
+       umulh   $23,    $1,     $17
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $10
+       addq    $10,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $18
+       addq    $19,    $18,    $19
+       stq     $9,     40($16)
+       bis     $31,    $31,    $9
+       mulq    $0,     $27,    $10
+       umulh   $0,     $27,    $17
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $10
+       addq    $9,     $10,    $9
+       mulq    $2,     $24,    $18
+       umulh   $2,     $24,    $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $4,     $22,    $10
+       umulh   $4,     $22,    $17
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $10
+       addq    $9,     $10,    $9
+       mulq    $6,     $7,     $18
+       umulh   $6,     $7,     $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $8,     $5,     $10
+       umulh   $8,     $5,     $17
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $10
+       addq    $9,     $10,    $9
+       mulq    $23,    $3,     $18
+       umulh   $23,    $3,     $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $25,    $1,     $10
+       umulh   $25,    $1,     $17
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $10
+       addq    $9,     $10,    $9
+       stq     $20,    48($16)
+       bis     $31,    $31,    $20
+       mulq    $0,     $21,    $18
+       umulh   $0,     $21,    $17
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $18
+       addq    $20,    $18,    $20
+       mulq    $2,     $27,    $10
+       umulh   $2,     $27,    $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $0
+       addq    $20,    $0,     $20
+       mulq    $4,     $24,    $10
+       umulh   $4,     $24,    $18
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $17
+       addq    $17,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $0
+       addq    $20,    $0,     $20
+       mulq    $6,     $22,    $10
+       umulh   $6,     $22,    $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $0
+       addq    $20,    $0,     $20
+       mulq    $8,     $7,     $10
+       umulh   $8,     $7,     $18
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $17
+       addq    $17,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $0
+       addq    $20,    $0,     $20
+       mulq    $23,    $5,     $10
+       umulh   $23,    $5,     $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $0
+       addq    $20,    $0,     $20
+       mulq    $25,    $3,     $10
+       umulh   $25,    $3,     $18
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $17
+       addq    $17,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $0
+       addq    $20,    $0,     $20
+       mulq    $28,    $1,     $10
+       umulh   $28,    $1,     $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $0
+       addq    $20,    $0,     $20
+       stq     $19,    56($16)
+       bis     $31,    $31,    $19
+       mulq    $2,     $21,    $10
+       umulh   $2,     $21,    $18
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $17
+       addq    $17,    $18,    $18
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $0
+       addq    $19,    $0,     $19
+       mulq    $4,     $27,    $1
+       umulh   $4,     $27,    $10
+       addq    $9,     $1,     $9
+       cmpult  $9,     $1,     $17
+       addq    $17,    $10,    $10
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $19,    $18,    $19
+       mulq    $6,     $24,    $0
+       umulh   $6,     $24,    $2
+       addq    $9,     $0,     $9
+       cmpult  $9,     $0,     $1
+       addq    $1,     $2,     $2
+       addq    $20,    $2,     $20
+       cmpult  $20,    $2,     $17
+       addq    $19,    $17,    $19
+       mulq    $8,     $22,    $10
+       umulh   $8,     $22,    $18
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $0
+       addq    $0,     $18,    $18
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $1
+       addq    $19,    $1,     $19
+       mulq    $23,    $7,     $2
+       umulh   $23,    $7,     $17
+       addq    $9,     $2,     $9
+       cmpult  $9,     $2,     $10
+       addq    $10,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $0
+       addq    $19,    $0,     $19
+       mulq    $25,    $5,     $18
+       umulh   $25,    $5,     $1
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $2
+       addq    $2,     $1,     $1
+       addq    $20,    $1,     $20
+       cmpult  $20,    $1,     $10
+       addq    $19,    $10,    $19
+       mulq    $28,    $3,     $17
+       umulh   $28,    $3,     $0
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $18
+       addq    $18,    $0,     $0
+       addq    $20,    $0,     $20
+       cmpult  $20,    $0,     $2
+       addq    $19,    $2,     $19
+       stq     $9,     64($16)
+       bis     $31,    $31,    $9
+       mulq    $4,     $21,    $1
+       umulh   $4,     $21,    $10
+       addq    $20,    $1,     $20
+       cmpult  $20,    $1,     $17
+       addq    $17,    $10,    $10
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $9,     $18,    $9
+       mulq    $6,     $27,    $0
+       umulh   $6,     $27,    $2
+       addq    $20,    $0,     $20
+       cmpult  $20,    $0,     $3
+       addq    $3,     $2,     $2
+       addq    $19,    $2,     $19
+       cmpult  $19,    $2,     $1
+       addq    $9,     $1,     $9
+       mulq    $8,     $24,    $17
+       umulh   $8,     $24,    $10
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $18
+       addq    $18,    $10,    $10
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $4
+       addq    $9,     $4,     $9
+       mulq    $23,    $22,    $0
+       umulh   $23,    $22,    $3
+       addq    $20,    $0,     $20
+       cmpult  $20,    $0,     $2
+       addq    $2,     $3,     $3
+       addq    $19,    $3,     $19
+       cmpult  $19,    $3,     $1
+       addq    $9,     $1,     $9
+       mulq    $25,    $7,     $17
+       umulh   $25,    $7,     $18
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $10,    $18,    $18
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $4
+       addq    $9,     $4,     $9
+       mulq    $28,    $5,     $0
+       umulh   $28,    $5,     $2
+       addq    $20,    $0,     $20
+       cmpult  $20,    $0,     $3
+       addq    $3,     $2,     $2
+       addq    $19,    $2,     $19
+       cmpult  $19,    $2,     $1
+       addq    $9,     $1,     $9
+       stq     $20,    72($16)
+       bis     $31,    $31,    $20
+       mulq    $6,     $21,    $17
+       umulh   $6,     $21,    $10
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $18,    $10,    $10
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $4
+       addq    $20,    $4,     $20
+       mulq    $8,     $27,    $0
+       umulh   $8,     $27,    $3
+       addq    $19,    $0,     $19
+       cmpult  $19,    $0,     $2
+       addq    $2,     $3,     $3
+       addq    $9,     $3,     $9
+       cmpult  $9,     $3,     $1
+       addq    $20,    $1,     $20
+       mulq    $23,    $24,    $5
+       umulh   $23,    $24,    $17
+       addq    $19,    $5,     $19
+       cmpult  $19,    $5,     $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $10
+       addq    $20,    $10,    $20
+       mulq    $25,    $22,    $4
+       umulh   $25,    $22,    $6
+       addq    $19,    $4,     $19
+       cmpult  $19,    $4,     $0
+       addq    $0,     $6,     $6
+       addq    $9,     $6,     $9
+       cmpult  $9,     $6,     $2
+       addq    $20,    $2,     $20
+       mulq    $28,    $7,     $3
+       umulh   $28,    $7,     $1
+       addq    $19,    $3,     $19
+       cmpult  $19,    $3,     $5
+       addq    $5,     $1,     $1
+       addq    $9,     $1,     $9
+       cmpult  $9,     $1,     $18
+       addq    $20,    $18,    $20
+       stq     $19,    80($16)
+       bis     $31,    $31,    $19
+       mulq    $8,     $21,    $17
+       umulh   $8,     $21,    $10
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $4
+       addq    $4,     $10,    $10
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $0
+       addq    $19,    $0,     $19
+       mulq    $23,    $27,    $6
+       umulh   $23,    $27,    $2
+       addq    $9,     $6,     $9
+       cmpult  $9,     $6,     $3
+       addq    $3,     $2,     $2
+       addq    $20,    $2,     $20
+       cmpult  $20,    $2,     $5
+       addq    $19,    $5,     $19
+       mulq    $25,    $24,    $1
+       umulh   $25,    $24,    $18
+       addq    $9,     $1,     $9
+       cmpult  $9,     $1,     $7
+       addq    $7,     $18,    $18
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $17
+       addq    $19,    $17,    $19
+       mulq    $28,    $22,    $4
+       umulh   $28,    $22,    $10
+       addq    $9,     $4,     $9
+       cmpult  $9,     $4,     $0
+       addq    $0,     $10,    $10
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $8
+       addq    $19,    $8,     $19
+       stq     $9,     88($16)
+       bis     $31,    $31,    $9
+       mulq    $23,    $21,    $6
+       umulh   $23,    $21,    $3
+       addq    $20,    $6,     $20
+       cmpult  $20,    $6,     $2
+       addq    $2,     $3,     $3
+       addq    $19,    $3,     $19
+       cmpult  $19,    $3,     $5
+       addq    $9,     $5,     $9
+       mulq    $25,    $27,    $1
+       umulh   $25,    $27,    $7
+       addq    $20,    $1,     $20
+       cmpult  $20,    $1,     $18
+       addq    $18,    $7,     $7
+       addq    $19,    $7,     $19
+       cmpult  $19,    $7,     $17
+       addq    $9,     $17,    $9
+       mulq    $28,    $24,    $4
+       umulh   $28,    $24,    $0
+       addq    $20,    $4,     $20
+       cmpult  $20,    $4,     $10
+       addq    $10,    $0,     $0
+       addq    $19,    $0,     $19
+       cmpult  $19,    $0,     $8
+       addq    $9,     $8,     $9
+       stq     $20,    96($16)
+       bis     $31,    $31,    $20
+       mulq    $25,    $21,    $22
+       umulh   $25,    $21,    $6
+       addq    $19,    $22,    $19
+       cmpult  $19,    $22,    $2
+       addq    $2,     $6,     $6
+       addq    $9,     $6,     $9
+       cmpult  $9,     $6,     $3
+       addq    $20,    $3,     $20
+       mulq    $28,    $27,    $5
+       umulh   $28,    $27,    $23
+       addq    $19,    $5,     $19
+       cmpult  $19,    $5,     $1
+       addq    $1,     $23,    $23
+       addq    $9,     $23,    $9
+       cmpult  $9,     $23,    $18
+       addq    $20,    $18,    $20
+       stq     $19,    104($16)
+       bis     $31,    $31,    $19
+       mulq    $28,    $21,    $7
+       umulh   $28,    $21,    $17
+       addq    $9,     $7,     $9
+       cmpult  $9,     $7,     $4
+       addq    $4,     $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $19,    $10,    $19
+       stq     $9,     112($16)
+       stq     $20,    120($16)
+       ldq     $9,     0($30)
+       ldq     $10,    8($30)
+       addq    $30,    16,     $30
+       ret     $31,($26),1
+       .end bn_mul_comba8
+       .text
+       .align 3
+       .globl bn_sqr_comba4
+       .ent bn_sqr_comba4
+bn_sqr_comba4:
+bn_sqr_comba4..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       ldq     $0,     0($17)
+       ldq     $1,     8($17)
+       ldq     $2,     16($17)
+       ldq     $3,     24($17)
+       bis     $31,    $31,    $6
+       mulq    $0,     $0,     $4
+       umulh   $0,     $0,     $5
+       stq     $4,     0($16)
+       bis     $31,    $31,    $4
+       mulq    $0,     $1,     $7
+       umulh   $0,     $1,     $8
+       cmplt   $7,     $31,    $22
+       cmplt   $8,     $31,    $23
+       addq    $7,     $7,     $7
+       addq    $8,     $8,     $8
+       addq    $8,     $22,    $8
+       addq    $4,     $23,    $4
+       addq    $5,     $7,     $5
+       addq    $6,     $8,     $6
+       cmpult  $5,     $7,     $24
+       cmpult  $6,     $8,     $25
+       addq    $6,     $24,    $6
+       addq    $4,     $25,    $4
+       stq     $5,     8($16)
+       bis     $31,    $31,    $5
+       mulq    $1,     $1,     $27
+       umulh   $1,     $1,     $28
+       addq    $6,     $27,    $6
+       addq    $4,     $28,    $4
+       cmpult  $6,     $27,    $21
+       cmpult  $4,     $28,    $20
+       addq    $4,     $21,    $4
+       addq    $5,     $20,    $5
+       mulq    $2,     $0,     $19
+       umulh   $2,     $0,     $18
+       cmplt   $19,    $31,    $17
+       cmplt   $18,    $31,    $22
+       addq    $19,    $19,    $19
+       addq    $18,    $18,    $18
+       addq    $18,    $17,    $18
+       addq    $5,     $22,    $5
+       addq    $6,     $19,    $6
+       addq    $4,     $18,    $4
+       cmpult  $6,     $19,    $23
+       cmpult  $4,     $18,    $7
+       addq    $4,     $23,    $4
+       addq    $5,     $7,     $5
+       stq     $6,     16($16)
+       bis     $31,    $31,    $6
+       mulq    $3,     $0,     $8
+       umulh   $3,     $0,     $24
+       cmplt   $8,     $31,    $25
+       cmplt   $24,    $31,    $27
+       addq    $8,     $8,     $8
+       addq    $24,    $24,    $24
+       addq    $24,    $25,    $24
+       addq    $6,     $27,    $6
+       addq    $4,     $8,     $4
+       addq    $5,     $24,    $5
+       cmpult  $4,     $8,     $28
+       cmpult  $5,     $24,    $21
+       addq    $5,     $28,    $5
+       addq    $6,     $21,    $6
+       mulq    $2,     $1,     $20
+       umulh   $2,     $1,     $17
+       cmplt   $20,    $31,    $22
+       cmplt   $17,    $31,    $19
+       addq    $20,    $20,    $20
+       addq    $17,    $17,    $17
+       addq    $17,    $22,    $17
+       addq    $6,     $19,    $6
+       addq    $4,     $20,    $4
+       addq    $5,     $17,    $5
+       cmpult  $4,     $20,    $18
+       cmpult  $5,     $17,    $23
+       addq    $5,     $18,    $5
+       addq    $6,     $23,    $6
+       stq     $4,     24($16)
+       bis     $31,    $31,    $4
+       mulq    $2,     $2,     $7
+       umulh   $2,     $2,     $25
+       addq    $5,     $7,     $5
+       addq    $6,     $25,    $6
+       cmpult  $5,     $7,     $27
+       cmpult  $6,     $25,    $8
+       addq    $6,     $27,    $6
+       addq    $4,     $8,     $4
+       mulq    $3,     $1,     $24
+       umulh   $3,     $1,     $28
+       cmplt   $24,    $31,    $21
+       cmplt   $28,    $31,    $22
+       addq    $24,    $24,    $24
+       addq    $28,    $28,    $28
+       addq    $28,    $21,    $28
+       addq    $4,     $22,    $4
+       addq    $5,     $24,    $5
+       addq    $6,     $28,    $6
+       cmpult  $5,     $24,    $19
+       cmpult  $6,     $28,    $20
+       addq    $6,     $19,    $6
+       addq    $4,     $20,    $4
+       stq     $5,     32($16)
+       bis     $31,    $31,    $5
+       mulq    $3,     $2,     $17
+       umulh   $3,     $2,     $18
+       cmplt   $17,    $31,    $23
+       cmplt   $18,    $31,    $7
+       addq    $17,    $17,    $17
+       addq    $18,    $18,    $18
+       addq    $18,    $23,    $18
+       addq    $5,     $7,     $5
+       addq    $6,     $17,    $6
+       addq    $4,     $18,    $4
+       cmpult  $6,     $17,    $25
+       cmpult  $4,     $18,    $27
+       addq    $4,     $25,    $4
+       addq    $5,     $27,    $5
+       stq     $6,     40($16)
+       bis     $31,    $31,    $6
+       mulq    $3,     $3,     $8
+       umulh   $3,     $3,     $21
+       addq    $4,     $8,     $4
+       addq    $5,     $21,    $5
+       cmpult  $4,     $8,     $22
+       cmpult  $5,     $21,    $24
+       addq    $5,     $22,    $5
+       addq    $6,     $24,    $6
+       stq     $4,     48($16)
+       stq     $5,     56($16)
+       ret     $31,($26),1
+       .end bn_sqr_comba4
+       .text
+       .align 3
+       .globl bn_sqr_comba8
+       .ent bn_sqr_comba8
+bn_sqr_comba8:
+bn_sqr_comba8..ng:
+       .frame $30,0,$26,0
+       .prologue 0
 
+       ldq     $0,     0($17)
+       ldq     $1,     8($17)
+       ldq     $2,     16($17)
+       ldq     $3,     24($17)
+       ldq     $4,     32($17)
+       ldq     $5,     40($17)
+       ldq     $6,     48($17)
+       ldq     $7,     56($17)
+       bis     $31,    $31,    $23
+       mulq    $0,     $0,     $8
+       umulh   $0,     $0,     $22
+       stq     $8,     0($16)
+       bis     $31,    $31,    $8
+       mulq    $1,     $0,     $24
+       umulh   $1,     $0,     $25
+       cmplt   $24,    $31,    $27
+       cmplt   $25,    $31,    $28
+       addq    $24,    $24,    $24
+       addq    $25,    $25,    $25
+       addq    $25,    $27,    $25
+       addq    $8,     $28,    $8
+       addq    $22,    $24,    $22
+       addq    $23,    $25,    $23
+       cmpult  $22,    $24,    $21
+       cmpult  $23,    $25,    $20
+       addq    $23,    $21,    $23
+       addq    $8,     $20,    $8
+       stq     $22,    8($16)
+       bis     $31,    $31,    $22
+       mulq    $1,     $1,     $19
+       umulh   $1,     $1,     $18
+       addq    $23,    $19,    $23
+       addq    $8,     $18,    $8
+       cmpult  $23,    $19,    $17
+       cmpult  $8,     $18,    $27
+       addq    $8,     $17,    $8
+       addq    $22,    $27,    $22
+       mulq    $2,     $0,     $28
+       umulh   $2,     $0,     $24
+       cmplt   $28,    $31,    $25
+       cmplt   $24,    $31,    $21
+       addq    $28,    $28,    $28
+       addq    $24,    $24,    $24
+       addq    $24,    $25,    $24
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       addq    $8,     $24,    $8
+       cmpult  $23,    $28,    $20
+       cmpult  $8,     $24,    $19
+       addq    $8,     $20,    $8
+       addq    $22,    $19,    $22
+       stq     $23,    16($16)
+       bis     $31,    $31,    $23
+       mulq    $2,     $1,     $18
+       umulh   $2,     $1,     $17
+       cmplt   $18,    $31,    $27
+       cmplt   $17,    $31,    $25
+       addq    $18,    $18,    $18
+       addq    $17,    $17,    $17
+       addq    $17,    $27,    $17
+       addq    $23,    $25,    $23
+       addq    $8,     $18,    $8
+       addq    $22,    $17,    $22
+       cmpult  $8,     $18,    $21
+       cmpult  $22,    $17,    $28
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       mulq    $3,     $0,     $24
+       umulh   $3,     $0,     $20
+       cmplt   $24,    $31,    $19
+       cmplt   $20,    $31,    $27
+       addq    $24,    $24,    $24
+       addq    $20,    $20,    $20
+       addq    $20,    $19,    $20
+       addq    $23,    $27,    $23
+       addq    $8,     $24,    $8
+       addq    $22,    $20,    $22
+       cmpult  $8,     $24,    $25
+       cmpult  $22,    $20,    $18
+       addq    $22,    $25,    $22
+       addq    $23,    $18,    $23
+       stq     $8,     24($16)
+       bis     $31,    $31,    $8
+       mulq    $2,     $2,     $17
+       umulh   $2,     $2,     $21
+       addq    $22,    $17,    $22
+       addq    $23,    $21,    $23
+       cmpult  $22,    $17,    $28
+       cmpult  $23,    $21,    $19
+       addq    $23,    $28,    $23
+       addq    $8,     $19,    $8
+       mulq    $3,     $1,     $27
+       umulh   $3,     $1,     $24
+       cmplt   $27,    $31,    $20
+       cmplt   $24,    $31,    $25
+       addq    $27,    $27,    $27
+       addq    $24,    $24,    $24
+       addq    $24,    $20,    $24
+       addq    $8,     $25,    $8
+       addq    $22,    $27,    $22
+       addq    $23,    $24,    $23
+       cmpult  $22,    $27,    $18
+       cmpult  $23,    $24,    $17
+       addq    $23,    $18,    $23
+       addq    $8,     $17,    $8
+       mulq    $4,     $0,     $21
+       umulh   $4,     $0,     $28
+       cmplt   $21,    $31,    $19
+       cmplt   $28,    $31,    $20
+       addq    $21,    $21,    $21
+       addq    $28,    $28,    $28
+       addq    $28,    $19,    $28
+       addq    $8,     $20,    $8
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       cmpult  $22,    $21,    $25
+       cmpult  $23,    $28,    $27
+       addq    $23,    $25,    $23
+       addq    $8,     $27,    $8
+       stq     $22,    32($16)
+       bis     $31,    $31,    $22
+       mulq    $3,     $2,     $24
+       umulh   $3,     $2,     $18
+       cmplt   $24,    $31,    $17
+       cmplt   $18,    $31,    $19
+       addq    $24,    $24,    $24
+       addq    $18,    $18,    $18
+       addq    $18,    $17,    $18
+       addq    $22,    $19,    $22
+       addq    $23,    $24,    $23
+       addq    $8,     $18,    $8
+       cmpult  $23,    $24,    $20
+       cmpult  $8,     $18,    $21
+       addq    $8,     $20,    $8
+       addq    $22,    $21,    $22
+       mulq    $4,     $1,     $28
+       umulh   $4,     $1,     $25
+       cmplt   $28,    $31,    $27
+       cmplt   $25,    $31,    $17
+       addq    $28,    $28,    $28
+       addq    $25,    $25,    $25
+       addq    $25,    $27,    $25
+       addq    $22,    $17,    $22
+       addq    $23,    $28,    $23
+       addq    $8,     $25,    $8
+       cmpult  $23,    $28,    $19
+       cmpult  $8,     $25,    $24
+       addq    $8,     $19,    $8
+       addq    $22,    $24,    $22
+       mulq    $5,     $0,     $18
+       umulh   $5,     $0,     $20
+       cmplt   $18,    $31,    $21
+       cmplt   $20,    $31,    $27
+       addq    $18,    $18,    $18
+       addq    $20,    $20,    $20
+       addq    $20,    $21,    $20
+       addq    $22,    $27,    $22
+       addq    $23,    $18,    $23
+       addq    $8,     $20,    $8
+       cmpult  $23,    $18,    $17
+       cmpult  $8,     $20,    $28
+       addq    $8,     $17,    $8
+       addq    $22,    $28,    $22
+       stq     $23,    40($16)
+       bis     $31,    $31,    $23
+       mulq    $3,     $3,     $25
+       umulh   $3,     $3,     $19
+       addq    $8,     $25,    $8
+       addq    $22,    $19,    $22
+       cmpult  $8,     $25,    $24
+       cmpult  $22,    $19,    $21
+       addq    $22,    $24,    $22
+       addq    $23,    $21,    $23
+       mulq    $4,     $2,     $27
+       umulh   $4,     $2,     $18
+       cmplt   $27,    $31,    $20
+       cmplt   $18,    $31,    $17
+       addq    $27,    $27,    $27
+       addq    $18,    $18,    $18
+       addq    $18,    $20,    $18
+       addq    $23,    $17,    $23
+       addq    $8,     $27,    $8
+       addq    $22,    $18,    $22
+       cmpult  $8,     $27,    $28
+       cmpult  $22,    $18,    $25
+       addq    $22,    $28,    $22
+       addq    $23,    $25,    $23
+       mulq    $5,     $1,     $19
+       umulh   $5,     $1,     $24
+       cmplt   $19,    $31,    $21
+       cmplt   $24,    $31,    $20
+       addq    $19,    $19,    $19
+       addq    $24,    $24,    $24
+       addq    $24,    $21,    $24
+       addq    $23,    $20,    $23
+       addq    $8,     $19,    $8
+       addq    $22,    $24,    $22
+       cmpult  $8,     $19,    $17
+       cmpult  $22,    $24,    $27
+       addq    $22,    $17,    $22
+       addq    $23,    $27,    $23
+       mulq    $6,     $0,     $18
+       umulh   $6,     $0,     $28
+       cmplt   $18,    $31,    $25
+       cmplt   $28,    $31,    $21
+       addq    $18,    $18,    $18
+       addq    $28,    $28,    $28
+       addq    $28,    $25,    $28
+       addq    $23,    $21,    $23
+       addq    $8,     $18,    $8
+       addq    $22,    $28,    $22
+       cmpult  $8,     $18,    $20
+       cmpult  $22,    $28,    $19
+       addq    $22,    $20,    $22
+       addq    $23,    $19,    $23
+       stq     $8,     48($16)
+       bis     $31,    $31,    $8
+       mulq    $4,     $3,     $24
+       umulh   $4,     $3,     $17
+       cmplt   $24,    $31,    $27
+       cmplt   $17,    $31,    $25
+       addq    $24,    $24,    $24
+       addq    $17,    $17,    $17
+       addq    $17,    $27,    $17
+       addq    $8,     $25,    $8
+       addq    $22,    $24,    $22
+       addq    $23,    $17,    $23
+       cmpult  $22,    $24,    $21
+       cmpult  $23,    $17,    $18
+       addq    $23,    $21,    $23
+       addq    $8,     $18,    $8
+       mulq    $5,     $2,     $28
+       umulh   $5,     $2,     $20
+       cmplt   $28,    $31,    $19
+       cmplt   $20,    $31,    $27
+       addq    $28,    $28,    $28
+       addq    $20,    $20,    $20
+       addq    $20,    $19,    $20
+       addq    $8,     $27,    $8
+       addq    $22,    $28,    $22
+       addq    $23,    $20,    $23
+       cmpult  $22,    $28,    $25
+       cmpult  $23,    $20,    $24
+       addq    $23,    $25,    $23
+       addq    $8,     $24,    $8
+       mulq    $6,     $1,     $17
+       umulh   $6,     $1,     $21
+       cmplt   $17,    $31,    $18
+       cmplt   $21,    $31,    $19
+       addq    $17,    $17,    $17
+       addq    $21,    $21,    $21
+       addq    $21,    $18,    $21
+       addq    $8,     $19,    $8
+       addq    $22,    $17,    $22
+       addq    $23,    $21,    $23
+       cmpult  $22,    $17,    $27
+       cmpult  $23,    $21,    $28
+       addq    $23,    $27,    $23
+       addq    $8,     $28,    $8
+       mulq    $7,     $0,     $20
+       umulh   $7,     $0,     $25
+       cmplt   $20,    $31,    $24
+       cmplt   $25,    $31,    $18
+       addq    $20,    $20,    $20
+       addq    $25,    $25,    $25
+       addq    $25,    $24,    $25
+       addq    $8,     $18,    $8
+       addq    $22,    $20,    $22
+       addq    $23,    $25,    $23
+       cmpult  $22,    $20,    $19
+       cmpult  $23,    $25,    $17
+       addq    $23,    $19,    $23
+       addq    $8,     $17,    $8
+       stq     $22,    56($16)
+       bis     $31,    $31,    $22
+       mulq    $4,     $4,     $21
+       umulh   $4,     $4,     $27
+       addq    $23,    $21,    $23
+       addq    $8,     $27,    $8
+       cmpult  $23,    $21,    $28
+       cmpult  $8,     $27,    $24
+       addq    $8,     $28,    $8
+       addq    $22,    $24,    $22
+       mulq    $5,     $3,     $18
+       umulh   $5,     $3,     $20
+       cmplt   $18,    $31,    $25
+       cmplt   $20,    $31,    $19
+       addq    $18,    $18,    $18
+       addq    $20,    $20,    $20
+       addq    $20,    $25,    $20
+       addq    $22,    $19,    $22
+       addq    $23,    $18,    $23
+       addq    $8,     $20,    $8
+       cmpult  $23,    $18,    $17
+       cmpult  $8,     $20,    $21
+       addq    $8,     $17,    $8
+       addq    $22,    $21,    $22
+       mulq    $6,     $2,     $27
+       umulh   $6,     $2,     $28
+       cmplt   $27,    $31,    $24
+       cmplt   $28,    $31,    $25
+       addq    $27,    $27,    $27
+       addq    $28,    $28,    $28
+       addq    $28,    $24,    $28
+       addq    $22,    $25,    $22
+       addq    $23,    $27,    $23
+       addq    $8,     $28,    $8
+       cmpult  $23,    $27,    $19
+       cmpult  $8,     $28,    $18
+       addq    $8,     $19,    $8
+       addq    $22,    $18,    $22
+       mulq    $7,     $1,     $20
+       umulh   $7,     $1,     $17
+       cmplt   $20,    $31,    $21
+       cmplt   $17,    $31,    $24
+       addq    $20,    $20,    $20
+       addq    $17,    $17,    $17
+       addq    $17,    $21,    $17
+       addq    $22,    $24,    $22
+       addq    $23,    $20,    $23
+       addq    $8,     $17,    $8
+       cmpult  $23,    $20,    $25
+       cmpult  $8,     $17,    $27
+       addq    $8,     $25,    $8
+       addq    $22,    $27,    $22
+       stq     $23,    64($16)
+       bis     $31,    $31,    $23
+       mulq    $5,     $4,     $28
+       umulh   $5,     $4,     $19
+       cmplt   $28,    $31,    $18
+       cmplt   $19,    $31,    $21
+       addq    $28,    $28,    $28
+       addq    $19,    $19,    $19
+       addq    $19,    $18,    $19
+       addq    $23,    $21,    $23
+       addq    $8,     $28,    $8
+       addq    $22,    $19,    $22
+       cmpult  $8,     $28,    $24
+       cmpult  $22,    $19,    $20
+       addq    $22,    $24,    $22
+       addq    $23,    $20,    $23
+       mulq    $6,     $3,     $17
+       umulh   $6,     $3,     $25
+       cmplt   $17,    $31,    $27
+       cmplt   $25,    $31,    $18
+       addq    $17,    $17,    $17
+       addq    $25,    $25,    $25
+       addq    $25,    $27,    $25
+       addq    $23,    $18,    $23
+       addq    $8,     $17,    $8
+       addq    $22,    $25,    $22
+       cmpult  $8,     $17,    $21
+       cmpult  $22,    $25,    $28
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       mulq    $7,     $2,     $19
+       umulh   $7,     $2,     $24
+       cmplt   $19,    $31,    $20
+       cmplt   $24,    $31,    $27
+       addq    $19,    $19,    $19
+       addq    $24,    $24,    $24
+       addq    $24,    $20,    $24
+       addq    $23,    $27,    $23
+       addq    $8,     $19,    $8
+       addq    $22,    $24,    $22
+       cmpult  $8,     $19,    $18
+       cmpult  $22,    $24,    $17
+       addq    $22,    $18,    $22
+       addq    $23,    $17,    $23
+       stq     $8,     72($16)
+       bis     $31,    $31,    $8
+       mulq    $5,     $5,     $25
+       umulh   $5,     $5,     $21
+       addq    $22,    $25,    $22
+       addq    $23,    $21,    $23
+       cmpult  $22,    $25,    $28
+       cmpult  $23,    $21,    $20
+       addq    $23,    $28,    $23
+       addq    $8,     $20,    $8
+       mulq    $6,     $4,     $27
+       umulh   $6,     $4,     $19
+       cmplt   $27,    $31,    $24
+       cmplt   $19,    $31,    $18
+       addq    $27,    $27,    $27
+       addq    $19,    $19,    $19
+       addq    $19,    $24,    $19
+       addq    $8,     $18,    $8
+       addq    $22,    $27,    $22
+       addq    $23,    $19,    $23
+       cmpult  $22,    $27,    $17
+       cmpult  $23,    $19,    $25
+       addq    $23,    $17,    $23
+       addq    $8,     $25,    $8
+       mulq    $7,     $3,     $21
+       umulh   $7,     $3,     $28
+       cmplt   $21,    $31,    $20
+       cmplt   $28,    $31,    $24
+       addq    $21,    $21,    $21
+       addq    $28,    $28,    $28
+       addq    $28,    $20,    $28
+       addq    $8,     $24,    $8
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       cmpult  $22,    $21,    $18
+       cmpult  $23,    $28,    $27
+       addq    $23,    $18,    $23
+       addq    $8,     $27,    $8
+       stq     $22,    80($16)
+       bis     $31,    $31,    $22
+       mulq    $6,     $5,     $19
+       umulh   $6,     $5,     $17
+       cmplt   $19,    $31,    $25
+       cmplt   $17,    $31,    $20
+       addq    $19,    $19,    $19
+       addq    $17,    $17,    $17
+       addq    $17,    $25,    $17
+       addq    $22,    $20,    $22
+       addq    $23,    $19,    $23
+       addq    $8,     $17,    $8
+       cmpult  $23,    $19,    $24
+       cmpult  $8,     $17,    $21
+       addq    $8,     $24,    $8
+       addq    $22,    $21,    $22
+       mulq    $7,     $4,     $28
+       umulh   $7,     $4,     $18
+       cmplt   $28,    $31,    $27
+       cmplt   $18,    $31,    $25
+       addq    $28,    $28,    $28
+       addq    $18,    $18,    $18
+       addq    $18,    $27,    $18
+       addq    $22,    $25,    $22
+       addq    $23,    $28,    $23
+       addq    $8,     $18,    $8
+       cmpult  $23,    $28,    $20
+       cmpult  $8,     $18,    $19
+       addq    $8,     $20,    $8
+       addq    $22,    $19,    $22
+       stq     $23,    88($16)
+       bis     $31,    $31,    $23
+       mulq    $6,     $6,     $17
+       umulh   $6,     $6,     $24
+       addq    $8,     $17,    $8
+       addq    $22,    $24,    $22
+       cmpult  $8,     $17,    $21
+       cmpult  $22,    $24,    $27
+       addq    $22,    $21,    $22
+       addq    $23,    $27,    $23
+       mulq    $7,     $5,     $25
+       umulh   $7,     $5,     $28
+       cmplt   $25,    $31,    $18
+       cmplt   $28,    $31,    $20
+       addq    $25,    $25,    $25
+       addq    $28,    $28,    $28
+       addq    $28,    $18,    $28
+       addq    $23,    $20,    $23
+       addq    $8,     $25,    $8
+       addq    $22,    $28,    $22
+       cmpult  $8,     $25,    $19
+       cmpult  $22,    $28,    $17
+       addq    $22,    $19,    $22
+       addq    $23,    $17,    $23
+       stq     $8,     96($16)
+       bis     $31,    $31,    $8
+       mulq    $7,     $6,     $24
+       umulh   $7,     $6,     $21
+       cmplt   $24,    $31,    $27
+       cmplt   $21,    $31,    $18
+       addq    $24,    $24,    $24
+       addq    $21,    $21,    $21
+       addq    $21,    $27,    $21
+       addq    $8,     $18,    $8
+       addq    $22,    $24,    $22
+       addq    $23,    $21,    $23
+       cmpult  $22,    $24,    $20
+       cmpult  $23,    $21,    $25
+       addq    $23,    $20,    $23
+       addq    $8,     $25,    $8
+       stq     $22,    104($16)
+       bis     $31,    $31,    $22
+       mulq    $7,     $7,     $28
+       umulh   $7,     $7,     $19
+       addq    $23,    $28,    $23
+       addq    $8,     $19,    $8
+       cmpult  $23,    $28,    $17
+       cmpult  $8,     $19,    $27
+       addq    $8,     $17,    $8
+       addq    $22,    $27,    $22
+       stq     $23,    112($16)
+       stq     $8,     120($16)
+       ret     $31,($26),1
+       .end bn_sqr_comba8
diff --git a/crypto/bn/asm/alpha.s.works b/crypto/bn/asm/alpha.s.works
new file mode 100644 (file)
index 0000000..ee6c587
--- /dev/null
@@ -0,0 +1,533 @@
+
+ # DEC Alpha assember
+ # The bn_div64 is actually gcc output but the other parts are hand done.
+ # Thanks to tzeruch@ceddec.com for sending me the gcc output for
+ # bn_div64.
+ # I've gone back and re-done most of routines.
+ # The key thing to remeber for the 164 CPU is that while a
+ # multiply operation takes 8 cycles, another one can only be issued
+ # after 4 cycles have elapsed.  I've done modification to help
+ # improve this.  Also, normally, a ld instruction will not be available
+ # for about 3 cycles.
+       .file   1 "bn_asm.c"
+       .set noat
+gcc2_compiled.:
+__gnu_compiled_c:
+       .text
+       .align 3
+       .globl bn_mul_add_words
+       .ent bn_mul_add_words
+bn_mul_add_words:
+bn_mul_add_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+       .align 5
+       subq    $18,4,$18
+       bis     $31,$31,$0
+       blt     $18,$43         # if we are -1, -2, -3 or -4 goto tail code
+       ldq     $20,0($17)      # 1 1
+       ldq     $1,0($16)       # 1 1
+       .align 3
+$42:
+       mulq    $20,$19,$5      # 1 2 1 ######
+       ldq     $21,8($17)      # 2 1
+       ldq     $2,8($16)       # 2 1
+       umulh   $20,$19,$20     # 1 2   ######
+       ldq     $27,16($17)     # 3 1
+       ldq     $3,16($16)      # 3 1
+       mulq    $21,$19,$6      # 2 2 1 ######
+        ldq    $28,24($17)     # 4 1
+       addq    $1,$5,$1        # 1 2 2
+        ldq    $4,24($16)      # 4 1
+       umulh   $21,$19,$21     # 2 2   ######
+        cmpult $1,$5,$22       # 1 2 3 1
+       addq    $20,$22,$20     # 1 3 1
+        addq   $1,$0,$1        # 1 2 3 1
+       mulq    $27,$19,$7      # 3 2 1 ######
+        cmpult $1,$0,$0        # 1 2 3 2
+       addq    $2,$6,$2        # 2 2 2
+        addq   $20,$0,$0       # 1 3 2 
+       cmpult  $2,$6,$23       # 2 2 3 1
+        addq   $21,$23,$21     # 2 3 1
+       umulh   $27,$19,$27     # 3 2   ######
+        addq   $2,$0,$2        # 2 2 3 1
+       cmpult  $2,$0,$0        # 2 2 3 2
+        subq   $18,4,$18
+       mulq    $28,$19,$8      # 4 2 1 ######
+        addq   $21,$0,$0       # 2 3 2 
+       addq    $3,$7,$3        # 3 2 2
+        addq   $16,32,$16
+       cmpult  $3,$7,$24       # 3 2 3 1
+        stq    $1,-32($16)     # 1 2 4
+       umulh   $28,$19,$28     # 4 2   ######
+        addq   $27,$24,$27     # 3 3 1
+       addq    $3,$0,$3        # 3 2 3 1
+        stq    $2,-24($16)     # 2 2 4
+       cmpult  $3,$0,$0        # 3 2 3 2
+        stq    $3,-16($16)     # 3 2 4
+       addq    $4,$8,$4        # 4 2 2
+        addq   $27,$0,$0       # 3 3 2 
+       cmpult  $4,$8,$25       # 4 2 3 1
+        addq   $17,32,$17
+       addq    $28,$25,$28     # 4 3 1
+        addq   $4,$0,$4        # 4 2 3 1
+       cmpult  $4,$0,$0        # 4 2 3 2
+        stq    $4,-8($16)      # 4 2 4
+       addq    $28,$0,$0       # 4 3 2 
+        blt    $18,$43
+
+       ldq     $20,0($17)      # 1 1
+       ldq     $1,0($16)       # 1 1
+
+       br      $42
+
+       .align 4
+$45:
+       ldq     $20,0($17)      # 4 1
+       ldq     $1,0($16)       # 4 1
+       mulq    $20,$19,$5      # 4 2 1
+       subq    $18,1,$18
+       addq    $16,8,$16
+       addq    $17,8,$17
+       umulh   $20,$19,$20     # 4 2
+       addq    $1,$5,$1        # 4 2 2
+       cmpult  $1,$5,$22       # 4 2 3 1
+       addq    $20,$22,$20     # 4 3 1
+       addq    $1,$0,$1        # 4 2 3 1
+       cmpult  $1,$0,$0        # 4 2 3 2
+       addq    $20,$0,$0       # 4 3 2 
+       stq     $1,-8($16)      # 4 2 4
+       bgt     $18,$45
+       ret     $31,($26),1     # else exit
+
+       .align 4
+$43:
+       addq    $18,4,$18
+       bgt     $18,$45         # goto tail code
+       ret     $31,($26),1     # else exit
+
+       .end bn_mul_add_words
+       .align 3
+       .globl bn_mul_words
+       .ent bn_mul_words
+bn_mul_words:
+bn_mul_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+       .align 5
+       subq    $18,4,$18
+       bis     $31,$31,$0
+       blt     $18,$143        # if we are -1, -2, -3 or -4 goto tail code
+       ldq     $20,0($17)      # 1 1
+       .align 3
+$142:
+
+       mulq    $20,$19,$5      # 1 2 1 #####
+        ldq    $21,8($17)      # 2 1
+        ldq    $27,16($17)     # 3 1
+       umulh   $20,$19,$20     # 1 2   #####
+        ldq    $28,24($17)     # 4 1
+       mulq    $21,$19,$6      # 2 2 1 #####
+        addq   $5,$0,$5        # 1 2 3 1
+       subq    $18,4,$18
+        cmpult $5,$0,$0        # 1 2 3 2
+       umulh   $21,$19,$21     # 2 2   #####
+        addq   $20,$0,$0       # 1 3 2 
+       addq    $17,32,$17
+        addq   $6,$0,$6        # 2 2 3 1
+       mulq    $27,$19,$7      # 3 2 1 #####
+        cmpult $6,$0,$0        # 2 2 3 2
+       addq    $21,$0,$0       # 2 3 2 
+        addq   $16,32,$16
+       umulh   $27,$19,$27     # 3 2   #####
+        stq    $5,-32($16)     # 1 2 4
+       mulq    $28,$19,$8      # 4 2 1 #####
+        addq   $7,$0,$7        # 3 2 3 1
+       stq     $6,-24($16)     # 2 2 4
+        cmpult $7,$0,$0        # 3 2 3 2
+       umulh   $28,$19,$28     # 4 2   #####
+        addq   $27,$0,$0       # 3 3 2 
+       stq     $7,-16($16)     # 3 2 4
+        addq   $8,$0,$8        # 4 2 3 1
+       cmpult  $8,$0,$0        # 4 2 3 2
+
+       addq    $28,$0,$0       # 4 3 2 
+
+       stq     $8,-8($16)      # 4 2 4
+
+       blt     $18,$143
+
+       ldq     $20,0($17)      # 1 1
+
+       br      $142
+
+       .align 4
+$145:
+       ldq     $20,0($17)      # 4 1
+       mulq    $20,$19,$5      # 4 2 1
+       subq    $18,1,$18
+       umulh   $20,$19,$20     # 4 2
+       addq    $5,$0,$5        # 4 2 3 1
+        addq   $16,8,$16
+       cmpult  $5,$0,$0        # 4 2 3 2
+        addq   $17,8,$17
+       addq    $20,$0,$0       # 4 3 2 
+       stq     $5,-8($16)      # 4 2 4
+
+       bgt     $18,$145
+       ret     $31,($26),1     # else exit
+
+       .align 4
+$143:
+       addq    $18,4,$18
+       bgt     $18,$145        # goto tail code
+       ret     $31,($26),1     # else exit
+
+       .end bn_mul_words
+       .align 3
+       .globl bn_sqr_words
+       .ent bn_sqr_words
+bn_sqr_words:
+bn_sqr_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $18,4,$18
+       blt     $18,$543        # if we are -1, -2, -3 or -4 goto tail code
+       ldq     $20,0($17)      # 1 1
+       .align 3
+$542:
+       mulq    $20,$20,$5              ######
+        ldq    $21,8($17)      # 1 1
+       subq    $18,4
+       umulh   $20,$20,$1              ######
+       ldq     $27,16($17)     # 1 1
+       mulq    $21,$21,$6              ######
+       ldq     $28,24($17)     # 1 1
+       stq     $5,0($16)       # r[0]
+       umulh   $21,$21,$2              ######
+       stq     $1,8($16)       # r[1]
+       mulq    $27,$27,$7              ######
+       stq     $6,16($16)      # r[0]
+       umulh   $27,$27,$3              ######
+       stq     $2,24($16)      # r[1]
+       mulq    $28,$28,$8              ######
+       stq     $7,32($16)      # r[0]
+       umulh   $28,$28,$4              ######
+       stq     $3,40($16)      # r[1]
+
+       addq    $16,64,$16
+       addq    $17,32,$17
+       stq     $8,-16($16)     # r[0]
+       stq     $4,-8($16)      # r[1]
+
+       blt     $18,$543
+       ldq     $20,0($17)      # 1 1
+       br      $542
+
+$442:
+       ldq     $20,0($17)   # a[0]
+       mulq    $20,$20,$5  # a[0]*w low part       r2
+       addq    $16,16,$16
+       addq    $17,8,$17
+       subq    $18,1,$18
+        umulh  $20,$20,$1  # a[0]*w high part       r3
+       stq     $5,-16($16)   # r[0]
+        stq    $1,-8($16)   # r[1]
+
+       bgt     $18,$442
+       ret     $31,($26),1     # else exit
+
+       .align 4
+$543:
+       addq    $18,4,$18
+       bgt     $18,$442        # goto tail code
+       ret     $31,($26),1     # else exit
+       .end bn_sqr_words
+
+       .align 3
+       .globl bn_add_words
+       .ent bn_add_words
+bn_add_words:
+bn_add_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $19,4,$19
+       bis     $31,$31,$0      # carry = 0
+       blt     $19,$900
+       ldq     $5,0($17)       # a[0]
+       ldq     $1,0($18)       # b[1]
+       .align 3
+$901:
+       addq    $1,$5,$1        # r=a+b;
+        ldq    $6,8($17)       # a[1]
+       cmpult  $1,$5,$22       # did we overflow?
+        ldq    $2,8($18)       # b[1]
+       addq    $1,$0,$1        # c+= overflow
+        ldq    $7,16($17)      # a[2]
+       cmpult  $1,$0,$0        # overflow?
+        ldq    $3,16($18)      # b[2]
+       addq    $0,$22,$0
+        ldq    $8,24($17)      # a[3]
+       addq    $2,$6,$2        # r=a+b;
+        ldq    $4,24($18)      # b[3]
+       cmpult  $2,$6,$23       # did we overflow?
+        addq   $3,$7,$3        # r=a+b;
+       addq    $2,$0,$2        # c+= overflow
+        cmpult $3,$7,$24       # did we overflow?
+       cmpult  $2,$0,$0        # overflow?
+        addq   $4,$8,$4        # r=a+b;
+       addq    $0,$23,$0
+        cmpult $4,$8,$25       # did we overflow?
+       addq    $3,$0,$3        # c+= overflow
+        stq    $1,0($16)       # r[0]=c
+       cmpult  $3,$0,$0        # overflow?
+        stq    $2,8($16)       # r[1]=c
+       addq    $0,$24,$0
+        stq    $3,16($16)      # r[2]=c
+       addq    $4,$0,$4        # c+= overflow
+        subq   $19,4,$19       # loop--
+       cmpult  $4,$0,$0        # overflow?
+        addq   $17,32,$17      # a++
+       addq    $0,$25,$0
+        stq    $4,24($16)      # r[3]=c
+       addq    $18,32,$18      # b++
+        addq   $16,32,$16      # r++
+
+       blt     $19,$900
+        ldq    $5,0($17)       # a[0]
+       ldq     $1,0($18)       # b[1]
+        br     $901
+       .align 4
+$945:
+       ldq     $5,0($17)       # a[0]
+        ldq    $1,0($18)       # b[1]
+       addq    $1,$5,$1        # r=a+b;
+        subq   $19,1,$19       # loop--
+       addq    $1,$0,$1        # c+= overflow
+        addq   $17,8,$17       # a++
+       cmpult  $1,$5,$22       # did we overflow?
+        cmpult $1,$0,$0        # overflow?
+       addq    $18,8,$18       # b++
+        stq    $1,0($16)       # r[0]=c
+       addq    $0,$22,$0
+        addq   $16,8,$16       # r++
+
+       bgt     $19,$945
+       ret     $31,($26),1     # else exit
+
+$900:
+       addq    $19,4,$19
+       bgt     $19,$945        # goto tail code
+       ret     $31,($26),1     # else exit
+       .end bn_add_words
+
+ #
+ # What follows was taken directly from the C compiler with a few
+ # hacks to redo the lables.
+ #
+.text
+       .align 3
+       .globl bn_div64
+       .ent bn_div64
+bn_div64:
+       ldgp $29,0($27)
+bn_div64..ng:
+       lda $30,-48($30)
+       .frame $30,48,$26,0
+       stq $26,0($30)
+       stq $9,8($30)
+       stq $10,16($30)
+       stq $11,24($30)
+       stq $12,32($30)
+       stq $13,40($30)
+       .mask 0x4003e00,-48
+       .prologue 1
+       bis $16,$16,$9
+       bis $17,$17,$10
+       bis $18,$18,$11
+       bis $31,$31,$13
+       bis $31,2,$12
+       bne $11,$119
+       lda $0,-1
+       br $31,$136
+       .align 4
+$119:
+       bis $11,$11,$16
+       jsr $26,BN_num_bits_word
+       ldgp $29,0($26)
+       subq $0,64,$1
+       beq $1,$120
+       bis $31,1,$1
+       sll $1,$0,$1
+       cmpule $9,$1,$1
+       bne $1,$120
+ #     lda $16,_IO_stderr_
+ #     lda $17,$C32
+ #     bis $0,$0,$18
+ #     jsr $26,fprintf
+ #     ldgp $29,0($26)
+       jsr $26,abort
+       ldgp $29,0($26)
+       .align 4
+$120:
+       bis $31,64,$3
+       cmpult $9,$11,$2
+       subq $3,$0,$1
+       addl $1,$31,$0
+       subq $9,$11,$1
+       cmoveq $2,$1,$9
+       beq $0,$122
+       zapnot $0,15,$2
+       subq $3,$0,$1
+       sll $11,$2,$11
+       sll $9,$2,$3
+       srl $10,$1,$1
+       sll $10,$2,$10
+       bis $3,$1,$9
+$122:
+       srl $11,32,$5
+       zapnot $11,15,$6
+       lda $7,-1
+       .align 5
+$123:
+       srl $9,32,$1
+       subq $1,$5,$1
+       bne $1,$126
+       zapnot $7,15,$27
+       br $31,$127
+       .align 4
+$126:
+       bis $9,$9,$24
+       bis $5,$5,$25
+       divqu $24,$25,$27
+$127:
+       srl $10,32,$4
+       .align 5
+$128:
+       mulq $27,$5,$1
+       subq $9,$1,$3
+       zapnot $3,240,$1
+       bne $1,$129
+       mulq $6,$27,$2
+       sll $3,32,$1
+       addq $1,$4,$1
+       cmpule $2,$1,$2
+       bne $2,$129
+       subq $27,1,$27
+       br $31,$128
+       .align 4
+$129:
+       mulq $27,$6,$1
+       mulq $27,$5,$4
+       srl $1,32,$3
+       sll $1,32,$1
+       addq $4,$3,$4
+       cmpult $10,$1,$2
+       subq $10,$1,$10
+       addq $2,$4,$2
+       cmpult $9,$2,$1
+       bis $2,$2,$4
+       beq $1,$134
+       addq $9,$11,$9
+       subq $27,1,$27
+$134:
+       subl $12,1,$12
+       subq $9,$4,$9
+       beq $12,$124
+       sll $27,32,$13
+       sll $9,32,$2
+       srl $10,32,$1
+       sll $10,32,$10
+       bis $2,$1,$9
+       br $31,$123
+       .align 4
+$124:
+       bis $13,$27,$0
+$136:
+       ldq $26,0($30)
+       ldq $9,8($30)
+       ldq $10,16($30)
+       ldq $11,24($30)
+       ldq $12,32($30)
+       ldq $13,40($30)
+       addq $30,48,$30
+       ret $31,($26),1
+       .end bn_div64
+
+       .set noat
+       .text
+       .align 3
+       .globl bn_sub_words
+       .ent bn_sub_words
+bn_sub_words:
+bn_sub_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $19,    4,      $19
+       bis     $31,    $31,    $0
+       blt     $19,    $100
+       ldq     $1,     0($17)
+       ldq     $2,     0($18)
+$101:
+       ldq     $3,     8($17)
+       cmpult  $1,     $2,     $4
+       ldq     $5,     8($18)
+       subq    $1,     $2,     $1
+       ldq     $6,     16($17)
+       cmpult  $1,     $0,     $2
+       ldq     $7,     16($18)
+       subq    $1,     $0,     $23
+       ldq     $8,     24($17)
+       addq    $2,     $4,     $0
+       cmpult  $3,     $5,     $24
+       subq    $3,     $5,     $3
+       ldq     $22,    24($18)
+       cmpult  $3,     $0,     $5
+       subq    $3,     $0,     $25
+       addq    $5,     $24,    $0
+       cmpult  $6,     $7,     $27
+       subq    $6,     $7,     $6
+       stq     $23,    0($16)
+       cmpult  $6,     $0,     $7
+       subq    $6,     $0,     $28
+       addq    $7,     $27,    $0
+       cmpult  $8,     $22,    $21
+       subq    $8,     $22,    $8
+       stq     $25,    8($16)
+       cmpult  $8,     $0,     $22
+       subq    $8,     $0,     $20
+       addq    $22,    $21,    $0
+       stq     $28,    16($16)
+       subq    $19,    4,      $19
+       stq     $20,    24($16)
+       addq    $17,    32,     $17
+       addq    $18,    32,     $18
+       addq    $16,    32,     $16
+       blt     $19,    $100
+       ldq     $1,     0($17)
+       ldq     $2,     0($18)
+       br      $101
+$102:
+       ldq     $1,     0($17)
+       ldq     $2,     0($18)
+       cmpult  $1,     $2,     $27
+       subq    $1,     $2,     $1
+       cmpult  $1,     $0,     $2
+       subq    $1,     $0,     $1
+       stq     $1,     0($16)
+       addq    $2,     $27,    $0
+       addq    $17,    8,      $17
+       addq    $18,    8,      $18
+       addq    $16,    8,      $16
+       subq    $19,    1,      $19
+       bgt     $19,    $102
+       ret     $31,($26),1
+$100:
+       addq    $19,    4,      $19
+       bgt     $19,    $102
+$103:
+       ret     $31,($26),1
+       .end bn_sub_words
diff --git a/crypto/bn/asm/alpha.works/add.pl b/crypto/bn/asm/alpha.works/add.pl
new file mode 100644 (file)
index 0000000..4dc76e6
--- /dev/null
@@ -0,0 +1,119 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub bn_add_words
+       {
+       local($name)=@_;
+       local($cc,$a,$b,$r);
+
+       &init_pool(4);
+       ($cc)=GR("r0");
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $bp=&wparam(2);
+       $count=&wparam(3);
+
+       &function_begin($name,"");
+
+       &comment("");
+       &sub($count,4,$count);
+       &mov("zero",$cc);
+       &br(&label("finish"));
+       &blt($count,&label("finish"));
+
+       ($a0,$b0)=&NR(2);
+       &ld($a0,&QWPw(0,$ap));
+       &ld($b0,&QWPw(0,$bp));
+
+##########################################################
+       &set_label("loop");
+
+       ($a1)=&NR(1); &ld($a1,&QWPw(1,$ap));
+       ($b1)=&NR(1); &ld($b1,&QWPw(1,$bp));
+       ($a2)=&NR(1); &ld($a2,&QWPw(2,$ap));
+       ($b2)=&NR(1); &ld($b2,&QWPw(2,$bp));
+       ($a3)=&NR(1); &ld($a3,&QWPw(3,$ap));
+       ($b3)=&NR(1); &ld($b3,&QWPw(3,$bp));
+
+       ($o0,$t0)=&NR(2);
+       &add($a0,$b0,$o0); 
+       &cmpult($o0,$b0,$t0);
+       &add($o0,$cc,$o0);
+       &cmpult($o0,$cc,$cc);
+       &add($cc,$t0,$cc);      &FR($t0);
+
+       ($t1,$o1)=&NR(2);
+
+       &add($a1,$b1,$o1);      &FR($a1);
+       &cmpult($o1,$b1,$t1);   &FR($b1);
+       &add($o1,$cc,$o1);
+       &cmpult($o1,$cc,$cc);
+       &add($cc,$t1,$cc);      &FR($t1);
+
+       ($t2,$o2)=&NR(2);
+
+       &add($a2,$b2,$o2);      &FR($a2);
+       &cmpult($o2,$b2,$t2);   &FR($b2);
+       &add($o2,$cc,$o2);
+       &cmpult($o2,$cc,$cc);
+       &add($cc,$t2,$cc);      &FR($t2);
+
+       ($t3,$o3)=&NR(2);
+
+       &add($a3,$b3,$o3);      &FR($a3);
+       &cmpult($o3,$b3,$t3);   &FR($b3);
+       &add($o3,$cc,$o3);
+       &cmpult($o3,$cc,$cc);
+       &add($cc,$t3,$cc);      &FR($t3);
+
+       &st($o0,&QWPw(0,$rp)); &FR($o0);
+       &st($o1,&QWPw(0,$rp)); &FR($o1);
+       &st($o2,&QWPw(0,$rp)); &FR($o2);
+       &st($o3,&QWPw(0,$rp)); &FR($o3);
+
+       &sub($count,4,$count);  # count-=4
+       &add($ap,4*$QWS,$ap);   # count+=4
+       &add($bp,4*$QWS,$bp);   # count+=4
+       &add($rp,4*$QWS,$rp);   # count+=4
+
+       &blt($count,&label("finish"));
+       &ld($a0,&QWPw(0,$ap));
+        &ld($b0,&QWPw(0,$bp));
+       &br(&label("loop"));
+##################################################
+       # Do the last 0..3 words
+
+       ($t0,$o0)=&NR(2);
+       &set_label("last_loop");
+
+       &ld($a0,&QWPw(0,$ap));  # get a
+       &ld($b0,&QWPw(0,$bp));  # get b
+
+       &add($a0,$b0,$o0); 
+       &cmpult($o0,$b0,$t0);   # will we borrow?
+       &add($o0,$cc,$o0);      # will we borrow?
+       &cmpult($o0,$cc,$cc);   # will we borrow?
+       &add($cc,$t0,$cc);      # add the borrows
+       &st($o0,&QWPw(0,$rp));  # save
+
+       &add($ap,$QWS,$ap);
+       &add($bp,$QWS,$bp);
+       &add($rp,$QWS,$rp);
+       &sub($count,1,$count);
+       &bgt($count,&label("last_loop"));
+       &function_end_A($name);
+
+######################################################
+       &set_label("finish");
+       &add($count,4,$count);
+       &bgt($count,&label("last_loop"));
+
+       &FR($o0,$t0,$a0,$b0);
+       &set_label("end");
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha.works/div.pl b/crypto/bn/asm/alpha.works/div.pl
new file mode 100644 (file)
index 0000000..7ec1443
--- /dev/null
@@ -0,0 +1,144 @@
+#!/usr/local/bin/perl
+
+sub bn_div64
+       {
+       local($data)=<<'EOF';
+ #
+ # What follows was taken directly from the C compiler with a few
+ # hacks to redo the lables.
+ #
+.text
+        .set noreorder
+       .set volatile
+       .align 3
+       .globl bn_div64
+       .ent bn_div64
+bn_div64:
+       ldgp $29,0($27)
+bn_div64..ng:
+       lda $30,-48($30)
+       .frame $30,48,$26,0
+       stq $26,0($30)
+       stq $9,8($30)
+       stq $10,16($30)
+       stq $11,24($30)
+       stq $12,32($30)
+       stq $13,40($30)
+       .mask 0x4003e00,-48
+       .prologue 1
+       bis $16,$16,$9
+       bis $17,$17,$10
+       bis $18,$18,$11
+       bis $31,$31,$13
+       bis $31,2,$12
+       bne $11,$9119
+       lda $0,-1
+       br $31,$9136
+       .align 4
+$9119:
+       bis $11,$11,$16
+       jsr $26,BN_num_bits_word
+       ldgp $29,0($26)
+       subq $0,64,$1
+       beq $1,$9120
+       bis $31,1,$1
+       sll $1,$0,$1
+       cmpule $9,$1,$1
+       bne $1,$9120
+ #     lda $16,_IO_stderr_
+ #     lda $17,$C32
+ #     bis $0,$0,$18
+ #     jsr $26,fprintf
+ #     ldgp $29,0($26)
+       jsr $26,abort
+       ldgp $29,0($26)
+       .align 4
+$9120:
+       bis $31,64,$3
+       cmpult $9,$11,$2
+       subq $3,$0,$1
+       addl $1,$31,$0
+       subq $9,$11,$1
+       cmoveq $2,$1,$9
+       beq $0,$9122
+       zapnot $0,15,$2
+       subq $3,$0,$1
+       sll $11,$2,$11
+       sll $9,$2,$3
+       srl $10,$1,$1
+       sll $10,$2,$10
+       bis $3,$1,$9
+$9122:
+       srl $11,32,$5
+       zapnot $11,15,$6
+       lda $7,-1
+       .align 5
+$9123:
+       srl $9,32,$1
+       subq $1,$5,$1
+       bne $1,$9126
+       zapnot $7,15,$27
+       br $31,$9127
+       .align 4
+$9126:
+       bis $9,$9,$24
+       bis $5,$5,$25
+       divqu $24,$25,$27
+$9127:
+       srl $10,32,$4
+       .align 5
+$9128:
+       mulq $27,$5,$1
+       subq $9,$1,$3
+       zapnot $3,240,$1
+       bne $1,$9129
+       mulq $6,$27,$2
+       sll $3,32,$1
+       addq $1,$4,$1
+       cmpule $2,$1,$2
+       bne $2,$9129
+       subq $27,1,$27
+       br $31,$9128
+       .align 4
+$9129:
+       mulq $27,$6,$1
+       mulq $27,$5,$4
+       srl $1,32,$3
+       sll $1,32,$1
+       addq $4,$3,$4
+       cmpult $10,$1,$2
+       subq $10,$1,$10
+       addq $2,$4,$2
+       cmpult $9,$2,$1
+       bis $2,$2,$4
+       beq $1,$9134
+       addq $9,$11,$9
+       subq $27,1,$27
+$9134:
+       subl $12,1,$12
+       subq $9,$4,$9
+       beq $12,$9124
+       sll $27,32,$13
+       sll $9,32,$2
+       srl $10,32,$1
+       sll $10,32,$10
+       bis $2,$1,$9
+       br $31,$9123
+       .align 4
+$9124:
+       bis $13,$27,$0
+$9136:
+       ldq $26,0($30)
+       ldq $9,8($30)
+       ldq $10,16($30)
+       ldq $11,24($30)
+       ldq $12,32($30)
+       ldq $13,40($30)
+       addq $30,48,$30
+       ret $31,($26),1
+       .end bn_div64
+EOF
+       &asm_add($data);
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha.works/mul.pl b/crypto/bn/asm/alpha.works/mul.pl
new file mode 100644 (file)
index 0000000..b182bae
--- /dev/null
@@ -0,0 +1,116 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub bn_mul_words
+       {
+       local($name)=@_;
+       local($cc,$a,$b,$r,$couny);
+
+       &init_pool(4);
+       ($cc)=GR("r0");
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $count=&wparam(2);
+       $word=&wparam(3);
+
+       &function_begin($name,"");
+
+       &comment("");
+       &sub($count,4,$count);
+       &mov("zero",$cc);
+       &br(&label("finish"));
+       &blt($count,&label("finish"));
+
+       ($a0,$r0)=&NR(2);
+       &ld($a0,&QWPw(0,$ap));
+       &ld($r0,&QWPw(0,$rp));
+
+$a=<<'EOF';
+##########################################################
+       &set_label("loop");
+
+       ($a1)=&NR(1); &ld($a1,&QWPw(1,$ap));
+       ($b1)=&NR(1); &ld($b1,&QWPw(1,$bp));
+       ($a2)=&NR(1); &ld($a2,&QWPw(2,$ap));
+       ($b2)=&NR(1); &ld($b2,&QWPw(2,$bp));
+       ($a3)=&NR(1); &ld($a3,&QWPw(3,$ap));
+       ($b3)=&NR(1); &ld($b3,&QWPw(3,$bp));
+
+       ($o0,$t0)=&NR(2);
+       &add($a0,$b0,$o0); 
+       &cmpult($o0,$b0,$t0);
+       &add($o0,$cc,$o0);
+       &cmpult($o0,$cc,$cc);
+       &add($cc,$t0,$cc);      &FR($t0);
+
+       ($t1,$o1)=&NR(2);
+
+       &add($a1,$b1,$o1);      &FR($a1);
+       &cmpult($o1,$b1,$t1);   &FR($b1);
+       &add($o1,$cc,$o1);
+       &cmpult($o1,$cc,$cc);
+       &add($cc,$t1,$cc);      &FR($t1);
+
+       ($t2,$o2)=&NR(2);
+
+       &add($a2,$b2,$o2);      &FR($a2);
+       &cmpult($o2,$b2,$t2);   &FR($b2);
+       &add($o2,$cc,$o2);
+       &cmpult($o2,$cc,$cc);
+       &add($cc,$t2,$cc);      &FR($t2);
+
+       ($t3,$o3)=&NR(2);
+
+       &add($a3,$b3,$o3);      &FR($a3);
+       &cmpult($o3,$b3,$t3);   &FR($b3);
+       &add($o3,$cc,$o3);
+       &cmpult($o3,$cc,$cc);
+       &add($cc,$t3,$cc);      &FR($t3);
+
+       &st($o0,&QWPw(0,$rp)); &FR($o0);
+       &st($o1,&QWPw(0,$rp)); &FR($o1);
+       &st($o2,&QWPw(0,$rp)); &FR($o2);
+       &st($o3,&QWPw(0,$rp)); &FR($o3);
+
+       &sub($count,4,$count);  # count-=4
+       &add($ap,4*$QWS,$ap);   # count+=4
+       &add($bp,4*$QWS,$bp);   # count+=4
+       &add($rp,4*$QWS,$rp);   # count+=4
+
+       &blt($count,&label("finish"));
+       &ld($a0,&QWPw(0,$ap));
+        &ld($b0,&QWPw(0,$bp));
+       &br(&label("loop"));
+EOF
+##################################################
+       # Do the last 0..3 words
+
+       &set_label("last_loop");
+
+       &ld(($a0)=&NR(1),&QWPw(0,$ap)); # get a
+       &mul($a0,$word,($l0)=&NR(1));
+        &add($ap,$QWS,$ap);
+       &muh($a0,$word,($h0)=&NR(1));   &FR($a0);
+       &add($l0,$cc,$l0);
+        &add($rp,$QWS,$rp);
+        &sub($count,1,$count);
+       &cmpult($l0,$cc,$cc);
+       &st($l0,&QWPw(-1,$rp));         &FR($l0);
+       &add($h0,$cc,$cc);              &FR($h0);
+
+       &bgt($count,&label("last_loop"));
+       &function_end_A($name);
+
+######################################################
+       &set_label("finish");
+       &add($count,4,$count);
+       &bgt($count,&label("last_loop"));
+
+       &set_label("end");
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha.works/mul_add.pl b/crypto/bn/asm/alpha.works/mul_add.pl
new file mode 100644 (file)
index 0000000..e37f631
--- /dev/null
@@ -0,0 +1,120 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub bn_mul_add_words
+       {
+       local($name)=@_;
+       local($cc,$a,$b,$r,$couny);
+
+       &init_pool(4);
+       ($cc)=GR("r0");
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $count=&wparam(2);
+       $word=&wparam(3);
+
+       &function_begin($name,"");
+
+       &comment("");
+       &sub($count,4,$count);
+       &mov("zero",$cc);
+       &br(&label("finish"));
+       &blt($count,&label("finish"));
+
+       ($a0,$r0)=&NR(2);
+       &ld($a0,&QWPw(0,$ap));
+       &ld($r0,&QWPw(0,$rp));
+
+$a=<<'EOF';
+##########################################################
+       &set_label("loop");
+
+       ($a1)=&NR(1); &ld($a1,&QWPw(1,$ap));
+       ($b1)=&NR(1); &ld($b1,&QWPw(1,$bp));
+       ($a2)=&NR(1); &ld($a2,&QWPw(2,$ap));
+       ($b2)=&NR(1); &ld($b2,&QWPw(2,$bp));
+       ($a3)=&NR(1); &ld($a3,&QWPw(3,$ap));
+       ($b3)=&NR(1); &ld($b3,&QWPw(3,$bp));
+
+       ($o0,$t0)=&NR(2);
+       &add($a0,$b0,$o0); 
+       &cmpult($o0,$b0,$t0);
+       &add($o0,$cc,$o0);
+       &cmpult($o0,$cc,$cc);
+       &add($cc,$t0,$cc);      &FR($t0);
+
+       ($t1,$o1)=&NR(2);
+
+       &add($a1,$b1,$o1);      &FR($a1);
+       &cmpult($o1,$b1,$t1);   &FR($b1);
+       &add($o1,$cc,$o1);
+       &cmpult($o1,$cc,$cc);
+       &add($cc,$t1,$cc);      &FR($t1);
+
+       ($t2,$o2)=&NR(2);
+
+       &add($a2,$b2,$o2);      &FR($a2);
+       &cmpult($o2,$b2,$t2);   &FR($b2);
+       &add($o2,$cc,$o2);
+       &cmpult($o2,$cc,$cc);
+       &add($cc,$t2,$cc);      &FR($t2);
+
+       ($t3,$o3)=&NR(2);
+
+       &add($a3,$b3,$o3);      &FR($a3);
+       &cmpult($o3,$b3,$t3);   &FR($b3);
+       &add($o3,$cc,$o3);
+       &cmpult($o3,$cc,$cc);
+       &add($cc,$t3,$cc);      &FR($t3);
+
+       &st($o0,&QWPw(0,$rp)); &FR($o0);
+       &st($o1,&QWPw(0,$rp)); &FR($o1);
+       &st($o2,&QWPw(0,$rp)); &FR($o2);
+       &st($o3,&QWPw(0,$rp)); &FR($o3);
+
+       &sub($count,4,$count);  # count-=4
+       &add($ap,4*$QWS,$ap);   # count+=4
+       &add($bp,4*$QWS,$bp);   # count+=4
+       &add($rp,4*$QWS,$rp);   # count+=4
+
+       &blt($count,&label("finish"));
+       &ld($a0,&QWPw(0,$ap));
+        &ld($b0,&QWPw(0,$bp));
+       &br(&label("loop"));
+EOF
+##################################################
+       # Do the last 0..3 words
+
+       &set_label("last_loop");
+
+       &ld(($a0)=&NR(1),&QWPw(0,$ap)); # get a
+       &ld(($r0)=&NR(1),&QWPw(0,$rp)); # get b
+       &mul($a0,$word,($l0)=&NR(1));
+        &sub($count,1,$count);
+        &add($ap,$QWS,$ap);
+       &muh($a0,$word,($h0)=&NR(1));   &FR($a0);
+       &add($r0,$l0,$r0);
+        &add($rp,$QWS,$rp);
+       &cmpult($r0,$l0,($t0)=&NR(1));  &FR($l0);
+        &add($r0,$cc,$r0);
+       &add($h0,$t0,$h0);              &FR($t0);
+        &cmpult($r0,$cc,$cc);
+       &st($r0,&QWPw(-1,$rp));         &FR($r0);
+        &add($h0,$cc,$cc);             &FR($h0);
+
+       &bgt($count,&label("last_loop"));
+       &function_end_A($name);
+
+######################################################
+       &set_label("finish");
+       &add($count,4,$count);
+       &bgt($count,&label("last_loop"));
+
+       &set_label("end");
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha.works/mul_c4.pl b/crypto/bn/asm/alpha.works/mul_c4.pl
new file mode 100644 (file)
index 0000000..5efd201
--- /dev/null
@@ -0,0 +1,213 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub mul_add_c
+       {
+       local($a,$b,$c0,$c1,$c2)=@_;
+       local($l1,$h1,$t1,$t2);
+
+       &mul($a,$b,($l1)=&NR(1));
+       &muh($a,$b,($h1)=&NR(1));
+       &add($c0,$l1,$c0);
+       &cmpult($c0,$l1,($t1)=&NR(1));  &FR($l1);
+       &add($t1,$h1,$h1);              &FR($t1);
+       &add($c1,$h1,$c1);
+       &cmpult($c1,$h1,($t2)=&NR(1));  &FR($h1);
+       &add($c2,$t2,$c2);              &FR($t2);
+       }
+
+sub bn_mul_comba4
+       {
+       local($name)=@_;
+       local(@a,@b,$r,$c0,$c1,$c2);
+
+       $cnt=1;
+       &init_pool(3);
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $bp=&wparam(2);
+
+       &function_begin($name,"");
+
+       &comment("");
+
+       &ld(($a[0])=&NR(1),&QWPw(0,$ap));
+       &ld(($b[0])=&NR(1),&QWPw(0,$bp));
+       &ld(($a[1])=&NR(1),&QWPw(1,$ap));
+       &ld(($b[1])=&NR(1),&QWPw(1,$bp));
+       &mul($a[0],$b[0],($r00)=&NR(1));
+       &ld(($a[2])=&NR(1),&QWPw(2,$ap));
+       &ld(($b[2])=&NR(1),&QWPw(2,$bp));
+       &muh($a[0],$b[0],($r01)=&NR(1));
+       &FR($ap); &ld(($a[3])=&NR(1),&QWPw(3,$ap));
+       &FR($bp); &ld(($b[3])=&NR(1),&QWPw(3,$bp));
+       &mul($a[0],$b[1],($r02)=&NR(1));
+
+       ($R,$H1,$H2)=&NR(3);
+
+       &st($r00,&QWPw(0,$rp)); &FR($r00);
+
+       &mov("zero",$R);
+       &mul($a[1],$b[0],($r03)=&NR(1));
+
+       &mov("zero",$H1);
+       &mov("zero",$H0);
+        &add($R,$r01,$R);
+       &muh($a[0],$b[1],($r04)=&NR(1));
+        &cmpult($R,$r01,($t01)=&NR(1));        &FR($r01);
+        &add($R,$r02,$R);
+        &add($H1,$t01,$H1)                     &FR($t01);
+       &muh($a[1],$b[0],($r05)=&NR(1));
+        &cmpult($R,$r02,($t02)=&NR(1));        &FR($r02);
+        &add($R,$r03,$R);
+        &add($H2,$t02,$H2)                     &FR($t02);
+       &mul($a[0],$b[2],($r06)=&NR(1));
+        &cmpult($R,$r03,($t03)=&NR(1));        &FR($r03);
+        &add($H1,$t03,$H1)                     &FR($t03);
+       &st($R,&QWPw(1,$rp));
+       &add($H1,$H2,$R);
+
+       &mov("zero",$H1);
+        &add($R,$r04,$R);
+       &mov("zero",$H2);
+       &mul($a[1],$b[1],($r07)=&NR(1));
+        &cmpult($R,$r04,($t04)=&NR(1));        &FR($r04);
+        &add($R,$r05,$R);
+        &add($H1,$t04,$H1)                     &FR($t04);
+       &mul($a[2],$b[0],($r08)=&NR(1));
+        &cmpult($R,$r05,($t05)=&NR(1));        &FR($r05);
+        &add($R,$r01,$R);
+        &add($H2,$t05,$H2)                     &FR($t05);
+       &muh($a[0],$b[2],($r09)=&NR(1));
+        &cmpult($R,$r06,($t06)=&NR(1));        &FR($r06);
+        &add($R,$r07,$R);
+        &add($H1,$t06,$H1)                     &FR($t06);
+       &muh($a[1],$b[1],($r10)=&NR(1));
+        &cmpult($R,$r07,($t07)=&NR(1));        &FR($r07);
+        &add($R,$r08,$R);
+        &add($H2,$t07,$H2)                     &FR($t07);
+       &muh($a[2],$b[0],($r11)=&NR(1));
+        &cmpult($R,$r08,($t08)=&NR(1));        &FR($r08);
+        &add($H1,$t08,$H1)                     &FR($t08);
+       &st($R,&QWPw(2,$rp));
+       &add($H1,$H2,$R);
+
+       &mov("zero",$H1);
+        &add($R,$r09,$R);
+       &mov("zero",$H2);
+       &mul($a[0],$b[3],($r12)=&NR(1));
+        &cmpult($R,$r09,($t09)=&NR(1));        &FR($r09);
+        &add($R,$r10,$R);
+        &add($H1,$t09,$H1)                     &FR($t09);
+       &mul($a[1],$b[2],($r13)=&NR(1));
+        &cmpult($R,$r10,($t10)=&NR(1));        &FR($r10);
+        &add($R,$r11,$R);
+        &add($H1,$t10,$H1)                     &FR($t10);
+       &mul($a[2],$b[1],($r14)=&NR(1));
+        &cmpult($R,$r11,($t11)=&NR(1));        &FR($r11);
+        &add($R,$r12,$R);
+        &add($H1,$t11,$H1)                     &FR($t11);
+       &mul($a[3],$b[0],($r15)=&NR(1));
+        &cmpult($R,$r12,($t12)=&NR(1));        &FR($r12);
+        &add($R,$r13,$R);
+        &add($H1,$t12,$H1)                     &FR($t12);
+       &muh($a[0],$b[3],($r16)=&NR(1));
+        &cmpult($R,$r13,($t13)=&NR(1));        &FR($r13);
+        &add($R,$r14,$R);
+        &add($H1,$t13,$H1)                     &FR($t13);
+       &muh($a[1],$b[2],($r17)=&NR(1));
+        &cmpult($R,$r14,($t14)=&NR(1));        &FR($r14);
+        &add($R,$r15,$R);
+        &add($H1,$t14,$H1)                     &FR($t14);
+       &muh($a[2],$b[1],($r18)=&NR(1));
+        &cmpult($R,$r15,($t15)=&NR(1));        &FR($r15);
+        &add($H1,$t15,$H1)                     &FR($t15);
+       &st($R,&QWPw(3,$rp));
+       &add($H1,$H2,$R);
+
+       &mov("zero",$H1);
+        &add($R,$r16,$R);
+       &mov("zero",$H2);
+       &muh($a[3],$b[0],($r19)=&NR(1));
+        &cmpult($R,$r16,($t16)=&NR(1));        &FR($r16);
+        &add($R,$r17,$R);
+        &add($H1,$t16,$H1)                     &FR($t16);
+       &mul($a[1],$b[3],($r20)=&NR(1));
+        &cmpult($R,$r17,($t17)=&NR(1));        &FR($r17);
+        &add($R,$r18,$R);
+        &add($H1,$t17,$H1)                     &FR($t17);
+       &mul($a[2],$b[2],($r21)=&NR(1));
+        &cmpult($R,$r18,($t18)=&NR(1));        &FR($r18);
+        &add($R,$r19,$R);
+        &add($H1,$t18,$H1)                     &FR($t18);
+       &mul($a[3],$b[1],($r22)=&NR(1));
+        &cmpult($R,$r19,($t19)=&NR(1));        &FR($r19);
+        &add($R,$r20,$R);
+        &add($H1,$t19,$H1)                     &FR($t19);
+       &muh($a[1],$b[3],($r23)=&NR(1));
+        &cmpult($R,$r20,($t20)=&NR(1));        &FR($r20);
+        &add($R,$r21,$R);
+        &add($H1,$t20,$H1)                     &FR($t20);
+       &muh($a[2],$b[2],($r24)=&NR(1));
+        &cmpult($R,$r21,($t21)=&NR(1));        &FR($r21);
+        &add($R,$r22,$R);
+        &add($H1,$t21,$H1)                     &FR($t21);
+       &muh($a[3],$b[1],($r25)=&NR(1));
+        &cmpult($R,$r22,($t22)=&NR(1));        &FR($r22);
+        &add($H1,$t22,$H1)                     &FR($t22);
+       &st($R,&QWPw(4,$rp));
+       &add($H1,$H2,$R);
+
+       &mov("zero",$H1);
+        &add($R,$r23,$R);
+       &mov("zero",$H2);
+       &mul($a[2],$b[3],($r26)=&NR(1));
+        &cmpult($R,$r23,($t23)=&NR(1));        &FR($r23);
+        &add($R,$r24,$R);
+        &add($H1,$t23,$H1)                     &FR($t23);
+       &mul($a[3],$b[2],($r27)=&NR(1));
+        &cmpult($R,$r24,($t24)=&NR(1));        &FR($r24);
+        &add($R,$r25,$R);
+        &add($H1,$t24,$H1)                     &FR($t24);
+       &muh($a[2],$b[3],($r28)=&NR(1));
+        &cmpult($R,$r25,($t25)=&NR(1));        &FR($r25);
+        &add($R,$r26,$R);
+        &add($H1,$t25,$H1)                     &FR($t25);
+       &muh($a[3],$b[2],($r29)=&NR(1));
+        &cmpult($R,$r26,($t26)=&NR(1));        &FR($r26);
+        &add($R,$r27,$R);
+        &add($H1,$t26,$H1)                     &FR($t26);
+       &mul($a[3],$b[3],($r30)=&NR(1));
+        &cmpult($R,$r27,($t27)=&NR(1));        &FR($r27);
+        &add($H1,$t27,$H1)                     &FR($t27);
+       &st($R,&QWPw(5,$rp));
+       &add($H1,$H2,$R);
+
+       &mov("zero",$H1);
+        &add($R,$r28,$R);
+       &mov("zero",$H2);
+       &muh($a[3],$b[3],($r31)=&NR(1));
+        &cmpult($R,$r28,($t28)=&NR(1));        &FR($r28);
+        &add($R,$r29,$R);
+        &add($H1,$t28,$H1)                     &FR($t28);
+       ############
+        &cmpult($R,$r29,($t29)=&NR(1));        &FR($r29);
+        &add($R,$r30,$R);
+        &add($H1,$t29,$H1)                     &FR($t29);
+        ############
+        &cmpult($R,$r30,($t30)=&NR(1));        &FR($r30);
+        &add($H1,$t30,$H1)                     &FR($t30);
+       &st($R,&QWPw(6,$rp));
+       &add($H1,$H2,$R);
+
+        &add($R,$r31,$R);                      &FR($r31);
+       &st($R,&QWPw(7,$rp));
+
+       &FR($R,$H1,$H2);
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha.works/mul_c4.works.pl b/crypto/bn/asm/alpha.works/mul_c4.works.pl
new file mode 100644 (file)
index 0000000..79d86dd
--- /dev/null
@@ -0,0 +1,98 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub mul_add_c
+       {
+       local($a,$b,$c0,$c1,$c2)=@_;
+       local($l1,$h1,$t1,$t2);
+
+print STDERR "count=$cnt\n"; $cnt++;
+       &mul($a,$b,($l1)=&NR(1));
+       &muh($a,$b,($h1)=&NR(1));
+       &add($c0,$l1,$c0);
+       &cmpult($c0,$l1,($t1)=&NR(1));  &FR($l1);
+       &add($t1,$h1,$h1);              &FR($t1);
+       &add($c1,$h1,$c1);
+       &cmpult($c1,$h1,($t2)=&NR(1));  &FR($h1);
+       &add($c2,$t2,$c2);              &FR($t2);
+       }
+
+sub bn_mul_comba4
+       {
+       local($name)=@_;
+       local(@a,@b,$r,$c0,$c1,$c2);
+
+       $cnt=1;
+       &init_pool(3);
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $bp=&wparam(2);
+
+       &function_begin($name,"");
+
+       &comment("");
+
+       &ld(($a[0])=&NR(1),&QWPw(0,$ap));
+       &ld(($b[0])=&NR(1),&QWPw(0,$bp));
+       &ld(($a[1])=&NR(1),&QWPw(1,$ap));
+       &ld(($b[1])=&NR(1),&QWPw(1,$bp));
+       &ld(($a[2])=&NR(1),&QWPw(2,$ap));
+       &ld(($b[2])=&NR(1),&QWPw(2,$bp));
+       &ld(($a[3])=&NR(1),&QWPw(3,$ap));       &FR($ap);
+       &ld(($b[3])=&NR(1),&QWPw(3,$bp));       &FR($bp);
+
+       ($c0,$c1,$c2)=&NR(3);
+       &mov("zero",$c2);
+       &mul($a[0],$b[0],$c0);
+       &muh($a[0],$b[0],$c1);
+       &st($c0,&QWPw(0,$rp));                  &FR($c0); ($c0)=&NR($c0);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(1,$rp));                  &FR($c0); ($c0)=&NR($c0);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[1],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[0],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(2,$rp));                  &FR($c0); ($c0)=&NR($c0);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[3],$c0,$c1,$c2);    &FR($a[0]);
+       &mul_add_c($a[1],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[0],$c0,$c1,$c2);    &FR($b[0]);
+       &st($c0,&QWPw(3,$rp));                  &FR($c0); ($c0)=&NR($c0);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[1],$b[3],$c0,$c1,$c2);    &FR($a[1]);
+       &mul_add_c($a[2],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[1],$c0,$c1,$c2);    &FR($b[1]);
+       &st($c0,&QWPw(4,$rp));                  &FR($c0); ($c0)=&NR($c0);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[2],$b[3],$c0,$c1,$c2);    &FR($a[2]);
+       &mul_add_c($a[3],$b[2],$c0,$c1,$c2);    &FR($b[2]);
+       &st($c0,&QWPw(5,$rp));                  &FR($c0); ($c0)=&NR($c0);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[3],$b[3],$c0,$c1,$c2);    &FR($a[3],$b[3]);
+       &st($c0,&QWPw(6,$rp));
+       &st($c1,&QWPw(7,$rp));
+
+       &FR($c0,$c1,$c2);
+
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha.works/mul_c8.pl b/crypto/bn/asm/alpha.works/mul_c8.pl
new file mode 100644 (file)
index 0000000..525ca74
--- /dev/null
@@ -0,0 +1,177 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub bn_mul_comba8
+       {
+       local($name)=@_;
+       local(@a,@b,$r,$c0,$c1,$c2);
+
+       $cnt=1;
+       &init_pool(3);
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $bp=&wparam(2);
+
+       &function_begin($name,"");
+
+       &comment("");
+
+       &stack_push(2);
+       &ld(($a[0])=&NR(1),&QWPw(0,$ap));
+       &ld(($b[0])=&NR(1),&QWPw(0,$bp));
+       &st($reg_s0,&swtmp(0)); &FR($reg_s0);
+       &st($reg_s1,&swtmp(1)); &FR($reg_s1);
+       &ld(($a[1])=&NR(1),&QWPw(1,$ap));
+       &ld(($b[1])=&NR(1),&QWPw(1,$bp));
+       &ld(($a[2])=&NR(1),&QWPw(2,$ap));
+       &ld(($b[2])=&NR(1),&QWPw(2,$bp));
+       &ld(($a[3])=&NR(1),&QWPw(3,$ap));
+       &ld(($b[3])=&NR(1),&QWPw(3,$bp));
+       &ld(($a[4])=&NR(1),&QWPw(1,$ap));
+       &ld(($b[4])=&NR(1),&QWPw(1,$bp));
+       &ld(($a[5])=&NR(1),&QWPw(1,$ap));
+       &ld(($b[5])=&NR(1),&QWPw(1,$bp));
+       &ld(($a[6])=&NR(1),&QWPw(1,$ap));
+       &ld(($b[6])=&NR(1),&QWPw(1,$bp));
+       &ld(($a[7])=&NR(1),&QWPw(1,$ap));       &FR($ap);
+       &ld(($b[7])=&NR(1),&QWPw(1,$bp));       &FR($bp);
+
+       ($c0,$c1,$c2)=&NR(3);
+       &mov("zero",$c2);
+       &mul($a[0],$b[0],$c0);
+       &muh($a[0],$b[0],$c1);
+       &st($c0,&QWPw(0,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(1,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(2,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(3,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[4],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(4,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[4],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[5],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(5,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[4],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[5],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[6],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(6,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[7],$c0,$c1,$c2);    &FR($a[0]);
+       &mul_add_c($a[1],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[4],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[5],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[6],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[7],$b[0],$c0,$c1,$c2);    &FR($b[0]);
+       &st($c0,&QWPw(7,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[1],$b[7],$c0,$c1,$c2);    &FR($a[1]);
+       &mul_add_c($a[2],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[4],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[5],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[6],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[7],$b[1],$c0,$c1,$c2);    &FR($b[1]);
+       &st($c0,&QWPw(8,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[2],$b[7],$c0,$c1,$c2);    &FR($a[2]);
+       &mul_add_c($a[3],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[4],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[5],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[6],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[7],$b[2],$c0,$c1,$c2);    &FR($b[2]);
+       &st($c0,&QWPw(9,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[3],$b[7],$c0,$c1,$c2);    &FR($a[3]);
+       &mul_add_c($a[4],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[5],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[6],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[7],$b[3],$c0,$c1,$c2);    &FR($b[3]);
+       &st($c0,&QWPw(10,$rp));                 &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[4],$b[7],$c0,$c1,$c2);    &FR($a[4]);
+       &mul_add_c($a[5],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[6],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[7],$b[4],$c0,$c1,$c2);    &FR($b[4]);
+       &st($c0,&QWPw(11,$rp));                 &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[5],$b[7],$c0,$c1,$c2);    &FR($a[5]);
+       &mul_add_c($a[6],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[7],$b[5],$c0,$c1,$c2);    &FR($b[5]);
+       &st($c0,&QWPw(12,$rp));                 &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[6],$b[7],$c0,$c1,$c2);    &FR($a[6]);
+       &mul_add_c($a[7],$b[6],$c0,$c1,$c2);    &FR($b[6]);
+       &st($c0,&QWPw(13,$rp));                 &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[7],$b[7],$c0,$c1,$c2);    &FR($a[7],$b[7]);
+       &st($c0,&QWPw(14,$rp));
+       &st($c1,&QWPw(15,$rp));
+
+       &FR($c0,$c1,$c2);
+
+       &ld($reg_s0,&swtmp(0));
+       &ld($reg_s1,&swtmp(1));
+       &stack_pop(2);
+
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha.works/sqr.pl b/crypto/bn/asm/alpha.works/sqr.pl
new file mode 100644 (file)
index 0000000..a55b696
--- /dev/null
@@ -0,0 +1,113 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub bn_sqr_words
+       {
+       local($name)=@_;
+       local($cc,$a,$b,$r,$couny);
+
+       &init_pool(3);
+       ($cc)=GR("r0");
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $count=&wparam(2);
+
+       &function_begin($name,"");
+
+       &comment("");
+       &sub($count,4,$count);
+       &mov("zero",$cc);
+       &br(&label("finish"));
+       &blt($count,&label("finish"));
+
+       ($a0,$r0)=&NR(2);
+       &ld($a0,&QWPw(0,$ap));
+       &ld($r0,&QWPw(0,$rp));
+
+$a=<<'EOF';
+##########################################################
+       &set_label("loop");
+
+       ($a1)=&NR(1); &ld($a1,&QWPw(1,$ap));
+       ($b1)=&NR(1); &ld($b1,&QWPw(1,$bp));
+       ($a2)=&NR(1); &ld($a2,&QWPw(2,$ap));
+       ($b2)=&NR(1); &ld($b2,&QWPw(2,$bp));
+       ($a3)=&NR(1); &ld($a3,&QWPw(3,$ap));
+       ($b3)=&NR(1); &ld($b3,&QWPw(3,$bp));
+
+       ($o0,$t0)=&NR(2);
+       &add($a0,$b0,$o0); 
+       &cmpult($o0,$b0,$t0);
+       &add($o0,$cc,$o0);
+       &cmpult($o0,$cc,$cc);
+       &add($cc,$t0,$cc);      &FR($t0);
+
+       ($t1,$o1)=&NR(2);
+
+       &add($a1,$b1,$o1);      &FR($a1);
+       &cmpult($o1,$b1,$t1);   &FR($b1);
+       &add($o1,$cc,$o1);
+       &cmpult($o1,$cc,$cc);
+       &add($cc,$t1,$cc);      &FR($t1);
+
+       ($t2,$o2)=&NR(2);
+
+       &add($a2,$b2,$o2);      &FR($a2);
+       &cmpult($o2,$b2,$t2);   &FR($b2);
+       &add($o2,$cc,$o2);
+       &cmpult($o2,$cc,$cc);
+       &add($cc,$t2,$cc);      &FR($t2);
+
+       ($t3,$o3)=&NR(2);
+
+       &add($a3,$b3,$o3);      &FR($a3);
+       &cmpult($o3,$b3,$t3);   &FR($b3);
+       &add($o3,$cc,$o3);
+       &cmpult($o3,$cc,$cc);
+       &add($cc,$t3,$cc);      &FR($t3);
+
+       &st($o0,&QWPw(0,$rp)); &FR($o0);
+       &st($o1,&QWPw(0,$rp)); &FR($o1);
+       &st($o2,&QWPw(0,$rp)); &FR($o2);
+       &st($o3,&QWPw(0,$rp)); &FR($o3);
+
+       &sub($count,4,$count);  # count-=4
+       &add($ap,4*$QWS,$ap);   # count+=4
+       &add($bp,4*$QWS,$bp);   # count+=4
+       &add($rp,4*$QWS,$rp);   # count+=4
+
+       &blt($count,&label("finish"));
+       &ld($a0,&QWPw(0,$ap));
+        &ld($b0,&QWPw(0,$bp));
+       &br(&label("loop"));
+EOF
+##################################################
+       # Do the last 0..3 words
+
+       &set_label("last_loop");
+
+       &ld(($a0)=&NR(1),&QWPw(0,$ap)); # get a
+       &mul($a0,$a0,($l0)=&NR(1));
+        &add($ap,$QWS,$ap);
+        &add($rp,2*$QWS,$rp);
+        &sub($count,1,$count);
+       &muh($a0,$a0,($h0)=&NR(1));     &FR($a0);
+       &st($l0,&QWPw(-2,$rp));         &FR($l0);
+       &st($h0,&QWPw(-1,$rp));         &FR($h0);
+
+       &bgt($count,&label("last_loop"));
+       &function_end_A($name);
+
+######################################################
+       &set_label("finish");
+       &add($count,4,$count);
+       &bgt($count,&label("last_loop"));
+
+       &set_label("end");
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha.works/sqr_c4.pl b/crypto/bn/asm/alpha.works/sqr_c4.pl
new file mode 100644 (file)
index 0000000..bf33f5b
--- /dev/null
@@ -0,0 +1,109 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub sqr_add_c
+       {
+       local($a,$c0,$c1,$c2)=@_;
+       local($l1,$h1,$t1,$t2);
+
+       &mul($a,$a,($l1)=&NR(1));
+       &muh($a,$a,($h1)=&NR(1));
+       &add($c0,$l1,$c0);
+       &add($c1,$h1,$c1);
+       &cmpult($c0,$l1,($t1)=&NR(1));  &FR($l1);
+       &cmpult($c1,$h1,($t2)=&NR(1));  &FR($h1);
+       &add($c1,$t1,$c1);              &FR($t1);
+       &add($c2,$t2,$c2);              &FR($t2);
+       }
+
+sub sqr_add_c2
+       {
+       local($a,$b,$c0,$c1,$c2)=@_;
+       local($l1,$h1,$t1,$t2);
+
+       &mul($a,$b,($l1)=&NR(1));
+       &muh($a,$b,($h1)=&NR(1));
+       &cmplt($l1,"zero",($lc1)=&NR(1));
+       &cmplt($h1,"zero",($hc1)=&NR(1));
+       &add($l1,$l1,$l1);
+       &add($h1,$h1,$h1);
+       &add($h1,$lc1,$h1);             &FR($lc1);
+       &add($c2,$hc1,$c2);             &FR($hc1);
+
+       &add($c0,$l1,$c0);
+       &add($c1,$h1,$c1);
+       &cmpult($c0,$l1,($lc1)=&NR(1)); &FR($l1);
+       &cmpult($c1,$h1,($hc1)=&NR(1)); &FR($h1);
+
+       &add($c1,$lc1,$c1);             &FR($lc1);
+       &add($c2,$hc1,$c2);             &FR($hc1);
+       }
+
+
+sub bn_sqr_comba4
+       {
+       local($name)=@_;
+       local(@a,@b,$r,$c0,$c1,$c2);
+
+       $cnt=1;
+       &init_pool(2);
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+
+       &function_begin($name,"");
+
+       &comment("");
+
+       &ld(($a[0])=&NR(1),&QWPw(0,$ap));
+       &ld(($a[1])=&NR(1),&QWPw(1,$ap));
+       &ld(($a[2])=&NR(1),&QWPw(2,$ap));
+        &ld(($a[3])=&NR(1),&QWPw(3,$ap)); &FR($ap);
+
+       ($c0,$c1,$c2)=&NR(3);
+
+       &mov("zero",$c2);
+       &mul($a[0],$a[0],$c0);
+       &muh($a[0],$a[0],$c1);
+       &st($c0,&QWPw(0,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[0],$a[1],$c0,$c1,$c2);
+       &st($c0,&QWPw(1,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[2],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(2,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[3],$a[0],$c0,$c1,$c2);
+       &sqr_add_c2($a[2],$a[1],$c0,$c1,$c2);
+       &st($c0,&QWPw(3,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[2],$c0,$c1,$c2);
+       &sqr_add_c2($a[3],$a[1],$c0,$c1,$c2);
+       &st($c0,&QWPw(4,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[3],$a[2],$c0,$c1,$c2);
+       &st($c0,&QWPw(5,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[3],$c0,$c1,$c2);
+       &st($c0,&QWPw(6,$rp));
+       &st($c1,&QWPw(7,$rp));
+
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha.works/sqr_c8.pl b/crypto/bn/asm/alpha.works/sqr_c8.pl
new file mode 100644 (file)
index 0000000..b4afe08
--- /dev/null
@@ -0,0 +1,132 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub bn_sqr_comba8
+       {
+       local($name)=@_;
+       local(@a,@b,$r,$c0,$c1,$c2);
+
+       $cnt=1;
+       &init_pool(2);
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+
+       &function_begin($name,"");
+
+       &comment("");
+
+       &ld(($a[0])=&NR(1),&QWPw(0,$ap));
+       &ld(($a[1])=&NR(1),&QWPw(1,$ap));
+       &ld(($a[2])=&NR(1),&QWPw(2,$ap));
+       &ld(($a[3])=&NR(1),&QWPw(3,$ap));
+       &ld(($a[4])=&NR(1),&QWPw(4,$ap));
+       &ld(($a[5])=&NR(1),&QWPw(5,$ap));
+       &ld(($a[6])=&NR(1),&QWPw(6,$ap));
+        &ld(($a[7])=&NR(1),&QWPw(7,$ap)); &FR($ap);
+
+       ($c0,$c1,$c2)=&NR(3);
+
+       &mov("zero",$c2);
+       &mul($a[0],$a[0],$c0);
+       &muh($a[0],$a[0],$c1);
+       &st($c0,&QWPw(0,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[1],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(1,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[2],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(2,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[2],$a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[3],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(3,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[2],$c0,$c1,$c2);
+       &sqr_add_c2($a[3],$a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[4],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(4,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[3],$a[2],$c0,$c1,$c2);
+       &sqr_add_c2($a[4],$a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[5],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(5,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[3],$c0,$c1,$c2);
+       &sqr_add_c2($a[4],$a[2],$c0,$c1,$c2);
+       &sqr_add_c2($a[5],$a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[6],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(6,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[4],$a[3],$c0,$c1,$c2);
+       &sqr_add_c2($a[5],$a[2],$c0,$c1,$c2);
+       &sqr_add_c2($a[6],$a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[7],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(7,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[4],$c0,$c1,$c2);
+       &sqr_add_c2($a[5],$a[3],$c0,$c1,$c2);
+       &sqr_add_c2($a[6],$a[2],$c0,$c1,$c2);
+       &sqr_add_c2($a[7],$a[1],$c0,$c1,$c2);
+       &st($c0,&QWPw(8,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[5],$a[4],$c0,$c1,$c2);
+       &sqr_add_c2($a[6],$a[3],$c0,$c1,$c2);
+       &sqr_add_c2($a[7],$a[2],$c0,$c1,$c2);
+       &st($c0,&QWPw(9,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[5],$c0,$c1,$c2);
+       &sqr_add_c2($a[6],$a[4],$c0,$c1,$c2);
+       &sqr_add_c2($a[7],$a[3],$c0,$c1,$c2);
+       &st($c0,&QWPw(10,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[6],$a[5],$c0,$c1,$c2);
+       &sqr_add_c2($a[7],$a[4],$c0,$c1,$c2);
+       &st($c0,&QWPw(11,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[6],$c0,$c1,$c2);
+       &sqr_add_c2($a[7],$a[5],$c0,$c1,$c2);
+       &st($c0,&QWPw(12,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[7],$a[6],$c0,$c1,$c2);
+       &st($c0,&QWPw(13,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[7],$c0,$c1,$c2);
+       &st($c0,&QWPw(14,$rp));
+       &st($c1,&QWPw(15,$rp));
+
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha.works/sub.pl b/crypto/bn/asm/alpha.works/sub.pl
new file mode 100644 (file)
index 0000000..d998da5
--- /dev/null
@@ -0,0 +1,108 @@
+#!/usr/local/bin/perl
+# alpha assember
+
+sub bn_sub_words
+       {
+       local($name)=@_;
+       local($cc,$a,$b,$r);
+
+       &init_pool(4);
+       ($cc)=GR("r0");
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $bp=&wparam(2);
+       $count=&wparam(3);
+
+       &function_begin($name,"");
+
+       &comment("");
+       &sub($count,4,$count);
+       &mov("zero",$cc);
+       &blt($count,&label("finish"));
+
+       ($a0,$b0)=&NR(2);
+       &ld($a0,&QWPw(0,$ap));
+       &ld($b0,&QWPw(0,$bp));
+
+##########################################################
+       &set_label("loop");
+
+       ($a1,$tmp,$b1,$a2,$b2,$a3,$b3,$o0)=&NR(8);
+       &ld($a1,&QWPw(1,$ap));
+        &cmpult($a0,$b0,$tmp); # will we borrow?
+       &ld($b1,&QWPw(1,$bp));
+        &sub($a0,$b0,$a0);             # do the subtract
+       &ld($a2,&QWPw(2,$ap));
+        &cmpult($a0,$cc,$b0);  # will we borrow?
+       &ld($b2,&QWPw(2,$bp));
+        &sub($a0,$cc,$o0);     # will we borrow?
+       &ld($a3,&QWPw(3,$ap));
+        &add($b0,$tmp,$cc); ($t1,$o1)=&NR(2); &FR($tmp);
+
+       &cmpult($a1,$b1,$t1);   # will we borrow?
+        &sub($a1,$b1,$a1);     # do the subtract
+       &ld($b3,&QWPw(3,$bp));
+        &cmpult($a1,$cc,$b1);  # will we borrow?
+       &sub($a1,$cc,$o1);      # will we borrow?
+        &add($b1,$t1,$cc); ($tmp,$o2)=&NR(2); &FR($t1,$a1,$b1);
+       
+       &cmpult($a2,$b2,$tmp);  # will we borrow?
+        &sub($a2,$b2,$a2);             # do the subtract
+       &st($o0,&QWPw(0,$rp));  &FR($o0); # save
+        &cmpult($a2,$cc,$b2);  # will we borrow?
+       &sub($a2,$cc,$o2);      # will we borrow?
+        &add($b2,$tmp,$cc); ($t3,$o3)=&NR(2); &FR($tmp,$a2,$b2);
+
+       &cmpult($a3,$b3,$t3);   # will we borrow?
+        &sub($a3,$b3,$a3);     # do the subtract
+       &st($o1,&QWPw(1,$rp)); &FR($o1);
+        &cmpult($a3,$cc,$b3);  # will we borrow?
+       &sub($a3,$cc,$o3);      # will we borrow?
+        &add($b3,$t3,$cc); &FR($t3,$a3,$b3);
+
+       &st($o2,&QWPw(2,$rp));  &FR($o2);
+        &sub($count,4,$count); # count-=4
+       &st($o3,&QWPw(3,$rp));  &FR($o3);
+        &add($ap,4*$QWS,$ap);  # count+=4
+       &add($bp,4*$QWS,$bp);   # count+=4
+        &add($rp,4*$QWS,$rp);  # count+=4
+
+       &blt($count,&label("finish"));
+       &ld($a0,&QWPw(0,$ap));
+        &ld($b0,&QWPw(0,$bp));
+       &br(&label("loop"));
+##################################################
+       # Do the last 0..3 words
+
+       &set_label("last_loop");
+
+       &ld($a0,&QWPw(0,$ap));  # get a
+        &ld($b0,&QWPw(0,$bp)); # get b
+       &cmpult($a0,$b0,$tmp);  # will we borrow?
+       &sub($a0,$b0,$a0);      # do the subtract
+       &cmpult($a0,$cc,$b0);   # will we borrow?
+       &sub($a0,$cc,$a0);      # will we borrow?
+       &st($a0,&QWPw(0,$rp));  # save
+       &add($b0,$tmp,$cc);     # add the borrows
+
+       &add($ap,$QWS,$ap);
+       &add($bp,$QWS,$bp);
+       &add($rp,$QWS,$rp);
+       &sub($count,1,$count);
+       &bgt($count,&label("last_loop"));
+       &function_end_A($name);
+
+######################################################
+       &set_label("finish");
+       &add($count,4,$count);
+       &bgt($count,&label("last_loop"));
+
+       &FR($a0,$b0);
+       &set_label("end");
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha/add.pl b/crypto/bn/asm/alpha/add.pl
new file mode 100644 (file)
index 0000000..13bf516
--- /dev/null
@@ -0,0 +1,118 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub bn_add_words
+       {
+       local($name)=@_;
+       local($cc,$a,$b,$r);
+
+       &init_pool(4);
+       ($cc)=GR("r0");
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $bp=&wparam(2);
+       $count=&wparam(3);
+
+       &function_begin($name,"");
+
+       &comment("");
+       &sub($count,4,$count);
+        &mov("zero",$cc);
+       &blt($count,&label("finish"));
+
+       ($a0,$b0)=&NR(2);
+
+##########################################################
+       &set_label("loop");
+
+       &ld(($a0)=&NR(1),&QWPw(0,$ap));
+        &ld(($b0)=&NR(1),&QWPw(0,$bp));
+       &ld(($a1)=&NR(1),&QWPw(1,$ap));
+        &ld(($b1)=&NR(1),&QWPw(1,$bp));
+
+       ($o0,$t0)=&NR(2);
+       &add($a0,$b0,$o0); 
+        &ld(($a2)=&NR(1),&QWPw(2,$ap));
+       &cmpult($o0,$b0,$t0);
+        &add($o0,$cc,$o0);
+       &cmpult($o0,$cc,$cc);
+        &ld(($b2)=&NR(1),&QWPw(2,$bp));
+       &add($cc,$t0,$cc);      &FR($t0);
+
+       ($t1,$o1)=&NR(2);
+
+        &add($a1,$b1,$o1);     &FR($a1);
+       &cmpult($o1,$b1,$t1);   &FR($b1);
+        &add($o1,$cc,$o1);
+       &cmpult($o1,$cc,$cc);
+        &ld(($a3)=&NR(1),&QWPw(3,$ap));
+       &add($cc,$t1,$cc);      &FR($t1);
+
+       ($t2,$o2)=&NR(2);
+
+        &add($a2,$b2,$o2);     &FR($a2);
+       &cmpult($o2,$b2,$t2);   &FR($b2);
+        &add($o2,$cc,$o2);
+       &cmpult($o2,$cc,$cc);
+        &ld(($b3)=&NR(1),&QWPw(3,$bp));
+       &st($o0,&QWPw(0,$rp)); &FR($o0);
+        &add($cc,$t2,$cc);     &FR($t2);
+
+       ($t3,$o3)=&NR(2);
+
+       &st($o1,&QWPw(0,$rp)); &FR($o1);
+        &add($a3,$b3,$o3);     &FR($a3);
+       &cmpult($o3,$b3,$t3);   &FR($b3);
+        &add($o3,$cc,$o3);
+       &st($o2,&QWPw(0,$rp)); &FR($o2);
+        &cmpult($o3,$cc,$cc);
+       &st($o3,&QWPw(0,$rp)); &FR($o3);
+        &add($cc,$t3,$cc);     &FR($t3);
+
+
+       &sub($count,4,$count);  # count-=4
+        &add($ap,4*$QWS,$ap);  # count+=4
+       &add($bp,4*$QWS,$bp);   # count+=4
+        &add($rp,4*$QWS,$rp);  # count+=4
+
+       ###
+        &bge($count,&label("loop"));
+       ###
+       &br(&label("finish"));
+##################################################
+       # Do the last 0..3 words
+
+       ($t0,$o0)=&NR(2);
+       &set_label("last_loop");
+
+       &ld($a0,&QWPw(0,$ap));  # get a
+        &ld($b0,&QWPw(0,$bp)); # get b
+       &add($ap,$QWS,$ap);
+        &add($bp,$QWS,$bp);
+       &add($a0,$b0,$o0); 
+        &sub($count,1,$count);
+       &cmpult($o0,$b0,$t0);   # will we borrow?
+        &add($o0,$cc,$o0);     # will we borrow?
+       &cmpult($o0,$cc,$cc);   # will we borrow?
+        &add($rp,$QWS,$rp);
+       &st($o0,&QWPw(-1,$rp)); # save
+        &add($cc,$t0,$cc);     # add the borrows
+
+       ###
+        &bgt($count,&label("last_loop"));
+       &function_end_A($name);
+
+######################################################
+       &set_label("finish");
+       &add($count,4,$count);
+        &bgt($count,&label("last_loop"));
+
+       &FR($o0,$t0,$a0,$b0);
+       &set_label("end");
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha/div.pl b/crypto/bn/asm/alpha/div.pl
new file mode 100644 (file)
index 0000000..e9e6808
--- /dev/null
@@ -0,0 +1,144 @@
+#!/usr/local/bin/perl
+
+sub bn_div_words
+       {
+       local($data)=<<'EOF';
+ #
+ # What follows was taken directly from the C compiler with a few
+ # hacks to redo the lables.
+ #
+.text
+        .set noreorder
+       .set volatile
+       .align 3
+       .globl bn_div_words
+       .ent bn_div_words
+bn_div_words
+       ldgp $29,0($27)
+bn_div_words.ng:
+       lda $30,-48($30)
+       .frame $30,48,$26,0
+       stq $26,0($30)
+       stq $9,8($30)
+       stq $10,16($30)
+       stq $11,24($30)
+       stq $12,32($30)
+       stq $13,40($30)
+       .mask 0x4003e00,-48
+       .prologue 1
+       bis $16,$16,$9
+       bis $17,$17,$10
+       bis $18,$18,$11
+       bis $31,$31,$13
+       bis $31,2,$12
+       bne $11,$9119
+       lda $0,-1
+       br $31,$9136
+       .align 4
+$9119:
+       bis $11,$11,$16
+       jsr $26,BN_num_bits_word
+       ldgp $29,0($26)
+       subq $0,64,$1
+       beq $1,$9120
+       bis $31,1,$1
+       sll $1,$0,$1
+       cmpule $9,$1,$1
+       bne $1,$9120
+ #     lda $16,_IO_stderr_
+ #     lda $17,$C32
+ #     bis $0,$0,$18
+ #     jsr $26,fprintf
+ #     ldgp $29,0($26)
+       jsr $26,abort
+       ldgp $29,0($26)
+       .align 4
+$9120:
+       bis $31,64,$3
+       cmpult $9,$11,$2
+       subq $3,$0,$1
+       addl $1,$31,$0
+       subq $9,$11,$1
+       cmoveq $2,$1,$9
+       beq $0,$9122
+       zapnot $0,15,$2
+       subq $3,$0,$1
+       sll $11,$2,$11
+       sll $9,$2,$3
+       srl $10,$1,$1
+       sll $10,$2,$10
+       bis $3,$1,$9
+$9122:
+       srl $11,32,$5
+       zapnot $11,15,$6
+       lda $7,-1
+       .align 5
+$9123:
+       srl $9,32,$1
+       subq $1,$5,$1
+       bne $1,$9126
+       zapnot $7,15,$27
+       br $31,$9127
+       .align 4
+$9126:
+       bis $9,$9,$24
+       bis $5,$5,$25
+       divqu $24,$25,$27
+$9127:
+       srl $10,32,$4
+       .align 5
+$9128:
+       mulq $27,$5,$1
+       subq $9,$1,$3
+       zapnot $3,240,$1
+       bne $1,$9129
+       mulq $6,$27,$2
+       sll $3,32,$1
+       addq $1,$4,$1
+       cmpule $2,$1,$2
+       bne $2,$9129
+       subq $27,1,$27
+       br $31,$9128
+       .align 4
+$9129:
+       mulq $27,$6,$1
+       mulq $27,$5,$4
+       srl $1,32,$3
+       sll $1,32,$1
+       addq $4,$3,$4
+       cmpult $10,$1,$2
+       subq $10,$1,$10
+       addq $2,$4,$2
+       cmpult $9,$2,$1
+       bis $2,$2,$4
+       beq $1,$9134
+       addq $9,$11,$9
+       subq $27,1,$27
+$9134:
+       subl $12,1,$12
+       subq $9,$4,$9
+       beq $12,$9124
+       sll $27,32,$13
+       sll $9,32,$2
+       srl $10,32,$1
+       sll $10,32,$10
+       bis $2,$1,$9
+       br $31,$9123
+       .align 4
+$9124:
+       bis $13,$27,$0
+$9136:
+       ldq $26,0($30)
+       ldq $9,8($30)
+       ldq $10,16($30)
+       ldq $11,24($30)
+       ldq $12,32($30)
+       ldq $13,40($30)
+       addq $30,48,$30
+       ret $31,($26),1
+       .end bn_div_words
+EOF
+       &asm_add($data);
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha/mul.pl b/crypto/bn/asm/alpha/mul.pl
new file mode 100644 (file)
index 0000000..76c9265
--- /dev/null
@@ -0,0 +1,104 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub bn_mul_words
+       {
+       local($name)=@_;
+       local($cc,$a,$b,$r,$couny);
+
+       &init_pool(4);
+       ($cc)=GR("r0");
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $count=&wparam(2);
+       $word=&wparam(3);
+
+       &function_begin($name,"");
+
+       &comment("");
+       &sub($count,4,$count);
+        &mov("zero",$cc);
+       ###
+        &blt($count,&label("finish"));
+
+       ($a0)=&NR(1); &ld($a0,&QWPw(0,$ap));
+
+       &set_label("loop");
+
+       ($a1)=&NR(1); &ld($a1,&QWPw(1,$ap));
+        ($a2)=&NR(1); &ld($a2,&QWPw(2,$ap));
+
+       &muh($a0,$word,($h0)=&NR(1));   &FR($a0);
+        ($a3)=&NR(1); &ld($a3,&QWPw(3,$ap));
+                                                       ### wait 8
+       &mul($a0,$word,($l0)=&NR(1));   &FR($a0);
+                                                       ### wait 8
+       &muh($a1,$word,($h1)=&NR(1));   &FR($a1);
+        &add($l0,$cc,$l0);                             ### wait 8
+       &mul($a1,$word,($l1)=&NR(1));   &FR($a1);
+        &cmpult($l0,$cc,$cc);                          ### wait 8
+       &muh($a2,$word,($h2)=&NR(1));   &FR($a2);
+        &add($h0,$cc,$cc);     &FR($h0);               ### wait 8
+       &mul($a2,$word,($l2)=&NR(1));   &FR($a2);
+        &add($l1,$cc,$l1);                             ### wait 8
+       &st($l0,&QWPw(0,$rp));          &FR($l0);
+        &cmpult($l1,$cc,$cc);                          ### wait 8
+       &muh($a3,$word,($h3)=&NR(1));   &FR($a3);
+        &add($h1,$cc,$cc);             &FR($h1);
+       &mul($a3,$word,($l3)=&NR(1));   &FR($a3);
+        &add($l2,$cc,$l2);
+       &st($l1,&QWPw(1,$rp));          &FR($l1);
+        &cmpult($l2,$cc,$cc);
+       &add($h2,$cc,$cc);              &FR($h2);
+        &sub($count,4,$count); # count-=4
+       &st($l2,&QWPw(2,$rp));          &FR($l2);
+        &add($l3,$cc,$l3);
+       &cmpult($l3,$cc,$cc);
+        &add($bp,4*$QWS,$bp);  # count+=4
+       &add($h3,$cc,$cc);              &FR($h3);
+        &add($ap,4*$QWS,$ap);  # count+=4
+       &st($l3,&QWPw(3,$rp));          &FR($l3);
+        &add($rp,4*$QWS,$rp);  # count+=4
+       ###
+        &blt($count,&label("finish"));
+        ($a0)=&NR(1); &ld($a0,&QWPw(0,$ap));
+       &br(&label("finish"));
+##################################################
+
+##################################################
+       # Do the last 0..3 words
+
+       &set_label("last_loop");
+
+       &ld(($a0)=&NR(1),&QWPw(0,$ap)); # get a
+        ###
+       ###
+        ###
+       &muh($a0,$word,($h0)=&NR(1));
+        ### Wait 8 for next mul issue
+       &mul($a0,$word,($l0)=&NR(1)); &FR($a0)
+        &add($ap,$QWS,$ap);
+       ### Loose 12 until result is available
+       &add($rp,$QWS,$rp);
+        &sub($count,1,$count);
+       &add($l0,$cc,$l0);
+        ###
+       &st($l0,&QWPw(-1,$rp));         &FR($l0);
+        &cmpult($l0,$cc,$cc);
+       &add($h0,$cc,$cc);              &FR($h0);
+        &bgt($count,&label("last_loop"));
+       &function_end_A($name);
+
+######################################################
+       &set_label("finish");
+       &add($count,4,$count);
+       &bgt($count,&label("last_loop"));
+
+       &set_label("end");
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha/mul_add.pl b/crypto/bn/asm/alpha/mul_add.pl
new file mode 100644 (file)
index 0000000..0d6df69
--- /dev/null
@@ -0,0 +1,123 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub bn_mul_add_words
+       {
+       local($name)=@_;
+       local($cc,$a,$b,$r,$couny);
+
+       &init_pool(4);
+       ($cc)=GR("r0");
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $count=&wparam(2);
+       $word=&wparam(3);
+
+       &function_begin($name,"");
+
+       &comment("");
+       &sub($count,4,$count);
+        &mov("zero",$cc);
+       ###
+        &blt($count,&label("finish"));
+
+       &ld(($a0)=&NR(1),&QWPw(0,$ap));
+
+$a=<<'EOF';
+##########################################################
+       &set_label("loop");
+
+       &ld(($r0)=&NR(1),&QWPw(0,$rp));
+        &ld(($a1)=&NR(1),&QWPw(1,$ap));
+       &muh($a0,$word,($h0)=&NR(1));
+        &ld(($r1)=&NR(1),&QWPw(1,$rp));
+       &ld(($a2)=&NR(1),&QWPw(2,$ap));
+        ###
+       &mul($a0,$word,($l0)=&NR(1));   &FR($a0);
+        &ld(($r2)=&NR(1),&QWPw(2,$rp));
+       &muh($a1,$word,($h1)=&NR(1));
+        &ld(($a3)=&NR(1),&QWPw(3,$ap));
+       &mul($a1,$word,($l1)=&NR(1));   &FR($a1);
+        &ld(($r3)=&NR(1),&QWPw(3,$rp));
+       &add($r0,$l0,$r0);
+        &add($r1,$l1,$r1);
+       &cmpult($r0,$l0,($t0)=&NR(1));  &FR($l0);
+        &cmpult($r1,$l1,($t1)=&NR(1)); &FR($l1);
+       &muh($a2,$word,($h2)=&NR(1));
+        &add($r0,$cc,$r0);
+       &add($h0,$t0,$h0);              &FR($t0);
+        &cmpult($r0,$cc,$cc);
+       &add($h1,$t1,$h1);              &FR($t1);
+        &add($h0,$cc,$cc);             &FR($h0);
+       &mul($a2,$word,($l2)=&NR(1));   &FR($a2);
+        &add($r1,$cc,$r1);
+       &cmpult($r1,$cc,$cc);
+        &add($r2,$l2,$r2);
+       &add($h1,$cc,$cc);              &FR($h1);
+        &cmpult($r2,$l2,($t2)=&NR(1)); &FR($l2);
+       &muh($a3,$word,($h3)=&NR(1));
+        &add($r2,$cc,$r2);
+       &st($r0,&QWPw(0,$rp)); &FR($r0);
+        &add($h2,$t2,$h2);             &FR($t2);
+       &st($r1,&QWPw(1,$rp)); &FR($r1);
+        &cmpult($r2,$cc,$cc);
+       &mul($a3,$word,($l3)=&NR(1));   &FR($a3);
+        &add($h2,$cc,$cc);             &FR($h2);
+       &st($r2,&QWPw(2,$rp)); &FR($r2);
+        &sub($count,4,$count); # count-=4
+        &add($rp,4*$QWS,$rp);  # count+=4
+       &add($r3,$l3,$r3);
+        &add($ap,4*$QWS,$ap);  # count+=4
+       &cmpult($r3,$l3,($t3)=&NR(1));  &FR($l3);
+        &add($r3,$cc,$r3);
+       &add($h3,$t3,$h3);              &FR($t3);
+        &cmpult($r3,$cc,$cc);
+       &st($r3,&QWPw(-1,$rp)); &FR($r3);
+        &add($h3,$cc,$cc);             &FR($h3);
+
+       ###
+        &blt($count,&label("finish"));
+       &ld(($a0)=&NR(1),&QWPw(0,$ap));
+        &br(&label("loop"));
+EOF
+##################################################
+       # Do the last 0..3 words
+
+       &set_label("last_loop");
+
+       &ld(($a0)=&NR(1),&QWPw(0,$ap)); # get a
+        &ld(($r0)=&NR(1),&QWPw(0,$rp));        # get b
+       ###
+        ###
+       &muh($a0,$word,($h0)=&NR(1));   &FR($a0);
+        ### wait 8
+       &mul($a0,$word,($l0)=&NR(1));   &FR($a0);
+        &add($rp,$QWS,$rp);
+       &add($ap,$QWS,$ap);
+        &sub($count,1,$count);
+       ### wait 3 until l0 is available
+       &add($r0,$l0,$r0);
+        ###
+       &cmpult($r0,$l0,($t0)=&NR(1));  &FR($l0);
+        &add($r0,$cc,$r0);
+       &add($h0,$t0,$h0);              &FR($t0);
+        &cmpult($r0,$cc,$cc);
+       &add($h0,$cc,$cc);              &FR($h0);
+
+       &st($r0,&QWPw(-1,$rp));         &FR($r0);
+        &bgt($count,&label("last_loop"));
+       &function_end_A($name);
+
+######################################################
+       &set_label("finish");
+       &add($count,4,$count);
+        &bgt($count,&label("last_loop"));
+
+       &set_label("end");
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha/mul_c4.pl b/crypto/bn/asm/alpha/mul_c4.pl
new file mode 100644 (file)
index 0000000..9cc876d
--- /dev/null
@@ -0,0 +1,215 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+# upto
+
+sub mul_add_c
+       {
+       local($a,$b,$c0,$c1,$c2)=@_;
+       local($l1,$h1,$t1,$t2);
+
+       &mul($a,$b,($l1)=&NR(1));
+       &muh($a,$b,($h1)=&NR(1));
+       &add($c0,$l1,$c0);
+       &cmpult($c0,$l1,($t1)=&NR(1));  &FR($l1);
+       &add($t1,$h1,$h1);              &FR($t1);
+       &add($c1,$h1,$c1);
+       &cmpult($c1,$h1,($t2)=&NR(1));  &FR($h1);
+       &add($c2,$t2,$c2);              &FR($t2);
+       }
+
+sub bn_mul_comba4
+       {
+       local($name)=@_;
+       local(@a,@b,$r,$c0,$c1,$c2);
+
+       $cnt=1;
+       &init_pool(3);
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $bp=&wparam(2);
+
+       &function_begin($name,"");
+
+       &comment("");
+
+       &ld(($a[0])=&NR(1),&QWPw(0,$ap));
+       &ld(($b[0])=&NR(1),&QWPw(0,$bp));
+       &ld(($a[1])=&NR(1),&QWPw(1,$ap));
+       &ld(($b[1])=&NR(1),&QWPw(1,$bp));
+       &mul($a[0],$b[0],($r00)=&NR(1));
+       &ld(($a[2])=&NR(1),&QWPw(2,$ap));
+       &ld(($b[2])=&NR(1),&QWPw(2,$bp));
+       &muh($a[0],$b[0],($r01)=&NR(1));
+       &FR($ap); &ld(($a[3])=&NR(1),&QWPw(3,$ap));
+       &FR($bp); &ld(($b[3])=&NR(1),&QWPw(3,$bp));
+       &mul($a[0],$b[1],($r02)=&NR(1));
+
+       ($R,$H1,$H2)=&NR(3);
+
+       &st($r00,&QWPw(0,$rp)); &FR($r00);
+
+       &mov("zero",$R);
+       &mul($a[1],$b[0],($r03)=&NR(1));
+
+       &mov("zero",$H1);
+       &mov("zero",$H0);
+        &add($R,$r01,$R);
+       &muh($a[0],$b[1],($r04)=&NR(1));
+        &cmpult($R,$r01,($t01)=&NR(1));        &FR($r01);
+        &add($R,$r02,$R);
+        &add($H1,$t01,$H1)                     &FR($t01);
+       &muh($a[1],$b[0],($r05)=&NR(1));
+        &cmpult($R,$r02,($t02)=&NR(1));        &FR($r02);
+        &add($R,$r03,$R);
+        &add($H2,$t02,$H2)                     &FR($t02);
+       &mul($a[0],$b[2],($r06)=&NR(1));
+        &cmpult($R,$r03,($t03)=&NR(1));        &FR($r03);
+        &add($H1,$t03,$H1)                     &FR($t03);
+       &st($R,&QWPw(1,$rp));
+       &add($H1,$H2,$R);
+
+       &mov("zero",$H1);
+        &add($R,$r04,$R);
+       &mov("zero",$H2);
+       &mul($a[1],$b[1],($r07)=&NR(1));
+        &cmpult($R,$r04,($t04)=&NR(1));        &FR($r04);
+        &add($R,$r05,$R);
+        &add($H1,$t04,$H1)                     &FR($t04);
+       &mul($a[2],$b[0],($r08)=&NR(1));
+        &cmpult($R,$r05,($t05)=&NR(1));        &FR($r05);
+        &add($R,$r01,$R);
+        &add($H2,$t05,$H2)                     &FR($t05);
+       &muh($a[0],$b[2],($r09)=&NR(1));
+        &cmpult($R,$r06,($t06)=&NR(1));        &FR($r06);
+        &add($R,$r07,$R);
+        &add($H1,$t06,$H1)                     &FR($t06);
+       &muh($a[1],$b[1],($r10)=&NR(1));
+        &cmpult($R,$r07,($t07)=&NR(1));        &FR($r07);
+        &add($R,$r08,$R);
+        &add($H2,$t07,$H2)                     &FR($t07);
+       &muh($a[2],$b[0],($r11)=&NR(1));
+        &cmpult($R,$r08,($t08)=&NR(1));        &FR($r08);
+        &add($H1,$t08,$H1)                     &FR($t08);
+       &st($R,&QWPw(2,$rp));
+       &add($H1,$H2,$R);
+
+       &mov("zero",$H1);
+        &add($R,$r09,$R);
+       &mov("zero",$H2);
+       &mul($a[0],$b[3],($r12)=&NR(1));
+        &cmpult($R,$r09,($t09)=&NR(1));        &FR($r09);
+        &add($R,$r10,$R);
+        &add($H1,$t09,$H1)                     &FR($t09);
+       &mul($a[1],$b[2],($r13)=&NR(1));
+        &cmpult($R,$r10,($t10)=&NR(1));        &FR($r10);
+        &add($R,$r11,$R);
+        &add($H1,$t10,$H1)                     &FR($t10);
+       &mul($a[2],$b[1],($r14)=&NR(1));
+        &cmpult($R,$r11,($t11)=&NR(1));        &FR($r11);
+        &add($R,$r12,$R);
+        &add($H1,$t11,$H1)                     &FR($t11);
+       &mul($a[3],$b[0],($r15)=&NR(1));
+        &cmpult($R,$r12,($t12)=&NR(1));        &FR($r12);
+        &add($R,$r13,$R);
+        &add($H1,$t12,$H1)                     &FR($t12);
+       &muh($a[0],$b[3],($r16)=&NR(1));
+        &cmpult($R,$r13,($t13)=&NR(1));        &FR($r13);
+        &add($R,$r14,$R);
+        &add($H1,$t13,$H1)                     &FR($t13);
+       &muh($a[1],$b[2],($r17)=&NR(1));
+        &cmpult($R,$r14,($t14)=&NR(1));        &FR($r14);
+        &add($R,$r15,$R);
+        &add($H1,$t14,$H1)                     &FR($t14);
+       &muh($a[2],$b[1],($r18)=&NR(1));
+        &cmpult($R,$r15,($t15)=&NR(1));        &FR($r15);
+        &add($H1,$t15,$H1)                     &FR($t15);
+       &st($R,&QWPw(3,$rp));
+       &add($H1,$H2,$R);
+
+       &mov("zero",$H1);
+        &add($R,$r16,$R);
+       &mov("zero",$H2);
+       &muh($a[3],$b[0],($r19)=&NR(1));
+        &cmpult($R,$r16,($t16)=&NR(1));        &FR($r16);
+        &add($R,$r17,$R);
+        &add($H1,$t16,$H1)                     &FR($t16);
+       &mul($a[1],$b[3],($r20)=&NR(1));
+        &cmpult($R,$r17,($t17)=&NR(1));        &FR($r17);
+        &add($R,$r18,$R);
+        &add($H1,$t17,$H1)                     &FR($t17);
+       &mul($a[2],$b[2],($r21)=&NR(1));
+        &cmpult($R,$r18,($t18)=&NR(1));        &FR($r18);
+        &add($R,$r19,$R);
+        &add($H1,$t18,$H1)                     &FR($t18);
+       &mul($a[3],$b[1],($r22)=&NR(1));
+        &cmpult($R,$r19,($t19)=&NR(1));        &FR($r19);
+        &add($R,$r20,$R);
+        &add($H1,$t19,$H1)                     &FR($t19);
+       &muh($a[1],$b[3],($r23)=&NR(1));
+        &cmpult($R,$r20,($t20)=&NR(1));        &FR($r20);
+        &add($R,$r21,$R);
+        &add($H1,$t20,$H1)                     &FR($t20);
+       &muh($a[2],$b[2],($r24)=&NR(1));
+        &cmpult($R,$r21,($t21)=&NR(1));        &FR($r21);
+        &add($R,$r22,$R);
+        &add($H1,$t21,$H1)                     &FR($t21);
+       &muh($a[3],$b[1],($r25)=&NR(1));
+        &cmpult($R,$r22,($t22)=&NR(1));        &FR($r22);
+        &add($H1,$t22,$H1)                     &FR($t22);
+       &st($R,&QWPw(4,$rp));
+       &add($H1,$H2,$R);
+
+       &mov("zero",$H1);
+        &add($R,$r23,$R);
+       &mov("zero",$H2);
+       &mul($a[2],$b[3],($r26)=&NR(1));
+        &cmpult($R,$r23,($t23)=&NR(1));        &FR($r23);
+        &add($R,$r24,$R);
+        &add($H1,$t23,$H1)                     &FR($t23);
+       &mul($a[3],$b[2],($r27)=&NR(1));
+        &cmpult($R,$r24,($t24)=&NR(1));        &FR($r24);
+        &add($R,$r25,$R);
+        &add($H1,$t24,$H1)                     &FR($t24);
+       &muh($a[2],$b[3],($r28)=&NR(1));
+        &cmpult($R,$r25,($t25)=&NR(1));        &FR($r25);
+        &add($R,$r26,$R);
+        &add($H1,$t25,$H1)                     &FR($t25);
+       &muh($a[3],$b[2],($r29)=&NR(1));
+        &cmpult($R,$r26,($t26)=&NR(1));        &FR($r26);
+        &add($R,$r27,$R);
+        &add($H1,$t26,$H1)                     &FR($t26);
+       &mul($a[3],$b[3],($r30)=&NR(1));
+        &cmpult($R,$r27,($t27)=&NR(1));        &FR($r27);
+        &add($H1,$t27,$H1)                     &FR($t27);
+       &st($R,&QWPw(5,$rp));
+       &add($H1,$H2,$R);
+
+       &mov("zero",$H1);
+        &add($R,$r28,$R);
+       &mov("zero",$H2);
+       &muh($a[3],$b[3],($r31)=&NR(1));
+        &cmpult($R,$r28,($t28)=&NR(1));        &FR($r28);
+        &add($R,$r29,$R);
+        &add($H1,$t28,$H1)                     &FR($t28);
+       ############
+        &cmpult($R,$r29,($t29)=&NR(1));        &FR($r29);
+        &add($R,$r30,$R);
+        &add($H1,$t29,$H1)                     &FR($t29);
+        ############
+        &cmpult($R,$r30,($t30)=&NR(1));        &FR($r30);
+        &add($H1,$t30,$H1)                     &FR($t30);
+       &st($R,&QWPw(6,$rp));
+       &add($H1,$H2,$R);
+
+        &add($R,$r31,$R);                      &FR($r31);
+       &st($R,&QWPw(7,$rp));
+
+       &FR($R,$H1,$H2);
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha/mul_c4.works.pl b/crypto/bn/asm/alpha/mul_c4.works.pl
new file mode 100644 (file)
index 0000000..79d86dd
--- /dev/null
@@ -0,0 +1,98 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub mul_add_c
+       {
+       local($a,$b,$c0,$c1,$c2)=@_;
+       local($l1,$h1,$t1,$t2);
+
+print STDERR "count=$cnt\n"; $cnt++;
+       &mul($a,$b,($l1)=&NR(1));
+       &muh($a,$b,($h1)=&NR(1));
+       &add($c0,$l1,$c0);
+       &cmpult($c0,$l1,($t1)=&NR(1));  &FR($l1);
+       &add($t1,$h1,$h1);              &FR($t1);
+       &add($c1,$h1,$c1);
+       &cmpult($c1,$h1,($t2)=&NR(1));  &FR($h1);
+       &add($c2,$t2,$c2);              &FR($t2);
+       }
+
+sub bn_mul_comba4
+       {
+       local($name)=@_;
+       local(@a,@b,$r,$c0,$c1,$c2);
+
+       $cnt=1;
+       &init_pool(3);
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $bp=&wparam(2);
+
+       &function_begin($name,"");
+
+       &comment("");
+
+       &ld(($a[0])=&NR(1),&QWPw(0,$ap));
+       &ld(($b[0])=&NR(1),&QWPw(0,$bp));
+       &ld(($a[1])=&NR(1),&QWPw(1,$ap));
+       &ld(($b[1])=&NR(1),&QWPw(1,$bp));
+       &ld(($a[2])=&NR(1),&QWPw(2,$ap));
+       &ld(($b[2])=&NR(1),&QWPw(2,$bp));
+       &ld(($a[3])=&NR(1),&QWPw(3,$ap));       &FR($ap);
+       &ld(($b[3])=&NR(1),&QWPw(3,$bp));       &FR($bp);
+
+       ($c0,$c1,$c2)=&NR(3);
+       &mov("zero",$c2);
+       &mul($a[0],$b[0],$c0);
+       &muh($a[0],$b[0],$c1);
+       &st($c0,&QWPw(0,$rp));                  &FR($c0); ($c0)=&NR($c0);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(1,$rp));                  &FR($c0); ($c0)=&NR($c0);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[1],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[0],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(2,$rp));                  &FR($c0); ($c0)=&NR($c0);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[3],$c0,$c1,$c2);    &FR($a[0]);
+       &mul_add_c($a[1],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[0],$c0,$c1,$c2);    &FR($b[0]);
+       &st($c0,&QWPw(3,$rp));                  &FR($c0); ($c0)=&NR($c0);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[1],$b[3],$c0,$c1,$c2);    &FR($a[1]);
+       &mul_add_c($a[2],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[1],$c0,$c1,$c2);    &FR($b[1]);
+       &st($c0,&QWPw(4,$rp));                  &FR($c0); ($c0)=&NR($c0);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[2],$b[3],$c0,$c1,$c2);    &FR($a[2]);
+       &mul_add_c($a[3],$b[2],$c0,$c1,$c2);    &FR($b[2]);
+       &st($c0,&QWPw(5,$rp));                  &FR($c0); ($c0)=&NR($c0);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[3],$b[3],$c0,$c1,$c2);    &FR($a[3],$b[3]);
+       &st($c0,&QWPw(6,$rp));
+       &st($c1,&QWPw(7,$rp));
+
+       &FR($c0,$c1,$c2);
+
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha/mul_c8.pl b/crypto/bn/asm/alpha/mul_c8.pl
new file mode 100644 (file)
index 0000000..525ca74
--- /dev/null
@@ -0,0 +1,177 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub bn_mul_comba8
+       {
+       local($name)=@_;
+       local(@a,@b,$r,$c0,$c1,$c2);
+
+       $cnt=1;
+       &init_pool(3);
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $bp=&wparam(2);
+
+       &function_begin($name,"");
+
+       &comment("");
+
+       &stack_push(2);
+       &ld(($a[0])=&NR(1),&QWPw(0,$ap));
+       &ld(($b[0])=&NR(1),&QWPw(0,$bp));
+       &st($reg_s0,&swtmp(0)); &FR($reg_s0);
+       &st($reg_s1,&swtmp(1)); &FR($reg_s1);
+       &ld(($a[1])=&NR(1),&QWPw(1,$ap));
+       &ld(($b[1])=&NR(1),&QWPw(1,$bp));
+       &ld(($a[2])=&NR(1),&QWPw(2,$ap));
+       &ld(($b[2])=&NR(1),&QWPw(2,$bp));
+       &ld(($a[3])=&NR(1),&QWPw(3,$ap));
+       &ld(($b[3])=&NR(1),&QWPw(3,$bp));
+       &ld(($a[4])=&NR(1),&QWPw(1,$ap));
+       &ld(($b[4])=&NR(1),&QWPw(1,$bp));
+       &ld(($a[5])=&NR(1),&QWPw(1,$ap));
+       &ld(($b[5])=&NR(1),&QWPw(1,$bp));
+       &ld(($a[6])=&NR(1),&QWPw(1,$ap));
+       &ld(($b[6])=&NR(1),&QWPw(1,$bp));
+       &ld(($a[7])=&NR(1),&QWPw(1,$ap));       &FR($ap);
+       &ld(($b[7])=&NR(1),&QWPw(1,$bp));       &FR($bp);
+
+       ($c0,$c1,$c2)=&NR(3);
+       &mov("zero",$c2);
+       &mul($a[0],$b[0],$c0);
+       &muh($a[0],$b[0],$c1);
+       &st($c0,&QWPw(0,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(1,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(2,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(3,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[4],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(4,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[4],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[5],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(5,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[1],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[4],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[5],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[6],$b[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(6,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[0],$b[7],$c0,$c1,$c2);    &FR($a[0]);
+       &mul_add_c($a[1],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[2],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[4],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[5],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[6],$b[1],$c0,$c1,$c2);
+       &mul_add_c($a[7],$b[0],$c0,$c1,$c2);    &FR($b[0]);
+       &st($c0,&QWPw(7,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[1],$b[7],$c0,$c1,$c2);    &FR($a[1]);
+       &mul_add_c($a[2],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[3],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[4],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[5],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[6],$b[2],$c0,$c1,$c2);
+       &mul_add_c($a[7],$b[1],$c0,$c1,$c2);    &FR($b[1]);
+       &st($c0,&QWPw(8,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[2],$b[7],$c0,$c1,$c2);    &FR($a[2]);
+       &mul_add_c($a[3],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[4],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[5],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[6],$b[3],$c0,$c1,$c2);
+       &mul_add_c($a[7],$b[2],$c0,$c1,$c2);    &FR($b[2]);
+       &st($c0,&QWPw(9,$rp));                  &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[3],$b[7],$c0,$c1,$c2);    &FR($a[3]);
+       &mul_add_c($a[4],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[5],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[6],$b[4],$c0,$c1,$c2);
+       &mul_add_c($a[7],$b[3],$c0,$c1,$c2);    &FR($b[3]);
+       &st($c0,&QWPw(10,$rp));                 &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[4],$b[7],$c0,$c1,$c2);    &FR($a[4]);
+       &mul_add_c($a[5],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[6],$b[5],$c0,$c1,$c2);
+       &mul_add_c($a[7],$b[4],$c0,$c1,$c2);    &FR($b[4]);
+       &st($c0,&QWPw(11,$rp));                 &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[5],$b[7],$c0,$c1,$c2);    &FR($a[5]);
+       &mul_add_c($a[6],$b[6],$c0,$c1,$c2);
+       &mul_add_c($a[7],$b[5],$c0,$c1,$c2);    &FR($b[5]);
+       &st($c0,&QWPw(12,$rp));                 &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[6],$b[7],$c0,$c1,$c2);    &FR($a[6]);
+       &mul_add_c($a[7],$b[6],$c0,$c1,$c2);    &FR($b[6]);
+       &st($c0,&QWPw(13,$rp));                 &FR($c0); ($c0)=&NR(1);
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &mul_add_c($a[7],$b[7],$c0,$c1,$c2);    &FR($a[7],$b[7]);
+       &st($c0,&QWPw(14,$rp));
+       &st($c1,&QWPw(15,$rp));
+
+       &FR($c0,$c1,$c2);
+
+       &ld($reg_s0,&swtmp(0));
+       &ld($reg_s1,&swtmp(1));
+       &stack_pop(2);
+
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha/sqr.pl b/crypto/bn/asm/alpha/sqr.pl
new file mode 100644 (file)
index 0000000..a55b696
--- /dev/null
@@ -0,0 +1,113 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub bn_sqr_words
+       {
+       local($name)=@_;
+       local($cc,$a,$b,$r,$couny);
+
+       &init_pool(3);
+       ($cc)=GR("r0");
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $count=&wparam(2);
+
+       &function_begin($name,"");
+
+       &comment("");
+       &sub($count,4,$count);
+       &mov("zero",$cc);
+       &br(&label("finish"));
+       &blt($count,&label("finish"));
+
+       ($a0,$r0)=&NR(2);
+       &ld($a0,&QWPw(0,$ap));
+       &ld($r0,&QWPw(0,$rp));
+
+$a=<<'EOF';
+##########################################################
+       &set_label("loop");
+
+       ($a1)=&NR(1); &ld($a1,&QWPw(1,$ap));
+       ($b1)=&NR(1); &ld($b1,&QWPw(1,$bp));
+       ($a2)=&NR(1); &ld($a2,&QWPw(2,$ap));
+       ($b2)=&NR(1); &ld($b2,&QWPw(2,$bp));
+       ($a3)=&NR(1); &ld($a3,&QWPw(3,$ap));
+       ($b3)=&NR(1); &ld($b3,&QWPw(3,$bp));
+
+       ($o0,$t0)=&NR(2);
+       &add($a0,$b0,$o0); 
+       &cmpult($o0,$b0,$t0);
+       &add($o0,$cc,$o0);
+       &cmpult($o0,$cc,$cc);
+       &add($cc,$t0,$cc);      &FR($t0);
+
+       ($t1,$o1)=&NR(2);
+
+       &add($a1,$b1,$o1);      &FR($a1);
+       &cmpult($o1,$b1,$t1);   &FR($b1);
+       &add($o1,$cc,$o1);
+       &cmpult($o1,$cc,$cc);
+       &add($cc,$t1,$cc);      &FR($t1);
+
+       ($t2,$o2)=&NR(2);
+
+       &add($a2,$b2,$o2);      &FR($a2);
+       &cmpult($o2,$b2,$t2);   &FR($b2);
+       &add($o2,$cc,$o2);
+       &cmpult($o2,$cc,$cc);
+       &add($cc,$t2,$cc);      &FR($t2);
+
+       ($t3,$o3)=&NR(2);
+
+       &add($a3,$b3,$o3);      &FR($a3);
+       &cmpult($o3,$b3,$t3);   &FR($b3);
+       &add($o3,$cc,$o3);
+       &cmpult($o3,$cc,$cc);
+       &add($cc,$t3,$cc);      &FR($t3);
+
+       &st($o0,&QWPw(0,$rp)); &FR($o0);
+       &st($o1,&QWPw(0,$rp)); &FR($o1);
+       &st($o2,&QWPw(0,$rp)); &FR($o2);
+       &st($o3,&QWPw(0,$rp)); &FR($o3);
+
+       &sub($count,4,$count);  # count-=4
+       &add($ap,4*$QWS,$ap);   # count+=4
+       &add($bp,4*$QWS,$bp);   # count+=4
+       &add($rp,4*$QWS,$rp);   # count+=4
+
+       &blt($count,&label("finish"));
+       &ld($a0,&QWPw(0,$ap));
+        &ld($b0,&QWPw(0,$bp));
+       &br(&label("loop"));
+EOF
+##################################################
+       # Do the last 0..3 words
+
+       &set_label("last_loop");
+
+       &ld(($a0)=&NR(1),&QWPw(0,$ap)); # get a
+       &mul($a0,$a0,($l0)=&NR(1));
+        &add($ap,$QWS,$ap);
+        &add($rp,2*$QWS,$rp);
+        &sub($count,1,$count);
+       &muh($a0,$a0,($h0)=&NR(1));     &FR($a0);
+       &st($l0,&QWPw(-2,$rp));         &FR($l0);
+       &st($h0,&QWPw(-1,$rp));         &FR($h0);
+
+       &bgt($count,&label("last_loop"));
+       &function_end_A($name);
+
+######################################################
+       &set_label("finish");
+       &add($count,4,$count);
+       &bgt($count,&label("last_loop"));
+
+       &set_label("end");
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha/sqr_c4.pl b/crypto/bn/asm/alpha/sqr_c4.pl
new file mode 100644 (file)
index 0000000..bf33f5b
--- /dev/null
@@ -0,0 +1,109 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub sqr_add_c
+       {
+       local($a,$c0,$c1,$c2)=@_;
+       local($l1,$h1,$t1,$t2);
+
+       &mul($a,$a,($l1)=&NR(1));
+       &muh($a,$a,($h1)=&NR(1));
+       &add($c0,$l1,$c0);
+       &add($c1,$h1,$c1);
+       &cmpult($c0,$l1,($t1)=&NR(1));  &FR($l1);
+       &cmpult($c1,$h1,($t2)=&NR(1));  &FR($h1);
+       &add($c1,$t1,$c1);              &FR($t1);
+       &add($c2,$t2,$c2);              &FR($t2);
+       }
+
+sub sqr_add_c2
+       {
+       local($a,$b,$c0,$c1,$c2)=@_;
+       local($l1,$h1,$t1,$t2);
+
+       &mul($a,$b,($l1)=&NR(1));
+       &muh($a,$b,($h1)=&NR(1));
+       &cmplt($l1,"zero",($lc1)=&NR(1));
+       &cmplt($h1,"zero",($hc1)=&NR(1));
+       &add($l1,$l1,$l1);
+       &add($h1,$h1,$h1);
+       &add($h1,$lc1,$h1);             &FR($lc1);
+       &add($c2,$hc1,$c2);             &FR($hc1);
+
+       &add($c0,$l1,$c0);
+       &add($c1,$h1,$c1);
+       &cmpult($c0,$l1,($lc1)=&NR(1)); &FR($l1);
+       &cmpult($c1,$h1,($hc1)=&NR(1)); &FR($h1);
+
+       &add($c1,$lc1,$c1);             &FR($lc1);
+       &add($c2,$hc1,$c2);             &FR($hc1);
+       }
+
+
+sub bn_sqr_comba4
+       {
+       local($name)=@_;
+       local(@a,@b,$r,$c0,$c1,$c2);
+
+       $cnt=1;
+       &init_pool(2);
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+
+       &function_begin($name,"");
+
+       &comment("");
+
+       &ld(($a[0])=&NR(1),&QWPw(0,$ap));
+       &ld(($a[1])=&NR(1),&QWPw(1,$ap));
+       &ld(($a[2])=&NR(1),&QWPw(2,$ap));
+        &ld(($a[3])=&NR(1),&QWPw(3,$ap)); &FR($ap);
+
+       ($c0,$c1,$c2)=&NR(3);
+
+       &mov("zero",$c2);
+       &mul($a[0],$a[0],$c0);
+       &muh($a[0],$a[0],$c1);
+       &st($c0,&QWPw(0,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[0],$a[1],$c0,$c1,$c2);
+       &st($c0,&QWPw(1,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[2],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(2,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[3],$a[0],$c0,$c1,$c2);
+       &sqr_add_c2($a[2],$a[1],$c0,$c1,$c2);
+       &st($c0,&QWPw(3,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[2],$c0,$c1,$c2);
+       &sqr_add_c2($a[3],$a[1],$c0,$c1,$c2);
+       &st($c0,&QWPw(4,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[3],$a[2],$c0,$c1,$c2);
+       &st($c0,&QWPw(5,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[3],$c0,$c1,$c2);
+       &st($c0,&QWPw(6,$rp));
+       &st($c1,&QWPw(7,$rp));
+
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha/sqr_c8.pl b/crypto/bn/asm/alpha/sqr_c8.pl
new file mode 100644 (file)
index 0000000..b4afe08
--- /dev/null
@@ -0,0 +1,132 @@
+#!/usr/local/bin/perl
+# alpha assember 
+
+sub bn_sqr_comba8
+       {
+       local($name)=@_;
+       local(@a,@b,$r,$c0,$c1,$c2);
+
+       $cnt=1;
+       &init_pool(2);
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+
+       &function_begin($name,"");
+
+       &comment("");
+
+       &ld(($a[0])=&NR(1),&QWPw(0,$ap));
+       &ld(($a[1])=&NR(1),&QWPw(1,$ap));
+       &ld(($a[2])=&NR(1),&QWPw(2,$ap));
+       &ld(($a[3])=&NR(1),&QWPw(3,$ap));
+       &ld(($a[4])=&NR(1),&QWPw(4,$ap));
+       &ld(($a[5])=&NR(1),&QWPw(5,$ap));
+       &ld(($a[6])=&NR(1),&QWPw(6,$ap));
+        &ld(($a[7])=&NR(1),&QWPw(7,$ap)); &FR($ap);
+
+       ($c0,$c1,$c2)=&NR(3);
+
+       &mov("zero",$c2);
+       &mul($a[0],$a[0],$c0);
+       &muh($a[0],$a[0],$c1);
+       &st($c0,&QWPw(0,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[1],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(1,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[2],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(2,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[2],$a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[3],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(3,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[2],$c0,$c1,$c2);
+       &sqr_add_c2($a[3],$a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[4],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(4,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[3],$a[2],$c0,$c1,$c2);
+       &sqr_add_c2($a[4],$a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[5],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(5,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[3],$c0,$c1,$c2);
+       &sqr_add_c2($a[4],$a[2],$c0,$c1,$c2);
+       &sqr_add_c2($a[5],$a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[6],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(6,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[4],$a[3],$c0,$c1,$c2);
+       &sqr_add_c2($a[5],$a[2],$c0,$c1,$c2);
+       &sqr_add_c2($a[6],$a[1],$c0,$c1,$c2);
+       &sqr_add_c2($a[7],$a[0],$c0,$c1,$c2);
+       &st($c0,&QWPw(7,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[4],$c0,$c1,$c2);
+       &sqr_add_c2($a[5],$a[3],$c0,$c1,$c2);
+       &sqr_add_c2($a[6],$a[2],$c0,$c1,$c2);
+       &sqr_add_c2($a[7],$a[1],$c0,$c1,$c2);
+       &st($c0,&QWPw(8,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[5],$a[4],$c0,$c1,$c2);
+       &sqr_add_c2($a[6],$a[3],$c0,$c1,$c2);
+       &sqr_add_c2($a[7],$a[2],$c0,$c1,$c2);
+       &st($c0,&QWPw(9,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[5],$c0,$c1,$c2);
+       &sqr_add_c2($a[6],$a[4],$c0,$c1,$c2);
+       &sqr_add_c2($a[7],$a[3],$c0,$c1,$c2);
+       &st($c0,&QWPw(10,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[6],$a[5],$c0,$c1,$c2);
+       &sqr_add_c2($a[7],$a[4],$c0,$c1,$c2);
+       &st($c0,&QWPw(11,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[6],$c0,$c1,$c2);
+       &sqr_add_c2($a[7],$a[5],$c0,$c1,$c2);
+       &st($c0,&QWPw(12,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c2($a[7],$a[6],$c0,$c1,$c2);
+       &st($c0,&QWPw(13,$rp));
+       ($c0,$c1,$c2)=($c1,$c2,$c0);
+       &mov("zero",$c2);
+
+       &sqr_add_c($a[7],$c0,$c1,$c2);
+       &st($c0,&QWPw(14,$rp));
+       &st($c1,&QWPw(15,$rp));
+
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
diff --git a/crypto/bn/asm/alpha/sub.pl b/crypto/bn/asm/alpha/sub.pl
new file mode 100644 (file)
index 0000000..d998da5
--- /dev/null
@@ -0,0 +1,108 @@
+#!/usr/local/bin/perl
+# alpha assember
+
+sub bn_sub_words
+       {
+       local($name)=@_;
+       local($cc,$a,$b,$r);
+
+       &init_pool(4);
+       ($cc)=GR("r0");
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $bp=&wparam(2);
+       $count=&wparam(3);
+
+       &function_begin($name,"");
+
+       &comment("");
+       &sub($count,4,$count);
+       &mov("zero",$cc);
+       &blt($count,&label("finish"));
+
+       ($a0,$b0)=&NR(2);
+       &ld($a0,&QWPw(0,$ap));
+       &ld($b0,&QWPw(0,$bp));
+
+##########################################################
+       &set_label("loop");
+
+       ($a1,$tmp,$b1,$a2,$b2,$a3,$b3,$o0)=&NR(8);
+       &ld($a1,&QWPw(1,$ap));
+        &cmpult($a0,$b0,$tmp); # will we borrow?
+       &ld($b1,&QWPw(1,$bp));
+        &sub($a0,$b0,$a0);             # do the subtract
+       &ld($a2,&QWPw(2,$ap));
+        &cmpult($a0,$cc,$b0);  # will we borrow?
+       &ld($b2,&QWPw(2,$bp));
+        &sub($a0,$cc,$o0);     # will we borrow?
+       &ld($a3,&QWPw(3,$ap));
+        &add($b0,$tmp,$cc); ($t1,$o1)=&NR(2); &FR($tmp);
+
+       &cmpult($a1,$b1,$t1);   # will we borrow?
+        &sub($a1,$b1,$a1);     # do the subtract
+       &ld($b3,&QWPw(3,$bp));
+        &cmpult($a1,$cc,$b1);  # will we borrow?
+       &sub($a1,$cc,$o1);      # will we borrow?
+        &add($b1,$t1,$cc); ($tmp,$o2)=&NR(2); &FR($t1,$a1,$b1);
+       
+       &cmpult($a2,$b2,$tmp);  # will we borrow?
+        &sub($a2,$b2,$a2);             # do the subtract
+       &st($o0,&QWPw(0,$rp));  &FR($o0); # save
+        &cmpult($a2,$cc,$b2);  # will we borrow?
+       &sub($a2,$cc,$o2);      # will we borrow?
+        &add($b2,$tmp,$cc); ($t3,$o3)=&NR(2); &FR($tmp,$a2,$b2);
+
+       &cmpult($a3,$b3,$t3);   # will we borrow?
+        &sub($a3,$b3,$a3);     # do the subtract
+       &st($o1,&QWPw(1,$rp)); &FR($o1);
+        &cmpult($a3,$cc,$b3);  # will we borrow?
+       &sub($a3,$cc,$o3);      # will we borrow?
+        &add($b3,$t3,$cc); &FR($t3,$a3,$b3);
+
+       &st($o2,&QWPw(2,$rp));  &FR($o2);
+        &sub($count,4,$count); # count-=4
+       &st($o3,&QWPw(3,$rp));  &FR($o3);
+        &add($ap,4*$QWS,$ap);  # count+=4
+       &add($bp,4*$QWS,$bp);   # count+=4
+        &add($rp,4*$QWS,$rp);  # count+=4
+
+       &blt($count,&label("finish"));
+       &ld($a0,&QWPw(0,$ap));
+        &ld($b0,&QWPw(0,$bp));
+       &br(&label("loop"));
+##################################################
+       # Do the last 0..3 words
+
+       &set_label("last_loop");
+
+       &ld($a0,&QWPw(0,$ap));  # get a
+        &ld($b0,&QWPw(0,$bp)); # get b
+       &cmpult($a0,$b0,$tmp);  # will we borrow?
+       &sub($a0,$b0,$a0);      # do the subtract
+       &cmpult($a0,$cc,$b0);   # will we borrow?
+       &sub($a0,$cc,$a0);      # will we borrow?
+       &st($a0,&QWPw(0,$rp));  # save
+       &add($b0,$tmp,$cc);     # add the borrows
+
+       &add($ap,$QWS,$ap);
+       &add($bp,$QWS,$bp);
+       &add($rp,$QWS,$rp);
+       &sub($count,1,$count);
+       &bgt($count,&label("last_loop"));
+       &function_end_A($name);
+
+######################################################
+       &set_label("finish");
+       &add($count,4,$count);
+       &bgt($count,&label("last_loop"));
+
+       &FR($a0,$b0);
+       &set_label("end");
+       &function_end($name);
+
+       &fin_pool;
+       }
+
+1;
index 128f0f29d6fd338b2091fe40dd288b4c8572c1d7..7a03c67b5b1fec3852d3b5c1b9e817963a216ed0 100644 (file)
@@ -1,6 +1,3 @@
-#!/usr/local/bin/perl
-#
-
 #!/usr/local/bin/perl
 
 push(@INC,"perlasm","../../perlasm");
@@ -11,8 +8,9 @@ require "x86asm.pl";
 &bn_mul_add_words("bn_mul_add_words");
 &bn_mul_words("bn_mul_words");
 &bn_sqr_words("bn_sqr_words");
-&bn_div64("bn_div64");
+&bn_div_words("bn_div_words");
 &bn_add_words("bn_add_words");
+&bn_sub_words("bn_sub_words");
 
 &asm_finish();
 
@@ -228,7 +226,7 @@ sub bn_sqr_words
        &function_end($name);
        }
 
-sub bn_div64
+sub bn_div_words
        {
        local($name)=@_;
 
@@ -307,7 +305,79 @@ sub bn_add_words
                }
        &set_label("aw_end",0);
 
-       &mov("eax",$c);
+#      &mov("eax",$c);         # $c is "eax"
+
+       &function_end($name);
+       }
+
+sub bn_sub_words
+       {
+       local($name)=@_;
+
+       &function_begin($name,"");
+
+       &comment("");
+       $a="esi";
+       $b="edi";
+       $c="eax";
+       $r="ebx";
+       $tmp1="ecx";
+       $tmp2="edx";
+       $num="ebp";
+
+       &mov($r,&wparam(0));    # get r
+        &mov($a,&wparam(1));   # get a
+       &mov($b,&wparam(2));    # get b
+        &mov($num,&wparam(3)); # get num
+       &xor($c,$c);            # clear carry
+        &and($num,0xfffffff8); # num / 8
+
+       &jz(&label("aw_finish"));
+
+       &set_label("aw_loop",0);
+       for ($i=0; $i<8; $i++)
+               {
+               &comment("Round $i");
+
+               &mov($tmp1,&DWP($i*4,$a,"",0));         # *a
+                &mov($tmp2,&DWP($i*4,$b,"",0));        # *b
+               &sub($tmp1,$c);
+                &mov($c,0);
+               &adc($c,$c);
+                &sub($tmp1,$tmp2);
+               &adc($c,0);
+                &mov(&DWP($i*4,$r,"",0),$tmp1);        # *r
+               }
+
+       &comment("");
+       &add($a,32);
+        &add($b,32);
+       &add($r,32);
+        &sub($num,8);
+       &jnz(&label("aw_loop"));
+
+       &set_label("aw_finish",0);
+       &mov($num,&wparam(3));  # get num
+       &and($num,7);
+        &jz(&label("aw_end"));
+
+       for ($i=0; $i<7; $i++)
+               {
+               &comment("Tail Round $i");
+               &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
+                &mov($tmp2,&DWP($i*4,$b,"",0));# *b
+               &sub($tmp1,$c);
+                &mov($c,0);
+               &adc($c,$c);
+                &sub($tmp1,$tmp2);
+               &adc($c,0);
+                &dec($num) if ($i != 6);
+               &mov(&DWP($i*4,$r,"",0),$tmp1); # *a
+                &jz(&label("aw_end")) if ($i != 6);
+               }
+       &set_label("aw_end",0);
+
+#      &mov("eax",$c);         # $c is "eax"
 
        &function_end($name);
        }
diff --git a/crypto/bn/asm/bn-alpha.pl b/crypto/bn/asm/bn-alpha.pl
new file mode 100644 (file)
index 0000000..302edf2
--- /dev/null
@@ -0,0 +1,571 @@
+#!/usr/local/bin/perl
+# I have this in perl so I can use more usefull register names and then convert
+# them into alpha registers.
+#
+
+$d=&data();
+$d =~ s/CC/0/g;
+$d =~ s/R1/1/g;
+$d =~ s/R2/2/g;
+$d =~ s/R3/3/g;
+$d =~ s/R4/4/g;
+$d =~ s/L1/5/g;
+$d =~ s/L2/6/g;
+$d =~ s/L3/7/g;
+$d =~ s/L4/8/g;
+$d =~ s/O1/22/g;
+$d =~ s/O2/23/g;
+$d =~ s/O3/24/g;
+$d =~ s/O4/25/g;
+$d =~ s/A1/20/g;
+$d =~ s/A2/21/g;
+$d =~ s/A3/27/g;
+$d =~ s/A4/28/g;
+if (0){
+}
+
+print $d;
+
+sub data
+       {
+       local($data)=<<'EOF';
+
+ # DEC Alpha assember
+ # The bn_div_words is actually gcc output but the other parts are hand done.
+ # Thanks to tzeruch@ceddec.com for sending me the gcc output for
+ # bn_div_words.
+ # I've gone back and re-done most of routines.
+ # The key thing to remeber for the 164 CPU is that while a
+ # multiply operation takes 8 cycles, another one can only be issued
+ # after 4 cycles have elapsed.  I've done modification to help
+ # improve this.  Also, normally, a ld instruction will not be available
+ # for about 3 cycles.
+       .file   1 "bn_asm.c"
+       .set noat
+gcc2_compiled.:
+__gnu_compiled_c:
+       .text
+       .align 3
+       .globl bn_mul_add_words
+       .ent bn_mul_add_words
+bn_mul_add_words:
+bn_mul_add_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+       .align 5
+       subq    $18,4,$18
+       bis     $31,$31,$CC
+       blt     $18,$43         # if we are -1, -2, -3 or -4 goto tail code
+       ldq     $A1,0($17)      # 1 1
+       ldq     $R1,0($16)      # 1 1
+       .align 3
+$42:
+       mulq    $A1,$19,$L1     # 1 2 1 ######
+       ldq     $A2,8($17)      # 2 1
+       ldq     $R2,8($16)      # 2 1
+       umulh   $A1,$19,$A1     # 1 2   ######
+       ldq     $A3,16($17)     # 3 1
+       ldq     $R3,16($16)     # 3 1
+       mulq    $A2,$19,$L2     # 2 2 1 ######
+        ldq    $A4,24($17)     # 4 1
+       addq    $R1,$L1,$R1     # 1 2 2
+        ldq    $R4,24($16)     # 4 1
+       umulh   $A2,$19,$A2     # 2 2   ######
+        cmpult $R1,$L1,$O1     # 1 2 3 1
+       addq    $A1,$O1,$A1     # 1 3 1
+        addq   $R1,$CC,$R1     # 1 2 3 1
+       mulq    $A3,$19,$L3     # 3 2 1 ######
+        cmpult $R1,$CC,$CC     # 1 2 3 2
+       addq    $R2,$L2,$R2     # 2 2 2
+        addq   $A1,$CC,$CC     # 1 3 2 
+       cmpult  $R2,$L2,$O2     # 2 2 3 1
+        addq   $A2,$O2,$A2     # 2 3 1
+       umulh   $A3,$19,$A3     # 3 2   ######
+        addq   $R2,$CC,$R2     # 2 2 3 1
+       cmpult  $R2,$CC,$CC     # 2 2 3 2
+        subq   $18,4,$18
+       mulq    $A4,$19,$L4     # 4 2 1 ######
+        addq   $A2,$CC,$CC     # 2 3 2 
+       addq    $R3,$L3,$R3     # 3 2 2
+        addq   $16,32,$16
+       cmpult  $R3,$L3,$O3     # 3 2 3 1
+        stq    $R1,-32($16)    # 1 2 4
+       umulh   $A4,$19,$A4     # 4 2   ######
+        addq   $A3,$O3,$A3     # 3 3 1
+       addq    $R3,$CC,$R3     # 3 2 3 1
+        stq    $R2,-24($16)    # 2 2 4
+       cmpult  $R3,$CC,$CC     # 3 2 3 2
+        stq    $R3,-16($16)    # 3 2 4
+       addq    $R4,$L4,$R4     # 4 2 2
+        addq   $A3,$CC,$CC     # 3 3 2 
+       cmpult  $R4,$L4,$O4     # 4 2 3 1
+        addq   $17,32,$17
+       addq    $A4,$O4,$A4     # 4 3 1
+        addq   $R4,$CC,$R4     # 4 2 3 1
+       cmpult  $R4,$CC,$CC     # 4 2 3 2
+        stq    $R4,-8($16)     # 4 2 4
+       addq    $A4,$CC,$CC     # 4 3 2 
+        blt    $18,$43
+
+       ldq     $A1,0($17)      # 1 1
+       ldq     $R1,0($16)      # 1 1
+
+       br      $42
+
+       .align 4
+$45:
+       ldq     $A1,0($17)      # 4 1
+       ldq     $R1,0($16)      # 4 1
+       mulq    $A1,$19,$L1     # 4 2 1
+       subq    $18,1,$18
+       addq    $16,8,$16
+       addq    $17,8,$17
+       umulh   $A1,$19,$A1     # 4 2
+       addq    $R1,$L1,$R1     # 4 2 2
+       cmpult  $R1,$L1,$O1     # 4 2 3 1
+       addq    $A1,$O1,$A1     # 4 3 1
+       addq    $R1,$CC,$R1     # 4 2 3 1
+       cmpult  $R1,$CC,$CC     # 4 2 3 2
+       addq    $A1,$CC,$CC     # 4 3 2 
+       stq     $R1,-8($16)     # 4 2 4
+       bgt     $18,$45
+       ret     $31,($26),1     # else exit
+
+       .align 4
+$43:
+       addq    $18,4,$18
+       bgt     $18,$45         # goto tail code
+       ret     $31,($26),1     # else exit
+
+       .end bn_mul_add_words
+       .align 3
+       .globl bn_mul_words
+       .ent bn_mul_words
+bn_mul_words:
+bn_mul_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+       .align 5
+       subq    $18,4,$18
+       bis     $31,$31,$CC
+       blt     $18,$143        # if we are -1, -2, -3 or -4 goto tail code
+       ldq     $A1,0($17)      # 1 1
+       .align 3
+$142:
+
+       mulq    $A1,$19,$L1     # 1 2 1 #####
+        ldq    $A2,8($17)      # 2 1
+        ldq    $A3,16($17)     # 3 1
+       umulh   $A1,$19,$A1     # 1 2   #####
+        ldq    $A4,24($17)     # 4 1
+       mulq    $A2,$19,$L2     # 2 2 1 #####
+        addq   $L1,$CC,$L1     # 1 2 3 1
+       subq    $18,4,$18
+        cmpult $L1,$CC,$CC     # 1 2 3 2
+       umulh   $A2,$19,$A2     # 2 2   #####
+        addq   $A1,$CC,$CC     # 1 3 2 
+       addq    $17,32,$17
+        addq   $L2,$CC,$L2     # 2 2 3 1
+       mulq    $A3,$19,$L3     # 3 2 1 #####
+        cmpult $L2,$CC,$CC     # 2 2 3 2
+       addq    $A2,$CC,$CC     # 2 3 2 
+        addq   $16,32,$16
+       umulh   $A3,$19,$A3     # 3 2   #####
+        stq    $L1,-32($16)    # 1 2 4
+       mulq    $A4,$19,$L4     # 4 2 1 #####
+        addq   $L3,$CC,$L3     # 3 2 3 1
+       stq     $L2,-24($16)    # 2 2 4
+        cmpult $L3,$CC,$CC     # 3 2 3 2
+       umulh   $A4,$19,$A4     # 4 2   #####
+        addq   $A3,$CC,$CC     # 3 3 2 
+       stq     $L3,-16($16)    # 3 2 4
+        addq   $L4,$CC,$L4     # 4 2 3 1
+       cmpult  $L4,$CC,$CC     # 4 2 3 2
+
+       addq    $A4,$CC,$CC     # 4 3 2 
+
+       stq     $L4,-8($16)     # 4 2 4
+
+       blt     $18,$143
+
+       ldq     $A1,0($17)      # 1 1
+
+       br      $142
+
+       .align 4
+$145:
+       ldq     $A1,0($17)      # 4 1
+       mulq    $A1,$19,$L1     # 4 2 1
+       subq    $18,1,$18
+       umulh   $A1,$19,$A1     # 4 2
+       addq    $L1,$CC,$L1     # 4 2 3 1
+        addq   $16,8,$16
+       cmpult  $L1,$CC,$CC     # 4 2 3 2
+        addq   $17,8,$17
+       addq    $A1,$CC,$CC     # 4 3 2 
+       stq     $L1,-8($16)     # 4 2 4
+
+       bgt     $18,$145
+       ret     $31,($26),1     # else exit
+
+       .align 4
+$143:
+       addq    $18,4,$18
+       bgt     $18,$145        # goto tail code
+       ret     $31,($26),1     # else exit
+
+       .end bn_mul_words
+       .align 3
+       .globl bn_sqr_words
+       .ent bn_sqr_words
+bn_sqr_words:
+bn_sqr_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $18,4,$18
+       blt     $18,$543        # if we are -1, -2, -3 or -4 goto tail code
+       ldq     $A1,0($17)      # 1 1
+       .align 3
+$542:
+       mulq    $A1,$A1,$L1             ######
+        ldq    $A2,8($17)      # 1 1
+       subq    $18,4
+       umulh   $A1,$A1,$R1             ######
+       ldq     $A3,16($17)     # 1 1
+       mulq    $A2,$A2,$L2             ######
+       ldq     $A4,24($17)     # 1 1
+       stq     $L1,0($16)      # r[0]
+       umulh   $A2,$A2,$R2             ######
+       stq     $R1,8($16)      # r[1]
+       mulq    $A3,$A3,$L3             ######
+       stq     $L2,16($16)     # r[0]
+       umulh   $A3,$A3,$R3             ######
+       stq     $R2,24($16)     # r[1]
+       mulq    $A4,$A4,$L4             ######
+       stq     $L3,32($16)     # r[0]
+       umulh   $A4,$A4,$R4             ######
+       stq     $R3,40($16)     # r[1]
+
+       addq    $16,64,$16
+       addq    $17,32,$17
+       stq     $L4,-16($16)    # r[0]
+       stq     $R4,-8($16)     # r[1]
+
+       blt     $18,$543
+       ldq     $A1,0($17)      # 1 1
+       br      $542
+
+$442:
+       ldq     $A1,0($17)   # a[0]
+       mulq    $A1,$A1,$L1  # a[0]*w low part       r2
+       addq    $16,16,$16
+       addq    $17,8,$17
+       subq    $18,1,$18
+        umulh  $A1,$A1,$R1  # a[0]*w high part       r3
+       stq     $L1,-16($16)   # r[0]
+        stq    $R1,-8($16)   # r[1]
+
+       bgt     $18,$442
+       ret     $31,($26),1     # else exit
+
+       .align 4
+$543:
+       addq    $18,4,$18
+       bgt     $18,$442        # goto tail code
+       ret     $31,($26),1     # else exit
+       .end bn_sqr_words
+
+       .align 3
+       .globl bn_add_words
+       .ent bn_add_words
+bn_add_words:
+bn_add_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $19,4,$19
+       bis     $31,$31,$CC     # carry = 0
+       blt     $19,$900
+       ldq     $L1,0($17)      # a[0]
+       ldq     $R1,0($18)      # b[1]
+       .align 3
+$901:
+       addq    $R1,$L1,$R1     # r=a+b;
+        ldq    $L2,8($17)      # a[1]
+       cmpult  $R1,$L1,$O1     # did we overflow?
+        ldq    $R2,8($18)      # b[1]
+       addq    $R1,$CC,$R1     # c+= overflow
+        ldq    $L3,16($17)     # a[2]
+       cmpult  $R1,$CC,$CC     # overflow?
+        ldq    $R3,16($18)     # b[2]
+       addq    $CC,$O1,$CC
+        ldq    $L4,24($17)     # a[3]
+       addq    $R2,$L2,$R2     # r=a+b;
+        ldq    $R4,24($18)     # b[3]
+       cmpult  $R2,$L2,$O2     # did we overflow?
+        addq   $R3,$L3,$R3     # r=a+b;
+       addq    $R2,$CC,$R2     # c+= overflow
+        cmpult $R3,$L3,$O3     # did we overflow?
+       cmpult  $R2,$CC,$CC     # overflow?
+        addq   $R4,$L4,$R4     # r=a+b;
+       addq    $CC,$O2,$CC
+        cmpult $R4,$L4,$O4     # did we overflow?
+       addq    $R3,$CC,$R3     # c+= overflow
+        stq    $R1,0($16)      # r[0]=c
+       cmpult  $R3,$CC,$CC     # overflow?
+        stq    $R2,8($16)      # r[1]=c
+       addq    $CC,$O3,$CC
+        stq    $R3,16($16)     # r[2]=c
+       addq    $R4,$CC,$R4     # c+= overflow
+        subq   $19,4,$19       # loop--
+       cmpult  $R4,$CC,$CC     # overflow?
+        addq   $17,32,$17      # a++
+       addq    $CC,$O4,$CC
+        stq    $R4,24($16)     # r[3]=c
+       addq    $18,32,$18      # b++
+        addq   $16,32,$16      # r++
+
+       blt     $19,$900
+        ldq    $L1,0($17)      # a[0]
+       ldq     $R1,0($18)      # b[1]
+        br     $901
+       .align 4
+$945:
+       ldq     $L1,0($17)      # a[0]
+        ldq    $R1,0($18)      # b[1]
+       addq    $R1,$L1,$R1     # r=a+b;
+        subq   $19,1,$19       # loop--
+       addq    $R1,$CC,$R1     # c+= overflow
+        addq   $17,8,$17       # a++
+       cmpult  $R1,$L1,$O1     # did we overflow?
+        cmpult $R1,$CC,$CC     # overflow?
+       addq    $18,8,$18       # b++
+        stq    $R1,0($16)      # r[0]=c
+       addq    $CC,$O1,$CC
+        addq   $16,8,$16       # r++
+
+       bgt     $19,$945
+       ret     $31,($26),1     # else exit
+
+$900:
+       addq    $19,4,$19
+       bgt     $19,$945        # goto tail code
+       ret     $31,($26),1     # else exit
+       .end bn_add_words
+
+       .align 3
+       .globl bn_sub_words
+       .ent bn_sub_words
+bn_sub_words:
+bn_sub_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $19,4,$19
+       bis     $31,$31,$CC     # carry = 0
+ br    $800
+       blt     $19,$800
+       ldq     $L1,0($17)      # a[0]
+       ldq     $R1,0($18)      # b[1]
+       .align 3
+$801:
+       addq    $R1,$L1,$R1     # r=a+b;
+        ldq    $L2,8($17)      # a[1]
+       cmpult  $R1,$L1,$O1     # did we overflow?
+        ldq    $R2,8($18)      # b[1]
+       addq    $R1,$CC,$R1     # c+= overflow
+        ldq    $L3,16($17)     # a[2]
+       cmpult  $R1,$CC,$CC     # overflow?
+        ldq    $R3,16($18)     # b[2]
+       addq    $CC,$O1,$CC
+        ldq    $L4,24($17)     # a[3]
+       addq    $R2,$L2,$R2     # r=a+b;
+        ldq    $R4,24($18)     # b[3]
+       cmpult  $R2,$L2,$O2     # did we overflow?
+        addq   $R3,$L3,$R3     # r=a+b;
+       addq    $R2,$CC,$R2     # c+= overflow
+        cmpult $R3,$L3,$O3     # did we overflow?
+       cmpult  $R2,$CC,$CC     # overflow?
+        addq   $R4,$L4,$R4     # r=a+b;
+       addq    $CC,$O2,$CC
+        cmpult $R4,$L4,$O4     # did we overflow?
+       addq    $R3,$CC,$R3     # c+= overflow
+        stq    $R1,0($16)      # r[0]=c
+       cmpult  $R3,$CC,$CC     # overflow?
+        stq    $R2,8($16)      # r[1]=c
+       addq    $CC,$O3,$CC
+        stq    $R3,16($16)     # r[2]=c
+       addq    $R4,$CC,$R4     # c+= overflow
+        subq   $19,4,$19       # loop--
+       cmpult  $R4,$CC,$CC     # overflow?
+        addq   $17,32,$17      # a++
+       addq    $CC,$O4,$CC
+        stq    $R4,24($16)     # r[3]=c
+       addq    $18,32,$18      # b++
+        addq   $16,32,$16      # r++
+
+       blt     $19,$800
+        ldq    $L1,0($17)      # a[0]
+       ldq     $R1,0($18)      # b[1]
+        br     $801
+       .align 4
+$845:
+       ldq     $L1,0($17)      # a[0]
+        ldq    $R1,0($18)      # b[1]
+       cmpult  $L1,$R1,$O1     # will we borrow?
+        subq   $L1,$R1,$R1     # r=a-b;
+       subq    $19,1,$19       # loop--
+        cmpult  $R1,$CC,$O2    # will we borrow?
+       subq    $R1,$CC,$R1     # c+= overflow
+        addq   $17,8,$17       # a++
+       addq    $18,8,$18       # b++
+        stq    $R1,0($16)      # r[0]=c
+       addq    $O2,$O1,$CC
+        addq   $16,8,$16       # r++
+
+       bgt     $19,$845
+       ret     $31,($26),1     # else exit
+
+$800:
+       addq    $19,4,$19
+       bgt     $19,$845        # goto tail code
+       ret     $31,($26),1     # else exit
+       .end bn_sub_words
+
+ #
+ # What follows was taken directly from the C compiler with a few
+ # hacks to redo the lables.
+ #
+.text
+       .align 3
+       .globl bn_div_words
+       .ent bn_div_words
+bn_div_words:
+       ldgp $29,0($27)
+bn_div_words..ng:
+       lda $30,-48($30)
+       .frame $30,48,$26,0
+       stq $26,0($30)
+       stq $9,8($30)
+       stq $10,16($30)
+       stq $11,24($30)
+       stq $12,32($30)
+       stq $13,40($30)
+       .mask 0x4003e00,-48
+       .prologue 1
+       bis $16,$16,$9
+       bis $17,$17,$10
+       bis $18,$18,$11
+       bis $31,$31,$13
+       bis $31,2,$12
+       bne $11,$119
+       lda $0,-1
+       br $31,$136
+       .align 4
+$119:
+       bis $11,$11,$16
+       jsr $26,BN_num_bits_word
+       ldgp $29,0($26)
+       subq $0,64,$1
+       beq $1,$120
+       bis $31,1,$1
+       sll $1,$0,$1
+       cmpule $9,$1,$1
+       bne $1,$120
+ #     lda $16,_IO_stderr_
+ #     lda $17,$C32
+ #     bis $0,$0,$18
+ #     jsr $26,fprintf
+ #     ldgp $29,0($26)
+       jsr $26,abort
+       ldgp $29,0($26)
+       .align 4
+$120:
+       bis $31,64,$3
+       cmpult $9,$11,$2
+       subq $3,$0,$1
+       addl $1,$31,$0
+       subq $9,$11,$1
+       cmoveq $2,$1,$9
+       beq $0,$122
+       zapnot $0,15,$2
+       subq $3,$0,$1
+       sll $11,$2,$11
+       sll $9,$2,$3
+       srl $10,$1,$1
+       sll $10,$2,$10
+       bis $3,$1,$9
+$122:
+       srl $11,32,$5
+       zapnot $11,15,$6
+       lda $7,-1
+       .align 5
+$123:
+       srl $9,32,$1
+       subq $1,$5,$1
+       bne $1,$126
+       zapnot $7,15,$27
+       br $31,$127
+       .align 4
+$126:
+       bis $9,$9,$24
+       bis $5,$5,$25
+       divqu $24,$25,$27
+$127:
+       srl $10,32,$4
+       .align 5
+$128:
+       mulq $27,$5,$1
+       subq $9,$1,$3
+       zapnot $3,240,$1
+       bne $1,$129
+       mulq $6,$27,$2
+       sll $3,32,$1
+       addq $1,$4,$1
+       cmpule $2,$1,$2
+       bne $2,$129
+       subq $27,1,$27
+       br $31,$128
+       .align 4
+$129:
+       mulq $27,$6,$1
+       mulq $27,$5,$4
+       srl $1,32,$3
+       sll $1,32,$1
+       addq $4,$3,$4
+       cmpult $10,$1,$2
+       subq $10,$1,$10
+       addq $2,$4,$2
+       cmpult $9,$2,$1
+       bis $2,$2,$4
+       beq $1,$134
+       addq $9,$11,$9
+       subq $27,1,$27
+$134:
+       subl $12,1,$12
+       subq $9,$4,$9
+       beq $12,$124
+       sll $27,32,$13
+       sll $9,32,$2
+       srl $10,32,$1
+       sll $10,32,$10
+       bis $2,$1,$9
+       br $31,$123
+       .align 4
+$124:
+       bis $13,$27,$0
+$136:
+       ldq $26,0($30)
+       ldq $9,8($30)
+       ldq $10,16($30)
+       ldq $11,24($30)
+       ldq $12,32($30)
+       ldq $13,40($30)
+       addq $30,48,$30
+       ret $31,($26),1
+       .end bn_div_words
+EOF
+       return($data);
+       }
+
index 017ea462b07a9dbcf7bc12266a231100ce4eb4ae..871bd88d77f95b1af2c569352d0faf8c3387223e 100644 (file)
@@ -485,9 +485,9 @@ $L010sw_end:
 _bn_sqr_words ENDP
 _TEXT  ENDS
 _TEXT  SEGMENT
-PUBLIC _bn_div64
+PUBLIC _bn_div_words
 
-_bn_div64 PROC NEAR
+_bn_div_words PROC NEAR
        push    ebp
        push    ebx
        push    esi
@@ -501,7 +501,7 @@ _bn_div64 PROC NEAR
        pop     ebx
        pop     ebp
        ret
-_bn_div64 ENDP
+_bn_div_words ENDP
 _TEXT  ENDS
 _TEXT  SEGMENT
 PUBLIC _bn_add_words
@@ -678,7 +678,6 @@ $L011aw_finish:
        adc     eax,            0
        mov     DWORD PTR 24[ebx],ecx
 $L013aw_end:
-       mov     eax,            eax
        pop     edi
        pop     esi
        pop     ebx
@@ -686,4 +685,1438 @@ $L013aw_end:
        ret
 _bn_add_words ENDP
 _TEXT  ENDS
+_TEXT  SEGMENT
+PUBLIC _bn_sub_words
+
+_bn_sub_words PROC NEAR
+       push    ebp
+       push    ebx
+       push    esi
+       push    edi
+       ; 
+       mov     ebx,            DWORD PTR 20[esp]
+       mov     esi,            DWORD PTR 24[esp]
+       mov     edi,            DWORD PTR 28[esp]
+       mov     ebp,            DWORD PTR 32[esp]
+       xor     eax,            eax
+       and     ebp,            4294967288
+       jz      $L014aw_finish
+L015aw_loop:
+       ; Round 0
+       mov     ecx,            DWORD PTR [esi]
+       mov     edx,            DWORD PTR [edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       mov     DWORD PTR [ebx],ecx
+       ; Round 1
+       mov     ecx,            DWORD PTR 4[esi]
+       mov     edx,            DWORD PTR 4[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       mov     DWORD PTR 4[ebx],ecx
+       ; Round 2
+       mov     ecx,            DWORD PTR 8[esi]
+       mov     edx,            DWORD PTR 8[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       mov     DWORD PTR 8[ebx],ecx
+       ; Round 3
+       mov     ecx,            DWORD PTR 12[esi]
+       mov     edx,            DWORD PTR 12[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       mov     DWORD PTR 12[ebx],ecx
+       ; Round 4
+       mov     ecx,            DWORD PTR 16[esi]
+       mov     edx,            DWORD PTR 16[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       mov     DWORD PTR 16[ebx],ecx
+       ; Round 5
+       mov     ecx,            DWORD PTR 20[esi]
+       mov     edx,            DWORD PTR 20[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       mov     DWORD PTR 20[ebx],ecx
+       ; Round 6
+       mov     ecx,            DWORD PTR 24[esi]
+       mov     edx,            DWORD PTR 24[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       mov     DWORD PTR 24[ebx],ecx
+       ; Round 7
+       mov     ecx,            DWORD PTR 28[esi]
+       mov     edx,            DWORD PTR 28[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       mov     DWORD PTR 28[ebx],ecx
+       ; 
+       add     esi,            32
+       add     edi,            32
+       add     ebx,            32
+       sub     ebp,            8
+       jnz     L015aw_loop
+$L014aw_finish:
+       mov     ebp,            DWORD PTR 32[esp]
+       and     ebp,            7
+       jz      $L016aw_end
+       ; Tail Round 0
+       mov     ecx,            DWORD PTR [esi]
+       mov     edx,            DWORD PTR [edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       dec     ebp
+       mov     DWORD PTR [ebx],ecx
+       jz      $L016aw_end
+       ; Tail Round 1
+       mov     ecx,            DWORD PTR 4[esi]
+       mov     edx,            DWORD PTR 4[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       dec     ebp
+       mov     DWORD PTR 4[ebx],ecx
+       jz      $L016aw_end
+       ; Tail Round 2
+       mov     ecx,            DWORD PTR 8[esi]
+       mov     edx,            DWORD PTR 8[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       dec     ebp
+       mov     DWORD PTR 8[ebx],ecx
+       jz      $L016aw_end
+       ; Tail Round 3
+       mov     ecx,            DWORD PTR 12[esi]
+       mov     edx,            DWORD PTR 12[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       dec     ebp
+       mov     DWORD PTR 12[ebx],ecx
+       jz      $L016aw_end
+       ; Tail Round 4
+       mov     ecx,            DWORD PTR 16[esi]
+       mov     edx,            DWORD PTR 16[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       dec     ebp
+       mov     DWORD PTR 16[ebx],ecx
+       jz      $L016aw_end
+       ; Tail Round 5
+       mov     ecx,            DWORD PTR 20[esi]
+       mov     edx,            DWORD PTR 20[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       dec     ebp
+       mov     DWORD PTR 20[ebx],ecx
+       jz      $L016aw_end
+       ; Tail Round 6
+       mov     ecx,            DWORD PTR 24[esi]
+       mov     edx,            DWORD PTR 24[edi]
+       sub     ecx,            eax
+       mov     eax,            0
+       adc     eax,            eax
+       sub     ecx,            edx
+       adc     eax,            0
+       mov     DWORD PTR 24[ebx],ecx
+$L016aw_end:
+       pop     edi
+       pop     esi
+       pop     ebx
+       pop     ebp
+       ret
+_bn_sub_words ENDP
+_TEXT  ENDS
+_TEXT  SEGMENT
+PUBLIC _bn_mul_comba8
+
+_bn_mul_comba8 PROC NEAR
+       push    esi
+       mov     esi,            DWORD PTR 12[esp]
+       push    edi
+       mov     edi,            DWORD PTR 20[esp]
+       push    ebp
+       push    ebx
+       xor     ebx,            ebx
+       mov     eax,            DWORD PTR [esi]
+       xor     ecx,            ecx
+       mov     edx,            DWORD PTR [edi]
+       ; ################## Calculate word 0
+       xor     ebp,            ebp
+       ; mul a[0]*b[0]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR [edi]
+       adc     ebp,            0
+       mov     DWORD PTR [eax],ebx
+       mov     eax,            DWORD PTR 4[esi]
+       ; saved r[0]
+       ; ################## Calculate word 1
+       xor     ebx,            ebx
+       ; mul a[1]*b[0]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR [esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 4[edi]
+       adc     ebx,            0
+       ; mul a[0]*b[1]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR [edi]
+       adc     ebx,            0
+       mov     DWORD PTR 4[eax],ecx
+       mov     eax,            DWORD PTR 8[esi]
+       ; saved r[1]
+       ; ################## Calculate word 2
+       xor     ecx,            ecx
+       ; mul a[2]*b[0]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 4[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 4[edi]
+       adc     ecx,            0
+       ; mul a[1]*b[1]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR [esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 8[edi]
+       adc     ecx,            0
+       ; mul a[0]*b[2]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR [edi]
+       adc     ecx,            0
+       mov     DWORD PTR 8[eax],ebp
+       mov     eax,            DWORD PTR 12[esi]
+       ; saved r[2]
+       ; ################## Calculate word 3
+       xor     ebp,            ebp
+       ; mul a[3]*b[0]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 4[edi]
+       adc     ebp,            0
+       ; mul a[2]*b[1]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 4[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 8[edi]
+       adc     ebp,            0
+       ; mul a[1]*b[2]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR [esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 12[edi]
+       adc     ebp,            0
+       ; mul a[0]*b[3]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR [edi]
+       adc     ebp,            0
+       mov     DWORD PTR 12[eax],ebx
+       mov     eax,            DWORD PTR 16[esi]
+       ; saved r[3]
+       ; ################## Calculate word 4
+       xor     ebx,            ebx
+       ; mul a[4]*b[0]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 12[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 4[edi]
+       adc     ebx,            0
+       ; mul a[3]*b[1]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 8[edi]
+       adc     ebx,            0
+       ; mul a[2]*b[2]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 4[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 12[edi]
+       adc     ebx,            0
+       ; mul a[1]*b[3]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR [esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 16[edi]
+       adc     ebx,            0
+       ; mul a[0]*b[4]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR [edi]
+       adc     ebx,            0
+       mov     DWORD PTR 16[eax],ecx
+       mov     eax,            DWORD PTR 20[esi]
+       ; saved r[4]
+       ; ################## Calculate word 5
+       xor     ecx,            ecx
+       ; mul a[5]*b[0]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 16[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 4[edi]
+       adc     ecx,            0
+       ; mul a[4]*b[1]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 12[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 8[edi]
+       adc     ecx,            0
+       ; mul a[3]*b[2]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 12[edi]
+       adc     ecx,            0
+       ; mul a[2]*b[3]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 4[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 16[edi]
+       adc     ecx,            0
+       ; mul a[1]*b[4]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR [esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 20[edi]
+       adc     ecx,            0
+       ; mul a[0]*b[5]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR [edi]
+       adc     ecx,            0
+       mov     DWORD PTR 20[eax],ebp
+       mov     eax,            DWORD PTR 24[esi]
+       ; saved r[5]
+       ; ################## Calculate word 6
+       xor     ebp,            ebp
+       ; mul a[6]*b[0]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 20[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 4[edi]
+       adc     ebp,            0
+       ; mul a[5]*b[1]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 16[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 8[edi]
+       adc     ebp,            0
+       ; mul a[4]*b[2]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 12[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 12[edi]
+       adc     ebp,            0
+       ; mul a[3]*b[3]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 16[edi]
+       adc     ebp,            0
+       ; mul a[2]*b[4]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 4[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 20[edi]
+       adc     ebp,            0
+       ; mul a[1]*b[5]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR [esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 24[edi]
+       adc     ebp,            0
+       ; mul a[0]*b[6]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR [edi]
+       adc     ebp,            0
+       mov     DWORD PTR 24[eax],ebx
+       mov     eax,            DWORD PTR 28[esi]
+       ; saved r[6]
+       ; ################## Calculate word 7
+       xor     ebx,            ebx
+       ; mul a[7]*b[0]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 4[edi]
+       adc     ebx,            0
+       ; mul a[6]*b[1]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 20[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 8[edi]
+       adc     ebx,            0
+       ; mul a[5]*b[2]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 16[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 12[edi]
+       adc     ebx,            0
+       ; mul a[4]*b[3]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 12[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 16[edi]
+       adc     ebx,            0
+       ; mul a[3]*b[4]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 20[edi]
+       adc     ebx,            0
+       ; mul a[2]*b[5]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 4[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 24[edi]
+       adc     ebx,            0
+       ; mul a[1]*b[6]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR [esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 28[edi]
+       adc     ebx,            0
+       ; mul a[0]*b[7]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 4[edi]
+       adc     ebx,            0
+       mov     DWORD PTR 28[eax],ecx
+       mov     eax,            DWORD PTR 28[esi]
+       ; saved r[7]
+       ; ################## Calculate word 8
+       xor     ecx,            ecx
+       ; mul a[7]*b[1]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 8[edi]
+       adc     ecx,            0
+       ; mul a[6]*b[2]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 20[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 12[edi]
+       adc     ecx,            0
+       ; mul a[5]*b[3]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 16[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 16[edi]
+       adc     ecx,            0
+       ; mul a[4]*b[4]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 12[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 20[edi]
+       adc     ecx,            0
+       ; mul a[3]*b[5]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 24[edi]
+       adc     ecx,            0
+       ; mul a[2]*b[6]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 4[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 28[edi]
+       adc     ecx,            0
+       ; mul a[1]*b[7]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 8[edi]
+       adc     ecx,            0
+       mov     DWORD PTR 32[eax],ebp
+       mov     eax,            DWORD PTR 28[esi]
+       ; saved r[8]
+       ; ################## Calculate word 9
+       xor     ebp,            ebp
+       ; mul a[7]*b[2]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 12[edi]
+       adc     ebp,            0
+       ; mul a[6]*b[3]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 20[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 16[edi]
+       adc     ebp,            0
+       ; mul a[5]*b[4]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 16[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 20[edi]
+       adc     ebp,            0
+       ; mul a[4]*b[5]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 12[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 24[edi]
+       adc     ebp,            0
+       ; mul a[3]*b[6]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 28[edi]
+       adc     ebp,            0
+       ; mul a[2]*b[7]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 12[edi]
+       adc     ebp,            0
+       mov     DWORD PTR 36[eax],ebx
+       mov     eax,            DWORD PTR 28[esi]
+       ; saved r[9]
+       ; ################## Calculate word 10
+       xor     ebx,            ebx
+       ; mul a[7]*b[3]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 16[edi]
+       adc     ebx,            0
+       ; mul a[6]*b[4]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 20[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 20[edi]
+       adc     ebx,            0
+       ; mul a[5]*b[5]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 16[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 24[edi]
+       adc     ebx,            0
+       ; mul a[4]*b[6]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 12[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 28[edi]
+       adc     ebx,            0
+       ; mul a[3]*b[7]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 16[edi]
+       adc     ebx,            0
+       mov     DWORD PTR 40[eax],ecx
+       mov     eax,            DWORD PTR 28[esi]
+       ; saved r[10]
+       ; ################## Calculate word 11
+       xor     ecx,            ecx
+       ; mul a[7]*b[4]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 20[edi]
+       adc     ecx,            0
+       ; mul a[6]*b[5]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 20[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 24[edi]
+       adc     ecx,            0
+       ; mul a[5]*b[6]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 16[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 28[edi]
+       adc     ecx,            0
+       ; mul a[4]*b[7]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 20[edi]
+       adc     ecx,            0
+       mov     DWORD PTR 44[eax],ebp
+       mov     eax,            DWORD PTR 28[esi]
+       ; saved r[11]
+       ; ################## Calculate word 12
+       xor     ebp,            ebp
+       ; mul a[7]*b[5]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 24[edi]
+       adc     ebp,            0
+       ; mul a[6]*b[6]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 20[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 28[edi]
+       adc     ebp,            0
+       ; mul a[5]*b[7]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 24[edi]
+       adc     ebp,            0
+       mov     DWORD PTR 48[eax],ebx
+       mov     eax,            DWORD PTR 28[esi]
+       ; saved r[12]
+       ; ################## Calculate word 13
+       xor     ebx,            ebx
+       ; mul a[7]*b[6]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 28[edi]
+       adc     ebx,            0
+       ; mul a[6]*b[7]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 28[edi]
+       adc     ebx,            0
+       mov     DWORD PTR 52[eax],ecx
+       mov     eax,            DWORD PTR 28[esi]
+       ; saved r[13]
+       ; ################## Calculate word 14
+       xor     ecx,            ecx
+       ; mul a[7]*b[7]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebx,            edx
+       adc     ecx,            0
+       mov     DWORD PTR 56[eax],ebp
+       ; saved r[14]
+       ; save r[15]
+       mov     DWORD PTR 60[eax],ebx
+       pop     ebx
+       pop     ebp
+       pop     edi
+       pop     esi
+       ret
+_bn_mul_comba8 ENDP
+_TEXT  ENDS
+_TEXT  SEGMENT
+PUBLIC _bn_mul_comba4
+
+_bn_mul_comba4 PROC NEAR
+       push    esi
+       mov     esi,            DWORD PTR 12[esp]
+       push    edi
+       mov     edi,            DWORD PTR 20[esp]
+       push    ebp
+       push    ebx
+       xor     ebx,            ebx
+       mov     eax,            DWORD PTR [esi]
+       xor     ecx,            ecx
+       mov     edx,            DWORD PTR [edi]
+       ; ################## Calculate word 0
+       xor     ebp,            ebp
+       ; mul a[0]*b[0]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR [edi]
+       adc     ebp,            0
+       mov     DWORD PTR [eax],ebx
+       mov     eax,            DWORD PTR 4[esi]
+       ; saved r[0]
+       ; ################## Calculate word 1
+       xor     ebx,            ebx
+       ; mul a[1]*b[0]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR [esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 4[edi]
+       adc     ebx,            0
+       ; mul a[0]*b[1]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR [edi]
+       adc     ebx,            0
+       mov     DWORD PTR 4[eax],ecx
+       mov     eax,            DWORD PTR 8[esi]
+       ; saved r[1]
+       ; ################## Calculate word 2
+       xor     ecx,            ecx
+       ; mul a[2]*b[0]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 4[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 4[edi]
+       adc     ecx,            0
+       ; mul a[1]*b[1]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR [esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 8[edi]
+       adc     ecx,            0
+       ; mul a[0]*b[2]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR [edi]
+       adc     ecx,            0
+       mov     DWORD PTR 8[eax],ebp
+       mov     eax,            DWORD PTR 12[esi]
+       ; saved r[2]
+       ; ################## Calculate word 3
+       xor     ebp,            ebp
+       ; mul a[3]*b[0]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 4[edi]
+       adc     ebp,            0
+       ; mul a[2]*b[1]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 4[esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 8[edi]
+       adc     ebp,            0
+       ; mul a[1]*b[2]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR [esi]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 12[edi]
+       adc     ebp,            0
+       ; mul a[0]*b[3]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 4[edi]
+       adc     ebp,            0
+       mov     DWORD PTR 12[eax],ebx
+       mov     eax,            DWORD PTR 12[esi]
+       ; saved r[3]
+       ; ################## Calculate word 4
+       xor     ebx,            ebx
+       ; mul a[3]*b[1]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 8[edi]
+       adc     ebx,            0
+       ; mul a[2]*b[2]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 4[esi]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 12[edi]
+       adc     ebx,            0
+       ; mul a[1]*b[3]
+       mul     edx
+       add     ecx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 8[edi]
+       adc     ebx,            0
+       mov     DWORD PTR 16[eax],ecx
+       mov     eax,            DWORD PTR 12[esi]
+       ; saved r[4]
+       ; ################## Calculate word 5
+       xor     ecx,            ecx
+       ; mul a[3]*b[2]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 12[edi]
+       adc     ecx,            0
+       ; mul a[2]*b[3]
+       mul     edx
+       add     ebp,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 12[edi]
+       adc     ecx,            0
+       mov     DWORD PTR 20[eax],ebp
+       mov     eax,            DWORD PTR 12[esi]
+       ; saved r[5]
+       ; ################## Calculate word 6
+       xor     ebp,            ebp
+       ; mul a[3]*b[3]
+       mul     edx
+       add     ebx,            eax
+       mov     eax,            DWORD PTR 20[esp]
+       adc     ecx,            edx
+       adc     ebp,            0
+       mov     DWORD PTR 24[eax],ebx
+       ; saved r[6]
+       ; save r[7]
+       mov     DWORD PTR 28[eax],ecx
+       pop     ebx
+       pop     ebp
+       pop     edi
+       pop     esi
+       ret
+_bn_mul_comba4 ENDP
+_TEXT  ENDS
+_TEXT  SEGMENT
+PUBLIC _bn_sqr_comba8
+
+_bn_sqr_comba8 PROC NEAR
+       push    esi
+       push    edi
+       push    ebp
+       push    ebx
+       mov     edi,            DWORD PTR 20[esp]
+       mov     esi,            DWORD PTR 24[esp]
+       xor     ebx,            ebx
+       xor     ecx,            ecx
+       mov     eax,            DWORD PTR [esi]
+       ; ############### Calculate word 0
+       xor     ebp,            ebp
+       ; sqr a[0]*a[0]
+       mul     eax
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR [esi]
+       adc     ebp,            0
+       mov     DWORD PTR [edi],ebx
+       mov     eax,            DWORD PTR 4[esi]
+       ; saved r[0]
+       ; ############### Calculate word 1
+       xor     ebx,            ebx
+       ; sqr a[1]*a[0]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebx,            0
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ebx,            0
+       mov     DWORD PTR 4[edi],ecx
+       mov     edx,            DWORD PTR [esi]
+       ; saved r[1]
+       ; ############### Calculate word 2
+       xor     ecx,            ecx
+       ; sqr a[2]*a[0]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ecx,            0
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     eax,            DWORD PTR 4[esi]
+       adc     ecx,            0
+       ; sqr a[1]*a[1]
+       mul     eax
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR [esi]
+       adc     ecx,            0
+       mov     DWORD PTR 8[edi],ebp
+       mov     eax,            DWORD PTR 12[esi]
+       ; saved r[2]
+       ; ############### Calculate word 3
+       xor     ebp,            ebp
+       ; sqr a[3]*a[0]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebp,            0
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ebp,            0
+       mov     edx,            DWORD PTR 4[esi]
+       ; sqr a[2]*a[1]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebp,            0
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     eax,            DWORD PTR 16[esi]
+       adc     ebp,            0
+       mov     DWORD PTR 12[edi],ebx
+       mov     edx,            DWORD PTR [esi]
+       ; saved r[3]
+       ; ############### Calculate word 4
+       xor     ebx,            ebx
+       ; sqr a[4]*a[0]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebx,            0
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     eax,            DWORD PTR 12[esi]
+       adc     ebx,            0
+       mov     edx,            DWORD PTR 4[esi]
+       ; sqr a[3]*a[1]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebx,            0
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ebx,            0
+       ; sqr a[2]*a[2]
+       mul     eax
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR [esi]
+       adc     ebx,            0
+       mov     DWORD PTR 16[edi],ecx
+       mov     eax,            DWORD PTR 20[esi]
+       ; saved r[4]
+       ; ############### Calculate word 5
+       xor     ecx,            ecx
+       ; sqr a[5]*a[0]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ecx,            0
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     eax,            DWORD PTR 16[esi]
+       adc     ecx,            0
+       mov     edx,            DWORD PTR 4[esi]
+       ; sqr a[4]*a[1]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ecx,            0
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     eax,            DWORD PTR 12[esi]
+       adc     ecx,            0
+       mov     edx,            DWORD PTR 8[esi]
+       ; sqr a[3]*a[2]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ecx,            0
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ecx,            0
+       mov     DWORD PTR 20[edi],ebp
+       mov     edx,            DWORD PTR [esi]
+       ; saved r[5]
+       ; ############### Calculate word 6
+       xor     ebp,            ebp
+       ; sqr a[6]*a[0]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebp,            0
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     eax,            DWORD PTR 20[esi]
+       adc     ebp,            0
+       mov     edx,            DWORD PTR 4[esi]
+       ; sqr a[5]*a[1]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebp,            0
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     eax,            DWORD PTR 16[esi]
+       adc     ebp,            0
+       mov     edx,            DWORD PTR 8[esi]
+       ; sqr a[4]*a[2]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebp,            0
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     eax,            DWORD PTR 12[esi]
+       adc     ebp,            0
+       ; sqr a[3]*a[3]
+       mul     eax
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR [esi]
+       adc     ebp,            0
+       mov     DWORD PTR 24[edi],ebx
+       mov     eax,            DWORD PTR 28[esi]
+       ; saved r[6]
+       ; ############### Calculate word 7
+       xor     ebx,            ebx
+       ; sqr a[7]*a[0]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebx,            0
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ebx,            0
+       mov     edx,            DWORD PTR 4[esi]
+       ; sqr a[6]*a[1]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebx,            0
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     eax,            DWORD PTR 20[esi]
+       adc     ebx,            0
+       mov     edx,            DWORD PTR 8[esi]
+       ; sqr a[5]*a[2]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebx,            0
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     eax,            DWORD PTR 16[esi]
+       adc     ebx,            0
+       mov     edx,            DWORD PTR 12[esi]
+       ; sqr a[4]*a[3]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebx,            0
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     eax,            DWORD PTR 28[esi]
+       adc     ebx,            0
+       mov     DWORD PTR 28[edi],ecx
+       mov     edx,            DWORD PTR 4[esi]
+       ; saved r[7]
+       ; ############### Calculate word 8
+       xor     ecx,            ecx
+       ; sqr a[7]*a[1]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ecx,            0
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ecx,            0
+       mov     edx,            DWORD PTR 8[esi]
+       ; sqr a[6]*a[2]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ecx,            0
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     eax,            DWORD PTR 20[esi]
+       adc     ecx,            0
+       mov     edx,            DWORD PTR 12[esi]
+       ; sqr a[5]*a[3]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ecx,            0
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     eax,            DWORD PTR 16[esi]
+       adc     ecx,            0
+       ; sqr a[4]*a[4]
+       mul     eax
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR 8[esi]
+       adc     ecx,            0
+       mov     DWORD PTR 32[edi],ebp
+       mov     eax,            DWORD PTR 28[esi]
+       ; saved r[8]
+       ; ############### Calculate word 9
+       xor     ebp,            ebp
+       ; sqr a[7]*a[2]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebp,            0
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ebp,            0
+       mov     edx,            DWORD PTR 12[esi]
+       ; sqr a[6]*a[3]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebp,            0
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     eax,            DWORD PTR 20[esi]
+       adc     ebp,            0
+       mov     edx,            DWORD PTR 16[esi]
+       ; sqr a[5]*a[4]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebp,            0
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     eax,            DWORD PTR 28[esi]
+       adc     ebp,            0
+       mov     DWORD PTR 36[edi],ebx
+       mov     edx,            DWORD PTR 12[esi]
+       ; saved r[9]
+       ; ############### Calculate word 10
+       xor     ebx,            ebx
+       ; sqr a[7]*a[3]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebx,            0
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ebx,            0
+       mov     edx,            DWORD PTR 16[esi]
+       ; sqr a[6]*a[4]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebx,            0
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     eax,            DWORD PTR 20[esi]
+       adc     ebx,            0
+       ; sqr a[5]*a[5]
+       mul     eax
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 16[esi]
+       adc     ebx,            0
+       mov     DWORD PTR 40[edi],ecx
+       mov     eax,            DWORD PTR 28[esi]
+       ; saved r[10]
+       ; ############### Calculate word 11
+       xor     ecx,            ecx
+       ; sqr a[7]*a[4]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ecx,            0
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ecx,            0
+       mov     edx,            DWORD PTR 20[esi]
+       ; sqr a[6]*a[5]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ecx,            0
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     eax,            DWORD PTR 28[esi]
+       adc     ecx,            0
+       mov     DWORD PTR 44[edi],ebp
+       mov     edx,            DWORD PTR 20[esi]
+       ; saved r[11]
+       ; ############### Calculate word 12
+       xor     ebp,            ebp
+       ; sqr a[7]*a[5]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebp,            0
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     eax,            DWORD PTR 24[esi]
+       adc     ebp,            0
+       ; sqr a[6]*a[6]
+       mul     eax
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR 24[esi]
+       adc     ebp,            0
+       mov     DWORD PTR 48[edi],ebx
+       mov     eax,            DWORD PTR 28[esi]
+       ; saved r[12]
+       ; ############### Calculate word 13
+       xor     ebx,            ebx
+       ; sqr a[7]*a[6]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebx,            0
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     eax,            DWORD PTR 28[esi]
+       adc     ebx,            0
+       mov     DWORD PTR 52[edi],ecx
+       ; saved r[13]
+       ; ############### Calculate word 14
+       xor     ecx,            ecx
+       ; sqr a[7]*a[7]
+       mul     eax
+       add     ebp,            eax
+       adc     ebx,            edx
+       adc     ecx,            0
+       mov     DWORD PTR 56[edi],ebp
+       ; saved r[14]
+       mov     DWORD PTR 60[edi],ebx
+       pop     ebx
+       pop     ebp
+       pop     edi
+       pop     esi
+       ret
+_bn_sqr_comba8 ENDP
+_TEXT  ENDS
+_TEXT  SEGMENT
+PUBLIC _bn_sqr_comba4
+
+_bn_sqr_comba4 PROC NEAR
+       push    esi
+       push    edi
+       push    ebp
+       push    ebx
+       mov     edi,            DWORD PTR 20[esp]
+       mov     esi,            DWORD PTR 24[esp]
+       xor     ebx,            ebx
+       xor     ecx,            ecx
+       mov     eax,            DWORD PTR [esi]
+       ; ############### Calculate word 0
+       xor     ebp,            ebp
+       ; sqr a[0]*a[0]
+       mul     eax
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     edx,            DWORD PTR [esi]
+       adc     ebp,            0
+       mov     DWORD PTR [edi],ebx
+       mov     eax,            DWORD PTR 4[esi]
+       ; saved r[0]
+       ; ############### Calculate word 1
+       xor     ebx,            ebx
+       ; sqr a[1]*a[0]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebx,            0
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ebx,            0
+       mov     DWORD PTR 4[edi],ecx
+       mov     edx,            DWORD PTR [esi]
+       ; saved r[1]
+       ; ############### Calculate word 2
+       xor     ecx,            ecx
+       ; sqr a[2]*a[0]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ecx,            0
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     eax,            DWORD PTR 4[esi]
+       adc     ecx,            0
+       ; sqr a[1]*a[1]
+       mul     eax
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     edx,            DWORD PTR [esi]
+       adc     ecx,            0
+       mov     DWORD PTR 8[edi],ebp
+       mov     eax,            DWORD PTR 12[esi]
+       ; saved r[2]
+       ; ############### Calculate word 3
+       xor     ebp,            ebp
+       ; sqr a[3]*a[0]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebp,            0
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ebp,            0
+       mov     edx,            DWORD PTR 4[esi]
+       ; sqr a[2]*a[1]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebp,            0
+       add     ebx,            eax
+       adc     ecx,            edx
+       mov     eax,            DWORD PTR 12[esi]
+       adc     ebp,            0
+       mov     DWORD PTR 12[edi],ebx
+       mov     edx,            DWORD PTR 4[esi]
+       ; saved r[3]
+       ; ############### Calculate word 4
+       xor     ebx,            ebx
+       ; sqr a[3]*a[1]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ebx,            0
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     eax,            DWORD PTR 8[esi]
+       adc     ebx,            0
+       ; sqr a[2]*a[2]
+       mul     eax
+       add     ecx,            eax
+       adc     ebp,            edx
+       mov     edx,            DWORD PTR 8[esi]
+       adc     ebx,            0
+       mov     DWORD PTR 16[edi],ecx
+       mov     eax,            DWORD PTR 12[esi]
+       ; saved r[4]
+       ; ############### Calculate word 5
+       xor     ecx,            ecx
+       ; sqr a[3]*a[2]
+       mul     edx
+       add     eax,            eax
+       adc     edx,            edx
+       adc     ecx,            0
+       add     ebp,            eax
+       adc     ebx,            edx
+       mov     eax,            DWORD PTR 12[esi]
+       adc     ecx,            0
+       mov     DWORD PTR 20[edi],ebp
+       ; saved r[5]
+       ; ############### Calculate word 6
+       xor     ebp,            ebp
+       ; sqr a[3]*a[3]
+       mul     eax
+       add     ebx,            eax
+       adc     ecx,            edx
+       adc     ebp,            0
+       mov     DWORD PTR 24[edi],ebx
+       ; saved r[6]
+       mov     DWORD PTR 28[edi],ecx
+       pop     ebx
+       pop     ebp
+       pop     edi
+       pop     esi
+       ret
+_bn_sqr_comba4 ENDP
+_TEXT  ENDS
 END
index 64702201eab6b856c2ef7ae9f8ac7f6c22fc81d9..639a3ac41cb5bb97a19058c73cd42bf079ecc59e 100644 (file)
 #define bn_mul_add_words _bn_mul_add_words
 #define bn_mul_words _bn_mul_words
 #define bn_sqr_words _bn_sqr_words
-#define bn_div64 _bn_div64
+#define bn_div_words _bn_div_words
 #define bn_add_words _bn_add_words
+#define bn_sub_words _bn_sub_words
+#define bn_mul_comba8 _bn_mul_comba8
+#define bn_mul_comba4 _bn_mul_comba4
+#define bn_sqr_comba8 _bn_sqr_comba8
+#define bn_sqr_comba4 _bn_sqr_comba4
 
 #endif
 
@@ -544,9 +549,9 @@ bn_sqr_words:
 .ident "bn_sqr_words"
 .text
        .align ALIGN
-.globl bn_div64
-       TYPE(bn_div64,@function)
-bn_div64:
+.globl bn_div_words
+       TYPE(bn_div_words,@function)
+bn_div_words:
        pushl   %ebp
        pushl   %ebx
        pushl   %esi
@@ -561,9 +566,9 @@ bn_div64:
        popl    %ebx
        popl    %ebp
        ret
-.bn_div64_end:
-       SIZE(bn_div64,.bn_div64_end-bn_div64)
-.ident "bn_div64"
+.bn_div_words_end:
+       SIZE(bn_div_words,.bn_div_words_end-bn_div_words)
+.ident "bn_div_words"
 .text
        .align ALIGN
 .globl bn_add_words
@@ -741,7 +746,6 @@ bn_add_words:
        adcl    $0,             %eax
        movl    %ecx,           24(%ebx)
 .L013aw_end:
-       movl    %eax,           %eax
        popl    %edi
        popl    %esi
        popl    %ebx
@@ -750,3 +754,1448 @@ bn_add_words:
 .bn_add_words_end:
        SIZE(bn_add_words,.bn_add_words_end-bn_add_words)
 .ident "bn_add_words"
+.text
+       .align ALIGN
+.globl bn_sub_words
+       TYPE(bn_sub_words,@function)
+bn_sub_words:
+       pushl   %ebp
+       pushl   %ebx
+       pushl   %esi
+       pushl   %edi
+
+
+       movl    20(%esp),       %ebx
+       movl    24(%esp),       %esi
+       movl    28(%esp),       %edi
+       movl    32(%esp),       %ebp
+       xorl    %eax,           %eax
+       andl    $4294967288,    %ebp
+       jz      .L014aw_finish
+.L015aw_loop:
+       /* Round 0 */
+       movl    (%esi),         %ecx
+       movl    (%edi),         %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           (%ebx)
+       /* Round 1 */
+       movl    4(%esi),        %ecx
+       movl    4(%edi),        %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           4(%ebx)
+       /* Round 2 */
+       movl    8(%esi),        %ecx
+       movl    8(%edi),        %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           8(%ebx)
+       /* Round 3 */
+       movl    12(%esi),       %ecx
+       movl    12(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           12(%ebx)
+       /* Round 4 */
+       movl    16(%esi),       %ecx
+       movl    16(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           16(%ebx)
+       /* Round 5 */
+       movl    20(%esi),       %ecx
+       movl    20(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           20(%ebx)
+       /* Round 6 */
+       movl    24(%esi),       %ecx
+       movl    24(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           24(%ebx)
+       /* Round 7 */
+       movl    28(%esi),       %ecx
+       movl    28(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           28(%ebx)
+
+       addl    $32,            %esi
+       addl    $32,            %edi
+       addl    $32,            %ebx
+       subl    $8,             %ebp
+       jnz     .L015aw_loop
+.L014aw_finish:
+       movl    32(%esp),       %ebp
+       andl    $7,             %ebp
+       jz      .L016aw_end
+       /* Tail Round 0 */
+       movl    (%esi),         %ecx
+       movl    (%edi),         %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           (%ebx)
+       jz      .L016aw_end
+       /* Tail Round 1 */
+       movl    4(%esi),        %ecx
+       movl    4(%edi),        %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           4(%ebx)
+       jz      .L016aw_end
+       /* Tail Round 2 */
+       movl    8(%esi),        %ecx
+       movl    8(%edi),        %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           8(%ebx)
+       jz      .L016aw_end
+       /* Tail Round 3 */
+       movl    12(%esi),       %ecx
+       movl    12(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           12(%ebx)
+       jz      .L016aw_end
+       /* Tail Round 4 */
+       movl    16(%esi),       %ecx
+       movl    16(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           16(%ebx)
+       jz      .L016aw_end
+       /* Tail Round 5 */
+       movl    20(%esi),       %ecx
+       movl    20(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           20(%ebx)
+       jz      .L016aw_end
+       /* Tail Round 6 */
+       movl    24(%esi),       %ecx
+       movl    24(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           24(%ebx)
+.L016aw_end:
+       popl    %edi
+       popl    %esi
+       popl    %ebx
+       popl    %ebp
+       ret
+.bn_sub_words_end:
+       SIZE(bn_sub_words,.bn_sub_words_end-bn_sub_words)
+.ident "bn_sub_words"
+.text
+       .align ALIGN
+.globl bn_mul_comba8
+       TYPE(bn_mul_comba8,@function)
+bn_mul_comba8:
+       pushl   %esi
+       movl    12(%esp),       %esi
+       pushl   %edi
+       movl    20(%esp),       %edi
+       pushl   %ebp
+       pushl   %ebx
+       xorl    %ebx,           %ebx
+       movl    (%esi),         %eax
+       xorl    %ecx,           %ecx
+       movl    (%edi),         %edx
+       /* ################## Calculate word 0 */
+       xorl    %ebp,           %ebp
+       /* mul a[0]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%eax)
+       movl    4(%esi),        %eax
+       /* saved r[0] */
+       /* ################## Calculate word 1 */
+       xorl    %ebx,           %ebx
+       /* mul a[1]*b[0] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[0]*b[1] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    (%edi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%eax)
+       movl    8(%esi),        %eax
+       /* saved r[1] */
+       /* ################## Calculate word 2 */
+       xorl    %ecx,           %ecx
+       /* mul a[2]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[1]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[0]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    (%edi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%eax)
+       movl    12(%esi),       %eax
+       /* saved r[2] */
+       /* ################## Calculate word 3 */
+       xorl    %ebp,           %ebp
+       /* mul a[3]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       /* mul a[2]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebp
+       /* mul a[1]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[0]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%eax)
+       movl    16(%esi),       %eax
+       /* saved r[3] */
+       /* ################## Calculate word 4 */
+       xorl    %ebx,           %ebx
+       /* mul a[4]*b[0] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[3]*b[1] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[2]*b[2] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[1]*b[3] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[0]*b[4] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    (%edi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%eax)
+       movl    20(%esi),       %eax
+       /* saved r[4] */
+       /* ################## Calculate word 5 */
+       xorl    %ecx,           %ecx
+       /* mul a[5]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[4]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[3]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[2]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[1]*b[4] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[0]*b[5] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    (%edi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%eax)
+       movl    24(%esi),       %eax
+       /* saved r[5] */
+       /* ################## Calculate word 6 */
+       xorl    %ebp,           %ebp
+       /* mul a[6]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       /* mul a[5]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebp
+       /* mul a[4]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[3]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[2]*b[4] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[1]*b[5] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[0]*b[6] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[6] */
+       /* ################## Calculate word 7 */
+       xorl    %ebx,           %ebx
+       /* mul a[7]*b[0] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[6]*b[1] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[5]*b[2] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[4]*b[3] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[3]*b[4] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[2]*b[5] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[1]*b[6] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[0]*b[7] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           28(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[7] */
+       /* ################## Calculate word 8 */
+       xorl    %ecx,           %ecx
+       /* mul a[7]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[6]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[5]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[4]*b[4] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[3]*b[5] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[2]*b[6] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[1]*b[7] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           32(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[8] */
+       /* ################## Calculate word 9 */
+       xorl    %ebp,           %ebp
+       /* mul a[7]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[6]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[5]*b[4] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[4]*b[5] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[3]*b[6] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[2]*b[7] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           36(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[9] */
+       /* ################## Calculate word 10 */
+       xorl    %ebx,           %ebx
+       /* mul a[7]*b[3] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[6]*b[4] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[5]*b[5] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[4]*b[6] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[3]*b[7] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           40(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[10] */
+       /* ################## Calculate word 11 */
+       xorl    %ecx,           %ecx
+       /* mul a[7]*b[4] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[6]*b[5] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[5]*b[6] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[4]*b[7] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           44(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[11] */
+       /* ################## Calculate word 12 */
+       xorl    %ebp,           %ebp
+       /* mul a[7]*b[5] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[6]*b[6] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[5]*b[7] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           48(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[12] */
+       /* ################## Calculate word 13 */
+       xorl    %ebx,           %ebx
+       /* mul a[7]*b[6] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[6]*b[7] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           52(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[13] */
+       /* ################## Calculate word 14 */
+       xorl    %ecx,           %ecx
+       /* mul a[7]*b[7] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       adcl    $0,             %ecx
+       movl    %ebp,           56(%eax)
+       /* saved r[14] */
+       /* save r[15] */
+       movl    %ebx,           60(%eax)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_mul_comba8_end:
+       SIZE(bn_mul_comba8,.bn_mul_comba8_end-bn_mul_comba8)
+.ident "desasm.pl"
+.text
+       .align ALIGN
+.globl bn_mul_comba4
+       TYPE(bn_mul_comba4,@function)
+bn_mul_comba4:
+       pushl   %esi
+       movl    12(%esp),       %esi
+       pushl   %edi
+       movl    20(%esp),       %edi
+       pushl   %ebp
+       pushl   %ebx
+       xorl    %ebx,           %ebx
+       movl    (%esi),         %eax
+       xorl    %ecx,           %ecx
+       movl    (%edi),         %edx
+       /* ################## Calculate word 0 */
+       xorl    %ebp,           %ebp
+       /* mul a[0]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%eax)
+       movl    4(%esi),        %eax
+       /* saved r[0] */
+       /* ################## Calculate word 1 */
+       xorl    %ebx,           %ebx
+       /* mul a[1]*b[0] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[0]*b[1] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    (%edi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%eax)
+       movl    8(%esi),        %eax
+       /* saved r[1] */
+       /* ################## Calculate word 2 */
+       xorl    %ecx,           %ecx
+       /* mul a[2]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[1]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[0]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    (%edi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%eax)
+       movl    12(%esi),       %eax
+       /* saved r[2] */
+       /* ################## Calculate word 3 */
+       xorl    %ebp,           %ebp
+       /* mul a[3]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       /* mul a[2]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebp
+       /* mul a[1]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[0]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%eax)
+       movl    12(%esi),       %eax
+       /* saved r[3] */
+       /* ################## Calculate word 4 */
+       xorl    %ebx,           %ebx
+       /* mul a[3]*b[1] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[2]*b[2] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[1]*b[3] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%eax)
+       movl    12(%esi),       %eax
+       /* saved r[4] */
+       /* ################## Calculate word 5 */
+       xorl    %ecx,           %ecx
+       /* mul a[3]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[2]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%eax)
+       movl    12(%esi),       %eax
+       /* saved r[5] */
+       /* ################## Calculate word 6 */
+       xorl    %ebp,           %ebp
+       /* mul a[3]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%eax)
+       /* saved r[6] */
+       /* save r[7] */
+       movl    %ecx,           28(%eax)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_mul_comba4_end:
+       SIZE(bn_mul_comba4,.bn_mul_comba4_end-bn_mul_comba4)
+.ident "desasm.pl"
+.text
+       .align ALIGN
+.globl bn_sqr_comba8
+       TYPE(bn_sqr_comba8,@function)
+bn_sqr_comba8:
+       pushl   %esi
+       pushl   %edi
+       pushl   %ebp
+       pushl   %ebx
+       movl    20(%esp),       %edi
+       movl    24(%esp),       %esi
+       xorl    %ebx,           %ebx
+       xorl    %ecx,           %ecx
+       movl    (%esi),         %eax
+       /* ############### Calculate word 0 */
+       xorl    %ebp,           %ebp
+       /* sqr a[0]*a[0] */
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    (%esi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%edi)
+       movl    4(%esi),        %eax
+       /* saved r[0] */
+       /* ############### Calculate word 1 */
+       xorl    %ebx,           %ebx
+       /* sqr a[1]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%edi)
+       movl    (%esi),         %edx
+       /* saved r[1] */
+       /* ############### Calculate word 2 */
+       xorl    %ecx,           %ecx
+       /* sqr a[2]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    4(%esi),        %eax
+       adcl    $0,             %ecx
+       /* sqr a[1]*a[1] */
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    (%esi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%edi)
+       movl    12(%esi),       %eax
+       /* saved r[2] */
+       /* ############### Calculate word 3 */
+       xorl    %ebp,           %ebp
+       /* sqr a[3]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebp
+       movl    4(%esi),        %edx
+       /* sqr a[2]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%edi)
+       movl    (%esi),         %edx
+       /* saved r[3] */
+       /* ############### Calculate word 4 */
+       xorl    %ebx,           %ebx
+       /* sqr a[4]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    12(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    4(%esi),        %edx
+       /* sqr a[3]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       /* sqr a[2]*a[2] */
+       mull    %eax
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    (%esi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%edi)
+       movl    20(%esi),       %eax
+       /* saved r[4] */
+       /* ############### Calculate word 5 */
+       xorl    %ecx,           %ecx
+       /* sqr a[5]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    4(%esi),        %edx
+       /* sqr a[4]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    8(%esi),        %edx
+       /* sqr a[3]*a[2] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%edi)
+       movl    (%esi),         %edx
+       /* saved r[5] */
+       /* ############### Calculate word 6 */
+       xorl    %ebp,           %ebp
+       /* sqr a[6]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    4(%esi),        %edx
+       /* sqr a[5]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    8(%esi),        %edx
+       /* sqr a[4]*a[2] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ebp
+       /* sqr a[3]*a[3] */
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    (%esi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%edi)
+       movl    28(%esi),       %eax
+       /* saved r[6] */
+       /* ############### Calculate word 7 */
+       xorl    %ebx,           %ebx
+       /* sqr a[7]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    4(%esi),        %edx
+       /* sqr a[6]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    8(%esi),        %edx
+       /* sqr a[5]*a[2] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    16(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    12(%esi),       %edx
+       /* sqr a[4]*a[3] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    28(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           28(%edi)
+       movl    4(%esi),        %edx
+       /* saved r[7] */
+       /* ############### Calculate word 8 */
+       xorl    %ecx,           %ecx
+       /* sqr a[7]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    8(%esi),        %edx
+       /* sqr a[6]*a[2] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    20(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    12(%esi),       %edx
+       /* sqr a[5]*a[3] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ecx
+       /* sqr a[4]*a[4] */
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    8(%esi),        %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           32(%edi)
+       movl    28(%esi),       %eax
+       /* saved r[8] */
+       /* ############### Calculate word 9 */
+       xorl    %ebp,           %ebp
+       /* sqr a[7]*a[2] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    12(%esi),       %edx
+       /* sqr a[6]*a[3] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    16(%esi),       %edx
+       /* sqr a[5]*a[4] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    28(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    %ebx,           36(%edi)
+       movl    12(%esi),       %edx
+       /* saved r[9] */
+       /* ############### Calculate word 10 */
+       xorl    %ebx,           %ebx
+       /* sqr a[7]*a[3] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    16(%esi),       %edx
+       /* sqr a[6]*a[4] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebx
+       /* sqr a[5]*a[5] */
+       mull    %eax
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    16(%esi),       %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           40(%edi)
+       movl    28(%esi),       %eax
+       /* saved r[10] */
+       /* ############### Calculate word 11 */
+       xorl    %ecx,           %ecx
+       /* sqr a[7]*a[4] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    20(%esi),       %edx
+       /* sqr a[6]*a[5] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    28(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    %ebp,           44(%edi)
+       movl    20(%esi),       %edx
+       /* saved r[11] */
+       /* ############### Calculate word 12 */
+       xorl    %ebp,           %ebp
+       /* sqr a[7]*a[5] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebp
+       /* sqr a[6]*a[6] */
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    24(%esi),       %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           48(%edi)
+       movl    28(%esi),       %eax
+       /* saved r[12] */
+       /* ############### Calculate word 13 */
+       xorl    %ebx,           %ebx
+       /* sqr a[7]*a[6] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    28(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           52(%edi)
+       /* saved r[13] */
+       /* ############### Calculate word 14 */
+       xorl    %ecx,           %ecx
+       /* sqr a[7]*a[7] */
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       adcl    $0,             %ecx
+       movl    %ebp,           56(%edi)
+       /* saved r[14] */
+       movl    %ebx,           60(%edi)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_sqr_comba8_end:
+       SIZE(bn_sqr_comba8,.bn_sqr_comba8_end-bn_sqr_comba8)
+.ident "desasm.pl"
+.text
+       .align ALIGN
+.globl bn_sqr_comba4
+       TYPE(bn_sqr_comba4,@function)
+bn_sqr_comba4:
+       pushl   %esi
+       pushl   %edi
+       pushl   %ebp
+       pushl   %ebx
+       movl    20(%esp),       %edi
+       movl    24(%esp),       %esi
+       xorl    %ebx,           %ebx
+       xorl    %ecx,           %ecx
+       movl    (%esi),         %eax
+       /* ############### Calculate word 0 */
+       xorl    %ebp,           %ebp
+       /* sqr a[0]*a[0] */
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    (%esi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%edi)
+       movl    4(%esi),        %eax
+       /* saved r[0] */
+       /* ############### Calculate word 1 */
+       xorl    %ebx,           %ebx
+       /* sqr a[1]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%edi)
+       movl    (%esi),         %edx
+       /* saved r[1] */
+       /* ############### Calculate word 2 */
+       xorl    %ecx,           %ecx
+       /* sqr a[2]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    4(%esi),        %eax
+       adcl    $0,             %ecx
+       /* sqr a[1]*a[1] */
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    (%esi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%edi)
+       movl    12(%esi),       %eax
+       /* saved r[2] */
+       /* ############### Calculate word 3 */
+       xorl    %ebp,           %ebp
+       /* sqr a[3]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebp
+       movl    4(%esi),        %edx
+       /* sqr a[2]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%edi)
+       movl    4(%esi),        %edx
+       /* saved r[3] */
+       /* ############### Calculate word 4 */
+       xorl    %ebx,           %ebx
+       /* sqr a[3]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       /* sqr a[2]*a[2] */
+       mull    %eax
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%edi)
+       movl    12(%esi),       %eax
+       /* saved r[4] */
+       /* ############### Calculate word 5 */
+       xorl    %ecx,           %ecx
+       /* sqr a[3]*a[2] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%edi)
+       /* saved r[5] */
+       /* ############### Calculate word 6 */
+       xorl    %ebp,           %ebp
+       /* sqr a[3]*a[3] */
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%edi)
+       /* saved r[6] */
+       movl    %ecx,           28(%edi)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_sqr_comba4_end:
+       SIZE(bn_sqr_comba4,.bn_sqr_comba4_end-bn_sqr_comba4)
+.ident "desasm.pl"
diff --git a/crypto/bn/asm/ca.pl b/crypto/bn/asm/ca.pl
new file mode 100644 (file)
index 0000000..181d1f0
--- /dev/null
@@ -0,0 +1,33 @@
+#!/usr/local/bin/perl
+# I have this in perl so I can use more usefull register names and then convert
+# them into alpha registers.
+#
+
+push(@INC,"perlasm","../../perlasm");
+require "alpha.pl";
+require "alpha/mul_add.pl";
+require "alpha/mul.pl";
+require "alpha/sqr.pl";
+require "alpha/add.pl";
+require "alpha/sub.pl";
+require "alpha/mul_c8.pl";
+require "alpha/mul_c4.pl";
+require "alpha/sqr_c4.pl";
+require "alpha/sqr_c8.pl";
+require "alpha/div.pl";
+
+&asm_init($ARGV[0],"bn-586.pl");
+
+&bn_mul_words("bn_mul_words");
+&bn_sqr_words("bn_sqr_words");
+&bn_mul_add_words("bn_mul_add_words");
+&bn_add_words("bn_add_words");
+&bn_sub_words("bn_sub_words");
+&bn_div_words("bn_div_words");
+&bn_mul_comba8("bn_mul_comba8");
+&bn_mul_comba4("bn_mul_comba4");
+&bn_sqr_comba4("bn_sqr_comba4");
+&bn_sqr_comba8("bn_sqr_comba8");
+
+&asm_finish();
+
diff --git a/crypto/bn/asm/co-586.pl b/crypto/bn/asm/co-586.pl
new file mode 100644 (file)
index 0000000..0bcb5a6
--- /dev/null
@@ -0,0 +1,286 @@
+#!/usr/local/bin/perl
+
+push(@INC,"perlasm","../../perlasm");
+require "x86asm.pl";
+
+&asm_init($ARGV[0],"bn-586.pl");
+
+&bn_mul_comba("bn_mul_comba8",8);
+&bn_mul_comba("bn_mul_comba4",4);
+&bn_sqr_comba("bn_sqr_comba8",8);
+&bn_sqr_comba("bn_sqr_comba4",4);
+
+&asm_finish();
+
+sub mul_add_c
+       {
+       local($a,$ai,$b,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_;
+
+       # pos == -1 if eax and edx are pre-loaded, 0 to load from next
+       # words, and 1 if load return value
+
+       &comment("mul a[$ai]*b[$bi]");
+
+       # "eax" and "edx" will always be pre-loaded.
+       # &mov("eax",&DWP($ai*4,$a,"",0)) ;
+       # &mov("edx",&DWP($bi*4,$b,"",0));
+
+       &mul("edx");
+       &add($c0,"eax");
+        &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0;        # laod next a
+        &mov("eax",&wparam(0)) if $pos > 0;                    # load r[]
+        ###
+       &adc($c1,"edx");
+        &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 0;        # laod next b
+        &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 1;        # laod next b
+        ###
+       &adc($c2,0);
+        # is pos > 1, it means it is the last loop 
+        &mov(&DWP($i*4,"eax","",0),$c0) if $pos > 0;           # save r[];
+       &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1;         # laod next a
+       }
+
+sub sqr_add_c
+       {
+       local($r,$a,$ai,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_;
+
+       # pos == -1 if eax and edx are pre-loaded, 0 to load from next
+       # words, and 1 if load return value
+
+       &comment("sqr a[$ai]*a[$bi]");
+
+       # "eax" and "edx" will always be pre-loaded.
+       # &mov("eax",&DWP($ai*4,$a,"",0)) ;
+       # &mov("edx",&DWP($bi*4,$b,"",0));
+
+       if ($ai == $bi)
+               { &mul("eax");}
+       else
+               { &mul("edx");}
+       &add($c0,"eax");
+        &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0;        # load next a
+        ###
+       &adc($c1,"edx");
+        &mov("edx",&DWP(($nb)*4,$a,"",0)) if ($pos == 1) && ($na != $nb);
+        ###
+       &adc($c2,0);
+        # is pos > 1, it means it is the last loop 
+        &mov(&DWP($i*4,$r,"",0),$c0) if $pos > 0;              # save r[];
+       &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1;         # load next b
+       }
+
+sub sqr_add_c2
+       {
+       local($r,$a,$ai,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_;
+
+       # pos == -1 if eax and edx are pre-loaded, 0 to load from next
+       # words, and 1 if load return value
+
+       &comment("sqr a[$ai]*a[$bi]");
+
+       # "eax" and "edx" will always be pre-loaded.
+       # &mov("eax",&DWP($ai*4,$a,"",0)) ;
+       # &mov("edx",&DWP($bi*4,$a,"",0));
+
+       if ($ai == $bi)
+               { &mul("eax");}
+       else
+               { &mul("edx");}
+       &add("eax","eax");
+        ###
+       &adc("edx","edx");
+        ###
+       &adc($c2,0);
+        &add($c0,"eax");
+       &adc($c1,"edx");
+        &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0;        # load next a
+        &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1;        # load next b
+       &adc($c2,0);
+       &mov(&DWP($i*4,$r,"",0),$c0) if $pos > 0;               # save r[];
+        &mov("edx",&DWP(($nb)*4,$a,"",0)) if ($pos <= 1) && ($na != $nb);
+        ###
+       }
+
+sub bn_mul_comba
+       {
+       local($name,$num)=@_;
+       local($a,$b,$c0,$c1,$c2);
+       local($i,$as,$ae,$bs,$be,$ai,$bi);
+       local($tot,$end);
+
+       &function_begin_B($name,"");
+
+       $c0="ebx";
+       $c1="ecx";
+       $c2="ebp";
+       $a="esi";
+       $b="edi";
+       
+       $as=0;
+       $ae=0;
+       $bs=0;
+       $be=0;
+       $tot=$num+$num-1;
+
+       &push("esi");
+        &mov($a,&wparam(1));
+       &push("edi");
+        &mov($b,&wparam(2));
+       &push("ebp");
+        &push("ebx");
+
+       &xor($c0,$c0);
+        &mov("eax",&DWP(0,$a,"",0));   # load the first word 
+       &xor($c1,$c1);
+        &mov("edx",&DWP(0,$b,"",0));   # load the first second 
+
+       for ($i=0; $i<$tot; $i++)
+               {
+               $ai=$as;
+               $bi=$bs;
+               $end=$be+1;
+
+               &comment("################## Calculate word $i"); 
+
+               for ($j=$bs; $j<$end; $j++)
+                       {
+                       &xor($c2,$c2) if ($j == $bs);
+                       if (($j+1) == $end)
+                               {
+                               $v=1;
+                               $v=2 if (($i+1) == $tot);
+                               }
+                       else
+                               { $v=0; }
+                       if (($j+1) != $end)
+                               {
+                               $na=($ai-1);
+                               $nb=($bi+1);
+                               }
+                       else
+                               {
+                               $na=$as+($i < ($num-1));
+                               $nb=$bs+($i >= ($num-1));
+                               }
+#printf STDERR "[$ai,$bi] -> [$na,$nb]\n";
+                       &mul_add_c($a,$ai,$b,$bi,$c0,$c1,$c2,$v,$i,$na,$nb);
+                       if ($v)
+                               {
+                               &comment("saved r[$i]");
+                               # &mov("eax",&wparam(0));
+                               # &mov(&DWP($i*4,"eax","",0),$c0);
+                               ($c0,$c1,$c2)=($c1,$c2,$c0);
+                               }
+                       $ai--;
+                       $bi++;
+                       }
+               $as++ if ($i < ($num-1));
+               $ae++ if ($i >= ($num-1));
+
+               $bs++ if ($i >= ($num-1));
+               $be++ if ($i < ($num-1));
+               }
+       &comment("save r[$i]");
+       # &mov("eax",&wparam(0));
+       &mov(&DWP($i*4,"eax","",0),$c0);
+
+       &pop("ebx");
+       &pop("ebp");
+       &pop("edi");
+       &pop("esi");
+       &ret();
+       &function_end_B($name);
+       }
+
+sub bn_sqr_comba
+       {
+       local($name,$num)=@_;
+       local($r,$a,$c0,$c1,$c2)=@_;
+       local($i,$as,$ae,$bs,$be,$ai,$bi);
+       local($b,$tot,$end,$half);
+
+       &function_begin_B($name,"");
+
+       $c0="ebx";
+       $c1="ecx";
+       $c2="ebp";
+       $a="esi";
+       $r="edi";
+
+       &push("esi");
+        &push("edi");
+       &push("ebp");
+        &push("ebx");
+       &mov($r,&wparam(0));
+        &mov($a,&wparam(1));
+       &xor($c0,$c0);
+        &xor($c1,$c1);
+       &mov("eax",&DWP(0,$a,"",0)); # load the first word
+
+       $as=0;
+       $ae=0;
+       $bs=0;
+       $be=0;
+       $tot=$num+$num-1;
+
+       for ($i=0; $i<$tot; $i++)
+               {
+               $ai=$as;
+               $bi=$bs;
+               $end=$be+1;
+
+               &comment("############### Calculate word $i");
+               for ($j=$bs; $j<$end; $j++)
+                       {
+                       &xor($c2,$c2) if ($j == $bs);
+                       if (($ai-1) < ($bi+1))
+                               {
+                               $v=1;
+                               $v=2 if ($i+1) == $tot;
+                               }
+                       else
+                               { $v=0; }
+                       if (!$v)
+                               {
+                               $na=$ai-1;
+                               $nb=$bi+1;
+                               }
+                       else
+                               {
+                               $na=$as+($i < ($num-1));
+                               $nb=$bs+($i >= ($num-1));
+                               }
+                       if ($ai == $bi)
+                               {
+                               &sqr_add_c($r,$a,$ai,$bi,
+                                       $c0,$c1,$c2,$v,$i,$na,$nb);
+                               }
+                       else
+                               {
+                               &sqr_add_c2($r,$a,$ai,$bi,
+                                       $c0,$c1,$c2,$v,$i,$na,$nb);
+                               }
+                       if ($v)
+                               {
+                               &comment("saved r[$i]");
+                               #&mov(&DWP($i*4,$r,"",0),$c0);
+                               ($c0,$c1,$c2)=($c1,$c2,$c0);
+                               last;
+                               }
+                       $ai--;
+                       $bi++;
+                       }
+               $as++ if ($i < ($num-1));
+               $ae++ if ($i >= ($num-1));
+
+               $bs++ if ($i >= ($num-1));
+               $be++ if ($i < ($num-1));
+               }
+       &mov(&DWP($i*4,$r,"",0),$c0);
+       &pop("ebx");
+       &pop("ebp");
+       &pop("edi");
+       &pop("esi");
+       &ret();
+       &function_end_B($name);
+       }
diff --git a/crypto/bn/asm/co-alpha.pl b/crypto/bn/asm/co-alpha.pl
new file mode 100644 (file)
index 0000000..23869a4
--- /dev/null
@@ -0,0 +1,116 @@
+#!/usr/local/bin/perl
+# I have this in perl so I can use more usefull register names and then convert
+# them into alpha registers.
+#
+
+push(@INC,"perlasm","../../perlasm");
+require "alpha.pl";
+
+&asm_init($ARGV[0],"bn-586.pl");
+
+print &bn_sub_words("bn_sub_words");
+
+&asm_finish();
+
+sub bn_sub_words
+       {
+       local($name)=@_;
+       local($cc,$a,$b,$r);
+
+       $cc="r0";
+       $a0="r1"; $b0="r5"; $r0="r9";  $tmp="r13";
+       $a1="r2"; $b1="r6"; $r1="r10"; $t1="r14";
+       $a2="r3"; $b2="r7"; $r2="r11";
+       $a3="r4"; $b3="r8"; $r3="r12"; $t3="r15";
+
+       $rp=&wparam(0);
+       $ap=&wparam(1);
+       $bp=&wparam(2);
+       $count=&wparam(3);
+
+       &function_begin($name,"");
+
+       &comment("");
+       &sub($count,4,$count);
+       &mov("zero",$cc);
+       &blt($count,&label("finish"));
+
+       &ld($a0,&QWPw(0,$ap));
+       &ld($b0,&QWPw(0,$bp));
+
+##########################################################
+       &set_label("loop");
+
+       &ld($a1,&QWPw(1,$ap));
+        &cmpult($a0,$b0,$tmp); # will we borrow?
+       &ld($b1,&QWPw(1,$bp));
+        &sub($a0,$b0,$a0);             # do the subtract
+       &ld($a2,&QWPw(2,$ap));
+        &cmpult($a0,$cc,$b0);  # will we borrow?
+       &ld($b2,&QWPw(2,$bp));
+        &sub($a0,$cc,$a0);     # will we borrow?
+       &ld($a3,&QWPw(3,$ap));
+        &add($b0,$tmp,$cc);    # add the borrows
+
+       &cmpult($a1,$b1,$t1);   # will we borrow?
+        &sub($a1,$b1,$a1);     # do the subtract
+       &ld($b3,&QWPw(3,$bp));
+        &cmpult($a1,$cc,$b1);  # will we borrow?
+       &sub($a1,$cc,$a1);      # will we borrow?
+        &add($b1,$t1,$cc);     # add the borrows
+
+       &cmpult($a2,$b2,$tmp);  # will we borrow?
+        &sub($a2,$b2,$a2);             # do the subtract
+       &st($a0,&QWPw(0,$rp));  # save
+        &cmpult($a2,$cc,$b2);  # will we borrow?
+       &sub($a2,$cc,$a2);      # will we borrow?
+        &add($b2,$tmp,$cc);    # add the borrows
+
+       &cmpult($a3,$b3,$t3);   # will we borrow?
+        &sub($a3,$b3,$a3);             # do the subtract
+       &st($a1,&QWPw(1,$rp));  # save
+        &cmpult($a3,$cc,$b3);  # will we borrow?
+       &sub($a3,$cc,$a3);      # will we borrow?
+        &add($b3,$t3,$cc);     # add the borrows
+
+       &st($a2,&QWPw(2,$rp));  # save
+        &sub($count,4,$count); # count-=4
+       &st($a3,&QWPw(3,$rp));  # save
+        &add($ap,4*$QWS,$ap);  # count+=4
+       &add($bp,4*$QWS,$bp);   # count+=4
+        &add($rp,4*$QWS,$rp);  # count+=4
+
+       &blt($count,&label("finish"));
+       &ld($a0,&QWPw(0,$ap));
+        &ld($b0,&QWPw(0,$bp));
+       &br(&label("loop"));
+##################################################
+       # Do the last 0..3 words
+
+       &set_label("last_loop");
+
+       &ld($a0,&QWPw(0,$ap));  # get a
+        &ld($b0,&QWPw(0,$bp)); # get b
+       &cmpult($a0,$b0,$tmp);  # will we borrow?
+       &sub($a0,$b0,$a0);      # do the subtract
+       &cmpult($a0,$cc,$b0);   # will we borrow?
+       &sub($a0,$cc,$a0);      # will we borrow?
+       &st($a0,&QWPw(0,$rp));  # save
+       &add($b0,$tmp,$cc);     # add the borrows
+
+       &add($ap,$QWS,$ap);
+       &add($bp,$QWS,$bp);
+       &add($rp,$QWS,$rp);
+       &sub($count,1,$count);
+       &bgt($count,&label("last_loop"));
+       &function_end_A($name);
+
+######################################################
+       &set_label("finish");
+       &add($count,4,$count);
+       &bgt($count,&label("last_loop"));
+
+       &set_label("end");
+       &function_end($name);
+       }
+
diff --git a/crypto/bn/asm/co86unix.cpp b/crypto/bn/asm/co86unix.cpp
new file mode 100644 (file)
index 0000000..fa80b14
--- /dev/null
@@ -0,0 +1,1315 @@
+/* Run the C pre-processor over this file with one of the following defined
+ * ELF - elf object files,
+ * OUT - a.out object files,
+ * BSDI - BSDI style a.out object files
+ * SOL - Solaris style elf
+ */
+
+#define TYPE(a,b)       .type   a,b
+#define SIZE(a,b)       .size   a,b
+
+#if defined(OUT) || defined(BSDI)
+#define bn_mul_comba8 _bn_mul_comba8
+#define bn_mul_comba4 _bn_mul_comba4
+#define bn_sqr_comba8 _bn_sqr_comba8
+#define bn_sqr_comba4 _bn_sqr_comba4
+
+#endif
+
+#ifdef OUT
+#define OK     1
+#define ALIGN  4
+#endif
+
+#ifdef BSDI
+#define OK              1
+#define ALIGN           4
+#undef SIZE
+#undef TYPE
+#define SIZE(a,b)
+#define TYPE(a,b)
+#endif
+
+#if defined(ELF) || defined(SOL)
+#define OK              1
+#define ALIGN           16
+#endif
+
+#ifndef OK
+You need to define one of
+ELF - elf systems - linux-elf, NetBSD and DG-UX
+OUT - a.out systems - linux-a.out and FreeBSD
+SOL - solaris systems, which are elf with strange comment lines
+BSDI - a.out with a very primative version of as.
+#endif
+
+/* Let the Assembler begin :-) */
+       /* Don't even think of reading this code */
+       /* It was automatically generated by bn-586.pl */
+       /* Which is a perl program used to generate the x86 assember for */
+       /* any of elf, a.out, BSDI,Win32, or Solaris */
+       /* eric <eay@cryptsoft.com> */
+
+       .file   "bn-586.s"
+       .version        "01.01"
+gcc2_compiled.:
+.text
+       .align ALIGN
+.globl bn_mul_comba8
+       TYPE(bn_mul_comba8,@function)
+bn_mul_comba8:
+       pushl   %esi
+       movl    12(%esp),       %esi
+       pushl   %edi
+       movl    20(%esp),       %edi
+       pushl   %ebp
+       pushl   %ebx
+       xorl    %ebx,           %ebx
+       movl    (%esi),         %eax
+       xorl    %ecx,           %ecx
+       movl    (%edi),         %edx
+       /* ################## Calculate word 0 */
+       xorl    %ebp,           %ebp
+       /* mul a[0]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%eax)
+       movl    4(%esi),        %eax
+       /* saved r[0] */
+       /* ################## Calculate word 1 */
+       xorl    %ebx,           %ebx
+       /* mul a[1]*b[0] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[0]*b[1] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    (%edi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%eax)
+       movl    8(%esi),        %eax
+       /* saved r[1] */
+       /* ################## Calculate word 2 */
+       xorl    %ecx,           %ecx
+       /* mul a[2]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[1]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[0]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    (%edi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%eax)
+       movl    12(%esi),       %eax
+       /* saved r[2] */
+       /* ################## Calculate word 3 */
+       xorl    %ebp,           %ebp
+       /* mul a[3]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       /* mul a[2]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebp
+       /* mul a[1]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[0]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%eax)
+       movl    16(%esi),       %eax
+       /* saved r[3] */
+       /* ################## Calculate word 4 */
+       xorl    %ebx,           %ebx
+       /* mul a[4]*b[0] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[3]*b[1] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[2]*b[2] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[1]*b[3] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[0]*b[4] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    (%edi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%eax)
+       movl    20(%esi),       %eax
+       /* saved r[4] */
+       /* ################## Calculate word 5 */
+       xorl    %ecx,           %ecx
+       /* mul a[5]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[4]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[3]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[2]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[1]*b[4] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[0]*b[5] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    (%edi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%eax)
+       movl    24(%esi),       %eax
+       /* saved r[5] */
+       /* ################## Calculate word 6 */
+       xorl    %ebp,           %ebp
+       /* mul a[6]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       /* mul a[5]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebp
+       /* mul a[4]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[3]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[2]*b[4] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[1]*b[5] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[0]*b[6] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[6] */
+       /* ################## Calculate word 7 */
+       xorl    %ebx,           %ebx
+       /* mul a[7]*b[0] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[6]*b[1] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[5]*b[2] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[4]*b[3] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[3]*b[4] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[2]*b[5] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[1]*b[6] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[0]*b[7] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           28(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[7] */
+       /* ################## Calculate word 8 */
+       xorl    %ecx,           %ecx
+       /* mul a[7]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[6]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[5]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[4]*b[4] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[3]*b[5] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[2]*b[6] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[1]*b[7] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           32(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[8] */
+       /* ################## Calculate word 9 */
+       xorl    %ebp,           %ebp
+       /* mul a[7]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[6]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[5]*b[4] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[4]*b[5] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[3]*b[6] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[2]*b[7] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           36(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[9] */
+       /* ################## Calculate word 10 */
+       xorl    %ebx,           %ebx
+       /* mul a[7]*b[3] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[6]*b[4] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[5]*b[5] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[4]*b[6] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[3]*b[7] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           40(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[10] */
+       /* ################## Calculate word 11 */
+       xorl    %ecx,           %ecx
+       /* mul a[7]*b[4] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[6]*b[5] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[5]*b[6] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[4]*b[7] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           44(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[11] */
+       /* ################## Calculate word 12 */
+       xorl    %ebp,           %ebp
+       /* mul a[7]*b[5] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[6]*b[6] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[5]*b[7] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           48(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[12] */
+       /* ################## Calculate word 13 */
+       xorl    %ebx,           %ebx
+       /* mul a[7]*b[6] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[6]*b[7] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           52(%eax)
+       movl    28(%esi),       %eax
+       /* saved r[13] */
+       /* ################## Calculate word 14 */
+       xorl    %ecx,           %ecx
+       /* mul a[7]*b[7] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       adcl    $0,             %ecx
+       movl    %ebp,           56(%eax)
+       /* saved r[14] */
+       /* save r[15] */
+       movl    %ebx,           60(%eax)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_mul_comba8_end:
+       SIZE(bn_mul_comba8,.bn_mul_comba8_end-bn_mul_comba8)
+.ident "desasm.pl"
+.text
+       .align ALIGN
+.globl bn_mul_comba4
+       TYPE(bn_mul_comba4,@function)
+bn_mul_comba4:
+       pushl   %esi
+       movl    12(%esp),       %esi
+       pushl   %edi
+       movl    20(%esp),       %edi
+       pushl   %ebp
+       pushl   %ebx
+       xorl    %ebx,           %ebx
+       movl    (%esi),         %eax
+       xorl    %ecx,           %ecx
+       movl    (%edi),         %edx
+       /* ################## Calculate word 0 */
+       xorl    %ebp,           %ebp
+       /* mul a[0]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%eax)
+       movl    4(%esi),        %eax
+       /* saved r[0] */
+       /* ################## Calculate word 1 */
+       xorl    %ebx,           %ebx
+       /* mul a[1]*b[0] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[0]*b[1] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    (%edi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%eax)
+       movl    8(%esi),        %eax
+       /* saved r[1] */
+       /* ################## Calculate word 2 */
+       xorl    %ecx,           %ecx
+       /* mul a[2]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[1]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       /* mul a[0]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    (%edi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%eax)
+       movl    12(%esi),       %eax
+       /* saved r[2] */
+       /* ################## Calculate word 3 */
+       xorl    %ebp,           %ebp
+       /* mul a[3]*b[0] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       /* mul a[2]*b[1] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebp
+       /* mul a[1]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       /* mul a[0]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%eax)
+       movl    12(%esi),       %eax
+       /* saved r[3] */
+       /* ################## Calculate word 4 */
+       xorl    %ebx,           %ebx
+       /* mul a[3]*b[1] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       /* mul a[2]*b[2] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebx
+       /* mul a[1]*b[3] */
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%eax)
+       movl    12(%esi),       %eax
+       /* saved r[4] */
+       /* ################## Calculate word 5 */
+       xorl    %ecx,           %ecx
+       /* mul a[3]*b[2] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       /* mul a[2]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%eax)
+       movl    12(%esi),       %eax
+       /* saved r[5] */
+       /* ################## Calculate word 6 */
+       xorl    %ebp,           %ebp
+       /* mul a[3]*b[3] */
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%eax)
+       /* saved r[6] */
+       /* save r[7] */
+       movl    %ecx,           28(%eax)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_mul_comba4_end:
+       SIZE(bn_mul_comba4,.bn_mul_comba4_end-bn_mul_comba4)
+.ident "desasm.pl"
+.text
+       .align ALIGN
+.globl bn_sqr_comba8
+       TYPE(bn_sqr_comba8,@function)
+bn_sqr_comba8:
+       pushl   %esi
+       pushl   %edi
+       pushl   %ebp
+       pushl   %ebx
+       movl    20(%esp),       %edi
+       movl    24(%esp),       %esi
+       xorl    %ebx,           %ebx
+       xorl    %ecx,           %ecx
+       movl    (%esi),         %eax
+       /* ############### Calculate word 0 */
+       xorl    %ebp,           %ebp
+       /* sqr a[0]*a[0] */
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    (%esi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%edi)
+       movl    4(%esi),        %eax
+       /* saved r[0] */
+       /* ############### Calculate word 1 */
+       xorl    %ebx,           %ebx
+       /* sqr a[1]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%edi)
+       movl    (%esi),         %edx
+       /* saved r[1] */
+       /* ############### Calculate word 2 */
+       xorl    %ecx,           %ecx
+       /* sqr a[2]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    4(%esi),        %eax
+       adcl    $0,             %ecx
+       /* sqr a[1]*a[1] */
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    (%esi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%edi)
+       movl    12(%esi),       %eax
+       /* saved r[2] */
+       /* ############### Calculate word 3 */
+       xorl    %ebp,           %ebp
+       /* sqr a[3]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebp
+       movl    4(%esi),        %edx
+       /* sqr a[2]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%edi)
+       movl    (%esi),         %edx
+       /* saved r[3] */
+       /* ############### Calculate word 4 */
+       xorl    %ebx,           %ebx
+       /* sqr a[4]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    12(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    4(%esi),        %edx
+       /* sqr a[3]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       /* sqr a[2]*a[2] */
+       mull    %eax
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    (%esi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%edi)
+       movl    20(%esi),       %eax
+       /* saved r[4] */
+       /* ############### Calculate word 5 */
+       xorl    %ecx,           %ecx
+       /* sqr a[5]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    4(%esi),        %edx
+       /* sqr a[4]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    8(%esi),        %edx
+       /* sqr a[3]*a[2] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%edi)
+       movl    (%esi),         %edx
+       /* saved r[5] */
+       /* ############### Calculate word 6 */
+       xorl    %ebp,           %ebp
+       /* sqr a[6]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    4(%esi),        %edx
+       /* sqr a[5]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    8(%esi),        %edx
+       /* sqr a[4]*a[2] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ebp
+       /* sqr a[3]*a[3] */
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    (%esi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%edi)
+       movl    28(%esi),       %eax
+       /* saved r[6] */
+       /* ############### Calculate word 7 */
+       xorl    %ebx,           %ebx
+       /* sqr a[7]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    4(%esi),        %edx
+       /* sqr a[6]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    8(%esi),        %edx
+       /* sqr a[5]*a[2] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    16(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    12(%esi),       %edx
+       /* sqr a[4]*a[3] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    28(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           28(%edi)
+       movl    4(%esi),        %edx
+       /* saved r[7] */
+       /* ############### Calculate word 8 */
+       xorl    %ecx,           %ecx
+       /* sqr a[7]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    8(%esi),        %edx
+       /* sqr a[6]*a[2] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    20(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    12(%esi),       %edx
+       /* sqr a[5]*a[3] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ecx
+       /* sqr a[4]*a[4] */
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    8(%esi),        %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           32(%edi)
+       movl    28(%esi),       %eax
+       /* saved r[8] */
+       /* ############### Calculate word 9 */
+       xorl    %ebp,           %ebp
+       /* sqr a[7]*a[2] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    12(%esi),       %edx
+       /* sqr a[6]*a[3] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    16(%esi),       %edx
+       /* sqr a[5]*a[4] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    28(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    %ebx,           36(%edi)
+       movl    12(%esi),       %edx
+       /* saved r[9] */
+       /* ############### Calculate word 10 */
+       xorl    %ebx,           %ebx
+       /* sqr a[7]*a[3] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    16(%esi),       %edx
+       /* sqr a[6]*a[4] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebx
+       /* sqr a[5]*a[5] */
+       mull    %eax
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    16(%esi),       %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           40(%edi)
+       movl    28(%esi),       %eax
+       /* saved r[10] */
+       /* ############### Calculate word 11 */
+       xorl    %ecx,           %ecx
+       /* sqr a[7]*a[4] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    20(%esi),       %edx
+       /* sqr a[6]*a[5] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    28(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    %ebp,           44(%edi)
+       movl    20(%esi),       %edx
+       /* saved r[11] */
+       /* ############### Calculate word 12 */
+       xorl    %ebp,           %ebp
+       /* sqr a[7]*a[5] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebp
+       /* sqr a[6]*a[6] */
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    24(%esi),       %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           48(%edi)
+       movl    28(%esi),       %eax
+       /* saved r[12] */
+       /* ############### Calculate word 13 */
+       xorl    %ebx,           %ebx
+       /* sqr a[7]*a[6] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    28(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           52(%edi)
+       /* saved r[13] */
+       /* ############### Calculate word 14 */
+       xorl    %ecx,           %ecx
+       /* sqr a[7]*a[7] */
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       adcl    $0,             %ecx
+       movl    %ebp,           56(%edi)
+       /* saved r[14] */
+       movl    %ebx,           60(%edi)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_sqr_comba8_end:
+       SIZE(bn_sqr_comba8,.bn_sqr_comba8_end-bn_sqr_comba8)
+.ident "desasm.pl"
+.text
+       .align ALIGN
+.globl bn_sqr_comba4
+       TYPE(bn_sqr_comba4,@function)
+bn_sqr_comba4:
+       pushl   %esi
+       pushl   %edi
+       pushl   %ebp
+       pushl   %ebx
+       movl    20(%esp),       %edi
+       movl    24(%esp),       %esi
+       xorl    %ebx,           %ebx
+       xorl    %ecx,           %ecx
+       movl    (%esi),         %eax
+       /* ############### Calculate word 0 */
+       xorl    %ebp,           %ebp
+       /* sqr a[0]*a[0] */
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    (%esi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%edi)
+       movl    4(%esi),        %eax
+       /* saved r[0] */
+       /* ############### Calculate word 1 */
+       xorl    %ebx,           %ebx
+       /* sqr a[1]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%edi)
+       movl    (%esi),         %edx
+       /* saved r[1] */
+       /* ############### Calculate word 2 */
+       xorl    %ecx,           %ecx
+       /* sqr a[2]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    4(%esi),        %eax
+       adcl    $0,             %ecx
+       /* sqr a[1]*a[1] */
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    (%esi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%edi)
+       movl    12(%esi),       %eax
+       /* saved r[2] */
+       /* ############### Calculate word 3 */
+       xorl    %ebp,           %ebp
+       /* sqr a[3]*a[0] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebp
+       movl    4(%esi),        %edx
+       /* sqr a[2]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%edi)
+       movl    4(%esi),        %edx
+       /* saved r[3] */
+       /* ############### Calculate word 4 */
+       xorl    %ebx,           %ebx
+       /* sqr a[3]*a[1] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       /* sqr a[2]*a[2] */
+       mull    %eax
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%edi)
+       movl    12(%esi),       %eax
+       /* saved r[4] */
+       /* ############### Calculate word 5 */
+       xorl    %ecx,           %ecx
+       /* sqr a[3]*a[2] */
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%edi)
+       /* saved r[5] */
+       /* ############### Calculate word 6 */
+       xorl    %ebp,           %ebp
+       /* sqr a[3]*a[3] */
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%edi)
+       /* saved r[6] */
+       movl    %ecx,           28(%edi)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_sqr_comba4_end:
+       SIZE(bn_sqr_comba4,.bn_sqr_comba4_end-bn_sqr_comba4)
+.ident "desasm.pl"
diff --git a/crypto/bn/asm/elf.s b/crypto/bn/asm/elf.s
new file mode 100644 (file)
index 0000000..97ad126
--- /dev/null
@@ -0,0 +1,1269 @@
+       # Don't even think of reading this code 
+       # It was automatically generated by bn-586.pl 
+       # Which is a perl program used to generate the x86 assember for 
+       # any of elf, a.out, BSDI,Win32, or Solaris 
+       # eric <eay@cryptsoft.com> 
+
+       .file   "bn-586.s"
+       .version        "01.01"
+gcc2_compiled.:
+.text
+       .align 16
+.globl bn_mul_comba8
+       .type   bn_mul_comba8,@function
+bn_mul_comba8:
+       pushl   %esi
+       movl    12(%esp),       %esi
+       pushl   %edi
+       movl    20(%esp),       %edi
+       pushl   %ebp
+       pushl   %ebx
+       xorl    %ebx,           %ebx
+       movl    (%esi),         %eax
+       xorl    %ecx,           %ecx
+       movl    (%edi),         %edx
+       # ################## Calculate word 0 
+       xorl    %ebp,           %ebp
+       # mul a[0]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%eax)
+       movl    4(%esi),        %eax
+       # saved r[0] 
+       # ################## Calculate word 1 
+       xorl    %ebx,           %ebx
+       # mul a[1]*b[0] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[0]*b[1] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    (%edi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%eax)
+       movl    8(%esi),        %eax
+       # saved r[1] 
+       # ################## Calculate word 2 
+       xorl    %ecx,           %ecx
+       # mul a[2]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[1]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[0]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    (%edi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%eax)
+       movl    12(%esi),       %eax
+       # saved r[2] 
+       # ################## Calculate word 3 
+       xorl    %ebp,           %ebp
+       # mul a[3]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       # mul a[2]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebp
+       # mul a[1]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[0]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%eax)
+       movl    16(%esi),       %eax
+       # saved r[3] 
+       # ################## Calculate word 4 
+       xorl    %ebx,           %ebx
+       # mul a[4]*b[0] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[3]*b[1] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[2]*b[2] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[1]*b[3] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[0]*b[4] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    (%edi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%eax)
+       movl    20(%esi),       %eax
+       # saved r[4] 
+       # ################## Calculate word 5 
+       xorl    %ecx,           %ecx
+       # mul a[5]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[4]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[3]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[2]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[1]*b[4] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[0]*b[5] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    (%edi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%eax)
+       movl    24(%esi),       %eax
+       # saved r[5] 
+       # ################## Calculate word 6 
+       xorl    %ebp,           %ebp
+       # mul a[6]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       # mul a[5]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebp
+       # mul a[4]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[3]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[2]*b[4] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[1]*b[5] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[0]*b[6] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%eax)
+       movl    28(%esi),       %eax
+       # saved r[6] 
+       # ################## Calculate word 7 
+       xorl    %ebx,           %ebx
+       # mul a[7]*b[0] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[6]*b[1] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[5]*b[2] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[4]*b[3] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[3]*b[4] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[2]*b[5] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[1]*b[6] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[0]*b[7] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           28(%eax)
+       movl    28(%esi),       %eax
+       # saved r[7] 
+       # ################## Calculate word 8 
+       xorl    %ecx,           %ecx
+       # mul a[7]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[6]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[5]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[4]*b[4] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[3]*b[5] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[2]*b[6] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[1]*b[7] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           32(%eax)
+       movl    28(%esi),       %eax
+       # saved r[8] 
+       # ################## Calculate word 9 
+       xorl    %ebp,           %ebp
+       # mul a[7]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[6]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[5]*b[4] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[4]*b[5] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[3]*b[6] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[2]*b[7] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           36(%eax)
+       movl    28(%esi),       %eax
+       # saved r[9] 
+       # ################## Calculate word 10 
+       xorl    %ebx,           %ebx
+       # mul a[7]*b[3] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[6]*b[4] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[5]*b[5] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[4]*b[6] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[3]*b[7] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           40(%eax)
+       movl    28(%esi),       %eax
+       # saved r[10] 
+       # ################## Calculate word 11 
+       xorl    %ecx,           %ecx
+       # mul a[7]*b[4] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[6]*b[5] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[5]*b[6] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[4]*b[7] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           44(%eax)
+       movl    28(%esi),       %eax
+       # saved r[11] 
+       # ################## Calculate word 12 
+       xorl    %ebp,           %ebp
+       # mul a[7]*b[5] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[6]*b[6] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[5]*b[7] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           48(%eax)
+       movl    28(%esi),       %eax
+       # saved r[12] 
+       # ################## Calculate word 13 
+       xorl    %ebx,           %ebx
+       # mul a[7]*b[6] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[6]*b[7] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           52(%eax)
+       movl    28(%esi),       %eax
+       # saved r[13] 
+       # ################## Calculate word 14 
+       xorl    %ecx,           %ecx
+       # mul a[7]*b[7] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       adcl    $0,             %ecx
+       movl    %ebp,           56(%eax)
+       # saved r[14] 
+       # save r[15] 
+       movl    %ebx,           60(%eax)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_mul_comba8_end:
+       .size   bn_mul_comba8,.bn_mul_comba8_end-bn_mul_comba8
+.ident "desasm.pl"
+.text
+       .align 16
+.globl bn_mul_comba4
+       .type   bn_mul_comba4,@function
+bn_mul_comba4:
+       pushl   %esi
+       movl    12(%esp),       %esi
+       pushl   %edi
+       movl    20(%esp),       %edi
+       pushl   %ebp
+       pushl   %ebx
+       xorl    %ebx,           %ebx
+       movl    (%esi),         %eax
+       xorl    %ecx,           %ecx
+       movl    (%edi),         %edx
+       # ################## Calculate word 0 
+       xorl    %ebp,           %ebp
+       # mul a[0]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%eax)
+       movl    4(%esi),        %eax
+       # saved r[0] 
+       # ################## Calculate word 1 
+       xorl    %ebx,           %ebx
+       # mul a[1]*b[0] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[0]*b[1] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    (%edi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%eax)
+       movl    8(%esi),        %eax
+       # saved r[1] 
+       # ################## Calculate word 2 
+       xorl    %ecx,           %ecx
+       # mul a[2]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[1]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[0]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    (%edi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%eax)
+       movl    12(%esi),       %eax
+       # saved r[2] 
+       # ################## Calculate word 3 
+       xorl    %ebp,           %ebp
+       # mul a[3]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       # mul a[2]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebp
+       # mul a[1]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[0]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%eax)
+       movl    12(%esi),       %eax
+       # saved r[3] 
+       # ################## Calculate word 4 
+       xorl    %ebx,           %ebx
+       # mul a[3]*b[1] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[2]*b[2] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[1]*b[3] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%eax)
+       movl    12(%esi),       %eax
+       # saved r[4] 
+       # ################## Calculate word 5 
+       xorl    %ecx,           %ecx
+       # mul a[3]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[2]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%eax)
+       movl    12(%esi),       %eax
+       # saved r[5] 
+       # ################## Calculate word 6 
+       xorl    %ebp,           %ebp
+       # mul a[3]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%eax)
+       # saved r[6] 
+       # save r[7] 
+       movl    %ecx,           28(%eax)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_mul_comba4_end:
+       .size   bn_mul_comba4,.bn_mul_comba4_end-bn_mul_comba4
+.ident "desasm.pl"
+.text
+       .align 16
+.globl bn_sqr_comba8
+       .type   bn_sqr_comba8,@function
+bn_sqr_comba8:
+       pushl   %esi
+       pushl   %edi
+       pushl   %ebp
+       pushl   %ebx
+       movl    20(%esp),       %edi
+       movl    24(%esp),       %esi
+       xorl    %ebx,           %ebx
+       xorl    %ecx,           %ecx
+       movl    (%esi),         %eax
+       # ############### Calculate word 0 
+       xorl    %ebp,           %ebp
+       # sqr a[0]*a[0] 
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    (%esi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%edi)
+       movl    4(%esi),        %eax
+       # saved r[0] 
+       # ############### Calculate word 1 
+       xorl    %ebx,           %ebx
+       # sqr a[1]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%edi)
+       movl    (%esi),         %edx
+       # saved r[1] 
+       # ############### Calculate word 2 
+       xorl    %ecx,           %ecx
+       # sqr a[2]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    4(%esi),        %eax
+       adcl    $0,             %ecx
+       # sqr a[1]*a[1] 
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    (%esi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%edi)
+       movl    12(%esi),       %eax
+       # saved r[2] 
+       # ############### Calculate word 3 
+       xorl    %ebp,           %ebp
+       # sqr a[3]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebp
+       movl    4(%esi),        %edx
+       # sqr a[2]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%edi)
+       movl    (%esi),         %edx
+       # saved r[3] 
+       # ############### Calculate word 4 
+       xorl    %ebx,           %ebx
+       # sqr a[4]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    12(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    4(%esi),        %edx
+       # sqr a[3]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       # sqr a[2]*a[2] 
+       mull    %eax
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    (%esi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%edi)
+       movl    20(%esi),       %eax
+       # saved r[4] 
+       # ############### Calculate word 5 
+       xorl    %ecx,           %ecx
+       # sqr a[5]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    4(%esi),        %edx
+       # sqr a[4]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    8(%esi),        %edx
+       # sqr a[3]*a[2] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%edi)
+       movl    (%esi),         %edx
+       # saved r[5] 
+       # ############### Calculate word 6 
+       xorl    %ebp,           %ebp
+       # sqr a[6]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    4(%esi),        %edx
+       # sqr a[5]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    8(%esi),        %edx
+       # sqr a[4]*a[2] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ebp
+       # sqr a[3]*a[3] 
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    (%esi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%edi)
+       movl    28(%esi),       %eax
+       # saved r[6] 
+       # ############### Calculate word 7 
+       xorl    %ebx,           %ebx
+       # sqr a[7]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    4(%esi),        %edx
+       # sqr a[6]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    8(%esi),        %edx
+       # sqr a[5]*a[2] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    16(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    12(%esi),       %edx
+       # sqr a[4]*a[3] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    28(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           28(%edi)
+       movl    4(%esi),        %edx
+       # saved r[7] 
+       # ############### Calculate word 8 
+       xorl    %ecx,           %ecx
+       # sqr a[7]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    8(%esi),        %edx
+       # sqr a[6]*a[2] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    20(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    12(%esi),       %edx
+       # sqr a[5]*a[3] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ecx
+       # sqr a[4]*a[4] 
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    8(%esi),        %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           32(%edi)
+       movl    28(%esi),       %eax
+       # saved r[8] 
+       # ############### Calculate word 9 
+       xorl    %ebp,           %ebp
+       # sqr a[7]*a[2] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    12(%esi),       %edx
+       # sqr a[6]*a[3] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    16(%esi),       %edx
+       # sqr a[5]*a[4] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    28(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    %ebx,           36(%edi)
+       movl    12(%esi),       %edx
+       # saved r[9] 
+       # ############### Calculate word 10 
+       xorl    %ebx,           %ebx
+       # sqr a[7]*a[3] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    16(%esi),       %edx
+       # sqr a[6]*a[4] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebx
+       # sqr a[5]*a[5] 
+       mull    %eax
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    16(%esi),       %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           40(%edi)
+       movl    28(%esi),       %eax
+       # saved r[10] 
+       # ############### Calculate word 11 
+       xorl    %ecx,           %ecx
+       # sqr a[7]*a[4] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    20(%esi),       %edx
+       # sqr a[6]*a[5] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    28(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    %ebp,           44(%edi)
+       movl    20(%esi),       %edx
+       # saved r[11] 
+       # ############### Calculate word 12 
+       xorl    %ebp,           %ebp
+       # sqr a[7]*a[5] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebp
+       # sqr a[6]*a[6] 
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    24(%esi),       %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           48(%edi)
+       movl    28(%esi),       %eax
+       # saved r[12] 
+       # ############### Calculate word 13 
+       xorl    %ebx,           %ebx
+       # sqr a[7]*a[6] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    28(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           52(%edi)
+       # saved r[13] 
+       # ############### Calculate word 14 
+       xorl    %ecx,           %ecx
+       # sqr a[7]*a[7] 
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       adcl    $0,             %ecx
+       movl    %ebp,           56(%edi)
+       # saved r[14] 
+       movl    %ebx,           60(%edi)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_sqr_comba8_end:
+       .size   bn_sqr_comba8,.bn_sqr_comba8_end-bn_sqr_comba8
+.ident "desasm.pl"
+.text
+       .align 16
+.globl bn_sqr_comba4
+       .type   bn_sqr_comba4,@function
+bn_sqr_comba4:
+       pushl   %esi
+       pushl   %edi
+       pushl   %ebp
+       pushl   %ebx
+       movl    20(%esp),       %edi
+       movl    24(%esp),       %esi
+       xorl    %ebx,           %ebx
+       xorl    %ecx,           %ecx
+       movl    (%esi),         %eax
+       # ############### Calculate word 0 
+       xorl    %ebp,           %ebp
+       # sqr a[0]*a[0] 
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    (%esi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%edi)
+       movl    4(%esi),        %eax
+       # saved r[0] 
+       # ############### Calculate word 1 
+       xorl    %ebx,           %ebx
+       # sqr a[1]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%edi)
+       movl    (%esi),         %edx
+       # saved r[1] 
+       # ############### Calculate word 2 
+       xorl    %ecx,           %ecx
+       # sqr a[2]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    4(%esi),        %eax
+       adcl    $0,             %ecx
+       # sqr a[1]*a[1] 
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    (%esi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%edi)
+       movl    12(%esi),       %eax
+       # saved r[2] 
+       # ############### Calculate word 3 
+       xorl    %ebp,           %ebp
+       # sqr a[3]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebp
+       movl    4(%esi),        %edx
+       # sqr a[2]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%edi)
+       movl    4(%esi),        %edx
+       # saved r[3] 
+       # ############### Calculate word 4 
+       xorl    %ebx,           %ebx
+       # sqr a[3]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       # sqr a[2]*a[2] 
+       mull    %eax
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%edi)
+       movl    12(%esi),       %eax
+       # saved r[4] 
+       # ############### Calculate word 5 
+       xorl    %ecx,           %ecx
+       # sqr a[3]*a[2] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%edi)
+       # saved r[5] 
+       # ############### Calculate word 6 
+       xorl    %ebp,           %ebp
+       # sqr a[3]*a[3] 
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%edi)
+       # saved r[6] 
+       movl    %ecx,           28(%edi)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_sqr_comba4_end:
+       .size   bn_sqr_comba4,.bn_sqr_comba4_end-bn_sqr_comba4
+.ident "desasm.pl"
diff --git a/crypto/bn/asm/f b/crypto/bn/asm/f
new file mode 100644 (file)
index 0000000..a23fa15
--- /dev/null
@@ -0,0 +1,500 @@
+       .text
+       .align 3
+       .globl bn_sqr_comba8
+       .ent bn_sqr_comba8
+bn_sqr_comba8:
+bn_sqr_comba8..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       ldq     $0,     0($17)
+       ldq     $1,     8($17)
+       ldq     $2,     16($17)
+       ldq     $3,     24($17)
+       ldq     $4,     32($17)
+       ldq     $5,     40($17)
+       ldq     $6,     48($17)
+       ldq     $7,     56($17)
+       bis     $31,    $31,    $23
+       mulq    $0,     $0,     $8
+       umulh   $0,     $0,     $22
+       stq     $8,     0($16)
+       bis     $31,    $31,    $8
+       mulq    $1,     $0,     $24
+       umulh   $1,     $0,     $25
+       cmplt   $24,    $31,    $27
+       cmplt   $25,    $31,    $28
+       addq    $24,    $24,    $24
+       addq    $25,    $25,    $25
+       addq    $25,    $27,    $25
+       addq    $8,     $28,    $8
+       addq    $22,    $24,    $22
+       addq    $23,    $25,    $23
+       cmpult  $22,    $24,    $21
+       cmpult  $23,    $25,    $20
+       addq    $23,    $21,    $23
+       addq    $8,     $20,    $8
+       stq     $22,    8($16)
+       bis     $31,    $31,    $22
+       mulq    $1,     $1,     $19
+       umulh   $1,     $1,     $18
+       addq    $23,    $19,    $23
+       addq    $8,     $18,    $8
+       cmpult  $23,    $19,    $17
+       cmpult  $8,     $18,    $27
+       addq    $8,     $17,    $8
+       addq    $22,    $27,    $22
+       mulq    $2,     $0,     $28
+       umulh   $2,     $0,     $24
+       cmplt   $28,    $31,    $25
+       cmplt   $24,    $31,    $21
+       addq    $28,    $28,    $28
+       addq    $24,    $24,    $24
+       addq    $24,    $25,    $24
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       addq    $8,     $24,    $8
+       cmpult  $23,    $28,    $20
+       cmpult  $8,     $24,    $19
+       addq    $8,     $20,    $8
+       addq    $22,    $19,    $22
+       stq     $23,    16($16)
+       bis     $31,    $31,    $23
+       mulq    $2,     $1,     $18
+       umulh   $2,     $1,     $17
+       cmplt   $18,    $31,    $27
+       cmplt   $17,    $31,    $25
+       addq    $18,    $18,    $18
+       addq    $17,    $17,    $17
+       addq    $17,    $27,    $17
+       addq    $23,    $25,    $23
+       addq    $8,     $18,    $8
+       addq    $22,    $17,    $22
+       cmpult  $8,     $18,    $21
+       cmpult  $22,    $17,    $28
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       mulq    $3,     $0,     $24
+       umulh   $3,     $0,     $20
+       cmplt   $24,    $31,    $19
+       cmplt   $20,    $31,    $27
+       addq    $24,    $24,    $24
+       addq    $20,    $20,    $20
+       addq    $20,    $19,    $20
+       addq    $23,    $27,    $23
+       addq    $8,     $24,    $8
+       addq    $22,    $20,    $22
+       cmpult  $8,     $24,    $25
+       cmpult  $22,    $20,    $18
+       addq    $22,    $25,    $22
+       addq    $23,    $18,    $23
+       stq     $8,     24($16)
+       bis     $31,    $31,    $8
+       mulq    $2,     $2,     $17
+       umulh   $2,     $2,     $21
+       addq    $22,    $17,    $22
+       addq    $23,    $21,    $23
+       cmpult  $22,    $17,    $28
+       cmpult  $23,    $21,    $19
+       addq    $23,    $28,    $23
+       addq    $8,     $19,    $8
+       mulq    $3,     $1,     $27
+       umulh   $3,     $1,     $24
+       cmplt   $27,    $31,    $20
+       cmplt   $24,    $31,    $25
+       addq    $27,    $27,    $27
+       addq    $24,    $24,    $24
+       addq    $24,    $20,    $24
+       addq    $8,     $25,    $8
+       addq    $22,    $27,    $22
+       addq    $23,    $24,    $23
+       cmpult  $22,    $27,    $18
+       cmpult  $23,    $24,    $17
+       addq    $23,    $18,    $23
+       addq    $8,     $17,    $8
+       mulq    $4,     $0,     $21
+       umulh   $4,     $0,     $28
+       cmplt   $21,    $31,    $19
+       cmplt   $28,    $31,    $20
+       addq    $21,    $21,    $21
+       addq    $28,    $28,    $28
+       addq    $28,    $19,    $28
+       addq    $8,     $20,    $8
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       cmpult  $22,    $21,    $25
+       cmpult  $23,    $28,    $27
+       addq    $23,    $25,    $23
+       addq    $8,     $27,    $8
+       stq     $22,    32($16)
+       bis     $31,    $31,    $22
+       mulq    $3,     $2,     $24
+       umulh   $3,     $2,     $18
+       cmplt   $24,    $31,    $17
+       cmplt   $18,    $31,    $19
+       addq    $24,    $24,    $24
+       addq    $18,    $18,    $18
+       addq    $18,    $17,    $18
+       addq    $22,    $19,    $22
+       addq    $23,    $24,    $23
+       addq    $8,     $18,    $8
+       cmpult  $23,    $24,    $20
+       cmpult  $8,     $18,    $21
+       addq    $8,     $20,    $8
+       addq    $22,    $21,    $22
+       mulq    $4,     $1,     $28
+       umulh   $4,     $1,     $25
+       cmplt   $28,    $31,    $27
+       cmplt   $25,    $31,    $17
+       addq    $28,    $28,    $28
+       addq    $25,    $25,    $25
+       addq    $25,    $27,    $25
+       addq    $22,    $17,    $22
+       addq    $23,    $28,    $23
+       addq    $8,     $25,    $8
+       cmpult  $23,    $28,    $19
+       cmpult  $8,     $25,    $24
+       addq    $8,     $19,    $8
+       addq    $22,    $24,    $22
+       mulq    $5,     $0,     $18
+       umulh   $5,     $0,     $20
+       cmplt   $18,    $31,    $21
+       cmplt   $20,    $31,    $27
+       addq    $18,    $18,    $18
+       addq    $20,    $20,    $20
+       addq    $20,    $21,    $20
+       addq    $22,    $27,    $22
+       addq    $23,    $18,    $23
+       addq    $8,     $20,    $8
+       cmpult  $23,    $18,    $17
+       cmpult  $8,     $20,    $28
+       addq    $8,     $17,    $8
+       addq    $22,    $28,    $22
+       stq     $23,    40($16)
+       bis     $31,    $31,    $23
+       mulq    $3,     $3,     $25
+       umulh   $3,     $3,     $19
+       addq    $8,     $25,    $8
+       addq    $22,    $19,    $22
+       cmpult  $8,     $25,    $24
+       cmpult  $22,    $19,    $21
+       addq    $22,    $24,    $22
+       addq    $23,    $21,    $23
+       mulq    $4,     $2,     $27
+       umulh   $4,     $2,     $18
+       cmplt   $27,    $31,    $20
+       cmplt   $18,    $31,    $17
+       addq    $27,    $27,    $27
+       addq    $18,    $18,    $18
+       addq    $18,    $20,    $18
+       addq    $23,    $17,    $23
+       addq    $8,     $27,    $8
+       addq    $22,    $18,    $22
+       cmpult  $8,     $27,    $28
+       cmpult  $22,    $18,    $25
+       addq    $22,    $28,    $22
+       addq    $23,    $25,    $23
+       mulq    $5,     $1,     $19
+       umulh   $5,     $1,     $24
+       cmplt   $19,    $31,    $21
+       cmplt   $24,    $31,    $20
+       addq    $19,    $19,    $19
+       addq    $24,    $24,    $24
+       addq    $24,    $21,    $24
+       addq    $23,    $20,    $23
+       addq    $8,     $19,    $8
+       addq    $22,    $24,    $22
+       cmpult  $8,     $19,    $17
+       cmpult  $22,    $24,    $27
+       addq    $22,    $17,    $22
+       addq    $23,    $27,    $23
+       mulq    $6,     $0,     $18
+       umulh   $6,     $0,     $28
+       cmplt   $18,    $31,    $25
+       cmplt   $28,    $31,    $21
+       addq    $18,    $18,    $18
+       addq    $28,    $28,    $28
+       addq    $28,    $25,    $28
+       addq    $23,    $21,    $23
+       addq    $8,     $18,    $8
+       addq    $22,    $28,    $22
+       cmpult  $8,     $18,    $20
+       cmpult  $22,    $28,    $19
+       addq    $22,    $20,    $22
+       addq    $23,    $19,    $23
+       stq     $8,     48($16)
+       bis     $31,    $31,    $8
+       mulq    $4,     $3,     $24
+       umulh   $4,     $3,     $17
+       cmplt   $24,    $31,    $27
+       cmplt   $17,    $31,    $25
+       addq    $24,    $24,    $24
+       addq    $17,    $17,    $17
+       addq    $17,    $27,    $17
+       addq    $8,     $25,    $8
+       addq    $22,    $24,    $22
+       addq    $23,    $17,    $23
+       cmpult  $22,    $24,    $21
+       cmpult  $23,    $17,    $18
+       addq    $23,    $21,    $23
+       addq    $8,     $18,    $8
+       mulq    $5,     $2,     $28
+       umulh   $5,     $2,     $20
+       cmplt   $28,    $31,    $19
+       cmplt   $20,    $31,    $27
+       addq    $28,    $28,    $28
+       addq    $20,    $20,    $20
+       addq    $20,    $19,    $20
+       addq    $8,     $27,    $8
+       addq    $22,    $28,    $22
+       addq    $23,    $20,    $23
+       cmpult  $22,    $28,    $25
+       cmpult  $23,    $20,    $24
+       addq    $23,    $25,    $23
+       addq    $8,     $24,    $8
+       mulq    $6,     $1,     $17
+       umulh   $6,     $1,     $21
+       cmplt   $17,    $31,    $18
+       cmplt   $21,    $31,    $19
+       addq    $17,    $17,    $17
+       addq    $21,    $21,    $21
+       addq    $21,    $18,    $21
+       addq    $8,     $19,    $8
+       addq    $22,    $17,    $22
+       addq    $23,    $21,    $23
+       cmpult  $22,    $17,    $27
+       cmpult  $23,    $21,    $28
+       addq    $23,    $27,    $23
+       addq    $8,     $28,    $8
+       mulq    $7,     $0,     $20
+       umulh   $7,     $0,     $25
+       cmplt   $20,    $31,    $24
+       cmplt   $25,    $31,    $18
+       addq    $20,    $20,    $20
+       addq    $25,    $25,    $25
+       addq    $25,    $24,    $25
+       addq    $8,     $18,    $8
+       addq    $22,    $20,    $22
+       addq    $23,    $25,    $23
+       cmpult  $22,    $20,    $19
+       cmpult  $23,    $25,    $17
+       addq    $23,    $19,    $23
+       addq    $8,     $17,    $8
+       stq     $22,    56($16)
+       bis     $31,    $31,    $22
+       mulq    $4,     $4,     $21
+       umulh   $4,     $4,     $27
+       addq    $23,    $21,    $23
+       addq    $8,     $27,    $8
+       cmpult  $23,    $21,    $28
+       cmpult  $8,     $27,    $24
+       addq    $8,     $28,    $8
+       addq    $22,    $24,    $22
+       mulq    $5,     $3,     $18
+       umulh   $5,     $3,     $20
+       cmplt   $18,    $31,    $25
+       cmplt   $20,    $31,    $19
+       addq    $18,    $18,    $18
+       addq    $20,    $20,    $20
+       addq    $20,    $25,    $20
+       addq    $22,    $19,    $22
+       addq    $23,    $18,    $23
+       addq    $8,     $20,    $8
+       cmpult  $23,    $18,    $17
+       cmpult  $8,     $20,    $21
+       addq    $8,     $17,    $8
+       addq    $22,    $21,    $22
+       mulq    $6,     $2,     $27
+       umulh   $6,     $2,     $28
+       cmplt   $27,    $31,    $24
+       cmplt   $28,    $31,    $25
+       addq    $27,    $27,    $27
+       addq    $28,    $28,    $28
+       addq    $28,    $24,    $28
+       addq    $22,    $25,    $22
+       addq    $23,    $27,    $23
+       addq    $8,     $28,    $8
+       cmpult  $23,    $27,    $19
+       cmpult  $8,     $28,    $18
+       addq    $8,     $19,    $8
+       addq    $22,    $18,    $22
+       mulq    $7,     $1,     $20
+       umulh   $7,     $1,     $17
+       cmplt   $20,    $31,    $21
+       cmplt   $17,    $31,    $24
+       addq    $20,    $20,    $20
+       addq    $17,    $17,    $17
+       addq    $17,    $21,    $17
+       addq    $22,    $24,    $22
+       addq    $23,    $20,    $23
+       addq    $8,     $17,    $8
+       cmpult  $23,    $20,    $25
+       cmpult  $8,     $17,    $27
+       addq    $8,     $25,    $8
+       addq    $22,    $27,    $22
+       stq     $23,    64($16)
+       bis     $31,    $31,    $23
+       mulq    $5,     $4,     $28
+       umulh   $5,     $4,     $19
+       cmplt   $28,    $31,    $18
+       cmplt   $19,    $31,    $21
+       addq    $28,    $28,    $28
+       addq    $19,    $19,    $19
+       addq    $19,    $18,    $19
+       addq    $23,    $21,    $23
+       addq    $8,     $28,    $8
+       addq    $22,    $19,    $22
+       cmpult  $8,     $28,    $24
+       cmpult  $22,    $19,    $20
+       addq    $22,    $24,    $22
+       addq    $23,    $20,    $23
+       mulq    $6,     $3,     $17
+       umulh   $6,     $3,     $25
+       cmplt   $17,    $31,    $27
+       cmplt   $25,    $31,    $18
+       addq    $17,    $17,    $17
+       addq    $25,    $25,    $25
+       addq    $25,    $27,    $25
+       addq    $23,    $18,    $23
+       addq    $8,     $17,    $8
+       addq    $22,    $25,    $22
+       cmpult  $8,     $17,    $21
+       cmpult  $22,    $25,    $28
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       mulq    $7,     $2,     $19
+       umulh   $7,     $2,     $24
+       cmplt   $19,    $31,    $20
+       cmplt   $24,    $31,    $27
+       addq    $19,    $19,    $19
+       addq    $24,    $24,    $24
+       addq    $24,    $20,    $24
+       addq    $23,    $27,    $23
+       addq    $8,     $19,    $8
+       addq    $22,    $24,    $22
+       cmpult  $8,     $19,    $18
+       cmpult  $22,    $24,    $17
+       addq    $22,    $18,    $22
+       addq    $23,    $17,    $23
+       stq     $8,     72($16)
+       bis     $31,    $31,    $8
+       mulq    $5,     $5,     $25
+       umulh   $5,     $5,     $21
+       addq    $22,    $25,    $22
+       addq    $23,    $21,    $23
+       cmpult  $22,    $25,    $28
+       cmpult  $23,    $21,    $20
+       addq    $23,    $28,    $23
+       addq    $8,     $20,    $8
+       mulq    $6,     $4,     $27
+       umulh   $6,     $4,     $19
+       cmplt   $27,    $31,    $24
+       cmplt   $19,    $31,    $18
+       addq    $27,    $27,    $27
+       addq    $19,    $19,    $19
+       addq    $19,    $24,    $19
+       addq    $8,     $18,    $8
+       addq    $22,    $27,    $22
+       addq    $23,    $19,    $23
+       cmpult  $22,    $27,    $17
+       cmpult  $23,    $19,    $25
+       addq    $23,    $17,    $23
+       addq    $8,     $25,    $8
+       mulq    $7,     $3,     $21
+       umulh   $7,     $3,     $28
+       cmplt   $21,    $31,    $20
+       cmplt   $28,    $31,    $24
+       addq    $21,    $21,    $21
+       addq    $28,    $28,    $28
+       addq    $28,    $20,    $28
+       addq    $8,     $24,    $8
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       cmpult  $22,    $21,    $18
+       cmpult  $23,    $28,    $27
+       addq    $23,    $18,    $23
+       addq    $8,     $27,    $8
+       stq     $22,    80($16)
+       bis     $31,    $31,    $22
+       mulq    $6,     $5,     $19
+       umulh   $6,     $5,     $17
+       cmplt   $19,    $31,    $25
+       cmplt   $17,    $31,    $20
+       addq    $19,    $19,    $19
+       addq    $17,    $17,    $17
+       addq    $17,    $25,    $17
+       addq    $22,    $20,    $22
+       addq    $23,    $19,    $23
+       addq    $8,     $17,    $8
+       cmpult  $23,    $19,    $24
+       cmpult  $8,     $17,    $21
+       addq    $8,     $24,    $8
+       addq    $22,    $21,    $22
+       mulq    $7,     $4,     $28
+       umulh   $7,     $4,     $18
+       cmplt   $28,    $31,    $27
+       cmplt   $18,    $31,    $25
+       addq    $28,    $28,    $28
+       addq    $18,    $18,    $18
+       addq    $18,    $27,    $18
+       addq    $22,    $25,    $22
+       addq    $23,    $28,    $23
+       addq    $8,     $18,    $8
+       cmpult  $23,    $28,    $20
+       cmpult  $8,     $18,    $19
+       addq    $8,     $20,    $8
+       addq    $22,    $19,    $22
+       stq     $23,    88($16)
+       bis     $31,    $31,    $23
+       mulq    $6,     $6,     $17
+       umulh   $6,     $6,     $24
+       addq    $8,     $17,    $8
+       addq    $22,    $24,    $22
+       cmpult  $8,     $17,    $21
+       cmpult  $22,    $24,    $27
+       addq    $22,    $21,    $22
+       addq    $23,    $27,    $23
+       mulq    $7,     $5,     $25
+       umulh   $7,     $5,     $28
+       cmplt   $25,    $31,    $18
+       cmplt   $28,    $31,    $20
+       addq    $25,    $25,    $25
+       addq    $28,    $28,    $28
+       addq    $28,    $18,    $28
+       addq    $23,    $20,    $23
+       addq    $8,     $25,    $8
+       addq    $22,    $28,    $22
+       cmpult  $8,     $25,    $19
+       cmpult  $22,    $28,    $17
+       addq    $22,    $19,    $22
+       addq    $23,    $17,    $23
+       stq     $8,     96($16)
+       bis     $31,    $31,    $8
+       mulq    $7,     $6,     $24
+       umulh   $7,     $6,     $21
+       cmplt   $24,    $31,    $27
+       cmplt   $21,    $31,    $18
+       addq    $24,    $24,    $24
+       addq    $21,    $21,    $21
+       addq    $21,    $27,    $21
+       addq    $8,     $18,    $8
+       addq    $22,    $24,    $22
+       addq    $23,    $21,    $23
+       cmpult  $22,    $24,    $20
+       cmpult  $23,    $21,    $25
+       addq    $23,    $20,    $23
+       addq    $8,     $25,    $8
+       stq     $22,    104($16)
+       bis     $31,    $31,    $22
+       mulq    $7,     $7,     $28
+       umulh   $7,     $7,     $19
+       addq    $23,    $28,    $23
+       addq    $8,     $19,    $8
+       cmpult  $23,    $28,    $17
+       cmpult  $8,     $19,    $27
+       addq    $8,     $17,    $8
+       addq    $22,    $27,    $22
+       stq     $23,    112($16)
+       stq     $8,     120($16)
+       ret     $31,($26),1
+       .end bn_sqr_comba8
diff --git a/crypto/bn/asm/f.c b/crypto/bn/asm/f.c
new file mode 100644 (file)
index 0000000..bfdccae
--- /dev/null
@@ -0,0 +1,8 @@
+int abc(a,b,c,d,e,f,g,h,i,j)
+unsigned long a,b,c,d,e,f,g,h,i,j;
+       {
+       gg(g);
+       if (g)
+               gg(h);
+       gg(i);
+       }
diff --git a/crypto/bn/asm/f.elf b/crypto/bn/asm/f.elf
new file mode 100644 (file)
index 0000000..39d07b7
--- /dev/null
@@ -0,0 +1,2149 @@
+       # Don't even think of reading this code 
+       # It was automatically generated by bn-586.pl 
+       # Which is a perl program used to generate the x86 assember for 
+       # any of elf, a.out, BSDI,Win32, or Solaris 
+       # eric <eay@cryptsoft.com> 
+
+       .file   "bn-586.s"
+       .version        "01.01"
+gcc2_compiled.:
+.text
+       .align 16
+.globl bn_mul_add_words
+       .type   bn_mul_add_words,@function
+bn_mul_add_words:
+       pushl   %ebp
+       pushl   %ebx
+       pushl   %esi
+       pushl   %edi
+
+
+       xorl    %esi,           %esi
+       movl    20(%esp),       %edi
+       movl    28(%esp),       %ecx
+       movl    24(%esp),       %ebx
+       andl    $4294967288,    %ecx
+       movl    32(%esp),       %ebp
+       pushl   %ecx
+       jz      .L000maw_finish
+.L001maw_loop:
+       movl    %ecx,           (%esp)
+       # Round 0 
+       movl    (%ebx),         %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    (%edi),         %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           (%edi)
+       movl    %edx,           %esi
+       # Round 4 
+       movl    4(%ebx),        %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    4(%edi),        %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           4(%edi)
+       movl    %edx,           %esi
+       # Round 8 
+       movl    8(%ebx),        %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    8(%edi),        %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           8(%edi)
+       movl    %edx,           %esi
+       # Round 12 
+       movl    12(%ebx),       %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    12(%edi),       %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           12(%edi)
+       movl    %edx,           %esi
+       # Round 16 
+       movl    16(%ebx),       %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    16(%edi),       %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           16(%edi)
+       movl    %edx,           %esi
+       # Round 20 
+       movl    20(%ebx),       %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    20(%edi),       %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           20(%edi)
+       movl    %edx,           %esi
+       # Round 24 
+       movl    24(%ebx),       %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    24(%edi),       %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           24(%edi)
+       movl    %edx,           %esi
+       # Round 28 
+       movl    28(%ebx),       %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    28(%edi),       %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           28(%edi)
+       movl    %edx,           %esi
+
+       movl    (%esp),         %ecx
+       addl    $32,            %ebx
+       addl    $32,            %edi
+       subl    $8,             %ecx
+       jnz     .L001maw_loop
+.L000maw_finish:
+       movl    32(%esp),       %ecx
+       andl    $7,             %ecx
+       jnz     .L002maw_finish2
+       jmp     .L003maw_end
+.align 16
+.L002maw_finish2:
+       # Tail Round 0 
+       movl    (%ebx),         %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    (%edi),         %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       decl    %ecx
+       movl    %eax,           (%edi)
+       movl    %edx,           %esi
+       jz      .L003maw_end
+       # Tail Round 1 
+       movl    4(%ebx),        %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    4(%edi),        %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       decl    %ecx
+       movl    %eax,           4(%edi)
+       movl    %edx,           %esi
+       jz      .L003maw_end
+       # Tail Round 2 
+       movl    8(%ebx),        %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    8(%edi),        %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       decl    %ecx
+       movl    %eax,           8(%edi)
+       movl    %edx,           %esi
+       jz      .L003maw_end
+       # Tail Round 3 
+       movl    12(%ebx),       %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    12(%edi),       %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       decl    %ecx
+       movl    %eax,           12(%edi)
+       movl    %edx,           %esi
+       jz      .L003maw_end
+       # Tail Round 4 
+       movl    16(%ebx),       %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    16(%edi),       %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       decl    %ecx
+       movl    %eax,           16(%edi)
+       movl    %edx,           %esi
+       jz      .L003maw_end
+       # Tail Round 5 
+       movl    20(%ebx),       %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    20(%edi),       %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       decl    %ecx
+       movl    %eax,           20(%edi)
+       movl    %edx,           %esi
+       jz      .L003maw_end
+       # Tail Round 6 
+       movl    24(%ebx),       %eax
+       mull    %ebp
+       addl    %esi,           %eax
+       movl    24(%edi),       %esi
+       adcl    $0,             %edx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           24(%edi)
+       movl    %edx,           %esi
+.L003maw_end:
+       movl    %esi,           %eax
+       popl    %ecx
+       popl    %edi
+       popl    %esi
+       popl    %ebx
+       popl    %ebp
+       ret
+.bn_mul_add_words_end:
+       .size   bn_mul_add_words,.bn_mul_add_words_end-bn_mul_add_words
+.ident "bn_mul_add_words"
+.text
+       .align 16
+.globl bn_mul_words
+       .type   bn_mul_words,@function
+bn_mul_words:
+       pushl   %ebp
+       pushl   %ebx
+       pushl   %esi
+       pushl   %edi
+
+
+       xorl    %esi,           %esi
+       movl    20(%esp),       %edi
+       movl    24(%esp),       %ebx
+       movl    28(%esp),       %ebp
+       movl    32(%esp),       %ecx
+       andl    $4294967288,    %ebp
+       jz      .L004mw_finish
+.L005mw_loop:
+       # Round 0 
+       movl    (%ebx),         %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           (%edi)
+       movl    %edx,           %esi
+       # Round 4 
+       movl    4(%ebx),        %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           4(%edi)
+       movl    %edx,           %esi
+       # Round 8 
+       movl    8(%ebx),        %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           8(%edi)
+       movl    %edx,           %esi
+       # Round 12 
+       movl    12(%ebx),       %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           12(%edi)
+       movl    %edx,           %esi
+       # Round 16 
+       movl    16(%ebx),       %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           16(%edi)
+       movl    %edx,           %esi
+       # Round 20 
+       movl    20(%ebx),       %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           20(%edi)
+       movl    %edx,           %esi
+       # Round 24 
+       movl    24(%ebx),       %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           24(%edi)
+       movl    %edx,           %esi
+       # Round 28 
+       movl    28(%ebx),       %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           28(%edi)
+       movl    %edx,           %esi
+
+       addl    $32,            %ebx
+       addl    $32,            %edi
+       subl    $8,             %ebp
+       jz      .L004mw_finish
+       jmp     .L005mw_loop
+.L004mw_finish:
+       movl    28(%esp),       %ebp
+       andl    $7,             %ebp
+       jnz     .L006mw_finish2
+       jmp     .L007mw_end
+.align 16
+.L006mw_finish2:
+       # Tail Round 0 
+       movl    (%ebx),         %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           (%edi)
+       movl    %edx,           %esi
+       decl    %ebp
+       jz      .L007mw_end
+       # Tail Round 1 
+       movl    4(%ebx),        %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           4(%edi)
+       movl    %edx,           %esi
+       decl    %ebp
+       jz      .L007mw_end
+       # Tail Round 2 
+       movl    8(%ebx),        %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           8(%edi)
+       movl    %edx,           %esi
+       decl    %ebp
+       jz      .L007mw_end
+       # Tail Round 3 
+       movl    12(%ebx),       %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           12(%edi)
+       movl    %edx,           %esi
+       decl    %ebp
+       jz      .L007mw_end
+       # Tail Round 4 
+       movl    16(%ebx),       %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           16(%edi)
+       movl    %edx,           %esi
+       decl    %ebp
+       jz      .L007mw_end
+       # Tail Round 5 
+       movl    20(%ebx),       %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           20(%edi)
+       movl    %edx,           %esi
+       decl    %ebp
+       jz      .L007mw_end
+       # Tail Round 6 
+       movl    24(%ebx),       %eax
+       mull    %ecx
+       addl    %esi,           %eax
+       adcl    $0,             %edx
+       movl    %eax,           24(%edi)
+       movl    %edx,           %esi
+.L007mw_end:
+       movl    %esi,           %eax
+       popl    %edi
+       popl    %esi
+       popl    %ebx
+       popl    %ebp
+       ret
+.bn_mul_words_end:
+       .size   bn_mul_words,.bn_mul_words_end-bn_mul_words
+.ident "bn_mul_words"
+.text
+       .align 16
+.globl bn_sqr_words
+       .type   bn_sqr_words,@function
+bn_sqr_words:
+       pushl   %ebp
+       pushl   %ebx
+       pushl   %esi
+       pushl   %edi
+
+
+       movl    20(%esp),       %esi
+       movl    24(%esp),       %edi
+       movl    28(%esp),       %ebx
+       andl    $4294967288,    %ebx
+       jz      .L008sw_finish
+.L009sw_loop:
+       # Round 0 
+       movl    (%edi),         %eax
+       mull    %eax
+       movl    %eax,           (%esi)
+       movl    %edx,           4(%esi)
+       # Round 4 
+       movl    4(%edi),        %eax
+       mull    %eax
+       movl    %eax,           8(%esi)
+       movl    %edx,           12(%esi)
+       # Round 8 
+       movl    8(%edi),        %eax
+       mull    %eax
+       movl    %eax,           16(%esi)
+       movl    %edx,           20(%esi)
+       # Round 12 
+       movl    12(%edi),       %eax
+       mull    %eax
+       movl    %eax,           24(%esi)
+       movl    %edx,           28(%esi)
+       # Round 16 
+       movl    16(%edi),       %eax
+       mull    %eax
+       movl    %eax,           32(%esi)
+       movl    %edx,           36(%esi)
+       # Round 20 
+       movl    20(%edi),       %eax
+       mull    %eax
+       movl    %eax,           40(%esi)
+       movl    %edx,           44(%esi)
+       # Round 24 
+       movl    24(%edi),       %eax
+       mull    %eax
+       movl    %eax,           48(%esi)
+       movl    %edx,           52(%esi)
+       # Round 28 
+       movl    28(%edi),       %eax
+       mull    %eax
+       movl    %eax,           56(%esi)
+       movl    %edx,           60(%esi)
+
+       addl    $32,            %edi
+       addl    $64,            %esi
+       subl    $8,             %ebx
+       jnz     .L009sw_loop
+.L008sw_finish:
+       movl    28(%esp),       %ebx
+       andl    $7,             %ebx
+       jz      .L010sw_end
+       # Tail Round 0 
+       movl    (%edi),         %eax
+       mull    %eax
+       movl    %eax,           (%esi)
+       decl    %ebx
+       movl    %edx,           4(%esi)
+       jz      .L010sw_end
+       # Tail Round 1 
+       movl    4(%edi),        %eax
+       mull    %eax
+       movl    %eax,           8(%esi)
+       decl    %ebx
+       movl    %edx,           12(%esi)
+       jz      .L010sw_end
+       # Tail Round 2 
+       movl    8(%edi),        %eax
+       mull    %eax
+       movl    %eax,           16(%esi)
+       decl    %ebx
+       movl    %edx,           20(%esi)
+       jz      .L010sw_end
+       # Tail Round 3 
+       movl    12(%edi),       %eax
+       mull    %eax
+       movl    %eax,           24(%esi)
+       decl    %ebx
+       movl    %edx,           28(%esi)
+       jz      .L010sw_end
+       # Tail Round 4 
+       movl    16(%edi),       %eax
+       mull    %eax
+       movl    %eax,           32(%esi)
+       decl    %ebx
+       movl    %edx,           36(%esi)
+       jz      .L010sw_end
+       # Tail Round 5 
+       movl    20(%edi),       %eax
+       mull    %eax
+       movl    %eax,           40(%esi)
+       decl    %ebx
+       movl    %edx,           44(%esi)
+       jz      .L010sw_end
+       # Tail Round 6 
+       movl    24(%edi),       %eax
+       mull    %eax
+       movl    %eax,           48(%esi)
+       movl    %edx,           52(%esi)
+.L010sw_end:
+       popl    %edi
+       popl    %esi
+       popl    %ebx
+       popl    %ebp
+       ret
+.bn_sqr_words_end:
+       .size   bn_sqr_words,.bn_sqr_words_end-bn_sqr_words
+.ident "bn_sqr_words"
+.text
+       .align 16
+.globl bn_div64
+       .type   bn_div64,@function
+bn_div64:
+       pushl   %ebp
+       pushl   %ebx
+       pushl   %esi
+       pushl   %edi
+
+       movl    20(%esp),       %edx
+       movl    24(%esp),       %eax
+       movl    28(%esp),       %ebx
+       divl    %ebx
+       popl    %edi
+       popl    %esi
+       popl    %ebx
+       popl    %ebp
+       ret
+.bn_div64_end:
+       .size   bn_div64,.bn_div64_end-bn_div64
+.ident "bn_div64"
+.text
+       .align 16
+.globl bn_add_words
+       .type   bn_add_words,@function
+bn_add_words:
+       pushl   %ebp
+       pushl   %ebx
+       pushl   %esi
+       pushl   %edi
+
+
+       movl    20(%esp),       %ebx
+       movl    24(%esp),       %esi
+       movl    28(%esp),       %edi
+       movl    32(%esp),       %ebp
+       xorl    %eax,           %eax
+       andl    $4294967288,    %ebp
+       jz      .L011aw_finish
+.L012aw_loop:
+       # Round 0 
+       movl    (%esi),         %ecx
+       movl    (%edi),         %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           (%ebx)
+       # Round 1 
+       movl    4(%esi),        %ecx
+       movl    4(%edi),        %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           4(%ebx)
+       # Round 2 
+       movl    8(%esi),        %ecx
+       movl    8(%edi),        %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           8(%ebx)
+       # Round 3 
+       movl    12(%esi),       %ecx
+       movl    12(%edi),       %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           12(%ebx)
+       # Round 4 
+       movl    16(%esi),       %ecx
+       movl    16(%edi),       %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           16(%ebx)
+       # Round 5 
+       movl    20(%esi),       %ecx
+       movl    20(%edi),       %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           20(%ebx)
+       # Round 6 
+       movl    24(%esi),       %ecx
+       movl    24(%edi),       %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           24(%ebx)
+       # Round 7 
+       movl    28(%esi),       %ecx
+       movl    28(%edi),       %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           28(%ebx)
+
+       addl    $32,            %esi
+       addl    $32,            %edi
+       addl    $32,            %ebx
+       subl    $8,             %ebp
+       jnz     .L012aw_loop
+.L011aw_finish:
+       movl    32(%esp),       %ebp
+       andl    $7,             %ebp
+       jz      .L013aw_end
+       # Tail Round 0 
+       movl    (%esi),         %ecx
+       movl    (%edi),         %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           (%ebx)
+       jz      .L013aw_end
+       # Tail Round 1 
+       movl    4(%esi),        %ecx
+       movl    4(%edi),        %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           4(%ebx)
+       jz      .L013aw_end
+       # Tail Round 2 
+       movl    8(%esi),        %ecx
+       movl    8(%edi),        %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           8(%ebx)
+       jz      .L013aw_end
+       # Tail Round 3 
+       movl    12(%esi),       %ecx
+       movl    12(%edi),       %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           12(%ebx)
+       jz      .L013aw_end
+       # Tail Round 4 
+       movl    16(%esi),       %ecx
+       movl    16(%edi),       %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           16(%ebx)
+       jz      .L013aw_end
+       # Tail Round 5 
+       movl    20(%esi),       %ecx
+       movl    20(%edi),       %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           20(%ebx)
+       jz      .L013aw_end
+       # Tail Round 6 
+       movl    24(%esi),       %ecx
+       movl    24(%edi),       %edx
+       addl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       addl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           24(%ebx)
+.L013aw_end:
+       popl    %edi
+       popl    %esi
+       popl    %ebx
+       popl    %ebp
+       ret
+.bn_add_words_end:
+       .size   bn_add_words,.bn_add_words_end-bn_add_words
+.ident "bn_add_words"
+.text
+       .align 16
+.globl bn_sub_words
+       .type   bn_sub_words,@function
+bn_sub_words:
+       pushl   %ebp
+       pushl   %ebx
+       pushl   %esi
+       pushl   %edi
+
+
+       movl    20(%esp),       %ebx
+       movl    24(%esp),       %esi
+       movl    28(%esp),       %edi
+       movl    32(%esp),       %ebp
+       xorl    %eax,           %eax
+       andl    $4294967288,    %ebp
+       jz      .L014aw_finish
+.L015aw_loop:
+       # Round 0 
+       movl    (%esi),         %ecx
+       movl    (%edi),         %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           (%ebx)
+       # Round 1 
+       movl    4(%esi),        %ecx
+       movl    4(%edi),        %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           4(%ebx)
+       # Round 2 
+       movl    8(%esi),        %ecx
+       movl    8(%edi),        %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           8(%ebx)
+       # Round 3 
+       movl    12(%esi),       %ecx
+       movl    12(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           12(%ebx)
+       # Round 4 
+       movl    16(%esi),       %ecx
+       movl    16(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           16(%ebx)
+       # Round 5 
+       movl    20(%esi),       %ecx
+       movl    20(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           20(%ebx)
+       # Round 6 
+       movl    24(%esi),       %ecx
+       movl    24(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           24(%ebx)
+       # Round 7 
+       movl    28(%esi),       %ecx
+       movl    28(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           28(%ebx)
+
+       addl    $32,            %esi
+       addl    $32,            %edi
+       addl    $32,            %ebx
+       subl    $8,             %ebp
+       jnz     .L015aw_loop
+.L014aw_finish:
+       movl    32(%esp),       %ebp
+       andl    $7,             %ebp
+       jz      .L016aw_end
+       # Tail Round 0 
+       movl    (%esi),         %ecx
+       movl    (%edi),         %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           (%ebx)
+       jz      .L016aw_end
+       # Tail Round 1 
+       movl    4(%esi),        %ecx
+       movl    4(%edi),        %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           4(%ebx)
+       jz      .L016aw_end
+       # Tail Round 2 
+       movl    8(%esi),        %ecx
+       movl    8(%edi),        %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           8(%ebx)
+       jz      .L016aw_end
+       # Tail Round 3 
+       movl    12(%esi),       %ecx
+       movl    12(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           12(%ebx)
+       jz      .L016aw_end
+       # Tail Round 4 
+       movl    16(%esi),       %ecx
+       movl    16(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           16(%ebx)
+       jz      .L016aw_end
+       # Tail Round 5 
+       movl    20(%esi),       %ecx
+       movl    20(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       decl    %ebp
+       movl    %ecx,           20(%ebx)
+       jz      .L016aw_end
+       # Tail Round 6 
+       movl    24(%esi),       %ecx
+       movl    24(%edi),       %edx
+       subl    %eax,           %ecx
+       movl    $0,             %eax
+       adcl    %eax,           %eax
+       subl    %edx,           %ecx
+       adcl    $0,             %eax
+       movl    %ecx,           24(%ebx)
+.L016aw_end:
+       popl    %edi
+       popl    %esi
+       popl    %ebx
+       popl    %ebp
+       ret
+.bn_sub_words_end:
+       .size   bn_sub_words,.bn_sub_words_end-bn_sub_words
+.ident "bn_sub_words"
+.text
+       .align 16
+.globl bn_mul_comba8
+       .type   bn_mul_comba8,@function
+bn_mul_comba8:
+       pushl   %esi
+       movl    12(%esp),       %esi
+       pushl   %edi
+       movl    20(%esp),       %edi
+       pushl   %ebp
+       pushl   %ebx
+       xorl    %ebx,           %ebx
+       movl    (%esi),         %eax
+       xorl    %ecx,           %ecx
+       movl    (%edi),         %edx
+       # ################## Calculate word 0 
+       xorl    %ebp,           %ebp
+       # mul a[0]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%eax)
+       movl    4(%esi),        %eax
+       # saved r[0] 
+       # ################## Calculate word 1 
+       xorl    %ebx,           %ebx
+       # mul a[1]*b[0] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[0]*b[1] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    (%edi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%eax)
+       movl    8(%esi),        %eax
+       # saved r[1] 
+       # ################## Calculate word 2 
+       xorl    %ecx,           %ecx
+       # mul a[2]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[1]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[0]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    (%edi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%eax)
+       movl    12(%esi),       %eax
+       # saved r[2] 
+       # ################## Calculate word 3 
+       xorl    %ebp,           %ebp
+       # mul a[3]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       # mul a[2]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebp
+       # mul a[1]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[0]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%eax)
+       movl    16(%esi),       %eax
+       # saved r[3] 
+       # ################## Calculate word 4 
+       xorl    %ebx,           %ebx
+       # mul a[4]*b[0] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[3]*b[1] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[2]*b[2] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[1]*b[3] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[0]*b[4] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    (%edi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%eax)
+       movl    20(%esi),       %eax
+       # saved r[4] 
+       # ################## Calculate word 5 
+       xorl    %ecx,           %ecx
+       # mul a[5]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[4]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[3]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[2]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[1]*b[4] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[0]*b[5] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    (%edi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%eax)
+       movl    24(%esi),       %eax
+       # saved r[5] 
+       # ################## Calculate word 6 
+       xorl    %ebp,           %ebp
+       # mul a[6]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       # mul a[5]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebp
+       # mul a[4]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[3]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[2]*b[4] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[1]*b[5] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[0]*b[6] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%eax)
+       movl    28(%esi),       %eax
+       # saved r[6] 
+       # ################## Calculate word 7 
+       xorl    %ebx,           %ebx
+       # mul a[7]*b[0] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[6]*b[1] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[5]*b[2] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[4]*b[3] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[3]*b[4] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[2]*b[5] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[1]*b[6] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[0]*b[7] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           28(%eax)
+       movl    28(%esi),       %eax
+       # saved r[7] 
+       # ################## Calculate word 8 
+       xorl    %ecx,           %ecx
+       # mul a[7]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[6]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[5]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[4]*b[4] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[3]*b[5] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[2]*b[6] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[1]*b[7] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           32(%eax)
+       movl    28(%esi),       %eax
+       # saved r[8] 
+       # ################## Calculate word 9 
+       xorl    %ebp,           %ebp
+       # mul a[7]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[6]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[5]*b[4] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[4]*b[5] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[3]*b[6] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[2]*b[7] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           36(%eax)
+       movl    28(%esi),       %eax
+       # saved r[9] 
+       # ################## Calculate word 10 
+       xorl    %ebx,           %ebx
+       # mul a[7]*b[3] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[6]*b[4] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    20(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[5]*b[5] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[4]*b[6] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    12(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[3]*b[7] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    16(%edi),       %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           40(%eax)
+       movl    28(%esi),       %eax
+       # saved r[10] 
+       # ################## Calculate word 11 
+       xorl    %ecx,           %ecx
+       # mul a[7]*b[4] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[6]*b[5] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[5]*b[6] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    16(%esi),       %eax
+       adcl    %edx,           %ebx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[4]*b[7] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    20(%edi),       %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           44(%eax)
+       movl    28(%esi),       %eax
+       # saved r[11] 
+       # ################## Calculate word 12 
+       xorl    %ebp,           %ebp
+       # mul a[7]*b[5] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[6]*b[6] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esi),       %eax
+       adcl    %edx,           %ecx
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[5]*b[7] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    24(%edi),       %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           48(%eax)
+       movl    28(%esi),       %eax
+       # saved r[12] 
+       # ################## Calculate word 13 
+       xorl    %ebx,           %ebx
+       # mul a[7]*b[6] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    24(%esi),       %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[6]*b[7] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    28(%edi),       %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           52(%eax)
+       movl    28(%esi),       %eax
+       # saved r[13] 
+       # ################## Calculate word 14 
+       xorl    %ecx,           %ecx
+       # mul a[7]*b[7] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       adcl    $0,             %ecx
+       movl    %ebp,           56(%eax)
+       # saved r[14] 
+       # save r[15] 
+       movl    %ebx,           60(%eax)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_mul_comba8_end:
+       .size   bn_mul_comba8,.bn_mul_comba8_end-bn_mul_comba8
+.ident "desasm.pl"
+.text
+       .align 16
+.globl bn_mul_comba4
+       .type   bn_mul_comba4,@function
+bn_mul_comba4:
+       pushl   %esi
+       movl    12(%esp),       %esi
+       pushl   %edi
+       movl    20(%esp),       %edi
+       pushl   %ebp
+       pushl   %ebx
+       xorl    %ebx,           %ebx
+       movl    (%esi),         %eax
+       xorl    %ecx,           %ecx
+       movl    (%edi),         %edx
+       # ################## Calculate word 0 
+       xorl    %ebp,           %ebp
+       # mul a[0]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    (%edi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%eax)
+       movl    4(%esi),        %eax
+       # saved r[0] 
+       # ################## Calculate word 1 
+       xorl    %ebx,           %ebx
+       # mul a[1]*b[0] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebp
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[0]*b[1] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    (%edi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%eax)
+       movl    8(%esi),        %eax
+       # saved r[1] 
+       # ################## Calculate word 2 
+       xorl    %ecx,           %ecx
+       # mul a[2]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[1]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    (%esi),         %eax
+       adcl    %edx,           %ebx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ecx
+       # mul a[0]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    (%edi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%eax)
+       movl    12(%esi),       %eax
+       # saved r[2] 
+       # ################## Calculate word 3 
+       xorl    %ebp,           %ebp
+       # mul a[3]*b[0] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       # mul a[2]*b[1] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ecx
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebp
+       # mul a[1]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    (%esi),         %eax
+       adcl    %edx,           %ecx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebp
+       # mul a[0]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       movl    4(%edi),        %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%eax)
+       movl    12(%esi),       %eax
+       # saved r[3] 
+       # ################## Calculate word 4 
+       xorl    %ebx,           %ebx
+       # mul a[3]*b[1] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       # mul a[2]*b[2] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    4(%esi),        %eax
+       adcl    %edx,           %ebp
+       movl    12(%edi),       %edx
+       adcl    $0,             %ebx
+       # mul a[1]*b[3] 
+       mull    %edx
+       addl    %eax,           %ecx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebp
+       movl    8(%edi),        %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%eax)
+       movl    12(%esi),       %eax
+       # saved r[4] 
+       # ################## Calculate word 5 
+       xorl    %ecx,           %ecx
+       # mul a[3]*b[2] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    8(%esi),        %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       # mul a[2]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ebx
+       movl    12(%edi),       %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%eax)
+       movl    12(%esi),       %eax
+       # saved r[5] 
+       # ################## Calculate word 6 
+       xorl    %ebp,           %ebp
+       # mul a[3]*b[3] 
+       mull    %edx
+       addl    %eax,           %ebx
+       movl    20(%esp),       %eax
+       adcl    %edx,           %ecx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%eax)
+       # saved r[6] 
+       # save r[7] 
+       movl    %ecx,           28(%eax)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_mul_comba4_end:
+       .size   bn_mul_comba4,.bn_mul_comba4_end-bn_mul_comba4
+.ident "desasm.pl"
+.text
+       .align 16
+.globl bn_sqr_comba8
+       .type   bn_sqr_comba8,@function
+bn_sqr_comba8:
+       pushl   %esi
+       pushl   %edi
+       pushl   %ebp
+       pushl   %ebx
+       movl    20(%esp),       %edi
+       movl    24(%esp),       %esi
+       xorl    %ebx,           %ebx
+       xorl    %ecx,           %ecx
+       movl    (%esi),         %eax
+       # ############### Calculate word 0 
+       xorl    %ebp,           %ebp
+       # sqr a[0]*a[0] 
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    (%esi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%edi)
+       movl    4(%esi),        %eax
+       # saved r[0] 
+       # ############### Calculate word 1 
+       xorl    %ebx,           %ebx
+       # sqr a[1]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%edi)
+       movl    (%esi),         %edx
+       # saved r[1] 
+       # ############### Calculate word 2 
+       xorl    %ecx,           %ecx
+       # sqr a[2]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    4(%esi),        %eax
+       adcl    $0,             %ecx
+       # sqr a[1]*a[1] 
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    (%esi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%edi)
+       movl    12(%esi),       %eax
+       # saved r[2] 
+       # ############### Calculate word 3 
+       xorl    %ebp,           %ebp
+       # sqr a[3]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebp
+       movl    4(%esi),        %edx
+       # sqr a[2]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%edi)
+       movl    (%esi),         %edx
+       # saved r[3] 
+       # ############### Calculate word 4 
+       xorl    %ebx,           %ebx
+       # sqr a[4]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    12(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    4(%esi),        %edx
+       # sqr a[3]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       # sqr a[2]*a[2] 
+       mull    %eax
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    (%esi),         %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%edi)
+       movl    20(%esi),       %eax
+       # saved r[4] 
+       # ############### Calculate word 5 
+       xorl    %ecx,           %ecx
+       # sqr a[5]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    4(%esi),        %edx
+       # sqr a[4]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    8(%esi),        %edx
+       # sqr a[3]*a[2] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%edi)
+       movl    (%esi),         %edx
+       # saved r[5] 
+       # ############### Calculate word 6 
+       xorl    %ebp,           %ebp
+       # sqr a[6]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    4(%esi),        %edx
+       # sqr a[5]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    8(%esi),        %edx
+       # sqr a[4]*a[2] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ebp
+       # sqr a[3]*a[3] 
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    (%esi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%edi)
+       movl    28(%esi),       %eax
+       # saved r[6] 
+       # ############### Calculate word 7 
+       xorl    %ebx,           %ebx
+       # sqr a[7]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    4(%esi),        %edx
+       # sqr a[6]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    8(%esi),        %edx
+       # sqr a[5]*a[2] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    16(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    12(%esi),       %edx
+       # sqr a[4]*a[3] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    28(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           28(%edi)
+       movl    4(%esi),        %edx
+       # saved r[7] 
+       # ############### Calculate word 8 
+       xorl    %ecx,           %ecx
+       # sqr a[7]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    8(%esi),        %edx
+       # sqr a[6]*a[2] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    20(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    12(%esi),       %edx
+       # sqr a[5]*a[3] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    16(%esi),       %eax
+       adcl    $0,             %ecx
+       # sqr a[4]*a[4] 
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    8(%esi),        %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           32(%edi)
+       movl    28(%esi),       %eax
+       # saved r[8] 
+       # ############### Calculate word 9 
+       xorl    %ebp,           %ebp
+       # sqr a[7]*a[2] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    12(%esi),       %edx
+       # sqr a[6]*a[3] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    16(%esi),       %edx
+       # sqr a[5]*a[4] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    28(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    %ebx,           36(%edi)
+       movl    12(%esi),       %edx
+       # saved r[9] 
+       # ############### Calculate word 10 
+       xorl    %ebx,           %ebx
+       # sqr a[7]*a[3] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    16(%esi),       %edx
+       # sqr a[6]*a[4] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    20(%esi),       %eax
+       adcl    $0,             %ebx
+       # sqr a[5]*a[5] 
+       mull    %eax
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    16(%esi),       %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           40(%edi)
+       movl    28(%esi),       %eax
+       # saved r[10] 
+       # ############### Calculate word 11 
+       xorl    %ecx,           %ecx
+       # sqr a[7]*a[4] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    20(%esi),       %edx
+       # sqr a[6]*a[5] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    28(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    %ebp,           44(%edi)
+       movl    20(%esi),       %edx
+       # saved r[11] 
+       # ############### Calculate word 12 
+       xorl    %ebp,           %ebp
+       # sqr a[7]*a[5] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    24(%esi),       %eax
+       adcl    $0,             %ebp
+       # sqr a[6]*a[6] 
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    24(%esi),       %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           48(%edi)
+       movl    28(%esi),       %eax
+       # saved r[12] 
+       # ############### Calculate word 13 
+       xorl    %ebx,           %ebx
+       # sqr a[7]*a[6] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    28(%esi),       %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           52(%edi)
+       # saved r[13] 
+       # ############### Calculate word 14 
+       xorl    %ecx,           %ecx
+       # sqr a[7]*a[7] 
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       adcl    $0,             %ecx
+       movl    %ebp,           56(%edi)
+       # saved r[14] 
+       movl    %ebx,           60(%edi)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_sqr_comba8_end:
+       .size   bn_sqr_comba8,.bn_sqr_comba8_end-bn_sqr_comba8
+.ident "desasm.pl"
+.text
+       .align 16
+.globl bn_sqr_comba4
+       .type   bn_sqr_comba4,@function
+bn_sqr_comba4:
+       pushl   %esi
+       pushl   %edi
+       pushl   %ebp
+       pushl   %ebx
+       movl    20(%esp),       %edi
+       movl    24(%esp),       %esi
+       xorl    %ebx,           %ebx
+       xorl    %ecx,           %ecx
+       movl    (%esi),         %eax
+       # ############### Calculate word 0 
+       xorl    %ebp,           %ebp
+       # sqr a[0]*a[0] 
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    (%esi),         %edx
+       adcl    $0,             %ebp
+       movl    %ebx,           (%edi)
+       movl    4(%esi),        %eax
+       # saved r[0] 
+       # ############### Calculate word 1 
+       xorl    %ebx,           %ebx
+       # sqr a[1]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       movl    %ecx,           4(%edi)
+       movl    (%esi),         %edx
+       # saved r[1] 
+       # ############### Calculate word 2 
+       xorl    %ecx,           %ecx
+       # sqr a[2]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    4(%esi),        %eax
+       adcl    $0,             %ecx
+       # sqr a[1]*a[1] 
+       mull    %eax
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    (%esi),         %edx
+       adcl    $0,             %ecx
+       movl    %ebp,           8(%edi)
+       movl    12(%esi),       %eax
+       # saved r[2] 
+       # ############### Calculate word 3 
+       xorl    %ebp,           %ebp
+       # sqr a[3]*a[0] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebp
+       movl    4(%esi),        %edx
+       # sqr a[2]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebp
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ebp
+       movl    %ebx,           12(%edi)
+       movl    4(%esi),        %edx
+       # saved r[3] 
+       # ############### Calculate word 4 
+       xorl    %ebx,           %ebx
+       # sqr a[3]*a[1] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ebx
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %eax
+       adcl    $0,             %ebx
+       # sqr a[2]*a[2] 
+       mull    %eax
+       addl    %eax,           %ecx
+       adcl    %edx,           %ebp
+       movl    8(%esi),        %edx
+       adcl    $0,             %ebx
+       movl    %ecx,           16(%edi)
+       movl    12(%esi),       %eax
+       # saved r[4] 
+       # ############### Calculate word 5 
+       xorl    %ecx,           %ecx
+       # sqr a[3]*a[2] 
+       mull    %edx
+       addl    %eax,           %eax
+       adcl    %edx,           %edx
+       adcl    $0,             %ecx
+       addl    %eax,           %ebp
+       adcl    %edx,           %ebx
+       movl    12(%esi),       %eax
+       adcl    $0,             %ecx
+       movl    %ebp,           20(%edi)
+       # saved r[5] 
+       # ############### Calculate word 6 
+       xorl    %ebp,           %ebp
+       # sqr a[3]*a[3] 
+       mull    %eax
+       addl    %eax,           %ebx
+       adcl    %edx,           %ecx
+       adcl    $0,             %ebp
+       movl    %ebx,           24(%edi)
+       # saved r[6] 
+       movl    %ecx,           28(%edi)
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.bn_sqr_comba4_end:
+       .size   bn_sqr_comba4,.bn_sqr_comba4_end-bn_sqr_comba4
+.ident "desasm.pl"
diff --git a/crypto/bn/asm/f.s b/crypto/bn/asm/f.s
new file mode 100644 (file)
index 0000000..2f8f63c
--- /dev/null
@@ -0,0 +1,1773 @@
+       # Don't even think of reading this code 
+       # It was automatically generated by bn-586.pl 
+       # Which is a perl program used to generate the alpha assember. 
+       # eric <eay@cryptsoft.com> 
+
+ # DEC Alpha assember
+ # Generated from perl scripts contains in SSLeay
+       .file   1 "bn-586.s"
+       .set noat
+       .text
+       .align 3
+       .globl bn_mul_words
+       .ent bn_mul_words
+bn_mul_words:
+bn_mul_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $18,    4,      $18
+       bis     $31,    $31,    $0
+       br      $100
+       blt     $18,    $100
+       ldq     $1,     0($17)
+       ldq     $2,     0($16)
+$101:
+       ldq     $3,     0($17)
+       mulq    $3,     $19,    $4
+       addq    $17,    8,      $17
+       umulh   $3,     $19,    $5
+       addq    $4,     $0,     $4
+       addq    $16,    8,      $16
+       subq    $18,    1,      $18
+       cmpult  $4,     $0,     $0
+       stq     $4,     -8($16)
+       addq    $5,     $0,     $0
+       bgt     $18,    $101
+       ret     $31,($26),1
+$100:
+       addq    $18,    4,      $18
+       bgt     $18,    $101
+$102:
+       ret     $31,($26),1
+       .end bn_mul_words
+       .text
+       .align 3
+       .globl bn_sqr_words
+       .ent bn_sqr_words
+bn_sqr_words:
+bn_sqr_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $18,    4,      $18
+       bis     $31,    $31,    $0
+       br      $103
+       blt     $18,    $103
+       ldq     $1,     0($17)
+       ldq     $2,     0($16)
+$104:
+       ldq     $3,     0($17)
+       mulq    $3,     $3,     $4
+       addq    $17,    8,      $17
+       addq    $16,    16,     $16
+       subq    $18,    1,      $18
+       umulh   $3,     $3,     $5
+       stq     $4,     -16($16)
+       stq     $5,     -8($16)
+       bgt     $18,    $104
+       ret     $31,($26),1
+$103:
+       addq    $18,    4,      $18
+       bgt     $18,    $104
+$105:
+       ret     $31,($26),1
+       .end bn_sqr_words
+       .text
+       .align 3
+       .globl bn_mul_add_words
+       .ent bn_mul_add_words
+bn_mul_add_words:
+bn_mul_add_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $18,    4,      $18
+       bis     $31,    $31,    $0
+       br      $106
+       blt     $18,    $106
+       ldq     $1,     0($17)
+       ldq     $2,     0($16)
+$107:
+       ldq     $3,     0($17)
+       ldq     $4,     0($16)
+       mulq    $3,     $19,    $5
+       subq    $18,    1,      $18
+       addq    $17,    8,      $17
+       umulh   $3,     $19,    $6
+       addq    $4,     $5,     $4
+       addq    $16,    8,      $16
+       cmpult  $4,     $5,     $7
+       addq    $4,     $0,     $4
+       addq    $6,     $7,     $6
+       cmpult  $4,     $0,     $0
+       stq     $4,     -8($16)
+       addq    $6,     $0,     $0
+       bgt     $18,    $107
+       ret     $31,($26),1
+$106:
+       addq    $18,    4,      $18
+       bgt     $18,    $107
+$108:
+       ret     $31,($26),1
+       .end bn_mul_add_words
+       .text
+       .align 3
+       .globl bn_add_words
+       .ent bn_add_words
+bn_add_words:
+bn_add_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $19,    4,      $19
+       bis     $31,    $31,    $0
+       br      $109
+       blt     $19,    $109
+       ldq     $1,     0($17)
+       ldq     $2,     0($18)
+$110:
+       ldq     $3,     8($17)
+       ldq     $4,     8($18)
+       ldq     $5,     16($17)
+       ldq     $6,     16($18)
+       ldq     $7,     24($17)
+       ldq     $8,     24($18)
+       addq    $1,     $2,     $22
+       cmpult  $22,    $2,     $23
+       addq    $22,    $0,     $22
+       cmpult  $22,    $0,     $0
+       addq    $0,     $23,    $0
+       addq    $3,     $4,     $25
+       cmpult  $25,    $4,     $24
+       addq    $25,    $0,     $25
+       cmpult  $25,    $0,     $0
+       addq    $0,     $24,    $0
+       addq    $5,     $6,     $28
+       cmpult  $28,    $6,     $27
+       addq    $28,    $0,     $28
+       cmpult  $28,    $0,     $0
+       addq    $0,     $27,    $0
+       addq    $7,     $8,     $20
+       cmpult  $20,    $8,     $21
+       addq    $20,    $0,     $20
+       cmpult  $20,    $0,     $0
+       addq    $0,     $21,    $0
+       stq     $22,    0($16)
+       stq     $25,    0($16)
+       stq     $28,    0($16)
+       stq     $20,    0($16)
+       subq    $19,    4,      $19
+       addq    $17,    32,     $17
+       addq    $18,    32,     $18
+       addq    $16,    32,     $16
+       blt     $19,    $109
+       ldq     $1,     0($17)
+       ldq     $2,     0($18)
+       br      $110
+$111:
+       ldq     $1,     0($17)
+       ldq     $2,     0($18)
+       addq    $1,     $2,     $3
+       cmpult  $3,     $2,     $23
+       addq    $3,     $0,     $3
+       cmpult  $3,     $0,     $0
+       addq    $0,     $23,    $0
+       stq     $3,     0($16)
+       addq    $17,    8,      $17
+       addq    $18,    8,      $18
+       addq    $16,    8,      $16
+       subq    $19,    1,      $19
+       bgt     $19,    $111
+       ret     $31,($26),1
+$109:
+       addq    $19,    4,      $19
+       bgt     $19,    $111
+$112:
+       ret     $31,($26),1
+       .end bn_add_words
+       .text
+       .align 3
+       .globl bn_sub_words
+       .ent bn_sub_words
+bn_sub_words:
+bn_sub_words..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $19,    4,      $19
+       bis     $31,    $31,    $0
+       blt     $19,    $113
+       ldq     $1,     0($17)
+       ldq     $2,     0($18)
+$114:
+       ldq     $3,     8($17)
+       cmpult  $1,     $2,     $4
+       ldq     $5,     8($18)
+       subq    $1,     $2,     $1
+       ldq     $6,     16($17)
+       cmpult  $1,     $0,     $2
+       ldq     $7,     16($18)
+       subq    $1,     $0,     $23
+       ldq     $8,     24($17)
+       addq    $2,     $4,     $0
+       cmpult  $3,     $5,     $24
+       subq    $3,     $5,     $3
+       ldq     $22,    24($18)
+       cmpult  $3,     $0,     $5
+       subq    $3,     $0,     $25
+       addq    $5,     $24,    $0
+       cmpult  $6,     $7,     $27
+       subq    $6,     $7,     $6
+       stq     $23,    0($16)
+       cmpult  $6,     $0,     $7
+       subq    $6,     $0,     $28
+       addq    $7,     $27,    $0
+       cmpult  $8,     $22,    $21
+       subq    $8,     $22,    $8
+       stq     $25,    8($16)
+       cmpult  $8,     $0,     $22
+       subq    $8,     $0,     $20
+       addq    $22,    $21,    $0
+       stq     $28,    16($16)
+       subq    $19,    4,      $19
+       stq     $20,    24($16)
+       addq    $17,    32,     $17
+       addq    $18,    32,     $18
+       addq    $16,    32,     $16
+       blt     $19,    $113
+       ldq     $1,     0($17)
+       ldq     $2,     0($18)
+       br      $114
+$115:
+       ldq     $1,     0($17)
+       ldq     $2,     0($18)
+       cmpult  $1,     $2,     $27
+       subq    $1,     $2,     $1
+       cmpult  $1,     $0,     $2
+       subq    $1,     $0,     $1
+       stq     $1,     0($16)
+       addq    $2,     $27,    $0
+       addq    $17,    8,      $17
+       addq    $18,    8,      $18
+       addq    $16,    8,      $16
+       subq    $19,    1,      $19
+       bgt     $19,    $115
+       ret     $31,($26),1
+$113:
+       addq    $19,    4,      $19
+       bgt     $19,    $115
+$116:
+       ret     $31,($26),1
+       .end bn_sub_words
+ #
+ # What follows was taken directly from the C compiler with a few
+ # hacks to redo the lables.
+ #
+.text
+       .align 3
+       .globl bn_div64
+       .ent bn_div64
+bn_div64:
+       ldgp $29,0($27)
+bn_div64..ng:
+       lda $30,-48($30)
+       .frame $30,48,$26,0
+       stq $26,0($30)
+       stq $9,8($30)
+       stq $10,16($30)
+       stq $11,24($30)
+       stq $12,32($30)
+       stq $13,40($30)
+       .mask 0x4003e00,-48
+       .prologue 1
+       bis $16,$16,$9
+       bis $17,$17,$10
+       bis $18,$18,$11
+       bis $31,$31,$13
+       bis $31,2,$12
+       bne $11,$9119
+       lda $0,-1
+       br $31,$9136
+       .align 4
+$9119:
+       bis $11,$11,$16
+       jsr $26,BN_num_bits_word
+       ldgp $29,0($26)
+       subq $0,64,$1
+       beq $1,$9120
+       bis $31,1,$1
+       sll $1,$0,$1
+       cmpule $9,$1,$1
+       bne $1,$9120
+ #     lda $16,_IO_stderr_
+ #     lda $17,$C32
+ #     bis $0,$0,$18
+ #     jsr $26,fprintf
+ #     ldgp $29,0($26)
+       jsr $26,abort
+       ldgp $29,0($26)
+       .align 4
+$9120:
+       bis $31,64,$3
+       cmpult $9,$11,$2
+       subq $3,$0,$1
+       addl $1,$31,$0
+       subq $9,$11,$1
+       cmoveq $2,$1,$9
+       beq $0,$9122
+       zapnot $0,15,$2
+       subq $3,$0,$1
+       sll $11,$2,$11
+       sll $9,$2,$3
+       srl $10,$1,$1
+       sll $10,$2,$10
+       bis $3,$1,$9
+$9122:
+       srl $11,32,$5
+       zapnot $11,15,$6
+       lda $7,-1
+       .align 5
+$9123:
+       srl $9,32,$1
+       subq $1,$5,$1
+       bne $1,$9126
+       zapnot $7,15,$27
+       br $31,$9127
+       .align 4
+$9126:
+       bis $9,$9,$24
+       bis $5,$5,$25
+       divqu $24,$25,$27
+$9127:
+       srl $10,32,$4
+       .align 5
+$9128:
+       mulq $27,$5,$1
+       subq $9,$1,$3
+       zapnot $3,240,$1
+       bne $1,$9129
+       mulq $6,$27,$2
+       sll $3,32,$1
+       addq $1,$4,$1
+       cmpule $2,$1,$2
+       bne $2,$9129
+       subq $27,1,$27
+       br $31,$9128
+       .align 4
+$9129:
+       mulq $27,$6,$1
+       mulq $27,$5,$4
+       srl $1,32,$3
+       sll $1,32,$1
+       addq $4,$3,$4
+       cmpult $10,$1,$2
+       subq $10,$1,$10
+       addq $2,$4,$2
+       cmpult $9,$2,$1
+       bis $2,$2,$4
+       beq $1,$9134
+       addq $9,$11,$9
+       subq $27,1,$27
+$9134:
+       subl $12,1,$12
+       subq $9,$4,$9
+       beq $12,$9124
+       sll $27,32,$13
+       sll $9,32,$2
+       srl $10,32,$1
+       sll $10,32,$10
+       bis $2,$1,$9
+       br $31,$9123
+       .align 4
+$9124:
+       bis $13,$27,$0
+$9136:
+       ldq $26,0($30)
+       ldq $9,8($30)
+       ldq $10,16($30)
+       ldq $11,24($30)
+       ldq $12,32($30)
+       ldq $13,40($30)
+       addq $30,48,$30
+       ret $31,($26),1
+       .end bn_div64
+       .text
+       .align 3
+       .globl bn_mul_comba8
+       .ent bn_mul_comba8
+bn_mul_comba8:
+bn_mul_comba8..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       subq    $30,    16,     $30
+       ldq     $0,     0($17)
+       ldq     $1,     0($18)
+       stq     $9,     0($30)
+       stq     $10,    8($30)
+       ldq     $2,     8($17)
+       ldq     $3,     8($18)
+       ldq     $4,     16($17)
+       ldq     $5,     16($18)
+       ldq     $6,     24($17)
+       ldq     $7,     24($18)
+       ldq     $8,     8($17)
+       ldq     $22,    8($18)
+       ldq     $23,    8($17)
+       ldq     $24,    8($18)
+       ldq     $25,    8($17)
+       ldq     $27,    8($18)
+       ldq     $28,    8($17)
+       ldq     $21,    8($18)
+       bis     $31,    $31,    $9
+       mulq    $0,     $1,     $20
+       umulh   $0,     $1,     $19
+       stq     $20,    0($16)
+       bis     $31,    $31,    $10
+       mulq    $0,     $3,     $17
+       umulh   $0,     $3,     $18
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $20
+       addq    $20,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $17
+       addq    $10,    $17,    $10
+       mulq    $2,     $1,     $20
+       umulh   $2,     $1,     $18
+       addq    $19,    $20,    $19
+       cmpult  $19,    $20,    $17
+       addq    $17,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $20
+       addq    $10,    $20,    $10
+       stq     $19,    8($16)
+       bis     $31,    $31,    $17
+       mulq    $0,     $5,     $18
+       umulh   $0,     $5,     $20
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $19
+       addq    $19,    $20,    $20
+       addq    $10,    $20,    $10
+       cmpult  $10,    $20,    $18
+       addq    $17,    $18,    $17
+       mulq    $2,     $3,     $19
+       umulh   $2,     $3,     $20
+       addq    $9,     $19,    $9
+       cmpult  $9,     $19,    $18
+       addq    $18,    $20,    $20
+       addq    $10,    $20,    $10
+       cmpult  $10,    $20,    $19
+       addq    $17,    $19,    $17
+       mulq    $4,     $1,     $18
+       umulh   $4,     $1,     $20
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $19
+       addq    $19,    $20,    $20
+       addq    $10,    $20,    $10
+       cmpult  $10,    $20,    $18
+       addq    $17,    $18,    $17
+       stq     $9,     16($16)
+       bis     $31,    $31,    $19
+       mulq    $0,     $7,     $20
+       umulh   $0,     $7,     $18
+       addq    $10,    $20,    $10
+       cmpult  $10,    $20,    $9
+       addq    $9,     $18,    $18
+       addq    $17,    $18,    $17
+       cmpult  $17,    $18,    $20
+       addq    $19,    $20,    $19
+       mulq    $2,     $5,     $9
+       umulh   $2,     $5,     $18
+       addq    $10,    $9,     $10
+       cmpult  $10,    $9,     $20
+       addq    $20,    $18,    $18
+       addq    $17,    $18,    $17
+       cmpult  $17,    $18,    $9
+       addq    $19,    $9,     $19
+       mulq    $4,     $3,     $20
+       umulh   $4,     $3,     $18
+       addq    $10,    $20,    $10
+       cmpult  $10,    $20,    $9
+       addq    $9,     $18,    $18
+       addq    $17,    $18,    $17
+       cmpult  $17,    $18,    $20
+       addq    $19,    $20,    $19
+       mulq    $6,     $1,     $9
+       umulh   $6,     $1,     $18
+       addq    $10,    $9,     $10
+       cmpult  $10,    $9,     $20
+       addq    $20,    $18,    $18
+       addq    $17,    $18,    $17
+       cmpult  $17,    $18,    $9
+       addq    $19,    $9,     $19
+       stq     $10,    24($16)
+       bis     $31,    $31,    $20
+       mulq    $0,     $22,    $18
+       umulh   $0,     $22,    $9
+       addq    $17,    $18,    $17
+       cmpult  $17,    $18,    $10
+       addq    $10,    $9,     $9
+       addq    $19,    $9,     $19
+       cmpult  $19,    $9,     $18
+       addq    $20,    $18,    $20
+       mulq    $2,     $7,     $10
+       umulh   $2,     $7,     $9
+       addq    $17,    $10,    $17
+       cmpult  $17,    $10,    $18
+       addq    $18,    $9,     $9
+       addq    $19,    $9,     $19
+       cmpult  $19,    $9,     $10
+       addq    $20,    $10,    $20
+       mulq    $4,     $5,     $18
+       umulh   $4,     $5,     $9
+       addq    $17,    $18,    $17
+       cmpult  $17,    $18,    $10
+       addq    $10,    $9,     $9
+       addq    $19,    $9,     $19
+       cmpult  $19,    $9,     $18
+       addq    $20,    $18,    $20
+       mulq    $6,     $3,     $10
+       umulh   $6,     $3,     $9
+       addq    $17,    $10,    $17
+       cmpult  $17,    $10,    $18
+       addq    $18,    $9,     $9
+       addq    $19,    $9,     $19
+       cmpult  $19,    $9,     $10
+       addq    $20,    $10,    $20
+       mulq    $8,     $1,     $18
+       umulh   $8,     $1,     $9
+       addq    $17,    $18,    $17
+       cmpult  $17,    $18,    $10
+       addq    $10,    $9,     $9
+       addq    $19,    $9,     $19
+       cmpult  $19,    $9,     $18
+       addq    $20,    $18,    $20
+       stq     $17,    32($16)
+       bis     $31,    $31,    $10
+       mulq    $0,     $24,    $9
+       umulh   $0,     $24,    $18
+       addq    $19,    $9,     $19
+       cmpult  $19,    $9,     $17
+       addq    $17,    $18,    $18
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $9
+       addq    $10,    $9,     $10
+       mulq    $2,     $22,    $17
+       umulh   $2,     $22,    $18
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $9
+       addq    $9,     $18,    $18
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $17
+       addq    $10,    $17,    $10
+       mulq    $4,     $7,     $9
+       umulh   $4,     $7,     $18
+       addq    $19,    $9,     $19
+       cmpult  $19,    $9,     $17
+       addq    $17,    $18,    $18
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $9
+       addq    $10,    $9,     $10
+       mulq    $6,     $5,     $17
+       umulh   $6,     $5,     $18
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $9
+       addq    $9,     $18,    $18
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $17
+       addq    $10,    $17,    $10
+       mulq    $8,     $3,     $9
+       umulh   $8,     $3,     $18
+       addq    $19,    $9,     $19
+       cmpult  $19,    $9,     $17
+       addq    $17,    $18,    $18
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $9
+       addq    $10,    $9,     $10
+       mulq    $23,    $1,     $17
+       umulh   $23,    $1,     $18
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $9
+       addq    $9,     $18,    $18
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $17
+       addq    $10,    $17,    $10
+       stq     $19,    40($16)
+       bis     $31,    $31,    $9
+       mulq    $0,     $27,    $18
+       umulh   $0,     $27,    $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $19
+       addq    $19,    $17,    $17
+       addq    $10,    $17,    $10
+       cmpult  $10,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $2,     $24,    $19
+       umulh   $2,     $24,    $17
+       addq    $20,    $19,    $20
+       cmpult  $20,    $19,    $18
+       addq    $18,    $17,    $17
+       addq    $10,    $17,    $10
+       cmpult  $10,    $17,    $19
+       addq    $9,     $19,    $9
+       mulq    $4,     $22,    $18
+       umulh   $4,     $22,    $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $19
+       addq    $19,    $17,    $17
+       addq    $10,    $17,    $10
+       cmpult  $10,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $6,     $7,     $19
+       umulh   $6,     $7,     $17
+       addq    $20,    $19,    $20
+       cmpult  $20,    $19,    $18
+       addq    $18,    $17,    $17
+       addq    $10,    $17,    $10
+       cmpult  $10,    $17,    $19
+       addq    $9,     $19,    $9
+       mulq    $8,     $5,     $18
+       umulh   $8,     $5,     $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $19
+       addq    $19,    $17,    $17
+       addq    $10,    $17,    $10
+       cmpult  $10,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $23,    $3,     $19
+       umulh   $23,    $3,     $17
+       addq    $20,    $19,    $20
+       cmpult  $20,    $19,    $18
+       addq    $18,    $17,    $17
+       addq    $10,    $17,    $10
+       cmpult  $10,    $17,    $19
+       addq    $9,     $19,    $9
+       mulq    $25,    $1,     $18
+       umulh   $25,    $1,     $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $19
+       addq    $19,    $17,    $17
+       addq    $10,    $17,    $10
+       cmpult  $10,    $17,    $18
+       addq    $9,     $18,    $9
+       stq     $20,    48($16)
+       bis     $31,    $31,    $19
+       mulq    $0,     $21,    $17
+       umulh   $0,     $21,    $18
+       addq    $10,    $17,    $10
+       cmpult  $10,    $17,    $20
+       addq    $20,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $17
+       addq    $19,    $17,    $19
+       mulq    $2,     $27,    $20
+       umulh   $2,     $27,    $18
+       addq    $10,    $20,    $10
+       cmpult  $10,    $20,    $17
+       addq    $17,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $0
+       addq    $19,    $0,     $19
+       mulq    $4,     $24,    $20
+       umulh   $4,     $24,    $17
+       addq    $10,    $20,    $10
+       cmpult  $10,    $20,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $0
+       addq    $19,    $0,     $19
+       mulq    $6,     $22,    $20
+       umulh   $6,     $22,    $18
+       addq    $10,    $20,    $10
+       cmpult  $10,    $20,    $17
+       addq    $17,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $0
+       addq    $19,    $0,     $19
+       mulq    $8,     $7,     $20
+       umulh   $8,     $7,     $17
+       addq    $10,    $20,    $10
+       cmpult  $10,    $20,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $0
+       addq    $19,    $0,     $19
+       mulq    $23,    $5,     $20
+       umulh   $23,    $5,     $18
+       addq    $10,    $20,    $10
+       cmpult  $10,    $20,    $17
+       addq    $17,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $0
+       addq    $19,    $0,     $19
+       mulq    $25,    $3,     $20
+       umulh   $25,    $3,     $17
+       addq    $10,    $20,    $10
+       cmpult  $10,    $20,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $0
+       addq    $19,    $0,     $19
+       mulq    $28,    $1,     $20
+       umulh   $28,    $1,     $18
+       addq    $10,    $20,    $10
+       cmpult  $10,    $20,    $17
+       addq    $17,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $0
+       addq    $19,    $0,     $19
+       stq     $10,    56($16)
+       bis     $31,    $31,    $20
+       mulq    $2,     $21,    $17
+       umulh   $2,     $21,    $18
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $0
+       addq    $0,     $18,    $18
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $1
+       addq    $20,    $1,     $20
+       mulq    $4,     $27,    $10
+       umulh   $4,     $27,    $17
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $0
+       addq    $0,     $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $20,    $18,    $20
+       mulq    $6,     $24,    $1
+       umulh   $6,     $24,    $2
+       addq    $9,     $1,     $9
+       cmpult  $9,     $1,     $10
+       addq    $10,    $2,     $2
+       addq    $19,    $2,     $19
+       cmpult  $19,    $2,     $0
+       addq    $20,    $0,     $20
+       mulq    $8,     $22,    $17
+       umulh   $8,     $22,    $18
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $1
+       addq    $1,     $18,    $18
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $10
+       addq    $20,    $10,    $20
+       mulq    $23,    $7,     $2
+       umulh   $23,    $7,     $0
+       addq    $9,     $2,     $9
+       cmpult  $9,     $2,     $17
+       addq    $17,    $0,     $0
+       addq    $19,    $0,     $19
+       cmpult  $19,    $0,     $1
+       addq    $20,    $1,     $20
+       mulq    $25,    $5,     $18
+       umulh   $25,    $5,     $10
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $2
+       addq    $2,     $10,    $10
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $17
+       addq    $20,    $17,    $20
+       mulq    $28,    $3,     $0
+       umulh   $28,    $3,     $1
+       addq    $9,     $0,     $9
+       cmpult  $9,     $0,     $18
+       addq    $18,    $1,     $1
+       addq    $19,    $1,     $19
+       cmpult  $19,    $1,     $2
+       addq    $20,    $2,     $20
+       stq     $9,     64($16)
+       bis     $31,    $31,    $10
+       mulq    $4,     $21,    $17
+       umulh   $4,     $21,    $0
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $18,    $0,     $0
+       addq    $20,    $0,     $20
+       cmpult  $20,    $0,     $1
+       addq    $10,    $1,     $10
+       mulq    $6,     $27,    $2
+       umulh   $6,     $27,    $3
+       addq    $19,    $2,     $19
+       cmpult  $19,    $2,     $9
+       addq    $9,     $3,     $3
+       addq    $20,    $3,     $20
+       cmpult  $20,    $3,     $17
+       addq    $10,    $17,    $10
+       mulq    $8,     $24,    $18
+       umulh   $8,     $24,    $0
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $1
+       addq    $1,     $0,     $0
+       addq    $20,    $0,     $20
+       cmpult  $20,    $0,     $4
+       addq    $10,    $4,     $10
+       mulq    $23,    $22,    $2
+       umulh   $23,    $22,    $9
+       addq    $19,    $2,     $19
+       cmpult  $19,    $2,     $3
+       addq    $3,     $9,     $9
+       addq    $20,    $9,     $20
+       cmpult  $20,    $9,     $17
+       addq    $10,    $17,    $10
+       mulq    $25,    $7,     $18
+       umulh   $25,    $7,     $1
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $0
+       addq    $0,     $1,     $1
+       addq    $20,    $1,     $20
+       cmpult  $20,    $1,     $4
+       addq    $10,    $4,     $10
+       mulq    $28,    $5,     $2
+       umulh   $28,    $5,     $3
+       addq    $19,    $2,     $19
+       cmpult  $19,    $2,     $9
+       addq    $9,     $3,     $3
+       addq    $20,    $3,     $20
+       cmpult  $20,    $3,     $17
+       addq    $10,    $17,    $10
+       stq     $19,    72($16)
+       bis     $31,    $31,    $18
+       mulq    $6,     $21,    $0
+       umulh   $6,     $21,    $1
+       addq    $20,    $0,     $20
+       cmpult  $20,    $0,     $4
+       addq    $4,     $1,     $1
+       addq    $10,    $1,     $10
+       cmpult  $10,    $1,     $2
+       addq    $18,    $2,     $18
+       mulq    $8,     $27,    $9
+       umulh   $8,     $27,    $3
+       addq    $20,    $9,     $20
+       cmpult  $20,    $9,     $17
+       addq    $17,    $3,     $3
+       addq    $10,    $3,     $10
+       cmpult  $10,    $3,     $5
+       addq    $18,    $5,     $18
+       mulq    $23,    $24,    $19
+       umulh   $23,    $24,    $0
+       addq    $20,    $19,    $20
+       cmpult  $20,    $19,    $4
+       addq    $4,     $0,     $0
+       addq    $10,    $0,     $10
+       cmpult  $10,    $0,     $1
+       addq    $18,    $1,     $18
+       mulq    $25,    $22,    $2
+       umulh   $25,    $22,    $6
+       addq    $20,    $2,     $20
+       cmpult  $20,    $2,     $9
+       addq    $9,     $6,     $6
+       addq    $10,    $6,     $10
+       cmpult  $10,    $6,     $17
+       addq    $18,    $17,    $18
+       mulq    $28,    $7,     $3
+       umulh   $28,    $7,     $5
+       addq    $20,    $3,     $20
+       cmpult  $20,    $3,     $19
+       addq    $19,    $5,     $5
+       addq    $10,    $5,     $10
+       cmpult  $10,    $5,     $4
+       addq    $18,    $4,     $18
+       stq     $20,    80($16)
+       bis     $31,    $31,    $0
+       mulq    $8,     $21,    $1
+       umulh   $8,     $21,    $2
+       addq    $10,    $1,     $10
+       cmpult  $10,    $1,     $9
+       addq    $9,     $2,     $2
+       addq    $18,    $2,     $18
+       cmpult  $18,    $2,     $6
+       addq    $0,     $6,     $0
+       mulq    $23,    $27,    $17
+       umulh   $23,    $27,    $3
+       addq    $10,    $17,    $10
+       cmpult  $10,    $17,    $19
+       addq    $19,    $3,     $3
+       addq    $18,    $3,     $18
+       cmpult  $18,    $3,     $5
+       addq    $0,     $5,     $0
+       mulq    $25,    $24,    $4
+       umulh   $25,    $24,    $7
+       addq    $10,    $4,     $10
+       cmpult  $10,    $4,     $20
+       addq    $20,    $7,     $7
+       addq    $18,    $7,     $18
+       cmpult  $18,    $7,     $1
+       addq    $0,     $1,     $0
+       mulq    $28,    $22,    $9
+       umulh   $28,    $22,    $2
+       addq    $10,    $9,     $10
+       cmpult  $10,    $9,     $6
+       addq    $6,     $2,     $2
+       addq    $18,    $2,     $18
+       cmpult  $18,    $2,     $8
+       addq    $0,     $8,     $0
+       stq     $10,    88($16)
+       bis     $31,    $31,    $17
+       mulq    $23,    $21,    $19
+       umulh   $23,    $21,    $3
+       addq    $18,    $19,    $18
+       cmpult  $18,    $19,    $5
+       addq    $5,     $3,     $3
+       addq    $0,     $3,     $0
+       cmpult  $0,     $3,     $4
+       addq    $17,    $4,     $17
+       mulq    $25,    $27,    $20
+       umulh   $25,    $27,    $7
+       addq    $18,    $20,    $18
+       cmpult  $18,    $20,    $1
+       addq    $1,     $7,     $7
+       addq    $0,     $7,     $0
+       cmpult  $0,     $7,     $9
+       addq    $17,    $9,     $17
+       mulq    $28,    $24,    $6
+       umulh   $28,    $24,    $2
+       addq    $18,    $6,     $18
+       cmpult  $18,    $6,     $8
+       addq    $8,     $2,     $2
+       addq    $0,     $2,     $0
+       cmpult  $0,     $2,     $22
+       addq    $17,    $22,    $17
+       stq     $18,    96($16)
+       bis     $31,    $31,    $10
+       mulq    $25,    $21,    $19
+       umulh   $25,    $21,    $5
+       addq    $0,     $19,    $0
+       cmpult  $0,     $19,    $3
+       addq    $3,     $5,     $5
+       addq    $17,    $5,     $17
+       cmpult  $17,    $5,     $4
+       addq    $10,    $4,     $10
+       mulq    $28,    $27,    $23
+       umulh   $28,    $27,    $20
+       addq    $0,     $23,    $0
+       cmpult  $0,     $23,    $1
+       addq    $1,     $20,    $20
+       addq    $17,    $20,    $17
+       cmpult  $17,    $20,    $7
+       addq    $10,    $7,     $10
+       stq     $0,     104($16)
+       bis     $31,    $31,    $9
+       mulq    $28,    $21,    $6
+       umulh   $28,    $21,    $8
+       addq    $17,    $6,     $17
+       cmpult  $17,    $6,     $2
+       addq    $2,     $8,     $8
+       addq    $10,    $8,     $10
+       cmpult  $10,    $8,     $22
+       addq    $9,     $22,    $9
+       stq     $17,    112($16)
+       stq     $10,    120($16)
+       ldq     $9,     0($30)
+       ldq     $10,    8($30)
+       addq    $30,    16,     $30
+       ret     $31,($26),1
+       .end bn_mul_comba8
+       .text
+       .align 3
+       .globl bn_mul_comba4
+       .ent bn_mul_comba4
+bn_mul_comba4:
+bn_mul_comba4..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       ldq     $0,     0($17)
+       ldq     $1,     0($18)
+       ldq     $2,     8($17)
+       ldq     $3,     8($18)
+       mulq    $0,     $1,     $4
+       ldq     $5,     16($17)
+       ldq     $6,     16($18)
+       umulh   $0,     $1,     $7
+       ldq     $8,     24($17)
+       ldq     $22,    24($18)
+       mulq    $0,     $3,     $23
+       stq     $4,     0($16)
+       bis     $31,    $31,    $24
+       mulq    $2,     $1,     $28
+       bis     $31,    $31,    $25
+       bis     $31,    $31,    
+       addq    $24,    $7,     $24
+       umulh   $0,     $3,     $21
+       cmpult  $24,    $7,     $20
+       addq    $24,    $23,    $24
+       addq    $25,    $20,    $25
+       umulh   $2,     $1,     $19
+       cmpult  $24,    $23,    $17
+       addq    $24,    $28,    $24
+       addq    $27,    $17,    $27
+       mulq    $0,     $6,     $18
+       cmpult  $24,    $28,    $4
+       addq    $25,    $4,     $25
+       stq     $24,    8($16)
+       addq    $25,    $27,    $24
+       bis     $31,    $31,    $25
+       addq    $24,    $21,    $24
+       bis     $31,    $31,    $27
+       mulq    $2,     $3,     $7
+       cmpult  $24,    $21,    $20
+       addq    $24,    $19,    $24
+       addq    $25,    $20,    $25
+       mulq    $5,     $1,     $23
+       cmpult  $24,    $19,    $17
+       addq    $24,    $7,     $24
+       addq    $27,    $17,    $27
+       umulh   $0,     $6,     $28
+       cmpult  $24,    $18,    $4
+       addq    $24,    $7,     $24
+       addq    $25,    $4,     $25
+       umulh   $2,     $3,     $21
+       cmpult  $24,    $7,     $20
+       addq    $24,    $23,    $24
+       addq    $27,    $20,    $27
+       umulh   $5,     $1,     $19
+       cmpult  $24,    $23,    $17
+       addq    $25,    $17,    $25
+       stq     $24,    16($16)
+       addq    $25,    $27,    $24
+       bis     $31,    $31,    $25
+       addq    $24,    $28,    $24
+       bis     $31,    $31,    $27
+       mulq    $0,     $22,    $18
+       cmpult  $24,    $28,    $4
+       addq    $24,    $21,    $24
+       addq    $25,    $4,     $25
+       mulq    $2,     $6,     $7
+       cmpult  $24,    $21,    $20
+       addq    $24,    $19,    $24
+       addq    $25,    $20,    $25
+       mulq    $5,     $3,     $23
+       cmpult  $24,    $19,    $17
+       addq    $24,    $18,    $24
+       addq    $25,    $17,    $25
+       mulq    $8,     $1,     $28
+       cmpult  $24,    $18,    $4
+       addq    $24,    $7,     $24
+       addq    $25,    $4,     $25
+       umulh   $0,     $22,    $21
+       cmpult  $24,    $7,     $20
+       addq    $24,    $23,    $24
+       addq    $25,    $20,    $25
+       umulh   $2,     $6,     $19
+       cmpult  $24,    $23,    $17
+       addq    $24,    $28,    $24
+       addq    $25,    $17,    $25
+       umulh   $5,     $3,     $18
+       cmpult  $24,    $28,    $4
+       addq    $25,    $4,     $25
+       stq     $24,    24($16)
+       addq    $25,    $27,    $24
+       bis     $31,    $31,    $25
+       addq    $24,    $21,    $24
+       bis     $31,    $31,    $27
+       umulh   $8,     $1,     $7
+       cmpult  $24,    $21,    $20
+       addq    $24,    $19,    $24
+       addq    $25,    $20,    $25
+       mulq    $2,     $22,    $23
+       cmpult  $24,    $19,    $17
+       addq    $24,    $18,    $24
+       addq    $25,    $17,    $25
+       mulq    $5,     $6,     $28
+       cmpult  $24,    $18,    $4
+       addq    $24,    $7,     $24
+       addq    $25,    $4,     $25
+       mulq    $8,     $3,     $21
+       cmpult  $24,    $7,     $20
+       addq    $24,    $23,    $24
+       addq    $25,    $20,    $25
+       umulh   $2,     $22,    $19
+       cmpult  $24,    $23,    $17
+       addq    $24,    $28,    $24
+       addq    $25,    $17,    $25
+       umulh   $5,     $6,     $18
+       cmpult  $24,    $28,    $4
+       addq    $24,    $21,    $24
+       addq    $25,    $4,     $25
+       umulh   $8,     $3,     $7
+       cmpult  $24,    $21,    $20
+       addq    $25,    $20,    $25
+       stq     $24,    32($16)
+       addq    $25,    $27,    $24
+       bis     $31,    $31,    $25
+       addq    $24,    $19,    $24
+       bis     $31,    $31,    $27
+       mulq    $5,     $22,    $23
+       cmpult  $24,    $19,    $17
+       addq    $24,    $18,    $24
+       addq    $25,    $17,    $25
+       mulq    $8,     $6,     $28
+       cmpult  $24,    $18,    $4
+       addq    $24,    $7,     $24
+       addq    $25,    $4,     $25
+       umulh   $5,     $22,    $21
+       cmpult  $24,    $7,     $20
+       addq    $24,    $23,    $24
+       addq    $25,    $20,    $25
+       umulh   $8,     $6,     $19
+       cmpult  $24,    $23,    $17
+       addq    $24,    $28,    $24
+       addq    $25,    $17,    $25
+       mulq    $8,     $22,    $18
+       cmpult  $24,    $28,    $4
+       addq    $25,    $4,     $25
+       stq     $24,    40($16)
+       addq    $25,    $27,    $24
+       bis     $31,    $31,    $25
+       addq    $24,    $21,    $24
+       bis     $31,    $31,    $27
+       umulh   $8,     $22,    $7
+       cmpult  $24,    $21,    $20
+       addq    $24,    $19,    $24
+       addq    $25,    $20,    $25
+       cmpult  $24,    $19,    $23
+       addq    $24,    $18,    $24
+       addq    $25,    $23,    $25
+       cmpult  $24,    $18,    $17
+       addq    $25,    $17,    $25
+       stq     $24,    48($16)
+       addq    $25,    $27,    $24
+       addq    $24,    $7,     $24
+       stq     $24,    56($16)
+       ret     $31,($26),1
+       .end bn_mul_comba4
+       .text
+       .align 3
+       .globl bn_sqr_comba4
+       .ent bn_sqr_comba4
+bn_sqr_comba4:
+bn_sqr_comba4..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       ldq     $0,     0($17)
+       ldq     $1,     8($17)
+       ldq     $2,     16($17)
+       ldq     $3,     24($17)
+       bis     $31,    $31,    $6
+       mulq    $0,     $0,     $4
+       umulh   $0,     $0,     $5
+       stq     $4,     0($16)
+       bis     $31,    $31,    $4
+       mulq    $0,     $1,     $7
+       umulh   $0,     $1,     $8
+       cmplt   $7,     $31,    $22
+       cmplt   $8,     $31,    $23
+       addq    $7,     $7,     $7
+       addq    $8,     $8,     $8
+       addq    $8,     $22,    $8
+       addq    $4,     $23,    $4
+       addq    $5,     $7,     $5
+       addq    $6,     $8,     $6
+       cmpult  $5,     $7,     $24
+       cmpult  $6,     $8,     $25
+       addq    $6,     $24,    $6
+       addq    $4,     $25,    $4
+       stq     $5,     8($16)
+       bis     $31,    $31,    $5
+       mulq    $1,     $1,     $27
+       umulh   $1,     $1,     $28
+       addq    $6,     $27,    $6
+       addq    $4,     $28,    $4
+       cmpult  $6,     $27,    $21
+       cmpult  $4,     $28,    $20
+       addq    $4,     $21,    $4
+       addq    $5,     $20,    $5
+       mulq    $2,     $0,     $19
+       umulh   $2,     $0,     $18
+       cmplt   $19,    $31,    $17
+       cmplt   $18,    $31,    $22
+       addq    $19,    $19,    $19
+       addq    $18,    $18,    $18
+       addq    $18,    $17,    $18
+       addq    $5,     $22,    $5
+       addq    $6,     $19,    $6
+       addq    $4,     $18,    $4
+       cmpult  $6,     $19,    $23
+       cmpult  $4,     $18,    $7
+       addq    $4,     $23,    $4
+       addq    $5,     $7,     $5
+       stq     $6,     16($16)
+       bis     $31,    $31,    $6
+       mulq    $3,     $0,     $8
+       umulh   $3,     $0,     $24
+       cmplt   $8,     $31,    $25
+       cmplt   $24,    $31,    $27
+       addq    $8,     $8,     $8
+       addq    $24,    $24,    $24
+       addq    $24,    $25,    $24
+       addq    $6,     $27,    $6
+       addq    $4,     $8,     $4
+       addq    $5,     $24,    $5
+       cmpult  $4,     $8,     $28
+       cmpult  $5,     $24,    $21
+       addq    $5,     $28,    $5
+       addq    $6,     $21,    $6
+       mulq    $2,     $1,     $20
+       umulh   $2,     $1,     $17
+       cmplt   $20,    $31,    $22
+       cmplt   $17,    $31,    $19
+       addq    $20,    $20,    $20
+       addq    $17,    $17,    $17
+       addq    $17,    $22,    $17
+       addq    $6,     $19,    $6
+       addq    $4,     $20,    $4
+       addq    $5,     $17,    $5
+       cmpult  $4,     $20,    $18
+       cmpult  $5,     $17,    $23
+       addq    $5,     $18,    $5
+       addq    $6,     $23,    $6
+       stq     $4,     24($16)
+       bis     $31,    $31,    $4
+       mulq    $2,     $2,     $7
+       umulh   $2,     $2,     $25
+       addq    $5,     $7,     $5
+       addq    $6,     $25,    $6
+       cmpult  $5,     $7,     $27
+       cmpult  $6,     $25,    $8
+       addq    $6,     $27,    $6
+       addq    $4,     $8,     $4
+       mulq    $3,     $1,     $24
+       umulh   $3,     $1,     $28
+       cmplt   $24,    $31,    $21
+       cmplt   $28,    $31,    $22
+       addq    $24,    $24,    $24
+       addq    $28,    $28,    $28
+       addq    $28,    $21,    $28
+       addq    $4,     $22,    $4
+       addq    $5,     $24,    $5
+       addq    $6,     $28,    $6
+       cmpult  $5,     $24,    $19
+       cmpult  $6,     $28,    $20
+       addq    $6,     $19,    $6
+       addq    $4,     $20,    $4
+       stq     $5,     32($16)
+       bis     $31,    $31,    $5
+       mulq    $3,     $2,     $17
+       umulh   $3,     $2,     $18
+       cmplt   $17,    $31,    $23
+       cmplt   $18,    $31,    $7
+       addq    $17,    $17,    $17
+       addq    $18,    $18,    $18
+       addq    $18,    $23,    $18
+       addq    $5,     $7,     $5
+       addq    $6,     $17,    $6
+       addq    $4,     $18,    $4
+       cmpult  $6,     $17,    $25
+       cmpult  $4,     $18,    $27
+       addq    $4,     $25,    $4
+       addq    $5,     $27,    $5
+       stq     $6,     40($16)
+       bis     $31,    $31,    $6
+       mulq    $3,     $3,     $8
+       umulh   $3,     $3,     $21
+       addq    $4,     $8,     $4
+       addq    $5,     $21,    $5
+       cmpult  $4,     $8,     $22
+       cmpult  $5,     $21,    $24
+       addq    $5,     $22,    $5
+       addq    $6,     $24,    $6
+       stq     $4,     48($16)
+       stq     $5,     56($16)
+       ret     $31,($26),1
+       .end bn_sqr_comba4
+       .text
+       .align 3
+       .globl bn_sqr_comba8
+       .ent bn_sqr_comba8
+bn_sqr_comba8:
+bn_sqr_comba8..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       ldq     $0,     0($17)
+       ldq     $1,     8($17)
+       ldq     $2,     16($17)
+       ldq     $3,     24($17)
+       ldq     $4,     32($17)
+       ldq     $5,     40($17)
+       ldq     $6,     48($17)
+       ldq     $7,     56($17)
+       bis     $31,    $31,    $23
+       mulq    $0,     $0,     $8
+       umulh   $0,     $0,     $22
+       stq     $8,     0($16)
+       bis     $31,    $31,    $8
+       mulq    $1,     $0,     $24
+       umulh   $1,     $0,     $25
+       cmplt   $24,    $31,    $27
+       cmplt   $25,    $31,    $28
+       addq    $24,    $24,    $24
+       addq    $25,    $25,    $25
+       addq    $25,    $27,    $25
+       addq    $8,     $28,    $8
+       addq    $22,    $24,    $22
+       addq    $23,    $25,    $23
+       cmpult  $22,    $24,    $21
+       cmpult  $23,    $25,    $20
+       addq    $23,    $21,    $23
+       addq    $8,     $20,    $8
+       stq     $22,    8($16)
+       bis     $31,    $31,    $22
+       mulq    $1,     $1,     $19
+       umulh   $1,     $1,     $18
+       addq    $23,    $19,    $23
+       addq    $8,     $18,    $8
+       cmpult  $23,    $19,    $17
+       cmpult  $8,     $18,    $27
+       addq    $8,     $17,    $8
+       addq    $22,    $27,    $22
+       mulq    $2,     $0,     $28
+       umulh   $2,     $0,     $24
+       cmplt   $28,    $31,    $25
+       cmplt   $24,    $31,    $21
+       addq    $28,    $28,    $28
+       addq    $24,    $24,    $24
+       addq    $24,    $25,    $24
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       addq    $8,     $24,    $8
+       cmpult  $23,    $28,    $20
+       cmpult  $8,     $24,    $19
+       addq    $8,     $20,    $8
+       addq    $22,    $19,    $22
+       stq     $23,    16($16)
+       bis     $31,    $31,    $23
+       mulq    $2,     $1,     $18
+       umulh   $2,     $1,     $17
+       cmplt   $18,    $31,    $27
+       cmplt   $17,    $31,    $25
+       addq    $18,    $18,    $18
+       addq    $17,    $17,    $17
+       addq    $17,    $27,    $17
+       addq    $23,    $25,    $23
+       addq    $8,     $18,    $8
+       addq    $22,    $17,    $22
+       cmpult  $8,     $18,    $21
+       cmpult  $22,    $17,    $28
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       mulq    $3,     $0,     $24
+       umulh   $3,     $0,     $20
+       cmplt   $24,    $31,    $19
+       cmplt   $20,    $31,    $27
+       addq    $24,    $24,    $24
+       addq    $20,    $20,    $20
+       addq    $20,    $19,    $20
+       addq    $23,    $27,    $23
+       addq    $8,     $24,    $8
+       addq    $22,    $20,    $22
+       cmpult  $8,     $24,    $25
+       cmpult  $22,    $20,    $18
+       addq    $22,    $25,    $22
+       addq    $23,    $18,    $23
+       stq     $8,     24($16)
+       bis     $31,    $31,    $8
+       mulq    $2,     $2,     $17
+       umulh   $2,     $2,     $21
+       addq    $22,    $17,    $22
+       addq    $23,    $21,    $23
+       cmpult  $22,    $17,    $28
+       cmpult  $23,    $21,    $19
+       addq    $23,    $28,    $23
+       addq    $8,     $19,    $8
+       mulq    $3,     $1,     $27
+       umulh   $3,     $1,     $24
+       cmplt   $27,    $31,    $20
+       cmplt   $24,    $31,    $25
+       addq    $27,    $27,    $27
+       addq    $24,    $24,    $24
+       addq    $24,    $20,    $24
+       addq    $8,     $25,    $8
+       addq    $22,    $27,    $22
+       addq    $23,    $24,    $23
+       cmpult  $22,    $27,    $18
+       cmpult  $23,    $24,    $17
+       addq    $23,    $18,    $23
+       addq    $8,     $17,    $8
+       mulq    $4,     $0,     $21
+       umulh   $4,     $0,     $28
+       cmplt   $21,    $31,    $19
+       cmplt   $28,    $31,    $20
+       addq    $21,    $21,    $21
+       addq    $28,    $28,    $28
+       addq    $28,    $19,    $28
+       addq    $8,     $20,    $8
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       cmpult  $22,    $21,    $25
+       cmpult  $23,    $28,    $27
+       addq    $23,    $25,    $23
+       addq    $8,     $27,    $8
+       stq     $22,    32($16)
+       bis     $31,    $31,    $22
+       mulq    $3,     $2,     $24
+       umulh   $3,     $2,     $18
+       cmplt   $24,    $31,    $17
+       cmplt   $18,    $31,    $19
+       addq    $24,    $24,    $24
+       addq    $18,    $18,    $18
+       addq    $18,    $17,    $18
+       addq    $22,    $19,    $22
+       addq    $23,    $24,    $23
+       addq    $8,     $18,    $8
+       cmpult  $23,    $24,    $20
+       cmpult  $8,     $18,    $21
+       addq    $8,     $20,    $8
+       addq    $22,    $21,    $22
+       mulq    $4,     $1,     $28
+       umulh   $4,     $1,     $25
+       cmplt   $28,    $31,    $27
+       cmplt   $25,    $31,    $17
+       addq    $28,    $28,    $28
+       addq    $25,    $25,    $25
+       addq    $25,    $27,    $25
+       addq    $22,    $17,    $22
+       addq    $23,    $28,    $23
+       addq    $8,     $25,    $8
+       cmpult  $23,    $28,    $19
+       cmpult  $8,     $25,    $24
+       addq    $8,     $19,    $8
+       addq    $22,    $24,    $22
+       mulq    $5,     $0,     $18
+       umulh   $5,     $0,     $20
+       cmplt   $18,    $31,    $21
+       cmplt   $20,    $31,    $27
+       addq    $18,    $18,    $18
+       addq    $20,    $20,    $20
+       addq    $20,    $21,    $20
+       addq    $22,    $27,    $22
+       addq    $23,    $18,    $23
+       addq    $8,     $20,    $8
+       cmpult  $23,    $18,    $17
+       cmpult  $8,     $20,    $28
+       addq    $8,     $17,    $8
+       addq    $22,    $28,    $22
+       stq     $23,    40($16)
+       bis     $31,    $31,    $23
+       mulq    $3,     $3,     $25
+       umulh   $3,     $3,     $19
+       addq    $8,     $25,    $8
+       addq    $22,    $19,    $22
+       cmpult  $8,     $25,    $24
+       cmpult  $22,    $19,    $21
+       addq    $22,    $24,    $22
+       addq    $23,    $21,    $23
+       mulq    $4,     $2,     $27
+       umulh   $4,     $2,     $18
+       cmplt   $27,    $31,    $20
+       cmplt   $18,    $31,    $17
+       addq    $27,    $27,    $27
+       addq    $18,    $18,    $18
+       addq    $18,    $20,    $18
+       addq    $23,    $17,    $23
+       addq    $8,     $27,    $8
+       addq    $22,    $18,    $22
+       cmpult  $8,     $27,    $28
+       cmpult  $22,    $18,    $25
+       addq    $22,    $28,    $22
+       addq    $23,    $25,    $23
+       mulq    $5,     $1,     $19
+       umulh   $5,     $1,     $24
+       cmplt   $19,    $31,    $21
+       cmplt   $24,    $31,    $20
+       addq    $19,    $19,    $19
+       addq    $24,    $24,    $24
+       addq    $24,    $21,    $24
+       addq    $23,    $20,    $23
+       addq    $8,     $19,    $8
+       addq    $22,    $24,    $22
+       cmpult  $8,     $19,    $17
+       cmpult  $22,    $24,    $27
+       addq    $22,    $17,    $22
+       addq    $23,    $27,    $23
+       mulq    $6,     $0,     $18
+       umulh   $6,     $0,     $28
+       cmplt   $18,    $31,    $25
+       cmplt   $28,    $31,    $21
+       addq    $18,    $18,    $18
+       addq    $28,    $28,    $28
+       addq    $28,    $25,    $28
+       addq    $23,    $21,    $23
+       addq    $8,     $18,    $8
+       addq    $22,    $28,    $22
+       cmpult  $8,     $18,    $20
+       cmpult  $22,    $28,    $19
+       addq    $22,    $20,    $22
+       addq    $23,    $19,    $23
+       stq     $8,     48($16)
+       bis     $31,    $31,    $8
+       mulq    $4,     $3,     $24
+       umulh   $4,     $3,     $17
+       cmplt   $24,    $31,    $27
+       cmplt   $17,    $31,    $25
+       addq    $24,    $24,    $24
+       addq    $17,    $17,    $17
+       addq    $17,    $27,    $17
+       addq    $8,     $25,    $8
+       addq    $22,    $24,    $22
+       addq    $23,    $17,    $23
+       cmpult  $22,    $24,    $21
+       cmpult  $23,    $17,    $18
+       addq    $23,    $21,    $23
+       addq    $8,     $18,    $8
+       mulq    $5,     $2,     $28
+       umulh   $5,     $2,     $20
+       cmplt   $28,    $31,    $19
+       cmplt   $20,    $31,    $27
+       addq    $28,    $28,    $28
+       addq    $20,    $20,    $20
+       addq    $20,    $19,    $20
+       addq    $8,     $27,    $8
+       addq    $22,    $28,    $22
+       addq    $23,    $20,    $23
+       cmpult  $22,    $28,    $25
+       cmpult  $23,    $20,    $24
+       addq    $23,    $25,    $23
+       addq    $8,     $24,    $8
+       mulq    $6,     $1,     $17
+       umulh   $6,     $1,     $21
+       cmplt   $17,    $31,    $18
+       cmplt   $21,    $31,    $19
+       addq    $17,    $17,    $17
+       addq    $21,    $21,    $21
+       addq    $21,    $18,    $21
+       addq    $8,     $19,    $8
+       addq    $22,    $17,    $22
+       addq    $23,    $21,    $23
+       cmpult  $22,    $17,    $27
+       cmpult  $23,    $21,    $28
+       addq    $23,    $27,    $23
+       addq    $8,     $28,    $8
+       mulq    $7,     $0,     $20
+       umulh   $7,     $0,     $25
+       cmplt   $20,    $31,    $24
+       cmplt   $25,    $31,    $18
+       addq    $20,    $20,    $20
+       addq    $25,    $25,    $25
+       addq    $25,    $24,    $25
+       addq    $8,     $18,    $8
+       addq    $22,    $20,    $22
+       addq    $23,    $25,    $23
+       cmpult  $22,    $20,    $19
+       cmpult  $23,    $25,    $17
+       addq    $23,    $19,    $23
+       addq    $8,     $17,    $8
+       stq     $22,    56($16)
+       bis     $31,    $31,    $22
+       mulq    $4,     $4,     $21
+       umulh   $4,     $4,     $27
+       addq    $23,    $21,    $23
+       addq    $8,     $27,    $8
+       cmpult  $23,    $21,    $28
+       cmpult  $8,     $27,    $24
+       addq    $8,     $28,    $8
+       addq    $22,    $24,    $22
+       mulq    $5,     $3,     $18
+       umulh   $5,     $3,     $20
+       cmplt   $18,    $31,    $25
+       cmplt   $20,    $31,    $19
+       addq    $18,    $18,    $18
+       addq    $20,    $20,    $20
+       addq    $20,    $25,    $20
+       addq    $22,    $19,    $22
+       addq    $23,    $18,    $23
+       addq    $8,     $20,    $8
+       cmpult  $23,    $18,    $17
+       cmpult  $8,     $20,    $21
+       addq    $8,     $17,    $8
+       addq    $22,    $21,    $22
+       mulq    $6,     $2,     $27
+       umulh   $6,     $2,     $28
+       cmplt   $27,    $31,    $24
+       cmplt   $28,    $31,    $25
+       addq    $27,    $27,    $27
+       addq    $28,    $28,    $28
+       addq    $28,    $24,    $28
+       addq    $22,    $25,    $22
+       addq    $23,    $27,    $23
+       addq    $8,     $28,    $8
+       cmpult  $23,    $27,    $19
+       cmpult  $8,     $28,    $18
+       addq    $8,     $19,    $8
+       addq    $22,    $18,    $22
+       mulq    $7,     $1,     $20
+       umulh   $7,     $1,     $17
+       cmplt   $20,    $31,    $21
+       cmplt   $17,    $31,    $24
+       addq    $20,    $20,    $20
+       addq    $17,    $17,    $17
+       addq    $17,    $21,    $17
+       addq    $22,    $24,    $22
+       addq    $23,    $20,    $23
+       addq    $8,     $17,    $8
+       cmpult  $23,    $20,    $25
+       cmpult  $8,     $17,    $27
+       addq    $8,     $25,    $8
+       addq    $22,    $27,    $22
+       stq     $23,    64($16)
+       bis     $31,    $31,    $23
+       mulq    $5,     $4,     $28
+       umulh   $5,     $4,     $19
+       cmplt   $28,    $31,    $18
+       cmplt   $19,    $31,    $21
+       addq    $28,    $28,    $28
+       addq    $19,    $19,    $19
+       addq    $19,    $18,    $19
+       addq    $23,    $21,    $23
+       addq    $8,     $28,    $8
+       addq    $22,    $19,    $22
+       cmpult  $8,     $28,    $24
+       cmpult  $22,    $19,    $20
+       addq    $22,    $24,    $22
+       addq    $23,    $20,    $23
+       mulq    $6,     $3,     $17
+       umulh   $6,     $3,     $25
+       cmplt   $17,    $31,    $27
+       cmplt   $25,    $31,    $18
+       addq    $17,    $17,    $17
+       addq    $25,    $25,    $25
+       addq    $25,    $27,    $25
+       addq    $23,    $18,    $23
+       addq    $8,     $17,    $8
+       addq    $22,    $25,    $22
+       cmpult  $8,     $17,    $21
+       cmpult  $22,    $25,    $28
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       mulq    $7,     $2,     $19
+       umulh   $7,     $2,     $24
+       cmplt   $19,    $31,    $20
+       cmplt   $24,    $31,    $27
+       addq    $19,    $19,    $19
+       addq    $24,    $24,    $24
+       addq    $24,    $20,    $24
+       addq    $23,    $27,    $23
+       addq    $8,     $19,    $8
+       addq    $22,    $24,    $22
+       cmpult  $8,     $19,    $18
+       cmpult  $22,    $24,    $17
+       addq    $22,    $18,    $22
+       addq    $23,    $17,    $23
+       stq     $8,     72($16)
+       bis     $31,    $31,    $8
+       mulq    $5,     $5,     $25
+       umulh   $5,     $5,     $21
+       addq    $22,    $25,    $22
+       addq    $23,    $21,    $23
+       cmpult  $22,    $25,    $28
+       cmpult  $23,    $21,    $20
+       addq    $23,    $28,    $23
+       addq    $8,     $20,    $8
+       mulq    $6,     $4,     $27
+       umulh   $6,     $4,     $19
+       cmplt   $27,    $31,    $24
+       cmplt   $19,    $31,    $18
+       addq    $27,    $27,    $27
+       addq    $19,    $19,    $19
+       addq    $19,    $24,    $19
+       addq    $8,     $18,    $8
+       addq    $22,    $27,    $22
+       addq    $23,    $19,    $23
+       cmpult  $22,    $27,    $17
+       cmpult  $23,    $19,    $25
+       addq    $23,    $17,    $23
+       addq    $8,     $25,    $8
+       mulq    $7,     $3,     $21
+       umulh   $7,     $3,     $28
+       cmplt   $21,    $31,    $20
+       cmplt   $28,    $31,    $24
+       addq    $21,    $21,    $21
+       addq    $28,    $28,    $28
+       addq    $28,    $20,    $28
+       addq    $8,     $24,    $8
+       addq    $22,    $21,    $22
+       addq    $23,    $28,    $23
+       cmpult  $22,    $21,    $18
+       cmpult  $23,    $28,    $27
+       addq    $23,    $18,    $23
+       addq    $8,     $27,    $8
+       stq     $22,    80($16)
+       bis     $31,    $31,    $22
+       mulq    $6,     $5,     $19
+       umulh   $6,     $5,     $17
+       cmplt   $19,    $31,    $25
+       cmplt   $17,    $31,    $20
+       addq    $19,    $19,    $19
+       addq    $17,    $17,    $17
+       addq    $17,    $25,    $17
+       addq    $22,    $20,    $22
+       addq    $23,    $19,    $23
+       addq    $8,     $17,    $8
+       cmpult  $23,    $19,    $24
+       cmpult  $8,     $17,    $21
+       addq    $8,     $24,    $8
+       addq    $22,    $21,    $22
+       mulq    $7,     $4,     $28
+       umulh   $7,     $4,     $18
+       cmplt   $28,    $31,    $27
+       cmplt   $18,    $31,    $25
+       addq    $28,    $28,    $28
+       addq    $18,    $18,    $18
+       addq    $18,    $27,    $18
+       addq    $22,    $25,    $22
+       addq    $23,    $28,    $23
+       addq    $8,     $18,    $8
+       cmpult  $23,    $28,    $20
+       cmpult  $8,     $18,    $19
+       addq    $8,     $20,    $8
+       addq    $22,    $19,    $22
+       stq     $23,    88($16)
+       bis     $31,    $31,    $23
+       mulq    $6,     $6,     $17
+       umulh   $6,     $6,     $24
+       addq    $8,     $17,    $8
+       addq    $22,    $24,    $22
+       cmpult  $8,     $17,    $21
+       cmpult  $22,    $24,    $27
+       addq    $22,    $21,    $22
+       addq    $23,    $27,    $23
+       mulq    $7,     $5,     $25
+       umulh   $7,     $5,     $28
+       cmplt   $25,    $31,    $18
+       cmplt   $28,    $31,    $20
+       addq    $25,    $25,    $25
+       addq    $28,    $28,    $28
+       addq    $28,    $18,    $28
+       addq    $23,    $20,    $23
+       addq    $8,     $25,    $8
+       addq    $22,    $28,    $22
+       cmpult  $8,     $25,    $19
+       cmpult  $22,    $28,    $17
+       addq    $22,    $19,    $22
+       addq    $23,    $17,    $23
+       stq     $8,     96($16)
+       bis     $31,    $31,    $8
+       mulq    $7,     $6,     $24
+       umulh   $7,     $6,     $21
+       cmplt   $24,    $31,    $27
+       cmplt   $21,    $31,    $18
+       addq    $24,    $24,    $24
+       addq    $21,    $21,    $21
+       addq    $21,    $27,    $21
+       addq    $8,     $18,    $8
+       addq    $22,    $24,    $22
+       addq    $23,    $21,    $23
+       cmpult  $22,    $24,    $20
+       cmpult  $23,    $21,    $25
+       addq    $23,    $20,    $23
+       addq    $8,     $25,    $8
+       stq     $22,    104($16)
+       bis     $31,    $31,    $22
+       mulq    $7,     $7,     $28
+       umulh   $7,     $7,     $19
+       addq    $23,    $28,    $23
+       addq    $8,     $19,    $8
+       cmpult  $23,    $28,    $17
+       cmpult  $8,     $19,    $27
+       addq    $8,     $17,    $8
+       addq    $22,    $27,    $22
+       stq     $23,    112($16)
+       stq     $8,     120($16)
+       ret     $31,($26),1
+       .end bn_sqr_comba8
diff --git a/crypto/bn/asm/ff b/crypto/bn/asm/ff
new file mode 100644 (file)
index 0000000..4af2168
--- /dev/null
@@ -0,0 +1,724 @@
+       .text
+       .align 3
+       .globl bn_mul_comba4
+       .ent bn_mul_comba4
+bn_mul_comba4:
+bn_mul_comba4..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       ldq     $0,     0($17)
+       ldq     $1,     0($18)
+       ldq     $2,     8($17)
+       ldq     $3,     8($18)
+       ldq     $4,     16($17)
+       ldq     $5,     16($18)
+       ldq     $6,     24($17)
+       ldq     $7,     24($18)
+       bis     $31,    $31,    $23
+       mulq    $0,     $1,     $8
+       umulh   $0,     $1,     $22
+       stq     $8,     0($16)
+       bis     $31,    $31,    $8
+       mulq    $0,     $3,     $24
+       umulh   $0,     $3,     $25
+       addq    $22,    $24,    $22
+       cmpult  $22,    $24,    $27
+       addq    $27,    $25,    $25
+       addq    $23,    $25,    $23
+       cmpult  $23,    $25,    $28
+       addq    $8,     $28,    $8
+       mulq    $2,     $1,     $21
+       umulh   $2,     $1,     $20
+       addq    $22,    $21,    $22
+       cmpult  $22,    $21,    $19
+       addq    $19,    $20,    $20
+       addq    $23,    $20,    $23
+       cmpult  $23,    $20,    $17
+       addq    $8,     $17,    $8
+       stq     $22,    8($16)
+       bis     $31,    $31,    $22
+       mulq    $2,     $3,     $18
+       umulh   $2,     $3,     $24
+       addq    $23,    $18,    $23
+       cmpult  $23,    $18,    $27
+       addq    $27,    $24,    $24
+       addq    $8,     $24,    $8
+       cmpult  $8,     $24,    $25
+       addq    $22,    $25,    $22
+       mulq    $0,     $5,     $28
+       umulh   $0,     $5,     $21
+       addq    $23,    $28,    $23
+       cmpult  $23,    $28,    $19
+       addq    $19,    $21,    $21
+       addq    $8,     $21,    $8
+       cmpult  $8,     $21,    $20
+       addq    $22,    $20,    $22
+       mulq    $4,     $1,     $17
+       umulh   $4,     $1,     $18
+       addq    $23,    $17,    $23
+       cmpult  $23,    $17,    $27
+       addq    $27,    $18,    $18
+       addq    $8,     $18,    $8
+       cmpult  $8,     $18,    $24
+       addq    $22,    $24,    $22
+       stq     $23,    16($16)
+       bis     $31,    $31,    $23
+       mulq    $0,     $7,     $25
+       umulh   $0,     $7,     $28
+       addq    $8,     $25,    $8
+       cmpult  $8,     $25,    $19
+       addq    $19,    $28,    $28
+       addq    $22,    $28,    $22
+       cmpult  $22,    $28,    $21
+       addq    $23,    $21,    $23
+       mulq    $2,     $5,     $20
+       umulh   $2,     $5,     $17
+       addq    $8,     $20,    $8
+       cmpult  $8,     $20,    $27
+       addq    $27,    $17,    $17
+       addq    $22,    $17,    $22
+       cmpult  $22,    $17,    $18
+       addq    $23,    $18,    $23
+       mulq    $4,     $3,     $24
+       umulh   $4,     $3,     $25
+       addq    $8,     $24,    $8
+       cmpult  $8,     $24,    $19
+       addq    $19,    $25,    $25
+       addq    $22,    $25,    $22
+       cmpult  $22,    $25,    $28
+       addq    $23,    $28,    $23
+       mulq    $6,     $1,     $21
+       umulh   $6,     $1,     $0
+       addq    $8,     $21,    $8
+       cmpult  $8,     $21,    $20
+       addq    $20,    $0,     $0
+       addq    $22,    $0,     $22
+       cmpult  $22,    $0,     $27
+       addq    $23,    $27,    $23
+       stq     $8,     24($16)
+       bis     $31,    $31,    $8
+       mulq    $2,     $7,     $17
+       umulh   $2,     $7,     $18
+       addq    $22,    $17,    $22
+       cmpult  $22,    $17,    $24
+       addq    $24,    $18,    $18
+       addq    $23,    $18,    $23
+       cmpult  $23,    $18,    $19
+       addq    $8,     $19,    $8
+       mulq    $4,     $5,     $25
+       umulh   $4,     $5,     $28
+       addq    $22,    $25,    $22
+       cmpult  $22,    $25,    $21
+       addq    $21,    $28,    $28
+       addq    $23,    $28,    $23
+       cmpult  $23,    $28,    $20
+       addq    $8,     $20,    $8
+       mulq    $6,     $3,     $0
+       umulh   $6,     $3,     $27
+       addq    $22,    $0,     $22
+       cmpult  $22,    $0,     $1
+       addq    $1,     $27,    $27
+       addq    $23,    $27,    $23
+       cmpult  $23,    $27,    $17
+       addq    $8,     $17,    $8
+       stq     $22,    32($16)
+       bis     $31,    $31,    $22
+       mulq    $4,     $7,     $24
+       umulh   $4,     $7,     $18
+       addq    $23,    $24,    $23
+       cmpult  $23,    $24,    $19
+       addq    $19,    $18,    $18
+       addq    $8,     $18,    $8
+       cmpult  $8,     $18,    $2
+       addq    $22,    $2,     $22
+       mulq    $6,     $5,     $25
+       umulh   $6,     $5,     $21
+       addq    $23,    $25,    $23
+       cmpult  $23,    $25,    $28
+       addq    $28,    $21,    $21
+       addq    $8,     $21,    $8
+       cmpult  $8,     $21,    $20
+       addq    $22,    $20,    $22
+       stq     $23,    40($16)
+       bis     $31,    $31,    $23
+       mulq    $6,     $7,     $0
+       umulh   $6,     $7,     $1
+       addq    $8,     $0,     $8
+       cmpult  $8,     $0,     $27
+       addq    $27,    $1,     $1
+       addq    $22,    $1,     $22
+       cmpult  $22,    $1,     $17
+       addq    $23,    $17,    $23
+       stq     $8,     48($16)
+       stq     $22,    56($16)
+       ret     $31,($26),1
+       .end bn_mul_comba4
+       .text
+       .align 3
+       .globl bn_mul_comba8
+       .ent bn_mul_comba8
+bn_mul_comba8:
+bn_mul_comba8..ng:
+       .frame $30,0,$26,0
+       .prologue 0
+
+       stq     $9,     8($30)
+       stq     $10,    16($30)
+       ldq     $0,     0($17)
+       ldq     $1,     0($18)
+       ldq     $2,     8($17)
+       ldq     $3,     8($18)
+       ldq     $4,     16($17)
+       ldq     $5,     16($18)
+       ldq     $6,     24($17)
+       ldq     $7,     24($18)
+       ldq     $8,     8($17)
+       ldq     $22,    8($18)
+       ldq     $23,    8($17)
+       ldq     $24,    8($18)
+       ldq     $25,    8($17)
+       ldq     $27,    8($18)
+       ldq     $28,    8($17)
+       ldq     $21,    8($18)
+       bis     $31,    $31,    $9
+       mulq    $0,     $1,     $20
+       umulh   $0,     $1,     $19
+       stq     $20,    0($16)
+       bis     $31,    $31,    $20
+       mulq    $0,     $3,     $10
+       umulh   $0,     $3,     $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $10
+       addq    $20,    $10,    $20
+       mulq    $2,     $1,     $18
+       umulh   $2,     $1,     $17
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $18
+       addq    $20,    $18,    $20
+       stq     $19,    8($16)
+       bis     $31,    $31,    $19
+       mulq    $0,     $5,     $10
+       umulh   $0,     $5,     $17
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $18
+       addq    $18,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $19,    $10,    $19
+       mulq    $2,     $3,     $18
+       umulh   $2,     $3,     $17
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $10
+       addq    $10,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $18
+       addq    $19,    $18,    $19
+       mulq    $4,     $1,     $10
+       umulh   $4,     $1,     $17
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $18
+       addq    $18,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $19,    $10,    $19
+       stq     $9,     16($16)
+       bis     $31,    $31,    $9
+       mulq    $0,     $7,     $18
+       umulh   $0,     $7,     $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $2,     $5,     $10
+       umulh   $2,     $5,     $17
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $10
+       addq    $9,     $10,    $9
+       mulq    $4,     $3,     $18
+       umulh   $4,     $3,     $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $6,     $1,     $10
+       umulh   $6,     $1,     $17
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $10
+       addq    $9,     $10,    $9
+       stq     $20,    24($16)
+       bis     $31,    $31,    $20
+       mulq    $0,     $22,    $18
+       umulh   $0,     $22,    $17
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $18
+       addq    $20,    $18,    $20
+       mulq    $2,     $7,     $10
+       umulh   $2,     $7,     $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $10
+       addq    $20,    $10,    $20
+       mulq    $4,     $5,     $18
+       umulh   $4,     $5,     $17
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $18
+       addq    $20,    $18,    $20
+       mulq    $6,     $3,     $10
+       umulh   $6,     $3,     $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $10
+       addq    $20,    $10,    $20
+       mulq    $8,     $1,     $18
+       umulh   $8,     $1,     $17
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $18
+       addq    $20,    $18,    $20
+       stq     $19,    32($16)
+       bis     $31,    $31,    $19
+       mulq    $0,     $24,    $10
+       umulh   $0,     $24,    $17
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $18
+       addq    $18,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $19,    $10,    $19
+       mulq    $2,     $22,    $18
+       umulh   $2,     $22,    $17
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $10
+       addq    $10,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $18
+       addq    $19,    $18,    $19
+       mulq    $4,     $7,     $10
+       umulh   $4,     $7,     $17
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $18
+       addq    $18,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $19,    $10,    $19
+       mulq    $6,     $5,     $18
+       umulh   $6,     $5,     $17
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $10
+       addq    $10,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $18
+       addq    $19,    $18,    $19
+       mulq    $8,     $3,     $10
+       umulh   $8,     $3,     $17
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $18
+       addq    $18,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $19,    $10,    $19
+       mulq    $23,    $1,     $18
+       umulh   $23,    $1,     $17
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $10
+       addq    $10,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $18
+       addq    $19,    $18,    $19
+       stq     $9,     40($16)
+       bis     $31,    $31,    $9
+       mulq    $0,     $27,    $10
+       umulh   $0,     $27,    $17
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $10
+       addq    $9,     $10,    $9
+       mulq    $2,     $24,    $18
+       umulh   $2,     $24,    $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $4,     $22,    $10
+       umulh   $4,     $22,    $17
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $10
+       addq    $9,     $10,    $9
+       mulq    $6,     $7,     $18
+       umulh   $6,     $7,     $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $8,     $5,     $10
+       umulh   $8,     $5,     $17
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $10
+       addq    $9,     $10,    $9
+       mulq    $23,    $3,     $18
+       umulh   $23,    $3,     $17
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $9,     $18,    $9
+       mulq    $25,    $1,     $10
+       umulh   $25,    $1,     $17
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $10
+       addq    $9,     $10,    $9
+       stq     $20,    48($16)
+       bis     $31,    $31,    $20
+       mulq    $0,     $21,    $18
+       umulh   $0,     $21,    $17
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $10
+       addq    $10,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $18
+       addq    $20,    $18,    $20
+       mulq    $2,     $27,    $10
+       umulh   $2,     $27,    $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $0
+       addq    $20,    $0,     $20
+       mulq    $4,     $24,    $10
+       umulh   $4,     $24,    $18
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $17
+       addq    $17,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $0
+       addq    $20,    $0,     $20
+       mulq    $6,     $22,    $10
+       umulh   $6,     $22,    $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $0
+       addq    $20,    $0,     $20
+       mulq    $8,     $7,     $10
+       umulh   $8,     $7,     $18
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $17
+       addq    $17,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $0
+       addq    $20,    $0,     $20
+       mulq    $23,    $5,     $10
+       umulh   $23,    $5,     $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $0
+       addq    $20,    $0,     $20
+       mulq    $25,    $3,     $10
+       umulh   $25,    $3,     $18
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $17
+       addq    $17,    $18,    $18
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $0
+       addq    $20,    $0,     $20
+       mulq    $28,    $1,     $10
+       umulh   $28,    $1,     $17
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $0
+       addq    $20,    $0,     $20
+       stq     $19,    56($16)
+       bis     $31,    $31,    $19
+       mulq    $2,     $21,    $10
+       umulh   $2,     $21,    $18
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $17
+       addq    $17,    $18,    $18
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $0
+       addq    $19,    $0,     $19
+       mulq    $4,     $27,    $1
+       umulh   $4,     $27,    $10
+       addq    $9,     $1,     $9
+       cmpult  $9,     $1,     $17
+       addq    $17,    $10,    $10
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $18
+       addq    $19,    $18,    $19
+       mulq    $6,     $24,    $0
+       umulh   $6,     $24,    $2
+       addq    $9,     $0,     $9
+       cmpult  $9,     $0,     $1
+       addq    $1,     $2,     $2
+       addq    $20,    $2,     $20
+       cmpult  $20,    $2,     $17
+       addq    $19,    $17,    $19
+       mulq    $8,     $22,    $10
+       umulh   $8,     $22,    $18
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $0
+       addq    $0,     $18,    $18
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $1
+       addq    $19,    $1,     $19
+       mulq    $23,    $7,     $2
+       umulh   $23,    $7,     $17
+       addq    $9,     $2,     $9
+       cmpult  $9,     $2,     $10
+       addq    $10,    $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $0
+       addq    $19,    $0,     $19
+       mulq    $25,    $5,     $18
+       umulh   $25,    $5,     $1
+       addq    $9,     $18,    $9
+       cmpult  $9,     $18,    $2
+       addq    $2,     $1,     $1
+       addq    $20,    $1,     $20
+       cmpult  $20,    $1,     $10
+       addq    $19,    $10,    $19
+       mulq    $28,    $3,     $17
+       umulh   $28,    $3,     $0
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $18
+       addq    $18,    $0,     $0
+       addq    $20,    $0,     $20
+       cmpult  $20,    $0,     $2
+       addq    $19,    $2,     $19
+       stq     $9,     64($16)
+       bis     $31,    $31,    $9
+       mulq    $4,     $21,    $1
+       umulh   $4,     $21,    $10
+       addq    $20,    $1,     $20
+       cmpult  $20,    $1,     $17
+       addq    $17,    $10,    $10
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $18
+       addq    $9,     $18,    $9
+       mulq    $6,     $27,    $0
+       umulh   $6,     $27,    $2
+       addq    $20,    $0,     $20
+       cmpult  $20,    $0,     $3
+       addq    $3,     $2,     $2
+       addq    $19,    $2,     $19
+       cmpult  $19,    $2,     $1
+       addq    $9,     $1,     $9
+       mulq    $8,     $24,    $17
+       umulh   $8,     $24,    $10
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $18
+       addq    $18,    $10,    $10
+       addq    $19,    $10,    $19
+       cmpult  $19,    $10,    $4
+       addq    $9,     $4,     $9
+       mulq    $23,    $22,    $0
+       umulh   $23,    $22,    $3
+       addq    $20,    $0,     $20
+       cmpult  $20,    $0,     $2
+       addq    $2,     $3,     $3
+       addq    $19,    $3,     $19
+       cmpult  $19,    $3,     $1
+       addq    $9,     $1,     $9
+       mulq    $25,    $7,     $17
+       umulh   $25,    $7,     $18
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $10,    $18,    $18
+       addq    $19,    $18,    $19
+       cmpult  $19,    $18,    $4
+       addq    $9,     $4,     $9
+       mulq    $28,    $5,     $0
+       umulh   $28,    $5,     $2
+       addq    $20,    $0,     $20
+       cmpult  $20,    $0,     $3
+       addq    $3,     $2,     $2
+       addq    $19,    $2,     $19
+       cmpult  $19,    $2,     $1
+       addq    $9,     $1,     $9
+       stq     $20,    72($16)
+       bis     $31,    $31,    $20
+       mulq    $6,     $21,    $17
+       umulh   $6,     $21,    $10
+       addq    $19,    $17,    $19
+       cmpult  $19,    $17,    $18
+       addq    $18,    $10,    $10
+       addq    $9,     $10,    $9
+       cmpult  $9,     $10,    $4
+       addq    $20,    $4,     $20
+       mulq    $8,     $27,    $0
+       umulh   $8,     $27,    $3
+       addq    $19,    $0,     $19
+       cmpult  $19,    $0,     $2
+       addq    $2,     $3,     $3
+       addq    $9,     $3,     $9
+       cmpult  $9,     $3,     $1
+       addq    $20,    $1,     $20
+       mulq    $23,    $24,    $5
+       umulh   $23,    $24,    $17
+       addq    $19,    $5,     $19
+       cmpult  $19,    $5,     $18
+       addq    $18,    $17,    $17
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $10
+       addq    $20,    $10,    $20
+       mulq    $25,    $22,    $4
+       umulh   $25,    $22,    $6
+       addq    $19,    $4,     $19
+       cmpult  $19,    $4,     $0
+       addq    $0,     $6,     $6
+       addq    $9,     $6,     $9
+       cmpult  $9,     $6,     $2
+       addq    $20,    $2,     $20
+       mulq    $28,    $7,     $3
+       umulh   $28,    $7,     $1
+       addq    $19,    $3,     $19
+       cmpult  $19,    $3,     $5
+       addq    $5,     $1,     $1
+       addq    $9,     $1,     $9
+       cmpult  $9,     $1,     $18
+       addq    $20,    $18,    $20
+       stq     $19,    80($16)
+       bis     $31,    $31,    $19
+       mulq    $8,     $21,    $17
+       umulh   $8,     $21,    $10
+       addq    $9,     $17,    $9
+       cmpult  $9,     $17,    $4
+       addq    $4,     $10,    $10
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $0
+       addq    $19,    $0,     $19
+       mulq    $23,    $27,    $6
+       umulh   $23,    $27,    $2
+       addq    $9,     $6,     $9
+       cmpult  $9,     $6,     $3
+       addq    $3,     $2,     $2
+       addq    $20,    $2,     $20
+       cmpult  $20,    $2,     $5
+       addq    $19,    $5,     $19
+       mulq    $25,    $24,    $1
+       umulh   $25,    $24,    $18
+       addq    $9,     $1,     $9
+       cmpult  $9,     $1,     $7
+       addq    $7,     $18,    $18
+       addq    $20,    $18,    $20
+       cmpult  $20,    $18,    $17
+       addq    $19,    $17,    $19
+       mulq    $28,    $22,    $4
+       umulh   $28,    $22,    $10
+       addq    $9,     $4,     $9
+       cmpult  $9,     $4,     $0
+       addq    $0,     $10,    $10
+       addq    $20,    $10,    $20
+       cmpult  $20,    $10,    $8
+       addq    $19,    $8,     $19
+       stq     $9,     88($16)
+       bis     $31,    $31,    $9
+       mulq    $23,    $21,    $6
+       umulh   $23,    $21,    $3
+       addq    $20,    $6,     $20
+       cmpult  $20,    $6,     $2
+       addq    $2,     $3,     $3
+       addq    $19,    $3,     $19
+       cmpult  $19,    $3,     $5
+       addq    $9,     $5,     $9
+       mulq    $25,    $27,    $1
+       umulh   $25,    $27,    $7
+       addq    $20,    $1,     $20
+       cmpult  $20,    $1,     $18
+       addq    $18,    $7,     $7
+       addq    $19,    $7,     $19
+       cmpult  $19,    $7,     $17
+       addq    $9,     $17,    $9
+       mulq    $28,    $24,    $4
+       umulh   $28,    $24,    $0
+       addq    $20,    $4,     $20
+       cmpult  $20,    $4,     $10
+       addq    $10,    $0,     $0
+       addq    $19,    $0,     $19
+       cmpult  $19,    $0,     $8
+       addq    $9,     $8,     $9
+       stq     $20,    96($16)
+       bis     $31,    $31,    $20
+       mulq    $25,    $21,    $22
+       umulh   $25,    $21,    $6
+       addq    $19,    $22,    $19
+       cmpult  $19,    $22,    $2
+       addq    $2,     $6,     $6
+       addq    $9,     $6,     $9
+       cmpult  $9,     $6,     $3
+       addq    $20,    $3,     $20
+       mulq    $28,    $27,    $5
+       umulh   $28,    $27,    $23
+       addq    $19,    $5,     $19
+       cmpult  $19,    $5,     $1
+       addq    $1,     $23,    $23
+       addq    $9,     $23,    $9
+       cmpult  $9,     $23,    $18
+       addq    $20,    $18,    $20
+       stq     $19,    104($16)
+       bis     $31,    $31,    $19
+       mulq    $28,    $21,    $7
+       umulh   $28,    $21,    $17
+       addq    $9,     $7,     $9
+       cmpult  $9,     $7,     $4
+       addq    $4,     $17,    $17
+       addq    $20,    $17,    $20
+       cmpult  $20,    $17,    $10
+       addq    $19,    $10,    $19
+       stq     $9,     112($16)
+       stq     $20,    120($16)
+       ldq     $9,     8($30)
+       ldq     $10,    16($30)
+       ret     $31,($26),1
+       .end bn_mul_comba8
diff --git a/crypto/bn/asm/mips1.s b/crypto/bn/asm/mips1.s
new file mode 100644 (file)
index 0000000..44fa125
--- /dev/null
@@ -0,0 +1,539 @@
+/* This assember is for R2000/R3000 machines, or higher ones that do
+ * no want to do any 64 bit arithmatic.
+ * Make sure that the SSLeay bignum library is compiled with 
+ * THIRTY_TWO_BIT set.
+ * This must either be compiled with the system CC, or, if you use GNU gas,
+ * cc -E mips1.s|gas -o mips1.o
+ */
+       .set    reorder
+       .set    noat
+
+#define R1     $1
+#define CC     $2
+#define        R2      $3
+#define R3     $8
+#define R4     $9
+#define L1     $10
+#define L2     $11
+#define L3     $12
+#define L4     $13
+#define H1     $14
+#define H2     $15
+#define H3     $24
+#define H4     $25
+
+#define P1     $4
+#define P2     $5
+#define P3     $6
+#define P4     $7
+
+       .align  2
+       .ent    bn_mul_add_words
+       .globl  bn_mul_add_words
+.text
+bn_mul_add_words:
+       .frame  $sp,0,$31
+       .mask   0x00000000,0
+       .fmask  0x00000000,0
+
+       #blt    P3,4,$lab34
+       
+       subu    R1,P3,4
+       move    CC,$0
+       bltz    R1,$lab34
+$lab2: 
+       lw      R1,0(P1)
+        lw     L1,0(P2)
+       lw      R2,4(P1)
+        lw     L2,4(P2)
+       lw      R3,8(P1)
+        lw     L3,8(P2)
+       lw      R4,12(P1)
+        lw     L4,12(P2)
+       multu   L1,P4
+        addu   R1,R1,CC
+       mflo    L1
+        sltu   CC,R1,CC
+       addu    R1,R1,L1
+        mfhi   H1
+       sltu    L1,R1,L1
+        sw     R1,0(P1)
+       addu    CC,CC,L1
+        multu  L2,P4
+       addu    CC,H1,CC
+       mflo    L2
+        addu   R2,R2,CC
+       sltu    CC,R2,CC
+        mfhi   H2
+       addu    R2,R2,L2
+        addu   P2,P2,16
+       sltu    L2,R2,L2
+        sw     R2,4(P1)
+       addu    CC,CC,L2
+        multu  L3,P4
+       addu    CC,H2,CC
+       mflo    L3
+        addu   R3,R3,CC
+       sltu    CC,R3,CC
+        mfhi   H3
+       addu    R3,R3,L3
+        addu   P1,P1,16
+       sltu    L3,R3,L3
+        sw     R3,-8(P1)
+       addu    CC,CC,L3
+        multu  L4,P4
+       addu    CC,H3,CC
+       mflo    L4
+        addu   R4,R4,CC
+       sltu    CC,R4,CC
+        mfhi   H4
+       addu    R4,R4,L4
+        subu   P3,P3,4
+       sltu    L4,R4,L4
+       addu    CC,CC,L4
+       addu    CC,H4,CC
+
+       subu    R1,P3,4
+       sw      R4,-4(P1)       # delay slot
+       bgez    R1,$lab2
+
+       bleu    P3,0,$lab3
+       .align  2
+$lab33: 
+       lw      L1,0(P2)
+        lw     R1,0(P1)
+       multu   L1,P4
+        addu   R1,R1,CC
+       sltu    CC,R1,CC
+        addu   P1,P1,4
+       mflo    L1
+        mfhi   H1
+       addu    R1,R1,L1
+        addu   P2,P2,4
+       sltu    L1,R1,L1
+        subu   P3,P3,1
+       addu    CC,CC,L1
+        sw     R1,-4(P1)
+       addu    CC,H1,CC
+        bgtz   P3,$lab33
+       j       $31
+       .align  2
+$lab3:
+       j       $31
+       .align  2
+$lab34:
+       bgt     P3,0,$lab33
+       j       $31
+       .end    bn_mul_add_words
+
+       .align  2
+       # Program Unit: bn_mul_words
+       .ent    bn_mul_words
+       .globl  bn_mul_words
+.text
+bn_mul_words:
+       .frame  $sp,0,$31
+       .mask   0x00000000,0
+       .fmask  0x00000000,0
+       
+       subu    P3,P3,4
+       move    CC,$0
+       bltz    P3,$lab45
+$lab44:        
+       lw      L1,0(P2)
+        lw     L2,4(P2)
+       lw      L3,8(P2)
+        lw     L4,12(P2)
+       multu   L1,P4
+        subu   P3,P3,4
+       mflo    L1
+        mfhi   H1
+       addu    L1,L1,CC
+        multu  L2,P4
+       sltu    CC,L1,CC
+        sw     L1,0(P1)
+       addu    CC,H1,CC
+        mflo   L2
+       mfhi    H2
+        addu   L2,L2,CC
+       multu   L3,P4
+        sltu   CC,L2,CC
+       sw      L2,4(P1)
+        addu   CC,H2,CC
+       mflo    L3
+        mfhi   H3
+       addu    L3,L3,CC
+        multu  L4,P4
+       sltu    CC,L3,CC
+        sw     L3,8(P1)
+       addu    CC,H3,CC
+        mflo   L4
+       mfhi    H4
+        addu   L4,L4,CC
+       addu    P1,P1,16
+        sltu   CC,L4,CC
+       addu    P2,P2,16
+        addu   CC,H4,CC
+       sw      L4,-4(P1)
+
+       bgez    P3,$lab44
+       b       $lab45
+$lab46:
+       lw      L1,0(P2)
+        addu   P1,P1,4
+       multu   L1,P4
+        addu   P2,P2,4
+       mflo    L1
+        mfhi   H1
+       addu    L1,L1,CC
+        subu   P3,P3,1
+       sltu    CC,L1,CC
+        sw     L1,-4(P1)
+       addu    CC,H1,CC
+        bgtz   P3,$lab46
+       j       $31
+$lab45:
+       addu    P3,P3,4
+       bgtz    P3,$lab46
+       j       $31
+       .align  2
+       .end    bn_mul_words
+
+       # Program Unit: bn_sqr_words
+       .ent    bn_sqr_words
+       .globl  bn_sqr_words
+.text
+bn_sqr_words:
+       .frame  $sp,0,$31
+       .mask   0x00000000,0
+       .fmask  0x00000000,0
+       
+       subu    P3,P3,4
+       bltz    P3,$lab55
+$lab54:
+       lw      L1,0(P2)
+        lw     L2,4(P2)
+       lw      L3,8(P2)
+        lw     L4,12(P2)
+
+       multu   L1,L1
+        subu   P3,P3,4
+       mflo    L1
+        mfhi   H1
+       sw      L1,0(P1)
+        sw     H1,4(P1)
+
+       multu   L2,L2
+        addu   P1,P1,32
+       mflo    L2
+        mfhi   H2
+       sw      L2,-24(P1)
+        sw     H2,-20(P1)
+
+       multu   L3,L3
+        addu   P2,P2,16
+       mflo    L3
+        mfhi   H3
+       sw      L3,-16(P1)
+        sw     H3,-12(P1)
+
+       multu   L4,L4
+
+       mflo    L4
+        mfhi   H4
+       sw      L4,-8(P1)
+        sw     H4,-4(P1)
+
+       bgtz    P3,$lab54
+       b       $lab55
+$lab56:        
+       lw      L1,0(P2)
+       addu    P1,P1,8
+       multu   L1,L1
+       addu    P2,P2,4
+       subu    P3,P3,1
+       mflo    L1
+       mfhi    H1
+       sw      L1,-8(P1)
+       sw      H1,-4(P1)
+
+       bgtz    P3,$lab56
+       j       $31
+$lab55:
+       addu    P3,P3,4
+       bgtz    P3,$lab56
+       j       $31
+       .align  2
+       .end    bn_sqr_words
+
+       # Program Unit: bn_add_words
+       .ent    bn_add_words
+       .globl  bn_add_words
+.text
+bn_add_words:   # 0x590
+       .frame  $sp,0,$31
+       .mask   0x00000000,0
+       .fmask  0x00000000,0
+       
+       subu    P4,P4,4
+       move    CC,$0
+       bltz    P4,$lab65
+$lab64:        
+       lw      L1,0(P2)
+       lw      R1,0(P3)
+       lw      L2,4(P2)
+       lw      R2,4(P3)
+
+       addu    L1,L1,CC
+        lw     L3,8(P2)
+       sltu    CC,L1,CC
+        addu   L1,L1,R1
+       sltu    R1,L1,R1
+        lw     R3,8(P3)
+       addu    CC,CC,R1
+        lw     L4,12(P2)
+
+       addu    L2,L2,CC
+        lw     R4,12(P3)
+       sltu    CC,L2,CC
+        addu   L2,L2,R2
+       sltu    R2,L2,R2
+        sw     L1,0(P1)
+       addu    CC,CC,R2
+        addu   P1,P1,16
+       addu    L3,L3,CC
+        sw     L2,-12(P1)
+       sltu    CC,L3,CC
+        addu   L3,L3,R3
+       sltu    R3,L3,R3
+        addu   P2,P2,16
+       addu    CC,CC,R3
+
+       addu    L4,L4,CC
+        addu   P3,P3,16
+       sltu    CC,L4,CC
+        addu   L4,L4,R4
+       subu    P4,P4,4
+        sltu   R4,L4,R4
+       sw      L3,-8(P1)
+        addu   CC,CC,R4
+       sw      L4,-4(P1)
+
+       bgtz    P4,$lab64
+       b       $lab65
+$lab66:
+       lw      L1,0(P2)
+        lw     R1,0(P3)
+       addu    L1,L1,CC
+        addu   P1,P1,4
+       sltu    CC,L1,CC
+        addu   P2,P2,4
+       addu    P3,P3,4
+        addu   L1,L1,R1
+       subu    P4,P4,1
+        sltu   R1,L1,R1
+       sw      L1,-4(P1)
+        addu   CC,CC,R1
+
+       bgtz    P4,$lab66
+       j       $31
+$lab65:
+       addu    P4,P4,4
+       bgtz    P4,$lab66
+       j       $31
+       .end    bn_add_words
+
+       # Program Unit: bn_div64
+       .set    at
+       .set    reorder
+       .text   
+       .align  2
+       .globl  bn_div64
+ # 321         {
+       .ent    bn_div64 2
+bn_div64:
+       subu    $sp, 64
+       sw      $31, 56($sp)
+       sw      $16, 48($sp)
+       .mask   0x80010000, -56
+       .frame  $sp, 64, $31
+       move    $9, $4
+       move    $12, $5
+       move    $16, $6
+ # 322         BN_ULONG dh,dl,q,ret=0,th,tl,t;
+       move    $31, $0
+ # 323         int i,count=2;
+       li      $13, 2
+ # 324 
+ # 325         if (d == 0) return(BN_MASK2);
+       bne     $16, 0, $80
+       li      $2, -1
+       b       $93
+$80:
+ # 326 
+ # 327         i=BN_num_bits_word(d);
+       move    $4, $16
+       sw      $31, 16($sp)
+       sw      $9, 24($sp)
+       sw      $12, 32($sp)
+       sw      $13, 40($sp)
+       .livereg        0x800ff0e,0xfff
+       jal     BN_num_bits_word
+       li      $4, 32
+       lw      $31, 16($sp)
+       lw      $9, 24($sp)
+       lw      $12, 32($sp)
+       lw      $13, 40($sp)
+       move    $3, $2
+ # 328         if ((i != BN_BITS2) && (h > (BN_ULONG)1<<i))
+       beq     $2, $4, $81
+       li      $14, 1
+       sll     $15, $14, $2
+       bleu    $9, $15, $81
+ # 329                 {
+ # 330 #if !defined(NO_STDIO) && !defined(WIN16)
+ # 331                 fprintf(stderr,"Division would overflow (%d)\n",i);
+ # 332 #endif
+ # 333                 abort();
+       sw      $3, 8($sp)
+       sw      $9, 24($sp)
+       sw      $12, 32($sp)
+       sw      $13, 40($sp)
+       sw      $31, 26($sp)
+       .livereg        0xff0e,0xfff
+       jal     abort
+       lw      $3, 8($sp)
+       li      $4, 32
+       lw      $9, 24($sp)
+       lw      $12, 32($sp)
+       lw      $13, 40($sp)
+       lw      $31, 26($sp)
+ # 334                 }
+$81:
+ # 335         i=BN_BITS2-i;
+       subu    $3, $4, $3
+ # 336         if (h >= d) h-=d;
+       bltu    $9, $16, $82
+       subu    $9, $9, $16
+$82:
+ # 337 
+ # 338         if (i)
+       beq     $3, 0, $83
+ # 339                 {
+ # 340                 d<<=i;
+       sll     $16, $16, $3
+ # 341                 h=(h<<i)|(l>>(BN_BITS2-i));
+       sll     $24, $9, $3
+       subu    $25, $4, $3
+       srl     $14, $12, $25
+       or      $9, $24, $14
+ # 342                 l<<=i;
+       sll     $12, $12, $3
+ # 343                 }
+$83:
+ # 344         dh=(d&BN_MASK2h)>>BN_BITS4;
+ # 345         dl=(d&BN_MASK2l);
+       and     $8, $16, -65536
+       srl     $8, $8, 16
+       and     $10, $16, 65535
+       li      $6, -65536
+$84:
+ # 346         for (;;)
+ # 347                 {
+ # 348                 if ((h>>BN_BITS4) == dh)
+       srl     $15, $9, 16
+       bne     $8, $15, $85
+ # 349                         q=BN_MASK2l;
+       li      $5, 65535
+       b       $86
+$85:
+ # 350                 else
+ # 351                         q=h/dh;
+       divu    $5, $9, $8
+$86:
+ # 352 
+ # 353                 for (;;)
+ # 354                         {
+ # 355                         t=(h-q*dh);
+       mul     $4, $5, $8
+       subu    $2, $9, $4
+       move    $3, $2
+ # 356                         if ((t&BN_MASK2h) ||
+ # 357                                 ((dl*q) <= (
+ # 358                                         (t<<BN_BITS4)+
+ # 359                                         ((l&BN_MASK2h)>>BN_BITS4))))
+       and     $25, $2, $6
+       bne     $25, $0, $87
+       mul     $24, $10, $5
+       sll     $14, $3, 16
+       and     $15, $12, $6
+       srl     $25, $15, 16
+       addu    $15, $14, $25
+       bgtu    $24, $15, $88
+$87:
+ # 360                                 break;
+       mul     $3, $10, $5
+       b       $89
+$88:
+ # 361                         q--;
+       addu    $5, $5, -1
+ # 362                         }
+       b       $86
+$89:
+ # 363                 th=q*dh;
+ # 364                 tl=q*dl;
+ # 365                 t=(tl>>BN_BITS4);
+ # 366                 tl=(tl<<BN_BITS4)&BN_MASK2h;
+       sll     $14, $3, 16
+       and     $2, $14, $6
+       move    $11, $2
+ # 367                 th+=t;
+       srl     $25, $3, 16
+       addu    $7, $4, $25
+ # 368 
+ # 369                 if (l < tl) th++;
+       bgeu    $12, $2, $90
+       addu    $7, $7, 1
+$90:
+ # 370                 l-=tl;
+       subu    $12, $12, $11
+ # 371                 if (h < th)
+       bgeu    $9, $7, $91
+ # 372                         {
+ # 373                         h+=d;
+       addu    $9, $9, $16
+ # 374                         q--;
+       addu    $5, $5, -1
+ # 375                         }
+$91:
+ # 376                 h-=th;
+       subu    $9, $9, $7
+ # 377 
+ # 378                 if (--count == 0) break;
+       addu    $13, $13, -1
+       beq     $13, 0, $92
+ # 379 
+ # 380                 ret=q<<BN_BITS4;
+       sll     $31, $5, 16
+ # 381                 h=((h<<BN_BITS4)|(l>>BN_BITS4))&BN_MASK2;
+       sll     $24, $9, 16
+       srl     $15, $12, 16
+       or      $9, $24, $15
+ # 382                 l=(l&BN_MASK2l)<<BN_BITS4;
+       and     $12, $12, 65535
+       sll     $12, $12, 16
+ # 383                 }
+       b       $84
+$92:
+ # 384         ret|=q;
+       or      $31, $31, $5
+ # 385         return(ret);
+       move    $2, $31
+$93:
+       lw      $16, 48($sp)
+       lw      $31, 56($sp)
+       addu    $sp, 64
+       j       $31
+       .end    bn_div64
+
diff --git a/crypto/bn/asm/mips3.s b/crypto/bn/asm/mips3.s
new file mode 100644 (file)
index 0000000..e8fdd50
--- /dev/null
@@ -0,0 +1,544 @@
+/* This assember is for R4000 and above machines.  It takes advantage
+ * of the 64 bit registers present on these CPUs.
+ * Make sure that the SSLeay bignum library is compiled with
+ * SIXTY_FOUR_BIT set and BN_LLONG undefined.
+ * This must either be compiled with the system CC, or, if you use GNU gas,
+ * cc -E mips3.s|gas -o mips3.o
+ */
+       .set    reorder
+       .set    noat
+
+#define R1     $1
+#define CC     $2
+#define        R2      $3
+#define R3     $8
+#define R4     $9
+#define L1     $10
+#define L2     $11
+#define L3     $12
+#define L4     $13
+#define H1     $14
+#define H2     $15
+#define H3     $24
+#define H4     $25
+
+#define P1     $4
+#define P2     $5
+#define P3     $6
+#define P4     $7
+
+       .align  2
+       .ent    bn_mul_add_words
+       .globl  bn_mul_add_words
+.text
+bn_mul_add_words:
+       .frame  $sp,0,$31
+       .mask   0x00000000,0
+       .fmask  0x00000000,0
+
+       #blt    P3,4,$lab34
+       
+       subu    R1,P3,4
+       move    CC,$0
+       bltz    R1,$lab34
+$lab2: 
+       ld      R1,0(P1)
+        ld     L1,0(P2)
+       ld      R2,8(P1)
+        ld     L2,8(P2)
+       ld      R3,16(P1)
+        ld     L3,16(P2)
+       ld      R4,24(P1)
+        ld     L4,24(P2)
+       dmultu  L1,P4
+        daddu  R1,R1,CC
+       mflo    L1
+        sltu   CC,R1,CC
+       daddu   R1,R1,L1
+        mfhi   H1
+       sltu    L1,R1,L1
+        sd     R1,0(P1)
+       daddu   CC,CC,L1
+        dmultu L2,P4
+       daddu   CC,H1,CC
+       mflo    L2
+        daddu  R2,R2,CC
+       sltu    CC,R2,CC
+        mfhi   H2
+       daddu   R2,R2,L2
+        daddu  P2,P2,32
+       sltu    L2,R2,L2
+        sd     R2,8(P1)
+       daddu   CC,CC,L2
+        dmultu L3,P4
+       daddu   CC,H2,CC
+       mflo    L3
+        daddu  R3,R3,CC
+       sltu    CC,R3,CC
+        mfhi   H3
+       daddu   R3,R3,L3
+        daddu  P1,P1,32
+       sltu    L3,R3,L3
+        sd     R3,-16(P1)
+       daddu   CC,CC,L3
+        dmultu L4,P4
+       daddu   CC,H3,CC
+       mflo    L4
+        daddu  R4,R4,CC
+       sltu    CC,R4,CC
+        mfhi   H4
+       daddu   R4,R4,L4
+        subu   P3,P3,4
+       sltu    L4,R4,L4
+       daddu   CC,CC,L4
+       daddu   CC,H4,CC
+
+       subu    R1,P3,4
+       sd      R4,-8(P1)       # delay slot
+       bgez    R1,$lab2
+
+       bleu    P3,0,$lab3
+       .align  2
+$lab33: 
+       ld      L1,0(P2)
+        ld     R1,0(P1)
+       dmultu  L1,P4
+        daddu  R1,R1,CC
+       sltu    CC,R1,CC
+        daddu  P1,P1,8
+       mflo    L1
+        mfhi   H1
+       daddu   R1,R1,L1
+        daddu  P2,P2,8
+       sltu    L1,R1,L1
+        subu   P3,P3,1
+       daddu   CC,CC,L1
+        sd     R1,-8(P1)
+       daddu   CC,H1,CC
+        bgtz   P3,$lab33
+       j       $31
+       .align  2
+$lab3:
+       j       $31
+       .align  2
+$lab34:
+       bgt     P3,0,$lab33
+       j       $31
+       .end    bn_mul_add_words
+
+       .align  2
+       # Program Unit: bn_mul_words
+       .ent    bn_mul_words
+       .globl  bn_mul_words
+.text
+bn_mul_words:
+       .frame  $sp,0,$31
+       .mask   0x00000000,0
+       .fmask  0x00000000,0
+       
+       subu    P3,P3,4
+       move    CC,$0
+       bltz    P3,$lab45
+$lab44:        
+       ld      L1,0(P2)
+        ld     L2,8(P2)
+       ld      L3,16(P2)
+        ld     L4,24(P2)
+       dmultu  L1,P4
+        subu   P3,P3,4
+       mflo    L1
+        mfhi   H1
+       daddu   L1,L1,CC
+        dmultu L2,P4
+       sltu    CC,L1,CC
+        sd     L1,0(P1)
+       daddu   CC,H1,CC
+        mflo   L2
+       mfhi    H2
+        daddu  L2,L2,CC
+       dmultu  L3,P4
+        sltu   CC,L2,CC
+       sd      L2,8(P1)
+        daddu  CC,H2,CC
+       mflo    L3
+        mfhi   H3
+       daddu   L3,L3,CC
+        dmultu L4,P4
+       sltu    CC,L3,CC
+        sd     L3,16(P1)
+       daddu   CC,H3,CC
+        mflo   L4
+       mfhi    H4
+        daddu  L4,L4,CC
+       daddu   P1,P1,32
+        sltu   CC,L4,CC
+       daddu   P2,P2,32
+        daddu  CC,H4,CC
+       sd      L4,-8(P1)
+
+       bgez    P3,$lab44
+       b       $lab45
+$lab46:
+       ld      L1,0(P2)
+        daddu  P1,P1,8
+       dmultu  L1,P4
+        daddu  P2,P2,8
+       mflo    L1
+        mfhi   H1
+       daddu   L1,L1,CC
+        subu   P3,P3,1
+       sltu    CC,L1,CC
+        sd     L1,-8(P1)
+       daddu   CC,H1,CC
+        bgtz   P3,$lab46
+       j       $31
+$lab45:
+       addu    P3,P3,4
+       bgtz    P3,$lab46
+       j       $31
+       .align  2
+       .end    bn_mul_words
+
+       # Program Unit: bn_sqr_words
+       .ent    bn_sqr_words
+       .globl  bn_sqr_words
+.text
+bn_sqr_words:
+       .frame  $sp,0,$31
+       .mask   0x00000000,0
+       .fmask  0x00000000,0
+       
+       subu    P3,P3,4
+ b $lab55
+       bltz    P3,$lab55
+$lab54:
+       ld      L1,0(P2)
+        ld     L2,8(P2)
+       ld      L3,16(P2)
+        ld     L4,24(P2)
+
+       dmultu  L1,L1
+        subu   P3,P3,4
+       mflo    L1
+        mfhi   H1
+       sd      L1,0(P1)
+        sd     H1,8(P1)
+
+       dmultu  L2,L2
+        daddu  P1,P1,32
+       mflo    L2
+        mfhi   H2
+       sd      L2,-48(P1)
+        sd     H2,-40(P1)
+
+       dmultu  L3,L3
+        daddu  P2,P2,32
+       mflo    L3
+        mfhi   H3
+       sd      L3,-32(P1)
+        sd     H3,-24(P1)
+
+       dmultu  L4,L4
+
+       mflo    L4
+        mfhi   H4
+       sd      L4,-16(P1)
+        sd     H4,-8(P1)
+
+       bgtz    P3,$lab54
+       b       $lab55
+$lab56:        
+       ld      L1,0(P2)
+       daddu   P1,P1,16
+       dmultu  L1,L1
+       daddu   P2,P2,8
+       subu    P3,P3,1
+       mflo    L1
+       mfhi    H1
+       sd      L1,-16(P1)
+       sd      H1,-8(P1)
+
+       bgtz    P3,$lab56
+       j       $31
+$lab55:
+       daddu   P3,P3,4
+       bgtz    P3,$lab56
+       j       $31
+       .align  2
+       .end    bn_sqr_words
+
+       # Program Unit: bn_add_words
+       .ent    bn_add_words
+       .globl  bn_add_words
+.text
+bn_add_words:   # 0x590
+       .frame  $sp,0,$31
+       .mask   0x00000000,0
+       .fmask  0x00000000,0
+       
+       subu    P4,P4,4
+       move    CC,$0
+       bltz    P4,$lab65
+$lab64:        
+       ld      L1,0(P2)
+       ld      R1,0(P3)
+       ld      L2,8(P2)
+       ld      R2,8(P3)
+
+       daddu   L1,L1,CC
+        ld     L3,16(P2)
+       sltu    CC,L1,CC
+        daddu  L1,L1,R1
+       sltu    R1,L1,R1
+        ld     R3,16(P3)
+       daddu   CC,CC,R1
+        ld     L4,24(P2)
+
+       daddu   L2,L2,CC
+        ld     R4,24(P3)
+       sltu    CC,L2,CC
+        daddu  L2,L2,R2
+       sltu    R2,L2,R2
+        sd     L1,0(P1)
+       daddu   CC,CC,R2
+        daddu  P1,P1,32
+       daddu   L3,L3,CC
+        sd     L2,-24(P1)
+
+       sltu    CC,L3,CC
+        daddu  L3,L3,R3
+       sltu    R3,L3,R3
+        daddu  P2,P2,32
+       daddu   CC,CC,R3
+
+       daddu   L4,L4,CC
+        daddu  P3,P3,32
+       sltu    CC,L4,CC
+        daddu  L4,L4,R4
+       sltu    R4,L4,R4
+        subu   P4,P4,4
+       sd      L3,-16(P1)
+        daddu  CC,CC,R4
+       sd      L4,-8(P1)
+
+       bgtz    P4,$lab64
+       b       $lab65
+$lab66:
+       ld      L1,0(P2)
+        ld     R1,0(P3)
+       daddu   L1,L1,CC
+        daddu  P1,P1,8
+       sltu    CC,L1,CC
+        daddu  P2,P2,8
+       daddu   P3,P3,8
+        daddu  L1,L1,R1
+       subu    P4,P4,1
+        sltu   R1,L1,R1
+       sd      L1,-8(P1)
+        daddu  CC,CC,R1
+
+       bgtz    P4,$lab66
+       j       $31
+$lab65:
+       addu    P4,P4,4
+       bgtz    P4,$lab66
+       j       $31
+       .end    bn_add_words
+
+#if 1
+       # Program Unit: bn_div64
+       .set    at
+       .set    reorder
+       .text   
+       .align  2
+       .globl  bn_div64
+ # 321         {
+       .ent    bn_div64
+bn_div64:
+       dsubu   $sp, 64
+       sd      $31, 56($sp)
+       sd      $16, 48($sp)
+       .mask   0x80010000, -56
+       .frame  $sp, 64, $31
+       move    $9, $4
+       move    $12, $5
+       move    $16, $6
+ # 322         BN_ULONG dh,dl,q,ret=0,th,tl,t;
+       move    $31, $0
+ # 323         int i,count=2;
+       li      $13, 2
+ # 324 
+ # 325         if (d == 0) return(BN_MASK2);
+       bne     $16, 0, $80
+       dli     $2, -1
+       b       $93
+$80:
+ # 326 
+ # 327         i=BN_num_bits_word(d);
+       move    $4, $16
+       sd      $31, 16($sp)
+       sd      $9, 24($sp)
+       sd      $12, 32($sp)
+       sd      $13, 40($sp)
+       .livereg        0x800ff0e,0xfff
+       jal     BN_num_bits_word
+       dli     $4, 64
+       ld      $31, 16($sp)
+       ld      $9, 24($sp)
+       ld      $12, 32($sp)
+       ld      $13, 40($sp)
+       move    $3, $2
+ # 328         if ((i != BN_BITS2) && (h > (BN_ULONG)1<<i))
+       beq     $2, $4, $81
+       dli     $14, 1
+       dsll    $15, $14, $2
+       bleu    $9, $15, $81
+ # 329                 {
+ # 330 #if !defined(NO_STDIO) && !defined(WIN16)
+ # 331                 fprintf(stderr,"Division would overflow (%d)\n",i);
+ # 332 #endif
+ # 333                 abort();
+       sd      $3, 8($sp)
+       sd      $31, 16($sp)
+       sd      $9, 24($sp)
+       sd      $12, 32($sp)
+       sd      $13, 40($sp)
+       .livereg        0xff0e,0xfff
+       jal     abort
+       dli     $4, 64
+       ld      $3, 8($sp)
+       ld      $31, 16($sp)
+       ld      $9, 24($sp)
+       ld      $12, 32($sp)
+       ld      $13, 40($sp)
+ # 334                 }
+$81:
+ # 335         i=BN_BITS2-i;
+       dsubu   $3, $4, $3
+ # 336         if (h >= d) h-=d;
+       bltu    $9, $16, $82
+       dsubu   $9, $9, $16
+$82:
+ # 337 
+ # 338         if (i)
+       beq     $3, 0, $83
+ # 339                 {
+ # 340                 d<<=i;
+       dsll    $16, $16, $3
+ # 341                 h=(h<<i)|(l>>(BN_BITS2-i));
+       dsll    $24, $9, $3
+       dsubu   $25, $4, $3
+       dsrl    $14, $12, $25
+       or      $9, $24, $14
+ # 342                 l<<=i;
+       dsll    $12, $12, $3
+ # 343                 }
+$83:
+ # 344         dh=(d&BN_MASK2h)>>BN_BITS4;
+ # 345         dl=(d&BN_MASK2l);
+       and     $8, $16,0xFFFFFFFF00000000
+       dsrl    $8, $8, 32
+       # dli   $10,0xFFFFFFFF # Is this needed?
+       # and   $10, $16, $10
+       dsll    $10, $16, 32
+       dsrl    $10, $10, 32
+       dli     $6,0xFFFFFFFF00000000
+$84:
+ # 346         for (;;)
+ # 347                 {
+ # 348                 if ((h>>BN_BITS4) == dh)
+       dsrl    $15, $9, 32
+       bne     $8, $15, $85
+ # 349                         q=BN_MASK2l;
+       dli     $5, 0xFFFFFFFF
+       b       $86
+$85:
+ # 350                 else
+ # 351                         q=h/dh;
+       ddivu   $5, $9, $8
+$86:
+ # 352 
+ # 353                 for (;;)
+ # 354                         {
+ # 355                         t=(h-q*dh);
+       dmul    $4, $5, $8
+       dsubu   $2, $9, $4
+       move    $3, $2
+ # 356                         if ((t&BN_MASK2h) ||
+ # 357                                 ((dl*q) <= (
+ # 358                                         (t<<BN_BITS4)+
+ # 359                                         ((l&BN_MASK2h)>>BN_BITS4))))
+       and     $25, $2, $6
+       bne     $25, $0, $87
+       dmul    $24, $10, $5
+       dsll    $14, $3, 32
+       and     $15, $12, $6
+       dsrl    $25, $15, 32
+       daddu   $15, $14, $25
+       bgtu    $24, $15, $88
+$87:
+ # 360                                 break;
+       dmul    $3, $10, $5
+       b       $89
+$88:
+ # 361                         q--;
+       daddu   $5, $5, -1
+ # 362                         }
+       b       $86
+$89:
+ # 363                 th=q*dh;
+ # 364                 tl=q*dl;
+ # 365                 t=(tl>>BN_BITS4);
+ # 366                 tl=(tl<<BN_BITS4)&BN_MASK2h;
+       dsll    $14, $3, 32
+       and     $2, $14, $6
+       move    $11, $2
+ # 367                 th+=t;
+       dsrl    $25, $3, 32
+       daddu   $7, $4, $25
+ # 368 
+ # 369                 if (l < tl) th++;
+       bgeu    $12, $2, $90
+       daddu   $7, $7, 1
+$90:
+ # 370                 l-=tl;
+       dsubu   $12, $12, $11
+ # 371                 if (h < th)
+       bgeu    $9, $7, $91
+ # 372                         {
+ # 373                         h+=d;
+       daddu   $9, $9, $16
+ # 374                         q--;
+       daddu   $5, $5, -1
+ # 375                         }
+$91:
+ # 376                 h-=th;
+       dsubu   $9, $9, $7
+ # 377 
+ # 378                 if (--count == 0) break;
+       addu    $13, $13, -1
+       beq     $13, 0, $92
+ # 379 
+ # 380                 ret=q<<BN_BITS4;
+       dsll    $31, $5, 32
+ # 381                 h=((h<<BN_BITS4)|(l>>BN_BITS4))&BN_MASK2;
+       dsll    $24, $9, 32
+       dsrl    $15, $12, 32
+       or      $9, $24, $15
+ # 382                 l=(l&BN_MASK2l)<<BN_BITS4;
+       and     $12, $12, 0xFFFFFFFF
+       dsll    $12, $12, 32
+ # 383                 }
+       b       $84
+$92:
+ # 384         ret|=q;
+       or      $31, $31, $5
+ # 385         return(ret);
+       move    $2, $31
+$93:
+       ld      $16, 48($sp)
+       ld      $31, 56($sp)
+       daddu   $sp, 64
+       j       $31
+       .end    bn_div64
+#endif
diff --git a/crypto/bn/asm/x86.pl b/crypto/bn/asm/x86.pl
new file mode 100644 (file)
index 0000000..bf869fd
--- /dev/null
@@ -0,0 +1,28 @@
+#!/usr/local/bin/perl
+
+push(@INC,"perlasm","../../perlasm");
+require "x86asm.pl";
+
+require("x86/mul_add.pl");
+require("x86/mul.pl");
+require("x86/sqr.pl");
+require("x86/div.pl");
+require("x86/add.pl");
+require("x86/sub.pl");
+require("x86/comba.pl");
+
+&asm_init($ARGV[0],"bn-586.pl");
+
+&bn_mul_add_words("bn_mul_add_words");
+&bn_mul_words("bn_mul_words");
+&bn_sqr_words("bn_sqr_words");
+&bn_div_words("bn_div_words");
+&bn_add_words("bn_add_words");
+&bn_sub_words("bn_sub_words");
+&bn_mul_comba("bn_mul_comba8",8);
+&bn_mul_comba("bn_mul_comba4",4);
+&bn_sqr_comba("bn_sqr_comba8",8);
+&bn_sqr_comba("bn_sqr_comba4",4);
+
+&asm_finish();
+
diff --git a/crypto/bn/asm/x86/add.pl b/crypto/bn/asm/x86/add.pl
new file mode 100644 (file)
index 0000000..0b5cf58
--- /dev/null
@@ -0,0 +1,76 @@
+#!/usr/local/bin/perl
+# x86 assember
+
+sub bn_add_words
+       {
+       local($name)=@_;
+
+       &function_begin($name,"");
+
+       &comment("");
+       $a="esi";
+       $b="edi";
+       $c="eax";
+       $r="ebx";
+       $tmp1="ecx";
+       $tmp2="edx";
+       $num="ebp";
+
+       &mov($r,&wparam(0));    # get r
+        &mov($a,&wparam(1));   # get a
+       &mov($b,&wparam(2));    # get b
+        &mov($num,&wparam(3)); # get num
+       &xor($c,$c);            # clear carry
+        &and($num,0xfffffff8); # num / 8
+
+       &jz(&label("aw_finish"));
+
+       &set_label("aw_loop",0);
+       for ($i=0; $i<8; $i++)
+               {
+               &comment("Round $i");
+
+               &mov($tmp1,&DWP($i*4,$a,"",0));         # *a
+                &mov($tmp2,&DWP($i*4,$b,"",0));        # *b
+               &add($tmp1,$c);
+                &mov($c,0);
+               &adc($c,$c);
+                &add($tmp1,$tmp2);
+               &adc($c,0);
+                &mov(&DWP($i*4,$r,"",0),$tmp1);        # *r
+               }
+
+       &comment("");
+       &add($a,32);
+        &add($b,32);
+       &add($r,32);
+        &sub($num,8);
+       &jnz(&label("aw_loop"));
+
+       &set_label("aw_finish",0);
+       &mov($num,&wparam(3));  # get num
+       &and($num,7);
+        &jz(&label("aw_end"));
+
+       for ($i=0; $i<7; $i++)
+               {
+               &comment("Tail Round $i");
+               &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
+                &mov($tmp2,&DWP($i*4,$b,"",0));# *b
+               &add($tmp1,$c);
+                &mov($c,0);
+               &adc($c,$c);
+                &add($tmp1,$tmp2);
+               &adc($c,0);
+                &dec($num) if ($i != 6);
+               &mov(&DWP($i*4,$r,"",0),$tmp1); # *a
+                &jz(&label("aw_end")) if ($i != 6);
+               }
+       &set_label("aw_end",0);
+
+#      &mov("eax",$c);         # $c is "eax"
+
+       &function_end($name);
+       }
+
+1;
diff --git a/crypto/bn/asm/x86/comba.pl b/crypto/bn/asm/x86/comba.pl
new file mode 100644 (file)
index 0000000..2291253
--- /dev/null
@@ -0,0 +1,277 @@
+#!/usr/local/bin/perl
+# x86 assember
+
+sub mul_add_c
+       {
+       local($a,$ai,$b,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_;
+
+       # pos == -1 if eax and edx are pre-loaded, 0 to load from next
+       # words, and 1 if load return value
+
+       &comment("mul a[$ai]*b[$bi]");
+
+       # "eax" and "edx" will always be pre-loaded.
+       # &mov("eax",&DWP($ai*4,$a,"",0)) ;
+       # &mov("edx",&DWP($bi*4,$b,"",0));
+
+       &mul("edx");
+       &add($c0,"eax");
+        &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0;        # laod next a
+        &mov("eax",&wparam(0)) if $pos > 0;                    # load r[]
+        ###
+       &adc($c1,"edx");
+        &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 0;        # laod next b
+        &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 1;        # laod next b
+        ###
+       &adc($c2,0);
+        # is pos > 1, it means it is the last loop 
+        &mov(&DWP($i*4,"eax","",0),$c0) if $pos > 0;           # save r[];
+       &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1;         # laod next a
+       }
+
+sub sqr_add_c
+       {
+       local($r,$a,$ai,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_;
+
+       # pos == -1 if eax and edx are pre-loaded, 0 to load from next
+       # words, and 1 if load return value
+
+       &comment("sqr a[$ai]*a[$bi]");
+
+       # "eax" and "edx" will always be pre-loaded.
+       # &mov("eax",&DWP($ai*4,$a,"",0)) ;
+       # &mov("edx",&DWP($bi*4,$b,"",0));
+
+       if ($ai == $bi)
+               { &mul("eax");}
+       else
+               { &mul("edx");}
+       &add($c0,"eax");
+        &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0;        # load next a
+        ###
+       &adc($c1,"edx");
+        &mov("edx",&DWP(($nb)*4,$a,"",0)) if ($pos == 1) && ($na != $nb);
+        ###
+       &adc($c2,0);
+        # is pos > 1, it means it is the last loop 
+        &mov(&DWP($i*4,$r,"",0),$c0) if $pos > 0;              # save r[];
+       &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1;         # load next b
+       }
+
+sub sqr_add_c2
+       {
+       local($r,$a,$ai,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_;
+
+       # pos == -1 if eax and edx are pre-loaded, 0 to load from next
+       # words, and 1 if load return value
+
+       &comment("sqr a[$ai]*a[$bi]");
+
+       # "eax" and "edx" will always be pre-loaded.
+       # &mov("eax",&DWP($ai*4,$a,"",0)) ;
+       # &mov("edx",&DWP($bi*4,$a,"",0));
+
+       if ($ai == $bi)
+               { &mul("eax");}
+       else
+               { &mul("edx");}
+       &add("eax","eax");
+        ###
+       &adc("edx","edx");
+        ###
+       &adc($c2,0);
+        &add($c0,"eax");
+       &adc($c1,"edx");
+        &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0;        # load next a
+        &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1;        # load next b
+       &adc($c2,0);
+       &mov(&DWP($i*4,$r,"",0),$c0) if $pos > 0;               # save r[];
+        &mov("edx",&DWP(($nb)*4,$a,"",0)) if ($pos <= 1) && ($na != $nb);
+        ###
+       }
+
+sub bn_mul_comba
+       {
+       local($name,$num)=@_;
+       local($a,$b,$c0,$c1,$c2);
+       local($i,$as,$ae,$bs,$be,$ai,$bi);
+       local($tot,$end);
+
+       &function_begin_B($name,"");
+
+       $c0="ebx";
+       $c1="ecx";
+       $c2="ebp";
+       $a="esi";
+       $b="edi";
+       
+       $as=0;
+       $ae=0;
+       $bs=0;
+       $be=0;
+       $tot=$num+$num-1;
+
+       &push("esi");
+        &mov($a,&wparam(1));
+       &push("edi");
+        &mov($b,&wparam(2));
+       &push("ebp");
+        &push("ebx");
+
+       &xor($c0,$c0);
+        &mov("eax",&DWP(0,$a,"",0));   # load the first word 
+       &xor($c1,$c1);
+        &mov("edx",&DWP(0,$b,"",0));   # load the first second 
+
+       for ($i=0; $i<$tot; $i++)
+               {
+               $ai=$as;
+               $bi=$bs;
+               $end=$be+1;
+
+               &comment("################## Calculate word $i"); 
+
+               for ($j=$bs; $j<$end; $j++)
+                       {
+                       &xor($c2,$c2) if ($j == $bs);
+                       if (($j+1) == $end)
+                               {
+                               $v=1;
+                               $v=2 if (($i+1) == $tot);
+                               }
+                       else
+                               { $v=0; }
+                       if (($j+1) != $end)
+                               {
+                               $na=($ai-1);
+                               $nb=($bi+1);
+                               }
+                       else
+                               {
+                               $na=$as+($i < ($num-1));
+                               $nb=$bs+($i >= ($num-1));
+                               }
+#printf STDERR "[$ai,$bi] -> [$na,$nb]\n";
+                       &mul_add_c($a,$ai,$b,$bi,$c0,$c1,$c2,$v,$i,$na,$nb);
+                       if ($v)
+                               {
+                               &comment("saved r[$i]");
+                               # &mov("eax",&wparam(0));
+                               # &mov(&DWP($i*4,"eax","",0),$c0);
+                               ($c0,$c1,$c2)=($c1,$c2,$c0);
+                               }
+                       $ai--;
+                       $bi++;
+                       }
+               $as++ if ($i < ($num-1));
+               $ae++ if ($i >= ($num-1));
+
+               $bs++ if ($i >= ($num-1));
+               $be++ if ($i < ($num-1));
+               }
+       &comment("save r[$i]");
+       # &mov("eax",&wparam(0));
+       &mov(&DWP($i*4,"eax","",0),$c0);
+
+       &pop("ebx");
+       &pop("ebp");
+       &pop("edi");
+       &pop("esi");
+       &ret();
+       &function_end_B($name);
+       }
+
+sub bn_sqr_comba
+       {
+       local($name,$num)=@_;
+       local($r,$a,$c0,$c1,$c2)=@_;
+       local($i,$as,$ae,$bs,$be,$ai,$bi);
+       local($b,$tot,$end,$half);
+
+       &function_begin_B($name,"");
+
+       $c0="ebx";
+       $c1="ecx";
+       $c2="ebp";
+       $a="esi";
+       $r="edi";
+
+       &push("esi");
+        &push("edi");
+       &push("ebp");
+        &push("ebx");
+       &mov($r,&wparam(0));
+        &mov($a,&wparam(1));
+       &xor($c0,$c0);
+        &xor($c1,$c1);
+       &mov("eax",&DWP(0,$a,"",0)); # load the first word
+
+       $as=0;
+       $ae=0;
+       $bs=0;
+       $be=0;
+       $tot=$num+$num-1;
+
+       for ($i=0; $i<$tot; $i++)
+               {
+               $ai=$as;
+               $bi=$bs;
+               $end=$be+1;
+
+               &comment("############### Calculate word $i");
+               for ($j=$bs; $j<$end; $j++)
+                       {
+                       &xor($c2,$c2) if ($j == $bs);
+                       if (($ai-1) < ($bi+1))
+                               {
+                               $v=1;
+                               $v=2 if ($i+1) == $tot;
+                               }
+                       else
+                               { $v=0; }
+                       if (!$v)
+                               {
+                               $na=$ai-1;
+                               $nb=$bi+1;
+                               }
+                       else
+                               {
+                               $na=$as+($i < ($num-1));
+                               $nb=$bs+($i >= ($num-1));
+                               }
+                       if ($ai == $bi)
+                               {
+                               &sqr_add_c($r,$a,$ai,$bi,
+                                       $c0,$c1,$c2,$v,$i,$na,$nb);
+                               }
+                       else
+                               {
+                               &sqr_add_c2($r,$a,$ai,$bi,
+                                       $c0,$c1,$c2,$v,$i,$na,$nb);
+                               }
+                       if ($v)
+                               {
+                               &comment("saved r[$i]");
+                               #&mov(&DWP($i*4,$r,"",0),$c0);
+                               ($c0,$c1,$c2)=($c1,$c2,$c0);
+                               last;
+                               }
+                       $ai--;
+                       $bi++;
+                       }
+               $as++ if ($i < ($num-1));
+               $ae++ if ($i >= ($num-1));
+
+               $bs++ if ($i >= ($num-1));
+               $be++ if ($i < ($num-1));
+               }
+       &mov(&DWP($i*4,$r,"",0),$c0);
+       &pop("ebx");
+       &pop("ebp");
+       &pop("edi");
+       &pop("esi");
+       &ret();
+       &function_end_B($name);
+       }
+
+1;
diff --git a/crypto/bn/asm/x86/div.pl b/crypto/bn/asm/x86/div.pl
new file mode 100644 (file)
index 0000000..0e90152
--- /dev/null
@@ -0,0 +1,15 @@
+#!/usr/local/bin/perl
+# x86 assember
+
+sub bn_div_words
+       {
+       local($name)=@_;
+
+       &function_begin($name,"");
+       &mov("edx",&wparam(0)); #
+       &mov("eax",&wparam(1)); #
+       &mov("ebx",&wparam(2)); #
+       &div("ebx");
+       &function_end($name);
+       }
+1;
diff --git a/crypto/bn/asm/x86/f b/crypto/bn/asm/x86/f
new file mode 100644 (file)
index 0000000..22e4112
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/local/bin/perl
+# x86 assember
+
diff --git a/crypto/bn/asm/x86/mul.pl b/crypto/bn/asm/x86/mul.pl
new file mode 100644 (file)
index 0000000..674cb9b
--- /dev/null
@@ -0,0 +1,77 @@
+#!/usr/local/bin/perl
+# x86 assember
+
+sub bn_mul_words
+       {
+       local($name)=@_;
+
+       &function_begin($name,"");
+
+       &comment("");
+       $Low="eax";
+       $High="edx";
+       $a="ebx";
+       $w="ecx";
+       $r="edi";
+       $c="esi";
+       $num="ebp";
+
+       &xor($c,$c);            # clear carry
+       &mov($r,&wparam(0));    #
+       &mov($a,&wparam(1));    #
+       &mov($num,&wparam(2));  #
+       &mov($w,&wparam(3));    #
+
+       &and($num,0xfffffff8);  # num / 8
+       &jz(&label("mw_finish"));
+
+       &set_label("mw_loop",0);
+       for ($i=0; $i<32; $i+=4)
+               {
+               &comment("Round $i");
+
+                &mov("eax",&DWP($i,$a,"",0));  # *a
+               &mul($w);                       # *a * w
+               &add("eax",$c);                 # L(t)+=c
+                # XXX
+
+               &adc("edx",0);                  # H(t)+=carry
+                &mov(&DWP($i,$r,"",0),"eax");  # *r= L(t);
+
+               &mov($c,"edx");                 # c=  H(t);
+               }
+
+       &comment("");
+       &add($a,32);
+       &add($r,32);
+       &sub($num,8);
+       &jz(&label("mw_finish"));
+       &jmp(&label("mw_loop"));
+
+       &set_label("mw_finish",0);
+       &mov($num,&wparam(2));  # get num
+       &and($num,7);
+       &jnz(&label("mw_finish2"));
+       &jmp(&label("mw_end"));
+
+       &set_label("mw_finish2",1);
+       for ($i=0; $i<7; $i++)
+               {
+               &comment("Tail Round $i");
+                &mov("eax",&DWP($i*4,$a,"",0));# *a
+               &mul($w);                       # *a * w
+               &add("eax",$c);                 # L(t)+=c
+                # XXX
+               &adc("edx",0);                  # H(t)+=carry
+                &mov(&DWP($i*4,$r,"",0),"eax");# *r= L(t);
+               &mov($c,"edx");                 # c=  H(t);
+                &dec($num) if ($i != 7-1);
+               &jz(&label("mw_end")) if ($i != 7-1);
+               }
+       &set_label("mw_end",0);
+       &mov("eax",$c);
+
+       &function_end($name);
+       }
+
+1;
diff --git a/crypto/bn/asm/x86/mul_add.pl b/crypto/bn/asm/x86/mul_add.pl
new file mode 100644 (file)
index 0000000..61830d3
--- /dev/null
@@ -0,0 +1,87 @@
+#!/usr/local/bin/perl
+# x86 assember
+
+sub bn_mul_add_words
+       {
+       local($name)=@_;
+
+       &function_begin($name,"");
+
+       &comment("");
+       $Low="eax";
+       $High="edx";
+       $a="ebx";
+       $w="ebp";
+       $r="edi";
+       $c="esi";
+
+       &xor($c,$c);            # clear carry
+       &mov($r,&wparam(0));    #
+
+       &mov("ecx",&wparam(2)); #
+       &mov($a,&wparam(1));    #
+
+       &and("ecx",0xfffffff8); # num / 8
+       &mov($w,&wparam(3));    #
+
+       &push("ecx");           # Up the stack for a tmp variable
+
+       &jz(&label("maw_finish"));
+
+       &set_label("maw_loop",0);
+
+       &mov(&swtmp(0),"ecx");  #
+
+       for ($i=0; $i<32; $i+=4)
+               {
+               &comment("Round $i");
+
+                &mov("eax",&DWP($i,$a,"",0));  # *a
+               &mul($w);                       # *a * w
+               &add("eax",$c);         # L(t)+= *r
+                &mov($c,&DWP($i,$r,"",0));     # L(t)+= *r
+               &adc("edx",0);                  # H(t)+=carry
+                &add("eax",$c);                # L(t)+=c
+               &adc("edx",0);                  # H(t)+=carry
+                &mov(&DWP($i,$r,"",0),"eax");  # *r= L(t);
+               &mov($c,"edx");                 # c=  H(t);
+               }
+
+       &comment("");
+       &mov("ecx",&swtmp(0));  #
+       &add($a,32);
+       &add($r,32);
+       &sub("ecx",8);
+       &jnz(&label("maw_loop"));
+
+       &set_label("maw_finish",0);
+       &mov("ecx",&wparam(2)); # get num
+       &and("ecx",7);
+       &jnz(&label("maw_finish2"));    # helps branch prediction
+       &jmp(&label("maw_end"));
+
+       &set_label("maw_finish2",1);
+       for ($i=0; $i<7; $i++)
+               {
+               &comment("Tail Round $i");
+                &mov("eax",&DWP($i*4,$a,"",0));# *a
+               &mul($w);                       # *a * w
+               &add("eax",$c);                 # L(t)+=c
+                &mov($c,&DWP($i*4,$r,"",0));   # L(t)+= *r
+               &adc("edx",0);                  # H(t)+=carry
+                &add("eax",$c);
+               &adc("edx",0);                  # H(t)+=carry
+                &dec("ecx") if ($i != 7-1);
+               &mov(&DWP($i*4,$r,"",0),"eax"); # *r= L(t);
+                &mov($c,"edx");                        # c=  H(t);
+               &jz(&label("maw_end")) if ($i != 7-1);
+               }
+       &set_label("maw_end",0);
+       &mov("eax",$c);
+
+       &pop("ecx");    # clear variable from
+
+       &function_end($name);
+       }
+
+1;
diff --git a/crypto/bn/asm/x86/sqr.pl b/crypto/bn/asm/x86/sqr.pl
new file mode 100644 (file)
index 0000000..1f90993
--- /dev/null
@@ -0,0 +1,60 @@
+#!/usr/local/bin/perl
+# x86 assember
+
+sub bn_sqr_words
+       {
+       local($name)=@_;
+
+       &function_begin($name,"");
+
+       &comment("");
+       $r="esi";
+       $a="edi";
+       $num="ebx";
+
+       &mov($r,&wparam(0));    #
+       &mov($a,&wparam(1));    #
+       &mov($num,&wparam(2));  #
+
+       &and($num,0xfffffff8);  # num / 8
+       &jz(&label("sw_finish"));
+
+       &set_label("sw_loop",0);
+       for ($i=0; $i<32; $i+=4)
+               {
+               &comment("Round $i");
+               &mov("eax",&DWP($i,$a,"",0));   # *a
+                # XXX
+               &mul("eax");                    # *a * *a
+               &mov(&DWP($i*2,$r,"",0),"eax"); #
+                &mov(&DWP($i*2+4,$r,"",0),"edx");#
+               }
+
+       &comment("");
+       &add($a,32);
+       &add($r,64);
+       &sub($num,8);
+       &jnz(&label("sw_loop"));
+
+       &set_label("sw_finish",0);
+       &mov($num,&wparam(2));  # get num
+       &and($num,7);
+       &jz(&label("sw_end"));
+
+       for ($i=0; $i<7; $i++)
+               {
+               &comment("Tail Round $i");
+               &mov("eax",&DWP($i*4,$a,"",0)); # *a
+                # XXX
+               &mul("eax");                    # *a * *a
+               &mov(&DWP($i*8,$r,"",0),"eax"); #
+                &dec($num) if ($i != 7-1);
+               &mov(&DWP($i*8+4,$r,"",0),"edx");
+                &jz(&label("sw_end")) if ($i != 7-1);
+               }
+       &set_label("sw_end",0);
+
+       &function_end($name);
+       }
+
+1;
diff --git a/crypto/bn/asm/x86/sub.pl b/crypto/bn/asm/x86/sub.pl
new file mode 100644 (file)
index 0000000..837b0e1
--- /dev/null
@@ -0,0 +1,76 @@
+#!/usr/local/bin/perl
+# x86 assember
+
+sub bn_sub_words
+       {
+       local($name)=@_;
+
+       &function_begin($name,"");
+
+       &comment("");
+       $a="esi";
+       $b="edi";
+       $c="eax";
+       $r="ebx";
+       $tmp1="ecx";
+       $tmp2="edx";
+       $num="ebp";
+
+       &mov($r,&wparam(0));    # get r
+        &mov($a,&wparam(1));   # get a
+       &mov($b,&wparam(2));    # get b
+        &mov($num,&wparam(3)); # get num
+       &xor($c,$c);            # clear carry
+        &and($num,0xfffffff8); # num / 8
+
+       &jz(&label("aw_finish"));
+
+       &set_label("aw_loop",0);
+       for ($i=0; $i<8; $i++)
+               {
+               &comment("Round $i");
+
+               &mov($tmp1,&DWP($i*4,$a,"",0));         # *a
+                &mov($tmp2,&DWP($i*4,$b,"",0));        # *b
+               &sub($tmp1,$c);
+                &mov($c,0);
+               &adc($c,$c);
+                &sub($tmp1,$tmp2);
+               &adc($c,0);
+                &mov(&DWP($i*4,$r,"",0),$tmp1);        # *r
+               }
+
+       &comment("");
+       &add($a,32);
+        &add($b,32);
+       &add($r,32);
+        &sub($num,8);
+       &jnz(&label("aw_loop"));
+
+       &set_label("aw_finish",0);
+       &mov($num,&wparam(3));  # get num
+       &and($num,7);
+        &jz(&label("aw_end"));
+
+       for ($i=0; $i<7; $i++)
+               {
+               &comment("Tail Round $i");
+               &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
+                &mov($tmp2,&DWP($i*4,$b,"",0));# *b
+               &sub($tmp1,$c);
+                &mov($c,0);
+               &adc($c,$c);
+                &sub($tmp1,$tmp2);
+               &adc($c,0);
+                &dec($num) if ($i != 6);
+               &mov(&DWP($i*4,$r,"",0),$tmp1); # *a
+                &jz(&label("aw_end")) if ($i != 6);
+               }
+       &set_label("aw_end",0);
+
+#      &mov("eax",$c);         # $c is "eax"
+
+       &function_end($name);
+       }
+
+1;
index 74a933a8cddbe9a8e80ad9744a7b7b7eb390d360..80a9ed6eef1e5659f057f837968e519927013cf4 100644 (file)
@@ -6,11 +6,11 @@ F_TEXT        SEGMENT  WORD PUBLIC 'CODE'
 F_TEXT ENDS
 _DATA  SEGMENT  WORD PUBLIC 'DATA'
 _DATA  ENDS
-CONST  SEGMENT  WORD PUBLIC 'CONST'
-CONST  ENDS
+_CONST SEGMENT  WORD PUBLIC 'CONST'
+_CONST ENDS
 _BSS   SEGMENT  WORD PUBLIC 'BSS'
 _BSS   ENDS
-DGROUP GROUP   CONST, _BSS, _DATA
+DGROUP GROUP   _CONST, _BSS, _DATA
        ASSUME DS: DGROUP, SS: DGROUP
 F_TEXT      SEGMENT
        ASSUME  CS: F_TEXT
index fc6f9177145d78a1dd91004321496d0d1e7b3ec1..957d71e3b18920c472d498dee62e0f64cefa9725 100644 (file)
@@ -6,11 +6,11 @@ F_TEXT        SEGMENT  WORD USE16 PUBLIC 'CODE'
 F_TEXT ENDS
 _DATA  SEGMENT  WORD USE16 PUBLIC 'DATA'
 _DATA  ENDS
-CONST  SEGMENT  WORD USE16 PUBLIC 'CONST'
-CONST  ENDS
+_CONST SEGMENT  WORD USE16 PUBLIC 'CONST'
+_CONST ENDS
 _BSS   SEGMENT  WORD USE16 PUBLIC 'BSS'
 _BSS   ENDS
-DGROUP GROUP   CONST, _BSS, _DATA
+DGROUP GROUP   _CONST, _BSS, _DATA
        ASSUME DS: DGROUP, SS: DGROUP
 F_TEXT      SEGMENT
        ASSUME  CS: F_TEXT
@@ -89,7 +89,7 @@ $L555:
        mov     bp,WORD PTR [bp+26]     ; load num
        and     bp,3
        dec     bp
-       js      $L547
+       js      $L547m
 
        mov     eax,ecx
        mul     DWORD PTR es:[bx]       ; w* *a
@@ -100,7 +100,7 @@ $L555:
        mov     DWORD PTR ds:[di],eax
        mov     esi,edx
        dec     bp
-       js      $L547                   ; Note that we are now testing for -1
+       js      $L547m                  ; Note that we are now testing for -1
        ;
        mov     eax,ecx
        mul     DWORD PTR es:[bx+4]     ; w* *a
@@ -111,7 +111,7 @@ $L555:
        mov     DWORD PTR ds:[di+4],eax
        mov     esi,edx
        dec     bp
-       js      $L547
+       js      $L547m
        ;
        mov     eax,ecx
        mul     DWORD PTR es:[bx+8]     ; w* *a
@@ -121,7 +121,7 @@ $L555:
        adc     edx,0
        mov     DWORD PTR ds:[di+8],eax
        mov     esi,edx
-$L547:
+$L547m:
        mov     eax,esi
        mov     edx,esi
        shr     edx,16
@@ -315,37 +315,35 @@ _bn_add_words     PROC FAR
 ;      ap = 22
 ;      rp = 18
        xor     esi,esi                 ;c=0;
+       mov     bx,WORD PTR [bp+18]     ; load low r
        mov     si,WORD PTR [bp+22]     ; load a
        mov     es,WORD PTR [bp+24]     ; load a
        mov     di,WORD PTR [bp+26]     ; load b
        mov     ds,WORD PTR [bp+28]     ; load b
 
        mov     dx,WORD PTR [bp+30]     ; load num
-       dec     dx
-       js      $L547
        xor     ecx,ecx
+       dec     dx
+       js      $L547a
 
 $L5477:
-       xor     ebx,ebx
        mov     eax,DWORD PTR es:[si]   ; *a
        add     eax,ecx
-       adc     ebx,0
+       mov     ecx,0
+       adc     ecx,0
        add     si,4                    ; a++
        add     eax,DWORD PTR ds:[di]   ; + *b
-       mov     ecx,ebx
        adc     ecx,0
-       add     di,4
-       mov     bx,WORD PTR [bp+18]
        mov     ds,WORD PTR [bp+20]
+       add     di,4
        mov     DWORD PTR ds:[bx],eax
-       add     bx,4
        mov     ds,WORD PTR [bp+28]
-       mov     WORD PTR [bp+18],bx
+       add     bx,4
        dec     dx
-       js      $L547                   ; Note that we are now testing for -1
+       js      $L547a                  ; Note that we are now testing for -1
        jmp     $L5477
        ;
-$L547:
+$L547a:
        mov     eax,ecx
        mov     edx,ecx
        shr     edx,16
index 7ccc247c41cdab444b4bc2d8b4a8e26d6eac21c1..ba5c9bc97efc98cfc7bde86e6402c0cecf4bf40e 100644 (file)
 #define BN_F_BN_MPI2BN                                  112
 #define BN_F_BN_NEW                                     113
 #define BN_F_BN_RAND                                    114
+#define BN_F_BN_USUB                                    115
 
 /* Reason codes. */
-#define BN_R_BAD_RECIPROCAL                             100
-#define BN_R_CALLED_WITH_EVEN_MODULUS                   101
-#define BN_R_DIV_BY_ZERO                                102
-#define BN_R_ENCODING_ERROR                             103
-#define BN_R_INVALID_LENGTH                             104
-#define BN_R_NOT_INITALISED                             105
-#define BN_R_NO_INVERSE                                         106
+#define BN_R_ARG2_LT_ARG3                               100
+#define BN_R_BAD_RECIPROCAL                             101
+#define BN_R_CALLED_WITH_EVEN_MODULUS                   102
+#define BN_R_DIV_BY_ZERO                                103
+#define BN_R_ENCODING_ERROR                             104
+#define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA               105
+#define BN_R_INVALID_LENGTH                             106
+#define BN_R_NOT_INITALISED                             107
+#define BN_R_NO_INVERSE                                         108
index 66dde285d6425c819fdc33189deca4b259b1a589..2c14a1d58202c39a94d1b89b82ba1d7ea8e714fd 100644 (file)
@@ -77,6 +77,9 @@ extern "C" {
 #define BN_LLONG /* This comment stops Configure mutilating things */
 #endif
 
+#define BN_MUL_COMBA
+#define BN_SQR_COMBA
+#undef BN_RECURSION
 #define RECP_MUL_MOD
 #define MONT_MUL_MOD
 
@@ -105,6 +108,7 @@ extern "C" {
 #undef SIXTEEN_BIT
 #undef EIGHT_BIT
 
+
 /* assuming long is 64bit - this is the DEC Alpha
  * unsigned long long is only 64 bits :-(, don't define
  * BN_LLONG for the DEC Alpha */
@@ -116,17 +120,23 @@ extern "C" {
 #define BN_BYTES       8
 #define BN_BITS2       64
 #define BN_BITS4       32
+#define BN_MASK                (0xffffffffffffffffffffffffffffffffLL)
 #define BN_MASK2       (0xffffffffffffffffL)
 #define BN_MASK2l      (0xffffffffL)
 #define BN_MASK2h      (0xffffffff00000000L)
 #define BN_MASK2h1     (0xffffffff80000000L)
 #define BN_TBIT                (0x8000000000000000L)
-#define BN_DEC_CONV    (10000000000000000000L)
+#define BN_DEC_CONV    (10000000000000000000UL)
 #define BN_DEC_FMT1    "%lu"
 #define BN_DEC_FMT2    "%019lu"
 #define BN_DEC_NUM     19
 #endif
 
+/* This is where the long long data type is 64 bits, but long is 32.
+ * For machines where there are 64bit registers, this is the mode to use.
+ * IRIX, on R4000 and above should use this mode, along with the relevent
+ * assember code :-).  Do NOT define BN_ULLONG.
+ */
 #ifdef SIXTY_FOUR_BIT
 #undef BN_LLONG
 /* #define BN_ULLONG   unsigned long long */
@@ -141,9 +151,9 @@ extern "C" {
 #define BN_MASK2h      (0xffffffff00000000LL)
 #define BN_MASK2h1     (0xffffffff80000000LL)
 #define BN_TBIT                (0x8000000000000000LL)
-#define BN_DEC_CONV    (10000000000000000000L)
-#define BN_DEC_FMT1    "%lu"
-#define BN_DEC_FMT2    "%019lu"
+#define BN_DEC_CONV    (10000000000000000000LL)
+#define BN_DEC_FMT1    "%llu"
+#define BN_DEC_FMT2    "%019llu"
 #define BN_DEC_NUM     19
 #endif
 
@@ -159,6 +169,7 @@ extern "C" {
 #define BN_BYTES       4
 #define BN_BITS2       32
 #define BN_BITS4       16
+#define BN_MASK                (0xffffffffffffffffLL)
 #define BN_MASK2       (0xffffffffL)
 #define BN_MASK2l      (0xffff)
 #define BN_MASK2h1     (0xffff8000L)
@@ -181,6 +192,7 @@ extern "C" {
 #define BN_BYTES       2
 #define BN_BITS2       16
 #define BN_BITS4       8
+#define BN_MASK                (0xffffffff)
 #define BN_MASK2       (0xffff)
 #define BN_MASK2l      (0xff)
 #define BN_MASK2h1     (0xff80)
@@ -203,6 +215,7 @@ extern "C" {
 #define BN_BYTES       1
 #define BN_BITS2       8
 #define BN_BITS4       4
+#define BN_MASK                (0xffff)
 #define BN_MASK2       (0xff)
 #define BN_MASK2l      (0xf)
 #define BN_MASK2h1     (0xf8)
@@ -220,6 +233,12 @@ extern "C" {
 #undef BIGNUM
 #endif
 
+#define BN_FLG_MALLOCED                0x01
+#define BN_FLG_STATIC_DATA     0x02
+#define BN_FLG_FREE            0x8000  /* used for debuging */
+#define BN_set_flags(b,n)      ((b)->flags|=(n))
+#define BN_get_flags(b,n)      ((b)->flags&(n))
+
 typedef struct bignum_st
        {
        BN_ULONG *d;    /* Pointer to an array of 'BN_BITS2' bit chunks. */
@@ -227,6 +246,7 @@ typedef struct bignum_st
        /* The next are internal book keeping for bn_expand. */
        int max;        /* Size of the d array. */
        int neg;        /* one if the number is negative */
+       int flags;
        } BIGNUM;
 
 /* Used for temp variables */
@@ -234,7 +254,8 @@ typedef struct bignum_st
 typedef struct bignum_ctx
        {
        int tos;
-       BIGNUM *bn[BN_CTX_NUM+1];
+       BIGNUM bn[BN_CTX_NUM+1];
+       int flags;
        } BN_CTX;
 
 typedef struct bn_blinding_st
@@ -248,51 +269,69 @@ typedef struct bn_blinding_st
 /* Used for montgomery multiplication */
 typedef struct bn_mont_ctx_st
         {
+       int use_word;   /* 0 for word form, 1 for long form */
         int ri;         /* number of bits in R */
-        BIGNUM *RR;     /* used to convert to montgomery form */
-        BIGNUM *N;      /* The modulus */
-        BIGNUM *Ni;     /* The inverse of N */
+        BIGNUM RR;     /* used to convert to montgomery form */
+        BIGNUM N;      /* The modulus */
+        BIGNUM Ni;     /* The inverse of N */
        BN_ULONG n0;    /* word form of inverse, normally only one of
                         * Ni or n0 is defined */
+       int flags;
         } BN_MONT_CTX;
 
+/* Used for reciprocal division/mod functions
+ * It cannot be shared between threads
+ */
+typedef struct bn_recp_ctx_st
+       {
+       BIGNUM N;       /* the divisor */
+       BIGNUM Nr;      /* the reciprocal */
+       int num_bits;
+       int shift;
+       int flags;
+       } BN_RECP_CTX;
+
 #define BN_to_montgomery(r,a,mont,ctx) BN_mod_mul_montgomery(\
-       r,a,(mont)->RR,(mont),ctx)
+       r,a,&((mont)->RR),(mont),ctx)
 
 #define BN_prime_checks                (5)
 
 #define BN_num_bytes(a)        ((BN_num_bits(a)+7)/8)
 #define BN_is_word(a,w)        (((a)->top == 1) && ((a)->d[0] == (BN_ULONG)(w)))
-#define BN_is_zero(a)  (((a)->top <= 1) && ((a)->d[0] == (BN_ULONG)0))
+#define BN_is_zero(a)  (((a)->top == 0) || BN_is_word(a,0))
 #define BN_is_one(a)   (BN_is_word((a),1))
-#define BN_is_odd(a)   ((a)->d[0] & 1)
+#define BN_is_odd(a)   (((a)->top > 0) && ((a)->d[0] & 1))
 #define BN_one(a)      (BN_set_word((a),1))
 #define BN_zero(a)     (BN_set_word((a),0))
 
-#define BN_ascii2bn(a) BN_hex2bn(a)
-#define BN_bn2ascii(a) BN_bn2hex(a)
-
-#define bn_fix_top(a) \
-       { \
-       BN_ULONG *fix_top_l; \
-       for (fix_top_l= &((a)->d[(a)->top-1]); (a)->top > 0; (a)->top--) \
-               if (*(fix_top_l--)) break; \
-       }
+/*#define BN_ascii2bn(a)       BN_hex2bn(a) */
+/*#define BN_bn2ascii(a)       BN_bn2hex(a) */
 
-#define bn_expand(n,b) ((((b)/BN_BITS2) <= (n)->max)?\
-       (n):bn_expand2((n),(b)/BN_BITS2))
+#define bn_expand(n,b) ((((((b+BN_BITS2-1))/BN_BITS2)) <= (n)->max)?\
+       (n):bn_expand2((n),(b)/BN_BITS2+1))
 #define bn_wexpand(n,b) (((b) <= (n)->max)?(n):bn_expand2((n),(b)))
 
+#define bn_fix_top(a) \
+        { \
+        BN_ULONG *ftl; \
+       if ((a)->top > 0) \
+               { \
+               for (ftl= &((a)->d[(a)->top-1]); (a)->top > 0; (a)->top--) \
+               if (*(ftl--)) break; \
+               } \
+       }
 
 #ifndef NOPROTO
 BIGNUM *BN_value_one(void);
 char * BN_options(void);
 BN_CTX *BN_CTX_new(void);
+void   BN_CTX_init(BN_CTX *c);
 void   BN_CTX_free(BN_CTX *c);
 int     BN_rand(BIGNUM *rnd, int bits, int top,int bottom);
 int    BN_num_bits(BIGNUM *a);
 int    BN_num_bits_word(BN_ULONG);
 BIGNUM *BN_new(void);
+void   BN_init(BIGNUM *);
 void   BN_clear_free(BIGNUM *a);
 BIGNUM *BN_copy(BIGNUM *a, BIGNUM *b);
 BIGNUM *BN_bin2bn(unsigned char *s,int len,BIGNUM *ret);
@@ -300,20 +339,20 @@ int       BN_bn2bin(BIGNUM *a, unsigned char *to);
 BIGNUM *BN_mpi2bn(unsigned char *s,int len,BIGNUM *ret);
 int    BN_bn2mpi(BIGNUM *a, unsigned char *to);
 int    BN_sub(BIGNUM *r, BIGNUM *a, BIGNUM *b);
-void   bn_qsub(BIGNUM *r, BIGNUM *a, BIGNUM *b);
-void   bn_qadd(BIGNUM *r, BIGNUM *a, BIGNUM *b);
+int    BN_usub(BIGNUM *r, BIGNUM *a, BIGNUM *b);
+int    BN_uadd(BIGNUM *r, BIGNUM *a, BIGNUM *b);
 int    BN_add(BIGNUM *r, BIGNUM *a, BIGNUM *b);
 int    BN_mod(BIGNUM *rem, BIGNUM *m, BIGNUM *d, BN_CTX *ctx);
 int    BN_div(BIGNUM *dv, BIGNUM *rem, BIGNUM *m, BIGNUM *d, BN_CTX *ctx);
-int    BN_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b);
+int    BN_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b,BN_CTX *ctx);
 int    BN_sqr(BIGNUM *r, BIGNUM *a,BN_CTX *ctx);
-BN_ULONG BN_mod_word(BIGNUM *a, unsigned long w);
-BN_ULONG BN_div_word(BIGNUM *a, unsigned long w);
-int    BN_mul_word(BIGNUM *a, unsigned long w);
-int    BN_add_word(BIGNUM *a, unsigned long w);
-int    BN_sub_word(BIGNUM *a, unsigned long w);
-int    BN_set_word(BIGNUM *a, unsigned long w);
-unsigned long BN_get_word(BIGNUM *a);
+BN_ULONG BN_mod_word(BIGNUM *a, BN_ULONG w);
+BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w);
+int    BN_mul_word(BIGNUM *a, BN_ULONG w);
+int    BN_add_word(BIGNUM *a, BN_ULONG w);
+int    BN_sub_word(BIGNUM *a, BN_ULONG w);
+int    BN_set_word(BIGNUM *a, BN_ULONG w);
+BN_ULONG BN_get_word(BIGNUM *a);
 int    BN_cmp(BIGNUM *a, BIGNUM *b);
 void   BN_free(BIGNUM *a);
 int    BN_is_bit_set(BIGNUM *a, int n);
@@ -323,12 +362,11 @@ int       BN_exp(BIGNUM *r, BIGNUM *a, BIGNUM *p,BN_CTX *ctx);
 int    BN_mod_exp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BIGNUM *m,BN_CTX *ctx);
 int    BN_mod_exp_mont(BIGNUM *r, BIGNUM *a, BIGNUM *p, BIGNUM *m,BN_CTX *ctx,
                BN_MONT_CTX *m_ctx);
-int    BN_mod_exp_recp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BIGNUM *m,BN_CTX *ctx);
+int    BN_mod_exp2_mont(BIGNUM *r, BIGNUM *a1, BIGNUM *p1,BIGNUM *a2,
+               BIGNUM *p2,BIGNUM *m,BN_CTX *ctx,BN_MONT_CTX *m_ctx);
 int    BN_mod_exp_simple(BIGNUM *r, BIGNUM *a, BIGNUM *p,
        BIGNUM *m,BN_CTX *ctx);
 int    BN_mask_bits(BIGNUM *a,int n);
-int    BN_mod_mul_reciprocal(BIGNUM *r, BIGNUM *x, BIGNUM *y, BIGNUM *m, 
-       BIGNUM *i, int nb, BN_CTX *ctx);
 int    BN_mod_mul(BIGNUM *ret, BIGNUM *a, BIGNUM *b, BIGNUM *m,
        BN_CTX *ctx);
 #ifndef WIN16
@@ -339,7 +377,7 @@ int BN_print(BIO *fp, BIGNUM *a);
 #else
 int    BN_print(char *fp, BIGNUM *a);
 #endif
-int    BN_reciprocal(BIGNUM *r, BIGNUM *m, BN_CTX *ctx);
+int    BN_reciprocal(BIGNUM *r, BIGNUM *m, int len, BN_CTX *ctx);
 int    BN_rshift(BIGNUM *r, BIGNUM *a, int n);
 int    BN_rshift1(BIGNUM *r, BIGNUM *a);
 void   BN_clear(BIGNUM *a);
@@ -353,8 +391,8 @@ char *      BN_bn2dec(BIGNUM *a);
 int    BN_hex2bn(BIGNUM **a,char *str);
 int    BN_dec2bn(BIGNUM **a,char *str);
 int    BN_gcd(BIGNUM *r,BIGNUM *in_a,BIGNUM *in_b,BN_CTX *ctx);
-BIGNUM *BN_mod_inverse(BIGNUM *a, BIGNUM *n,BN_CTX *ctx);
-BIGNUM *BN_generate_prime(int bits,int strong,BIGNUM *add,
+BIGNUM *BN_mod_inverse(BIGNUM *ret,BIGNUM *a, BIGNUM *n,BN_CTX *ctx);
+BIGNUM *BN_generate_prime(BIGNUM *ret,int bits,int strong,BIGNUM *add,
                BIGNUM *rem,void (*callback)(int,int,char *),char *cb_arg);
 int    BN_is_prime(BIGNUM *p,int nchecks,void (*callback)(int,int,char *),
                BN_CTX *ctx,char *cb_arg);
@@ -363,15 +401,18 @@ void      ERR_load_BN_strings(void );
 BN_ULONG bn_mul_add_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w);
 BN_ULONG bn_mul_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w);
 void     bn_sqr_words(BN_ULONG *rp, BN_ULONG *ap, int num);
-BN_ULONG bn_div64(BN_ULONG h, BN_ULONG l, BN_ULONG d);
+BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d);
 BN_ULONG bn_add_words(BN_ULONG *rp, BN_ULONG *ap, BN_ULONG *bp,int num);
+BN_ULONG bn_sub_words(BN_ULONG *rp, BN_ULONG *ap, BN_ULONG *bp,int num);
 
 BN_MONT_CTX *BN_MONT_CTX_new(void );
+void BN_MONT_CTX_init(BN_MONT_CTX *ctx);
 int BN_mod_mul_montgomery(BIGNUM *r,BIGNUM *a,BIGNUM *b,BN_MONT_CTX *mont,
        BN_CTX *ctx);
 int BN_from_montgomery(BIGNUM *r,BIGNUM *a,BN_MONT_CTX *mont,BN_CTX *ctx);
 void BN_MONT_CTX_free(BN_MONT_CTX *mont);
 int BN_MONT_CTX_set(BN_MONT_CTX *mont,BIGNUM *modulus,BN_CTX *ctx);
+BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to,BN_MONT_CTX *from);
 
 BN_BLINDING *BN_BLINDING_new(BIGNUM *A,BIGNUM *Ai,BIGNUM *mod);
 void BN_BLINDING_free(BN_BLINDING *b);
@@ -379,16 +420,45 @@ int BN_BLINDING_update(BN_BLINDING *b,BN_CTX *ctx);
 int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *r, BN_CTX *ctx);
 int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx);
 
+void BN_set_params(int mul,int high,int low,int mont);
+int BN_get_params(int which); /* 0, mul, 1 high, 2 low, 3 mont */
+
+void bn_mul_normal(BN_ULONG *r,BN_ULONG *a,int na,BN_ULONG *b,int nb);
+void bn_mul_comba8(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b);
+void bn_mul_comba4(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b);
+void bn_sqr_normal(BN_ULONG *r, BN_ULONG *a, int n, BN_ULONG *tmp);
+void bn_sqr_comba8(BN_ULONG *r,BN_ULONG *a);
+void bn_sqr_comba4(BN_ULONG *r,BN_ULONG *a);
+int bn_cmp_words(BN_ULONG *a,BN_ULONG *b,int n);
+void bn_mul_recursive(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b,int n2,BN_ULONG *t);
+void bn_mul_part_recursive(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b,
+       int tn, int n,BN_ULONG *t);
+void bn_sqr_recursive(BN_ULONG *r,BN_ULONG *a, int n2, BN_ULONG *t);
+void bn_mul_low_normal(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b, int n);
+
+void   BN_RECP_CTX_init(BN_RECP_CTX *recp);
+BN_RECP_CTX *BN_RECP_CTX_new(void);
+void   BN_RECP_CTX_free(BN_RECP_CTX *recp);
+int    BN_RECP_CTX_set(BN_RECP_CTX *recp,BIGNUM *rdiv,BN_CTX *ctx);
+int    BN_mod_mul_reciprocal(BIGNUM *r, BIGNUM *x, BIGNUM *y,
+               BN_RECP_CTX *recp,BN_CTX *ctx);
+int    BN_mod_exp_recp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BIGNUM *m,BN_CTX *ctx);
+int    BN_div_recp(BIGNUM *dv, BIGNUM *rem, BIGNUM *m,
+               BN_RECP_CTX *recp, BN_CTX *ctx);
+
+
 #else
 
 BIGNUM *BN_value_one();
 char * BN_options();
 BN_CTX *BN_CTX_new();
+void   BN_CTX_init();
 void   BN_CTX_free();
 int     BN_rand();
 int    BN_num_bits();
 int    BN_num_bits_word();
 BIGNUM *BN_new();
+void   BN_init();
 void   BN_clear_free();
 BIGNUM *BN_copy();
 BIGNUM *BN_bin2bn();
@@ -396,8 +466,8 @@ int BN_bn2bin();
 BIGNUM *BN_mpi2bn();
 int    BN_bn2mpi();
 int    BN_sub();
-void   bn_qsub();
-void   bn_qadd();
+int    BN_usub();
+int    BN_uadd();
 int    BN_add();
 int    BN_mod();
 int    BN_div();
@@ -449,12 +519,14 @@ void      ERR_load_BN_strings();
 BN_ULONG bn_mul_add_words();
 BN_ULONG bn_mul_words();
 void     bn_sqr_words();
-BN_ULONG bn_div64();
+BN_ULONG bn_div_words();
 BN_ULONG bn_add_words();
+BN_ULONG bn_sub_words();
 
 int BN_mod_mul_montgomery();
 int BN_from_montgomery();
 BN_MONT_CTX *BN_MONT_CTX_new();
+void BN_MONT_CTX_init();
 void BN_MONT_CTX_free();
 int BN_MONT_CTX_set();
 
@@ -464,6 +536,26 @@ int BN_BLINDING_update();
 int BN_BLINDING_convert();
 int BN_BLINDING_invert();
 
+void bn_mul_normal();
+void bn_mul_comba8();
+void bn_mul_comba4();
+void bn_sqr_normal();
+void bn_sqr_comba8();
+void bn_sqr_comba4();
+int bn_cmp_words();
+void bn_mul_recursive();
+void bn_mul_part_recursive();
+void bn_sqr_recursive();
+void bn_mul_low_normal();
+
+void   BN_RECP_CTX_init();
+BN_RECP_CTX *BN_RECP_CTX_new();
+void   BN_RECP_CTX_free();
+int    BN_RECP_CTX_set();
+int    BN_mod_mul_reciprocal();
+int    BN_mod_exp_recp();
+int    BN_div_recp();
+
 #endif
 
 /* BEGIN ERROR CODES */
@@ -485,15 +577,18 @@ int BN_BLINDING_invert();
 #define BN_F_BN_MPI2BN                                  112
 #define BN_F_BN_NEW                                     113
 #define BN_F_BN_RAND                                    114
+#define BN_F_BN_USUB                                    115
 
 /* Reason codes. */
-#define BN_R_BAD_RECIPROCAL                             100
-#define BN_R_CALLED_WITH_EVEN_MODULUS                   101
-#define BN_R_DIV_BY_ZERO                                102
-#define BN_R_ENCODING_ERROR                             103
-#define BN_R_INVALID_LENGTH                             104
-#define BN_R_NOT_INITALISED                             105
-#define BN_R_NO_INVERSE                                         106
+#define BN_R_ARG2_LT_ARG3                               100
+#define BN_R_BAD_RECIPROCAL                             101
+#define BN_R_CALLED_WITH_EVEN_MODULUS                   102
+#define BN_R_DIV_BY_ZERO                                103
+#define BN_R_ENCODING_ERROR                             104
+#define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA               105
+#define BN_R_INVALID_LENGTH                             106
+#define BN_R_NOT_INITALISED                             107
+#define BN_R_NO_INVERSE                                         108
  
 #ifdef  __cplusplus
 }
diff --git a/crypto/bn/bn.mul b/crypto/bn/bn.mul
new file mode 100644 (file)
index 0000000..9728870
--- /dev/null
@@ -0,0 +1,19 @@
+We need
+
+* bn_mul_comba8
+* bn_mul_comba4
+* bn_mul_normal
+* bn_mul_recursive
+
+* bn_sqr_comba8
+* bn_sqr_comba4
+bn_sqr_normal -> BN_sqr
+* bn_sqr_recursive
+
+* bn_mul_low_recursive
+* bn_mul_low_normal
+* bn_mul_high
+
+* bn_mul_part_recursive        # symetric but not power of 2
+
+bn_mul_asymetric_recursive # uneven, but do the chop up.
index 66dde285d6425c819fdc33189deca4b259b1a589..d8904d7efacd4d0cc0974cfa1fdd8ae098757e67 100644 (file)
@@ -77,6 +77,9 @@ extern "C" {
 #define BN_LLONG /* This comment stops Configure mutilating things */
 #endif
 
+#define BN_MUL_COMBA
+#define BN_SQR_COMBA
+#define BN_RECURSION
 #define RECP_MUL_MOD
 #define MONT_MUL_MOD
 
@@ -105,6 +108,7 @@ extern "C" {
 #undef SIXTEEN_BIT
 #undef EIGHT_BIT
 
+
 /* assuming long is 64bit - this is the DEC Alpha
  * unsigned long long is only 64 bits :-(, don't define
  * BN_LLONG for the DEC Alpha */
@@ -116,17 +120,23 @@ extern "C" {
 #define BN_BYTES       8
 #define BN_BITS2       64
 #define BN_BITS4       32
+#define BN_MASK                (0xffffffffffffffffffffffffffffffffLL)
 #define BN_MASK2       (0xffffffffffffffffL)
 #define BN_MASK2l      (0xffffffffL)
 #define BN_MASK2h      (0xffffffff00000000L)
 #define BN_MASK2h1     (0xffffffff80000000L)
 #define BN_TBIT                (0x8000000000000000L)
-#define BN_DEC_CONV    (10000000000000000000L)
+#define BN_DEC_CONV    (10000000000000000000UL)
 #define BN_DEC_FMT1    "%lu"
 #define BN_DEC_FMT2    "%019lu"
 #define BN_DEC_NUM     19
 #endif
 
+/* This is where the long long data type is 64 bits, but long is 32.
+ * For machines where there are 64bit registers, this is the mode to use.
+ * IRIX, on R4000 and above should use this mode, along with the relevent
+ * assember code :-).  Do NOT define BN_ULLONG.
+ */
 #ifdef SIXTY_FOUR_BIT
 #undef BN_LLONG
 /* #define BN_ULLONG   unsigned long long */
@@ -141,9 +151,9 @@ extern "C" {
 #define BN_MASK2h      (0xffffffff00000000LL)
 #define BN_MASK2h1     (0xffffffff80000000LL)
 #define BN_TBIT                (0x8000000000000000LL)
-#define BN_DEC_CONV    (10000000000000000000L)
-#define BN_DEC_FMT1    "%lu"
-#define BN_DEC_FMT2    "%019lu"
+#define BN_DEC_CONV    (10000000000000000000LL)
+#define BN_DEC_FMT1    "%llu"
+#define BN_DEC_FMT2    "%019llu"
 #define BN_DEC_NUM     19
 #endif
 
@@ -159,6 +169,7 @@ extern "C" {
 #define BN_BYTES       4
 #define BN_BITS2       32
 #define BN_BITS4       16
+#define BN_MASK                (0xffffffffffffffffLL)
 #define BN_MASK2       (0xffffffffL)
 #define BN_MASK2l      (0xffff)
 #define BN_MASK2h1     (0xffff8000L)
@@ -181,6 +192,7 @@ extern "C" {
 #define BN_BYTES       2
 #define BN_BITS2       16
 #define BN_BITS4       8
+#define BN_MASK                (0xffffffff)
 #define BN_MASK2       (0xffff)
 #define BN_MASK2l      (0xff)
 #define BN_MASK2h1     (0xff80)
@@ -203,6 +215,7 @@ extern "C" {
 #define BN_BYTES       1
 #define BN_BITS2       8
 #define BN_BITS4       4
+#define BN_MASK                (0xffff)
 #define BN_MASK2       (0xff)
 #define BN_MASK2l      (0xf)
 #define BN_MASK2h1     (0xf8)
@@ -220,6 +233,12 @@ extern "C" {
 #undef BIGNUM
 #endif
 
+#define BN_FLG_MALLOCED                0x01
+#define BN_FLG_STATIC_DATA     0x02
+#define BN_FLG_FREE            0x8000  /* used for debuging */
+#define BN_set_flags(b,n)      ((b)->flags|=(n))
+#define BN_get_flags(b,n)      ((b)->flags&(n))
+
 typedef struct bignum_st
        {
        BN_ULONG *d;    /* Pointer to an array of 'BN_BITS2' bit chunks. */
@@ -227,6 +246,7 @@ typedef struct bignum_st
        /* The next are internal book keeping for bn_expand. */
        int max;        /* Size of the d array. */
        int neg;        /* one if the number is negative */
+       int flags;
        } BIGNUM;
 
 /* Used for temp variables */
@@ -234,7 +254,8 @@ typedef struct bignum_st
 typedef struct bignum_ctx
        {
        int tos;
-       BIGNUM *bn[BN_CTX_NUM+1];
+       BIGNUM bn[BN_CTX_NUM+1];
+       int flags;
        } BN_CTX;
 
 typedef struct bn_blinding_st
@@ -248,51 +269,69 @@ typedef struct bn_blinding_st
 /* Used for montgomery multiplication */
 typedef struct bn_mont_ctx_st
         {
+       int use_word;   /* 0 for word form, 1 for long form */
         int ri;         /* number of bits in R */
-        BIGNUM *RR;     /* used to convert to montgomery form */
-        BIGNUM *N;      /* The modulus */
-        BIGNUM *Ni;     /* The inverse of N */
+        BIGNUM RR;     /* used to convert to montgomery form */
+        BIGNUM N;      /* The modulus */
+        BIGNUM Ni;     /* The inverse of N */
        BN_ULONG n0;    /* word form of inverse, normally only one of
                         * Ni or n0 is defined */
+       int flags;
         } BN_MONT_CTX;
 
+/* Used for reciprocal division/mod functions
+ * It cannot be shared between threads
+ */
+typedef struct bn_recp_ctx_st
+       {
+       BIGNUM N;       /* the divisor */
+       BIGNUM Nr;      /* the reciprocal */
+       int num_bits;
+       int shift;
+       int flags;
+       } BN_RECP_CTX;
+
 #define BN_to_montgomery(r,a,mont,ctx) BN_mod_mul_montgomery(\
-       r,a,(mont)->RR,(mont),ctx)
+       r,a,&((mont)->RR),(mont),ctx)
 
 #define BN_prime_checks                (5)
 
 #define BN_num_bytes(a)        ((BN_num_bits(a)+7)/8)
 #define BN_is_word(a,w)        (((a)->top == 1) && ((a)->d[0] == (BN_ULONG)(w)))
-#define BN_is_zero(a)  (((a)->top <= 1) && ((a)->d[0] == (BN_ULONG)0))
+#define BN_is_zero(a)  (((a)->top == 0) || BN_is_word(a,0))
 #define BN_is_one(a)   (BN_is_word((a),1))
-#define BN_is_odd(a)   ((a)->d[0] & 1)
+#define BN_is_odd(a)   (((a)->top > 0) && ((a)->d[0] & 1))
 #define BN_one(a)      (BN_set_word((a),1))
 #define BN_zero(a)     (BN_set_word((a),0))
 
-#define BN_ascii2bn(a) BN_hex2bn(a)
-#define BN_bn2ascii(a) BN_bn2hex(a)
-
-#define bn_fix_top(a) \
-       { \
-       BN_ULONG *fix_top_l; \
-       for (fix_top_l= &((a)->d[(a)->top-1]); (a)->top > 0; (a)->top--) \
-               if (*(fix_top_l--)) break; \
-       }
+/*#define BN_ascii2bn(a)       BN_hex2bn(a) */
+/*#define BN_bn2ascii(a)       BN_bn2hex(a) */
 
-#define bn_expand(n,b) ((((b)/BN_BITS2) <= (n)->max)?\
-       (n):bn_expand2((n),(b)/BN_BITS2))
+#define bn_expand(n,b) ((((((b+BN_BITS2-1))/BN_BITS2)) <= (n)->max)?\
+       (n):bn_expand2((n),(b)/BN_BITS2+1))
 #define bn_wexpand(n,b) (((b) <= (n)->max)?(n):bn_expand2((n),(b)))
 
+#define bn_fix_top(a) \
+        { \
+        BN_ULONG *ftl; \
+       if ((a)->top > 0) \
+               { \
+               for (ftl= &((a)->d[(a)->top-1]); (a)->top > 0; (a)->top--) \
+               if (*(ftl--)) break; \
+               } \
+       }
 
 #ifndef NOPROTO
 BIGNUM *BN_value_one(void);
 char * BN_options(void);
 BN_CTX *BN_CTX_new(void);
+void   BN_CTX_init(BN_CTX *c);
 void   BN_CTX_free(BN_CTX *c);
 int     BN_rand(BIGNUM *rnd, int bits, int top,int bottom);
 int    BN_num_bits(BIGNUM *a);
 int    BN_num_bits_word(BN_ULONG);
 BIGNUM *BN_new(void);
+void   BN_init(BIGNUM *);
 void   BN_clear_free(BIGNUM *a);
 BIGNUM *BN_copy(BIGNUM *a, BIGNUM *b);
 BIGNUM *BN_bin2bn(unsigned char *s,int len,BIGNUM *ret);
@@ -300,20 +339,20 @@ int       BN_bn2bin(BIGNUM *a, unsigned char *to);
 BIGNUM *BN_mpi2bn(unsigned char *s,int len,BIGNUM *ret);
 int    BN_bn2mpi(BIGNUM *a, unsigned char *to);
 int    BN_sub(BIGNUM *r, BIGNUM *a, BIGNUM *b);
-void   bn_qsub(BIGNUM *r, BIGNUM *a, BIGNUM *b);
-void   bn_qadd(BIGNUM *r, BIGNUM *a, BIGNUM *b);
+int    BN_usub(BIGNUM *r, BIGNUM *a, BIGNUM *b);
+int    BN_uadd(BIGNUM *r, BIGNUM *a, BIGNUM *b);
 int    BN_add(BIGNUM *r, BIGNUM *a, BIGNUM *b);
 int    BN_mod(BIGNUM *rem, BIGNUM *m, BIGNUM *d, BN_CTX *ctx);
 int    BN_div(BIGNUM *dv, BIGNUM *rem, BIGNUM *m, BIGNUM *d, BN_CTX *ctx);
-int    BN_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b);
+int    BN_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b,BN_CTX *ctx);
 int    BN_sqr(BIGNUM *r, BIGNUM *a,BN_CTX *ctx);
-BN_ULONG BN_mod_word(BIGNUM *a, unsigned long w);
-BN_ULONG BN_div_word(BIGNUM *a, unsigned long w);
-int    BN_mul_word(BIGNUM *a, unsigned long w);
-int    BN_add_word(BIGNUM *a, unsigned long w);
-int    BN_sub_word(BIGNUM *a, unsigned long w);
-int    BN_set_word(BIGNUM *a, unsigned long w);
-unsigned long BN_get_word(BIGNUM *a);
+BN_ULONG BN_mod_word(BIGNUM *a, BN_ULONG w);
+BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w);
+int    BN_mul_word(BIGNUM *a, BN_ULONG w);
+int    BN_add_word(BIGNUM *a, BN_ULONG w);
+int    BN_sub_word(BIGNUM *a, BN_ULONG w);
+int    BN_set_word(BIGNUM *a, BN_ULONG w);
+BN_ULONG BN_get_word(BIGNUM *a);
 int    BN_cmp(BIGNUM *a, BIGNUM *b);
 void   BN_free(BIGNUM *a);
 int    BN_is_bit_set(BIGNUM *a, int n);
@@ -323,12 +362,11 @@ int       BN_exp(BIGNUM *r, BIGNUM *a, BIGNUM *p,BN_CTX *ctx);
 int    BN_mod_exp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BIGNUM *m,BN_CTX *ctx);
 int    BN_mod_exp_mont(BIGNUM *r, BIGNUM *a, BIGNUM *p, BIGNUM *m,BN_CTX *ctx,
                BN_MONT_CTX *m_ctx);
-int    BN_mod_exp_recp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BIGNUM *m,BN_CTX *ctx);
+int    BN_mod_exp2_mont(BIGNUM *r, BIGNUM *a1, BIGNUM *p1,BIGNUM *a2,
+               BIGNUM *p2,BIGNUM *m,BN_CTX *ctx,BN_MONT_CTX *m_ctx);
 int    BN_mod_exp_simple(BIGNUM *r, BIGNUM *a, BIGNUM *p,
        BIGNUM *m,BN_CTX *ctx);
 int    BN_mask_bits(BIGNUM *a,int n);
-int    BN_mod_mul_reciprocal(BIGNUM *r, BIGNUM *x, BIGNUM *y, BIGNUM *m, 
-       BIGNUM *i, int nb, BN_CTX *ctx);
 int    BN_mod_mul(BIGNUM *ret, BIGNUM *a, BIGNUM *b, BIGNUM *m,
        BN_CTX *ctx);
 #ifndef WIN16
@@ -339,7 +377,7 @@ int BN_print(BIO *fp, BIGNUM *a);
 #else
 int    BN_print(char *fp, BIGNUM *a);
 #endif
-int    BN_reciprocal(BIGNUM *r, BIGNUM *m, BN_CTX *ctx);
+int    BN_reciprocal(BIGNUM *r, BIGNUM *m, int len, BN_CTX *ctx);
 int    BN_rshift(BIGNUM *r, BIGNUM *a, int n);
 int    BN_rshift1(BIGNUM *r, BIGNUM *a);
 void   BN_clear(BIGNUM *a);
@@ -353,8 +391,8 @@ char *      BN_bn2dec(BIGNUM *a);
 int    BN_hex2bn(BIGNUM **a,char *str);
 int    BN_dec2bn(BIGNUM **a,char *str);
 int    BN_gcd(BIGNUM *r,BIGNUM *in_a,BIGNUM *in_b,BN_CTX *ctx);
-BIGNUM *BN_mod_inverse(BIGNUM *a, BIGNUM *n,BN_CTX *ctx);
-BIGNUM *BN_generate_prime(int bits,int strong,BIGNUM *add,
+BIGNUM *BN_mod_inverse(BIGNUM *ret,BIGNUM *a, BIGNUM *n,BN_CTX *ctx);
+BIGNUM *BN_generate_prime(BIGNUM *ret,int bits,int strong,BIGNUM *add,
                BIGNUM *rem,void (*callback)(int,int,char *),char *cb_arg);
 int    BN_is_prime(BIGNUM *p,int nchecks,void (*callback)(int,int,char *),
                BN_CTX *ctx,char *cb_arg);
@@ -363,15 +401,18 @@ void      ERR_load_BN_strings(void );
 BN_ULONG bn_mul_add_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w);
 BN_ULONG bn_mul_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w);
 void     bn_sqr_words(BN_ULONG *rp, BN_ULONG *ap, int num);
-BN_ULONG bn_div64(BN_ULONG h, BN_ULONG l, BN_ULONG d);
+BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d);
 BN_ULONG bn_add_words(BN_ULONG *rp, BN_ULONG *ap, BN_ULONG *bp,int num);
+BN_ULONG bn_sub_words(BN_ULONG *rp, BN_ULONG *ap, BN_ULONG *bp,int num);
 
 BN_MONT_CTX *BN_MONT_CTX_new(void );
+void BN_MONT_CTX_init(BN_MONT_CTX *ctx);
 int BN_mod_mul_montgomery(BIGNUM *r,BIGNUM *a,BIGNUM *b,BN_MONT_CTX *mont,
        BN_CTX *ctx);
 int BN_from_montgomery(BIGNUM *r,BIGNUM *a,BN_MONT_CTX *mont,BN_CTX *ctx);
 void BN_MONT_CTX_free(BN_MONT_CTX *mont);
 int BN_MONT_CTX_set(BN_MONT_CTX *mont,BIGNUM *modulus,BN_CTX *ctx);
+BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to,BN_MONT_CTX *from);
 
 BN_BLINDING *BN_BLINDING_new(BIGNUM *A,BIGNUM *Ai,BIGNUM *mod);
 void BN_BLINDING_free(BN_BLINDING *b);
@@ -379,16 +420,45 @@ int BN_BLINDING_update(BN_BLINDING *b,BN_CTX *ctx);
 int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *r, BN_CTX *ctx);
 int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx);
 
+void BN_set_params(int mul,int high,int low,int mont);
+int BN_get_params(int which); /* 0, mul, 1 high, 2 low, 3 mont */
+
+void bn_mul_normal(BN_ULONG *r,BN_ULONG *a,int na,BN_ULONG *b,int nb);
+void bn_mul_comba8(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b);
+void bn_mul_comba4(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b);
+void bn_sqr_normal(BN_ULONG *r, BN_ULONG *a, int n, BN_ULONG *tmp);
+void bn_sqr_comba8(BN_ULONG *r,BN_ULONG *a);
+void bn_sqr_comba4(BN_ULONG *r,BN_ULONG *a);
+int bn_cmp_words(BN_ULONG *a,BN_ULONG *b,int n);
+void bn_mul_recursive(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b,int n2,BN_ULONG *t);
+void bn_mul_part_recursive(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b,
+       int tn, int n,BN_ULONG *t);
+void bn_sqr_recursive(BN_ULONG *r,BN_ULONG *a, int n2, BN_ULONG *t);
+void bn_mul_low_normal(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b, int n);
+
+void   BN_RECP_CTX_init(BN_RECP_CTX *recp);
+BN_RECP_CTX *BN_RECP_CTX_new(void);
+void   BN_RECP_CTX_free(BN_RECP_CTX *recp);
+int    BN_RECP_CTX_set(BN_RECP_CTX *recp,BIGNUM *rdiv,BN_CTX *ctx);
+int    BN_mod_mul_reciprocal(BIGNUM *r, BIGNUM *x, BIGNUM *y,
+               BN_RECP_CTX *recp,BN_CTX *ctx);
+int    BN_mod_exp_recp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BIGNUM *m,BN_CTX *ctx);
+int    BN_div_recp(BIGNUM *dv, BIGNUM *rem, BIGNUM *m,
+               BN_RECP_CTX *recp, BN_CTX *ctx);
+
+
 #else
 
 BIGNUM *BN_value_one();
 char * BN_options();
 BN_CTX *BN_CTX_new();
+void   BN_CTX_init();
 void   BN_CTX_free();
 int     BN_rand();
 int    BN_num_bits();
 int    BN_num_bits_word();
 BIGNUM *BN_new();
+void   BN_init();
 void   BN_clear_free();
 BIGNUM *BN_copy();
 BIGNUM *BN_bin2bn();
@@ -396,8 +466,8 @@ int BN_bn2bin();
 BIGNUM *BN_mpi2bn();
 int    BN_bn2mpi();
 int    BN_sub();
-void   bn_qsub();
-void   bn_qadd();
+int    BN_usub();
+int    BN_uadd();
 int    BN_add();
 int    BN_mod();
 int    BN_div();
@@ -449,12 +519,14 @@ void      ERR_load_BN_strings();
 BN_ULONG bn_mul_add_words();
 BN_ULONG bn_mul_words();
 void     bn_sqr_words();
-BN_ULONG bn_div64();
+BN_ULONG bn_div_words();
 BN_ULONG bn_add_words();
+BN_ULONG bn_sub_words();
 
 int BN_mod_mul_montgomery();
 int BN_from_montgomery();
 BN_MONT_CTX *BN_MONT_CTX_new();
+void BN_MONT_CTX_init();
 void BN_MONT_CTX_free();
 int BN_MONT_CTX_set();
 
@@ -464,6 +536,26 @@ int BN_BLINDING_update();
 int BN_BLINDING_convert();
 int BN_BLINDING_invert();
 
+void bn_mul_normal();
+void bn_mul_comba8();
+void bn_mul_comba4();
+void bn_sqr_normal();
+void bn_sqr_comba8();
+void bn_sqr_comba4();
+int bn_cmp_words();
+void bn_mul_recursive();
+void bn_mul_part_recursive();
+void bn_sqr_recursive();
+void bn_mul_low_normal();
+
+void   BN_RECP_CTX_init();
+BN_RECP_CTX *BN_RECP_CTX_new();
+void   BN_RECP_CTX_free();
+int    BN_RECP_CTX_set();
+int    BN_mod_mul_reciprocal();
+int    BN_mod_exp_recp();
+int    BN_div_recp();
+
 #endif
 
 /* BEGIN ERROR CODES */
@@ -485,15 +577,18 @@ int BN_BLINDING_invert();
 #define BN_F_BN_MPI2BN                                  112
 #define BN_F_BN_NEW                                     113
 #define BN_F_BN_RAND                                    114
+#define BN_F_BN_USUB                                    115
 
 /* Reason codes. */
-#define BN_R_BAD_RECIPROCAL                             100
-#define BN_R_CALLED_WITH_EVEN_MODULUS                   101
-#define BN_R_DIV_BY_ZERO                                102
-#define BN_R_ENCODING_ERROR                             103
-#define BN_R_INVALID_LENGTH                             104
-#define BN_R_NOT_INITALISED                             105
-#define BN_R_NO_INVERSE                                         106
+#define BN_R_ARG2_LT_ARG3                               100
+#define BN_R_BAD_RECIPROCAL                             101
+#define BN_R_CALLED_WITH_EVEN_MODULUS                   102
+#define BN_R_DIV_BY_ZERO                                103
+#define BN_R_ENCODING_ERROR                             104
+#define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA               105
+#define BN_R_INVALID_LENGTH                             106
+#define BN_R_NOT_INITALISED                             107
+#define BN_R_NO_INVERSE                                         108
  
 #ifdef  __cplusplus
 }
index efb2e312e85bc98bcb384438411a7a4f5ae49a46..27b781a3675821116ad8d8d450f8ba9917661029 100644 (file)
@@ -66,9 +66,11 @@ BIGNUM *r;
 BIGNUM *a;
 BIGNUM *b;
        {
-       int i;
        BIGNUM *tmp;
 
+       bn_check_top(a);
+       bn_check_top(b);
+
        /*  a +  b      a+b
         *  a + -b      a-b
         * -a +  b      b-a
@@ -84,14 +86,12 @@ BIGNUM *b;
 
                if (BN_ucmp(a,b) < 0)
                        {
-                       if (bn_wexpand(r,b->top) == NULL) return(0);
-                       bn_qsub(r,b,a);
+                       if (!BN_usub(r,b,a)) return(0);
                        r->neg=1;
                        }
                else
                        {
-                       if (bn_wexpand(r,a->top) == NULL) return(0);
-                       bn_qsub(r,a,b);
+                       if (!BN_usub(r,a,b)) return(0);
                        r->neg=0;
                        }
                return(1);
@@ -102,23 +102,12 @@ BIGNUM *b;
        else
                r->neg=0;
 
-       i=(a->top > b->top);
-
-       if (i)
-               {
-               if (bn_wexpand(r,a->top+1) == NULL) return(0);
-               bn_qadd(r,a,b);
-               }
-       else
-               {
-               if (bn_wexpand(r,b->top+1) == NULL) return(0);
-               bn_qadd(r,b,a);
-               }
+       if (!BN_uadd(r,a,b)) return(0);
        return(1);
        }
 
 /* unsigned add of b to a, r must be large enough */
-void bn_qadd(r,a,b)
+int BN_uadd(r,a,b)
 BIGNUM *r;
 BIGNUM *a;
 BIGNUM *b;
@@ -126,11 +115,22 @@ BIGNUM *b;
        register int i;
        int max,min;
        BN_ULONG *ap,*bp,*rp,carry,t1;
+       BIGNUM *tmp;
+
+       bn_check_top(a);
+       bn_check_top(b);
 
+       if (a->top < b->top)
+               { tmp=a; a=b; b=tmp; }
        max=a->top;
        min=b->top;
+
+       if (bn_wexpand(r,max+1) == NULL)
+               return(0);
+
        r->top=max;
 
+
        ap=a->d;
        bp=b->d;
        rp=r->d;
@@ -160,8 +160,160 @@ BIGNUM *b;
                        r->top++;
                        }
                }
-       for (; i<max; i++)
-               *(rp++)= *(ap++);
+       if (rp != ap)
+               {
+               for (; i<max; i++)
+                       *(rp++)= *(ap++);
+               }
        /* memcpy(rp,ap,sizeof(*ap)*(max-i));*/
+       return(1);
+       }
+
+/* unsigned subtraction of b from a, a must be larger than b. */
+int BN_usub(r, a, b)
+BIGNUM *r;
+BIGNUM *a;
+BIGNUM *b;
+       {
+       int max,min,ret=1;
+       register BN_ULONG t1,t2,*ap,*bp,*rp;
+       int i,carry;
+#if defined(IRIX_CC_BUG) && !defined(LINT)
+       int dummy;
+#endif
+
+       bn_check_top(a);
+       bn_check_top(b);
+
+       if (a->top < b->top) /* hmm... should not be happening */
+               {
+               BNerr(BN_F_BN_USUB,BN_R_ARG2_LT_ARG3);
+               return(0);
+               }
+
+       max=a->top;
+       min=b->top;
+       if (bn_wexpand(r,max) == NULL) return(0);
+
+       ap=a->d;
+       bp=b->d;
+       rp=r->d;
+
+#if 1
+       carry=0;
+       for (i=0; i<min; i++)
+               {
+               t1= *(ap++);
+               t2= *(bp++);
+               if (carry)
+                       {
+                       carry=(t1 <= t2);
+                       t1=(t1-t2-1)&BN_MASK2;
+                       }
+               else
+                       {
+                       carry=(t1 < t2);
+                       t1=(t1-t2)&BN_MASK2;
+                       }
+#if defined(IRIX_CC_BUG) && !defined(LINT)
+               dummy=t1;
+#endif
+               *(rp++)=t1&BN_MASK2;
+               }
+#else
+       carry=bn_sub_words(rp,ap,bp,min);
+       ap+=min;
+       bp+=min;
+       rp+=min;
+       i=min;
+#endif
+       if (carry) /* subtracted */
+               {
+               while (i < max)
+                       {
+                       i++;
+                       t1= *(ap++);
+                       t2=(t1-1)&BN_MASK2;
+                       *(rp++)=t2;
+                       if (t1 > t2) break;
+                       }
+               }
+#if 0
+       memcpy(rp,ap,sizeof(*rp)*(max-i));
+#else
+       if (rp != ap)
+               {
+               for (;;)
+                       {
+                       if (i++ >= max) break;
+                       rp[0]=ap[0];
+                       if (i++ >= max) break;
+                       rp[1]=ap[1];
+                       if (i++ >= max) break;
+                       rp[2]=ap[2];
+                       if (i++ >= max) break;
+                       rp[3]=ap[3];
+                       rp+=4;
+                       ap+=4;
+                       }
+               }
+#endif
+
+       r->top=max;
+       bn_fix_top(r);
+       return(1);
+       }
+
+int BN_sub(r, a, b)
+BIGNUM *r;
+BIGNUM *a;
+BIGNUM *b;
+       {
+       int max;
+       int add=0,neg=0;
+       BIGNUM *tmp;
+
+       bn_check_top(a);
+       bn_check_top(b);
+
+       /*  a -  b      a-b
+        *  a - -b      a+b
+        * -a -  b      -(a+b)
+        * -a - -b      b-a
+        */
+       if (a->neg)
+               {
+               if (b->neg)
+                       { tmp=a; a=b; b=tmp; }
+               else
+                       { add=1; neg=1; }
+               }
+       else
+               {
+               if (b->neg) { add=1; neg=0; }
+               }
+
+       if (add)
+               {
+               if (!BN_uadd(r,a,b)) return(0);
+               r->neg=neg;
+               return(1);
+               }
+
+       /* We are actually doing a - b :-) */
+
+       max=(a->top > b->top)?a->top:b->top;
+       if (bn_wexpand(r,max) == NULL) return(0);
+       if (BN_ucmp(a,b) < 0)
+               {
+               if (!BN_usub(r,b,a)) return(0);
+               r->neg=1;
+               }
+       else
+               {
+               if (!BN_usub(r,a,b)) return(0);
+               r->neg=0;
+               }
+       return(1);
        }
 
diff --git a/crypto/bn/bn_asm.c b/crypto/bn/bn_asm.c
new file mode 100644 (file)
index 0000000..c9eb0e9
--- /dev/null
@@ -0,0 +1,829 @@
+/* crypto/bn/bn_asm.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include "cryptlib.h"
+#include "bn_lcl.h"
+
+#ifdef BN_LLONG 
+
+BN_ULONG bn_mul_add_words(rp,ap,num,w)
+BN_ULONG *rp,*ap;
+int num;
+BN_ULONG w;
+       {
+       BN_ULONG c1=0;
+
+       bn_check_num(num);
+       if (num <= 0) return(c1);
+
+       for (;;)
+               {
+               mul_add(rp[0],ap[0],w,c1);
+               if (--num == 0) break;
+               mul_add(rp[1],ap[1],w,c1);
+               if (--num == 0) break;
+               mul_add(rp[2],ap[2],w,c1);
+               if (--num == 0) break;
+               mul_add(rp[3],ap[3],w,c1);
+               if (--num == 0) break;
+               ap+=4;
+               rp+=4;
+               }
+       
+       return(c1);
+       } 
+
+BN_ULONG bn_mul_words(rp,ap,num,w)
+BN_ULONG *rp,*ap;
+int num;
+BN_ULONG w;
+       {
+       BN_ULONG c1=0;
+
+       bn_check_num(num);
+       if (num <= 0) return(c1);
+
+       for (;;)
+               {
+               mul(rp[0],ap[0],w,c1);
+               if (--num == 0) break;
+               mul(rp[1],ap[1],w,c1);
+               if (--num == 0) break;
+               mul(rp[2],ap[2],w,c1);
+               if (--num == 0) break;
+               mul(rp[3],ap[3],w,c1);
+               if (--num == 0) break;
+               ap+=4;
+               rp+=4;
+               }
+       return(c1);
+       } 
+
+void bn_sqr_words(r,a,n)
+BN_ULONG *r,*a;
+int n;
+        {
+       bn_check_num(n);
+       if (n <= 0) return;
+       for (;;)
+               {
+               BN_ULLONG t;
+
+               t=(BN_ULLONG)(a[0])*(a[0]);
+               r[0]=Lw(t); r[1]=Hw(t);
+               if (--n == 0) break;
+
+               t=(BN_ULLONG)(a[1])*(a[1]);
+               r[2]=Lw(t); r[3]=Hw(t);
+               if (--n == 0) break;
+
+               t=(BN_ULLONG)(a[2])*(a[2]);
+               r[4]=Lw(t); r[5]=Hw(t);
+               if (--n == 0) break;
+
+               t=(BN_ULLONG)(a[3])*(a[3]);
+               r[6]=Lw(t); r[7]=Hw(t);
+               if (--n == 0) break;
+
+               a+=4;
+               r+=8;
+               }
+       }
+
+#else
+
+BN_ULONG bn_mul_add_words(rp,ap,num,w)
+BN_ULONG *rp,*ap;
+int num;
+BN_ULONG w;
+       {
+       BN_ULONG c=0;
+       BN_ULONG bl,bh;
+
+       bn_check_num(num);
+       if (num <= 0) return((BN_ULONG)0);
+
+       bl=LBITS(w);
+       bh=HBITS(w);
+
+       for (;;)
+               {
+               mul_add(rp[0],ap[0],bl,bh,c);
+               if (--num == 0) break;
+               mul_add(rp[1],ap[1],bl,bh,c);
+               if (--num == 0) break;
+               mul_add(rp[2],ap[2],bl,bh,c);
+               if (--num == 0) break;
+               mul_add(rp[3],ap[3],bl,bh,c);
+               if (--num == 0) break;
+               ap+=4;
+               rp+=4;
+               }
+       return(c);
+       } 
+
+BN_ULONG bn_mul_words(rp,ap,num,w)
+BN_ULONG *rp,*ap;
+int num;
+BN_ULONG w;
+       {
+       BN_ULONG carry=0;
+       BN_ULONG bl,bh;
+
+       bn_check_num(num);
+       if (num <= 0) return((BN_ULONG)0);
+
+       bl=LBITS(w);
+       bh=HBITS(w);
+
+       for (;;)
+               {
+               mul(rp[0],ap[0],bl,bh,carry);
+               if (--num == 0) break;
+               mul(rp[1],ap[1],bl,bh,carry);
+               if (--num == 0) break;
+               mul(rp[2],ap[2],bl,bh,carry);
+               if (--num == 0) break;
+               mul(rp[3],ap[3],bl,bh,carry);
+               if (--num == 0) break;
+               ap+=4;
+               rp+=4;
+               }
+       return(carry);
+       } 
+
+void bn_sqr_words(r,a,n)
+BN_ULONG *r,*a;
+int n;
+        {
+       bn_check_num(n);
+       if (n <= 0) return;
+       for (;;)
+               {
+               sqr64(r[0],r[1],a[0]);
+               if (--n == 0) break;
+
+               sqr64(r[2],r[3],a[1]);
+               if (--n == 0) break;
+
+               sqr64(r[4],r[5],a[2]);
+               if (--n == 0) break;
+
+               sqr64(r[6],r[7],a[3]);
+               if (--n == 0) break;
+
+               a+=4;
+               r+=8;
+               }
+       }
+
+#endif
+
+#if defined(BN_LLONG) && defined(BN_DIV2W)
+
+BN_ULONG bn_div_words(h,l,d)
+BN_ULONG h,l,d;
+       {
+       return((BN_ULONG)(((((BN_ULLONG)h)<<BN_BITS2)|l)/(BN_ULLONG)d));
+       }
+
+#else
+
+/* Divide h-l by d and return the result. */
+/* I need to test this some more :-( */
+BN_ULONG bn_div_words(h,l,d)
+BN_ULONG h,l,d;
+       {
+       BN_ULONG dh,dl,q,ret=0,th,tl,t;
+       int i,count=2;
+
+       if (d == 0) return(BN_MASK2);
+
+       i=BN_num_bits_word(d);
+       if ((i != BN_BITS2) && (h > (BN_ULONG)1<<i))
+               {
+#if !defined(NO_STDIO) && !defined(WIN16)
+               fprintf(stderr,"Division would overflow (%d)\n",i);
+#endif
+               abort();
+               }
+       i=BN_BITS2-i;
+       if (h >= d) h-=d;
+
+       if (i)
+               {
+               d<<=i;
+               h=(h<<i)|(l>>(BN_BITS2-i));
+               l<<=i;
+               }
+       dh=(d&BN_MASK2h)>>BN_BITS4;
+       dl=(d&BN_MASK2l);
+       for (;;)
+               {
+               if ((h>>BN_BITS4) == dh)
+                       q=BN_MASK2l;
+               else
+                       q=h/dh;
+
+               for (;;)
+                       {
+                       t=(h-q*dh);
+                       if ((t&BN_MASK2h) ||
+                               ((dl*q) <= (
+                                       (t<<BN_BITS4)+
+                                       ((l&BN_MASK2h)>>BN_BITS4))))
+                               break;
+                       q--;
+                       }
+               th=q*dh;
+               tl=q*dl;
+               t=(tl>>BN_BITS4);
+               tl=(tl<<BN_BITS4)&BN_MASK2h;
+               th+=t;
+
+               if (l < tl) th++;
+               l-=tl;
+               if (h < th)
+                       {
+                       h+=d;
+                       q--;
+                       }
+               h-=th;
+
+               if (--count == 0) break;
+
+               ret=q<<BN_BITS4;
+               h=((h<<BN_BITS4)|(l>>BN_BITS4))&BN_MASK2;
+               l=(l&BN_MASK2l)<<BN_BITS4;
+               }
+       ret|=q;
+       return(ret);
+       }
+#endif
+
+#ifdef BN_LLONG
+BN_ULONG bn_add_words(r,a,b,n)
+BN_ULONG *r,*a,*b;
+int n;
+        {
+       BN_ULLONG ll=0;
+
+       bn_check_num(n);
+       if (n <= 0) return((BN_ULONG)0);
+
+       for (;;)
+               {
+               ll+=(BN_ULLONG)a[0]+b[0];
+               r[0]=(BN_ULONG)ll&BN_MASK2;
+               ll>>=BN_BITS2;
+               if (--n <= 0) break;
+
+               ll+=(BN_ULLONG)a[1]+b[1];
+               r[1]=(BN_ULONG)ll&BN_MASK2;
+               ll>>=BN_BITS2;
+               if (--n <= 0) break;
+
+               ll+=(BN_ULLONG)a[2]+b[2];
+               r[2]=(BN_ULONG)ll&BN_MASK2;
+               ll>>=BN_BITS2;
+               if (--n <= 0) break;
+
+               ll+=(BN_ULLONG)a[3]+b[3];
+               r[3]=(BN_ULONG)ll&BN_MASK2;
+               ll>>=BN_BITS2;
+               if (--n <= 0) break;
+
+               a+=4;
+               b+=4;
+               r+=4;
+               }
+       return((BN_ULONG)ll);
+       }
+#else
+BN_ULONG bn_add_words(r,a,b,n)
+BN_ULONG *r,*a,*b;
+int n;
+        {
+       BN_ULONG c,l,t;
+
+       bn_check_num(n);
+       if (n <= 0) return((BN_ULONG)0);
+
+       c=0;
+       for (;;)
+               {
+               t=a[0];
+               t=(t+c)&BN_MASK2;
+               c=(t < c);
+               l=(t+b[0])&BN_MASK2;
+               c+=(l < t);
+               r[0]=l;
+               if (--n <= 0) break;
+
+               t=a[1];
+               t=(t+c)&BN_MASK2;
+               c=(t < c);
+               l=(t+b[1])&BN_MASK2;
+               c+=(l < t);
+               r[1]=l;
+               if (--n <= 0) break;
+
+               t=a[2];
+               t=(t+c)&BN_MASK2;
+               c=(t < c);
+               l=(t+b[2])&BN_MASK2;
+               c+=(l < t);
+               r[2]=l;
+               if (--n <= 0) break;
+
+               t=a[3];
+               t=(t+c)&BN_MASK2;
+               c=(t < c);
+               l=(t+b[3])&BN_MASK2;
+               c+=(l < t);
+               r[3]=l;
+               if (--n <= 0) break;
+
+               a+=4;
+               b+=4;
+               r+=4;
+               }
+       return((BN_ULONG)c);
+       }
+#endif
+
+BN_ULONG bn_sub_words(r,a,b,n)
+BN_ULONG *r,*a,*b;
+int n;
+        {
+       BN_ULONG t1,t2;
+       int c=0;
+
+       bn_check_num(n);
+       if (n <= 0) return((BN_ULONG)0);
+
+       for (;;)
+               {
+               t1=a[0]; t2=b[0];
+               r[0]=(t1-t2-c)&BN_MASK2;
+               if (t1 != t2) c=(t1 < t2);
+               if (--n <= 0) break;
+
+               t1=a[1]; t2=b[1];
+               r[1]=(t1-t2-c)&BN_MASK2;
+               if (t1 != t2) c=(t1 < t2);
+               if (--n <= 0) break;
+
+               t1=a[2]; t2=b[2];
+               r[2]=(t1-t2-c)&BN_MASK2;
+               if (t1 != t2) c=(t1 < t2);
+               if (--n <= 0) break;
+
+               t1=a[3]; t2=b[3];
+               r[3]=(t1-t2-c)&BN_MASK2;
+               if (t1 != t2) c=(t1 < t2);
+               if (--n <= 0) break;
+
+               a+=4;
+               b+=4;
+               r+=4;
+               }
+       return(c);
+       }
+
+#ifdef BN_COMBA
+
+#undef bn_mul_comba8
+#undef bn_mul_comba4
+#undef bn_sqr_comba8
+#undef bn_sqr_comba4
+
+#ifdef BN_LLONG
+#define mul_add_c(a,b,c0,c1,c2) \
+       t=(BN_ULLONG)a*b; \
+       t1=(BN_ULONG)Lw(t); \
+       t2=(BN_ULONG)Hw(t); \
+       c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define mul_add_c2(a,b,c0,c1,c2) \
+       t=(BN_ULLONG)a*b; \
+       tt=(t+t)&BN_MASK; \
+       if (tt < t) c2++; \
+       t1=(BN_ULONG)Lw(tt); \
+       t2=(BN_ULONG)Hw(tt); \
+       c0=(c0+t1)&BN_MASK2;  \
+       if ((c0 < t1) && (((++t2)&BN_MASK2) == 0)) c2++; \
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define sqr_add_c(a,i,c0,c1,c2) \
+       t=(BN_ULLONG)a[i]*a[i]; \
+       t1=(BN_ULONG)Lw(t); \
+       t2=(BN_ULONG)Hw(t); \
+       c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define sqr_add_c2(a,i,j,c0,c1,c2) \
+       mul_add_c2((a)[i],(a)[j],c0,c1,c2)
+#else
+#define mul_add_c(a,b,c0,c1,c2) \
+       t1=LBITS(a); t2=HBITS(a); \
+       bl=LBITS(b); bh=HBITS(b); \
+       mul64(t1,t2,bl,bh); \
+       c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define mul_add_c2(a,b,c0,c1,c2) \
+       t1=LBITS(a); t2=HBITS(a); \
+       bl=LBITS(b); bh=HBITS(b); \
+       mul64(t1,t2,bl,bh); \
+       if (t2 & BN_TBIT) c2++; \
+       t2=(t2+t2)&BN_MASK2; \
+       if (t1 & BN_TBIT) t2++; \
+       t1=(t1+t1)&BN_MASK2; \
+       c0=(c0+t1)&BN_MASK2;  \
+       if ((c0 < t1) && (((++t2)&BN_MASK2) == 0)) c2++; \
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define sqr_add_c(a,i,c0,c1,c2) \
+       sqr64(t1,t2,(a)[i]); \
+       c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define sqr_add_c2(a,i,j,c0,c1,c2) \
+       mul_add_c2((a)[i],(a)[j],c0,c1,c2)
+#endif
+
+void bn_mul_comba8(r,a,b)
+BN_ULONG *r,*a,*b;
+       {
+#ifdef BN_LLONG
+       BN_ULLONG t;
+#else
+       BN_ULONG bl,bh;
+#endif
+       BN_ULONG t1,t2;
+       BN_ULONG c1,c2,c3;
+
+       c1=0;
+       c2=0;
+       c3=0;
+       mul_add_c(a[0],b[0],c1,c2,c3);
+       r[0]=c1;
+       c1=0;
+       mul_add_c(a[0],b[1],c2,c3,c1);
+       mul_add_c(a[1],b[0],c2,c3,c1);
+       r[1]=c2;
+       c2=0;
+       mul_add_c(a[2],b[0],c3,c1,c2);
+       mul_add_c(a[1],b[1],c3,c1,c2);
+       mul_add_c(a[0],b[2],c3,c1,c2);
+       r[2]=c3;
+       c3=0;
+       mul_add_c(a[0],b[3],c1,c2,c3);
+       mul_add_c(a[1],b[2],c1,c2,c3);
+       mul_add_c(a[2],b[1],c1,c2,c3);
+       mul_add_c(a[3],b[0],c1,c2,c3);
+       r[3]=c1;
+       c1=0;
+       mul_add_c(a[4],b[0],c2,c3,c1);
+       mul_add_c(a[3],b[1],c2,c3,c1);
+       mul_add_c(a[2],b[2],c2,c3,c1);
+       mul_add_c(a[1],b[3],c2,c3,c1);
+       mul_add_c(a[0],b[4],c2,c3,c1);
+       r[4]=c2;
+       c2=0;
+       mul_add_c(a[0],b[5],c3,c1,c2);
+       mul_add_c(a[1],b[4],c3,c1,c2);
+       mul_add_c(a[2],b[3],c3,c1,c2);
+       mul_add_c(a[3],b[2],c3,c1,c2);
+       mul_add_c(a[4],b[1],c3,c1,c2);
+       mul_add_c(a[5],b[0],c3,c1,c2);
+       r[5]=c3;
+       c3=0;
+       mul_add_c(a[6],b[0],c1,c2,c3);
+       mul_add_c(a[5],b[1],c1,c2,c3);
+       mul_add_c(a[4],b[2],c1,c2,c3);
+       mul_add_c(a[3],b[3],c1,c2,c3);
+       mul_add_c(a[2],b[4],c1,c2,c3);
+       mul_add_c(a[1],b[5],c1,c2,c3);
+       mul_add_c(a[0],b[6],c1,c2,c3);
+       r[6]=c1;
+       c1=0;
+       mul_add_c(a[0],b[7],c2,c3,c1);
+       mul_add_c(a[1],b[6],c2,c3,c1);
+       mul_add_c(a[2],b[5],c2,c3,c1);
+       mul_add_c(a[3],b[4],c2,c3,c1);
+       mul_add_c(a[4],b[3],c2,c3,c1);
+       mul_add_c(a[5],b[2],c2,c3,c1);
+       mul_add_c(a[6],b[1],c2,c3,c1);
+       mul_add_c(a[7],b[0],c2,c3,c1);
+       r[7]=c2;
+       c2=0;
+       mul_add_c(a[7],b[1],c3,c1,c2);
+       mul_add_c(a[6],b[2],c3,c1,c2);
+       mul_add_c(a[5],b[3],c3,c1,c2);
+       mul_add_c(a[4],b[4],c3,c1,c2);
+       mul_add_c(a[3],b[5],c3,c1,c2);
+       mul_add_c(a[2],b[6],c3,c1,c2);
+       mul_add_c(a[1],b[7],c3,c1,c2);
+       r[8]=c3;
+       c3=0;
+       mul_add_c(a[2],b[7],c1,c2,c3);
+       mul_add_c(a[3],b[6],c1,c2,c3);
+       mul_add_c(a[4],b[5],c1,c2,c3);
+       mul_add_c(a[5],b[4],c1,c2,c3);
+       mul_add_c(a[6],b[3],c1,c2,c3);
+       mul_add_c(a[7],b[2],c1,c2,c3);
+       r[9]=c1;
+       c1=0;
+       mul_add_c(a[7],b[3],c2,c3,c1);
+       mul_add_c(a[6],b[4],c2,c3,c1);
+       mul_add_c(a[5],b[5],c2,c3,c1);
+       mul_add_c(a[4],b[6],c2,c3,c1);
+       mul_add_c(a[3],b[7],c2,c3,c1);
+       r[10]=c2;
+       c2=0;
+       mul_add_c(a[4],b[7],c3,c1,c2);
+       mul_add_c(a[5],b[6],c3,c1,c2);
+       mul_add_c(a[6],b[5],c3,c1,c2);
+       mul_add_c(a[7],b[4],c3,c1,c2);
+       r[11]=c3;
+       c3=0;
+       mul_add_c(a[7],b[5],c1,c2,c3);
+       mul_add_c(a[6],b[6],c1,c2,c3);
+       mul_add_c(a[5],b[7],c1,c2,c3);
+       r[12]=c1;
+       c1=0;
+       mul_add_c(a[6],b[7],c2,c3,c1);
+       mul_add_c(a[7],b[6],c2,c3,c1);
+       r[13]=c2;
+       c2=0;
+       mul_add_c(a[7],b[7],c3,c1,c2);
+       r[14]=c3;
+       r[15]=c1;
+       }
+
+void bn_mul_comba4(r,a,b)
+BN_ULONG *r,*a,*b;
+       {
+#ifdef BN_LLONG
+       BN_ULLONG t;
+#else
+       BN_ULONG bl,bh;
+#endif
+       BN_ULONG t1,t2;
+       BN_ULONG c1,c2,c3;
+
+       c1=0;
+       c2=0;
+       c3=0;
+       mul_add_c(a[0],b[0],c1,c2,c3);
+       r[0]=c1;
+       c1=0;
+       mul_add_c(a[0],b[1],c2,c3,c1);
+       mul_add_c(a[1],b[0],c2,c3,c1);
+       r[1]=c2;
+       c2=0;
+       mul_add_c(a[2],b[0],c3,c1,c2);
+       mul_add_c(a[1],b[1],c3,c1,c2);
+       mul_add_c(a[0],b[2],c3,c1,c2);
+       r[2]=c3;
+       c3=0;
+       mul_add_c(a[0],b[3],c1,c2,c3);
+       mul_add_c(a[1],b[2],c1,c2,c3);
+       mul_add_c(a[2],b[1],c1,c2,c3);
+       mul_add_c(a[3],b[0],c1,c2,c3);
+       r[3]=c1;
+       c1=0;
+       mul_add_c(a[3],b[1],c2,c3,c1);
+       mul_add_c(a[2],b[2],c2,c3,c1);
+       mul_add_c(a[1],b[3],c2,c3,c1);
+       r[4]=c2;
+       c2=0;
+       mul_add_c(a[2],b[3],c3,c1,c2);
+       mul_add_c(a[3],b[2],c3,c1,c2);
+       r[5]=c3;
+       c3=0;
+       mul_add_c(a[3],b[3],c1,c2,c3);
+       r[6]=c1;
+       r[7]=c2;
+       }
+
+void bn_sqr_comba8(r,a)
+BN_ULONG *r,*a;
+       {
+#ifdef BN_LLONG
+       BN_ULLONG t,tt;
+#else
+       BN_ULONG bl,bh;
+#endif
+       BN_ULONG t1,t2;
+       BN_ULONG c1,c2,c3;
+
+       c1=0;
+       c2=0;
+       c3=0;
+       sqr_add_c(a,0,c1,c2,c3);
+       r[0]=c1;
+       c1=0;
+       sqr_add_c2(a,1,0,c2,c3,c1);
+       r[1]=c2;
+       c2=0;
+       sqr_add_c(a,1,c3,c1,c2);
+       sqr_add_c2(a,2,0,c3,c1,c2);
+       r[2]=c3;
+       c3=0;
+       sqr_add_c2(a,3,0,c1,c2,c3);
+       sqr_add_c2(a,2,1,c1,c2,c3);
+       r[3]=c1;
+       c1=0;
+       sqr_add_c(a,2,c2,c3,c1);
+       sqr_add_c2(a,3,1,c2,c3,c1);
+       sqr_add_c2(a,4,0,c2,c3,c1);
+       r[4]=c2;
+       c2=0;
+       sqr_add_c2(a,5,0,c3,c1,c2);
+       sqr_add_c2(a,4,1,c3,c1,c2);
+       sqr_add_c2(a,3,2,c3,c1,c2);
+       r[5]=c3;
+       c3=0;
+       sqr_add_c(a,3,c1,c2,c3);
+       sqr_add_c2(a,4,2,c1,c2,c3);
+       sqr_add_c2(a,5,1,c1,c2,c3);
+       sqr_add_c2(a,6,0,c1,c2,c3);
+       r[6]=c1;
+       c1=0;
+       sqr_add_c2(a,7,0,c2,c3,c1);
+       sqr_add_c2(a,6,1,c2,c3,c1);
+       sqr_add_c2(a,5,2,c2,c3,c1);
+       sqr_add_c2(a,4,3,c2,c3,c1);
+       r[7]=c2;
+       c2=0;
+       sqr_add_c(a,4,c3,c1,c2);
+       sqr_add_c2(a,5,3,c3,c1,c2);
+       sqr_add_c2(a,6,2,c3,c1,c2);
+       sqr_add_c2(a,7,1,c3,c1,c2);
+       r[8]=c3;
+       c3=0;
+       sqr_add_c2(a,7,2,c1,c2,c3);
+       sqr_add_c2(a,6,3,c1,c2,c3);
+       sqr_add_c2(a,5,4,c1,c2,c3);
+       r[9]=c1;
+       c1=0;
+       sqr_add_c(a,5,c2,c3,c1);
+       sqr_add_c2(a,6,4,c2,c3,c1);
+       sqr_add_c2(a,7,3,c2,c3,c1);
+       r[10]=c2;
+       c2=0;
+       sqr_add_c2(a,7,4,c3,c1,c2);
+       sqr_add_c2(a,6,5,c3,c1,c2);
+       r[11]=c3;
+       c3=0;
+       sqr_add_c(a,6,c1,c2,c3);
+       sqr_add_c2(a,7,5,c1,c2,c3);
+       r[12]=c1;
+       c1=0;
+       sqr_add_c2(a,7,6,c2,c3,c1);
+       r[13]=c2;
+       c2=0;
+       sqr_add_c(a,7,c3,c1,c2);
+       r[14]=c3;
+       r[15]=c1;
+       }
+
+void bn_sqr_comba4(r,a)
+BN_ULONG *r,*a;
+       {
+#ifdef BN_LLONG
+       BN_ULLONG t,tt;
+#else
+       BN_ULONG bl,bh;
+#endif
+       BN_ULONG t1,t2;
+       BN_ULONG c1,c2,c3;
+
+       c1=0;
+       c2=0;
+       c3=0;
+       sqr_add_c(a,0,c1,c2,c3);
+       r[0]=c1;
+       c1=0;
+       sqr_add_c2(a,1,0,c2,c3,c1);
+       r[1]=c2;
+       c2=0;
+       sqr_add_c(a,1,c3,c1,c2);
+       sqr_add_c2(a,2,0,c3,c1,c2);
+       r[2]=c3;
+       c3=0;
+       sqr_add_c2(a,3,0,c1,c2,c3);
+       sqr_add_c2(a,2,1,c1,c2,c3);
+       r[3]=c1;
+       c1=0;
+       sqr_add_c(a,2,c2,c3,c1);
+       sqr_add_c2(a,3,1,c2,c3,c1);
+       r[4]=c2;
+       c2=0;
+       sqr_add_c2(a,3,2,c3,c1,c2);
+       r[5]=c3;
+       c3=0;
+       sqr_add_c(a,3,c1,c2,c3);
+       r[6]=c1;
+       r[7]=c2;
+       }
+#else
+
+/* hmm... is it faster just to do a multiply? */
+void bn_sqr_comba4(r,a)
+BN_ULONG *r,*a;
+       {
+       BN_ULONG t[8];
+       bn_sqr_normal(r,a,4,t);
+       }
+
+void bn_sqr_comba8(r,a)
+BN_ULONG *r,*a;
+       {
+       BN_ULONG t[16];
+       bn_sqr_normal(r,a,8,t);
+       }
+
+void bn_mul_comba4(r,a,b)
+BN_ULONG *r,*a,*b;
+       {
+       r[4]=bn_mul_words(    &(r[0]),a,4,b[0]);
+       r[5]=bn_mul_add_words(&(r[1]),a,4,b[1]);
+       r[6]=bn_mul_add_words(&(r[2]),a,4,b[2]);
+       r[7]=bn_mul_add_words(&(r[3]),a,4,b[3]);
+       }
+
+void bn_mul_comba8(r,a,b)
+BN_ULONG *r,*a,*b;
+       {
+       r[ 8]=bn_mul_words(    &(r[0]),a,8,b[0]);
+       r[ 9]=bn_mul_add_words(&(r[1]),a,8,b[1]);
+       r[10]=bn_mul_add_words(&(r[2]),a,8,b[2]);
+       r[11]=bn_mul_add_words(&(r[3]),a,8,b[3]);
+       r[12]=bn_mul_add_words(&(r[4]),a,8,b[4]);
+       r[13]=bn_mul_add_words(&(r[5]),a,8,b[5]);
+       r[14]=bn_mul_add_words(&(r[6]),a,8,b[6]);
+       r[15]=bn_mul_add_words(&(r[7]),a,8,b[7]);
+       }
+
+#endif /* BN_COMBA */
index a7b34f0bf07954062f462c076ca42a842fccd396..35be32b99a5e466bee2c68320b3f352add747cad 100644 (file)
@@ -67,8 +67,14 @@ BIGNUM *mod;
        {
        BN_BLINDING *ret=NULL;
 
+       bn_check_top(Ai);
+       bn_check_top(mod);
+
        if ((ret=(BN_BLINDING *)Malloc(sizeof(BN_BLINDING))) == NULL)
+               {
                BNerr(BN_F_BN_BLINDING_NEW,ERR_R_MALLOC_FAILURE);
+               return(NULL);
+               }
        memset(ret,0,sizeof(BN_BLINDING));
        if ((ret->A=BN_new()) == NULL) goto err;
        if ((ret->Ai=BN_new()) == NULL) goto err;
@@ -78,7 +84,7 @@ BIGNUM *mod;
        return(ret);
 err:
        if (ret != NULL) BN_BLINDING_free(ret);
-       return(ret);
+       return(NULL);
        }
 
 void BN_BLINDING_free(r)
@@ -114,6 +120,8 @@ BIGNUM *n;
 BN_BLINDING *b;
 BN_CTX *ctx;
        {
+       bn_check_top(n);
+
        if ((b->A == NULL) || (b->Ai == NULL))
                {
                BNerr(BN_F_BN_BLINDING_CONVERT,BN_R_NOT_INITALISED);
@@ -128,6 +136,8 @@ BN_BLINDING *b;
 BN_CTX *ctx;
        {
        int ret;
+
+       bn_check_top(n);
        if ((b->A == NULL) || (b->Ai == NULL))
                {
                BNerr(BN_F_BN_BLINDING_INVERT,BN_R_NOT_INITALISED);
diff --git a/crypto/bn/bn_comba.c b/crypto/bn/bn_comba.c
new file mode 100644 (file)
index 0000000..30357cf
--- /dev/null
@@ -0,0 +1,349 @@
+/* crypto/bn/bn_comba.c */
+#include <stdio.h>
+#include "bn_lcl.h"
+/* Auto generated from crypto/bn/comba.pl
+ */
+
+#undef bn_mul_comba8
+#undef bn_mul_comba4
+#undef bn_sqr_comba8
+#undef bn_sqr_comba4
+
+#ifdef BN_LLONG
+#define mul_add_c(a,b,c0,c1,c2) \
+       t=(BN_ULLONG)a*b; \
+       t1=(BN_ULONG)Lw(t); \
+       t2=(BN_ULONG)Hw(t); \
+       c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define mul_add_c2(a,b,c0,c1,c2) \
+       t=(BN_ULLONG)a*b; \
+       tt=(t+t)&BN_MASK; \
+       if (tt < t) c2++; \
+       t1=(BN_ULONG)Lw(tt); \
+       t2=(BN_ULONG)Hw(tt); \
+       c0=(c0+t1)&BN_MASK2;  \
+       if ((c0 < t1) && (((++t2)&BN_MASK2) == 0)) c2++; \
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define sqr_add_c(a,i,c0,c1,c2) \
+       t=(BN_ULLONG)a[i]*a[i]; \
+       t1=(BN_ULONG)Lw(t); \
+       t2=(BN_ULONG)Hw(t); \
+       c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define sqr_add_c2(a,i,j,c0,c1,c2) \
+       mul_add_c2((a)[i],(a)[j],c0,c1,c2)
+#else
+#define mul_add_c(a,b,c0,c1,c2) \
+       t1=LBITS(a); t2=HBITS(a); \
+       bl=LBITS(b); bh=HBITS(b); \
+       mul64(t1,t2,bl,bh); \
+       c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define mul_add_c2(a,b,c0,c1,c2) \
+       t1=LBITS(a); t2=HBITS(a); \
+       bl=LBITS(b); bh=HBITS(b); \
+       mul64(t1,t2,bl,bh); \
+       if (t2 & BN_TBIT) c2++; \
+       t2=(t2+t2)&BN_MASK2; \
+       if (t1 & BN_TBIT) t2++; \
+       t1=(t1+t1)&BN_MASK2; \
+       c0=(c0+t1)&BN_MASK2;  \
+       if ((c0 < t1) && (((++t2)&BN_MASK2) == 0)) c2++; \
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define sqr_add_c(a,i,c0,c1,c2) \
+       sqr64(t1,t2,(a)[i]); \
+       c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define sqr_add_c2(a,i,j,c0,c1,c2) \
+       mul_add_c2((a)[i],(a)[j],c0,c1,c2)
+#endif
+
+void bn_mul_comba88(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b);
+void bn_mul_comba44(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b);
+void bn_sqr_comba88(BN_ULONG *r,BN_ULONG *a);
+void bn_sqr_comba44(BN_ULONG *r,BN_ULONG *a);
+
+void bn_mul_comba88(r,a,b)
+BN_ULONG *r,*a,*b;
+       {
+#ifdef BN_LLONG
+       BN_ULLONG t;
+#else
+       BN_ULONG bl,bh;
+#endif
+       BN_ULONG t1,t2;
+       BN_ULONG c1,c2,c3;
+
+       c1=0;
+       c2=0;
+       c3=0;
+       mul_add_c(a[0],b[0],c1,c2,c3);
+       r[0]=c1;
+       c1=0;
+       mul_add_c(a[0],b[1],c2,c3,c1);
+       mul_add_c(a[1],b[0],c2,c3,c1);
+       r[1]=c2;
+       c2=0;
+       mul_add_c(a[2],b[0],c3,c1,c2);
+       mul_add_c(a[1],b[1],c3,c1,c2);
+       mul_add_c(a[0],b[2],c3,c1,c2);
+       r[2]=c3;
+       c3=0;
+       mul_add_c(a[0],b[3],c1,c2,c3);
+       mul_add_c(a[1],b[2],c1,c2,c3);
+       mul_add_c(a[2],b[1],c1,c2,c3);
+       mul_add_c(a[3],b[0],c1,c2,c3);
+       r[3]=c1;
+       c1=0;
+       mul_add_c(a[4],b[0],c2,c3,c1);
+       mul_add_c(a[3],b[1],c2,c3,c1);
+       mul_add_c(a[2],b[2],c2,c3,c1);
+       mul_add_c(a[1],b[3],c2,c3,c1);
+       mul_add_c(a[0],b[4],c2,c3,c1);
+       r[4]=c2;
+       c2=0;
+       mul_add_c(a[0],b[5],c3,c1,c2);
+       mul_add_c(a[1],b[4],c3,c1,c2);
+       mul_add_c(a[2],b[3],c3,c1,c2);
+       mul_add_c(a[3],b[2],c3,c1,c2);
+       mul_add_c(a[4],b[1],c3,c1,c2);
+       mul_add_c(a[5],b[0],c3,c1,c2);
+       r[5]=c3;
+       c3=0;
+       mul_add_c(a[6],b[0],c1,c2,c3);
+       mul_add_c(a[5],b[1],c1,c2,c3);
+       mul_add_c(a[4],b[2],c1,c2,c3);
+       mul_add_c(a[3],b[3],c1,c2,c3);
+       mul_add_c(a[2],b[4],c1,c2,c3);
+       mul_add_c(a[1],b[5],c1,c2,c3);
+       mul_add_c(a[0],b[6],c1,c2,c3);
+       r[6]=c1;
+       c1=0;
+       mul_add_c(a[0],b[7],c2,c3,c1);
+       mul_add_c(a[1],b[6],c2,c3,c1);
+       mul_add_c(a[2],b[5],c2,c3,c1);
+       mul_add_c(a[3],b[4],c2,c3,c1);
+       mul_add_c(a[4],b[3],c2,c3,c1);
+       mul_add_c(a[5],b[2],c2,c3,c1);
+       mul_add_c(a[6],b[1],c2,c3,c1);
+       mul_add_c(a[7],b[0],c2,c3,c1);
+       r[7]=c2;
+       c2=0;
+       mul_add_c(a[7],b[1],c3,c1,c2);
+       mul_add_c(a[6],b[2],c3,c1,c2);
+       mul_add_c(a[5],b[3],c3,c1,c2);
+       mul_add_c(a[4],b[4],c3,c1,c2);
+       mul_add_c(a[3],b[5],c3,c1,c2);
+       mul_add_c(a[2],b[6],c3,c1,c2);
+       mul_add_c(a[1],b[7],c3,c1,c2);
+       r[8]=c3;
+       c3=0;
+       mul_add_c(a[2],b[7],c1,c2,c3);
+       mul_add_c(a[3],b[6],c1,c2,c3);
+       mul_add_c(a[4],b[5],c1,c2,c3);
+       mul_add_c(a[5],b[4],c1,c2,c3);
+       mul_add_c(a[6],b[3],c1,c2,c3);
+       mul_add_c(a[7],b[2],c1,c2,c3);
+       r[9]=c1;
+       c1=0;
+       mul_add_c(a[7],b[3],c2,c3,c1);
+       mul_add_c(a[6],b[4],c2,c3,c1);
+       mul_add_c(a[5],b[5],c2,c3,c1);
+       mul_add_c(a[4],b[6],c2,c3,c1);
+       mul_add_c(a[3],b[7],c2,c3,c1);
+       r[10]=c2;
+       c2=0;
+       mul_add_c(a[4],b[7],c3,c1,c2);
+       mul_add_c(a[5],b[6],c3,c1,c2);
+       mul_add_c(a[6],b[5],c3,c1,c2);
+       mul_add_c(a[7],b[4],c3,c1,c2);
+       r[11]=c3;
+       c3=0;
+       mul_add_c(a[7],b[5],c1,c2,c3);
+       mul_add_c(a[6],b[6],c1,c2,c3);
+       mul_add_c(a[5],b[7],c1,c2,c3);
+       r[12]=c1;
+       c1=0;
+       mul_add_c(a[6],b[7],c2,c3,c1);
+       mul_add_c(a[7],b[6],c2,c3,c1);
+       r[13]=c2;
+       c2=0;
+       mul_add_c(a[7],b[7],c3,c1,c2);
+       r[14]=c3;
+       r[15]=c1;
+       }
+
+void bn_mul_comba44(r,a,b)
+BN_ULONG *r,*a,*b;
+       {
+#ifdef BN_LLONG
+       BN_ULLONG t;
+#else
+       BN_ULONG bl,bh;
+#endif
+       BN_ULONG t1,t2;
+       BN_ULONG c1,c2,c3;
+
+       c1=0;
+       c2=0;
+       c3=0;
+       mul_add_c(a[0],b[0],c1,c2,c3);
+       r[0]=c1;
+       c1=0;
+       mul_add_c(a[0],b[1],c2,c3,c1);
+       mul_add_c(a[1],b[0],c2,c3,c1);
+       r[1]=c2;
+       c2=0;
+       mul_add_c(a[2],b[0],c3,c1,c2);
+       mul_add_c(a[1],b[1],c3,c1,c2);
+       mul_add_c(a[0],b[2],c3,c1,c2);
+       r[2]=c3;
+       c3=0;
+       mul_add_c(a[0],b[3],c1,c2,c3);
+       mul_add_c(a[1],b[2],c1,c2,c3);
+       mul_add_c(a[2],b[1],c1,c2,c3);
+       mul_add_c(a[3],b[0],c1,c2,c3);
+       r[3]=c1;
+       c1=0;
+       mul_add_c(a[3],b[1],c2,c3,c1);
+       mul_add_c(a[2],b[2],c2,c3,c1);
+       mul_add_c(a[1],b[3],c2,c3,c1);
+       r[4]=c2;
+       c2=0;
+       mul_add_c(a[2],b[3],c3,c1,c2);
+       mul_add_c(a[3],b[2],c3,c1,c2);
+       r[5]=c3;
+       c3=0;
+       mul_add_c(a[3],b[3],c1,c2,c3);
+       r[6]=c1;
+       r[7]=c2;
+       }
+
+void bn_sqr_comba88(r,a)
+BN_ULONG *r,*a;
+       {
+#ifdef BN_LLONG
+       BN_ULLONG t,tt;
+#else
+       BN_ULONG bl,bh;
+#endif
+       BN_ULONG t1,t2;
+       BN_ULONG c1,c2,c3;
+
+       c1=0;
+       c2=0;
+       c3=0;
+       sqr_add_c(a,0,c1,c2,c3);
+       r[0]=c1;
+       c1=0;
+       sqr_add_c2(a,1,0,c2,c3,c1);
+       r[1]=c2;
+       c2=0;
+       sqr_add_c(a,1,c3,c1,c2);
+       sqr_add_c2(a,2,0,c3,c1,c2);
+       r[2]=c3;
+       c3=0;
+       sqr_add_c2(a,3,0,c1,c2,c3);
+       sqr_add_c2(a,2,1,c1,c2,c3);
+       r[3]=c1;
+       c1=0;
+       sqr_add_c(a,2,c2,c3,c1);
+       sqr_add_c2(a,3,1,c2,c3,c1);
+       sqr_add_c2(a,4,0,c2,c3,c1);
+       r[4]=c2;
+       c2=0;
+       sqr_add_c2(a,5,0,c3,c1,c2);
+       sqr_add_c2(a,4,1,c3,c1,c2);
+       sqr_add_c2(a,3,2,c3,c1,c2);
+       r[5]=c3;
+       c3=0;
+       sqr_add_c(a,3,c1,c2,c3);
+       sqr_add_c2(a,4,2,c1,c2,c3);
+       sqr_add_c2(a,5,1,c1,c2,c3);
+       sqr_add_c2(a,6,0,c1,c2,c3);
+       r[6]=c1;
+       c1=0;
+       sqr_add_c2(a,7,0,c2,c3,c1);
+       sqr_add_c2(a,6,1,c2,c3,c1);
+       sqr_add_c2(a,5,2,c2,c3,c1);
+       sqr_add_c2(a,4,3,c2,c3,c1);
+       r[7]=c2;
+       c2=0;
+       sqr_add_c(a,4,c3,c1,c2);
+       sqr_add_c2(a,5,3,c3,c1,c2);
+       sqr_add_c2(a,6,2,c3,c1,c2);
+       sqr_add_c2(a,7,1,c3,c1,c2);
+       r[8]=c3;
+       c3=0;
+       sqr_add_c2(a,7,2,c1,c2,c3);
+       sqr_add_c2(a,6,3,c1,c2,c3);
+       sqr_add_c2(a,5,4,c1,c2,c3);
+       r[9]=c1;
+       c1=0;
+       sqr_add_c(a,5,c2,c3,c1);
+       sqr_add_c2(a,6,4,c2,c3,c1);
+       sqr_add_c2(a,7,3,c2,c3,c1);
+       r[10]=c2;
+       c2=0;
+       sqr_add_c2(a,7,4,c3,c1,c2);
+       sqr_add_c2(a,6,5,c3,c1,c2);
+       r[11]=c3;
+       c3=0;
+       sqr_add_c(a,6,c1,c2,c3);
+       sqr_add_c2(a,7,5,c1,c2,c3);
+       r[12]=c1;
+       c1=0;
+       sqr_add_c2(a,7,6,c2,c3,c1);
+       r[13]=c2;
+       c2=0;
+       sqr_add_c(a,7,c3,c1,c2);
+       r[14]=c3;
+       r[15]=c1;
+       }
+
+void bn_sqr_comba44(r,a)
+BN_ULONG *r,*a;
+       {
+#ifdef BN_LLONG
+       BN_ULLONG t,tt;
+#else
+       BN_ULONG bl,bh;
+#endif
+       BN_ULONG t1,t2;
+       BN_ULONG c1,c2,c3;
+
+       c1=0;
+       c2=0;
+       c3=0;
+       sqr_add_c(a,0,c1,c2,c3);
+       r[0]=c1;
+       c1=0;
+       sqr_add_c2(a,1,0,c2,c3,c1);
+       r[1]=c2;
+       c2=0;
+       sqr_add_c(a,1,c3,c1,c2);
+       sqr_add_c2(a,2,0,c3,c1,c2);
+       r[2]=c3;
+       c3=0;
+       sqr_add_c2(a,3,0,c1,c2,c3);
+       sqr_add_c2(a,2,1,c1,c2,c3);
+       r[3]=c1;
+       c1=0;
+       sqr_add_c(a,2,c2,c3,c1);
+       sqr_add_c2(a,3,1,c2,c3,c1);
+       r[4]=c2;
+       c2=0;
+       sqr_add_c2(a,3,2,c3,c1,c2);
+       r[5]=c3;
+       c3=0;
+       sqr_add_c(a,3,c1,c2,c3);
+       r[6]=c1;
+       r[7]=c2;
+       }
index 2263bdc7da083a7ce998e1d405b6c2a187a6b8c3..c7bc04d0b4e100d3ec52ff15e0182753c8a9ccad 100644 (file)
@@ -72,6 +72,8 @@ BN_CTX *ctx;
        int i,nm,nd;
        BIGNUM *D;
 
+       bn_check_top(m);
+       bn_check_top(d);
        if (BN_is_zero(d))
                {
                BNerr(BN_F_BN_DIV,BN_R_DIV_BY_ZERO);
@@ -86,9 +88,9 @@ BN_CTX *ctx;
                return(1);
                }
 
-       D=ctx->bn[ctx->tos];
-       if (dv == NULL) dv=ctx->bn[ctx->tos+1];
-       if (rem == NULL) rem=ctx->bn[ctx->tos+2];
+       D= &(ctx->bn[ctx->tos]);
+       if (dv == NULL) dv= &(ctx->bn[ctx->tos+1]);
+       if (rem == NULL) rem= &(ctx->bn[ctx->tos+2]);
 
        nd=BN_num_bits(d);
        nm=BN_num_bits(m);
@@ -98,6 +100,7 @@ BN_CTX *ctx;
        /* The next 2 are needed so we can do a dv->d[0]|=1 later
         * since BN_lshift1 will only work once there is a value :-) */
        BN_zero(dv);
+       bn_wexpand(dv,1);
        dv->top=1;
 
        if (!BN_lshift(D,D,nm-nd)) return(0);
@@ -107,7 +110,7 @@ BN_CTX *ctx;
                if (BN_ucmp(rem,D) >= 0)
                        {
                        dv->d[0]|=1;
-                       bn_qsub(rem,rem,D);
+                       if (!BN_usub(rem,rem,D)) return(0);
                        }
 /* CAN IMPROVE (and have now :=) */
                if (!BN_rshift1(D,D)) return(0);
@@ -132,6 +135,9 @@ BN_CTX *ctx;
        BN_ULONG d0,d1;
        int num_n,div_n;
 
+       bn_check_top(num);
+       bn_check_top(divisor);
+
        if (BN_is_zero(divisor))
                {
                BNerr(BN_F_BN_DIV,BN_R_DIV_BY_ZERO);
@@ -146,12 +152,12 @@ BN_CTX *ctx;
                return(1);
                }
 
-       tmp=ctx->bn[ctx->tos]; 
+       tmp= &(ctx->bn[ctx->tos]);
        tmp->neg=0;
-       snum=ctx->bn[ctx->tos+1];
-       sdiv=ctx->bn[ctx->tos+2];
+       snum= &(ctx->bn[ctx->tos+1]);
+       sdiv= &(ctx->bn[ctx->tos+2]);
        if (dv == NULL)
-               res=ctx->bn[ctx->tos+3];
+               res= &(ctx->bn[ctx->tos+3]);
        else    res=dv;
 
        /* First we normalise the numbers */
@@ -168,10 +174,10 @@ BN_CTX *ctx;
        /* Lets setup a 'window' into snum
         * This is the part that corresponds to the current
         * 'area' being divided */
+       BN_init(&wnum);
        wnum.d=  &(snum->d[loop]);
        wnum.top= div_n;
-       wnum.max= snum->max; /* a bit of a lie */
-       wnum.neg= 0;
+       wnum.max= snum->max+1; /* a bit of a lie */
 
        /* Get the top 2 words of sdiv */
        /* i=sdiv->top; */
@@ -183,8 +189,8 @@ BN_CTX *ctx;
 
        /* Setup to 'res' */
        res->neg= (num->neg^divisor->neg);
-       res->top=loop;
        if (!bn_wexpand(res,(loop+1))) goto err;
+       res->top=loop;
        resp= &(res->d[loop-1]);
 
        /* space for temp */
@@ -192,7 +198,7 @@ BN_CTX *ctx;
 
        if (BN_ucmp(&wnum,sdiv) >= 0)
                {
-               bn_qsub(&wnum,&wnum,sdiv);
+               if (!BN_usub(&wnum,&wnum,sdiv)) goto err;
                *resp=1;
                res->d[res->top-1]=1;
                }
@@ -211,7 +217,7 @@ BN_CTX *ctx;
                if (n0 == d0)
                        q=BN_MASK2;
                else
-                       q=bn_div64(n0,n1,d0);
+                       q=bn_div_words(n0,n1,d0);
                {
 #ifdef BN_LLONG
                BN_ULLONG t1,t2,rem;
@@ -284,3 +290,39 @@ err:
        }
 
 #endif
+
+/* rem != m */
+int BN_mod(rem, m, d,ctx)
+BIGNUM *rem;
+BIGNUM *m;
+BIGNUM *d;
+BN_CTX *ctx;
+       {
+#if 0 /* The old slow way */
+       int i,nm,nd;
+       BIGNUM *dv;
+
+       if (BN_ucmp(m,d) < 0)
+               return((BN_copy(rem,m) == NULL)?0:1);
+
+       dv= &(ctx->bn[ctx->tos]);
+
+       if (!BN_copy(rem,m)) return(0);
+
+       nm=BN_num_bits(rem);
+       nd=BN_num_bits(d);
+       if (!BN_lshift(dv,d,nm-nd)) return(0);
+       for (i=nm-nd; i>=0; i--)
+               {
+               if (BN_cmp(rem,dv) >= 0)
+                       {
+                       if (!BN_sub(rem,rem,dv)) return(0);
+                       }
+               if (!BN_rshift1(dv,dv)) return(0);
+               }
+       return(1);
+#else
+       return(BN_div(NULL,rem,m,d,ctx));
+#endif
+       }
+
index 029ae810d53abe0fb992a3204f964cd5d5ef6c2f..4c29c1ac559d12f08b627140c3d51168f64adebd 100644 (file)
@@ -78,15 +78,18 @@ static ERR_STRING_DATA BN_str_functs[]=
 {ERR_PACK(0,BN_F_BN_MPI2BN,0), "BN_mpi2bn"},
 {ERR_PACK(0,BN_F_BN_NEW,0),    "BN_new"},
 {ERR_PACK(0,BN_F_BN_RAND,0),   "BN_rand"},
+{ERR_PACK(0,BN_F_BN_USUB,0),   "BN_usub"},
 {0,NULL},
        };
 
 static ERR_STRING_DATA BN_str_reasons[]=
        {
+{BN_R_ARG2_LT_ARG3                       ,"arg2 lt arg3"},
 {BN_R_BAD_RECIPROCAL                     ,"bad reciprocal"},
 {BN_R_CALLED_WITH_EVEN_MODULUS           ,"called with even modulus"},
 {BN_R_DIV_BY_ZERO                        ,"div by zero"},
 {BN_R_ENCODING_ERROR                     ,"encoding error"},
+{BN_R_EXPAND_ON_STATIC_BIGNUM_DATA       ,"expand on static bignum data"},
 {BN_R_INVALID_LENGTH                     ,"invalid length"},
 {BN_R_NOT_INITALISED                     ,"not initalised"},
 {BN_R_NO_INVERSE                         ,"no inverse"},
@@ -99,8 +102,8 @@ void ERR_load_BN_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_BN,BN_str_functs);
index c056a5083f87a5465e6ed90b553cabbd6de16ddc..44f47e7eb20e89264676949fe62f155236da8156 100644 (file)
@@ -60,6 +60,8 @@
 #include "cryptlib.h"
 #include "bn_lcl.h"
 
+#define TABLE_SIZE     16
+
 /* slow but works */
 int BN_mod_mul(ret, a, b, m, ctx)
 BIGNUM *ret;
@@ -71,11 +73,15 @@ BN_CTX *ctx;
        BIGNUM *t;
        int r=0;
 
-       t=ctx->bn[ctx->tos++];
+       bn_check_top(a);
+       bn_check_top(b);
+       bn_check_top(m);
+
+       t= &(ctx->bn[ctx->tos++]);
        if (a == b)
                { if (!BN_sqr(t,a,ctx)) goto err; }
        else
-               { if (!BN_mul(t,a,b)) goto err; }
+               { if (!BN_mul(t,a,b,ctx)) goto err; }
        if (!BN_mod(ret,t,m,ctx)) goto err;
        r=1;
 err:
@@ -92,8 +98,8 @@ BN_CTX *ctx;
        int i,bits,ret=0;
        BIGNUM *v,*tmp;
 
-       v=ctx->bn[ctx->tos++];
-       tmp=ctx->bn[ctx->tos++];
+       v= &(ctx->bn[ctx->tos++]);
+       tmp= &(ctx->bn[ctx->tos++]);
 
        if (BN_copy(v,a) == NULL) goto err;
        bits=BN_num_bits(p);
@@ -108,7 +114,7 @@ BN_CTX *ctx;
                if (!BN_mod(v,tmp,m,ctx)) goto err;
                if (BN_is_bit_set(p,i))
                        {
-                       if (!BN_mul(tmp,r,v)) goto err;
+                       if (!BN_mul(tmp,r,v,ctx)) goto err;
                        if (!BN_mod(r,tmp,m,ctx)) goto err;
                        }
                }
@@ -128,8 +134,8 @@ BN_CTX *ctx;
        int i,bits,ret=0;
        BIGNUM *v,*tmp;
 
-       v=ctx->bn[ctx->tos++];
-       tmp=ctx->bn[ctx->tos++];
+       v= &(ctx->bn[ctx->tos++]);
+       tmp= &(ctx->bn[ctx->tos++]);
 
        if (BN_copy(v,a) == NULL) goto err;
        bits=BN_num_bits(p);
@@ -143,7 +149,7 @@ BN_CTX *ctx;
                if (!BN_sqr(tmp,v,ctx)) goto err;
                if (BN_is_bit_set(p,i))
                        {
-                       if (!BN_mul(tmp,r,v)) goto err;
+                       if (!BN_mul(tmp,r,v,ctx)) goto err;
                        }
                }
        ret=1;
@@ -161,6 +167,10 @@ BN_CTX *ctx;
        {
        int ret;
 
+       bn_check_top(a);
+       bn_check_top(p);
+       bn_check_top(m);
+
 #ifdef MONT_MUL_MOD
        /* I have finally been able to take out this pre-condition of
         * the top bit being set.  It was caused by an error in BN_div
@@ -189,13 +199,13 @@ BIGNUM *p;
 BIGNUM *m;
 BN_CTX *ctx;
        {
-       int nb,i,j,bits,ret=0,wstart,wend,window,wvalue;
-       int start=1;
-       BIGNUM *d,*aa;
-       BIGNUM *val[16];
+       int i,j,bits,ret=0,wstart,wend,window,wvalue;
+       int start=1,ts=0;
+       BIGNUM *aa;
+       BIGNUM val[TABLE_SIZE];
+       BN_RECP_CTX recp;
 
-       d=ctx->bn[ctx->tos++];
-       aa=ctx->bn[ctx->tos++];
+       aa= &(ctx->bn[ctx->tos++]);
        bits=BN_num_bits(p);
 
        if (bits == 0)
@@ -203,12 +213,14 @@ BN_CTX *ctx;
                BN_one(r);
                return(1);
                }
-       nb=BN_reciprocal(d,m,ctx);
-       if (nb == -1) goto err;
+       BN_RECP_CTX_init(&recp);
+       if (BN_RECP_CTX_set(&recp,m,ctx) <= 0) goto err;
+
+       BN_init(&(val[0]));
+       ts=1;
 
-       val[0]=BN_new();
-       if (!BN_mod(val[0],a,m,ctx)) goto err;          /* 1 */
-       if (!BN_mod_mul_reciprocal(aa,val[0],val[0],m,d,nb,ctx))
+       if (!BN_mod(&(val[0]),a,m,ctx)) goto err;               /* 1 */
+       if (!BN_mod_mul_reciprocal(aa,&(val[0]),&(val[0]),&recp,ctx))
                goto err;                               /* 2 */
 
        if (bits <= 17) /* This is probably 3 or 0x10001, so just do singles */
@@ -223,12 +235,11 @@ BN_CTX *ctx;
        j=1<<(window-1);
        for (i=1; i<j; i++)
                {
-               val[i]=BN_new();
-               if (!BN_mod_mul_reciprocal(val[i],val[i-1],aa,m,d,nb,ctx))
+               BN_init(&val[i]);
+               if (!BN_mod_mul_reciprocal(&(val[i]),&(val[i-1]),aa,&recp,ctx))
                        goto err;
                }
-       for (; i<16; i++)
-               val[i]=NULL;
+       ts=i;
 
        start=1;        /* This is used to avoid multiplication etc
                         * when there is only the value '1' in the
@@ -244,7 +255,7 @@ BN_CTX *ctx;
                if (BN_is_bit_set(p,wstart) == 0)
                        {
                        if (!start)
-                               if (!BN_mod_mul_reciprocal(r,r,r,m,d,nb,ctx))
+                               if (!BN_mod_mul_reciprocal(r,r,r,&recp,ctx))
                                goto err;
                        if (wstart == 0) break;
                        wstart--;
@@ -274,12 +285,12 @@ BN_CTX *ctx;
                if (!start)
                        for (i=0; i<j; i++)
                                {
-                               if (!BN_mod_mul_reciprocal(r,r,r,m,d,nb,ctx))
+                               if (!BN_mod_mul_reciprocal(r,r,r,&recp,ctx))
                                        goto err;
                                }
                
                /* wvalue will be an odd number < 2^window */
-               if (!BN_mod_mul_reciprocal(r,r,val[wvalue>>1],m,d,nb,ctx))
+               if (!BN_mod_mul_reciprocal(r,r,&(val[wvalue>>1]),&recp,ctx))
                        goto err;
 
                /* move the 'window' down further */
@@ -290,35 +301,40 @@ BN_CTX *ctx;
                }
        ret=1;
 err:
-       ctx->tos-=2;
-       for (i=0; i<16; i++)
-               if (val[i] != NULL) BN_clear_free(val[i]);
+       ctx->tos--;
+       for (i=0; i<ts; i++)
+               BN_clear_free(&(val[i]));
+       BN_RECP_CTX_free(&recp);
        return(ret);
        }
 /* #endif */
 
 /* #ifdef MONT_MUL_MOD */
-int BN_mod_exp_mont(r,a,p,m,ctx,in_mont)
-BIGNUM *r;
+int BN_mod_exp_mont(rr,a,p,m,ctx,in_mont)
+BIGNUM *rr;
 BIGNUM *a;
 BIGNUM *p;
 BIGNUM *m;
 BN_CTX *ctx;
 BN_MONT_CTX *in_mont;
        {
-#define TABLE_SIZE     16
        int i,j,bits,ret=0,wstart,wend,window,wvalue;
-       int start=1;
-       BIGNUM *d,*aa;
-       BIGNUM *val[TABLE_SIZE];
+       int start=1,ts=0;
+       BIGNUM *d,*aa,*r;
+       BIGNUM val[TABLE_SIZE];
        BN_MONT_CTX *mont=NULL;
 
+       bn_check_top(a);
+       bn_check_top(p);
+       bn_check_top(m);
+
        if (!(m->d[0] & 1))
                {
                BNerr(BN_F_BN_MOD_EXP_MONT,BN_R_CALLED_WITH_EVEN_MODULUS);
                return(0);
                }
-       d=ctx->bn[ctx->tos++];
+       d= &(ctx->bn[ctx->tos++]);
+       r= &(ctx->bn[ctx->tos++]);
        bits=BN_num_bits(p);
        if (bits == 0)
                {
@@ -339,22 +355,23 @@ BN_MONT_CTX *in_mont;
                if (!BN_MONT_CTX_set(mont,m,ctx)) goto err;
                }
 
-       val[0]=BN_new();
+       BN_init(&val[0]);
+       ts=1;
        if (BN_ucmp(a,m) >= 0)
                {
-               BN_mod(val[0],a,m,ctx);
-               aa=val[0];
+               BN_mod(&(val[0]),a,m,ctx);
+               aa= &(val[0]);
                }
        else
                aa=a;
-       if (!BN_to_montgomery(val[0],aa,mont,ctx)) goto err; /* 1 */
-       if (!BN_mod_mul_montgomery(d,val[0],val[0],mont,ctx)) goto err; /* 2 */
+       if (!BN_to_montgomery(&(val[0]),aa,mont,ctx)) goto err; /* 1 */
+       if (!BN_mod_mul_montgomery(d,&(val[0]),&(val[0]),mont,ctx)) goto err; /* 2 */
 
        if (bits <= 20) /* This is probably 3 or 0x10001, so just do singles */
                window=1;
-       else if (bits > 250)
+       else if (bits >= 256)
                window=5;       /* max size of window */
-       else if (bits >= 120)
+       else if (bits >= 128)
                window=4;
        else
                window=3;
@@ -362,12 +379,11 @@ BN_MONT_CTX *in_mont;
        j=1<<(window-1);
        for (i=1; i<j; i++)
                {
-               val[i]=BN_new();
-               if (!BN_mod_mul_montgomery(val[i],val[i-1],d,mont,ctx))
+               BN_init(&(val[i]));
+               if (!BN_mod_mul_montgomery(&(val[i]),&(val[i-1]),d,mont,ctx))
                        goto err;
                }
-       for (; i<TABLE_SIZE; i++)
-               val[i]=NULL;
+       ts=i;
 
        start=1;        /* This is used to avoid multiplication etc
                         * when there is only the value '1' in the
@@ -419,7 +435,7 @@ BN_MONT_CTX *in_mont;
                                }
                
                /* wvalue will be an odd number < 2^window */
-               if (!BN_mod_mul_montgomery(r,r,val[wvalue>>1],mont,ctx))
+               if (!BN_mod_mul_montgomery(r,r,&(val[wvalue>>1]),mont,ctx))
                        goto err;
 
                /* move the 'window' down further */
@@ -428,13 +444,13 @@ BN_MONT_CTX *in_mont;
                start=0;
                if (wstart < 0) break;
                }
-       BN_from_montgomery(r,r,mont,ctx);
+       BN_from_montgomery(rr,r,mont,ctx);
        ret=1;
 err:
        if ((in_mont == NULL) && (mont != NULL)) BN_MONT_CTX_free(mont);
-       ctx->tos--;
-       for (i=0; i<TABLE_SIZE; i++)
-               if (val[i] != NULL) BN_clear_free(val[i]);
+       ctx->tos-=2;
+       for (i=0; i<ts; i++)
+               BN_clear_free(&(val[i]));
        return(ret);
        }
 /* #endif */
@@ -447,12 +463,12 @@ BIGNUM *p;
 BIGNUM *m;
 BN_CTX *ctx;
        {
-       int i,j,bits,ret=0,wstart,wend,window,wvalue;
+       int i,j,bits,ret=0,wstart,wend,window,wvalue,ts=0;
        int start=1;
        BIGNUM *d;
-       BIGNUM *val[16];
+       BIGNUM val[TABLE_SIZE];
 
-       d=ctx->bn[ctx->tos++];
+       d= &(ctx->bn[ctx->tos++]);
        bits=BN_num_bits(p);
 
        if (bits == 0)
@@ -461,9 +477,10 @@ BN_CTX *ctx;
                return(1);
                }
 
-       val[0]=BN_new();
-       if (!BN_mod(val[0],a,m,ctx)) goto err;          /* 1 */
-       if (!BN_mod_mul(d,val[0],val[0],m,ctx))
+       BN_init(&(val[0]));
+       ts=1;
+       if (!BN_mod(&(val[0]),a,m,ctx)) goto err;               /* 1 */
+       if (!BN_mod_mul(d,&(val[0]),&(val[0]),m,ctx))
                goto err;                               /* 2 */
 
        if (bits <= 17) /* This is probably 3 or 0x10001, so just do singles */
@@ -478,12 +495,11 @@ BN_CTX *ctx;
        j=1<<(window-1);
        for (i=1; i<j; i++)
                {
-               val[i]=BN_new();
-               if (!BN_mod_mul(val[i],val[i-1],d,m,ctx))
+               BN_init(&(val[i]));
+               if (!BN_mod_mul(&(val[i]),&(val[i-1]),d,m,ctx))
                        goto err;
                }
-       for (; i<16; i++)
-               val[i]=NULL;
+       ts=i;
 
        start=1;        /* This is used to avoid multiplication etc
                         * when there is only the value '1' in the
@@ -534,7 +550,7 @@ BN_CTX *ctx;
                                }
                
                /* wvalue will be an odd number < 2^window */
-               if (!BN_mod_mul(r,r,val[wvalue>>1],m,ctx))
+               if (!BN_mod_mul(r,r,&(val[wvalue>>1]),m,ctx))
                        goto err;
 
                /* move the 'window' down further */
@@ -546,8 +562,8 @@ BN_CTX *ctx;
        ret=1;
 err:
        ctx->tos--;
-       for (i=0; i<16; i++)
-               if (val[i] != NULL) BN_clear_free(val[i]);
+       for (i=0; i<ts; i++)
+               BN_clear_free(&(val[i]));
        return(ret);
        }
 
diff --git a/crypto/bn/bn_exp2.c b/crypto/bn/bn_exp2.c
new file mode 100644 (file)
index 0000000..eface73
--- /dev/null
@@ -0,0 +1,202 @@
+#include <stdio.h>
+#include "cryptlib.h"
+#include "bn_lcl.h"
+
+/* I've done some timing with different table sizes.
+ * The main hassle is that even with bits set at 3, this requires
+ * 63 BIGNUMs to store the pre-calculated values.
+ *          512   1024 
+ * bits=1  75.4%  79.4%
+ * bits=2  61.2%  62.4%
+ * bits=3  61.3%  59.3%
+ * The lack of speed improvment is also a function of the pre-calculation
+ * which could be removed.
+ */
+#define EXP2_TABLE_BITS        2 /* 1  2  3  4  5  */
+#define EXP2_TABLE_SIZE        4 /* 2  4  8 16 32  */
+
+int BN_mod_exp2_mont(rr,a1,p1,a2,p2,m,ctx,in_mont)
+BIGNUM *rr;
+BIGNUM *a1;
+BIGNUM *p1;
+BIGNUM *a2;
+BIGNUM *p2;
+BIGNUM *m;
+BN_CTX *ctx;
+BN_MONT_CTX *in_mont;
+       {
+       int i,j,k,bits,bits1,bits2,ret=0,wstart,wend,window,xvalue,yvalue;
+       int start=1,ts=0,x,y;
+       BIGNUM *d,*aa1,*aa2,*r;
+       BIGNUM val[EXP2_TABLE_SIZE][EXP2_TABLE_SIZE];
+       BN_MONT_CTX *mont=NULL;
+
+       bn_check_top(a1);
+       bn_check_top(p1);
+       bn_check_top(a2);
+       bn_check_top(p2);
+       bn_check_top(m);
+
+       if (!(m->d[0] & 1))
+               {
+               BNerr(BN_F_BN_MOD_EXP_MONT,BN_R_CALLED_WITH_EVEN_MODULUS);
+               return(0);
+               }
+       d= &(ctx->bn[ctx->tos++]);
+       r= &(ctx->bn[ctx->tos++]);
+       bits1=BN_num_bits(p1);
+       bits2=BN_num_bits(p2);
+       if ((bits1 == 0) && (bits2 == 0))
+               {
+               BN_one(r);
+               return(1);
+               }
+       bits=(bits1 > bits2)?bits1:bits2;
+
+       /* If this is not done, things will break in the montgomery
+        * part */
+
+       if (in_mont != NULL)
+               mont=in_mont;
+       else
+               {
+               if ((mont=BN_MONT_CTX_new()) == NULL) goto err;
+               if (!BN_MONT_CTX_set(mont,m,ctx)) goto err;
+               }
+
+       BN_init(&(val[0][0]));
+       BN_init(&(val[1][1]));
+       BN_init(&(val[0][1]));
+       BN_init(&(val[1][0]));
+       ts=1;
+       if (BN_ucmp(a1,m) >= 0)
+               {
+               BN_mod(&(val[1][0]),a1,m,ctx);
+               aa1= &(val[1][0]);
+               }
+       else
+               aa1=a1;
+       if (BN_ucmp(a2,m) >= 0)
+               {
+               BN_mod(&(val[0][1]),a2,m,ctx);
+               aa2= &(val[0][1]);
+               }
+       else
+               aa2=a2;
+       if (!BN_to_montgomery(&(val[1][0]),aa1,mont,ctx)) goto err;
+       if (!BN_to_montgomery(&(val[0][1]),aa2,mont,ctx)) goto err;
+       if (!BN_mod_mul_montgomery(&(val[1][1]),
+               &(val[1][0]),&(val[0][1]),mont,ctx))
+               goto err;
+
+#if 0
+       if (bits <= 20) /* This is probably 3 or 0x10001, so just do singles */
+               window=1;
+       else if (bits > 250)
+               window=5;       /* max size of window */
+       else if (bits >= 120)
+               window=4;
+       else
+               window=3;
+#else
+       window=EXP2_TABLE_BITS;
+#endif
+
+       k=1<<window;
+       for (x=0; x<k; x++)
+               {
+               if (x >= 2)
+                       {
+                       BN_init(&(val[x][0]));
+                       BN_init(&(val[x][1]));
+                       if (!BN_mod_mul_montgomery(&(val[x][0]),
+                               &(val[1][0]),&(val[x-1][0]),mont,ctx)) goto err;
+                       if (!BN_mod_mul_montgomery(&(val[x][1]),
+                               &(val[1][0]),&(val[x-1][1]),mont,ctx)) goto err;
+                       }
+               for (y=2; y<k; y++)
+                       {
+                       BN_init(&(val[x][y]));
+                       if (!BN_mod_mul_montgomery(&(val[x][y]),
+                               &(val[x][y-1]),&(val[0][1]),mont,ctx))
+                               goto err;
+                       }
+               }
+       ts=k;
+
+       start=1;        /* This is used to avoid multiplication etc
+                        * when there is only the value '1' in the
+                        * buffer. */
+       xvalue=0;       /* The 'x value' of the window */
+       yvalue=0;       /* The 'y value' of the window */
+       wstart=bits-1;  /* The top bit of the window */
+       wend=0;         /* The bottom bit of the window */
+
+        if (!BN_to_montgomery(r,BN_value_one(),mont,ctx)) goto err;
+       for (;;)
+               {
+               xvalue=BN_is_bit_set(p1,wstart);
+               yvalue=BN_is_bit_set(p2,wstart);
+               if (!(xvalue || yvalue))
+                       {
+                       if (!start)
+                               {
+                               if (!BN_mod_mul_montgomery(r,r,r,mont,ctx))
+                                       goto err;
+                               }
+                       wstart--;
+                       if (wstart < 0) break;
+                       continue;
+                       }
+               /* We now have wstart on a 'set' bit, we now need to work out
+                * how bit a window to do.  To do this we need to scan
+                * forward until the last set bit before the end of the
+                * window */
+               j=wstart;
+               /* xvalue=BN_is_bit_set(p1,wstart); already set */
+               /* yvalue=BN_is_bit_set(p1,wstart); already set */
+               wend=0;
+               for (i=1; i<window; i++)
+                       {
+                       if (wstart-i < 0) break;
+                       xvalue+=xvalue;
+                       xvalue|=BN_is_bit_set(p1,wstart-i);
+                       yvalue+=yvalue;
+                       yvalue|=BN_is_bit_set(p2,wstart-i);
+                       }
+
+               /* i is the size of the current window */
+               /* add the 'bytes above' */
+               if (!start)
+                       for (j=0; j<i; j++)
+                               {
+                               if (!BN_mod_mul_montgomery(r,r,r,mont,ctx))
+                                       goto err;
+                               }
+               
+               /* wvalue will be an odd number < 2^window */
+               if (xvalue || yvalue)
+                       {
+                       if (!BN_mod_mul_montgomery(r,r,&(val[xvalue][yvalue]),
+                               mont,ctx)) goto err;
+                       }
+
+               /* move the 'window' down further */
+               wstart-=i;
+               start=0;
+               if (wstart < 0) break;
+               }
+       BN_from_montgomery(rr,r,mont,ctx);
+       ret=1;
+err:
+       if ((in_mont == NULL) && (mont != NULL)) BN_MONT_CTX_free(mont);
+       ctx->tos-=2;
+       for (i=0; i<ts; i++)
+               {
+               for (j=0; j<ts; j++)
+                       {
+                       BN_clear_free(&(val[i][j]));
+                       }
+               }
+       return(ret);
+       }
index 071bba3b4b3a0521359682c21e69e94e8d4f6f05..c80cecdc8de9eb125052016a7a52c8b2a7aa08ff 100644 (file)
@@ -73,8 +73,11 @@ BN_CTX *ctx;
        BIGNUM *a,*b,*t;
        int ret=0;
 
-       a=ctx->bn[ctx->tos];
-       b=ctx->bn[ctx->tos+1];
+       bn_check_top(in_a);
+       bn_check_top(in_b);
+
+       a= &(ctx->bn[ctx->tos]);
+       b= &(ctx->bn[ctx->tos+1]);
 
        if (BN_copy(a,in_a) == NULL) goto err;
        if (BN_copy(b,in_b) == NULL) goto err;
@@ -95,6 +98,9 @@ BIGNUM *a,*b;
        BIGNUM *t;
        int shifts=0;
 
+       bn_check_top(a);
+       bn_check_top(b);
+
        for (;;)
                {
                if (BN_is_zero(b))
@@ -142,23 +148,30 @@ err:
        }
 
 /* solves ax == 1 (mod n) */
-BIGNUM *BN_mod_inverse(a, n, ctx)
+BIGNUM *BN_mod_inverse(in, a, n, ctx)
+BIGNUM *in;
 BIGNUM *a;
 BIGNUM *n;
 BN_CTX *ctx;
        {
        BIGNUM *A,*B,*X,*Y,*M,*D,*R;
-       BIGNUM *ret=NULL,*T;
+       BIGNUM *T,*ret=NULL;
        int sign;
 
-       A=ctx->bn[ctx->tos];
-       B=ctx->bn[ctx->tos+1];
-       X=ctx->bn[ctx->tos+2];
-       D=ctx->bn[ctx->tos+3];
-       M=ctx->bn[ctx->tos+4];
-       Y=ctx->bn[ctx->tos+5];
+       bn_check_top(a);
+       bn_check_top(n);
+
+       A= &(ctx->bn[ctx->tos]);
+       B= &(ctx->bn[ctx->tos+1]);
+       X= &(ctx->bn[ctx->tos+2]);
+       D= &(ctx->bn[ctx->tos+3]);
+       M= &(ctx->bn[ctx->tos+4]);
+       Y= &(ctx->bn[ctx->tos+5]);
        ctx->tos+=6;
-       R=BN_new();
+       if (in == NULL)
+               R=BN_new();
+       else
+               R=in;
        if (R == NULL) goto err;
 
        BN_zero(X);
@@ -175,7 +188,7 @@ BN_CTX *ctx;
                B=M;
                /* T has a struct, M does not */
 
-               if (!BN_mul(T,D,X)) goto err;
+               if (!BN_mul(T,D,X,ctx)) goto err;
                if (!BN_add(T,T,Y)) goto err;
                M=Y;
                Y=X;
@@ -196,7 +209,7 @@ BN_CTX *ctx;
                }
        ret=R;
 err:
-       if ((ret == NULL) && (R != NULL)) BN_free(R);
+       if ((ret == NULL) && (in == NULL)) BN_free(R);
        ctx->tos-=6;
        return(ret);
        }
index edfd788338322096c531eef615e440b16119cf5f..70b0787d8f5b08145b48400135a376d06d0fb828 100644 (file)
 extern "C" {
 #endif
 
+/* Pentium pro 16,16,16,32,64 */
+/* Alpha       16,16,16,16.64 */
+#define BN_MULL_SIZE_NORMAL                    (16) // 32
+#define BN_MUL_RECURSIVE_SIZE_NORMAL           (16) // 32 /* less than */
+#define BN_SQR_RECURSIVE_SIZE_NORMAL           (16) // 32
+#define BN_MUL_LOW_RECURSIVE_SIZE_NORMAL       (32) // 32
+#define BN_MONT_CTX_SET_SIZE_WORD              (64) // 32
+
+#ifndef BN_MUL_COMBA
+#define bn_mul_comba8(r,a,b)   bn_mul_normal(r,a,8,b,8)
+#define bn_mul_comba4(r,a,b)   bn_mul_normal(r,a,4,b,4)
+/* This is probably faster than using the C code - I need to check */
+#define bn_sqr_comba8(r,a)     bn_mul_normal(r,a,8,a,8)
+#define bn_sqr_comba4(r,a)     bn_mul_normal(r,a,4,a,4)
+#endif
+
 /*************************************************************
  * Using the long long type
  */
 #define Lw(t)    (((BN_ULONG)(t))&BN_MASK2)
 #define Hw(t)    (((BN_ULONG)((t)>>BN_BITS2))&BN_MASK2)
 
-#define bn_fix_top(a) \
-        { \
-        BN_ULONG *fix_top_l; \
-        for (fix_top_l= &((a)->d[(a)->top-1]); (a)->top > 0; (a)->top--) \
-               if (*(fix_top_l--)) break; \
+/* These are used for internal error checking and are not normally used */
+#ifdef BN_DEBUG
+#define bn_check_top(a) \
+       { if (((a)->top < 0) || ((a)->top > (a)->max)) \
+               { char *nullp=NULL; *nullp='z'; } }
+#define bn_check_num(a) if ((a) < 0) { char *nullp=NULL; *nullp='z'; }
+#else
+#define bn_check_top(a)
+#define bn_check_num(a)
+#endif
+
+/* This macro is to add extra stuff for development checking */
+#ifdef BN_DEBUG
+#define        bn_set_max(r) ((r)->max=(r)->top,BN_set_flags((r),BN_FLG_STATIC_DATA))
+#else
+#define        bn_set_max(r)
+#endif
+
+/* These macros are used to 'take' a section of a bignum for read only use */
+#define bn_set_low(r,a,n) \
+       { \
+       (r)->top=((a)->top > (n))?(n):(a)->top; \
+       (r)->d=(a)->d; \
+       (r)->neg=(a)->neg; \
+       (r)->flags|=BN_FLG_STATIC_DATA; \
+       bn_set_max(r); \
+       }
+
+#define bn_set_high(r,a,n) \
+       { \
+       if ((a)->top > (n)) \
+               { \
+               (r)->top=(a)->top-n; \
+               (r)->d= &((a)->d[n]); \
+               } \
+       else \
+               (r)->top=0; \
+       (r)->neg=(a)->neg; \
+       (r)->flags|=BN_FLG_STATIC_DATA; \
+       bn_set_max(r); \
        }
 
 /* #define bn_expand(n,b) ((((b)/BN_BITS2) <= (n)->max)?(n):bn_expand2((n),(b))) */
@@ -175,6 +226,17 @@ extern "C" {
 
 #endif
 
+extern int bn_limit_bits;
+extern int bn_limit_num;        /* (1<<bn_limit_bits) */
+/* Recursive 'low' limit */
+extern int bn_limit_bits_low;
+extern int bn_limit_num_low;    /* (1<<bn_limit_bits_low) */
+/* Do modified 'high' part calculation' */
+extern int bn_limit_bits_high;
+extern int bn_limit_num_high;   /* (1<<bn_limit_bits_high) */
+extern int bn_limit_bits_mont;
+extern int bn_limit_num_mont;   /* (1<<bn_limit_bits_mont) */
+
 #ifndef NOPROTO
 
 BIGNUM *bn_expand2(BIGNUM *b, int bits);
@@ -197,3 +259,8 @@ BN_ULONG bn_add_words();
 #endif
 
 #endif
+
+void bn_mul_low_recursive(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b,int n2,BN_ULONG *t);
+void bn_mul_high(BN_ULONG *r,BN_ULONG *a,BN_ULONG *b,BN_ULONG *l,int n2, BN_ULONG *t);
+
+
index bfe7628ad4c253f2bfb27497cf39bdbe4ed6b8f2..7ea216f9192f1c5faed5d3f0d11e21292d16e5b6 100644 (file)
 #include "cryptlib.h"
 #include "bn_lcl.h"
 
-char *BN_version="Big Number part of SSLeay 0.9.0b 29-Jun-1998";
+char *BN_version="Big Number part of SSLeay 0.9.1a 06-Jul-1998";
+
+/* For a 32 bit machine
+ * 2 -   4 ==  128
+ * 3 -   8 ==  256
+ * 4 -  16 ==  512
+ * 5 -  32 == 1024
+ * 6 -  64 == 2048
+ * 7 - 128 == 4096
+ * 8 - 256 == 8192
+ */
+int bn_limit_bits=0;
+int bn_limit_num=8;        /* (1<<bn_limit_bits) */
+int bn_limit_bits_low=0;
+int bn_limit_num_low=8;    /* (1<<bn_limit_bits_low) */
+int bn_limit_bits_high=0;
+int bn_limit_num_high=8;   /* (1<<bn_limit_bits_high) */
+int bn_limit_bits_mont=0;
+int bn_limit_num_mont=8;   /* (1<<bn_limit_bits_mont) */
+
+void BN_set_params(mult,high,low,mont)
+int mult,high,low,mont;
+       {
+       if (mult >= 0)
+               {
+               if (mult > (sizeof(int)*8)-1)
+                       mult=sizeof(int)*8-1;
+               bn_limit_bits=mult;
+               bn_limit_num=1<<mult;
+               }
+       if (high >= 0)
+               {
+               if (high > (sizeof(int)*8)-1)
+                       high=sizeof(int)*8-1;
+               bn_limit_bits_high=high;
+               bn_limit_num_high=1<<high;
+               }
+       if (low >= 0)
+               {
+               if (low > (sizeof(int)*8)-1)
+                       low=sizeof(int)*8-1;
+               bn_limit_bits_low=low;
+               bn_limit_num_low=1<<low;
+               }
+       if (mont >= 0)
+               {
+               if (mont > (sizeof(int)*8)-1)
+                       mont=sizeof(int)*8-1;
+               bn_limit_bits_mont=mont;
+               bn_limit_num_mont=1<<mont;
+               }
+       }
+
+int BN_get_params(which)
+int which;
+       {
+       if      (which == 0) return(bn_limit_bits);
+       else if (which == 1) return(bn_limit_bits_high);
+       else if (which == 2) return(bn_limit_bits_low);
+       else if (which == 3) return(bn_limit_bits_mont);
+       else return(0);
+       }
 
 BIGNUM *BN_value_one()
        {
@@ -111,24 +172,24 @@ BN_ULONG l;
                8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
                };
 
-#ifdef SIXTY_FOUR_BIT_LONG
+#if defined(SIXTY_FOUR_BIT_LONG)
        if (l & 0xffffffff00000000L)
                {
                if (l & 0xffff000000000000L)
                        {
                        if (l & 0xff00000000000000L)
                                {
-                               return(bits[l>>56]+56);
+                               return(bits[(int)(l>>56)]+56);
                                }
-                       else    return(bits[l>>48]+48);
+                       else    return(bits[(int)(l>>48)]+48);
                        }
                else
                        {
                        if (l & 0x0000ff0000000000L)
                                {
-                               return(bits[l>>40]+40);
+                               return(bits[(int)(l>>40)]+40);
                                }
-                       else    return(bits[l>>32]+32);
+                       else    return(bits[(int)(l>>32)]+32);
                        }
                }
        else
@@ -140,17 +201,17 @@ BN_ULONG l;
                        {
                        if (l & 0xff00000000000000LL)
                                {
-                               return(bits[l>>56]+56);
+                               return(bits[(int)(l>>56)]+56);
                                }
-                       else    return(bits[l>>48]+48);
+                       else    return(bits[(int)(l>>48)]+48);
                        }
                else
                        {
                        if (l & 0x0000ff0000000000LL)
                                {
-                               return(bits[l>>40]+40);
+                               return(bits[(int)(l>>40)]+40);
                                }
-                       else    return(bits[l>>32]+32);
+                       else    return(bits[(int)(l>>32)]+32);
                        }
                }
        else
@@ -161,18 +222,18 @@ BN_ULONG l;
                if (l & 0xffff0000L)
                        {
                        if (l & 0xff000000L)
-                               return(bits[l>>24L]+24);
-                       else    return(bits[l>>16L]+16);
+                               return(bits[(int)(l>>24L)]+24);
+                       else    return(bits[(int)(l>>16L)]+16);
                        }
                else
 #endif
                        {
 #if defined(SIXTEEN_BIT) || defined(THIRTY_TWO_BIT) || defined(SIXTY_FOUR_BIT) || defined(SIXTY_FOUR_BIT_LONG)
                        if (l & 0xff00L)
-                               return(bits[l>>8]+8);
+                               return(bits[(int)(l>>8)]+8);
                        else    
 #endif
-                               return(bits[l   ]  );
+                               return(bits[(int)(l   )]  );
                        }
                }
        }
@@ -183,6 +244,8 @@ BIGNUM *a;
        BN_ULONG l;
        int i;
 
+       bn_check_top(a);
+
        if (a->top == 0) return(0);
        l=a->d[a->top-1];
        i=(a->top-1)*BN_BITS2;
@@ -199,74 +262,78 @@ BIGNUM *a;
 void BN_clear_free(a)
 BIGNUM *a;
        {
+       int i;
+
        if (a == NULL) return;
        if (a->d != NULL)
                {
                memset(a->d,0,a->max*sizeof(a->d[0]));
-               Free(a->d);
+               if (!(BN_get_flags(a,BN_FLG_STATIC_DATA)))
+                       Free(a->d);
                }
+       i=BN_get_flags(a,BN_FLG_MALLOCED);
        memset(a,0,sizeof(BIGNUM));
-       Free(a);
+       if (i)
+               Free(a);
        }
 
 void BN_free(a)
 BIGNUM *a;
        {
        if (a == NULL) return;
-       if (a->d != NULL) Free(a->d);
-       Free(a);
+       if ((a->d != NULL) && !(BN_get_flags(a,BN_FLG_STATIC_DATA)))
+               Free(a->d);
+       a->flags|=BN_FLG_FREE; /* REMOVE? */
+       if (a->flags & BN_FLG_MALLOCED)
+               Free(a);
+       }
+
+void BN_init(a)
+BIGNUM *a;
+       {
+       memset(a,0,sizeof(BIGNUM));
        }
 
 BIGNUM *BN_new()
        {
        BIGNUM *ret;
-       BN_ULONG *p;
 
-       ret=(BIGNUM *)Malloc(sizeof(BIGNUM));
-       if (ret == NULL) goto err;
+       if ((ret=(BIGNUM *)Malloc(sizeof(BIGNUM))) == NULL)
+               {
+               BNerr(BN_F_BN_NEW,ERR_R_MALLOC_FAILURE);
+               return(NULL);
+               }
+       ret->flags=BN_FLG_MALLOCED;
        ret->top=0;
        ret->neg=0;
-       ret->max=(BN_DEFAULT_BITS/BN_BITS2);
-       p=(BN_ULONG *)Malloc(sizeof(BN_ULONG)*(ret->max+1));
-       if (p == NULL) goto err;
-       ret->d=p;
-
-       memset(p,0,(ret->max+1)*sizeof(p[0]));
+       ret->max=0;
+       ret->d=NULL;
        return(ret);
-err:
-       BNerr(BN_F_BN_NEW,ERR_R_MALLOC_FAILURE);
-       return(NULL);
        }
 
+
 BN_CTX *BN_CTX_new()
        {
        BN_CTX *ret;
-       BIGNUM *n;
-       int i,j;
 
        ret=(BN_CTX *)Malloc(sizeof(BN_CTX));
-       if (ret == NULL) goto err2;
-
-       for (i=0; i<BN_CTX_NUM; i++)
+       if (ret == NULL)
                {
-               n=BN_new();
-               if (n == NULL) goto err;
-               ret->bn[i]=n;
+               BNerr(BN_F_BN_CTX_NEW,ERR_R_MALLOC_FAILURE);
+               return(NULL);
                }
 
-       /* There is actually an extra one, this is for debugging my
-        * stuff */
-       ret->bn[BN_CTX_NUM]=NULL;
-
-       ret->tos=0;
+       BN_CTX_init(ret);
+       ret->flags=BN_FLG_MALLOCED;
        return(ret);
-err:
-       for (j=0; j<i; j++)
-               BN_free(ret->bn[j]);
-       Free(ret);
-err2:
-       BNerr(BN_F_BN_CTX_NEW,ERR_R_MALLOC_FAILURE);
-       return(NULL);
+       }
+
+void BN_CTX_init(ctx)
+BN_CTX *ctx;
+       {
+       memset(ctx,0,sizeof(BN_CTX));
+       ctx->tos=0;
+       ctx->flags=0;
        }
 
 void BN_CTX_free(c)
@@ -275,26 +342,98 @@ BN_CTX *c;
        int i;
 
        for (i=0; i<BN_CTX_NUM; i++)
-               BN_clear_free(c->bn[i]);
-       Free(c);
+               BN_clear_free(&(c->bn[i]));
+       if (c->flags & BN_FLG_MALLOCED)
+               Free(c);
        }
 
 BIGNUM *bn_expand2(b, words)
 BIGNUM *b;
 int words;
        {
-       BN_ULONG *p;
+       BN_ULONG *A,*B,*a;
+       int i,j;
+
+       bn_check_top(b);
 
        if (words > b->max)
                {
-               p=(BN_ULONG *)Realloc(b->d,sizeof(BN_ULONG)*(words+1));
-               if (p == NULL)
+               bn_check_top(b);        
+               if (BN_get_flags(b,BN_FLG_STATIC_DATA))
+                       {
+                       BNerr(BN_F_BN_EXPAND2,BN_R_EXPAND_ON_STATIC_BIGNUM_DATA);
+                       return(NULL);
+                       }
+               a=A=(BN_ULONG *)Malloc(sizeof(BN_ULONG)*(words+1));
+               if (A == NULL)
                        {
                        BNerr(BN_F_BN_EXPAND2,ERR_R_MALLOC_FAILURE);
                        return(NULL);
                        }
-               b->d=p;
-               memset(&(p[b->max]),0,((words+1)-b->max)*sizeof(BN_ULONG));
+memset(A,0x5c,sizeof(BN_ULONG)*(words+1));
+#if 1
+               B=b->d;
+               if (B != NULL)
+                       {
+                       for (i=b->top&(~7); i>0; i-=8)
+                               {
+                               A[0]=B[0]; A[1]=B[1]; A[2]=B[2]; A[3]=B[3];
+                               A[4]=B[4]; A[5]=B[5]; A[6]=B[6]; A[7]=B[7];
+                               A+=8;
+                               B+=8;
+                               }
+                       switch (b->top&7)
+                               {
+                       case 7:
+                               A[6]=B[6];
+                       case 6:
+                               A[5]=B[5];
+                       case 5:
+                               A[4]=B[4];
+                       case 4:
+                               A[3]=B[3];
+                       case 3:
+                               A[2]=B[2];
+                       case 2:
+                               A[1]=B[1];
+                       case 1:
+                               A[0]=B[0];
+                       case 0:
+                               /* I need the 'case 0' entry for utrix cc.
+                                * If the optimiser is turned on, it does the
+                                * switch table by doing
+                                * a=top&7
+                                * a--;
+                                * goto jump_table[a];
+                                * If top is 0, this makes us jump to 0xffffffc 
+                                * which is rather bad :-(.
+                                * eric 23-Apr-1998
+                                */
+                               ;
+                               }
+                       B= &(b->d[b->top]);
+                       j=b->max-8;
+                       for (i=b->top; i<j; i+=8)
+                               {
+                               B[0]=0; B[1]=0; B[2]=0; B[3]=0;
+                               B[4]=0; B[5]=0; B[6]=0; B[7]=0;
+                               B+=8;
+                               }
+                       for (j+=8; i<j; i++)
+                               {
+                               B[0]=0;
+                               B++;
+                               }
+#else
+                       memcpy(a->d,b->d,sizeof(b->d[0])*b->top);
+#endif
+               
+/*             memset(&(p[b->max]),0,((words+1)-b->max)*sizeof(BN_ULONG)); */
+/*     { int i; for (i=b->max; i<words+1; i++) p[i]=i;} */
+                       Free(b->d);
+                       }
+
+               b->d=a;
                b->max=words;
                }
        return(b);
@@ -305,6 +444,8 @@ BIGNUM *a;
        {
        BIGNUM *r;
 
+       bn_check_top(a);
+
        r=BN_new();
        if (r == NULL) return(NULL);
        return((BIGNUM *)BN_copy(r,a));
@@ -317,6 +458,8 @@ BIGNUM *b;
        int i;
        BN_ULONG *A,*B;
 
+       bn_check_top(b);
+
        if (a == b) return(a);
        if (bn_wexpand(a,b->top) == NULL) return(NULL);
 
@@ -352,6 +495,18 @@ BIGNUM *b;
                A[1]=B[1];
        case 1:
                A[0]=B[0];
+        case 0:
+               /* I need the 'case 0' entry for utrix cc.
+                * If the optimiser is turned on, it does the
+                * switch table by doing
+                * a=top&7
+                * a--;
+                * goto jump_table[a];
+                * If top is 0, this makes us jump to 0xffffffc which is
+                * rather bad :-(.
+                * eric 23-Apr-1998
+                */
+               ;
                }
 #else
        memcpy(a->d,b->d,sizeof(b->d[0])*b->top);
@@ -359,7 +514,7 @@ BIGNUM *b;
 
 /*     memset(&(a->d[b->top]),0,sizeof(a->d[0])*(a->max-b->top));*/
        a->top=b->top;
-       if (a->top == 0)
+       if ((a->top == 0) && (a->d != NULL))
                a->d[0]=0;
        a->neg=b->neg;
        return(a);
@@ -368,24 +523,21 @@ BIGNUM *b;
 void BN_clear(a)
 BIGNUM *a;
        {
-       memset(a->d,0,a->max*sizeof(a->d[0]));
+       if (a->d != NULL)
+               memset(a->d,0,a->max*sizeof(a->d[0]));
        a->top=0;
        a->neg=0;
        }
 
-unsigned long BN_get_word(a)
+BN_ULONG BN_get_word(a)
 BIGNUM *a;
        {
        int i,n;
-       unsigned long ret=0;
+       BN_ULONG ret=0;
 
        n=BN_num_bytes(a);
-       if (n > sizeof(unsigned long))
-#ifdef SIXTY_FOUR_BIT_LONG
+       if (n > sizeof(BN_ULONG))
                return(BN_MASK2);
-#else
-               return(0xFFFFFFFFL);
-#endif
        for (i=a->top-1; i>=0; i--)
                {
 #ifndef SIXTY_FOUR_BIT /* the data item > unsigned long */
@@ -399,12 +551,12 @@ BIGNUM *a;
 
 int BN_set_word(a,w)
 BIGNUM *a;
-unsigned long w;
+BN_ULONG w;
        {
        int i,n;
-       if (bn_expand(a,sizeof(unsigned long)*8) == NULL) return(0);
+       if (bn_expand(a,sizeof(BN_ULONG)*8) == NULL) return(0);
 
-       n=sizeof(unsigned long)/BN_BYTES;
+       n=sizeof(BN_ULONG)/BN_BYTES;
        a->neg=0;
        a->top=0;
        a->d[0]=(BN_ULONG)w&BN_MASK2;
@@ -488,6 +640,9 @@ BIGNUM *b;
        int i;
        BN_ULONG t1,t2,*ap,*bp;
 
+       bn_check_top(a);
+       bn_check_top(b);
+
        i=a->top-b->top;
        if (i != 0) return(i);
        ap=a->d;
@@ -519,6 +674,10 @@ BIGNUM *b;
                else
                        return(0);
                }
+
+       bn_check_top(a);
+       bn_check_top(b);
+
        if (a->neg != b->neg)
                {
                if (a->neg)
@@ -545,13 +704,15 @@ int BN_set_bit(a, n)
 BIGNUM *a;
 int n;
        {
-       int i,j;
+       int i,j,k;
 
        i=n/BN_BITS2;
        j=n%BN_BITS2;
        if (a->top <= i)
                {
-               if (bn_expand(a,n) == NULL) return(0);
+               if (bn_wexpand(a,i+1) == NULL) return(0);
+               for(k=a->top; k<i+1; k++)
+                       a->d[k]=0;
                a->top=i+1;
                }
 
@@ -570,6 +731,7 @@ int n;
        if (a->top <= i) return(0);
 
        a->d[i]&=(~(1L<<j));
+       bn_fix_top(a);
        return(1);
        }
 
@@ -601,11 +763,27 @@ int n;
                {
                a->top=w+1;
                a->d[w]&= ~(BN_MASK2<<b);
-               while ((w >= 0) && (a->d[w] == 0))
-                       {
-                       a->top--;
-                       w--;
-                       }
                }
+       bn_fix_top(a);
        return(1);
        }
+
+int bn_cmp_words(a,b,n)
+BN_ULONG *a,*b;
+int n;
+       {
+       int i;
+       BN_ULONG aa,bb;
+
+       aa=a[n-1];
+       bb=b[n-1];
+       if (aa != bb) return((aa > bb)?1:-1);
+       for (i=n-2; i>=0; i--)
+               {
+               aa=a[i];
+               bb=b[i];
+               if (aa != bb) return((aa > bb)?1:-1);
+               }
+       return(0);
+       }
+
index e435df61f86130f3cfe4b527b91f893c1c33639f..e0aa3c769d227dc5f58e9052627b6edb070819d4 100644 (file)
 #include "cryptlib.h"
 #include "bn_lcl.h"
 
+#define MONT_WORD
+
 int BN_mod_mul_montgomery(r,a,b,mont,ctx)
 BIGNUM *r,*a,*b;
 BN_MONT_CTX *mont;
 BN_CTX *ctx;
        {
-       BIGNUM *tmp;
+       BIGNUM *tmp,*tmp2;
+
+        tmp= &(ctx->bn[ctx->tos]);
+        tmp2= &(ctx->bn[ctx->tos]);
+       ctx->tos+=2;
 
-        tmp=ctx->bn[ctx->tos++];
+       bn_check_top(tmp);
+       bn_check_top(tmp2);
 
        if (a == b)
                {
+#if 0
+               bn_wexpand(tmp,a->top*2);
+               bn_wexpand(tmp2,a->top*4);
+               bn_sqr_recursive(tmp->d,a->d,a->top,tmp2->d);
+               tmp->top=a->top*2;
+               if (tmp->d[tmp->top-1] == 0)
+                       tmp->top--;
+#else
                if (!BN_sqr(tmp,a,ctx)) goto err;
+#endif
                }
        else
                {
-               if (!BN_mul(tmp,a,b)) goto err;
+               if (!BN_mul(tmp,a,b,ctx)) goto err;
                }
        /* reduce from aRR to aR */
        if (!BN_from_montgomery(r,tmp,mont,ctx)) goto err;
-       ctx->tos--;
+       ctx->tos-=2;
        return(1);
 err:
        return(0);
        }
 
-#define MONT_WORD
-
-#ifdef MONT_WORD
 int BN_from_montgomery(ret,a,mont,ctx)
 BIGNUM *ret;
 BIGNUM *a;
 BN_MONT_CTX *mont;
 BN_CTX *ctx;
        {
-       BIGNUM *n,*t1,*r;
-       BN_ULONG *ap,*np,*rp,n0,v;
-       int al,nl,max,i,x,ri;
-       int retn=0;
+#ifdef BN_RECURSION
+       if (mont->use_word)
+#endif
+               {
+               BIGNUM *n,*r;
+               BN_ULONG *ap,*np,*rp,n0,v,*nrp;
+               int al,nl,max,i,x,ri;
+               int retn=0;
 
-       t1=ctx->bn[ctx->tos];
-       r=ctx->bn[ctx->tos+1];
+               r= &(ctx->bn[ctx->tos]);
 
-       if (!BN_copy(r,a)) goto err;
-       n=mont->N;
+               if (!BN_copy(r,a)) goto err1;
+               n= &(mont->N);
 
-       ap=a->d;
-       /* mont->ri is the size of mont->N in bits/words */
-       al=ri=mont->ri/BN_BITS2;
+               ap=a->d;
+               /* mont->ri is the size of mont->N in bits/words */
+               al=ri=mont->ri/BN_BITS2;
 
-       nl=n->top;
-       if ((al == 0) || (nl == 0)) { r->top=0; return(1); }
+               nl=n->top;
+               if ((al == 0) || (nl == 0)) { r->top=0; return(1); }
 
-       max=(nl+al+1); /* allow for overflow (no?) XXX */
-       if (bn_wexpand(r,max) == NULL) goto err;
-       if (bn_wexpand(ret,max) == NULL) goto err;
+               max=(nl+al+1); /* allow for overflow (no?) XXX */
+               if (bn_wexpand(r,max) == NULL) goto err1;
+               if (bn_wexpand(ret,max) == NULL) goto err1;
 
-       r->neg=a->neg^n->neg;
-       np=n->d;
-       rp=r->d;
+               r->neg=a->neg^n->neg;
+               np=n->d;
+               rp=r->d;
+               nrp= &(r->d[nl]);
 
-       /* clear the top words of T */
+               /* clear the top words of T */
 #if 1
-       for (i=r->top; i<max; i++) /* memset? XXX */
-               r->d[i]=0;
+               for (i=r->top; i<max; i++) /* memset? XXX */
+                       r->d[i]=0;
 #else
-       memset(&(r->d[r->top]),0,(max-r->top)*sizeof(BN_ULONG)); 
+               memset(&(r->d[r->top]),0,(max-r->top)*sizeof(BN_ULONG)); 
 #endif
 
-       r->top=max;
-       n0=mont->n0;
+               r->top=max;
+               n0=mont->n0;
 
-       for (i=0; i<nl; i++)
-               {
-#if 0
-               int x1,x2;
-
-               if (i+4 > nl)
+#ifdef BN_COUNT
+printf("word BN_from_montgomery %d * %d\n",nl,nl);
+#endif
+               for (i=0; i<nl; i++)
                        {
-                       x2=nl;
-                       x1=0;
+                       v=bn_mul_add_words(rp,np,nl,(rp[0]*n0)&BN_MASK2);
+                       nrp++;
+                       rp++;
+                       if (((nrp[-1]+=v)&BN_MASK2) >= v)
+                               continue;
+                       else
+                               {
+                               if (((++nrp[0])&BN_MASK2) != 0) continue;
+                               if (((++nrp[1])&BN_MASK2) != 0) continue;
+                               for (x=2; (((++nrp[x])&BN_MASK2) == 0); x++) ;
+                               }
                        }
+               bn_fix_top(r);
+
+               /* mont->ri will be a multiple of the word size */
+#if 0
+               BN_rshift(ret,r,mont->ri);
+#else
+               x=ri;
+               rp=ret->d;
+               ap= &(r->d[x]);
+               if (r->top < x)
+                       al=0;
                else
+                       al=r->top-x;
+               ret->top=al;
+               al-=4;
+               for (i=0; i<al; i+=4)
                        {
-                       x2=i+4;
-                       x1=nl-x2;
+                       BN_ULONG t1,t2,t3,t4;
+
+                       t1=ap[i+0];
+                       t2=ap[i+1];
+                       t3=ap[i+2];
+                       t4=ap[i+3];
+                       rp[i+0]=t1;
+                       rp[i+1]=t2;
+                       rp[i+2]=t3;
+                       rp[i+3]=t4;
                        }
-               v=bn_mul_add_words(&(rp[x1]),&(np[x1]),x2,(rp[x1]*n0)&BN_MASK2);
-#else
-               v=bn_mul_add_words(rp,np,nl,(rp[0]*n0)&BN_MASK2);
+               al+=4;
+               for (; i<al; i++)
+                       rp[i]=ap[i];
 #endif
 
-               if (((rp[nl]+=v)&BN_MASK2) < v)
+               if (BN_ucmp(ret, &(mont->N)) >= 0)
                        {
-                       for (x=(nl+1); (((++rp[x])&BN_MASK2) == 0); x++)
-                               ;
+                       BN_usub(ret,ret,&(mont->N)); /* XXX */
                        }
-               rp++;
+               retn=1;
+err1:
+               return(retn);
                }
-       while (r->d[r->top-1] == 0)
-               r->top--;
-
-       /* mont->ri will be a multiple of the word size */
-#if 0
-       BN_rshift(ret,r,mont->ri);
-#else
-       ap=r->d;
-       rp=ret->d;
-       x=ri;
-       al=r->top-x;
-       for (i=0; i<al; i++)
+#ifdef BN_RECURSION
+       else /* bignum version */ 
                {
-               rp[i]=ap[i+x];
-               }
-       ret->top=al;
+               BIGNUM *t1,*t2,*t3;
+               int j,i;
+
+#ifdef BN_COUNT
+printf("number BN_from_montgomery\n");
 #endif
 
-       if (BN_ucmp(ret,mont->N) >= 0)
-               {
-               bn_qsub(ret,ret,mont->N); /* XXX */
-               }
-       retn=1;
-err:
-       return(retn);
-       }
-#else
-int BN_from_montgomery(r,a,mont,ctx)
-BIGNUM *r;
-BIGNUM *a;
-BN_MONT_CTX *mont;
-BN_CTX *ctx;
-       {
-       BIGNUM *t1,*t2;
+               t1= &(ctx->bn[ctx->tos]);
+               t2= &(ctx->bn[ctx->tos+1]);
+               t3= &(ctx->bn[ctx->tos+2]);
 
-       t1=ctx->bn[ctx->tos];
-       t2=ctx->bn[ctx->tos+1];
+               i=mont->Ni.top;
+               bn_wexpand(ret,i); /* perhaps only i*2 */
+               bn_wexpand(t1,i*4); /* perhaps only i*2 */
+               bn_wexpand(t2,i*2); /* perhaps only i   */
 
-       if (!BN_copy(t1,a)) goto err;
-       /* can cheat */
-       BN_mask_bits(t1,mont->ri);
+               bn_mul_low_recursive(t2->d,a->d,mont->Ni.d,i,t1->d);
 
-       if (!BN_mul(t2,t1,mont->Ni)) goto err;
-       BN_mask_bits(t2,mont->ri);
+               BN_zero(t3);
+               BN_set_bit(t3,mont->N.top*BN_BITS2);
+               bn_sub_words(t3->d,t3->d,a->d,i);
+               bn_mul_high(ret->d,t2->d,mont->N.d,t3->d,i,t1->d);
 
-       if (!BN_mul(t1,t2,mont->N)) goto err;
-       if (!BN_add(t2,a,t1)) goto err;
-       BN_rshift(r,t2,mont->ri);
+               /* hmm... if a is between i and 2*i, things are bad */
+               if (a->top > i)
+                       {
+                       j=bn_add_words(ret->d,ret->d,&(a->d[i]),i);
+                       if (j) /* overflow */
+                               bn_sub_words(ret->d,ret->d,mont->N.d,i);
+                       }
+               ret->top=i;
+               bn_fix_top(ret);
+               if (a->d[0])
+                       BN_add_word(ret,1); /* Always? */
+               else    /* Very very rare */
+                       {
+                       for (i=1; i<mont->N.top-1; i++)
+                               {
+                               if (a->d[i])
+                                       {
+                                       BN_add_word(ret,1); /* Always? */
+                                       break;
+                                       }
+                               }
+                       }
 
-       if (BN_ucmp(r,mont->N) >= 0)
-               bn_qsub(r,r,mont->N);
+               if (BN_ucmp(ret,&(mont->N)) >= 0)
+                       BN_usub(ret,ret,&(mont->N));
 
-       return(1);
-err:
-       return(0);
-       }
+               return(1);
+               }
 #endif
+       }
 
 BN_MONT_CTX *BN_MONT_CTX_new()
        {
@@ -222,25 +269,31 @@ BN_MONT_CTX *BN_MONT_CTX_new()
 
        if ((ret=(BN_MONT_CTX *)Malloc(sizeof(BN_MONT_CTX))) == NULL)
                return(NULL);
-       ret->ri=0;
-       ret->RR=BN_new();
-       ret->N=BN_new();
-       ret->Ni=NULL;
-       if ((ret->RR == NULL) || (ret->N == NULL))
-               {
-               BN_MONT_CTX_free(ret);
-               return(NULL);
-               }
+
+       BN_MONT_CTX_init(ret);
+       ret->flags=BN_FLG_MALLOCED;
        return(ret);
        }
 
+void BN_MONT_CTX_init(ctx)
+BN_MONT_CTX *ctx;
+       {
+       ctx->use_word=0;
+       ctx->ri=0;
+       BN_init(&(ctx->RR));
+       BN_init(&(ctx->N));
+       BN_init(&(ctx->Ni));
+       ctx->flags=0;
+       }
+
 void BN_MONT_CTX_free(mont)
 BN_MONT_CTX *mont;
        {
-       if (mont->RR != NULL) BN_free(mont->RR);
-       if (mont->N != NULL) BN_free(mont->N);
-       if (mont->Ni != NULL) BN_free(mont->Ni);
-       Free(mont);
+       BN_free(&(mont->RR));
+       BN_free(&(mont->N));
+       BN_free(&(mont->Ni));
+       if (mont->flags & BN_FLG_MALLOCED)
+               Free(mont);
        }
 
 int BN_MONT_CTX_set(mont,mod,ctx)
@@ -248,59 +301,109 @@ BN_MONT_CTX *mont;
 BIGNUM *mod;
 BN_CTX *ctx;
        {
-       BIGNUM *Ri=NULL,*R=NULL;
-
-       if (mont->RR == NULL) mont->RR=BN_new();
-       if (mont->N == NULL)  mont->N=BN_new();
-
-       R=mont->RR;                                     /* grab RR as a temp */
-       BN_copy(mont->N,mod);                           /* Set N */
-
-#ifdef MONT_WORD
-{
-       BIGNUM tmod;
-       BN_ULONG buf[2];
-       /* int z; */
-
-       mont->ri=(BN_num_bits(mod)+(BN_BITS2-1))/BN_BITS2*BN_BITS2;
-       BN_lshift(R,BN_value_one(),BN_BITS2);           /* R */
-       /* I was bad, this modification of a passed variable was
-        * breaking the multithreaded stuff :-(
-        * z=mod->top;
-        * mod->top=1; */
-
-       buf[0]=mod->d[0];
-       buf[1]=0;
-       tmod.d=buf;
-       tmod.top=1;
-       tmod.max=mod->max;
-       tmod.neg=mod->neg;
-
-       if ((Ri=BN_mod_inverse(R,&tmod,ctx)) == NULL) goto err; /* Ri */
-       BN_lshift(Ri,Ri,BN_BITS2);                      /* R*Ri */
-       bn_qsub(Ri,Ri,BN_value_one());                  /* R*Ri - 1 */
-       BN_div(Ri,NULL,Ri,&tmod,ctx);
-       mont->n0=Ri->d[0];
-       BN_free(Ri);
-       /* mod->top=z; */
-}
+       BIGNUM Ri,*R;
+
+       BN_init(&Ri);
+       R= &(mont->RR);                                 /* grab RR as a temp */
+       BN_copy(&(mont->N),mod);                        /* Set N */
+
+#ifdef BN_RECURSION
+       if (mont->N.top < BN_MONT_CTX_SET_SIZE_WORD)
+#endif
+               {
+               BIGNUM tmod;
+               BN_ULONG buf[2];
+
+               mont->use_word=1;
+
+               mont->ri=(BN_num_bits(mod)+(BN_BITS2-1))/BN_BITS2*BN_BITS2;
+               BN_zero(R);
+               BN_set_bit(R,BN_BITS2);
+               /* I was bad, this modification of a passed variable was
+                * breaking the multithreaded stuff :-(
+                * z=mod->top;
+                * mod->top=1; */
+
+               buf[0]=mod->d[0];
+               buf[1]=0;
+               tmod.d=buf;
+               tmod.top=1;
+               tmod.max=mod->max;
+               tmod.neg=mod->neg;
+
+               if ((BN_mod_inverse(&Ri,R,&tmod,ctx)) == NULL)
+                       goto err;
+               BN_lshift(&Ri,&Ri,BN_BITS2);                    /* R*Ri */
+               if (!BN_is_zero(&Ri))
+                       {
+#if 1
+                       BN_sub_word(&Ri,1);
+#else
+                       BN_usub(&Ri,&Ri,BN_value_one());        /* R*Ri - 1 */
+#endif
+                       }
+               else
+                       {
+                       /* This is not common..., 1 in BN_MASK2,
+                        * It happens when buf[0] was == 1.  So for 8 bit,
+                        * this is 1/256, 16bit, 1 in 2^16 etc.
+                        */
+                       BN_set_word(&Ri,BN_MASK2);
+                       }
+               BN_div(&Ri,NULL,&Ri,&tmod,ctx);
+               mont->n0=Ri.d[0];
+               BN_free(&Ri);
+               /* mod->top=z; */
+               }
+#ifdef BN_RECURSION
+       else
+               {
+               mont->use_word=0;
+               mont->ri=(BN_num_bits(mod)+(BN_BITS2-1))/BN_BITS2*BN_BITS2;
+#if 1
+               BN_zero(R);
+               BN_set_bit(R,mont->ri);
 #else
-       mont->ri=BN_num_bits(mod);
-       BN_lshift(R,BN_value_one(),mont->ri);                   /* R */
-       if ((Ri=BN_mod_inverse(R,mod,ctx)) == NULL) goto err;   /* Ri */
-       BN_lshift(Ri,Ri,mont->ri);                              /* R*Ri */
-       bn_qsub(Ri,Ri,BN_value_one());                          /* R*Ri - 1 */
-       BN_div(Ri,NULL,Ri,mod,ctx);
-       if (mont->Ni != NULL) BN_free(mont->Ni);
-       mont->Ni=Ri;                                    /* Ni=(R*Ri-1)/N */
+               BN_lshift(R,BN_value_one(),mont->ri);   /* R */
+#endif
+               if ((BN_mod_inverse(&Ri,R,mod,ctx)) == NULL)
+                       goto err;
+               BN_lshift(&Ri,&Ri,mont->ri);            /* R*Ri */
+#if 1
+               BN_sub_word(&Ri,1);
+#else
+               BN_usub(&Ri,&Ri,BN_value_one());        /* R*Ri - 1 */
+#endif
+               BN_div(&(mont->Ni),NULL,&Ri,mod,ctx);
+               BN_free(&Ri);
+               }
 #endif
 
        /* setup RR for conversions */
+#if 1
+       BN_zero(&(mont->RR));
+       BN_set_bit(&(mont->RR),mont->ri*2);
+#else
        BN_lshift(mont->RR,BN_value_one(),mont->ri*2);
-       BN_mod(mont->RR,mont->RR,mont->N,ctx);
+#endif
+       BN_mod(&(mont->RR),&(mont->RR),&(mont->N),ctx);
 
        return(1);
 err:
        return(0);
        }
 
+BN_MONT_CTX *BN_MONT_CTX_copy(to, from)
+BN_MONT_CTX *to, *from;
+       {
+       if (to == from) return(to);
+
+       BN_copy(&(to->RR),&(from->RR));
+       BN_copy(&(to->N),&(from->N));
+       BN_copy(&(to->Ni),&(from->Ni));
+       to->use_word=from->use_word;
+       to->ri=from->ri;
+       to->n0=from->n0;
+       return(to);
+       }
+
index 53945c105717981d0330e0380400bc315f9bfb95..84b0317081c0147f4c701ea7a8f71422374bf034 100644 (file)
@@ -103,7 +103,7 @@ BIGNUM *a;
                BNerr(BN_F_BN_MPI2BN,BN_R_INVALID_LENGTH);
                return(NULL);
                }
-       len=(d[0]<<24)|(d[1]<<16)|(d[2]<<8)|d[3];
+       len=((long)d[0]<<24)|((long)d[1]<<16)|((int)d[2]<<8)|(int)d[3];
        if ((len+4) != n)
                {
                BNerr(BN_F_BN_MPI2BN,BN_R_ENCODING_ERROR);
index d0c04e1d4b9b9043e67510424ad958bab08245cb..fc7bf974fd162299bce6a4f2576d93f10bc63ad7 100644 (file)
 #include "cryptlib.h"
 #include "bn_lcl.h"
 
-/* r must be different to a and b */
-/* int BN_mmul(r, a, b) */
-int BN_mul(r, a, b)
-BIGNUM *r;
-BIGNUM *a;
-BIGNUM *b;
+#ifdef BN_RECURSION
+/* r is 2*n2 words in size,
+ * a and b are both n2 words in size.
+ * n2 must be a power of 2.
+ * We multiply and return the result.
+ * t must be 2*n2 words in size
+ * We calulate
+ * a[0]*b[0]
+ * a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0])
+ * a[1]*b[1]
+ */
+void bn_mul_recursive(r,a,b,n2,t)
+BN_ULONG *r,*a,*b;
+int n2;
+BN_ULONG *t;
        {
-       int i;
-       int max,al,bl;
-       BN_ULONG *ap,*bp,*rp;
+       int n=n2/2,c1,c2;
+       unsigned int neg,zero;
+       BN_ULONG ln,lo,*p;
 
-       al=a->top;
-       bl=b->top;
-       if ((al == 0) || (bl == 0))
+#ifdef BN_COUNT
+printf(" bn_mul_recursive %d * %d\n",n2,n2);
+#endif
+#ifdef BN_MUL_COMBA
+/*     if (n2 == 4)
                {
-               r->top=0;
-               return(1);
+               bn_mul_comba4(r,a,b);
+               return;
+               }
+       else */ if (n2 == 8)
+               {
+               bn_mul_comba8(r,a,b);
+               return; 
+               }
+#endif
+       if (n2 < BN_MUL_RECURSIVE_SIZE_NORMAL)
+               {
+               /* This should not happen */
+               bn_mul_normal(r,a,n2,b,n2);
+               return;
+               }
+       /* r=(a[0]-a[1])*(b[1]-b[0]) */
+       c1=bn_cmp_words(a,&(a[n]),n);
+       c2=bn_cmp_words(&(b[n]),b,n);
+       zero=neg=0;
+       switch (c1*3+c2)
+               {
+       case -4:
+               bn_sub_words(t,      &(a[n]),a,      n); /* - */
+               bn_sub_words(&(t[n]),b,      &(b[n]),n); /* - */
+               break;
+       case -3:
+               zero=1;
+               break;
+       case -2:
+               bn_sub_words(t,      &(a[n]),a,      n); /* - */
+               bn_sub_words(&(t[n]),&(b[n]),b,      n); /* + */
+               neg=1;
+               break;
+       case -1:
+       case 0:
+       case 1:
+               zero=1;
+               break;
+       case 2:
+               bn_sub_words(t,      a,      &(a[n]),n); /* + */
+               bn_sub_words(&(t[n]),b,      &(b[n]),n); /* - */
+               neg=1;
+               break;
+       case 3:
+               zero=1;
+               break;
+       case 4:
+               bn_sub_words(t,      a,      &(a[n]),n);
+               bn_sub_words(&(t[n]),&(b[n]),b,      n);
+               break;
                }
 
-       max=(al+bl);
-       if (bn_wexpand(r,max) == NULL) return(0);
-       r->top=max;
-       r->neg=a->neg^b->neg;
-       ap=a->d;
-       bp=b->d;
-       rp=r->d;
+#ifdef BN_MUL_COMBA
+       if (n == 4)
+               {
+               if (!zero)
+                       bn_mul_comba4(&(t[n2]),t,&(t[n]));
+               else
+                       memset(&(t[n2]),0,8*sizeof(BN_ULONG));
+               
+               bn_mul_comba4(r,a,b);
+               bn_mul_comba4(&(r[n2]),&(a[n]),&(b[n]));
+               }
+       else if (n == 8)
+               {
+               if (!zero)
+                       bn_mul_comba8(&(t[n2]),t,&(t[n]));
+               else
+                       memset(&(t[n2]),0,16*sizeof(BN_ULONG));
+               
+               bn_mul_comba8(r,a,b);
+               bn_mul_comba8(&(r[n2]),&(a[n]),&(b[n]));
+               }
+       else
+#endif
+               {
+               p= &(t[n2*2]);
+               if (!zero)
+                       bn_mul_recursive(&(t[n2]),t,&(t[n]),n,p);
+               else
+                       memset(&(t[n2]),0,n2*sizeof(BN_ULONG));
+               bn_mul_recursive(r,a,b,n,p);
+               bn_mul_recursive(&(r[n2]),&(a[n]),&(b[n]),n,p);
+               }
 
-       rp[al]=bn_mul_words(rp,ap,al,*(bp++));
-       rp++;
-       for (i=1; i<bl; i++)
+       /* t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign
+        * r[10] holds (a[0]*b[0])
+        * r[32] holds (b[1]*b[1])
+        */
+
+       c1=bn_add_words(t,r,&(r[n2]),n2);
+
+       if (neg) /* if t[32] is negative */
                {
-               rp[al]=bn_mul_add_words(rp,ap,al,*(bp++));
-               rp++;
+               c1-=bn_sub_words(&(t[n2]),t,&(t[n2]),n2);
+               }
+       else
+               {
+               /* Might have a carry */
+               c1+=bn_add_words(&(t[n2]),&(t[n2]),t,n2);
                }
-       if (r->d[max-1] == 0) r->top--;
-       return(1);
-       }
 
-#if 0
-#include "stack.h"
+       /* t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1])
+        * r[10] holds (a[0]*b[0])
+        * r[32] holds (b[1]*b[1])
+        * c1 holds the carry bits
+        */
+       c1+=bn_add_words(&(r[n]),&(r[n]),&(t[n2]),n2);
+       if (c1)
+               {
+               p= &(r[n+n2]);
+               lo= *p;
+               ln=(lo+c1)&BN_MASK2;
+               *p=ln;
 
-int limit=16;
+               /* The overflow will stop before we over write
+                * words we should not overwrite */
+               if (ln < (BN_ULONG)c1)
+                       {
+                       do      {
+                               p++;
+                               lo= *p;
+                               ln=(lo+1)&BN_MASK2;
+                               *p=ln;
+                               } while (ln == 0);
+                       }
+               }
+       }
 
-typedef struct bn_pool_st
+/* n+tn is the word length
+ * t needs to be n*4 is size, as does r */
+void bn_mul_part_recursive(r,a,b,tn,n,t)
+BN_ULONG *r,*a,*b;
+int tn,n;
+BN_ULONG *t;
        {
-       int used;
-       int tos;
-       STACK *sk; 
-       } BN_POOL;
+       int i,j,n2=n*2;
+       unsigned int c1;
+       BN_ULONG ln,lo,*p;
 
-BIGNUM *BN_POOL_push(bp)
-BN_POOL *bp;
-       {
-       BIGNUM *ret;
+#ifdef BN_COUNT
+printf(" bn_mul_part_recursive %d * %d\n",tn+n,tn+n);
+#endif
+       if (n < 8)
+               {
+               i=tn+n;
+               bn_mul_normal(r,a,i,b,i);
+               return;
+               }
+
+       /* r=(a[0]-a[1])*(b[1]-b[0]) */
+       bn_sub_words(t,      a,      &(a[n]),n); /* + */
+       bn_sub_words(&(t[n]),b,      &(b[n]),n); /* - */
 
-       if (bp->used >= bp->tos)
+/*     if (n == 4)
+               {
+               bn_mul_comba4(&(t[n2]),t,&(t[n]));
+               bn_mul_comba4(r,a,b);
+               bn_mul_normal(&(r[n2]),&(a[n]),tn,&(b[n]),tn);
+               memset(&(r[n2+tn*2]),0,sizeof(BN_ULONG)*(n2-tn*2));
+               }
+       else */ if (n == 8)
                {
-               ret=BN_new();
-               sk_push(bp->sk,(char *)ret);
-               bp->tos++;
-               bp->used++;
+               bn_mul_comba8(&(t[n2]),t,&(t[n]));
+               bn_mul_comba8(r,a,b);
+               bn_mul_normal(&(r[n2]),&(a[n]),tn,&(b[n]),tn);
+               memset(&(r[n2+tn*2]),0,sizeof(BN_ULONG)*(n2-tn*2));
                }
        else
                {
-               ret=(BIGNUM *)sk_value(bp->sk,bp->used);
-               bp->used++;
+               p= &(t[n2*2]);
+               bn_mul_recursive(&(t[n2]),t,&(t[n]),n,p);
+               bn_mul_recursive(r,a,b,n,p);
+               i=n/2;
+               /* If there is only a bottom half to the number,
+                * just do it */
+               j=tn-i;
+               if (j == 0)
+                       {
+                       bn_mul_recursive(&(r[n2]),&(a[n]),&(b[n]),i,p);
+                       memset(&(r[n2+i*2]),0,sizeof(BN_ULONG)*(n2-i*2));
+                       }
+               else if (j > 0) /* eg, n == 16, i == 8 and tn == 11 */
+                               {
+                               bn_mul_part_recursive(&(r[n2]),&(a[n]),&(b[n]),
+                                       j,i,p);
+                               memset(&(r[n2+tn*2]),0,
+                                       sizeof(BN_ULONG)*(n2-tn*2));
+                               }
+               else /* (j < 0) eg, n == 16, i == 8 and tn == 5 */
+                       {
+                       memset(&(r[n2]),0,sizeof(BN_ULONG)*n2);
+                       if (tn < BN_MUL_RECURSIVE_SIZE_NORMAL)
+                               {
+                               bn_mul_normal(&(r[n2]),&(a[n]),tn,&(b[n]),tn);
+                               }
+                       else
+                               {
+                               for (;;)
+                                       {
+                                       i/=2;
+                                       if (i < tn)
+                                               {
+                                               bn_mul_part_recursive(&(r[n2]),
+                                                       &(a[n]),&(b[n]),
+                                                       tn-i,i,p);
+                                               break;
+                                               }
+                                       else if (i == tn)
+                                               {
+                                               bn_mul_recursive(&(r[n2]),
+                                                       &(a[n]),&(b[n]),
+                                                       i,p);
+                                               break;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+       /* t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign
+        * r[10] holds (a[0]*b[0])
+        * r[32] holds (b[1]*b[1])
+        */
+
+       c1=bn_add_words(t,r,&(r[n2]),n2);
+       c1-=bn_sub_words(&(t[n2]),t,&(t[n2]),n2);
+
+       /* t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1])
+        * r[10] holds (a[0]*b[0])
+        * r[32] holds (b[1]*b[1])
+        * c1 holds the carry bits
+        */
+       c1+=bn_add_words(&(r[n]),&(r[n]),&(t[n2]),n2);
+       if (c1)
+               {
+               p= &(r[n+n2]);
+               lo= *p;
+               ln=(lo+c1)&BN_MASK2;
+               *p=ln;
+
+               /* The overflow will stop before we over write
+                * words we should not overwrite */
+               if (ln < c1)
+                       {
+                       do      {
+                               p++;
+                               lo= *p;
+                               ln=(lo+1)&BN_MASK2;
+                               *p=ln;
+                               } while (ln == 0);
+                       }
                }
-       return(ret);
        }
 
-void BN_POOL_pop(bp,num)
-BN_POOL *bp;
-int num;
+/* a and b must be the same size, which is n2.
+ * r needs to be n2 words and t needs to be n2*2
+ */
+void bn_mul_low_recursive(r,a,b,n2,t)
+BN_ULONG *r,*a,*b;
+int n2;
+BN_ULONG *t;
        {
-       bp->used-=num;
+       int n=n2/2;
+
+#ifdef BN_COUNT
+printf(" bn_mul_low_recursive %d * %d\n",n2,n2);
+#endif
+
+       bn_mul_recursive(r,a,b,n,&(t[0]));
+       if (n >= BN_MUL_LOW_RECURSIVE_SIZE_NORMAL)
+               {
+               bn_mul_low_recursive(&(t[0]),&(a[0]),&(b[n]),n,&(t[n2]));
+               bn_add_words(&(r[n]),&(r[n]),&(t[0]),n);
+               bn_mul_low_recursive(&(t[0]),&(a[n]),&(b[0]),n,&(t[n2]));
+               bn_add_words(&(r[n]),&(r[n]),&(t[0]),n);
+               }
+       else
+               {
+               bn_mul_low_normal(&(t[0]),&(a[0]),&(b[n]),n);
+               bn_mul_low_normal(&(t[n]),&(a[n]),&(b[0]),n);
+               bn_add_words(&(r[n]),&(r[n]),&(t[0]),n);
+               bn_add_words(&(r[n]),&(r[n]),&(t[n]),n);
+               }
        }
 
-int BN_mul(r,a,b)
-BIGNUM *r,*a,*b;
+/* a and b must be the same size, which is n2.
+ * r needs to be n2 words and t needs to be n2*2
+ * l is the low words of the output.
+ * t needs to be n2*3
+ */
+void bn_mul_high(r,a,b,l,n2,t)
+BN_ULONG *r,*a,*b,*l;
+int n2;
+BN_ULONG *t;
        {
-       static BN_POOL bp;
-       static init=1;
+       int i,n;
+       int c1,c2;
+       int neg,oneg,zero;
+       BN_ULONG ll,lc,*lp,*mp;
+
+#ifdef BN_COUNT
+printf(" bn_mul_high %d * %d\n",n2,n2);
+#endif
+       n=(n2+1)/2;
+
+       /* Calculate (al-ah)*(bh-bl) */
+       neg=zero=0;
+       c1=bn_cmp_words(&(a[0]),&(a[n]),n);
+       c2=bn_cmp_words(&(b[n]),&(b[0]),n);
+       switch (c1*3+c2)
+               {
+       case -4:
+               bn_sub_words(&(r[0]),&(a[n]),&(a[0]),n);
+               bn_sub_words(&(r[n]),&(b[0]),&(b[n]),n);
+               break;
+       case -3:
+               zero=1;
+               break;
+       case -2:
+               bn_sub_words(&(r[0]),&(a[n]),&(a[0]),n);
+               bn_sub_words(&(r[n]),&(b[n]),&(b[0]),n);
+               neg=1;
+               break;
+       case -1:
+       case 0:
+       case 1:
+               zero=1;
+               break;
+       case 2:
+               bn_sub_words(&(r[0]),&(a[0]),&(a[n]),n);
+               bn_sub_words(&(r[n]),&(b[0]),&(b[n]),n);
+               neg=1;
+               break;
+       case 3:
+               zero=1;
+               break;
+       case 4:
+               bn_sub_words(&(r[0]),&(a[0]),&(a[n]),n);
+               bn_sub_words(&(r[n]),&(b[n]),&(b[0]),n);
+               break;
+               }
+               
+       oneg=neg;
+       /* t[10] = (a[0]-a[1])*(b[1]-b[0]) */
+       /* r[10] = (a[1]*b[1]) */
+#ifdef BN_MUL_COMBA
+       if (n == 8)
+               {
+               bn_mul_comba8(&(t[0]),&(r[0]),&(r[n]));
+               bn_mul_comba8(r,&(a[n]),&(b[n]));
+               }
+       else
+#endif
+               {
+               bn_mul_recursive(&(t[0]),&(r[0]),&(r[n]),n,&(t[n2]));
+               bn_mul_recursive(r,&(a[n]),&(b[n]),n,&(t[n2]));
+               }
 
-       if (init)
+       /* s0 == low(al*bl)
+        * s1 == low(ah*bh)+low((al-ah)*(bh-bl))+low(al*bl)+high(al*bl)
+        * We know s0 and s1 so the only unknown is high(al*bl)
+        * high(al*bl) == s1 - low(ah*bh+s0+(al-ah)*(bh-bl))
+        * high(al*bl) == s1 - (r[0]+l[0]+t[0])
+        */
+       if (l != NULL)
                {
-               bp.used=0;
-               bp.tos=0;
-               bp.sk=sk_new_null();
-               init=0;
+               lp= &(t[n2+n]);
+               c1=bn_add_words(lp,&(r[0]),&(l[0]),n);
+               }
+       else
+               {
+               c1=0;
+               lp= &(r[0]);
+               }
+
+       if (neg)
+               neg=bn_sub_words(&(t[n2]),lp,&(t[0]),n);
+       else
+               {
+               bn_add_words(&(t[n2]),lp,&(t[0]),n);
+               neg=0;
+               }
+
+       if (l != NULL)
+               {
+               bn_sub_words(&(t[n2+n]),&(l[n]),&(t[n2]),n);
+               }
+       else
+               {
+               lp= &(t[n2+n]);
+               mp= &(t[n2]);
+               for (i=0; i<n; i++)
+                       lp[i]=((~mp[i])+1)&BN_MASK2;
+               }
+
+       /* s[0] = low(al*bl)
+        * t[3] = high(al*bl)
+        * t[10] = (a[0]-a[1])*(b[1]-b[0]) neg is the sign
+        * r[10] = (a[1]*b[1])
+        */
+       /* R[10] = al*bl
+        * R[21] = al*bl + ah*bh + (a[0]-a[1])*(b[1]-b[0])
+        * R[32] = ah*bh
+        */
+       /* R[1]=t[3]+l[0]+r[0](+-)t[0] (have carry/borrow)
+        * R[2]=r[0]+t[3]+r[1](+-)t[1] (have carry/borrow)
+        * R[3]=r[1]+(carry/borrow)
+        */
+       if (l != NULL)
+               {
+               lp= &(t[n2]);
+               c1= bn_add_words(lp,&(t[n2+n]),&(l[0]),n);
+               }
+       else
+               {
+               lp= &(t[n2+n]);
+               c1=0;
+               }
+       c1+=bn_add_words(&(t[n2]),lp,  &(r[0]),n);
+       if (oneg)
+               c1-=bn_sub_words(&(t[n2]),&(t[n2]),&(t[0]),n);
+       else
+               c1+=bn_add_words(&(t[n2]),&(t[n2]),&(t[0]),n);
+
+       c2 =bn_add_words(&(r[0]),&(r[0]),&(t[n2+n]),n);
+       c2+=bn_add_words(&(r[0]),&(r[0]),&(r[n]),n);
+       if (oneg)
+               c2-=bn_sub_words(&(r[0]),&(r[0]),&(t[n]),n);
+       else
+               c2+=bn_add_words(&(r[0]),&(r[0]),&(t[n]),n);
+       
+       if (c1 != 0) /* Add starting at r[0], could be +ve or -ve */
+               {
+               i=0;
+               if (c1 > 0)
+                       {
+                       lc=c1;
+                       do      {
+                               ll=(r[i]+lc)&BN_MASK2;
+                               r[i++]=ll;
+                               lc=(lc > ll);
+                               } while (lc);
+                       }
+               else
+                       {
+                       lc= -c1;
+                       do      {
+                               ll=r[i];
+                               r[i++]=(ll-lc)&BN_MASK2;
+                               lc=(lc > ll);
+                               } while (lc);
+                       }
+               }
+       if (c2 != 0) /* Add starting at r[1] */
+               {
+               i=n;
+               if (c2 > 0)
+                       {
+                       lc=c2;
+                       do      {
+                               ll=(r[i]+lc)&BN_MASK2;
+                               r[i++]=ll;
+                               lc=(lc > ll);
+                               } while (lc);
+                       }
+               else
+                       {
+                       lc= -c2;
+                       do      {
+                               ll=r[i];
+                               r[i++]=(ll-lc)&BN_MASK2;
+                               lc=(lc > ll);
+                               } while (lc);
+                       }
                }
-       return(BN_mm(r,a,b,&bp));
        }
+#endif
 
-/* r must be different to a and b */
-int BN_mm(m, A, B, bp)
-BIGNUM *m,*A,*B;
-BN_POOL *bp;
+int BN_mul(r,a,b,ctx)
+BIGNUM *r,*a,*b;
+BN_CTX *ctx;
        {
-       int i,num;
-       int an,bn;
-       BIGNUM *a,*b,*c,*d,*ac,*bd;
+       int top,i,j,k,al,bl;
+       BIGNUM *t;
+
+       t=NULL;
+       i=j=k=0;
+
+#ifdef BN_COUNT
+printf("BN_mul %d * %d\n",a->top,b->top);
+#endif
+
+       bn_check_top(a);
+       bn_check_top(b);
+       bn_check_top(r);
 
-       an=A->top;
-       bn=B->top;
-       if ((an <= limit) || (bn <= limit))
+       al=a->top;
+       bl=b->top;
+       r->neg=a->neg^b->neg;
+
+       if ((al == 0) || (bl == 0))
                {
-               return(BN_mmul(m,A,B));
+               BN_zero(r);
+               return(1);
                }
+       top=al+bl;
+#if defined(BN_MUL_COMBA) || defined(BN_RECURSION)
+       if (al == bl)
+               {
+#  ifdef BN_MUL_COMBA
+/*             if (al == 4)
+                       {
+                       if (bn_wexpand(r,8) == NULL) return(0);
+                       r->top=8;
+                       bn_mul_comba4(r->d,a->d,b->d);
+                       goto end;
+                       }
+               else */ if (al == 8)
+                       {
+                       if (bn_wexpand(r,16) == NULL) return(0);
+                       r->top=16;
+                       bn_mul_comba8(r->d,a->d,b->d);
+                       goto end;
+                       }
+               else
+#  endif
+#ifdef BN_RECURSION
+               if (al < BN_MULL_SIZE_NORMAL)
+#endif
+                       {
+                       if (bn_wexpand(r,top) == NULL) return(0);
+                       r->top=top;
+                       bn_mul_normal(r->d,a->d,al,b->d,bl);
+                       goto end;
+                       }
+#  ifdef BN_RECURSION
+               goto symetric;
+#  endif
+               }
+#endif
+#ifdef BN_RECURSION
+       else if ((al < BN_MULL_SIZE_NORMAL) || (bl < BN_MULL_SIZE_NORMAL))
+               {
+               if (bn_wexpand(r,top) == NULL) return(0);
+               r->top=top;
+               bn_mul_normal(r->d,a->d,al,b->d,bl);
+               goto end;
+               }
+       else
+               {
+               i=(al-bl);
+               if ((i ==  1) && !BN_get_flags(b,BN_FLG_STATIC_DATA))
+                       {
+                       bn_wexpand(b,al);
+                       b->d[bl]=0;
+                       bl++;
+                       goto symetric;
+                       }
+               else if ((i ==  -1) && !BN_get_flags(a,BN_FLG_STATIC_DATA))
+                       {
+                       bn_wexpand(a,bl);
+                       a->d[al]=0;
+                       al++;
+                       goto symetric;
+                       }
+               }
+#endif
 
-       a=BN_POOL_push(bp);
-       b=BN_POOL_push(bp);
-       c=BN_POOL_push(bp);
-       d=BN_POOL_push(bp);
-       ac=BN_POOL_push(bp);
-       bd=BN_POOL_push(bp);
+       /* asymetric and >= 4 */ 
+       if (bn_wexpand(r,top) == NULL) return(0);
+       r->top=top;
+       bn_mul_normal(r->d,a->d,al,b->d,bl);
 
-       num=(an <= bn)?an:bn;
-       num=1<<(BN_num_bits_word(num-1)-1);
+#ifdef BN_RECURSION
+       if (0)
+               {
+symetric:
+               /* symetric and > 4 */
+               /* 16 or larger */
+               j=BN_num_bits_word((BN_ULONG)al);
+               j=1<<(j-1);
+               k=j+j;
+               t= &(ctx->bn[ctx->tos]);
+               if (al == j) /* exact multiple */
+                       {
+                       bn_wexpand(t,k*2);
+                       bn_wexpand(r,k*2);
+                       bn_mul_recursive(r->d,a->d,b->d,al,t->d);
+                       }
+               else
+                       {
+                       bn_wexpand(a,k);
+                       bn_wexpand(b,k);
+                       bn_wexpand(t,k*4);
+                       bn_wexpand(r,k*4);
+                       for (i=a->top; i<k; i++)
+                               a->d[i]=0;
+                       for (i=b->top; i<k; i++)
+                               b->d[i]=0;
+                       bn_mul_part_recursive(r->d,a->d,b->d,al-j,j,t->d);
+                       }
+               r->top=top;
+               }
+#endif
+end:
+       bn_fix_top(r);
+       return(1);
+       }
 
-       /* Are going to now chop things into 'num' word chunks. */
-       num*=BN_BITS2;
+void bn_mul_normal(r,a,na,b,nb)
+BN_ULONG *r,*a;
+int na;
+BN_ULONG *b;
+int nb;
+       {
+       BN_ULONG *rr;
 
-       BN_copy(a,A);
-       BN_mask_bits(a,num);
-       BN_rshift(b,A,num);
+#ifdef BN_COUNT
+printf(" bn_mul_normal %d * %d\n",na,nb);
+#endif
 
-       BN_copy(c,B);
-       BN_mask_bits(c,num);
-       BN_rshift(d,B,num);
+       if (na < nb)
+               {
+               int itmp;
+               BN_ULONG *ltmp;
 
-       BN_sub(ac ,b,a);
-       BN_sub(bd,c,d);
-       BN_mm(m,ac,bd,bp);
-       BN_mm(ac,a,c,bp);
-       BN_mm(bd,b,d,bp);
+               itmp=na; na=nb; nb=itmp;
+               ltmp=a;   a=b;   b=ltmp;
 
-       BN_add(m,m,ac);
-       BN_add(m,m,bd);
-       BN_lshift(m,m,num);
-       BN_lshift(bd,bd,num*2);
+               }
+       rr= &(r[na]);
+       rr[0]=bn_mul_words(r,a,na,b[0]);
 
-       BN_add(m,m,ac);
-       BN_add(m,m,bd);
-       BN_POOL_pop(bp,6);
-       return(1);
+       for (;;)
+               {
+               if (--nb <= 0) return;
+               rr[1]=bn_mul_add_words(&(r[1]),a,na,b[1]);
+               if (--nb <= 0) return;
+               rr[2]=bn_mul_add_words(&(r[2]),a,na,b[2]);
+               if (--nb <= 0) return;
+               rr[3]=bn_mul_add_words(&(r[3]),a,na,b[3]);
+               if (--nb <= 0) return;
+               rr[4]=bn_mul_add_words(&(r[4]),a,na,b[4]);
+               rr+=4;
+               r+=4;
+               b+=4;
+               }
        }
+
+void bn_mul_low_normal(r,a,b,n)
+BN_ULONG *r,*a,*b;
+int n;
+       {
+#ifdef BN_COUNT
+printf(" bn_mul_low_normal %d * %d\n",n,n);
 #endif
+       bn_mul_words(r,a,n,b[0]);
+
+       for (;;)
+               {
+               if (--n <= 0) return;
+               bn_mul_add_words(&(r[1]),a,n,b[1]);
+               if (--n <= 0) return;
+               bn_mul_add_words(&(r[2]),a,n,b[2]);
+               if (--n <= 0) return;
+               bn_mul_add_words(&(r[3]),a,n,b[3]);
+               if (--n <= 0) return;
+               bn_mul_add_words(&(r[4]),a,n,b[4]);
+               r+=4;
+               b+=4;
+               }
+       }
+
diff --git a/crypto/bn/bn_opts.c b/crypto/bn/bn_opts.c
new file mode 100644 (file)
index 0000000..86a03e2
--- /dev/null
@@ -0,0 +1,342 @@
+/* crypto/bn/expspeed.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+/* most of this code has been pilfered from my libdes speed.c program */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+#include "crypto.h"
+#include "tmdiff.h"
+#include "bn.h"
+#include "err.h"
+
+#define DEFAULT_SIZE   512
+#define DEFAULT_TIME   3
+
+int verbose=1;
+
+typedef struct parms_st
+       {
+       char *name;
+       void (*func)();
+       BIGNUM r;
+       BIGNUM a;
+       BIGNUM b;
+       BIGNUM c;
+       BIGNUM low;
+       BN_CTX *ctx;
+       BN_MONT_CTX *mont;
+       int w;
+       } PARMS;
+
+void do_mul_exp(int num,PARMS *p);
+void do_mul(int num,PARMS *p);
+void do_sqr(int num,PARMS *p);
+void do_mul_low(int num,PARMS *p);
+void do_mul_high(int num,PARMS *p);
+void do_from_montgomery(int num,PARMS *p);
+int time_it(int sec, PARMS *p);
+void do_it(int sec, PARMS *p);
+
+#define P_EXP  1
+#define P_MUL  2
+#define P_SQR  3
+#define P_MULL 4
+#define P_MULH 5
+#define P_MRED 6
+
+int main(argc,argv)
+int argc;
+char **argv;
+       {
+       PARMS p;
+       BN_MONT_CTX *mont;
+       int size=0,num;
+       char *name;
+       int type=P_EXP;
+
+       mont=BN_MONT_CTX_new();
+       p.mont=NULL;
+       p.ctx=BN_CTX_new();
+       BN_init(&p.r);
+       BN_init(&p.a);
+       BN_init(&p.b);
+       BN_init(&p.c);
+       BN_init(&p.low);
+       p.w=0;
+
+       for (;;)
+               {
+               if (argc > 1)
+                       {
+                       if (argv[1][0] == '-')
+                               {
+                               switch(argv[1][1])
+                                       {
+                               case 'e': type=P_EXP; break;
+                               case 'm': type=P_MUL; break;
+                               case 's': type=P_SQR; break;
+                               case 'l': type=P_MULL; break;
+                               case 'h': type=P_MULH; break;
+                               case 'r': type=P_MRED; break;
+                               default:
+                                       fprintf(stderr,"options: -[emslhr]\n");
+                                       exit(1);
+                                       }
+                               }
+                       else
+                               {
+                               size=atoi(argv[1]);
+                               }
+                       argc--;
+                       argv++;
+                       }
+               else
+                       break;
+               }
+       if (size == 0)
+               size=DEFAULT_SIZE;
+
+       printf("bit size:%5d\n",size);
+
+       BN_rand(&p.a,size,1,0);
+       BN_rand(&p.b,size,1,0);
+       BN_rand(&p.c,size,1,1);
+       BN_mod(&p.a,&p.a,&p.c,p.ctx);
+       BN_mod(&p.b,&p.b,&p.c,p.ctx);
+       p.w=(p.a.top+1)/2;
+
+       BN_mul(&p.low,&p.a,&p.b,p.ctx);
+       p.low.top=p.a.top;
+       
+       switch(type)
+               {
+       case P_EXP:
+               p.name="r=a^b%c";
+               p.func=do_mul_exp;
+               p.mont=mont;
+               break;
+       case P_MUL:
+               p.name="r=a*b";
+               p.func=do_mul;
+               break;
+       case P_SQR:
+               p.name="r=a*a";
+               p.func=do_sqr;
+               break;
+       case P_MULL:
+               p.name="r=low(a*b)";
+               p.func=do_mul_low;
+               break;
+       case P_MULH:
+               p.name="r=high(a*b)";
+               p.func=do_mul_high;
+               break;
+       case P_MRED:
+               p.name="r=montgomery_reduction(a)";
+               p.func=do_from_montgomery;
+               p.mont=mont;
+               break;
+       default:
+               fprintf(stderr,"options: -[emslhr]\n");
+               exit(1);
+               }
+
+       num=time_it(DEFAULT_TIME,&p);
+       do_it(num,&p);
+       }
+
+void do_it(num,p)
+int num;
+PARMS *p;
+       {
+       char *start,*end;
+       int i,j,number;
+       double d;
+
+       start=ms_time_new();
+       end=ms_time_new();
+
+       number=BN_num_bits_word((BN_ULONG)BN_num_bits(&(p->c)))-
+               BN_num_bits_word(BN_BITS2)+2;
+       for (i=number-1; i >=0; i--)
+               {
+               if (i == 1) continue;
+               BN_set_params(i,i,i,1);
+               if (p->mont != NULL)
+                       BN_MONT_CTX_set(p->mont,&(p->c),p->ctx);
+
+               printf("Timing %5d (%2d bit) %2d %2d %2d %2d :",
+                       (1<<i)*BN_BITS2,i,
+                               BN_get_params(0),
+                               BN_get_params(1),
+                               BN_get_params(2),
+                               BN_get_params(3));
+               fflush(stdout);
+
+               ms_time_get(start);
+               p->func(num,p);
+               ms_time_get(end);
+               d=ms_time_diff(start,end);
+               printf("%6.6f sec, or %d in %.4f seconds\n",
+                       (double)d/num,num,d);
+               }
+       }
+
+int time_it(sec,p)
+int sec;
+PARMS *p;
+       {
+       char *start,*end;
+       int i,j;
+       double d;
+
+       if (p->mont != NULL)
+               BN_MONT_CTX_set(p->mont,&(p->c),p->ctx);
+
+       start=ms_time_new();
+       end=ms_time_new();
+
+       i=1;
+       for (;;)
+               {
+               if (verbose)
+                       printf("timing %s for %d interations\n",p->name,i);
+
+               ms_time_get(start);
+               p->func(i,p);
+               ms_time_get(end);
+               d=ms_time_diff(start,end);
+
+               if      (d < 0.01) i*=100;
+               else if (d < 0.1 ) i*=10;
+               else if (d > (double)sec) break;
+               else
+                       {
+                       i=(int)(1.0*i*sec/d);
+                       break;
+                       }
+               }
+       if (verbose)
+               printf("using %d interations\n",i);
+       return(i);
+       }
+
+void do_mul_exp(num,p)
+int num;
+PARMS *p;
+       {
+       int i;
+
+       for (i=0; i<num; i++)
+               BN_mod_exp_mont(&(p->r),&(p->a),&(p->b),&(p->c),
+                       p->ctx,p->mont);
+       }
+
+void do_mul(num,p)
+int num;
+PARMS *p;
+       {
+       int i;
+
+       for (i=0; i<num; i++)
+               BN_mul(&(p->r),&(p->a),&(p->b),p->ctx);
+       }
+
+void do_sqr(num,p)
+int num;
+PARMS *p;
+       {
+       int i;
+
+       for (i=0; i<num; i++)
+                       BN_sqr(&(p->r),&(p->a),p->ctx);
+       }
+
+void do_mul_low(num,p)
+int num;
+PARMS *p;
+       {
+       int i;
+       
+       for (i=0; i<num; i++)
+               BN_mul_low(&(p->r),&(p->a),&(p->b),p->w,p->ctx);
+       }
+
+void do_mul_high(num,p)
+int num;
+PARMS *p;
+       {
+       int i;
+
+       for (i=0; i<num; i++)
+               BN_mul_low(&(p->r),&(p->a),&(p->b),&(p->low),p->w,p->ctx);
+       }
+
+void do_from_montgomery(num,p)
+int num;
+PARMS *p;
+       {
+       int i;
+       
+       for (i=0; i<num; i++)
+               BN_from_montgomery(&(p->r),&(p->a),p->mont,p->ctx);
+       }
+
index 0c85f70b59ccedb53cc3d174303a14f1f19b903c..c4fb58ef9ae62ddf4ba3208dcaf31355dde1055d 100644 (file)
@@ -83,7 +83,8 @@ static int probable_prime_dh();
 static int probable_prime_dh_strong();
 #endif
 
-BIGNUM *BN_generate_prime(bits,strong,add,rem,callback,cb_arg)
+BIGNUM *BN_generate_prime(ret,bits,strong,add,rem,callback,cb_arg)
+BIGNUM *ret;
 int bits;
 int strong;
 BIGNUM *add;
@@ -92,16 +93,19 @@ void (*callback)(P_I_I_P);
 char *cb_arg;
        {
        BIGNUM *rnd=NULL;
-       BIGNUM *ret=NULL;
-       BIGNUM *t=NULL;
+       BIGNUM t;
        int i,j,c1=0;
        BN_CTX *ctx;
 
        ctx=BN_CTX_new();
        if (ctx == NULL) goto err;
-       if ((rnd=BN_new()) == NULL) goto err;
-       if (strong)
-               if ((t=BN_new()) == NULL) goto err;
+       if (ret == NULL)
+               {
+               if ((rnd=BN_new()) == NULL) goto err;
+               }
+       else
+               rnd=ret;
+       BN_init(&t);
 loop: 
        /* make a random number and set the top and bottom bits */
        if (add == NULL)
@@ -136,7 +140,7 @@ loop:
                 * check that (p-1)/2 is prime.
                 * Since a prime is odd, We just
                 * need to divide by 2 */
-               if (!BN_rshift1(t,rnd)) goto err;
+               if (!BN_rshift1(&t,rnd)) goto err;
 
                for (i=0; i<BN_prime_checks; i++)
                        {
@@ -144,7 +148,7 @@ loop:
                        if (j == -1) goto err;
                        if (j == 0) goto loop;
 
-                       j=BN_is_prime(t,1,callback,ctx,cb_arg);
+                       j=BN_is_prime(&t,1,callback,ctx,cb_arg);
                        if (j == -1) goto err;
                        if (j == 0) goto loop;
 
@@ -156,7 +160,7 @@ loop:
        ret=rnd;
 err:
        if ((ret == NULL) && (rnd != NULL)) BN_free(rnd);
-       if (t != NULL) BN_free(t);
+       BN_free(&t);
        if (ctx != NULL) BN_CTX_free(ctx);
        return(ret);
        }
@@ -183,7 +187,7 @@ char *cb_arg;
        if ((ctx2=BN_CTX_new()) == NULL) goto err;
        if ((mont=BN_MONT_CTX_new()) == NULL) goto err;
 
-       check=ctx->bn[ctx->tos++];
+       check= &(ctx->bn[ctx->tos++]);
 
        /* Setup the montgomery structure */
        if (!BN_MONT_CTX_set(mont,a,ctx2)) goto err;
@@ -224,14 +228,14 @@ BN_MONT_CTX *mont;
        BIGNUM *d,*dd,*tmp,*d1,*d2,*n1;
        BIGNUM *mont_one,*mont_n1,*mont_a;
 
-       d1=ctx->bn[ctx->tos];
-       d2=ctx->bn[ctx->tos+1];
-       n1=ctx->bn[ctx->tos+2];
+       d1= &(ctx->bn[ctx->tos]);
+       d2= &(ctx->bn[ctx->tos+1]);
+       n1= &(ctx->bn[ctx->tos+2]);
        ctx->tos+=3;
 
-       mont_one=ctx2->bn[ctx2->tos];
-       mont_n1=ctx2->bn[ctx2->tos+1];
-       mont_a=ctx2->bn[ctx2->tos+2];
+       mont_one= &(ctx2->bn[ctx2->tos]);
+       mont_n1= &(ctx2->bn[ctx2->tos+1]);
+       mont_a= &(ctx2->bn[ctx2->tos+2]);
        ctx2->tos+=3;
 
        d=d1;
@@ -287,8 +291,9 @@ int bits;
        {
        int i;
        MS_STATIC BN_ULONG mods[NUMPRIMES];
-       BN_ULONG delta;
+       BN_ULONG delta,d;
 
+again:
        if (!BN_rand(rnd,bits,1,1)) return(0);
        /* we now have a random number 'rand' to test. */
        for (i=1; i<NUMPRIMES; i++)
@@ -300,9 +305,12 @@ int bits;
                 * that gcd(rnd-1,primes) == 1 (except for 2) */
                if (((mods[i]+delta)%primes[i]) <= 1)
                        {
+                       d=delta;
                        delta+=2;
                        /* perhaps need to check for overflow of
-                        * delta (but delta can be upto 2^32) */
+                        * delta (but delta can be upto 2^32)
+                        * 21-May-98 eay - added overflow check */
+                       if (delta < d) goto again;
                        goto loop;
                        }
                }
@@ -320,7 +328,7 @@ BN_CTX *ctx;
        int i,ret=0;
        BIGNUM *t1;
 
-       t1=ctx->bn[ctx->tos++];
+       t1= &(ctx->bn[ctx->tos++]);
 
        if (!BN_rand(rnd,bits,0,1)) goto err;
 
@@ -361,9 +369,9 @@ BN_CTX *ctx;
        BIGNUM *t1,*qadd=NULL,*q=NULL;
 
        bits--;
-       t1=ctx->bn[ctx->tos++];
-       q=ctx->bn[ctx->tos++];
-       qadd=ctx->bn[ctx->tos++];
+       t1= &(ctx->bn[ctx->tos++]);
+       q= &(ctx->bn[ctx->tos++]);
+       qadd= &(ctx->bn[ctx->tos++]);
 
        if (!BN_rshift1(qadd,padd)) goto err;
                
@@ -413,11 +421,11 @@ BN_CTX *ctx;
        BIGNUM *d,*dd,*tmp;
        BIGNUM *d1,*d2,*x,*n1,*inv;
 
-       d1=ctx->bn[ctx->tos];
-       d2=ctx->bn[ctx->tos+1];
-       x=ctx->bn[ctx->tos+2];
-       n1=ctx->bn[ctx->tos+3];
-       inv=ctx->bn[ctx->tos+4];
+       d1= &(ctx->bn[ctx->tos]);
+       d2= &(ctx->bn[ctx->tos+1]);
+       x=  &(ctx->bn[ctx->tos+2]);
+       n1= &(ctx->bn[ctx->tos+3]);
+       inv=&(ctx->bn[ctx->tos+4]);
        ctx->tos+=5;
 
        d=d1;
index 72cd69d3fc9c76efbf06c43df8724a221dba6226..97ca857ed1b2463428b1504c79e248ecb1d65d5a 100644 (file)
 #include "cryptlib.h"
 #include "bn_lcl.h"
 
-int BN_mod_mul_reciprocal(r, x, y, m, i, nb, ctx)
+void BN_RECP_CTX_init(recp)
+BN_RECP_CTX *recp;
+       {
+       BN_init(&(recp->N));
+       BN_init(&(recp->Nr));
+       recp->num_bits=0;
+       recp->flags=0;
+       }
+
+BN_RECP_CTX *BN_RECP_CTX_new()
+       {
+       BN_RECP_CTX *ret;
+
+       if ((ret=(BN_RECP_CTX *)Malloc(sizeof(BN_RECP_CTX))) == NULL)
+               return(NULL);
+
+       BN_RECP_CTX_init(ret);
+       ret->flags=BN_FLG_MALLOCED;
+       return(ret);
+       }
+
+void BN_RECP_CTX_free(recp)
+BN_RECP_CTX *recp;
+       {
+       BN_free(&(recp->N));
+       BN_free(&(recp->Nr));
+       if (recp->flags & BN_FLG_MALLOCED)
+               Free(recp);
+       }
+
+int BN_RECP_CTX_set(recp,d,ctx)
+BN_RECP_CTX *recp;
+BIGNUM *d;
+BN_CTX *ctx;
+       {
+       BN_copy(&(recp->N),d);
+       BN_zero(&(recp->Nr));
+       recp->num_bits=BN_num_bits(d);
+       recp->shift=0;
+       return(1);
+       }
+
+int BN_mod_mul_reciprocal(r, x, y, recp, ctx)
 BIGNUM *r;
 BIGNUM *x;
 BIGNUM *y;
+BN_RECP_CTX *recp;
+BN_CTX *ctx;
+       {
+       int ret=0;
+       BIGNUM *a;
+
+       a= &(ctx->bn[ctx->tos++]);
+       if (y != NULL)
+               {
+               if (x == y)
+                       { if (!BN_sqr(a,x,ctx)) goto err; }
+               else
+                       { if (!BN_mul(a,x,y,ctx)) goto err; }
+               }
+       else
+               a=x; /* Just do the mod */
+
+       BN_div_recp(NULL,r,a,recp,ctx);
+       ret=1;
+err:
+       ctx->tos--;
+       return(ret);
+       }
+
+int BN_div_recp(dv,rem,m,recp,ctx)
+BIGNUM *dv;
+BIGNUM *rem;
 BIGNUM *m;
-BIGNUM *i;
-int nb;
+BN_RECP_CTX *recp;
 BN_CTX *ctx;
        {
-       int ret=0,j;
-       BIGNUM *a,*b,*c,*d;
+       int i,j,tos,ret=0,ex;
+       BIGNUM *a,*b,*d,*r;
+
+       tos=ctx->tos;
+       a= &(ctx->bn[ctx->tos++]);
+       b= &(ctx->bn[ctx->tos++]);
+       if (dv != NULL)
+               d=dv;
+       else
+               d= &(ctx->bn[ctx->tos++]);
+       if (rem != NULL)
+               r=rem;
+       else
+               r= &(ctx->bn[ctx->tos++]);
+
+       if (BN_ucmp(m,&(recp->N)) < 0)
+               {
+               BN_zero(d);
+               BN_copy(r,m);
+               ctx->tos=tos;
+               return(1);
+               }
 
-       a=ctx->bn[ctx->tos++];
-       b=ctx->bn[ctx->tos++];
-       c=ctx->bn[ctx->tos++];
-       d=ctx->bn[ctx->tos++];
+       /* We want the remainder
+        * Given input of ABCDEF / ab
+        * we need multiply ABCDEF by 3 digests of the reciprocal of ab
+        *
+        */
+       i=BN_num_bits(m);
 
-       if (x == y)
-               { if (!BN_sqr(a,x,ctx)) goto err; }
+       j=recp->num_bits*2;
+       if (j > i)
+               {
+               i=j;
+               ex=0;
+               }
        else
-               { if (!BN_mul(a,x,y)) goto err; }
-       if (!BN_rshift(d,a,nb)) goto err;
-       if (!BN_mul(b,d,i)) goto err;
-       if (!BN_rshift(c,b,nb)) goto err;
-       if (!BN_mul(b,m,c)) goto err;
-       if (!BN_sub(r,a,b)) goto err;
+               {
+               ex=(i-j)/2;
+               }
+
+       j=i/2;
+
+       if (i != recp->shift)
+               recp->shift=BN_reciprocal(&(recp->Nr),&(recp->N),
+                       i,ctx);
+
+       if (!BN_rshift(a,m,j-ex)) goto err;
+       if (!BN_mul(b,a,&(recp->Nr),ctx)) goto err;
+       if (!BN_rshift(d,b,j+ex)) goto err;
+       d->neg=0;
+       if (!BN_mul(b,&(recp->N),d,ctx)) goto err;
+       if (!BN_usub(r,m,b)) goto err;
+       r->neg=0;
+
        j=0;
-       while (BN_cmp(r,m) >= 0)
+#if 1
+       while (BN_ucmp(r,&(recp->N)) >= 0)
                {
                if (j++ > 2)
                        {
                        BNerr(BN_F_BN_MOD_MUL_RECIPROCAL,BN_R_BAD_RECIPROCAL);
                        goto err;
                        }
-               if (!BN_sub(r,r,m)) goto err;
+               if (!BN_usub(r,r,&(recp->N))) goto err;
+               if (!BN_add_word(d,1)) goto err;
                }
+#endif
 
+       r->neg=BN_is_zero(r)?0:m->neg;
+       d->neg=m->neg^recp->N.neg;
        ret=1;
 err:
-       ctx->tos-=4;
+       ctx->tos=tos;
        return(ret);
-       }
+       } 
 
-int BN_reciprocal(r, m,ctx)
+/* len is the expected size of the result
+ * We actually calculate with an extra word of precision, so
+ * we can do faster division if the remainder is not required.
+ */
+int BN_reciprocal(r,m,len,ctx)
 BIGNUM *r;
 BIGNUM *m;
+int len;
 BN_CTX *ctx;
        {
-       int nm,ret= -1;
-       BIGNUM *t;
+       int ret= -1;
+       BIGNUM t;
 
-       t=ctx->bn[ctx->tos++];
+       BN_init(&t);
 
-       nm=BN_num_bits(m);
-       if (!BN_lshift(t,BN_value_one(),nm*2)) goto err;
+       BN_zero(&t);
+       if (!BN_set_bit(&t,len)) goto err;
 
-       if (!BN_div(r,NULL,t,m,ctx)) goto err;
-       ret=nm;
+       if (!BN_div(r,NULL,&t,m,ctx)) goto err;
+       ret=len;
 err:
-       ctx->tos--;
+       BN_free(&t);
        return(ret);
        }
 
index a8464610e5af8fc4f650cf9d93163f22cc7b6a36..19ec0ddf842cc6a5366f68296909c71f6540abe0 100644 (file)
@@ -67,30 +67,84 @@ BIGNUM *r;
 BIGNUM *a;
 BN_CTX *ctx;
        {
-       int i,j,max,al;
+       int max,al;
        BIGNUM *tmp;
-       BN_ULONG *ap,*rp;
 
-       tmp=ctx->bn[ctx->tos];
+#ifdef BN_COUNT
+printf("BN_sqr %d * %d\n",a->top,a->top);
+#endif
+       bn_check_top(a);
+       tmp= &(ctx->bn[ctx->tos]);
 
        al=a->top;
-       if (al == 0)
+       if (al <= 0)
                {
                r->top=0;
                return(1);
                }
 
-       max=(al*2);
-       if (bn_wexpand(r,1+max) == NULL) return(0);
-       if (bn_wexpand(tmp,1+max) == NULL) return(0);
+       max=(al+al);
+       if (bn_wexpand(r,max+1) == NULL) return(0);
 
        r->neg=0;
+       if (al == 4)
+               {
+#ifndef BN_SQR_COMBA
+               BN_ULONG t[8];
+               bn_sqr_normal(r->d,a->d,4,t);
+#else
+               bn_sqr_comba4(r->d,a->d);
+#endif
+               }
+       else if (al == 8)
+               {
+#ifndef BN_SQR_COMBA
+               BN_ULONG t[16];
+               bn_sqr_normal(r->d,a->d,8,t);
+#else
+               bn_sqr_comba8(r->d,a->d);
+#endif
+               }
+       else 
+               {
+#if defined(BN_RECURSION)
+               if (al < BN_SQR_RECURSIVE_SIZE_NORMAL)
+                       {
+                       BN_ULONG t[BN_SQR_RECURSIVE_SIZE_NORMAL*2];
+                       bn_sqr_normal(r->d,a->d,al,t);
+                       }
+               else
+                       {
+                       if (bn_wexpand(tmp,2*max+1) == NULL) return(0);
+                       bn_sqr_recursive(r->d,a->d,al,tmp->d);
+                       }
+#else
+               if (bn_wexpand(tmp,max) == NULL) return(0);
+               bn_sqr_normal(r->d,a->d,al,tmp->d);
+#endif
+               }
+
+       r->top=max;
+       if ((max > 0) && (r->d[max-1] == 0)) r->top--;
+       return(1);
+       }
+
+/* tmp must have 2*n words */
+void bn_sqr_normal(r, a, n, tmp)
+BN_ULONG *r;
+BN_ULONG *a;
+int n;
+BN_ULONG *tmp;
+       {
+       int i,j,max;
+       BN_ULONG *ap,*rp;
 
-       ap=a->d;
-       rp=r->d;
+       max=n*2;
+       ap=a;
+       rp=r;
        rp[0]=rp[max-1]=0;
        rp++;
-       j=al;
+       j=n;
 
        if (--j > 0)
                {
@@ -99,7 +153,7 @@ BN_CTX *ctx;
                rp+=2;
                }
 
-       for (i=2; i<al; i++)
+       for (i=n-2; i>0; i--)
                {
                j--;
                ap++;
@@ -107,16 +161,115 @@ BN_CTX *ctx;
                rp+=2;
                }
 
-       bn_add_words(r->d,r->d,r->d,max);
+       bn_add_words(r,r,r,max);
 
        /* There will not be a carry */
 
-       bn_sqr_words(tmp->d,a->d,al);
+       bn_sqr_words(tmp,a,n);
 
-       bn_add_words(r->d,r->d,tmp->d,max);
-
-       r->top=max;
-       if (r->d[max-1] == 0) r->top--;
-       return(1);
+       bn_add_words(r,r,tmp,max);
        }
 
+#ifdef BN_RECURSION
+/* r is 2*n words in size,
+ * a and b are both n words in size.
+ * n must be a power of 2.
+ * We multiply and return the result.
+ * t must be 2*n words in size
+ * We calulate
+ * a[0]*b[0]
+ * a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0])
+ * a[1]*b[1]
+ */
+void bn_sqr_recursive(r,a,n2,t)
+BN_ULONG *r,*a;
+int n2;
+BN_ULONG *t;
+       {
+       int n=n2/2;
+       int zero,c1;
+       BN_ULONG ln,lo,*p;
+
+#ifdef BN_COUNT
+printf(" bn_sqr_recursive %d * %d\n",n2,n2);
+#endif
+       if (n2 == 4)
+               {
+#ifndef BN_SQR_COMBA
+               bn_sqr_normal(r,a,4,t);
+#else
+               bn_sqr_comba4(r,a);
+#endif
+               return;
+               }
+       else if (n2 == 8)
+               {
+#ifndef BN_SQR_COMBA
+               bn_sqr_normal(r,a,8,t);
+#else
+               bn_sqr_comba8(r,a);
+#endif
+               return;
+               }
+       if (n2 < BN_SQR_RECURSIVE_SIZE_NORMAL)
+               {
+               bn_sqr_normal(r,a,n2,t);
+               return;
+               }
+       /* r=(a[0]-a[1])*(a[1]-a[0]) */
+       c1=bn_cmp_words(a,&(a[n]),n);
+       zero=0;
+       if (c1 > 0)
+               bn_sub_words(t,a,&(a[n]),n);
+       else if (c1 < 0)
+               bn_sub_words(t,&(a[n]),a,n);
+       else
+               zero=1;
+
+       /* The result will always be negative unless it is zero */
+       p= &(t[n2*2]);
+
+       if (!zero)
+               bn_sqr_recursive(&(t[n2]),t,n,p);
+       else
+               memset(&(t[n2]),0,n*sizeof(BN_ULONG));
+       bn_sqr_recursive(r,a,n,p);
+       bn_sqr_recursive(&(r[n2]),&(a[n]),n,p);
+
+       /* t[32] holds (a[0]-a[1])*(a[1]-a[0]), it is negative or zero
+        * r[10] holds (a[0]*b[0])
+        * r[32] holds (b[1]*b[1])
+        */
+
+       c1=bn_add_words(t,r,&(r[n2]),n2);
+
+       /* t[32] is negative */
+       c1-=bn_sub_words(&(t[n2]),t,&(t[n2]),n2);
+
+       /* t[32] holds (a[0]-a[1])*(a[1]-a[0])+(a[0]*a[0])+(a[1]*a[1])
+        * r[10] holds (a[0]*a[0])
+        * r[32] holds (a[1]*a[1])
+        * c1 holds the carry bits
+        */
+       c1+=bn_add_words(&(r[n]),&(r[n]),&(t[n2]),n2);
+       if (c1)
+               {
+               p= &(r[n+n2]);
+               lo= *p;
+               ln=(lo+c1)&BN_MASK2;
+               *p=ln;
+
+               /* The overflow will stop before we over write
+                * words we should not overwrite */
+               if (ln < (BN_ULONG)c1)
+                       {
+                       do      {
+                               p++;
+                               lo= *p;
+                               ln=(lo+1)&BN_MASK2;
+                               *p=ln;
+                               } while (ln == 0);
+                       }
+               }
+       }
+#endif
index 4b3d0f011d20e44fa7872421f6422369f1abece3..9c168e4f48a1777986780dfa780a1b10b115463f 100644 (file)
@@ -62,7 +62,7 @@
 
 BN_ULONG BN_mod_word(a, w)
 BIGNUM *a;
-unsigned long w;
+BN_ULONG w;
        {
 #ifndef BN_LLONG
        BN_ULONG ret=0;
@@ -75,8 +75,8 @@ unsigned long w;
        for (i=a->top-1; i>=0; i--)
                {
 #ifndef BN_LLONG
-               ret=((ret<<BN_BITS4)|((a->d[i]>>BN_BITS4)&BN_MASK2l))%(unsigned long)w;
-               ret=((ret<<BN_BITS4)|(a->d[i]&BN_MASK2l))%(unsigned long)w;
+               ret=((ret<<BN_BITS4)|((a->d[i]>>BN_BITS4)&BN_MASK2l))%w;
+               ret=((ret<<BN_BITS4)|(a->d[i]&BN_MASK2l))%w;
 #else
                ret=(BN_ULLONG)(((ret<<(BN_ULLONG)BN_BITS2)|a->d[i])%
                        (BN_ULLONG)w);
@@ -87,7 +87,7 @@ unsigned long w;
 
 BN_ULONG BN_div_word(a, w)
 BIGNUM *a;
-unsigned long w;
+BN_ULONG w;
        {
        BN_ULONG ret;
        int i;
@@ -100,18 +100,18 @@ unsigned long w;
                BN_ULONG l,d;
                
                l=a->d[i];
-               d=bn_div64(ret,l,w);
+               d=bn_div_words(ret,l,w);
                ret=(l-((d*w)&BN_MASK2))&BN_MASK2;
                a->d[i]=d;
                }
-       if (a->d[a->top-1] == 0)
+       if ((a->top > 0) && (a->d[a->top-1] == 0))
                a->top--;
        return(ret);
        }
 
 int BN_add_word(a, w)
 BIGNUM *a;
-unsigned long w;
+BN_ULONG w;
        {
        BN_ULONG l;
        int i;
@@ -144,7 +144,7 @@ unsigned long w;
 
 int BN_sub_word(a, w)
 BIGNUM *a;
-unsigned long w;
+BN_ULONG w;
        {
        int i;
 
@@ -185,7 +185,7 @@ unsigned long w;
 
 int BN_mul_word(a,w)
 BIGNUM *a;
-unsigned long w;
+BN_ULONG w;
        {
        BN_ULONG ll;
 
@@ -199,6 +199,6 @@ unsigned long w;
                        a->d[a->top++]=ll;
                        }
                }
-       return(0);
+       return(1);
        }
 
index f7c2790fff43b08e198e8f7051fd3b5f30c2b44a..777212c1ba66f70b7e323c6a059917d5d928221e 100644 (file)
@@ -94,7 +94,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
@@ -180,15 +181,14 @@ int argc;
 char **argv;
        {
        BN_CTX *ctx;
-       BIGNUM *a,*b,*c,*r;
+       BIGNUM a,b,c;
 
        ctx=BN_CTX_new();
-       a=BN_new();
-       b=BN_new();
-       c=BN_new();
-       r=BN_new();
+       BN_init(&a);
+       BN_init(&b);
+       BN_init(&c);
 
-       do_mul(a,b,c,ctx);
+       do_mul(&a,&b,&c,ctx);
        }
 
 void do_mul(r,a,b,ctx)
@@ -211,7 +211,7 @@ BN_CTX *ctx;
                        BN_rand(b,sizes[j],1,0);
                        Time_F(START);
                        for (k=0; k<num; k++)
-                               BN_mul(r,b,a);
+                               BN_mul(r,b,a,ctx);
                        tm=Time_F(STOP);
                        printf("mul %4d x %4d -> %8.3fms\n",sizes[i],sizes[j],tm*1000.0/num);
                        }
index 9ebd68b42954124e4f8dea21d3be3caedd416e17..ec48bad73835169ad0b77e4bcc8bdf08feb9bb68 100644 (file)
 #endif
 
 #ifndef NOPROTO
-int test_add (BIO *bp);
-int test_sub (BIO *bp);
-int test_lshift1 (BIO *bp);
-int test_lshift (BIO *bp);
-int test_rshift1 (BIO *bp);
-int test_rshift (BIO *bp);
-int test_div (BIO *bp,BN_CTX *ctx);
-int test_mul (BIO *bp);
-int test_sqr (BIO *bp,BN_CTX *ctx);
-int test_mont (BIO *bp,BN_CTX *ctx);
-int test_mod (BIO *bp,BN_CTX *ctx);
-int test_mod_mul (BIO *bp,BN_CTX *ctx);
-int test_mod_exp (BIO *bp,BN_CTX *ctx);
+int test_add(BIO *bp);
+int test_sub(BIO *bp);
+int test_lshift1(BIO *bp);
+int test_lshift(BIO *bp);
+int test_rshift1(BIO *bp);
+int test_rshift(BIO *bp);
+int test_div(BIO *bp,BN_CTX *ctx);
+int test_div_recp(BIO *bp,BN_CTX *ctx);
+int test_mul(BIO *bp);
+int test_sqr(BIO *bp,BN_CTX *ctx);
+int test_mont(BIO *bp,BN_CTX *ctx);
+int test_mod(BIO *bp,BN_CTX *ctx);
+int test_mod_mul(BIO *bp,BN_CTX *ctx);
+int test_mod_exp(BIO *bp,BN_CTX *ctx);
 int rand_neg(void);
 #else
 int test_add ();
@@ -192,6 +193,10 @@ char *argv[];
        if (!test_div(out,ctx)) goto err;
        fflush(stdout);
 
+       fprintf(stderr,"test BN_div_recp\n");
+       if (!test_div_recp(out,ctx)) goto err;
+       fflush(stdout);
+
        fprintf(stderr,"test BN_mod\n");
        if (!test_mod(out,ctx)) goto err;
        fflush(stdout);
@@ -221,80 +226,80 @@ err:
 int test_add(bp)
 BIO *bp;
        {
-       BIGNUM *a,*b,*c;
+       BIGNUM a,b,c;
        int i;
        int j;
 
-       a=BN_new();
-       b=BN_new();
-       c=BN_new();
+       BN_init(&a);
+       BN_init(&b);
+       BN_init(&c);
 
-       BN_rand(a,512,0,0);
+       BN_rand(&a,512,0,0);
        for (i=0; i<100; i++)
                {
-               BN_rand(b,450+i,0,0);
-               a->neg=rand_neg();
-               b->neg=rand_neg();
+               BN_rand(&b,450+i,0,0);
+               a.neg=rand_neg();
+               b.neg=rand_neg();
                if (bp == NULL)
                        for (j=0; j<10000; j++)
-                               BN_add(c,a,b);
-               BN_add(c,a,b);
+                               BN_add(&c,&a,&b);
+               BN_add(&c,&a,&b);
                if (bp != NULL)
                        {
                        if (!results)
                                {
-                               BN_print(bp,a);
+                               BN_print(bp,&a);
                                BIO_puts(bp," + ");
-                               BN_print(bp,b);
+                               BN_print(bp,&b);
                                BIO_puts(bp," - ");
                                }
-                       BN_print(bp,c);
+                       BN_print(bp,&c);
                        BIO_puts(bp,"\n");
                        }
                }
-       BN_free(a);
-       BN_free(b);
-       BN_free(c);
+       BN_free(&a);
+       BN_free(&b);
+       BN_free(&c);
        return(1);
        }
 
 int test_sub(bp)
 BIO *bp;
        {
-       BIGNUM *a,*b,*c;
+       BIGNUM a,b,c;
        int i;
        int j;
 
-       a=BN_new();
-       b=BN_new();
-       c=BN_new();
+       BN_init(&a);
+       BN_init(&b);
+       BN_init(&c);
 
-       BN_rand(a,512,0,0);
+       BN_rand(&a,512,0,0);
        for (i=0; i<100; i++)
                {
-               BN_rand(b,400+i,0,0);
-               a->neg=rand_neg();
-               b->neg=rand_neg();
+               BN_rand(&b,400+i,0,0);
+               a.neg=rand_neg();
+               b.neg=rand_neg();
                if (bp == NULL)
                        for (j=0; j<10000; j++)
-                               BN_sub(c,a,b);
-               BN_sub(c,a,b);
+                               BN_sub(&c,&a,&b);
+               BN_sub(&c,&a,&b);
                if (bp != NULL)
                        {
                        if (!results)
                                {
-                               BN_print(bp,a);
+                               BN_print(bp,&a);
                                BIO_puts(bp," - ");
-                               BN_print(bp,b);
+                               BN_print(bp,&b);
                                BIO_puts(bp," - ");
                                }
-                       BN_print(bp,c);
+                       BN_print(bp,&c);
                        BIO_puts(bp,"\n");
                        }
                }
-       BN_free(a);
-       BN_free(b);
-       BN_free(c);
+       BN_free(&a);
+       BN_free(&b);
+       BN_free(&c);
        return(1);
        }
 
@@ -302,92 +307,154 @@ int test_div(bp,ctx)
 BIO *bp;
 BN_CTX *ctx;
        {
-       BIGNUM *a,*b,*c,*d;
+       BIGNUM a,b,c,d;
        int i;
        int j;
 
-       a=BN_new();
-       b=BN_new();
-       c=BN_new();
-       d=BN_new();
+       BN_init(&a);
+       BN_init(&b);
+       BN_init(&c);
+       BN_init(&d);
 
-       BN_rand(a,400,0,0);
+       BN_rand(&a,400,0,0);
        for (i=0; i<100; i++)
                {
-               BN_rand(b,50+i,0,0);
-               a->neg=rand_neg();
-               b->neg=rand_neg();
+               BN_rand(&b,50+i,0,0);
+               a.neg=rand_neg();
+               b.neg=rand_neg();
                if (bp == NULL)
                        for (j=0; j<100; j++)
-                               BN_div(d,c,a,b,ctx);
-               BN_div(d,c,a,b,ctx);
+                               BN_div(&d,&c,&a,&b,ctx);
+               BN_div(&d,&c,&a,&b,ctx);
                if (bp != NULL)
                        {
                        if (!results)
                                {
-                               BN_print(bp,a);
+                               BN_print(bp,&a);
                                BIO_puts(bp," / ");
-                               BN_print(bp,b);
+                               BN_print(bp,&b);
                                BIO_puts(bp," - ");
                                }
-                       BN_print(bp,d);
+                       BN_print(bp,&d);
                        BIO_puts(bp,"\n");
 
                        if (!results)
                                {
-                               BN_print(bp,a);
+                               BN_print(bp,&a);
                                BIO_puts(bp," % ");
-                               BN_print(bp,b);
+                               BN_print(bp,&b);
                                BIO_puts(bp," - ");
                                }
-                       BN_print(bp,c);
+                       BN_print(bp,&c);
                        BIO_puts(bp,"\n");
                        }
                }
-       BN_free(a);
-       BN_free(b);
-       BN_free(c);
-       BN_free(d);
+       BN_free(&a);
+       BN_free(&b);
+       BN_free(&c);
+       BN_free(&d);
+       return(1);
+       }
+
+int test_div_recp(bp,ctx)
+BIO *bp;
+BN_CTX *ctx;
+       {
+       BIGNUM a,b,c,d;
+       BN_RECP_CTX recp;
+       int i;
+       int j;
+
+       BN_RECP_CTX_init(&recp);
+       BN_init(&a);
+       BN_init(&b);
+       BN_init(&c);
+       BN_init(&d);
+
+       BN_rand(&a,400,0,0);
+       for (i=0; i<100; i++)
+               {
+               BN_rand(&b,50+i,0,0);
+               a.neg=rand_neg();
+               b.neg=rand_neg();
+               BN_RECP_CTX_set(&recp,&b,ctx);
+               if (bp == NULL)
+                       for (j=0; j<100; j++)
+                               BN_div_recp(&d,&c,&a,&recp,ctx);
+               BN_div_recp(&d,&c,&a,&recp,ctx);
+               if (bp != NULL)
+                       {
+                       if (!results)
+                               {
+                               BN_print(bp,&a);
+                               BIO_puts(bp," / ");
+                               BN_print(bp,&b);
+                               BIO_puts(bp," - ");
+                               }
+                       BN_print(bp,&d);
+                       BIO_puts(bp,"\n");
+
+                       if (!results)
+                               {
+                               BN_print(bp,&a);
+                               BIO_puts(bp," % ");
+                               BN_print(bp,&b);
+                               BIO_puts(bp," - ");
+                               }
+                       BN_print(bp,&c);
+                       BIO_puts(bp,"\n");
+                       }
+               }
+       BN_free(&a);
+       BN_free(&b);
+       BN_free(&c);
+       BN_free(&d);
+       BN_RECP_CTX_free(&recp);
        return(1);
        }
 
 int test_mul(bp)
 BIO *bp;
        {
-       BIGNUM *a,*b,*c;
+       BIGNUM a,b,c;
        int i;
        int j;
+       BN_CTX ctx;
 
-       a=BN_new();
-       b=BN_new();
-       c=BN_new();
+       BN_CTX_init(&ctx);
+       BN_init(&a);
+       BN_init(&b);
+       BN_init(&c);
 
-       BN_rand(a,200,0,0);
+       BN_rand(&a,200,0,0);
        for (i=0; i<100; i++)
                {
-               BN_rand(b,250+i,0,0);
-               a->neg=rand_neg();
-               b->neg=rand_neg();
+               BN_rand(&b,250+i,0,0);
+               BN_rand(&b,200,0,0);
+               a.neg=rand_neg();
+               b.neg=rand_neg();
                if (bp == NULL)
                        for (j=0; j<100; j++)
-                               BN_mul(c,a,b);
-               BN_mul(c,a,b);
+                               BN_mul(&c,&a,&b,&ctx);
+               BN_mul(&c,&a,&b,&ctx);
+/*bn_do(&c,&a,&b,ctx); */
                if (bp != NULL)
                        {
                        if (!results)
                                {
-                               BN_print(bp,a);
+                               BN_print(bp,&a);
                                BIO_puts(bp," * ");
-                               BN_print(bp,b);
+                               BN_print(bp,&b);
                                BIO_puts(bp," - ");
                                }
-                       BN_print(bp,c);
+                       BN_print(bp,&c);
                        BIO_puts(bp,"\n");
                        }
                }
-       BN_free(a);
-       BN_free(b);
-       BN_free(c);
+       BN_free(&a);
+       BN_free(&b);
+       BN_free(&c);
+       BN_CTX_free(&ctx);
        return(1);
        }
 
@@ -395,36 +462,36 @@ int test_sqr(bp,ctx)
 BIO *bp;
 BN_CTX *ctx;
        {
-       BIGNUM *a,*c;
+       BIGNUM a,c;
        int i;
        int j;
 
-       a=BN_new();
-       c=BN_new();
+       BN_init(&a);
+       BN_init(&c);
 
        for (i=0; i<40; i++)
                {
-               BN_rand(a,40+i*10,0,0);
-               a->neg=rand_neg();
+               BN_rand(&a,40+i*10,0,0);
+               a.neg=rand_neg();
                if (bp == NULL)
                        for (j=0; j<100; j++)
-                               BN_sqr(c,a,ctx);
-               BN_sqr(c,a,ctx);
+                               BN_sqr(&c,&a,ctx);
+               BN_sqr(&c,&a,ctx);
                if (bp != NULL)
                        {
                        if (!results)
                                {
-                               BN_print(bp,a);
+                               BN_print(bp,&a);
                                BIO_puts(bp," * ");
-                               BN_print(bp,a);
+                               BN_print(bp,&a);
                                BIO_puts(bp," - ");
                                }
-                       BN_print(bp,c);
+                       BN_print(bp,&c);
                        BIO_puts(bp,"\n");
                        }
                }
-       BN_free(a);
-       BN_free(c);
+       BN_free(&a);
+       BN_free(&c);
        return(1);
        }
 
@@ -432,61 +499,61 @@ int test_mont(bp,ctx)
 BIO *bp;
 BN_CTX *ctx;
        {
-       BIGNUM *a,*b,*c,*A,*B;
-       BIGNUM *n;
+       BIGNUM a,b,c,A,B;
+       BIGNUM n;
        int i;
        int j;
        BN_MONT_CTX *mont;
 
-       a=BN_new();
-       b=BN_new();
-       c=BN_new();
-       A=BN_new();
-       B=BN_new();
-       n=BN_new();
+       BN_init(&a);
+       BN_init(&b);
+       BN_init(&c);
+       BN_init(&A);
+       BN_init(&B);
+       BN_init(&n);
 
        mont=BN_MONT_CTX_new();
 
-       BN_rand(a,100,0,0); /**/
-       BN_rand(b,100,0,0); /**/
+       BN_rand(&a,100,0,0); /**/
+       BN_rand(&b,100,0,0); /**/
        for (i=0; i<10; i++)
                {
-               BN_rand(n,(100%BN_BITS2+1)*BN_BITS2*i*BN_BITS2,0,1); /**/
-               BN_MONT_CTX_set(mont,n,ctx);
+               BN_rand(&n,(100%BN_BITS2+1)*BN_BITS2*i*BN_BITS2,0,1); /**/
+               BN_MONT_CTX_set(mont,&n,ctx);
 
-               BN_to_montgomery(A,a,mont,ctx);
-               BN_to_montgomery(B,b,mont,ctx);
+               BN_to_montgomery(&A,&a,mont,ctx);
+               BN_to_montgomery(&B,&b,mont,ctx);
 
                if (bp == NULL)
                        for (j=0; j<100; j++)
-                               BN_mod_mul_montgomery(c,A,B,mont,ctx);/**/
-               BN_mod_mul_montgomery(c,A,B,mont,ctx);/**/
-               BN_from_montgomery(A,c,mont,ctx);/**/
+                               BN_mod_mul_montgomery(&c,&A,&B,mont,ctx);/**/
+               BN_mod_mul_montgomery(&c,&A,&B,mont,ctx);/**/
+               BN_from_montgomery(&A,&c,mont,ctx);/**/
                if (bp != NULL)
                        {
                        if (!results)
                                {
 #ifdef undef
 fprintf(stderr,"%d * %d %% %d\n",
-BN_num_bits(a),
-BN_num_bits(b),
+BN_num_bits(&a),
+BN_num_bits(&b),
 BN_num_bits(mont->N));
 #endif
-                               BN_print(bp,a);
+                               BN_print(bp,&a);
                                BIO_puts(bp," * ");
-                               BN_print(bp,b);
+                               BN_print(bp,&b);
                                BIO_puts(bp," % ");
-                               BN_print(bp,mont->N);
+                               BN_print(bp,&(mont->N));
                                BIO_puts(bp," - ");
                                }
-                       BN_print(bp,A);
+                       BN_print(bp,&A);
                        BIO_puts(bp,"\n");
                        }
                }
        BN_MONT_CTX_free(mont);
-       BN_free(a);
-       BN_free(b);
-       BN_free(c);
+       BN_free(&a);
+       BN_free(&b);
+       BN_free(&c);
        return(1);
        }
 
diff --git a/crypto/bn/comba.pl b/crypto/bn/comba.pl
new file mode 100644 (file)
index 0000000..211a8b4
--- /dev/null
@@ -0,0 +1,285 @@
+#!/usr/local/bin/perl
+
+$num=8;
+$num2=8/2;
+
+print <<"EOF";
+/* crypto/bn/bn_comba.c */
+#include <stdio.h>
+#include "bn_lcl.h"
+/* Auto generated from crypto/bn/comba.pl
+ */
+
+#undef bn_mul_comba8
+#undef bn_mul_comba4
+#undef bn_sqr_comba8
+#undef bn_sqr_comba4
+
+#ifdef BN_LLONG
+#define mul_add_c(a,b,c0,c1,c2) \\
+       t=(BN_ULLONG)a*b; \\
+       t1=(BN_ULONG)Lw(t); \\
+       t2=(BN_ULONG)Hw(t); \\
+       c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \\
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define mul_add_c2(a,b,c0,c1,c2) \\
+       t=(BN_ULLONG)a*b; \\
+       tt=(t+t)&BN_MASK; \\
+       if (tt < t) c2++; \\
+       t1=(BN_ULONG)Lw(tt); \\
+       t2=(BN_ULONG)Hw(tt); \\
+       c0=(c0+t1)&BN_MASK2;  \\
+       if ((c0 < t1) && (((++t2)&BN_MASK2) == 0)) c2++; \\
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define sqr_add_c(a,i,c0,c1,c2) \\
+       t=(BN_ULLONG)a[i]*a[i]; \\
+       t1=(BN_ULONG)Lw(t); \\
+       t2=(BN_ULONG)Hw(t); \\
+       c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \\
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define sqr_add_c2(a,i,j,c0,c1,c2) \\
+       mul_add_c2((a)[i],(a)[j],c0,c1,c2)
+#else
+#define mul_add_c(a,b,c0,c1,c2) \\
+       t1=LBITS(a); t2=HBITS(a); \\
+       bl=LBITS(b); bh=HBITS(b); \\
+       mul64(t1,t2,bl,bh); \\
+       c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \\
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define mul_add_c2(a,b,c0,c1,c2) \\
+       t1=LBITS(a); t2=HBITS(a); \\
+       bl=LBITS(b); bh=HBITS(b); \\
+       mul64(t1,t2,bl,bh); \\
+       if (t2 & BN_TBIT) c2++; \\
+       t2=(t2+t2)&BN_MASK2; \\
+       if (t1 & BN_TBIT) t2++; \\
+       t1=(t1+t1)&BN_MASK2; \\
+       c0=(c0+t1)&BN_MASK2;  \\
+       if ((c0 < t1) && (((++t2)&BN_MASK2) == 0)) c2++; \\
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define sqr_add_c(a,i,c0,c1,c2) \\
+       sqr64(t1,t2,(a)[i]); \\
+       c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \\
+       c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;
+
+#define sqr_add_c2(a,i,j,c0,c1,c2) \\
+       mul_add_c2((a)[i],(a)[j],c0,c1,c2)
+#endif
+
+void bn_mul_comba${num}(r,a,b)
+BN_ULONG *r,*a,*b;
+       {
+#ifdef BN_LLONG
+       BN_ULLONG t;
+#else
+       BN_ULONG bl,bh;
+#endif
+       BN_ULONG t1,t2;
+       BN_ULONG c1,c2,c3;
+
+EOF
+$ret=&combas_mul("r","a","b",$num,"c1","c2","c3");
+printf <<"EOF";
+       }
+
+void bn_mul_comba${num2}(r,a,b)
+BN_ULONG *r,*a,*b;
+       {
+#ifdef BN_LLONG
+       BN_ULLONG t;
+#else
+       BN_ULONG bl,bh;
+#endif
+       BN_ULONG t1,t2;
+       BN_ULONG c1,c2,c3;
+
+EOF
+$ret=&combas_mul("r","a","b",$num2,"c1","c2","c3");
+printf <<"EOF";
+       }
+
+void bn_sqr_comba${num}(r,a)
+BN_ULONG *r,*a;
+       {
+#ifdef BN_LLONG
+       BN_ULLONG t,tt;
+#else
+       BN_ULONG bl,bh;
+#endif
+       BN_ULONG t1,t2;
+       BN_ULONG c1,c2,c3;
+
+EOF
+$ret=&combas_sqr("r","a",$num,"c1","c2","c3");
+printf <<"EOF";
+       }
+
+void bn_sqr_comba${num2}(r,a)
+BN_ULONG *r,*a;
+       {
+#ifdef BN_LLONG
+       BN_ULLONG t,tt;
+#else
+       BN_ULONG bl,bh;
+#endif
+       BN_ULONG t1,t2;
+       BN_ULONG c1,c2,c3;
+
+EOF
+$ret=&combas_sqr("r","a",$num2,"c1","c2","c3");
+printf <<"EOF";
+       }
+EOF
+
+sub bn_str
+       {
+       local($var,$val)=@_;
+       print "\t$var=$val;\n";
+       }
+
+sub bn_ary
+       {
+       local($var,$idx)=@_;
+       return("${var}[$idx]");
+       }
+
+sub bn_clr
+       {
+       local($var)=@_;
+
+       print "\t$var=0;\n";
+       }
+
+sub bn_mad
+       {
+       local($a,$b,$c0,$c1,$c2,$num)=@_;
+
+       if ($num == 2)
+               { printf("\tmul_add_c2($a,$b,$c0,$c1,$c2);\n"); }
+       else
+               { printf("\tmul_add_c($a,$b,$c0,$c1,$c2);\n"); }
+       }
+
+sub bn_sad
+       {
+       local($a,$i,$j,$c0,$c1,$c2,$num)=@_;
+
+       if ($num == 2)
+               { printf("\tsqr_add_c2($a,$i,$j,$c0,$c1,$c2);\n"); }
+       else
+               { printf("\tsqr_add_c($a,$i,$c0,$c1,$c2);\n"); }
+       }
+
+sub combas_mul
+       {
+       local($r,$a,$b,$num,$c0,$c1,$c2)=@_;
+       local($i,$as,$ae,$bs,$be,$ai,$bi);
+       local($tot,$end);
+
+       $as=0;
+       $ae=0;
+       $bs=0;
+       $be=0;
+       $tot=$num+$num-1;
+       &bn_clr($c0);
+       &bn_clr($c1);
+       for ($i=0; $i<$tot; $i++)
+               {
+               $ai=$as;
+               $bi=$bs;
+               $end=$be+1;
+               @numa=@numb=();
+
+#print "($as $ae) ($bs $be) $bs -> $end [$i $num]\n";
+               for ($j=$bs; $j<$end; $j++)
+                       {
+                       push(@numa,$ai);
+                       push(@numb,$bi);
+                       $ai--;
+                       $bi++;
+                       }
+
+               if ($i & 1)
+                       {
+                       @numa=reverse(@numa);
+                       @numb=reverse(@numb);
+                       }
+
+               &bn_clr($c2);
+               for ($j=0; $j<=$#numa; $j++)
+                       {
+                       &bn_mad(&bn_ary($a,$numa[$j]),
+                               &bn_ary($b,$numb[$j]),$c0,$c1,$c2,1);
+                       }
+               &bn_str(&bn_ary($r,$i),$c0);
+               ($c0,$c1,$c2)=($c1,$c2,$c0);
+
+               $as++ if ($i < ($num-1));
+               $ae++ if ($i >= ($num-1));
+
+               $bs++ if ($i >= ($num-1));
+               $be++ if ($i < ($num-1));
+               }
+       &bn_str(&bn_ary($r,$i),$c0);
+       }
+
+sub combas_sqr
+       {
+       local($r,$a,$num,$c0,$c1,$c2)=@_;
+       local($i,$as,$ae,$bs,$be,$ai,$bi);
+       local($b,$tot,$end,$half);
+
+       $b=$a;
+       $as=0;
+       $ae=0;
+       $bs=0;
+       $be=0;
+       $tot=$num+$num-1;
+       &bn_clr($c0);
+       &bn_clr($c1);
+       for ($i=0; $i<$tot; $i++)
+               {
+               $ai=$as;
+               $bi=$bs;
+               $end=$be+1;
+               @numa=@numb=();
+
+#print "($as $ae) ($bs $be) $bs -> $end [$i $num]\n";
+               for ($j=$bs; $j<$end; $j++)
+                       {
+                       push(@numa,$ai);
+                       push(@numb,$bi);
+                       $ai--;
+                       $bi++;
+                       last if ($ai < $bi);
+                       }
+               if (!($i & 1))
+                       {
+                       @numa=reverse(@numa);
+                       @numb=reverse(@numb);
+                       }
+
+               &bn_clr($c2);
+               for ($j=0; $j <= $#numa; $j++)
+                       {
+                       if ($numa[$j] == $numb[$j])
+                               {&bn_sad($a,$numa[$j],$numb[$j],$c0,$c1,$c2,1);}
+                       else
+                               {&bn_sad($a,$numa[$j],$numb[$j],$c0,$c1,$c2,2);}
+                       }
+               &bn_str(&bn_ary($r,$i),$c0);
+               ($c0,$c1,$c2)=($c1,$c2,$c0);
+
+               $as++ if ($i < ($num-1));
+               $ae++ if ($i >= ($num-1));
+
+               $bs++ if ($i >= ($num-1));
+               $be++ if ($i < ($num-1));
+               }
+       &bn_str(&bn_ary($r,$i),$c0);
+       }
diff --git a/crypto/bn/d.c b/crypto/bn/d.c
new file mode 100644 (file)
index 0000000..f738b50
--- /dev/null
@@ -0,0 +1,72 @@
+#include <stdio.h>
+#include "bio.h"
+#include "bn_lcl.h"
+
+#define SIZE_A (100*4+4)
+#define SIZE_B (13*4)
+
+main(argc,argv)
+int argc;
+char *argv[];
+       {
+       BN_CTX ctx;
+       BN_RECP_CTX recp;
+       BIGNUM a,b,dd,d,r,rr,t,l;
+       int i;
+
+       MemCheck_start();
+       MemCheck_on();
+       BN_CTX_init(&ctx);
+       BN_RECP_CTX_init(&recp);
+
+       BN_init(&r);
+       BN_init(&rr);
+       BN_init(&d);
+       BN_init(&dd);
+       BN_init(&a);
+       BN_init(&b);
+
+       {
+       BN_rand(&a,SIZE_A,0,0);
+       BN_rand(&b,SIZE_B,0,0);
+
+       a.neg=1;
+       BN_RECP_CTX_set(&recp,&b,&ctx);
+
+       BN_print_fp(stdout,&a); printf(" a\n");
+       BN_print_fp(stdout,&b); printf(" b\n");
+
+       BN_print_fp(stdout,&recp.N); printf(" N\n");
+       BN_print_fp(stdout,&recp.Nr); printf(" Nr num_bits=%d\n",recp.num_bits);
+
+       BN_div_recp(&r,&d,&a,&recp,&ctx);
+
+for (i=0; i<300; i++)
+       BN_div(&rr,&dd,&a,&b,&ctx);
+
+       BN_print_fp(stdout,&r); printf(" div recp\n");
+       BN_print_fp(stdout,&rr); printf(" div\n");
+       BN_print_fp(stdout,&d); printf(" rem recp\n");
+       BN_print_fp(stdout,&dd); printf(" rem\n");
+       }
+       BN_CTX_free(&ctx);
+       BN_RECP_CTX_free(&recp);
+
+       BN_free(&r);
+       BN_free(&rr);
+       BN_free(&d);
+       BN_free(&dd);
+       BN_free(&a);
+       BN_free(&b);
+
+       {
+       BIO *out;
+
+       if ((out=BIO_new(BIO_s_file())) != NULL)
+               BIO_set_fp(out,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
+
+        CRYPTO_mem_leaks(out);
+       BIO_free(out);
+       }
+
+       }
diff --git a/crypto/bn/exp.c b/crypto/bn/exp.c
new file mode 100644 (file)
index 0000000..2427116
--- /dev/null
@@ -0,0 +1,60 @@
+#include <stdio.h>
+#include "tmdiff.h"
+#include "bn_lcl.h"
+
+#define SIZE   256
+#define NUM    (8*8*8)
+#define MOD    (8*8*8*8*8)
+
+main(argc,argv)
+int argc;
+char *argv[];
+       {
+       BN_CTX ctx;
+       BIGNUM a,b,c,r,rr,t,l;
+       int j,i,size=SIZE,num=NUM,mod=MOD;
+       char *start,*end;
+       BN_MONT_CTX mont;
+       double d,md;
+
+       BN_MONT_CTX_init(&mont);
+       BN_CTX_init(&ctx);
+       BN_init(&a);
+       BN_init(&b);
+       BN_init(&c);
+       BN_init(&r);
+
+       start=ms_time_new();
+       end=ms_time_new();
+       while (size <= 1024*8)
+               {
+               BN_rand(&a,size,0,0);
+               BN_rand(&b,size,1,0);
+               BN_rand(&c,size,0,1);
+
+               BN_mod(&a,&a,&c,&ctx);
+
+               ms_time_get(start);
+               for (i=0; i<10; i++)
+                       BN_MONT_CTX_set(&mont,&c,&ctx);
+               ms_time_get(end);
+               md=ms_time_diff(start,end);
+
+               ms_time_get(start);
+               for (i=0; i<num; i++)
+                       {
+                       //bn_mull(&r,&a,&b,&ctx);
+                       //BN_sqr(&r,&a,&ctx);
+                       BN_mod_exp_mont(&r,&a,&b,&c,&ctx,&mont);
+                       }
+               ms_time_get(end);
+               d=ms_time_diff(start,end) *50/33 /**/;
+               printf("%5d bit:%6.2f %6d %6.4f %4d m_set(%5.4f)\n",size,
+                       d,num,d/num,(int)((d/num)*mod),md/10.0);
+               num/=8;
+               mod/=8;
+               if (num <= 0) num=1;
+               size*=2;
+               }
+
+       }
index 344f883d35f10c55d1a65d64faa7ee138af16ffd..fe00373246cf2e6bf35d062ff3f9c5d6a6402aa1 100644 (file)
@@ -94,7 +94,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
index 67dc95d72602d20e1a8dda0a3048a6b5b4110ef4..1ec61c2c87be40b0bc1ccad2aca8990b545fe048 100644 (file)
@@ -79,6 +79,8 @@ char *argv[];
        unsigned char c;
        BIGNUM *r_mont,*r_recp,*a,*b,*m;
 
+       ERR_load_BN_strings();
+
        ctx=BN_CTX_new();
        if (ctx == NULL) exit(1);
        r_mont=BN_new();
@@ -114,11 +116,19 @@ char *argv[];
 
                ret=BN_mod_exp_mont(r_mont,a,b,m,ctx,NULL);
                if (ret <= 0)
-                       { printf("BN_mod_exp_mont() problems\n"); exit(1); }
+                       {
+                       printf("BN_mod_exp_mont() problems\n");
+                       ERR_print_errors(out);
+                       exit(1);
+                       }
 
                ret=BN_mod_exp_recp(r_recp,a,b,m,ctx);
                if (ret <= 0)
-                       { printf("BN_mod_exp_recp() problems\n"); exit(1); }
+                       {
+                       printf("BN_mod_exp_recp() problems\n");
+                       ERR_print_errors(out);
+                       exit(1);
+                       }
                
                if (BN_cmp(r_mont,r_recp) != 0)
                        {
@@ -137,6 +147,7 @@ char *argv[];
                        fflush(stdout);
                        }
                }
+       CRYPTO_mem_leaks(out);
        printf(" done\n");
        exit(0);
 err:
diff --git a/crypto/bn/m.pl b/crypto/bn/m.pl
new file mode 100644 (file)
index 0000000..f69b036
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/local/bin/perl
+
+
+for ($i=0; $i<256; $i++)
+       {
+       for ($j=0; $j<256; $j++)
+               {
+               $a0=$i&0x0f;
+               $a1=($i>>4)&0x0f;
+               $b0=$j&0x0f;
+               $b1=($j>>4)&0x0f;
+
+               $a0b0=$a0*$b0;
+               $a1b1=$a1*$b1;
+
+               $a01=$a0-$a1;
+               $b10=$b1-$b0;
+               $a01b10=$a01*$b10;
+
+               if ($a01b10 < 0)
+                       {
+                       $neg=1;
+                       $a01b10= -$a01b10;
+                       }
+               $t=($a0b0>>4)+($a0b0&0x0f)+($a1b1&0x0f);
+               if ($neg)
+                       { $t-=($a01b10&0x0f); }
+               else    { $t+=($a01b10&0x0f); }
+               printf("%02X %s%02X %02X\n",$a1b1,($neg)?"-":" ",$a01b10,$a0b0)
+                       if ($t < 0)
+               }
+       }
diff --git a/crypto/bn/new b/crypto/bn/new
new file mode 100644 (file)
index 0000000..285d506
--- /dev/null
@@ -0,0 +1,23 @@
+void BN_RECP_CTX_init(BN_RECP_CTX *recp);
+BN_RECP_CTX *BN_RECP_CTX_new();
+void BN_RECP_CTX_free(BN_RECP_CTX *recp);
+int BN_RECP_CTX_set(BN_RECP_CTX *recp,BIGNUM *div,BN_CTX *ctx);
+
+int BN_mod_exp_recp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BIGNUM *m,
+       BN_RECP_CTX *recp,BN_CTX *ctx);
+
+int BN_div_recp(BIGNUM *dv, BIGNUM *rem, BIGNUM *m, BIGNUM *d,
+       BN_RECP_CTX *recp, BN_CTX *ctx);
+int BN_mod_recp(BIGNUM *rem, BIGNUM *m, BIGNUM *d,
+       BN_RECP_CTX *recp, BN_CTX *ctx);
+int BN_mod_mul_recp(BIGNUM *ret,BIGNUM *a,BIGNUM *b,BIGNUM *m
+
+int BN_mod_exp_montgomery(BIGNUM *r, BIGNUM *a, BIGNUM *p,
+       BN_MONT_CTX *m_ctx,BN_CTX *ctx);
+int BN_mod_exp2_montgomery(BIGNUM *r, BIGNUM *a1, BIGNUM *p1,BIGNUM *a2,
+                BIGNUM *p2,BN_MONT_CTX *m_ctx,BN_CTX *ctx);
+
+
+bn_div64 -> bn_div_words
+
+
diff --git a/crypto/bn/old/b_sqr.c b/crypto/bn/old/b_sqr.c
new file mode 100644 (file)
index 0000000..e1a61b8
--- /dev/null
@@ -0,0 +1,205 @@
+/* crypto/bn/bn_mul.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include "cryptlib.h"
+#include "bn_lcl.h"
+
+static int bn_mm(BIGNUM *m,BIGNUM *A,BIGNUM *B, BIGNUM *sk,BN_CTX *ctx);
+
+/* r must be different to a and b */
+/* int BN_mmul(r, a, b) */
+int BN_mul(r, a, b)
+BIGNUM *r;
+BIGNUM *a;
+BIGNUM *b;
+       {
+       BN_ULONG *ap,*bp,*rp;
+       BIGNUM *sk;
+       int i,n,ret;
+       int max,al,bl;
+       BN_CTX ctx;
+
+       bn_check_top(a);
+       bn_check_top(b);
+
+       al=a->top;
+       bl=b->top;
+       if ((al == 0) || (bl == 0))
+               {
+               r->top=0;
+               return(1);
+               }
+#ifdef BN_MUL_DEBUG
+printf("BN_mul(%d,%d)\n",a->top,b->top);
+#endif
+
+       if (    (bn_limit_bits > 0) &&
+               (bl > bn_limit_num) && (al > bn_limit_num))
+               {
+               n=(BN_num_bits_word(al|bl)-bn_limit_bits);
+               n*=2;
+               sk=(BIGNUM *)Malloc(sizeof(BIGNUM)*n);
+               memset(sk,0,sizeof(BIGNUM)*n);
+               memset(&ctx,0,sizeof(ctx));
+
+               ret=bn_mm(r,a,b,&(sk[0]),&ctx);
+               for (i=0; i<n; i+=2)
+                       {
+                       BN_clear_free(&sk[i]);
+                       BN_clear_free(&sk[i+1]);
+                       }
+               Free(sk);
+               return(ret);
+               }
+
+       max=(al+bl);
+       if (bn_wexpand(r,max) == NULL) return(0);
+       r->top=max;
+       r->neg=a->neg^b->neg;
+       ap=a->d;
+       bp=b->d;
+       rp=r->d;
+
+       rp[al]=bn_mul_words(rp,ap,al,*(bp++));
+       rp++;
+       for (i=1; i<bl; i++)
+               {
+               rp[al]=bn_mul_add_words(rp,ap,al,*(bp++));
+               rp++;
+               }
+       if ((max > 0) && (r->d[max-1] == 0)) r->top--;
+       return(1);
+       }
+
+
+#define ahal   (sk[0])
+#define blbh   (sk[1])
+
+/* r must be different to a and b */
+int bn_mm(m, A, B, sk,ctx)
+BIGNUM *m,*A,*B;
+BIGNUM *sk;
+BN_CTX *ctx;
+       {
+       int n,num,sqr=0;
+       int an,bn;
+       BIGNUM ah,al,bh,bl;
+
+       an=A->top;
+       bn=B->top;
+#ifdef BN_MUL_DEBUG
+printf("bn_mm(%d,%d)\n",A->top,B->top);
+#endif
+
+       if (A == B) sqr=1;
+       num=(an>bn)?an:bn;
+       n=(num+1)/2;
+       /* Are going to now chop things into 'num' word chunks. */
+
+       BN_init(&ah);
+       BN_init(&al);
+       BN_init(&bh);
+       BN_init(&bl);
+
+       bn_set_low (&al,A,n);
+       bn_set_high(&ah,A,n);
+       bn_set_low (&bl,B,n);
+       bn_set_high(&bh,B,n);
+
+       BN_sub(&ahal,&ah,&al);
+       BN_sub(&blbh,&bl,&bh);
+
+       if (num <= (bn_limit_num+bn_limit_num))
+               {
+               BN_mul(m,&ahal,&blbh);
+               if (sqr)
+                       {
+                       BN_sqr(&ahal,&al,ctx);
+                       BN_sqr(&blbh,&ah,ctx);
+                       }
+               else
+                       {
+                       BN_mul(&ahal,&al,&bl);
+                       BN_mul(&blbh,&ah,&bh);
+                       }
+               }
+       else
+               {
+               bn_mm(m,&ahal,&blbh,&(sk[2]),ctx);
+               bn_mm(&ahal,&al,&bl,&(sk[2]),ctx);
+               bn_mm(&blbh,&ah,&bh,&(sk[2]),ctx);
+               }
+
+       BN_add(m,m,&ahal);
+       BN_add(m,m,&blbh);
+
+       BN_lshift(m,m,n*BN_BITS2);
+       BN_lshift(&blbh,&blbh,n*BN_BITS2*2);
+
+       BN_add(m,m,&ahal);
+       BN_add(m,m,&blbh);
+
+       m->neg=A->neg^B->neg;
+       return(1);
+       }
+#undef ahal    (sk[0])
+#undef blbh    (sk[1])
+
+#include "bn_low.c"
+#include "bn_high.c"
diff --git a/crypto/bn/old/bn_com.c b/crypto/bn/old/bn_com.c
new file mode 100644 (file)
index 0000000..7666b23
--- /dev/null
@@ -0,0 +1,90 @@
+/* crypto/bn/bn_mulw.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include "cryptlib.h"
+#include "bn_lcl.h"
+
+#ifdef BN_LLONG 
+
+ab
+12
+   a2 b2
+a1 b1
+
+abc
+123
+      a3 b3 c3
+   a2 b2 c2
+a1 b1 c1
+
+abcd
+1234
+         a4 b4 c4 d4
+      a3 b3 c3 d3
+   a2 b2 c2 d2
+a1 b1 c1 d1
+
+abcde
+01234
+               a5 b5 c5 d5 e5
+            a4 b4 c4 d4 e4
+         a3 b3 c3 d3 e3
+      a2 b2 c2 d2 e2
+   a1 b1 c1 d1 e1
+a0 b0 c0 d0 e0
diff --git a/crypto/bn/old/bn_high.c b/crypto/bn/old/bn_high.c
new file mode 100644 (file)
index 0000000..90268fb
--- /dev/null
@@ -0,0 +1,137 @@
+#include <stdio.h>
+#include "cryptlib.h"
+#include "bn_lcl.h"
+
+#undef BN_MUL_HIGH_DEBUG
+
+#ifdef BN_MUL_HIGH_DEBUG
+#define debug_BN_print(a,b,c) BN_print_fp(a,b); printf(c);
+#else
+#define debug_BN_print(a,b,c)
+#endif
+
+int BN_mul_high(BIGNUM *r,BIGNUM *a,BIGNUM *b,BIGNUM *low, int words);
+
+#undef t1
+#undef t2
+
+int BN_mul_high(r,a,b,low,words)
+BIGNUM *r,*a,*b,*low;
+int words;
+       {
+       int w2,borrow=0,full=0;
+       BIGNUM t1,t2,t3,h,ah,al,bh,bl,m,s0,s1;
+       BN_ULONG ul1,ul2;
+       
+       BN_mul(r,a,b);
+       BN_rshift(r,r,words*BN_BITS2);
+       return(1);
+
+       w2=(words+1)/2;
+
+#ifdef BN_MUL_HIGH_DEBUG
+fprintf(stdout,"words=%d w2=%d\n",words,w2);
+#endif
+debug_BN_print(stdout,a," a\n");
+debug_BN_print(stdout,b," b\n");
+debug_BN_print(stdout,low," low\n");
+       BN_init(&al); BN_init(&ah);
+       BN_init(&bl); BN_init(&bh);
+       BN_init(&t1); BN_init(&t2); BN_init(&t3);
+       BN_init(&s0); BN_init(&s1);
+       BN_init(&h); BN_init(&m);
+
+       bn_set_low (&al,a,w2);
+       bn_set_high(&ah,a,w2);
+       bn_set_low (&bl,b,w2);
+       bn_set_high(&bh,b,w2);
+
+       bn_set_low(&s0,low,w2);
+       bn_set_high(&s1,low,w2);
+
+debug_BN_print(stdout,&al," al\n");
+debug_BN_print(stdout,&ah," ah\n");
+debug_BN_print(stdout,&bl," bl\n");
+debug_BN_print(stdout,&bh," bh\n");
+debug_BN_print(stdout,&s0," s0\n");
+debug_BN_print(stdout,&s1," s1\n");
+
+       /* Calculate (al-ah)*(bh-bl) */
+       BN_sub(&t1,&al,&ah);
+       BN_sub(&t2,&bh,&bl);
+       BN_mul(&m,&t1,&t2);
+
+       /* Calculate ah*bh */
+       BN_mul(&h,&ah,&bh);
+
+       /* s0 == low(al*bl)
+        * s1 == low(ah*bh)+low((al-ah)*(bh-bl))+low(al*bl)+high(al*bl)
+        * We know s0 and s1 so the only unknown is high(al*bl)
+        * high(al*bl) == s1 - low(ah*bh+(al-ah)*(bh-bl)+s0)
+        */
+       BN_add(&m,&m,&h);
+       BN_add(&t2,&m,&s0);
+
+debug_BN_print(stdout,&t2," middle value\n");
+
+       /* Quick and dirty mask off of high words */
+       if (w2 < t2.top) t2.top=w2;
+#if 0
+       bn_set_low(&t3,&t2,w2);
+#endif
+
+debug_BN_print(stdout,&t2," low middle value\n");
+       BN_sub(&t1,&s1,&t2);
+
+       if (t1.neg)
+               {
+debug_BN_print(stdout,&t1," before\n");
+               BN_zero(&t2);
+               BN_set_bit(&t2,w2*BN_BITS2);
+               BN_add(&t1,&t2,&t1);
+               /* BN_mask_bits(&t1,w2*BN_BITS2); */
+               /* if (words < t1.top) t1.top=words; */
+debug_BN_print(stdout,&t1," after\n");
+               borrow=1;
+               }
+
+/* XXXXX SPEED THIS UP */
+       /* al*bl == high(al*bl)<<words+s0 */
+       BN_lshift(&t1,&t1,w2*BN_BITS2);
+       BN_add(&t1,&t1,&s0);
+       if (w2*2 < t1.top) t1.top=w2*2; /* This should not happen? */
+       
+       /* We now have
+        * al*bl                        - t1
+        * (al-ah)*(bh-bl)+ah*bh        - m
+        * ah*bh                        - h
+        */
+#if 0
+       BN_add(&m,&m,&t1);
+debug_BN_print(stdout,&t1," s10\n");
+debug_BN_print(stdout,&m," s21\n");
+debug_BN_print(stdout,&h," s32\n");
+       BN_lshift(&m,&m,w2*BN_BITS2);
+       BN_lshift(&h,&h,w2*2*BN_BITS2);
+       BN_add(r,&m,&t1);
+       BN_add(r,r,&h);
+       BN_rshift(r,r,w2*2*BN_BITS2);
+#else
+       BN_add(&m,&m,&t1);              /* Do a cmp then +1 if needed? */
+       bn_set_high(&t3,&t1,w2);
+       BN_add(&m,&m,&t3);
+       bn_set_high(&t3,&m,w2);
+       BN_add(r,&h,&t3);
+#endif
+
+#ifdef BN_MUL_HIGH_DEBUG
+printf("carry=%d\n",borrow);
+#endif
+debug_BN_print(stdout,r," ret\n");
+       BN_free(&t1); BN_free(&t2);
+       BN_free(&m); BN_free(&h);
+       return(1);
+       }
+
+
+
diff --git a/crypto/bn/old/bn_ka.c b/crypto/bn/old/bn_ka.c
new file mode 100644 (file)
index 0000000..b49a52a
--- /dev/null
@@ -0,0 +1,578 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <strings.h>
+#include "bn_lcl.h"
+
+/* r is 2*n2 words in size,
+ * a and b are both n2 words in size.
+ * n2 must be a power of 2.
+ * We multiply and return the result.
+ * t must be 2*n2 words in size
+ * We calulate
+ * a[0]*b[0]
+ * a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0])
+ * a[1]*b[1]
+ */
+void bn_mul_recursive(r,a,b,n2,t)
+BN_ULONG *r,*a,*b;
+int n2;
+BN_ULONG *t;
+       {
+       int n=n2/2;
+       int neg,zero,c1,c2;
+       BN_ULONG ln,lo,*p;
+
+#ifdef BN_COUNT
+printf(" bn_mul_recursive %d * %d\n",n2,n2);
+#endif
+       if (n2 <= 8)
+               {
+               if (n2 == 8)
+                       bn_mul_comba8(r,a,b);
+               else
+                       bn_mul_normal(r,a,n2,b,n2);
+               return;
+               }
+
+       if (n2 < BN_MUL_RECURSIVE_SIZE_NORMAL)
+               {
+               /* This should not happen */
+               /*abort(); */
+               bn_mul_normal(r,a,n2,b,n2);
+               return;
+               }
+       /* r=(a[0]-a[1])*(b[1]-b[0]) */
+       c1=bn_cmp_words(a,&(a[n]),n);
+       c2=bn_cmp_words(&(b[n]),b,n);
+       zero=neg=0;
+       switch (c1*3+c2)
+               {
+       case -4:
+               bn_sub_words(t,      &(a[n]),a,      n); /* - */
+               bn_sub_words(&(t[n]),b,      &(b[n]),n); /* - */
+               break;
+       case -3:
+               zero=1;
+               break;
+       case -2:
+               bn_sub_words(t,      &(a[n]),a,      n); /* - */
+               bn_sub_words(&(t[n]),&(b[n]),b,      n); /* + */
+               neg=1;
+               break;
+       case -1:
+       case 0:
+       case 1:
+               zero=1;
+               break;
+       case 2:
+               bn_sub_words(t,      a,      &(a[n]),n); /* + */
+               bn_sub_words(&(t[n]),b,      &(b[n]),n); /* - */
+               neg=1;
+               break;
+       case 3:
+               zero=1;
+               break;
+       case 4:
+               bn_sub_words(t,      a,      &(a[n]),n);
+               bn_sub_words(&(t[n]),&(b[n]),b,      n);
+               break;
+               }
+
+       if (n == 8)
+               {
+               if (!zero)
+                       bn_mul_comba8(&(t[n2]),t,&(t[n]));
+               else
+                       memset(&(t[n2]),0,8*sizeof(BN_ULONG));
+               
+               bn_mul_comba8(r,a,b);
+               bn_mul_comba8(&(r[n2]),&(a[n]),&(b[n]));
+               }
+       else
+               {
+               p= &(t[n2*2]);
+               if (!zero)
+                       bn_mul_recursive(&(t[n2]),t,&(t[n]),n,p);
+               else
+                       memset(&(t[n2]),0,n*sizeof(BN_ULONG));
+               bn_mul_recursive(r,a,b,n,p);
+               bn_mul_recursive(&(r[n2]),&(a[n]),&(b[n]),n,p);
+               }
+
+       /* t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign
+        * r[10] holds (a[0]*b[0])
+        * r[32] holds (b[1]*b[1])
+        */
+
+       c1=bn_add_words(t,r,&(r[n2]),n2);
+
+       if (neg) /* if t[32] is negative */
+               {
+               c1-=bn_sub_words(&(t[n2]),t,&(t[n2]),n2);
+               }
+       else
+               {
+               /* Might have a carry */
+               c1+=bn_add_words(&(t[n2]),&(t[n2]),t,n2);
+               }
+
+       /* t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1])
+        * r[10] holds (a[0]*b[0])
+        * r[32] holds (b[1]*b[1])
+        * c1 holds the carry bits
+        */
+       c1+=bn_add_words(&(r[n]),&(r[n]),&(t[n2]),n2);
+       if (c1)
+               {
+               p= &(r[n+n2]);
+               lo= *p;
+               ln=(lo+c1)&BN_MASK2;
+               *p=ln;
+
+               /* The overflow will stop before we over write
+                * words we should not overwrite */
+               if (ln < c1)
+                       {
+                       do      {
+                               p++;
+                               lo= *p;
+                               ln=(lo+1)&BN_MASK2;
+                               *p=ln;
+                               } while (ln == 0);
+                       }
+               }
+       }
+
+/* n+tn is the word length
+ * t needs to be n*4 is size, as does r */
+void bn_mul_part_recursive(r,a,b,tn,n,t)
+BN_ULONG *r,*a,*b;
+int tn,n;
+BN_ULONG *t;
+       {
+       int n2=n*2,i,j;
+       int c1;
+       BN_ULONG ln,lo,*p;
+
+#ifdef BN_COUNT
+printf(" bn_mul_part_recursive %d * %d\n",tn+n,tn+n);
+#endif
+       if (n < 8)
+               {
+               i=tn+n;
+               bn_mul_normal(r,a,i,b,i);
+               return;
+               }
+
+       /* r=(a[0]-a[1])*(b[1]-b[0]) */
+       bn_sub_words(t,      a,      &(a[n]),n); /* + */
+       bn_sub_words(&(t[n]),b,      &(b[n]),n); /* - */
+
+       if (n == 8)
+               {
+               bn_mul_comba8(&(t[n2]),t,&(t[n]));
+               bn_mul_comba8(r,a,b);
+               bn_mul_normal(&(r[n2]),&(a[n]),tn,&(b[n]),tn);
+               memset(&(r[n2+tn*2]),0,sizeof(BN_ULONG)*(n2-tn*2));
+               }
+       else
+               {
+               p= &(t[n2*2]);
+               bn_mul_recursive(&(t[n2]),t,&(t[n]),n,p);
+               bn_mul_recursive(r,a,b,n,p);
+               i=n/2;
+               /* If there is only a bottom half to the number,
+                * just do it */
+               j=tn-i;
+               if (j == 0)
+                       {
+                       bn_mul_recursive(&(r[n2]),&(a[n]),&(b[n]),i,p);
+                       memset(&(r[n2+i*2]),0,sizeof(BN_ULONG)*(n2-i*2));
+                       }
+               else if (j > 0) /* eg, n == 16, i == 8 and tn == 11 */
+                               {
+                               bn_mul_part_recursive(&(r[n2]),&(a[n]),&(b[n]),
+                                       j,i,p);
+                               memset(&(r[n2+tn*2]),0,
+                                       sizeof(BN_ULONG)*(n2-tn*2));
+                               }
+               else /* (j < 0) eg, n == 16, i == 8 and tn == 5 */
+                       {
+                       memset(&(r[n2]),0,sizeof(BN_ULONG)*(tn*2));
+                       for (;;)
+                               {
+                               i/=2;
+                               if (i < tn)
+                                       {
+                                       bn_mul_part_recursive(&(r[n2]),
+                                               &(a[n]),&(b[n]),
+                                               tn-i,i,p);
+                                       break;
+                                       }
+                               else if (i == tn)
+                                       {
+                                       bn_mul_recursive(&(r[n2]),
+                                               &(a[n]),&(b[n]),
+                                               i,p);
+                                       break;
+                                       }
+                               }
+                       }
+               }
+
+       /* t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign
+        * r[10] holds (a[0]*b[0])
+        * r[32] holds (b[1]*b[1])
+        */
+
+       c1=bn_add_words(t,r,&(r[n2]),n2);
+       c1-=bn_sub_words(&(t[n2]),t,&(t[n2]),n2);
+
+       /* t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1])
+        * r[10] holds (a[0]*b[0])
+        * r[32] holds (b[1]*b[1])
+        * c1 holds the carry bits
+        */
+       c1+=bn_add_words(&(r[n]),&(r[n]),&(t[n2]),n2);
+       if (c1)
+               {
+               p= &(r[n+n2]);
+               lo= *p;
+               ln=(lo+c1)&BN_MASK2;
+               *p=ln;
+
+               /* The overflow will stop before we over write
+                * words we should not overwrite */
+               if (ln < c1)
+                       {
+                       do      {
+                               p++;
+                               lo= *p;
+                               ln=(lo+1)&BN_MASK2;
+                               *p=ln;
+                               } while (ln == 0);
+                       }
+               }
+       }
+
+/* r is 2*n words in size,
+ * a and b are both n words in size.
+ * n must be a power of 2.
+ * We multiply and return the result.
+ * t must be 2*n words in size
+ * We calulate
+ * a[0]*b[0]
+ * a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0])
+ * a[1]*b[1]
+ */
+void bn_sqr_recursive(r,a,n2,t)
+BN_ULONG *r,*a;
+int n2;
+BN_ULONG *t;
+       {
+       int n=n2/2;
+       int zero,c1;
+       BN_ULONG ln,lo,*p;
+
+#ifdef BN_COUNT
+printf(" bn_sqr_recursive %d * %d\n",n2,n2);
+#endif
+       if (n2 == 4)
+               {
+               bn_sqr_comba4(r,a);
+               return;
+               }
+       else if (n2 == 8)
+               {
+               bn_sqr_comba8(r,a);
+               return;
+               }
+       if (n2 < BN_SQR_RECURSIVE_SIZE_NORMAL)
+               {
+               bn_sqr_normal(r,a,n2,t);
+               return;
+               abort();
+               }
+       /* r=(a[0]-a[1])*(a[1]-a[0]) */
+       c1=bn_cmp_words(a,&(a[n]),n);
+       zero=0;
+       if (c1 > 0)
+               bn_sub_words(t,a,&(a[n]),n);
+       else if (c1 < 0)
+               bn_sub_words(t,&(a[n]),a,n);
+       else
+               zero=1;
+
+       /* The result will always be negative unless it is zero */
+
+       if (n == 8)
+               {
+               if (!zero)
+                       bn_sqr_comba8(&(t[n2]),t);
+               else
+                       memset(&(t[n2]),0,8*sizeof(BN_ULONG));
+               
+               bn_sqr_comba8(r,a);
+               bn_sqr_comba8(&(r[n2]),&(a[n]));
+               }
+       else
+               {
+               p= &(t[n2*2]);
+               if (!zero)
+                       bn_sqr_recursive(&(t[n2]),t,n,p);
+               else
+                       memset(&(t[n2]),0,n*sizeof(BN_ULONG));
+               bn_sqr_recursive(r,a,n,p);
+               bn_sqr_recursive(&(r[n2]),&(a[n]),n,p);
+               }
+
+       /* t[32] holds (a[0]-a[1])*(a[1]-a[0]), it is negative or zero
+        * r[10] holds (a[0]*b[0])
+        * r[32] holds (b[1]*b[1])
+        */
+
+       c1=bn_add_words(t,r,&(r[n2]),n2);
+
+       /* t[32] is negative */
+       c1-=bn_sub_words(&(t[n2]),t,&(t[n2]),n2);
+
+       /* t[32] holds (a[0]-a[1])*(a[1]-a[0])+(a[0]*a[0])+(a[1]*a[1])
+        * r[10] holds (a[0]*a[0])
+        * r[32] holds (a[1]*a[1])
+        * c1 holds the carry bits
+        */
+       c1+=bn_add_words(&(r[n]),&(r[n]),&(t[n2]),n2);
+       if (c1)
+               {
+               p= &(r[n+n2]);
+               lo= *p;
+               ln=(lo+c1)&BN_MASK2;
+               *p=ln;
+
+               /* The overflow will stop before we over write
+                * words we should not overwrite */
+               if (ln < c1)
+                       {
+                       do      {
+                               p++;
+                               lo= *p;
+                               ln=(lo+1)&BN_MASK2;
+                               *p=ln;
+                               } while (ln == 0);
+                       }
+               }
+       }
+
+#if 1
+/* a and b must be the same size, which is n2.
+ * r needs to be n2 words and t needs to be n2*2
+ */
+void bn_mul_low_recursive(r,a,b,n2,t)
+BN_ULONG *r,*a,*b;
+int n2;
+BN_ULONG *t;
+       {
+       int n=n2/2;
+
+#ifdef BN_COUNT
+printf(" bn_mul_low_recursive %d * %d\n",n2,n2);
+#endif
+
+       bn_mul_recursive(r,a,b,n,&(t[0]));
+       if (n > BN_MUL_LOW_RECURSIVE_SIZE_NORMAL)
+               {
+               bn_mul_low_recursive(&(t[0]),&(a[0]),&(b[n]),n,&(t[n2]));
+               bn_add_words(&(r[n]),&(r[n]),&(t[0]),n);
+               bn_mul_low_recursive(&(t[0]),&(a[n]),&(b[0]),n,&(t[n2]));
+               bn_add_words(&(r[n]),&(r[n]),&(t[0]),n);
+               }
+       else
+               {
+               bn_mul_low_normal(&(t[0]),&(a[0]),&(b[n]),n);
+               bn_mul_low_normal(&(t[n]),&(a[n]),&(b[0]),n);
+               bn_add_words(&(r[n]),&(r[n]),&(t[0]),n);
+               bn_add_words(&(r[n]),&(r[n]),&(t[n]),n);
+               }
+       }
+
+/* a and b must be the same size, which is n2.
+ * r needs to be n2 words and t needs to be n2*2
+ * l is the low words of the output.
+ * t needs to be n2*3
+ */
+void bn_mul_high(r,a,b,l,n2,t)
+BN_ULONG *r,*a,*b,*l;
+int n2;
+BN_ULONG *t;
+       {
+       int j,i,n,c1,c2;
+       int neg,oneg,zero;
+       BN_ULONG ll,lc,*lp,*mp;
+
+#ifdef BN_COUNT
+printf(" bn_mul_high %d * %d\n",n2,n2);
+#endif
+       n=(n2+1)/2;
+
+       /* Calculate (al-ah)*(bh-bl) */
+       neg=zero=0;
+       c1=bn_cmp_words(&(a[0]),&(a[n]),n);
+       c2=bn_cmp_words(&(b[n]),&(b[0]),n);
+       switch (c1*3+c2)
+               {
+       case -4:
+               bn_sub_words(&(r[0]),&(a[n]),&(a[0]),n);
+               bn_sub_words(&(r[n]),&(b[0]),&(b[n]),n);
+               break;
+       case -3:
+               zero=1;
+               break;
+       case -2:
+               bn_sub_words(&(r[0]),&(a[n]),&(a[0]),n);
+               bn_sub_words(&(r[n]),&(b[n]),&(b[0]),n);
+               neg=1;
+               break;
+       case -1:
+       case 0:
+       case 1:
+               zero=1;
+               break;
+       case 2:
+               bn_sub_words(&(r[0]),&(a[0]),&(a[n]),n);
+               bn_sub_words(&(r[n]),&(b[0]),&(b[n]),n);
+               neg=1;
+               break;
+       case 3:
+               zero=1;
+               break;
+       case 4:
+               bn_sub_words(&(r[0]),&(a[0]),&(a[n]),n);
+               bn_sub_words(&(r[n]),&(b[n]),&(b[0]),n);
+               break;
+               }
+               
+       oneg=neg;
+       /* t[10] = (a[0]-a[1])*(b[1]-b[0]) */
+       bn_mul_recursive(&(t[0]),&(r[0]),&(r[n]),n,&(t[n2]));
+       /* r[10] = (a[1]*b[1]) */
+       bn_mul_recursive(r,&(a[n]),&(b[n]),n,&(t[n2]));
+
+       /* s0 == low(al*bl)
+        * s1 == low(ah*bh)+low((al-ah)*(bh-bl))+low(al*bl)+high(al*bl)
+        * We know s0 and s1 so the only unknown is high(al*bl)
+        * high(al*bl) == s1 - low(ah*bh+s0+(al-ah)*(bh-bl))
+        * high(al*bl) == s1 - (r[0]+l[0]+t[0])
+        */
+       if (l != NULL)
+               {
+               lp= &(t[n2+n]);
+               c1=bn_add_words(lp,&(r[0]),&(l[0]),n);
+               }
+       else
+               {
+               c1=0;
+               lp= &(r[0]);
+               }
+
+       if (neg)
+               neg=bn_sub_words(&(t[n2]),lp,&(t[0]),n);
+       else
+               {
+               bn_add_words(&(t[n2]),lp,&(t[0]),n);
+               neg=0;
+               }
+
+       if (l != NULL)
+               {
+               bn_sub_words(&(t[n2+n]),&(l[n]),&(t[n2]),n);
+               }
+       else
+               {
+               lp= &(t[n2+n]);
+               mp= &(t[n2]);
+               for (i=0; i<n; i++)
+                       lp[i]=((~mp[i])+1)&BN_MASK2;
+               }
+
+       /* s[0] = low(al*bl)
+        * t[3] = high(al*bl)
+        * t[10] = (a[0]-a[1])*(b[1]-b[0]) neg is the sign
+        * r[10] = (a[1]*b[1])
+        */
+       /* R[10] = al*bl
+        * R[21] = al*bl + ah*bh + (a[0]-a[1])*(b[1]-b[0])
+        * R[32] = ah*bh
+        */
+       /* R[1]=t[3]+l[0]+r[0](+-)t[0] (have carry/borrow)
+        * R[2]=r[0]+t[3]+r[1](+-)t[1] (have carry/borrow)
+        * R[3]=r[1]+(carry/borrow)
+        */
+       if (l != NULL)
+               {
+               lp= &(t[n2]);
+               c1= bn_add_words(lp,&(t[n2+n]),&(l[0]),n);
+               }
+       else
+               {
+               lp= &(t[n2+n]);
+               c1=0;
+               }
+       c1+=bn_add_words(&(t[n2]),lp,  &(r[0]),n);
+       if (oneg)
+               c1-=bn_sub_words(&(t[n2]),&(t[n2]),&(t[0]),n);
+       else
+               c1+=bn_add_words(&(t[n2]),&(t[n2]),&(t[0]),n);
+
+       c2 =bn_add_words(&(r[0]),&(r[0]),&(t[n2+n]),n);
+       c2+=bn_add_words(&(r[0]),&(r[0]),&(r[n]),n);
+       if (oneg)
+               c2-=bn_sub_words(&(r[0]),&(r[0]),&(t[n]),n);
+       else
+               c2+=bn_add_words(&(r[0]),&(r[0]),&(t[n]),n);
+       
+       if (c1 != 0) /* Add starting at r[0], could be +ve or -ve */
+               {
+               i=0;
+               if (c1 > 0)
+                       {
+                       lc=c1;
+                       do      {
+                               ll=(r[i]+lc)&BN_MASK2;
+                               r[i++]=ll;
+                               lc=(lc > ll);
+                               } while (lc);
+                       }
+               else
+                       {
+                       lc= -c1;
+                       do      {
+                               ll=r[i];
+                               r[i++]=(ll-lc)&BN_MASK2;
+                               lc=(lc > ll);
+                               } while (lc);
+                       }
+               }
+       if (c2 != 0) /* Add starting at r[1] */
+               {
+               i=n;
+               if (c2 > 0)
+                       {
+                       lc=c2;
+                       do      {
+                               ll=(r[i]+lc)&BN_MASK2;
+                               r[i++]=ll;
+                               lc=(lc > ll);
+                               } while (lc);
+                       }
+               else
+                       {
+                       lc= -c2;
+                       do      {
+                               ll=r[i];
+                               r[i++]=(ll-lc)&BN_MASK2;
+                               lc=(lc > ll);
+                               } while (lc);
+                       }
+               }
+       }
+#endif
diff --git a/crypto/bn/old/bn_low.c b/crypto/bn/old/bn_low.c
new file mode 100644 (file)
index 0000000..217c8c2
--- /dev/null
@@ -0,0 +1,201 @@
+/* crypto/bn/bn_mul.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include "cryptlib.h"
+#include "bn_lcl.h"
+
+static int bn_mm_low(BIGNUM *m,BIGNUM *A,BIGNUM *B, int num,
+               BIGNUM *sk,BN_CTX *ctx);
+int BN_mul_low(BIGNUM *r, BIGNUM *a, BIGNUM *b,int words);
+
+/* r must be different to a and b */
+int BN_mul_low(r, a, b, num)
+BIGNUM *r;
+BIGNUM *a;
+BIGNUM *b;
+int num;
+       {
+       BN_ULONG *ap,*bp,*rp;
+       BIGNUM *sk;
+       int j,i,n,ret;
+       int max,al,bl;
+       BN_CTX ctx;
+
+       bn_check_top(a);
+       bn_check_top(b);
+
+#ifdef BN_MUL_DEBUG
+printf("BN_mul_low(%d,%d,%d)\n",a->top,b->top,num);
+#endif
+
+       al=a->top;
+       bl=b->top;
+       if ((al == 0) || (bl == 0))
+               {
+               r->top=0;
+               return(1);
+               }
+
+       if ((bn_limit_bits_low > 0) && (num > bn_limit_num_low))
+               {
+               n=BN_num_bits_word(num*2)-bn_limit_bits_low;
+               n*=2;
+               sk=(BIGNUM *)Malloc(sizeof(BIGNUM)*n);
+               memset(sk,0,sizeof(BIGNUM)*n);
+               memset(&ctx,0,sizeof(ctx));
+
+               ret=bn_mm_low(r,a,b,num,&(sk[0]),&ctx);
+               for (i=0; i<n; i+=2)
+                       {
+                       BN_clear_free(&sk[i]);
+                       BN_clear_free(&sk[i+1]);
+                       }
+               Free(sk);
+               return(ret);
+               }
+
+       max=(al+bl);
+       if (bn_wexpand(r,max) == NULL) return(0);
+       r->neg=a->neg^b->neg;
+       ap=a->d;
+       bp=b->d;
+       rp=r->d;
+       r->top=(max > num)?num:max;
+
+       rp[al]=bn_mul_words(rp,ap,al,*(bp++));
+       rp++;
+       j=bl;
+       for (i=1; i<j; i++)
+               {
+               if (al >= num--)
+                       {
+                       al--;
+                       if (al <= 0) break;
+                       }
+               rp[al]=bn_mul_add_words(rp,ap,al,*(bp++));
+               rp++;
+               }
+       
+       while ((r->top > 0) && (r->d[r->top-1] == 0))
+               r->top--;
+       return(1);
+       }
+
+
+#define t1     (sk[0])
+#define t2     (sk[1])
+
+/* r must be different to a and b */
+int bn_mm_low(m, A, B, num, sk,ctx)
+BIGNUM *m,*A,*B;
+int num;
+BIGNUM *sk;
+BN_CTX *ctx;
+       {
+       int n; /* ,sqr=0; */
+       int an,bn;
+       BIGNUM ah,al,bh,bl;
+
+       bn_wexpand(m,num+3);
+       an=A->top;
+       bn=B->top;
+
+#ifdef BN_MUL_DEBUG
+printf("bn_mm_low(%d,%d,%d)\n",A->top,B->top,num);
+#endif
+
+       n=(num+1)/2;
+
+       BN_init(&ah); BN_init(&al); BN_init(&bh); BN_init(&bl);
+
+       bn_set_low( &al,A,n);
+       bn_set_high(&ah,A,n);
+       bn_set_low( &bl,B,n);
+       bn_set_high(&bh,B,n);
+
+       if (num <= (bn_limit_num_low+bn_limit_num_low))
+               {
+               BN_mul(m,&al,&bl);
+               BN_mul_low(&t1,&al,&bh,n);
+               BN_mul_low(&t2,&ah,&bl,n);
+               }
+       else
+               {
+               bn_mm(m  ,&al,&bl,&(sk[2]),ctx);
+               bn_mm_low(&t1,&al,&bh,n,&(sk[2]),ctx);
+               bn_mm_low(&t2,&ah,&bl,n,&(sk[2]),ctx);
+               }
+
+       BN_add(&t1,&t1,&t2);
+
+       /* We will now do an evil hack instead of
+        * BN_lshift(&t1,&t1,n*BN_BITS2);
+        * BN_add(m,m,&t1);
+        * BN_mask_bits(m,num*BN_BITS2);
+        */
+       bn_set_high(&ah,m,n); ah.max=num+2;
+       BN_add(&ah,&ah,&t1);
+       m->top=num;
+
+       m->neg=A->neg^B->neg;
+       return(1);
+       }
+
+#undef t1      (sk[0])
+#undef t2      (sk[1])
diff --git a/crypto/bn/old/bn_m.c b/crypto/bn/old/bn_m.c
new file mode 100644 (file)
index 0000000..1cf51e8
--- /dev/null
@@ -0,0 +1,142 @@
+/* crypto/bn/bn_m.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+/*#include "cryptlib.h"*/
+#include "bn_lcl.h"
+
+#define limit_bits 5                   /* 2^5, or 32 words */
+#define limit_num (1<<limit_bits)
+
+int BN_m(r,a,b)
+BIGNUM *r,*a,*b;
+       {
+       BIGNUM *sk;
+       int i,n;
+
+       n=(BN_num_bits_word(a->top|b->top)-limit_bits);
+       n*=2;
+       sk=(BIGNUM *)malloc(sizeof(BIGNUM)*n);
+       for (i=0; i<n; i++)
+               BN_init(&(sk[i]));
+
+       return(BN_mm(r,a,b,&(sk[0])));
+       }
+
+#define ahal   (sk[0])
+#define blbh   (sk[1])
+
+/* r must be different to a and b */
+int BN_mm(m, A, B, sk)
+BIGNUM *m,*A,*B;
+BIGNUM *sk;
+       {
+       int i,num,anum,bnum;
+       int an,bn;
+       BIGNUM ah,al,bh,bl;
+
+       an=A->top;
+       bn=B->top;
+       if ((an <= limit_num) || (bn <= limit_num))
+               {
+               return(BN_mul(m,A,B));
+               }
+
+       anum=(an>bn)?an:bn;
+       num=(anum)/2;
+
+       /* Are going to now chop things into 'num' word chunks. */
+       bnum=num*BN_BITS2;
+
+       BN_init(&ahal);
+       BN_init(&blbh);
+       BN_init(&ah);
+       BN_init(&al);
+       BN_init(&bh);
+       BN_init(&bl);
+
+       al.top=num;
+       al.d=A->d;
+       ah.top=A->top-num;
+       ah.d= &(A->d[num]);
+
+       bl.top=num;
+       bl.d=B->d;
+       bh.top=B->top-num;
+       bh.d= &(B->d[num]);
+
+       BN_sub(&ahal,&ah,&al);
+       BN_sub(&blbh,&bl,&bh);
+
+       BN_mm(m,&ahal,&blbh,&(sk[2]));
+       BN_mm(&ahal,&al,&bl,&(sk[2]));
+       BN_mm(&blbh,&ah,&bh,&(sk[2]));
+
+       BN_add(m,m,&ahal);
+       BN_add(m,m,&blbh);
+
+       BN_lshift(m,m,bnum);
+       BN_add(m,m,&ahal);
+
+       BN_lshift(&blbh,&blbh,bnum*2);
+       BN_add(m,m,&blbh);
+
+       m->neg=A->neg^B->neg;
+       return(1);
+       }
+
diff --git a/crypto/bn/old/bn_mul.c.works b/crypto/bn/old/bn_mul.c.works
new file mode 100644 (file)
index 0000000..6d565d4
--- /dev/null
@@ -0,0 +1,219 @@
+/* crypto/bn/bn_mul.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include "cryptlib.h"
+#include "bn_lcl.h"
+
+int bn_mm(BIGNUM *m,BIGNUM *A,BIGNUM *B, BIGNUM *sk,BN_CTX *ctx);
+
+/* r must be different to a and b */
+int BN_mul(r, a, b)
+BIGNUM *r;
+BIGNUM *a;
+BIGNUM *b;
+       {
+       BN_ULONG *ap,*bp,*rp;
+       BIGNUM *sk;
+       int i,n,ret;
+       int max,al,bl;
+       BN_CTX ctx;
+
+       bn_check_top(a);
+       bn_check_top(b);
+
+       al=a->top;
+       bl=b->top;
+       if ((al == 0) || (bl == 0))
+               {
+               r->top=0;
+               return(1);
+               }
+#ifdef BN_MUL_DEBUG
+printf("BN_mul(%d,%d)\n",a->top,b->top);
+#endif
+
+#ifdef BN_RECURSION
+       if (    (bn_limit_bits > 0) &&
+               (bl > bn_limit_num) && (al > bn_limit_num))
+               {
+               n=(BN_num_bits_word(al|bl)-bn_limit_bits);
+               n*=2;
+               sk=(BIGNUM *)Malloc(sizeof(BIGNUM)*n);
+               memset(sk,0,sizeof(BIGNUM)*n);
+               memset(&ctx,0,sizeof(ctx));
+
+               ret=bn_mm(r,a,b,&(sk[0]),&ctx);
+               for (i=0; i<n; i+=2)
+                       {
+                       BN_clear_free(&sk[i]);
+                       BN_clear_free(&sk[i+1]);
+                       }
+               Free(sk);
+               return(ret);
+               }
+#endif
+
+       max=(al+bl);
+       if (bn_wexpand(r,max) == NULL) return(0);
+       r->top=max;
+       r->neg=a->neg^b->neg;
+       ap=a->d;
+       bp=b->d;
+       rp=r->d;
+
+#ifdef BN_RECURSION
+       if ((al == bl) && (al == 8))
+               {
+               bn_mul_comba8(rp,ap,bp);
+               }
+       else
+#endif
+               {
+               rp[al]=bn_mul_words(rp,ap,al,*(bp++));
+               rp++;
+               for (i=1; i<bl; i++)
+                       {
+                       rp[al]=bn_mul_add_words(rp,ap,al,*(bp++));
+                       rp++;
+                       }
+               }
+       if ((max > 0) && (r->d[max-1] == 0)) r->top--;
+       return(1);
+       }
+
+#ifdef BN_RECURSION
+
+#define ahal   (sk[0])
+#define blbh   (sk[1])
+
+/* r must be different to a and b */
+int bn_mm(m, A, B, sk,ctx)
+BIGNUM *m,*A,*B;
+BIGNUM *sk;
+BN_CTX *ctx;
+       {
+       int n,num,sqr=0;
+       int an,bn;
+       BIGNUM ah,al,bh,bl;
+
+       an=A->top;
+       bn=B->top;
+#ifdef BN_MUL_DEBUG
+printf("bn_mm(%d,%d)\n",A->top,B->top);
+#endif
+
+       if (A == B) sqr=1;
+       num=(an>bn)?an:bn;
+       n=(num+1)/2;
+       /* Are going to now chop things into 'num' word chunks. */
+
+       BN_init(&ah);
+       BN_init(&al);
+       BN_init(&bh);
+       BN_init(&bl);
+
+       bn_set_low (&al,A,n);
+       bn_set_high(&ah,A,n);
+       bn_set_low (&bl,B,n);
+       bn_set_high(&bh,B,n);
+
+       BN_sub(&ahal,&ah,&al);
+       BN_sub(&blbh,&bl,&bh);
+
+       if (num <= (bn_limit_num+bn_limit_num))
+               {
+               BN_mul(m,&ahal,&blbh);
+               if (sqr)
+                       {
+                       BN_sqr(&ahal,&al,ctx);
+                       BN_sqr(&blbh,&ah,ctx);
+                       }
+               else
+                       {
+                       BN_mul(&ahal,&al,&bl);
+                       BN_mul(&blbh,&ah,&bh);
+                       }
+               }
+       else
+               {
+               bn_mm(m,&ahal,&blbh,&(sk[2]),ctx);
+               bn_mm(&ahal,&al,&bl,&(sk[2]),ctx);
+               bn_mm(&blbh,&ah,&bh,&(sk[2]),ctx);
+               }
+
+       BN_add(m,m,&ahal);
+       BN_add(m,m,&blbh);
+
+       BN_lshift(m,m,n*BN_BITS2);
+       BN_lshift(&blbh,&blbh,n*BN_BITS2*2);
+
+       BN_add(m,m,&ahal);
+       BN_add(m,m,&blbh);
+
+       m->neg=A->neg^B->neg;
+       return(1);
+       }
+#undef ahal    (sk[0])
+#undef blbh    (sk[1])
+
+#include "bn_low.c"
+#include "bn_high.c"
+#include "f.c"
+
+#endif
diff --git a/crypto/bn/old/bn_wmul.c b/crypto/bn/old/bn_wmul.c
new file mode 100644 (file)
index 0000000..e3ce107
--- /dev/null
@@ -0,0 +1,181 @@
+#include <stdio.h>
+#include "bn_lcl.h"
+
+#if 1
+
+int bn_mull(BIGNUM *r,BIGNUM *a,BIGNUM *b, BN_CTX *ctx);
+
+int bn_mull(r,a,b,ctx)
+BIGNUM *r,*a,*b;
+BN_CTX *ctx;
+       {
+       int top,i,j,k,al,bl;
+       BIGNUM *t;
+
+#ifdef BN_COUNT
+printf("bn_mull %d * %d\n",a->top,b->top);
+#endif
+
+       bn_check_top(a);
+       bn_check_top(b);
+       bn_check_top(r);
+
+       al=a->top;
+       bl=b->top;
+       r->neg=a->neg^b->neg;
+
+       top=al+bl;
+       if ((al < 4) || (bl < 4))
+               {
+               if (bn_wexpand(r,top) == NULL) return(0);
+               r->top=top;
+               bn_mul_normal(r->d,a->d,al,b->d,bl);
+               goto end;
+               }
+       else if (al == bl) /* A good start, they are the same size */
+               goto symetric;
+       else
+               {
+               i=(al-bl);
+               if ((i ==  1) && !BN_get_flags(b,BN_FLG_STATIC_DATA))
+                       {
+                       bn_wexpand(b,al);
+                       b->d[bl]=0;
+                       bl++;
+                       goto symetric;
+                       }
+               else if ((i ==  -1) && !BN_get_flags(a,BN_FLG_STATIC_DATA))
+                       {
+                       bn_wexpand(a,bl);
+                       a->d[al]=0;
+                       al++;
+                       goto symetric;
+                       }
+               }
+
+       /* asymetric and >= 4 */ 
+       if (bn_wexpand(r,top) == NULL) return(0);
+       r->top=top;
+       bn_mul_normal(r->d,a->d,al,b->d,bl);
+
+       if (0)
+               {
+               /* symetric and > 4 */
+symetric:
+               if (al == 4)
+                       {
+                       if (bn_wexpand(r,al*2) == NULL) return(0);
+                       r->top=top;
+                       bn_mul_comba4(r->d,a->d,b->d);
+                       goto end;
+                       }
+               if (al == 8)
+                       {
+                       if (bn_wexpand(r,al*2) == NULL) return(0);
+                       r->top=top;
+                       bn_mul_comba8(r->d,a->d,b->d);
+                       goto end;
+                       }
+               if (al <= BN_MULL_NORMAL_SIZE)
+                       {
+                       if (bn_wexpand(r,al*2) == NULL) return(0);
+                       r->top=top;
+                       bn_mul_normal(r->d,a->d,al,b->d,bl);
+                       goto end;
+                       }
+               /* 16 or larger */
+               j=BN_num_bits_word((BN_ULONG)al);
+               j=1<<(j-1);
+               k=j+j;
+               t= &(ctx->bn[ctx->tos]);
+               if (al == j) /* exact multiple */
+                       {
+                       bn_wexpand(t,k*2);
+                       bn_wexpand(r,k*2);
+                       bn_mul_recursive(r->d,a->d,b->d,al,t->d);
+                       }
+               else
+                       {
+                       bn_wexpand(a,k);
+                       bn_wexpand(b,k);
+                       bn_wexpand(t,k*4);
+                       bn_wexpand(r,k*4);
+                       for (i=a->top; i<k; i++)
+                               a->d[i]=0;
+                       for (i=b->top; i<k; i++)
+                               b->d[i]=0;
+                       bn_mul_part_recursive(r->d,a->d,b->d,al-j,j,t->d);
+                       }
+               r->top=top;
+               }
+end:
+       bn_fix_top(r);
+       return(1);
+       }
+#endif
+
+void bn_mul_normal(r,a,na,b,nb)
+BN_ULONG *r,*a;
+int na;
+BN_ULONG *b;
+int nb;
+       {
+       BN_ULONG *rr;
+
+#ifdef BN_COUNT
+printf(" bn_mul_normal %d * %d\n",na,nb);
+#endif
+
+       if (na < nb)
+               {
+               int itmp;
+               BN_ULONG *ltmp;
+
+               itmp=na; na=nb; nb=itmp;
+               ltmp=a;   a=b;   b=ltmp;
+
+               }
+       rr= &(r[na]);
+       rr[0]=bn_mul_words(r,a,na,b[0]);
+
+       for (;;)
+               {
+               if (--nb <= 0) return;
+               rr[1]=bn_mul_add_words(&(r[1]),a,na,b[1]);
+               if (--nb <= 0) return;
+               rr[2]=bn_mul_add_words(&(r[2]),a,na,b[2]);
+               if (--nb <= 0) return;
+               rr[3]=bn_mul_add_words(&(r[3]),a,na,b[3]);
+               if (--nb <= 0) return;
+               rr[4]=bn_mul_add_words(&(r[4]),a,na,b[4]);
+               rr+=4;
+               r+=4;
+               b+=4;
+               }
+       }
+
+#if 1
+void bn_mul_low_normal(r,a,b,n)
+BN_ULONG *r,*a,*b;
+int n;
+       {
+#ifdef BN_COUNT
+printf(" bn_mul_low_normal %d * %d\n",n,n);
+#endif
+       bn_mul_words(r,a,n,b[0]);
+
+       for (;;)
+               {
+               if (--n <= 0) return;
+               bn_mul_add_words(&(r[1]),a,n,b[1]);
+               if (--n <= 0) return;
+               bn_mul_add_words(&(r[2]),a,n,b[2]);
+               if (--n <= 0) return;
+               bn_mul_add_words(&(r[3]),a,n,b[3]);
+               if (--n <= 0) return;
+               bn_mul_add_words(&(r[4]),a,n,b[4]);
+               r+=4;
+               b+=4;
+               }
+       }
+#endif
diff --git a/crypto/bn/old/build b/crypto/bn/old/build
new file mode 100755 (executable)
index 0000000..8cd99e5
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh -x
+
+gcc -g -I../../include test.c -L../.. -lcrypto
diff --git a/crypto/bn/old/info b/crypto/bn/old/info
new file mode 100644 (file)
index 0000000..5ac99c3
--- /dev/null
@@ -0,0 +1,22 @@
+Given A1A0 * B1B0 == S3S2S1S0
+
+S0=     low(A0*B0)
+S1=     low( (A1-A0)*(B0-B1)) +low( A1*B1) +high(A0*B0)
+S2=     high((A1-A0)*(B0-B1)) +high(A1*B1) +low( A1*B1)
+S3=     high(A1*B1);
+
+Assume we know S1 and S0, and can calulate A1*B1 and high((A1-A0)*(B0-B1))
+
+k0=    S0 == low(A0*B0)
+k1=    S1
+k2=    low( A1*B1)
+k3=    high(A1*B1)
+k4=    high((A1-A0)*(B0-B1))
+
+k1=    low((A1-A0)*(B0-B1)) +k2 +high(A0*B0)
+S2=    k4 +k3 +k2
+S3=    k3
+
+S1-k2= low((A1-A0)*(B0-B1)) +high(A0*B0)
+
+We potentially have a carry or a borrow from S1
diff --git a/crypto/bn/old/test.works b/crypto/bn/old/test.works
new file mode 100644 (file)
index 0000000..127c7b4
--- /dev/null
@@ -0,0 +1,205 @@
+#include <stdio.h>
+#include "cryptlib.h"
+#include "bn_lcl.h"
+
+#define SIZE   128
+
+#define BN_MONT_CTX_set                bn_mcs
+#define BN_from_montgomery     bn_fm
+#define BN_mod_mul_montgomery  bn_mmm
+#undef BN_to_montgomery
+#define BN_to_montgomery(r,a,mont,ctx) bn_mmm(\
+       r,a,(mont)->RR,(mont),ctx)
+
+main()
+       {
+       BIGNUM prime,a,b,r,A,B,R;
+       BN_MONT_CTX *mont;
+       BN_CTX *ctx;
+       int i;
+
+       ctx=BN_CTX_new();
+       BN_init(&prime);
+       BN_init(&a); BN_init(&b); BN_init(&r);
+       BN_init(&A); BN_init(&B); BN_init(&R);
+
+       BN_generate_prime(&prime,SIZE,0,NULL,NULL,NULL,NULL);
+       BN_rand(&A,SIZE,1,0);
+       BN_rand(&B,SIZE,1,0);
+       BN_mod(&A,&A,&prime,ctx);
+       BN_mod(&B,&B,&prime,ctx);
+
+       mont=BN_MONT_CTX_new();
+       BN_MONT_CTX_set(mont,&prime,ctx);
+
+       BN_to_montgomery(&a,&A,mont,ctx);
+       BN_to_montgomery(&b,&B,mont,ctx);
+
+       BN_mul(&r,&a,&b);
+       BN_print_fp(stdout,&r); printf("\n");
+       BN_from_montgomery(&r,&r,mont,ctx);
+       BN_print_fp(stdout,&r); printf("\n");
+       BN_from_montgomery(&r,&r,mont,ctx);
+       BN_print_fp(stdout,&r); printf("\n");
+
+       BN_mod_mul(&R,&A,&B,&prime,ctx);
+
+       BN_print_fp(stdout,&a); printf("\n");
+       BN_print_fp(stdout,&b); printf("\n");
+       BN_print_fp(stdout,&prime); printf("\n");
+       BN_print_fp(stdout,&r); printf("\n\n");
+
+       BN_print_fp(stdout,&A); printf("\n");
+       BN_print_fp(stdout,&B); printf("\n");
+       BN_print_fp(stdout,&prime); printf("\n");
+       BN_print_fp(stdout,&R); printf("\n\n");
+
+       BN_mul(&r,&a,&b);
+       BN_print_fp(stdout,&r); printf(" <- BA*DC\n");
+       BN_copy(&A,&r);
+       i=SIZE/2;
+       BN_mask_bits(&A,i*2);
+//     BN_print_fp(stdout,&A); printf(" <- low(BA*DC)\n");
+       bn_do_lower(&r,&a,&b,&A,i);
+//     BN_print_fp(stdout,&r); printf(" <- low(BA*DC)\n");
+       }
+
+int bn_mul_low(r,a,b,low,i)
+BIGNUM *r,*a,*b,*low;
+int i;
+       {
+       int w;
+       BIGNUM Kh,Km,t1,t2,h,ah,al,bh,bl,l,m,s0,s1;
+
+       BN_init(&Kh); BN_init(&Km); BN_init(&t1); BN_init(&t2); BN_init(&l);
+       BN_init(&ah); BN_init(&al); BN_init(&bh); BN_init(&bl); BN_init(&h);
+       BN_init(&m); BN_init(&s0); BN_init(&s1);
+
+       BN_copy(&al,a); BN_mask_bits(&al,i); BN_rshift(&ah,a,i);
+       BN_copy(&bl,b); BN_mask_bits(&bl,i); BN_rshift(&bh,b,i);
+
+
+       BN_sub(&t1,&al,&ah);
+       BN_sub(&t2,&bh,&bl);
+       BN_mul(&m,&t1,&t2);
+       BN_mul(&h,&ah,&bh);
+
+       BN_copy(&s0,low); BN_mask_bits(&s0,i);
+       BN_rshift(&s1,low,i);
+
+       BN_add(&t1,&h,&m);
+       BN_add(&t1,&t1,&s0);
+
+       BN_copy(&t2,&t1); BN_mask_bits(&t2,i);
+       BN_sub(&t1,&s1,&t2);
+       BN_lshift(&t1,&t1,i);
+       BN_add(&t1,&t1,&s0);
+       if (t1.neg)
+               {
+               BN_lshift(&t2,BN_value_one(),i*2);
+               BN_add(&t1,&t2,&t1);
+               BN_mask_bits(&t1,i*2);
+               }
+       
+       BN_free(&Kh); BN_free(&Km); BN_free(&t1); BN_free(&t2);
+       BN_free(&ah); BN_free(&al); BN_free(&bh); BN_free(&bl);
+       }
+
+int BN_mod_mul_montgomery(r,a,b,mont,ctx)
+BIGNUM *r,*a,*b;
+BN_MONT_CTX *mont;
+BN_CTX *ctx;
+       {
+       BIGNUM *tmp;
+
+        tmp= &(ctx->bn[ctx->tos++]);
+
+       if (a == b)
+               {
+               if (!BN_sqr(tmp,a,ctx)) goto err;
+               }
+       else
+               {
+               if (!BN_mul(tmp,a,b)) goto err;
+               }
+       /* reduce from aRR to aR */
+       if (!BN_from_montgomery(r,tmp,mont,ctx)) goto err;
+       ctx->tos--;
+       return(1);
+err:
+       return(0);
+       }
+
+int BN_from_montgomery(r,a,mont,ctx)
+BIGNUM *r;
+BIGNUM *a;
+BN_MONT_CTX *mont;
+BN_CTX *ctx;
+       {
+       BIGNUM z1;
+       BIGNUM *t1,*t2;
+       BN_ULONG *ap,*bp,*rp;
+       int j,i,bl,al;
+
+       BN_init(&z1);
+       t1= &(ctx->bn[ctx->tos]);
+       t2= &(ctx->bn[ctx->tos+1]);
+
+       if (!BN_copy(t1,a)) goto err;
+       /* can cheat */
+       BN_mask_bits(t1,mont->ri);
+       if (!BN_mul(t2,t1,mont->Ni)) goto err;
+       BN_mask_bits(t2,mont->ri);
+
+       if (!BN_mul(t1,t2,mont->N)) goto err;
+       if (!BN_add(t2,t1,a)) goto err;
+
+       /* At this point, t2 has the bottom ri bits set to zero.
+        * This means that the bottom ri bits == the 1^ri minus the bottom
+        * ri bits of a.
+        * This means that only the bits above 'ri' in a need to be added,
+        * and XXXXXXXXXXXXXXXXXXXXXXXX
+        */
+BN_print_fp(stdout,t2); printf("\n");
+       BN_rshift(r,t2,mont->ri);
+
+       if (BN_ucmp(r,mont->N) >= 0)
+               bn_qsub(r,r,mont->N);
+
+       return(1);
+err:
+       return(0);
+       }
+
+int BN_MONT_CTX_set(mont,mod,ctx)
+BN_MONT_CTX *mont;
+BIGNUM *mod;
+BN_CTX *ctx;
+       {
+       BIGNUM *Ri=NULL,*R=NULL;
+
+       if (mont->RR == NULL) mont->RR=BN_new();
+       if (mont->N == NULL)  mont->N=BN_new();
+
+       R=mont->RR;                                     /* grab RR as a temp */
+       BN_copy(mont->N,mod);                           /* Set N */
+
+       mont->ri=(BN_num_bits(mod)+(BN_BITS2-1))/BN_BITS2*BN_BITS2;
+       BN_lshift(R,BN_value_one(),mont->ri);                   /* R */
+       if ((Ri=BN_mod_inverse(NULL,R,mod,ctx)) == NULL) goto err;/* Ri */
+       BN_lshift(Ri,Ri,mont->ri);                              /* R*Ri */
+       bn_qsub(Ri,Ri,BN_value_one());                          /* R*Ri - 1 */
+       BN_div(Ri,NULL,Ri,mod,ctx);
+       if (mont->Ni != NULL) BN_free(mont->Ni);
+       mont->Ni=Ri;                                    /* Ni=(R*Ri-1)/N */
+
+       /* setup RR for conversions */
+       BN_lshift(mont->RR,BN_value_one(),mont->ri*2);
+       BN_mod(mont->RR,mont->RR,mont->N,ctx);
+
+       return(1);
+err:
+       return(0);
+       }
+
+
diff --git a/crypto/bn/test.c b/crypto/bn/test.c
new file mode 100644 (file)
index 0000000..e23f215
--- /dev/null
@@ -0,0 +1,252 @@
+#include <stdio.h>
+#include "cryptlib.h"
+#include "bn_lcl.h"
+
+#define SIZE   32
+
+#define BN_MONT_CTX_set                bn_mcs
+#define BN_from_montgomery     bn_fm
+#define BN_mod_mul_montgomery  bn_mmm
+#undef BN_to_montgomery
+#define BN_to_montgomery(r,a,mont,ctx) bn_mmm(\
+       r,a,(mont)->RR,(mont),ctx)
+
+main()
+       {
+       BIGNUM prime,a,b,r,A,B,R;
+       BN_MONT_CTX *mont;
+       BN_CTX *ctx;
+       int i;
+
+       ctx=BN_CTX_new();
+       BN_init(&prime);
+       BN_init(&a); BN_init(&b); BN_init(&r);
+       BN_init(&A); BN_init(&B); BN_init(&R);
+
+       BN_generate_prime(&prime,SIZE,0,NULL,NULL,NULL,NULL);
+       BN_rand(&A,SIZE,1,0);
+       BN_rand(&B,SIZE,1,0);
+       BN_mod(&A,&A,&prime,ctx);
+       BN_mod(&B,&B,&prime,ctx);
+
+       i=A.top;
+       BN_mul(&R,&A,&B,ctx);
+       BN_mask_bits(&R,i*BN_BITS2);
+
+
+       BN_print_fp(stdout,&A); printf(" <- a\n");
+       BN_print_fp(stdout,&B); printf(" <- b\n");
+       BN_mul_high(&r,&A,&B,&R,i);
+       BN_print_fp(stdout,&r); printf(" <- high(BA*DC)\n");
+
+       BN_mask_bits(&A,i*32);
+       BN_mask_bits(&B,i*32);
+
+       BN_mul(&R,&A,&B);
+       BN_rshift(&R,&R,i*32);
+       BN_print_fp(stdout,&R); printf(" <- norm BA*DC\n");
+       BN_sub(&R,&R,&r);
+       BN_print_fp(stdout,&R); printf(" <- diff\n");
+       }
+
+#if 0
+int bn_mul_high(r,a,b,low,words)
+BIGNUM *r,*a,*b,*low;
+int words;
+       {
+       int i;
+       BIGNUM t1,t2,t3,h,ah,al,bh,bl,m,s0,s1;
+
+       BN_init(&al); BN_init(&ah);
+       BN_init(&bl); BN_init(&bh);
+       BN_init(&t1); BN_init(&t2); BN_init(&t3);
+       BN_init(&s0); BN_init(&s1);
+       BN_init(&h); BN_init(&m);
+
+       i=a->top;
+       if (i >= words)
+               {
+               al.top=words;
+               ah.top=a->top-words;
+               ah.d= &(a->d[ah.top]);
+               }
+       else
+               al.top=i;
+       al.d=a->d;
+
+       i=b->top;
+       if (i >= words)
+               {
+               bl.top=words;
+               bh.top=i-words;
+               bh.d= &(b->d[bh.top]);
+               }
+       else
+               bl.top=i;
+       bl.d=b->d;
+
+       i=low->top;
+       if (i >= words)
+               {
+               s0.top=words;
+               s1.top=i-words;
+               s1.d= &(low->d[s1.top]);
+               }
+       else
+               s0.top=i;
+       s0.d=low->d;
+
+al.max=al.top; ah.max=ah.top;
+bl.max=bl.top; bh.max=bh.top;
+s0.max=bl.top; s1.max=bh.top;
+
+       /* Calculate (al-ah)*(bh-bl) */
+       BN_sub(&t1,&al,&ah);
+       BN_sub(&t2,&bh,&bl);
+       BN_mul(&m,&t1,&t2);
+
+       /* Calculate ah*bh */
+       BN_mul(&h,&ah,&bh);
+
+       /* s0 == low(al*bl)
+        * s1 == low(ah*bh)+low((al-ah)*(bh-bl))+low(al*bl)+high(al*bl)
+        * We know s0 and s1 so the only unknown is high(al*bl)
+        * high(al*bl) == s1 - low(ah*bh+(al-ah)*(bh-bl)+s0)
+        */
+       BN_add(&m,&m,&h);
+       BN_add(&t2,&m,&s0);
+       /* Quick and dirty mask off of high words */
+       t3.d=t2.d;
+       t3.top=(t2.top > words)?words:t2.top;
+       t3.neg=t2.neg;
+t3.max=t3.top;
+// BN_print_fp(stdout,&s1); printf(" s1\n");
+// BN_print_fp(stdout,&t2); printf(" middle value\n");
+// BN_print_fp(stdout,&t3); printf(" low middle value\n");
+       BN_sub(&t1,&s1,&t3);
+
+       if (t1.neg)
+               {
+//printf("neg fixup\n"); //BN_print_fp(stdout,&t1); printf(" before\n");
+               BN_lshift(&t2,BN_value_one(),words*32);
+               BN_add(&t1,&t2,&t1);
+               BN_mask_bits(&t1,words*32);
+// BN_print_fp(stdout,&t1); printf(" after\n");
+               }
+       /* al*bl == high(al*bl)<<words+s0 */
+       BN_lshift(&t1,&t1,words*32);
+       BN_add(&t1,&t1,&s0);
+       
+       /* We now have
+        * al*bl                        - t1
+        * (al-ah)*(bh-bl)+ah*bh        - m
+        * ah*bh                        - h
+        */
+       BN_copy(r,&t1);
+       BN_mask_bits(r,words*32*2);
+
+       /*BN_lshift(&m,&m,words*/
+
+       BN_free(&t1); BN_free(&t2);
+       BN_free(&m); BN_free(&h);
+       }
+
+int BN_mod_mul_montgomery(r,a,b,mont,ctx)
+BIGNUM *r,*a,*b;
+BN_MONT_CTX *mont;
+BN_CTX *ctx;
+       {
+       BIGNUM *tmp;
+
+        tmp= &(ctx->bn[ctx->tos++]);
+
+       if (a == b)
+               {
+               if (!BN_sqr(tmp,a,ctx)) goto err;
+               }
+       else
+               {
+               if (!BN_mul(tmp,a,b)) goto err;
+               }
+       /* reduce from aRR to aR */
+       if (!BN_from_montgomery(r,tmp,mont,ctx)) goto err;
+       ctx->tos--;
+       return(1);
+err:
+       return(0);
+       }
+
+int BN_from_montgomery(r,a,mont,ctx)
+BIGNUM *r;
+BIGNUM *a;
+BN_MONT_CTX *mont;
+BN_CTX *ctx;
+       {
+       BIGNUM z1;
+       BIGNUM *t1,*t2;
+       BN_ULONG *ap,*bp,*rp;
+       int j,i,bl,al;
+
+       BN_init(&z1);
+       t1= &(ctx->bn[ctx->tos]);
+       t2= &(ctx->bn[ctx->tos+1]);
+
+       if (!BN_copy(t1,a)) goto err;
+       /* can cheat */
+       BN_mask_bits(t1,mont->ri);
+       if (!BN_mul(t2,t1,mont->Ni)) goto err;
+       BN_mask_bits(t2,mont->ri);
+
+       if (!BN_mul(t1,t2,mont->N)) goto err;
+       if (!BN_add(t2,t1,a)) goto err;
+
+       /* At this point, t2 has the bottom ri bits set to zero.
+        * This means that the bottom ri bits == the 1^ri minus the bottom
+        * ri bits of a.
+        * This means that only the bits above 'ri' in a need to be added,
+        * and XXXXXXXXXXXXXXXXXXXXXXXX
+        */
+BN_print_fp(stdout,t2); printf("\n");
+       BN_rshift(r,t2,mont->ri);
+
+       if (BN_ucmp(r,mont->N) >= 0)
+               BN_usub(r,r,mont->N);
+
+       return(1);
+err:
+       return(0);
+       }
+
+int BN_MONT_CTX_set(mont,mod,ctx)
+BN_MONT_CTX *mont;
+BIGNUM *mod;
+BN_CTX *ctx;
+       {
+       BIGNUM *Ri=NULL,*R=NULL;
+
+       if (mont->RR == NULL) mont->RR=BN_new();
+       if (mont->N == NULL)  mont->N=BN_new();
+
+       R=mont->RR;                                     /* grab RR as a temp */
+       BN_copy(mont->N,mod);                           /* Set N */
+
+       mont->ri=(BN_num_bits(mod)+(BN_BITS2-1))/BN_BITS2*BN_BITS2;
+       BN_lshift(R,BN_value_one(),mont->ri);                   /* R */
+       if ((Ri=BN_mod_inverse(NULL,R,mod,ctx)) == NULL) goto err;/* Ri */
+       BN_lshift(Ri,Ri,mont->ri);                              /* R*Ri */
+       BN_usub(Ri,Ri,BN_value_one());                          /* R*Ri - 1 */
+       BN_div(Ri,NULL,Ri,mod,ctx);
+       if (mont->Ni != NULL) BN_free(mont->Ni);
+       mont->Ni=Ri;                                    /* Ni=(R*Ri-1)/N */
+
+       /* setup RR for conversions */
+       BN_lshift(mont->RR,BN_value_one(),mont->ri*2);
+       BN_mod(mont->RR,mont->RR,mont->N,ctx);
+
+       return(1);
+err:
+       return(0);
+       }
+
+
+#endif
diff --git a/crypto/bn/todo b/crypto/bn/todo
new file mode 100644 (file)
index 0000000..e47e381
--- /dev/null
@@ -0,0 +1,3 @@
+Cache RECP_CTX values
+make the result argument independant of the inputs.
+split up the _exp_ functions
index ff988852cc7d127763d001a5538a213ac4bbf7d7..433cf3a0a42d2c0f3f1bc851154fb822493b19c5 100644 (file)
@@ -76,8 +76,8 @@ void ERR_load_BUF_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_BUF,BUF_str_functs);
index 0143827ae5d01a798f390d705ef84cd2aaf8e8a2..c59982e783b2202d0896f28f5f12da14f7076679 100644 (file)
@@ -64,7 +64,7 @@ asm/cx86-out.o: asm/cx86unix.cpp
 
 # bsdi
 asm/cx86bsdi.o: asm/cx86unix.cpp
-       $(CPP) -DBSDI asm/cx86unix.cpp | as -o asm/cx86bsdi.o
+       $(CPP) -DBSDI asm/cx86unix.cpp | sed 's/ :/:/' | as -o asm/cx86bsdi.o
 
 asm/cx86unix.cpp:
        (cd asm; perl cast-586.pl cpp >cx86unix.cpp)
index f0f2f4df0edff25a9c000a8585960fefe48f1de8..fe34bd17e773cf42b37a6fa922318c8651f4091a 100644 (file)
@@ -59,7 +59,7 @@
 #include "cast.h"
 #include "cast_lcl.h"
 
-char *CAST_version="CAST part of SSLeay 0.9.0b 29-Jun-1998";
+char *CAST_version="CAST part of SSLeay 0.9.1a 06-Jul-1998";
 
 void CAST_ecb_encrypt(in, out, ks, encrypt)
 unsigned char *in;
index ab75e65386b018b0043d696ee589a574fede4795..885b1df23d888648c770fc370386c615c80b11db 100644 (file)
@@ -92,7 +92,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
index 68cf5a4a60bd56542c383e9233314138bf2a9b1e..8635b46a02d95a23f3c6694f95f67fde64374c5d 100644 (file)
@@ -92,7 +92,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
diff --git a/crypto/comp/Makefile.ssl b/crypto/comp/Makefile.ssl
new file mode 100644 (file)
index 0000000..8673626
--- /dev/null
@@ -0,0 +1,87 @@
+#
+# SSLeay/crypto/comp/Makefile
+#
+
+DIR=   comp
+TOP=   ../..
+CC=    cc
+INCLUDES= -I.. -I../../include
+CFLAG=-g
+INSTALLTOP=/usr/local/ssl
+MAKE=          make -f Makefile.ssl
+MAKEDEPEND=    makedepend -f Makefile.ssl
+MAKEFILE=      Makefile.ssl
+AR=            ar r
+
+CFLAGS= $(INCLUDES) $(CFLAG)
+
+ERR=comp
+ERRC=comp_err
+GENERAL=Makefile
+TEST=
+APPS=
+
+LIB=$(TOP)/libcrypto.a
+LIBSRC= comp_lib.c \
+       c_rle.c c_zlib.c
+
+LIBOBJ=        comp_lib.o \
+       c_rle.o c_zlib.o
+
+SRC= $(LIBSRC)
+
+EXHEADER= comp.h
+HEADER=        $(EXHEADER)
+
+ALL=    $(GENERAL) $(SRC) $(HEADER)
+
+top:
+       (cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
+
+all:   lib
+
+lib:   $(LIBOBJ)
+       $(AR) $(LIB) $(LIBOBJ)
+       sh $(TOP)/util/ranlib.sh $(LIB)
+       @touch lib
+
+files:
+       perl $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
+
+links:
+       /bin/rm -f Makefile
+       $(TOP)/util/point.sh Makefile.ssl Makefile ;
+       $(TOP)/util/mklink.sh ../../include $(EXHEADER)
+       $(TOP)/util/mklink.sh ../../test $(TEST)
+       $(TOP)/util/mklink.sh ../../apps $(APPS)
+
+install:
+       @for i in $(EXHEADER) ; \
+       do  \
+       (cp $$i $(INSTALLTOP)/include/$$i; \
+       chmod 644 $(INSTALLTOP)/include/$$i ); \
+       done;
+
+tags:
+       ctags $(SRC)
+
+tests:
+
+lint:
+       lint -DLINT $(INCLUDES) $(SRC)>fluff
+
+depend:
+       $(MAKEDEPEND) $(INCLUDES) $(LIBSRC)
+
+dclean:
+       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
+       mv -f Makefile.new $(MAKEFILE)
+
+clean:
+       /bin/rm -f *.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
+
+errors:
+       perl $(TOP)/util/err-ins.pl $(ERR).err $(ERR).h
+       perl ../err/err_genc.pl -s $(ERR).h $(ERRC).c
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
diff --git a/crypto/comp/c_rle.c b/crypto/comp/c_rle.c
new file mode 100644 (file)
index 0000000..b8b9b3e
--- /dev/null
@@ -0,0 +1,69 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "objects.h"
+#include "comp.h"
+
+static int rle_compress_block(COMP_CTX *ctx, unsigned char *out,
+       unsigned int olen, unsigned char *in, unsigned int ilen);
+static int rle_expand_block(COMP_CTX *ctx, unsigned char *out,
+       unsigned int olen, unsigned char *in, unsigned int ilen);
+
+static COMP_METHOD rle_method={
+       NID_rle_compression,
+       LN_rle_compression,
+       NULL,
+       NULL,
+       rle_compress_block,
+       rle_expand_block,
+       NULL,
+       };
+
+COMP_METHOD *COMP_rle()
+       {
+       return(&rle_method);
+       }
+
+static int rle_compress_block(ctx,out,olen,in,ilen)
+COMP_CTX *ctx;
+unsigned char *out;
+unsigned int olen;
+unsigned char *in;
+unsigned int ilen;
+       {
+       /* int i; */
+
+       if (olen < (ilen+1))
+               {
+               /* ZZZZZZZZZZZZZZZZZZZZZZ */
+               return(-1);
+               }
+
+       *(out++)=0;
+       memcpy(out,in,ilen);
+       return(ilen+1);
+       }
+
+static int rle_expand_block(ctx,out,olen,in,ilen)
+COMP_CTX *ctx;
+unsigned char *out;
+unsigned int olen;
+unsigned char *in;
+unsigned int ilen;
+       {
+       int i;
+
+       if (olen < (ilen-1))
+               {
+               /* ZZZZZZZZZZZZZZZZZZZZZZ */
+               return(-1);
+               }
+
+       i= *(in++);
+       if (i == 0)
+               {
+               memcpy(out,in,ilen-1);
+               }
+       return(ilen-1);
+       }
+
diff --git a/crypto/comp/c_zlib.c b/crypto/comp/c_zlib.c
new file mode 100644 (file)
index 0000000..35ab0c6
--- /dev/null
@@ -0,0 +1,144 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "objects.h"
+#include "comp.h"
+
+COMP_METHOD *COMP_zlib(void );
+
+#ifndef ZLIB
+
+static COMP_METHOD zlib_method={
+       NID_undef,
+       "(null)",
+       NULL,
+       NULL,
+       NULL,
+       NULL,
+       NULL,
+       };
+
+#else
+
+#include <zlib.h>
+
+static int zlib_compress_block(COMP_CTX *ctx, unsigned char *out,
+       unsigned int olen, unsigned char *in, unsigned int ilen);
+static int zlib_expand_block(COMP_CTX *ctx, unsigned char *out,
+       unsigned int olen, unsigned char *in, unsigned int ilen);
+
+static int zz_uncompress(Bytef *dest, uLongf *destLen, const Bytef *source,
+       uLong sourceLen);
+
+static COMP_METHOD zlib_method={
+       NID_zlib_compression,
+       LN_zlib_compression,
+       NULL,
+       NULL,
+       zlib_compress_block,
+       zlib_expand_block,
+       NULL,
+       };
+
+static int zlib_compress_block(ctx,out,olen,in,ilen)
+COMP_CTX *ctx;
+unsigned char *out;
+unsigned int olen;
+unsigned char *in;
+unsigned int ilen;
+       {
+       unsigned long l;
+       int i;
+       int clear=1;
+
+       if (ilen > 128)
+               {
+               out[0]=1;
+               l=olen-1;
+               i=compress(&(out[1]),&l,in,(unsigned long)ilen);
+               if (i != Z_OK)
+                       return(-1);
+               if (ilen > l)
+                       {
+                       clear=0;
+                       l++;
+                       }
+               }
+       if (clear)
+               {
+               out[0]=0;
+               memcpy(&(out[1]),in,ilen);
+               l=ilen+1;
+               }
+fprintf(stderr,"compress(%4d)->%4d %s\n",ilen,(int)l,(clear)?"clear":"zlib");
+       return((int)l);
+       }
+
+static int zlib_expand_block(ctx,out,olen,in,ilen)
+COMP_CTX *ctx;
+unsigned char *out;
+unsigned int olen;
+unsigned char *in;
+unsigned int ilen;
+       {
+       unsigned long l;
+       int i;
+
+       if (in[0])
+               {
+               l=olen;
+               i=zz_uncompress(out,&l,&(in[1]),(unsigned long)ilen-1);
+               if (i != Z_OK)
+                       return(-1);
+               }
+       else
+               {
+               memcpy(out,&(in[1]),ilen-1);
+               l=ilen-1;
+               }
+        fprintf(stderr,"expand  (%4d)->%4d %s\n",ilen,(int)l,in[0]?"zlib":"clear");
+       return((int)l);
+       }
+
+static int zz_uncompress (dest, destLen, source, sourceLen)
+    Bytef *dest;
+    uLongf *destLen;
+    const Bytef *source;
+    uLong sourceLen;
+{
+    z_stream stream;
+    int err;
+
+    stream.next_in = (Bytef*)source;
+    stream.avail_in = (uInt)sourceLen;
+    /* Check for source > 64K on 16-bit machine: */
+    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+
+    stream.next_out = dest;
+    stream.avail_out = (uInt)*destLen;
+    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+    stream.zalloc = (alloc_func)0;
+    stream.zfree = (free_func)0;
+
+    err = inflateInit(&stream);
+    if (err != Z_OK) return err;
+
+    err = inflate(&stream, Z_FINISH);
+    if (err != Z_STREAM_END) {
+        inflateEnd(&stream);
+        return err;
+    }
+    *destLen = stream.total_out;
+
+    err = inflateEnd(&stream);
+    return err;
+}
+
+#endif
+
+COMP_METHOD *COMP_zlib()
+       {
+       return(&zlib_method);
+       }
+
diff --git a/crypto/comp/comp.err b/crypto/comp/comp.err
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/crypto/comp/comp.h b/crypto/comp/comp.h
new file mode 100644 (file)
index 0000000..00af062
--- /dev/null
@@ -0,0 +1,64 @@
+
+#ifndef HEADER_COMP_H
+#define HEADER_COMP_H
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#include "crypto.h"
+
+typedef struct comp_method_st
+       {
+       int type;               /* NID for compression library */
+       char *name;             /* A text string to identify the library */
+       int (*init)();
+       void (*finish)();
+       int (*compress)();
+       int (*expand)();
+       long (*ctrl)();
+       } COMP_METHOD;
+
+typedef struct comp_ctx_st
+       {
+       COMP_METHOD *meth;
+       unsigned long compress_in;
+       unsigned long compress_out;
+       unsigned long expand_in;
+       unsigned long expand_out;
+
+       CRYPTO_EX_DATA  ex_data;
+       } COMP_CTX;
+
+#ifndef NOPROTO
+
+COMP_CTX *COMP_CTX_new(COMP_METHOD *meth);
+void COMP_CTX_free(COMP_CTX *ctx);
+int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen,
+       unsigned char *in, int ilen);
+int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen,
+       unsigned char *in, int ilen);
+COMP_METHOD *COMP_rle(void );
+#ifdef ZLIB
+COMP_METHOD *COMP_zlib(void );
+#endif
+
+#else
+
+COMP_CTX *COMP_CTX_new();
+void COMP_CTX_free();
+int COMP_compress_block();
+int COMP_expand_block();
+COMP_METHOD *COMP_rle();
+#ifdef ZLIB
+COMP_METHOD *COMP_zlib();
+#endif
+
+#endif
+/* BEGIN ERROR CODES */
+#ifdef  __cplusplus
+}
+#endif
+#endif
+
diff --git a/crypto/comp/comp_err.c b/crypto/comp/comp_err.c
new file mode 100644 (file)
index 0000000..7b68fc1
--- /dev/null
@@ -0,0 +1,77 @@
+/* lib//_err.c */
+/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+#include <stdio.h>
+#include "err.h"
+#include "comp.h"
+
+/* BEGIN ERROR CODES */
+#ifndef NO_ERR
+#endif
+
+void ERR_load__strings()
+       {
+       static int init=1;
+
+       if (init)
+               {
+               init=0;
+#ifndef NO_ERR
+#endif
+
+               }
+       }
diff --git a/crypto/comp/comp_lib.c b/crypto/comp/comp_lib.c
new file mode 100644 (file)
index 0000000..8ce0695
--- /dev/null
@@ -0,0 +1,85 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "objects.h"
+#include "comp.h"
+
+COMP_CTX *COMP_CTX_new(meth)
+COMP_METHOD *meth;
+       {
+       COMP_CTX *ret;
+
+       if ((ret=(COMP_CTX *)Malloc(sizeof(COMP_CTX))) == NULL)
+               {
+               /* ZZZZZZZZZZZZZZZZ */
+               return(NULL);
+               }
+       memset(ret,0,sizeof(COMP_CTX));
+       ret->meth=meth;
+       if ((ret->meth->init != NULL) && !ret->meth->init(ret))
+               {
+               Free(ret);
+               ret=NULL;
+               }
+#if 0
+       else
+               CRYPTO_new_ex_data(rsa_meth,(char *)ret,&ret->ex_data);
+#endif
+       return(ret);
+       }
+
+void COMP_CTX_free(ctx)
+COMP_CTX *ctx;
+       {
+       /* CRYPTO_free_ex_data(rsa_meth,(char *)ctx,&ctx->ex_data); */
+
+       if (ctx->meth->finish != NULL)
+               ctx->meth->finish(ctx);
+
+       Free(ctx);
+       }
+
+int COMP_compress_block(ctx,out,olen,in,ilen)
+COMP_CTX *ctx;
+unsigned char *out;
+int olen;
+unsigned char *in;
+int ilen;
+       {
+       int ret;
+       if (ctx->meth->compress == NULL)
+               {
+               /* ZZZZZZZZZZZZZZZZZ */
+               return(-1);
+               }
+       ret=ctx->meth->compress(ctx,out,olen,in,ilen);
+       if (ret > 0)
+               {
+               ctx->compress_in+=ilen;
+               ctx->compress_out+=ret;
+               }
+       return(ret);
+       }
+
+int COMP_expand_block(ctx,out,olen,in,ilen)
+COMP_CTX *ctx;
+unsigned char *out;
+int olen;
+unsigned char *in;
+int ilen;
+       {
+       int ret;
+
+       if (ctx->meth->expand == NULL)
+               {
+               /* ZZZZZZZZZZZZZZZZZ */
+               return(-1);
+               }
+       ret=ctx->meth->expand(ctx,out,olen,in,ilen);
+       if (ret > 0)
+               {
+               ctx->expand_in+=ilen;
+               ctx->expand_out+=ret;
+               }
+       return(ret);
+       }
index 9e84300c5efd3023eb45050adf0c3e7a7cf7dd82..f5114ea69e5128c6e130b555259e9296e66701bd 100644 (file)
@@ -93,9 +93,9 @@ static CONF_VALUE *new_section();
 static CONF_VALUE *get_section();
 #endif
 
-#define scan_esc(p)    ((*(++p) == '\0')?(p):(++p))
+#define scan_esc(p)    ((((p)[1] == '\0')?(p++):(p+=2)),p)
 
-char *CONF_version="CONF part of SSLeay 0.9.0b 29-Jun-1998";
+char *CONF_version="CONF part of SSLeay 0.9.1a 06-Jul-1998";
 
 LHASH *CONF_load(h,file,line)
 LHASH *h;
@@ -105,10 +105,12 @@ long *line;
        LHASH *ret=NULL;
        FILE *in=NULL;
 #define BUFSIZE        512
+       char btmp[16];
        int bufnum=0,i,ii;
        BUF_MEM *buff=NULL;
        char *s,*p,*end;
-       int again,n,eline=0;
+       int again,n;
+       long eline=0;
        CONF_VALUE *v=NULL,*vv,*tv;
        CONF_VALUE *sv=NULL;
        char *section=NULL,*buf;
@@ -219,12 +221,21 @@ long *line;
                if (IS_EOF(*s)) continue; /* blank line */
                if (*s == '[')
                        {
+                       char *ss;
+
                        s++;
                        start=eat_ws(s);
-                       end=eat_alpha_numeric(start);
+                       ss=start;
+again:
+                       end=eat_alpha_numeric(ss);
                        p=eat_ws(end);
                        if (*p != ']')
                                {
+                               if (*p != '\0')
+                                       {
+                                       ss=p;
+                                       goto again;
+                                       }
                                CONFerr(CONF_F_CONF_LOAD,CONF_R_MISSING_CLOSE_SQUARE_BRACKET);
                                goto err;
                                }
@@ -328,6 +339,8 @@ err:
        if (buff != NULL) BUF_MEM_free(buff);
        if (section != NULL) Free(section);
        if (line != NULL) *line=eline;
+       sprintf(btmp,"%ld",eline);
+       ERR_add_error_data(2,"line ",btmp);
        if (in != NULL) fclose(in);
        if ((h != ret) && (ret != NULL)) CONF_free(ret);
        if (v != NULL)
index a8db8f266f4c16216214e37729d14632d8d80ba4..c6929b99c54ae58d63829745d06eed66e0e4ae9e 100644 (file)
@@ -84,8 +84,8 @@ void ERR_load_CONF_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_CONF,CONF_str_functs);
index ea3c135d39c81f014fee0ff55a5e693972c7101b..27652fca4073e72d1d8ba029aa92a640365095ab 100644 (file)
@@ -75,8 +75,8 @@ void ERR_load_CRYPTO_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_CRYPTO,CRYPTO_str_functs);
index 9a7e80b7f8b66ec560b0c3da9d7d97ea745a6cb6..3614e3fc5d14da87333c3aec4af354dd3a8ecb95 100644 (file)
@@ -120,10 +120,11 @@ char *name;
        SSLeay_MSVC5_hack=(double)name[0]*(double)name[1];
 #endif
 
-       if (app_locks == NULL)
-               if ((app_locks=sk_new_null()) == NULL)
-                       CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_LOCKID,ERR_R_MALLOC_FAILURE);
-                       return(0);
+       if ((app_locks == NULL) && ((app_locks=sk_new_null()) == NULL))
+               {
+               CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_LOCKID,ERR_R_MALLOC_FAILURE);
+               return(0);
+               }
        if ((str=BUF_strdup(name)) == NULL)
                return(0);
        i=sk_push(app_locks,str);
index 0a38b5b87ca2298a26a2985abb33161663f35a36..306bc0267e5d38fa714fe6ab9bde867c5bb0d0a6 100644 (file)
@@ -67,12 +67,13 @@ extern "C" {
 
 /* This is more to be used to check the correct DLL is being used
  * in the MS world. */
-#define SSLEAY_VERSION_NUMBER  0x0902  /* Version 0.5.1c would be 0513 */
+#define SSLEAY_VERSION_NUMBER  0x0911  /* Version 0.5.1c would be 0513 */
 
 #define SSLEAY_VERSION         0
 /* #define SSLEAY_OPTIONS      1 no longer supported */
 #define SSLEAY_CFLAGS          2
 #define SSLEAY_BUILT_ON                3
+#define SSLEAY_PLATFORM                4
 
 /* When changing the CRYPTO_LOCK_* list, be sure to maintin the text lock
  * names in cryptlib.c
@@ -105,6 +106,7 @@ extern "C" {
 #define CRYPTO_READ            4
 #define CRYPTO_WRITE           8
 
+#ifndef NO_LOCKING
 #ifndef CRYPTO_w_lock
 #define CRYPTO_w_lock(type)    \
        CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__)
@@ -116,14 +118,22 @@ extern "C" {
        CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__)
 #define CRYPTO_add(addr,amount,type)   \
        CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__)
-
+#endif
+#else
+#define CRYPTO_w_lock(a)
+#define        CRYPTO_w_unlock(a)
+#define CRYPTO_r_lock(a)
+#define CRYPTO_r_unlock(a)
+#define CRYPTO_add(a,b,c)      ((*(a))+=(b))
 #endif
 
 /* The following can be used to detect memory leaks in the SSLeay library.
  * It used, it turns on malloc checking */
 
-#define CRYPTO_MEM_CHECK_OFF   0x0
-#define CRYPTO_MEM_CHECK_ON    0x1
+#define CRYPTO_MEM_CHECK_OFF   0x0     /* an enume */
+#define CRYPTO_MEM_CHECK_ON    0x1     /* a bit */
+#define CRYPTO_MEM_CHECK_ENABLE        0x2     /* a bit */
+#define CRYPTO_MEM_CHECK_DISABLE 0x3   /* an enume */
 
 /*
 typedef struct crypto_mem_st
@@ -179,6 +189,10 @@ typedef struct crypto_ex_data_func_st
        (void (*)())free)
 
 #ifdef CRYPTO_MDEBUG
+#define MemCheck_start() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON)
+#define MemCheck_stop()        CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF)
+#define MemCheck_on()  CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE)
+#define MemCheck_off() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE)
 #define Malloc(num)    CRYPTO_dbg_malloc((int)num,__FILE__,__LINE__)
 #define Realloc(addr,num) \
        CRYPTO_dbg_realloc((char *)addr,(int)num,__FILE__,__LINE__)
@@ -186,18 +200,28 @@ typedef struct crypto_ex_data_func_st
        CRYPTO_dbg_remalloc((char **)addr,(int)num,__FILE__,__LINE__)
 #define FreeFunc       CRYPTO_dbg_free
 #define Free(addr)     CRYPTO_dbg_free((char *)(addr))
+#define Malloc_locked(num) CRYPTO_malloc_locked((int)num)
+#define Free_locked(addr) CRYPTO_free_locked((char *)(addr))
 #else
+#define MemCheck_start()
+#define MemCheck_stop()
+#define MemCheck_on()
+#define MemCheck_off()
 #define Remalloc       CRYPTO_remalloc
 #if defined(WIN32) || defined(MFUNC)
 #define Malloc         CRYPTO_malloc
 #define Realloc(a,n)   CRYPTO_realloc((char *)(a),(n))
 #define FreeFunc       CRYPTO_free
 #define Free(addr)     CRYPTO_free((char *)(addr))
+#define Malloc_locked  CRYPTO_malloc_locked
+#define Free_locked(addr) CRYPTO_free_locked((char *)(addr))
 #else
 #define Malloc         malloc
 #define Realloc                realloc
 #define FreeFunc       free
 #define Free(addr)     free((char *)(addr))
+#define Malloc_locked  malloc
+#define Free_locked(addr) free((char *)(addr))
 #endif /* WIN32 || MFUNC */
 #endif /* MDEBUG */
 
@@ -238,10 +262,14 @@ int CRYPTO_add_lock(int *pointer,int amount,int type, char *file,int line);
 
 void CRYPTO_set_mem_functions(char *(*m)(),char *(*r)(), void (*free_func)());
 void CRYPTO_get_mem_functions(char *(**m)(),char *(**r)(), void (**f)());
+void CRYPTO_set_locked_mem_functions(char *(*m)(), void (*free_func)());
+void CRYPTO_get_locked_mem_functions(char *(**m)(), void (**f)());
 
+char *CRYPTO_malloc_locked(int num);
+void CRYPTO_free_locked(char *);
 char *CRYPTO_malloc(int num);
-char *CRYPTO_realloc(char *addr,int num);
 void CRYPTO_free(char *);
+char *CRYPTO_realloc(char *addr,int num);
 char *CRYPTO_remalloc(char *addr,int num);
 
 char *CRYPTO_dbg_malloc(int num,char *file,int line);
index 4e823be52f9c1db3352a9e0ad0f225a4cc429c96..03d716a581aef43d99042edc88d468b2c72512f8 100644 (file)
@@ -66,7 +66,7 @@ char *SSLeay_version(t)
 int t;
        {
        if (t == SSLEAY_VERSION)
-               return("SSLeay 0.9.0b 29-Jun-1998");
+               return("SSLeay 0.9.1a 06-Jul-1998");
        if (t == SSLEAY_BUILT_ON)
                {
 #ifdef DATE
@@ -87,6 +87,17 @@ int t;
                return(buf);
 #else
                return("C flags not available");
+#endif
+               }
+       if (t == SSLEAY_PLATFORM)
+               {
+#ifdef PLATFORM
+               static char buf[sizeof(PLATFORM)+10];
+
+               sprintf(buf,"Platform:%s",PLATFORM);
+               return(buf);
+#else
+               return("Platform information not available");
 #endif
                }
        return("not available");
index 1cbe8f6efbc43652f7441448ced0cdde678ae6c9..ea0b79a3ba083a979d8e7ba3acfe98ce80b6702b 100644 (file)
@@ -1 +1 @@
-#define DATE   "Fri Apr 10 01:11:55 EST 1998"
+#define DATE   "Wed Jul 22 12:21:22 EST 1998"
index 78b5189ee351cee486b2ef9b969babf71768d265..9ca1b872bedb98e572e05b455be91ddcaff2857e 100644 (file)
@@ -83,10 +83,10 @@ asm/yx86-out.o: asm/yx86unix.cpp
 
 # bsdi
 asm/dx86bsdi.o: asm/dx86unix.cpp
-       $(CPP) -DBSDI asm/dx86unix.cpp | as -o asm/dx86bsdi.o
+       $(CPP) -DBSDI asm/dx86unix.cpp | sed 's/ :/:/' | as -o asm/dx86bsdi.o
 
 asm/yx86bsdi.o: asm/yx86unix.cpp
-       $(CPP) -DBSDI asm/yx86unix.cpp | as -o asm/yx86bsdi.o
+       $(CPP) -DBSDI asm/yx86unix.cpp | sed 's/ :/:/' | as -o asm/yx86bsdi.o
 
 asm/dx86unix.cpp:
        (cd asm; perl des-586.pl cpp >dx86unix.cpp)
index f62d8bdac0ea0faef35f4c55e81b53fcbeb3d821..c7d01542bc739a01ac4a4ddaf78775b4861a554c 100644 (file)
@@ -1,3 +1,4 @@
+       Fixed the weak key values which were wrong :-(
        Defining SIGACTION causes sigaction() to be used instead of signal().
        SIGUSR1/SIGUSR2 are no longer mapped in the read tty stuff because it
        can cause problems.  This should hopefully not affect normal
diff --git a/crypto/des/asm/f.cpp b/crypto/des/asm/f.cpp
new file mode 100644 (file)
index 0000000..4fa46f2
--- /dev/null
@@ -0,0 +1,6 @@
+#define abc    def
+#define dbc:   ghi:
+
+
+abc
+dbc:
index a4cf5c8770b0cad0c1a01c83b3f91c2a6b4906a1..4d7610c8ed609df642e29b1389df3cb9fe9cb87e 100644 (file)
@@ -90,6 +90,7 @@ typedef struct des_ks_struct
                } ks;
 #undef _
 #define _      ks._
+       int weak_key;
        } des_key_schedule[16];
 
 #define DES_KEY_SZ     (sizeof(des_cblock))
@@ -140,6 +141,7 @@ typedef des_key_schedule bit_64;
 
 extern int des_check_key;      /* defaults to false */
 extern int des_rw_mode;                /* defaults to DES_PCBC_MODE */
+extern int des_set_weak_key_flag; /* set the weak key flag */
 
 /* The next line is used to disable full ANSI prototypes, if your
  * compiler has problems with the prototypes, make sure this line always
index a4cf5c8770b0cad0c1a01c83b3f91c2a6b4906a1..4d7610c8ed609df642e29b1389df3cb9fe9cb87e 100644 (file)
@@ -90,6 +90,7 @@ typedef struct des_ks_struct
                } ks;
 #undef _
 #define _      ks._
+       int weak_key;
        } des_key_schedule[16];
 
 #define DES_KEY_SZ     (sizeof(des_cblock))
@@ -140,6 +141,7 @@ typedef des_key_schedule bit_64;
 
 extern int des_check_key;      /* defaults to false */
 extern int des_rw_mode;                /* defaults to DES_PCBC_MODE */
+extern int des_set_weak_key_flag; /* set the weak key flag */
 
 /* The next line is used to disable full ANSI prototypes, if your
  * compiler has problems with the prototypes, make sure this line always
index e2e503cbed71b030ca37b7a8ed132a557c069a9f..67ef3e7900f1749a27396d9c5bcf59001f4db0bd 100644 (file)
@@ -119,16 +119,16 @@ YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!!
    there's no way to tell at compile time what it is you're running on */
  
 #if defined( sun )             /* Newer Sparc's */
-  #define DES_PTR
-  #define DES_RISC1
-  #define DES_UNROLL
+#  define DES_PTR
+#  define DES_RISC1
+#  define DES_UNROLL
 #elif defined( __ultrix )      /* Older MIPS */
-  #define DES_PTR
-  #define DES_RISC2
-  #define DES_UNROLL
+#  define DES_PTR
+#  define DES_RISC2
+#  define DES_UNROLL
 #elif defined( __osf1__ )      /* Alpha */
-  #define DES_PTR
-  #define DES_RISC2
+#  define DES_PTR
+#  define DES_RISC2
 #elif defined ( _AIX )         /* RS6000 */
   /* Unknown */
 #elif defined( __hpux )                /* HP-PA */
@@ -136,15 +136,15 @@ YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!!
 #elif defined( __aux )         /* 68K */
   /* Unknown */
 #elif defined( __dgux )                /* 88K (but P6 in latest boxes) */
-  #define DES_UNROLL
+#  define DES_UNROLL
 #elif defined( __sgi )         /* Newer MIPS */
-  #define DES_PTR
-  #define DES_RISC2
-  #define DES_UNROLL
+#  define DES_PTR
+#  define DES_RISC2
+#  define DES_UNROLL
 #elif defined( i386 )          /* x86 boxes, should be gcc */
-  #define DES_PTR
-  #define DES_RISC1
-  #define DES_UNROLL
+#  define DES_PTR
+#  define DES_RISC1
+#  define DES_UNROLL
 #endif /* Systems-specific speed defines */
 #endif
 
index e2e503cbed71b030ca37b7a8ed132a557c069a9f..67ef3e7900f1749a27396d9c5bcf59001f4db0bd 100644 (file)
@@ -119,16 +119,16 @@ YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!!
    there's no way to tell at compile time what it is you're running on */
  
 #if defined( sun )             /* Newer Sparc's */
-  #define DES_PTR
-  #define DES_RISC1
-  #define DES_UNROLL
+#  define DES_PTR
+#  define DES_RISC1
+#  define DES_UNROLL
 #elif defined( __ultrix )      /* Older MIPS */
-  #define DES_PTR
-  #define DES_RISC2
-  #define DES_UNROLL
+#  define DES_PTR
+#  define DES_RISC2
+#  define DES_UNROLL
 #elif defined( __osf1__ )      /* Alpha */
-  #define DES_PTR
-  #define DES_RISC2
+#  define DES_PTR
+#  define DES_RISC2
 #elif defined ( _AIX )         /* RS6000 */
   /* Unknown */
 #elif defined( __hpux )                /* HP-PA */
@@ -136,15 +136,15 @@ YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!!
 #elif defined( __aux )         /* 68K */
   /* Unknown */
 #elif defined( __dgux )                /* 88K (but P6 in latest boxes) */
-  #define DES_UNROLL
+#  define DES_UNROLL
 #elif defined( __sgi )         /* Newer MIPS */
-  #define DES_PTR
-  #define DES_RISC2
-  #define DES_UNROLL
+#  define DES_PTR
+#  define DES_RISC2
+#  define DES_UNROLL
 #elif defined( i386 )          /* x86 boxes, should be gcc */
-  #define DES_PTR
-  #define DES_RISC1
-  #define DES_UNROLL
+#  define DES_PTR
+#  define DES_RISC1
+#  define DES_UNROLL
 #endif /* Systems-specific speed defines */
 #endif
 
index fdf0fbf461c3d9582e0caca95a00fd53917a721c..29d9461d296c41307fd23cc1e064b267ea0be1cb 100644 (file)
@@ -92,7 +92,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
index 620c13ba6fb5928077aee51349db8caea252436f..5700608b9b0398f64498d4c02ce556110a467075 100644 (file)
 #include <string.h>
 #include "des.h"
 
+#if defined(PERL5) || defined(__FreeBSD__)
+#define crypt(c,s) (des_crypt((c),(s)))
+#endif
+
 /* tisk tisk - the test keys don't all have odd parity :-( */
 /* test data */
 #define NUM_TESTS 34
@@ -660,17 +664,20 @@ plain[8+4], plain[8+5], plain[8+6], plain[8+7]);
        printf("Doing quad_cksum\n");
        cs=quad_cksum((C_Block *)cbc_data,(C_Block *)qret,
                (long)strlen(cbc_data),2,(C_Block *)cbc_iv);
+
+       { /* Big-endian fix */
+       static DES_LONG l=1;
+       static unsigned char *c=(unsigned char *)&l;
+       DES_LONG ll;
+
        j=sizeof(lqret[0])-4;
        for (i=0; i<4; i++)
                {
                lqret[i]=0;
                memcpy(&(lqret[i]),&(qret[i][0]),4);
-               if (j > 0) lqret[i]=lqret[i]>>(j*8); /* For Cray */
+               if (!c[0] && (j > 0))
+                       lqret[i]=lqret[i]>>(j*8); /* For Cray */
                }
-       { /* Big-endian fix */
-       static DES_LONG l=1;
-       static unsigned char *c=(unsigned char *)&l;
-       DES_LONG ll;
 
        if (!c[0])
                {
index acf23fdd00213fac4f58f735333a4764a6aaae7c..2f99ae5ddcd19b87cbb5c4f2f5001fc79ad674aa 100644 (file)
@@ -60,7 +60,7 @@
 #include "spr.h"
 
 char *libdes_version="libdes v 3.24 - 20-Apr-1996 - eay";
-char *DES_version="DES part of SSLeay 0.9.0b 29-Jun-1998";
+char *DES_version="DES part of SSLeay 0.9.1a 06-Jul-1998";
 
 char *des_options()
        {
index 129beb27da7fcab32758889005e6afc62bbcd199..645e66a9aea8d017015928e6248c21c0d72acdfd 100644 (file)
@@ -55,21 +55,21 @@ static unsigned const char cov_2char[64]={
 void fcrypt_body(DES_LONG *out,des_key_schedule ks,
        DES_LONG Eswap0, DES_LONG Eswap1);
 
-#if defined(PERL5) || defined(FreeBSD)
+#if defined(PERL5) || defined(__FreeBSD__)
 char *des_crypt(const char *buf,const char *salt);
 #else
 char *crypt(const char *buf,const char *salt);
 #endif
 #else
 void fcrypt_body();
-#ifdef PERL5
+#if defined(PERL5) || defined(__FreeBSD__)
 char *des_crypt();
 #else
 char *crypt();
 #endif
 #endif
 
-#if defined(PERL5) || defined(FreeBSD)
+#if defined(PERL5) || defined(__FreeBSD__)
 char *des_crypt(buf,salt)
 #else
 char *crypt(buf,salt)
index c3bcd7ee2b23b7555e8ad83cf64ee18b59e9f035..fe966fd25570c1c4e3c255b02f4eaa027caa9bec 100644 (file)
@@ -111,8 +111,8 @@ static des_cblock weak_keys[NUM_WEAK_KEY]={
        /* weak keys */
        {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
        {0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE},
-       {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
-       {0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0},
+       {0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E},
+       {0xE0,0xE0,0xE0,0xE0,0xF1,0xF1,0xF1,0xF1},
        /* semi-weak keys */
        {0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE},
        {0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01},
index 5bbe8b01d6e8e635289d05d9502ab22ff8e59da9..bac078e054c31b128c2cfb5dbff87ba898085bf8 100644 (file)
@@ -92,7 +92,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
index 4cc1df2650bee140ed0b6e24119972a0e4f12767..8d60ae5c52f201c67648f9f2e067e7380a46b802 100644 (file)
@@ -67,6 +67,8 @@ extern "C" {
 #define BIGNUM                 char
 #endif
 
+#define DH_FLAG_CACHE_MONT_P   0x01
+
 typedef struct dh_st
        {
        /* This first argument is used to pick up errors when
@@ -78,6 +80,9 @@ typedef struct dh_st
        int length; /* optional */
        BIGNUM *pub_key;        /* y */
        BIGNUM *priv_key;       /* x */
+
+       int flags;
+       char *method_mont_p;
        } DH;
 
 #define DH_GENERATOR_2         2
index 9d5c06ac248c9a1cdd9157ba7ae02d9da5374f0b..83ad45fb04f058ad6abac315eb17fa01117765e8 100644 (file)
@@ -84,8 +84,8 @@ void ERR_load_DH_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_DH,DH_str_functs);
index 04c7046a7b03a7da5dc26cf4f5d3c3f62097f74f..466f2bf06f51cd71820ea3c8ed5255dbea4f03f1 100644 (file)
@@ -97,8 +97,8 @@ char *cb_arg;
        ret=DH_new();
        ctx=BN_CTX_new();
        if (ctx == NULL) goto err;
-       t1=ctx->bn[0];
-       t2=ctx->bn[1];
+       t1= &(ctx->bn[0]);
+       t2= &(ctx->bn[1]);
        ctx->tos=2;
        
        if (generator == DH_GENERATOR_2)
@@ -126,7 +126,7 @@ char *cb_arg;
        else
                g=generator;
        
-       p=BN_generate_prime(prime_len,1,t1,t2,callback,cb_arg);
+       p=BN_generate_prime(NULL,prime_len,1,t1,t2,callback,cb_arg);
        if (p == NULL) goto err;
        if (callback != NULL) callback(3,0,cb_arg);
        ret->p=p;
index 7576772bcd52635b7fb205a68e82ab00c6ddb15b..fa2c96082be0cd475af561333260ffbbd4f30fe6 100644 (file)
@@ -67,11 +67,11 @@ DH *dh;
        {
        int ok=0;
        unsigned int i;
-       BN_CTX *ctx=NULL;
+       BN_CTX ctx;
+       BN_MONT_CTX *mont;
        BIGNUM *pub_key=NULL,*priv_key=NULL;
 
-       ctx=BN_CTX_new();
-       if (ctx == NULL) goto err;
+       BN_CTX_init(&ctx);
 
        if (dh->priv_key == NULL)
                {
@@ -96,7 +96,15 @@ DH *dh;
        else
                pub_key=dh->pub_key;
 
-       if (!BN_mod_exp(pub_key,dh->g,priv_key,dh->p,ctx)) goto err;
+       if ((dh->method_mont_p == NULL) && (dh->flags & DH_FLAG_CACHE_MONT_P))
+               {
+               if ((dh->method_mont_p=(char *)BN_MONT_CTX_new()) != NULL)
+                       if (!BN_MONT_CTX_set((BN_MONT_CTX *)dh->method_mont_p,
+                               dh->p,&ctx)) goto err;
+               }
+       mont=(BN_MONT_CTX *)dh->method_mont_p;
+
+       if (!BN_mod_exp_mont(pub_key,dh->g,priv_key,dh->p,&ctx,mont)) goto err;
                
        dh->pub_key=pub_key;
        dh->priv_key=priv_key;
@@ -107,7 +115,7 @@ err:
 
        if ((pub_key != NULL)  && (dh->pub_key == NULL))  BN_free(pub_key);
        if ((priv_key != NULL) && (dh->priv_key == NULL)) BN_free(priv_key);
-       if (ctx != NULL) BN_CTX_free(ctx);
+       BN_CTX_free(&ctx);
        return(ok);
        }
 
@@ -116,20 +124,28 @@ unsigned char *key;
 BIGNUM *pub_key;
 DH *dh;
        {
-       BN_CTX *ctx;
+       BN_CTX ctx;
+       BN_MONT_CTX *mont;
        BIGNUM *tmp;
        int ret= -1;
 
-       ctx=BN_CTX_new();
-       if (ctx == NULL) goto err;
-       tmp=ctx->bn[ctx->tos++];
+       BN_CTX_init(&ctx);
+       tmp= &(ctx.bn[ctx.tos++]);
        
        if (dh->priv_key == NULL)
                {
                DHerr(DH_F_DH_COMPUTE_KEY,DH_R_NO_PRIVATE_VALUE);
                goto err;
                }
-       if (!BN_mod_exp(tmp,pub_key,dh->priv_key,dh->p,ctx))
+       if ((dh->method_mont_p == NULL) && (dh->flags & DH_FLAG_CACHE_MONT_P))
+               {
+               if ((dh->method_mont_p=(char *)BN_MONT_CTX_new()) != NULL)
+                       if (!BN_MONT_CTX_set((BN_MONT_CTX *)dh->method_mont_p,
+                               dh->p,&ctx)) goto err;
+               }
+
+       mont=(BN_MONT_CTX *)dh->method_mont_p;
+       if (!BN_mod_exp_mont(tmp,pub_key,dh->priv_key,dh->p,&ctx,mont))
                {
                DHerr(DH_F_DH_COMPUTE_KEY,ERR_R_BN_LIB);
                goto err;
@@ -137,6 +153,6 @@ DH *dh;
 
        ret=BN_bn2bin(tmp,key);
 err:
-       if (ctx != NULL) BN_CTX_free(ctx);
+       BN_CTX_free(&ctx);
        return(ret);
        }
index a300b38396506784a696f7fa972f50b1fbac0eff..1b4bb4ea2b09d9fb676e0ae380d2ffc0ae1f8378 100644 (file)
@@ -61,7 +61,7 @@
 #include "bn.h"
 #include "dh.h"
 
-char *DH_version="Diffie-Hellman part of SSLeay 0.9.0b 29-Jun-1998";
+char *DH_version="Diffie-Hellman part of SSLeay 0.9.1a 06-Jul-1998";
 
 DH *DH_new()
        {
@@ -80,6 +80,8 @@ DH *DH_new()
        ret->length=0;
        ret->pub_key=NULL;
        ret->priv_key=NULL;
+       ret->flags=DH_FLAG_CACHE_MONT_P;
+       ret->method_mont_p=NULL;
        return(ret);
        }
 
@@ -90,6 +92,8 @@ DH *r;
        if (r->g != NULL) BN_clear_free(r->g);
        if (r->pub_key != NULL) BN_clear_free(r->pub_key);
        if (r->priv_key != NULL) BN_clear_free(r->priv_key);
+       if (r->method_mont_p != NULL)
+               BN_MONT_CTX_free((BN_MONT_CTX *)r->method_mont_p);
        Free(r);
        }
 
index 488f10fd41f7b5e4b58c9fb5eb212e065a5813b7..e8e1695eddbd08194138e2c80e48dbf182fc3986 100644 (file)
@@ -182,6 +182,7 @@ char *arg;
        if (p == 2) c='*';
        if (p == 3) c='\n';
        BIO_write((BIO *)arg,&c,1);
+       BIO_flush((BIO *)arg);
 #ifdef LINT
        p=n;
 #endif
index 1ca87c1cbea1bef92b75fad3c9ace09b79bc4515..a231c199b72db655ded8c8bd3d688fa5be8a1be5 100644 (file)
@@ -71,6 +71,8 @@ extern "C" {
 
 #include "bn.h"
 
+#define DSA_FLAG_CACHE_MONT_P  0x01
+
 typedef struct dsa_st
        {
        /* This first variable is used to pick up errors where
@@ -88,6 +90,10 @@ typedef struct dsa_st
        BIGNUM *kinv;   /* Signing pre-calc */
        BIGNUM *r;      /* Signing pre-calc */
 
+       int flags;
+       /* Normally used to cache montgomery values */
+       char *method_mont_p;
+
        int references;
        } DSA;
 
index 318e9f31aadf443d0ed148ec8ec78334c413653c..4cb58a8951eb2bf54c639961ded59d2257fe0c16 100644 (file)
@@ -87,8 +87,8 @@ void ERR_load_DSA_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_DSA,DSA_str_functs);
index d7d30bf90a056059a2ccbd38ba5bed63b3c0c961..8202b80292ab32fe6c679ff33eed5f841615a264 100644 (file)
@@ -88,6 +88,7 @@ char *cb_arg;
        unsigned char buf[SHA_DIGEST_LENGTH],buf2[SHA_DIGEST_LENGTH];
        BIGNUM *r0,*W,*X,*c,*test;
        BIGNUM *g=NULL,*q=NULL,*p=NULL;
+       BN_MONT_CTX *mont=NULL;
        int k,n=0,i,b,m=0;
        int counter=0;
        BN_CTX *ctx=NULL,*ctx2=NULL;
@@ -100,20 +101,20 @@ char *cb_arg;
        if ((seed_in != NULL) && (seed_len == 20))
                memcpy(seed,seed_in,seed_len);
 
-       ctx=BN_CTX_new();
-       if (ctx == NULL) goto err;
-       ctx2=BN_CTX_new();
-       if (ctx2 == NULL) goto err;
-       ret=DSA_new();
-       if (ret == NULL) goto err;
-       r0=ctx2->bn[0];
-       g=ctx2->bn[1];
-       W=ctx2->bn[2];
-       q=ctx2->bn[3];
-       X=ctx2->bn[4];
-       c=ctx2->bn[5];
-       p=ctx2->bn[6];
-       test=ctx2->bn[7];
+       if ((ctx=BN_CTX_new()) == NULL) goto err;
+       if ((ctx2=BN_CTX_new()) == NULL) goto err;
+       if ((ret=DSA_new()) == NULL) goto err;
+
+       if ((mont=BN_MONT_CTX_new()) == NULL) goto err;
+
+       r0= &(ctx2->bn[0]);
+       g= &(ctx2->bn[1]);
+       W= &(ctx2->bn[2]);
+       q= &(ctx2->bn[3]);
+       X= &(ctx2->bn[4]);
+       c= &(ctx2->bn[5]);
+       p= &(ctx2->bn[6]);
+       test= &(ctx2->bn[7]);
 
        BN_lshift(test,BN_value_one(),bits-1);
 
@@ -220,10 +221,12 @@ end:
         BN_div(r0,NULL,test,q,ctx);
 
        BN_set_word(test,h);
+       BN_MONT_CTX_set(mont,p,ctx);
+
        for (;;)
                {
                /* g=test^r0%p */
-               BN_mod_exp(g,test,r0,p,ctx);
+               BN_mod_exp_mont(g,test,r0,p,ctx,mont);
                if (!BN_is_one(g)) break;
                BN_add(test,test,BN_value_one());
                h++;
@@ -246,8 +249,9 @@ err:
                if (counter_ret != NULL) *counter_ret=counter;
                if (h_ret != NULL) *h_ret=h;
                }
-       BN_CTX_free(ctx);
-       BN_CTX_free(ctx2);
+       if (ctx != NULL) BN_CTX_free(ctx);
+       if (ctx != NULL) BN_CTX_free(ctx2);
+       if (mont != NULL) BN_MONT_CTX_free(mont);
        return(ok?ret:NULL);
        }
 
@@ -258,20 +262,22 @@ char *cb_arg;
        {
        int ok= -1,j,i,n;
        BN_CTX *ctx=NULL,*ctx2=NULL;
-       BIGNUM *w_1,*b,*m,*z;
+       BIGNUM *w_1,*b,*m,*z,*tmp,*mont_1;
        int a;
+       BN_MONT_CTX *mont=NULL;
 
        if (!BN_is_bit_set(w,0)) return(0);
 
-       ctx=BN_CTX_new();
-       if (ctx == NULL) goto err;
-       ctx2=BN_CTX_new();
-       if (ctx2 == NULL) goto err;
+       if ((ctx=BN_CTX_new()) == NULL) goto err;
+       if ((ctx2=BN_CTX_new()) == NULL) goto err;
+       if ((mont=BN_MONT_CTX_new()) == NULL) goto err;
 
-       m=  ctx2->bn[2];
-       b=  ctx2->bn[3];
-       z=  ctx2->bn[4];
-       w_1=ctx2->bn[5];
+       m=   &(ctx2->bn[2]);
+       b=   &(ctx2->bn[3]);
+       z=   &(ctx2->bn[4]);
+       w_1= &(ctx2->bn[5]);
+       tmp= &(ctx2->bn[6]);
+       mont_1= &(ctx2->bn[7]);
 
        /* step 1 */
        n=50;
@@ -282,24 +288,30 @@ char *cb_arg;
                ;
        if (!BN_rshift(m,w_1,a)) goto err;
 
+       BN_MONT_CTX_set(mont,w,ctx);
+       BN_to_montgomery(mont_1,BN_value_one(),mont,ctx);
+       BN_to_montgomery(w_1,w_1,mont,ctx);
        for (i=1; i < n; i++)
                {
                /* step 3 */
                BN_rand(b,BN_num_bits(w)-2/*-1*/,0,0);
-               BN_set_word(b,0x10001L);
+               /* BN_set_word(b,0x10001L); */
 
                /* step 4 */
                j=0;
-               if (!BN_mod_exp(z,b,m,w,ctx)) goto err;
+               if (!BN_mod_exp_mont(z,b,m,w,ctx,mont)) goto err;
+
+               if (!BN_to_montgomery(z,z,mont,ctx)) goto err;
 
                /* step 5 */
                for (;;)
                        {
-                       if (((j == 0) && BN_is_one(z)) || (BN_cmp(z,w_1) == 0))
+                       if (((j == 0) && (BN_cmp(z,mont_1) == 0)) ||
+                               (BN_cmp(z,w_1) == 0))
                                break;
 
                        /* step 6 */
-                       if ((j > 0) && BN_is_one(z))
+                       if ((j > 0) && (BN_cmp(z,mont_1) == 0))
                                {
                                ok=0;
                                goto err;
@@ -312,7 +324,7 @@ char *cb_arg;
                                goto err;
                                }
 
-                       if (!BN_mod_mul(z,z,z,w,ctx)) goto err;
+                       if (!BN_mod_mul_montgomery(z,z,z,mont,ctx)) goto err;
                        if (callback != NULL) callback(1,j,cb_arg);
                        }
                }
index b647257f9fb1ad4064b2df30a59c720963e74059..bfa9ca28d7874d404a4e5b4d8fad395e096648ae 100644 (file)
@@ -64,7 +64,7 @@
 #include "dsa.h"
 #include "asn1.h"
 
-char *DSA_version="\0DSA part of SSLeay 0.9.0b 29-Jun-1998";
+char *DSA_version="\0DSA part of SSLeay 0.9.1a 06-Jul-1998";
 
 DSA *DSA_new()
        {
@@ -82,12 +82,14 @@ DSA *DSA_new()
        ret->p=NULL;
        ret->q=NULL;
        ret->g=NULL;
+       ret->flags=DSA_FLAG_CACHE_MONT_P;
 
        ret->pub_key=NULL;
        ret->priv_key=NULL;
 
        ret->kinv=NULL;
        ret->r=NULL;
+       ret->method_mont_p=NULL;
 
        ret->references=1;
        return(ret);
@@ -120,6 +122,8 @@ DSA *r;
        if (r->priv_key != NULL) BN_clear_free(r->priv_key);
        if (r->kinv != NULL) BN_clear_free(r->kinv);
        if (r->r != NULL) BN_clear_free(r->r);
+       if (r->method_mont_p != NULL)
+               BN_MONT_CTX_free((BN_MONT_CTX *)r->method_mont_p);
        Free(r);
        }
 
index 6ca1c318f24fe1b6b774b7ae9b9969e3c3384e7c..c4df4e5b752d49daf774a3f5d81aac3e6bfd1d81 100644 (file)
@@ -77,8 +77,8 @@ unsigned int *siglen; /* out */
 DSA *dsa;
        {
        BIGNUM *kinv=NULL,*r=NULL;
-       BIGNUM *m=NULL;
-       BIGNUM *xr=NULL,*s=NULL;
+       BIGNUM m;
+       BIGNUM xr,s;
        BN_CTX *ctx=NULL;
        unsigned char *p;
        int i,len=0,ret=0,reason=ERR_R_BN_LIB;
@@ -86,6 +86,10 @@ DSA *dsa;
        MS_STATIC unsigned char rbuf[50]; /* assuming r is 20 bytes +extra */
        MS_STATIC unsigned char sbuf[50]; /* assuming s is 20 bytes +extra */
 
+       BN_init(&m);
+       BN_init(&xr);
+       BN_init(&s);
+
        i=BN_num_bytes(dsa->q); /* should be 20 */
        if ((dlen > i) || (dlen > 50))
                {
@@ -108,17 +112,14 @@ DSA *dsa;
                dsa->r=NULL;
                }
 
-       m=BN_new();
-       xr=BN_new();
-       s=BN_new();
-       if (m == NULL || xr == NULL || s == NULL) goto err;
-
-       if (BN_bin2bn(dgst,dlen,m) == NULL) goto err;
+       if (BN_bin2bn(dgst,dlen,&m) == NULL) goto err;
 
        /* Compute  s = inv(k) (m + xr) mod q */
-       if (!BN_mul(xr, dsa->priv_key, r)) goto err;    /* s = xr */
-       if (!BN_add(s, xr, m)) goto err;                /* s = m + xr */
-       if (!BN_mod_mul(s,s,kinv,dsa->q,ctx)) goto err;
+       if (!BN_mod_mul(&xr,dsa->priv_key,r,dsa->q,ctx)) goto err;/* s = xr */
+       if (!BN_add(&s, &xr, &m)) goto err;             /* s = m + xr */
+       if (BN_cmp(&s,dsa->q) > 0)
+               BN_sub(&s,&s,dsa->q);
+       if (!BN_mod_mul(&s,&s,kinv,dsa->q,ctx)) goto err;
 
        /*
         * Now create a ASN.1 sequence of the integers R and S.
@@ -128,7 +129,7 @@ DSA *dsa;
        rbs.type = V_ASN1_INTEGER;
        sbs.type = V_ASN1_INTEGER;
        rbs.length=BN_bn2bin(r,rbs.data);
-       sbs.length=BN_bn2bin(s,sbs.data);
+       sbs.length=BN_bn2bin(&s,sbs.data);
 
        len =i2d_ASN1_INTEGER(&rbs,NULL);
        len+=i2d_ASN1_INTEGER(&sbs,NULL);
@@ -147,9 +148,9 @@ err:
        if (r != NULL) BN_clear_free(r);
 #endif
        if (ctx != NULL) BN_CTX_free(ctx);
-       if (m != NULL) BN_clear_free(m);
-       if (xr != NULL) BN_clear_free(xr);
-       if (s != NULL) BN_clear_free(s);
+       BN_clear_free(&m);
+       BN_clear_free(&xr);
+       BN_clear_free(&s);
        return(ret);
        }
 
@@ -160,7 +161,7 @@ BIGNUM **kinvp;
 BIGNUM **rp;
        {
        BN_CTX *ctx;
-       BIGNUM *k=NULL,*kinv=NULL,*r=NULL;
+       BIGNUM k,*kinv=NULL,*r=NULL;
        int ret=0;
 
        if (ctx_in == NULL)
@@ -170,29 +171,33 @@ BIGNUM **rp;
        else
                ctx=ctx_in;
 
-       r=BN_new();
-       k=BN_new();
-       if ((r == NULL) || (k == NULL))
-               goto err;
+       BN_init(&k);
+       if ((r=BN_new()) == NULL) goto err;
        kinv=NULL;
 
-       if (r == NULL) goto err;
-
        /* Get random k */
        for (;;)
                {
-               if (!BN_rand(k, BN_num_bits(dsa->q), 1, 0)) goto err;
-               if (BN_cmp(k,dsa->q) >= 0)
-                       BN_sub(k,k,dsa->q);
-               if (!BN_is_zero(k)) break;
+               if (!BN_rand(&k, BN_num_bits(dsa->q), 1, 0)) goto err;
+               if (BN_cmp(&k,dsa->q) >= 0)
+                       BN_sub(&k,&k,dsa->q);
+               if (!BN_is_zero(&k)) break;
+               }
+
+       if ((dsa->method_mont_p == NULL) && (dsa->flags & DSA_FLAG_CACHE_MONT_P))
+               {
+               if ((dsa->method_mont_p=(char *)BN_MONT_CTX_new()) != NULL)
+                       if (!BN_MONT_CTX_set((BN_MONT_CTX *)dsa->method_mont_p,
+                               dsa->p,ctx)) goto err;
                }
 
        /* Compute r = (g^k mod p) mod q */
-       if (!BN_mod_exp(r,dsa->g,k,dsa->p,ctx)) goto err;
+       if (!BN_mod_exp_mont(r,dsa->g,&k,dsa->p,ctx,
+               (BN_MONT_CTX *)dsa->method_mont_p)) goto err;
        if (!BN_mod(r,r,dsa->q,ctx)) goto err;
 
        /* Compute  part of 's = inv(k) (m + xr) mod q' */
-       if ((kinv=BN_mod_inverse(k,dsa->q,ctx)) == NULL) goto err;
+       if ((kinv=BN_mod_inverse(NULL,&k,dsa->q,ctx)) == NULL) goto err;
 
        if (*kinvp != NULL) BN_clear_free(*kinvp);
        *kinvp=kinv;
@@ -208,8 +213,8 @@ err:
                if (r != NULL) BN_clear_free(r);
                }
        if (ctx_in == NULL) BN_CTX_free(ctx);
-       if (k != NULL) BN_clear_free(k);
        if (kinv != NULL) BN_clear_free(kinv);
+       BN_clear_free(&k);
        return(ret);
        }
 
index 0f860984edc7cdf3bada0fae1875b58868eea36b..71cefbeaa47d36ad4701a21b57713f87b1386e66 100644 (file)
@@ -85,52 +85,76 @@ DSA *dsa;
        ASN1_CTX c;
        unsigned char **pp= &sigbuf;
        BN_CTX *ctx;
-       BIGNUM *r=NULL;
-       BIGNUM *t1=NULL,*t2=NULL;
-       BIGNUM *u1=NULL,*u2=NULL;
+       BIGNUM r,u1,u2,t1;
        ASN1_INTEGER *bs=NULL;
+       BN_MONT_CTX *mont=NULL;
        int ret = -1;
 
-       ctx=BN_CTX_new();
-       if (ctx == NULL) goto err;
+       if ((ctx=BN_CTX_new()) == NULL) goto err;
+       if ((mont=BN_MONT_CTX_new()) == NULL) goto err;
 
-       t1=BN_new();
-       t2=BN_new();
-       if (t1 == NULL || t2 == NULL) goto err;
+       BN_init(&u1);
+       BN_init(&u2);
+       BN_init(&r);
+       BN_init(&t1);
 
        M_ASN1_D2I_Init();
        M_ASN1_D2I_start_sequence();
         M_ASN1_D2I_get(bs,d2i_ASN1_INTEGER);
-        if ((r=BN_bin2bn(bs->data,bs->length,NULL)) == NULL) goto err_bn;
+        if ((BN_bin2bn(bs->data,bs->length,&r)) == NULL) goto err_bn;
         M_ASN1_D2I_get(bs,d2i_ASN1_INTEGER);
-        if ((u1=BN_bin2bn(bs->data,bs->length,NULL)) == NULL) goto err_bn;
+        if ((BN_bin2bn(bs->data,bs->length,&u1)) == NULL) goto err_bn;
        if (!asn1_Finish(&c)) goto err;
 
        /* Calculate W = inv(S) mod Q
         * save W in u2 */
-       if ((u2=BN_mod_inverse(u1,dsa->q,ctx)) == NULL) goto err_bn;
+       if ((BN_mod_inverse(&u2,&u1,dsa->q,ctx)) == NULL) goto err_bn;
 
        /* save M in u1 */
-       if (BN_bin2bn(dgst,dgst_len,u1) == NULL) goto err_bn;
+       if (BN_bin2bn(dgst,dgst_len,&u1) == NULL) goto err_bn;
 
        /* u1 = M * w mod q */
-       if (!BN_mod_mul(u1,u1,u2,dsa->q,ctx)) goto err_bn;
+       if (!BN_mod_mul(&u1,&u1,&u2,dsa->q,ctx)) goto err_bn;
 
        /* u2 = r * w mod q */
-       if (!BN_mod_mul(u2,r,u2,dsa->q,ctx)) goto err_bn;
+       if (!BN_mod_mul(&u2,&r,&u2,dsa->q,ctx)) goto err_bn;
 
+       if ((dsa->method_mont_p == NULL) && (dsa->flags & DSA_FLAG_CACHE_MONT_P))
+               {
+               if ((dsa->method_mont_p=(char *)BN_MONT_CTX_new()) != NULL)
+                       if (!BN_MONT_CTX_set((BN_MONT_CTX *)dsa->method_mont_p,
+                               dsa->p,ctx)) goto err;
+               }
+       mont=(BN_MONT_CTX *)dsa->method_mont_p;
+
+#if 0
+       {
+       BIGNUM t2;
+
+       BN_init(&t2);
        /* v = ( g^u1 * y^u2 mod p ) mod q */
        /* let t1 = g ^ u1 mod p */
-       if (!BN_mod_exp(t1,dsa->g,u1,dsa->p,ctx)) goto err_bn;
+       if (!BN_mod_exp_mont(&t1,dsa->g,&u1,dsa->p,ctx,mont)) goto err_bn;
        /* let t2 = y ^ u2 mod p */
-       if (!BN_mod_exp(t2,dsa->pub_key,u2,dsa->p,ctx)) goto err_bn;
+       if (!BN_mod_exp_mont(&t2,dsa->pub_key,&u2,dsa->p,ctx,mont)) goto err_bn;
        /* let u1 = t1 * t2 mod p */
-       if (!BN_mod_mul(u1,t1,t2,dsa->p,ctx)) goto err_bn;
+       if (!BN_mod_mul(&u1,&t1,&t2,dsa->p,ctx)) goto err_bn;
+       BN_free(&t2);
+       }
+       /* let u1 = u1 mod q */
+       if (!BN_mod(&u1,&u1,dsa->q,ctx)) goto err_bn;
+#else
+       {
+       if (!BN_mod_exp2_mont(&t1,dsa->g,&u1,dsa->pub_key,&u2,dsa->p,ctx,mont))
+               goto err_bn;
+       /* BN_copy(&u1,&t1); */
        /* let u1 = u1 mod q */
-       if (!BN_mod(u1,u1,dsa->q,ctx)) goto err_bn;
+       if (!BN_mod(&u1,&t1,dsa->q,ctx)) goto err_bn;
+       }
+#endif
        /* V is now in u1.  If the signature is correct, it will be
         * equal to R. */
-       ret=(BN_ucmp(u1, r) == 0);
+       ret=(BN_ucmp(&u1, &r) == 0);
        if (0)
                {
 err: /* ASN1 error */
@@ -142,11 +166,10 @@ err_bn: /* BN error */
                DSAerr(DSA_F_DSA_VERIFY,ERR_R_BN_LIB);
                }
        if (ctx != NULL) BN_CTX_free(ctx);
-       if (r != NULL) BN_free(r);
-       if (t1 != NULL) BN_free(t1);
-       if (t2 != NULL) BN_free(t2);
-       if (u1 != NULL) BN_free(u1);
-       if (u2 != NULL) BN_free(u2);
+       BN_free(&r);
+       BN_free(&u1);
+       BN_free(&u2);
+       BN_free(&t1);
        if (bs != NULL) ASN1_BIT_STRING_free(bs);
        return(ret);
        }
diff --git a/crypto/dsa/f b/crypto/dsa/f
new file mode 100644 (file)
index 0000000..36865a7
--- /dev/null
@@ -0,0 +1,6 @@
+       if ((dsa->method_mod_p == NULL) && (dsa->flags & DSA_FLAG_CACHE_MONT_P))
+               {
+               if ((dsa->method_mod_p=(char *)BN_MONT_CTX_new()) != NULL)
+                       if (!BN_MONT_CTX_set((BN_MONT_CTX *)dsa->method_mod_p,
+                               dsa->p,ctx)) goto err;
+               }
index a65192493af3acab7bc0f2bdd151469ae87a109c..5cf621855acdb52aaa5f61e3657f48e537463867 100644 (file)
@@ -81,6 +81,7 @@ static unsigned long err_hash();
 static int err_cmp();
 static unsigned long pid_hash();
 static int pid_cmp();
+static unsigned long get_error_values();
 static void ERR_STATE_free();
 ERR_STATE *s;
 #endif
@@ -148,6 +149,14 @@ static ERR_STRING_DATA ERR_str_reasons[]=
 {ERR_R_PKCS7_LIB                       ,"PKCS7 lib"},
 {ERR_R_MALLOC_FAILURE                  ,"Malloc failure"},
 {ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED     ,"called a fuction you should not call"},
+{ERR_R_PASSED_NULL_PARAMETER           ,"passed a null parameter"},
+{ERR_R_NESTED_ASN1_ERROR               ,"nested asn1 error"},
+{ERR_R_BAD_ASN1_OBJECT_HEADER          ,"bad asn1 object header"},
+{ERR_R_BAD_GET_ASN1_OBJECT_CALL                ,"bad get asn1 object call"},
+{ERR_R_EXPECTING_AN_ASN1_SEQUENCE      ,"expecting an asn1 sequence"},
+{ERR_R_ASN1_LENGTH_MISMATCH            ,"asn1 length mismatch"},
+{ERR_R_MISSING_ASN1_EOS                        ,"missing asn1 eos"},
+
 {0,NULL},
        };
 #endif
@@ -539,7 +548,9 @@ ERR_STATE *ERR_get_state()
                CRYPTO_w_lock(CRYPTO_LOCK_ERR);
                if (thread_hash == NULL)
                        {
+                       MemCheck_off();
                        thread_hash=lh_new(pid_hash,pid_cmp);
+                       MemCheck_on();
                        CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
                        if (thread_hash == NULL) return(&fallback);
                        }
@@ -618,20 +629,24 @@ VAR_ALIST
        for (i=0; i<num; i++)
                {
                VAR_ARG(args,char *,a);
-               n+=strlen(a);
-               if (n > s)
+               /* ignore NULLs, thanks to Bob Beck <beck@obtuse.com> */
+               if (a != NULL)
                        {
-                       s=n+20;
-                       p=Realloc(str,s+1);
-                       if (p == NULL)
+                       n+=strlen(a);
+                       if (n > s)
                                {
-                               Free(str);
-                               return;
+                               s=n+20;
+                               p=Realloc(str,s+1);
+                               if (p == NULL)
+                                       {
+                                       Free(str);
+                                       return;
+                                       }
+                               else
+                                       str=p;
                                }
-                       else
-                               str=p;
+                       strcat(str,a);
                        }
-               strcat(str,a);
                }
        ERR_set_error_data(str,ERR_TXT_MALLOCED|ERR_TXT_STRING);
 
index 75f931be112539bd552430e078307c9724a6bbed..c81dedd66629f79a70b860b765d91191a54d9eb7 100644 (file)
@@ -192,6 +192,12 @@ typedef struct err_state_st
 #define        ERR_R_MALLOC_FAILURE                    (1|ERR_R_FATAL)
 #define        ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED       (2|ERR_R_FATAL)
 #define        ERR_R_PASSED_NULL_PARAMETER             (3|ERR_R_FATAL)
+#define ERR_R_NESTED_ASN1_ERROR                        (4)
+#define ERR_R_BAD_ASN1_OBJECT_HEADER           (5)
+#define ERR_R_BAD_GET_ASN1_OBJECT_CALL         (6)
+#define ERR_R_EXPECTING_AN_ASN1_SEQUENCE       (7)
+#define ERR_R_ASN1_LENGTH_MISMATCH             (8)
+#define ERR_R_MISSING_ASN1_EOS                 (9)
 
 typedef struct ERR_string_data_st
        {
index d3251da8428939836623a6318b49ce51f6e04cdb..87c6da9a6d58646918c42e638e8cae00582c6024 100644 (file)
@@ -86,8 +86,8 @@ void ERR_load_${type}_strings()
        if (${type}_lib_error_code == 0)
                ${type}_lib_error_code=ERR_get_next_error_library();
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 $str
                }
@@ -113,8 +113,8 @@ void ERR_load_${type}_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 $str
                }
index 10b5dbb59df85fa2ee8884debc309c3e027fde6c..12cb3432a861630b59819eadbb13d097138e0d25 100644 (file)
@@ -20,6 +20,7 @@ L SSL         ../ssl/ssl.err
 L SSL2         ../ssl/ssl2.err
 L SSL3         ../ssl/ssl3.err
 L SSL23                ../ssl/ssl23.err
+L COMP         comp/comp.err
 
 F RSAREF_F_RSA_BN2BIN
 F RSAREF_F_RSA_PRIVATE_DECRYPT
@@ -30,6 +31,8 @@ F RSAREF_F_RSA_PUBLIC_ENCRYPT
 
 R SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE         1010
 R SSL_R_SSLV3_ALERT_BAD_RECORD_MAC             1020
+R SSL_R_TLSV1_ALERT_DECRYPTION_FAILED          1021
+R SSL_R_TLSV1_ALERT_RECORD_OVERFLOW            1022
 R SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE      1030
 R SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE          1040
 R SSL_R_SSLV3_ALERT_NO_CERTIFICATE             1041
@@ -39,6 +42,16 @@ R SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED              1044
 R SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED                1045
 R SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN                1046
 R SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER          1047
+R SSL_R_TLSV1_ALERT_UNKNOWN_CA                 1048
+R SSL_R_TLSV1_ALERT_ACCESS_DENIED              1049
+R SSL_R_TLSV1_ALERT_DECODE_ERROR               1050
+R SSL_R_TLSV1_ALERT_DECRYPT_ERROR              1051
+R SSL_R_TLSV1_ALERT_EXPORT_RESTRICION          1060
+R SSL_R_TLSV1_ALERT_PROTOCOL_VERSION           1070
+R SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY      1071
+R SSL_R_TLSV1_ALERT_INTERNAL_ERROR             1080
+R SSL_R_TLSV1_ALERT_USER_CANCLED               1090
+R SSL_R_TLSV1_ALERT_NO_RENEGOTIATION           1100
 
 R RSAREF_R_CONTENT_ENCODING                    0x0400
 R RSAREF_R_DATA                                        0x0401
diff --git a/crypto/evp/abc.c b/crypto/evp/abc.c
new file mode 100644 (file)
index 0000000..d6cc1e1
--- /dev/null
@@ -0,0 +1,124 @@
+/* lib/evp/evp_err.c */
+/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+#include <stdio.h>
+#include "err.h"
+#include "evp.h"
+
+/* BEGIN ERROR CODES */
+#ifndef NO_ERR
+static ERR_STRING_DATA EVP_str_functs[]=
+       {
+{ERR_PACK(0,EVP_F_D2I_PKEY,0), "D2I_PKEY"},
+{ERR_PACK(0,EVP_F_EVP_DECRYPTFINAL,0), "EVP_DecryptFinal"},
+{ERR_PACK(0,EVP_F_EVP_OPENINIT,0),     "EVP_OpenInit"},
+{ERR_PACK(0,EVP_F_EVP_PKEY_COPY_PARAMETERS,0), "EVP_PKEY_copy_parameters"},
+{ERR_PACK(0,EVP_F_EVP_PKEY_DECRYPT,0), "EVP_PKEY_decrypt"},
+{ERR_PACK(0,EVP_F_EVP_PKEY_ENCRYPT,0), "EVP_PKEY_encrypt"},
+{ERR_PACK(0,EVP_F_EVP_PKEY_NEW,0),     "EVP_PKEY_new"},
+{ERR_PACK(0,EVP_F_EVP_SIGNFINAL,0),    "EVP_SignFinal"},
+{ERR_PACK(0,EVP_F_EVP_VERIFYFINAL,0),  "EVP_VerifyFinal"},
+{0,NULL},
+       };
+
+static ERR_STRING_DATA EVP_str_reasons[]=
+       {
+{EVP_R_BAD_DECRYPT                       ,"bad decrypt"},
+{EVP_R_DIFFERENT_KEY_TYPES               ,"different key types"},
+{EVP_R_IV_TOO_LARGE                      ,"iv too large"},
+{EVP_R_MISSING_PARMATERS                 ,"missing parmaters"},
+{EVP_R_NO_SIGN_FUNCTION_CONFIGURED       ,"no sign function configured"},
+{EVP_R_NO_VERIFY_FUNCTION_CONFIGURED     ,"no verify function configured"},
+{EVP_R_PUBLIC_KEY_NOT_RSA                ,"public key not rsa"},
+{EVP_R_UNSUPPORTED_CIPHER                ,"unsupported cipher"},
+{EVP_R_WRONG_FINAL_BLOCK_LENGTH          ,"wrong final block length"},
+{EVP_R_WRONG_PUBLIC_KEY_TYPE             ,"wrong public key type"},
+{0,NULL},
+       };
+
+#endif
+
+static int EVP_lib_error_code=0;
+
+void ERR_load_EVP_strings()
+       {
+       static int init=1;
+
+       if (EVP_lib_error_code == 0)
+               EVP_lib_error_code=ERR_get_next_error_library();
+
+       if (init);
+               {;
+               init=0;
+#ifndef NO_ERR
+               ERR_load_strings(EVP_lib_error_code,EVP_str_functs);
+               ERR_load_strings(EVP_lib_error_code,EVP_str_reasons);
+#endif
+
+               }
+       }
+
+void ERR_EVP_error(function,reason,file,line)
+int function;
+int reason;
+char *file;
+int line;
+       {
+       if (EVP_lib_error_code == 0)
+               EVP_lib_error_code=ERR_get_next_error_library();
+       ERR_PUT_error(EVP_lib_error_code,function,reason,file,line);
+       }
diff --git a/crypto/evp/abcs.c b/crypto/evp/abcs.c
new file mode 100644 (file)
index 0000000..2b0a0ab
--- /dev/null
@@ -0,0 +1,108 @@
+/* lib/evp/evp_err.c */
+/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+#include <stdio.h>
+#include "err.h"
+#include "evp.h"
+
+/* BEGIN ERROR CODES */
+#ifndef NO_ERR
+static ERR_STRING_DATA EVP_str_functs[]=
+       {
+{ERR_PACK(0,EVP_F_D2I_PKEY,0), "D2I_PKEY"},
+{ERR_PACK(0,EVP_F_EVP_DECRYPTFINAL,0), "EVP_DecryptFinal"},
+{ERR_PACK(0,EVP_F_EVP_OPENINIT,0),     "EVP_OpenInit"},
+{ERR_PACK(0,EVP_F_EVP_PKEY_COPY_PARAMETERS,0), "EVP_PKEY_copy_parameters"},
+{ERR_PACK(0,EVP_F_EVP_PKEY_DECRYPT,0), "EVP_PKEY_decrypt"},
+{ERR_PACK(0,EVP_F_EVP_PKEY_ENCRYPT,0), "EVP_PKEY_encrypt"},
+{ERR_PACK(0,EVP_F_EVP_PKEY_NEW,0),     "EVP_PKEY_new"},
+{ERR_PACK(0,EVP_F_EVP_SIGNFINAL,0),    "EVP_SignFinal"},
+{ERR_PACK(0,EVP_F_EVP_VERIFYFINAL,0),  "EVP_VerifyFinal"},
+{0,NULL},
+       };
+
+static ERR_STRING_DATA EVP_str_reasons[]=
+       {
+{EVP_R_BAD_DECRYPT                       ,"bad decrypt"},
+{EVP_R_DIFFERENT_KEY_TYPES               ,"different key types"},
+{EVP_R_IV_TOO_LARGE                      ,"iv too large"},
+{EVP_R_MISSING_PARMATERS                 ,"missing parmaters"},
+{EVP_R_NO_SIGN_FUNCTION_CONFIGURED       ,"no sign function configured"},
+{EVP_R_NO_VERIFY_FUNCTION_CONFIGURED     ,"no verify function configured"},
+{EVP_R_PUBLIC_KEY_NOT_RSA                ,"public key not rsa"},
+{EVP_R_UNSUPPORTED_CIPHER                ,"unsupported cipher"},
+{EVP_R_WRONG_FINAL_BLOCK_LENGTH          ,"wrong final block length"},
+{EVP_R_WRONG_PUBLIC_KEY_TYPE             ,"wrong public key type"},
+{0,NULL},
+       };
+
+#endif
+
+void ERR_load_EVP_strings()
+       {
+       static int init=1;
+
+       if (init);
+               {;
+               init=0;
+#ifndef NO_ERR
+               ERR_load_strings(ERR_LIB_EVP,EVP_str_functs);
+               ERR_load_strings(ERR_LIB_EVP,EVP_str_reasons);
+#endif
+
+               }
+       }
index 6c30ddfc54bc6ca66420c6c291958102696ff64a..ad09b94b1a186e351f011417ff355ff368d1f579 100644 (file)
@@ -298,6 +298,7 @@ char *ptr;
        BIO_ENC_CTX *ctx,*dctx;
        long ret=1;
        int i;
+       EVP_CIPHER_CTX **c_ctx;
 
        ctx=(BIO_ENC_CTX *)b->ptr;
 
@@ -364,7 +365,11 @@ again:
                ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
                BIO_copy_next_retry(b);
                break;
-
+       case BIO_C_GET_CIPHER_CTX:
+               c_ctx=(EVP_CIPHER_CTX **)ptr;
+               (*c_ctx)= &(ctx->cipher);
+               b->init=1;
+               break;
        case BIO_CTRL_DUP:
                dbio=(BIO *)ptr;
                dctx=(BIO_ENC_CTX *)dbio->ptr;
index e77d1c896b493ffa25e4ac5e3151ebac5992ec56..f2e0500dd379f8cb276df41e5c9082cd5a133736 100644 (file)
@@ -79,16 +79,16 @@ void SSLeay_add_all_ciphers()
        EVP_add_cipher(EVP_des_ede3_ofb());
 
        EVP_add_cipher(EVP_desx_cbc());
-       EVP_add_alias(SN_desx_cbc,"DESX");
-       EVP_add_alias(SN_desx_cbc,"desx");
+       EVP_add_cipher_alias(SN_desx_cbc,"DESX");
+       EVP_add_cipher_alias(SN_desx_cbc,"desx");
 
        EVP_add_cipher(EVP_des_cbc());
-       EVP_add_alias(SN_des_cbc,"DES");
-       EVP_add_alias(SN_des_cbc,"des");
+       EVP_add_cipher_alias(SN_des_cbc,"DES");
+       EVP_add_cipher_alias(SN_des_cbc,"des");
        EVP_add_cipher(EVP_des_ede_cbc());
        EVP_add_cipher(EVP_des_ede3_cbc());
-       EVP_add_alias(SN_des_ede3_cbc,"DES3");
-       EVP_add_alias(SN_des_ede3_cbc,"des3");
+       EVP_add_cipher_alias(SN_des_ede3_cbc,"DES3");
+       EVP_add_cipher_alias(SN_des_ede3_cbc,"des3");
 
        EVP_add_cipher(EVP_des_ecb());
        EVP_add_cipher(EVP_des_ede());
@@ -105,8 +105,8 @@ void SSLeay_add_all_ciphers()
        EVP_add_cipher(EVP_idea_cfb());
        EVP_add_cipher(EVP_idea_ofb());
        EVP_add_cipher(EVP_idea_cbc());
-       EVP_add_alias(SN_idea_cbc,"IDEA");
-       EVP_add_alias(SN_idea_cbc,"idea");
+       EVP_add_cipher_alias(SN_idea_cbc,"IDEA");
+       EVP_add_cipher_alias(SN_idea_cbc,"idea");
 #endif
 
 #ifndef NO_RC2
@@ -115,8 +115,9 @@ void SSLeay_add_all_ciphers()
        EVP_add_cipher(EVP_rc2_ofb());
        EVP_add_cipher(EVP_rc2_cbc());
        EVP_add_cipher(EVP_rc2_40_cbc());
-       EVP_add_alias(SN_rc2_cbc,"RC2");
-       EVP_add_alias(SN_rc2_cbc,"rc2");
+       EVP_add_cipher(EVP_rc2_64_cbc());
+       EVP_add_cipher_alias(SN_rc2_cbc,"RC2");
+       EVP_add_cipher_alias(SN_rc2_cbc,"rc2");
 #endif
 
 #ifndef NO_BLOWFISH
@@ -124,9 +125,9 @@ void SSLeay_add_all_ciphers()
        EVP_add_cipher(EVP_bf_cfb());
        EVP_add_cipher(EVP_bf_ofb());
        EVP_add_cipher(EVP_bf_cbc());
-       EVP_add_alias(SN_bf_cbc,"BF");
-       EVP_add_alias(SN_bf_cbc,"bf");
-       EVP_add_alias(SN_bf_cbc,"blowfish");
+       EVP_add_cipher_alias(SN_bf_cbc,"BF");
+       EVP_add_cipher_alias(SN_bf_cbc,"bf");
+       EVP_add_cipher_alias(SN_bf_cbc,"blowfish");
 #endif
 
 #ifndef NO_CAST
@@ -134,10 +135,10 @@ void SSLeay_add_all_ciphers()
        EVP_add_cipher(EVP_cast5_cfb());
        EVP_add_cipher(EVP_cast5_ofb());
        EVP_add_cipher(EVP_cast5_cbc());
-       EVP_add_alias(SN_cast5_cbc,"CAST");
-       EVP_add_alias(SN_cast5_cbc,"cast");
-       EVP_add_alias(SN_cast5_cbc,"CAST-cbc");
-       EVP_add_alias(SN_cast5_cbc,"cast-cbc");
+       EVP_add_cipher_alias(SN_cast5_cbc,"CAST");
+       EVP_add_cipher_alias(SN_cast5_cbc,"cast");
+       EVP_add_cipher_alias(SN_cast5_cbc,"CAST-cbc");
+       EVP_add_cipher_alias(SN_cast5_cbc,"cast-cbc");
 #endif
 
 #ifndef NO_RC5
@@ -145,10 +146,8 @@ void SSLeay_add_all_ciphers()
        EVP_add_cipher(EVP_rc5_32_12_16_cfb());
        EVP_add_cipher(EVP_rc5_32_12_16_ofb());
        EVP_add_cipher(EVP_rc5_32_12_16_cbc());
-       EVP_add_alias(SN_rc5_cbc,"rc5");
-       EVP_add_alias(SN_rc5_cbc,"RC5");
-       EVP_add_alias(SN_rc5_cbc,"rc5-cbc");
-       EVP_add_alias(SN_rc5_cbc,"RC5-cbc");
+       EVP_add_cipher_alias(SN_rc5_cbc,"rc5");
+       EVP_add_cipher_alias(SN_rc5_cbc,"RC5");
 #endif
        }
 
@@ -160,8 +159,8 @@ void SSLeay_add_all_digests()
 #endif
 #ifndef NO_MD5
        EVP_add_digest(EVP_md5());
-       EVP_add_alias(SN_md5,"ssl2-md5");
-       EVP_add_alias(SN_md5,"ssl3-md5");
+       EVP_add_digest_alias(SN_md5,"ssl2-md5");
+       EVP_add_digest_alias(SN_md5,"ssl3-md5");
 #endif
 #ifndef NO_SHA
        EVP_add_digest(EVP_sha());
@@ -171,20 +170,21 @@ void SSLeay_add_all_digests()
 #endif
 #ifndef NO_SHA1
        EVP_add_digest(EVP_sha1());
-       EVP_add_alias(SN_sha1,"ssl3-sha1");
+       EVP_add_digest_alias(SN_sha1,"ssl3-sha1");
+       EVP_add_digest_alias(SN_sha1WithRSAEncryption,SN_sha1WithRSA);
 #ifndef NO_DSA
        EVP_add_digest(EVP_dss1());
-       EVP_add_alias(SN_dsaWithSHA1,SN_dsaWithSHA1_2);
-       EVP_add_alias(SN_dsaWithSHA1,"DSS1");
-       EVP_add_alias(SN_dsaWithSHA1,"dss1");
+       EVP_add_digest_alias(SN_dsaWithSHA1,SN_dsaWithSHA1_2);
+       EVP_add_digest_alias(SN_dsaWithSHA1,"DSS1");
+       EVP_add_digest_alias(SN_dsaWithSHA1,"dss1");
 #endif
 #endif
 #if !defined(NO_MDC2) && !defined(NO_DES)
        EVP_add_digest(EVP_mdc2());
 #endif
-#ifndef NO_RIPEMD160
+#ifndef NO_RMD160
        EVP_add_digest(EVP_ripemd160());
-       EVP_add_alias(SN_ripemd160,"ripemd");
-       EVP_add_alias(SN_ripemd160,"rmd160");
+       EVP_add_digest_alias(SN_ripemd160,"ripemd");
+       EVP_add_digest_alias(SN_ripemd160,"rmd160");
 #endif
        }
index 4f8002f16d10a127b9a8ca16c53c67518bfc5dac..9175e53550891d6d0448d3d6251e54039f83bf0d 100644 (file)
@@ -68,11 +68,25 @@ static void rc2_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        unsigned char *iv,int enc);
 static void rc2_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
        unsigned char *in, unsigned int inl);
+static int rc2_meth_to_magic(EVP_CIPHER *e);
+static EVP_CIPHER *rc2_magic_to_meth(int i);
+static int rc2_set_asn1_type_and_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type);
+static int rc2_get_asn1_type_and_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type);
+
 #else
+
 static void rc2_cbc_init_key();
 static void rc2_cbc_cipher();
+static int rc2_meth_to_magic();
+static EVP_CIPHER *rc2_magic_to_meth();
+static int rc2_set_asn1_type_and_iv();
+static int rc2_get_asn1_type_and_iv();
 #endif
 
+#define RC2_40_MAGIC   0xa0
+#define RC2_64_MAGIC   0x78
+#define RC2_128_MAGIC  0x3a
+
 static EVP_CIPHER r2_cbc_cipher=
        {
        NID_rc2_cbc,
@@ -82,8 +96,21 @@ static EVP_CIPHER r2_cbc_cipher=
        NULL,
        sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
                sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc2_ks)),
-       EVP_CIPHER_get_asn1_iv,
-       EVP_CIPHER_set_asn1_iv,
+       rc2_set_asn1_type_and_iv,
+       rc2_get_asn1_type_and_iv,
+       };
+
+static EVP_CIPHER r2_64_cbc_cipher=
+       {
+       NID_rc2_40_cbc,
+       8,8 /* 64 bit */,8,
+       rc2_cbc_init_key,
+       rc2_cbc_cipher,
+       NULL,
+       sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
+               sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc2_ks)),
+       rc2_set_asn1_type_and_iv,
+       rc2_get_asn1_type_and_iv,
        };
 
 static EVP_CIPHER r2_40_cbc_cipher=
@@ -95,6 +122,8 @@ static EVP_CIPHER r2_40_cbc_cipher=
        NULL,
        sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
                sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc2_ks)),
+       rc2_set_asn1_type_and_iv,
+       rc2_get_asn1_type_and_iv,
        };
 
 EVP_CIPHER *EVP_rc2_cbc()
@@ -102,6 +131,11 @@ EVP_CIPHER *EVP_rc2_cbc()
        return(&r2_cbc_cipher);
        }
 
+EVP_CIPHER *EVP_rc2_64_cbc()
+       {
+       return(&r2_64_cbc_cipher);
+       }
+
 EVP_CIPHER *EVP_rc2_40_cbc()
        {
        return(&r2_40_cbc_cipher);
@@ -133,4 +167,73 @@ unsigned int inl;
                ctx->encrypt);
        }
 
+static int rc2_meth_to_magic(e)
+EVP_CIPHER *e;
+       {
+       int i;
+
+       i=EVP_CIPHER_key_length(e);
+       if      (i == 128) return(RC2_128_MAGIC);
+       else if (i == 64)  return(RC2_64_MAGIC);
+       else if (i == 40)  return(RC2_40_MAGIC);
+       else return(0);
+       }
+
+static EVP_CIPHER *rc2_magic_to_meth(i)
+int i;
+       {
+       if      (i == RC2_128_MAGIC) return(EVP_rc2_cbc());
+       else if (i == RC2_64_MAGIC)  return(EVP_rc2_64_cbc());
+       else if (i == RC2_40_MAGIC)  return(EVP_rc2_40_cbc());
+       else
+               {
+               EVPerr(EVP_F_RC2_MAGIC_TO_METH,EVP_R_UNSUPPORTED_KEY_SIZE);
+               return(NULL);
+               }
+       }
+
+int rc2_get_asn1_type_and_iv(c,type)
+EVP_CIPHER_CTX *c;
+ASN1_TYPE *type;
+       {
+       long num=0;
+       int i=0,l;
+       EVP_CIPHER *e;
+
+       if (type != NULL)
+               {
+               l=EVP_CIPHER_CTX_iv_length(c);
+               i=ASN1_TYPE_get_int_octetstring(type,&num,c->oiv,l);
+               if (i != l)
+                       return(-1);
+               else if (i > 0)
+                       memcpy(c->iv,c->oiv,l);
+               e=rc2_magic_to_meth((int)num);
+               if (e == NULL)
+                       return(-1);
+               if (e != EVP_CIPHER_CTX_cipher(c))
+                       {
+                       EVP_CIPHER_CTX_cipher(c)=e;
+                       rc2_cbc_init_key(c,NULL,NULL,1);
+                       }
+               }
+       return(i);
+       }
+
+static int rc2_set_asn1_type_and_iv(c,type)
+EVP_CIPHER_CTX *c;
+ASN1_TYPE *type;
+       {
+       long num;
+       int i=0,j;
+
+       if (type != NULL)
+               {
+               num=rc2_meth_to_magic(EVP_CIPHER_CTX_cipher(c));
+               j=EVP_CIPHER_CTX_iv_length(c);
+               i=ASN1_TYPE_set_int_octetstring(type,num,c->oiv,j);
+               }
+       return(i);
+       }
+
 #endif
index af5a39d1f4ab3b95a871e7dd7102c54771fbf742..849be7e63889136daf17ae9e58d7804c6ac657e4 100644 (file)
@@ -103,8 +103,8 @@ int enc;
                memcpy(&(ctx->oiv[0]),iv,8);
        memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
        if (key != NULL)
-               RC2_set_key(&(ctx->c.rc2_ks),EVP_RC2_KEY_SIZE,key,
-                       EVP_RC2_KEY_SIZE*8);
+               RC2_set_key(&(ctx->c.rc2_ks),EVP_CIPHER_CTX_key_length(ctx),
+                       key,EVP_CIPHER_CTX_key_length(ctx)*8);
        }
 
 static void rc2_cfb_cipher(ctx,out,in,inl)
index e35b06dc6d7b8b4458cb4cfc68cbde8e5b9dd680..4e74af96bdef8fd83b4e8746399588310db5a614 100644 (file)
@@ -98,8 +98,8 @@ unsigned char *iv;
 int enc;
        {
        if (key != NULL)
-               RC2_set_key(&(ctx->c.rc2_ks),EVP_RC2_KEY_SIZE,key,
-                       EVP_RC2_KEY_SIZE*8);
+               RC2_set_key(&(ctx->c.rc2_ks),EVP_CIPHER_CTX_key_length(ctx),
+                       key,EVP_CIPHER_CTX_key_length(ctx)*8);
        }
 
 static void rc2_ecb_cipher(ctx,out,in,inl)
index 0f6d7299883efd7c92a183f9758a9df365d79efa..4ed67eacd5357c3f58612b1ff7c7b2dc4e1ea6eb 100644 (file)
@@ -103,8 +103,8 @@ int enc;
                memcpy(&(ctx->oiv[0]),iv,8);
        memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
        if (key != NULL)
-               RC2_set_key(&(ctx->c.rc2_ks),EVP_RC2_KEY_SIZE,key,
-                       EVP_RC2_KEY_SIZE*8);
+               RC2_set_key(&(ctx->c.rc2_ks),EVP_CIPHER_CTX_key_length(ctx),
+                       key,EVP_CIPHER_CTX_key_length(ctx)*8);
        }
 
 static void rc2_ofb_cipher(ctx,out,in,inl)
index cfc17437bc8fab786daedf10fbba76e2d9a2b2a7..b6ed829482e6e98e23be458a6d1f32d3437acbf6 100644 (file)
@@ -10,6 +10,7 @@
 #define EVP_F_EVP_PKEY_NEW                              106
 #define EVP_F_EVP_SIGNFINAL                             107
 #define EVP_F_EVP_VERIFYFINAL                           108
+#define EVP_F_RC2_MAGIC_TO_METH                                 109
 
 /* Reason codes. */
 #define EVP_R_BAD_DECRYPT                               100
@@ -20,5 +21,6 @@
 #define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED             105
 #define EVP_R_PUBLIC_KEY_NOT_RSA                        106
 #define EVP_R_UNSUPPORTED_CIPHER                        107
-#define EVP_R_WRONG_FINAL_BLOCK_LENGTH                  108
-#define EVP_R_WRONG_PUBLIC_KEY_TYPE                     109
+#define EVP_R_UNSUPPORTED_KEY_SIZE                      108
+#define EVP_R_WRONG_FINAL_BLOCK_LENGTH                  109
+#define EVP_R_WRONG_PUBLIC_KEY_TYPE                     110
index b39fad93a4e265880b27d51c531ab08cbd33fe6e..e6296ce8340c7d74f76c80d162f455464e5f17dc 100644 (file)
@@ -72,7 +72,7 @@ extern "C" {
 #if !defined(NO_SHA) || !defined(NO_SHA1)
 #include "sha.h"
 #endif
-#ifndef NO_RIPEMD
+#ifndef NO_RMD160
 #include "ripemd.h"
 #endif
 #ifndef NO_DES
@@ -183,7 +183,7 @@ typedef struct evp_pkey_st
  * This is required because for various smart-card perform the digest and
  * signing/verification on-board.  To handle this case, the specific
  * EVP_MD and EVP_PKEY_METHODs need to be closely associated.
- * When a PKEY is created, it will have a EVP_PKEY_METHOD ossociated with it.
+ * When a PKEY is created, it will have a EVP_PKEY_METHOD associated with it.
  * This can either be software or a token to provide the required low level
  * routines.
  */
@@ -296,7 +296,7 @@ typedef struct env_md_ctx_st
 #ifndef NO_MD5
                MD5_CTX md5;
 #endif
-#ifndef NO_MD5
+#ifndef NO_RMD160
                RIPEMD160_CTX ripemd160;
 #endif
 #if !defined(NO_SHA) || !defined(NO_SHA1)
@@ -445,9 +445,19 @@ typedef struct evp_Encode_Ctx_st
 #define BIO_get_md(b,mdp)              BIO_ctrl(b,BIO_C_GET_MD,0,(char *)mdp)
 #define BIO_get_md_ctx(b,mdcp)     BIO_ctrl(b,BIO_C_GET_MD_CTX,0,(char *)mdcp)
 #define BIO_get_cipher_status(b)       BIO_ctrl(b,BIO_C_GET_CIPHER_STATUS,0,NULL)
+#define BIO_get_cipher_ctx(b,c_pp)     BIO_ctrl(b,BIO_C_GET_CIPHER_CTX,0,(char *)c_pp)
 
 #define        EVP_Cipher(c,o,i,l)     (c)->cipher->do_cipher((c),(o),(i),(l))
 
+#define EVP_add_cipher_alias(n,alias) \
+       OBJ_NAME_add((alias),OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS,(n))
+#define EVP_add_digest_alias(n,alias) \
+       OBJ_NAME_add((alias),OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,(n))
+#define EVP_delete_cipher_alias(alias) \
+       OBJ_NAME_remove(alias,OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS);
+#define EVP_delete_digest_alias(alias) \
+       OBJ_NAME_remove(alias,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS);
+
 #ifndef NOPROTO
 
 void   EVP_DigestInit(EVP_MD_CTX *ctx, EVP_MD *type);
@@ -556,6 +566,7 @@ EVP_CIPHER *EVP_idea_cbc(void);
 EVP_CIPHER *EVP_rc2_ecb(void);
 EVP_CIPHER *EVP_rc2_cbc(void);
 EVP_CIPHER *EVP_rc2_40_cbc(void);
+EVP_CIPHER *EVP_rc2_64_cbc(void);
 EVP_CIPHER *EVP_rc2_cfb(void);
 EVP_CIPHER *EVP_rc2_ofb(void);
 EVP_CIPHER *EVP_bf_ecb(void);
@@ -577,8 +588,6 @@ void SSLeay_add_all_digests(void);
 
 int EVP_add_cipher(EVP_CIPHER *cipher);
 int EVP_add_digest(EVP_MD *digest);
-int EVP_add_alias(char *name,char *alias);
-int EVP_delete_alias(char *name);
 
 EVP_CIPHER *EVP_get_cipherbyname(char *name);
 EVP_MD *EVP_get_digestbyname(char *name);
@@ -705,6 +714,7 @@ EVP_CIPHER *EVP_idea_cbc();
 EVP_CIPHER *EVP_rc2_ecb();
 EVP_CIPHER *EVP_rc2_cbc();
 EVP_CIPHER *EVP_rc2_40_cbc();
+EVP_CIPHER *EVP_rc2_64_cbc();
 EVP_CIPHER *EVP_rc2_cfb();
 EVP_CIPHER *EVP_rc2_ofb();
 EVP_CIPHER *EVP_bf_ecb();
@@ -726,8 +736,6 @@ void SSLeay_add_all_digests();
 
 int EVP_add_cipher();
 int EVP_add_digest();
-int EVP_add_alias();
-int EVP_delete_alias();
 
 EVP_CIPHER *EVP_get_cipherbyname();
 EVP_MD *EVP_get_digestbyname();
@@ -773,6 +781,7 @@ int EVP_CIPHER_get_asn1_iv();
 #define EVP_F_EVP_PKEY_NEW                              106
 #define EVP_F_EVP_SIGNFINAL                             107
 #define EVP_F_EVP_VERIFYFINAL                           108
+#define EVP_F_RC2_MAGIC_TO_METH                                 109
 
 /* Reason codes. */
 #define EVP_R_BAD_DECRYPT                               100
@@ -783,8 +792,9 @@ int EVP_CIPHER_get_asn1_iv();
 #define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED             105
 #define EVP_R_PUBLIC_KEY_NOT_RSA                        106
 #define EVP_R_UNSUPPORTED_CIPHER                        107
-#define EVP_R_WRONG_FINAL_BLOCK_LENGTH                  108
-#define EVP_R_WRONG_PUBLIC_KEY_TYPE                     109
+#define EVP_R_UNSUPPORTED_KEY_SIZE                      108
+#define EVP_R_WRONG_FINAL_BLOCK_LENGTH                  109
+#define EVP_R_WRONG_PUBLIC_KEY_TYPE                     110
  
 #ifdef  __cplusplus
 }
index 93cc3a9464ea4329776415364bae9c6667734b74..ea580b1df3700a88cdc456cbbc5a379bcb4b942c 100644 (file)
@@ -60,7 +60,7 @@
 #include "cryptlib.h"
 #include "evp.h"
 
-char *EVP_version="EVP part of SSLeay 0.9.0b 29-Jun-1998";
+char *EVP_version="EVP part of SSLeay 0.9.1a 06-Jul-1998";
 
 void EVP_CIPHER_CTX_init(ctx)
 EVP_CIPHER_CTX *ctx;
index 2b0a0ab93f4735c987711906af644ae816bd6a7d..c7caa3b13bdef37dd294c8484eb3372aa8ffdf92 100644 (file)
@@ -72,6 +72,7 @@ static ERR_STRING_DATA EVP_str_functs[]=
 {ERR_PACK(0,EVP_F_EVP_PKEY_NEW,0),     "EVP_PKEY_new"},
 {ERR_PACK(0,EVP_F_EVP_SIGNFINAL,0),    "EVP_SignFinal"},
 {ERR_PACK(0,EVP_F_EVP_VERIFYFINAL,0),  "EVP_VerifyFinal"},
+{ERR_PACK(0,EVP_F_RC2_MAGIC_TO_METH,0),        "RC2_MAGIC_TO_METH"},
 {0,NULL},
        };
 
@@ -85,6 +86,7 @@ static ERR_STRING_DATA EVP_str_reasons[]=
 {EVP_R_NO_VERIFY_FUNCTION_CONFIGURED     ,"no verify function configured"},
 {EVP_R_PUBLIC_KEY_NOT_RSA                ,"public key not rsa"},
 {EVP_R_UNSUPPORTED_CIPHER                ,"unsupported cipher"},
+{EVP_R_UNSUPPORTED_KEY_SIZE              ,"unsupported key size"},
 {EVP_R_WRONG_FINAL_BLOCK_LENGTH          ,"wrong final block length"},
 {EVP_R_WRONG_PUBLIC_KEY_TYPE             ,"wrong public key type"},
 {0,NULL},
@@ -96,8 +98,8 @@ void ERR_load_EVP_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_EVP,EVP_str_functs);
index 69784eb5554019757912c64b9f1d95d7b223de3d..729fc8f4e6ab669411e5672051eae3ddd9778c54 100644 (file)
@@ -97,7 +97,10 @@ ASN1_TYPE *type;
                {
                l=EVP_CIPHER_CTX_iv_length(c);
                i=ASN1_TYPE_get_octetstring(type,c->oiv,l);
-               memcpy(c->iv,c->oiv,l);
+               if (i != l)
+                       return(-1);
+               else if (i > 0)
+                       memcpy(c->iv,c->oiv,l);
                }
        return(i);
        }
index e0774da20d15031981b56a8dd052d79f616b6bfb..4cc715606e154995f3ca352d91495706c60dd73a 100644 (file)
 #include "evp.h"
 #include "objects.h"
 
-typedef struct aliases_st {
-       char *alias;
-       /* This must be the last field becaue I will allocate things
-        * so they go off the end of it */
-       char name[4];
-       } ALIASES;
-
-static STACK /* ALIASES */ *aliases=NULL;
-static STACK /* EVP_CIPHERS */ *ciphers=NULL;
-static STACK /* EVP_MD */ *digests=NULL;
-
-static int cipher_nid_cmp(a,b)
-EVP_CIPHER **a,**b;
-       { return((*a)->nid - (*b)->nid); }
-
-static int digest_type_cmp(a,b)
-EVP_MD **a,**b;
-       { return((*a)->pkey_type - (*b)->pkey_type); }
-
 int EVP_add_cipher(c)
 EVP_CIPHER *c;
        {
-       int i;
+       int r;
 
-       if (ciphers == NULL)
-               {
-               ciphers=sk_new(cipher_nid_cmp);
-               if (ciphers == NULL) return(0);
-               }
-       if ((i=sk_find(ciphers,(char *)c)) >= 0)
-               {
-               if (sk_value(ciphers,i) == (char *)c)
-                       return(1);
-               sk_delete(ciphers,i);
-               }
-       return(sk_push(ciphers,(char *)c));
+       r=OBJ_NAME_add(OBJ_nid2sn(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(char *)c);
+       if (r == 0) return(0);
+       r=OBJ_NAME_add(OBJ_nid2ln(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(char *)c);
+       return(r);
        }
 
 int EVP_add_digest(md)
 EVP_MD *md;
        {
-       int i;
-       char *n;
+       int r;
+       char *name;
 
-       if (digests == NULL)
-               {
-               digests=sk_new(digest_type_cmp);
-               if (digests == NULL) return(0);
-               }
-       if ((i=sk_find(digests,(char *)md)) >= 0)
-               {
-               if (sk_value(digests,i) == (char *)md)
-                       return(1);
-               sk_delete(digests,i);
-               }
-       if (md->type != md->pkey_type)
-               {
-               n=OBJ_nid2sn(md->pkey_type);
-               EVP_add_alias(n,OBJ_nid2sn(md->type));
-               EVP_add_alias(n,OBJ_nid2ln(md->type));
-               }
-       sk_push(digests,(char *)md);
-       return(1);
-       }
-
-static int alias_cmp(a,b)
-ALIASES **a,**b;
-       {
-       return(strcmp((*a)->alias,(*b)->alias));
-       }
+       name=OBJ_nid2sn(md->type);
+       r=OBJ_NAME_add(name,OBJ_NAME_TYPE_MD_METH,(char *)md);
+       if (r == 0) return(0);
+       r=OBJ_NAME_add(OBJ_nid2ln(md->type),OBJ_NAME_TYPE_MD_METH,(char *)md);
+       if (r == 0) return(0);
 
-int EVP_add_alias(name,aname)
-char *name;
-char *aname;
-       {
-       int l1,l2,i;
-       ALIASES *a;
-       char *p;
-
-       if ((name == NULL) || (aname == NULL)) return(0);
-       l1=strlen(name)+1;
-       l2=strlen(aname)+1;
-       i=sizeof(ALIASES)+l1+l2;
-       if ((a=(ALIASES *)Malloc(i)) == NULL)
-               return(0);
-       strcpy(a->name,name);
-       p= &(a->name[l1]);
-       strcpy(p,aname);
-       a->alias=p;
-
-       if (aliases == NULL)
-               {
-               aliases=sk_new(alias_cmp);
-               if (aliases == NULL) goto err;
-               }
-
-       if ((i=sk_find(aliases,(char *)a)) >= 0)
-               {
-               Free(sk_delete(aliases,i));
-               }
-       if (!sk_push(aliases,(char *)a)) goto err;
-       return(1);
-err:
-       return(0);
-       }
-
-int EVP_delete_alias(name)
-char *name;
-       {
-       ALIASES a;
-       int i;
-
-       if (aliases != NULL)
+       if (md->type != md->pkey_type)
                {
-               a.alias=name;
-               if ((i=sk_find(aliases,(char *)&a)) >= 0)
-                       {
-                       Free(sk_delete(aliases,i));
-                       return(1);
-                       }
+               r=OBJ_NAME_add(OBJ_nid2sn(md->pkey_type),
+                       OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name);
+               if (r == 0) return(0);
+               r=OBJ_NAME_add(OBJ_nid2ln(md->pkey_type),
+                       OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name);
                }
-       return(0);
+       return(r);
        }
 
 EVP_CIPHER *EVP_get_cipherbyname(name)
 char *name;
        {
-       int nid,num=6,i;
-       EVP_CIPHER c,*cp;
-       ALIASES a,*ap;
+       EVP_CIPHER *cp;
 
-       if (ciphers == NULL) return(NULL);
-       for (;;)
-               {
-               if (num-- <= 0) return(NULL);
-               if (aliases != NULL)
-                       {
-                       a.alias=name;
-                       i=sk_find(aliases,(char *)&a);
-                       if (i >= 0)
-                               {
-                               ap=(ALIASES *)sk_value(aliases,i);
-                               name=ap->name;
-                               continue;
-                               }
-                       }
-
-               nid=OBJ_txt2nid(name);
-               if (nid == NID_undef) return(NULL);
-               c.nid=nid;
-               i=sk_find(ciphers,(char *)&c);
-               if (i >= 0)
-                       {
-                       cp=(EVP_CIPHER *)sk_value(ciphers,i);
-                       return(cp);
-                       }
-               else
-                       return(NULL);
-               }
+       cp=(EVP_CIPHER *)OBJ_NAME_get(name,OBJ_NAME_TYPE_CIPHER_METH);
+       return(cp);
        }
 
 EVP_MD *EVP_get_digestbyname(name)
 char *name;
        {
-       int nid,num=6,i;
-       EVP_MD c,*cp;
-       ALIASES a,*ap;
+       EVP_MD *cp;
 
-       if (digests == NULL) return(NULL);
-
-       for (;;)
-               {
-               if (num-- <= 0) return(NULL);
-
-               if (aliases != NULL)
-                       {
-                       a.alias=name;
-                       i=sk_find(aliases,(char *)&a);
-                       if (i >= 0)
-                               {
-                               ap=(ALIASES *)sk_value(aliases,i);
-                               name=ap->name;
-                               continue;
-                               }
-                       }
-
-               nid=OBJ_txt2nid(name);
-               if (nid == NID_undef) return(NULL);
-               c.pkey_type=nid;
-               i=sk_find(digests,(char *)&c);
-               if (i >= 0)
-                       {
-                       cp=(EVP_MD *)sk_value(digests,i);
-                       return(cp);
-                       }
-               else
-                       return(NULL);
-               }
+       cp=(EVP_MD *)OBJ_NAME_get(name,OBJ_NAME_TYPE_MD_METH);
+       return(cp);
        }
 
 void EVP_cleanup()
        {
-       int i;
-
-       if (aliases != NULL)
-               {
-               for (i=0; i<sk_num(aliases); i++)
-                       Free(sk_value(aliases,i));
-               sk_free(aliases);
-               aliases=NULL;
-               }
-       if (ciphers != NULL)
-               {
-               sk_free(ciphers);
-               ciphers=NULL;
-               }
-       if (digests != NULL)
-               {
-               sk_free(digests);
-               digests=NULL;
-               }
+       OBJ_NAME_cleanup(OBJ_NAME_TYPE_CIPHER_METH);
+       OBJ_NAME_cleanup(OBJ_NAME_TYPE_MD_METH);
        }
index 395351b3733f7f1658cd6bf78c46dc3bf2c45dc9..581df867da853c5f1c205d24754116d19dcd9ad1 100644 (file)
@@ -90,6 +90,8 @@ EVP_PKEY *pkey;
 int EVP_PKEY_size(pkey)
 EVP_PKEY *pkey;
        {
+       if (pkey == NULL)
+               return(0);
 #ifndef NO_RSA
        if (pkey->type == EVP_PKEY_RSA)
                return(RSA_size(pkey->pkey.rsa));
index c858b518ffaed0ece67ed736fe4e8ed4fce78c7d..42b8b9d1baeabc99b58b52f9932807027740c07e 100644 (file)
@@ -72,20 +72,22 @@ int (*new_func)();
 int (*dup_func)();
 void (*free_func)();
        {
+       int ret= -1;
        CRYPTO_EX_DATA_FUNCS *a;
 
+       MemCheck_off();
        if (*skp == NULL)
                *skp=sk_new_null();
        if (*skp == NULL)
                {
                CRYPTOerr(CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX,ERR_R_MALLOC_FAILURE);
-               return(-1);
+               goto err;
                }
        a=(CRYPTO_EX_DATA_FUNCS *)Malloc(sizeof(CRYPTO_EX_DATA_FUNCS));
        if (a == NULL)
                {
                CRYPTOerr(CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX,ERR_R_MALLOC_FAILURE);
-               return(-1);
+               goto err;
                }
        a->argl=argl;
        a->argp=argp;
@@ -98,10 +100,13 @@ void (*free_func)();
                        {
                        CRYPTOerr(CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX,ERR_R_MALLOC_FAILURE);
                        Free(a);
-                       return(-1);
+                       goto err;
                        }
                }
        sk_value(*skp,idx)=(char *)a;
+       ret=idx;
+err:
+       MemCheck_on();
        return(idx);
        }
 
index 6721126db15a16b3b74c7d63cdd830d4700b7bef..5d5f8e032597e1ff0d8474663b6a1157e36b76f1 100644 (file)
@@ -59,7 +59,7 @@
 #include "idea.h"
 #include "idea_lcl.h"
 
-char *IDEA_version="IDEA part of SSLeay 0.9.0b 29-Jun-1998";
+char *IDEA_version="IDEA part of SSLeay 0.9.1a 06-Jul-1998";
 
 char *idea_options()
        {
index 4b3eec512319a655f803634ec04dee7f1b8d1839..98060d9b8c2af80ee473cb556be5e08b08f821dd 100644 (file)
@@ -92,7 +92,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
index 6dfb5c9ccc824cc3d4c5f2ccc38e1111ef311ddb..97006c4499238f81f6b95cf5aac0d672f753f147 100644 (file)
  * [including the GNU Public Licence.]
  */
 
-char *lh_version="lhash part of SSLeay 0.9.0b 29-Jun-1998";
+char *lh_version="lhash part of SSLeay 0.9.1a 06-Jul-1998";
 
 /* Code for dynamic hash table routines
  * Author - Eric Young v 2.0
  *
+ * 2.2 eay - added #include "crypto.h" so the memory leak checking code is
+ *          present. eay 18-Jun-98
+ *
+ * 2.1 eay - Added an 'error in last operation' flag. eay 6-May-98
+ *
  * 2.0 eay - Fixed a bug that occured when using lh_delete
  *          from inside lh_doall().  As entries were deleted,
  *          the 'table' was 'contract()ed', making some entries
@@ -94,6 +99,7 @@ char *lh_version="lhash part of SSLeay 0.9.0b 29-Jun-1998";
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include "crypto.h"
 #include "lhash.h"
 
 #undef MIN_NODES 
@@ -126,9 +132,9 @@ int (*c)();
        LHASH *ret;
        int i;
 
-       if ((ret=(LHASH *)malloc(sizeof(LHASH))) == NULL)
+       if ((ret=(LHASH *)Malloc(sizeof(LHASH))) == NULL)
                goto err0;
-       if ((ret->b=(LHASH_NODE **)malloc(sizeof(LHASH_NODE *)*MIN_NODES)) == NULL)
+       if ((ret->b=(LHASH_NODE **)Malloc(sizeof(LHASH_NODE *)*MIN_NODES)) == NULL)
                goto err1;
        for (i=0; i<MIN_NODES; i++)
                ret->b[i]=NULL;
@@ -156,9 +162,10 @@ int (*c)();
        ret->num_retrieve_miss=0;
        ret->num_hash_comps=0;
 
+       ret->error=0;
        return(ret);
 err1:
-       free((char *)ret);
+       Free((char *)ret);
 err0:
        return(NULL);
        }
@@ -175,12 +182,12 @@ LHASH *lh;
                while (n != NULL)
                        {
                        nn=n->next;
-                       free(n);
+                       Free(n);
                        n=nn;
                        }
                }
-       free((char *)lh->b);
-       free((char *)lh);
+       Free((char *)lh->b);
+       Free((char *)lh);
        }
 
 char *lh_insert(lh, data)
@@ -191,6 +198,7 @@ char *data;
        LHASH_NODE *nn,**rn;
        char *ret;
 
+       lh->error=0;
        if (lh->up_load <= (lh->num_items*LH_LOAD_MULT/lh->num_nodes))
                expand(lh);
 
@@ -198,8 +206,11 @@ char *data;
 
        if (*rn == NULL)
                {
-               if ((nn=(LHASH_NODE *)malloc(sizeof(LHASH_NODE))) == NULL)
+               if ((nn=(LHASH_NODE *)Malloc(sizeof(LHASH_NODE))) == NULL)
+                       {
+                       lh->error++;
                        return(NULL);
+                       }
                nn->data=data;
                nn->next=NULL;
 #ifndef NO_HASH_COMP
@@ -227,6 +238,7 @@ char *data;
        LHASH_NODE *nn,**rn;
        char *ret;
 
+       lh->error=0;
        rn=getrn(lh,data,&hash);
 
        if (*rn == NULL)
@@ -239,7 +251,7 @@ char *data;
                nn= *rn;
                *rn=nn->next;
                ret=nn->data;
-               free((char *)nn);
+               Free((char *)nn);
                lh->num_delete++;
                }
 
@@ -259,6 +271,7 @@ char *data;
        LHASH_NODE **rn;
        char *ret;
 
+       lh->error=0;
        rn=getrn(lh,data,&hash);
 
        if (*rn == NULL)
@@ -342,11 +355,12 @@ LHASH *lh;
        if ((lh->p) >= lh->pmax)
                {
                j=(int)lh->num_alloc_nodes*2;
-               n=(LHASH_NODE **)realloc((char *)lh->b,
+               n=(LHASH_NODE **)Realloc((char *)lh->b,
                        (unsigned int)sizeof(LHASH_NODE *)*j);
                if (n == NULL)
                        {
 /*                     fputs("realloc error in lhash",stderr); */
+                       lh->error++;
                        lh->p=0;
                        return;
                        }
@@ -370,11 +384,12 @@ LHASH *lh;
        lh->b[lh->p+lh->pmax-1]=NULL; /* 24/07-92 - eay - weird but :-( */
        if (lh->p == 0)
                {
-               n=(LHASH_NODE **)realloc((char *)lh->b,
+               n=(LHASH_NODE **)Realloc((char *)lh->b,
                        (unsigned int)(sizeof(LHASH_NODE *)*lh->pmax));
                if (n == NULL)
                        {
 /*                     fputs("realloc error in lhash",stderr); */
+                       lh->error++;
                        return;
                        }
                lh->num_contract_reallocs++;
index 70cbc6dfe70aca179f1a2d6fe239751b61716462..06aad873b29f85f1370a7c64ea4dd84bf5048b40 100644 (file)
@@ -102,10 +102,16 @@ typedef struct lhash_st
        unsigned long num_retrieve;
        unsigned long num_retrieve_miss;
        unsigned long num_hash_comps;
+
+       int error;
        } LHASH;
 
 #define LH_LOAD_MULT   256
 
+/* Indicates a malloc() error in the last call, this is only bad
+ * in lh_insert(). */
+#define lh_error(lh)   ((lh)->error)
+
 #ifndef NOPROTO
 LHASH *lh_new(unsigned long (*h)(), int (*c)());
 void lh_free(LHASH *lh);
index 5cbd36f3fe40c880871665b8647d729de713a721..6a60dd2fb928ce0c7c691519cfdbfdcd25dc8d67 100644 (file)
@@ -61,7 +61,7 @@
 #include <string.h>
 #include "md2.h"
 
-char *MD2_version="MD2 part of SSLeay 0.9.0b 29-Jun-1998";
+char *MD2_version="MD2 part of SSLeay 0.9.1a 06-Jul-1998";
 
 /* Implemented from RFC1319 The MD2 Message-Digest Algorithm
  */
index 47e1ce05caf8af1f7cda175080a7c852fda3de47..abbe2eef8733964e73da2b2ca3318405f76d4ecd 100644 (file)
@@ -59,7 +59,7 @@ asm/mx86-out.o: asm/mx86unix.cpp
 
 # bsdi
 asm/mx86bsdi.o: asm/mx86unix.cpp
-       $(CPP) -DBSDI asm/mx86unix.cpp | as -o asm/mx86bsdi.o
+       $(CPP) -DBSDI asm/mx86unix.cpp | sed 's/ :/:/' | as -o asm/mx86bsdi.o
 
 asm/mx86unix.cpp:
        (cd asm; perl md5-586.pl cpp >mx86unix.cpp)
diff --git a/crypto/md5/f b/crypto/md5/f
new file mode 100644 (file)
index 0000000..b21505c
--- /dev/null
@@ -0,0 +1,731 @@
+# 1 "asm/mx86unix.cpp"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        
+        
+        
+        
+        
+
+       .file   "md5-586.s"
+       .version        "01.01"
+gcc2_compiled.:
+.text
+       .align 4 
+.globl _md5_block_x86 
+        
+_md5_block_x86 :
+       pushl   %esi
+       pushl   %edi
+       movl    12(%esp),       %edi
+       movl    16(%esp),       %esi
+       movl    20(%esp),       %ecx
+       pushl   %ebp
+       pushl   %ebx
+       addl    %esi,           %ecx
+       subl    $64,            %ecx
+       movl    (%edi),         %eax
+       pushl   %ecx
+       movl    4(%edi),        %ebx
+       movl    8(%edi),        %ecx
+       movl    12(%edi),       %edx
+.L000start:
+
+        
+       movl    %ecx,           %edi
+       movl    (%esi),         %ebp
+        
+       xorl    %edx,           %edi
+       andl    %ebx,           %edi
+       leal    3614090360(%eax,%ebp,1),%eax
+       movl    4(%esi),        %ebp
+       xorl    %edx,           %edi
+       addl    %edi,           %eax
+       movl    %ebx,           %edi
+       roll    $7,             %eax
+       addl    %ebx,           %eax
+        
+       xorl    %ecx,           %edi
+       andl    %eax,           %edi
+       leal    3905402710(%edx,%ebp,1),%edx
+       movl    8(%esi),        %ebp
+       xorl    %ecx,           %edi
+       addl    %edi,           %edx
+       movl    %eax,           %edi
+       roll    $12,            %edx
+       addl    %eax,           %edx
+        
+       xorl    %ebx,           %edi
+       andl    %edx,           %edi
+       leal    606105819(%ecx,%ebp,1),%ecx
+       movl    12(%esi),       %ebp
+       xorl    %ebx,           %edi
+       addl    %edi,           %ecx
+       movl    %edx,           %edi
+       roll    $17,            %ecx
+       addl    %edx,           %ecx
+        
+       xorl    %eax,           %edi
+       andl    %ecx,           %edi
+       leal    3250441966(%ebx,%ebp,1),%ebx
+       movl    16(%esi),       %ebp
+       xorl    %eax,           %edi
+       addl    %edi,           %ebx
+       movl    %ecx,           %edi
+       roll    $22,            %ebx
+       addl    %ecx,           %ebx
+        
+       xorl    %edx,           %edi
+       andl    %ebx,           %edi
+       leal    4118548399(%eax,%ebp,1),%eax
+       movl    20(%esi),       %ebp
+       xorl    %edx,           %edi
+       addl    %edi,           %eax
+       movl    %ebx,           %edi
+       roll    $7,             %eax
+       addl    %ebx,           %eax
+        
+       xorl    %ecx,           %edi
+       andl    %eax,           %edi
+       leal    1200080426(%edx,%ebp,1),%edx
+       movl    24(%esi),       %ebp
+       xorl    %ecx,           %edi
+       addl    %edi,           %edx
+       movl    %eax,           %edi
+       roll    $12,            %edx
+       addl    %eax,           %edx
+        
+       xorl    %ebx,           %edi
+       andl    %edx,           %edi
+       leal    2821735955(%ecx,%ebp,1),%ecx
+       movl    28(%esi),       %ebp
+       xorl    %ebx,           %edi
+       addl    %edi,           %ecx
+       movl    %edx,           %edi
+       roll    $17,            %ecx
+       addl    %edx,           %ecx
+        
+       xorl    %eax,           %edi
+       andl    %ecx,           %edi
+       leal    4249261313(%ebx,%ebp,1),%ebx
+       movl    32(%esi),       %ebp
+       xorl    %eax,           %edi
+       addl    %edi,           %ebx
+       movl    %ecx,           %edi
+       roll    $22,            %ebx
+       addl    %ecx,           %ebx
+        
+       xorl    %edx,           %edi
+       andl    %ebx,           %edi
+       leal    1770035416(%eax,%ebp,1),%eax
+       movl    36(%esi),       %ebp
+       xorl    %edx,           %edi
+       addl    %edi,           %eax
+       movl    %ebx,           %edi
+       roll    $7,             %eax
+       addl    %ebx,           %eax
+        
+       xorl    %ecx,           %edi
+       andl    %eax,           %edi
+       leal    2336552879(%edx,%ebp,1),%edx
+       movl    40(%esi),       %ebp
+       xorl    %ecx,           %edi
+       addl    %edi,           %edx
+       movl    %eax,           %edi
+       roll    $12,            %edx
+       addl    %eax,           %edx
+        
+       xorl    %ebx,           %edi
+       andl    %edx,           %edi
+       leal    4294925233(%ecx,%ebp,1),%ecx
+       movl    44(%esi),       %ebp
+       xorl    %ebx,           %edi
+       addl    %edi,           %ecx
+       movl    %edx,           %edi
+       roll    $17,            %ecx
+       addl    %edx,           %ecx
+        
+       xorl    %eax,           %edi
+       andl    %ecx,           %edi
+       leal    2304563134(%ebx,%ebp,1),%ebx
+       movl    48(%esi),       %ebp
+       xorl    %eax,           %edi
+       addl    %edi,           %ebx
+       movl    %ecx,           %edi
+       roll    $22,            %ebx
+       addl    %ecx,           %ebx
+        
+       xorl    %edx,           %edi
+       andl    %ebx,           %edi
+       leal    1804603682(%eax,%ebp,1),%eax
+       movl    52(%esi),       %ebp
+       xorl    %edx,           %edi
+       addl    %edi,           %eax
+       movl    %ebx,           %edi
+       roll    $7,             %eax
+       addl    %ebx,           %eax
+        
+       xorl    %ecx,           %edi
+       andl    %eax,           %edi
+       leal    4254626195(%edx,%ebp,1),%edx
+       movl    56(%esi),       %ebp
+       xorl    %ecx,           %edi
+       addl    %edi,           %edx
+       movl    %eax,           %edi
+       roll    $12,            %edx
+       addl    %eax,           %edx
+        
+       xorl    %ebx,           %edi
+       andl    %edx,           %edi
+       leal    2792965006(%ecx,%ebp,1),%ecx
+       movl    60(%esi),       %ebp
+       xorl    %ebx,           %edi
+       addl    %edi,           %ecx
+       movl    %edx,           %edi
+       roll    $17,            %ecx
+       addl    %edx,           %ecx
+        
+       xorl    %eax,           %edi
+       andl    %ecx,           %edi
+       leal    1236535329(%ebx,%ebp,1),%ebx
+       movl    4(%esi),        %ebp
+       xorl    %eax,           %edi
+       addl    %edi,           %ebx
+       movl    %ecx,           %edi
+       roll    $22,            %ebx
+       addl    %ecx,           %ebx
+
+        
+        
+       leal    4129170786(%eax,%ebp,1),%eax
+       xorl    %ebx,           %edi
+       andl    %edx,           %edi
+       movl    24(%esi),       %ebp
+       xorl    %ecx,           %edi
+       addl    %edi,           %eax
+       movl    %ebx,           %edi
+       roll    $5,             %eax
+       addl    %ebx,           %eax
+        
+       leal    3225465664(%edx,%ebp,1),%edx
+       xorl    %eax,           %edi
+       andl    %ecx,           %edi
+       movl    44(%esi),       %ebp
+       xorl    %ebx,           %edi
+       addl    %edi,           %edx
+       movl    %eax,           %edi
+       roll    $9,             %edx
+       addl    %eax,           %edx
+        
+       leal    643717713(%ecx,%ebp,1),%ecx
+       xorl    %edx,           %edi
+       andl    %ebx,           %edi
+       movl    (%esi),         %ebp
+       xorl    %eax,           %edi
+       addl    %edi,           %ecx
+       movl    %edx,           %edi
+       roll    $14,            %ecx
+       addl    %edx,           %ecx
+        
+       leal    3921069994(%ebx,%ebp,1),%ebx
+       xorl    %ecx,           %edi
+       andl    %eax,           %edi
+       movl    20(%esi),       %ebp
+       xorl    %edx,           %edi
+       addl    %edi,           %ebx
+       movl    %ecx,           %edi
+       roll    $20,            %ebx
+       addl    %ecx,           %ebx
+        
+       leal    3593408605(%eax,%ebp,1),%eax
+       xorl    %ebx,           %edi
+       andl    %edx,           %edi
+       movl    40(%esi),       %ebp
+       xorl    %ecx,           %edi
+       addl    %edi,           %eax
+       movl    %ebx,           %edi
+       roll    $5,             %eax
+       addl    %ebx,           %eax
+        
+       leal    38016083(%edx,%ebp,1),%edx
+       xorl    %eax,           %edi
+       andl    %ecx,           %edi
+       movl    60(%esi),       %ebp
+       xorl    %ebx,           %edi
+       addl    %edi,           %edx
+       movl    %eax,           %edi
+       roll    $9,             %edx
+       addl    %eax,           %edx
+        
+       leal    3634488961(%ecx,%ebp,1),%ecx
+       xorl    %edx,           %edi
+       andl    %ebx,           %edi
+       movl    16(%esi),       %ebp
+       xorl    %eax,           %edi
+       addl    %edi,           %ecx
+       movl    %edx,           %edi
+       roll    $14,            %ecx
+       addl    %edx,           %ecx
+        
+       leal    3889429448(%ebx,%ebp,1),%ebx
+       xorl    %ecx,           %edi
+       andl    %eax,           %edi
+       movl    36(%esi),       %ebp
+       xorl    %edx,           %edi
+       addl    %edi,           %ebx
+       movl    %ecx,           %edi
+       roll    $20,            %ebx
+       addl    %ecx,           %ebx
+        
+       leal    568446438(%eax,%ebp,1),%eax
+       xorl    %ebx,           %edi
+       andl    %edx,           %edi
+       movl    56(%esi),       %ebp
+       xorl    %ecx,           %edi
+       addl    %edi,           %eax
+       movl    %ebx,           %edi
+       roll    $5,             %eax
+       addl    %ebx,           %eax
+        
+       leal    3275163606(%edx,%ebp,1),%edx
+       xorl    %eax,           %edi
+       andl    %ecx,           %edi
+       movl    12(%esi),       %ebp
+       xorl    %ebx,           %edi
+       addl    %edi,           %edx
+       movl    %eax,           %edi
+       roll    $9,             %edx
+       addl    %eax,           %edx
+        
+       leal    4107603335(%ecx,%ebp,1),%ecx
+       xorl    %edx,           %edi
+       andl    %ebx,           %edi
+       movl    32(%esi),       %ebp
+       xorl    %eax,           %edi
+       addl    %edi,           %ecx
+       movl    %edx,           %edi
+       roll    $14,            %ecx
+       addl    %edx,           %ecx
+        
+       leal    1163531501(%ebx,%ebp,1),%ebx
+       xorl    %ecx,           %edi
+       andl    %eax,           %edi
+       movl    52(%esi),       %ebp
+       xorl    %edx,           %edi
+       addl    %edi,           %ebx
+       movl    %ecx,           %edi
+       roll    $20,            %ebx
+       addl    %ecx,           %ebx
+        
+       leal    2850285829(%eax,%ebp,1),%eax
+       xorl    %ebx,           %edi
+       andl    %edx,           %edi
+       movl    8(%esi),        %ebp
+       xorl    %ecx,           %edi
+       addl    %edi,           %eax
+       movl    %ebx,           %edi
+       roll    $5,             %eax
+       addl    %ebx,           %eax
+        
+       leal    4243563512(%edx,%ebp,1),%edx
+       xorl    %eax,           %edi
+       andl    %ecx,           %edi
+       movl    28(%esi),       %ebp
+       xorl    %ebx,           %edi
+       addl    %edi,           %edx
+       movl    %eax,           %edi
+       roll    $9,             %edx
+       addl    %eax,           %edx
+        
+       leal    1735328473(%ecx,%ebp,1),%ecx
+       xorl    %edx,           %edi
+       andl    %ebx,           %edi
+       movl    48(%esi),       %ebp
+       xorl    %eax,           %edi
+       addl    %edi,           %ecx
+       movl    %edx,           %edi
+       roll    $14,            %ecx
+       addl    %edx,           %ecx
+        
+       leal    2368359562(%ebx,%ebp,1),%ebx
+       xorl    %ecx,           %edi
+       andl    %eax,           %edi
+       movl    20(%esi),       %ebp
+       xorl    %edx,           %edi
+       addl    %edi,           %ebx
+       movl    %ecx,           %edi
+       roll    $20,            %ebx
+       addl    %ecx,           %ebx
+
+        
+        
+       xorl    %edx,           %edi
+       xorl    %ebx,           %edi
+       leal    4294588738(%eax,%ebp,1),%eax
+       addl    %edi,           %eax
+       movl    32(%esi),       %ebp
+       roll    $4,             %eax
+       movl    %ebx,           %edi
+        
+       leal    2272392833(%edx,%ebp,1),%edx
+       addl    %ebx,           %eax
+       xorl    %ecx,           %edi
+       xorl    %eax,           %edi
+       movl    44(%esi),       %ebp
+       addl    %edi,           %edx
+       movl    %eax,           %edi
+       roll    $11,            %edx
+       addl    %eax,           %edx
+        
+       xorl    %ebx,           %edi
+       xorl    %edx,           %edi
+       leal    1839030562(%ecx,%ebp,1),%ecx
+       addl    %edi,           %ecx
+       movl    56(%esi),       %ebp
+       roll    $16,            %ecx
+       movl    %edx,           %edi
+        
+       leal    4259657740(%ebx,%ebp,1),%ebx
+       addl    %edx,           %ecx
+       xorl    %eax,           %edi
+       xorl    %ecx,           %edi
+       movl    4(%esi),        %ebp
+       addl    %edi,           %ebx
+       movl    %ecx,           %edi
+       roll    $23,            %ebx
+       addl    %ecx,           %ebx
+        
+       xorl    %edx,           %edi
+       xorl    %ebx,           %edi
+       leal    2763975236(%eax,%ebp,1),%eax
+       addl    %edi,           %eax
+       movl    16(%esi),       %ebp
+       roll    $4,             %eax
+       movl    %ebx,           %edi
+        
+       leal    1272893353(%edx,%ebp,1),%edx
+       addl    %ebx,           %eax
+       xorl    %ecx,           %edi
+       xorl    %eax,           %edi
+       movl    28(%esi),       %ebp
+       addl    %edi,           %edx
+       movl    %eax,           %edi
+       roll    $11,            %edx
+       addl    %eax,           %edx
+        
+       xorl    %ebx,           %edi
+       xorl    %edx,           %edi
+       leal    4139469664(%ecx,%ebp,1),%ecx
+       addl    %edi,           %ecx
+       movl    40(%esi),       %ebp
+       roll    $16,            %ecx
+       movl    %edx,           %edi
+        
+       leal    3200236656(%ebx,%ebp,1),%ebx
+       addl    %edx,           %ecx
+       xorl    %eax,           %edi
+       xorl    %ecx,           %edi
+       movl    52(%esi),       %ebp
+       addl    %edi,           %ebx
+       movl    %ecx,           %edi
+       roll    $23,            %ebx
+       addl    %ecx,           %ebx
+        
+       xorl    %edx,           %edi
+       xorl    %ebx,           %edi
+       leal    681279174(%eax,%ebp,1),%eax
+       addl    %edi,           %eax
+       movl    (%esi),         %ebp
+       roll    $4,             %eax
+       movl    %ebx,           %edi
+        
+       leal    3936430074(%edx,%ebp,1),%edx
+       addl    %ebx,           %eax
+       xorl    %ecx,           %edi
+       xorl    %eax,           %edi
+       movl    12(%esi),       %ebp
+       addl    %edi,           %edx
+       movl    %eax,           %edi
+       roll    $11,            %edx
+       addl    %eax,           %edx
+        
+       xorl    %ebx,           %edi
+       xorl    %edx,           %edi
+       leal    3572445317(%ecx,%ebp,1),%ecx
+       addl    %edi,           %ecx
+       movl    24(%esi),       %ebp
+       roll    $16,            %ecx
+       movl    %edx,           %edi
+        
+       leal    76029189(%ebx,%ebp,1),%ebx
+       addl    %edx,           %ecx
+       xorl    %eax,           %edi
+       xorl    %ecx,           %edi
+       movl    36(%esi),       %ebp
+       addl    %edi,           %ebx
+       movl    %ecx,           %edi
+       roll    $23,            %ebx
+       addl    %ecx,           %ebx
+        
+       xorl    %edx,           %edi
+       xorl    %ebx,           %edi
+       leal    3654602809(%eax,%ebp,1),%eax
+       addl    %edi,           %eax
+       movl    48(%esi),       %ebp
+       roll    $4,             %eax
+       movl    %ebx,           %edi
+        
+       leal    3873151461(%edx,%ebp,1),%edx
+       addl    %ebx,           %eax
+       xorl    %ecx,           %edi
+       xorl    %eax,           %edi
+       movl    60(%esi),       %ebp
+       addl    %edi,           %edx
+       movl    %eax,           %edi
+       roll    $11,            %edx
+       addl    %eax,           %edx
+        
+       xorl    %ebx,           %edi
+       xorl    %edx,           %edi
+       leal    530742520(%ecx,%ebp,1),%ecx
+       addl    %edi,           %ecx
+       movl    8(%esi),        %ebp
+       roll    $16,            %ecx
+       movl    %edx,           %edi
+        
+       leal    3299628645(%ebx,%ebp,1),%ebx
+       addl    %edx,           %ecx
+       xorl    %eax,           %edi
+       xorl    %ecx,           %edi
+       movl    (%esi),         %ebp
+       addl    %edi,           %ebx
+       movl    $-1,            %edi
+       roll    $23,            %ebx
+       addl    %ecx,           %ebx
+
+        
+        
+       xorl    %edx,           %edi
+       orl     %ebx,           %edi
+       leal    4096336452(%eax,%ebp,1),%eax
+       xorl    %ecx,           %edi
+       movl    28(%esi),       %ebp
+       addl    %edi,           %eax
+       movl    $-1,            %edi
+       roll    $6,             %eax
+       xorl    %ecx,           %edi
+       addl    %ebx,           %eax
+        
+       orl     %eax,           %edi
+       leal    1126891415(%edx,%ebp,1),%edx
+       xorl    %ebx,           %edi
+       movl    56(%esi),       %ebp
+       addl    %edi,           %edx
+       movl    $-1,            %edi
+       roll    $10,            %edx
+       xorl    %ebx,           %edi
+       addl    %eax,           %edx
+        
+       orl     %edx,           %edi
+       leal    2878612391(%ecx,%ebp,1),%ecx
+       xorl    %eax,           %edi
+       movl    20(%esi),       %ebp
+       addl    %edi,           %ecx
+       movl    $-1,            %edi
+       roll    $15,            %ecx
+       xorl    %eax,           %edi
+       addl    %edx,           %ecx
+        
+       orl     %ecx,           %edi
+       leal    4237533241(%ebx,%ebp,1),%ebx
+       xorl    %edx,           %edi
+       movl    48(%esi),       %ebp
+       addl    %edi,           %ebx
+       movl    $-1,            %edi
+       roll    $21,            %ebx
+       xorl    %edx,           %edi
+       addl    %ecx,           %ebx
+        
+       orl     %ebx,           %edi
+       leal    1700485571(%eax,%ebp,1),%eax
+       xorl    %ecx,           %edi
+       movl    12(%esi),       %ebp
+       addl    %edi,           %eax
+       movl    $-1,            %edi
+       roll    $6,             %eax
+       xorl    %ecx,           %edi
+       addl    %ebx,           %eax
+        
+       orl     %eax,           %edi
+       leal    2399980690(%edx,%ebp,1),%edx
+       xorl    %ebx,           %edi
+       movl    40(%esi),       %ebp
+       addl    %edi,           %edx
+       movl    $-1,            %edi
+       roll    $10,            %edx
+       xorl    %ebx,           %edi
+       addl    %eax,           %edx
+        
+       orl     %edx,           %edi
+       leal    4293915773(%ecx,%ebp,1),%ecx
+       xorl    %eax,           %edi
+       movl    4(%esi),        %ebp
+       addl    %edi,           %ecx
+       movl    $-1,            %edi
+       roll    $15,            %ecx
+       xorl    %eax,           %edi
+       addl    %edx,           %ecx
+        
+       orl     %ecx,           %edi
+       leal    2240044497(%ebx,%ebp,1),%ebx
+       xorl    %edx,           %edi
+       movl    32(%esi),       %ebp
+       addl    %edi,           %ebx
+       movl    $-1,            %edi
+       roll    $21,            %ebx
+       xorl    %edx,           %edi
+       addl    %ecx,           %ebx
+        
+       orl     %ebx,           %edi
+       leal    1873313359(%eax,%ebp,1),%eax
+       xorl    %ecx,           %edi
+       movl    60(%esi),       %ebp
+       addl    %edi,           %eax
+       movl    $-1,            %edi
+       roll    $6,             %eax
+       xorl    %ecx,           %edi
+       addl    %ebx,           %eax
+        
+       orl     %eax,           %edi
+       leal    4264355552(%edx,%ebp,1),%edx
+       xorl    %ebx,           %edi
+       movl    24(%esi),       %ebp
+       addl    %edi,           %edx
+       movl    $-1,            %edi
+       roll    $10,            %edx
+       xorl    %ebx,           %edi
+       addl    %eax,           %edx
+        
+       orl     %edx,           %edi
+       leal    2734768916(%ecx,%ebp,1),%ecx
+       xorl    %eax,           %edi
+       movl    52(%esi),       %ebp
+       addl    %edi,           %ecx
+       movl    $-1,            %edi
+       roll    $15,            %ecx
+       xorl    %eax,           %edi
+       addl    %edx,           %ecx
+        
+       orl     %ecx,           %edi
+       leal    1309151649(%ebx,%ebp,1),%ebx
+       xorl    %edx,           %edi
+       movl    16(%esi),       %ebp
+       addl    %edi,           %ebx
+       movl    $-1,            %edi
+       roll    $21,            %ebx
+       xorl    %edx,           %edi
+       addl    %ecx,           %ebx
+        
+       orl     %ebx,           %edi
+       leal    4149444226(%eax,%ebp,1),%eax
+       xorl    %ecx,           %edi
+       movl    44(%esi),       %ebp
+       addl    %edi,           %eax
+       movl    $-1,            %edi
+       roll    $6,             %eax
+       xorl    %ecx,           %edi
+       addl    %ebx,           %eax
+        
+       orl     %eax,           %edi
+       leal    3174756917(%edx,%ebp,1),%edx
+       xorl    %ebx,           %edi
+       movl    8(%esi),        %ebp
+       addl    %edi,           %edx
+       movl    $-1,            %edi
+       roll    $10,            %edx
+       xorl    %ebx,           %edi
+       addl    %eax,           %edx
+        
+       orl     %edx,           %edi
+       leal    718787259(%ecx,%ebp,1),%ecx
+       xorl    %eax,           %edi
+       movl    36(%esi),       %ebp
+       addl    %edi,           %ecx
+       movl    $-1,            %edi
+       roll    $15,            %ecx
+       xorl    %eax,           %edi
+       addl    %edx,           %ecx
+        
+       orl     %ecx,           %edi
+       leal    3951481745(%ebx,%ebp,1),%ebx
+       xorl    %edx,           %edi
+       movl    24(%esp),       %ebp
+       addl    %edi,           %ebx
+       addl    $64,            %esi
+       roll    $21,            %ebx
+       movl    (%ebp),         %edi
+       addl    %ecx,           %ebx
+       addl    %edi,           %eax
+       movl    4(%ebp),        %edi
+       addl    %edi,           %ebx
+       movl    8(%ebp),        %edi
+       addl    %edi,           %ecx
+       movl    12(%ebp),       %edi
+       addl    %edi,           %edx
+       movl    %eax,           (%ebp)
+       movl    %ebx,           4(%ebp)
+       movl    (%esp),         %edi
+       movl    %ecx,           8(%ebp)
+       movl    %edx,           12(%ebp)
+       cmpl    %esi,           %edi
+       jge     .L000start
+       popl    %eax
+       popl    %ebx
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       ret
+.md5_block_x86_end:
+        
+.ident "desasm.pl"
index 43b3498d92cc2d4f1aaca67202820b58e58d10cf..367b5bce0cfe2ffa42e09e5cf72b92e882bc4f52 100644 (file)
@@ -59,7 +59,7 @@
 #include <stdio.h>
 #include "md5_locl.h"
 
-char *MD5_version="MD5 part of SSLeay 0.9.0b 29-Jun-1998";
+char *MD5_version="MD5 part of SSLeay 0.9.1a 06-Jul-1998";
 
 /* Implemented from RFC1321 The MD5 Message-Digest Algorithm
  */
index 3f3d11a1a28ad66cff0bcc49a9102a9cacd7be98..2a086c061248d8d333a693d075b1bae1a6c86a93 100644 (file)
@@ -150,9 +150,11 @@ unsigned int len;
                (*h)[0]=((*h)[0]&0x9f)|0x40;
                (*hh)[0]=((*hh)[0]&0x9f)|0x20;
 
+               des_set_odd_parity(h);
                des_set_key(h,k);
                des_encrypt((DES_LONG *)d,k,1);
 
+               des_set_odd_parity(hh);
                des_set_key(hh,k);
                des_encrypt((DES_LONG *)dd,k,1);
 
index 72e501ad0f2a5cdf71aa4b5f0829f54c02ad90c2..e5f24923c95b19c66ad8748806a3e75a3aad6541 100644 (file)
 #include "lhash.h"
 #include "cryptlib.h"
 
+#ifdef CRYPTO_MDEBUG
+static int mh_mode=CRYPTO_MEM_CHECK_ON;
+#else
 static int mh_mode=CRYPTO_MEM_CHECK_OFF;
+#endif
 static unsigned long order=0;
 
 static LHASH *mh=NULL;
@@ -91,6 +95,13 @@ int mode;
        case CRYPTO_MEM_CHECK_OFF:
                mh_mode&= ~CRYPTO_MEM_CHECK_ON;
                break;
+       case CRYPTO_MEM_CHECK_DISABLE:
+               mh_mode&= ~CRYPTO_MEM_CHECK_ENABLE;
+               break;
+       case CRYPTO_MEM_CHECK_ENABLE:
+               if (mh_mode&CRYPTO_MEM_CHECK_ON)
+                       mh_mode|=CRYPTO_MEM_CHECK_ENABLE;
+               break;
        default:
                break;
                }
@@ -115,6 +126,8 @@ MEM *a;
        return(ret);
        }
 
+static char *(*malloc_locked_func)()=(char *(*)())malloc;
+static void (*free_locked_func)()=(void (*)())free;
 static char *(*malloc_func)()= (char *(*)())malloc;
 static char *(*realloc_func)()=        (char *(*)())realloc;
 static void (*free_func)()=    (void (*)())free;
@@ -128,6 +141,17 @@ void (*f)();
        malloc_func=m;
        realloc_func=r;
        free_func=f;
+       malloc_locked_func=m;
+       free_locked_func=f;
+       }
+
+void CRYPTO_set_locked_mem_functions(m,f)
+char *(*m)();
+void (*f)();
+       {
+       if ((m == NULL) || (f == NULL)) return;
+       malloc_locked_func=m;
+       free_locked_func=f;
        }
 
 void CRYPTO_get_mem_functions(m,r,f)
@@ -140,6 +164,26 @@ void (**f)();
        if (f != NULL) *f=free_func;
        }
 
+void CRYPTO_get_locked_mem_functions(m,f)
+char *(**m)();
+void (**f)();
+       {
+       if (m != NULL) *m=malloc_locked_func;
+       if (f != NULL) *f=free_locked_func;
+       }
+
+char *CRYPTO_malloc_locked(num)
+int num;
+       {
+       return(malloc_locked_func(num));
+       }
+
+void CRYPTO_free_locked(str)
+char *str;
+       {
+       free_locked_func(str);
+       }
+
 char *CRYPTO_malloc(num)
 int num;
        {
@@ -159,6 +203,7 @@ char *str;
        free_func(str);
        }
 
+static unsigned long break_order_num=0;
 char *CRYPTO_dbg_malloc(num,file,line)
 int num;
 char *file;
@@ -170,11 +215,13 @@ int line;
        if ((ret=malloc_func(num)) == NULL)
                return(NULL);
 
-       if (mh_mode & CRYPTO_MEM_CHECK_ON)
+       if (mh_mode & CRYPTO_MEM_CHECK_ENABLE)
                {
-               if ((m=(MEM *)malloc(sizeof(MEM))) == NULL)
+               MemCheck_off();
+               if ((m=(MEM *)Malloc(sizeof(MEM))) == NULL)
                        {
-                       free(ret);
+                       Free(ret);
+                       MemCheck_on();
                        return(NULL);
                        }
                CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
@@ -182,9 +229,10 @@ int line;
                        {
                        if ((mh=lh_new(mem_hash,mem_cmp)) == NULL)
                                {
-                               free(ret);
-                               free(m);
-                               return(NULL);
+                               Free(ret);
+                               Free(m);
+                               ret=NULL;
+                               goto err;
                                }
                        }
 
@@ -192,13 +240,20 @@ int line;
                m->file=file;
                m->line=line;
                m->num=num;
+               if (order == break_order_num)
+                       {
+                       /* BREAK HERE */
+                       m->order=order;
+                       }
                m->order=order++;
                if ((mm=(MEM *)lh_insert(mh,(char *)m)) != NULL)
                        {
                        /* Not good, but don't sweat it */
-                       free(mm);
+                       Free(mm);
                        }
+err:
                CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
+               MemCheck_on();
                }
        return(ret);
        }
@@ -208,14 +263,16 @@ char *addr;
        {
        MEM m,*mp;
 
-       if ((mh_mode & CRYPTO_MEM_CHECK_ON) && (mh != NULL))
+       if ((mh_mode & CRYPTO_MEM_CHECK_ENABLE) && (mh != NULL))
                {
+               MemCheck_off();
                CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
                m.addr=addr;
                mp=(MEM *)lh_delete(mh,(char *)&m);
                if (mp != NULL)
-                       free(mp);
+                       Free(mp);
                CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
+               MemCheck_on();
                }
        free_func(addr);
        }
@@ -232,8 +289,9 @@ int line;
        ret=realloc_func(addr,num);
        if (ret == addr) return(ret);
 
-       if (mh_mode & CRYPTO_MEM_CHECK_ON)
+       if (mh_mode & CRYPTO_MEM_CHECK_ENABLE)
                {
+               MemCheck_off();
                if (ret == NULL) return(NULL);
                m.addr=addr;
                CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
@@ -244,6 +302,7 @@ int line;
                        lh_insert(mh,(char *)mp);
                        }
                CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
+               MemCheck_on();
                }
        return(ret);
        }
@@ -308,11 +367,12 @@ BIO *b;
                        ml.bytes,ml.chunks);
                BIO_puts(b,buf);
                }
-       /*
+
+#if 0
        lh_stats_bio(mh,b);
         lh_node_stats_bio(mh,b);
         lh_node_usage_stats_bio(mh,b);
-       */
+#endif
        }
 
 static void (*mem_cb)()=NULL;
index 320523cea1334d0134eda4656c3ded33257baaa6..4fa4a7dbf499a314527da59812ccfea769d4d134 100644 (file)
@@ -22,8 +22,8 @@ TEST=
 APPS=
 
 LIB=$(TOP)/libcrypto.a
-LIBSRC=        obj_dat.c obj_lib.c $(ERRC).c
-LIBOBJ= obj_dat.o obj_lib.o $(ERRC).o
+LIBSRC=        o_names.c obj_dat.c obj_lib.c $(ERRC).c
+LIBOBJ= o_names.o obj_dat.o obj_lib.o $(ERRC).o
 
 SRC= $(LIBSRC)
 
diff --git a/crypto/objects/o_names.c b/crypto/objects/o_names.c
new file mode 100644 (file)
index 0000000..8995869
--- /dev/null
@@ -0,0 +1,254 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lhash.h"
+#include "objects.h"
+
+/* I use the ex_data stuff to manage the identifiers for the obj_name_types
+ * that applications may define.  I only really use the free function field.
+ */
+static LHASH *names_lh=NULL;
+static int names_type_num=OBJ_NAME_TYPE_NUM;
+static STACK *names_cmp=NULL;
+static STACK *names_hash=NULL;
+static STACK *names_free=NULL;
+
+static unsigned long obj_name_hash(OBJ_NAME *a);
+static int obj_name_cmp(OBJ_NAME *a,OBJ_NAME *b);
+
+int OBJ_NAME_init()
+       {
+       if (names_lh != NULL) return(1);
+       MemCheck_off();
+       names_lh=lh_new(obj_name_hash,obj_name_cmp);
+       MemCheck_on();
+       return(names_lh != NULL);
+       }
+
+int OBJ_NAME_new_index(hash_func,cmp_func,free_func)
+unsigned long (*hash_func)();
+int (*cmp_func)();
+void (*free_func)();
+       {
+       int ret;
+       int i;
+
+       if (names_free == NULL)
+               {
+               MemCheck_off();
+               names_hash=sk_new_null();
+               names_cmp=sk_new_null();
+               names_free=sk_new_null();
+               MemCheck_on();
+               }
+       if ((names_free == NULL) || (names_hash == NULL) || (names_cmp == NULL))
+               {
+               /* ERROR */
+               return(0);
+               }
+       ret=names_type_num;
+       names_type_num++;
+       for (i=sk_num(names_free); i<names_type_num; i++)
+               {
+               MemCheck_off();
+               sk_push(names_hash,(char *)strcmp);
+               sk_push(names_cmp,(char *)lh_strhash);
+               sk_push(names_free,NULL);
+               MemCheck_on();
+               }
+       if (hash_func != NULL)
+               sk_value(names_hash,ret)=(char *)hash_func;
+       if (cmp_func != NULL)
+               sk_value(names_cmp,ret)= (char *)cmp_func;
+       if (free_func != NULL)
+               sk_value(names_free,ret)=(char *)free_func;
+       return(ret);
+       }
+
+static int obj_name_cmp(a,b)
+OBJ_NAME *a;
+OBJ_NAME *b;
+       {
+       int ret;
+       int (*cmp)();
+
+       ret=a->type-b->type;
+       if (ret == 0)
+               {
+               if ((names_cmp != NULL) && (sk_num(names_cmp) > a->type))
+                       {
+                       cmp=(int (*)())sk_value(names_cmp,a->type);
+                       ret=cmp(a->name,b->name);
+                       }
+               else
+                       ret=strcmp(a->name,b->name);
+               }
+       return(ret);
+       }
+
+static unsigned long obj_name_hash(a)
+OBJ_NAME *a;
+       {
+       unsigned long ret;
+       unsigned long (*hash)();
+
+       if ((names_hash != NULL) && (sk_num(names_hash) > a->type))
+               {
+               hash=(unsigned long (*)())sk_value(names_hash,a->type);
+               ret=hash(a->name);
+               }
+       else
+               {
+               ret=lh_strhash(a->name);
+               }
+       ret^=a->type;
+       return(ret);
+       }
+
+char *OBJ_NAME_get(name,type)
+char *name;
+int type;
+       {
+       OBJ_NAME on,*ret;
+       int num=0,alias;
+
+       if (name == NULL) return(NULL);
+       if ((names_lh == NULL) && !OBJ_NAME_init()) return(NULL);
+
+       alias=type&OBJ_NAME_ALIAS;
+       type&= ~OBJ_NAME_ALIAS;
+
+       on.name=name;
+       on.type=type;
+
+       for (;;)
+               {
+               ret=(OBJ_NAME *)lh_retrieve(names_lh,(char *)&on);
+               if (ret == NULL) return(NULL);
+               if ((ret->alias) && !alias)
+                       {
+                       if (++num > 10) return(NULL);
+                       on.name=ret->data;
+                       }
+               else
+                       {
+                       return(ret->data);
+                       }
+               }
+       }
+
+int OBJ_NAME_add(name,type,data)
+char *name;
+int type;
+char *data;
+       {
+       void (*f)();
+       OBJ_NAME *onp,*ret;
+       int alias;
+
+       if ((names_lh == NULL) && !OBJ_NAME_init()) return(0);
+
+       alias=type&OBJ_NAME_ALIAS;
+       type&= ~OBJ_NAME_ALIAS;
+
+       onp=(OBJ_NAME *)Malloc(sizeof(OBJ_NAME));
+       if (onp == NULL)
+               {
+               /* ERROR */
+               return(0);
+               }
+
+       onp->name=name;
+       onp->alias=alias;
+       onp->type=type;
+       onp->data=data;
+
+       ret=(OBJ_NAME *)lh_insert(names_lh,(char *)onp);
+       if (ret != NULL)
+               {
+               /* free things */
+               if ((names_free != NULL) && (sk_num(names_free) > ret->type))
+                       {
+                       f=(void (*)())sk_value(names_free,ret->type);
+                       f(ret->name,ret->type,ret->data);
+                       }
+               Free((char *)ret);
+               }
+       else
+               {
+               if (lh_error(names_lh))
+                       {
+                       /* ERROR */
+                       return(0);
+                       }
+               }
+       return(1);
+       }
+
+int OBJ_NAME_remove(name,type)
+char *name;
+int type;
+       {
+       OBJ_NAME on,*ret;
+       void (*f)();
+
+       if (names_lh == NULL) return(0);
+
+       type&= ~OBJ_NAME_ALIAS;
+       on.name=name;
+       on.type=type;
+       ret=(OBJ_NAME *)lh_delete(names_lh,(char *)&on);
+       if (ret != NULL)
+               {
+               /* free things */
+               if ((names_free != NULL) && (sk_num(names_free) > type))
+                       {
+                       f=(void (*)())sk_value(names_free,type);
+                       f(ret->name,ret->type,ret->data);
+                       }
+               Free((char *)ret);
+               return(1);
+               }
+       else
+               return(0);
+       }
+
+static int free_type;
+
+static void names_lh_free(onp,type)
+OBJ_NAME *onp;
+       {
+       if ((free_type < 0) || (free_type == onp->type))
+               {
+               OBJ_NAME_remove(onp->name,onp->type);
+               }
+       }
+
+void OBJ_NAME_cleanup(type)
+int type;
+       {
+       unsigned long down_load;
+
+       if (names_lh == NULL) return;
+
+       free_type=type;
+       down_load=names_lh->down_load;
+       names_lh->down_load=0;
+
+       lh_doall(names_lh,names_lh_free);
+       if (type < 0)
+               {
+               lh_free(names_lh);
+               sk_free(names_hash);
+               sk_free(names_cmp);
+               sk_free(names_free);
+               names_lh=NULL;
+               names_hash=NULL;
+               names_cmp=NULL;
+               names_free=NULL;
+               }
+       else
+               names_lh->down_load=down_load;
+       }
+
index 34866ebbd28b095af2961c8b9c546c4761f1431d..93424a373f4818272432b0f737161d1fba5c748c 100644 (file)
 #include "objects.h"
 
 /* obj_dat.h is generated from objects.h by obj_dat.pl */
+#ifndef NO_OBJECT
 #include "obj_dat.h"
+#else
+/* You will have to load all the objects needed manually in the application */
+#define NUM_NID 0
+#define NUM_SN 0
+#define NUM_LN 0
+#define NUM_OBJ 0
+static unsigned char lvalues[1];
+static ASN1_OBJECT nid_objs[1];
+static ASN1_OBJECT *sn_objs[1];
+static ASN1_OBJECT *ln_objs[1];
+static ASN1_OBJECT *obj_objs[1];
+#endif
 
 #ifndef NOPROTO
 static int sn_cmp(ASN1_OBJECT **a, ASN1_OBJECT **b);
@@ -163,6 +176,7 @@ ADDED_OBJ *ca,*cb;
        default:
                abort();
                }
+       return(1); /* should not get here */
        }
 
 static int init_added()
@@ -177,7 +191,8 @@ ADDED_OBJ *a;
        {
        a->obj->nid=0;
        a->obj->flags|=ASN1_OBJECT_FLAG_DYNAMIC|
-                       ASN1_OBJECT_FLAG_DYNAMIC_STRINGS;
+                       ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|
+                       ASN1_OBJECT_FLAG_DYNAMIC_DATA;
        }
 
 static void cleanup2(a)
@@ -247,7 +262,9 @@ ASN1_OBJECT *obj;
                                Free(aop);
                        }
                }
-       o->flags&= ~(ASN1_OBJECT_FLAG_DYNAMIC|ASN1_OBJECT_FLAG_DYNAMIC_STRINGS);
+       o->flags&= ~(ASN1_OBJECT_FLAG_DYNAMIC|ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|
+                       ASN1_OBJECT_FLAG_DYNAMIC_DATA);
+
        return(o->nid);
 err:
        for (i=ADDED_DATA; i<=ADDED_NID; i++)
@@ -502,7 +519,7 @@ int OBJ_create_objects(in)
 BIO *in;
        {
        MS_STATIC char buf[512];
-       int i,num= -1;
+       int i,num=0;
        char *o,*s,*l=NULL;
 
        for (;;)
@@ -544,7 +561,7 @@ BIO *in;
                if (!OBJ_create(o,s,l)) return(num);
                num++;
                }
-       return(num);
+       /* return(num); */
        }
 
 int OBJ_create(oid,sn,ln)
index 6f106759a3ef756b23213c47d360c20a0947464d..ea79d47f52c749139bc90cf6f56c9cd0643713a9 100644 (file)
  * perl obj_dat.pl < objects.h > obj_dat.h
  */
 
-#define NUM_NID 124
-#define NUM_SN 95
-#define NUM_LN 122
-#define NUM_OBJ 95
+#define NUM_NID 126
+#define NUM_SN 97
+#define NUM_LN 124
+#define NUM_OBJ 98
 
-static unsigned char lvalues[600]={
-0x2A,0x86,0x48,0x86,0xF7,0x0D,               /* [  0] OBJ_rsadsi */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,          /* [  6] OBJ_pkcs */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x02,0x02,     /* [ 13] OBJ_md2 */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x02,0x05,     /* [ 21] OBJ_md5 */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x03,0x04,     /* [ 29] OBJ_rc4 */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,/* [ 37] OBJ_rsaEncryption */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x02,/* [ 46] OBJ_md2WithRSAEncryption */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x04,/* [ 55] OBJ_md5WithRSAEncryption */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x05,0x01,/* [ 64] OBJ_pbeWithMD2AndDES_CBC */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x05,0x03,/* [ 73] OBJ_pbeWithMD5AndDES_CBC */
-0x55,                                        /* [ 82] OBJ_X500 */
-0x55,0x04,                                   /* [ 83] OBJ_X509 */
-0x55,0x04,0x03,                              /* [ 85] OBJ_commonName */
-0x55,0x04,0x06,                              /* [ 88] OBJ_countryName */
-0x55,0x04,0x07,                              /* [ 91] OBJ_localityName */
-0x55,0x04,0x08,                              /* [ 94] OBJ_stateOrProvinceName */
-0x55,0x04,0x0A,                              /* [ 97] OBJ_organizationName */
-0x55,0x04,0x0B,                              /* [100] OBJ_organizationalUnitName */
-0x55,0x08,0x01,0x01,                         /* [103] OBJ_rsa */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,     /* [107] OBJ_pkcs7 */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x01,/* [115] OBJ_pkcs7_data */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x02,/* [124] OBJ_pkcs7_signed */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x03,/* [133] OBJ_pkcs7_enveloped */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x04,/* [142] OBJ_pkcs7_signedAndEnveloped */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x05,/* [151] OBJ_pkcs7_digest */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x06,/* [160] OBJ_pkcs7_encrypted */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x03,     /* [169] OBJ_pkcs3 */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x03,0x01,/* [177] OBJ_dhKeyAgreement */
-0x2B,0x0E,0x03,0x02,0x06,                    /* [186] OBJ_des_ecb */
-0x2B,0x0E,0x03,0x02,0x09,                    /* [191] OBJ_des_cfb64 */
-0x2B,0x0E,0x03,0x02,0x07,                    /* [196] OBJ_des_cbc */
-0x2B,0x0E,0x03,0x02,0x11,                    /* [201] OBJ_des_ede */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x03,0x02,     /* [206] OBJ_rc2_cbc */
-0x2B,0x0E,0x03,0x02,0x12,                    /* [214] OBJ_sha */
-0x2B,0x0E,0x03,0x02,0x0F,                    /* [219] OBJ_shaWithRSAEncryption */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x03,0x07,     /* [224] OBJ_des_ede3_cbc */
-0x2B,0x0E,0x03,0x02,0x08,                    /* [232] OBJ_des_ofb64 */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,     /* [237] OBJ_pkcs9 */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x01,/* [245] OBJ_pkcs9_emailAddress */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x02,/* [254] OBJ_pkcs9_unstructuredName */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x03,/* [263] OBJ_pkcs9_contentType */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x04,/* [272] OBJ_pkcs9_messageDigest */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x05,/* [281] OBJ_pkcs9_signingTime */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x06,/* [290] OBJ_pkcs9_countersignature */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x07,/* [299] OBJ_pkcs9_challengePassword */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x08,/* [308] OBJ_pkcs9_unstructuredAddress */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x09,/* [317] OBJ_pkcs9_extCertAttributes */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,          /* [326] OBJ_netscape */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,     /* [333] OBJ_netscape_cert_extension */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x02,     /* [341] OBJ_netscape_data_type */
-0x2B,0x0E,0x03,0x02,0x1A,                    /* [349] OBJ_sha1 */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,/* [354] OBJ_sha1WithRSAEncryption */
-0x2B,0x0E,0x03,0x02,0x0D,                    /* [363] OBJ_dsaWithSHA */
-0x2B,0x0E,0x03,0x02,0x0C,                    /* [368] OBJ_dsa_2 */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x05,0x0B,/* [373] OBJ_pbeWithSHA1AndRC2_CBC */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x05,0x0C,/* [382] OBJ_pbeWithSHA1AndRC4 */
-0x2B,0x0E,0x03,0x02,0x1B,                    /* [391] OBJ_dsaWithSHA1_2 */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x01,/* [396] OBJ_netscape_cert_type */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x02,/* [405] OBJ_netscape_base_url */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x03,/* [414] OBJ_netscape_revocation_url */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x04,/* [423] OBJ_netscape_ca_revocation_url */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x07,/* [432] OBJ_netscape_renewal_url */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x08,/* [441] OBJ_netscape_ca_policy_url */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x0C,/* [450] OBJ_netscape_ssl_server_name */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x0D,/* [459] OBJ_netscape_comment */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x02,0x05,/* [468] OBJ_netscape_cert_sequence */
-0x55,0x1D,                                   /* [477] OBJ_ld_ce */
-0x55,0x1D,0x0E,                              /* [479] OBJ_subject_key_identifier */
-0x55,0x1D,0x0F,                              /* [482] OBJ_key_usage */
-0x55,0x1D,0x10,                              /* [485] OBJ_private_key_usage_period */
-0x55,0x1D,0x11,                              /* [488] OBJ_subject_alt_name */
-0x55,0x1D,0x12,                              /* [491] OBJ_issuer_alt_name */
-0x55,0x1D,0x13,                              /* [494] OBJ_basic_constraints */
-0x55,0x1D,0x14,                              /* [497] OBJ_crl_number */
-0x55,0x1D,0x20,                              /* [500] OBJ_certificate_policies */
-0x55,0x1D,0x23,                              /* [503] OBJ_authority_key_identifier */
-0x55,0x08,0x03,0x65,                         /* [506] OBJ_mdc2 */
-0x55,0x08,0x03,0x64,                         /* [510] OBJ_mdc2WithRSA */
-0x55,0x04,0x2A,                              /* [514] OBJ_givenName */
-0x55,0x04,0x04,                              /* [517] OBJ_surname */
-0x55,0x04,0x2B,                              /* [520] OBJ_initials */
-0x55,0x04,0x2D,                              /* [523] OBJ_uniqueIdentifier */
-0x55,0x1D,0x1F,                              /* [526] OBJ_crl_distribution_points */
-0x2B,0x0E,0x03,0x02,0x03,                    /* [529] OBJ_md5WithRSA */
-0x55,0x04,0x05,                              /* [534] OBJ_serialNumber */
-0x55,0x04,0x0C,                              /* [537] OBJ_title */
-0x55,0x04,0x0D,                              /* [540] OBJ_description */
-0x2A,0x86,0x48,0x86,0xF6,0x7D,0x07,0x42,0x0A,/* [543] OBJ_cast5_cbc */
-0x2A,0x86,0x48,0x86,0xF6,0x7D,0x07,0x42,0x0C,/* [552] OBJ_pbeWithMD5AndCast5_CBC */
-0x2A,0x86,0x48,0xCE,0x38,0x04,0x03,          /* [561] OBJ_dsaWithSHA1 */
-0x2B,0x0E,0x03,0x02,0x1D,                    /* [568] OBJ_sha1WithRSA */
-0x2A,0x86,0x48,0xCE,0x38,0x04,0x01,          /* [573] OBJ_dsa */
-0x2B,0x24,0x03,0x02,0x01,                    /* [580] OBJ_ripemd160 */
-0x2B,0x24,0x03,0x03,0x01,0x02,               /* [585] OBJ_ripemd160WithRSA */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x03,0x08,     /* [591] OBJ_rc5_cbc */
+static unsigned char lvalues[611]={
+0x00,                                        /* [  0] OBJ_undef */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,               /* [  1] OBJ_rsadsi */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,          /* [  7] OBJ_pkcs */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x02,0x02,     /* [ 14] OBJ_md2 */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x02,0x05,     /* [ 22] OBJ_md5 */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x03,0x04,     /* [ 30] OBJ_rc4 */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,/* [ 38] OBJ_rsaEncryption */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x02,/* [ 47] OBJ_md2WithRSAEncryption */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x04,/* [ 56] OBJ_md5WithRSAEncryption */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x05,0x01,/* [ 65] OBJ_pbeWithMD2AndDES_CBC */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x05,0x03,/* [ 74] OBJ_pbeWithMD5AndDES_CBC */
+0x55,                                        /* [ 83] OBJ_X500 */
+0x55,0x04,                                   /* [ 84] OBJ_X509 */
+0x55,0x04,0x03,                              /* [ 86] OBJ_commonName */
+0x55,0x04,0x06,                              /* [ 89] OBJ_countryName */
+0x55,0x04,0x07,                              /* [ 92] OBJ_localityName */
+0x55,0x04,0x08,                              /* [ 95] OBJ_stateOrProvinceName */
+0x55,0x04,0x0A,                              /* [ 98] OBJ_organizationName */
+0x55,0x04,0x0B,                              /* [101] OBJ_organizationalUnitName */
+0x55,0x08,0x01,0x01,                         /* [104] OBJ_rsa */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,     /* [108] OBJ_pkcs7 */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x01,/* [116] OBJ_pkcs7_data */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x02,/* [125] OBJ_pkcs7_signed */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x03,/* [134] OBJ_pkcs7_enveloped */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x04,/* [143] OBJ_pkcs7_signedAndEnveloped */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x05,/* [152] OBJ_pkcs7_digest */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x06,/* [161] OBJ_pkcs7_encrypted */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x03,     /* [170] OBJ_pkcs3 */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x03,0x01,/* [178] OBJ_dhKeyAgreement */
+0x2B,0x0E,0x03,0x02,0x06,                    /* [187] OBJ_des_ecb */
+0x2B,0x0E,0x03,0x02,0x09,                    /* [192] OBJ_des_cfb64 */
+0x2B,0x0E,0x03,0x02,0x07,                    /* [197] OBJ_des_cbc */
+0x2B,0x0E,0x03,0x02,0x11,                    /* [202] OBJ_des_ede */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x03,0x02,     /* [207] OBJ_rc2_cbc */
+0x2B,0x0E,0x03,0x02,0x12,                    /* [215] OBJ_sha */
+0x2B,0x0E,0x03,0x02,0x0F,                    /* [220] OBJ_shaWithRSAEncryption */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x03,0x07,     /* [225] OBJ_des_ede3_cbc */
+0x2B,0x0E,0x03,0x02,0x08,                    /* [233] OBJ_des_ofb64 */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,     /* [238] OBJ_pkcs9 */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x01,/* [246] OBJ_pkcs9_emailAddress */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x02,/* [255] OBJ_pkcs9_unstructuredName */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x03,/* [264] OBJ_pkcs9_contentType */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x04,/* [273] OBJ_pkcs9_messageDigest */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x05,/* [282] OBJ_pkcs9_signingTime */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x06,/* [291] OBJ_pkcs9_countersignature */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x07,/* [300] OBJ_pkcs9_challengePassword */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x08,/* [309] OBJ_pkcs9_unstructuredAddress */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x09,/* [318] OBJ_pkcs9_extCertAttributes */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,          /* [327] OBJ_netscape */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,     /* [334] OBJ_netscape_cert_extension */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x02,     /* [342] OBJ_netscape_data_type */
+0x2B,0x0E,0x03,0x02,0x1A,                    /* [350] OBJ_sha1 */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,/* [355] OBJ_sha1WithRSAEncryption */
+0x2B,0x0E,0x03,0x02,0x0D,                    /* [364] OBJ_dsaWithSHA */
+0x2B,0x0E,0x03,0x02,0x0C,                    /* [369] OBJ_dsa_2 */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x05,0x0B,/* [374] OBJ_pbeWithSHA1AndRC2_CBC */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x05,0x0C,/* [383] OBJ_pbeWithSHA1AndRC4 */
+0x2B,0x0E,0x03,0x02,0x1B,                    /* [392] OBJ_dsaWithSHA1_2 */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x01,/* [397] OBJ_netscape_cert_type */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x02,/* [406] OBJ_netscape_base_url */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x03,/* [415] OBJ_netscape_revocation_url */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x04,/* [424] OBJ_netscape_ca_revocation_url */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x07,/* [433] OBJ_netscape_renewal_url */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x08,/* [442] OBJ_netscape_ca_policy_url */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x0C,/* [451] OBJ_netscape_ssl_server_name */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x0D,/* [460] OBJ_netscape_comment */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x02,0x05,/* [469] OBJ_netscape_cert_sequence */
+0x55,0x1D,                                   /* [478] OBJ_ld_ce */
+0x55,0x1D,0x0E,                              /* [480] OBJ_subject_key_identifier */
+0x55,0x1D,0x0F,                              /* [483] OBJ_key_usage */
+0x55,0x1D,0x10,                              /* [486] OBJ_private_key_usage_period */
+0x55,0x1D,0x11,                              /* [489] OBJ_subject_alt_name */
+0x55,0x1D,0x12,                              /* [492] OBJ_issuer_alt_name */
+0x55,0x1D,0x13,                              /* [495] OBJ_basic_constraints */
+0x55,0x1D,0x14,                              /* [498] OBJ_crl_number */
+0x55,0x1D,0x20,                              /* [501] OBJ_certificate_policies */
+0x55,0x1D,0x23,                              /* [504] OBJ_authority_key_identifier */
+0x55,0x08,0x03,0x65,                         /* [507] OBJ_mdc2 */
+0x55,0x08,0x03,0x64,                         /* [511] OBJ_mdc2WithRSA */
+0x55,0x04,0x2A,                              /* [515] OBJ_givenName */
+0x55,0x04,0x04,                              /* [518] OBJ_surname */
+0x55,0x04,0x2B,                              /* [521] OBJ_initials */
+0x55,0x04,0x2D,                              /* [524] OBJ_uniqueIdentifier */
+0x55,0x1D,0x1F,                              /* [527] OBJ_crl_distribution_points */
+0x2B,0x0E,0x03,0x02,0x03,                    /* [530] OBJ_md5WithRSA */
+0x55,0x04,0x05,                              /* [535] OBJ_serialNumber */
+0x55,0x04,0x0C,                              /* [538] OBJ_title */
+0x55,0x04,0x0D,                              /* [541] OBJ_description */
+0x2A,0x86,0x48,0x86,0xF6,0x7D,0x07,0x42,0x0A,/* [544] OBJ_cast5_cbc */
+0x2A,0x86,0x48,0x86,0xF6,0x7D,0x07,0x42,0x0C,/* [553] OBJ_pbeWithMD5AndCast5_CBC */
+0x2A,0x86,0x48,0xCE,0x38,0x04,0x03,          /* [562] OBJ_dsaWithSHA1 */
+0x2B,0x0E,0x03,0x02,0x1D,                    /* [569] OBJ_sha1WithRSA */
+0x2A,0x86,0x48,0xCE,0x38,0x04,0x01,          /* [574] OBJ_dsa */
+0x2B,0x24,0x03,0x02,0x01,                    /* [581] OBJ_ripemd160 */
+0x2B,0x24,0x03,0x03,0x01,0x02,               /* [586] OBJ_ripemd160WithRSA */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x03,0x08,     /* [592] OBJ_rc5_cbc */
+0x29,0x01,0x01,0x85,0x1A,                    /* [600] OBJ_rle_compression */
+0x29,0x01,0x01,0x85,0x1A,                    /* [605] OBJ_zlib_compression */
 };
 
 static ASN1_OBJECT nid_objs[NUM_NID]={
-{"UNDEF","undefined",NID_undef,0,NULL},
-{"rsadsi","rsadsi",NID_rsadsi,6,&(lvalues[0]),0},
-{"pkcs","pkcs",NID_pkcs,7,&(lvalues[6]),0},
-{"MD2","md2",NID_md2,8,&(lvalues[13]),0},
-{"MD5","md5",NID_md5,8,&(lvalues[21]),0},
-{"RC4","rc4",NID_rc4,8,&(lvalues[29]),0},
-{"rsaEncryption","rsaEncryption",NID_rsaEncryption,9,&(lvalues[37]),0},
+{"UNDEF","undefined",NID_undef,1,&(lvalues[0]),0},
+{"rsadsi","rsadsi",NID_rsadsi,6,&(lvalues[1]),0},
+{"pkcs","pkcs",NID_pkcs,7,&(lvalues[7]),0},
+{"MD2","md2",NID_md2,8,&(lvalues[14]),0},
+{"MD5","md5",NID_md5,8,&(lvalues[22]),0},
+{"RC4","rc4",NID_rc4,8,&(lvalues[30]),0},
+{"rsaEncryption","rsaEncryption",NID_rsaEncryption,9,&(lvalues[38]),0},
 {"RSA-MD2","md2WithRSAEncryption",NID_md2WithRSAEncryption,9,
-       &(lvalues[46]),0},
+       &(lvalues[47]),0},
 {"RSA-MD5","md5WithRSAEncryption",NID_md5WithRSAEncryption,9,
-       &(lvalues[55]),0},
+       &(lvalues[56]),0},
 {"pbeWithMD2AndDES-CBC","pbeWithMD2AndDES-CBC",
-       NID_pbeWithMD2AndDES_CBC,9,&(lvalues[64]),0},
+       NID_pbeWithMD2AndDES_CBC,9,&(lvalues[65]),0},
 {"pbeWithMD5AndDES-CBC","pbeWithMD5AndDES-CBC",
-       NID_pbeWithMD5AndDES_CBC,9,&(lvalues[73]),0},
-{"X500","X500",NID_X500,1,&(lvalues[82]),0},
-{"X509","X509",NID_X509,2,&(lvalues[83]),0},
-{"CN","commonName",NID_commonName,3,&(lvalues[85]),0},
-{"C","countryName",NID_countryName,3,&(lvalues[88]),0},
-{"L","localityName",NID_localityName,3,&(lvalues[91]),0},
-{"ST","stateOrProvinceName",NID_stateOrProvinceName,3,&(lvalues[94]),0},
-{"O","organizationName",NID_organizationName,3,&(lvalues[97]),0},
+       NID_pbeWithMD5AndDES_CBC,9,&(lvalues[74]),0},
+{"X500","X500",NID_X500,1,&(lvalues[83]),0},
+{"X509","X509",NID_X509,2,&(lvalues[84]),0},
+{"CN","commonName",NID_commonName,3,&(lvalues[86]),0},
+{"C","countryName",NID_countryName,3,&(lvalues[89]),0},
+{"L","localityName",NID_localityName,3,&(lvalues[92]),0},
+{"ST","stateOrProvinceName",NID_stateOrProvinceName,3,&(lvalues[95]),0},
+{"O","organizationName",NID_organizationName,3,&(lvalues[98]),0},
 {"OU","organizationalUnitName",NID_organizationalUnitName,3,
-       &(lvalues[100]),0},
-{"RSA","rsa",NID_rsa,4,&(lvalues[103]),0},
-{"pkcs7","pkcs7",NID_pkcs7,8,&(lvalues[107]),0},
-{"pkcs7-data","pkcs7-data",NID_pkcs7_data,9,&(lvalues[115]),0},
+       &(lvalues[101]),0},
+{"RSA","rsa",NID_rsa,4,&(lvalues[104]),0},
+{"pkcs7","pkcs7",NID_pkcs7,8,&(lvalues[108]),0},
+{"pkcs7-data","pkcs7-data",NID_pkcs7_data,9,&(lvalues[116]),0},
 {"pkcs7-signedData","pkcs7-signedData",NID_pkcs7_signed,9,
-       &(lvalues[124]),0},
+       &(lvalues[125]),0},
 {"pkcs7-envelopedData","pkcs7-envelopedData",NID_pkcs7_enveloped,9,
-       &(lvalues[133]),0},
+       &(lvalues[134]),0},
 {"pkcs7-signedAndEnvelopedData","pkcs7-signedAndEnvelopedData",
-       NID_pkcs7_signedAndEnveloped,9,&(lvalues[142]),0},
+       NID_pkcs7_signedAndEnveloped,9,&(lvalues[143]),0},
 {"pkcs7-digestData","pkcs7-digestData",NID_pkcs7_digest,9,
-       &(lvalues[151]),0},
+       &(lvalues[152]),0},
 {"pkcs7-encryptedData","pkcs7-encryptedData",NID_pkcs7_encrypted,9,
-       &(lvalues[160]),0},
-{"pkcs3","pkcs3",NID_pkcs3,8,&(lvalues[169]),0},
+       &(lvalues[161]),0},
+{"pkcs3","pkcs3",NID_pkcs3,8,&(lvalues[170]),0},
 {"dhKeyAgreement","dhKeyAgreement",NID_dhKeyAgreement,9,
-       &(lvalues[177]),0},
-{"DES-ECB","des-ecb",NID_des_ecb,5,&(lvalues[186]),0},
-{"DES-CFB","des-cfb",NID_des_cfb64,5,&(lvalues[191]),0},
-{"DES-CBC","des-cbc",NID_des_cbc,5,&(lvalues[196]),0},
-{"DES-EDE","des-ede",NID_des_ede,5,&(lvalues[201]),0},
+       &(lvalues[178]),0},
+{"DES-ECB","des-ecb",NID_des_ecb,5,&(lvalues[187]),0},
+{"DES-CFB","des-cfb",NID_des_cfb64,5,&(lvalues[192]),0},
+{"DES-CBC","des-cbc",NID_des_cbc,5,&(lvalues[197]),0},
+{"DES-EDE","des-ede",NID_des_ede,5,&(lvalues[202]),0},
 {"DES-EDE3","des-ede3",NID_des_ede3,0,NULL},
 {"IDEA-CBC","idea-cbc",NID_idea_cbc,0,NULL},
 {"IDEA-CFB","idea-cfb",NID_idea_cfb64,0,NULL},
 {"IDEA-ECB","idea-ecb",NID_idea_ecb,0,NULL},
-{"RC2-CBC","rc2-cbc",NID_rc2_cbc,8,&(lvalues[206]),0},
+{"RC2-CBC","rc2-cbc",NID_rc2_cbc,8,&(lvalues[207]),0},
 {"RC2-ECB","rc2-ecb",NID_rc2_ecb,0,NULL},
 {"RC2-CFB","rc2-cfb",NID_rc2_cfb64,0,NULL},
 {"RC2-OFB","rc2-ofb",NID_rc2_ofb64,0,NULL},
-{"SHA","sha",NID_sha,5,&(lvalues[214]),0},
+{"SHA","sha",NID_sha,5,&(lvalues[215]),0},
 {"RSA-SHA","shaWithRSAEncryption",NID_shaWithRSAEncryption,5,
-       &(lvalues[219]),0},
+       &(lvalues[220]),0},
 {"DES-EDE-CBC","des-ede-cbc",NID_des_ede_cbc,0,NULL},
-{"DES-EDE3-CBC","des-ede3-cbc",NID_des_ede3_cbc,8,&(lvalues[224]),0},
-{"DES-OFB","des-ofb",NID_des_ofb64,5,&(lvalues[232]),0},
+{"DES-EDE3-CBC","des-ede3-cbc",NID_des_ede3_cbc,8,&(lvalues[225]),0},
+{"DES-OFB","des-ofb",NID_des_ofb64,5,&(lvalues[233]),0},
 {"IDEA-OFB","idea-ofb",NID_idea_ofb64,0,NULL},
-{"pkcs9","pkcs9",NID_pkcs9,8,&(lvalues[237]),0},
-{"Email","emailAddress",NID_pkcs9_emailAddress,9,&(lvalues[245]),0},
+{"pkcs9","pkcs9",NID_pkcs9,8,&(lvalues[238]),0},
+{"Email","emailAddress",NID_pkcs9_emailAddress,9,&(lvalues[246]),0},
 {"unstructuredName","unstructuredName",NID_pkcs9_unstructuredName,9,
-       &(lvalues[254]),0},
-{"contentType","contentType",NID_pkcs9_contentType,9,&(lvalues[263]),0},
+       &(lvalues[255]),0},
+{"contentType","contentType",NID_pkcs9_contentType,9,&(lvalues[264]),0},
 {"messageDigest","messageDigest",NID_pkcs9_messageDigest,9,
-       &(lvalues[272]),0},
-{"signingTime","signingTime",NID_pkcs9_signingTime,9,&(lvalues[281]),0},
+       &(lvalues[273]),0},
+{"signingTime","signingTime",NID_pkcs9_signingTime,9,&(lvalues[282]),0},
 {"countersignature","countersignature",NID_pkcs9_countersignature,9,
-       &(lvalues[290]),0},
+       &(lvalues[291]),0},
 {"challengePassword","challengePassword",NID_pkcs9_challengePassword,
-       9,&(lvalues[299]),0},
+       9,&(lvalues[300]),0},
 {"unstructuredAddress","unstructuredAddress",
-       NID_pkcs9_unstructuredAddress,9,&(lvalues[308]),0},
+       NID_pkcs9_unstructuredAddress,9,&(lvalues[309]),0},
 {"extendedCertificateAttributes","extendedCertificateAttributes",
-       NID_pkcs9_extCertAttributes,9,&(lvalues[317]),0},
+       NID_pkcs9_extCertAttributes,9,&(lvalues[318]),0},
 {"Netscape","Netscape Communications Corp.",NID_netscape,7,
-       &(lvalues[326]),0},
+       &(lvalues[327]),0},
 {"nsCertExt","Netscape Certificate Extension",
-       NID_netscape_cert_extension,8,&(lvalues[333]),0},
+       NID_netscape_cert_extension,8,&(lvalues[334]),0},
 {"nsDataType","Netscape Data Type",NID_netscape_data_type,8,
-       &(lvalues[341]),0},
+       &(lvalues[342]),0},
 {"DES-EDE-CFB","des-ede-cfb",NID_des_ede_cfb64,0,NULL},
 {"DES-EDE3-CFB","des-ede3-cfb",NID_des_ede3_cfb64,0,NULL},
 {"DES-EDE-OFB","des-ede-ofb",NID_des_ede_ofb64,0,NULL},
 {"DES-EDE3-OFB","des-ede3-ofb",NID_des_ede3_ofb64,0,NULL},
-{"SHA1","sha1",NID_sha1,5,&(lvalues[349]),0},
+{"SHA1","sha1",NID_sha1,5,&(lvalues[350]),0},
 {"RSA-SHA1","sha1WithRSAEncryption",NID_sha1WithRSAEncryption,9,
-       &(lvalues[354]),0},
-{"DSA-SHA","dsaWithSHA",NID_dsaWithSHA,5,&(lvalues[363]),0},
-{"DSA-old","dsaEncryption-old",NID_dsa_2,5,&(lvalues[368]),0},
+       &(lvalues[355]),0},
+{"DSA-SHA","dsaWithSHA",NID_dsaWithSHA,5,&(lvalues[364]),0},
+{"DSA-old","dsaEncryption-old",NID_dsa_2,5,&(lvalues[369]),0},
 {"pbeWithSHA1AndRC2-CBC","pbeWithSHA1AndRC2-CBC",
-       NID_pbeWithSHA1AndRC2_CBC,9,&(lvalues[373]),0},
+       NID_pbeWithSHA1AndRC2_CBC,9,&(lvalues[374]),0},
 {"pbeWithSHA1AndRC4","pbeWithSHA1AndRC4",NID_pbeWithSHA1AndRC4,9,
-       &(lvalues[382]),0},
-{"DSA-SHA1-old","dsaWithSHA1",NID_dsaWithSHA1_2,5,&(lvalues[391]),0},
+       &(lvalues[383]),0},
+{"DSA-SHA1-old","dsaWithSHA1-old",NID_dsaWithSHA1_2,5,&(lvalues[392]),0},
 {"nsCertType","Netscape Cert Type",NID_netscape_cert_type,9,
-       &(lvalues[396]),0},
+       &(lvalues[397]),0},
 {"nsBaseUrl","Netscape Base Url",NID_netscape_base_url,9,
-       &(lvalues[405]),0},
+       &(lvalues[406]),0},
 {"nsRevocationUrl","Netscape Revocation Url",
-       NID_netscape_revocation_url,9,&(lvalues[414]),0},
+       NID_netscape_revocation_url,9,&(lvalues[415]),0},
 {"nsCaRevocationUrl","Netscape CA Revocation Url",
-       NID_netscape_ca_revocation_url,9,&(lvalues[423]),0},
+       NID_netscape_ca_revocation_url,9,&(lvalues[424]),0},
 {"nsRenewalUrl","Netscape Renewal Url",NID_netscape_renewal_url,9,
-       &(lvalues[432]),0},
+       &(lvalues[433]),0},
 {"nsCaPolicyUrl","Netscape CA Policy Url",NID_netscape_ca_policy_url,
-       9,&(lvalues[441]),0},
+       9,&(lvalues[442]),0},
 {"nsSslServerName","Netscape SSL Server Name",
-       NID_netscape_ssl_server_name,9,&(lvalues[450]),0},
-{"nsComment","Netscape Comment",NID_netscape_comment,9,&(lvalues[459]),0},
+       NID_netscape_ssl_server_name,9,&(lvalues[451]),0},
+{"nsComment","Netscape Comment",NID_netscape_comment,9,&(lvalues[460]),0},
 {"nsCertSequence","Netscape Certificate Sequence",
-       NID_netscape_cert_sequence,9,&(lvalues[468]),0},
+       NID_netscape_cert_sequence,9,&(lvalues[469]),0},
 {"DESX-CBC","desx-cbc",NID_desx_cbc,0,NULL},
-{"ld-ce","ld-ce",NID_ld_ce,2,&(lvalues[477]),0},
+{"ld-ce","ld-ce",NID_ld_ce,2,&(lvalues[478]),0},
 {"subjectKeyIdentifier","X509v3 Subject Key Identifier",
-       NID_subject_key_identifier,3,&(lvalues[479]),0},
-{"keyUsage","X509v3 Key Usage",NID_key_usage,3,&(lvalues[482]),0},
+       NID_subject_key_identifier,3,&(lvalues[480]),0},
+{"keyUsage","X509v3 Key Usage",NID_key_usage,3,&(lvalues[483]),0},
 {"privateKeyUsagePeriod","X509v3 Private Key Usage Period",
-       NID_private_key_usage_period,3,&(lvalues[485]),0},
+       NID_private_key_usage_period,3,&(lvalues[486]),0},
 {"subjectAltName","X509v3 Subject Alternative Name",
-       NID_subject_alt_name,3,&(lvalues[488]),0},
+       NID_subject_alt_name,3,&(lvalues[489]),0},
 {"issuerAltName","X509v3 Issuer Alternative Name",NID_issuer_alt_name,
-       3,&(lvalues[491]),0},
+       3,&(lvalues[492]),0},
 {"basicConstraints","X509v3 Basic Constraints",NID_basic_constraints,
-       3,&(lvalues[494]),0},
-{"crlNumber","X509v3 CRL Number",NID_crl_number,3,&(lvalues[497]),0},
+       3,&(lvalues[495]),0},
+{"crlNumber","X509v3 CRL Number",NID_crl_number,3,&(lvalues[498]),0},
 {"certificatePolicies","X509v3 Certificate Policies",
-       NID_certificate_policies,3,&(lvalues[500]),0},
+       NID_certificate_policies,3,&(lvalues[501]),0},
 {"authorityKeyIdentifier","X509v3 Authority Key Identifier",
-       NID_authority_key_identifier,3,&(lvalues[503]),0},
+       NID_authority_key_identifier,3,&(lvalues[504]),0},
 {"BF-CBC","bf-cbc",NID_bf_cbc,0,NULL},
 {"BF-ECB","bf-ecb",NID_bf_ecb,0,NULL},
 {"BF-CFB","bf-cfb",NID_bf_cfb64,0,NULL},
 {"BF-OFB","bf-ofb",NID_bf_ofb64,0,NULL},
-{"MDC2","mdc2",NID_mdc2,4,&(lvalues[506]),0},
-{"RSA-MDC2","mdc2withRSA",NID_mdc2WithRSA,4,&(lvalues[510]),0},
+{"MDC2","mdc2",NID_mdc2,4,&(lvalues[507]),0},
+{"RSA-MDC2","mdc2withRSA",NID_mdc2WithRSA,4,&(lvalues[511]),0},
 {"RC4-40","rc4-40",NID_rc4_40,0,NULL},
 {"RC2-40-CBC","rc2-40-cbc",NID_rc2_40_cbc,0,NULL},
-{"G","givenName",NID_givenName,3,&(lvalues[514]),0},
-{"S","surname",NID_surname,3,&(lvalues[517]),0},
-{"I","initials",NID_initials,3,&(lvalues[520]),0},
-{"UID","uniqueIdentifier",NID_uniqueIdentifier,3,&(lvalues[523]),0},
+{"G","givenName",NID_givenName,3,&(lvalues[515]),0},
+{"S","surname",NID_surname,3,&(lvalues[518]),0},
+{"I","initials",NID_initials,3,&(lvalues[521]),0},
+{"UID","uniqueIdentifier",NID_uniqueIdentifier,3,&(lvalues[524]),0},
 {"crlDistributionPoints","X509v3 CRL Distribution Points",
-       NID_crl_distribution_points,3,&(lvalues[526]),0},
-{"RSA-NP-MD5","md5WithRSA",NID_md5WithRSA,5,&(lvalues[529]),0},
-{"SN","serialNumber",NID_serialNumber,3,&(lvalues[534]),0},
-{"T","title",NID_title,3,&(lvalues[537]),0},
-{"D","description",NID_description,3,&(lvalues[540]),0},
-{"CAST5-CBC","cast5-cbc",NID_cast5_cbc,9,&(lvalues[543]),0},
+       NID_crl_distribution_points,3,&(lvalues[527]),0},
+{"RSA-NP-MD5","md5WithRSA",NID_md5WithRSA,5,&(lvalues[530]),0},
+{"SN","serialNumber",NID_serialNumber,3,&(lvalues[535]),0},
+{"T","title",NID_title,3,&(lvalues[538]),0},
+{"D","description",NID_description,3,&(lvalues[541]),0},
+{"CAST5-CBC","cast5-cbc",NID_cast5_cbc,9,&(lvalues[544]),0},
 {"CAST5-ECB","cast5-ecb",NID_cast5_ecb,0,NULL},
 {"CAST5-CFB","cast5-cfb",NID_cast5_cfb64,0,NULL},
 {"CAST5-OFB","cast5-ofb",NID_cast5_ofb64,0,NULL},
 {"pbeWithMD5AndCast5CBC","pbeWithMD5AndCast5CBC",
-       NID_pbeWithMD5AndCast5_CBC,9,&(lvalues[552]),0},
-{"DSA-SHA1","dsaWithSHA1",NID_dsaWithSHA1,7,&(lvalues[561]),0},
+       NID_pbeWithMD5AndCast5_CBC,9,&(lvalues[553]),0},
+{"DSA-SHA1","dsaWithSHA1",NID_dsaWithSHA1,7,&(lvalues[562]),0},
 {"MD5-SHA1","md5-sha1",NID_md5_sha1,0,NULL},
-{"RSA-SHA1-2","sha1WithRSA",NID_sha1WithRSA,5,&(lvalues[568]),0},
-{"DSA","dsaEncryption",NID_dsa,7,&(lvalues[573]),0},
-{"RIPEMD160","ripemd160",NID_ripemd160,5,&(lvalues[580]),0},
+{"RSA-SHA1-2","sha1WithRSA",NID_sha1WithRSA,5,&(lvalues[569]),0},
+{"DSA","dsaEncryption",NID_dsa,7,&(lvalues[574]),0},
+{"RIPEMD160","ripemd160",NID_ripemd160,5,&(lvalues[581]),0},
 {NULL,NULL,NID_undef,0,NULL},
 {"RSA-RIPEMD160","ripemd160WithRSA",NID_ripemd160WithRSA,6,
-       &(lvalues[585]),0},
-{"RC5-CBC","rc5-cbc",NID_rc5_cbc,8,&(lvalues[591]),0},
+       &(lvalues[586]),0},
+{"RC5-CBC","rc5-cbc",NID_rc5_cbc,8,&(lvalues[592]),0},
 {"RC5-ECB","rc5-ecb",NID_rc5_ecb,0,NULL},
 {"RC5-CFB","rc5-cfb",NID_rc5_cfb64,0,NULL},
 {"RC5-OFB","rc5-ofb",NID_rc5_ofb64,0,NULL},
+{"RLE","run length compression",NID_rle_compression,5,&(lvalues[600]),0},
+{"ZLIB","zlib compression",NID_zlib_compression,5,&(lvalues[605]),0},
 };
 
 static ASN1_OBJECT *sn_objs[NUM_SN]={
@@ -390,6 +395,7 @@ static ASN1_OBJECT *sn_objs[NUM_SN]={
 &(nid_objs[121]),/* "RC5-ECB" */
 &(nid_objs[123]),/* "RC5-OFB" */
 &(nid_objs[117]),/* "RIPEMD160" */
+&(nid_objs[124]),/* "RLE" */
 &(nid_objs[19]),/* "RSA" */
 &(nid_objs[ 7]),/* "RSA-MD2" */
 &(nid_objs[ 8]),/* "RSA-MD5" */
@@ -407,6 +413,7 @@ static ASN1_OBJECT *sn_objs[NUM_SN]={
 &(nid_objs[106]),/* "T" */
 &(nid_objs[102]),/* "UID" */
 &(nid_objs[ 0]),/* "UNDEF" */
+&(nid_objs[125]),/* "ZLIB" */
 &(nid_objs[90]),/* "authorityKeyIdentifier" */
 &(nid_objs[87]),/* "basicConstraints" */
 &(nid_objs[89]),/* "certificatePolicies" */
@@ -487,8 +494,8 @@ static ASN1_OBJECT *ln_objs[NUM_LN]={
 &(nid_objs[116]),/* "dsaEncryption" */
 &(nid_objs[67]),/* "dsaEncryption-old" */
 &(nid_objs[66]),/* "dsaWithSHA" */
-&(nid_objs[70]),/* "dsaWithSHA1" */
 &(nid_objs[113]),/* "dsaWithSHA1" */
+&(nid_objs[70]),/* "dsaWithSHA1-old" */
 &(nid_objs[48]),/* "emailAddress" */
 &(nid_objs[56]),/* "extendedCertificateAttributes" */
 &(nid_objs[99]),/* "givenName" */
@@ -540,6 +547,7 @@ static ASN1_OBJECT *ln_objs[NUM_LN]={
 &(nid_objs[19]),/* "rsa" */
 &(nid_objs[ 6]),/* "rsaEncryption" */
 &(nid_objs[ 1]),/* "rsadsi" */
+&(nid_objs[124]),/* "run length compression" */
 &(nid_objs[105]),/* "serialNumber" */
 &(nid_objs[41]),/* "sha" */
 &(nid_objs[64]),/* "sha1" */
@@ -554,9 +562,11 @@ static ASN1_OBJECT *ln_objs[NUM_LN]={
 &(nid_objs[102]),/* "uniqueIdentifier" */
 &(nid_objs[55]),/* "unstructuredAddress" */
 &(nid_objs[49]),/* "unstructuredName" */
+&(nid_objs[125]),/* "zlib compression" */
 };
 
 static ASN1_OBJECT *obj_objs[NUM_OBJ]={
+&(nid_objs[ 0]),/* OBJ_undef                        0 */
 &(nid_objs[11]),/* OBJ_X500                         2 5 */
 &(nid_objs[12]),/* OBJ_X509                         2 5 4 */
 &(nid_objs[81]),/* OBJ_ld_ce                        2 5 29 */
@@ -586,6 +596,8 @@ static ASN1_OBJECT *obj_objs[NUM_OBJ]={
 &(nid_objs[19]),/* OBJ_rsa                          2 5 8 1 1 */
 &(nid_objs[96]),/* OBJ_mdc2WithRSA                  2 5 8 3 100 */
 &(nid_objs[95]),/* OBJ_mdc2                         2 5 8 3 101 */
+&(nid_objs[124]),/* OBJ_rle_compression              1 1 1 1 666.1 */
+&(nid_objs[125]),/* OBJ_zlib_compression             1 1 1 1 666.2 */
 &(nid_objs[104]),/* OBJ_md5WithRSA                   1 3 14 3 2 3 */
 &(nid_objs[29]),/* OBJ_des_ecb                      1 3 14 3 2 6 */
 &(nid_objs[31]),/* OBJ_des_cbc                      1 3 14 3 2 7 */
index 45206c616cc43049d73235b36f40f521864aa8f8..56253060213110633c40b43fe9a7a254c5e99fe4 100644 (file)
@@ -84,8 +84,8 @@ void ERR_load_OBJ_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_OBJ,OBJ_str_functs);
index 0a9c756197947e34e7b6189c5b879164cdbad9a3..16ff85209537407838720d56a66c77aaf6628a9f 100644 (file)
@@ -101,7 +101,7 @@ ASN1_OBJECT *o;
                memcpy(r->sn,o->sn,i);
                }
        r->flags=o->flags|(ASN1_OBJECT_FLAG_DYNAMIC|
-               ASN1_OBJECT_FLAG_DYNAMIC_STRINGS);
+               ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|ASN1_OBJECT_FLAG_DYNAMIC_DATA);
        return(r);
 err:
        OBJerr(OBJ_F_OBJ_DUP,ERR_R_MALLOC_FAILURE);
index e1d555b47c31b8f2241b1aae70ae0c14724b65e7..8e1a9d3fa130208d2d2d4abdba881d14ea7a2a1f 100644 (file)
@@ -66,6 +66,7 @@ extern "C" {
 #define SN_undef                       "UNDEF"
 #define LN_undef                       "undefined"
 #define NID_undef                      0
+#define OBJ_undef                      0L
 
 #define SN_Algorithm                   "Algorithm"
 #define LN_algorithm                   "algorithm"
@@ -389,7 +390,7 @@ extern "C" {
 #define OBJ_pbeWithSHA1AndRC4          OBJ_pkcs,5L,12L 
 
 #define SN_dsaWithSHA1_2               "DSA-SHA1-old"
-#define LN_dsaWithSHA1_2               "dsaWithSHA1"
+#define LN_dsaWithSHA1_2               "dsaWithSHA1-old"
 #define NID_dsaWithSHA1_2              70
 /* Got this one from 'sdn706r20.pdf' which is actually an NSA document :-) */
 #define OBJ_dsaWithSHA1_2              OBJ_algorithm,27L
@@ -654,13 +655,49 @@ extern "C" {
 #define LN_rc5_ofb64                   "rc5-ofb"
 #define NID_rc5_ofb64                  123
 
+#define SN_rle_compression             "RLE"
+#define LN_rle_compression             "run length compression"
+#define NID_rle_compression            124
+#define OBJ_rle_compression            1L,1L,1L,1L,666L.1L
+
+#define SN_zlib_compression            "ZLIB"
+#define LN_zlib_compression            "zlib compression"
+#define NID_zlib_compression           125
+#define OBJ_zlib_compression           1L,1L,1L,1L,666L.2L
+
 #include "bio.h"
 #include "asn1.h"
 
+#define        OBJ_NAME_TYPE_UNDEF             0x00
+#define        OBJ_NAME_TYPE_MD_METH           0x01
+#define        OBJ_NAME_TYPE_CIPHER_METH       0x02
+#define        OBJ_NAME_TYPE_PKEY_METH         0x03
+#define        OBJ_NAME_TYPE_COMP_METH         0x04
+#define        OBJ_NAME_TYPE_NUM               0x05
+
+#define        OBJ_NAME_ALIAS          0x8000
+
+
+typedef struct obj_name_st
+       {
+       int type;
+       int alias;
+       char *name;
+       char *data;
+       } OBJ_NAME;
+
 #define                OBJ_create_and_add_object(a,b,c) OBJ_create(a,b,c)
 
 #ifndef NOPROTO
 
+int OBJ_NAME_init(void);
+int OBJ_NAME_new_index(unsigned long (*hash_func)(),int (*cmp_func)(),
+       void (*free_func)());
+char *OBJ_NAME_get(char *name,int type);
+int OBJ_NAME_add(char *name,int type,char *data);
+int OBJ_NAME_remove(char *name,int type);
+void OBJ_NAME_cleanup(int type); /* -1 for everything */
+
 ASN1_OBJECT *  OBJ_dup(ASN1_OBJECT *o);
 ASN1_OBJECT *  OBJ_nid2obj(int n);
 char *         OBJ_nid2ln(int n);
@@ -682,6 +719,13 @@ int                OBJ_create_objects(BIO *in);
 
 #else
 
+int OBJ_NAME_init();
+int OBJ_NAME_new_index();
+char *OBJ_NAME_get();
+int OBJ_NAME_add();
+int OBJ_NAME_remove();
+void OBJ_NAME_cleanup();
+
 ASN1_OBJECT *  OBJ_dup();
 ASN1_OBJECT *  OBJ_nid2obj();
 char *         OBJ_nid2ln();
diff --git a/crypto/pem/gmon.out b/crypto/pem/gmon.out
new file mode 100644 (file)
index 0000000..f26186d
Binary files /dev/null and b/crypto/pem/gmon.out differ
index e17fcdb540d11bebb91bd6e37342a27f45d647ae..1bd5c16c843067b31607b7484ba585d981042505 100644 (file)
@@ -110,8 +110,8 @@ void ERR_load_PEM_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_PEM,PEM_str_functs);
index 7a2c0ad83be39abfa5dd32b2f69a4469944be966..790847144dcfcf123315da53d17bfb748f363ac0 100644 (file)
@@ -68,7 +68,7 @@
 #include "des.h"
 #endif
 
-char *PEM_version="PEM part of SSLeay 0.9.0b 29-Jun-1998";
+char *PEM_version="PEM part of SSLeay 0.9.1a 06-Jul-1998";
 
 #define MIN_LENGTH     4
 
diff --git a/crypto/perlasm/alpha.pl b/crypto/perlasm/alpha.pl
new file mode 100644 (file)
index 0000000..3dac571
--- /dev/null
@@ -0,0 +1,434 @@
+#!/usr/local/bin/perl
+
+package alpha;
+use Carp qw(croak cluck);
+
+$label="100";
+
+$n_debug=0;
+$smear_regs=1;
+$reg_alloc=1;
+
+$align="3";
+$com_start="#";
+
+sub main'asm_init_output { @out=(); }
+sub main'asm_get_output { return(@out); }
+sub main'get_labels { return(@labels); }
+sub main'external_label { push(@labels,@_); }
+
+# General registers
+
+%regs=(        'r0',   '$0',
+       'r1',   '$1',
+       'r2',   '$2',
+       'r3',   '$3',
+       'r4',   '$4',
+       'r5',   '$5',
+       'r6',   '$6',
+       'r7',   '$7',
+       'r8',   '$8',
+       'r9',   '$22',
+       'r10',  '$23',
+       'r11',  '$24',
+       'r12',  '$25',
+       'r13',  '$27',
+       'r14',  '$28',
+       'r15',  '$21', # argc == 5
+       'r16',  '$20', # argc == 4
+       'r17',  '$19', # argc == 3
+       'r18',  '$18', # argc == 2
+       'r19',  '$17', # argc == 1
+       'r20',  '$16', # argc == 0
+       'r21',  '$9',  # save 0
+       'r22',  '$10', # save 1
+       'r23',  '$11', # save 2
+       'r24',  '$12', # save 3
+       'r25',  '$13', # save 4
+       'r26',  '$14', # save 5
+
+       'a0',   '$16',
+       'a1',   '$17',
+       'a2',   '$18',
+       'a3',   '$19',
+       'a4',   '$20',
+       'a5',   '$21',
+
+       's0',   '$9',
+       's1',   '$10',
+       's2',   '$11',
+       's3',   '$12',
+       's4',   '$13',
+       's5',   '$14',
+       'zero', '$31',
+       'sp',   '$30',
+       );
+
+$main'reg_s0="r21";
+$main'reg_s1="r22";
+$main'reg_s2="r23";
+$main'reg_s3="r24";
+$main'reg_s4="r25";
+$main'reg_s5="r26";
+
+@reg=(  '$0', '$1' ,'$2' ,'$3' ,'$4' ,'$5' ,'$6' ,'$7' ,'$8',
+       '$22','$23','$24','$25','$20','$21','$27','$28');
+
+
+sub main'sub   { &out3("subq",@_); }
+sub main'add   { &out3("addq",@_); }
+sub main'mov   { &out3("bis",$_[0],$_[0],$_[1]); }
+sub main'or    { &out3("bis",@_); }
+sub main'bis   { &out3("bis",@_); }
+sub main'br    { &out1("br",@_); }
+sub main'ld    { &out2("ldq",@_); }
+sub main'st    { &out2("stq",@_); }
+sub main'cmpult        { &out3("cmpult",@_); }
+sub main'cmplt { &out3("cmplt",@_); }
+sub main'bgt   { &out2("bgt",@_); }
+sub main'ble   { &out2("ble",@_); }
+sub main'blt   { &out2("blt",@_); }
+sub main'mul   { &out3("mulq",@_); }
+sub main'muh   { &out3("umulh",@_); }
+
+$main'QWS=8;
+
+sub main'asm_add
+       {
+       push(@out,@_);
+       }
+
+sub main'asm_finish
+       {
+       &main'file_end();
+       print &main'asm_get_output();
+       }
+
+sub main'asm_init
+       {
+       ($type,$fn)=@_;
+       $filename=$fn;
+
+       &main'asm_init_output();
+       &main'comment("Don't even think of reading this code");
+       &main'comment("It was automatically generated by $filename");
+       &main'comment("Which is a perl program used to generate the alpha assember.");
+       &main'comment("eric <eay\@cryptsoft.com>");
+       &main'comment("");
+
+       $filename =~ s/\.pl$//;
+       &main'file($filename);
+       }
+
+sub conv
+       {
+       local($r)=@_;
+       local($v);
+
+       return($regs{$r}) if defined($regs{$r});
+       return($r);
+       }
+
+sub main'QWPw
+       {
+       local($off,$reg)=@_;
+
+       return(&main'QWP($off*8,$reg));
+       }
+
+sub main'QWP
+       {
+       local($off,$reg)=@_;
+
+       $ret="$off(".&conv($reg).")";
+       return($ret);
+       }
+
+sub out3
+       {
+       local($name,$p1,$p2,$p3)=@_;
+
+       $p1=&conv($p1);
+       $p2=&conv($p2);
+       $p3=&conv($p3);
+       push(@out,"\t$name\t");
+       $l=length($p1)+1;
+       push(@out,$p1.",");
+       $ll=3-($l+9)/8;
+       $tmp1=sprintf("\t" x $ll);
+       push(@out,$tmp1);
+
+       $l=length($p2)+1;
+       push(@out,$p2.",");
+       $ll=3-($l+9)/8;
+       $tmp1=sprintf("\t" x $ll);
+       push(@out,$tmp1);
+
+       push(@out,&conv($p3)."\n");
+       }
+
+sub out2
+       {
+       local($name,$p1,$p2,$p3)=@_;
+
+       $p1=&conv($p1);
+       $p2=&conv($p2);
+       push(@out,"\t$name\t");
+       $l=length($p1)+1;
+       push(@out,$p1.",");
+       $ll=3-($l+9)/8;
+       $tmp1=sprintf("\t" x $ll);
+       push(@out,$tmp1);
+
+       push(@out,&conv($p2)."\n");
+       }
+
+sub out1
+       {
+       local($name,$p1)=@_;
+
+       $p1=&conv($p1);
+       push(@out,"\t$name\t".$p1."\n");
+       }
+
+sub out0
+       {
+       push(@out,"\t$_[0]\n");
+       }
+
+sub main'file
+       {
+       local($file)=@_;
+
+       local($tmp)=<<"EOF";
+ # DEC Alpha assember
+ # Generated from perl scripts contains in SSLeay
+       .file   1 "$file.s"
+       .set noat
+EOF
+       push(@out,$tmp);
+       }
+
+sub main'function_begin
+       {
+       local($func)=@_;
+
+print STDERR "$func\n";
+       local($tmp)=<<"EOF";
+       .text
+       .align $align
+       .globl $func
+       .ent $func
+${func}:
+${func}..ng:
+       .frame \$30,0,\$26,0
+       .prologue 0
+EOF
+       push(@out,$tmp);
+       $stack=0;
+       }
+
+sub main'function_end
+       {
+       local($func)=@_;
+
+       local($tmp)=<<"EOF";
+       ret     \$31,(\$26),1
+       .end $func
+EOF
+       push(@out,$tmp);
+       $stack=0;
+       %label=();
+       }
+
+sub main'function_end_A
+       {
+       local($func)=@_;
+
+       local($tmp)=<<"EOF";
+       ret     \$31,(\$26),1
+EOF
+       push(@out,$tmp);
+       }
+
+sub main'function_end_B
+       {
+       local($func)=@_;
+
+       $func=$under.$func;
+
+       push(@out,"\t.end $func\n");
+       $stack=0;
+       %label=();
+       }
+
+sub main'wparam
+       {
+       local($num)=@_;
+
+       if ($num < 6)
+               {
+               $num=20-$num;
+               return("r$num");
+               }
+       else
+               { return(&main'QWP($stack+$num*8,"sp")); }
+       }
+
+sub main'stack_push
+       {
+       local($num)=@_;
+       $stack+=$num*8;
+       &main'sub("sp",$num*8,"sp");
+       }
+
+sub main'stack_pop
+       {
+       local($num)=@_;
+       $stack-=$num*8;
+       &main'add("sp",$num*8,"sp");
+       }
+
+sub main'swtmp
+       {
+       return(&main'QWP(($_[0])*8,"sp"));
+       }
+
+# Should use swtmp, which is above sp.  Linix can trash the stack above esp
+#sub main'wtmp
+#      {
+#      local($num)=@_;
+#
+#      return(&main'QWP(-($num+1)*4,"esp","",0));
+#      }
+
+sub main'comment
+       {
+       foreach (@_)
+               {
+               if (/^\s*$/)
+                       { push(@out,"\n"); }
+               else
+                       { push(@out,"\t$com_start $_ $com_end\n"); }
+               }
+       }
+
+sub main'label
+       {
+       if (!defined($label{$_[0]}))
+               {
+               $label{$_[0]}=$label;
+               $label++;
+               }
+       return('$'.$label{$_[0]});
+       }
+
+sub main'set_label
+       {
+       if (!defined($label{$_[0]}))
+               {
+               $label{$_[0]}=$label;
+               $label++;
+               }
+#      push(@out,".align $align\n") if ($_[1] != 0);
+       push(@out,'$'."$label{$_[0]}:\n");
+       }
+
+sub main'file_end
+       {
+       }
+
+sub main'data_word
+       {
+       push(@out,"\t.long $_[0]\n");
+       }
+
+@pool_free=();
+@pool_taken=();
+$curr_num=0;
+$max=0;
+
+sub main'init_pool
+       {
+       local($args)=@_;
+       local($i);
+
+       @pool_free=();
+       for ($i=(14+(6-$args)); $i >= 0; $i--)
+               {
+               push(@pool_free,"r$i");
+               }
+       print STDERR "START :register pool:@pool_free\n";
+       $curr_num=$max=0;
+       }
+
+sub main'fin_pool
+       {
+       printf STDERR "END %2d:register pool:@pool_free\n",$max;
+       }
+
+sub main'GR
+       {
+       local($r)=@_;
+       local($i,@n,$_);
+
+       foreach (@pool_free)
+               {
+               if ($r ne $_)
+                       { push(@n,$_); }
+               else
+                       {
+                       $curr_num++;
+                       $max=$curr_num if ($curr_num > $max);
+                       }
+               }
+       @pool_free=@n;
+print STDERR "GR:@pool_free\n" if $reg_alloc;
+       return(@_);
+       }
+
+sub main'NR
+       {
+       local($num)=@_;
+       local(@ret);
+
+       $num=1 if $num == 0;
+       ($#pool_free >= ($num-1)) || croak "out of registers: want $num, have @pool_free";
+       while ($num > 0)
+               {
+               push(@ret,pop @pool_free);
+               $curr_num++;
+               $max=$curr_num if ($curr_num > $max);
+               $num--
+               }
+       print STDERR "nr @ret\n" if $n_debug;
+print STDERR "NR:@pool_free\n" if $reg_alloc;
+       return(@ret);
+
+       }
+
+sub main'FR
+       {
+       local(@r)=@_;
+       local(@a,$v,$w);
+
+       print STDERR "fr @r\n" if $n_debug;
+#      cluck "fr @r";
+       for $w (@pool_free)
+               {
+               foreach $v (@r)
+                       {
+                       croak "double register free of $v (@pool_free)" if $w eq $v;
+                       }
+               }
+       foreach $v (@r)
+               {
+               croak "bad argument to FR" if ($v !~ /^r\d+$/);
+               if ($smear_regs)
+                       { unshift(@pool_free,$v); }
+               else    { push(@pool_free,$v); }
+               $curr_num--;
+               }
+print STDERR "FR:@pool_free\n" if $reg_alloc;
+       }
+1;
diff --git a/crypto/perlasm/f b/crypto/perlasm/f
new file mode 100644 (file)
index 0000000..80da809
--- /dev/null
@@ -0,0 +1,19 @@
+sub out3
+       {
+       local($name,$p1,$p2,$p3)=@_;
+
+       push(@out,"\t$name\t");
+       $l=length($p1)+1;
+       push(@out,$p1.",");
+       $ll=4-($l+9)/8;
+       $tmp1=sprintf("\t" x $ll);
+       push(@out,$tmp1);
+
+       $l=length($p2)+1;
+       push(@out,$p2.",");
+       $ll=4-($l+9)/8;
+       $tmp1=sprintf("\t" x $ll);
+       push(@out,$tmp1);
+
+       push(@out,&conv($p3)."\n");
+       }
diff --git a/crypto/pkcs7/bio_ber.c b/crypto/pkcs7/bio_ber.c
new file mode 100644 (file)
index 0000000..df4d9a5
--- /dev/null
@@ -0,0 +1,479 @@
+/* crypto/evp/bio_ber.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include "cryptlib.h"
+#include "buffer.h"
+#include "evp.h"
+
+#ifndef NOPROTO
+static int ber_write(BIO *h,char *buf,int num);
+static int ber_read(BIO *h,char *buf,int size);
+/*static int ber_puts(BIO *h,char *str); */
+/*static int ber_gets(BIO *h,char *str,int size); */
+static long ber_ctrl(BIO *h,int cmd,long arg1,char *arg2);
+static int ber_new(BIO *h);
+static int ber_free(BIO *data);
+#else
+static int ber_write();
+static int ber_read();
+/*static int ber_puts(); */
+/*static int ber_gets(); */
+static long ber_ctrl();
+static int ber_new();
+static int ber_free();
+#endif
+
+#define BER_BUF_SIZE   (32)
+
+/* This is used to hold the state of the BER objects being read. */
+typedef struct ber_struct
+       {
+       int tag;
+       int class;
+       long length;
+       int inf;
+       int num_left;
+       int depth;
+       } BER_CTX;
+
+typedef struct bio_ber_struct
+       {
+       int tag;
+       int class;
+       long length;
+       int inf;
+
+       /* most of the following are used when doing non-blocking IO */
+       /* reading */
+       long num_left;  /* number of bytes still to read/write in block */
+       int depth;      /* used with idefinite encoding. */
+       int finished;   /* No more read data */
+
+       /* writting */ 
+       char *w_addr;
+       int w_offset;
+       int w_left;
+
+       int buf_len;
+       int buf_off;
+       unsigned char buf[BER_BUF_SIZE];
+       } BIO_BER_CTX;
+
+static BIO_METHOD methods_ber=
+       {
+       BIO_TYPE_CIPHER,"cipher",
+       ber_write,
+       ber_read,
+       NULL, /* ber_puts, */
+       NULL, /* ber_gets, */
+       ber_ctrl,
+       ber_new,
+       ber_free,
+       };
+
+BIO_METHOD *BIO_f_ber()
+       {
+       return(&methods_ber);
+       }
+
+static int ber_new(bi)
+BIO *bi;
+       {
+       BIO_BER_CTX *ctx;
+
+       ctx=(BIO_BER_CTX *)Malloc(sizeof(BIO_BER_CTX));
+       if (ctx == NULL) return(0);
+
+       memset((char *)ctx,0,sizeof(BIO_BER_CTX));
+
+       bi->init=0;
+       bi->ptr=(char *)ctx;
+       bi->flags=0;
+       return(1);
+       }
+
+static int ber_free(a)
+BIO *a;
+       {
+       BIO_BER_CTX *b;
+
+       if (a == NULL) return(0);
+       b=(BIO_BER_CTX *)a->ptr;
+       memset(a->ptr,0,sizeof(BIO_BER_CTX));
+       Free(a->ptr);
+       a->ptr=NULL;
+       a->init=0;
+       a->flags=0;
+       return(1);
+       }
+
+int bio_ber_get_header(bio,ctx)
+BIO *bio;
+BIO_BER_CTX *ctx;
+       {
+       char buf[64];
+       int i,j,n;
+       int ret;
+       unsigned char *p;
+       unsigned long length
+       int tag;
+       int class;
+       long max;
+
+       BIO_clear_retry_flags(b);
+
+       /* Pack the buffer down if there is a hole at the front */
+       if (ctx->buf_off != 0)
+               {
+               p=ctx->buf;
+               j=ctx->buf_off;
+               n=ctx->buf_len-j;
+               for (i=0; i<n; i++)
+                       {
+                       p[0]=p[j];
+                       p++;
+                       }
+               ctx->buf_len-j;
+               ctx->buf_off=0;
+               }
+
+       /* If there is more room, read some more data */
+       i=BER_BUF_SIZE-ctx->buf_len;
+       if (i)
+               {
+               i=BIO_read(bio->next_bio,&(ctx->buf[ctx->buf_len]),i);
+               if (i <= 0)
+                       {
+                       BIO_copy_next_retry(b);
+                       return(i);
+                       }
+               else
+                       ctx->buf_len+=i;
+               }
+
+       max=ctx->buf_len;
+       p=ctx->buf;
+       ret=ASN1_get_object(&p,&length,&tag,&class,max);
+
+       if (ret & 0x80)
+               {
+               if ((ctx->buf_len < BER_BUF_SIZE) &&
+                       (ERR_GET_REASON(ERR_peek_error()) == ASN1_R_TOO_LONG))
+                       {
+                       ERR_get_error(); /* clear the error */
+                       BIO_set_retry_read(b);
+                       }
+               return(-1);
+               }
+
+       /* We have no error, we have a header, so make use of it */
+
+       if ((ctx->tag  >= 0) && (ctx->tag != tag))
+               {
+               BIOerr(BIO_F_BIO_BER_GET_HEADER,BIO_R_TAG_MISMATCH);
+               sprintf(buf,"tag=%d, got %d",ctx->tag,tag);
+               ERR_add_error_data(1,buf);
+               return(-1);
+               }
+       if (ret & 0x01)
+       if (ret & V_ASN1_CONSTRUCTED)
+       }
+       
+static int ber_read(b,out,outl)
+BIO *b;
+char *out;
+int outl;
+       {
+       int ret=0,i,n;
+       BIO_BER_CTX *ctx;
+
+       BIO_clear_retry_flags(b);
+
+       if (out == NULL) return(0);
+       ctx=(BIO_BER_CTX *)b->ptr;
+
+       if ((ctx == NULL) || (b->next_bio == NULL)) return(0);
+
+       if (ctx->finished) return(0);
+
+again:
+       /* First see if we are half way through reading a block */
+       if (ctx->num_left > 0)
+               {
+               if (ctx->num_left < outl)
+                       n=ctx->num_left;
+               else
+                       n=outl;
+               i=BIO_read(b->next_bio,out,n);
+               if (i <= 0)
+                       {
+                       BIO_copy_next_retry(b);
+                       return(i);
+                       }
+               ctx->num_left-=i;
+               outl-=i;
+               ret+=i;
+               if (ctx->num_left <= 0)
+                       {
+                       ctx->depth--;
+                       if (ctx->depth <= 0)
+                               ctx->finished=1;
+                       }
+               if (outl <= 0)
+                       return(ret);
+               else
+                       goto again;
+               }
+       else    /* we need to read another BER header */
+               {
+               }
+       }
+
+static int ber_write(b,in,inl)
+BIO *b;
+char *in;
+int inl;
+       {
+       int ret=0,n,i;
+       BIO_ENC_CTX *ctx;
+
+       ctx=(BIO_ENC_CTX *)b->ptr;
+       ret=inl;
+
+       BIO_clear_retry_flags(b);
+       n=ctx->buf_len-ctx->buf_off;
+       while (n > 0)
+               {
+               i=BIO_write(b->next_bio,&(ctx->buf[ctx->buf_off]),n);
+               if (i <= 0)
+                       {
+                       BIO_copy_next_retry(b);
+                       return(i);
+                       }
+               ctx->buf_off+=i;
+               n-=i;
+               }
+       /* at this point all pending data has been written */
+
+       if ((in == NULL) || (inl <= 0)) return(0);
+
+       ctx->buf_off=0;
+       while (inl > 0)
+               {
+               n=(inl > ENC_BLOCK_SIZE)?ENC_BLOCK_SIZE:inl;
+               EVP_CipherUpdate(&(ctx->cipher),
+                       (unsigned char *)ctx->buf,&ctx->buf_len,
+                       (unsigned char *)in,n);
+               inl-=n;
+               in+=n;
+
+               ctx->buf_off=0;
+               n=ctx->buf_len;
+               while (n > 0)
+                       {
+                       i=BIO_write(b->next_bio,&(ctx->buf[ctx->buf_off]),n);
+                       if (i <= 0)
+                               {
+                               BIO_copy_next_retry(b);
+                               return(i);
+                               }
+                       n-=i;
+                       ctx->buf_off+=i;
+                       }
+               ctx->buf_len=0;
+               ctx->buf_off=0;
+               }
+       BIO_copy_next_retry(b);
+       return(ret);
+       }
+
+static long ber_ctrl(b,cmd,num,ptr)
+BIO *b;
+int cmd;
+long num;
+char *ptr;
+       {
+       BIO *dbio;
+       BIO_ENC_CTX *ctx,*dctx;
+       long ret=1;
+       int i;
+
+       ctx=(BIO_ENC_CTX *)b->ptr;
+
+       switch (cmd)
+               {
+       case BIO_CTRL_RESET:
+               ctx->ok=1;
+               ctx->finished=0;
+               EVP_CipherInit(&(ctx->cipher),NULL,NULL,NULL,
+                       ctx->cipher.berrypt);
+               ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
+               break;
+       case BIO_CTRL_EOF:      /* More to read */
+               if (ctx->cont <= 0)
+                       ret=1;
+               else
+                       ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
+               break;
+       case BIO_CTRL_WPENDING:
+               ret=ctx->buf_len-ctx->buf_off;
+               if (ret <= 0)
+                       ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
+               break;
+       case BIO_CTRL_PENDING: /* More to read in buffer */
+               ret=ctx->buf_len-ctx->buf_off;
+               if (ret <= 0)
+                       ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
+               break;
+       case BIO_CTRL_FLUSH:
+               /* do a final write */
+again:
+               while (ctx->buf_len != ctx->buf_off)
+                       {
+                       i=ber_write(b,NULL,0);
+                       if (i < 0)
+                               {
+                               ret=i;
+                               break;
+                               }
+                       }
+
+               if (!ctx->finished)
+                       {
+                       ctx->finished=1;
+                       ctx->buf_off=0;
+                       ret=EVP_CipherFinal(&(ctx->cipher),
+                               (unsigned char *)ctx->buf,
+                               &(ctx->buf_len));
+                       ctx->ok=(int)ret;
+                       if (ret <= 0) break;
+
+                       /* push out the bytes */
+                       goto again;
+                       }
+               
+               /* Finally flush the underlying BIO */
+               ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
+               break;
+       case BIO_C_GET_CIPHER_STATUS:
+               ret=(long)ctx->ok;
+               break;
+       case BIO_C_DO_STATE_MACHINE:
+               BIO_clear_retry_flags(b);
+               ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
+               BIO_copy_next_retry(b);
+               break;
+
+       case BIO_CTRL_DUP:
+               dbio=(BIO *)ptr;
+               dctx=(BIO_ENC_CTX *)dbio->ptr;
+               memcpy(&(dctx->cipher),&(ctx->cipher),sizeof(ctx->cipher));
+               dbio->init=1;
+               break;
+       default:
+               ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
+               break;
+               }
+       return(ret);
+       }
+
+/*
+void BIO_set_cipher_ctx(b,c)
+BIO *b;
+EVP_CIPHER_ctx *c;
+       {
+       if (b == NULL) return;
+
+       if ((b->callback != NULL) &&
+               (b->callback(b,BIO_CB_CTRL,(char *)c,BIO_CTRL_SET,e,0L) <= 0))
+               return;
+
+       b->init=1;
+       ctx=(BIO_ENC_CTX *)b->ptr;
+       memcpy(ctx->cipher,c,sizeof(EVP_CIPHER_CTX));
+       
+       if (b->callback != NULL)
+               b->callback(b,BIO_CB_CTRL,(char *)c,BIO_CTRL_SET,e,1L);
+       }
+*/
+
+void BIO_set_cipher(b,c,k,i,e)
+BIO *b;
+EVP_CIPHER *c;
+unsigned char *k;
+unsigned char *i;
+int e;
+       {
+       BIO_ENC_CTX *ctx;
+
+       if (b == NULL) return;
+
+       if ((b->callback != NULL) &&
+               (b->callback(b,BIO_CB_CTRL,(char *)c,BIO_CTRL_SET,e,0L) <= 0))
+               return;
+
+       b->init=1;
+       ctx=(BIO_ENC_CTX *)b->ptr;
+       EVP_CipherInit(&(ctx->cipher),c,k,i,e);
+       
+       if (b->callback != NULL)
+               b->callback(b,BIO_CB_CTRL,(char *)c,BIO_CTRL_SET,e,1L);
+       }
+
diff --git a/crypto/pkcs7/build b/crypto/pkcs7/build
new file mode 100755 (executable)
index 0000000..05eb70f
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh -x
+
+make
+gcc -I../../include -g -o enc enc.c ../../libcrypto.a
+gcc -I../../include -g -o dec dec.c ../../libcrypto.a
diff --git a/crypto/pkcs7/dec.c b/crypto/pkcs7/dec.c
new file mode 100644 (file)
index 0000000..2622cbd
--- /dev/null
@@ -0,0 +1,245 @@
+/* crypto/pkcs7/verify.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+#include <stdio.h>
+#include "asn1.h"
+#include "bio.h"
+#include "x509.h"
+#include "pem.h"
+
+int verify_callback(int ok, X509_STORE_CTX *ctx);
+
+BIO *bio_err=NULL;
+
+main(argc,argv)
+int argc;
+char *argv[];
+       {
+       BIO *in;
+       X509 *x509,*x;
+       EVP_PKEY *pkey;
+       PKCS7 *p7;
+       PKCS7_SIGNED *s;
+       PKCS7_SIGNER_INFO *si;
+       PKCS7_ISSUER_AND_SERIAL *ias;
+       X509_STORE_CTX cert_ctx;
+       X509_STORE *cert_store=NULL;
+       X509_LOOKUP *lookup=NULL;
+       BIO *data,*detached=NULL,*p7bio=NULL;
+       char buf[1024*4];
+       unsigned char *p,*pp;
+       int i,j,printit=0;
+       STACK *sk;
+
+       SSLeay_add_all_algorithms();
+       bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
+       EVP_add_digest(EVP_sha1());
+       EVP_add_cipher(EVP_des_ede3_cbc());
+
+        if ((in=BIO_new_file("server.pem","r")) == NULL) goto err;
+        if ((x509=PEM_read_bio_X509(in,NULL,NULL)) == NULL) goto err;
+        BIO_reset(in);
+        if ((pkey=PEM_read_bio_PrivateKey(in,NULL,NULL)) == NULL) goto err;
+        BIO_free(in);
+
+       data=BIO_new(BIO_s_file());
+again:
+       pp=NULL;
+       while (argc > 1)
+               {
+               argc--;
+               argv++;
+               if (strcmp(argv[0],"-p") == 0)
+                       {
+                       printit=1;
+                       }
+               else if ((strcmp(argv[0],"-d") == 0) && (argc >= 2))
+                       {
+                       detached=BIO_new(BIO_s_file());
+                       if (!BIO_read_filename(detached,argv[1]))
+                               goto err;
+                       argc--;
+                       argv++;
+                       }
+               else
+                       {
+                       pp=argv[0];
+                       if (!BIO_read_filename(data,argv[0]))
+                               goto err;
+                       }
+               }
+
+       if (pp == NULL)
+               BIO_set_fp(data,stdin,BIO_NOCLOSE);
+
+
+       /* Load the PKCS7 object from a file */
+       if ((p7=PEM_read_bio_PKCS7(data,NULL,NULL)) == NULL) goto err;
+
+
+
+       /* This stuff is being setup for certificate verification.
+        * When using SSL, it could be replaced with a 
+        * cert_stre=SSL_CTX_get_cert_store(ssl_ctx); */
+       cert_store=X509_STORE_new();
+       X509_STORE_set_default_paths(cert_store);
+       X509_STORE_load_locations(cert_store,NULL,"../../certs");
+       X509_STORE_set_verify_cb_func(cert_store,verify_callback);
+
+       ERR_clear_error();
+
+       /* We need to process the data */
+       /* We cannot support detached encryption */
+       p7bio=PKCS7_dataDecode(p7,pkey,detached,cert_store);
+       
+       if (p7bio == NULL)
+               {
+               printf("problems decoding\n");
+               goto err;
+               }
+
+       /* We now have to 'read' from p7bio to calculate digests etc. */
+       for (;;)
+               {
+               i=BIO_read(p7bio,buf,sizeof(buf));
+               /* print it? */
+               if (i <= 0) break;
+               write(fileno(stdout),buf,i);
+               }
+
+       /* We can now verify signatures */
+       sk=PKCS7_get_signer_info(p7);
+       if (sk == NULL)
+               {
+               printf("there are no signatures on this data\n");
+               }
+       else
+               {
+               /* Ok, first we need to, for each subject entry,
+                * see if we can verify */
+               ERR_clear_error();
+               for (i=0; i<sk_num(sk); i++)
+                       {
+                       si=(PKCS7_SIGNER_INFO *)sk_value(sk,i);
+                       i=PKCS7_dataVerify(cert_store,&cert_ctx,p7bio,p7,si);
+                       if (i <= 0)
+                               goto err;
+                       else
+                               fprintf(stderr,"Signature verified\n");
+                       }
+               }
+       X509_STORE_free(cert_store);
+
+       exit(0);
+err:
+       ERR_load_crypto_strings();
+       ERR_print_errors_fp(stderr);
+       exit(1);
+       }
+
+/* should be X509 * but we can just have them as char *. */
+int verify_callback(ok, ctx)
+int ok;
+X509_STORE_CTX *ctx;
+       {
+       char buf[256];
+       X509 *err_cert;
+       int err,depth;
+
+       err_cert=X509_STORE_CTX_get_current_cert(ctx);
+       err=    X509_STORE_CTX_get_error(ctx);
+       depth=  X509_STORE_CTX_get_error_depth(ctx);
+
+       X509_NAME_oneline(X509_get_subject_name(err_cert),buf,256);
+       BIO_printf(bio_err,"depth=%d %s\n",depth,buf);
+       if (!ok)
+               {
+               BIO_printf(bio_err,"verify error:num=%d:%s\n",err,
+                       X509_verify_cert_error_string(err));
+               if (depth < 6)
+                       {
+                       ok=1;
+                       X509_STORE_CTX_set_error(ctx,X509_V_OK);
+                       }
+               else
+                       {
+                       ok=0;
+                       X509_STORE_CTX_set_error(ctx,X509_V_ERR_CERT_CHAIN_TOO_LONG);
+                       }
+               }
+       switch (ctx->error)
+               {
+       case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
+               X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert),buf,256);
+               BIO_printf(bio_err,"issuer= %s\n",buf);
+               break;
+       case X509_V_ERR_CERT_NOT_YET_VALID:
+       case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
+               BIO_printf(bio_err,"notBefore=");
+               ASN1_UTCTIME_print(bio_err,X509_get_notBefore(ctx->current_cert));
+               BIO_printf(bio_err,"\n");
+               break;
+       case X509_V_ERR_CERT_HAS_EXPIRED:
+       case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
+               BIO_printf(bio_err,"notAfter=");
+               ASN1_UTCTIME_print(bio_err,X509_get_notAfter(ctx->current_cert));
+               BIO_printf(bio_err,"\n");
+               break;
+               }
+       BIO_printf(bio_err,"verify return:%d\n",ok);
+       return(ok);
+       }
diff --git a/crypto/pkcs7/des.pem b/crypto/pkcs7/des.pem
new file mode 100644 (file)
index 0000000..62d1657
--- /dev/null
@@ -0,0 +1,15 @@
+
+MIAGCSqGSIb3DQEHA6CAMIACAQAxggHmMIHwAgEAMIGZMIGSMQswCQYDVQQGEwJBVTETMBEG
+A1UECBMKUXVlZW5zbGFuZDERMA8GA1UEBxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29m
+dCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNUUkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQD
+ExJERU1PIFpFUk8gVkFMVUUgQ0ECAgR+MA0GCSqGSIb3DQEBAQUABEC2vXI1xQDW6lUHM3zQ
+/9uBEBOO5A3TtkrklAXq7v01gsIC21t52qSk36REXY+slhNZ0OQ349tgkTsoETHFLoEwMIHw
+AgEAMIGZMIGSMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDERMA8GA1UEBxMI
+QnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29mdCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNU
+UkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQDExJERU1PIFpFUk8gVkFMVUUgQ0ECAgR9MA0G
+CSqGSIb3DQEBAQUABEB8ujxbabxXUYJhopuDm3oDq4JNqX6Io4p3ro+ShqfIndsXTZ1v5a2N
+WtLLCWlHn/habjBwZ/DgQgcKASbZ7QxNMIAGCSqGSIb3DQEHATAaBggqhkiG9w0DAjAOAgIA
+oAQIbsL5v1wX98KggAQoAaJ4WHm68fXY1WE5OIjfVBIDpO1K+i8dmKhjnAjrjoyZ9Bwc8rDL
+lgQg4CXb805h5xl+GfvSwUaHJayte1m2mcOhs3J2YyqbQ+MEIMIiJQccmhO3oDKm36CFvYR8
+5PjpclVcZyX2ngbwPFMnBAgy0clOAE6UKAAAAAAAAAAAAAA=
+
index 625a7c2285226b6ee83c3dd17848658afd4328d0..8c3f937cfcfc6695a7230a08febc118cbd1fc7bc 100644 (file)
@@ -73,10 +73,10 @@ char *argv[];
        BIO *data,*p7bio;
        char buf[1024*4];
        int i,j;
-       int nodetach=0;
+       int nodetach=1;
 
        EVP_add_digest(EVP_sha1());
-       EVP_add_cipher(EVP_des_cbc());
+       EVP_add_cipher(EVP_des_ede3_cbc());
 
        data=BIO_new(BIO_s_file());
 again:
@@ -105,7 +105,7 @@ again:
         
        if (PKCS7_add_signature(p7,x509,pkey,EVP_sha1()) == NULL) goto err;
 
-       if (!PKCS7_set_cipher(p7,EVP_des_cbc())) goto err;
+       if (!PKCS7_set_cipher(p7,EVP_des_ede3_cbc())) goto err;
        if (PKCS7_add_recipient(p7,x509) == NULL) goto err;
 
        /* we may want to add more */
@@ -129,7 +129,7 @@ again:
                }
        BIO_flush(p7bio);
 
-       if (!PKCS7_dataSign(p7,p7bio)) goto err;
+       if (!PKCS7_dataFinal(p7,p7bio)) goto err;
        BIO_free(p7bio);
 
        PEM_write_PKCS7(stdout,p7);
diff --git a/crypto/pkcs7/es1.pem b/crypto/pkcs7/es1.pem
new file mode 100644 (file)
index 0000000..47112a2
--- /dev/null
@@ -0,0 +1,66 @@
+-----BEGIN PKCS7-----
+MIAGCSqGSIb3DQEHA6CAMIACAQAxggHmMIHwAgEAMIGZMIGSMQswCQYDVQQGEwJBVTETMBEG
+A1UECBMKUXVlZW5zbGFuZDERMA8GA1UEBxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29m
+dCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNUUkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQD
+ExJERU1PIFpFUk8gVkFMVUUgQ0ECAgRuMA0GCSqGSIb3DQEBAQUABEDWak0y/5XZJhQJeCLo
+KECcHXkTEbjzYkYNHIinbiPmRK4QbNfs9z2mA3z/c2ykQ4eAqFR2jyNrUMN/+I5XEiv6MIHw
+AgEAMIGZMIGSMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDERMA8GA1UEBxMI
+QnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29mdCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNU
+UkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQDExJERU1PIFpFUk8gVkFMVUUgQ0ECAgR9MA0G
+CSqGSIb3DQEBAQUABEAWg9+KgtCjc77Jdj1Ve4wGgHjVHbbSYEA1ZqKFDoi15vSr9hfpHmC4
+ycZzcRo16JkTfolefiHZzmyjVz94vSN6MIAGCSqGSIb3DQEHATAaBggqhkiG9w0DAjAOAgIA
+oAQI7X4Tk4mcbV6ggASBsHl1mCaJ3RhXWlNPCgCRU53d7M5x6TDZRkvwdtdvW96m1lupT03F
+XtonkBqk7oMkH7kGfs5/REQOPjx0QE2Ixmgt1W3szum82EZwA7pZNppcraK7W/odw/7bYZO+
+II3HPmRklE2N9qiu1LPaPUsnYogkO6SennyeL5tZ382vBweL/8pnG0qsbT1OBb65v+llnsjT
+pa1T/p+fIx/iJJGE6K9fYFokC6gXLQ6ozXRdOu5oBDB8mPCYYvAqKycidM/MrGGUkpEtS4f0
+lS31PwQi5YTim8Ig3/TOwVpPX32i46FTuEIEIMHkD/OvpfwCCzXUHHJnKnKUAUvIsSY3vGBs
+8ezpUDfBBBj9LHDy32hZ2tQilkDefP5VM2LLdrWgamYEgfiyITQvn08Ul5lQOQxbFKBheFq5
+otCCN4MR+w5eq12xQu6y+f9z0159ag2ru87D0lLtUtXXtCELbO1nUkT2sJ0k/iDs9TOXr6Cx
+go1XKYho83hlkXYiCteVizdAbgVGNsNRD4wtIdajsorET/LuJECgp11YeL9w1dlDB0HLEZfi
+XCsUphH4jGagba3hDeUSibnjSiJlN0ukfuQurBBbI2UkBAujiEAubKPn7C1FZJRSw6CPPX5t
+KEpmcqT1JNk6LO8Js6/1sCmmBh1VGCy1+EuTI9J1p7Dagf4nQ8cHitoCRpHuKZlFHnZyv7tw
+Rn/KOhHaYP2VzAh40gQIvKMAAWh9oFsEEIMwIoOmLwLH5wf+8QdbDhoECH8HwZt9a12dBAjL
+r4j2zlvtfgQIt7nmEM3wz1EECKlc3EIy1irCBBCAKINcermK3A+jI6ISN2RzBFA3dsh/xwMu
+l61aWMBBZzEz/SF92k6n35KZhCC0d6fIVC/1WMv0fnCwQ8oEDynSre216VEFiYKBaQLJe5o/
+mTAxC7Ht3goXnuc+i1FItOkLrgRI/wyvTICEn2WsNZiMADnGaee2bqPnUopo+VMGexJEtCPk
+l0ZNlDJGquPDkpUwaEtecVZzCNyVPYyyF4J/l8rmGDhDdYUIC8IKBEg/ip/E0BuubBLWVbv+
+HRl4QrnGpyCyeXRXXK603QP3sT1Zbbm1v5pI/loOhVHi724LmtXHSyp5qv9MDcxE1PoX10LY
+gBRtlwwESPeCF8bK5jk4xIQMhK5NMHj1Y1KQWTZ9NGITBL4hjRq2qp4Qk5GIpGgOVPopAuCo
+TIyPikpqBRNtLSPRSsDs6QPUPzWBh6JgxwRQblnDKKUkxUcnJiD4i9QtGa/ZabMn4KxtNOBL
+5JSh1nJkaLXCZY070131WWPAByLcd5TiXq8x84pmzV5NNk4tiMpoXhJNsx8e4rskQQlKd6ME
+SCe2eYDHKcKPX3WJbUzhrJSQ92/aWnI2iUY8WQ+kSNyiZ2QUjyuUg9Z66g/0d2STlvPOBHT/
+y5ODP2CwbcWX4QmCbUc9TT66fQRIrRVuwvtOfnUueyGgYhJ3HpAJfVaB/7kap5bj7Fi/azW4
+9JDfd1bC/W9h0Kyk7RO2gxvE0hIHc26mZJHTm9MNP5D328MnM2MdBEjKjQBtgrp+lFIii7MP
+nGHFTKUkG4WAIZJCf/CsT+p6/SW0qG71Me/YcSw5STB24j+a+HgMV8RVIeUlkP4z0IWWrSoB
+Gh4d/Z0EUMCVHs/HZ/bWgiyhtHpvuVAzidm8D81p1LJ5BQX5/5f/m+q5+fS/npL27dTEbNqs
+LSB6ij3MZAi7LwHWpTn9zWnDajCMEj9vlaV7mcKtHK5iBEg85agFi1h3MvicqLtoFe5hVv9T
+tG0j6CRkjkixPzivltlrf44KHv14gLM0XJxCGyq7vd3l8QYr3+9at0zNnX/yqTiBnsnE5dUE
+SIgrYuz87M2gi/ER9PcDoTtONH3+CkcqVy03q/Sj8cVWD/b1KgEhqnNOfc8Ak9PctyR/ItcR
+8Me5XVn1GJKkQJk4O29fxvgNoAQIrIESvUWGshAEQByXiFoFTDUByjTlgjcy77H1lrH+y3P/
+wAInJjJAut9kCNyGJV0PA4kdPB5USWltuO6t8gk4Pd2YBMl09zqUWkAEUCjFrtZ3mapjcGZI
+uQTASKR5LSjXoWxTT5gae/+64MerF/oCEeO3ehRTpjnPrsiRDo0rWIQTaj9+Nro8Z2xtWstw
+RnfoAHIxV1lEamPwjsceBEi2SD9hiifFeO5ECiVoaE1FdXUXhU+jwYAMx6jHWO9hMkYzS9pM
+Y3IyWR5ybtOjiQgkUdvRJPUPGf5DVVMPnymGX25aDh5PYpIESPbsM9akCpOOVuscywcUswmU
+o7dXvlB48WWCfg/al3BQKAZbn5ZXtWNwpUZkrEdHsrxAVv3rxRcdkT3Z1fzUbIuYkLJN200o
+WgRIJvn6RO8KEj7/HOg2sYuuM8nz1kR0TSgwX7/0y/7JfjBa0JIlP7o75sNJscE8oyoIMzuy
+Dvn6/U9g3BCDXn83A/s+ke60qn9gBFC6NAeLOlXal1YVWYhMQNOqCyUfAjiXBTawaysQb1Mk
+YgeNlF8xuEFcUQWIP+vNG7FJ5JPMaMRL4YEoaQ3sVFhYOERJR1cSb+8xt4QCYtBKQgRIUOmJ
+CHW5o1hXJWJiTkZK2qWFcEMzTINSj5EpYFySr8aVBjkRnI7vxegRT/+XZZXoYedQ3UNsnGI3
+DdkWii5VzX0PNF6C60pfBEiVpausYuX7Wjb3Lfm8cBj7GgN69i6Pm2gxtobVcmpo2nS4D714
+ePyhlX9n8kJ6QAcqWMRj22smDPrHVGNTizfzHBh5zNllK9gESJizILOWI327og3ZWp+qUht5
+kNDJCzMK7Z09UAy+h+vq0VTQuEo3FgLzVdqkJujjSL4Nx97lXg51AovrEn3nd4evydwcjKLX
+1wRIo72NaeWuUEQ+rt1SlCsOJ7k1ioJSqhrPOfvwcaFcb4beVet1JWiy4yvowTjLDGbUje2s
+xjrlVt4BJWI/uA6jbQsrxSe89ADZBAi5YAlR4qszeAQIXD3VSBVKbRUECNTtyvw9vvqXBAhb
+IZNn4H4cxgQI+XW7GkfL+ekECCCCg2reMyGDBAh1PYqkg3lw3gQQkNlggEPU+BH8eh7Gm7n7
+7AQIjC5EWbkil5cEEKcpuqwTWww/X89KnQAg8TcECJPomqHvrlZFBBiRSuIiHpmN+PaujXpv
+qZV2VhjkB2j09GEECOIdv8AVOJgKBAjlHgIqAD9jZQQIXHbs44+wogcEIGGqTACRJxrhMcMG
+X8drNjksIPt+snxTXUBIkTVpZWoABAh6unXPTyIr8QQgBF8xKoX27MWk7iTNmkSNZggZXa2a
+DWCGHSYLngbSOHIECD9XmO6VsvTgBAjfqB70CEW4WwQIVIBkbCocznUEEHB/zFXy/sR4OYHe
+UfbNPnIEEDWBB/NTCLMGE+o8BfyujcAECFik7GQnnF9VBBAhLXExQeWAofZNc6NtN7qZBCC1
+gVIS3ruTwKltmcrgx3heT3M8ZJhCfWa+6KzchnmKygQQ+1NL5sSzR4m/fdrqxHFyUAQYCT2x
+PamQr3wK3h0lyZER+4H0zPM86AhFBBC3CkmvL2vjflMfujnzPBVpBBge9rMbI5+0q9DLrTiT
+5F3AIgXLpD8PQWAECHkHVo6RomV3BAgMbi8E271UeAQIqtS8wnI3XngECG3TWmOMb3/iBEha
+y+mvCS6I3n3JfL8e1B5P4qX9/czJRaERLuKpGNjLiL4A+zxN0LZ0UHd0qfmJjwOTxAx3iJAC
+lGXX4nB9ATYPUT5EU+o1Y4sECN01pP6vWNIdBDAsiE0Ts8/9ltJlqX2B3AoOM4qOt9EaCjXf
+lB+aEmrhtjUwuZ6GqS5Ke7P6XnakTk4ECCLIMatNdootAAAAAAAAAAAAAA==
+-----END PKCS7-----
diff --git a/crypto/pkcs7/example.c b/crypto/pkcs7/example.c
new file mode 100644 (file)
index 0000000..9309e1d
--- /dev/null
@@ -0,0 +1,357 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include "pkcs7.h"
+
+int add_signed_time(si)
+PKCS7_SIGNER_INFO *si;
+       {
+       ASN1_UTCTIME *sign_time;
+
+       /* The last parameter is the amount to add/subtract from the current
+        * time (in seconds) */
+       sign_time=X509_gmtime_adj(NULL,0);
+       PKCS7_add_signed_attribute(si,NID_pkcs9_signingTime,
+               V_ASN1_UTCTIME,(char *)sign_time);
+       return(1);
+       }
+
+ASN1_UTCTIME *get_signed_time(si)
+PKCS7_SIGNER_INFO *si;
+       {
+       ASN1_TYPE *so;
+       ASN1_UTCTIME *ut;
+
+       so=PKCS7_get_signed_attribute(si,NID_pkcs9_signingTime);
+       if (so->type == V_ASN1_UTCTIME)
+               {
+               ut=so->value.utctime;
+               }
+       return(ut);
+       }
+       
+static int signed_string_nid= -1;
+
+int add_signed_string(si,str)
+PKCS7_SIGNER_INFO *si;
+char *str;
+       {
+       ASN1_OCTET_STRING *os;
+
+       /* To a an object of OID 1.2.3.4.5, which is an octet string */
+       if (signed_string_nid == -1)
+               signed_string_nid=
+                       OBJ_create("1.2.3.4.5","OID_example","Our example OID");
+       os=ASN1_OCTET_STRING_new();
+       ASN1_OCTET_STRING_set(os,str,strlen(str));
+       /* When we add, we do not free */
+       PKCS7_add_signed_attribute(si,signed_string_nid,
+               V_ASN1_OCTET_STRING,(char *)os);
+       }
+
+int get_signed_string(si,buf,len)
+PKCS7_SIGNER_INFO *si;
+char *buf;
+int len;
+       {
+       ASN1_TYPE *so;
+       ASN1_OCTET_STRING *os;
+       int i;
+
+       if (signed_string_nid == -1)
+               signed_string_nid=
+                       OBJ_create("1.2.3.4.5","OID_example","Our example OID");
+       /* To retrieve */
+       so=PKCS7_get_signed_attribute(si,signed_string_nid);
+       if (so != NULL)
+               {
+               if (so->type == V_ASN1_OCTET_STRING)
+                       {
+                       os=so->value.octet_string;
+                       i=os->length;
+                       if ((i+1) > len)
+                               i=len-1;
+                       memcpy(buf,os->data,i);
+                       return(i);
+                       }
+               }
+       return(0);
+       }
+
+static signed_seq2string_nid= -1;
+/* ########################################### */
+int add_signed_seq2string(si,str1,str2)
+PKCS7_SIGNER_INFO *si;
+char *str1;
+char *str2;
+       /* To add an object of OID 1.9.999, which is a sequence containing
+        * 2 octet strings */
+       {
+       unsigned char *p;
+       ASN1_OCTET_STRING *os1,*os2;
+       ASN1_STRING *seq;
+       char *data;
+       int i,total;
+
+       if (signed_seq2string_nid == -1)
+               signed_seq2string_nid=
+                       OBJ_create("1.9.9999","OID_example","Our example OID");
+
+       os1=ASN1_OCTET_STRING_new();
+       os2=ASN1_OCTET_STRING_new();
+       ASN1_OCTET_STRING_set(os1,str1,strlen(str1));
+       ASN1_OCTET_STRING_set(os2,str1,strlen(str1));
+       i =i2d_ASN1_OCTET_STRING(os1,NULL);
+       i+=i2d_ASN1_OCTET_STRING(os2,NULL);
+       total=ASN1_object_size(1,i,V_ASN1_SEQUENCE);
+
+       data=malloc(total);
+       p=data;
+       ASN1_put_object(&p,1,i,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);
+       i2d_ASN1_OCTET_STRING(os1,&p);
+       i2d_ASN1_OCTET_STRING(os2,&p);
+
+       seq=ASN1_STRING_new();
+       ASN1_STRING_set(seq,data,total);
+       free(data);
+       ASN1_OCTET_STRING_free(os1);
+       ASN1_OCTET_STRING_free(os2);
+
+       PKCS7_add_signed_attribute(si,signed_seq2string_nid,
+               V_ASN1_SEQUENCE,(char *)seq);
+       return(1);
+       }
+
+/* For this case, I will malloc the return strings */
+int get_signed_seq2string(si,str1,str2)
+PKCS7_SIGNER_INFO *si;
+char **str1;
+char **str2;
+       {
+       ASN1_TYPE *so;
+
+       if (signed_seq2string_nid == -1)
+               signed_seq2string_nid=
+                       OBJ_create("1.9.9999","OID_example","Our example OID");
+       /* To retrieve */
+       so=PKCS7_get_signed_attribute(si,signed_seq2string_nid);
+       if (so->type == V_ASN1_SEQUENCE)
+               {
+               ASN1_CTX c;
+               ASN1_STRING *s;
+               long length;
+               ASN1_OCTET_STRING *os1,*os2;
+
+               s=so->value.sequence;
+               c.p=ASN1_STRING_data(s);
+               c.max=c.p+ASN1_STRING_length(s);
+               if (!asn1_GetSequence(&c,&length)) goto err;
+               /* Length is the length of the seqence */
+
+               c.q=c.p;
+               if ((os1=d2i_ASN1_OCTET_STRING(NULL,&c.p,c.slen)) == NULL) 
+                       goto err;
+               c.slen-=(c.p-c.q);
+
+               c.q=c.p;
+               if ((os2=d2i_ASN1_OCTET_STRING(NULL,&c.p,c.slen)) == NULL) 
+                       goto err;
+               c.slen-=(c.p-c.q);
+
+               if (!asn1_Finish(&c)) goto err;
+               *str1=malloc(os1->length+1);
+               *str2=malloc(os2->length+1);
+               memcpy(*str1,os1->data,os1->length);
+               memcpy(*str2,os2->data,os2->length);
+               (*str1)[os1->length]='\0';
+               (*str2)[os2->length]='\0';
+               ASN1_OCTET_STRING_free(os1);
+               ASN1_OCTET_STRING_free(os2);
+               return(1);
+               }
+err:
+       return(0);
+       }
+
+
+/* #######################################
+ * THE OTHER WAY TO DO THINGS
+ * #######################################
+ */
+X509_ATTRIBUTE *create_time()
+       {
+       ASN1_UTCTIME *sign_time;
+       X509_ATTRIBUTE *ret;
+
+       /* The last parameter is the amount to add/subtract from the current
+        * time (in seconds) */
+       sign_time=X509_gmtime_adj(NULL,0);
+       ret=X509_ATTRIBUTE_create(NID_pkcs9_signingTime,
+               V_ASN1_UTCTIME,(char *)sign_time);
+       return(ret);
+       }
+
+ASN1_UTCTIME *sk_get_time(sk)
+STACK *sk;
+       {
+       ASN1_TYPE *so;
+       ASN1_UTCTIME *ut;
+       PKCS7_SIGNER_INFO si;
+
+       si.auth_attr=sk;
+       so=PKCS7_get_signed_attribute(&si,NID_pkcs9_signingTime);
+       if (so->type == V_ASN1_UTCTIME)
+               {
+               ut=so->value.utctime;
+               }
+       return(ut);
+       }
+       
+X509_ATTRIBUTE *create_string(si,str)
+char *str;
+       {
+       ASN1_OCTET_STRING *os;
+       X509_ATTRIBUTE *ret;
+
+       /* To a an object of OID 1.2.3.4.5, which is an octet string */
+       if (signed_string_nid == -1)
+               signed_string_nid=
+                       OBJ_create("1.2.3.4.5","OID_example","Our example OID");
+       os=ASN1_OCTET_STRING_new();
+       ASN1_OCTET_STRING_set(os,str,strlen(str));
+       /* When we add, we do not free */
+       ret=X509_ATTRIBUTE_create(signed_string_nid,
+               V_ASN1_OCTET_STRING,(char *)os);
+       return(ret);
+       }
+
+int sk_get_string(sk,buf,len)
+STACK *sk;
+char *buf;
+int len;
+       {
+       ASN1_TYPE *so;
+       ASN1_OCTET_STRING *os;
+       int i;
+       PKCS7_SIGNER_INFO si;
+
+       si.auth_attr=sk;
+
+       if (signed_string_nid == -1)
+               signed_string_nid=
+                       OBJ_create("1.2.3.4.5","OID_example","Our example OID");
+       /* To retrieve */
+       so=PKCS7_get_signed_attribute(&si,signed_string_nid);
+       if (so != NULL)
+               {
+               if (so->type == V_ASN1_OCTET_STRING)
+                       {
+                       os=so->value.octet_string;
+                       i=os->length;
+                       if ((i+1) > len)
+                               i=len-1;
+                       memcpy(buf,os->data,i);
+                       return(i);
+                       }
+               }
+       return(0);
+       }
+
+X509_ATTRIBUTE *add_seq2string(si,str1,str2)
+PKCS7_SIGNER_INFO *si;
+char *str1;
+char *str2;
+       /* To add an object of OID 1.9.999, which is a sequence containing
+        * 2 octet strings */
+       {
+       unsigned char *p;
+       ASN1_OCTET_STRING *os1,*os2;
+       ASN1_STRING *seq;
+       X509_ATTRIBUTE *ret;
+       char *data;
+       int i,total;
+
+       if (signed_seq2string_nid == -1)
+               signed_seq2string_nid=
+                       OBJ_create("1.9.9999","OID_example","Our example OID");
+
+       os1=ASN1_OCTET_STRING_new();
+       os2=ASN1_OCTET_STRING_new();
+       ASN1_OCTET_STRING_set(os1,str1,strlen(str1));
+       ASN1_OCTET_STRING_set(os2,str1,strlen(str1));
+       i =i2d_ASN1_OCTET_STRING(os1,NULL);
+       i+=i2d_ASN1_OCTET_STRING(os2,NULL);
+       total=ASN1_object_size(1,i,V_ASN1_SEQUENCE);
+
+       data=malloc(total);
+       p=data;
+       ASN1_put_object(&p,1,i,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);
+       i2d_ASN1_OCTET_STRING(os1,&p);
+       i2d_ASN1_OCTET_STRING(os2,&p);
+
+       seq=ASN1_STRING_new();
+       ASN1_STRING_set(seq,data,total);
+       free(data);
+       ASN1_OCTET_STRING_free(os1);
+       ASN1_OCTET_STRING_free(os2);
+
+       ret=X509_ATTRIBUTE_create(signed_seq2string_nid,
+               V_ASN1_SEQUENCE,(char *)seq);
+       return(ret);
+       }
+
+/* For this case, I will malloc the return strings */
+int sk_get_seq2string(sk,str1,str2)
+STACK *sk;
+char **str1;
+char **str2;
+       {
+       ASN1_TYPE *so;
+       PKCS7_SIGNER_INFO si;
+
+       if (signed_seq2string_nid == -1)
+               signed_seq2string_nid=
+                       OBJ_create("1.9.9999","OID_example","Our example OID");
+
+       si.auth_attr=sk;
+       /* To retrieve */
+       so=PKCS7_get_signed_attribute(&si,signed_seq2string_nid);
+       if (so->type == V_ASN1_SEQUENCE)
+               {
+               ASN1_CTX c;
+               ASN1_STRING *s;
+               long length;
+               ASN1_OCTET_STRING *os1,*os2;
+
+               s=so->value.sequence;
+               c.p=ASN1_STRING_data(s);
+               c.max=c.p+ASN1_STRING_length(s);
+               if (!asn1_GetSequence(&c,&length)) goto err;
+               /* Length is the length of the seqence */
+
+               c.q=c.p;
+               if ((os1=d2i_ASN1_OCTET_STRING(NULL,&c.p,c.slen)) == NULL) 
+                       goto err;
+               c.slen-=(c.p-c.q);
+
+               c.q=c.p;
+               if ((os2=d2i_ASN1_OCTET_STRING(NULL,&c.p,c.slen)) == NULL) 
+                       goto err;
+               c.slen-=(c.p-c.q);
+
+               if (!asn1_Finish(&c)) goto err;
+               *str1=malloc(os1->length+1);
+               *str2=malloc(os2->length+1);
+               memcpy(*str1,os1->data,os1->length);
+               memcpy(*str2,os2->data,os2->length);
+               (*str1)[os1->length]='\0';
+               (*str2)[os2->length]='\0';
+               ASN1_OCTET_STRING_free(os1);
+               ASN1_OCTET_STRING_free(os2);
+               return(1);
+               }
+err:
+       return(0);
+       }
+
+
diff --git a/crypto/pkcs7/info.pem b/crypto/pkcs7/info.pem
new file mode 100644 (file)
index 0000000..989baf8
--- /dev/null
@@ -0,0 +1,57 @@
+issuer :/C=AU/SP=Queensland/L=Brisbane/O=Cryptsoft Pty Ltd/OU=DEMONSTRATION AND TESTING/CN=DEMO ZERO VALUE CA
+subject:/C=AU/SP=Queensland/L=Brisbane/O=Cryptsoft Pty Ltd/OU=SMIME 003/CN=Information/Email=info@cryptsoft.com
+serial :047D
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1149 (0x47d)
+        Signature Algorithm: md5withRSAEncryption
+        Issuer: C=AU, SP=Queensland, L=Brisbane, O=Cryptsoft Pty Ltd, OU=DEMONSTRATION AND TESTING, CN=DEMO ZERO VALUE CA
+        Validity
+            Not Before: May 13 05:40:58 1998 GMT
+            Not After : May 12 05:40:58 2000 GMT
+        Subject: C=AU, SP=Queensland, L=Brisbane, O=Cryptsoft Pty Ltd, OU=SMIME 003, CN=Information/Email=info@cryptsoft.com
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Modulus:
+                    00:ad:e7:23:89:ee:0d:87:b7:9c:32:44:4b:95:81:
+                    73:dd:22:80:4b:2d:c5:60:b8:fe:1e:18:63:ef:dc:
+                    89:89:22:df:95:3c:7a:db:3d:9a:06:a8:08:d6:29:
+                    fd:ef:41:09:91:ed:bc:ad:98:f9:f6:28:90:62:6f:
+                    e7:e7:0c:4d:0b
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            Netscape Comment: 
+                Generated with SSLeay
+    Signature Algorithm: md5withRSAEncryption
+        52:15:ea:88:f4:f0:f9:0b:ef:ce:d5:f8:83:40:61:16:5e:55:
+        f9:ce:2d:d1:8b:31:5c:03:c6:2d:10:7c:61:d5:5c:0a:42:97:
+        d1:fd:65:b6:b6:84:a5:39:ec:46:ec:fc:e0:0d:d9:22:da:1b:
+        50:74:ad:92:cb:4e:90:e5:fa:7d
+
+-----BEGIN CERTIFICATE-----
+MIICTDCCAfagAwIBAgICBH0wDQYJKoZIhvcNAQEEBQAwgZIxCzAJBgNVBAYTAkFV
+MRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFuZTEaMBgGA1UE
+ChMRQ3J5cHRzb2Z0IFB0eSBMdGQxIjAgBgNVBAsTGURFTU9OU1RSQVRJT04gQU5E
+IFRFU1RJTkcxGzAZBgNVBAMTEkRFTU8gWkVSTyBWQUxVRSBDQTAeFw05ODA1MTMw
+NTQwNThaFw0wMDA1MTIwNTQwNThaMIGeMQswCQYDVQQGEwJBVTETMBEGA1UECBMK
+UXVlZW5zbGFuZDERMA8GA1UEBxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29m
+dCBQdHkgTHRkMRIwEAYDVQQLEwlTTUlNRSAwMDMxFDASBgNVBAMTC0luZm9ybWF0
+aW9uMSEwHwYJKoZIhvcNAQkBFhJpbmZvQGNyeXB0c29mdC5jb20wXDANBgkqhkiG
+9w0BAQEFAANLADBIAkEArecjie4Nh7ecMkRLlYFz3SKASy3FYLj+Hhhj79yJiSLf
+lTx62z2aBqgI1in970EJke28rZj59iiQYm/n5wxNCwIDAQABoygwJjAkBglghkgB
+hvhCAQ0EFxYVR2VuZXJhdGVkIHdpdGggU1NMZWF5MA0GCSqGSIb3DQEBBAUAA0EA
+UhXqiPTw+QvvztX4g0BhFl5V+c4t0YsxXAPGLRB8YdVcCkKX0f1ltraEpTnsRuz8
+4A3ZItobUHStkstOkOX6fQ==
+-----END CERTIFICATE-----
+
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOgIBAAJBAK3nI4nuDYe3nDJES5WBc90igEstxWC4/h4YY+/ciYki35U8ets9
+mgaoCNYp/e9BCZHtvK2Y+fYokGJv5+cMTQsCAwEAAQJBAIHpvXvqEcOEoDRRHuIG
+fkcB4jPHcr9KE9TpxabH6xs9beN6OJnkePXAHwaz5MnUgSnbpOKq+cw8miKjXwe/
+zVECIQDVLwncT2lRmXarEYHzb+q/0uaSvKhWKKt3kJasLNTrAwIhANDUc/ghut29
+p3jJYjurzUKuG774/5eLjPLsxPPIZzNZAiA/10hSq41UnGqHLEUIS9m2/EeEZe7b
+bm567dfRU9OnVQIgDo8ROrZXSchEGbaog5J5r/Fle83uO8l93R3GqVxKXZkCIFfk
+IPD5PIYQAyyod3hyKKza7ZP4CGY4oOfZetbkSGGG
+-----END RSA PRIVATE KEY-----
diff --git a/crypto/pkcs7/infokey.pem b/crypto/pkcs7/infokey.pem
new file mode 100644 (file)
index 0000000..1e2acc9
--- /dev/null
@@ -0,0 +1,9 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOgIBAAJBAK3nI4nuDYe3nDJES5WBc90igEstxWC4/h4YY+/ciYki35U8ets9
+mgaoCNYp/e9BCZHtvK2Y+fYokGJv5+cMTQsCAwEAAQJBAIHpvXvqEcOEoDRRHuIG
+fkcB4jPHcr9KE9TpxabH6xs9beN6OJnkePXAHwaz5MnUgSnbpOKq+cw8miKjXwe/
+zVECIQDVLwncT2lRmXarEYHzb+q/0uaSvKhWKKt3kJasLNTrAwIhANDUc/ghut29
+p3jJYjurzUKuG774/5eLjPLsxPPIZzNZAiA/10hSq41UnGqHLEUIS9m2/EeEZe7b
+bm567dfRU9OnVQIgDo8ROrZXSchEGbaog5J5r/Fle83uO8l93R3GqVxKXZkCIFfk
+IPD5PIYQAyyod3hyKKza7ZP4CGY4oOfZetbkSGGG
+-----END RSA PRIVATE KEY-----
index b5689b3fe4cb5510bf1a91bd9b8253526706bda4..d761c3ee021029dedb8a757ca67a22430ef4baed 100644 (file)
 #include "objects.h"
 #include "x509.h"
 
+static int add_attribute(STACK **sk, int nid, int atrtype, char *value);
+static ASN1_TYPE *get_attribute(STACK *sk, int nid);
+
+#if 1
 BIO *PKCS7_dataInit(p7,bio)
 PKCS7 *p7;
 BIO *bio;
        {
        int i,j;
-       BIO *out=NULL,*btmp;
+       BIO *out=NULL,*btmp=NULL;
        X509_ALGOR *xa;
        EVP_MD *evp_md;
        EVP_CIPHER *evp_cipher=NULL;
@@ -95,6 +99,16 @@ BIO *bio;
                        }
                xalg=p7->d.signed_and_enveloped->enc_data->algorithm;
                break;
+       case NID_pkcs7_enveloped:
+               rsk=p7->d.enveloped->recipientinfo;
+               evp_cipher=EVP_get_cipherbyname(OBJ_nid2sn(OBJ_obj2nid(p7->d.enveloped->enc_data->algorithm->algorithm)));
+               if (evp_cipher == NULL)
+                       {
+                       PKCS7err(PKCS7_F_PKCS7_DATAINIT,PKCS7_R_UNSUPPORTED_CIPHER_TYPE);
+                       goto err;
+                       }
+               xalg=p7->d.enveloped->enc_data->algorithm;
+               break;
        default:
                PKCS7err(PKCS7_F_PKCS7_DATAINIT,PKCS7_R_UNSUPPORTED_CONTENT_TYPE);
                goto err;
@@ -105,7 +119,11 @@ BIO *bio;
                for (i=0; i<sk_num(md_sk); i++)
                        {
                        xa=(X509_ALGOR *)sk_value(md_sk,i);
-                       if ((btmp=BIO_new(BIO_f_md())) == NULL) goto err;
+                       if ((btmp=BIO_new(BIO_f_md())) == NULL)
+                               {
+                               PKCS7err(PKCS7_F_PKCS7_DATAINIT,ERR_R_BIO_LIB);
+                               goto err;
+                               }
 
                        j=OBJ_obj2nid(xa->algorithm);
                        evp_md=EVP_get_digestbyname(OBJ_nid2sn(j));
@@ -120,6 +138,7 @@ BIO *bio;
                                out=btmp;
                        else
                                BIO_push(out,btmp);
+                       btmp=NULL;
                        }
                }
 
@@ -131,7 +150,11 @@ BIO *bio;
                int jj,max;
                unsigned char *tmp;
 
-               if ((btmp=BIO_new(BIO_f_cipher())) == NULL) goto err;
+               if ((btmp=BIO_new(BIO_f_cipher())) == NULL)
+                       {
+                       PKCS7err(PKCS7_F_PKCS7_DATAINIT,ERR_R_BIO_LIB);
+                       goto err;
+                       }
                keylen=EVP_CIPHER_key_length(evp_cipher);
                ivlen=EVP_CIPHER_iv_length(evp_cipher);
 
@@ -142,9 +165,12 @@ BIO *bio;
                        RAND_bytes(iv,ivlen);
                        os=ASN1_OCTET_STRING_new();
                        ASN1_OCTET_STRING_set(os,iv,ivlen);
-               /*      ASN1_TYPE_set(xalg->parameter,V_ASN1_OCTET_STRING,
+/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX this needs to change */
+                       if (xalg->parameter == NULL)
+                               xalg->parameter=ASN1_TYPE_new();
+                       ASN1_TYPE_set(xalg->parameter,V_ASN1_OCTET_STRING,
                                (char *)os);
-               */      }
+                       }
                RAND_bytes(key,keylen);
 
                /* Lets do the pub key stuff :-) */
@@ -152,20 +178,34 @@ BIO *bio;
                for (i=0; i<sk_num(rsk); i++)
                        {
                        ri=(PKCS7_RECIP_INFO *)sk_value(rsk,i);
-                       if (ri->cert == NULL) abort();
+                       if (ri->cert == NULL)
+                               {
+                               PKCS7err(PKCS7_F_PKCS7_DATAINIT,PKCS7_R_MISSING_CERIPEND_INFO);
+                               goto err;
+                               }
                        pkey=X509_get_pubkey(ri->cert);
                        jj=EVP_PKEY_size(pkey);
                        if (max < jj) max=jj;
                        }
-               if ((tmp=(unsigned char *)Malloc(max)) == NULL) abort();
+               if ((tmp=(unsigned char *)Malloc(max)) == NULL)
+                       {
+                       PKCS7err(PKCS7_F_PKCS7_DATAINIT,ERR_R_MALLOC_FAILURE);
+                       goto err;
+                       }
                for (i=0; i<sk_num(rsk); i++)
                        {
                        ri=(PKCS7_RECIP_INFO *)sk_value(rsk,i);
                        pkey=X509_get_pubkey(ri->cert);
                        jj=EVP_PKEY_encrypt(tmp,key,keylen,pkey);
-                       if (jj <= 0) abort();
+                       if (jj <= 0)
+                               {
+                               PKCS7err(PKCS7_F_PKCS7_DATAINIT,ERR_R_EVP_LIB);
+                               Free(tmp);
+                               goto err;
+                               }
                        ASN1_OCTET_STRING_set(ri->enc_key,tmp,jj);
                        }
+               Free(tmp);
 
                BIO_set_cipher(btmp,evp_cipher,key,iv,1);
 
@@ -173,6 +213,7 @@ BIO *bio;
                        out=btmp;
                else
                        BIO_push(out,btmp);
+               btmp=NULL;
                }
 
        if (bio == NULL) /* ??????????? */
@@ -182,6 +223,11 @@ BIO *bio;
                else
                        {
                        bio=BIO_new(BIO_s_mem());
+                       /* We need to set this so that when we have read all
+                        * the data, the encrypt BIO, if present, will read
+                        * EOF and encode the last few bytes */
+                       BIO_set_mem_eof_return(bio,0);
+
                        if (PKCS7_type_is_signed(p7) &&
                                PKCS7_type_is_data(p7->d.sign->contents))
                                {
@@ -195,12 +241,234 @@ BIO *bio;
                        }
                }
        BIO_push(out,bio);
+       bio=NULL;
+       if (0)
+               {
+err:
+               if (out != NULL)
+                       BIO_free_all(out);
+               if (btmp != NULL)
+                       BIO_free_all(btmp);
+               out=NULL;
+               }
        return(out);
+       }
+
+/* int */
+BIO *PKCS7_dataDecode(p7,pkey,in_bio,xs)
+PKCS7 *p7;
+EVP_PKEY *pkey;
+BIO *in_bio;
+X509_STORE *xs;
+       {
+       int i,j;
+       BIO *out=NULL,*btmp=NULL,*etmp=NULL,*bio=NULL;
+       char *tmp=NULL;
+       X509_ALGOR *xa;
+       ASN1_OCTET_STRING *data_body=NULL;
+       EVP_MD *evp_md;
+       EVP_CIPHER *evp_cipher=NULL;
+       EVP_CIPHER_CTX *evp_ctx=NULL;
+       X509_ALGOR *enc_alg=NULL;
+       STACK *md_sk=NULL,*rsk=NULL;
+       X509_ALGOR *xalg=NULL;
+       PKCS7_RECIP_INFO *ri=NULL;
+/*     EVP_PKEY *pkey; */
+#if 0
+       X509_STORE_CTX s_ctx;
+#endif
+
+       i=OBJ_obj2nid(p7->type);
+       p7->state=PKCS7_S_HEADER;
+
+       switch (i)
+               {
+       case NID_pkcs7_signed:
+               data_body=p7->d.sign->contents->d.data;
+               md_sk=p7->d.sign->md_algs;
+               break;
+       case NID_pkcs7_signedAndEnveloped:
+               rsk=p7->d.signed_and_enveloped->recipientinfo;
+               md_sk=p7->d.signed_and_enveloped->md_algs;
+               data_body=p7->d.signed_and_enveloped->enc_data->enc_data;
+               enc_alg=p7->d.signed_and_enveloped->enc_data->algorithm;
+               evp_cipher=EVP_get_cipherbyname(OBJ_nid2sn(OBJ_obj2nid(enc_alg->algorithm)));
+               if (evp_cipher == NULL)
+                       {
+                       PKCS7err(PKCS7_F_PKCS7_SIGNENVELOPEDECRYPT,PKCS7_R_UNSUPPORTED_CIPHER_TYPE);
+                       goto err;
+                       }
+               xalg=p7->d.signed_and_enveloped->enc_data->algorithm;
+               break;
+       case NID_pkcs7_enveloped:
+               rsk=p7->d.enveloped->recipientinfo;
+               enc_alg=p7->d.enveloped->enc_data->algorithm;
+               data_body=p7->d.enveloped->enc_data->enc_data;
+               evp_cipher=EVP_get_cipherbyname(OBJ_nid2sn(OBJ_obj2nid(enc_alg->algorithm)));
+               if (evp_cipher == NULL)
+                       {
+                       PKCS7err(PKCS7_F_PKCS7_SIGNENVELOPEDECRYPT,PKCS7_R_UNSUPPORTED_CIPHER_TYPE);
+                       goto err;
+                       }
+               xalg=p7->d.enveloped->enc_data->algorithm;
+               break;
+       default:
+               PKCS7err(PKCS7_F_PKCS7_SIGNENVELOPEDECRYPT,PKCS7_R_UNSUPPORTED_CONTENT_TYPE);
+               goto err;
+               }
+
+       /* We will be checking the signature */
+       if (md_sk != NULL)
+               {
+               for (i=0; i<sk_num(md_sk); i++)
+                       {
+                       xa=(X509_ALGOR *)sk_value(md_sk,i);
+                       if ((btmp=BIO_new(BIO_f_md())) == NULL)
+                               {
+                               PKCS7err(PKCS7_F_PKCS7_SIGNENVELOPEDECRYPT,ERR_R_BIO_LIB);
+                               goto err;
+                               }
+
+                       j=OBJ_obj2nid(xa->algorithm);
+                       evp_md=EVP_get_digestbyname(OBJ_nid2sn(j));
+                       if (evp_md == NULL)
+                               {
+                               PKCS7err(PKCS7_F_PKCS7_SIGNENVELOPEDECRYPT,PKCS7_R_UNKNOWN_DIGEST_TYPE);
+                               goto err;
+                               }
+
+                       BIO_set_md(btmp,evp_md);
+                       if (out == NULL)
+                               out=btmp;
+                       else
+                               BIO_push(out,btmp);
+                       btmp=NULL;
+                       }
+               }
+
+       if (evp_cipher != NULL)
+               {
+#if 0
+               unsigned char key[EVP_MAX_KEY_LENGTH];
+               unsigned char iv[EVP_MAX_IV_LENGTH];
+               unsigned char *p;
+               int keylen,ivlen;
+               int max;
+               X509_OBJECT ret;
+#endif
+               int jj;
+
+               if ((etmp=BIO_new(BIO_f_cipher())) == NULL)
+                       {
+                       PKCS7err(PKCS7_F_PKCS7_SIGNENVELOPEDECRYPT,ERR_R_BIO_LIB);
+                       goto err;
+                       }
+
+               /* It was encrypted, we need to decrypt the secret key
+                * with the private key */
+
+               /* We need to find a private key for one of the people in the
+                * recipentinfo list */
+               if (rsk == NULL)
+                       return(NULL);
+
+               ri=(PKCS7_RECIP_INFO *)sk_value(rsk,0);
+#if 0
+               X509_STORE_CTX_init(&s_ctx,xs,NULL,NULL);
+               for (i=0; i<sk_num(rsk); i++)
+                       {
+                       ri=(PKCS7_RECIP_INFO *)sk_value(rsk,i);
+                       uf (X509_STORE_get_by_issuer_serial(&s_ctx,
+                               X509_LU_PKEY,
+                               ri->issuer_and_serial->issuer,
+                               ri->issuer_and_serial->serial,
+                               &ret))
+                               break;
+                       ri=NULL;
+                       }
+               if (ri == NULL) return(NULL);   
+               pkey=ret.data.pkey;
+#endif
+               if (pkey == NULL)
+                       {
+                       return(NULL);
+                       }
+
+               jj=EVP_PKEY_size(pkey);
+               tmp=Malloc(jj+10);
+               if (tmp == NULL)
+                       {
+                       PKCS7err(PKCS7_F_PKCS7_SIGNENVELOPEDECRYPT,ERR_R_MALLOC_FAILURE);
+                       goto err;
+                       }
+
+               jj=EVP_PKEY_decrypt((unsigned char *)tmp,
+                       ASN1_STRING_data(ri->enc_key),
+                       ASN1_STRING_length(ri->enc_key),
+                       pkey);
+               if (jj <= 0)
+                       {
+                       PKCS7err(PKCS7_F_PKCS7_SIGNENVELOPEDECRYPT,ERR_R_EVP_LIB);
+                       goto err;
+                       }
+
+               evp_ctx=NULL;
+               BIO_get_cipher_ctx(etmp,&evp_ctx);
+               EVP_CipherInit(evp_ctx,evp_cipher,NULL,NULL,0);
+               if (EVP_CIPHER_asn1_to_param(evp_ctx,enc_alg->parameter) < 0)
+                       return(NULL);
+
+               if (jj != EVP_CIPHER_CTX_key_length(evp_ctx))
+                       {
+                       PKCS7err(PKCS7_F_PKCS7_SIGNENVELOPEDECRYPT,PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH);
+                       goto err;
+                       }
+               EVP_CipherInit(evp_ctx,NULL,(unsigned char *)tmp,NULL,0);
+
+               memset(tmp,0,jj);
+
+               if (out == NULL)
+                       out=etmp;
+               else
+                       BIO_push(out,etmp);
+               etmp=NULL;
+               }
+
+#if 1
+       if (p7->detached || (in_bio != NULL))
+               {
+               bio=in_bio;
+               }
+       else 
+               {
+               bio=BIO_new(BIO_s_mem());
+               /* We need to set this so that when we have read all
+                * the data, the encrypt BIO, if present, will read
+                * EOF and encode the last few bytes */
+               BIO_set_mem_eof_return(bio,0);
+
+               if (data_body->length > 0)
+                       BIO_write(bio,(char *)data_body->data,data_body->length);
+               }
+       BIO_push(out,bio);
+       bio=NULL;
+#endif
+       if (0)
+               {
 err:
-       return(NULL);
+               if (out != NULL) BIO_free_all(out);
+               if (btmp != NULL) BIO_free_all(btmp);
+               if (etmp != NULL) BIO_free_all(etmp);
+               if (bio != NULL) BIO_free_all(bio);
+               out=NULL;
+               }
+       if (tmp != NULL)
+               Free(tmp);
+       return(out);
        }
+#endif
 
-int PKCS7_dataSign(p7,bio)
+int PKCS7_dataFinal(p7,bio)
 PKCS7 *p7;
 BIO *bio;
        {
@@ -227,6 +495,11 @@ BIO *bio;
                os=ASN1_OCTET_STRING_new();
                p7->d.signed_and_enveloped->enc_data->enc_data=os;
                break;
+       case NID_pkcs7_enveloped:
+               /* XXXXXXXXXXXXXXXX */
+               os=ASN1_OCTET_STRING_new();
+               p7->d.enveloped->enc_data->enc_data=os;
+               break;
        case NID_pkcs7_signed:
                si_sk=p7->d.sign->signer_info;
                os=p7->d.sign->contents->d.data;
@@ -235,14 +508,18 @@ BIO *bio;
 
        if (si_sk != NULL)
                {
-               if ((buf=BUF_MEM_new()) == NULL) goto err;
+               if ((buf=BUF_MEM_new()) == NULL)
+                       {
+                       PKCS7err(PKCS7_F_PKCS7_DATASIGN,ERR_R_BIO_LIB);
+                       goto err;
+                       }
                for (i=0; i<sk_num(si_sk); i++)
                        {
                        si=(PKCS7_SIGNER_INFO *)
                                sk_value(si_sk,i);
-                       if (si->pkey == NULL)
-                               continue;
-                       j=OBJ_obj2nid(si->digest_enc_alg->algorithm);
+                       if (si->pkey == NULL) continue;
+
+                       j=OBJ_obj2nid(si->digest_alg->algorithm);
 
                        btmp=bio;
                        for (;;)
@@ -259,7 +536,7 @@ BIO *bio;
                                        PKCS7err(PKCS7_F_PKCS7_DATASIGN,PKCS7_R_INTERNAL_ERROR);
                                        goto err;
                                        }
-                               if (EVP_MD_pkey_type(EVP_MD_CTX_type(mdc)) == j)
+                               if (EVP_MD_type(EVP_MD_CTX_type(mdc)) == j)
                                        break;
                                else
                                        btmp=btmp->next_bio;
@@ -269,46 +546,85 @@ BIO *bio;
                         * signing. */
                        memcpy(&ctx_tmp,mdc,sizeof(ctx_tmp));
                        if (!BUF_MEM_grow(buf,EVP_PKEY_size(si->pkey)))
+                               {
+                               PKCS7err(PKCS7_F_PKCS7_DATASIGN,ERR_R_BIO_LIB);
                                goto err;
+                               }
 
                        sk=si->auth_attr;
+
+                       /* If there are attributes, we add the digest
+                        * attribute and only sign the attributes */
                        if ((sk != NULL) && (sk_num(sk) != 0))
                                {
+                               unsigned char md_data[EVP_MAX_MD_SIZE];
+                               unsigned int md_len;
+                               ASN1_OCTET_STRING *digest;
+                               ASN1_UTCTIME *sign_time;
+                               EVP_MD *md_tmp;
+
+                               /* Add signing time */
+                               sign_time=X509_gmtime_adj(NULL,0);
+                               PKCS7_add_signed_attribute(si,
+                                       NID_pkcs9_signingTime,
+                                       V_ASN1_UTCTIME,(char *)sign_time);
+
+                               /* Add digest */
+                               md_tmp=EVP_MD_CTX_type(&ctx_tmp);
+                               EVP_DigestFinal(&ctx_tmp,md_data,&md_len);
+                               digest=ASN1_OCTET_STRING_new();
+                               ASN1_OCTET_STRING_set(digest,md_data,md_len);
+                               PKCS7_add_signed_attribute(si,NID_pkcs9_messageDigest,
+                                       V_ASN1_OCTET_STRING,(char *)digest);
+
+                               /* Now sign the mess */
+                               EVP_SignInit(&ctx_tmp,md_tmp);
                                x=i2d_ASN1_SET(sk,NULL,i2d_X509_ATTRIBUTE,
                                        V_ASN1_SET,V_ASN1_UNIVERSAL);
-                               pp=(unsigned char *)Malloc(i);
+                               pp=(unsigned char *)Malloc(x);
                                p=pp;
                                i2d_ASN1_SET(sk,&p,i2d_X509_ATTRIBUTE,
                                        V_ASN1_SET,V_ASN1_UNIVERSAL);
                                EVP_SignUpdate(&ctx_tmp,pp,x);
                                Free(pp);
+                               pp=NULL;
                                }
 
+                       if (si->pkey->type == EVP_PKEY_DSA)
+                               ctx_tmp.digest=EVP_dss1();
+
                        if (!EVP_SignFinal(&ctx_tmp,(unsigned char *)buf->data,
                                (unsigned int *)&buf->length,si->pkey))
+                               {
+                               PKCS7err(PKCS7_F_PKCS7_DATASIGN,ERR_R_EVP_LIB);
                                goto err;
+                               }
                        if (!ASN1_STRING_set(si->enc_digest,
                                (unsigned char *)buf->data,buf->length))
-                               goto err;
-                       }
-               if (p7->detached)
-                       ASN1_OCTET_STRING_set(os,(unsigned char *)"",0);
-               else
-                       {
-                       btmp=BIO_find_type(bio,BIO_TYPE_MEM);
-                       if (btmp == NULL)
                                {
-                               PKCS7err(PKCS7_F_PKCS7_DATASIGN,PKCS7_R_UNABLE_TO_FIND_MEM_BIO);
+                               PKCS7err(PKCS7_F_PKCS7_DATASIGN,ERR_R_ASN1_LIB);
                                goto err;
                                }
-                       BIO_get_mem_ptr(btmp,&buf_mem);
-                       ASN1_OCTET_STRING_set(os,
-                               (unsigned char *)buf_mem->data,buf_mem->length);
                        }
-               if (pp != NULL) Free(pp);
-               pp=NULL;
                }
 
+       if (p7->detached)
+               ASN1_OCTET_STRING_set(os,(unsigned char *)"",0);
+       else
+               {
+               btmp=BIO_find_type(bio,BIO_TYPE_MEM);
+               if (btmp == NULL)
+                       {
+                       PKCS7err(PKCS7_F_PKCS7_DATASIGN,PKCS7_R_UNABLE_TO_FIND_MEM_BIO);
+                       goto err;
+                       }
+               BIO_get_mem_ptr(btmp,&buf_mem);
+               ASN1_OCTET_STRING_set(os,
+                       (unsigned char *)buf_mem->data,buf_mem->length);
+               }
+       if (pp != NULL) Free(pp);
+       pp=NULL;
+
        ret=1;
 err:
        if (buf != NULL) BUF_MEM_free(buf);
@@ -322,22 +638,34 @@ BIO *bio;
 PKCS7 *p7;
 PKCS7_SIGNER_INFO *si;
        {
-       PKCS7_SIGNED *s;
+/*     PKCS7_SIGNED *s; */
        ASN1_OCTET_STRING *os;
        EVP_MD_CTX mdc_tmp,*mdc;
        unsigned char *pp,*p;
        PKCS7_ISSUER_AND_SERIAL *ias;
-       int ret=0,md_type,i;
-       STACK *sk;
+       int ret=0,i;
+       int md_type;
+       STACK *sk,*cert;
        BIO *btmp;
        X509 *x509;
 
-       if (!PKCS7_type_is_signed(p7)) abort();
+       if (PKCS7_type_is_signed(p7))
+               {
+               cert=p7->d.sign->cert;
+               }
+       else if (PKCS7_type_is_signedAndEnveloped(p7))
+               {
+               cert=p7->d.signed_and_enveloped->cert;
+               }
+       else
+               {
+               PKCS7err(PKCS7_F_PKCS7_DATAVERIFY,PKCS7_R_WRONG_PKCS7_TYPE);
+               goto err;
+               }
        /* XXXXXXXXXXXXXXXXXXXXXXX */
        ias=si->issuer_and_serial;
-       s=p7->d.sign;
 
-       x509=X509_find_by_issuer_and_serial(s->cert,ias->issuer,ias->serial);
+       x509=X509_find_by_issuer_and_serial(cert,ias->issuer,ias->serial);
 
        /* were we able to find the cert in passed to us */
        if (x509 == NULL)
@@ -347,9 +675,13 @@ PKCS7_SIGNER_INFO *si;
                }
 
        /* Lets verify */
-       X509_STORE_CTX_init(ctx,cert_store,x509,s->cert);
+       X509_STORE_CTX_init(ctx,cert_store,x509,cert);
        i=X509_verify_cert(ctx);
-       if (i <= 0) goto err;
+       if (i <= 0) 
+               {
+               PKCS7err(PKCS7_F_PKCS7_DATAVERIFY,ERR_R_X509_LIB);
+               goto err;
+               }
        X509_STORE_CTX_cleanup(ctx);
 
        /* So we like 'x509', lets check the signature. */
@@ -375,23 +707,55 @@ PKCS7_SIGNER_INFO *si;
                btmp=btmp->next_bio;    
                }
 
-       /* mdc is the digest ctx that we want */
+       /* mdc is the digest ctx that we want, unless there are attributes,
+        * in which case the digest is the signed attributes */
        memcpy(&mdc_tmp,mdc,sizeof(mdc_tmp));
 
        sk=si->auth_attr;
        if ((sk != NULL) && (sk_num(sk) != 0))
                {
+               unsigned char md_dat[EVP_MAX_MD_SIZE];
+               int md_len;
+               ASN1_OCTET_STRING *message_digest;
+
+               EVP_DigestFinal(&mdc_tmp,md_dat,&md_len);
+               message_digest=PKCS7_digest_from_attributes(sk);
+               if (!message_digest)
+                       {
+                       PKCS7err(PKCS7_F_PKCS7_DATAVERIFY,PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST);
+                       goto err;
+                       }
+               if ((message_digest->length != md_len) ||
+                       (memcmp(message_digest->data,md_dat,md_len)))
+                       {
+#if 0
+{
+int ii;
+for (ii=0; ii<message_digest->length; ii++)
+       printf("%02X",message_digest->data[ii]); printf(" sent\n");
+for (ii=0; ii<md_len; ii++) printf("%02X",md_dat[ii]); printf(" calc\n");
+}
+#endif
+                       PKCS7err(PKCS7_F_PKCS7_DATAVERIFY,PKCS7_R_DIGEST_FAILURE);
+                       ret= -1;
+                       goto err;
+                       }
+
+               EVP_VerifyInit(&mdc_tmp,EVP_get_digestbynid(md_type));
                i=i2d_ASN1_SET(sk,NULL,i2d_X509_ATTRIBUTE,
                        V_ASN1_SET,V_ASN1_UNIVERSAL);
-               pp=(unsigned char *)malloc(i);
+               pp=(unsigned char *)Malloc(i);
                p=pp;
                i2d_ASN1_SET(sk,&p,i2d_X509_ATTRIBUTE,
                        V_ASN1_SET,V_ASN1_UNIVERSAL);
                EVP_VerifyUpdate(&mdc_tmp,pp,i);
-               free(pp);
+               Free(pp);
                }
 
        os=si->enc_digest;
+       if (X509_get_pubkey(x509)->type == EVP_PKEY_DSA)
+               mdc_tmp.digest=EVP_dss1();
+
        i=EVP_VerifyFinal(&mdc_tmp,os->data,os->length,
                X509_get_pubkey(x509));
        if (i <= 0)
@@ -406,3 +770,172 @@ err:
        return(ret);
        }
 
+PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(p7,idx)
+PKCS7 *p7;
+int idx;
+       {
+       STACK *rsk;
+       PKCS7_RECIP_INFO *ri;
+       int i;
+
+       i=OBJ_obj2nid(p7->type);
+       if (i != NID_pkcs7_signedAndEnveloped) return(NULL);
+       rsk=p7->d.signed_and_enveloped->recipientinfo;
+       ri=(PKCS7_RECIP_INFO *)sk_value(rsk,0);
+       if (sk_num(rsk) <= idx) return(NULL);
+       ri=(PKCS7_RECIP_INFO *)sk_value(rsk,idx);
+       return(ri->issuer_and_serial);
+       }
+
+ASN1_TYPE *PKCS7_get_signed_attribute(si,nid)
+PKCS7_SIGNER_INFO *si;
+int nid;
+       {
+       return(get_attribute(si->auth_attr,nid));
+       }
+
+ASN1_TYPE *PKCS7_get_attribute(si,nid)
+PKCS7_SIGNER_INFO *si;
+int nid;
+       {
+       return(get_attribute(si->unauth_attr,nid));
+       }
+
+static ASN1_TYPE *get_attribute(sk,nid)
+STACK *sk;
+int nid;
+       {
+       int i;
+       X509_ATTRIBUTE *xa;
+       ASN1_OBJECT *o;
+
+       o=OBJ_nid2obj(nid);
+       if (o == NULL) return(NULL);
+       for (i=0; i<sk_num(sk); i++)
+               {
+               xa=(X509_ATTRIBUTE *)sk_value(sk,i);
+               if (OBJ_cmp(xa->object,o) == 0)
+                       {
+                       if (xa->set && sk_num(xa->value.set))
+                               return((ASN1_TYPE *)sk_value(xa->value.set,0));
+                       else
+                               return(NULL);
+                       }
+               }
+       return(NULL);
+       }
+
+ASN1_OCTET_STRING *PKCS7_digest_from_attributes(sk)
+STACK *sk;
+       {
+       X509_ATTRIBUTE *attr;
+       ASN1_TYPE *astype;
+       int i;
+       if (!sk || !sk_num(sk)) return NULL;
+       /* Search the attributes for a digest */
+       for (i = 0; i < sk_num(sk); i++)
+               {
+               attr = (X509_ATTRIBUTE *) sk_value(sk, i);
+               if (OBJ_obj2nid(attr->object) == NID_pkcs9_messageDigest)
+                       {
+                       if (!attr->set) return NULL;
+                       if (!attr->value.set ||
+                                !sk_num (attr->value.set) ) return NULL;
+                       astype = (ASN1_TYPE *) sk_value(attr->value.set, 0);
+                       return astype->value.octet_string;
+                       }
+               }
+       return NULL;
+       }
+
+int PKCS7_set_signed_attributes(p7si,sk)
+PKCS7_SIGNER_INFO *p7si;
+STACK *sk;
+       {
+       int i;
+
+       if (p7si->auth_attr != NULL)
+               sk_pop_free(p7si->auth_attr,X509_ATTRIBUTE_free);
+       p7si->auth_attr=sk_dup(sk);
+       for (i=0; i<sk_num(sk); i++)
+               {
+               if ((sk_value(p7si->auth_attr,i)=(char *)X509_ATTRIBUTE_dup(
+                       (X509_ATTRIBUTE *)sk_value(sk,i))) == NULL)
+                       return(0);
+               }
+       return(1);
+       }
+
+int PKCS7_set_attributes(p7si,sk)
+PKCS7_SIGNER_INFO *p7si;
+STACK *sk;
+       {
+       int i;
+
+       if (p7si->unauth_attr != NULL)
+               sk_pop_free(p7si->unauth_attr,X509_ATTRIBUTE_free);
+       p7si->unauth_attr=sk_dup(sk);
+       for (i=0; i<sk_num(sk); i++)
+               {
+               if ((sk_value(p7si->unauth_attr,i)=(char *)X509_ATTRIBUTE_dup(
+                       (X509_ATTRIBUTE *)sk_value(sk,i))) == NULL)
+                       return(0);
+               }
+       return(1);
+       }
+
+int PKCS7_add_signed_attribute(p7si,nid,atrtype,value)
+PKCS7_SIGNER_INFO *p7si;
+int nid;
+int atrtype;
+char *value;
+       {
+       return(add_attribute(&(p7si->auth_attr),nid,atrtype,value));
+       }
+
+int PKCS7_add_attribute(p7si,nid,atrtype,value)
+PKCS7_SIGNER_INFO *p7si;
+int nid;
+int atrtype;
+char *value;
+       {
+       return(add_attribute(&(p7si->unauth_attr),nid,atrtype,value));
+       }
+
+static int add_attribute(sk, nid, atrtype, value)
+STACK **sk;
+int nid;
+int atrtype;
+char *value;
+       {
+       X509_ATTRIBUTE *attr=NULL;
+       ASN1_TYPE *val=NULL;
+
+       if (*sk == NULL)
+               {
+               *sk = sk_new(NULL);
+new_attrib:
+               attr=X509_ATTRIBUTE_create(nid,atrtype,value);
+               sk_push(*sk,(char *)attr);
+               }
+       else
+               {
+               int i;
+
+               for (i=0; i<sk_num(*sk); i++)
+                       {
+                       attr=(X509_ATTRIBUTE *)sk_value(*sk,i);
+                       if (OBJ_obj2nid(attr->object) == nid)
+                               {
+                               X509_ATTRIBUTE_free(attr);
+                               attr=X509_ATTRIBUTE_create(nid,atrtype,value);
+                               sk_value(*sk,i)=(char *)attr;
+                               goto end;
+                               }
+                       }
+               goto new_attrib;
+               }
+end:
+       return(1);
+       }
+
index 7d14ad11734ecfc6489a7e25685263ac8da8dad3..7534f4c2a52787b73cee9fd45f6aa31614130181 100644 (file)
@@ -98,7 +98,8 @@ char *parg;
                        
                break;
        default:
-               abort();
+               PKCS7err(PKCS7_F_PKCS7_CTRL,PKCS7_R_UNKNOWN_OPERATION);
+               ret=0;
                }
        return(ret);
        }
@@ -172,12 +173,19 @@ int type;
        case NID_pkcs7_signedAndEnveloped:
                p7->type=obj;
                if ((p7->d.signed_and_enveloped=PKCS7_SIGN_ENVELOPE_new())
-                       == NULL)
-                       goto err;
-               ASN1_INTEGER_set(p7->d.sign->version,1);
+                       == NULL) goto err;
+               ASN1_INTEGER_set(p7->d.signed_and_enveloped->version,1);
+/*             p7->d.signed_and_enveloped->enc_data->content_type=
+                       OBJ_nid2obj(NID_pkcs7_encrypted);*/
+                       
                break;
-       case NID_pkcs7_digest:
        case NID_pkcs7_enveloped:
+               p7->type=obj;
+               if ((p7->d.enveloped=PKCS7_ENVELOPE_new())
+                       == NULL) goto err;
+               ASN1_INTEGER_set(p7->d.enveloped->version,0);
+               break;
+       case NID_pkcs7_digest:
        case NID_pkcs7_encrypted:
        default:
                PKCS7err(PKCS7_F_PKCS7_SET_TYPE,PKCS7_R_UNSUPPORTED_CONTENT_TYPE);
@@ -316,7 +324,10 @@ EVP_MD *dgst;
        p7i->pkey=pkey;
 
        /* Set the algorithms */
-       p7i->digest_alg->algorithm=OBJ_nid2obj(EVP_MD_type(dgst));
+       if (pkey->type == EVP_PKEY_DSA)
+               p7i->digest_alg->algorithm=OBJ_nid2obj(NID_sha1);
+       else    
+               p7i->digest_alg->algorithm=OBJ_nid2obj(EVP_MD_type(dgst));
        p7i->digest_enc_alg->algorithm=OBJ_nid2obj(EVP_MD_pkey_type(dgst));
 
 #if 1
@@ -355,6 +366,10 @@ PKCS7 *p7;
                {
                return(p7->d.sign->signer_info);
                }
+       else if (PKCS7_type_is_signedAndEnveloped(p7))
+               {
+               return(p7->d.signed_and_enveloped->signer_info);
+               }
        else
                return(NULL);
        }
@@ -386,6 +401,9 @@ PKCS7_RECIP_INFO *ri;
        case NID_pkcs7_signedAndEnveloped:
                sk=     p7->d.signed_and_enveloped->recipientinfo;
                break;
+       case NID_pkcs7_enveloped:
+               sk=     p7->d.enveloped->recipientinfo;
+               break;
        default:
                PKCS7err(PKCS7_F_PKCS7_ADD_RECIPIENT_INFO,PKCS7_R_WRONG_CONTENT_TYPE);
                return(0);
@@ -407,6 +425,11 @@ X509 *x509;
        p7i->issuer_and_serial->serial=
                ASN1_INTEGER_dup(X509_get_serialNumber(x509));
 
+       X509_ALGOR_free(p7i->key_enc_algor);
+       p7i->key_enc_algor=(X509_ALGOR *)ASN1_dup(i2d_X509_ALGOR,
+               (char *(*)())d2i_X509_ALGOR,
+               (char *)x509->cert_info->key->algor);
+
        CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509);
        p7i->cert=x509;
 
@@ -438,6 +461,9 @@ EVP_CIPHER *cipher;
        case NID_pkcs7_signedAndEnveloped:
                ec=p7->d.signed_and_enveloped->enc_data;
                break;
+       case NID_pkcs7_enveloped:
+               ec=p7->d.enveloped->enc_data;
+               break;
        default:
                PKCS7err(PKCS7_F_PKCS7_SET_CIPHER,PKCS7_R_WRONG_CONTENT_TYPE);
                return(0);
index 91413aae4322fd7a01db70c2bc301829beb20727..115721e918c9d620ab25be08f7fdc932fa5d6d69 100644 (file)
 #define PKCS7_F_PKCS7_SET_CIPHER                        108
 #define PKCS7_F_PKCS7_SET_CONTENT                       109
 #define PKCS7_F_PKCS7_SET_TYPE                          110
+#define PKCS7_F_PKCS7_SIGNENVELOPEDECRYPT               111
 
 /* Reason codes. */
-#define PKCS7_R_INTERNAL_ERROR                          100
-#define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE    101
-#define PKCS7_R_SIGNATURE_FAILURE                       102
-#define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE              103
-#define PKCS7_R_UNABLE_TO_FIND_MEM_BIO                  104
-#define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST           105
-#define PKCS7_R_UNKNOWN_DIGEST_TYPE                     106
-#define PKCS7_R_UNSUPPORTED_CIPHER_TYPE                         107
-#define PKCS7_R_UNSUPPORTED_CONTENT_TYPE                108
-#define PKCS7_R_WRONG_CONTENT_TYPE                      109
+#define PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH           100
+#define PKCS7_R_DIGEST_FAILURE                          101
+#define PKCS7_R_INTERNAL_ERROR                          102
+#define PKCS7_R_MISSING_CERIPEND_INFO                   103
+#define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE    104
+#define PKCS7_R_SIGNATURE_FAILURE                       105
+#define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE              106
+#define PKCS7_R_UNABLE_TO_FIND_MEM_BIO                  107
+#define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST           108
+#define PKCS7_R_UNKNOWN_DIGEST_TYPE                     109
+#define PKCS7_R_UNKNOWN_OPERATION                       110
+#define PKCS7_R_UNSUPPORTED_CIPHER_TYPE                         111
+#define PKCS7_R_UNSUPPORTED_CONTENT_TYPE                112
+#define PKCS7_R_WRONG_CONTENT_TYPE                      113
+#define PKCS7_R_WRONG_PKCS7_TYPE                        114
index ee12f670a8566bfa609046882b20c4e9efc358a7..01afa5a5c3cd5bf2f53ddcd3c4db75fff2bc4c4b 100644 (file)
@@ -199,7 +199,12 @@ typedef struct pkcs7_st
 #define PKCS7_OP_SET_DETACHED_SIGNATURE        1
 #define PKCS7_OP_GET_DETACHED_SIGNATURE        2
 
+#define PKCS7_get_signed_attributes(si)        ((si)->auth_attr)
+#define PKCS7_get_attributes(si)       ((si)->unauth_attr)
+
 #define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed)
+#define PKCS7_type_is_signedAndEnveloped(a) \
+               (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped)
 #define PKCS7_type_is_data(a)   (OBJ_obj2nid((a)->type) == NID_pkcs7_data)
 
 #define PKCS7_set_detached(p,v) \
@@ -208,11 +213,12 @@ typedef struct pkcs7_st
                PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL)
 
 #ifdef SSLEAY_MACROS
-
+#ifndef PKCS7_ISSUER_AND_SERIAL_digest
 #define PKCS7_ISSUER_AND_SERIAL_digest(data,type,md,len) \
         ASN1_digest((int (*)())i2d_PKCS7_ISSUER_AND_SERIAL,type,\
                        (char *)data,md,len)
 #endif
+#endif
 
 
 #ifndef NOPROTO
@@ -314,12 +320,13 @@ int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i);
 int PKCS7_add_certificate(PKCS7 *p7, X509 *x509);
 int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509);
 int PKCS7_content_new(PKCS7 *p7, int nid);
-int PKCS7_dataSign(PKCS7 *p7, BIO *bio);
 int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx,
        BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); 
 
 BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio);
-/*int PKCS7_DataFinal(PKCS7 *p7, BIO *bio); */
+int PKCS7_dataFinal(PKCS7 *p7, BIO *bio);
+BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509_STORE *xs);
+
 
 PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509,
        EVP_PKEY *pkey, EVP_MD *dgst);
@@ -331,6 +338,16 @@ int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri);
 int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509);
 int PKCS7_set_cipher(PKCS7 *p7, EVP_CIPHER *cipher);
 
+PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx);
+ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK *sk);
+int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si,int nid,int type,
+       char *data);
+int PKCS7_add_attribute (PKCS7_SIGNER_INFO *p7si, int nid, int atrtype,
+       char *value);
+ASN1_TYPE *PKCS7_get_attribute(PKCS7_SIGNER_INFO *si, int nid);
+ASN1_TYPE *PKCS7_get_signed_attribute(PKCS7_SIGNER_INFO *si, int nid);
+int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, STACK *sk);
+int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, STACK *sk);
 
 
 #else
@@ -400,7 +417,6 @@ int PKCS7_add_signer();
 int PKCS7_add_certificate();
 int PKCS7_add_crl();
 int PKCS7_content_new();
-int PKCS7_dataSign();
 int PKCS7_dataVerify();
 BIO *PKCS7_dataInit();
 PKCS7_SIGNER_INFO *PKCS7_add_signature();
@@ -412,8 +428,18 @@ int PKCS7_add_recipient_info();
 int PKCS7_RECIP_INFO_set();
 int PKCS7_set_cipher();
 
+PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial();
+ASN1_OCTET_STRING *PKCS7_digest_from_attributes();
+int PKCS7_add_signed_attribute();
+int PKCS7_add_attribute();
+ASN1_TYPE *PKCS7_get_attribute();
+ASN1_TYPE *PKCS7_get_signed_attribute();
+void PKCS7_set_signed_attributes();
+void PKCS7_set_attributes();
+
 #endif
 
+
 /* BEGIN ERROR CODES */
 /* Error codes for the PKCS7 functions. */
 
@@ -429,18 +455,24 @@ int PKCS7_set_cipher();
 #define PKCS7_F_PKCS7_SET_CIPHER                        108
 #define PKCS7_F_PKCS7_SET_CONTENT                       109
 #define PKCS7_F_PKCS7_SET_TYPE                          110
+#define PKCS7_F_PKCS7_SIGNENVELOPEDECRYPT               111
 
 /* Reason codes. */
-#define PKCS7_R_INTERNAL_ERROR                          100
-#define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE    101
-#define PKCS7_R_SIGNATURE_FAILURE                       102
-#define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE              103
-#define PKCS7_R_UNABLE_TO_FIND_MEM_BIO                  104
-#define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST           105
-#define PKCS7_R_UNKNOWN_DIGEST_TYPE                     106
-#define PKCS7_R_UNSUPPORTED_CIPHER_TYPE                         107
-#define PKCS7_R_UNSUPPORTED_CONTENT_TYPE                108
-#define PKCS7_R_WRONG_CONTENT_TYPE                      109
+#define PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH           100
+#define PKCS7_R_DIGEST_FAILURE                          101
+#define PKCS7_R_INTERNAL_ERROR                          102
+#define PKCS7_R_MISSING_CERIPEND_INFO                   103
+#define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE    104
+#define PKCS7_R_SIGNATURE_FAILURE                       105
+#define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE              106
+#define PKCS7_R_UNABLE_TO_FIND_MEM_BIO                  107
+#define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST           108
+#define PKCS7_R_UNKNOWN_DIGEST_TYPE                     109
+#define PKCS7_R_UNKNOWN_OPERATION                       110
+#define PKCS7_R_UNSUPPORTED_CIPHER_TYPE                         111
+#define PKCS7_R_UNSUPPORTED_CONTENT_TYPE                112
+#define PKCS7_R_WRONG_CONTENT_TYPE                      113
+#define PKCS7_R_WRONG_PKCS7_TYPE                        114
  
 #ifdef  __cplusplus
 }
index f8510574229dea1f78bc7e4f812eb79efafffdcd..f60c856f8affadf80b17edb8a23e9e9fe522fa50 100644 (file)
@@ -74,21 +74,27 @@ static ERR_STRING_DATA PKCS7_str_functs[]=
 {ERR_PACK(0,PKCS7_F_PKCS7_SET_CIPHER,0),       "PKCS7_set_cipher"},
 {ERR_PACK(0,PKCS7_F_PKCS7_SET_CONTENT,0),      "PKCS7_set_content"},
 {ERR_PACK(0,PKCS7_F_PKCS7_SET_TYPE,0), "PKCS7_set_type"},
+{ERR_PACK(0,PKCS7_F_PKCS7_SIGNENVELOPEDECRYPT,0),      "PKCS7_SIGNENVELOPEDECRYPT"},
 {0,NULL},
        };
 
 static ERR_STRING_DATA PKCS7_str_reasons[]=
        {
+{PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH   ,"decrypted key is wrong length"},
+{PKCS7_R_DIGEST_FAILURE                  ,"digest failure"},
 {PKCS7_R_INTERNAL_ERROR                  ,"internal error"},
+{PKCS7_R_MISSING_CERIPEND_INFO           ,"missing ceripend info"},
 {PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE,"operation not supported on this type"},
 {PKCS7_R_SIGNATURE_FAILURE               ,"signature failure"},
 {PKCS7_R_UNABLE_TO_FIND_CERTIFICATE      ,"unable to find certificate"},
 {PKCS7_R_UNABLE_TO_FIND_MEM_BIO          ,"unable to find mem bio"},
 {PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST   ,"unable to find message digest"},
 {PKCS7_R_UNKNOWN_DIGEST_TYPE             ,"unknown digest type"},
+{PKCS7_R_UNKNOWN_OPERATION               ,"unknown operation"},
 {PKCS7_R_UNSUPPORTED_CIPHER_TYPE         ,"unsupported cipher type"},
 {PKCS7_R_UNSUPPORTED_CONTENT_TYPE        ,"unsupported content type"},
 {PKCS7_R_WRONG_CONTENT_TYPE              ,"wrong content type"},
+{PKCS7_R_WRONG_PKCS7_TYPE                ,"wrong pkcs7 type"},
 {0,NULL},
        };
 
@@ -98,8 +104,8 @@ void ERR_load_PKCS7_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_PKCS7,PKCS7_str_functs);
index ead1cb65cae7a06a38da43d11a7be735e390ea5e..6ad88d468877ce6e6432442861eec2696d7871e1 100644 (file)
@@ -105,7 +105,13 @@ again:
        p7=PKCS7_new();
        PKCS7_set_type(p7,NID_pkcs7_signed);
         
-       if (PKCS7_add_signature(p7,x509,pkey,EVP_sha1()) == NULL) goto err;
+       si=PKCS7_add_signature(p7,x509,pkey,EVP_sha1());
+       if (si == NULL) goto err;
+
+       /* Add some extra attributes */
+       if (!add_signed_time(si)) goto err;
+       if (!add_signed_string(si,"SIGNED STRING")) goto err;
+       if (!add_signed_seq2string(si,"STRING1","STRING2")) goto err;
 
        /* we may want to add more */
        PKCS7_add_certificate(p7,x509);
@@ -125,7 +131,7 @@ again:
                BIO_write(p7bio,buf,i);
                }
 
-       if (!PKCS7_dataSign(p7,p7bio)) goto err;
+       if (!PKCS7_dataFinal(p7,p7bio)) goto err;
        BIO_free(p7bio);
 
        PEM_write_PKCS7(stdout,p7);
diff --git a/crypto/pkcs7/t/3des.pem b/crypto/pkcs7/t/3des.pem
new file mode 100644 (file)
index 0000000..b2b5081
--- /dev/null
@@ -0,0 +1,16 @@
+-----BEGIN PKCS7-----
+MIAGCSqGSIb3DQEHA6CAMIACAQAxggHmMIHwAgEAMIGZMIGSMQswCQYDVQQGEwJBVTETMBEG
+A1UECBMKUXVlZW5zbGFuZDERMA8GA1UEBxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29m
+dCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNUUkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQD
+ExJERU1PIFpFUk8gVkFMVUUgQ0ECAgR+MA0GCSqGSIb3DQEBAQUABEC2vXI1xQDW6lUHM3zQ
+/9uBEBOO5A3TtkrklAXq7v01gsIC21t52qSk36REXY+slhNZ0OQ349tgkTsoETHFLoEwMIHw
+AgEAMIGZMIGSMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDERMA8GA1UEBxMI
+QnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29mdCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNU
+UkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQDExJERU1PIFpFUk8gVkFMVUUgQ0ECAgR9MA0G
+CSqGSIb3DQEBAQUABEB8ujxbabxXUYJhopuDm3oDq4JNqX6Io4p3ro+ShqfIndsXTZ1v5a2N
+WtLLCWlHn/habjBwZ/DgQgcKASbZ7QxNMIAGCSqGSIb3DQEHATAaBggqhkiG9w0DAjAOAgIA
+oAQIbsL5v1wX98KggAQoAaJ4WHm68fXY1WE5OIjfVBIDpO1K+i8dmKhjnAjrjoyZ9Bwc8rDL
+lgQg4CXb805h5xl+GfvSwUaHJayte1m2mcOhs3J2YyqbQ+MEIMIiJQccmhO3oDKm36CFvYR8
+5PjpclVcZyX2ngbwPFMnBAgy0clOAE6UKAAAAAAAAAAAAAA=
+-----END PKCS7-----
+
diff --git a/crypto/pkcs7/t/3dess.pem b/crypto/pkcs7/t/3dess.pem
new file mode 100644 (file)
index 0000000..23f0135
--- /dev/null
@@ -0,0 +1,32 @@
+-----BEGIN PKCS7-----
+MIIGHgYJKoZIhvcNAQcCoIIGDzCCBgsCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCC
+BGswggJTMIIB/aADAgECAgIEfjANBgkqhkiG9w0BAQQFADCBkjELMAkGA1UEBhMCQVUxEzAR
+BgNVBAgTClF1ZWVuc2xhbmQxETAPBgNVBAcTCEJyaXNiYW5lMRowGAYDVQQKExFDcnlwdHNv
+ZnQgUHR5IEx0ZDEiMCAGA1UECxMZREVNT05TVFJBVElPTiBBTkQgVEVTVElORzEbMBkGA1UE
+AxMSREVNTyBaRVJPIFZBTFVFIENBMB4XDTk4MDUxMzA2MjY1NloXDTAwMDUxMjA2MjY1Nlow
+gaUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFu
+ZTEaMBgGA1UEChMRQ3J5cHRzb2Z0IFB0eSBMdGQxEjAQBgNVBAsTCVNNSU1FIDAwMzEZMBcG
+A1UEAxMQQW5nZWxhIHZhbiBMZWVudDEjMCEGCSqGSIb3DQEJARYUYW5nZWxhQGNyeXB0c29m
+dC5jb20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEAuC3+7dAb2LhuO7gt2cTM8vsNjhG5JfDh
+hX1Vl/wVGbKEEj0MA6vWEolvefQlxB+EzwCtR0YZ7eEC/T/4JoCyeQIDAQABoygwJjAkBglg
+hkgBhvhCAQ0EFxYVR2VuZXJhdGVkIHdpdGggU1NMZWF5MA0GCSqGSIb3DQEBBAUAA0EAUnSP
+igs6TMFISTjw8cBtJYb98czgAVkVFjKyJQwYMH8FbDnCyx6NocM555nsyDstaw8fKR11Khds
+syd3ikkrhDCCAhAwggG6AgEDMA0GCSqGSIb3DQEBBAUAMIGSMQswCQYDVQQGEwJBVTETMBEG
+A1UECBMKUXVlZW5zbGFuZDERMA8GA1UEBxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29m
+dCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNUUkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQD
+ExJERU1PIFpFUk8gVkFMVUUgQ0EwHhcNOTgwMzAzMDc0MTMyWhcNMDgwMjI5MDc0MTMyWjCB
+kjELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxETAPBgNVBAcTCEJyaXNiYW5l
+MRowGAYDVQQKExFDcnlwdHNvZnQgUHR5IEx0ZDEiMCAGA1UECxMZREVNT05TVFJBVElPTiBB
+TkQgVEVTVElORzEbMBkGA1UEAxMSREVNTyBaRVJPIFZBTFVFIENBMFwwDQYJKoZIhvcNAQEB
+BQADSwAwSAJBAL+0E2fLej3FSCwe2A2iRnMuC3z12qHIp6Ky1wo2zZcxft7AI+RfkrWrSGtf
+mfzBEuPrLdfulncC5Y1pNcM8RTUCAwEAATANBgkqhkiG9w0BAQQFAANBAGSbLMphL6F5pp3s
+8o0Xyh86FHFdpVOwYx09ELLkuG17V/P9pgIc0Eo/gDMbN+KT3IdgECf8S//pCRA6RrNjcXIx
+ggF7MIIBdwIBATCBmTCBkjELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxETAP
+BgNVBAcTCEJyaXNiYW5lMRowGAYDVQQKExFDcnlwdHNvZnQgUHR5IEx0ZDEiMCAGA1UECxMZ
+REVNT05TVFJBVElPTiBBTkQgVEVTVElORzEbMBkGA1UEAxMSREVNTyBaRVJPIFZBTFVFIENB
+AgIEfjAJBgUrDgMCGgUAoHowGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAbBgkqhkiG9w0B
+CQ8xDjAMMAoGCCqGSIb3DQMHMBwGCSqGSIb3DQEJBTEPFw05ODA1MTQwMzM5MzdaMCMGCSqG
+SIb3DQEJBDEWBBQstNMnSV26ba8PapQEDhO21yNFrjANBgkqhkiG9w0BAQEFAARAW9Xb9YXv
+BfcNkutgFX9Gr8iXhBVsNtGEVrjrpkQwpKa7jHI8SjAlLhk/4RFwDHf+ISB9Np3Z1WDWnLcA
+9CWR6g==
+-----END PKCS7-----
diff --git a/crypto/pkcs7/t/c.pem b/crypto/pkcs7/t/c.pem
new file mode 100644 (file)
index 0000000..a4b55e3
--- /dev/null
@@ -0,0 +1,48 @@
+issuer :/C=AU/SP=Queensland/L=Brisbane/O=Cryptsoft Pty Ltd/OU=DEMONSTRATION AND TESTING/CN=DEMO ZERO VALUE CA
+subject:/C=AU/SP=Queensland/L=Brisbane/O=Cryptsoft Pty Ltd/OU=SMIME 003/CN=Information/Email=info@cryptsoft.com
+serial :047D
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1149 (0x47d)
+        Signature Algorithm: md5withRSAEncryption
+        Issuer: C=AU, SP=Queensland, L=Brisbane, O=Cryptsoft Pty Ltd, OU=DEMONSTRATION AND TESTING, CN=DEMO ZERO VALUE CA
+        Validity
+            Not Before: May 13 05:40:58 1998 GMT
+            Not After : May 12 05:40:58 2000 GMT
+        Subject: C=AU, SP=Queensland, L=Brisbane, O=Cryptsoft Pty Ltd, OU=SMIME 003, CN=Information/Email=info@cryptsoft.com
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Modulus:
+                    00:ad:e7:23:89:ee:0d:87:b7:9c:32:44:4b:95:81:
+                    73:dd:22:80:4b:2d:c5:60:b8:fe:1e:18:63:ef:dc:
+                    89:89:22:df:95:3c:7a:db:3d:9a:06:a8:08:d6:29:
+                    fd:ef:41:09:91:ed:bc:ad:98:f9:f6:28:90:62:6f:
+                    e7:e7:0c:4d:0b
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            Netscape Comment: 
+                Generated with SSLeay
+    Signature Algorithm: md5withRSAEncryption
+        52:15:ea:88:f4:f0:f9:0b:ef:ce:d5:f8:83:40:61:16:5e:55:
+        f9:ce:2d:d1:8b:31:5c:03:c6:2d:10:7c:61:d5:5c:0a:42:97:
+        d1:fd:65:b6:b6:84:a5:39:ec:46:ec:fc:e0:0d:d9:22:da:1b:
+        50:74:ad:92:cb:4e:90:e5:fa:7d
+
+-----BEGIN CERTIFICATE-----
+MIICTDCCAfagAwIBAgICBH0wDQYJKoZIhvcNAQEEBQAwgZIxCzAJBgNVBAYTAkFV
+MRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFuZTEaMBgGA1UE
+ChMRQ3J5cHRzb2Z0IFB0eSBMdGQxIjAgBgNVBAsTGURFTU9OU1RSQVRJT04gQU5E
+IFRFU1RJTkcxGzAZBgNVBAMTEkRFTU8gWkVSTyBWQUxVRSBDQTAeFw05ODA1MTMw
+NTQwNThaFw0wMDA1MTIwNTQwNThaMIGeMQswCQYDVQQGEwJBVTETMBEGA1UECBMK
+UXVlZW5zbGFuZDERMA8GA1UEBxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29m
+dCBQdHkgTHRkMRIwEAYDVQQLEwlTTUlNRSAwMDMxFDASBgNVBAMTC0luZm9ybWF0
+aW9uMSEwHwYJKoZIhvcNAQkBFhJpbmZvQGNyeXB0c29mdC5jb20wXDANBgkqhkiG
+9w0BAQEFAANLADBIAkEArecjie4Nh7ecMkRLlYFz3SKASy3FYLj+Hhhj79yJiSLf
+lTx62z2aBqgI1in970EJke28rZj59iiQYm/n5wxNCwIDAQABoygwJjAkBglghkgB
+hvhCAQ0EFxYVR2VuZXJhdGVkIHdpdGggU1NMZWF5MA0GCSqGSIb3DQEBBAUAA0EA
+UhXqiPTw+QvvztX4g0BhFl5V+c4t0YsxXAPGLRB8YdVcCkKX0f1ltraEpTnsRuz8
+4A3ZItobUHStkstOkOX6fQ==
+-----END CERTIFICATE-----
+
diff --git a/crypto/pkcs7/t/f b/crypto/pkcs7/t/f
new file mode 100644 (file)
index 0000000..7f5dc67
--- /dev/null
@@ -0,0 +1,2 @@
+signed body
+
diff --git a/crypto/pkcs7/t/ff b/crypto/pkcs7/t/ff
new file mode 100644 (file)
index 0000000..23f0135
--- /dev/null
@@ -0,0 +1,32 @@
+-----BEGIN PKCS7-----
+MIIGHgYJKoZIhvcNAQcCoIIGDzCCBgsCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCC
+BGswggJTMIIB/aADAgECAgIEfjANBgkqhkiG9w0BAQQFADCBkjELMAkGA1UEBhMCQVUxEzAR
+BgNVBAgTClF1ZWVuc2xhbmQxETAPBgNVBAcTCEJyaXNiYW5lMRowGAYDVQQKExFDcnlwdHNv
+ZnQgUHR5IEx0ZDEiMCAGA1UECxMZREVNT05TVFJBVElPTiBBTkQgVEVTVElORzEbMBkGA1UE
+AxMSREVNTyBaRVJPIFZBTFVFIENBMB4XDTk4MDUxMzA2MjY1NloXDTAwMDUxMjA2MjY1Nlow
+gaUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFu
+ZTEaMBgGA1UEChMRQ3J5cHRzb2Z0IFB0eSBMdGQxEjAQBgNVBAsTCVNNSU1FIDAwMzEZMBcG
+A1UEAxMQQW5nZWxhIHZhbiBMZWVudDEjMCEGCSqGSIb3DQEJARYUYW5nZWxhQGNyeXB0c29m
+dC5jb20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEAuC3+7dAb2LhuO7gt2cTM8vsNjhG5JfDh
+hX1Vl/wVGbKEEj0MA6vWEolvefQlxB+EzwCtR0YZ7eEC/T/4JoCyeQIDAQABoygwJjAkBglg
+hkgBhvhCAQ0EFxYVR2VuZXJhdGVkIHdpdGggU1NMZWF5MA0GCSqGSIb3DQEBBAUAA0EAUnSP
+igs6TMFISTjw8cBtJYb98czgAVkVFjKyJQwYMH8FbDnCyx6NocM555nsyDstaw8fKR11Khds
+syd3ikkrhDCCAhAwggG6AgEDMA0GCSqGSIb3DQEBBAUAMIGSMQswCQYDVQQGEwJBVTETMBEG
+A1UECBMKUXVlZW5zbGFuZDERMA8GA1UEBxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29m
+dCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNUUkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQD
+ExJERU1PIFpFUk8gVkFMVUUgQ0EwHhcNOTgwMzAzMDc0MTMyWhcNMDgwMjI5MDc0MTMyWjCB
+kjELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxETAPBgNVBAcTCEJyaXNiYW5l
+MRowGAYDVQQKExFDcnlwdHNvZnQgUHR5IEx0ZDEiMCAGA1UECxMZREVNT05TVFJBVElPTiBB
+TkQgVEVTVElORzEbMBkGA1UEAxMSREVNTyBaRVJPIFZBTFVFIENBMFwwDQYJKoZIhvcNAQEB
+BQADSwAwSAJBAL+0E2fLej3FSCwe2A2iRnMuC3z12qHIp6Ky1wo2zZcxft7AI+RfkrWrSGtf
+mfzBEuPrLdfulncC5Y1pNcM8RTUCAwEAATANBgkqhkiG9w0BAQQFAANBAGSbLMphL6F5pp3s
+8o0Xyh86FHFdpVOwYx09ELLkuG17V/P9pgIc0Eo/gDMbN+KT3IdgECf8S//pCRA6RrNjcXIx
+ggF7MIIBdwIBATCBmTCBkjELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxETAP
+BgNVBAcTCEJyaXNiYW5lMRowGAYDVQQKExFDcnlwdHNvZnQgUHR5IEx0ZDEiMCAGA1UECxMZ
+REVNT05TVFJBVElPTiBBTkQgVEVTVElORzEbMBkGA1UEAxMSREVNTyBaRVJPIFZBTFVFIENB
+AgIEfjAJBgUrDgMCGgUAoHowGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAbBgkqhkiG9w0B
+CQ8xDjAMMAoGCCqGSIb3DQMHMBwGCSqGSIb3DQEJBTEPFw05ODA1MTQwMzM5MzdaMCMGCSqG
+SIb3DQEJBDEWBBQstNMnSV26ba8PapQEDhO21yNFrjANBgkqhkiG9w0BAQEFAARAW9Xb9YXv
+BfcNkutgFX9Gr8iXhBVsNtGEVrjrpkQwpKa7jHI8SjAlLhk/4RFwDHf+ISB9Np3Z1WDWnLcA
+9CWR6g==
+-----END PKCS7-----
diff --git a/crypto/pkcs7/t/msie-e b/crypto/pkcs7/t/msie-e
new file mode 100644 (file)
index 0000000..aafae69
--- /dev/null
@@ -0,0 +1,20 @@
+
+MIAGCSqGSIb3DQEHA6CAMIACAQAxggHCMIHMAgEAMHYwYjERMA8GA1UEBxMISW50ZXJuZXQxFzAV
+BgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5k
+aXZpZHVhbCBTdWJzY3JpYmVyAhBgQJiC3qfbCbjdj5INYLnKMA0GCSqGSIb3DQEBAQUABECMzu8y
+wQ/qZbO8cAGMRBF+mPruv3+Dvb9aWNZ2k8njUgqF6mcdhVB2MkGcsG3memRXJBixvMYWVkU3qK4Z
+VuKsMIHwAgEAMIGZMIGSMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDERMA8GA1UE
+BxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29mdCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNU
+UkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQDExJERU1PIFpFUk8gVkFMVUUgQ0ECAgRuMA0GCSqG
+SIb3DQEBAQUABEBcWwYFHJbJGhiztt7lzue3Lc9CH5WAbyR+2BZ3uv+JxZfRs1PuaWPOwRa0Vgs3
+YwSJoRfxQj2Gk0wFqG1qt6d1MIAGCSqGSIb3DQEHATAaBggqhkiG9w0DAjAOAgIAoAQI8vRlP/Nx
+2iSggASCAZhR5srxyspy7DfomRJ9ff8eMCtaNwEoEx7G25PZRonC57hBvGoScLtEPU3Wp9FEbPN7
+oJESeC+AqMTyTLNy8aQsyC5s53E9UkoIvg62ekYZBbXZqXsrxx4PhiiX3NH8GVh42phB0Chjw0nK
+HZeRDmxGY3Cmk+J+l0uVKxbNIfJIKOguLBnhqmnKH/PrnzDt591u0ULy2aTLqRm+4/1Yat/QPb6J
+eoKGwNPBbS9ogBdrCNCp9ZFg3Xar2AtQHzyTQIfYeH3SRQUpKmRm5U5o9p5emgEdT+ZfJm/J4tSH
+OmbgAFsbHQakA4MBZ4J5qfDJhOA2g5lWk1hIeu5Dn/AaLRZd0yz3oY0Ieo/erPWx/bCqtBzYbMe9
+qSFTedKlbc9EGe3opOTdBZVzK8KH3w3zsy5luxKdOUG59YYb5F1IZiWGiDyuo/HuacX+griu5LeD
+bEzOtZnko+TZXvWIko30fD79j3T4MRRhWXbgj2HKza+4vJ0mzcC/1+GPsJjAEAA/JgIEDU4w6/DI
+/HQHhLAO3G+9xKD7MvmrzkoAAAAAAAAAAAAA
+
+
diff --git a/crypto/pkcs7/t/msie-e.pem b/crypto/pkcs7/t/msie-e.pem
new file mode 100644 (file)
index 0000000..a2a5e24
--- /dev/null
@@ -0,0 +1,22 @@
+-----BEGIN PKCS7-----
+MIAGCSqGSIb3DQEHA6CAMIIDkAIBADGCAcIwgcwCAQAwdjBiMREwDwYDVQQHEwhJ
+bnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAyBgNVBAsTK1ZlcmlT
+aWduIENsYXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmliZXICEGBAmILep9sJ
+uN2Pkg1gucowDQYJKoZIhvcNAQEBBQAEQIzO7zLBD+pls7xwAYxEEX6Y+u6/f4O9
+v1pY1naTyeNSCoXqZx2FUHYyQZywbeZ6ZFckGLG8xhZWRTeorhlW4qwwgfACAQAw
+gZkwgZIxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQH
+EwhCcmlzYmFuZTEaMBgGA1UEChMRQ3J5cHRzb2Z0IFB0eSBMdGQxIjAgBgNVBAsT
+GURFTU9OU1RSQVRJT04gQU5EIFRFU1RJTkcxGzAZBgNVBAMTEkRFTU8gWkVSTyBW
+QUxVRSBDQQICBG4wDQYJKoZIhvcNAQEBBQAEQFxbBgUclskaGLO23uXO57ctz0If
+lYBvJH7YFne6/4nFl9GzU+5pY87BFrRWCzdjBImhF/FCPYaTTAWobWq3p3UwggHD
+BgkqhkiG9w0BBwEwGgYIKoZIhvcNAwIwDgICAKAECPL0ZT/zcdokgIIBmFHmyvHK
+ynLsN+iZEn19/x4wK1o3ASgTHsbbk9lGicLnuEG8ahJwu0Q9Tdan0URs83ugkRJ4
+L4CoxPJMs3LxpCzILmzncT1SSgi+DrZ6RhkFtdmpeyvHHg+GKJfc0fwZWHjamEHQ
+KGPDScodl5EObEZjcKaT4n6XS5UrFs0h8kgo6C4sGeGqacof8+ufMO3n3W7RQvLZ
+pMupGb7j/Vhq39A9vol6gobA08FtL2iAF2sI0Kn1kWDddqvYC1AfPJNAh9h4fdJF
+BSkqZGblTmj2nl6aAR1P5l8mb8ni1Ic6ZuAAWxsdBqQDgwFngnmp8MmE4DaDmVaT
+WEh67kOf8BotFl3TLPehjQh6j96s9bH9sKq0HNhsx72pIVN50qVtz0QZ7eik5N0F
+lXMrwoffDfOzLmW7Ep05Qbn1hhvkXUhmJYaIPK6j8e5pxf6CuK7kt4NsTM61meSj
+5Nle9YiSjfR8Pv2PdPgxFGFZduCPYcrNr7i8nSbNwL/X4Y+wmMAQAD8mAgQNTjDr
+8Mj8dAeEsA7cb73EoPsy+avOSgAAAAA=
+-----END PKCS7-----
diff --git a/crypto/pkcs7/t/msie-enc-01 b/crypto/pkcs7/t/msie-enc-01
new file mode 100644 (file)
index 0000000..2c93ab6
--- /dev/null
@@ -0,0 +1,62 @@
+
+MIAGCSqGSIb3DQEHA6CAMIACAQAxgfMwgfACAQAwgZkwgZIxCzAJBgNVBAYTAkFVMRMwEQYD
+VQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFuZTEaMBgGA1UEChMRQ3J5cHRzb2Z0
+IFB0eSBMdGQxIjAgBgNVBAsTGURFTU9OU1RSQVRJT04gQU5EIFRFU1RJTkcxGzAZBgNVBAMT
+EkRFTU8gWkVSTyBWQUxVRSBDQQICBG4wDQYJKoZIhvcNAQEBBQAEQKvMaW8xh6oF/X+CJivz
+IZV7yHxlp4O3NHQtWG0A8MOZB+CtKlU7/6g5e/a9Du/TOqxRMqtYRp63pa2Q/mM4IYMwgAYJ
+KoZIhvcNAQcBMBoGCCqGSIb3DQMCMA4CAgCgBAifz6RvzOPYlKCABIGwxtGA/FLBBRs1wbBP
+gDCbSG0yCwjJNsFg89/k6xuXo8c5YTwsw8+XlIVq03navpew6XxxzY090rD2OJ0t6HA6GqrI
+pd8WiSh/Atqn0yfLFmkLqgIAPRfzxUxqUocxLpQsLIFp2YNUGE+yps+UZmIjw/WHfdqrcWTm
+STSvKuy3UkIJZCkGDBpTvqk4BFaHh4oTXEpgpNY+GKxjf9TDN9GQPqQZR7sgQki4t2g4/Saq
+Kl4EMISgluk6swdND0tiHY7v5d6YR29ePCl2/STJ98eJpWkEEC22GNNvOy7ru/Rv2He4MgQg
+optd7sk9MMd9xhJppg7CcH/yDx//HrtgpOcWmn6VxpgECFqon4uXkQtIBIH4PaNclFn7/hLx
+Pw2VmBGaC0SYF3U1jyN96EBxdjqy8Aa6ByMXYDW5BcfqniD5mYXfw+b81lh1kutxaPaV4YJ9
+ZlRUW752N7VHo/fG0/fukoe5W9a8kIhgLpygllb/GP4oSF4wM6n1/OgRzZj2IWFiobKO4d/t
+Mnh+C+PoEVAuFZcxQwi9GqvsK5OoIjVwNx0XcVSOl1TTYS9SwC7ugMBCab73JiruC24pL78Y
+M+NaIpIQ3On4DokJA2ZHtjBjZIxF4tKA144RvFN6pBd6TVE5XM6KD/Vh9bjSmujtEAfdQ3Te
+dvKJsbZuu0stErbvWcRy11I328l557EECAJT7d44OJ3rBBBj6bnnx6dDU2SRqp2CEoQaBAhK
+RBuyhNxkygQIOY9/NhwqAJAECOvX0Zd0DqgoBAjobPpMHhVV3gQQWLU2vEoZ51BwzxdzCmxO
+wwQI4oKfudaNqoAESKzBNAqv5kGumHOlMKsRfrs7jZCcSaOuEj97pYx08FLEgF23cav39MOQ
+NUEM1dNU+EYslL4o3RoSHRjUgPU+2t9c0prS9A/bPARIEOP94PynaTNxwHi3VTK7SzuQmgzA
+4n942E9joSiqsQPlsKAb3sPUaLC3SuUxSjNBgfpvD0bmrA/5h+WZoYXvIogFpwjkSmnFBEie
+0lh5Ov1aRrvCw5/j3Q/W/4ZtN5U+aeVBJMtA8n0Mxd5kPxHbNVh4oGprZ6wEegV8ht3voyZa
+mZ5Cyxc8ffMYnM/JJI6/oEYEUEMyyiS5FnYyvxKzfMtyn2lZ2st9nZGNNgMc9N62r5HgNbdD
+FHuRdKKzV+8kQfuMc3mOPpK1t9TFY+QgrxiB5p6S7VooI97YtP3PbfknszCEBEh4PdXYbbaR
+3AacN3Q5kYYmWsq3WW6xgrg0mmEGosGvwSQxBBuiXZrxScCa4ivEq05UZwyShePvKduOvnUE
+2zDO6IXFLZxhTZAESEm9/FovLgGAiJ7iMGmYvsISLJScwG4n+wrSaQNQXizs9N3ykys54wBN
+d/+BQ4F7pncHhDQ2Dyt5MekB8Y8iNOocUTFCu524vQRIaWCXmXP3vU7D21dp0XnAMzRQJ565
+JV3aHRoY7XDa4LePa7PP9ywyafOE5yCW7ndqx3J+2JhTDvSFsW8/q3H3iyeFhykuJVS6BFDK
+6CmKbnyyjOfE2iLGJmTFa905V2KrVDCmlEu/xyGMs80yTyZC+ySzM83FMVvLEQmSzcTNUZVp
+DfA1kNXbXkPouBXXT6g8r8JCRljaKKABmgRIlMheOJQRUUU4cgvhMreXPayhq5Ao4VMSCkA5
+hYRCBczm4Di/MMohF0SxIsdRY6gY9CPnrBXAsY6h1RbR7Tw0iQZmeXi52DCiBEj0by+SYMAa
+9z0CReIzl8JLL6EVIFz8kFxlkGWjr4dnOzhhPOq/mCpp0WxbavDfdhE87MdXJZBnLwoT62QG
+955HlAoEQBOGJbcESCgd5XSirZ9Y3AbCfuKOqoMBvEUGn+w/pMaqnGvnr5FZhuBDKrhRXqtx
+QsxA//drGUxsrZOuSL/0+fbvo7n2h1Z8Ny86jOvVZAQIAjw2l1Yc5RAESNc9i3I8pKEOVQf/
+UBczJ0NR9aTEF80dRg2lpXwD0ho4N0AvSiVbgxC7cPZHQwIqvq9LHRUs/4n+Vu3SVYU3cAxo
+lUTiCGUSlARIF+TD57SI5+RI+MNtnD9rs4E1ml51YoHGWFj3UPriDmY0FKEwIgqtMXMY3fZ9
+Kq8d83bjDzxwbDX7WwR7KbSeJWT42pCz7kM+BEjjPsOnZHuusXT3x2rrsBnYtYsbt98mSFiS
+KzTtFmXfkOBbCQdit1P76QnYJ1aXMGs6zP6GypQTadK/zYWvlm38QkVwueaJ0woESKW2pqKA
+70h2UMDHOrpepU1lj0YMzmotDHSTU3L909VvUMNg9uqfrQ6mSkb9j5Tl8oF2otOw5EzA1Yda
+KPmgsv62RWLYl80wXQRQwG0e/mgG75jp9lOhJdVXqcYbQpS9viwVaVkwH+69mu/bQI4gjoEs
+UYX6O71Re2z+cYhcm9UrK+DXuSFBXQOIlAFxKMW4B0apd6fU84FsZLMESOorXE5OE0A2B2ji
+J8QI0Exk4hUvWrMNJfUZwFyS7E05xV9ORuX1xmsKqkT4tVR5Nqln4vhvAY860VBoloz0CDkd
+8seSBEjeMgRI9FvpYuflIeHg9urkwp6N+1f0DrJJhJY9ZQ0HTQhziJmIfvbEjNqCl7hEC28+
+F8I5tuViLgfSwcFFCvnS6WFoN4X6QdFdqMCbBEjdlI1c+IQGA/IuTDMJYCuQ/v+8BG5ZeWVH
+icPZmXfRat9eFK1dGKAJef6+Tf9HPuDjSpDyffrifsp7Dc34lmm7GN1+ON3ZMtwEUNm6epb8
+1RKWjoI7jIKUV/M2p/0eeGSqs4b06KF/VR6dBwsJVL5DpnTsp3MV4j/CAOlRdSPZ5++tsKbM
+aplk+ceqQtpEFz1MYTtVV4+rlrWaBEA1okJyNZ5/tNOwM7B+XfOZ0xw+uyVi9v4byTZM2Qds
+J+d3YGYLAugTGHISLqQEerD8/gGK+/SL06b2gNedXPHtBAiBKX+Mdy3wFQQIqE9gVgvrFNUE
+CKKoTFoMGqnPBAjDPgLCklNfrwQI3Ek1vSq68w8ECBodu2FOZJVkBAgzwjfSr2N9WQQQTCoQ
+KkAbrS9tnjXn1I3+ZwQIrPx3eINo/YUECIeYWCFskxlYBAiDUdvZXwD3vgQIkEyZbbZWbUUE
+CH4+odl1Isk3BBj68fkqJ0fKJRWVLWuW/O3VE4BOPKwFlaIECFseVTdDUho8BAj+cOKvV2WA
+hgQgaXr+wwq+ItblG0Qxz8IVUXX6PV2mIdHwz4SCCvnCsaIECJhBYxdfLI/XBCDswamPn9MR
+yXi2HVQBineV+GtWVkIoZ2dCLFB9mQRMoAQI0nUR5a5AOJoECA+AunKlAlx8BAi5RtFeF4g1
+FQQIz/ie+16LlQcECOmNuVg5DXjMBAjH2nkfpXZgWwQIVdLuO/+kuHAECO/5rEHmyI9vBBD4
+16BU4Rd3YerDQnHtrwOQBCCkho1XxK5Maz8KLCNi20wvcGt8wsIXlj2h5q9ITBq7IgQQvKVY
+4OfJ7bKbItP2dylwQgQYPIGxwkkbRXNraONYvN19G8UdF35rFOuIBAjf0sKz/618ZQQIxObr
+xJkRe0sECIC+ssnjEb2NBBBI+XM4OntVWGsRV9Td3sFgBAinGwIroo8O0gQQMGAwgc9PaLaG
+gBCiwSTrYQQIVHjfCQgOtygEUIoraFoANfhZgIShpOd/RRxFU4/7xZR5tMdGoYz/g0thR0lM
++Hi88FtFD4mAh/Oat4Ri8B7bv04aokjN2UHz6nPbHHjZ8zIqpbYTCy043GNZBAhOqjyB2JbD
+NwQoR23XCYD9x6E20ChHJRXmaHwyMdYXKl5CUxypl7ois+sy2D7jDukS3wQIsTyyPgJi0GsA
+AAAAAAAAAAAA
+
diff --git a/crypto/pkcs7/t/msie-enc-01.pem b/crypto/pkcs7/t/msie-enc-01.pem
new file mode 100644 (file)
index 0000000..9abf00b
--- /dev/null
@@ -0,0 +1,66 @@
+-----BEGIN PKCS7-----
+MIAGCSqGSIb3DQEHA6CAMIILyAIBADGB8zCB8AIBADCBmTCBkjELMAkGA1UEBhMC
+QVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxETAPBgNVBAcTCEJyaXNiYW5lMRowGAYD
+VQQKExFDcnlwdHNvZnQgUHR5IEx0ZDEiMCAGA1UECxMZREVNT05TVFJBVElPTiBB
+TkQgVEVTVElORzEbMBkGA1UEAxMSREVNTyBaRVJPIFZBTFVFIENBAgIEbjANBgkq
+hkiG9w0BAQEFAARAq8xpbzGHqgX9f4ImK/MhlXvIfGWng7c0dC1YbQDww5kH4K0q
+VTv/qDl79r0O79M6rFEyq1hGnrelrZD+YzghgzCCCssGCSqGSIb3DQEHATAaBggq
+hkiG9w0DAjAOAgIAoAQIn8+kb8zj2JSAggqgxtGA/FLBBRs1wbBPgDCbSG0yCwjJ
+NsFg89/k6xuXo8c5YTwsw8+XlIVq03navpew6XxxzY090rD2OJ0t6HA6GqrIpd8W
+iSh/Atqn0yfLFmkLqgIAPRfzxUxqUocxLpQsLIFp2YNUGE+yps+UZmIjw/WHfdqr
+cWTmSTSvKuy3UkIJZCkGDBpTvqk4BFaHh4oTXEpgpNY+GKxjf9TDN9GQPqQZR7sg
+Qki4t2g4/SaqKl6EoJbpOrMHTQ9LYh2O7+XemEdvXjwpdv0kyffHiaVpBBAtthjT
+bzsu67v0b9h3uDKim13uyT0wx33GEmmmDsJwf/IPH/8eu2Ck5xaafpXGmFqon4uX
+kQtIPaNclFn7/hLxPw2VmBGaC0SYF3U1jyN96EBxdjqy8Aa6ByMXYDW5BcfqniD5
+mYXfw+b81lh1kutxaPaV4YJ9ZlRUW752N7VHo/fG0/fukoe5W9a8kIhgLpygllb/
+GP4oSF4wM6n1/OgRzZj2IWFiobKO4d/tMnh+C+PoEVAuFZcxQwi9GqvsK5OoIjVw
+Nx0XcVSOl1TTYS9SwC7ugMBCab73JiruC24pL78YM+NaIpIQ3On4DokJA2ZHtjBj
+ZIxF4tKA144RvFN6pBd6TVE5XM6KD/Vh9bjSmujtEAfdQ3TedvKJsbZuu0stErbv
+WcRy11I328l557ECU+3eODid62PpuefHp0NTZJGqnYIShBpKRBuyhNxkyjmPfzYc
+KgCQ69fRl3QOqCjobPpMHhVV3li1NrxKGedQcM8XcwpsTsPigp+51o2qgKzBNAqv
+5kGumHOlMKsRfrs7jZCcSaOuEj97pYx08FLEgF23cav39MOQNUEM1dNU+EYslL4o
+3RoSHRjUgPU+2t9c0prS9A/bPBDj/eD8p2kzccB4t1Uyu0s7kJoMwOJ/eNhPY6Eo
+qrED5bCgG97D1Giwt0rlMUozQYH6bw9G5qwP+YflmaGF7yKIBacI5EppxZ7SWHk6
+/VpGu8LDn+PdD9b/hm03lT5p5UEky0DyfQzF3mQ/Eds1WHigamtnrAR6BXyG3e+j
+JlqZnkLLFzx98xicz8kkjr+gRkMyyiS5FnYyvxKzfMtyn2lZ2st9nZGNNgMc9N62
+r5HgNbdDFHuRdKKzV+8kQfuMc3mOPpK1t9TFY+QgrxiB5p6S7VooI97YtP3Pbfkn
+szCEeD3V2G22kdwGnDd0OZGGJlrKt1lusYK4NJphBqLBr8EkMQQbol2a8UnAmuIr
+xKtOVGcMkoXj7ynbjr51BNswzuiFxS2cYU2QSb38Wi8uAYCInuIwaZi+whIslJzA
+bif7CtJpA1BeLOz03fKTKznjAE13/4FDgXumdweENDYPK3kx6QHxjyI06hxRMUK7
+nbi9aWCXmXP3vU7D21dp0XnAMzRQJ565JV3aHRoY7XDa4LePa7PP9ywyafOE5yCW
+7ndqx3J+2JhTDvSFsW8/q3H3iyeFhykuJVS6yugpim58soznxNoixiZkxWvdOVdi
+q1QwppRLv8chjLPNMk8mQvskszPNxTFbyxEJks3EzVGVaQ3wNZDV215D6LgV10+o
+PK/CQkZY2iigAZqUyF44lBFRRThyC+Eyt5c9rKGrkCjhUxIKQDmFhEIFzObgOL8w
+yiEXRLEix1FjqBj0I+esFcCxjqHVFtHtPDSJBmZ5eLnYMKL0by+SYMAa9z0CReIz
+l8JLL6EVIFz8kFxlkGWjr4dnOzhhPOq/mCpp0WxbavDfdhE87MdXJZBnLwoT62QG
+955HlAoEQBOGJbcoHeV0oq2fWNwGwn7ijqqDAbxFBp/sP6TGqpxr56+RWYbgQyq4
+UV6rcULMQP/3axlMbK2Trki/9Pn276O59odWfDcvOozr1WQCPDaXVhzlENc9i3I8
+pKEOVQf/UBczJ0NR9aTEF80dRg2lpXwD0ho4N0AvSiVbgxC7cPZHQwIqvq9LHRUs
+/4n+Vu3SVYU3cAxolUTiCGUSlBfkw+e0iOfkSPjDbZw/a7OBNZpedWKBxlhY91D6
+4g5mNBShMCIKrTFzGN32fSqvHfN24w88cGw1+1sEeym0niVk+NqQs+5DPuM+w6dk
+e66xdPfHauuwGdi1ixu33yZIWJIrNO0WZd+Q4FsJB2K3U/vpCdgnVpcwazrM/obK
+lBNp0r/Nha+WbfxCRXC55onTCqW2pqKA70h2UMDHOrpepU1lj0YMzmotDHSTU3L9
+09VvUMNg9uqfrQ6mSkb9j5Tl8oF2otOw5EzA1YdaKPmgsv62RWLYl80wXcBtHv5o
+Bu+Y6fZToSXVV6nGG0KUvb4sFWlZMB/uvZrv20COII6BLFGF+ju9UXts/nGIXJvV
+Kyvg17khQV0DiJQBcSjFuAdGqXen1POBbGSz6itcTk4TQDYHaOInxAjQTGTiFS9a
+sw0l9RnAXJLsTTnFX05G5fXGawqqRPi1VHk2qWfi+G8BjzrRUGiWjPQIOR3yx5IE
+SN4y9FvpYuflIeHg9urkwp6N+1f0DrJJhJY9ZQ0HTQhziJmIfvbEjNqCl7hEC28+
+F8I5tuViLgfSwcFFCvnS6WFoN4X6QdFdqMCb3ZSNXPiEBgPyLkwzCWArkP7/vARu
+WXllR4nD2Zl30WrfXhStXRigCXn+vk3/Rz7g40qQ8n364n7Kew3N+JZpuxjdfjjd
+2TLc2bp6lvzVEpaOgjuMgpRX8zan/R54ZKqzhvTooX9VHp0HCwlUvkOmdOyncxXi
+P8IA6VF1I9nn762wpsxqmWT5x6pC2kQXPUxhO1VXj6uWtZo1okJyNZ5/tNOwM7B+
+XfOZ0xw+uyVi9v4byTZM2QdsJ+d3YGYLAugTGHISLqQEerD8/gGK+/SL06b2gNed
+XPHtgSl/jHct8BWoT2BWC+sU1aKoTFoMGqnPwz4CwpJTX6/cSTW9KrrzDxodu2FO
+ZJVkM8I30q9jfVlMKhAqQButL22eNefUjf5nrPx3eINo/YWHmFghbJMZWINR29lf
+APe+kEyZbbZWbUV+PqHZdSLJN/rx+SonR8olFZUta5b87dUTgE48rAWVolseVTdD
+Uho8/nDir1dlgIZpev7DCr4i1uUbRDHPwhVRdfo9XaYh0fDPhIIK+cKxophBYxdf
+LI/X7MGpj5/TEcl4th1UAYp3lfhrVlZCKGdnQixQfZkETKDSdRHlrkA4mg+AunKl
+Alx8uUbRXheINRXP+J77XouVB+mNuVg5DXjMx9p5H6V2YFtV0u47/6S4cO/5rEHm
+yI9v+NegVOEXd2Hqw0Jx7a8DkKSGjVfErkxrPwosI2LbTC9wa3zCwheWPaHmr0hM
+GrsivKVY4OfJ7bKbItP2dylwQjyBscJJG0Vza2jjWLzdfRvFHRd+axTriN/SwrP/
+rXxlxObrxJkRe0uAvrLJ4xG9jUj5czg6e1VYaxFX1N3ewWCnGwIroo8O0jBgMIHP
+T2i2hoAQosEk62FUeN8JCA63KIoraFoANfhZgIShpOd/RRxFU4/7xZR5tMdGoYz/
+g0thR0lM+Hi88FtFD4mAh/Oat4Ri8B7bv04aokjN2UHz6nPbHHjZ8zIqpbYTCy04
+3GNZTqo8gdiWwzdHbdcJgP3HoTbQKEclFeZofDIx1hcqXkJTHKmXuiKz6zLYPuMO
+6RLfsTyyPgJi0GsAAAAA
+-----END PKCS7-----
diff --git a/crypto/pkcs7/t/msie-enc-02 b/crypto/pkcs7/t/msie-enc-02
new file mode 100644 (file)
index 0000000..7017055
--- /dev/null
@@ -0,0 +1,90 @@
+
+MIAGCSqGSIb3DQEHA6CAMIACAQAxggHCMIHMAgEAMHYwYjERMA8GA1UEBxMISW50ZXJuZXQxFzAV
+BgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5k
+aXZpZHVhbCBTdWJzY3JpYmVyAhBgQJiC3qfbCbjdj5INYLnKMA0GCSqGSIb3DQEBAQUABEACr4tn
+kSzvo3aIlHfJLGbfokNCV6FjdDP1vQhL+kdXONqcFCEf9ReETCvaHslIr/Wepc5j2hjZselzgqLn
+rM1ZMIHwAgEAMIGZMIGSMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDERMA8GA1UE
+BxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29mdCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNU
+UkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQDExJERU1PIFpFUk8gVkFMVUUgQ0ECAgRuMA0GCSqG
+SIb3DQEBAQUABEBanBxKOvUoRn3DiFY55lly2TPu2Cv+dI/GLrzW6qvnUMZPWGPGaUlPyWLMZrXJ
+xGXZUiRJKTBwDu91fnodUEK9MIAGCSqGSIb3DQEHATAaBggqhkiG9w0DAjAOAgIAoAQImxKZEDWP
+EuOggASCBACBi1bX/qc3geqFyfRpX7JyIo/g4CDr62GlwvassAGlIO8zJ5Z/UDIIooeV6QS4D4OW
+PymKd0WXhwcJI0yBcJTWEoxND27LM7CWFJpA07AoxVCRHTOPgm794NynLecNUOqVTFyS4CRuLhVG
+PAk0nFZG/RE2yMtx4rAkSiVgOexES7wq/xWuoDSSmuTMNQOTbKfkEKqdFLkM/d62gD2wnaph7vKk
+PPK82wdZP8rF3nUUC5c4ahbNoa8g+5B3tIF/Jz3ZZK3vGLU0IWO+i7W451dna13MglDDjXOeikNl
+XLsQdAVo0nsjfGu+f66besJojPzysNA+IEZl6gNWUetl9lim4SqrxubUExdS2rmXnXXmEuEW/HC7
+dlTAeYq5Clqx5id6slhC2C2oegMww3XH9yxHw6OqzvXY6pVPEScEtBMQLgaKFQT+m2SRtbTVFG7c
+QcnUODyVB1IbpQTF1DHeeOX1W/HfpWZym8dzkti6SCyeumHmqO406xDiIMVKtHOqM86nEHuAMZsr
+cLy+ey6TEJvR6S4N8QRzng8JJDZDTJXQN6q84aEudsnOrw2KyOVwPpI6ey4qBsHUgQ8kAFy5lsQa
+WV45h6exgUwbBcKLgPZGFj+OdD2RKJsTb83/UqbJS5Q/lGXhzBlnaYucyJxEprRxbntmcnOEPFJe
++tRDUwOTd7qlJljdhIJL+uDcooL9Ahgo6Cwep6tduekv2cSEohJeTE8Dvy34YRhMbLvnFNdmnpNy
+rNZDYVVxxaKoyd2AfB8NPFZh1VdAYfI3R1QAQ2kXEef5NNIfVQfMzD9akJn4RP+Kv32Qaxm4FrnK
+xmwRyGJShavIBc2ax+F1r1+NZXuSBHn5vfoRTxOk0ST4dXsw74dnlYUMRaSu4qqUdM9jsXSyeX4Z
+gQgkR2bkaYO6ezFgenFIa7QWVw8rXZAEZ5aibCxbnY1VE41PYIvhlLdbFJhH9gY22s+fFAuwnzyA
+SRjC40A9aAEItRlaPStWSGiqlLRgNkBBwdpv2l2YPBd2QzHx6ek6XGrvRJuAC+Nh62rtQKwpNH54
+YAOHW55maBFW2SQ3TF+cZ6NbbqhCmHTyyR7mcSYc9sXSVDWEhYKQ1iyU870zhHWVpvglZizZetJC
+ZFjYex3b1ngVdcgargOvpPq9urCKKi2mbkqv/EFpzSWGXkKSpfCG/XfMnEOtkNrB8S06vnk2JcJB
+OBqJot+uuSH5hOg0vTpxX2DuONJSiWSWyfRE/lTfJJFXwhod7SXclUyXPeSyibcSic2hVAzDmwjD
+31js/j2k02PI/agPhr3UQ8cMgcNAiaoCKbNaWfn6BGbCAbTchxzUlo2cSJiLlrX2IDZmfXbXmZCo
+m1smWIG+BIIEALiuAxDb6dWLAYyVBoN9hYI4AiPeZAY9MtvQ6AV8o2/EFm6PvYGXy3Hei5830CH0
+PBeX7Kdd6ff1y33TW/l5qSkIL1ULTGR7okFfJePHDmq1dFt6/JOMptiQ8WSu7CsJQvZ9VTFXeYFc
+ZqCPPZc1NrPegNK70Zf9QxWIbDAevJ5KLBf1c6j8pU2/6LnvDY6VjaTvYSgr7vTR8eVzH4Rm77W0
+iOHxg5VcODv6cGSVyuvbX8UAGo8Cmb58ERDtBDJBQXVpWKLNAuDJ9GX8n2zNkpjZLbPSkcmuhqGa
+BJBE/BaCTkUQWlY9dIbRtEnxIU1mfbPPdx1Ppa8DqGDjSOsQdKcKYNNZtayEw++EIpmpdBNsKphC
+fB8UEK2Wkk4ZVW+qyGoi/r0MFsvO1NmSOOZ0o/jy/YHmoeURHhPy97AO3eVTkEAa5CfJEJybmo56
+7CDw/FwoGAUCgsoz7rlxzMudr/IhHIH+APinncxXlHO2ecvHD9i8DaHGA8tVifgsUhqQoZieULut
+eF94O5UAxOkv41UZssYTwN4nYrN1QkesZl3BX4ORS4EE30/PQ23ARf3WZptZrCJevGm2ZYzGeh8x
+g17mCDfiLO+bff4qP/4mC96Pu4ia6j4to5BwKIJS/+DCuoD8WeSKF4pugXQkMUiHdQnNnVP9Sp2O
+/4ly5mO8JzrQC59V2bnTNBqPhpno8kfJvK5TypPSVC+bTzern3rJ6UceB3srcn9zxKx9GdNydJQj
+yWjv8ec3n3d1nuQwhz5Q053NBhIjwoGg3Go7LO6i78ZOlpF7dcoAO13NfHLyNjnyHCaiWtVRTct9
+rLf5vN00urSn8YJngHk1eTKK8nHGIcOg6YdYDOD2nE5XwRijKmieG8Xa3eKRzfbL06GrBQENle6J
+mC131bp3cRVxpjq+o6RAbGoMm4yICsL4eTarCQrsyHmoPHqr91UHo91avyxU7knWmEhX27ybmsrs
+8aeZwPHixL14TeyhruCqRVvkf1Ks7P+z8MPUboGNqQe2WLN8ktCGEr15O8MJR/em86G03Jfo4oaw
+/DVUH5RwLT6acedOGuzMh/2r8BcmemhVQ8/cWvV4YJ0tOW4hzyVHC5hQf8sZ3LzxXLH6Ohnrbprh
+xvrdbaSdChWZDDP0bCCbxEhkwuBkBeKZrMbwRTP+TPTPYLVTH/CmKLzKh/114tkGkyO3hHS4qExU
+V39F2Sj4mylx+hD0+20D9pntpNi7htccGlOm6yNM69at/3+kLgJJyoIlaxLcCUYHNMifDt+T3p/t
+5U4XmD53uUQ6M8dvj/udqPekNSUfse15yrd9pjOt5PcJuqW28q0sFHf9pHIgz3XZFMe5PD7ppw6r
+S+C6Ir4PrYIEggQA7ZDVtiCm+BbtNNB/UJm79/OQ5mp5bTI0kPmDeycaWTa0Ojpum+c/dpG/iJOB
+DICj7jHOXSHT7JlGyX6aSFJUltucAnZvwzhPDmdDaIDiKSk85GqgdDWVfGosSCX9Ph/T3WpIxnwf
+WSDRtIHkWTjly+pe4yy5K6/XISy/L5Zh/fhiI5fjHjgzmlibs2ru4nVw6hBhUvlSSe2BEs5d9h/y
+NH8Wy3qvb2D3jh7hkepFtZJGNTHp8ZUC7Ns2JIpQYObsaxdI65i3mMOu7fRwI+0/4ejsWhP6KCEi
+LgwvLg0qM82ma6YB7qHAHboaczRVEffDcJUG4a5uycB0DoZFn+uEaEFyili20hCn4hVfsqUQk2PT
+8Mo1tSl5e30xI1YJZrRgiJm9nHRX6fLizngP+ILJLPHZsPvlSVIfY+/v/FR8feKOjaGhyGF51BAx
+aM2NIQ4jMP5/X+U5gQybi0E6u7rroDhaHsKmCMgXqszwXWCpedA/sEbeHpiTC59YlPPSlIOMc9vP
+Ko/mQCfWy/9icUaIfKQldvkllUxxNkqu6AbIpHVscbAEzSPs5xbQXU8EZNNCDisFnnpY3nQ3eLnl
+m89saTJxRb7NWHRMlmPv7qgD7uMIq3vdOGA7i5wT9MeoNIgK1/DsgH30s6RWjJy4YyyLmRTXPzbj
+hbQVpEmiMRbEidIvUx2OjKVxVQIcgtLsa2lvHQ4XL1cpLr5GVtOgy0fMg5OCDUUDsvjgjgLQ3P2U
+p2nVY5FM6/QpPc5DTLuuR9ekI2/c9Biz09RtcYDUQK2ajdo8h1IyKqHFoB7h48OXxXKKY94DY0TG
+x6PonB/epj8orAw4QKmm5M0vXYwBOqRymCTHTqOJGObdLx1euFFyqguzHJOU2gAGZI0z9Lg1yRuF
+yhdPZyuniIcmtLNxRZ1duYHErcAyX56qndmLXt7UVkATai/rIMuoJLfAsUnVuTUS5p7tJM754UZT
+7lTcXvDJgOUNnBRaIcxC3pxvbrYDJ2iFJ72xkxUP2p74gucqg25XnCVmQuLg6zDDxF6CLuw9isxy
+Xg4pkneMN//7fpp8GYl9nyZm2yqYYM+jcw0fcVc64L+X4w/gL3H2UMGgxIHSJp7HIG7VKHtXrNyj
+dPXXPVUsMsAAimqOr0Lr2sZWirfuivLaPTqhbkvG5PF7K3gT80AOIcd/6EIHBy2hZ7ukfjHmdP4L
+yQOhTQklaKzGHI0mypq0uFLWJOUlZnVrMiLP1xrWkpC8Ro9eo6mfjjQ45z8adC43a47klwTEzvod
+3rNEFIGJJUEjAN3mbqie7IxoSJknBBJK0D9lZEQ8lZWlq7vuN8JdqPM6xh155jMVsPwjLK6Tzkj5
+BpRD9Tgm3u6HPQSCBADgkWEN75Mu9TGosXY0xm1k6K6sPv8L949CrLWo4r1I2LA072bTGvQP28Vs
+hUA76jgcT1ocC++9PoktIK10YCq5w+FfMAQ04KeCXuAdmiY2iAT4Slea61PMCMta3mVGyLUZCLEm
+P+I0UKR5mlO0fGEcjU9j8TmbjZqxNFqloLsU7oSi7Os0EtYHkdAVrExUyOc/ZDie6fBjdLTmLdCm
+bE9JNwjlbXypdTZupGgLNhKGDIskUAAMwZYayI6YfSIMkNCeAYTnjOuGZZ1msCXGXsfMBR1sfUIj
+9UeGjwD8gq+UVVHX/oeoH/m0eJ5ppqi3+nUlgc9DvpYsC/Fg0G2KuYb9B+VJ+a4GMzQSPREoFtQp
+B9dtLkBb7Ha/hpGWTIdqzW0eAo5llyN8FNvl2Fu2IcLaNmWFO69gLjRKQopp0dvFOuwAVI6fvGDj
+p1WigoNbFZl8N+iiWmzKOjoG2ZLbez1clZCms/JPJrXhEMMOxWpVzkQyN336VWHmGgMcjaKCGSeA
+2nnESIGuiCXMrkHlGfabYIsKcHFCo2t13uXyZPf0zSPTkuD0Eh92wqC9pvA3gvrrCUfo9Mn3bs+e
+KWKmDlpcs8mDn032oIg+zrQhIduMqXVn3evzeVM3B5MBOGMvg51/SXg7R+MC/463juQQEb9IVe/I
+YGnO//oWm9lw/377Af/qH+FnN02obJw1FvesQIs9e5RHNQykKbO+vmVJQl1nd9DZWrHDNO7/80Yz
+2hCm7Tws5nSRN2iFlyRaYJHr7ypxkU2rCak2r6ua7XDwu1qU2RT3+qPjT1RuxQ2oTlHyGkKPMZGC
+Rc+CSWz5aeeCmHZVwdb3nC8YpfsujMiYqygLeuQ82pjKuR7DIKGmnfcOLdv5F+Ek2Wyy0D98iSgk
++aoQGYLhL9llU13pn21uRsDY5uGcXiIw1IETFlTdgENEv8futZuJsegrp7fmFXyNoNyFNyypeDrM
+6ZqR4vKxFjg3tKKeVpkw/W4EAklzMxmNiazGNDBHsnYV3rwPlKa+HeeE2YxnsKwGLCNgRYUXTaJk
+461vS160z3dvh/mLfdZ7MYCkmO3bNE3ELUDAw7YQkSuo9ujzdFKte9LC34sjg9fOex3ThAg5Y50n
+wYm4zBmGM7yEqL8O6QgnM6tIDFS9XryDaLNzcGhMWqMvhzO6sC/AA2WfLgwS517Cp03IkJQWqG9q
+w52+E+GAtpioJfczEhlv9BrhjttdugRSjJrG8SYVYE4zG3Aur5eNBoGaALIOHOtPw8+JovQmIWcF
+oaJ/WQuglFrWtew51IK6F8RiHAOBVavZOuZcO7tV+5enVfreOd0rX8ZOy4hYmHhmF1hOrrWOn+Ee
+E0SYKonXN01BM9xMBIIBSLCvNAppnGPTUGjwbMJRg1VJ2KMiBWH5oJp8tyfIAxMuWFdtaLYbRSOD
+XbOAshPVK8JAY8DQDkzqaCTAkLTfSRAt9yY6SbUpMsRv7xa8nMZNJBJzJT9b/wNjgiOJgaGuJMkV
+2g/DX2jfP3PrMM/Sbnz7edORXHj1Pa5XTT8nG5MS0FuZgvevdq3o/gVVAz+ZCKOH3ShMzZvfp01l
+SX5gaJTflmU6cdNwtn2yZ6IScF7OrjUeA9iEoSVR9dQcA+4lB3RAG3LMwcnxXY35D7+PMJzHIZdF
+cSnq+n03ACY2/E/T31iijRH29rvYHGI+mP/ieYs45iq4fTWo6i1HofeWLdP0fX7xW3XO0/hWYFiw
+BxKu66whAbRhaib3XJNvetVs25ToYXyiDpjG+cd5rCMei8sGQwTBj9Zeh0URoeMW1inTP0JvCmMU
+rZgAAAAAAAAAAAAA
+
diff --git a/crypto/pkcs7/t/msie-enc-02.pem b/crypto/pkcs7/t/msie-enc-02.pem
new file mode 100644 (file)
index 0000000..279c5d8
--- /dev/null
@@ -0,0 +1,106 @@
+-----BEGIN PKCS7-----
+MIAGCSqGSIb3DQEHA6CAMIITQAIBADGCAcIwgcwCAQAwdjBiMREwDwYDVQQHEwhJ
+bnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAyBgNVBAsTK1ZlcmlT
+aWduIENsYXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmliZXICEGBAmILep9sJ
+uN2Pkg1gucowDQYJKoZIhvcNAQEBBQAEQAKvi2eRLO+jdoiUd8ksZt+iQ0JXoWN0
+M/W9CEv6R1c42pwUIR/1F4RMK9oeyUiv9Z6lzmPaGNmx6XOCoueszVkwgfACAQAw
+gZkwgZIxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQH
+EwhCcmlzYmFuZTEaMBgGA1UEChMRQ3J5cHRzb2Z0IFB0eSBMdGQxIjAgBgNVBAsT
+GURFTU9OU1RSQVRJT04gQU5EIFRFU1RJTkcxGzAZBgNVBAMTEkRFTU8gWkVSTyBW
+QUxVRSBDQQICBG4wDQYJKoZIhvcNAQEBBQAEQFqcHEo69ShGfcOIVjnmWXLZM+7Y
+K/50j8YuvNbqq+dQxk9YY8ZpSU/JYsxmtcnEZdlSJEkpMHAO73V+eh1QQr0wghFz
+BgkqhkiG9w0BBwEwGgYIKoZIhvcNAwIwDgICAKAECJsSmRA1jxLjgIIRSIGLVtf+
+pzeB6oXJ9GlfsnIij+DgIOvrYaXC9qywAaUg7zMnln9QMgiih5XpBLgPg5Y/KYp3
+RZeHBwkjTIFwlNYSjE0PbsszsJYUmkDTsCjFUJEdM4+Cbv3g3Kct5w1Q6pVMXJLg
+JG4uFUY8CTScVkb9ETbIy3HisCRKJWA57ERLvCr/Fa6gNJKa5Mw1A5Nsp+QQqp0U
+uQz93raAPbCdqmHu8qQ88rzbB1k/ysXedRQLlzhqFs2hryD7kHe0gX8nPdlkre8Y
+tTQhY76LtbjnV2drXcyCUMONc56KQ2VcuxB0BWjSeyN8a75/rpt6wmiM/PKw0D4g
+RmXqA1ZR62X2WKbhKqvG5tQTF1LauZeddeYS4Rb8cLt2VMB5irkKWrHmJ3qyWELY
+Lah6AzDDdcf3LEfDo6rO9djqlU8RJwS0ExAuBooVBP6bZJG1tNUUbtxBydQ4PJUH
+UhulBMXUMd545fVb8d+lZnKbx3OS2LpILJ66Yeao7jTrEOIgxUq0c6ozzqcQe4Ax
+mytwvL57LpMQm9HpLg3xBHOeDwkkNkNMldA3qrzhoS52yc6vDYrI5XA+kjp7LioG
+wdSBDyQAXLmWxBpZXjmHp7GBTBsFwouA9kYWP450PZEomxNvzf9SpslLlD+UZeHM
+GWdpi5zInESmtHFue2Zyc4Q8Ul761ENTA5N3uqUmWN2Egkv64Nyigv0CGCjoLB6n
+q1256S/ZxISiEl5MTwO/LfhhGExsu+cU12aek3Ks1kNhVXHFoqjJ3YB8Hw08VmHV
+V0Bh8jdHVABDaRcR5/k00h9VB8zMP1qQmfhE/4q/fZBrGbgWucrGbBHIYlKFq8gF
+zZrH4XWvX41le5IEefm9+hFPE6TRJPh1ezDvh2eVhQxFpK7iqpR0z2OxdLJ5fhmB
+CCRHZuRpg7p7MWB6cUhrtBZXDytdkARnlqJsLFudjVUTjU9gi+GUt1sUmEf2Bjba
+z58UC7CfPIBJGMLjQD1oAQi1GVo9K1ZIaKqUtGA2QEHB2m/aXZg8F3ZDMfHp6Tpc
+au9Em4AL42Hrau1ArCk0fnhgA4dbnmZoEVbZJDdMX5xno1tuqEKYdPLJHuZxJhz2
+xdJUNYSFgpDWLJTzvTOEdZWm+CVmLNl60kJkWNh7HdvWeBV1yBquA6+k+r26sIoq
+LaZuSq/8QWnNJYZeQpKl8Ib9d8ycQ62Q2sHxLTq+eTYlwkE4Gomi3665IfmE6DS9
+OnFfYO440lKJZJbJ9ET+VN8kkVfCGh3tJdyVTJc95LKJtxKJzaFUDMObCMPfWOz+
+PaTTY8j9qA+GvdRDxwyBw0CJqgIps1pZ+foEZsIBtNyHHNSWjZxImIuWtfYgNmZ9
+dteZkKibWyZYgb64rgMQ2+nViwGMlQaDfYWCOAIj3mQGPTLb0OgFfKNvxBZuj72B
+l8tx3oufN9Ah9DwXl+ynXen39ct901v5eakpCC9VC0xke6JBXyXjxw5qtXRbevyT
+jKbYkPFkruwrCUL2fVUxV3mBXGagjz2XNTaz3oDSu9GX/UMViGwwHryeSiwX9XOo
+/KVNv+i57w2OlY2k72EoK+700fHlcx+EZu+1tIjh8YOVXDg7+nBklcrr21/FABqP
+Apm+fBEQ7QQyQUF1aViizQLgyfRl/J9szZKY2S2z0pHJroahmgSQRPwWgk5FEFpW
+PXSG0bRJ8SFNZn2zz3cdT6WvA6hg40jrEHSnCmDTWbWshMPvhCKZqXQTbCqYQnwf
+FBCtlpJOGVVvqshqIv69DBbLztTZkjjmdKP48v2B5qHlER4T8vewDt3lU5BAGuQn
+yRCcm5qOeuwg8PxcKBgFAoLKM+65cczLna/yIRyB/gD4p53MV5RztnnLxw/YvA2h
+xgPLVYn4LFIakKGYnlC7rXhfeDuVAMTpL+NVGbLGE8DeJ2KzdUJHrGZdwV+DkUuB
+BN9Pz0NtwEX91mabWawiXrxptmWMxnofMYNe5gg34izvm33+Kj/+Jgvej7uImuo+
+LaOQcCiCUv/gwrqA/FnkiheKboF0JDFIh3UJzZ1T/Uqdjv+JcuZjvCc60AufVdm5
+0zQaj4aZ6PJHybyuU8qT0lQvm083q596yelHHgd7K3J/c8SsfRnTcnSUI8lo7/Hn
+N593dZ7kMIc+UNOdzQYSI8KBoNxqOyzuou/GTpaRe3XKADtdzXxy8jY58hwmolrV
+UU3Lfay3+bzdNLq0p/GCZ4B5NXkyivJxxiHDoOmHWAzg9pxOV8EYoyponhvF2t3i
+kc32y9OhqwUBDZXuiZgtd9W6d3EVcaY6vqOkQGxqDJuMiArC+Hk2qwkK7Mh5qDx6
+q/dVB6PdWr8sVO5J1phIV9u8m5rK7PGnmcDx4sS9eE3soa7gqkVb5H9SrOz/s/DD
+1G6BjakHtlizfJLQhhK9eTvDCUf3pvOhtNyX6OKGsPw1VB+UcC0+mnHnThrszIf9
+q/AXJnpoVUPP3Fr1eGCdLTluIc8lRwuYUH/LGdy88Vyx+joZ626a4cb63W2knQoV
+mQwz9Gwgm8RIZMLgZAXimazG8EUz/kz0z2C1Ux/wpii8yof9deLZBpMjt4R0uKhM
+VFd/Rdko+JspcfoQ9PttA/aZ7aTYu4bXHBpTpusjTOvWrf9/pC4CScqCJWsS3AlG
+BzTInw7fk96f7eVOF5g+d7lEOjPHb4/7naj3pDUlH7Htecq3faYzreT3CbqltvKt
+LBR3/aRyIM912RTHuTw+6acOq0vguiK+D62C7ZDVtiCm+BbtNNB/UJm79/OQ5mp5
+bTI0kPmDeycaWTa0Ojpum+c/dpG/iJOBDICj7jHOXSHT7JlGyX6aSFJUltucAnZv
+wzhPDmdDaIDiKSk85GqgdDWVfGosSCX9Ph/T3WpIxnwfWSDRtIHkWTjly+pe4yy5
+K6/XISy/L5Zh/fhiI5fjHjgzmlibs2ru4nVw6hBhUvlSSe2BEs5d9h/yNH8Wy3qv
+b2D3jh7hkepFtZJGNTHp8ZUC7Ns2JIpQYObsaxdI65i3mMOu7fRwI+0/4ejsWhP6
+KCEiLgwvLg0qM82ma6YB7qHAHboaczRVEffDcJUG4a5uycB0DoZFn+uEaEFyili2
+0hCn4hVfsqUQk2PT8Mo1tSl5e30xI1YJZrRgiJm9nHRX6fLizngP+ILJLPHZsPvl
+SVIfY+/v/FR8feKOjaGhyGF51BAxaM2NIQ4jMP5/X+U5gQybi0E6u7rroDhaHsKm
+CMgXqszwXWCpedA/sEbeHpiTC59YlPPSlIOMc9vPKo/mQCfWy/9icUaIfKQldvkl
+lUxxNkqu6AbIpHVscbAEzSPs5xbQXU8EZNNCDisFnnpY3nQ3eLnlm89saTJxRb7N
+WHRMlmPv7qgD7uMIq3vdOGA7i5wT9MeoNIgK1/DsgH30s6RWjJy4YyyLmRTXPzbj
+hbQVpEmiMRbEidIvUx2OjKVxVQIcgtLsa2lvHQ4XL1cpLr5GVtOgy0fMg5OCDUUD
+svjgjgLQ3P2Up2nVY5FM6/QpPc5DTLuuR9ekI2/c9Biz09RtcYDUQK2ajdo8h1Iy
+KqHFoB7h48OXxXKKY94DY0TGx6PonB/epj8orAw4QKmm5M0vXYwBOqRymCTHTqOJ
+GObdLx1euFFyqguzHJOU2gAGZI0z9Lg1yRuFyhdPZyuniIcmtLNxRZ1duYHErcAy
+X56qndmLXt7UVkATai/rIMuoJLfAsUnVuTUS5p7tJM754UZT7lTcXvDJgOUNnBRa
+IcxC3pxvbrYDJ2iFJ72xkxUP2p74gucqg25XnCVmQuLg6zDDxF6CLuw9isxyXg4p
+kneMN//7fpp8GYl9nyZm2yqYYM+jcw0fcVc64L+X4w/gL3H2UMGgxIHSJp7HIG7V
+KHtXrNyjdPXXPVUsMsAAimqOr0Lr2sZWirfuivLaPTqhbkvG5PF7K3gT80AOIcd/
+6EIHBy2hZ7ukfjHmdP4LyQOhTQklaKzGHI0mypq0uFLWJOUlZnVrMiLP1xrWkpC8
+Ro9eo6mfjjQ45z8adC43a47klwTEzvod3rNEFIGJJUEjAN3mbqie7IxoSJknBBJK
+0D9lZEQ8lZWlq7vuN8JdqPM6xh155jMVsPwjLK6Tzkj5BpRD9Tgm3u6HPeCRYQ3v
+ky71MaixdjTGbWTorqw+/wv3j0KstajivUjYsDTvZtMa9A/bxWyFQDvqOBxPWhwL
+770+iS0grXRgKrnD4V8wBDTgp4Je4B2aJjaIBPhKV5rrU8wIy1reZUbItRkIsSY/
+4jRQpHmaU7R8YRyNT2PxOZuNmrE0WqWguxTuhKLs6zQS1geR0BWsTFTI5z9kOJ7p
+8GN0tOYt0KZsT0k3COVtfKl1Nm6kaAs2EoYMiyRQAAzBlhrIjph9IgyQ0J4BhOeM
+64ZlnWawJcZex8wFHWx9QiP1R4aPAPyCr5RVUdf+h6gf+bR4nmmmqLf6dSWBz0O+
+liwL8WDQbYq5hv0H5Un5rgYzNBI9ESgW1CkH120uQFvsdr+GkZZMh2rNbR4CjmWX
+I3wU2+XYW7Yhwto2ZYU7r2AuNEpCimnR28U67ABUjp+8YOOnVaKCg1sVmXw36KJa
+bMo6OgbZktt7PVyVkKaz8k8mteEQww7FalXORDI3ffpVYeYaAxyNooIZJ4DaecRI
+ga6IJcyuQeUZ9ptgiwpwcUKja3Xe5fJk9/TNI9OS4PQSH3bCoL2m8DeC+usJR+j0
+yfduz54pYqYOWlyzyYOfTfagiD7OtCEh24ypdWfd6/N5UzcHkwE4Yy+DnX9JeDtH
+4wL/jreO5BARv0hV78hgac7/+hab2XD/fvsB/+of4Wc3TahsnDUW96xAiz17lEc1
+DKQps76+ZUlCXWd30NlascM07v/zRjPaEKbtPCzmdJE3aIWXJFpgkevvKnGRTasJ
+qTavq5rtcPC7WpTZFPf6o+NPVG7FDahOUfIaQo8xkYJFz4JJbPlp54KYdlXB1vec
+Lxil+y6MyJirKAt65DzamMq5HsMgoaad9w4t2/kX4STZbLLQP3yJKCT5qhAZguEv
+2WVTXemfbW5GwNjm4ZxeIjDUgRMWVN2AQ0S/x+61m4mx6Cunt+YVfI2g3IU3LKl4
+OszpmpHi8rEWODe0op5WmTD9bgQCSXMzGY2JrMY0MEeydhXevA+Upr4d54TZjGew
+rAYsI2BFhRdNomTjrW9LXrTPd2+H+Yt91nsxgKSY7ds0TcQtQMDDthCRK6j26PN0
+Uq170sLfiyOD1857HdOECDljnSfBibjMGYYzvISovw7pCCczq0gMVL1evINos3Nw
+aExaoy+HM7qwL8ADZZ8uDBLnXsKnTciQlBaob2rDnb4T4YC2mKgl9zMSGW/0GuGO
+2126BFKMmsbxJhVgTjMbcC6vl40GgZoAsg4c60/Dz4mi9CYhZwWhon9ZC6CUWta1
+7DnUgroXxGIcA4FVq9k65lw7u1X7l6dV+t453Stfxk7LiFiYeGYXWE6utY6f4R4T
+RJgqidc3TUEz3EywrzQKaZxj01Bo8GzCUYNVSdijIgVh+aCafLcnyAMTLlhXbWi2
+G0Ujg12zgLIT1SvCQGPA0A5M6mgkwJC030kQLfcmOkm1KTLEb+8WvJzGTSQScyU/
+W/8DY4IjiYGhriTJFdoPw19o3z9z6zDP0m58+3nTkVx49T2uV00/JxuTEtBbmYL3
+r3at6P4FVQM/mQijh90oTM2b36dNZUl+YGiU35ZlOnHTcLZ9smeiEnBezq41HgPY
+hKElUfXUHAPuJQd0QBtyzMHJ8V2N+Q+/jzCcxyGXRXEp6vp9NwAmNvxP099Yoo0R
+9va72BxiPpj/4nmLOOYquH01qOotR6H3li3T9H1+8Vt1ztP4VmBYsAcSruusIQG0
+YWom91yTb3rVbNuU6GF8og6YxvnHeawjHovLBkMEwY/WXodFEaHjFtYp0z9Cbwpj
+FK2YAAAAAA==
+-----END PKCS7-----
diff --git a/crypto/pkcs7/t/msie-s-a-e b/crypto/pkcs7/t/msie-s-a-e
new file mode 100644 (file)
index 0000000..0067794
--- /dev/null
@@ -0,0 +1,91 @@
+
+MIAGCSqGSIb3DQEHA6CAMIACAQAxggHCMIHMAgEAMHYwYjERMA8GA1UEBxMISW50ZXJuZXQxFzAV
+BgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5k
+aXZpZHVhbCBTdWJzY3JpYmVyAhBgQJiC3qfbCbjdj5INYLnKMA0GCSqGSIb3DQEBAQUABECjscaS
+G0U299fqiEAgTqTFQBp8Ai6zzjl557cVb3k6z4QZ7CbqBjSXAjLbh5e7S5Hd/FrFcDnxl1Ka06ha
+VHGPMIHwAgEAMIGZMIGSMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDERMA8GA1UE
+BxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29mdCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNU
+UkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQDExJERU1PIFpFUk8gVkFMVUUgQ0ECAgRuMA0GCSqG
+SIb3DQEBAQUABECsyHXZ1xaiv0UQRvOmVYsaF38AL2XX75wxbCsz5/wOg7g3RP4aicZxaR4sBog0
+f2G1o9om/hu+A0rIYF/L4/GUMIAGCSqGSIb3DQEHATAaBggqhkiG9w0DAjAOAgIAoAQIsozQrnwj
+cc2ggASCBAAQz/LPoJe/+iYWeTwSebz6Q9UeKZzQ2UWm7GLtEM3s3c9SCvpmkwIRdEhLjWaBJMyI
+DiL7t1I1vMf9inB8LXgAcIEYkpNScjS8ERA9Ebb7ieNKSBg7w7B8ATHFxLSlDADqRgoZrB1Ctfgf
+ximp3EgxTgnhtyQhZxXW7kBQyFRwumplrJXOp7albP7IothrOKncw30IJT1fwPxWNMItI9juXF0U
+CbWVSjPzGBo4+XNXMvUO6MplOQEz/ywEQ9E8OZAQex1Zw9qq5ppsXB2pMsYV5sLJGikukMYKquiz
+3YK+tN6J8ahLcDUs+VGwqvZi17gpBTlbEP+ZmXJpnO63t1yTEB0V5AZcRKWUOhzlCBM5YUagqNoY
+cpsmSvOK6bYzkUKOrzWpDCAtGZ/Dvul5dTZZmxs2WpM+iyeHXMxO3huy8K1brPTqt1f1sHhuq1jD
+1eXedaCjIgUW9qV18vNAQCof/Yb6T/1fxztf/jD7pPLQJ+7LJkKCAEHGcaizpoKqhYcttaEhLq1G
+O+Ohqf7yFegMdTJ3wwP324w5ZYSU5fLo2Z34/Edf6EGvXyTIqVfAmEBALd6JGVdN5GlYYTxrL+eO
+P80Z4ao4YKoxwEmRp5bmQsQ8B29QhOFKmC6eiG5B96qLMtp7Zmu1grDNxTd6OXShWVwYARD0/B1P
+Sy0PAfk9Gb4fAkO9fZJDQYZ7s0mM5iOPEeSR7820TolOb+KfRabLA9d714jsc2jEykKlpP66Bh4j
+aCsyqJ0uUQcE8SnzrKAqGwgWiCGQpiTa+HBiP6eRlRGOKQj5Y06vcNx6Ija4cGe6+yCN8HV8tCY0
+okZK98NQCl5t79R/ZB2c3NvBJH+/g3ulU48ikT3tVmDxE3mOZofZyGFEM99P+YCMScLDxTl3hzGy
+0YkI8U855P7qOAbcFfh2T5n+LSELwLhbkymEfZT917GWTfmypBWMvJx0WHeDhKwQYPdzbKgWETnc
+yeKasaCW+oLdhBwrd6Ws2r4MA8cwiYXDLbwYmCxJA8VF++8kubF2HJOjSyMBS+QT2PSV/0D9UWoi
+Vfk7R4OvWBJVvq7nV+lXS0O5igjExxlmx1OaBfg7+Cr/MbK4zVNrKSJn82NnKKt6LC6RaTmvFYay
+0sDFxQ7Xo+Th6tDNKmKWJt6Kegfjc+qTWJTKb3kL+UI8vS0zTLy1+M/rZ4ekos/JiS5rYIcAswvg
+58kBgp/0rc6upBeWjBaK5O0aLAeBQfLulo1axWX04OSVKmYeoAltyR6UO9ME3acurQyg7Ta24yqO
+whi/PrIaEiO7dsWvFtzsshVzBLic02NlAkPkMUzliPYnZHWQglDAVxL5K2qhvK1OFCkQpIgBsBDM
+6KYRL/mkBIIEALIl927rIkaN37/BQIcxLcSa05YfC0Hl3mxWESt1A0D4lA37A9S8EbYmDfAYlMc0
+3HhZGdZEtawfpJFyDHzNZceNWBch6nxeNZCY4YFdsbzuGS0RKpwNA9S/czOJ4p9ymBCxuhGepI3U
+PKbC8C749Www1/wMdAot1n+K7M/PBGR8hWmaH5SS7U3yMwAB1fq2NDjx4ur+Um+MclSdN01MDXzG
+EO+eAo1pdAY8479234l8dB2YVAhZ1ZlJ4KmbqMKJrGJXnQUEYS6/cTDRjsUocsoW7uGg1ci2GiHa
+qjlkfpBfie3SdhFW/K8hwAH0HALs56oFN66wUkP/AaJAPfIUNhR6RpHKzZ9zCC42oB2mNawQRMnF
+ETBl1s/SwMxLKRp7jAfKs4NZxSY6I9z/2dTpzS3tsHMjxVDuxkolvRNWBILEMeL1CBvip2HhmoUw
+/Sz5NDgyzk1aQLV6DQNJ2RZLMZDRCtSwZSBu6lhhSgTJGazP0+NbqXXC5aQTrqrFIcWyDXz+ADle
+kszzYM/gSaQTCALTwfDDaU9Ek3xVgW+XBtExtJ3U+0AN3l0j86rUIdIvp6eWdxWQqv9LtpoorKMD
+KfUc5PYV09Z1JgsT4X51Zzq+74l5dz7udIM7UNbdTpmRm9PDj3TUbGCvNR9hqOEGTLbkvb1ZR24a
+h6uGRl2znB25IpDAGRhNRb9is/pO2tvHwHTDMOjrgvZG/pNvXgSUxz0pRjUjXIcqBe2X2gcQfeal
+r8gY76o83WEGL6ODryV9vTQVHt52+izgpYoBZaVlpgqbZl54c+OE0Zxf9RwXwDbcYu5Ku5E0MPL0
+qUjc0y2+Y6E4P5bAWaZGMGT+ORkyVUzcaWmM/+XlO7PER5wrWlCIMZCX1L/nvioY0q0CKqALn7DJ
+QU+qenbwrb6uwS7uNZY6V86s0aDYpU7yRyqxC5SbuyNJb02gdxUCgpIscFaMUjMVRml4M4BIjX/b
+U+HgHoVMUm8SnN9gRcT2izPrgOGVcMTJjfenzoCKoCPo9RjgGMctgB4DvKamErNU7OrilIfuoqzE
+PNSeP9SPw/zkDmNvMebM499We9CVnsHUWqF00/ZJWoua77+0f1bLS/tmci1JBvIcMo/4SJvgH+KF
+o0gijP9gqAPd5iCOnpnJlHUqRIym42SmyKEDuzdSwXKjAR6j7uXda39JyMJr8gGzEsu0jYRkAmj1
+YdiqwKXUcLMkcj1AKeU/PxTUVw0YKsv/rowrPYww3xQUWqNivrXB7GCHE3BzsYNdHsmziaGIXQbA
++EBHdkuKrM8BcC+fxhF/l/KUxngsD1E75IcUv8zFDF+sk4CBYHqks9S4JYlcubuizqsILbdGzIMN
+Z7w34k0XT+sEggQAyzr8MHeIJGsT+AYnZr08PeTbyr01JEoT7lPYT6PzX4F63QKKDl+mB+PwLMzY
+CXrxZcUmuay6/MV8w/f5T6vQXdoSw5puWodBYwVReYh1IaEN+jiTapm9YBVmcIsJPO6abHowknSV
+OWSvST0AtAX57fFOTckm+facfBK9s9T1lUUgF44Bh5e8f9qKqfOV44nqdCOEyUm0Dao497ieN4Eg
+XBLNvOZY9+irMiXjp0lcyFvhrJOczfyCr9EiiaiH1TfSzKGKsf2W84iKn/JH6x2eOo7xjwJ40BQD
+c6S1cUNEuqBhP6by0FioOXYOKVyifpxk84Eb+F/4CNdTJTvCPwsiegdfsX/Q53DvKVtXp9Ycam5J
+TmKRHXK/bMHF4ONv3p/O/kn/BqRx+fbbP2eMX8Z1F/ltHKfp6B+06HljUwQLBJs9XtCfqH5Zgdz9
+gad5WZF5ykFArmHDgeFlgggvbZ7z9vqnjN/TH68TxJzauYQ5vLHQ6wGXik4/4uq7/TqNmhxlQEM4
+zVkwsn203bUmKLyz+yl1zItDpn5zy1uXfGo99rBdUzdbdE9LmEFPMaFsaHd4a8oDaUroD7FgCbeD
+JJVld3ac6F8+3QbExPs48OrgA1kI3/UwXr52ldjiYzTLfAGR9BjqNFTw45FUHuMf8TEM5hcHx56w
+95eKAqraDk28o9k+M2UKpcmrdlWoWzdqVVFeWGpM8x9Y9Nt0lf/4VUQgrXjqTkUCQkJyqTeTeGgH
+rn3QBk2XAgpxZhaJs3InW0BkAlBmK99cMinUiJeFt5a4p5wPeXrVuh6V9m7Mpl9hzpogg++EZqah
+fzzNnDgxOZfW342DX052PdgXo0NnkhCk005LvFt6M2mRn0fLgNVfyUZZoOp8cO5ZWbhXXlrhrgUt
+j2zKPK6Q94Zj4kdXHBGpAkrB8ZQ4EGGODE0Dqusm8WPXzB+9236IMHPU7lFbyjBrFNI7O4jg+qRI
+Ipi+7tX0FsilqEbmjG+OPwhZXrdqUqyF+rjKQuSRq7lOeDB4c6S2dq4OOny01i5HCbbyc9UvSHRm
+hOhGqUlzHyHLo3W7j+26V/MhkDXJ+Tx+qfylv4pbliwTteJJj+CZwzjv29qb6lxYi+38Bw10ERap
+m8UCRFBecVN7xXlcIfyeAl666Vi7EBJZv3EdFNrx1nlLwM65nYya7uj6L7IwJWotIUx8E0XH0/cU
+xS/dG8bxf9L/8652h5gq3LI+wTNGuEX0DMuz7BGQG+NtgabrZ6SsKGthGa7eULTpz0McWTLRU0y/
+/tkckpm5pDnXSFbIMskwwjECz82UZBSPpigdN/Pjg5d+0yWu7s3VJxw4ENWPPpzZ+j7sOXmdvn9P
+O1tQd60EO+3awASCBAAZQvWV3/yJ6FxPttbP+qeURpJoPEZfpN2UYZmd8HqtR0YbaOZ6Rln9nvpd
+K9fylXdw9z2xeCbjDWUttJB4VqZxGJM8eCTC1VDVyAOsQ5n7SY55dMkQbU+o4Z/4J5m8+wz50BBI
+LfruL1eZ6/CF6CdvxVRiJ10sXc0Tn2sVMXqkw7Adp1GYoCI9c6VFSFK74+n+y7LVFQ5HBnbQyKJc
+dvdLOXwZOPaFHC5UNXRmOpcwdPqyXUe+xIsOMYbzdlAnI9eGDNeRDktUa/Rh0CbZCxjmJzoZEYOE
+ZjsYZlEfp1Kb61t8z4m28hGLEg88T1Ihmxa2HeUWes1RpmgIOP+/2Lb3smj/l/fpSu4gabFgyCAV
+H5HdCYMScUv8SVu55+tpeO8ELoHHQUXV4rr084O4budzhgNSOPyLGDl5sfDUXiyusPCxS4JVO/KY
+6V2Qrtg/q2wtmXpEkZnGT+Qi3WDzwt4W81alztnYMP17oGLmxX71KV9OEiMZjI4WaaGt+OOINLtR
+qefioZ1NI2L1s5M0tybwTsyU9WERM+3pUwXIfJVsbMZRlNaO2OogcHbaR4UWvhOj+3CTG1sThiYQ
+MxMnp1Rpqx3nhyzqLO3TRrkYvxnA3cdPBn9EeqpgBMg7X3hCiMV3Fl5cj/WOMhtHYgY7BgeCXo46
+EFVZ4+WroGZ46xGiRDiIblo8bzLd7QCxvukzxy3mUDgsZQ8pds4N28weSUhBk5MAPbfBpRvXUVJx
+MhKqXucQU1Md1qSGLbuuIQuz9pAGp1JFUx/vEkCgm74daSoVWCZuB+1ZE4f48clvrBj51xMNf8CP
+EFE7vySzVb6X2H1i5X3Z+Y3DdIcWw4Y2FClfcJk4Mwq8Cq2GALGFEge9YSEE9YmyuU6OFeU0ICon
+iXAgZ72SM8fBwJPruLFbdsNYKW+oAfmPisXSWMcZmdSbfk0GYv+vKtu3eegSbWw1UsCVtZOh9E5Z
+uQ83l59CBqO9sV/SFU3WrrJ0qNWxrmXu9nJn5Qf5iCRoFGYNHYHkIG5FS6N00GEDZxGkxmro2d++
+Adj5LVHc/b1cYWmrux+jEqI8ZK8cyTB0XMbBA/HYbx9NXazr7znP4/Mlv3pZToEcYt+lgLHAArtU
+AdhybhbLIwNMq0gr6EwtDklBa3ns4Wx/rJU8H7LGs6gV8uqeaSketv+nz+sQhfctxZ1rx+5qzXfy
+FOQVpO23KDQunBi1Bl9k61Di4q9JWcyADBXPHXJzp7mL8Fk7zdvMAEfuED1phdRm6GgDYoYUs4yQ
+IrhSjFlWyk7hT8475xk3BIv++obvWSAv/3+pF6A6U2RXDChVmnG0JnPa9wYYtdzBmLfZKBjX+DjD
+yEMsuhPsCzuN4R6tBIIBWCVRKmKwdkatmpsQBgDw48u0/Arffl5/DRlS9ee+QffFecUitDdCK+kt
+X5L2fGYrL5g6SltncMIeV1ptx4nuSjC/O944q1KYtqvQiPFWJqEXIRMNbbYOC47sjLza0tEFrimN
+wxcrWGSzsy5R9beFQ1aHPcMrDWfCoviNRk2qPtxuKIC5Qk2ZuOmJLjCiLwUGEb0/1Mpzv3MqQa7d
+mRayXg3DZWJPajxNZv6eS357ElMvwGQmqafb2mlQJwWLsg9m9PG7uqEoyrqSc6MiuY+icLEFib9j
+OfRQrx70rTSKUfTr4MtP0aZZAefjCrpVIyTekhFDOk0Nmx057eonlyGgmGpl5/Uo+t1J1Z11Ya/l
+bNbfmebRISJeTVW0I8FhseAZMI1GSwp/ludJxSLYOgyRkh+GX134MexNo7O9F1SxLCfWaSG9Fc3s
+5ify04ua9/t8SGrYZPm/l3MkAAAAAAAAAAAAAA==
+
+
diff --git a/crypto/pkcs7/t/msie-s-a-e.pem b/crypto/pkcs7/t/msie-s-a-e.pem
new file mode 100644 (file)
index 0000000..55dbd8f
--- /dev/null
@@ -0,0 +1,106 @@
+-----BEGIN PKCS7-----
+MIAGCSqGSIb3DQEHA6CAMIITUAIBADGCAcIwgcwCAQAwdjBiMREwDwYDVQQHEwhJ
+bnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAyBgNVBAsTK1ZlcmlT
+aWduIENsYXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmliZXICEGBAmILep9sJ
+uN2Pkg1gucowDQYJKoZIhvcNAQEBBQAEQKOxxpIbRTb31+qIQCBOpMVAGnwCLrPO
+OXnntxVveTrPhBnsJuoGNJcCMtuHl7tLkd38WsVwOfGXUprTqFpUcY8wgfACAQAw
+gZkwgZIxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQH
+EwhCcmlzYmFuZTEaMBgGA1UEChMRQ3J5cHRzb2Z0IFB0eSBMdGQxIjAgBgNVBAsT
+GURFTU9OU1RSQVRJT04gQU5EIFRFU1RJTkcxGzAZBgNVBAMTEkRFTU8gWkVSTyBW
+QUxVRSBDQQICBG4wDQYJKoZIhvcNAQEBBQAEQKzIddnXFqK/RRBG86ZVixoXfwAv
+ZdfvnDFsKzPn/A6DuDdE/hqJxnFpHiwGiDR/YbWj2ib+G74DSshgX8vj8ZQwghGD
+BgkqhkiG9w0BBwEwGgYIKoZIhvcNAwIwDgICAKAECLKM0K58I3HNgIIRWBDP8s+g
+l7/6JhZ5PBJ5vPpD1R4pnNDZRabsYu0Qzezdz1IK+maTAhF0SEuNZoEkzIgOIvu3
+UjW8x/2KcHwteABwgRiSk1JyNLwRED0RtvuJ40pIGDvDsHwBMcXEtKUMAOpGChms
+HUK1+B/GKancSDFOCeG3JCFnFdbuQFDIVHC6amWslc6ntqVs/sii2Gs4qdzDfQgl
+PV/A/FY0wi0j2O5cXRQJtZVKM/MYGjj5c1cy9Q7oymU5ATP/LARD0Tw5kBB7HVnD
+2qrmmmxcHakyxhXmwskaKS6Qxgqq6LPdgr603onxqEtwNSz5UbCq9mLXuCkFOVsQ
+/5mZcmmc7re3XJMQHRXkBlxEpZQ6HOUIEzlhRqCo2hhymyZK84rptjORQo6vNakM
+IC0Zn8O+6Xl1NlmbGzZakz6LJ4dczE7eG7LwrVus9Oq3V/WweG6rWMPV5d51oKMi
+BRb2pXXy80BAKh/9hvpP/V/HO1/+MPuk8tAn7ssmQoIAQcZxqLOmgqqFhy21oSEu
+rUY746Gp/vIV6Ax1MnfDA/fbjDllhJTl8ujZnfj8R1/oQa9fJMipV8CYQEAt3okZ
+V03kaVhhPGsv544/zRnhqjhgqjHASZGnluZCxDwHb1CE4UqYLp6IbkH3qosy2ntm
+a7WCsM3FN3o5dKFZXBgBEPT8HU9LLQ8B+T0Zvh8CQ719kkNBhnuzSYzmI48R5JHv
+zbROiU5v4p9FpssD13vXiOxzaMTKQqWk/roGHiNoKzKonS5RBwTxKfOsoCobCBaI
+IZCmJNr4cGI/p5GVEY4pCPljTq9w3HoiNrhwZ7r7II3wdXy0JjSiRkr3w1AKXm3v
+1H9kHZzc28Ekf7+De6VTjyKRPe1WYPETeY5mh9nIYUQz30/5gIxJwsPFOXeHMbLR
+iQjxTznk/uo4BtwV+HZPmf4tIQvAuFuTKYR9lP3XsZZN+bKkFYy8nHRYd4OErBBg
+93NsqBYROdzJ4pqxoJb6gt2EHCt3pazavgwDxzCJhcMtvBiYLEkDxUX77yS5sXYc
+k6NLIwFL5BPY9JX/QP1RaiJV+TtHg69YElW+rudX6VdLQ7mKCMTHGWbHU5oF+Dv4
+Kv8xsrjNU2spImfzY2coq3osLpFpOa8VhrLSwMXFDtej5OHq0M0qYpYm3op6B+Nz
+6pNYlMpveQv5Qjy9LTNMvLX4z+tnh6Siz8mJLmtghwCzC+DnyQGCn/Stzq6kF5aM
+Fork7RosB4FB8u6WjVrFZfTg5JUqZh6gCW3JHpQ70wTdpy6tDKDtNrbjKo7CGL8+
+shoSI7t2xa8W3OyyFXMEuJzTY2UCQ+QxTOWI9idkdZCCUMBXEvkraqG8rU4UKRCk
+iAGwEMzophEv+aSyJfdu6yJGjd+/wUCHMS3EmtOWHwtB5d5sVhErdQNA+JQN+wPU
+vBG2Jg3wGJTHNNx4WRnWRLWsH6SRcgx8zWXHjVgXIep8XjWQmOGBXbG87hktESqc
+DQPUv3MzieKfcpgQsboRnqSN1DymwvAu+PVsMNf8DHQKLdZ/iuzPzwRkfIVpmh+U
+ku1N8jMAAdX6tjQ48eLq/lJvjHJUnTdNTA18xhDvngKNaXQGPOO/dt+JfHQdmFQI
+WdWZSeCpm6jCiaxiV50FBGEuv3Ew0Y7FKHLKFu7hoNXIthoh2qo5ZH6QX4nt0nYR
+VvyvIcAB9BwC7OeqBTeusFJD/wGiQD3yFDYUekaRys2fcwguNqAdpjWsEETJxREw
+ZdbP0sDMSykae4wHyrODWcUmOiPc/9nU6c0t7bBzI8VQ7sZKJb0TVgSCxDHi9Qgb
+4qdh4ZqFMP0s+TQ4Ms5NWkC1eg0DSdkWSzGQ0QrUsGUgbupYYUoEyRmsz9PjW6l1
+wuWkE66qxSHFsg18/gA5XpLM82DP4EmkEwgC08Hww2lPRJN8VYFvlwbRMbSd1PtA
+Dd5dI/Oq1CHSL6enlncVkKr/S7aaKKyjAyn1HOT2FdPWdSYLE+F+dWc6vu+JeXc+
+7nSDO1DW3U6ZkZvTw4901GxgrzUfYajhBky25L29WUduGoerhkZds5wduSKQwBkY
+TUW/YrP6Ttrbx8B0wzDo64L2Rv6Tb14ElMc9KUY1I1yHKgXtl9oHEH3mpa/IGO+q
+PN1hBi+jg68lfb00FR7edvos4KWKAWWlZaYKm2ZeeHPjhNGcX/UcF8A23GLuSruR
+NDDy9KlI3NMtvmOhOD+WwFmmRjBk/jkZMlVM3GlpjP/l5TuzxEecK1pQiDGQl9S/
+574qGNKtAiqgC5+wyUFPqnp28K2+rsEu7jWWOlfOrNGg2KVO8kcqsQuUm7sjSW9N
+oHcVAoKSLHBWjFIzFUZpeDOASI1/21Ph4B6FTFJvEpzfYEXE9osz64DhlXDEyY33
+p86AiqAj6PUY4BjHLYAeA7ymphKzVOzq4pSH7qKsxDzUnj/Uj8P85A5jbzHmzOPf
+VnvQlZ7B1FqhdNP2SVqLmu+/tH9Wy0v7ZnItSQbyHDKP+Eib4B/ihaNIIoz/YKgD
+3eYgjp6ZyZR1KkSMpuNkpsihA7s3UsFyowEeo+7l3Wt/ScjCa/IBsxLLtI2EZAJo
+9WHYqsCl1HCzJHI9QCnlPz8U1FcNGCrL/66MKz2MMN8UFFqjYr61wexghxNwc7GD
+XR7Js4mhiF0GwPhAR3ZLiqzPAXAvn8YRf5fylMZ4LA9RO+SHFL/MxQxfrJOAgWB6
+pLPUuCWJXLm7os6rCC23RsyDDWe8N+JNF0/ryzr8MHeIJGsT+AYnZr08PeTbyr01
+JEoT7lPYT6PzX4F63QKKDl+mB+PwLMzYCXrxZcUmuay6/MV8w/f5T6vQXdoSw5pu
+WodBYwVReYh1IaEN+jiTapm9YBVmcIsJPO6abHowknSVOWSvST0AtAX57fFOTckm
++facfBK9s9T1lUUgF44Bh5e8f9qKqfOV44nqdCOEyUm0Dao497ieN4EgXBLNvOZY
+9+irMiXjp0lcyFvhrJOczfyCr9EiiaiH1TfSzKGKsf2W84iKn/JH6x2eOo7xjwJ4
+0BQDc6S1cUNEuqBhP6by0FioOXYOKVyifpxk84Eb+F/4CNdTJTvCPwsiegdfsX/Q
+53DvKVtXp9Ycam5JTmKRHXK/bMHF4ONv3p/O/kn/BqRx+fbbP2eMX8Z1F/ltHKfp
+6B+06HljUwQLBJs9XtCfqH5Zgdz9gad5WZF5ykFArmHDgeFlgggvbZ7z9vqnjN/T
+H68TxJzauYQ5vLHQ6wGXik4/4uq7/TqNmhxlQEM4zVkwsn203bUmKLyz+yl1zItD
+pn5zy1uXfGo99rBdUzdbdE9LmEFPMaFsaHd4a8oDaUroD7FgCbeDJJVld3ac6F8+
+3QbExPs48OrgA1kI3/UwXr52ldjiYzTLfAGR9BjqNFTw45FUHuMf8TEM5hcHx56w
+95eKAqraDk28o9k+M2UKpcmrdlWoWzdqVVFeWGpM8x9Y9Nt0lf/4VUQgrXjqTkUC
+QkJyqTeTeGgHrn3QBk2XAgpxZhaJs3InW0BkAlBmK99cMinUiJeFt5a4p5wPeXrV
+uh6V9m7Mpl9hzpogg++EZqahfzzNnDgxOZfW342DX052PdgXo0NnkhCk005LvFt6
+M2mRn0fLgNVfyUZZoOp8cO5ZWbhXXlrhrgUtj2zKPK6Q94Zj4kdXHBGpAkrB8ZQ4
+EGGODE0Dqusm8WPXzB+9236IMHPU7lFbyjBrFNI7O4jg+qRIIpi+7tX0FsilqEbm
+jG+OPwhZXrdqUqyF+rjKQuSRq7lOeDB4c6S2dq4OOny01i5HCbbyc9UvSHRmhOhG
+qUlzHyHLo3W7j+26V/MhkDXJ+Tx+qfylv4pbliwTteJJj+CZwzjv29qb6lxYi+38
+Bw10ERapm8UCRFBecVN7xXlcIfyeAl666Vi7EBJZv3EdFNrx1nlLwM65nYya7uj6
+L7IwJWotIUx8E0XH0/cUxS/dG8bxf9L/8652h5gq3LI+wTNGuEX0DMuz7BGQG+Nt
+gabrZ6SsKGthGa7eULTpz0McWTLRU0y//tkckpm5pDnXSFbIMskwwjECz82UZBSP
+pigdN/Pjg5d+0yWu7s3VJxw4ENWPPpzZ+j7sOXmdvn9PO1tQd60EO+3awBlC9ZXf
+/InoXE+21s/6p5RGkmg8Rl+k3ZRhmZ3weq1HRhto5npGWf2e+l0r1/KVd3D3PbF4
+JuMNZS20kHhWpnEYkzx4JMLVUNXIA6xDmftJjnl0yRBtT6jhn/gnmbz7DPnQEEgt
++u4vV5nr8IXoJ2/FVGInXSxdzROfaxUxeqTDsB2nUZigIj1zpUVIUrvj6f7LstUV
+DkcGdtDIolx290s5fBk49oUcLlQ1dGY6lzB0+rJdR77Eiw4xhvN2UCcj14YM15EO
+S1Rr9GHQJtkLGOYnOhkRg4RmOxhmUR+nUpvrW3zPibbyEYsSDzxPUiGbFrYd5RZ6
+zVGmaAg4/7/YtveyaP+X9+lK7iBpsWDIIBUfkd0JgxJxS/xJW7nn62l47wQugcdB
+RdXiuvTzg7hu53OGA1I4/IsYOXmx8NReLK6w8LFLglU78pjpXZCu2D+rbC2ZekSR
+mcZP5CLdYPPC3hbzVqXO2dgw/XugYubFfvUpX04SIxmMjhZpoa3444g0u1Gp5+Kh
+nU0jYvWzkzS3JvBOzJT1YREz7elTBch8lWxsxlGU1o7Y6iBwdtpHhRa+E6P7cJMb
+WxOGJhAzEyenVGmrHeeHLOos7dNGuRi/GcDdx08Gf0R6qmAEyDtfeEKIxXcWXlyP
+9Y4yG0diBjsGB4JejjoQVVnj5augZnjrEaJEOIhuWjxvMt3tALG+6TPHLeZQOCxl
+Dyl2zg3bzB5JSEGTkwA9t8GlG9dRUnEyEqpe5xBTUx3WpIYtu64hC7P2kAanUkVT
+H+8SQKCbvh1pKhVYJm4H7VkTh/jxyW+sGPnXEw1/wI8QUTu/JLNVvpfYfWLlfdn5
+jcN0hxbDhjYUKV9wmTgzCrwKrYYAsYUSB71hIQT1ibK5To4V5TQgKieJcCBnvZIz
+x8HAk+u4sVt2w1gpb6gB+Y+KxdJYxxmZ1Jt+TQZi/68q27d56BJtbDVSwJW1k6H0
+Tlm5DzeXn0IGo72xX9IVTdausnSo1bGuZe72cmflB/mIJGgUZg0dgeQgbkVLo3TQ
+YQNnEaTGaujZ374B2PktUdz9vVxhaau7H6MSojxkrxzJMHRcxsED8dhvH01drOvv
+Oc/j8yW/ellOgRxi36WAscACu1QB2HJuFssjA0yrSCvoTC0OSUFreezhbH+slTwf
+ssazqBXy6p5pKR62/6fP6xCF9y3FnWvH7mrNd/IU5BWk7bcoNC6cGLUGX2TrUOLi
+r0lZzIAMFc8dcnOnuYvwWTvN28wAR+4QPWmF1GboaANihhSzjJAiuFKMWVbKTuFP
+zjvnGTcEi/76hu9ZIC//f6kXoDpTZFcMKFWacbQmc9r3Bhi13MGYt9koGNf4OMPI
+Qyy6E+wLO43hHq0lUSpisHZGrZqbEAYA8OPLtPwK335efw0ZUvXnvkH3xXnFIrQ3
+QivpLV+S9nxmKy+YOkpbZ3DCHldabceJ7kowvzveOKtSmLar0IjxViahFyETDW22
+DguO7Iy82tLRBa4pjcMXK1hks7MuUfW3hUNWhz3DKw1nwqL4jUZNqj7cbiiAuUJN
+mbjpiS4woi8FBhG9P9TKc79zKkGu3ZkWsl4Nw2ViT2o8TWb+nkt+exJTL8BkJqmn
+29ppUCcFi7IPZvTxu7qhKMq6knOjIrmPonCxBYm/Yzn0UK8e9K00ilH06+DLT9Gm
+WQHn4wq6VSMk3pIRQzpNDZsdOe3qJ5choJhqZef1KPrdSdWddWGv5WzW35nm0SEi
+Xk1VtCPBYbHgGTCNRksKf5bnScUi2DoMkZIfhl9d+DHsTaOzvRdUsSwn1mkhvRXN
+7OYn8tOLmvf7fEhq2GT5v5dzJAAAAAA=
+-----END PKCS7-----
diff --git a/crypto/pkcs7/t/nav-smime b/crypto/pkcs7/t/nav-smime
new file mode 100644 (file)
index 0000000..6ee4b59
--- /dev/null
@@ -0,0 +1,157 @@
+From angela@c2.net.au Thu May 14 13:32:27 1998
+X-UIDL: 83c94dd550e54329bf9571b72038b8c8
+Return-Path: angela@c2.net.au
+Received: from cryptsoft.com (play.cryptsoft.com [203.56.44.3]) by pandora.cryptsoft.com (8.8.3/8.7.3) with ESMTP id NAA27838 for <tjh@cryptsoft.com>; Thu, 14 May 1998 13:32:26 +1000 (EST)
+Message-ID: <355A6779.4B63E64C@cryptsoft.com>
+Date: Thu, 14 May 1998 13:39:37 +1000
+From: Angela van Lent <angela@c2.net.au>
+X-Mailer: Mozilla 4.03 [en] (Win95; U)
+MIME-Version: 1.0
+To: tjh@cryptsoft.com
+Subject: signed
+Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="------------ms9A58844C95949ECC78A1C54C"
+Content-Length: 2604
+Status: OR
+
+This is a cryptographically signed message in MIME format.
+
+--------------ms9A58844C95949ECC78A1C54C
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+
+signed body
+
+--------------ms9A58844C95949ECC78A1C54C
+Content-Type: application/x-pkcs7-signature; name="smime.p7s"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename="smime.p7s"
+Content-Description: S/MIME Cryptographic Signature
+
+MIIGHgYJKoZIhvcNAQcCoIIGDzCCBgsCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCC
+BGswggJTMIIB/aADAgECAgIEfjANBgkqhkiG9w0BAQQFADCBkjELMAkGA1UEBhMCQVUxEzAR
+BgNVBAgTClF1ZWVuc2xhbmQxETAPBgNVBAcTCEJyaXNiYW5lMRowGAYDVQQKExFDcnlwdHNv
+ZnQgUHR5IEx0ZDEiMCAGA1UECxMZREVNT05TVFJBVElPTiBBTkQgVEVTVElORzEbMBkGA1UE
+AxMSREVNTyBaRVJPIFZBTFVFIENBMB4XDTk4MDUxMzA2MjY1NloXDTAwMDUxMjA2MjY1Nlow
+gaUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFu
+ZTEaMBgGA1UEChMRQ3J5cHRzb2Z0IFB0eSBMdGQxEjAQBgNVBAsTCVNNSU1FIDAwMzEZMBcG
+A1UEAxMQQW5nZWxhIHZhbiBMZWVudDEjMCEGCSqGSIb3DQEJARYUYW5nZWxhQGNyeXB0c29m
+dC5jb20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEAuC3+7dAb2LhuO7gt2cTM8vsNjhG5JfDh
+hX1Vl/wVGbKEEj0MA6vWEolvefQlxB+EzwCtR0YZ7eEC/T/4JoCyeQIDAQABoygwJjAkBglg
+hkgBhvhCAQ0EFxYVR2VuZXJhdGVkIHdpdGggU1NMZWF5MA0GCSqGSIb3DQEBBAUAA0EAUnSP
+igs6TMFISTjw8cBtJYb98czgAVkVFjKyJQwYMH8FbDnCyx6NocM555nsyDstaw8fKR11Khds
+syd3ikkrhDCCAhAwggG6AgEDMA0GCSqGSIb3DQEBBAUAMIGSMQswCQYDVQQGEwJBVTETMBEG
+A1UECBMKUXVlZW5zbGFuZDERMA8GA1UEBxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29m
+dCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNUUkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQD
+ExJERU1PIFpFUk8gVkFMVUUgQ0EwHhcNOTgwMzAzMDc0MTMyWhcNMDgwMjI5MDc0MTMyWjCB
+kjELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxETAPBgNVBAcTCEJyaXNiYW5l
+MRowGAYDVQQKExFDcnlwdHNvZnQgUHR5IEx0ZDEiMCAGA1UECxMZREVNT05TVFJBVElPTiBB
+TkQgVEVTVElORzEbMBkGA1UEAxMSREVNTyBaRVJPIFZBTFVFIENBMFwwDQYJKoZIhvcNAQEB
+BQADSwAwSAJBAL+0E2fLej3FSCwe2A2iRnMuC3z12qHIp6Ky1wo2zZcxft7AI+RfkrWrSGtf
+mfzBEuPrLdfulncC5Y1pNcM8RTUCAwEAATANBgkqhkiG9w0BAQQFAANBAGSbLMphL6F5pp3s
+8o0Xyh86FHFdpVOwYx09ELLkuG17V/P9pgIc0Eo/gDMbN+KT3IdgECf8S//pCRA6RrNjcXIx
+ggF7MIIBdwIBATCBmTCBkjELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxETAP
+BgNVBAcTCEJyaXNiYW5lMRowGAYDVQQKExFDcnlwdHNvZnQgUHR5IEx0ZDEiMCAGA1UECxMZ
+REVNT05TVFJBVElPTiBBTkQgVEVTVElORzEbMBkGA1UEAxMSREVNTyBaRVJPIFZBTFVFIENB
+AgIEfjAJBgUrDgMCGgUAoHowGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAbBgkqhkiG9w0B
+CQ8xDjAMMAoGCCqGSIb3DQMHMBwGCSqGSIb3DQEJBTEPFw05ODA1MTQwMzM5MzdaMCMGCSqG
+SIb3DQEJBDEWBBQstNMnSV26ba8PapQEDhO21yNFrjANBgkqhkiG9w0BAQEFAARAW9Xb9YXv
+BfcNkutgFX9Gr8iXhBVsNtGEVrjrpkQwpKa7jHI8SjAlLhk/4RFwDHf+ISB9Np3Z1WDWnLcA
+9CWR6g==
+--------------ms9A58844C95949ECC78A1C54C--
+
+
+From angela@c2.net.au Thu May 14 13:33:16 1998
+X-UIDL: 8f076c44ff7c5967fd5b00c4588a8731
+Return-Path: angela@c2.net.au
+Received: from cryptsoft.com (play.cryptsoft.com [203.56.44.3]) by pandora.cryptsoft.com (8.8.3/8.7.3) with ESMTP id NAA27847 for <tjh@cryptsoft.com>; Thu, 14 May 1998 13:33:15 +1000 (EST)
+Message-ID: <355A67AB.2AF38806@cryptsoft.com>
+Date: Thu, 14 May 1998 13:40:27 +1000
+From: Angela van Lent <angela@c2.net.au>
+X-Mailer: Mozilla 4.03 [en] (Win95; U)
+MIME-Version: 1.0
+To: tjh@cryptsoft.com
+Subject: signed
+Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="------------msD7863B84BD61E02C407F2F5E"
+Content-Length: 2679
+Status: OR
+
+This is a cryptographically signed message in MIME format.
+
+--------------msD7863B84BD61E02C407F2F5E
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+
+signed body 2
+
+--------------msD7863B84BD61E02C407F2F5E
+Content-Type: application/x-pkcs7-signature; name="smime.p7s"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename="smime.p7s"
+Content-Description: S/MIME Cryptographic Signature
+
+MIIGVgYJKoZIhvcNAQcCoIIGRzCCBkMCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCC
+BGswggJTMIIB/aADAgECAgIEfjANBgkqhkiG9w0BAQQFADCBkjELMAkGA1UEBhMCQVUxEzAR
+BgNVBAgTClF1ZWVuc2xhbmQxETAPBgNVBAcTCEJyaXNiYW5lMRowGAYDVQQKExFDcnlwdHNv
+ZnQgUHR5IEx0ZDEiMCAGA1UECxMZREVNT05TVFJBVElPTiBBTkQgVEVTVElORzEbMBkGA1UE
+AxMSREVNTyBaRVJPIFZBTFVFIENBMB4XDTk4MDUxMzA2MjY1NloXDTAwMDUxMjA2MjY1Nlow
+gaUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFu
+ZTEaMBgGA1UEChMRQ3J5cHRzb2Z0IFB0eSBMdGQxEjAQBgNVBAsTCVNNSU1FIDAwMzEZMBcG
+A1UEAxMQQW5nZWxhIHZhbiBMZWVudDEjMCEGCSqGSIb3DQEJARYUYW5nZWxhQGNyeXB0c29m
+dC5jb20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEAuC3+7dAb2LhuO7gt2cTM8vsNjhG5JfDh
+hX1Vl/wVGbKEEj0MA6vWEolvefQlxB+EzwCtR0YZ7eEC/T/4JoCyeQIDAQABoygwJjAkBglg
+hkgBhvhCAQ0EFxYVR2VuZXJhdGVkIHdpdGggU1NMZWF5MA0GCSqGSIb3DQEBBAUAA0EAUnSP
+igs6TMFISTjw8cBtJYb98czgAVkVFjKyJQwYMH8FbDnCyx6NocM555nsyDstaw8fKR11Khds
+syd3ikkrhDCCAhAwggG6AgEDMA0GCSqGSIb3DQEBBAUAMIGSMQswCQYDVQQGEwJBVTETMBEG
+A1UECBMKUXVlZW5zbGFuZDERMA8GA1UEBxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29m
+dCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNUUkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQD
+ExJERU1PIFpFUk8gVkFMVUUgQ0EwHhcNOTgwMzAzMDc0MTMyWhcNMDgwMjI5MDc0MTMyWjCB
+kjELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxETAPBgNVBAcTCEJyaXNiYW5l
+MRowGAYDVQQKExFDcnlwdHNvZnQgUHR5IEx0ZDEiMCAGA1UECxMZREVNT05TVFJBVElPTiBB
+TkQgVEVTVElORzEbMBkGA1UEAxMSREVNTyBaRVJPIFZBTFVFIENBMFwwDQYJKoZIhvcNAQEB
+BQADSwAwSAJBAL+0E2fLej3FSCwe2A2iRnMuC3z12qHIp6Ky1wo2zZcxft7AI+RfkrWrSGtf
+mfzBEuPrLdfulncC5Y1pNcM8RTUCAwEAATANBgkqhkiG9w0BAQQFAANBAGSbLMphL6F5pp3s
+8o0Xyh86FHFdpVOwYx09ELLkuG17V/P9pgIc0Eo/gDMbN+KT3IdgECf8S//pCRA6RrNjcXIx
+ggGzMIIBrwIBATCBmTCBkjELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxETAP
+BgNVBAcTCEJyaXNiYW5lMRowGAYDVQQKExFDcnlwdHNvZnQgUHR5IEx0ZDEiMCAGA1UECxMZ
+REVNT05TVFJBVElPTiBBTkQgVEVTVElORzEbMBkGA1UEAxMSREVNTyBaRVJPIFZBTFVFIENB
+AgIEfjAJBgUrDgMCGgUAoIGxMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcN
+AQkFMQ8XDTk4MDUxNDAzNDAyN1owIwYJKoZIhvcNAQkEMRYEFOKcV8mNYJnM8rHQajcSEqJN
+rwdDMFIGCSqGSIb3DQEJDzFFMEMwCgYIKoZIhvcNAwcwDgYIKoZIhvcNAwICAgCAMAcGBSsO
+AwIHMA0GCCqGSIb3DQMCAgFAMA0GCCqGSIb3DQMCAgEoMA0GCSqGSIb3DQEBAQUABEADPE/N
+coH+zTFuX5YpolupTKxKK8eEjc48TuADuO8bIHHDE/fEYaWunlwDuTlcFJl1ig0idffPB1qC
+Zp8SSVVY
+--------------msD7863B84BD61E02C407F2F5E--
+
+
+From angela@c2.net.au Thu May 14 14:05:32 1998
+X-UIDL: a7d629b4b9acacaee8b39371b860a32a
+Return-Path: angela@c2.net.au
+Received: from cryptsoft.com (play.cryptsoft.com [203.56.44.3]) by pandora.cryptsoft.com (8.8.3/8.7.3) with ESMTP id OAA28033 for <tjh@cryptsoft.com>; Thu, 14 May 1998 14:05:32 +1000 (EST)
+Message-ID: <355A6F3B.AC385981@cryptsoft.com>
+Date: Thu, 14 May 1998 14:12:43 +1000
+From: Angela van Lent <angela@c2.net.au>
+X-Mailer: Mozilla 4.03 [en] (Win95; U)
+MIME-Version: 1.0
+To: tjh@cryptsoft.com
+Subject: encrypted
+Content-Type: application/x-pkcs7-mime; name="smime.p7m"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename="smime.p7m"
+Content-Description: S/MIME Encrypted Message
+Content-Length: 905
+Status: OR
+
+MIAGCSqGSIb3DQEHA6CAMIACAQAxggHmMIHwAgEAMIGZMIGSMQswCQYDVQQGEwJBVTETMBEG
+A1UECBMKUXVlZW5zbGFuZDERMA8GA1UEBxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29m
+dCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNUUkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQD
+ExJERU1PIFpFUk8gVkFMVUUgQ0ECAgR+MA0GCSqGSIb3DQEBAQUABEA92N29Yk39RUY2tIVd
+exGT2MFX3J6H8LB8aDRJjw7843ALgJ5zXpM5+f80QkAWwEN2A6Pl3VxiCeKLi435zXVyMIHw
+AgEAMIGZMIGSMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDERMA8GA1UEBxMI
+QnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29mdCBQdHkgTHRkMSIwIAYDVQQLExlERU1PTlNU
+UkFUSU9OIEFORCBURVNUSU5HMRswGQYDVQQDExJERU1PIFpFUk8gVkFMVUUgQ0ECAgRuMA0G
+CSqGSIb3DQEBAQUABECR9IfyHtvnjFmZ8B2oUCEs1vxMsG0u1kxKE4RMPFyDqDCEARq7zXMg
+nzSUI7Wgv5USSKDqcLRJeW+jvYURv/nJMIAGCSqGSIb3DQEHATAaBggqhkiG9w0DAjAOAgIA
+oAQIrLqrij2ZMpeggAQoibtn6reRZWuWk5Iv5IAhgitr8EYE4w4ySQ7EMB6mTlBoFpccUMWX
+BwQgQn1UoWCvYAlhDzURdbui64Dc0rS2wtj+kE/InS6y25EEEPe4NUKaF8/UlE+lo3LtILQE
+CL3uV8k7m0iqAAAAAAAAAAAAAA==
+
diff --git a/crypto/pkcs7/t/s.pem b/crypto/pkcs7/t/s.pem
new file mode 100644 (file)
index 0000000..4fa925b
--- /dev/null
@@ -0,0 +1,57 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOgIBAAJBAK3nI4nuDYe3nDJES5WBc90igEstxWC4/h4YY+/ciYki35U8ets9
+mgaoCNYp/e9BCZHtvK2Y+fYokGJv5+cMTQsCAwEAAQJBAIHpvXvqEcOEoDRRHuIG
+fkcB4jPHcr9KE9TpxabH6xs9beN6OJnkePXAHwaz5MnUgSnbpOKq+cw8miKjXwe/
+zVECIQDVLwncT2lRmXarEYHzb+q/0uaSvKhWKKt3kJasLNTrAwIhANDUc/ghut29
+p3jJYjurzUKuG774/5eLjPLsxPPIZzNZAiA/10hSq41UnGqHLEUIS9m2/EeEZe7b
+bm567dfRU9OnVQIgDo8ROrZXSchEGbaog5J5r/Fle83uO8l93R3GqVxKXZkCIFfk
+IPD5PIYQAyyod3hyKKza7ZP4CGY4oOfZetbkSGGG
+-----END RSA PRIVATE KEY-----
+issuer :/C=AU/SP=Queensland/L=Brisbane/O=Cryptsoft Pty Ltd/OU=DEMONSTRATION AND TESTING/CN=DEMO ZERO VALUE CA
+subject:/C=AU/SP=Queensland/L=Brisbane/O=Cryptsoft Pty Ltd/OU=SMIME 003/CN=Information/Email=info@cryptsoft.com
+serial :047D
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1149 (0x47d)
+        Signature Algorithm: md5withRSAEncryption
+        Issuer: C=AU, SP=Queensland, L=Brisbane, O=Cryptsoft Pty Ltd, OU=DEMONSTRATION AND TESTING, CN=DEMO ZERO VALUE CA
+        Validity
+            Not Before: May 13 05:40:58 1998 GMT
+            Not After : May 12 05:40:58 2000 GMT
+        Subject: C=AU, SP=Queensland, L=Brisbane, O=Cryptsoft Pty Ltd, OU=SMIME 003, CN=Information/Email=info@cryptsoft.com
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Modulus:
+                    00:ad:e7:23:89:ee:0d:87:b7:9c:32:44:4b:95:81:
+                    73:dd:22:80:4b:2d:c5:60:b8:fe:1e:18:63:ef:dc:
+                    89:89:22:df:95:3c:7a:db:3d:9a:06:a8:08:d6:29:
+                    fd:ef:41:09:91:ed:bc:ad:98:f9:f6:28:90:62:6f:
+                    e7:e7:0c:4d:0b
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            Netscape Comment: 
+                Generated with SSLeay
+    Signature Algorithm: md5withRSAEncryption
+        52:15:ea:88:f4:f0:f9:0b:ef:ce:d5:f8:83:40:61:16:5e:55:
+        f9:ce:2d:d1:8b:31:5c:03:c6:2d:10:7c:61:d5:5c:0a:42:97:
+        d1:fd:65:b6:b6:84:a5:39:ec:46:ec:fc:e0:0d:d9:22:da:1b:
+        50:74:ad:92:cb:4e:90:e5:fa:7d
+
+-----BEGIN CERTIFICATE-----
+MIICTDCCAfagAwIBAgICBH0wDQYJKoZIhvcNAQEEBQAwgZIxCzAJBgNVBAYTAkFV
+MRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFuZTEaMBgGA1UE
+ChMRQ3J5cHRzb2Z0IFB0eSBMdGQxIjAgBgNVBAsTGURFTU9OU1RSQVRJT04gQU5E
+IFRFU1RJTkcxGzAZBgNVBAMTEkRFTU8gWkVSTyBWQUxVRSBDQTAeFw05ODA1MTMw
+NTQwNThaFw0wMDA1MTIwNTQwNThaMIGeMQswCQYDVQQGEwJBVTETMBEGA1UECBMK
+UXVlZW5zbGFuZDERMA8GA1UEBxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29m
+dCBQdHkgTHRkMRIwEAYDVQQLEwlTTUlNRSAwMDMxFDASBgNVBAMTC0luZm9ybWF0
+aW9uMSEwHwYJKoZIhvcNAQkBFhJpbmZvQGNyeXB0c29mdC5jb20wXDANBgkqhkiG
+9w0BAQEFAANLADBIAkEArecjie4Nh7ecMkRLlYFz3SKASy3FYLj+Hhhj79yJiSLf
+lTx62z2aBqgI1in970EJke28rZj59iiQYm/n5wxNCwIDAQABoygwJjAkBglghkgB
+hvhCAQ0EFxYVR2VuZXJhdGVkIHdpdGggU1NMZWF5MA0GCSqGSIb3DQEBBAUAA0EA
+UhXqiPTw+QvvztX4g0BhFl5V+c4t0YsxXAPGLRB8YdVcCkKX0f1ltraEpTnsRuz8
+4A3ZItobUHStkstOkOX6fQ==
+-----END CERTIFICATE-----
+
diff --git a/crypto/pkcs7/t/server.pem b/crypto/pkcs7/t/server.pem
new file mode 100644 (file)
index 0000000..989baf8
--- /dev/null
@@ -0,0 +1,57 @@
+issuer :/C=AU/SP=Queensland/L=Brisbane/O=Cryptsoft Pty Ltd/OU=DEMONSTRATION AND TESTING/CN=DEMO ZERO VALUE CA
+subject:/C=AU/SP=Queensland/L=Brisbane/O=Cryptsoft Pty Ltd/OU=SMIME 003/CN=Information/Email=info@cryptsoft.com
+serial :047D
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1149 (0x47d)
+        Signature Algorithm: md5withRSAEncryption
+        Issuer: C=AU, SP=Queensland, L=Brisbane, O=Cryptsoft Pty Ltd, OU=DEMONSTRATION AND TESTING, CN=DEMO ZERO VALUE CA
+        Validity
+            Not Before: May 13 05:40:58 1998 GMT
+            Not After : May 12 05:40:58 2000 GMT
+        Subject: C=AU, SP=Queensland, L=Brisbane, O=Cryptsoft Pty Ltd, OU=SMIME 003, CN=Information/Email=info@cryptsoft.com
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Modulus:
+                    00:ad:e7:23:89:ee:0d:87:b7:9c:32:44:4b:95:81:
+                    73:dd:22:80:4b:2d:c5:60:b8:fe:1e:18:63:ef:dc:
+                    89:89:22:df:95:3c:7a:db:3d:9a:06:a8:08:d6:29:
+                    fd:ef:41:09:91:ed:bc:ad:98:f9:f6:28:90:62:6f:
+                    e7:e7:0c:4d:0b
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            Netscape Comment: 
+                Generated with SSLeay
+    Signature Algorithm: md5withRSAEncryption
+        52:15:ea:88:f4:f0:f9:0b:ef:ce:d5:f8:83:40:61:16:5e:55:
+        f9:ce:2d:d1:8b:31:5c:03:c6:2d:10:7c:61:d5:5c:0a:42:97:
+        d1:fd:65:b6:b6:84:a5:39:ec:46:ec:fc:e0:0d:d9:22:da:1b:
+        50:74:ad:92:cb:4e:90:e5:fa:7d
+
+-----BEGIN CERTIFICATE-----
+MIICTDCCAfagAwIBAgICBH0wDQYJKoZIhvcNAQEEBQAwgZIxCzAJBgNVBAYTAkFV
+MRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFuZTEaMBgGA1UE
+ChMRQ3J5cHRzb2Z0IFB0eSBMdGQxIjAgBgNVBAsTGURFTU9OU1RSQVRJT04gQU5E
+IFRFU1RJTkcxGzAZBgNVBAMTEkRFTU8gWkVSTyBWQUxVRSBDQTAeFw05ODA1MTMw
+NTQwNThaFw0wMDA1MTIwNTQwNThaMIGeMQswCQYDVQQGEwJBVTETMBEGA1UECBMK
+UXVlZW5zbGFuZDERMA8GA1UEBxMIQnJpc2JhbmUxGjAYBgNVBAoTEUNyeXB0c29m
+dCBQdHkgTHRkMRIwEAYDVQQLEwlTTUlNRSAwMDMxFDASBgNVBAMTC0luZm9ybWF0
+aW9uMSEwHwYJKoZIhvcNAQkBFhJpbmZvQGNyeXB0c29mdC5jb20wXDANBgkqhkiG
+9w0BAQEFAANLADBIAkEArecjie4Nh7ecMkRLlYFz3SKASy3FYLj+Hhhj79yJiSLf
+lTx62z2aBqgI1in970EJke28rZj59iiQYm/n5wxNCwIDAQABoygwJjAkBglghkgB
+hvhCAQ0EFxYVR2VuZXJhdGVkIHdpdGggU1NMZWF5MA0GCSqGSIb3DQEBBAUAA0EA
+UhXqiPTw+QvvztX4g0BhFl5V+c4t0YsxXAPGLRB8YdVcCkKX0f1ltraEpTnsRuz8
+4A3ZItobUHStkstOkOX6fQ==
+-----END CERTIFICATE-----
+
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOgIBAAJBAK3nI4nuDYe3nDJES5WBc90igEstxWC4/h4YY+/ciYki35U8ets9
+mgaoCNYp/e9BCZHtvK2Y+fYokGJv5+cMTQsCAwEAAQJBAIHpvXvqEcOEoDRRHuIG
+fkcB4jPHcr9KE9TpxabH6xs9beN6OJnkePXAHwaz5MnUgSnbpOKq+cw8miKjXwe/
+zVECIQDVLwncT2lRmXarEYHzb+q/0uaSvKhWKKt3kJasLNTrAwIhANDUc/ghut29
+p3jJYjurzUKuG774/5eLjPLsxPPIZzNZAiA/10hSq41UnGqHLEUIS9m2/EeEZe7b
+bm567dfRU9OnVQIgDo8ROrZXSchEGbaog5J5r/Fle83uO8l93R3GqVxKXZkCIFfk
+IPD5PIYQAyyod3hyKKza7ZP4CGY4oOfZetbkSGGG
+-----END RSA PRIVATE KEY-----
diff --git a/crypto/pkcs7/t/z b/crypto/pkcs7/t/z
new file mode 100644 (file)
index 0000000..a5145e8
--- /dev/null
@@ -0,0 +1 @@
+DQpzaWduZWQgYm9keQ0KDQo=\r
diff --git a/crypto/pkcs7/t/zz b/crypto/pkcs7/t/zz
new file mode 100644 (file)
index 0000000..aabbbb3
--- /dev/null
@@ -0,0 +1,16 @@
+-----BEGIN PKCS7-----
+MIAGCSqGSIb3DQEHA6CAMIICeQIBADGCAeYwgfACAQAwgZkwgZIxCzAJBgNVBAYT
+AkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFuZTEaMBgG
+A1UEChMRQ3J5cHRzb2Z0IFB0eSBMdGQxIjAgBgNVBAsTGURFTU9OU1RSQVRJT04g
+QU5EIFRFU1RJTkcxGzAZBgNVBAMTEkRFTU8gWkVSTyBWQUxVRSBDQQICBH4wDQYJ
+KoZIhvcNAQEBBQAEQD3Y3b1iTf1FRja0hV17EZPYwVfcnofwsHxoNEmPDvzjcAuA
+nnNekzn5/zRCQBbAQ3YDo+XdXGIJ4ouLjfnNdXIwgfACAQAwgZkwgZIxCzAJBgNV
+BAYTAkFVMRMwEQYDVQQIEwpRdWVlbnNsYW5kMREwDwYDVQQHEwhCcmlzYmFuZTEa
+MBgGA1UEChMRQ3J5cHRzb2Z0IFB0eSBMdGQxIjAgBgNVBAsTGURFTU9OU1RSQVRJ
+T04gQU5EIFRFU1RJTkcxGzAZBgNVBAMTEkRFTU8gWkVSTyBWQUxVRSBDQQICBG4w
+DQYJKoZIhvcNAQEBBQAEQJH0h/Ie2+eMWZnwHahQISzW/EywbS7WTEoThEw8XIOo
+MIQBGrvNcyCfNJQjtaC/lRJIoOpwtEl5b6O9hRG/+ckwgYkGCSqGSIb3DQEHATAa
+BggqhkiG9w0DAjAOAgIAoAQIrLqrij2ZMpeAYIm7Z+q3kWVrlpOSL+SAIYIra/BG
+BOMOMkkOxDAepk5QaBaXHFDFlwdCfVShYK9gCWEPNRF1u6LrgNzStLbC2P6QT8id
+LrLbkfe4NUKaF8/UlE+lo3LtILS97lfJO5tIqgAAAAA=
+-----END PKCS7-----
index 0e1c1b26dcb70ef02124933b19a6da2f4f66b79d..7e0f6e5fee0d35f625fa0fc6ec8c165e015ca88e 100644 (file)
@@ -64,6 +64,7 @@
 int verify_callback(int ok, X509_STORE_CTX *ctx);
 
 BIO *bio_err=NULL;
+BIO *bio_out=NULL;
 
 main(argc,argv)
 int argc;
@@ -84,6 +85,7 @@ char *argv[];
        STACK *sk;
 
        bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
+       bio_out=BIO_new_fp(stdout,BIO_NOCLOSE);
        EVP_add_digest(EVP_md2());
        EVP_add_digest(EVP_md5());
        EVP_add_digest(EVP_sha1());
@@ -131,10 +133,10 @@ again:
        X509_STORE_load_locations(cert_store,NULL,"../../certs");
        X509_STORE_set_verify_cb_func(cert_store,verify_callback);
 
-       ERR_clear_errors();
+       ERR_clear_error();
 
        /* We need to process the data */
-       if (PKCS7_get_detached(p7))
+       if ((PKCS7_get_detached(p7) || detached))
                {
                if (detached == NULL)
                        {
@@ -168,10 +170,27 @@ again:
        /* Ok, first we need to, for each subject entry, see if we can verify */
        for (i=0; i<sk_num(sk); i++)
                {
+               ASN1_UTCTIME *tm;
+               char *str1,*str2;
+
                si=(PKCS7_SIGNER_INFO *)sk_value(sk,i);
                i=PKCS7_dataVerify(cert_store,&cert_ctx,p7bio,p7,si);
                if (i <= 0)
                        goto err;
+               printf("signer info\n");
+               if ((tm=get_signed_time(si)) != NULL)
+                       {
+                       BIO_printf(bio_out,"Signed time:");
+                       ASN1_UTCTIME_print(bio_out,tm);
+                       ASN1_UTCTIME_free(tm);
+                       BIO_printf(bio_out,"\n");
+                       }
+               if (get_signed_seq2string(si,&str1,&str2))
+                       {
+                       BIO_printf(bio_out,"String 1 is %s\n",str1);
+                       BIO_printf(bio_out,"String 2 is %s\n",str2);
+                       }
+                       
                }
 
        X509_STORE_free(cert_store);
index d04f0a9b43ba258c6a9cfaea1feafa0ebe64a99a..ef693aec167678005fc400dac63fc345f4cdfd32 100644 (file)
@@ -20,8 +20,8 @@ TEST= randtest.c
 APPS=
 
 LIB=$(TOP)/libcrypto.a
-LIBSRC=md_rand.c randfile.c
-LIBOBJ=md_rand.o randfile.o
+LIBSRC=md_rand.c randfile.c rand_lib.c
+LIBOBJ=md_rand.o randfile.o rand_lib.o
 
 SRC= $(LIBSRC)
 
index f44b36a8b913fff25937421cf6e79dc908539571..35defdea30c9412beb587dd908a6dedd4885554f 100644 (file)
@@ -88,6 +88,7 @@ We need a message digest of some type
 #define MD_Init(a)             MD5_Init(a)
 #define MD_Update(a,b,c)       MD5_Update(a,b,c)
 #define        MD_Final(a,b)           MD5_Final(a,b)
+#define        MD(a,b,c)               MD5(a,b,c)
 #elif defined(USE_SHA1_RAND)
 #include "sha.h"
 #define MD_DIGEST_LENGTH       SHA_DIGEST_LENGTH
@@ -95,6 +96,7 @@ We need a message digest of some type
 #define MD_Init(a)             SHA1_Init(a)
 #define MD_Update(a,b,c)       SHA1_Update(a,b,c)
 #define        MD_Final(a,b)           SHA1_Final(a,b)
+#define        MD(a,b,c)               SHA1(a,b,c)
 #elif defined(USE_MDC2_RAND)
 #include "mdc2.h"
 #define MD_DIGEST_LENGTH       MDC2_DIGEST_LENGTH
@@ -102,6 +104,7 @@ We need a message digest of some type
 #define MD_Init(a)             MDC2_Init(a)
 #define MD_Update(a,b,c)       MDC2_Update(a,b,c)
 #define        MD_Final(a,b)           MDC2_Final(a,b)
+#define        MD(a,b,c)               MDC2(a,b,c)
 #elif defined(USE_MD2_RAND)
 #include "md2.h"
 #define MD_DIGEST_LENGTH       MD2_DIGEST_LENGTH
@@ -109,31 +112,48 @@ We need a message digest of some type
 #define MD_Init(a)             MD2_Init(a)
 #define MD_Update(a,b,c)       MD2_Update(a,b,c)
 #define        MD_Final(a,b)           MD2_Final(a,b)
+#define        MD(a,b,c)               MD2(a,b,c)
 #endif
 
 #include "rand.h"
 
-/*#define NORAND       1 */
-/*#define PREDICT      1 */
+/* #define NORAND      1 */
+/* #define PREDICT     1 */
 
 #define STATE_SIZE     1023
 static int state_num=0,state_index=0;
 static unsigned char state[STATE_SIZE+MD_DIGEST_LENGTH];
 static unsigned char md[MD_DIGEST_LENGTH];
-static int md_count=0;
+static long md_count[2]={0,0};
 
-char *RAND_version="RAND part of SSLeay 0.9.0b 29-Jun-1998";
+char *RAND_version="RAND part of SSLeay 0.9.1a 06-Jul-1998";
 
-void RAND_cleanup()
+static void ssleay_rand_cleanup(void);
+static void ssleay_rand_seed(unsigned char *buf, int num);
+static void ssleay_rand_bytes(unsigned char *buf, int num);
+
+RAND_METHOD rand_ssleay={
+       ssleay_rand_seed,
+       ssleay_rand_bytes,
+       ssleay_rand_cleanup,
+       }; 
+
+RAND_METHOD *RAND_SSLeay()
+       {
+       return(&rand_ssleay);
+       }
+
+static void ssleay_rand_cleanup()
        {
        memset(state,0,sizeof(state));
        state_num=0;
        state_index=0;
        memset(md,0,MD_DIGEST_LENGTH);
-       md_count=0;
+       md_count[0]=0;
+       md_count[1]=0;
        }
 
-void RAND_seed(buf,num)
+static void ssleay_rand_seed(buf,num)
 unsigned char *buf;
 int num;
        {
@@ -178,7 +198,9 @@ int num;
                        MD_Update(&m,&(state[st_idx]),j);
                        
                MD_Update(&m,buf,j);
+               MD_Update(&m,(unsigned char *)&(md_count[0]),sizeof(md_count));
                MD_Final(md,&m);
+               md_count[1]++;
 
                buf+=j;
 
@@ -195,7 +217,7 @@ int num;
        memset((char *)&m,0,sizeof(m));
        }
 
-void RAND_bytes(buf,num)
+static void ssleay_rand_bytes(buf,num)
 unsigned char *buf;
 int num;
        {
@@ -277,6 +299,7 @@ int num;
                num-=j;
                MD_Init(&m);
                MD_Update(&m,&(md[MD_DIGEST_LENGTH/2]),MD_DIGEST_LENGTH/2);
+               MD_Update(&m,(unsigned char *)&(md_count[0]),sizeof(md_count));
 #ifndef PURIFY
                MD_Update(&m,buf,j); /* purify complains */
 #endif
@@ -300,7 +323,8 @@ int num;
                }
 
        MD_Init(&m);
-       MD_Update(&m,(unsigned char *)&md_count,sizeof(md_count)); md_count++;
+       MD_Update(&m,(unsigned char *)&(md_count[0]),sizeof(md_count));
+       md_count[0]++;
        MD_Update(&m,md,MD_DIGEST_LENGTH);
        MD_Final(md,&m);
        memset(&m,0,sizeof(m));
@@ -385,7 +409,7 @@ void RAND_screen(void)
        GetBitmapBits(hBitmap, size, bmbits);
 
        /* Get the MD5 of the bitmap */
-       MD5(bmbits,size,md);
+       MD(bmbits,size,md);
 
        /* Seed the random generator with the MD5 digest */
        RAND_seed(md, MD_DIGEST_LENGTH);
index 477d7a150a511e00cc5b979eebd23ae82686cd7d..f5edcb9a547a80a873c913307ee2dd7da33b0956 100644 (file)
 extern "C" {
 #endif
 
+typedef struct rand_meth_st
+       {
 #ifndef NOPROTO
+       void (*seed)(unsigned char *buf, int num);
+       void (*bytes)(unsigned char *buf, int num);
+       void (*cleanup)(void);
+#else
+       void (*seed)();
+       void (*bytes)();
+       void (*cleanup)();
+#endif
+       } RAND_METHOD;
+
+#ifndef NOPROTO
+void RAND_set_rand_method(RAND_METHOD *meth);
+RAND_METHOD *RAND_get_rand_method(void );
+RAND_METHOD *RAND_SSLeay(void);
 void RAND_cleanup(void );
 void RAND_bytes( unsigned char *buf,int num);
 void RAND_seed( unsigned char *buf,int num);
@@ -74,6 +90,9 @@ char *RAND_file_name(char *file,int num);
 void RAND_screen(void);
 #endif
 #else
+void RAND_set_rand_method();
+RAND_METHOD *RAND_get_rand_method();
+RAND_METHOD *RAND_SSLeay();
 void RAND_cleanup();
 void RAND_bytes();
 void RAND_seed();
diff --git a/crypto/rand/rand_lib.c b/crypto/rand/rand_lib.c
new file mode 100644 (file)
index 0000000..c4b44e5
--- /dev/null
@@ -0,0 +1,104 @@
+/* crypto/rand/rand_lib.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include "cryptlib.h"
+#include <sys/types.h>
+#include <time.h>
+#include "rand.h"
+
+#ifdef NO_RAND
+static RAND_METHOD *rand_meth=NULL;
+#else
+extern RAND_METHOD rand_ssleay;
+static RAND_METHOD *rand_meth= &rand_ssleay;
+#endif
+
+void RAND_set_rand_method(meth)
+RAND_METHOD *meth;
+       {
+       rand_meth=meth;
+       }
+
+RAND_METHOD *RAND_get_rand_method()
+       {
+       return(rand_meth);
+       }
+
+void RAND_cleanup()
+       {
+       if (rand_meth != NULL)
+               rand_meth->cleanup();
+       }
+
+void RAND_seed(buf,num)
+unsigned char *buf;
+int num;
+       {
+       if (rand_meth != NULL)
+               rand_meth->seed(buf,num);
+       }
+
+void RAND_bytes(buf,num)
+unsigned char *buf;
+int num;
+       {
+       if (rand_meth != NULL)
+               rand_meth->bytes(buf,num);
+       }
+
index f2b37463630d6d544512b2e088977b67051f2114..4b38b2bf64c08f26fa57aaf1ccd8ad91c0127c09 100644 (file)
@@ -58,6 +58,7 @@
 
 #include <stdio.h>
 #include "cryptlib.h"
+#include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include "rand.h"
@@ -86,7 +87,7 @@ long bytes;
        if (i < 0) return(0);
        if (bytes <= 0) return(ret);
 
-       in=fopen(file,"r");
+       in=fopen(file,"br");
        if (in == NULL) goto err;
        for (;;)
                {
index 96239cd4e03f0ce319922604a3b95e936dbb4e9a..502298258ded2d8f6e02d5da4c7318c75249c2b4 100644 (file)
@@ -59,7 +59,7 @@
 #include "rc2.h"
 #include "rc2_locl.h"
 
-char *RC2_version="RC2 part of SSLeay 0.9.0b 29-Jun-1998";
+char *RC2_version="RC2 part of SSLeay 0.9.1a 06-Jul-1998";
 
 /* RC2 as implemented frm a posting from
  * Newsgroups: sci.crypt
index 6cd8ea8f27c3f1b1b350e71ba4eca491b7d39719..d02f9d812c19ea36831b2710a2df47ea8ac3c2f6 100644 (file)
@@ -92,7 +92,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
diff --git a/crypto/rc2/tab.c b/crypto/rc2/tab.c
new file mode 100644 (file)
index 0000000..25dc14e
--- /dev/null
@@ -0,0 +1,86 @@
+#include <stdio.h>
+
+unsigned char ebits_to_num[256]={
+       0xbd,0x56,0xea,0xf2,0xa2,0xf1,0xac,0x2a,
+       0xb0,0x93,0xd1,0x9c,0x1b,0x33,0xfd,0xd0,
+       0x30,0x04,0xb6,0xdc,0x7d,0xdf,0x32,0x4b,
+       0xf7,0xcb,0x45,0x9b,0x31,0xbb,0x21,0x5a,
+       0x41,0x9f,0xe1,0xd9,0x4a,0x4d,0x9e,0xda,
+       0xa0,0x68,0x2c,0xc3,0x27,0x5f,0x80,0x36,
+       0x3e,0xee,0xfb,0x95,0x1a,0xfe,0xce,0xa8,
+       0x34,0xa9,0x13,0xf0,0xa6,0x3f,0xd8,0x0c,
+       0x78,0x24,0xaf,0x23,0x52,0xc1,0x67,0x17,
+       0xf5,0x66,0x90,0xe7,0xe8,0x07,0xb8,0x60,
+       0x48,0xe6,0x1e,0x53,0xf3,0x92,0xa4,0x72,
+       0x8c,0x08,0x15,0x6e,0x86,0x00,0x84,0xfa,
+       0xf4,0x7f,0x8a,0x42,0x19,0xf6,0xdb,0xcd,
+       0x14,0x8d,0x50,0x12,0xba,0x3c,0x06,0x4e,
+       0xec,0xb3,0x35,0x11,0xa1,0x88,0x8e,0x2b,
+       0x94,0x99,0xb7,0x71,0x74,0xd3,0xe4,0xbf,
+       0x3a,0xde,0x96,0x0e,0xbc,0x0a,0xed,0x77,
+       0xfc,0x37,0x6b,0x03,0x79,0x89,0x62,0xc6,
+       0xd7,0xc0,0xd2,0x7c,0x6a,0x8b,0x22,0xa3,
+       0x5b,0x05,0x5d,0x02,0x75,0xd5,0x61,0xe3,
+       0x18,0x8f,0x55,0x51,0xad,0x1f,0x0b,0x5e,
+       0x85,0xe5,0xc2,0x57,0x63,0xca,0x3d,0x6c,
+       0xb4,0xc5,0xcc,0x70,0xb2,0x91,0x59,0x0d,
+       0x47,0x20,0xc8,0x4f,0x58,0xe0,0x01,0xe2,
+       0x16,0x38,0xc4,0x6f,0x3b,0x0f,0x65,0x46,
+       0xbe,0x7e,0x2d,0x7b,0x82,0xf9,0x40,0xb5,
+       0x1d,0x73,0xf8,0xeb,0x26,0xc7,0x87,0x97,
+       0x25,0x54,0xb1,0x28,0xaa,0x98,0x9d,0xa5,
+       0x64,0x6d,0x7a,0xd4,0x10,0x81,0x44,0xef,
+       0x49,0xd6,0xae,0x2e,0xdd,0x76,0x5c,0x2f,
+       0xa7,0x1c,0xc9,0x09,0x69,0x9a,0x83,0xcf,
+       0x29,0x39,0xb9,0xe9,0x4c,0xff,0x43,0xab,
+       };
+
+unsigned char num_to_ebits[256]={
+       0x5d,0xbe,0x9b,0x8b,0x11,0x99,0x6e,0x4d,
+       0x59,0xf3,0x85,0xa6,0x3f,0xb7,0x83,0xc5,
+       0xe4,0x73,0x6b,0x3a,0x68,0x5a,0xc0,0x47,
+       0xa0,0x64,0x34,0x0c,0xf1,0xd0,0x52,0xa5,
+       0xb9,0x1e,0x96,0x43,0x41,0xd8,0xd4,0x2c,
+       0xdb,0xf8,0x07,0x77,0x2a,0xca,0xeb,0xef,
+       0x10,0x1c,0x16,0x0d,0x38,0x72,0x2f,0x89,
+       0xc1,0xf9,0x80,0xc4,0x6d,0xae,0x30,0x3d,
+       0xce,0x20,0x63,0xfe,0xe6,0x1a,0xc7,0xb8,
+       0x50,0xe8,0x24,0x17,0xfc,0x25,0x6f,0xbb,
+       0x6a,0xa3,0x44,0x53,0xd9,0xa2,0x01,0xab,
+       0xbc,0xb6,0x1f,0x98,0xee,0x9a,0xa7,0x2d,
+       0x4f,0x9e,0x8e,0xac,0xe0,0xc6,0x49,0x46,
+       0x29,0xf4,0x94,0x8a,0xaf,0xe1,0x5b,0xc3,
+       0xb3,0x7b,0x57,0xd1,0x7c,0x9c,0xed,0x87,
+       0x40,0x8c,0xe2,0xcb,0x93,0x14,0xc9,0x61,
+       0x2e,0xe5,0xcc,0xf6,0x5e,0xa8,0x5c,0xd6,
+       0x75,0x8d,0x62,0x95,0x58,0x69,0x76,0xa1,
+       0x4a,0xb5,0x55,0x09,0x78,0x33,0x82,0xd7,
+       0xdd,0x79,0xf5,0x1b,0x0b,0xde,0x26,0x21,
+       0x28,0x74,0x04,0x97,0x56,0xdf,0x3c,0xf0,
+       0x37,0x39,0xdc,0xff,0x06,0xa4,0xea,0x42,
+       0x08,0xda,0xb4,0x71,0xb0,0xcf,0x12,0x7a,
+       0x4e,0xfa,0x6c,0x1d,0x84,0x00,0xc8,0x7f,
+       0x91,0x45,0xaa,0x2b,0xc2,0xb1,0x8f,0xd5,
+       0xba,0xf2,0xad,0x19,0xb2,0x67,0x36,0xf7,
+       0x0f,0x0a,0x92,0x7d,0xe3,0x9d,0xe9,0x90,
+       0x3e,0x23,0x27,0x66,0x13,0xec,0x81,0x15,
+       0xbd,0x22,0xbf,0x9f,0x7e,0xa9,0x51,0x4b,
+       0x4c,0xfb,0x02,0xd3,0x70,0x86,0x31,0xe7,
+       0x3b,0x05,0x03,0x54,0x60,0x48,0x65,0x18,
+       0xd2,0xcd,0x5f,0x32,0x88,0x0e,0x35,0xfd,
+       };
+       
+main()
+       {
+       int i,j;
+
+       for (i=0; i<256; i++)
+               {
+               for (j=0; j<256; j++)
+                       if (ebits_to_num[j] == i)
+                               {
+                               printf("0x%02x,",j);
+                               break;
+                               }
+               }
+       }
index 19c1e980f3712150811b7f339572822ce89817dd..f5f38a4acb0487ef95a88cffd5d79e17617ea2a5 100644 (file)
@@ -63,7 +63,7 @@ asm/rx86-out.o: asm/rx86unix.cpp
 
 # bsdi
 asm/rx86bsdi.o: asm/rx86unix.cpp
-       $(CPP) -DBSDI asm/rx86unix.cpp | as -o asm/rx86bsdi.o
+       $(CPP) -DBSDI asm/rx86unix.cpp | sed 's/ :/:/' | as -o asm/rx86bsdi.o
 
 asm/rx86unix.cpp:
        (cd asm; perl rc4-586.pl cpp >rx86unix.cpp)
index ab8a111b52e595b181642c44a997e38d7d1a1a2b..26da6d520cc534547b40418d551d2c2070704715 100644 (file)
@@ -95,7 +95,6 @@ unsigned char *outdata;
 #define RC4_LOOP(a,b,i)        LOOP(a[i],b[i])
 #endif
 
-       i= -(int)len;
        i=(int)(len>>3L);
        if (i)
                {
index 0be5fde67b8e84dfee84c28ba63f7a84e68ef2b9..03e69e16c3a3f28bd181b3a65ff30ff682864ddc 100644 (file)
@@ -59,7 +59,7 @@
 #include "rc4.h"
 #include "rc4_locl.h"
 
-char *RC4_version="RC4 part of SSLeay 0.9.0b 29-Jun-1998";
+char *RC4_version="RC4 part of SSLeay 0.9.1a 06-Jul-1998";
 
 char *RC4_options()
        {
index 5298dad6d0ef051b1dec877ecdc370c16b3e47d6..f796f7b7beeb2013232de0902b1cf3d76439c152 100644 (file)
@@ -92,7 +92,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
index 5e98ee23481396e0b01638218d4f0d3822cd50e9..f7379b046b3368b78972b0e2363e03569af99731 100644 (file)
@@ -61,7 +61,7 @@ asm/r586-out.o: asm/r586unix.cpp
 
 # bsdi
 asm/r586bsdi.o: asm/r586unix.cpp
-       $(CPP) -DBSDI asm/r586unix.cpp | as -o asm/r586bsdi.o
+       $(CPP) -DBSDI asm/r586unix.cpp | sed 's/ :/:/' | as -o asm/r586bsdi.o
 
 asm/r586unix.cpp:
        (cd asm; perl rc5-586.pl cpp >r586unix.cpp)
@@ -72,7 +72,7 @@ files:
 links:
        /bin/rm -f Makefile
        $(TOP)/util/point.sh Makefile.ssl Makefile ;
-       $(TOP)/util/point.sh ../../doc/rc5.doc rc5.doc ;
+       $(TOP)/util/point.sh ../../doc/rc5.doc rc5.doc ;
        $(TOP)/util/mklink.sh ../../include $(EXHEADER)
        $(TOP)/util/mklink.sh ../../test $(TEST)
        $(TOP)/util/mklink.sh ../../apps $(APPS)
index 82947f4cd57d8c3325f6e70468ab2858a3f5cc38..ab971a9de96e8b1e0e7f7e809f3536f517539594 100644 (file)
@@ -59,7 +59,7 @@
 #include "rc5.h"
 #include "rc5_locl.h"
 
-char *RC5_version="RC5 part of SSLeay 0.9.0b 29-Jun-1998";
+char *RC5_version="RC5 part of SSLeay 0.9.1a 06-Jul-1998";
 
 void RC5_32_ecb_encrypt(in, out, ks, encrypt)
 unsigned char *in;
index 5eeb560b727d6987b93df8ed0df6c9ddcea4e56c..29148dc494ebd5b9d58171c57e3b97da66f0216a 100644 (file)
@@ -92,7 +92,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
index 67d47ceb2c06cf2ebf7db51c81a88bee7f22d0c6..e865cdb5e70cd7ea1c6b6fbd3aa85cdeef187622 100644 (file)
@@ -59,7 +59,7 @@ asm/rm86-out.o: asm/rm86unix.cpp
 
 # bsdi
 asm/rm86bsdi.o: asm/rm86unix.cpp
-       $(CPP) -DBSDI asm/rm86unix.cpp | as -o asm/rm86bsdi.o
+       $(CPP) -DBSDI asm/rm86unix.cpp | sed 's/ :/:/' | as -o asm/rm86bsdi.o
 
 asm/rm86unix.cpp:
        (cd asm; perl rmd-586.pl cpp >rm86unix.cpp)
index 210de1977d65a2f85d0e0bedd3acd47fbb995802..904a45b762b497600cb3457e088c8de332dde097 100644 (file)
@@ -59,7 +59,7 @@
 #include <stdio.h>
 #include "rmd_locl.h"
 
-char *RMD160_version="RIPEMD160 part of SSLeay 0.9.0b 29-Jun-1998";
+char *RMD160_version="RIPEMD160 part of SSLeay 0.9.1a 06-Jul-1998";
 
 #ifndef NOPROTO
 #  ifdef RMD160_ASM
@@ -73,7 +73,7 @@ char *RMD160_version="RIPEMD160 part of SSLeay 0.9.0b 29-Jun-1998";
      void ripemd160_block_x86();
 #    define ripemd160_block ripemd160_block_x86
 #  else
-     static void ripemd160_block();
+     void ripemd160_block();
 #  endif
 #endif
 
diff --git a/crypto/rsa/f b/crypto/rsa/f
new file mode 100644 (file)
index 0000000..57528ef
--- /dev/null
@@ -0,0 +1,6 @@
+       if ((rsa->method_mod_n == NULL) && (rsa->flags & RSA_FLAG_CACHE_PUBLIC))
+               {
+               if ((rsa->method_mod_n=(char *)BN_MONT_CTX_new()) != NULL)
+                       if (!BN_MONT_CTX_set((BN_MONT_CTX *)rsa->method_mod_n,
+                               rsa->n,ctx)) goto err;
+               }
index 5ded1b5fa2b187da311760aa32e376bc4181b6bc..e866635fb731c2c5fbb3fcaff9cb4f9e103c93f6 100644 (file)
@@ -1,26 +1,27 @@
 /* Error codes for the RSA functions. */
 
 /* Function codes. */
-#define RSA_F_RSA_EAY_PRIVATE_DECRYPT                   100
-#define RSA_F_RSA_EAY_PRIVATE_ENCRYPT                   101
-#define RSA_F_RSA_EAY_PUBLIC_DECRYPT                    102
-#define RSA_F_RSA_EAY_PUBLIC_ENCRYPT                    103
-#define RSA_F_RSA_GENERATE_KEY                          104
-#define RSA_F_RSA_NEW_METHOD                            105
-#define RSA_F_RSA_PADDING_ADD_NONE                      106
-#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1              107
-#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2              108
-#define RSA_F_RSA_PADDING_ADD_SSLV23                    109
-#define RSA_F_RSA_PADDING_CHECK_NONE                    110
-#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1            111
-#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2            112
-#define RSA_F_RSA_PADDING_CHECK_SSLV23                  113
-#define RSA_F_RSA_PRINT                                         114
-#define RSA_F_RSA_PRINT_FP                              115
-#define RSA_F_RSA_SIGN                                  116
-#define RSA_F_RSA_SIGN_ASN1_OCTET_STRING                117
-#define RSA_F_RSA_VERIFY                                118
-#define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING              119
+#define RSA_F_MEMORY_LOCK                               100
+#define RSA_F_RSA_EAY_PRIVATE_DECRYPT                   101
+#define RSA_F_RSA_EAY_PRIVATE_ENCRYPT                   102
+#define RSA_F_RSA_EAY_PUBLIC_DECRYPT                    103
+#define RSA_F_RSA_EAY_PUBLIC_ENCRYPT                    104
+#define RSA_F_RSA_GENERATE_KEY                          105
+#define RSA_F_RSA_NEW_METHOD                            106
+#define RSA_F_RSA_PADDING_ADD_NONE                      107
+#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1              108
+#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2              109
+#define RSA_F_RSA_PADDING_ADD_SSLV23                    110
+#define RSA_F_RSA_PADDING_CHECK_NONE                    111
+#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1            112
+#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2            113
+#define RSA_F_RSA_PADDING_CHECK_SSLV23                  114
+#define RSA_F_RSA_PRINT                                         115
+#define RSA_F_RSA_PRINT_FP                              116
+#define RSA_F_RSA_SIGN                                  117
+#define RSA_F_RSA_SIGN_ASN1_OCTET_STRING                118
+#define RSA_F_RSA_VERIFY                                119
+#define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING              120
 
 /* Reason codes. */
 #define RSA_R_ALGORITHM_MISMATCH                        100
index aeb78ffcd3f620023b5dda4e65d565cf156654d7..b7c02fdab7006f94f3e97d4749fcf374f005693a 100644 (file)
@@ -102,11 +102,14 @@ typedef struct rsa_st
        int references;
        int flags;
 
-       /* Normally used to cached montgomery values */
+       /* Normally used to cache montgomery values */
        char *method_mod_n;
        char *method_mod_p;
        char *method_mod_q;
 
+       /* all BIGNUM values are actually in the following data, if it is not
+        * NULL */
+       char *bignum_data;
        BN_BLINDING *blinding;
        } RSA;
 
@@ -114,6 +117,7 @@ typedef struct rsa_st
 #define RSA_F4 0x10001L
 
 #define RSA_METHOD_FLAG_NO_CHECK       0x01 /* don't check pub/private match */
+
 #define RSA_FLAG_CACHE_PUBLIC          0x02
 #define RSA_FLAG_CACHE_PRIVATE         0x04
 #define RSA_FLAG_BLINDING              0x08
@@ -147,6 +151,9 @@ int RSA_flags(RSA *r);
 
 void RSA_set_default_method(RSA_METHOD *meth);
 
+/* This function needs the memory locking malloc callbacks to be installed */
+int RSA_memory_lock(RSA *r);
+
 /* If you have RSAref compiled in. */
 RSA_METHOD *RSA_PKCS1_RSAref(void);
 
@@ -193,19 +200,19 @@ void RSA_blinding_off(RSA *rsa);
 int RSA_padding_add_PKCS1_type_1(unsigned char *to,int tlen,
        unsigned char *f,int fl);
 int RSA_padding_check_PKCS1_type_1(unsigned char *to,int tlen,
-       unsigned char *f,int fl);
+       unsigned char *f,int fl,int rsa_len);
 int RSA_padding_add_PKCS1_type_2(unsigned char *to,int tlen,
        unsigned char *f,int fl);
 int RSA_padding_check_PKCS1_type_2(unsigned char *to,int tlen,
-       unsigned char *f,int fl);
+       unsigned char *f,int fl,int rsa_len);
 int RSA_padding_add_SSLv23(unsigned char *to,int tlen,
        unsigned char *f,int fl);
 int RSA_padding_check_SSLv23(unsigned char *to,int tlen,
-       unsigned char *f,int fl);
+       unsigned char *f,int fl,int rsa_len);
 int RSA_padding_add_none(unsigned char *to,int tlen,
        unsigned char *f,int fl);
 int RSA_padding_check_none(unsigned char *to,int tlen,
-       unsigned char *f,int fl);
+       unsigned char *f,int fl,int rsa_len);
 
 int RSA_get_ex_new_index(long argl, char *argp, int (*new_func)(),
        int (*dup_func)(), void (*free_func)());
@@ -227,6 +234,7 @@ void        RSA_free ();
 int    RSA_flags();
 
 void RSA_set_default_method();
+int RSA_memory_lock();
 
 /* RSA_METHOD *RSA_PKCS1_RSAref(); */
 RSA_METHOD *RSA_PKCS1_SSLeay();
@@ -274,26 +282,27 @@ char *RSA_get_ex_data();
 /* Error codes for the RSA functions. */
 
 /* Function codes. */
-#define RSA_F_RSA_EAY_PRIVATE_DECRYPT                   100
-#define RSA_F_RSA_EAY_PRIVATE_ENCRYPT                   101
-#define RSA_F_RSA_EAY_PUBLIC_DECRYPT                    102
-#define RSA_F_RSA_EAY_PUBLIC_ENCRYPT                    103
-#define RSA_F_RSA_GENERATE_KEY                          104
-#define RSA_F_RSA_NEW_METHOD                            105
-#define RSA_F_RSA_PADDING_ADD_NONE                      106
-#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1              107
-#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2              108
-#define RSA_F_RSA_PADDING_ADD_SSLV23                    109
-#define RSA_F_RSA_PADDING_CHECK_NONE                    110
-#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1            111
-#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2            112
-#define RSA_F_RSA_PADDING_CHECK_SSLV23                  113
-#define RSA_F_RSA_PRINT                                         114
-#define RSA_F_RSA_PRINT_FP                              115
-#define RSA_F_RSA_SIGN                                  116
-#define RSA_F_RSA_SIGN_ASN1_OCTET_STRING                117
-#define RSA_F_RSA_VERIFY                                118
-#define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING              119
+#define RSA_F_MEMORY_LOCK                               100
+#define RSA_F_RSA_EAY_PRIVATE_DECRYPT                   101
+#define RSA_F_RSA_EAY_PRIVATE_ENCRYPT                   102
+#define RSA_F_RSA_EAY_PUBLIC_DECRYPT                    103
+#define RSA_F_RSA_EAY_PUBLIC_ENCRYPT                    104
+#define RSA_F_RSA_GENERATE_KEY                          105
+#define RSA_F_RSA_NEW_METHOD                            106
+#define RSA_F_RSA_PADDING_ADD_NONE                      107
+#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1              108
+#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2              109
+#define RSA_F_RSA_PADDING_ADD_SSLV23                    110
+#define RSA_F_RSA_PADDING_CHECK_NONE                    111
+#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1            112
+#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2            113
+#define RSA_F_RSA_PADDING_CHECK_SSLV23                  114
+#define RSA_F_RSA_PRINT                                         115
+#define RSA_F_RSA_PRINT_FP                              116
+#define RSA_F_RSA_SIGN                                  117
+#define RSA_F_RSA_SIGN_ASN1_OCTET_STRING                118
+#define RSA_F_RSA_VERIFY                                119
+#define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING              120
 
 /* Reason codes. */
 #define RSA_R_ALGORITHM_MISMATCH                        100
index 00f8ea93414bd26e65ff9a0278c6d03a99a7dc20..7623189e41a3afbe52699085df5fe44153f853e0 100644 (file)
@@ -110,11 +110,13 @@ unsigned char *to;
 RSA *rsa;
 int padding;
        {
-       BIGNUM *f=NULL,*ret=NULL;
+       BIGNUM f,ret;
        int i,j,k,num=0,r= -1;
        unsigned char *buf=NULL;
        BN_CTX *ctx=NULL;
 
+       BN_init(&f);
+       BN_init(&ret);
        if ((ctx=BN_CTX_new()) == NULL) goto err;
        num=BN_num_bytes(rsa->n);
        if ((buf=(unsigned char *)Malloc(num)) == NULL)
@@ -140,9 +142,7 @@ int padding;
                }
        if (i <= 0) goto err;
 
-       if (((f=BN_new()) == NULL) || ((ret=BN_new()) == NULL)) goto err;
-
-       if (BN_bin2bn(buf,num,f) == NULL) goto err;
+       if (BN_bin2bn(buf,num,&f) == NULL) goto err;
        
        if ((rsa->method_mod_n == NULL) && (rsa->flags & RSA_FLAG_CACHE_PUBLIC))
                {
@@ -151,21 +151,21 @@ int padding;
                                rsa->n,ctx)) goto err;
                }
 
-       if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx,
+       if (!rsa->meth->bn_mod_exp(&ret,&f,rsa->e,rsa->n,ctx,
                rsa->method_mod_n)) goto err;
 
        /* put in leading 0 bytes if the number is less than the
         * length of the modulus */
-       j=BN_num_bytes(ret);
-       i=BN_bn2bin(ret,&(to[num-j]));
+       j=BN_num_bytes(&ret);
+       i=BN_bn2bin(&ret,&(to[num-j]));
        for (k=0; k<(num-i); k++)
                to[k]=0;
 
        r=num;
 err:
        if (ctx != NULL) BN_CTX_free(ctx);
-       if (f != NULL) BN_free(f);
-       if (ret != NULL) BN_free(ret);
+       BN_clear_free(&f);
+       BN_clear_free(&ret);
        if (buf != NULL) 
                {
                memset(buf,0,num);
@@ -181,11 +181,14 @@ unsigned char *to;
 RSA *rsa;
 int padding;
        {
-       BIGNUM *f=NULL,*ret=NULL;
+       BIGNUM f,ret;
        int i,j,k,num=0,r= -1;
        unsigned char *buf=NULL;
        BN_CTX *ctx=NULL;
 
+       BN_init(&f);
+       BN_init(&ret);
+
        if ((ctx=BN_CTX_new()) == NULL) goto err;
        num=BN_num_bytes(rsa->n);
        if ((buf=(unsigned char *)Malloc(num)) == NULL)
@@ -209,40 +212,39 @@ int padding;
                }
        if (i <= 0) goto err;
 
-       if (((f=BN_new()) == NULL) || ((ret=BN_new()) == NULL)) goto err;
-       if (BN_bin2bn(buf,num,f) == NULL) goto err;
+       if (BN_bin2bn(buf,num,&f) == NULL) goto err;
 
        if ((rsa->flags & RSA_FLAG_BLINDING) && (rsa->blinding == NULL))
                RSA_blinding_on(rsa,ctx);
        if (rsa->flags & RSA_FLAG_BLINDING)
-               if (!BN_BLINDING_convert(f,rsa->blinding,ctx)) goto err;
+               if (!BN_BLINDING_convert(&f,rsa->blinding,ctx)) goto err;
 
        if (    (rsa->p != NULL) &&
                (rsa->q != NULL) &&
                (rsa->dmp1 != NULL) &&
                (rsa->dmq1 != NULL) &&
                (rsa->iqmp != NULL))
-               { if (!rsa->meth->rsa_mod_exp(ret,f,rsa)) goto err; }
+               { if (!rsa->meth->rsa_mod_exp(&ret,&f,rsa)) goto err; }
        else
                {
-               if (!rsa->meth->bn_mod_exp(ret,f,rsa->d,rsa->n,ctx)) goto err;
+               if (!rsa->meth->bn_mod_exp(&ret,&f,rsa->d,rsa->n,ctx,NULL)) goto err;
                }
 
        if (rsa->flags & RSA_FLAG_BLINDING)
-               if (!BN_BLINDING_invert(ret,rsa->blinding,ctx)) goto err;
+               if (!BN_BLINDING_invert(&ret,rsa->blinding,ctx)) goto err;
 
        /* put in leading 0 bytes if the number is less than the
         * length of the modulus */
-       j=BN_num_bytes(ret);
-       i=BN_bn2bin(ret,&(to[num-j]));
+       j=BN_num_bytes(&ret);
+       i=BN_bn2bin(&ret,&(to[num-j]));
        for (k=0; k<(num-i); k++)
                to[k]=0;
 
        r=num;
 err:
        if (ctx != NULL) BN_CTX_free(ctx);
-       if (ret != NULL) BN_free(ret);
-       if (f != NULL) BN_free(f);
+       BN_clear_free(&ret);
+       BN_clear_free(&f);
        if (buf != NULL)
                {
                memset(buf,0,num);
@@ -258,12 +260,14 @@ unsigned char *to;
 RSA *rsa;
 int padding;
        {
-       BIGNUM *f=NULL,*ret=NULL;
+       BIGNUM f,ret;
        int j,num=0,r= -1;
        unsigned char *p;
        unsigned char *buf=NULL;
        BN_CTX *ctx=NULL;
 
+       BN_init(&f);
+       BN_init(&ret);
        ctx=BN_CTX_new();
        if (ctx == NULL) goto err;
 
@@ -284,13 +288,12 @@ int padding;
                }
 
        /* make data into a big number */
-       if (((ret=BN_new()) == NULL) || ((f=BN_new()) == NULL)) goto err;
-       if (BN_bin2bn(from,(int)flen,f) == NULL) goto err;
+       if (BN_bin2bn(from,(int)flen,&f) == NULL) goto err;
 
        if ((rsa->flags & RSA_FLAG_BLINDING) && (rsa->blinding == NULL))
                RSA_blinding_on(rsa,ctx);
        if (rsa->flags & RSA_FLAG_BLINDING)
-               if (!BN_BLINDING_convert(f,rsa->blinding,ctx)) goto err;
+               if (!BN_BLINDING_convert(&f,rsa->blinding,ctx)) goto err;
 
        /* do the decrypt */
        if (    (rsa->p != NULL) &&
@@ -298,29 +301,29 @@ int padding;
                (rsa->dmp1 != NULL) &&
                (rsa->dmq1 != NULL) &&
                (rsa->iqmp != NULL))
-               { if (!rsa->meth->rsa_mod_exp(ret,f,rsa)) goto err; }
+               { if (!rsa->meth->rsa_mod_exp(&ret,&f,rsa)) goto err; }
        else
                {
-               if (!rsa->meth->bn_mod_exp(ret,f,rsa->d,rsa->n,ctx))
+               if (!rsa->meth->bn_mod_exp(&ret,&f,rsa->d,rsa->n,ctx,NULL))
                        goto err;
                }
 
        if (rsa->flags & RSA_FLAG_BLINDING)
-               if (!BN_BLINDING_invert(ret,rsa->blinding,ctx)) goto err;
+               if (!BN_BLINDING_invert(&ret,rsa->blinding,ctx)) goto err;
 
        p=buf;
-       j=BN_bn2bin(ret,p); /* j is only used with no-padding mode */
+       j=BN_bn2bin(&ret,p); /* j is only used with no-padding mode */
 
        switch (padding)
                {
        case RSA_PKCS1_PADDING:
-               r=RSA_padding_check_PKCS1_type_2(to,num,buf,j);
+               r=RSA_padding_check_PKCS1_type_2(to,num,buf,j,num);
                break;
        case RSA_SSLV23_PADDING:
-               r=RSA_padding_check_SSLv23(to,num,buf,j);
+               r=RSA_padding_check_SSLv23(to,num,buf,j,num);
                break;
        case RSA_NO_PADDING:
-               r=RSA_padding_check_none(to,num,buf,j);
+               r=RSA_padding_check_none(to,num,buf,j,num);
                break;
        default:
                RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
@@ -331,8 +334,8 @@ int padding;
 
 err:
        if (ctx != NULL) BN_CTX_free(ctx);
-       if (f != NULL) BN_free(f);
-       if (ret != NULL) BN_free(ret);
+       BN_clear_free(&f);
+       BN_clear_free(&ret);
        if (buf != NULL)
                {
                memset(buf,0,num);
@@ -348,12 +351,14 @@ unsigned char *to;
 RSA *rsa;
 int padding;
        {
-       BIGNUM *f=NULL,*ret=NULL;
+       BIGNUM f,ret;
        int i,num=0,r= -1;
        unsigned char *p;
        unsigned char *buf=NULL;
        BN_CTX *ctx=NULL;
 
+       BN_init(&f);
+       BN_init(&ret);
        ctx=BN_CTX_new();
        if (ctx == NULL) goto err;
 
@@ -373,10 +378,7 @@ int padding;
                goto err;
                }
 
-       /* make data into a big number */
-       if (((ret=BN_new()) == NULL) || ((f=BN_new()) == NULL)) goto err;
-
-       if (BN_bin2bn(from,flen,f) == NULL) goto err;
+       if (BN_bin2bn(from,flen,&f) == NULL) goto err;
        /* do the decrypt */
        if ((rsa->method_mod_n == NULL) && (rsa->flags & RSA_FLAG_CACHE_PUBLIC))
                {
@@ -385,19 +387,19 @@ int padding;
                                rsa->n,ctx)) goto err;
                }
 
-       if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx,
+       if (!rsa->meth->bn_mod_exp(&ret,&f,rsa->e,rsa->n,ctx,
                rsa->method_mod_n)) goto err;
 
        p=buf;
-       i=BN_bn2bin(ret,p);
+       i=BN_bn2bin(&ret,p);
 
        switch (padding)
                {
        case RSA_PKCS1_PADDING:
-               r=RSA_padding_check_PKCS1_type_1(to,num,buf,i);
+               r=RSA_padding_check_PKCS1_type_1(to,num,buf,i,num);
                break;
        case RSA_NO_PADDING:
-               r=RSA_padding_check_none(to,num,buf,i);
+               r=RSA_padding_check_none(to,num,buf,i,num);
                break;
        default:
                RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
@@ -408,8 +410,8 @@ int padding;
 
 err:
        if (ctx != NULL) BN_CTX_free(ctx);
-       if (f != NULL) BN_free(f);
-       if (ret != NULL) BN_free(ret);
+       BN_clear_free(&f);
+       BN_clear_free(&ret);
        if (buf != NULL)
                {
                memset(buf,0,num);
@@ -423,14 +425,13 @@ BIGNUM *r0;
 BIGNUM *I;
 RSA *rsa;
        {
-       BIGNUM *r1=NULL,*m1=NULL;
+       BIGNUM r1,m1;
        int ret=0;
        BN_CTX *ctx;
 
        if ((ctx=BN_CTX_new()) == NULL) goto err;
-       m1=BN_new();
-       r1=BN_new();
-       if ((m1 == NULL) || (r1 == NULL)) goto err;
+       BN_init(&m1);
+       BN_init(&r1);
 
        if (rsa->flags & RSA_FLAG_CACHE_PRIVATE)
                {
@@ -452,26 +453,29 @@ RSA *rsa;
                        }
                }
 
-       if (!BN_mod(r1,I,rsa->q,ctx)) goto err;
-       if (!rsa->meth->bn_mod_exp(m1,r1,rsa->dmq1,rsa->q,ctx,
+       if (!BN_mod(&r1,I,rsa->q,ctx)) goto err;
+       if (!rsa->meth->bn_mod_exp(&m1,&r1,rsa->dmq1,rsa->q,ctx,
                rsa->method_mod_q)) goto err;
 
-       if (!BN_mod(r1,I,rsa->p,ctx)) goto err;
-       if (!rsa->meth->bn_mod_exp(r0,r1,rsa->dmp1,rsa->p,ctx,
+       if (!BN_mod(&r1,I,rsa->p,ctx)) goto err;
+       if (!rsa->meth->bn_mod_exp(r0,&r1,rsa->dmp1,rsa->p,ctx,
                rsa->method_mod_p)) goto err;
 
-       if (!BN_add(r1,r0,rsa->p)) goto err;
-       if (!BN_sub(r0,r1,m1)) goto err;
+       if (!BN_sub(r0,r0,&m1)) goto err;
+       /* This will help stop the size of r0 increasing, which does
+        * affect the multiply if it optimised for a power of 2 size */
+       if (r0->neg)
+               if (!BN_add(r0,r0,rsa->p)) goto err;
 
-       if (!BN_mul(r1,r0,rsa->iqmp)) goto err;
-       if (!BN_mod(r0,r1,rsa->p,ctx)) goto err;
-       if (!BN_mul(r1,r0,rsa->q)) goto err;
-       if (!BN_add(r0,r1,m1)) goto err;
+       if (!BN_mul(&r1,r0,rsa->iqmp,ctx)) goto err;
+       if (!BN_mod(r0,&r1,rsa->p,ctx)) goto err;
+       if (!BN_mul(&r1,r0,rsa->q,ctx)) goto err;
+       if (!BN_add(r0,&r1,&m1)) goto err;
 
        ret=1;
 err:
-       if (m1 != NULL) BN_free(m1);
-       if (r1 != NULL) BN_free(r1);
+       BN_clear_free(&m1);
+       BN_clear_free(&r1);
        BN_CTX_free(ctx);
        return(ret);
        }
index 796b3afd478e3530646ea581239a1f659a6c03aa..7899a5d4e21437ea9bd3c2252fcd579dc4f1bff8 100644 (file)
@@ -63,6 +63,7 @@
 #ifndef NO_ERR
 static ERR_STRING_DATA RSA_str_functs[]=
        {
+{ERR_PACK(0,RSA_F_MEMORY_LOCK,0),      "MEMORY_LOCK"},
 {ERR_PACK(0,RSA_F_RSA_EAY_PRIVATE_DECRYPT,0),  "RSA_EAY_PRIVATE_DECRYPT"},
 {ERR_PACK(0,RSA_F_RSA_EAY_PRIVATE_ENCRYPT,0),  "RSA_EAY_PRIVATE_ENCRYPT"},
 {ERR_PACK(0,RSA_F_RSA_EAY_PUBLIC_DECRYPT,0),   "RSA_EAY_PUBLIC_DECRYPT"},
@@ -117,8 +118,8 @@ void ERR_load_RSA_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_RSA,RSA_str_functs);
index aed2351cfbfdd94689267254713cc2a325a88703..936db495150ba252275928f733a305ff9210ab8f 100644 (file)
@@ -70,17 +70,17 @@ char *cb_arg;
        {
        RSA *rsa=NULL;
        BIGNUM *r0=NULL,*r1=NULL,*r2=NULL,*r3=NULL,*tmp;
-       int bitsp,bitsq,ok= -1,n=0;
+       int bitsp,bitsq,ok= -1,n=0,i;
        BN_CTX *ctx=NULL,*ctx2=NULL;
 
        ctx=BN_CTX_new();
        if (ctx == NULL) goto err;
        ctx2=BN_CTX_new();
        if (ctx2 == NULL) goto err;
-       r0=ctx->bn[0];
-       r1=ctx->bn[1];
-       r2=ctx->bn[2];
-       r3=ctx->bn[3];
+       r0= &(ctx->bn[0]);
+       r1= &(ctx->bn[1]);
+       r2= &(ctx->bn[2]);
+       r3= &(ctx->bn[3]);
        ctx->tos+=4;
 
        bitsp=(bits+1)/2;
@@ -91,12 +91,23 @@ char *cb_arg;
        /* set e */ 
        rsa->e=BN_new();
        if (rsa->e == NULL) goto err;
+
+#if 1
+       /* The problem is when building with 8, 16, or 32 BN_ULONG,
+        * unsigned long can be larger */
+       for (i=0; i<sizeof(unsigned long)*8; i++)
+               {
+               if (e_value & (1<<i))
+                       BN_set_bit(rsa->e,i);
+               }
+#else
        if (!BN_set_word(rsa->e,e_value)) goto err;
+#endif
 
        /* generate p and q */
        for (;;)
                {
-               rsa->p=BN_generate_prime(bitsp,0,NULL,NULL,callback,cb_arg);
+               rsa->p=BN_generate_prime(NULL,bitsp,0,NULL,NULL,callback,cb_arg);
                if (rsa->p == NULL) goto err;
                if (!BN_sub(r2,rsa->p,BN_value_one())) goto err;
                if (!BN_gcd(r1,r2,rsa->e,ctx)) goto err;
@@ -107,7 +118,7 @@ char *cb_arg;
        if (callback != NULL) callback(3,0,cb_arg);
        for (;;)
                {
-               rsa->q=BN_generate_prime(bitsq,0,NULL,NULL,callback,cb_arg);
+               rsa->q=BN_generate_prime(NULL,bitsq,0,NULL,NULL,callback,cb_arg);
                if (rsa->q == NULL) goto err;
                if (!BN_sub(r2,rsa->q,BN_value_one())) goto err;
                if (!BN_gcd(r1,r2,rsa->e,ctx)) goto err;
@@ -127,12 +138,12 @@ char *cb_arg;
        /* calculate n */
        rsa->n=BN_new();
        if (rsa->n == NULL) goto err;
-       if (!BN_mul(rsa->n,rsa->p,rsa->q)) goto err;
+       if (!BN_mul(rsa->n,rsa->p,rsa->q,ctx)) goto err;
 
        /* calculate d */
        if (!BN_sub(r1,rsa->p,BN_value_one())) goto err;        /* p-1 */
        if (!BN_sub(r2,rsa->q,BN_value_one())) goto err;        /* q-1 */
-       if (!BN_mul(r0,r1,r2)) goto err;        /* (p-1)(q-1) */
+       if (!BN_mul(r0,r1,r2,ctx)) goto err;    /* (p-1)(q-1) */
 
 /* should not be needed, since gcd(p-1,e) == 1 and gcd(q-1,e) == 1 */
 /*     for (;;)
@@ -149,7 +160,7 @@ char *cb_arg;
                goto err;
                }
 */
-       rsa->d=(BIGNUM *)BN_mod_inverse(rsa->e,r0,ctx2);        /* d */
+       rsa->d=(BIGNUM *)BN_mod_inverse(NULL,rsa->e,r0,ctx2);   /* d */
        if (rsa->d == NULL) goto err;
 
        /* calculate d mod (p-1) */
@@ -163,7 +174,7 @@ char *cb_arg;
        if (!BN_mod(rsa->dmq1,rsa->d,r2,ctx)) goto err;
 
        /* calculate inverse of q mod p */
-       rsa->iqmp=BN_mod_inverse(rsa->q,rsa->p,ctx2);
+       rsa->iqmp=BN_mod_inverse(NULL,rsa->q,rsa->p,ctx2);
        if (rsa->iqmp == NULL) goto err;
 
        ok=1;
index 95a56f8a28c8e8f38132c45e4802db7202b666f0..5ce51f9f56b5c4a3fa3d00cce7bc60d12b5e950b 100644 (file)
@@ -63,7 +63,7 @@
 #include "bn.h"
 #include "rsa.h"
 
-char *RSA_version="RSA part of SSLeay 0.9.0b 29-Jun-1998";
+char *RSA_version="RSA part of SSLeay 0.9.1a 06-Jul-1998";
 
 static RSA_METHOD *default_RSA_meth=NULL;
 static int rsa_meth_num=0;
@@ -120,13 +120,15 @@ RSA_METHOD *meth;
        ret->method_mod_p=NULL;
        ret->method_mod_q=NULL;
        ret->blinding=NULL;
+       ret->bignum_data=NULL;
        ret->flags=ret->meth->flags;
        if ((ret->meth->init != NULL) && !ret->meth->init(ret))
                {
                Free(ret);
                ret=NULL;
                }
-       CRYPTO_new_ex_data(rsa_meth,(char *)ret,&ret->ex_data);
+       else
+               CRYPTO_new_ex_data(rsa_meth,(char *)ret,&ret->ex_data);
        return(ret);
        }
 
@@ -164,6 +166,7 @@ RSA *r;
        if (r->dmq1 != NULL) BN_clear_free(r->dmq1);
        if (r->iqmp != NULL) BN_clear_free(r->iqmp);
        if (r->blinding != NULL) BN_BLINDING_free(r->blinding);
+       if (r->bignum_data != NULL) Free_locked(r->bignum_data);
        Free(r);
        }
 
@@ -275,10 +278,10 @@ BN_CTX *p_ctx;
        if (rsa->blinding != NULL)
                BN_BLINDING_free(rsa->blinding);
 
-       A=ctx->bn[0];
+       A= &(ctx->bn[0]);
        ctx->tos++;
        if (!BN_rand(A,BN_num_bits(rsa->n)-1,1,0)) goto err;
-       if ((Ai=BN_mod_inverse(A,rsa->n,ctx)) == NULL) goto err;
+       if ((Ai=BN_mod_inverse(NULL,A,rsa->n,ctx)) == NULL) goto err;
 
        if (!rsa->meth->bn_mod_exp(A,A,rsa->e,rsa->n,ctx,
                (char *)rsa->method_mod_n)) goto err;
@@ -292,3 +295,49 @@ err:
        return(ret);
        }
 
+int RSA_memory_lock(r)
+RSA *r;
+       {
+       int i,j,k,off;
+       char *p;
+       BIGNUM *bn,**t[6],*b;
+       BN_ULONG *ul;
+
+       if (r->d == NULL) return(1);
+       t[0]= &r->d;
+       t[1]= &r->p;
+       t[2]= &r->q;
+       t[3]= &r->dmp1;
+       t[4]= &r->dmq1;
+       t[5]= &r->iqmp;
+       k=sizeof(BIGNUM)*6;
+       off=k/sizeof(BN_ULONG)+1;
+       j=1;
+       for (i=0; i<6; i++)
+               j+= (*t[i])->top;
+       if ((p=Malloc_locked((off+j)*sizeof(BN_ULONG))) == NULL)
+               {
+               RSAerr(RSA_F_MEMORY_LOCK,ERR_R_MALLOC_FAILURE);
+               return(0);
+               }
+       bn=(BIGNUM *)p;
+       ul=(BN_ULONG *)&(p[off]);
+       for (i=0; i<6; i++)
+               {
+               b= *(t[i]);
+               *(t[i])= &(bn[i]);
+               memcpy((char *)&(bn[i]),(char *)b,sizeof(BIGNUM));
+               bn[i].flags=BN_FLG_STATIC_DATA;
+               bn[i].d=ul;
+               memcpy((char *)ul,b->d,sizeof(BN_ULONG)*b->top);
+               ul+=b->top;
+               BN_clear_free(b);
+               }
+       
+       /* I should fix this so it can still be done */
+       r->flags&= ~(RSA_FLAG_CACHE_PRIVATE|RSA_FLAG_CACHE_PUBLIC);
+
+       r->bignum_data=p;
+       return(1);
+       }
+
index f0dd9436571a3ea96fcf670642cd361449e1099e..6385b556be83ef3a678d202d610c430f909b2e9b 100644 (file)
@@ -79,11 +79,12 @@ int flen;
        return(1);
        }
 
-int RSA_padding_check_none(to,tlen,from,flen)
+int RSA_padding_check_none(to,tlen,from,flen,num)
 unsigned char *to;
 int tlen;
 unsigned char *from;
 int flen;
+int num;
        {
        int j;
 
@@ -93,7 +94,7 @@ int flen;
                RSAerr(RSA_F_RSA_PADDING_CHECK_NONE,RSA_R_DATA_TOO_LARGE);
                return(-1);
                }
-       if (*(from++) != 0)
+       if (flen+1 >= num)
                {
                RSAerr(RSA_F_RSA_PADDING_CHECK_NONE,RSA_R_BAD_ZERO_BYTE);
                return(-1);
index 2791291b948df9e36b2e053a0d663cb180b827a0..4638187970b18e19df900ad101225ff3f11dbed6 100644 (file)
@@ -103,17 +103,18 @@ int flen;
        return(1);
        }
 
-int RSA_padding_check_PKCS1_type_1(to,tlen,from,flen)
+int RSA_padding_check_PKCS1_type_1(to,tlen,from,flen,num)
 unsigned char *to;
 int tlen;
 unsigned char *from;
 int flen;
+int num;
        {
        int i,j;
        unsigned char *p;
 
        p=from;
-       if (*(p++) != 01)
+       if ((num != (flen+1)) || (*(p++) != 01))
                {
                RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1,RSA_R_BLOCK_TYPE_IS_NOT_01);
                return(-1);
@@ -192,21 +193,25 @@ int flen;
        return(1);
        }
 
-int RSA_padding_check_PKCS1_type_2(to,tlen,from,flen)
+int RSA_padding_check_PKCS1_type_2(to,tlen,from,flen,num)
 unsigned char *to;
 int tlen;
 unsigned char *from;
 int flen;
+int num;
        {
        int i,j;
        unsigned char *p;
 
        p=from;
-       if (*(p++) != 02)
+       if ((num != (flen+1)) || (*(p++) != 02))
                {
                RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2,RSA_R_BLOCK_TYPE_IS_NOT_02);
                return(-1);
                }
+#ifdef PKCS1_CHECK
+       return(num-11);
+#endif
 
        /* scan over padding data */
        j=flen-1; /* one for type. */
index 28c5571e74a9cc856aec0eeea82ca81bf4ffa523..e38911146af40f87510b07bb553d58cf232998db 100644 (file)
@@ -154,9 +154,11 @@ RSA *rsa;
 
        p=s;
        sig=d2i_X509_SIG(NULL,&p,(long)i);
+
        if (sig == NULL) goto err;
        sigtype=OBJ_obj2nid(sig->algor->algorithm);
 
+
 #ifdef RSA_DEBUG
        /* put a backward compatability flag in EAY */
        fprintf(stderr,"in(%s) expect(%s)\n",OBJ_nid2ln(sigtype),
index 9bcd4b2c03a6d8c034df4b33b7edf8adf819a858..42ee076800ec48c99048a3c7bd16e6f479ca029d 100644 (file)
@@ -103,11 +103,12 @@ int flen;
        return(1);
        }
 
-int RSA_padding_check_SSLv23(to,tlen,from,flen)
+int RSA_padding_check_SSLv23(to,tlen,from,flen,num)
 unsigned char *to;
 int tlen;
 unsigned char *from;
 int flen;
+int num;
        {
        int i,j,k;
        unsigned char *p;
@@ -118,7 +119,7 @@ int flen;
                RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_DATA_TOO_SMALL);
                return(-1);
                }
-       if (*(p++) != 02)
+       if ((num != (flen+1)) || (*(p++) != 02))
                {
                RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_BLOCK_TYPE_IS_NOT_02);
                return(-1);
index eeb545d140fc54235937a471507e08af2721112e..fd389b17d81c658df7ca054750fc76f468fffc59 100644 (file)
@@ -58,7 +58,7 @@ asm/sx86-out.o: asm/sx86unix.cpp
 
 # bsdi
 asm/sx86bsdi.o: asm/sx86unix.cpp
-       $(CPP) -DBSDI asm/sx86unix.cpp | as -o asm/sx86bsdi.o
+       $(CPP) -DBSDI asm/sx86unix.cpp | sed 's/ :/:/' | as -o asm/sx86bsdi.o
 
 asm/sx86unix.cpp:
        (cd asm; perl sha1-586.pl cpp >sx86unix.cpp)
diff --git a/crypto/sha/asm/a.out b/crypto/sha/asm/a.out
new file mode 100644 (file)
index 0000000..ca165d5
Binary files /dev/null and b/crypto/sha/asm/a.out differ
diff --git a/crypto/sha/asm/f b/crypto/sha/asm/f
new file mode 100644 (file)
index 0000000..3a702f5
--- /dev/null
@@ -0,0 +1,2089 @@
+GAS LISTING f.s                        page 1
+
+
+   1                           # Don't even think of reading this code 
+   2                           # It was automatically generated by sha1-586.pl 
+   3                           # Which is a perl program used to generate the x86 assember for 
+   4                           # any of elf, a.out, BSDI,Win32, or Solaris 
+   5                           # eric <eay@cryptsoft.com> 
+   6                   
+   7                           .file   "sha1-586.s"
+   8                           .version        "01.01"
+   9                   gcc2_compiled.:
+  10                   .text
+  11                           .align 16
+  12                   .globl sha1_block_x86
+  13                           .type   sha1_block_x86,@function
+  14                   sha1_block_x86:
+  15 0000 56                   pushl   %esi
+  16 0001 55                   pushl   %ebp
+  17 0002 8B442414             movl    20(%esp),       %eax
+  18 0006 8B742410             movl    16(%esp),       %esi
+  19 000a 01F0                 addl    %esi,           %eax
+  20 000c 8B6C240C             movl    12(%esp),       %ebp
+  21 0010 53                   pushl   %ebx
+  22 0011 83E840               subl    $64,            %eax
+  23 0014 57                   pushl   %edi
+  24 0015 8B5D04               movl    4(%ebp),        %ebx
+  25 0018 83EC48               subl    $72,            %esp
+  26 001b 8B550C               movl    12(%ebp),       %edx
+  27 001e 8B7D10               movl    16(%ebp),       %edi
+  28 0021 8B4D08               movl    8(%ebp),        %ecx
+  29 0024 89442444             movl    %eax,           68(%esp)
+  30                           # First we need to setup the X array 
+  31 0028 8B06                 movl    (%esi),         %eax
+  32                   .L000start:
+  33                           # First, load the words onto the stack in network byte order 
+  34 002a 0F           .byte 15
+  35 002b C8           .byte 200               # bswapl  %eax 
+  36 002c 890424               movl    %eax,           (%esp)
+  37 002f 8B4604               movl    4(%esi),        %eax
+  38 0032 0F           .byte 15
+  39 0033 C8           .byte 200               # bswapl  %eax 
+  40 0034 89442404             movl    %eax,           4(%esp)
+  41 0038 8B4608               movl    8(%esi),        %eax
+  42 003b 0F           .byte 15
+  43 003c C8           .byte 200               # bswapl  %eax 
+  44 003d 89442408             movl    %eax,           8(%esp)
+  45 0041 8B460C               movl    12(%esi),       %eax
+  46 0044 0F           .byte 15
+  47 0045 C8           .byte 200               # bswapl  %eax 
+  48 0046 8944240C             movl    %eax,           12(%esp)
+  49 004a 8B4610               movl    16(%esi),       %eax
+  50 004d 0F           .byte 15
+  51 004e C8           .byte 200               # bswapl  %eax 
+  52 004f 89442410             movl    %eax,           16(%esp)
+  53 0053 8B4614               movl    20(%esi),       %eax
+  54 0056 0F           .byte 15
+  55 0057 C8           .byte 200               # bswapl  %eax 
+  56 0058 89442414             movl    %eax,           20(%esp)
+  57 005c 8B4618               movl    24(%esi),       %eax
+\fGAS LISTING f.s                       page 2
+
+
+  58 005f 0F           .byte 15
+  59 0060 C8           .byte 200               # bswapl  %eax 
+  60 0061 89442418             movl    %eax,           24(%esp)
+  61 0065 8B461C               movl    28(%esi),       %eax
+  62 0068 0F           .byte 15
+  63 0069 C8           .byte 200               # bswapl  %eax 
+  64 006a 8944241C             movl    %eax,           28(%esp)
+  65 006e 8B4620               movl    32(%esi),       %eax
+  66 0071 0F           .byte 15
+  67 0072 C8           .byte 200               # bswapl  %eax 
+  68 0073 89442420             movl    %eax,           32(%esp)
+  69 0077 8B4624               movl    36(%esi),       %eax
+  70 007a 0F           .byte 15
+  71 007b C8           .byte 200               # bswapl  %eax 
+  72 007c 89442424             movl    %eax,           36(%esp)
+  73 0080 8B4628               movl    40(%esi),       %eax
+  74 0083 0F           .byte 15
+  75 0084 C8           .byte 200               # bswapl  %eax 
+  76 0085 89442428             movl    %eax,           40(%esp)
+  77 0089 8B462C               movl    44(%esi),       %eax
+  78 008c 0F           .byte 15
+  79 008d C8           .byte 200               # bswapl  %eax 
+  80 008e 8944242C             movl    %eax,           44(%esp)
+  81 0092 8B4630               movl    48(%esi),       %eax
+  82 0095 0F           .byte 15
+  83 0096 C8           .byte 200               # bswapl  %eax 
+  84 0097 89442430             movl    %eax,           48(%esp)
+  85 009b 8B4634               movl    52(%esi),       %eax
+  86 009e 0F           .byte 15
+  87 009f C8           .byte 200               # bswapl  %eax 
+  88 00a0 89442434             movl    %eax,           52(%esp)
+  89 00a4 8B4638               movl    56(%esi),       %eax
+  90 00a7 0F           .byte 15
+  91 00a8 C8           .byte 200               # bswapl  %eax 
+  92 00a9 89442438             movl    %eax,           56(%esp)
+  93 00ad 8B463C               movl    60(%esi),       %eax
+  94 00b0 0F           .byte 15
+  95 00b1 C8           .byte 200               # bswapl  %eax 
+  96 00b2 8944243C             movl    %eax,           60(%esp)
+  97                           # We now have the X array on the stack 
+  98                           # starting at sp-4 
+  99 00b6 89742440             movl    %esi,           64(%esp)
+ 100                   
+ 101                           # Start processing 
+ 102 00ba 8B4500               movl    (%ebp),         %eax
+ 103                           # 00_15 0 
+ 104 00bd 89CE                 movl    %ecx,           %esi
+ 105 00bf 89C5                 movl    %eax,           %ebp
+ 106 00c1 31D6                 xorl    %edx,           %esi
+ 107 00c3 C1C505               roll    $5,             %ebp
+ 108 00c6 21DE                 andl    %ebx,           %esi
+ 109 00c8 01FD                 addl    %edi,           %ebp
+ 110 00ca D1           .byte 209
+ 111 00cb CB           .byte 203               # rorl $1 %ebx 
+ 112 00cc 8B3C24               movl    (%esp),         %edi
+ 113 00cf D1           .byte 209
+ 114 00d0 CB           .byte 203               # rorl $1 %ebx 
+\fGAS LISTING f.s                       page 3
+
+
+ 115 00d1 31D6                 xorl    %edx,           %esi
+ 116 00d3 8DAC3D99             leal    1518500249(%ebp,%edi,1),%ebp
+ 116      79825A
+ 117 00da 89DF                 movl    %ebx,           %edi
+ 118 00dc 01EE                 addl    %ebp,           %esi
+ 119 00de 31CF                 xorl    %ecx,           %edi
+ 120 00e0 89F5                 movl    %esi,           %ebp
+ 121 00e2 21C7                 andl    %eax,           %edi
+ 122 00e4 C1C505               roll    $5,             %ebp
+ 123 00e7 01D5                 addl    %edx,           %ebp
+ 124 00e9 8B542404             movl    4(%esp),        %edx
+ 125 00ed D1           .byte 209
+ 126 00ee C8           .byte 200               # rorl $1 %eax 
+ 127 00ef 31CF                 xorl    %ecx,           %edi
+ 128 00f1 D1           .byte 209
+ 129 00f2 C8           .byte 200               # rorl $1 %eax 
+ 130 00f3 8DAC1599             leal    1518500249(%ebp,%edx,1),%ebp
+ 130      79825A
+ 131 00fa 01EF                 addl    %ebp,           %edi
+ 132                           # 00_15 2 
+ 133 00fc 89C2                 movl    %eax,           %edx
+ 134 00fe 89FD                 movl    %edi,           %ebp
+ 135 0100 31DA                 xorl    %ebx,           %edx
+ 136 0102 C1C505               roll    $5,             %ebp
+ 137 0105 21F2                 andl    %esi,           %edx
+ 138 0107 01CD                 addl    %ecx,           %ebp
+ 139 0109 D1           .byte 209
+ 140 010a CE           .byte 206               # rorl $1 %esi 
+ 141 010b 8B4C2408             movl    8(%esp),        %ecx
+ 142 010f D1           .byte 209
+ 143 0110 CE           .byte 206               # rorl $1 %esi 
+ 144 0111 31DA                 xorl    %ebx,           %edx
+ 145 0113 8DAC0D99             leal    1518500249(%ebp,%ecx,1),%ebp
+ 145      79825A
+ 146 011a 89F1                 movl    %esi,           %ecx
+ 147 011c 01EA                 addl    %ebp,           %edx
+ 148 011e 31C1                 xorl    %eax,           %ecx
+ 149 0120 89D5                 movl    %edx,           %ebp
+ 150 0122 21F9                 andl    %edi,           %ecx
+ 151 0124 C1C505               roll    $5,             %ebp
+ 152 0127 01DD                 addl    %ebx,           %ebp
+ 153 0129 8B5C240C             movl    12(%esp),       %ebx
+ 154 012d D1           .byte 209
+ 155 012e CF           .byte 207               # rorl $1 %edi 
+ 156 012f 31C1                 xorl    %eax,           %ecx
+ 157 0131 D1           .byte 209
+ 158 0132 CF           .byte 207               # rorl $1 %edi 
+ 159 0133 8DAC1D99             leal    1518500249(%ebp,%ebx,1),%ebp
+ 159      79825A
+ 160 013a 01E9                 addl    %ebp,           %ecx
+ 161                           # 00_15 4 
+ 162 013c 89FB                 movl    %edi,           %ebx
+ 163 013e 89CD                 movl    %ecx,           %ebp
+ 164 0140 31F3                 xorl    %esi,           %ebx
+ 165 0142 C1C505               roll    $5,             %ebp
+ 166 0145 21D3                 andl    %edx,           %ebx
+ 167 0147 01C5                 addl    %eax,           %ebp
+\fGAS LISTING f.s                       page 4
+
+
+ 168 0149 D1           .byte 209
+ 169 014a CA           .byte 202               # rorl $1 %edx 
+ 170 014b 8B442410             movl    16(%esp),       %eax
+ 171 014f D1           .byte 209
+ 172 0150 CA           .byte 202               # rorl $1 %edx 
+ 173 0151 31F3                 xorl    %esi,           %ebx
+ 174 0153 8DAC0599             leal    1518500249(%ebp,%eax,1),%ebp
+ 174      79825A
+ 175 015a 89D0                 movl    %edx,           %eax
+ 176 015c 01EB                 addl    %ebp,           %ebx
+ 177 015e 31F8                 xorl    %edi,           %eax
+ 178 0160 89DD                 movl    %ebx,           %ebp
+ 179 0162 21C8                 andl    %ecx,           %eax
+ 180 0164 C1C505               roll    $5,             %ebp
+ 181 0167 01F5                 addl    %esi,           %ebp
+ 182 0169 8B742414             movl    20(%esp),       %esi
+ 183 016d D1           .byte 209
+ 184 016e C9           .byte 201               # rorl $1 %ecx 
+ 185 016f 31F8                 xorl    %edi,           %eax
+ 186 0171 D1           .byte 209
+ 187 0172 C9           .byte 201               # rorl $1 %ecx 
+ 188 0173 8DAC3599             leal    1518500249(%ebp,%esi,1),%ebp
+ 188      79825A
+ 189 017a 01E8                 addl    %ebp,           %eax
+ 190                           # 00_15 6 
+ 191 017c 89CE                 movl    %ecx,           %esi
+ 192 017e 89C5                 movl    %eax,           %ebp
+ 193 0180 31D6                 xorl    %edx,           %esi
+ 194 0182 C1C505               roll    $5,             %ebp
+ 195 0185 21DE                 andl    %ebx,           %esi
+ 196 0187 01FD                 addl    %edi,           %ebp
+ 197 0189 D1           .byte 209
+ 198 018a CB           .byte 203               # rorl $1 %ebx 
+ 199 018b 8B7C2418             movl    24(%esp),       %edi
+ 200 018f D1           .byte 209
+ 201 0190 CB           .byte 203               # rorl $1 %ebx 
+ 202 0191 31D6                 xorl    %edx,           %esi
+ 203 0193 8DAC3D99             leal    1518500249(%ebp,%edi,1),%ebp
+ 203      79825A
+ 204 019a 89DF                 movl    %ebx,           %edi
+ 205 019c 01EE                 addl    %ebp,           %esi
+ 206 019e 31CF                 xorl    %ecx,           %edi
+ 207 01a0 89F5                 movl    %esi,           %ebp
+ 208 01a2 21C7                 andl    %eax,           %edi
+ 209 01a4 C1C505               roll    $5,             %ebp
+ 210 01a7 01D5                 addl    %edx,           %ebp
+ 211 01a9 8B54241C             movl    28(%esp),       %edx
+ 212 01ad D1           .byte 209
+ 213 01ae C8           .byte 200               # rorl $1 %eax 
+ 214 01af 31CF                 xorl    %ecx,           %edi
+ 215 01b1 D1           .byte 209
+ 216 01b2 C8           .byte 200               # rorl $1 %eax 
+ 217 01b3 8DAC1599             leal    1518500249(%ebp,%edx,1),%ebp
+ 217      79825A
+ 218 01ba 01EF                 addl    %ebp,           %edi
+ 219                           # 00_15 8 
+ 220 01bc 89C2                 movl    %eax,           %edx
+\fGAS LISTING f.s                       page 5
+
+
+ 221 01be 89FD                 movl    %edi,           %ebp
+ 222 01c0 31DA                 xorl    %ebx,           %edx
+ 223 01c2 C1C505               roll    $5,             %ebp
+ 224 01c5 21F2                 andl    %esi,           %edx
+ 225 01c7 01CD                 addl    %ecx,           %ebp
+ 226 01c9 D1           .byte 209
+ 227 01ca CE           .byte 206               # rorl $1 %esi 
+ 228 01cb 8B4C2420             movl    32(%esp),       %ecx
+ 229 01cf D1           .byte 209
+ 230 01d0 CE           .byte 206               # rorl $1 %esi 
+ 231 01d1 31DA                 xorl    %ebx,           %edx
+ 232 01d3 8DAC0D99             leal    1518500249(%ebp,%ecx,1),%ebp
+ 232      79825A
+ 233 01da 89F1                 movl    %esi,           %ecx
+ 234 01dc 01EA                 addl    %ebp,           %edx
+ 235 01de 31C1                 xorl    %eax,           %ecx
+ 236 01e0 89D5                 movl    %edx,           %ebp
+ 237 01e2 21F9                 andl    %edi,           %ecx
+ 238 01e4 C1C505               roll    $5,             %ebp
+ 239 01e7 01DD                 addl    %ebx,           %ebp
+ 240 01e9 8B5C2424             movl    36(%esp),       %ebx
+ 241 01ed D1           .byte 209
+ 242 01ee CF           .byte 207               # rorl $1 %edi 
+ 243 01ef 31C1                 xorl    %eax,           %ecx
+ 244 01f1 D1           .byte 209
+ 245 01f2 CF           .byte 207               # rorl $1 %edi 
+ 246 01f3 8DAC1D99             leal    1518500249(%ebp,%ebx,1),%ebp
+ 246      79825A
+ 247 01fa 01E9                 addl    %ebp,           %ecx
+ 248                           # 00_15 10 
+ 249 01fc 89FB                 movl    %edi,           %ebx
+ 250 01fe 89CD                 movl    %ecx,           %ebp
+ 251 0200 31F3                 xorl    %esi,           %ebx
+ 252 0202 C1C505               roll    $5,             %ebp
+ 253 0205 21D3                 andl    %edx,           %ebx
+ 254 0207 01C5                 addl    %eax,           %ebp
+ 255 0209 D1           .byte 209
+ 256 020a CA           .byte 202               # rorl $1 %edx 
+ 257 020b 8B442428             movl    40(%esp),       %eax
+ 258 020f D1           .byte 209
+ 259 0210 CA           .byte 202               # rorl $1 %edx 
+ 260 0211 31F3                 xorl    %esi,           %ebx
+ 261 0213 8DAC0599             leal    1518500249(%ebp,%eax,1),%ebp
+ 261      79825A
+ 262 021a 89D0                 movl    %edx,           %eax
+ 263 021c 01EB                 addl    %ebp,           %ebx
+ 264 021e 31F8                 xorl    %edi,           %eax
+ 265 0220 89DD                 movl    %ebx,           %ebp
+ 266 0222 21C8                 andl    %ecx,           %eax
+ 267 0224 C1C505               roll    $5,             %ebp
+ 268 0227 01F5                 addl    %esi,           %ebp
+ 269 0229 8B74242C             movl    44(%esp),       %esi
+ 270 022d D1           .byte 209
+ 271 022e C9           .byte 201               # rorl $1 %ecx 
+ 272 022f 31F8                 xorl    %edi,           %eax
+ 273 0231 D1           .byte 209
+ 274 0232 C9           .byte 201               # rorl $1 %ecx 
+\fGAS LISTING f.s                       page 6
+
+
+ 275 0233 8DAC3599             leal    1518500249(%ebp,%esi,1),%ebp
+ 275      79825A
+ 276 023a 01E8                 addl    %ebp,           %eax
+ 277                           # 00_15 12 
+ 278 023c 89CE                 movl    %ecx,           %esi
+ 279 023e 89C5                 movl    %eax,           %ebp
+ 280 0240 31D6                 xorl    %edx,           %esi
+ 281 0242 C1C505               roll    $5,             %ebp
+ 282 0245 21DE                 andl    %ebx,           %esi
+ 283 0247 01FD                 addl    %edi,           %ebp
+ 284 0249 D1           .byte 209
+ 285 024a CB           .byte 203               # rorl $1 %ebx 
+ 286 024b 8B7C2430             movl    48(%esp),       %edi
+ 287 024f D1           .byte 209
+ 288 0250 CB           .byte 203               # rorl $1 %ebx 
+ 289 0251 31D6                 xorl    %edx,           %esi
+ 290 0253 8DAC3D99             leal    1518500249(%ebp,%edi,1),%ebp
+ 290      79825A
+ 291 025a 89DF                 movl    %ebx,           %edi
+ 292 025c 01EE                 addl    %ebp,           %esi
+ 293 025e 31CF                 xorl    %ecx,           %edi
+ 294 0260 89F5                 movl    %esi,           %ebp
+ 295 0262 21C7                 andl    %eax,           %edi
+ 296 0264 C1C505               roll    $5,             %ebp
+ 297 0267 01D5                 addl    %edx,           %ebp
+ 298 0269 8B542434             movl    52(%esp),       %edx
+ 299 026d D1           .byte 209
+ 300 026e C8           .byte 200               # rorl $1 %eax 
+ 301 026f 31CF                 xorl    %ecx,           %edi
+ 302 0271 D1           .byte 209
+ 303 0272 C8           .byte 200               # rorl $1 %eax 
+ 304 0273 8DAC1599             leal    1518500249(%ebp,%edx,1),%ebp
+ 304      79825A
+ 305 027a 01EF                 addl    %ebp,           %edi
+ 306                           # 00_15 14 
+ 307 027c 89C2                 movl    %eax,           %edx
+ 308 027e 89FD                 movl    %edi,           %ebp
+ 309 0280 31DA                 xorl    %ebx,           %edx
+ 310 0282 C1C505               roll    $5,             %ebp
+ 311 0285 21F2                 andl    %esi,           %edx
+ 312 0287 01CD                 addl    %ecx,           %ebp
+ 313 0289 D1           .byte 209
+ 314 028a CE           .byte 206               # rorl $1 %esi 
+ 315 028b 8B4C2438             movl    56(%esp),       %ecx
+ 316 028f D1           .byte 209
+ 317 0290 CE           .byte 206               # rorl $1 %esi 
+ 318 0291 31DA                 xorl    %ebx,           %edx
+ 319 0293 8DAC0D99             leal    1518500249(%ebp,%ecx,1),%ebp
+ 319      79825A
+ 320 029a 89F1                 movl    %esi,           %ecx
+ 321 029c 01EA                 addl    %ebp,           %edx
+ 322 029e 31C1                 xorl    %eax,           %ecx
+ 323 02a0 89D5                 movl    %edx,           %ebp
+ 324 02a2 21F9                 andl    %edi,           %ecx
+ 325 02a4 C1C505               roll    $5,             %ebp
+ 326 02a7 01DD                 addl    %ebx,           %ebp
+ 327 02a9 8B5C243C             movl    60(%esp),       %ebx
+\fGAS LISTING f.s                       page 7
+
+
+ 328 02ad D1           .byte 209
+ 329 02ae CF           .byte 207               # rorl $1 %edi 
+ 330 02af 31C1                 xorl    %eax,           %ecx
+ 331 02b1 D1           .byte 209
+ 332 02b2 CF           .byte 207               # rorl $1 %edi 
+ 333 02b3 8DAC1D99             leal    1518500249(%ebp,%ebx,1),%ebp
+ 333      79825A
+ 334 02ba 01E9                 addl    %ebp,           %ecx
+ 335                           # 16_19 16 
+ 336 02bc 90                   nop
+ 337 02bd 8B2C24               movl    (%esp),         %ebp
+ 338 02c0 8B5C2408             movl    8(%esp),        %ebx
+ 339 02c4 31EB                 xorl    %ebp,           %ebx
+ 340 02c6 8B6C2420             movl    32(%esp),       %ebp
+ 341 02ca 31EB                 xorl    %ebp,           %ebx
+ 342 02cc 8B6C2434             movl    52(%esp),       %ebp
+ 343 02d0 31EB                 xorl    %ebp,           %ebx
+ 344 02d2 89FD                 movl    %edi,           %ebp
+ 345 02d4 D1           .byte 209
+ 346 02d5 C3           .byte 195               # roll $1 %ebx 
+ 347 02d6 31F5                 xorl    %esi,           %ebp
+ 348 02d8 891C24               movl    %ebx,           (%esp)
+ 349 02db 21D5                 andl    %edx,           %ebp
+ 350 02dd 8D9C0399             leal    1518500249(%ebx,%eax,1),%ebx
+ 350      79825A
+ 351 02e4 31F5                 xorl    %esi,           %ebp
+ 352 02e6 89C8                 movl    %ecx,           %eax
+ 353 02e8 01EB                 addl    %ebp,           %ebx
+ 354 02ea C1C005               roll    $5,             %eax
+ 355 02ed D1           .byte 209
+ 356 02ee CA           .byte 202               # rorl $1 %edx 
+ 357 02ef 01C3                 addl    %eax,           %ebx
+ 358 02f1 8B442404             movl    4(%esp),        %eax
+ 359 02f5 8B6C240C             movl    12(%esp),       %ebp
+ 360 02f9 31E8                 xorl    %ebp,           %eax
+ 361 02fb 8B6C2424             movl    36(%esp),       %ebp
+ 362 02ff 31E8                 xorl    %ebp,           %eax
+ 363 0301 8B6C2438             movl    56(%esp),       %ebp
+ 364 0305 D1           .byte 209
+ 365 0306 CA           .byte 202               # rorl $1 %edx 
+ 366 0307 31E8                 xorl    %ebp,           %eax
+ 367 0309 D1           .byte 209
+ 368 030a C0           .byte 192               # roll $1 %eax 
+ 369 030b 89D5                 movl    %edx,           %ebp
+ 370 030d 31FD                 xorl    %edi,           %ebp
+ 371 030f 89442404             movl    %eax,           4(%esp)
+ 372 0313 21CD                 andl    %ecx,           %ebp
+ 373 0315 8D843099             leal    1518500249(%eax,%esi,1),%eax
+ 373      79825A
+ 374 031c 31FD                 xorl    %edi,           %ebp
+ 375 031e 89DE                 movl    %ebx,           %esi
+ 376 0320 C1C605               roll    $5,             %esi
+ 377 0323 D1           .byte 209
+ 378 0324 C9           .byte 201               # rorl $1 %ecx 
+ 379 0325 01F0                 addl    %esi,           %eax
+ 380 0327 D1           .byte 209
+ 381 0328 C9           .byte 201               # rorl $1 %ecx 
+\fGAS LISTING f.s                       page 8
+
+
+ 382 0329 01E8                 addl    %ebp,           %eax
+ 383                           # 16_19 18 
+ 384 032b 8B6C2408             movl    8(%esp),        %ebp
+ 385 032f 8B742410             movl    16(%esp),       %esi
+ 386 0333 31EE                 xorl    %ebp,           %esi
+ 387 0335 8B6C2428             movl    40(%esp),       %ebp
+ 388 0339 31EE                 xorl    %ebp,           %esi
+ 389 033b 8B6C243C             movl    60(%esp),       %ebp
+ 390 033f 31EE                 xorl    %ebp,           %esi
+ 391 0341 89CD                 movl    %ecx,           %ebp
+ 392 0343 D1           .byte 209
+ 393 0344 C6           .byte 198               # roll $1 %esi 
+ 394 0345 31D5                 xorl    %edx,           %ebp
+ 395 0347 89742408             movl    %esi,           8(%esp)
+ 396 034b 21DD                 andl    %ebx,           %ebp
+ 397 034d 8DB43E99             leal    1518500249(%esi,%edi,1),%esi
+ 397      79825A
+ 398 0354 31D5                 xorl    %edx,           %ebp
+ 399 0356 89C7                 movl    %eax,           %edi
+ 400 0358 01EE                 addl    %ebp,           %esi
+ 401 035a C1C705               roll    $5,             %edi
+ 402 035d D1           .byte 209
+ 403 035e CB           .byte 203               # rorl $1 %ebx 
+ 404 035f 01FE                 addl    %edi,           %esi
+ 405 0361 8B7C240C             movl    12(%esp),       %edi
+ 406 0365 8B6C2414             movl    20(%esp),       %ebp
+ 407 0369 31EF                 xorl    %ebp,           %edi
+ 408 036b 8B6C242C             movl    44(%esp),       %ebp
+ 409 036f 31EF                 xorl    %ebp,           %edi
+ 410 0371 8B2C24               movl    (%esp),         %ebp
+ 411 0374 D1           .byte 209
+ 412 0375 CB           .byte 203               # rorl $1 %ebx 
+ 413 0376 31EF                 xorl    %ebp,           %edi
+ 414 0378 D1           .byte 209
+ 415 0379 C7           .byte 199               # roll $1 %edi 
+ 416 037a 89DD                 movl    %ebx,           %ebp
+ 417 037c 31CD                 xorl    %ecx,           %ebp
+ 418 037e 897C240C             movl    %edi,           12(%esp)
+ 419 0382 21C5                 andl    %eax,           %ebp
+ 420 0384 8DBC1799             leal    1518500249(%edi,%edx,1),%edi
+ 420      79825A
+ 421 038b 31CD                 xorl    %ecx,           %ebp
+ 422 038d 89F2                 movl    %esi,           %edx
+ 423 038f C1C205               roll    $5,             %edx
+ 424 0392 D1           .byte 209
+ 425 0393 C8           .byte 200               # rorl $1 %eax 
+ 426 0394 01D7                 addl    %edx,           %edi
+ 427 0396 D1           .byte 209
+ 428 0397 C8           .byte 200               # rorl $1 %eax 
+ 429 0398 01EF                 addl    %ebp,           %edi
+ 430                           # 20_39 20 
+ 431 039a 8B542410             movl    16(%esp),       %edx
+ 432 039e 8B6C2418             movl    24(%esp),       %ebp
+ 433 03a2 31EA                 xorl    %ebp,           %edx
+ 434 03a4 8B6C2430             movl    48(%esp),       %ebp
+ 435 03a8 31EA                 xorl    %ebp,           %edx
+ 436 03aa 8B6C2404             movl    4(%esp),        %ebp
+\fGAS LISTING f.s                       page 9
+
+
+ 437 03ae 31EA                 xorl    %ebp,           %edx
+ 438 03b0 89F5                 movl    %esi,           %ebp
+ 439 03b2 D1           .byte 209
+ 440 03b3 C2           .byte 194               # roll $1 %edx 
+ 441 03b4 31C5                 xorl    %eax,           %ebp
+ 442 03b6 89542410             movl    %edx,           16(%esp)
+ 443 03ba 31DD                 xorl    %ebx,           %ebp
+ 444 03bc 8D940AA1             leal    1859775393(%edx,%ecx,1),%edx
+ 444      EBD96E
+ 445 03c3 89F9                 movl    %edi,           %ecx
+ 446 03c5 C1C105               roll    $5,             %ecx
+ 447 03c8 D1           .byte 209
+ 448 03c9 CE           .byte 206               # rorl $1 %esi 
+ 449 03ca 01E9                 addl    %ebp,           %ecx
+ 450 03cc D1           .byte 209
+ 451 03cd CE           .byte 206               # rorl $1 %esi 
+ 452 03ce 01CA                 addl    %ecx,           %edx
+ 453                           # 20_39 21 
+ 454 03d0 8B4C2414             movl    20(%esp),       %ecx
+ 455 03d4 8B6C241C             movl    28(%esp),       %ebp
+ 456 03d8 31E9                 xorl    %ebp,           %ecx
+ 457 03da 8B6C2434             movl    52(%esp),       %ebp
+ 458 03de 31E9                 xorl    %ebp,           %ecx
+ 459 03e0 8B6C2408             movl    8(%esp),        %ebp
+ 460 03e4 31E9                 xorl    %ebp,           %ecx
+ 461 03e6 89FD                 movl    %edi,           %ebp
+ 462 03e8 D1           .byte 209
+ 463 03e9 C1           .byte 193               # roll $1 %ecx 
+ 464 03ea 31F5                 xorl    %esi,           %ebp
+ 465 03ec 894C2414             movl    %ecx,           20(%esp)
+ 466 03f0 31C5                 xorl    %eax,           %ebp
+ 467 03f2 8D8C19A1             leal    1859775393(%ecx,%ebx,1),%ecx
+ 467      EBD96E
+ 468 03f9 89D3                 movl    %edx,           %ebx
+ 469 03fb C1C305               roll    $5,             %ebx
+ 470 03fe D1           .byte 209
+ 471 03ff CF           .byte 207               # rorl $1 %edi 
+ 472 0400 01EB                 addl    %ebp,           %ebx
+ 473 0402 D1           .byte 209
+ 474 0403 CF           .byte 207               # rorl $1 %edi 
+ 475 0404 01D9                 addl    %ebx,           %ecx
+ 476                           # 20_39 22 
+ 477 0406 8B5C2418             movl    24(%esp),       %ebx
+ 478 040a 8B6C2420             movl    32(%esp),       %ebp
+ 479 040e 31EB                 xorl    %ebp,           %ebx
+ 480 0410 8B6C2438             movl    56(%esp),       %ebp
+ 481 0414 31EB                 xorl    %ebp,           %ebx
+ 482 0416 8B6C240C             movl    12(%esp),       %ebp
+ 483 041a 31EB                 xorl    %ebp,           %ebx
+ 484 041c 89D5                 movl    %edx,           %ebp
+ 485 041e D1           .byte 209
+ 486 041f C3           .byte 195               # roll $1 %ebx 
+ 487 0420 31FD                 xorl    %edi,           %ebp
+ 488 0422 895C2418             movl    %ebx,           24(%esp)
+ 489 0426 31F5                 xorl    %esi,           %ebp
+ 490 0428 8D9C03A1             leal    1859775393(%ebx,%eax,1),%ebx
+ 490      EBD96E
+\fGAS LISTING f.s                       page 10
+
+
+ 491 042f 89C8                 movl    %ecx,           %eax
+ 492 0431 C1C005               roll    $5,             %eax
+ 493 0434 D1           .byte 209
+ 494 0435 CA           .byte 202               # rorl $1 %edx 
+ 495 0436 01E8                 addl    %ebp,           %eax
+ 496 0438 D1           .byte 209
+ 497 0439 CA           .byte 202               # rorl $1 %edx 
+ 498 043a 01C3                 addl    %eax,           %ebx
+ 499                           # 20_39 23 
+ 500 043c 8B44241C             movl    28(%esp),       %eax
+ 501 0440 8B6C2424             movl    36(%esp),       %ebp
+ 502 0444 31E8                 xorl    %ebp,           %eax
+ 503 0446 8B6C243C             movl    60(%esp),       %ebp
+ 504 044a 31E8                 xorl    %ebp,           %eax
+ 505 044c 8B6C2410             movl    16(%esp),       %ebp
+ 506 0450 31E8                 xorl    %ebp,           %eax
+ 507 0452 89CD                 movl    %ecx,           %ebp
+ 508 0454 D1           .byte 209
+ 509 0455 C0           .byte 192               # roll $1 %eax 
+ 510 0456 31D5                 xorl    %edx,           %ebp
+ 511 0458 8944241C             movl    %eax,           28(%esp)
+ 512 045c 31FD                 xorl    %edi,           %ebp
+ 513 045e 8D8430A1             leal    1859775393(%eax,%esi,1),%eax
+ 513      EBD96E
+ 514 0465 89DE                 movl    %ebx,           %esi
+ 515 0467 C1C605               roll    $5,             %esi
+ 516 046a D1           .byte 209
+ 517 046b C9           .byte 201               # rorl $1 %ecx 
+ 518 046c 01EE                 addl    %ebp,           %esi
+ 519 046e D1           .byte 209
+ 520 046f C9           .byte 201               # rorl $1 %ecx 
+ 521 0470 01F0                 addl    %esi,           %eax
+ 522                           # 20_39 24 
+ 523 0472 8B742420             movl    32(%esp),       %esi
+ 524 0476 8B6C2428             movl    40(%esp),       %ebp
+ 525 047a 31EE                 xorl    %ebp,           %esi
+ 526 047c 8B2C24               movl    (%esp),         %ebp
+ 527 047f 31EE                 xorl    %ebp,           %esi
+ 528 0481 8B6C2414             movl    20(%esp),       %ebp
+ 529 0485 31EE                 xorl    %ebp,           %esi
+ 530 0487 89DD                 movl    %ebx,           %ebp
+ 531 0489 D1           .byte 209
+ 532 048a C6           .byte 198               # roll $1 %esi 
+ 533 048b 31CD                 xorl    %ecx,           %ebp
+ 534 048d 89742420             movl    %esi,           32(%esp)
+ 535 0491 31D5                 xorl    %edx,           %ebp
+ 536 0493 8DB43EA1             leal    1859775393(%esi,%edi,1),%esi
+ 536      EBD96E
+ 537 049a 89C7                 movl    %eax,           %edi
+ 538 049c C1C705               roll    $5,             %edi
+ 539 049f D1           .byte 209
+ 540 04a0 CB           .byte 203               # rorl $1 %ebx 
+ 541 04a1 01EF                 addl    %ebp,           %edi
+ 542 04a3 D1           .byte 209
+ 543 04a4 CB           .byte 203               # rorl $1 %ebx 
+ 544 04a5 01FE                 addl    %edi,           %esi
+ 545                           # 20_39 25 
+\fGAS LISTING f.s                       page 11
+
+
+ 546 04a7 8B7C2424             movl    36(%esp),       %edi
+ 547 04ab 8B6C242C             movl    44(%esp),       %ebp
+ 548 04af 31EF                 xorl    %ebp,           %edi
+ 549 04b1 8B6C2404             movl    4(%esp),        %ebp
+ 550 04b5 31EF                 xorl    %ebp,           %edi
+ 551 04b7 8B6C2418             movl    24(%esp),       %ebp
+ 552 04bb 31EF                 xorl    %ebp,           %edi
+ 553 04bd 89C5                 movl    %eax,           %ebp
+ 554 04bf D1           .byte 209
+ 555 04c0 C7           .byte 199               # roll $1 %edi 
+ 556 04c1 31DD                 xorl    %ebx,           %ebp
+ 557 04c3 897C2424             movl    %edi,           36(%esp)
+ 558 04c7 31CD                 xorl    %ecx,           %ebp
+ 559 04c9 8DBC17A1             leal    1859775393(%edi,%edx,1),%edi
+ 559      EBD96E
+ 560 04d0 89F2                 movl    %esi,           %edx
+ 561 04d2 C1C205               roll    $5,             %edx
+ 562 04d5 D1           .byte 209
+ 563 04d6 C8           .byte 200               # rorl $1 %eax 
+ 564 04d7 01EA                 addl    %ebp,           %edx
+ 565 04d9 D1           .byte 209
+ 566 04da C8           .byte 200               # rorl $1 %eax 
+ 567 04db 01D7                 addl    %edx,           %edi
+ 568                           # 20_39 26 
+ 569 04dd 8B542428             movl    40(%esp),       %edx
+ 570 04e1 8B6C2430             movl    48(%esp),       %ebp
+ 571 04e5 31EA                 xorl    %ebp,           %edx
+ 572 04e7 8B6C2408             movl    8(%esp),        %ebp
+ 573 04eb 31EA                 xorl    %ebp,           %edx
+ 574 04ed 8B6C241C             movl    28(%esp),       %ebp
+ 575 04f1 31EA                 xorl    %ebp,           %edx
+ 576 04f3 89F5                 movl    %esi,           %ebp
+ 577 04f5 D1           .byte 209
+ 578 04f6 C2           .byte 194               # roll $1 %edx 
+ 579 04f7 31C5                 xorl    %eax,           %ebp
+ 580 04f9 89542428             movl    %edx,           40(%esp)
+ 581 04fd 31DD                 xorl    %ebx,           %ebp
+ 582 04ff 8D940AA1             leal    1859775393(%edx,%ecx,1),%edx
+ 582      EBD96E
+ 583 0506 89F9                 movl    %edi,           %ecx
+ 584 0508 C1C105               roll    $5,             %ecx
+ 585 050b D1           .byte 209
+ 586 050c CE           .byte 206               # rorl $1 %esi 
+ 587 050d 01E9                 addl    %ebp,           %ecx
+ 588 050f D1           .byte 209
+ 589 0510 CE           .byte 206               # rorl $1 %esi 
+ 590 0511 01CA                 addl    %ecx,           %edx
+ 591                           # 20_39 27 
+ 592 0513 8B4C242C             movl    44(%esp),       %ecx
+ 593 0517 8B6C2434             movl    52(%esp),       %ebp
+ 594 051b 31E9                 xorl    %ebp,           %ecx
+ 595 051d 8B6C240C             movl    12(%esp),       %ebp
+ 596 0521 31E9                 xorl    %ebp,           %ecx
+ 597 0523 8B6C2420             movl    32(%esp),       %ebp
+ 598 0527 31E9                 xorl    %ebp,           %ecx
+ 599 0529 89FD                 movl    %edi,           %ebp
+ 600 052b D1           .byte 209
+\fGAS LISTING f.s                       page 12
+
+
+ 601 052c C1           .byte 193               # roll $1 %ecx 
+ 602 052d 31F5                 xorl    %esi,           %ebp
+ 603 052f 894C242C             movl    %ecx,           44(%esp)
+ 604 0533 31C5                 xorl    %eax,           %ebp
+ 605 0535 8D8C19A1             leal    1859775393(%ecx,%ebx,1),%ecx
+ 605      EBD96E
+ 606 053c 89D3                 movl    %edx,           %ebx
+ 607 053e C1C305               roll    $5,             %ebx
+ 608 0541 D1           .byte 209
+ 609 0542 CF           .byte 207               # rorl $1 %edi 
+ 610 0543 01EB                 addl    %ebp,           %ebx
+ 611 0545 D1           .byte 209
+ 612 0546 CF           .byte 207               # rorl $1 %edi 
+ 613 0547 01D9                 addl    %ebx,           %ecx
+ 614                           # 20_39 28 
+ 615 0549 8B5C2430             movl    48(%esp),       %ebx
+ 616 054d 8B6C2438             movl    56(%esp),       %ebp
+ 617 0551 31EB                 xorl    %ebp,           %ebx
+ 618 0553 8B6C2410             movl    16(%esp),       %ebp
+ 619 0557 31EB                 xorl    %ebp,           %ebx
+ 620 0559 8B6C2424             movl    36(%esp),       %ebp
+ 621 055d 31EB                 xorl    %ebp,           %ebx
+ 622 055f 89D5                 movl    %edx,           %ebp
+ 623 0561 D1           .byte 209
+ 624 0562 C3           .byte 195               # roll $1 %ebx 
+ 625 0563 31FD                 xorl    %edi,           %ebp
+ 626 0565 895C2430             movl    %ebx,           48(%esp)
+ 627 0569 31F5                 xorl    %esi,           %ebp
+ 628 056b 8D9C03A1             leal    1859775393(%ebx,%eax,1),%ebx
+ 628      EBD96E
+ 629 0572 89C8                 movl    %ecx,           %eax
+ 630 0574 C1C005               roll    $5,             %eax
+ 631 0577 D1           .byte 209
+ 632 0578 CA           .byte 202               # rorl $1 %edx 
+ 633 0579 01E8                 addl    %ebp,           %eax
+ 634 057b D1           .byte 209
+ 635 057c CA           .byte 202               # rorl $1 %edx 
+ 636 057d 01C3                 addl    %eax,           %ebx
+ 637                           # 20_39 29 
+ 638 057f 8B442434             movl    52(%esp),       %eax
+ 639 0583 8B6C243C             movl    60(%esp),       %ebp
+ 640 0587 31E8                 xorl    %ebp,           %eax
+ 641 0589 8B6C2414             movl    20(%esp),       %ebp
+ 642 058d 31E8                 xorl    %ebp,           %eax
+ 643 058f 8B6C2428             movl    40(%esp),       %ebp
+ 644 0593 31E8                 xorl    %ebp,           %eax
+ 645 0595 89CD                 movl    %ecx,           %ebp
+ 646 0597 D1           .byte 209
+ 647 0598 C0           .byte 192               # roll $1 %eax 
+ 648 0599 31D5                 xorl    %edx,           %ebp
+ 649 059b 89442434             movl    %eax,           52(%esp)
+ 650 059f 31FD                 xorl    %edi,           %ebp
+ 651 05a1 8D8430A1             leal    1859775393(%eax,%esi,1),%eax
+ 651      EBD96E
+ 652 05a8 89DE                 movl    %ebx,           %esi
+ 653 05aa C1C605               roll    $5,             %esi
+ 654 05ad D1           .byte 209
+\fGAS LISTING f.s                       page 13
+
+
+ 655 05ae C9           .byte 201               # rorl $1 %ecx 
+ 656 05af 01EE                 addl    %ebp,           %esi
+ 657 05b1 D1           .byte 209
+ 658 05b2 C9           .byte 201               # rorl $1 %ecx 
+ 659 05b3 01F0                 addl    %esi,           %eax
+ 660                           # 20_39 30 
+ 661 05b5 8B742438             movl    56(%esp),       %esi
+ 662 05b9 8B2C24               movl    (%esp),         %ebp
+ 663 05bc 31EE                 xorl    %ebp,           %esi
+ 664 05be 8B6C2418             movl    24(%esp),       %ebp
+ 665 05c2 31EE                 xorl    %ebp,           %esi
+ 666 05c4 8B6C242C             movl    44(%esp),       %ebp
+ 667 05c8 31EE                 xorl    %ebp,           %esi
+ 668 05ca 89DD                 movl    %ebx,           %ebp
+ 669 05cc D1           .byte 209
+ 670 05cd C6           .byte 198               # roll $1 %esi 
+ 671 05ce 31CD                 xorl    %ecx,           %ebp
+ 672 05d0 89742438             movl    %esi,           56(%esp)
+ 673 05d4 31D5                 xorl    %edx,           %ebp
+ 674 05d6 8DB43EA1             leal    1859775393(%esi,%edi,1),%esi
+ 674      EBD96E
+ 675 05dd 89C7                 movl    %eax,           %edi
+ 676 05df C1C705               roll    $5,             %edi
+ 677 05e2 D1           .byte 209
+ 678 05e3 CB           .byte 203               # rorl $1 %ebx 
+ 679 05e4 01EF                 addl    %ebp,           %edi
+ 680 05e6 D1           .byte 209
+ 681 05e7 CB           .byte 203               # rorl $1 %ebx 
+ 682 05e8 01FE                 addl    %edi,           %esi
+ 683                           # 20_39 31 
+ 684 05ea 8B7C243C             movl    60(%esp),       %edi
+ 685 05ee 8B6C2404             movl    4(%esp),        %ebp
+ 686 05f2 31EF                 xorl    %ebp,           %edi
+ 687 05f4 8B6C241C             movl    28(%esp),       %ebp
+ 688 05f8 31EF                 xorl    %ebp,           %edi
+ 689 05fa 8B6C2430             movl    48(%esp),       %ebp
+ 690 05fe 31EF                 xorl    %ebp,           %edi
+ 691 0600 89C5                 movl    %eax,           %ebp
+ 692 0602 D1           .byte 209
+ 693 0603 C7           .byte 199               # roll $1 %edi 
+ 694 0604 31DD                 xorl    %ebx,           %ebp
+ 695 0606 897C243C             movl    %edi,           60(%esp)
+ 696 060a 31CD                 xorl    %ecx,           %ebp
+ 697 060c 8DBC17A1             leal    1859775393(%edi,%edx,1),%edi
+ 697      EBD96E
+ 698 0613 89F2                 movl    %esi,           %edx
+ 699 0615 C1C205               roll    $5,             %edx
+ 700 0618 D1           .byte 209
+ 701 0619 C8           .byte 200               # rorl $1 %eax 
+ 702 061a 01EA                 addl    %ebp,           %edx
+ 703 061c D1           .byte 209
+ 704 061d C8           .byte 200               # rorl $1 %eax 
+ 705 061e 01D7                 addl    %edx,           %edi
+ 706                           # 20_39 32 
+ 707 0620 8B1424               movl    (%esp),         %edx
+ 708 0623 8B6C2408             movl    8(%esp),        %ebp
+ 709 0627 31EA                 xorl    %ebp,           %edx
+\fGAS LISTING f.s                       page 14
+
+
+ 710 0629 8B6C2420             movl    32(%esp),       %ebp
+ 711 062d 31EA                 xorl    %ebp,           %edx
+ 712 062f 8B6C2434             movl    52(%esp),       %ebp
+ 713 0633 31EA                 xorl    %ebp,           %edx
+ 714 0635 89F5                 movl    %esi,           %ebp
+ 715 0637 D1           .byte 209
+ 716 0638 C2           .byte 194               # roll $1 %edx 
+ 717 0639 31C5                 xorl    %eax,           %ebp
+ 718 063b 891424               movl    %edx,           (%esp)
+ 719 063e 31DD                 xorl    %ebx,           %ebp
+ 720 0640 8D940AA1             leal    1859775393(%edx,%ecx,1),%edx
+ 720      EBD96E
+ 721 0647 89F9                 movl    %edi,           %ecx
+ 722 0649 C1C105               roll    $5,             %ecx
+ 723 064c D1           .byte 209
+ 724 064d CE           .byte 206               # rorl $1 %esi 
+ 725 064e 01E9                 addl    %ebp,           %ecx
+ 726 0650 D1           .byte 209
+ 727 0651 CE           .byte 206               # rorl $1 %esi 
+ 728 0652 01CA                 addl    %ecx,           %edx
+ 729                           # 20_39 33 
+ 730 0654 8B4C2404             movl    4(%esp),        %ecx
+ 731 0658 8B6C240C             movl    12(%esp),       %ebp
+ 732 065c 31E9                 xorl    %ebp,           %ecx
+ 733 065e 8B6C2424             movl    36(%esp),       %ebp
+ 734 0662 31E9                 xorl    %ebp,           %ecx
+ 735 0664 8B6C2438             movl    56(%esp),       %ebp
+ 736 0668 31E9                 xorl    %ebp,           %ecx
+ 737 066a 89FD                 movl    %edi,           %ebp
+ 738 066c D1           .byte 209
+ 739 066d C1           .byte 193               # roll $1 %ecx 
+ 740 066e 31F5                 xorl    %esi,           %ebp
+ 741 0670 894C2404             movl    %ecx,           4(%esp)
+ 742 0674 31C5                 xorl    %eax,           %ebp
+ 743 0676 8D8C19A1             leal    1859775393(%ecx,%ebx,1),%ecx
+ 743      EBD96E
+ 744 067d 89D3                 movl    %edx,           %ebx
+ 745 067f C1C305               roll    $5,             %ebx
+ 746 0682 D1           .byte 209
+ 747 0683 CF           .byte 207               # rorl $1 %edi 
+ 748 0684 01EB                 addl    %ebp,           %ebx
+ 749 0686 D1           .byte 209
+ 750 0687 CF           .byte 207               # rorl $1 %edi 
+ 751 0688 01D9                 addl    %ebx,           %ecx
+ 752                           # 20_39 34 
+ 753 068a 8B5C2408             movl    8(%esp),        %ebx
+ 754 068e 8B6C2410             movl    16(%esp),       %ebp
+ 755 0692 31EB                 xorl    %ebp,           %ebx
+ 756 0694 8B6C2428             movl    40(%esp),       %ebp
+ 757 0698 31EB                 xorl    %ebp,           %ebx
+ 758 069a 8B6C243C             movl    60(%esp),       %ebp
+ 759 069e 31EB                 xorl    %ebp,           %ebx
+ 760 06a0 89D5                 movl    %edx,           %ebp
+ 761 06a2 D1           .byte 209
+ 762 06a3 C3           .byte 195               # roll $1 %ebx 
+ 763 06a4 31FD                 xorl    %edi,           %ebp
+ 764 06a6 895C2408             movl    %ebx,           8(%esp)
+\fGAS LISTING f.s                       page 15
+
+
+ 765 06aa 31F5                 xorl    %esi,           %ebp
+ 766 06ac 8D9C03A1             leal    1859775393(%ebx,%eax,1),%ebx
+ 766      EBD96E
+ 767 06b3 89C8                 movl    %ecx,           %eax
+ 768 06b5 C1C005               roll    $5,             %eax
+ 769 06b8 D1           .byte 209
+ 770 06b9 CA           .byte 202               # rorl $1 %edx 
+ 771 06ba 01E8                 addl    %ebp,           %eax
+ 772 06bc D1           .byte 209
+ 773 06bd CA           .byte 202               # rorl $1 %edx 
+ 774 06be 01C3                 addl    %eax,           %ebx
+ 775                           # 20_39 35 
+ 776 06c0 8B44240C             movl    12(%esp),       %eax
+ 777 06c4 8B6C2414             movl    20(%esp),       %ebp
+ 778 06c8 31E8                 xorl    %ebp,           %eax
+ 779 06ca 8B6C242C             movl    44(%esp),       %ebp
+ 780 06ce 31E8                 xorl    %ebp,           %eax
+ 781 06d0 8B2C24               movl    (%esp),         %ebp
+ 782 06d3 31E8                 xorl    %ebp,           %eax
+ 783 06d5 89CD                 movl    %ecx,           %ebp
+ 784 06d7 D1           .byte 209
+ 785 06d8 C0           .byte 192               # roll $1 %eax 
+ 786 06d9 31D5                 xorl    %edx,           %ebp
+ 787 06db 8944240C             movl    %eax,           12(%esp)
+ 788 06df 31FD                 xorl    %edi,           %ebp
+ 789 06e1 8D8430A1             leal    1859775393(%eax,%esi,1),%eax
+ 789      EBD96E
+ 790 06e8 89DE                 movl    %ebx,           %esi
+ 791 06ea C1C605               roll    $5,             %esi
+ 792 06ed D1           .byte 209
+ 793 06ee C9           .byte 201               # rorl $1 %ecx 
+ 794 06ef 01EE                 addl    %ebp,           %esi
+ 795 06f1 D1           .byte 209
+ 796 06f2 C9           .byte 201               # rorl $1 %ecx 
+ 797 06f3 01F0                 addl    %esi,           %eax
+ 798                           # 20_39 36 
+ 799 06f5 8B742410             movl    16(%esp),       %esi
+ 800 06f9 8B6C2418             movl    24(%esp),       %ebp
+ 801 06fd 31EE                 xorl    %ebp,           %esi
+ 802 06ff 8B6C2430             movl    48(%esp),       %ebp
+ 803 0703 31EE                 xorl    %ebp,           %esi
+ 804 0705 8B6C2404             movl    4(%esp),        %ebp
+ 805 0709 31EE                 xorl    %ebp,           %esi
+ 806 070b 89DD                 movl    %ebx,           %ebp
+ 807 070d D1           .byte 209
+ 808 070e C6           .byte 198               # roll $1 %esi 
+ 809 070f 31CD                 xorl    %ecx,           %ebp
+ 810 0711 89742410             movl    %esi,           16(%esp)
+ 811 0715 31D5                 xorl    %edx,           %ebp
+ 812 0717 8DB43EA1             leal    1859775393(%esi,%edi,1),%esi
+ 812      EBD96E
+ 813 071e 89C7                 movl    %eax,           %edi
+ 814 0720 C1C705               roll    $5,             %edi
+ 815 0723 D1           .byte 209
+ 816 0724 CB           .byte 203               # rorl $1 %ebx 
+ 817 0725 01EF                 addl    %ebp,           %edi
+ 818 0727 D1           .byte 209
+\fGAS LISTING f.s                       page 16
+
+
+ 819 0728 CB           .byte 203               # rorl $1 %ebx 
+ 820 0729 01FE                 addl    %edi,           %esi
+ 821                           # 20_39 37 
+ 822 072b 8B7C2414             movl    20(%esp),       %edi
+ 823 072f 8B6C241C             movl    28(%esp),       %ebp
+ 824 0733 31EF                 xorl    %ebp,           %edi
+ 825 0735 8B6C2434             movl    52(%esp),       %ebp
+ 826 0739 31EF                 xorl    %ebp,           %edi
+ 827 073b 8B6C2408             movl    8(%esp),        %ebp
+ 828 073f 31EF                 xorl    %ebp,           %edi
+ 829 0741 89C5                 movl    %eax,           %ebp
+ 830 0743 D1           .byte 209
+ 831 0744 C7           .byte 199               # roll $1 %edi 
+ 832 0745 31DD                 xorl    %ebx,           %ebp
+ 833 0747 897C2414             movl    %edi,           20(%esp)
+ 834 074b 31CD                 xorl    %ecx,           %ebp
+ 835 074d 8DBC17A1             leal    1859775393(%edi,%edx,1),%edi
+ 835      EBD96E
+ 836 0754 89F2                 movl    %esi,           %edx
+ 837 0756 C1C205               roll    $5,             %edx
+ 838 0759 D1           .byte 209
+ 839 075a C8           .byte 200               # rorl $1 %eax 
+ 840 075b 01EA                 addl    %ebp,           %edx
+ 841 075d D1           .byte 209
+ 842 075e C8           .byte 200               # rorl $1 %eax 
+ 843 075f 01D7                 addl    %edx,           %edi
+ 844                           # 20_39 38 
+ 845 0761 8B542418             movl    24(%esp),       %edx
+ 846 0765 8B6C2420             movl    32(%esp),       %ebp
+ 847 0769 31EA                 xorl    %ebp,           %edx
+ 848 076b 8B6C2438             movl    56(%esp),       %ebp
+ 849 076f 31EA                 xorl    %ebp,           %edx
+ 850 0771 8B6C240C             movl    12(%esp),       %ebp
+ 851 0775 31EA                 xorl    %ebp,           %edx
+ 852 0777 89F5                 movl    %esi,           %ebp
+ 853 0779 D1           .byte 209
+ 854 077a C2           .byte 194               # roll $1 %edx 
+ 855 077b 31C5                 xorl    %eax,           %ebp
+ 856 077d 89542418             movl    %edx,           24(%esp)
+ 857 0781 31DD                 xorl    %ebx,           %ebp
+ 858 0783 8D940AA1             leal    1859775393(%edx,%ecx,1),%edx
+ 858      EBD96E
+ 859 078a 89F9                 movl    %edi,           %ecx
+ 860 078c C1C105               roll    $5,             %ecx
+ 861 078f D1           .byte 209
+ 862 0790 CE           .byte 206               # rorl $1 %esi 
+ 863 0791 01E9                 addl    %ebp,           %ecx
+ 864 0793 D1           .byte 209
+ 865 0794 CE           .byte 206               # rorl $1 %esi 
+ 866 0795 01CA                 addl    %ecx,           %edx
+ 867                           # 20_39 39 
+ 868 0797 8B4C241C             movl    28(%esp),       %ecx
+ 869 079b 8B6C2424             movl    36(%esp),       %ebp
+ 870 079f 31E9                 xorl    %ebp,           %ecx
+ 871 07a1 8B6C243C             movl    60(%esp),       %ebp
+ 872 07a5 31E9                 xorl    %ebp,           %ecx
+ 873 07a7 8B6C2410             movl    16(%esp),       %ebp
+\fGAS LISTING f.s                       page 17
+
+
+ 874 07ab 31E9                 xorl    %ebp,           %ecx
+ 875 07ad 89FD                 movl    %edi,           %ebp
+ 876 07af D1           .byte 209
+ 877 07b0 C1           .byte 193               # roll $1 %ecx 
+ 878 07b1 31F5                 xorl    %esi,           %ebp
+ 879 07b3 894C241C             movl    %ecx,           28(%esp)
+ 880 07b7 31C5                 xorl    %eax,           %ebp
+ 881 07b9 8D8C19A1             leal    1859775393(%ecx,%ebx,1),%ecx
+ 881      EBD96E
+ 882 07c0 89D3                 movl    %edx,           %ebx
+ 883 07c2 C1C305               roll    $5,             %ebx
+ 884 07c5 D1           .byte 209
+ 885 07c6 CF           .byte 207               # rorl $1 %edi 
+ 886 07c7 01EB                 addl    %ebp,           %ebx
+ 887 07c9 D1           .byte 209
+ 888 07ca CF           .byte 207               # rorl $1 %edi 
+ 889 07cb 01D9                 addl    %ebx,           %ecx
+ 890                           # 40_59 40 
+ 891 07cd 8B5C2420             movl    32(%esp),       %ebx
+ 892 07d1 8B6C2428             movl    40(%esp),       %ebp
+ 893 07d5 31EB                 xorl    %ebp,           %ebx
+ 894 07d7 8B2C24               movl    (%esp),         %ebp
+ 895 07da 31EB                 xorl    %ebp,           %ebx
+ 896 07dc 8B6C2414             movl    20(%esp),       %ebp
+ 897 07e0 31EB                 xorl    %ebp,           %ebx
+ 898 07e2 89D5                 movl    %edx,           %ebp
+ 899 07e4 D1           .byte 209
+ 900 07e5 C3           .byte 195               # roll $1 %ebx 
+ 901 07e6 09FD                 orl     %edi,           %ebp
+ 902 07e8 895C2420             movl    %ebx,           32(%esp)
+ 903 07ec 21F5                 andl    %esi,           %ebp
+ 904 07ee 8D9C03DC             leal    2400959708(%ebx,%eax,1),%ebx
+ 904      BC1B8F
+ 905 07f5 89D0                 movl    %edx,           %eax
+ 906 07f7 D1           .byte 209
+ 907 07f8 CA           .byte 202               # rorl $1 %edx 
+ 908 07f9 21F8                 andl    %edi,           %eax
+ 909 07fb 09C5                 orl     %eax,           %ebp
+ 910 07fd 89C8                 movl    %ecx,           %eax
+ 911 07ff C1C005               roll    $5,             %eax
+ 912 0802 01C5                 addl    %eax,           %ebp
+ 913 0804 8B442424             movl    36(%esp),       %eax
+ 914 0808 01EB                 addl    %ebp,           %ebx
+ 915 080a 8B6C242C             movl    44(%esp),       %ebp
+ 916 080e 31E8                 xorl    %ebp,           %eax
+ 917 0810 8B6C2404             movl    4(%esp),        %ebp
+ 918 0814 31E8                 xorl    %ebp,           %eax
+ 919 0816 8B6C2418             movl    24(%esp),       %ebp
+ 920 081a D1           .byte 209
+ 921 081b CA           .byte 202               # rorl $1 %edx 
+ 922 081c 31E8                 xorl    %ebp,           %eax
+ 923 081e D1           .byte 209
+ 924 081f C0           .byte 192               # roll $1 %eax 
+ 925 0820 89CD                 movl    %ecx,           %ebp
+ 926 0822 89442424             movl    %eax,           36(%esp)
+ 927 0826 09D5                 orl     %edx,           %ebp
+ 928 0828 8D8430DC             leal    2400959708(%eax,%esi,1),%eax
+\fGAS LISTING f.s                       page 18
+
+
+ 928      BC1B8F
+ 929 082f 89CE                 movl    %ecx,           %esi
+ 930 0831 21FD                 andl    %edi,           %ebp
+ 931 0833 21D6                 andl    %edx,           %esi
+ 932 0835 09F5                 orl     %esi,           %ebp
+ 933 0837 89DE                 movl    %ebx,           %esi
+ 934 0839 C1C605               roll    $5,             %esi
+ 935 083c D1           .byte 209
+ 936 083d C9           .byte 201               # rorl $1 %ecx 
+ 937 083e 01F5                 addl    %esi,           %ebp
+ 938 0840 D1           .byte 209
+ 939 0841 C9           .byte 201               # rorl $1 %ecx 
+ 940 0842 01E8                 addl    %ebp,           %eax
+ 941                           # 40_59 41 
+ 942                           # 40_59 42 
+ 943 0844 8B742428             movl    40(%esp),       %esi
+ 944 0848 8B6C2430             movl    48(%esp),       %ebp
+ 945 084c 31EE                 xorl    %ebp,           %esi
+ 946 084e 8B6C2408             movl    8(%esp),        %ebp
+ 947 0852 31EE                 xorl    %ebp,           %esi
+ 948 0854 8B6C241C             movl    28(%esp),       %ebp
+ 949 0858 31EE                 xorl    %ebp,           %esi
+ 950 085a 89DD                 movl    %ebx,           %ebp
+ 951 085c D1           .byte 209
+ 952 085d C6           .byte 198               # roll $1 %esi 
+ 953 085e 09CD                 orl     %ecx,           %ebp
+ 954 0860 89742428             movl    %esi,           40(%esp)
+ 955 0864 21D5                 andl    %edx,           %ebp
+ 956 0866 8DB43EDC             leal    2400959708(%esi,%edi,1),%esi
+ 956      BC1B8F
+ 957 086d 89DF                 movl    %ebx,           %edi
+ 958 086f D1           .byte 209
+ 959 0870 CB           .byte 203               # rorl $1 %ebx 
+ 960 0871 21CF                 andl    %ecx,           %edi
+ 961 0873 09FD                 orl     %edi,           %ebp
+ 962 0875 89C7                 movl    %eax,           %edi
+ 963 0877 C1C705               roll    $5,             %edi
+ 964 087a 01FD                 addl    %edi,           %ebp
+ 965 087c 8B7C242C             movl    44(%esp),       %edi
+ 966 0880 01EE                 addl    %ebp,           %esi
+ 967 0882 8B6C2434             movl    52(%esp),       %ebp
+ 968 0886 31EF                 xorl    %ebp,           %edi
+ 969 0888 8B6C240C             movl    12(%esp),       %ebp
+ 970 088c 31EF                 xorl    %ebp,           %edi
+ 971 088e 8B6C2420             movl    32(%esp),       %ebp
+ 972 0892 D1           .byte 209
+ 973 0893 CB           .byte 203               # rorl $1 %ebx 
+ 974 0894 31EF                 xorl    %ebp,           %edi
+ 975 0896 D1           .byte 209
+ 976 0897 C7           .byte 199               # roll $1 %edi 
+ 977 0898 89C5                 movl    %eax,           %ebp
+ 978 089a 897C242C             movl    %edi,           44(%esp)
+ 979 089e 09DD                 orl     %ebx,           %ebp
+ 980 08a0 8DBC17DC             leal    2400959708(%edi,%edx,1),%edi
+ 980      BC1B8F
+ 981 08a7 89C2                 movl    %eax,           %edx
+ 982 08a9 21CD                 andl    %ecx,           %ebp
+\fGAS LISTING f.s                       page 19
+
+
+ 983 08ab 21DA                 andl    %ebx,           %edx
+ 984 08ad 09D5                 orl     %edx,           %ebp
+ 985 08af 89F2                 movl    %esi,           %edx
+ 986 08b1 C1C205               roll    $5,             %edx
+ 987 08b4 D1           .byte 209
+ 988 08b5 C8           .byte 200               # rorl $1 %eax 
+ 989 08b6 01D5                 addl    %edx,           %ebp
+ 990 08b8 D1           .byte 209
+ 991 08b9 C8           .byte 200               # rorl $1 %eax 
+ 992 08ba 01EF                 addl    %ebp,           %edi
+ 993                           # 40_59 43 
+ 994                           # 40_59 44 
+ 995 08bc 8B542430             movl    48(%esp),       %edx
+ 996 08c0 8B6C2438             movl    56(%esp),       %ebp
+ 997 08c4 31EA                 xorl    %ebp,           %edx
+ 998 08c6 8B6C2410             movl    16(%esp),       %ebp
+ 999 08ca 31EA                 xorl    %ebp,           %edx
+ 1000 08cc 8B6C2424            movl    36(%esp),       %ebp
+ 1001 08d0 31EA                xorl    %ebp,           %edx
+ 1002 08d2 89F5                movl    %esi,           %ebp
+ 1003 08d4 D1          .byte 209
+ 1004 08d5 C2          .byte 194               # roll $1 %edx 
+ 1005 08d6 09C5                orl     %eax,           %ebp
+ 1006 08d8 89542430            movl    %edx,           48(%esp)
+ 1007 08dc 21DD                andl    %ebx,           %ebp
+ 1008 08de 8D940ADC            leal    2400959708(%edx,%ecx,1),%edx
+ 1008      BC1B8F
+ 1009 08e5 89F1                movl    %esi,           %ecx
+ 1010 08e7 D1          .byte 209
+ 1011 08e8 CE          .byte 206               # rorl $1 %esi 
+ 1012 08e9 21C1                andl    %eax,           %ecx
+ 1013 08eb 09CD                orl     %ecx,           %ebp
+ 1014 08ed 89F9                movl    %edi,           %ecx
+ 1015 08ef C1C105              roll    $5,             %ecx
+ 1016 08f2 01CD                addl    %ecx,           %ebp
+ 1017 08f4 8B4C2434            movl    52(%esp),       %ecx
+ 1018 08f8 01EA                addl    %ebp,           %edx
+ 1019 08fa 8B6C243C            movl    60(%esp),       %ebp
+ 1020 08fe 31E9                xorl    %ebp,           %ecx
+ 1021 0900 8B6C2414            movl    20(%esp),       %ebp
+ 1022 0904 31E9                xorl    %ebp,           %ecx
+ 1023 0906 8B6C2428            movl    40(%esp),       %ebp
+ 1024 090a D1          .byte 209
+ 1025 090b CE          .byte 206               # rorl $1 %esi 
+ 1026 090c 31E9                xorl    %ebp,           %ecx
+ 1027 090e D1          .byte 209
+ 1028 090f C1          .byte 193               # roll $1 %ecx 
+ 1029 0910 89FD                movl    %edi,           %ebp
+ 1030 0912 894C2434            movl    %ecx,           52(%esp)
+ 1031 0916 09F5                orl     %esi,           %ebp
+ 1032 0918 8D8C19DC            leal    2400959708(%ecx,%ebx,1),%ecx
+ 1032      BC1B8F
+ 1033 091f 89FB                movl    %edi,           %ebx
+ 1034 0921 21C5                andl    %eax,           %ebp
+ 1035 0923 21F3                andl    %esi,           %ebx
+ 1036 0925 09DD                orl     %ebx,           %ebp
+ 1037 0927 89D3                movl    %edx,           %ebx
+\fGAS LISTING f.s                       page 20
+
+
+ 1038 0929 C1C305              roll    $5,             %ebx
+ 1039 092c D1          .byte 209
+ 1040 092d CF          .byte 207               # rorl $1 %edi 
+ 1041 092e 01DD                addl    %ebx,           %ebp
+ 1042 0930 D1          .byte 209
+ 1043 0931 CF          .byte 207               # rorl $1 %edi 
+ 1044 0932 01E9                addl    %ebp,           %ecx
+ 1045                          # 40_59 45 
+ 1046                          # 40_59 46 
+ 1047 0934 8B5C2438            movl    56(%esp),       %ebx
+ 1048 0938 8B2C24              movl    (%esp),         %ebp
+ 1049 093b 31EB                xorl    %ebp,           %ebx
+ 1050 093d 8B6C2418            movl    24(%esp),       %ebp
+ 1051 0941 31EB                xorl    %ebp,           %ebx
+ 1052 0943 8B6C242C            movl    44(%esp),       %ebp
+ 1053 0947 31EB                xorl    %ebp,           %ebx
+ 1054 0949 89D5                movl    %edx,           %ebp
+ 1055 094b D1          .byte 209
+ 1056 094c C3          .byte 195               # roll $1 %ebx 
+ 1057 094d 09FD                orl     %edi,           %ebp
+ 1058 094f 895C2438            movl    %ebx,           56(%esp)
+ 1059 0953 21F5                andl    %esi,           %ebp
+ 1060 0955 8D9C03DC            leal    2400959708(%ebx,%eax,1),%ebx
+ 1060      BC1B8F
+ 1061 095c 89D0                movl    %edx,           %eax
+ 1062 095e D1          .byte 209
+ 1063 095f CA          .byte 202               # rorl $1 %edx 
+ 1064 0960 21F8                andl    %edi,           %eax
+ 1065 0962 09C5                orl     %eax,           %ebp
+ 1066 0964 89C8                movl    %ecx,           %eax
+ 1067 0966 C1C005              roll    $5,             %eax
+ 1068 0969 01C5                addl    %eax,           %ebp
+ 1069 096b 8B44243C            movl    60(%esp),       %eax
+ 1070 096f 01EB                addl    %ebp,           %ebx
+ 1071 0971 8B6C2404            movl    4(%esp),        %ebp
+ 1072 0975 31E8                xorl    %ebp,           %eax
+ 1073 0977 8B6C241C            movl    28(%esp),       %ebp
+ 1074 097b 31E8                xorl    %ebp,           %eax
+ 1075 097d 8B6C2430            movl    48(%esp),       %ebp
+ 1076 0981 D1          .byte 209
+ 1077 0982 CA          .byte 202               # rorl $1 %edx 
+ 1078 0983 31E8                xorl    %ebp,           %eax
+ 1079 0985 D1          .byte 209
+ 1080 0986 C0          .byte 192               # roll $1 %eax 
+ 1081 0987 89CD                movl    %ecx,           %ebp
+ 1082 0989 8944243C            movl    %eax,           60(%esp)
+ 1083 098d 09D5                orl     %edx,           %ebp
+ 1084 098f 8D8430DC            leal    2400959708(%eax,%esi,1),%eax
+ 1084      BC1B8F
+ 1085 0996 89CE                movl    %ecx,           %esi
+ 1086 0998 21FD                andl    %edi,           %ebp
+ 1087 099a 21D6                andl    %edx,           %esi
+ 1088 099c 09F5                orl     %esi,           %ebp
+ 1089 099e 89DE                movl    %ebx,           %esi
+ 1090 09a0 C1C605              roll    $5,             %esi
+ 1091 09a3 D1          .byte 209
+ 1092 09a4 C9          .byte 201               # rorl $1 %ecx 
+\fGAS LISTING f.s                       page 21
+
+
+ 1093 09a5 01F5                addl    %esi,           %ebp
+ 1094 09a7 D1          .byte 209
+ 1095 09a8 C9          .byte 201               # rorl $1 %ecx 
+ 1096 09a9 01E8                addl    %ebp,           %eax
+ 1097                          # 40_59 47 
+ 1098                          # 40_59 48 
+ 1099 09ab 8B3424              movl    (%esp),         %esi
+ 1100 09ae 8B6C2408            movl    8(%esp),        %ebp
+ 1101 09b2 31EE                xorl    %ebp,           %esi
+ 1102 09b4 8B6C2420            movl    32(%esp),       %ebp
+ 1103 09b8 31EE                xorl    %ebp,           %esi
+ 1104 09ba 8B6C2434            movl    52(%esp),       %ebp
+ 1105 09be 31EE                xorl    %ebp,           %esi
+ 1106 09c0 89DD                movl    %ebx,           %ebp
+ 1107 09c2 D1          .byte 209
+ 1108 09c3 C6          .byte 198               # roll $1 %esi 
+ 1109 09c4 09CD                orl     %ecx,           %ebp
+ 1110 09c6 893424              movl    %esi,           (%esp)
+ 1111 09c9 21D5                andl    %edx,           %ebp
+ 1112 09cb 8DB43EDC            leal    2400959708(%esi,%edi,1),%esi
+ 1112      BC1B8F
+ 1113 09d2 89DF                movl    %ebx,           %edi
+ 1114 09d4 D1          .byte 209
+ 1115 09d5 CB          .byte 203               # rorl $1 %ebx 
+ 1116 09d6 21CF                andl    %ecx,           %edi
+ 1117 09d8 09FD                orl     %edi,           %ebp
+ 1118 09da 89C7                movl    %eax,           %edi
+ 1119 09dc C1C705              roll    $5,             %edi
+ 1120 09df 01FD                addl    %edi,           %ebp
+ 1121 09e1 8B7C2404            movl    4(%esp),        %edi
+ 1122 09e5 01EE                addl    %ebp,           %esi
+ 1123 09e7 8B6C240C            movl    12(%esp),       %ebp
+ 1124 09eb 31EF                xorl    %ebp,           %edi
+ 1125 09ed 8B6C2424            movl    36(%esp),       %ebp
+ 1126 09f1 31EF                xorl    %ebp,           %edi
+ 1127 09f3 8B6C2438            movl    56(%esp),       %ebp
+ 1128 09f7 D1          .byte 209
+ 1129 09f8 CB          .byte 203               # rorl $1 %ebx 
+ 1130 09f9 31EF                xorl    %ebp,           %edi
+ 1131 09fb D1          .byte 209
+ 1132 09fc C7          .byte 199               # roll $1 %edi 
+ 1133 09fd 89C5                movl    %eax,           %ebp
+ 1134 09ff 897C2404            movl    %edi,           4(%esp)
+ 1135 0a03 09DD                orl     %ebx,           %ebp
+ 1136 0a05 8DBC17DC            leal    2400959708(%edi,%edx,1),%edi
+ 1136      BC1B8F
+ 1137 0a0c 89C2                movl    %eax,           %edx
+ 1138 0a0e 21CD                andl    %ecx,           %ebp
+ 1139 0a10 21DA                andl    %ebx,           %edx
+ 1140 0a12 09D5                orl     %edx,           %ebp
+ 1141 0a14 89F2                movl    %esi,           %edx
+ 1142 0a16 C1C205              roll    $5,             %edx
+ 1143 0a19 D1          .byte 209
+ 1144 0a1a C8          .byte 200               # rorl $1 %eax 
+ 1145 0a1b 01D5                addl    %edx,           %ebp
+ 1146 0a1d D1          .byte 209
+ 1147 0a1e C8          .byte 200               # rorl $1 %eax 
+\fGAS LISTING f.s                       page 22
+
+
+ 1148 0a1f 01EF                addl    %ebp,           %edi
+ 1149                          # 40_59 49 
+ 1150                          # 40_59 50 
+ 1151 0a21 8B542408            movl    8(%esp),        %edx
+ 1152 0a25 8B6C2410            movl    16(%esp),       %ebp
+ 1153 0a29 31EA                xorl    %ebp,           %edx
+ 1154 0a2b 8B6C2428            movl    40(%esp),       %ebp
+ 1155 0a2f 31EA                xorl    %ebp,           %edx
+ 1156 0a31 8B6C243C            movl    60(%esp),       %ebp
+ 1157 0a35 31EA                xorl    %ebp,           %edx
+ 1158 0a37 89F5                movl    %esi,           %ebp
+ 1159 0a39 D1          .byte 209
+ 1160 0a3a C2          .byte 194               # roll $1 %edx 
+ 1161 0a3b 09C5                orl     %eax,           %ebp
+ 1162 0a3d 89542408            movl    %edx,           8(%esp)
+ 1163 0a41 21DD                andl    %ebx,           %ebp
+ 1164 0a43 8D940ADC            leal    2400959708(%edx,%ecx,1),%edx
+ 1164      BC1B8F
+ 1165 0a4a 89F1                movl    %esi,           %ecx
+ 1166 0a4c D1          .byte 209
+ 1167 0a4d CE          .byte 206               # rorl $1 %esi 
+ 1168 0a4e 21C1                andl    %eax,           %ecx
+ 1169 0a50 09CD                orl     %ecx,           %ebp
+ 1170 0a52 89F9                movl    %edi,           %ecx
+ 1171 0a54 C1C105              roll    $5,             %ecx
+ 1172 0a57 01CD                addl    %ecx,           %ebp
+ 1173 0a59 8B4C240C            movl    12(%esp),       %ecx
+ 1174 0a5d 01EA                addl    %ebp,           %edx
+ 1175 0a5f 8B6C2414            movl    20(%esp),       %ebp
+ 1176 0a63 31E9                xorl    %ebp,           %ecx
+ 1177 0a65 8B6C242C            movl    44(%esp),       %ebp
+ 1178 0a69 31E9                xorl    %ebp,           %ecx
+ 1179 0a6b 8B2C24              movl    (%esp),         %ebp
+ 1180 0a6e D1          .byte 209
+ 1181 0a6f CE          .byte 206               # rorl $1 %esi 
+ 1182 0a70 31E9                xorl    %ebp,           %ecx
+ 1183 0a72 D1          .byte 209
+ 1184 0a73 C1          .byte 193               # roll $1 %ecx 
+ 1185 0a74 89FD                movl    %edi,           %ebp
+ 1186 0a76 894C240C            movl    %ecx,           12(%esp)
+ 1187 0a7a 09F5                orl     %esi,           %ebp
+ 1188 0a7c 8D8C19DC            leal    2400959708(%ecx,%ebx,1),%ecx
+ 1188      BC1B8F
+ 1189 0a83 89FB                movl    %edi,           %ebx
+ 1190 0a85 21C5                andl    %eax,           %ebp
+ 1191 0a87 21F3                andl    %esi,           %ebx
+ 1192 0a89 09DD                orl     %ebx,           %ebp
+ 1193 0a8b 89D3                movl    %edx,           %ebx
+ 1194 0a8d C1C305              roll    $5,             %ebx
+ 1195 0a90 D1          .byte 209
+ 1196 0a91 CF          .byte 207               # rorl $1 %edi 
+ 1197 0a92 01DD                addl    %ebx,           %ebp
+ 1198 0a94 D1          .byte 209
+ 1199 0a95 CF          .byte 207               # rorl $1 %edi 
+ 1200 0a96 01E9                addl    %ebp,           %ecx
+ 1201                          # 40_59 51 
+ 1202                          # 40_59 52 
+\fGAS LISTING f.s                       page 23
+
+
+ 1203 0a98 8B5C2410            movl    16(%esp),       %ebx
+ 1204 0a9c 8B6C2418            movl    24(%esp),       %ebp
+ 1205 0aa0 31EB                xorl    %ebp,           %ebx
+ 1206 0aa2 8B6C2430            movl    48(%esp),       %ebp
+ 1207 0aa6 31EB                xorl    %ebp,           %ebx
+ 1208 0aa8 8B6C2404            movl    4(%esp),        %ebp
+ 1209 0aac 31EB                xorl    %ebp,           %ebx
+ 1210 0aae 89D5                movl    %edx,           %ebp
+ 1211 0ab0 D1          .byte 209
+ 1212 0ab1 C3          .byte 195               # roll $1 %ebx 
+ 1213 0ab2 09FD                orl     %edi,           %ebp
+ 1214 0ab4 895C2410            movl    %ebx,           16(%esp)
+ 1215 0ab8 21F5                andl    %esi,           %ebp
+ 1216 0aba 8D9C03DC            leal    2400959708(%ebx,%eax,1),%ebx
+ 1216      BC1B8F
+ 1217 0ac1 89D0                movl    %edx,           %eax
+ 1218 0ac3 D1          .byte 209
+ 1219 0ac4 CA          .byte 202               # rorl $1 %edx 
+ 1220 0ac5 21F8                andl    %edi,           %eax
+ 1221 0ac7 09C5                orl     %eax,           %ebp
+ 1222 0ac9 89C8                movl    %ecx,           %eax
+ 1223 0acb C1C005              roll    $5,             %eax
+ 1224 0ace 01C5                addl    %eax,           %ebp
+ 1225 0ad0 8B442414            movl    20(%esp),       %eax
+ 1226 0ad4 01EB                addl    %ebp,           %ebx
+ 1227 0ad6 8B6C241C            movl    28(%esp),       %ebp
+ 1228 0ada 31E8                xorl    %ebp,           %eax
+ 1229 0adc 8B6C2434            movl    52(%esp),       %ebp
+ 1230 0ae0 31E8                xorl    %ebp,           %eax
+ 1231 0ae2 8B6C2408            movl    8(%esp),        %ebp
+ 1232 0ae6 D1          .byte 209
+ 1233 0ae7 CA          .byte 202               # rorl $1 %edx 
+ 1234 0ae8 31E8                xorl    %ebp,           %eax
+ 1235 0aea D1          .byte 209
+ 1236 0aeb C0          .byte 192               # roll $1 %eax 
+ 1237 0aec 89CD                movl    %ecx,           %ebp
+ 1238 0aee 89442414            movl    %eax,           20(%esp)
+ 1239 0af2 09D5                orl     %edx,           %ebp
+ 1240 0af4 8D8430DC            leal    2400959708(%eax,%esi,1),%eax
+ 1240      BC1B8F
+ 1241 0afb 89CE                movl    %ecx,           %esi
+ 1242 0afd 21FD                andl    %edi,           %ebp
+ 1243 0aff 21D6                andl    %edx,           %esi
+ 1244 0b01 09F5                orl     %esi,           %ebp
+ 1245 0b03 89DE                movl    %ebx,           %esi
+ 1246 0b05 C1C605              roll    $5,             %esi
+ 1247 0b08 D1          .byte 209
+ 1248 0b09 C9          .byte 201               # rorl $1 %ecx 
+ 1249 0b0a 01F5                addl    %esi,           %ebp
+ 1250 0b0c D1          .byte 209
+ 1251 0b0d C9          .byte 201               # rorl $1 %ecx 
+ 1252 0b0e 01E8                addl    %ebp,           %eax
+ 1253                          # 40_59 53 
+ 1254                          # 40_59 54 
+ 1255 0b10 8B742418            movl    24(%esp),       %esi
+ 1256 0b14 8B6C2420            movl    32(%esp),       %ebp
+ 1257 0b18 31EE                xorl    %ebp,           %esi
+\fGAS LISTING f.s                       page 24
+
+
+ 1258 0b1a 8B6C2438            movl    56(%esp),       %ebp
+ 1259 0b1e 31EE                xorl    %ebp,           %esi
+ 1260 0b20 8B6C240C            movl    12(%esp),       %ebp
+ 1261 0b24 31EE                xorl    %ebp,           %esi
+ 1262 0b26 89DD                movl    %ebx,           %ebp
+ 1263 0b28 D1          .byte 209
+ 1264 0b29 C6          .byte 198               # roll $1 %esi 
+ 1265 0b2a 09CD                orl     %ecx,           %ebp
+ 1266 0b2c 89742418            movl    %esi,           24(%esp)
+ 1267 0b30 21D5                andl    %edx,           %ebp
+ 1268 0b32 8DB43EDC            leal    2400959708(%esi,%edi,1),%esi
+ 1268      BC1B8F
+ 1269 0b39 89DF                movl    %ebx,           %edi
+ 1270 0b3b D1          .byte 209
+ 1271 0b3c CB          .byte 203               # rorl $1 %ebx 
+ 1272 0b3d 21CF                andl    %ecx,           %edi
+ 1273 0b3f 09FD                orl     %edi,           %ebp
+ 1274 0b41 89C7                movl    %eax,           %edi
+ 1275 0b43 C1C705              roll    $5,             %edi
+ 1276 0b46 01FD                addl    %edi,           %ebp
+ 1277 0b48 8B7C241C            movl    28(%esp),       %edi
+ 1278 0b4c 01EE                addl    %ebp,           %esi
+ 1279 0b4e 8B6C2424            movl    36(%esp),       %ebp
+ 1280 0b52 31EF                xorl    %ebp,           %edi
+ 1281 0b54 8B6C243C            movl    60(%esp),       %ebp
+ 1282 0b58 31EF                xorl    %ebp,           %edi
+ 1283 0b5a 8B6C2410            movl    16(%esp),       %ebp
+ 1284 0b5e D1          .byte 209
+ 1285 0b5f CB          .byte 203               # rorl $1 %ebx 
+ 1286 0b60 31EF                xorl    %ebp,           %edi
+ 1287 0b62 D1          .byte 209
+ 1288 0b63 C7          .byte 199               # roll $1 %edi 
+ 1289 0b64 89C5                movl    %eax,           %ebp
+ 1290 0b66 897C241C            movl    %edi,           28(%esp)
+ 1291 0b6a 09DD                orl     %ebx,           %ebp
+ 1292 0b6c 8DBC17DC            leal    2400959708(%edi,%edx,1),%edi
+ 1292      BC1B8F
+ 1293 0b73 89C2                movl    %eax,           %edx
+ 1294 0b75 21CD                andl    %ecx,           %ebp
+ 1295 0b77 21DA                andl    %ebx,           %edx
+ 1296 0b79 09D5                orl     %edx,           %ebp
+ 1297 0b7b 89F2                movl    %esi,           %edx
+ 1298 0b7d C1C205              roll    $5,             %edx
+ 1299 0b80 D1          .byte 209
+ 1300 0b81 C8          .byte 200               # rorl $1 %eax 
+ 1301 0b82 01D5                addl    %edx,           %ebp
+ 1302 0b84 D1          .byte 209
+ 1303 0b85 C8          .byte 200               # rorl $1 %eax 
+ 1304 0b86 01EF                addl    %ebp,           %edi
+ 1305                          # 40_59 55 
+ 1306                          # 40_59 56 
+ 1307 0b88 8B542420            movl    32(%esp),       %edx
+ 1308 0b8c 8B6C2428            movl    40(%esp),       %ebp
+ 1309 0b90 31EA                xorl    %ebp,           %edx
+ 1310 0b92 8B2C24              movl    (%esp),         %ebp
+ 1311 0b95 31EA                xorl    %ebp,           %edx
+ 1312 0b97 8B6C2414            movl    20(%esp),       %ebp
+\fGAS LISTING f.s                       page 25
+
+
+ 1313 0b9b 31EA                xorl    %ebp,           %edx
+ 1314 0b9d 89F5                movl    %esi,           %ebp
+ 1315 0b9f D1          .byte 209
+ 1316 0ba0 C2          .byte 194               # roll $1 %edx 
+ 1317 0ba1 09C5                orl     %eax,           %ebp
+ 1318 0ba3 89542420            movl    %edx,           32(%esp)
+ 1319 0ba7 21DD                andl    %ebx,           %ebp
+ 1320 0ba9 8D940ADC            leal    2400959708(%edx,%ecx,1),%edx
+ 1320      BC1B8F
+ 1321 0bb0 89F1                movl    %esi,           %ecx
+ 1322 0bb2 D1          .byte 209
+ 1323 0bb3 CE          .byte 206               # rorl $1 %esi 
+ 1324 0bb4 21C1                andl    %eax,           %ecx
+ 1325 0bb6 09CD                orl     %ecx,           %ebp
+ 1326 0bb8 89F9                movl    %edi,           %ecx
+ 1327 0bba C1C105              roll    $5,             %ecx
+ 1328 0bbd 01CD                addl    %ecx,           %ebp
+ 1329 0bbf 8B4C2424            movl    36(%esp),       %ecx
+ 1330 0bc3 01EA                addl    %ebp,           %edx
+ 1331 0bc5 8B6C242C            movl    44(%esp),       %ebp
+ 1332 0bc9 31E9                xorl    %ebp,           %ecx
+ 1333 0bcb 8B6C2404            movl    4(%esp),        %ebp
+ 1334 0bcf 31E9                xorl    %ebp,           %ecx
+ 1335 0bd1 8B6C2418            movl    24(%esp),       %ebp
+ 1336 0bd5 D1          .byte 209
+ 1337 0bd6 CE          .byte 206               # rorl $1 %esi 
+ 1338 0bd7 31E9                xorl    %ebp,           %ecx
+ 1339 0bd9 D1          .byte 209
+ 1340 0bda C1          .byte 193               # roll $1 %ecx 
+ 1341 0bdb 89FD                movl    %edi,           %ebp
+ 1342 0bdd 894C2424            movl    %ecx,           36(%esp)
+ 1343 0be1 09F5                orl     %esi,           %ebp
+ 1344 0be3 8D8C19DC            leal    2400959708(%ecx,%ebx,1),%ecx
+ 1344      BC1B8F
+ 1345 0bea 89FB                movl    %edi,           %ebx
+ 1346 0bec 21C5                andl    %eax,           %ebp
+ 1347 0bee 21F3                andl    %esi,           %ebx
+ 1348 0bf0 09DD                orl     %ebx,           %ebp
+ 1349 0bf2 89D3                movl    %edx,           %ebx
+ 1350 0bf4 C1C305              roll    $5,             %ebx
+ 1351 0bf7 D1          .byte 209
+ 1352 0bf8 CF          .byte 207               # rorl $1 %edi 
+ 1353 0bf9 01DD                addl    %ebx,           %ebp
+ 1354 0bfb D1          .byte 209
+ 1355 0bfc CF          .byte 207               # rorl $1 %edi 
+ 1356 0bfd 01E9                addl    %ebp,           %ecx
+ 1357                          # 40_59 57 
+ 1358                          # 40_59 58 
+ 1359 0bff 8B5C2428            movl    40(%esp),       %ebx
+ 1360 0c03 8B6C2430            movl    48(%esp),       %ebp
+ 1361 0c07 31EB                xorl    %ebp,           %ebx
+ 1362 0c09 8B6C2408            movl    8(%esp),        %ebp
+ 1363 0c0d 31EB                xorl    %ebp,           %ebx
+ 1364 0c0f 8B6C241C            movl    28(%esp),       %ebp
+ 1365 0c13 31EB                xorl    %ebp,           %ebx
+ 1366 0c15 89D5                movl    %edx,           %ebp
+ 1367 0c17 D1          .byte 209
+\fGAS LISTING f.s                       page 26
+
+
+ 1368 0c18 C3          .byte 195               # roll $1 %ebx 
+ 1369 0c19 09FD                orl     %edi,           %ebp
+ 1370 0c1b 895C2428            movl    %ebx,           40(%esp)
+ 1371 0c1f 21F5                andl    %esi,           %ebp
+ 1372 0c21 8D9C03DC            leal    2400959708(%ebx,%eax,1),%ebx
+ 1372      BC1B8F
+ 1373 0c28 89D0                movl    %edx,           %eax
+ 1374 0c2a D1          .byte 209
+ 1375 0c2b CA          .byte 202               # rorl $1 %edx 
+ 1376 0c2c 21F8                andl    %edi,           %eax
+ 1377 0c2e 09C5                orl     %eax,           %ebp
+ 1378 0c30 89C8                movl    %ecx,           %eax
+ 1379 0c32 C1C005              roll    $5,             %eax
+ 1380 0c35 01C5                addl    %eax,           %ebp
+ 1381 0c37 8B44242C            movl    44(%esp),       %eax
+ 1382 0c3b 01EB                addl    %ebp,           %ebx
+ 1383 0c3d 8B6C2434            movl    52(%esp),       %ebp
+ 1384 0c41 31E8                xorl    %ebp,           %eax
+ 1385 0c43 8B6C240C            movl    12(%esp),       %ebp
+ 1386 0c47 31E8                xorl    %ebp,           %eax
+ 1387 0c49 8B6C2420            movl    32(%esp),       %ebp
+ 1388 0c4d D1          .byte 209
+ 1389 0c4e CA          .byte 202               # rorl $1 %edx 
+ 1390 0c4f 31E8                xorl    %ebp,           %eax
+ 1391 0c51 D1          .byte 209
+ 1392 0c52 C0          .byte 192               # roll $1 %eax 
+ 1393 0c53 89CD                movl    %ecx,           %ebp
+ 1394 0c55 8944242C            movl    %eax,           44(%esp)
+ 1395 0c59 09D5                orl     %edx,           %ebp
+ 1396 0c5b 8D8430DC            leal    2400959708(%eax,%esi,1),%eax
+ 1396      BC1B8F
+ 1397 0c62 89CE                movl    %ecx,           %esi
+ 1398 0c64 21FD                andl    %edi,           %ebp
+ 1399 0c66 21D6                andl    %edx,           %esi
+ 1400 0c68 09F5                orl     %esi,           %ebp
+ 1401 0c6a 89DE                movl    %ebx,           %esi
+ 1402 0c6c C1C605              roll    $5,             %esi
+ 1403 0c6f D1          .byte 209
+ 1404 0c70 C9          .byte 201               # rorl $1 %ecx 
+ 1405 0c71 01F5                addl    %esi,           %ebp
+ 1406 0c73 D1          .byte 209
+ 1407 0c74 C9          .byte 201               # rorl $1 %ecx 
+ 1408 0c75 01E8                addl    %ebp,           %eax
+ 1409                          # 40_59 59 
+ 1410                          # 20_39 60 
+ 1411 0c77 8B742430            movl    48(%esp),       %esi
+ 1412 0c7b 8B6C2438            movl    56(%esp),       %ebp
+ 1413 0c7f 31EE                xorl    %ebp,           %esi
+ 1414 0c81 8B6C2410            movl    16(%esp),       %ebp
+ 1415 0c85 31EE                xorl    %ebp,           %esi
+ 1416 0c87 8B6C2424            movl    36(%esp),       %ebp
+ 1417 0c8b 31EE                xorl    %ebp,           %esi
+ 1418 0c8d 89DD                movl    %ebx,           %ebp
+ 1419 0c8f D1          .byte 209
+ 1420 0c90 C6          .byte 198               # roll $1 %esi 
+ 1421 0c91 31CD                xorl    %ecx,           %ebp
+ 1422 0c93 89742430            movl    %esi,           48(%esp)
+\fGAS LISTING f.s                       page 27
+
+
+ 1423 0c97 31D5                xorl    %edx,           %ebp
+ 1424 0c99 8DB43ED6            leal    3395469782(%esi,%edi,1),%esi
+ 1424      C162CA
+ 1425 0ca0 89C7                movl    %eax,           %edi
+ 1426 0ca2 C1C705              roll    $5,             %edi
+ 1427 0ca5 D1          .byte 209
+ 1428 0ca6 CB          .byte 203               # rorl $1 %ebx 
+ 1429 0ca7 01EF                addl    %ebp,           %edi
+ 1430 0ca9 D1          .byte 209
+ 1431 0caa CB          .byte 203               # rorl $1 %ebx 
+ 1432 0cab 01FE                addl    %edi,           %esi
+ 1433                          # 20_39 61 
+ 1434 0cad 8B7C2434            movl    52(%esp),       %edi
+ 1435 0cb1 8B6C243C            movl    60(%esp),       %ebp
+ 1436 0cb5 31EF                xorl    %ebp,           %edi
+ 1437 0cb7 8B6C2414            movl    20(%esp),       %ebp
+ 1438 0cbb 31EF                xorl    %ebp,           %edi
+ 1439 0cbd 8B6C2428            movl    40(%esp),       %ebp
+ 1440 0cc1 31EF                xorl    %ebp,           %edi
+ 1441 0cc3 89C5                movl    %eax,           %ebp
+ 1442 0cc5 D1          .byte 209
+ 1443 0cc6 C7          .byte 199               # roll $1 %edi 
+ 1444 0cc7 31DD                xorl    %ebx,           %ebp
+ 1445 0cc9 897C2434            movl    %edi,           52(%esp)
+ 1446 0ccd 31CD                xorl    %ecx,           %ebp
+ 1447 0ccf 8DBC17D6            leal    3395469782(%edi,%edx,1),%edi
+ 1447      C162CA
+ 1448 0cd6 89F2                movl    %esi,           %edx
+ 1449 0cd8 C1C205              roll    $5,             %edx
+ 1450 0cdb D1          .byte 209
+ 1451 0cdc C8          .byte 200               # rorl $1 %eax 
+ 1452 0cdd 01EA                addl    %ebp,           %edx
+ 1453 0cdf D1          .byte 209
+ 1454 0ce0 C8          .byte 200               # rorl $1 %eax 
+ 1455 0ce1 01D7                addl    %edx,           %edi
+ 1456                          # 20_39 62 
+ 1457 0ce3 8B542438            movl    56(%esp),       %edx
+ 1458 0ce7 8B2C24              movl    (%esp),         %ebp
+ 1459 0cea 31EA                xorl    %ebp,           %edx
+ 1460 0cec 8B6C2418            movl    24(%esp),       %ebp
+ 1461 0cf0 31EA                xorl    %ebp,           %edx
+ 1462 0cf2 8B6C242C            movl    44(%esp),       %ebp
+ 1463 0cf6 31EA                xorl    %ebp,           %edx
+ 1464 0cf8 89F5                movl    %esi,           %ebp
+ 1465 0cfa D1          .byte 209
+ 1466 0cfb C2          .byte 194               # roll $1 %edx 
+ 1467 0cfc 31C5                xorl    %eax,           %ebp
+ 1468 0cfe 89542438            movl    %edx,           56(%esp)
+ 1469 0d02 31DD                xorl    %ebx,           %ebp
+ 1470 0d04 8D940AD6            leal    3395469782(%edx,%ecx,1),%edx
+ 1470      C162CA
+ 1471 0d0b 89F9                movl    %edi,           %ecx
+ 1472 0d0d C1C105              roll    $5,             %ecx
+ 1473 0d10 D1          .byte 209
+ 1474 0d11 CE          .byte 206               # rorl $1 %esi 
+ 1475 0d12 01E9                addl    %ebp,           %ecx
+ 1476 0d14 D1          .byte 209
+\fGAS LISTING f.s                       page 28
+
+
+ 1477 0d15 CE          .byte 206               # rorl $1 %esi 
+ 1478 0d16 01CA                addl    %ecx,           %edx
+ 1479                          # 20_39 63 
+ 1480 0d18 8B4C243C            movl    60(%esp),       %ecx
+ 1481 0d1c 8B6C2404            movl    4(%esp),        %ebp
+ 1482 0d20 31E9                xorl    %ebp,           %ecx
+ 1483 0d22 8B6C241C            movl    28(%esp),       %ebp
+ 1484 0d26 31E9                xorl    %ebp,           %ecx
+ 1485 0d28 8B6C2430            movl    48(%esp),       %ebp
+ 1486 0d2c 31E9                xorl    %ebp,           %ecx
+ 1487 0d2e 89FD                movl    %edi,           %ebp
+ 1488 0d30 D1          .byte 209
+ 1489 0d31 C1          .byte 193               # roll $1 %ecx 
+ 1490 0d32 31F5                xorl    %esi,           %ebp
+ 1491 0d34 894C243C            movl    %ecx,           60(%esp)
+ 1492 0d38 31C5                xorl    %eax,           %ebp
+ 1493 0d3a 8D8C19D6            leal    3395469782(%ecx,%ebx,1),%ecx
+ 1493      C162CA
+ 1494 0d41 89D3                movl    %edx,           %ebx
+ 1495 0d43 C1C305              roll    $5,             %ebx
+ 1496 0d46 D1          .byte 209
+ 1497 0d47 CF          .byte 207               # rorl $1 %edi 
+ 1498 0d48 01EB                addl    %ebp,           %ebx
+ 1499 0d4a D1          .byte 209
+ 1500 0d4b CF          .byte 207               # rorl $1 %edi 
+ 1501 0d4c 01D9                addl    %ebx,           %ecx
+ 1502                          # 20_39 64 
+ 1503 0d4e 8B1C24              movl    (%esp),         %ebx
+ 1504 0d51 8B6C2408            movl    8(%esp),        %ebp
+ 1505 0d55 31EB                xorl    %ebp,           %ebx
+ 1506 0d57 8B6C2420            movl    32(%esp),       %ebp
+ 1507 0d5b 31EB                xorl    %ebp,           %ebx
+ 1508 0d5d 8B6C2434            movl    52(%esp),       %ebp
+ 1509 0d61 31EB                xorl    %ebp,           %ebx
+ 1510 0d63 89D5                movl    %edx,           %ebp
+ 1511 0d65 D1          .byte 209
+ 1512 0d66 C3          .byte 195               # roll $1 %ebx 
+ 1513 0d67 31FD                xorl    %edi,           %ebp
+ 1514 0d69 891C24              movl    %ebx,           (%esp)
+ 1515 0d6c 31F5                xorl    %esi,           %ebp
+ 1516 0d6e 8D9C03D6            leal    3395469782(%ebx,%eax,1),%ebx
+ 1516      C162CA
+ 1517 0d75 89C8                movl    %ecx,           %eax
+ 1518 0d77 C1C005              roll    $5,             %eax
+ 1519 0d7a D1          .byte 209
+ 1520 0d7b CA          .byte 202               # rorl $1 %edx 
+ 1521 0d7c 01E8                addl    %ebp,           %eax
+ 1522 0d7e D1          .byte 209
+ 1523 0d7f CA          .byte 202               # rorl $1 %edx 
+ 1524 0d80 01C3                addl    %eax,           %ebx
+ 1525                          # 20_39 65 
+ 1526 0d82 8B442404            movl    4(%esp),        %eax
+ 1527 0d86 8B6C240C            movl    12(%esp),       %ebp
+ 1528 0d8a 31E8                xorl    %ebp,           %eax
+ 1529 0d8c 8B6C2424            movl    36(%esp),       %ebp
+ 1530 0d90 31E8                xorl    %ebp,           %eax
+ 1531 0d92 8B6C2438            movl    56(%esp),       %ebp
+\fGAS LISTING f.s                       page 29
+
+
+ 1532 0d96 31E8                xorl    %ebp,           %eax
+ 1533 0d98 89CD                movl    %ecx,           %ebp
+ 1534 0d9a D1          .byte 209
+ 1535 0d9b C0          .byte 192               # roll $1 %eax 
+ 1536 0d9c 31D5                xorl    %edx,           %ebp
+ 1537 0d9e 89442404            movl    %eax,           4(%esp)
+ 1538 0da2 31FD                xorl    %edi,           %ebp
+ 1539 0da4 8D8430D6            leal    3395469782(%eax,%esi,1),%eax
+ 1539      C162CA
+ 1540 0dab 89DE                movl    %ebx,           %esi
+ 1541 0dad C1C605              roll    $5,             %esi
+ 1542 0db0 D1          .byte 209
+ 1543 0db1 C9          .byte 201               # rorl $1 %ecx 
+ 1544 0db2 01EE                addl    %ebp,           %esi
+ 1545 0db4 D1          .byte 209
+ 1546 0db5 C9          .byte 201               # rorl $1 %ecx 
+ 1547 0db6 01F0                addl    %esi,           %eax
+ 1548                          # 20_39 66 
+ 1549 0db8 8B742408            movl    8(%esp),        %esi
+ 1550 0dbc 8B6C2410            movl    16(%esp),       %ebp
+ 1551 0dc0 31EE                xorl    %ebp,           %esi
+ 1552 0dc2 8B6C2428            movl    40(%esp),       %ebp
+ 1553 0dc6 31EE                xorl    %ebp,           %esi
+ 1554 0dc8 8B6C243C            movl    60(%esp),       %ebp
+ 1555 0dcc 31EE                xorl    %ebp,           %esi
+ 1556 0dce 89DD                movl    %ebx,           %ebp
+ 1557 0dd0 D1          .byte 209
+ 1558 0dd1 C6          .byte 198               # roll $1 %esi 
+ 1559 0dd2 31CD                xorl    %ecx,           %ebp
+ 1560 0dd4 89742408            movl    %esi,           8(%esp)
+ 1561 0dd8 31D5                xorl    %edx,           %ebp
+ 1562 0dda 8DB43ED6            leal    3395469782(%esi,%edi,1),%esi
+ 1562      C162CA
+ 1563 0de1 89C7                movl    %eax,           %edi
+ 1564 0de3 C1C705              roll    $5,             %edi
+ 1565 0de6 D1          .byte 209
+ 1566 0de7 CB          .byte 203               # rorl $1 %ebx 
+ 1567 0de8 01EF                addl    %ebp,           %edi
+ 1568 0dea D1          .byte 209
+ 1569 0deb CB          .byte 203               # rorl $1 %ebx 
+ 1570 0dec 01FE                addl    %edi,           %esi
+ 1571                          # 20_39 67 
+ 1572 0dee 8B7C240C            movl    12(%esp),       %edi
+ 1573 0df2 8B6C2414            movl    20(%esp),       %ebp
+ 1574 0df6 31EF                xorl    %ebp,           %edi
+ 1575 0df8 8B6C242C            movl    44(%esp),       %ebp
+ 1576 0dfc 31EF                xorl    %ebp,           %edi
+ 1577 0dfe 8B2C24              movl    (%esp),         %ebp
+ 1578 0e01 31EF                xorl    %ebp,           %edi
+ 1579 0e03 89C5                movl    %eax,           %ebp
+ 1580 0e05 D1          .byte 209
+ 1581 0e06 C7          .byte 199               # roll $1 %edi 
+ 1582 0e07 31DD                xorl    %ebx,           %ebp
+ 1583 0e09 897C240C            movl    %edi,           12(%esp)
+ 1584 0e0d 31CD                xorl    %ecx,           %ebp
+ 1585 0e0f 8DBC17D6            leal    3395469782(%edi,%edx,1),%edi
+ 1585      C162CA
+\fGAS LISTING f.s                       page 30
+
+
+ 1586 0e16 89F2                movl    %esi,           %edx
+ 1587 0e18 C1C205              roll    $5,             %edx
+ 1588 0e1b D1          .byte 209
+ 1589 0e1c C8          .byte 200               # rorl $1 %eax 
+ 1590 0e1d 01EA                addl    %ebp,           %edx
+ 1591 0e1f D1          .byte 209
+ 1592 0e20 C8          .byte 200               # rorl $1 %eax 
+ 1593 0e21 01D7                addl    %edx,           %edi
+ 1594                          # 20_39 68 
+ 1595 0e23 8B542410            movl    16(%esp),       %edx
+ 1596 0e27 8B6C2418            movl    24(%esp),       %ebp
+ 1597 0e2b 31EA                xorl    %ebp,           %edx
+ 1598 0e2d 8B6C2430            movl    48(%esp),       %ebp
+ 1599 0e31 31EA                xorl    %ebp,           %edx
+ 1600 0e33 8B6C2404            movl    4(%esp),        %ebp
+ 1601 0e37 31EA                xorl    %ebp,           %edx
+ 1602 0e39 89F5                movl    %esi,           %ebp
+ 1603 0e3b D1          .byte 209
+ 1604 0e3c C2          .byte 194               # roll $1 %edx 
+ 1605 0e3d 31C5                xorl    %eax,           %ebp
+ 1606 0e3f 89542410            movl    %edx,           16(%esp)
+ 1607 0e43 31DD                xorl    %ebx,           %ebp
+ 1608 0e45 8D940AD6            leal    3395469782(%edx,%ecx,1),%edx
+ 1608      C162CA
+ 1609 0e4c 89F9                movl    %edi,           %ecx
+ 1610 0e4e C1C105              roll    $5,             %ecx
+ 1611 0e51 D1          .byte 209
+ 1612 0e52 CE          .byte 206               # rorl $1 %esi 
+ 1613 0e53 01E9                addl    %ebp,           %ecx
+ 1614 0e55 D1          .byte 209
+ 1615 0e56 CE          .byte 206               # rorl $1 %esi 
+ 1616 0e57 01CA                addl    %ecx,           %edx
+ 1617                          # 20_39 69 
+ 1618 0e59 8B4C2414            movl    20(%esp),       %ecx
+ 1619 0e5d 8B6C241C            movl    28(%esp),       %ebp
+ 1620 0e61 31E9                xorl    %ebp,           %ecx
+ 1621 0e63 8B6C2434            movl    52(%esp),       %ebp
+ 1622 0e67 31E9                xorl    %ebp,           %ecx
+ 1623 0e69 8B6C2408            movl    8(%esp),        %ebp
+ 1624 0e6d 31E9                xorl    %ebp,           %ecx
+ 1625 0e6f 89FD                movl    %edi,           %ebp
+ 1626 0e71 D1          .byte 209
+ 1627 0e72 C1          .byte 193               # roll $1 %ecx 
+ 1628 0e73 31F5                xorl    %esi,           %ebp
+ 1629 0e75 894C2414            movl    %ecx,           20(%esp)
+ 1630 0e79 31C5                xorl    %eax,           %ebp
+ 1631 0e7b 8D8C19D6            leal    3395469782(%ecx,%ebx,1),%ecx
+ 1631      C162CA
+ 1632 0e82 89D3                movl    %edx,           %ebx
+ 1633 0e84 C1C305              roll    $5,             %ebx
+ 1634 0e87 D1          .byte 209
+ 1635 0e88 CF          .byte 207               # rorl $1 %edi 
+ 1636 0e89 01EB                addl    %ebp,           %ebx
+ 1637 0e8b D1          .byte 209
+ 1638 0e8c CF          .byte 207               # rorl $1 %edi 
+ 1639 0e8d 01D9                addl    %ebx,           %ecx
+ 1640                          # 20_39 70 
+\fGAS LISTING f.s                       page 31
+
+
+ 1641 0e8f 8B5C2418            movl    24(%esp),       %ebx
+ 1642 0e93 8B6C2420            movl    32(%esp),       %ebp
+ 1643 0e97 31EB                xorl    %ebp,           %ebx
+ 1644 0e99 8B6C2438            movl    56(%esp),       %ebp
+ 1645 0e9d 31EB                xorl    %ebp,           %ebx
+ 1646 0e9f 8B6C240C            movl    12(%esp),       %ebp
+ 1647 0ea3 31EB                xorl    %ebp,           %ebx
+ 1648 0ea5 89D5                movl    %edx,           %ebp
+ 1649 0ea7 D1          .byte 209
+ 1650 0ea8 C3          .byte 195               # roll $1 %ebx 
+ 1651 0ea9 31FD                xorl    %edi,           %ebp
+ 1652 0eab 895C2418            movl    %ebx,           24(%esp)
+ 1653 0eaf 31F5                xorl    %esi,           %ebp
+ 1654 0eb1 8D9C03D6            leal    3395469782(%ebx,%eax,1),%ebx
+ 1654      C162CA
+ 1655 0eb8 89C8                movl    %ecx,           %eax
+ 1656 0eba C1C005              roll    $5,             %eax
+ 1657 0ebd D1          .byte 209
+ 1658 0ebe CA          .byte 202               # rorl $1 %edx 
+ 1659 0ebf 01E8                addl    %ebp,           %eax
+ 1660 0ec1 D1          .byte 209
+ 1661 0ec2 CA          .byte 202               # rorl $1 %edx 
+ 1662 0ec3 01C3                addl    %eax,           %ebx
+ 1663                          # 20_39 71 
+ 1664 0ec5 8B44241C            movl    28(%esp),       %eax
+ 1665 0ec9 8B6C2424            movl    36(%esp),       %ebp
+ 1666 0ecd 31E8                xorl    %ebp,           %eax
+ 1667 0ecf 8B6C243C            movl    60(%esp),       %ebp
+ 1668 0ed3 31E8                xorl    %ebp,           %eax
+ 1669 0ed5 8B6C2410            movl    16(%esp),       %ebp
+ 1670 0ed9 31E8                xorl    %ebp,           %eax
+ 1671 0edb 89CD                movl    %ecx,           %ebp
+ 1672 0edd D1          .byte 209
+ 1673 0ede C0          .byte 192               # roll $1 %eax 
+ 1674 0edf 31D5                xorl    %edx,           %ebp
+ 1675 0ee1 8944241C            movl    %eax,           28(%esp)
+ 1676 0ee5 31FD                xorl    %edi,           %ebp
+ 1677 0ee7 8D8430D6            leal    3395469782(%eax,%esi,1),%eax
+ 1677      C162CA
+ 1678 0eee 89DE                movl    %ebx,           %esi
+ 1679 0ef0 C1C605              roll    $5,             %esi
+ 1680 0ef3 D1          .byte 209
+ 1681 0ef4 C9          .byte 201               # rorl $1 %ecx 
+ 1682 0ef5 01EE                addl    %ebp,           %esi
+ 1683 0ef7 D1          .byte 209
+ 1684 0ef8 C9          .byte 201               # rorl $1 %ecx 
+ 1685 0ef9 01F0                addl    %esi,           %eax
+ 1686                          # 20_39 72 
+ 1687 0efb 8B742420            movl    32(%esp),       %esi
+ 1688 0eff 8B6C2428            movl    40(%esp),       %ebp
+ 1689 0f03 31EE                xorl    %ebp,           %esi
+ 1690 0f05 8B2C24              movl    (%esp),         %ebp
+ 1691 0f08 31EE                xorl    %ebp,           %esi
+ 1692 0f0a 8B6C2414            movl    20(%esp),       %ebp
+ 1693 0f0e 31EE                xorl    %ebp,           %esi
+ 1694 0f10 89DD                movl    %ebx,           %ebp
+ 1695 0f12 D1          .byte 209
+\fGAS LISTING f.s                       page 32
+
+
+ 1696 0f13 C6          .byte 198               # roll $1 %esi 
+ 1697 0f14 31CD                xorl    %ecx,           %ebp
+ 1698 0f16 89742420            movl    %esi,           32(%esp)
+ 1699 0f1a 31D5                xorl    %edx,           %ebp
+ 1700 0f1c 8DB43ED6            leal    3395469782(%esi,%edi,1),%esi
+ 1700      C162CA
+ 1701 0f23 89C7                movl    %eax,           %edi
+ 1702 0f25 C1C705              roll    $5,             %edi
+ 1703 0f28 D1          .byte 209
+ 1704 0f29 CB          .byte 203               # rorl $1 %ebx 
+ 1705 0f2a 01EF                addl    %ebp,           %edi
+ 1706 0f2c D1          .byte 209
+ 1707 0f2d CB          .byte 203               # rorl $1 %ebx 
+ 1708 0f2e 01FE                addl    %edi,           %esi
+ 1709                          # 20_39 73 
+ 1710 0f30 8B7C2424            movl    36(%esp),       %edi
+ 1711 0f34 8B6C242C            movl    44(%esp),       %ebp
+ 1712 0f38 31EF                xorl    %ebp,           %edi
+ 1713 0f3a 8B6C2404            movl    4(%esp),        %ebp
+ 1714 0f3e 31EF                xorl    %ebp,           %edi
+ 1715 0f40 8B6C2418            movl    24(%esp),       %ebp
+ 1716 0f44 31EF                xorl    %ebp,           %edi
+ 1717 0f46 89C5                movl    %eax,           %ebp
+ 1718 0f48 D1          .byte 209
+ 1719 0f49 C7          .byte 199               # roll $1 %edi 
+ 1720 0f4a 31DD                xorl    %ebx,           %ebp
+ 1721 0f4c 897C2424            movl    %edi,           36(%esp)
+ 1722 0f50 31CD                xorl    %ecx,           %ebp
+ 1723 0f52 8DBC17D6            leal    3395469782(%edi,%edx,1),%edi
+ 1723      C162CA
+ 1724 0f59 89F2                movl    %esi,           %edx
+ 1725 0f5b C1C205              roll    $5,             %edx
+ 1726 0f5e D1          .byte 209
+ 1727 0f5f C8          .byte 200               # rorl $1 %eax 
+ 1728 0f60 01EA                addl    %ebp,           %edx
+ 1729 0f62 D1          .byte 209
+ 1730 0f63 C8          .byte 200               # rorl $1 %eax 
+ 1731 0f64 01D7                addl    %edx,           %edi
+ 1732                          # 20_39 74 
+ 1733 0f66 8B542428            movl    40(%esp),       %edx
+ 1734 0f6a 8B6C2430            movl    48(%esp),       %ebp
+ 1735 0f6e 31EA                xorl    %ebp,           %edx
+ 1736 0f70 8B6C2408            movl    8(%esp),        %ebp
+ 1737 0f74 31EA                xorl    %ebp,           %edx
+ 1738 0f76 8B6C241C            movl    28(%esp),       %ebp
+ 1739 0f7a 31EA                xorl    %ebp,           %edx
+ 1740 0f7c 89F5                movl    %esi,           %ebp
+ 1741 0f7e D1          .byte 209
+ 1742 0f7f C2          .byte 194               # roll $1 %edx 
+ 1743 0f80 31C5                xorl    %eax,           %ebp
+ 1744 0f82 89542428            movl    %edx,           40(%esp)
+ 1745 0f86 31DD                xorl    %ebx,           %ebp
+ 1746 0f88 8D940AD6            leal    3395469782(%edx,%ecx,1),%edx
+ 1746      C162CA
+ 1747 0f8f 89F9                movl    %edi,           %ecx
+ 1748 0f91 C1C105              roll    $5,             %ecx
+ 1749 0f94 D1          .byte 209
+\fGAS LISTING f.s                       page 33
+
+
+ 1750 0f95 CE          .byte 206               # rorl $1 %esi 
+ 1751 0f96 01E9                addl    %ebp,           %ecx
+ 1752 0f98 D1          .byte 209
+ 1753 0f99 CE          .byte 206               # rorl $1 %esi 
+ 1754 0f9a 01CA                addl    %ecx,           %edx
+ 1755                          # 20_39 75 
+ 1756 0f9c 8B4C242C            movl    44(%esp),       %ecx
+ 1757 0fa0 8B6C2434            movl    52(%esp),       %ebp
+ 1758 0fa4 31E9                xorl    %ebp,           %ecx
+ 1759 0fa6 8B6C240C            movl    12(%esp),       %ebp
+ 1760 0faa 31E9                xorl    %ebp,           %ecx
+ 1761 0fac 8B6C2420            movl    32(%esp),       %ebp
+ 1762 0fb0 31E9                xorl    %ebp,           %ecx
+ 1763 0fb2 89FD                movl    %edi,           %ebp
+ 1764 0fb4 D1          .byte 209
+ 1765 0fb5 C1          .byte 193               # roll $1 %ecx 
+ 1766 0fb6 31F5                xorl    %esi,           %ebp
+ 1767 0fb8 894C242C            movl    %ecx,           44(%esp)
+ 1768 0fbc 31C5                xorl    %eax,           %ebp
+ 1769 0fbe 8D8C19D6            leal    3395469782(%ecx,%ebx,1),%ecx
+ 1769      C162CA
+ 1770 0fc5 89D3                movl    %edx,           %ebx
+ 1771 0fc7 C1C305              roll    $5,             %ebx
+ 1772 0fca D1          .byte 209
+ 1773 0fcb CF          .byte 207               # rorl $1 %edi 
+ 1774 0fcc 01EB                addl    %ebp,           %ebx
+ 1775 0fce D1          .byte 209
+ 1776 0fcf CF          .byte 207               # rorl $1 %edi 
+ 1777 0fd0 01D9                addl    %ebx,           %ecx
+ 1778                          # 20_39 76 
+ 1779 0fd2 8B5C2430            movl    48(%esp),       %ebx
+ 1780 0fd6 8B6C2438            movl    56(%esp),       %ebp
+ 1781 0fda 31EB                xorl    %ebp,           %ebx
+ 1782 0fdc 8B6C2410            movl    16(%esp),       %ebp
+ 1783 0fe0 31EB                xorl    %ebp,           %ebx
+ 1784 0fe2 8B6C2424            movl    36(%esp),       %ebp
+ 1785 0fe6 31EB                xorl    %ebp,           %ebx
+ 1786 0fe8 89D5                movl    %edx,           %ebp
+ 1787 0fea D1          .byte 209
+ 1788 0feb C3          .byte 195               # roll $1 %ebx 
+ 1789 0fec 31FD                xorl    %edi,           %ebp
+ 1790 0fee 895C2430            movl    %ebx,           48(%esp)
+ 1791 0ff2 31F5                xorl    %esi,           %ebp
+ 1792 0ff4 8D9C03D6            leal    3395469782(%ebx,%eax,1),%ebx
+ 1792      C162CA
+ 1793 0ffb 89C8                movl    %ecx,           %eax
+ 1794 0ffd C1C005              roll    $5,             %eax
+ 1795 1000 D1          .byte 209
+ 1796 1001 CA          .byte 202               # rorl $1 %edx 
+ 1797 1002 01E8                addl    %ebp,           %eax
+ 1798 1004 D1          .byte 209
+ 1799 1005 CA          .byte 202               # rorl $1 %edx 
+ 1800 1006 01C3                addl    %eax,           %ebx
+ 1801                          # 20_39 77 
+ 1802 1008 8B442434            movl    52(%esp),       %eax
+ 1803 100c 8B6C243C            movl    60(%esp),       %ebp
+ 1804 1010 31E8                xorl    %ebp,           %eax
+\fGAS LISTING f.s                       page 34
+
+
+ 1805 1012 8B6C2414            movl    20(%esp),       %ebp
+ 1806 1016 31E8                xorl    %ebp,           %eax
+ 1807 1018 8B6C2428            movl    40(%esp),       %ebp
+ 1808 101c 31E8                xorl    %ebp,           %eax
+ 1809 101e 89CD                movl    %ecx,           %ebp
+ 1810 1020 D1          .byte 209
+ 1811 1021 C0          .byte 192               # roll $1 %eax 
+ 1812 1022 31D5                xorl    %edx,           %ebp
+ 1813 1024 89442434            movl    %eax,           52(%esp)
+ 1814 1028 31FD                xorl    %edi,           %ebp
+ 1815 102a 8D8430D6            leal    3395469782(%eax,%esi,1),%eax
+ 1815      C162CA
+ 1816 1031 89DE                movl    %ebx,           %esi
+ 1817 1033 C1C605              roll    $5,             %esi
+ 1818 1036 D1          .byte 209
+ 1819 1037 C9          .byte 201               # rorl $1 %ecx 
+ 1820 1038 01EE                addl    %ebp,           %esi
+ 1821 103a D1          .byte 209
+ 1822 103b C9          .byte 201               # rorl $1 %ecx 
+ 1823 103c 01F0                addl    %esi,           %eax
+ 1824                          # 20_39 78 
+ 1825 103e 8B742438            movl    56(%esp),       %esi
+ 1826 1042 8B2C24              movl    (%esp),         %ebp
+ 1827 1045 31EE                xorl    %ebp,           %esi
+ 1828 1047 8B6C2418            movl    24(%esp),       %ebp
+ 1829 104b 31EE                xorl    %ebp,           %esi
+ 1830 104d 8B6C242C            movl    44(%esp),       %ebp
+ 1831 1051 31EE                xorl    %ebp,           %esi
+ 1832 1053 89DD                movl    %ebx,           %ebp
+ 1833 1055 D1          .byte 209
+ 1834 1056 C6          .byte 198               # roll $1 %esi 
+ 1835 1057 31CD                xorl    %ecx,           %ebp
+ 1836 1059 89742438            movl    %esi,           56(%esp)
+ 1837 105d 31D5                xorl    %edx,           %ebp
+ 1838 105f 8DB43ED6            leal    3395469782(%esi,%edi,1),%esi
+ 1838      C162CA
+ 1839 1066 89C7                movl    %eax,           %edi
+ 1840 1068 C1C705              roll    $5,             %edi
+ 1841 106b D1          .byte 209
+ 1842 106c CB          .byte 203               # rorl $1 %ebx 
+ 1843 106d 01EF                addl    %ebp,           %edi
+ 1844 106f D1          .byte 209
+ 1845 1070 CB          .byte 203               # rorl $1 %ebx 
+ 1846 1071 01FE                addl    %edi,           %esi
+ 1847                          # 20_39 79 
+ 1848 1073 8B7C243C            movl    60(%esp),       %edi
+ 1849 1077 8B6C2404            movl    4(%esp),        %ebp
+ 1850 107b 31EF                xorl    %ebp,           %edi
+ 1851 107d 8B6C241C            movl    28(%esp),       %ebp
+ 1852 1081 31EF                xorl    %ebp,           %edi
+ 1853 1083 8B6C2430            movl    48(%esp),       %ebp
+ 1854 1087 31EF                xorl    %ebp,           %edi
+ 1855 1089 89C5                movl    %eax,           %ebp
+ 1856 108b D1          .byte 209
+ 1857 108c C7          .byte 199               # roll $1 %edi 
+ 1858 108d 31DD                xorl    %ebx,           %ebp
+ 1859 108f 897C243C            movl    %edi,           60(%esp)
+\fGAS LISTING f.s                       page 35
+
+
+ 1860 1093 31CD                xorl    %ecx,           %ebp
+ 1861 1095 8DBC17D6            leal    3395469782(%edi,%edx,1),%edi
+ 1861      C162CA
+ 1862 109c 89F2                movl    %esi,           %edx
+ 1863 109e C1C205              roll    $5,             %edx
+ 1864 10a1 01EA                addl    %ebp,           %edx
+ 1865 10a3 8B6C245C            movl    92(%esp),       %ebp
+ 1866 10a7 D1          .byte 209
+ 1867 10a8 C8          .byte 200               # rorl $1 %eax 
+ 1868 10a9 01D7                addl    %edx,           %edi
+ 1869 10ab D1          .byte 209
+ 1870 10ac C8          .byte 200               # rorl $1 %eax 
+ 1871                          # End processing 
+ 1872                  
+ 1873 10ad 8B550C              movl    12(%ebp),       %edx
+ 1874 10b0 01DA                addl    %ebx,           %edx
+ 1875 10b2 8B5D04              movl    4(%ebp),        %ebx
+ 1876 10b5 01F3                addl    %esi,           %ebx
+ 1877 10b7 89C6                movl    %eax,           %esi
+ 1878 10b9 8B4500              movl    (%ebp),         %eax
+ 1879 10bc 89550C              movl    %edx,           12(%ebp)
+ 1880 10bf 01F8                addl    %edi,           %eax
+ 1881 10c1 8B7D10              movl    16(%ebp),       %edi
+ 1882 10c4 01CF                addl    %ecx,           %edi
+ 1883 10c6 8B4D08              movl    8(%ebp),        %ecx
+ 1884 10c9 01F1                addl    %esi,           %ecx
+ 1885 10cb 894500              movl    %eax,           (%ebp)
+ 1886 10ce 894D08              movl    %ecx,           8(%ebp)
+ 1887 10d1 8B742440            movl    64(%esp),       %esi
+ 1888 10d5 897D10              movl    %edi,           16(%ebp)
+ 1889 10d8 83C640              addl    $64,            %esi
+ 1890 10db 8B442444            movl    68(%esp),       %eax
+ 1891 10df 895D04              movl    %ebx,           4(%ebp)
+ 1892 10e2 39F0                cmpl    %esi,           %eax
+ 1893 10e4 8B06                movl    (%esi),         %eax
+ 1894 10e6 0F8D3EEF            jge     .L000start
+ 1894      FFFF
+ 1895 10ec 83C448              addl    $72,            %esp
+ 1896 10ef 5F                  popl    %edi
+ 1897 10f0 5B                  popl    %ebx
+ 1898 10f1 5D                  popl    %ebp
+ 1899 10f2 5E                  popl    %esi
+ 1900 10f3 C3                  ret
+ 1901                  .sha1_block_x86_end:
+ 1902                          .size   sha1_block_x86,.sha1_block_x86_end-sha1_block_x86
+ 1903                  .ident  "desasm.pl"
diff --git a/crypto/sha/asm/f.s b/crypto/sha/asm/f.s
new file mode 100644 (file)
index 0000000..9f56d18
--- /dev/null
@@ -0,0 +1,1905 @@
+       # Don't even think of reading this code 
+       # It was automatically generated by sha1-586.pl 
+       # Which is a perl program used to generate the x86 assember for 
+       # any of elf, a.out, BSDI,Win32, or Solaris 
+       # eric <eay@cryptsoft.com> 
+
+       .file   "sha1-586.s"
+       .version        "01.01"
+gcc2_compiled.:
+.text
+       .align 16
+.globl sha1_block_x86
+       .type   sha1_block_x86,@function
+sha1_block_x86:
+       pushl   %esi
+       pushl   %ebp
+       movl    20(%esp),       %eax
+       movl    16(%esp),       %esi
+       addl    %esi,           %eax
+       movl    12(%esp),       %ebp
+       pushl   %ebx
+       subl    $64,            %eax
+       pushl   %edi
+       movl    4(%ebp),        %ebx
+       subl    $72,            %esp
+       movl    12(%ebp),       %edx
+       movl    16(%ebp),       %edi
+       movl    8(%ebp),        %ecx
+       movl    %eax,           68(%esp)
+       # First we need to setup the X array 
+       movl    (%esi),         %eax
+.L000start:
+       # First, load the words onto the stack in network byte order 
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           (%esp)
+       movl    4(%esi),        %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           4(%esp)
+       movl    8(%esi),        %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           8(%esp)
+       movl    12(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           12(%esp)
+       movl    16(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           16(%esp)
+       movl    20(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           20(%esp)
+       movl    24(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           24(%esp)
+       movl    28(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           28(%esp)
+       movl    32(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           32(%esp)
+       movl    36(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           36(%esp)
+       movl    40(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           40(%esp)
+       movl    44(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           44(%esp)
+       movl    48(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           48(%esp)
+       movl    52(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           52(%esp)
+       movl    56(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           56(%esp)
+       movl    60(%esi),       %eax
+.byte 15
+.byte 200              # bswapl  %eax 
+       movl    %eax,           60(%esp)
+       # We now have the X array on the stack 
+       # starting at sp-4 
+       movl    %esi,           64(%esp)
+
+       # Start processing 
+       movl    (%ebp),         %eax
+       # 00_15 0 
+       movl    %ecx,           %esi
+       movl    %eax,           %ebp
+       xorl    %edx,           %esi
+       roll    $5,             %ebp
+       andl    %ebx,           %esi
+       addl    %edi,           %ebp
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       movl    (%esp),         %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       xorl    %edx,           %esi
+       leal    1518500249(%ebp,%edi,1),%ebp
+       movl    %ebx,           %edi
+       addl    %ebp,           %esi
+       xorl    %ecx,           %edi
+       movl    %esi,           %ebp
+       andl    %eax,           %edi
+       roll    $5,             %ebp
+       addl    %edx,           %ebp
+       movl    4(%esp),        %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       xorl    %ecx,           %edi
+.byte 209
+.byte 200              # rorl $1 %eax 
+       leal    1518500249(%ebp,%edx,1),%ebp
+       addl    %ebp,           %edi
+       # 00_15 2 
+       movl    %eax,           %edx
+       movl    %edi,           %ebp
+       xorl    %ebx,           %edx
+       roll    $5,             %ebp
+       andl    %esi,           %edx
+       addl    %ecx,           %ebp
+.byte 209
+.byte 206              # rorl $1 %esi 
+       movl    8(%esp),        %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       xorl    %ebx,           %edx
+       leal    1518500249(%ebp,%ecx,1),%ebp
+       movl    %esi,           %ecx
+       addl    %ebp,           %edx
+       xorl    %eax,           %ecx
+       movl    %edx,           %ebp
+       andl    %edi,           %ecx
+       roll    $5,             %ebp
+       addl    %ebx,           %ebp
+       movl    12(%esp),       %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       xorl    %eax,           %ecx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       leal    1518500249(%ebp,%ebx,1),%ebp
+       addl    %ebp,           %ecx
+       # 00_15 4 
+       movl    %edi,           %ebx
+       movl    %ecx,           %ebp
+       xorl    %esi,           %ebx
+       roll    $5,             %ebp
+       andl    %edx,           %ebx
+       addl    %eax,           %ebp
+.byte 209
+.byte 202              # rorl $1 %edx 
+       movl    16(%esp),       %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       xorl    %esi,           %ebx
+       leal    1518500249(%ebp,%eax,1),%ebp
+       movl    %edx,           %eax
+       addl    %ebp,           %ebx
+       xorl    %edi,           %eax
+       movl    %ebx,           %ebp
+       andl    %ecx,           %eax
+       roll    $5,             %ebp
+       addl    %esi,           %ebp
+       movl    20(%esp),       %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       xorl    %edi,           %eax
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       leal    1518500249(%ebp,%esi,1),%ebp
+       addl    %ebp,           %eax
+       # 00_15 6 
+       movl    %ecx,           %esi
+       movl    %eax,           %ebp
+       xorl    %edx,           %esi
+       roll    $5,             %ebp
+       andl    %ebx,           %esi
+       addl    %edi,           %ebp
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       movl    24(%esp),       %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       xorl    %edx,           %esi
+       leal    1518500249(%ebp,%edi,1),%ebp
+       movl    %ebx,           %edi
+       addl    %ebp,           %esi
+       xorl    %ecx,           %edi
+       movl    %esi,           %ebp
+       andl    %eax,           %edi
+       roll    $5,             %ebp
+       addl    %edx,           %ebp
+       movl    28(%esp),       %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       xorl    %ecx,           %edi
+.byte 209
+.byte 200              # rorl $1 %eax 
+       leal    1518500249(%ebp,%edx,1),%ebp
+       addl    %ebp,           %edi
+       # 00_15 8 
+       movl    %eax,           %edx
+       movl    %edi,           %ebp
+       xorl    %ebx,           %edx
+       roll    $5,             %ebp
+       andl    %esi,           %edx
+       addl    %ecx,           %ebp
+.byte 209
+.byte 206              # rorl $1 %esi 
+       movl    32(%esp),       %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       xorl    %ebx,           %edx
+       leal    1518500249(%ebp,%ecx,1),%ebp
+       movl    %esi,           %ecx
+       addl    %ebp,           %edx
+       xorl    %eax,           %ecx
+       movl    %edx,           %ebp
+       andl    %edi,           %ecx
+       roll    $5,             %ebp
+       addl    %ebx,           %ebp
+       movl    36(%esp),       %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       xorl    %eax,           %ecx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       leal    1518500249(%ebp,%ebx,1),%ebp
+       addl    %ebp,           %ecx
+       # 00_15 10 
+       movl    %edi,           %ebx
+       movl    %ecx,           %ebp
+       xorl    %esi,           %ebx
+       roll    $5,             %ebp
+       andl    %edx,           %ebx
+       addl    %eax,           %ebp
+.byte 209
+.byte 202              # rorl $1 %edx 
+       movl    40(%esp),       %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       xorl    %esi,           %ebx
+       leal    1518500249(%ebp,%eax,1),%ebp
+       movl    %edx,           %eax
+       addl    %ebp,           %ebx
+       xorl    %edi,           %eax
+       movl    %ebx,           %ebp
+       andl    %ecx,           %eax
+       roll    $5,             %ebp
+       addl    %esi,           %ebp
+       movl    44(%esp),       %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       xorl    %edi,           %eax
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       leal    1518500249(%ebp,%esi,1),%ebp
+       addl    %ebp,           %eax
+       # 00_15 12 
+       movl    %ecx,           %esi
+       movl    %eax,           %ebp
+       xorl    %edx,           %esi
+       roll    $5,             %ebp
+       andl    %ebx,           %esi
+       addl    %edi,           %ebp
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       movl    48(%esp),       %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       xorl    %edx,           %esi
+       leal    1518500249(%ebp,%edi,1),%ebp
+       movl    %ebx,           %edi
+       addl    %ebp,           %esi
+       xorl    %ecx,           %edi
+       movl    %esi,           %ebp
+       andl    %eax,           %edi
+       roll    $5,             %ebp
+       addl    %edx,           %ebp
+       movl    52(%esp),       %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       xorl    %ecx,           %edi
+.byte 209
+.byte 200              # rorl $1 %eax 
+       leal    1518500249(%ebp,%edx,1),%ebp
+       addl    %ebp,           %edi
+       # 00_15 14 
+       movl    %eax,           %edx
+       movl    %edi,           %ebp
+       xorl    %ebx,           %edx
+       roll    $5,             %ebp
+       andl    %esi,           %edx
+       addl    %ecx,           %ebp
+.byte 209
+.byte 206              # rorl $1 %esi 
+       movl    56(%esp),       %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       xorl    %ebx,           %edx
+       leal    1518500249(%ebp,%ecx,1),%ebp
+       movl    %esi,           %ecx
+       addl    %ebp,           %edx
+       xorl    %eax,           %ecx
+       movl    %edx,           %ebp
+       andl    %edi,           %ecx
+       roll    $5,             %ebp
+       addl    %ebx,           %ebp
+       movl    60(%esp),       %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       xorl    %eax,           %ecx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       leal    1518500249(%ebp,%ebx,1),%ebp
+       addl    %ebp,           %ecx
+       # 16_19 16 
+       nop
+       movl    (%esp),         %ebp
+       movl    8(%esp),        %ebx
+       xorl    %ebp,           %ebx
+       movl    32(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    52(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    %edi,           %ebp
+.byte 209
+.byte 195              # roll $1 %ebx 
+       xorl    %esi,           %ebp
+       movl    %ebx,           (%esp)
+       andl    %edx,           %ebp
+       leal    1518500249(%ebx,%eax,1),%ebx
+       xorl    %esi,           %ebp
+       movl    %ecx,           %eax
+       addl    %ebp,           %ebx
+       roll    $5,             %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %eax,           %ebx
+       movl    4(%esp),        %eax
+       movl    12(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    36(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    56(%esp),       %ebp
+.byte 209
+.byte 202              # rorl $1 %edx 
+       xorl    %ebp,           %eax
+.byte 209
+.byte 192              # roll $1 %eax 
+       movl    %edx,           %ebp
+       xorl    %edi,           %ebp
+       movl    %eax,           4(%esp)
+       andl    %ecx,           %ebp
+       leal    1518500249(%eax,%esi,1),%eax
+       xorl    %edi,           %ebp
+       movl    %ebx,           %esi
+       roll    $5,             %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %esi,           %eax
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %ebp,           %eax
+       # 16_19 18 
+       movl    8(%esp),        %ebp
+       movl    16(%esp),       %esi
+       xorl    %ebp,           %esi
+       movl    40(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    60(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    %ecx,           %ebp
+.byte 209
+.byte 198              # roll $1 %esi 
+       xorl    %edx,           %ebp
+       movl    %esi,           8(%esp)
+       andl    %ebx,           %ebp
+       leal    1518500249(%esi,%edi,1),%esi
+       xorl    %edx,           %ebp
+       movl    %eax,           %edi
+       addl    %ebp,           %esi
+       roll    $5,             %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %edi,           %esi
+       movl    12(%esp),       %edi
+       movl    20(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    44(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    (%esp),         %ebp
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       xorl    %ebp,           %edi
+.byte 209
+.byte 199              # roll $1 %edi 
+       movl    %ebx,           %ebp
+       xorl    %ecx,           %ebp
+       movl    %edi,           12(%esp)
+       andl    %eax,           %ebp
+       leal    1518500249(%edi,%edx,1),%edi
+       xorl    %ecx,           %ebp
+       movl    %esi,           %edx
+       roll    $5,             %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %edx,           %edi
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %ebp,           %edi
+       # 20_39 20 
+       movl    16(%esp),       %edx
+       movl    24(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    48(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    4(%esp),        %ebp
+       xorl    %ebp,           %edx
+       movl    %esi,           %ebp
+.byte 209
+.byte 194              # roll $1 %edx 
+       xorl    %eax,           %ebp
+       movl    %edx,           16(%esp)
+       xorl    %ebx,           %ebp
+       leal    1859775393(%edx,%ecx,1),%edx
+       movl    %edi,           %ecx
+       roll    $5,             %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ebp,           %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ecx,           %edx
+       # 20_39 21 
+       movl    20(%esp),       %ecx
+       movl    28(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    52(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    8(%esp),        %ebp
+       xorl    %ebp,           %ecx
+       movl    %edi,           %ebp
+.byte 209
+.byte 193              # roll $1 %ecx 
+       xorl    %esi,           %ebp
+       movl    %ecx,           20(%esp)
+       xorl    %eax,           %ebp
+       leal    1859775393(%ecx,%ebx,1),%ecx
+       movl    %edx,           %ebx
+       roll    $5,             %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebp,           %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebx,           %ecx
+       # 20_39 22 
+       movl    24(%esp),       %ebx
+       movl    32(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    56(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    12(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    %edx,           %ebp
+.byte 209
+.byte 195              # roll $1 %ebx 
+       xorl    %edi,           %ebp
+       movl    %ebx,           24(%esp)
+       xorl    %esi,           %ebp
+       leal    1859775393(%ebx,%eax,1),%ebx
+       movl    %ecx,           %eax
+       roll    $5,             %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %ebp,           %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %eax,           %ebx
+       # 20_39 23 
+       movl    28(%esp),       %eax
+       movl    36(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    60(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    16(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    %ecx,           %ebp
+.byte 209
+.byte 192              # roll $1 %eax 
+       xorl    %edx,           %ebp
+       movl    %eax,           28(%esp)
+       xorl    %edi,           %ebp
+       leal    1859775393(%eax,%esi,1),%eax
+       movl    %ebx,           %esi
+       roll    $5,             %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %ebp,           %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %esi,           %eax
+       # 20_39 24 
+       movl    32(%esp),       %esi
+       movl    40(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    (%esp),         %ebp
+       xorl    %ebp,           %esi
+       movl    20(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    %ebx,           %ebp
+.byte 209
+.byte 198              # roll $1 %esi 
+       xorl    %ecx,           %ebp
+       movl    %esi,           32(%esp)
+       xorl    %edx,           %ebp
+       leal    1859775393(%esi,%edi,1),%esi
+       movl    %eax,           %edi
+       roll    $5,             %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %ebp,           %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %edi,           %esi
+       # 20_39 25 
+       movl    36(%esp),       %edi
+       movl    44(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    4(%esp),        %ebp
+       xorl    %ebp,           %edi
+       movl    24(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    %eax,           %ebp
+.byte 209
+.byte 199              # roll $1 %edi 
+       xorl    %ebx,           %ebp
+       movl    %edi,           36(%esp)
+       xorl    %ecx,           %ebp
+       leal    1859775393(%edi,%edx,1),%edi
+       movl    %esi,           %edx
+       roll    $5,             %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %ebp,           %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %edx,           %edi
+       # 20_39 26 
+       movl    40(%esp),       %edx
+       movl    48(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    8(%esp),        %ebp
+       xorl    %ebp,           %edx
+       movl    28(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    %esi,           %ebp
+.byte 209
+.byte 194              # roll $1 %edx 
+       xorl    %eax,           %ebp
+       movl    %edx,           40(%esp)
+       xorl    %ebx,           %ebp
+       leal    1859775393(%edx,%ecx,1),%edx
+       movl    %edi,           %ecx
+       roll    $5,             %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ebp,           %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ecx,           %edx
+       # 20_39 27 
+       movl    44(%esp),       %ecx
+       movl    52(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    12(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    32(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    %edi,           %ebp
+.byte 209
+.byte 193              # roll $1 %ecx 
+       xorl    %esi,           %ebp
+       movl    %ecx,           44(%esp)
+       xorl    %eax,           %ebp
+       leal    1859775393(%ecx,%ebx,1),%ecx
+       movl    %edx,           %ebx
+       roll    $5,             %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebp,           %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebx,           %ecx
+       # 20_39 28 
+       movl    48(%esp),       %ebx
+       movl    56(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    16(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    36(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    %edx,           %ebp
+.byte 209
+.byte 195              # roll $1 %ebx 
+       xorl    %edi,           %ebp
+       movl    %ebx,           48(%esp)
+       xorl    %esi,           %ebp
+       leal    1859775393(%ebx,%eax,1),%ebx
+       movl    %ecx,           %eax
+       roll    $5,             %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %ebp,           %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %eax,           %ebx
+       # 20_39 29 
+       movl    52(%esp),       %eax
+       movl    60(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    20(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    40(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    %ecx,           %ebp
+.byte 209
+.byte 192              # roll $1 %eax 
+       xorl    %edx,           %ebp
+       movl    %eax,           52(%esp)
+       xorl    %edi,           %ebp
+       leal    1859775393(%eax,%esi,1),%eax
+       movl    %ebx,           %esi
+       roll    $5,             %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %ebp,           %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %esi,           %eax
+       # 20_39 30 
+       movl    56(%esp),       %esi
+       movl    (%esp),         %ebp
+       xorl    %ebp,           %esi
+       movl    24(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    44(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    %ebx,           %ebp
+.byte 209
+.byte 198              # roll $1 %esi 
+       xorl    %ecx,           %ebp
+       movl    %esi,           56(%esp)
+       xorl    %edx,           %ebp
+       leal    1859775393(%esi,%edi,1),%esi
+       movl    %eax,           %edi
+       roll    $5,             %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %ebp,           %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %edi,           %esi
+       # 20_39 31 
+       movl    60(%esp),       %edi
+       movl    4(%esp),        %ebp
+       xorl    %ebp,           %edi
+       movl    28(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    48(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    %eax,           %ebp
+.byte 209
+.byte 199              # roll $1 %edi 
+       xorl    %ebx,           %ebp
+       movl    %edi,           60(%esp)
+       xorl    %ecx,           %ebp
+       leal    1859775393(%edi,%edx,1),%edi
+       movl    %esi,           %edx
+       roll    $5,             %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %ebp,           %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %edx,           %edi
+       # 20_39 32 
+       movl    (%esp),         %edx
+       movl    8(%esp),        %ebp
+       xorl    %ebp,           %edx
+       movl    32(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    52(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    %esi,           %ebp
+.byte 209
+.byte 194              # roll $1 %edx 
+       xorl    %eax,           %ebp
+       movl    %edx,           (%esp)
+       xorl    %ebx,           %ebp
+       leal    1859775393(%edx,%ecx,1),%edx
+       movl    %edi,           %ecx
+       roll    $5,             %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ebp,           %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ecx,           %edx
+       # 20_39 33 
+       movl    4(%esp),        %ecx
+       movl    12(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    36(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    56(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    %edi,           %ebp
+.byte 209
+.byte 193              # roll $1 %ecx 
+       xorl    %esi,           %ebp
+       movl    %ecx,           4(%esp)
+       xorl    %eax,           %ebp
+       leal    1859775393(%ecx,%ebx,1),%ecx
+       movl    %edx,           %ebx
+       roll    $5,             %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebp,           %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebx,           %ecx
+       # 20_39 34 
+       movl    8(%esp),        %ebx
+       movl    16(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    40(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    60(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    %edx,           %ebp
+.byte 209
+.byte 195              # roll $1 %ebx 
+       xorl    %edi,           %ebp
+       movl    %ebx,           8(%esp)
+       xorl    %esi,           %ebp
+       leal    1859775393(%ebx,%eax,1),%ebx
+       movl    %ecx,           %eax
+       roll    $5,             %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %ebp,           %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %eax,           %ebx
+       # 20_39 35 
+       movl    12(%esp),       %eax
+       movl    20(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    44(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    (%esp),         %ebp
+       xorl    %ebp,           %eax
+       movl    %ecx,           %ebp
+.byte 209
+.byte 192              # roll $1 %eax 
+       xorl    %edx,           %ebp
+       movl    %eax,           12(%esp)
+       xorl    %edi,           %ebp
+       leal    1859775393(%eax,%esi,1),%eax
+       movl    %ebx,           %esi
+       roll    $5,             %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %ebp,           %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %esi,           %eax
+       # 20_39 36 
+       movl    16(%esp),       %esi
+       movl    24(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    48(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    4(%esp),        %ebp
+       xorl    %ebp,           %esi
+       movl    %ebx,           %ebp
+.byte 209
+.byte 198              # roll $1 %esi 
+       xorl    %ecx,           %ebp
+       movl    %esi,           16(%esp)
+       xorl    %edx,           %ebp
+       leal    1859775393(%esi,%edi,1),%esi
+       movl    %eax,           %edi
+       roll    $5,             %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %ebp,           %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %edi,           %esi
+       # 20_39 37 
+       movl    20(%esp),       %edi
+       movl    28(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    52(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    8(%esp),        %ebp
+       xorl    %ebp,           %edi
+       movl    %eax,           %ebp
+.byte 209
+.byte 199              # roll $1 %edi 
+       xorl    %ebx,           %ebp
+       movl    %edi,           20(%esp)
+       xorl    %ecx,           %ebp
+       leal    1859775393(%edi,%edx,1),%edi
+       movl    %esi,           %edx
+       roll    $5,             %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %ebp,           %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %edx,           %edi
+       # 20_39 38 
+       movl    24(%esp),       %edx
+       movl    32(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    56(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    12(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    %esi,           %ebp
+.byte 209
+.byte 194              # roll $1 %edx 
+       xorl    %eax,           %ebp
+       movl    %edx,           24(%esp)
+       xorl    %ebx,           %ebp
+       leal    1859775393(%edx,%ecx,1),%edx
+       movl    %edi,           %ecx
+       roll    $5,             %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ebp,           %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ecx,           %edx
+       # 20_39 39 
+       movl    28(%esp),       %ecx
+       movl    36(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    60(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    16(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    %edi,           %ebp
+.byte 209
+.byte 193              # roll $1 %ecx 
+       xorl    %esi,           %ebp
+       movl    %ecx,           28(%esp)
+       xorl    %eax,           %ebp
+       leal    1859775393(%ecx,%ebx,1),%ecx
+       movl    %edx,           %ebx
+       roll    $5,             %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebp,           %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebx,           %ecx
+       # 40_59 40 
+       movl    32(%esp),       %ebx
+       movl    40(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    (%esp),         %ebp
+       xorl    %ebp,           %ebx
+       movl    20(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    %edx,           %ebp
+.byte 209
+.byte 195              # roll $1 %ebx 
+       orl     %edi,           %ebp
+       movl    %ebx,           32(%esp)
+       andl    %esi,           %ebp
+       leal    2400959708(%ebx,%eax,1),%ebx
+       movl    %edx,           %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       andl    %edi,           %eax
+       orl     %eax,           %ebp
+       movl    %ecx,           %eax
+       roll    $5,             %eax
+       addl    %eax,           %ebp
+       movl    36(%esp),       %eax
+       addl    %ebp,           %ebx
+       movl    44(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    4(%esp),        %ebp
+       xorl    %ebp,           %eax
+       movl    24(%esp),       %ebp
+.byte 209
+.byte 202              # rorl $1 %edx 
+       xorl    %ebp,           %eax
+.byte 209
+.byte 192              # roll $1 %eax 
+       movl    %ecx,           %ebp
+       movl    %eax,           36(%esp)
+       orl     %edx,           %ebp
+       leal    2400959708(%eax,%esi,1),%eax
+       movl    %ecx,           %esi
+       andl    %edi,           %ebp
+       andl    %edx,           %esi
+       orl     %esi,           %ebp
+       movl    %ebx,           %esi
+       roll    $5,             %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %esi,           %ebp
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %ebp,           %eax
+       # 40_59 41 
+       # 40_59 42 
+       movl    40(%esp),       %esi
+       movl    48(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    8(%esp),        %ebp
+       xorl    %ebp,           %esi
+       movl    28(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    %ebx,           %ebp
+.byte 209
+.byte 198              # roll $1 %esi 
+       orl     %ecx,           %ebp
+       movl    %esi,           40(%esp)
+       andl    %edx,           %ebp
+       leal    2400959708(%esi,%edi,1),%esi
+       movl    %ebx,           %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       andl    %ecx,           %edi
+       orl     %edi,           %ebp
+       movl    %eax,           %edi
+       roll    $5,             %edi
+       addl    %edi,           %ebp
+       movl    44(%esp),       %edi
+       addl    %ebp,           %esi
+       movl    52(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    12(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    32(%esp),       %ebp
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       xorl    %ebp,           %edi
+.byte 209
+.byte 199              # roll $1 %edi 
+       movl    %eax,           %ebp
+       movl    %edi,           44(%esp)
+       orl     %ebx,           %ebp
+       leal    2400959708(%edi,%edx,1),%edi
+       movl    %eax,           %edx
+       andl    %ecx,           %ebp
+       andl    %ebx,           %edx
+       orl     %edx,           %ebp
+       movl    %esi,           %edx
+       roll    $5,             %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %edx,           %ebp
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %ebp,           %edi
+       # 40_59 43 
+       # 40_59 44 
+       movl    48(%esp),       %edx
+       movl    56(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    16(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    36(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    %esi,           %ebp
+.byte 209
+.byte 194              # roll $1 %edx 
+       orl     %eax,           %ebp
+       movl    %edx,           48(%esp)
+       andl    %ebx,           %ebp
+       leal    2400959708(%edx,%ecx,1),%edx
+       movl    %esi,           %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       andl    %eax,           %ecx
+       orl     %ecx,           %ebp
+       movl    %edi,           %ecx
+       roll    $5,             %ecx
+       addl    %ecx,           %ebp
+       movl    52(%esp),       %ecx
+       addl    %ebp,           %edx
+       movl    60(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    20(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    40(%esp),       %ebp
+.byte 209
+.byte 206              # rorl $1 %esi 
+       xorl    %ebp,           %ecx
+.byte 209
+.byte 193              # roll $1 %ecx 
+       movl    %edi,           %ebp
+       movl    %ecx,           52(%esp)
+       orl     %esi,           %ebp
+       leal    2400959708(%ecx,%ebx,1),%ecx
+       movl    %edi,           %ebx
+       andl    %eax,           %ebp
+       andl    %esi,           %ebx
+       orl     %ebx,           %ebp
+       movl    %edx,           %ebx
+       roll    $5,             %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebx,           %ebp
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebp,           %ecx
+       # 40_59 45 
+       # 40_59 46 
+       movl    56(%esp),       %ebx
+       movl    (%esp),         %ebp
+       xorl    %ebp,           %ebx
+       movl    24(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    44(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    %edx,           %ebp
+.byte 209
+.byte 195              # roll $1 %ebx 
+       orl     %edi,           %ebp
+       movl    %ebx,           56(%esp)
+       andl    %esi,           %ebp
+       leal    2400959708(%ebx,%eax,1),%ebx
+       movl    %edx,           %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       andl    %edi,           %eax
+       orl     %eax,           %ebp
+       movl    %ecx,           %eax
+       roll    $5,             %eax
+       addl    %eax,           %ebp
+       movl    60(%esp),       %eax
+       addl    %ebp,           %ebx
+       movl    4(%esp),        %ebp
+       xorl    %ebp,           %eax
+       movl    28(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    48(%esp),       %ebp
+.byte 209
+.byte 202              # rorl $1 %edx 
+       xorl    %ebp,           %eax
+.byte 209
+.byte 192              # roll $1 %eax 
+       movl    %ecx,           %ebp
+       movl    %eax,           60(%esp)
+       orl     %edx,           %ebp
+       leal    2400959708(%eax,%esi,1),%eax
+       movl    %ecx,           %esi
+       andl    %edi,           %ebp
+       andl    %edx,           %esi
+       orl     %esi,           %ebp
+       movl    %ebx,           %esi
+       roll    $5,             %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %esi,           %ebp
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %ebp,           %eax
+       # 40_59 47 
+       # 40_59 48 
+       movl    (%esp),         %esi
+       movl    8(%esp),        %ebp
+       xorl    %ebp,           %esi
+       movl    32(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    52(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    %ebx,           %ebp
+.byte 209
+.byte 198              # roll $1 %esi 
+       orl     %ecx,           %ebp
+       movl    %esi,           (%esp)
+       andl    %edx,           %ebp
+       leal    2400959708(%esi,%edi,1),%esi
+       movl    %ebx,           %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       andl    %ecx,           %edi
+       orl     %edi,           %ebp
+       movl    %eax,           %edi
+       roll    $5,             %edi
+       addl    %edi,           %ebp
+       movl    4(%esp),        %edi
+       addl    %ebp,           %esi
+       movl    12(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    36(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    56(%esp),       %ebp
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       xorl    %ebp,           %edi
+.byte 209
+.byte 199              # roll $1 %edi 
+       movl    %eax,           %ebp
+       movl    %edi,           4(%esp)
+       orl     %ebx,           %ebp
+       leal    2400959708(%edi,%edx,1),%edi
+       movl    %eax,           %edx
+       andl    %ecx,           %ebp
+       andl    %ebx,           %edx
+       orl     %edx,           %ebp
+       movl    %esi,           %edx
+       roll    $5,             %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %edx,           %ebp
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %ebp,           %edi
+       # 40_59 49 
+       # 40_59 50 
+       movl    8(%esp),        %edx
+       movl    16(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    40(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    60(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    %esi,           %ebp
+.byte 209
+.byte 194              # roll $1 %edx 
+       orl     %eax,           %ebp
+       movl    %edx,           8(%esp)
+       andl    %ebx,           %ebp
+       leal    2400959708(%edx,%ecx,1),%edx
+       movl    %esi,           %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       andl    %eax,           %ecx
+       orl     %ecx,           %ebp
+       movl    %edi,           %ecx
+       roll    $5,             %ecx
+       addl    %ecx,           %ebp
+       movl    12(%esp),       %ecx
+       addl    %ebp,           %edx
+       movl    20(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    44(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    (%esp),         %ebp
+.byte 209
+.byte 206              # rorl $1 %esi 
+       xorl    %ebp,           %ecx
+.byte 209
+.byte 193              # roll $1 %ecx 
+       movl    %edi,           %ebp
+       movl    %ecx,           12(%esp)
+       orl     %esi,           %ebp
+       leal    2400959708(%ecx,%ebx,1),%ecx
+       movl    %edi,           %ebx
+       andl    %eax,           %ebp
+       andl    %esi,           %ebx
+       orl     %ebx,           %ebp
+       movl    %edx,           %ebx
+       roll    $5,             %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebx,           %ebp
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebp,           %ecx
+       # 40_59 51 
+       # 40_59 52 
+       movl    16(%esp),       %ebx
+       movl    24(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    48(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    4(%esp),        %ebp
+       xorl    %ebp,           %ebx
+       movl    %edx,           %ebp
+.byte 209
+.byte 195              # roll $1 %ebx 
+       orl     %edi,           %ebp
+       movl    %ebx,           16(%esp)
+       andl    %esi,           %ebp
+       leal    2400959708(%ebx,%eax,1),%ebx
+       movl    %edx,           %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       andl    %edi,           %eax
+       orl     %eax,           %ebp
+       movl    %ecx,           %eax
+       roll    $5,             %eax
+       addl    %eax,           %ebp
+       movl    20(%esp),       %eax
+       addl    %ebp,           %ebx
+       movl    28(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    52(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    8(%esp),        %ebp
+.byte 209
+.byte 202              # rorl $1 %edx 
+       xorl    %ebp,           %eax
+.byte 209
+.byte 192              # roll $1 %eax 
+       movl    %ecx,           %ebp
+       movl    %eax,           20(%esp)
+       orl     %edx,           %ebp
+       leal    2400959708(%eax,%esi,1),%eax
+       movl    %ecx,           %esi
+       andl    %edi,           %ebp
+       andl    %edx,           %esi
+       orl     %esi,           %ebp
+       movl    %ebx,           %esi
+       roll    $5,             %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %esi,           %ebp
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %ebp,           %eax
+       # 40_59 53 
+       # 40_59 54 
+       movl    24(%esp),       %esi
+       movl    32(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    56(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    12(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    %ebx,           %ebp
+.byte 209
+.byte 198              # roll $1 %esi 
+       orl     %ecx,           %ebp
+       movl    %esi,           24(%esp)
+       andl    %edx,           %ebp
+       leal    2400959708(%esi,%edi,1),%esi
+       movl    %ebx,           %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       andl    %ecx,           %edi
+       orl     %edi,           %ebp
+       movl    %eax,           %edi
+       roll    $5,             %edi
+       addl    %edi,           %ebp
+       movl    28(%esp),       %edi
+       addl    %ebp,           %esi
+       movl    36(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    60(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    16(%esp),       %ebp
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       xorl    %ebp,           %edi
+.byte 209
+.byte 199              # roll $1 %edi 
+       movl    %eax,           %ebp
+       movl    %edi,           28(%esp)
+       orl     %ebx,           %ebp
+       leal    2400959708(%edi,%edx,1),%edi
+       movl    %eax,           %edx
+       andl    %ecx,           %ebp
+       andl    %ebx,           %edx
+       orl     %edx,           %ebp
+       movl    %esi,           %edx
+       roll    $5,             %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %edx,           %ebp
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %ebp,           %edi
+       # 40_59 55 
+       # 40_59 56 
+       movl    32(%esp),       %edx
+       movl    40(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    (%esp),         %ebp
+       xorl    %ebp,           %edx
+       movl    20(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    %esi,           %ebp
+.byte 209
+.byte 194              # roll $1 %edx 
+       orl     %eax,           %ebp
+       movl    %edx,           32(%esp)
+       andl    %ebx,           %ebp
+       leal    2400959708(%edx,%ecx,1),%edx
+       movl    %esi,           %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       andl    %eax,           %ecx
+       orl     %ecx,           %ebp
+       movl    %edi,           %ecx
+       roll    $5,             %ecx
+       addl    %ecx,           %ebp
+       movl    36(%esp),       %ecx
+       addl    %ebp,           %edx
+       movl    44(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    4(%esp),        %ebp
+       xorl    %ebp,           %ecx
+       movl    24(%esp),       %ebp
+.byte 209
+.byte 206              # rorl $1 %esi 
+       xorl    %ebp,           %ecx
+.byte 209
+.byte 193              # roll $1 %ecx 
+       movl    %edi,           %ebp
+       movl    %ecx,           36(%esp)
+       orl     %esi,           %ebp
+       leal    2400959708(%ecx,%ebx,1),%ecx
+       movl    %edi,           %ebx
+       andl    %eax,           %ebp
+       andl    %esi,           %ebx
+       orl     %ebx,           %ebp
+       movl    %edx,           %ebx
+       roll    $5,             %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebx,           %ebp
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebp,           %ecx
+       # 40_59 57 
+       # 40_59 58 
+       movl    40(%esp),       %ebx
+       movl    48(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    8(%esp),        %ebp
+       xorl    %ebp,           %ebx
+       movl    28(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    %edx,           %ebp
+.byte 209
+.byte 195              # roll $1 %ebx 
+       orl     %edi,           %ebp
+       movl    %ebx,           40(%esp)
+       andl    %esi,           %ebp
+       leal    2400959708(%ebx,%eax,1),%ebx
+       movl    %edx,           %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       andl    %edi,           %eax
+       orl     %eax,           %ebp
+       movl    %ecx,           %eax
+       roll    $5,             %eax
+       addl    %eax,           %ebp
+       movl    44(%esp),       %eax
+       addl    %ebp,           %ebx
+       movl    52(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    12(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    32(%esp),       %ebp
+.byte 209
+.byte 202              # rorl $1 %edx 
+       xorl    %ebp,           %eax
+.byte 209
+.byte 192              # roll $1 %eax 
+       movl    %ecx,           %ebp
+       movl    %eax,           44(%esp)
+       orl     %edx,           %ebp
+       leal    2400959708(%eax,%esi,1),%eax
+       movl    %ecx,           %esi
+       andl    %edi,           %ebp
+       andl    %edx,           %esi
+       orl     %esi,           %ebp
+       movl    %ebx,           %esi
+       roll    $5,             %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %esi,           %ebp
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %ebp,           %eax
+       # 40_59 59 
+       # 20_39 60 
+       movl    48(%esp),       %esi
+       movl    56(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    16(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    36(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    %ebx,           %ebp
+.byte 209
+.byte 198              # roll $1 %esi 
+       xorl    %ecx,           %ebp
+       movl    %esi,           48(%esp)
+       xorl    %edx,           %ebp
+       leal    3395469782(%esi,%edi,1),%esi
+       movl    %eax,           %edi
+       roll    $5,             %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %ebp,           %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %edi,           %esi
+       # 20_39 61 
+       movl    52(%esp),       %edi
+       movl    60(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    20(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    40(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    %eax,           %ebp
+.byte 209
+.byte 199              # roll $1 %edi 
+       xorl    %ebx,           %ebp
+       movl    %edi,           52(%esp)
+       xorl    %ecx,           %ebp
+       leal    3395469782(%edi,%edx,1),%edi
+       movl    %esi,           %edx
+       roll    $5,             %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %ebp,           %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %edx,           %edi
+       # 20_39 62 
+       movl    56(%esp),       %edx
+       movl    (%esp),         %ebp
+       xorl    %ebp,           %edx
+       movl    24(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    44(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    %esi,           %ebp
+.byte 209
+.byte 194              # roll $1 %edx 
+       xorl    %eax,           %ebp
+       movl    %edx,           56(%esp)
+       xorl    %ebx,           %ebp
+       leal    3395469782(%edx,%ecx,1),%edx
+       movl    %edi,           %ecx
+       roll    $5,             %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ebp,           %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ecx,           %edx
+       # 20_39 63 
+       movl    60(%esp),       %ecx
+       movl    4(%esp),        %ebp
+       xorl    %ebp,           %ecx
+       movl    28(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    48(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    %edi,           %ebp
+.byte 209
+.byte 193              # roll $1 %ecx 
+       xorl    %esi,           %ebp
+       movl    %ecx,           60(%esp)
+       xorl    %eax,           %ebp
+       leal    3395469782(%ecx,%ebx,1),%ecx
+       movl    %edx,           %ebx
+       roll    $5,             %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebp,           %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebx,           %ecx
+       # 20_39 64 
+       movl    (%esp),         %ebx
+       movl    8(%esp),        %ebp
+       xorl    %ebp,           %ebx
+       movl    32(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    52(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    %edx,           %ebp
+.byte 209
+.byte 195              # roll $1 %ebx 
+       xorl    %edi,           %ebp
+       movl    %ebx,           (%esp)
+       xorl    %esi,           %ebp
+       leal    3395469782(%ebx,%eax,1),%ebx
+       movl    %ecx,           %eax
+       roll    $5,             %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %ebp,           %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %eax,           %ebx
+       # 20_39 65 
+       movl    4(%esp),        %eax
+       movl    12(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    36(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    56(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    %ecx,           %ebp
+.byte 209
+.byte 192              # roll $1 %eax 
+       xorl    %edx,           %ebp
+       movl    %eax,           4(%esp)
+       xorl    %edi,           %ebp
+       leal    3395469782(%eax,%esi,1),%eax
+       movl    %ebx,           %esi
+       roll    $5,             %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %ebp,           %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %esi,           %eax
+       # 20_39 66 
+       movl    8(%esp),        %esi
+       movl    16(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    40(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    60(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    %ebx,           %ebp
+.byte 209
+.byte 198              # roll $1 %esi 
+       xorl    %ecx,           %ebp
+       movl    %esi,           8(%esp)
+       xorl    %edx,           %ebp
+       leal    3395469782(%esi,%edi,1),%esi
+       movl    %eax,           %edi
+       roll    $5,             %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %ebp,           %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %edi,           %esi
+       # 20_39 67 
+       movl    12(%esp),       %edi
+       movl    20(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    44(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    (%esp),         %ebp
+       xorl    %ebp,           %edi
+       movl    %eax,           %ebp
+.byte 209
+.byte 199              # roll $1 %edi 
+       xorl    %ebx,           %ebp
+       movl    %edi,           12(%esp)
+       xorl    %ecx,           %ebp
+       leal    3395469782(%edi,%edx,1),%edi
+       movl    %esi,           %edx
+       roll    $5,             %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %ebp,           %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %edx,           %edi
+       # 20_39 68 
+       movl    16(%esp),       %edx
+       movl    24(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    48(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    4(%esp),        %ebp
+       xorl    %ebp,           %edx
+       movl    %esi,           %ebp
+.byte 209
+.byte 194              # roll $1 %edx 
+       xorl    %eax,           %ebp
+       movl    %edx,           16(%esp)
+       xorl    %ebx,           %ebp
+       leal    3395469782(%edx,%ecx,1),%edx
+       movl    %edi,           %ecx
+       roll    $5,             %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ebp,           %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ecx,           %edx
+       # 20_39 69 
+       movl    20(%esp),       %ecx
+       movl    28(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    52(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    8(%esp),        %ebp
+       xorl    %ebp,           %ecx
+       movl    %edi,           %ebp
+.byte 209
+.byte 193              # roll $1 %ecx 
+       xorl    %esi,           %ebp
+       movl    %ecx,           20(%esp)
+       xorl    %eax,           %ebp
+       leal    3395469782(%ecx,%ebx,1),%ecx
+       movl    %edx,           %ebx
+       roll    $5,             %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebp,           %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebx,           %ecx
+       # 20_39 70 
+       movl    24(%esp),       %ebx
+       movl    32(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    56(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    12(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    %edx,           %ebp
+.byte 209
+.byte 195              # roll $1 %ebx 
+       xorl    %edi,           %ebp
+       movl    %ebx,           24(%esp)
+       xorl    %esi,           %ebp
+       leal    3395469782(%ebx,%eax,1),%ebx
+       movl    %ecx,           %eax
+       roll    $5,             %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %ebp,           %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %eax,           %ebx
+       # 20_39 71 
+       movl    28(%esp),       %eax
+       movl    36(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    60(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    16(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    %ecx,           %ebp
+.byte 209
+.byte 192              # roll $1 %eax 
+       xorl    %edx,           %ebp
+       movl    %eax,           28(%esp)
+       xorl    %edi,           %ebp
+       leal    3395469782(%eax,%esi,1),%eax
+       movl    %ebx,           %esi
+       roll    $5,             %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %ebp,           %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %esi,           %eax
+       # 20_39 72 
+       movl    32(%esp),       %esi
+       movl    40(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    (%esp),         %ebp
+       xorl    %ebp,           %esi
+       movl    20(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    %ebx,           %ebp
+.byte 209
+.byte 198              # roll $1 %esi 
+       xorl    %ecx,           %ebp
+       movl    %esi,           32(%esp)
+       xorl    %edx,           %ebp
+       leal    3395469782(%esi,%edi,1),%esi
+       movl    %eax,           %edi
+       roll    $5,             %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %ebp,           %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %edi,           %esi
+       # 20_39 73 
+       movl    36(%esp),       %edi
+       movl    44(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    4(%esp),        %ebp
+       xorl    %ebp,           %edi
+       movl    24(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    %eax,           %ebp
+.byte 209
+.byte 199              # roll $1 %edi 
+       xorl    %ebx,           %ebp
+       movl    %edi,           36(%esp)
+       xorl    %ecx,           %ebp
+       leal    3395469782(%edi,%edx,1),%edi
+       movl    %esi,           %edx
+       roll    $5,             %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %ebp,           %edx
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %edx,           %edi
+       # 20_39 74 
+       movl    40(%esp),       %edx
+       movl    48(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    8(%esp),        %ebp
+       xorl    %ebp,           %edx
+       movl    28(%esp),       %ebp
+       xorl    %ebp,           %edx
+       movl    %esi,           %ebp
+.byte 209
+.byte 194              # roll $1 %edx 
+       xorl    %eax,           %ebp
+       movl    %edx,           40(%esp)
+       xorl    %ebx,           %ebp
+       leal    3395469782(%edx,%ecx,1),%edx
+       movl    %edi,           %ecx
+       roll    $5,             %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ebp,           %ecx
+.byte 209
+.byte 206              # rorl $1 %esi 
+       addl    %ecx,           %edx
+       # 20_39 75 
+       movl    44(%esp),       %ecx
+       movl    52(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    12(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    32(%esp),       %ebp
+       xorl    %ebp,           %ecx
+       movl    %edi,           %ebp
+.byte 209
+.byte 193              # roll $1 %ecx 
+       xorl    %esi,           %ebp
+       movl    %ecx,           44(%esp)
+       xorl    %eax,           %ebp
+       leal    3395469782(%ecx,%ebx,1),%ecx
+       movl    %edx,           %ebx
+       roll    $5,             %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebp,           %ebx
+.byte 209
+.byte 207              # rorl $1 %edi 
+       addl    %ebx,           %ecx
+       # 20_39 76 
+       movl    48(%esp),       %ebx
+       movl    56(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    16(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    36(%esp),       %ebp
+       xorl    %ebp,           %ebx
+       movl    %edx,           %ebp
+.byte 209
+.byte 195              # roll $1 %ebx 
+       xorl    %edi,           %ebp
+       movl    %ebx,           48(%esp)
+       xorl    %esi,           %ebp
+       leal    3395469782(%ebx,%eax,1),%ebx
+       movl    %ecx,           %eax
+       roll    $5,             %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %ebp,           %eax
+.byte 209
+.byte 202              # rorl $1 %edx 
+       addl    %eax,           %ebx
+       # 20_39 77 
+       movl    52(%esp),       %eax
+       movl    60(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    20(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    40(%esp),       %ebp
+       xorl    %ebp,           %eax
+       movl    %ecx,           %ebp
+.byte 209
+.byte 192              # roll $1 %eax 
+       xorl    %edx,           %ebp
+       movl    %eax,           52(%esp)
+       xorl    %edi,           %ebp
+       leal    3395469782(%eax,%esi,1),%eax
+       movl    %ebx,           %esi
+       roll    $5,             %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %ebp,           %esi
+.byte 209
+.byte 201              # rorl $1 %ecx 
+       addl    %esi,           %eax
+       # 20_39 78 
+       movl    56(%esp),       %esi
+       movl    (%esp),         %ebp
+       xorl    %ebp,           %esi
+       movl    24(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    44(%esp),       %ebp
+       xorl    %ebp,           %esi
+       movl    %ebx,           %ebp
+.byte 209
+.byte 198              # roll $1 %esi 
+       xorl    %ecx,           %ebp
+       movl    %esi,           56(%esp)
+       xorl    %edx,           %ebp
+       leal    3395469782(%esi,%edi,1),%esi
+       movl    %eax,           %edi
+       roll    $5,             %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %ebp,           %edi
+.byte 209
+.byte 203              # rorl $1 %ebx 
+       addl    %edi,           %esi
+       # 20_39 79 
+       movl    60(%esp),       %edi
+       movl    4(%esp),        %ebp
+       xorl    %ebp,           %edi
+       movl    28(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    48(%esp),       %ebp
+       xorl    %ebp,           %edi
+       movl    %eax,           %ebp
+.byte 209
+.byte 199              # roll $1 %edi 
+       xorl    %ebx,           %ebp
+       movl    %edi,           60(%esp)
+       xorl    %ecx,           %ebp
+       leal    3395469782(%edi,%edx,1),%edi
+       movl    %esi,           %edx
+       roll    $5,             %edx
+       addl    %ebp,           %edx
+       movl    92(%esp),       %ebp
+.byte 209
+.byte 200              # rorl $1 %eax 
+       addl    %edx,           %edi
+.byte 209
+.byte 200              # rorl $1 %eax 
+       # End processing 
+
+       movl    12(%ebp),       %edx
+       addl    %ebx,           %edx
+       movl    4(%ebp),        %ebx
+       addl    %esi,           %ebx
+       movl    %eax,           %esi
+       movl    (%ebp),         %eax
+       movl    %edx,           12(%ebp)
+       addl    %edi,           %eax
+       movl    16(%ebp),       %edi
+       addl    %ecx,           %edi
+       movl    8(%ebp),        %ecx
+       addl    %esi,           %ecx
+       movl    %eax,           (%ebp)
+       movl    64(%esp),       %esi
+       movl    %ecx,           8(%ebp)
+       addl    $64,            %esi
+       movl    68(%esp),       %eax
+       movl    %edi,           16(%ebp)
+       cmpl    %esi,           %eax
+       movl    %ebx,           4(%ebp)
+       jl      .L001end
+       movl    (%esi),         %eax
+       jmp     .L000start
+.L001end:
+       addl    $72,            %esp
+       popl    %edi
+       popl    %ebx
+       popl    %ebp
+       popl    %esi
+       ret
+.sha1_block_x86_end:
+       .size   sha1_block_x86,.sha1_block_x86_end-sha1_block_x86
+.ident "desasm.pl"
index 2b0ae1f0d444515ccba830d328e65bbcd2febd31..32449ac34b364fe84209b83fa3f6208cf8be9198 100644 (file)
@@ -63,7 +63,7 @@
 #include "sha.h"
 #include "sha_locl.h"
 
-char *SHA1_version="SHA1 part of SSLeay 0.9.0b 29-Jun-1998";
+char *SHA1_version="SHA1 part of SSLeay 0.9.1a 06-Jul-1998";
 
 /* Implemented from SHA-1 document - The Secure Hash Algorithm
  */
@@ -197,7 +197,7 @@ unsigned long len;
         */
 #if 1
 #if defined(B_ENDIAN) || defined(SHA1_ASM)
-       if ((((unsigned int)data)%sizeof(ULONG)) == 0)
+       if ((((unsigned long)data)%sizeof(ULONG)) == 0)
                {
                sw=len/SHA_CBLOCK;
                if (sw)
index 8ed533ea26d7428b173fc8c764ca7fe01e56474a..7c8434ff30d95e1bd6d8437fd007a6e15833a741 100644 (file)
@@ -63,7 +63,7 @@
 #include "sha.h"
 #include "sha_locl.h"
 
-char *SHA_version="SHA part of SSLeay 0.9.0b 29-Jun-1998";
+char *SHA_version="SHA part of SSLeay 0.9.1a 06-Jul-1998";
 
 /* Implemented from SHA-0 document - The Secure Hash Algorithm
  */
@@ -178,7 +178,7 @@ unsigned long len;
         */
 #if 1
 #if defined(B_ENDIAN) || defined(SHA_ASM)
-       if ((((unsigned int)data)%sizeof(ULONG)) == 0)
+       if ((((unsigned long)data)%sizeof(ULONG)) == 0)
                {
                sw=len/SHA_CBLOCK;
                if (sw)
index 610ccbb756e28797c06f54a98425359053959707..1e29adfb91db666e9127b60279b8fdb148488fd9 100644 (file)
@@ -72,7 +72,7 @@
 #undef MIN_NODES
 #define MIN_NODES      4
 
-char *STACK_version="STACK part of SSLeay 0.9.0b 29-Jun-1998";
+char *STACK_version="STACK part of SSLeay 0.9.1a 06-Jul-1998";
 
 #ifndef NOPROTO
 #define        FP_ICC  (int (*)(const void *,const void *))
diff --git a/crypto/threads/f b/crypto/threads/f
new file mode 100644 (file)
index 0000000..e69de29
index b93799fc033e3f3eaf17966ce794406ff4b29e0d..a5b1c8b6c3102cddbcf0ca7c1404c8ff9123e626 100644 (file)
  */
 #include <stdio.h>
 #include <stdlib.h>
+#include "cryptlib.h"
+#include "tmdiff.h"
+
+#ifdef TIMEB
+#undef WIN32
+#undef TIMES
+#endif
 
 #ifndef MSDOS
 #  ifndef WIN32
-#  define TIMES
+#    define TIMES
 #  endif
 #endif
 
@@ -82,7 +89,8 @@
                }
 #endif /* VMS */
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
@@ -126,11 +134,11 @@ typedef struct ms_tm
 #endif
        } MS_TM;
 
-char *ms_time_init()
+char *ms_time_new()
        {
        MS_TM *ret;
 
-       ret=malloc(sizeof(MS_TM));
+       ret=(MS_TM *)Malloc(sizeof(MS_TM));
        if (ret == NULL)
                return(NULL);
        memset(ret,0,sizeof(MS_TM));
@@ -140,28 +148,28 @@ char *ms_time_init()
        return((char *)ret);
        }
 
-void ms_time_final(a)
+void ms_time_free(a)
 char *a;
        {
        if (a != NULL)
-               free(a);
+               Free(a);
        }
 
 void ms_time_get(a)
 char *a;
        {
        MS_TM *tm=(MS_TM *)a;
-    FILETIME tmpa,tmpb,tmpc;
+#ifdef WIN32
+       FILETIME tmpa,tmpb,tmpc;
+#endif
 
 #ifdef TIMES
-    printf("AAA\n");
        times(&tm->ms_tms);
 #else
 #  ifdef WIN32
        GetThreadTimes(tm->thread_id,&tmpa,&tmpb,&tmpc,&(tm->ms_win32));
 #  else
-    printf("CCC\n");
-       ftime(tm->ms_timeb);
+       ftime(&tm->ms_timeb);
 #  endif
 #endif
        }
@@ -177,12 +185,20 @@ char *ap,*bp;
        ret=(b->ms_tms.tms_utime-a->ms_tms.tms_utime)/HZ;
 #else
 # ifdef WIN32
-       ret =(double)(b->ms_win32.dwHighDateTime&0x000fffff)*10+
-               b->ms_win32.dwLowDateTime/1e7;
-       ret-=(double)(a->ms_win32.dwHighDateTime&0x000fffff)*10+a->ms_win32.dwLowDateTime/1e7;
+       {
+       signed _int64 la,lb;
+       la=a->ms_win32.dwHighDateTime;
+       lb=b->ms_win32.dwHighDateTime;
+       la<<=32;
+       lb<<=32;
+       la+=a->ms_win32.dwLowDateTime;
+       lb+=b->ms_win32.dwLowDateTime;
+       ret=((double)(lb-la))/1e7;
+       }
 # else
-       ret=     (double)(b->time-a->time)+
-               ((double)((unsigned long)b->mullitm-(unsigned long)))/1000.0;
+       ret=     (double)(b->ms_timeb.time-a->ms_timeb.time)+
+               (((double)b->ms_timeb.millitm)-
+               ((double)a->ms_timeb.millitm))/1000.0;
 #  endif
 #endif
        return((ret < 0.0000001)?0.0000001:ret);
@@ -202,8 +218,8 @@ char *ap,*bp;
        d =(b->ms_win32.dwHighDateTime&0x000fffff)*10+b->ms_win32.dwLowDateTime/1e7;
        d-=(a->ms_win32.dwHighDateTime&0x000fffff)*10+a->ms_win32.dwLowDateTime/1e7;
 # else
-       d=       (double)(b->time-a->time)+
-               ((double)((unsigned long)b->mullitm-(unsigned long)))/1000.0;
+       d=       (double)(b->ms_timeb.time-a->ms_timeb.time)+
+               (((double)b->ms_timeb.millitm)-(double)a->ms_timeb.millitm)/1000.0;
 #  endif
 #endif
        if (d == 0.0)
diff --git a/crypto/tmdiff.h b/crypto/tmdiff.h
new file mode 100644 (file)
index 0000000..4561211
--- /dev/null
@@ -0,0 +1,91 @@
+/* crypto/tmdiff.h */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+/* Header for dynamic hash table routines
+ * Author - Eric Young
+ */
+
+#ifndef HEADER_TMDIFF_H
+#define HEADER_TMDIFF_H
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#ifndef NOPROTO
+char *ms_time_new(void );
+void ms_time_free(char *a);
+void ms_time_get(char *a);
+double ms_time_diff(char *start,char *end);
+int ms_time_cmp(char *ap,char *bp);
+
+#else
+
+char *ms_time_new();
+void ms_time_free();
+void ms_time_get();
+double ms_time_diff();
+int ms_time_cmp();
+#endif
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif
+
index e34ce4efa9d558644aefb38a630607ee022de278..c7044684ec5104590f1dc4b68046a18632cd87af 100644 (file)
@@ -66,7 +66,7 @@
 #undef BUFSIZE
 #define BUFSIZE        512
 
-char *TXT_DB_version="TXT_DB part of SSLeay 0.9.0b 29-Jun-1998";
+char *TXT_DB_version="TXT_DB part of SSLeay 0.9.1a 06-Jul-1998";
 
 TXT_DB *TXT_DB_read(in,num)
 BIO *in;
index f685aa4c71d6811df230b8fbbc6adcba71b2594e..fcf30f74529fd284f290268a80bfde6f68e4e459 100644 (file)
@@ -174,6 +174,7 @@ unsigned int use;
                                key_usage_data[i].name);
                        first=0;
                        }
+               break;
                }
        return(1);
        }
index 95114f7c43f04207e91e70a8814b4bcf4df5c9b6..4ae05bc0dee025f0503891047e1bfe89556a4989 100644 (file)
@@ -355,6 +355,9 @@ typedef struct CBCParameter_st
 
 #define X509_dup(x509) (X509 *)ASN1_dup((int (*)())i2d_X509, \
                (char *(*)())d2i_X509,(char *)x509)
+#define X509_ATTRIBUTE_dup(xa) (X509_ATTRIBUTE *)ASN1_dup(\
+               (int (*)())i2d_X509_ATTRIBUTE, \
+               (char *(*)())d2i_X509_ATTRIBUTE,(char *)xa)
 #define X509_EXTENSION_dup(ex) (X509_EXTENSION *)ASN1_dup( \
                (int (*)())i2d_X509_EXTENSION, \
                (char *(*)())d2i_X509_EXTENSION,(char *)ex)
@@ -442,6 +445,9 @@ typedef struct CBCParameter_st
 #define i2d_DSAPrivateKey_bio(bp,dsa) ASN1_i2d_bio(i2d_DSAPrivateKey,bp, \
                (unsigned char *)dsa)
 
+#define X509_ALGOR_dup(xn) (X509_ALGOR *)ASN1_dup((int (*)())i2d_X509_ALGOR,\
+               (char *(*)())d2i_X509_ALGOR,(char *)xn)
+
 #define X509_NAME_dup(xn) (X509_NAME *)ASN1_dup((int (*)())i2d_X509_NAME, \
                (char *(*)())d2i_X509_NAME,(char *)xn)
 #define X509_NAME_ENTRY_dup(ne) (X509_NAME_ENTRY *)ASN1_dup( \
@@ -453,10 +459,12 @@ typedef struct CBCParameter_st
        ASN1_digest((int (*)())i2d_X509,type,(char *)data,md,len)
 #define X509_NAME_digest(data,type,md,len) \
        ASN1_digest((int (*)())i2d_X509_NAME,type,(char *)data,md,len)
+#ifndef PKCS7_ISSUER_AND_SERIAL_digest
 #define PKCS7_ISSUER_AND_SERIAL_digest(data,type,md,len) \
        ASN1_digest((int (*)())i2d_PKCS7_ISSUER_AND_SERIAL,type,\
                (char *)data,md,len)
 #endif
+#endif
 
 #define X509_EXT_PACK_UNKNOWN  1
 #define X509_EXT_PACK_STRING   2
@@ -528,9 +536,11 @@ int i2d_RSAPublicKey_bio(BIO *bp,RSA *rsa);
 #endif
 
 X509 *X509_dup(X509 *x509);
+X509_ATTRIBUTE *X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa);
 X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *ex);
 X509_CRL *X509_CRL_dup(X509_CRL *crl);
 X509_REQ *X509_REQ_dup(X509_REQ *req);
+X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn);
 X509_NAME *X509_NAME_dup(X509_NAME *xn);
 X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne);
 RSA *RSAPublicKey_dup(RSA *rsa);
@@ -595,6 +605,8 @@ void                X509_ATTRIBUTE_free(X509_ATTRIBUTE *a);
 int            i2d_X509_ATTRIBUTE(X509_ATTRIBUTE *a,unsigned char **pp);
 X509_ATTRIBUTE *d2i_X509_ATTRIBUTE(X509_ATTRIBUTE **a,unsigned char **pp,
                        long length);
+X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, char *value);
+
 
 X509_EXTENSION *X509_EXTENSION_new(void );
 void           X509_EXTENSION_free(X509_EXTENSION *a);
@@ -852,6 +864,7 @@ RSA *d2i_RSAPublicKey_bio();
 int i2d_RSAPublicKey_bio();
 
 X509 *X509_dup();
+X509_ATTRIBUTE *X509_ATTRIBUTE_dup();
 X509_EXTENSION *X509_EXTENSION_dup();
 X509_CRL *X509_CRL_dup();
 X509_REQ *X509_REQ_dup();
@@ -913,6 +926,7 @@ X509_ATTRIBUTE *X509_ATTRIBUTE_new();
 void           X509_ATTRIBUTE_free();
 int            i2d_X509_ATTRIBUTE();
 X509_ATTRIBUTE *d2i_X509_ATTRIBUTE();
+X509_ATTRIBUTE *X509_ATTRIBUTE_create();
 
 X509_EXTENSION *X509_EXTENSION_new();
 void           X509_EXTENSION_free();
index f9d9510ac50762a0541030bc428ab0a8177950b3..ea6a65d2a198dc9ed01a5f7860d728eaa9fb2a4a 100644 (file)
@@ -255,3 +255,47 @@ X509_NAME *name;
        return(NULL);
        }
 
+EVP_PKEY *X509_get_pubkey(x)
+X509 *x;
+       {
+       if ((x == NULL) || (x->cert_info == NULL))
+               return(NULL);
+       return(X509_PUBKEY_get(x->cert_info->key));
+       }
+
+int X509_check_private_key(x,k)
+X509 *x;
+EVP_PKEY *k;
+       {
+       EVP_PKEY *xk=NULL;
+       int ok=0;
+
+       xk=X509_get_pubkey(x);
+       if (xk->type != k->type) goto err;
+       switch (k->type)
+               {
+#ifndef NO_RSA
+       case EVP_PKEY_RSA:
+               if (BN_cmp(xk->pkey.rsa->n,k->pkey.rsa->n) != 0) goto err;
+               if (BN_cmp(xk->pkey.rsa->e,k->pkey.rsa->e) != 0) goto err;
+               break;
+#endif
+#ifndef NO_DSA
+       case EVP_PKEY_DSA:
+               if (BN_cmp(xk->pkey.dsa->pub_key,k->pkey.dsa->pub_key) != 0)
+                       goto err;
+               break;
+#endif
+#ifndef NO_DH
+       case EVP_PKEY_DH:
+               /* No idea */
+               goto err;
+#endif
+       default:
+               goto err;
+               }
+
+       ok=1;
+err:
+       return(ok);
+       }
index 9304721612f960f85c2119e562dc19f419a8d3c2..0c7e30b2c9757f48631f248668eab2fada4a89c5 100644 (file)
@@ -118,8 +118,8 @@ void ERR_load_X509_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_X509,X509_str_functs);
index 2c7e10a46e37c7dc6df5a8de6f82373959ae8667..a740510b076ab975a83595d6fd5dd4e946f9a774 100644 (file)
@@ -109,7 +109,7 @@ int X509_LOOKUP_shutdown(ctx)
 X509_LOOKUP *ctx;
        {
        if (ctx->method == NULL) return(0);
-       if (ctx->method->init != NULL)
+       if (ctx->method->shutdown != NULL)
                return(ctx->method->shutdown(ctx));
        else
                return(1);
@@ -318,7 +318,7 @@ X509_OBJECT *ret;
        X509_OBJECT stmp,*tmp;
        int i,j;
 
-       tmp=X509_OBJECT_retrive_by_subject(ctx->certs,type,name);
+       tmp=X509_OBJECT_retrieve_by_subject(ctx->certs,type,name);
 
        if (tmp == NULL)
                {
@@ -381,7 +381,7 @@ X509_OBJECT *a;
                }
        }
 
-X509_OBJECT *X509_OBJECT_retrive_by_subject(h,type,name)
+X509_OBJECT *X509_OBJECT_retrieve_by_subject(h,type,name)
 LHASH *h;
 int type;
 X509_NAME *name;
index 6aec2427f78bd29e3a184b670f7d1f2e7a205c13..2d8721306cde1e5240f9d82f9d68ef9c9f581473 100644 (file)
@@ -72,8 +72,6 @@ int days;
 EVP_PKEY *pkey;
        {
        X509 *ret=NULL;
-       int er=1;
-       X509_REQ_INFO *ri=NULL;
        X509_CINF *xi=NULL;
        X509_NAME *xn;
 
@@ -84,13 +82,9 @@ EVP_PKEY *pkey;
                }
 
        /* duplicate the request */
-       ri=(X509_REQ_INFO *)ASN1_dup(i2d_X509_REQ_INFO,
-               (char *(*)())d2i_X509_REQ_INFO,(char *)r->req_info);
-       if (ri == NULL) goto err;
-
        xi=ret->cert_info;
 
-       if (sk_num(ri->attributes) != 0)
+       if (sk_num(r->req_info->attributes) != 0)
                {
                if ((xi->version=ASN1_INTEGER_new()) == NULL) goto err;
                if (!ASN1_INTEGER_set(xi->version,2)) goto err;
@@ -109,13 +103,11 @@ EVP_PKEY *pkey;
 
        if (!X509_sign(ret,pkey,EVP_md5()))
                goto err;
-       er=0;
-err:
-       if (er)
+       if (0)
                {
+err:
                X509_free(ret);
-               X509_REQ_INFO_free(ri);
-               return(NULL);
+               ret=NULL;
                }
        return(ret);
        }
index c1be91edba5a3331731e8dd18069c43b6881e373..1d62f2df9398b0c337d994650aa5d424e0740f40 100644 (file)
@@ -80,7 +80,7 @@ static int null_callback();
 static int internal_verify();
 #endif
 
-char *X509_version="X509 part of SSLeay 0.9.0b 29-Jun-1998";
+char *X509_version="X509 part of SSLeay 0.9.1a 06-Jul-1998";
 static STACK *x509_store_ctx_method=NULL;
 static int x509_store_ctx_num=0;
 #if 0
@@ -285,7 +285,11 @@ X509_STORE_CTX *ctx;
                ok=ctx->ctx->verify(ctx);
        else
                ok=internal_verify(ctx);
+       if (0)
+               {
 end:
+               X509_get_pubkey_parameters(NULL,ctx->chain);
+               }
        if (sktmp != NULL) sk_free(sktmp);
        if (chain_ss != NULL) X509_free(chain_ss);
        return(ok);
@@ -434,7 +438,7 @@ ASN1_UTCTIME *ctm;
                offset=((str[1]-'0')*10+(str[2]-'0'))*60;
                offset+=(str[3]-'0')*10+(str[4]-'0');
                if (*str == '-')
-                       offset=-offset;
+                       offset= -offset;
                }
        atm.type=V_ASN1_UTCTIME;
        atm.length=sizeof(buff2);
@@ -509,51 +513,6 @@ STACK *chain;
        return(1);
        }
 
-EVP_PKEY *X509_get_pubkey(x)
-X509 *x;
-       {
-       if ((x == NULL) || (x->cert_info == NULL))
-               return(NULL);
-       return(X509_PUBKEY_get(x->cert_info->key));
-       }
-
-int X509_check_private_key(x,k)
-X509 *x;
-EVP_PKEY *k;
-       {
-       EVP_PKEY *xk=NULL;
-       int ok=0;
-
-       xk=X509_get_pubkey(x);
-       if (xk->type != k->type) goto err;
-       switch (k->type)
-               {
-#ifndef NO_RSA
-       case EVP_PKEY_RSA:
-               if (BN_cmp(xk->pkey.rsa->n,k->pkey.rsa->n) != 0) goto err;
-               if (BN_cmp(xk->pkey.rsa->e,k->pkey.rsa->e) != 0) goto err;
-               break;
-#endif
-#ifndef NO_DSA
-       case EVP_PKEY_DSA:
-               if (BN_cmp(xk->pkey.dsa->pub_key,k->pkey.dsa->pub_key) != 0)
-                       goto err;
-               break;
-#endif
-#ifndef NO_DH
-       case EVP_PKEY_DH:
-               /* No idea */
-               goto err;
-#endif
-       default:
-               goto err;
-               }
-
-       ok=1;
-err:
-       return(ok);
-       }
-
 int X509_STORE_add_cert(ctx,x)
 X509_STORE *ctx;
 X509 *x;
index dfc060f89986417935de79beb3f9267d523220ed..6849a8c749b395f1ac48110af048984e1ad6c298 100644 (file)
@@ -245,7 +245,7 @@ X509_LOOKUP_METHOD *X509_LOOKUP_dir();
 
 #ifndef NOPROTO
 #ifdef HEADER_LHASH_H
-X509_OBJECT *X509_OBJECT_retrive_by_subject(LHASH *h,int type,X509_NAME *name);
+X509_OBJECT *X509_OBJECT_retrieve_by_subject(LHASH *h,int type,X509_NAME *name);
 #endif
 void X509_OBJECT_up_ref_count(X509_OBJECT *a);
 void X509_OBJECT_free_contents(X509_OBJECT *a);
@@ -313,7 +313,7 @@ void        X509_STORE_CTX_set_chain(X509_STORE_CTX *c,STACK /* X509 */ *sk);
 #else
 
 #ifdef HEADER_LHASH_H
-X509_OBJECT *X509_OBJECT_retrive_by_subject();
+X509_OBJECT *X509_OBJECT_retrieve_by_subject();
 #endif
 void X509_OBJECT_up_ref_count();
 void X509_OBJECT_free_contents();
@@ -359,6 +359,7 @@ int X509_STORE_load_locations ();
 int    X509_STORE_set_default_paths();
 #endif
 
+int X509_STORE_CTX_get_ex_new_index();
 int    X509_STORE_CTX_set_ex_data();
 char * X509_STORE_CTX_get_ex_data();
 int    X509_STORE_CTX_get_error();
index b7dde23e9a90d50b1907bc47aa83dcdeeb6fda6e..682de167f7b77328a68e49a97b07e4583b7f03cc 100644 (file)
@@ -133,6 +133,13 @@ EVP_MD *md;
                x->signature, (char *)x->spkac,pkey,md));
        }
 
+X509_ATTRIBUTE *X509_ATTRIBUTE_dup(xa)
+X509_ATTRIBUTE *xa;
+       {
+       return((X509_ATTRIBUTE *)ASN1_dup((int (*)())i2d_X509_ATTRIBUTE,
+               (char *(*)())d2i_X509_ATTRIBUTE,(char *)xa));
+       }
+
 X509 *X509_dup(x509)
 X509 *x509;
        {
@@ -421,6 +428,13 @@ DSA *dsa;
        }
 #endif
 
+X509_ALGOR *X509_ALGOR_dup(xn)
+X509_ALGOR *xn;
+       {
+       return((X509_ALGOR *)ASN1_dup((int (*)())i2d_X509_ALGOR,
+       (char *(*)())d2i_X509_ALGOR,(char *)xn));
+       }
+
 X509_NAME *X509_NAME_dup(xn)
 X509_NAME *xn;
        {
index 8a667f5911781ea5ee3ef796f10f050cd0869327..68296da806be92fe7325e0cf1dacee6ec30d2476 100644 (file)
@@ -48,7 +48,7 @@ char *argv[];
 
        /* Lets use a connect BIO under the SSL BIO */
        out=BIO_new(BIO_s_connect());
-       BIO_set_hostname(out,host);
+       BIO_set_conn_hostname(out,host);
        BIO_set_nbio(out,1);
        out=BIO_push(ssl_bio,out);
 
diff --git a/demos/eay/base64.c b/demos/eay/base64.c
new file mode 100644 (file)
index 0000000..de080f6
--- /dev/null
@@ -0,0 +1,49 @@
+/* This is a simple example of using the base64 BIO to a memory BIO and then
+ * getting the data.
+ */
+#include <stdio.h>
+#include "bio.h"
+#include "evp.h"
+
+main()
+       {
+       int i;
+       BIO *mbio,*b64bio,*bio;
+       char buf[512];
+       char *p;
+
+       mbio=BIO_new(BIO_s_mem());
+       b64bio=BIO_new(BIO_f_base64());
+
+       bio=BIO_push(b64bio,mbio);
+       /* We now have bio pointing at b64->mem, the base64 bio encodes on
+        * write and decodes on read */
+
+       for (;;)
+               {
+               i=fread(buf,1,512,stdin);
+               if (i <= 0) break;
+               BIO_write(bio,buf,i);
+               }
+       /* We need to 'flush' things to push out the encoding of the
+        * last few bytes.  There is special encoding if it is not a
+        * multiple of 3
+        */
+       BIO_flush(bio);
+
+       printf("We have %d bytes available\n",BIO_pending(mbio));
+
+       /* We will now get a pointer to the data and the number of elements. */
+       /* hmm... this one was not defined by a macro in bio.h, it will be for
+        * 0.9.1.  The other option is too just read from the memory bio.
+        */
+       i=(int)BIO_ctrl(mbio,BIO_CTRL_INFO,0,(char *)&p);
+
+       printf("%d\n",i);
+       fwrite("---\n",1,4,stdout);
+       fwrite(p,1,i,stdout);
+       fwrite("---\n",1,4,stdout);
+
+       /* This call will walk the chain freeing all the BIOs */
+       BIO_free_all(bio);
+       }
diff --git a/demos/eay/conn.c b/demos/eay/conn.c
new file mode 100644 (file)
index 0000000..f44fc7f
--- /dev/null
@@ -0,0 +1,105 @@
+/* NOCW */
+/* demos/eay/conn.c */
+
+/* A minimal program to connect to a port using the sock4a protocol.
+ *
+ * cc -I../../include conn.c -L../.. -lcrypto
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include "err.h"
+#include "bio.h"
+#include "proxy.h"
+
+extern int errno;
+
+int main(argc,argv)
+int argc;
+char *argv[];
+       {
+       PROXY *pxy;
+       char *host;
+       char buf[1024*10],*p;
+       BIO *bio;
+       int i,len,off,ret=1;
+
+       if (argc <= 1)
+               host="localhost:4433";
+       else
+               host=argv[1];
+
+       /* Lets get nice error messages */
+       ERR_load_crypto_strings();
+
+       /* First, configure proxy settings */
+       pxy=PROXY_new();
+       PROXY_add_server(pxy,PROXY_PROTOCOL_SOCKS,"gromit:1080");
+
+       bio=BIO_new(BIO_s_socks4a_connect());
+
+       BIO_set_conn_hostname(bio,host);
+       BIO_set_proxies(bio,pxy);
+       BIO_set_socks_userid(bio,"eay");
+       BIO_set_nbio(bio,1);
+
+       p="GET / HTTP/1.0\r\n\r\n";
+       len=strlen(p);
+
+       off=0;
+       for (;;)
+               {
+               i=BIO_write(bio,&(p[off]),len);
+               if (i <= 0)
+                       {
+                       if (BIO_should_retry(bio))
+                               {
+                               fprintf(stderr,"write DELAY\n");
+                               sleep(1);
+                               continue;
+                               }
+                       else
+                               {
+                               goto err;
+                               }
+                       }
+               off+=i;
+               len-=i;
+               if (len <= 0) break;
+               }
+
+       for (;;)
+               {
+               i=BIO_read(bio,buf,sizeof(buf));
+               if (i == 0) break;
+               if (i < 0)
+                       {
+                       if (BIO_should_retry(bio))
+                               {
+                               fprintf(stderr,"read DELAY\n");
+                               sleep(1);
+                               continue;
+                               }
+                       goto err;
+                       }
+               fwrite(buf,1,i,stdout);
+               }
+
+       ret=1;
+
+       if (0)
+               {
+err:
+               if (ERR_peek_error() == 0) /* system call error */
+                       {
+                       fprintf(stderr,"errno=%d ",errno);
+                       perror("error");
+                       }
+               else
+                       ERR_print_errors_fp(stderr);
+               }
+       BIO_free_all(bio);
+       if (pxy != NULL) PROXY_free(pxy);
+       exit(!ret);
+       return(ret);
+       }
+
diff --git a/demos/eay/loadrsa.c b/demos/eay/loadrsa.c
new file mode 100644 (file)
index 0000000..91e62d7
--- /dev/null
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include "rsa.h"
+
+/* This is a simple program to generate an RSA private key.  It then
+ * saves both the public and private key into a char array, then
+ * re-reads them.  It saves them as DER encoded binary data.
+ */
+
+void callback(stage,count,arg)
+int stage,count;
+char *arg;
+       {
+       FILE *out;
+
+       out=(FILE *)arg;
+       fprintf(out,"%d",stage);
+       if (stage == 3)
+               fprintf(out,"\n");
+       fflush(out);
+       }
+
+main()
+       {
+       RSA *rsa,*pub_rsa,*priv_rsa;
+       int len;
+       unsigned char buf[1024],*p;
+
+       rsa=RSA_generate_key(512,RSA_F4,callback,(char *)stdout);
+
+       p=buf;
+
+       /* Save the public key into buffer, we know it will be big enough
+        * but we should really check how much space we need by calling the
+        * i2d functions with a NULL second parameter */
+       len=i2d_RSAPublicKey(rsa,&p);
+       len+=i2d_RSAPrivateKey(rsa,&p);
+
+       printf("The public and private key are now both in a char array\n");
+       printf("and are taking up %d bytes\n",len);
+
+       RSA_free(rsa);
+
+       p=buf;
+       pub_rsa=d2i_RSAPublicKey(NULL,&p,(long)len);
+       len-=(p-buf);
+       priv_rsa=d2i_RSAPrivateKey(NULL,&p,(long)len);
+
+       if ((pub_rsa == NULL) || (priv_rsa == NULL))
+               ERR_print_errors_fp(stderr);
+
+       RSA_free(pub_rsa);
+       RSA_free(priv_rsa);
+       }
index 8c5550c37c9d77e1821e022bec23452c045e22f0..85cd7a3ff93ffd13ef862ffd4137097ba907a33e 100644 (file)
--- a/dep/files
+++ b/dep/files
 ./apps/rsa.c                   APPS
 ./apps/sess_id.c               APPS
 ./apps/s_apps.h                        APPS
-./apps/s_args.c                        APPS
-./apps/s_cache.c               APPS
 ./apps/s_cb.c                  APPS
 ./apps/s_client.c              APPS
-./apps/s_eio.c                 APPS
-./apps/s_eio.h                 APPS
-./apps/s_filter.c              APPS
-./apps/s_filter.h              APPS
 ./apps/s_server.c              APPS
 ./apps/s_socket.c              APPS
-./apps/s_state.c               APPS
-./apps/s_state.h               APPS
 ./apps/s_time.c                        APPS
 ./apps/testdsa.h               APPS
 ./apps/testrsa.h               APPS
diff --git a/e_os.h b/e_os.h
index 3d142ec2ba515c0df3da1a31f2bb2ce93dd32285..510db0e9ac5dae434cf306014e66726267970dcb 100644 (file)
--- a/e_os.h
+++ b/e_os.h
@@ -110,10 +110,16 @@ extern "C" {
 #ifdef WINDOWS
 #define get_last_socket_error()        WSAGetLastError()
 #define clear_socket_error()   WSASetLastError(0)
+#define readsocket(s,b,n)      recv((s),(b),(n),0)
+#define writesocket(s,b,n)     send((s),(b),(n),0)
+#define EADDRINUSE             WSAEADDRINUSE
 #else
 #define get_last_socket_error()        errno
 #define clear_socket_error()   errno=0
 #define ioctlsocket(a,b,c)     ioctl(a,b,c)
+#define closesocket(s)         close(s)
+#define readsocket(s,b,n)      read((s),(b),(n))
+#define writesocket(s,b,n)     write((s),(b),(n))
 #endif
 
 #ifdef WIN16
@@ -251,7 +257,7 @@ extern HINSTANCE _hInstance;
 #    define SSLeay_Write(a,b,c)    write((a),(b),(c))
 #    define SHUTDOWN(fd)    { shutdown((fd),0); close((fd)); }
 #    define SHUTDOWN2(fd)   { shutdown((fd),2); close((fd)); }
-#    define INVALID_SOCKET     -1
+#    define INVALID_SOCKET     (-1)
 #  endif
 #endif
 
index b0931e0d6f4915c927608c8f2092e021d621c52e..a0aaaf9476a52fbc6be563838703f878df2154c5 100644 (file)
@@ -14,6 +14,7 @@
 INSTALLTOP=/usr/local/ssl
 
 # Set your compiler options
+PLATFORM=
 CC=cc
 CFLAG=-O -DTERMIO
 APP_CFLAG=
@@ -35,8 +36,6 @@ BN_MULW_OBJ=
 BN_MULW_SRC=
 DES_ENC_OBJ=
 DES_ENC_SRC=
-DES_CRYPT_OBJ=
-DES_CRYPT_SRC=
 BF_ENC_OBJ=
 BF_ENC_SRC=
 CAST_ENC_OBJ=
@@ -96,7 +95,7 @@ SO_CRYPTO= lib$(CRYPTO)
 L_SSL=     $(LIB_D)/$(SSL).a
 L_CRYPTO=  $(LIB_D)/$(CRYPTO).a
 
-L_LIBS= $(L_SSL) $(L_CRYPTO)
+L_LIBS= $(O_SSL) $(O_CRYPTO)
 #L_LIBS= $(O_SSL) $(O_RSAGLUE) -lrsaref $(O_CRYPTO)
 
 ######################################################
@@ -120,21 +119,22 @@ HEADER=$(INCL_D)/cryptlib.h \
        $(INCL_D)/cast_lcl.h $(INCL_D)/bn_lcl.h $(INCL_D)/bn_prime.h \
        $(INCL_D)/obj_dat.h $(INCL_D)/conf_lcl.h $(INCL_D)/ssl_locl.h \
        $(INCL_D)/rsaref.h $(INCL_D)/apps.h $(INCL_D)/progs.h \
-       $(INCL_D)/s_apps.h $(INCL_D)/testdsa.h $(INCL_D)/testrsa.h
+       $(INCL_D)/testdsa.h $(INCL_D)/testrsa.h
 
 EXHEADER=$(INC_D)/e_os.h \
-       $(INC_D)/crypto.h $(INC_D)/cryptall.h $(INC_D)/md2.h \
-       $(INC_D)/md5.h $(INC_D)/sha.h $(INC_D)/mdc2.h \
-       $(INC_D)/hmac.h $(INC_D)/ripemd.h $(INC_D)/des.h \
-       $(INC_D)/rc2.h $(INC_D)/rc4.h $(INC_D)/rc5.h \
-       $(INC_D)/idea.h $(INC_D)/blowfish.h $(INC_D)/cast.h \
-       $(INC_D)/bn.h $(INC_D)/rsa.h $(INC_D)/dsa.h \
-       $(INC_D)/dh.h $(INC_D)/buffer.h $(INC_D)/bio.h \
-       $(INC_D)/bss_file.c $(INC_D)/stack.h $(INC_D)/lhash.h \
-       $(INC_D)/rand.h $(INC_D)/err.h $(INC_D)/objects.h \
-       $(INC_D)/evp.h $(INC_D)/pem.h $(INC_D)/asn1.h \
-       $(INC_D)/asn1_mac.h $(INC_D)/x509.h $(INC_D)/x509_vfy.h \
-       $(INC_D)/conf.h $(INC_D)/txt_db.h $(INC_D)/pkcs7.h \
+       $(INC_D)/crypto.h $(INC_D)/cryptall.h $(INC_D)/tmdiff.h \
+       $(INC_D)/md2.h $(INC_D)/md5.h $(INC_D)/sha.h \
+       $(INC_D)/mdc2.h $(INC_D)/hmac.h $(INC_D)/ripemd.h \
+       $(INC_D)/des.h $(INC_D)/rc2.h $(INC_D)/rc4.h \
+       $(INC_D)/rc5.h $(INC_D)/idea.h $(INC_D)/blowfish.h \
+       $(INC_D)/cast.h $(INC_D)/bn.h $(INC_D)/rsa.h \
+       $(INC_D)/dsa.h $(INC_D)/dh.h $(INC_D)/buffer.h \
+       $(INC_D)/bio.h $(INC_D)/bss_file.c $(INC_D)/stack.h \
+       $(INC_D)/lhash.h $(INC_D)/rand.h $(INC_D)/err.h \
+       $(INC_D)/objects.h $(INC_D)/evp.h $(INC_D)/pem.h \
+       $(INC_D)/asn1.h $(INC_D)/asn1_mac.h $(INC_D)/x509.h \
+       $(INC_D)/x509_vfy.h $(INC_D)/conf.h $(INC_D)/txt_db.h \
+       $(INC_D)/pkcs7.h $(INC_D)/proxy.h $(INC_D)/comp.h \
        $(INC_D)/ssl.h $(INC_D)/ssl2.h $(INC_D)/ssl3.h \
        $(INC_D)/ssl23.h $(INC_D)/tls1.h
 
@@ -154,41 +154,42 @@ E_OBJ=$(OBJ_D)/verify.o \
        $(OBJ_D)/crl2p7.o $(OBJ_D)/crl.o $(OBJ_D)/rsa.o \
        $(OBJ_D)/dsa.o $(OBJ_D)/dsaparam.o $(OBJ_D)/x509.o \
        $(OBJ_D)/genrsa.o $(OBJ_D)/s_server.o $(OBJ_D)/s_client.o \
-       $(OBJ_D)/speed.o $(OBJ_D)/s_time.o $(OBJ_D)/apps.o \
-       $(OBJ_D)/s_cb.o $(OBJ_D)/s_socket.o $(OBJ_D)/version.o \
+       $(OBJ_D)/speed.o $(OBJ_D)/s_time.o \
+       $(OBJ_D)/apps.o $(OBJ_D)/s_cb.o $(OBJ_D)/s_socket.o \
+       $(OBJ_D)/bf_perm.o $(OBJ_D)/version.o \
        $(OBJ_D)/sess_id.o $(OBJ_D)/ciphers.o $(OBJ_D)/ssleay.o
 
 CRYPTOOBJ=$(OBJ_D)/cryptlib.o \
        $(OBJ_D)/mem.o $(OBJ_D)/cversion.o $(OBJ_D)/ex_data.o \
-       $(OBJ_D)/cpt_err.o $(OBJ_D)/md2_dgst.o $(OBJ_D)/md2_one.o \
-       $(OBJ_D)/md5_dgst.o $(OBJ_D)/md5_one.o $(OBJ_D)/sha_dgst.o \
-       $(OBJ_D)/sha1dgst.o $(OBJ_D)/sha_one.o $(OBJ_D)/sha1_one.o \
-       $(OBJ_D)/mdc2dgst.o $(OBJ_D)/mdc2_one.o $(OBJ_D)/hmac.o \
-       $(OBJ_D)/rmd_dgst.o $(OBJ_D)/rmd_one.o $(OBJ_D)/set_key.o \
-       $(OBJ_D)/ecb_enc.o $(OBJ_D)/cbc_enc.o $(OBJ_D)/ecb3_enc.o \
-       $(OBJ_D)/cfb64enc.o $(OBJ_D)/cfb64ede.o $(OBJ_D)/cfb_enc.o \
-       $(OBJ_D)/ofb64ede.o $(OBJ_D)/enc_read.o $(OBJ_D)/enc_writ.o \
-       $(OBJ_D)/ofb64enc.o $(OBJ_D)/ofb_enc.o $(OBJ_D)/str2key.o \
-       $(OBJ_D)/pcbc_enc.o $(OBJ_D)/qud_cksm.o $(OBJ_D)/rand_key.o \
-       $(OBJ_D)/des_enc.o $(OBJ_D)/fcrypt_b.o $(OBJ_D)/read2pwd.o \
-       $(OBJ_D)/fcrypt.o $(OBJ_D)/xcbc_enc.o $(OBJ_D)/read_pwd.o \
-       $(OBJ_D)/rpc_enc.o $(OBJ_D)/cbc_cksm.o $(OBJ_D)/supp.o \
-       $(OBJ_D)/rc2_ecb.o $(OBJ_D)/rc2_skey.o $(OBJ_D)/rc2_cbc.o \
-       $(OBJ_D)/rc2cfb64.o $(OBJ_D)/rc2ofb64.o $(OBJ_D)/rc4_skey.o \
-       $(OBJ_D)/rc4_enc.o $(OBJ_D)/rc5_skey.o $(OBJ_D)/rc5_ecb.o \
-       $(OBJ_D)/rc5_enc.o $(OBJ_D)/rc5cfb64.o $(OBJ_D)/rc5ofb64.o \
-       $(OBJ_D)/i_cbc.o $(OBJ_D)/i_cfb64.o $(OBJ_D)/i_ofb64.o \
-       $(OBJ_D)/i_ecb.o $(OBJ_D)/i_skey.o $(OBJ_D)/bf_skey.o \
-       $(OBJ_D)/bf_ecb.o $(OBJ_D)/bf_enc.o $(OBJ_D)/bf_cfb64.o \
-       $(OBJ_D)/bf_ofb64.o $(OBJ_D)/c_skey.o $(OBJ_D)/c_ecb.o \
-       $(OBJ_D)/c_enc.o $(OBJ_D)/c_cfb64.o $(OBJ_D)/c_ofb64.o \
-       $(OBJ_D)/bn_add.o $(OBJ_D)/bn_div.o $(OBJ_D)/bn_exp.o \
-       $(OBJ_D)/bn_lib.o $(OBJ_D)/bn_mod.o $(OBJ_D)/bn_mul.o \
+       $(OBJ_D)/tmdiff.o $(OBJ_D)/cpt_err.o $(OBJ_D)/md2_dgst.o \
+       $(OBJ_D)/md2_one.o $(OBJ_D)/md5_dgst.o $(OBJ_D)/md5_one.o \
+       $(OBJ_D)/sha_dgst.o $(OBJ_D)/sha1dgst.o $(OBJ_D)/sha_one.o \
+       $(OBJ_D)/sha1_one.o $(OBJ_D)/mdc2dgst.o $(OBJ_D)/mdc2_one.o \
+       $(OBJ_D)/hmac.o $(OBJ_D)/rmd_dgst.o $(OBJ_D)/rmd_one.o \
+       $(OBJ_D)/set_key.o $(OBJ_D)/ecb_enc.o $(OBJ_D)/cbc_enc.o \
+       $(OBJ_D)/ecb3_enc.o $(OBJ_D)/cfb64enc.o $(OBJ_D)/cfb64ede.o \
+       $(OBJ_D)/cfb_enc.o $(OBJ_D)/ofb64ede.o $(OBJ_D)/enc_read.o \
+       $(OBJ_D)/enc_writ.o $(OBJ_D)/ofb64enc.o $(OBJ_D)/ofb_enc.o \
+       $(OBJ_D)/str2key.o $(OBJ_D)/pcbc_enc.o $(OBJ_D)/qud_cksm.o \
+       $(OBJ_D)/rand_key.o $(OBJ_D)/des_enc.o $(OBJ_D)/fcrypt_b.o \
+       $(OBJ_D)/read2pwd.o $(OBJ_D)/fcrypt.o $(OBJ_D)/xcbc_enc.o \
+       $(OBJ_D)/read_pwd.o $(OBJ_D)/rpc_enc.o $(OBJ_D)/cbc_cksm.o \
+       $(OBJ_D)/supp.o $(OBJ_D)/rc2_ecb.o $(OBJ_D)/rc2_skey.o \
+       $(OBJ_D)/rc2_cbc.o $(OBJ_D)/rc2cfb64.o $(OBJ_D)/rc2ofb64.o \
+       $(OBJ_D)/rc4_skey.o $(OBJ_D)/rc4_enc.o $(OBJ_D)/rc5_skey.o \
+       $(OBJ_D)/rc5_ecb.o $(OBJ_D)/rc5_enc.o $(OBJ_D)/rc5cfb64.o \
+       $(OBJ_D)/rc5ofb64.o $(OBJ_D)/i_cbc.o $(OBJ_D)/i_cfb64.o \
+       $(OBJ_D)/i_ofb64.o $(OBJ_D)/i_ecb.o $(OBJ_D)/i_skey.o \
+       $(OBJ_D)/bf_skey.o $(OBJ_D)/bf_ecb.o $(OBJ_D)/bf_enc.o \
+       $(OBJ_D)/bf_cfb64.o $(OBJ_D)/bf_ofb64.o $(OBJ_D)/c_skey.o \
+       $(OBJ_D)/c_ecb.o $(OBJ_D)/c_enc.o $(OBJ_D)/c_cfb64.o \
+       $(OBJ_D)/c_ofb64.o $(OBJ_D)/bn_add.o $(OBJ_D)/bn_div.o \
+       $(OBJ_D)/bn_exp.o $(OBJ_D)/bn_lib.o $(OBJ_D)/bn_mul.o \
        $(OBJ_D)/bn_print.o $(OBJ_D)/bn_rand.o $(OBJ_D)/bn_shift.o \
-       $(OBJ_D)/bn_sub.o $(OBJ_D)/bn_word.o $(OBJ_D)/bn_blind.o \
-       $(OBJ_D)/bn_gcd.o $(OBJ_D)/bn_prime.o $(OBJ_D)/bn_err.o \
-       $(OBJ_D)/bn_sqr.o $(OBJ_D)/bn_mulw.o $(OBJ_D)/bn_recp.o \
-       $(OBJ_D)/bn_mont.o $(OBJ_D)/bn_mpi.o $(OBJ_D)/rsa_eay.o \
+       $(OBJ_D)/bn_word.o $(OBJ_D)/bn_blind.o $(OBJ_D)/bn_gcd.o \
+       $(OBJ_D)/bn_prime.o $(OBJ_D)/bn_err.o $(OBJ_D)/bn_sqr.o \
+       $(OBJ_D)/bn_asm.o $(OBJ_D)/bn_recp.o $(OBJ_D)/bn_mont.o \
+       $(OBJ_D)/bn_mpi.o $(OBJ_D)/bn_exp2.o $(OBJ_D)/rsa_eay.o \
        $(OBJ_D)/rsa_gen.o $(OBJ_D)/rsa_lib.o $(OBJ_D)/rsa_sign.o \
        $(OBJ_D)/rsa_saos.o $(OBJ_D)/rsa_err.o $(OBJ_D)/rsa_pk1.o \
        $(OBJ_D)/rsa_ssl.o $(OBJ_D)/rsa_none.o $(OBJ_D)/dsa_gen.o \
@@ -201,9 +202,10 @@ CRYPTOOBJ=$(OBJ_D)/cryptlib.o \
        $(OBJ_D)/bss_file.o $(OBJ_D)/bss_sock.o $(OBJ_D)/bss_conn.o \
        $(OBJ_D)/bf_null.o $(OBJ_D)/bf_buff.o $(OBJ_D)/b_print.o \
        $(OBJ_D)/b_dump.o $(OBJ_D)/b_sock.o $(OBJ_D)/bss_acpt.o \
-       $(OBJ_D)/bf_nbio.o $(OBJ_D)/stack.o $(OBJ_D)/lhash.o \
-       $(OBJ_D)/lh_stats.o $(OBJ_D)/md_rand.o $(OBJ_D)/randfile.o \
-       $(OBJ_D)/err.o $(OBJ_D)/err_all.o $(OBJ_D)/err_prn.o \
+       $(OBJ_D)/bf_nbio.o $(OBJ_D)/bss_cs4a.o $(OBJ_D)/stack.o \
+       $(OBJ_D)/lhash.o $(OBJ_D)/lh_stats.o $(OBJ_D)/md_rand.o \
+       $(OBJ_D)/randfile.o $(OBJ_D)/rand_lib.o $(OBJ_D)/err.o \
+       $(OBJ_D)/err_all.o $(OBJ_D)/err_prn.o $(OBJ_D)/o_names.o \
        $(OBJ_D)/obj_dat.o $(OBJ_D)/obj_lib.o $(OBJ_D)/obj_err.o \
        $(OBJ_D)/encode.o $(OBJ_D)/digest.o $(OBJ_D)/evp_enc.o \
        $(OBJ_D)/evp_key.o $(OBJ_D)/e_ecb_d.o $(OBJ_D)/e_cbc_d.o \
@@ -230,35 +232,38 @@ CRYPTOOBJ=$(OBJ_D)/cryptlib.o \
        $(OBJ_D)/a_utctm.o $(OBJ_D)/a_int.o $(OBJ_D)/a_octet.o \
        $(OBJ_D)/a_print.o $(OBJ_D)/a_type.o $(OBJ_D)/a_set.o \
        $(OBJ_D)/a_dup.o $(OBJ_D)/a_d2i_fp.o $(OBJ_D)/a_i2d_fp.o \
-       $(OBJ_D)/a_sign.o $(OBJ_D)/a_digest.o $(OBJ_D)/a_verify.o \
-       $(OBJ_D)/x_algor.o $(OBJ_D)/x_val.o $(OBJ_D)/x_pubkey.o \
-       $(OBJ_D)/x_sig.o $(OBJ_D)/x_req.o $(OBJ_D)/x_attrib.o \
-       $(OBJ_D)/x_name.o $(OBJ_D)/x_cinf.o $(OBJ_D)/x_x509.o \
-       $(OBJ_D)/x_crl.o $(OBJ_D)/x_info.o $(OBJ_D)/x_spki.o \
-       $(OBJ_D)/d2i_r_pr.o $(OBJ_D)/i2d_r_pr.o $(OBJ_D)/d2i_r_pu.o \
-       $(OBJ_D)/i2d_r_pu.o $(OBJ_D)/d2i_s_pr.o $(OBJ_D)/i2d_s_pr.o \
-       $(OBJ_D)/d2i_s_pu.o $(OBJ_D)/i2d_s_pu.o $(OBJ_D)/d2i_pu.o \
-       $(OBJ_D)/d2i_pr.o $(OBJ_D)/i2d_pu.o $(OBJ_D)/i2d_pr.o \
-       $(OBJ_D)/t_req.o $(OBJ_D)/t_x509.o $(OBJ_D)/t_pkey.o \
-       $(OBJ_D)/p7_i_s.o $(OBJ_D)/p7_signi.o $(OBJ_D)/p7_signd.o \
-       $(OBJ_D)/p7_recip.o $(OBJ_D)/p7_enc_c.o $(OBJ_D)/p7_evp.o \
-       $(OBJ_D)/p7_dgst.o $(OBJ_D)/p7_s_e.o $(OBJ_D)/p7_enc.o \
-       $(OBJ_D)/p7_lib.o $(OBJ_D)/f_int.o $(OBJ_D)/f_string.o \
-       $(OBJ_D)/i2d_dhp.o $(OBJ_D)/i2d_dsap.o $(OBJ_D)/d2i_dhp.o \
-       $(OBJ_D)/d2i_dsap.o $(OBJ_D)/n_pkey.o $(OBJ_D)/a_hdr.o \
-       $(OBJ_D)/x_pkey.o $(OBJ_D)/a_bool.o $(OBJ_D)/x_exten.o \
-       $(OBJ_D)/asn1_par.o $(OBJ_D)/asn1_lib.o $(OBJ_D)/asn1_err.o \
-       $(OBJ_D)/a_meth.o $(OBJ_D)/a_bytes.o $(OBJ_D)/evp_asn1.o \
-       $(OBJ_D)/x509_def.o $(OBJ_D)/x509_d2.o $(OBJ_D)/x509_r2x.o \
-       $(OBJ_D)/x509_cmp.o $(OBJ_D)/x509_obj.o $(OBJ_D)/x509_req.o \
-       $(OBJ_D)/x509_vfy.o $(OBJ_D)/x509_set.o $(OBJ_D)/x509rset.o \
-       $(OBJ_D)/x509_err.o $(OBJ_D)/x509name.o $(OBJ_D)/x509_v3.o \
-       $(OBJ_D)/x509_ext.o $(OBJ_D)/x509pack.o $(OBJ_D)/x509type.o \
-       $(OBJ_D)/x509_lu.o $(OBJ_D)/x_all.o $(OBJ_D)/x509_txt.o \
-       $(OBJ_D)/by_file.o $(OBJ_D)/by_dir.o $(OBJ_D)/v3_net.o \
-       $(OBJ_D)/v3_x509.o $(OBJ_D)/conf.o $(OBJ_D)/conf_err.o \
-       $(OBJ_D)/txt_db.o $(OBJ_D)/pk7_lib.o $(OBJ_D)/pkcs7err.o \
-       $(OBJ_D)/pk7_doit.o
+       $(OBJ_D)/a_bmp.o $(OBJ_D)/a_sign.o $(OBJ_D)/a_digest.o \
+       $(OBJ_D)/a_verify.o $(OBJ_D)/x_algor.o $(OBJ_D)/x_val.o \
+       $(OBJ_D)/x_pubkey.o $(OBJ_D)/x_sig.o $(OBJ_D)/x_req.o \
+       $(OBJ_D)/x_attrib.o $(OBJ_D)/x_name.o $(OBJ_D)/x_cinf.o \
+       $(OBJ_D)/x_x509.o $(OBJ_D)/x_crl.o $(OBJ_D)/x_info.o \
+       $(OBJ_D)/x_spki.o $(OBJ_D)/d2i_r_pr.o $(OBJ_D)/i2d_r_pr.o \
+       $(OBJ_D)/d2i_r_pu.o $(OBJ_D)/i2d_r_pu.o $(OBJ_D)/d2i_s_pr.o \
+       $(OBJ_D)/i2d_s_pr.o $(OBJ_D)/d2i_s_pu.o $(OBJ_D)/i2d_s_pu.o \
+       $(OBJ_D)/d2i_pu.o $(OBJ_D)/d2i_pr.o $(OBJ_D)/i2d_pu.o \
+       $(OBJ_D)/i2d_pr.o $(OBJ_D)/t_req.o $(OBJ_D)/t_x509.o \
+       $(OBJ_D)/t_pkey.o $(OBJ_D)/p7_i_s.o $(OBJ_D)/p7_signi.o \
+       $(OBJ_D)/p7_signd.o $(OBJ_D)/p7_recip.o $(OBJ_D)/p7_enc_c.o \
+       $(OBJ_D)/p7_evp.o $(OBJ_D)/p7_dgst.o $(OBJ_D)/p7_s_e.o \
+       $(OBJ_D)/p7_enc.o $(OBJ_D)/p7_lib.o $(OBJ_D)/f_int.o \
+       $(OBJ_D)/f_string.o $(OBJ_D)/i2d_dhp.o $(OBJ_D)/i2d_dsap.o \
+       $(OBJ_D)/d2i_dhp.o $(OBJ_D)/d2i_dsap.o $(OBJ_D)/n_pkey.o \
+       $(OBJ_D)/a_hdr.o $(OBJ_D)/x_pkey.o $(OBJ_D)/a_bool.o \
+       $(OBJ_D)/x_exten.o $(OBJ_D)/asn1_par.o $(OBJ_D)/asn1_lib.o \
+       $(OBJ_D)/asn1_err.o $(OBJ_D)/a_meth.o $(OBJ_D)/a_bytes.o \
+       $(OBJ_D)/evp_asn1.o $(OBJ_D)/x509_def.o $(OBJ_D)/x509_d2.o \
+       $(OBJ_D)/x509_r2x.o $(OBJ_D)/x509_cmp.o $(OBJ_D)/x509_obj.o \
+       $(OBJ_D)/x509_req.o $(OBJ_D)/x509_vfy.o $(OBJ_D)/x509_set.o \
+       $(OBJ_D)/x509rset.o $(OBJ_D)/x509_err.o $(OBJ_D)/x509name.o \
+       $(OBJ_D)/x509_v3.o $(OBJ_D)/x509_ext.o $(OBJ_D)/x509pack.o \
+       $(OBJ_D)/x509type.o $(OBJ_D)/x509_lu.o $(OBJ_D)/x_all.o \
+       $(OBJ_D)/x509_txt.o $(OBJ_D)/by_file.o $(OBJ_D)/by_dir.o \
+       $(OBJ_D)/v3_net.o $(OBJ_D)/v3_x509.o $(OBJ_D)/conf.o \
+       $(OBJ_D)/conf_err.o $(OBJ_D)/txt_db.o $(OBJ_D)/pk7_lib.o \
+       $(OBJ_D)/pkcs7err.o $(OBJ_D)/pk7_doit.o $(OBJ_D)/proxy.o \
+       $(OBJ_D)/pxy_txt.o $(OBJ_D)/bf_proxy.o $(OBJ_D)/pxy_conf.o \
+       $(OBJ_D)/pxy_err.o $(OBJ_D)/comp_lib.o $(OBJ_D)/c_rle.o \
+       $(OBJ_D)/c_zlib.o
 
 SSLOBJ=$(OBJ_D)/s2_meth.o \
        $(OBJ_D)/s2_srvr.o $(OBJ_D)/s2_clnt.o $(OBJ_D)/s2_lib.o \
@@ -272,7 +277,7 @@ SSLOBJ=$(OBJ_D)/s2_meth.o \
        $(OBJ_D)/ssl_cert.o $(OBJ_D)/ssl_sess.o $(OBJ_D)/ssl_ciph.o \
        $(OBJ_D)/ssl_stat.o $(OBJ_D)/ssl_rsa.o $(OBJ_D)/ssl_asn1.o \
        $(OBJ_D)/ssl_txt.o $(OBJ_D)/ssl_algs.o $(OBJ_D)/bio_ssl.o \
-       $(OBJ_D)/ssl_err.o
+       $(OBJ_D)/pxy_ssl.o $(OBJ_D)/ssl_err.o
 
 RSAGLUEOBJ=$(OBJ_D)/rsaref.o \
        $(OBJ_D)/rsar_err.o
@@ -432,6 +437,9 @@ $(INC_D)/crypto.h: $(SRC_D)/crypto/crypto.h
 $(INC_D)/cryptall.h: $(SRC_D)/crypto/cryptall.h
        $(CP) $(SRC_D)/crypto/cryptall.h $(INC_D)/cryptall.h
 
+$(INC_D)/tmdiff.h: $(SRC_D)/crypto/tmdiff.h
+       $(CP) $(SRC_D)/crypto/tmdiff.h $(INC_D)/tmdiff.h
+
 $(INC_D)/md2.h: $(SRC_D)/crypto/md2/md2.h
        $(CP) $(SRC_D)/crypto/md2/md2.h $(INC_D)/md2.h
 
@@ -534,6 +542,12 @@ $(INC_D)/txt_db.h: $(SRC_D)/crypto/txt_db/txt_db.h
 $(INC_D)/pkcs7.h: $(SRC_D)/crypto/pkcs7/pkcs7.h
        $(CP) $(SRC_D)/crypto/pkcs7/pkcs7.h $(INC_D)/pkcs7.h
 
+$(INC_D)/proxy.h: $(SRC_D)/crypto/proxy/proxy.h
+       $(CP) $(SRC_D)/crypto/proxy/proxy.h $(INC_D)/proxy.h
+
+$(INC_D)/comp.h: $(SRC_D)/crypto/comp/comp.h
+       $(CP) $(SRC_D)/crypto/comp/comp.h $(INC_D)/comp.h
+
 $(INC_D)/ssl.h: $(SRC_D)/ssl/ssl.h
        $(CP) $(SRC_D)/ssl/ssl.h $(INC_D)/ssl.h
 
@@ -681,6 +695,9 @@ $(OBJ_D)/s_cb.o: $(SRC_D)/apps/s_cb.c
 $(OBJ_D)/s_socket.o: $(SRC_D)/apps/s_socket.c
        $(CC) -o $(OBJ_D)/s_socket.o -DMONOLITH $(APP_CFLAGS) -c $(SRC_D)/apps/s_socket.c
 
+$(OBJ_D)/bf_perm.o: $(SRC_D)/apps/bf_perm.c
+       $(CC) -o $(OBJ_D)/bf_perm.o -DMONOLITH $(APP_CFLAGS) -c $(SRC_D)/apps/bf_perm.c
+
 $(OBJ_D)/version.o: $(SRC_D)/apps/version.c
        $(CC) -o $(OBJ_D)/version.o -DMONOLITH $(APP_CFLAGS) -c $(SRC_D)/apps/version.c
 
@@ -700,11 +717,14 @@ $(OBJ_D)/mem.o: $(SRC_D)/crypto/mem.c
        $(CC) -o $(OBJ_D)/mem.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/mem.c
 
 $(OBJ_D)/cversion.o: $(SRC_D)/crypto/cversion.c
-       $(CC) -o $(OBJ_D)/cversion.o  $(LIB_CFLAGS) -DCFLAGS="\"$(CC) $(CFLAG)\"" -c $(SRC_D)/crypto/cversion.c
+       $(CC) -o $(OBJ_D)/cversion.o  $(LIB_CFLAGS) -DCFLAGS="\"$(CC) $(CFLAG)\"" -DPLATFORM="\"$(PLATFORM)\"" -c $(SRC_D)/crypto/cversion.c
 
 $(OBJ_D)/ex_data.o: $(SRC_D)/crypto/ex_data.c
        $(CC) -o $(OBJ_D)/ex_data.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/ex_data.c
 
+$(OBJ_D)/tmdiff.o: $(SRC_D)/crypto/tmdiff.c
+       $(CC) -o $(OBJ_D)/tmdiff.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/tmdiff.c
+
 $(OBJ_D)/cpt_err.o: $(SRC_D)/crypto/cpt_err.c
        $(CC) -o $(OBJ_D)/cpt_err.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/cpt_err.c
 
@@ -915,9 +935,6 @@ $(OBJ_D)/bn_exp.o: $(SRC_D)/crypto/bn/bn_exp.c
 $(OBJ_D)/bn_lib.o: $(SRC_D)/crypto/bn/bn_lib.c
        $(CC) -o $(OBJ_D)/bn_lib.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bn/bn_lib.c
 
-$(OBJ_D)/bn_mod.o: $(SRC_D)/crypto/bn/bn_mod.c
-       $(CC) -o $(OBJ_D)/bn_mod.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bn/bn_mod.c
-
 $(OBJ_D)/bn_mul.o: $(SRC_D)/crypto/bn/bn_mul.c
        $(CC) -o $(OBJ_D)/bn_mul.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bn/bn_mul.c
 
@@ -930,9 +947,6 @@ $(OBJ_D)/bn_rand.o: $(SRC_D)/crypto/bn/bn_rand.c
 $(OBJ_D)/bn_shift.o: $(SRC_D)/crypto/bn/bn_shift.c
        $(CC) -o $(OBJ_D)/bn_shift.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bn/bn_shift.c
 
-$(OBJ_D)/bn_sub.o: $(SRC_D)/crypto/bn/bn_sub.c
-       $(CC) -o $(OBJ_D)/bn_sub.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bn/bn_sub.c
-
 $(OBJ_D)/bn_word.o: $(SRC_D)/crypto/bn/bn_word.c
        $(CC) -o $(OBJ_D)/bn_word.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bn/bn_word.c
 
@@ -951,8 +965,8 @@ $(OBJ_D)/bn_err.o: $(SRC_D)/crypto/bn/bn_err.c
 $(OBJ_D)/bn_sqr.o: $(SRC_D)/crypto/bn/bn_sqr.c
        $(CC) -o $(OBJ_D)/bn_sqr.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bn/bn_sqr.c
 
-$(OBJ_D)/bn_mulw.o: $(SRC_D)/crypto/bn/bn_mulw.c
-       $(CC) -o $(OBJ_D)/bn_mulw.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bn/bn_mulw.c
+$(OBJ_D)/bn_asm.o: $(SRC_D)/crypto/bn/bn_asm.c
+       $(CC) -o $(OBJ_D)/bn_asm.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bn/bn_asm.c
 
 $(OBJ_D)/bn_recp.o: $(SRC_D)/crypto/bn/bn_recp.c
        $(CC) -o $(OBJ_D)/bn_recp.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bn/bn_recp.c
@@ -963,6 +977,9 @@ $(OBJ_D)/bn_mont.o: $(SRC_D)/crypto/bn/bn_mont.c
 $(OBJ_D)/bn_mpi.o: $(SRC_D)/crypto/bn/bn_mpi.c
        $(CC) -o $(OBJ_D)/bn_mpi.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bn/bn_mpi.c
 
+$(OBJ_D)/bn_exp2.o: $(SRC_D)/crypto/bn/bn_exp2.c
+       $(CC) -o $(OBJ_D)/bn_exp2.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bn/bn_exp2.c
+
 $(OBJ_D)/rsa_eay.o: $(SRC_D)/crypto/rsa/rsa_eay.c
        $(CC) -o $(OBJ_D)/rsa_eay.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/rsa/rsa_eay.c
 
@@ -1077,6 +1094,9 @@ $(OBJ_D)/bss_acpt.o: $(SRC_D)/crypto/bio/bss_acpt.c
 $(OBJ_D)/bf_nbio.o: $(SRC_D)/crypto/bio/bf_nbio.c
        $(CC) -o $(OBJ_D)/bf_nbio.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bio/bf_nbio.c
 
+$(OBJ_D)/bss_cs4a.o: $(SRC_D)/crypto/bio/bss_cs4a.c
+       $(CC) -o $(OBJ_D)/bss_cs4a.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/bio/bss_cs4a.c
+
 $(OBJ_D)/stack.o: $(SRC_D)/crypto/stack/stack.c
        $(CC) -o $(OBJ_D)/stack.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/stack/stack.c
 
@@ -1092,6 +1112,9 @@ $(OBJ_D)/md_rand.o: $(SRC_D)/crypto/rand/md_rand.c
 $(OBJ_D)/randfile.o: $(SRC_D)/crypto/rand/randfile.c
        $(CC) -o $(OBJ_D)/randfile.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/rand/randfile.c
 
+$(OBJ_D)/rand_lib.o: $(SRC_D)/crypto/rand/rand_lib.c
+       $(CC) -o $(OBJ_D)/rand_lib.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/rand/rand_lib.c
+
 $(OBJ_D)/err.o: $(SRC_D)/crypto/err/err.c
        $(CC) -o $(OBJ_D)/err.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/err/err.c
 
@@ -1101,6 +1124,9 @@ $(OBJ_D)/err_all.o: $(SRC_D)/crypto/err/err_all.c
 $(OBJ_D)/err_prn.o: $(SRC_D)/crypto/err/err_prn.c
        $(CC) -o $(OBJ_D)/err_prn.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/err/err_prn.c
 
+$(OBJ_D)/o_names.o: $(SRC_D)/crypto/objects/o_names.c
+       $(CC) -o $(OBJ_D)/o_names.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/objects/o_names.c
+
 $(OBJ_D)/obj_dat.o: $(SRC_D)/crypto/objects/obj_dat.c
        $(CC) -o $(OBJ_D)/obj_dat.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/objects/obj_dat.c
 
@@ -1335,6 +1361,9 @@ $(OBJ_D)/a_d2i_fp.o: $(SRC_D)/crypto/asn1/a_d2i_fp.c
 $(OBJ_D)/a_i2d_fp.o: $(SRC_D)/crypto/asn1/a_i2d_fp.c
        $(CC) -o $(OBJ_D)/a_i2d_fp.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/asn1/a_i2d_fp.c
 
+$(OBJ_D)/a_bmp.o: $(SRC_D)/crypto/asn1/a_bmp.c
+       $(CC) -o $(OBJ_D)/a_bmp.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/asn1/a_bmp.c
+
 $(OBJ_D)/a_sign.o: $(SRC_D)/crypto/asn1/a_sign.c
        $(CC) -o $(OBJ_D)/a_sign.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/asn1/a_sign.c
 
@@ -1590,6 +1619,30 @@ $(OBJ_D)/pkcs7err.o: $(SRC_D)/crypto/pkcs7/pkcs7err.c
 $(OBJ_D)/pk7_doit.o: $(SRC_D)/crypto/pkcs7/pk7_doit.c
        $(CC) -o $(OBJ_D)/pk7_doit.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/pkcs7/pk7_doit.c
 
+$(OBJ_D)/proxy.o: $(SRC_D)/crypto/proxy/proxy.c
+       $(CC) -o $(OBJ_D)/proxy.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/proxy/proxy.c
+
+$(OBJ_D)/pxy_txt.o: $(SRC_D)/crypto/proxy/pxy_txt.c
+       $(CC) -o $(OBJ_D)/pxy_txt.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/proxy/pxy_txt.c
+
+$(OBJ_D)/bf_proxy.o: $(SRC_D)/crypto/proxy/bf_proxy.c
+       $(CC) -o $(OBJ_D)/bf_proxy.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/proxy/bf_proxy.c
+
+$(OBJ_D)/pxy_conf.o: $(SRC_D)/crypto/proxy/pxy_conf.c
+       $(CC) -o $(OBJ_D)/pxy_conf.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/proxy/pxy_conf.c
+
+$(OBJ_D)/pxy_err.o: $(SRC_D)/crypto/proxy/pxy_err.c
+       $(CC) -o $(OBJ_D)/pxy_err.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/proxy/pxy_err.c
+
+$(OBJ_D)/comp_lib.o: $(SRC_D)/crypto/comp/comp_lib.c
+       $(CC) -o $(OBJ_D)/comp_lib.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/comp/comp_lib.c
+
+$(OBJ_D)/c_rle.o: $(SRC_D)/crypto/comp/c_rle.c
+       $(CC) -o $(OBJ_D)/c_rle.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/comp/c_rle.c
+
+$(OBJ_D)/c_zlib.o: $(SRC_D)/crypto/comp/c_zlib.c
+       $(CC) -o $(OBJ_D)/c_zlib.o  $(LIB_CFLAGS) -c $(SRC_D)/crypto/comp/c_zlib.c
+
 $(OBJ_D)/s2_meth.o: $(SRC_D)/ssl/s2_meth.c
        $(CC) -o $(OBJ_D)/s2_meth.o  $(LIB_CFLAGS) -c $(SRC_D)/ssl/s2_meth.c
 
@@ -1692,6 +1745,9 @@ $(OBJ_D)/ssl_algs.o: $(SRC_D)/ssl/ssl_algs.c
 $(OBJ_D)/bio_ssl.o: $(SRC_D)/ssl/bio_ssl.c
        $(CC) -o $(OBJ_D)/bio_ssl.o  $(LIB_CFLAGS) -c $(SRC_D)/ssl/bio_ssl.c
 
+$(OBJ_D)/pxy_ssl.o: $(SRC_D)/ssl/pxy_ssl.c
+       $(CC) -o $(OBJ_D)/pxy_ssl.o  $(LIB_CFLAGS) -c $(SRC_D)/ssl/pxy_ssl.c
+
 $(OBJ_D)/ssl_err.o: $(SRC_D)/ssl/ssl_err.c
        $(CC) -o $(OBJ_D)/ssl_err.o  $(LIB_CFLAGS) -c $(SRC_D)/ssl/ssl_err.c
 
@@ -1761,20 +1817,20 @@ $(TEST_D)/randtest: $(OBJ_D)/randtest.o $(LIBS_DEP)
 $(TEST_D)/ssltest: $(OBJ_D)/ssltest.o $(LIBS_DEP)
        $(LINK) -o $(TEST_D)/ssltest $(LFLAGS) $(OBJ_D)/ssltest.o $(L_LIBS) $(EX_LIBS)
 
-$(LIB_D)/$(O_SSL): $(SSLOBJ)
-       $(RM) $(LIB_D)/$(O_SSL)
-       $(MKLIB) $(LIB_D)/$(O_SSL) $(SSLOBJ)
-       $(RANLIB) $(LIB_D)/$(O_SSL)
+$(O_SSL): $(SSLOBJ)
+       $(RM) $(O_SSL)
+       $(MKLIB) $(O_SSL) $(SSLOBJ)
+       $(RANLIB) $(O_SSL)
 
-$(LIB_D)/$(O_RSAGLUE): $(RSAGLUEOBJ)
-       $(RM) $(LIB_D)/$(O_RSAGLUE)
-       $(MKLIB) $(LIB_D)/$(O_RSAGLUE) $(RSAGLUEOBJ)
-       $(RANLIB) $(LIB_D)/$(O_RSAGLUE)
+$(O_RSAGLUE): $(RSAGLUEOBJ)
+       $(RM) $(O_RSAGLUE)
+       $(MKLIB) $(O_RSAGLUE) $(RSAGLUEOBJ)
+       $(RANLIB) $(O_RSAGLUE)
 
-$(LIB_D)/$(O_CRYPTO): $(CRYPTOOBJ)
-       $(RM) $(LIB_D)/$(O_CRYPTO)
-       $(MKLIB) $(LIB_D)/$(O_CRYPTO) $(CRYPTOOBJ)
-       $(RANLIB) $(LIB_D)/$(O_CRYPTO)
+$(O_CRYPTO): $(CRYPTOOBJ)
+       $(RM) $(O_CRYPTO)
+       $(MKLIB) $(O_CRYPTO) $(CRYPTOOBJ)
+       $(RANLIB) $(O_CRYPTO)
 
 $(BIN_D)/$(E_EXE): $(E_OBJ) $(LIBS_DEP)
        $(LINK) -o $(BIN_D)/$(E_EXE) $(LFLAGS) $(E_OBJ) $(L_LIBS) $(EX_LIBS)
index d6b24041cf04154f8f902651969675021f4d93a5..2cfaa3ba204f5795e9ac7e5d193f3dc8ade32b55 100644 (file)
@@ -1 +1 @@
-19
+1D
index 6bfccc7c48a4e86277f9371f088cd898b1dc0a2a..b48c657ae08d741614600cc67da523eac143bba2 100644 (file)
@@ -1,10 +1,10 @@
 -----BEGIN CERTIFICATE-----
 MIIBXDCCAQYCAQAwDQYJKoZIhvcNAQEEBQAwOTELMAkGA1UEBhMCQVUxFzAVBgNV
-BAoTDkRvZGd5IEJyb3RoZXJzMREwDwYDVQQDEwhEb2RneSBDQTAeFw05NzExMjgw
-MDA3MzBaFw05NzEyMjgwMDA3MzBaMDkxCzAJBgNVBAYTAkFVMRcwFQYDVQQKEw5E
+BAoTDkRvZGd5IEJyb3RoZXJzMREwDwYDVQQDEwhEb2RneSBDQTAeFw05ODA3MjEw
+NjUwMTZaFw05ODA4MjAwNjUwMTZaMDkxCzAJBgNVBAYTAkFVMRcwFQYDVQQKEw5E
 b2RneSBCcm90aGVyczERMA8GA1UEAxMIRG9kZ3kgQ0EwXDANBgkqhkiG9w0BAQEF
-AANLADBIAkEAwOKExbdfKLemEMGOKeBgqI3abJE9yzf3WhrPcQLRAyM85YPxk0DQ
-YWwhEh9i2BxGWYAZ7Krv1EqdsViCQBGuBQIDAQABMA0GCSqGSIb3DQEBBAUAA0EA
-VXYhZ1FnfBFIjHiYV8PD4uQuVJLhNa2q3cSWX1HTHfbrAPa/lMSUWuWcYwD3lBeb
-D69W77B0LqAfVajBQwbXkQ==
+AANLADBIAkEA0DQLenM/ncK6CwSEJhOO1WfZUPUEi4pvos9fHW459jh3rRDADgi3
+fiCYxoRVSQhvB47kDZ3ViNg5yrDhy7F9ywIDAQABMA0GCSqGSIb3DQEBBAUAA0EA
+S564l3SBxJ+QcIXthGGDyP5zkxTf/1fHfelW9LNgu6lZTdy9Dlp/NecPekzRmZEM
+WiGXGkKNeuo8PsnGJHP9Qg==
 -----END CERTIFICATE-----
index 6a0302ed1db30bd7b6b54b4ed5e0407374ad76fc..095ea14330192b01428e392380fd9792fce63ca4 100644 (file)
@@ -1,10 +1,10 @@
 -----BEGIN CERTIFICATE-----
-MIIBcTCCARsCARgwDQYJKoZIhvcNAQEEBQAwOTELMAkGA1UEBhMCQVUxFzAVBgNV
-BAoTDkRvZGd5IEJyb3RoZXJzMREwDwYDVQQDEwhEb2RneSBDQTAeFw05NzExMjgw
-MDA3MzRaFw05NzEyMjgwMDA3MzRaME4xCzAJBgNVBAYTAkFVMRcwFQYDVQQKEw5E
+MIIBcTCCARsCARwwDQYJKoZIhvcNAQEEBQAwOTELMAkGA1UEBhMCQVUxFzAVBgNV
+BAoTDkRvZGd5IEJyb3RoZXJzMREwDwYDVQQDEwhEb2RneSBDQTAeFw05ODA3MjEw
+NjUwMjdaFw05ODA4MjAwNjUwMjdaME4xCzAJBgNVBAYTAkFVMRcwFQYDVQQKEw5E
 b2RneSBCcm90aGVyczESMBAGA1UEAxMJQnJvdGhlciAxMRIwEAYDVQQDEwlCcm90
-aGVyIDIwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAyfgRHCZvlyq9yiQisWmetnpb
-DZMhZB+HjuxQxp3gEpI7P8q5Z5tXIU5+OFAfIRkRdMGa/UK+NVg7AJ6UYyIR3wID
-AQABMA0GCSqGSIb3DQEBBAUAA0EAgH3htGAw6tMcZYANofqYr96RhjnxzCGZkUq3
-SH9thHUBywcXQo6BUpGxUXFExW4NA2f49OWQxf8kYrVAXHcCsA==
+aGVyIDIwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA0e4qorOr/zuLB9NvRaXhJVaI
+HaGGasa7eMAjVPitWAXkN+DxXiGH1CnMgQraKiYzsEVP15xtxkevEvK5jJpOwwID
+AQABMA0GCSqGSIb3DQEBBAUAA0EAZhcPV+SWwaszFuDTYc6fUurcV9OeXUqoxSQy
+MnLZPTyWubHbbkUr9fUfdf7Cc7dFqGzag05VHkNQUS9VjMzjIQ==
 -----END CERTIFICATE-----
diff --git a/ms/f.bat b/ms/f.bat
new file mode 100755 (executable)
index 0000000..b365924
--- /dev/null
+++ b/ms/f.bat
@@ -0,0 +1,2 @@
+echo %%\r
+\r
index 9ed3e7dc460758b9a5b43e7970c7b8ab0114d3a9..933c2cd6ed98031d1b4892538299af6aeaa324d3 100644 (file)
@@ -1,9 +1,9 @@
 -----BEGIN RSA PRIVATE KEY-----
-MIIBOwIBAAJBAMDihMW3Xyi3phDBjingYKiN2myRPcs391oaz3EC0QMjPOWD8ZNA
-0GFsIRIfYtgcRlmAGeyq79RKnbFYgkARrgUCAwEAAQJAGEWo/ZRoth/+Fse0kxJ4
-N126acURKJx/VOhgyFDZanJxxwhaXRRkZZfXgFP5StY2lAOrcuMnsDjc8XYNrvcE
-wQIhAOXcIp0eZfoPAAuhoQ2bd94dg8QX+8Hv38oJBUuduTs1AiEA1tHvlMrRC1dp
-mPUWooFaRFfadFvCMJy5ouGQ24bKMZECIB1YiHbEvcI6DghuHzCsi5Yo8HyljzfI
-VyrlEe8AePiNAiEAv6Hxpnsy9noZAlEIyxi3TKZOg2Rjm/gDhfDQx3S7pHECIQDC
-R6w+uHZzVJ50/kNh3mJow2W2+Rffkk2hcM4r5Sf4Vg==
+MIIBOwIBAAJBANA0C3pzP53CugsEhCYTjtVn2VD1BIuKb6LPXx1uOfY4d60QwA4I
+t34gmMaEVUkIbweO5A2d1YjYOcqw4cuxfcsCAwEAAQJAOT9WOKEfyN0WEpl3TJDs
+ITmgw2XbjhLOh1HFsW3xegWlaOuhL/wGamz7n7zzL/RQF3JP/VvpGk2F8VD9JhwT
+wQIhAPmqM3fLttBoCQuwQRdIPfB7Ps3THqx6N8AJ04z3I1ejAiEA1XyDd7bLpWrw
+/oA8CmR4b/KCGfvRwAL/Qej/rQliw7kCIQCYRzSvO8ScpuflhjKdZcXJuRJcbgnG
+f6Ejc5rh3xdiawIhALMmLdzEFNjXiSzIx5mg/kBTLUJIw5dx7GqO8B9xBORhAiA5
+oTN/hgvvrkkmRsHQpNBmzAEGBzhMEEq9lD6ZWrTSRg==
 -----END RSA PRIVATE KEY-----
index ab62876195b459d7754c7f2848780d2d978624d4..05d356e7a50349e35e20a631db5a2ce17f64bccc 100644 (file)
@@ -1,9 +1,9 @@
 -----BEGIN RSA PRIVATE KEY-----
-MIIBOgIBAAJBAMn4ERwmb5cqvcokIrFpnrZ6Ww2TIWQfh47sUMad4BKSOz/KuWeb
-VyFOfjhQHyEZEXTBmv1CvjVYOwCelGMiEd8CAwEAAQJAEu/4orwT4Ie4bfi/bAUs
-RY3pdbdi/SFbs5IC7OymsvbqO/J5/6lTLKX/CFUvXjbpd922jfNMQzdalOfZ7R+K
-aQIhAP9DOq6eFRbNqzxxDadOOSLFEcWBZwzIX12zoPgxarPDAiEAyo1tF3zbU93G
-WQ1yjlhXYm07VdoZV0CUI6dKkB0ok7UCIEmiQhZHAbxfPcskrZSaiv7NrE+2AVz9
-nAzymTefQbFzAiAFCODmTY8yFXghrIjlauK5Kpfn+WTZ21wTSsw6qs7gZQIhAK2l
-vwdD73PZSW928dZ9VoV7Dh7Klflf6J+xrJIibP7z
+MIIBPAIBAAJBANHuKqKzq/87iwfTb0Wl4SVWiB2hhmrGu3jAI1T4rVgF5Dfg8V4h
+h9QpzIEK2iomM7BFT9ecbcZHrxLyuYyaTsMCAwEAAQJBAIxtM6n4ZCJscxj+D13Y
+k13Fn3Gqvd6pJ3ijlj7dxh6tRBBQ3W9qmQflyvEc81giI2XtbVYBOEJKtJ1cWWZm
+gAkCIQDpEoOuc4KCI5ti6aMJvtxlXWNHbkXCxtbeIjH4+FnH9QIhAOaU3XVeWWOK
+PnnO87KniDjHQqWLnooivDGRK+FUKeDXAiEA2MjEvFVqFVvDIsxHPkBNROcI+Z6i
+ulkx76kErBtrfqUCIHN5uBLQZmngUPuFtiwRlLoCqJDphENfs+oK7vPQx4xPAiEA
+hnY2Ulrpld83IG6bUs95Loc8Fk81hez5YwmhsFEXVtk=
 -----END RSA PRIVATE KEY-----
index 65bbad629e13318d9f2e91f13196b6f17a7102b8..51cf7644ec7ddfa2ee2cf033407f38e76e093e27 100644 (file)
@@ -84,12 +84,14 @@ EXPORTS
     _BIO_f_md                           @60
     _BIO_f_nbio_test                    @915
     _BIO_f_null                         @61
+    _BIO_f_proxy_server                 @62
     _BIO_fd_non_fatal_error             @63
     _BIO_fd_should_retry                @64
     _BIO_find_type                      @65
     _BIO_free                           @66
     _BIO_free_all                       @67
     _BIO_get_accept_socket              @69
+    _BIO_get_filter_bio                 @70
     _BIO_get_host_ip                    @71
     _BIO_get_port                       @72
     _BIO_get_retry_BIO                  @73
@@ -103,6 +105,7 @@ EXPORTS
     _BIO_new_connect                    @80
     _BIO_new_fd                         @81
     _BIO_new_socket                     @84
+    _BIO_new_socks4a_connect            @1110
     _BIO_pop                            @85
     _BIO_printf                         @86
     _BIO_ptr_ctrl                       @969
@@ -114,7 +117,9 @@ EXPORTS
     _BIO_s_fd                           @92
     _BIO_s_mem                          @95
     _BIO_s_null                         @96
+    _BIO_s_proxy_client                 @97
     _BIO_s_socket                       @98
+    _BIO_s_socks4a_connect              @1111
     _BIO_set                            @100
     _BIO_set_cipher                     @101
     _BIO_set_tcp_ndelay                 @102
@@ -124,6 +129,7 @@ EXPORTS
     _BIO_sock_non_fatal_error           @106
     _BIO_sock_should_retry              @107
     _BIO_socket_ioctl                   @108
+    _BIO_socket_nbio                    @1102
     _BIO_write                          @109
     _BN_BLINDING_convert                @973
     _BN_BLINDING_free                   @981
@@ -131,10 +137,16 @@ EXPORTS
     _BN_BLINDING_new                    @980
     _BN_BLINDING_update                 @975
     _BN_CTX_free                        @110
+    _BN_CTX_init                        @1135
     _BN_CTX_new                         @111
     _BN_MONT_CTX_free                   @112
+    _BN_MONT_CTX_init                   @1136
     _BN_MONT_CTX_new                    @113
     _BN_MONT_CTX_set                    @114
+    _BN_RECP_CTX_free                   @1130
+    _BN_RECP_CTX_init                   @1128
+    _BN_RECP_CTX_new                    @1129
+    _BN_RECP_CTX_set                    @1131
     _BN_add                             @115
     _BN_add_word                        @116
     _BN_bin2bn                          @118
@@ -149,6 +161,7 @@ EXPORTS
     _BN_copy                            @125
     _BN_dec2bn                          @1001
     _BN_div                             @126
+    _BN_div_recp                        @1134
     _BN_div_word                        @127
     _BN_dup                             @128
     _BN_exp                             @998
@@ -158,6 +171,7 @@ EXPORTS
     _BN_generate_prime                  @132
     _BN_get_word                        @133
     _BN_hex2bn                          @117
+    _BN_init                            @1095
     _BN_is_bit_set                      @134
     _BN_is_prime                        @135
     _BN_lshift                          @136
@@ -166,12 +180,12 @@ EXPORTS
     _BN_mod                             @139
     _BN_mod_exp                         @140
     _BN_mod_exp_mont                    @141
-    _BN_mod_exp_recp                    @142
+    _BN_mod_exp_recp                    @1133
     _BN_mod_exp_simple                  @143
     _BN_mod_inverse                     @144
     _BN_mod_mul                         @145
     _BN_mod_mul_montgomery              @146
-    _BN_mod_mul_reciprocal              @147
+    _BN_mod_mul_reciprocal              @1132
     _BN_mod_word                        @148
     _BN_mpi2bn                          @1059
     _BN_mul                             @149
@@ -191,7 +205,9 @@ EXPORTS
     _BN_sub                             @163
     _BN_sub_word                        @1000
     _BN_to_ASN1_INTEGER                 @164
+    _BN_uadd                            @708
     _BN_ucmp                            @165
+    _BN_usub                            @709
     _BN_value_one                       @166
     _BUF_MEM_free                       @167
     _BUF_MEM_grow                       @168
@@ -204,6 +220,12 @@ EXPORTS
     _CAST_encrypt                       @989
     _CAST_ofb64_encrypt                 @994
     _CAST_set_key                       @988
+    _COMP_CTX_free                      @1097
+    _COMP_CTX_new                       @1096
+    _COMP_compress_block                @1144
+    _COMP_expand_block                  @1145
+    _COMP_rle                           @1146
+    _COMP_zlib                          @1147
     _CONF_free                          @171
     _CONF_get_number                    @172
     _CONF_get_section                   @173
@@ -283,6 +305,7 @@ EXPORTS
     _ERR_load_OBJ_strings               @241
     _ERR_load_PEM_strings               @242
     _ERR_load_PKCS7_strings             @919
+    _ERR_load_PROXY_strings             @243
     _ERR_load_RSA_strings               @244
     _ERR_load_X509_strings              @245
     _ERR_load_crypto_strings            @246
@@ -339,7 +362,6 @@ EXPORTS
     _EVP_SealInit                       @288
     _EVP_SignFinal                      @289
     _EVP_VerifyFinal                    @290
-    _EVP_add_alias                      @291
     _EVP_add_cipher                     @292
     _EVP_add_digest                     @293
     _EVP_bf_cbc                         @294
@@ -351,7 +373,6 @@ EXPORTS
     _EVP_cast5_ecb                      @985
     _EVP_cast5_ofb                      @986
     _EVP_cleanup                        @298
-    _EVP_delete_alias                   @941
     _EVP_des_cbc                        @299
     _EVP_des_cfb                        @300
     _EVP_des_ecb                        @301
@@ -380,6 +401,7 @@ EXPORTS
     _EVP_md_null                        @324
     _EVP_mdc2                           @942
     _EVP_rc2_40_cbc                     @959
+    _EVP_rc2_64_cbc                     @1103
     _EVP_rc2_cbc                        @325
     _EVP_rc2_cfb                        @326
     _EVP_rc2_ecb                        @327
@@ -419,6 +441,12 @@ EXPORTS
     _NETSCAPE_SPKI_new                  @350
     _NETSCAPE_SPKI_sign                 @351
     _NETSCAPE_SPKI_verify               @352
+    _OBJ_NAME_add                       @1101
+    _OBJ_NAME_cleanup                   @1104
+    _OBJ_NAME_get                       @1105
+    _OBJ_NAME_init                      @1106
+    _OBJ_NAME_new_index                 @1107
+    _OBJ_NAME_remove                    @1108
     _OBJ_add_object                     @353
     _OBJ_bsearch                        @354
     _OBJ_cleanup                        @355
@@ -489,32 +517,58 @@ EXPORTS
     _PKCS7_SIGNER_INFO_set              @930
     _PKCS7_SIGN_ENVELOPE_free           @441
     _PKCS7_SIGN_ENVELOPE_new            @442
+    _PKCS7_add_attribute                @1138
     _PKCS7_add_certificate              @932
     _PKCS7_add_crl                      @933
     _PKCS7_add_recipient                @1073
     _PKCS7_add_recipient_info           @1074
     _PKCS7_add_signature                @938
+    _PKCS7_add_signed_attribute         @1139
     _PKCS7_add_signer                   @931
     _PKCS7_cert_from_signer_info        @939
     _PKCS7_content_free                 @918
     _PKCS7_content_new                  @934
     _PKCS7_ctrl                         @927
     _PKCS7_dataInit                     @937
-    _PKCS7_dataSign                     @935
     _PKCS7_dataVerify                   @936
+    _PKCS7_digest_from_attributes       @1140
     _PKCS7_dup                          @443
     _PKCS7_free                         @444
+    _PKCS7_get_attribute                @1141
+    _PKCS7_get_issuer_and_serial        @1142
+    _PKCS7_get_signed_attribute         @1143
     _PKCS7_get_signer_info              @940
     _PKCS7_new                          @445
     _PKCS7_set_cipher                   @1075
     _PKCS7_set_content                  @929
     _PKCS7_set_type                     @928
+    _PROXY_ENTRY_add_noproxy            @446
+    _PROXY_ENTRY_clear_noproxy          @447
+    _PROXY_ENTRY_free                   @448
+    _PROXY_ENTRY_get_noproxy            @449
+    _PROXY_ENTRY_new                    @450
+    _PROXY_ENTRY_set_server             @451
+    _PROXY_add_noproxy                  @452
+    _PROXY_add_server                   @453
+    _PROXY_check_by_host                @454
+    _PROXY_check_url                    @455
+    _PROXY_clear_noproxy                @456
+    _PROXY_free                         @457
+    _PROXY_get_noproxy                  @458
+    _PROXY_get_proxies                  @459
+    _PROXY_get_proxy_entry              @460
+    _PROXY_load_conf                    @461
+    _PROXY_new                          @462
+    _PROXY_print                        @463
+    _RAND_SSLeay                        @1113
     _RAND_bytes                         @464
     _RAND_cleanup                       @465
     _RAND_file_name                     @466
+    _RAND_get_rand_method               @1137
     _RAND_load_file                     @467
     _RAND_screen                        @468
     _RAND_seed                          @469
+    _RAND_set_rand_method               @1114
     _RAND_write_file                    @470
     _RC2_cbc_encrypt                    @471
     _RC2_cfb64_encrypt                  @472
@@ -549,6 +603,7 @@ EXPORTS
     _RSA_generate_key                   @485
     _RSA_get_ex_data                    @1029
     _RSA_get_ex_new_index               @1030
+    _RSA_memory_lock                    @1115
     _RSA_new                            @486
     _RSA_new_method                     @487
     _RSA_padding_add_PKCS1_type_1       @1031
@@ -659,7 +714,7 @@ EXPORTS
     _X509_NAME_print                    @586
     _X509_NAME_set                      @587
     _X509_OBJECT_free_contents          @588
-    _X509_OBJECT_retrive_by_subject     @589
+    _X509_OBJECT_retrieve_by_subject    @589
     _X509_OBJECT_up_ref_count           @590
     _X509_PKEY_free                     @591
     _X509_PKEY_new                      @592
@@ -697,6 +752,7 @@ EXPORTS
     _X509_STORE_CTX_get_error           @1016
     _X509_STORE_CTX_get_error_depth     @1017
     _X509_STORE_CTX_get_ex_data         @1018
+    _X509_STORE_CTX_get_ex_new_index    @1100
     _X509_STORE_CTX_init                @623
     _X509_STORE_CTX_set_cert            @1020
     _X509_STORE_CTX_set_chain           @1021
@@ -786,15 +842,26 @@ EXPORTS
     _asn1_GetSequence                   @703
     _asn1_add_error                     @1091
     _bn_add_words                       @1039
-    _bn_div64                           @704
+    _bn_cmp_words                       @1123
+    _bn_div_words                       @704
     _bn_expand2                         @705
     _bn_mul_add_words                   @706
+    _bn_mul_comba4                      @1119
+    _bn_mul_comba8                      @1118
+    _bn_mul_low_normal                  @1127
+    _bn_mul_normal                      @1117
+    _bn_mul_part_recursive              @1125
+    _bn_mul_recursive                   @1124
     _bn_mul_words                       @707
-    _bn_qadd                            @708
-    _bn_qsub                            @709
+    _bn_sqr_comba4                      @1122
+    _bn_sqr_comba8                      @1121
+    _bn_sqr_normal                      @1120
+    _bn_sqr_recursive                   @1126
     _bn_sqr_words                       @710
+    _bn_sub_words                       @1116
     _crypt                              @711
     _d2i_ASN1_BIT_STRING                @712
+    _d2i_ASN1_BMPSTRING                 @1092
     _d2i_ASN1_BOOLEAN                   @713
     _d2i_ASN1_HEADER                    @714
     _d2i_ASN1_IA5STRING                 @715
@@ -895,6 +962,7 @@ EXPORTS
     _i2a_ASN1_OBJECT                    @816
     _i2a_ASN1_STRING                    @817
     _i2d_ASN1_BIT_STRING                @818
+    _i2d_ASN1_BMPSTRING                 @1093
     _i2d_ASN1_BOOLEAN                   @819
     _i2d_ASN1_HEADER                    @820
     _i2d_ASN1_IA5STRING                 @821
@@ -970,6 +1038,11 @@ EXPORTS
     _lh_retrieve                        @897
     _lh_stats_bio                       @899
     _lh_strhash                         @900
+    _ms_time_cmp                        @1151
+    _ms_time_diff                       @1148
+    _ms_time_free                       @1150
+    _ms_time_get                        @1152
+    _ms_time_new                        @1149
     _sk_delete                          @901
     _sk_delete_ptr                      @902
     _sk_dup                             @903
index 196c52216eb628be5c5005f55eee96bb74b03af5..509a4085e23f05a70c29b308a531108322efba81 100644 (file)
@@ -78,12 +78,14 @@ EXPORTS
     BIO_f_md                           @60
     BIO_f_nbio_test                    @915
     BIO_f_null                         @61
+    BIO_f_proxy_server                 @62
     BIO_fd_non_fatal_error             @63
     BIO_fd_should_retry                @64
     BIO_find_type                      @65
     BIO_free                           @66
     BIO_free_all                       @67
     BIO_get_accept_socket              @69
+    BIO_get_filter_bio                 @70
     BIO_get_host_ip                    @71
     BIO_get_port                       @72
     BIO_get_retry_BIO                  @73
@@ -99,6 +101,7 @@ EXPORTS
     BIO_new_file                       @82
     BIO_new_fp                         @83
     BIO_new_socket                     @84
+    BIO_new_socks4a_connect            @1110
     BIO_pop                            @85
     BIO_printf                         @86
     BIO_ptr_ctrl                       @969
@@ -111,7 +114,9 @@ EXPORTS
     BIO_s_file                         @93
     BIO_s_mem                          @95
     BIO_s_null                         @96
+    BIO_s_proxy_client                 @97
     BIO_s_socket                       @98
+    BIO_s_socks4a_connect              @1111
     BIO_set                            @100
     BIO_set_cipher                     @101
     BIO_set_tcp_ndelay                 @102
@@ -121,6 +126,7 @@ EXPORTS
     BIO_sock_non_fatal_error           @106
     BIO_sock_should_retry              @107
     BIO_socket_ioctl                   @108
+    BIO_socket_nbio                    @1102
     BIO_write                          @109
     BN_BLINDING_convert                @973
     BN_BLINDING_free                   @981
@@ -128,10 +134,16 @@ EXPORTS
     BN_BLINDING_new                    @980
     BN_BLINDING_update                 @975
     BN_CTX_free                        @110
+    BN_CTX_init                        @1135
     BN_CTX_new                         @111
     BN_MONT_CTX_free                   @112
+    BN_MONT_CTX_init                   @1136
     BN_MONT_CTX_new                    @113
     BN_MONT_CTX_set                    @114
+    BN_RECP_CTX_free                   @1130
+    BN_RECP_CTX_init                   @1128
+    BN_RECP_CTX_new                    @1129
+    BN_RECP_CTX_set                    @1131
     BN_add                             @115
     BN_add_word                        @116
     BN_bin2bn                          @118
@@ -146,6 +158,7 @@ EXPORTS
     BN_copy                            @125
     BN_dec2bn                          @1001
     BN_div                             @126
+    BN_div_recp                        @1134
     BN_div_word                        @127
     BN_dup                             @128
     BN_exp                             @998
@@ -155,6 +168,7 @@ EXPORTS
     BN_generate_prime                  @132
     BN_get_word                        @133
     BN_hex2bn                          @117
+    BN_init                            @1095
     BN_is_bit_set                      @134
     BN_is_prime                        @135
     BN_lshift                          @136
@@ -163,12 +177,12 @@ EXPORTS
     BN_mod                             @139
     BN_mod_exp                         @140
     BN_mod_exp_mont                    @141
-    BN_mod_exp_recp                    @142
+    BN_mod_exp_recp                    @1133
     BN_mod_exp_simple                  @143
     BN_mod_inverse                     @144
     BN_mod_mul                         @145
     BN_mod_mul_montgomery              @146
-    BN_mod_mul_reciprocal              @147
+    BN_mod_mul_reciprocal              @1132
     BN_mod_word                        @148
     BN_mpi2bn                          @1059
     BN_mul                             @149
@@ -189,7 +203,9 @@ EXPORTS
     BN_sub                             @163
     BN_sub_word                        @1000
     BN_to_ASN1_INTEGER                 @164
+    BN_uadd                            @708
     BN_ucmp                            @165
+    BN_usub                            @709
     BN_value_one                       @166
     BUF_MEM_free                       @167
     BUF_MEM_grow                       @168
@@ -202,6 +218,12 @@ EXPORTS
     CAST_encrypt                       @989
     CAST_ofb64_encrypt                 @994
     CAST_set_key                       @988
+    COMP_CTX_free                      @1097
+    COMP_CTX_new                       @1096
+    COMP_compress_block                @1144
+    COMP_expand_block                  @1145
+    COMP_rle                           @1146
+    COMP_zlib                          @1147
     CONF_free                          @171
     CONF_get_number                    @172
     CONF_get_section                   @173
@@ -285,6 +307,7 @@ EXPORTS
     ERR_load_OBJ_strings               @241
     ERR_load_PEM_strings               @242
     ERR_load_PKCS7_strings             @919
+    ERR_load_PROXY_strings             @243
     ERR_load_RSA_strings               @244
     ERR_load_X509_strings              @245
     ERR_load_crypto_strings            @246
@@ -342,7 +365,6 @@ EXPORTS
     EVP_SealInit                       @288
     EVP_SignFinal                      @289
     EVP_VerifyFinal                    @290
-    EVP_add_alias                      @291
     EVP_add_cipher                     @292
     EVP_add_digest                     @293
     EVP_bf_cbc                         @294
@@ -354,7 +376,6 @@ EXPORTS
     EVP_cast5_ecb                      @985
     EVP_cast5_ofb                      @986
     EVP_cleanup                        @298
-    EVP_delete_alias                   @941
     EVP_des_cbc                        @299
     EVP_des_cfb                        @300
     EVP_des_ecb                        @301
@@ -383,6 +404,7 @@ EXPORTS
     EVP_md_null                        @324
     EVP_mdc2                           @942
     EVP_rc2_40_cbc                     @959
+    EVP_rc2_64_cbc                     @1103
     EVP_rc2_cbc                        @325
     EVP_rc2_cfb                        @326
     EVP_rc2_ecb                        @327
@@ -422,6 +444,12 @@ EXPORTS
     NETSCAPE_SPKI_new                  @350
     NETSCAPE_SPKI_sign                 @351
     NETSCAPE_SPKI_verify               @352
+    OBJ_NAME_add                       @1101
+    OBJ_NAME_cleanup                   @1104
+    OBJ_NAME_get                       @1105
+    OBJ_NAME_init                      @1106
+    OBJ_NAME_new_index                 @1107
+    OBJ_NAME_remove                    @1108
     OBJ_add_object                     @353
     OBJ_bsearch                        @354
     OBJ_cleanup                        @355
@@ -517,32 +545,58 @@ EXPORTS
     PKCS7_SIGNER_INFO_set              @930
     PKCS7_SIGN_ENVELOPE_free           @441
     PKCS7_SIGN_ENVELOPE_new            @442
+    PKCS7_add_attribute                @1138
     PKCS7_add_certificate              @932
     PKCS7_add_crl                      @933
     PKCS7_add_recipient                @1073
     PKCS7_add_recipient_info           @1074
     PKCS7_add_signature                @938
+    PKCS7_add_signed_attribute         @1139
     PKCS7_add_signer                   @931
     PKCS7_cert_from_signer_info        @939
     PKCS7_content_free                 @918
     PKCS7_content_new                  @934
     PKCS7_ctrl                         @927
     PKCS7_dataInit                     @937
-    PKCS7_dataSign                     @935
     PKCS7_dataVerify                   @936
+    PKCS7_digest_from_attributes       @1140
     PKCS7_dup                          @443
     PKCS7_free                         @444
+    PKCS7_get_attribute                @1141
+    PKCS7_get_issuer_and_serial        @1142
+    PKCS7_get_signed_attribute         @1143
     PKCS7_get_signer_info              @940
     PKCS7_new                          @445
     PKCS7_set_cipher                   @1075
     PKCS7_set_content                  @929
     PKCS7_set_type                     @928
+    PROXY_ENTRY_add_noproxy            @446
+    PROXY_ENTRY_clear_noproxy          @447
+    PROXY_ENTRY_free                   @448
+    PROXY_ENTRY_get_noproxy            @449
+    PROXY_ENTRY_new                    @450
+    PROXY_ENTRY_set_server             @451
+    PROXY_add_noproxy                  @452
+    PROXY_add_server                   @453
+    PROXY_check_by_host                @454
+    PROXY_check_url                    @455
+    PROXY_clear_noproxy                @456
+    PROXY_free                         @457
+    PROXY_get_noproxy                  @458
+    PROXY_get_proxies                  @459
+    PROXY_get_proxy_entry              @460
+    PROXY_load_conf                    @461
+    PROXY_new                          @462
+    PROXY_print                        @463
+    RAND_SSLeay                        @1113
     RAND_bytes                         @464
     RAND_cleanup                       @465
     RAND_file_name                     @466
+    RAND_get_rand_method               @1137
     RAND_load_file                     @467
     RAND_screen                        @468
     RAND_seed                          @469
+    RAND_set_rand_method               @1114
     RAND_write_file                    @470
     RC2_cbc_encrypt                    @471
     RC2_cfb64_encrypt                  @472
@@ -577,6 +631,7 @@ EXPORTS
     RSA_generate_key                   @485
     RSA_get_ex_data                    @1029
     RSA_get_ex_new_index               @1030
+    RSA_memory_lock                    @1115
     RSA_new                            @486
     RSA_new_method                     @487
     RSA_padding_add_PKCS1_type_1       @1031
@@ -688,7 +743,7 @@ EXPORTS
     X509_NAME_print                    @586
     X509_NAME_set                      @587
     X509_OBJECT_free_contents          @588
-    X509_OBJECT_retrive_by_subject     @589
+    X509_OBJECT_retrieve_by_subject    @589
     X509_OBJECT_up_ref_count           @590
     X509_PKEY_free                     @591
     X509_PKEY_new                      @592
@@ -727,6 +782,7 @@ EXPORTS
     X509_STORE_CTX_get_error           @1016
     X509_STORE_CTX_get_error_depth     @1017
     X509_STORE_CTX_get_ex_data         @1018
+    X509_STORE_CTX_get_ex_new_index    @1100
     X509_STORE_CTX_init                @623
     X509_STORE_CTX_set_cert            @1020
     X509_STORE_CTX_set_chain           @1021
@@ -817,15 +873,26 @@ EXPORTS
     asn1_GetSequence                   @703
     asn1_add_error                     @1091
     bn_add_words                       @1039
-    bn_div64                           @704
+    bn_cmp_words                       @1123
+    bn_div_words                       @704
     bn_expand2                         @705
     bn_mul_add_words                   @706
+    bn_mul_comba4                      @1119
+    bn_mul_comba8                      @1118
+    bn_mul_low_normal                  @1127
+    bn_mul_normal                      @1117
+    bn_mul_part_recursive              @1125
+    bn_mul_recursive                   @1124
     bn_mul_words                       @707
-    bn_qadd                            @708
-    bn_qsub                            @709
+    bn_sqr_comba4                      @1122
+    bn_sqr_comba8                      @1121
+    bn_sqr_normal                      @1120
+    bn_sqr_recursive                   @1126
     bn_sqr_words                       @710
+    bn_sub_words                       @1116
     crypt                              @711
     d2i_ASN1_BIT_STRING                @712
+    d2i_ASN1_BMPSTRING                 @1092
     d2i_ASN1_BOOLEAN                   @713
     d2i_ASN1_HEADER                    @714
     d2i_ASN1_IA5STRING                 @715
@@ -933,6 +1000,7 @@ EXPORTS
     i2a_ASN1_OBJECT                    @816
     i2a_ASN1_STRING                    @817
     i2d_ASN1_BIT_STRING                @818
+    i2d_ASN1_BMPSTRING                 @1093
     i2d_ASN1_BOOLEAN                   @819
     i2d_ASN1_HEADER                    @820
     i2d_ASN1_IA5STRING                 @821
@@ -1018,6 +1086,11 @@ EXPORTS
     lh_stats                           @898
     lh_stats_bio                       @899
     lh_strhash                         @900
+    ms_time_cmp                        @1151
+    ms_time_diff                       @1148
+    ms_time_free                       @1150
+    ms_time_get                        @1152
+    ms_time_new                        @1149
     sk_delete                          @901
     sk_delete_ptr                      @902
     sk_dup                             @903
index 044cd909bc6683875948f3cfed614b57abfa288c..389ac22bf261761255edd001d7c35a32a37a2d99 100644 (file)
@@ -14,8 +14,9 @@
 INSTALLTOP=\usr\local\ssl
 
 # Set your compiler options
+PLATFORM=VC-WIN32
 CC=cl
-CFLAG= /MD /W3 /WX /G5 /Ox /O2 /Ob2 /Gs0 /GF /Gy /nologo -DWIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM
+CFLAG= /MD /W3 /WX /G5 /Ox /O2 /Ob2 /Gs0 /GF /Gy /nologo -DWIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM /Fdout32dll
 APP_CFLAG=
 LIB_CFLAG= /GD -D_WINDLL -D_DLL
 SHLIB_CFLAG=
@@ -31,12 +32,10 @@ SRC_D=.
 LINK=link
 LFLAGS=/nologo /subsystem:console /machine:I386 /opt:ref
 
-BN_MULW_OBJ=crypto\bn\asm\bn-win32.obj
-BN_MULW_SRC=crypto\bn\asm\bn-win32.asm
+BN_ASM_OBJ=crypto\bn\asm\bn-win32.obj
+BN_ASM_SRC=crypto\bn\asm\bn-win32.asm
 DES_ENC_OBJ=crypto\des\asm\d-win32.obj crypto\des\asm\y-win32.obj
 DES_ENC_SRC=crypto\des\asm\d-win32.asm crypto\des\asm\y-win32.asm
-DES_CRYPT_OBJ=
-DES_CRYPT_SRC=
 BF_ENC_OBJ=crypto\bf\asm\b-win32.obj
 BF_ENC_SRC=crypto\bf\asm\b-win32.asm
 CAST_ENC_OBJ=crypto\cast\asm\c-win32.obj
@@ -59,7 +58,7 @@ TMP_D=tmp32dll
 # The output directory for the header files
 INC_D=inc32
 
-CP=copy
+CP="copy /b nul+ "
 RM=del
 RANLIB=
 MKDIR=mkdir
@@ -120,21 +119,22 @@ HEADER=$(INCL_D)\cryptlib.h \
        $(INCL_D)\cast_lcl.h $(INCL_D)\bn_lcl.h $(INCL_D)\bn_prime.h \
        $(INCL_D)\obj_dat.h $(INCL_D)\conf_lcl.h $(INCL_D)\ssl_locl.h \
        $(INCL_D)\rsaref.h $(INCL_D)\apps.h $(INCL_D)\progs.h \
-       $(INCL_D)\s_apps.h $(INCL_D)\testdsa.h $(INCL_D)\testrsa.h
+       $(INCL_D)\testdsa.h $(INCL_D)\testrsa.h
 
 EXHEADER=$(INC_D)\e_os.h \
-       $(INC_D)\crypto.h $(INC_D)\cryptall.h $(INC_D)\md2.h \
-       $(INC_D)\md5.h $(INC_D)\sha.h $(INC_D)\mdc2.h \
-       $(INC_D)\hmac.h $(INC_D)\ripemd.h $(INC_D)\des.h \
-       $(INC_D)\rc2.h $(INC_D)\rc4.h $(INC_D)\rc5.h \
-       $(INC_D)\idea.h $(INC_D)\blowfish.h $(INC_D)\cast.h \
-       $(INC_D)\bn.h $(INC_D)\rsa.h $(INC_D)\dsa.h \
-       $(INC_D)\dh.h $(INC_D)\buffer.h $(INC_D)\bio.h \
-       $(INC_D)\bss_file.c $(INC_D)\stack.h $(INC_D)\lhash.h \
-       $(INC_D)\rand.h $(INC_D)\err.h $(INC_D)\objects.h \
-       $(INC_D)\evp.h $(INC_D)\pem.h $(INC_D)\asn1.h \
-       $(INC_D)\asn1_mac.h $(INC_D)\x509.h $(INC_D)\x509_vfy.h \
-       $(INC_D)\conf.h $(INC_D)\txt_db.h $(INC_D)\pkcs7.h \
+       $(INC_D)\crypto.h $(INC_D)\cryptall.h $(INC_D)\tmdiff.h \
+       $(INC_D)\md2.h $(INC_D)\md5.h $(INC_D)\sha.h \
+       $(INC_D)\mdc2.h $(INC_D)\hmac.h $(INC_D)\ripemd.h \
+       $(INC_D)\des.h $(INC_D)\rc2.h $(INC_D)\rc4.h \
+       $(INC_D)\rc5.h $(INC_D)\idea.h $(INC_D)\blowfish.h \
+       $(INC_D)\cast.h $(INC_D)\bn.h $(INC_D)\rsa.h \
+       $(INC_D)\dsa.h $(INC_D)\dh.h $(INC_D)\buffer.h \
+       $(INC_D)\bio.h $(INC_D)\bss_file.c $(INC_D)\stack.h \
+       $(INC_D)\lhash.h $(INC_D)\rand.h $(INC_D)\err.h \
+       $(INC_D)\objects.h $(INC_D)\evp.h $(INC_D)\pem.h \
+       $(INC_D)\asn1.h $(INC_D)\asn1_mac.h $(INC_D)\x509.h \
+       $(INC_D)\x509_vfy.h $(INC_D)\conf.h $(INC_D)\txt_db.h \
+       $(INC_D)\pkcs7.h $(INC_D)\proxy.h $(INC_D)\comp.h \
        $(INC_D)\ssl.h $(INC_D)\ssl2.h $(INC_D)\ssl3.h \
        $(INC_D)\ssl23.h $(INC_D)\tls1.h
 
@@ -154,42 +154,43 @@ E_OBJ=$(OBJ_D)\verify.obj \
        $(OBJ_D)\crl2p7.obj $(OBJ_D)\crl.obj $(OBJ_D)\rsa.obj \
        $(OBJ_D)\dsa.obj $(OBJ_D)\dsaparam.obj $(OBJ_D)\x509.obj \
        $(OBJ_D)\genrsa.obj $(OBJ_D)\s_server.obj $(OBJ_D)\s_client.obj \
-       $(OBJ_D)\speed.obj $(OBJ_D)\s_time.obj $(OBJ_D)\apps.obj \
-       $(OBJ_D)\s_cb.obj $(OBJ_D)\s_socket.obj $(OBJ_D)\version.obj \
+       $(OBJ_D)\speed.obj $(OBJ_D)\s_time.obj \
+       $(OBJ_D)\apps.obj $(OBJ_D)\s_cb.obj $(OBJ_D)\s_socket.obj \
+       $(OBJ_D)\bf_perm.obj $(OBJ_D)\version.obj \
        $(OBJ_D)\sess_id.obj $(OBJ_D)\ciphers.obj $(OBJ_D)\ssleay.obj
 
 CRYPTOOBJ=$(OBJ_D)\cryptlib.obj \
        $(OBJ_D)\mem.obj $(OBJ_D)\cversion.obj $(OBJ_D)\ex_data.obj \
-       $(OBJ_D)\cpt_err.obj $(OBJ_D)\md2_dgst.obj $(OBJ_D)\md2_one.obj \
-       $(OBJ_D)\md5_dgst.obj $(MD5_ASM_OBJ) $(OBJ_D)\md5_one.obj \
-       $(OBJ_D)\sha_dgst.obj $(OBJ_D)\sha1dgst.obj $(SHA1_ASM_OBJ) \
-       $(OBJ_D)\sha_one.obj $(OBJ_D)\sha1_one.obj $(OBJ_D)\mdc2dgst.obj \
-       $(OBJ_D)\mdc2_one.obj $(OBJ_D)\hmac.obj $(OBJ_D)\rmd_dgst.obj \
-       $(RMD160_ASM_OBJ) $(OBJ_D)\rmd_one.obj $(OBJ_D)\set_key.obj \
-       $(OBJ_D)\ecb_enc.obj $(OBJ_D)\cbc_enc.obj $(OBJ_D)\ecb3_enc.obj \
-       $(OBJ_D)\cfb64enc.obj $(OBJ_D)\cfb64ede.obj $(OBJ_D)\cfb_enc.obj \
-       $(OBJ_D)\ofb64ede.obj $(OBJ_D)\enc_read.obj $(OBJ_D)\enc_writ.obj \
-       $(OBJ_D)\ofb64enc.obj $(OBJ_D)\ofb_enc.obj $(OBJ_D)\str2key.obj \
-       $(OBJ_D)\pcbc_enc.obj $(OBJ_D)\qud_cksm.obj $(OBJ_D)\rand_key.obj \
-       $(DES_ENC_OBJ) $(OBJ_D)\read2pwd.obj $(OBJ_D)\fcrypt.obj \
-       $(OBJ_D)\xcbc_enc.obj $(OBJ_D)\read_pwd.obj $(OBJ_D)\rpc_enc.obj \
-       $(OBJ_D)\cbc_cksm.obj $(OBJ_D)\supp.obj $(OBJ_D)\rc2_ecb.obj \
-       $(OBJ_D)\rc2_skey.obj $(OBJ_D)\rc2_cbc.obj $(OBJ_D)\rc2cfb64.obj \
-       $(OBJ_D)\rc2ofb64.obj $(OBJ_D)\rc4_skey.obj $(RC4_ENC_OBJ) \
-       $(OBJ_D)\rc5_skey.obj $(OBJ_D)\rc5_ecb.obj $(RC5_ENC_OBJ) \
-       $(OBJ_D)\rc5cfb64.obj $(OBJ_D)\rc5ofb64.obj $(OBJ_D)\i_cbc.obj \
-       $(OBJ_D)\i_cfb64.obj $(OBJ_D)\i_ofb64.obj $(OBJ_D)\i_ecb.obj \
-       $(OBJ_D)\i_skey.obj $(OBJ_D)\bf_skey.obj $(OBJ_D)\bf_ecb.obj \
-       $(BF_ENC_OBJ) $(OBJ_D)\bf_cfb64.obj $(OBJ_D)\bf_ofb64.obj \
-       $(OBJ_D)\c_skey.obj $(OBJ_D)\c_ecb.obj $(CAST_ENC_OBJ) \
-       $(OBJ_D)\c_cfb64.obj $(OBJ_D)\c_ofb64.obj $(OBJ_D)\bn_add.obj \
-       $(OBJ_D)\bn_div.obj $(OBJ_D)\bn_exp.obj $(OBJ_D)\bn_lib.obj \
-       $(OBJ_D)\bn_mod.obj $(OBJ_D)\bn_mul.obj $(OBJ_D)\bn_print.obj \
-       $(OBJ_D)\bn_rand.obj $(OBJ_D)\bn_shift.obj $(OBJ_D)\bn_sub.obj \
-       $(OBJ_D)\bn_word.obj $(OBJ_D)\bn_blind.obj $(OBJ_D)\bn_gcd.obj \
-       $(OBJ_D)\bn_prime.obj $(OBJ_D)\bn_err.obj $(OBJ_D)\bn_sqr.obj \
-       $(BN_MULW_OBJ) $(OBJ_D)\bn_recp.obj $(OBJ_D)\bn_mont.obj \
-       $(OBJ_D)\bn_mpi.obj $(OBJ_D)\rsa_eay.obj $(OBJ_D)\rsa_gen.obj \
+       $(OBJ_D)\tmdiff.obj $(OBJ_D)\cpt_err.obj $(OBJ_D)\md2_dgst.obj \
+       $(OBJ_D)\md2_one.obj $(OBJ_D)\md5_dgst.obj $(MD5_ASM_OBJ) \
+       $(OBJ_D)\md5_one.obj $(OBJ_D)\sha_dgst.obj $(OBJ_D)\sha1dgst.obj \
+       $(SHA1_ASM_OBJ) $(OBJ_D)\sha_one.obj $(OBJ_D)\sha1_one.obj \
+       $(OBJ_D)\mdc2dgst.obj $(OBJ_D)\mdc2_one.obj $(OBJ_D)\hmac.obj \
+       $(OBJ_D)\rmd_dgst.obj $(RMD160_ASM_OBJ) $(OBJ_D)\rmd_one.obj \
+       $(OBJ_D)\set_key.obj $(OBJ_D)\ecb_enc.obj $(OBJ_D)\cbc_enc.obj \
+       $(OBJ_D)\ecb3_enc.obj $(OBJ_D)\cfb64enc.obj $(OBJ_D)\cfb64ede.obj \
+       $(OBJ_D)\cfb_enc.obj $(OBJ_D)\ofb64ede.obj $(OBJ_D)\enc_read.obj \
+       $(OBJ_D)\enc_writ.obj $(OBJ_D)\ofb64enc.obj $(OBJ_D)\ofb_enc.obj \
+       $(OBJ_D)\str2key.obj $(OBJ_D)\pcbc_enc.obj $(OBJ_D)\qud_cksm.obj \
+       $(OBJ_D)\rand_key.obj $(DES_ENC_OBJ) $(OBJ_D)\read2pwd.obj \
+       $(OBJ_D)\fcrypt.obj $(OBJ_D)\xcbc_enc.obj $(OBJ_D)\read_pwd.obj \
+       $(OBJ_D)\rpc_enc.obj $(OBJ_D)\cbc_cksm.obj $(OBJ_D)\supp.obj \
+       $(OBJ_D)\rc2_ecb.obj $(OBJ_D)\rc2_skey.obj $(OBJ_D)\rc2_cbc.obj \
+       $(OBJ_D)\rc2cfb64.obj $(OBJ_D)\rc2ofb64.obj $(OBJ_D)\rc4_skey.obj \
+       $(RC4_ENC_OBJ) $(OBJ_D)\rc5_skey.obj $(OBJ_D)\rc5_ecb.obj \
+       $(RC5_ENC_OBJ) $(OBJ_D)\rc5cfb64.obj $(OBJ_D)\rc5ofb64.obj \
+       $(OBJ_D)\i_cbc.obj $(OBJ_D)\i_cfb64.obj $(OBJ_D)\i_ofb64.obj \
+       $(OBJ_D)\i_ecb.obj $(OBJ_D)\i_skey.obj $(OBJ_D)\bf_skey.obj \
+       $(OBJ_D)\bf_ecb.obj $(BF_ENC_OBJ) $(OBJ_D)\bf_cfb64.obj \
+       $(OBJ_D)\bf_ofb64.obj $(OBJ_D)\c_skey.obj $(OBJ_D)\c_ecb.obj \
+       $(CAST_ENC_OBJ) $(OBJ_D)\c_cfb64.obj $(OBJ_D)\c_ofb64.obj \
+       $(OBJ_D)\bn_add.obj $(OBJ_D)\bn_div.obj $(OBJ_D)\bn_exp.obj \
+       $(OBJ_D)\bn_lib.obj $(OBJ_D)\bn_mul.obj $(OBJ_D)\bn_print.obj \
+       $(OBJ_D)\bn_rand.obj $(OBJ_D)\bn_shift.obj $(OBJ_D)\bn_word.obj \
+       $(OBJ_D)\bn_blind.obj $(OBJ_D)\bn_gcd.obj $(OBJ_D)\bn_prime.obj \
+       $(OBJ_D)\bn_err.obj $(OBJ_D)\bn_sqr.obj $(BN_ASM_OBJ) \
+       $(OBJ_D)\bn_recp.obj $(OBJ_D)\bn_mont.obj $(OBJ_D)\bn_mpi.obj \
+       $(OBJ_D)\bn_exp2.obj $(OBJ_D)\rsa_eay.obj $(OBJ_D)\rsa_gen.obj \
        $(OBJ_D)\rsa_lib.obj $(OBJ_D)\rsa_sign.obj $(OBJ_D)\rsa_saos.obj \
        $(OBJ_D)\rsa_err.obj $(OBJ_D)\rsa_pk1.obj $(OBJ_D)\rsa_ssl.obj \
        $(OBJ_D)\rsa_none.obj $(OBJ_D)\dsa_gen.obj $(OBJ_D)\dsa_key.obj \
@@ -202,9 +203,10 @@ CRYPTOOBJ=$(OBJ_D)\cryptlib.obj \
        $(OBJ_D)\bss_sock.obj $(OBJ_D)\bss_conn.obj $(OBJ_D)\bf_null.obj \
        $(OBJ_D)\bf_buff.obj $(OBJ_D)\b_print.obj $(OBJ_D)\b_dump.obj \
        $(OBJ_D)\b_sock.obj $(OBJ_D)\bss_acpt.obj $(OBJ_D)\bf_nbio.obj \
-       $(OBJ_D)\stack.obj $(OBJ_D)\lhash.obj $(OBJ_D)\lh_stats.obj \
-       $(OBJ_D)\md_rand.obj $(OBJ_D)\randfile.obj $(OBJ_D)\err.obj \
-       $(OBJ_D)\err_all.obj $(OBJ_D)\err_prn.obj $(OBJ_D)\obj_dat.obj \
+       $(OBJ_D)\bss_cs4a.obj $(OBJ_D)\stack.obj $(OBJ_D)\lhash.obj \
+       $(OBJ_D)\lh_stats.obj $(OBJ_D)\md_rand.obj $(OBJ_D)\randfile.obj \
+       $(OBJ_D)\rand_lib.obj $(OBJ_D)\err.obj $(OBJ_D)\err_all.obj \
+       $(OBJ_D)\err_prn.obj $(OBJ_D)\o_names.obj $(OBJ_D)\obj_dat.obj \
        $(OBJ_D)\obj_lib.obj $(OBJ_D)\obj_err.obj $(OBJ_D)\encode.obj \
        $(OBJ_D)\digest.obj $(OBJ_D)\evp_enc.obj $(OBJ_D)\evp_key.obj \
        $(OBJ_D)\e_ecb_d.obj $(OBJ_D)\e_cbc_d.obj $(OBJ_D)\e_cfb_d.obj \
@@ -230,35 +232,38 @@ CRYPTOOBJ=$(OBJ_D)\cryptlib.obj \
        $(OBJ_D)\a_object.obj $(OBJ_D)\a_bitstr.obj $(OBJ_D)\a_utctm.obj \
        $(OBJ_D)\a_int.obj $(OBJ_D)\a_octet.obj $(OBJ_D)\a_print.obj \
        $(OBJ_D)\a_type.obj $(OBJ_D)\a_set.obj $(OBJ_D)\a_dup.obj \
-       $(OBJ_D)\a_d2i_fp.obj $(OBJ_D)\a_i2d_fp.obj $(OBJ_D)\a_sign.obj \
-       $(OBJ_D)\a_digest.obj $(OBJ_D)\a_verify.obj $(OBJ_D)\x_algor.obj \
-       $(OBJ_D)\x_val.obj $(OBJ_D)\x_pubkey.obj $(OBJ_D)\x_sig.obj \
-       $(OBJ_D)\x_req.obj $(OBJ_D)\x_attrib.obj $(OBJ_D)\x_name.obj \
-       $(OBJ_D)\x_cinf.obj $(OBJ_D)\x_x509.obj $(OBJ_D)\x_crl.obj \
-       $(OBJ_D)\x_info.obj $(OBJ_D)\x_spki.obj $(OBJ_D)\d2i_r_pr.obj \
-       $(OBJ_D)\i2d_r_pr.obj $(OBJ_D)\d2i_r_pu.obj $(OBJ_D)\i2d_r_pu.obj \
-       $(OBJ_D)\d2i_s_pr.obj $(OBJ_D)\i2d_s_pr.obj $(OBJ_D)\d2i_s_pu.obj \
-       $(OBJ_D)\i2d_s_pu.obj $(OBJ_D)\d2i_pu.obj $(OBJ_D)\d2i_pr.obj \
-       $(OBJ_D)\i2d_pu.obj $(OBJ_D)\i2d_pr.obj $(OBJ_D)\t_req.obj \
-       $(OBJ_D)\t_x509.obj $(OBJ_D)\t_pkey.obj $(OBJ_D)\p7_i_s.obj \
-       $(OBJ_D)\p7_signi.obj $(OBJ_D)\p7_signd.obj $(OBJ_D)\p7_recip.obj \
-       $(OBJ_D)\p7_enc_c.obj $(OBJ_D)\p7_evp.obj $(OBJ_D)\p7_dgst.obj \
-       $(OBJ_D)\p7_s_e.obj $(OBJ_D)\p7_enc.obj $(OBJ_D)\p7_lib.obj \
-       $(OBJ_D)\f_int.obj $(OBJ_D)\f_string.obj $(OBJ_D)\i2d_dhp.obj \
-       $(OBJ_D)\i2d_dsap.obj $(OBJ_D)\d2i_dhp.obj $(OBJ_D)\d2i_dsap.obj \
-       $(OBJ_D)\n_pkey.obj $(OBJ_D)\a_hdr.obj $(OBJ_D)\x_pkey.obj \
-       $(OBJ_D)\a_bool.obj $(OBJ_D)\x_exten.obj $(OBJ_D)\asn1_par.obj \
-       $(OBJ_D)\asn1_lib.obj $(OBJ_D)\asn1_err.obj $(OBJ_D)\a_meth.obj \
-       $(OBJ_D)\a_bytes.obj $(OBJ_D)\evp_asn1.obj $(OBJ_D)\x509_def.obj \
-       $(OBJ_D)\x509_d2.obj $(OBJ_D)\x509_r2x.obj $(OBJ_D)\x509_cmp.obj \
-       $(OBJ_D)\x509_obj.obj $(OBJ_D)\x509_req.obj $(OBJ_D)\x509_vfy.obj \
-       $(OBJ_D)\x509_set.obj $(OBJ_D)\x509rset.obj $(OBJ_D)\x509_err.obj \
-       $(OBJ_D)\x509name.obj $(OBJ_D)\x509_v3.obj $(OBJ_D)\x509_ext.obj \
-       $(OBJ_D)\x509pack.obj $(OBJ_D)\x509type.obj $(OBJ_D)\x509_lu.obj \
-       $(OBJ_D)\x_all.obj $(OBJ_D)\x509_txt.obj $(OBJ_D)\by_file.obj \
-       $(OBJ_D)\by_dir.obj $(OBJ_D)\v3_net.obj $(OBJ_D)\v3_x509.obj \
-       $(OBJ_D)\conf.obj $(OBJ_D)\conf_err.obj $(OBJ_D)\txt_db.obj \
-       $(OBJ_D)\pk7_lib.obj $(OBJ_D)\pkcs7err.obj $(OBJ_D)\pk7_doit.obj
+       $(OBJ_D)\a_d2i_fp.obj $(OBJ_D)\a_i2d_fp.obj $(OBJ_D)\a_bmp.obj \
+       $(OBJ_D)\a_sign.obj $(OBJ_D)\a_digest.obj $(OBJ_D)\a_verify.obj \
+       $(OBJ_D)\x_algor.obj $(OBJ_D)\x_val.obj $(OBJ_D)\x_pubkey.obj \
+       $(OBJ_D)\x_sig.obj $(OBJ_D)\x_req.obj $(OBJ_D)\x_attrib.obj \
+       $(OBJ_D)\x_name.obj $(OBJ_D)\x_cinf.obj $(OBJ_D)\x_x509.obj \
+       $(OBJ_D)\x_crl.obj $(OBJ_D)\x_info.obj $(OBJ_D)\x_spki.obj \
+       $(OBJ_D)\d2i_r_pr.obj $(OBJ_D)\i2d_r_pr.obj $(OBJ_D)\d2i_r_pu.obj \
+       $(OBJ_D)\i2d_r_pu.obj $(OBJ_D)\d2i_s_pr.obj $(OBJ_D)\i2d_s_pr.obj \
+       $(OBJ_D)\d2i_s_pu.obj $(OBJ_D)\i2d_s_pu.obj $(OBJ_D)\d2i_pu.obj \
+       $(OBJ_D)\d2i_pr.obj $(OBJ_D)\i2d_pu.obj $(OBJ_D)\i2d_pr.obj \
+       $(OBJ_D)\t_req.obj $(OBJ_D)\t_x509.obj $(OBJ_D)\t_pkey.obj \
+       $(OBJ_D)\p7_i_s.obj $(OBJ_D)\p7_signi.obj $(OBJ_D)\p7_signd.obj \
+       $(OBJ_D)\p7_recip.obj $(OBJ_D)\p7_enc_c.obj $(OBJ_D)\p7_evp.obj \
+       $(OBJ_D)\p7_dgst.obj $(OBJ_D)\p7_s_e.obj $(OBJ_D)\p7_enc.obj \
+       $(OBJ_D)\p7_lib.obj $(OBJ_D)\f_int.obj $(OBJ_D)\f_string.obj \
+       $(OBJ_D)\i2d_dhp.obj $(OBJ_D)\i2d_dsap.obj $(OBJ_D)\d2i_dhp.obj \
+       $(OBJ_D)\d2i_dsap.obj $(OBJ_D)\n_pkey.obj $(OBJ_D)\a_hdr.obj \
+       $(OBJ_D)\x_pkey.obj $(OBJ_D)\a_bool.obj $(OBJ_D)\x_exten.obj \
+       $(OBJ_D)\asn1_par.obj $(OBJ_D)\asn1_lib.obj $(OBJ_D)\asn1_err.obj \
+       $(OBJ_D)\a_meth.obj $(OBJ_D)\a_bytes.obj $(OBJ_D)\evp_asn1.obj \
+       $(OBJ_D)\x509_def.obj $(OBJ_D)\x509_d2.obj $(OBJ_D)\x509_r2x.obj \
+       $(OBJ_D)\x509_cmp.obj $(OBJ_D)\x509_obj.obj $(OBJ_D)\x509_req.obj \
+       $(OBJ_D)\x509_vfy.obj $(OBJ_D)\x509_set.obj $(OBJ_D)\x509rset.obj \
+       $(OBJ_D)\x509_err.obj $(OBJ_D)\x509name.obj $(OBJ_D)\x509_v3.obj \
+       $(OBJ_D)\x509_ext.obj $(OBJ_D)\x509pack.obj $(OBJ_D)\x509type.obj \
+       $(OBJ_D)\x509_lu.obj $(OBJ_D)\x_all.obj $(OBJ_D)\x509_txt.obj \
+       $(OBJ_D)\by_file.obj $(OBJ_D)\by_dir.obj $(OBJ_D)\v3_net.obj \
+       $(OBJ_D)\v3_x509.obj $(OBJ_D)\conf.obj $(OBJ_D)\conf_err.obj \
+       $(OBJ_D)\txt_db.obj $(OBJ_D)\pk7_lib.obj $(OBJ_D)\pkcs7err.obj \
+       $(OBJ_D)\pk7_doit.obj $(OBJ_D)\proxy.obj $(OBJ_D)\pxy_txt.obj \
+       $(OBJ_D)\bf_proxy.obj $(OBJ_D)\pxy_conf.obj $(OBJ_D)\pxy_err.obj \
+       $(OBJ_D)\comp_lib.obj $(OBJ_D)\c_rle.obj $(OBJ_D)\c_zlib.obj
 
 SSLOBJ=$(OBJ_D)\s2_meth.obj \
        $(OBJ_D)\s2_srvr.obj $(OBJ_D)\s2_clnt.obj $(OBJ_D)\s2_lib.obj \
@@ -272,7 +277,7 @@ SSLOBJ=$(OBJ_D)\s2_meth.obj \
        $(OBJ_D)\ssl_cert.obj $(OBJ_D)\ssl_sess.obj $(OBJ_D)\ssl_ciph.obj \
        $(OBJ_D)\ssl_stat.obj $(OBJ_D)\ssl_rsa.obj $(OBJ_D)\ssl_asn1.obj \
        $(OBJ_D)\ssl_txt.obj $(OBJ_D)\ssl_algs.obj $(OBJ_D)\bio_ssl.obj \
-       $(OBJ_D)\ssl_err.obj
+       $(OBJ_D)\pxy_ssl.obj $(OBJ_D)\ssl_err.obj
 
 RSAGLUEOBJ=$(OBJ_D)\rsaref.obj \
        $(OBJ_D)\rsar_err.obj
@@ -432,6 +437,9 @@ $(INC_D)\crypto.h: $(SRC_D)\crypto\crypto.h
 $(INC_D)\cryptall.h: $(SRC_D)\crypto\cryptall.h
        $(CP) $(SRC_D)\crypto\cryptall.h $(INC_D)\cryptall.h
 
+$(INC_D)\tmdiff.h: $(SRC_D)\crypto\tmdiff.h
+       $(CP) $(SRC_D)\crypto\tmdiff.h $(INC_D)\tmdiff.h
+
 $(INC_D)\md2.h: $(SRC_D)\crypto\md2\md2.h
        $(CP) $(SRC_D)\crypto\md2\md2.h $(INC_D)\md2.h
 
@@ -534,6 +542,12 @@ $(INC_D)\txt_db.h: $(SRC_D)\crypto\txt_db\txt_db.h
 $(INC_D)\pkcs7.h: $(SRC_D)\crypto\pkcs7\pkcs7.h
        $(CP) $(SRC_D)\crypto\pkcs7\pkcs7.h $(INC_D)\pkcs7.h
 
+$(INC_D)\proxy.h: $(SRC_D)\crypto\proxy\proxy.h
+       $(CP) $(SRC_D)\crypto\proxy\proxy.h $(INC_D)\proxy.h
+
+$(INC_D)\comp.h: $(SRC_D)\crypto\comp\comp.h
+       $(CP) $(SRC_D)\crypto\comp\comp.h $(INC_D)\comp.h
+
 $(INC_D)\ssl.h: $(SRC_D)\ssl\ssl.h
        $(CP) $(SRC_D)\ssl\ssl.h $(INC_D)\ssl.h
 
@@ -681,6 +695,9 @@ $(OBJ_D)\s_cb.obj: $(SRC_D)\apps\s_cb.c
 $(OBJ_D)\s_socket.obj: $(SRC_D)\apps\s_socket.c
        $(CC) /Fo$(OBJ_D)\s_socket.obj -DMONOLITH $(APP_CFLAGS) -c $(SRC_D)\apps\s_socket.c
 
+$(OBJ_D)\bf_perm.obj: $(SRC_D)\apps\bf_perm.c
+       $(CC) /Fo$(OBJ_D)\bf_perm.obj -DMONOLITH $(APP_CFLAGS) -c $(SRC_D)\apps\bf_perm.c
+
 $(OBJ_D)\version.obj: $(SRC_D)\apps\version.c
        $(CC) /Fo$(OBJ_D)\version.obj -DMONOLITH $(APP_CFLAGS) -c $(SRC_D)\apps\version.c
 
@@ -730,11 +747,14 @@ $(OBJ_D)\mem.obj: $(SRC_D)\crypto\mem.c
        $(CC) /Fo$(OBJ_D)\mem.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\mem.c
 
 $(OBJ_D)\cversion.obj: $(SRC_D)\crypto\cversion.c
-       $(CC) /Fo$(OBJ_D)\cversion.obj  $(SHLIB_CFLAGS) -DCFLAGS="\"$(CC) $(CFLAG)\"" -c $(SRC_D)\crypto\cversion.c
+       $(CC) /Fo$(OBJ_D)\cversion.obj  $(SHLIB_CFLAGS) -DCFLAGS="\"$(CC) $(CFLAG)\"" -DPLATFORM="\"$(PLATFORM)\"" -c $(SRC_D)\crypto\cversion.c
 
 $(OBJ_D)\ex_data.obj: $(SRC_D)\crypto\ex_data.c
        $(CC) /Fo$(OBJ_D)\ex_data.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\ex_data.c
 
+$(OBJ_D)\tmdiff.obj: $(SRC_D)\crypto\tmdiff.c
+       $(CC) /Fo$(OBJ_D)\tmdiff.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\tmdiff.c
+
 $(OBJ_D)\cpt_err.obj: $(SRC_D)\crypto\cpt_err.c
        $(CC) /Fo$(OBJ_D)\cpt_err.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\cpt_err.c
 
@@ -945,9 +965,6 @@ $(OBJ_D)\bn_exp.obj: $(SRC_D)\crypto\bn\bn_exp.c
 $(OBJ_D)\bn_lib.obj: $(SRC_D)\crypto\bn\bn_lib.c
        $(CC) /Fo$(OBJ_D)\bn_lib.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_lib.c
 
-$(OBJ_D)\bn_mod.obj: $(SRC_D)\crypto\bn\bn_mod.c
-       $(CC) /Fo$(OBJ_D)\bn_mod.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_mod.c
-
 $(OBJ_D)\bn_mul.obj: $(SRC_D)\crypto\bn\bn_mul.c
        $(CC) /Fo$(OBJ_D)\bn_mul.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_mul.c
 
@@ -960,9 +977,6 @@ $(OBJ_D)\bn_rand.obj: $(SRC_D)\crypto\bn\bn_rand.c
 $(OBJ_D)\bn_shift.obj: $(SRC_D)\crypto\bn\bn_shift.c
        $(CC) /Fo$(OBJ_D)\bn_shift.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_shift.c
 
-$(OBJ_D)\bn_sub.obj: $(SRC_D)\crypto\bn\bn_sub.c
-       $(CC) /Fo$(OBJ_D)\bn_sub.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_sub.c
-
 $(OBJ_D)\bn_word.obj: $(SRC_D)\crypto\bn\bn_word.c
        $(CC) /Fo$(OBJ_D)\bn_word.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_word.c
 
@@ -981,8 +995,8 @@ $(OBJ_D)\bn_err.obj: $(SRC_D)\crypto\bn\bn_err.c
 $(OBJ_D)\bn_sqr.obj: $(SRC_D)\crypto\bn\bn_sqr.c
        $(CC) /Fo$(OBJ_D)\bn_sqr.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_sqr.c
 
-$(OBJ_D)\bn_mulw.obj: $(SRC_D)\crypto\bn\bn_mulw.c
-       $(CC) /Fo$(OBJ_D)\bn_mulw.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_mulw.c
+$(OBJ_D)\bn_asm.obj: $(SRC_D)\crypto\bn\bn_asm.c
+       $(CC) /Fo$(OBJ_D)\bn_asm.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_asm.c
 
 $(OBJ_D)\bn_recp.obj: $(SRC_D)\crypto\bn\bn_recp.c
        $(CC) /Fo$(OBJ_D)\bn_recp.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_recp.c
@@ -993,6 +1007,9 @@ $(OBJ_D)\bn_mont.obj: $(SRC_D)\crypto\bn\bn_mont.c
 $(OBJ_D)\bn_mpi.obj: $(SRC_D)\crypto\bn\bn_mpi.c
        $(CC) /Fo$(OBJ_D)\bn_mpi.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_mpi.c
 
+$(OBJ_D)\bn_exp2.obj: $(SRC_D)\crypto\bn\bn_exp2.c
+       $(CC) /Fo$(OBJ_D)\bn_exp2.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_exp2.c
+
 $(OBJ_D)\rsa_eay.obj: $(SRC_D)\crypto\rsa\rsa_eay.c
        $(CC) /Fo$(OBJ_D)\rsa_eay.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\rsa\rsa_eay.c
 
@@ -1107,6 +1124,9 @@ $(OBJ_D)\bss_acpt.obj: $(SRC_D)\crypto\bio\bss_acpt.c
 $(OBJ_D)\bf_nbio.obj: $(SRC_D)\crypto\bio\bf_nbio.c
        $(CC) /Fo$(OBJ_D)\bf_nbio.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bio\bf_nbio.c
 
+$(OBJ_D)\bss_cs4a.obj: $(SRC_D)\crypto\bio\bss_cs4a.c
+       $(CC) /Fo$(OBJ_D)\bss_cs4a.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bio\bss_cs4a.c
+
 $(OBJ_D)\stack.obj: $(SRC_D)\crypto\stack\stack.c
        $(CC) /Fo$(OBJ_D)\stack.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\stack\stack.c
 
@@ -1122,6 +1142,9 @@ $(OBJ_D)\md_rand.obj: $(SRC_D)\crypto\rand\md_rand.c
 $(OBJ_D)\randfile.obj: $(SRC_D)\crypto\rand\randfile.c
        $(CC) /Fo$(OBJ_D)\randfile.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\rand\randfile.c
 
+$(OBJ_D)\rand_lib.obj: $(SRC_D)\crypto\rand\rand_lib.c
+       $(CC) /Fo$(OBJ_D)\rand_lib.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\rand\rand_lib.c
+
 $(OBJ_D)\err.obj: $(SRC_D)\crypto\err\err.c
        $(CC) /Fo$(OBJ_D)\err.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\err\err.c
 
@@ -1131,6 +1154,9 @@ $(OBJ_D)\err_all.obj: $(SRC_D)\crypto\err\err_all.c
 $(OBJ_D)\err_prn.obj: $(SRC_D)\crypto\err\err_prn.c
        $(CC) /Fo$(OBJ_D)\err_prn.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\err\err_prn.c
 
+$(OBJ_D)\o_names.obj: $(SRC_D)\crypto\objects\o_names.c
+       $(CC) /Fo$(OBJ_D)\o_names.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\objects\o_names.c
+
 $(OBJ_D)\obj_dat.obj: $(SRC_D)\crypto\objects\obj_dat.c
        $(CC) /Fo$(OBJ_D)\obj_dat.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\objects\obj_dat.c
 
@@ -1365,6 +1391,9 @@ $(OBJ_D)\a_d2i_fp.obj: $(SRC_D)\crypto\asn1\a_d2i_fp.c
 $(OBJ_D)\a_i2d_fp.obj: $(SRC_D)\crypto\asn1\a_i2d_fp.c
        $(CC) /Fo$(OBJ_D)\a_i2d_fp.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\asn1\a_i2d_fp.c
 
+$(OBJ_D)\a_bmp.obj: $(SRC_D)\crypto\asn1\a_bmp.c
+       $(CC) /Fo$(OBJ_D)\a_bmp.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\asn1\a_bmp.c
+
 $(OBJ_D)\a_sign.obj: $(SRC_D)\crypto\asn1\a_sign.c
        $(CC) /Fo$(OBJ_D)\a_sign.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\asn1\a_sign.c
 
@@ -1620,6 +1649,30 @@ $(OBJ_D)\pkcs7err.obj: $(SRC_D)\crypto\pkcs7\pkcs7err.c
 $(OBJ_D)\pk7_doit.obj: $(SRC_D)\crypto\pkcs7\pk7_doit.c
        $(CC) /Fo$(OBJ_D)\pk7_doit.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\pkcs7\pk7_doit.c
 
+$(OBJ_D)\proxy.obj: $(SRC_D)\crypto\proxy\proxy.c
+       $(CC) /Fo$(OBJ_D)\proxy.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\proxy\proxy.c
+
+$(OBJ_D)\pxy_txt.obj: $(SRC_D)\crypto\proxy\pxy_txt.c
+       $(CC) /Fo$(OBJ_D)\pxy_txt.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\proxy\pxy_txt.c
+
+$(OBJ_D)\bf_proxy.obj: $(SRC_D)\crypto\proxy\bf_proxy.c
+       $(CC) /Fo$(OBJ_D)\bf_proxy.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\proxy\bf_proxy.c
+
+$(OBJ_D)\pxy_conf.obj: $(SRC_D)\crypto\proxy\pxy_conf.c
+       $(CC) /Fo$(OBJ_D)\pxy_conf.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\proxy\pxy_conf.c
+
+$(OBJ_D)\pxy_err.obj: $(SRC_D)\crypto\proxy\pxy_err.c
+       $(CC) /Fo$(OBJ_D)\pxy_err.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\proxy\pxy_err.c
+
+$(OBJ_D)\comp_lib.obj: $(SRC_D)\crypto\comp\comp_lib.c
+       $(CC) /Fo$(OBJ_D)\comp_lib.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\comp\comp_lib.c
+
+$(OBJ_D)\c_rle.obj: $(SRC_D)\crypto\comp\c_rle.c
+       $(CC) /Fo$(OBJ_D)\c_rle.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\comp\c_rle.c
+
+$(OBJ_D)\c_zlib.obj: $(SRC_D)\crypto\comp\c_zlib.c
+       $(CC) /Fo$(OBJ_D)\c_zlib.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\comp\c_zlib.c
+
 $(OBJ_D)\s2_meth.obj: $(SRC_D)\ssl\s2_meth.c
        $(CC) /Fo$(OBJ_D)\s2_meth.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\ssl\s2_meth.c
 
@@ -1722,6 +1775,9 @@ $(OBJ_D)\ssl_algs.obj: $(SRC_D)\ssl\ssl_algs.c
 $(OBJ_D)\bio_ssl.obj: $(SRC_D)\ssl\bio_ssl.c
        $(CC) /Fo$(OBJ_D)\bio_ssl.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\ssl\bio_ssl.c
 
+$(OBJ_D)\pxy_ssl.obj: $(SRC_D)\ssl\pxy_ssl.c
+       $(CC) /Fo$(OBJ_D)\pxy_ssl.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\ssl\pxy_ssl.c
+
 $(OBJ_D)\ssl_err.obj: $(SRC_D)\ssl\ssl_err.c
        $(CC) /Fo$(OBJ_D)\ssl_err.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\ssl\ssl_err.c
 
index 6a3dd4e2d03e5f5b0dcf2d53c47b3c41c015f3d0..d061fb2a07545dd5bfb223a12da4a47f53ff582c 100644 (file)
@@ -6,24 +6,24 @@ Certificate Request:
             Public Key Algorithm: rsaEncryption
             RSA Public Key: (512 bit)
                 Modulus (512 bit):
-                    00:c0:e2:84:c5:b7:5f:28:b7:a6:10:c1:8e:29:e0:
-                    60:a8:8d:da:6c:91:3d:cb:37:f7:5a:1a:cf:71:02:
-                    d1:03:23:3c:e5:83:f1:93:40:d0:61:6c:21:12:1f:
-                    62:d8:1c:46:59:80:19:ec:aa:ef:d4:4a:9d:b1:58:
-                    82:40:11:ae:05
+                    00:d0:34:0b:7a:73:3f:9d:c2:ba:0b:04:84:26:13:
+                    8e:d5:67:d9:50:f5:04:8b:8a:6f:a2:cf:5f:1d:6e:
+                    39:f6:38:77:ad:10:c0:0e:08:b7:7e:20:98:c6:84:
+                    55:49:08:6f:07:8e:e4:0d:9d:d5:88:d8:39:ca:b0:
+                    e1:cb:b1:7d:cb
                 Exponent: 65537 (0x10001)
         Attributes:
             a0:00
     Signature Algorithm: md5WithRSAEncryption
-        12:14:96:c0:0e:ea:5a:08:6f:13:fd:72:84:6a:26:33:29:f9:
-        52:39:4c:fc:ec:da:0d:83:39:2e:27:17:9b:f8:46:03:b5:dd:
-        52:a6:dd:3a:50:8e:73:4f:87:94:59:31:1d:5a:54:24:96:4d:
-        d4:57:95:4c:ca:4c:dc:0b:b8:5f
+        8d:15:e6:8e:49:0f:07:fb:e0:72:ad:f0:04:9a:c8:5d:e7:1b:
+        ed:99:c9:c3:3c:f5:8e:4d:a1:5e:e1:40:75:2c:24:f0:c6:dd:
+        10:87:35:26:1d:cc:79:3f:a2:c6:a0:04:c8:52:78:ed:26:32:
+        d3:1b:a7:cd:5e:8c:55:92:dd:88
 -----BEGIN CERTIFICATE REQUEST-----
 MIHzMIGeAgEAMDkxCzAJBgNVBAYTAkFVMRcwFQYDVQQKEw5Eb2RneSBCcm90aGVy
-czERMA8GA1UEAxMIRG9kZ3kgQ0EwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAwOKE
-xbdfKLemEMGOKeBgqI3abJE9yzf3WhrPcQLRAyM85YPxk0DQYWwhEh9i2BxGWYAZ
-7Krv1EqdsViCQBGuBQIDAQABoAAwDQYJKoZIhvcNAQEEBQADQQASFJbADupaCG8T
-/XKEaiYzKflSOUz87NoNgzkuJxeb+EYDtd1Spt06UI5zT4eUWTEdWlQklk3UV5VM
-ykzcC7hf
+czERMA8GA1UEAxMIRG9kZ3kgQ0EwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA0DQL
+enM/ncK6CwSEJhOO1WfZUPUEi4pvos9fHW459jh3rRDADgi3fiCYxoRVSQhvB47k
+DZ3ViNg5yrDhy7F9ywIDAQABoAAwDQYJKoZIhvcNAQEEBQADQQCNFeaOSQ8H++By
+rfAEmshd5xvtmcnDPPWOTaFe4UB1LCTwxt0QhzUmHcx5P6LGoATIUnjtJjLTG6fN
+XoxVkt2I
 -----END CERTIFICATE REQUEST-----
index be8ca974d0c3f8342139b9134b8662f57602c8d9..1f7138cadcca6ae95e5adaf99b3012006d743d75 100644 (file)
@@ -1,8 +1,8 @@
 -----BEGIN CERTIFICATE REQUEST-----
 MIHzMIGeAgEAMDkxCzAJBgNVBAYTAkFVMRcwFQYDVQQKEw5Eb2RneSBCcm90aGVy
-czERMA8GA1UEAxMIRG9kZ3kgQ0EwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAwOKE
-xbdfKLemEMGOKeBgqI3abJE9yzf3WhrPcQLRAyM85YPxk0DQYWwhEh9i2BxGWYAZ
-7Krv1EqdsViCQBGuBQIDAQABoAAwDQYJKoZIhvcNAQEFBQADQQDAvyCzrfhnLH8V
-tldPhV9imEi8Dh8vjRYIIb4AlIq25ku8NJyTHi3zOwvH2iiTUx4oxOV9/++UbU+l
-dmT7y1IS
+czERMA8GA1UEAxMIRG9kZ3kgQ0EwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA0DQL
+enM/ncK6CwSEJhOO1WfZUPUEi4pvos9fHW459jh3rRDADgi3fiCYxoRVSQhvB47k
+DZ3ViNg5yrDhy7F9ywIDAQABoAAwDQYJKoZIhvcNAQEFBQADQQA5DZSZgDXs8flG
+GZf4SGr8QpqkxSu9bZOYp/ySuz1khj7aupBrvZBmqZcZx4ZjAUN7UQpMWu2gyfKa
+mAiiLPFN
 -----END CERTIFICATE REQUEST-----
index 9223897196c9b1ddc4a9a8e0c263555e133c1a47..91cce5966de8dd3e2e7f3c324a9bef6dbca00bf8 100644 (file)
@@ -1,8 +1,8 @@
 -----BEGIN CERTIFICATE REQUEST-----
 MIIBCDCBswIBADBOMQswCQYDVQQGEwJBVTEXMBUGA1UEChMORG9kZ3kgQnJvdGhl
 cnMxEjAQBgNVBAMTCUJyb3RoZXIgMTESMBAGA1UEAxMJQnJvdGhlciAyMFwwDQYJ
-KoZIhvcNAQEBBQADSwAwSAJBAMn4ERwmb5cqvcokIrFpnrZ6Ww2TIWQfh47sUMad
-4BKSOz/KuWebVyFOfjhQHyEZEXTBmv1CvjVYOwCelGMiEd8CAwEAAaAAMA0GCSqG
-SIb3DQEBAgUAA0EAbE4cboaJY3vKmskyPC1cS5Jn4WjFOjaUCNI5MjeTNTZ6AE4o
-h6Sx4PeQomjMA1gRGrHCz+5IyVBcgskY5IYLCw==
+KoZIhvcNAQEBBQADSwAwSAJBANHuKqKzq/87iwfTb0Wl4SVWiB2hhmrGu3jAI1T4
+rVgF5Dfg8V4hh9QpzIEK2iomM7BFT9ecbcZHrxLyuYyaTsMCAwEAAaAAMA0GCSqG
+SIb3DQEBAgUAA0EAhB0p6LbiVq+XshLo5sBQN0rsROC1OgWrdS6ZUmMaigOKK069
+r1o+dGwbM5VCYGTZf0PW9OtGuArGct0laL5h4w==
 -----END CERTIFICATE REQUEST-----
index 2c616443082fb32a1aaed297eda4203fb53d6c32..0a0c6927bbba5803813e22cfa1e976fdbd49c4d8 100644 (file)
@@ -20,6 +20,7 @@ EXPORTS
     _BIO_new_buffer_ssl_connect         @173
     _BIO_new_ssl                        @122
     _BIO_new_ssl_connect                @174
+    _BIO_proxy_ssl_copy_session_id      @123
     _BIO_ssl_copy_session_id            @124
     _BIO_ssl_shutdown                   @131
     _ERR_load_SSL_strings               @1
@@ -96,6 +97,7 @@ EXPORTS
     _SSL_get_default_timeout            @57
     _SSL_get_error                      @58
     _SSL_get_ex_data                    @151
+    _SSL_get_ex_data_X509_STORE_CTX_idx @175
     _SSL_get_ex_new_index               @169
     _SSL_get_fd                         @59
     _SSL_get_info_callback              @165
index aa823b806963d69cd0e6527dfb8b2a6b12f0004b..5897967dd4fb8ea9a5bb99f0498dc9e59885b324 100644 (file)
@@ -12,6 +12,7 @@ EXPORTS
     BIO_new_buffer_ssl_connect         @173
     BIO_new_ssl                        @122
     BIO_new_ssl_connect                @174
+    BIO_proxy_ssl_copy_session_id      @123
     BIO_ssl_copy_session_id            @124
     BIO_ssl_shutdown                   @131
     ERR_load_SSL_strings               @1
@@ -89,6 +90,7 @@ EXPORTS
     SSL_get_default_timeout            @57
     SSL_get_error                      @58
     SSL_get_ex_data                    @151
+    SSL_get_ex_data_X509_STORE_CTX_idx @175
     SSL_get_ex_new_index               @169
     SSL_get_fd                         @59
     SSL_get_info_callback              @165
index cffaf4652456e9478f0b2295cea9181c8571858d..277602c56f15cb53f9b17b481c080b944a7691e1 100755 (executable)
-@echo=off
-
-set test=..\ms
-
-rem run this from inside the bin directory
-
-echo destest
-destest
-if errorlevel 1 goto done
-
-echo ideatest
-ideatest
-if errorlevel 1 goto done
-
-echo bftest
-bftest
-if errorlevel 1 goto done
-
-echo shatest
-shatest
-if errorlevel 1 goto done
-
-echo sha1test
-sha1test
-if errorlevel 1 goto done
-
-echo md5test
-md5test
-if errorlevel 1 goto done
-
-echo md2test
-md2test
-if errorlevel 1 goto done
-
-echo mdc2test
-mdc2test
-if errorlevel 1 goto done
-
-echo rc2test
-rc2test
-if errorlevel 1 goto done
-
-echo rc4test
-rc4test
-if errorlevel 1 goto done
-
-echo randtest
-randtest
-if errorlevel 1 goto done
-
-echo dhtest
-dhtest
-if errorlevel 1 goto done
-
-echo exptest
-exptest
-if errorlevel 1 goto done
-
-echo dsatest
-dsatest
-if errorlevel 1 goto done
-
-echo testenc
-call %test%\testenc ssleay
-if errorlevel 1 goto done
-
-echo testpem
-call %test%\testpem ssleay
-if errorlevel 1 goto done
-
-echo verify
-copy ..\certs\*.pem cert.tmp >nul
-ssleay verify -CAfile cert.tmp ..\certs\*.pem
-
-echo testss
-call %test%\testss ssleay
-if errorlevel 1 goto done
-
-echo test sslv2
-ssltest -ssl2
-if errorlevel 1 goto done
-
-echo test sslv2 with server authentication
-ssltest -ssl2 -server_auth -CAfile cert.tmp
-if errorlevel 1 goto done
-
-echo test sslv2 with client authentication 
-ssltest -ssl2 -client_auth -CAfile cert.tmp
-if errorlevel 1 goto done
-
-echo test sslv2 with both client and server authentication
-ssltest -ssl2 -server_auth -client_auth -CAfile cert.tmp
-if errorlevel 1 goto done
-
-echo test sslv3
-ssltest -ssl3
-if errorlevel 1 goto done
-
-echo test sslv3 with server authentication
-ssltest -ssl3 -server_auth -CAfile cert.tmp
-if errorlevel 1 goto done
-
-echo test sslv3 with client authentication 
-ssltest -ssl3 -client_auth -CAfile cert.tmp
-if errorlevel 1 goto done
-
-echo test sslv3 with both client and server authentication
-ssltest -ssl3 -server_auth -client_auth -CAfile cert.tmp
-if errorlevel 1 goto done
-
-echo test sslv2/sslv3
-ssltest
-if errorlevel 1 goto done
-
-echo test sslv2/sslv3 with server authentication
-ssltest -server_auth -CAfile cert.tmp
-if errorlevel 1 goto done
-
-echo test sslv2/sslv3 with client authentication 
-ssltest -client_auth -CAfile cert.tmp
-if errorlevel 1 goto done
-
-echo test sslv2/sslv3 with both client and server authentication
-ssltest -server_auth -client_auth -CAfile cert.tmp
-if errorlevel 1 goto done
-
-
-del cert.tmp
-
-echo passed all tests
-goto end
-:done
-echo problems.....
-:end
+@echo=off\r
+\r
+set test=p:\work\ssleay\ms\r
+set opath=%PATH%\r
+PATH=%1;%PATH%\r
+\r
+rem run this from inside the bin directory\r
+\r
+echo destest\r
+destest\r
+if errorlevel 1 goto done\r
+\r
+echo ideatest\r
+ideatest\r
+if errorlevel 1 goto done\r
+\r
+echo bftest\r
+bftest\r
+if errorlevel 1 goto done\r
+\r
+echo shatest\r
+shatest\r
+if errorlevel 1 goto done\r
+\r
+echo sha1test\r
+sha1test\r
+if errorlevel 1 goto done\r
+\r
+echo md5test\r
+md5test\r
+if errorlevel 1 goto done\r
+\r
+echo md2test\r
+md2test\r
+if errorlevel 1 goto done\r
+\r
+echo mdc2test\r
+mdc2test\r
+if errorlevel 1 goto done\r
+\r
+echo rc2test\r
+rc2test\r
+if errorlevel 1 goto done\r
+\r
+echo rc4test\r
+rc4test\r
+if errorlevel 1 goto done\r
+\r
+echo randtest\r
+randtest\r
+if errorlevel 1 goto done\r
+\r
+echo dhtest\r
+dhtest\r
+if errorlevel 1 goto done\r
+\r
+echo exptest\r
+exptest\r
+if errorlevel 1 goto done\r
+\r
+echo dsatest\r
+dsatest\r
+if errorlevel 1 goto done\r
+\r
+echo testenc\r
+call %test%\testenc ssleay\r
+if errorlevel 1 goto done\r
+\r
+echo testpem\r
+call %test%\testpem ssleay\r
+if errorlevel 1 goto done\r
+\r
+echo verify\r
+copy ..\certs\*.pem cert.tmp >nul\r
+ssleay verify -CAfile cert.tmp ..\certs\*.pem\r
+\r
+echo testss\r
+call %test%\testss ssleay\r
+if errorlevel 1 goto done\r
+\r
+echo test sslv2\r
+ssltest -ssl2\r
+if errorlevel 1 goto done\r
+\r
+echo test sslv2 with server authentication\r
+ssltest -ssl2 -server_auth -CAfile cert.tmp\r
+if errorlevel 1 goto done\r
+\r
+echo test sslv2 with client authentication \r
+ssltest -ssl2 -client_auth -CAfile cert.tmp\r
+if errorlevel 1 goto done\r
+\r
+echo test sslv2 with both client and server authentication\r
+ssltest -ssl2 -server_auth -client_auth -CAfile cert.tmp\r
+if errorlevel 1 goto done\r
+\r
+echo test sslv3\r
+ssltest -ssl3\r
+if errorlevel 1 goto done\r
+\r
+echo test sslv3 with server authentication\r
+ssltest -ssl3 -server_auth -CAfile cert.tmp\r
+if errorlevel 1 goto done\r
+\r
+echo test sslv3 with client authentication \r
+ssltest -ssl3 -client_auth -CAfile cert.tmp\r
+if errorlevel 1 goto done\r
+\r
+echo test sslv3 with both client and server authentication\r
+ssltest -ssl3 -server_auth -client_auth -CAfile cert.tmp\r
+if errorlevel 1 goto done\r
+\r
+echo test sslv2/sslv3\r
+ssltest\r
+if errorlevel 1 goto done\r
+\r
+echo test sslv2/sslv3 with server authentication\r
+ssltest -server_auth -CAfile cert.tmp\r
+if errorlevel 1 goto done\r
+\r
+echo test sslv2/sslv3 with client authentication \r
+ssltest -client_auth -CAfile cert.tmp\r
+if errorlevel 1 goto done\r
+\r
+echo test sslv2/sslv3 with both client and server authentication\r
+ssltest -server_auth -client_auth -CAfile cert.tmp\r
+if errorlevel 1 goto done\r
+\r
+\r
+del cert.tmp\r
+\r
+echo passed all tests\r
+goto end\r
+:done\r
+echo problems.....\r
+:end\r
+PATH=%opath%\r
index 2c73bb7d1c4b21d77801b30cc63082e96a13bf0e..a33fbd5ed6c49b242a7daa62cb2666a574b0fd93 100755 (executable)
@@ -1,93 +1,93 @@
-echo=off
-
-echo start testenc
-path=..\ms;%path%
-set ssleay=%1%
-set input=..\ms\testenc.bat
-set tmp1=..\ms\cipher.out
-set out1=..\ms\clear.out
-set cmp=perl ..\ms\cmp.pl
-
-call tenc.bat enc
-if errorlevel 1 goto err
-
-call tenc.bat rc4
-if errorlevel 1 goto err
-
-call tenc.bat des-cfb
-if errorlevel 1 goto err
-
-call tenc.bat des-ede-cfb
-if errorlevel 1 goto err
-
-call tenc.bat des-ede3-cfb
-if errorlevel 1 goto err
-
-call tenc.bat des-ofb
-if errorlevel 1 goto err
-
-call tenc.bat des-ede-ofb
-if errorlevel 1 goto err
-
-call tenc.bat des-ede3-ofb
-if errorlevel 1 goto err
-
-call tenc.bat des-ecb
-if errorlevel 1 goto err
-
-call tenc.bat des-ede
-if errorlevel 1 goto err
-
-call tenc.bat des-ede3
-if errorlevel 1 goto err
-
-call tenc.bat des-cbc
-if errorlevel 1 goto err
-
-call tenc.bat des-ede-cbc
-if errorlevel 1 goto err
-
-call tenc.bat des-ede3-cbc
-if errorlevel 1 goto err
-
-call tenc.bat idea-ecb
-if errorlevel 1 goto err
-
-call tenc.bat idea-cfb
-if errorlevel 1 goto err
-
-call tenc.bat idea-ofb
-if errorlevel 1 goto err
-
-call tenc.bat idea-cbc
-if errorlevel 1 goto err
-
-call tenc.bat rc2-ecb
-if errorlevel 1 goto err
-
-call tenc.bat rc2-cfb
-if errorlevel 1 goto err
-
-call tenc.bat rc2-ofb
-if errorlevel 1 goto err
-
-call tenc.bat rc2-cbc
-if errorlevel 1 goto err
-
-call tenc.bat bf-ecb
-if errorlevel 1 goto err
-
-call tenc.bat bf-cfb
-if errorlevel 1 goto err
-
-call tenc.bat bf-ofb
-if errorlevel 1 goto err
-
-call tenc.bat bf-cbc
-if errorlevel 1 goto err
-
-echo OK
-del %out1%
-del %tmp1%
-:err
-
+\r
+echo start testenc\r
+path=p:\work\ssleay\ms;%path%\r
+set ssleay=%1%\r
+set input=p:\work\ssleay\ms\testenc.bat\r
+set tmp1=p:\work\ssleay\ms\cipher.out\r
+set out1=p:\work\ssleay\ms\clear.out\r
+set cmp=perl p:\work\ssleay\ms\cmp.pl\r
+\r
+cd\r
+call tenc.bat enc\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat rc4\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat des-cfb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat des-ede-cfb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat des-ede3-cfb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat des-ofb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat des-ede-ofb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat des-ede3-ofb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat des-ecb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat des-ede\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat des-ede3\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat des-cbc\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat des-ede-cbc\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat des-ede3-cbc\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat idea-ecb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat idea-cfb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat idea-ofb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat idea-cbc\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat rc2-ecb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat rc2-cfb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat rc2-ofb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat rc2-cbc\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat bf-ecb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat bf-cfb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat bf-ofb\r
+if errorlevel 1 goto err\r
+\r
+call tenc.bat bf-cbc\r
+if errorlevel 1 goto err\r
+\r
+echo OK\r
+del %out1%\r
+del %tmp1%\r
+:err\r
+\r
index 6821d8260406596c37ec0850dbbae2b5cc4993b1..f7feb8cb002fb772eaca31a026d59bf0535e21a4 100644 (file)
@@ -14,6 +14,7 @@
 INSTALLTOP=\usr\local\ssl
 
 # Set your compiler options
+PLATFORM=VC-WIN16
 CC=cl
 CFLAG=/ALw /Gx- /Gt256 /Gf /G2 /f- /Ocgnotb2 /W3 /WX -DL_ENDIAN /nologo -DWINDOWS -DWIN16
 APP_CFLAG=/Gw /FPi87
@@ -31,12 +32,10 @@ SRC_D=.
 LINK=link
 LFLAGS= /FARCALL /NOLOGO /NOD /SEG:1024 /ONERROR:NOEXE /NOE /PACKC:60000 /PACKD:60000 /STACK:20000 /ALIGN:256
 
-BN_MULW_OBJ=crypto\bn\asm\x86w32.obj
-BN_MULW_SRC=crypto\bn\asm\x86w32.asm
+BN_ASM_OBJ=crypto\bn\asm\x86w32.obj
+BN_ASM_SRC=crypto\bn\asm\x86w32.asm
 DES_ENC_OBJ=
 DES_ENC_SRC=
-DES_CRYPT_OBJ=
-DES_CRYPT_SRC=
 BF_ENC_OBJ=
 BF_ENC_SRC=
 CAST_ENC_OBJ=
@@ -120,21 +119,22 @@ HEADER=$(INCL_D)\cryptlib.h \
        $(INCL_D)\cast_lcl.h $(INCL_D)\bn_lcl.h $(INCL_D)\bn_prime.h \
        $(INCL_D)\obj_dat.h $(INCL_D)\conf_lcl.h $(INCL_D)\ssl_locl.h \
        $(INCL_D)\rsaref.h $(INCL_D)\apps.h $(INCL_D)\progs.h \
-       $(INCL_D)\s_apps.h $(INCL_D)\testdsa.h $(INCL_D)\testrsa.h
+       $(INCL_D)\testdsa.h $(INCL_D)\testrsa.h
 
 EXHEADER=$(INC_D)\e_os.h \
-       $(INC_D)\crypto.h $(INC_D)\cryptall.h $(INC_D)\md2.h \
-       $(INC_D)\md5.h $(INC_D)\sha.h $(INC_D)\mdc2.h \
-       $(INC_D)\hmac.h $(INC_D)\ripemd.h $(INC_D)\des.h \
-       $(INC_D)\rc2.h $(INC_D)\rc4.h $(INC_D)\rc5.h \
-       $(INC_D)\idea.h $(INC_D)\blowfish.h $(INC_D)\cast.h \
-       $(INC_D)\bn.h $(INC_D)\rsa.h $(INC_D)\dsa.h \
-       $(INC_D)\dh.h $(INC_D)\buffer.h $(INC_D)\bio.h \
-       $(INC_D)\bss_file.c $(INC_D)\stack.h $(INC_D)\lhash.h \
-       $(INC_D)\rand.h $(INC_D)\err.h $(INC_D)\objects.h \
-       $(INC_D)\evp.h $(INC_D)\pem.h $(INC_D)\asn1.h \
-       $(INC_D)\asn1_mac.h $(INC_D)\x509.h $(INC_D)\x509_vfy.h \
-       $(INC_D)\conf.h $(INC_D)\txt_db.h $(INC_D)\pkcs7.h \
+       $(INC_D)\crypto.h $(INC_D)\cryptall.h $(INC_D)\tmdiff.h \
+       $(INC_D)\md2.h $(INC_D)\md5.h $(INC_D)\sha.h \
+       $(INC_D)\mdc2.h $(INC_D)\hmac.h $(INC_D)\ripemd.h \
+       $(INC_D)\des.h $(INC_D)\rc2.h $(INC_D)\rc4.h \
+       $(INC_D)\rc5.h $(INC_D)\idea.h $(INC_D)\blowfish.h \
+       $(INC_D)\cast.h $(INC_D)\bn.h $(INC_D)\rsa.h \
+       $(INC_D)\dsa.h $(INC_D)\dh.h $(INC_D)\buffer.h \
+       $(INC_D)\bio.h $(INC_D)\bss_file.c $(INC_D)\stack.h \
+       $(INC_D)\lhash.h $(INC_D)\rand.h $(INC_D)\err.h \
+       $(INC_D)\objects.h $(INC_D)\evp.h $(INC_D)\pem.h \
+       $(INC_D)\asn1.h $(INC_D)\asn1_mac.h $(INC_D)\x509.h \
+       $(INC_D)\x509_vfy.h $(INC_D)\conf.h $(INC_D)\txt_db.h \
+       $(INC_D)\pkcs7.h $(INC_D)\proxy.h $(INC_D)\comp.h \
        $(INC_D)\ssl.h $(INC_D)\ssl2.h $(INC_D)\ssl3.h \
        $(INC_D)\ssl23.h $(INC_D)\tls1.h
 
@@ -154,41 +154,42 @@ E_OBJ=$(OBJ_D)\verify.obj \
        $(OBJ_D)\crl2p7.obj $(OBJ_D)\crl.obj $(OBJ_D)\rsa.obj \
        $(OBJ_D)\dsa.obj $(OBJ_D)\dsaparam.obj $(OBJ_D)\x509.obj \
        $(OBJ_D)\genrsa.obj $(OBJ_D)\s_server.obj $(OBJ_D)\s_client.obj \
-       $(OBJ_D)\speed.obj $(OBJ_D)\s_time.obj $(OBJ_D)\apps.obj \
-       $(OBJ_D)\s_cb.obj $(OBJ_D)\s_socket.obj $(OBJ_D)\version.obj \
+       $(OBJ_D)\speed.obj $(OBJ_D)\s_time.obj \
+       $(OBJ_D)\apps.obj $(OBJ_D)\s_cb.obj $(OBJ_D)\s_socket.obj \
+       $(OBJ_D)\s_eio.obj $(OBJ_D)\bf_perm.obj $(OBJ_D)\version.obj \
        $(OBJ_D)\sess_id.obj $(OBJ_D)\ciphers.obj $(OBJ_D)\ssleay.obj
 
 CRYPTOOBJ=$(OBJ_D)\cryptlib.obj \
        $(OBJ_D)\mem.obj $(OBJ_D)\cversion.obj $(OBJ_D)\ex_data.obj \
-       $(OBJ_D)\cpt_err.obj $(OBJ_D)\md2_dgst.obj $(OBJ_D)\md2_one.obj \
-       $(OBJ_D)\md5_dgst.obj $(OBJ_D)\md5_one.obj $(OBJ_D)\sha_dgst.obj \
-       $(OBJ_D)\sha1dgst.obj $(OBJ_D)\sha_one.obj $(OBJ_D)\sha1_one.obj \
-       $(OBJ_D)\mdc2dgst.obj $(OBJ_D)\mdc2_one.obj $(OBJ_D)\hmac.obj \
-       $(OBJ_D)\rmd_dgst.obj $(OBJ_D)\rmd_one.obj $(OBJ_D)\set_key.obj \
-       $(OBJ_D)\ecb_enc.obj $(OBJ_D)\cbc_enc.obj $(OBJ_D)\ecb3_enc.obj \
-       $(OBJ_D)\cfb64enc.obj $(OBJ_D)\cfb64ede.obj $(OBJ_D)\cfb_enc.obj \
-       $(OBJ_D)\ofb64ede.obj $(OBJ_D)\enc_read.obj $(OBJ_D)\enc_writ.obj \
-       $(OBJ_D)\ofb64enc.obj $(OBJ_D)\ofb_enc.obj $(OBJ_D)\str2key.obj \
-       $(OBJ_D)\pcbc_enc.obj $(OBJ_D)\qud_cksm.obj $(OBJ_D)\rand_key.obj \
-       $(OBJ_D)\des_enc.obj $(OBJ_D)\fcrypt_b.obj $(OBJ_D)\read2pwd.obj \
-       $(OBJ_D)\fcrypt.obj $(OBJ_D)\xcbc_enc.obj $(OBJ_D)\read_pwd.obj \
-       $(OBJ_D)\rpc_enc.obj $(OBJ_D)\cbc_cksm.obj $(OBJ_D)\supp.obj \
-       $(OBJ_D)\rc2_ecb.obj $(OBJ_D)\rc2_skey.obj $(OBJ_D)\rc2_cbc.obj \
-       $(OBJ_D)\rc2cfb64.obj $(OBJ_D)\rc2ofb64.obj $(OBJ_D)\rc4_skey.obj \
-       $(OBJ_D)\rc4_enc.obj $(OBJ_D)\rc5_skey.obj $(OBJ_D)\rc5_ecb.obj \
-       $(OBJ_D)\rc5_enc.obj $(OBJ_D)\rc5cfb64.obj $(OBJ_D)\rc5ofb64.obj \
-       $(OBJ_D)\i_cbc.obj $(OBJ_D)\i_cfb64.obj $(OBJ_D)\i_ofb64.obj \
-       $(OBJ_D)\i_ecb.obj $(OBJ_D)\i_skey.obj $(OBJ_D)\bf_skey.obj \
-       $(OBJ_D)\bf_ecb.obj $(OBJ_D)\bf_enc.obj $(OBJ_D)\bf_cfb64.obj \
-       $(OBJ_D)\bf_ofb64.obj $(OBJ_D)\c_skey.obj $(OBJ_D)\c_ecb.obj \
-       $(OBJ_D)\c_enc.obj $(OBJ_D)\c_cfb64.obj $(OBJ_D)\c_ofb64.obj \
-       $(OBJ_D)\bn_add.obj $(OBJ_D)\bn_div.obj $(OBJ_D)\bn_exp.obj \
-       $(OBJ_D)\bn_lib.obj $(OBJ_D)\bn_mod.obj $(OBJ_D)\bn_mul.obj \
+       $(OBJ_D)\tmdiff.obj $(OBJ_D)\cpt_err.obj $(OBJ_D)\md2_dgst.obj \
+       $(OBJ_D)\md2_one.obj $(OBJ_D)\md5_dgst.obj $(OBJ_D)\md5_one.obj \
+       $(OBJ_D)\sha_dgst.obj $(OBJ_D)\sha1dgst.obj $(OBJ_D)\sha_one.obj \
+       $(OBJ_D)\sha1_one.obj $(OBJ_D)\mdc2dgst.obj $(OBJ_D)\mdc2_one.obj \
+       $(OBJ_D)\hmac.obj $(OBJ_D)\rmd_dgst.obj $(OBJ_D)\rmd_one.obj \
+       $(OBJ_D)\set_key.obj $(OBJ_D)\ecb_enc.obj $(OBJ_D)\cbc_enc.obj \
+       $(OBJ_D)\ecb3_enc.obj $(OBJ_D)\cfb64enc.obj $(OBJ_D)\cfb64ede.obj \
+       $(OBJ_D)\cfb_enc.obj $(OBJ_D)\ofb64ede.obj $(OBJ_D)\enc_read.obj \
+       $(OBJ_D)\enc_writ.obj $(OBJ_D)\ofb64enc.obj $(OBJ_D)\ofb_enc.obj \
+       $(OBJ_D)\str2key.obj $(OBJ_D)\pcbc_enc.obj $(OBJ_D)\qud_cksm.obj \
+       $(OBJ_D)\rand_key.obj $(OBJ_D)\des_enc.obj $(OBJ_D)\fcrypt_b.obj \
+       $(OBJ_D)\read2pwd.obj $(OBJ_D)\fcrypt.obj $(OBJ_D)\xcbc_enc.obj \
+       $(OBJ_D)\read_pwd.obj $(OBJ_D)\rpc_enc.obj $(OBJ_D)\cbc_cksm.obj \
+       $(OBJ_D)\supp.obj $(OBJ_D)\rc2_ecb.obj $(OBJ_D)\rc2_skey.obj \
+       $(OBJ_D)\rc2_cbc.obj $(OBJ_D)\rc2cfb64.obj $(OBJ_D)\rc2ofb64.obj \
+       $(OBJ_D)\rc4_skey.obj $(OBJ_D)\rc4_enc.obj $(OBJ_D)\rc5_skey.obj \
+       $(OBJ_D)\rc5_ecb.obj $(OBJ_D)\rc5_enc.obj $(OBJ_D)\rc5cfb64.obj \
+       $(OBJ_D)\rc5ofb64.obj $(OBJ_D)\i_cbc.obj $(OBJ_D)\i_cfb64.obj \
+       $(OBJ_D)\i_ofb64.obj $(OBJ_D)\i_ecb.obj $(OBJ_D)\i_skey.obj \
+       $(OBJ_D)\bf_skey.obj $(OBJ_D)\bf_ecb.obj $(OBJ_D)\bf_enc.obj \
+       $(OBJ_D)\bf_cfb64.obj $(OBJ_D)\bf_ofb64.obj $(OBJ_D)\c_skey.obj \
+       $(OBJ_D)\c_ecb.obj $(OBJ_D)\c_enc.obj $(OBJ_D)\c_cfb64.obj \
+       $(OBJ_D)\c_ofb64.obj $(OBJ_D)\bn_add.obj $(OBJ_D)\bn_div.obj \
+       $(OBJ_D)\bn_exp.obj $(OBJ_D)\bn_lib.obj $(OBJ_D)\bn_mul.obj \
        $(OBJ_D)\bn_print.obj $(OBJ_D)\bn_rand.obj $(OBJ_D)\bn_shift.obj \
-       $(OBJ_D)\bn_sub.obj $(OBJ_D)\bn_word.obj $(OBJ_D)\bn_blind.obj \
-       $(OBJ_D)\bn_gcd.obj $(OBJ_D)\bn_prime.obj $(OBJ_D)\bn_err.obj \
-       $(OBJ_D)\bn_sqr.obj $(BN_MULW_OBJ) $(OBJ_D)\bn_recp.obj \
-       $(OBJ_D)\bn_mont.obj $(OBJ_D)\bn_mpi.obj $(OBJ_D)\rsa_eay.obj \
+       $(OBJ_D)\bn_word.obj $(OBJ_D)\bn_blind.obj $(OBJ_D)\bn_gcd.obj \
+       $(OBJ_D)\bn_prime.obj $(OBJ_D)\bn_err.obj $(OBJ_D)\bn_sqr.obj \
+       $(BN_ASM_OBJ) $(OBJ_D)\bn_recp.obj $(OBJ_D)\bn_mont.obj \
+       $(OBJ_D)\bn_mpi.obj $(OBJ_D)\bn_exp2.obj $(OBJ_D)\rsa_eay.obj \
        $(OBJ_D)\rsa_gen.obj $(OBJ_D)\rsa_lib.obj $(OBJ_D)\rsa_sign.obj \
        $(OBJ_D)\rsa_saos.obj $(OBJ_D)\rsa_err.obj $(OBJ_D)\rsa_pk1.obj \
        $(OBJ_D)\rsa_ssl.obj $(OBJ_D)\rsa_none.obj $(OBJ_D)\dsa_gen.obj \
@@ -201,9 +202,10 @@ CRYPTOOBJ=$(OBJ_D)\cryptlib.obj \
        $(OBJ_D)\bss_file.obj $(OBJ_D)\bss_sock.obj $(OBJ_D)\bss_conn.obj \
        $(OBJ_D)\bf_null.obj $(OBJ_D)\bf_buff.obj $(OBJ_D)\b_print.obj \
        $(OBJ_D)\b_dump.obj $(OBJ_D)\b_sock.obj $(OBJ_D)\bss_acpt.obj \
-       $(OBJ_D)\bf_nbio.obj $(OBJ_D)\stack.obj $(OBJ_D)\lhash.obj \
-       $(OBJ_D)\lh_stats.obj $(OBJ_D)\md_rand.obj $(OBJ_D)\randfile.obj \
-       $(OBJ_D)\err.obj $(OBJ_D)\err_all.obj $(OBJ_D)\err_prn.obj \
+       $(OBJ_D)\bf_nbio.obj $(OBJ_D)\bss_cs4a.obj $(OBJ_D)\stack.obj \
+       $(OBJ_D)\lhash.obj $(OBJ_D)\lh_stats.obj $(OBJ_D)\md_rand.obj \
+       $(OBJ_D)\randfile.obj $(OBJ_D)\rand_lib.obj $(OBJ_D)\err.obj \
+       $(OBJ_D)\err_all.obj $(OBJ_D)\err_prn.obj $(OBJ_D)\o_names.obj \
        $(OBJ_D)\obj_dat.obj $(OBJ_D)\obj_lib.obj $(OBJ_D)\obj_err.obj \
        $(OBJ_D)\encode.obj $(OBJ_D)\digest.obj $(OBJ_D)\evp_enc.obj \
        $(OBJ_D)\evp_key.obj $(OBJ_D)\e_ecb_d.obj $(OBJ_D)\e_cbc_d.obj \
@@ -230,35 +232,38 @@ CRYPTOOBJ=$(OBJ_D)\cryptlib.obj \
        $(OBJ_D)\a_utctm.obj $(OBJ_D)\a_int.obj $(OBJ_D)\a_octet.obj \
        $(OBJ_D)\a_print.obj $(OBJ_D)\a_type.obj $(OBJ_D)\a_set.obj \
        $(OBJ_D)\a_dup.obj $(OBJ_D)\a_d2i_fp.obj $(OBJ_D)\a_i2d_fp.obj \
-       $(OBJ_D)\a_sign.obj $(OBJ_D)\a_digest.obj $(OBJ_D)\a_verify.obj \
-       $(OBJ_D)\x_algor.obj $(OBJ_D)\x_val.obj $(OBJ_D)\x_pubkey.obj \
-       $(OBJ_D)\x_sig.obj $(OBJ_D)\x_req.obj $(OBJ_D)\x_attrib.obj \
-       $(OBJ_D)\x_name.obj $(OBJ_D)\x_cinf.obj $(OBJ_D)\x_x509.obj \
-       $(OBJ_D)\x_crl.obj $(OBJ_D)\x_info.obj $(OBJ_D)\x_spki.obj \
-       $(OBJ_D)\d2i_r_pr.obj $(OBJ_D)\i2d_r_pr.obj $(OBJ_D)\d2i_r_pu.obj \
-       $(OBJ_D)\i2d_r_pu.obj $(OBJ_D)\d2i_s_pr.obj $(OBJ_D)\i2d_s_pr.obj \
-       $(OBJ_D)\d2i_s_pu.obj $(OBJ_D)\i2d_s_pu.obj $(OBJ_D)\d2i_pu.obj \
-       $(OBJ_D)\d2i_pr.obj $(OBJ_D)\i2d_pu.obj $(OBJ_D)\i2d_pr.obj \
-       $(OBJ_D)\t_req.obj $(OBJ_D)\t_x509.obj $(OBJ_D)\t_pkey.obj \
-       $(OBJ_D)\p7_i_s.obj $(OBJ_D)\p7_signi.obj $(OBJ_D)\p7_signd.obj \
-       $(OBJ_D)\p7_recip.obj $(OBJ_D)\p7_enc_c.obj $(OBJ_D)\p7_evp.obj \
-       $(OBJ_D)\p7_dgst.obj $(OBJ_D)\p7_s_e.obj $(OBJ_D)\p7_enc.obj \
-       $(OBJ_D)\p7_lib.obj $(OBJ_D)\f_int.obj $(OBJ_D)\f_string.obj \
-       $(OBJ_D)\i2d_dhp.obj $(OBJ_D)\i2d_dsap.obj $(OBJ_D)\d2i_dhp.obj \
-       $(OBJ_D)\d2i_dsap.obj $(OBJ_D)\n_pkey.obj $(OBJ_D)\a_hdr.obj \
-       $(OBJ_D)\x_pkey.obj $(OBJ_D)\a_bool.obj $(OBJ_D)\x_exten.obj \
-       $(OBJ_D)\asn1_par.obj $(OBJ_D)\asn1_lib.obj $(OBJ_D)\asn1_err.obj \
-       $(OBJ_D)\a_meth.obj $(OBJ_D)\a_bytes.obj $(OBJ_D)\evp_asn1.obj \
-       $(OBJ_D)\x509_def.obj $(OBJ_D)\x509_d2.obj $(OBJ_D)\x509_r2x.obj \
-       $(OBJ_D)\x509_cmp.obj $(OBJ_D)\x509_obj.obj $(OBJ_D)\x509_req.obj \
-       $(OBJ_D)\x509_vfy.obj $(OBJ_D)\x509_set.obj $(OBJ_D)\x509rset.obj \
-       $(OBJ_D)\x509_err.obj $(OBJ_D)\x509name.obj $(OBJ_D)\x509_v3.obj \
-       $(OBJ_D)\x509_ext.obj $(OBJ_D)\x509pack.obj $(OBJ_D)\x509type.obj \
-       $(OBJ_D)\x509_lu.obj $(OBJ_D)\x_all.obj $(OBJ_D)\x509_txt.obj \
-       $(OBJ_D)\by_file.obj $(OBJ_D)\by_dir.obj $(OBJ_D)\v3_net.obj \
-       $(OBJ_D)\v3_x509.obj $(OBJ_D)\conf.obj $(OBJ_D)\conf_err.obj \
-       $(OBJ_D)\txt_db.obj $(OBJ_D)\pk7_lib.obj $(OBJ_D)\pkcs7err.obj \
-       $(OBJ_D)\pk7_doit.obj
+       $(OBJ_D)\a_bmp.obj $(OBJ_D)\a_sign.obj $(OBJ_D)\a_digest.obj \
+       $(OBJ_D)\a_verify.obj $(OBJ_D)\x_algor.obj $(OBJ_D)\x_val.obj \
+       $(OBJ_D)\x_pubkey.obj $(OBJ_D)\x_sig.obj $(OBJ_D)\x_req.obj \
+       $(OBJ_D)\x_attrib.obj $(OBJ_D)\x_name.obj $(OBJ_D)\x_cinf.obj \
+       $(OBJ_D)\x_x509.obj $(OBJ_D)\x_crl.obj $(OBJ_D)\x_info.obj \
+       $(OBJ_D)\x_spki.obj $(OBJ_D)\d2i_r_pr.obj $(OBJ_D)\i2d_r_pr.obj \
+       $(OBJ_D)\d2i_r_pu.obj $(OBJ_D)\i2d_r_pu.obj $(OBJ_D)\d2i_s_pr.obj \
+       $(OBJ_D)\i2d_s_pr.obj $(OBJ_D)\d2i_s_pu.obj $(OBJ_D)\i2d_s_pu.obj \
+       $(OBJ_D)\d2i_pu.obj $(OBJ_D)\d2i_pr.obj $(OBJ_D)\i2d_pu.obj \
+       $(OBJ_D)\i2d_pr.obj $(OBJ_D)\t_req.obj $(OBJ_D)\t_x509.obj \
+       $(OBJ_D)\t_pkey.obj $(OBJ_D)\p7_i_s.obj $(OBJ_D)\p7_signi.obj \
+       $(OBJ_D)\p7_signd.obj $(OBJ_D)\p7_recip.obj $(OBJ_D)\p7_enc_c.obj \
+       $(OBJ_D)\p7_evp.obj $(OBJ_D)\p7_dgst.obj $(OBJ_D)\p7_s_e.obj \
+       $(OBJ_D)\p7_enc.obj $(OBJ_D)\p7_lib.obj $(OBJ_D)\f_int.obj \
+       $(OBJ_D)\f_string.obj $(OBJ_D)\i2d_dhp.obj $(OBJ_D)\i2d_dsap.obj \
+       $(OBJ_D)\d2i_dhp.obj $(OBJ_D)\d2i_dsap.obj $(OBJ_D)\n_pkey.obj \
+       $(OBJ_D)\a_hdr.obj $(OBJ_D)\x_pkey.obj $(OBJ_D)\a_bool.obj \
+       $(OBJ_D)\x_exten.obj $(OBJ_D)\asn1_par.obj $(OBJ_D)\asn1_lib.obj \
+       $(OBJ_D)\asn1_err.obj $(OBJ_D)\a_meth.obj $(OBJ_D)\a_bytes.obj \
+       $(OBJ_D)\evp_asn1.obj $(OBJ_D)\x509_def.obj $(OBJ_D)\x509_d2.obj \
+       $(OBJ_D)\x509_r2x.obj $(OBJ_D)\x509_cmp.obj $(OBJ_D)\x509_obj.obj \
+       $(OBJ_D)\x509_req.obj $(OBJ_D)\x509_vfy.obj $(OBJ_D)\x509_set.obj \
+       $(OBJ_D)\x509rset.obj $(OBJ_D)\x509_err.obj $(OBJ_D)\x509name.obj \
+       $(OBJ_D)\x509_v3.obj $(OBJ_D)\x509_ext.obj $(OBJ_D)\x509pack.obj \
+       $(OBJ_D)\x509type.obj $(OBJ_D)\x509_lu.obj $(OBJ_D)\x_all.obj \
+       $(OBJ_D)\x509_txt.obj $(OBJ_D)\by_file.obj $(OBJ_D)\by_dir.obj \
+       $(OBJ_D)\v3_net.obj $(OBJ_D)\v3_x509.obj $(OBJ_D)\conf.obj \
+       $(OBJ_D)\conf_err.obj $(OBJ_D)\txt_db.obj $(OBJ_D)\pk7_lib.obj \
+       $(OBJ_D)\pkcs7err.obj $(OBJ_D)\pk7_doit.obj $(OBJ_D)\proxy.obj \
+       $(OBJ_D)\pxy_txt.obj $(OBJ_D)\bf_proxy.obj $(OBJ_D)\pxy_conf.obj \
+       $(OBJ_D)\pxy_err.obj $(OBJ_D)\comp_lib.obj $(OBJ_D)\c_rle.obj \
+       $(OBJ_D)\c_zlib.obj
 
 SSLOBJ=$(OBJ_D)\s2_meth.obj \
        $(OBJ_D)\s2_srvr.obj $(OBJ_D)\s2_clnt.obj $(OBJ_D)\s2_lib.obj \
@@ -272,7 +277,7 @@ SSLOBJ=$(OBJ_D)\s2_meth.obj \
        $(OBJ_D)\ssl_cert.obj $(OBJ_D)\ssl_sess.obj $(OBJ_D)\ssl_ciph.obj \
        $(OBJ_D)\ssl_stat.obj $(OBJ_D)\ssl_rsa.obj $(OBJ_D)\ssl_asn1.obj \
        $(OBJ_D)\ssl_txt.obj $(OBJ_D)\ssl_algs.obj $(OBJ_D)\bio_ssl.obj \
-       $(OBJ_D)\ssl_err.obj
+       $(OBJ_D)\pxy_ssl.obj $(OBJ_D)\ssl_err.obj
 
 RSAGLUEOBJ=$(OBJ_D)\rsaref.obj \
        $(OBJ_D)\rsar_err.obj
@@ -421,6 +426,9 @@ $(INCL_D)\progs.h: $(SRC_D)\apps\progs.h
 $(INCL_D)\s_apps.h: $(SRC_D)\apps\s_apps.h
        $(CP) $(SRC_D)\apps\s_apps.h $(INCL_D)\s_apps.h
 
+$(INCL_D)\s_eio.h: $(SRC_D)\apps\s_eio.h
+       $(CP) $(SRC_D)\apps\s_eio.h $(INCL_D)\s_eio.h
+
 $(INCL_D)\testdsa.h: $(SRC_D)\apps\testdsa.h
        $(CP) $(SRC_D)\apps\testdsa.h $(INCL_D)\testdsa.h
 
@@ -436,6 +444,9 @@ $(INC_D)\crypto.h: $(SRC_D)\crypto\crypto.h
 $(INC_D)\cryptall.h: $(SRC_D)\crypto\cryptall.h
        $(CP) $(SRC_D)\crypto\cryptall.h $(INC_D)\cryptall.h
 
+$(INC_D)\tmdiff.h: $(SRC_D)\crypto\tmdiff.h
+       $(CP) $(SRC_D)\crypto\tmdiff.h $(INC_D)\tmdiff.h
+
 $(INC_D)\md2.h: $(SRC_D)\crypto\md2\md2.h
        $(CP) $(SRC_D)\crypto\md2\md2.h $(INC_D)\md2.h
 
@@ -538,6 +549,12 @@ $(INC_D)\txt_db.h: $(SRC_D)\crypto\txt_db\txt_db.h
 $(INC_D)\pkcs7.h: $(SRC_D)\crypto\pkcs7\pkcs7.h
        $(CP) $(SRC_D)\crypto\pkcs7\pkcs7.h $(INC_D)\pkcs7.h
 
+$(INC_D)\proxy.h: $(SRC_D)\crypto\proxy\proxy.h
+       $(CP) $(SRC_D)\crypto\proxy\proxy.h $(INC_D)\proxy.h
+
+$(INC_D)\comp.h: $(SRC_D)\crypto\comp\comp.h
+       $(CP) $(SRC_D)\crypto\comp\comp.h $(INC_D)\comp.h
+
 $(INC_D)\ssl.h: $(SRC_D)\ssl\ssl.h
        $(CP) $(SRC_D)\ssl\ssl.h $(INC_D)\ssl.h
 
@@ -685,6 +702,12 @@ $(OBJ_D)\s_cb.obj: $(SRC_D)\apps\s_cb.c
 $(OBJ_D)\s_socket.obj: $(SRC_D)\apps\s_socket.c
        $(CC) /Fo$(OBJ_D)\s_socket.obj -DMONOLITH $(APP_CFLAGS) -c $(SRC_D)\apps\s_socket.c
 
+$(OBJ_D)\s_eio.obj: $(SRC_D)\apps\s_eio.c
+       $(CC) /Fo$(OBJ_D)\s_eio.obj -DMONOLITH $(APP_CFLAGS) -c $(SRC_D)\apps\s_eio.c
+
+$(OBJ_D)\bf_perm.obj: $(SRC_D)\apps\bf_perm.c
+       $(CC) /Fo$(OBJ_D)\bf_perm.obj -DMONOLITH $(APP_CFLAGS) -c $(SRC_D)\apps\bf_perm.c
+
 $(OBJ_D)\version.obj: $(SRC_D)\apps\version.c
        $(CC) /Fo$(OBJ_D)\version.obj -DMONOLITH $(APP_CFLAGS) -c $(SRC_D)\apps\version.c
 
@@ -707,11 +730,14 @@ $(OBJ_D)\mem.obj: $(SRC_D)\crypto\mem.c
        $(CC) /Fo$(OBJ_D)\mem.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\mem.c
 
 $(OBJ_D)\cversion.obj: $(SRC_D)\crypto\cversion.c
-       $(CC) /Fo$(OBJ_D)\cversion.obj  $(SHLIB_CFLAGS) -DCFLAGS="\"$(CC) $(CFLAG)\"" -c $(SRC_D)\crypto\cversion.c
+       $(CC) /Fo$(OBJ_D)\cversion.obj  $(SHLIB_CFLAGS) -DCFLAGS="\"$(CC) $(CFLAG)\"" -DPLATFORM="\"$(PLATFORM)\"" -c $(SRC_D)\crypto\cversion.c
 
 $(OBJ_D)\ex_data.obj: $(SRC_D)\crypto\ex_data.c
        $(CC) /Fo$(OBJ_D)\ex_data.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\ex_data.c
 
+$(OBJ_D)\tmdiff.obj: $(SRC_D)\crypto\tmdiff.c
+       $(CC) /Fo$(OBJ_D)\tmdiff.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\tmdiff.c
+
 $(OBJ_D)\cpt_err.obj: $(SRC_D)\crypto\cpt_err.c
        $(CC) /Fo$(OBJ_D)\cpt_err.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\cpt_err.c
 
@@ -922,9 +948,6 @@ $(OBJ_D)\bn_exp.obj: $(SRC_D)\crypto\bn\bn_exp.c
 $(OBJ_D)\bn_lib.obj: $(SRC_D)\crypto\bn\bn_lib.c
        $(CC) /Fo$(OBJ_D)\bn_lib.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_lib.c
 
-$(OBJ_D)\bn_mod.obj: $(SRC_D)\crypto\bn\bn_mod.c
-       $(CC) /Fo$(OBJ_D)\bn_mod.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_mod.c
-
 $(OBJ_D)\bn_mul.obj: $(SRC_D)\crypto\bn\bn_mul.c
        $(CC) /Fo$(OBJ_D)\bn_mul.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_mul.c
 
@@ -937,9 +960,6 @@ $(OBJ_D)\bn_rand.obj: $(SRC_D)\crypto\bn\bn_rand.c
 $(OBJ_D)\bn_shift.obj: $(SRC_D)\crypto\bn\bn_shift.c
        $(CC) /Fo$(OBJ_D)\bn_shift.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_shift.c
 
-$(OBJ_D)\bn_sub.obj: $(SRC_D)\crypto\bn\bn_sub.c
-       $(CC) /Fo$(OBJ_D)\bn_sub.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_sub.c
-
 $(OBJ_D)\bn_word.obj: $(SRC_D)\crypto\bn\bn_word.c
        $(CC) /Fo$(OBJ_D)\bn_word.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_word.c
 
@@ -958,8 +978,8 @@ $(OBJ_D)\bn_err.obj: $(SRC_D)\crypto\bn\bn_err.c
 $(OBJ_D)\bn_sqr.obj: $(SRC_D)\crypto\bn\bn_sqr.c
        $(CC) /Fo$(OBJ_D)\bn_sqr.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_sqr.c
 
-$(OBJ_D)\bn_mulw.obj: $(SRC_D)\crypto\bn\bn_mulw.c
-       $(CC) /Fo$(OBJ_D)\bn_mulw.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_mulw.c
+$(OBJ_D)\bn_asm.obj: $(SRC_D)\crypto\bn\bn_asm.c
+       $(CC) /Fo$(OBJ_D)\bn_asm.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_asm.c
 
 $(OBJ_D)\bn_recp.obj: $(SRC_D)\crypto\bn\bn_recp.c
        $(CC) /Fo$(OBJ_D)\bn_recp.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_recp.c
@@ -970,6 +990,9 @@ $(OBJ_D)\bn_mont.obj: $(SRC_D)\crypto\bn\bn_mont.c
 $(OBJ_D)\bn_mpi.obj: $(SRC_D)\crypto\bn\bn_mpi.c
        $(CC) /Fo$(OBJ_D)\bn_mpi.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_mpi.c
 
+$(OBJ_D)\bn_exp2.obj: $(SRC_D)\crypto\bn\bn_exp2.c
+       $(CC) /Fo$(OBJ_D)\bn_exp2.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bn\bn_exp2.c
+
 $(OBJ_D)\rsa_eay.obj: $(SRC_D)\crypto\rsa\rsa_eay.c
        $(CC) /Fo$(OBJ_D)\rsa_eay.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\rsa\rsa_eay.c
 
@@ -1084,6 +1107,9 @@ $(OBJ_D)\bss_acpt.obj: $(SRC_D)\crypto\bio\bss_acpt.c
 $(OBJ_D)\bf_nbio.obj: $(SRC_D)\crypto\bio\bf_nbio.c
        $(CC) /Fo$(OBJ_D)\bf_nbio.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bio\bf_nbio.c
 
+$(OBJ_D)\bss_cs4a.obj: $(SRC_D)\crypto\bio\bss_cs4a.c
+       $(CC) /Fo$(OBJ_D)\bss_cs4a.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\bio\bss_cs4a.c
+
 $(OBJ_D)\stack.obj: $(SRC_D)\crypto\stack\stack.c
        $(CC) /Fo$(OBJ_D)\stack.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\stack\stack.c
 
@@ -1099,6 +1125,9 @@ $(OBJ_D)\md_rand.obj: $(SRC_D)\crypto\rand\md_rand.c
 $(OBJ_D)\randfile.obj: $(SRC_D)\crypto\rand\randfile.c
        $(CC) /Fo$(OBJ_D)\randfile.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\rand\randfile.c
 
+$(OBJ_D)\rand_lib.obj: $(SRC_D)\crypto\rand\rand_lib.c
+       $(CC) /Fo$(OBJ_D)\rand_lib.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\rand\rand_lib.c
+
 $(OBJ_D)\err.obj: $(SRC_D)\crypto\err\err.c
        $(CC) /Fo$(OBJ_D)\err.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\err\err.c
 
@@ -1108,6 +1137,9 @@ $(OBJ_D)\err_all.obj: $(SRC_D)\crypto\err\err_all.c
 $(OBJ_D)\err_prn.obj: $(SRC_D)\crypto\err\err_prn.c
        $(CC) /Fo$(OBJ_D)\err_prn.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\err\err_prn.c
 
+$(OBJ_D)\o_names.obj: $(SRC_D)\crypto\objects\o_names.c
+       $(CC) /Fo$(OBJ_D)\o_names.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\objects\o_names.c
+
 $(OBJ_D)\obj_dat.obj: $(SRC_D)\crypto\objects\obj_dat.c
        $(CC) /Fo$(OBJ_D)\obj_dat.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\objects\obj_dat.c
 
@@ -1342,6 +1374,9 @@ $(OBJ_D)\a_d2i_fp.obj: $(SRC_D)\crypto\asn1\a_d2i_fp.c
 $(OBJ_D)\a_i2d_fp.obj: $(SRC_D)\crypto\asn1\a_i2d_fp.c
        $(CC) /Fo$(OBJ_D)\a_i2d_fp.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\asn1\a_i2d_fp.c
 
+$(OBJ_D)\a_bmp.obj: $(SRC_D)\crypto\asn1\a_bmp.c
+       $(CC) /Fo$(OBJ_D)\a_bmp.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\asn1\a_bmp.c
+
 $(OBJ_D)\a_sign.obj: $(SRC_D)\crypto\asn1\a_sign.c
        $(CC) /Fo$(OBJ_D)\a_sign.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\asn1\a_sign.c
 
@@ -1597,6 +1632,30 @@ $(OBJ_D)\pkcs7err.obj: $(SRC_D)\crypto\pkcs7\pkcs7err.c
 $(OBJ_D)\pk7_doit.obj: $(SRC_D)\crypto\pkcs7\pk7_doit.c
        $(CC) /Fo$(OBJ_D)\pk7_doit.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\pkcs7\pk7_doit.c
 
+$(OBJ_D)\proxy.obj: $(SRC_D)\crypto\proxy\proxy.c
+       $(CC) /Fo$(OBJ_D)\proxy.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\proxy\proxy.c
+
+$(OBJ_D)\pxy_txt.obj: $(SRC_D)\crypto\proxy\pxy_txt.c
+       $(CC) /Fo$(OBJ_D)\pxy_txt.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\proxy\pxy_txt.c
+
+$(OBJ_D)\bf_proxy.obj: $(SRC_D)\crypto\proxy\bf_proxy.c
+       $(CC) /Fo$(OBJ_D)\bf_proxy.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\proxy\bf_proxy.c
+
+$(OBJ_D)\pxy_conf.obj: $(SRC_D)\crypto\proxy\pxy_conf.c
+       $(CC) /Fo$(OBJ_D)\pxy_conf.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\proxy\pxy_conf.c
+
+$(OBJ_D)\pxy_err.obj: $(SRC_D)\crypto\proxy\pxy_err.c
+       $(CC) /Fo$(OBJ_D)\pxy_err.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\proxy\pxy_err.c
+
+$(OBJ_D)\comp_lib.obj: $(SRC_D)\crypto\comp\comp_lib.c
+       $(CC) /Fo$(OBJ_D)\comp_lib.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\comp\comp_lib.c
+
+$(OBJ_D)\c_rle.obj: $(SRC_D)\crypto\comp\c_rle.c
+       $(CC) /Fo$(OBJ_D)\c_rle.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\comp\c_rle.c
+
+$(OBJ_D)\c_zlib.obj: $(SRC_D)\crypto\comp\c_zlib.c
+       $(CC) /Fo$(OBJ_D)\c_zlib.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\crypto\comp\c_zlib.c
+
 $(OBJ_D)\s2_meth.obj: $(SRC_D)\ssl\s2_meth.c
        $(CC) /Fo$(OBJ_D)\s2_meth.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\ssl\s2_meth.c
 
@@ -1699,6 +1758,9 @@ $(OBJ_D)\ssl_algs.obj: $(SRC_D)\ssl\ssl_algs.c
 $(OBJ_D)\bio_ssl.obj: $(SRC_D)\ssl\bio_ssl.c
        $(CC) /Fo$(OBJ_D)\bio_ssl.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\ssl\bio_ssl.c
 
+$(OBJ_D)\pxy_ssl.obj: $(SRC_D)\ssl\pxy_ssl.c
+       $(CC) /Fo$(OBJ_D)\pxy_ssl.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\ssl\pxy_ssl.c
+
 $(OBJ_D)\ssl_err.obj: $(SRC_D)\ssl\ssl_err.c
        $(CC) /Fo$(OBJ_D)\ssl_err.obj  $(SHLIB_CFLAGS) -c $(SRC_D)\ssl\ssl_err.c
 
@@ -1892,6 +1954,7 @@ $(O_SSL): $(SSLOBJ)
        $(LINK) $(MLFLAGS) @<<
   $(SHLIB_EX_OBJ) +
   $(OBJ_D)\bio_ssl.obj +
+  $(OBJ_D)\pxy_ssl.obj +
   $(OBJ_D)\s23_clnt.obj +
   $(OBJ_D)\s23_lib.obj +
   $(OBJ_D)\s23_meth.obj +
@@ -1948,8 +2011,9 @@ y
 $(O_CRYPTO): $(CRYPTOOBJ)
        $(LINK) $(MLFLAGS) @<<
   $(SHLIB_EX_OBJ) +
-  $(BN_MULW_OBJ) +
+  $(BN_ASM_OBJ) +
   $(OBJ_D)\a_bitstr.obj +
+  $(OBJ_D)\a_bmp.obj +
   $(OBJ_D)\a_bool.obj +
   $(OBJ_D)\a_bytes.obj +
   $(OBJ_D)\a_d2i_fp.obj +
@@ -1980,6 +2044,7 @@ $(O_CRYPTO): $(CRYPTOOBJ)
   $(OBJ_D)\bf_nbio.obj +
   $(OBJ_D)\bf_null.obj +
   $(OBJ_D)\bf_ofb64.obj +
+  $(OBJ_D)\bf_proxy.obj +
   $(OBJ_D)\bf_skey.obj +
   $(OBJ_D)\bio_b64.obj +
   $(OBJ_D)\bio_cb.obj +
@@ -1992,9 +2057,9 @@ $(O_CRYPTO): $(CRYPTOOBJ)
   $(OBJ_D)\bn_div.obj +
   $(OBJ_D)\bn_err.obj +
   $(OBJ_D)\bn_exp.obj +
+  $(OBJ_D)\bn_exp2.obj +
   $(OBJ_D)\bn_gcd.obj +
   $(OBJ_D)\bn_lib.obj +
-  $(OBJ_D)\bn_mod.obj +
   $(OBJ_D)\bn_mont.obj +
   $(OBJ_D)\bn_mpi.obj +
   $(OBJ_D)\bn_mul.obj +
@@ -2004,10 +2069,10 @@ $(O_CRYPTO): $(CRYPTOOBJ)
   $(OBJ_D)\bn_recp.obj +
   $(OBJ_D)\bn_shift.obj +
   $(OBJ_D)\bn_sqr.obj +
-  $(OBJ_D)\bn_sub.obj +
   $(OBJ_D)\bn_word.obj +
   $(OBJ_D)\bss_acpt.obj +
   $(OBJ_D)\bss_conn.obj +
+  $(OBJ_D)\bss_cs4a.obj +
   $(OBJ_D)\bss_fd.obj +
   $(OBJ_D)\bss_file.obj +
   $(OBJ_D)\bss_mem.obj +
@@ -2022,12 +2087,15 @@ $(O_CRYPTO): $(CRYPTOOBJ)
   $(OBJ_D)\c_ecb.obj +
   $(OBJ_D)\c_enc.obj +
   $(OBJ_D)\c_ofb64.obj +
+  $(OBJ_D)\c_rle.obj +
   $(OBJ_D)\c_skey.obj +
+  $(OBJ_D)\c_zlib.obj +
   $(OBJ_D)\cbc_cksm.obj +
   $(OBJ_D)\cbc_enc.obj +
   $(OBJ_D)\cfb64ede.obj +
   $(OBJ_D)\cfb64enc.obj +
   $(OBJ_D)\cfb_enc.obj +
+  $(OBJ_D)\comp_lib.obj +
   $(OBJ_D)\conf.obj +
   $(OBJ_D)\conf_err.obj +
   $(OBJ_D)\cpt_err.obj +
@@ -2138,6 +2206,7 @@ $(O_CRYPTO): $(CRYPTOOBJ)
   $(OBJ_D)\mem.obj +
   $(OBJ_D)\n_pkey.obj +
   $(OBJ_D)\names.obj +
+  $(OBJ_D)\o_names.obj +
   $(OBJ_D)\obj_dat.obj +
   $(OBJ_D)\obj_err.obj +
   $(OBJ_D)\obj_lib.obj +
@@ -2171,8 +2240,13 @@ $(O_CRYPTO): $(CRYPTOOBJ)
   $(OBJ_D)\pk7_doit.obj +
   $(OBJ_D)\pk7_lib.obj +
   $(OBJ_D)\pkcs7err.obj +
+  $(OBJ_D)\proxy.obj +
+  $(OBJ_D)\pxy_conf.obj +
+  $(OBJ_D)\pxy_err.obj +
+  $(OBJ_D)\pxy_txt.obj +
   $(OBJ_D)\qud_cksm.obj +
   $(OBJ_D)\rand_key.obj +
+  $(OBJ_D)\rand_lib.obj +
   $(OBJ_D)\randfile.obj +
   $(OBJ_D)\rc2_cbc.obj +
   $(OBJ_D)\rc2_ecb.obj +
@@ -2211,6 +2285,7 @@ $(O_CRYPTO): $(CRYPTOOBJ)
   $(OBJ_D)\t_pkey.obj +
   $(OBJ_D)\t_req.obj +
   $(OBJ_D)\t_x509.obj +
+  $(OBJ_D)\tmdiff.obj +
   $(OBJ_D)\txt_db.obj +
   $(OBJ_D)\v3_net.obj +
   $(OBJ_D)\v3_x509.obj +
@@ -2260,6 +2335,7 @@ $(BIN_D)\$(E_EXE).exe: $(E_OBJ) $(LIBS_DEP)
   $(APP_EX_OBJ) +
   $(OBJ_D)\apps.obj +
   $(OBJ_D)\asn1pars.obj +
+  $(OBJ_D)\bf_perm.obj +
   $(OBJ_D)\ca.obj +
   $(OBJ_D)\ciphers.obj +
   $(OBJ_D)\crl.obj +
diff --git a/ms/zzz b/ms/zzz
new file mode 100755 (executable)
index 0000000..7ba8524
--- /dev/null
+++ b/ms/zzz
@@ -0,0 +1,135 @@
+@echo=off
+
+set test=E:\root\zip\eay\SSLeay\ms
+PATH=%PATH%;c:\eay\out;%test%
+
+rem run this from inside the bin directory
+
+echo destest
+destest
+if errorlevel 1 goto done
+
+echo ideatest
+ideatest
+if errorlevel 1 goto done
+
+echo bftest
+bftest
+if errorlevel 1 goto done
+
+echo shatest
+shatest
+if errorlevel 1 goto done
+
+echo sha1test
+sha1test
+if errorlevel 1 goto done
+
+echo md5test
+md5test
+if errorlevel 1 goto done
+
+echo md2test
+md2test
+if errorlevel 1 goto done
+
+echo mdc2test
+mdc2test
+if errorlevel 1 goto done
+
+echo rc2test
+rc2test
+if errorlevel 1 goto done
+
+echo rc4test
+rc4test
+if errorlevel 1 goto done
+
+echo randtest
+randtest
+if errorlevel 1 goto done
+
+echo dhtest
+dhtest
+if errorlevel 1 goto done
+
+echo exptest
+exptest
+if errorlevel 1 goto done
+
+echo dsatest
+dsatest
+if errorlevel 1 goto done
+
+echo testenc
+call %test%\testenc ssleay
+if errorlevel 1 goto done
+
+echo testpem
+call %test%\testpem ssleay
+if errorlevel 1 goto done
+
+echo verify
+copy ..\certs\*.pem cert.tmp >nul
+ssleay verify -CAfile cert.tmp ..\certs\*.pem
+
+echo testss
+call %test%\testss ssleay
+if errorlevel 1 goto done
+
+echo test sslv2
+ssltest -ssl2
+if errorlevel 1 goto done
+
+echo test sslv2 with server authentication
+ssltest -ssl2 -server_auth -CAfile cert.tmp
+if errorlevel 1 goto done
+
+echo test sslv2 with client authentication 
+ssltest -ssl2 -client_auth -CAfile cert.tmp
+if errorlevel 1 goto done
+
+echo test sslv2 with both client and server authentication
+ssltest -ssl2 -server_auth -client_auth -CAfile cert.tmp
+if errorlevel 1 goto done
+
+echo test sslv3
+ssltest -ssl3
+if errorlevel 1 goto done
+
+echo test sslv3 with server authentication
+ssltest -ssl3 -server_auth -CAfile cert.tmp
+if errorlevel 1 goto done
+
+echo test sslv3 with client authentication 
+ssltest -ssl3 -client_auth -CAfile cert.tmp
+if errorlevel 1 goto done
+
+echo test sslv3 with both client and server authentication
+ssltest -ssl3 -server_auth -client_auth -CAfile cert.tmp
+if errorlevel 1 goto done
+
+echo test sslv2/sslv3
+ssltest
+if errorlevel 1 goto done
+
+echo test sslv2/sslv3 with server authentication
+ssltest -server_auth -CAfile cert.tmp
+if errorlevel 1 goto done
+
+echo test sslv2/sslv3 with client authentication 
+ssltest -client_auth -CAfile cert.tmp
+if errorlevel 1 goto done
+
+echo test sslv2/sslv3 with both client and server authentication
+ssltest -server_auth -client_auth -CAfile cert.tmp
+if errorlevel 1 goto done
+
+
+del cert.tmp
+
+echo passed all tests
+goto end
+:done
+echo problems.....
+:end
index 582b5705aad3d82570398d111c1ae988d6e914d1..3e3d1debebbd25f8b1562d5bb60f7b0692498e85 100644 (file)
@@ -10,6 +10,7 @@ char *obj;
                ret=sv_newmortal();
        else
                ret=newSViv(0);
+printf(">new_ref %d\n",type);
        sv_setref_pv(ret,type,(void *)obj);
        return(ret);
        }
@@ -27,6 +28,7 @@ char *argp;
 fprintf(stderr,"ex_new %08X %s\n",obj,argp);
        sv=sv_newmortal();
        sv_setref_pv(sv,argp,(void *)obj);
+printf("%d>new_ref '%s'\n",sv,argp);
        CRYPTO_set_ex_data(ad,idx,(char *)sv);
        return(1);
        }
index 582b5705aad3d82570398d111c1ae988d6e914d1..3e3d1debebbd25f8b1562d5bb60f7b0692498e85 100644 (file)
@@ -10,6 +10,7 @@ char *obj;
                ret=sv_newmortal();
        else
                ret=newSViv(0);
+printf(">new_ref %d\n",type);
        sv_setref_pv(ret,type,(void *)obj);
        return(ret);
        }
@@ -27,6 +28,7 @@ char *argp;
 fprintf(stderr,"ex_new %08X %s\n",obj,argp);
        sv=sv_newmortal();
        sv_setref_pv(sv,argp,(void *)obj);
+printf("%d>new_ref '%s'\n",sv,argp);
        CRYPTO_set_ex_data(ad,idx,(char *)sv);
        return(1);
        }
index be27581c0291dd5d211dd49da2c74bb987a3609b..70a97e79256e2433278160b5157a84238b61b5cd 100644 (file)
@@ -5,13 +5,15 @@ use ExtUtils::testlib;
 use SSLeay;
 
 $cmd=<<"EOF";
+GET / HTTP/1.0
 
 EOF
 
 $conn="localhost:4433";
 $conn=$ARGV[0] if $#ARGV >= 0;
 $bio=SSLeay::BIO::new("connect");
-$bio->set_callback(sub {print STDERR $_[0]->number_read."\n"; $_[$#_] });
+#$bio->set_callback(sub {print STDERR SSLeay::BIO::number_read($_[0])."\n"; $_[$#_] });
+#$bio->set_callback(sub {print STDERR "$#_:".$_[0].":$_[1]:$_[2]:$_[3]:$_[4]:\n"; $_[$#_] });
 $bio->hostname($conn) || die $ssl->error();
 
 
index 3782d42062cf4acfee9a3cc1fadc088fffa99f93..a9d32d84080a2df2fe3def7ccfcb4da2de0dc869 100644 (file)
@@ -25,7 +25,7 @@ int ret;
                SAVETMPS;
 
                PUSHMARK(sp);
-               XPUSHs(me);
+               XPUSHs(sv_2mortal(newSViv(me)));
                XPUSHs(sv_2mortal(newSViv(state)));
                XPUSHs(sv_2mortal(newSViv(cmd)));
                if ((state == BIO_CB_READ) || (state == BIO_CB_WRITE))
@@ -60,7 +60,8 @@ int ret;
 int boot_bio()
        {
        p5_bio_ex_bio_ptr=
-               BIO_get_ex_new_index(0,"SSLeay::BIO",ex_new,NULL,ex_cleanup);
+               BIO_get_ex_new_index(0,"SSLeay::BIO",ex_new,NULL,
+                       ex_cleanup);
        p5_bio_ex_bio_callback= 
                BIO_get_ex_new_index(0,"bio_callback",NULL,NULL,
                        ex_cleanup);
@@ -97,9 +98,8 @@ p5_BIO_new_buffer_ssl_connect(...)
                        }
                EXTEND(sp,1);
                bio=BIO_new_buffer_ssl_connect(ctx);
-               arg=new_ref("SSLeay::BIO",(char *)bio,0);
+               arg=(SV *)BIO_get_ex_data(bio,p5_bio_ex_bio_ptr);
                PUSHs(arg);
-               BIO_set_ex_data(bio,p5_bio_ex_bio_ptr,(char *)arg);
 
 void
 p5_BIO_new_ssl_connect(...)
@@ -124,9 +124,8 @@ p5_BIO_new_ssl_connect(...)
                        }
                EXTEND(sp,1);
                bio=BIO_new_ssl_connect(ctx);
-               arg=new_ref("SSLeay::BIO",(char *)bio,0);
+               arg=(SV *)BIO_get_ex_data(bio,p5_bio_ex_bio_ptr);
                PUSHs(arg);
-               BIO_set_ex_data(bio,p5_bio_ex_bio_ptr,(char *)arg);
 
 void
 p5_BIO_new(...)
@@ -154,16 +153,15 @@ p5_BIO_new(...)
                        bio=BIO_new(BIO_f_buffer());
                else
                        croak("unknown BIO type");
-               arg=new_ref("SSLeay::BIO",(char *)bio,0);
+               arg=(SV *)BIO_get_ex_data(bio,p5_bio_ex_bio_ptr);
                PUSHs(arg);
-               BIO_set_ex_data(bio,p5_bio_ex_bio_ptr,(char *)arg);
 
 int
 p5_BIO_hostname(bio,name)
        BIO *bio;
        char *name;
        CODE:
-               RETVAL=BIO_set_hostname(bio,name);
+               RETVAL=BIO_set_conn_hostname(bio,name);
        OUTPUT:
                RETVAL
 
@@ -218,18 +216,20 @@ p5_BIO_pop(b)
                        if (arg == NULL)
                                {
                                arg=new_ref("SSLeay::BIO",(char *)bio,0);
-                               PUSHs(arg);
                                BIO_set_ex_data(bio,p5_bio_ex_bio_ptr,(char *)arg);
+                               PUSHs(arg);
                                }
                        else
                                {
                                /* it was pushed in */
                                SvREFCNT_inc(arg);
                                PUSHs(arg);
+#if 0          /* This does not need to be done. */
                                if (bio->references < 1)
                                        abort();
                                /* decrement the reference count */
                                BIO_free(bio);
+#endif
                                }
                        }
 
@@ -253,7 +253,7 @@ p5_BIO_sysread(bio,in,num, ...)
                        if (offset < 0)
                                {
                                if (-offset > olen)
-                                       croad("Offset outside string");
+                                       croak("Offset outside string");
                                offset+=olen;
                                }
                        }
@@ -356,8 +356,9 @@ p5_BIO_next_bio(b)
                        if (arg == NULL)
                                {
                                arg=new_ref("SSLeay::BIO",(char *)bio,0);
-                               PUSHs(arg);
                                BIO_set_ex_data(bio,p5_bio_ex_bio_ptr,(char *)arg);
+                               bio->references++;
+                               PUSHs(arg);
                                }
                        else
                                {
@@ -398,6 +399,7 @@ p5_BIO_set_callback(bio,cb,...)
                arg=sv_mortalcopy(ST(1));
                SvREFCNT_inc(arg);
                BIO_set_ex_data(bio,p5_bio_ex_bio_callback,(char *)arg);
+               printf("%08lx < bio_ptr\n",BIO_get_ex_data(bio,p5_bio_ex_bio_ptr));
                BIO_set_callback(bio,p5_bio_callback);
 
 void
index 01840abc854a48fcda8eeadfb6ceff750ff3539c..4e39c16d70f4a12a9f53c547131906f075443a23 100644 (file)
@@ -80,7 +80,7 @@ char *argp;
        {
        SV *sv;
 
-fprintf(stderr,"ex_new %08X %s\n",obj,argp);
+fprintf(stderr,"ex_new idx=%d %08X %s\n",idx,obj,argp);
        sv=sv_newmortal();
        sv_setref_pv(sv,argp,(void *)obj);
        CRYPTO_set_ex_data(ad,idx,(char *)sv);
index a25593186459f5e819180ff7a6e711637d215a68..23f5edea5431ed766f83ecdb0dca15fa355f4aa1 100644 (file)
--- a/perl/f.pl
+++ b/perl/f.pl
@@ -4,22 +4,8 @@ use ExtUtils::testlib;
 
 use SSLeay;
 
-$data=<>;
-
-#$b=SSLeay::BN::hex2bn($a);
-#$data=$b->bn2bin;
-
-#substr($data,0,8)="";
-#print $data;
-
-$md=SSLeay::MD::new("md5");
-$md->init();
-$md->update("test");
-$key=$md->final();
-
-$rc4=SSLeay::Cipher::new("rc4");
-$rc4->init($key,"",1);
-$out=$rc4->cipher($data);
-
-print $out;
-
+for (7 .. 7926)
+       {
+       my $num = SSLeay::BN::dec2bn($_);
+       print "$_ is ".($num->is_prime ? 'prime' : 'composite'), "\n";
+       }
index 3782d42062cf4acfee9a3cc1fadc088fffa99f93..a9d32d84080a2df2fe3def7ccfcb4da2de0dc869 100644 (file)
@@ -25,7 +25,7 @@ int ret;
                SAVETMPS;
 
                PUSHMARK(sp);
-               XPUSHs(me);
+               XPUSHs(sv_2mortal(newSViv(me)));
                XPUSHs(sv_2mortal(newSViv(state)));
                XPUSHs(sv_2mortal(newSViv(cmd)));
                if ((state == BIO_CB_READ) || (state == BIO_CB_WRITE))
@@ -60,7 +60,8 @@ int ret;
 int boot_bio()
        {
        p5_bio_ex_bio_ptr=
-               BIO_get_ex_new_index(0,"SSLeay::BIO",ex_new,NULL,ex_cleanup);
+               BIO_get_ex_new_index(0,"SSLeay::BIO",ex_new,NULL,
+                       ex_cleanup);
        p5_bio_ex_bio_callback= 
                BIO_get_ex_new_index(0,"bio_callback",NULL,NULL,
                        ex_cleanup);
@@ -97,9 +98,8 @@ p5_BIO_new_buffer_ssl_connect(...)
                        }
                EXTEND(sp,1);
                bio=BIO_new_buffer_ssl_connect(ctx);
-               arg=new_ref("SSLeay::BIO",(char *)bio,0);
+               arg=(SV *)BIO_get_ex_data(bio,p5_bio_ex_bio_ptr);
                PUSHs(arg);
-               BIO_set_ex_data(bio,p5_bio_ex_bio_ptr,(char *)arg);
 
 void
 p5_BIO_new_ssl_connect(...)
@@ -124,9 +124,8 @@ p5_BIO_new_ssl_connect(...)
                        }
                EXTEND(sp,1);
                bio=BIO_new_ssl_connect(ctx);
-               arg=new_ref("SSLeay::BIO",(char *)bio,0);
+               arg=(SV *)BIO_get_ex_data(bio,p5_bio_ex_bio_ptr);
                PUSHs(arg);
-               BIO_set_ex_data(bio,p5_bio_ex_bio_ptr,(char *)arg);
 
 void
 p5_BIO_new(...)
@@ -154,16 +153,15 @@ p5_BIO_new(...)
                        bio=BIO_new(BIO_f_buffer());
                else
                        croak("unknown BIO type");
-               arg=new_ref("SSLeay::BIO",(char *)bio,0);
+               arg=(SV *)BIO_get_ex_data(bio,p5_bio_ex_bio_ptr);
                PUSHs(arg);
-               BIO_set_ex_data(bio,p5_bio_ex_bio_ptr,(char *)arg);
 
 int
 p5_BIO_hostname(bio,name)
        BIO *bio;
        char *name;
        CODE:
-               RETVAL=BIO_set_hostname(bio,name);
+               RETVAL=BIO_set_conn_hostname(bio,name);
        OUTPUT:
                RETVAL
 
@@ -218,18 +216,20 @@ p5_BIO_pop(b)
                        if (arg == NULL)
                                {
                                arg=new_ref("SSLeay::BIO",(char *)bio,0);
-                               PUSHs(arg);
                                BIO_set_ex_data(bio,p5_bio_ex_bio_ptr,(char *)arg);
+                               PUSHs(arg);
                                }
                        else
                                {
                                /* it was pushed in */
                                SvREFCNT_inc(arg);
                                PUSHs(arg);
+#if 0          /* This does not need to be done. */
                                if (bio->references < 1)
                                        abort();
                                /* decrement the reference count */
                                BIO_free(bio);
+#endif
                                }
                        }
 
@@ -253,7 +253,7 @@ p5_BIO_sysread(bio,in,num, ...)
                        if (offset < 0)
                                {
                                if (-offset > olen)
-                                       croad("Offset outside string");
+                                       croak("Offset outside string");
                                offset+=olen;
                                }
                        }
@@ -356,8 +356,9 @@ p5_BIO_next_bio(b)
                        if (arg == NULL)
                                {
                                arg=new_ref("SSLeay::BIO",(char *)bio,0);
-                               PUSHs(arg);
                                BIO_set_ex_data(bio,p5_bio_ex_bio_ptr,(char *)arg);
+                               bio->references++;
+                               PUSHs(arg);
                                }
                        else
                                {
@@ -398,6 +399,7 @@ p5_BIO_set_callback(bio,cb,...)
                arg=sv_mortalcopy(ST(1));
                SvREFCNT_inc(arg);
                BIO_set_ex_data(bio,p5_bio_ex_bio_callback,(char *)arg);
+               printf("%08lx < bio_ptr\n",BIO_get_ex_data(bio,p5_bio_ex_bio_ptr));
                BIO_set_callback(bio,p5_bio_callback);
 
 void
index 01840abc854a48fcda8eeadfb6ceff750ff3539c..4e39c16d70f4a12a9f53c547131906f075443a23 100644 (file)
@@ -80,7 +80,7 @@ char *argp;
        {
        SV *sv;
 
-fprintf(stderr,"ex_new %08X %s\n",obj,argp);
+fprintf(stderr,"ex_new idx=%d %08X %s\n",idx,obj,argp);
        sv=sv_newmortal();
        sv_setref_pv(sv,argp,(void *)obj);
        CRYPTO_set_ex_data(ad,idx,(char *)sv);
index 6777cf7ada8d019a50cee7f0777ce5cf8e6b7ecd..05834797e38a458ad418d2a392df2b8aca486eb1 100644 (file)
@@ -241,7 +241,7 @@ p5_SSL_sysread(ssl,in,num, ...)
                        if (offset < 0)
                                {
                                if (-offset > olen)
-                                       croad("Offset outside string");
+                                       croak("Offset outside string");
                                offset+=olen;
                                }
                        }
index 4a5569fab1acae9014577e7f846a81f8a4430985..d38b84d68e9ac32738d8ee8891560e1e5c805ee9 100644 (file)
@@ -6,11 +6,11 @@ use SSLeay;
 
 $ssl_ctx=SSL::CTX->new("SSLv3");
 
-$ssl_ctx->set_options("-info_callback" =>
-       sub     {
-               print STDERR $_[0]->state()."\n";
-               }
-       );
+#$ssl_ctx->set_options("-info_callback" =>
+#      sub     {
+#              print STDERR $_[0]->state()."\n";
+#              }
+#      );
 
 $conn="localhost:4433";
 $conn=$ARGV[0] if $#ARGV >= 0;
index 6777cf7ada8d019a50cee7f0777ce5cf8e6b7ecd..05834797e38a458ad418d2a392df2b8aca486eb1 100644 (file)
@@ -241,7 +241,7 @@ p5_SSL_sysread(ssl,in,num, ...)
                        if (offset < 0)
                                {
                                if (-offset > olen)
-                                       croad("Offset outside string");
+                                       croak("Offset outside string");
                                offset+=olen;
                                }
                        }
index 34840e99f55e4a33435f76fc3639ae3d9f4cdfe8..3ba902766c3302610b318af41b2d21524f89e100 100644 (file)
@@ -118,8 +118,8 @@ void ERR_load_RSAREF_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_RSAREF,RSAREF_str_functs);
diff --git a/ssl/KEYS b/ssl/KEYS
new file mode 100644 (file)
index 0000000..710d102
--- /dev/null
+++ b/ssl/KEYS
@@ -0,0 +1,28 @@
+EVP_PKEY_DSA
+EVP_PKEY_DSA2
+EVP_PKEY_DSA3
+EVP_PKEY_DSA4
+
+EVP_PKEY_RSA
+EVP_PKEY_RSA2
+
+valid DSA pkey types
+       NID_dsa
+       NID_dsaWithSHA
+       NID_dsaWithSHA1
+       NID_dsaWithSHA1_2
+
+valid RSA pkey types
+       NID_rsaEncryption
+       NID_rsa
+
+NID_dsaWithSHA NID_dsaWithSHA                  DSA             SHA
+NID_dsa                NID_dsaWithSHA1                 DSA             SHA1
+NID_md2                NID_md2WithRSAEncryption        RSA-pkcs1       MD2
+NID_md5                NID_md5WithRSAEncryption        RSA-pkcs1       MD5
+NID_mdc2       NID_mdc2WithRSA                 RSA-none        MDC2
+NID_ripemd160  NID_ripemd160WithRSA            RSA-pkcs1       RIPEMD160
+NID_sha                NID_shaWithRSAEncryption        RSA-pkcs1       SHA
+NID_sha1       NID_sha1WithRSAEncryption       RSA-pkcs1       SHA1
+:w
+
diff --git a/ssl/f b/ssl/f
index 8730ef535dc1b5d020fb706aeaa18edb65aad334..9f4bfe8471e659bf60d4c375a9aaa4e0864e14bd 100644 (file)
--- a/ssl/f
+++ b/ssl/f
@@ -1,40 +1,12 @@
-/* return the actual cipher being used */
-char *SSL_CIPHER_get_name(c)
-SSL_CIPHER *c;
-       {
-       if (c != NULL)
-               return(c->name);
-       return("UNKNOWN");
-       }
-
-/* number of bits for symetric cipher */
-int SSL_CIPHER_get_bits(c,alg_bits)
-SSL_CIPHER *c;
-int *alg_bits;
-       {
-       int ret=0,a=0;
-       EVP_CIPHER *enc;
-
-       if (c != NULL)
-               {
-               if (!ssl_cipher_get_evp(c,&enc,NULL))
-                       return(0);
-
-               a=EVP_CIPHER_key_length(enc)*8;
-
-               if (s->session->cipher->algorithms & SSL_EXP)
-                       {
-                       if (c->algorithm2 & SSL2_CF_8_BYTE_ENC)
-                               ret=64;
-                       else
-                               ret=40;
-                       }
-               else
-                       ret=a;
-               }
-
-       if (alg_bits != NULL) *alg_bits=a;
-       
-       return(ret);
-       }
-
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_DECRYPTION_FAILED);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_RECORD_OVERFLOW
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_UNKNOWN_CA);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_ACCESS_DENIED);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_DECODE_ERROR);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_DECRYPT_ERROR);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_EXPORT_RESTRICION);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_PROTOCOL_VERSION);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_INTERNAL_ERROR);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_USER_CANCLED);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_NO_RENEGOTIATION);
diff --git a/ssl/f.mak b/ssl/f.mak
new file mode 100644 (file)
index 0000000..e69de29
index a4661ebb687586ae58575a9f875ce4b615eca52e..597cc8772e9cf896154cae9b9b64dad2e36ecc92 100644 (file)
@@ -179,7 +179,7 @@ SSL *s;
                        ret=ssl23_get_server_hello(s);
                        if (ret >= 0) cb=NULL;
                        goto end;
-                       break;
+                       /* break; */
 
                default:
                        SSLerr(SSL_F_SSL23_CONNECT,SSL_R_UNKNOWN_STATE);
@@ -443,7 +443,7 @@ SSL *s;
                        }
 
                s->rwstate=SSL_NOTHING;
-               SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,1000+p[6]);
+               SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_AD_REASON_OFFSET+p[6]);
                goto err;
                }
        else
index e16f641101a07edf17d14246814d77c4fb861994..1eb2b3a331f64087995669e2547090c5c230d2d8 100644 (file)
@@ -78,7 +78,7 @@ static int ssl23_put_cipher_by_char();
 static SSL_CIPHER *ssl23_get_cipher_by_char();
 #endif
 
-char *SSL23_version_str="SSLv2/3 compatablity part of SSLeay 0.7.0 30-Jan-1997";
+char *SSL23_version_str="SSLv2/3 compatablity part of SSLeay 0.9.1a 06-Jul-1998";
 
 static SSL_METHOD SSLv23_data= {
        TLS1_VERSION,
@@ -92,6 +92,7 @@ static SSL_METHOD SSLv23_data= {
        ssl23_write,
        ssl_undefined_function,
        ssl_undefined_function,
+       ssl_ok,
        ssl3_ctrl,
        ssl3_ctx_ctrl,
        ssl23_get_cipher_by_char,
index c7b9ecbcf28484f301b2529770a49b173ad1b927..888ffaca066dd0bb362881d0953bdd26adab9bf4 100644 (file)
@@ -166,7 +166,7 @@ SSL *s;
                        ret=ssl23_get_client_hello(s);
                        if (ret >= 0) cb=NULL;
                        goto end;
-                       break;
+                       /* break; */
 
                default:
                        SSLerr(SSL_F_SSL23_ACCEPT,SSL_R_UNKNOWN_STATE);
@@ -237,9 +237,15 @@ SSL *s;
                                                {
                                                s->state=SSL23_ST_SR_CLNT_HELLO_B;
                                                }
+                                       else if (!(s->options & SSL_OP_NO_SSLv2))
+                                               {
+                                               type=1;
+                                               }
                                        }
                                else if (!(s->options & SSL_OP_NO_SSLv3))
                                        s->state=SSL23_ST_SR_CLNT_HELLO_B;
+                               else if (!(s->options & SSL_OP_NO_SSLv2))
+                                       type=1;
 
                                if (s->options & SSL_OP_NON_EXPORT_FIRST)
                                        {
@@ -313,15 +319,15 @@ SSL *s;
                        else if (!(s->options & SSL_OP_NO_SSLv3))
                                type=3;
                        }
-               else if ((strncmp("GET ", p,4) == 0) ||
-                        (strncmp("POST ",p,5) == 0) ||
-                        (strncmp("HEAD ",p,5) == 0) ||
-                        (strncmp("PUT ", p,4) == 0))
+               else if ((strncmp("GET ", (char *)p,4) == 0) ||
+                        (strncmp("POST ",(char *)p,5) == 0) ||
+                        (strncmp("HEAD ",(char *)p,5) == 0) ||
+                        (strncmp("PUT ", (char *)p,4) == 0))
                        {
                        SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTP_REQUEST);
                        goto err;
                        }
-               else if (strncmp("CONNECT",p,7) == 0)
+               else if (strncmp("CONNECT",(char *)p,7) == 0)
                        {
                        SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTPS_PROXY_REQUEST);
                        goto err;
@@ -387,7 +393,7 @@ next_bit:
                        }
                s2n(j,dd);
 
-               /* compression */
+               /* COMPRESSION */
                *(d++)=1;
                *(d++)=0;
                
index 16df9ec56559b43962a2b4ba0b8da41b7787ece7..2170e292899912b9fdeaeed0e8a662e37341cf44 100644 (file)
@@ -268,7 +268,7 @@ SSL *s;
                        if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
 
                        goto end;
-                       break;
+                       /* break; */
                default:
                        SSLerr(SSL_F_SSL2_CONNECT,SSL_R_UNKNOWN_STATE);
                        return(-1);
@@ -587,6 +587,11 @@ SSL *s;
                        SSLerr(SSL_F_CLIENT_MASTER_KEY,SSL_R_PUBLIC_KEY_ENCRYPT_ERROR);
                        return(-1);
                        }
+#ifdef PKCS1_CHECK
+               if (s->options & SSL_OP_PKCS1_CHECK_1) d[1]++;
+               if (s->options & SSL_OP_PKCS1_CHECK_2)
+                       sess->master_key[clear]++;
+#endif
                s2n(enc,p);
                d+=enc;
                karg=sess->key_arg_length;      
index 275eb52f13ea8ffd87f2aae6757f567d95df5d6f..172fc361cf18ae87c349ef62262e24977207722b 100644 (file)
 #include "ssl_locl.h"
 
 #ifndef NOPROTO
-static int ssl2_ok(SSL *s);
 static long ssl2_default_timeout(void );
 #else
-static int ssl2_ok();
 static long ssl2_default_timeout();
 #endif
 
-char *ssl2_version_str="SSLv2 part of SSLeay 0.9.0b 29-Jun-1998";
+char *ssl2_version_str="SSLv2 part of SSLeay 0.9.1a 06-Jul-1998";
 
 #define SSL2_NUM_CIPHERS (sizeof(ssl2_ciphers)/sizeof(SSL_CIPHER))
 
@@ -184,7 +182,8 @@ static SSL_METHOD SSLv2_data= {
        ssl2_peek,
        ssl2_write,
        ssl2_shutdown,
-       ssl2_ok,
+       ssl_ok, /* NULL - renegotiate */
+       ssl_ok, /* NULL - check renegotiate */
        ssl2_ctrl,      /* local */
        ssl2_ctx_ctrl,  /* local */
        ssl2_get_cipher_by_char,
@@ -429,12 +428,6 @@ SSL *s;
                s->error=0; */
        }
 
-static int ssl2_ok(s)
-SSL *s;
-       {
-       return(1);
-       }
-
 int ssl2_shutdown(s)
 SSL *s;
        {
index 6de62e15916611b3f7cc41fbcf983a44c22d6f12..251bcedd7d5931a6eb444385c9435c2ddbdf3ad2 100644 (file)
@@ -92,6 +92,13 @@ int slen;
                p+=i;
                l=i;
 
+#ifdef WIN16
+               /* MSVC 1.5 does not clear the top bytes of the word unless
+                * I do this.
+                */
+               l&=0xffff;
+#endif
+
                *(d++)=SSL3_MT_FINISHED;
                l2n3(l,d);
                s->init_num=(int)l+4;
@@ -236,6 +243,23 @@ X509 *x;
                X509_STORE_CTX_cleanup(&xs_ctx);
                }
 
+       /* Thwate special :-) */
+       if (s->ctx->extra_certs != NULL)
+       for (i=0; i<sk_num(s->ctx->extra_certs); i++)
+               {
+               x=(X509 *)sk_value(s->ctx->extra_certs,i);
+               n=i2d_X509(x,NULL);
+               if (!BUF_MEM_grow(buf,(int)(n+l+3)))
+                       {
+                       SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_BUF_LIB);
+                       return(0);
+                       }
+               p=(unsigned char *)&(buf->data[l]);
+               l2n3(n,p);
+               i2d_X509(x,&p);
+               l+=n+3;
+               }
+
        l-=7;
        p=(unsigned char *)&(buf->data[4]);
        l2n3(l,p);
index 940c6a458f302d91c6f255bc5457899ed8b473a8..d4ff1d99c8997264fd3d5529fe7ea96a6df49e86 100644 (file)
@@ -430,7 +430,7 @@ SSL *s;
                        if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
 
                        goto end;
-                       break;
+                       /* break; */
                        
                default:
                        SSLerr(SSL_F_SSL3_CONNECT,SSL_R_UNKNOWN_STATE);
@@ -478,7 +478,8 @@ SSL *s;
        if (s->state == SSL3_ST_CW_CLNT_HELLO_A)
                {
                if ((s->session == NULL) ||
-                       (s->session->ssl_version != s->version))
+                       (s->session->ssl_version != s->version) ||
+                       (s->session->not_resumable))
                        {
                        if (!ssl_get_new_session(s,0))
                                goto err;
@@ -488,7 +489,7 @@ SSL *s;
                p=s->s3->client_random;
                Time=time(NULL);                        /* Time */
                l2n(Time,p);
-               RAND_bytes(&(p[4]),SSL3_RANDOM_SIZE-sizeof(Time));
+               RAND_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time));
 
                /* Do the message type and length last */
                d=p= &(buf[4]);
@@ -523,6 +524,7 @@ SSL *s;
                p+=i;
 
                /* hardwire in the NULL compression algorithm. */
+               /* COMPRESSION */
                *(p++)=1;
                *(p++)=0;
                
@@ -643,6 +645,7 @@ SSL *s;
        s->s3->tmp.new_cipher=c;
 
        /* lets get the compression algorithm */
+       /* COMPRESSION */
        j= *(p++);
        if (j != 0)
                {
@@ -771,7 +774,7 @@ SSL *s;
 
        pkey=X509_get_pubkey(x);
 
-       if (EVP_PKEY_missing_parameters(pkey))
+       if ((pkey == NULL) || EVP_PKEY_missing_parameters(pkey))
                {
                x=NULL;
                al=SSL3_AL_FATAL;
@@ -998,6 +1001,13 @@ SSL *s;
                goto f_err;
                }
 #endif
+       if (alg & SSL_aFZA)
+               {
+               al=SSL_AD_HANDSHAKE_FAILURE;
+               SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);
+               goto f_err;
+               }
+
 
        /* p points to the next byte, there are 'n' bytes left */
 
@@ -1014,7 +1024,7 @@ SSL *s;
                        /* wrong packet length */
                        al=SSL_AD_DECODE_ERROR;
                        SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_WRONG_SIGNATURE_LENGTH);
-                       goto err;
+                       goto f_err;
                        }
 
 #ifndef NO_RSA
@@ -1167,6 +1177,15 @@ SSL *s;
 
        /* get the CA RDNs */
        n2s(p,llen);
+#if 0
+{
+FILE *out;
+out=fopen("/tmp/vsign.der","w");
+fwrite(p,1,llen,out);
+fclose(out);
+}
+#endif
+
        if ((llen+ctype_num+2+1) != n)
                {
                ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
@@ -1286,7 +1305,7 @@ SSL *s;
                if (l & SSL_kRSA)
                        {
                        RSA *rsa;
-                       unsigned char tmp_buf[48];
+                       unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
 
                        if (s->session->cert->rsa_tmp != NULL)
                                rsa=s->session->cert->rsa_tmp;
@@ -1315,6 +1334,10 @@ SSL *s;
                                p+=2;
                        n=RSA_public_encrypt(SSL_MAX_MASTER_KEY_LENGTH,
                                tmp_buf,p,rsa,RSA_PKCS1_PADDING);
+#ifdef PKCS1_CHECK
+                       if (s->options & SSL_OP_PKCS1_CHECK_1) p[1]++;
+                       if (s->options & SSL_OP_PKCS1_CHECK_2) tmp_buf[0]=0x70;
+#endif
                        if (n <= 0)
                                {
                                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_ENCRYPT);
@@ -1331,8 +1354,8 @@ SSL *s;
                        s->session->master_key_length=
                                s->method->ssl3_enc->generate_master_secret(s,
                                        s->session->master_key,
-                                       tmp_buf,48);
-                       memset(tmp_buf,0,48);
+                                       tmp_buf,SSL_MAX_MASTER_KEY_LENGTH);
+                       memset(tmp_buf,0,SSL_MAX_MASTER_KEY_LENGTH);
                        }
                else
 #endif
index bbd9b637c5c731fc4b063d1f36cd0edb726e066a..116b09615524fc3b8db40347a0d788a0cc4a7015 100644 (file)
@@ -136,7 +136,7 @@ int which;
        unsigned char *ms,*key,*iv,*er1,*er2;
        EVP_CIPHER_CTX *dd;
        EVP_CIPHER *c;
-       SSL_COMPRESSION *comp;
+       COMP_METHOD *comp;
        EVP_MD *m;
        MD5_CTX md;
        int exp,n,i,j,k;
@@ -155,7 +155,25 @@ int which;
                        goto err;
                dd= s->enc_read_ctx;
                s->read_hash=m;
-               s->read_compression=comp;
+               /* COMPRESS */
+               if (s->expand != NULL)
+                       {
+                       COMP_CTX_free(s->expand);
+                       s->expand=NULL;
+                       }
+               if (comp != NULL)
+                       {
+                       s->expand=COMP_CTX_new(comp);
+                       if (s->expand == NULL)
+                               {
+                               SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
+                               goto err2;
+                               }
+                       s->s3->rrec.comp=(unsigned char *)
+                               Malloc(SSL3_RT_MAX_PLAIN_LENGTH);
+                       if (s->s3->rrec.comp == NULL)
+                               goto err;
+                       }
                memset(&(s->s3->read_sequence[0]),0,8);
                mac_secret= &(s->s3->read_mac_secret[0]);
                }
@@ -167,7 +185,21 @@ int which;
                        goto err;
                dd= s->enc_write_ctx;
                s->write_hash=m;
-               s->write_compression=comp;
+               /* COMPRESS */
+               if (s->compress != NULL)
+                       {
+                       COMP_CTX_free(s->compress);
+                       s->compress=NULL;
+                       }
+               if (comp != NULL)
+                       {
+                       s->compress=COMP_CTX_new(comp);
+                       if (s->compress == NULL)
+                               {
+                               SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
+                               goto err2;
+                               }
+                       }
                memset(&(s->s3->write_sequence[0]),0,8);
                mac_secret= &(s->s3->write_mac_secret[0]);
                }
@@ -258,6 +290,11 @@ SSL *s;
 
        s->s3->tmp.new_sym_enc=c;
        s->s3->tmp.new_hash=hash;
+#ifdef ZLIB
+       s->s3->tmp.new_compression=COMP_zlib();
+#endif
+/*     s->s3->tmp.new_compression=COMP_rle(); */
+/*     s->session->compress_meth= xxxxx */
 
        exp=(s->session->cipher->algorithms & SSL_EXPORT)?1:0;
 
@@ -302,35 +339,28 @@ int send;
        unsigned long l;
        int bs,i;
        EVP_CIPHER *enc;
-       SSL_COMPRESSION *comp;
 
        if (send)
                {
                ds=s->enc_write_ctx;
                rec= &(s->s3->wrec);
                if (s->enc_write_ctx == NULL)
-                       { enc=NULL; comp=NULL; }
+                       enc=NULL;
                else
-                       {
                        enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
-                       comp=s->write_compression;
-                       }
                }
        else
                {
                ds=s->enc_read_ctx;
                rec= &(s->s3->rrec);
                if (s->enc_read_ctx == NULL)
-                       { enc=NULL; comp=NULL; }
+                       enc=NULL;
                else
-                       {
                        enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
-                       comp=s->read_compression;
-                       }
                }
 
        if ((s->session == NULL) || (ds == NULL) ||
-               ((enc == NULL) && (comp == NULL)))
+               (enc == NULL))
                {
                memcpy(rec->data,rec->input,rec->length);
                rec->input=rec->data;
@@ -340,6 +370,8 @@ int send;
                l=rec->length;
                bs=EVP_CIPHER_block_size(ds->cipher);
 
+               /* COMPRESS */
+
                /* This should be using (bs-1) and bs instead of 7 and 8 */
                if ((bs != 1) && send)
                        {
index 0fd945025d2084120a76f057b08658203b082634..41b18140707ee9736165e94ce0e9f4be7caeb500 100644 (file)
@@ -60,7 +60,7 @@
 #include "objects.h"
 #include "ssl_locl.h"
 
-char *ssl3_version_str="SSLv3 part of SSLeay 0.9.0b 29-Jun-1998";
+char *ssl3_version_str="SSLv3 part of SSLeay 0.9.1a 06-Jul-1998";
 
 #define SSL3_NUM_CIPHERS       (sizeof(ssl3_ciphers)/sizeof(SSL_CIPHER))
 
@@ -384,6 +384,7 @@ static SSL_METHOD SSLv3_data= {
        ssl3_write,
        ssl3_shutdown,
        ssl3_renegotiate,
+       ssl3_renegotiate_check,
        ssl3_ctrl,
        ssl3_ctx_ctrl,
        ssl3_get_cipher_by_char,
@@ -460,6 +461,8 @@ SSL *s;
                Free(s->s3->rbuf.buf);
        if (s->s3->wbuf.buf != NULL)
                Free(s->s3->wbuf.buf);
+       if (s->s3->rrec.comp != NULL)
+               Free(s->s3->rrec.comp);
 #ifndef NO_DH
        if (s->s3->tmp.dh != NULL)
                DH_free(s->s3->tmp.dh);
@@ -486,6 +489,13 @@ SSL *s;
        memset(s->s3,0,sizeof(SSL3_CTX));
        if (rp != NULL) s->s3->rbuf.buf=rp;
        if (wp != NULL) s->s3->wbuf.buf=wp;
+
+       if (s->s3->rrec.comp != NULL)
+               {
+               Free(s->s3->rrec.comp);
+               s->s3->rrec.comp=NULL;
+               }
+
        s->packet_length=0;
        s->s3->renegotiate=0;
        s->s3->total_renegotiations=0;
@@ -519,6 +529,9 @@ char *parg;
        case SSL_CTRL_GET_TOTAL_RENEGOTIATIONS:
                ret=s->s3->total_renegotiations;
                break;
+       case SSL_CTRL_GET_FLAGS:
+               ret=s->s3->flags;
+               break;
        default:
                break;
                }
@@ -546,7 +559,7 @@ char *parg;
                        return(1);
                else
                        return(0);
-               break;
+               /* break; */
        case SSL_CTRL_SET_TMP_RSA:
                {
                RSA *rsa;
@@ -574,7 +587,7 @@ char *parg;
                        return(1);
                        }
                }
-               break;
+               /* break; */
        case SSL_CTRL_SET_TMP_RSA_CB:
                cert->rsa_tmp_cb=(RSA *(*)())parg;
                break;
@@ -583,6 +596,7 @@ char *parg;
        case SSL_CTRL_SET_TMP_DH:
                {
                DH *new=NULL,*dh;
+               int rret=0;
 
                dh=(DH *)parg;
                if (    ((new=DHparams_dup(dh)) == NULL) ||
@@ -590,21 +604,31 @@ char *parg;
                        {
                        SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB);
                        if (new != NULL) DH_free(new);
-                       return(0);
                        }
                else
                        {
                        if (cert->dh_tmp != NULL)
                                DH_free(cert->dh_tmp);
                        cert->dh_tmp=new;
-                       return(1);
+                       rret=1;
                        }
+               return(rret);
                }
-               break;
+               /*break; */
        case SSL_CTRL_SET_TMP_DH_CB:
                cert->dh_tmp_cb=(DH *(*)())parg;
                break;
 #endif
+       /* A Thwate special :-) */
+       case SSL_CTRL_EXTRA_CHAIN_CERT:
+               if (ctx->extra_certs == NULL)
+                       {
+                       if ((ctx->extra_certs=sk_new_null()) == NULL)
+                               return(0);
+                       }
+               sk_push(ctx->extra_certs,(char *)parg);
+               break;
+
        default:
                return(0);
                }
@@ -743,28 +767,30 @@ unsigned char *p;
 #ifndef NO_DH
        if (alg & (SSL_kDHr|SSL_kEDH))
                {
-#ifndef NO_RSA
+#  ifndef NO_RSA
                p[ret++]=SSL3_CT_RSA_FIXED_DH;
-#endif
-#ifndef NO_DSA
+#  endif
+#  ifndef NO_DSA
                p[ret++]=SSL3_CT_DSS_FIXED_DH;
-#endif
+#  endif
                }
        if ((s->version == SSL3_VERSION) &&
                (alg & (SSL_kEDH|SSL_kDHd|SSL_kDHr)))
                {
-#ifndef NO_RSA
+#  ifndef NO_RSA
                p[ret++]=SSL3_CT_RSA_EPHEMERAL_DH;
-#endif
-#ifndef NO_DSA
+#  endif
+#  ifndef NO_DSA
                p[ret++]=SSL3_CT_DSS_EPHEMERAL_DH;
-#endif
+#  endif
                }
 #endif /* !NO_DH */
 #ifndef NO_RSA
        p[ret++]=SSL3_CT_RSA_SIGN;
 #endif
+#ifndef NO_DSA
        p[ret++]=SSL3_CT_DSS_SIGN;
+#endif
        return(ret);
        }
 
index 238508034790f2c7ef8d7ffbc16cc0868e70fcbc..444263b709f6ba9cfc3a178d3d9b41c2511f40a9 100644 (file)
  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED);
  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN);
  * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_DECRYPTION_FAILED);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_RECORD_OVERFLOW);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_UNKNOWN_CA);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_ACCESS_DENIED);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_DECODE_ERROR);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_DECRYPT_ERROR);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_EXPORT_RESTRICION);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_PROTOCOL_VERSION);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_INTERNAL_ERROR);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_USER_CANCLED);
+ * SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_TLSV1_ALERT_NO_RENEGOTIATION);
  */
 
 #ifndef NOPROTO
@@ -213,7 +225,6 @@ int extend;
 static int ssl3_get_record(s)
 SSL *s;
        {
-       char tmp_buf[512];
        int ssl_major,ssl_minor,al;
        int n,i,ret= -1;
        SSL3_BUFFER *rb;
@@ -331,7 +342,6 @@ again:
 
        /* decrypt in place in 'rr->input' */
        rr->data=rr->input;
-       memcpy(tmp_buf,rr->input,(rr->length > 512)?512:rr->length);
 
        if (!s->method->ssl3_enc->enc(s,0))
                {
@@ -340,7 +350,7 @@ again:
                }
 #ifdef TLS_DEBUG
 printf("dec %d\n",rr->length);
-{ int z; for (z=0; z<rr->length; z++) printf("%02X%c",rr->data[z],((z+1)%16)?' ':'\n'); }
+{ unsigned int z; for (z=0; z<rr->length; z++) printf("%02X%c",rr->data[z],((z+1)%16)?' ':'\n'); }
 printf("\n");
 #endif
        /* r->length is now the compressed data plus mac */
@@ -378,7 +388,7 @@ printf("\n");
                }
 
        /* r->length is now just compressed */
-       if ((sess != NULL) && (sess->read_compression != NULL))
+       if (s->expand != NULL)
                {
                if (rr->length > 
                        (unsigned int)SSL3_RT_MAX_COMPRESSED_LENGTH+extra)
@@ -427,12 +437,37 @@ err:
 static int do_uncompress(ssl)
 SSL *ssl;
        {
+       int i;
+       SSL3_RECORD *rr;
+
+       rr= &(ssl->s3->rrec);
+       i=COMP_expand_block(ssl->expand,rr->comp,
+               SSL3_RT_MAX_PLAIN_LENGTH,rr->data,(int)rr->length);
+       if (i < 0)
+               return(0);
+       else
+               rr->length=i;
+       rr->data=rr->comp;
+
        return(1);
        }
 
 static int do_compress(ssl)
 SSL *ssl;
        {
+       int i;
+       SSL3_RECORD *wr;
+
+       wr= &(ssl->s3->wrec);
+       i=COMP_compress_block(ssl->compress,wr->data,
+               SSL3_RT_MAX_COMPRESSED_LENGTH,
+               wr->input,(int)wr->length);
+       if (i < 0)
+               return(0);
+       else
+               wr->length=i;
+
+       wr->input=wr->data;
        return(1);
        }
 
@@ -552,7 +587,7 @@ unsigned int len;
         * wr->data */
 
        /* first we compress */
-       if ((sess != NULL) && (sess->write_compression != NULL))
+       if (s->compress != NULL)
                {
                if (!do_compress(s))
                        {
@@ -786,7 +821,8 @@ start:
 
                                s->rwstate=SSL_NOTHING;
                                s->s3->fatal_alert=n;
-                               SSLerr(SSL_F_SSL3_READ_BYTES,1000+n);
+                               SSLerr(SSL_F_SSL3_READ_BYTES,
+                                       SSL_AD_REASON_OFFSET+n);
                                sprintf(tmp,"%d",n);
                                ERR_add_error_data(2,"SSL alert number ",tmp);
                                s->shutdown|=SSL_RECEIVED_SHUTDOWN;
index 64903af1519b5f075febf4f0cf77bd9b2e3b9250..743f8ea235cb4e84c081ea9500c38060e0ffd6ca 100644 (file)
@@ -1259,7 +1259,7 @@ SSL *s;
                i=RSA_private_decrypt((int)n,p,p,rsa,RSA_PKCS1_PADDING);
 
 #if 1
-               /* If a bad decrypt, use a dud master key */
+               /* If a bad decrypt, use a random master key */
                if ((i != SSL_MAX_MASTER_KEY_LENGTH) ||
                        ((p[0] != (s->version>>8)) ||
                         (p[1] != (s->version & 0xff))))
index c54326c624beb8251518dc9d738c63a520c17980..10ca9c534276c572dbb16bbfbad2361dcd3fe80c 100644 (file)
 #define SSL_F_SSL_USE_RSAPRIVATEKEY                     201
 #define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1                202
 #define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE                203
-#define SSL_F_SSL_WRITE                                         204
-#define SSL_F_TLS1_CHANGE_CIPHER_STATE                  205
-#define SSL_F_TLS1_ENC                                  206
-#define SSL_F_TLS1_SETUP_KEY_BLOCK                      207
-#define SSL_F_WRITE_PENDING                             208
+#define SSL_F_SSL_VERIFY_CERT_CHAIN                     204
+#define SSL_F_SSL_WRITE                                         205
+#define SSL_F_TLS1_CHANGE_CIPHER_STATE                  206
+#define SSL_F_TLS1_ENC                                  207
+#define SSL_F_TLS1_SETUP_KEY_BLOCK                      208
+#define SSL_F_WRITE_PENDING                             209
 
 /* Reason codes. */
 #define SSL_R_APP_DATA_IN_HANDSHAKE                     100
 #define SSL_R_CIPHER_TABLE_SRC_ERROR                    139
 #define SSL_R_COMPRESSED_LENGTH_TOO_LONG                140
 #define SSL_R_COMPRESSION_FAILURE                       141
-#define SSL_R_CONNECTION_ID_IS_DIFFERENT                142
-#define SSL_R_CONNECTION_TYPE_NOT_SET                   143
-#define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED             144
-#define SSL_R_DATA_LENGTH_TOO_LONG                      145
-#define SSL_R_DECRYPTION_FAILED                                 146
-#define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG           147
-#define SSL_R_DIGEST_CHECK_FAILED                       148
-#define SSL_R_ENCRYPTED_LENGTH_TOO_LONG                         149
-#define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST             150
-#define SSL_R_EXCESSIVE_MESSAGE_SIZE                    151
-#define SSL_R_EXTRA_DATA_IN_MESSAGE                     152
-#define SSL_R_GOT_A_FIN_BEFORE_A_CCS                    153
-#define SSL_R_HTTPS_PROXY_REQUEST                       154
-#define SSL_R_HTTP_REQUEST                              155
-#define SSL_R_INTERNAL_ERROR                            156
-#define SSL_R_INVALID_CHALLENGE_LENGTH                  157
-#define SSL_R_LENGTH_MISMATCH                           158
-#define SSL_R_LENGTH_TOO_SHORT                          159
-#define SSL_R_LIBRARY_HAS_NO_CIPHERS                    160
-#define SSL_R_MISSING_DH_DSA_CERT                       161
-#define SSL_R_MISSING_DH_KEY                            162
-#define SSL_R_MISSING_DH_RSA_CERT                       163
-#define SSL_R_MISSING_DSA_SIGNING_CERT                  164
-#define SSL_R_MISSING_EXPORT_TMP_DH_KEY                         165
-#define SSL_R_MISSING_EXPORT_TMP_RSA_KEY                166
-#define SSL_R_MISSING_RSA_CERTIFICATE                   167
-#define SSL_R_MISSING_RSA_ENCRYPTING_CERT               168
-#define SSL_R_MISSING_RSA_SIGNING_CERT                  169
-#define SSL_R_MISSING_TMP_DH_KEY                        170
-#define SSL_R_MISSING_TMP_RSA_KEY                       171
-#define SSL_R_MISSING_TMP_RSA_PKEY                      172
-#define SSL_R_MISSING_VERIFY_MESSAGE                    173
-#define SSL_R_NON_SSLV2_INITIAL_PACKET                  174
-#define SSL_R_NO_CERTIFICATES_RETURNED                  175
-#define SSL_R_NO_CERTIFICATE_ASSIGNED                   176
-#define SSL_R_NO_CERTIFICATE_RETURNED                   177
-#define SSL_R_NO_CERTIFICATE_SET                        178
-#define SSL_R_NO_CERTIFICATE_SPECIFIED                  179
-#define SSL_R_NO_CIPHERS_AVAILABLE                      180
-#define SSL_R_NO_CIPHERS_PASSED                                 181
-#define SSL_R_NO_CIPHERS_SPECIFIED                      182
-#define SSL_R_NO_CIPHER_LIST                            183
-#define SSL_R_NO_CIPHER_MATCH                           184
-#define SSL_R_NO_CLIENT_CERT_RECEIVED                   185
-#define SSL_R_NO_COMPRESSION_SPECIFIED                  186
-#define SSL_R_NO_PRIVATEKEY                             187
-#define SSL_R_NO_PRIVATE_KEY_ASSIGNED                   188
-#define SSL_R_NO_PROTOCOLS_AVAILABLE                    189
-#define SSL_R_NO_PUBLICKEY                              190
-#define SSL_R_NO_SHARED_CIPHER                          191
-#define SSL_R_NULL_SSL_CTX                              192
-#define SSL_R_NULL_SSL_METHOD_PASSED                    193
-#define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED           194
-#define SSL_R_PACKET_LENGTH_TOO_LONG                    195
-#define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE                 196
-#define SSL_R_PEER_ERROR                                197
-#define SSL_R_PEER_ERROR_CERTIFICATE                    198
-#define SSL_R_PEER_ERROR_NO_CERTIFICATE                         199
-#define SSL_R_PEER_ERROR_NO_CIPHER                      200
-#define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE   201
-#define SSL_R_PRE_MAC_LENGTH_TOO_LONG                   202
-#define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS                 203
-#define SSL_R_PROTOCOL_IS_SHUTDOWN                      204
-#define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR                  205
-#define SSL_R_PUBLIC_KEY_IS_NOT_RSA                     206
-#define SSL_R_PUBLIC_KEY_NOT_RSA                        207
-#define SSL_R_READ_BIO_NOT_SET                          208
-#define SSL_R_READ_WRONG_PACKET_TYPE                    209
-#define SSL_R_RECORD_LENGTH_MISMATCH                    210
-#define SSL_R_RECORD_TOO_LARGE                          211
-#define SSL_R_REQUIRED_CIPHER_MISSING                   212
-#define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO                213
-#define SSL_R_REUSE_CERT_TYPE_NOT_ZERO                  214
-#define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO                215
-#define SSL_R_SHORT_READ                                216
-#define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE     217
-#define SSL_R_SSL3_SESSION_ID_TOO_SHORT                         218
+#define SSL_R_COMPRESSION_LIBRARY_ERROR                         142
+#define SSL_R_CONNECTION_ID_IS_DIFFERENT                143
+#define SSL_R_CONNECTION_TYPE_NOT_SET                   144
+#define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED             145
+#define SSL_R_DATA_LENGTH_TOO_LONG                      146
+#define SSL_R_DECRYPTION_FAILED                                 147
+#define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG           148
+#define SSL_R_DIGEST_CHECK_FAILED                       149
+#define SSL_R_ENCRYPTED_LENGTH_TOO_LONG                         150
+#define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST             151
+#define SSL_R_EXCESSIVE_MESSAGE_SIZE                    152
+#define SSL_R_EXTRA_DATA_IN_MESSAGE                     153
+#define SSL_R_GOT_A_FIN_BEFORE_A_CCS                    154
+#define SSL_R_HTTPS_PROXY_REQUEST                       155
+#define SSL_R_HTTP_REQUEST                              156
+#define SSL_R_INTERNAL_ERROR                            157
+#define SSL_R_INVALID_CHALLENGE_LENGTH                  158
+#define SSL_R_LENGTH_MISMATCH                           159
+#define SSL_R_LENGTH_TOO_SHORT                          160
+#define SSL_R_LIBRARY_HAS_NO_CIPHERS                    161
+#define SSL_R_MISSING_DH_DSA_CERT                       162
+#define SSL_R_MISSING_DH_KEY                            163
+#define SSL_R_MISSING_DH_RSA_CERT                       164
+#define SSL_R_MISSING_DSA_SIGNING_CERT                  165
+#define SSL_R_MISSING_EXPORT_TMP_DH_KEY                         166
+#define SSL_R_MISSING_EXPORT_TMP_RSA_KEY                167
+#define SSL_R_MISSING_RSA_CERTIFICATE                   168
+#define SSL_R_MISSING_RSA_ENCRYPTING_CERT               169
+#define SSL_R_MISSING_RSA_SIGNING_CERT                  170
+#define SSL_R_MISSING_TMP_DH_KEY                        171
+#define SSL_R_MISSING_TMP_RSA_KEY                       172
+#define SSL_R_MISSING_TMP_RSA_PKEY                      173
+#define SSL_R_MISSING_VERIFY_MESSAGE                    174
+#define SSL_R_NON_SSLV2_INITIAL_PACKET                  175
+#define SSL_R_NO_CERTIFICATES_RETURNED                  176
+#define SSL_R_NO_CERTIFICATE_ASSIGNED                   177
+#define SSL_R_NO_CERTIFICATE_RETURNED                   178
+#define SSL_R_NO_CERTIFICATE_SET                        179
+#define SSL_R_NO_CERTIFICATE_SPECIFIED                  180
+#define SSL_R_NO_CIPHERS_AVAILABLE                      181
+#define SSL_R_NO_CIPHERS_PASSED                                 182
+#define SSL_R_NO_CIPHERS_SPECIFIED                      183
+#define SSL_R_NO_CIPHER_LIST                            184
+#define SSL_R_NO_CIPHER_MATCH                           185
+#define SSL_R_NO_CLIENT_CERT_RECEIVED                   186
+#define SSL_R_NO_COMPRESSION_SPECIFIED                  187
+#define SSL_R_NO_PRIVATEKEY                             188
+#define SSL_R_NO_PRIVATE_KEY_ASSIGNED                   189
+#define SSL_R_NO_PROTOCOLS_AVAILABLE                    190
+#define SSL_R_NO_PUBLICKEY                              191
+#define SSL_R_NO_SHARED_CIPHER                          192
+#define SSL_R_NO_VERIFY_CALLBACK                        193
+#define SSL_R_NULL_SSL_CTX                              194
+#define SSL_R_NULL_SSL_METHOD_PASSED                    195
+#define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED           196
+#define SSL_R_PACKET_LENGTH_TOO_LONG                    197
+#define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE                 198
+#define SSL_R_PEER_ERROR                                199
+#define SSL_R_PEER_ERROR_CERTIFICATE                    200
+#define SSL_R_PEER_ERROR_NO_CERTIFICATE                         201
+#define SSL_R_PEER_ERROR_NO_CIPHER                      202
+#define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE   203
+#define SSL_R_PRE_MAC_LENGTH_TOO_LONG                   204
+#define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS                 205
+#define SSL_R_PROTOCOL_IS_SHUTDOWN                      206
+#define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR                  207
+#define SSL_R_PUBLIC_KEY_IS_NOT_RSA                     208
+#define SSL_R_PUBLIC_KEY_NOT_RSA                        209
+#define SSL_R_READ_BIO_NOT_SET                          210
+#define SSL_R_READ_WRONG_PACKET_TYPE                    211
+#define SSL_R_RECORD_LENGTH_MISMATCH                    212
+#define SSL_R_RECORD_TOO_LARGE                          213
+#define SSL_R_REQUIRED_CIPHER_MISSING                   214
+#define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO                215
+#define SSL_R_REUSE_CERT_TYPE_NOT_ZERO                  216
+#define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO                217
+#define SSL_R_SHORT_READ                                218
+#define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE     219
+#define SSL_R_SSL3_SESSION_ID_TOO_SHORT                         220
 #define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE               1042
 #define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC                1020
 #define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED           1045
 #define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE             1040
 #define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER             1047
 #define SSL_R_SSLV3_ALERT_NO_CERTIFICATE                1041
-#define SSL_R_SSLV3_ALERT_PEER_ERROR_CERTIFICATE        219
-#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CERTIFICATE     220
-#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CIPHER          221
-#define SSL_R_SSLV3_ALERT_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 222
+#define SSL_R_SSLV3_ALERT_PEER_ERROR_CERTIFICATE        221
+#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CERTIFICATE     222
+#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CIPHER          223
+#define SSL_R_SSLV3_ALERT_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 224
 #define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE            1010
-#define SSL_R_SSLV3_ALERT_UNKNOWN_REMOTE_ERROR_TYPE     223
+#define SSL_R_SSLV3_ALERT_UNKNOWN_REMOTE_ERROR_TYPE     225
 #define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE       1043
-#define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION        224
-#define SSL_R_SSL_HANDSHAKE_FAILURE                     225
-#define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS                226
-#define SSL_R_SSL_SESSION_ID_IS_DIFFERENT               227
-#define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER      228
-#define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 229
-#define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG   230
-#define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER           231
-#define SSL_R_UNABLE_TO_DECODE_DH_CERTS                         232
-#define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY              233
-#define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS              234
-#define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS      235
-#define SSL_R_UNABLE_TO_FIND_SSL_METHOD                         236
-#define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES          237
-#define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES          238
-#define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES                 239
-#define SSL_R_UNEXPECTED_MESSAGE                        240
-#define SSL_R_UNEXPECTED_RECORD                                 241
-#define SSL_R_UNKNOWN_ALERT_TYPE                        242
-#define SSL_R_UNKNOWN_CERTIFICATE_TYPE                  243
-#define SSL_R_UNKNOWN_CIPHER_RETURNED                   244
-#define SSL_R_UNKNOWN_CIPHER_TYPE                       245
-#define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE                         246
-#define SSL_R_UNKNOWN_PKEY_TYPE                                 247
-#define SSL_R_UNKNOWN_PROTOCOL                          248
-#define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE                         249
-#define SSL_R_UNKNOWN_SSL_VERSION                       250
-#define SSL_R_UNKNOWN_STATE                             251
-#define SSL_R_UNSUPPORTED_CIPHER                        252
-#define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM                 253
-#define SSL_R_UNSUPPORTED_PROTOCOL                      254
-#define SSL_R_UNSUPPORTED_SSL_VERSION                   255
-#define SSL_R_WRITE_BIO_NOT_SET                                 256
-#define SSL_R_WRONG_CIPHER_RETURNED                     257
-#define SSL_R_WRONG_MESSAGE_TYPE                        258
-#define SSL_R_WRONG_NUMBER_OF_KEY_BITS                  259
-#define SSL_R_WRONG_SIGNATURE_LENGTH                    260
-#define SSL_R_WRONG_SIGNATURE_SIZE                      261
-#define SSL_R_WRONG_SSL_VERSION                                 262
-#define SSL_R_WRONG_VERSION_NUMBER                      263
-#define SSL_R_X509_LIB                                  264
+#define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION        226
+#define SSL_R_SSL_HANDSHAKE_FAILURE                     227
+#define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS                228
+#define SSL_R_SSL_SESSION_ID_IS_DIFFERENT               229
+#define SSL_R_TLSV1_ALERT_ACCESS_DENIED                         1049
+#define SSL_R_TLSV1_ALERT_DECODE_ERROR                  1050
+#define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED             1021
+#define SSL_R_TLSV1_ALERT_DECRYPT_ERROR                         1051
+#define SSL_R_TLSV1_ALERT_EXPORT_RESTRICION             1060
+#define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY                 1071
+#define SSL_R_TLSV1_ALERT_INTERNAL_ERROR                1080
+#define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION              1100
+#define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION              1070
+#define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW               1022
+#define SSL_R_TLSV1_ALERT_UNKNOWN_CA                    1048
+#define SSL_R_TLSV1_ALERT_USER_CANCLED                  1090
+#define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER      230
+#define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 231
+#define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG   232
+#define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER           233
+#define SSL_R_UNABLE_TO_DECODE_DH_CERTS                         234
+#define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY              235
+#define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS              236
+#define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS      237
+#define SSL_R_UNABLE_TO_FIND_SSL_METHOD                         238
+#define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES          239
+#define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES          240
+#define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES                 241
+#define SSL_R_UNEXPECTED_MESSAGE                        242
+#define SSL_R_UNEXPECTED_RECORD                                 243
+#define SSL_R_UNKNOWN_ALERT_TYPE                        244
+#define SSL_R_UNKNOWN_CERTIFICATE_TYPE                  245
+#define SSL_R_UNKNOWN_CIPHER_RETURNED                   246
+#define SSL_R_UNKNOWN_CIPHER_TYPE                       247
+#define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE                         248
+#define SSL_R_UNKNOWN_PKEY_TYPE                                 249
+#define SSL_R_UNKNOWN_PROTOCOL                          250
+#define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE                         251
+#define SSL_R_UNKNOWN_SSL_VERSION                       252
+#define SSL_R_UNKNOWN_STATE                             253
+#define SSL_R_UNSUPPORTED_CIPHER                        254
+#define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM                 255
+#define SSL_R_UNSUPPORTED_PROTOCOL                      256
+#define SSL_R_UNSUPPORTED_SSL_VERSION                   257
+#define SSL_R_WRITE_BIO_NOT_SET                                 258
+#define SSL_R_WRONG_CIPHER_RETURNED                     259
+#define SSL_R_WRONG_MESSAGE_TYPE                        260
+#define SSL_R_WRONG_NUMBER_OF_KEY_BITS                  261
+#define SSL_R_WRONG_SIGNATURE_LENGTH                    262
+#define SSL_R_WRONG_SIGNATURE_SIZE                      263
+#define SSL_R_WRONG_SSL_VERSION                                 264
+#define SSL_R_WRONG_VERSION_NUMBER                      265
+#define SSL_R_X509_LIB                                  266
+#define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS          267
index cf8f9651b2b0f63ecffa60f8a92ff63bb3d1d5f5..a308481ca97b331f420f5c56c899177bfa6ca877 100644 (file)
--- a/ssl/ssl.h
+++ b/ssl/ssl.h
@@ -124,6 +124,7 @@ extern "C" {
 #define SSL_TXT_EXPORT         "EXPORT"
 #define SSL_TXT_SSLV2          "SSLv2"
 #define SSL_TXT_SSLV3          "SSLv3"
+#define SSL_TXT_TLSV1          "TLSv1"
 #define SSL_TXT_ALL            "ALL"
 
 /* 'DEFAULT' at the start of the cipher list insert the following string
@@ -178,6 +179,7 @@ typedef struct ssl_method_st
        int (*ssl_write)();
        int (*ssl_shutdown)();
        int (*ssl_renegotiate)();
+       int (*ssl_renegotiate_check)();
        long (*ssl_ctrl)();
        long (*ssl_ctx_ctrl)();
        SSL_CIPHER *(*get_cipher_by_char)();
@@ -190,11 +192,6 @@ typedef struct ssl_method_st
        struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */
        } SSL_METHOD;
 
-typedef struct ssl_compression_st
-       {
-       char *stuff;
-       } SSL_COMPRESSION;
-
 /* Lets make this into an ASN.1 type structure as follows
  * SSL_SESSION_ID ::= SEQUENCE {
  *     version                 INTEGER,        -- structure version number
@@ -206,6 +203,7 @@ typedef struct ssl_compression_st
  *     Time [ 1 ] EXPLICIT     INTEGER,        -- optional Start Time
  *     Timeout [ 2 ] EXPLICIT  INTEGER,        -- optional Timeout ins seconds
  *     Peer [ 3 ] EXPLICIT     X509,           -- optional Peer Certificate
+ *     Compression [4] IMPLICIT ASN1_OBJECT    -- compression OID XXXXX
  *     }
  * Look in ssl/ssl_asn1.c for more details
  * I'm using EXPLICIT tags so I can read the damn things using asn1parse :-).
@@ -237,8 +235,11 @@ typedef struct ssl_session_st
        long timeout;
        long time;
 
-       SSL_COMPRESSION *read_compression;
-       SSL_COMPRESSION *write_compression;
+#ifdef HEADER_COMP_H
+       COMP_CTX *compress_meth;
+#else
+       char *compress_meth;
+#endif
 
        SSL_CIPHER *cipher;
        unsigned long cipher_id;        /* when ASN.1 loaded, this
@@ -262,13 +263,17 @@ typedef struct ssl_session_st
 #define SSL_OP_MSIE_SSLV2_RSA_PADDING                  0x00000040L
 #define SSL_OP_SSLEAY_080_CLIENT_DH_BUG                        0x00000080L
 #define SSL_OP_TLS_D5_BUG                              0x00000100L
-#define        SSL_OP_TLS_BLOCK_PADDING_BUG                    0x00000200L
+#define SSL_OP_TLS_BLOCK_PADDING_BUG                   0x00000200L
 
 /* If set, only use tmp_dh parameters once */
 #define SSL_OP_SINGLE_DH_USE                           0x00100000L
 /* Set to also use the tmp_rsa key when doing RSA operations. */
 #define SSL_OP_EPHEMERAL_RSA                           0x00200000L
 
+/* The next flag deliberatly changes the ciphertest, this is a check
+ * for the PKCS#1 attack */
+#define SSL_OP_PKCS1_CHECK_1                           0x08000000L
+#define SSL_OP_PKCS1_CHECK_2                           0x10000000L
 #define SSL_OP_NETSCAPE_CA_DN_BUG                      0x20000000L
 #define SSL_OP_NON_EXPORT_FIRST                        0x40000000L
 #define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG         0x80000000L
@@ -385,6 +390,8 @@ typedef struct ssl_ctx_st
        EVP_MD *rsa_md5;/* For SSLv2 - name is 'ssl2-md5' */
        EVP_MD *md5;    /* For SSLv3/TLSv1 'ssl3-md5' */
        EVP_MD *sha1;   /* For SSLv3/TLSv1 'ssl3->sha1' */
+
+       STACK *extra_certs;
        } SSL_CTX;
 
 #define SSL_SESS_CACHE_OFF                     0x0000
@@ -512,11 +519,19 @@ typedef struct ssl_st
 
        EVP_CIPHER_CTX *enc_read_ctx;           /* cryptographic state */
        EVP_MD *read_hash;                      /* used for mac generation */
-       SSL_COMPRESSION *read_compression;      /* compression */
+#ifdef HEADER_COMP_H
+       COMP_CTX *expand;                       /* uncompress */
+#else
+       char *expand;
+#endif
 
        EVP_CIPHER_CTX *enc_write_ctx;          /* cryptographic state */
        EVP_MD *write_hash;                     /* used for mac generation */
-       SSL_COMPRESSION *write_compression;     /* compression */
+#ifdef HEADER_COMP_H
+       COMP_CTX *compress;                     /* compression */
+#else
+       char *compress; 
+#endif
 
        /* session info */
 
@@ -660,6 +675,7 @@ typedef struct ssl_st
                PEM_STRING_SSL_SESSION,bp, (char *)x, NULL,NULL,0,NULL)
 #endif
 
+#define SSL_AD_REASON_OFFSET           1000
 /* These alert types are for SSLv3 and TLSv1 */
 #define SSL_AD_CLOSE_NOTIFY            SSL3_AD_CLOSE_NOTIFY
 #define SSL_AD_UNEXPECTED_MESSAGE      SSL3_AD_UNEXPECTED_MESSAGE /* fatal */
@@ -706,6 +722,9 @@ typedef struct ssl_st
 #define SSL_CTRL_GET_NUM_RENEGOTIATIONS                8
 #define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS      9
 #define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS      10
+#define SSL_CTRL_GET_FLAGS                     11
+
+#define SSL_CTRL_EXTRA_CHAIN_CERT              11
 
 #define SSL_session_reused(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_GET_SESSION_REUSED,0,NULL)
@@ -724,14 +743,17 @@ typedef struct ssl_st
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)dh)
 
 /* For the next 2, the callbacks are 
- * RSA *tmp_rsa_cb(int export)
- * DH *tmp_dh_cb(int export)
+ * RSA *tmp_rsa_cb(SSL *ssl,int export)
+ * DH *tmp_dh_cb(SSL *ssl,int export)
  */
 #define SSL_CTX_set_tmp_rsa_callback(ctx,cb) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,0,(char *)cb)
 #define SSL_CTX_set_tmp_dh_callback(ctx,dh) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,0,(char *)dh)
 
+#define SSL_CTX_add_extra_chain_cert(ctx,x509) \
+       SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509)
+
 #ifndef NOPROTO
 
 #ifdef HEADER_BIO_H
@@ -944,6 +966,8 @@ char *SSL_CTX_get_ex_data(SSL_CTX *ssl,int idx);
 int SSL_CTX_get_ex_new_index(long argl, char *argp, int (*new_func)(),
        int (*dup_func)(), void (*free_func)());
 
+int SSL_get_ex_data_X509_STORE_CTX_idx(void );
+
 #else
 
 BIO_METHOD *BIO_f_ssl();
@@ -1120,6 +1144,7 @@ X509 *SSL_get_certificate();
 
 #ifdef this_is_for_mk1mf_pl
 EVP *SSL_get_privatekey();
+#endif
 
 void SSL_CTX_set_quiet_shutdown();
 int SSL_CTX_get_quiet_shutdown();
@@ -1133,7 +1158,7 @@ int SSL_CTX_load_verify_locations();
 SSL_SESSION *SSL_get_session();
 SSL_CTX *SSL_get_SSL_CTX();
 void SSL_set_info_callback();
-int (*SSL_get_info_callback())();
+void (*SSL_get_info_callback())();
 int SSL_state();
 void SSL_set_verify_result();
 long SSL_get_verify_result();
@@ -1150,7 +1175,9 @@ int SSL_CTX_set_ex_data();
 char *SSL_CTX_get_ex_data();
 int SSL_CTX_get_ex_new_index();
 
-#endif
+int SSL_get_ex_data_X509_STORE_CTX_idx();
+
+/* #endif */
 
 #endif
 
@@ -1262,11 +1289,12 @@ int SSL_CTX_get_ex_new_index();
 #define SSL_F_SSL_USE_RSAPRIVATEKEY                     201
 #define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1                202
 #define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE                203
-#define SSL_F_SSL_WRITE                                         204
-#define SSL_F_TLS1_CHANGE_CIPHER_STATE                  205
-#define SSL_F_TLS1_ENC                                  206
-#define SSL_F_TLS1_SETUP_KEY_BLOCK                      207
-#define SSL_F_WRITE_PENDING                             208
+#define SSL_F_SSL_VERIFY_CERT_CHAIN                     204
+#define SSL_F_SSL_WRITE                                         205
+#define SSL_F_TLS1_CHANGE_CIPHER_STATE                  206
+#define SSL_F_TLS1_ENC                                  207
+#define SSL_F_TLS1_SETUP_KEY_BLOCK                      208
+#define SSL_F_WRITE_PENDING                             209
 
 /* Reason codes. */
 #define SSL_R_APP_DATA_IN_HANDSHAKE                     100
@@ -1311,83 +1339,85 @@ int SSL_CTX_get_ex_new_index();
 #define SSL_R_CIPHER_TABLE_SRC_ERROR                    139
 #define SSL_R_COMPRESSED_LENGTH_TOO_LONG                140
 #define SSL_R_COMPRESSION_FAILURE                       141
-#define SSL_R_CONNECTION_ID_IS_DIFFERENT                142
-#define SSL_R_CONNECTION_TYPE_NOT_SET                   143
-#define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED             144
-#define SSL_R_DATA_LENGTH_TOO_LONG                      145
-#define SSL_R_DECRYPTION_FAILED                                 146
-#define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG           147
-#define SSL_R_DIGEST_CHECK_FAILED                       148
-#define SSL_R_ENCRYPTED_LENGTH_TOO_LONG                         149
-#define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST             150
-#define SSL_R_EXCESSIVE_MESSAGE_SIZE                    151
-#define SSL_R_EXTRA_DATA_IN_MESSAGE                     152
-#define SSL_R_GOT_A_FIN_BEFORE_A_CCS                    153
-#define SSL_R_HTTPS_PROXY_REQUEST                       154
-#define SSL_R_HTTP_REQUEST                              155
-#define SSL_R_INTERNAL_ERROR                            156
-#define SSL_R_INVALID_CHALLENGE_LENGTH                  157
-#define SSL_R_LENGTH_MISMATCH                           158
-#define SSL_R_LENGTH_TOO_SHORT                          159
-#define SSL_R_LIBRARY_HAS_NO_CIPHERS                    160
-#define SSL_R_MISSING_DH_DSA_CERT                       161
-#define SSL_R_MISSING_DH_KEY                            162
-#define SSL_R_MISSING_DH_RSA_CERT                       163
-#define SSL_R_MISSING_DSA_SIGNING_CERT                  164
-#define SSL_R_MISSING_EXPORT_TMP_DH_KEY                         165
-#define SSL_R_MISSING_EXPORT_TMP_RSA_KEY                166
-#define SSL_R_MISSING_RSA_CERTIFICATE                   167
-#define SSL_R_MISSING_RSA_ENCRYPTING_CERT               168
-#define SSL_R_MISSING_RSA_SIGNING_CERT                  169
-#define SSL_R_MISSING_TMP_DH_KEY                        170
-#define SSL_R_MISSING_TMP_RSA_KEY                       171
-#define SSL_R_MISSING_TMP_RSA_PKEY                      172
-#define SSL_R_MISSING_VERIFY_MESSAGE                    173
-#define SSL_R_NON_SSLV2_INITIAL_PACKET                  174
-#define SSL_R_NO_CERTIFICATES_RETURNED                  175
-#define SSL_R_NO_CERTIFICATE_ASSIGNED                   176
-#define SSL_R_NO_CERTIFICATE_RETURNED                   177
-#define SSL_R_NO_CERTIFICATE_SET                        178
-#define SSL_R_NO_CERTIFICATE_SPECIFIED                  179
-#define SSL_R_NO_CIPHERS_AVAILABLE                      180
-#define SSL_R_NO_CIPHERS_PASSED                                 181
-#define SSL_R_NO_CIPHERS_SPECIFIED                      182
-#define SSL_R_NO_CIPHER_LIST                            183
-#define SSL_R_NO_CIPHER_MATCH                           184
-#define SSL_R_NO_CLIENT_CERT_RECEIVED                   185
-#define SSL_R_NO_COMPRESSION_SPECIFIED                  186
-#define SSL_R_NO_PRIVATEKEY                             187
-#define SSL_R_NO_PRIVATE_KEY_ASSIGNED                   188
-#define SSL_R_NO_PROTOCOLS_AVAILABLE                    189
-#define SSL_R_NO_PUBLICKEY                              190
-#define SSL_R_NO_SHARED_CIPHER                          191
-#define SSL_R_NULL_SSL_CTX                              192
-#define SSL_R_NULL_SSL_METHOD_PASSED                    193
-#define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED           194
-#define SSL_R_PACKET_LENGTH_TOO_LONG                    195
-#define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE                 196
-#define SSL_R_PEER_ERROR                                197
-#define SSL_R_PEER_ERROR_CERTIFICATE                    198
-#define SSL_R_PEER_ERROR_NO_CERTIFICATE                         199
-#define SSL_R_PEER_ERROR_NO_CIPHER                      200
-#define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE   201
-#define SSL_R_PRE_MAC_LENGTH_TOO_LONG                   202
-#define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS                 203
-#define SSL_R_PROTOCOL_IS_SHUTDOWN                      204
-#define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR                  205
-#define SSL_R_PUBLIC_KEY_IS_NOT_RSA                     206
-#define SSL_R_PUBLIC_KEY_NOT_RSA                        207
-#define SSL_R_READ_BIO_NOT_SET                          208
-#define SSL_R_READ_WRONG_PACKET_TYPE                    209
-#define SSL_R_RECORD_LENGTH_MISMATCH                    210
-#define SSL_R_RECORD_TOO_LARGE                          211
-#define SSL_R_REQUIRED_CIPHER_MISSING                   212
-#define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO                213
-#define SSL_R_REUSE_CERT_TYPE_NOT_ZERO                  214
-#define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO                215
-#define SSL_R_SHORT_READ                                216
-#define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE     217
-#define SSL_R_SSL3_SESSION_ID_TOO_SHORT                         218
+#define SSL_R_COMPRESSION_LIBRARY_ERROR                         142
+#define SSL_R_CONNECTION_ID_IS_DIFFERENT                143
+#define SSL_R_CONNECTION_TYPE_NOT_SET                   144
+#define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED             145
+#define SSL_R_DATA_LENGTH_TOO_LONG                      146
+#define SSL_R_DECRYPTION_FAILED                                 147
+#define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG           148
+#define SSL_R_DIGEST_CHECK_FAILED                       149
+#define SSL_R_ENCRYPTED_LENGTH_TOO_LONG                         150
+#define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST             151
+#define SSL_R_EXCESSIVE_MESSAGE_SIZE                    152
+#define SSL_R_EXTRA_DATA_IN_MESSAGE                     153
+#define SSL_R_GOT_A_FIN_BEFORE_A_CCS                    154
+#define SSL_R_HTTPS_PROXY_REQUEST                       155
+#define SSL_R_HTTP_REQUEST                              156
+#define SSL_R_INTERNAL_ERROR                            157
+#define SSL_R_INVALID_CHALLENGE_LENGTH                  158
+#define SSL_R_LENGTH_MISMATCH                           159
+#define SSL_R_LENGTH_TOO_SHORT                          160
+#define SSL_R_LIBRARY_HAS_NO_CIPHERS                    161
+#define SSL_R_MISSING_DH_DSA_CERT                       162
+#define SSL_R_MISSING_DH_KEY                            163
+#define SSL_R_MISSING_DH_RSA_CERT                       164
+#define SSL_R_MISSING_DSA_SIGNING_CERT                  165
+#define SSL_R_MISSING_EXPORT_TMP_DH_KEY                         166
+#define SSL_R_MISSING_EXPORT_TMP_RSA_KEY                167
+#define SSL_R_MISSING_RSA_CERTIFICATE                   168
+#define SSL_R_MISSING_RSA_ENCRYPTING_CERT               169
+#define SSL_R_MISSING_RSA_SIGNING_CERT                  170
+#define SSL_R_MISSING_TMP_DH_KEY                        171
+#define SSL_R_MISSING_TMP_RSA_KEY                       172
+#define SSL_R_MISSING_TMP_RSA_PKEY                      173
+#define SSL_R_MISSING_VERIFY_MESSAGE                    174
+#define SSL_R_NON_SSLV2_INITIAL_PACKET                  175
+#define SSL_R_NO_CERTIFICATES_RETURNED                  176
+#define SSL_R_NO_CERTIFICATE_ASSIGNED                   177
+#define SSL_R_NO_CERTIFICATE_RETURNED                   178
+#define SSL_R_NO_CERTIFICATE_SET                        179
+#define SSL_R_NO_CERTIFICATE_SPECIFIED                  180
+#define SSL_R_NO_CIPHERS_AVAILABLE                      181
+#define SSL_R_NO_CIPHERS_PASSED                                 182
+#define SSL_R_NO_CIPHERS_SPECIFIED                      183
+#define SSL_R_NO_CIPHER_LIST                            184
+#define SSL_R_NO_CIPHER_MATCH                           185
+#define SSL_R_NO_CLIENT_CERT_RECEIVED                   186
+#define SSL_R_NO_COMPRESSION_SPECIFIED                  187
+#define SSL_R_NO_PRIVATEKEY                             188
+#define SSL_R_NO_PRIVATE_KEY_ASSIGNED                   189
+#define SSL_R_NO_PROTOCOLS_AVAILABLE                    190
+#define SSL_R_NO_PUBLICKEY                              191
+#define SSL_R_NO_SHARED_CIPHER                          192
+#define SSL_R_NO_VERIFY_CALLBACK                        193
+#define SSL_R_NULL_SSL_CTX                              194
+#define SSL_R_NULL_SSL_METHOD_PASSED                    195
+#define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED           196
+#define SSL_R_PACKET_LENGTH_TOO_LONG                    197
+#define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE                 198
+#define SSL_R_PEER_ERROR                                199
+#define SSL_R_PEER_ERROR_CERTIFICATE                    200
+#define SSL_R_PEER_ERROR_NO_CERTIFICATE                         201
+#define SSL_R_PEER_ERROR_NO_CIPHER                      202
+#define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE   203
+#define SSL_R_PRE_MAC_LENGTH_TOO_LONG                   204
+#define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS                 205
+#define SSL_R_PROTOCOL_IS_SHUTDOWN                      206
+#define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR                  207
+#define SSL_R_PUBLIC_KEY_IS_NOT_RSA                     208
+#define SSL_R_PUBLIC_KEY_NOT_RSA                        209
+#define SSL_R_READ_BIO_NOT_SET                          210
+#define SSL_R_READ_WRONG_PACKET_TYPE                    211
+#define SSL_R_RECORD_LENGTH_MISMATCH                    212
+#define SSL_R_RECORD_TOO_LARGE                          213
+#define SSL_R_REQUIRED_CIPHER_MISSING                   214
+#define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO                215
+#define SSL_R_REUSE_CERT_TYPE_NOT_ZERO                  216
+#define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO                217
+#define SSL_R_SHORT_READ                                218
+#define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE     219
+#define SSL_R_SSL3_SESSION_ID_TOO_SHORT                         220
 #define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE               1042
 #define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC                1020
 #define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED           1045
@@ -1397,54 +1427,67 @@ int SSL_CTX_get_ex_new_index();
 #define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE             1040
 #define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER             1047
 #define SSL_R_SSLV3_ALERT_NO_CERTIFICATE                1041
-#define SSL_R_SSLV3_ALERT_PEER_ERROR_CERTIFICATE        219
-#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CERTIFICATE     220
-#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CIPHER          221
-#define SSL_R_SSLV3_ALERT_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 222
+#define SSL_R_SSLV3_ALERT_PEER_ERROR_CERTIFICATE        221
+#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CERTIFICATE     222
+#define SSL_R_SSLV3_ALERT_PEER_ERROR_NO_CIPHER          223
+#define SSL_R_SSLV3_ALERT_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 224
 #define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE            1010
-#define SSL_R_SSLV3_ALERT_UNKNOWN_REMOTE_ERROR_TYPE     223
+#define SSL_R_SSLV3_ALERT_UNKNOWN_REMOTE_ERROR_TYPE     225
 #define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE       1043
-#define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION        224
-#define SSL_R_SSL_HANDSHAKE_FAILURE                     225
-#define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS                226
-#define SSL_R_SSL_SESSION_ID_IS_DIFFERENT               227
-#define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER      228
-#define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 229
-#define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG   230
-#define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER           231
-#define SSL_R_UNABLE_TO_DECODE_DH_CERTS                         232
-#define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY              233
-#define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS              234
-#define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS      235
-#define SSL_R_UNABLE_TO_FIND_SSL_METHOD                         236
-#define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES          237
-#define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES          238
-#define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES                 239
-#define SSL_R_UNEXPECTED_MESSAGE                        240
-#define SSL_R_UNEXPECTED_RECORD                                 241
-#define SSL_R_UNKNOWN_ALERT_TYPE                        242
-#define SSL_R_UNKNOWN_CERTIFICATE_TYPE                  243
-#define SSL_R_UNKNOWN_CIPHER_RETURNED                   244
-#define SSL_R_UNKNOWN_CIPHER_TYPE                       245
-#define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE                         246
-#define SSL_R_UNKNOWN_PKEY_TYPE                                 247
-#define SSL_R_UNKNOWN_PROTOCOL                          248
-#define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE                         249
-#define SSL_R_UNKNOWN_SSL_VERSION                       250
-#define SSL_R_UNKNOWN_STATE                             251
-#define SSL_R_UNSUPPORTED_CIPHER                        252
-#define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM                 253
-#define SSL_R_UNSUPPORTED_PROTOCOL                      254
-#define SSL_R_UNSUPPORTED_SSL_VERSION                   255
-#define SSL_R_WRITE_BIO_NOT_SET                                 256
-#define SSL_R_WRONG_CIPHER_RETURNED                     257
-#define SSL_R_WRONG_MESSAGE_TYPE                        258
-#define SSL_R_WRONG_NUMBER_OF_KEY_BITS                  259
-#define SSL_R_WRONG_SIGNATURE_LENGTH                    260
-#define SSL_R_WRONG_SIGNATURE_SIZE                      261
-#define SSL_R_WRONG_SSL_VERSION                                 262
-#define SSL_R_WRONG_VERSION_NUMBER                      263
-#define SSL_R_X509_LIB                                  264
+#define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION        226
+#define SSL_R_SSL_HANDSHAKE_FAILURE                     227
+#define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS                228
+#define SSL_R_SSL_SESSION_ID_IS_DIFFERENT               229
+#define SSL_R_TLSV1_ALERT_ACCESS_DENIED                         1049
+#define SSL_R_TLSV1_ALERT_DECODE_ERROR                  1050
+#define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED             1021
+#define SSL_R_TLSV1_ALERT_DECRYPT_ERROR                         1051
+#define SSL_R_TLSV1_ALERT_EXPORT_RESTRICION             1060
+#define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY                 1071
+#define SSL_R_TLSV1_ALERT_INTERNAL_ERROR                1080
+#define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION              1100
+#define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION              1070
+#define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW               1022
+#define SSL_R_TLSV1_ALERT_UNKNOWN_CA                    1048
+#define SSL_R_TLSV1_ALERT_USER_CANCLED                  1090
+#define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER      230
+#define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 231
+#define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG   232
+#define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER           233
+#define SSL_R_UNABLE_TO_DECODE_DH_CERTS                         234
+#define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY              235
+#define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS              236
+#define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS      237
+#define SSL_R_UNABLE_TO_FIND_SSL_METHOD                         238
+#define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES          239
+#define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES          240
+#define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES                 241
+#define SSL_R_UNEXPECTED_MESSAGE                        242
+#define SSL_R_UNEXPECTED_RECORD                                 243
+#define SSL_R_UNKNOWN_ALERT_TYPE                        244
+#define SSL_R_UNKNOWN_CERTIFICATE_TYPE                  245
+#define SSL_R_UNKNOWN_CIPHER_RETURNED                   246
+#define SSL_R_UNKNOWN_CIPHER_TYPE                       247
+#define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE                         248
+#define SSL_R_UNKNOWN_PKEY_TYPE                                 249
+#define SSL_R_UNKNOWN_PROTOCOL                          250
+#define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE                         251
+#define SSL_R_UNKNOWN_SSL_VERSION                       252
+#define SSL_R_UNKNOWN_STATE                             253
+#define SSL_R_UNSUPPORTED_CIPHER                        254
+#define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM                 255
+#define SSL_R_UNSUPPORTED_PROTOCOL                      256
+#define SSL_R_UNSUPPORTED_SSL_VERSION                   257
+#define SSL_R_WRITE_BIO_NOT_SET                                 258
+#define SSL_R_WRONG_CIPHER_RETURNED                     259
+#define SSL_R_WRONG_MESSAGE_TYPE                        260
+#define SSL_R_WRONG_NUMBER_OF_KEY_BITS                  261
+#define SSL_R_WRONG_SIGNATURE_LENGTH                    262
+#define SSL_R_WRONG_SIGNATURE_SIZE                      263
+#define SSL_R_WRONG_SSL_VERSION                                 264
+#define SSL_R_WRONG_VERSION_NUMBER                      265
+#define SSL_R_X509_LIB                                  266
+#define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS          267
  
 #ifdef  __cplusplus
 }
index 95772eef60c18da616aa7aaa451b2a24c0d7a837..7c5c94d7c90789040e3caa939251934ccb6fcaaa 100644 (file)
@@ -208,7 +208,7 @@ typedef struct ssl3_record_st
 /*r */ unsigned int off;       /* read/write offset into 'buf' */
 /*rw*/ unsigned char *data;    /* pointer to the record data */
 /*rw*/ unsigned char *input;   /* where the decode bytes are */
-/*rw*/ unsigned char *comp;    /* only used with decompression */
+/*r */ unsigned char *comp;    /* only used with decompression - malloc()ed */
        } SSL3_RECORD;
 
 typedef struct ssl3_buffer_st
@@ -220,10 +220,6 @@ typedef struct ssl3_buffer_st
 /*rw*/ unsigned char *buf;     /* SSL3_RT_MAX_PACKET_SIZE bytes */
        } SSL3_BUFFER;
 
-typedef struct ssl3_compression_st {
-       int nothing;
-       } SSL3_COMPRESSION;
-
 #define SSL3_CT_RSA_SIGN                       1
 #define SSL3_CT_DSS_SIGN                       2
 #define SSL3_CT_RSA_FIXED_DH                   3
@@ -236,7 +232,7 @@ typedef struct ssl3_compression_st {
 #define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS      0x0001
 #define SSL3_FLAGS_DELAY_CLIENT_FINISHED       0x0002
 #define SSL3_FLAGS_POP_BUFFER                  0x0004
-#define        TLS1_FLAGS_TLS_PADDING_BUG              0x0008
+#define TLS1_FLAGS_TLS_PADDING_BUG             0x0008
 
 #if 0
 #define AD_CLOSE_NOTIFY                        0
@@ -344,7 +340,11 @@ typedef struct ssl3_ctx_st
 
                EVP_CIPHER *new_sym_enc;
                EVP_MD *new_hash;
-               SSL_COMPRESSION *new_compression;
+#ifdef HEADER_COMP_H
+               COMP_METHOD *new_compression;
+#else
+               char *new_compression;
+#endif
                int cert_request;
                } tmp;
        } SSL3_CTX;
index 65f3a593869aa0d4fc73b995ea8dd678ca332f9d..92ec322dae8b46eab03d36f2b4a9be07e27251be 100644 (file)
@@ -82,12 +82,12 @@ void SSLeay_add_ssl_algorithms()
 #endif
 #ifndef NO_MD5
        EVP_add_digest(EVP_md5());
-       EVP_add_alias(SN_md5,"ssl2-md5");
-       EVP_add_alias(SN_md5,"ssl3-md5");
+       EVP_add_digest_alias(SN_md5,"ssl2-md5");
+       EVP_add_digest_alias(SN_md5,"ssl3-md5");
 #endif
 #ifndef NO_SHA1
        EVP_add_digest(EVP_sha1()); /* RSA with sha1 */
-       EVP_add_alias(SN_sha1,"ssl3-sha1");
+       EVP_add_digest_alias(SN_sha1,"ssl3-sha1");
 #endif
 #if !defined(NO_SHA1) && !defined(NO_DSA)
        EVP_add_digest(EVP_dss1()); /* DSA with sha1 */
index c1cb86e1b7d5f6b5f0a545bc58260ddd84cdb310..783c079e172e7805d23922cd453acb2251b7c28f 100644 (file)
 #include "pem.h"
 #include "ssl_locl.h"
 
+int SSL_get_ex_data_X509_STORE_CTX_idx()
+       {
+       static int ssl_x509_store_ctx_idx= -1;
+
+       if (ssl_x509_store_ctx_idx < 0)
+               {
+               ssl_x509_store_ctx_idx=X509_STORE_CTX_get_ex_new_index(
+                       0,"SSL for verifiy callback",NULL,NULL,NULL);
+               }
+       return(ssl_x509_store_ctx_idx);
+       }
+
 CERT *ssl_cert_new()
        {
        CERT *ret;
@@ -150,15 +162,24 @@ STACK *sk;
 
        x=(X509 *)sk_value(sk,0);
        X509_STORE_CTX_init(&ctx,s->ctx->cert_store,x,sk);
-       X509_STORE_CTX_set_app_data(&ctx,(char *)s);
+       X509_STORE_CTX_set_ex_data(&ctx,SSL_get_ex_data_X509_STORE_CTX_idx(),
+               (char *)s);
 
        if (s->ctx->app_verify_callback != NULL)
                i=s->ctx->app_verify_callback(&ctx);
        else
+               {
+#ifndef NO_X509_VERIFY
                i=X509_verify_cert(&ctx);
+#else
+               i=0;
+               ctx.error=X509_V_ERR_APPLICATION_VERIFICATION;
+               SSLerr(SSL_F_SSL_VERIFY_CERT_CHAIN,SSL_R_NO_VERIFY_CALLBACK);
+#endif
+               }
 
-       X509_STORE_CTX_cleanup(&ctx);
        s->verify_result=ctx.error;
+       X509_STORE_CTX_cleanup(&ctx);
 
        return(i);
        }
index 820994408b37abaf14bd25d55f9acf0c74fe1c8b..87e384f8f745a2db632a62c20de247ad3fb032fe 100644 (file)
@@ -145,6 +145,7 @@ static SSL_CIPHER cipher_aliases[]={
        {0,SSL_TXT_EXPORT,0,SSL_EXPORT,0,SSL_EXP_MASK},
        {0,SSL_TXT_SSLV2,0,SSL_SSLV2,0,SSL_SSL_MASK},
        {0,SSL_TXT_SSLV3,0,SSL_SSLV3,0,SSL_SSL_MASK},
+       {0,SSL_TXT_TLSV1,0,SSL_SSLV3,0,SSL_SSL_MASK},
        {0,SSL_TXT_LOW,  0,SSL_LOW,0,SSL_STRONG_MASK},
        {0,SSL_TXT_MEDIUM,0,SSL_MEDIUM,0,SSL_STRONG_MASK},
        {0,SSL_TXT_HIGH, 0,SSL_HIGH,0,SSL_STRONG_MASK},
@@ -208,7 +209,6 @@ EVP_MD **md;
        case SSL_eNULL:
                i=SSL_ENC_NULL_IDX;
                break;
-               break;
        default:
                i= -1;
                break;
diff --git a/ssl/ssl_comp.c b/ssl/ssl_comp.c
new file mode 100644 (file)
index 0000000..7724ff5
--- /dev/null
@@ -0,0 +1,580 @@
+/* ssl/ssl_comp.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include "ssl_locl.h"
+
+#ifndef NOPROTO
+static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s);
+static void SSL_SESSION_list_add(SSL_CTX *ctx,SSL_SESSION *s);
+#else
+static void SSL_SESSION_list_remove();
+static void SSL_SESSION_list_add();
+#endif
+
+static int ssl_session_num=0;
+static STACK *ssl_session_meth=NULL;
+
+SSL_SESSION *SSL_get_session(ssl)
+SSL *ssl;
+       {
+       return(ssl->session);
+       }
+
+int SSL_SESSION_get_ex_new_index(argl,argp,new_func,dup_func,free_func)
+long argl;
+char *argp;
+int (*new_func)();
+int (*dup_func)();
+void (*free_func)();
+        {
+        ssl_session_num++;
+        return(CRYPTO_get_ex_new_index(ssl_session_num-1,
+               &ssl_session_meth,
+                argl,argp,new_func,dup_func,free_func));
+        }
+
+int SSL_SESSION_set_ex_data(s,idx,arg)
+SSL_SESSION *s;
+int idx;
+char *arg;
+       {
+       return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
+       }
+
+char *SSL_SESSION_get_ex_data(s,idx)
+SSL_SESSION *s;
+int idx;
+       {
+       return(CRYPTO_get_ex_data(&s->ex_data,idx));
+       }
+
+SSL_SESSION *SSL_SESSION_new()
+       {
+       SSL_SESSION *ss;
+
+       ss=(SSL_SESSION *)Malloc(sizeof(SSL_SESSION));
+       if (ss == NULL)
+               {
+               SSLerr(SSL_F_SSL_SESSION_NEW,ERR_R_MALLOC_FAILURE);
+               return(0);
+               }
+       memset(ss,0,sizeof(SSL_SESSION));
+
+       ss->references=1;
+       ss->timeout=60*5+4; /* 5 minute timeout by default */
+       ss->time=time(NULL);
+       ss->prev=NULL;
+       ss->next=NULL;
+       CRYPTO_new_ex_data(ssl_session_meth,(char *)ss,&ss->ex_data);
+       return(ss);
+       }
+
+int ssl_get_new_session(s, session)
+SSL *s;
+int session;
+       {
+       SSL_SESSION *ss=NULL;
+
+       if ((ss=SSL_SESSION_new()) == NULL) return(0);
+
+       /* If the context has a default timeout, use it */
+       if (s->ctx->session_timeout != 0)
+               ss->timeout=SSL_get_default_timeout(s);
+
+       if (s->session != NULL)
+               {
+               SSL_SESSION_free(s->session);
+               s->session=NULL;
+               }
+
+       if (session)
+               {
+               if (s->version == SSL2_CLIENT_VERSION)
+                       {
+                       ss->ssl_version=SSL2_VERSION;
+                       ss->session_id_length=SSL2_SSL_SESSION_ID_LENGTH;
+                       }
+               else if (s->version == SSL3_VERSION)
+                       {
+                       ss->ssl_version=SSL3_VERSION;
+                       ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH;
+                       }
+               else if (s->version == TLS1_VERSION)
+                       {
+                       ss->ssl_version=TLS1_VERSION;
+                       ss->session_id_length=SSL3_SSL_SESSION_ID_LENGTH;
+                       }
+               else
+                       {
+                       SSLerr(SSL_F_SSL_GET_NEW_SESSION,SSL_R_UNSUPPORTED_SSL_VERSION);
+                       SSL_SESSION_free(ss);
+                       return(0);
+                       }
+
+               for (;;)
+                       {
+                       SSL_SESSION *r;
+
+                       RAND_bytes(ss->session_id,ss->session_id_length);
+                       CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX);
+                       r=(SSL_SESSION *)lh_retrieve(s->ctx->sessions,
+                               (char *)ss);
+                       CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
+                       if (r == NULL) break;
+                       /* else - woops a session_id match */
+                       }
+               }
+       else
+               {
+               ss->session_id_length=0;
+               }
+
+       s->session=ss;
+       ss->ssl_version=s->version;
+
+       return(1);
+       }
+
+int ssl_get_prev_session(s,session_id,len)
+SSL *s;
+unsigned char *session_id;
+int len;
+       {
+       SSL_SESSION *ret=NULL,data;
+
+       /* conn_init();*/
+       data.ssl_version=s->version;
+       data.session_id_length=len;
+       if (len > SSL_MAX_SSL_SESSION_ID_LENGTH)
+               return(0);
+       memcpy(data.session_id,session_id,len);;
+
+       if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_NO_INTERNAL_LOOKUP))
+               {
+               CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX);
+               ret=(SSL_SESSION *)lh_retrieve(s->ctx->sessions,(char *)&data);
+               CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
+               }
+
+       if (ret == NULL)
+               {
+               int copy=1;
+
+               s->ctx->sess_miss++;
+               ret=NULL;
+               if ((s->ctx->get_session_cb != NULL) &&
+                       ((ret=s->ctx->get_session_cb(s,session_id,len,&copy))
+                               != NULL))
+                       {
+                       s->ctx->sess_cb_hit++;
+
+                       /* The following should not return 1, otherwise,
+                        * things are very strange */
+                       SSL_CTX_add_session(s->ctx,ret);
+                       /* auto free it */
+                       if (!copy)
+                               SSL_SESSION_free(ret);
+                       }
+               if (ret == NULL) return(0);
+               }
+
+       if (ret->cipher == NULL)
+               {
+               char buf[5],*p;
+               unsigned long l;
+
+               p=buf;
+               l=ret->cipher_id;
+               l2n(l,p);
+               if ((ret->ssl_version>>8) == SSL3_VERSION_MAJOR)
+                       ret->cipher=ssl_get_cipher_by_char(s,&(buf[2]));
+               else 
+                       ret->cipher=ssl_get_cipher_by_char(s,&(buf[1]));
+               if (ret->cipher == NULL)
+                       return(0);
+               }
+
+       /* If a thread got the session, then 'swaped', and another got
+        * it and then due to a time-out decided to 'Free' it we could
+        * be in trouble.  So I'll increment it now, then double decrement
+        * later - am I speaking rubbish?. */
+       CRYPTO_add(&ret->references,1,CRYPTO_LOCK_SSL_SESSION);
+
+       if ((long)(ret->time+ret->timeout) < (long)time(NULL)) /* timeout */
+               {
+               s->ctx->sess_timeout++;
+               /* remove it from the cache */
+               SSL_CTX_remove_session(s->ctx,ret);
+               SSL_SESSION_free(ret);          /* again to actually Free it */
+               return(0);
+               }
+
+       s->ctx->sess_hit++;
+
+       /* ret->time=time(NULL); */ /* rezero timeout? */
+       /* again, just leave the session 
+        * if it is the same session, we have just incremented and
+        * then decremented the reference count :-) */
+       if (s->session != NULL)
+               SSL_SESSION_free(s->session);
+       s->session=ret;
+       return(1);
+       }
+
+int SSL_CTX_add_session(ctx,c)
+SSL_CTX *ctx;
+SSL_SESSION *c;
+       {
+       int ret=0;
+       SSL_SESSION *s;
+
+       /* conn_init(); */
+       CRYPTO_add(&c->references,1,CRYPTO_LOCK_SSL_SESSION);
+
+       CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
+       s=(SSL_SESSION *)lh_insert(ctx->sessions,(char *)c);
+       
+       /* Put on the end of the queue unless it is already in the cache */
+       if (s == NULL)
+               SSL_SESSION_list_add(ctx,c);
+
+       /* If the same session if is being 're-added', Free the old
+        * one when the last person stops using it.
+        * This will also work if it is alread in the cache.
+        * The references will go up and then down :-) */
+       if (s != NULL)
+               {
+               SSL_SESSION_free(s);
+               ret=0;
+               }
+       else
+               {
+               ret=1;
+
+               if (SSL_CTX_sess_get_cache_size(ctx) > 0)
+                       {
+                       while (SSL_CTX_sess_number(ctx) >
+                               SSL_CTX_sess_get_cache_size(ctx))
+                               {
+                               if (!SSL_CTX_remove_session(ctx,
+                                       ctx->session_cache_tail))
+                                       break;
+                               else
+                                       ctx->sess_cache_full++;
+                               }
+                       }
+               }
+       CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
+       return(ret);
+       }
+
+int SSL_CTX_remove_session(ctx,c)
+SSL_CTX *ctx;
+SSL_SESSION *c;
+       {
+       SSL_SESSION *r;
+       int ret=0;
+
+       if ((c != NULL) && (c->session_id_length != 0))
+               {
+               CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
+               r=(SSL_SESSION *)lh_delete(ctx->sessions,(char *)c);
+               if (r != NULL)
+                       {
+                       ret=1;
+                       SSL_SESSION_list_remove(ctx,c);
+                       }
+
+               CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
+
+               if (ret)
+                       {
+                       r->not_resumable=1;
+                       if (ctx->remove_session_cb != NULL)
+                               ctx->remove_session_cb(ctx,r);
+                       SSL_SESSION_free(r);
+                       }
+               }
+       else
+               ret=0;
+       return(ret);
+       }
+
+void SSL_SESSION_free(ss)
+SSL_SESSION *ss;
+       {
+       int i;
+
+       i=CRYPTO_add(&ss->references,-1,CRYPTO_LOCK_SSL_SESSION);
+#ifdef REF_PRINT
+       REF_PRINT("SSL_SESSION",ss);
+#endif
+       if (i > 0) return;
+#ifdef REF_CHECK
+       if (i < 0)
+               {
+               fprintf(stderr,"SSL_SESSION_free, bad reference count\n");
+               abort(); /* ok */
+               }
+#endif
+
+       CRYPTO_free_ex_data(ssl_session_meth,(char *)ss,&ss->ex_data);
+
+       memset(ss->key_arg,0,SSL_MAX_KEY_ARG_LENGTH);
+       memset(ss->master_key,0,SSL_MAX_MASTER_KEY_LENGTH);
+       memset(ss->session_id,0,SSL_MAX_SSL_SESSION_ID_LENGTH);
+       if (ss->cert != NULL) ssl_cert_free(ss->cert);
+       if (ss->peer != NULL) X509_free(ss->peer);
+       if (ss->ciphers != NULL) sk_free(ss->ciphers);
+       memset(ss,0,sizeof(*ss));
+       Free(ss);
+       }
+
+int SSL_set_session(s, session)
+SSL *s;
+SSL_SESSION *session;
+       {
+       int ret=0;
+       SSL_METHOD *meth;
+
+       if (session != NULL)
+               {
+               meth=s->ctx->method->get_ssl_method(session->ssl_version);
+               if (meth == NULL)
+                       meth=s->method->get_ssl_method(session->ssl_version);
+               if (meth == NULL)
+                       {
+                       SSLerr(SSL_F_SSL_SET_SESSION,SSL_R_UNABLE_TO_FIND_SSL_METHOD);
+                       return(0);
+                       }
+
+               if (meth != s->method)
+                       {
+                       if (!SSL_set_ssl_method(s,meth))
+                               return(0);
+                       session->timeout=SSL_get_default_timeout(s);
+                       }
+
+               /* CRYPTO_w_lock(CRYPTO_LOCK_SSL);*/
+               CRYPTO_add(&session->references,1,CRYPTO_LOCK_SSL_SESSION);
+               if (s->session != NULL)
+                       SSL_SESSION_free(s->session);
+               s->session=session;
+               /* CRYPTO_w_unlock(CRYPTO_LOCK_SSL);*/
+               ret=1;
+               }
+       else
+               {
+               if (s->session != NULL)
+                       {
+                       SSL_SESSION_free(s->session);
+                       s->session=NULL;
+                       }
+               }
+       return(ret);
+       }
+
+long SSL_SESSION_set_timeout(s,t)
+SSL_SESSION *s;
+long t;
+       {
+       if (s == NULL) return(0);
+       s->timeout=t;
+       return(1);
+       }
+
+long SSL_SESSION_get_timeout(s)
+SSL_SESSION *s;
+       {
+       if (s == NULL) return(0);
+       return(s->timeout);
+       }
+
+long SSL_SESSION_get_time(s)
+SSL_SESSION *s;
+       {
+       if (s == NULL) return(0);
+       return(s->time);
+       }
+
+long SSL_SESSION_set_time(s,t)
+SSL_SESSION *s;
+long t;
+       {
+       if (s == NULL) return(0);
+       s->time=t;
+       return(t);
+       }
+
+typedef struct timeout_param_st
+       {
+       SSL_CTX *ctx;
+       long time;
+       LHASH *cache;
+       } TIMEOUT_PARAM;
+
+static void timeout(s,p)
+SSL_SESSION *s;
+TIMEOUT_PARAM *p;
+       {
+       if ((p->time == 0) || (p->time > (s->time+s->timeout))) /* timeout */
+               {
+               /* The reason we don't call SSL_CTX_remove_session() is to
+                * save on locking overhead */
+               lh_delete(p->cache,(char *)s);
+               SSL_SESSION_list_remove(p->ctx,s);
+               s->not_resumable=1;
+               if (p->ctx->remove_session_cb != NULL)
+                       p->ctx->remove_session_cb(p->ctx,s);
+               SSL_SESSION_free(s);
+               }
+       }
+
+void SSL_CTX_flush_sessions(s,t)
+SSL_CTX *s;
+long t;
+       {
+       unsigned long i;
+       TIMEOUT_PARAM tp;
+
+       tp.ctx=s;
+       tp.cache=SSL_CTX_sessions(s);
+       if (tp.cache == NULL) return;
+       tp.time=t;
+       CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
+       i=tp.cache->down_load;
+       tp.cache->down_load=0;
+       lh_doall_arg(tp.cache,(void (*)())timeout,(char *)&tp);
+       tp.cache->down_load=i;
+       CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
+       }
+
+int ssl_clear_bad_session(s)
+SSL *s;
+       {
+       if (    (s->session != NULL) &&
+               !(s->shutdown & SSL_SENT_SHUTDOWN) &&
+               !(SSL_in_init(s) || SSL_in_before(s)))
+               {
+               SSL_CTX_remove_session(s->ctx,s->session);
+               return(1);
+               }
+       else
+               return(0);
+       }
+
+/* locked by SSL_CTX in the calling function */
+static void SSL_SESSION_list_remove(ctx,s)
+SSL_CTX *ctx;
+SSL_SESSION *s;
+       {
+       if ((s->next == NULL) || (s->prev == NULL)) return;
+
+       if (s->next == (SSL_SESSION *)&(ctx->session_cache_tail))
+               { /* last element in list */
+               if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head))
+                       { /* only one element in list */
+                       ctx->session_cache_head=NULL;
+                       ctx->session_cache_tail=NULL;
+                       }
+               else
+                       {
+                       ctx->session_cache_tail=s->prev;
+                       s->prev->next=(SSL_SESSION *)&(ctx->session_cache_tail);
+                       }
+               }
+       else
+               {
+               if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head))
+                       { /* first element in list */
+                       ctx->session_cache_head=s->next;
+                       s->next->prev=(SSL_SESSION *)&(ctx->session_cache_head);
+                       }
+               else
+                       { /* middle of list */
+                       s->next->prev=s->prev;
+                       s->prev->next=s->next;
+                       }
+               }
+       s->prev=s->next=NULL;
+       }
+
+static void SSL_SESSION_list_add(ctx,s)
+SSL_CTX *ctx;
+SSL_SESSION *s;
+       {
+       if ((s->next != NULL) && (s->prev != NULL))
+               SSL_SESSION_list_remove(ctx,s);
+
+       if (ctx->session_cache_head == NULL)
+               {
+               ctx->session_cache_head=s;
+               ctx->session_cache_tail=s;
+               s->prev=(SSL_SESSION *)&(ctx->session_cache_head);
+               s->next=(SSL_SESSION *)&(ctx->session_cache_tail);
+               }
+       else
+               {
+               s->next=ctx->session_cache_head;
+               s->next->prev=s;
+               s->prev=(SSL_SESSION *)&(ctx->session_cache_head);
+               ctx->session_cache_head=s;
+               }
+       }
+
index bcbb98591f34e6240cac60d1455274d76c37419f..847f0f3f8a660261218ad61e771ea0636cfa3508 100644 (file)
@@ -167,6 +167,7 @@ static ERR_STRING_DATA SSL_str_functs[]=
 {ERR_PACK(0,SSL_F_SSL_USE_RSAPRIVATEKEY,0),    "SSL_use_RSAPrivateKey"},
 {ERR_PACK(0,SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1,0),       "SSL_use_RSAPrivateKey_ASN1"},
 {ERR_PACK(0,SSL_F_SSL_USE_RSAPRIVATEKEY_FILE,0),       "SSL_use_RSAPrivateKey_file"},
+{ERR_PACK(0,SSL_F_SSL_VERIFY_CERT_CHAIN,0),    "SSL_VERIFY_CERT_CHAIN"},
 {ERR_PACK(0,SSL_F_SSL_WRITE,0),        "SSL_write"},
 {ERR_PACK(0,SSL_F_TLS1_CHANGE_CIPHER_STATE,0), "TLS1_CHANGE_CIPHER_STATE"},
 {ERR_PACK(0,SSL_F_TLS1_ENC,0), "TLS1_ENC"},
@@ -219,6 +220,7 @@ static ERR_STRING_DATA SSL_str_reasons[]=
 {SSL_R_CIPHER_TABLE_SRC_ERROR            ,"cipher table src error"},
 {SSL_R_COMPRESSED_LENGTH_TOO_LONG        ,"compressed length too long"},
 {SSL_R_COMPRESSION_FAILURE               ,"compression failure"},
+{SSL_R_COMPRESSION_LIBRARY_ERROR         ,"compression library error"},
 {SSL_R_CONNECTION_ID_IS_DIFFERENT        ,"connection id is different"},
 {SSL_R_CONNECTION_TYPE_NOT_SET           ,"connection type not set"},
 {SSL_R_DATA_BETWEEN_CCS_AND_FINISHED     ,"data between ccs and finished"},
@@ -269,6 +271,7 @@ static ERR_STRING_DATA SSL_str_reasons[]=
 {SSL_R_NO_PROTOCOLS_AVAILABLE            ,"no protocols available"},
 {SSL_R_NO_PUBLICKEY                      ,"no publickey"},
 {SSL_R_NO_SHARED_CIPHER                  ,"no shared cipher"},
+{SSL_R_NO_VERIFY_CALLBACK                ,"no verify callback"},
 {SSL_R_NULL_SSL_CTX                      ,"null ssl ctx"},
 {SSL_R_NULL_SSL_METHOD_PASSED            ,"null ssl method passed"},
 {SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED   ,"old session cipher not returned"},
@@ -316,6 +319,18 @@ static ERR_STRING_DATA SSL_str_reasons[]=
 {SSL_R_SSL_HANDSHAKE_FAILURE             ,"ssl handshake failure"},
 {SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS        ,"ssl library has no ciphers"},
 {SSL_R_SSL_SESSION_ID_IS_DIFFERENT       ,"ssl session id is different"},
+{SSL_R_TLSV1_ALERT_ACCESS_DENIED         ,"tlsv1 alert access denied"},
+{SSL_R_TLSV1_ALERT_DECODE_ERROR          ,"tlsv1 alert decode error"},
+{SSL_R_TLSV1_ALERT_DECRYPTION_FAILED     ,"tlsv1 alert decryption failed"},
+{SSL_R_TLSV1_ALERT_DECRYPT_ERROR         ,"tlsv1 alert decrypt error"},
+{SSL_R_TLSV1_ALERT_EXPORT_RESTRICION     ,"tlsv1 alert export restricion"},
+{SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY ,"tlsv1 alert insufficient security"},
+{SSL_R_TLSV1_ALERT_INTERNAL_ERROR        ,"tlsv1 alert internal error"},
+{SSL_R_TLSV1_ALERT_NO_RENEGOTIATION      ,"tlsv1 alert no renegotiation"},
+{SSL_R_TLSV1_ALERT_PROTOCOL_VERSION      ,"tlsv1 alert protocol version"},
+{SSL_R_TLSV1_ALERT_RECORD_OVERFLOW       ,"tlsv1 alert record overflow"},
+{SSL_R_TLSV1_ALERT_UNKNOWN_CA            ,"tlsv1 alert unknown ca"},
+{SSL_R_TLSV1_ALERT_USER_CANCLED          ,"tlsv1 alert user cancled"},
 {SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER,"tls client cert req with anon cipher"},
 {SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST,"tls peer did not respond with certificate list"},
 {SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG,"tls rsa encrypted value length is wrong"},
@@ -353,6 +368,7 @@ static ERR_STRING_DATA SSL_str_reasons[]=
 {SSL_R_WRONG_SSL_VERSION                 ,"wrong ssl version"},
 {SSL_R_WRONG_VERSION_NUMBER              ,"wrong version number"},
 {SSL_R_X509_LIB                          ,"x509 lib"},
+{SSL_R_X509_VERIFICATION_SETUP_PROBLEMS  ,"x509 verification setup problems"},
 {0,NULL},
        };
 
@@ -362,8 +378,8 @@ void ERR_load_SSL_strings()
        {
        static int init=1;
 
-       if (init);
-               {;
+       if (init)
+               {
                init=0;
 #ifndef NO_ERR
                ERR_load_strings(ERR_LIB_SSL,SSL_str_functs);
index f562ec6b14d49ddd5ee3b85544483993d79f8004..b16339848b275a8da1eed1692af909d2983373c0 100644 (file)
@@ -61,7 +61,7 @@
 #include "lhash.h"
 #include "ssl_locl.h"
 
-char *SSL_version_str="SSLeay 0.9.0b 29-Jun-1998";
+char *SSL_version_str="SSLeay 0.9.1a 06-Jul-1998";
 
 static STACK *ssl_meth=NULL;
 static STACK *ssl_ctx_meth=NULL;
@@ -248,6 +248,11 @@ SSL *s;
 
        ssl_clear_cipher_ctx(s);
 
+       if (s->expand != NULL)
+               COMP_CTX_free(s->expand);
+       if (s->compress != NULL)
+               COMP_CTX_free(s->compress);
+
        if (s->cert != NULL) ssl_cert_free(s->cert);
        /* Free up if allocated */
 
@@ -839,8 +844,11 @@ SSL_SESSION *a;
        {
        unsigned long l;
 
-       l=      (a->session_id[0]     )|(a->session_id[1]<< 8L)|
-               (a->session_id[2]<<16L)|(a->session_id[3]<<24L);
+       l=(unsigned long)
+               ((unsigned int) a->session_id[0]     )|
+               ((unsigned int) a->session_id[1]<< 8L)|
+               ((unsigned long)a->session_id[2]<<16L)|
+               ((unsigned long)a->session_id[3]<<24L);
        return(l);
        }
 
@@ -858,13 +866,19 @@ SSL_SESSION *b;
 SSL_CTX *SSL_CTX_new(meth)
 SSL_METHOD *meth;
        {
-       SSL_CTX *ret;
+       SSL_CTX *ret=NULL;
        
        if (meth == NULL)
                {
                SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED);
                return(NULL);
                }
+
+       if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0)
+               {
+               SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS);
+               goto err;
+               }
        ret=(SSL_CTX *)Malloc(sizeof(SSL_CTX));
        if (ret == NULL)
                goto err;
@@ -956,6 +970,8 @@ SSL_METHOD *meth;
 
        CRYPTO_new_ex_data(ssl_ctx_meth,(char *)ret,&ret->ex_data);
 
+       ret->extra_certs=NULL;
+
        return(ret);
 err:
        SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE);
@@ -1000,6 +1016,8 @@ SSL_CTX *a;
                ssl_cert_free(a->default_cert);
        if (a->client_CA != NULL)
                sk_pop_free(a->client_CA,X509_NAME_free);
+       if (a->extra_certs != NULL)
+               sk_pop_free(a->extra_certs,X509_free);
        Free((char *)a);
        }
 
@@ -1341,7 +1359,9 @@ SSL *s;
                SSLerr(SSL_F_SSL_DO_HANDSHAKE,SSL_R_CONNECTION_TYPE_NOT_SET);
                return(-1);
                }
-       if (s->s3->renegotiate) ssl3_renegotiate_check(s);
+
+       s->method->ssl_renegotiate_check(s);
+
        if (SSL_in_init(s) || SSL_in_before(s))
                {
                ret=s->handshake_func(s);
@@ -1615,6 +1635,7 @@ SSL *ssl;
        return(ssl->ctx);
        }
 
+#ifndef NO_STDIO
 int SSL_CTX_set_default_verify_paths(ctx)
 SSL_CTX *ctx;
        {
@@ -1628,6 +1649,7 @@ char *CApath;
        {
        return(X509_STORE_load_locations(ctx->cert_store,CAfile,CApath));
        }
+#endif
 
 void SSL_set_info_callback(ssl,cb)
 SSL *ssl;
@@ -1639,7 +1661,7 @@ void (*cb)();
 void (*SSL_get_info_callback(ssl))()
 SSL *ssl;
        {
-       return(ssl->info_callback);
+       return((void (*)())ssl->info_callback);
        }
 
 int SSL_state(ssl)
@@ -1715,6 +1737,12 @@ int idx;
        return(CRYPTO_get_ex_data(&s->ex_data,idx));
        }
 
+int ssl_ok(s)
+SSL *s;
+       {
+       return(1);
+       }
+
 #if defined(_WINDLL) && defined(WIN16)
 #include "../crypto/bio/bss_file.c"
 #endif
index b29517081bc3b6d3c91ffd93ee59dc74819ffb84..71d4c08c09fd54f4b1fd0849616f90509d49b46a 100644 (file)
@@ -66,6 +66,7 @@
 #include "e_os.h"
 
 #include "buffer.h"
+#include "comp.h"
 #include "bio.h"
 #include "crypto.h"
 #include "evp.h"
@@ -74,6 +75,7 @@
 #include "err.h"
 #include "ssl.h"
 
+#define PKCS1_CHECK
 
 #define c2l(c,l)       (l = ((unsigned long)(*((c)++)))     , \
                         l|=(((unsigned long)(*((c)++)))<< 8), \
                                } \
                        }
 
-#define n2s(c,s)       (s =((unsigned int)(*((c)++)))<< 8, \
-                        s|=((unsigned int)(*((c)++))))
-#define s2n(s,c)       (*((c)++)=(unsigned char)(((s)>> 8)&0xff), \
-                        *((c)++)=(unsigned char)(((s)    )&0xff))
+#define n2s(c,s)       ((s=(((unsigned int)(c[0]))<< 8)| \
+                           (((unsigned int)(c[1]))    )),c+=2)
+#define s2n(s,c)       ((c[0]=(unsigned char)(((s)>> 8)&0xff), \
+                         c[1]=(unsigned char)(((s)    )&0xff)),c+=2)
 
-#define n2l3(c,l)      (l =((unsigned long)(*((c)++)))<<16, \
-                        l|=((unsigned long)(*((c)++)))<< 8, \
-                        l|=((unsigned long)(*((c)++))))
+#define n2l3(c,l)      ((l =(((unsigned long)(c[0]))<<16)| \
+                            (((unsigned long)(c[1]))<< 8)| \
+                            (((unsigned long)(c[2]))    )),c+=3)
 
-#define l2n3(l,c)      (*((c)++)=(unsigned char)(((l)>>16)&0xff), \
-                        *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
-                        *((c)++)=(unsigned char)(((l)    )&0xff))
+#define l2n3(l,c)      ((c[0]=(unsigned char)(((l)>>16)&0xff), \
+                         c[1]=(unsigned char)(((l)>> 8)&0xff), \
+                         c[2]=(unsigned char)(((l)    )&0xff)),c+=3)
 
 /* LOCAL STUFF */
 
@@ -313,6 +315,14 @@ typedef struct ssl3_enc_method
        int (*alert_value)();
        } SSL3_ENC_METHOD;
 
+/* Used for holding the relevent compression methods loaded into SSL_CTX */
+typedef struct ssl3_comp_st
+       {
+       int comp_id;    /* The identifer byte for this compression type */
+       char *name;     /* Text name used for the compression type */
+       COMP_METHOD *method; /* The method :-) */
+       } SSL3_COMP;
+
 extern SSL3_ENC_METHOD ssl3_undef_enc_method;
 extern SSL_CIPHER ssl2_ciphers[];
 extern SSL_CIPHER ssl3_ciphers[];
@@ -431,7 +441,6 @@ void tls1_clear(SSL *s);
 long tls1_ctrl(SSL *s,int cmd, long larg, char *parg);
 SSL_METHOD *tlsv1_base_method(void );
 
-
 int ssl_init_wbio_buffer(SSL *s, int push);
 
 int tls1_change_cipher_state(SSL *s, int which);
@@ -445,6 +454,7 @@ int tls1_generate_master_secret(SSL *s, unsigned char *out,
        unsigned char *p, int len);
 int tls1_alert_code(int code);
 int ssl3_alert_code(int code);
+int ssl_ok(SSL *s);
 
 
 #else
@@ -556,3 +566,19 @@ int ssl_init_wbio_buffer();
 #endif
 
 #endif
+int ssl3_cert_verify_mac();
+int ssl3_alert_code();
+int tls1_new();
+void tls1_free();
+void tls1_clear();
+long tls1_ctrl();
+SSL_METHOD *tlsv1_base_method();
+int tls1_change_cipher_state();
+int tls1_setup_key_block();
+int tls1_enc();
+int tls1_final_finish_mac();
+int tls1_cert_verify_mac();
+int tls1_mac();
+int tls1_generate_master_secret();
+int tls1_alert_code();
+int ssl_ok();
index 140475e5fbdeb83ca1dd07c2991637d30532c748..a8a62f1b04004b1ef87553cb93380930fde4b2b6 100644 (file)
@@ -229,6 +229,10 @@ EVP_PKEY *pkey;
 
        if (c->pkeys[i].x509 != NULL)
                {
+               EVP_PKEY_copy_parameters(
+                       X509_get_pubkey(c->pkeys[i].x509),pkey);
+               ERR_clear_error();
+
 #ifndef NO_RSA
                /* Don't check the public/private key, this is mostly
                 * for smart cards. */
@@ -503,6 +507,19 @@ X509 *x;
                }
 
        if (c->pkeys[i].privatekey != NULL)
+               {
+               EVP_PKEY_copy_parameters(pkey,c->pkeys[i].privatekey);
+               ERR_clear_error();
+
+#ifndef NO_RSA
+               /* Don't check the public/private key, this is mostly
+                * for smart cards. */
+               if ((c->pkeys[i].privatekey->type == EVP_PKEY_RSA) &&
+                       (RSA_flags(c->pkeys[i].privatekey->pkey.rsa) &
+                        RSA_METHOD_FLAG_NO_CHECK))
+                        ok=1;
+               else
+#endif
                {
                if (!X509_check_private_key(x,c->pkeys[i].privatekey))
                        {
@@ -527,6 +544,7 @@ X509 *x;
                        }
                else
                        ok=1;
+               } /* NO_RSA */
                }
        else
                ok=1;
index 8212600e408d94662b9155d46c4f7b6762c732ea..d4978a7d50a29a4c711827ab372212e1b40fa31e 100644 (file)
@@ -69,7 +69,7 @@ static void SSL_SESSION_list_remove();
 static void SSL_SESSION_list_add();
 #endif
 
-static ssl_session_num=0;
+static int ssl_session_num=0;
 static STACK *ssl_session_meth=NULL;
 
 SSL_SESSION *SSL_get_session(ssl)
index f9dca4e3ef7f2ba6caac9a66ba6f7698f5378a8c..ff686913d72022af6f45a53315324d33caa3d74f 100644 (file)
@@ -361,6 +361,7 @@ end:
 
        if (bio_stdout != NULL) BIO_free(bio_stdout);
 
+       ERR_free_strings();
        ERR_remove_state(0);
        EVP_cleanup();
        CRYPTO_mem_leaks(bio_err);
index fbdd3bffb52f113132a46d4d692e01a48b413340..893c0bc73bf246e3d3aca16a0923fab6d8a811db 100644 (file)
@@ -155,7 +155,7 @@ int num;
        memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
        p+=SSL3_RANDOM_SIZE;
 
-       tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,p-buf,
+       tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,(int)(p-buf),
                s->session->master_key,s->session->master_key_length,
                km,tmp,num);
        }
@@ -175,7 +175,7 @@ int which;
        int client_write;
        EVP_CIPHER_CTX *dd;
        EVP_CIPHER *c;
-       SSL_COMPRESSION *comp;
+       COMP_METHOD *comp;
        EVP_MD *m;
        int exp,n,i,j,k,exp_label_len;
 
@@ -193,7 +193,24 @@ int which;
                        goto err;
                dd= s->enc_read_ctx;
                s->read_hash=m;
-               s->read_compression=comp;
+               if (s->expand != NULL)
+                       {
+                       COMP_CTX_free(s->expand);
+                       s->expand=NULL;
+                       }
+               if (comp != NULL)
+                       {
+                       s->expand=COMP_CTX_new(comp);
+                       if (s->expand == NULL)
+                               {
+                               SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
+                               goto err2;
+                               }
+                       s->s3->rrec.comp=(unsigned char *)
+                               Malloc(SSL3_RT_MAX_ENCRYPTED_LENGTH);
+                       if (s->s3->rrec.comp == NULL)
+                               goto err;
+                       }
                memset(&(s->s3->read_sequence[0]),0,8);
                mac_secret= &(s->s3->read_mac_secret[0]);
                }
@@ -205,7 +222,20 @@ int which;
                        goto err;
                dd= s->enc_write_ctx;
                s->write_hash=m;
-               s->write_compression=comp;
+               if (s->compress != NULL)
+                       {
+                       COMP_CTX_free(s->compress);
+                       s->compress=NULL;
+                       }
+               if (comp != NULL)
+                       {
+                       s->compress=COMP_CTX_new(comp);
+                       if (s->compress == NULL)
+                               {
+                               SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
+                               goto err2;
+                               }
+                       }
                memset(&(s->s3->write_sequence[0]),0,8);
                mac_secret= &(s->s3->write_mac_secret[0]);
                }
@@ -262,7 +292,7 @@ printf("which = %04X\nmac key=",which);
                p+=SSL3_RANDOM_SIZE;
                memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
                p+=SSL3_RANDOM_SIZE;
-               tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,p-buf,key,j,
+               tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,(int)(p-buf),key,j,
                        tmp1,tmp2,EVP_CIPHER_key_length(c));
                key=tmp1;
 
@@ -277,7 +307,7 @@ printf("which = %04X\nmac key=",which);
                        memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
                        p+=SSL3_RANDOM_SIZE;
                        tls1_PRF(s->ctx->md5,s->ctx->sha1,
-                               buf,p-buf,"",0,iv1,iv2,k*2);
+                               buf,(int)(p-buf),"",0,iv1,iv2,k*2);
                        if (client_write)
                                iv=iv1;
                        else
@@ -374,7 +404,6 @@ int send;
        unsigned long l;
        int bs,i,ii,j,k,n=0;
        EVP_CIPHER *enc;
-       SSL_COMPRESSION *comp;
 
        if (send)
                {
@@ -383,12 +412,9 @@ int send;
                ds=s->enc_write_ctx;
                rec= &(s->s3->wrec);
                if (s->enc_write_ctx == NULL)
-                       { enc=NULL; comp=NULL; }
+                       enc=NULL;
                else
-                       {
                        enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
-                       comp=s->write_compression;
-                       }
                }
        else
                {
@@ -397,16 +423,13 @@ int send;
                ds=s->enc_read_ctx;
                rec= &(s->s3->rrec);
                if (s->enc_read_ctx == NULL)
-                       { enc=NULL; comp=NULL; }
+                       enc=NULL;
                else
-                       {
                        enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
-                       comp=s->read_compression;
-                       }
                }
 
        if ((s->session == NULL) || (ds == NULL) ||
-               ((enc == NULL) && (comp == NULL)))
+               (enc == NULL))
                {
                memcpy(rec->data,rec->input,rec->length);
                rec->input=rec->data;
@@ -507,7 +530,7 @@ unsigned char *out;
        EVP_DigestFinal(&ctx,q,&i);
        q+=i;
 
-       tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,q-buf,
+       tls1_PRF(s->ctx->md5,s->ctx->sha1,buf,(int)(q-buf),
                s->session->master_key,s->session->master_key_length,
                out,buf2,12);
        memset(&ctx,0,sizeof(EVP_MD_CTX));
@@ -560,20 +583,20 @@ int send;
 
 #ifdef TLS_DEBUG
 printf("sec=");
-{int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); }
+{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); }
 printf("seq=");
 {int z; for (z=0; z<8; z++) printf("%02X ",seq[z]); printf("\n"); }
 printf("buf=");
 {int z; for (z=0; z<5; z++) printf("%02X ",buf[z]); printf("\n"); }
 printf("rec=");
-{int z; for (z=0; z<rec->length; z++) printf("%02X ",buf[z]); printf("\n"); }
+{unsigned int z; for (z=0; z<rec->length; z++) printf("%02X ",buf[z]); printf("\n"); }
 #endif
 
        for (i=7; i>=0; i--)
                if (++seq[i]) break; 
 
 #ifdef TLS_DEBUG
-{int z; for (z=0; z<md_size; z++) printf("%02X ",md[z]); printf("\n"); }
+{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",md[z]); printf("\n"); }
 #endif
        return(md_size);
        }
index f9fbfa414c8b7f3653ff0765ae0bc48c4c5444f3..2a319cd09b398ca39d27f4c84fbec28bc6c0ffce 100644 (file)
@@ -60,7 +60,7 @@
 #include "objects.h"
 #include "ssl_locl.h"
 
-char *tls1_version_str="TLSv1 part of SSLeay 0.9.0b 29-Jun-1998";
+char *tls1_version_str="TLSv1 part of SSLeay 0.9.1a 06-Jul-1998";
 
 #ifndef NO_PROTO
 static long tls1_default_timeout(void);
@@ -94,6 +94,7 @@ static SSL_METHOD TLSv1_data= {
        ssl3_write,
        ssl3_shutdown,
        ssl3_renegotiate,
+       ssl3_renegotiate_check,
        ssl3_ctrl,
        ssl3_ctx_ctrl,
        ssl3_get_cipher_by_char,
index b3de76751e1567d95a7a0db1d21b17cbf1dd69b9..e57acd76b0a3e492c3569af58e9ac50c06a46298 100644 (file)
@@ -102,7 +102,7 @@ apps:
        @(cd ../apps; $(MAKE)  CC='${CC}' CFLAG='${CFLAG}' INSTALLTOP='${INSTALLTOP}' PEX_LIBS='${PEX_LIBS}' EX_LIBS='${EX_LIBS}' all)
 
 test_des:
-       #./$(DESTEST)
+       ./$(DESTEST)
 
 test_idea:
        ./$(IDEATEST)
index 2bbd69c2e548374bb9a87e06a2cfe52136f28465..3ad5abd03aea89f7de126c4861363e4f64355973 100644 (file)
@@ -1 +1 @@
-70
+99
diff --git a/test/f b/test/f
new file mode 100644 (file)
index 0000000..4a71d9d
--- /dev/null
+++ b/test/f
@@ -0,0 +1,650 @@
+obase=16
+ibase=16
+9826C5263D673FC458F4C7FCDD609978 + 1EFBECC603C43CFE028AAF5D63AAB8 - 45C113036B040156F752AC3AC44430
+9826C5263D673FC458F4C7FCDD609978 + -CCEC172481D6DD51DFE18A4ED17182 - B759D90F18E568E70714E6728E8F27F6
+-9826C5263D673FC458F4C7FCDD609978 + 124BB42FAEA42A6D89A334E249C80C - -F71479720DB89B99EB6B24C7FB16D16C
+-9826C5263D673FC458F4C7FCDD609978 + -3D57C8E2E4255CA90A248D4D353C56 - -F7641CEF204B652101FEEC8A2A95D5CE
+9826C5263D673FC458F4C7FCDD609978 + C980C21CA60D481316D3977687025A - F7F045E85A0D4D0C6C0B9B9453E79BD2
+9826C5263D673FC458F4C7FCDD609978 + -40DB1703297959B645DF087C0B4B32 - 54E5EA0F3A3DC66AA2AEE8F461554E46
+-9826C5263D673FC458F4C7FCDD609978 + B64AD8441BB310BFA54545427ECEE6 - -A707A4DF94B8CB3994F82B79AE1CA92
+-9826C5263D673FC458F4C7FCDD609978 + -3B5CE56D5AA68F43565E4CF43325E4 - -A62220BAAC1E6539C4B2649D193BF5C
+9826C5263D673FC458F4C7FCDD609978 + B242A3654666ADF7C4CA38086E7D8A - AD907C9A2ADA67250B99234E5CF1702
+9826C5263D673FC458F4C7FCDD609978 + -801CFBAC244F6EBBC602C541DCAA93 - AA6A82A9142F0559D2EC5379B83EEE5
+-9826C5263D673FC458F4C7FCDD609978 + ACF681C282DFF37079230A3C1C8149 - -C979CEA47AE45FD0E87BA4F2A144182F
+-9826C5263D673FC458F4C7FCDD609978 + -ADC66D22EFC695963FF79CC7E8E40E - -C9D48B9360570659EF34BF99A5497D86
+9826C5263D673FC458F4C7FCDD609978 + 8AF5EE46381D503D968585374A52F3 - C9B1BB14839F5D14968B4D8214AAEC6B
+9826C5263D673FC458F4C7FCDD609978 + -9FDFDCBF678814119B15810A44C008 - 8F86E5497DFFB7B04759B27BD31BD970
+-9826C5263D673FC458F4C7FCDD609978 + 37FF9F6EA44353D2CA41DF1CB3577F - -6DEEC586CEC2FC70862A861DC0AD41F9
+-9826C5263D673FC458F4C7FCDD609978 + -69FD6C2A32D47CFE65FC9445545B7A - -6D90C292679A1441575AC49122B4F4F2
+9826C5263D673FC458F4C7FCDD609978 + 83287A03BFDEED8F0C7898F102EA08 - 6DA9EDA041271EB1E8014095CE638380
+9826C5263D673FC458F4C7FCDD609978 + -6900A861D776769BAC8B361AE22672 - 75BDC47DDB8FC94DBD483CC6C27E7306
+-9826C5263D673FC458F4C7FCDD609978 + 37A402D61F12C4157AA635E44AA67F - -F8EF212367482D00437A21C6F915F2F9
+-9826C5263D673FC458F4C7FCDD609978 + -A01F36CECF71C5CA45C95C75784ED1 - -F8C6E45D0C36B18A233A915952D8E849
+9826C5263D673FC458F4C7FCDD609978 + 479573FA448EEB2774A82B6CF400D6 - F86E5A9A37ABCEAF806970284A549A4E
+9826C5263D673FC458F4C7FCDD609978 + -2785A0B83CC00588C867CE79034586 - 1BFF3F85852A7FBED02C602E645D53F2
+-9826C5263D673FC458F4C7FCDD609978 + 33CA31FEE78291529EC1241B6C8885 - -7EF2FAF43E7FBD33065606D8C1F410F3
+-9826C5263D673FC458F4C7FCDD609978 + -5C0DE72FE65BD58D178F4D7D02EE22 - -7E82D30D6D4D9B99E60C574A5A63879A
+9826C5263D673FC458F4C7FCDD609978 + 9EF680BD7F42642C1E9D82D4264ED5 - 7EC5BBA6FAE682288513657FB186E84D
+9826C5263D673FC458F4C7FCDD609978 + -8C554B371AC0D838CE1CC1F3032634 - 439A6FDB064C7EEC2026AB3AEA5D7344
+-9826C5263D673FC458F4C7FCDD609978 + D5A16F7FA9FC23E2613A8F08E77218 - -B55123B6BDBD43A076938D6DD4792760
+-9826C5263D673FC458F4C7FCDD609978 + -2B45D0490E5D9A7328D4B4B440DE25 - -B5520AF686759D5ECC1D9CB191A1779D
+9826C5263D673FC458F4C7FCDD609978 + 24932AFE5F979B2AF6BC0FFB17951D - B54B58513BC6D75F83EB840CD8782E95
+9826C5263D673FC458F4C7FCDD609978 + -A9DB04EEC99DA84E633428B6BB5A1A - 6F7CEA214E9DA21C0A9193D426A53F5E
+-9826C5263D673FC458F4C7FCDD609978 + 1E3C33D6C0C44BD502669076EA2483 - -90888F266A67B7883F2616C667674F5
+-9826C5263D673FC458F4C7FCDD609978 + -BF4093ED1592B8E49CF24A5660201F3B - -8C5767591352F9F8A8F5E712533D80B8B3
+9826C5263D673FC458F4C7FCDD609978 + 9A1FBD7B5EDB5ECF9D98C2786CDE1959 - 8C324682A19C429E93F68D8A754A3EB2D1
+9826C5263D673FC458F4C7FCDD609978 + -D397B30D5FEA9EB1B237AFDDC9EED09F - C48F1218DD7CA112A6BD181F1371C8D9
+-9826C5263D673FC458F4C7FCDD609978 + 80A3742BAA566FBA06EB908D903ED0C - -901C8DE382C1D8C8B8860EF4045CAC6C
+-9826C5263D673FC458F4C7FCDD609978 + -9FE1F7BF67385C7ABA30F4C9255B8E06 - -F93808BCE5A49F9C3F1325BCC602BC277E
+9826C5263D673FC458F4C7FCDD609978 + EE970A929A44DC9D791D3361B53AFBCF - F986BDCFB8D7AC1C61D211FB5E929B9547
+9826C5263D673FC458F4C7FCDD609978 + -73159D913330A022D3C6C06AEDE144FB - 251127950A369FA1852E0791EF7F547D
+-9826C5263D673FC458F4C7FCDD609978 + 31C06268B0B083DE26255DA8F4CB0A65 - -666662BD8CB6BBE632CF6A53E8958F13
+-9826C5263D673FC458F4C7FCDD609978 + -E7ECB2BFD88D75360585BB493A094066 - -1B801377E615F4B4FA5E7A83461769D9DE
+9826C5263D673FC458F4C7FCDD609978 + DDC3C67D593FADCF60CCBA8B42EB735C - 1B75EA8BA396A6ED93B9C18288204C0CD4
+9826C5263D673FC458F4C7FCDD609978 + -3CA901A975E808221A042C3839063953 - 5B7DC37CC77F37A23EF09BC4A45A6025
+-9826C5263D673FC458F4C7FCDD609978 + 7EA9A259C72DA04100A1BE9B88ABE678 - -197D22CC76399F835853096154B4B300
+-9826C5263D673FC458F4C7FCDD609978 + -2393770B6D725A3088927E622D73BDE3 - -BBBA3C31AAD999F4E187465F0AD4575B
+9826C5263D673FC458F4C7FCDD609978 + 158F49DF9277EFE679D9B77D40901E3B - ADB60F05CFDF2FAAD2CE7F7A1DF0B7B3
+9826C5263D673FC458F4C7FCDD609978 + -1D2F56AB08958F12BF878ECE443C5809 - 7AF76E7B34D1B0B1996D392E9924416F
+-9826C5263D673FC458F4C7FCDD609978 + 90EDF7889B5B468C0EE1EF42915E33C5 - -738CD9DA20BF9384A12D8BA4C0265B3
+-9826C5263D673FC458F4C7FCDD609978 + -3958E80086C80516E8D8AC1C3B042CAB - -D17FAD26C42F44DB41CD74191864C623
+9826C5263D673FC458F4C7FCDD609978 + 709E54DAED225D25669E7BC8F83E0B4F - 2708C51A012A899CE9BF9343C5D59EA4C7
+9826C5263D673FC458F4C7FCDD609978 + -252715300F4CF4174F0C47DF17A676FA - 72FFAFF62E1A4BAD09E8801DC5BA227E
+-9826C5263D673FC458F4C7FCDD609978 + 65AB5C3458AB6B39C287D43EA597E34 - -91CC0F62F7DC8910BCCC4AB8F3071B44
+-9826C5263D673FC458F4C7FCDD609978 + -A4C71A07486020CB60500921E0F8ECAF - -503CEDDF2D85C7608FB944D11EBE598627
+9826C5263D673FC458F4C7FCDD609978 + 63FB6DB574AA58E92BC0B713821B7226 - FC2232DBB21198AD84B57F105F7C0B9E
+9826C5263D673FC458F4C7FCDD609978 + -98B6ED60F48A64385CC6B431DFFC685 - 8E9B56502E1E9980D3285CB9BF60D2F3
+-9826C5263D673FC458F4C7FCDD609978 + 340B4FCCBE94164D2CE9C39D6291040B - -641B75597ED329772C0B045F7ACF956D
+-9826C5263D673FC458F4C7FCDD609978 + -C2374D70BF61A3A3C2FABBD2E1ED6A81 - -EA5A5E1296FCC8E3681BEF83CFBF4E03F9
+9826C5263D673FC458F4C7FCDD609978 + 9D7A8C572CF1BCCE933236510D50383E - EA35A1517D6A58FC92EC26FE4DEAB0D1B6
+9826C5263D673FC458F4C7FCDD609978 + -4FB6E0CA17848699DFA0957BD6324833 - 486FE45C25E2B92A79543281072E5145
+-9826C5263D673FC458F4C7FCDD609978 + 1C4B8D33C08EC911BC0A3B530312D09A - -7BDB37F27CD876B29CEA8CA9DA4DC8DE
+-9826C5263D673FC458F4C7FCDD609978 + -14C733B1FDFB91ADB66F37978860E73B - -ACEDF8D83B62D1720F63FF9465C180B3
+9826C5263D673FC458F4C7FCDD609978 + 1AD4F4F805DAF4713FB09B7028193E7C - B2FBBA1E4342343598A5636D0579D7F4
+9826C5263D673FC458F4C7FCDD609978 + -9EFFA570C6C692D419F650047C998881 - F9271FB576A0ACF03EFE77F860C710F7
+-9826C5263D673FC458F4C7FCDD609978 + D827D7AC7B632AA234DCAF1DFA4B9BCA - 400112863DFBEADDDBE7E7211CEB0252
+-9826C5263D673FC458F4C7FCDD609978 + -917B36F1708D1BAA22E668F7F0F776B9B5 - -B3135DB696CA82E9E73F5DBFEDD4D7532D
+9826C5263D673FC458F4C7FCDD609978 + 988BA49E02838228D7DCD7A2314DAE5893 - B323CB6328C0E9689C35CC6A2E2B0EF20B
+9826C5263D673FC458F4C7FCDD609978 + -A3D55A38271E83CEF0632822CFA94A4757 - -2A3D337300E11C8F2C0A335AD2CBE9ADDF
+-9826C5263D673FC458F4C7FCDD609978 + 7F428E259E4D13F3134048B449338864B8 - 5AA6760780FACB34EE753EC4C5627CB40
+-9826C5263D673FC458F4C7FCDD609978 + -8B2A87E5378B1FDC18088B663350779596 - -5C2AEAA5DC8871BDC61802E302DD82F0E
+9826C5263D673FC458F4C7FCDD609978 + 2AD965C071F50139CFFFB2D7659DD1F29 - 545BD212D5CB7536158EFF573373DB8A1
+9826C5263D673FC458F4C7FCDD609978 + -8B93E2BF93699080D8BE48FDAE884651B4 - -11FBBBFA6D2C294114655435B1AAE5B83C
+-9826C5263D673FC458F4C7FCDD609978 + FA224CBC7260081EA9AC65156C8E04FFF8 - 808A25F74C22A0DEE553704D6FB0A46680
+-9826C5263D673FC458F4C7FCDD609978 + -750B9D57AED58BCF5990DB0D044C3750D1 - -80A3C41CD512F30F1DE9CFD5012997EA49
+9826C5263D673FC458F4C7FCDD609978 + 93E2D37E2C9AA3653A74301CAC85474D74 - 807AFA4352D80AA4FECD24E4A962A7E6EC
+9826C5263D673FC458F4C7FCDD609978 + -C74B14398CA81C2CD8268C30E60B0110A6 - -4DB2ED74666AB4ED13CD9768E92DA0772E
+-9826C5263D673FC458F4C7FCDD609978 + C119B33387CBB970DFCE7FBE4E7D5396CB - 47818C6E618E52311B758AF6519FF2FD53
+-9826C5263D673FC458F4C7FCDD609978 + -C3CEB5504E8C7D0CD0FAE52C5CBD1204B2 - -4766DC1574C9E44C9553D9F4599A729E2A
+9826C5263D673FC458F4C7FCDD609978 + FBB60983D392B1A3494BD3609643FB326D - 474E3048F9D018E30DA4C82893215BCBE5
+9826C5263D673FC458F4C7FCDD609978 + -D6E51B12E0908DEE09050672737D1EF27C - -5D4CF44DBA5326AE44AC11AA769FBE5904
+-9826C5263D673FC458F4C7FCDD609978 + F09D220446C4082082AEA4D5A6930F3B39 - 7704FB3F2086A0E0BE55B00DA9B5AEA1C1
+-9826C5263D673FC458F4C7FCDD609978 + -B15FA9AC7B33C2D4C02438BBA4019281C9 - -77F7D071A1712A14847D2D83A0DEF31B41
+9826C5263D673FC458F4C7FCDD609978 + 6B143345E9DEBAE935177A186C354B933B - 77AC5A0B101C2228F9706EE06912AC2CB3
+9826C5263D673FC458F4C7FCDD609978 + -1F51336585786A017B6A22314728302823 - -A5B90CA05F3B02C1B7112D694A4ACF8EAB
+-9826C5263D673FC458F4C7FCDD609978 + 730A2A2DA99A9C8232CF331CFAF2F66B67 - F9720368835D35426E763E54FE1595D1EF
+-9826C5263D673FC458F4C7FCDD609978 + -6A1328B41BE8AA4F64B23CF0FCCA3D18F0 - -F9AB4F794226118F290B31B8F9A79DB268
+9826C5263D673FC458F4C7FCDD609978 + FD3FF26FE41FAB56DCD79D4F6932767438 - F9D819350A5D1296A1309217660FD70DB0
+9826C5263D673FC458F4C7FCDD609978 + -9B540D69C20AD1B97228B844F1AAF594E - -901D1A1175E345DBD2C996BC523D4EBFD6
+-9826C5263D673FC458F4C7FCDD609978 + 77DED7EA35190274D221188484AA303D6E - FE46B1250EDB9B350DC823BC87CCCFA3F6
+-9826C5263D673FC458F4C7FCDD609978 + -3EB2740EA69436D2B91F39E701F3FD673B - -FE4A9AD3CCD19E127D782EAEFED15E00B3
+9826C5263D673FC458F4C7FCDD609978 + 82A5846B516370FAE4BF451B7C4B171CF9 - FE3DAB3077A0D83AA91839E3792877B671
+9826C5263D673FC458F4C7FCDD609978 + -DBDB147B2CCB589761BCF72C1161E28645 - -6242EDB6068DF1579D640264148481ECCD
+-9826C5263D673FC458F4C7FCDD609978 + F98E9712A3673ADFE61A98AADB9DA6A742 - 7FF6704D7D29D3A021C1A3E2DEC0460DCA
+-9826C5263D673FC458F4C7FCDD609978 + -D6E59CAB36E3FB4E960C83454503B84DA6 - -7F7DC3705D21628E5A65780D41E118E71E
+9826C5263D673FC458F4C7FCDD609978 + 341619A44C4605A857700C4FB7DD88C5D3 - 7FAE406972836CE81BC90117B4BAE95F4B
+9826C5263D673FC458F4C7FCDD609978 + -C4DE40064B265B1CC5178E7324B6477E44 - -4B46194124E8F3DD00BE99AB27D8E6E4CC
+-9826C5263D673FC458F4C7FCDD609978 + 76AA3534F4C80D8EE1115202594C36EF6B - FD120E6FCE8AA64F1CB85D3A5C6ED655F3
+-9826C5263D673FC458F4C7FCDD609978 + -2F9825ECA189BEEC0438D0F57E6AE894325B - -9EFDBE1366AFFC5343FD29EA4667C5F4CBD3
+9826C5263D673FC458F4C7FCDD609978 + F19B2BEE58096158B2ED13617473C3662A8A - 9EFDC4151D2F9EBFF2B16C563C70A0C6C402
+9826C5263D673FC458F4C7FCDD609978 + -401CAB25C55FE3F0118F3267857317203F15 - -E2A312FF0039A688D1CAD972BD7639BFA59D
+-9826C5263D673FC458F4C7FCDD609978 + 5E2D0C48B22A36E3FA7EE98127802C28D3BE - B37421ED03F97CBABA908C5F834EC83A46
+-9826C5263D673FC458F4C7FCDD609978 + -C225C38B2B3AC83AB6153F49A75202B933D - -B3F45F77D9E9EAEB25ACE96271FD8C2CB5
+2C2BA28D09AEC6D803FD4429E6C107B8 - 380184EC6B2F7748AB6D414107 - C878BE550829DA6CD485FB7E797FC6B1
+2C2BA28D09AEC6D803FD4429E6C107B8 - -E33F410CA9510BD6226C27B652 - C878BE7048EFD38155091A4C52E8BE0A
+-2C2BA28D09AEC6D803FD4429E6C107B8 - E5DD576AD3B66086B6C026136A - -C878BE72E70631ABBA5DCAE0A6E71B22
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -F26441B32E64E85F59E9327736 - -EB85A09AA56D13A99F14E4CFFD8E9082
+2C2BA28D09AEC6D803FD4429E6C107B8 - BE41EB2CD4B69D5C3995583840 - 75C2BECEC7C39A034D5FE7F05168CF78
+2C2BA28D09AEC6D803FD4429E6C107B8 - -C5A09E78118BA6406DD7D790F - 75C2BE9963B8AE591CB7A830C43E80C7
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 83E5B2A8F1BA92F305A428D787 - -75C2BE10EF616FC9BE90372F8AE9DF3F
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -BCDB4BA597FD71386CDBF55E3 - -CC8923813BFA0C7E842630A31901B1D5
+2C2BA28D09AEC6D803FD4429E6C107B8 - 99DBBCAAABA7AF2705B83CE2FE - F88ED3F32DF21C2C5C4E1D242E8424BA
+2C2BA28D09AEC6D803FD4429E6C107B8 - -99FF39288B45A42ED959CD6312 - F88ED32708E7EF6349A17303408E6ACA
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 3CB6F87B8E7C6771E066CE3ABB - -F88ED3C9C0A742668064B60A4D8F4273
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -D09315E239080897D24E1A1444 - -276C45BC7698E49EFBF4AC5798A6F374
+2C2BA28D09AEC6D803FD4429E6C107B8 - 5DF71FD4C1B921D884EB0343C - 6EB4FD872A3CC98BE86B26A19810D37C
+2C2BA28D09AEC6D803FD4429E6C107B8 - -472B28CAA03A4DDCFA6CF5A0C6 - 6EB4FDD434D791783E4B212453B6A87E
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 4F39D34174C1775DB876513CA8 - -6EB4FDDC4382084CC574A1E25D124460
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -D071578D8201150765E384196A - -AE7EEFBC9857395602E83CC4033CEE4E
+2C2BA28D09AEC6D803FD4429E6C107B8 - 800B35BC570CB5D43B7E049382 - CBDE8F0CFE790A80F7476FEE68BC7436
+2C2BA28D09AEC6D803FD4429E6C107B8 - -81D08DF973EA70B2D9437B0B3C5B - CBDE245D97A83AC274B01D6D61CC4413
+-2C2BA28D09AEC6D803FD4429E6C107B8 - F09C9EFB9BEE6FC6CA9948732062 - -CBDE9329A8AA62C673C40EC32F34281A
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -721647AC3A9844827605DD006735 - -20A73076C2028C3FBF7ACE2409C0A083
+2C2BA28D09AEC6D803FD4429E6C107B8 - 57472E1597FD0C17D80C5E782907 - 8D2C4B45DB992EDAF7E56C1D8848DEB1
+2C2BA28D09AEC6D803FD4429E6C107B8 - -7D42B5DB8228DCD4342DEFA69A89 - 8D2C1FCFBF8A4900E0D17857D667A241
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 7846E313C0FAB133B13942DA17E8 - -8D2C1AD3ECC287D2B530F563299B1FA0
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -81C70C34E0F677DB9A4BE4D04AFC - -5F3120C5FD79E5E18C21A9DE01F0BCBC
+2C2BA28D09AEC6D803FD4429E6C107B8 - 9C938DB3E1821702FB399DF6AAB2 - CA3E05F97BFAE555ECFA48F048CA5D06
+2C2BA28D09AEC6D803FD4429E6C107B8 - -2617E4F5AAA4E67EE001B52F1CDF - CA3EC8A4EEA4717CEA7C242B9BF02497
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 99896B01AF71340F5B04FFB3A1A6 - -CA3E3C1674B07649380C9F2EE674A95E
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -B179CFD7C7DB6ADD9FB4738783D - -B63097756CB14A5A4D4F6A2E9F888F7B
+2C2BA28D09AEC6D803FD4429E6C107B8 - 9B8BBBB4E210128D9CBDB637CAC4 - 32C207014DF9E4C7F16FA76C30893CF4
+2C2BA28D09AEC6D803FD4429E6C107B8 - -3CBC9171660E4638A28A1B1A9400 - 32C2DF499B202CE64A35E6B401DB9BB8
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 68CBB7816FB93E131BCB505CAF3E - -32C20B58C130369142105FF5371DB6F6
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -E2B6F164508E3AF43E720E69392C - -8DC5BFD6184A7649C90905B7D857CE8C
+2C2BA28D09AEC6D803FD4429E6C107B8 - 403612F9D1EA832931B9DE9F7180 - A136256F6B4F4ED80D4127008219638
+2C2BA28D09AEC6D803FD4429E6C107B8 - -FC37712BB27B69975E2FA04B6A51 - A139EC47ADA79536D94A259870C7209
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 476501EDB46EFFA66002840C4266 - -A13E9F20B9C7B4703A3A42C6ACD4A1E
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -564AF2926DDB32F15A37353C6C22 - -A19A4C42171C58FCD10BE9F2B1849B96
+2C2BA28D09AEC6D803FD4429E6C107B8 - FCC2B534FA670C0093E6F54569D0 - 4959A5CA5479CC70F7FCB042F17B9DE8
+2C2BA28D09AEC6D803FD4429E6C107B8 - -12D039C9FCA01077B4572FF64673 - 4959B55D4378C3781474F88116B74E2B
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 170D919AA59618A87E2104BE3370 - -4959B99A9B496C6E1CA5C24AEB7F3B28
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -81761643D1CC3F69AD02190A6F3B - -4FBA2116F36AF50BC4939727CDB6987D
+2C2BA28D09AEC6D803FD4429E6C107B8 - DF3AD551FB876A2EF627F57BD302 - 6E4AC352345CCB5099CE4E01F14534B6
+2C2BA28D09AEC6D803FD4429E6C107B8 - -5D29AB2210E49FF0CF86F5D35598 - 6E4AFFB6B4D0D7BCA3EE13B0DC945D50
+-2C2BA28D09AEC6D803FD4429E6C107B8 - B0F0C1F7518EA63CFA6FF1AAA379 - -6E4A537DCBA61866AA3A3E99D86BAB31
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -1E89D44555F411718B4665F6587C - -6B408403356970E3F28BB8E380CAAF3C
+2C2BA28D09AEC6D803FD4429E6C107B8 - 8F4980C17CE452040E4E9F2E731A - 39C3134388ED49F3B1F935DB4792949E
+2C2BA28D09AEC6D803FD4429E6C107B8 - -A3AA34957F38FAFFE8B61218F89C - 39C346373E444610FEFD2CDFF8DA0054
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 263720B1F04CD02BEFF177B75600 - -39C3C8C42A60B724D429341B5E785DB8
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -C4EB7D701E58D1574AF53A25275B - -F2BCDDA18C3EA87F32A5F934AC9BE05D
+2C2BA28D09AEC6D803FD4429E6C107B8 - 39BC5D1AAC2D17570F097E3F636A - DCDB68D0AC941AAAECA635206881A44E
+2C2BA28D09AEC6D803FD4429E6C107B8 - -E911BCCABB272B91EBA86F5C9910C8 - DC14B449D469EE0395E8EC99435A1880
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 422A218C2D0B60DD419756777CE3F2 - -DC6DCCAE95DBD238E13EDB805E3DEBAA
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -6DCF7B95BAFC93C566D723C00D2A85 - -E0BDD31173F3CA443E966D0626B3DD33
+2C2BA28D09AEC6D803FD4429E6C107B8 - D753E49843FDE9E40D04E1FCEEFEF9 - 39544EA8716AC8EE1FF03F47E9D208BF
+2C2BA28D09AEC6D803FD4429E6C107B8 - -BF744D88872A8621C2D057AB7BD0AB - 39EB16DA9235F15E25C01481923CD863
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 43352235ED06EDF44A9FC1167E7D0F - -396ED7AF3F9BCDC5F847E3EAFD3F84C7
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -97952F9DEA0E65F82414DE7259C4AC - -96940D5D6BC4B8720BD92F4B7467430C
+2C2BA28D09AEC6D803FD4429E6C107B8 - CB8604401553ED7E3843C7CB707983 - 3E601C88C99972EA85C500621B508E35
+2C2BA28D09AEC6D803FD4429E6C107B8 - -18EC5D991EAEC6880F467C8AB4D4B1 - 3E448EEAA2CD759E8C0C8AA67175DC69
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 9927B620FF15C910B067BB8036C15B - -3EC4CA432AADDCA114ADABE566F7C913
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -CDEE1E2705027E3AF666C69E912FD5 - -435DB46EE2A9C459C906DD63482FD7E3
+2C2BA28D09AEC6D803FD4429E6C107B8 - DB0F62D982F216B76001E1C0069ADA - FF50932A302BD4C14C9D424826BA6CDE
+2C2BA28D09AEC6D803FD4429E6C107B8 - -39F1B700C0960AA6219AF4425455 - FF2BDC7EC0AF876E0EA365C4DB035C0D
+-2C2BA28D09AEC6D803FD4429E6C107B8 - E942D6C541A823FDF65302242D16EF - -FF14E563CEF06EFC01F3972C0AEE1EA7
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -367081ABAB43DE75F16F4EF9835707 - -F4F5320B5E0382F98E0BD4DAED3DB0B1
+2C2BA28D09AEC6D803FD4429E6C107B8 - EAD0D03284A753798186A8A089628D - 5C40D1BCD72A1F848A7BBD814637A52B
+2C2BA28D09AEC6D803FD4429E6C107B8 - -6B0FFE630423D415624927ADD52958 - 5C96B28B6CB2EAAC195F8D5194963110
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 2C2329BDE3B791CB48D9F13F5E7D38 - -5C57C5B6C7927E69CF461E1B261F84F0
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -E968CBDBAC31FEE8BF301B27B6BF00 - -554239C12E0294D91B3E140EBF0A48B8
+2C2BA28D09AEC6D803FD4429E6C107B8 - E408A43E819D78E4262E31DA6E62DF - 84799E8CB2D295F1FD715F80C52A4D9
+2C2BA28D09AEC6D803FD4429E6C107B8 - -F915D5DE69DBD347EE7BCCAFF8668A - 824B862E818A2AB4BEBBFF696B96E42
+-2C2BA28D09AEC6D803FD4429E6C107B8 - A79F4F75D2F02C89B019CA666DC08 - -8361C82010BF5DACC9845C68D27E3C0
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -3E47CD42E515CD01BD72961A469DF8 - -3AED5ABFC6C9B10B023FD193CC7A69C0
+2C2BA28D09AEC6D803FD4429E6C107B8 - D52E9E9FDFC35B756D9B45B85AA3C3 - 355673EE69CF037C8E8FA8E42E6663F5
+2C2BA28D09AEC6D803FD4429E6C107B8 - -6392B2E6D9980A0BE3FEBBA01420BE - 358F353FF0885EE20FE142E586D52876
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 4F0DF37AA0006EAE922FDBD6C4A797 - -357AB080844EC746B28F7405BD85AF4F
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -1C02650FE41DB168BC300737A6EB2D - -A00FA027F9CAA9269B411422AF1A1C8B
+2C2BA28D09AEC6D803FD4429E6C107B8 - C7337DEB59CAED0D7338B7D9C9E97 - 7D1F2F552AF92A293326109E69246921
+2C2BA28D09AEC6D803FD4429E6C107B8 - -B663779DC9C2A1BC9D267EB177003F - 7DE20604A7788979C09A6AA8983807F7
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 4B33A29109C7BD483AD12C609A3E5C - -7D76D62F9AB88E954C381556475B4614
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -7763F2937A8D8455EB09016C4A5DFA - -5BB43E9A76343953AE123B287A76A9BE
+2C2BA28D09AEC6D803FD4429E6C107B8 - 32FE0BBB4DA154BFE31935BAA63274 - 24F8A4814E612583441A2AF42C1AD544
+2C2BA28D09AEC6D803FD4429E6C107B8 - -1E98BDA21CC26B6A8AB1B859D3727932 - 4AC4602F267132428EAEFC83BA3380EA
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 93676DE30B2EEE8B82486C7CE9C34414 - -BF93107014DDB5638645B0A6D0844BCC
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -7602854B23609BD635095EFD082FB2A0 - -B6291D41E64E2B01CEF3E52CDE915518
+2C2BA28D09AEC6D803FD4429E6C107B8 - 6BCBA3CD50D6A74DE569BF4DE52582E - 256EE85034A15C6325A6A835086EAF8A
+2C2BA28D09AEC6D803FD4429E6C107B8 - -2055DA77B18C1A7026DFB40066B18C9 - 2E31003484C7887F066B3F69ED2C2081
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 2491756317748BB1D819DF4A80D32038 - -50BD17F021235289DC172374679427F0
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -EA9DC0B52762D00DC052CDAF7EA3CB47 - -418DE1D7E24BF6CA43AA767A681D3C71
+2C2BA28D09AEC6D803FD4429E6C107B8 - CD559BCE39CAE8B9350BC3C73C469D28 - 5ED606BECFE3DE1ECEF18062AA7A6A90
+2C2BA28D09AEC6D803FD4429E6C107B8 - -9F05BC59A3AF6D73BF563F767C903641 - CB315EE6AD5E344BC35383A063513DF9
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 7718DCEF820E673D75351DADF5ACFF2 - -339D305C01CFAD4BDB509604C61BD7AA
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -59B11EABA28625E68ED93168432B8946 - -D27A83E16728A0F1752412C1A3957E72
+2C2BA28D09AEC6D803FD4429E6C107B8 - A6FB266B13FBFE7A37D4B5DD67AC02A6 - 85307C21F5B2C85DCC288E4C7F150512
+2C2BA28D09AEC6D803FD4429E6C107B8 - -B464CB4E67FD5E082C9A07765920C46E - E0906DDB71AC24E030974BA03FE1CC26
+-2C2BA28D09AEC6D803FD4429E6C107B8 - 9CF48CE7BC605E20F5EE8AD2132F6D7F - -C9202F74C60F24F8F9EBCEFBF9F07537
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -217C3E90428492B75DA082A243BF416C - -AAF63FCC72A3420A65CC187A301C64C
+2C2BA28D09AEC6D803FD4429E6C107B8 - 58473DD94BBAD6381F4668624303165 - 26A72EAF74F319748208DDA3C290D653
+2C2BA28D09AEC6D803FD4429E6C107B8 - -C08C3C158911B5B02A7AA4084662D881 - ECB7DEA292C07C882E77E8322D23E039
+-2C2BA28D09AEC6D803FD4429E6C107B8 - F9C9F9506C63D82156A8625E166A7C68 - -6325F59BDD76129EF95AA5A687FD2B8420
+-2C2BA28D09AEC6D803FD4429E6C107B8 - -7661FF975A940A521FC89D23CEAD7D2F - -B5C9A2F5AF1ABC85E434A70618138A89
+FD297C745825A0 * 2 - 1FA52F8E8B04B40
+1FA52F8E8B04B40 * 2 - 3F4A5F1D1609680
+3F4A5F1D1609680 * 2 - 7E94BE3A2C12D00
+7E94BE3A2C12D00 * 2 - FD297C745825A00
+FD297C745825A00 * 2 - 1FA52F8E8B04B400
+1FA52F8E8B04B400 * 2 - 3F4A5F1D16096800
+3F4A5F1D16096800 * 2 - 7E94BE3A2C12D000
+7E94BE3A2C12D000 * 2 - FD297C745825A000
+FD297C745825A000 * 2 - 1FA52F8E8B04B4000
+1FA52F8E8B04B4000 * 2 - 3F4A5F1D160968000
+3F4A5F1D160968000 * 2 - 7E94BE3A2C12D0000
+7E94BE3A2C12D0000 * 2 - FD297C745825A0000
+FD297C745825A0000 * 2 - 1FA52F8E8B04B40000
+1FA52F8E8B04B40000 * 2 - 3F4A5F1D1609680000
+3F4A5F1D1609680000 * 2 - 7E94BE3A2C12D00000
+7E94BE3A2C12D00000 * 2 - FD297C745825A00000
+FD297C745825A00000 * 2 - 1FA52F8E8B04B400000
+1FA52F8E8B04B400000 * 2 - 3F4A5F1D16096800000
+3F4A5F1D16096800000 * 2 - 7E94BE3A2C12D000000
+7E94BE3A2C12D000000 * 2 - FD297C745825A000000
+FD297C745825A000000 * 2 - 1FA52F8E8B04B4000000
+1FA52F8E8B04B4000000 * 2 - 3F4A5F1D160968000000
+3F4A5F1D160968000000 * 2 - 7E94BE3A2C12D0000000
+7E94BE3A2C12D0000000 * 2 - FD297C745825A0000000
+FD297C745825A0000000 * 2 - 1FA52F8E8B04B40000000
+1FA52F8E8B04B40000000 * 2 - 3F4A5F1D1609680000000
+3F4A5F1D1609680000000 * 2 - 7E94BE3A2C12D00000000
+7E94BE3A2C12D00000000 * 2 - FD297C745825A00000000
+FD297C745825A00000000 * 2 - 1FA52F8E8B04B400000000
+1FA52F8E8B04B400000000 * 2 - 3F4A5F1D16096800000000
+3F4A5F1D16096800000000 * 2 - 7E94BE3A2C12D000000000
+7E94BE3A2C12D000000000 * 2 - FD297C745825A000000000
+FD297C745825A000000000 * 2 - 1FA52F8E8B04B4000000000
+1FA52F8E8B04B4000000000 * 2 - 3F4A5F1D160968000000000
+3F4A5F1D160968000000000 * 2 - 7E94BE3A2C12D0000000000
+7E94BE3A2C12D0000000000 * 2 - FD297C745825A0000000000
+FD297C745825A0000000000 * 2 - 1FA52F8E8B04B40000000000
+1FA52F8E8B04B40000000000 * 2 - 3F4A5F1D1609680000000000
+3F4A5F1D1609680000000000 * 2 - 7E94BE3A2C12D00000000000
+7E94BE3A2C12D00000000000 * 2 - FD297C745825A00000000000
+FD297C745825A00000000000 * 2 - 1FA52F8E8B04B400000000000
+1FA52F8E8B04B400000000000 * 2 - 3F4A5F1D16096800000000000
+3F4A5F1D16096800000000000 * 2 - 7E94BE3A2C12D000000000000
+7E94BE3A2C12D000000000000 * 2 - FD297C745825A000000000000
+FD297C745825A000000000000 * 2 - 1FA52F8E8B04B4000000000000
+1FA52F8E8B04B4000000000000 * 2 - 3F4A5F1D160968000000000000
+3F4A5F1D160968000000000000 * 2 - 7E94BE3A2C12D0000000000000
+7E94BE3A2C12D0000000000000 * 2 - FD297C745825A0000000000000
+FD297C745825A0000000000000 * 2 - 1FA52F8E8B04B40000000000000
+1FA52F8E8B04B40000000000000 * 2 - 3F4A5F1D1609680000000000000
+3F4A5F1D1609680000000000000 * 2 - 7E94BE3A2C12D00000000000000
+7E94BE3A2C12D00000000000000 * 2 - FD297C745825A00000000000000
+FD297C745825A00000000000000 * 2 - 1FA52F8E8B04B400000000000000
+1FA52F8E8B04B400000000000000 * 2 - 3F4A5F1D16096800000000000000
+3F4A5F1D16096800000000000000 * 2 - 7E94BE3A2C12D000000000000000
+7E94BE3A2C12D000000000000000 * 2 - FD297C745825A000000000000000
+FD297C745825A000000000000000 * 2 - 1FA52F8E8B04B4000000000000000
+1FA52F8E8B04B4000000000000000 * 2 - 3F4A5F1D160968000000000000000
+3F4A5F1D160968000000000000000 * 2 - 7E94BE3A2C12D0000000000000000
+7E94BE3A2C12D0000000000000000 * 2 - FD297C745825A0000000000000000
+FD297C745825A0000000000000000 * 2 - 1FA52F8E8B04B40000000000000000
+1FA52F8E8B04B40000000000000000 * 2 - 3F4A5F1D1609680000000000000000
+3F4A5F1D1609680000000000000000 * 2 - 7E94BE3A2C12D00000000000000000
+7E94BE3A2C12D00000000000000000 * 2 - FD297C745825A00000000000000000
+FD297C745825A00000000000000000 * 2 - 1FA52F8E8B04B400000000000000000
+1FA52F8E8B04B400000000000000000 * 2 - 3F4A5F1D16096800000000000000000
+3F4A5F1D16096800000000000000000 * 2 - 7E94BE3A2C12D000000000000000000
+7E94BE3A2C12D000000000000000000 * 2 - FD297C745825A000000000000000000
+FD297C745825A000000000000000000 * 2 - 1FA52F8E8B04B4000000000000000000
+1FA52F8E8B04B4000000000000000000 * 2 - 3F4A5F1D160968000000000000000000
+73E919C788D635 * 2 - E7D2338F11AC6A
+73E919C788D635 * 4 - 1CFA4671E2358D4
+73E919C788D635 * 8 - 39F48CE3C46B1A8
+73E919C788D635 * 10 - 73E919C788D6350
+73E919C788D635 * 20 - E7D2338F11AC6A0
+73E919C788D635 * 40 - 1CFA4671E2358D40
+73E919C788D635 * 80 - 39F48CE3C46B1A80
+73E919C788D635 *  - 73E919C788D63500
+73E919C788D635 *  - E7D2338F11AC6A00
+73E919C788D635 *  - 1CFA4671E2358D400
+73E919C788D635 *  - 39F48CE3C46B1A800
+73E919C788D635 *  - 73E919C788D635000
+73E919C788D635 *  - E7D2338F11AC6A000
+73E919C788D635 *  - 1CFA4671E2358D4000
+73E919C788D635 *  - 39F48CE3C46B1A8000
+73E919C788D635 *  - 73E919C788D6350000
+73E919C788D635 *  - E7D2338F11AC6A0000
+73E919C788D635 *  - 1CFA4671E2358D40000
+73E919C788D635 *  - 39F48CE3C46B1A80000
+73E919C788D635 *  - 73E919C788D63500000
+73E919C788D635 *  - E7D2338F11AC6A00000
+73E919C788D635 *  - 1CFA4671E2358D400000
+73E919C788D635 *  - 39F48CE3C46B1A800000
+73E919C788D635 *  - 73E919C788D635000000
+73E919C788D635 *  - E7D2338F11AC6A000000
+73E919C788D635 *  - 1CFA4671E2358D4000000
+73E919C788D635 *  - 39F48CE3C46B1A8000000
+73E919C788D635 *  - 73E919C788D6350000000
+73E919C788D635 *  - E7D2338F11AC6A0000000
+73E919C788D635 *  - 1CFA4671E2358D40000000
+73E919C788D635 *  - 39F48CE3C46B1A80000000
+73E919C788D635 *  - 73E919C788D63500000000
+73E919C788D635 *  - E7D2338F11AC6A00000000
+73E919C788D635 *  - 1CFA4671E2358D400000000
+73E919C788D635 *  - 39F48CE3C46B1A800000000
+73E919C788D635 *  - 73E919C788D635000000000
+73E919C788D635 *  - E7D2338F11AC6A000000000
+73E919C788D635 *  - 1CFA4671E2358D4000000000
+73E919C788D635 *  - 39F48CE3C46B1A8000000000
+73E919C788D635 *  - 73E919C788D6350000000000
+73E919C788D635 *  - E7D2338F11AC6A0000000000
+73E919C788D635 *  - 1CFA4671E2358D40000000000
+73E919C788D635 *  - 39F48CE3C46B1A80000000000
+73E919C788D635 *  - 73E919C788D63500000000000
+73E919C788D635 *  - E7D2338F11AC6A00000000000
+73E919C788D635 *  - 1CFA4671E2358D400000000000
+73E919C788D635 *  - 39F48CE3C46B1A800000000000
+73E919C788D635 *  - 73E919C788D635000000000000
+73E919C788D635 *  - E7D2338F11AC6A000000000000
+73E919C788D635 *  - 1CFA4671E2358D4000000000000
+73E919C788D635 *  - 39F48CE3C46B1A8000000000000
+73E919C788D635 *  - 73E919C788D6350000000000000
+73E919C788D635 *  - E7D2338F11AC6A0000000000000
+73E919C788D635 *  - 1CFA4671E2358D40000000000000
+73E919C788D635 *  - 39F48CE3C46B1A80000000000000
+73E919C788D635 *  - 73E919C788D63500000000000000
+73E919C788D635 *  - E7D2338F11AC6A00000000000000
+73E919C788D635 *  - 1CFA4671E2358D400000000000000
+73E919C788D635 *  - 39F48CE3C46B1A800000000000000
+73E919C788D635 *  - 73E919C788D635000000000000000
+73E919C788D635 *  - E7D2338F11AC6A000000000000000
+73E919C788D635 *  - 1CFA4671E2358D4000000000000000
+73E919C788D635 *  - 39F48CE3C46B1A8000000000000000
+73E919C788D635 *  - 73E919C788D6350000000000000000
+73E919C788D635 *  - E7D2338F11AC6A0000000000000000
+73E919C788D635 *  - 1CFA4671E2358D40000000000000000
+73E919C788D635 *  - 39F48CE3C46B1A80000000000000000
+73E919C788D635 *  - 73E919C788D63500000000000000000
+73E919C788D635 *  - E7D2338F11AC6A00000000000000000
+73E919C788D635 *  - 1CFA4671E2358D400000000000000000
+E6BA003EBCA54 / 2 - 735D001F5E52A
+735D001F5E52A / 2 - 39AE800FAF295
+39AE800FAF295 / 2 - 1CD74007D794A
+1CD74007D794A / 2 - E6BA003EBCA5
+E6BA003EBCA5 / 2 - 735D001F5E52
+735D001F5E52 / 2 - 39AE800FAF29
+39AE800FAF29 / 2 - 1CD74007D794
+1CD74007D794 / 2 - E6BA003EBCA
+E6BA003EBCA / 2 - 735D001F5E5
+735D001F5E5 / 2 - 39AE800FAF2
+39AE800FAF2 / 2 - 1CD74007D79
+1CD74007D79 / 2 - E6BA003EBC
+E6BA003EBC / 2 - 735D001F5E
+735D001F5E / 2 - 39AE800FAF
+39AE800FAF / 2 - 1CD74007D7
+1CD74007D7 / 2 - E6BA003EB
+E6BA003EB / 2 - 735D001F5
+735D001F5 / 2 - 39AE800FA
+39AE800FA / 2 - 1CD74007D
+1CD74007D / 2 - E6BA003E
+E6BA003E / 2 - 735D001F
+735D001F / 2 - 39AE800F
+39AE800F / 2 - 1CD74007
+1CD74007 / 2 - E6BA003
+E6BA003 / 2 - 735D001
+735D001 / 2 - 39AE800
+39AE800 / 2 - 1CD7400
+1CD7400 / 2 - E6BA00
+E6BA00 / 2 - 735D00
+735D00 / 2 - 39AE80
+39AE80 / 2 - 1CD740
+1CD740 / 2 - E6BA0
+E6BA0 / 2 - 735D0
+735D0 / 2 - 39AE8
+39AE8 / 2 - 1CD74
+1CD74 / 2 - E6BA
+E6BA / 2 - 735D
+735D / 2 - 39AE
+39AE / 2 - 1CD7
+1CD7 / 2 - E6B
+E6B / 2 - 735
+735 / 2 - 39A
+39A / 2 - 1CD
+1CD / 2 - E6
+E6 / 2 - 73
+73 / 2 - 39
+39 / 2 - 1C
+1C / 2 - E
+E / 2 - 7
+7 / 2 - 3
+3 / 2 - 1
+1 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+0 / 2 - 0
+-7BFF6031D9D277 / 2 - -3DFFB018ECE93B
+-7BFF6031D9D277 / 4 - -1EFFD80C76749D
+-7BFF6031D9D277 / 8 - -F7FEC063B3A4E
+-7BFF6031D9D277 / 10 - -7BFF6031D9D27
+-7BFF6031D9D277 / 20 - -3DFFB018ECE93
+-7BFF6031D9D277 / 40 - -1EFFD80C76749
+-7BFF6031D9D277 / 80 - -F7FEC063B3A4
+-7BFF6031D9D277 /  - -7BFF6031D9D2
+-7BFF6031D9D277 /  - -3DFFB018ECE9
+-7BFF6031D9D277 /  - -1EFFD80C7674
+-7BFF6031D9D277 /  - -F7FEC063B3A
+-7BFF6031D9D277 /  - -7BFF6031D9D
+-7BFF6031D9D277 /  - -3DFFB018ECE
+-7BFF6031D9D277 /  - -1EFFD80C767
+-7BFF6031D9D277 /  - -F7FEC063B3
+-7BFF6031D9D277 /  - -7BFF6031D9
+-7BFF6031D9D277 /  - -3DFFB018EC
+-7BFF6031D9D277 /  - -1EFFD80C76
+-7BFF6031D9D277 /  - -F7FEC063B
+-7BFF6031D9D277 /  - -7BFF6031D
+-7BFF6031D9D277 /  - -3DFFB018E
+-7BFF6031D9D277 /  - -1EFFD80C7
+-7BFF6031D9D277 /  - -F7FEC063
+-7BFF6031D9D277 /  - -7BFF6031
+-7BFF6031D9D277 /  - -3DFFB018
+-7BFF6031D9D277 /  - -1EFFD80C
+-7BFF6031D9D277 /  - -F7FEC06
+-7BFF6031D9D277 /  - -7BFF603
+-7BFF6031D9D277 /  - -3DFFB01
+-7BFF6031D9D277 /  - -1EFFD80
+-7BFF6031D9D277 /  - -F7FEC0
+-7BFF6031D9D277 /  - -7BFF60
+-7BFF6031D9D277 /  - -3DFFB0
+-7BFF6031D9D277 /  - -1EFFD8
+-7BFF6031D9D277 /  - -F7FEC
+-7BFF6031D9D277 /  - -7BFF6
+-7BFF6031D9D277 /  - -3DFFB
+-7BFF6031D9D277 /  - -1EFFD
+-7BFF6031D9D277 /  - -F7FE
+-7BFF6031D9D277 /  - -7BFF
+-7BFF6031D9D277 /  - -3DFF
+-7BFF6031D9D277 /  - -1EFF
+-7BFF6031D9D277 /  - -F7F
+-7BFF6031D9D277 /  - -7BF
+-7BFF6031D9D277 /  - -3DF
+-7BFF6031D9D277 /  - -1EF
+-7BFF6031D9D277 /  - -F7
+-7BFF6031D9D277 /  - -7B
+-7BFF6031D9D277 /  - -3D
+-7BFF6031D9D277 /  - -1E
+-7BFF6031D9D277 /  - -F
+-7BFF6031D9D277 /  - -7
+-7BFF6031D9D277 /  - -3
+-7BFF6031D9D277 /  - -1
+-7BFF6031D9D277 /  - -0
+-7BFF6031D9D277 /  - -0
+-7BFF6031D9D277 /  - -0
+-7BFF6031D9D277 /  - -0
+-7BFF6031D9D277 /  - -0
+-7BFF6031D9D277 /  - -0
+-7BFF6031D9D277 /  - -0
+-7BFF6031D9D277 /  - -0
+-7BFF6031D9D277 /  - -0
+-7BFF6031D9D277 /  - 0
+-7BFF6031D9D277 /  - 0
+-7BFF6031D9D277 /  - 0
+-7BFF6031D9D277 /  - 0
+-7BFF6031D9D277 /  - 0
+-7BFF6031D9D277 /  - 0
+-7BFF6031D9D277 /  - 0
+-695F * -695F - 2B5F1141
+3F08 * 3F08 - F84F040
+-E4CE * -E4CE - CC7F95C4
+-260CAA * -260CAA - 5A7C31860E4
+637728 * 637728 - 26A560663640
+CEE353 * CEE353 - A732A3704CE9
+F682D2E5 * F682D2E5 - ED5FB02AFA5080D9
+-A1F0633 * -A1F0633 - 66703E7C806E29
+-28670CBF * -28670CBF - 6605D76F2547681
+A69CEF5D4F * A69CEF5D4F - 6C6FE6A19BFBA3847E61
+-EC6F015FCD * -EC6F015FCD - DA5CDAAAD30DA973CA29
+-988EB2044D * -988EB2044D - 5AE9C2EF13FF67267F29
+38845710CF * 38845710CF - C7A2A814181E5CC8761
+74E3ECC51B0B * 74E3ECC51B0B - 355F5980610BEF20E9C95279
+E293F535B04 * E293F535B04 - C889927651B9381CF3D810
+-D4F4DB8F052 * -D4F4DB8F052 - B12675D8256CC7AB79DA44
+-C662E2DF87BD00 * -C662E2DF87BD00 - 99BD1D24422BB78B773EE1890000
+73B3AC32CAECA5 * 73B3AC32CAECA5 - 344AEACFE52CADEEA102C324A259
+-7020E36421AC78 * -7020E36421AC78 - 311CCB31407A0F002FFBAB217840
+-AB63E98AB5BAB9E5 * -AB63E98AB5BAB9E5 - 72BEA0FDC51DCCBA09D2D7F479C0C6D9
+FD13670E7861102E * FD13670E7861102E - FA2F5B2B0F925E12D111ED0063E1C844
+448B3ED3616B79E * 448B3ED3616B79E - 125A451D94B7F52F248606BADB4584
+722C445D6004C58F0A * 722C445D6004C58F0A - 32EB748ABBDEFEA8BE828B7F506DC5502C64
+-7845C0FAAD434DFB1F * -7845C0FAAD434DFB1F - 388177EC9B0978BF481FBC0FDD1940FBCDC1
+-523612DFD51C69241A * -523612DFD51C69241A - 1A66AF835C585904739382AA8A58526B52A4
+315FDEEE12E80473C81D * 315FDEEE12E80473C81D - 985D73E5A10A019311028C8BBFE9B2E4E7B5349
+-8774D69F879642CDA8C5 * -8774D69F879642CDA8C5 - 47AC6FAF758274BA5E875CD043263D194EC52799
+-A7DD4F37B9EB07181EC3 * -A7DD4F37B9EB07181EC3 - 6E127CAC934B13EC302AFE0E74BAA3F672424889
+FEDB557353572B8502F5 * FEDB557353572B8502F5 - FDB7F97C29375ACC45CA4C8C35D6D4A0609ABE79
+5F44D83AFA7AC1A3A63D21 * 5F44D83AFA7AC1A3A63D21 - 23742AFF5BDFC133EFC992B6C684F3FCBD8D5B64BE41
+605113B8BD6E9431F134B8 * 605113B8BD6E9431F134B8 - 243CE8780A7FC08E81A3158A6DF569A14E32BD4B4440
+-4DA79A9A866F6B095E0C8A * -4DA79A9A866F6B095E0C8A - 178E40BC07D8B2C55A39205816738C4DE6CAE9F53A64
+-3CB4AA53092EE56242A20541 * -3CB4AA53092EE56242A20541 - E652F56E2654899DECD393C64FA03AB682641042A5F9A81
+87395D50F0FD926FAFDB9717 * 87395D50F0FD926FAFDB9717 - 476D8D460E3AAA0CBEF302732D840D04350736DF4C862411
+-96E2370053E902E8598BBA14 * -96E2370053E902E8598BBA14 - 58EDE0598ABA5ADFA5EE9B36FA50A74A4BE407E580F91190
+-80C25DEEC231572F6A0834B4E7 * -80C25DEEC231572F6A0834B4E7 - 40C2F181428701BD0E4A49FE4147D6138E1D8957F7746DADA871
+C1A4A32A29A6443B91624026B7 * C1A4A32A29A6443B91624026B7 - 9279A7E708D0C7E4A9C15723077888CE2CC1E97163057D5AD6D1
+81F2975220E0876FFFA4F84AF5 * 81F2975220E0876FFFA4F84AF5 - 41F6626335DA6E20E339603EA6C8A06FE2A5305ADAF138A28E79
+728A6F96E7636342A89C18A45667 * 728A6F96E7636342A89C18A45667 - 333F963EE56A312A8BB9724A1AC103865055C4BFF32BB73A21215D71
+-FF9C8C566DD658A730303D56CAD4 * -FF9C8C566DD658A730303D56CAD4 - FF393F4F8515872989DD7CFD829AB1BBAE717535FBE60995EF233F90
+-333278C239008F * 8CAAC9051C2B4A - -64D9D062A00FE8E072F247A2956
+-333278C239008F * -DD65556A74E999 - B3F6C4042C7F88659A714115577
+333278C239008F * 73076004AF894E - 6DA09CACCA83A2F9966B2D5E2B92
+333278C239008F * -57776B27BB80BD - -297AAD9C015FE9F7EEC64156993
+-333278C239008F * C0D6508087852A - -F919212BC9CD6236747FDD5A1776
+-333278C239008F * -52C38CF94955B1 - E769D2110A2BD09233B2496962DF
+333278C239008F * EB28189E79F3E4 - 27769816F2C43AF100F4FAC47F5C
+333278C239008F * -5E060E67236A72 - -D58ABFE9028178EA81987D623FAE
+-333278C239008F * 9DC24AE9C06C3C - -9A07C0AA009C279FDA3855C2184
+-333278C239008F * -7D3085C246076E - D0BEDC8C0AA5929CFA2E747E3D72
+333278C239008F * C3D1BCB47F9C7D - 8BA4513C6974D6DC0DFAD5D545D3
+333278C239008F * -5054A5B2153A95 - -4763394DD39D3489BC740B2D533B
+-333278C239008F * 414E6DCFD7A38D - -BF9D29DD2B2C98780965F9654EC3
+-333278C239008F * -5929345EA03C36 - DBE971B3DE818060C284F8061E2A
+333278C239008F * A1A6A42498C629 - 1D985C1D44EA58B770F31B2116E7
+333278C239008F * -6D5594633379B8 - -7848830ACAAEAC0997798F866C8
+-333278C239008F * D5F70DAC5CE9EF - -2E32C24E7C54A4B1260053378581
+-333278C239008F * -3FABF40E72D8D5 - BFD11E774A76E0ED86C5996D76FB
+333278C239008F * C89485F9A71ECB - DACB8CEC78BEB036500D03337165
+333278C239008F * -5701B72B14F3B2 - -227E85F9005A5E587E300BA2636E
+-333278C239008F * 7446DE2EE896EE - -5081C7933B6D3A07684690FE84F2
+-333278C239008F * -964502E170E65C - 76AE4CA6D3642D82483CC7C3364
+333278C239008F * 59D403FAFC9CE2 - AF508CE9C67ECEDD904876527E3E
+333278C239008F * -F2CC2768C7ADBC - -E16ED67779F5FC482677A1DC6904
+-333278C239008F * 2C91EBE107AF96 - -1E253306BB9A92531606CD6653CA
+-333278C239008F * -4A63FEEFDFBC67 - 674A9CBBFEFFFC27DC7824EF3989
+333278C239008F * 9A3174F5E10D2F - 61D26D46716C003A84F7A8771A41
+333278C239008F * -51669B1161CE60 - -95BD59006BBD30B643DDD56035A0
+-333278C239008F * A7523F8F4286C7 - -AA0CD16FE1D0C8D35F0FFA4F6F29
+-333278C239008F * -C3DCC584DE238A - 168CB6E6AA51B476A323B2BA4D16
+333278C239008F * 8807FEFB62A8C9 - D1ACBEF58031CC12EB27EC17047
+333278C239008F * -286B4AA186F57F - -EDC138F701D564E0333E5A4746F1
+-333278C239008F * B4B28DF5887F86 - -B3651B3374B55831B9F8A9D64ADA
+-333278C239008F * -5850CE172EB74B - 4FD379136763ECDE3C72E6B329E5
+333278C239008F * C9FBB26917F433 - 3C538FB61D6202D5717CB15B1C7D
+333278C239008F * -A5EBD65287D130 - -BC61C9392EACBA3FEE2E6AB01AD0
+-333278C239008F * E4EBF4F6BF1033 - -6122B48C40F4F687965AB15B1C7D
+-333278C239008F * -5472E5E87016F9 - 18810EE0E42470C9975FE9718B17
+333278C239008F * 1283318C01193A - 31BC04A630ECA828ABB00EA2066
+333278C239008F * -6F4E0DB5ACCE11 - -88878FB817E8844B6147E5C9097F
+-333278C239008F * 3DC98FF9B738D8 - -86AFB80D25BF8009E5C4E01878A8
+-333278C239008F * -8A3E306874F027 - D3FD44031756567CCB3596AF15C9
+333278C239008F * 961C95A0CDE2FB - 94593A3AB63A6C5FCFA16DE38C35
+333278C239008F * -1E8C55FEB72D69 - -886ED074400166ECE302A9613AA7
+-333278C239008F * DFB41EF1CDCC11 - -884796CAA6A8EC146AC6E5C9097F
+-333278C239008F * -38D3B3F9502CD7 - E0F0E6674FA488DAC7681DDF7819
+333278C239008F * EB8DA50CD14333 - C8C10E890A3CE4F06A39B15B1C7D
+333278C239008F * -6CE7B60A7B6D3B - -AAABD77FA1170E53077EC32320F5
+-333278C239008F * 71A305452DDDD1 - -3AB4ADC9EFD4A4E93761908974BF
+-333278C239008F * -E43BE7D8025C38 - 193279C118C126A28B737C781F48
+333278C239008F * BBF3AE57C7A579 - 5AB4C7CAC9F92AF13C45CCF14397
+333278C239008F * -A3FCB7AFD07B51 - -C3E977E2FEE8D6F25E6E74092D3F
+-333278C239008F * 9C9E1D70DD5321 - -201134915D8D80E91C40959126F
+-333278C239008F * -F73F608E265EC0 - 1232BD6F5BAA82C61031AAC06B40
+333278C239008F * E1106CD2A4ECB5 - C862022F0462623EEBB5524D651B
+333278C239008F * -10084DD7BFE7AE - -A455BCC56F8D38F1791702BE6132
+-333278C239008F * 4C49D23F85B112 - -F4C31245142BDE5C01CBA8020A0E
+-333278C239008F * -C6F4E72EDF64EC - 220C84891060A2085C0C8C83D4
+333278C239008F * 14BA951B0B7128 - C8B48A69A9B6782D361958E81658
+333278C239008F * -46A630FD842A54 - -D4CE48F947834E7CAA6FBAB42EEC
+-333278C239008F * 6F08481586842 - -486C26F3AC4D98974CDE12B224DE
+-333278C239008F * -34E97B303F7D01 - 3ED301ED44C23A96772DC239008F
+333278C239008F * 239E8BBA8E2233 - 97466108DAB24265BB3B15B1C7D
+333278C239008F * -30E7A05B0BB007 - -89DD50E0604DEC06BAAD4F8F03E9
+-333278C239008F * DEB534A1A8CB46 - -342388C34FF6D493EA111B96271A
+-333278C239008F * -AE50B34C18B72D - 90802CF6AF0C70DB433724051923
+333278C239008F * D0992EF8AFD4AE - 4418C103D8FC3E0A67C602BE6132
+333278C239008F * -F805248E3E8FCC - -449F2FC2A75ADED04C56C56C71F4
+-333278C239008F * 13CB3ECC042192 - -30A5143A347EF200EB80C482518E
+-333278C239008F * -DD32962D9DD238 - 5B07044596568C995E347C781F48
+333278C239008F * 901D9722DCBA4D - F661B84F8E47AC0582AB6B252B03
+333278C239008F * -3EC33B2A9D511D - -2F757387214332EFD8A300751033
+-333278C239008F * BFCD13A4BF5DD8 - -1F71CFC716BA066DA080E01878A8
+-333278C239008F * -7F781231357E0E - 8A532565269B56CECCA89F1E07D2
+333278C239008F * 95406E35BBA00B - 26EE1F3EE5583EB168A258730625
+333278C239008F * -EFCBBE80C07E40 - -25E87E8CC9BA8C1B08528E4023C0
+-333278C239008F * E244E6EBC11893 - -81DF2F7187018A9C7BD186BB521D
+-333278C239008F * -19C6FC96A60BE4 - 5FF3014BBA21EAB58050FAC47F5C
+333278C239008F * A9C891351DBB1E - 16E8BDD356A5F0493B25C2AE10C2
+333278C239008F * -B0ED949440C809 - -F5AFA7EC4D9082C118EAD4010507
+-333278C239008F * 215A0C75ED207E - -6B7CE7C95952B6DEDE23980E4662
+-333278C239008F * -332A22531BC7D1 - 9E76ECDF83CA4E5E4794908974BF
+333278C239008F * D2DE8C2EBE4A16 - 825D9EAEE48EBC92A494B0E60C4A
+333278C239008F * -4B1E3E4CABF525 - -EDB266A62A32D0346E16123D14AB
+-333278C239008F * F989BEA03B49E8 - -4B2BBD100C591CB4279203A88198
+-333278C239008F * -56EEAD41B0650D - FA88B54861B99E1EF0C4DCE50743
+333278C239008F * F4DFE55703A9B3 - E81537BFAFD718C9CA5ACDDB63FD
+333278C239008F * -17101017D57E73 - -45A6013AF27B608FB52F3F9B403D
+-333278C239008F * 53EE10D00BFE9 - -2C925F9E837CC8B26D97C5E18227
+-333278C239008F * -CA7FCD6023AF64 - A3E63DE190BFD8A529AEDE4437DC
+333278C239008F * 465D9A1D461D78 - F0E5B77549DF8649FEA10AB84308
+333278C239008F * -BD7672502E8C53 - -519D09E6925480FB9CD4F87B2E5D
+-333278C239008F * 841F9521302F5C - -1254FD3410D2969376A0CC7C3364
+-333278C239008F * -913D9DCF70396A - 5C897F0ABA36D0283DB36B9A3B36
+333278C239008F * 7981A7ACDF8DB - A9150A49DEA644963BD426C37A55
+333278C239008F * -C89FB0200903B6 - -B6FFE1E3BB1D5296442A148665AA
+-333278C239008F * E41A52BF843904 - -E202D9A04F09C00EF7B108E4023C
+-333278C239008F * -DD18A14E29F064 - 21A35AFAAC9A0CD9111ADE4437DC
+333278C239008F * 650D2710314C54 - 6D3BB63A84EF3A7BA568BAB42EEC
+333278C239008F * -AAE8851D33FDDE - -780005DE0B790A030F036D6E7C02
+-89D2DBFB84BF5C2E280970546B / 9C0E - -FE000000FE000000FE000000FE
+-89D2DBFB84BF5C2E280970546B % 9C0E - -26DD26ED168BEEF040C09032A4F
+-89D2DBFB84BF5C2E280970546B / -868C - FF000000FF000000FF000000FF
+-89D2DBFB84BF5C2E280970546B % -868C - -4C93C2D39C79035B46B224A4EF7
+89D2DBFB84BF5C2E280970546B / 3CE9 - FF000000FF000000FF000000FF
+89D2DBFB84BF5C2E280970546B % 3CE9 - 7D9A57DD6DB610E997F3B23A854
+89D2DBFB84BF5C2E280970546B / -65F0 - -FF000000FF000000FF000000FF
+89D2DBFB84BF5C2E280970546B % -65F0 - 1D477833805002D4D2F46CEACA5B
+-89D2DBFB84BF5C2E280970546B / 12C6 - -FE000000FE000000FE000000FE
+-89D2DBFB84BF5C2E280970546B % 12C6 - -20FDD2E71BF8BF674E9C097B74DF
+-89D2DBFB84BF5C2E280970546B / -50E2 - FE000000FE000000FE000000FE
+-89D2DBFB84BF5C2E280970546B % -50E2 - -40C5D2F1BBC0BF71EE64090614A7
+89D2DBFB84BF5C2E280970546B / 1F47 - FF000000FF000000FF000000FF
+89D2DBFB84BF5C2E280970546B % 1F47 - AACF984AA5DB217D5225442CB2
+89D2DBFB84BF5C2E280970546B / -CF68 - -FF000000FF000000FF000000FF
+89D2DBFB84BF5C2E280970546B % -CF68 - 1A53C5450A0F6E683564117BBD3
+-89D2DBFB84BF5C2E280970546B / EF89 - -FF000000FF000000FF000000FF
+-89D2DBFB84BF5C2E280970546B % EF89 - -27A55CB3D762E6F703D78BDBAF4
+-89D2DBFB84BF5C2E280970546B / -8D69 - FF000000FF000000FF000000FF
+-89D2DBFB84BF5C2E280970546B % -8D69 - -3C328BAD6BE9D8309A9E80B78D4
+89D2DBFB84BF5C2E280970546B / 271A - FF000000FF000000FF000000FF
+89D2DBFB84BF5C2E280970546B % 271A - B456E9C76407BACA973C6A96185
+89D2DBFB84BF5C2E280970546B / -C997 - -FF000000FF000000FF000000FF
+89D2DBFB84BF5C2E280970546B % -C997 - E638A62095F38023D2283E78702
+-89D2DBFB84BF5C2E280970546B / 61A4 - -FF000000FF000000FF000000FF
+-89D2DBFB84BF5C2E280970546B % 61A4 - -34B481D86FAFB098A492FE4F120F
+-89D2DBFB84BF5C2E280970546B / -EA04 - FF000000FF000000FF000000FF
+-89D2DBFB84BF5C2E280970546B % -EA04 - -539B30AE4E96A1AE85B9F3073A6F
index 562e77cb9f99b100ab934e11416955ddbd6478f6..33b8f08ae91ebaad795bd42720eb4cff5adac79a 100644 (file)
@@ -1,9 +1,9 @@
 -----BEGIN RSA PRIVATE KEY-----
-MIIBOgIBAAJBAMIvB0MXsW7gNKJp7/7fTjmd/vdXk51GcgIxergzS13i6nCAL+97
-vD7erU7M5s6kWCm4/U8Q6wcY7jwauiUO7iUCAwEAAQJBAIsOypCNYw8XmBnG64sF
-tysjrfbKzHcQf4x6intmoE42dSc1SkyJXvQiNcXaiS5bGBGrfRkabE8j4X9mmMd6
-S/ECIQD0YIYwjPYLDDJGa2kog42JSiEu15dAOcAJTsnhiHvKbwIhAMtrXLguHYKb
-ScrW/q8Uq+eRcMHwgbuBvnqmzAMln6qrAiAEctFehuJftxwfLgtfAm4MJr5N5PzK
-3YJCaR3BrkNanwIgNcJh9qr5UZMIpXq8RDkKVWCylA6jupJHbNK4B/zhfZECIB+9
-Is3OLPuWFJmk9eQcUaNQZJ5WwEBsaGQ12JeW7Kpe
+MIIBOwIBAAJBANRkqBhIy4l2LDZohAgbgsO+b0dtSfInKPpaA+SnD3x1UpOPSOjc
+Xqf97dqdjO9Kk6I+RO6/DbT3KyXMmzjRJ/sCAwEAAQJBAMfjC0f/in6OFsIFzuyK
+Z6Cs4rGIK2WYcTpb6PoSN8LaN0khhkn8PAua72FnTiRwLEyoBqwl+g/jNy8Dio8K
+47ECIQD8401+qBwqoIpSPX7lHwa0kO9wqFG6MVMF0jdhIWOgHQIhANcBx4yghPDl
+7WgtodDlqgwn+iKUUpZW2d3YF3MCoJz3AiAUZqXuzNMQ4UinX8yn4TviPzsBxKJr
+OeVvt8i97jqiRQIhANZRaMdN7pZuq0KwUd94PxQU+WpkrRo9Arj3QRCcqtsrAiAf
+ppDnmxlAEwjl8GOerlaKXUICnF7v3SjELP9tH9cQtA==
 -----END RSA PRIVATE KEY-----
index b20137b6e388d0eb8977747b25359a0fc5d85dc9..d2a9421f480984c4a4b9aa4a8906e1de741efac1 100644 (file)
@@ -2,8 +2,8 @@
 MIIBQjCB7QIBADCBhzELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQx
 ETAPBgNVBAcTCEJyaXNiYW5lMRowGAYDVQQKExFDcnlwdFNvZnQgUHR5IEx0ZDET
 MBEGA1UEAxMKRXJpYyBZb3VuZzEfMB0GCSqGSIb3DQEJARYQZWF5QG1pbmNvbS5v
-ei5hdTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDCLwdDF7Fu4DSiae/+3045nf73
-V5OdRnICMXq4M0td4upwgC/ve7w+3q1OzObOpFgpuP1PEOsHGO48GrolDu4lAgMB
-AAGgADANBgkqhkiG9w0BAQQFAANBAItCGg8qCPSoASvm3QUx/6PpreQclDO0bM2l
-eacLlzSHBUvaSqapR/pHfHG2r9l6PuEr/rrYHo+ZrAraSyPhEBc=
+ei5hdTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDUZKgYSMuJdiw2aIQIG4LDvm9H
+bUnyJyj6WgPkpw98dVKTj0jo3F6n/e3anYzvSpOiPkTuvw209yslzJs40Sf7AgMB
+AAGgADANBgkqhkiG9w0BAQQFAANBAES6okHo15lRtghclOyzSQ7pTUva8h5nxiKu
+62HR6t9kAIU1apoOdM/Rn1e6dF3+aZjpxY0uIdNg+q2VSyeBdsM=
 -----END CERTIFICATE REQUEST-----
diff --git a/times/091/486-50.nt b/times/091/486-50.nt
new file mode 100644 (file)
index 0000000..84820d9
--- /dev/null
@@ -0,0 +1,30 @@
+486-50 NT 4.0
+
+SSLeay 0.9.1a 06-Jul-1998
+built on Sat Jul 18 18:03:20 EST 1998
+options:bn(64,32) md2(int) rc4(idx,int) des(idx,cisc,4,long) idea(int) blowfish(ptr2)
+C flags:cl /MD /W3 /WX /G5 /Ox /O2 /Ob2 /Gs0 /GF /Gy /nologo -DWIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM /Fdout32
+The 'numbers' are in 1000s of bytes per second processed.
+type              8 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
+md2                 28.77k       80.30k      108.50k      118.98k      122.47k
+mdc2                51.52k       54.06k       54.54k       54.65k       54.62k
+md5                304.39k     1565.04k     3061.54k     3996.10k     4240.10k
+hmac(md5)          119.53k      793.23k     2061.29k     3454.95k     4121.76k
+sha1               127.51k      596.93k     1055.54k     1313.84k     1413.18k
+rmd160             128.50k      572.49k     1001.03k     1248.01k     1323.63k
+rc4               1224.40k     1545.11k     1590.29k     1600.20k     1576.90k
+des cbc            448.19k      503.45k      512.30k      513.30k      508.23k
+des ede3           148.66k      162.48k      163.68k      163.94k      164.24k
+idea cbc           194.18k      211.10k      212.99k      213.18k      212.64k
+rc2 cbc            245.78k      271.01k      274.12k      274.38k      273.52k
+rc5-32/12 cbc     1252.48k     1625.20k     1700.03k     1711.12k     1677.18k
+blowfish cbc       725.16k      828.26k      850.01k      846.99k      833.79k
+cast cbc           643.30k      717.22k      739.48k      741.57k      735.33k
+                  sign    verify    sign/s verify/s
+rsa  512 bits   0.0904s   0.0104s     11.1     96.2
+rsa 1024 bits   0.5968s   0.0352s      1.7     28.4
+rsa 2048 bits   3.8860s   0.1017s      0.3      9.8
+                  sign    verify    sign/s verify/s
+dsa  512 bits   0.1006s   0.1249s      9.9      8.0
+dsa 1024 bits   0.3306s   0.4093s      3.0      2.4
+dsa 2048 bits   0.9454s   1.1707s      1.1      0.9
diff --git a/times/091/586-100.lnx b/times/091/586-100.lnx
new file mode 100644 (file)
index 0000000..92892a6
--- /dev/null
@@ -0,0 +1,32 @@
+Pentium 100mhz, linux
+
+SSLeay 0.9.0a 14-Apr-1998
+built on Fri Apr 17 08:47:07 EST 1998
+options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) idea(int) blowfish(ptr2)
+C flags:gcc -DL_ENDIAN -DTERMIO -DBN_ASM -O3 -fomit-frame-pointer -m486 -Wall -Wuninitialized -DSHA1_ASM -DMD5_ASM -DRMD160_ASM
+The 'numbers' are in 1000s of bytes per second processed.
+type              8 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
+md2                 56.65k      153.88k      208.47k      229.03k      237.57k
+mdc2               189.59k      204.95k      206.93k      208.90k      209.56k
+md5               1019.48k     5882.41k    12085.42k    16376.49k    18295.47k
+hmac(md5)          415.86k     2887.85k     7891.29k    13894.66k    17446.23k
+sha1               540.68k     2791.96k     5289.30k     6813.01k     7432.87k
+rmd160             298.37k     1846.87k     3869.10k     5273.94k     5892.78k
+rc4               7870.87k    10438.10k    10857.13k    10729.47k    10788.86k
+des cbc           1960.60k     2226.37k     2241.88k     2054.83k     2181.80k
+des ede3           734.44k      739.69k      779.43k      750.25k      772.78k
+idea cbc           654.07k      711.00k      716.89k      718.51k      720.90k
+rc2 cbc            648.83k      701.91k      708.61k      708.95k      709.97k
+rc5-32/12 cbc     3504.71k     4054.76k     4131.41k     4105.56k     4134.23k
+blowfish cbc      3762.25k     4313.79k     4460.54k     4356.78k     4317.18k
+cast cbc          2755.01k     3038.91k     3076.44k     3027.63k     2998.27k
+                  sign    verify    sign/s verify/s
+rsa  512 bits   0.0195s   0.0019s     51.4    519.9
+rsa 1024 bits   0.1000s   0.0059s     10.0    168.2
+rsa 2048 bits   0.6406s   0.0209s      1.6     47.8
+rsa 4096 bits   4.6100s   0.0787s      0.2     12.7
+                  sign    verify    sign/s verify/s
+dsa  512 bits   0.0188s   0.0360s     53.1     27.8
+dsa 1024 bits   0.0570s   0.1126s     17.5      8.9
+dsa 2048 bits   0.1990s   0.3954s      5.0      2.5
+
diff --git a/times/091/68000.bsd b/times/091/68000.bsd
new file mode 100644 (file)
index 0000000..a3a14e8
--- /dev/null
@@ -0,0 +1,32 @@
+Motorolla 68020 20mhz, NetBSD
+
+SSLeay 0.9.0t 29-May-1998
+built on Fri Jun  5 12:42:23 EST 1998
+options:bn(64,32) md2(char) rc4(idx,int) des(idx,cisc,16,long) idea(int) blowfish(idx) 
+C flags:gcc -DTERMIOS -O3 -fomit-frame-pointer -Wall -DB_ENDIAN
+The 'numbers' are in 1000s of bytes per second processed.
+type              8 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
+md2               2176.00      5994.67      8079.73      8845.18      9077.01 
+mdc2              5730.67      6122.67      6167.66      6176.51      6174.87 
+md5                 29.10k      127.31k      209.66k      250.50k      263.99k
+hmac(md5)           12.33k       73.02k      160.17k      228.04k      261.15k
+sha1                11.27k       49.37k       84.31k      102.40k      109.23k
+rmd160              11.69k       48.62k       78.76k       93.15k       98.41k
+rc4                117.96k      148.94k      152.57k      153.09k      152.92k
+des cbc             27.13k       30.06k       30.38k       30.38k       30.53k
+des ede3            10.51k       10.94k       11.01k       11.01k       11.01k
+idea cbc            26.74k       29.23k       29.45k       29.60k       29.74k
+rc2 cbc             34.27k       39.39k       40.03k       40.07k       40.16k
+rc5-32/12 cbc       64.31k       83.18k       85.70k       86.70k       87.09k
+blowfish cbc        48.86k       59.18k       60.07k       60.42k       60.78k
+cast cbc            42.67k       50.01k       50.86k       51.20k       51.37k
+                  sign    verify    sign/s verify/s
+rsa  512 bits   0.7738s   0.0774s      1.3     12.9
+rsa 1024 bits   4.3967s   0.2615s      0.2      3.8
+rsa 2048 bits  29.5200s   0.9664s      0.0      1.0
+                  sign    verify    sign/s verify/s
+dsa  512 bits   0.7862s   0.9709s      1.3      1.0
+dsa 1024 bits   2.5375s   3.1625s      0.4      0.3
+dsa 2048 bits   9.2150s  11.8200s      0.1      0.1
+
+
diff --git a/times/091/686-200.lnx b/times/091/686-200.lnx
new file mode 100644 (file)
index 0000000..bb857d4
--- /dev/null
@@ -0,0 +1,32 @@
+Pentium Pro 200mhz, linux
+
+SSLeay 0.9.0d 26-Apr-1998
+built on Sun Apr 26 10:25:33 EST 1998
+options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) idea(int) blowfish(ptr2) 
+C flags:gcc -DL_ENDIAN -DTERMIO -DBN_ASM -O3 -fomit-frame-pointer -m486 -Wall -Wuninitialized -DSHA1_ASM -DMD5_ASM -DRMD160_ASM
+The 'numbers' are in 1000s of bytes per second processed.
+type              8 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
+md2                130.58k      364.54k      499.24k      545.79k      561.66k
+mdc2               526.68k      579.72k      588.37k      588.80k      589.82k
+md5               1917.71k    11434.69k    22512.21k    29495.30k    32677.89k
+hmac(md5)          749.18k     5264.83k    14227.20k    25018.71k    31760.38k
+sha1              1343.83k     6436.29k    11702.78k    14664.70k    15829.67k
+rmd160            1038.05k     5138.77k     8985.51k    10985.13k    11799.21k
+rc4              14891.04k    21334.06k    22376.79k    22579.54k    22574.42k
+des cbc           4131.97k     4568.31k     4645.29k     4631.21k     4572.73k
+des ede3          1567.17k     1631.13k     1657.32k     1653.08k     1643.86k
+idea cbc          2427.23k     2671.21k     2716.67k     2723.84k     2733.40k
+rc2 cbc           1629.90k     1767.38k     1788.50k     1797.12k     1799.51k
+rc5-32/12 cbc    10290.55k    13161.60k    13744.55k    14011.73k    14123.01k
+blowfish cbc      5896.42k     6920.77k     7122.01k     7151.62k     7146.15k
+cast cbc          6037.71k     6935.19k     7101.35k     7145.81k     7116.12k
+                  sign    verify    sign/s verify/s
+rsa  512 bits   0.0070s   0.0007s    142.6   1502.9
+rsa 1024 bits   0.0340s   0.0019s     29.4    513.3
+rsa 2048 bits   0.2087s   0.0066s      4.8    151.3
+rsa 4096 bits   1.4700s   0.0242s      0.7     41.2
+                  sign    verify    sign/s verify/s
+dsa  512 bits   0.0064s   0.0121s    156.1     82.9
+dsa 1024 bits   0.0184s   0.0363s     54.4     27.5
+dsa 2048 bits   0.0629s   0.1250s     15.9      8.0
+
diff --git a/times/091/alpha064.osf b/times/091/alpha064.osf
new file mode 100644 (file)
index 0000000..a8e7fdf
--- /dev/null
@@ -0,0 +1,32 @@
+Alpha EV4.5 (21064) 275mhz, OSF1 V4.0
+SSLeay 0.9.0g 01-May-1998
+built on Mon May  4 17:26:09 CST 1998
+options:bn(64,64) md2(int) rc4(ptr,int) des(idx,cisc,4,long) idea(int) blowfish(idx) 
+C flags:cc -tune host -O4 -readonly_strings
+The 'numbers' are in 1000s of bytes per second processed.
+type              8 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
+md2                119.58k      327.48k      443.28k      480.09k      495.16k
+mdc2               436.67k      456.35k      465.42k      466.57k      469.01k
+md5               1459.34k     6566.46k    11111.91k    13375.30k    14072.60k
+hmac(md5)          597.90k     3595.45k     8180.88k    12099.49k    13884.46k
+sha1               707.01k     3253.09k     6131.73k     7798.23k     8439.67k
+rmd160             618.57k     2729.07k     4711.33k     5825.16k     6119.23k
+rc4               8796.43k     9393.62k     9548.88k     9378.77k     9472.57k
+des cbc           2165.97k     2514.90k     2586.27k     2572.93k     2639.08k
+des ede3           945.44k     1004.03k     1005.96k     1017.33k     1020.85k
+idea cbc          1498.81k     1629.11k     1637.28k     1625.50k     1641.11k
+rc2 cbc           1866.00k     2044.92k     2067.12k     2064.00k     2068.96k
+rc5-32/12 cbc     4366.97k     5521.32k     5687.50k     5729.16k     5736.96k
+blowfish cbc      3997.31k     4790.60k     4937.84k     4954.56k     5024.85k
+cast cbc          2900.19k     3673.30k     3803.73k     3823.93k     3890.25k
+                  sign    verify    sign/s verify/s
+rsa  512 bits   0.0069s   0.0006s    144.2   1545.8
+rsa 1024 bits   0.0304s   0.0018s     32.9    552.6
+rsa 2048 bits   0.1887s   0.0062s      5.3    161.4
+rsa 4096 bits   1.3667s   0.0233s      0.7     42.9
+                  sign    verify    sign/s verify/s
+dsa  512 bits   0.0067s   0.0123s    149.6     81.1
+dsa 1024 bits   0.0177s   0.0332s     56.6     30.1
+dsa 2048 bits   0.0590s   0.1162s     16.9      8.6
+
+
diff --git a/times/091/alpha164.lnx b/times/091/alpha164.lnx
new file mode 100644 (file)
index 0000000..c994662
--- /dev/null
@@ -0,0 +1,32 @@
+Alpha EV5.6 (21164A) 533mhz, Linux 2.0.32
+
+SSLeay 0.9.0p 22-May-1998
+built on Sun May 27 14:23:38 GMT 2018
+options:bn(64,64) md2(int) rc4(ptr,int) des(idx,risc1,16,long) idea(int) blowfish(idx) 
+C flags:gcc -O3
+The 'numbers' are in 1000s of bytes per second processed.
+type              8 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
+md2                295.78k      825.34k     1116.42k     1225.10k     1262.65k
+mdc2               918.16k     1017.55k     1032.18k     1034.24k     1035.60k
+md5               3574.93k    15517.05k    25482.67k    30434.31k    32210.51k
+hmac(md5)         1261.54k     7757.15k    18025.46k    27081.21k    31653.27k
+sha1              2251.89k    10056.84k    16990.19k    20651.04k    21973.29k
+rmd160            1615.49k     7017.13k    11601.11k    13875.62k    14690.31k
+rc4              22435.16k    24476.40k    24349.95k    23042.36k    24581.53k
+des cbc           5198.38k     6559.04k     6775.43k     6827.87k     6875.82k
+des ede3          2257.73k     2602.18k     2645.60k     2657.12k     2670.59k
+idea cbc          3694.42k     4125.61k     4180.74k     4193.28k     4192.94k
+rc2 cbc           4642.47k     5323.85k     5415.42k     5435.86k     5434.03k
+rc5-32/12 cbc     9705.26k    13277.79k    13843.46k    13989.66k    13987.57k
+blowfish cbc      7861.28k    10852.34k    11447.98k    11616.97k    11667.54k
+cast cbc          6718.13k     8599.98k     8967.17k     9070.81k     9099.28k
+                  sign    verify    sign/s verify/s
+rsa  512 bits   0.0018s   0.0002s    555.9   6299.5
+rsa 1024 bits   0.0081s   0.0005s    123.3   2208.7
+rsa 2048 bits   0.0489s   0.0015s     20.4    648.5
+rsa 4096 bits   0.3402s   0.0057s      2.9    174.7
+                  sign    verify    sign/s verify/s
+dsa  512 bits   0.0019s   0.0032s    529.0    310.2
+dsa 1024 bits   0.0047s   0.0086s    214.1    115.7
+dsa 2048 bits   0.0150s   0.0289s     66.7     34.6
+
diff --git a/times/091/alpha164.osf b/times/091/alpha164.osf
new file mode 100644 (file)
index 0000000..df712c6
--- /dev/null
@@ -0,0 +1,31 @@
+Alpha EV5.6 (21164A) 400mhz, OSF1 V4.0
+
+SSLeay 0.9.0 10-Apr-1998
+built on Sun Apr 19 07:54:37 EST 1998
+options:bn(64,64) md2(int) rc4(ptr,int) des(ptr,risc2,4,int) idea(int) blowfish(idx) 
+C flags:cc -O4 -tune host -fast
+The 'numbers' are in 1000s of bytes per second processed.
+type              8 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
+md2                276.30k      762.07k     1034.35k     1134.07k     1160.53k
+mdc2               814.99k      845.83k      849.09k      850.33k      849.24k
+md5               2468.43k    10945.27k    17963.48k    21430.89k    22544.38k
+hmac(md5)         1002.48k     6023.98k    13430.99k    19344.17k    22351.80k
+sha1              1984.93k     8882.47k    14856.47k    17878.70k    18955.10k
+rmd160            1286.96k     5595.52k     9167.00k    10957.74k    11582.30k
+rc4              15948.15k    16710.29k    16793.20k    17929.50k    18474.56k
+des cbc           3416.04k     4149.37k     4296.25k     4328.89k     4327.57k
+des ede3          1540.14k     1683.36k     1691.14k     1705.90k     1705.22k
+idea cbc          2795.87k     3192.93k     3238.13k     3238.17k     3256.66k
+rc2 cbc           3529.00k     4069.93k     4135.79k     4135.25k     4160.07k
+rc5-32/12 cbc     7212.35k     9849.71k    10260.91k    10423.38k    10439.99k
+blowfish cbc      6061.75k     8363.50k     8706.80k     8779.40k     8784.55k
+cast cbc          5401.75k     6433.31k     6638.18k     6662.40k     6702.80k
+                  sign    verify    sign/s verify/s
+rsa  512 bits   0.0022s   0.0002s    449.6   4916.2
+rsa 1024 bits   0.0105s   0.0006s     95.3   1661.2
+rsa 2048 bits   0.0637s   0.0020s     15.7    495.6
+rsa 4096 bits   0.4457s   0.0075s      2.2    132.7
+                  sign    verify    sign/s verify/s
+dsa  512 bits   0.0028s   0.0048s    362.2    210.4
+dsa 1024 bits   0.0064s   0.0123s    155.2     81.6
+dsa 2048 bits   0.0201s   0.0394s     49.7     25.4
diff --git a/times/091/mips-rel.pl b/times/091/mips-rel.pl
new file mode 100644 (file)
index 0000000..18068d7
--- /dev/null
@@ -0,0 +1,21 @@
+print "CPU type            512   1024   2048   4096\n";
+
+&doit(100,"Pentium   100 32",0.0195,0.1000,0.6406,4.6100);     # pentium-100
+&doit(200,"PPro      200 32",0.0070,0.0340,0.2087,1.4700);     # pentium-100
+&doit( 25,"R3000      25 32",0.0860,0.4825,3.2417,23.8833);    # R3000-25
+&doit(200,"R4400     200 32",0.0137,0.0717,0.4730,3.4367);     # R4400 32bit
+&doit(180,"R10000    180 32",0.0061,0.0311,0.1955,1.3871);     # R10000 32bit
+&doit(180,"R10000    180 64",0.0034,0.0149,0.0880,0.5933);     # R10000 64bit
+&doit(400,"DEC 21164 400 64",0.0022,0.0105,0.0637,0.4457);     # R10000 64bit
+
+sub doit
+       {
+       local($mhz,$label,@data)=@_;
+
+       for ($i=0; $i <= $#data; $i++)
+               {
+               $data[$i]=1/$data[$i]*200/$mhz;
+               }
+       printf("%s %6.1f %6.1f %6.1f %6.1f\n",$label,@data);
+       }
+
diff --git a/times/091/r10000.irx b/times/091/r10000.irx
new file mode 100644 (file)
index 0000000..237ee5d
--- /dev/null
@@ -0,0 +1,37 @@
+MIPS R10000 32kI+32kD 180mhz, IRIX 6.4
+
+Using crypto/bn/mips3.s
+
+This is built for n32, which is faster for all benchmarks than the n64
+compilation model
+
+SSLeay 0.9.0b 19-Apr-1998
+built on Sat Apr 25 12:43:14 EST 1998
+options:bn(64,64) md2(int) rc4(ptr,int) des(ptr,risc2,16,long) idea(int) blowfish(ptr) 
+C flags:cc -use_readonly_const -O2 -DTERMIOS -DB_ENDIAN
+The 'numbers' are in 1000s of bytes per second processed.
+type              8 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
+md2                126.38k      349.38k      472.67k      517.01k      529.81k
+mdc2               501.64k      545.87k      551.80k      553.64k      554.41k
+md5               1825.77k     7623.64k    12630.47k    15111.74k    16012.09k
+hmac(md5)          780.81k     4472.86k     9667.22k    13802.67k    15777.89k
+sha1              1375.52k     6213.91k    11037.30k    13682.01k    14714.09k
+rmd160             856.72k     3454.40k     5598.33k     6689.94k     7073.48k
+rc4              11260.93k    13311.50k    13360.05k    13322.17k    13364.39k
+des cbc           2770.78k     3055.42k     3095.18k     3092.48k     3103.03k
+des ede3          1023.22k     1060.58k     1063.81k     1070.37k     1064.54k
+idea cbc          3029.09k     3334.30k     3375.29k     3375.65k     3380.64k
+rc2 cbc           2307.45k     2470.72k     2501.25k     2500.68k     2500.55k
+rc5-32/12 cbc     6770.91k     8629.89k     8909.58k     9009.64k     9044.95k
+blowfish cbc      4796.53k     5598.20k     5717.14k     5755.11k     5749.86k
+cast cbc          3986.20k     4426.17k     4465.04k     4476.84k     4475.08k
+                  sign    verify    sign/s verify/s
+rsa  512 bits   0.0034s   0.0003s    296.1   3225.4
+rsa 1024 bits   0.0139s   0.0008s     71.8   1221.8
+rsa 2048 bits   0.0815s   0.0026s     12.3    380.3
+rsa 4096 bits   0.5656s   0.0096s      1.8    103.7
+                  sign    verify    sign/s verify/s
+dsa  512 bits   0.0034s   0.0061s    290.8    164.9
+dsa 1024 bits   0.0084s   0.0161s    119.1     62.3
+dsa 2048 bits   0.0260s   0.0515s     38.5     19.4
+
diff --git a/times/091/r3000.ult b/times/091/r3000.ult
new file mode 100644 (file)
index 0000000..ecd3390
--- /dev/null
@@ -0,0 +1,32 @@
+MIPS R3000 64kI+64kD 25mhz, ultrix 4.3
+
+SSLeay 0.9.0b 19-Apr-1998
+built on Thu Apr 23 07:22:31 EST 1998
+options:bn(32,32) md2(int) rc4(ptr,int) des(ptr,risc2,16,long) idea(int) blowfish(idx) 
+C flags:cc -O2 -DL_ENDIAN -DNOPROTO -DNOCONST
+The 'numbers' are in 1000s of bytes per second processed.
+type              8 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
+md2                 14.63k       40.65k       54.70k       60.07k       61.78k
+mdc2                29.43k       37.27k       38.23k       38.57k       38.60k
+md5                140.04k      676.59k     1283.84k     1654.10k     1802.24k
+hmac(md5)           60.51k      378.90k      937.82k     1470.46k     1766.74k
+sha1                60.77k      296.79k      525.40k      649.90k      699.05k
+rmd160              48.82k      227.16k      417.19k      530.31k      572.05k
+rc4                904.76k      996.20k     1007.53k     1015.65k     1010.35k
+des cbc            178.87k      209.39k      213.42k      215.55k      214.53k
+des ede3            74.25k       79.30k       80.40k       80.21k       80.14k
+idea cbc           181.02k      209.37k      214.44k      214.36k      213.83k
+rc2 cbc            161.52k      184.98k      187.99k      188.76k      189.05k
+rc5-32/12 cbc      398.99k      582.91k      614.66k      626.07k      621.87k
+blowfish cbc       296.38k      387.69k      405.50k      412.57k      410.05k
+cast cbc           214.76k      260.63k      266.92k      268.63k      258.26k
+                  sign    verify    sign/s verify/s
+rsa  512 bits   0.0870s   0.0089s     11.5    112.4
+rsa 1024 bits   0.4881s   0.0295s      2.0     33.9
+rsa 2048 bits   3.2750s   0.1072s      0.3      9.3
+rsa 4096 bits  23.9833s   0.4093s      0.0      2.4
+                  sign    verify    sign/s verify/s
+dsa  512 bits   0.0898s   0.1706s     11.1      5.9
+dsa 1024 bits   0.2847s   0.5565s      3.5      1.8
+dsa 2048 bits   1.0267s   2.0433s      1.0      0.5
+
diff --git a/times/091/r4400.irx b/times/091/r4400.irx
new file mode 100644 (file)
index 0000000..9b96ca1
--- /dev/null
@@ -0,0 +1,32 @@
+R4400 16kI+16kD 200mhz, Irix 5.3
+
+SSLeay 0.9.0e 27-Apr-1998
+built on Sun Apr 26 07:26:05 PDT 1998
+options:bn(64,32) md2(int) rc4(ptr,int) des(ptr,risc2,16,long) idea(int) blowfish(ptr) 
+C flags:cc -O2 -use_readonly_const -DTERMIOS -DB_ENDIAN
+The 'numbers' are in 1000s of bytes per second processed.
+type              8 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
+md2                 79.80k      220.59k      298.01k      327.06k      338.60k
+mdc2               262.74k      285.30k      289.16k      288.36k      288.49k
+md5                930.35k     4167.13k     7167.91k     8678.23k     9235.86k
+hmac(md5)          399.44k     2367.57k     5370.74k     7884.28k     9076.98k
+sha1               550.96k     2488.17k     4342.76k     5362.50k     5745.40k
+rmd160             424.58k     1752.83k     2909.67k     3486.08k     3702.89k
+rc4               6687.79k     7834.63k     7962.61k     8035.65k     7915.28k
+des cbc           1544.20k     1725.94k     1748.35k     1758.17k     1745.61k
+des ede3           587.29k      637.75k      645.93k      643.17k      646.01k
+idea cbc          1575.52k     1719.75k     1732.41k     1736.69k     1740.11k
+rc2 cbc           1496.21k     1629.90k     1643.19k     1652.14k     1646.62k
+rc5-32/12 cbc     3452.48k     4276.47k     4390.74k     4405.25k     4400.12k
+blowfish cbc      2354.58k     3242.36k     3401.11k     3433.65k     3383.65k
+cast cbc          1942.22k     2152.28k     2187.51k     2185.67k     2177.20k
+                  sign    verify    sign/s verify/s
+rsa  512 bits   0.0130s   0.0014s     76.9    729.8
+rsa 1024 bits   0.0697s   0.0043s     14.4    233.9
+rsa 2048 bits   0.4664s   0.0156s      2.1     64.0
+rsa 4096 bits   3.4067s   0.0586s      0.3     17.1
+                  sign    verify    sign/s verify/s
+dsa  512 bits   0.0140s   0.0261s     71.4     38.4
+dsa 1024 bits   0.0417s   0.0794s     24.0     12.6
+dsa 2048 bits   0.1478s   0.2929s      6.8      3.4
+
index cd4e26a49be393ee2826ac3827ebe7c99062c4fa..99ab7ebaa18777d81cea29d7034382dad2712067 100644 (file)
@@ -4,7 +4,7 @@
 # on the command line.
 #
 
-if [ "$SSLEAY"x = "x" -o ! -x $SSLEAY ]; then
+if [ "$SSLEAY"x = "x" -o ! -x "$SSLEAY" ]; then
        SSLEAY='ssleay'
        export SSLEAY
 fi
index 3af91744c5f2bfee1f5f5651c08ea23b905879d8..7a24d6c5a2e2909b7d0aff27e876933636d3d428 100755 (executable)
@@ -40,5 +40,6 @@ foreach $file (@ARGV)
        #               print "$func:$1\n";
                        }
                }
+       close(IN);
         }
 
diff --git a/util/f.mak b/util/f.mak
new file mode 100644 (file)
index 0000000..e69de29
index fcaf2542872426d966cd7f7c33b8824e473e4c0f..2d5e55ad48df7fc85e34115efcf7969f221f82d3 100755 (executable)
@@ -580,7 +580,7 @@ X509_NAME_oneline                   585
 X509_NAME_print                                586
 X509_NAME_set                          587
 X509_OBJECT_free_contents              588
-X509_OBJECT_retrive_by_subject         589
+X509_OBJECT_retrieve_by_subject                589
 X509_OBJECT_up_ref_count               590
 X509_PKEY_free                         591
 X509_PKEY_new                          592
@@ -695,12 +695,12 @@ a2i_ASN1_INTEGER                  700
 a2i_ASN1_STRING                                701
 asn1_Finish                            702
 asn1_GetSequence                       703
-bn_div64                               704
+bn_div_words                           704
 bn_expand2                             705
 bn_mul_add_words                       706
 bn_mul_words                           707
-bn_qadd                                        708
-bn_qsub                                        709
+BN_uadd                                        708
+BN_usub                                        709
 bn_sqr_words                           710
 crypt                                  711
 d2i_ASN1_BIT_STRING                    712
@@ -1063,3 +1063,64 @@ EVP_rc5_32_12_16_cfb                     1088
 EVP_rc5_32_12_16_ecb                   1089
 EVP_rc5_32_12_16_ofb                   1090
 asn1_add_error                         1091
+d2i_ASN1_BMPSTRING                     1092
+i2d_ASN1_BMPSTRING                     1093
+BIO_f_ber                              1094
+BN_init                                        1095
+COMP_CTX_new                           1096
+COMP_CTX_free                          1097
+COMP_CTX_compress_block                        1098
+COMP_CTX_expand_block                  1099
+X509_STORE_CTX_get_ex_new_index                1100
+OBJ_NAME_add                           1101
+BIO_socket_nbio                                1102
+EVP_rc2_64_cbc                         1103
+OBJ_NAME_cleanup                       1104
+OBJ_NAME_get                           1105
+OBJ_NAME_init                          1106
+OBJ_NAME_new_index                     1107
+OBJ_NAME_remove                                1108
+BN_MONT_CTX_copy                       1109
+BIO_new_socks4a_connect                        1110
+BIO_s_socks4a_connect                  1111
+PROXY_set_connect_mode                 1112
+RAND_SSLeay                            1113
+RAND_set_rand_method                   1114
+RSA_memory_lock                                1115
+bn_sub_words                           1116
+bn_mul_normal                          1117
+bn_mul_comba8                          1118
+bn_mul_comba4                          1119
+bn_sqr_normal                          1120
+bn_sqr_comba8                          1121
+bn_sqr_comba4                          1122
+bn_cmp_words                           1123
+bn_mul_recursive                       1124
+bn_mul_part_recursive                  1125
+bn_sqr_recursive                       1126
+bn_mul_low_normal                      1127
+BN_RECP_CTX_init                       1128
+BN_RECP_CTX_new                                1129
+BN_RECP_CTX_free                       1130
+BN_RECP_CTX_set                                1131
+BN_mod_mul_reciprocal                  1132
+BN_mod_exp_recp                                1133
+BN_div_recp                            1134
+BN_CTX_init                            1135
+BN_MONT_CTX_init                       1136
+RAND_get_rand_method                   1137
+PKCS7_add_attribute                    1138
+PKCS7_add_signed_attribute             1139
+PKCS7_digest_from_attributes           1140
+PKCS7_get_attribute                    1141
+PKCS7_get_issuer_and_serial            1142
+PKCS7_get_signed_attribute             1143
+COMP_compress_block                    1144
+COMP_expand_block                      1145
+COMP_rle                               1146
+COMP_zlib                              1147
+ms_time_diff                           1148
+ms_time_new                            1149
+ms_time_free                           1150
+ms_time_cmp                            1151
+ms_time_get                            1152
index 6f0881a2999e572d7e257efb3a8702e2932e292b..8992d1683d2ed10df7a4d6c3eb98360136798464 100755 (executable)
@@ -21,11 +21,12 @@ $infile="MINFO";
        "BC-W31",  "Borland C++ 4.5 - Windows 3.1 - PROBABLY NOT WORKING",
        "BC-MSDOS","Borland C++ 4.5 - MSDOS",
        "linux-elf","Linux elf",
+       "ultrix-mips","DEC mips ultrix",
        "FreeBSD","FreeBSD distribution",
        "default","cc under unix",
        );
 
-$type="";
+$platform="";
 foreach (@ARGV)
        {
        if    (/^no-rc2$/)      { $no_rc2=1; }
@@ -53,7 +54,7 @@ foreach (@ARGV)
 
        elsif (/^just-ssl$/)    { $no_rc2=$no_idea=$no_des=$no_bf=$no_cast=1;
                                  $no_md2=$no_sha=$no_mdc2=$no_dsa=$no_dh=1;
-                                 $no_ssl2=$no_err=1; }
+                                 $no_ssl2=$no_err=$no_rmd160=$no_rc5=1; }
 
        elsif (/^rsaref$/)      { $rsaref=1; }
        elsif (/^gcc$/)         { $gcc=1; }
@@ -98,7 +99,7 @@ TMP=tmpdir OUT=outdir SRC=srcdir BIN=binpath INC=header-outdir CC=C-compiler
 EOF
                        exit(1);
                        }
-               $type=$_;
+               $platform=$_;
                }
        }
 
@@ -126,61 +127,67 @@ $bin_dir=(defined($VARS{'BIN'}))?$VARS{'BIN'}:'';
 # $bin_dir.=$o causes a core dump on my sparc :-(
 
 push(@INC,"util/pl","pl");
-if ($type eq "VC-MSDOS")
+if ($platform eq "VC-MSDOS")
        {
        $asmbits=16;
        $msdos=1;
        require 'VC-16.pl';
        }
-elsif ($type eq "VC-W31-16")
+elsif ($platform eq "VC-W31-16")
        {
        $asmbits=16;
        $msdos=1; $win16=1;
        require 'VC-16.pl';
        }
-elsif (($type eq "VC-W31-32") || ($type eq "VC-WIN16"))
+elsif (($platform eq "VC-W31-32") || ($platform eq "VC-WIN16"))
        {
        $asmbits=32;
        $msdos=1; $win16=1;
        require 'VC-16.pl';
        }
-elsif (($type eq "VC-WIN32") || ($type eq "VC-NT"))
+elsif (($platform eq "VC-WIN32") || ($platform eq "VC-NT"))
        {
        require 'VC-32.pl';
        }
-elsif ($type eq "BC-NT")
+elsif ($platform eq "BC-NT")
        {
        $bc=1;
        require 'BC-32.pl';
        }
-elsif ($type eq "BC-W31")
+elsif ($platform eq "BC-W31")
        {
        $bc=1;
        $msdos=1; $w16=1;
        require 'BC-16.pl';
        }
-elsif ($type eq "BC-Q16")
+elsif ($platform eq "BC-Q16")
        {
        $msdos=1; $w16=1; $shlib=0; $qw=1;
        require 'BC-16.pl';
        }
-elsif ($type eq "BC-MSDOS")
+elsif ($platform eq "BC-MSDOS")
        {
        $asmbits=16;
        $msdos=1;
        require 'BC-16.pl';
        }
-elsif ($type eq "FreeBSD")
+elsif ($platform eq "FreeBSD")
        {
        require 'unix.pl';
        $cflags='-DTERMIO -D_ANSI_SOURCE -O2 -fomit-frame-pointer';
        }
-elsif ($type eq "linux-elf")
+elsif ($platform eq "linux-elf")
        {
        require "unix.pl";
        require "linux.pl";
        $unix=1;
        }
+elsif ($platform eq "ultrix-mips")
+       {
+       require "unix.pl";
+       require "ultrix.pl";
+       $unix=1;
+       }
 else
        {
        require "unix.pl";
@@ -230,7 +237,7 @@ if ($ranlib ne "")
 
 if ($msdos)
        {
-       $banner ="\t\@echo Make sure you have run 'perl Configure $type' in the\n";
+       $banner ="\t\@echo Make sure you have run 'perl Configure $platform' in the\n";
        $banner.="\t\@echo top level directory, if you don't have perl, you will\n";
        $banner.="\t\@echo need to probably edit crypto/bn/bn.h, check the\n";
        $banner.="\t\@echo documentation for details.\n";
@@ -258,6 +265,7 @@ $defs= <<"EOF";
 INSTALLTOP=$INSTALLTOP
 
 # Set your compiler options
+PLATFORM=$platform
 CC=$bin_dir${cc}
 CFLAG=$cflags
 APP_CFLAG=$app_cflag
@@ -275,12 +283,10 @@ SRC_D=$src_dir
 LINK=$link
 LFLAGS=$lflags
 
-BN_MULW_OBJ=$bn_mulw_obj
-BN_MULW_SRC=$bn_mulw_src
+BN_ASM_OBJ=$bn_asm_obj
+BN_ASM_SRC=$bn_asm_src
 DES_ENC_OBJ=$des_enc_obj
 DES_ENC_SRC=$des_enc_src
-DES_CRYPT_OBJ=$des_crypt_obj
-DES_CRYPT_SRC=$des_crypt_src
 BF_ENC_OBJ=$bf_enc_obj
 BF_ENC_SRC=$bf_enc_src
 CAST_ENC_OBJ=$cast_enc_obj
@@ -496,10 +502,10 @@ foreach (values %lib_nam)
                next;
                }
 
-       if (($bn_mulw_obj ne "") && ($_ eq "CRYPTO"))
+       if (($bn_asm_obj ne "") && ($_ eq "CRYPTO"))
                {
-               $lib_obj =~ s/\s\S*\/bn_mulw\S*/ \$(BN_MULW_OBJ)/;
-               $rules.=&do_asm_rule($bn_mulw_obj,$bn_mulw_src);
+               $lib_obj =~ s/\s\S*\/bn_asm\S*/ \$(BN_ASM_OBJ)/;
+               $rules.=&do_asm_rule($bn_asm_obj,$bn_asm_src);
                }
        if (($des_enc_obj ne "") && ($_ eq "CRYPTO"))
                {
@@ -615,6 +621,7 @@ sub var_add
 
        @a=grep(!/(^md2)|(_md2$)/,@a) if $no_md2;
        @a=grep(!/(^md5)|(_md5$)/,@a) if $no_md5;
+       @a=grep(!/(rmd)|(ripemd)/,@a) if $no_rmd160;
 
        @a=grep(!/(^d2i_r_)|(^i2d_r_)/,@a) if $no_rsa;
        @a=grep(!/(^p_open$)|(^p_seal$)/,@a) if $no_rsa;
@@ -677,7 +684,7 @@ sub do_defs
                if (($_ =~ /bss_file/) && ($postfix eq ".h"))
                        { $pf=".c"; }
                else    { $pf=$postfix; }
-               if ($_ =~ /BN_MULW/)    { $t="$_ "; }
+               if ($_ =~ /BN_ASM/)     { $t="$_ "; }
                elsif ($_ =~ /DES_ENC/) { $t="$_ "; }
                elsif ($_ =~ /BF_ENC/)  { $t="$_ "; }
                elsif ($_ =~ /CAST_ENC/){ $t="$_ "; }
@@ -704,23 +711,6 @@ sub bname
        return($ret);
        }
 
-# do a rule for each file that says 'copy' to new direcory on change
-sub do_copy_rule
-       {
-       local($to,$files,$p)=@_;
-       local($ret,$_,$n,$pp);
-       
-       $files =~ s/\//$o/g if $o ne '/';
-       foreach (split(/\s+/,$files))
-               {
-               $n=&bname($_);
-               if ($n =~ /bss_file/)
-                       { $pp=".c"; }
-               else    { $pp=$p; }
-               $ret.="$to${o}$n$pp: \$(SRC_D)$o$_$pp\n\t\$(CP) \$(SRC_D)$o$_$pp $to${o}$n$pp\n\n";
-               }
-       return($ret);
-       }
 
 ##############################################################
 # do a rule for each file that says 'compile' to new direcory
@@ -747,7 +737,7 @@ sub cc_compile_target
        local($ret);
        
        # EAY EAY
-       $ex_flags.=' -DCFLAGS="\"$(CC) $(CFLAG)\""' if ($source =~ /cversion/);
+       $ex_flags.=' -DCFLAGS="\"$(CC) $(CFLAG)\"" -DPLATFORM="\"$(PLATFORM)\""' if ($source =~ /cversion/);
        $target =~ s/\//$o/g if $o ne "/";
        $source =~ s/\//$o/g if $o ne "/";
        $ret ="$target: \$(SRC_D)$o$source\n\t";
@@ -791,3 +781,20 @@ sub do_shlib_rule
        return($ret);
        }
 
+# do a rule for each file that says 'copy' to new direcory on change
+sub do_copy_rule
+       {
+       local($to,$files,$p)=@_;
+       local($ret,$_,$n,$pp);
+       
+       $files =~ s/\//$o/g if $o ne '/';
+       foreach (split(/\s+/,$files))
+               {
+               $n=&bname($_);
+               if ($n =~ /bss_file/)
+                       { $pp=".c"; }
+               else    { $pp=$p; }
+               $ret.="$to${o}$n$pp: \$(SRC_D)$o$_$pp\n\t\$(CP) \$(SRC_D)$o$_$pp $to${o}$n$pp\n\n";
+               }
+       return($ret);
+       }
index b8e99f012d704833841756fca5c73872a0050465..0d66a909997bdd7e14ecd1750c57d8c17405aa3f 100755 (executable)
@@ -67,6 +67,8 @@ $crypto.=" crypto/x509/x509.h";
 $crypto.=" crypto/x509/x509_vfy.h";
 $crypto.=" crypto/rand/rand.h";
 $crypto.=" crypto/hmac/hmac.h";
+$crypto.=" crypto/comp/comp.h";
+$crypto.=" crypto/tmdiff.h";
 
 $match{'NOPROTO'}=1;
 $match2{'PERL5'}=1;
index 99128809c05b36cede20fa62e7eddb806128e48c..6c6df4fe0baa65950da2fdb92c5bc0f5a521a0a9 100644 (file)
@@ -66,18 +66,18 @@ $asm='bcc -c -B -Tml';
 $afile='/o';
 if ($no_asm)
        {
-       $bn_mulw_obj='';
-       $bn_mulw_src='';
+       $bn_asm_obj='';
+       $bn_asm_src='';
        }
 elsif ($asmbits == 32)
        {
-       $bn_mulw_obj='crypto\bn\asm\x86w32.obj';
-       $bn_mulw_src='crypto\bn\asm\x86w32.asm';
+       $bn_asm_obj='crypto\bn\asm\x86w32.obj';
+       $bn_asm_src='crypto\bn\asm\x86w32.asm';
        }
 else
        {
-       $bn_mulw_obj='crypto\bn\asm\x86w16.obj';
-       $bn_mulw_src='crypto\bn\asm\x86w16.asm';
+       $bn_asm_obj='crypto\bn\asm\x86w16.obj';
+       $bn_asm_src='crypto\bn\asm\x86w16.asm';
        }
 
 sub do_lib_rule
index 988512175af8c6c86d086ddf6f6744dff4f0f6bd..d1dcadd94e6d3419efa26b341007a23894aef7b3 100644 (file)
@@ -55,13 +55,13 @@ $asm='ml /Cp /c /Cx';
 $afile='/Fo';
 if ($noasm)
        {
-       $bn_mulw_obj='';
-       $bn_mulw_src='';
+       $bn_asm_obj='';
+       $bn_asm_src='';
        }
 else
        {
-       $bn_mulw_obj='crypto\bn\asm\x86b32.obj';
-       $bn_mulw_src='crypto\bn\asm\x86m32.asm';
+       $bn_asm_obj='crypto\bn\asm\x86b32.obj';
+       $bn_asm_src='crypto\bn\asm\x86m32.asm';
        }
 
 sub do_lib_rule
index 8119f50c2c6eb2adeaddc2aa310083c20cf56a90..a5079d4ca724ac0b341516f669bcdbe9014f5c6c 100644 (file)
@@ -84,8 +84,8 @@ $lfile='';
 $asm='ml /Cp /c /Cx';
 $afile='/Fo';
 
-$bn_mulw_obj='';
-$bn_mulw_src='';
+$bn_asm_obj='';
+$bn_asm_src='';
 $des_enc_obj='';
 $des_enc_src='';
 $bf_enc_obj='';
@@ -95,13 +95,13 @@ if (!$no_asm)
        {
        if ($asmbits == 32)
                {
-               $bn_mulw_obj='crypto\bn\asm\x86w32.obj';
-               $bn_mulw_src='crypto\bn\asm\x86w32.asm';
+               $bn_asm_obj='crypto\bn\asm\x86w32.obj';
+               $bn_asm_src='crypto\bn\asm\x86w32.asm';
                }
        else
                {
-               $bn_mulw_obj='crypto\bn\asm\x86w16.obj';
-               $bn_mulw_src='crypto\bn\asm\x86w16.asm';
+               $bn_asm_obj='crypto\bn\asm\x86w16.obj';
+               $bn_asm_src='crypto\bn\asm\x86w16.asm';
                }
        }
 
index 4e369f6f1d55cbe82862af0e5a7c1780b4a63b21..9167abfce548fdbe5da4c046cc9b457294ac5b5f 100644 (file)
@@ -7,7 +7,7 @@ $crypto="libeay32";
 $RSAref="RSAref32";
 
 $o='\\';
-$cp='copy';
+$cp='"copy /b nul+ "'; # Timestamps get stuffed otherwise
 $rm='del';
 
 # C compiler stuff
@@ -22,7 +22,7 @@ $inc_def="inc32";
 
 if ($debug)
        {
-       $cflags=" /MDd /W3 /WX /Zi /Yd /Od /nologo -DWINDOWS -DWIN32 -D_DEBUG -DL_ENDIAN";
+       $cflags=" /MDd /W3 /WX /Zi /Yd /Od /nologo -DWINDOWS -DWIN32 -D_DEBUG -DL_ENDIAN -DWIN32_LEAN_AND_MEAN -DDEBUG";
        $lflags.=" /debug";
        $mlflags.=' /debug';
        }
@@ -53,8 +53,8 @@ $asm='ml /Cp /coff /c /Cx';
 $asm.=" /Zi" if $debug;
 $afile='/Fo';
 
-$bn_mulw_obj='';
-$bn_mulw_src='';
+$bn_asm_obj='';
+$bn_asm_src='';
 $des_enc_obj='';
 $des_enc_src='';
 $bf_enc_obj='';
@@ -62,8 +62,8 @@ $bf_enc_src='';
 
 if (!$no_asm)
        {
-       $bn_mulw_obj='crypto\bn\asm\bn-win32.obj';
-       $bn_mulw_src='crypto\bn\asm\bn-win32.asm';
+       $bn_asm_obj='crypto\bn\asm\bn-win32.obj';
+       $bn_asm_src='crypto\bn\asm\bn-win32.asm';
        $des_enc_obj='crypto\des\asm\d-win32.obj crypto\des\asm\y-win32.obj';
        $des_enc_src='crypto\des\asm\d-win32.asm crypto\des\asm\y-win32.asm';
        $bf_enc_obj='crypto\bf\asm\b-win32.obj';
@@ -92,6 +92,8 @@ if ($shlib)
        $tmp_def="tmp32dll";
        }
 
+$cflags.=" /Fd$out_def";
+
 sub do_lib_rule
        {
        local($objs,$target,$name,$shlib)=@_;
diff --git a/util/pl/f b/util/pl/f
new file mode 100644 (file)
index 0000000..a280b70
--- /dev/null
+++ b/util/pl/f
@@ -0,0 +1,17 @@
+# do a rule for each file that says 'copy' to new direcory on change
+sub do_copy_rule
+       {
+       local($to,$files,$p)=@_;
+       local($ret,$_,$n,$pp);
+       
+       $files =~ s/\//$o/g if $o ne '/';
+       foreach (split(/\s+/,$files))
+               {
+               $n=&bname($_);
+               if ($n =~ /bss_file/)
+                       { $pp=".c"; }
+               else    { $pp=$p; }
+               $ret.="$to${o}$n$pp: \$(SRC_D)$o$_$pp\n\t\$(CP) \$(SRC_D)$o$_$pp $to${o}$n$pp\n\n";
+               }
+       return($ret);
+       }
index d87a6634d15b809d21dc839eb995eb262e834070..a8cfdc578adeb432aa51b52c61bdecd46b889231 100644 (file)
@@ -17,8 +17,8 @@ else
 
 if (!$no_asm)
        {
-       $bn_mulw_obj='$(OBJ_D)/bn86-elf.o';
-       $bn_mulw_src='crypto/bn/asm/bn86unix.cpp';
+       $bn_asm_obj='$(OBJ_D)/bn86-elf.o';
+       $bn_asm_src='crypto/bn/asm/bn86unix.cpp';
        $des_enc_obj='$(OBJ_D)/dx86-elf.o $(OBJ_D)/yx86-elf.o';
        $des_enc_src='crypto/des/asm/dx86unix.cpp crypto/des/asm/yx86unix.cpp';
        $bf_enc_obj='$(OBJ_D)/bx86-elf.o';
@@ -27,8 +27,12 @@ if (!$no_asm)
        $cast_enc_src='crypto/cast/asm/cx86unix.cpp';
        $rc4_enc_obj='$(OBJ_D)/rx86-elf.o';
        $rc4_enc_src='crypto/rc4/asm/rx86unix.cpp';
+       $rc5_enc_obj='$(OBJ_D)/r586-elf.o';
+       $rc5_enc_src='crypto/rc5/asm/r586unix.cpp';
        $md5_asm_obj='$(OBJ_D)/mx86-elf.o';
        $md5_asm_src='crypto/md5/asm/mx86unix.cpp';
+       $rmd160_asm_obj='$(OBJ_D)/rm86-elf.o';
+       $rmd160_asm_src='crypto/ripemd/asm/rm86unix.cpp';
        $sha1_asm_obj='$(OBJ_D)/sx86-elf.o';
        $sha1_asm_src='crypto/sha/asm/sx86unix.cpp';
        $cflags.=" -DBN_ASM -DMD5_ASM -DSHA1_ASM";
@@ -51,9 +55,9 @@ sub do_shlib_rule
        $target =~ s/\//$o/g if $o ne '/';
        ($Name=$name) =~ tr/a-z/A-Z/;
 
-       $ret.="\$(LIB_D)$o$target: \$(${Name}OBJ)\n";
-       $ret.="\t\$(RM) \$(LIB_D)$o$target\n";
-       $ret.="\tgcc \${CFLAGS} -shared -Wl,-soname,$target -o \$(LIB_D)$o$target \$(${Name}OBJ)\n";
+       $ret.="$target: \$(${Name}OBJ)\n";
+       $ret.="\t\$(RM) target\n";
+       $ret.="\tgcc \${CFLAGS} -shared -Wl,-soname,$target -o $target \$(${Name}OBJ)\n";
        ($t=$target) =~ s/(^.*)\/[^\/]*$/$1/;
        if ($so_name ne "")
                {
diff --git a/util/pl/ultrix.pl b/util/pl/ultrix.pl
new file mode 100644 (file)
index 0000000..9302de9
--- /dev/null
@@ -0,0 +1,38 @@
+#!/usr/local/bin/perl
+#
+# linux.pl - the standard unix makefile stuff.
+#
+
+$o='/';
+$cp='/bin/cp';
+$rm='/bin/rm -f';
+
+# C compiler stuff
+
+$cc='cc';
+if ($debug)
+       { $cflags="-g -DREF_CHECK -DCRYPTO_MDEBUG"; }
+else
+       { $cflags="-O2"; }
+
+$cflags.=" -DNOPROTO -DNOCONST -DL_ENDIAN";
+
+if (!$no_asm)
+       {
+       $bn_asm_obj='$(OBJ_D)/mips1.o';
+       $bn_asm_src='crypto/bn/asm/mips1.s';
+       }
+
+sub do_link_rule
+       {
+       local($target,$files,$dep_libs,$libs)=@_;
+       local($ret,$_);
+       
+       $file =~ s/\//$o/g if $o ne '/';
+       $n=&bname($target);
+       $ret.="$target: $files $dep_libs\n";
+       $ret.="\t\$(LINK) ${efile}$target \$(LFLAGS) $files $libs\n\n";
+       return($ret);
+       }
+
+1;
index 36311711c64bea6a29cfae45449fc5c19a3b150d..aa2d7d1f370531aed60617826aa45e04bb2ec4a4 100644 (file)
@@ -46,8 +46,8 @@ $lfile='';
 
 $asm='as';
 $afile='-o ';
-$bn_mulw_obj="";
-$bn_mulw_src="";
+$bn_asm_obj="";
+$bn_asm_src="";
 $des_enc_obj="";
 $des_enc_src="";
 $bf_enc_obj="";
@@ -59,7 +59,7 @@ sub do_lib_rule
        local($ret,$_,$Name);
 
        $target =~ s/\//$o/g if $o ne '/';
-       $target="\$(LIB_D)$o$target";
+       $target="$target";
        ($Name=$name) =~ tr/a-z/A-Z/;
 
        $ret.="$target: \$(${Name}OBJ)\n";
index 359fa15df1a71384e9ba2c8921d26a23a0249913..5608e233514a80a5faa6a0bcf29880f628517e84 100755 (executable)
@@ -154,3 +154,4 @@ TLSv1_server_method                 171
 TLSv1_client_method                    172
 BIO_new_buffer_ssl_connect             173
 BIO_new_ssl_connect                    174
+SSL_get_ex_data_X509_STORE_CTX_idx     175
index e4a13bf098c329c1a5a45d79b808d4e0d71ca11c..ed9aa59af00c79c940151111fff603d577f52f91 100755 (executable)
@@ -34,6 +34,7 @@
        "ssl/ssl_lib.c",
        "ssl/s2_lib.c",
        "ssl/s3_lib.c",
+       "ssl/s23_lib.c",
        "ssl/t1_lib.c",
        "README",
        );
index 81d32898606947b8a4fc171f8aa6371bdfd44544..d2090a98493f0455b8d9e3a8392da7957bb2d640 100755 (executable)
@@ -2,8 +2,8 @@
 
 echo Generating x86 assember
 echo Bignum
-(cd crypto/bn/asm; perl bn-586.pl cpp > bn86unix.cpp)
-(cd crypto/bn/asm; perl bn-586.pl win32 > bn-win32.asm)
+(cd crypto/bn/asm; perl x86.pl cpp > bn86unix.cpp)
+(cd crypto/bn/asm; perl x86.pl win32 > bn-win32.asm)
 
 echo DES
 (cd crypto/des/asm; perl des-586.pl cpp > dx86unix.cpp)